dinocollab-core 2.0.6 → 2.0.8

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.
@@ -1,2 +1,2 @@
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 c}from"./cart.types.js";function l(a){var l=i((function(){return(null==a?void 0:a.storageKey)||"mfe_cart_items"}),[null==a?void 0:a.storageKey]),f=e([]),g=r(f,2),m=g[0],S=g[1],b=n(!1);return o((function(){if(s()){var r=localStorage.getItem(l);if(r)try{var i=JSON.parse(r);Array.isArray(i)&&(S(i),b.current=!0)}catch(r){console.error("Failed to parse cart from localStorage:",r)}var e=u.subscribe(c.ADD,(function(r){S((function(i){var e=[].concat(t(i),[r]);if(JSON.stringify(e)!==JSON.stringify(i)){if(s()){var n=localStorage.getItem(l);JSON.stringify(e)!==n&&localStorage.setItem(l,JSON.stringify(e))}return e}return i}))})),n=u.subscribe(c.REMOVE,(function(r){S((function(t){var i=t.filter((function(t){return t.ProductId!==r.id}));if(JSON.stringify(i)!==JSON.stringify(t)){if(s()){var e=localStorage.getItem(l);JSON.stringify(i)!==e&&localStorage.setItem(l,JSON.stringify(i))}return i}return t}))})),o=u.subscribe(c.CLEAR,(function(){S([]),s()&&localStorage.removeItem(l)})),a=u.subscribe(c.UPDATE,(function(r){S((function(t){if(JSON.stringify(r)!==JSON.stringify(t)){if(s()){var i=localStorage.getItem(l);JSON.stringify(r)!==i&&localStorage.setItem(l,JSON.stringify(r))}return r}return t}))})),f=u.subscribe(c.INIT_REQUEST,(function(){m.length>0&&u.publish(c.INIT_RESPONSE,m)})),g=u.subscribe(c.INIT_RESPONSE,(function(r){!b.current&&r&&r.length>0&&(S(r),s()&&localStorage.setItem(l,JSON.stringify(r)),b.current=!0)}));return b.current||u.publish(c.INIT_REQUEST,null),function(){e(),n(),o(),a(),f(),g()}}}),[]),{items:m,totalItems:m.length}}function f(){return{addToCart:a((function(r){u.publish(c.ADD,r)}),[]),removeFromCart:a((function(r){u.publish(c.REMOVE,{id:r})}),[]),clearCart:a((function(){u.publish(c.CLEAR,null)}),[]),updateCart:a((function(r){u.publish(c.UPDATE,r)}),[])}}export{f as useMfeCartActions,l as useMfeCartStore};
1
+ import{slicedToArray as r,toConsumableArray as t}from"../_virtual/_rollupPluginBabelHelpers.js";import{useMemo as i,useState as n,useRef as e,useEffect as o,useCallback as u}from"react";import{mfeBridge as a}from"./mfe-bridge.js";import{isBrowser as f}from"./environment.js";import{CART_CHANNELS as s}from"./cart.types.js";function c(u){var c=i((function(){return(null==u?void 0:u.storageKey)||"mfe_cart_items"}),[null==u?void 0:u.storageKey]),l=i((function(){return u.idGetter}),[null==u?void 0:u.idGetter]),g=n([]),S=r(g,2),m=S[0],y=S[1],N=e(!1);return o((function(){if(f()){var r=localStorage.getItem(c);if(r)try{var i=JSON.parse(r);Array.isArray(i)&&(y(i),N.current=!0)}catch(r){console.error("Failed to parse cart from localStorage:",r)}var n=a.subscribe(s.ADD,(function(r){y((function(i){var n,e=l(r),o=i.findIndex((function(r){return l(r)===e}));if(o>=0?(n=t(i))[o]=r:n=[].concat(t(i),[r]),JSON.stringify(n)!==JSON.stringify(i)){if(f()){var u=localStorage.getItem(c);JSON.stringify(n)!==u&&localStorage.setItem(c,JSON.stringify(n))}return n}return i}))})),e=a.subscribe(s.REMOVE,(function(r){y((function(t){var i=t.filter((function(t){return l(t)!==r.id}));if(JSON.stringify(i)!==JSON.stringify(t)){if(f()){var n=localStorage.getItem(c);JSON.stringify(i)!==n&&localStorage.setItem(c,JSON.stringify(i))}return i}return t}))})),o=a.subscribe(s.CLEAR,(function(){y([]),f()&&localStorage.removeItem(c)})),u=a.subscribe(s.UPDATE,(function(r){y((function(t){if(JSON.stringify(r)!==JSON.stringify(t)){if(f()){var i=localStorage.getItem(c);JSON.stringify(r)!==i&&localStorage.setItem(c,JSON.stringify(r))}return r}return t}))})),g=a.subscribe(s.INIT_REQUEST,(function(){y((function(r){return r.length>0&&a.publish(s.INIT_RESPONSE,r),r}))})),S=a.subscribe(s.INIT_RESPONSE,(function(r){!N.current&&r&&r.length>0&&y((function(t){if(JSON.stringify(r)!==JSON.stringify(t)){if(f()){var i=localStorage.getItem(c);JSON.stringify(r)!==i&&localStorage.setItem(c,JSON.stringify(r))}return N.current=!0,r}return t}))}));return N.current||a.publish(s.INIT_REQUEST,null),function(){n(),e(),o(),u(),g(),S()}}}),[c,l]),{items:m,totalItems:m.length}}function l(){return{addToCart:u((function(r){a.publish(s.ADD,r)}),[]),removeFromCart:u((function(r){a.publish(s.REMOVE,{id:r})}),[]),clearCart:u((function(){a.publish(s.CLEAR,null)}),[]),updateCart:u((function(r){a.publish(s.UPDATE,r)}),[])}}export{l as useMfeCartActions,c 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 {\r\n storageKey: 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) {\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 // 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 newItems = [...prev, payload]\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) => item.ProductId !== 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 // If state is already available, return it to other microFEs\r\n if (items.length > 0) {\r\n mfeBridge.publish(CART_CHANNELS.INIT_RESPONSE, items)\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(payload)\r\n if (isBrowser()) {\r\n localStorage.setItem(cartStorageKey, JSON.stringify(payload))\r\n }\r\n initialized.current = true\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 }, [])\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((productId: string) => {\r\n mfeBridge.publish(CART_CHANNELS.REMOVE, { id: productId })\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","_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","concat","_toConsumableArray","stringify","setItem","unsubRemove","REMOVE","filter","item","ProductId","id","unsubClear","CLEAR","removeItem","unsubUpdate","UPDATE","unsubInitReq","INIT_REQUEST","length","publish","INIT_RESPONSE","unsubInitRes","totalItems","useMfeCartActions","addToCart","useCallback","removeFromCart","productId","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 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<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":["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","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,2 +1,2 @@
1
- import{slicedToArray as r}from"../_virtual/_rollupPluginBabelHelpers.js";import{jsx as t,Fragment as e}from"react/jsx-runtime";import{useState as a,useEffect as i}from"react";import{useMfeCartStore as o,useMfeCartActions as l}from"./cart.js";import{HydrationGuard as m}from"./hydration-helper.js";var n=function(n){var c=n.children,p=n.initialCartItems,s=void 0===p?[]:p;n.hydrateFromStorage,o().items;var d=l().updateCart,h=a(!1),u=r(h,2),f=u[0],v=u[1];return i((function(){!f&&s.length>0&&(d(s),v(!0))}),[f,s,d]),t(m,{serverFallback:t(e,{children:c}),hydrationDelay:100,children:c})};export{n as SsrCartProvider};
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 { ICartItem, useMfeCartActions, useMfeCartStore } 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 {\r\n /** Content to render */\r\n children: React.ReactNode\r\n /** Initial cart items for SSR */\r\n initialCartItems?: ICartItem[]\r\n /** Should hydrate cart from browser storage after rendering */\r\n hydrateFromStorage?: boolean\r\n}\r\n\r\n/**\r\n * Cart provider component that supports SSR\r\n * \r\n * This component allows providing initial cart data during server-side rendering\r\n * and then hydrating from localStorage or other storage once client-side.\r\n */\r\nexport const SsrCartProvider: React.FC<ISsrCartProviderProps> = ({\r\n children,\r\n initialCartItems = [],\r\n hydrateFromStorage = true\r\n}) => {\r\n const { items } = useMfeCartStore()\r\n const { updateCart } = useMfeCartActions()\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\r\n serverFallback={<>{children}</>}\r\n hydrationDelay={100}\r\n >\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 {\r\n /** Function to render each cart item */\r\n renderItem: (item: ICartItem) => React.ReactNode\r\n /** Optional empty cart placeholder */\r\n emptyCart?: React.ReactNode\r\n /** Initial cart items for SSR */\r\n initialCartItems?: ICartItem[]\r\n}\r\n\r\n/**\r\n * SSR-compatible cart items component\r\n * \r\n * This component handles both server-side rendering with initial data\r\n * and client-side hydration from the cart store.\r\n */\r\nexport const CartItemsComponent: React.FC<ICartItemsComponentProps> = ({\r\n renderItem,\r\n emptyCart,\r\n initialCartItems = []\r\n}) => {\r\n const { items } = useMfeCartStore()\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","_ref","children","_ref$initialCartItems","initialCartItems","hydrateFromStorage","useMfeCartStore","items","updateCart","useMfeCartActions","_useState","useState","_useState2","_slicedToArray","isInitialized","setIsInitialized","useEffect","length","_jsx","HydrationGuard","serverFallback","_Fragment","hydrationDelay"],"mappings":"6SAsBaA,EAAmD,SAApCC,GAIvB,IAHHC,EAAQD,EAARC,SAAQC,EAAAF,EACRG,iBAAAA,OAAmB,IAAHD,EAAG,GAAEA,EAAAF,EACrBI,mBAEkBC,IAAVC,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,EACC,CAAAC,eAAgBF,EAAGG,EAAA,CAAAnB,SAAAA,IACnBoB,eAAgB,aAEfpB,GAGP"}
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 +1 @@
1
- {"version":3,"file":"cart.types.js","sources":["../../src/mfe-shared/cart.types.ts"],"sourcesContent":["/**\r\n * cart.types.ts - Type definitions for the shopping cart system\r\n */\r\n\r\nexport type CartItemType = 'Media' | 'Audio'\r\n\r\n/**\r\n * Shopping cart item structure\r\n */\r\nexport interface ICartItem<O = any> {\r\n ProductId: string\r\n PricePackageId: string\r\n Amount: number\r\n SocialUrl?: string\r\n Type?: CartItemType\r\n ProductName?: string\r\n Options?: O\r\n}\r\n\r\n/** 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} as const\r\n"],"names":["CART_CHANNELS","ADD","REMOVE","CLEAR","INIT_REQUEST","INIT_RESPONSE","UPDATE"],"mappings":"AAoBO,IAAMA,EAAgB,CAE3BC,IAAK,eAELC,OAAQ,kBAERC,MAAO,iBAEPC,aAAc,wBAEdC,cAAe,yBAEfC,OAAQ"}
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} as const\r\n"],"names":["CART_CHANNELS","ADD","REMOVE","CLEAR","INIT_REQUEST","INIT_RESPONSE","UPDATE"],"mappings":"AACO,IAAMA,EAAgB,CAE3BC,IAAK,eAELC,OAAQ,kBAERC,MAAO,iBAEPC,aAAc,wBAEdC,cAAe,yBAEfC,OAAQ"}
@@ -5,9 +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
- export interface IMfeCartStoreConfigs {
10
- storageKey: string;
8
+ export interface IMfeCartStoreConfigs<T = any> {
9
+ storageKey?: string;
10
+ idGetter: (item: T) => string;
11
11
  }
12
12
  /**
13
13
  * Hook to manage cart state across microFE
@@ -16,7 +16,7 @@ export interface IMfeCartStoreConfigs {
16
16
  * - Listen for cart events (add, remove, clear, update)
17
17
  * - Provide current cart state
18
18
  */
19
- export declare function useMfeCartStore<O = any, T extends ICartItem<O> = ICartItem<O>>(configs?: IMfeCartStoreConfigs): {
19
+ export declare function useMfeCartStore<T = any>(configs: IMfeCartStoreConfigs<T>): {
20
20
  items: T[];
21
21
  totalItems: number;
22
22
  };
@@ -27,9 +27,9 @@ export declare function useMfeCartStore<O = any, T extends ICartItem<O> = ICartI
27
27
  * - Use mfeEventBridge to communicate with other microFEs
28
28
  * - Provide add, remove, clear, and update actions
29
29
  */
30
- export declare function useMfeCartActions<O = any, T extends ICartItem<O> = ICartItem<O>>(): {
30
+ export declare function useMfeCartActions<T = any>(): {
31
31
  addToCart: (item: T) => void;
32
- removeFromCart: (productId: string) => void;
32
+ removeFromCart: (id: string) => void;
33
33
  clearCart: () => void;
34
34
  updateCart: (items: T[]) => void;
35
35
  };
@@ -1,39 +1,45 @@
1
1
  import React from 'react';
2
- import { ICartItem } from './cart';
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?: ICartItem[];
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 provider component that supports SSR
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 const SsrCartProvider: React.FC<ISsrCartProviderProps>;
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: ICartItem) => React.ReactNode;
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?: ICartItem[];
33
+ initialCartItems?: T[];
34
+ /** Cart store configuration */
35
+ cartConfig: IMfeCartStoreConfigs<T>;
31
36
  }
32
37
  /**
33
- * SSR-compatible cart items component
34
- *
35
- * This component handles both server-side rendering with initial data
36
- * and client-side hydration from the cart store.
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 const CartItemsComponent: React.FC<ICartItemsComponentProps>;
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 */
@@ -12,7 +12,6 @@ export type { IAuthState, IUser } from './auth.types';
12
12
  export { AUTH_CHANNELS } from './auth.types';
13
13
  export { SsrAuthProvider } from './auth.ssr';
14
14
  export { useMfeCartStore, useMfeCartActions } from './cart';
15
- export type { ICartItem } from './cart.types';
16
15
  export { CART_CHANNELS } from './cart.types';
17
16
  export { SsrCartProvider } from './cart.ssr';
18
17
  export { useMfeNavigate, MfeLink, MfeNavigateProvider } from './navigation';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "dinocollab-core",
3
- "version": "2.0.6",
3
+ "version": "2.0.8",
4
4
  "description": "",
5
5
  "main": "dist/index.js",
6
6
  "module": "dist/index.js",