@payloadcms/ui 3.55.0-canary.9 → 3.55.0-internal.a030723
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/elements/ListControls/index.d.ts.map +1 -1
- package/dist/elements/ListControls/index.js +78 -69
- package/dist/elements/ListControls/index.js.map +1 -1
- package/dist/elements/ListControls/index.scss +82 -2
- package/dist/elements/LivePreview/Window/index.d.ts.map +1 -1
- package/dist/elements/LivePreview/Window/index.js +64 -74
- package/dist/elements/LivePreview/Window/index.js.map +1 -1
- package/dist/elements/SearchBar/index.d.ts +3 -2
- package/dist/elements/SearchBar/index.d.ts.map +1 -1
- package/dist/elements/SearchBar/index.js +3 -2
- package/dist/elements/SearchBar/index.js.map +1 -1
- package/dist/elements/SearchBar/index.scss +7 -56
- package/dist/elements/SearchFilter/index.d.ts +33 -2
- package/dist/elements/SearchFilter/index.d.ts.map +1 -1
- package/dist/elements/SearchFilter/index.js +5 -7
- package/dist/elements/SearchFilter/index.js.map +1 -1
- package/dist/elements/Status/index.d.ts.map +1 -1
- package/dist/elements/Status/index.js +1 -1
- package/dist/elements/Status/index.js.map +1 -1
- package/dist/exports/client/index.js +24 -24
- package/dist/exports/client/index.js.map +4 -4
- package/dist/forms/RowLabel/Context/index.d.ts.map +1 -1
- package/dist/forms/RowLabel/Context/index.js +31 -17
- package/dist/forms/RowLabel/Context/index.js.map +1 -1
- package/dist/providers/Auth/index.d.ts +1 -2
- package/dist/providers/Auth/index.d.ts.map +1 -1
- package/dist/providers/Auth/index.js +83 -74
- package/dist/providers/Auth/index.js.map +1 -1
- package/dist/providers/LivePreview/context.d.ts +2 -0
- package/dist/providers/LivePreview/context.d.ts.map +1 -1
- package/dist/providers/LivePreview/context.js +1 -0
- package/dist/providers/LivePreview/context.js.map +1 -1
- package/dist/providers/LivePreview/index.d.ts.map +1 -1
- package/dist/providers/LivePreview/index.js +12 -0
- package/dist/providers/LivePreview/index.js.map +1 -1
- package/dist/styles.css +1 -1
- package/dist/views/BrowseByFolder/index.js +1 -1
- package/dist/views/BrowseByFolder/index.js.map +1 -1
- package/dist/views/CollectionFolder/index.js +1 -1
- package/dist/views/CollectionFolder/index.js.map +1 -1
- package/package.json +4 -4
- package/dist/elements/SearchFilter/types.d.ts +0 -33
- package/dist/elements/SearchFilter/types.d.ts.map +0 -1
- package/dist/elements/SearchFilter/types.js +0 -2
- package/dist/elements/SearchFilter/types.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/forms/RowLabel/Context/index.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,MAAM,OAAO,CAAA;AAIzB,KAAK,YAAY,CAAC,CAAC,GAAG,OAAO,IAAI;IAC/B,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAA;IAChB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAC5B,CAAA;AAQD,KAAK,KAAK,CAAC,CAAC,IAAI;IACd,QAAQ,CAAC,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAA;CACnC,GAAG,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,CAAA;AAEjC,eAAO,MAAM,gBAAgB,EAAE,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/forms/RowLabel/Context/index.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,MAAM,OAAO,CAAA;AAIzB,KAAK,YAAY,CAAC,CAAC,GAAG,OAAO,IAAI;IAC/B,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAA;IAChB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAC5B,CAAA;AAQD,KAAK,KAAK,CAAC,CAAC,IAAI;IACd,QAAQ,CAAC,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAA;CACnC,GAAG,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,CAAA;AAEjC,eAAO,MAAM,gBAAgB,EAAE,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,CAQrD,CAAA;AAED,eAAO,MAAM,WAAW,GAAI,CAAC,OACG,YAAY,CAAC,CAAC,CAC7C,CAAA"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
'use client';
|
|
2
2
|
|
|
3
|
+
import { c as _c } from "react/compiler-runtime";
|
|
3
4
|
import { jsx as _jsx } from "react/jsx-runtime";
|
|
4
5
|
import React from 'react';
|
|
5
6
|
import { useWatchForm } from '../../Form/context.js';
|
|
@@ -8,27 +9,40 @@ const RowLabel = /*#__PURE__*/React.createContext({
|
|
|
8
9
|
path: '',
|
|
9
10
|
rowNumber: undefined
|
|
10
11
|
});
|
|
11
|
-
export const RowLabelProvider =
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
12
|
+
export const RowLabelProvider = t0 => {
|
|
13
|
+
const $ = _c(6);
|
|
14
|
+
const {
|
|
15
|
+
children,
|
|
16
|
+
path,
|
|
17
|
+
rowNumber
|
|
18
|
+
} = t0;
|
|
16
19
|
const {
|
|
17
20
|
getDataByPath,
|
|
18
21
|
getSiblingData
|
|
19
22
|
} = useWatchForm();
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
data
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
23
|
+
let t1;
|
|
24
|
+
if ($[0] !== children || $[1] !== getDataByPath || $[2] !== getSiblingData || $[3] !== path || $[4] !== rowNumber) {
|
|
25
|
+
const collapsibleData = getSiblingData(path);
|
|
26
|
+
const arrayData = getDataByPath(path);
|
|
27
|
+
const data = arrayData || collapsibleData;
|
|
28
|
+
t1 = _jsx(RowLabel, {
|
|
29
|
+
value: {
|
|
30
|
+
data,
|
|
31
|
+
path,
|
|
32
|
+
rowNumber
|
|
33
|
+
},
|
|
34
|
+
children
|
|
35
|
+
});
|
|
36
|
+
$[0] = children;
|
|
37
|
+
$[1] = getDataByPath;
|
|
38
|
+
$[2] = getSiblingData;
|
|
39
|
+
$[3] = path;
|
|
40
|
+
$[4] = rowNumber;
|
|
41
|
+
$[5] = t1;
|
|
42
|
+
} else {
|
|
43
|
+
t1 = $[5];
|
|
44
|
+
}
|
|
45
|
+
return t1;
|
|
32
46
|
};
|
|
33
47
|
export const useRowLabel = () => {
|
|
34
48
|
return React.use(RowLabel);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":["React","useWatchForm","RowLabel","createContext","data","path","rowNumber","undefined","RowLabelProvider","children","getDataByPath","getSiblingData","
|
|
1
|
+
{"version":3,"file":"index.js","names":["c","_c","React","useWatchForm","RowLabel","createContext","data","path","rowNumber","undefined","RowLabelProvider","t0","$","children","getDataByPath","getSiblingData","t1","collapsibleData","arrayData","_jsx","value","useRowLabel","use"],"sources":["../../../../src/forms/RowLabel/Context/index.tsx"],"sourcesContent":["'use client'\n\nimport React from 'react'\n\nimport { useWatchForm } from '../../Form/context.js'\n\ntype RowLabelType<T = unknown> = {\n readonly data: T\n readonly path: string\n readonly rowNumber?: number\n}\n\nconst RowLabel = React.createContext<RowLabelType>({\n data: {},\n path: '',\n rowNumber: undefined,\n})\n\ntype Props<T> = {\n readonly children: React.ReactNode\n} & Omit<RowLabelType<T>, 'data'>\n\nexport const RowLabelProvider: React.FC<Props<unknown>> = ({ children, path, rowNumber }) => {\n const { getDataByPath, getSiblingData } = useWatchForm()\n const collapsibleData = getSiblingData(path)\n const arrayData = getDataByPath(path)\n\n const data = arrayData || collapsibleData\n\n return <RowLabel value={{ data, path, rowNumber }}>{children}</RowLabel>\n}\n\nexport const useRowLabel = <T,>() => {\n return React.use(RowLabel) as RowLabelType<T>\n}\n"],"mappings":"AAAA;;AAAA,SAAAA,CAAA,IAAAC,EAAA;;AAEA,OAAOC,KAAA,MAAW;AAElB,SAASC,YAAY,QAAQ;AAQ7B,MAAMC,QAAA,gBAAWF,KAAA,CAAMG,aAAa,CAAe;EACjDC,IAAA,EAAM,CAAC;EACPC,IAAA,EAAM;EACNC,SAAA,EAAWC;AACb;AAMA,OAAO,MAAMC,gBAAA,GAA6CC,EAAA;EAAA,MAAAC,CAAA,GAAAX,EAAA;EAAC;IAAAY,QAAA;IAAAN,IAAA;IAAAC;EAAA,IAAAG,EAA6B;EACtF;IAAAG,aAAA;IAAAC;EAAA,IAA0CZ,YAAA;EAAA,IAAAa,EAAA;EAAA,IAAAJ,CAAA,QAAAC,QAAA,IAAAD,CAAA,QAAAE,aAAA,IAAAF,CAAA,QAAAG,cAAA,IAAAH,CAAA,QAAAL,IAAA,IAAAK,CAAA,QAAAJ,SAAA;IAC1C,MAAAS,eAAA,GAAwBF,cAAA,CAAeR,IAAA;IACvC,MAAAW,SAAA,GAAkBJ,aAAA,CAAcP,IAAA;IAEhC,MAAAD,IAAA,GAAaY,SAAA,IAAaD,eAAA;IAEnBD,EAAA,GAAAG,IAAA,CAAAf,QAAA;MAAAgB,KAAA;QAAAd,IAAA;QAAAC,IAAA;QAAAC;MAAA;MAAAK;IAAA,C;;;;;;;;;;SAAAG,E;CACT;AAEA,OAAO,MAAMK,WAAA,GAAcA,CAAA;EACzB,OAAOnB,KAAA,CAAMoB,GAAG,CAAClB,QAAA;AACnB","ignoreList":[]}
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
import type { ClientUser, SanitizedPermissions, TypedUser } from 'payload';
|
|
2
2
|
import React from 'react';
|
|
3
3
|
export type UserWithToken<T = ClientUser> = {
|
|
4
|
-
/** seconds until expiration */
|
|
5
4
|
exp: number;
|
|
6
5
|
token: string;
|
|
7
6
|
user: T;
|
|
@@ -17,7 +16,7 @@ export type AuthContext<T = ClientUser> = {
|
|
|
17
16
|
setUser: (user: null | UserWithToken<T>) => void;
|
|
18
17
|
strategy?: string;
|
|
19
18
|
token?: string;
|
|
20
|
-
|
|
19
|
+
tokenExpiration?: number;
|
|
21
20
|
user?: null | T;
|
|
22
21
|
};
|
|
23
22
|
type Props = {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/providers/Auth/index.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,oBAAoB,EAAE,SAAS,EAAE,MAAM,SAAS,CAAA;AAM1E,OAAO,KAA+D,MAAM,OAAO,CAAA;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/providers/Auth/index.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,oBAAoB,EAAE,SAAS,EAAE,MAAM,SAAS,CAAA;AAM1E,OAAO,KAA+D,MAAM,OAAO,CAAA;AAWnF,MAAM,MAAM,aAAa,CAAC,CAAC,GAAG,UAAU,IAAI;IAC1C,GAAG,EAAE,MAAM,CAAA;IACX,KAAK,EAAE,MAAM,CAAA;IACb,IAAI,EAAE,CAAC,CAAA;CACR,CAAA;AAED,MAAM,MAAM,WAAW,CAAC,CAAC,GAAG,UAAU,IAAI;IACxC,aAAa,EAAE,MAAM,OAAO,CAAC,IAAI,GAAG,SAAS,CAAC,CAAA;IAC9C,MAAM,EAAE,MAAM,OAAO,CAAC,OAAO,CAAC,CAAA;IAC9B,WAAW,CAAC,EAAE,oBAAoB,CAAA;IAClC,aAAa,EAAE,CAAC,YAAY,CAAC,EAAE,OAAO,KAAK,IAAI,CAAA;IAC/C,kBAAkB,EAAE,MAAM,OAAO,CAAC,UAAU,CAAC,CAAA;IAC7C,kBAAkB,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAA;IACvC,cAAc,EAAE,CAAC,WAAW,EAAE,oBAAoB,KAAK,IAAI,CAAA;IAC3D,OAAO,EAAE,CAAC,IAAI,EAAE,IAAI,GAAG,aAAa,CAAC,CAAC,CAAC,KAAK,IAAI,CAAA;IAChD,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB,IAAI,CAAC,EAAE,IAAI,GAAG,CAAC,CAAA;CAChB,CAAA;AAMD,KAAK,KAAK,GAAG;IACX,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAA;IACzB,WAAW,CAAC,EAAE,oBAAoB,CAAA;IAClC,IAAI,CAAC,EAAE,UAAU,GAAG,IAAI,CAAA;CACzB,CAAA;AAED,wBAAgB,YAAY,CAAC,EAC3B,QAAQ,EACR,WAAW,EAAE,kBAAkB,EAC/B,IAAI,EAAE,WAAW,GAClB,EAAE,KAAK,qBA2RP;AAED,eAAO,MAAM,OAAO,GAAI,CAAC,oBAAmB,WAAW,CAAC,CAAC,CAAmC,CAAA"}
|
|
@@ -8,18 +8,22 @@ import * as qs from 'qs-esm';
|
|
|
8
8
|
import React, { createContext, use, useCallback, useEffect, useState } from 'react';
|
|
9
9
|
import { toast } from 'sonner';
|
|
10
10
|
import { stayLoggedInModalSlug } from '../../elements/StayLoggedIn/index.js';
|
|
11
|
+
import { useDebounce } from '../../hooks/useDebounce.js';
|
|
11
12
|
import { useEffectEvent } from '../../hooks/useEffectEvent.js';
|
|
12
13
|
import { useTranslation } from '../../providers/Translation/index.js';
|
|
13
14
|
import { requests } from '../../utilities/api.js';
|
|
14
15
|
import { useConfig } from '../Config/index.js';
|
|
15
16
|
import { useRouteTransition } from '../RouteTransition/index.js';
|
|
16
17
|
const Context = /*#__PURE__*/createContext({});
|
|
17
|
-
const
|
|
18
|
+
const maxTimeoutTime = 2147483647;
|
|
18
19
|
export function AuthProvider({
|
|
19
20
|
children,
|
|
20
21
|
permissions: initialPermissions,
|
|
21
22
|
user: initialUser
|
|
22
23
|
}) {
|
|
24
|
+
const [user, setUserInMemory] = useState(initialUser);
|
|
25
|
+
const [tokenInMemory, setTokenInMemory] = useState();
|
|
26
|
+
const [tokenExpiration, setTokenExpiration] = useState();
|
|
23
27
|
const pathname = usePathname();
|
|
24
28
|
const router = useRouter();
|
|
25
29
|
const {
|
|
@@ -27,7 +31,6 @@ export function AuthProvider({
|
|
|
27
31
|
} = useConfig();
|
|
28
32
|
const {
|
|
29
33
|
admin: {
|
|
30
|
-
autoRefresh,
|
|
31
34
|
routes: {
|
|
32
35
|
inactivity: logoutInactivityRoute
|
|
33
36
|
},
|
|
@@ -39,6 +42,7 @@ export function AuthProvider({
|
|
|
39
42
|
},
|
|
40
43
|
serverURL
|
|
41
44
|
} = config;
|
|
45
|
+
const [permissions, setPermissions] = useState(initialPermissions);
|
|
42
46
|
const {
|
|
43
47
|
i18n
|
|
44
48
|
} = useTranslation();
|
|
@@ -46,18 +50,12 @@ export function AuthProvider({
|
|
|
46
50
|
closeAllModals,
|
|
47
51
|
openModal
|
|
48
52
|
} = useModal();
|
|
53
|
+
const [lastLocationChange, setLastLocationChange] = useState(0);
|
|
54
|
+
const debouncedLocationChange = useDebounce(lastLocationChange, 10000);
|
|
55
|
+
const refreshTokenTimeoutRef = React.useRef(null);
|
|
49
56
|
const {
|
|
50
57
|
startRouteTransition
|
|
51
58
|
} = useRouteTransition();
|
|
52
|
-
const [user, setUserInMemory] = useState(initialUser);
|
|
53
|
-
const [tokenInMemory, setTokenInMemory] = useState();
|
|
54
|
-
const [tokenExpirationMs, setTokenExpirationMs] = useState();
|
|
55
|
-
const [permissions, setPermissions] = useState(initialPermissions);
|
|
56
|
-
const [forceLogoutBufferMs, setForceLogoutBufferMs] = useState(120_000);
|
|
57
|
-
const [fetchedUserOnMount, setFetchedUserOnMount] = useState(false);
|
|
58
|
-
const refreshTokenTimeoutRef = React.useRef(null);
|
|
59
|
-
const reminderTimeoutRef = React.useRef(null);
|
|
60
|
-
const forceLogOutTimeoutRef = React.useRef(null);
|
|
61
59
|
const id = user?.id;
|
|
62
60
|
const redirectToInactivityRoute = useCallback(() => {
|
|
63
61
|
startRouteTransition(() => router.replace(formatAdminURL({
|
|
@@ -67,65 +65,50 @@ export function AuthProvider({
|
|
|
67
65
|
closeAllModals();
|
|
68
66
|
}, [router, adminRoute, logoutInactivityRoute, closeAllModals, startRouteTransition]);
|
|
69
67
|
const revokeTokenAndExpire = useCallback(() => {
|
|
70
|
-
setUserInMemory(null);
|
|
71
68
|
setTokenInMemory(undefined);
|
|
72
|
-
|
|
69
|
+
setTokenExpiration(undefined);
|
|
73
70
|
clearTimeout(refreshTokenTimeoutRef.current);
|
|
74
71
|
}, []);
|
|
75
72
|
const setNewUser = useCallback(userResponse => {
|
|
76
|
-
clearTimeout(reminderTimeoutRef.current);
|
|
77
|
-
clearTimeout(forceLogOutTimeoutRef.current);
|
|
78
73
|
if (userResponse?.user) {
|
|
79
74
|
setUserInMemory(userResponse.user);
|
|
80
75
|
setTokenInMemory(userResponse.token);
|
|
81
|
-
|
|
82
|
-
const expiresInMs = Math.max(0, Math.min((userResponse.exp ?? 0) * 1000 - Date.now(), maxTimeoutMs));
|
|
83
|
-
if (expiresInMs) {
|
|
84
|
-
const nextForceLogoutBufferMs = Math.min(60_000, expiresInMs / 2);
|
|
85
|
-
setForceLogoutBufferMs(nextForceLogoutBufferMs);
|
|
86
|
-
reminderTimeoutRef.current = setTimeout(() => {
|
|
87
|
-
if (autoRefresh) {
|
|
88
|
-
refreshCookieEvent();
|
|
89
|
-
} else {
|
|
90
|
-
openModal(stayLoggedInModalSlug);
|
|
91
|
-
}
|
|
92
|
-
}, Math.max(expiresInMs - nextForceLogoutBufferMs, 0));
|
|
93
|
-
forceLogOutTimeoutRef.current = setTimeout(() => {
|
|
94
|
-
revokeTokenAndExpire();
|
|
95
|
-
redirectToInactivityRoute();
|
|
96
|
-
}, expiresInMs);
|
|
97
|
-
}
|
|
76
|
+
setTokenExpiration(userResponse.exp);
|
|
98
77
|
} else {
|
|
78
|
+
setUserInMemory(null);
|
|
99
79
|
revokeTokenAndExpire();
|
|
100
80
|
}
|
|
101
|
-
}, [
|
|
81
|
+
}, [revokeTokenAndExpire]);
|
|
102
82
|
const refreshCookie = useCallback(forceRefresh => {
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
83
|
+
const now = Math.round(new Date().getTime() / 1000);
|
|
84
|
+
const remainingTime = (typeof tokenExpiration === 'number' ? tokenExpiration : 0) - now;
|
|
85
|
+
if (forceRefresh || tokenExpiration && remainingTime < 120) {
|
|
86
|
+
refreshTokenTimeoutRef.current = setTimeout(() => {
|
|
87
|
+
async function refresh() {
|
|
88
|
+
try {
|
|
89
|
+
const request = await requests.post(`${serverURL}${apiRoute}/${userSlug}/refresh-token?refresh`, {
|
|
90
|
+
headers: {
|
|
91
|
+
'Accept-Language': i18n.language
|
|
92
|
+
}
|
|
93
|
+
});
|
|
94
|
+
if (request.status === 200) {
|
|
95
|
+
const json = await request.json();
|
|
96
|
+
setNewUser(json);
|
|
97
|
+
} else {
|
|
98
|
+
setNewUser(null);
|
|
99
|
+
redirectToInactivityRoute();
|
|
114
100
|
}
|
|
115
|
-
})
|
|
116
|
-
|
|
117
|
-
const json = await request.json();
|
|
118
|
-
setNewUser(json);
|
|
119
|
-
} else {
|
|
120
|
-
setNewUser(null);
|
|
121
|
-
redirectToInactivityRoute();
|
|
101
|
+
} catch (e) {
|
|
102
|
+
toast.error(e.message);
|
|
122
103
|
}
|
|
123
|
-
} catch (e) {
|
|
124
|
-
toast.error(e.message);
|
|
125
104
|
}
|
|
105
|
+
void refresh();
|
|
126
106
|
}, 1000);
|
|
127
107
|
}
|
|
128
|
-
|
|
108
|
+
return () => {
|
|
109
|
+
clearTimeout(refreshTokenTimeoutRef.current);
|
|
110
|
+
};
|
|
111
|
+
}, [apiRoute, i18n.language, redirectToInactivityRoute, serverURL, setNewUser, tokenExpiration, userSlug]);
|
|
129
112
|
const refreshCookieAsync = useCallback(async skipSetUser => {
|
|
130
113
|
try {
|
|
131
114
|
const request_0 = await requests.post(`${serverURL}${apiRoute}/${userSlug}/refresh-token`, {
|
|
@@ -144,10 +127,11 @@ export function AuthProvider({
|
|
|
144
127
|
setNewUser(null);
|
|
145
128
|
redirectToInactivityRoute();
|
|
146
129
|
}
|
|
130
|
+
return null;
|
|
147
131
|
} catch (e_0) {
|
|
148
132
|
toast.error(`Refreshing token failed: ${e_0.message}`);
|
|
133
|
+
return null;
|
|
149
134
|
}
|
|
150
|
-
return null;
|
|
151
135
|
}, [apiRoute, i18n.language, redirectToInactivityRoute, serverURL, setNewUser, userSlug, user]);
|
|
152
136
|
const logOut = useCallback(async () => {
|
|
153
137
|
try {
|
|
@@ -194,36 +178,62 @@ export function AuthProvider({
|
|
|
194
178
|
});
|
|
195
179
|
if (request_2.status === 200) {
|
|
196
180
|
const json_2 = await request_2.json();
|
|
181
|
+
const user_0 = null;
|
|
197
182
|
setNewUser(json_2);
|
|
198
|
-
return
|
|
183
|
+
return user_0;
|
|
199
184
|
}
|
|
200
185
|
} catch (e_2) {
|
|
201
186
|
toast.error(`Fetching user failed: ${e_2.message}`);
|
|
202
187
|
}
|
|
203
188
|
return null;
|
|
204
189
|
}, [serverURL, apiRoute, userSlug, i18n.language, setNewUser]);
|
|
205
|
-
const
|
|
190
|
+
const fetchFullUserEvent = useEffectEvent(fetchFullUser);
|
|
191
|
+
// On mount, get user and set
|
|
192
|
+
useEffect(() => {
|
|
193
|
+
void fetchFullUserEvent();
|
|
194
|
+
}, []);
|
|
195
|
+
const refreshCookieEvent = useEffectEvent(() => {
|
|
196
|
+
if (id) {
|
|
197
|
+
refreshCookie();
|
|
198
|
+
}
|
|
199
|
+
});
|
|
200
|
+
// When location changes, refresh cookie
|
|
206
201
|
useEffect(() => {
|
|
207
|
-
// when location changes, refresh cookie
|
|
208
202
|
refreshCookieEvent();
|
|
203
|
+
}, [debouncedLocationChange]);
|
|
204
|
+
useEffect(() => {
|
|
205
|
+
setLastLocationChange(Date.now());
|
|
209
206
|
}, [pathname]);
|
|
210
|
-
const fetchFullUserEvent = useEffectEvent(fetchFullUser);
|
|
211
207
|
useEffect(() => {
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
208
|
+
let reminder;
|
|
209
|
+
let forceLogOut;
|
|
210
|
+
const now_0 = Math.round(new Date().getTime() / 1000);
|
|
211
|
+
const remainingTime_0 = typeof tokenExpiration === 'number' ? tokenExpiration - now_0 : 0;
|
|
212
|
+
const remindInTimeFromNow = Math.max(Math.min((remainingTime_0 - 60) * 1000, maxTimeoutTime), 0);
|
|
213
|
+
const forceLogOutInTimeFromNow = Math.max(Math.min(remainingTime_0 * 1000, maxTimeoutTime), 0);
|
|
214
|
+
if (!user) {
|
|
215
|
+
clearTimeout(reminder);
|
|
216
|
+
clearTimeout(forceLogOut);
|
|
217
|
+
return;
|
|
215
218
|
}
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
return
|
|
226
|
-
|
|
219
|
+
if (remainingTime_0 > 0) {
|
|
220
|
+
reminder = setTimeout(() => {
|
|
221
|
+
openModal(stayLoggedInModalSlug);
|
|
222
|
+
}, remindInTimeFromNow);
|
|
223
|
+
forceLogOut = setTimeout(() => {
|
|
224
|
+
setNewUser(null);
|
|
225
|
+
redirectToInactivityRoute();
|
|
226
|
+
}, forceLogOutInTimeFromNow);
|
|
227
|
+
}
|
|
228
|
+
return () => {
|
|
229
|
+
if (reminder) {
|
|
230
|
+
clearTimeout(reminder);
|
|
231
|
+
}
|
|
232
|
+
if (forceLogOut) {
|
|
233
|
+
clearTimeout(forceLogOut);
|
|
234
|
+
}
|
|
235
|
+
};
|
|
236
|
+
}, [tokenExpiration, openModal, i18n, setNewUser, user, redirectToInactivityRoute]);
|
|
227
237
|
return /*#__PURE__*/_jsx(Context, {
|
|
228
238
|
value: {
|
|
229
239
|
fetchFullUser,
|
|
@@ -235,7 +245,6 @@ export function AuthProvider({
|
|
|
235
245
|
setPermissions,
|
|
236
246
|
setUser: setNewUser,
|
|
237
247
|
token: tokenInMemory,
|
|
238
|
-
tokenExpirationMs,
|
|
239
248
|
user
|
|
240
249
|
},
|
|
241
250
|
children: children
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":["useModal","usePathname","useRouter","formatAdminURL","qs","React","createContext","use","useCallback","useEffect","useState","toast","stayLoggedInModalSlug","useEffectEvent","useTranslation","requests","useConfig","useRouteTransition","Context","maxTimeoutMs","AuthProvider","children","permissions","initialPermissions","user","initialUser","pathname","router","config","admin","autoRefresh","routes","inactivity","logoutInactivityRoute","userSlug","adminRoute","api","apiRoute","serverURL","i18n","closeAllModals","openModal","startRouteTransition","setUserInMemory","tokenInMemory","setTokenInMemory","tokenExpirationMs","setTokenExpirationMs","setPermissions","forceLogoutBufferMs","setForceLogoutBufferMs","fetchedUserOnMount","setFetchedUserOnMount","refreshTokenTimeoutRef","useRef","reminderTimeoutRef","forceLogOutTimeoutRef","id","redirectToInactivityRoute","replace","path","window","location","startsWith","encodeURIComponent","revokeTokenAndExpire","undefined","clearTimeout","current","setNewUser","userResponse","token","exp","expiresInMs","Math","max","min","Date","now","nextForceLogoutBufferMs","setTimeout","refreshCookieEvent","refreshCookie","forceRefresh","request","post","headers","language","status","json","e","error","message","refreshCookieAsync","skipSetUser","logOut","collection","_","refreshPermissions","locale","params","stringify","addQueryPrefix","get","Error","fetchFullUser","credentials","fetchFullUserEvent","fetchUserOnMount","_jsx","value","setUser","useAuth"],"sources":["../../../src/providers/Auth/index.tsx"],"sourcesContent":["'use client'\nimport type { ClientUser, SanitizedPermissions, TypedUser } from 'payload'\n\nimport { useModal } from '@faceless-ui/modal'\nimport { usePathname, useRouter } from 'next/navigation.js'\nimport { formatAdminURL } from 'payload/shared'\nimport * as qs from 'qs-esm'\nimport React, { createContext, use, useCallback, useEffect, useState } from 'react'\nimport { toast } from 'sonner'\n\nimport { stayLoggedInModalSlug } from '../../elements/StayLoggedIn/index.js'\nimport { useEffectEvent } from '../../hooks/useEffectEvent.js'\nimport { useTranslation } from '../../providers/Translation/index.js'\nimport { requests } from '../../utilities/api.js'\nimport { useConfig } from '../Config/index.js'\nimport { useRouteTransition } from '../RouteTransition/index.js'\n\nexport type UserWithToken<T = ClientUser> = {\n /** seconds until expiration */\n exp: number\n token: string\n user: T\n}\n\nexport type AuthContext<T = ClientUser> = {\n fetchFullUser: () => Promise<null | TypedUser>\n logOut: () => Promise<boolean>\n permissions?: SanitizedPermissions\n refreshCookie: (forceRefresh?: boolean) => void\n refreshCookieAsync: () => Promise<ClientUser>\n refreshPermissions: () => Promise<void>\n setPermissions: (permissions: SanitizedPermissions) => void\n setUser: (user: null | UserWithToken<T>) => void\n strategy?: string\n token?: string\n tokenExpirationMs?: number\n user?: null | T\n}\n\nconst Context = createContext({} as AuthContext)\n\nconst maxTimeoutMs = 2147483647\n\ntype Props = {\n children: React.ReactNode\n permissions?: SanitizedPermissions\n user?: ClientUser | null\n}\n\nexport function AuthProvider({\n children,\n permissions: initialPermissions,\n user: initialUser,\n}: Props) {\n const pathname = usePathname()\n const router = useRouter()\n\n const { config } = useConfig()\n\n const {\n admin: {\n autoRefresh,\n routes: { inactivity: logoutInactivityRoute },\n user: userSlug,\n },\n routes: { admin: adminRoute, api: apiRoute },\n serverURL,\n } = config\n\n const { i18n } = useTranslation()\n const { closeAllModals, openModal } = useModal()\n const { startRouteTransition } = useRouteTransition()\n\n const [user, setUserInMemory] = useState<ClientUser | null>(initialUser)\n const [tokenInMemory, setTokenInMemory] = useState<string>()\n const [tokenExpirationMs, setTokenExpirationMs] = useState<number>()\n const [permissions, setPermissions] = useState<SanitizedPermissions>(initialPermissions)\n const [forceLogoutBufferMs, setForceLogoutBufferMs] = useState<number>(120_000)\n const [fetchedUserOnMount, setFetchedUserOnMount] = useState(false)\n\n const refreshTokenTimeoutRef = React.useRef<ReturnType<typeof setTimeout>>(null)\n const reminderTimeoutRef = React.useRef<ReturnType<typeof setTimeout>>(null)\n const forceLogOutTimeoutRef = React.useRef<ReturnType<typeof setTimeout>>(null)\n\n const id = user?.id\n\n const redirectToInactivityRoute = useCallback(() => {\n startRouteTransition(() =>\n router.replace(\n formatAdminURL({\n adminRoute,\n path: `${logoutInactivityRoute}${window.location.pathname.startsWith(adminRoute) ? `?redirect=${encodeURIComponent(window.location.pathname)}` : ''}`,\n }),\n ),\n )\n\n closeAllModals()\n }, [router, adminRoute, logoutInactivityRoute, closeAllModals, startRouteTransition])\n\n const revokeTokenAndExpire = useCallback(() => {\n setUserInMemory(null)\n setTokenInMemory(undefined)\n setTokenExpirationMs(undefined)\n clearTimeout(refreshTokenTimeoutRef.current)\n }, [])\n\n const setNewUser = useCallback(\n (userResponse: null | UserWithToken) => {\n clearTimeout(reminderTimeoutRef.current)\n clearTimeout(forceLogOutTimeoutRef.current)\n\n if (userResponse?.user) {\n setUserInMemory(userResponse.user)\n setTokenInMemory(userResponse.token)\n setTokenExpirationMs(userResponse.exp * 1000)\n\n const expiresInMs = Math.max(\n 0,\n Math.min((userResponse.exp ?? 0) * 1000 - Date.now(), maxTimeoutMs),\n )\n\n if (expiresInMs) {\n const nextForceLogoutBufferMs = Math.min(60_000, expiresInMs / 2)\n setForceLogoutBufferMs(nextForceLogoutBufferMs)\n\n reminderTimeoutRef.current = setTimeout(\n () => {\n if (autoRefresh) {\n refreshCookieEvent()\n } else {\n openModal(stayLoggedInModalSlug)\n }\n },\n Math.max(expiresInMs - nextForceLogoutBufferMs, 0),\n )\n\n forceLogOutTimeoutRef.current = setTimeout(() => {\n revokeTokenAndExpire()\n redirectToInactivityRoute()\n }, expiresInMs)\n }\n } else {\n revokeTokenAndExpire()\n }\n },\n [autoRefresh, redirectToInactivityRoute, revokeTokenAndExpire, openModal],\n )\n\n const refreshCookie = useCallback(\n (forceRefresh?: boolean) => {\n if (!id) {\n return\n }\n\n const expiresInMs = Math.max(0, (tokenExpirationMs ?? 0) - Date.now())\n\n if (forceRefresh || (tokenExpirationMs && expiresInMs < forceLogoutBufferMs * 2)) {\n clearTimeout(refreshTokenTimeoutRef.current)\n refreshTokenTimeoutRef.current = setTimeout(async () => {\n try {\n const request = await requests.post(\n `${serverURL}${apiRoute}/${userSlug}/refresh-token?refresh`,\n {\n headers: {\n 'Accept-Language': i18n.language,\n },\n },\n )\n\n if (request.status === 200) {\n const json: UserWithToken = await request.json()\n setNewUser(json)\n } else {\n setNewUser(null)\n redirectToInactivityRoute()\n }\n } catch (e) {\n toast.error(e.message)\n }\n }, 1000)\n }\n },\n [\n apiRoute,\n i18n.language,\n redirectToInactivityRoute,\n serverURL,\n setNewUser,\n tokenExpirationMs,\n userSlug,\n forceLogoutBufferMs,\n id,\n ],\n )\n\n const refreshCookieAsync = useCallback(\n async (skipSetUser?: boolean): Promise<ClientUser> => {\n try {\n const request = await requests.post(`${serverURL}${apiRoute}/${userSlug}/refresh-token`, {\n headers: {\n 'Accept-Language': i18n.language,\n },\n })\n\n if (request.status === 200) {\n const json: UserWithToken = await request.json()\n if (!skipSetUser) {\n setNewUser(json)\n }\n return json.user\n }\n\n if (user) {\n setNewUser(null)\n redirectToInactivityRoute()\n }\n } catch (e) {\n toast.error(`Refreshing token failed: ${e.message}`)\n }\n return null\n },\n [apiRoute, i18n.language, redirectToInactivityRoute, serverURL, setNewUser, userSlug, user],\n )\n\n const logOut = useCallback(async () => {\n try {\n if (user && user.collection) {\n setNewUser(null)\n await requests.post(`${serverURL}${apiRoute}/${user.collection}/logout`)\n }\n } catch (_) {\n // fail silently and log the user out in state\n }\n\n return true\n }, [apiRoute, serverURL, setNewUser, user])\n\n const refreshPermissions = useCallback(\n async ({ locale }: { locale?: string } = {}) => {\n const params = qs.stringify(\n {\n locale,\n },\n {\n addQueryPrefix: true,\n },\n )\n\n try {\n const request = await requests.get(`${serverURL}${apiRoute}/access${params}`, {\n headers: {\n 'Accept-Language': i18n.language,\n },\n })\n\n if (request.status === 200) {\n const json: SanitizedPermissions = await request.json()\n setPermissions(json)\n } else {\n throw new Error(`Fetching permissions failed with status code ${request.status}`)\n }\n } catch (e) {\n toast.error(`Refreshing permissions failed: ${e.message}`)\n }\n },\n [serverURL, apiRoute, i18n],\n )\n\n const fetchFullUser = React.useCallback(async () => {\n try {\n const request = await requests.get(`${serverURL}${apiRoute}/${userSlug}/me`, {\n credentials: 'include',\n headers: {\n 'Accept-Language': i18n.language,\n },\n })\n\n if (request.status === 200) {\n const json: UserWithToken = await request.json()\n setNewUser(json)\n return json?.user || null\n }\n } catch (e) {\n toast.error(`Fetching user failed: ${e.message}`)\n }\n\n return null\n }, [serverURL, apiRoute, userSlug, i18n.language, setNewUser])\n\n const refreshCookieEvent = useEffectEvent(refreshCookie)\n useEffect(() => {\n // when location changes, refresh cookie\n refreshCookieEvent()\n }, [pathname])\n\n const fetchFullUserEvent = useEffectEvent(fetchFullUser)\n useEffect(() => {\n async function fetchUserOnMount() {\n await fetchFullUserEvent()\n setFetchedUserOnMount(true)\n }\n\n void fetchUserOnMount()\n }, [])\n\n useEffect(\n () => () => {\n // remove all timeouts on unmount\n clearTimeout(refreshTokenTimeoutRef.current)\n clearTimeout(reminderTimeoutRef.current)\n clearTimeout(forceLogOutTimeoutRef.current)\n },\n [],\n )\n\n if (!user && !fetchedUserOnMount) {\n return null\n }\n\n return (\n <Context\n value={{\n fetchFullUser,\n logOut,\n permissions,\n refreshCookie,\n refreshCookieAsync,\n refreshPermissions,\n setPermissions,\n setUser: setNewUser,\n token: tokenInMemory,\n tokenExpirationMs,\n user,\n }}\n >\n {children}\n </Context>\n )\n}\n\nexport const useAuth = <T = ClientUser,>(): AuthContext<T> => use(Context) as AuthContext<T>\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"index.js","names":["useModal","usePathname","useRouter","formatAdminURL","qs","React","createContext","use","useCallback","useEffect","useState","toast","stayLoggedInModalSlug","useDebounce","useEffectEvent","useTranslation","requests","useConfig","useRouteTransition","Context","maxTimeoutTime","AuthProvider","children","permissions","initialPermissions","user","initialUser","setUserInMemory","tokenInMemory","setTokenInMemory","tokenExpiration","setTokenExpiration","pathname","router","config","admin","routes","inactivity","logoutInactivityRoute","userSlug","adminRoute","api","apiRoute","serverURL","setPermissions","i18n","closeAllModals","openModal","lastLocationChange","setLastLocationChange","debouncedLocationChange","refreshTokenTimeoutRef","useRef","startRouteTransition","id","redirectToInactivityRoute","replace","path","window","location","startsWith","encodeURIComponent","revokeTokenAndExpire","undefined","clearTimeout","current","setNewUser","userResponse","token","exp","refreshCookie","forceRefresh","now","Math","round","Date","getTime","remainingTime","setTimeout","refresh","request","post","headers","language","status","json","e","error","message","refreshCookieAsync","skipSetUser","logOut","collection","_","refreshPermissions","locale","params","stringify","addQueryPrefix","get","Error","fetchFullUser","credentials","fetchFullUserEvent","refreshCookieEvent","reminder","forceLogOut","remindInTimeFromNow","max","min","forceLogOutInTimeFromNow","_jsx","value","setUser","useAuth"],"sources":["../../../src/providers/Auth/index.tsx"],"sourcesContent":["'use client'\nimport type { ClientUser, SanitizedPermissions, TypedUser } from 'payload'\n\nimport { useModal } from '@faceless-ui/modal'\nimport { usePathname, useRouter } from 'next/navigation.js'\nimport { formatAdminURL } from 'payload/shared'\nimport * as qs from 'qs-esm'\nimport React, { createContext, use, useCallback, useEffect, useState } from 'react'\nimport { toast } from 'sonner'\n\nimport { stayLoggedInModalSlug } from '../../elements/StayLoggedIn/index.js'\nimport { useDebounce } from '../../hooks/useDebounce.js'\nimport { useEffectEvent } from '../../hooks/useEffectEvent.js'\nimport { useTranslation } from '../../providers/Translation/index.js'\nimport { requests } from '../../utilities/api.js'\nimport { useConfig } from '../Config/index.js'\nimport { useRouteTransition } from '../RouteTransition/index.js'\n\nexport type UserWithToken<T = ClientUser> = {\n exp: number\n token: string\n user: T\n}\n\nexport type AuthContext<T = ClientUser> = {\n fetchFullUser: () => Promise<null | TypedUser>\n logOut: () => Promise<boolean>\n permissions?: SanitizedPermissions\n refreshCookie: (forceRefresh?: boolean) => void\n refreshCookieAsync: () => Promise<ClientUser>\n refreshPermissions: () => Promise<void>\n setPermissions: (permissions: SanitizedPermissions) => void\n setUser: (user: null | UserWithToken<T>) => void\n strategy?: string\n token?: string\n tokenExpiration?: number\n user?: null | T\n}\n\nconst Context = createContext({} as AuthContext)\n\nconst maxTimeoutTime = 2147483647\n\ntype Props = {\n children: React.ReactNode\n permissions?: SanitizedPermissions\n user?: ClientUser | null\n}\n\nexport function AuthProvider({\n children,\n permissions: initialPermissions,\n user: initialUser,\n}: Props) {\n const [user, setUserInMemory] = useState<ClientUser | null>(initialUser)\n const [tokenInMemory, setTokenInMemory] = useState<string>()\n const [tokenExpiration, setTokenExpiration] = useState<number>()\n const pathname = usePathname()\n const router = useRouter()\n\n const { config } = useConfig()\n\n const {\n admin: {\n routes: { inactivity: logoutInactivityRoute },\n user: userSlug,\n },\n routes: { admin: adminRoute, api: apiRoute },\n serverURL,\n } = config\n\n const [permissions, setPermissions] = useState<SanitizedPermissions>(initialPermissions)\n\n const { i18n } = useTranslation()\n const { closeAllModals, openModal } = useModal()\n const [lastLocationChange, setLastLocationChange] = useState(0)\n const debouncedLocationChange = useDebounce(lastLocationChange, 10000)\n const refreshTokenTimeoutRef = React.useRef<ReturnType<typeof setTimeout>>(null)\n const { startRouteTransition } = useRouteTransition()\n\n const id = user?.id\n\n const redirectToInactivityRoute = useCallback(() => {\n startRouteTransition(() =>\n router.replace(\n formatAdminURL({\n adminRoute,\n path: `${logoutInactivityRoute}${window.location.pathname.startsWith(adminRoute) ? `?redirect=${encodeURIComponent(window.location.pathname)}` : ''}`,\n }),\n ),\n )\n\n closeAllModals()\n }, [router, adminRoute, logoutInactivityRoute, closeAllModals, startRouteTransition])\n\n const revokeTokenAndExpire = useCallback(() => {\n setTokenInMemory(undefined)\n setTokenExpiration(undefined)\n clearTimeout(refreshTokenTimeoutRef.current)\n }, [])\n\n const setNewUser = useCallback(\n (userResponse: null | UserWithToken) => {\n if (userResponse?.user) {\n setUserInMemory(userResponse.user)\n setTokenInMemory(userResponse.token)\n setTokenExpiration(userResponse.exp)\n } else {\n setUserInMemory(null)\n revokeTokenAndExpire()\n }\n },\n [revokeTokenAndExpire],\n )\n\n const refreshCookie = useCallback(\n (forceRefresh?: boolean) => {\n const now = Math.round(new Date().getTime() / 1000)\n const remainingTime = (typeof tokenExpiration === 'number' ? tokenExpiration : 0) - now\n\n if (forceRefresh || (tokenExpiration && remainingTime < 120)) {\n refreshTokenTimeoutRef.current = setTimeout(() => {\n async function refresh() {\n try {\n const request = await requests.post(\n `${serverURL}${apiRoute}/${userSlug}/refresh-token?refresh`,\n {\n headers: {\n 'Accept-Language': i18n.language,\n },\n },\n )\n\n if (request.status === 200) {\n const json = await request.json()\n setNewUser(json)\n } else {\n setNewUser(null)\n redirectToInactivityRoute()\n }\n } catch (e) {\n toast.error(e.message)\n }\n }\n\n void refresh()\n }, 1000)\n }\n\n return () => {\n clearTimeout(refreshTokenTimeoutRef.current)\n }\n },\n [\n apiRoute,\n i18n.language,\n redirectToInactivityRoute,\n serverURL,\n setNewUser,\n tokenExpiration,\n userSlug,\n ],\n )\n\n const refreshCookieAsync = useCallback(\n async (skipSetUser?: boolean): Promise<ClientUser> => {\n try {\n const request = await requests.post(`${serverURL}${apiRoute}/${userSlug}/refresh-token`, {\n headers: {\n 'Accept-Language': i18n.language,\n },\n })\n\n if (request.status === 200) {\n const json = await request.json()\n if (!skipSetUser) {\n setNewUser(json)\n }\n return json.user\n }\n\n if (user) {\n setNewUser(null)\n redirectToInactivityRoute()\n }\n return null\n } catch (e) {\n toast.error(`Refreshing token failed: ${e.message}`)\n return null\n }\n },\n [apiRoute, i18n.language, redirectToInactivityRoute, serverURL, setNewUser, userSlug, user],\n )\n\n const logOut = useCallback(async () => {\n try {\n if (user && user.collection) {\n setNewUser(null)\n await requests.post(`${serverURL}${apiRoute}/${user.collection}/logout`)\n }\n } catch (_) {\n // fail silently and log the user out in state\n }\n\n return true\n }, [apiRoute, serverURL, setNewUser, user])\n\n const refreshPermissions = useCallback(\n async ({ locale }: { locale?: string } = {}) => {\n const params = qs.stringify(\n {\n locale,\n },\n {\n addQueryPrefix: true,\n },\n )\n\n try {\n const request = await requests.get(`${serverURL}${apiRoute}/access${params}`, {\n headers: {\n 'Accept-Language': i18n.language,\n },\n })\n\n if (request.status === 200) {\n const json: SanitizedPermissions = await request.json()\n setPermissions(json)\n } else {\n throw new Error(`Fetching permissions failed with status code ${request.status}`)\n }\n } catch (e) {\n toast.error(`Refreshing permissions failed: ${e.message}`)\n }\n },\n [serverURL, apiRoute, i18n],\n )\n\n const fetchFullUser = React.useCallback(async () => {\n try {\n const request = await requests.get(`${serverURL}${apiRoute}/${userSlug}/me`, {\n credentials: 'include',\n headers: {\n 'Accept-Language': i18n.language,\n },\n })\n\n if (request.status === 200) {\n const json: UserWithToken = await request.json()\n const user = null\n\n setNewUser(json)\n return user\n }\n } catch (e) {\n toast.error(`Fetching user failed: ${e.message}`)\n }\n\n return null\n }, [serverURL, apiRoute, userSlug, i18n.language, setNewUser])\n\n const fetchFullUserEvent = useEffectEvent(fetchFullUser)\n\n // On mount, get user and set\n useEffect(() => {\n void fetchFullUserEvent()\n }, [])\n\n const refreshCookieEvent = useEffectEvent(() => {\n if (id) {\n refreshCookie()\n }\n })\n\n // When location changes, refresh cookie\n useEffect(() => {\n refreshCookieEvent()\n }, [debouncedLocationChange])\n\n useEffect(() => {\n setLastLocationChange(Date.now())\n }, [pathname])\n\n useEffect(() => {\n let reminder: ReturnType<typeof setTimeout>\n let forceLogOut: ReturnType<typeof setTimeout>\n const now = Math.round(new Date().getTime() / 1000)\n const remainingTime = typeof tokenExpiration === 'number' ? tokenExpiration - now : 0\n const remindInTimeFromNow = Math.max(Math.min((remainingTime - 60) * 1000, maxTimeoutTime), 0)\n const forceLogOutInTimeFromNow = Math.max(Math.min(remainingTime * 1000, maxTimeoutTime), 0)\n\n if (!user) {\n clearTimeout(reminder)\n clearTimeout(forceLogOut)\n return\n }\n\n if (remainingTime > 0) {\n reminder = setTimeout(() => {\n openModal(stayLoggedInModalSlug)\n }, remindInTimeFromNow)\n\n forceLogOut = setTimeout(() => {\n setNewUser(null)\n redirectToInactivityRoute()\n }, forceLogOutInTimeFromNow)\n }\n\n return () => {\n if (reminder) {\n clearTimeout(reminder)\n }\n if (forceLogOut) {\n clearTimeout(forceLogOut)\n }\n }\n }, [tokenExpiration, openModal, i18n, setNewUser, user, redirectToInactivityRoute])\n\n return (\n <Context\n value={{\n fetchFullUser,\n logOut,\n permissions,\n refreshCookie,\n refreshCookieAsync,\n refreshPermissions,\n setPermissions,\n setUser: setNewUser,\n token: tokenInMemory,\n user,\n }}\n >\n {children}\n </Context>\n )\n}\n\nexport const useAuth = <T = ClientUser,>(): AuthContext<T> => use(Context) as AuthContext<T>\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { LivePreviewConfig } from 'payload';
|
|
2
|
+
import type { fieldSchemaToJSON } from 'payload/shared';
|
|
2
3
|
import type { Dispatch } from 'react';
|
|
3
4
|
import type React from 'react';
|
|
4
5
|
import type { usePopupWindow } from '../../hooks/usePopupWindow.js';
|
|
@@ -7,6 +8,7 @@ export interface LivePreviewContextType {
|
|
|
7
8
|
appIsReady: boolean;
|
|
8
9
|
breakpoint: LivePreviewConfig['breakpoints'][number]['name'];
|
|
9
10
|
breakpoints: LivePreviewConfig['breakpoints'];
|
|
11
|
+
fieldSchemaJSON?: ReturnType<typeof fieldSchemaToJSON>;
|
|
10
12
|
iframeHasLoaded: boolean;
|
|
11
13
|
iframeRef: React.RefObject<HTMLIFrameElement | null>;
|
|
12
14
|
isLivePreviewEnabled: boolean;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../../src/providers/LivePreview/context.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAA;AAChD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAA;AACrC,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAI9B,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAA;AACnE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAA;AAEzD,MAAM,WAAW,sBAAsB;IACrC,UAAU,EAAE,OAAO,CAAA;IACnB,UAAU,EAAE,iBAAiB,CAAC,aAAa,CAAC,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,CAAA;IAC5D,WAAW,EAAE,iBAAiB,CAAC,aAAa,CAAC,CAAA;IAC7C,eAAe,EAAE,OAAO,CAAA;IACxB,SAAS,EAAE,KAAK,CAAC,SAAS,CAAC,iBAAiB,GAAG,IAAI,CAAC,CAAA;IACpD,oBAAoB,EAAE,OAAO,CAAA;IAC7B,gBAAgB,EAAE,OAAO,CAAA;IACzB,WAAW,EAAE,OAAO,CAAA;IACpB,oBAAoB,CAAC,EAAE,OAAO,CAAA;IAC9B,kBAAkB,EAAE;QAClB,MAAM,EAAE,MAAM,CAAA;QACd,KAAK,EAAE,MAAM,CAAA;KACd,CAAA;IACD,eAAe,EAAE,UAAU,CAAC,OAAO,cAAc,CAAC,CAAC,iBAAiB,CAAC,CAAA;IACrE,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC,IAAI,GAAG,MAAM,CAAC,CAAA;IACzC,iBAAiB,EAAE,QAAQ,GAAG,OAAO,CAAA;IACrC,aAAa,EAAE,CAAC,UAAU,EAAE,OAAO,KAAK,IAAI,CAAA;IAC5C,aAAa,EAAE,CAAC,UAAU,EAAE,iBAAiB,CAAC,aAAa,CAAC,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,KAAK,IAAI,CAAA;IACrF,SAAS,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAA;IACnC,kBAAkB,EAAE,CAAC,MAAM,EAAE,OAAO,KAAK,IAAI,CAAA;IAC7C,mBAAmB,EAAE,CAAC,gBAAgB,EAAE,OAAO,KAAK,IAAI,CAAA;IACxD,qBAAqB,EAAE,CAAC,IAAI,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,KAAK,IAAI,CAAA;IACxE,oBAAoB,EAAE,CAAC,iBAAiB,EAAE,QAAQ,GAAG,OAAO,KAAK,IAAI,CAAA;IACrE,OAAO,EAAE,QAAQ,CAAC,iBAAiB,CAAC,CAAA;IACpC,kBAAkB,EAAE,CAAC,QAAQ,EAAE;QAAE,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAA;KAAE,KAAK,IAAI,CAAA;IAChE,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAA;IACjC,OAAO,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAA;IAC/B,IAAI,EAAE;QACJ,MAAM,EAAE,MAAM,CAAA;QACd,KAAK,EAAE,MAAM,CAAA;KACd,CAAA;IACD,eAAe,EAAE;QACf,CAAC,EAAE,MAAM,CAAA;QACT,CAAC,EAAE,MAAM,CAAA;KACV,CAAA;IACD,GAAG,EAAE,MAAM,GAAG,SAAS,CAAA;IACvB,IAAI,EAAE,MAAM,CAAA;CACb;AAED,eAAO,MAAM,kBAAkB,
|
|
1
|
+
{"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../../src/providers/LivePreview/context.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAA;AAChD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAA;AACvD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAA;AACrC,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAI9B,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAA;AACnE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAA;AAEzD,MAAM,WAAW,sBAAsB;IACrC,UAAU,EAAE,OAAO,CAAA;IACnB,UAAU,EAAE,iBAAiB,CAAC,aAAa,CAAC,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,CAAA;IAC5D,WAAW,EAAE,iBAAiB,CAAC,aAAa,CAAC,CAAA;IAC7C,eAAe,CAAC,EAAE,UAAU,CAAC,OAAO,iBAAiB,CAAC,CAAA;IACtD,eAAe,EAAE,OAAO,CAAA;IACxB,SAAS,EAAE,KAAK,CAAC,SAAS,CAAC,iBAAiB,GAAG,IAAI,CAAC,CAAA;IACpD,oBAAoB,EAAE,OAAO,CAAA;IAC7B,gBAAgB,EAAE,OAAO,CAAA;IACzB,WAAW,EAAE,OAAO,CAAA;IACpB,oBAAoB,CAAC,EAAE,OAAO,CAAA;IAC9B,kBAAkB,EAAE;QAClB,MAAM,EAAE,MAAM,CAAA;QACd,KAAK,EAAE,MAAM,CAAA;KACd,CAAA;IACD,eAAe,EAAE,UAAU,CAAC,OAAO,cAAc,CAAC,CAAC,iBAAiB,CAAC,CAAA;IACrE,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC,IAAI,GAAG,MAAM,CAAC,CAAA;IACzC,iBAAiB,EAAE,QAAQ,GAAG,OAAO,CAAA;IACrC,aAAa,EAAE,CAAC,UAAU,EAAE,OAAO,KAAK,IAAI,CAAA;IAC5C,aAAa,EAAE,CAAC,UAAU,EAAE,iBAAiB,CAAC,aAAa,CAAC,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,KAAK,IAAI,CAAA;IACrF,SAAS,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAA;IACnC,kBAAkB,EAAE,CAAC,MAAM,EAAE,OAAO,KAAK,IAAI,CAAA;IAC7C,mBAAmB,EAAE,CAAC,gBAAgB,EAAE,OAAO,KAAK,IAAI,CAAA;IACxD,qBAAqB,EAAE,CAAC,IAAI,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,KAAK,IAAI,CAAA;IACxE,oBAAoB,EAAE,CAAC,iBAAiB,EAAE,QAAQ,GAAG,OAAO,KAAK,IAAI,CAAA;IACrE,OAAO,EAAE,QAAQ,CAAC,iBAAiB,CAAC,CAAA;IACpC,kBAAkB,EAAE,CAAC,QAAQ,EAAE;QAAE,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAA;KAAE,KAAK,IAAI,CAAA;IAChE,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAA;IACjC,OAAO,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAA;IAC/B,IAAI,EAAE;QACJ,MAAM,EAAE,MAAM,CAAA;QACd,KAAK,EAAE,MAAM,CAAA;KACd,CAAA;IACD,eAAe,EAAE;QACf,CAAC,EAAE,MAAM,CAAA;QACT,CAAC,EAAE,MAAM,CAAA;KACV,CAAA;IACD,GAAG,EAAE,MAAM,GAAG,SAAS,CAAA;IACvB,IAAI,EAAE,MAAM,CAAA;CACb;AAED,eAAO,MAAM,kBAAkB,uCAsC7B,CAAA;AAEF,eAAO,MAAM,qBAAqB,8BAAgC,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"context.js","names":["createContext","use","LivePreviewContext","appIsReady","breakpoint","undefined","breakpoints","iframeHasLoaded","iframeRef","isLivePreviewEnabled","isLivePreviewing","isPopupOpen","measuredDeviceSize","height","width","openPopupWindow","popupRef","previewWindowType","setAppIsReady","setBreakpoint","setHeight","setIframeHasLoaded","setIsLivePreviewing","setMeasuredDeviceSize","setPreviewWindowType","setSize","setToolbarPosition","setWidth","setZoom","size","toolbarPosition","x","y","url","zoom","useLivePreviewContext"],"sources":["../../../src/providers/LivePreview/context.ts"],"sourcesContent":["'use client'\nimport type { LivePreviewConfig } from 'payload'\nimport type { Dispatch } from 'react'\nimport type React from 'react'\n\nimport { createContext, use } from 'react'\n\nimport type { usePopupWindow } from '../../hooks/usePopupWindow.js'\nimport type { SizeReducerAction } from './sizeReducer.js'\n\nexport interface LivePreviewContextType {\n appIsReady: boolean\n breakpoint: LivePreviewConfig['breakpoints'][number]['name']\n breakpoints: LivePreviewConfig['breakpoints']\n iframeHasLoaded: boolean\n iframeRef: React.RefObject<HTMLIFrameElement | null>\n isLivePreviewEnabled: boolean\n isLivePreviewing: boolean\n isPopupOpen: boolean\n listeningForMessages?: boolean\n measuredDeviceSize: {\n height: number\n width: number\n }\n openPopupWindow: ReturnType<typeof usePopupWindow>['openPopupWindow']\n popupRef?: React.RefObject<null | Window>\n previewWindowType: 'iframe' | 'popup'\n setAppIsReady: (appIsReady: boolean) => void\n setBreakpoint: (breakpoint: LivePreviewConfig['breakpoints'][number]['name']) => void\n setHeight: (height: number) => void\n setIframeHasLoaded: (loaded: boolean) => void\n setIsLivePreviewing: (isLivePreviewing: boolean) => void\n setMeasuredDeviceSize: (size: { height: number; width: number }) => void\n setPreviewWindowType: (previewWindowType: 'iframe' | 'popup') => void\n setSize: Dispatch<SizeReducerAction>\n setToolbarPosition: (position: { x: number; y: number }) => void\n setWidth: (width: number) => void\n setZoom: (zoom: number) => void\n size: {\n height: number\n width: number\n }\n toolbarPosition: {\n x: number\n y: number\n }\n url: string | undefined\n zoom: number\n}\n\nexport const LivePreviewContext = createContext<LivePreviewContextType>({\n appIsReady: false,\n breakpoint: undefined,\n breakpoints: undefined,\n iframeHasLoaded: false,\n iframeRef: undefined,\n isLivePreviewEnabled: undefined,\n isLivePreviewing: false,\n isPopupOpen: false,\n measuredDeviceSize: {\n height: 0,\n width: 0,\n },\n openPopupWindow: () => {},\n popupRef: undefined,\n previewWindowType: 'iframe',\n setAppIsReady: () => {},\n setBreakpoint: () => {},\n setHeight: () => {},\n setIframeHasLoaded: () => {},\n setIsLivePreviewing: () => {},\n setMeasuredDeviceSize: () => {},\n setPreviewWindowType: () => {},\n setSize: () => {},\n setToolbarPosition: () => {},\n setWidth: () => {},\n setZoom: () => {},\n size: {\n height: 0,\n width: 0,\n },\n toolbarPosition: {\n x: 0,\n y: 0,\n },\n url: undefined,\n zoom: 1,\n})\n\nexport const useLivePreviewContext = () => use(LivePreviewContext)\n"],"mappings":"AAAA;;
|
|
1
|
+
{"version":3,"file":"context.js","names":["createContext","use","LivePreviewContext","appIsReady","breakpoint","undefined","breakpoints","fieldSchemaJSON","iframeHasLoaded","iframeRef","isLivePreviewEnabled","isLivePreviewing","isPopupOpen","measuredDeviceSize","height","width","openPopupWindow","popupRef","previewWindowType","setAppIsReady","setBreakpoint","setHeight","setIframeHasLoaded","setIsLivePreviewing","setMeasuredDeviceSize","setPreviewWindowType","setSize","setToolbarPosition","setWidth","setZoom","size","toolbarPosition","x","y","url","zoom","useLivePreviewContext"],"sources":["../../../src/providers/LivePreview/context.ts"],"sourcesContent":["'use client'\nimport type { LivePreviewConfig } from 'payload'\nimport type { fieldSchemaToJSON } from 'payload/shared'\nimport type { Dispatch } from 'react'\nimport type React from 'react'\n\nimport { createContext, use } from 'react'\n\nimport type { usePopupWindow } from '../../hooks/usePopupWindow.js'\nimport type { SizeReducerAction } from './sizeReducer.js'\n\nexport interface LivePreviewContextType {\n appIsReady: boolean\n breakpoint: LivePreviewConfig['breakpoints'][number]['name']\n breakpoints: LivePreviewConfig['breakpoints']\n fieldSchemaJSON?: ReturnType<typeof fieldSchemaToJSON>\n iframeHasLoaded: boolean\n iframeRef: React.RefObject<HTMLIFrameElement | null>\n isLivePreviewEnabled: boolean\n isLivePreviewing: boolean\n isPopupOpen: boolean\n listeningForMessages?: boolean\n measuredDeviceSize: {\n height: number\n width: number\n }\n openPopupWindow: ReturnType<typeof usePopupWindow>['openPopupWindow']\n popupRef?: React.RefObject<null | Window>\n previewWindowType: 'iframe' | 'popup'\n setAppIsReady: (appIsReady: boolean) => void\n setBreakpoint: (breakpoint: LivePreviewConfig['breakpoints'][number]['name']) => void\n setHeight: (height: number) => void\n setIframeHasLoaded: (loaded: boolean) => void\n setIsLivePreviewing: (isLivePreviewing: boolean) => void\n setMeasuredDeviceSize: (size: { height: number; width: number }) => void\n setPreviewWindowType: (previewWindowType: 'iframe' | 'popup') => void\n setSize: Dispatch<SizeReducerAction>\n setToolbarPosition: (position: { x: number; y: number }) => void\n setWidth: (width: number) => void\n setZoom: (zoom: number) => void\n size: {\n height: number\n width: number\n }\n toolbarPosition: {\n x: number\n y: number\n }\n url: string | undefined\n zoom: number\n}\n\nexport const LivePreviewContext = createContext<LivePreviewContextType>({\n appIsReady: false,\n breakpoint: undefined,\n breakpoints: undefined,\n fieldSchemaJSON: undefined,\n iframeHasLoaded: false,\n iframeRef: undefined,\n isLivePreviewEnabled: undefined,\n isLivePreviewing: false,\n isPopupOpen: false,\n measuredDeviceSize: {\n height: 0,\n width: 0,\n },\n openPopupWindow: () => {},\n popupRef: undefined,\n previewWindowType: 'iframe',\n setAppIsReady: () => {},\n setBreakpoint: () => {},\n setHeight: () => {},\n setIframeHasLoaded: () => {},\n setIsLivePreviewing: () => {},\n setMeasuredDeviceSize: () => {},\n setPreviewWindowType: () => {},\n setSize: () => {},\n setToolbarPosition: () => {},\n setWidth: () => {},\n setZoom: () => {},\n size: {\n height: 0,\n width: 0,\n },\n toolbarPosition: {\n x: 0,\n y: 0,\n },\n url: undefined,\n zoom: 1,\n})\n\nexport const useLivePreviewContext = () => use(LivePreviewContext)\n"],"mappings":"AAAA;;AAMA,SAASA,aAAa,EAAEC,GAAG,QAAQ;AA8CnC,OAAO,MAAMC,kBAAA,GAAqBF,aAAA,CAAsC;EACtEG,UAAA,EAAY;EACZC,UAAA,EAAYC,SAAA;EACZC,WAAA,EAAaD,SAAA;EACbE,eAAA,EAAiBF,SAAA;EACjBG,eAAA,EAAiB;EACjBC,SAAA,EAAWJ,SAAA;EACXK,oBAAA,EAAsBL,SAAA;EACtBM,gBAAA,EAAkB;EAClBC,WAAA,EAAa;EACbC,kBAAA,EAAoB;IAClBC,MAAA,EAAQ;IACRC,KAAA,EAAO;EACT;EACAC,eAAA,EAAiBA,CAAA,MAAO;EACxBC,QAAA,EAAUZ,SAAA;EACVa,iBAAA,EAAmB;EACnBC,aAAA,EAAeA,CAAA,MAAO;EACtBC,aAAA,EAAeA,CAAA,MAAO;EACtBC,SAAA,EAAWA,CAAA,MAAO;EAClBC,kBAAA,EAAoBA,CAAA,MAAO;EAC3BC,mBAAA,EAAqBA,CAAA,MAAO;EAC5BC,qBAAA,EAAuBA,CAAA,MAAO;EAC9BC,oBAAA,EAAsBA,CAAA,MAAO;EAC7BC,OAAA,EAASA,CAAA,MAAO;EAChBC,kBAAA,EAAoBA,CAAA,MAAO;EAC3BC,QAAA,EAAUA,CAAA,MAAO;EACjBC,OAAA,EAASA,CAAA,MAAO;EAChBC,IAAA,EAAM;IACJhB,MAAA,EAAQ;IACRC,KAAA,EAAO;EACT;EACAgB,eAAA,EAAiB;IACfC,CAAA,EAAG;IACHC,CAAA,EAAG;EACL;EACAC,GAAA,EAAK7B,SAAA;EACL8B,IAAA,EAAM;AACR;AAEA,OAAO,MAAMC,qBAAA,GAAwBA,CAAA,KAAMnC,GAAA,CAAIC,kBAAA","ignoreList":[]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/providers/LivePreview/index.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAyB,iBAAiB,EAAE,MAAM,SAAS,CAAA;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/providers/LivePreview/index.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAyB,iBAAiB,EAAE,MAAM,SAAS,CAAA;AAIvE,OAAO,KAA4D,MAAM,OAAO,CAAA;AAUhF,MAAM,MAAM,wBAAwB,GAAG;IACrC,UAAU,CAAC,EAAE,OAAO,CAAA;IACpB,WAAW,CAAC,EAAE,iBAAiB,CAAC,aAAa,CAAC,CAAA;IAC9C,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAA;IACzB,UAAU,CAAC,EAAE;QACX,MAAM,EAAE,MAAM,CAAA;QACd,KAAK,EAAE,MAAM,CAAA;KACd,CAAA;IACD,oBAAoB,CAAC,EAAE,OAAO,CAAA;IAC9B,gBAAgB,EAAE,OAAO,CAAA;IACzB,GAAG,EAAE,MAAM,CAAA;CACZ,CAAA;AAUD,eAAO,MAAM,mBAAmB,EAAE,KAAK,CAAC,EAAE,CAAC,wBAAwB,CAuOlE,CAAA"}
|
|
@@ -2,10 +2,12 @@
|
|
|
2
2
|
|
|
3
3
|
import { jsx as _jsx } from "react/jsx-runtime";
|
|
4
4
|
import { DndContext } from '@dnd-kit/core';
|
|
5
|
+
import { fieldSchemaToJSON } from 'payload/shared';
|
|
5
6
|
import React, { useCallback, useEffect, useMemo, useRef, useState } from 'react';
|
|
6
7
|
import { usePopupWindow } from '../../hooks/usePopupWindow.js';
|
|
7
8
|
import { useDocumentInfo } from '../../providers/DocumentInfo/index.js';
|
|
8
9
|
import { usePreferences } from '../../providers/Preferences/index.js';
|
|
10
|
+
import { useConfig } from '../Config/index.js';
|
|
9
11
|
import { customCollisionDetection } from './collisionDetection.js';
|
|
10
12
|
import { LivePreviewContext } from './context.js';
|
|
11
13
|
import { sizeReducer } from './sizeReducer.js';
|
|
@@ -56,6 +58,10 @@ export const LivePreviewProvider = ({
|
|
|
56
58
|
} = usePreferences();
|
|
57
59
|
const iframeRef = React.useRef(null);
|
|
58
60
|
const [iframeHasLoaded, setIframeHasLoaded] = useState(false);
|
|
61
|
+
const {
|
|
62
|
+
config,
|
|
63
|
+
getEntityConfig
|
|
64
|
+
} = useConfig();
|
|
59
65
|
const [zoom, setZoom] = useState(1);
|
|
60
66
|
const [position, setPosition] = useState({
|
|
61
67
|
x: 0,
|
|
@@ -69,7 +75,12 @@ export const LivePreviewProvider = ({
|
|
|
69
75
|
height: 0,
|
|
70
76
|
width: 0
|
|
71
77
|
});
|
|
78
|
+
const entityConfig = getEntityConfig({
|
|
79
|
+
collectionSlug,
|
|
80
|
+
globalSlug
|
|
81
|
+
});
|
|
72
82
|
const [breakpoint, setBreakpoint] = React.useState('responsive');
|
|
83
|
+
const [fieldSchemaJSON] = useState(() => fieldSchemaToJSON(entityConfig?.fields || [], config));
|
|
73
84
|
// The toolbar needs to freely drag and drop around the page
|
|
74
85
|
const handleDragEnd = ev => {
|
|
75
86
|
// only update position if the toolbar is completely within the preview area
|
|
@@ -158,6 +169,7 @@ export const LivePreviewProvider = ({
|
|
|
158
169
|
appIsReady,
|
|
159
170
|
breakpoint,
|
|
160
171
|
breakpoints,
|
|
172
|
+
fieldSchemaJSON,
|
|
161
173
|
iframeHasLoaded,
|
|
162
174
|
iframeRef,
|
|
163
175
|
isLivePreviewEnabled,
|