1- import * as React from 'react' ;
2- import { initialState , order , orderItem , boxSize , boxSizes } from './Constants'
1+ import * as React from "react" ;
2+ import {
3+ initialState ,
4+ order ,
5+ orderItem ,
6+ boxSize ,
7+ boxSizes ,
8+ flavor ,
9+ cakeFlavors ,
10+ defaultCakeFlavor ,
11+ } from "./Constants" ;
312import { generateUniqueKey } from "./Helpers" ;
413
5-
6-
714class App extends React . Component < any , order > {
815 constructor ( props : any ) {
916 super ( props ) ;
@@ -30,23 +37,41 @@ class App extends React.Component<any, order> {
3037 currentOrder . push ( {
3138 key : generateUniqueKey ( "CC" ) , // key is unique
3239 name : newItem . name ,
33- price : newItem . price
40+ cakeFlavor : defaultCakeFlavor ,
41+ price : newItem . price ,
3442 } ) ;
3543 this . updateOrderDetails ( currentOrder ) ;
3644 }
3745
38- removeFromOrder ( itemToRemove : string ) {
46+ removeFromOrder ( keyToRemove : string ) {
3947 let currentOrder = this . getCurrentOrder ( ) ;
40- let currentOrderItemRemoved = currentOrder . filter ( function ( item : orderItem ) {
41- return item . key !== itemToRemove ;
48+ let currentOrderItemRemoved = currentOrder . filter ( function (
49+ item : orderItem
50+ ) {
51+ return item . key !== keyToRemove ;
4252 } ) ;
4353 this . updateOrderDetails ( currentOrderItemRemoved ) ;
4454 }
4555
56+ getCakeFlavorFromString ( flavor : string ) {
57+ return cakeFlavors . find ( obj => obj . name == flavor ) ;
58+ }
59+
60+ updateCakeFlavor ( e : any , keyToUpdate : string ) {
61+ let currentOrder = this . getCurrentOrder ( ) ;
62+ let thisOrderItem = currentOrder . find ( ( obj : { key : string ; } ) => obj . key === keyToUpdate ) ;
63+ thisOrderItem . cakeFlavor = this . getCakeFlavorFromString ( e . target . value ) ;
64+ this . updateOrderDetails ( currentOrder ) ;
65+ }
66+
4667 calculateTotal ( orderDetails : orderItem [ ] ) {
47- var totalPrice = orderDetails . reduce ( function ( accumulator : number , order : orderItem ) {
68+ var totalPrice = orderDetails . reduce ( function (
69+ accumulator : number ,
70+ order : orderItem
71+ ) {
4872 return accumulator + order . price ;
49- } , 0 ) ;
73+ } ,
74+ 0 ) ;
5075 return totalPrice ;
5176 }
5277
@@ -58,29 +83,48 @@ class App extends React.Component<any, order> {
5883 < h4 > Add to Order</ h4 >
5984 < ul >
6085 { Object . keys ( boxSizes ) . map ( ( item , i ) => (
61- < li
62- onClick = { e => this . addToOrder ( boxSizes [ i ] ) }
63- key = { i }
64- >
86+ < li onClick = { e => this . addToOrder ( boxSizes [ i ] ) } key = { i } >
6587 { boxSizes [ i ] . name } ({ boxSizes [ i ] . count } )
6688 </ li >
6789 ) ) }
6890 </ ul >
6991 < h4 > Your Order</ h4 >
7092 < h5 > Order Total: ${ this . state . orderTotal } </ h5 >
71- < ul >
72- { this . state . orderDetails . map ( item => (
73- < li key = { item . key } >
74- < button
75- type = "button"
76- onClick = { e => this . removeFromOrder ( item . key ) }
77- >
78- remove
79- </ button >
80- { item . name }
81- </ li >
82- ) ) }
83- </ ul >
93+ < table >
94+ < thead >
95+ < tr >
96+ < th > </ th >
97+ < th > Item</ th >
98+ < th > Cake Flavor</ th >
99+ < th > Frosting Flavor (choose up to 2)</ th >
100+ </ tr >
101+ </ thead >
102+ < tbody >
103+ { this . state . orderDetails . map ( item => (
104+ < tr key = { item . key } >
105+ < td >
106+ < button
107+ type = "button"
108+ onClick = { e => this . removeFromOrder ( item . key ) }
109+ >
110+ remove
111+ </ button >
112+ </ td >
113+ < td > { item . name } </ td >
114+ < td >
115+ < select value = { item . cakeFlavor . name } onChange = { e => this . updateCakeFlavor ( e , item . key ) } >
116+ { Object . keys ( cakeFlavors ) . map ( ( thisFlavor , i ) => (
117+ < option key = { i } value = { cakeFlavors [ i ] . name } >
118+ { cakeFlavors [ i ] . name }
119+ </ option >
120+ ) ) }
121+ </ select >
122+ </ td >
123+ < td > </ td >
124+ </ tr >
125+ ) ) }
126+ </ tbody >
127+ </ table >
84128 < button type = "button" onClick = { this . onStartOver } >
85129 Start Over
86130 </ button >
@@ -91,11 +135,10 @@ class App extends React.Component<any, order> {
91135
92136// todo:
93137//
94- // 1. select cake flavor (1 per dozen)
95- // 2. select frosting flavors (up to 2 per dozen)
96- // 3. provide a message on cupcakes (custom disc color, letter color)
97- // 4. delivery (extra charge) or pick-up
98- // 5. send email on order quote submission, cc: to submitter
138+ // 1. select frosting flavors (up to 2 per dozen)
139+ // 2. provide a message on cupcakes (custom disc color, letter color)
140+ // 3. delivery (extra charge) or pick-up
141+ // 4. send email on order quote submission, cc: to submitter
99142// https://sheelahb.com/blog/how-to-send-email-from-react-without-a-backend/
100143//
101144
0 commit comments