Adds new campaign form. Adds fronts and thread types

This commit is contained in:
2025-08-03 14:27:06 -07:00
parent 2fbc2c853f
commit 135debdf7f
15 changed files with 319 additions and 75 deletions

View File

@@ -0,0 +1,96 @@
import { BaseForm } from "@/components/form/BaseForm";
import { SingleLineInput } from "@/components/form/SingleLineInput";
import { useDocumentCache } from "@/context/document/hooks";
import { pb } from "@/lib/pocketbase";
import type {
AnyDocument,
CampaignId,
Relationship,
Session,
} from "@/lib/types";
import { useCallback, useState } from "react";
export type Props = {
campaignId: CampaignId;
onCreate: (doc: AnyDocument) => Promise<void>;
};
export const NewSessionForm = ({ campaignId, onCreate }: Props) => {
const [isLoading, setIsLoading] = useState(false);
const [error, setError] = useState<string | null>(null);
const [name, setName] = useState<string>("");
const { dispatch } = useDocumentCache();
console.log("Rendering with name: ", name);
const createNewSession = useCallback(async () => {
setIsLoading(true);
console.log("Creating session: ", name);
try {
// Check for a previous session
const prevSession = await pb
.collection("documents")
.getFirstListItem(`campaign = "${campaignId}" && type = 'session'`, {
sort: "-created",
});
const newSession: Session = await pb.collection("documents").create({
campaign: campaignId,
type: "session",
data: {
name,
strongStart: "",
},
});
// If any relations, then copy things over
if (prevSession) {
const prevRelations = await pb
.collection<Relationship>("relationships")
.getFullList({
filter: `primary = "${prevSession.id}"`,
});
for (const relation of prevRelations) {
await pb.collection("relationships").create({
primary: newSession.id,
type: relation.type,
secondary: relation.secondary,
});
}
}
dispatch({
type: "setDocument",
doc: newSession,
});
await onCreate?.(newSession);
} catch (e: unknown) {
if (e instanceof Error) {
setError(e.message);
} else {
setError("An unknown error occurred while creating the session.");
}
}
setIsLoading(false);
}, [campaignId, name, dispatch, setIsLoading, setError]);
return (
<BaseForm
title="Create new session"
onSubmit={createNewSession}
isLoading={isLoading}
error={error}
content={
<>
<SingleLineInput
label="Name"
value={name}
onChange={setName}
disabled={isLoading}
placeholder="Enter session name"
/>
</>
}
/>
);
};

View File

@@ -11,7 +11,7 @@ export const SessionRow = ({ session }: { session: Session }) => {
search={{ tab: "sessions", docId: session.id }}
className="block font-semibold text-lg text-slate-300"
>
<FormattedDate date={session.created} />
{session.name ? session.name : <FormattedDate date={session.created} />}
</Link>
<div className="">{session.data.strongStart}</div>
</div>