62 lines
1.2 KiB
TypeScript
62 lines
1.2 KiB
TypeScript
import { makeReducer } from "../../libraries/reducer.ts";
|
|
import { Events } from "./events.ts";
|
|
|
|
export const userReducer = makeReducer<Events, UserState>(
|
|
(state, event) => {
|
|
switch (event.type) {
|
|
case "user:created": {
|
|
state.name.given = event.data.name?.given ?? "";
|
|
state.name.family = event.data.name?.family ?? "";
|
|
state.email = event.data.email;
|
|
break;
|
|
}
|
|
case "user:name:given-set": {
|
|
state.name.given = event.data;
|
|
break;
|
|
}
|
|
case "user:name:family-set": {
|
|
state.name.family = event.data;
|
|
break;
|
|
}
|
|
case "user:email-set": {
|
|
state.email = event.data;
|
|
break;
|
|
}
|
|
case "user:activated": {
|
|
state.active = true;
|
|
break;
|
|
}
|
|
case "user:deactivated": {
|
|
state.active = false;
|
|
break;
|
|
}
|
|
}
|
|
return state;
|
|
},
|
|
() => ({
|
|
name: {
|
|
given: "",
|
|
family: "",
|
|
},
|
|
email: "",
|
|
active: true,
|
|
posts: {
|
|
list: [],
|
|
count: 0,
|
|
},
|
|
}),
|
|
);
|
|
|
|
type UserState = {
|
|
name: {
|
|
given: string;
|
|
family: string;
|
|
};
|
|
email: string;
|
|
active: boolean;
|
|
posts: {
|
|
list: string[];
|
|
count: number;
|
|
};
|
|
};
|