diff --git a/app/routes/_header.casher.tsx b/app/routes/_header.casher.tsx index ab6b9c2e..2060c2fe 100644 --- a/app/routes/_header.casher.tsx +++ b/app/routes/_header.casher.tsx @@ -1,7 +1,10 @@ +import { parseWithZod } from "@conform-to/zod"; import { AlertDialogCancel } from "@radix-ui/react-alert-dialog"; import { TrashIcon } from "@radix-ui/react-icons"; +import { type ClientActionFunction, useSubmit } from "@remix-run/react"; import { useState } from "react"; import useSWRSubscription from "swr/subscription"; +import { z } from "zod"; import { AlertDialog, AlertDialogAction, @@ -25,9 +28,11 @@ import { } from "~/components/ui/table"; import { itemConverter, orderConverter } from "~/firebase/converter"; import { collectionSub } from "~/firebase/subscription"; +import { stringToJSONSchema } from "~/lib/custom-zod"; import type { WithId } from "~/lib/typeguard"; import type { ItemEntity } from "~/models/item"; -import { OrderEntity } from "~/models/order"; +import { OrderEntity, orderSchema } from "~/models/order"; +import { orderRepository } from "~/repositories/order"; export default function Casher() { const { data: items } = useSWRSubscription( @@ -41,13 +46,32 @@ export default function Casher() { const curOrderId = orders?.reduce((acc, cur) => Math.max(acc, cur.orderId), 0) ?? 0; const nextOrderId = curOrderId + 1; + const submit = useSubmit(); const order = OrderEntity.createNew({ orderId: nextOrderId }); - const [recieved, setText] = useState(0); + const [recieved, setReceived] = useState(0); const [queue, setQueue] = useState[]>([]); order.items = queue; + const charge = recieved - order.total; + const [description, setDescription] = useState(""); + order.description = description; + + const submitOrder = () => { + console.log(charge); + if (charge < 0) { + return; + } + if (queue.length === 0) { + return; + } + submit({ newOrder: JSON.stringify(order.toOrder()) }, { method: "POST" }); + console.log("送信"); + setQueue([]); + setReceived(0); + setDescription(""); + }; return ( -
+
@@ -70,7 +94,7 @@ export default function Casher() { - No. {curOrderId} + No. {nextOrderId} @@ -103,7 +127,15 @@ export default function Casher() {
  • -

    合計金額:{order.total} 円

    + setDescription(e.target.value)} + /> +

    合計金額:{order.total} 円

  • @@ -114,34 +146,34 @@ export default function Casher() { - 金額を確認してください + 金額・備考欄を確認してください +

    備考欄:{order.description}

    受領額: - setText(Number.parseInt(event.target.value)) - } + onChange={(e) => { + const value = Number.parseInt(e.target.value); + setReceived(Number.isNaN(value) ? 0 : value); // NaN のチェック + }} />

    合計: {order.total} 円

    - お釣り: {recieved - order.total < 0 && 0} - {recieved - order.total >= 0 && - recieved - order.total}{" "} - 円 + お釣り:{" "} + {Number.isNaN(charge) || charge < 0 ? 0 : charge} 円

    - - 戻る - - + 戻る + 送信 @@ -156,3 +188,27 @@ export default function Casher() {
); } + +export const clientAction: ClientActionFunction = async ({ request }) => { + const formData = await request.formData(); + + const schema = z.object({ + newOrder: stringToJSONSchema.pipe(orderSchema), + }); + const submission = parseWithZod(formData, { + schema, + }); + if (submission.status !== "success") { + console.error(submission.error); + return submission.reply(); + } + + const { newOrder } = submission.value; + const order = OrderEntity.fromOrderWOId(newOrder); + + const savedOrder = await orderRepository.save(order); + + console.log("savedOrder", savedOrder); + + return new Response("ok"); +};