53 lines
1.4 KiB
TypeScript
53 lines
1.4 KiB
TypeScript
import type { MergedTmdbDataDiaryEntry } from "@/libs/search/schemas";
|
|
|
|
import { not, setup } from "xstate";
|
|
|
|
export const editEntryDialogMachine = setup({
|
|
guards: {
|
|
/** Est-ce que l'ouvre présentée possède une entrée dans le Journal ? */
|
|
hasDiaryEntry: ({ context }) => context.entryData?.entryId !== undefined,
|
|
},
|
|
types: {
|
|
context: {} as { entryData: MergedTmdbDataDiaryEntry | undefined },
|
|
input: {} as { entryData: MergedTmdbDataDiaryEntry },
|
|
},
|
|
})
|
|
.createMachine({
|
|
context: ({ input }) => ({
|
|
entryData: input.entryData,
|
|
}),
|
|
id: "editEntryDialog",
|
|
initial: "blankOrEntry",
|
|
states: {
|
|
blankOrEntry: {
|
|
always: [
|
|
{
|
|
guard: not("hasDiaryEntry"),
|
|
target: "viewing.blank",
|
|
},
|
|
{
|
|
guard: "hasDiaryEntry",
|
|
target: "viewing.entry",
|
|
},
|
|
],
|
|
description: "État initial « fantôme » ne servant qu'à déterminer si le média est dans le Journal ou non.",
|
|
},
|
|
editing: {
|
|
description: "État de finalisation.",
|
|
type: "final",
|
|
},
|
|
viewing: {
|
|
description: "État de lecture seule des données de l'entrée.",
|
|
initial: "blank",
|
|
on: {
|
|
editWanted: {
|
|
target: "editing",
|
|
},
|
|
},
|
|
states: {
|
|
blank: {},
|
|
entry: {},
|
|
},
|
|
},
|
|
},
|
|
});
|