47 lines
1.4 KiB
TypeScript
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);
|