@workos-inc/widgets 1.20.2-next.1792700156145 → 1.20.2

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 (202) hide show
  1. package/CHANGELOG.md +4 -10
  2. package/dist/cjs/admin-portal-audit-log-streaming.client.cjs +2 -1
  3. package/dist/cjs/admin-portal-audit-log-streaming.client.cjs.map +1 -1
  4. package/dist/cjs/admin-portal-domain-verification.client.cjs +3 -2
  5. package/dist/cjs/admin-portal-domain-verification.client.cjs.map +1 -1
  6. package/dist/cjs/admin-portal-sso-connection.client.cjs +2 -1
  7. package/dist/cjs/admin-portal-sso-connection.client.cjs.map +1 -1
  8. package/dist/cjs/api/api-provider.cjs +23 -1
  9. package/dist/cjs/api/api-provider.cjs.map +1 -1
  10. package/dist/cjs/api/api-provider.d.cts.map +1 -1
  11. package/dist/cjs/api/claims.cjs.map +1 -1
  12. package/dist/cjs/api/claims.d.cts +2 -1
  13. package/dist/cjs/api/claims.d.cts.map +1 -1
  14. package/dist/cjs/api/client-graphql/client.cjs +3 -2
  15. package/dist/cjs/api/client-graphql/client.cjs.map +1 -1
  16. package/dist/cjs/api/client-graphql/hooks.cjs +3 -20
  17. package/dist/cjs/api/client-graphql/hooks.cjs.map +1 -1
  18. package/dist/cjs/api/client-graphql/hooks.d.cts +3 -12
  19. package/dist/cjs/api/client-graphql/hooks.d.cts.map +1 -1
  20. package/dist/cjs/api/client-graphql/query-keys.cjs +25 -0
  21. package/dist/cjs/api/client-graphql/query-keys.cjs.map +1 -0
  22. package/dist/cjs/api/client-graphql/query-keys.d.cts +16 -0
  23. package/dist/cjs/api/client-graphql/query-keys.d.cts.map +1 -0
  24. package/dist/cjs/components/copy-text.cjs +1 -1
  25. package/dist/cjs/components/copy-text.cjs.map +1 -1
  26. package/dist/cjs/components/form.cjs +9 -13
  27. package/dist/cjs/components/form.cjs.map +1 -1
  28. package/dist/cjs/components/form.d.cts.map +1 -1
  29. package/dist/cjs/components/otp-input.cjs +1 -0
  30. package/dist/cjs/components/otp-input.cjs.map +1 -1
  31. package/dist/cjs/directory-sync.client.cjs +2 -1
  32. package/dist/cjs/directory-sync.client.cjs.map +1 -1
  33. package/dist/cjs/lib/api/api-key.cjs +4 -3
  34. package/dist/cjs/lib/api/api-key.cjs.map +1 -1
  35. package/dist/cjs/lib/api/me.cjs +2 -1
  36. package/dist/cjs/lib/api/me.cjs.map +1 -1
  37. package/dist/cjs/lib/api/pipes.cjs +7 -6
  38. package/dist/cjs/lib/api/pipes.cjs.map +1 -1
  39. package/dist/cjs/lib/api/user-api-key.cjs +3 -2
  40. package/dist/cjs/lib/api/user-api-key.cjs.map +1 -1
  41. package/dist/cjs/lib/i18n/intl-context.cjs.map +1 -1
  42. package/dist/cjs/lib/i18n/intl-context.d.cts +1 -0
  43. package/dist/cjs/lib/i18n/intl-context.d.cts.map +1 -1
  44. package/dist/cjs/lib/i18n/use-translation.cjs +2 -2
  45. package/dist/cjs/lib/i18n/use-translation.cjs.map +1 -1
  46. package/dist/cjs/lib/use-composed-event-handlers.cjs +15 -0
  47. package/dist/cjs/lib/use-composed-event-handlers.cjs.map +1 -0
  48. package/dist/cjs/lib/use-composed-event-handlers.d.cts +6 -0
  49. package/dist/cjs/lib/use-composed-event-handlers.d.cts.map +1 -0
  50. package/dist/cjs/lib/use-debounce.cjs +124 -116
  51. package/dist/cjs/lib/use-debounce.cjs.map +1 -1
  52. package/dist/cjs/lib/use-debounce.d.cts +53 -48
  53. package/dist/cjs/lib/use-debounce.d.cts.map +1 -1
  54. package/dist/cjs/lib/use-widgets-invalidator.cjs +3 -3
  55. package/dist/cjs/lib/use-widgets-invalidator.cjs.map +1 -1
  56. package/dist/cjs/lib/use-widgets-invalidator.d.cts.map +1 -1
  57. package/dist/cjs/lib/utils.cjs +0 -7
  58. package/dist/cjs/lib/utils.cjs.map +1 -1
  59. package/dist/cjs/lib/utils.d.cts +0 -3
  60. package/dist/cjs/lib/utils.d.cts.map +1 -1
  61. package/dist/cjs/organization-switcher.client.cjs +2 -1
  62. package/dist/cjs/organization-switcher.client.cjs.map +1 -1
  63. package/dist/cjs/pipes-admin.client.cjs +2 -1
  64. package/dist/cjs/pipes-admin.client.cjs.map +1 -1
  65. package/dist/cjs/pipes.client.cjs +2 -1
  66. package/dist/cjs/pipes.client.cjs.map +1 -1
  67. package/dist/cjs/user-security.client.cjs +2 -1
  68. package/dist/cjs/user-security.client.cjs.map +1 -1
  69. package/dist/cjs/user-sessions.client.cjs +2 -1
  70. package/dist/cjs/user-sessions.client.cjs.map +1 -1
  71. package/dist/cjs/widgets/api-keys/api-keys-search.cjs +1 -1
  72. package/dist/cjs/widgets/api-keys/api-keys-search.cjs.map +1 -1
  73. package/dist/cjs/widgets/api-keys/user-api-keys-search.cjs +1 -1
  74. package/dist/cjs/widgets/api-keys/user-api-keys-search.cjs.map +1 -1
  75. package/dist/cjs/widgets/organization-switcher/organization-switcher.cjs +19 -5
  76. package/dist/cjs/widgets/organization-switcher/organization-switcher.cjs.map +1 -1
  77. package/dist/cjs/widgets/organization-switcher/organization-switcher.d.cts +2 -1
  78. package/dist/cjs/widgets/organization-switcher/organization-switcher.d.cts.map +1 -1
  79. package/dist/cjs/widgets/pipes/pipes.cjs +3 -2
  80. package/dist/cjs/widgets/pipes/pipes.cjs.map +1 -1
  81. package/dist/cjs/widgets/user-sessions/logout-all-sessions-dialog.cjs +2 -1
  82. package/dist/cjs/widgets/user-sessions/logout-all-sessions-dialog.cjs.map +1 -1
  83. package/dist/cjs/widgets/user-sessions/logout-dialog.cjs +2 -1
  84. package/dist/cjs/widgets/user-sessions/logout-dialog.cjs.map +1 -1
  85. package/dist/cjs/widgets/users-management/invite-user-dialog.cjs +5 -6
  86. package/dist/cjs/widgets/users-management/invite-user-dialog.cjs.map +1 -1
  87. package/dist/cjs/widgets/users-management/users-management-utils.cjs +4 -3
  88. package/dist/cjs/widgets/users-management/users-management-utils.cjs.map +1 -1
  89. package/dist/cjs/widgets/users-management/users-management.cjs.map +1 -1
  90. package/dist/cjs/widgets/users-management/users-search.cjs +1 -1
  91. package/dist/cjs/widgets/users-management/users-search.cjs.map +1 -1
  92. package/dist/esm/admin-portal-audit-log-streaming.client.js +2 -1
  93. package/dist/esm/admin-portal-audit-log-streaming.client.js.map +1 -1
  94. package/dist/esm/admin-portal-domain-verification.client.js +2 -1
  95. package/dist/esm/admin-portal-domain-verification.client.js.map +1 -1
  96. package/dist/esm/admin-portal-sso-connection.client.js +2 -1
  97. package/dist/esm/admin-portal-sso-connection.client.js.map +1 -1
  98. package/dist/esm/api/api-provider.d.ts.map +1 -1
  99. package/dist/esm/api/api-provider.js +23 -1
  100. package/dist/esm/api/api-provider.js.map +1 -1
  101. package/dist/esm/api/claims.d.ts +2 -1
  102. package/dist/esm/api/claims.d.ts.map +1 -1
  103. package/dist/esm/api/claims.js.map +1 -1
  104. package/dist/esm/api/client-graphql/client.js +3 -2
  105. package/dist/esm/api/client-graphql/client.js.map +1 -1
  106. package/dist/esm/api/client-graphql/hooks.d.ts +3 -12
  107. package/dist/esm/api/client-graphql/hooks.d.ts.map +1 -1
  108. package/dist/esm/api/client-graphql/hooks.js +1 -18
  109. package/dist/esm/api/client-graphql/hooks.js.map +1 -1
  110. package/dist/esm/api/client-graphql/query-keys.d.ts +16 -0
  111. package/dist/esm/api/client-graphql/query-keys.d.ts.map +1 -0
  112. package/dist/esm/api/client-graphql/query-keys.js +23 -0
  113. package/dist/esm/api/client-graphql/query-keys.js.map +1 -0
  114. package/dist/esm/components/copy-text.js +1 -1
  115. package/dist/esm/components/copy-text.js.map +1 -1
  116. package/dist/esm/components/form.d.ts.map +1 -1
  117. package/dist/esm/components/form.js +9 -13
  118. package/dist/esm/components/form.js.map +1 -1
  119. package/dist/esm/components/otp-input.js +1 -0
  120. package/dist/esm/components/otp-input.js.map +1 -1
  121. package/dist/esm/directory-sync.client.js +2 -1
  122. package/dist/esm/directory-sync.client.js.map +1 -1
  123. package/dist/esm/lib/api/api-key.js +2 -1
  124. package/dist/esm/lib/api/api-key.js.map +1 -1
  125. package/dist/esm/lib/api/me.js +2 -1
  126. package/dist/esm/lib/api/me.js.map +1 -1
  127. package/dist/esm/lib/api/pipes.js +2 -1
  128. package/dist/esm/lib/api/pipes.js.map +1 -1
  129. package/dist/esm/lib/api/user-api-key.js +2 -1
  130. package/dist/esm/lib/api/user-api-key.js.map +1 -1
  131. package/dist/esm/lib/i18n/intl-context.d.ts +1 -0
  132. package/dist/esm/lib/i18n/intl-context.d.ts.map +1 -1
  133. package/dist/esm/lib/i18n/intl-context.js.map +1 -1
  134. package/dist/esm/lib/i18n/use-translation.js +2 -2
  135. package/dist/esm/lib/i18n/use-translation.js.map +1 -1
  136. package/dist/esm/lib/use-composed-event-handlers.d.ts +6 -0
  137. package/dist/esm/lib/use-composed-event-handlers.d.ts.map +1 -0
  138. package/dist/esm/lib/use-composed-event-handlers.js +12 -0
  139. package/dist/esm/lib/use-composed-event-handlers.js.map +1 -0
  140. package/dist/esm/lib/use-debounce.d.ts +53 -48
  141. package/dist/esm/lib/use-debounce.d.ts.map +1 -1
  142. package/dist/esm/lib/use-debounce.js +124 -116
  143. package/dist/esm/lib/use-debounce.js.map +1 -1
  144. package/dist/esm/lib/use-widgets-invalidator.d.ts.map +1 -1
  145. package/dist/esm/lib/use-widgets-invalidator.js +2 -2
  146. package/dist/esm/lib/use-widgets-invalidator.js.map +1 -1
  147. package/dist/esm/lib/utils.d.ts +0 -3
  148. package/dist/esm/lib/utils.d.ts.map +1 -1
  149. package/dist/esm/lib/utils.js +1 -7
  150. package/dist/esm/lib/utils.js.map +1 -1
  151. package/dist/esm/organization-switcher.client.js +2 -1
  152. package/dist/esm/organization-switcher.client.js.map +1 -1
  153. package/dist/esm/pipes-admin.client.js +2 -1
  154. package/dist/esm/pipes-admin.client.js.map +1 -1
  155. package/dist/esm/pipes.client.js +2 -1
  156. package/dist/esm/pipes.client.js.map +1 -1
  157. package/dist/esm/user-security.client.js +2 -1
  158. package/dist/esm/user-security.client.js.map +1 -1
  159. package/dist/esm/user-sessions.client.js +2 -1
  160. package/dist/esm/user-sessions.client.js.map +1 -1
  161. package/dist/esm/widgets/api-keys/api-keys-search.js +1 -1
  162. package/dist/esm/widgets/api-keys/api-keys-search.js.map +1 -1
  163. package/dist/esm/widgets/api-keys/user-api-keys-search.js +1 -1
  164. package/dist/esm/widgets/api-keys/user-api-keys-search.js.map +1 -1
  165. package/dist/esm/widgets/organization-switcher/organization-switcher.d.ts +2 -1
  166. package/dist/esm/widgets/organization-switcher/organization-switcher.d.ts.map +1 -1
  167. package/dist/esm/widgets/organization-switcher/organization-switcher.js +19 -5
  168. package/dist/esm/widgets/organization-switcher/organization-switcher.js.map +1 -1
  169. package/dist/esm/widgets/pipes/pipes.js +2 -1
  170. package/dist/esm/widgets/pipes/pipes.js.map +1 -1
  171. package/dist/esm/widgets/user-sessions/logout-all-sessions-dialog.js +2 -1
  172. package/dist/esm/widgets/user-sessions/logout-all-sessions-dialog.js.map +1 -1
  173. package/dist/esm/widgets/user-sessions/logout-dialog.js +2 -1
  174. package/dist/esm/widgets/user-sessions/logout-dialog.js.map +1 -1
  175. package/dist/esm/widgets/users-management/invite-user-dialog.js +5 -6
  176. package/dist/esm/widgets/users-management/invite-user-dialog.js.map +1 -1
  177. package/dist/esm/widgets/users-management/users-management-utils.js +2 -1
  178. package/dist/esm/widgets/users-management/users-management-utils.js.map +1 -1
  179. package/dist/esm/widgets/users-management/users-management.js.map +1 -1
  180. package/dist/esm/widgets/users-management/users-search.js +1 -1
  181. package/dist/esm/widgets/users-management/users-search.js.map +1 -1
  182. package/package.json +1 -1
  183. package/src/api/api-provider.tsx +39 -1
  184. package/src/api/claims.ts +2 -1
  185. package/src/api/client-graphql/client.ts +8 -2
  186. package/src/api/client-graphql/hooks.ts +8 -27
  187. package/src/api/client-graphql/query-keys.ts +29 -0
  188. package/src/components/copy-text.tsx +1 -1
  189. package/src/components/form.tsx +33 -29
  190. package/src/components/otp-input.tsx +2 -0
  191. package/src/lib/i18n/intl-context.tsx +4 -0
  192. package/src/lib/i18n/use-translation.ts +1 -4
  193. package/src/lib/use-composed-event-handlers.ts +25 -0
  194. package/src/lib/use-debounce.ts +289 -237
  195. package/src/lib/use-widgets-invalidator.ts +0 -4
  196. package/src/lib/utils.ts +0 -12
  197. package/src/widgets/api-keys/api-keys-search.tsx +6 -3
  198. package/src/widgets/api-keys/user-api-keys-search.tsx +6 -3
  199. package/src/widgets/organization-switcher/organization-switcher.tsx +32 -8
  200. package/src/widgets/users-management/invite-user-dialog.tsx +9 -11
  201. package/src/widgets/users-management/users-management.tsx +1 -1
  202. package/src/widgets/users-management/users-search.tsx +6 -3
