@payloadcms/ui 3.68.0-internal-debug.2eb12b9 → 3.68.0-internal-debug.185cc5f

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 (253) hide show
  1. package/dist/elements/AnimateHeight/usePatchAnimateHeight.js +2 -2
  2. package/dist/elements/AnimateHeight/usePatchAnimateHeight.js.map +1 -1
  3. package/dist/elements/Autosave/index.js +1 -0
  4. package/dist/elements/Autosave/index.js.map +1 -1
  5. package/dist/elements/BulkUpload/EditMany/index.js +2 -2
  6. package/dist/elements/BulkUpload/EditMany/index.js.map +1 -1
  7. package/dist/elements/BulkUpload/FormsManager/index.js +8 -8
  8. package/dist/elements/BulkUpload/FormsManager/index.js.map +1 -1
  9. package/dist/elements/BulkUpload/index.js +12 -1
  10. package/dist/elements/BulkUpload/index.js.map +1 -1
  11. package/dist/elements/Button/index.js +2 -2
  12. package/dist/elements/Button/index.js.map +1 -1
  13. package/dist/elements/Button/types.js +13 -1
  14. package/dist/elements/Button/types.js.map +1 -1
  15. package/dist/elements/Card/index.js +5 -1
  16. package/dist/elements/Card/index.js.map +1 -1
  17. package/dist/elements/CodeEditor/CodeEditor.js +2 -2
  18. package/dist/elements/CodeEditor/CodeEditor.js.map +1 -1
  19. package/dist/elements/CodeEditor/types.js +3 -1
  20. package/dist/elements/CodeEditor/types.js.map +1 -1
  21. package/dist/elements/Collapsible/index.js +8 -1
  22. package/dist/elements/Collapsible/index.js.map +1 -1
  23. package/dist/elements/Combobox/index.js +6 -0
  24. package/dist/elements/Combobox/index.js.map +1 -1
  25. package/dist/elements/DatePicker/DatePicker.js +1 -0
  26. package/dist/elements/DatePicker/DatePicker.js.map +1 -1
  27. package/dist/elements/DatePicker/getFormattedLocale.js +1 -0
  28. package/dist/elements/DatePicker/getFormattedLocale.js.map +1 -1
  29. package/dist/elements/DeleteMany/index.js +25 -1
  30. package/dist/elements/DeleteMany/index.js.map +1 -1
  31. package/dist/elements/DocumentControls/index.js +1 -1
  32. package/dist/elements/DocumentControls/index.js.map +1 -1
  33. package/dist/elements/DocumentDrawer/Provider.js +5 -1
  34. package/dist/elements/DocumentDrawer/Provider.js.map +1 -1
  35. package/dist/elements/DocumentDrawer/types.js +11 -1
  36. package/dist/elements/DocumentDrawer/types.js.map +1 -1
  37. package/dist/elements/DraggableSortable/useDraggableSortable/index.js +1 -0
  38. package/dist/elements/DraggableSortable/useDraggableSortable/index.js.map +1 -1
  39. package/dist/elements/Drawer/index.js +3 -1
  40. package/dist/elements/Drawer/index.js.map +1 -1
  41. package/dist/elements/EditMany/DrawerContent.js +15 -1
  42. package/dist/elements/EditMany/DrawerContent.js.map +1 -1
  43. package/dist/elements/EditMany/index.js +3 -1
  44. package/dist/elements/EditMany/index.js.map +1 -1
  45. package/dist/elements/FolderView/Drawers/MoveToFolder/index.js +8 -1
  46. package/dist/elements/FolderView/Drawers/MoveToFolder/index.js.map +1 -1
  47. package/dist/elements/FolderView/FolderFileCard/index.js +1 -0
  48. package/dist/elements/FolderView/FolderFileCard/index.js.map +1 -1
  49. package/dist/elements/FolderView/MoveDocToFolder/index.js +2 -3
  50. package/dist/elements/FolderView/MoveDocToFolder/index.js.map +1 -1
  51. package/dist/elements/HTMLDiff/diff/index.js +24 -3
  52. package/dist/elements/HTMLDiff/diff/index.js.map +1 -1
  53. package/dist/elements/HydrateAuthProvider/index.js +6 -1
  54. package/dist/elements/HydrateAuthProvider/index.js.map +1 -1
  55. package/dist/elements/LeaveWithoutSaving/usePreventLeave.js +3 -1
  56. package/dist/elements/LeaveWithoutSaving/usePreventLeave.js.map +1 -1
  57. package/dist/elements/Link/index.js +5 -1
  58. package/dist/elements/Link/index.js.map +1 -1
  59. package/dist/elements/ListControls/types.js +7 -1
  60. package/dist/elements/ListControls/types.js.map +1 -1
  61. package/dist/elements/ListDrawer/DrawerContent.js +2 -2
  62. package/dist/elements/ListDrawer/DrawerContent.js.map +1 -1
  63. package/dist/elements/ListDrawer/Provider.js +8 -1
  64. package/dist/elements/ListDrawer/Provider.js.map +1 -1
  65. package/dist/elements/ListDrawer/index.js +2 -1
  66. package/dist/elements/ListDrawer/index.js.map +1 -1
  67. package/dist/elements/ListDrawer/types.js +5 -1
  68. package/dist/elements/ListDrawer/types.js.map +1 -1
  69. package/dist/elements/ListHeader/TitleActions/ListBulkUploadButton.js +5 -1
  70. package/dist/elements/ListHeader/TitleActions/ListBulkUploadButton.js.map +1 -1
  71. package/dist/elements/ListSelection/index.js +11 -1
  72. package/dist/elements/ListSelection/index.js.map +1 -1
  73. package/dist/elements/LivePreview/Toolbar/Controls/index.js +1 -1
  74. package/dist/elements/LivePreview/Toolbar/Controls/index.js.map +1 -1
  75. package/dist/elements/Logout/index.js +5 -1
  76. package/dist/elements/Logout/index.js.map +1 -1
  77. package/dist/elements/Pill/index.js +5 -2
  78. package/dist/elements/Pill/index.js.map +1 -1
  79. package/dist/elements/PublishMany/index.js +3 -1
  80. package/dist/elements/PublishMany/index.js.map +1 -1
  81. package/dist/elements/QueryPresets/QueryPresetBar/index.js +1 -2
  82. package/dist/elements/QueryPresets/QueryPresetBar/index.js.map +1 -1
  83. package/dist/elements/ReactSelect/index.js +2 -2
  84. package/dist/elements/ReactSelect/index.js.map +1 -1
  85. package/dist/elements/ReactSelect/types.js +8 -1
  86. package/dist/elements/ReactSelect/types.js.map +1 -1
  87. package/dist/elements/RelationshipTable/index.js +2 -2
  88. package/dist/elements/RelationshipTable/index.js.map +1 -1
  89. package/dist/elements/RestoreMany/index.js +1 -0
  90. package/dist/elements/RestoreMany/index.js.map +1 -1
  91. package/dist/elements/SaveButton/index.js +1 -2
  92. package/dist/elements/SaveButton/index.js.map +1 -1
  93. package/dist/elements/SaveDraftButton/index.js +1 -2
  94. package/dist/elements/SaveDraftButton/index.js.map +1 -1
  95. package/dist/elements/SearchFilter/types.js +19 -1
  96. package/dist/elements/SearchFilter/types.js.map +1 -1
  97. package/dist/elements/Status/index.js +2 -2
  98. package/dist/elements/Status/index.js.map +1 -1
  99. package/dist/elements/StepNav/index.js +5 -1
  100. package/dist/elements/StepNav/index.js.map +1 -1
  101. package/dist/elements/Table/DefaultCell/fields/Select/index.js +4 -4
  102. package/dist/elements/Table/DefaultCell/fields/Select/index.js.map +1 -1
  103. package/dist/elements/Table/DefaultCell/index.js +2 -1
  104. package/dist/elements/Table/DefaultCell/index.js.map +1 -1
  105. package/dist/elements/Table/RelationshipProvider/index.js +3 -0
  106. package/dist/elements/Table/RelationshipProvider/index.js.map +1 -1
  107. package/dist/elements/Thumbnail/createThumbnail.js +12 -12
  108. package/dist/elements/Thumbnail/createThumbnail.js.map +1 -1
  109. package/dist/elements/Tooltip/index.js +3 -1
  110. package/dist/elements/Tooltip/index.js.map +1 -1
  111. package/dist/elements/UnpublishMany/index.js +3 -1
  112. package/dist/elements/UnpublishMany/index.js.map +1 -1
  113. package/dist/elements/Upload/index.js +8 -8
  114. package/dist/elements/Upload/index.js.map +1 -1
  115. package/dist/elements/WhereBuilder/Condition/Number/index.js +1 -0
  116. package/dist/elements/WhereBuilder/Condition/Number/index.js.map +1 -1
  117. package/dist/elements/WhereBuilder/Condition/Relationship/index.js +5 -6
  118. package/dist/elements/WhereBuilder/Condition/Relationship/index.js.map +1 -1
  119. package/dist/elements/WhereBuilder/Condition/Text/index.js +1 -0
  120. package/dist/elements/WhereBuilder/Condition/Text/index.js.map +1 -1
  121. package/dist/elements/WhereBuilder/index.js +2 -2
  122. package/dist/elements/WhereBuilder/index.js.map +1 -1
  123. package/dist/exports/client/index.js +26 -2
  124. package/dist/exports/client/index.js.map +1 -1
  125. package/dist/exports/shared/index.js +2 -1
  126. package/dist/exports/shared/index.js.map +1 -1
  127. package/dist/fields/Blocks/BlockSelector/index.js +3 -1
  128. package/dist/fields/Blocks/BlockSelector/index.js.map +1 -1
  129. package/dist/fields/Email/index.js +1 -1
  130. package/dist/fields/Email/index.js.map +1 -1
  131. package/dist/fields/Group/index.js +1 -1
  132. package/dist/fields/Group/index.js.map +1 -1
  133. package/dist/fields/Number/index.js +5 -3
  134. package/dist/fields/Number/index.js.map +1 -1
  135. package/dist/fields/Password/types.js +11 -1
  136. package/dist/fields/Password/types.js.map +1 -1
  137. package/dist/fields/Point/index.js +2 -2
  138. package/dist/fields/Point/index.js.map +1 -1
  139. package/dist/fields/Relationship/select-components/MultiValueLabel/index.js +4 -1
  140. package/dist/fields/Relationship/select-components/MultiValueLabel/index.js.map +1 -1
  141. package/dist/fields/Relationship/select-components/SingleValue/index.js +4 -1
  142. package/dist/fields/Relationship/select-components/SingleValue/index.js.map +1 -1
  143. package/dist/fields/Text/index.js +3 -2
  144. package/dist/fields/Text/index.js.map +1 -1
  145. package/dist/fields/Upload/Input.js +3 -1
  146. package/dist/fields/Upload/Input.js.map +1 -1
  147. package/dist/fields/Upload/types.js +1 -0
  148. package/dist/fields/Upload/types.js.map +1 -1
  149. package/dist/fields/shared/index.js +2 -3
  150. package/dist/fields/shared/index.js.map +1 -1
  151. package/dist/forms/Form/fieldReducer.js +2 -1
  152. package/dist/forms/Form/fieldReducer.js.map +1 -1
  153. package/dist/forms/Form/index.js +12 -9
  154. package/dist/forms/Form/index.js.map +1 -1
  155. package/dist/forms/Form/mergeServerFormState.js +11 -3
  156. package/dist/forms/Form/mergeServerFormState.js.map +1 -1
  157. package/dist/forms/Form/reduceToSerializableFields.js +2 -2
  158. package/dist/forms/Form/reduceToSerializableFields.js.map +1 -1
  159. package/dist/forms/Form/types.js +52 -1
  160. package/dist/forms/Form/types.js.map +1 -1
  161. package/dist/forms/NullifyField/index.js +2 -1
  162. package/dist/forms/NullifyField/index.js.map +1 -1
  163. package/dist/forms/WatchChildErrors/index.js +6 -1
  164. package/dist/forms/WatchChildErrors/index.js.map +1 -1
  165. package/dist/forms/fieldSchemasToFormState/addFieldStatePromise.js +20 -0
  166. package/dist/forms/fieldSchemasToFormState/addFieldStatePromise.js.map +1 -1
  167. package/dist/forms/fieldSchemasToFormState/index.js +33 -1
  168. package/dist/forms/fieldSchemasToFormState/index.js.map +1 -1
  169. package/dist/forms/fieldSchemasToFormState/isRowCollapsed.js +2 -2
  170. package/dist/forms/fieldSchemasToFormState/isRowCollapsed.js.map +1 -1
  171. package/dist/forms/fieldSchemasToFormState/iterateFields.js +16 -0
  172. package/dist/forms/fieldSchemasToFormState/iterateFields.js.map +1 -1
  173. package/dist/forms/fieldSchemasToFormState/renderField.js +2 -2
  174. package/dist/forms/fieldSchemasToFormState/renderField.js.map +1 -1
  175. package/dist/forms/fieldSchemasToFormState/serverFunctions/renderFieldServerFn.js +22 -1
  176. package/dist/forms/fieldSchemasToFormState/serverFunctions/renderFieldServerFn.js.map +1 -1
  177. package/dist/forms/fieldSchemasToFormState/types.js +5 -1
  178. package/dist/forms/fieldSchemasToFormState/types.js.map +1 -1
  179. package/dist/forms/useField/index.js +1 -0
  180. package/dist/forms/useField/index.js.map +1 -1
  181. package/dist/forms/useField/types.js +19 -1
  182. package/dist/forms/useField/types.js.map +1 -1
  183. package/dist/hooks/useControllableState.js +9 -1
  184. package/dist/hooks/useControllableState.js.map +1 -1
  185. package/dist/hooks/useDelayedRender.js +3 -1
  186. package/dist/hooks/useDelayedRender.js.map +1 -1
  187. package/dist/hooks/useHotkey.js +2 -2
  188. package/dist/hooks/useHotkey.js.map +1 -1
  189. package/dist/hooks/usePayloadAPI.js +3 -4
  190. package/dist/hooks/usePayloadAPI.js.map +1 -1
  191. package/dist/hooks/usePopupWindow.js +2 -2
  192. package/dist/hooks/usePopupWindow.js.map +1 -1
  193. package/dist/hooks/useQueue.js +15 -7
  194. package/dist/hooks/useQueue.js.map +1 -1
  195. package/dist/hooks/useResize.js +4 -3
  196. package/dist/hooks/useResize.js.map +1 -1
  197. package/dist/providers/Auth/index.js +35 -3
  198. package/dist/providers/Auth/index.js.map +1 -1
  199. package/dist/providers/Config/index.js +10 -1
  200. package/dist/providers/Config/index.js.map +1 -1
  201. package/dist/providers/DocumentInfo/index.js +6 -7
  202. package/dist/providers/DocumentInfo/index.js.map +1 -1
  203. package/dist/providers/DocumentInfo/types.js +25 -1
  204. package/dist/providers/DocumentInfo/types.js.map +1 -1
  205. package/dist/providers/Folders/index.js +44 -2
  206. package/dist/providers/Folders/index.js.map +1 -1
  207. package/dist/providers/ListQuery/types.js +5 -1
  208. package/dist/providers/ListQuery/types.js.map +1 -1
  209. package/dist/providers/LivePreview/context.js +11 -1
  210. package/dist/providers/LivePreview/context.js.map +1 -1
  211. package/dist/providers/LivePreview/index.js +7 -4
  212. package/dist/providers/LivePreview/index.js.map +1 -1
  213. package/dist/providers/Preferences/index.js +7 -2
  214. package/dist/providers/Preferences/index.js.map +1 -1
  215. package/dist/providers/RouteTransition/index.js +9 -9
  216. package/dist/providers/RouteTransition/index.js.map +1 -1
  217. package/dist/providers/Selection/index.js +7 -2
  218. package/dist/providers/Selection/index.js.map +1 -1
  219. package/dist/providers/ServerFunctions/index.js +25 -22
  220. package/dist/providers/ServerFunctions/index.js.map +1 -1
  221. package/dist/providers/TableColumns/buildColumnState/index.js +10 -9
  222. package/dist/providers/TableColumns/buildColumnState/index.js.map +1 -1
  223. package/dist/providers/TableColumns/buildColumnState/renderCell.js +4 -3
  224. package/dist/providers/TableColumns/buildColumnState/renderCell.js.map +1 -1
  225. package/dist/providers/TableColumns/types.js +17 -1
  226. package/dist/providers/TableColumns/types.js.map +1 -1
  227. package/dist/utilities/abortAndIgnore.js +4 -6
  228. package/dist/utilities/abortAndIgnore.js.map +1 -1
  229. package/dist/utilities/buildFieldSchemaMap/traverseFields.js +2 -2
  230. package/dist/utilities/buildFieldSchemaMap/traverseFields.js.map +1 -1
  231. package/dist/utilities/copyDataFromLocale.js +6 -2
  232. package/dist/utilities/copyDataFromLocale.js.map +1 -1
  233. package/dist/utilities/getDisplayedFieldValue.js +8 -8
  234. package/dist/utilities/getDisplayedFieldValue.js.map +1 -1
  235. package/dist/utilities/getFolderResultsComponentAndData.js +2 -1
  236. package/dist/utilities/getFolderResultsComponentAndData.js.map +1 -1
  237. package/dist/utilities/handleFormStateLocking.js +2 -2
  238. package/dist/utilities/handleFormStateLocking.js.map +1 -1
  239. package/dist/utilities/hasSavePermission.js +5 -1
  240. package/dist/utilities/hasSavePermission.js.map +1 -1
  241. package/dist/utilities/isURLAllowed.js +6 -6
  242. package/dist/utilities/isURLAllowed.js.map +1 -1
  243. package/dist/utilities/renderTable.js +2 -1
  244. package/dist/utilities/renderTable.js.map +1 -1
  245. package/dist/utilities/schedulePublishHandler.js +3 -1
  246. package/dist/utilities/schedulePublishHandler.js.map +1 -1
  247. package/dist/utilities/upsertPreferences.js +1 -0
  248. package/dist/utilities/upsertPreferences.js.map +1 -1
  249. package/dist/views/Edit/index.js +7 -7
  250. package/dist/views/Edit/index.js.map +1 -1
  251. package/dist/views/List/ListHeader/index.js +6 -1
  252. package/dist/views/List/ListHeader/index.js.map +1 -1
  253. package/package.json +6 -5
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/hooks/useQueue.ts"],"sourcesContent":["import { useCallback, useRef } from 'react'\n\ntype QueuedFunction = () => Promise<void>\n\ntype QueuedTaskOptions = {\n /**\n * A function that is called after the queue has processed a function\n * Used to perform side effects after processing the queue\n * @returns {void}\n */\n afterProcess?: () => void\n /**\n * A function that can be used to prevent the queue from processing under certain conditions\n * Can also be used to perform side effects before processing the queue\n * @returns {boolean} If `false`, the queue will not process\n */\n beforeProcess?: () => boolean | void\n}\n\ntype QueueTask = (fn: QueuedFunction, options?: QueuedTaskOptions) => void\n\n/**\n * A React hook that allows you to queue up functions to be executed in order.\n * This is useful when you need to ensure long running networks requests are processed sequentially.\n * Builds up a \"queue\" of functions to be executed in order, only ever processing the last function in the queue.\n * This ensures that a long queue of tasks doesn't cause a backlog of tasks to be processed.\n * E.g. if you queue a task and it begins running, then you queue 9 more tasks:\n * 1. The currently task will finish\n * 2. The next task in the queue will run\n * 3. All remaining tasks will be discarded\n * @returns {queueTask} A function used to queue a function.\n * @example\n * const { queueTask } = useQueue()\n * queueTask(async () => {\n * await fetch('https://api.example.com')\n * })\n */\nexport function useQueue(): {\n queueTask: QueueTask\n} {\n const queue = useRef<QueuedFunction[]>([])\n\n const isProcessing = useRef(false)\n\n const queueTask = useCallback<QueueTask>((fn, options) => {\n queue.current.push(fn)\n\n async function processQueue() {\n if (isProcessing.current) {\n return\n }\n\n // Allow the consumer to prevent the queue from processing under certain conditions\n if (typeof options?.beforeProcess === 'function') {\n const shouldContinue = options.beforeProcess()\n\n if (shouldContinue === false) {\n return\n }\n }\n\n while (queue.current.length > 0) {\n const latestTask = queue.current.pop() // Only process the last task in the queue\n queue.current = [] // Discard all other tasks\n\n isProcessing.current = true\n\n try {\n await latestTask()\n } catch (err) {\n console.error('Error in queued function:', err) // eslint-disable-line no-console\n } finally {\n isProcessing.current = false\n\n if (typeof options?.afterProcess === 'function') {\n options.afterProcess()\n }\n }\n }\n }\n\n void processQueue()\n }, [])\n\n return { queueTask }\n}\n"],"names":["useCallback","useRef","useQueue","queue","isProcessing","queueTask","fn","options","current","push","processQueue","beforeProcess","shouldContinue","length","latestTask","pop","err","console","error","afterProcess"],"mappings":"AAAA,SAASA,WAAW,EAAEC,MAAM,QAAQ,QAAO;AAqB3C;;;;;;;;;;;;;;;CAeC,GACD,OAAO,SAASC;IAGd,MAAMC,QAAQF,OAAyB,EAAE;IAEzC,MAAMG,eAAeH,OAAO;IAE5B,MAAMI,YAAYL,YAAuB,CAACM,IAAIC;QAC5CJ,MAAMK,OAAO,CAACC,IAAI,CAACH;QAEnB,eAAeI;YACb,IAAIN,aAAaI,OAAO,EAAE;gBACxB;YACF;YAEA,mFAAmF;YACnF,IAAI,OAAOD,SAASI,kBAAkB,YAAY;gBAChD,MAAMC,iBAAiBL,QAAQI,aAAa;gBAE5C,IAAIC,mBAAmB,OAAO;oBAC5B;gBACF;YACF;YAEA,MAAOT,MAAMK,OAAO,CAACK,MAAM,GAAG,EAAG;gBAC/B,MAAMC,aAAaX,MAAMK,OAAO,CAACO,GAAG,GAAG,0CAA0C;;gBACjFZ,MAAMK,OAAO,GAAG,EAAE,CAAC,0BAA0B;;gBAE7CJ,aAAaI,OAAO,GAAG;gBAEvB,IAAI;oBACF,MAAMM;gBACR,EAAE,OAAOE,KAAK;oBACZC,QAAQC,KAAK,CAAC,6BAA6BF,KAAK,iCAAiC;;gBACnF,SAAU;oBACRZ,aAAaI,OAAO,GAAG;oBAEvB,IAAI,OAAOD,SAASY,iBAAiB,YAAY;wBAC/CZ,QAAQY,YAAY;oBACtB;gBACF;YACF;QACF;QAEA,KAAKT;IACP,GAAG,EAAE;IAEL,OAAO;QAAEL;IAAU;AACrB"}
1
+ {"version":3,"sources":["../../src/hooks/useQueue.ts"],"sourcesContent":["import { useCallback, useRef } from 'react'\n\ntype QueuedFunction = () => Promise<void>\n\ntype QueuedTaskOptions = {\n /**\n * A function that is called after the queue has processed a function\n * Used to perform side effects after processing the queue\n * @returns {void}\n */\n afterProcess?: () => void\n /**\n * A function that can be used to prevent the queue from processing under certain conditions\n * Can also be used to perform side effects before processing the queue\n * @returns {boolean} If `false`, the queue will not process\n */\n beforeProcess?: () => boolean | void\n}\n\ntype QueueTask = (fn: QueuedFunction, options?: QueuedTaskOptions) => void\n\n/**\n * A React hook that allows you to queue up functions to be executed in order.\n * This is useful when you need to ensure long running networks requests are processed sequentially.\n * Builds up a \"queue\" of functions to be executed in order, only ever processing the last function in the queue.\n * This ensures that a long queue of tasks doesn't cause a backlog of tasks to be processed.\n * E.g. if you queue a task and it begins running, then you queue 9 more tasks:\n * 1. The currently task will finish\n * 2. The next task in the queue will run\n * 3. All remaining tasks will be discarded\n * @returns {queueTask} A function used to queue a function.\n * @example\n * const { queueTask } = useQueue()\n * queueTask(async () => {\n * await fetch('https://api.example.com')\n * })\n */\nexport function useQueue(): {\n queueTask: QueueTask\n} {\n const queue = useRef<QueuedFunction[]>([])\n\n const isProcessing = useRef(false)\n\n const queueTask = useCallback<QueueTask>((fn, options) => {\n queue.current.push(fn)\n\n async function processQueue() {\n if (isProcessing.current) {\n return\n }\n\n // Allow the consumer to prevent the queue from processing under certain conditions\n if (typeof options?.beforeProcess === 'function') {\n const shouldContinue = options.beforeProcess()\n\n if (shouldContinue === false) {\n return\n }\n }\n\n while (queue.current.length > 0) {\n const latestTask = queue.current.pop() // Only process the last task in the queue\n queue.current = [] // Discard all other tasks\n\n isProcessing.current = true\n\n try {\n await latestTask()\n } catch (err) {\n console.error('Error in queued function:', err) // eslint-disable-line no-console\n } finally {\n isProcessing.current = false\n\n if (typeof options?.afterProcess === 'function') {\n options.afterProcess()\n }\n }\n }\n }\n\n void processQueue()\n }, [])\n\n return { queueTask }\n}\n"],"names":["useCallback","useRef","useQueue","queue","isProcessing","queueTask","fn","options","current","push","processQueue","beforeProcess","shouldContinue","length","latestTask","pop","err","console","error","afterProcess"],"mappings":"AAAA,SAASA,WAAW,EAAEC,MAAM,QAAQ,QAAO;AAKzC;;;;GAIC,GAED;;;;GAIC,GAMH;;;;;;;;;;;;;;;CAeC,GACD,OAAO,SAASC;IAGd,MAAMC,QAAQF,OAAyB,EAAE;IAEzC,MAAMG,eAAeH,OAAO;IAE5B,MAAMI,YAAYL,YAAuB,CAACM,IAAIC;QAC5CJ,MAAMK,OAAO,CAACC,IAAI,CAACH;QAEnB,eAAeI;YACb,IAAIN,aAAaI,OAAO,EAAE;gBACxB;YACF;YAEA,mFAAmF;YACnF,IAAI,OAAOD,SAASI,kBAAkB,YAAY;gBAChD,MAAMC,iBAAiBL,QAAQI,aAAa;gBAE5C,IAAIC,mBAAmB,OAAO;oBAC5B;gBACF;YACF;YAEA,MAAOT,MAAMK,OAAO,CAACK,MAAM,GAAG,EAAG;gBAC/B,MAAMC,aAAaX,MAAMK,OAAO,CAACO,GAAG;gBAAG,0CAA0C;gBACjFZ,MAAMK,OAAO,GAAG,EAAE;gBAAC,0BAA0B;gBAE7CJ,aAAaI,OAAO,GAAG;gBAEvB,IAAI;oBACF,MAAMM;gBACR,EAAE,OAAOE,KAAK;oBACZC,QAAQC,KAAK,CAAC,6BAA6BF;gBAC7C,SADkD,iCAAiC;gBACzE;oBACRZ,aAAaI,OAAO,GAAG;oBAEvB,IAAI,OAAOD,SAASY,iBAAiB,YAAY;wBAC/CZ,QAAQY,YAAY;oBACtB;gBACF;YACF;QACF;QAEA,KAAKT;IACP,GAAG,EAAE;IAEL,OAAO;QAAEL;IAAU;AACrB"}
@@ -3,12 +3,13 @@ import { useEffect, useState } from 'react';
3
3
  export const useResize = (element)=>{
4
4
  const [size, setSize] = useState();
5
5
  useEffect(()=>{
6
- let observer// eslint-disable-line
7
- ;
6
+ let observer;
7
+ // eslint-disable-line
8
8
  if (element) {
9
9
  observer = new ResizeObserver((entries)=>{
10
10
  entries.forEach((entry)=>{
11
- const { contentBoxSize, contentRect } = entry;
11
+ const { contentBoxSize, contentRect } = // for Safari iOS compatibility, will be deprecated eventually (see https://developer.mozilla.org/en-US/docs/Web/API/ResizeObserverEntry/contentRect)
12
+ entry;
12
13
  let newWidth = 0;
13
14
  let newHeight = 0;
14
15
  if (contentBoxSize) {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/hooks/useResize.ts"],"sourcesContent":["'use client'\n\nimport { useEffect, useState } from 'react'\n\ninterface Size {\n height: number\n width: number\n}\n\ninterface Resize {\n size?: Size\n}\n\nexport const useResize = (element: HTMLElement): Resize => {\n const [size, setSize] = useState<Size>()\n\n useEffect(() => {\n let observer: any // eslint-disable-line\n\n if (element) {\n observer = new ResizeObserver((entries) => {\n entries.forEach((entry) => {\n const {\n contentBoxSize,\n contentRect, // for Safari iOS compatibility, will be deprecated eventually (see https://developer.mozilla.org/en-US/docs/Web/API/ResizeObserverEntry/contentRect)\n } = entry\n\n let newWidth = 0\n let newHeight = 0\n\n if (contentBoxSize) {\n const newSize = Array.isArray(contentBoxSize) ? contentBoxSize[0] : contentBoxSize\n\n if (newSize) {\n const { blockSize, inlineSize } = newSize\n newWidth = inlineSize\n newHeight = blockSize\n }\n } else if (contentRect) {\n // see note above for why this block is needed\n const { height, width } = contentRect\n newWidth = width\n newHeight = height\n }\n\n setSize({\n height: newHeight,\n width: newWidth,\n })\n })\n })\n\n observer.observe(element)\n }\n\n return () => {\n if (observer) {\n observer.unobserve(element)\n }\n }\n }, [element])\n\n return {\n size,\n }\n}\n"],"names":["useEffect","useState","useResize","element","size","setSize","observer","ResizeObserver","entries","forEach","entry","contentBoxSize","contentRect","newWidth","newHeight","newSize","Array","isArray","blockSize","inlineSize","height","width","observe","unobserve"],"mappings":"AAAA;AAEA,SAASA,SAAS,EAAEC,QAAQ,QAAQ,QAAO;AAW3C,OAAO,MAAMC,YAAY,CAACC;IACxB,MAAM,CAACC,MAAMC,QAAQ,GAAGJ;IAExBD,UAAU;QACR,IAAIM,QAAc,sBAAsB;;QAExC,IAAIH,SAAS;YACXG,WAAW,IAAIC,eAAe,CAACC;gBAC7BA,QAAQC,OAAO,CAAC,CAACC;oBACf,MAAM,EACJC,cAAc,EACdC,WAAW,EACZ,GAAGF;oBAEJ,IAAIG,WAAW;oBACf,IAAIC,YAAY;oBAEhB,IAAIH,gBAAgB;wBAClB,MAAMI,UAAUC,MAAMC,OAAO,CAACN,kBAAkBA,cAAc,CAAC,EAAE,GAAGA;wBAEpE,IAAII,SAAS;4BACX,MAAM,EAAEG,SAAS,EAAEC,UAAU,EAAE,GAAGJ;4BAClCF,WAAWM;4BACXL,YAAYI;wBACd;oBACF,OAAO,IAAIN,aAAa;wBACtB,8CAA8C;wBAC9C,MAAM,EAAEQ,MAAM,EAAEC,KAAK,EAAE,GAAGT;wBAC1BC,WAAWQ;wBACXP,YAAYM;oBACd;oBAEAf,QAAQ;wBACNe,QAAQN;wBACRO,OAAOR;oBACT;gBACF;YACF;YAEAP,SAASgB,OAAO,CAACnB;QACnB;QAEA,OAAO;YACL,IAAIG,UAAU;gBACZA,SAASiB,SAAS,CAACpB;YACrB;QACF;IACF,GAAG;QAACA;KAAQ;IAEZ,OAAO;QACLC;IACF;AACF,EAAC"}
1
+ {"version":3,"sources":["../../src/hooks/useResize.ts"],"sourcesContent":["'use client'\n\nimport { useEffect, useState } from 'react'\n\ninterface Size {\n height: number\n width: number\n}\n\ninterface Resize {\n size?: Size\n}\n\nexport const useResize = (element: HTMLElement): Resize => {\n const [size, setSize] = useState<Size>()\n\n useEffect(() => {\n let observer: any // eslint-disable-line\n\n if (element) {\n observer = new ResizeObserver((entries) => {\n entries.forEach((entry) => {\n const {\n contentBoxSize,\n contentRect, // for Safari iOS compatibility, will be deprecated eventually (see https://developer.mozilla.org/en-US/docs/Web/API/ResizeObserverEntry/contentRect)\n } = entry\n\n let newWidth = 0\n let newHeight = 0\n\n if (contentBoxSize) {\n const newSize = Array.isArray(contentBoxSize) ? contentBoxSize[0] : contentBoxSize\n\n if (newSize) {\n const { blockSize, inlineSize } = newSize\n newWidth = inlineSize\n newHeight = blockSize\n }\n } else if (contentRect) {\n // see note above for why this block is needed\n const { height, width } = contentRect\n newWidth = width\n newHeight = height\n }\n\n setSize({\n height: newHeight,\n width: newWidth,\n })\n })\n })\n\n observer.observe(element)\n }\n\n return () => {\n if (observer) {\n observer.unobserve(element)\n }\n }\n }, [element])\n\n return {\n size,\n }\n}\n"],"names":["useEffect","useState","useResize","element","size","setSize","observer","ResizeObserver","entries","forEach","entry","contentBoxSize","contentRect","newWidth","newHeight","newSize","Array","isArray","blockSize","inlineSize","height","width","observe","unobserve"],"mappings":"AAAA;AAEA,SAASA,SAAS,EAAEC,QAAQ,QAAQ,QAAO;AAW3C,OAAO,MAAMC,YAAY,CAACC;IACxB,MAAM,CAACC,MAAMC,QAAQ,GAAGJ;IAExBD,UAAU;QACR,IAAIM;QAAc,sBAAsB;QAExC,IAAIH,SAAS;YACXG,WAAW,IAAIC,eAAe,CAACC;gBAC7BA,QAAQC,OAAO,CAAC,CAACC;oBACf,MAAM,EACJC,cAAc,EACdC,WAAW,EACZ,GADc,qJAAqJ;oBAChKF;oBAEJ,IAAIG,WAAW;oBACf,IAAIC,YAAY;oBAEhB,IAAIH,gBAAgB;wBAClB,MAAMI,UAAUC,MAAMC,OAAO,CAACN,kBAAkBA,cAAc,CAAC,EAAE,GAAGA;wBAEpE,IAAII,SAAS;4BACX,MAAM,EAAEG,SAAS,EAAEC,UAAU,EAAE,GAAGJ;4BAClCF,WAAWM;4BACXL,YAAYI;wBACd;oBACF,OAAO,IAAIN,aAAa;wBACtB,8CAA8C;wBAC9C,MAAM,EAAEQ,MAAM,EAAEC,KAAK,EAAE,GAAGT;wBAC1BC,WAAWQ;wBACXP,YAAYM;oBACd;oBAEAf,QAAQ;wBACNe,QAAQN;wBACRO,OAAOR;oBACT;gBACF;YACF;YAEAP,SAASgB,OAAO,CAACnB;QACnB;QAEA,OAAO;YACL,IAAIG,UAAU;gBACZA,SAASiB,SAAS,CAACpB;YACrB;QACF;IACF,GAAG;QAACA;KAAQ;IAEZ,OAAO;QACLC;IACF;AACF,EAAC"}
@@ -12,7 +12,40 @@ import { useTranslation } from '../../providers/Translation/index.js';
12
12
  import { requests } from '../../utilities/api.js';
13
13
  import { useConfig } from '../Config/index.js';
14
14
  import { useRouteTransition } from '../RouteTransition/index.js';
15
- const Context = /*#__PURE__*/ createContext({});
15
+ /** seconds until expiration */ /**
16
+ * These are the permissions for the current user from a global scope.
17
+ *
18
+ * When checking for permissions on document specific level, use the `useDocumentInfo` hook instead.
19
+ *
20
+ * @example
21
+ *
22
+ * ```tsx
23
+ * import { useAuth } from 'payload/ui'
24
+ *
25
+ * const MyComponent: React.FC = () => {
26
+ * const { permissions } = useAuth()
27
+ *
28
+ * if (permissions?.collections?.myCollection?.create) {
29
+ * // user can create documents in 'myCollection'
30
+ * }
31
+ *
32
+ * return null
33
+ * }
34
+ * ```
35
+ *
36
+ * with useDocumentInfo:
37
+ *
38
+ * ```tsx
39
+ * import { useDocumentInfo } from 'payload/ui'
40
+ *
41
+ * const MyComponent: React.FC = () => {
42
+ * const { docPermissions } = useDocumentInfo()
43
+ * if (docPermissions?.create) {
44
+ * // user can create this document
45
+ * }
46
+ * return null
47
+ * } ```
48
+ */ const Context = /*#__PURE__*/ createContext({});
16
49
  const maxTimeoutMs = 2147483647;
17
50
  export function AuthProvider({ children, permissions: initialPermissions, user: initialUser }) {
18
51
  const pathname = usePathname();
@@ -157,9 +190,8 @@ export function AuthProvider({ children, permissions: initialPermissions, user:
157
190
  setNewUser(null);
158
191
  await requests.post(`${serverURL}${apiRoute}/${user.collection}/logout`);
159
192
  }
160
- } catch (_) {
193
+ } catch (_) {}
161
194
  // fail silently and log the user out in state
162
- }
163
195
  return true;
164
196
  }, [
165
197
  apiRoute,
@@ -1 +1 @@
1
- {"version":3,"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 /**\n * These are the permissions for the current user from a global scope.\n *\n * When checking for permissions on document specific level, use the `useDocumentInfo` hook instead.\n *\n * @example\n *\n * ```tsx\n * import { useAuth } from 'payload/ui'\n *\n * const MyComponent: React.FC = () => {\n * const { permissions } = useAuth()\n *\n * if (permissions?.collections?.myCollection?.create) {\n * // user can create documents in 'myCollection'\n * }\n *\n * return null\n * }\n * ```\n *\n * with useDocumentInfo:\n *\n * ```tsx\n * import { useDocumentInfo } from 'payload/ui'\n *\n * const MyComponent: React.FC = () => {\n * const { docPermissions } = useDocumentInfo()\n * if (docPermissions?.create) {\n * // user can create this document\n * }\n * return null\n * } ```\n */\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 autoLogin,\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 // Handler for reminder timeout - uses useEffectEvent to capture latest autoRefresh value\n const handleReminderTimeout = useEffectEvent(() => {\n if (autoRefresh) {\n refreshCookieEvent()\n } else {\n openModal(stayLoggedInModalSlug)\n }\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 handleReminderTimeout,\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 [redirectToInactivityRoute, revokeTokenAndExpire],\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 if (!user && autoLogin && !autoLogin.prefillOnly) {\n void fetchFullUserEvent()\n }\n }, [user, autoLogin])\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"],"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","autoLogin","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","handleReminderTimeout","refreshCookieEvent","setNewUser","userResponse","token","exp","expiresInMs","Math","max","min","Date","now","nextForceLogoutBufferMs","setTimeout","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","prefillOnly","value","setUser","useAuth"],"mappings":"AAAA;;AAGA,SAASA,QAAQ,QAAQ,qBAAoB;AAC7C,SAASC,WAAW,EAAEC,SAAS,QAAQ,qBAAoB;AAC3D,SAASC,cAAc,QAAQ,iBAAgB;AAC/C,YAAYC,QAAQ,SAAQ;AAC5B,OAAOC,SAASC,aAAa,EAAEC,GAAG,EAAEC,WAAW,EAAEC,SAAS,EAAEC,QAAQ,QAAQ,QAAO;AACnF,SAASC,KAAK,QAAQ,SAAQ;AAE9B,SAASC,qBAAqB,QAAQ,uCAAsC;AAC5E,SAASC,cAAc,QAAQ,gCAA+B;AAC9D,SAASC,cAAc,QAAQ,uCAAsC;AACrE,SAASC,QAAQ,QAAQ,yBAAwB;AACjD,SAASC,SAAS,QAAQ,qBAAoB;AAC9C,SAASC,kBAAkB,QAAQ,8BAA6B;AA0DhE,MAAMC,wBAAUZ,cAAc,CAAC;AAE/B,MAAMa,eAAe;AAQrB,OAAO,SAASC,aAAa,EAC3BC,QAAQ,EACRC,aAAaC,kBAAkB,EAC/BC,MAAMC,WAAW,EACX;IACN,MAAMC,WAAWzB;IACjB,MAAM0B,SAASzB;IAEf,MAAM,EAAE0B,MAAM,EAAE,GAAGZ;IAEnB,MAAM,EACJa,OAAO,EACLC,SAAS,EACTC,WAAW,EACXC,QAAQ,EAAEC,YAAYC,qBAAqB,EAAE,EAC7CV,MAAMW,QAAQ,EACf,EACDH,QAAQ,EAAEH,OAAOO,UAAU,EAAEC,KAAKC,QAAQ,EAAE,EAC5CC,SAAS,EACV,GAAGX;IAEJ,MAAM,EAAEY,IAAI,EAAE,GAAG1B;IACjB,MAAM,EAAE2B,cAAc,EAAEC,SAAS,EAAE,GAAG1C;IACtC,MAAM,EAAE2C,oBAAoB,EAAE,GAAG1B;IAEjC,MAAM,CAACO,MAAMoB,gBAAgB,GAAGlC,SAA4Be;IAC5D,MAAM,CAACoB,eAAeC,iBAAiB,GAAGpC;IAC1C,MAAM,CAACqC,mBAAmBC,qBAAqB,GAAGtC;IAClD,MAAM,CAACY,aAAa2B,eAAe,GAAGvC,SAA+Ba;IACrE,MAAM,CAAC2B,qBAAqBC,uBAAuB,GAAGzC,SAAiB;IACvE,MAAM,CAAC0C,oBAAoBC,sBAAsB,GAAG3C,SAAS;IAE7D,MAAM4C,yBAAyBjD,MAAMkD,MAAM,CAAgC;IAC3E,MAAMC,qBAAqBnD,MAAMkD,MAAM,CAAgC;IACvE,MAAME,wBAAwBpD,MAAMkD,MAAM,CAAgC;IAE1E,MAAMG,KAAKlC,MAAMkC;IAEjB,MAAMC,4BAA4BnD,YAAY;QAC5CmC,qBAAqB,IACnBhB,OAAOiC,OAAO,CACZzD,eAAe;gBACbiC;gBACAyB,MAAM,GAAG3B,wBAAwB4B,OAAOC,QAAQ,CAACrC,QAAQ,CAACsC,UAAU,CAAC5B,cAAc,CAAC,UAAU,EAAE6B,mBAAmBH,OAAOC,QAAQ,CAACrC,QAAQ,GAAG,GAAG,IAAI;YACvJ;QAIJe;IACF,GAAG;QAACd;QAAQS;QAAYF;QAAuBO;QAAgBE;KAAqB;IAEpF,MAAMuB,uBAAuB1D,YAAY;QACvCoC,gBAAgB;QAChBE,iBAAiBqB;QACjBnB,qBAAqBmB;QACrBC,aAAad,uBAAuBe,OAAO;IAC7C,GAAG,EAAE;IAEL,yFAAyF;IACzF,MAAMC,wBAAwBzD,eAAe;QAC3C,IAAIkB,aAAa;YACfwC;QACF,OAAO;YACL7B,UAAU9B;QACZ;IACF;IAEA,MAAM4D,aAAahE,YACjB,CAACiE;QACCL,aAAaZ,mBAAmBa,OAAO;QACvCD,aAAaX,sBAAsBY,OAAO;QAE1C,IAAII,cAAcjD,MAAM;YACtBoB,gBAAgB6B,aAAajD,IAAI;YACjCsB,iBAAiB2B,aAAaC,KAAK;YACnC1B,qBAAqByB,aAAaE,GAAG,GAAG;YAExC,MAAMC,cAAcC,KAAKC,GAAG,CAC1B,GACAD,KAAKE,GAAG,CAAC,AAACN,CAAAA,aAAaE,GAAG,IAAI,CAAA,IAAK,OAAOK,KAAKC,GAAG,IAAI9D;YAGxD,IAAIyD,aAAa;gBACf,MAAMM,0BAA0BL,KAAKE,GAAG,CAAC,QAAQH,cAAc;gBAC/DzB,uBAAuB+B;gBAEvB1B,mBAAmBa,OAAO,GAAGc,WAC3Bb,uBACAO,KAAKC,GAAG,CAACF,cAAcM,yBAAyB;gBAGlDzB,sBAAsBY,OAAO,GAAGc,WAAW;oBACzCjB;oBACAP;gBACF,GAAGiB;YACL;QACF,OAAO;YACLV;QACF;IACF,GACA;QAACP;QAA2BO;KAAqB;IAGnD,MAAMkB,gBAAgB5E,YACpB,CAAC6E;QACC,IAAI,CAAC3B,IAAI;YACP;QACF;QAEA,MAAMkB,cAAcC,KAAKC,GAAG,CAAC,GAAG,AAAC/B,CAAAA,qBAAqB,CAAA,IAAKiC,KAAKC,GAAG;QAEnE,IAAII,gBAAiBtC,qBAAqB6B,cAAc1B,sBAAsB,GAAI;YAChFkB,aAAad,uBAAuBe,OAAO;YAC3Cf,uBAAuBe,OAAO,GAAGc,WAAW;gBAC1C,IAAI;oBACF,MAAMG,UAAU,MAAMvE,SAASwE,IAAI,CACjC,GAAGhD,YAAYD,SAAS,CAAC,EAAEH,SAAS,sBAAsB,CAAC,EAC3D;wBACEqD,SAAS;4BACP,mBAAmBhD,KAAKiD,QAAQ;wBAClC;oBACF;oBAGF,IAAIH,QAAQI,MAAM,KAAK,KAAK;wBAC1B,MAAMC,OAAsB,MAAML,QAAQK,IAAI;wBAC9CnB,WAAWmB;oBACb,OAAO;wBACLnB,WAAW;wBACXb;oBACF;gBACF,EAAE,OAAOiC,GAAG;oBACVjF,MAAMkF,KAAK,CAACD,EAAEE,OAAO;gBACvB;YACF,GAAG;QACL;IACF,GACA;QACExD;QACAE,KAAKiD,QAAQ;QACb9B;QACApB;QACAiC;QACAzB;QACAZ;QACAe;QACAQ;KACD;IAGH,MAAMqC,qBAAqBvF,YACzB,OAAOwF;QACL,IAAI;YACF,MAAMV,UAAU,MAAMvE,SAASwE,IAAI,CAAC,GAAGhD,YAAYD,SAAS,CAAC,EAAEH,SAAS,cAAc,CAAC,EAAE;gBACvFqD,SAAS;oBACP,mBAAmBhD,KAAKiD,QAAQ;gBAClC;YACF;YAEA,IAAIH,QAAQI,MAAM,KAAK,KAAK;gBAC1B,MAAMC,OAAsB,MAAML,QAAQK,IAAI;gBAC9C,IAAI,CAACK,aAAa;oBAChBxB,WAAWmB;gBACb;gBACA,OAAOA,KAAKnE,IAAI;YAClB;YAEA,IAAIA,MAAM;gBACRgD,WAAW;gBACXb;YACF;QACF,EAAE,OAAOiC,GAAG;YACVjF,MAAMkF,KAAK,CAAC,CAAC,yBAAyB,EAAED,EAAEE,OAAO,EAAE;QACrD;QACA,OAAO;IACT,GACA;QAACxD;QAAUE,KAAKiD,QAAQ;QAAE9B;QAA2BpB;QAAWiC;QAAYrC;QAAUX;KAAK;IAG7F,MAAMyE,SAASzF,YAAY;QACzB,IAAI;YACF,IAAIgB,QAAQA,KAAK0E,UAAU,EAAE;gBAC3B1B,WAAW;gBACX,MAAMzD,SAASwE,IAAI,CAAC,GAAGhD,YAAYD,SAAS,CAAC,EAAEd,KAAK0E,UAAU,CAAC,OAAO,CAAC;YACzE;QACF,EAAE,OAAOC,GAAG;QACV,8CAA8C;QAChD;QAEA,OAAO;IACT,GAAG;QAAC7D;QAAUC;QAAWiC;QAAYhD;KAAK;IAE1C,MAAM4E,qBAAqB5F,YACzB,OAAO,EAAE6F,MAAM,EAAuB,GAAG,CAAC,CAAC;QACzC,MAAMC,SAASlG,GAAGmG,SAAS,CACzB;YACEF;QACF,GACA;YACEG,gBAAgB;QAClB;QAGF,IAAI;YACF,MAAMlB,UAAU,MAAMvE,SAAS0F,GAAG,CAAC,GAAGlE,YAAYD,SAAS,OAAO,EAAEgE,QAAQ,EAAE;gBAC5Ed,SAAS;oBACP,mBAAmBhD,KAAKiD,QAAQ;gBAClC;YACF;YAEA,IAAIH,QAAQI,MAAM,KAAK,KAAK;gBAC1B,MAAMC,OAA6B,MAAML,QAAQK,IAAI;gBACrD1C,eAAe0C;YACjB,OAAO;gBACL,MAAM,IAAIe,MAAM,CAAC,6CAA6C,EAAEpB,QAAQI,MAAM,EAAE;YAClF;QACF,EAAE,OAAOE,GAAG;YACVjF,MAAMkF,KAAK,CAAC,CAAC,+BAA+B,EAAED,EAAEE,OAAO,EAAE;QAC3D;IACF,GACA;QAACvD;QAAWD;QAAUE;KAAK;IAG7B,MAAMmE,gBAAgBtG,MAAMG,WAAW,CAAC;QACtC,IAAI;YACF,MAAM8E,UAAU,MAAMvE,SAAS0F,GAAG,CAAC,GAAGlE,YAAYD,SAAS,CAAC,EAAEH,SAAS,GAAG,CAAC,EAAE;gBAC3EyE,aAAa;gBACbpB,SAAS;oBACP,mBAAmBhD,KAAKiD,QAAQ;gBAClC;YACF;YAEA,IAAIH,QAAQI,MAAM,KAAK,KAAK;gBAC1B,MAAMC,OAAsB,MAAML,QAAQK,IAAI;gBAC9CnB,WAAWmB;gBACX,OAAOA,MAAMnE,QAAQ;YACvB;QACF,EAAE,OAAOoE,GAAG;YACVjF,MAAMkF,KAAK,CAAC,CAAC,sBAAsB,EAAED,EAAEE,OAAO,EAAE;QAClD;QAEA,OAAO;IACT,GAAG;QAACvD;QAAWD;QAAUH;QAAUK,KAAKiD,QAAQ;QAAEjB;KAAW;IAE7D,MAAMD,qBAAqB1D,eAAeuE;IAC1C3E,UAAU;QACR,wCAAwC;QACxC8D;IACF,GAAG;QAAC7C;KAAS;IAEb,MAAMmF,qBAAqBhG,eAAe8F;IAC1ClG,UAAU;QACR,eAAeqG;YACb,MAAMD;YACNxD,sBAAsB;QACxB;QAEA,KAAKyD;IACP,GAAG,EAAE;IAELrG,UAAU;QACR,IAAI,CAACe,QAAQM,aAAa,CAACA,UAAUiF,WAAW,EAAE;YAChD,KAAKF;QACP;IACF,GAAG;QAACrF;QAAMM;KAAU;IAEpBrB,UACE,IAAM;YACJ,iCAAiC;YACjC2D,aAAad,uBAAuBe,OAAO;YAC3CD,aAAaZ,mBAAmBa,OAAO;YACvCD,aAAaX,sBAAsBY,OAAO;QAC5C,GACA,EAAE;IAGJ,IAAI,CAAC7C,QAAQ,CAAC4B,oBAAoB;QAChC,OAAO;IACT;IAEA,qBACE,KAAClC;QACC8F,OAAO;YACLL;YACAV;YACA3E;YACA8D;YACAW;YACAK;YACAnD;YACAgE,SAASzC;YACTE,OAAO7B;YACPE;YACAvB;QACF;kBAECH;;AAGP;AAEA,OAAO,MAAM6F,UAAU,IAAuC3G,IAAIW,SAA0B"}
1
+ {"version":3,"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 /**\n * These are the permissions for the current user from a global scope.\n *\n * When checking for permissions on document specific level, use the `useDocumentInfo` hook instead.\n *\n * @example\n *\n * ```tsx\n * import { useAuth } from 'payload/ui'\n *\n * const MyComponent: React.FC = () => {\n * const { permissions } = useAuth()\n *\n * if (permissions?.collections?.myCollection?.create) {\n * // user can create documents in 'myCollection'\n * }\n *\n * return null\n * }\n * ```\n *\n * with useDocumentInfo:\n *\n * ```tsx\n * import { useDocumentInfo } from 'payload/ui'\n *\n * const MyComponent: React.FC = () => {\n * const { docPermissions } = useDocumentInfo()\n * if (docPermissions?.create) {\n * // user can create this document\n * }\n * return null\n * } ```\n */\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 autoLogin,\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 // Handler for reminder timeout - uses useEffectEvent to capture latest autoRefresh value\n const handleReminderTimeout = useEffectEvent(() => {\n if (autoRefresh) {\n refreshCookieEvent()\n } else {\n openModal(stayLoggedInModalSlug)\n }\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 handleReminderTimeout,\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 [redirectToInactivityRoute, revokeTokenAndExpire],\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 if (!user && autoLogin && !autoLogin.prefillOnly) {\n void fetchFullUserEvent()\n }\n }, [user, autoLogin])\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"],"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","autoLogin","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","handleReminderTimeout","refreshCookieEvent","setNewUser","userResponse","token","exp","expiresInMs","Math","max","min","Date","now","nextForceLogoutBufferMs","setTimeout","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","prefillOnly","value","setUser","useAuth"],"mappings":"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"}
@@ -3,7 +3,16 @@
3
3
  import { jsx as _jsx } from "react/jsx-runtime";
4
4
  import React, { createContext, use, useCallback, useEffect, useMemo } from 'react';
5
5
  import { useControllableState } from '../../hooks/useControllableState.js';
6
- const RootConfigContext = /*#__PURE__*/ createContext(undefined);
6
+ // Overload #1: collectionSlug only
7
+ // @todo remove "{} |" in 4.0, which would be a breaking change
8
+ // Overload #2: globalSlug only
9
+ // @todo remove "{} |" in 4.0, which would be a breaking change
10
+ // Overload #3: both/none (fall back to union | null)
11
+ /**
12
+ * Get a collection or global config by its slug. This is preferred over
13
+ * using `config.collections.find` or `config.globals.find`, because
14
+ * getEntityConfig uses a lookup map for O(1) lookups.
15
+ */ const RootConfigContext = /*#__PURE__*/ createContext(undefined);
7
16
  export const ConfigProvider = ({ children, config: configFromProps })=>{
8
17
  // Need to update local config state if config from props changes, for HMR.
9
18
  // That way, config changes will be updated in the UI immediately without needing a refresh.
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/providers/Config/index.tsx"],"sourcesContent":["/* eslint-disable perfectionist/sort-object-types */ // Need to disable this rule because the order of the overloads is important\n'use client'\nimport type {\n ClientCollectionConfig,\n ClientConfig,\n ClientGlobalConfig,\n CollectionSlug,\n GlobalSlug,\n} from 'payload'\n\nimport React, { createContext, use, useCallback, useEffect, useMemo } from 'react'\n\nimport { useControllableState } from '../../hooks/useControllableState.js'\n\ntype GetEntityConfigFn = {\n // Overload #1: collectionSlug only\n // @todo remove \"{} |\" in 4.0, which would be a breaking change\n (args: { collectionSlug: {} | CollectionSlug; globalSlug?: never }): ClientCollectionConfig\n\n // Overload #2: globalSlug only\n // @todo remove \"{} |\" in 4.0, which would be a breaking change\n (args: { collectionSlug?: never; globalSlug: {} | GlobalSlug }): ClientGlobalConfig\n\n // Overload #3: both/none (fall back to union | null)\n (args: {\n collectionSlug?: {} | CollectionSlug\n globalSlug?: {} | GlobalSlug\n }): ClientCollectionConfig | ClientGlobalConfig | null\n}\n\nexport type ClientConfigContext = {\n config: ClientConfig\n /**\n * Get a collection or global config by its slug. This is preferred over\n * using `config.collections.find` or `config.globals.find`, because\n * getEntityConfig uses a lookup map for O(1) lookups.\n */\n getEntityConfig: GetEntityConfigFn\n setConfig: (config: ClientConfig) => void\n}\n\nconst RootConfigContext = createContext<ClientConfigContext | undefined>(undefined)\n\nexport const ConfigProvider: React.FC<{\n readonly children: React.ReactNode\n readonly config: ClientConfig\n}> = ({ children, config: configFromProps }) => {\n // Need to update local config state if config from props changes, for HMR.\n // That way, config changes will be updated in the UI immediately without needing a refresh.\n // useControllableState handles this for us.\n const [config, setConfig] = useControllableState<ClientConfig>(configFromProps)\n\n // Build lookup maps for collections and globals so we can do O(1) lookups by slug\n const { collectionsBySlug, globalsBySlug } = useMemo(() => {\n const collectionsBySlug: Record<string, ClientCollectionConfig> = {}\n const globalsBySlug: Record<string, ClientGlobalConfig> = {}\n\n for (const collection of config.collections) {\n collectionsBySlug[collection.slug] = collection\n }\n\n for (const global of config.globals) {\n globalsBySlug[global.slug] = global\n }\n\n return { collectionsBySlug, globalsBySlug }\n }, [config])\n\n const getEntityConfig = useCallback<GetEntityConfigFn>(\n (args) => {\n if ('collectionSlug' in args) {\n return collectionsBySlug[args.collectionSlug] ?? null\n }\n\n if ('globalSlug' in args) {\n return globalsBySlug[args.globalSlug] ?? null\n }\n\n return null as any\n },\n [collectionsBySlug, globalsBySlug],\n )\n\n const value = useMemo(\n () => ({ config, getEntityConfig, setConfig }),\n [config, getEntityConfig, setConfig],\n )\n\n return <RootConfigContext value={value}>{children}</RootConfigContext>\n}\n\nexport const useConfig = (): ClientConfigContext => use(RootConfigContext)\n\n/**\n * This provider shadows the `ConfigProvider` on the _page_ level, allowing us to\n * update the config when needed, e.g. after authentication.\n * The layout `ConfigProvider` is not updated on page navigation / authentication,\n * as the layout does not re-render in those cases.\n *\n * If the config here has the same reference as the config from the layout, we\n * simply reuse the context from the layout to avoid unnecessary re-renders.\n *\n * @experimental This component is experimental and may change or be removed in future releases. Use at your own risk.\n */\nexport const PageConfigProvider: React.FC<{\n readonly children: React.ReactNode\n readonly config: ClientConfig\n}> = ({ children, config: configFromProps }) => {\n const { config: rootConfig, setConfig: setRootConfig } = useConfig()\n\n /**\n * This `useEffect` is required in order for the _page_ to be able to refresh the client config,\n * which may have been cached on the _layout_ level, where the `ConfigProvider` is managed.\n * Since the layout does not re-render on page navigation / authentication, we need to manually\n * update the config, as the user may have been authenticated in the process, which affects the client config.\n */\n useEffect(() => {\n setRootConfig(configFromProps)\n }, [configFromProps, setRootConfig])\n\n // If this component receives a different config than what is in context from the layout, it is stale.\n // While stale, we instantiate a new context provider that provides the new config until the root context is updated.\n // Unfortunately, referential equality alone does not work bc the reference is lost during server/client serialization,\n // so we need to also compare the `unauthenticated` property.\n if (\n rootConfig !== configFromProps &&\n rootConfig.unauthenticated !== configFromProps.unauthenticated\n ) {\n return <ConfigProvider config={configFromProps}>{children}</ConfigProvider>\n }\n\n return children\n}\n"],"names":["React","createContext","use","useCallback","useEffect","useMemo","useControllableState","RootConfigContext","undefined","ConfigProvider","children","config","configFromProps","setConfig","collectionsBySlug","globalsBySlug","collection","collections","slug","global","globals","getEntityConfig","args","collectionSlug","globalSlug","value","useConfig","PageConfigProvider","rootConfig","setRootConfig","unauthenticated"],"mappings":"AAAA,mDAAmD,GAAG,4EAA4E;AAClI;;AASA,OAAOA,SAASC,aAAa,EAAEC,GAAG,EAAEC,WAAW,EAAEC,SAAS,EAAEC,OAAO,QAAQ,QAAO;AAElF,SAASC,oBAAoB,QAAQ,sCAAqC;AA6B1E,MAAMC,kCAAoBN,cAA+CO;AAEzE,OAAO,MAAMC,iBAGR,CAAC,EAAEC,QAAQ,EAAEC,QAAQC,eAAe,EAAE;IACzC,2EAA2E;IAC3E,4FAA4F;IAC5F,4CAA4C;IAC5C,MAAM,CAACD,QAAQE,UAAU,GAAGP,qBAAmCM;IAE/D,kFAAkF;IAClF,MAAM,EAAEE,iBAAiB,EAAEC,aAAa,EAAE,GAAGV,QAAQ;QACnD,MAAMS,oBAA4D,CAAC;QACnE,MAAMC,gBAAoD,CAAC;QAE3D,KAAK,MAAMC,cAAcL,OAAOM,WAAW,CAAE;YAC3CH,iBAAiB,CAACE,WAAWE,IAAI,CAAC,GAAGF;QACvC;QAEA,KAAK,MAAMG,UAAUR,OAAOS,OAAO,CAAE;YACnCL,aAAa,CAACI,OAAOD,IAAI,CAAC,GAAGC;QAC/B;QAEA,OAAO;YAAEL;YAAmBC;QAAc;IAC5C,GAAG;QAACJ;KAAO;IAEX,MAAMU,kBAAkBlB,YACtB,CAACmB;QACC,IAAI,oBAAoBA,MAAM;YAC5B,OAAOR,iBAAiB,CAACQ,KAAKC,cAAc,CAAC,IAAI;QACnD;QAEA,IAAI,gBAAgBD,MAAM;YACxB,OAAOP,aAAa,CAACO,KAAKE,UAAU,CAAC,IAAI;QAC3C;QAEA,OAAO;IACT,GACA;QAACV;QAAmBC;KAAc;IAGpC,MAAMU,QAAQpB,QACZ,IAAO,CAAA;YAAEM;YAAQU;YAAiBR;QAAU,CAAA,GAC5C;QAACF;QAAQU;QAAiBR;KAAU;IAGtC,qBAAO,KAACN;QAAkBkB,OAAOA;kBAAQf;;AAC3C,EAAC;AAED,OAAO,MAAMgB,YAAY,IAA2BxB,IAAIK,mBAAkB;AAE1E;;;;;;;;;;CAUC,GACD,OAAO,MAAMoB,qBAGR,CAAC,EAAEjB,QAAQ,EAAEC,QAAQC,eAAe,EAAE;IACzC,MAAM,EAAED,QAAQiB,UAAU,EAAEf,WAAWgB,aAAa,EAAE,GAAGH;IAEzD;;;;;GAKC,GACDtB,UAAU;QACRyB,cAAcjB;IAChB,GAAG;QAACA;QAAiBiB;KAAc;IAEnC,sGAAsG;IACtG,qHAAqH;IACrH,uHAAuH;IACvH,6DAA6D;IAC7D,IACED,eAAehB,mBACfgB,WAAWE,eAAe,KAAKlB,gBAAgBkB,eAAe,EAC9D;QACA,qBAAO,KAACrB;YAAeE,QAAQC;sBAAkBF;;IACnD;IAEA,OAAOA;AACT,EAAC"}
1
+ {"version":3,"sources":["../../../src/providers/Config/index.tsx"],"sourcesContent":["/* eslint-disable perfectionist/sort-object-types */ // Need to disable this rule because the order of the overloads is important\n'use client'\nimport type {\n ClientCollectionConfig,\n ClientConfig,\n ClientGlobalConfig,\n CollectionSlug,\n GlobalSlug,\n} from 'payload'\n\nimport React, { createContext, use, useCallback, useEffect, useMemo } from 'react'\n\nimport { useControllableState } from '../../hooks/useControllableState.js'\n\ntype GetEntityConfigFn = {\n // Overload #1: collectionSlug only\n // @todo remove \"{} |\" in 4.0, which would be a breaking change\n (args: { collectionSlug: {} | CollectionSlug; globalSlug?: never }): ClientCollectionConfig\n\n // Overload #2: globalSlug only\n // @todo remove \"{} |\" in 4.0, which would be a breaking change\n (args: { collectionSlug?: never; globalSlug: {} | GlobalSlug }): ClientGlobalConfig\n\n // Overload #3: both/none (fall back to union | null)\n (args: {\n collectionSlug?: {} | CollectionSlug\n globalSlug?: {} | GlobalSlug\n }): ClientCollectionConfig | ClientGlobalConfig | null\n}\n\nexport type ClientConfigContext = {\n config: ClientConfig\n /**\n * Get a collection or global config by its slug. This is preferred over\n * using `config.collections.find` or `config.globals.find`, because\n * getEntityConfig uses a lookup map for O(1) lookups.\n */\n getEntityConfig: GetEntityConfigFn\n setConfig: (config: ClientConfig) => void\n}\n\nconst RootConfigContext = createContext<ClientConfigContext | undefined>(undefined)\n\nexport const ConfigProvider: React.FC<{\n readonly children: React.ReactNode\n readonly config: ClientConfig\n}> = ({ children, config: configFromProps }) => {\n // Need to update local config state if config from props changes, for HMR.\n // That way, config changes will be updated in the UI immediately without needing a refresh.\n // useControllableState handles this for us.\n const [config, setConfig] = useControllableState<ClientConfig>(configFromProps)\n\n // Build lookup maps for collections and globals so we can do O(1) lookups by slug\n const { collectionsBySlug, globalsBySlug } = useMemo(() => {\n const collectionsBySlug: Record<string, ClientCollectionConfig> = {}\n const globalsBySlug: Record<string, ClientGlobalConfig> = {}\n\n for (const collection of config.collections) {\n collectionsBySlug[collection.slug] = collection\n }\n\n for (const global of config.globals) {\n globalsBySlug[global.slug] = global\n }\n\n return { collectionsBySlug, globalsBySlug }\n }, [config])\n\n const getEntityConfig = useCallback<GetEntityConfigFn>(\n (args) => {\n if ('collectionSlug' in args) {\n return collectionsBySlug[args.collectionSlug] ?? null\n }\n\n if ('globalSlug' in args) {\n return globalsBySlug[args.globalSlug] ?? null\n }\n\n return null as any\n },\n [collectionsBySlug, globalsBySlug],\n )\n\n const value = useMemo(\n () => ({ config, getEntityConfig, setConfig }),\n [config, getEntityConfig, setConfig],\n )\n\n return <RootConfigContext value={value}>{children}</RootConfigContext>\n}\n\nexport const useConfig = (): ClientConfigContext => use(RootConfigContext)\n\n/**\n * This provider shadows the `ConfigProvider` on the _page_ level, allowing us to\n * update the config when needed, e.g. after authentication.\n * The layout `ConfigProvider` is not updated on page navigation / authentication,\n * as the layout does not re-render in those cases.\n *\n * If the config here has the same reference as the config from the layout, we\n * simply reuse the context from the layout to avoid unnecessary re-renders.\n *\n * @experimental This component is experimental and may change or be removed in future releases. Use at your own risk.\n */\nexport const PageConfigProvider: React.FC<{\n readonly children: React.ReactNode\n readonly config: ClientConfig\n}> = ({ children, config: configFromProps }) => {\n const { config: rootConfig, setConfig: setRootConfig } = useConfig()\n\n /**\n * This `useEffect` is required in order for the _page_ to be able to refresh the client config,\n * which may have been cached on the _layout_ level, where the `ConfigProvider` is managed.\n * Since the layout does not re-render on page navigation / authentication, we need to manually\n * update the config, as the user may have been authenticated in the process, which affects the client config.\n */\n useEffect(() => {\n setRootConfig(configFromProps)\n }, [configFromProps, setRootConfig])\n\n // If this component receives a different config than what is in context from the layout, it is stale.\n // While stale, we instantiate a new context provider that provides the new config until the root context is updated.\n // Unfortunately, referential equality alone does not work bc the reference is lost during server/client serialization,\n // so we need to also compare the `unauthenticated` property.\n if (\n rootConfig !== configFromProps &&\n rootConfig.unauthenticated !== configFromProps.unauthenticated\n ) {\n return <ConfigProvider config={configFromProps}>{children}</ConfigProvider>\n }\n\n return children\n}\n"],"names":["React","createContext","use","useCallback","useEffect","useMemo","useControllableState","RootConfigContext","undefined","ConfigProvider","children","config","configFromProps","setConfig","collectionsBySlug","globalsBySlug","collection","collections","slug","global","globals","getEntityConfig","args","collectionSlug","globalSlug","value","useConfig","PageConfigProvider","rootConfig","setRootConfig","unauthenticated"],"mappings":"AAAA,mDAAmD,GAAG,4EAA4E;AAClI;;AASA,OAAOA,SAASC,aAAa,EAAEC,GAAG,EAAEC,WAAW,EAAEC,SAAS,EAAEC,OAAO,QAAQ,QAAO;AAElF,SAASC,oBAAoB,QAAQ,sCAAqC;AAGxE,mCAAmC;AACnC,+DAA+D;AAG/D,+BAA+B;AAC/B,+DAA+D;AAG/D,qDAAqD;AASrD;;;;GAIC,GAKH,MAAMC,kCAAoBN,cAA+CO;AAEzE,OAAO,MAAMC,iBAGR,CAAC,EAAEC,QAAQ,EAAEC,QAAQC,eAAe,EAAE;IACzC,2EAA2E;IAC3E,4FAA4F;IAC5F,4CAA4C;IAC5C,MAAM,CAACD,QAAQE,UAAU,GAAGP,qBAAmCM;IAE/D,kFAAkF;IAClF,MAAM,EAAEE,iBAAiB,EAAEC,aAAa,EAAE,GAAGV,QAAQ;QACnD,MAAMS,oBAA4D,CAAC;QACnE,MAAMC,gBAAoD,CAAC;QAE3D,KAAK,MAAMC,cAAcL,OAAOM,WAAW,CAAE;YAC3CH,iBAAiB,CAACE,WAAWE,IAAI,CAAC,GAAGF;QACvC;QAEA,KAAK,MAAMG,UAAUR,OAAOS,OAAO,CAAE;YACnCL,aAAa,CAACI,OAAOD,IAAI,CAAC,GAAGC;QAC/B;QAEA,OAAO;YAAEL;YAAmBC;QAAc;IAC5C,GAAG;QAACJ;KAAO;IAEX,MAAMU,kBAAkBlB,YACtB,CAACmB;QACC,IAAI,oBAAoBA,MAAM;YAC5B,OAAOR,iBAAiB,CAACQ,KAAKC,cAAc,CAAC,IAAI;QACnD;QAEA,IAAI,gBAAgBD,MAAM;YACxB,OAAOP,aAAa,CAACO,KAAKE,UAAU,CAAC,IAAI;QAC3C;QAEA,OAAO;IACT,GACA;QAACV;QAAmBC;KAAc;IAGpC,MAAMU,QAAQpB,QACZ,IAAO,CAAA;YAAEM;YAAQU;YAAiBR;QAAU,CAAA,GAC5C;QAACF;QAAQU;QAAiBR;KAAU;IAGtC,qBAAO,KAACN;QAAkBkB,OAAOA;kBAAQf;;AAC3C,EAAC;AAED,OAAO,MAAMgB,YAAY,IAA2BxB,IAAIK,mBAAkB;AAE1E;;;;;;;;;;CAUC,GACD,OAAO,MAAMoB,qBAGR,CAAC,EAAEjB,QAAQ,EAAEC,QAAQC,eAAe,EAAE;IACzC,MAAM,EAAED,QAAQiB,UAAU,EAAEf,WAAWgB,aAAa,EAAE,GAAGH;IAEzD;;;;;GAKC,GACDtB,UAAU;QACRyB,cAAcjB;IAChB,GAAG;QAACA;QAAiBiB;KAAc;IAEnC,sGAAsG;IACtG,qHAAqH;IACrH,uHAAuH;IACvH,6DAA6D;IAC7D,IACED,eAAehB,mBACfgB,WAAWE,eAAe,KAAKlB,gBAAgBkB,eAAe,EAC9D;QACA,qBAAO,KAACrB;YAAeE,QAAQC;sBAAkBF;;IACnD;IAEA,OAAOA;AACT,EAAC"}
@@ -199,11 +199,11 @@ const DocumentInfo = ({ children, ...props })=>{
199
199
  }
200
200
  });
201
201
  } catch (e) {
202
- console.error(e) // eslint-disable-line no-console
203
- ;
202
+ console.error(e);
204
203
  }
205
204
  }
206
- }, [
205
+ }, // eslint-disable-line no-console
206
+ [
207
207
  setPreference,
208
208
  preferencesKey,
209
209
  getDocPreferences
@@ -258,12 +258,11 @@ const DocumentInfo = ({ children, ...props })=>{
258
258
  if (re1) {
259
259
  try {
260
260
  re1.abort();
261
- } catch (_err) {
262
- // swallow error
263
- }
261
+ } catch (_err) {}
264
262
  }
265
263
  };
266
- }, []);
264
+ }, // swallow error
265
+ []);
267
266
  const action = React.useMemo(()=>{
268
267
  const docURL = `${baseURL}${pluralType === 'globals' ? `/globals` : ''}/${slug}${id ? `/${id}` : ''}`;
269
268
  const params = {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/providers/DocumentInfo/index.tsx"],"sourcesContent":["'use client'\nimport type { ClientUser, DocumentPreferences } from 'payload'\n\nimport * as qs from 'qs-esm'\nimport React, { createContext, use, useCallback, useEffect, useMemo, useRef, useState } from 'react'\n\nimport { useControllableState } from '../../hooks/useControllableState.js'\nimport { useAuth } from '../../providers/Auth/index.js'\nimport { requests } from '../../utilities/api.js'\nimport { formatDocTitle } from '../../utilities/formatDocTitle/index.js'\nimport { useConfig } from '../Config/index.js'\nimport { DocumentTitleProvider } from '../DocumentTitle/index.js'\nimport { useLocale, useLocaleLoading } from '../Locale/index.js'\nimport { usePreferences } from '../Preferences/index.js'\nimport { useTranslation } from '../Translation/index.js'\nimport { UploadEditsProvider, useUploadEdits } from '../UploadEdits/index.js'\nimport { type DocumentInfoContext, type DocumentInfoProps } from './types.js'\nimport { useGetDocPermissions } from './useGetDocPermissions.js'\n\nconst Context = createContext({} as DocumentInfoContext)\n\nexport type * from './types.js'\n\nexport const useDocumentInfo = (): DocumentInfoContext => use(Context)\n\nconst DocumentInfo: React.FC<\n {\n readonly children: React.ReactNode\n } & DocumentInfoProps\n> = ({ children, ...props }) => {\n const {\n id,\n collectionSlug,\n currentEditor: currentEditorFromProps,\n docPermissions: docPermissionsFromProps,\n globalSlug,\n hasPublishedDoc: hasPublishedDocFromProps,\n hasPublishPermission: hasPublishPermissionFromProps,\n hasSavePermission: hasSavePermissionFromProps,\n initialData,\n initialState,\n isLocked: isLockedFromProps,\n lastUpdateTime: lastUpdateTimeFromProps,\n mostRecentVersionIsAutosaved: mostRecentVersionIsAutosavedFromProps,\n unpublishedVersionCount: unpublishedVersionCountFromProps,\n versionCount: versionCountFromProps,\n } = props\n\n const [docPermissions, setDocPermissions] = useControllableState(docPermissionsFromProps)\n\n const [hasSavePermission, setHasSavePermission] = useControllableState(hasSavePermissionFromProps)\n\n const [hasPublishPermission, setHasPublishPermission] = useControllableState(\n hasPublishPermissionFromProps,\n )\n\n const { permissions } = useAuth()\n\n const {\n config: {\n admin: { dateFormat },\n routes: { api },\n serverURL,\n },\n getEntityConfig,\n } = useConfig()\n\n const collectionConfig = getEntityConfig({ collectionSlug })\n const globalConfig = getEntityConfig({ globalSlug })\n\n const abortControllerRef = useRef(new AbortController())\n const docConfig = collectionConfig || globalConfig\n\n const { i18n } = useTranslation()\n\n const { uploadEdits } = useUploadEdits()\n\n /**\n * @deprecated This state will be removed in v4.\n * This is for performance reasons. Use the `DocumentTitleContext` instead.\n */\n const [title, setDocumentTitle] = useState(() =>\n formatDocTitle({\n collectionConfig,\n data: { ...(initialData || {}), id },\n dateFormat,\n fallback: id?.toString(),\n globalConfig,\n i18n,\n }),\n )\n\n const [mostRecentVersionIsAutosaved, setMostRecentVersionIsAutosaved] = useState(\n mostRecentVersionIsAutosavedFromProps,\n )\n\n const [versionCount, setVersionCount] = useState(versionCountFromProps)\n\n const [hasPublishedDoc, setHasPublishedDoc] = useState(hasPublishedDocFromProps)\n\n const [unpublishedVersionCount, setUnpublishedVersionCount] = useState(\n unpublishedVersionCountFromProps,\n )\n\n const [documentIsLocked, setDocumentIsLocked] = useControllableState<boolean | undefined>(\n isLockedFromProps,\n )\n\n const [currentEditor, setCurrentEditor] = useControllableState<ClientUser | null>(\n currentEditorFromProps,\n )\n const [lastUpdateTime, setLastUpdateTime] = useControllableState<number>(lastUpdateTimeFromProps)\n\n const [data, setData] = useControllableState(initialData)\n\n const [uploadStatus, setUploadStatus] = useControllableState<'failed' | 'idle' | 'uploading'>(\n 'idle',\n )\n\n const documentLockState = useRef<{\n hasShownLockedModal: boolean\n isLocked: boolean\n user: ClientUser | number | string\n } | null>({\n hasShownLockedModal: false,\n isLocked: false,\n user: null,\n })\n\n const updateUploadStatus = useCallback(\n (status: 'failed' | 'idle' | 'uploading') => {\n setUploadStatus(status)\n },\n [setUploadStatus],\n )\n\n const { getPreference, setPreference } = usePreferences()\n const { code: locale } = useLocale()\n const { localeIsLoading } = useLocaleLoading()\n\n const isInitializing = useMemo(\n () => initialState === undefined || initialData === undefined || localeIsLoading,\n [initialData, initialState, localeIsLoading],\n )\n\n const baseURL = `${serverURL}${api}`\n let slug: string\n let pluralType: 'collections' | 'globals'\n let preferencesKey: string\n\n if (globalSlug) {\n slug = globalSlug\n pluralType = 'globals'\n preferencesKey = `global-${slug}`\n }\n\n if (collectionSlug) {\n slug = collectionSlug\n pluralType = 'collections'\n\n if (id) {\n preferencesKey = `collection-${slug}-${id}`\n }\n }\n\n const unlockDocument = useCallback(\n async (docID: number | string, slug: string) => {\n try {\n const isGlobal = slug === globalSlug\n\n const request = await requests.get(`${serverURL}${api}/payload-locked-documents`, {\n credentials: 'include',\n params: isGlobal\n ? {\n 'where[globalSlug][equals]': slug,\n }\n : {\n 'where[document.relationTo][equals]': slug,\n 'where[document.value][equals]': docID,\n },\n })\n\n const { docs } = await request.json()\n\n if (docs?.length > 0) {\n const lockID = docs[0].id\n await requests.delete(`${serverURL}${api}/payload-locked-documents/${lockID}`, {\n credentials: 'include',\n headers: {\n 'Content-Type': 'application/json',\n },\n })\n setDocumentIsLocked(false)\n }\n } catch (error) {\n // eslint-disable-next-line no-console\n console.error('Failed to unlock the document', error)\n }\n },\n [serverURL, api, globalSlug, setDocumentIsLocked],\n )\n\n const updateDocumentEditor = useCallback(\n async (docID: number | string, slug: string, user: ClientUser | number | string) => {\n try {\n const isGlobal = slug === globalSlug\n\n // Check if the document is already locked\n const request = await requests.get(`${serverURL}${api}/payload-locked-documents`, {\n credentials: 'include',\n params: isGlobal\n ? {\n 'where[globalSlug][equals]': slug,\n }\n : {\n 'where[document.relationTo][equals]': slug,\n 'where[document.value][equals]': docID,\n },\n })\n\n const { docs } = await request.json()\n\n if (docs?.length > 0) {\n const lockID = docs[0].id\n\n const userData =\n typeof user === 'object'\n ? { relationTo: user.collection, value: user.id }\n : { relationTo: 'users', value: user }\n\n // Send a patch request to update the _lastEdited info\n await requests.patch(`${serverURL}${api}/payload-locked-documents/${lockID}`, {\n body: JSON.stringify({\n user: userData,\n }),\n credentials: 'include',\n headers: {\n 'Content-Type': 'application/json',\n },\n })\n }\n } catch (error) {\n // eslint-disable-next-line no-console\n console.error('Failed to update the document editor', error)\n }\n },\n [serverURL, api, globalSlug],\n )\n\n const getDocPermissions = useGetDocPermissions({\n id: id as string,\n api,\n collectionSlug,\n globalSlug,\n i18n,\n locale,\n permissions,\n serverURL,\n setDocPermissions,\n setHasPublishPermission,\n setHasSavePermission,\n })\n\n const getDocPreferences = useCallback(() => {\n return getPreference<DocumentPreferences>(preferencesKey)\n }, [getPreference, preferencesKey])\n\n const setDocFieldPreferences = useCallback<DocumentInfoContext['setDocFieldPreferences']>(\n async (path, fieldPreferences) => {\n const allPreferences = await getDocPreferences()\n\n if (preferencesKey) {\n try {\n await setPreference(preferencesKey, {\n ...allPreferences,\n fields: {\n ...(allPreferences?.fields || {}),\n [path]: {\n ...allPreferences?.fields?.[path],\n ...fieldPreferences,\n },\n },\n })\n } catch (e) {\n console.error(e) // eslint-disable-line no-console\n }\n }\n },\n [setPreference, preferencesKey, getDocPreferences],\n )\n\n const incrementVersionCount = useCallback(() => {\n const newCount = versionCount + 1\n if (collectionConfig && collectionConfig.versions) {\n if (collectionConfig.versions.maxPerDoc > 0) {\n setVersionCount(Math.min(newCount, collectionConfig.versions.maxPerDoc))\n } else {\n setVersionCount(newCount)\n }\n } else if (globalConfig && globalConfig.versions) {\n if (globalConfig.versions.max > 0) {\n setVersionCount(Math.min(newCount, globalConfig.versions.max))\n } else {\n setVersionCount(newCount)\n }\n }\n }, [collectionConfig, globalConfig, versionCount])\n\n /**\n * @todo: Remove this in v4\n * Users should use the `DocumentTitleContext` instead.\n */\n useEffect(() => {\n setDocumentTitle(\n formatDocTitle({\n collectionConfig,\n data: { ...data, id },\n dateFormat,\n fallback: id?.toString(),\n globalConfig,\n i18n,\n }),\n )\n }, [collectionConfig, globalConfig, data, dateFormat, i18n, id])\n\n // clean on unmount\n useEffect(() => {\n const re1 = abortControllerRef.current\n\n return () => {\n if (re1) {\n try {\n re1.abort()\n } catch (_err) {\n // swallow error\n }\n }\n }\n }, [])\n\n const action: string = React.useMemo(() => {\n const docURL = `${baseURL}${pluralType === 'globals' ? `/globals` : ''}/${slug}${id ? `/${id}` : ''}`\n const params = {\n depth: 0,\n 'fallback-locale': 'null',\n locale,\n uploadEdits: uploadEdits || undefined,\n }\n\n return `${docURL}${qs.stringify(params, {\n addQueryPrefix: true,\n })}`\n }, [baseURL, locale, pluralType, id, slug, uploadEdits])\n\n const value: DocumentInfoContext = {\n ...props,\n action,\n currentEditor,\n data,\n docConfig,\n docPermissions,\n documentIsLocked,\n documentLockState,\n getDocPermissions,\n getDocPreferences,\n hasPublishedDoc,\n hasPublishPermission,\n hasSavePermission,\n incrementVersionCount,\n initialData,\n initialState,\n isInitializing,\n lastUpdateTime,\n mostRecentVersionIsAutosaved,\n preferencesKey,\n savedDocumentData: data,\n setCurrentEditor,\n setData,\n setDocFieldPreferences,\n setDocumentIsLocked,\n setDocumentTitle,\n setHasPublishedDoc,\n setLastUpdateTime,\n setMostRecentVersionIsAutosaved,\n setUnpublishedVersionCount,\n setUploadStatus: updateUploadStatus,\n title,\n unlockDocument,\n unpublishedVersionCount,\n updateDocumentEditor,\n updateSavedDocumentData: setData,\n uploadStatus,\n versionCount,\n }\n\n return (\n <Context value={value}>\n <DocumentTitleProvider>{children}</DocumentTitleProvider>\n </Context>\n )\n}\n\nexport const DocumentInfoProvider: React.FC<\n {\n readonly children: React.ReactNode\n } & DocumentInfoProps\n> = (props) => {\n return (\n <UploadEditsProvider>\n <DocumentInfo {...props} />\n </UploadEditsProvider>\n )\n}\n"],"names":["qs","React","createContext","use","useCallback","useEffect","useMemo","useRef","useState","useControllableState","useAuth","requests","formatDocTitle","useConfig","DocumentTitleProvider","useLocale","useLocaleLoading","usePreferences","useTranslation","UploadEditsProvider","useUploadEdits","useGetDocPermissions","Context","useDocumentInfo","DocumentInfo","children","props","id","collectionSlug","currentEditor","currentEditorFromProps","docPermissions","docPermissionsFromProps","globalSlug","hasPublishedDoc","hasPublishedDocFromProps","hasPublishPermission","hasPublishPermissionFromProps","hasSavePermission","hasSavePermissionFromProps","initialData","initialState","isLocked","isLockedFromProps","lastUpdateTime","lastUpdateTimeFromProps","mostRecentVersionIsAutosaved","mostRecentVersionIsAutosavedFromProps","unpublishedVersionCount","unpublishedVersionCountFromProps","versionCount","versionCountFromProps","setDocPermissions","setHasSavePermission","setHasPublishPermission","permissions","config","admin","dateFormat","routes","api","serverURL","getEntityConfig","collectionConfig","globalConfig","abortControllerRef","AbortController","docConfig","i18n","uploadEdits","title","setDocumentTitle","data","fallback","toString","setMostRecentVersionIsAutosaved","setVersionCount","setHasPublishedDoc","setUnpublishedVersionCount","documentIsLocked","setDocumentIsLocked","setCurrentEditor","setLastUpdateTime","setData","uploadStatus","setUploadStatus","documentLockState","hasShownLockedModal","user","updateUploadStatus","status","getPreference","setPreference","code","locale","localeIsLoading","isInitializing","undefined","baseURL","slug","pluralType","preferencesKey","unlockDocument","docID","isGlobal","request","get","credentials","params","docs","json","length","lockID","delete","headers","error","console","updateDocumentEditor","userData","relationTo","collection","value","patch","body","JSON","stringify","getDocPermissions","getDocPreferences","setDocFieldPreferences","path","fieldPreferences","allPreferences","fields","e","incrementVersionCount","newCount","versions","maxPerDoc","Math","min","max","re1","current","abort","_err","action","docURL","depth","addQueryPrefix","savedDocumentData","updateSavedDocumentData","DocumentInfoProvider"],"mappings":"AAAA;;AAGA,YAAYA,QAAQ,SAAQ;AAC5B,OAAOC,SAASC,aAAa,EAAEC,GAAG,EAAEC,WAAW,EAAEC,SAAS,EAAEC,OAAO,EAAEC,MAAM,EAAEC,QAAQ,QAAQ,QAAO;AAEpG,SAASC,oBAAoB,QAAQ,sCAAqC;AAC1E,SAASC,OAAO,QAAQ,gCAA+B;AACvD,SAASC,QAAQ,QAAQ,yBAAwB;AACjD,SAASC,cAAc,QAAQ,0CAAyC;AACxE,SAASC,SAAS,QAAQ,qBAAoB;AAC9C,SAASC,qBAAqB,QAAQ,4BAA2B;AACjE,SAASC,SAAS,EAAEC,gBAAgB,QAAQ,qBAAoB;AAChE,SAASC,cAAc,QAAQ,0BAAyB;AACxD,SAASC,cAAc,QAAQ,0BAAyB;AACxD,SAASC,mBAAmB,EAAEC,cAAc,QAAQ,0BAAyB;AAE7E,SAASC,oBAAoB,QAAQ,4BAA2B;AAEhE,MAAMC,wBAAUpB,cAAc,CAAC;AAI/B,OAAO,MAAMqB,kBAAkB,IAA2BpB,IAAImB,SAAQ;AAEtE,MAAME,eAIF,CAAC,EAAEC,QAAQ,EAAE,GAAGC,OAAO;IACzB,MAAM,EACJC,EAAE,EACFC,cAAc,EACdC,eAAeC,sBAAsB,EACrCC,gBAAgBC,uBAAuB,EACvCC,UAAU,EACVC,iBAAiBC,wBAAwB,EACzCC,sBAAsBC,6BAA6B,EACnDC,mBAAmBC,0BAA0B,EAC7CC,WAAW,EACXC,YAAY,EACZC,UAAUC,iBAAiB,EAC3BC,gBAAgBC,uBAAuB,EACvCC,8BAA8BC,qCAAqC,EACnEC,yBAAyBC,gCAAgC,EACzDC,cAAcC,qBAAqB,EACpC,GAAGzB;IAEJ,MAAM,CAACK,gBAAgBqB,kBAAkB,GAAG3C,qBAAqBuB;IAEjE,MAAM,CAACM,mBAAmBe,qBAAqB,GAAG5C,qBAAqB8B;IAEvE,MAAM,CAACH,sBAAsBkB,wBAAwB,GAAG7C,qBACtD4B;IAGF,MAAM,EAAEkB,WAAW,EAAE,GAAG7C;IAExB,MAAM,EACJ8C,QAAQ,EACNC,OAAO,EAAEC,UAAU,EAAE,EACrBC,QAAQ,EAAEC,GAAG,EAAE,EACfC,SAAS,EACV,EACDC,eAAe,EAChB,GAAGjD;IAEJ,MAAMkD,mBAAmBD,gBAAgB;QAAElC;IAAe;IAC1D,MAAMoC,eAAeF,gBAAgB;QAAE7B;IAAW;IAElD,MAAMgC,qBAAqB1D,OAAO,IAAI2D;IACtC,MAAMC,YAAYJ,oBAAoBC;IAEtC,MAAM,EAAEI,IAAI,EAAE,GAAGlD;IAEjB,MAAM,EAAEmD,WAAW,EAAE,GAAGjD;IAExB;;;GAGC,GACD,MAAM,CAACkD,OAAOC,iBAAiB,GAAG/D,SAAS,IACzCI,eAAe;YACbmD;YACAS,MAAM;gBAAE,GAAIhC,eAAe,CAAC,CAAC;gBAAGb;YAAG;YACnC+B;YACAe,UAAU9C,IAAI+C;YACdV;YACAI;QACF;IAGF,MAAM,CAACtB,8BAA8B6B,gCAAgC,GAAGnE,SACtEuC;IAGF,MAAM,CAACG,cAAc0B,gBAAgB,GAAGpE,SAAS2C;IAEjD,MAAM,CAACjB,iBAAiB2C,mBAAmB,GAAGrE,SAAS2B;IAEvD,MAAM,CAACa,yBAAyB8B,2BAA2B,GAAGtE,SAC5DyC;IAGF,MAAM,CAAC8B,kBAAkBC,oBAAoB,GAAGvE,qBAC9CkC;IAGF,MAAM,CAACd,eAAeoD,iBAAiB,GAAGxE,qBACxCqB;IAEF,MAAM,CAACc,gBAAgBsC,kBAAkB,GAAGzE,qBAA6BoC;IAEzE,MAAM,CAAC2B,MAAMW,QAAQ,GAAG1E,qBAAqB+B;IAE7C,MAAM,CAAC4C,cAAcC,gBAAgB,GAAG5E,qBACtC;IAGF,MAAM6E,oBAAoB/E,OAIhB;QACRgF,qBAAqB;QACrB7C,UAAU;QACV8C,MAAM;IACR;IAEA,MAAMC,qBAAqBrF,YACzB,CAACsF;QACCL,gBAAgBK;IAClB,GACA;QAACL;KAAgB;IAGnB,MAAM,EAAEM,aAAa,EAAEC,aAAa,EAAE,GAAG3E;IACzC,MAAM,EAAE4E,MAAMC,MAAM,EAAE,GAAG/E;IACzB,MAAM,EAAEgF,eAAe,EAAE,GAAG/E;IAE5B,MAAMgF,iBAAiB1F,QACrB,IAAMmC,iBAAiBwD,aAAazD,gBAAgByD,aAAaF,iBACjE;QAACvD;QAAaC;QAAcsD;KAAgB;IAG9C,MAAMG,UAAU,GAAGrC,YAAYD,KAAK;IACpC,IAAIuC;IACJ,IAAIC;IACJ,IAAIC;IAEJ,IAAIpE,YAAY;QACdkE,OAAOlE;QACPmE,aAAa;QACbC,iBAAiB,CAAC,OAAO,EAAEF,MAAM;IACnC;IAEA,IAAIvE,gBAAgB;QAClBuE,OAAOvE;QACPwE,aAAa;QAEb,IAAIzE,IAAI;YACN0E,iBAAiB,CAAC,WAAW,EAAEF,KAAK,CAAC,EAAExE,IAAI;QAC7C;IACF;IAEA,MAAM2E,iBAAiBlG,YACrB,OAAOmG,OAAwBJ;QAC7B,IAAI;YACF,MAAMK,WAAWL,SAASlE;YAE1B,MAAMwE,UAAU,MAAM9F,SAAS+F,GAAG,CAAC,GAAG7C,YAAYD,IAAI,yBAAyB,CAAC,EAAE;gBAChF+C,aAAa;gBACbC,QAAQJ,WACJ;oBACE,6BAA6BL;gBAC/B,IACA;oBACE,sCAAsCA;oBACtC,iCAAiCI;gBACnC;YACN;YAEA,MAAM,EAAEM,IAAI,EAAE,GAAG,MAAMJ,QAAQK,IAAI;YAEnC,IAAID,MAAME,SAAS,GAAG;gBACpB,MAAMC,SAASH,IAAI,CAAC,EAAE,CAAClF,EAAE;gBACzB,MAAMhB,SAASsG,MAAM,CAAC,GAAGpD,YAAYD,IAAI,0BAA0B,EAAEoD,QAAQ,EAAE;oBAC7EL,aAAa;oBACbO,SAAS;wBACP,gBAAgB;oBAClB;gBACF;gBACAlC,oBAAoB;YACtB;QACF,EAAE,OAAOmC,OAAO;YACd,sCAAsC;YACtCC,QAAQD,KAAK,CAAC,iCAAiCA;QACjD;IACF,GACA;QAACtD;QAAWD;QAAK3B;QAAY+C;KAAoB;IAGnD,MAAMqC,uBAAuBjH,YAC3B,OAAOmG,OAAwBJ,MAAcX;QAC3C,IAAI;YACF,MAAMgB,WAAWL,SAASlE;YAE1B,0CAA0C;YAC1C,MAAMwE,UAAU,MAAM9F,SAAS+F,GAAG,CAAC,GAAG7C,YAAYD,IAAI,yBAAyB,CAAC,EAAE;gBAChF+C,aAAa;gBACbC,QAAQJ,WACJ;oBACE,6BAA6BL;gBAC/B,IACA;oBACE,sCAAsCA;oBACtC,iCAAiCI;gBACnC;YACN;YAEA,MAAM,EAAEM,IAAI,EAAE,GAAG,MAAMJ,QAAQK,IAAI;YAEnC,IAAID,MAAME,SAAS,GAAG;gBACpB,MAAMC,SAASH,IAAI,CAAC,EAAE,CAAClF,EAAE;gBAEzB,MAAM2F,WACJ,OAAO9B,SAAS,WACZ;oBAAE+B,YAAY/B,KAAKgC,UAAU;oBAAEC,OAAOjC,KAAK7D,EAAE;gBAAC,IAC9C;oBAAE4F,YAAY;oBAASE,OAAOjC;gBAAK;gBAEzC,sDAAsD;gBACtD,MAAM7E,SAAS+G,KAAK,CAAC,GAAG7D,YAAYD,IAAI,0BAA0B,EAAEoD,QAAQ,EAAE;oBAC5EW,MAAMC,KAAKC,SAAS,CAAC;wBACnBrC,MAAM8B;oBACR;oBACAX,aAAa;oBACbO,SAAS;wBACP,gBAAgB;oBAClB;gBACF;YACF;QACF,EAAE,OAAOC,OAAO;YACd,sCAAsC;YACtCC,QAAQD,KAAK,CAAC,wCAAwCA;QACxD;IACF,GACA;QAACtD;QAAWD;QAAK3B;KAAW;IAG9B,MAAM6F,oBAAoBzG,qBAAqB;QAC7CM,IAAIA;QACJiC;QACAhC;QACAK;QACAmC;QACA0B;QACAvC;QACAM;QACAT;QACAE;QACAD;IACF;IAEA,MAAM0E,oBAAoB3H,YAAY;QACpC,OAAOuF,cAAmCU;IAC5C,GAAG;QAACV;QAAeU;KAAe;IAElC,MAAM2B,yBAAyB5H,YAC7B,OAAO6H,MAAMC;QACX,MAAMC,iBAAiB,MAAMJ;QAE7B,IAAI1B,gBAAgB;YAClB,IAAI;gBACF,MAAMT,cAAcS,gBAAgB;oBAClC,GAAG8B,cAAc;oBACjBC,QAAQ;wBACN,GAAID,gBAAgBC,UAAU,CAAC,CAAC;wBAChC,CAACH,KAAK,EAAE;4BACN,GAAGE,gBAAgBC,QAAQ,CAACH,KAAK;4BACjC,GAAGC,gBAAgB;wBACrB;oBACF;gBACF;YACF,EAAE,OAAOG,GAAG;gBACVjB,QAAQD,KAAK,CAACkB,GAAG,iCAAiC;;YACpD;QACF;IACF,GACA;QAACzC;QAAeS;QAAgB0B;KAAkB;IAGpD,MAAMO,wBAAwBlI,YAAY;QACxC,MAAMmI,WAAWrF,eAAe;QAChC,IAAIa,oBAAoBA,iBAAiByE,QAAQ,EAAE;YACjD,IAAIzE,iBAAiByE,QAAQ,CAACC,SAAS,GAAG,GAAG;gBAC3C7D,gBAAgB8D,KAAKC,GAAG,CAACJ,UAAUxE,iBAAiByE,QAAQ,CAACC,SAAS;YACxE,OAAO;gBACL7D,gBAAgB2D;YAClB;QACF,OAAO,IAAIvE,gBAAgBA,aAAawE,QAAQ,EAAE;YAChD,IAAIxE,aAAawE,QAAQ,CAACI,GAAG,GAAG,GAAG;gBACjChE,gBAAgB8D,KAAKC,GAAG,CAACJ,UAAUvE,aAAawE,QAAQ,CAACI,GAAG;YAC9D,OAAO;gBACLhE,gBAAgB2D;YAClB;QACF;IACF,GAAG;QAACxE;QAAkBC;QAAcd;KAAa;IAEjD;;;GAGC,GACD7C,UAAU;QACRkE,iBACE3D,eAAe;YACbmD;YACAS,MAAM;gBAAE,GAAGA,IAAI;gBAAE7C;YAAG;YACpB+B;YACAe,UAAU9C,IAAI+C;YACdV;YACAI;QACF;IAEJ,GAAG;QAACL;QAAkBC;QAAcQ;QAAMd;QAAYU;QAAMzC;KAAG;IAE/D,mBAAmB;IACnBtB,UAAU;QACR,MAAMwI,MAAM5E,mBAAmB6E,OAAO;QAEtC,OAAO;YACL,IAAID,KAAK;gBACP,IAAI;oBACFA,IAAIE,KAAK;gBACX,EAAE,OAAOC,MAAM;gBACb,gBAAgB;gBAClB;YACF;QACF;IACF,GAAG,EAAE;IAEL,MAAMC,SAAiBhJ,MAAMK,OAAO,CAAC;QACnC,MAAM4I,SAAS,GAAGhD,UAAUE,eAAe,YAAY,CAAC,QAAQ,CAAC,GAAG,GAAG,CAAC,EAAED,OAAOxE,KAAK,CAAC,CAAC,EAAEA,IAAI,GAAG,IAAI;QACrG,MAAMiF,SAAS;YACbuC,OAAO;YACP,mBAAmB;YACnBrD;YACAzB,aAAaA,eAAe4B;QAC9B;QAEA,OAAO,GAAGiD,SAASlJ,GAAG6H,SAAS,CAACjB,QAAQ;YACtCwC,gBAAgB;QAClB,IAAI;IACN,GAAG;QAAClD;QAASJ;QAAQM;QAAYzE;QAAIwE;QAAM9B;KAAY;IAEvD,MAAMoD,QAA6B;QACjC,GAAG/F,KAAK;QACRuH;QACApH;QACA2C;QACAL;QACApC;QACAgD;QACAO;QACAwC;QACAC;QACA7F;QACAE;QACAE;QACAgG;QACA9F;QACAC;QACAuD;QACApD;QACAE;QACAuD;QACAgD,mBAAmB7E;QACnBS;QACAE;QACA6C;QACAhD;QACAT;QACAM;QACAK;QACAP;QACAG;QACAO,iBAAiBI;QACjBnB;QACAgC;QACAtD;QACAqE;QACAiC,yBAAyBnE;QACzBC;QACAlC;IACF;IAEA,qBACE,KAAC5B;QAAQmG,OAAOA;kBACd,cAAA,KAAC3G;sBAAuBW;;;AAG9B;AAEA,OAAO,MAAM8H,uBAIT,CAAC7H;IACH,qBACE,KAACP;kBACC,cAAA,KAACK;YAAc,GAAGE,KAAK;;;AAG7B,EAAC"}
1
+ {"version":3,"sources":["../../../src/providers/DocumentInfo/index.tsx"],"sourcesContent":["'use client'\nimport type { ClientUser, DocumentPreferences } from 'payload'\n\nimport * as qs from 'qs-esm'\nimport React, { createContext, use, useCallback, useEffect, useMemo, useRef, useState } from 'react'\n\nimport { useControllableState } from '../../hooks/useControllableState.js'\nimport { useAuth } from '../../providers/Auth/index.js'\nimport { requests } from '../../utilities/api.js'\nimport { formatDocTitle } from '../../utilities/formatDocTitle/index.js'\nimport { useConfig } from '../Config/index.js'\nimport { DocumentTitleProvider } from '../DocumentTitle/index.js'\nimport { useLocale, useLocaleLoading } from '../Locale/index.js'\nimport { usePreferences } from '../Preferences/index.js'\nimport { useTranslation } from '../Translation/index.js'\nimport { UploadEditsProvider, useUploadEdits } from '../UploadEdits/index.js'\nimport { type DocumentInfoContext, type DocumentInfoProps } from './types.js'\nimport { useGetDocPermissions } from './useGetDocPermissions.js'\n\nconst Context = createContext({} as DocumentInfoContext)\n\nexport type * from './types.js'\n\nexport const useDocumentInfo = (): DocumentInfoContext => use(Context)\n\nconst DocumentInfo: React.FC<\n {\n readonly children: React.ReactNode\n } & DocumentInfoProps\n> = ({ children, ...props }) => {\n const {\n id,\n collectionSlug,\n currentEditor: currentEditorFromProps,\n docPermissions: docPermissionsFromProps,\n globalSlug,\n hasPublishedDoc: hasPublishedDocFromProps,\n hasPublishPermission: hasPublishPermissionFromProps,\n hasSavePermission: hasSavePermissionFromProps,\n initialData,\n initialState,\n isLocked: isLockedFromProps,\n lastUpdateTime: lastUpdateTimeFromProps,\n mostRecentVersionIsAutosaved: mostRecentVersionIsAutosavedFromProps,\n unpublishedVersionCount: unpublishedVersionCountFromProps,\n versionCount: versionCountFromProps,\n } = props\n\n const [docPermissions, setDocPermissions] = useControllableState(docPermissionsFromProps)\n\n const [hasSavePermission, setHasSavePermission] = useControllableState(hasSavePermissionFromProps)\n\n const [hasPublishPermission, setHasPublishPermission] = useControllableState(\n hasPublishPermissionFromProps,\n )\n\n const { permissions } = useAuth()\n\n const {\n config: {\n admin: { dateFormat },\n routes: { api },\n serverURL,\n },\n getEntityConfig,\n } = useConfig()\n\n const collectionConfig = getEntityConfig({ collectionSlug })\n const globalConfig = getEntityConfig({ globalSlug })\n\n const abortControllerRef = useRef(new AbortController())\n const docConfig = collectionConfig || globalConfig\n\n const { i18n } = useTranslation()\n\n const { uploadEdits } = useUploadEdits()\n\n /**\n * @deprecated This state will be removed in v4.\n * This is for performance reasons. Use the `DocumentTitleContext` instead.\n */\n const [title, setDocumentTitle] = useState(() =>\n formatDocTitle({\n collectionConfig,\n data: { ...(initialData || {}), id },\n dateFormat,\n fallback: id?.toString(),\n globalConfig,\n i18n,\n }),\n )\n\n const [mostRecentVersionIsAutosaved, setMostRecentVersionIsAutosaved] = useState(\n mostRecentVersionIsAutosavedFromProps,\n )\n\n const [versionCount, setVersionCount] = useState(versionCountFromProps)\n\n const [hasPublishedDoc, setHasPublishedDoc] = useState(hasPublishedDocFromProps)\n\n const [unpublishedVersionCount, setUnpublishedVersionCount] = useState(\n unpublishedVersionCountFromProps,\n )\n\n const [documentIsLocked, setDocumentIsLocked] = useControllableState<boolean | undefined>(\n isLockedFromProps,\n )\n\n const [currentEditor, setCurrentEditor] = useControllableState<ClientUser | null>(\n currentEditorFromProps,\n )\n const [lastUpdateTime, setLastUpdateTime] = useControllableState<number>(lastUpdateTimeFromProps)\n\n const [data, setData] = useControllableState(initialData)\n\n const [uploadStatus, setUploadStatus] = useControllableState<'failed' | 'idle' | 'uploading'>(\n 'idle',\n )\n\n const documentLockState = useRef<{\n hasShownLockedModal: boolean\n isLocked: boolean\n user: ClientUser | number | string\n } | null>({\n hasShownLockedModal: false,\n isLocked: false,\n user: null,\n })\n\n const updateUploadStatus = useCallback(\n (status: 'failed' | 'idle' | 'uploading') => {\n setUploadStatus(status)\n },\n [setUploadStatus],\n )\n\n const { getPreference, setPreference } = usePreferences()\n const { code: locale } = useLocale()\n const { localeIsLoading } = useLocaleLoading()\n\n const isInitializing = useMemo(\n () => initialState === undefined || initialData === undefined || localeIsLoading,\n [initialData, initialState, localeIsLoading],\n )\n\n const baseURL = `${serverURL}${api}`\n let slug: string\n let pluralType: 'collections' | 'globals'\n let preferencesKey: string\n\n if (globalSlug) {\n slug = globalSlug\n pluralType = 'globals'\n preferencesKey = `global-${slug}`\n }\n\n if (collectionSlug) {\n slug = collectionSlug\n pluralType = 'collections'\n\n if (id) {\n preferencesKey = `collection-${slug}-${id}`\n }\n }\n\n const unlockDocument = useCallback(\n async (docID: number | string, slug: string) => {\n try {\n const isGlobal = slug === globalSlug\n\n const request = await requests.get(`${serverURL}${api}/payload-locked-documents`, {\n credentials: 'include',\n params: isGlobal\n ? {\n 'where[globalSlug][equals]': slug,\n }\n : {\n 'where[document.relationTo][equals]': slug,\n 'where[document.value][equals]': docID,\n },\n })\n\n const { docs } = await request.json()\n\n if (docs?.length > 0) {\n const lockID = docs[0].id\n await requests.delete(`${serverURL}${api}/payload-locked-documents/${lockID}`, {\n credentials: 'include',\n headers: {\n 'Content-Type': 'application/json',\n },\n })\n setDocumentIsLocked(false)\n }\n } catch (error) {\n // eslint-disable-next-line no-console\n console.error('Failed to unlock the document', error)\n }\n },\n [serverURL, api, globalSlug, setDocumentIsLocked],\n )\n\n const updateDocumentEditor = useCallback(\n async (docID: number | string, slug: string, user: ClientUser | number | string) => {\n try {\n const isGlobal = slug === globalSlug\n\n // Check if the document is already locked\n const request = await requests.get(`${serverURL}${api}/payload-locked-documents`, {\n credentials: 'include',\n params: isGlobal\n ? {\n 'where[globalSlug][equals]': slug,\n }\n : {\n 'where[document.relationTo][equals]': slug,\n 'where[document.value][equals]': docID,\n },\n })\n\n const { docs } = await request.json()\n\n if (docs?.length > 0) {\n const lockID = docs[0].id\n\n const userData =\n typeof user === 'object'\n ? { relationTo: user.collection, value: user.id }\n : { relationTo: 'users', value: user }\n\n // Send a patch request to update the _lastEdited info\n await requests.patch(`${serverURL}${api}/payload-locked-documents/${lockID}`, {\n body: JSON.stringify({\n user: userData,\n }),\n credentials: 'include',\n headers: {\n 'Content-Type': 'application/json',\n },\n })\n }\n } catch (error) {\n // eslint-disable-next-line no-console\n console.error('Failed to update the document editor', error)\n }\n },\n [serverURL, api, globalSlug],\n )\n\n const getDocPermissions = useGetDocPermissions({\n id: id as string,\n api,\n collectionSlug,\n globalSlug,\n i18n,\n locale,\n permissions,\n serverURL,\n setDocPermissions,\n setHasPublishPermission,\n setHasSavePermission,\n })\n\n const getDocPreferences = useCallback(() => {\n return getPreference<DocumentPreferences>(preferencesKey)\n }, [getPreference, preferencesKey])\n\n const setDocFieldPreferences = useCallback<DocumentInfoContext['setDocFieldPreferences']>(\n async (path, fieldPreferences) => {\n const allPreferences = await getDocPreferences()\n\n if (preferencesKey) {\n try {\n await setPreference(preferencesKey, {\n ...allPreferences,\n fields: {\n ...(allPreferences?.fields || {}),\n [path]: {\n ...allPreferences?.fields?.[path],\n ...fieldPreferences,\n },\n },\n })\n } catch (e) {\n console.error(e) // eslint-disable-line no-console\n }\n }\n },\n [setPreference, preferencesKey, getDocPreferences],\n )\n\n const incrementVersionCount = useCallback(() => {\n const newCount = versionCount + 1\n if (collectionConfig && collectionConfig.versions) {\n if (collectionConfig.versions.maxPerDoc > 0) {\n setVersionCount(Math.min(newCount, collectionConfig.versions.maxPerDoc))\n } else {\n setVersionCount(newCount)\n }\n } else if (globalConfig && globalConfig.versions) {\n if (globalConfig.versions.max > 0) {\n setVersionCount(Math.min(newCount, globalConfig.versions.max))\n } else {\n setVersionCount(newCount)\n }\n }\n }, [collectionConfig, globalConfig, versionCount])\n\n /**\n * @todo: Remove this in v4\n * Users should use the `DocumentTitleContext` instead.\n */\n useEffect(() => {\n setDocumentTitle(\n formatDocTitle({\n collectionConfig,\n data: { ...data, id },\n dateFormat,\n fallback: id?.toString(),\n globalConfig,\n i18n,\n }),\n )\n }, [collectionConfig, globalConfig, data, dateFormat, i18n, id])\n\n // clean on unmount\n useEffect(() => {\n const re1 = abortControllerRef.current\n\n return () => {\n if (re1) {\n try {\n re1.abort()\n } catch (_err) {\n // swallow error\n }\n }\n }\n }, [])\n\n const action: string = React.useMemo(() => {\n const docURL = `${baseURL}${pluralType === 'globals' ? `/globals` : ''}/${slug}${id ? `/${id}` : ''}`\n const params = {\n depth: 0,\n 'fallback-locale': 'null',\n locale,\n uploadEdits: uploadEdits || undefined,\n }\n\n return `${docURL}${qs.stringify(params, {\n addQueryPrefix: true,\n })}`\n }, [baseURL, locale, pluralType, id, slug, uploadEdits])\n\n const value: DocumentInfoContext = {\n ...props,\n action,\n currentEditor,\n data,\n docConfig,\n docPermissions,\n documentIsLocked,\n documentLockState,\n getDocPermissions,\n getDocPreferences,\n hasPublishedDoc,\n hasPublishPermission,\n hasSavePermission,\n incrementVersionCount,\n initialData,\n initialState,\n isInitializing,\n lastUpdateTime,\n mostRecentVersionIsAutosaved,\n preferencesKey,\n savedDocumentData: data,\n setCurrentEditor,\n setData,\n setDocFieldPreferences,\n setDocumentIsLocked,\n setDocumentTitle,\n setHasPublishedDoc,\n setLastUpdateTime,\n setMostRecentVersionIsAutosaved,\n setUnpublishedVersionCount,\n setUploadStatus: updateUploadStatus,\n title,\n unlockDocument,\n unpublishedVersionCount,\n updateDocumentEditor,\n updateSavedDocumentData: setData,\n uploadStatus,\n versionCount,\n }\n\n return (\n <Context value={value}>\n <DocumentTitleProvider>{children}</DocumentTitleProvider>\n </Context>\n )\n}\n\nexport const DocumentInfoProvider: React.FC<\n {\n readonly children: React.ReactNode\n } & DocumentInfoProps\n> = (props) => {\n return (\n <UploadEditsProvider>\n <DocumentInfo {...props} />\n </UploadEditsProvider>\n )\n}\n"],"names":["qs","React","createContext","use","useCallback","useEffect","useMemo","useRef","useState","useControllableState","useAuth","requests","formatDocTitle","useConfig","DocumentTitleProvider","useLocale","useLocaleLoading","usePreferences","useTranslation","UploadEditsProvider","useUploadEdits","useGetDocPermissions","Context","useDocumentInfo","DocumentInfo","children","props","id","collectionSlug","currentEditor","currentEditorFromProps","docPermissions","docPermissionsFromProps","globalSlug","hasPublishedDoc","hasPublishedDocFromProps","hasPublishPermission","hasPublishPermissionFromProps","hasSavePermission","hasSavePermissionFromProps","initialData","initialState","isLocked","isLockedFromProps","lastUpdateTime","lastUpdateTimeFromProps","mostRecentVersionIsAutosaved","mostRecentVersionIsAutosavedFromProps","unpublishedVersionCount","unpublishedVersionCountFromProps","versionCount","versionCountFromProps","setDocPermissions","setHasSavePermission","setHasPublishPermission","permissions","config","admin","dateFormat","routes","api","serverURL","getEntityConfig","collectionConfig","globalConfig","abortControllerRef","AbortController","docConfig","i18n","uploadEdits","title","setDocumentTitle","data","fallback","toString","setMostRecentVersionIsAutosaved","setVersionCount","setHasPublishedDoc","setUnpublishedVersionCount","documentIsLocked","setDocumentIsLocked","setCurrentEditor","setLastUpdateTime","setData","uploadStatus","setUploadStatus","documentLockState","hasShownLockedModal","user","updateUploadStatus","status","getPreference","setPreference","code","locale","localeIsLoading","isInitializing","undefined","baseURL","slug","pluralType","preferencesKey","unlockDocument","docID","isGlobal","request","get","credentials","params","docs","json","length","lockID","delete","headers","error","console","updateDocumentEditor","userData","relationTo","collection","value","patch","body","JSON","stringify","getDocPermissions","getDocPreferences","setDocFieldPreferences","path","fieldPreferences","allPreferences","fields","e","incrementVersionCount","newCount","versions","maxPerDoc","Math","min","max","re1","current","abort","_err","action","docURL","depth","addQueryPrefix","savedDocumentData","updateSavedDocumentData","DocumentInfoProvider"],"mappings":"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"}
@@ -1,4 +1,28 @@
1
1
  import React from 'react';
2
- export const DocumentTitleContext = React.createContext('');
2
+ /**
3
+ * @deprecated This property is deprecated and will be removed in v4.
4
+ * Use `data` instead.
5
+ */ /**
6
+ * @deprecated This property is deprecated and will be removed in v4.
7
+ * This is for performance reasons. Use the `DocumentTitleContext` instead
8
+ * via the `useDocumentTitle` hook.
9
+ * @example
10
+ * ```tsx
11
+ * import { useDocumentTitle } from '@payloadcms/ui'
12
+ * const { setDocumentTitle } = useDocumentTitle()
13
+ * ```
14
+ */ /**
15
+ * @deprecated This property is deprecated and will be removed in v4.
16
+ * This is for performance reasons. Use the `DocumentTitleContext` instead
17
+ * via the `useDocumentTitle` hook.
18
+ * @example
19
+ * ```tsx
20
+ * import { useDocumentTitle } from '@payloadcms/ui'
21
+ * const { title } = useDocumentTitle()
22
+ * ```
23
+ */ /**
24
+ * @deprecated This property is deprecated and will be removed in v4.
25
+ * Use `setData` instead.
26
+ */ export const DocumentTitleContext = React.createContext('');
3
27
 
4
28
  //# sourceMappingURL=types.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/providers/DocumentInfo/types.ts"],"sourcesContent":["import type {\n ClientCollectionConfig,\n ClientGlobalConfig,\n ClientUser,\n Data,\n DocumentPreferences,\n FormState,\n InsideFieldsPreferences,\n SanitizedCollectionConfig,\n SanitizedDocumentPermissions,\n SanitizedGlobalConfig,\n TypedUser,\n} from 'payload'\n\nimport React from 'react'\n\nimport type { GetDocPermissions } from './useGetDocPermissions.js'\n\nexport type DocumentInfoProps = {\n readonly action?: string\n readonly AfterDocument?: React.ReactNode\n readonly AfterFields?: React.ReactNode\n readonly apiURL?: string\n readonly BeforeFields?: React.ReactNode\n readonly collectionSlug?: SanitizedCollectionConfig['slug']\n readonly currentEditor: TypedUser\n readonly disableActions?: boolean\n readonly disableCreate?: boolean\n readonly disableLeaveWithoutSaving?: boolean\n readonly docPermissions?: SanitizedDocumentPermissions\n readonly globalSlug?: SanitizedGlobalConfig['slug']\n readonly hasPublishedDoc: boolean\n readonly hasPublishPermission?: boolean\n readonly hasSavePermission?: boolean\n readonly id?: number | string\n readonly initialData?: Data\n readonly initialState?: FormState\n readonly isEditing?: boolean\n readonly isLocked: boolean\n readonly isTrashed?: boolean\n readonly lastUpdateTime: number\n readonly mostRecentVersionIsAutosaved: boolean\n readonly redirectAfterCreate?: boolean\n readonly redirectAfterDelete?: boolean\n readonly redirectAfterDuplicate?: boolean\n readonly redirectAfterRestore?: boolean\n readonly unpublishedVersionCount: number\n readonly Upload?: React.ReactNode\n readonly versionCount: number\n}\n\nexport type DocumentInfoContext = {\n currentEditor?: ClientUser | null | number | string\n data?: Data\n docConfig?: ClientCollectionConfig | ClientGlobalConfig\n documentIsLocked?: boolean\n documentLockState: React.RefObject<{\n hasShownLockedModal: boolean\n isLocked: boolean\n user: ClientUser | number | string\n } | null>\n getDocPermissions: GetDocPermissions\n getDocPreferences: () => Promise<DocumentPreferences>\n incrementVersionCount: () => void\n isInitializing: boolean\n preferencesKey?: string\n /**\n * @deprecated This property is deprecated and will be removed in v4.\n * Use `data` instead.\n */\n savedDocumentData?: Data\n setCurrentEditor?: React.Dispatch<React.SetStateAction<ClientUser>>\n setData: (data: Data) => void\n setDocFieldPreferences: (\n field: string,\n fieldPreferences: { [key: string]: unknown } & Partial<InsideFieldsPreferences>,\n ) => void\n setDocumentIsLocked?: React.Dispatch<React.SetStateAction<boolean>>\n /**\n * @deprecated This property is deprecated and will be removed in v4.\n * This is for performance reasons. Use the `DocumentTitleContext` instead\n * via the `useDocumentTitle` hook.\n * @example\n * ```tsx\n * import { useDocumentTitle } from '@payloadcms/ui'\n * const { setDocumentTitle } = useDocumentTitle()\n * ```\n */\n setDocumentTitle: React.Dispatch<React.SetStateAction<string>>\n setHasPublishedDoc: React.Dispatch<React.SetStateAction<boolean>>\n setLastUpdateTime: React.Dispatch<React.SetStateAction<number>>\n setMostRecentVersionIsAutosaved: React.Dispatch<React.SetStateAction<boolean>>\n setUnpublishedVersionCount: React.Dispatch<React.SetStateAction<number>>\n setUploadStatus?: (status: 'failed' | 'idle' | 'uploading') => void\n /**\n * @deprecated This property is deprecated and will be removed in v4.\n * This is for performance reasons. Use the `DocumentTitleContext` instead\n * via the `useDocumentTitle` hook.\n * @example\n * ```tsx\n * import { useDocumentTitle } from '@payloadcms/ui'\n * const { title } = useDocumentTitle()\n * ```\n */\n title: string\n unlockDocument: (docID: number | string, slug: string) => Promise<void>\n unpublishedVersionCount: number\n updateDocumentEditor: (docID: number | string, slug: string, user: ClientUser) => Promise<void>\n /**\n * @deprecated This property is deprecated and will be removed in v4.\n * Use `setData` instead.\n */\n updateSavedDocumentData: (data: Data) => void\n uploadStatus?: 'failed' | 'idle' | 'uploading'\n versionCount: number\n} & DocumentInfoProps\n\nexport const DocumentTitleContext = React.createContext<string>('')\n"],"names":["React","DocumentTitleContext","createContext"],"mappings":"AAcA,OAAOA,WAAW,QAAO;AAuGzB,OAAO,MAAMC,uBAAuBD,MAAME,aAAa,CAAS,IAAG"}
1
+ {"version":3,"sources":["../../../src/providers/DocumentInfo/types.ts"],"sourcesContent":["import type {\n ClientCollectionConfig,\n ClientGlobalConfig,\n ClientUser,\n Data,\n DocumentPreferences,\n FormState,\n InsideFieldsPreferences,\n SanitizedCollectionConfig,\n SanitizedDocumentPermissions,\n SanitizedGlobalConfig,\n TypedUser,\n} from 'payload'\n\nimport React from 'react'\n\nimport type { GetDocPermissions } from './useGetDocPermissions.js'\n\nexport type DocumentInfoProps = {\n readonly action?: string\n readonly AfterDocument?: React.ReactNode\n readonly AfterFields?: React.ReactNode\n readonly apiURL?: string\n readonly BeforeFields?: React.ReactNode\n readonly collectionSlug?: SanitizedCollectionConfig['slug']\n readonly currentEditor: TypedUser\n readonly disableActions?: boolean\n readonly disableCreate?: boolean\n readonly disableLeaveWithoutSaving?: boolean\n readonly docPermissions?: SanitizedDocumentPermissions\n readonly globalSlug?: SanitizedGlobalConfig['slug']\n readonly hasPublishedDoc: boolean\n readonly hasPublishPermission?: boolean\n readonly hasSavePermission?: boolean\n readonly id?: number | string\n readonly initialData?: Data\n readonly initialState?: FormState\n readonly isEditing?: boolean\n readonly isLocked: boolean\n readonly isTrashed?: boolean\n readonly lastUpdateTime: number\n readonly mostRecentVersionIsAutosaved: boolean\n readonly redirectAfterCreate?: boolean\n readonly redirectAfterDelete?: boolean\n readonly redirectAfterDuplicate?: boolean\n readonly redirectAfterRestore?: boolean\n readonly unpublishedVersionCount: number\n readonly Upload?: React.ReactNode\n readonly versionCount: number\n}\n\nexport type DocumentInfoContext = {\n currentEditor?: ClientUser | null | number | string\n data?: Data\n docConfig?: ClientCollectionConfig | ClientGlobalConfig\n documentIsLocked?: boolean\n documentLockState: React.RefObject<{\n hasShownLockedModal: boolean\n isLocked: boolean\n user: ClientUser | number | string\n } | null>\n getDocPermissions: GetDocPermissions\n getDocPreferences: () => Promise<DocumentPreferences>\n incrementVersionCount: () => void\n isInitializing: boolean\n preferencesKey?: string\n /**\n * @deprecated This property is deprecated and will be removed in v4.\n * Use `data` instead.\n */\n savedDocumentData?: Data\n setCurrentEditor?: React.Dispatch<React.SetStateAction<ClientUser>>\n setData: (data: Data) => void\n setDocFieldPreferences: (\n field: string,\n fieldPreferences: { [key: string]: unknown } & Partial<InsideFieldsPreferences>,\n ) => void\n setDocumentIsLocked?: React.Dispatch<React.SetStateAction<boolean>>\n /**\n * @deprecated This property is deprecated and will be removed in v4.\n * This is for performance reasons. Use the `DocumentTitleContext` instead\n * via the `useDocumentTitle` hook.\n * @example\n * ```tsx\n * import { useDocumentTitle } from '@payloadcms/ui'\n * const { setDocumentTitle } = useDocumentTitle()\n * ```\n */\n setDocumentTitle: React.Dispatch<React.SetStateAction<string>>\n setHasPublishedDoc: React.Dispatch<React.SetStateAction<boolean>>\n setLastUpdateTime: React.Dispatch<React.SetStateAction<number>>\n setMostRecentVersionIsAutosaved: React.Dispatch<React.SetStateAction<boolean>>\n setUnpublishedVersionCount: React.Dispatch<React.SetStateAction<number>>\n setUploadStatus?: (status: 'failed' | 'idle' | 'uploading') => void\n /**\n * @deprecated This property is deprecated and will be removed in v4.\n * This is for performance reasons. Use the `DocumentTitleContext` instead\n * via the `useDocumentTitle` hook.\n * @example\n * ```tsx\n * import { useDocumentTitle } from '@payloadcms/ui'\n * const { title } = useDocumentTitle()\n * ```\n */\n title: string\n unlockDocument: (docID: number | string, slug: string) => Promise<void>\n unpublishedVersionCount: number\n updateDocumentEditor: (docID: number | string, slug: string, user: ClientUser) => Promise<void>\n /**\n * @deprecated This property is deprecated and will be removed in v4.\n * Use `setData` instead.\n */\n updateSavedDocumentData: (data: Data) => void\n uploadStatus?: 'failed' | 'idle' | 'uploading'\n versionCount: number\n} & DocumentInfoProps\n\nexport const DocumentTitleContext = React.createContext<string>('')\n"],"names":["React","DocumentTitleContext","createContext"],"mappings":"AAcA,OAAOA,WAAW,QAAO;AAoDvB;;;GAGC,GASD;;;;;;;;;GASC,GAOD;;;;;;;;;GASC,GAKD;;;GAGC,GAMH,OAAO,MAAMC,uBAAuBD,MAAME,aAAa,CAAS,IAAG"}
@@ -12,7 +12,12 @@ import { useLocale } from '../Locale/index.js';
12
12
  import { useRouteTransition } from '../RouteTransition/index.js';
13
13
  import { useTranslation } from '../Translation/index.js';
14
14
  import { groupItemIDsByRelation } from './groupItemIDsByRelation.js';
15
- const Context = /*#__PURE__*/ React.createContext({
15
+ /**
16
+ * The collection slugs that a view can be filtered by
17
+ * Used in the browse-by-folder view
18
+ */ /**
19
+ * Folder enabled collection slugs that can be populated within the provider
20
+ */ const Context = /*#__PURE__*/ React.createContext({
16
21
  activeCollectionFolderSlugs: [],
17
22
  allCollectionFolderSlugs: [],
18
23
  allowCreateCollectionSlugs: [],
@@ -46,7 +51,44 @@ const Context = /*#__PURE__*/ React.createContext({
46
51
  sort: 'name',
47
52
  subfolders: []
48
53
  });
49
- export function FolderProvider({ activeCollectionFolderSlugs: activeCollectionSlugs, allCollectionFolderSlugs = [], allowCreateCollectionSlugs, allowMultiSelection = true, baseFolderPath, breadcrumbs: _breadcrumbsFromProps = [], children, documents, folderFieldName, folderID, FolderResultsComponent: InitialFolderResultsComponent, onItemClick: onItemClickFromProps, search, sort = 'name', subfolders }) {
54
+ /**
55
+ * The collection slugs that are being viewed
56
+ */ /**
57
+ * Folder enabled collection slugs that can be populated within the provider
58
+ */ /**
59
+ * Array of slugs that can be created in the folder view
60
+ */ /**
61
+ * The base folder route path
62
+ *
63
+ * @example
64
+ * `/collections/:collectionSlug/:folderCollectionSlug`
65
+ * or
66
+ * `/browse-by-folder`
67
+ */ /**
68
+ * Breadcrumbs for the current folder
69
+ */ /**
70
+ * Children to render inside the provider
71
+ */ /**
72
+ * All documents in the current folder
73
+ */ /**
74
+ * The name of the field that contains the folder relation
75
+ */ /**
76
+ * The ID of the current folder
77
+ */ /**
78
+ * The component to render the folder results
79
+ */ /**
80
+ * Optional function to call when an item is clicked
81
+ */ /**
82
+ * The intial search query
83
+ */ /**
84
+ * The sort order of the documents
85
+ *
86
+ * @example
87
+ * `name` for descending
88
+ * `-name` for ascending
89
+ */ /**
90
+ * All subfolders in the current folder
91
+ */ export function FolderProvider({ activeCollectionFolderSlugs: activeCollectionSlugs, allCollectionFolderSlugs = [], allowCreateCollectionSlugs, allowMultiSelection = true, baseFolderPath, breadcrumbs: _breadcrumbsFromProps = [], children, documents, folderFieldName, folderID, FolderResultsComponent: InitialFolderResultsComponent, onItemClick: onItemClickFromProps, search, sort = 'name', subfolders }) {
50
92
  const parentFolderContext = useFolder();
51
93
  const { config } = useConfig();
52
94
  const { routes, serverURL } = config;