Vercel/src/admin/AdminRecipeForm.tsx
Sam Becker 646f32e642
Rich sort controls (#283)
* Generalize app switcher menus

* Organize sort module

* Build configuration for nav sort control

* Refine sort menu styles

* Upgrade next.js

* Reset custom sort when clicking grid/full a second time

* Light up sort button when overridden
2025-07-15 22:43:36 -05:00

74 lines
1.7 KiB
TypeScript

'use client';
import SubmitButtonWithStatus from '@/components/SubmitButtonWithStatus';
import Link from 'next/link';
import { PATH_ADMIN_RECIPES } from '@/app/path';
import FieldsetWithStatus from '@/components/FieldsetWithStatus';
import { ReactNode, useMemo, useState } from 'react';
import { renamePhotoRecipeGloballyAction } from '@/photo/actions';
import { parameterize } from '@/utility/string';
import { useAppState } from '@/app/AppState';
export default function AdminRecipeForm({
recipe,
children,
}: {
recipe: string
children?: ReactNode
}) {
const { invalidateSwr } = useAppState();
const [updatedRecipeRaw, setUpdatedRecipeRaw] = useState(recipe);
const updatedRecipe = useMemo(() =>
parameterize(updatedRecipeRaw)
, [updatedRecipeRaw]);
const isFormValid = (
updatedRecipe &&
updatedRecipe !== recipe
);
return (
<form
action={renamePhotoRecipeGloballyAction}
className="space-y-8"
>
<FieldsetWithStatus
label="New Recipe Name"
value={updatedRecipeRaw}
onChange={setUpdatedRecipeRaw}
/>
{/* Form data: recipe to be replaced */}
<input
name="recipe"
value={recipe}
hidden
readOnly
/>
{/* Form data: updated recipe */}
<input
name="updatedRecipe"
value={updatedRecipe}
hidden
readOnly
/>
{children}
<div className="flex gap-3">
<Link
className="button"
href={PATH_ADMIN_RECIPES}
>
Cancel
</Link>
<SubmitButtonWithStatus
disabled={!isFormValid}
onFormSubmit={invalidateSwr}
>
Update
</SubmitButtonWithStatus>
</div>
</form>
);
}