import { useCallback } from "react"; import { useNavigate } from "react-router-dom"; import { Button, AsyncSurface, DirtyNavigationDialog, ErrorSummary, Form, FormActions, FormPage, FormField, useAppForm, useDirtyNavigationGuard, } from "../../../presentation/design-system/index.ts"; import { REFERENCE_FORM_DEFAULTS, referenceResourceFormSchema, toCreateReferenceCommand, type ReferenceResourceFormValues, } from "./reference-resource-form.ts"; import { useReferenceCreate } from "./use-reference-feature.ts"; const FIELD_LABELS = Object.freeze({ name: "새 항목 이름", note: "설명", }) satisfies Record; export default function ReferenceResourceFormPage() { const navigate = useNavigate(); const mutation = useReferenceCreate(); const submit = useCallback( (command: ReturnType) => mutation.submit(command), [mutation], ); const form = useAppForm({ schema: referenceResourceFormSchema, defaultValues: REFERENCE_FORM_DEFAULTS, allowedServerFields: ["name", "note"], mapToCommand: toCreateReferenceCommand, submit, }); const mutationEffectUnknown = mutation.state.indicator === "mutation-effect-unknown"; const mutationBlocked = mutationEffectUnknown || mutation.state.indicator === "mutation-pending"; const guard = useDirtyNavigationGuard(form.dirty && !form.pending); return (
{ if (mutationBlocked) { event.preventDefault(); return; } void form.submitForm(event); }} > navigate("/examples/reference-resources")} > 목록으로 돌아가기 } heading={{ eyebrow: "FormPage", title: "Reference resource 만들기", description: "presentation schema, command mapper, 422/conflict와 dirty navigation 정책을 실행합니다.", }} errorSummary={ } fields={ <> } formActions={ } feedback={ mutationEffectUnknown ? ( { void mutation.reconcileUnknownEffect(resolution).then(() => { if (resolution === "APPLIED") form.settleApplied(); }); }} /> ) : form.result === "success" ? (

저장했습니다.

) : form.result === "conflict" ? (

충돌을 해결한 뒤 다시 제출할 수 있습니다.

) : null } aside={

form value는 URL, storage, telemetry에 저장되지 않고 submit 시에만 application command로 변환됩니다.

} guard={} /> ); }