@payloadcms/ui 3.0.0-beta.90 → 3.0.0-beta.92

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.
Files changed (67) hide show
  1. package/dist/elements/AddNewRelation/index.d.ts.map +1 -1
  2. package/dist/elements/AddNewRelation/index.js +1 -1
  3. package/dist/elements/AddNewRelation/index.js.map +1 -1
  4. package/dist/elements/AddNewRelation/index.scss +14 -4
  5. package/dist/elements/AppHeader/index.js +41 -80
  6. package/dist/elements/AppHeader/index.js.map +1 -1
  7. package/dist/elements/Autosave/index.js +148 -231
  8. package/dist/elements/Autosave/index.js.map +1 -1
  9. package/dist/elements/Button/index.js +86 -218
  10. package/dist/elements/Button/index.js.map +1 -1
  11. package/dist/elements/Collapsible/index.js +44 -62
  12. package/dist/elements/Collapsible/index.js.map +1 -1
  13. package/dist/elements/Collapsible/index.scss +15 -28
  14. package/dist/elements/CopyToClipboard/index.js +20 -54
  15. package/dist/elements/CopyToClipboard/index.js.map +1 -1
  16. package/dist/elements/Dropzone/index.js +59 -119
  17. package/dist/elements/Dropzone/index.js.map +1 -1
  18. package/dist/elements/EditMany/index.js +124 -230
  19. package/dist/elements/EditMany/index.js.map +1 -1
  20. package/dist/elements/EditUpload/index.js +133 -206
  21. package/dist/elements/EditUpload/index.js.map +1 -1
  22. package/dist/elements/ListControls/index.js +82 -188
  23. package/dist/elements/ListControls/index.js.map +1 -1
  24. package/dist/elements/Nav/context.js +47 -83
  25. package/dist/elements/Nav/context.js.map +1 -1
  26. package/dist/elements/SaveButton/index.js +30 -81
  27. package/dist/elements/SaveButton/index.js.map +1 -1
  28. package/dist/elements/SaveDraftButton/index.js +54 -116
  29. package/dist/elements/SaveDraftButton/index.js.map +1 -1
  30. package/dist/elements/SearchFilter/index.js +21 -77
  31. package/dist/elements/SearchFilter/index.js.map +1 -1
  32. package/dist/elements/Upload/index.js +130 -280
  33. package/dist/elements/Upload/index.js.map +1 -1
  34. package/dist/exports/client/{CodeEditor-C4FLUUO7.js → CodeEditor-MTP455NO.js} +2 -2
  35. package/dist/exports/client/chunk-NJHSEGFB.js +14 -0
  36. package/dist/exports/client/{chunk-UGBVRIVY.js.map → chunk-NJHSEGFB.js.map} +2 -2
  37. package/dist/exports/client/index.d.ts +1 -1
  38. package/dist/exports/client/index.d.ts.map +1 -1
  39. package/dist/exports/client/index.js +19 -19
  40. package/dist/exports/client/index.js.map +3 -3
  41. package/dist/fields/Relationship/index.js +318 -504
  42. package/dist/fields/Relationship/index.js.map +1 -1
  43. package/dist/fields/Upload/HasMany/index.d.ts.map +1 -1
  44. package/dist/fields/Upload/HasMany/index.js +192 -422
  45. package/dist/fields/Upload/HasMany/index.js.map +1 -1
  46. package/dist/fields/Upload/HasMany/index.scss +19 -1
  47. package/dist/forms/Submit/index.js +12 -28
  48. package/dist/forms/Submit/index.js.map +1 -1
  49. package/dist/hooks/useDelay.js +15 -48
  50. package/dist/hooks/useDelay.js.map +1 -1
  51. package/dist/hooks/useDelayedRender.js +32 -71
  52. package/dist/hooks/useDelayedRender.js.map +1 -1
  53. package/dist/hooks/useIntersect.js +14 -20
  54. package/dist/hooks/useIntersect.js.map +1 -1
  55. package/dist/providers/Config/createClientConfig/collections.d.ts.map +1 -1
  56. package/dist/providers/Config/createClientConfig/collections.js +8 -6
  57. package/dist/providers/Config/createClientConfig/collections.js.map +1 -1
  58. package/dist/providers/Preferences/index.js +1 -3
  59. package/dist/providers/Preferences/index.js.map +1 -1
  60. package/dist/providers/Selection/index.js +102 -190
  61. package/dist/providers/Selection/index.js.map +1 -1
  62. package/dist/scss/app.scss +6 -6
  63. package/dist/scss/type.scss +4 -4
  64. package/dist/styles.css +1 -1
  65. package/package.json +9 -9
  66. package/dist/exports/client/chunk-UGBVRIVY.js +0 -14
  67. /package/dist/exports/client/{CodeEditor-C4FLUUO7.js.map → CodeEditor-MTP455NO.js.map} +0 -0
@@ -1,6 +1,5 @@
1
1
  'use client';
2
2
 
3
- import { c as _c } from "react/compiler-runtime";
4
3
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
5
4
  import { versionDefaults } from 'payload/shared';
