Files
abode/src/react/store/slices/users.ts
T
2026-06-29 23:07:14 +00:00

47 lines
1.4 KiB
TypeScript

import {
createEntityAdapter,
createSlice,
type WithSlice,
} from "@reduxjs/toolkit";
import type { ClientUser, PartialUser } from "../../../db/types/User.js";
import { reducer } from "../store.js";
import { clearAll } from "../actions/clearAll.js";
const usersAdapter = createEntityAdapter({
selectId: (user: ClientUser | PartialUser) => user.uid,
});
const usersSelectors = usersAdapter.getSelectors();
const usersSlice = createSlice({
name: "users",
initialState: usersAdapter.getInitialState(),
selectors: {
getUser: usersSelectors.selectById,
getUserByEmail: (state, email: string) =>
Object.values(state.entities).find(
(x): x is ClientUser => "email" in x && x.email === email
),
getUsers: usersSelectors.selectEntities,
getUserIds: usersSelectors.selectIds,
},
reducers: {
setUser: usersAdapter.setOne,
addUsers: usersAdapter.addMany,
delUser: usersAdapter.removeOne,
clearUsers: usersAdapter.removeAll,
},
extraReducers(builder) {
builder.addCase(clearAll, () => usersAdapter.getInitialState());
},
});
declare module "../store.js" {
export interface LazySlices extends WithSlice<typeof usersSlice> {}
}
export const {
selectors: { getUser, getUserByEmail, getUsers, getUserIds },
actions: { setUser, addUsers, delUser, clearUsers },
selectSlice: selectUsers,
} = usersSlice.injectInto(reducer);