u
This commit is contained in:
@@ -1,11 +1,13 @@
|
||||
/**
|
||||
* @file navigationAutomat.js
|
||||
* @description Stores the user's most recently visited delivery document path
|
||||
* and article SKU to preserve navigation context across primary section switches.
|
||||
* @description Stores the user's most recently visited delivery document path,
|
||||
* article SKU, article search term/path, and category slug/path to preserve
|
||||
* navigation context across primary and secondary section switches.
|
||||
*
|
||||
* Upstream Triggers:
|
||||
* - UI / Routes: Set by article and delivery views/routes via `setLastDeliveryPath(path)`,
|
||||
* `setLastArticleSku(sku)`, and `clearNavigation()`.
|
||||
* - UI / Routes: Set by article search, category navigation, and delivery views/routes
|
||||
* via `setLastDeliveryPath(path)`, `setLastArticleSku(sku)`, `setLastSearchTerm(term, path)`,
|
||||
* `setLastCategorySlug(slug)`, and `clearNavigation()`.
|
||||
*/
|
||||
|
||||
import { Automat } from 'react-automat';
|
||||
@@ -14,17 +16,25 @@ import { Automat } from 'react-automat';
|
||||
* @typedef {Object} NavigationState
|
||||
* @property {string|null} lastDeliveryPath Last delivery path visited by the user.
|
||||
* @property {string|null} lastArticleSku Last article SKU visited by the user.
|
||||
* @property {string|null} lastSearchTerm Last article search query term.
|
||||
* @property {string|null} lastArticleSearchPath Full last search path (e.g. `/artikel?target=apfel`).
|
||||
* @property {string|null} lastCategorySlug Last visited category slug (e.g. `obst-gemuese/obst`).
|
||||
* @property {string|null} lastCategoryPath Full last category path (e.g. `/kategorien/obst-gemuese/obst`).
|
||||
*/
|
||||
|
||||
/** @type {NavigationState} */
|
||||
const initialState = {
|
||||
lastDeliveryPath: null,
|
||||
lastArticleSku: null,
|
||||
lastSearchTerm: null,
|
||||
lastArticleSearchPath: null,
|
||||
lastCategorySlug: null,
|
||||
lastCategoryPath: null,
|
||||
};
|
||||
|
||||
/**
|
||||
* Stores the user's most recently visited delivery and article so main-menu
|
||||
* navigation can restore the previous context.
|
||||
* Stores the user's most recently visited delivery, article, search term, and category
|
||||
* so main-menu and sub-menu navigation can restore the previous context.
|
||||
*
|
||||
* @type {Automat<NavigationState>}
|
||||
*/
|
||||
@@ -33,9 +43,9 @@ const navigationAutomat = new Automat(
|
||||
{
|
||||
/**
|
||||
* Set the last visited delivery path.
|
||||
*
|
||||
* @param {string|null} path Full path such as `/lieferung/19` or `/lieferung/neu`.
|
||||
* @returns {void}
|
||||
*
|
||||
* @param {string|null} path Full path such as `/lieferung/19` or `/lieferung/neu`.
|
||||
* @returns {void}
|
||||
*/
|
||||
setLastDeliveryPath(path) {
|
||||
navigationAutomat.setState({ lastDeliveryPath: path });
|
||||
@@ -43,24 +53,81 @@ const navigationAutomat = new Automat(
|
||||
|
||||
/**
|
||||
* Set the last visited article SKU.
|
||||
*
|
||||
*
|
||||
* @param {string|null} sku
|
||||
* @returns {void}
|
||||
* @returns {void}
|
||||
*/
|
||||
setLastArticleSku(sku) {
|
||||
navigationAutomat.setState({ lastArticleSku: sku });
|
||||
},
|
||||
|
||||
/**
|
||||
* Set the last active article search term and optional search URL.
|
||||
*
|
||||
* @param {string|null} term Search input term.
|
||||
* @param {string|null} [path] Full search URL.
|
||||
* @returns {void}
|
||||
*/
|
||||
setLastSearchTerm(term, path = null) {
|
||||
const trimmed = term != null ? String(term) : '';
|
||||
const searchPath = path ?? (trimmed ? `/artikel?target=${encodeURIComponent(trimmed)}` : '/artikel');
|
||||
navigationAutomat.setState({
|
||||
lastSearchTerm: trimmed || null,
|
||||
lastArticleSearchPath: searchPath,
|
||||
});
|
||||
},
|
||||
|
||||
/**
|
||||
* Set the full last article search URL path.
|
||||
*
|
||||
* @param {string|null} path Full search URL path (e.g. `/artikel?target=apfel`).
|
||||
* @param {string|null} [term] Search term.
|
||||
* @returns {void}
|
||||
*/
|
||||
setLastArticleSearchPath(path, term = null) {
|
||||
navigationAutomat.setState({
|
||||
lastArticleSearchPath: path,
|
||||
...(term !== null ? { lastSearchTerm: term } : {}),
|
||||
});
|
||||
},
|
||||
|
||||
/**
|
||||
* Set the last visited category slug.
|
||||
*
|
||||
* @param {string|null} slug Category slug (e.g. `obst-gemuese/obst` or empty string for root).
|
||||
* @returns {void}
|
||||
*/
|
||||
setLastCategorySlug(slug) {
|
||||
const clean = slug ? String(slug).replace(/^\/+|\/+$/g, '') : '';
|
||||
const path = clean ? `/kategorien/${clean}` : '/kategorien';
|
||||
navigationAutomat.setState({
|
||||
lastCategorySlug: clean || null,
|
||||
lastCategoryPath: path,
|
||||
});
|
||||
},
|
||||
|
||||
/**
|
||||
* Set the full last category path.
|
||||
*
|
||||
* @param {string|null} path Full category path (e.g. `/kategorien/obst-gemuese/obst`).
|
||||
* @returns {void}
|
||||
*/
|
||||
setLastCategoryPath(path) {
|
||||
const cleanPath = path ? String(path).replace(/^\/+/, '/') : '/kategorien';
|
||||
const slug = cleanPath.replace(/^\/kategorien\/?/, '').replace(/\/+$/, '');
|
||||
navigationAutomat.setState({
|
||||
lastCategorySlug: slug || null,
|
||||
lastCategoryPath: cleanPath,
|
||||
});
|
||||
},
|
||||
|
||||
/**
|
||||
* Clear all navigation history.
|
||||
*
|
||||
* @returns {void}
|
||||
*
|
||||
* @returns {void}
|
||||
*/
|
||||
clearNavigation() {
|
||||
navigationAutomat.setState({
|
||||
lastDeliveryPath: null,
|
||||
lastArticleSku: null,
|
||||
});
|
||||
navigationAutomat.setState(initialState);
|
||||
},
|
||||
},
|
||||
{
|
||||
@@ -70,4 +137,12 @@ const navigationAutomat = new Automat(
|
||||
);
|
||||
|
||||
export default navigationAutomat;
|
||||
export const { setLastDeliveryPath, setLastArticleSku, clearNavigation } = navigationAutomat.actions;
|
||||
export const {
|
||||
setLastDeliveryPath,
|
||||
setLastArticleSku,
|
||||
setLastSearchTerm,
|
||||
setLastArticleSearchPath,
|
||||
setLastCategorySlug,
|
||||
setLastCategoryPath,
|
||||
clearNavigation,
|
||||
} = navigationAutomat.actions;
|
||||
|
||||
Reference in New Issue
Block a user