Sage100/src/store/features/article/slice.ts
2026-01-20 11:06:52 +03:00

162 lines
4 KiB
TypeScript

/* eslint-disable import/order */
/* eslint-disable @typescript-eslint/consistent-type-imports */
import { createSlice, type PayloadAction } from "@reduxjs/toolkit";
import { articleState } from "./type";
import { addStock, createArticle, getarticleById, getArticles, updateArticle } from "./thunk";
import { Article } from "@/types/articleType";
const initialState: articleState = {
status: "idle",
error: null,
articles: [],
articleSelected: null,
};
const articleSlice = createSlice({
name: "article",
initialState,
reducers: {
selectArticle: (state, action: PayloadAction<Article>) => {
state.articleSelected = action.payload;
}
},
extraReducers: (builder) => {
/**
* get all articles
*/
builder.addCase(getArticles.fulfilled, (state, action) => {
const data = action.payload;
state.articles = data;
state.error = null;
state.status = "succeeded";
});
builder.addCase(getArticles.pending, (state) => {
state.status = "loading";
});
builder.addCase(getArticles.rejected, (state, action) => {
state.status = "failed";
state.error = action.error.message || "An error occurred";
});
/**
* get article by id
*/
builder.addCase(getarticleById.pending, (state) => {
state.status = "loading";
});
builder.addCase(getarticleById.fulfilled, (state, action) => {
const data = action.payload as Article;
const idx = state.articles.findIndex((n) => n.reference === data.reference);
if (idx !== -1) {
state.articles[idx] = data;
} else {
state.articles.push(data);
}
state.status = "succeeded";
state.error = null;
});
builder.addCase(getarticleById.rejected, (state, action) => {
state.status = "failed";
state.error = (action.payload as string) || action.error.message || "An error occurred";
});
/**
* add article
*/
builder.addCase(createArticle.fulfilled, (state, action) => {
const data = action.payload as any
state.articles.unshift(data);
state.status = "succeeded";
state.error = null;
});
builder.addCase(createArticle.pending, (state) => {
state.status = "loading";
});
builder.addCase(createArticle.rejected, (state, action) => {
state.status = "failed";
state.error = action.error.message || "An error occurred";
});
/**
* update article
*/
builder.addCase(updateArticle.pending, (state) => {
state.status = "loading";
});
builder.addCase(updateArticle.fulfilled, (state, action) => {
const data = action.payload as Article
const idx = state.articles.findIndex((p) => p.reference === data.reference);
if (idx !== -1){
state.articles[idx] = data
}
state.status = "succeeded";
state.error = null;
});
builder.addCase(updateArticle.rejected, (state, action) => {
state.status = "failed";
state.error = (action.payload as string) || action.error.message || "Failed to update";
});
/**
* add stock
*/
builder.addCase(addStock.pending, (state) => {
state.status = "loading";
});
builder.addCase(addStock.fulfilled, (state, action) => {
const { data, quantite } = action.payload;
const idx = state.articles.findIndex(
(p) => p.reference === data.article_ref
);
if (idx !== -1) {
state.articles[idx].stock_reel += quantite;
state.articles[idx].stock_disponible! += quantite;
}
if (state.articleSelected) {
state.articleSelected.stock_reel += quantite;
state.articleSelected.stock_disponible! += quantite;
}
state.status = "succeeded";
state.error = null;
});
builder.addCase(addStock.rejected, (state, action) => {
state.status = "failed";
state.error = (action.payload as string) || action.error.message || "Failed to update";
});
},
});
export const { selectArticle } = articleSlice.actions
export default articleSlice.reducer;