diff --git a/src/lib/types.ts b/src/lib/types.ts index 8ccfe5c..4e100de 100644 --- a/src/lib/types.ts +++ b/src/lib/types.ts @@ -37,7 +37,7 @@ export type Secret = Document & "secret", { text: string; - discoveredOn: ISO8601Date | null; + discovered: boolean; } >; diff --git a/src/routes/_authenticated/document.$documentId.tsx b/src/routes/_authenticated/document.$documentId.tsx index 0c6e7c5..3803dd8 100644 --- a/src/routes/_authenticated/document.$documentId.tsx +++ b/src/routes/_authenticated/document.$documentId.tsx @@ -1,11 +1,10 @@ -import { createFileRoute } from '@tanstack/react-router' +import { createFileRoute } from "@tanstack/react-router"; import { pb } from "@/lib/pocketbase"; import { AutoSaveTextarea } from "@/components/AutoSaveTextarea"; import { useState } from "react"; +import type { Secret } from "@/lib/types"; -export const Route = createFileRoute( - '/_authenticated/document/$documentId', -)({ +export const Route = createFileRoute("/_authenticated/document/$documentId")({ loader: async ({ params }) => { const doc = await pb.collection("documents").getOne(params.documentId); // Fetch the unique relationship where this document is the primary and type is "plannedSecrets" @@ -13,12 +12,13 @@ export const Route = createFileRoute( filter: `primary = "${params.documentId}" && type = "plannedSecrets"`, }); // Get all related secret document IDs from the secondary field - const secretIds = relationships.items.length > 0 ? relationships.items[0].secondary : []; + const secretIds = + relationships.items.length > 0 ? relationships.items[0].secondary : []; // Fetch all related secret documents let secrets: any[] = []; if (Array.isArray(secretIds) && secretIds.length > 0) { secrets = await pb.collection("documents").getFullList({ - filter: secretIds.map(id => `id = "${id}"`).join(" || "), + filter: secretIds.map((id) => `id = "${id}"`).join(" || "), }); } return { document: doc, secrets }; @@ -27,19 +27,19 @@ export const Route = createFileRoute( }); function RouteComponent() { - const { document, secrets } = Route.useLoaderData(); - const strongStart = document?.data?.session?.strongStart || ""; + const { document: session, secrets } = Route.useLoaderData(); + const strongStart = session?.data?.session?.strongStart || ""; const [newSecret, setNewSecret] = useState(""); const [adding, setAdding] = useState(false); const [secretList, setSecretList] = useState(secrets); const [error, setError] = useState(null); async function handleSaveStrongStart(newValue: string) { - await pb.collection("documents").update(document.id, { + await pb.collection("documents").update(session.id, { data: { - ...document.data, + ...session.data, session: { - ...document.data.session, + ...session.data.session, strongStart: newValue, }, }, @@ -53,7 +53,7 @@ function RouteComponent() { try { // 1. Create the secret document const secretDoc = await pb.collection("documents").create({ - campaign: document.campaign, // assuming campaign is an id or object + campaign: session.campaign, // assuming campaign is an id or object data: { secret: { text: newSecret, @@ -62,8 +62,8 @@ function RouteComponent() { }, }); // 2. Check for existing relationship - const existing = await pb.collection("relationships").getOne({ - filter: `primary = "${document.id}" && type = "plannedSecrets"`, + const existing = await pb.collection("relationships").getFullList({ + filter: `primary = "${session.id}" && type = "plannedSecrets"`, }); if (existing.length > 0) { // Update existing relationship to add new secret to secondary array @@ -73,7 +73,7 @@ function RouteComponent() { } else { // Create new relationship await pb.collection("relationships").create({ - primary: document.id, + primary: session.id, secondary: [secretDoc.id], type: "plannedSecrets", }); @@ -87,37 +87,106 @@ function RouteComponent() { } } + async function handleToggleDiscovered(secret: Secret, checked: boolean) { + // 1. Update the discovered field in the secret document + await pb.collection("documents").update(secret.id, { + data: { + ...secret.data, + secret: { + text: secret.data.secret.text, + discovered: checked, + }, + }, + }); + // 2. Remove any existing discoveredIn relationship + const rels = await pb.collection("relationships").getList(1, 1, { + filter: `primary = "${secret.id}" && type = "discoveredIn"`, + }); + if (rels.items.length > 0) { + await pb.collection("relationships").delete(rels.items[0].id); + } + // 3. If marking as discovered, add a new discoveredIn relationship + if (checked) { + await pb.collection("relationships").create({ + primary: secret.id, + secondary: [session.id], + type: "discoveredIn", + }); + } + // 4. Update local state + setSecretList( + secretList.map((s: any) => + s.id === secret.id + ? { + ...s, + data: { + ...s.data, + secret: { ...s.data.secret, discovered: checked }, + }, + } + : s, + ), + ); + } + return (
-

Session Strong Start

+

+ Session Strong Start +

-

Planned Secrets

+

+ Planned Secrets +

{secretList && secretList.length > 0 ? (
    {secretList.map((secret: any) => ( -
  • - {secret.data?.secret?.text || (No secret text)} +
  • + + handleToggleDiscovered(secret, e.target.checked) + } + className="accent-emerald-500 w-5 h-5" + aria-label="Discovered" + /> + + {secret.data?.secret?.text || ( + + (No secret text) + + )} +
  • ))}
) : ( -
No planned secrets for this session.
+
+ No planned secrets for this session. +
)}
{ e.preventDefault(); handleAddSecret(); }} + onSubmit={(e) => { + e.preventDefault(); + handleAddSecret(); + }} > setNewSecret(e.target.value)} + onChange={(e) => setNewSecret(e.target.value)} disabled={adding} />