@payloadcms/next 3.0.0-beta.79 → 3.0.0-beta.81

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 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/elements/LeaveWithoutSaving/index.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAiC,MAAM,OAAO,CAAA;AAErD,OAAO,cAAc,CAAA;AA+CrB,eAAO,MAAM,kBAAkB,EAAE,KAAK,CAAC,EAyBtC,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/elements/LeaveWithoutSaving/index.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAiC,MAAM,OAAO,CAAA;AAErD,OAAO,cAAc,CAAA;AA+CrB,eAAO,MAAM,kBAAkB,EAAE,KAAK,CAAC,EA8BtC,CAAA"}
@@ -61,6 +61,7 @@ const Component = ({ isActive, onCancel, onConfirm })=>{
61
61
  });
62
62
  };
63
63
  export const LeaveWithoutSaving = ()=>{
64
+ const { closeModal } = useModal();
64
65
  const modified = useFormModified();
65
66
  const { user } = useAuth();
66
67
  const [show, setShow] = React.useState(false);
@@ -69,8 +70,14 @@ export const LeaveWithoutSaving = ()=>{
69
70
  const onPrevent = useCallback(()=>{
70
71
  setShow(true);
71
72
  }, []);
73
+ const handleAccept = useCallback(()=>{
74
+ closeModal(modalSlug);
75
+ }, [
76
+ closeModal
77
+ ]);
72
78
  usePreventLeave({
73
79
  hasAccepted,
80
+ onAccept: handleAccept,
74
81
  onPrevent,
75
82
  prevent
76
83
  });
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/elements/LeaveWithoutSaving/index.tsx"],"sourcesContent":["'use client'\nimport { Button, Modal, useAuth, useFormModified, useModal, useTranslation } from '@payloadcms/ui'\nimport React, { useCallback, useEffect } from 'react'\n\nimport './index.scss'\nimport { usePreventLeave } from './usePreventLeave.js'\n\nconst modalSlug = 'leave-without-saving'\n\nconst baseClass = 'leave-without-saving'\n\nconst Component: React.FC<{\n isActive: boolean\n onCancel: () => void\n onConfirm: () => void\n}> = ({ isActive, onCancel, onConfirm }) => {\n const { closeModal, modalState, openModal } = useModal()\n const { t } = useTranslation()\n\n // Manually check for modal state as 'esc' key will not trigger the nav inactivity\n // useEffect(() => {\n // if (!modalState?.[modalSlug]?.isOpen && isActive) {\n // onCancel()\n // }\n // }, [modalState, isActive, onCancel])\n\n useEffect(() => {\n if (isActive) openModal(modalSlug)\n else closeModal(modalSlug)\n }, [isActive, openModal, closeModal])\n\n return (\n <Modal className={baseClass} onClose={onCancel} slug={modalSlug}>\n <div className={`${baseClass}__wrapper`}>\n <div className={`${baseClass}__content`}>\n <h1>{t('general:leaveWithoutSaving')}</h1>\n <p>{t('general:changesNotSaved')}</p>\n </div>\n <div className={`${baseClass}__controls`}>\n <Button buttonStyle=\"secondary\" onClick={onCancel} size=\"large\">\n {t('general:stayOnThisPage')}\n </Button>\n <Button onClick={onConfirm} size=\"large\">\n {t('general:leaveAnyway')}\n </Button>\n </div>\n </div>\n </Modal>\n )\n}\n\nexport const LeaveWithoutSaving: React.FC = () => {\n const modified = useFormModified()\n const { user } = useAuth()\n const [show, setShow] = React.useState(false)\n const [hasAccepted, setHasAccepted] = React.useState(false)\n\n const prevent = Boolean(modified && user)\n\n const onPrevent = useCallback(() => {\n setShow(true)\n }, [])\n\n usePreventLeave({ hasAccepted, onPrevent, prevent })\n\n return (\n <Component\n isActive={show}\n onCancel={() => {\n setShow(false)\n }}\n onConfirm={() => {\n setHasAccepted(true)\n }}\n />\n )\n}\n"],"names":["Button","Modal","useAuth","useFormModified","useModal","useTranslation","React","useCallback","useEffect","usePreventLeave","modalSlug","baseClass","Component","isActive","onCancel","onConfirm","closeModal","modalState","openModal","t","className","onClose","slug","div","h1","p","buttonStyle","onClick","size","LeaveWithoutSaving","modified","user","show","setShow","useState","hasAccepted","setHasAccepted","prevent","Boolean","onPrevent"],"mappings":"AAAA;;AACA,SAASA,MAAM,EAAEC,KAAK,EAAEC,OAAO,EAAEC,eAAe,EAAEC,QAAQ,EAAEC,cAAc,QAAQ,iBAAgB;AAClG,OAAOC,SAASC,WAAW,EAAEC,SAAS,QAAQ,QAAO;AAGrD,SAASC,eAAe,QAAQ,uBAAsB;AAEtD,MAAMC,YAAY;AAElB,MAAMC,YAAY;AAElB,MAAMC,YAID,CAAC,EAAEC,QAAQ,EAAEC,QAAQ,EAAEC,SAAS,EAAE;IACrC,MAAM,EAAEC,UAAU,EAAEC,UAAU,EAAEC,SAAS,EAAE,GAAGd;IAC9C,MAAM,EAAEe,CAAC,EAAE,GAAGd;IAEd,kFAAkF;IAClF,oBAAoB;IACpB,wDAAwD;IACxD,iBAAiB;IACjB,MAAM;IACN,uCAAuC;IAEvCG,UAAU;QACR,IAAIK,UAAUK,UAAUR;aACnBM,WAAWN;IAClB,GAAG;QAACG;QAAUK;QAAWF;KAAW;IAEpC,qBACE,KAACf;QAAMmB,WAAWT;QAAWU,SAASP;QAAUQ,MAAMZ;kBACpD,cAAA,MAACa;YAAIH,WAAW,CAAC,EAAET,UAAU,SAAS,CAAC;;8BACrC,MAACY;oBAAIH,WAAW,CAAC,EAAET,UAAU,SAAS,CAAC;;sCACrC,KAACa;sCAAIL,EAAE;;sCACP,KAACM;sCAAGN,EAAE;;;;8BAER,MAACI;oBAAIH,WAAW,CAAC,EAAET,UAAU,UAAU,CAAC;;sCACtC,KAACX;4BAAO0B,aAAY;4BAAYC,SAASb;4BAAUc,MAAK;sCACrDT,EAAE;;sCAEL,KAACnB;4BAAO2B,SAASZ;4BAAWa,MAAK;sCAC9BT,EAAE;;;;;;;AAMf;AAEA,OAAO,MAAMU,qBAA+B;IAC1C,MAAMC,WAAW3B;IACjB,MAAM,EAAE4B,IAAI,EAAE,GAAG7B;IACjB,MAAM,CAAC8B,MAAMC,QAAQ,GAAG3B,MAAM4B,QAAQ,CAAC;IACvC,MAAM,CAACC,aAAaC,eAAe,GAAG9B,MAAM4B,QAAQ,CAAC;IAErD,MAAMG,UAAUC,QAAQR,YAAYC;IAEpC,MAAMQ,YAAYhC,YAAY;QAC5B0B,QAAQ;IACV,GAAG,EAAE;IAELxB,gBAAgB;QAAE0B;QAAaI;QAAWF;IAAQ;IAElD,qBACE,KAACzB;QACCC,UAAUmB;QACVlB,UAAU;YACRmB,QAAQ;QACV;QACAlB,WAAW;YACTqB,eAAe;QACjB;;AAGN,EAAC"}
1
+ {"version":3,"sources":["../../../src/elements/LeaveWithoutSaving/index.tsx"],"sourcesContent":["'use client'\nimport { Button, Modal, useAuth, useFormModified, useModal, useTranslation } from '@payloadcms/ui'\nimport React, { useCallback, useEffect } from 'react'\n\nimport './index.scss'\nimport { usePreventLeave } from './usePreventLeave.js'\n\nconst modalSlug = 'leave-without-saving'\n\nconst baseClass = 'leave-without-saving'\n\nconst Component: React.FC<{\n isActive: boolean\n onCancel: () => void\n onConfirm: () => void\n}> = ({ isActive, onCancel, onConfirm }) => {\n const { closeModal, modalState, openModal } = useModal()\n const { t } = useTranslation()\n\n // Manually check for modal state as 'esc' key will not trigger the nav inactivity\n // useEffect(() => {\n // if (!modalState?.[modalSlug]?.isOpen && isActive) {\n // onCancel()\n // }\n // }, [modalState, isActive, onCancel])\n\n useEffect(() => {\n if (isActive) openModal(modalSlug)\n else closeModal(modalSlug)\n }, [isActive, openModal, closeModal])\n\n return (\n <Modal className={baseClass} onClose={onCancel} slug={modalSlug}>\n <div className={`${baseClass}__wrapper`}>\n <div className={`${baseClass}__content`}>\n <h1>{t('general:leaveWithoutSaving')}</h1>\n <p>{t('general:changesNotSaved')}</p>\n </div>\n <div className={`${baseClass}__controls`}>\n <Button buttonStyle=\"secondary\" onClick={onCancel} size=\"large\">\n {t('general:stayOnThisPage')}\n </Button>\n <Button onClick={onConfirm} size=\"large\">\n {t('general:leaveAnyway')}\n </Button>\n </div>\n </div>\n </Modal>\n )\n}\n\nexport const LeaveWithoutSaving: React.FC = () => {\n const { closeModal } = useModal()\n const modified = useFormModified()\n const { user } = useAuth()\n const [show, setShow] = React.useState(false)\n const [hasAccepted, setHasAccepted] = React.useState(false)\n\n const prevent = Boolean(modified && user)\n\n const onPrevent = useCallback(() => {\n setShow(true)\n }, [])\n\n const handleAccept = useCallback(() => {\n closeModal(modalSlug)\n }, [closeModal])\n\n usePreventLeave({ hasAccepted, onAccept: handleAccept, onPrevent, prevent })\n\n return (\n <Component\n isActive={show}\n onCancel={() => {\n setShow(false)\n }}\n onConfirm={() => {\n setHasAccepted(true)\n }}\n />\n )\n}\n"],"names":["Button","Modal","useAuth","useFormModified","useModal","useTranslation","React","useCallback","useEffect","usePreventLeave","modalSlug","baseClass","Component","isActive","onCancel","onConfirm","closeModal","modalState","openModal","t","className","onClose","slug","div","h1","p","buttonStyle","onClick","size","LeaveWithoutSaving","modified","user","show","setShow","useState","hasAccepted","setHasAccepted","prevent","Boolean","onPrevent","handleAccept","onAccept"],"mappings":"AAAA;;AACA,SAASA,MAAM,EAAEC,KAAK,EAAEC,OAAO,EAAEC,eAAe,EAAEC,QAAQ,EAAEC,cAAc,QAAQ,iBAAgB;AAClG,OAAOC,SAASC,WAAW,EAAEC,SAAS,QAAQ,QAAO;AAGrD,SAASC,eAAe,QAAQ,uBAAsB;AAEtD,MAAMC,YAAY;AAElB,MAAMC,YAAY;AAElB,MAAMC,YAID,CAAC,EAAEC,QAAQ,EAAEC,QAAQ,EAAEC,SAAS,EAAE;IACrC,MAAM,EAAEC,UAAU,EAAEC,UAAU,EAAEC,SAAS,EAAE,GAAGd;IAC9C,MAAM,EAAEe,CAAC,EAAE,GAAGd;IAEd,kFAAkF;IAClF,oBAAoB;IACpB,wDAAwD;IACxD,iBAAiB;IACjB,MAAM;IACN,uCAAuC;IAEvCG,UAAU;QACR,IAAIK,UAAUK,UAAUR;aACnBM,WAAWN;IAClB,GAAG;QAACG;QAAUK;QAAWF;KAAW;IAEpC,qBACE,KAACf;QAAMmB,WAAWT;QAAWU,SAASP;QAAUQ,MAAMZ;kBACpD,cAAA,MAACa;YAAIH,WAAW,CAAC,EAAET,UAAU,SAAS,CAAC;;8BACrC,MAACY;oBAAIH,WAAW,CAAC,EAAET,UAAU,SAAS,CAAC;;sCACrC,KAACa;sCAAIL,EAAE;;sCACP,KAACM;sCAAGN,EAAE;;;;8BAER,MAACI;oBAAIH,WAAW,CAAC,EAAET,UAAU,UAAU,CAAC;;sCACtC,KAACX;4BAAO0B,aAAY;4BAAYC,SAASb;4BAAUc,MAAK;sCACrDT,EAAE;;sCAEL,KAACnB;4BAAO2B,SAASZ;4BAAWa,MAAK;sCAC9BT,EAAE;;;;;;;AAMf;AAEA,OAAO,MAAMU,qBAA+B;IAC1C,MAAM,EAAEb,UAAU,EAAE,GAAGZ;IACvB,MAAM0B,WAAW3B;IACjB,MAAM,EAAE4B,IAAI,EAAE,GAAG7B;IACjB,MAAM,CAAC8B,MAAMC,QAAQ,GAAG3B,MAAM4B,QAAQ,CAAC;IACvC,MAAM,CAACC,aAAaC,eAAe,GAAG9B,MAAM4B,QAAQ,CAAC;IAErD,MAAMG,UAAUC,QAAQR,YAAYC;IAEpC,MAAMQ,YAAYhC,YAAY;QAC5B0B,QAAQ;IACV,GAAG,EAAE;IAEL,MAAMO,eAAejC,YAAY;QAC/BS,WAAWN;IACb,GAAG;QAACM;KAAW;IAEfP,gBAAgB;QAAE0B;QAAaM,UAAUD;QAAcD;QAAWF;IAAQ;IAE1E,qBACE,KAACzB;QACCC,UAAUmB;QACVlB,UAAU;YACRmB,QAAQ;QACV;QACAlB,WAAW;YACTqB,eAAe;QACjB;;AAGN,EAAC"}
@@ -1,7 +1,8 @@
1
1
  export declare const useBeforeUnload: (enabled?: (() => boolean) | boolean, message?: string) => void;
2
- export declare const usePreventLeave: ({ hasAccepted, message, onPrevent, prevent, }: {
2
+ export declare const usePreventLeave: ({ hasAccepted, message, onAccept, onPrevent, prevent, }: {
3
3
  hasAccepted: boolean;
4
4
  message?: string;
5
+ onAccept?: () => void;
5
6
  onPrevent?: () => void;
6
7
  prevent: boolean;
7
8
  }) => void;
@@ -1 +1 @@
1
- {"version":3,"file":"usePreventLeave.d.ts","sourceRoot":"","sources":["../../../src/elements/LeaveWithoutSaving/usePreventLeave.tsx"],"names":[],"mappings":"AAyBA,eAAO,MAAM,eAAe,aAAa,CAAC,MAAM,OAAO,CAAC,GAAG,OAAO,YAAmB,MAAM,SA6B1F,CAAA;AAED,eAAO,MAAM,eAAe,kDAKzB;IACD,WAAW,EAAE,OAAO,CAAA;IAEpB,OAAO,CAAC,EAAE,MAAM,CAAA;IAEhB,SAAS,CAAC,EAAE,MAAM,IAAI,CAAA;IACtB,OAAO,EAAE,OAAO,CAAA;CACjB,SA+EA,CAAA"}
1
+ {"version":3,"file":"usePreventLeave.d.ts","sourceRoot":"","sources":["../../../src/elements/LeaveWithoutSaving/usePreventLeave.tsx"],"names":[],"mappings":"AAyBA,eAAO,MAAM,eAAe,aAAa,CAAC,MAAM,OAAO,CAAC,GAAG,OAAO,YAAmB,MAAM,SA6B1F,CAAA;AAED,eAAO,MAAM,eAAe,4DAMzB;IACD,WAAW,EAAE,OAAO,CAAA;IAEpB,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAA;IAErB,SAAS,CAAC,EAAE,MAAM,IAAI,CAAA;IACtB,OAAO,EAAE,OAAO,CAAA;CACjB,SAgFA,CAAA"}
@@ -40,7 +40,7 @@ export const useBeforeUnload = (enabled = true, message)=>{
40
40
  handler
41
41
  ]);
42
42
  };
43
- export const usePreventLeave = ({ hasAccepted = false, message = 'Are you sure want to leave this page?', onPrevent, prevent = true })=>{
43
+ export const usePreventLeave = ({ hasAccepted = false, message = 'Are you sure want to leave this page?', onAccept, onPrevent, prevent = true })=>{
44
44
  // check when page is about to be reloaded
45
45
  useBeforeUnload(prevent, message);
46
46
  const router = useRouter();
@@ -103,10 +103,12 @@ export const usePreventLeave = ({ hasAccepted = false, message = 'Are you sure w
103
103
  ]);
104
104
  useEffect(()=>{
105
105
  if (hasAccepted && cancelledURL.current) {
106
+ if (onAccept) onAccept();
106
107
  router.push(cancelledURL.current);
107
108
  }
108
109
  }, [
109
110
  hasAccepted,
111
+ onAccept,
110
112
  router
111
113
  ]);
112
114
  };
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/elements/LeaveWithoutSaving/usePreventLeave.tsx"],"sourcesContent":["// Credit: @Taiki92777\n// - Source: https://github.com/vercel/next.js/discussions/32231#discussioncomment-7284386\n// Credit: `react-use` maintainers\n// - Source: https://github.com/streamich/react-use/blob/ade8d3905f544305515d010737b4ae604cc51024/src/useBeforeUnload.ts#L2\nimport { useRouter } from 'next/navigation.js'\nimport { useCallback, useEffect, useRef } from 'react'\n\nfunction on<T extends Document | EventTarget | HTMLElement | Window>(\n obj: T | null,\n ...args: [string, Function | null, ...any] | Parameters<T['addEventListener']>\n): void {\n if (obj && obj.addEventListener) {\n obj.addEventListener(...(args as Parameters<HTMLElement['addEventListener']>))\n }\n}\n\nfunction off<T extends Document | EventTarget | HTMLElement | Window>(\n obj: T | null,\n ...args: [string, Function | null, ...any] | Parameters<T['removeEventListener']>\n): void {\n if (obj && obj.removeEventListener) {\n obj.removeEventListener(...(args as Parameters<HTMLElement['removeEventListener']>))\n }\n}\n\nexport const useBeforeUnload = (enabled: (() => boolean) | boolean = true, message?: string) => {\n const handler = useCallback(\n (event: BeforeUnloadEvent) => {\n const finalEnabled = typeof enabled === 'function' ? enabled() : true\n\n if (!finalEnabled) {\n return\n }\n\n event.preventDefault()\n\n if (message) {\n event.returnValue = message\n }\n\n return message\n },\n [enabled, message],\n )\n\n useEffect(() => {\n if (!enabled) {\n return\n }\n\n on(window, 'beforeunload', handler)\n\n return () => off(window, 'beforeunload', handler)\n }, [enabled, handler])\n}\n\nexport const usePreventLeave = ({\n hasAccepted = false,\n message = 'Are you sure want to leave this page?',\n onPrevent,\n prevent = true,\n}: {\n hasAccepted: boolean\n // if no `onPrevent` is provided, the message will be displayed in a confirm dialog\n message?: string\n // to use a custom confirmation dialog, provide a function that returns a boolean\n onPrevent?: () => void\n prevent: boolean\n}) => {\n // check when page is about to be reloaded\n useBeforeUnload(prevent, message)\n\n const router = useRouter()\n const cancelledURL = useRef<string>('')\n\n // check when page is about to be changed\n useEffect(() => {\n function isAnchorOfCurrentUrl(currentUrl: string, newUrl: string) {\n const currentUrlObj = new URL(currentUrl)\n const newUrlObj = new URL(newUrl)\n // Compare hostname, pathname, and search parameters\n if (\n currentUrlObj.hostname === newUrlObj.hostname &&\n currentUrlObj.pathname === newUrlObj.pathname &&\n currentUrlObj.search === newUrlObj.search\n ) {\n // Check if the new URL is just an anchor of the current URL page\n const currentHash = currentUrlObj.hash\n const newHash = newUrlObj.hash\n return (\n currentHash !== newHash &&\n currentUrlObj.href.replace(currentHash, '') === newUrlObj.href.replace(newHash, '')\n )\n }\n return false\n }\n\n function findClosestAnchor(element: HTMLElement | null): HTMLAnchorElement | null {\n while (element && element.tagName.toLowerCase() !== 'a') {\n element = element.parentElement\n }\n return element as HTMLAnchorElement\n }\n function handleClick(event: MouseEvent) {\n try {\n const target = event.target as HTMLElement\n const anchor = findClosestAnchor(target)\n if (anchor) {\n const currentUrl = window.location.href\n const newUrl = anchor.href\n const isAnchor = isAnchorOfCurrentUrl(currentUrl, newUrl)\n const isDownloadLink = anchor.download !== ''\n\n const isPageLeaving = !(newUrl === currentUrl || isAnchor || isDownloadLink)\n\n if (isPageLeaving && prevent && (!onPrevent ? !window.confirm(message) : true)) {\n // Keep a reference of the href\n cancelledURL.current = newUrl\n\n // Cancel the route change\n event.preventDefault()\n event.stopPropagation()\n\n if (typeof onPrevent === 'function') {\n onPrevent()\n }\n }\n }\n } catch (err) {\n alert(err)\n }\n }\n\n // Add the global click event listener\n document.addEventListener('click', handleClick, true)\n\n // Clean up the global click event listener when the component is unmounted\n return () => {\n document.removeEventListener('click', handleClick, true)\n }\n }, [onPrevent, prevent, message])\n\n useEffect(() => {\n if (hasAccepted && cancelledURL.current) {\n router.push(cancelledURL.current)\n }\n }, [hasAccepted, router])\n}\n"],"names":["useRouter","useCallback","useEffect","useRef","on","obj","args","addEventListener","off","removeEventListener","useBeforeUnload","enabled","message","handler","event","finalEnabled","preventDefault","returnValue","window","usePreventLeave","hasAccepted","onPrevent","prevent","router","cancelledURL","isAnchorOfCurrentUrl","currentUrl","newUrl","currentUrlObj","URL","newUrlObj","hostname","pathname","search","currentHash","hash","newHash","href","replace","findClosestAnchor","element","tagName","toLowerCase","parentElement","handleClick","target","anchor","location","isAnchor","isDownloadLink","download","isPageLeaving","confirm","current","stopPropagation","err","alert","document","push"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../src/elements/LeaveWithoutSaving/usePreventLeave.tsx"],"sourcesContent":["// Credit: @Taiki92777\n// - Source: https://github.com/vercel/next.js/discussions/32231#discussioncomment-7284386\n// Credit: `react-use` maintainers\n// - Source: https://github.com/streamich/react-use/blob/ade8d3905f544305515d010737b4ae604cc51024/src/useBeforeUnload.ts#L2\nimport { useRouter } from 'next/navigation.js'\nimport { useCallback, useEffect, useRef } from 'react'\n\nfunction on<T extends Document | EventTarget | HTMLElement | Window>(\n obj: T | null,\n ...args: [string, Function | null, ...any] | Parameters<T['addEventListener']>\n): void {\n if (obj && obj.addEventListener) {\n obj.addEventListener(...(args as Parameters<HTMLElement['addEventListener']>))\n }\n}\n\nfunction off<T extends Document | EventTarget | HTMLElement | Window>(\n obj: T | null,\n ...args: [string, Function | null, ...any] | Parameters<T['removeEventListener']>\n): void {\n if (obj && obj.removeEventListener) {\n obj.removeEventListener(...(args as Parameters<HTMLElement['removeEventListener']>))\n }\n}\n\nexport const useBeforeUnload = (enabled: (() => boolean) | boolean = true, message?: string) => {\n const handler = useCallback(\n (event: BeforeUnloadEvent) => {\n const finalEnabled = typeof enabled === 'function' ? enabled() : true\n\n if (!finalEnabled) {\n return\n }\n\n event.preventDefault()\n\n if (message) {\n event.returnValue = message\n }\n\n return message\n },\n [enabled, message],\n )\n\n useEffect(() => {\n if (!enabled) {\n return\n }\n\n on(window, 'beforeunload', handler)\n\n return () => off(window, 'beforeunload', handler)\n }, [enabled, handler])\n}\n\nexport const usePreventLeave = ({\n hasAccepted = false,\n message = 'Are you sure want to leave this page?',\n onAccept,\n onPrevent,\n prevent = true,\n}: {\n hasAccepted: boolean\n // if no `onPrevent` is provided, the message will be displayed in a confirm dialog\n message?: string\n onAccept?: () => void\n // to use a custom confirmation dialog, provide a function that returns a boolean\n onPrevent?: () => void\n prevent: boolean\n}) => {\n // check when page is about to be reloaded\n useBeforeUnload(prevent, message)\n\n const router = useRouter()\n const cancelledURL = useRef<string>('')\n\n // check when page is about to be changed\n useEffect(() => {\n function isAnchorOfCurrentUrl(currentUrl: string, newUrl: string) {\n const currentUrlObj = new URL(currentUrl)\n const newUrlObj = new URL(newUrl)\n // Compare hostname, pathname, and search parameters\n if (\n currentUrlObj.hostname === newUrlObj.hostname &&\n currentUrlObj.pathname === newUrlObj.pathname &&\n currentUrlObj.search === newUrlObj.search\n ) {\n // Check if the new URL is just an anchor of the current URL page\n const currentHash = currentUrlObj.hash\n const newHash = newUrlObj.hash\n return (\n currentHash !== newHash &&\n currentUrlObj.href.replace(currentHash, '') === newUrlObj.href.replace(newHash, '')\n )\n }\n return false\n }\n\n function findClosestAnchor(element: HTMLElement | null): HTMLAnchorElement | null {\n while (element && element.tagName.toLowerCase() !== 'a') {\n element = element.parentElement\n }\n return element as HTMLAnchorElement\n }\n function handleClick(event: MouseEvent) {\n try {\n const target = event.target as HTMLElement\n const anchor = findClosestAnchor(target)\n if (anchor) {\n const currentUrl = window.location.href\n const newUrl = anchor.href\n const isAnchor = isAnchorOfCurrentUrl(currentUrl, newUrl)\n const isDownloadLink = anchor.download !== ''\n\n const isPageLeaving = !(newUrl === currentUrl || isAnchor || isDownloadLink)\n\n if (isPageLeaving && prevent && (!onPrevent ? !window.confirm(message) : true)) {\n // Keep a reference of the href\n cancelledURL.current = newUrl\n\n // Cancel the route change\n event.preventDefault()\n event.stopPropagation()\n\n if (typeof onPrevent === 'function') {\n onPrevent()\n }\n }\n }\n } catch (err) {\n alert(err)\n }\n }\n\n // Add the global click event listener\n document.addEventListener('click', handleClick, true)\n\n // Clean up the global click event listener when the component is unmounted\n return () => {\n document.removeEventListener('click', handleClick, true)\n }\n }, [onPrevent, prevent, message])\n\n useEffect(() => {\n if (hasAccepted && cancelledURL.current) {\n if (onAccept) onAccept()\n router.push(cancelledURL.current)\n }\n }, [hasAccepted, onAccept, router])\n}\n"],"names":["useRouter","useCallback","useEffect","useRef","on","obj","args","addEventListener","off","removeEventListener","useBeforeUnload","enabled","message","handler","event","finalEnabled","preventDefault","returnValue","window","usePreventLeave","hasAccepted","onAccept","onPrevent","prevent","router","cancelledURL","isAnchorOfCurrentUrl","currentUrl","newUrl","currentUrlObj","URL","newUrlObj","hostname","pathname","search","currentHash","hash","newHash","href","replace","findClosestAnchor","element","tagName","toLowerCase","parentElement","handleClick","target","anchor","location","isAnchor","isDownloadLink","download","isPageLeaving","confirm","current","stopPropagation","err","alert","document","push"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/elements/Nav/NavWrapper/index.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,MAAM,OAAO,CAAA;AAEzB,OAAO,cAAc,CAAA;AAErB,eAAO,MAAM,UAAU,EAAE,KAAK,CAAC,EAAE,CAAC;IAChC,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAA;CAC1B,CAYA,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/elements/Nav/NavWrapper/index.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,MAAM,OAAO,CAAA;AAEzB,OAAO,cAAc,CAAA;AAErB,eAAO,MAAM,UAAU,EAAE,KAAK,CAAC,EAAE,CAAC;IAChC,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAA;CAC1B,CAqBA,CAAA"}
@@ -4,11 +4,13 @@ import { useNav } from '@payloadcms/ui';
4
4
  import React from 'react';
5
5
  export const NavWrapper = (props)=>{
6
6
  const { baseClass, children } = props;
7
- const { navOpen, navRef } = useNav();
7
+ const { hydrated, navOpen, navRef, shouldAnimate } = useNav();
8
8
  return /*#__PURE__*/ _jsx("aside", {
9
9
  className: [
10
10
  baseClass,
11
- navOpen && `${baseClass}--nav-open`
11
+ navOpen && `${baseClass}--nav-open`,
12
+ shouldAnimate && `${baseClass}--nav-animate`,
13
+ hydrated && `${baseClass}--nav-hydrated`
12
14
  ].filter(Boolean).join(' '),
13
15
  children: /*#__PURE__*/ _jsx("div", {
14
16
  className: `${baseClass}__scroll`,
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/elements/Nav/NavWrapper/index.tsx"],"sourcesContent":["'use client'\nimport { useNav } from '@payloadcms/ui'\nimport React from 'react'\n\nimport './index.scss'\n\nexport const NavWrapper: React.FC<{\n baseClass?: string\n children: React.ReactNode\n}> = (props) => {\n const { baseClass, children } = props\n\n const { navOpen, navRef } = useNav()\n\n return (\n <aside className={[baseClass, navOpen && `${baseClass}--nav-open`].filter(Boolean).join(' ')}>\n <div className={`${baseClass}__scroll`} ref={navRef}>\n {children}\n </div>\n </aside>\n )\n}\n"],"names":["useNav","React","NavWrapper","props","baseClass","children","navOpen","navRef","aside","className","filter","Boolean","join","div","ref"],"mappings":"AAAA;;AACA,SAASA,MAAM,QAAQ,iBAAgB;AACvC,OAAOC,WAAW,QAAO;AAIzB,OAAO,MAAMC,aAGR,CAACC;IACJ,MAAM,EAAEC,SAAS,EAAEC,QAAQ,EAAE,GAAGF;IAEhC,MAAM,EAAEG,OAAO,EAAEC,MAAM,EAAE,GAAGP;IAE5B,qBACE,KAACQ;QAAMC,WAAW;YAACL;YAAWE,WAAW,CAAC,EAAEF,UAAU,UAAU,CAAC;SAAC,CAACM,MAAM,CAACC,SAASC,IAAI,CAAC;kBACtF,cAAA,KAACC;YAAIJ,WAAW,CAAC,EAAEL,UAAU,QAAQ,CAAC;YAAEU,KAAKP;sBAC1CF;;;AAIT,EAAC"}
1
+ {"version":3,"sources":["../../../../src/elements/Nav/NavWrapper/index.tsx"],"sourcesContent":["'use client'\nimport { useNav } from '@payloadcms/ui'\nimport React from 'react'\n\nimport './index.scss'\n\nexport const NavWrapper: React.FC<{\n baseClass?: string\n children: React.ReactNode\n}> = (props) => {\n const { baseClass, children } = props\n\n const { hydrated, navOpen, navRef, shouldAnimate } = useNav()\n\n return (\n <aside\n className={[\n baseClass,\n navOpen && `${baseClass}--nav-open`,\n shouldAnimate && `${baseClass}--nav-animate`,\n hydrated && `${baseClass}--nav-hydrated`,\n ]\n .filter(Boolean)\n .join(' ')}\n >\n <div className={`${baseClass}__scroll`} ref={navRef}>\n {children}\n </div>\n </aside>\n )\n}\n"],"names":["useNav","React","NavWrapper","props","baseClass","children","hydrated","navOpen","navRef","shouldAnimate","aside","className","filter","Boolean","join","div","ref"],"mappings":"AAAA;;AACA,SAASA,MAAM,QAAQ,iBAAgB;AACvC,OAAOC,WAAW,QAAO;AAIzB,OAAO,MAAMC,aAGR,CAACC;IACJ,MAAM,EAAEC,SAAS,EAAEC,QAAQ,EAAE,GAAGF;IAEhC,MAAM,EAAEG,QAAQ,EAAEC,OAAO,EAAEC,MAAM,EAAEC,aAAa,EAAE,GAAGT;IAErD,qBACE,KAACU;QACCC,WAAW;YACTP;YACAG,WAAW,CAAC,EAAEH,UAAU,UAAU,CAAC;YACnCK,iBAAiB,CAAC,EAAEL,UAAU,aAAa,CAAC;YAC5CE,YAAY,CAAC,EAAEF,UAAU,cAAc,CAAC;SACzC,CACEQ,MAAM,CAACC,SACPC,IAAI,CAAC;kBAER,cAAA,KAACC;YAAIJ,WAAW,CAAC,EAAEP,UAAU,QAAQ,CAAC;YAAEY,KAAKR;sBAC1CH;;;AAIT,EAAC"}
@@ -9,7 +9,10 @@
9
9
  width: var(--nav-width);
10
10
  border-right: 1px solid var(--theme-elevation-100);
11
11
  opacity: 0;
12
- transition: opacity var(--nav-trans-time) ease-in-out;
12
+
13
+ &--nav-animate {
14
+ transition: opacity var(--nav-trans-time) ease-in-out;
15
+ }
13
16
 
14
17
  &--nav-open {
15
18
  opacity: 1;
@@ -9,9 +9,12 @@
9
9
  width: var(--nav-width);
10
10
  border-right: 1px solid var(--theme-elevation-100);
11
11
  opacity: 0;
12
- transition: opacity var(--nav-trans-time) ease-in-out;
13
12
  overflow: hidden;
14
13
 
14
+ &--nav-animate {
15
+ transition: opacity var(--nav-trans-time) ease-in-out;
16
+ }
17
+
15
18
  &--nav-open {
16
19
  opacity: 1;
17
20
  }
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/layouts/Root/index.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAkB,eAAe,EAAE,MAAM,SAAS,CAAA;AAIzE,OAAO,8BAA8B,CAAA;AAIrC,OAAO,KAAK,MAAM,OAAO,CAAA;AAQzB,eAAO,MAAM,QAAQ;;;CAGpB,CAAA;AAED,eAAO,MAAM,UAAU,oDAIpB;IACD,QAAQ,CAAC,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAA;IAClC,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC,eAAe,CAAC,CAAA;IACzC,QAAQ,CAAC,SAAS,EAAE,SAAS,CAAA;CAC9B,+BAmGA,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/layouts/Root/index.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAkB,eAAe,EAAE,MAAM,SAAS,CAAA;AAIzE,OAAO,8BAA8B,CAAA;AAIrC,OAAO,KAAK,MAAM,OAAO,CAAA;AAQzB,eAAO,MAAM,QAAQ;;;CAGpB,CAAA;AAED,eAAO,MAAM,UAAU,oDAIpB;IACD,QAAQ,CAAC,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAA;IAClC,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC,eAAe,CAAC,CAAA;IACzC,QAAQ,CAAC,SAAS,EAAE,SAAS,CAAA;CAC9B,+BAqIA,CAAA"}
@@ -77,6 +77,33 @@ export const RootLayout = async ({ children, config: configPromise, importMap })
77
77
  value: lang
78
78
  });
79
79
  }
80
+ const navPreferences = user ? (await payload.find({
81
+ collection: 'payload-preferences',
82
+ depth: 0,
83
+ limit: 1,
84
+ req,
85
+ user,
86
+ where: {
87
+ and: [
88
+ {
89
+ key: {
90
+ equals: 'nav'
91
+ }
92
+ },
93
+ {
94
+ 'user.relationTo': {
95
+ equals: user.collection
96
+ }
97
+ },
98
+ {
99
+ 'user.value': {
100
+ equals: user.id
101
+ }
102
+ }
103
+ ]
104
+ }
105
+ }))?.docs?.[0] : null;
106
+ const isNavOpen = navPreferences?.value?.open ?? true;
80
107
  return /*#__PURE__*/ _jsx("html", {
81
108
  "data-theme": theme,
82
109
  dir: dir,
@@ -87,6 +114,7 @@ export const RootLayout = async ({ children, config: configPromise, importMap })
87
114
  config: clientConfig,
88
115
  dateFNSKey: i18n.dateFNSKey,
89
116
  fallbackLang: clientConfig.i18n.fallbackLanguage,
117
+ isNavOpen: isNavOpen,
90
118
  languageCode: languageCode,
91
119
  languageOptions: languageOptions,
92
120
  permissions: permissions,
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/layouts/Root/index.tsx"],"sourcesContent":["import type { AcceptedLanguages, I18nClient } from '@payloadcms/translations'\nimport type { ImportMap, PayloadRequest, SanitizedConfig } from 'payload'\n\nimport { initI18n, rtlLanguages } from '@payloadcms/translations'\nimport { RootProvider } from '@payloadcms/ui'\nimport '@payloadcms/ui/scss/app.scss'\nimport { createClientConfig } from '@payloadcms/ui/utilities/createClientConfig'\nimport { headers as getHeaders, cookies as nextCookies } from 'next/headers.js'\nimport { createLocalReq, parseCookies } from 'payload'\nimport React from 'react'\n\nimport { getPayloadHMR } from '../../utilities/getPayloadHMR.js'\nimport { getRequestLanguage } from '../../utilities/getRequestLanguage.js'\nimport { getRequestTheme } from '../../utilities/getRequestTheme.js'\nimport { DefaultEditView } from '../../views/Edit/Default/index.js'\nimport { DefaultListView } from '../../views/List/Default/index.js'\n\nexport const metadata = {\n description: 'Generated by Next.js',\n title: 'Next.js',\n}\n\nexport const RootLayout = async ({\n children,\n config: configPromise,\n importMap,\n}: {\n readonly children: React.ReactNode\n readonly config: Promise<SanitizedConfig>\n readonly importMap: ImportMap\n}) => {\n const config = await configPromise\n\n const headers = getHeaders()\n const cookies = parseCookies(headers)\n\n const languageCode = getRequestLanguage({\n config,\n cookies,\n headers,\n })\n\n const theme = getRequestTheme({\n config,\n cookies,\n headers,\n })\n\n const payload = await getPayloadHMR({ config })\n\n const i18n: I18nClient = await initI18n({\n config: config.i18n,\n context: 'client',\n language: languageCode,\n })\n\n const req = await createLocalReq(\n {\n fallbackLocale: null,\n req: {\n headers,\n host: headers.get('host'),\n i18n,\n url: `${payload.config.serverURL}`,\n } as PayloadRequest,\n },\n payload,\n )\n const { permissions, user } = await payload.auth({ headers, req })\n\n const { clientConfig, render } = await createClientConfig({\n DefaultEditView,\n DefaultListView,\n children,\n config,\n i18n,\n importMap,\n payload,\n })\n\n const dir = (rtlLanguages as unknown as AcceptedLanguages[]).includes(languageCode)\n ? 'RTL'\n : 'LTR'\n\n const languageOptions = Object.entries(config.i18n.supportedLanguages || {}).reduce(\n (acc, [language, languageConfig]) => {\n if (Object.keys(config.i18n.supportedLanguages).includes(language)) {\n acc.push({\n label: languageConfig.translations.general.thisLanguage,\n value: language,\n })\n }\n\n return acc\n },\n [],\n )\n\n // eslint-disable-next-line @typescript-eslint/require-await\n async function switchLanguageServerAction(lang: string): Promise<void> {\n 'use server'\n nextCookies().set({\n name: `${config.cookiePrefix || 'payload'}-lng`,\n path: '/',\n value: lang,\n })\n }\n\n return (\n <html data-theme={theme} dir={dir} lang={languageCode}>\n <body>\n <RootProvider\n config={clientConfig}\n dateFNSKey={i18n.dateFNSKey}\n fallbackLang={clientConfig.i18n.fallbackLanguage}\n languageCode={languageCode}\n languageOptions={languageOptions}\n permissions={permissions}\n switchLanguageServerAction={switchLanguageServerAction}\n theme={theme}\n translations={i18n.translations}\n user={user}\n >\n {render}\n </RootProvider>\n <div id=\"portal\" />\n </body>\n </html>\n )\n}\n"],"names":["initI18n","rtlLanguages","RootProvider","createClientConfig","headers","getHeaders","cookies","nextCookies","createLocalReq","parseCookies","React","getPayloadHMR","getRequestLanguage","getRequestTheme","DefaultEditView","DefaultListView","metadata","description","title","RootLayout","children","config","configPromise","importMap","languageCode","theme","payload","i18n","context","language","req","fallbackLocale","host","get","url","serverURL","permissions","user","auth","clientConfig","render","dir","includes","languageOptions","Object","entries","supportedLanguages","reduce","acc","languageConfig","keys","push","label","translations","general","thisLanguage","value","switchLanguageServerAction","lang","set","name","cookiePrefix","path","html","data-theme","body","dateFNSKey","fallbackLang","fallbackLanguage","div","id"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../src/layouts/Root/index.tsx"],"sourcesContent":["import type { AcceptedLanguages, I18nClient } from '@payloadcms/translations'\nimport type { ImportMap, PayloadRequest, SanitizedConfig } from 'payload'\n\nimport { initI18n, rtlLanguages } from '@payloadcms/translations'\nimport { RootProvider } from '@payloadcms/ui'\nimport '@payloadcms/ui/scss/app.scss'\nimport { createClientConfig } from '@payloadcms/ui/utilities/createClientConfig'\nimport { headers as getHeaders, cookies as nextCookies } from 'next/headers.js'\nimport { createLocalReq, parseCookies } from 'payload'\nimport React from 'react'\n\nimport { getPayloadHMR } from '../../utilities/getPayloadHMR.js'\nimport { getRequestLanguage } from '../../utilities/getRequestLanguage.js'\nimport { getRequestTheme } from '../../utilities/getRequestTheme.js'\nimport { DefaultEditView } from '../../views/Edit/Default/index.js'\nimport { DefaultListView } from '../../views/List/Default/index.js'\n\nexport const metadata = {\n description: 'Generated by Next.js',\n title: 'Next.js',\n}\n\nexport const RootLayout = async ({\n children,\n config: configPromise,\n importMap,\n}: {\n readonly children: React.ReactNode\n readonly config: Promise<SanitizedConfig>\n readonly importMap: ImportMap\n}) => {\n const config = await configPromise\n\n const headers = getHeaders()\n const cookies = parseCookies(headers)\n\n const languageCode = getRequestLanguage({\n config,\n cookies,\n headers,\n })\n\n const theme = getRequestTheme({\n config,\n cookies,\n headers,\n })\n\n const payload = await getPayloadHMR({ config })\n\n const i18n: I18nClient = await initI18n({\n config: config.i18n,\n context: 'client',\n language: languageCode,\n })\n\n const req = await createLocalReq(\n {\n fallbackLocale: null,\n req: {\n headers,\n host: headers.get('host'),\n i18n,\n url: `${payload.config.serverURL}`,\n } as PayloadRequest,\n },\n payload,\n )\n const { permissions, user } = await payload.auth({ headers, req })\n\n const { clientConfig, render } = await createClientConfig({\n DefaultEditView,\n DefaultListView,\n children,\n config,\n i18n,\n importMap,\n payload,\n })\n\n const dir = (rtlLanguages as unknown as AcceptedLanguages[]).includes(languageCode)\n ? 'RTL'\n : 'LTR'\n\n const languageOptions = Object.entries(config.i18n.supportedLanguages || {}).reduce(\n (acc, [language, languageConfig]) => {\n if (Object.keys(config.i18n.supportedLanguages).includes(language)) {\n acc.push({\n label: languageConfig.translations.general.thisLanguage,\n value: language,\n })\n }\n\n return acc\n },\n [],\n )\n\n // eslint-disable-next-line @typescript-eslint/require-await\n async function switchLanguageServerAction(lang: string): Promise<void> {\n 'use server'\n nextCookies().set({\n name: `${config.cookiePrefix || 'payload'}-lng`,\n path: '/',\n value: lang,\n })\n }\n\n const navPreferences = user\n ? (\n await payload.find({\n collection: 'payload-preferences',\n depth: 0,\n limit: 1,\n req,\n user,\n where: {\n and: [\n {\n key: {\n equals: 'nav',\n },\n },\n {\n 'user.relationTo': {\n equals: user.collection,\n },\n },\n {\n 'user.value': {\n equals: user.id,\n },\n },\n ],\n },\n })\n )?.docs?.[0]\n : null\n\n const isNavOpen = (navPreferences?.value as any)?.open ?? true\n\n return (\n <html data-theme={theme} dir={dir} lang={languageCode}>\n <body>\n <RootProvider\n config={clientConfig}\n dateFNSKey={i18n.dateFNSKey}\n fallbackLang={clientConfig.i18n.fallbackLanguage}\n isNavOpen={isNavOpen}\n languageCode={languageCode}\n languageOptions={languageOptions}\n permissions={permissions}\n switchLanguageServerAction={switchLanguageServerAction}\n theme={theme}\n translations={i18n.translations}\n user={user}\n >\n {render}\n </RootProvider>\n <div id=\"portal\" />\n </body>\n </html>\n )\n}\n"],"names":["initI18n","rtlLanguages","RootProvider","createClientConfig","headers","getHeaders","cookies","nextCookies","createLocalReq","parseCookies","React","getPayloadHMR","getRequestLanguage","getRequestTheme","DefaultEditView","DefaultListView","metadata","description","title","RootLayout","children","config","configPromise","importMap","languageCode","theme","payload","i18n","context","language","req","fallbackLocale","host","get","url","serverURL","permissions","user","auth","clientConfig","render","dir","includes","languageOptions","Object","entries","supportedLanguages","reduce","acc","languageConfig","keys","push","label","translations","general","thisLanguage","value","switchLanguageServerAction","lang","set","name","cookiePrefix","path","navPreferences","find","collection","depth","limit","where","and","key","equals","id","docs","isNavOpen","open","html","data-theme","body","dateFNSKey","fallbackLang","fallbackLanguage","div"],"mappings":"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"}