feat: initial commit
This commit is contained in:
@@ -0,0 +1,46 @@
|
||||
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);
|
||||
Reference in New Issue
Block a user