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 {} } export const { selectors: { getUser, getUserByEmail, getUsers, getUserIds }, actions: { setUser, addUsers, delUser, clearUsers }, selectSlice: selectUsers, } = usersSlice.injectInto(reducer);