let toIntWithDefault = (s:string, defaultValue:int): int => { try (int_of_string(s)) { | _ => defaultValue } }; type state = { qtyStr: string, size: Shirt.Size.t, sleeve: Shirt.Sleeve.t, color: Shirt.Color.t, pattern: Shirt.Pattern.t, nextOrderNumber: int, orders: array(Shirt.Order.t), errorText: string, }; type action = | Enter(Shirt.Order.t) | ChangeQty(string) | ChangeSize(Shirt.Size.t) | ChangeSleeve(Shirt.Sleeve.t) | ChangeColor(Shirt.Color.t) | ChangePattern(Shirt.Pattern.t) | Delete(Shirt.Order.t); let createOrder = (state) : Shirt.Order.t => { { orderNumber: state.nextOrderNumber, quantity: toIntWithDefault(state.qtyStr, 0), size: state.size, sleeve: state.sleeve, color: state.color, pattern: state.pattern, } }; [@react.component] let make = () => { let initialState = { qtyStr: "1", size: Shirt.Size.Medium, sleeve: Shirt.Sleeve.Long, color: Shirt.Color.White, pattern: Shirt.Pattern.Solid, orders: [| |], nextOrderNumber: 1, errorText: "" }; let (state, dispatch) = React.useReducer((state, action) => switch (action) { | Enter(order) => { let n = toIntWithDefault(state.qtyStr, 0); if (n > 0 && n <= 100) { {...state, orders: Belt.Array.concat(state.orders, [|order|]), nextOrderNumber: state.nextOrderNumber + 1, errorText: "" } } else { {...state, errorText: "Quantity must be between 1 and 100." } } } | ChangeQty(newQty) => {...state, qtyStr: newQty} | ChangeSize(newSize) => {...state, size: newSize} | ChangeSleeve(newSleeve) => {...state, sleeve: newSleeve} | ChangeColor(newColor) => {...state, color: newColor} | ChangePattern(newPattern) => {...state, pattern: newPattern} | Delete(order) => {...state, orders: Belt.Array.keep(state.orders, (item) => (item.orderNumber != order.orderNumber))} }, initialState); let orderItems = Belt.Array.map(state.orders, (order) => dispatch(Delete(order)))/>); let orderTable = if (Belt.Array.length(state.orders) > 0) { {ReasonReact.array(orderItems)}
{ReasonReact.string("Qty")} {ReasonReact.string("Size")} {ReasonReact.string("Sleeve")} {ReasonReact.string("Color")} {ReasonReact.string("Pattern")} {ReasonReact.string("Action")}
} else {

{ReasonReact.string("No orders entered yet.")}

};

{ReasonReact.string("Qty: ")} dispatch(ChangeQty(ReactEvent.Form.target(event)##value))}/> dispatch(ChangeSize(v))} /> dispatch(ChangeSleeve(v))} /> dispatch(ChangeColor(v))} /> dispatch(ChangePattern(v))}} />

{ReasonReact.string(state.errorText)}

{orderTable}
; };