@@ -5,9 +5,12 @@ import {
55 orderItem ,
66 boxSize ,
77 boxSizes ,
8- flavor ,
98 cakeFlavors ,
9+ flavor ,
10+ frostingFlavors ,
1011 defaultCakeFlavor ,
12+ defaultFrostingFlavor ,
13+ defaultNullFrostingFlavor ,
1114} from "./Constants" ;
1215import { generateUniqueKey } from "./Helpers" ;
1316
@@ -25,6 +28,10 @@ class App extends React.Component<any, order> {
2528 return JSON . parse ( JSON . stringify ( this . state . orderDetails ) ) ;
2629 }
2730
31+ getOrderItemFromKey ( currentOrder : orderItem [ ] , key : string ) : orderItem | undefined {
32+ return currentOrder . find ( ( obj : { key : string } ) => obj . key === key ) ;
33+ }
34+
2835 updateOrderDetails ( orderDetails : orderItem [ ] ) {
2936 this . setState ( {
3037 orderTotal : this . calculateTotal ( orderDetails ) ,
@@ -38,7 +45,8 @@ class App extends React.Component<any, order> {
3845 key : generateUniqueKey ( "CC" ) , // key is unique
3946 name : newItem . name ,
4047 cakeFlavor : defaultCakeFlavor ,
41- price : newItem . price ,
48+ frostingFlavor : [ defaultFrostingFlavor , defaultNullFrostingFlavor ] ,
49+ price : newItem . price
4250 } ) ;
4351 this . updateOrderDetails ( currentOrder ) ;
4452 }
@@ -53,15 +61,28 @@ class App extends React.Component<any, order> {
5361 this . updateOrderDetails ( currentOrderItemRemoved ) ;
5462 }
5563
56- getCakeFlavorFromString ( flavor : string ) {
57- return cakeFlavors . find ( obj => obj . name == flavor ) ;
64+ getFlavorFromString ( flavor : string , flavors : flavor [ ] ) {
65+ return flavors . find ( obj => obj . name == flavor ) ;
5866 }
5967
60- updateCakeFlavor ( e : any , keyToUpdate : string ) {
68+ updateCakeFlavor ( e : any , orderItemToUpdate : string ) {
6169 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 ) ;
70+ let thisOrderItem = this . getOrderItemFromKey ( currentOrder , orderItemToUpdate ) ;
71+ let cakeFlavor = this . getFlavorFromString ( e . target . value , cakeFlavors ) ;
72+ if ( thisOrderItem && cakeFlavor ) {
73+ thisOrderItem . cakeFlavor = cakeFlavor ;
74+ this . updateOrderDetails ( currentOrder ) ;
75+ }
76+ }
77+
78+ updateFrostingFlavor ( e : any , orderItemToUpdate : string , flavorIndex : number ) {
79+ let currentOrder = this . getCurrentOrder ( ) ;
80+ let thisOrderItem = this . getOrderItemFromKey ( currentOrder , orderItemToUpdate ) ;
81+ let frostingFlavor = this . getFlavorFromString ( e . target . value , frostingFlavors ) ;
82+ if ( thisOrderItem && frostingFlavor ) {
83+ thisOrderItem . frostingFlavor [ flavorIndex ] = frostingFlavor ;
84+ this . updateOrderDetails ( currentOrder ) ;
85+ }
6586 }
6687
6788 calculateTotal ( orderDetails : orderItem [ ] ) {
@@ -95,8 +116,9 @@ class App extends React.Component<any, order> {
95116 < tr >
96117 < th > </ th >
97118 < th > Item</ th >
98- < th > Cake Flavor</ th >
99- < th > Frosting Flavor (choose up to 2)</ th >
119+ < th > Cake</ th >
120+ < th > Frosting</ th >
121+ < th > 2nd Frosting (optional)</ th >
100122 </ tr >
101123 </ thead >
102124 < tbody >
@@ -112,15 +134,46 @@ class App extends React.Component<any, order> {
112134 </ td >
113135 < td > { item . name } </ td >
114136 < td >
115- < select value = { item . cakeFlavor . name } onChange = { e => this . updateCakeFlavor ( e , item . key ) } >
137+ < select
138+ value = { item . cakeFlavor && item . cakeFlavor . name }
139+ onChange = { e => this . updateCakeFlavor ( e , item . key ) }
140+ >
116141 { Object . keys ( cakeFlavors ) . map ( ( thisFlavor , i ) => (
117142 < option key = { i } value = { cakeFlavors [ i ] . name } >
118143 { cakeFlavors [ i ] . name }
119144 </ option >
120145 ) ) }
121146 </ select >
122147 </ td >
123- < td > </ td >
148+ < td >
149+ < select
150+ value = { item . frostingFlavor && item . frostingFlavor [ 0 ] . name }
151+ onChange = { e => this . updateFrostingFlavor ( e , item . key , 0 ) }
152+ >
153+ { Object . keys ( frostingFlavors ) . map ( ( thisFlavor , i ) => (
154+ < option key = { i } value = { frostingFlavors [ i ] . name } >
155+ { frostingFlavors [ i ] . name }
156+ </ option >
157+ ) ) }
158+ </ select >
159+ </ td >
160+ < td >
161+ < select
162+ value = {
163+ item . frostingFlavor [ 1 ] && item . frostingFlavor [ 1 ] . name
164+ }
165+ onChange = { e => this . updateFrostingFlavor ( e , item . key , 1 ) }
166+ >
167+ { Object . keys ( frostingFlavors ) . map ( ( thisFlavor , i ) => (
168+ < option
169+ key = { i }
170+ value = { frostingFlavors [ i ] && frostingFlavors [ i ] . name }
171+ >
172+ { frostingFlavors [ i ] . name }
173+ </ option >
174+ ) ) }
175+ </ select >
176+ </ td >
124177 </ tr >
125178 ) ) }
126179 </ tbody >
@@ -135,10 +188,9 @@ class App extends React.Component<any, order> {
135188
136189// todo:
137190//
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
191+ // 1. provide a message on cupcakes (custom disc color, letter color)
192+ // 2. delivery (extra charge) or pick-up
193+ // 3. send email on order quote submission, cc: to submitter
142194// https://sheelahb.com/blog/how-to-send-email-from-react-without-a-backend/
143195//
144196
0 commit comments