@payloadcms/ui 4.0.0-internal.e55ccef → 4.0.0-internal.f11981a

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 (361) hide show
  1. package/dist/css/app.css +121 -0
  2. package/dist/css/forms.css +0 -6
  3. package/dist/css/spacing.css +11 -3
  4. package/dist/css/z-index.css +1 -0
  5. package/dist/elements/AddNewRelation/index.css +0 -1
  6. package/dist/elements/AppHeader/index.css +0 -3
  7. package/dist/elements/AppHeader/index.d.ts.map +1 -1
  8. package/dist/elements/AppHeader/index.js +5 -1
  9. package/dist/elements/AppHeader/index.js.map +1 -1
  10. package/dist/elements/ArrayAction/index.d.ts +2 -0
  11. package/dist/elements/ArrayAction/index.d.ts.map +1 -1
  12. package/dist/elements/ArrayAction/index.js +65 -24
  13. package/dist/elements/ArrayAction/index.js.map +1 -1
  14. package/dist/elements/BulkUpload/EditMany/DrawerContent.js +2 -2
  15. package/dist/elements/BulkUpload/EditMany/DrawerContent.js.map +1 -1
  16. package/dist/elements/BulkUpload/FileSidebar/index.css +4 -0
  17. package/dist/elements/BulkUpload/FormsManager/createFormData.d.ts +2 -2
  18. package/dist/elements/BulkUpload/FormsManager/createFormData.d.ts.map +1 -1
  19. package/dist/elements/BulkUpload/FormsManager/createFormData.js +4 -15
  20. package/dist/elements/BulkUpload/FormsManager/createFormData.js.map +1 -1
  21. package/dist/elements/BulkUpload/FormsManager/index.d.ts.map +1 -1
  22. package/dist/elements/BulkUpload/FormsManager/index.js +1 -1
  23. package/dist/elements/BulkUpload/FormsManager/index.js.map +1 -1
  24. package/dist/elements/ClipboardAction/clipboardUtilities.d.ts +8 -1
  25. package/dist/elements/ClipboardAction/clipboardUtilities.d.ts.map +1 -1
  26. package/dist/elements/ClipboardAction/clipboardUtilities.js +40 -8
  27. package/dist/elements/ClipboardAction/clipboardUtilities.js.map +1 -1
  28. package/dist/elements/ClipboardAction/clipboardUtilities.spec.js +120 -0
  29. package/dist/elements/ClipboardAction/clipboardUtilities.spec.js.map +1 -0
  30. package/dist/elements/ClipboardAction/index.d.ts.map +1 -1
  31. package/dist/elements/ClipboardAction/index.js +17 -1
  32. package/dist/elements/ClipboardAction/index.js.map +1 -1
  33. package/dist/elements/ClipboardAction/isClipboardDataValid.spec.js +144 -0
  34. package/dist/elements/ClipboardAction/isClipboardDataValid.spec.js.map +1 -0
  35. package/dist/elements/ClipboardAction/types.d.ts +3 -0
  36. package/dist/elements/ClipboardAction/types.d.ts.map +1 -1
  37. package/dist/elements/ClipboardAction/types.js.map +1 -1
  38. package/dist/elements/ClipboardAction/useCanPasteClipboard.d.ts +10 -0
  39. package/dist/elements/ClipboardAction/useCanPasteClipboard.d.ts.map +1 -0
  40. package/dist/elements/ClipboardAction/useCanPasteClipboard.js +21 -0
  41. package/dist/elements/ClipboardAction/useCanPasteClipboard.js.map +1 -0
  42. package/dist/elements/CodeEditor/index.css +0 -5
  43. package/dist/elements/CommandPalette/index.css +0 -7
  44. package/dist/elements/CopyToClipboard/index.d.ts +1 -0
  45. package/dist/elements/CopyToClipboard/index.d.ts.map +1 -1
  46. package/dist/elements/CopyToClipboard/index.js +10 -8
  47. package/dist/elements/CopyToClipboard/index.js.map +1 -1
  48. package/dist/elements/CreateDocumentButton/index.d.ts.map +1 -1
  49. package/dist/elements/CreateDocumentButton/index.js +4 -1
  50. package/dist/elements/CreateDocumentButton/index.js.map +1 -1
  51. package/dist/elements/DatePicker/DatePicker.d.ts.map +1 -1
  52. package/dist/elements/DatePicker/DatePicker.js +1 -0
  53. package/dist/elements/DatePicker/DatePicker.js.map +1 -1
  54. package/dist/elements/DatePicker/index.css +1 -1
  55. package/dist/elements/DeleteDocument/index.d.ts.map +1 -1
  56. package/dist/elements/DeleteDocument/index.js +16 -1
  57. package/dist/elements/DeleteDocument/index.js.map +1 -1
  58. package/dist/elements/EditMany/DrawerContent.js +2 -2
  59. package/dist/elements/EditMany/DrawerContent.js.map +1 -1
  60. package/dist/elements/FieldSelect/reduceFieldOptions.d.ts.map +1 -1
  61. package/dist/elements/FieldSelect/reduceFieldOptions.js +3 -1
  62. package/dist/elements/FieldSelect/reduceFieldOptions.js.map +1 -1
  63. package/dist/elements/FieldSelect/reduceFieldOptions.spec.js +143 -0
  64. package/dist/elements/FieldSelect/reduceFieldOptions.spec.js.map +1 -0
  65. package/dist/elements/FileDetails/StaticFileDetails/index.css +8 -9
  66. package/dist/elements/FileManager/FilePreview/index.css +3 -3
  67. package/dist/elements/FileManager/FileToolbar/index.d.ts.map +1 -1
  68. package/dist/elements/FileManager/FileToolbar/index.js +3 -0
  69. package/dist/elements/FileManager/FileToolbar/index.js.map +1 -1
  70. package/dist/elements/FileManager/index.css +36 -23
  71. package/dist/elements/FileManager/index.d.ts +1 -1
  72. package/dist/elements/FileManager/index.d.ts.map +1 -1
  73. package/dist/elements/FileManager/index.js +15 -4
  74. package/dist/elements/FileManager/index.js.map +1 -1
  75. package/dist/elements/Hierarchy/ColumnBrowser/ColumnItem/index.css +0 -1
  76. package/dist/elements/Hierarchy/Tree/HierarchySidebarTab.d.ts.map +1 -1
  77. package/dist/elements/Hierarchy/Tree/HierarchySidebarTab.js +109 -89
  78. package/dist/elements/Hierarchy/Tree/HierarchySidebarTab.js.map +1 -1
  79. package/dist/elements/Hierarchy/Tree/HierarchySidebarTab.server.d.ts.map +1 -1
  80. package/dist/elements/Hierarchy/Tree/HierarchySidebarTab.server.js +2 -0
  81. package/dist/elements/Hierarchy/Tree/HierarchySidebarTab.server.js.map +1 -1
  82. package/dist/elements/Hierarchy/Tree/TreeNode/index.css +0 -1
  83. package/dist/elements/InputStepper/index.css +0 -1
  84. package/dist/elements/Locked/index.css +0 -8
  85. package/dist/elements/Locked/index.d.ts.map +1 -1
  86. package/dist/elements/Locked/index.js +70 -64
  87. package/dist/elements/Locked/index.js.map +1 -1
  88. package/dist/elements/MiniCarousel/index.css +39 -37
  89. package/dist/elements/Nav/SidebarTabs/index.client.d.ts.map +1 -1
  90. package/dist/elements/Nav/SidebarTabs/index.client.js +12 -5
  91. package/dist/elements/Nav/SidebarTabs/index.client.js.map +1 -1
  92. package/dist/elements/Nav/SidebarTabs/index.css +0 -5
  93. package/dist/elements/Nav/SidebarTabs/renderTabServerFn.d.ts +1 -0
  94. package/dist/elements/Nav/SidebarTabs/renderTabServerFn.d.ts.map +1 -1
  95. package/dist/elements/Nav/SidebarTabs/renderTabServerFn.js +2 -1
  96. package/dist/elements/Nav/SidebarTabs/renderTabServerFn.js.map +1 -1
  97. package/dist/elements/NavGroup/index.css +0 -1
  98. package/dist/elements/PreviewButton/index.d.ts +1 -2
  99. package/dist/elements/PreviewButton/index.d.ts.map +1 -1
  100. package/dist/elements/PreviewButton/index.js +11 -5
  101. package/dist/elements/PreviewButton/index.js.map +1 -1
  102. package/dist/elements/PreviewSizes/index.css +8 -9
  103. package/dist/elements/ReactSelect/ClearIndicator/index.css +0 -1
  104. package/dist/elements/ReactSelect/MultiValue/index.css +0 -1
  105. package/dist/elements/ReactSelect/MultiValueLabel/index.css +2 -2
  106. package/dist/elements/ReactSelect/index.css +0 -3
  107. package/dist/elements/RelationshipTable/Pagination.d.ts +0 -1
  108. package/dist/elements/RelationshipTable/Pagination.d.ts.map +1 -1
  109. package/dist/elements/RelationshipTable/Pagination.js +27 -77
  110. package/dist/elements/RelationshipTable/Pagination.js.map +1 -1
  111. package/dist/elements/RelationshipTable/index.css +0 -2
  112. package/dist/elements/RelationshipTable/index.d.ts +1 -0
  113. package/dist/elements/RelationshipTable/index.d.ts.map +1 -1
  114. package/dist/elements/RelationshipTable/index.js +36 -3
  115. package/dist/elements/RelationshipTable/index.js.map +1 -1
  116. package/dist/elements/RenderTitle/index.css +4 -0
  117. package/dist/elements/RenderTitle/index.d.ts.map +1 -1
  118. package/dist/elements/RenderTitle/index.js +18 -13
  119. package/dist/elements/RenderTitle/index.js.map +1 -1
  120. package/dist/elements/SelectRow/index.d.ts +4 -3
  121. package/dist/elements/SelectRow/index.d.ts.map +1 -1
  122. package/dist/elements/SelectRow/index.js +10 -7
  123. package/dist/elements/SelectRow/index.js.map +1 -1
  124. package/dist/elements/SidebarToggle/index.css +0 -17
  125. package/dist/elements/SortColumn/index.d.ts.map +1 -1
  126. package/dist/elements/SortColumn/index.js +42 -38
  127. package/dist/elements/SortColumn/index.js.map +1 -1
  128. package/dist/elements/Table/OrderableRow.d.ts +3 -1
  129. package/dist/elements/Table/OrderableRow.d.ts.map +1 -1
  130. package/dist/elements/Table/OrderableRow.js +17 -1
  131. package/dist/elements/Table/OrderableRow.js.map +1 -1
  132. package/dist/elements/Table/OrderableTable.d.ts.map +1 -1
  133. package/dist/elements/Table/OrderableTable.js +19 -2
  134. package/dist/elements/Table/OrderableTable.js.map +1 -1
  135. package/dist/elements/Table/index.css +1 -0
  136. package/dist/elements/TableSection/index.css +0 -1
  137. package/dist/elements/Thumbnail/index.d.ts +1 -1
  138. package/dist/elements/Thumbnail/index.d.ts.map +1 -1
  139. package/dist/elements/Thumbnail/index.js.map +1 -1
  140. package/dist/elements/TimezonePicker/index.d.ts.map +1 -1
  141. package/dist/elements/TimezonePicker/index.js +5 -1
  142. package/dist/elements/TimezonePicker/index.js.map +1 -1
  143. package/dist/elements/Tooltip/index.css +15 -34
  144. package/dist/elements/Tooltip/index.d.ts +11 -3
  145. package/dist/elements/Tooltip/index.d.ts.map +1 -1
  146. package/dist/elements/Tooltip/index.js +151 -85
  147. package/dist/elements/Tooltip/index.js.map +1 -1
  148. package/dist/elements/Upload/index.css +0 -5
  149. package/dist/exports/client/index.d.ts +5 -1
  150. package/dist/exports/client/index.d.ts.map +1 -1
  151. package/dist/exports/client/index.js +1 -1
  152. package/dist/exports/client/index.js.map +3 -3
  153. package/dist/fields/Array/ArrayRow.d.ts.map +1 -1
  154. package/dist/fields/Array/ArrayRow.js +97 -160
  155. package/dist/fields/Array/ArrayRow.js.map +1 -1
  156. package/dist/fields/Blocks/BlockRow.d.ts.map +1 -1
  157. package/dist/fields/Blocks/BlockRow.js +134 -195
  158. package/dist/fields/Blocks/BlockRow.js.map +1 -1
  159. package/dist/fields/Blocks/RowActions.d.ts +2 -0
  160. package/dist/fields/Blocks/RowActions.d.ts.map +1 -1
  161. package/dist/fields/Blocks/RowActions.js +23 -20
  162. package/dist/fields/Blocks/RowActions.js.map +1 -1
  163. package/dist/fields/Blocks/index.js +3 -3
  164. package/dist/fields/Blocks/index.js.map +1 -1
  165. package/dist/fields/Checkbox/Input.d.ts +2 -0
  166. package/dist/fields/Checkbox/Input.d.ts.map +1 -1
  167. package/dist/fields/Checkbox/Input.js +32 -26
  168. package/dist/fields/Checkbox/Input.js.map +1 -1
  169. package/dist/fields/Checkbox/index.css +37 -73
  170. package/dist/fields/FieldError/index.css +0 -9
  171. package/dist/fields/FieldError/index.d.ts.map +1 -1
  172. package/dist/fields/FieldError/index.js +19 -9
  173. package/dist/fields/FieldError/index.js.map +1 -1
  174. package/dist/fields/Join/index.css +9 -0
  175. package/dist/fields/Join/index.d.ts.map +1 -1
  176. package/dist/fields/Join/index.js +13 -9
  177. package/dist/fields/Join/index.js.map +1 -1
  178. package/dist/fields/RadioGroup/index.css +0 -7
  179. package/dist/fields/Relationship/Input.d.ts.map +1 -1
  180. package/dist/fields/Relationship/Input.js +32 -14
  181. package/dist/fields/Relationship/Input.js.map +1 -1
  182. package/dist/fields/Relationship/select-components/MultiValueLabel/index.css +1 -1
  183. package/dist/fields/Slug/index.css +0 -1
  184. package/dist/fields/Slug/index.d.ts.map +1 -1
  185. package/dist/fields/Slug/index.js +75 -111
  186. package/dist/fields/Slug/index.js.map +1 -1
  187. package/dist/fields/Upload/index.css +19 -4
  188. package/dist/forms/Form/fieldReducer.d.ts.map +1 -1
  189. package/dist/forms/Form/fieldReducer.js +3 -1
  190. package/dist/forms/Form/fieldReducer.js.map +1 -1
  191. package/dist/forms/Form/index.d.ts.map +1 -1
  192. package/dist/forms/Form/index.js +12 -15
  193. package/dist/forms/Form/index.js.map +1 -1
  194. package/dist/forms/Form/types.d.ts +1 -1
  195. package/dist/forms/Form/types.d.ts.map +1 -1
  196. package/dist/forms/Form/types.js.map +1 -1
  197. package/dist/forms/RenderFields/index.css +16 -2
  198. package/dist/forms/WatchChildErrors/index.d.ts.map +1 -1
  199. package/dist/forms/WatchChildErrors/index.js +2 -2
  200. package/dist/forms/WatchChildErrors/index.js.map +1 -1
  201. package/dist/forms/fieldSchemasToFormState/addFieldStatePromise.js +1 -1
  202. package/dist/forms/fieldSchemasToFormState/addFieldStatePromise.js.map +1 -1
  203. package/dist/forms/fieldSchemasToFormState/renderField.d.ts.map +1 -1
  204. package/dist/forms/fieldSchemasToFormState/renderField.js +1 -3
  205. package/dist/forms/fieldSchemasToFormState/renderField.js.map +1 -1
  206. package/dist/layouts/Root/index.d.ts +1 -1
  207. package/dist/layouts/Root/index.d.ts.map +1 -1
  208. package/dist/layouts/Root/index.js +8 -2
  209. package/dist/layouts/Root/index.js.map +1 -1
  210. package/dist/providers/Auth/AuthSessionDebug/index.css +48 -0
  211. package/dist/providers/Auth/AuthSessionDebug/index.d.ts +13 -0
  212. package/dist/providers/Auth/AuthSessionDebug/index.d.ts.map +1 -0
  213. package/dist/providers/Auth/AuthSessionDebug/index.js +93 -0
  214. package/dist/providers/Auth/AuthSessionDebug/index.js.map +1 -0
  215. package/dist/providers/Auth/AuthSessionDebug/utilities.d.ts +21 -0
  216. package/dist/providers/Auth/AuthSessionDebug/utilities.d.ts.map +1 -0
  217. package/dist/providers/Auth/AuthSessionDebug/utilities.js +53 -0
  218. package/dist/providers/Auth/AuthSessionDebug/utilities.js.map +1 -0
  219. package/dist/providers/Auth/authSessionRequests.d.ts +27 -0
  220. package/dist/providers/Auth/authSessionRequests.d.ts.map +1 -0
  221. package/dist/providers/Auth/authSessionRequests.js +119 -0
  222. package/dist/providers/Auth/authSessionRequests.js.map +1 -0
  223. package/dist/providers/Auth/authSessionRequests.spec.js +121 -0
  224. package/dist/providers/Auth/authSessionRequests.spec.js.map +1 -0
  225. package/dist/providers/Auth/index.d.ts +2 -56
  226. package/dist/providers/Auth/index.d.ts.map +1 -1
  227. package/dist/providers/Auth/index.js +283 -135
  228. package/dist/providers/Auth/index.js.map +1 -1
  229. package/dist/providers/Auth/sessionActivity.d.ts +23 -0
  230. package/dist/providers/Auth/sessionActivity.d.ts.map +1 -0
  231. package/dist/providers/Auth/sessionActivity.js +49 -0
  232. package/dist/providers/Auth/sessionActivity.js.map +1 -0
  233. package/dist/providers/Auth/sessionActivity.spec.js +44 -0
  234. package/dist/providers/Auth/sessionActivity.spec.js.map +1 -0
  235. package/dist/providers/Auth/sessionTiming.d.ts +11 -0
  236. package/dist/providers/Auth/sessionTiming.d.ts.map +1 -0
  237. package/dist/providers/Auth/sessionTiming.js +18 -0
  238. package/dist/providers/Auth/sessionTiming.js.map +1 -0
  239. package/dist/providers/Auth/tabSessionSync/index.d.ts +17 -0
  240. package/dist/providers/Auth/tabSessionSync/index.d.ts.map +1 -0
  241. package/dist/providers/Auth/tabSessionSync/index.js +263 -0
  242. package/dist/providers/Auth/tabSessionSync/index.js.map +1 -0
  243. package/dist/providers/Auth/tabSessionSync/index.spec.js +463 -0
  244. package/dist/providers/Auth/tabSessionSync/index.spec.js.map +1 -0
  245. package/dist/providers/Auth/tabSessionSync/types.d.ts +107 -0
  246. package/dist/providers/Auth/tabSessionSync/types.d.ts.map +1 -0
  247. package/dist/providers/Auth/tabSessionSync/types.js +6 -0
  248. package/dist/providers/Auth/tabSessionSync/types.js.map +1 -0
  249. package/dist/providers/Auth/tabSessionSync/useTabSessionSync.d.ts +11 -0
  250. package/dist/providers/Auth/tabSessionSync/useTabSessionSync.d.ts.map +1 -0
  251. package/dist/providers/Auth/tabSessionSync/useTabSessionSync.js +90 -0
  252. package/dist/providers/Auth/tabSessionSync/useTabSessionSync.js.map +1 -0
  253. package/dist/providers/Auth/tabSessionSync/utilities.d.ts +26 -0
  254. package/dist/providers/Auth/tabSessionSync/utilities.d.ts.map +1 -0
  255. package/dist/providers/Auth/tabSessionSync/utilities.js +159 -0
  256. package/dist/providers/Auth/tabSessionSync/utilities.js.map +1 -0
  257. package/dist/providers/Auth/types.d.ts +66 -0
  258. package/dist/providers/Auth/types.d.ts.map +1 -0
  259. package/dist/providers/Auth/types.js +2 -0
  260. package/dist/providers/Auth/types.js.map +1 -0
  261. package/dist/providers/Auth/useAuthSessionTimers.d.ts +26 -0
  262. package/dist/providers/Auth/useAuthSessionTimers.d.ts.map +1 -0
  263. package/dist/providers/Auth/useAuthSessionTimers.js +203 -0
  264. package/dist/providers/Auth/useAuthSessionTimers.js.map +1 -0
  265. package/dist/providers/Auth/useAuthSessionTimers.spec.js +311 -0
  266. package/dist/providers/Auth/useAuthSessionTimers.spec.js.map +1 -0
  267. package/dist/providers/DocumentTitle/index.d.ts +1 -0
  268. package/dist/providers/DocumentTitle/index.d.ts.map +1 -1
  269. package/dist/providers/DocumentTitle/index.js +2 -0
  270. package/dist/providers/DocumentTitle/index.js.map +1 -1
  271. package/dist/providers/Embed/index.d.ts +24 -0
  272. package/dist/providers/Embed/index.d.ts.map +1 -0
  273. package/dist/providers/Embed/index.js +105 -0
  274. package/dist/providers/Embed/index.js.map +1 -0
  275. package/dist/providers/FormErrorHandler/index.d.ts +24 -0
  276. package/dist/providers/FormErrorHandler/index.d.ts.map +1 -0
  277. package/dist/providers/FormErrorHandler/index.js +6 -0
  278. package/dist/providers/FormErrorHandler/index.js.map +1 -0
  279. package/dist/providers/Root/index.d.ts +1 -0
  280. package/dist/providers/Root/index.d.ts.map +1 -1
  281. package/dist/providers/Root/index.js +37 -31
  282. package/dist/providers/Root/index.js.map +1 -1
  283. package/dist/providers/RouteTransition/ProgressBar/index.js +4 -1
  284. package/dist/providers/RouteTransition/ProgressBar/index.js.map +1 -1
  285. package/dist/providers/RouteTransition/ProgressBar/index.spec.js +44 -0
  286. package/dist/providers/RouteTransition/ProgressBar/index.spec.js.map +1 -0
  287. package/dist/providers/RouteTransition/index.d.ts +2 -0
  288. package/dist/providers/RouteTransition/index.d.ts.map +1 -1
  289. package/dist/providers/RouteTransition/index.js +42 -14
  290. package/dist/providers/RouteTransition/index.js.map +1 -1
  291. package/dist/providers/SidebarTabs/index.d.ts +3 -2
  292. package/dist/providers/SidebarTabs/index.d.ts.map +1 -1
  293. package/dist/providers/SidebarTabs/index.js.map +1 -1
  294. package/dist/providers/TableColumns/buildColumnState/index.d.ts.map +1 -1
  295. package/dist/providers/TableColumns/buildColumnState/index.js +1 -1
  296. package/dist/providers/TableColumns/buildColumnState/index.js.map +1 -1
  297. package/dist/providers/TableColumns/buildColumnState/index.spec.js +40 -0
  298. package/dist/providers/TableColumns/buildColumnState/index.spec.js.map +1 -0
  299. package/dist/providers/Theme/index.d.ts +3 -0
  300. package/dist/providers/Theme/index.d.ts.map +1 -1
  301. package/dist/providers/Theme/index.js +107 -95
  302. package/dist/providers/Theme/index.js.map +1 -1
  303. package/dist/providers/UploadHandlers/index.d.ts +2 -7
  304. package/dist/providers/UploadHandlers/index.d.ts.map +1 -1
  305. package/dist/providers/UploadHandlers/index.js +102 -42
  306. package/dist/providers/UploadHandlers/index.js.map +1 -1
  307. package/dist/styles.css +13 -10
  308. package/dist/utilities/combineFieldLabel.d.ts.map +1 -1
  309. package/dist/utilities/combineFieldLabel.js +5 -1
  310. package/dist/utilities/combineFieldLabel.js.map +1 -1
  311. package/dist/utilities/generateFieldID.d.ts +1 -1
  312. package/dist/utilities/generateFieldID.d.ts.map +1 -1
  313. package/dist/utilities/generateFieldID.js +2 -2
  314. package/dist/utilities/generateFieldID.js.map +1 -1
  315. package/dist/utilities/getRequestEmbed.d.ts +14 -0
  316. package/dist/utilities/getRequestEmbed.d.ts.map +1 -0
  317. package/dist/utilities/getRequestEmbed.js +10 -0
  318. package/dist/utilities/getRequestEmbed.js.map +1 -0
  319. package/dist/utilities/handleServerFunctions.d.ts +32 -8
  320. package/dist/utilities/handleServerFunctions.d.ts.map +1 -1
  321. package/dist/utilities/handleServerFunctions.js +17 -37
  322. package/dist/utilities/handleServerFunctions.js.map +1 -1
  323. package/dist/utilities/renderTable.d.ts.map +1 -1
  324. package/dist/utilities/renderTable.js +18 -2
  325. package/dist/utilities/renderTable.js.map +1 -1
  326. package/dist/utilities/serverFunctionRegistry.d.ts +12 -7
  327. package/dist/utilities/serverFunctionRegistry.d.ts.map +1 -1
  328. package/dist/utilities/serverFunctionRegistry.js +25 -7
  329. package/dist/utilities/serverFunctionRegistry.js.map +1 -1
  330. package/dist/utilities/slugify.d.ts.map +1 -1
  331. package/dist/utilities/slugify.js +49 -6
  332. package/dist/utilities/slugify.js.map +1 -1
  333. package/dist/views/Dashboard/Default/ModularDashboard/index.css +0 -8
  334. package/dist/views/Dashboard/Default/ModularDashboard/renderWidget/RenderWidget.js +4 -4
  335. package/dist/views/Dashboard/Default/ModularDashboard/renderWidget/RenderWidget.js.map +1 -1
  336. package/dist/views/Dashboard/Default/ModularDashboard/renderWidget/renderWidgetServerFn.js +10 -10
  337. package/dist/views/Dashboard/Default/ModularDashboard/renderWidget/renderWidgetServerFn.js.map +1 -1
  338. package/dist/views/Edit/index.css +61 -53
  339. package/dist/views/HierarchyList/index.css +1 -1
  340. package/dist/views/List/index.css +1 -1
  341. package/dist/views/List/index.d.ts.map +1 -1
  342. package/dist/views/List/index.js +4 -0
  343. package/dist/views/List/index.js.map +1 -1
  344. package/dist/views/Logout/index.d.ts.map +1 -1
  345. package/dist/views/Logout/index.js +11 -0
  346. package/dist/views/Logout/index.js.map +1 -1
  347. package/dist/views/Root/index.d.ts +12 -1
  348. package/dist/views/Root/index.d.ts.map +1 -1
  349. package/dist/views/Root/index.js +10 -3
  350. package/dist/views/Root/index.js.map +1 -1
  351. package/package.json +6 -11
  352. package/dist/elements/RelationshipTable/Pagination.css +0 -39
  353. package/dist/scss/app.scss +0 -183
  354. package/dist/scss/colors.scss +0 -191
  355. package/dist/scss/custom.css +0 -1
  356. package/dist/scss/queries.scss +0 -27
  357. package/dist/scss/styles.scss +0 -9
  358. package/dist/scss/svg.scss +0 -10
  359. package/dist/scss/toastify.scss +0 -61
  360. package/dist/scss/vars.scss +0 -192
  361. package/dist/scss/z-index.scss +0 -9
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useAuthSessionTimers.js","names":["useCallback","useEffect","useMemo","useRef","createSessionActivityTracker","registerSessionActivityListeners","getAuthSessionTiming","maxTimeoutMs","useAuthSessionTimers","isAuthenticated","onActivity","onActivityRefresh","onExpire","onReminder","activityListenerCleanupRef","undefined","activityCheckpointTimeoutRef","forceLogOutTimeoutRef","hasActiveSessionRef","lastSessionActivityAtRef","scheduledRefreshTimeoutRef","reminderTimeoutRef","sessionTimingRef","tokenExpirationMsRef","callbacksRef","scheduleRefresh","forceRefresh","current","sessionTiming","Date","now","refreshStartsAt","clearTimeout","setTimeout","activityTracker","_source","occurredAt","isFirstActivity","recordActivity","source","isActivityWindowOpen","activityTrackingStartsAt","reminderStartsAt","record","addActivityListeners","markActivity","window","removeActivityListeners","cleanup","resetSessionLifecycle","reset","clear","setExpiration","expirationMs","Number","isFinite","scheduleReminder","reminderStartsInMs","Math","max","expiresAt","min","scheduleActivityCheckpoint","refreshStartsInMs","checkpointAt","lastActivityAt","hasRecentActivity","scheduleExpiration","expiresInMs","getCurrentExpirationMs"],"sources":["../../../src/providers/Auth/useAuthSessionTimers.ts"],"sourcesContent":["'use client'\nimport { useCallback, useEffect, useMemo, useRef } from 'react'\n\nimport type { SessionActivitySource } from './sessionActivity.js'\nimport type { AuthSessionTiming } from './sessionTiming.js'\n\nimport {\n createSessionActivityTracker,\n registerSessionActivityListeners,\n} from './sessionActivity.js'\nimport { getAuthSessionTiming } from './sessionTiming.js'\n\nconst maxTimeoutMs = 2_147_483_647 // ~24.8 days\n\nexport type AuthSessionTimers = {\n clear: () => void\n getCurrentExpirationMs: () => number | undefined\n /** Records activity only while the activity tracking window is open. */\n recordActivity: (source: SessionActivitySource) => boolean\n scheduleRefresh: (forceRefresh?: boolean) => void\n setExpiration: (expirationMs: number) => AuthSessionTiming | undefined\n}\n\nexport type UseAuthSessionTimersArgs = {\n isAuthenticated: boolean\n onActivity: () => void\n onActivityRefresh: () => void\n onExpire: (expirationMs: number) => void\n onReminder: () => void\n}\n\n/**\n * Manages activity-aware refresh, expiration reminders, and logout timing for the current session.\n *\n * Activity inside the refresh window schedules a refresh. Earlier activity is remembered until the\n * refresh-window checkpoint so the session can still be extended without requiring another\n * activity event.\n */\nexport function useAuthSessionTimers({\n isAuthenticated,\n onActivity,\n onActivityRefresh,\n onExpire,\n onReminder,\n}: UseAuthSessionTimersArgs): AuthSessionTimers {\n const activityListenerCleanupRef = useRef<(() => void) | undefined>(undefined)\n const activityCheckpointTimeoutRef = useRef<ReturnType<typeof setTimeout>>(null)\n const forceLogOutTimeoutRef = useRef<ReturnType<typeof setTimeout>>(null)\n const hasActiveSessionRef = useRef(isAuthenticated)\n const lastSessionActivityAtRef = useRef<number>(undefined)\n const scheduledRefreshTimeoutRef = useRef<ReturnType<typeof setTimeout>>(null)\n const reminderTimeoutRef = useRef<ReturnType<typeof setTimeout>>(null)\n const sessionTimingRef = useRef<AuthSessionTiming>(undefined)\n const tokenExpirationMsRef = useRef<number>(undefined)\n const callbacksRef = useRef({ onActivity, onActivityRefresh, onExpire, onReminder })\n\n const scheduleRefresh = useCallback((forceRefresh?: boolean) => {\n if (!hasActiveSessionRef.current) {\n return\n }\n\n const sessionTiming = sessionTimingRef.current\n\n if (forceRefresh || (sessionTiming && Date.now() >= sessionTiming.refreshStartsAt)) {\n clearTimeout(scheduledRefreshTimeoutRef.current)\n scheduledRefreshTimeoutRef.current = setTimeout(() => {\n callbacksRef.current.onActivityRefresh()\n }, 1000)\n }\n }, [])\n\n const activityTracker = useMemo(\n () =>\n createSessionActivityTracker({\n onActivity: (_source, occurredAt) => {\n const isFirstActivity = lastSessionActivityAtRef.current === undefined\n\n lastSessionActivityAtRef.current = occurredAt\n\n if (isFirstActivity) {\n callbacksRef.current.onActivity()\n }\n\n scheduleRefresh()\n },\n }),\n [scheduleRefresh],\n )\n\n const recordActivity = useCallback(\n (source: SessionActivitySource): boolean => {\n const occurredAt = Date.now()\n const sessionTiming = sessionTimingRef.current\n const isActivityWindowOpen =\n sessionTiming &&\n occurredAt >= sessionTiming.activityTrackingStartsAt &&\n occurredAt < sessionTiming.reminderStartsAt\n\n if (!activityListenerCleanupRef.current || !isActivityWindowOpen) {\n return false\n }\n\n return activityTracker.record(source)\n },\n [activityTracker],\n )\n\n const addActivityListeners = useCallback(() => {\n if (activityListenerCleanupRef.current) {\n return\n }\n\n activityListenerCleanupRef.current = registerSessionActivityListeners({\n markActivity: recordActivity,\n window,\n })\n }, [recordActivity])\n\n const removeActivityListeners = useCallback(() => {\n const cleanup = activityListenerCleanupRef.current\n\n if (!cleanup) {\n return\n }\n\n activityListenerCleanupRef.current = undefined\n cleanup()\n }, [])\n\n const resetSessionLifecycle = useCallback(() => {\n clearTimeout(activityCheckpointTimeoutRef.current)\n clearTimeout(forceLogOutTimeoutRef.current)\n clearTimeout(reminderTimeoutRef.current)\n clearTimeout(scheduledRefreshTimeoutRef.current)\n removeActivityListeners()\n activityTracker.reset()\n lastSessionActivityAtRef.current = undefined\n }, [activityTracker, removeActivityListeners])\n\n const clear = useCallback(() => {\n resetSessionLifecycle()\n hasActiveSessionRef.current = false\n sessionTimingRef.current = undefined\n tokenExpirationMsRef.current = undefined\n }, [resetSessionLifecycle])\n\n const setExpiration = useCallback(\n (expirationMs: number) => {\n if (!Number.isFinite(expirationMs)) {\n return\n }\n\n resetSessionLifecycle()\n tokenExpirationMsRef.current = expirationMs\n\n const sessionTiming = getAuthSessionTiming({ expirationMs })\n\n sessionTimingRef.current = sessionTiming\n\n const scheduleReminder = () => {\n if (tokenExpirationMsRef.current !== expirationMs) {\n return\n }\n\n const reminderStartsInMs = Math.max(sessionTiming.reminderStartsAt - Date.now(), 0)\n\n reminderTimeoutRef.current = setTimeout(\n () => {\n if (tokenExpirationMsRef.current !== expirationMs) {\n return\n }\n\n if (Date.now() < sessionTiming.reminderStartsAt) {\n scheduleReminder()\n return\n }\n\n clearTimeout(scheduledRefreshTimeoutRef.current)\n removeActivityListeners()\n\n if (Date.now() < sessionTiming.expiresAt) {\n callbacksRef.current.onReminder()\n }\n },\n Math.min(reminderStartsInMs, maxTimeoutMs),\n )\n }\n\n const scheduleActivityCheckpoint = () => {\n if (tokenExpirationMsRef.current !== expirationMs) {\n return\n }\n\n const refreshStartsInMs = Math.max(sessionTiming.refreshStartsAt - Date.now(), 0)\n\n activityCheckpointTimeoutRef.current = setTimeout(\n () => {\n if (tokenExpirationMsRef.current !== expirationMs) {\n return\n }\n\n const checkpointAt = Date.now()\n\n if (checkpointAt < sessionTiming.refreshStartsAt) {\n scheduleActivityCheckpoint()\n return\n }\n\n const lastActivityAt = lastSessionActivityAtRef.current\n const hasRecentActivity =\n lastActivityAt !== undefined &&\n checkpointAt < sessionTiming.reminderStartsAt &&\n lastActivityAt >= sessionTiming.activityTrackingStartsAt\n\n if (hasRecentActivity) {\n scheduleRefresh(true)\n }\n },\n Math.min(refreshStartsInMs, maxTimeoutMs),\n )\n }\n\n const scheduleExpiration = () => {\n if (tokenExpirationMsRef.current !== expirationMs) {\n return\n }\n\n const expiresInMs = Math.max(sessionTiming.expiresAt - Date.now(), 0)\n\n forceLogOutTimeoutRef.current = setTimeout(\n () => {\n if (tokenExpirationMsRef.current === expirationMs) {\n if (Date.now() < sessionTiming.expiresAt) {\n scheduleExpiration()\n return\n }\n\n hasActiveSessionRef.current = false\n removeActivityListeners()\n callbacksRef.current.onExpire(expirationMs)\n }\n },\n Math.min(expiresInMs, maxTimeoutMs),\n )\n }\n\n hasActiveSessionRef.current = expirationMs > Date.now()\n\n if (hasActiveSessionRef.current) {\n addActivityListeners()\n scheduleReminder()\n scheduleActivityCheckpoint()\n }\n\n scheduleExpiration()\n\n return sessionTiming\n },\n [addActivityListeners, removeActivityListeners, resetSessionLifecycle, scheduleRefresh],\n )\n\n const getCurrentExpirationMs = useCallback(() => tokenExpirationMsRef.current, [])\n\n useEffect(() => {\n callbacksRef.current = { onActivity, onActivityRefresh, onExpire, onReminder }\n }, [onActivity, onActivityRefresh, onExpire, onReminder])\n\n useEffect(() => {\n hasActiveSessionRef.current = isAuthenticated\n\n if (!isAuthenticated) {\n removeActivityListeners()\n }\n }, [isAuthenticated, removeActivityListeners])\n\n useEffect(() => {\n return clear\n }, [clear])\n\n return useMemo(\n () => ({\n clear,\n getCurrentExpirationMs,\n recordActivity,\n scheduleRefresh,\n setExpiration,\n }),\n [clear, getCurrentExpirationMs, recordActivity, scheduleRefresh, setExpiration],\n )\n}\n"],"mappings":"AAAA;;AACA,SAASA,WAAW,EAAEC,SAAS,EAAEC,OAAO,EAAEC,MAAM,QAAQ;AAKxD,SACEC,4BAA4B,EAC5BC,gCAAgC,QAC3B;AACP,SAASC,oBAAoB,QAAQ;AAErC,MAAMC,YAAA,GAAe,cAAc;AAAA;AAmBnC;;;;;;;AAOA,OAAO,SAASC,qBAAqB;EACnCC,eAAe;EACfC,UAAU;EACVC,iBAAiB;EACjBC,QAAQ;EACRC;AAAU,CACe;EACzB,MAAMC,0BAAA,GAA6BX,MAAA,CAAiCY,SAAA;EACpE,MAAMC,4BAAA,GAA+Bb,MAAA,CAAsC;EAC3E,MAAMc,qBAAA,GAAwBd,MAAA,CAAsC;EACpE,MAAMe,mBAAA,GAAsBf,MAAA,CAAOM,eAAA;EACnC,MAAMU,wBAAA,GAA2BhB,MAAA,CAAeY,SAAA;EAChD,MAAMK,0BAAA,GAA6BjB,MAAA,CAAsC;EACzE,MAAMkB,kBAAA,GAAqBlB,MAAA,CAAsC;EACjE,MAAMmB,gBAAA,GAAmBnB,MAAA,CAA0BY,SAAA;EACnD,MAAMQ,oBAAA,GAAuBpB,MAAA,CAAeY,SAAA;EAC5C,MAAMS,YAAA,GAAerB,MAAA,CAAO;IAAEO,UAAA;IAAYC,iBAAA;IAAmBC,QAAA;IAAUC;EAAW;EAElF,MAAMY,eAAA,GAAkBzB,WAAA,CAAa0B,YAAA;IACnC,IAAI,CAACR,mBAAA,CAAoBS,OAAO,EAAE;MAChC;IACF;IAEA,MAAMC,aAAA,GAAgBN,gBAAA,CAAiBK,OAAO;IAE9C,IAAID,YAAA,IAAiBE,aAAA,IAAiBC,IAAA,CAAKC,GAAG,MAAMF,aAAA,CAAcG,eAAe,EAAG;MAClFC,YAAA,CAAaZ,0BAAA,CAA2BO,OAAO;MAC/CP,0BAAA,CAA2BO,OAAO,GAAGM,UAAA,CAAW;QAC9CT,YAAA,CAAaG,OAAO,CAAChB,iBAAiB;MACxC,GAAG;IACL;EACF,GAAG,EAAE;EAEL,MAAMuB,eAAA,GAAkBhC,OAAA,CACtB,MACEE,4BAAA,CAA6B;IAC3BM,UAAA,EAAYA,CAACyB,OAAA,EAASC,UAAA;MACpB,MAAMC,eAAA,GAAkBlB,wBAAA,CAAyBQ,OAAO,KAAKZ,SAAA;MAE7DI,wBAAA,CAAyBQ,OAAO,GAAGS,UAAA;MAEnC,IAAIC,eAAA,EAAiB;QACnBb,YAAA,CAAaG,OAAO,CAACjB,UAAU;MACjC;MAEAe,eAAA;IACF;EACF,IACF,CAACA,eAAA,CAAgB;EAGnB,MAAMa,cAAA,GAAiBtC,WAAA,CACpBuC,MAAA;IACC,MAAMH,YAAA,GAAaP,IAAA,CAAKC,GAAG;IAC3B,MAAMF,eAAA,GAAgBN,gBAAA,CAAiBK,OAAO;IAC9C,MAAMa,oBAAA,GACJZ,eAAA,IACAQ,YAAA,IAAcR,eAAA,CAAca,wBAAwB,IACpDL,YAAA,GAAaR,eAAA,CAAcc,gBAAgB;IAE7C,IAAI,CAAC5B,0BAAA,CAA2Ba,OAAO,IAAI,CAACa,oBAAA,EAAsB;MAChE,OAAO;IACT;IAEA,OAAON,eAAA,CAAgBS,MAAM,CAACJ,MAAA;EAChC,GACA,CAACL,eAAA,CAAgB;EAGnB,MAAMU,oBAAA,GAAuB5C,WAAA,CAAY;IACvC,IAAIc,0BAAA,CAA2Ba,OAAO,EAAE;MACtC;IACF;IAEAb,0BAAA,CAA2Ba,OAAO,GAAGtB,gCAAA,CAAiC;MACpEwC,YAAA,EAAcP,cAAA;MACdQ;IACF;EACF,GAAG,CAACR,cAAA,CAAe;EAEnB,MAAMS,uBAAA,GAA0B/C,WAAA,CAAY;IAC1C,MAAMgD,OAAA,GAAUlC,0BAAA,CAA2Ba,OAAO;IAElD,IAAI,CAACqB,OAAA,EAAS;MACZ;IACF;IAEAlC,0BAAA,CAA2Ba,OAAO,GAAGZ,SAAA;IACrCiC,OAAA;EACF,GAAG,EAAE;EAEL,MAAMC,qBAAA,GAAwBjD,WAAA,CAAY;IACxCgC,YAAA,CAAahB,4BAAA,CAA6BW,OAAO;IACjDK,YAAA,CAAaf,qBAAA,CAAsBU,OAAO;IAC1CK,YAAA,CAAaX,kBAAA,CAAmBM,OAAO;IACvCK,YAAA,CAAaZ,0BAAA,CAA2BO,OAAO;IAC/CoB,uBAAA;IACAb,eAAA,CAAgBgB,KAAK;IACrB/B,wBAAA,CAAyBQ,OAAO,GAAGZ,SAAA;EACrC,GAAG,CAACmB,eAAA,EAAiBa,uBAAA,CAAwB;EAE7C,MAAMI,KAAA,GAAQnD,WAAA,CAAY;IACxBiD,qBAAA;IACA/B,mBAAA,CAAoBS,OAAO,GAAG;IAC9BL,gBAAA,CAAiBK,OAAO,GAAGZ,SAAA;IAC3BQ,oBAAA,CAAqBI,OAAO,GAAGZ,SAAA;EACjC,GAAG,CAACkC,qBAAA,CAAsB;EAE1B,MAAMG,aAAA,GAAgBpD,WAAA,CACnBqD,YAAA;IACC,IAAI,CAACC,MAAA,CAAOC,QAAQ,CAACF,YAAA,GAAe;MAClC;IACF;IAEAJ,qBAAA;IACA1B,oBAAA,CAAqBI,OAAO,GAAG0B,YAAA;IAE/B,MAAMzB,eAAA,GAAgBtB,oBAAA,CAAqB;MAAE+C;IAAa;IAE1D/B,gBAAA,CAAiBK,OAAO,GAAGC,eAAA;IAE3B,MAAM4B,gBAAA,GAAmBA,CAAA;MACvB,IAAIjC,oBAAA,CAAqBI,OAAO,KAAK0B,YAAA,EAAc;QACjD;MACF;MAEA,MAAMI,kBAAA,GAAqBC,IAAA,CAAKC,GAAG,CAAC/B,eAAA,CAAcc,gBAAgB,GAAGb,IAAA,CAAKC,GAAG,IAAI;MAEjFT,kBAAA,CAAmBM,OAAO,GAAGM,UAAA,CAC3B;QACE,IAAIV,oBAAA,CAAqBI,OAAO,KAAK0B,YAAA,EAAc;UACjD;QACF;QAEA,IAAIxB,IAAA,CAAKC,GAAG,KAAKF,eAAA,CAAcc,gBAAgB,EAAE;UAC/Cc,gBAAA;UACA;QACF;QAEAxB,YAAA,CAAaZ,0BAAA,CAA2BO,OAAO;QAC/CoB,uBAAA;QAEA,IAAIlB,IAAA,CAAKC,GAAG,KAAKF,eAAA,CAAcgC,SAAS,EAAE;UACxCpC,YAAA,CAAaG,OAAO,CAACd,UAAU;QACjC;MACF,GACA6C,IAAA,CAAKG,GAAG,CAACJ,kBAAA,EAAoBlD,YAAA;IAEjC;IAEA,MAAMuD,0BAAA,GAA6BA,CAAA;MACjC,IAAIvC,oBAAA,CAAqBI,OAAO,KAAK0B,YAAA,EAAc;QACjD;MACF;MAEA,MAAMU,iBAAA,GAAoBL,IAAA,CAAKC,GAAG,CAAC/B,eAAA,CAAcG,eAAe,GAAGF,IAAA,CAAKC,GAAG,IAAI;MAE/Ed,4BAAA,CAA6BW,OAAO,GAAGM,UAAA,CACrC;QACE,IAAIV,oBAAA,CAAqBI,OAAO,KAAK0B,YAAA,EAAc;UACjD;QACF;QAEA,MAAMW,YAAA,GAAenC,IAAA,CAAKC,GAAG;QAE7B,IAAIkC,YAAA,GAAepC,eAAA,CAAcG,eAAe,EAAE;UAChD+B,0BAAA;UACA;QACF;QAEA,MAAMG,cAAA,GAAiB9C,wBAAA,CAAyBQ,OAAO;QACvD,MAAMuC,iBAAA,GACJD,cAAA,KAAmBlD,SAAA,IACnBiD,YAAA,GAAepC,eAAA,CAAcc,gBAAgB,IAC7CuB,cAAA,IAAkBrC,eAAA,CAAca,wBAAwB;QAE1D,IAAIyB,iBAAA,EAAmB;UACrBzC,eAAA,CAAgB;QAClB;MACF,GACAiC,IAAA,CAAKG,GAAG,CAACE,iBAAA,EAAmBxD,YAAA;IAEhC;IAEA,MAAM4D,kBAAA,GAAqBA,CAAA;MACzB,IAAI5C,oBAAA,CAAqBI,OAAO,KAAK0B,YAAA,EAAc;QACjD;MACF;MAEA,MAAMe,WAAA,GAAcV,IAAA,CAAKC,GAAG,CAAC/B,eAAA,CAAcgC,SAAS,GAAG/B,IAAA,CAAKC,GAAG,IAAI;MAEnEb,qBAAA,CAAsBU,OAAO,GAAGM,UAAA,CAC9B;QACE,IAAIV,oBAAA,CAAqBI,OAAO,KAAK0B,YAAA,EAAc;UACjD,IAAIxB,IAAA,CAAKC,GAAG,KAAKF,eAAA,CAAcgC,SAAS,EAAE;YACxCO,kBAAA;YACA;UACF;UAEAjD,mBAAA,CAAoBS,OAAO,GAAG;UAC9BoB,uBAAA;UACAvB,YAAA,CAAaG,OAAO,CAACf,QAAQ,CAACyC,YAAA;QAChC;MACF,GACAK,IAAA,CAAKG,GAAG,CAACO,WAAA,EAAa7D,YAAA;IAE1B;IAEAW,mBAAA,CAAoBS,OAAO,GAAG0B,YAAA,GAAexB,IAAA,CAAKC,GAAG;IAErD,IAAIZ,mBAAA,CAAoBS,OAAO,EAAE;MAC/BiB,oBAAA;MACAY,gBAAA;MACAM,0BAAA;IACF;IAEAK,kBAAA;IAEA,OAAOvC,eAAA;EACT,GACA,CAACgB,oBAAA,EAAsBG,uBAAA,EAAyBE,qBAAA,EAAuBxB,eAAA,CAAgB;EAGzF,MAAM4C,sBAAA,GAAyBrE,WAAA,CAAY,MAAMuB,oBAAA,CAAqBI,OAAO,EAAE,EAAE;EAEjF1B,SAAA,CAAU;IACRuB,YAAA,CAAaG,OAAO,GAAG;MAAEjB,UAAA;MAAYC,iBAAA;MAAmBC,QAAA;MAAUC;IAAW;EAC/E,GAAG,CAACH,UAAA,EAAYC,iBAAA,EAAmBC,QAAA,EAAUC,UAAA,CAAW;EAExDZ,SAAA,CAAU;IACRiB,mBAAA,CAAoBS,OAAO,GAAGlB,eAAA;IAE9B,IAAI,CAACA,eAAA,EAAiB;MACpBsC,uBAAA;IACF;EACF,GAAG,CAACtC,eAAA,EAAiBsC,uBAAA,CAAwB;EAE7C9C,SAAA,CAAU;IACR,OAAOkD,KAAA;EACT,GAAG,CAACA,KAAA,CAAM;EAEV,OAAOjD,OAAA,CACL,OAAO;IACLiD,KAAA;IACAkB,sBAAA;IACA/B,cAAA;IACAb,eAAA;IACA2B;EACF,IACA,CAACD,KAAA,EAAOkB,sBAAA,EAAwB/B,cAAA,EAAgBb,eAAA,EAAiB2B,aAAA,CAAc;AAEnF","ignoreList":[]}
@@ -0,0 +1,311 @@
1
+ // @vitest-environment jsdom
2
+ import React, { act } from 'react';
3
+ import { createRoot } from 'react-dom/client';
4
+ import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest';
5
+ import { getAuthSessionTiming } from './sessionTiming.js';
6
+ import { useAuthSessionTimers } from './useAuthSessionTimers.js';
7
+ const timerCleanups = [];
8
+ beforeEach(() => {
9
+ vi.useFakeTimers();
10
+ vi.setSystemTime(new Date('2026-01-01T00:00:00.000Z'));
11
+ });
12
+ afterEach(() => {
13
+ for (const cleanup of timerCleanups.splice(0)) {
14
+ cleanup();
15
+ }
16
+ vi.useRealTimers();
17
+ });
18
+ describe('useAuthSessionTimers', () => {
19
+ it('should scale session timing for tokens shorter than two minutes', () => {
20
+ const nowMs = Date.now();
21
+ const expirationMs = nowMs + 30_000;
22
+ expect(getAuthSessionTiming({
23
+ expirationMs,
24
+ nowMs
25
+ })).toEqual({
26
+ activityTrackingStartsAt: nowMs,
27
+ expiresAt: expirationMs,
28
+ refreshStartsAt: nowMs,
29
+ reminderStartsAt: nowMs + 15_000
30
+ });
31
+ });
32
+ it('should return the lifecycle timing when setting an expiration', () => {
33
+ const timers = renderAuthSessionTimers();
34
+ const expirationMs = Date.now() + 300_000;
35
+ expect(timers.setExpiration(expirationMs)).toEqual({
36
+ activityTrackingStartsAt: expirationMs - 240_000,
37
+ expiresAt: expirationMs,
38
+ refreshStartsAt: expirationMs - 120_000,
39
+ reminderStartsAt: expirationMs - 60_000
40
+ });
41
+ });
42
+ it('should refresh at the checkpoint when activity occurred in the tracking window', () => {
43
+ const onActivity = vi.fn();
44
+ const onActivityRefresh = vi.fn();
45
+ const timers = renderAuthSessionTimers({
46
+ onActivity,
47
+ onActivityRefresh
48
+ });
49
+ timers.setExpiration(Date.now() + 300_000);
50
+ act(() => {
51
+ vi.advanceTimersByTime(120_000);
52
+ window.dispatchEvent(new MouseEvent('mousemove'));
53
+ vi.advanceTimersByTime(1_000);
54
+ window.dispatchEvent(new KeyboardEvent('keydown'));
55
+ vi.advanceTimersByTime(59_000);
56
+ vi.advanceTimersByTime(1_000);
57
+ });
58
+ expect(onActivity).toHaveBeenCalledOnce();
59
+ expect(onActivityRefresh).toHaveBeenCalledTimes(1);
60
+ });
61
+ it('should ignore activity once the expiration reminder opens', () => {
62
+ const onActivityRefresh = vi.fn();
63
+ const timers = renderAuthSessionTimers({
64
+ onActivityRefresh
65
+ });
66
+ const sessionStartedAt = Date.now();
67
+ timers.setExpiration(sessionStartedAt + 300_000);
68
+ act(() => {
69
+ vi.advanceTimersByTime(60_000);
70
+ });
71
+ vi.setSystemTime(sessionStartedAt + 240_000);
72
+ expect(timers.recordActivity('route')).toBe(false);
73
+ expect(onActivityRefresh).not.toHaveBeenCalled();
74
+ });
75
+ it('should clear timers and listeners on logout', () => {
76
+ const onActivityRefresh = vi.fn();
77
+ const onExpire = vi.fn();
78
+ const timers = renderAuthSessionTimers({
79
+ onActivityRefresh,
80
+ onExpire
81
+ });
82
+ timers.setExpiration(Date.now() + 300_000);
83
+ timers.clear();
84
+ act(() => {
85
+ window.dispatchEvent(new MouseEvent('mousemove'));
86
+ vi.advanceTimersByTime(300_000);
87
+ });
88
+ expect(onActivityRefresh).not.toHaveBeenCalled();
89
+ expect(onExpire).not.toHaveBeenCalled();
90
+ });
91
+ it('should schedule the reminder and expiration from the current expiration', () => {
92
+ const onExpire = vi.fn();
93
+ const onReminder = vi.fn();
94
+ const timers = renderAuthSessionTimers({
95
+ onExpire,
96
+ onReminder
97
+ });
98
+ const expirationMs = Date.now() + 300_000;
99
+ timers.setExpiration(expirationMs);
100
+ act(() => {
101
+ vi.advanceTimersByTime(240_000);
102
+ });
103
+ expect(onReminder).toHaveBeenCalledTimes(1);
104
+ expect(onExpire).not.toHaveBeenCalled();
105
+ act(() => {
106
+ vi.advanceTimersByTime(60_000);
107
+ });
108
+ expect(onExpire).toHaveBeenCalledWith(expirationMs);
109
+ });
110
+ it('should respect expirations beyond the maximum browser timeout', () => {
111
+ const onExpire = vi.fn();
112
+ const timers = renderAuthSessionTimers({
113
+ onExpire
114
+ });
115
+ const thirtyDaysMs = 2_592_000_000;
116
+ const maximumBrowserTimeoutMs = 2_147_483_647;
117
+ const expirationMs = Date.now() + thirtyDaysMs;
118
+ timers.setExpiration(expirationMs);
119
+ act(() => {
120
+ vi.advanceTimersByTime(maximumBrowserTimeoutMs);
121
+ });
122
+ expect(onExpire).not.toHaveBeenCalled();
123
+ act(() => {
124
+ vi.advanceTimersByTime(thirtyDaysMs - maximumBrowserTimeoutMs - 1);
125
+ });
126
+ expect(onExpire).not.toHaveBeenCalled();
127
+ act(() => {
128
+ vi.advanceTimersByTime(1);
129
+ });
130
+ expect(onExpire).toHaveBeenCalledOnce();
131
+ expect(onExpire).toHaveBeenCalledWith(expirationMs);
132
+ });
133
+ it('should schedule expiration when the token expires exactly now', () => {
134
+ const onActivityRefresh = vi.fn();
135
+ const onExpire = vi.fn();
136
+ const onReminder = vi.fn();
137
+ const timers = renderAuthSessionTimers({
138
+ isAuthenticated: false,
139
+ onActivityRefresh,
140
+ onExpire,
141
+ onReminder
142
+ });
143
+ const expirationMs = Date.now();
144
+ timers.setExpiration(expirationMs);
145
+ expect(onExpire).not.toHaveBeenCalled();
146
+ act(() => {
147
+ vi.advanceTimersByTime(0);
148
+ });
149
+ expect(onExpire).toHaveBeenCalledOnce();
150
+ expect(onExpire).toHaveBeenCalledWith(expirationMs);
151
+ expect(onActivityRefresh).not.toHaveBeenCalled();
152
+ expect(onReminder).not.toHaveBeenCalled();
153
+ });
154
+ it('should schedule expiration when the token is already past', () => {
155
+ const onActivityRefresh = vi.fn();
156
+ const onExpire = vi.fn();
157
+ const onReminder = vi.fn();
158
+ const timers = renderAuthSessionTimers({
159
+ isAuthenticated: false,
160
+ onActivityRefresh,
161
+ onExpire,
162
+ onReminder
163
+ });
164
+ const expirationMs = Date.now() - 1;
165
+ timers.setExpiration(expirationMs);
166
+ act(() => {
167
+ vi.advanceTimersByTime(0);
168
+ });
169
+ expect(onExpire).toHaveBeenCalledOnce();
170
+ expect(onExpire).toHaveBeenCalledWith(expirationMs);
171
+ expect(onActivityRefresh).not.toHaveBeenCalled();
172
+ expect(onReminder).not.toHaveBeenCalled();
173
+ });
174
+ it('should reject a non-finite expiration without activating the session', () => {
175
+ const onActivityRefresh = vi.fn();
176
+ const onExpire = vi.fn();
177
+ const timers = renderAuthSessionTimers({
178
+ isAuthenticated: false,
179
+ onActivityRefresh,
180
+ onExpire
181
+ });
182
+ timers.setExpiration(Number.NaN);
183
+ timers.scheduleRefresh(true);
184
+ act(() => {
185
+ vi.advanceTimersByTime(1_000);
186
+ });
187
+ expect(timers.getCurrentExpirationMs()).toBeUndefined();
188
+ expect(onActivityRefresh).not.toHaveBeenCalled();
189
+ expect(onExpire).not.toHaveBeenCalled();
190
+ });
191
+ it('should synchronously activate on apply and deactivate on clear', () => {
192
+ const onActivityRefresh = vi.fn();
193
+ const timers = renderAuthSessionTimers({
194
+ isAuthenticated: false,
195
+ onActivityRefresh
196
+ });
197
+ timers.clear();
198
+ timers.setExpiration(Date.now() + 300_000);
199
+ timers.scheduleRefresh(true);
200
+ act(() => {
201
+ vi.advanceTimersByTime(1_000);
202
+ });
203
+ expect(onActivityRefresh).toHaveBeenCalledOnce();
204
+ timers.clear();
205
+ timers.scheduleRefresh(true);
206
+ act(() => {
207
+ vi.advanceTimersByTime(1_000);
208
+ });
209
+ expect(onActivityRefresh).toHaveBeenCalledOnce();
210
+ });
211
+ it('should reset tracked activity when replacing the expiration', () => {
212
+ const onActivity = vi.fn();
213
+ const onActivityRefresh = vi.fn();
214
+ const timers = renderAuthSessionTimers({
215
+ onActivity,
216
+ onActivityRefresh
217
+ });
218
+ const expirationMs = Date.now() + 300_000;
219
+ timers.setExpiration(expirationMs);
220
+ act(() => {
221
+ vi.advanceTimersByTime(60_000);
222
+ });
223
+ expect(timers.recordActivity('route')).toBe(true);
224
+ expect(onActivity).toHaveBeenCalledOnce();
225
+ timers.setExpiration(expirationMs);
226
+ expect(timers.recordActivity('route')).toBe(true);
227
+ expect(onActivity).toHaveBeenCalledTimes(2);
228
+ act(() => {
229
+ vi.advanceTimersByTime(120_000);
230
+ vi.advanceTimersByTime(1_000);
231
+ });
232
+ expect(onActivityRefresh).toHaveBeenCalledOnce();
233
+ });
234
+ it('should keep its controller and activity throttle across rerenders', () => {
235
+ const onActivityRefresh = vi.fn();
236
+ const timers = renderAuthSessionTimers({
237
+ onActivityRefresh
238
+ });
239
+ const initialController = timers.getController();
240
+ timers.setExpiration(Date.now() + 300_000);
241
+ act(() => {
242
+ vi.advanceTimersByTime(238_000);
243
+ window.dispatchEvent(new MouseEvent('mousemove'));
244
+ });
245
+ timers.rerender();
246
+ expect(timers.getController()).toBe(initialController);
247
+ act(() => {
248
+ vi.advanceTimersByTime(1);
249
+ window.dispatchEvent(new MouseEvent('mousemove'));
250
+ vi.advanceTimersByTime(999);
251
+ });
252
+ expect(onActivityRefresh).toHaveBeenCalledTimes(1);
253
+ });
254
+ it('should synchronously replace the current expiration', () => {
255
+ const timers = renderAuthSessionTimers();
256
+ const firstExpirationMs = Date.now() + 300_000;
257
+ const replacementExpirationMs = Date.now() + 600_000;
258
+ timers.setExpiration(firstExpirationMs);
259
+ timers.setExpiration(replacementExpirationMs);
260
+ expect(timers.getCurrentExpirationMs()).toBe(replacementExpirationMs);
261
+ });
262
+ });
263
+ function renderAuthSessionTimers({
264
+ isAuthenticated = true,
265
+ onActivity = vi.fn(),
266
+ onActivityRefresh = vi.fn(),
267
+ onExpire = vi.fn(),
268
+ onReminder = vi.fn()
269
+ } = {}) {
270
+ let controller;
271
+ const container = document.createElement('div');
272
+ const root = createRoot(container);
273
+ function SessionTimers() {
274
+ controller = useAuthSessionTimers({
275
+ isAuthenticated,
276
+ onActivity,
277
+ onActivityRefresh,
278
+ onExpire,
279
+ onReminder
280
+ });
281
+ return null;
282
+ }
283
+ act(() => {
284
+ root.render(React.createElement(SessionTimers));
285
+ });
286
+ timerCleanups.push(() => {
287
+ act(() => {
288
+ root.unmount();
289
+ });
290
+ });
291
+ const getController = () => {
292
+ if (!controller) {
293
+ throw new Error('Expected auth session timers.');
294
+ }
295
+ return controller;
296
+ };
297
+ return {
298
+ clear: () => getController().clear(),
299
+ getController,
300
+ getCurrentExpirationMs: () => getController().getCurrentExpirationMs(),
301
+ rerender: () => {
302
+ act(() => {
303
+ root.render(React.createElement(SessionTimers));
304
+ });
305
+ },
306
+ recordActivity: source => getController().recordActivity(source),
307
+ scheduleRefresh: forceRefresh => getController().scheduleRefresh(forceRefresh),
308
+ setExpiration: expirationMs => getController().setExpiration(expirationMs)
309
+ };
310
+ }
311
+ //# sourceMappingURL=useAuthSessionTimers.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useAuthSessionTimers.spec.js","names":["React","act","createRoot","afterEach","beforeEach","describe","expect","it","vi","getAuthSessionTiming","useAuthSessionTimers","timerCleanups","useFakeTimers","setSystemTime","Date","cleanup","splice","useRealTimers","nowMs","now","expirationMs","toEqual","activityTrackingStartsAt","expiresAt","refreshStartsAt","reminderStartsAt","timers","renderAuthSessionTimers","setExpiration","onActivity","fn","onActivityRefresh","advanceTimersByTime","window","dispatchEvent","MouseEvent","KeyboardEvent","toHaveBeenCalledOnce","toHaveBeenCalledTimes","sessionStartedAt","recordActivity","toBe","not","toHaveBeenCalled","onExpire","clear","onReminder","toHaveBeenCalledWith","thirtyDaysMs","maximumBrowserTimeoutMs","isAuthenticated","Number","NaN","scheduleRefresh","getCurrentExpirationMs","toBeUndefined","initialController","getController","rerender","firstExpirationMs","replacementExpirationMs","controller","container","document","createElement","root","SessionTimers","render","push","unmount","Error","source","forceRefresh"],"sources":["../../../src/providers/Auth/useAuthSessionTimers.spec.ts"],"sourcesContent":["// @vitest-environment jsdom\nimport React, { act } from 'react'\nimport { createRoot } from 'react-dom/client'\nimport { afterEach, beforeEach, describe, expect, it, vi } from 'vitest'\n\nimport type { AuthSessionTimers } from './useAuthSessionTimers.js'\n\nimport { getAuthSessionTiming } from './sessionTiming.js'\nimport { useAuthSessionTimers } from './useAuthSessionTimers.js'\n\nconst timerCleanups: Array<() => void> = []\n\nbeforeEach(() => {\n vi.useFakeTimers()\n vi.setSystemTime(new Date('2026-01-01T00:00:00.000Z'))\n})\n\nafterEach(() => {\n for (const cleanup of timerCleanups.splice(0)) {\n cleanup()\n }\n\n vi.useRealTimers()\n})\n\ndescribe('useAuthSessionTimers', () => {\n it('should scale session timing for tokens shorter than two minutes', () => {\n const nowMs = Date.now()\n const expirationMs = nowMs + 30_000\n\n expect(getAuthSessionTiming({ expirationMs, nowMs })).toEqual({\n activityTrackingStartsAt: nowMs,\n expiresAt: expirationMs,\n refreshStartsAt: nowMs,\n reminderStartsAt: nowMs + 15_000,\n })\n })\n\n it('should return the lifecycle timing when setting an expiration', () => {\n const timers = renderAuthSessionTimers()\n const expirationMs = Date.now() + 300_000\n\n expect(timers.setExpiration(expirationMs)).toEqual({\n activityTrackingStartsAt: expirationMs - 240_000,\n expiresAt: expirationMs,\n refreshStartsAt: expirationMs - 120_000,\n reminderStartsAt: expirationMs - 60_000,\n })\n })\n\n it('should refresh at the checkpoint when activity occurred in the tracking window', () => {\n const onActivity = vi.fn()\n const onActivityRefresh = vi.fn()\n const timers = renderAuthSessionTimers({ onActivity, onActivityRefresh })\n\n timers.setExpiration(Date.now() + 300_000)\n act(() => {\n vi.advanceTimersByTime(120_000)\n window.dispatchEvent(new MouseEvent('mousemove'))\n vi.advanceTimersByTime(1_000)\n window.dispatchEvent(new KeyboardEvent('keydown'))\n vi.advanceTimersByTime(59_000)\n vi.advanceTimersByTime(1_000)\n })\n\n expect(onActivity).toHaveBeenCalledOnce()\n expect(onActivityRefresh).toHaveBeenCalledTimes(1)\n })\n\n it('should ignore activity once the expiration reminder opens', () => {\n const onActivityRefresh = vi.fn()\n const timers = renderAuthSessionTimers({ onActivityRefresh })\n const sessionStartedAt = Date.now()\n\n timers.setExpiration(sessionStartedAt + 300_000)\n act(() => {\n vi.advanceTimersByTime(60_000)\n })\n vi.setSystemTime(sessionStartedAt + 240_000)\n\n expect(timers.recordActivity('route')).toBe(false)\n expect(onActivityRefresh).not.toHaveBeenCalled()\n })\n\n it('should clear timers and listeners on logout', () => {\n const onActivityRefresh = vi.fn()\n const onExpire = vi.fn()\n const timers = renderAuthSessionTimers({ onActivityRefresh, onExpire })\n\n timers.setExpiration(Date.now() + 300_000)\n timers.clear()\n act(() => {\n window.dispatchEvent(new MouseEvent('mousemove'))\n vi.advanceTimersByTime(300_000)\n })\n\n expect(onActivityRefresh).not.toHaveBeenCalled()\n expect(onExpire).not.toHaveBeenCalled()\n })\n\n it('should schedule the reminder and expiration from the current expiration', () => {\n const onExpire = vi.fn()\n const onReminder = vi.fn()\n const timers = renderAuthSessionTimers({ onExpire, onReminder })\n const expirationMs = Date.now() + 300_000\n\n timers.setExpiration(expirationMs)\n act(() => {\n vi.advanceTimersByTime(240_000)\n })\n\n expect(onReminder).toHaveBeenCalledTimes(1)\n expect(onExpire).not.toHaveBeenCalled()\n\n act(() => {\n vi.advanceTimersByTime(60_000)\n })\n\n expect(onExpire).toHaveBeenCalledWith(expirationMs)\n })\n\n it('should respect expirations beyond the maximum browser timeout', () => {\n const onExpire = vi.fn()\n const timers = renderAuthSessionTimers({ onExpire })\n const thirtyDaysMs = 2_592_000_000\n const maximumBrowserTimeoutMs = 2_147_483_647\n const expirationMs = Date.now() + thirtyDaysMs\n\n timers.setExpiration(expirationMs)\n\n act(() => {\n vi.advanceTimersByTime(maximumBrowserTimeoutMs)\n })\n\n expect(onExpire).not.toHaveBeenCalled()\n\n act(() => {\n vi.advanceTimersByTime(thirtyDaysMs - maximumBrowserTimeoutMs - 1)\n })\n\n expect(onExpire).not.toHaveBeenCalled()\n\n act(() => {\n vi.advanceTimersByTime(1)\n })\n\n expect(onExpire).toHaveBeenCalledOnce()\n expect(onExpire).toHaveBeenCalledWith(expirationMs)\n })\n\n it('should schedule expiration when the token expires exactly now', () => {\n const onActivityRefresh = vi.fn()\n const onExpire = vi.fn()\n const onReminder = vi.fn()\n const timers = renderAuthSessionTimers({\n isAuthenticated: false,\n onActivityRefresh,\n onExpire,\n onReminder,\n })\n const expirationMs = Date.now()\n\n timers.setExpiration(expirationMs)\n\n expect(onExpire).not.toHaveBeenCalled()\n\n act(() => {\n vi.advanceTimersByTime(0)\n })\n\n expect(onExpire).toHaveBeenCalledOnce()\n expect(onExpire).toHaveBeenCalledWith(expirationMs)\n expect(onActivityRefresh).not.toHaveBeenCalled()\n expect(onReminder).not.toHaveBeenCalled()\n })\n\n it('should schedule expiration when the token is already past', () => {\n const onActivityRefresh = vi.fn()\n const onExpire = vi.fn()\n const onReminder = vi.fn()\n const timers = renderAuthSessionTimers({\n isAuthenticated: false,\n onActivityRefresh,\n onExpire,\n onReminder,\n })\n const expirationMs = Date.now() - 1\n\n timers.setExpiration(expirationMs)\n\n act(() => {\n vi.advanceTimersByTime(0)\n })\n\n expect(onExpire).toHaveBeenCalledOnce()\n expect(onExpire).toHaveBeenCalledWith(expirationMs)\n expect(onActivityRefresh).not.toHaveBeenCalled()\n expect(onReminder).not.toHaveBeenCalled()\n })\n\n it('should reject a non-finite expiration without activating the session', () => {\n const onActivityRefresh = vi.fn()\n const onExpire = vi.fn()\n const timers = renderAuthSessionTimers({\n isAuthenticated: false,\n onActivityRefresh,\n onExpire,\n })\n\n timers.setExpiration(Number.NaN)\n timers.scheduleRefresh(true)\n act(() => {\n vi.advanceTimersByTime(1_000)\n })\n\n expect(timers.getCurrentExpirationMs()).toBeUndefined()\n expect(onActivityRefresh).not.toHaveBeenCalled()\n expect(onExpire).not.toHaveBeenCalled()\n })\n\n it('should synchronously activate on apply and deactivate on clear', () => {\n const onActivityRefresh = vi.fn()\n const timers = renderAuthSessionTimers({ isAuthenticated: false, onActivityRefresh })\n\n timers.clear()\n timers.setExpiration(Date.now() + 300_000)\n timers.scheduleRefresh(true)\n act(() => {\n vi.advanceTimersByTime(1_000)\n })\n\n expect(onActivityRefresh).toHaveBeenCalledOnce()\n\n timers.clear()\n timers.scheduleRefresh(true)\n act(() => {\n vi.advanceTimersByTime(1_000)\n })\n\n expect(onActivityRefresh).toHaveBeenCalledOnce()\n })\n\n it('should reset tracked activity when replacing the expiration', () => {\n const onActivity = vi.fn()\n const onActivityRefresh = vi.fn()\n const timers = renderAuthSessionTimers({ onActivity, onActivityRefresh })\n const expirationMs = Date.now() + 300_000\n\n timers.setExpiration(expirationMs)\n act(() => {\n vi.advanceTimersByTime(60_000)\n })\n expect(timers.recordActivity('route')).toBe(true)\n expect(onActivity).toHaveBeenCalledOnce()\n\n timers.setExpiration(expirationMs)\n\n expect(timers.recordActivity('route')).toBe(true)\n expect(onActivity).toHaveBeenCalledTimes(2)\n\n act(() => {\n vi.advanceTimersByTime(120_000)\n vi.advanceTimersByTime(1_000)\n })\n\n expect(onActivityRefresh).toHaveBeenCalledOnce()\n })\n\n it('should keep its controller and activity throttle across rerenders', () => {\n const onActivityRefresh = vi.fn()\n const timers = renderAuthSessionTimers({ onActivityRefresh })\n const initialController = timers.getController()\n\n timers.setExpiration(Date.now() + 300_000)\n act(() => {\n vi.advanceTimersByTime(238_000)\n window.dispatchEvent(new MouseEvent('mousemove'))\n })\n timers.rerender()\n\n expect(timers.getController()).toBe(initialController)\n\n act(() => {\n vi.advanceTimersByTime(1)\n window.dispatchEvent(new MouseEvent('mousemove'))\n vi.advanceTimersByTime(999)\n })\n\n expect(onActivityRefresh).toHaveBeenCalledTimes(1)\n })\n\n it('should synchronously replace the current expiration', () => {\n const timers = renderAuthSessionTimers()\n const firstExpirationMs = Date.now() + 300_000\n const replacementExpirationMs = Date.now() + 600_000\n\n timers.setExpiration(firstExpirationMs)\n timers.setExpiration(replacementExpirationMs)\n\n expect(timers.getCurrentExpirationMs()).toBe(replacementExpirationMs)\n })\n})\n\nfunction renderAuthSessionTimers({\n isAuthenticated = true,\n onActivity = vi.fn(),\n onActivityRefresh = vi.fn(),\n onExpire = vi.fn(),\n onReminder = vi.fn(),\n}: {\n isAuthenticated?: boolean\n onActivity?: () => void\n onActivityRefresh?: () => void\n onExpire?: (expirationMs: number) => void\n onReminder?: () => void\n} = {}): RenderedAuthSessionTimers {\n let controller: AuthSessionTimers | undefined\n const container = document.createElement('div')\n const root = createRoot(container)\n\n function SessionTimers() {\n controller = useAuthSessionTimers({\n isAuthenticated,\n onActivity,\n onActivityRefresh,\n onExpire,\n onReminder,\n })\n\n return null\n }\n\n act(() => {\n root.render(React.createElement(SessionTimers))\n })\n\n timerCleanups.push(() => {\n act(() => {\n root.unmount()\n })\n })\n\n const getController = (): AuthSessionTimers => {\n if (!controller) {\n throw new Error('Expected auth session timers.')\n }\n\n return controller\n }\n\n return {\n clear: () => getController().clear(),\n getController,\n getCurrentExpirationMs: () => getController().getCurrentExpirationMs(),\n rerender: () => {\n act(() => {\n root.render(React.createElement(SessionTimers))\n })\n },\n recordActivity: (source) => getController().recordActivity(source),\n scheduleRefresh: (forceRefresh) => getController().scheduleRefresh(forceRefresh),\n setExpiration: (expirationMs) => getController().setExpiration(expirationMs),\n }\n}\n\ntype RenderedAuthSessionTimers = AuthSessionTimers & {\n getController: () => AuthSessionTimers\n recordActivity: (source: 'focus' | 'keydown' | 'mousemove' | 'route') => boolean\n rerender: () => void\n}\n"],"mappings":"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","ignoreList":[]}
@@ -1,4 +1,5 @@
1
1
  export type DocumentTitleContext = {
2
+ isPlaceholder: boolean;
2
3
  setDocumentTitle: (title: string) => void;
3
4
  title: string;
4
5
  };
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/providers/DocumentTitle/index.tsx"],"names":[],"mappings":"AASA,MAAM,MAAM,oBAAoB,GAAG;IACjC,gBAAgB,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAA;IACzC,KAAK,EAAE,MAAM,CAAA;CACd,CAAA;AAID,eAAO,MAAM,gBAAgB,QAAO,oBAAoC,CAAA;AAExE,eAAO,MAAM,qBAAqB,EAAE,KAAK,CAAC,EAAE,CAAC;IAC3C,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAA;CAC1B,CAoCA,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/providers/DocumentTitle/index.tsx"],"names":[],"mappings":"AASA,MAAM,MAAM,oBAAoB,GAAG;IACjC,aAAa,EAAE,OAAO,CAAA;IACtB,gBAAgB,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAA;IACzC,KAAK,EAAE,MAAM,CAAA;CACd,CAAA;AAID,eAAO,MAAM,gBAAgB,QAAO,oBAAoC,CAAA;AAExE,eAAO,MAAM,qBAAqB,EAAE,KAAK,CAAC,EAAE,CAAC;IAC3C,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAA;CAC1B,CAsCA,CAAA"}
@@ -51,8 +51,10 @@ export const DocumentTitleProvider = ({
51
51
  i18n
52
52
  }));
