diff --git a/frontend/src/components/DraftProposalList.tsx b/frontend/src/components/DraftProposalList.tsx new file mode 100644 index 0000000..43db213 --- /dev/null +++ b/frontend/src/components/DraftProposalList.tsx @@ -0,0 +1,57 @@ +import { useState } from 'react'; +import type { DraftProposal } from '../types'; +import { getDrafts, deleteDraft } from '../drafts'; + +interface Props { + onEdit: (draft: DraftProposal) => void; + onPublish: (draft: DraftProposal) => void; +} + +export function DraftProposalList({ onEdit, onPublish }: Props) { + const [drafts, setDrafts] = useState(() => getDrafts()); + + const handleDelete = (id: string) => { + deleteDraft(id); + setDrafts(getDrafts()); + }; + + if (drafts.length === 0) return

No saved drafts.

; + + return ( + + ); +} diff --git a/frontend/src/components/NewProposalForm.tsx b/frontend/src/components/NewProposalForm.tsx index 037cf18..1dc0661 100644 --- a/frontend/src/components/NewProposalForm.tsx +++ b/frontend/src/components/NewProposalForm.tsx @@ -1,10 +1,14 @@ import { useState } from 'react'; +import type { DraftProposal } from '../types'; +import { saveDraft } from '../drafts'; interface Props { onClose: () => void; onSuccess: (proposalId: number) => void; onAnnounce?: (msg: string) => void; onError?: (msg: string) => void; + initialDraft?: DraftProposal | null; + onDraftSaved?: (draft: DraftProposal) => void; } interface FormState { @@ -50,14 +54,24 @@ function validate(f: FormState): Partial> { return errs; } -export function NewProposalForm({ onClose, onSuccess, onAnnounce, onError }: Props) { - const [form, setForm] = useState(INITIAL); +export function NewProposalForm({ onClose, onSuccess, onAnnounce, onError, initialDraft, onDraftSaved }: Props) { + const [form, setForm] = useState( + initialDraft + ? { title: initialDraft.title, description: initialDraft.description, quorum: initialDraft.quorum, duration: initialDraft.duration } + : INITIAL + ); const [errors, setErrors] = useState>>({}); const [submitting, setSubmitting] = useState(false); const set = (k: keyof FormState) => (e: React.ChangeEvent) => setForm(f => ({ ...f, [k]: e.target.value })); + const handleSaveDraft = () => { + const draft = saveDraft({ title: form.title, description: form.description, quorum: form.quorum, duration: form.duration }); + onAnnounce?.('Draft saved.'); + onDraftSaved?.(draft); + }; + const handleSubmit = async (e: React.FormEvent) => { e.preventDefault(); const errs = validate(form); @@ -164,6 +178,14 @@ export function NewProposalForm({ onClose, onSuccess, onAnnounce, onError }: Pro > Cancel +