Three tidy-ups from the audit's deferred list: - Extracted a ConfirmModal primitive (message + Cancel/Confirm, owning the busy lock + inline error) and folded the five hand-rolled confirm dialogs onto it: DeleteGarden, LeaveGarden, DeletePlant, DeleteSeedLot, ClearBed. Each is now just its message + mutation + labels. Bonus: ClearBed now shows a failure inline instead of swallowing it. (CopyGarden stays on Modal — it has a name field, not a plain confirm.) - Removed components/PageStub.tsx — dead scaffolding, imported nowhere. - The garden editor was squeezed into the max-w-5xl reading measure the other pages use; the canvas routes (editor + public garden) now go edge-to-edge on desktop, and the top bar matches so the brand aligns with the editor's left edge. Mobile was already full-width, so it's unchanged. Verified live: the Delete-garden confirm renders/cancels; the desktop editor now uses the full viewport width. tsc + vitest + build green. Co-Authored-By: Claude Opus 4.8 (1M context) <[email protected]> Claude-Session: https://claude.ai/code/session_01H3zbym8Doka2d7D48maSgZ
31 lines
1.1 KiB
TypeScript
31 lines
1.1 KiB
TypeScript
import { ConfirmModal } from '@/components/ui/ConfirmModal'
|
|
import { formatQuantity, useDeleteSeedLot, type SeedLot } from '@/lib/seedLots'
|
|
|
|
/**
|
|
* Retire a lot. Worth confirming because it's the one place cost and germination
|
|
* data lives — and worth saying plainly that the plantings survive it, since
|
|
* "will this wipe my garden" is the reasonable fear.
|
|
*/
|
|
export function DeleteSeedLotModal({ lot, onClose }: { lot: SeedLot; onClose: () => void }) {
|
|
const del = useDeleteSeedLot()
|
|
return (
|
|
<ConfirmModal
|
|
title="Retire this seed lot?"
|
|
confirmLabel="Retire lot"
|
|
busyLabel="Retiring…"
|
|
errorFallback="Could not retire the lot."
|
|
onConfirm={() => del.mutateAsync(lot.id)}
|
|
onClose={onClose}
|
|
>
|
|
<p className="text-sm text-fg">
|
|
{formatQuantity(lot.quantity)} {lot.unit}
|
|
{lot.vendor ? ` from ${lot.vendor}` : ''}
|
|
{lot.packedForYear != null ? `, packed for ${lot.packedForYear}` : ''}.
|
|
</p>
|
|
<p className="text-sm text-muted">
|
|
Anything planted from it stays exactly where it is — it just stops being attributed to this purchase.
|
|
</p>
|
|
</ConfirmModal>
|
|
)
|
|
}
|