@workos-inc/widgets 1.20.2-next.1792708307096 → 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 (123) hide show
  1. package/CHANGELOG.md +4 -12
  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/hooks.cjs +3 -20
  15. package/dist/cjs/api/client-graphql/hooks.cjs.map +1 -1
  16. package/dist/cjs/api/client-graphql/hooks.d.cts +3 -12
  17. package/dist/cjs/api/client-graphql/hooks.d.cts.map +1 -1
  18. package/dist/cjs/api/client-graphql/query-keys.cjs +25 -0
  19. package/dist/cjs/api/client-graphql/query-keys.cjs.map +1 -0
  20. package/dist/cjs/api/client-graphql/query-keys.d.cts +16 -0
  21. package/dist/cjs/api/client-graphql/query-keys.d.cts.map +1 -0
  22. package/dist/cjs/components/copy-text.cjs +1 -1
  23. package/dist/cjs/components/copy-text.cjs.map +1 -1
  24. package/dist/cjs/components/otp-input.cjs +1 -0
  25. package/dist/cjs/components/otp-input.cjs.map +1 -1
  26. package/dist/cjs/directory-sync.client.cjs +2 -1
  27. package/dist/cjs/directory-sync.client.cjs.map +1 -1
  28. package/dist/cjs/lib/api/api-key.cjs +4 -3
  29. package/dist/cjs/lib/api/api-key.cjs.map +1 -1
  30. package/dist/cjs/lib/api/me.cjs +2 -1
  31. package/dist/cjs/lib/api/me.cjs.map +1 -1
  32. package/dist/cjs/lib/api/pipes.cjs +7 -6
  33. package/dist/cjs/lib/api/pipes.cjs.map +1 -1
  34. package/dist/cjs/lib/api/user-api-key.cjs +3 -2
  35. package/dist/cjs/lib/api/user-api-key.cjs.map +1 -1
  36. package/dist/cjs/lib/use-widgets-invalidator.cjs +3 -2
  37. package/dist/cjs/lib/use-widgets-invalidator.cjs.map +1 -1
  38. package/dist/cjs/organization-switcher.client.cjs +2 -1
  39. package/dist/cjs/organization-switcher.client.cjs.map +1 -1
  40. package/dist/cjs/pipes-admin.client.cjs +2 -1
  41. package/dist/cjs/pipes-admin.client.cjs.map +1 -1
  42. package/dist/cjs/pipes.client.cjs +2 -1
  43. package/dist/cjs/pipes.client.cjs.map +1 -1
  44. package/dist/cjs/user-security.client.cjs +2 -1
  45. package/dist/cjs/user-security.client.cjs.map +1 -1
  46. package/dist/cjs/user-sessions.client.cjs +2 -1
  47. package/dist/cjs/user-sessions.client.cjs.map +1 -1
  48. package/dist/cjs/widgets/organization-switcher/organization-switcher.cjs +9 -4
  49. package/dist/cjs/widgets/organization-switcher/organization-switcher.cjs.map +1 -1
  50. package/dist/cjs/widgets/organization-switcher/organization-switcher.d.cts.map +1 -1
  51. package/dist/cjs/widgets/pipes/pipes.cjs +3 -2
  52. package/dist/cjs/widgets/pipes/pipes.cjs.map +1 -1
  53. package/dist/cjs/widgets/user-sessions/logout-all-sessions-dialog.cjs +2 -1
  54. package/dist/cjs/widgets/user-sessions/logout-all-sessions-dialog.cjs.map +1 -1
  55. package/dist/cjs/widgets/user-sessions/logout-dialog.cjs +2 -1
  56. package/dist/cjs/widgets/user-sessions/logout-dialog.cjs.map +1 -1
  57. package/dist/cjs/widgets/users-management/users-management-utils.cjs +4 -3
  58. package/dist/cjs/widgets/users-management/users-management-utils.cjs.map +1 -1
  59. package/dist/esm/admin-portal-audit-log-streaming.client.js +2 -1
  60. package/dist/esm/admin-portal-audit-log-streaming.client.js.map +1 -1
  61. package/dist/esm/admin-portal-domain-verification.client.js +2 -1
  62. package/dist/esm/admin-portal-domain-verification.client.js.map +1 -1
  63. package/dist/esm/admin-portal-sso-connection.client.js +2 -1
  64. package/dist/esm/admin-portal-sso-connection.client.js.map +1 -1
  65. package/dist/esm/api/api-provider.d.ts.map +1 -1
  66. package/dist/esm/api/api-provider.js +23 -1
  67. package/dist/esm/api/api-provider.js.map +1 -1
  68. package/dist/esm/api/claims.d.ts +2 -1
  69. package/dist/esm/api/claims.d.ts.map +1 -1
  70. package/dist/esm/api/claims.js.map +1 -1
  71. package/dist/esm/api/client-graphql/hooks.d.ts +3 -12
  72. package/dist/esm/api/client-graphql/hooks.d.ts.map +1 -1
  73. package/dist/esm/api/client-graphql/hooks.js +1 -18
  74. package/dist/esm/api/client-graphql/hooks.js.map +1 -1
  75. package/dist/esm/api/client-graphql/query-keys.d.ts +16 -0
  76. package/dist/esm/api/client-graphql/query-keys.d.ts.map +1 -0
  77. package/dist/esm/api/client-graphql/query-keys.js +23 -0
  78. package/dist/esm/api/client-graphql/query-keys.js.map +1 -0
  79. package/dist/esm/components/copy-text.js +1 -1
  80. package/dist/esm/components/copy-text.js.map +1 -1
  81. package/dist/esm/components/otp-input.js +1 -0
  82. package/dist/esm/components/otp-input.js.map +1 -1
  83. package/dist/esm/directory-sync.client.js +2 -1
  84. package/dist/esm/directory-sync.client.js.map +1 -1
  85. package/dist/esm/lib/api/api-key.js +2 -1
  86. package/dist/esm/lib/api/api-key.js.map +1 -1
  87. package/dist/esm/lib/api/me.js +2 -1
  88. package/dist/esm/lib/api/me.js.map +1 -1
  89. package/dist/esm/lib/api/pipes.js +2 -1
  90. package/dist/esm/lib/api/pipes.js.map +1 -1
  91. package/dist/esm/lib/api/user-api-key.js +2 -1
  92. package/dist/esm/lib/api/user-api-key.js.map +1 -1
  93. package/dist/esm/lib/use-widgets-invalidator.js +2 -1
  94. package/dist/esm/lib/use-widgets-invalidator.js.map +1 -1
  95. package/dist/esm/organization-switcher.client.js +2 -1
  96. package/dist/esm/organization-switcher.client.js.map +1 -1
  97. package/dist/esm/pipes-admin.client.js +2 -1
  98. package/dist/esm/pipes-admin.client.js.map +1 -1
  99. package/dist/esm/pipes.client.js +2 -1
  100. package/dist/esm/pipes.client.js.map +1 -1
  101. package/dist/esm/user-security.client.js +2 -1
  102. package/dist/esm/user-security.client.js.map +1 -1
  103. package/dist/esm/user-sessions.client.js +2 -1
  104. package/dist/esm/user-sessions.client.js.map +1 -1
  105. package/dist/esm/widgets/organization-switcher/organization-switcher.d.ts.map +1 -1
  106. package/dist/esm/widgets/organization-switcher/organization-switcher.js +9 -4
  107. package/dist/esm/widgets/organization-switcher/organization-switcher.js.map +1 -1
  108. package/dist/esm/widgets/pipes/pipes.js +2 -1
  109. package/dist/esm/widgets/pipes/pipes.js.map +1 -1
  110. package/dist/esm/widgets/user-sessions/logout-all-sessions-dialog.js +2 -1
  111. package/dist/esm/widgets/user-sessions/logout-all-sessions-dialog.js.map +1 -1
  112. package/dist/esm/widgets/user-sessions/logout-dialog.js +2 -1
  113. package/dist/esm/widgets/user-sessions/logout-dialog.js.map +1 -1
  114. package/dist/esm/widgets/users-management/users-management-utils.js +2 -1
  115. package/dist/esm/widgets/users-management/users-management-utils.js.map +1 -1
  116. package/package.json +1 -1
  117. package/src/api/api-provider.tsx +39 -1
  118. package/src/api/claims.ts +2 -1
  119. package/src/api/client-graphql/hooks.ts +8 -27
  120. package/src/api/client-graphql/query-keys.ts +29 -0
  121. package/src/components/copy-text.tsx +1 -1
  122. package/src/components/otp-input.tsx +2 -0
  123. package/src/widgets/organization-switcher/organization-switcher.tsx +16 -6