@@ -1 +1 @@
1
- {"version":3,"file":"admin-portal-audit-log-streaming.client.js","names":["AdminPortalAuditLogStreamingPresentational"],"sources":["../../src/admin-portal-audit-log-streaming.client.tsx"],"sourcesContent":["\"use client\";\n\nimport * as React from \"react\";\nimport type { AuthToken } from \"./api/api-provider.js\";\nimport { ApiProvider } from \"./api/api-provider.js\";\nimport type { AdminPortalLinkIntent } from \"./api/client-graphql/generated.js\";\nimport {\n clientGraphqlQueryKey,\n useClientGraphqlMutation,\n useClientGraphqlQuery,\n} from \"./api/client-graphql/hooks.js\";\nimport { ErrorBoundary } from \"./components/error-boundary.js\";\nimport type { WidgetRootDomProps } from \"./lib/widget-types.js\";\nimport { useWorkOsApiUrl } from \"./lib/widgets-context.js\";\nimport {\n AdminPortalAuditLogStreamingButton,\n AdminPortalAuditLogStreamingError,\n AdminPortalAuditLogStreamingLoading,\n AdminPortalAuditLogStreaming as AdminPortalAuditLogStreamingPresentational,\n} from \"./widgets/admin-portal-audit-log-streaming/admin-portal-audit-log-streaming.js\";\nimport type { AdminPortalAuditLogStreamingStatusProps } from \"./widgets/admin-portal-audit-log-streaming/admin-portal-audit-log-streaming.js\";\n\ninterface AdminPortalAuditLogStreamingProps extends WidgetRootDomProps {\n authToken: AuthToken;\n}\n\nconst AdminPortalAuditLogStreaming: React.FC<\n AdminPortalAuditLogStreamingProps\n> = ({ authToken, ...domProps }) => {\n const baseUrl = useWorkOsApiUrl();\n return (\n <ErrorBoundary\n fallbackRender={({ error }) => (\n <AdminPortalAuditLogStreamingError error={error} {...domProps} />\n )}\n >\n <ApiProvider\n widgetType=\"admin-portal-audit-log-streaming\"\n authToken={authToken}\n baseUrl={baseUrl}\n >\n <AdminPortalAuditLogStreamingImpl {...domProps} />\n </ApiProvider>\n </ErrorBoundary>\n );\n};\n\ninterface AdminPortalAuditLogStreamingImplProps extends WidgetRootDomProps {}\n\nconst AdminPortalAuditLogStreamingImpl: React.FC<\n AdminPortalAuditLogStreamingImplProps\n> = (props) => {\n const { mutate: generateAdminPortalLink, ...mutation } =\n useClientGraphqlMutation({\n mutationFn: (sdk, intent: AdminPortalLinkIntent) =>\n sdk.CreateAdminPortalLink({ intent }),\n onSuccess: (data) => {\n window.open(\n data.createAdminPortalLink.link,\n \"_blank\",\n \"noopener,noreferrer\",\n );\n },\n });\n\n const adminPortalLink = mutation.data?.createAdminPortalLink.link ?? null;\n\n const query = useClientGraphqlQuery({\n queryKey: clientGraphqlQueryKey(\"AuditLogStream\"),\n queryFn: (sdk) => sdk.AuditLogStream(),\n });\n\n const initConfig = () => {\n generateAdminPortalLink(\"LogStreams\");\n };\n\n if (query.isLoading) {\n return <AdminPortalAuditLogStreamingLoading {...props} />;\n }\n\n if (query.isError) {\n return <AdminPortalAuditLogStreamingError error={query.error} {...props} />;\n }\n\n if (query.data) {\n const configuredStream = query.data.auditLogStream;\n\n if (!configuredStream) {\n return (\n <AdminPortalAuditLogStreamingPresentational\n {...props}\n connectionStatus=\"NotConfigured\"\n adminPortalOpenButton={\n <AdminPortalAuditLogStreamingButton\n isPending={mutation.isPending}\n href={adminPortalLink}\n initConfig={initConfig}\n />\n }\n />\n );\n }\n\n const statusProps: AdminPortalAuditLogStreamingStatusProps = (() => {\n switch (configuredStream.state) {\n case \"Inactive\":\n return {\n connectionStatus: \"Inactive\",\n destinationType: configuredStream.type,\n };\n case \"Active\":\n return {\n connectionStatus: \"Active\",\n destinationType: configuredStream.type,\n lastSyncedEventId: configuredStream.lastSyncedEventId,\n };\n case \"Error\":\n return {\n connectionStatus: \"Error\",\n destinationType: configuredStream.type,\n lastSyncedEventId: configuredStream.lastSyncedEventId,\n };\n case \"Invalid\":\n return {\n connectionStatus: \"Error\",\n destinationType: configuredStream.type,\n lastSyncedEventId: configuredStream.lastSyncedEventId,\n };\n default:\n // Fallback\n return {\n connectionStatus: \"Inactive\",\n destinationType: configuredStream.type,\n };\n }\n })();\n\n return (\n <ErrorBoundary\n fallbackRender={({ error }) => (\n <AdminPortalAuditLogStreamingError error={error} {...props} />\n )}\n >\n <AdminPortalAuditLogStreamingPresentational\n {...props}\n {...statusProps}\n adminPortalOpenButton={\n <AdminPortalAuditLogStreamingButton\n isPending={mutation.isPending}\n href={adminPortalLink}\n initConfig={initConfig}\n />\n }\n />\n </ErrorBoundary>\n );\n }\n\n return <AdminPortalAuditLogStreamingLoading {...props} />;\n};\nexport {\n AdminPortalAuditLogStreamingLoading,\n AdminPortalAuditLogStreamingError,\n} from \"./widgets/admin-portal-audit-log-streaming/admin-portal-audit-log-streaming.js\";\nexport {\n AdminPortalAuditLogStreaming as AdminPortalAuditLogStreamingPresentational,\n AdminPortalAuditLogStreamingButton,\n type AdminPortalAuditLogStreamingStatusProps,\n} from \"./widgets/admin-portal-audit-log-streaming/admin-portal-audit-log-streaming.js\";\nexport type { AdminPortalAuditLogStreamingProps };\nexport { AdminPortalAuditLogStreaming };\n"],"mappings":";;;;;;;;;AA0BA,MAAM,gCAED,EAAE,WAAW,GAAG,eAAe;CAClC,MAAM,UAAU,gBAAgB;CAChC,OACE,oBAAC,eAAD;EACE,iBAAiB,EAAE,YACjB,oBAAC,mCAAD;GAA0C;GAAO,GAAI;EAAW,CAAA;EAGlE,UAAA,oBAAC,aAAD;GACE,YAAW;GACA;GACF;GAET,UAAA,oBAAC,kCAAD,EAAkC,GAAI,SAAW,CAAA;EACtC,CAAA;CACA,CAAA;AAEnB;AAIA,MAAM,oCAED,UAAU;CACb,MAAM,EAAE,QAAQ,yBAAyB,GAAG,aAC1C,yBAAyB;EACvB,aAAa,KAAK,WAChB,IAAI,sBAAsB,EAAE,OAAO,CAAC;EACtC,YAAY,SAAS;GACnB,OAAO,KACL,KAAK,sBAAsB,MAC3B,UACA,qBACF;EACF;CACF,CAAC;CAEH,MAAM,kBAAkB,SAAS,MAAM,sBAAsB,QAAQ;CAErE,MAAM,QAAQ,sBAAsB;EAClC,UAAU,sBAAsB,gBAAgB;EAChD,UAAU,QAAQ,IAAI,eAAe;CACvC,CAAC;CAED,MAAM,mBAAmB;EACvB,wBAAwB,YAAY;CACtC;CAEA,IAAI,MAAM,WACR,OAAO,oBAAC,qCAAD,EAAqC,GAAI,MAAQ,CAAA;CAG1D,IAAI,MAAM,SACR,OAAO,oBAAC,mCAAD;EAAmC,OAAO,MAAM;EAAO,GAAI;CAAQ,CAAA;CAG5E,IAAI,MAAM,MAAM;EACd,MAAM,mBAAmB,MAAM,KAAK;EAEpC,IAAI,CAAC,kBACH,OACE,oBAACA,gCAAD;GACE,GAAI;GACJ,kBAAiB;GACjB,uBACE,oBAAC,oCAAD;IACE,WAAW,SAAS;IACpB,MAAM;IACM;GACb,CAAA;EAEJ,CAAA;EAIL,MAAM,qBAA8D;GAClE,QAAQ,iBAAiB,OAAzB;IACE,KAAK,YACH,OAAO;KACL,kBAAkB;KAClB,iBAAiB,iBAAiB;IACpC;IACF,KAAK,UACH,OAAO;KACL,kBAAkB;KAClB,iBAAiB,iBAAiB;KAClC,mBAAmB,iBAAiB;IACtC;IACF,KAAK,SACH,OAAO;KACL,kBAAkB;KAClB,iBAAiB,iBAAiB;KAClC,mBAAmB,iBAAiB;IACtC;IACF,KAAK,WACH,OAAO;KACL,kBAAkB;KAClB,iBAAiB,iBAAiB;KAClC,mBAAmB,iBAAiB;IACtC;IACF,SAEE,OAAO;KACL,kBAAkB;KAClB,iBAAiB,iBAAiB;IACpC;GACJ;EACF,EAAA,CAAG;EAEH,OACE,oBAAC,eAAD;GACE,iBAAiB,EAAE,YACjB,oBAAC,mCAAD;IAA0C;IAAO,GAAI;GAAQ,CAAA;GAG/D,UAAA,oBAACA,gCAAD;IACE,GAAI;IACJ,GAAI;IACJ,uBACE,oBAAC,oCAAD;KACE,WAAW,SAAS;KACpB,MAAM;KACM;IACb,CAAA;GAEJ,CAAA;EACY,CAAA;CAEnB;CAEA,OAAO,oBAAC,qCAAD,EAAqC,GAAI,MAAQ,CAAA;AAC1D"}
1
+ {"version":3,"file":"admin-portal-audit-log-streaming.client.js","names":["AdminPortalAuditLogStreamingPresentational"],"sources":["../../src/admin-portal-audit-log-streaming.client.tsx"],"sourcesContent":["\"use client\";\n\nimport * as React from \"react\";\nimport type { AuthToken } from \"./api/api-provider.js\";\nimport { ApiProvider } from \"./api/api-provider.js\";\nimport type { AdminPortalLinkIntent } from \"./api/client-graphql/generated.js\";\nimport {\n clientGraphqlQueryKey,\n useClientGraphqlMutation,\n useClientGraphqlQuery,\n} from \"./api/client-graphql/hooks.js\";\nimport { ErrorBoundary } from \"./components/error-boundary.js\";\nimport type { WidgetRootDomProps } from \"./lib/widget-types.js\";\nimport { useWorkOsApiUrl } from \"./lib/widgets-context.js\";\nimport {\n AdminPortalAuditLogStreamingButton,\n AdminPortalAuditLogStreamingError,\n AdminPortalAuditLogStreamingLoading,\n AdminPortalAuditLogStreaming as AdminPortalAuditLogStreamingPresentational,\n} from \"./widgets/admin-portal-audit-log-streaming/admin-portal-audit-log-streaming.js\";\nimport type { AdminPortalAuditLogStreamingStatusProps } from \"./widgets/admin-portal-audit-log-streaming/admin-portal-audit-log-streaming.js\";\n\ninterface AdminPortalAuditLogStreamingProps extends WidgetRootDomProps {\n authToken: AuthToken;\n}\n\nconst AdminPortalAuditLogStreaming: React.FC<\n AdminPortalAuditLogStreamingProps\n> = ({ authToken, ...domProps }) => {\n const baseUrl = useWorkOsApiUrl();\n return (\n <ErrorBoundary\n fallbackRender={({ error }) => (\n <AdminPortalAuditLogStreamingError error={error} {...domProps} />\n )}\n >\n <ApiProvider\n widgetType=\"admin-portal-audit-log-streaming\"\n authToken={authToken}\n baseUrl={baseUrl}\n >\n <AdminPortalAuditLogStreamingImpl {...domProps} />\n </ApiProvider>\n </ErrorBoundary>\n );\n};\n\ninterface AdminPortalAuditLogStreamingImplProps extends WidgetRootDomProps {}\n\nconst AdminPortalAuditLogStreamingImpl: React.FC<\n AdminPortalAuditLogStreamingImplProps\n> = (props) => {\n const { mutate: generateAdminPortalLink, ...mutation } =\n useClientGraphqlMutation({\n mutationFn: (sdk, intent: AdminPortalLinkIntent) =>\n sdk.CreateAdminPortalLink({ intent }),\n onSuccess: (data) => {\n window.open(\n data.createAdminPortalLink.link,\n \"_blank\",\n \"noopener,noreferrer\",\n );\n },\n });\n\n const adminPortalLink = mutation.data?.createAdminPortalLink.link ?? null;\n\n const query = useClientGraphqlQuery({\n queryKey: clientGraphqlQueryKey(\"AuditLogStream\"),\n queryFn: (sdk) => sdk.AuditLogStream(),\n });\n\n const initConfig = () => {\n generateAdminPortalLink(\"LogStreams\");\n };\n\n if (query.isLoading) {\n return <AdminPortalAuditLogStreamingLoading {...props} />;\n }\n\n if (query.isError) {\n return <AdminPortalAuditLogStreamingError error={query.error} {...props} />;\n }\n\n if (query.data) {\n const configuredStream = query.data.auditLogStream;\n\n if (!configuredStream) {\n return (\n <AdminPortalAuditLogStreamingPresentational\n {...props}\n connectionStatus=\"NotConfigured\"\n adminPortalOpenButton={\n <AdminPortalAuditLogStreamingButton\n isPending={mutation.isPending}\n href={adminPortalLink}\n initConfig={initConfig}\n />\n }\n />\n );\n }\n\n const statusProps: AdminPortalAuditLogStreamingStatusProps = (() => {\n switch (configuredStream.state) {\n case \"Inactive\":\n return {\n connectionStatus: \"Inactive\",\n destinationType: configuredStream.type,\n };\n case \"Active\":\n return {\n connectionStatus: \"Active\",\n destinationType: configuredStream.type,\n lastSyncedEventId: configuredStream.lastSyncedEventId,\n };\n case \"Error\":\n return {\n connectionStatus: \"Error\",\n destinationType: configuredStream.type,\n lastSyncedEventId: configuredStream.lastSyncedEventId,\n };\n case \"Invalid\":\n return {\n connectionStatus: \"Error\",\n destinationType: configuredStream.type,\n lastSyncedEventId: configuredStream.lastSyncedEventId,\n };\n default:\n // Fallback\n return {\n connectionStatus: \"Inactive\",\n destinationType: configuredStream.type,\n };\n }\n })();\n\n return (\n <ErrorBoundary\n fallbackRender={({ error }) => (\n <AdminPortalAuditLogStreamingError error={error} {...props} />\n )}\n >\n <AdminPortalAuditLogStreamingPresentational\n {...props}\n {...statusProps}\n adminPortalOpenButton={\n <AdminPortalAuditLogStreamingButton\n isPending={mutation.isPending}\n href={adminPortalLink}\n initConfig={initConfig}\n />\n }\n />\n </ErrorBoundary>\n );\n }\n\n return <AdminPortalAuditLogStreamingLoading {...props} />;\n};\nexport {\n AdminPortalAuditLogStreamingLoading,\n AdminPortalAuditLogStreamingError,\n} from \"./widgets/admin-portal-audit-log-streaming/admin-portal-audit-log-streaming.js\";\nexport {\n AdminPortalAuditLogStreaming as AdminPortalAuditLogStreamingPresentational,\n AdminPortalAuditLogStreamingButton,\n type AdminPortalAuditLogStreamingStatusProps,\n} from \"./widgets/admin-portal-audit-log-streaming/admin-portal-audit-log-streaming.js\";\nexport type { AdminPortalAuditLogStreamingProps };\nexport { AdminPortalAuditLogStreaming };\n"],"mappings":";;;;;;;;;;AA0BA,MAAM,gCAED,EAAE,WAAW,GAAG,eAAe;CAClC,MAAM,UAAU,gBAAgB;CAChC,OACE,oBAAC,eAAD;EACE,iBAAiB,EAAE,YACjB,oBAAC,mCAAD;GAA0C;GAAO,GAAI;EAAW,CAAA;EAGlE,UAAA,oBAAC,aAAD;GACE,YAAW;GACA;GACF;GAET,UAAA,oBAAC,kCAAD,EAAkC,GAAI,SAAW,CAAA;EACtC,CAAA;CACA,CAAA;AAEnB;AAIA,MAAM,oCAED,UAAU;CACb,MAAM,EAAE,QAAQ,yBAAyB,GAAG,aAC1C,yBAAyB;EACvB,aAAa,KAAK,WAChB,IAAI,sBAAsB,EAAE,OAAO,CAAC;EACtC,YAAY,SAAS;GACnB,OAAO,KACL,KAAK,sBAAsB,MAC3B,UACA,qBACF;EACF;CACF,CAAC;CAEH,MAAM,kBAAkB,SAAS,MAAM,sBAAsB,QAAQ;CAErE,MAAM,QAAQ,sBAAsB;EAClC,UAAU,sBAAsB,gBAAgB;EAChD,UAAU,QAAQ,IAAI,eAAe;CACvC,CAAC;CAED,MAAM,mBAAmB;EACvB,wBAAwB,YAAY;CACtC;CAEA,IAAI,MAAM,WACR,OAAO,oBAAC,qCAAD,EAAqC,GAAI,MAAQ,CAAA;CAG1D,IAAI,MAAM,SACR,OAAO,oBAAC,mCAAD;EAAmC,OAAO,MAAM;EAAO,GAAI;CAAQ,CAAA;CAG5E,IAAI,MAAM,MAAM;EACd,MAAM,mBAAmB,MAAM,KAAK;EAEpC,IAAI,CAAC,kBACH,OACE,oBAACA,gCAAD;GACE,GAAI;GACJ,kBAAiB;GACjB,uBACE,oBAAC,oCAAD;IACE,WAAW,SAAS;IACpB,MAAM;IACM;GACb,CAAA;EAEJ,CAAA;EAIL,MAAM,qBAA8D;GAClE,QAAQ,iBAAiB,OAAzB;IACE,KAAK,YACH,OAAO;KACL,kBAAkB;KAClB,iBAAiB,iBAAiB;IACpC;IACF,KAAK,UACH,OAAO;KACL,kBAAkB;KAClB,iBAAiB,iBAAiB;KAClC,mBAAmB,iBAAiB;IACtC;IACF,KAAK,SACH,OAAO;KACL,kBAAkB;KAClB,iBAAiB,iBAAiB;KAClC,mBAAmB,iBAAiB;IACtC;IACF,KAAK,WACH,OAAO;KACL,kBAAkB;KAClB,iBAAiB,iBAAiB;KAClC,mBAAmB,iBAAiB;IACtC;IACF,SAEE,OAAO;KACL,kBAAkB;KAClB,iBAAiB,iBAAiB;IACpC;GACJ;EACF,EAAA,CAAG;EAEH,OACE,oBAAC,eAAD;GACE,iBAAiB,EAAE,YACjB,oBAAC,mCAAD;IAA0C;IAAO,GAAI;GAAQ,CAAA;GAG/D,UAAA,oBAACA,gCAAD;IACE,GAAI;IACJ,GAAI;IACJ,uBACE,oBAAC,oCAAD;KACE,WAAW,SAAS;KACpB,MAAM;KACM;IACb,CAAA;GAEJ,CAAA;EACY,CAAA;CAEnB;CAEA,OAAO,oBAAC,qCAAD,EAAqC,GAAI,MAAQ,CAAA;AAC1D"}
@@ -1,7 +1,8 @@
1
1
  "use client";
2
2
  import { useWorkOsApiUrl } from "./lib/widgets-context.js";
3
+ import { clientGraphqlQueryKey } from "./api/client-graphql/query-keys.js";
3
4
  import { ApiProvider, useApiReady } from "./api/api-provider.js";
4
- import { clientGraphqlQueryKey, useClientGraphqlMutation, useClientGraphqlQuery } from "./api/client-graphql/hooks.js";
5
+ import { useClientGraphqlMutation, useClientGraphqlQuery } from "./api/client-graphql/hooks.js";
5
6
  import { ErrorBoundary } from "./components/error-boundary.js";
6
7
  import { openUrlViaForm } from "./lib/utils.js";
7
8
  import { AdminPortalDomainVerification as AdminPortalDomainVerification$1, AdminPortalDomainVerificationError, AdminPortalDomainVerificationLoading } from "./widgets/admin-portal-domain-verification/admin-portal-domain-verification.js";