53
53
  }, [data, dateFormat, i18n, id, collectionSlug, docConfig, globalSlug]);
54
+ const isPlaceholder = title === i18n.t('general:untitled');
54
55
  return /*#__PURE__*/_jsx(Context, {
55
56
  value: {
57
+ isPlaceholder,
56
58
  setDocumentTitle,
57
59
  title
58
60
  },
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["createContext","use","useEffect","useState","formatDocTitle","useConfig","useDocumentInfo","useTranslation","Context","useDocumentTitle","DocumentTitleProvider","children","id","collectionSlug","data","docConfig","globalSlug","initialData","config","admin","dateFormat","i18n","title","setDocumentTitle","collectionConfig","undefined","fallback","toString","globalConfig","_jsx","value"],"sources":["../../../src/providers/DocumentTitle/index.tsx"],"sourcesContent":["import type { ClientCollectionConfig, ClientGlobalConfig } from 'payload'\n\nimport { createContext, use, useEffect, useState } from 'react'\n\nimport { formatDocTitle } from '../../utilities/formatDocTitle/index.js'\nimport { useConfig } from '../Config/index.js'\nimport { useDocumentInfo } from '../DocumentInfo/index.js'\nimport { useTranslation } from '../Translation/index.js'\n\nexport type DocumentTitleContext = {\n setDocumentTitle: (title: string) => void\n title: string\n}\n\nconst Context = createContext({} as DocumentTitleContext)\n\nexport const useDocumentTitle = (): DocumentTitleContext => use(Context)\n\nexport const DocumentTitleProvider: React.FC<{\n children: React.ReactNode\n}> = ({ children }) => {\n const { id, collectionSlug, data, docConfig, globalSlug, initialData } = useDocumentInfo()\n\n const {\n config: {\n admin: { dateFormat },\n },\n } = useConfig()\n\n const { i18n } = useTranslation()\n\n const [title, setDocumentTitle] = useState(() =>\n formatDocTitle({\n collectionConfig: collectionSlug ? (docConfig as ClientCollectionConfig) : undefined,\n data: { ...(initialData || {}), id },\n dateFormat,\n fallback: id?.toString(),\n globalConfig: globalSlug ? (docConfig as ClientGlobalConfig) : undefined,\n i18n,\n }),\n )\n\n useEffect(() => {\n setDocumentTitle(\n formatDocTitle({\n collectionConfig: collectionSlug ? (docConfig as ClientCollectionConfig) : undefined,\n data: { ...data, id },\n dateFormat,\n fallback: id?.toString(),\n globalConfig: globalSlug ? (docConfig as ClientGlobalConfig) : undefined,\n i18n,\n }),\n )\n }, [data, dateFormat, i18n, id, collectionSlug, docConfig, globalSlug])\n\n return <Context value={{ setDocumentTitle, title }}>{children}</Context>\n}\n"],"mappings":";AAEA,SAASA,aAAa,EAAEC,GAAG,EAAEC,SAAS,EAAEC,QAAQ,QAAQ;AAExD,SAASC,cAAc,QAAQ;AAC/B,SAASC,SAAS,QAAQ;AAC1B,SAASC,eAAe,QAAQ;AAChC,SAASC,cAAc,QAAQ;AAO/B,MAAMC,OAAA,gBAAUR,aAAA,CAAc,CAAC;AAE/B,OAAO,MAAMS,gBAAA,GAAmBA,CAAA,KAA4BR,GAAA,CAAIO,OAAA;AAEhE,OAAO,MAAME,qBAAA,GAERA,CAAC;EAAEC;AAAQ,CAAE;EAChB,MAAM;IAAEC,EAAE;IAAEC,cAAc;IAAEC,IAAI;IAAEC,SAAS;IAAEC,UAAU;IAAEC;EAAW,CAAE,GAAGX,eAAA;EAEzE,MAAM;IACJY,MAAA,EAAQ;MACNC,KAAA,EAAO;QAAEC;MAAU;IAAE;EACtB,CACF,GAAGf,SAAA;EAEJ,MAAM;IAAEgB;EAAI,CAAE,GAAGd,cAAA;EAEjB,MAAM,CAACe,KAAA,EAAOC,gBAAA,CAAiB,GAAGpB,QAAA,CAAS,MACzCC,cAAA,CAAe;IACboB,gBAAA,EAAkBX,cAAA,GAAkBE,SAAA,GAAuCU,SAAA;IAC3EX,IAAA,EAAM;MAAE,IAAIG,WAAA,IAAe,CAAC,CAAC;MAAGL;IAAG;IACnCQ,UAAA;IACAM,QAAA,EAAUd,EAAA,EAAIe,QAAA;IACdC,YAAA,EAAcZ,UAAA,GAAcD,SAAA,GAAmCU,SAAA;IAC/DJ;EACF;EAGFnB,SAAA,CAAU;IACRqB,gBAAA,CACEnB,cAAA,CAAe;MACboB,gBAAA,EAAkBX,cAAA,GAAkBE,SAAA,GAAuCU,SAAA;MAC3EX,IAAA,EAAM;QAAE,GAAGA,IAAI;QAAEF;MAAG;MACpBQ,UAAA;MACAM,QAAA,EAAUd,EAAA,EAAIe,QAAA;MACdC,YAAA,EAAcZ,UAAA,GAAcD,SAAA,GAAmCU,SAAA;MAC/DJ;IACF;EAEJ,GAAG,CAACP,IAAA,EAAMM,UAAA,EAAYC,IAAA,EAAMT,EAAA,EAAIC,cAAA,EAAgBE,SAAA,EAAWC,UAAA,CAAW;EAEtE,oBAAOa,IAAA,CAACrB,OAAA;IAAQsB,KAAA,EAAO;MAAEP,gBAAA;MAAkBD;IAAM;cAAIX;;AACvD","ignoreList":[]}
1
+ {"version":3,"file":"index.js","names":["createContext","use","useEffect","useState","formatDocTitle","useConfig","useDocumentInfo","useTranslation","Context","useDocumentTitle","DocumentTitleProvider","children","id","collectionSlug","data","docConfig","globalSlug","initialData","config","admin","dateFormat","i18n","title","setDocumentTitle","collectionConfig","undefined","fallback","toString","globalConfig","isPlaceholder","t","_jsx","value"],"sources":["../../../src/providers/DocumentTitle/index.tsx"],"sourcesContent":["import type { ClientCollectionConfig, ClientGlobalConfig } from 'payload'\n\nimport { createContext, use, useEffect, useState } from 'react'\n\nimport { formatDocTitle } from '../../utilities/formatDocTitle/index.js'\nimport { useConfig } from '../Config/index.js'\nimport { useDocumentInfo } from '../DocumentInfo/index.js'\nimport { useTranslation } from '../Translation/index.js'\n\nexport type DocumentTitleContext = {\n isPlaceholder: boolean\n setDocumentTitle: (title: string) => void\n title: string\n}\n\nconst Context = createContext({} as DocumentTitleContext)\n\nexport const useDocumentTitle = (): DocumentTitleContext => use(Context)\n\nexport const DocumentTitleProvider: React.FC<{\n children: React.ReactNode\n}> = ({ children }) => {\n const { id, collectionSlug, data, docConfig, globalSlug, initialData } = useDocumentInfo()\n\n const {\n config: {\n admin: { dateFormat },\n },\n } = useConfig()\n\n const { i18n } = useTranslation()\n\n const [title, setDocumentTitle] = useState(() =>\n formatDocTitle({\n collectionConfig: collectionSlug ? (docConfig as ClientCollectionConfig) : undefined,\n data: { ...(initialData || {}), id },\n dateFormat,\n fallback: id?.toString(),\n globalConfig: globalSlug ? (docConfig as ClientGlobalConfig) : undefined,\n i18n,\n }),\n )\n\n useEffect(() => {\n setDocumentTitle(\n formatDocTitle({\n collectionConfig: collectionSlug ? (docConfig as ClientCollectionConfig) : undefined,\n data: { ...data, id },\n dateFormat,\n fallback: id?.toString(),\n globalConfig: globalSlug ? (docConfig as ClientGlobalConfig) : undefined,\n i18n,\n }),\n )\n }, [data, dateFormat, i18n, id, collectionSlug, docConfig, globalSlug])\n\n const isPlaceholder = title === i18n.t('general:untitled')\n\n return <Context value={{ isPlaceholder, setDocumentTitle, title }}>{children}</Context>\n}\n"],"mappings":";AAEA,SAASA,aAAa,EAAEC,GAAG,EAAEC,SAAS,EAAEC,QAAQ,QAAQ;AAExD,SAASC,cAAc,QAAQ;AAC/B,SAASC,SAAS,QAAQ;AAC1B,SAASC,eAAe,QAAQ;AAChC,SAASC,cAAc,QAAQ;AAQ/B,MAAMC,OAAA,gBAAUR,aAAA,CAAc,CAAC;AAE/B,OAAO,MAAMS,gBAAA,GAAmBA,CAAA,KAA4BR,GAAA,CAAIO,OAAA;AAEhE,OAAO,MAAME,qBAAA,GAERA,CAAC;EAAEC;AAAQ,CAAE;EAChB,MAAM;IAAEC,EAAE;IAAEC,cAAc;IAAEC,IAAI;IAAEC,SAAS;IAAEC,UAAU;IAAEC;EAAW,CAAE,GAAGX,eAAA;EAEzE,MAAM;IACJY,MAAA,EAAQ;MACNC,KAAA,EAAO;QAAEC;MAAU;IAAE;EACtB,CACF,GAAGf,SAAA;EAEJ,MAAM;IAAEgB;EAAI,CAAE,GAAGd,cAAA;EAEjB,MAAM,CAACe,KAAA,EAAOC,gBAAA,CAAiB,GAAGpB,QAAA,CAAS,MACzCC,cAAA,CAAe;IACboB,gBAAA,EAAkBX,cAAA,GAAkBE,SAAA,GAAuCU,SAAA;IAC3EX,IAAA,EAAM;MAAE,IAAIG,WAAA,IAAe,CAAC,CAAC;MAAGL;IAAG;IACnCQ,UAAA;IACAM,QAAA,EAAUd,EAAA,EAAIe,QAAA;IACdC,YAAA,EAAcZ,UAAA,GAAcD,SAAA,GAAmCU,SAAA;IAC/DJ;EACF;EAGFnB,SAAA,CAAU;IACRqB,gBAAA,CACEnB,cAAA,CAAe;MACboB,gBAAA,EAAkBX,cAAA,GAAkBE,SAAA,GAAuCU,SAAA;MAC3EX,IAAA,EAAM;QAAE,GAAGA,IAAI;QAAEF;MAAG;MACpBQ,UAAA;MACAM,QAAA,EAAUd,EAAA,EAAIe,QAAA;MACdC,YAAA,EAAcZ,UAAA,GAAcD,SAAA,GAAmCU,SAAA;MAC/DJ;IACF;EAEJ,GAAG,CAACP,IAAA,EAAMM,UAAA,EAAYC,IAAA,EAAMT,EAAA,EAAIC,cAAA,EAAgBE,SAAA,EAAWC,UAAA,CAAW;EAEtE,MAAMa,aAAA,GAAgBP,KAAA,KAAUD,IAAA,CAAKS,CAAC,CAAC;EAEvC,oBAAOC,IAAA,CAACvB,OAAA;IAAQwB,KAAA,EAAO;MAAEH,aAAA;MAAeN,gBAAA;MAAkBD;IAAM;cAAIX;;AACtE","ignoreList":[]}
@@ -0,0 +1,24 @@
1
+ import React from 'react';
2
+ /**
3
+ * @experimental This is an experimental API and may change at any time. Use at your own risk.
4
+ */
5
+ export type EmbedContext = {
6
+ isEmbedded: boolean;
7
+ };
8
+ /**
9
+ * @experimental This component is experimental and may change or be removed in future releases. Use at your own risk.
10
+ */
11
+ export declare const EmbedProvider: React.FC<{
12
+ children?: React.ReactNode;
13
+ /**
14
+ * Initial embed value is read from the embed cookie in the root layout. The root layout
15
+ * cannot see search params, so the client reads the `?embed` query parameter below
16
+ * and it takes precedence over the cookie value.
17
+ */
18
+ embed?: boolean;
19
+ }>;
20
+ /**
21
+ * @experimental This is an experimental API and may change at any time. Use at your own risk.
22
+ */
23
+ export declare const useEmbed: () => EmbedContext;
24
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/providers/Embed/index.tsx"],"names":[],"mappings":"AACA,OAAO,KAAkD,MAAM,OAAO,CAAA;AAKtE;;GAEG;AACH,MAAM,MAAM,YAAY,GAAG;IACzB,UAAU,EAAE,OAAO,CAAA;CACpB,CAAA;AAyCD;;GAEG;AACH,eAAO,MAAM,aAAa,EAAE,KAAK,CAAC,EAAE,CAAC;IACnC,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAA;IAC1B;;;;OAIG;IACH,KAAK,CAAC,EAAE,OAAO,CAAA;CAChB,CAoBA,CAAA;AAED;;GAEG;AACH,eAAO,MAAM,QAAQ,QAAO,YAA8C,CAAA"}
@@ -0,0 +1,105 @@
1
+ 'use client';
2
+
3
+ import { c as _c } from "react/compiler-runtime";
4
+ import { jsx as _jsx } from "react/jsx-runtime";
5
+ import React, { createContext, use, useEffect, useState } from 'react';
6
+ import { useConfig } from '../Config/index.js';
7
+ import { useSearchParams } from '../RouterAdapter/index.js';
8
+ const initialContext = {
9
+ isEmbedded: false
10
+ };
11
+ const Context = /*#__PURE__*/createContext(undefined);
12
+ const hasEmbedCookie = cookieKey => document.cookie.split('; ').some(row => row.startsWith(`${cookieKey}=`) && row.split('=')[1] === 'true');
13
+ /**
14
+ * Writes a session-scoped, `Partitioned` (CHIPS) cookie so embed mode persists
15
+ * across navigation within the iframe.
16
+ *
17
+ * The cookie is keyed to both the iframe domain and the embedding top-level domain,
18
+ * so it is readable only on that one top-level domain.
19
+ *
20
+ * No `Expires`/`Max-Age` — it is a session cookie that clears when the browsing session ends.
21
+ */
22
+ const setEmbedCookie = cookieKey => {
23
+ document.cookie = `${cookieKey}=true; path=/; SameSite=None; Secure; Partitioned`;
24
+ };
25
+ const deleteEmbedCookie = cookieKey => {
26
+ document.cookie = `${cookieKey}=; path=/; SameSite=None; Secure; Partitioned; expires=Thu, 01 Jan 1970 00:00:00 GMT`;
27
+ };
28
+ const resolveEmbedParam = (embedParam, fallback) => {
29
+ switch (embedParam) {
30
+ case 'false':
31
+ return false;
32
+ case 'true':
33
+ return true;
34
+ default:
35
+ return fallback;
36
+ }
37
+ };
38
+ /**
39
+ * @experimental This component is experimental and may change or be removed in future releases. Use at your own risk.
40
+ */
41
+ export const EmbedProvider = t0 => {
42
+ const $ = _c(10);
43
+ const {
44
+ children,
45
+ embed
46
+ } = t0;
47
+ const {
48
+ config
49
+ } = useConfig();
50
+ const embedCookieKey = `${config.cookiePrefix || "payload"}-embed`;
51
+ const embedParam = useSearchParams().get("embed")?.toLowerCase();
52
+ let t1;
53
+ if ($[0] !== embed || $[1] !== embedParam) {
54
+ t1 = () => resolveEmbedParam(embedParam, Boolean(embed));
55
+ $[0] = embed;
56
+ $[1] = embedParam;
57
+ $[2] = t1;
58
+ } else {
59
+ t1 = $[2];
60
+ }
61
+ const [isEmbedded, setIsEmbedded] = useState(t1);
62
+ let t2;
63
+ let t3;
64
+ if ($[3] !== embedCookieKey || $[4] !== embedParam) {
65
+ t2 = () => {
66
+ if (embedParam === "true") {
67
+ setEmbedCookie(embedCookieKey);
68
+ } else {
69
+ if (embedParam === "false") {
70
+ deleteEmbedCookie(embedCookieKey);
71
+ }
72
+ }
73
+ setIsEmbedded(hasEmbedCookie(embedCookieKey));
74
+ };
75
+ t3 = [embedParam, embedCookieKey];
76
+ $[3] = embedCookieKey;
77
+ $[4] = embedParam;
78
+ $[5] = t2;
79
+ $[6] = t3;
80
+ } else {
81
+ t2 = $[5];
82
+ t3 = $[6];
83
+ }
84
+ useEffect(t2, t3);
85
+ let t4;
86
+ if ($[7] !== children || $[8] !== isEmbedded) {
87
+ t4 = _jsx(Context, {
88
+ value: {
89
+ isEmbedded
90
+ },
91
+ children
92
+ });
93
+ $[7] = children;
94
+ $[8] = isEmbedded;
95
+ $[9] = t4;
96
+ } else {
97
+ t4 = $[9];
98
+ }
99
+ return t4;
100
+ };
101
+ /**
102
+ * @experimental This is an experimental API and may change at any time. Use at your own risk.
103
+ */
104
+ export const useEmbed = () => use(Context) ?? initialContext;
105
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","names":["c","_c","React","createContext","use","useEffect","useState","useConfig","useSearchParams","initialContext","isEmbedded","Context","undefined","hasEmbedCookie","cookieKey","document","cookie","split","some","row","startsWith","setEmbedCookie","deleteEmbedCookie","resolveEmbedParam","embedParam","fallback","EmbedProvider","t0","$","children","embed","config","embedCookieKey","cookiePrefix","get","toLowerCase","t1","Boolean","setIsEmbedded","t2","t3","t4","_jsx","value","useEmbed"],"sources":["../../../src/providers/Embed/index.tsx"],"sourcesContent":["'use client'\nimport React, { createContext, use, useEffect, useState } from 'react'\n\nimport { useConfig } from '../Config/index.js'\nimport { useSearchParams } from '../RouterAdapter/index.js'\n\n/**\n * @experimental This is an experimental API and may change at any time. Use at your own risk.\n */\nexport type EmbedContext = {\n isEmbedded: boolean\n}\n\nconst initialContext: EmbedContext = {\n isEmbedded: false,\n}\n\nconst Context = createContext<EmbedContext | undefined>(undefined)\n\nconst hasEmbedCookie = (cookieKey: string): boolean =>\n document.cookie\n .split('; ')\n .some((row) => row.startsWith(`${cookieKey}=`) && row.split('=')[1] === 'true')\n\n/**\n * Writes a session-scoped, `Partitioned` (CHIPS) cookie so embed mode persists\n * across navigation within the iframe.\n *\n * The cookie is keyed to both the iframe domain and the embedding top-level domain,\n * so it is readable only on that one top-level domain.\n *\n * No `Expires`/`Max-Age` — it is a session cookie that clears when the browsing session ends.\n */\nconst setEmbedCookie = (cookieKey: string): void => {\n document.cookie = `${cookieKey}=true; path=/; SameSite=None; Secure; Partitioned`\n}\n\nconst deleteEmbedCookie = (cookieKey: string): void => {\n document.cookie = `${cookieKey}=; path=/; SameSite=None; Secure; Partitioned; expires=Thu, 01 Jan 1970 00:00:00 GMT`\n}\n\nconst resolveEmbedParam = (embedParam: null | string, fallback: boolean): boolean => {\n switch (embedParam) {\n case 'false':\n return false\n case 'true':\n return true\n default:\n return fallback\n }\n}\n\n/**\n * @experimental This component is experimental and may change or be removed in future releases. Use at your own risk.\n */\nexport const EmbedProvider: React.FC<{\n children?: React.ReactNode\n /**\n * Initial embed value is read from the embed cookie in the root layout. The root layout\n * cannot see search params, so the client reads the `?embed` query parameter below\n * and it takes precedence over the cookie value.\n */\n embed?: boolean\n}> = ({ children, embed }) => {\n const { config } = useConfig()\n const embedCookieKey = `${config.cookiePrefix || 'payload'}-embed`\n const embedParam = useSearchParams().get('embed')?.toLowerCase()\n\n const [isEmbedded, setIsEmbedded] = useState<boolean>(() =>\n resolveEmbedParam(embedParam, Boolean(embed)),\n )\n\n useEffect(() => {\n // The query parameter takes precedence; otherwise fall back to the cookie value\n if (embedParam === 'true') {\n setEmbedCookie(embedCookieKey)\n } else if (embedParam === 'false') {\n deleteEmbedCookie(embedCookieKey)\n }\n setIsEmbedded(hasEmbedCookie(embedCookieKey))\n }, [embedParam, embedCookieKey])\n\n return <Context value={{ isEmbedded }}>{children}</Context>\n}\n\n/**\n * @experimental This is an experimental API and may change at any time. Use at your own risk.\n */\nexport const useEmbed = (): EmbedContext => use(Context) ?? initialContext\n"],"mappings":"AAAA;;AAAA,SAAAA,CAAA,IAAAC,EAAA;;AACA,OAAOC,KAAA,IAASC,aAAa,EAAEC,GAAG,EAAEC,SAAS,EAAEC,QAAQ,QAAQ;AAE/D,SAASC,SAAS,QAAQ;AAC1B,SAASC,eAAe,QAAQ;AAShC,MAAMC,cAAA,GAA+B;EACnCC,UAAA,EAAY;AACd;AAEA,MAAMC,OAAA,gBAAUR,aAAA,CAAwCS,SAAA;AAExD,MAAMC,cAAA,GAAkBC,SAAA,IACtBC,QAAA,CAASC,MAAM,CACZC,KAAK,CAAC,MACNC,IAAI,CAAEC,GAAA,IAAQA,GAAA,CAAIC,UAAU,CAAC,GAAGN,SAAA,GAAY,KAAKK,GAAA,CAAIF,KAAK,CAAC,IAAI,CAAC,EAAE,KAAK;AAE5E;;;;;;;;;AASA,MAAMI,cAAA,GAAkBP,SAAA;EACtBC,QAAA,CAASC,MAAM,GAAG,GAAGF,SAAA,mDAA4D;AACnF;AAEA,MAAMQ,iBAAA,GAAqBR,SAAA;EACzBC,QAAA,CAASC,MAAM,GAAG,GAAGF,SAAA,sFAA+F;AACtH;AAEA,MAAMS,iBAAA,GAAoBA,CAACC,UAAA,EAA2BC,QAAA;EACpD,QAAQD,UAAA;IACN,KAAK;MACH,OAAO;IACT,KAAK;MACH,OAAO;IACT;MACE,OAAOC,QAAA;EACX;AACF;AAEA;;;AAGA,OAAO,MAAMC,aAAA,GAQRC,EAAA;EAAA,MAAAC,CAAA,GAAA3B,EAAA;EAAC;IAAA4B,QAAA;IAAAC;EAAA,IAAAH,EAAmB;EACvB;IAAAI;EAAA,IAAmBxB,SAAA;EACnB,MAAAyB,cAAA,GAAuB,GAAGD,MAAA,CAAAE,YAAA,IAAuB,iBAAiB;EAClE,MAAAT,UAAA,GAAmBhB,eAAA,GAAA0B,GAAA,CAAsB,UAAAC,WAAA;EAAU,IAAAC,EAAA;EAAA,IAAAR,CAAA,QAAAE,KAAA,IAAAF,CAAA,QAAAJ,UAAA;IAEGY,EAAA,GAAAA,CAAA,KACpDb,iBAAA,CAAkBC,UAAA,EAAYa,OAAA,CAAQP,KAAA;IAAAF,CAAA,MAAAE,KAAA;IAAAF,CAAA,MAAAJ,UAAA;IAAAI,CAAA,MAAAQ,EAAA;EAAA;IAAAA,EAAA,GAAAR,CAAA;EAAA;EADxC,OAAAlB,UAAA,EAAA4B,aAAA,IAAoChC,QAAA,CAAkB8B,EACd;EAAA,IAAAG,EAAA;EAAA,IAAAC,EAAA;EAAA,IAAAZ,CAAA,QAAAI,cAAA,IAAAJ,CAAA,QAAAJ,UAAA;IAG9Be,EAAA,GAAAA,CAAA;MAAA,IAEJf,UAAA,KAAe;QACjBH,cAAA,CAAeW,cAAA;MAAA;QAAA,IACNR,UAAA,KAAe;UACxBF,iBAAA,CAAkBU,cAAA;QAAA;MAAA;MAEpBM,aAAA,CAAczB,cAAA,CAAemB,cAAA;IAAA;IAC5BQ,EAAA,IAAChB,UAAA,EAAYQ,cAAA;IAAeJ,CAAA,MAAAI,cAAA;IAAAJ,CAAA,MAAAJ,UAAA;IAAAI,CAAA,MAAAW,EAAA;IAAAX,CAAA,MAAAY,EAAA;EAAA;IAAAD,EAAA,GAAAX,CAAA;IAAAY,EAAA,GAAAZ,CAAA;EAAA;EAR/BvB,SAAA,CAAUkC,EAQV,EAAGC,EAA4B;EAAA,IAAAC,EAAA;EAAA,IAAAb,CAAA,QAAAC,QAAA,IAAAD,CAAA,QAAAlB,UAAA;IAExB+B,EAAA,GAAAC,IAAA,CAAA/B,OAAA;MAAAgC,KAAA;QAAAjC;MAAA;MAAAmB;IAAA,C;;;;;;;SAAAY,E;CACT;AAEA;;;AAGA,OAAO,MAAMG,QAAA,GAAWA,CAAA,KAAoBxC,GAAA,CAAIO,OAAA,KAAYF,cAAA","ignoreList":[]}
@@ -0,0 +1,24 @@
1
+ export type NonFieldError = {
2
+ data?: unknown;
3
+ message: string;
4
+ };
5
+ /**
6
+ * A callback that a plugin can provide to intercept non-field form errors before
7
+ * Payload shows its default error toast. Return `true` to claim the error (the
8
+ * default toast is suppressed). Return `false` to let Payload handle it normally.
9
+ *
10
+ * Set via `<FormErrorHandlerContext value={handler}>` inside an
11
+ * `admin.components.providers` entry. The Form reads this automatically — no
12
+ * changes to collection config or the edit view are required.
13
+ *
14
+ * Multiple handlers can be chained by composing providers; the first one to
15
+ * return `true` wins.
16
+ *
17
+ * `retry` re-submits the form that produced the error, allowing the user to
18
+ * retry after resolving the underlying issue (e.g. deleting documents to free
19
+ * up quota).
20
+ */
21
+ export type FormErrorHandler = (err: NonFieldError, retry: () => void) => boolean;
22
+ export declare const FormErrorHandlerContext: import("react").Context<FormErrorHandler>;
23
+ export declare const useFormErrorHandler: () => FormErrorHandler | undefined;
24
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/providers/FormErrorHandler/index.tsx"],"names":[],"mappings":"AAGA,MAAM,MAAM,aAAa,GAAG;IAC1B,IAAI,CAAC,EAAE,OAAO,CAAA;IACd,OAAO,EAAE,MAAM,CAAA;CAChB,CAAA;AAED;;;;;;;;;;;;;;;GAeG;AACH,MAAM,MAAM,gBAAgB,GAAG,CAAC,GAAG,EAAE,aAAa,EAAE,KAAK,EAAE,MAAM,IAAI,KAAK,OAAO,CAAA;AAEjF,eAAO,MAAM,uBAAuB,2CAAyD,CAAA;AAE7F,eAAO,MAAM,mBAAmB,QAAO,gBAAgB,GAAG,SAAyC,CAAA"}
@@ -0,0 +1,6 @@
1
+ 'use client';
2
+
3
+ import { createContext, use } from 'react';
4
+ export const FormErrorHandlerContext = /*#__PURE__*/createContext(undefined);
5
+ export const useFormErrorHandler = () => use(FormErrorHandlerContext);
6
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","names":["createContext","use","FormErrorHandlerContext","undefined","useFormErrorHandler"],"sources":["../../../src/providers/FormErrorHandler/index.tsx"],"sourcesContent":["'use client'\nimport { createContext, use } from 'react'\n\nexport type NonFieldError = {\n data?: unknown\n message: string\n}\n\n/**\n * A callback that a plugin can provide to intercept non-field form errors before\n * Payload shows its default error toast. Return `true` to claim the error (the\n * default toast is suppressed). Return `false` to let Payload handle it normally.\n *\n * Set via `<FormErrorHandlerContext value={handler}>` inside an\n * `admin.components.providers` entry. The Form reads this automatically — no\n * changes to collection config or the edit view are required.\n *\n * Multiple handlers can be chained by composing providers; the first one to\n * return `true` wins.\n *\n * `retry` re-submits the form that produced the error, allowing the user to\n * retry after resolving the underlying issue (e.g. deleting documents to free\n * up quota).\n */\nexport type FormErrorHandler = (err: NonFieldError, retry: () => void) => boolean\n\nexport const FormErrorHandlerContext = createContext<FormErrorHandler | undefined>(undefined)\n\nexport const useFormErrorHandler = (): FormErrorHandler | undefined => use(FormErrorHandlerContext)\n"],"mappings":"AAAA;;AACA,SAASA,aAAa,EAAEC,GAAG,QAAQ;AAyBnC,OAAO,MAAMC,uBAAA,gBAA0BF,aAAA,CAA4CG,SAAA;AAEnF,OAAO,MAAMC,mBAAA,GAAsBA,CAAA,KAAoCH,GAAA,CAAIC,uBAAA","ignoreList":[]}
@@ -6,6 +6,7 @@ type Props = {
6
6
  readonly children: React.ReactNode;
7
7
  readonly config: ClientConfig;
8
8
  readonly dateFNSKey: Language['dateFNSKey'];
9
+ readonly embed?: boolean;
9
10
  readonly fallbackLang: I18nOptions['fallbackLanguage'];
10
11
  readonly highContrastMode: boolean;
11
12
  readonly isNavOpen?: boolean;