diff --git a/src/features/guides/components/Frame.tsx b/src/features/guides/components/Frame.tsx index a57fcfb..686581f 100644 --- a/src/features/guides/components/Frame.tsx +++ b/src/features/guides/components/Frame.tsx @@ -52,6 +52,7 @@ export default function Frame({ Title updateTitle(frame.id, e.target.value)} /> diff --git a/src/features/guides/hooks/useNewGuide.ts b/src/features/guides/hooks/useGuideForm.ts similarity index 63% rename from src/features/guides/hooks/useNewGuide.ts rename to src/features/guides/hooks/useGuideForm.ts index e2456f2..f1258fa 100644 --- a/src/features/guides/hooks/useNewGuide.ts +++ b/src/features/guides/hooks/useGuideForm.ts @@ -7,19 +7,36 @@ import { import { useIDB } from "../../../lib/contexts/dbinit.context"; import { useGuides } from "../../../lib/contexts/guide.context"; -export default function useNewGuide() { - const { db } = useIDB(); - const { setGuides } = useGuides(); - - const [guide, setGuide] = useState({ +function makeEmptyGuide(): GuideType { + return { id: crypto.randomUUID(), title: "", description: "", createdAt: new Date(), updatedAt: new Date(), deletedAt: undefined, - }); - const [frames, setFrames] = useState([]); + }; +} + +export default function useGuideForm(initial?: CompiledGuideType) { + const { db } = useIDB(); + const { setGuides } = useGuides(); + const isEditing = Boolean(initial); + + const [guide, setGuide] = useState( + initial + ? { + id: initial.id, + title: initial.title, + description: initial.description, + createdAt: initial.createdAt, + updatedAt: initial.updatedAt, + deletedAt: initial.deletedAt, + } + : makeEmptyGuide(), + ); + + const [frames, setFrames] = useState(initial?.frames ?? []); const handleUpdateTitle = (title: string) => { setGuide((prev) => ({ ...prev, title })); @@ -32,20 +49,16 @@ export default function useNewGuide() { const handleAddFrames = (e: React.ChangeEvent) => { const newFiles = e.target.files; if (!newFiles) return; - - const newFilesArray = Array.from(newFiles); - - const newFrameObjects = newFilesArray.map((file) => { + const newFrameObjects = Array.from(newFiles).map((file) => { const frameId = crypto.randomUUID(); return { id: frameId, - file: file, + file, title: "", guideId: guide.id, - steps: [{ id: crypto.randomUUID(), text: "", frameId: frameId }], + steps: [{ id: crypto.randomUUID(), text: "", frameId }], }; }); - setFrames((prev) => [...prev, ...newFrameObjects]); }; @@ -76,7 +89,7 @@ export default function useNewGuide() { ...frame, steps: [ ...frame.steps, - { id: crypto.randomUUID(), text: "", frameId: frameId }, + { id: crypto.randomUUID(), text: "", frameId }, ], } : frame, @@ -86,58 +99,45 @@ export default function useNewGuide() { const handleUpdateStep = (stepId: string, text: string) => { setFrames((prev) => - prev.map((frame) => - frame.steps - ? { - ...frame, - steps: frame.steps.map((step) => - step.id === stepId ? { ...step, text } : step, - ), - } - : frame, - ), + prev.map((frame) => ({ + ...frame, + steps: frame.steps.map((step) => + step.id === stepId ? { ...step, text } : step, + ), + })), ); }; const handleRemoveStep = (stepId: string) => { setFrames((prev) => - prev.map((frame) => - frame.steps - ? { - ...frame, - steps: frame.steps.filter((step) => step.id !== stepId), - } - : frame, - ), + prev.map((frame) => ({ + ...frame, + steps: frame.steps.filter((step) => step.id !== stepId), + })), ); }; - const handleSaveGuide = async (e: React.SubmitEvent) => { + const handleSaveGuide = async (e: React.FormEvent) => { e.preventDefault(); + if (!db) return; const compiledGuide: CompiledGuideType = { - id: guide.id, - title: guide.title, - description: guide.description, - createdAt: guide.createdAt, - updatedAt: guide.updatedAt, - deletedAt: guide.deletedAt, + ...guide, + updatedAt: new Date(), frames, }; - if (!db) return; await db.put("guides", compiledGuide); - setGuide({ - id: crypto.randomUUID(), - title: "", - description: "", - createdAt: new Date(), - updatedAt: new Date(), - deletedAt: undefined, - }); - setFrames([]); - setGuides((prev) => [compiledGuide, ...prev]); + if (isEditing) { + setGuides((prev) => + prev.map((g) => (g.id === compiledGuide.id ? compiledGuide : g)), + ); + } else { + setGuides((prev) => [compiledGuide, ...prev]); + setGuide(makeEmptyGuide()); + setFrames([]); + } }; return { @@ -145,6 +145,7 @@ export default function useNewGuide() { setGuide, frames, setFrames, + isEditing, handleUpdateTitle, handleUpdateDescription, handleAddFrames, @@ -157,3 +158,7 @@ export default function useNewGuide() { handleSaveGuide, }; } + +/* */ +/* Figure out how to use this hook for both editing and creating. */ +/* */ diff --git a/src/features/guides/routes/Guide.tsx b/src/features/guides/routes/Guide.tsx index b92c7f0..5607dd2 100644 --- a/src/features/guides/routes/Guide.tsx +++ b/src/features/guides/routes/Guide.tsx @@ -1,6 +1,7 @@ import { useParams } from "react-router"; import { useGuides } from "../../../lib/contexts/guide.context"; import useGuide from "../hooks/useGuide"; +import { Link } from "react-router"; export default function Guide() { const { id } = useParams(); @@ -31,7 +32,7 @@ export default function Guide() { - + Edit ); diff --git a/src/features/guides/routes/NewGuide.css b/src/features/guides/routes/GuideForm.css similarity index 100% rename from src/features/guides/routes/NewGuide.css rename to src/features/guides/routes/GuideForm.css diff --git a/src/features/guides/routes/NewGuide.tsx b/src/features/guides/routes/GuideForm.tsx similarity index 77% rename from src/features/guides/routes/NewGuide.tsx rename to src/features/guides/routes/GuideForm.tsx index fb5055d..0e6b07a 100644 --- a/src/features/guides/routes/NewGuide.tsx +++ b/src/features/guides/routes/GuideForm.tsx @@ -1,10 +1,17 @@ -import "./NewGuide.css"; +import "./GuideForm.css"; import FileUpload from "../components/FileUpload"; -import useNewGuide from "../hooks/useNewGuide"; +import useGuideForm from "../hooks/useGuideForm"; import Frame from "../components/Frame"; +import { useParams } from "react-router"; +import { useGuides } from "../../../lib/contexts/guide.context"; + +export default function GuideForm() { + const { id } = useParams(); + const { guides } = useGuides(); + const g = guides.find((g) => g.id === id); -export default function NewGuide() { const { + guide, frames, handleUpdateTitle, handleUpdateDescription, @@ -16,7 +23,8 @@ export default function NewGuide() { handleRemoveStep, handleUpdateStep, handleSaveGuide, - } = useNewGuide(); + isEditing, + } = useGuideForm(g); return (
@@ -26,6 +34,7 @@ export default function NewGuide() { handleUpdateTitle(e.target.value)} /> @@ -33,6 +42,7 @@ export default function NewGuide() { Description