@@ -1 +1 @@
1
- {"version":3,"file":"admin-portal-domain-verification.client.js","names":["AdminPortalDomainVerificationPresentational"],"sources":["../../src/admin-portal-domain-verification.client.tsx"],"sourcesContent":["\"use client\";\n\nimport { useQueryClient } from \"@tanstack/react-query\";\nimport * as React from \"react\";\nimport type { AuthToken } from \"./api/api-provider.js\";\nimport { ApiProvider, useApiReady } from \"./api/api-provider.js\";\nimport type {\n AdminPortalLinkIntent,\n OrganizationDomainFieldsFragment,\n Sdk,\n} from \"./api/client-graphql/generated.js\";\nimport {\n clientGraphqlQueryKey,\n useClientGraphqlMutation,\n useClientGraphqlQuery,\n} from \"./api/client-graphql/hooks.js\";\nimport { ErrorBoundary } from \"./components/error-boundary.js\";\nimport { openUrlViaForm } from \"./lib/utils.js\";\nimport type { WidgetRootDomProps } from \"./lib/widget-types.js\";\nimport { useWorkOsApiUrl } from \"./lib/widgets-context.js\";\nimport {\n AdminPortalDomainVerificationError,\n AdminPortalDomainVerificationLoading,\n AdminPortalDomainVerification as AdminPortalDomainVerificationPresentational,\n} from \"./widgets/admin-portal-domain-verification/admin-portal-domain-verification.js\";\nimport type {\n AdminPortalDomainVerificationErrorProps,\n AdminPortalDomainVerificationLoadingProps,\n} from \"./widgets/admin-portal-domain-verification/admin-portal-domain-verification.js\";\n\nconst DOMAINS_PAGE_SIZE = 100;\n\nasync function listAllOrganizationDomains(\n sdk: Sdk,\n): Promise<OrganizationDomainFieldsFragment[]> {\n const domains: OrganizationDomainFieldsFragment[] = [];\n let after: string | null = null;\n do {\n const { organizationDomains } = await sdk.ListOrganizationDomains({\n after,\n limit: DOMAINS_PAGE_SIZE,\n order: \"Asc\",\n });\n domains.push(...organizationDomains.data);\n after = organizationDomains.listMetadata.after ?? null;\n } while (after !== null);\n return domains;\n}\n\ninterface AdminPortalDomainVerificationProps extends WidgetRootDomProps {\n authToken: AuthToken;\n}\n\nconst AdminPortalDomainVerification: React.FC<\n AdminPortalDomainVerificationProps\n> = ({ authToken, ...domProps }) => {\n const baseUrl = useWorkOsApiUrl();\n\n return (\n <ErrorBoundary\n fallbackRender={({ error }) => (\n <AdminPortalDomainVerificationError error={error} {...domProps} />\n )}\n >\n <ApiProvider\n widgetType=\"admin-portal-domain-verification\"\n authToken={authToken}\n baseUrl={baseUrl}\n >\n <AdminPortalDomainVerificationImpl {...domProps} />\n </ApiProvider>\n </ErrorBoundary>\n );\n};\n\ninterface AdminPortalDomainVerificationImplProps extends Omit<\n AdminPortalDomainVerificationProps,\n \"authToken\"\n> {}\n\nconst AdminPortalDomainVerificationImpl: React.FC<\n AdminPortalDomainVerificationImplProps\n> = (props) => {\n const isApiReady = useApiReady();\n const queryClient = useQueryClient();\n const {\n data: organizationDomains,\n isLoading,\n error,\n } = useClientGraphqlQuery({\n queryKey: clientGraphqlQueryKey(\"ListOrganizationDomains\"),\n queryFn: listAllOrganizationDomains,\n });\n\n const invalidateDomains = () => {\n queryClient.invalidateQueries({\n queryKey: clientGraphqlQueryKey(\"ListOrganizationDomains\"),\n });\n };\n\n const { mutate: generateAdminPortalLink, isPending } =\n useClientGraphqlMutation({\n mutationFn: (sdk, intent: AdminPortalLinkIntent) =>\n sdk.CreateAdminPortalLink({ intent }),\n onSuccess: (data) => {\n openUrlViaForm(data.createAdminPortalLink.link, {\n target: \"_blank\",\n rel: \"noopener noreferrer\",\n });\n },\n });\n\n const { mutate: deleteDomain } = useClientGraphqlMutation({\n mutationFn: (sdk, id: string) => sdk.DeleteOrganizationDomain({ id }),\n onSuccess: invalidateDomains,\n });\n\n const { mutate: reverifyDomain } = useClientGraphqlMutation({\n mutationFn: (sdk, id: string) => sdk.ReverifyOrganizationDomain({ id }),\n onSuccess: invalidateDomains,\n });\n\n const handleAddDomain = () => {\n generateAdminPortalLink(\"DomainVerification\");\n };\n\n const handleDeleteDomain = (domainId: string) => {\n deleteDomain(domainId);\n };\n\n const handleReverifyDomain = (domainId: string) => {\n reverifyDomain(domainId);\n };\n\n if (!isApiReady || isLoading) {\n return <AdminPortalDomainVerificationLoading {...props} />;\n }\n\n if (error) {\n return <AdminPortalDomainVerificationError error={error} {...props} />;\n }\n\n const domains = organizationDomains || [];\n\n return (\n <ErrorBoundary\n fallbackRender={({ error }) => (\n <AdminPortalDomainVerificationError error={error} {...props} />\n )}\n >\n <AdminPortalDomainVerificationPresentational\n organizationDomains={domains}\n onAddDomain={handleAddDomain}\n onDeleteDomain={handleDeleteDomain}\n onReverifyDomain={handleReverifyDomain}\n isPending={isPending}\n {...props}\n />\n </ErrorBoundary>\n );\n};\n\nexport type {\n AdminPortalDomainVerificationProps,\n AdminPortalDomainVerificationLoadingProps,\n AdminPortalDomainVerificationErrorProps,\n};\nexport {\n AdminPortalDomainVerification,\n AdminPortalDomainVerificationLoading,\n AdminPortalDomainVerificationError,\n};\n"],"mappings":";;;;;;;;;;;AA8BA,MAAM,oBAAoB;AAE1B,eAAe,2BACb,KAC6C;CAC7C,MAAM,UAA8C,CAAC;CACrD,IAAI,QAAuB;CAC3B,GAAG;EACD,MAAM,EAAE,wBAAwB,MAAM,IAAI,wBAAwB;GAChE;GACA,OAAO;GACP,OAAO;EACT,CAAC;EACD,QAAQ,KAAK,GAAG,oBAAoB,IAAI;EACxC,QAAQ,oBAAoB,aAAa,SAAS;CACpD,SAAS,UAAU;CACnB,OAAO;AACT;AAMA,MAAM,iCAED,EAAE,WAAW,GAAG,eAAe;CAClC,MAAM,UAAU,gBAAgB;CAEhC,OACE,oBAAC,eAAD;EACE,iBAAiB,EAAE,YACjB,oBAAC,oCAAD;GAA2C;GAAO,GAAI;EAAW,CAAA;EAGnE,UAAA,oBAAC,aAAD;GACE,YAAW;GACA;GACF;GAET,UAAA,oBAAC,mCAAD,EAAmC,GAAI,SAAW,CAAA;EACvC,CAAA;CACA,CAAA;AAEnB;AAOA,MAAM,qCAED,UAAU;CACb,MAAM,aAAa,YAAY;CAC/B,MAAM,cAAc,eAAe;CACnC,MAAM,EACJ,MAAM,qBACN,WACA,UACE,sBAAsB;EACxB,UAAU,sBAAsB,yBAAyB;EACzD,SAAS;CACX,CAAC;CAED,MAAM,0BAA0B;EAC9B,YAAY,kBAAkB,EAC5B,UAAU,sBAAsB,yBAAyB,EAC3D,CAAC;CACH;CAEA,MAAM,EAAE,QAAQ,yBAAyB,cACvC,yBAAyB;EACvB,aAAa,KAAK,WAChB,IAAI,sBAAsB,EAAE,OAAO,CAAC;EACtC,YAAY,SAAS;GACnB,eAAe,KAAK,sBAAsB,MAAM;IAC9C,QAAQ;IACR,KAAK;GACP,CAAC;EACH;CACF,CAAC;CAEH,MAAM,EAAE,QAAQ,iBAAiB,yBAAyB;EACxD,aAAa,KAAK,OAAe,IAAI,yBAAyB,EAAE,GAAG,CAAC;EACpE,WAAW;CACb,CAAC;CAED,MAAM,EAAE,QAAQ,mBAAmB,yBAAyB;EAC1D,aAAa,KAAK,OAAe,IAAI,2BAA2B,EAAE,GAAG,CAAC;EACtE,WAAW;CACb,CAAC;CAED,MAAM,wBAAwB;EAC5B,wBAAwB,oBAAoB;CAC9C;CAEA,MAAM,sBAAsB,aAAqB;EAC/C,aAAa,QAAQ;CACvB;CAEA,MAAM,wBAAwB,aAAqB;EACjD,eAAe,QAAQ;CACzB;CAEA,IAAI,CAAC,cAAc,WACjB,OAAO,oBAAC,sCAAD,EAAsC,GAAI,MAAQ,CAAA;CAG3D,IAAI,OACF,OAAO,oBAAC,oCAAD;EAA2C;EAAO,GAAI;CAAQ,CAAA;CAKvE,OACE,oBAAC,eAAD;EACE,iBAAiB,EAAE,YACjB,oBAAC,oCAAD;GAA2C;GAAO,GAAI;EAAQ,CAAA;EAGhE,UAAA,oBAACA,iCAAD;GACE,qBATU,uBAAuB,CAAC;GAUlC,aAAa;GACb,gBAAgB;GAChB,kBAAkB;GACP;GACX,GAAI;EACL,CAAA;CACY,CAAA;AAEnB"}
1
+ {"version":3,"file":"admin-portal-domain-verification.client.js","names":["AdminPortalDomainVerificationPresentational"],"sources":["../../src/admin-portal-domain-verification.client.tsx"],"sourcesContent":["\"use client\";\n\nimport { useQueryClient } from \"@tanstack/react-query\";\nimport * as React from \"react\";\nimport type { AuthToken } from \"./api/api-provider.js\";\nimport { ApiProvider, useApiReady } from \"./api/api-provider.js\";\nimport type {\n AdminPortalLinkIntent,\n OrganizationDomainFieldsFragment,\n Sdk,\n} from \"./api/client-graphql/generated.js\";\nimport {\n clientGraphqlQueryKey,\n useClientGraphqlMutation,\n useClientGraphqlQuery,\n} from \"./api/client-graphql/hooks.js\";\nimport { ErrorBoundary } from \"./components/error-boundary.js\";\nimport { openUrlViaForm } from \"./lib/utils.js\";\nimport type { WidgetRootDomProps } from \"./lib/widget-types.js\";\nimport { useWorkOsApiUrl } from \"./lib/widgets-context.js\";\nimport {\n AdminPortalDomainVerificationError,\n AdminPortalDomainVerificationLoading,\n AdminPortalDomainVerification as AdminPortalDomainVerificationPresentational,\n} from \"./widgets/admin-portal-domain-verification/admin-portal-domain-verification.js\";\nimport type {\n AdminPortalDomainVerificationErrorProps,\n AdminPortalDomainVerificationLoadingProps,\n} from \"./widgets/admin-portal-domain-verification/admin-portal-domain-verification.js\";\n\nconst DOMAINS_PAGE_SIZE = 100;\n\nasync function listAllOrganizationDomains(\n sdk: Sdk,\n): Promise<OrganizationDomainFieldsFragment[]> {\n const domains: OrganizationDomainFieldsFragment[] = [];\n let after: string | null = null;\n do {\n const { organizationDomains } = await sdk.ListOrganizationDomains({\n after,\n limit: DOMAINS_PAGE_SIZE,\n order: \"Asc\",\n });\n domains.push(...organizationDomains.data);\n after = organizationDomains.listMetadata.after ?? null;\n } while (after !== null);\n return domains;\n}\n\ninterface AdminPortalDomainVerificationProps extends WidgetRootDomProps {\n authToken: AuthToken;\n}\n\nconst AdminPortalDomainVerification: React.FC<\n AdminPortalDomainVerificationProps\n> = ({ authToken, ...domProps }) => {\n const baseUrl = useWorkOsApiUrl();\n\n return (\n <ErrorBoundary\n fallbackRender={({ error }) => (\n <AdminPortalDomainVerificationError error={error} {...domProps} />\n )}\n >\n <ApiProvider\n widgetType=\"admin-portal-domain-verification\"\n authToken={authToken}\n baseUrl={baseUrl}\n >\n <AdminPortalDomainVerificationImpl {...domProps} />\n </ApiProvider>\n </ErrorBoundary>\n );\n};\n\ninterface AdminPortalDomainVerificationImplProps extends Omit<\n AdminPortalDomainVerificationProps,\n \"authToken\"\n> {}\n\nconst AdminPortalDomainVerificationImpl: React.FC<\n AdminPortalDomainVerificationImplProps\n> = (props) => {\n const isApiReady = useApiReady();\n const queryClient = useQueryClient();\n const {\n data: organizationDomains,\n isLoading,\n error,\n } = useClientGraphqlQuery({\n queryKey: clientGraphqlQueryKey(\"ListOrganizationDomains\"),\n queryFn: listAllOrganizationDomains,\n });\n\n const invalidateDomains = () => {\n queryClient.invalidateQueries({\n queryKey: clientGraphqlQueryKey(\"ListOrganizationDomains\"),\n });\n };\n\n const { mutate: generateAdminPortalLink, isPending } =\n useClientGraphqlMutation({\n mutationFn: (sdk, intent: AdminPortalLinkIntent) =>\n sdk.CreateAdminPortalLink({ intent }),\n onSuccess: (data) => {\n openUrlViaForm(data.createAdminPortalLink.link, {\n target: \"_blank\",\n rel: \"noopener noreferrer\",\n });\n },\n });\n\n const { mutate: deleteDomain } = useClientGraphqlMutation({\n mutationFn: (sdk, id: string) => sdk.DeleteOrganizationDomain({ id }),\n onSuccess: invalidateDomains,\n });\n\n const { mutate: reverifyDomain } = useClientGraphqlMutation({\n mutationFn: (sdk, id: string) => sdk.ReverifyOrganizationDomain({ id }),\n onSuccess: invalidateDomains,\n });\n\n const handleAddDomain = () => {\n generateAdminPortalLink(\"DomainVerification\");\n };\n\n const handleDeleteDomain = (domainId: string) => {\n deleteDomain(domainId);\n };\n\n const handleReverifyDomain = (domainId: string) => {\n reverifyDomain(domainId);\n };\n\n if (!isApiReady || isLoading) {\n return <AdminPortalDomainVerificationLoading {...props} />;\n }\n\n if (error) {\n return <AdminPortalDomainVerificationError error={error} {...props} />;\n }\n\n const domains = organizationDomains || [];\n\n return (\n <ErrorBoundary\n fallbackRender={({ error }) => (\n <AdminPortalDomainVerificationError error={error} {...props} />\n )}\n >\n <AdminPortalDomainVerificationPresentational\n organizationDomains={domains}\n onAddDomain={handleAddDomain}\n onDeleteDomain={handleDeleteDomain}\n onReverifyDomain={handleReverifyDomain}\n isPending={isPending}\n {...props}\n />\n </ErrorBoundary>\n );\n};\n\nexport type {\n AdminPortalDomainVerificationProps,\n AdminPortalDomainVerificationLoadingProps,\n AdminPortalDomainVerificationErrorProps,\n};\nexport {\n AdminPortalDomainVerification,\n AdminPortalDomainVerificationLoading,\n AdminPortalDomainVerificationError,\n};\n"],"mappings":";;;;;;;;;;;;AA8BA,MAAM,oBAAoB;AAE1B,eAAe,2BACb,KAC6C;CAC7C,MAAM,UAA8C,CAAC;CACrD,IAAI,QAAuB;CAC3B,GAAG;EACD,MAAM,EAAE,wBAAwB,MAAM,IAAI,wBAAwB;GAChE;GACA,OAAO;GACP,OAAO;EACT,CAAC;EACD,QAAQ,KAAK,GAAG,oBAAoB,IAAI;EACxC,QAAQ,oBAAoB,aAAa,SAAS;CACpD,SAAS,UAAU;CACnB,OAAO;AACT;AAMA,MAAM,iCAED,EAAE,WAAW,GAAG,eAAe;CAClC,MAAM,UAAU,gBAAgB;CAEhC,OACE,oBAAC,eAAD;EACE,iBAAiB,EAAE,YACjB,oBAAC,oCAAD;GAA2C;GAAO,GAAI;EAAW,CAAA;EAGnE,UAAA,oBAAC,aAAD;GACE,YAAW;GACA;GACF;GAET,UAAA,oBAAC,mCAAD,EAAmC,GAAI,SAAW,CAAA;EACvC,CAAA;CACA,CAAA;AAEnB;AAOA,MAAM,qCAED,UAAU;CACb,MAAM,aAAa,YAAY;CAC/B,MAAM,cAAc,eAAe;CACnC,MAAM,EACJ,MAAM,qBACN,WACA,UACE,sBAAsB;EACxB,UAAU,sBAAsB,yBAAyB;EACzD,SAAS;CACX,CAAC;CAED,MAAM,0BAA0B;EAC9B,YAAY,kBAAkB,EAC5B,UAAU,sBAAsB,yBAAyB,EAC3D,CAAC;CACH;CAEA,MAAM,EAAE,QAAQ,yBAAyB,cACvC,yBAAyB;EACvB,aAAa,KAAK,WAChB,IAAI,sBAAsB,EAAE,OAAO,CAAC;EACtC,YAAY,SAAS;GACnB,eAAe,KAAK,sBAAsB,MAAM;IAC9C,QAAQ;IACR,KAAK;GACP,CAAC;EACH;CACF,CAAC;CAEH,MAAM,EAAE,QAAQ,iBAAiB,yBAAyB;EACxD,aAAa,KAAK,OAAe,IAAI,yBAAyB,EAAE,GAAG,CAAC;EACpE,WAAW;CACb,CAAC;CAED,MAAM,EAAE,QAAQ,mBAAmB,yBAAyB;EAC1D,aAAa,KAAK,OAAe,IAAI,2BAA2B,EAAE,GAAG,CAAC;EACtE,WAAW;CACb,CAAC;CAED,MAAM,wBAAwB;EAC5B,wBAAwB,oBAAoB;CAC9C;CAEA,MAAM,sBAAsB,aAAqB;EAC/C,aAAa,QAAQ;CACvB;CAEA,MAAM,wBAAwB,aAAqB;EACjD,eAAe,QAAQ;CACzB;CAEA,IAAI,CAAC,cAAc,WACjB,OAAO,oBAAC,sCAAD,EAAsC,GAAI,MAAQ,CAAA;CAG3D,IAAI,OACF,OAAO,oBAAC,oCAAD;EAA2C;EAAO,GAAI;CAAQ,CAAA;CAKvE,OACE,oBAAC,eAAD;EACE,iBAAiB,EAAE,YACjB,oBAAC,oCAAD;GAA2C;GAAO,GAAI;EAAQ,CAAA;EAGhE,UAAA,oBAACA,iCAAD;GACE,qBATU,uBAAuB,CAAC;GAUlC,aAAa;GACb,gBAAgB;GAChB,kBAAkB;GACP;GACX,GAAI;EACL,CAAA;CACY,CAAA;AAEnB"}
@@ -1,7 +1,8 @@
1
1
  "use client";
2
2
  import { useWorkOsApiUrl } from "./lib/widgets-context.js";
3
+ import { clientGraphqlQueryKey } from "./api/client-graphql/query-keys.js";
3
4
  import { ApiProvider } from "./api/api-provider.js";
4
- import { clientGraphqlQueryKey, useClientGraphqlMutation, useClientGraphqlQuery } from "./api/client-graphql/hooks.js";
5
+ import { useClientGraphqlMutation, useClientGraphqlQuery } from "./api/client-graphql/hooks.js";
5
6
  import { ErrorBoundary } from "./components/error-boundary.js";
6
7
  import { openUrlViaForm } from "./lib/utils.js";
7
8
  import { useNow } from "./lib/use-now.js";
