dinocollab-core 2.0.7 → 2.0.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/mfe-shared/cart.js +1 -1
- package/dist/mfe-shared/cart.js.map +1 -1
- package/dist/mfe-shared/cart.ssr.js +1 -1
- package/dist/mfe-shared/cart.ssr.js.map +1 -1
- package/dist/mfe-shared/cart.types.js +1 -1
- package/dist/mfe-shared/cart.types.js.map +1 -1
- package/dist/mfe-shared/index.js +1 -1
- package/dist/types/mfe-shared/cart.d.ts +13 -5
- package/dist/types/mfe-shared/cart.ssr.d.ts +22 -16
- package/dist/types/mfe-shared/cart.types.d.ts +2 -16
- package/dist/types/mfe-shared/index.d.ts +1 -2
- package/package.json +1 -1
package/dist/mfe-shared/cart.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{slicedToArray as r,toConsumableArray as t}from"../_virtual/_rollupPluginBabelHelpers.js";import{useMemo as
|
|
1
|
+
import{slicedToArray as r,toConsumableArray as t}from"../_virtual/_rollupPluginBabelHelpers.js";import{useMemo as i,useState as e,useRef as n,useEffect as o,useCallback as a}from"react";import{mfeBridge as u}from"./mfe-bridge.js";import{isBrowser as s}from"./environment.js";import{CART_CHANNELS as l}from"./cart.types.js";var c="mfe_cart_items";function f(a){var f=i((function(){return(null==a?void 0:a.storageKey)||c}),[null==a?void 0:a.storageKey]),g=i((function(){return a.idGetter}),[null==a?void 0:a.idGetter]),S=e([]),m=r(S,2),N=m[0],b=m[1],E=n(!1);return o((function(){if(s()){var r=localStorage.getItem(f);if(r)try{var i=JSON.parse(r);Array.isArray(i)&&(b(i),E.current=!0)}catch(r){console.error("Failed to parse cart from localStorage:",r)}var e=u.subscribe(l.ADD,(function(r){b((function(i){var e,n=g(r),o=i.findIndex((function(r){return g(r)===n}));if(o>=0?(e=t(i))[o]=r:e=[].concat(t(i),[r]),JSON.stringify(e)!==JSON.stringify(i)){if(s()){var a=localStorage.getItem(f);JSON.stringify(e)!==a&&localStorage.setItem(f,JSON.stringify(e))}return u.publish(l.STATE_CHANGE,e),e}return i}))})),n=u.subscribe(l.REMOVE,(function(r){b((function(t){var i=t.filter((function(t){return g(t)!==r.id}));if(JSON.stringify(i)!==JSON.stringify(t)){if(s()){var e=localStorage.getItem(f);JSON.stringify(i)!==e&&localStorage.setItem(f,JSON.stringify(i))}return u.publish(l.STATE_CHANGE,i),i}return t}))})),o=u.subscribe(l.CLEAR,(function(){b([]),s()&&localStorage.removeItem(f),u.publish(l.STATE_CHANGE,[])})),a=u.subscribe(l.UPDATE,(function(r){b((function(t){if(JSON.stringify(r)!==JSON.stringify(t)){if(s()){var i=localStorage.getItem(f);JSON.stringify(r)!==i&&localStorage.setItem(f,JSON.stringify(r))}return u.publish(l.STATE_CHANGE,r),r}return t}))})),c=u.subscribe(l.INIT_REQUEST,(function(){b((function(r){return r.length>0&&u.publish(l.INIT_RESPONSE,r),r}))})),S=u.subscribe(l.INIT_RESPONSE,(function(r){!E.current&&r&&r.length>0&&b((function(t){if(JSON.stringify(r)!==JSON.stringify(t)){if(s()){var i=localStorage.getItem(f);JSON.stringify(r)!==i&&localStorage.setItem(f,JSON.stringify(r))}return E.current=!0,u.publish(l.STATE_CHANGE,r),r}return t}))}));return E.current||u.publish(l.INIT_REQUEST,null),function(){e(),n(),o(),a(),c(),S()}}}),[f,g]),{items:N,totalItems:N.length}}function g(t){var i=e([]),n=r(i,2),a=n[0],f=n[1],g=t||c;return o((function(){if(s()){var r=localStorage.getItem(g);if(r)try{var t=JSON.parse(r);Array.isArray(t)&&f(t)}catch(r){console.error("Failed to parse cart from localStorage:",r)}var i=u.subscribe(l.STATE_CHANGE,(function(r){f(r||[])}));return function(){i()}}}),[g]),{items:a,totalItems:a.length}}function S(){return{addToCart:a((function(r){u.publish(l.ADD,r)}),[]),removeFromCart:a((function(r){u.publish(l.REMOVE,{id:r})}),[]),clearCart:a((function(){u.publish(l.CLEAR,null)}),[]),updateCart:a((function(r){u.publish(l.UPDATE,r)}),[])}}export{S as useMfeCartActions,g as useMfeCartData,f as useMfeCartStore};
|
|
2
2
|
//# sourceMappingURL=cart.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cart.js","sources":["../../src/mfe-shared/cart.tsx"],"sourcesContent":["/**\r\n * cart.tsx - Shared shopping cart system for micro-frontends\r\n *\r\n * This module provides hooks for managing a shared shopping cart across\r\n * multiple micro-frontends. The cart state is synchronized using the\r\n * mfeBridge communication system and persisted in localStorage.\r\n */\r\n\r\nimport { useEffect, useState, useRef, useCallback, useMemo } from 'react'\r\nimport { mfeBridge } from './mfe-bridge'\r\nimport { isBrowser } from './environment'\r\nimport { ICartItem, CART_CHANNELS } from './cart.types'\r\n\r\n/** LocalStorage key for persisting cart items */\r\nconst CART_STORAGE_KEY = 'mfe_cart_items'\r\n\r\nexport interface IMfeCartStoreConfigs<T = any> {\r\n storageKey: string\r\n idGetter?: (item: T) => string\r\n}\r\n\r\n/**\r\n * Hook to manage cart state across microFE\r\n * This hook will:\r\n * - Initialize cart from localStorage\r\n * - Listen for cart events (add, remove, clear, update)\r\n * - Provide current cart state\r\n */\r\nexport function useMfeCartStore<O = any, T extends ICartItem<O> = ICartItem<O>>(configs?: IMfeCartStoreConfigs<T>) {\r\n // Use provided storage key or default to CART_STORAGE_KEY\r\n const cartStorageKey = useMemo(() => configs?.storageKey || CART_STORAGE_KEY, [configs?.storageKey])\r\n\r\n // Default idGetter uses ProductId, but can be customized\r\n const getItemId = useMemo(() => configs?.idGetter || ((item: T) => item.ProductId), [configs?.idGetter])\r\n\r\n // State to hold cart items\r\n const [items, setItems] = useState<T[]>([])\r\n\r\n // Mark as initialized\r\n const initialized = useRef(false)\r\n\r\n useEffect(() => {\r\n // Skip localStorage operations in non-browser environments\r\n if (!isBrowser()) {\r\n return\r\n }\r\n\r\n // Restore from localStorage if available\r\n const storedItems = localStorage.getItem(cartStorageKey)\r\n if (storedItems) {\r\n try {\r\n const parsedItems = JSON.parse(storedItems)\r\n if (Array.isArray(parsedItems)) {\r\n setItems(parsedItems)\r\n initialized.current = true\r\n }\r\n } catch (e) {\r\n console.error('Failed to parse cart from localStorage:', e)\r\n }\r\n }\r\n\r\n // Subscribe to cart events\r\n const unsubAdd = mfeBridge.subscribe(CART_CHANNELS.ADD, (payload: T) => {\r\n setItems((prev) => {\r\n const itemId = getItemId(payload)\r\n const existingIndex = prev.findIndex((item) => getItemId(item) === itemId)\r\n\r\n let newItems: T[]\r\n if (existingIndex >= 0) {\r\n // Update existing item\r\n newItems = [...prev]\r\n newItems[existingIndex] = payload\r\n } else {\r\n // Add new item\r\n newItems = [...prev, payload]\r\n }\r\n\r\n if (JSON.stringify(newItems) !== JSON.stringify(prev)) {\r\n // Save to localStorage only if value changed\r\n if (isBrowser()) {\r\n const current = localStorage.getItem(cartStorageKey)\r\n if (JSON.stringify(newItems) !== current) {\r\n localStorage.setItem(cartStorageKey, JSON.stringify(newItems))\r\n }\r\n }\r\n return newItems\r\n }\r\n return prev\r\n })\r\n })\r\n\r\n const unsubRemove = mfeBridge.subscribe(CART_CHANNELS.REMOVE, (payload: { id: string }) => {\r\n setItems((prev) => {\r\n const newItems = prev.filter((item) => getItemId(item) !== payload.id)\r\n if (JSON.stringify(newItems) !== JSON.stringify(prev)) {\r\n // Save to localStorage only if value changed\r\n if (isBrowser()) {\r\n const current = localStorage.getItem(cartStorageKey)\r\n if (JSON.stringify(newItems) !== current) {\r\n localStorage.setItem(cartStorageKey, JSON.stringify(newItems))\r\n }\r\n }\r\n return newItems\r\n }\r\n return prev\r\n })\r\n })\r\n\r\n const unsubClear = mfeBridge.subscribe(CART_CHANNELS.CLEAR, () => {\r\n setItems([])\r\n if (isBrowser()) {\r\n localStorage.removeItem(cartStorageKey)\r\n }\r\n })\r\n\r\n const unsubUpdate = mfeBridge.subscribe(CART_CHANNELS.UPDATE, (payload: T[]) => {\r\n setItems((prev) => {\r\n if (JSON.stringify(payload) !== JSON.stringify(prev)) {\r\n // Save to localStorage only if value changed\r\n if (isBrowser()) {\r\n const current = localStorage.getItem(cartStorageKey)\r\n if (JSON.stringify(payload) !== current) {\r\n localStorage.setItem(cartStorageKey, JSON.stringify(payload))\r\n }\r\n }\r\n return payload\r\n }\r\n return prev\r\n })\r\n })\r\n\r\n // Subscribe to init requests from other microFEs\r\n const unsubInitReq = mfeBridge.subscribe(CART_CHANNELS.INIT_REQUEST, () => {\r\n // Use callback to get current state to avoid stale closure\r\n setItems((currentItems) => {\r\n if (currentItems.length > 0) {\r\n mfeBridge.publish(CART_CHANNELS.INIT_RESPONSE, currentItems)\r\n }\r\n return currentItems // No change to state\r\n })\r\n })\r\n\r\n // Subscribe to init responses if state is not available\r\n const unsubInitRes = mfeBridge.subscribe(CART_CHANNELS.INIT_RESPONSE, (payload: T[]) => {\r\n if (!initialized.current && payload && payload.length > 0) {\r\n setItems((prev) => {\r\n if (JSON.stringify(payload) !== JSON.stringify(prev)) {\r\n // Save to localStorage only if value changed\r\n if (isBrowser()) {\r\n const current = localStorage.getItem(cartStorageKey)\r\n if (JSON.stringify(payload) !== current) {\r\n localStorage.setItem(cartStorageKey, JSON.stringify(payload))\r\n }\r\n }\r\n initialized.current = true\r\n return payload\r\n }\r\n return prev\r\n })\r\n }\r\n })\r\n\r\n // When mounted, send init request (only if no state from localStorage)\r\n if (!initialized.current) {\r\n mfeBridge.publish(CART_CHANNELS.INIT_REQUEST, null)\r\n }\r\n\r\n return () => {\r\n unsubAdd()\r\n unsubRemove()\r\n unsubClear()\r\n unsubUpdate()\r\n unsubInitReq()\r\n unsubInitRes()\r\n }\r\n }, [cartStorageKey, getItemId])\r\n\r\n return { items, totalItems: items.length }\r\n}\r\n\r\n/**\r\n * Hook to provide cart actions\r\n * This hook will:\r\n * - Only perform actions, not manage state\r\n * - Use mfeEventBridge to communicate with other microFEs\r\n * - Provide add, remove, clear, and update actions\r\n */\r\nexport function useMfeCartActions<O = any, T extends ICartItem<O> = ICartItem<O>>() {\r\n // Add item to cart\r\n const addToCart = useCallback((item: T) => {\r\n mfeBridge.publish(CART_CHANNELS.ADD, item)\r\n }, [])\r\n\r\n // Remove item from cart\r\n const removeFromCart = useCallback((id: string) => {\r\n mfeBridge.publish(CART_CHANNELS.REMOVE, { id })\r\n }, [])\r\n\r\n // Clear cart\r\n const clearCart = useCallback(() => {\r\n mfeBridge.publish(CART_CHANNELS.CLEAR, null)\r\n }, [])\r\n\r\n // Update entire cart\r\n const updateCart = useCallback((items: T[]) => {\r\n mfeBridge.publish(CART_CHANNELS.UPDATE, items)\r\n }, [])\r\n\r\n return {\r\n addToCart,\r\n removeFromCart,\r\n clearCart,\r\n updateCart\r\n }\r\n}\r\n"],"names":["useMfeCartStore","configs","cartStorageKey","useMemo","storageKey","getItemId","idGetter","item","ProductId","_useState","useState","_useState2","_slicedToArray","items","setItems","initialized","useRef","useEffect","isBrowser","storedItems","localStorage","getItem","parsedItems","JSON","parse","Array","isArray","current","e","console","error","unsubAdd","mfeBridge","subscribe","CART_CHANNELS","ADD","payload","prev","newItems","itemId","existingIndex","findIndex","_toConsumableArray","concat","stringify","setItem","unsubRemove","REMOVE","filter","id","unsubClear","CLEAR","removeItem","unsubUpdate","UPDATE","unsubInitReq","INIT_REQUEST","currentItems","length","publish","INIT_RESPONSE","unsubInitRes","totalItems","useMfeCartActions","addToCart","useCallback","removeFromCart","clearCart","updateCart"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"cart.js","sources":["../../src/mfe-shared/cart.tsx"],"sourcesContent":["/**\r\n * cart.tsx - Shared shopping cart system for micro-frontends\r\n *\r\n * This module provides hooks for managing a shared shopping cart across\r\n * multiple micro-frontends. The cart state is synchronized using the\r\n * mfeBridge communication system and persisted in localStorage.\r\n */\r\n\r\nimport { useEffect, useState, useRef, useCallback, useMemo } from 'react'\r\nimport { mfeBridge } from './mfe-bridge'\r\nimport { isBrowser } from './environment'\r\nimport { CART_CHANNELS } from './cart.types'\r\n\r\n/** LocalStorage key for persisting cart items */\r\nconst CART_STORAGE_KEY = 'mfe_cart_items'\r\n\r\nexport interface IMfeCartStoreConfigs<T = any> {\r\n storageKey?: string\r\n idGetter: (item: T) => string\r\n}\r\n\r\n/**\r\n * Hook to manage cart state across microFE\r\n * This hook will:\r\n * - Initialize cart from localStorage\r\n * - Listen for cart events (add, remove, clear, update)\r\n * - Provide current cart state\r\n */\r\nexport function useMfeCartStore<T = any>(configs: IMfeCartStoreConfigs<T>) {\r\n // Use provided storage key or default to CART_STORAGE_KEY\r\n const cartStorageKey = useMemo(() => configs?.storageKey || CART_STORAGE_KEY, [configs?.storageKey])\r\n\r\n // Default idGetter uses ProductId, but can be customized\r\n const getItemId = useMemo(() => configs.idGetter, [configs?.idGetter])\r\n\r\n // State to hold cart items\r\n const [items, setItems] = useState<T[]>([])\r\n\r\n // Mark as initialized\r\n const initialized = useRef(false)\r\n\r\n useEffect(() => {\r\n // Skip localStorage operations in non-browser environments\r\n if (!isBrowser()) {\r\n return\r\n }\r\n\r\n // Restore from localStorage if available\r\n const storedItems = localStorage.getItem(cartStorageKey)\r\n if (storedItems) {\r\n try {\r\n const parsedItems = JSON.parse(storedItems)\r\n if (Array.isArray(parsedItems)) {\r\n setItems(parsedItems)\r\n initialized.current = true\r\n }\r\n } catch (e) {\r\n console.error('Failed to parse cart from localStorage:', e)\r\n }\r\n }\r\n\r\n // Subscribe to cart events\r\n const unsubAdd = mfeBridge.subscribe(CART_CHANNELS.ADD, (payload: T) => {\r\n setItems((prev) => {\r\n const itemId = getItemId(payload)\r\n const existingIndex = prev.findIndex((item) => getItemId(item) === itemId)\r\n\r\n let newItems: T[]\r\n if (existingIndex >= 0) {\r\n // Update existing item\r\n newItems = [...prev]\r\n newItems[existingIndex] = payload\r\n } else {\r\n // Add new item\r\n newItems = [...prev, payload]\r\n }\r\n\r\n if (JSON.stringify(newItems) !== JSON.stringify(prev)) {\r\n // Save to localStorage only if value changed\r\n if (isBrowser()) {\r\n const current = localStorage.getItem(cartStorageKey)\r\n if (JSON.stringify(newItems) !== current) {\r\n localStorage.setItem(cartStorageKey, JSON.stringify(newItems))\r\n }\r\n }\r\n // Notify state change\r\n mfeBridge.publish(CART_CHANNELS.STATE_CHANGE, newItems)\r\n return newItems\r\n }\r\n return prev\r\n })\r\n })\r\n\r\n const unsubRemove = mfeBridge.subscribe(CART_CHANNELS.REMOVE, (payload: { id: string }) => {\r\n setItems((prev) => {\r\n const newItems = prev.filter((item) => getItemId(item) !== payload.id)\r\n if (JSON.stringify(newItems) !== JSON.stringify(prev)) {\r\n // Save to localStorage only if value changed\r\n if (isBrowser()) {\r\n const current = localStorage.getItem(cartStorageKey)\r\n if (JSON.stringify(newItems) !== current) {\r\n localStorage.setItem(cartStorageKey, JSON.stringify(newItems))\r\n }\r\n }\r\n // Notify state change\r\n mfeBridge.publish(CART_CHANNELS.STATE_CHANGE, newItems)\r\n return newItems\r\n }\r\n return prev\r\n })\r\n })\r\n\r\n const unsubClear = mfeBridge.subscribe(CART_CHANNELS.CLEAR, () => {\r\n setItems([])\r\n if (isBrowser()) {\r\n localStorage.removeItem(cartStorageKey)\r\n }\r\n // Notify state change\r\n mfeBridge.publish(CART_CHANNELS.STATE_CHANGE, [])\r\n })\r\n\r\n const unsubUpdate = mfeBridge.subscribe(CART_CHANNELS.UPDATE, (payload: T[]) => {\r\n setItems((prev) => {\r\n if (JSON.stringify(payload) !== JSON.stringify(prev)) {\r\n // Save to localStorage only if value changed\r\n if (isBrowser()) {\r\n const current = localStorage.getItem(cartStorageKey)\r\n if (JSON.stringify(payload) !== current) {\r\n localStorage.setItem(cartStorageKey, JSON.stringify(payload))\r\n }\r\n }\r\n // Notify state change\r\n mfeBridge.publish(CART_CHANNELS.STATE_CHANGE, payload)\r\n return payload\r\n }\r\n return prev\r\n })\r\n })\r\n\r\n // Subscribe to init requests from other microFEs\r\n const unsubInitReq = mfeBridge.subscribe(CART_CHANNELS.INIT_REQUEST, () => {\r\n // Use callback to get current state to avoid stale closure\r\n setItems((currentItems) => {\r\n if (currentItems.length > 0) {\r\n mfeBridge.publish(CART_CHANNELS.INIT_RESPONSE, currentItems)\r\n }\r\n return currentItems // No change to state\r\n })\r\n })\r\n\r\n // Subscribe to init responses if state is not available\r\n const unsubInitRes = mfeBridge.subscribe(CART_CHANNELS.INIT_RESPONSE, (payload: T[]) => {\r\n if (!initialized.current && payload && payload.length > 0) {\r\n setItems((prev) => {\r\n if (JSON.stringify(payload) !== JSON.stringify(prev)) {\r\n // Save to localStorage only if value changed\r\n if (isBrowser()) {\r\n const current = localStorage.getItem(cartStorageKey)\r\n if (JSON.stringify(payload) !== current) {\r\n localStorage.setItem(cartStorageKey, JSON.stringify(payload))\r\n }\r\n }\r\n initialized.current = true\r\n // Notify state change\r\n mfeBridge.publish(CART_CHANNELS.STATE_CHANGE, payload)\r\n return payload\r\n }\r\n return prev\r\n })\r\n }\r\n })\r\n\r\n // When mounted, send init request (only if no state from localStorage)\r\n if (!initialized.current) {\r\n mfeBridge.publish(CART_CHANNELS.INIT_REQUEST, null)\r\n }\r\n\r\n return () => {\r\n unsubAdd()\r\n unsubRemove()\r\n unsubClear()\r\n unsubUpdate()\r\n unsubInitReq()\r\n unsubInitRes()\r\n }\r\n }, [cartStorageKey, getItemId])\r\n\r\n return { items, totalItems: items.length }\r\n}\r\n\r\n/**\r\n * Simple hook to read cart data without configuration\r\n * Use this when you only need to display cart data and don't need to manage state\r\n * This hook synchronizes with the main cart store through STATE_CHANGE events\r\n */\r\nexport function useMfeCartData<T = any>(storageKey?: string) {\r\n const [items, setItems] = useState<T[]>([])\r\n const cartStorageKey = storageKey || CART_STORAGE_KEY\r\n\r\n useEffect(() => {\r\n // Skip localStorage operations in non-browser environments\r\n if (!isBrowser()) {\r\n return\r\n }\r\n\r\n // Load initial data from localStorage\r\n const storedItems = localStorage.getItem(cartStorageKey)\r\n if (storedItems) {\r\n try {\r\n const parsedItems = JSON.parse(storedItems)\r\n if (Array.isArray(parsedItems)) {\r\n setItems(parsedItems)\r\n }\r\n } catch (e) {\r\n console.error('Failed to parse cart from localStorage:', e)\r\n }\r\n }\r\n\r\n // Simply listen to STATE_CHANGE events from the main store\r\n const unsubStateChange = mfeBridge.subscribe(CART_CHANNELS.STATE_CHANGE, (payload: T[]) => {\r\n setItems(payload || [])\r\n })\r\n\r\n return () => {\r\n unsubStateChange()\r\n }\r\n }, [cartStorageKey])\r\n\r\n return { items, totalItems: items.length }\r\n}\r\n\r\n/**\r\n * Hook to provide cart actions\r\n * This hook will:\r\n * - Only perform actions, not manage state\r\n * - Use mfeEventBridge to communicate with other microFEs\r\n * - Provide add, remove, clear, and update actions\r\n */\r\nexport function useMfeCartActions<T = any>() {\r\n // Add item to cart\r\n const addToCart = useCallback((item: T) => {\r\n mfeBridge.publish(CART_CHANNELS.ADD, item)\r\n }, [])\r\n\r\n // Remove item from cart\r\n const removeFromCart = useCallback((id: string) => {\r\n mfeBridge.publish(CART_CHANNELS.REMOVE, { id })\r\n }, [])\r\n\r\n // Clear cart\r\n const clearCart = useCallback(() => {\r\n mfeBridge.publish(CART_CHANNELS.CLEAR, null)\r\n }, [])\r\n\r\n // Update entire cart\r\n const updateCart = useCallback((items: T[]) => {\r\n mfeBridge.publish(CART_CHANNELS.UPDATE, items)\r\n }, [])\r\n\r\n return {\r\n addToCart,\r\n removeFromCart,\r\n clearCart,\r\n updateCart\r\n }\r\n}\r\n"],"names":["CART_STORAGE_KEY","useMfeCartStore","configs","cartStorageKey","useMemo","storageKey","getItemId","idGetter","_useState","useState","_useState2","_slicedToArray","items","setItems","initialized","useRef","useEffect","isBrowser","storedItems","localStorage","getItem","parsedItems","JSON","parse","Array","isArray","current","e","console","error","unsubAdd","mfeBridge","subscribe","CART_CHANNELS","ADD","payload","prev","newItems","itemId","existingIndex","findIndex","item","_toConsumableArray","concat","stringify","setItem","publish","STATE_CHANGE","unsubRemove","REMOVE","filter","id","unsubClear","CLEAR","removeItem","unsubUpdate","UPDATE","unsubInitReq","INIT_REQUEST","currentItems","length","INIT_RESPONSE","unsubInitRes","totalItems","useMfeCartData","_useState3","_useState4","unsubStateChange","useMfeCartActions","addToCart","useCallback","removeFromCart","clearCart","updateCart"],"mappings":"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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{slicedToArray as r}from"../_virtual/_rollupPluginBabelHelpers.js";import{jsx as t,Fragment as
|
|
1
|
+
import{slicedToArray as r}from"../_virtual/_rollupPluginBabelHelpers.js";import{jsx as t,Fragment as i}from"react/jsx-runtime";import{useState as e,useEffect as a}from"react";import{useMfeCartStore as o,useMfeCartActions as l}from"./cart.js";import{HydrationGuard as n}from"./hydration-helper.js";function m(m){var c=m.children,p=m.initialCartItems,s=void 0===p?[]:p,d=m.cartConfig;o(d).items;var f=l().updateCart,u=e(!1),h=r(u,2),v=h[0],j=h[1];return a((function(){!v&&s.length>0&&(f(s),j(!0))}),[v,s,f]),t(n,{serverFallback:t(i,{children:c}),hydrationDelay:100,children:c})}export{m as SsrCartProvider};
|
|
2
2
|
//# sourceMappingURL=cart.ssr.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cart.ssr.js","sources":["../../src/mfe-shared/cart.ssr.tsx"],"sourcesContent":["import React, { useState, useEffect } from 'react'\r\nimport {
|
|
1
|
+
{"version":3,"file":"cart.ssr.js","sources":["../../src/mfe-shared/cart.ssr.tsx"],"sourcesContent":["import React, { useState, useEffect } from 'react'\r\nimport { useMfeCartActions, useMfeCartStore, IMfeCartStoreConfigs } from './cart'\r\nimport { HydrationGuard } from './hydration-helper'\r\n\r\n/**\r\n * Props for the SSR-compatible cart provider\r\n */\r\ninterface ISsrCartProviderProps<T = any> {\r\n /** Content to render */\r\n children: React.ReactNode\r\n /** Initial cart items for SSR */\r\n initialCartItems?: T[]\r\n /** Should hydrate cart from browser storage after rendering */\r\n hydrateFromStorage?: boolean\r\n /** Cart store configuration */\r\n cartConfig: IMfeCartStoreConfigs<T>\r\n}\r\n\r\n/**\r\n * Factory function to create SSR Cart Provider with specific type and config\r\n */\r\nexport function createSsrCartProvider<T = any>(cartConfig: IMfeCartStoreConfigs<T>) {\r\n return ({ children, initialCartItems = [], hydrateFromStorage = true }: Omit<ISsrCartProviderProps<T>, 'cartConfig'>) => {\r\n const { items } = useMfeCartStore<T>(cartConfig)\r\n const { updateCart } = useMfeCartActions<T>()\r\n const [isInitialized, setIsInitialized] = useState(false)\r\n\r\n // Initialize cart with provided items on first render\r\n useEffect(() => {\r\n if (!isInitialized && initialCartItems.length > 0) {\r\n updateCart(initialCartItems)\r\n setIsInitialized(true)\r\n }\r\n }, [isInitialized, initialCartItems, updateCart])\r\n\r\n return (\r\n <HydrationGuard serverFallback={<>{children}</>} hydrationDelay={100}>\r\n {children}\r\n </HydrationGuard>\r\n )\r\n }\r\n}\r\n\r\n/**\r\n * Generic SSR Cart Provider (requires cartConfig prop)\r\n */\r\nexport function SsrCartProvider<T = any>({ children, initialCartItems = [], cartConfig }: ISsrCartProviderProps<T>) {\r\n const { items } = useMfeCartStore<T>(cartConfig)\r\n const { updateCart } = useMfeCartActions<T>()\r\n const [isInitialized, setIsInitialized] = useState(false)\r\n\r\n // Initialize cart with provided items on first render\r\n useEffect(() => {\r\n if (!isInitialized && initialCartItems.length > 0) {\r\n updateCart(initialCartItems)\r\n setIsInitialized(true)\r\n }\r\n }, [isInitialized, initialCartItems, updateCart])\r\n\r\n return (\r\n <HydrationGuard serverFallback={<>{children}</>} hydrationDelay={100}>\r\n {children}\r\n </HydrationGuard>\r\n )\r\n}\r\n\r\n/**\r\n * CartItemsComponent - SSR-aware cart items display component\r\n */\r\ninterface ICartItemsComponentProps<T = any> {\r\n /** Function to render each cart item */\r\n renderItem: (item: T) => React.ReactNode\r\n /** Optional empty cart placeholder */\r\n emptyCart?: React.ReactNode\r\n /** Initial cart items for SSR */\r\n initialCartItems?: T[]\r\n /** Cart store configuration */\r\n cartConfig: IMfeCartStoreConfigs<T>\r\n}\r\n\r\n/**\r\n * Factory function to create CartItemsComponent with specific type and config\r\n */\r\nexport function createCartItemsComponent<T = any>(cartConfig: IMfeCartStoreConfigs<T>) {\r\n return ({ renderItem, emptyCart, initialCartItems = [] }: Omit<ICartItemsComponentProps<T>, 'cartConfig'>) => {\r\n const { items } = useMfeCartStore<T>(cartConfig)\r\n\r\n return (\r\n <HydrationGuard\r\n serverFallback={\r\n <>\r\n {initialCartItems.length === 0 && emptyCart}\r\n {initialCartItems.map(renderItem)}\r\n </>\r\n }\r\n >\r\n {items.length === 0 && emptyCart}\r\n {items.map(renderItem)}\r\n </HydrationGuard>\r\n )\r\n }\r\n}\r\n\r\n/**\r\n * Generic CartItemsComponent (requires cartConfig prop)\r\n */\r\nexport function CartItemsComponent<T = any>({ renderItem, emptyCart, initialCartItems = [], cartConfig }: ICartItemsComponentProps<T>) {\r\n const { items } = useMfeCartStore<T>(cartConfig)\r\n\r\n return (\r\n <HydrationGuard\r\n serverFallback={\r\n <>\r\n {initialCartItems.length === 0 && emptyCart}\r\n {initialCartItems.map(renderItem)}\r\n </>\r\n }\r\n >\r\n {items.length === 0 && emptyCart}\r\n {items.map(renderItem)}\r\n </HydrationGuard>\r\n )\r\n}\r\n"],"names":["SsrCartProvider","_ref2","children","_ref2$initialCartItem","initialCartItems","cartConfig","useMfeCartStore","items","updateCart","useMfeCartActions","_useState3","useState","_useState4","_slicedToArray","isInitialized","setIsInitialized","useEffect","length","_jsx","HydrationGuard","serverFallback","_Fragment","hydrationDelay"],"mappings":"ySA8CM,SAAUA,EAAeC,GAAmF,IAAvEC,EAAQD,EAARC,SAAQC,EAAAF,EAAEG,iBAAAA,OAAmB,IAAHD,EAAG,GAAEA,EAAEE,EAAUJ,EAAVI,WACxDC,EAAmBD,GAA7BE,MACR,IAAQC,EAAeC,IAAfD,WACRE,EAA0CC,GAAS,GAAMC,EAAAC,EAAAH,EAAA,GAAlDI,EAAaF,EAAA,GAAEG,EAAgBH,EAAA,GAUtC,OAPAI,GAAU,YACHF,GAAiBV,EAAiBa,OAAS,IAC9CT,EAAWJ,GACXW,GAAiB,GAEpB,GAAE,CAACD,EAAeV,EAAkBI,IAGnCU,EAACC,EAAe,CAAAC,eAAgBF,EAAGG,EAAA,CAAAnB,SAAAA,IAAcoB,eAAgB,aAC9DpB,GAGP"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
var e={ADD:"mfe:cart:add",REMOVE:"mfe:cart:remove",CLEAR:"mfe:cart:clear",INIT_REQUEST:"mfe:cart:init_request",INIT_RESPONSE:"mfe:cart:init_response",UPDATE:"mfe:cart:update"};export{e as CART_CHANNELS};
|
|
1
|
+
var e={ADD:"mfe:cart:add",REMOVE:"mfe:cart:remove",CLEAR:"mfe:cart:clear",INIT_REQUEST:"mfe:cart:init_request",INIT_RESPONSE:"mfe:cart:init_response",UPDATE:"mfe:cart:update",STATE_CHANGE:"mfe:cart:state_change"};export{e as CART_CHANNELS};
|
|
2
2
|
//# sourceMappingURL=cart.types.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cart.types.js","sources":["../../src/mfe-shared/cart.types.ts"],"sourcesContent":["
|
|
1
|
+
{"version":3,"file":"cart.types.js","sources":["../../src/mfe-shared/cart.types.ts"],"sourcesContent":["/** Communication channels for cart operations */\r\nexport const CART_CHANNELS = {\r\n /** Add an item to the cart */\r\n ADD: 'mfe:cart:add',\r\n /** Remove an item from the cart */\r\n REMOVE: 'mfe:cart:remove',\r\n /** Clear all items from the cart */\r\n CLEAR: 'mfe:cart:clear',\r\n /** Request initial cart data (when a new MFE loads) */\r\n INIT_REQUEST: 'mfe:cart:init_request',\r\n /** Response with cart data (to initialize a new MFE) */\r\n INIT_RESPONSE: 'mfe:cart:init_response',\r\n /** Update the entire cart at once */\r\n UPDATE: 'mfe:cart:update',\r\n /** Notify all subscribers when cart state changes */\r\n STATE_CHANGE: 'mfe:cart:state_change'\r\n} as const\r\n"],"names":["CART_CHANNELS","ADD","REMOVE","CLEAR","INIT_REQUEST","INIT_RESPONSE","UPDATE","STATE_CHANGE"],"mappings":"AACO,IAAMA,EAAgB,CAE3BC,IAAK,eAELC,OAAQ,kBAERC,MAAO,iBAEPC,aAAc,wBAEdC,cAAe,yBAEfC,OAAQ,kBAERC,aAAc"}
|
package/dist/mfe-shared/index.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export{mfeBridge}from"./mfe-bridge.js";export{MfeAuthProvider,useMfeAuth}from"./auth.js";export{AUTH_CHANNELS}from"./auth.types.js";export{SsrAuthProvider}from"./auth.ssr.js";export{useMfeCartActions,useMfeCartStore}from"./cart.js";export{CART_CHANNELS}from"./cart.types.js";export{SsrCartProvider}from"./cart.ssr.js";export{MfeLink,MfeNavigateProvider,NAVIGATION_CHANNELS,useMfeNavigate}from"./navigation.js";export{isBrowser}from"./environment.js";export{HydrationGuard,useHydration}from"./hydration-helper.js";export{MfeAuthDebugPanel}from"./auth.debug.js";export{MfeCartDebugPanel}from"./cart.debug.js";export{MfeNavigateDebugPanel}from"./navigation.debug.js";
|
|
1
|
+
export{mfeBridge}from"./mfe-bridge.js";export{MfeAuthProvider,useMfeAuth}from"./auth.js";export{AUTH_CHANNELS}from"./auth.types.js";export{SsrAuthProvider}from"./auth.ssr.js";export{useMfeCartActions,useMfeCartData,useMfeCartStore}from"./cart.js";export{CART_CHANNELS}from"./cart.types.js";export{SsrCartProvider}from"./cart.ssr.js";export{MfeLink,MfeNavigateProvider,NAVIGATION_CHANNELS,useMfeNavigate}from"./navigation.js";export{isBrowser}from"./environment.js";export{HydrationGuard,useHydration}from"./hydration-helper.js";export{MfeAuthDebugPanel}from"./auth.debug.js";export{MfeCartDebugPanel}from"./cart.debug.js";export{MfeNavigateDebugPanel}from"./navigation.debug.js";
|
|
2
2
|
//# sourceMappingURL=index.js.map
|
|
@@ -5,10 +5,9 @@
|
|
|
5
5
|
* multiple micro-frontends. The cart state is synchronized using the
|
|
6
6
|
* mfeBridge communication system and persisted in localStorage.
|
|
7
7
|
*/
|
|
8
|
-
import { ICartItem } from './cart.types';
|
|
9
8
|
export interface IMfeCartStoreConfigs<T = any> {
|
|
10
|
-
storageKey
|
|
11
|
-
idGetter
|
|
9
|
+
storageKey?: string;
|
|
10
|
+
idGetter: (item: T) => string;
|
|
12
11
|
}
|
|
13
12
|
/**
|
|
14
13
|
* Hook to manage cart state across microFE
|
|
@@ -17,7 +16,16 @@ export interface IMfeCartStoreConfigs<T = any> {
|
|
|
17
16
|
* - Listen for cart events (add, remove, clear, update)
|
|
18
17
|
* - Provide current cart state
|
|
19
18
|
*/
|
|
20
|
-
export declare function useMfeCartStore<
|
|
19
|
+
export declare function useMfeCartStore<T = any>(configs: IMfeCartStoreConfigs<T>): {
|
|
20
|
+
items: T[];
|
|
21
|
+
totalItems: number;
|
|
22
|
+
};
|
|
23
|
+
/**
|
|
24
|
+
* Simple hook to read cart data without configuration
|
|
25
|
+
* Use this when you only need to display cart data and don't need to manage state
|
|
26
|
+
* This hook synchronizes with the main cart store through STATE_CHANGE events
|
|
27
|
+
*/
|
|
28
|
+
export declare function useMfeCartData<T = any>(storageKey?: string): {
|
|
21
29
|
items: T[];
|
|
22
30
|
totalItems: number;
|
|
23
31
|
};
|
|
@@ -28,7 +36,7 @@ export declare function useMfeCartStore<O = any, T extends ICartItem<O> = ICartI
|
|
|
28
36
|
* - Use mfeEventBridge to communicate with other microFEs
|
|
29
37
|
* - Provide add, remove, clear, and update actions
|
|
30
38
|
*/
|
|
31
|
-
export declare function useMfeCartActions<
|
|
39
|
+
export declare function useMfeCartActions<T = any>(): {
|
|
32
40
|
addToCart: (item: T) => void;
|
|
33
41
|
removeFromCart: (id: string) => void;
|
|
34
42
|
clearCart: () => void;
|
|
@@ -1,39 +1,45 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
|
-
import {
|
|
2
|
+
import { IMfeCartStoreConfigs } from './cart';
|
|
3
3
|
/**
|
|
4
4
|
* Props for the SSR-compatible cart provider
|
|
5
5
|
*/
|
|
6
|
-
interface ISsrCartProviderProps {
|
|
6
|
+
interface ISsrCartProviderProps<T = any> {
|
|
7
7
|
/** Content to render */
|
|
8
8
|
children: React.ReactNode;
|
|
9
9
|
/** Initial cart items for SSR */
|
|
10
|
-
initialCartItems?:
|
|
10
|
+
initialCartItems?: T[];
|
|
11
11
|
/** Should hydrate cart from browser storage after rendering */
|
|
12
12
|
hydrateFromStorage?: boolean;
|
|
13
|
+
/** Cart store configuration */
|
|
14
|
+
cartConfig: IMfeCartStoreConfigs<T>;
|
|
13
15
|
}
|
|
14
16
|
/**
|
|
15
|
-
* Cart
|
|
16
|
-
*
|
|
17
|
-
* This component allows providing initial cart data during server-side rendering
|
|
18
|
-
* and then hydrating from localStorage or other storage once client-side.
|
|
17
|
+
* Factory function to create SSR Cart Provider with specific type and config
|
|
19
18
|
*/
|
|
20
|
-
export declare
|
|
19
|
+
export declare function createSsrCartProvider<T = any>(cartConfig: IMfeCartStoreConfigs<T>): ({ children, initialCartItems, hydrateFromStorage }: Omit<ISsrCartProviderProps<T>, 'cartConfig'>) => import("react/jsx-runtime").JSX.Element;
|
|
20
|
+
/**
|
|
21
|
+
* Generic SSR Cart Provider (requires cartConfig prop)
|
|
22
|
+
*/
|
|
23
|
+
export declare function SsrCartProvider<T = any>({ children, initialCartItems, cartConfig }: ISsrCartProviderProps<T>): import("react/jsx-runtime").JSX.Element;
|
|
21
24
|
/**
|
|
22
25
|
* CartItemsComponent - SSR-aware cart items display component
|
|
23
26
|
*/
|
|
24
|
-
interface ICartItemsComponentProps {
|
|
27
|
+
interface ICartItemsComponentProps<T = any> {
|
|
25
28
|
/** Function to render each cart item */
|
|
26
|
-
renderItem: (item:
|
|
29
|
+
renderItem: (item: T) => React.ReactNode;
|
|
27
30
|
/** Optional empty cart placeholder */
|
|
28
31
|
emptyCart?: React.ReactNode;
|
|
29
32
|
/** Initial cart items for SSR */
|
|
30
|
-
initialCartItems?:
|
|
33
|
+
initialCartItems?: T[];
|
|
34
|
+
/** Cart store configuration */
|
|
35
|
+
cartConfig: IMfeCartStoreConfigs<T>;
|
|
31
36
|
}
|
|
32
37
|
/**
|
|
33
|
-
*
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
38
|
+
* Factory function to create CartItemsComponent with specific type and config
|
|
39
|
+
*/
|
|
40
|
+
export declare function createCartItemsComponent<T = any>(cartConfig: IMfeCartStoreConfigs<T>): ({ renderItem, emptyCart, initialCartItems }: Omit<ICartItemsComponentProps<T>, 'cartConfig'>) => import("react/jsx-runtime").JSX.Element;
|
|
41
|
+
/**
|
|
42
|
+
* Generic CartItemsComponent (requires cartConfig prop)
|
|
37
43
|
*/
|
|
38
|
-
export declare
|
|
44
|
+
export declare function CartItemsComponent<T = any>({ renderItem, emptyCart, initialCartItems, cartConfig }: ICartItemsComponentProps<T>): import("react/jsx-runtime").JSX.Element;
|
|
39
45
|
export {};
|
|
@@ -1,19 +1,3 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* cart.types.ts - Type definitions for the shopping cart system
|
|
3
|
-
*/
|
|
4
|
-
export type CartItemType = 'Media' | 'Audio';
|
|
5
|
-
/**
|
|
6
|
-
* Shopping cart item structure
|
|
7
|
-
*/
|
|
8
|
-
export interface ICartItem<O = any> {
|
|
9
|
-
ProductId: string;
|
|
10
|
-
PricePackageId: string;
|
|
11
|
-
Amount: number;
|
|
12
|
-
SocialUrl?: string;
|
|
13
|
-
Type?: CartItemType;
|
|
14
|
-
ProductName?: string;
|
|
15
|
-
Options?: O;
|
|
16
|
-
}
|
|
17
1
|
/** Communication channels for cart operations */
|
|
18
2
|
export declare const CART_CHANNELS: {
|
|
19
3
|
/** Add an item to the cart */
|
|
@@ -28,4 +12,6 @@ export declare const CART_CHANNELS: {
|
|
|
28
12
|
readonly INIT_RESPONSE: "mfe:cart:init_response";
|
|
29
13
|
/** Update the entire cart at once */
|
|
30
14
|
readonly UPDATE: "mfe:cart:update";
|
|
15
|
+
/** Notify all subscribers when cart state changes */
|
|
16
|
+
readonly STATE_CHANGE: "mfe:cart:state_change";
|
|
31
17
|
};
|
|
@@ -11,8 +11,7 @@ export { useMfeAuth } from './auth';
|
|
|
11
11
|
export type { IAuthState, IUser } from './auth.types';
|
|
12
12
|
export { AUTH_CHANNELS } from './auth.types';
|
|
13
13
|
export { SsrAuthProvider } from './auth.ssr';
|
|
14
|
-
export { useMfeCartStore, useMfeCartActions } from './cart';
|
|
15
|
-
export type { ICartItem } from './cart.types';
|
|
14
|
+
export { useMfeCartStore, useMfeCartActions, useMfeCartData } from './cart';
|
|
16
15
|
export { CART_CHANNELS } from './cart.types';
|
|
17
16
|
export { SsrCartProvider } from './cart.ssr';
|
|
18
17
|
export { useMfeNavigate, MfeLink, MfeNavigateProvider } from './navigation';
|