dont work

This commit is contained in:
Виталий Лавшонок
2025-11-03 20:36:29 +03:00
parent 91aa3e1f80
commit 9a2c2a9589
7 changed files with 175 additions and 44 deletions

View File

@@ -3,6 +3,8 @@ import axios from "../../axios";
// ─── Типы ────────────────────────────────────────────
type Status = "idle" | "loading" | "successful" | "failed";
export interface GroupMember {
userId: number;
username: string;
@@ -20,17 +22,34 @@ export interface Group {
interface GroupsState {
groups: Group[];
currentGroup: Group | null;
status: "idle" | "loading" | "successful" | "failed";
statuses: {
create: Status;
update: Status;
delete: Status;
fetchMy: Status;
fetchById: Status;
addMember: Status;
removeMember: Status;
};
error: string | null;
}
const initialState: GroupsState = {
groups: [],
currentGroup: null,
status: "idle",
statuses: {
create: "idle",
update: "idle",
delete: "idle",
fetchMy: "idle",
fetchById: "idle",
addMember: "idle",
removeMember: "idle",
},
error: null,
};
// ─── Async Thunks ─────────────────────────────────────
// POST /groups
@@ -146,111 +165,117 @@ const groupsSlice = createSlice({
extraReducers: (builder) => {
// ─── CREATE GROUP ───
builder.addCase(createGroup.pending, (state) => {
state.status = "loading";
state.statuses.create = "loading";
state.error = null;
});
builder.addCase(createGroup.fulfilled, (state, action: PayloadAction<Group>) => {
state.status = "successful";
state.statuses.create = "successful";
state.groups.push(action.payload);
});
builder.addCase(createGroup.rejected, (state, action: PayloadAction<any>) => {
state.status = "failed";
state.statuses.create = "failed";
state.error = action.payload;
});
// ─── UPDATE GROUP ───
builder.addCase(updateGroup.pending, (state) => {
state.status = "loading";
state.statuses.update = "loading";
state.error = null;
});
builder.addCase(updateGroup.fulfilled, (state, action: PayloadAction<Group>) => {
state.status = "successful";
state.statuses.update = "successful";
const index = state.groups.findIndex((g) => g.id === action.payload.id);
if (index !== -1) state.groups[index] = action.payload;
if (state.currentGroup?.id === action.payload.id)
if (state.currentGroup?.id === action.payload.id) {
state.currentGroup = action.payload;
}
});
builder.addCase(updateGroup.rejected, (state, action: PayloadAction<any>) => {
state.status = "failed";
state.statuses.update = "failed";
state.error = action.payload;
});
// ─── DELETE GROUP ───
builder.addCase(deleteGroup.pending, (state) => {
state.status = "loading";
state.statuses.delete = "loading";
state.error = null;
});
builder.addCase(deleteGroup.fulfilled, (state, action: PayloadAction<number>) => {
state.status = "successful";
state.statuses.delete = "successful";
state.groups = state.groups.filter((g) => g.id !== action.payload);
if (state.currentGroup?.id === action.payload) state.currentGroup = null;
});
builder.addCase(deleteGroup.rejected, (state, action: PayloadAction<any>) => {
state.status = "failed";
state.statuses.delete = "failed";
state.error = action.payload;
});
// ─── FETCH MY GROUPS ───
builder.addCase(fetchMyGroups.pending, (state) => {
state.status = "loading";
state.statuses.fetchMy = "loading";
state.error = null;
});
builder.addCase(fetchMyGroups.fulfilled, (state, action: PayloadAction<Group[]>) => {
state.status = "successful";
state.statuses.fetchMy = "successful";
state.groups = action.payload;
});
builder.addCase(fetchMyGroups.rejected, (state, action: PayloadAction<any>) => {
state.status = "failed";
state.statuses.fetchMy = "failed";
state.error = action.payload;
});
// ─── FETCH GROUP BY ID ───
builder.addCase(fetchGroupById.pending, (state) => {
state.status = "loading";
state.statuses.fetchById = "loading";
state.error = null;
});
builder.addCase(fetchGroupById.fulfilled, (state, action: PayloadAction<Group>) => {
state.status = "successful";
state.statuses.fetchById = "successful";
state.currentGroup = action.payload;
});
builder.addCase(fetchGroupById.rejected, (state, action: PayloadAction<any>) => {
state.status = "failed";
state.statuses.fetchById = "failed";
state.error = action.payload;
});
// ─── ADD MEMBER ───
builder.addCase(addGroupMember.pending, (state) => {
state.status = "loading";
state.statuses.addMember = "loading";
state.error = null;
});
builder.addCase(addGroupMember.fulfilled, (state) => {
state.status = "successful";
state.statuses.addMember = "successful";
});
builder.addCase(addGroupMember.rejected, (state, action: PayloadAction<any>) => {
state.status = "failed";
state.statuses.addMember = "failed";
state.error = action.payload;
});
// ─── REMOVE MEMBER ───
builder.addCase(removeGroupMember.pending, (state) => {
state.status = "loading";
state.statuses.removeMember = "loading";
state.error = null;
});
builder.addCase(
removeGroupMember.fulfilled,
(state, action: PayloadAction<{ groupId: number; memberId: number }>) => {
state.status = "successful";
if (state.currentGroup && state.currentGroup.id === action.payload.groupId) {
state.currentGroup.members = state.currentGroup.members.filter(
(m) => m.userId !== action.payload.memberId
);
}
builder.addCase(removeGroupMember.fulfilled, (state, action: PayloadAction<{ groupId: number; memberId: number }>) => {
state.statuses.removeMember = "successful";
if (state.currentGroup && state.currentGroup.id === action.payload.groupId) {
state.currentGroup.members = state.currentGroup.members.filter(
(m) => m.userId !== action.payload.memberId
);
}
);
});
builder.addCase(removeGroupMember.rejected, (state, action: PayloadAction<any>) => {
state.status = "failed";
state.statuses.removeMember = "failed";
state.error = action.payload;
});
},
});