@@ -1 +1 @@
1
- {"version":3,"file":"admin-portal-sso-connection.client.js","names":["AdminPortalSsoConnectionPresentational"],"sources":["../../src/admin-portal-sso-connection.client.tsx"],"sourcesContent":["\"use client\";\n\nimport * as React from \"react\";\nimport type { AuthToken } from \"./api/api-provider.js\";\nimport { ApiProvider } from \"./api/api-provider.js\";\nimport type {\n AdminPortalLinkIntent,\n ConnectionFieldsFragment,\n ConnectionType,\n} from \"./api/client-graphql/generated.js\";\nimport {\n clientGraphqlQueryKey,\n useClientGraphqlMutation,\n useClientGraphqlQuery,\n} from \"./api/client-graphql/hooks.js\";\nimport { ErrorBoundary } from \"./components/error-boundary.js\";\nimport type { IdentityProvider } from \"./lib/identity-providers.js\";\nimport { useNow } from \"./lib/use-now.js\";\nimport { openUrlViaForm } from \"./lib/utils.js\";\nimport type { WidgetRootDomProps } from \"./lib/widget-types.js\";\nimport { useWorkOsApiUrl } from \"./lib/widgets-context.js\";\nimport {\n AdminPortalOpenButton,\n AdminPortalSsoConnectionError,\n AdminPortalSsoConnectionLoading,\n AdminPortalSsoConnection as AdminPortalSsoConnectionPresentational,\n} from \"./widgets/admin-portal-sso-connection/admin-portal-sso-connection.js\";\nimport type {\n AdminPortalSsoConnectionErrorProps,\n AdminPortalSsoConnectionLoadingProps,\n AdminPortalSsoConnectionStatusProps,\n} from \"./widgets/admin-portal-sso-connection/admin-portal-sso-connection.js\";\n\ninterface AdminPortalSsoConnectionProps extends WidgetRootDomProps {\n authToken: AuthToken;\n}\n\nconst AdminPortalSsoConnection: React.FC<AdminPortalSsoConnectionProps> = ({\n authToken,\n ...domProps\n}) => {\n const baseUrl = useWorkOsApiUrl();\n return (\n <ErrorBoundary\n fallbackRender={({ error }) => (\n <AdminPortalSsoConnectionError error={error} {...domProps} />\n )}\n >\n <ApiProvider\n widgetType=\"admin-portal-sso-connection\"\n authToken={authToken}\n baseUrl={baseUrl}\n >\n <AdminPortalSsoConnectionImpl {...domProps} />\n </ApiProvider>\n </ErrorBoundary>\n );\n};\n\ninterface AdminPortalSsoConnectionImplProps extends WidgetRootDomProps {}\n\nconst AdminPortalSsoConnectionImpl: React.FC<\n AdminPortalSsoConnectionImplProps\n> = (props) => {\n const {\n mutate: generateAdminPortalLink,\n isPending: isGeneratingAdminPortalLink,\n } = useClientGraphqlMutation({\n mutationFn: (sdk, intent: AdminPortalLinkIntent) =>\n sdk.CreateAdminPortalLink({ intent }),\n onSuccess: (data) => {\n openUrlViaForm(data.createAdminPortalLink.link, {\n target: \"_blank\",\n rel: \"noopener noreferrer\",\n });\n },\n });\n\n const query = useClientGraphqlQuery({\n queryKey: clientGraphqlQueryKey(\"ListSsoConnections\"),\n queryFn: (sdk) => sdk.ListSsoConnections(),\n select: (data) => data.ssoConnections,\n });\n\n if (query.isLoading) {\n return <AdminPortalSsoConnectionLoading {...props} />;\n }\n\n if (query.isError) {\n return <AdminPortalSsoConnectionError error={query.error} {...props} />;\n }\n\n if (query.data) {\n const initConfig = () => generateAdminPortalLink(\"Sso\");\n const connection = query.data[0];\n if (!connection) {\n return (\n <ErrorBoundary\n fallbackRender={({ error }) => (\n <AdminPortalSsoConnectionError error={error} {...props} />\n )}\n >\n <AdminPortalSsoConnectionPresentational\n {...props}\n connectionStatus=\"NotConfigured\"\n lastSession={null}\n adminPortalOpenButton={\n <AdminPortalOpenButton\n isPending={isGeneratingAdminPortalLink}\n initConfig={initConfig}\n />\n }\n />\n </ErrorBoundary>\n );\n }\n\n return (\n <ErrorBoundary\n fallbackRender={({ error }) => (\n <AdminPortalSsoConnectionError error={error} {...props} />\n )}\n >\n <AdminPortalSsoConnectionReady\n {...props}\n connection={connection}\n isGeneratingAdminPortalLink={isGeneratingAdminPortalLink}\n initConfig={initConfig}\n />\n </ErrorBoundary>\n );\n }\n};\n\ninterface AdminPortalSsoConnectionReadyProps extends WidgetRootDomProps {\n connection: ConnectionFieldsFragment;\n isGeneratingAdminPortalLink: boolean;\n initConfig: () => void;\n}\n\nconst AdminPortalSsoConnectionReady: React.FC<\n AdminPortalSsoConnectionReadyProps\n> = ({ connection, isGeneratingAdminPortalLink, initConfig, ...props }) => {\n const currentDate = useNow();\n const connectionState = getConnectionState(connection, currentDate);\n const statusProps: AdminPortalSsoConnectionStatusProps = (() => {\n const connectionStatus = connectionState.status;\n if (connectionStatus === \"NotConfigured\") {\n return {\n connectionStatus: \"NotConfigured\",\n } satisfies AdminPortalSsoConnectionStatusProps;\n }\n\n const identityProvider = getIdentityProvider(connection.type);\n switch (connectionStatus) {\n case \"Active\":\n return {\n connectionStatus,\n identityProvider,\n } satisfies AdminPortalSsoConnectionStatusProps;\n case \"Inactive\":\n return {\n connectionStatus,\n identityProvider,\n } satisfies AdminPortalSsoConnectionStatusProps;\n case \"Expired\":\n case \"Expiring\":\n return {\n connectionStatus,\n expiryDate: connectionState.expiryDate,\n identityProvider,\n } satisfies AdminPortalSsoConnectionStatusProps;\n default:\n connectionState satisfies never;\n throw new TypeError(`Unreachable code: ${connectionState}`);\n }\n })();\n\n const lastSession = connection.lastSession\n ? new Date(connection.lastSession.createdAt)\n : null;\n\n return (\n <AdminPortalSsoConnectionPresentational\n {...props}\n {...statusProps}\n lastSession={lastSession}\n adminPortalOpenButton={\n <AdminPortalOpenButton\n isPending={isGeneratingAdminPortalLink}\n initConfig={initConfig}\n />\n }\n />\n );\n};\n\ntype ConnectionState =\n | { status: \"NotConfigured\" }\n | { status: \"Active\" }\n | { status: \"Inactive\" }\n | {\n status: \"Expiring\";\n daysUntilExpiry: number | null;\n expiryDate: Date | null;\n }\n | { status: \"Expired\"; expiryDate: Date | null };\n\nfunction getConnectionState(\n connection: ConnectionFieldsFragment,\n currentDate: Date | null,\n): ConnectionState {\n switch (connection.state) {\n case \"Active\":\n case \"Validating\":\n case \"Deleting\": {\n const activeStatus = { status: \"Active\" } satisfies ConnectionState;\n if (connection.providerTag !== \"Saml\") {\n return activeStatus;\n }\n\n if (connection.latestExpiredCertificate) {\n return {\n status: \"Expired\",\n expiryDate: connection.latestExpiredCertificate.notAfter\n ? new Date(connection.latestExpiredCertificate.notAfter)\n : null,\n };\n }\n\n const expiryTime = connection.latestExpiringCertificate?.notAfter;\n if (currentDate == null || expiryTime == null) {\n return activeStatus;\n }\n\n const expiryDate = new Date(expiryTime);\n const millisecondsUntilExpiry =\n expiryDate.getTime() - currentDate.getTime();\n\n // This certificate is the longest-lived one the server still treats as\n // unexpired. Once `notAfter` passes, the cached query has not yet moved\n // it to `latestExpiredCertificate`, so derive Expired locally.\n if (millisecondsUntilExpiry < 0) {\n return { status: \"Expired\", expiryDate };\n }\n\n const daysUntilExpiry = millisecondsUntilExpiry / (1000 * 60 * 60 * 24);\n if (daysUntilExpiry <= 30) {\n return { status: \"Expiring\", daysUntilExpiry, expiryDate };\n }\n\n return activeStatus;\n }\n case \"Inactive\": {\n return { status: \"Inactive\" };\n }\n default:\n connection.state satisfies never;\n throw new TypeError(`Unreachable code: ${connection.state}`);\n }\n}\n\nfunction getIdentityProvider(connectionType: ConnectionType): IdentityProvider {\n switch (connectionType) {\n case \"ADFSSAML\":\n case \"EntraIdOIDC\":\n case \"MicrosoftOAuth\":\n return \"microsoft\";\n case \"Auth0Migration\":\n case \"Auth0SAML\":\n return \"auth0\";\n case \"AzureSAML\":\n return \"azure\";\n case \"CasSAML\":\n return \"cas\";\n case \"ClassLinkSAML\":\n return \"classlink\";\n case \"CloudflareSAML\":\n return \"cloudflare\";\n case \"CyberArkSAML\":\n return \"cyberark\";\n case \"DuoSAML\":\n return \"duo\";\n case \"GenericSAML\":\n return \"generic-saml\";\n case \"GoogleSAML\":\n case \"GoogleOIDC\":\n case \"GoogleOAuth\":\n return \"google\";\n case \"JumpCloudSAML\":\n return \"jumpcloud\";\n case \"KeycloakSAML\":\n return \"keycloak\";\n case \"LastPassSAML\":\n return \"lastpass\";\n case \"MiniOrangeSAML\":\n return \"miniorange\";\n case \"NetIqSAML\":\n return \"net-iq\";\n case \"OktaOIDC\":\n case \"OktaSAML\":\n return \"okta\";\n case \"OneLoginSAML\":\n return \"onelogin\";\n case \"OracleSAML\":\n return \"oracle\";\n case \"PingFederateSAML\":\n case \"PingOneSAML\":\n return \"ping-identity\";\n case \"RipplingSAML\":\n return \"rippling\";\n case \"SalesforceSAML\":\n case \"SalesforceOAuth\":\n return \"salesforce\";\n case \"ShibbolethGenericSAML\":\n case \"ShibbolethSAML\":\n return \"shibboleth\";\n case \"SimpleSamlPhpSAML\":\n return \"simple-saml-php\";\n case \"TestIdp\":\n return \"test-idp\";\n case \"VMwareSAML\":\n return \"vmware\";\n case \"AdpOidc\":\n return \"adp\";\n case \"GenericOIDC\":\n return \"generic-oidc\";\n case \"LoginGovOidc\":\n return \"login-gov\";\n case \"CleverOIDC\":\n return \"clever\";\n case \"AppleOAuth\":\n return \"apple\";\n case \"BitbucketOAuth\":\n return \"bitbucket\";\n case \"DiscordOAuth\":\n return \"discord\";\n case \"GithubOAuth\":\n return \"github\";\n case \"GitLabOAuth\":\n return \"gitlab\";\n case \"IntuitOAuth\":\n return \"intuit\";\n case \"LinkedInOAuth\":\n return \"linkedin\";\n case \"SlackOAuth\":\n return \"slack\";\n case \"VercelOAuth\":\n case \"VercelMarketplaceOAuth\":\n return \"vercel\";\n case \"XeroOAuth\":\n return \"xero\";\n case \"GrokOAuth\":\n case \"XOAuth\":\n case \"MagicLink\":\n return \"workos\";\n default:\n connectionType satisfies never;\n throw new TypeError(`Unreachable code: ${connectionType}`);\n }\n}\n\nexport type {\n AdminPortalSsoConnectionProps,\n AdminPortalSsoConnectionLoadingProps,\n AdminPortalSsoConnectionErrorProps,\n};\nexport {\n AdminPortalSsoConnection,\n AdminPortalSsoConnectionLoading,\n AdminPortalSsoConnectionError,\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"admin-portal-sso-connection.client.js","names":["AdminPortalSsoConnectionPresentational"],"sources":["../../src/admin-portal-sso-connection.client.tsx"],"sourcesContent":["\"use client\";\n\nimport * as React from \"react\";\nimport type { AuthToken } from \"./api/api-provider.js\";\nimport { ApiProvider } from \"./api/api-provider.js\";\nimport type {\n AdminPortalLinkIntent,\n ConnectionFieldsFragment,\n ConnectionType,\n} from \"./api/client-graphql/generated.js\";\nimport {\n clientGraphqlQueryKey,\n useClientGraphqlMutation,\n useClientGraphqlQuery,\n} from \"./api/client-graphql/hooks.js\";\nimport { ErrorBoundary } from \"./components/error-boundary.js\";\nimport type { IdentityProvider } from \"./lib/identity-providers.js\";\nimport { useNow } from \"./lib/use-now.js\";\nimport { openUrlViaForm } from \"./lib/utils.js\";\nimport type { WidgetRootDomProps } from \"./lib/widget-types.js\";\nimport { useWorkOsApiUrl } from \"./lib/widgets-context.js\";\nimport {\n AdminPortalOpenButton,\n AdminPortalSsoConnectionError,\n AdminPortalSsoConnectionLoading,\n AdminPortalSsoConnection as AdminPortalSsoConnectionPresentational,\n} from \"./widgets/admin-portal-sso-connection/admin-portal-sso-connection.js\";\nimport type {\n AdminPortalSsoConnectionErrorProps,\n AdminPortalSsoConnectionLoadingProps,\n AdminPortalSsoConnectionStatusProps,\n} from \"./widgets/admin-portal-sso-connection/admin-portal-sso-connection.js\";\n\ninterface AdminPortalSsoConnectionProps extends WidgetRootDomProps {\n authToken: AuthToken;\n}\n\nconst AdminPortalSsoConnection: React.FC<AdminPortalSsoConnectionProps> = ({\n authToken,\n ...domProps\n}) => {\n const baseUrl = useWorkOsApiUrl();\n return (\n <ErrorBoundary\n fallbackRender={({ error }) => (\n <AdminPortalSsoConnectionError error={error} {...domProps} />\n )}\n >\n <ApiProvider\n widgetType=\"admin-portal-sso-connection\"\n authToken={authToken}\n baseUrl={baseUrl}\n >\n <AdminPortalSsoConnectionImpl {...domProps} />\n </ApiProvider>\n </ErrorBoundary>\n );\n};\n\ninterface AdminPortalSsoConnectionImplProps extends WidgetRootDomProps {}\n\nconst AdminPortalSsoConnectionImpl: React.FC<\n AdminPortalSsoConnectionImplProps\n> = (props) => {\n const {\n mutate: generateAdminPortalLink,\n isPending: isGeneratingAdminPortalLink,\n } = useClientGraphqlMutation({\n mutationFn: (sdk, intent: AdminPortalLinkIntent) =>\n sdk.CreateAdminPortalLink({ intent }),\n onSuccess: (data) => {\n openUrlViaForm(data.createAdminPortalLink.link, {\n target: \"_blank\",\n rel: \"noopener noreferrer\",\n });\n },\n });\n\n const query = useClientGraphqlQuery({\n queryKey: clientGraphqlQueryKey(\"ListSsoConnections\"),\n queryFn: (sdk) => sdk.ListSsoConnections(),\n select: (data) => data.ssoConnections,\n });\n\n if (query.isLoading) {\n return <AdminPortalSsoConnectionLoading {...props} />;\n }\n\n if (query.isError) {\n return <AdminPortalSsoConnectionError error={query.error} {...props} />;\n }\n\n if (query.data) {\n const initConfig = () => generateAdminPortalLink(\"Sso\");\n const connection = query.data[0];\n if (!connection) {\n return (\n <ErrorBoundary\n fallbackRender={({ error }) => (\n <AdminPortalSsoConnectionError error={error} {...props} />\n )}\n >\n <AdminPortalSsoConnectionPresentational\n {...props}\n connectionStatus=\"NotConfigured\"\n lastSession={null}\n adminPortalOpenButton={\n <AdminPortalOpenButton\n isPending={isGeneratingAdminPortalLink}\n initConfig={initConfig}\n />\n }\n />\n </ErrorBoundary>\n );\n }\n\n return (\n <ErrorBoundary\n fallbackRender={({ error }) => (\n <AdminPortalSsoConnectionError error={error} {...props} />\n )}\n >\n <AdminPortalSsoConnectionReady\n {...props}\n connection={connection}\n isGeneratingAdminPortalLink={isGeneratingAdminPortalLink}\n initConfig={initConfig}\n />\n </ErrorBoundary>\n );\n }\n};\n\ninterface AdminPortalSsoConnectionReadyProps extends WidgetRootDomProps {\n connection: ConnectionFieldsFragment;\n isGeneratingAdminPortalLink: boolean;\n initConfig: () => void;\n}\n\nconst AdminPortalSsoConnectionReady: React.FC<\n AdminPortalSsoConnectionReadyProps\n> = ({ connection, isGeneratingAdminPortalLink, initConfig, ...props }) => {\n const currentDate = useNow();\n const connectionState = getConnectionState(connection, currentDate);\n const statusProps: AdminPortalSsoConnectionStatusProps = (() => {\n const connectionStatus = connectionState.status;\n if (connectionStatus === \"NotConfigured\") {\n return {\n connectionStatus: \"NotConfigured\",\n } satisfies AdminPortalSsoConnectionStatusProps;\n }\n\n const identityProvider = getIdentityProvider(connection.type);\n switch (connectionStatus) {\n case \"Active\":\n return {\n connectionStatus,\n identityProvider,\n } satisfies AdminPortalSsoConnectionStatusProps;\n case \"Inactive\":\n return {\n connectionStatus,\n identityProvider,\n } satisfies AdminPortalSsoConnectionStatusProps;\n case \"Expired\":\n case \"Expiring\":\n return {\n connectionStatus,\n expiryDate: connectionState.expiryDate,\n identityProvider,\n } satisfies AdminPortalSsoConnectionStatusProps;\n default:\n connectionState satisfies never;\n throw new TypeError(`Unreachable code: ${connectionState}`);\n }\n })();\n\n const lastSession = connection.lastSession\n ? new Date(connection.lastSession.createdAt)\n : null;\n\n return (\n <AdminPortalSsoConnectionPresentational\n {...props}\n {...statusProps}\n lastSession={lastSession}\n adminPortalOpenButton={\n <AdminPortalOpenButton\n isPending={isGeneratingAdminPortalLink}\n initConfig={initConfig}\n />\n }\n />\n );\n};\n\ntype ConnectionState =\n | { status: \"NotConfigured\" }\n | { status: \"Active\" }\n | { status: \"Inactive\" }\n | {\n status: \"Expiring\";\n daysUntilExpiry: number | null;\n expiryDate: Date | null;\n }\n | { status: \"Expired\"; expiryDate: Date | null };\n\nfunction getConnectionState(\n connection: ConnectionFieldsFragment,\n currentDate: Date | null,\n): ConnectionState {\n switch (connection.state) {\n case \"Active\":\n case \"Validating\":\n case \"Deleting\": {\n const activeStatus = { status: \"Active\" } satisfies ConnectionState;\n if (connection.providerTag !== \"Saml\") {\n return activeStatus;\n }\n\n if (connection.latestExpiredCertificate) {\n return {\n status: \"Expired\",\n expiryDate: connection.latestExpiredCertificate.notAfter\n ? new Date(connection.latestExpiredCertificate.notAfter)\n : null,\n };\n }\n\n const expiryTime = connection.latestExpiringCertificate?.notAfter;\n if (currentDate == null || expiryTime == null) {\n return activeStatus;\n }\n\n const expiryDate = new Date(expiryTime);\n const millisecondsUntilExpiry =\n expiryDate.getTime() - currentDate.getTime();\n\n // This certificate is the longest-lived one the server still treats as\n // unexpired. Once `notAfter` passes, the cached query has not yet moved\n // it to `latestExpiredCertificate`, so derive Expired locally.\n if (millisecondsUntilExpiry < 0) {\n return { status: \"Expired\", expiryDate };\n }\n\n const daysUntilExpiry = millisecondsUntilExpiry / (1000 * 60 * 60 * 24);\n if (daysUntilExpiry <= 30) {\n return { status: \"Expiring\", daysUntilExpiry, expiryDate };\n }\n\n return activeStatus;\n }\n case \"Inactive\": {\n return { status: \"Inactive\" };\n }\n default:\n connection.state satisfies never;\n throw new TypeError(`Unreachable code: ${connection.state}`);\n }\n}\n\nfunction getIdentityProvider(connectionType: ConnectionType): IdentityProvider {\n switch (connectionType) {\n case \"ADFSSAML\":\n case \"EntraIdOIDC\":\n case \"MicrosoftOAuth\":\n return \"microsoft\";\n case \"Auth0Migration\":\n case \"Auth0SAML\":\n return \"auth0\";\n case \"AzureSAML\":\n return \"azure\";\n case \"CasSAML\":\n return \"cas\";\n case \"ClassLinkSAML\":\n return \"classlink\";\n case \"CloudflareSAML\":\n return \"cloudflare\";\n case \"CyberArkSAML\":\n return \"cyberark\";\n case \"DuoSAML\":\n return \"duo\";\n case \"GenericSAML\":\n return \"generic-saml\";\n case \"GoogleSAML\":\n case \"GoogleOIDC\":\n case \"GoogleOAuth\":\n return \"google\";\n case \"JumpCloudSAML\":\n return \"jumpcloud\";\n case \"KeycloakSAML\":\n return \"keycloak\";\n case \"LastPassSAML\":\n return \"lastpass\";\n case \"MiniOrangeSAML\":\n return \"miniorange\";\n case \"NetIqSAML\":\n return \"net-iq\";\n case \"OktaOIDC\":\n case \"OktaSAML\":\n return \"okta\";\n case \"OneLoginSAML\":\n return \"onelogin\";\n case \"OracleSAML\":\n return \"oracle\";\n case \"PingFederateSAML\":\n case \"PingOneSAML\":\n return \"ping-identity\";\n case \"RipplingSAML\":\n return \"rippling\";\n case \"SalesforceSAML\":\n case \"SalesforceOAuth\":\n return \"salesforce\";\n case \"ShibbolethGenericSAML\":\n case \"ShibbolethSAML\":\n return \"shibboleth\";\n case \"SimpleSamlPhpSAML\":\n return \"simple-saml-php\";\n case \"TestIdp\":\n return \"test-idp\";\n case \"VMwareSAML\":\n return \"vmware\";\n case \"AdpOidc\":\n return \"adp\";\n case \"GenericOIDC\":\n return \"generic-oidc\";\n case \"LoginGovOidc\":\n return \"login-gov\";\n case \"CleverOIDC\":\n return \"clever\";\n case \"AppleOAuth\":\n return \"apple\";\n case \"BitbucketOAuth\":\n return \"bitbucket\";\n case \"DiscordOAuth\":\n return \"discord\";\n case \"GithubOAuth\":\n return \"github\";\n case \"GitLabOAuth\":\n return \"gitlab\";\n case \"IntuitOAuth\":\n return \"intuit\";\n case \"LinkedInOAuth\":\n return \"linkedin\";\n case \"SlackOAuth\":\n return \"slack\";\n case \"VercelOAuth\":\n case \"VercelMarketplaceOAuth\":\n return \"vercel\";\n case \"XeroOAuth\":\n return \"xero\";\n case \"GrokOAuth\":\n case \"XOAuth\":\n case \"MagicLink\":\n return \"workos\";\n default:\n connectionType satisfies never;\n throw new TypeError(`Unreachable code: ${connectionType}`);\n }\n}\n\nexport type {\n AdminPortalSsoConnectionProps,\n AdminPortalSsoConnectionLoadingProps,\n AdminPortalSsoConnectionErrorProps,\n};\nexport {\n AdminPortalSsoConnection,\n AdminPortalSsoConnectionLoading,\n AdminPortalSsoConnectionError,\n};\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"api-provider.d.ts","names":[],"sources":["../../../src/api/api-provider.tsx"],"mappings":";;KAKK;KAeA,4BAA4B;UAEvB;EACR;EACA;;UAGQ;EACR;EACA;EACA;EACA;EACA,YAAY;EACZ,iBAAiB;EACjB,oBAAoB,iBAAiB;;UAG7B;EACR;EACA;EACA;;cAGI,oBAAiB,YAAgB,sCACzB;UAaJ;EACR,WAAW;EACX;EACA,UAAU,MAAM;EAChB,YAAY;;cAGR,aAAa,MAAM,GAAG;cAqHtB,cAAM;cAUN;kBAAA;EA7JiC,oBAAA,iBAAA;;cAmKjC"}
1
+ {"version":3,"file":"api-provider.d.ts","names":[],"sources":["../../../src/api/api-provider.tsx"],"mappings":";;KAOK;KAeA,4BAA4B;UAEvB;EACR;EACA;;UAGQ;EACR;EACA;EACA;EACA;EACA,YAAY;EACZ,iBAAiB;EACjB,oBAAoB,iBAAiB;;UAG7B;EACR;EACA;EACA;;cAGI,oBAAiB,YAAgB,sCACzB;UAaJ;EACR,WAAW;EACX;EACA,UAAU,MAAM;EAChB,YAAY;;cAGR,aAAa,MAAM,GAAG;cAyJtB,cAAM;cAUN;kBAAA;EAjMiC,oBAAA,iBAAA;;cAuMjC"}
@@ -1,5 +1,6 @@
1
1
  import { useIsHydrated } from "../lib/use-is-hydrated.js";
2
2
  import { getClaims } from "./claims.js";
3
+ import { isClientGraphqlQueryKey } from "./client-graphql/query-keys.js";
3
4
  import { useQuery, useQueryClient } from "@tanstack/react-query";
4
5
  import * as React from "react";
5
6
  import { jsx } from "react/jsx-runtime";
@@ -11,6 +12,7 @@ const ApiContext = React.createContext(void 0);
11
12
  ApiContext.displayName = "ApiContext";
12
13
  const ApiProvider = ({ authToken, baseUrl, children, widgetType }) => {
13
14
  const queryClient = useQueryClient();
15
+ const queryKey = authTokenQueryKey(widgetType);
14
16
  const authTokenQuery = useQuery({
15
17
  initialData: () => {
16
18
  if (typeof authToken !== "string") return;
@@ -30,8 +32,25 @@ const ApiProvider = ({ authToken, baseUrl, children, widgetType }) => {
30
32
  exp: claims.exp
31
33
  };
32
34
  },
33
- queryKey: authTokenQueryKey(widgetType)
35
+ queryKey
34
36
  });
37
+ React.useEffect(() => {
38
+ if (typeof authToken !== "string") return;
39
+ const cached = queryClient.getQueryData(queryKey);
40
+ if (cached?.authToken === authToken) return;
41
+ queryClient.cancelQueries({ queryKey });
42
+ const claims = getClaims(authToken);
43
+ queryClient.setQueryData(queryKey, {
44
+ authToken,
45
+ permissions: claims.permissions,
46
+ exp: claims.exp
47
+ });
48
+ if (cached && !isSameSubject(getClaims(cached.authToken), claims)) queryClient.invalidateQueries({ predicate: (query) => isClientGraphqlQueryKey(query.queryKey) });
49
+ }, [
50
+ authToken,
51
+ queryClient,
52
+ queryKey
53
+ ]);
35
54
  const exp = authTokenQuery.data?.exp;
36
55
  React.useEffect(() => {
37
56
  if (!exp) return;
@@ -80,6 +99,9 @@ const ApiProvider = ({ authToken, baseUrl, children, widgetType }) => {
80
99
  children
81
100
  });
82
101
  };
102
+ function isSameSubject(a, b) {
103
+ return a.sid === b.sid && a.sub === b.sub && a.org_id === b.org_id;
104
+ }
83
105
  const useApi = () => {
84
106
  const context = React.useContext(ApiContext);
85
107
  if (context === void 0) throw new Error("useApi must be used within an ApiProvider");
@@ -1 +1 @@
1
- {"version":3,"file":"api-provider.js","names":[],"sources":["../../../src/api/api-provider.tsx"],"sourcesContent":["import { useQuery, useQueryClient } from \"@tanstack/react-query\";\nimport * as React from \"react\";\nimport { useIsHydrated } from \"../lib/use-is-hydrated.js\";\nimport { getClaims } from \"./claims.js\";\n\ntype WidgetType =\n | \"admin-portal-audit-log-streaming\"\n | \"admin-portal-domain-verification\"\n | \"user-management\"\n | \"user-api-keys\"\n | \"organization-switcher\"\n | \"user-sessions\"\n | \"user-security\"\n | \"user-profile\"\n | \"admin-portal-sso-connection\"\n | \"api-keys\"\n | \"pipes\"\n | \"pipes-admin\"\n | \"directory-sync\";\n\ntype AuthToken = string | (() => Promise<string>);\n\ninterface ElevatedAccess {\n token: string;\n expiresAt: string;\n}\n\ninterface ApiContextValue {\n authToken: string | undefined;\n permissions: string[] | undefined;\n exp: number | undefined;\n baseUrl: string;\n widgetType: WidgetType;\n elevatedAccess?: ElevatedAccess;\n setElevatedAccess: (elevatedAccess?: ElevatedAccess) => void;\n}\n\ninterface AuthTokenQueryData {\n authToken: string;\n permissions: string[] | undefined;\n exp: number | undefined;\n}\n\nconst authTokenQueryKey = (widgetType: WidgetType) =>\n [\"authToken\", widgetType] as const;\n\n// Refetch this many ms before the JWT expires so data queries always see a\n// fresh token.\nconst TOKEN_REFRESH_BUFFER_MS = 30_000;\n\n// Cap setTimeout delays at ~24 days to stay well below the 32-bit signed int\n// limit (~24.8 days), which some runtimes silently coerce to 1ms.\nconst MAX_TIMEOUT_MS = 2_147_483_000;\n\nconst ApiContext = React.createContext<ApiContextValue | undefined>(undefined);\nApiContext.displayName = \"ApiContext\";\n\ninterface ApiProviderProps {\n authToken: AuthToken;\n baseUrl: string;\n children: React.ReactNode;\n widgetType: WidgetType;\n}\n\nconst ApiProvider: React.FC<ApiProviderProps> = ({\n authToken,\n baseUrl,\n children,\n widgetType,\n}) => {\n const queryClient = useQueryClient();\n const authTokenQuery = useQuery<AuthTokenQueryData>({\n initialData: () => {\n if (typeof authToken !== \"string\") {\n return undefined;\n }\n\n const claims = getClaims(authToken);\n return {\n authToken,\n permissions: claims.permissions,\n exp: claims.exp,\n };\n },\n queryFn: async () => {\n const resolvedToken =\n typeof authToken === \"string\" ? authToken : await authToken();\n const claims = getClaims(resolvedToken);\n\n return {\n authToken: resolvedToken,\n permissions: claims.permissions,\n exp: claims.exp,\n };\n },\n queryKey: authTokenQueryKey(widgetType),\n });\n\n // Keep the token \"fresh\" until ~30s before it expires, so window-focus\n // re-fetches re-mint before data queries use a stale Bearer.\n //\n // TODO(v2): prefer the function-form `staleTime` on `useQuery` above once we\n // can bump the `@tanstack/react-query` peer dep to ^5.44.0 (the version that\n // introduced it). That lets react-query own the freshness window and avoids\n // the extra timer + window-focus nonsense this effect introduces.\n const exp = authTokenQuery.data?.exp;\n React.useEffect(() => {\n if (!exp) {\n return;\n }\n\n const delay = Math.min(\n MAX_TIMEOUT_MS,\n exp * 1000 - Date.now() - TOKEN_REFRESH_BUFFER_MS,\n );\n if (delay <= 0) {\n void queryClient.refetchQueries({\n queryKey: authTokenQueryKey(widgetType),\n });\n return;\n }\n const timeout = window.setTimeout(() => {\n void queryClient.refetchQueries({\n queryKey: authTokenQueryKey(widgetType),\n });\n }, delay);\n return () => window.clearTimeout(timeout);\n }, [exp, queryClient, widgetType]);\n\n const [elevatedAccess, setElevatedAccess] = React.useState<ElevatedAccess>();\n const elevatedAccessTimeout = React.useRef<number | undefined>(undefined);\n\n // This effect manages the expiration of elevated access tokens\n // When an elevated access token is present, it checks every 30 seconds if the token has expired\n // If the token has expired (current time > expiration time), it clears the elevated access\n React.useEffect(() => {\n if (elevatedAccessTimeout.current) {\n window.clearInterval(elevatedAccessTimeout.current);\n }\n\n if (elevatedAccess) {\n elevatedAccessTimeout.current = window.setInterval(() => {\n const now = new Date();\n const expiresAtDate = new Date(elevatedAccess.expiresAt);\n\n // Reset the elevated access if it has expired\n if (now > expiresAtDate) {\n setElevatedAccess(undefined);\n }\n }, 30_000); // every 30 seconds\n }\n\n return () => {\n if (elevatedAccessTimeout.current) {\n window.clearInterval(elevatedAccessTimeout.current);\n }\n };\n }, [elevatedAccess]);\n\n const value = React.useMemo(\n () => ({\n authToken: authTokenQuery.data?.authToken,\n permissions: authTokenQuery.data?.permissions,\n exp: authTokenQuery.data?.exp,\n baseUrl,\n elevatedAccess,\n setElevatedAccess,\n widgetType,\n }),\n [\n authTokenQuery.data,\n baseUrl,\n elevatedAccess,\n setElevatedAccess,\n widgetType,\n ],\n );\n\n return <ApiContext.Provider value={value}>{children}</ApiContext.Provider>;\n};\n\nconst useApi = () => {\n const context = React.useContext(ApiContext);\n\n if (context === undefined) {\n throw new Error(\"useApi must be used within an ApiProvider\");\n }\n\n return context;\n};\n\nconst useElevatedAccessToken = () => {\n const { elevatedAccess, setElevatedAccess } = useApi();\n\n return { elevatedAccess, setElevatedAccess };\n};\n\nconst useApiReady = () => {\n const { authToken } = useApi();\n const isHydrated = useIsHydrated();\n\n return isHydrated && authToken !== undefined;\n};\nexport type { WidgetType, AuthToken, AuthTokenQueryData };\nexport {\n authTokenQueryKey,\n ApiProvider,\n useApi,\n useElevatedAccessToken,\n useApiReady,\n};\n"],"mappings":";;;;;;AA2CA,MAAM,qBAAqB,eACzB,CAAC,aAAa,UAAU;AAI1B,MAAM,0BAA0B;AAIhC,MAAM,iBAAiB;AAEvB,MAAM,aAAa,MAAM,cAA2C,MAAS;AAC7E,WAAW,cAAc;AASzB,MAAM,eAA2C,EAC/C,WACA,SACA,UACA,iBACI;CACJ,MAAM,cAAc,eAAe;CACnC,MAAM,iBAAiB,SAA6B;EAClD,mBAAmB;GACjB,IAAI,OAAO,cAAc,UACvB;GAGF,MAAM,SAAS,UAAU,SAAS;GAClC,OAAO;IACL;IACA,aAAa,OAAO;IACpB,KAAK,OAAO;GACd;EACF;EACA,SAAS,YAAY;GACnB,MAAM,gBACJ,OAAO,cAAc,WAAW,YAAY,MAAM,UAAU;GAC9D,MAAM,SAAS,UAAU,aAAa;GAEtC,OAAO;IACL,WAAW;IACX,aAAa,OAAO;IACpB,KAAK,OAAO;GACd;EACF;EACA,UAAU,kBAAkB,UAAU;CACxC,CAAC;CASD,MAAM,MAAM,eAAe,MAAM;CACjC,MAAM,gBAAgB;EACpB,IAAI,CAAC,KACH;EAGF,MAAM,QAAQ,KAAK,IACjB,gBACA,MAAM,MAAO,KAAK,IAAI,IAAI,uBAC5B;EACA,IAAI,SAAS,GAAG;GACd,AAAK,YAAY,eAAe,EAC9B,UAAU,kBAAkB,UAAU,EACxC,CAAC;GACD;EACF;EACA,MAAM,UAAU,OAAO,iBAAiB;GACtC,AAAK,YAAY,eAAe,EAC9B,UAAU,kBAAkB,UAAU,EACxC,CAAC;EACH,GAAG,KAAK;EACR,aAAa,OAAO,aAAa,OAAO;CAC1C,GAAG;EAAC;EAAK;EAAa;CAAU,CAAC;CAEjC,MAAM,CAAC,gBAAgB,qBAAqB,MAAM,SAAyB;CAC3E,MAAM,wBAAwB,MAAM,OAA2B,MAAS;CAKxE,MAAM,gBAAgB;EACpB,IAAI,sBAAsB,SACxB,OAAO,cAAc,sBAAsB,OAAO;EAGpD,IAAI,gBACF,sBAAsB,UAAU,OAAO,kBAAkB;GAKvD,oBAAI,IAJY,KAIZ,IAAM,IAHgB,KAAK,eAAe,SAGpC,GACR,kBAAkB,MAAS;EAE/B,GAAG,GAAM;EAGX,aAAa;GACX,IAAI,sBAAsB,SACxB,OAAO,cAAc,sBAAsB,OAAO;EAEtD;CACF,GAAG,CAAC,cAAc,CAAC;CAEnB,MAAM,QAAQ,MAAM,eACX;EACL,WAAW,eAAe,MAAM;EAChC,aAAa,eAAe,MAAM;EAClC,KAAK,eAAe,MAAM;EAC1B;EACA;EACA;EACA;CACF,IACA;EACE,eAAe;EACf;EACA;EACA;EACA;CACF,CACF;CAEA,OAAO,oBAAC,WAAW,UAAZ;EAA4B;EAAQ;CAA8B,CAAA;AAC3E;AAEA,MAAM,eAAe;CACnB,MAAM,UAAU,MAAM,WAAW,UAAU;CAE3C,IAAI,YAAY,QACd,MAAM,IAAI,MAAM,2CAA2C;CAG7D,OAAO;AACT;AAEA,MAAM,+BAA+B;CACnC,MAAM,EAAE,gBAAgB,sBAAsB,OAAO;CAErD,OAAO;EAAE;EAAgB;CAAkB;AAC7C;AAEA,MAAM,oBAAoB;CACxB,MAAM,EAAE,cAAc,OAAO;CAG7B,OAFmB,cAEZ,KAAc,cAAc;AACrC"}
1
+ {"version":3,"file":"api-provider.js","names":[],"sources":["../../../src/api/api-provider.tsx"],"sourcesContent":["import { useQuery, useQueryClient } from \"@tanstack/react-query\";\nimport * as React from \"react\";\nimport { useIsHydrated } from \"../lib/use-is-hydrated.js\";\nimport { getClaims } from \"./claims.js\";\nimport type { Claims } from \"./claims.js\";\nimport { isClientGraphqlQueryKey } from \"./client-graphql/query-keys.js\";\n\ntype WidgetType =\n | \"admin-portal-audit-log-streaming\"\n | \"admin-portal-domain-verification\"\n | \"user-management\"\n | \"user-api-keys\"\n | \"organization-switcher\"\n | \"user-sessions\"\n | \"user-security\"\n | \"user-profile\"\n | \"admin-portal-sso-connection\"\n | \"api-keys\"\n | \"pipes\"\n | \"pipes-admin\"\n | \"directory-sync\";\n\ntype AuthToken = string | (() => Promise<string>);\n\ninterface ElevatedAccess {\n token: string;\n expiresAt: string;\n}\n\ninterface ApiContextValue {\n authToken: string | undefined;\n permissions: string[] | undefined;\n exp: number | undefined;\n baseUrl: string;\n widgetType: WidgetType;\n elevatedAccess?: ElevatedAccess;\n setElevatedAccess: (elevatedAccess?: ElevatedAccess) => void;\n}\n\ninterface AuthTokenQueryData {\n authToken: string;\n permissions: string[] | undefined;\n exp: number | undefined;\n}\n\nconst authTokenQueryKey = (widgetType: WidgetType) =>\n [\"authToken\", widgetType] as const;\n\n// Refetch this many ms before the JWT expires so data queries always see a\n// fresh token.\nconst TOKEN_REFRESH_BUFFER_MS = 30_000;\n\n// Cap setTimeout delays at ~24 days to stay well below the 32-bit signed int\n// limit (~24.8 days), which some runtimes silently coerce to 1ms.\nconst MAX_TIMEOUT_MS = 2_147_483_000;\n\nconst ApiContext = React.createContext<ApiContextValue | undefined>(undefined);\nApiContext.displayName = \"ApiContext\";\n\ninterface ApiProviderProps {\n authToken: AuthToken;\n baseUrl: string;\n children: React.ReactNode;\n widgetType: WidgetType;\n}\n\nconst ApiProvider: React.FC<ApiProviderProps> = ({\n authToken,\n baseUrl,\n children,\n widgetType,\n}) => {\n const queryClient = useQueryClient();\n const queryKey = authTokenQueryKey(widgetType);\n const authTokenQuery = useQuery<AuthTokenQueryData>({\n initialData: () => {\n if (typeof authToken !== \"string\") {\n return undefined;\n }\n\n const claims = getClaims(authToken);\n return {\n authToken,\n permissions: claims.permissions,\n exp: claims.exp,\n };\n },\n queryFn: async () => {\n const resolvedToken =\n typeof authToken === \"string\" ? authToken : await authToken();\n const claims = getClaims(resolvedToken);\n\n return {\n authToken: resolvedToken,\n permissions: claims.permissions,\n exp: claims.exp,\n };\n },\n queryKey,\n });\n\n // `initialData` only seeds the cache on first mount, so a new string token\n // has to be written to the cache explicitly. A token for a different session,\n // user or organization (e.g. after switching organizations) also invalidates\n // data fetched with the previous token.\n React.useEffect(() => {\n if (typeof authToken !== \"string\") {\n return;\n }\n\n const cached = queryClient.getQueryData<AuthTokenQueryData>(queryKey);\n if (cached?.authToken === authToken) {\n return;\n }\n\n // Keep an in-flight fetch holding the previous token from overwriting the\n // new one.\n void queryClient.cancelQueries({ queryKey });\n const claims = getClaims(authToken);\n queryClient.setQueryData<AuthTokenQueryData>(queryKey, {\n authToken,\n permissions: claims.permissions,\n exp: claims.exp,\n });\n\n if (cached && !isSameSubject(getClaims(cached.authToken), claims)) {\n void queryClient.invalidateQueries({\n predicate: (query) => isClientGraphqlQueryKey(query.queryKey),\n });\n }\n }, [authToken, queryClient, queryKey]);\n\n // Keep the token \"fresh\" until ~30s before it expires, so window-focus\n // re-fetches re-mint before data queries use a stale Bearer.\n //\n // TODO(v2): prefer the function-form `staleTime` on `useQuery` above once we\n // can bump the `@tanstack/react-query` peer dep to ^5.44.0 (the version that\n // introduced it). That lets react-query own the freshness window and avoids\n // the extra timer + window-focus nonsense this effect introduces.\n const exp = authTokenQuery.data?.exp;\n React.useEffect(() => {\n if (!exp) {\n return;\n }\n\n const delay = Math.min(\n MAX_TIMEOUT_MS,\n exp * 1000 - Date.now() - TOKEN_REFRESH_BUFFER_MS,\n );\n if (delay <= 0) {\n void queryClient.refetchQueries({\n queryKey: authTokenQueryKey(widgetType),\n });\n return;\n }\n const timeout = window.setTimeout(() => {\n void queryClient.refetchQueries({\n queryKey: authTokenQueryKey(widgetType),\n });\n }, delay);\n return () => window.clearTimeout(timeout);\n }, [exp, queryClient, widgetType]);\n\n const [elevatedAccess, setElevatedAccess] = React.useState<ElevatedAccess>();\n const elevatedAccessTimeout = React.useRef<number | undefined>(undefined);\n\n // This effect manages the expiration of elevated access tokens\n // When an elevated access token is present, it checks every 30 seconds if the token has expired\n // If the token has expired (current time > expiration time), it clears the elevated access\n React.useEffect(() => {\n if (elevatedAccessTimeout.current) {\n window.clearInterval(elevatedAccessTimeout.current);\n }\n\n if (elevatedAccess) {\n elevatedAccessTimeout.current = window.setInterval(() => {\n const now = new Date();\n const expiresAtDate = new Date(elevatedAccess.expiresAt);\n\n // Reset the elevated access if it has expired\n if (now > expiresAtDate) {\n setElevatedAccess(undefined);\n }\n }, 30_000); // every 30 seconds\n }\n\n return () => {\n if (elevatedAccessTimeout.current) {\n window.clearInterval(elevatedAccessTimeout.current);\n }\n };\n }, [elevatedAccess]);\n\n const value = React.useMemo(\n () => ({\n authToken: authTokenQuery.data?.authToken,\n permissions: authTokenQuery.data?.permissions,\n exp: authTokenQuery.data?.exp,\n baseUrl,\n elevatedAccess,\n setElevatedAccess,\n widgetType,\n }),\n [\n authTokenQuery.data,\n baseUrl,\n elevatedAccess,\n setElevatedAccess,\n widgetType,\n ],\n );\n\n return <ApiContext.Provider value={value}>{children}</ApiContext.Provider>;\n};\n\nfunction isSameSubject(a: Claims, b: Claims) {\n return a.sid === b.sid && a.sub === b.sub && a.org_id === b.org_id;\n}\n\nconst useApi = () => {\n const context = React.useContext(ApiContext);\n\n if (context === undefined) {\n throw new Error(\"useApi must be used within an ApiProvider\");\n }\n\n return context;\n};\n\nconst useElevatedAccessToken = () => {\n const { elevatedAccess, setElevatedAccess } = useApi();\n\n return { elevatedAccess, setElevatedAccess };\n};\n\nconst useApiReady = () => {\n const { authToken } = useApi();\n const isHydrated = useIsHydrated();\n\n return isHydrated && authToken !== undefined;\n};\nexport type { WidgetType, AuthToken, AuthTokenQueryData };\nexport {\n authTokenQueryKey,\n ApiProvider,\n useApi,\n useElevatedAccessToken,\n useApiReady,\n};\n"],"mappings":"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"}
@@ -1,9 +1,10 @@
1
1
  //#region src/api/claims.d.ts
2
- interface Claims {
2
+ export interface Claims {
3
3
  sid?: string;
4
4
  sub?: string;
5
5
  sub_type?: string;
6
6
  sub_profile?: string;
7
+ org_id?: string;
7
8
  auth_time?: number;
8
9
  permissions?: string[];
9
10
  exp?: number;
@@ -1 +1 @@
1
- {"version":3,"file":"claims.d.ts","names":[],"sources":["../../../src/api/claims.ts"],"mappings":";UAAU;EACR;EACA;EACA;EACA;EACA;EACA;EACA;;wBAGc,uBAAuB,QAAQ;wBAa/B,UAAU,sBAAsB"}
1
+ {"version":3,"file":"claims.d.ts","names":[],"sources":["../../../src/api/claims.ts"],"mappings":";iBAAiB;EACf;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;wBAGc,uBAAuB,QAAQ;wBAa/B,UAAU,sBAAsB"}
@@ -1 +1 @@
1
- {"version":3,"file":"claims.js","names":[],"sources":["../../../src/api/claims.ts"],"sourcesContent":["interface Claims {\n sid?: string;\n sub?: string;\n sub_type?: string;\n sub_profile?: string;\n auth_time?: number;\n permissions?: string[];\n exp?: number;\n}\n\nexport function getAuthenticatedUserId(claims: Claims): string | undefined {\n const isUserSession =\n (claims.sub_profile === undefined || claims.sub_profile === \"user\") &&\n (claims.sub_type === \"authkit\" ||\n (claims.sub_type === undefined &&\n !!claims.sid &&\n typeof claims.auth_time === \"number\"));\n\n return isUserSession && claims.sub?.startsWith(\"user_\")\n ? claims.sub\n : undefined;\n}\n\nexport function getClaims(accessToken: string): Claims {\n return JSON.parse(atob(accessToken.split(\".\")[1]));\n}\n"],"mappings":";AAUA,SAAgB,uBAAuB,QAAoC;CAQzE,QANG,OAAO,gBAAgB,UAAa,OAAO,gBAAgB,YAC3D,OAAO,aAAa,aAClB,OAAO,aAAa,UACnB,CAAC,CAAC,OAAO,OACT,OAAO,OAAO,cAAc,aAEV,OAAO,KAAK,WAAW,OAAO,IAClD,OAAO,MACP;AACN;AAEA,SAAgB,UAAU,aAA6B;CACrD,OAAO,KAAK,MAAM,KAAK,YAAY,MAAM,GAAG,CAAC,CAAC,EAAE,CAAC;AACnD"}
1
+ {"version":3,"file":"claims.js","names":[],"sources":["../../../src/api/claims.ts"],"sourcesContent":["export interface Claims {\n sid?: string;\n sub?: string;\n sub_type?: string;\n sub_profile?: string;\n org_id?: string;\n auth_time?: number;\n permissions?: string[];\n exp?: number;\n}\n\nexport function getAuthenticatedUserId(claims: Claims): string | undefined {\n const isUserSession =\n (claims.sub_profile === undefined || claims.sub_profile === \"user\") &&\n (claims.sub_type === \"authkit\" ||\n (claims.sub_type === undefined &&\n !!claims.sid &&\n typeof claims.auth_time === \"number\"));\n\n return isUserSession && claims.sub?.startsWith(\"user_\")\n ? claims.sub\n : undefined;\n}\n\nexport function getClaims(accessToken: string): Claims {\n return JSON.parse(atob(accessToken.split(\".\")[1]));\n}\n"],"mappings":";AAWA,SAAgB,uBAAuB,QAAoC;CAQzE,QANG,OAAO,gBAAgB,UAAa,OAAO,gBAAgB,YAC3D,OAAO,aAAa,aAClB,OAAO,aAAa,UACnB,CAAC,CAAC,OAAO,OACT,OAAO,OAAO,cAAc,aAEV,OAAO,KAAK,WAAW,OAAO,IAClD,OAAO,MACP;AACN;AAEA,SAAgB,UAAU,aAA6B;CACrD,OAAO,KAAK,MAAM,KAAK,YAAY,MAAM,GAAG,CAAC,CAAC,EAAE,CAAC;AACnD"}
@@ -97,8 +97,9 @@ function createClientSdk(client, args) {
97
97
  const { authToken, widgetType, queryClient } = args;
98
98
  return getSdk(client, async (action, _operationName, operationType, _variables) => {
99
99
  const queryType = operationType === "mutation" ? "mutation" : "query";
100
+ const token = queryClient.getQueryData(authTokenQueryKey(widgetType))?.authToken ?? authToken;
100
101
  try {
101
- return await action(buildHeaders(authToken, widgetType));
102
+ return await action(buildHeaders(token, widgetType));
102
103
  } catch (error) {
103
104
  let finalError = error;
104
105
  if (error instanceof ClientError && isAuthError(error)) {
@@ -111,7 +112,7 @@ function createClientSdk(client, args) {
111
112
  refetchError
112
113
  } });
113
114
  }
114
- if (freshToken && freshToken !== authToken) try {
115
+ if (freshToken && freshToken !== token) try {
115
116
  return await action(buildHeaders(freshToken, widgetType));
116
117
  } catch (retryError) {
117
118
  finalError = retryError;
@@ -1 +1 @@
1
- {"version":3,"file":"client.js","names":[],"sources":["../../../../src/api/client-graphql/client.ts"],"sourcesContent":["import type { QueryClient } from \"@tanstack/react-query\";\nimport { useQueryClient } from \"@tanstack/react-query\";\nimport { ClientError, GraphQLClient } from \"graphql-request\";\nimport * as React from \"react\";\nimport {\n ExpiredTokenError,\n IncorrectPermissionsError,\n} from \"../../lib/errors.js\";\nimport type { AuthTokenQueryData, WidgetType } from \"../api-provider.js\";\nimport { authTokenQueryKey, useApi } from \"../api-provider.js\";\nimport { WIDGETS_API_VERSION } from \"../constants.js\";\nimport { ApiError, FetchError } from \"../errors.js\";\nimport { CLIENT_API_GRAPHQL_PATH } from \"./constants.js\";\nimport type { Sdk } from \"./generated.js\";\nimport { getSdk } from \"./generated.js\";\n\ntype QueryType = \"query\" | \"mutation\";\n\n/**\n * A GraphQL request failed because the request was unauthenticated or the token\n * no longer carries the required permissions.\n *\n * Both surface as an HTTP 200 whose `errors[].extensions.code` is\n * `\"UNAUTHENTICATED\"` (token rejected by the auth guard) or `\"FORBIDDEN\"`\n * (permission denied). The HTTP-status check is only a safety net for\n * transport-level rejections (proxies, gateways) that never reach GraphQL.\n */\nfunction isAuthError(error: ClientError): boolean {\n const status = error.response.status;\n if (status === 401 || status === 403) {\n return true;\n }\n\n return (error.response.errors ?? []).some((graphQlError) => {\n const code = graphQlError.extensions?.code;\n return code === \"UNAUTHENTICATED\" || code === \"FORBIDDEN\";\n });\n}\n\n/**\n * The Client API returns GraphQL-level errors (validation, not-found, etc.) as\n * an HTTP 200 with an `errors` array. Surfacing that raw `200` on an `ApiError`\n * is misleading for downstream consumers and telemetry, so normalize any\n * non-error HTTP status to a 500.\n */\nfunction normalizeErrorStatus(status: number): number {\n return status >= 400 ? status : 500;\n}\n\n/**\n * Translate a graphql-request failure into the same error classes the REST\n * Widgets client throws, so presentational components and error boundaries can\n * handle both transports uniformly.\n */\nfunction toWidgetError(\n error: unknown,\n queryType: QueryType,\n isExpiredToken: boolean,\n): Error {\n if (error instanceof ClientError) {\n if (isAuthError(error)) {\n const context = { status: error.response.status, queryType } as const;\n return isExpiredToken\n ? new ExpiredTokenError({ context })\n : new IncorrectPermissionsError({ context });\n }\n\n const firstError = error.response.errors?.[0];\n return new ApiError({\n message: firstError?.message ?? error.message,\n status: normalizeErrorStatus(error.response.status),\n queryType,\n context: { errors: error.response.errors },\n });\n }\n\n return new FetchError({\n message: error instanceof Error ? error.message : \"GraphQL request failed\",\n queryType,\n context: { error },\n });\n}\n\n/**\n * Returns a typed SDK for the WorkOS Client GraphQL API, wired up to the same\n * `ApiProvider` auth plumbing the REST Widgets client uses:\n *\n * - Sends the current bearer token plus the widget-type / version headers.\n * - On an auth failure, re-mints the token via the shared `authToken` query and\n * retries the operation once (mirrors the REST client's 403 retry).\n * - Maps GraphQL/network failures onto the widget error classes.\n *\n * Elevated-access tokens are intentionally not attached here; the Client API\n * takes them as mutation input fields, so call sites read them from\n * `useElevatedAccessToken` and pass them through the relevant inputs.\n */\nexport function useClientGraphql(): Sdk {\n const { authToken, baseUrl, widgetType } = useApi();\n const queryClient = useQueryClient();\n\n return React.useMemo(() => {\n const endpoint = new URL(baseUrl);\n endpoint.pathname = CLIENT_API_GRAPHQL_PATH;\n const client = new GraphQLClient(endpoint.toString());\n return createClientSdk(client, { authToken, widgetType, queryClient });\n }, [authToken, baseUrl, widgetType, queryClient]);\n}\n\nfunction createClientSdk(\n client: GraphQLClient,\n args: {\n authToken: string | undefined;\n widgetType: WidgetType;\n queryClient: QueryClient;\n },\n) {\n const { authToken, widgetType, queryClient } = args;\n return getSdk(\n client,\n async (action, _operationName, operationType, _variables) => {\n const queryType: QueryType =\n operationType === \"mutation\" ? \"mutation\" : \"query\";\n\n try {\n return await action(buildHeaders(authToken, widgetType));\n } catch (error) {\n let finalError: unknown = error;\n if (error instanceof ClientError && isAuthError(error)) {\n let freshToken: string | undefined;\n try {\n freshToken = await refetchToken(queryClient, widgetType);\n } catch (refetchError) {\n throw new ExpiredTokenError({\n context: { queryType, refetchError },\n });\n }\n\n if (freshToken && freshToken !== authToken) {\n try {\n return await action(buildHeaders(freshToken, widgetType));\n } catch (retryError) {\n finalError = retryError;\n }\n }\n }\n\n throw toWidgetError(\n finalError,\n queryType,\n isTokenExpired(queryClient, widgetType),\n );\n }\n },\n );\n}\n\nfunction buildHeaders(\n token: string | undefined,\n widgetType: WidgetType,\n): Record<string, string> {\n const headers: Record<string, string> = {\n \"WorkOS-Widgets-Version\": WIDGETS_API_VERSION,\n \"WorkOS-Widgets-Type\": widgetType,\n };\n if (token) {\n headers.Authorization = `Bearer ${token}`;\n }\n return headers;\n}\n\nasync function refetchToken(\n queryClient: QueryClient,\n widgetType: WidgetType,\n): Promise<string | undefined> {\n const tokenQueryKey = authTokenQueryKey(widgetType);\n await queryClient.refetchQueries({ queryKey: tokenQueryKey });\n const refreshed = queryClient.getQueryData<AuthTokenQueryData>(tokenQueryKey);\n return refreshed?.authToken;\n}\n\nfunction isTokenExpired(\n queryClient: QueryClient,\n widgetType: WidgetType,\n): boolean {\n const refreshed = queryClient.getQueryData<AuthTokenQueryData>(\n authTokenQueryKey(widgetType),\n );\n const exp = refreshed?.exp;\n return exp !== undefined && exp * 1000 <= Date.now();\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;AA2BA,SAAS,YAAY,OAA6B;CAChD,MAAM,SAAS,MAAM,SAAS;CAC9B,IAAI,WAAW,OAAO,WAAW,KAC/B,OAAO;CAGT,QAAQ,MAAM,SAAS,UAAU,CAAC,EAAA,CAAG,MAAM,iBAAiB;EAC1D,MAAM,OAAO,aAAa,YAAY;EACtC,OAAO,SAAS,qBAAqB,SAAS;CAChD,CAAC;AACH;;;;;;;AAQA,SAAS,qBAAqB,QAAwB;CACpD,OAAO,UAAU,MAAM,SAAS;AAClC;;;;;;AAOA,SAAS,cACP,OACA,WACA,gBACO;CACP,IAAI,iBAAiB,aAAa;EAChC,IAAI,YAAY,KAAK,GAAG;GACtB,MAAM,UAAU;IAAE,QAAQ,MAAM,SAAS;IAAQ;GAAU;GAC3D,OAAO,iBACH,IAAI,kBAAkB,EAAE,QAAQ,CAAC,IACjC,IAAI,0BAA0B,EAAE,QAAQ,CAAC;EAC/C;EAEA,MAAM,aAAa,MAAM,SAAS,SAAS;EAC3C,OAAO,IAAI,SAAS;GAClB,SAAS,YAAY,WAAW,MAAM;GACtC,QAAQ,qBAAqB,MAAM,SAAS,MAAM;GAClD;GACA,SAAS,EAAE,QAAQ,MAAM,SAAS,OAAO;EAC3C,CAAC;CACH;CAEA,OAAO,IAAI,WAAW;EACpB,SAAS,iBAAiB,QAAQ,MAAM,UAAU;EAClD;EACA,SAAS,EAAE,MAAM;CACnB,CAAC;AACH;;;;;;;;;;;;;;AAeA,SAAgB,mBAAwB;CACtC,MAAM,EAAE,WAAW,SAAS,eAAe,OAAO;CAClD,MAAM,cAAc,eAAe;CAEnC,OAAO,MAAM,cAAc;EACzB,MAAM,WAAW,IAAI,IAAI,OAAO;EAChC,SAAS,WAAW;EAEpB,OAAO,gBAAgB,IADJ,cAAc,SAAS,SAAS,CAC5B,GAAQ;GAAE;GAAW;GAAY;EAAY,CAAC;CACvE,GAAG;EAAC;EAAW;EAAS;EAAY;CAAW,CAAC;AAClD;AAEA,SAAS,gBACP,QACA,MAKA;CACA,MAAM,EAAE,WAAW,YAAY,gBAAgB;CAC/C,OAAO,OACL,QACA,OAAO,QAAQ,gBAAgB,eAAe,eAAe;EAC3D,MAAM,YACJ,kBAAkB,aAAa,aAAa;EAE9C,IAAI;GACF,OAAO,MAAM,OAAO,aAAa,WAAW,UAAU,CAAC;EACzD,SAAS,OAAO;GACd,IAAI,aAAsB;GAC1B,IAAI,iBAAiB,eAAe,YAAY,KAAK,GAAG;IACtD,IAAI;IACJ,IAAI;KACF,aAAa,MAAM,aAAa,aAAa,UAAU;IACzD,SAAS,cAAc;KACrB,MAAM,IAAI,kBAAkB,EAC1B,SAAS;MAAE;MAAW;KAAa,EACrC,CAAC;IACH;IAEA,IAAI,cAAc,eAAe,WAC/B,IAAI;KACF,OAAO,MAAM,OAAO,aAAa,YAAY,UAAU,CAAC;IAC1D,SAAS,YAAY;KACnB,aAAa;IACf;GAEJ;GAEA,MAAM,cACJ,YACA,WACA,eAAe,aAAa,UAAU,CACxC;EACF;CACF,CACF;AACF;AAEA,SAAS,aACP,OACA,YACwB;CACxB,MAAM,UAAkC;EACtC,0BAAA;EACA,uBAAuB;CACzB;CACA,IAAI,OACF,QAAQ,gBAAgB,UAAU;CAEpC,OAAO;AACT;AAEA,eAAe,aACb,aACA,YAC6B;CAC7B,MAAM,gBAAgB,kBAAkB,UAAU;CAClD,MAAM,YAAY,eAAe,EAAE,UAAU,cAAc,CAAC;CAE5D,OADkB,YAAY,aAAiC,aACxD,CAAA,EAAW;AACpB;AAEA,SAAS,eACP,aACA,YACS;CAIT,MAAM,MAHY,YAAY,aAC5B,kBAAkB,UAAU,CAElB,CAAA,EAAW;CACvB,OAAO,QAAQ,UAAa,MAAM,OAAQ,KAAK,IAAI;AACrD"}
1
+ {"version":3,"file":"client.js","names":[],"sources":["../../../../src/api/client-graphql/client.ts"],"sourcesContent":["import type { QueryClient } from \"@tanstack/react-query\";\nimport { useQueryClient } from \"@tanstack/react-query\";\nimport { ClientError, GraphQLClient } from \"graphql-request\";\nimport * as React from \"react\";\nimport {\n ExpiredTokenError,\n IncorrectPermissionsError,\n} from \"../../lib/errors.js\";\nimport type { AuthTokenQueryData, WidgetType } from \"../api-provider.js\";\nimport { authTokenQueryKey, useApi } from \"../api-provider.js\";\nimport { WIDGETS_API_VERSION } from \"../constants.js\";\nimport { ApiError, FetchError } from \"../errors.js\";\nimport { CLIENT_API_GRAPHQL_PATH } from \"./constants.js\";\nimport type { Sdk } from \"./generated.js\";\nimport { getSdk } from \"./generated.js\";\n\ntype QueryType = \"query\" | \"mutation\";\n\n/**\n * A GraphQL request failed because the request was unauthenticated or the token\n * no longer carries the required permissions.\n *\n * Both surface as an HTTP 200 whose `errors[].extensions.code` is\n * `\"UNAUTHENTICATED\"` (token rejected by the auth guard) or `\"FORBIDDEN\"`\n * (permission denied). The HTTP-status check is only a safety net for\n * transport-level rejections (proxies, gateways) that never reach GraphQL.\n */\nfunction isAuthError(error: ClientError): boolean {\n const status = error.response.status;\n if (status === 401 || status === 403) {\n return true;\n }\n\n return (error.response.errors ?? []).some((graphQlError) => {\n const code = graphQlError.extensions?.code;\n return code === \"UNAUTHENTICATED\" || code === \"FORBIDDEN\";\n });\n}\n\n/**\n * The Client API returns GraphQL-level errors (validation, not-found, etc.) as\n * an HTTP 200 with an `errors` array. Surfacing that raw `200` on an `ApiError`\n * is misleading for downstream consumers and telemetry, so normalize any\n * non-error HTTP status to a 500.\n */\nfunction normalizeErrorStatus(status: number): number {\n return status >= 400 ? status : 500;\n}\n\n/**\n * Translate a graphql-request failure into the same error classes the REST\n * Widgets client throws, so presentational components and error boundaries can\n * handle both transports uniformly.\n */\nfunction toWidgetError(\n error: unknown,\n queryType: QueryType,\n isExpiredToken: boolean,\n): Error {\n if (error instanceof ClientError) {\n if (isAuthError(error)) {\n const context = { status: error.response.status, queryType } as const;\n return isExpiredToken\n ? new ExpiredTokenError({ context })\n : new IncorrectPermissionsError({ context });\n }\n\n const firstError = error.response.errors?.[0];\n return new ApiError({\n message: firstError?.message ?? error.message,\n status: normalizeErrorStatus(error.response.status),\n queryType,\n context: { errors: error.response.errors },\n });\n }\n\n return new FetchError({\n message: error instanceof Error ? error.message : \"GraphQL request failed\",\n queryType,\n context: { error },\n });\n}\n\n/**\n * Returns a typed SDK for the WorkOS Client GraphQL API, wired up to the same\n * `ApiProvider` auth plumbing the REST Widgets client uses:\n *\n * - Sends the current bearer token plus the widget-type / version headers.\n * - On an auth failure, re-mints the token via the shared `authToken` query and\n * retries the operation once (mirrors the REST client's 403 retry).\n * - Maps GraphQL/network failures onto the widget error classes.\n *\n * Elevated-access tokens are intentionally not attached here; the Client API\n * takes them as mutation input fields, so call sites read them from\n * `useElevatedAccessToken` and pass them through the relevant inputs.\n */\nexport function useClientGraphql(): Sdk {\n const { authToken, baseUrl, widgetType } = useApi();\n const queryClient = useQueryClient();\n\n return React.useMemo(() => {\n const endpoint = new URL(baseUrl);\n endpoint.pathname = CLIENT_API_GRAPHQL_PATH;\n const client = new GraphQLClient(endpoint.toString());\n return createClientSdk(client, { authToken, widgetType, queryClient });\n }, [authToken, baseUrl, widgetType, queryClient]);\n}\n\nfunction createClientSdk(\n client: GraphQLClient,\n args: {\n authToken: string | undefined;\n widgetType: WidgetType;\n queryClient: QueryClient;\n },\n) {\n const { authToken, widgetType, queryClient } = args;\n return getSdk(\n client,\n async (action, _operationName, operationType, _variables) => {\n const queryType: QueryType =\n operationType === \"mutation\" ? \"mutation\" : \"query\";\n const queryData = queryClient.getQueryData<AuthTokenQueryData>(\n authTokenQueryKey(widgetType),\n );\n // Read the cached token at request time: the rendered `authToken` may lag\n // behind the cache until React re-renders after a token refetch.\n const token = queryData?.authToken ?? authToken;\n\n try {\n return await action(buildHeaders(token, widgetType));\n } catch (error) {\n let finalError: unknown = error;\n if (error instanceof ClientError && isAuthError(error)) {\n let freshToken: string | undefined;\n try {\n freshToken = await refetchToken(queryClient, widgetType);\n } catch (refetchError) {\n throw new ExpiredTokenError({\n context: { queryType, refetchError },\n });\n }\n\n if (freshToken && freshToken !== token) {\n try {\n return await action(buildHeaders(freshToken, widgetType));\n } catch (retryError) {\n finalError = retryError;\n }\n }\n }\n\n throw toWidgetError(\n finalError,\n queryType,\n isTokenExpired(queryClient, widgetType),\n );\n }\n },\n );\n}\n\nfunction buildHeaders(\n token: string | undefined,\n widgetType: WidgetType,\n): Record<string, string> {\n const headers: Record<string, string> = {\n \"WorkOS-Widgets-Version\": WIDGETS_API_VERSION,\n \"WorkOS-Widgets-Type\": widgetType,\n };\n if (token) {\n headers.Authorization = `Bearer ${token}`;\n }\n return headers;\n}\n\nasync function refetchToken(\n queryClient: QueryClient,\n widgetType: WidgetType,\n): Promise<string | undefined> {\n const tokenQueryKey = authTokenQueryKey(widgetType);\n await queryClient.refetchQueries({ queryKey: tokenQueryKey });\n const refreshed = queryClient.getQueryData<AuthTokenQueryData>(tokenQueryKey);\n return refreshed?.authToken;\n}\n\nfunction isTokenExpired(\n queryClient: QueryClient,\n widgetType: WidgetType,\n): boolean {\n const refreshed = queryClient.getQueryData<AuthTokenQueryData>(\n authTokenQueryKey(widgetType),\n );\n const exp = refreshed?.exp;\n return exp !== undefined && exp * 1000 <= Date.now();\n}\n"],"mappings":"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"}
@@ -1,17 +1,7 @@
1
1
  import { Sdk } from "./generated.js";
2
- import { QueryKey, UseMutationOptions, UseQueryOptions } from "@tanstack/react-query";
2
+ import { ClientGraphqlOperation, ClientGraphqlVariables, clientGraphqlQueryKey, isClientGraphqlQueryKey } from "./query-keys.js";
3
+ import { UseMutationOptions, UseQueryOptions } from "@tanstack/react-query";
3
4
  //#region src/api/client-graphql/hooks.d.ts
4
- export type ClientGraphqlOperation = keyof Sdk;
5
- export type ClientGraphqlVariables<K extends ClientGraphqlOperation> = Parameters<Sdk[K]>[0];
6
- export declare function isClientGraphqlQueryKey(queryKey: QueryKey): boolean;
7
- /**
8
- * React Query key for a Client GraphQL operation. Omit `variables` to address
9
- * every cached page/variant of an operation, e.g. when invalidating after a
10
- * mutation:
11
- *
12
- * queryClient.invalidateQueries({ queryKey: clientGraphqlQueryKey("Sessions") });
13
- */
14
- export declare function clientGraphqlQueryKey<K extends ClientGraphqlOperation>(operation: K, variables?: ClientGraphqlVariables<K>): QueryKey;
15
5
  type ClientGraphqlQueryOptions<TResult, TData> = Omit<UseQueryOptions<TResult, Error, TData>, "queryFn"> & {
16
6
  queryFn: (sdk: Sdk) => Promise<TResult>;
17
7
  };
@@ -39,4 +29,5 @@ type ClientGraphqlMutationOptions<TResult, TVariables, TContext> = Omit<UseMutat
39
29
  */
40
30
  export declare function useClientGraphqlMutation<TResult, TVariables = void, TContext = unknown>({ mutationFn, ...options }: ClientGraphqlMutationOptions<TResult, TVariables, TContext>): import("@tanstack/react-query").UseMutationResult<TResult, Error, TVariables, TContext>;
41
31
  //#endregion
32
+ export { type ClientGraphqlOperation, type ClientGraphqlVariables, clientGraphqlQueryKey, isClientGraphqlQueryKey };
42
33
  //# sourceMappingURL=hooks.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"hooks.d.ts","names":[],"sources":["../../../../src/api/client-graphql/hooks.ts"],"mappings":";;;YAUY,+BAA+B;YAE/B,uBAAuB,UAAU,0BAC3C,WAAW,IAAI;wBAID,wBAAwB,UAAU;;;;;;;;wBAWlC,sBAAsB,UAAU,wBAC9C,WAAW,GACX,YAAY,uBAAuB,KAClC;KAME,0BAA0B,SAAS,SAAS,KAC/C,gBAAgB,SAAS,OAAO;EAGhC,UAAU,KAAK,QAAQ,QAAQ;;;;;;;;;;;;wBAajB,sBAAsB,SAAS,QAAQ,WACrD,SACA,YACG,WACF,0BAA0B,SAAS,yCAAM,eAAA,OAAA;KAWvC,6BAA6B,SAAS,YAAY,YAAY,KACjE,mBAAmB,SAAS,OAAO,YAAY;EAG/C,aAAa,KAAK,KAAK,WAAW,eAAe,QAAQ;;;;;;;;;;wBAW3C,yBACd,SACA,mBACA,sBAEA,eACG,WACF,6BAA6B,SAAS,YAAY,4CAAS,kBAAA,SAAA,OAAA,YAAA"}
1
+ {"version":3,"file":"hooks.d.ts","names":[],"sources":["../../../../src/api/client-graphql/hooks.ts"],"mappings":";;;;KAkBK,0BAA0B,SAAS,SAAS,KAC/C,gBAAgB,SAAS,OAAO;EAGhC,UAAU,KAAK,QAAQ,QAAQ;;;;;;;;;;;;wBAajB,sBAAsB,SAAS,QAAQ,WACrD,SACA,YACG,WACF,0BAA0B,SAAS,yCAAM,eAAA,OAAA;KAWvC,6BAA6B,SAAS,YAAY,YAAY,KACjE,mBAAmB,SAAS,OAAO,YAAY;EAG/C,aAAa,KAAK,KAAK,WAAW,eAAe,QAAQ;;;;;;;;;;wBAW3C,yBACd,SACA,mBACA,sBAEA,eACG,WACF,6BAA6B,SAAS,YAAY,4CAAS,kBAAA,SAAA,OAAA,YAAA"}
@@ -1,25 +1,8 @@
1
+ import { clientGraphqlQueryKey, isClientGraphqlQueryKey } from "./query-keys.js";
1
2
  import { useApiReady } from "../api-provider.js";
2
3
  import { useClientGraphql } from "./client.js";
3
4
  import { useMutation, useQuery } from "@tanstack/react-query";
4
5
  //#region src/api/client-graphql/hooks.ts
5
- const CLIENT_GRAPHQL_KEY_PREFIX = "client-graphql";
6
- function isClientGraphqlQueryKey(queryKey) {
7
- return queryKey[0] === CLIENT_GRAPHQL_KEY_PREFIX;
8
- }
9
- /**
10
- * React Query key for a Client GraphQL operation. Omit `variables` to address
11
- * every cached page/variant of an operation, e.g. when invalidating after a
12
- * mutation:
13
- *
14
- * queryClient.invalidateQueries({ queryKey: clientGraphqlQueryKey("Sessions") });
15
- */
16
- function clientGraphqlQueryKey(operation, variables) {
17
- return variables === void 0 ? [CLIENT_GRAPHQL_KEY_PREFIX, operation] : [
18
- CLIENT_GRAPHQL_KEY_PREFIX,
19
- operation,
20
- variables
21
- ];
22
- }
23
6
  /**
24
7
  * Runs a Client GraphQL query through React Query. The query is held until
25
8
  * `ApiProvider` has resolved an auth token (`useApiReady`), mirroring the
@@ -1 +1 @@
1
- {"version":3,"file":"hooks.js","names":[],"sources":["../../../../src/api/client-graphql/hooks.ts"],"sourcesContent":["import { useMutation, useQuery } from \"@tanstack/react-query\";\nimport type {\n QueryKey,\n UseMutationOptions,\n UseQueryOptions,\n} from \"@tanstack/react-query\";\nimport { useApiReady } from \"../api-provider.js\";\nimport { useClientGraphql } from \"./client.js\";\nimport type { Sdk } from \"./generated.js\";\n\nexport type ClientGraphqlOperation = keyof Sdk;\n\nexport type ClientGraphqlVariables<K extends ClientGraphqlOperation> =\n Parameters<Sdk[K]>[0];\n\nconst CLIENT_GRAPHQL_KEY_PREFIX = \"client-graphql\";\n\nexport function isClientGraphqlQueryKey(queryKey: QueryKey): boolean {\n return queryKey[0] === CLIENT_GRAPHQL_KEY_PREFIX;\n}\n\n/**\n * React Query key for a Client GraphQL operation. Omit `variables` to address\n * every cached page/variant of an operation, e.g. when invalidating after a\n * mutation:\n *\n * queryClient.invalidateQueries({ queryKey: clientGraphqlQueryKey(\"Sessions\") });\n */\nexport function clientGraphqlQueryKey<K extends ClientGraphqlOperation>(\n operation: K,\n variables?: ClientGraphqlVariables<K>,\n): QueryKey {\n return variables === undefined\n ? [CLIENT_GRAPHQL_KEY_PREFIX, operation]\n : [CLIENT_GRAPHQL_KEY_PREFIX, operation, variables];\n}\n\ntype ClientGraphqlQueryOptions<TResult, TData> = Omit<\n UseQueryOptions<TResult, Error, TData>,\n \"queryFn\"\n> & {\n queryFn: (sdk: Sdk) => Promise<TResult>;\n};\n\n/**\n * Runs a Client GraphQL query through React Query. The query is held until\n * `ApiProvider` has resolved an auth token (`useApiReady`), mirroring the\n * generated REST hooks.\n *\n * useClientGraphqlQuery({\n * queryKey: clientGraphqlQueryKey(\"ListSsoConnections\"),\n * queryFn: (sdk) => sdk.ListSsoConnections(),\n * });\n */\nexport function useClientGraphqlQuery<TResult, TData = TResult>({\n queryFn,\n enabled = true,\n ...options\n}: ClientGraphqlQueryOptions<TResult, TData>) {\n const sdk = useClientGraphql();\n const isApiReady = useApiReady();\n\n return useQuery<TResult, Error, TData>({\n ...options,\n queryFn: () => queryFn(sdk),\n enabled: isApiReady && enabled,\n });\n}\n\ntype ClientGraphqlMutationOptions<TResult, TVariables, TContext> = Omit<\n UseMutationOptions<TResult, Error, TVariables, TContext>,\n \"mutationFn\"\n> & {\n mutationFn: (sdk: Sdk, variables: TVariables) => Promise<TResult>;\n};\n\n/**\n * Runs a Client GraphQL mutation through React Query. Invalidate the affected\n * queries in `onSuccess` using `clientGraphqlQueryKey`.\n *\n * useClientGraphqlMutation({\n * mutationFn: (sdk, input: RevokeSessionInput) => sdk.RevokeSession({ input }),\n * });\n */\nexport function useClientGraphqlMutation<\n TResult,\n TVariables = void,\n TContext = unknown,\n>({\n mutationFn,\n ...options\n}: ClientGraphqlMutationOptions<TResult, TVariables, TContext>) {\n const sdk = useClientGraphql();\n\n return useMutation<TResult, Error, TVariables, TContext>({\n ...options,\n mutationFn: (variables) => mutationFn(sdk, variables),\n });\n}\n"],"mappings":";;;;AAeA,MAAM,4BAA4B;AAElC,SAAgB,wBAAwB,UAA6B;CACnE,OAAO,SAAS,OAAO;AACzB;;;;;;;;AASA,SAAgB,sBACd,WACA,WACU;CACV,OAAO,cAAc,SACjB,CAAC,2BAA2B,SAAS,IACrC;EAAC;EAA2B;EAAW;CAAS;AACtD;;;;;;;;;;;AAmBA,SAAgB,sBAAgD,EAC9D,SACA,UAAU,MACV,GAAG,WACyC;CAC5C,MAAM,MAAM,iBAAiB;CAC7B,MAAM,aAAa,YAAY;CAE/B,OAAO,SAAgC;EACrC,GAAG;EACH,eAAe,QAAQ,GAAG;EAC1B,SAAS,cAAc;CACzB,CAAC;AACH;;;;;;;;;AAiBA,SAAgB,yBAId,EACA,YACA,GAAG,WAC2D;CAC9D,MAAM,MAAM,iBAAiB;CAE7B,OAAO,YAAkD;EACvD,GAAG;EACH,aAAa,cAAc,WAAW,KAAK,SAAS;CACtD,CAAC;AACH"}
1
+ {"version":3,"file":"hooks.js","names":[],"sources":["../../../../src/api/client-graphql/hooks.ts"],"sourcesContent":["import { useMutation, useQuery } from \"@tanstack/react-query\";\nimport type {\n UseMutationOptions,\n UseQueryOptions,\n} from \"@tanstack/react-query\";\nimport { useApiReady } from \"../api-provider.js\";\nimport { useClientGraphql } from \"./client.js\";\nimport type { Sdk } from \"./generated.js\";\n\nexport {\n clientGraphqlQueryKey,\n isClientGraphqlQueryKey,\n} from \"./query-keys.js\";\nexport type {\n ClientGraphqlOperation,\n ClientGraphqlVariables,\n} from \"./query-keys.js\";\n\ntype ClientGraphqlQueryOptions<TResult, TData> = Omit<\n UseQueryOptions<TResult, Error, TData>,\n \"queryFn\"\n> & {\n queryFn: (sdk: Sdk) => Promise<TResult>;\n};\n\n/**\n * Runs a Client GraphQL query through React Query. The query is held until\n * `ApiProvider` has resolved an auth token (`useApiReady`), mirroring the\n * generated REST hooks.\n *\n * useClientGraphqlQuery({\n * queryKey: clientGraphqlQueryKey(\"ListSsoConnections\"),\n * queryFn: (sdk) => sdk.ListSsoConnections(),\n * });\n */\nexport function useClientGraphqlQuery<TResult, TData = TResult>({\n queryFn,\n enabled = true,\n ...options\n}: ClientGraphqlQueryOptions<TResult, TData>) {\n const sdk = useClientGraphql();\n const isApiReady = useApiReady();\n\n return useQuery<TResult, Error, TData>({\n ...options,\n queryFn: () => queryFn(sdk),\n enabled: isApiReady && enabled,\n });\n}\n\ntype ClientGraphqlMutationOptions<TResult, TVariables, TContext> = Omit<\n UseMutationOptions<TResult, Error, TVariables, TContext>,\n \"mutationFn\"\n> & {\n mutationFn: (sdk: Sdk, variables: TVariables) => Promise<TResult>;\n};\n\n/**\n * Runs a Client GraphQL mutation through React Query. Invalidate the affected\n * queries in `onSuccess` using `clientGraphqlQueryKey`.\n *\n * useClientGraphqlMutation({\n * mutationFn: (sdk, input: RevokeSessionInput) => sdk.RevokeSession({ input }),\n * });\n */\nexport function useClientGraphqlMutation<\n TResult,\n TVariables = void,\n TContext = unknown,\n>({\n mutationFn,\n ...options\n}: ClientGraphqlMutationOptions<TResult, TVariables, TContext>) {\n const sdk = useClientGraphql();\n\n return useMutation<TResult, Error, TVariables, TContext>({\n ...options,\n mutationFn: (variables) => mutationFn(sdk, variables),\n });\n}\n"],"mappings":";;;;;;;;;;;;;;;AAmCA,SAAgB,sBAAgD,EAC9D,SACA,UAAU,MACV,GAAG,WACyC;CAC5C,MAAM,MAAM,iBAAiB;CAC7B,MAAM,aAAa,YAAY;CAE/B,OAAO,SAAgC;EACrC,GAAG;EACH,eAAe,QAAQ,GAAG;EAC1B,SAAS,cAAc;CACzB,CAAC;AACH;;;;;;;;;AAiBA,SAAgB,yBAId,EACA,YACA,GAAG,WAC2D;CAC9D,MAAM,MAAM,iBAAiB;CAE7B,OAAO,YAAkD;EACvD,GAAG;EACH,aAAa,cAAc,WAAW,KAAK,SAAS;CACtD,CAAC;AACH"}
@@ -0,0 +1,16 @@
1
+ import { Sdk } from "./generated.js";
2
+ import { QueryKey } from "@tanstack/react-query";
3
+ //#region src/api/client-graphql/query-keys.d.ts
4
+ export type ClientGraphqlOperation = keyof Sdk;
5
+ export type ClientGraphqlVariables<K extends ClientGraphqlOperation> = Parameters<Sdk[K]>[0];
6
+ export declare function isClientGraphqlQueryKey(queryKey: QueryKey): boolean;
7
+ /**
8
+ * React Query key for a Client GraphQL operation. Omit `variables` to address
9
+ * every cached page/variant of an operation, e.g. when invalidating after a
10
+ * mutation:
11
+ *
12
+ * queryClient.invalidateQueries({ queryKey: clientGraphqlQueryKey("Sessions") });
13
+ */
14
+ export declare function clientGraphqlQueryKey<K extends ClientGraphqlOperation>(operation: K, variables?: ClientGraphqlVariables<K>): QueryKey;
15
+ //#endregion
16
+ //# sourceMappingURL=query-keys.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"query-keys.d.ts","names":[],"sources":["../../../../src/api/client-graphql/query-keys.ts"],"mappings":";;;YAGY,+BAA+B;YAE/B,uBAAuB,UAAU,0BAC3C,WAAW,IAAI;wBAID,wBAAwB,UAAU;;;;;;;;wBAWlC,sBAAsB,UAAU,wBAC9C,WAAW,GACX,YAAY,uBAAuB,KAClC"}
@@ -0,0 +1,23 @@
1
+ //#region src/api/client-graphql/query-keys.ts
2
+ const CLIENT_GRAPHQL_KEY_PREFIX = "client-graphql";
3
+ function isClientGraphqlQueryKey(queryKey) {
4
+ return queryKey[0] === CLIENT_GRAPHQL_KEY_PREFIX;
5
+ }
6
+ /**
7
+ * React Query key for a Client GraphQL operation. Omit `variables` to address
8
+ * every cached page/variant of an operation, e.g. when invalidating after a
9
+ * mutation:
10
+ *
11
+ * queryClient.invalidateQueries({ queryKey: clientGraphqlQueryKey("Sessions") });
12
+ */
13
+ function clientGraphqlQueryKey(operation, variables) {
14
+ return variables === void 0 ? [CLIENT_GRAPHQL_KEY_PREFIX, operation] : [
15
+ CLIENT_GRAPHQL_KEY_PREFIX,
16
+ operation,
17
+ variables
18
+ ];
19
+ }
20
+ //#endregion
21
+ export { clientGraphqlQueryKey, isClientGraphqlQueryKey };
22
+
23
+ //# sourceMappingURL=query-keys.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"query-keys.js","names":[],"sources":["../../../../src/api/client-graphql/query-keys.ts"],"sourcesContent":["import type { QueryKey } from \"@tanstack/react-query\";\nimport type { Sdk } from \"./generated.js\";\n\nexport type ClientGraphqlOperation = keyof Sdk;\n\nexport type ClientGraphqlVariables<K extends ClientGraphqlOperation> =\n Parameters<Sdk[K]>[0];\n\nconst CLIENT_GRAPHQL_KEY_PREFIX = \"client-graphql\";\n\nexport function isClientGraphqlQueryKey(queryKey: QueryKey): boolean {\n return queryKey[0] === CLIENT_GRAPHQL_KEY_PREFIX;\n}\n\n/**\n * React Query key for a Client GraphQL operation. Omit `variables` to address\n * every cached page/variant of an operation, e.g. when invalidating after a\n * mutation:\n *\n * queryClient.invalidateQueries({ queryKey: clientGraphqlQueryKey(\"Sessions\") });\n */\nexport function clientGraphqlQueryKey<K extends ClientGraphqlOperation>(\n operation: K,\n variables?: ClientGraphqlVariables<K>,\n): QueryKey {\n return variables === undefined\n ? [CLIENT_GRAPHQL_KEY_PREFIX, operation]\n : [CLIENT_GRAPHQL_KEY_PREFIX, operation, variables];\n}\n"],"mappings":";AAQA,MAAM,4BAA4B;AAElC,SAAgB,wBAAwB,UAA6B;CACnE,OAAO,SAAS,OAAO;AACzB;;;;;;;;AASA,SAAgB,sBACd,WACA,WACU;CACV,OAAO,cAAc,SACjB,CAAC,2BAA2B,SAAS,IACrC;EAAC;EAA2B;EAAW;CAAS;AACtD"}
@@ -46,7 +46,7 @@ const CopyText = ({ value, label }) => {
46
46
  title: copyLabel,
47
47
  variant: "ghost",
48
48
  size: "1",
49
- "aria-labelledby": copyLabel,
49
+ "aria-label": copyLabel,
50
50
  className: namespaceClassName("copy-text__copy"),
51
51
  onClick: async (event) => {
52
52
  const button = event.currentTarget;
@@ -1 +1 @@
1
- {"version":3,"file":"copy-text.js","names":["IconButton"],"sources":["../../../src/components/copy-text.tsx"],"sourcesContent":["\"use client\";\nimport { CheckIcon, CopyIcon } from \"@radix-ui/react-icons\";\nimport { Flex, Text } from \"@radix-ui/themes\";\nimport * as React from \"react\";\nimport { useTranslation } from \"../lib/i18n/use-translation.js\";\nimport { namespaceClassName } from \"../lib/widget-dom-props.js\";\nimport { IconButton } from \"./elements.js\";\n\ninterface CopyTextProps {\n value: string;\n /** Accessible label for the copy button. Defaults to a generic \"Copy\". */\n label?: string;\n}\n\n/**\n * Minimal reusable copy-on-hover text row, modeled on the dashboard's\n * `CopyText`: renders `value` on a single truncated line with a copy button\n * that reveals on hover or keyboard focus (see `copy-text.css`). The copy\n * button blurs itself shortly after a copy so it doesn't linger via\n * `:focus-within`.\n */\nconst CopyText: React.FC<CopyTextProps> = ({ value, label }) => {\n const [copied, setCopied] = React.useState(false);\n const stateTimeoutRef = React.useRef<number | undefined>(undefined);\n const blurTimeoutRef = React.useRef<number | undefined>(undefined);\n const translate = useTranslation();\n\n const copyLabel =\n label ??\n translate({\n defaultMessage: \"Copy to clipboard\",\n id: \"44uBwv\",\n description: \"Default accessible label for a copy-to-clipboard button\",\n });\n\n React.useEffect(() => {\n return () => {\n window.clearTimeout(stateTimeoutRef.current);\n window.clearTimeout(blurTimeoutRef.current);\n };\n }, []);\n\n const Icon = copied ? CheckIcon : CopyIcon;\n\n return (\n <Flex className={namespaceClassName(\"copy-text\")} gap=\"2\" align=\"center\">\n <Text\n size=\"2\"\n title={value}\n className={namespaceClassName(\"copy-text__value\")}\n >\n {value}\n </Text>\n <IconButton\n type=\"button\"\n title={copyLabel}\n variant=\"ghost\"\n size=\"1\"\n aria-labelledby={copyLabel}\n className={namespaceClassName(\"copy-text__copy\")}\n onClick={async (event) => {\n const button = event.currentTarget;\n try {\n await navigator.clipboard.writeText(value);\n setCopied(true);\n stateTimeoutRef.current = window.setTimeout(\n () => setCopied(false),\n 2000,\n );\n } catch {\n // clipboard unavailable; ignore\n }\n // Blur after the confirmation so the button doesn't stay revealed\n // via :focus-within once the pointer leaves.\n blurTimeoutRef.current = window.setTimeout(() => {\n if (button.isConnected) {\n button.blur();\n }\n }, 1800);\n }}\n >\n <Icon aria-hidden />\n </IconButton>\n </Flex>\n );\n};\nexport type { CopyTextProps };\nexport { CopyText };\n"],"mappings":";;;;;;;;;;;;;;;;;AAqBA,MAAM,YAAqC,EAAE,OAAO,YAAY;CAC9D,MAAM,CAAC,QAAQ,aAAa,MAAM,SAAS,KAAK;CAChD,MAAM,kBAAkB,MAAM,OAA2B,MAAS;CAClE,MAAM,iBAAiB,MAAM,OAA2B,MAAS;CACjE,MAAM,YAAY,eAAe;CAEjC,MAAM,YACJ,SACA,UAAU;EACR,gBAAgB;EAChB,IAAI;EACJ,aAAa;CACf,CAAC;CAEH,MAAM,gBAAgB;EACpB,aAAa;GACX,OAAO,aAAa,gBAAgB,OAAO;GAC3C,OAAO,aAAa,eAAe,OAAO;EAC5C;CACF,GAAG,CAAC,CAAC;CAEL,MAAM,OAAO,SAAS,YAAY;CAElC,OACE,qBAAC,MAAD;EAAM,WAAW,mBAAmB,WAAW;EAAG,KAAI;EAAI,OAAM;EAAhE,UAAA,CACE,oBAAC,MAAD;GACE,MAAK;GACL,OAAO;GACP,WAAW,mBAAmB,kBAAkB;GAE/C,UAAA;EACG,CAAA,GACN,oBAACA,cAAD;GACE,MAAK;GACL,OAAO;GACP,SAAQ;GACR,MAAK;GACL,mBAAiB;GACjB,WAAW,mBAAmB,iBAAiB;GAC/C,SAAS,OAAO,UAAU;IACxB,MAAM,SAAS,MAAM;IACrB,IAAI;KACF,MAAM,UAAU,UAAU,UAAU,KAAK;KACzC,UAAU,IAAI;KACd,gBAAgB,UAAU,OAAO,iBACzB,UAAU,KAAK,GACrB,GACF;IACF,QAAQ,CAER;IAGA,eAAe,UAAU,OAAO,iBAAiB;KAC/C,IAAI,OAAO,aACT,OAAO,KAAK;IAEhB,GAAG,IAAI;GACT;GAEA,UAAA,oBAAC,MAAD,EAAM,eAAA,KAAa,CAAA;EACT,CAAA,CACR;;AAEV"}
1
+ {"version":3,"file":"copy-text.js","names":["IconButton"],"sources":["../../../src/components/copy-text.tsx"],"sourcesContent":["\"use client\";\nimport { CheckIcon, CopyIcon } from \"@radix-ui/react-icons\";\nimport { Flex, Text } from \"@radix-ui/themes\";\nimport * as React from \"react\";\nimport { useTranslation } from \"../lib/i18n/use-translation.js\";\nimport { namespaceClassName } from \"../lib/widget-dom-props.js\";\nimport { IconButton } from \"./elements.js\";\n\ninterface CopyTextProps {\n value: string;\n /** Accessible label for the copy button. Defaults to a generic \"Copy\". */\n label?: string;\n}\n\n/**\n * Minimal reusable copy-on-hover text row, modeled on the dashboard's\n * `CopyText`: renders `value` on a single truncated line with a copy button\n * that reveals on hover or keyboard focus (see `copy-text.css`). The copy\n * button blurs itself shortly after a copy so it doesn't linger via\n * `:focus-within`.\n */\nconst CopyText: React.FC<CopyTextProps> = ({ value, label }) => {\n const [copied, setCopied] = React.useState(false);\n const stateTimeoutRef = React.useRef<number | undefined>(undefined);\n const blurTimeoutRef = React.useRef<number | undefined>(undefined);\n const translate = useTranslation();\n\n const copyLabel =\n label ??\n translate({\n defaultMessage: \"Copy to clipboard\",\n id: \"44uBwv\",\n description: \"Default accessible label for a copy-to-clipboard button\",\n });\n\n React.useEffect(() => {\n return () => {\n window.clearTimeout(stateTimeoutRef.current);\n window.clearTimeout(blurTimeoutRef.current);\n };\n }, []);\n\n const Icon = copied ? CheckIcon : CopyIcon;\n\n return (\n <Flex className={namespaceClassName(\"copy-text\")} gap=\"2\" align=\"center\">\n <Text\n size=\"2\"\n title={value}\n className={namespaceClassName(\"copy-text__value\")}\n >\n {value}\n </Text>\n <IconButton\n type=\"button\"\n title={copyLabel}\n variant=\"ghost\"\n size=\"1\"\n aria-label={copyLabel}\n className={namespaceClassName(\"copy-text__copy\")}\n onClick={async (event) => {\n const button = event.currentTarget;\n try {\n await navigator.clipboard.writeText(value);\n setCopied(true);\n stateTimeoutRef.current = window.setTimeout(\n () => setCopied(false),\n 2000,\n );\n } catch {\n // clipboard unavailable; ignore\n }\n // Blur after the confirmation so the button doesn't stay revealed\n // via :focus-within once the pointer leaves.\n blurTimeoutRef.current = window.setTimeout(() => {\n if (button.isConnected) {\n button.blur();\n }\n }, 1800);\n }}\n >\n <Icon aria-hidden />\n </IconButton>\n </Flex>\n );\n};\nexport type { CopyTextProps };\nexport { CopyText };\n"],"mappings":";;;;;;;;;;;;;;;;;AAqBA,MAAM,YAAqC,EAAE,OAAO,YAAY;CAC9D,MAAM,CAAC,QAAQ,aAAa,MAAM,SAAS,KAAK;CAChD,MAAM,kBAAkB,MAAM,OAA2B,MAAS;CAClE,MAAM,iBAAiB,MAAM,OAA2B,MAAS;CACjE,MAAM,YAAY,eAAe;CAEjC,MAAM,YACJ,SACA,UAAU;EACR,gBAAgB;EAChB,IAAI;EACJ,aAAa;CACf,CAAC;CAEH,MAAM,gBAAgB;EACpB,aAAa;GACX,OAAO,aAAa,gBAAgB,OAAO;GAC3C,OAAO,aAAa,eAAe,OAAO;EAC5C;CACF,GAAG,CAAC,CAAC;CAEL,MAAM,OAAO,SAAS,YAAY;CAElC,OACE,qBAAC,MAAD;EAAM,WAAW,mBAAmB,WAAW;EAAG,KAAI;EAAI,OAAM;EAAhE,UAAA,CACE,oBAAC,MAAD;GACE,MAAK;GACL,OAAO;GACP,WAAW,mBAAmB,kBAAkB;GAE/C,UAAA;EACG,CAAA,GACN,oBAACA,cAAD;GACE,MAAK;GACL,OAAO;GACP,SAAQ;GACR,MAAK;GACL,cAAY;GACZ,WAAW,mBAAmB,iBAAiB;GAC/C,SAAS,OAAO,UAAU;IACxB,MAAM,SAAS,MAAM;IACrB,IAAI;KACF,MAAM,UAAU,UAAU,UAAU,KAAK;KACzC,UAAU,IAAI;KACd,gBAAgB,UAAU,OAAO,iBACzB,UAAU,KAAK,GACrB,GACF;IACF,QAAQ,CAER;IAGA,eAAe,UAAU,OAAO,iBAAiB;KAC/C,IAAI,OAAO,aACT,OAAO,KAAK;IAEhB,GAAG,IAAI;GACT;GAEA,UAAA,oBAAC,MAAD,EAAM,eAAA,KAAa,CAAA;EACT,CAAA,CACR;;AAEV"}
@@ -1 +1 @@
1
- {"version":3,"file":"form.d.ts","names":[],"sources":["../../../src/components/form.tsx"],"mappings":";;UA+EU,2BAA2B,MAAM;EACzC;;UAEQ,kBAAkB;EAC1B;;cAGI,MAAI,MAAA,0BAAA,YAAA,MAAA,cAAA;UA8LA,0BAA0B,MAAM;EACxC;;UAEQ,uBAAuB;EAC/B;EACA;EACA;;cAGI,WAAS,MAAA,0BAAA,iBAAA,MAAA,cAAA;UA0CL,mBAAmB,MAAM;EACjC;;UAEQ,uBAAuB;EAC/B;;cAGI,WAAS,MAAA,0BAAA,iBAAA,MAAA,cAAA;UA0DL,4BAA4B,MAAM;EAC1C;;UAEQ,yBAAyB;cAE7B,aAAW,MAAA,0BAAA,mBAAA,MAAA,cAAA;cAyMX;KAYD,0BAA0B;UAiBrB,yBAAyB,KAAK;EACtC,WAAW,MAAM;EACjB,QAAQ,kBAAkB;EAC1B;EACA;;cAGI,aAAW,MAAA,0BAAA,mBAAA,MAAA,cAAA;UA+HP,2BAA2B,MAAM;EACzC;;UAEQ,6BAA6B;EACrC;;UA8BQ;EACR,SAAS,UAAU,4BAA4B,MAAM;EACrD;;cAGI,mBAAmB,MAAM,GAAG;UAoBxB,6BAA6B,MAAM;EAC3C;;UAEQ,wBAAwB;cAE5B,YAAU,MAAA,0BAAA,kBAAA,MAAA,cAAA;KAeX,qBAAqB,eAAe,UAAU;KAC9C,sBACH,eACA,UAAU,aACP;KACA,gBAAgB,oBAAoB"}
1
+ {"version":3,"file":"form.d.ts","names":[],"sources":["../../../src/components/form.tsx"],"mappings":";;UA+EU,2BAA2B,MAAM;EACzC;;UAEQ,kBAAkB;EAC1B;;cAGI,MAAI,MAAA,0BAAA,YAAA,MAAA,cAAA;UAoMA,0BAA0B,MAAM;EACxC;;UAEQ,uBAAuB;EAC/B;EACA;EACA;;cAGI,WAAS,MAAA,0BAAA,iBAAA,MAAA,cAAA;UA0CL,mBAAmB,MAAM;EACjC;;UAEQ,uBAAuB;EAC/B;;cAGI,WAAS,MAAA,0BAAA,iBAAA,MAAA,cAAA;UA0DL,4BAA4B,MAAM;EAC1C;;UAEQ,yBAAyB;cAE7B,aAAW,MAAA,0BAAA,mBAAA,MAAA,cAAA;cAuMX;KAYD,0BAA0B;UAiBrB,yBAAyB,KAAK;EACtC,WAAW,MAAM;EACjB,QAAQ,kBAAkB;EAC1B;EACA;;cAGI,aAAW,MAAA,0BAAA,mBAAA,MAAA,cAAA;UA+HP,2BAA2B,MAAM;EACzC;;UAEQ,6BAA6B;EACrC;;UA8BQ;EACR,SAAS,UAAU,4BAA4B,MAAM;EACrD;;cAGI,mBAAmB,MAAM,GAAG;UAoBxB,6BAA6B,MAAM;EAC3C;;UAEQ,wBAAwB;cAE5B,YAAU,MAAA,0BAAA,kBAAA,MAAA,cAAA;KAeX,qBAAqB,eAAe,UAAU;KAC9C,sBACH,eACA,UAAU,aACP;KACA,gBAAgB,oBAAoB"}