From 6141e71e2f47c3206111825a265069f750d5924d Mon Sep 17 00:00:00 2001 From: seb Date: Sat, 1 Aug 2026 03:49:41 +0200 Subject: [PATCH] Remove deleted articles from the category list cache. After DELETE, the category view kept showing the article until a full reload because Redux still held it. --- src/api/index.js | 1 + src/components/article/ArticleView.jsx | 9 +++++++-- src/store/categorySlice.js | 7 +++++++ 3 files changed, 15 insertions(+), 2 deletions(-) diff --git a/src/api/index.js b/src/api/index.js index 7b46938..f41a7b7 100644 --- a/src/api/index.js +++ b/src/api/index.js @@ -179,6 +179,7 @@ export const article = { /** * DELETE /api/article/:sku → 204 + * Errors: 400 Article has children, 401, 403, 404 Article not found */ delete(sku) { return http(`/api/article/${encodeURIComponent(sku)}`, { diff --git a/src/components/article/ArticleView.jsx b/src/components/article/ArticleView.jsx index f662bae..726c176 100644 --- a/src/components/article/ArticleView.jsx +++ b/src/components/article/ArticleView.jsx @@ -1,5 +1,5 @@ import { Link as RouterLink, useNavigate } from 'react-router-dom'; -import { useSelector } from 'react-redux'; +import { useDispatch, useSelector } from 'react-redux'; import Box from '@mui/material/Box'; import Link from '@mui/material/Link'; import Typography from '@mui/material/Typography'; @@ -22,7 +22,10 @@ import { buildCategoryPath, defaultCategoryPath, } from '../../pages/artikel/categoryRoute'; -import { selectCategoryRootId } from '../../store/categorySlice'; +import { + removeArticleBySku, + selectCategoryRootId, +} from '../../store/categorySlice'; function PanelValue({ label, children }) { if (children == null || children === '') return null; @@ -107,6 +110,7 @@ const articleNameFieldHiddenSx = { export default function ArticleView({ article: articleData, onArticleUpdated }) { const navigate = useNavigate(); + const dispatch = useDispatch(); const categories = useSelector((state) => state.category.categories); const rootCategoryId = useSelector(selectCategoryRootId); const basePrice = primaryPrice(articleData); @@ -126,6 +130,7 @@ export default function ArticleView({ article: articleData, onArticleUpdated }) articleData.categoryIds?.[0], 'article.categoryIds[0]', ); + dispatch(removeArticleBySku(articleData.sku)); if (categories && rootCategoryId != null) { navigate(buildCategoryPath(categories, rootCategoryId, categoryId)); return; diff --git a/src/store/categorySlice.js b/src/store/categorySlice.js index 6120904..9fb4958 100644 --- a/src/store/categorySlice.js +++ b/src/store/categorySlice.js @@ -217,6 +217,12 @@ const categorySlice = createSlice({ resetCategoryState() { return initialState; }, + removeArticleBySku(state, action) { + const sku = action.payload; + state.articles = state.articles.filter((row) => row.sku !== sku); + state.articlesTotal = state.articles.length; + state.rootArticles = state.rootArticles.filter((row) => row.sku !== sku); + }, }, extraReducers: (builder) => { builder @@ -298,6 +304,7 @@ export const { navigateToCategory, navigateBack, resetCategoryState, + removeArticleBySku, } = categorySlice.actions; export const selectCategoryMap = (state) => state.category.categories;