Skip to content

Commit fd51565

Browse files
committed
choose cake flavor
1 parent fded313 commit fd51565

File tree

2 files changed

+79
-33
lines changed

2 files changed

+79
-33
lines changed

src/App.tsx

Lines changed: 75 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,16 @@
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";
312
import { generateUniqueKey } from "./Helpers";
413

5-
6-
714
class 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

src/Constants.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ export const initialState = {
1111
export interface orderItem {
1212
key: string,
1313
name: string,
14+
cakeFlavor: flavor,
1415
price: number,
1516
};
1617

@@ -104,4 +105,6 @@ export const frostingFlavors: flavor[] = [{
104105
name: "strawberry",
105106
color: "#333"
106107
}
107-
];
108+
];
109+
110+
export const defaultCakeFlavor = cakeFlavors[1];

0 commit comments

Comments
 (0)