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: {}, }, }, }, });