u
This commit is contained in:
@@ -30,6 +30,8 @@ import authAutomat from './authAutomat';
|
||||
/** @type {SupplierState} */
|
||||
const initialState = {
|
||||
suppliers: [],
|
||||
articlesBySupplier: {},
|
||||
articlesLoading: false,
|
||||
status: 'idle',
|
||||
error: null,
|
||||
};
|
||||
@@ -62,6 +64,7 @@ function loadSuppliers() {
|
||||
try {
|
||||
const suppliers = await fetchSuppliers();
|
||||
supplierAutomat.setState({ suppliers, status: 'ready', error: null });
|
||||
void actions.loadAllSupplierArticles().catch(() => {});
|
||||
return suppliers;
|
||||
} catch (error) {
|
||||
supplierAutomat.setState({ status: 'failed', error });
|
||||
@@ -92,6 +95,7 @@ const actions = {
|
||||
try {
|
||||
const suppliers = await fetchSuppliers();
|
||||
supplierAutomat.setState({ suppliers, status: 'ready', error: null });
|
||||
void actions.loadAllSupplierArticles().catch(() => {});
|
||||
return suppliers;
|
||||
} catch (error) {
|
||||
supplierAutomat.setState({ error });
|
||||
@@ -99,6 +103,58 @@ const actions = {
|
||||
}
|
||||
},
|
||||
|
||||
/**
|
||||
* Loads articles for a single supplier, caching them in state.articlesBySupplier.
|
||||
*
|
||||
* @param {string|number} supplierId
|
||||
* @returns {Promise<Array<object>>}
|
||||
*/
|
||||
async loadArticlesForSupplier(supplierId) {
|
||||
const sId = String(supplierId);
|
||||
if (supplierAutomat.state.articlesBySupplier?.[sId]) {
|
||||
return supplierAutomat.state.articlesBySupplier[sId];
|
||||
}
|
||||
const res = await supplierApi.getArticles(supplierId);
|
||||
const articles = Array.isArray(res?.articles) ? res.articles : [];
|
||||
supplierAutomat.setState({
|
||||
articlesBySupplier: {
|
||||
...(supplierAutomat.state.articlesBySupplier || {}),
|
||||
[sId]: articles,
|
||||
},
|
||||
});
|
||||
return articles;
|
||||
},
|
||||
|
||||
/**
|
||||
* Loads articles for all suppliers in the supplier list, caching them in state.articlesBySupplier.
|
||||
*
|
||||
* @returns {Promise<Record<string, Array<object>>>}
|
||||
*/
|
||||
async loadAllSupplierArticles() {
|
||||
const suppliers = supplierAutomat.state.suppliers;
|
||||
if (!suppliers.length) return {};
|
||||
supplierAutomat.setState({ articlesLoading: true });
|
||||
try {
|
||||
const results = await Promise.allSettled(
|
||||
suppliers.map(async (s) => {
|
||||
const res = await supplierApi.getArticles(s.id);
|
||||
return { id: String(s.id), articles: Array.isArray(res?.articles) ? res.articles : [] };
|
||||
}),
|
||||
);
|
||||
const nextMap = { ...(supplierAutomat.state.articlesBySupplier || {}) };
|
||||
for (const r of results) {
|
||||
if (r.status === 'fulfilled') {
|
||||
nextMap[r.value.id] = r.value.articles;
|
||||
}
|
||||
}
|
||||
supplierAutomat.setState({ articlesBySupplier: nextMap, articlesLoading: false });
|
||||
return nextMap;
|
||||
} catch {
|
||||
supplierAutomat.setState({ articlesLoading: false });
|
||||
return supplierAutomat.state.articlesBySupplier || {};
|
||||
}
|
||||
},
|
||||
|
||||
/**
|
||||
* Creates a supplier and refreshes the cached list.
|
||||
*
|
||||
|
||||
Reference in New Issue
Block a user