diff --git a/components/bounty-detail/bounty-detail-submissions-card.tsx b/components/bounty-detail/bounty-detail-submissions-card.tsx index 8d5992c..96f9df4 100644 --- a/components/bounty-detail/bounty-detail-submissions-card.tsx +++ b/components/bounty-detail/bounty-detail-submissions-card.tsx @@ -57,8 +57,8 @@ export function BountyDetailSubmissionsCard({ useState(null); const [prUrl, setPrUrl] = useState(""); - const [submitComments, setSubmitComments] = useState(""); - const [reviewComments, setReviewComments] = useState(""); + const [submitComments, setSubmitComments] = useState(""); + const [reviewComments, setReviewComments] = useState(""); const reviewStatus = "APPROVED"; const [transactionHash, setTransactionHash] = useState(""); @@ -66,7 +66,7 @@ export function BountyDetailSubmissionsCard({ const reviewSubmission = useReviewSubmission(); const markSubmissionPaid = useMarkSubmissionPaid(); - const hasHydratedDraft = useRef(false); + const [isHydrated, setIsHydrated] = useState(false); // Load draft on mount useEffect(() => { @@ -74,15 +74,18 @@ export function BountyDetailSubmissionsCard({ setPrUrl(draft.formData.githubPullRequestUrl); setSubmitComments(draft.formData.comments); } - hasHydratedDraft.current = true; + setIsHydrated(true); }, [draft]); // Auto-save on form changes useEffect(() => { - if (!hasHydratedDraft.current) return; - const cleanup = autoSave({ githubPullRequestUrl: prUrl, comments: submitComments }); + if (!isHydrated) return; + const cleanup = autoSave({ + githubPullRequestUrl: prUrl, + comments: submitComments, + }); return cleanup; - }, [prUrl, submitComments, autoSave]); + }, [prUrl, submitComments, autoSave, isHydrated]); const isOrgMember = (session?.user as ExtendedUser)?.organizations?.includes( @@ -184,7 +187,8 @@ export function BountyDetailSubmissionsCard({ Submit your GitHub pull request URL. {draft && ( - Draft restored from {new Date(draft.updatedAt).toLocaleString()} + Draft restored from{" "} + {new Date(draft.updatedAt).toLocaleString()} )} diff --git a/docs/SUBMISSION_DRAFTS_EXAMPLE.tsx b/docs/SUBMISSION_DRAFTS_EXAMPLE.tsx index cb5c256..c0fb51e 100644 --- a/docs/SUBMISSION_DRAFTS_EXAMPLE.tsx +++ b/docs/SUBMISSION_DRAFTS_EXAMPLE.tsx @@ -1,6 +1,6 @@ /** * Submission Draft System - Quick Start Example - * + * * This example shows how to integrate the submission draft system * into any form component. */ @@ -10,27 +10,31 @@ import { useSubmissionDraft } from "@/hooks/use-submission-draft"; export function SubmissionFormExample({ bountyId }: { bountyId: string }) { const { draft, clearDraft, autoSave } = useSubmissionDraft(bountyId); - - const [prUrl, setPrUrl] = useState(draft?.formData.githubPullRequestUrl || ""); + + const [prUrl, setPrUrl] = useState( + draft?.formData.githubPullRequestUrl || "", + ); const [comments, setComments] = useState(draft?.formData.comments || ""); // 2. Auto-save when form changes useEffect(() => { - const cleanup = autoSave({ - githubPullRequestUrl: prUrl, - comments + const cleanup = autoSave({ + githubPullRequestUrl: prUrl, + comments, }); return cleanup; }, [prUrl, comments, autoSave]); // 3. Clear draft on successful submit - const handleSubmit = async () => { + const handleSubmit = async (e: React.FormEvent) => { + e.preventDefault(); + // Your submit logic here await submitToAPI({ prUrl, comments }); - + // Clear draft after success clearDraft(); - + // Reset form setPrUrl(""); setComments(""); @@ -44,19 +48,19 @@ export function SubmissionFormExample({ bountyId }: { bountyId: string }) { Draft saved at {new Date(draft.updatedAt).toLocaleString()} )} - + setPrUrl(e.target.value)} placeholder="Pull Request URL" /> - +