import { useState } from "react"; import { redirect, type ActionFunctionArgs, type LoaderFunctionArgs } from "@remix-run/node"; import { Form, useActionData, useLoaderData, useNavigation } from "@remix-run/react"; import { Page, Card, BlockStack, FormLayout, TextField, Button, InlineStack, Checkbox, } from "@shopify/polaris"; import { TitleBar } from "@shopify/app-bridge-react"; import { authenticate } from "../shopify.server"; import db from "../db.server"; import { geocodeAddress } from "../services/zones.server"; export const loader = async ({ request, params }: LoaderFunctionArgs) => { const { session } = await authenticate.admin(request); const location = await db.location.findFirst({ where: { id: params.id, shopDomain: session.shop }, }); if (!location) { throw new Response("Not found", { status: 404 }); } return { location }; }; export const action = async ({ request, params }: ActionFunctionArgs) => { const { session } = await authenticate.admin(request); const formData = await request.formData(); const intent = formData.get("intent"); if (intent === "delete") { await db.location.deleteMany({ where: { id: params.id, shopDomain: session.shop } }); return redirect("/app/locations"); } const name = String(formData.get("name") || "").trim(); const address = String(formData.get("address") || "").trim(); const timezone = String(formData.get("timezone") || "").trim(); const active = formData.get("active") === "true"; const shopifyLocationId = String(formData.get("shopifyLocationId") || "").trim() || null; const errors: Record = {}; if (!name) errors.name = "Name is required"; if (!timezone) errors.timezone = "Timezone is required"; if (Object.keys(errors).length > 0) { return { errors }; } // Auto-geocode on save so radius zones and the widget's pickup map have // coordinates without a separate manual step — no-ops silently if // GOOGLE_MAPS_API_KEY isn't configured (see zones.server.ts). const coordinates = address ? await geocodeAddress(address) : null; await db.location.updateMany({ where: { id: params.id, shopDomain: session.shop }, data: { name, address, timezone, active, shopifyLocationId, ...(coordinates ? { lat: coordinates.lat, lng: coordinates.lng } : {}), }, }); return { errors }; }; export default function EditLocation() { const { location } = useLoaderData(); const actionData = useActionData(); const navigation = useNavigation(); const isSubmitting = navigation.state === "submitting"; return ( ); } function LocationForm({ location, errors, isSubmitting, }: { location: { id: string; name: string; address: string; timezone: string; active: boolean; shopifyLocationId: string | null; lat: number | null; lng: number | null; }; errors?: Record; isSubmitting: boolean; }) { const [name, setName] = useState(location.name); const [address, setAddress] = useState(location.address); const [timezone, setTimezone] = useState(location.timezone); const [active, setActive] = useState(location.active); const [shopifyLocationId, setShopifyLocationId] = useState(location.shopifyLocationId ?? ""); return (
Delete this location Removes all its slot templates and blackout dates.
); }