6
5
  import React, { useEffect, useRef, useState } from 'react';
@@ -18,24 +17,20 @@ import './index.scss';
18
17
  const baseClass = 'autosave';
19
18
  // The minimum time the saving state should be shown
20
19
  const minimumAnimationTime = 1000;
21
- export const Autosave = t0 => {
22
- const $ = _c(45);
20
+ export const Autosave = ({
21
+ id,
22
+ collection,
23
+ global: globalDoc,
24
+ publishedDocUpdatedAt
25
+ }) => {
23
26
  const {
24
- id,
25
- collection,
26
- global: globalDoc,
27
- publishedDocUpdatedAt
28
- } = t0;
29
- const {
30
- config: t1
27
+ config: {
28
+ routes: {
29
+ api
30
+ },
31
+ serverURL
32
+ }
31
33
  } = useConfig();
32
- const {
33
- routes: t2,
34
- serverURL
35
- } = t1;
36
- const {
37
- api
38
- } = t2;
39
34
  const {
40
35
  docConfig,
41
36
  getVersions,
@@ -61,9 +56,7 @@ export const Autosave = t0 => {
61
56
  t
62
57
  } = useTranslation();
63
58
  let interval = versionDefaults.autosaveInterval;
64
- if (versionsConfig.drafts && versionsConfig.drafts.autosave) {
65
- interval = versionsConfig.drafts.autosave.interval;
66
- }
59
+ if (versionsConfig.drafts && versionsConfig.drafts.autosave) interval = versionsConfig.drafts.autosave.interval;
67
60
  const [saving, setSaving] = useState(false);
68
61
  const [lastSaved, setLastSaved] = useState();
69
62
  const debouncedFields = useDebounce(fields, interval);
@@ -73,230 +66,154 @@ export const Autosave = t0 => {
73
66
  const localeRef = useRef(locale);
74
67
  const debouncedRef = useRef(debouncedFields);
75
68
  debouncedRef.current = debouncedFields;
69
+ // Store fields in ref so the autosave func
70
+ // can always retrieve the most to date copies
71
+ // after the timeout has executed
76
72
  fieldRef.current = fields;
73
+ // Store modified in ref so the autosave func
74
+ // can bail out if modified becomes false while
75
+ // timing out during autosave
77
76
  modifiedRef.current = modified;
77
+ // Store locale in ref so the autosave func
78
+ // can always retrieve the most to date locale
78
79
  localeRef.current = locale;
79
- let t3;
80
- if ($[0] !== modified || $[1] !== collection || $[2] !== id || $[3] !== serverURL || $[4] !== api || $[5] !== globalDoc || $[6] !== submitted || $[7] !== versionsConfig || $[8] !== i18n || $[9] !== reportUpdate || $[10] !== setModified || $[11] !== getVersions || $[12] !== dispatchFields || $[13] !== setSubmitted) {
81
- t3 = () => {
82
- const abortController = new AbortController();
83
- let autosaveTimeout;
84
- autosaveTimeout = undefined;
85
- let startTimestamp;
86
- startTimestamp = undefined;
87
- let endTimestamp;
88
- endTimestamp = undefined;
89
- const autosave = () => {
90
- if (modified) {
91
- startTimestamp = new Date().getTime();
92
- setSaving(true);
93
- let url;
94
- let method;
95
- let entitySlug;
96
- if (collection && id) {
97
- entitySlug = collection.slug;
98
- url = `${serverURL}${api}/${entitySlug}/${id}?draft=true&autosave=true&locale=${localeRef.current}`;
99
- method = "PATCH";
100
- }
101
- if (globalDoc) {
102
- entitySlug = globalDoc.slug;
103
- url = `${serverURL}${api}/globals/${entitySlug}?draft=true&autosave=true&locale=${localeRef.current}`;
104
- method = "POST";
105
- }
106
- if (url) {
107
- if (modifiedRef.current) {
108
- const {
109
- data,
110
- valid
111
- } = {
112
- ...reduceFieldsToValuesWithValidation(fieldRef.current, true)
113
- };
114
- data._status = "draft";
115
- const skipSubmission = submitted && !valid && versionsConfig?.drafts && versionsConfig?.drafts?.validate;
116
- if (!skipSubmission) {
117
- fetch(url, {
118
- body: JSON.stringify(data),
119
- credentials: "include",
120
- headers: {
121
- "Accept-Language": i18n.language,
122
- "Content-Type": "application/json"
123
- },
124
- method,
125
- signal: abortController.signal
126
- }).then(res => {
127
- const newDate = new Date();
128
- endTimestamp = newDate.getTime();
129
- if (res.status === 200) {
130
- setLastSaved(newDate.getTime());
131
- reportUpdate({
132
- id,
133
- entitySlug,
134
- updatedAt: newDate.toISOString()
80
+ // When debounced fields change, autosave
81
+ useEffect(() => {
82
+ const abortController = new AbortController();
83
+ let autosaveTimeout = undefined;
84
+ // We need to log the time in order to figure out if we need to trigger the state off later
85
+ let startTimestamp = undefined;
86
+ let endTimestamp = undefined;
87
+ const autosave = () => {
88
+ if (modified) {
89
+ startTimestamp = new Date().getTime();
90
+ setSaving(true);
91
+ let url;
92
+ let method;
93
+ let entitySlug;
94
+ if (collection && id) {
95
+ entitySlug = collection.slug;
96
+ url = `${serverURL}${api}/${entitySlug}/${id}?draft=true&autosave=true&locale=${localeRef.current}`;
97
+ method = 'PATCH';
98
+ }
99
+ if (globalDoc) {
100
+ entitySlug = globalDoc.slug;
101
+ url = `${serverURL}${api}/globals/${entitySlug}?draft=true&autosave=true&locale=${localeRef.current}`;
102
+ method = 'POST';
103
+ }
104
+ if (url) {
105
+ if (modifiedRef.current) {
106
+ const {
107
+ data,
108
+ valid
109
+ } = {
110
+ ...reduceFieldsToValuesWithValidation(fieldRef.current, true)
111
+ };
112
+ data._status = 'draft';
113
+ const skipSubmission = submitted && !valid && versionsConfig?.drafts && versionsConfig?.drafts?.validate;
114
+ if (!skipSubmission) {
115
+ void fetch(url, {
116
+ body: JSON.stringify(data),
117
+ credentials: 'include',
118
+ headers: {
119
+ 'Accept-Language': i18n.language,
120
+ 'Content-Type': 'application/json'
121
+ },
122
+ method,
123
+ signal: abortController.signal
124
+ }).then(res => {
125
+ const newDate = new Date();
126
+ // We need to log the time in order to figure out if we need to trigger the state off later
127
+ endTimestamp = newDate.getTime();
128
+ if (res.status === 200) {
129
+ setLastSaved(newDate.getTime());
130
+ reportUpdate({
131
+ id,
132
+ entitySlug,
133
+ updatedAt: newDate.toISOString()
134
+ });
135
+ setModified(false);
136
+ void getVersions();
137
+ } else {
138
+ return res.json();
139
+ }
140
+ }).then(json => {
141
+ if (versionsConfig?.drafts && versionsConfig?.drafts?.validate && json?.errors) {
142
+ if (Array.isArray(json.errors)) {
143
+ const [fieldErrors, nonFieldErrors] = json.errors.reduce(([fieldErrs, nonFieldErrs], err) => {
144
+ const newFieldErrs = [];
145
+ const newNonFieldErrs = [];
146
+ if (err?.message) {
147
+ newNonFieldErrs.push(err);
148
+ }
149
+ if (Array.isArray(err?.data)) {
150
+ err.data.forEach(dataError => {
151
+ if (dataError?.field) {
152
+ newFieldErrs.push(dataError);
153
+ } else {
154
+ newNonFieldErrs.push(dataError);
155
+ }
156
+ });
157
+ }
158
+ return [[...fieldErrs, ...newFieldErrs], [...nonFieldErrs, ...newNonFieldErrs]];
159
+ }, [[], []]);
160
+ dispatchFields({
161
+ type: 'ADD_SERVER_ERRORS',
162
+ errors: fieldErrors
135
163
  });
136
- setModified(false);
137
- getVersions();
138
- } else {
139
- return res.json();
140
- }
141
- }).then(json => {
142
- if (versionsConfig?.drafts && versionsConfig?.drafts?.validate && json?.errors) {
143
- if (Array.isArray(json.errors)) {
144
- const [fieldErrors, nonFieldErrors] = json.errors.reduce((t4, err) => {
145
- const [fieldErrs, nonFieldErrs] = t4;
146
- const newFieldErrs = [];
147
- const newNonFieldErrs = [];
148
- if (err?.message) {
149
- newNonFieldErrs.push(err);
150
- }
151
- if (Array.isArray(err?.data)) {
152
- err.data.forEach(dataError => {
153
- if (dataError?.field) {
154
- newFieldErrs.push(dataError);
155
- } else {
156
- newNonFieldErrs.push(dataError);
157
- }
158
- });
159
- }
160
- return [[...fieldErrs, ...newFieldErrs], [...nonFieldErrs, ...newNonFieldErrs]];
161
- }, [[], []]);
162
- dispatchFields({
163
- type: "ADD_SERVER_ERRORS",
164
- errors: fieldErrors
165
- });
166
- nonFieldErrors.forEach(err_0 => {
167
- toast.error(err_0.message || i18n.t("error:unknown"));
168
- });
169
- setSubmitted(true);
170
- setSaving(false);
171
- return;
172
- }
173
- }
174
- }).then(() => {
175
- if (endTimestamp - startTimestamp < minimumAnimationTime) {
176
- autosaveTimeout = setTimeout(() => {
177
- setSaving(false);
178
- }, minimumAnimationTime - (endTimestamp - startTimestamp));
179
- } else {
164
+ nonFieldErrors.forEach(err_0 => {
165
+ toast.error(err_0.message || i18n.t('error:unknown'));
166
+ });
167
+ setSubmitted(true);
180
168
  setSaving(false);
169
+ return;
181
170
  }
182
- });
183
- }
171
+ }
172
+ }).then(() => {
173
+ // If request was faster than minimum animation time, animate the difference
174
+ if (endTimestamp - startTimestamp < minimumAnimationTime) {
175
+ autosaveTimeout = setTimeout(() => {
176
+ setSaving(false);
177
+ }, minimumAnimationTime - (endTimestamp - startTimestamp));
178
+ } else {
179
+ setSaving(false);
180
+ }
181
+ });
184
182
  }
185
183
  }
186
184
  }
187
- };
188
- autosave();
189
- return () => {
190
- if (autosaveTimeout) {
191
- clearTimeout(autosaveTimeout);
192
- }
193
- if (abortController.signal) {
194
- ;
195
- try {
196
- abortController.abort("Autosave closed early.");
197
- } catch (t5) {
198
- const error = t5;
199
- }
200
- }
201
- setSaving(false);
202
- };
185
+ }
203
186
  };
204
- $[0] = modified;
205
- $[1] = collection;
206
- $[2] = id;
207
- $[3] = serverURL;
208
- $[4] = api;
209
- $[5] = globalDoc;
210
- $[6] = submitted;
211
- $[7] = versionsConfig;
212
- $[8] = i18n;
213
- $[9] = reportUpdate;
214
- $[10] = setModified;
215
- $[11] = getVersions;
216
- $[12] = dispatchFields;
217
- $[13] = setSubmitted;
218
- $[14] = t3;
219
- } else {
220
- t3 = $[14];
221
- }
222
- const t4 = versionsConfig?.drafts;
223
- let t5;
224
- if ($[15] !== api || $[16] !== collection || $[17] !== dispatchFields || $[18] !== getVersions || $[19] !== globalDoc || $[20] !== i18n || $[21] !== id || $[22] !== interval || $[23] !== modified || $[24] !== reportUpdate || $[25] !== serverURL || $[26] !== setSubmitted || $[27] !== setModified || $[28] !== t4 || $[29] !== debouncedFields || $[30] !== submitted) {
225
- t5 = [api, collection, dispatchFields, getVersions, globalDoc, i18n, id, interval, modified, reportUpdate, serverURL, setSubmitted, setModified, t4, debouncedFields, submitted];
226
- $[15] = api;
227
- $[16] = collection;
228
- $[17] = dispatchFields;
229
- $[18] = getVersions;
230
- $[19] = globalDoc;
231
- $[20] = i18n;
232
- $[21] = id;
233
- $[22] = interval;
234
- $[23] = modified;
235
- $[24] = reportUpdate;
236
- $[25] = serverURL;
237
- $[26] = setSubmitted;
238
- $[27] = setModified;
239
- $[28] = t4;
240
- $[29] = debouncedFields;
241
- $[30] = submitted;
242
- $[31] = t5;
243
- } else {
244
- t5 = $[31];
245
- }
246
- useEffect(t3, t5);
247
- let t6;
248
- let t7;
249
- if ($[32] !== versions || $[33] !== publishedDocUpdatedAt) {
250
- t6 = () => {
251
- if (versions?.docs?.[0]) {
252
- setLastSaved(new Date(versions.docs[0].updatedAt).getTime());
253
- } else {
254
- if (publishedDocUpdatedAt) {
255
- setLastSaved(new Date(publishedDocUpdatedAt).getTime());
187
+ void autosave();
188
+ return () => {
189
+ if (autosaveTimeout) clearTimeout(autosaveTimeout);
190
+ if (abortController.signal) {
191
+ try {
192
+ abortController.abort('Autosave closed early.');
193
+ } catch (error) {
194
+ // swallow error
256
195
  }
257
196
  }
197
+ setSaving(false);
258
198
  };
259
- t7 = [publishedDocUpdatedAt, versions];
260
- $[32] = versions;
261
- $[33] = publishedDocUpdatedAt;
262
- $[34] = t6;
263
- $[35] = t7;
264
- } else {
265
- t6 = $[34];
266
- t7 = $[35];
267
- }
268
- useEffect(t6, t7);
269
- let t8;
270
- if ($[36] !== saving || $[37] !== t) {
271
- t8 = saving && t("general:saving");
272
- $[36] = saving;
273
- $[37] = t;
274
- $[38] = t8;
275
- } else {
276
- t8 = $[38];
277
- }
278
- let t9;
279
- if ($[39] !== saving || $[40] !== lastSaved || $[41] !== i18n || $[42] !== t || $[43] !== t8) {
280
- t9 = _jsxs("div", {
281
- className: baseClass,
282
- children: [t8, !saving && Boolean(lastSaved) && _jsx(React.Fragment, {
283
- children: t("version:lastSavedAgo", {
284
- distance: formatTimeToNow({
285
- date: lastSaved,
286
- i18n
287
- })
199
+ }, [api, collection, dispatchFields, getVersions, globalDoc, i18n, id, interval, modified, reportUpdate, serverURL, setSubmitted, setModified, versionsConfig?.drafts, debouncedFields, submitted]);
200
+ useEffect(() => {
201
+ if (versions?.docs?.[0]) {
202
+ setLastSaved(new Date(versions.docs[0].updatedAt).getTime());
203
+ } else if (publishedDocUpdatedAt) {
204
+ setLastSaved(new Date(publishedDocUpdatedAt).getTime());
205
+ }
206
+ }, [publishedDocUpdatedAt, versions]);
207
+ return /*#__PURE__*/_jsxs("div", {
208
+ className: baseClass,
209
+ children: [saving && t('general:saving'), !saving && Boolean(lastSaved) && /*#__PURE__*/_jsx(React.Fragment, {
210
+ children: t('version:lastSavedAgo', {
211
+ distance: formatTimeToNow({
212
+ date: lastSaved,
213
+ i18n
288
214
  })
289
- })]
290
- });
291
- $[39] = saving;
292
- $[40] = lastSaved;
293
- $[41] = i18n;
294
- $[42] = t;
295
- $[43] = t8;
296
- $[44] = t9;
297
- } else {
298
- t9 = $[44];
299
- }
300
- return t9;
215
+ })
216
+ })]
217
+ });
301
218
  };
302
219
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["c","_c","versionDefaults","React","useEffect","useRef","useState","toast","useAllFormFields","useForm","useFormModified","useFormSubmitted","useDebounce","useConfig","useDocumentEvents","useDocumentInfo","useLocale","useTranslation","formatTimeToNow","reduceFieldsToValuesWithValidation","baseClass","minimumAnimationTime","Autosave","t0","$","id","collection","global","globalDoc","publishedDocUpdatedAt","config","t1","routes","t2","serverURL","api","docConfig","getVersions","versions","reportUpdate","dispatchFields","setModified","setSubmitted","submitted","versionsConfig","fields","formModified","code","locale","i18n","t","interval","autosaveInterval","drafts","autosave","saving","setSaving","lastSaved","setLastSaved","debouncedFields","modified","fieldRef","modifiedRef","localeRef","debouncedRef","current","t3","abortController","AbortController","autosaveTimeout","undefined","startTimestamp","endTimestamp","url","method","entitySlug","slug","data","valid","_status","skipSubmission","validate","fetch","body","JSON","stringify","credentials","headers","language","signal","then","res","newDate","Date","getTime","status","updatedAt","toISOString","json","errors","Array","isArray","fieldErrors","nonFieldErrors","reduce","t4","err","fieldErrs","nonFieldErrs","newFieldErrs","newNonFieldErrs","message","push","forEach","dataError","field","type","err_0","error","clearTimeout","abort","t5","t6","t7","docs","t8","t9","_jsxs","className","children","Boolean","_jsx","Fragment","distance","date"],"sources":["../../../src/elements/Autosave/index.tsx"],"sourcesContent":["'use client'\n// TODO: abstract the `next/navigation` dependency out from this component\nimport type { ClientCollectionConfig, ClientGlobalConfig } from 'payload'\n\nimport { versionDefaults } from 'payload/shared'\nimport React, { useEffect, useRef, useState } from 'react'\nimport { toast } from 'sonner'\n\nimport {\n useAllFormFields,\n useForm,\n useFormModified,\n useFormSubmitted,\n} from '../../forms/Form/context.js'\nimport { useDebounce } from '../../hooks/useDebounce.js'\nimport { useConfig } from '../../providers/Config/index.js'\nimport { useDocumentEvents } from '../../providers/DocumentEvents/index.js'\nimport { useDocumentInfo } from '../../providers/DocumentInfo/index.js'\nimport { useLocale } from '../../providers/Locale/index.js'\nimport { useTranslation } from '../../providers/Translation/index.js'\nimport { formatTimeToNow } from '../../utilities/formatDate.js'\nimport { reduceFieldsToValuesWithValidation } from '../../utilities/reduceFieldsToValuesWithValidation.js'\nimport './index.scss'\n\nconst baseClass = 'autosave'\n// The minimum time the saving state should be shown\nconst minimumAnimationTime = 1000\n\nexport type Props = {\n collection?: ClientCollectionConfig\n global?: ClientGlobalConfig\n id?: number | string\n publishedDocUpdatedAt: string\n}\n\nexport const Autosave: React.FC<Props> = ({\n id,\n collection,\n global: globalDoc,\n publishedDocUpdatedAt,\n}) => {\n const {\n config: {\n routes: { api },\n serverURL,\n },\n } = useConfig()\n const { docConfig, getVersions, versions } = useDocumentInfo()\n const { reportUpdate } = useDocumentEvents()\n const { dispatchFields, setModified, setSubmitted } = useForm()\n const submitted = useFormSubmitted()\n const versionsConfig = docConfig?.versions\n\n const [fields] = useAllFormFields()\n const formModified = useFormModified()\n const { code: locale } = useLocale()\n const { i18n, t } = useTranslation()\n\n let interval = versionDefaults.autosaveInterval\n if (versionsConfig.drafts && versionsConfig.drafts.autosave)\n interval = versionsConfig.drafts.autosave.interval\n\n const [saving, setSaving] = useState(false)\n const [lastSaved, setLastSaved] = useState<number>()\n const debouncedFields = useDebounce(fields, interval)\n const modified = useDebounce(formModified, interval)\n const fieldRef = useRef(fields)\n const modifiedRef = useRef(modified)\n const localeRef = useRef(locale)\n const debouncedRef = useRef(debouncedFields)\n\n debouncedRef.current = debouncedFields\n\n // Store fields in ref so the autosave func\n // can always retrieve the most to date copies\n // after the timeout has executed\n fieldRef.current = fields\n\n // Store modified in ref so the autosave func\n // can bail out if modified becomes false while\n // timing out during autosave\n modifiedRef.current = modified\n\n // Store locale in ref so the autosave func\n // can always retrieve the most to date locale\n localeRef.current = locale\n\n // When debounced fields change, autosave\n useEffect(() => {\n const abortController = new AbortController()\n let autosaveTimeout = undefined\n // We need to log the time in order to figure out if we need to trigger the state off later\n let startTimestamp = undefined\n let endTimestamp = undefined\n\n const autosave = () => {\n if (modified) {\n startTimestamp = new Date().getTime()\n\n setSaving(true)\n\n let url: string\n let method: string\n let entitySlug: string\n\n if (collection && id) {\n entitySlug = collection.slug\n url = `${serverURL}${api}/${entitySlug}/${id}?draft=true&autosave=true&locale=${localeRef.current}`\n method = 'PATCH'\n }\n\n if (globalDoc) {\n entitySlug = globalDoc.slug\n url = `${serverURL}${api}/globals/${entitySlug}?draft=true&autosave=true&locale=${localeRef.current}`\n method = 'POST'\n }\n\n if (url) {\n if (modifiedRef.current) {\n const { data, valid } = {\n ...reduceFieldsToValuesWithValidation(fieldRef.current, true),\n }\n data._status = 'draft'\n const skipSubmission =\n submitted && !valid && versionsConfig?.drafts && versionsConfig?.drafts?.validate\n\n if (!skipSubmission) {\n void fetch(url, {\n body: JSON.stringify(data),\n credentials: 'include',\n headers: {\n 'Accept-Language': i18n.language,\n 'Content-Type': 'application/json',\n },\n method,\n signal: abortController.signal,\n })\n .then((res) => {\n const newDate = new Date()\n // We need to log the time in order to figure out if we need to trigger the state off later\n endTimestamp = newDate.getTime()\n\n if (res.status === 200) {\n setLastSaved(newDate.getTime())\n\n reportUpdate({\n id,\n entitySlug,\n updatedAt: newDate.toISOString(),\n })\n setModified(false)\n void getVersions()\n } else {\n return res.json()\n }\n })\n .then((json) => {\n if (versionsConfig?.drafts && versionsConfig?.drafts?.validate && json?.errors) {\n if (Array.isArray(json.errors)) {\n const [fieldErrors, nonFieldErrors] = json.errors.reduce(\n ([fieldErrs, nonFieldErrs], err) => {\n const newFieldErrs = []\n const newNonFieldErrs = []\n\n if (err?.message) {\n newNonFieldErrs.push(err)\n }\n\n if (Array.isArray(err?.data)) {\n err.data.forEach((dataError) => {\n if (dataError?.field) {\n newFieldErrs.push(dataError)\n } else {\n newNonFieldErrs.push(dataError)\n }\n })\n }\n\n return [\n [...fieldErrs, ...newFieldErrs],\n [...nonFieldErrs, ...newNonFieldErrs],\n ]\n },\n [[], []],\n )\n\n dispatchFields({\n type: 'ADD_SERVER_ERRORS',\n errors: fieldErrors,\n })\n\n nonFieldErrors.forEach((err) => {\n toast.error(err.message || i18n.t('error:unknown'))\n })\n\n setSubmitted(true)\n setSaving(false)\n return\n }\n }\n })\n .then(() => {\n // If request was faster than minimum animation time, animate the difference\n if (endTimestamp - startTimestamp < minimumAnimationTime) {\n autosaveTimeout = setTimeout(\n () => {\n setSaving(false)\n },\n minimumAnimationTime - (endTimestamp - startTimestamp),\n )\n } else {\n setSaving(false)\n }\n })\n }\n }\n }\n }\n }\n\n void autosave()\n\n return () => {\n if (autosaveTimeout) clearTimeout(autosaveTimeout)\n if (abortController.signal) {\n try {\n abortController.abort('Autosave closed early.')\n } catch (error) {\n // swallow error\n }\n }\n setSaving(false)\n }\n }, [\n api,\n collection,\n dispatchFields,\n getVersions,\n globalDoc,\n i18n,\n id,\n interval,\n modified,\n reportUpdate,\n serverURL,\n setSubmitted,\n setModified,\n versionsConfig?.drafts,\n debouncedFields,\n submitted,\n ])\n\n useEffect(() => {\n if (versions?.docs?.[0]) {\n setLastSaved(new Date(versions.docs[0].updatedAt).getTime())\n } else if (publishedDocUpdatedAt) {\n setLastSaved(new Date(publishedDocUpdatedAt).getTime())\n }\n }, [publishedDocUpdatedAt, versions])\n\n return (\n <div className={baseClass}>\n {saving && t('general:saving')}\n {!saving && Boolean(lastSaved) && (\n <React.Fragment>\n {t('version:lastSavedAgo', {\n distance: formatTimeToNow({ date: lastSaved, i18n }),\n })}\n </React.Fragment>\n )}\n </div>\n )\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"index.js","names":["versionDefaults","React","useEffect","useRef","useState","toast","useAllFormFields","useForm","useFormModified","useFormSubmitted","useDebounce","useConfig","useDocumentEvents","useDocumentInfo","useLocale","useTranslation","formatTimeToNow","reduceFieldsToValuesWithValidation","baseClass","minimumAnimationTime","Autosave","id","collection","global","globalDoc","publishedDocUpdatedAt","config","routes","api","serverURL","docConfig","getVersions","versions","reportUpdate","dispatchFields","setModified","setSubmitted","submitted","versionsConfig","fields","formModified","code","locale","i18n","t","interval","autosaveInterval","drafts","autosave","saving","setSaving","lastSaved","setLastSaved","debouncedFields","modified","fieldRef","modifiedRef","localeRef","debouncedRef","current","abortController","AbortController","autosaveTimeout","undefined","startTimestamp","endTimestamp","Date","getTime","url","method","entitySlug","slug","data","valid","_status","skipSubmission","validate","fetch","body","JSON","stringify","credentials","headers","language","signal","then","res","newDate","status","updatedAt","toISOString","json","errors","Array","isArray","fieldErrors","nonFieldErrors","reduce","fieldErrs","nonFieldErrs","err","newFieldErrs","newNonFieldErrs","message","push","forEach","dataError","field","type","error","setTimeout","clearTimeout","abort","docs","_jsxs","className","Boolean","_jsx","Fragment","distance","date"],"sources":["../../../src/elements/Autosave/index.tsx"],"sourcesContent":["'use client'\n// TODO: abstract the `next/navigation` dependency out from this component\nimport type { ClientCollectionConfig, ClientGlobalConfig } from 'payload'\n\nimport { versionDefaults } from 'payload/shared'\nimport React, { useEffect, useRef, useState } from 'react'\nimport { toast } from 'sonner'\n\nimport {\n useAllFormFields,\n useForm,\n useFormModified,\n useFormSubmitted,\n} from '../../forms/Form/context.js'\nimport { useDebounce } from '../../hooks/useDebounce.js'\nimport { useConfig } from '../../providers/Config/index.js'\nimport { useDocumentEvents } from '../../providers/DocumentEvents/index.js'\nimport { useDocumentInfo } from '../../providers/DocumentInfo/index.js'\nimport { useLocale } from '../../providers/Locale/index.js'\nimport { useTranslation } from '../../providers/Translation/index.js'\nimport { formatTimeToNow } from '../../utilities/formatDate.js'\nimport { reduceFieldsToValuesWithValidation } from '../../utilities/reduceFieldsToValuesWithValidation.js'\nimport './index.scss'\n\nconst baseClass = 'autosave'\n// The minimum time the saving state should be shown\nconst minimumAnimationTime = 1000\n\nexport type Props = {\n collection?: ClientCollectionConfig\n global?: ClientGlobalConfig\n id?: number | string\n publishedDocUpdatedAt: string\n}\n\nexport const Autosave: React.FC<Props> = ({\n id,\n collection,\n global: globalDoc,\n publishedDocUpdatedAt,\n}) => {\n const {\n config: {\n routes: { api },\n serverURL,\n },\n } = useConfig()\n const { docConfig, getVersions, versions } = useDocumentInfo()\n const { reportUpdate } = useDocumentEvents()\n const { dispatchFields, setModified, setSubmitted } = useForm()\n const submitted = useFormSubmitted()\n const versionsConfig = docConfig?.versions\n\n const [fields] = useAllFormFields()\n const formModified = useFormModified()\n const { code: locale } = useLocale()\n const { i18n, t } = useTranslation()\n\n let interval = versionDefaults.autosaveInterval\n if (versionsConfig.drafts && versionsConfig.drafts.autosave)\n interval = versionsConfig.drafts.autosave.interval\n\n const [saving, setSaving] = useState(false)\n const [lastSaved, setLastSaved] = useState<number>()\n const debouncedFields = useDebounce(fields, interval)\n const modified = useDebounce(formModified, interval)\n const fieldRef = useRef(fields)\n const modifiedRef = useRef(modified)\n const localeRef = useRef(locale)\n const debouncedRef = useRef(debouncedFields)\n\n debouncedRef.current = debouncedFields\n\n // Store fields in ref so the autosave func\n // can always retrieve the most to date copies\n // after the timeout has executed\n fieldRef.current = fields\n\n // Store modified in ref so the autosave func\n // can bail out if modified becomes false while\n // timing out during autosave\n modifiedRef.current = modified\n\n // Store locale in ref so the autosave func\n // can always retrieve the most to date locale\n localeRef.current = locale\n\n // When debounced fields change, autosave\n useEffect(() => {\n const abortController = new AbortController()\n let autosaveTimeout = undefined\n // We need to log the time in order to figure out if we need to trigger the state off later\n let startTimestamp = undefined\n let endTimestamp = undefined\n\n const autosave = () => {\n if (modified) {\n startTimestamp = new Date().getTime()\n\n setSaving(true)\n\n let url: string\n let method: string\n let entitySlug: string\n\n if (collection && id) {\n entitySlug = collection.slug\n url = `${serverURL}${api}/${entitySlug}/${id}?draft=true&autosave=true&locale=${localeRef.current}`\n method = 'PATCH'\n }\n\n if (globalDoc) {\n entitySlug = globalDoc.slug\n url = `${serverURL}${api}/globals/${entitySlug}?draft=true&autosave=true&locale=${localeRef.current}`\n method = 'POST'\n }\n\n if (url) {\n if (modifiedRef.current) {\n const { data, valid } = {\n ...reduceFieldsToValuesWithValidation(fieldRef.current, true),\n }\n data._status = 'draft'\n const skipSubmission =\n submitted && !valid && versionsConfig?.drafts && versionsConfig?.drafts?.validate\n\n if (!skipSubmission) {\n void fetch(url, {\n body: JSON.stringify(data),\n credentials: 'include',\n headers: {\n 'Accept-Language': i18n.language,\n 'Content-Type': 'application/json',\n },\n method,\n signal: abortController.signal,\n })\n .then((res) => {\n const newDate = new Date()\n // We need to log the time in order to figure out if we need to trigger the state off later\n endTimestamp = newDate.getTime()\n\n if (res.status === 200) {\n setLastSaved(newDate.getTime())\n\n reportUpdate({\n id,\n entitySlug,\n updatedAt: newDate.toISOString(),\n })\n setModified(false)\n void getVersions()\n } else {\n return res.json()\n }\n })\n .then((json) => {\n if (versionsConfig?.drafts && versionsConfig?.drafts?.validate && json?.errors) {\n if (Array.isArray(json.errors)) {\n const [fieldErrors, nonFieldErrors] = json.errors.reduce(\n ([fieldErrs, nonFieldErrs], err) => {\n const newFieldErrs = []\n const newNonFieldErrs = []\n\n if (err?.message) {\n newNonFieldErrs.push(err)\n }\n\n if (Array.isArray(err?.data)) {\n err.data.forEach((dataError) => {\n if (dataError?.field) {\n newFieldErrs.push(dataError)\n } else {\n newNonFieldErrs.push(dataError)\n }\n })\n }\n\n return [\n [...fieldErrs, ...newFieldErrs],\n [...nonFieldErrs, ...newNonFieldErrs],\n ]\n },\n [[], []],\n )\n\n dispatchFields({\n type: 'ADD_SERVER_ERRORS',\n errors: fieldErrors,\n })\n\n nonFieldErrors.forEach((err) => {\n toast.error(err.message || i18n.t('error:unknown'))\n })\n\n setSubmitted(true)\n setSaving(false)\n return\n }\n }\n })\n .then(() => {\n // If request was faster than minimum animation time, animate the difference\n if (endTimestamp - startTimestamp < minimumAnimationTime) {\n autosaveTimeout = setTimeout(\n () => {\n setSaving(false)\n },\n minimumAnimationTime - (endTimestamp - startTimestamp),\n )\n } else {\n setSaving(false)\n }\n })\n }\n }\n }\n }\n }\n\n void autosave()\n\n return () => {\n if (autosaveTimeout) clearTimeout(autosaveTimeout)\n if (abortController.signal) {\n try {\n abortController.abort('Autosave closed early.')\n } catch (error) {\n // swallow error\n }\n }\n setSaving(false)\n }\n }, [\n api,\n collection,\n dispatchFields,\n getVersions,\n globalDoc,\n i18n,\n id,\n interval,\n modified,\n reportUpdate,\n serverURL,\n setSubmitted,\n setModified,\n versionsConfig?.drafts,\n debouncedFields,\n submitted,\n ])\n\n useEffect(() => {\n if (versions?.docs?.[0]) {\n setLastSaved(new Date(versions.docs[0].updatedAt).getTime())\n } else if (publishedDocUpdatedAt) {\n setLastSaved(new Date(publishedDocUpdatedAt).getTime())\n }\n }, [publishedDocUpdatedAt, versions])\n\n return (\n <div className={baseClass}>\n {saving && t('general:saving')}\n {!saving && Boolean(lastSaved) && (\n <React.Fragment>\n {t('version:lastSavedAgo', {\n distance: formatTimeToNow({ date: lastSaved, i18n }),\n })}\n </React.Fragment>\n )}\n </div>\n )\n}\n"],"mappings":"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","ignoreList":[]}