import { useEffect, useMemo, useState } from "react"; import { useForm } from "react-hook-form"; import { zodResolver } from "@hookform/resolvers/zod"; import { useNavigate, useParams } from "react-router"; import { Alert, Box, Button, CircularProgress, Paper, Stack, Typography } from "@mui/material"; import { useAccountsList } from "@/domain/accounts/use-cases/use-accounts-list"; import { normalizeStateCode } from "@/data/areas"; import { locationDefaultValues, locationSchema, type LocationFormValues, } from "@/domain/locations/schemas/location-schema"; import { useCreateLocation } from "@/domain/locations/use-cases/use-create-location"; import { useLocationDetail } from "@/domain/locations/use-cases/use-location-detail"; import { useUpdateLocation } from "@/domain/locations/use-cases/use-update-location"; import { useDebounce } from "@/hooks/use-debounce"; import { LocationContactFields, LocationDetailsFields } from "./location-form-fields"; export default function LocationFormPage() { const { id } = useParams(); const navigate = useNavigate(); const isEdit = Boolean(id); const [accountSearch, setAccountSearch] = useState(""); const debouncedAccountSearch = useDebounce(accountSearch, 300); const { data: location, isLoading, error } = useLocationDetail(id); const { data: accountsData, isLoading: isLoadingAccounts } = useAccountsList({ search: debouncedAccountSearch, page: 1, pageSize: 50, }); const createLocation = useCreateLocation(); const updateLocation = useUpdateLocation(); const accountOptions = useMemo(() => accountsData?.items ?? [], [accountsData?.items]); const { register, handleSubmit, reset, control, formState: { errors }, } = useForm({ resolver: zodResolver(locationSchema), defaultValues: locationDefaultValues, }); useEffect(() => { if (location && isEdit) { reset({ name: location.name ?? "", accountId: location.accountId != null ? String(location.accountId) : "", address: location.address ?? "", city: location.city ?? "", state: normalizeStateCode(location.state) ?? "", zipCode: location.zipCode ?? "", contacts: location.contacts && location.contacts.length > 0 ? location.contacts : [{ name: location.contact ?? "", phone: location.phone ?? "" }], contactEmail: location.contactEmail ?? "", status: (location.status as LocationFormValues["status"]) || "Active", }); } }, [location, isEdit, reset]); const isSaving = createLocation.isPending || updateLocation.isPending; const onSubmit = (values: LocationFormValues) => { if (isEdit && id) { updateLocation.mutate({ id, values }); return; } createLocation.mutate(values); }; if (isEdit && isLoading) { return ( ); } return ( {isEdit ? "Edit Location" : "Create a Location"} {Boolean(error) && ( {error instanceof Error ? error.message : "Failed to load location"} )} ); }