@@ -1,6 +1,7 @@
1
1
  "use client";
2
2
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
3
  const require_runtime = require("../../_virtual/_rolldown/runtime.cjs");
4
+ const require_api_client_graphql_query_keys = require("../../api/client-graphql/query-keys.cjs");
4
5
  const require_api_client_graphql_hooks = require("../../api/client-graphql/hooks.cjs");
5
6
  const require_components_elements_button = require("../../components/elements/button.cjs");
6
7
  const require_components_elements_alert_dialog = require("../../components/elements/alert-dialog.cjs");
@@ -23,7 +24,7 @@ const LogoutAllSessionsDialog = ({ open, onOpenChange, currentSessionId, childre
23
24
  };
24
25
  const handleDone = react.useCallback(() => {
25
26
  onOpenChange?.(false);
26
- client.invalidateQueries({ queryKey: require_api_client_graphql_hooks.clientGraphqlQueryKey("Sessions") });
27
+ client.invalidateQueries({ queryKey: require_api_client_graphql_query_keys.clientGraphqlQueryKey("Sessions") });
27
28
  }, [client, onOpenChange]);
28
29
  return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_radix_ui_themes_components_alert_dialog.Root, {
29
30
  open,
@@ -1 +1 @@
1
- {"version":3,"file":"logout-all-sessions-dialog.cjs","names":["useQueryClient","useClientGraphqlMutation","expectResultMember","React","clientGraphqlQueryKey","Translation","Flex","Button","SaveButton"],"sources":["../../../../src/widgets/user-sessions/logout-all-sessions-dialog.tsx"],"sourcesContent":["\"use client\";\n\nimport { Flex } from \"@radix-ui/themes\";\nimport { useQueryClient } from \"@tanstack/react-query\";\nimport * as React from \"react\";\nimport type { ReactNode } from \"react\";\nimport {\n clientGraphqlQueryKey,\n useClientGraphqlMutation,\n} from \"../../api/client-graphql/hooks.js\";\nimport { AlertDialog, Button } from \"../../components/elements.js\";\nimport { SaveButton } from \"../../components/save-button.js\";\nimport { expectResultMember } from \"../../lib/client-graphql-result.js\";\nimport { Translation } from \"../../lib/i18n/translation.js\";\n\ninterface LogoutAllSessionsDialogProps extends AlertDialog.RootProps {\n currentSessionId?: string;\n children?: ReactNode;\n}\n\nconst LogoutAllSessionsDialog: React.FC<LogoutAllSessionsDialogProps> = ({\n open,\n onOpenChange,\n currentSessionId,\n children,\n ...props\n}) => {\n const client = useQueryClient();\n\n const revokeAllSessions = useClientGraphqlMutation({\n mutationFn: async (sdk) =>\n expectResultMember(\n (\n await sdk.RevokeAllSessions({\n input: { currentSessionId: currentSessionId || null },\n })\n ).revokeAllSessions,\n \"AllSessionsRevoked\",\n ),\n });\n\n const onSubmitForm = () => {\n revokeAllSessions.mutate();\n };\n\n const handleDone = React.useCallback(() => {\n onOpenChange?.(false);\n\n client.invalidateQueries({\n queryKey: clientGraphqlQueryKey(\"Sessions\"),\n });\n }, [client, onOpenChange]);\n\n return (\n <AlertDialog.Root open={open} onOpenChange={onOpenChange} {...props}>\n <AlertDialog.Content maxWidth=\"480px\">\n <AlertDialog.Title>\n <Translation\n defaultMessage=\"Sign out of all other devices?\"\n id=\"x//BWg\"\n description=\"Dialog title asking to confirm signing out of all other devices\"\n />\n </AlertDialog.Title>\n <AlertDialog.Description>\n <Translation\n defaultMessage=\"You will be logged out of all other active sessions on other devices, except this one.\"\n id=\"GftsX9\"\n description=\"Description explaining all other sessions will be logged out\"\n />\n </AlertDialog.Description>\n\n <Flex gap=\"3\" justify=\"end\" mt=\"5\" asChild>\n <form\n onSubmit={(event) => {\n event.preventDefault();\n onSubmitForm();\n }}\n >\n <AlertDialog.Cancel>\n <Button\n variant=\"secondary\"\n disabled={\n revokeAllSessions.isPending || revokeAllSessions.isSuccess\n }\n >\n <Translation\n defaultMessage=\"Cancel\"\n id=\"Pnmy4H\"\n description=\"Button to cancel signing out of all devices\"\n />\n </Button>\n </AlertDialog.Cancel>\n\n <SaveButton\n asChild\n loading={revokeAllSessions.isPending}\n done={revokeAllSessions.isSuccess}\n onDone={handleDone}\n >\n <Button variant=\"destructive\" type=\"submit\">\n <Translation\n defaultMessage=\"Sign out\"\n id=\"1Fb48o\"\n description=\"Button to confirm signing out of all other devices\"\n />\n </Button>\n </SaveButton>\n </form>\n </Flex>\n </AlertDialog.Content>\n </AlertDialog.Root>\n );\n};\nexport { LogoutAllSessionsDialog };\n"],"mappings":";;;;;;;;;;;;;;;;;AAoBA,MAAM,2BAAmE,EACvE,MACA,cACA,kBACA,UACA,GAAG,YACC;CACJ,MAAM,UAAA,GAASA,sBAAAA,eAAAA,CAAe;CAE9B,MAAM,oBAAoBC,iCAAAA,yBAAyB,EACjD,YAAY,OAAO,QACjBC,kCAAAA,oBAEI,MAAM,IAAI,kBAAkB,EAC1B,OAAO,EAAE,kBAAkB,oBAAoB,KAAK,EACtD,CAAC,EAAA,CACD,mBACF,oBACF,EACJ,CAAC;CAED,MAAM,qBAAqB;EACzB,kBAAkB,OAAO;CAC3B;CAEA,MAAM,aAAaC,MAAM,kBAAkB;EACzC,eAAe,KAAK;EAEpB,OAAO,kBAAkB,EACvB,UAAUC,iCAAAA,sBAAsB,UAAU,EAC5C,CAAC;CACH,GAAG,CAAC,QAAQ,YAAY,CAAC;CAEzB,OACE,iBAAA,GAAA,kBAAA,IAAA,CAAA,yCAAA,MAAA;EAAwB;EAAoB;EAAc,GAAI;EAC5D,UAAA,iBAAA,GAAA,kBAAA,KAAA,CAAA,yCAAA,SAAA;GAAqB,UAAS;GAA9B,UAAA;IACE,iBAAA,GAAA,kBAAA,IAAA,CAAA,yCAAA,OAAA,EAAA,UACE,iBAAA,GAAA,kBAAA,IAAA,CAACC,6BAAAA,aAAD;KACE,gBAAe;KACf,IAAG;KACH,aAAY;IACb,CAAA,EACgB,CAAA;IACnB,iBAAA,GAAA,kBAAA,IAAA,CAAA,yCAAA,aAAA,EAAA,UACE,iBAAA,GAAA,kBAAA,IAAA,CAACA,6BAAAA,aAAD;KACE,gBAAe;KACf,IAAG;KACH,aAAY;IACb,CAAA,EACsB,CAAA;IAEzB,iBAAA,GAAA,kBAAA,IAAA,CAACC,iBAAAA,MAAD;KAAM,KAAI;KAAI,SAAQ;KAAM,IAAG;KAAI,SAAA;KACjC,UAAA,iBAAA,GAAA,kBAAA,KAAA,CAAC,QAAD;MACE,WAAW,UAAU;OACnB,MAAM,eAAe;OACrB,aAAa;MACf;MAJF,UAAA,CAME,iBAAA,GAAA,kBAAA,IAAA,CAAA,yCAAA,QAAA,EAAA,UACE,iBAAA,GAAA,kBAAA,IAAA,CAACC,mCAAAA,QAAD;OACE,SAAQ;OACR,UACE,kBAAkB,aAAa,kBAAkB;OAGnD,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAACF,6BAAAA,aAAD;QACE,gBAAe;QACf,IAAG;QACH,aAAY;OACb,CAAA;MACK,CAAA,EACU,CAAA,GAEpB,iBAAA,GAAA,kBAAA,IAAA,CAACG,+BAAAA,YAAD;OACE,SAAA;OACA,SAAS,kBAAkB;OAC3B,MAAM,kBAAkB;OACxB,QAAQ;OAER,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAACD,mCAAAA,QAAD;QAAQ,SAAQ;QAAc,MAAK;QACjC,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAACF,6BAAAA,aAAD;SACE,gBAAe;SACf,IAAG;SACH,aAAY;QACb,CAAA;OACK,CAAA;MACE,CAAA,CACR;;IACF,CAAA;GACa;;CACL,CAAA;AAEtB"}
1
+ {"version":3,"file":"logout-all-sessions-dialog.cjs","names":["useQueryClient","useClientGraphqlMutation","expectResultMember","React","clientGraphqlQueryKey","Translation","Flex","Button","SaveButton"],"sources":["../../../../src/widgets/user-sessions/logout-all-sessions-dialog.tsx"],"sourcesContent":["\"use client\";\n\nimport { Flex } from \"@radix-ui/themes\";\nimport { useQueryClient } from \"@tanstack/react-query\";\nimport * as React from \"react\";\nimport type { ReactNode } from \"react\";\nimport {\n clientGraphqlQueryKey,\n useClientGraphqlMutation,\n} from \"../../api/client-graphql/hooks.js\";\nimport { AlertDialog, Button } from \"../../components/elements.js\";\nimport { SaveButton } from \"../../components/save-button.js\";\nimport { expectResultMember } from \"../../lib/client-graphql-result.js\";\nimport { Translation } from \"../../lib/i18n/translation.js\";\n\ninterface LogoutAllSessionsDialogProps extends AlertDialog.RootProps {\n currentSessionId?: string;\n children?: ReactNode;\n}\n\nconst LogoutAllSessionsDialog: React.FC<LogoutAllSessionsDialogProps> = ({\n open,\n onOpenChange,\n currentSessionId,\n children,\n ...props\n}) => {\n const client = useQueryClient();\n\n const revokeAllSessions = useClientGraphqlMutation({\n mutationFn: async (sdk) =>\n expectResultMember(\n (\n await sdk.RevokeAllSessions({\n input: { currentSessionId: currentSessionId || null },\n })\n ).revokeAllSessions,\n \"AllSessionsRevoked\",\n ),\n });\n\n const onSubmitForm = () => {\n revokeAllSessions.mutate();\n };\n\n const handleDone = React.useCallback(() => {\n onOpenChange?.(false);\n\n client.invalidateQueries({\n queryKey: clientGraphqlQueryKey(\"Sessions\"),\n });\n }, [client, onOpenChange]);\n\n return (\n <AlertDialog.Root open={open} onOpenChange={onOpenChange} {...props}>\n <AlertDialog.Content maxWidth=\"480px\">\n <AlertDialog.Title>\n <Translation\n defaultMessage=\"Sign out of all other devices?\"\n id=\"x//BWg\"\n description=\"Dialog title asking to confirm signing out of all other devices\"\n />\n </AlertDialog.Title>\n <AlertDialog.Description>\n <Translation\n defaultMessage=\"You will be logged out of all other active sessions on other devices, except this one.\"\n id=\"GftsX9\"\n description=\"Description explaining all other sessions will be logged out\"\n />\n </AlertDialog.Description>\n\n <Flex gap=\"3\" justify=\"end\" mt=\"5\" asChild>\n <form\n onSubmit={(event) => {\n event.preventDefault();\n onSubmitForm();\n }}\n >\n <AlertDialog.Cancel>\n <Button\n variant=\"secondary\"\n disabled={\n revokeAllSessions.isPending || revokeAllSessions.isSuccess\n }\n >\n <Translation\n defaultMessage=\"Cancel\"\n id=\"Pnmy4H\"\n description=\"Button to cancel signing out of all devices\"\n />\n </Button>\n </AlertDialog.Cancel>\n\n <SaveButton\n asChild\n loading={revokeAllSessions.isPending}\n done={revokeAllSessions.isSuccess}\n onDone={handleDone}\n >\n <Button variant=\"destructive\" type=\"submit\">\n <Translation\n defaultMessage=\"Sign out\"\n id=\"1Fb48o\"\n description=\"Button to confirm signing out of all other devices\"\n />\n </Button>\n </SaveButton>\n </form>\n </Flex>\n </AlertDialog.Content>\n </AlertDialog.Root>\n );\n};\nexport { LogoutAllSessionsDialog };\n"],"mappings":";;;;;;;;;;;;;;;;;;AAoBA,MAAM,2BAAmE,EACvE,MACA,cACA,kBACA,UACA,GAAG,YACC;CACJ,MAAM,UAAA,GAASA,sBAAAA,eAAAA,CAAe;CAE9B,MAAM,oBAAoBC,iCAAAA,yBAAyB,EACjD,YAAY,OAAO,QACjBC,kCAAAA,oBAEI,MAAM,IAAI,kBAAkB,EAC1B,OAAO,EAAE,kBAAkB,oBAAoB,KAAK,EACtD,CAAC,EAAA,CACD,mBACF,oBACF,EACJ,CAAC;CAED,MAAM,qBAAqB;EACzB,kBAAkB,OAAO;CAC3B;CAEA,MAAM,aAAaC,MAAM,kBAAkB;EACzC,eAAe,KAAK;EAEpB,OAAO,kBAAkB,EACvB,UAAUC,sCAAAA,sBAAsB,UAAU,EAC5C,CAAC;CACH,GAAG,CAAC,QAAQ,YAAY,CAAC;CAEzB,OACE,iBAAA,GAAA,kBAAA,IAAA,CAAA,yCAAA,MAAA;EAAwB;EAAoB;EAAc,GAAI;EAC5D,UAAA,iBAAA,GAAA,kBAAA,KAAA,CAAA,yCAAA,SAAA;GAAqB,UAAS;GAA9B,UAAA;IACE,iBAAA,GAAA,kBAAA,IAAA,CAAA,yCAAA,OAAA,EAAA,UACE,iBAAA,GAAA,kBAAA,IAAA,CAACC,6BAAAA,aAAD;KACE,gBAAe;KACf,IAAG;KACH,aAAY;IACb,CAAA,EACgB,CAAA;IACnB,iBAAA,GAAA,kBAAA,IAAA,CAAA,yCAAA,aAAA,EAAA,UACE,iBAAA,GAAA,kBAAA,IAAA,CAACA,6BAAAA,aAAD;KACE,gBAAe;KACf,IAAG;KACH,aAAY;IACb,CAAA,EACsB,CAAA;IAEzB,iBAAA,GAAA,kBAAA,IAAA,CAACC,iBAAAA,MAAD;KAAM,KAAI;KAAI,SAAQ;KAAM,IAAG;KAAI,SAAA;KACjC,UAAA,iBAAA,GAAA,kBAAA,KAAA,CAAC,QAAD;MACE,WAAW,UAAU;OACnB,MAAM,eAAe;OACrB,aAAa;MACf;MAJF,UAAA,CAME,iBAAA,GAAA,kBAAA,IAAA,CAAA,yCAAA,QAAA,EAAA,UACE,iBAAA,GAAA,kBAAA,IAAA,CAACC,mCAAAA,QAAD;OACE,SAAQ;OACR,UACE,kBAAkB,aAAa,kBAAkB;OAGnD,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAACF,6BAAAA,aAAD;QACE,gBAAe;QACf,IAAG;QACH,aAAY;OACb,CAAA;MACK,CAAA,EACU,CAAA,GAEpB,iBAAA,GAAA,kBAAA,IAAA,CAACG,+BAAAA,YAAD;OACE,SAAA;OACA,SAAS,kBAAkB;OAC3B,MAAM,kBAAkB;OACxB,QAAQ;OAER,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAACD,mCAAAA,QAAD;QAAQ,SAAQ;QAAc,MAAK;QACjC,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAACF,6BAAAA,aAAD;SACE,gBAAe;SACf,IAAG;SACH,aAAY;QACb,CAAA;OACK,CAAA;MACE,CAAA,CACR;;IACF,CAAA;GACa;;CACL,CAAA;AAEtB"}
@@ -1,6 +1,7 @@
1
1
  "use client";
2
2
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
3
  const require_runtime = require("../../_virtual/_rolldown/runtime.cjs");
4
+ const require_api_client_graphql_query_keys = require("../../api/client-graphql/query-keys.cjs");
4
5
  const require_api_client_graphql_hooks = require("../../api/client-graphql/hooks.cjs");
5
6
  const require_components_elements_button = require("../../components/elements/button.cjs");
6
7
  const require_lib_i18n_use_translation = require("../../lib/i18n/use-translation.cjs");
@@ -29,7 +30,7 @@ const LogoutDialog = ({ children, session, open, onOpenChange, ...props }) => {
29
30
  const handleDone = react.useCallback(() => {
30
31
  onOpenChange?.(false);
31
32
  client.invalidateQueries({
32
- queryKey: require_api_client_graphql_hooks.clientGraphqlQueryKey("Sessions"),
33
+ queryKey: require_api_client_graphql_query_keys.clientGraphqlQueryKey("Sessions"),
33
34
  exact: false
34
35
  });
35
36
  }, [onOpenChange, client]);
@@ -1 +1 @@
1
- {"version":3,"file":"logout-dialog.cjs","names":["useQueryClient","useTranslation","parseUserAgent","useClientGraphqlMutation","expectResultMember","React","clientGraphqlQueryKey","Translation","Strong","Flex","Button","SaveButton"],"sources":["../../../../src/widgets/user-sessions/logout-dialog.tsx"],"sourcesContent":["\"use client\";\n\nimport { Flex, Strong } from \"@radix-ui/themes\";\nimport { useQueryClient } from \"@tanstack/react-query\";\nimport * as React from \"react\";\nimport type { ReactNode } from \"react\";\nimport type { SessionFieldsFragment } from \"../../api/client-graphql/generated.js\";\nimport {\n clientGraphqlQueryKey,\n useClientGraphqlMutation,\n} from \"../../api/client-graphql/hooks.js\";\nimport { AlertDialog, Button } from \"../../components/elements.js\";\nimport { SaveButton } from \"../../components/save-button.js\";\nimport { expectResultMember } from \"../../lib/client-graphql-result.js\";\nimport { Translation } from \"../../lib/i18n/translation.js\";\nimport { useTranslation } from \"../../lib/i18n/use-translation.js\";\nimport { parseUserAgent } from \"../../lib/parse-user-agent.js\";\n\ninterface LogoutDialogProps extends AlertDialog.RootProps {\n children?: ReactNode;\n session: SessionFieldsFragment;\n}\n\nconst LogoutDialog: React.FC<LogoutDialogProps> = ({\n children,\n session,\n open,\n onOpenChange,\n ...props\n}) => {\n const client = useQueryClient();\n const translate = useTranslation();\n const device =\n parseUserAgent(session.userAgent)?.pretty ??\n translate({\n defaultMessage: \"Unknown device\",\n id: \"nF+P+T\",\n description:\n \"Label for a session whose device could not be determined from its user agent\",\n });\n\n const revokeSession = useClientGraphqlMutation({\n mutationFn: async (sdk, sessionId: string) =>\n expectResultMember(\n (await sdk.RevokeSession({ input: { sessionId } })).revokeSession,\n \"SessionRevoked\",\n ),\n });\n\n const handleDone = React.useCallback(() => {\n onOpenChange?.(false);\n\n client.invalidateQueries({\n queryKey: clientGraphqlQueryKey(\"Sessions\"),\n exact: false,\n });\n }, [onOpenChange, client]);\n\n const onSubmitForm = () => {\n revokeSession.mutate(session.id);\n };\n\n return (\n <AlertDialog.Root open={open} onOpenChange={onOpenChange} {...props}>\n <AlertDialog.Content maxWidth=\"480px\">\n <AlertDialog.Title>\n <Translation\n defaultMessage=\"Sign out of device?\"\n id=\"Jic5nB\"\n description=\"Dialog title asking to confirm signing out of a device\"\n />\n </AlertDialog.Title>\n <AlertDialog.Description>\n <Translation\n defaultMessage=\"You will be signed out of {device}.\"\n id=\"diFnRK\"\n description=\"Description explaining the user will be signed out of a specific device\"\n values={{ device: <Strong>{device}</Strong> }}\n />\n </AlertDialog.Description>\n\n <Flex gap=\"3\" justify=\"end\" mt=\"5\" asChild>\n <form\n onSubmit={(event) => {\n event.preventDefault();\n onSubmitForm();\n }}\n >\n <AlertDialog.Cancel>\n <Button\n variant=\"secondary\"\n disabled={revokeSession.isPending || revokeSession.isSuccess}\n >\n <Translation\n defaultMessage=\"Cancel\"\n id=\"KjY2RX\"\n description=\"Button to cancel the logout action\"\n />\n </Button>\n </AlertDialog.Cancel>\n\n <SaveButton\n asChild\n loading={revokeSession.isPending}\n done={revokeSession.isSuccess}\n onDone={handleDone}\n >\n <Button variant=\"destructive\" type=\"submit\">\n <Translation\n defaultMessage=\"Sign out\"\n id=\"tRJt/S\"\n description=\"Button to confirm signing out of device\"\n />\n </Button>\n </SaveButton>\n </form>\n </Flex>\n </AlertDialog.Content>\n </AlertDialog.Root>\n );\n};\nexport { LogoutDialog };\n"],"mappings":";;;;;;;;;;;;;;;;;;;AAuBA,MAAM,gBAA6C,EACjD,UACA,SACA,MACA,cACA,GAAG,YACC;CACJ,MAAM,UAAA,GAASA,sBAAAA,eAAAA,CAAe;CAC9B,MAAM,YAAYC,iCAAAA,eAAe;CACjC,MAAM,SACJC,6BAAAA,eAAe,QAAQ,SAAS,CAAC,EAAE,UACnC,UAAU;EACR,gBAAgB;EAChB,IAAI;EACJ,aACE;CACJ,CAAC;CAEH,MAAM,gBAAgBC,iCAAAA,yBAAyB,EAC7C,YAAY,OAAO,KAAK,cACtBC,kCAAAA,oBACG,MAAM,IAAI,cAAc,EAAE,OAAO,EAAE,UAAU,EAAE,CAAC,EAAA,CAAG,eACpD,gBACF,EACJ,CAAC;CAED,MAAM,aAAaC,MAAM,kBAAkB;EACzC,eAAe,KAAK;EAEpB,OAAO,kBAAkB;GACvB,UAAUC,iCAAAA,sBAAsB,UAAU;GAC1C,OAAO;EACT,CAAC;CACH,GAAG,CAAC,cAAc,MAAM,CAAC;CAEzB,MAAM,qBAAqB;EACzB,cAAc,OAAO,QAAQ,EAAE;CACjC;CAEA,OACE,iBAAA,GAAA,kBAAA,IAAA,CAAA,yCAAA,MAAA;EAAwB;EAAoB;EAAc,GAAI;EAC5D,UAAA,iBAAA,GAAA,kBAAA,KAAA,CAAA,yCAAA,SAAA;GAAqB,UAAS;GAA9B,UAAA;IACE,iBAAA,GAAA,kBAAA,IAAA,CAAA,yCAAA,OAAA,EAAA,UACE,iBAAA,GAAA,kBAAA,IAAA,CAACC,6BAAAA,aAAD;KACE,gBAAe;KACf,IAAG;KACH,aAAY;IACb,CAAA,EACgB,CAAA;IACnB,iBAAA,GAAA,kBAAA,IAAA,CAAA,yCAAA,aAAA,EAAA,UACE,iBAAA,GAAA,kBAAA,IAAA,CAACA,6BAAAA,aAAD;KACE,gBAAe;KACf,IAAG;KACH,aAAY;KACZ,QAAQ,EAAE,QAAQ,iBAAA,GAAA,kBAAA,IAAA,CAACC,iBAAAA,QAAD,EAAA,UAAS,OAAe,CAAA,EAAE;IAC7C,CAAA,EACsB,CAAA;IAEzB,iBAAA,GAAA,kBAAA,IAAA,CAACC,iBAAAA,MAAD;KAAM,KAAI;KAAI,SAAQ;KAAM,IAAG;KAAI,SAAA;KACjC,UAAA,iBAAA,GAAA,kBAAA,KAAA,CAAC,QAAD;MACE,WAAW,UAAU;OACnB,MAAM,eAAe;OACrB,aAAa;MACf;MAJF,UAAA,CAME,iBAAA,GAAA,kBAAA,IAAA,CAAA,yCAAA,QAAA,EAAA,UACE,iBAAA,GAAA,kBAAA,IAAA,CAACC,mCAAAA,QAAD;OACE,SAAQ;OACR,UAAU,cAAc,aAAa,cAAc;OAEnD,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAACH,6BAAAA,aAAD;QACE,gBAAe;QACf,IAAG;QACH,aAAY;OACb,CAAA;MACK,CAAA,EACU,CAAA,GAEpB,iBAAA,GAAA,kBAAA,IAAA,CAACI,+BAAAA,YAAD;OACE,SAAA;OACA,SAAS,cAAc;OACvB,MAAM,cAAc;OACpB,QAAQ;OAER,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAACD,mCAAAA,QAAD;QAAQ,SAAQ;QAAc,MAAK;QACjC,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAACH,6BAAAA,aAAD;SACE,gBAAe;SACf,IAAG;SACH,aAAY;QACb,CAAA;OACK,CAAA;MACE,CAAA,CACR;;IACF,CAAA;GACa;;CACL,CAAA;AAEtB"}
1
+ {"version":3,"file":"logout-dialog.cjs","names":["useQueryClient","useTranslation","parseUserAgent","useClientGraphqlMutation","expectResultMember","React","clientGraphqlQueryKey","Translation","Strong","Flex","Button","SaveButton"],"sources":["../../../../src/widgets/user-sessions/logout-dialog.tsx"],"sourcesContent":["\"use client\";\n\nimport { Flex, Strong } from \"@radix-ui/themes\";\nimport { useQueryClient } from \"@tanstack/react-query\";\nimport * as React from \"react\";\nimport type { ReactNode } from \"react\";\nimport type { SessionFieldsFragment } from \"../../api/client-graphql/generated.js\";\nimport {\n clientGraphqlQueryKey,\n useClientGraphqlMutation,\n} from \"../../api/client-graphql/hooks.js\";\nimport { AlertDialog, Button } from \"../../components/elements.js\";\nimport { SaveButton } from \"../../components/save-button.js\";\nimport { expectResultMember } from \"../../lib/client-graphql-result.js\";\nimport { Translation } from \"../../lib/i18n/translation.js\";\nimport { useTranslation } from \"../../lib/i18n/use-translation.js\";\nimport { parseUserAgent } from \"../../lib/parse-user-agent.js\";\n\ninterface LogoutDialogProps extends AlertDialog.RootProps {\n children?: ReactNode;\n session: SessionFieldsFragment;\n}\n\nconst LogoutDialog: React.FC<LogoutDialogProps> = ({\n children,\n session,\n open,\n onOpenChange,\n ...props\n}) => {\n const client = useQueryClient();\n const translate = useTranslation();\n const device =\n parseUserAgent(session.userAgent)?.pretty ??\n translate({\n defaultMessage: \"Unknown device\",\n id: \"nF+P+T\",\n description:\n \"Label for a session whose device could not be determined from its user agent\",\n });\n\n const revokeSession = useClientGraphqlMutation({\n mutationFn: async (sdk, sessionId: string) =>\n expectResultMember(\n (await sdk.RevokeSession({ input: { sessionId } })).revokeSession,\n \"SessionRevoked\",\n ),\n });\n\n const handleDone = React.useCallback(() => {\n onOpenChange?.(false);\n\n client.invalidateQueries({\n queryKey: clientGraphqlQueryKey(\"Sessions\"),\n exact: false,\n });\n }, [onOpenChange, client]);\n\n const onSubmitForm = () => {\n revokeSession.mutate(session.id);\n };\n\n return (\n <AlertDialog.Root open={open} onOpenChange={onOpenChange} {...props}>\n <AlertDialog.Content maxWidth=\"480px\">\n <AlertDialog.Title>\n <Translation\n defaultMessage=\"Sign out of device?\"\n id=\"Jic5nB\"\n description=\"Dialog title asking to confirm signing out of a device\"\n />\n </AlertDialog.Title>\n <AlertDialog.Description>\n <Translation\n defaultMessage=\"You will be signed out of {device}.\"\n id=\"diFnRK\"\n description=\"Description explaining the user will be signed out of a specific device\"\n values={{ device: <Strong>{device}</Strong> }}\n />\n </AlertDialog.Description>\n\n <Flex gap=\"3\" justify=\"end\" mt=\"5\" asChild>\n <form\n onSubmit={(event) => {\n event.preventDefault();\n onSubmitForm();\n }}\n >\n <AlertDialog.Cancel>\n <Button\n variant=\"secondary\"\n disabled={revokeSession.isPending || revokeSession.isSuccess}\n >\n <Translation\n defaultMessage=\"Cancel\"\n id=\"KjY2RX\"\n description=\"Button to cancel the logout action\"\n />\n </Button>\n </AlertDialog.Cancel>\n\n <SaveButton\n asChild\n loading={revokeSession.isPending}\n done={revokeSession.isSuccess}\n onDone={handleDone}\n >\n <Button variant=\"destructive\" type=\"submit\">\n <Translation\n defaultMessage=\"Sign out\"\n id=\"tRJt/S\"\n description=\"Button to confirm signing out of device\"\n />\n </Button>\n </SaveButton>\n </form>\n </Flex>\n </AlertDialog.Content>\n </AlertDialog.Root>\n );\n};\nexport { LogoutDialog };\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAuBA,MAAM,gBAA6C,EACjD,UACA,SACA,MACA,cACA,GAAG,YACC;CACJ,MAAM,UAAA,GAASA,sBAAAA,eAAAA,CAAe;CAC9B,MAAM,YAAYC,iCAAAA,eAAe;CACjC,MAAM,SACJC,6BAAAA,eAAe,QAAQ,SAAS,CAAC,EAAE,UACnC,UAAU;EACR,gBAAgB;EAChB,IAAI;EACJ,aACE;CACJ,CAAC;CAEH,MAAM,gBAAgBC,iCAAAA,yBAAyB,EAC7C,YAAY,OAAO,KAAK,cACtBC,kCAAAA,oBACG,MAAM,IAAI,cAAc,EAAE,OAAO,EAAE,UAAU,EAAE,CAAC,EAAA,CAAG,eACpD,gBACF,EACJ,CAAC;CAED,MAAM,aAAaC,MAAM,kBAAkB;EACzC,eAAe,KAAK;EAEpB,OAAO,kBAAkB;GACvB,UAAUC,sCAAAA,sBAAsB,UAAU;GAC1C,OAAO;EACT,CAAC;CACH,GAAG,CAAC,cAAc,MAAM,CAAC;CAEzB,MAAM,qBAAqB;EACzB,cAAc,OAAO,QAAQ,EAAE;CACjC;CAEA,OACE,iBAAA,GAAA,kBAAA,IAAA,CAAA,yCAAA,MAAA;EAAwB;EAAoB;EAAc,GAAI;EAC5D,UAAA,iBAAA,GAAA,kBAAA,KAAA,CAAA,yCAAA,SAAA;GAAqB,UAAS;GAA9B,UAAA;IACE,iBAAA,GAAA,kBAAA,IAAA,CAAA,yCAAA,OAAA,EAAA,UACE,iBAAA,GAAA,kBAAA,IAAA,CAACC,6BAAAA,aAAD;KACE,gBAAe;KACf,IAAG;KACH,aAAY;IACb,CAAA,EACgB,CAAA;IACnB,iBAAA,GAAA,kBAAA,IAAA,CAAA,yCAAA,aAAA,EAAA,UACE,iBAAA,GAAA,kBAAA,IAAA,CAACA,6BAAAA,aAAD;KACE,gBAAe;KACf,IAAG;KACH,aAAY;KACZ,QAAQ,EAAE,QAAQ,iBAAA,GAAA,kBAAA,IAAA,CAACC,iBAAAA,QAAD,EAAA,UAAS,OAAe,CAAA,EAAE;IAC7C,CAAA,EACsB,CAAA;IAEzB,iBAAA,GAAA,kBAAA,IAAA,CAACC,iBAAAA,MAAD;KAAM,KAAI;KAAI,SAAQ;KAAM,IAAG;KAAI,SAAA;KACjC,UAAA,iBAAA,GAAA,kBAAA,KAAA,CAAC,QAAD;MACE,WAAW,UAAU;OACnB,MAAM,eAAe;OACrB,aAAa;MACf;MAJF,UAAA,CAME,iBAAA,GAAA,kBAAA,IAAA,CAAA,yCAAA,QAAA,EAAA,UACE,iBAAA,GAAA,kBAAA,IAAA,CAACC,mCAAAA,QAAD;OACE,SAAQ;OACR,UAAU,cAAc,aAAa,cAAc;OAEnD,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAACH,6BAAAA,aAAD;QACE,gBAAe;QACf,IAAG;QACH,aAAY;OACb,CAAA;MACK,CAAA,EACU,CAAA,GAEpB,iBAAA,GAAA,kBAAA,IAAA,CAACI,+BAAAA,YAAD;OACE,SAAA;OACA,SAAS,cAAc;OACvB,MAAM,cAAc;OACpB,QAAQ;OAER,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAACD,mCAAAA,QAAD;QAAQ,SAAQ;QAAc,MAAK;QACjC,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAACH,6BAAAA,aAAD;SACE,gBAAe;SACf,IAAG;SACH,aAAY;QACb,CAAA;OACK,CAAA;MACE,CAAA,CACR;;IACF,CAAA;GACa;;CACL,CAAA;AAEtB"}
@@ -1,5 +1,6 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
2
  require("../../lib/constants.cjs");
3
+ const require_api_client_graphql_query_keys = require("../../api/client-graphql/query-keys.cjs");
3
4
  const require_api_errors = require("../../api/errors.cjs");
4
5
  const require_api_client_graphql_hooks = require("../../api/client-graphql/hooks.cjs");
5
6
  const require_widgets_users_management_users_management_context = require("./users-management-context.cjs");
@@ -34,7 +35,7 @@ const EMPTY_ROLES_AND_CONFIG = { roles: {
34
35
  } };
35
36
  function useRolesAndConfig() {
36
37
  return require_api_client_graphql_hooks.useClientGraphqlQuery({
37
- queryKey: require_api_client_graphql_hooks.clientGraphqlQueryKey("ListRoles"),
38
+ queryKey: require_api_client_graphql_query_keys.clientGraphqlQueryKey("ListRoles"),
38
39
  queryFn: (sdk) => sdk.ListRoles(),
39
40
  select: (data) => data.roles,
40
41
  initialData: EMPTY_ROLES_AND_CONFIG
@@ -51,7 +52,7 @@ function useUsers(context) {
51
52
  search: searchQuery ?? null
52
53
  };
53
54
  return require_api_client_graphql_hooks.useClientGraphqlQuery({
54
- queryKey: require_api_client_graphql_hooks.clientGraphqlQueryKey("ListOrganizationMemberships", variables),
55
+ queryKey: require_api_client_graphql_query_keys.clientGraphqlQueryKey("ListOrganizationMemberships", variables),
55
56
  queryFn: (sdk) => sdk.ListOrganizationMemberships(variables),
56
57
  select: toMembersQueryResult,
57
58
  placeholderData: _tanstack_react_query.keepPreviousData
@@ -59,7 +60,7 @@ function useUsers(context) {
59
60
  }
60
61
  function useInvalidateMembers() {
61
62
  const queryClient = (0, _tanstack_react_query.useQueryClient)();
62
- return () => queryClient.invalidateQueries({ queryKey: require_api_client_graphql_hooks.clientGraphqlQueryKey("ListOrganizationMemberships") });
63
+ return () => queryClient.invalidateQueries({ queryKey: require_api_client_graphql_query_keys.clientGraphqlQueryKey("ListOrganizationMemberships") });
63
64
  }
64
65
  function mutationFailure(typename, message) {
65
66
  return new require_api_errors.ApiError({
@@ -1 +1 @@
1
- {"version":3,"file":"users-management-utils.cjs","names":["useClientGraphqlQuery","clientGraphqlQueryKey","useUsersManagementContext","keepPreviousData","useQueryClient","ApiError"],"sources":["../../../../src/widgets/users-management/users-management-utils.ts"],"sourcesContent":["import type { UseQueryResult } from \"@tanstack/react-query\";\nimport { keepPreviousData, useQueryClient } from \"@tanstack/react-query\";\nimport type {\n InviteUserMutation,\n ListOrganizationMembershipsQuery,\n ListRolesQuery,\n OrganizationMemberAction,\n OrganizationMemberFieldsFragment,\n RemoveMemberMutation,\n ResendInvitationMutation,\n RevokeInvitationMutation,\n RoleFieldsFragment,\n UpdateMemberRoleMutation,\n} from \"../../api/client-graphql/generated.js\";\nimport {\n clientGraphqlQueryKey,\n useClientGraphqlQuery,\n} from \"../../api/client-graphql/hooks.js\";\nimport { ApiError } from \"../../api/errors.js\";\nimport type { ListMetadata } from \"../../lib/api/types.js\";\nimport { USER_ROW_LIMIT } from \"../../lib/constants.js\";\nimport { useUsersManagementContext } from \"./users-management-context.js\";\nimport type { UsersManagementContextValue } from \"./users-management-context.js\";\n\nexport type Role = RoleFieldsFragment;\n\nexport type RolesAndConfig = ListRolesQuery[\"roles\"];\n\nexport interface Member extends Omit<\n OrganizationMemberFieldsFragment,\n \"actions\"\n> {\n actions: MemberAction[];\n isLoggedInUser: boolean;\n}\n\nexport interface MembersQueryResult {\n data: Member[];\n listMetadata: ListMetadata;\n}\n\nconst MemberActions = {\n EditRole: \"edit-role\",\n ResendInvite: \"resend-invite\",\n RevokeInvite: \"revoke-invite\",\n RevokeMembership: \"revoke-membership\",\n} as const satisfies Record<OrganizationMemberAction, string>;\n\ntype MemberAction = (typeof MemberActions)[keyof typeof MemberActions];\n\nfunction toMember(member: OrganizationMemberFieldsFragment): Member {\n return {\n ...member,\n actions: member.actions.map((action) => MemberActions[action]),\n isLoggedInUser: member.isCurrentUser,\n };\n}\n\nfunction toMembersQueryResult(\n data: ListOrganizationMembershipsQuery,\n): MembersQueryResult {\n const { organizationMemberships } = data;\n return {\n data: organizationMemberships.data.map(toMember),\n listMetadata: {\n before: organizationMemberships.listMetadata.before ?? null,\n after: organizationMemberships.listMetadata.after ?? null,\n },\n };\n}\n\nexport const EMPTY_ROLES_AND_CONFIG: Readonly<ListRolesQuery> = {\n roles: { multipleRolesEnabled: false, roles: [] },\n};\n\nexport function useRolesAndConfig(): UseQueryResult<RolesAndConfig> {\n return useClientGraphqlQuery({\n queryKey: clientGraphqlQueryKey(\"ListRoles\"),\n queryFn: (sdk) => sdk.ListRoles(),\n select: (data) => data.roles,\n initialData: EMPTY_ROLES_AND_CONFIG,\n });\n}\n\nexport function useUsers(context?: UsersManagementContextValue) {\n const {\n state: { pagination, role, searchQuery },\n } = useUsersManagementContext(context);\n const { before, after } = pagination || {};\n const variables = {\n after: after ?? null,\n before: before ?? null,\n limit: USER_ROW_LIMIT,\n roleSlug: role ?? null,\n search: searchQuery ?? null,\n };\n\n return useClientGraphqlQuery({\n queryKey: clientGraphqlQueryKey(\"ListOrganizationMemberships\", variables),\n queryFn: (sdk) => sdk.ListOrganizationMemberships(variables),\n select: toMembersQueryResult,\n placeholderData: keepPreviousData,\n });\n}\n\nexport function useInvalidateMembers() {\n const queryClient = useQueryClient();\n return () =>\n queryClient.invalidateQueries({\n queryKey: clientGraphqlQueryKey(\"ListOrganizationMemberships\"),\n });\n}\n\nfunction mutationFailure(typename: string, message: string): ApiError {\n return new ApiError({\n message,\n status: 400,\n queryType: \"mutation\",\n context: { typename },\n });\n}\n\nexport function unwrapUpdateMemberRole(\n result: UpdateMemberRoleMutation[\"updateMemberRole\"],\n) {\n switch (result.__typename) {\n case \"MemberRoleUpdated\":\n return result.member;\n case \"MemberNotFound\":\n throw mutationFailure(result.__typename, \"Cannot edit role for user\");\n case \"RoleNotFound\":\n throw mutationFailure(result.__typename, \"Invalid role\");\n }\n}\n\nexport function unwrapInviteUser(result: InviteUserMutation[\"inviteUser\"]) {\n switch (result.__typename) {\n case \"UserInvited\":\n return result.invitation;\n case \"InviteeAlreadyMember\":\n throw mutationFailure(result.__typename, \"User already exists\");\n case \"InviteeAlreadyInvited\":\n throw mutationFailure(result.__typename, \"User already invited\");\n case \"InvalidInviteeEmail\":\n case \"InviteeEmailNotDeliverable\":\n throw mutationFailure(result.__typename, \"Invalid email\");\n case \"InvalidInviteeRole\":\n throw mutationFailure(result.__typename, \"Invalid role\");\n case \"InvalidInvitationExpiry\":\n throw mutationFailure(result.__typename, \"Invalid input\");\n case \"OrganizationBlockedFromSendingInvites\":\n throw mutationFailure(\n result.__typename,\n \"This organization is not allowed to send invites.\",\n );\n }\n}\n\nexport function unwrapRemoveMember(\n result: RemoveMemberMutation[\"removeMember\"],\n) {\n switch (result.__typename) {\n case \"MemberRemoved\":\n return result;\n case \"MemberNotFound\":\n case \"MemberIsManagedByDirectory\":\n throw mutationFailure(result.__typename, \"Cannot revoke membership\");\n }\n}\n\nexport function unwrapRevokeInvitation(\n result: RevokeInvitationMutation[\"revokeInvitation\"],\n) {\n switch (result.__typename) {\n case \"InvitationRevoked\":\n return result.invitation;\n case \"InvitationNotFound\":\n throw mutationFailure(result.__typename, \"User not invited\");\n case \"InvitationNotPending\":\n throw mutationFailure(result.__typename, \"User already accepted invite\");\n }\n}\n\nexport function unwrapResendInvitation(\n result: ResendInvitationMutation[\"resendInvitation\"],\n) {\n switch (result.__typename) {\n case \"InvitationResent\":\n return result.invitation;\n case \"ResendInvitationNotFound\":\n throw mutationFailure(result.__typename, \"User not invited\");\n case \"InviteeAlreadyAccepted\":\n throw mutationFailure(result.__typename, \"User already accepted invite\");\n case \"InviteeEmailNotDeliverable\":\n throw mutationFailure(result.__typename, \"Invalid email\");\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"users-management-utils.cjs","names":["useClientGraphqlQuery","clientGraphqlQueryKey","useUsersManagementContext","keepPreviousData","useQueryClient","ApiError"],"sources":["../../../../src/widgets/users-management/users-management-utils.ts"],"sourcesContent":["import type { UseQueryResult } from \"@tanstack/react-query\";\nimport { keepPreviousData, useQueryClient } from \"@tanstack/react-query\";\nimport type {\n InviteUserMutation,\n ListOrganizationMembershipsQuery,\n ListRolesQuery,\n OrganizationMemberAction,\n OrganizationMemberFieldsFragment,\n RemoveMemberMutation,\n ResendInvitationMutation,\n RevokeInvitationMutation,\n RoleFieldsFragment,\n UpdateMemberRoleMutation,\n} from \"../../api/client-graphql/generated.js\";\nimport {\n clientGraphqlQueryKey,\n useClientGraphqlQuery,\n} from \"../../api/client-graphql/hooks.js\";\nimport { ApiError } from \"../../api/errors.js\";\nimport type { ListMetadata } from \"../../lib/api/types.js\";\nimport { USER_ROW_LIMIT } from \"../../lib/constants.js\";\nimport { useUsersManagementContext } from \"./users-management-context.js\";\nimport type { UsersManagementContextValue } from \"./users-management-context.js\";\n\nexport type Role = RoleFieldsFragment;\n\nexport type RolesAndConfig = ListRolesQuery[\"roles\"];\n\nexport interface Member extends Omit<\n OrganizationMemberFieldsFragment,\n \"actions\"\n> {\n actions: MemberAction[];\n isLoggedInUser: boolean;\n}\n\nexport interface MembersQueryResult {\n data: Member[];\n listMetadata: ListMetadata;\n}\n\nconst MemberActions = {\n EditRole: \"edit-role\",\n ResendInvite: \"resend-invite\",\n RevokeInvite: \"revoke-invite\",\n RevokeMembership: \"revoke-membership\",\n} as const satisfies Record<OrganizationMemberAction, string>;\n\ntype MemberAction = (typeof MemberActions)[keyof typeof MemberActions];\n\nfunction toMember(member: OrganizationMemberFieldsFragment): Member {\n return {\n ...member,\n actions: member.actions.map((action) => MemberActions[action]),\n isLoggedInUser: member.isCurrentUser,\n };\n}\n\nfunction toMembersQueryResult(\n data: ListOrganizationMembershipsQuery,\n): MembersQueryResult {\n const { organizationMemberships } = data;\n return {\n data: organizationMemberships.data.map(toMember),\n listMetadata: {\n before: organizationMemberships.listMetadata.before ?? null,\n after: organizationMemberships.listMetadata.after ?? null,\n },\n };\n}\n\nexport const EMPTY_ROLES_AND_CONFIG: Readonly<ListRolesQuery> = {\n roles: { multipleRolesEnabled: false, roles: [] },\n};\n\nexport function useRolesAndConfig(): UseQueryResult<RolesAndConfig> {\n return useClientGraphqlQuery({\n queryKey: clientGraphqlQueryKey(\"ListRoles\"),\n queryFn: (sdk) => sdk.ListRoles(),\n select: (data) => data.roles,\n initialData: EMPTY_ROLES_AND_CONFIG,\n });\n}\n\nexport function useUsers(context?: UsersManagementContextValue) {\n const {\n state: { pagination, role, searchQuery },\n } = useUsersManagementContext(context);\n const { before, after } = pagination || {};\n const variables = {\n after: after ?? null,\n before: before ?? null,\n limit: USER_ROW_LIMIT,\n roleSlug: role ?? null,\n search: searchQuery ?? null,\n };\n\n return useClientGraphqlQuery({\n queryKey: clientGraphqlQueryKey(\"ListOrganizationMemberships\", variables),\n queryFn: (sdk) => sdk.ListOrganizationMemberships(variables),\n select: toMembersQueryResult,\n placeholderData: keepPreviousData,\n });\n}\n\nexport function useInvalidateMembers() {\n const queryClient = useQueryClient();\n return () =>\n queryClient.invalidateQueries({\n queryKey: clientGraphqlQueryKey(\"ListOrganizationMemberships\"),\n });\n}\n\nfunction mutationFailure(typename: string, message: string): ApiError {\n return new ApiError({\n message,\n status: 400,\n queryType: \"mutation\",\n context: { typename },\n });\n}\n\nexport function unwrapUpdateMemberRole(\n result: UpdateMemberRoleMutation[\"updateMemberRole\"],\n) {\n switch (result.__typename) {\n case \"MemberRoleUpdated\":\n return result.member;\n case \"MemberNotFound\":\n throw mutationFailure(result.__typename, \"Cannot edit role for user\");\n case \"RoleNotFound\":\n throw mutationFailure(result.__typename, \"Invalid role\");\n }\n}\n\nexport function unwrapInviteUser(result: InviteUserMutation[\"inviteUser\"]) {\n switch (result.__typename) {\n case \"UserInvited\":\n return result.invitation;\n case \"InviteeAlreadyMember\":\n throw mutationFailure(result.__typename, \"User already exists\");\n case \"InviteeAlreadyInvited\":\n throw mutationFailure(result.__typename, \"User already invited\");\n case \"InvalidInviteeEmail\":\n case \"InviteeEmailNotDeliverable\":\n throw mutationFailure(result.__typename, \"Invalid email\");\n case \"InvalidInviteeRole\":\n throw mutationFailure(result.__typename, \"Invalid role\");\n case \"InvalidInvitationExpiry\":\n throw mutationFailure(result.__typename, \"Invalid input\");\n case \"OrganizationBlockedFromSendingInvites\":\n throw mutationFailure(\n result.__typename,\n \"This organization is not allowed to send invites.\",\n );\n }\n}\n\nexport function unwrapRemoveMember(\n result: RemoveMemberMutation[\"removeMember\"],\n) {\n switch (result.__typename) {\n case \"MemberRemoved\":\n return result;\n case \"MemberNotFound\":\n case \"MemberIsManagedByDirectory\":\n throw mutationFailure(result.__typename, \"Cannot revoke membership\");\n }\n}\n\nexport function unwrapRevokeInvitation(\n result: RevokeInvitationMutation[\"revokeInvitation\"],\n) {\n switch (result.__typename) {\n case \"InvitationRevoked\":\n return result.invitation;\n case \"InvitationNotFound\":\n throw mutationFailure(result.__typename, \"User not invited\");\n case \"InvitationNotPending\":\n throw mutationFailure(result.__typename, \"User already accepted invite\");\n }\n}\n\nexport function unwrapResendInvitation(\n result: ResendInvitationMutation[\"resendInvitation\"],\n) {\n switch (result.__typename) {\n case \"InvitationResent\":\n return result.invitation;\n case \"ResendInvitationNotFound\":\n throw mutationFailure(result.__typename, \"User not invited\");\n case \"InviteeAlreadyAccepted\":\n throw mutationFailure(result.__typename, \"User already accepted invite\");\n case \"InviteeEmailNotDeliverable\":\n throw mutationFailure(result.__typename, \"Invalid email\");\n }\n}\n"],"mappings":"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"}
@@ -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 { AdminPortalAuditLogStreaming as AdminPortalAuditLogStreaming$1, AdminPortalAuditLogStreamingButton, AdminPortalAuditLogStreamingError, AdminPortalAuditLogStreamingLoading } from "./widgets/admin-portal-audit-log-streaming/admin-portal-audit-log-streaming.js";
7
8
  import "react";
@@ -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"}
@@ -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"}