pinterest-like-image-gallery
72 строки · 1.8 Кб
1import { createSlice, PayloadAction } from "@reduxjs/toolkit";
2
3interface ImageItem {
4id: number;
5url: string;
6comment: string;
7}
8
9interface GalleryState {
10items: Array<ImageItem>;
11imageUrl: string;
12comment: string;
13}
14
15const initialState: GalleryState = {
16items: [],
17imageUrl: "",
18comment: "",
19};
20
21const gallerySlice = createSlice({
22name: "gallery",
23initialState,
24reducers: {
25setItems: (state, action: PayloadAction<ImageItem[]>) => {
26state.items = action.payload;
27},
28setImageUrl: (state, action: PayloadAction<string>) => {
29state.imageUrl = action.payload;
30},
31setComment: (state, action: PayloadAction<string>) => {
32state.comment = action.payload;
33},
34addItem: (state) => {
35const lastId =
36state.items.length > 0
37? state.items[state.items.length - 1].id
38: 0;
39state.items.push({
40id: lastId + 1,
41url: state.imageUrl,
42comment: state.comment,
43});
44state.imageUrl = "";
45state.comment = "";
46},
47removeItem: (state, action: PayloadAction<number>) => {
48state.items = state.items.filter(
49(item) => item.id !== action.payload
50);
51},
52updateComment: (
53state,
54action: PayloadAction<{ id: number; comment: string }>
55) => {
56const item = state.items.find((i) => i.id === action.payload.id);
57if (item) {
58item.comment = action.payload.comment;
59}
60},
61},
62});
63
64export const {
65setItems,
66setImageUrl,
67setComment,
68addItem,
69removeItem,
70updateComment,
71} = gallerySlice.actions;
72export default gallerySlice.reducer;
73