Files
cozsweet-frontend-nextjs/src/stores/auth/machine/setup.ts
T

73 lines
1.8 KiB
TypeScript

import { setup, type ActionFunction, type EventObject } from "xstate";
import type { AuthEvent } from "../auth-events";
import type { AuthState } from "../auth-state";
import {
emailLoginActor,
emailRegisterThenLoginActor,
} from "./actors/credentials";
import { bindFacebookIdentityActor } from "./actors/identity";
import {
oauthSignInActor,
syncFacebookBackendActor,
syncGoogleBackendActor,
} from "./actors/oauth";
import {
checkAuthStatusActor,
guestLoginActor,
logoutActor,
} from "./actors/session";
export const baseAuthMachineSetup = setup({
types: {
context: {} as AuthState,
events: {} as AuthEvent,
},
actors: {
emailLogin: emailLoginActor,
emailRegisterThenLogin: emailRegisterThenLoginActor,
oauthSignIn: oauthSignInActor,
syncGoogleBackend: syncGoogleBackendActor,
syncFacebookBackend: syncFacebookBackendActor,
guestLogin: guestLoginActor,
checkAuthStatus: checkAuthStatusActor,
bindFacebookIdentity: bindFacebookIdentityActor,
logout: logoutActor,
},
guards: {
canSubmitGuestLogin: ({ context }) =>
context.loginStatus === "notLoggedIn",
canLogoutToGuest: ({ context }) =>
context.loginStatus !== "notLoggedIn" &&
context.loginStatus !== "guest",
},
});
type AuthActorAction<TEvent extends EventObject> = ActionFunction<
AuthState,
TEvent,
AuthEvent,
undefined,
never,
never,
never,
never,
never
>;
export function createAuthActorActionSetup<TEvent extends EventObject>() {
const actorActionSetup = setup({
types: {
context: {} as AuthState,
events: {} as TEvent,
},
});
return {
assign(
assignment: Parameters<typeof actorActionSetup.assign>[0],
): AuthActorAction<TEvent> {
return actorActionSetup.assign(assignment) as unknown as AuthActorAction<TEvent>;
},
};
}