import { Container, Paper, Input, Slider, TextInput, Button, Flex, ActionIcon, Title, Box, Affix, } from "@mantine/core"; import { notifications } from "@mantine/notifications"; import { randomId } from "@mantine/hooks"; import { useForm } from "@mantine/form"; import React from "react"; import { Params, useLoaderData, useParams, useNavigate, Link, } from "react-router"; import { IconMinus, IconPlus } from "@tabler/icons-react"; export const subOrderSetLoader = async ({ params: { username, set_id }, }: { params: Params; }) => fetch(`/api/subs/${username}/sets/${set_id}`).then((response) => response.json(), ); type FormOrderSetOrderAddOn = Omit & { id: number | string; _delete?: boolean; }; type FormOrderSetOrder = Omit & { id: number | string; _delete?: boolean; add_ons: FormOrderSetOrderAddOn[]; }; type FormOrderSet = Omit & { orders: FormOrderSetOrder[]; }; export const SubOrderSet: React.FC = () => { const navigate = useNavigate(); const { username, set_id } = useParams(); const { id, name, orders } = useLoaderData(); const form = useForm({ mode: "uncontrolled", initialValues: { id, name, orders }, validate: { name: (value: string) => value.length < 1 ? "Please enter a name" : null, orders: { name: (value: string) => value.length < 1 ? "Please enter a name" : null, add_ons: { name: (value: string) => value.length < 1 ? "Please enter a name" : null, }, }, }, }); const handleSubmit = React.useCallback( form.onSubmit((values) => { fetch(`/api/subs/${username}/sets/${set_id}`, { method: "POST", headers: { "Content-Type": "application/json", }, body: JSON.stringify(values), }).then((response) => { if (response.ok) { notifications.show({ title: "Success", message: `Updates to ${values.name} were successful`, color: "green", }); navigate(`/dashboard/subs/${username}`); } else { notifications.show({ title: "Error", message: "There was a problem with your request", color: "red", }); console.error(response.statusText); } }); }), [form], ); const handleNewOrder = React.useCallback(() => { form.insertListItem("orders", { id: `new_${randomId()}`, name: "", weight: 10, repeat: 0.8, add_ons: [], }); }, [form]); const handleRemoveOrder = React.useCallback( (idx: number) => { const orderId = form.getValues().orders[idx].id.toString(); if (orderId.indexOf("new_") === 0) { form.removeListItem("orders", idx); } else { form.setFieldValue(`orders.${idx}._delete`, true); } }, [form], ); const handleNewAddOn = React.useCallback( (idx: number) => { form.insertListItem(`orders.${idx}.add_ons`, { id: `new_${randomId()}`, name: "", probability: 0.5, }); }, [form], ); const handleRemoveAddOn = React.useCallback( (idx: number, add_on_idx: number) => { const addOnId = form .getValues() .orders[idx].add_ons[add_on_idx].id.toString(); if (addOnId.indexOf("new_") === 0) { form.removeListItem(`orders.${idx}.add_ons`, add_on_idx); } else { form.setFieldValue(`orders.${idx}.add_ons.${add_on_idx}._delete`, true); } }, [form], ); return ( {name} Return to {username}
Orders {form.getValues().orders.map(({ id: order_id, _delete }, idx) => _delete ? null : ( handleRemoveOrder(idx)} > Add-Ons {form .getValues() .orders[ idx ].add_ons.map(({ id: add_on_id, _delete: _add_on_delete }, add_on_idx) => _add_on_delete ? null : ( handleRemoveAddOn(idx, add_on_idx)} > ), )} ), )}
); };