61 lines
1.4 KiB
TypeScript
61 lines
1.4 KiB
TypeScript
import { setup, type ActionFunction, type EventObject } from "xstate";
|
|
|
|
import { getPendingAlbum } from "../helper/albums";
|
|
import type { PrivateRoomEvent } from "../private-room-events";
|
|
import type { PrivateRoomState } from "../private-room-state";
|
|
import {
|
|
loadPrivateAlbumsActor,
|
|
unlockPrivateAlbumActor,
|
|
} from "./actors/albums";
|
|
|
|
export interface PrivateRoomMachineInput {
|
|
characterId?: string;
|
|
}
|
|
|
|
export const basePrivateRoomMachineSetup = setup({
|
|
types: {
|
|
context: {} as PrivateRoomState,
|
|
events: {} as PrivateRoomEvent,
|
|
input: {} as PrivateRoomMachineInput,
|
|
},
|
|
actors: {
|
|
loadAlbums: loadPrivateAlbumsActor,
|
|
unlockAlbum: unlockPrivateAlbumActor,
|
|
},
|
|
guards: {
|
|
hasPendingAlbum: ({ context }) => getPendingAlbum(context) !== null,
|
|
},
|
|
});
|
|
|
|
type PrivateRoomActorAction<TEvent extends EventObject> = ActionFunction<
|
|
PrivateRoomState,
|
|
TEvent,
|
|
PrivateRoomEvent,
|
|
undefined,
|
|
never,
|
|
never,
|
|
never,
|
|
never,
|
|
never
|
|
>;
|
|
|
|
export function createPrivateRoomActorActionSetup<
|
|
TEvent extends EventObject,
|
|
>() {
|
|
const actorActionSetup = setup({
|
|
types: {
|
|
context: {} as PrivateRoomState,
|
|
events: {} as TEvent,
|
|
},
|
|
});
|
|
return {
|
|
assign(
|
|
assignment: Parameters<typeof actorActionSetup.assign>[0],
|
|
): PrivateRoomActorAction<TEvent> {
|
|
return actorActionSetup.assign(
|
|
assignment,
|
|
) as unknown as PrivateRoomActorAction<TEvent>;
|
|
},
|
|
};
|
|
}
|