Adds new campaign form. Adds fronts and thread types
This commit is contained in:
96
src/components/documents/session/NewSessionForm.tsx
Normal file
96
src/components/documents/session/NewSessionForm.tsx
Normal 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"
|
||||
/>
|
||||
</>
|
||||
}
|
||||
/>
|
||||
);
|
||||
};
|
||||
@@ -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>
|
||||
|
||||
Reference in New Issue
Block a user