import { Alert, AppLayout, BreadcrumbGroup, Button, Container, Flashbar, FlashbarProps, Form, FormField, Header, Input, Link, SpaceBetween } from "@cloudscape-design/components"; import { useLoaderData, useSearchParams } from "react-router-dom"; import { DoorResponse } from "../types/DoorResponse"; import { useForm } from "react-hook-form"; import { InputTokenGroup } from "../components/InputTokenGroup"; import { ReactNode, useState } from "react"; import CInput from "react-hook-form-cloudscape/components/input"; import CTextArea from "react-hook-form-cloudscape/components/textarea"; import { fetchUrlEncoded } from "../helpers/FetchHelper"; export type DoorEditForm = DoorResponse & { pin: string, fallbackNumber: string, discordUser: string, isConfirmed: boolean }; const EDIT_ROUTE = '/api/door/edit'; const ONBOARD_ROUTE = '/api/door/onboard'; export interface EditPageProps { isOnboarding?: boolean; } export const EditPage = ({ isOnboarding }: EditPageProps) => { const doorResponse = useLoaderData() as DoorResponse; const door = doorResponse.id; const { setValue, setError, getValues, watch, formState, clearErrors, control, register } = useForm({ defaultValues: { ...doorResponse, isConfirmed: !isOnboarding, }, mode: "all", }); const [ alerts, setAlerts ] = useState([]); const dismissAlert = (id: string) => { setAlerts(alerts => alerts.filter(alert => alert.id !== id)); } const createAlert = (type: FlashbarProps.Type, content: ReactNode): FlashbarProps.MessageDefinition => { const id = `${Math.random()}`; return { id, type, content, dismissible: type !== 'in-progress', onDismiss: () => dismissAlert(id), } } const addAlert = (type: FlashbarProps.Type, content: ReactNode): string => { const newAlert = createAlert(type, content); setAlerts(alerts => [ newAlert, ...alerts, ]); return newAlert.id as string; } const fallbackNumbers = watch("fallbackNumbers") || []; const discordUsers = watch("discordUsers") || []; const fallbackNumbersError = formState.errors.fallbackNumbers?.message; const discordUsersError = formState.errors.discordUsers?.message; const backUrl = isOnboarding? '/': `?door=${door}`; const apiRoute = isOnboarding ? ONBOARD_ROUTE: EDIT_ROUTE; return ( } notifications={ } content={
} header={
{isOnboarding? "Onboard Door": "Edit Door"}
} > ({ label: n }))}} onAdd={() => { const newValue = getValues().fallbackNumber; if (newValue.length === 0) { return; } clearErrors("fallbackNumbers"); setValue("fallbackNumbers", [...fallbackNumbers, newValue]); setValue("fallbackNumber", ""); }} onDismiss={(i) => { clearErrors("fallbackNumbers"); if (fallbackNumbers.length === 1) { setError("fallbackNumbers", { message: "Can't remove last entry", type: "value" }) return; } fallbackNumbers.splice(i, 1); setValue("fallbackNumbers", [...fallbackNumbers]); }} /> {!isOnboarding && Discord users to receive notifications } > ({ label: n }))}} onAdd={() => { const newValue = getValues().discordUser; if (newValue.length === 0) { return; } clearErrors("discordUsers"); setValue("discordUsers", [...discordUsers, newValue]); setValue("discordUser", ""); }} onDismiss={(i) => { clearErrors("discordUsers"); if (discordUsers.length === 1) { setError("discordUsers", { message: "Can't remove last entry" }) return; } discordUsers.splice(i, 1); setValue("discordUsers", [...discordUsers]); }} /> } {isOnboarding && }
} /> ); };