@workos-inc/widgets 1.8.2 → 1.9.0
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.
- package/CHANGELOG.md +5 -0
- package/dist/cjs/api/api-provider.cjs.map +1 -1
- package/dist/cjs/api/api-provider.d.cts +1 -1
- package/dist/cjs/api/endpoint.cjs +702 -623
- package/dist/cjs/api/endpoint.cjs.map +1 -1
- package/dist/cjs/api/endpoint.d.cts +810 -729
- package/dist/cjs/directory-sync.client.cjs +143 -0
- package/dist/cjs/directory-sync.client.cjs.map +1 -0
- package/dist/cjs/directory-sync.client.d.cts +26 -0
- package/dist/cjs/experimental/api/fetch.cjs +309 -252
- package/dist/cjs/experimental/api/fetch.cjs.map +1 -1
- package/dist/cjs/experimental/api/fetch.d.cts +809 -731
- package/dist/cjs/experimental/api/react-query.cjs +695 -613
- package/dist/cjs/experimental/api/react-query.cjs.map +1 -1
- package/dist/cjs/experimental/api/react-query.d.cts +1355 -1250
- package/dist/cjs/experimental/api/swr.cjs +660 -583
- package/dist/cjs/experimental/api/swr.cjs.map +1 -1
- package/dist/cjs/experimental/api/swr.d.cts +1307 -1212
- package/dist/cjs/index.cjs +5 -0
- package/dist/cjs/index.cjs.map +1 -1
- package/dist/cjs/index.d.cts +2 -0
- package/dist/cjs/lib/api-keys/api-keys-context.cjs +1 -1
- package/dist/cjs/lib/api-keys/api-keys-context.cjs.map +1 -1
- package/dist/cjs/lib/api-keys/api-keys-table.cjs +7 -5
- package/dist/cjs/lib/api-keys/api-keys-table.cjs.map +1 -1
- package/dist/cjs/lib/directory-sync.cjs +288 -0
- package/dist/cjs/lib/directory-sync.cjs.map +1 -0
- package/dist/cjs/lib/directory-sync.d.cts +72 -0
- package/dist/cjs/lib/identity-providers.cjs +57 -1
- package/dist/cjs/lib/identity-providers.cjs.map +1 -1
- package/dist/cjs/lib/identity-providers.d.cts +5 -3
- package/dist/cjs/lib/pipes.cjs +9 -9
- package/dist/cjs/lib/pipes.cjs.map +1 -1
- package/dist/cjs/lib/reset-mfa-dialog.cjs +2 -1
- package/dist/cjs/lib/reset-mfa-dialog.cjs.map +1 -1
- package/dist/cjs/lib/use-permissions.cjs.map +1 -1
- package/dist/cjs/lib/use-permissions.d.cts +1 -1
- package/dist/cjs/lib/users-management-context.cjs +1 -1
- package/dist/cjs/lib/users-management-context.cjs.map +1 -1
- package/dist/cjs/lib/users-management.cjs +3 -3
- package/dist/cjs/lib/users-management.cjs.map +1 -1
- package/dist/cjs/lib/utils.cjs +9 -0
- package/dist/cjs/lib/utils.cjs.map +1 -1
- package/dist/cjs/lib/utils.d.cts +16 -2
- package/dist/esm/api/api-provider.d.ts +1 -1
- package/dist/esm/api/api-provider.js.map +1 -1
- package/dist/esm/api/endpoint.d.ts +810 -729
- package/dist/esm/api/endpoint.js +691 -618
- package/dist/esm/api/endpoint.js.map +1 -1
- package/dist/esm/directory-sync.client.d.ts +26 -0
- package/dist/esm/directory-sync.client.js +121 -0
- package/dist/esm/directory-sync.client.js.map +1 -0
- package/dist/esm/experimental/api/fetch.d.ts +809 -731
- package/dist/esm/experimental/api/fetch.js +300 -247
- package/dist/esm/experimental/api/fetch.js.map +1 -1
- package/dist/esm/experimental/api/react-query.d.ts +1355 -1250
- package/dist/esm/experimental/api/react-query.js +683 -608
- package/dist/esm/experimental/api/react-query.js.map +1 -1
- package/dist/esm/experimental/api/swr.d.ts +1307 -1212
- package/dist/esm/experimental/api/swr.js +649 -578
- package/dist/esm/experimental/api/swr.js.map +1 -1
- package/dist/esm/index.d.ts +2 -0
- package/dist/esm/index.js +6 -0
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/lib/api-keys/api-keys-context.js +1 -1
- package/dist/esm/lib/api-keys/api-keys-context.js.map +1 -1
- package/dist/esm/lib/api-keys/api-keys-table.js +7 -5
- package/dist/esm/lib/api-keys/api-keys-table.js.map +1 -1
- package/dist/esm/lib/directory-sync.d.ts +72 -0
- package/dist/esm/lib/directory-sync.js +259 -0
- package/dist/esm/lib/directory-sync.js.map +1 -0
- package/dist/esm/lib/identity-providers.d.ts +5 -3
- package/dist/esm/lib/identity-providers.js +55 -1
- package/dist/esm/lib/identity-providers.js.map +1 -1
- package/dist/esm/lib/pipes.js +9 -10
- package/dist/esm/lib/pipes.js.map +1 -1
- package/dist/esm/lib/reset-mfa-dialog.js +2 -1
- package/dist/esm/lib/reset-mfa-dialog.js.map +1 -1
- package/dist/esm/lib/use-permissions.d.ts +1 -1
- package/dist/esm/lib/use-permissions.js.map +1 -1
- package/dist/esm/lib/users-management-context.js +1 -1
- package/dist/esm/lib/users-management-context.js.map +1 -1
- package/dist/esm/lib/users-management.js +5 -4
- package/dist/esm/lib/users-management.js.map +1 -1
- package/dist/esm/lib/utils.d.ts +16 -2
- package/dist/esm/lib/utils.js +8 -0
- package/dist/esm/lib/utils.js.map +1 -1
- package/package.json +3 -3
|
@@ -18,6 +18,8 @@ var __copyProps = (to, from, except, desc) => {
|
|
|
18
18
|
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
19
|
var identity_providers_exports = {};
|
|
20
20
|
__export(identity_providers_exports, {
|
|
21
|
+
getDirectoryTypeIcon: () => getDirectoryTypeIcon,
|
|
22
|
+
getDirectoryTypeName: () => getDirectoryTypeName,
|
|
21
23
|
getIdentityProviderName: () => getIdentityProviderName,
|
|
22
24
|
isIdentityProvider: () => isIdentityProvider
|
|
23
25
|
});
|
|
@@ -58,7 +60,7 @@ const IDENTITY_PROVIDER_DICT = /* @__PURE__ */ new Map([
|
|
|
58
60
|
["google-drive", "Google Drive"],
|
|
59
61
|
["google-mail", "Google Mail"],
|
|
60
62
|
["google-cloud", "Google Cloud"],
|
|
61
|
-
["hibob", "
|
|
63
|
+
["hibob", "HiBob"],
|
|
62
64
|
["hubspot", "Hubspot"],
|
|
63
65
|
["intercom", "Intercom"],
|
|
64
66
|
["intuit", "Intuit"],
|
|
@@ -101,11 +103,65 @@ const IDENTITY_PROVIDER_DICT = /* @__PURE__ */ new Map([
|
|
|
101
103
|
function getIdentityProviderName(provider) {
|
|
102
104
|
return IDENTITY_PROVIDER_DICT.get(provider);
|
|
103
105
|
}
|
|
106
|
+
const DIRECTORY_TYPE_TO_ICON = {
|
|
107
|
+
"azure scim v2.0": "azure",
|
|
108
|
+
bamboohr: "bamboohr",
|
|
109
|
+
"breathe hr": "breathe-hr",
|
|
110
|
+
"cezanne hr": "cezanne-hr",
|
|
111
|
+
"cyberark scim v2.0": "cyberark",
|
|
112
|
+
"fourth hr": "fourth",
|
|
113
|
+
"generic scim v2.0": "workos",
|
|
114
|
+
"gsuite directory": "google",
|
|
115
|
+
hibob: "hibob",
|
|
116
|
+
"jump cloud scim v2.0": "jumpcloud",
|
|
117
|
+
"okta scim v2.0": "okta",
|
|
118
|
+
"onelogin scim v2.0": "onelogin",
|
|
119
|
+
"people hr": "access-people-hr",
|
|
120
|
+
personio: "personio",
|
|
121
|
+
"pingfederate scim v2.0": "ping-identity",
|
|
122
|
+
"rippling scim v2.0": "rippling",
|
|
123
|
+
s3: "aws",
|
|
124
|
+
sftp: "workos",
|
|
125
|
+
"sftp workday": "workday",
|
|
126
|
+
workday: "workday",
|
|
127
|
+
pending: "workos"
|
|
128
|
+
};
|
|
129
|
+
const DIRECTORY_TYPE_TO_NAME = {
|
|
130
|
+
"azure scim v2.0": "Microsoft Entra ID",
|
|
131
|
+
bamboohr: "BambooHR",
|
|
132
|
+
"breathe hr": "Breathe HR",
|
|
133
|
+
"cezanne hr": "Cezanne HR",
|
|
134
|
+
"cyberark scim v2.0": "CyberArk",
|
|
135
|
+
"fourth hr": "Fourth HR",
|
|
136
|
+
"generic scim v2.0": "Generic SCIM",
|
|
137
|
+
"gsuite directory": "Google Workspace",
|
|
138
|
+
hibob: "HiBob",
|
|
139
|
+
"jump cloud scim v2.0": "JumpCloud",
|
|
140
|
+
"okta scim v2.0": "Okta",
|
|
141
|
+
"onelogin scim v2.0": "OneLogin",
|
|
142
|
+
"people hr": "People HR",
|
|
143
|
+
personio: "Personio",
|
|
144
|
+
"pingfederate scim v2.0": "PingFederate",
|
|
145
|
+
"rippling scim v2.0": "Rippling",
|
|
146
|
+
s3: "Amazon S3",
|
|
147
|
+
sftp: "SFTP",
|
|
148
|
+
"sftp workday": "Workday (SFTP)",
|
|
149
|
+
workday: "Workday",
|
|
150
|
+
pending: "Pending"
|
|
151
|
+
};
|
|
152
|
+
function getDirectoryTypeIcon(directoryType) {
|
|
153
|
+
return DIRECTORY_TYPE_TO_ICON[directoryType] ?? null;
|
|
154
|
+
}
|
|
155
|
+
function getDirectoryTypeName(directoryType) {
|
|
156
|
+
return DIRECTORY_TYPE_TO_NAME[directoryType] ?? directoryType;
|
|
157
|
+
}
|
|
104
158
|
function isIdentityProvider(provider) {
|
|
105
159
|
return typeof provider === "string" && IDENTITY_PROVIDER_DICT.has(provider);
|
|
106
160
|
}
|
|
107
161
|
// Annotate the CommonJS export names for ESM import in node:
|
|
108
162
|
0 && (module.exports = {
|
|
163
|
+
getDirectoryTypeIcon,
|
|
164
|
+
getDirectoryTypeName,
|
|
109
165
|
getIdentityProviderName,
|
|
110
166
|
isIdentityProvider
|
|
111
167
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/lib/identity-providers.ts"],"sourcesContent":["const IDENTITY_PROVIDER_DICT = new Map([\n [\"access-people-hr\", \"Access People HR\"],\n [\"adp\", \"ADP\"],\n [\"apple\", \"Apple\"],\n [\"asana\", \"Asana\"],\n [\"auth0\", \"Auth0\"],\n [\"azure\", \"Azure\"],\n [\"aws\", \"AWS\"],\n [\"bamboohr\", \"BambooHR\"],\n [\"bamboo-hr\", \"BambooHR\"],\n [\"bitbucket\", \"Bitbucket\"],\n [\"box\", \"Box\"],\n [\"breathe-hr\", \"BreatheHR\"],\n [\"bubble\", \"Bubble\"],\n [\"cas\", \"CAS\"],\n [\"cezanne-hr\", \"Cezanne HR\"],\n [\"classlink\", \"Classlink\"],\n [\"clerk\", \"Clerk\"],\n [\"cloudflare\", \"Cloudflare\"],\n [\"cyberark\", \"CyberArk\"],\n [\"datadog\", \"Datadog\"],\n [\"dropbox\", \"Dropbox\"],\n [\"duo\", \"Duo\"],\n [\"firebase\", \"Firebase\"],\n [\"fourth\", \"Fourth\"],\n [\"generic-saml\", \"Generic SAML\"],\n [\"generic-oidc\", \"Generic OIDC\"],\n [\"github\", \"GitHub\"],\n [\"gitlab\", \"GitLab\"],\n [\"godaddy\", \"GoDaddy\"],\n [\"google\", \"Google\"],\n [\"google-analytics\", \"Google Analytics\"],\n [\"google-calendar\", \"Google Calendar\"],\n [\"google-drive\", \"Google Drive\"],\n [\"google-mail\", \"Google Mail\"],\n [\"google-cloud\", \"Google Cloud\"],\n [\"hibob\", \"
|
|
1
|
+
{"version":3,"sources":["../../../src/lib/identity-providers.ts"],"sourcesContent":["const IDENTITY_PROVIDER_DICT = new Map([\n [\"access-people-hr\", \"Access People HR\"],\n [\"adp\", \"ADP\"],\n [\"apple\", \"Apple\"],\n [\"asana\", \"Asana\"],\n [\"auth0\", \"Auth0\"],\n [\"azure\", \"Azure\"],\n [\"aws\", \"AWS\"],\n [\"bamboohr\", \"BambooHR\"],\n [\"bamboo-hr\", \"BambooHR\"],\n [\"bitbucket\", \"Bitbucket\"],\n [\"box\", \"Box\"],\n [\"breathe-hr\", \"BreatheHR\"],\n [\"bubble\", \"Bubble\"],\n [\"cas\", \"CAS\"],\n [\"cezanne-hr\", \"Cezanne HR\"],\n [\"classlink\", \"Classlink\"],\n [\"clerk\", \"Clerk\"],\n [\"cloudflare\", \"Cloudflare\"],\n [\"cyberark\", \"CyberArk\"],\n [\"datadog\", \"Datadog\"],\n [\"dropbox\", \"Dropbox\"],\n [\"duo\", \"Duo\"],\n [\"firebase\", \"Firebase\"],\n [\"fourth\", \"Fourth\"],\n [\"generic-saml\", \"Generic SAML\"],\n [\"generic-oidc\", \"Generic OIDC\"],\n [\"github\", \"GitHub\"],\n [\"gitlab\", \"GitLab\"],\n [\"godaddy\", \"GoDaddy\"],\n [\"google\", \"Google\"],\n [\"google-analytics\", \"Google Analytics\"],\n [\"google-calendar\", \"Google Calendar\"],\n [\"google-drive\", \"Google Drive\"],\n [\"google-mail\", \"Google Mail\"],\n [\"google-cloud\", \"Google Cloud\"],\n [\"hibob\", \"HiBob\"],\n [\"hubspot\", \"Hubspot\"],\n [\"intercom\", \"Intercom\"],\n [\"intuit\", \"Intuit\"],\n [\"jumpcloud\", \"JumpCloud\"],\n [\"keycloak\", \"Keycloak\"],\n [\"lastpass\", \"LastPass\"],\n [\"linear\", \"Linear\"],\n [\"linkedin\", \"LinkedIn\"],\n [\"login-gov\", \"Login.gov\"],\n [\"microsoft\", \"Microsoft\"],\n [\"miniorange\", \"Miniorange\"],\n [\"net-iq\", \"NetIQ\"],\n [\"next-auth\", \"NextAuth\"],\n [\"notion\", \"Notion\"],\n [\"okta\", \"Okta\"],\n [\"onelogin\", \"OneLogin\"],\n [\"oracle\", \"Oracle\"],\n [\"personio\", \"Personio\"],\n [\"ping-identity\", \"Ping Identity\"],\n [\"react-native-expo\", \"React Native Expo\"],\n [\"rippling\", \"Rippling\"],\n [\"salesforce\", \"Salesforce\"],\n [\"segment\", \"Segment\"],\n [\"shibboleth\", \"Shibboleth\"],\n [\"simple-saml-php\", \"Simple SAML PHP\"],\n [\"slack\", \"Slack\"],\n [\"splunk\", \"Splunk\"],\n [\"stripe\", \"Stripe\"],\n [\"supabase\", \"Supabase\"],\n [\"vercel\", \"Vercel\"],\n [\"vmware\", \"VMware\"],\n [\"workday\", \"Workday\"],\n [\"workos\", \"WorkOS\"],\n [\"xero\", \"Xero\"],\n [\"zendesk\", \"Zendesk\"],\n [\"test-idp\", \"Test IDP\"],\n [\"discord\", \"Discord\"],\n [\"clever\", \"Clever\"],\n] as const);\n\ntype MapKey<T extends Map<unknown, unknown>> =\n T extends Map<infer K, unknown> ? K : never;\n\nexport type IdentityProvider = MapKey<typeof IDENTITY_PROVIDER_DICT>;\n\nexport function getIdentityProviderName(provider: IdentityProvider) {\n return IDENTITY_PROVIDER_DICT.get(provider);\n}\n\n/**\n * Maps DirectoryType values to their corresponding IdentityProvider icon.\n * Used by ProviderIcon to display the correct icon via the data-provider CSS attribute.\n */\nconst DIRECTORY_TYPE_TO_ICON: Record<string, IdentityProvider> = {\n \"azure scim v2.0\": \"azure\",\n bamboohr: \"bamboohr\",\n \"breathe hr\": \"breathe-hr\",\n \"cezanne hr\": \"cezanne-hr\",\n \"cyberark scim v2.0\": \"cyberark\",\n \"fourth hr\": \"fourth\",\n \"generic scim v2.0\": \"workos\",\n \"gsuite directory\": \"google\",\n hibob: \"hibob\",\n \"jump cloud scim v2.0\": \"jumpcloud\",\n \"okta scim v2.0\": \"okta\",\n \"onelogin scim v2.0\": \"onelogin\",\n \"people hr\": \"access-people-hr\",\n personio: \"personio\",\n \"pingfederate scim v2.0\": \"ping-identity\",\n \"rippling scim v2.0\": \"rippling\",\n s3: \"aws\",\n sftp: \"workos\",\n \"sftp workday\": \"workday\",\n workday: \"workday\",\n pending: \"workos\",\n};\n\n/**\n * Maps DirectoryType values to their display names.\n */\nconst DIRECTORY_TYPE_TO_NAME: Record<string, string> = {\n \"azure scim v2.0\": \"Microsoft Entra ID\",\n bamboohr: \"BambooHR\",\n \"breathe hr\": \"Breathe HR\",\n \"cezanne hr\": \"Cezanne HR\",\n \"cyberark scim v2.0\": \"CyberArk\",\n \"fourth hr\": \"Fourth HR\",\n \"generic scim v2.0\": \"Generic SCIM\",\n \"gsuite directory\": \"Google Workspace\",\n hibob: \"HiBob\",\n \"jump cloud scim v2.0\": \"JumpCloud\",\n \"okta scim v2.0\": \"Okta\",\n \"onelogin scim v2.0\": \"OneLogin\",\n \"people hr\": \"People HR\",\n personio: \"Personio\",\n \"pingfederate scim v2.0\": \"PingFederate\",\n \"rippling scim v2.0\": \"Rippling\",\n s3: \"Amazon S3\",\n sftp: \"SFTP\",\n \"sftp workday\": \"Workday (SFTP)\",\n workday: \"Workday\",\n pending: \"Pending\",\n};\n\nexport function getDirectoryTypeIcon(\n directoryType: string,\n): IdentityProvider | null {\n return DIRECTORY_TYPE_TO_ICON[directoryType] ?? null;\n}\n\nexport function getDirectoryTypeName(directoryType: string): string {\n return DIRECTORY_TYPE_TO_NAME[directoryType] ?? directoryType;\n}\n\nexport function isIdentityProvider(provider: unknown) {\n return (\n typeof provider === \"string\" &&\n IDENTITY_PROVIDER_DICT.has(provider as IdentityProvider)\n );\n}\n"],"mappings":"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","names":[]}
|
|
@@ -1,7 +1,9 @@
|
|
|
1
|
-
declare const IDENTITY_PROVIDER_DICT: Map<"asana" | "box" | "dropbox" | "github" | "gitlab" | "google" | "google-calendar" | "google-drive" | "hubspot" | "intercom" | "linear" | "microsoft" | "notion" | "salesforce" | "slack" | "stripe" | "xero" | "zendesk" | "azure" | "access-people-hr" | "adp" | "apple" | "auth0" | "aws" | "
|
|
1
|
+
declare const IDENTITY_PROVIDER_DICT: Map<"asana" | "box" | "dropbox" | "github" | "gitlab" | "google" | "google-calendar" | "google-drive" | "hubspot" | "intercom" | "linear" | "microsoft" | "notion" | "salesforce" | "slack" | "stripe" | "xero" | "zendesk" | "bamboohr" | "hibob" | "personio" | "rippling" | "workday" | "azure" | "access-people-hr" | "adp" | "apple" | "auth0" | "aws" | "bamboo-hr" | "bitbucket" | "breathe-hr" | "bubble" | "cas" | "cezanne-hr" | "classlink" | "clerk" | "cloudflare" | "cyberark" | "datadog" | "duo" | "firebase" | "fourth" | "generic-saml" | "generic-oidc" | "godaddy" | "google-analytics" | "google-mail" | "google-cloud" | "intuit" | "jumpcloud" | "keycloak" | "lastpass" | "linkedin" | "login-gov" | "miniorange" | "net-iq" | "next-auth" | "okta" | "onelogin" | "oracle" | "ping-identity" | "react-native-expo" | "segment" | "shibboleth" | "simple-saml-php" | "splunk" | "supabase" | "vercel" | "vmware" | "workos" | "test-idp" | "discord" | "clever", "GoDaddy" | "Access People HR" | "ADP" | "Apple" | "Asana" | "Auth0" | "Azure" | "AWS" | "BambooHR" | "Bitbucket" | "Box" | "BreatheHR" | "Bubble" | "CAS" | "Cezanne HR" | "Classlink" | "Clerk" | "Cloudflare" | "CyberArk" | "Datadog" | "Dropbox" | "Duo" | "Firebase" | "Fourth" | "Generic SAML" | "Generic OIDC" | "GitHub" | "GitLab" | "Google" | "Google Analytics" | "Google Calendar" | "Google Drive" | "Google Mail" | "Google Cloud" | "HiBob" | "Hubspot" | "Intercom" | "Intuit" | "JumpCloud" | "Keycloak" | "LastPass" | "Linear" | "LinkedIn" | "Login.gov" | "Microsoft" | "Miniorange" | "NetIQ" | "NextAuth" | "Notion" | "Okta" | "OneLogin" | "Oracle" | "Personio" | "Ping Identity" | "React Native Expo" | "Rippling" | "Salesforce" | "Segment" | "Shibboleth" | "Simple SAML PHP" | "Slack" | "Splunk" | "Stripe" | "Supabase" | "Vercel" | "VMware" | "Workday" | "WorkOS" | "Xero" | "Zendesk" | "Test IDP" | "Discord" | "Clever">;
|
|
2
2
|
type MapKey<T extends Map<unknown, unknown>> = T extends Map<infer K, unknown> ? K : never;
|
|
3
3
|
type IdentityProvider = MapKey<typeof IDENTITY_PROVIDER_DICT>;
|
|
4
|
-
declare function getIdentityProviderName(provider: IdentityProvider): "GoDaddy" | "Access People HR" | "ADP" | "Apple" | "Asana" | "Auth0" | "Azure" | "AWS" | "BambooHR" | "Bitbucket" | "Box" | "BreatheHR" | "Bubble" | "CAS" | "Cezanne HR" | "Classlink" | "Clerk" | "Cloudflare" | "CyberArk" | "Datadog" | "Dropbox" | "Duo" | "Firebase" | "Fourth" | "Generic SAML" | "Generic OIDC" | "GitHub" | "GitLab" | "Google" | "Google Analytics" | "Google Calendar" | "Google Drive" | "Google Mail" | "Google Cloud" | "
|
|
4
|
+
declare function getIdentityProviderName(provider: IdentityProvider): "GoDaddy" | "Access People HR" | "ADP" | "Apple" | "Asana" | "Auth0" | "Azure" | "AWS" | "BambooHR" | "Bitbucket" | "Box" | "BreatheHR" | "Bubble" | "CAS" | "Cezanne HR" | "Classlink" | "Clerk" | "Cloudflare" | "CyberArk" | "Datadog" | "Dropbox" | "Duo" | "Firebase" | "Fourth" | "Generic SAML" | "Generic OIDC" | "GitHub" | "GitLab" | "Google" | "Google Analytics" | "Google Calendar" | "Google Drive" | "Google Mail" | "Google Cloud" | "HiBob" | "Hubspot" | "Intercom" | "Intuit" | "JumpCloud" | "Keycloak" | "LastPass" | "Linear" | "LinkedIn" | "Login.gov" | "Microsoft" | "Miniorange" | "NetIQ" | "NextAuth" | "Notion" | "Okta" | "OneLogin" | "Oracle" | "Personio" | "Ping Identity" | "React Native Expo" | "Rippling" | "Salesforce" | "Segment" | "Shibboleth" | "Simple SAML PHP" | "Slack" | "Splunk" | "Stripe" | "Supabase" | "Vercel" | "VMware" | "Workday" | "WorkOS" | "Xero" | "Zendesk" | "Test IDP" | "Discord" | "Clever" | undefined;
|
|
5
|
+
declare function getDirectoryTypeIcon(directoryType: string): IdentityProvider | null;
|
|
6
|
+
declare function getDirectoryTypeName(directoryType: string): string;
|
|
5
7
|
declare function isIdentityProvider(provider: unknown): boolean;
|
|
6
8
|
|
|
7
|
-
export { type IdentityProvider, getIdentityProviderName, isIdentityProvider };
|
|
9
|
+
export { type IdentityProvider, getDirectoryTypeIcon, getDirectoryTypeName, getIdentityProviderName, isIdentityProvider };
|
package/dist/cjs/lib/pipes.cjs
CHANGED
|
@@ -317,8 +317,8 @@ function ProviderStatus({ integration }) {
|
|
|
317
317
|
/* @__PURE__ */ (0, import_jsx_runtime.jsx)(
|
|
318
318
|
DisconnectAccountDialog,
|
|
319
319
|
{
|
|
320
|
-
integration,
|
|
321
|
-
|
|
320
|
+
integrationName: integration.name,
|
|
321
|
+
installationId: integration.installation.id,
|
|
322
322
|
open: disconnectOpen,
|
|
323
323
|
onOpenChange: setDisconnectOpen
|
|
324
324
|
}
|
|
@@ -327,8 +327,8 @@ function ProviderStatus({ integration }) {
|
|
|
327
327
|
/* @__PURE__ */ (0, import_jsx_runtime.jsx)(
|
|
328
328
|
import_status.Status,
|
|
329
329
|
{
|
|
330
|
-
state: integration.installation.state ===
|
|
331
|
-
children: integration.installation.state ===
|
|
330
|
+
state: integration.installation.state === "connected" ? "success" : "error",
|
|
331
|
+
children: integration.installation.state === "connected" ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
|
|
332
332
|
import_translation.Translation,
|
|
333
333
|
{
|
|
334
334
|
defaultMessage: "Connected",
|
|
@@ -348,7 +348,7 @@ function ProviderStatus({ integration }) {
|
|
|
348
348
|
/* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_elements.DropdownMenu.Root, { children: [
|
|
349
349
|
/* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_elements.DropdownMenu.Trigger, { children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_elements.IconButton, { title: pipeActionsTitle, children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_react_icons.DotsHorizontalIcon, {}) }) }),
|
|
350
350
|
/* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_elements.DropdownMenu.Content, { align: "end", children: [
|
|
351
|
-
integration.installation.state ===
|
|
351
|
+
integration.installation.state === "needs_reauthorization" && /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
|
|
352
352
|
import_elements.DropdownMenu.Item,
|
|
353
353
|
{
|
|
354
354
|
onClick: async () => {
|
|
@@ -397,8 +397,8 @@ function ProviderStatus({ integration }) {
|
|
|
397
397
|
return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(ConnectIntegrationButton, { integration });
|
|
398
398
|
}
|
|
399
399
|
function DisconnectAccountDialog({
|
|
400
|
-
|
|
401
|
-
|
|
400
|
+
integrationName,
|
|
401
|
+
installationId,
|
|
402
402
|
open,
|
|
403
403
|
onOpenChange
|
|
404
404
|
}) {
|
|
@@ -447,7 +447,7 @@ function DisconnectAccountDialog({
|
|
|
447
447
|
id: "eEXeqP",
|
|
448
448
|
description: "Confirmation message for disconnecting an account",
|
|
449
449
|
values: {
|
|
450
|
-
integrationName: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_themes.Text, { as: "span", weight: "bold", children:
|
|
450
|
+
integrationName: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_themes.Text, { as: "span", weight: "bold", children: integrationName })
|
|
451
451
|
}
|
|
452
452
|
}
|
|
453
453
|
) }),
|
|
@@ -466,7 +466,7 @@ function DisconnectAccountDialog({
|
|
|
466
466
|
variant: "destructive",
|
|
467
467
|
disabled: isPending,
|
|
468
468
|
loading: isPending,
|
|
469
|
-
onClick: () => deleteDataInstallation({ installationId
|
|
469
|
+
onClick: () => deleteDataInstallation({ installationId }),
|
|
470
470
|
children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
|
|
471
471
|
import_translation.Translation,
|
|
472
472
|
{
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/lib/pipes.tsx"],"sourcesContent":["\"use client\";\nimport { Callout, Card, Flex, Text } from \"@radix-ui/themes\";\nimport { useCallback, useEffect, useRef, useState } from \"react\";\nimport * as CardList from \"./card-list.js\";\nimport { ProviderIcon } from \"./provider-icon.js\";\nimport {\n DotsHorizontalIcon,\n ExternalLinkIcon,\n GlobeIcon,\n LockClosedIcon,\n} from \"@radix-ui/react-icons\";\nimport {\n AlertDialog,\n Button,\n Dialog,\n DropdownMenu,\n IconButton,\n Skeleton,\n} from \"./elements.js\";\nimport { IconPanel } from \"./icon-panel.js\";\nimport { Status } from \"./status.js\";\nimport {\n DataIntegration,\n DataInstallation,\n useDeleteDataInstallation,\n useGetDataIntegrationAuthorizeUrlHook,\n getMyDataIntegrationsQueryKey,\n DataInstallationState,\n useSettings,\n} from \"../api/endpoint.js\";\nimport { useQueryClient } from \"@tanstack/react-query\";\nimport { GenericError } from \"./generic-error.js\";\nimport { getDomProps, WidgetRootDomProps, WidgetRootState } from \"./utils.js\";\nimport { Translation } from \"./i18n/translation.js\";\nimport { useTranslation } from \"./i18n/use-translation.js\";\n\ninterface PipesProps extends WidgetRootDomProps {\n integrations: DataIntegration[];\n}\n\nconst HANDOFF_INTERVAL_MS = 100;\nconst HANDOFF_MAX_ATTEMPTS = 100; // 10 seconds worth of attempts\n\nconst useOpenDataIntegrationAuthorizeUrl = (integration: DataIntegration) => {\n const getDataIntegrationAuthorizeUrl =\n useGetDataIntegrationAuthorizeUrlHook();\n const settings = useSettings();\n const baseUrl = settings.data?.authkitOrigin ?? \"\";\n const intervalRef = useRef<ReturnType<typeof setInterval> | undefined>(\n undefined,\n );\n const messageHandlerRef = useRef<((event: MessageEvent) => void) | undefined>(\n undefined,\n );\n\n useEffect(() => {\n return () => {\n if (intervalRef.current) {\n clearInterval(intervalRef.current);\n }\n if (messageHandlerRef.current) {\n window.removeEventListener(\"message\", messageHandlerRef.current);\n }\n };\n }, []);\n\n return useCallback(async () => {\n // Clear any existing interval from a previous invocation\n if (intervalRef.current) {\n clearInterval(intervalRef.current);\n intervalRef.current = undefined;\n }\n // Remove any existing message handler\n if (messageHandlerRef.current) {\n window.removeEventListener(\"message\", messageHandlerRef.current);\n messageHandlerRef.current = undefined;\n }\n\n // need to do this synchronously in the event handler to avoid popup blocker notifications\n const win = window.open(`${baseUrl}/pipes/redirecting`, \"_blank\");\n\n // caller will catch\n const { url, handoffToken, redirectToken } =\n await getDataIntegrationAuthorizeUrl(integration.slug, {\n requireHandoff: true,\n });\n if (win) {\n win.location = url;\n const parsedUrl = new URL(url);\n const payload = { handoffToken, redirectToken };\n\n const cleanup = () => {\n if (intervalRef.current) {\n clearInterval(intervalRef.current);\n intervalRef.current = undefined;\n }\n if (messageHandlerRef.current) {\n window.removeEventListener(\"message\", messageHandlerRef.current);\n messageHandlerRef.current = undefined;\n }\n };\n\n messageHandlerRef.current = (event: MessageEvent) => {\n if (\n event.origin === parsedUrl.origin &&\n event.data?.redirectToken === redirectToken\n ) {\n cleanup();\n }\n };\n window.addEventListener(\"message\", messageHandlerRef.current);\n\n let attempts = 0;\n intervalRef.current = setInterval(() => {\n attempts += 1;\n\n if (attempts >= HANDOFF_MAX_ATTEMPTS) {\n cleanup();\n return;\n }\n\n if (win && !win.closed) {\n win.postMessage(payload, parsedUrl.origin);\n } else {\n cleanup();\n }\n }, HANDOFF_INTERVAL_MS);\n }\n }, [getDataIntegrationAuthorizeUrl, integration.slug, baseUrl]);\n};\n\nfunction ConnectIntegrationButton({\n integration,\n}: {\n integration: DataIntegration;\n}) {\n const eventHandler = useOpenDataIntegrationAuthorizeUrl(integration);\n\n return (\n <Button\n variant=\"secondary\"\n onClick={async () => {\n try {\n await eventHandler();\n } catch {\n // pass - error displayed in new tab\n }\n }}\n >\n <Translation\n defaultMessage=\"Connect\"\n id=\"quvdFp\"\n description=\"Button to connect an integration\"\n />\n </Button>\n );\n}\n\nfunction SharedCredentialsConnectIntegrationButton({\n integration,\n}: {\n integration: DataIntegration;\n}) {\n const settings = useSettings();\n const [open, setOpen] = useState(false);\n const eventHandler = useOpenDataIntegrationAuthorizeUrl(integration);\n\n const logo = settings.data?.logoDarkPath ?? settings.data?.logoLightPath;\n const appName = settings.data?.teamName ?? \"This application\";\n\n return (\n <>\n <Dialog.Root open={open} onOpenChange={setOpen}>\n <Dialog.Content maxWidth=\"430px\">\n <Flex justify=\"center\" align=\"center\" gap=\"2\" mt=\"2\">\n {logo && (\n <>\n <IconPanel\n color=\"panel\"\n style={{ width: \"48px\", height: \"48px\" }}\n >\n <ProviderIcon\n size=\"2\"\n provider=\"workos\"\n style={{ backgroundImage: `url(${logo})` }}\n />\n </IconPanel>\n <DotsHorizontalIcon />\n </>\n )}\n <IconPanel\n color=\"panel\"\n style={{\n ...(logo ? { borderWidth: 0 } : undefined),\n width: \"48px\",\n height: \"48px\",\n }}\n >\n <ProviderIcon size=\"2\" provider=\"workos\" />\n </IconPanel>\n <DotsHorizontalIcon />\n <IconPanel color=\"panel\" style={{ width: \"48px\", height: \"48px\" }}>\n <ProviderIcon size=\"2\" provider={integration.integrationType} />\n </IconPanel>\n </Flex>\n <Dialog.Title size=\"2\" mt=\"5\" mb=\"5\" weight={\"bold\"} align=\"center\">\n <Translation\n defaultMessage=\"{appName} uses WorkOS to connect to {integrationName}.\"\n id=\"ujRDBH\"\n description=\"Dialog title explaining the app connection flow\"\n values={{ appName, integrationName: integration.name }}\n />\n </Dialog.Title>\n <Card>\n <Flex direction=\"column\" gap=\"4\">\n <Flex gap=\"2\" align=\"center\">\n <IconPanel\n color=\"gray\"\n style={{ width: \"32px\", height: \"32px\" }}\n >\n <GlobeIcon />\n </IconPanel>\n <Flex direction=\"column\">\n <Text size=\"1\" weight=\"bold\">\n <Translation\n defaultMessage=\"You'll be redirected to sign in with {integrationName}.\"\n id=\"g+n4aY\"\n description=\"Instruction about redirect to sign in\"\n values={{ integrationName: integration.name }}\n />\n </Text>\n <Text size=\"1\">\n <Translation\n defaultMessage=\"Authorize access to connect your account.\"\n id=\"fxVS34\"\n description=\"Instruction to authorize access\"\n />\n </Text>\n </Flex>\n </Flex>\n <Flex gap=\"2\" align=\"center\">\n <IconPanel\n color=\"gray\"\n style={{ width: \"32px\", height: \"32px\" }}\n >\n <LockClosedIcon />\n </IconPanel>\n <Flex direction=\"column\">\n <Text size=\"1\" weight=\"bold\">\n <Translation\n defaultMessage=\"Your credentials remain secure.\"\n id=\"gM3bot\"\n description=\"Security message about credentials\"\n />\n </Text>\n <Text size=\"1\">\n <Translation\n defaultMessage=\"WorkOS never sees your credentials.\"\n id=\"kC9Fwe\"\n description=\"Security message about WorkOS not seeing credentials\"\n />\n </Text>\n </Flex>\n </Flex>\n </Flex>\n </Card>\n <Flex justify=\"end\" gap=\"3\" mt=\"5\">\n <Dialog.Close>\n <Button variant=\"secondary\">\n <Translation\n defaultMessage=\"Cancel\"\n id=\"hHNj31\"\n description=\"Cancel button text\"\n />\n </Button>\n </Dialog.Close>\n <Button\n type=\"button\"\n onClick={async () => {\n try {\n await eventHandler();\n setOpen(false);\n } catch {\n // pass - error displayed in new tab\n }\n }}\n >\n <Translation\n defaultMessage=\"Connect\"\n id=\"16WmG0\"\n description=\"Connect button with external link\"\n trailingSpace\n />\n <ExternalLinkIcon aria-hidden />\n </Button>\n </Flex>\n </Dialog.Content>\n </Dialog.Root>\n <Button variant=\"secondary\" onClick={() => setOpen(true)}>\n <Translation\n defaultMessage=\"Connect\"\n id=\"quvdFp\"\n description=\"Button to connect an integration\"\n />\n </Button>\n </>\n );\n}\n\nfunction ProviderStatus({ integration }: { integration: DataIntegration }) {\n const [disconnectOpen, setDisconnectOpen] = useState(false);\n const authorizeEventHandler = useOpenDataIntegrationAuthorizeUrl(integration);\n const translate = useTranslation();\n\n const pipeActionsTitle = translate({\n defaultMessage: \"Pipe actions\",\n id: \"1uF9ve\",\n description: \"Title for pipe actions dropdown button\",\n });\n\n if (integration.installation) {\n return (\n <>\n <DisconnectAccountDialog\n integration={integration}\n installation={integration.installation}\n open={disconnectOpen}\n onOpenChange={setDisconnectOpen}\n />\n <Flex align=\"center\" gap=\"4\">\n <Status\n state={\n integration.installation.state === DataInstallationState.connected\n ? \"success\"\n : \"error\"\n }\n >\n {integration.installation.state ===\n DataInstallationState.connected ? (\n <Translation\n defaultMessage=\"Connected\"\n id=\"i6Hxoz\"\n description=\"Status text for connected integration\"\n />\n ) : (\n <Translation\n defaultMessage=\"Requires reauthorization\"\n id=\"dqczQS\"\n description=\"Status text for integration needing reauthorization\"\n />\n )}\n </Status>\n <DropdownMenu.Root>\n <DropdownMenu.Trigger>\n <IconButton title={pipeActionsTitle}>\n <DotsHorizontalIcon />\n </IconButton>\n </DropdownMenu.Trigger>\n <DropdownMenu.Content align=\"end\">\n {integration.installation.state ===\n DataInstallationState.needs_reauthorization && (\n <DropdownMenu.Item\n onClick={async () => {\n try {\n await authorizeEventHandler();\n } catch {\n // pass - error displayed in new tab\n }\n }}\n >\n <Flex gap=\"4\" width=\"100%\" justify=\"between\" align=\"center\">\n <Translation\n defaultMessage=\"Reauthorize\"\n id=\"0E29F1\"\n description=\"Menu option to reauthorize an integration\"\n trailingSpace\n />\n <ExternalLinkIcon aria-hidden />\n </Flex>\n </DropdownMenu.Item>\n )}\n <DropdownMenu.Item\n variant=\"destructive\"\n onClick={() => setDisconnectOpen(true)}\n >\n <Translation\n defaultMessage=\"Disconnect account\"\n id=\"esZQrd\"\n description=\"Menu option to disconnect an account\"\n />\n </DropdownMenu.Item>\n </DropdownMenu.Content>\n </DropdownMenu.Root>\n </Flex>\n </>\n );\n }\n\n if (integration.credentialsType === \"shared\") {\n return (\n <SharedCredentialsConnectIntegrationButton integration={integration} />\n );\n }\n\n return <ConnectIntegrationButton integration={integration} />;\n}\n\nfunction DisconnectAccountDialog({\n integration,\n installation,\n open,\n onOpenChange,\n}: {\n integration: DataIntegration;\n installation: DataInstallation;\n open: boolean;\n onOpenChange: (open: boolean) => void;\n}) {\n const queryClient = useQueryClient();\n const {\n mutate: deleteDataInstallation,\n error,\n reset,\n isPending,\n } = useDeleteDataInstallation({\n mutation: {\n onSuccess: () => {\n onOpenChange(false);\n queryClient.invalidateQueries({\n queryKey: getMyDataIntegrationsQueryKey(),\n });\n },\n },\n });\n\n useEffect(() => {\n if (open) {\n reset();\n }\n }, [open, reset]);\n\n return (\n <AlertDialog.Root open={open} onOpenChange={onOpenChange}>\n <AlertDialog.Content style={{ width: \"80vw\", maxWidth: \"520px\" }}>\n <AlertDialog.Title>\n <Translation\n defaultMessage=\"Disconnect account\"\n id=\"9ABlCr\"\n description=\"Dialog title for disconnecting an account\"\n />\n </AlertDialog.Title>\n {error && (\n <Callout.Root my=\"5\" color=\"red\" role=\"alert\">\n <Callout.Text>\n <Translation\n defaultMessage=\"An error occurred while disconnecting your account. Please refresh the page and try again.\"\n id=\"qKBKF7\"\n description=\"Error message when disconnecting an account fails\"\n />\n </Callout.Text>\n </Callout.Root>\n )}\n <AlertDialog.Description>\n <Translation\n defaultMessage=\"Are you sure you want to disconnect your {integrationName} account?\"\n id=\"eEXeqP\"\n description=\"Confirmation message for disconnecting an account\"\n values={{\n integrationName: (\n <Text as=\"span\" weight=\"bold\">\n {integration.name}\n </Text>\n ),\n }}\n />\n </AlertDialog.Description>\n <Flex gap=\"3\" justify=\"end\" mt=\"5\">\n <AlertDialog.Cancel>\n <Button variant=\"secondary\">\n <Translation\n defaultMessage=\"Cancel\"\n id=\"hHNj31\"\n description=\"Cancel button text\"\n />\n </Button>\n </AlertDialog.Cancel>\n <Button\n variant=\"destructive\"\n disabled={isPending}\n loading={isPending}\n onClick={() =>\n deleteDataInstallation({ installationId: installation.id })\n }\n >\n <Translation\n defaultMessage=\"Disconnect\"\n id=\"vMVXQh\"\n description=\"Button to disconnect an account\"\n />\n </Button>\n </Flex>\n </AlertDialog.Content>\n </AlertDialog.Root>\n );\n}\n\ninterface PipesLoadingProps extends WidgetRootDomProps {\n count: number;\n}\n\nconst PipesLoading: React.FC<PipesLoadingProps> = ({ count, ...domProps }) => {\n return (\n <CardList.Root {...getWidgetRootDomProps(\"loading\", domProps)}>\n {Array.from({ length: count }).map((_, index) => (\n <CardList.Item key={index}>\n <Flex direction=\"row\" justify=\"between\" align=\"center\" gap=\"2\">\n <Flex gap=\"4\" align=\"center\">\n <Skeleton>\n <IconPanel>\n <ProviderIcon provider=\"google\" />\n </IconPanel>\n </Skeleton>\n <Skeleton>\n <Text size=\"2\" weight=\"bold\">\n <Translation\n defaultMessage=\"Google Drive\"\n id=\"g11OOu\"\n description=\"Placeholder text for loading state\"\n />\n </Text>\n </Skeleton>\n </Flex>\n <Skeleton>\n <Button variant=\"secondary\" disabled>\n <Translation\n defaultMessage=\"Connect\"\n id=\"8TuDfA\"\n description=\"Placeholder button text for loading state\"\n />\n </Button>\n </Skeleton>\n </Flex>\n </CardList.Item>\n ))}\n </CardList.Root>\n );\n};\n\nconst Pipes: React.FC<PipesProps> = ({ integrations, ...domProps }) => {\n return (\n <CardList.Root {...getWidgetRootDomProps(\"resolved\", domProps)}>\n {integrations.map((integration) => (\n <CardList.Item key={integration.id}>\n <Flex direction=\"row\" justify=\"between\" align=\"center\" gap=\"2\">\n <Flex gap=\"4\" align=\"center\">\n <IconPanel color=\"panel\">\n <ProviderIcon provider={integration.integrationType} />\n </IconPanel>\n <Text size=\"2\" weight=\"bold\">\n {integration.name}\n </Text>\n </Flex>\n <ProviderStatus integration={integration} />\n </Flex>\n </CardList.Item>\n ))}\n </CardList.Root>\n );\n};\n\ninterface PipesErrorProps extends WidgetRootDomProps {\n error: unknown;\n}\n\nconst PipesError: React.FC<PipesErrorProps> = ({ error, ...domProps }) => {\n return (\n <Card size=\"2\" {...getWidgetRootDomProps(\"error\", domProps)}>\n <GenericError error={error} />\n </Card>\n );\n};\n\nfunction getWidgetRootDomProps(\n state: WidgetRootState,\n domProps: WidgetRootDomProps,\n) {\n return getDomProps({\n ...domProps,\n isWidgetRoot: true,\n widgetId: \"pipes\",\n widgetState: state,\n });\n}\n\nexport type { PipesProps, PipesLoadingProps, PipesErrorProps };\nexport { Pipes, PipesLoading, PipesError };\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../../../src/lib/pipes.tsx"],"sourcesContent":["\"use client\";\nimport { Callout, Card, Flex, Text } from \"@radix-ui/themes\";\nimport { useCallback, useEffect, useRef, useState } from \"react\";\nimport * as CardList from \"./card-list.js\";\nimport { ProviderIcon } from \"./provider-icon.js\";\nimport {\n DotsHorizontalIcon,\n ExternalLinkIcon,\n GlobeIcon,\n LockClosedIcon,\n} from \"@radix-ui/react-icons\";\nimport {\n AlertDialog,\n Button,\n Dialog,\n DropdownMenu,\n IconButton,\n Skeleton,\n} from \"./elements.js\";\nimport { IconPanel } from \"./icon-panel.js\";\nimport { Status } from \"./status.js\";\nimport {\n DataIntegration,\n useDeleteDataInstallation,\n useGetDataIntegrationAuthorizeUrlHook,\n getMyDataIntegrationsQueryKey,\n useSettings,\n} from \"../api/endpoint.js\";\nimport { useQueryClient } from \"@tanstack/react-query\";\nimport { GenericError } from \"./generic-error.js\";\nimport { getDomProps, WidgetRootDomProps, WidgetRootState } from \"./utils.js\";\nimport { Translation } from \"./i18n/translation.js\";\nimport { useTranslation } from \"./i18n/use-translation.js\";\n\ninterface PipesProps extends WidgetRootDomProps {\n integrations: DataIntegration[];\n}\n\nconst HANDOFF_INTERVAL_MS = 100;\nconst HANDOFF_MAX_ATTEMPTS = 100; // 10 seconds worth of attempts\n\nconst useOpenDataIntegrationAuthorizeUrl = (integration: DataIntegration) => {\n const getDataIntegrationAuthorizeUrl =\n useGetDataIntegrationAuthorizeUrlHook();\n const settings = useSettings();\n const baseUrl = settings.data?.authkitOrigin ?? \"\";\n const intervalRef = useRef<ReturnType<typeof setInterval> | undefined>(\n undefined,\n );\n const messageHandlerRef = useRef<((event: MessageEvent) => void) | undefined>(\n undefined,\n );\n\n useEffect(() => {\n return () => {\n if (intervalRef.current) {\n clearInterval(intervalRef.current);\n }\n if (messageHandlerRef.current) {\n window.removeEventListener(\"message\", messageHandlerRef.current);\n }\n };\n }, []);\n\n return useCallback(async () => {\n // Clear any existing interval from a previous invocation\n if (intervalRef.current) {\n clearInterval(intervalRef.current);\n intervalRef.current = undefined;\n }\n // Remove any existing message handler\n if (messageHandlerRef.current) {\n window.removeEventListener(\"message\", messageHandlerRef.current);\n messageHandlerRef.current = undefined;\n }\n\n // need to do this synchronously in the event handler to avoid popup blocker notifications\n const win = window.open(`${baseUrl}/pipes/redirecting`, \"_blank\");\n\n // caller will catch\n const { url, handoffToken, redirectToken } =\n await getDataIntegrationAuthorizeUrl(integration.slug, {\n requireHandoff: true,\n });\n if (win) {\n win.location = url;\n const parsedUrl = new URL(url);\n const payload = { handoffToken, redirectToken };\n\n const cleanup = () => {\n if (intervalRef.current) {\n clearInterval(intervalRef.current);\n intervalRef.current = undefined;\n }\n if (messageHandlerRef.current) {\n window.removeEventListener(\"message\", messageHandlerRef.current);\n messageHandlerRef.current = undefined;\n }\n };\n\n messageHandlerRef.current = (event: MessageEvent) => {\n if (\n event.origin === parsedUrl.origin &&\n event.data?.redirectToken === redirectToken\n ) {\n cleanup();\n }\n };\n window.addEventListener(\"message\", messageHandlerRef.current);\n\n let attempts = 0;\n intervalRef.current = setInterval(() => {\n attempts += 1;\n\n if (attempts >= HANDOFF_MAX_ATTEMPTS) {\n cleanup();\n return;\n }\n\n if (win && !win.closed) {\n win.postMessage(payload, parsedUrl.origin);\n } else {\n cleanup();\n }\n }, HANDOFF_INTERVAL_MS);\n }\n }, [getDataIntegrationAuthorizeUrl, integration.slug, baseUrl]);\n};\n\nfunction ConnectIntegrationButton({\n integration,\n}: {\n integration: DataIntegration;\n}) {\n const eventHandler = useOpenDataIntegrationAuthorizeUrl(integration);\n\n return (\n <Button\n variant=\"secondary\"\n onClick={async () => {\n try {\n await eventHandler();\n } catch {\n // pass - error displayed in new tab\n }\n }}\n >\n <Translation\n defaultMessage=\"Connect\"\n id=\"quvdFp\"\n description=\"Button to connect an integration\"\n />\n </Button>\n );\n}\n\nfunction SharedCredentialsConnectIntegrationButton({\n integration,\n}: {\n integration: DataIntegration;\n}) {\n const settings = useSettings();\n const [open, setOpen] = useState(false);\n const eventHandler = useOpenDataIntegrationAuthorizeUrl(integration);\n\n const logo = settings.data?.logoDarkPath ?? settings.data?.logoLightPath;\n const appName = settings.data?.teamName ?? \"This application\";\n\n return (\n <>\n <Dialog.Root open={open} onOpenChange={setOpen}>\n <Dialog.Content maxWidth=\"430px\">\n <Flex justify=\"center\" align=\"center\" gap=\"2\" mt=\"2\">\n {logo && (\n <>\n <IconPanel\n color=\"panel\"\n style={{ width: \"48px\", height: \"48px\" }}\n >\n <ProviderIcon\n size=\"2\"\n provider=\"workos\"\n style={{ backgroundImage: `url(${logo})` }}\n />\n </IconPanel>\n <DotsHorizontalIcon />\n </>\n )}\n <IconPanel\n color=\"panel\"\n style={{\n ...(logo ? { borderWidth: 0 } : undefined),\n width: \"48px\",\n height: \"48px\",\n }}\n >\n <ProviderIcon size=\"2\" provider=\"workos\" />\n </IconPanel>\n <DotsHorizontalIcon />\n <IconPanel color=\"panel\" style={{ width: \"48px\", height: \"48px\" }}>\n <ProviderIcon size=\"2\" provider={integration.integrationType} />\n </IconPanel>\n </Flex>\n <Dialog.Title size=\"2\" mt=\"5\" mb=\"5\" weight={\"bold\"} align=\"center\">\n <Translation\n defaultMessage=\"{appName} uses WorkOS to connect to {integrationName}.\"\n id=\"ujRDBH\"\n description=\"Dialog title explaining the app connection flow\"\n values={{ appName, integrationName: integration.name }}\n />\n </Dialog.Title>\n <Card>\n <Flex direction=\"column\" gap=\"4\">\n <Flex gap=\"2\" align=\"center\">\n <IconPanel\n color=\"gray\"\n style={{ width: \"32px\", height: \"32px\" }}\n >\n <GlobeIcon />\n </IconPanel>\n <Flex direction=\"column\">\n <Text size=\"1\" weight=\"bold\">\n <Translation\n defaultMessage=\"You'll be redirected to sign in with {integrationName}.\"\n id=\"g+n4aY\"\n description=\"Instruction about redirect to sign in\"\n values={{ integrationName: integration.name }}\n />\n </Text>\n <Text size=\"1\">\n <Translation\n defaultMessage=\"Authorize access to connect your account.\"\n id=\"fxVS34\"\n description=\"Instruction to authorize access\"\n />\n </Text>\n </Flex>\n </Flex>\n <Flex gap=\"2\" align=\"center\">\n <IconPanel\n color=\"gray\"\n style={{ width: \"32px\", height: \"32px\" }}\n >\n <LockClosedIcon />\n </IconPanel>\n <Flex direction=\"column\">\n <Text size=\"1\" weight=\"bold\">\n <Translation\n defaultMessage=\"Your credentials remain secure.\"\n id=\"gM3bot\"\n description=\"Security message about credentials\"\n />\n </Text>\n <Text size=\"1\">\n <Translation\n defaultMessage=\"WorkOS never sees your credentials.\"\n id=\"kC9Fwe\"\n description=\"Security message about WorkOS not seeing credentials\"\n />\n </Text>\n </Flex>\n </Flex>\n </Flex>\n </Card>\n <Flex justify=\"end\" gap=\"3\" mt=\"5\">\n <Dialog.Close>\n <Button variant=\"secondary\">\n <Translation\n defaultMessage=\"Cancel\"\n id=\"hHNj31\"\n description=\"Cancel button text\"\n />\n </Button>\n </Dialog.Close>\n <Button\n type=\"button\"\n onClick={async () => {\n try {\n await eventHandler();\n setOpen(false);\n } catch {\n // pass - error displayed in new tab\n }\n }}\n >\n <Translation\n defaultMessage=\"Connect\"\n id=\"16WmG0\"\n description=\"Connect button with external link\"\n trailingSpace\n />\n <ExternalLinkIcon aria-hidden />\n </Button>\n </Flex>\n </Dialog.Content>\n </Dialog.Root>\n <Button variant=\"secondary\" onClick={() => setOpen(true)}>\n <Translation\n defaultMessage=\"Connect\"\n id=\"quvdFp\"\n description=\"Button to connect an integration\"\n />\n </Button>\n </>\n );\n}\n\nfunction ProviderStatus({ integration }: { integration: DataIntegration }) {\n const [disconnectOpen, setDisconnectOpen] = useState(false);\n const authorizeEventHandler = useOpenDataIntegrationAuthorizeUrl(integration);\n const translate = useTranslation();\n\n const pipeActionsTitle = translate({\n defaultMessage: \"Pipe actions\",\n id: \"1uF9ve\",\n description: \"Title for pipe actions dropdown button\",\n });\n\n if (integration.installation) {\n return (\n <>\n <DisconnectAccountDialog\n integrationName={integration.name}\n installationId={integration.installation.id}\n open={disconnectOpen}\n onOpenChange={setDisconnectOpen}\n />\n <Flex align=\"center\" gap=\"4\">\n <Status\n state={\n integration.installation.state === \"connected\"\n ? \"success\"\n : \"error\"\n }\n >\n {integration.installation.state === \"connected\" ? (\n <Translation\n defaultMessage=\"Connected\"\n id=\"i6Hxoz\"\n description=\"Status text for connected integration\"\n />\n ) : (\n <Translation\n defaultMessage=\"Requires reauthorization\"\n id=\"dqczQS\"\n description=\"Status text for integration needing reauthorization\"\n />\n )}\n </Status>\n <DropdownMenu.Root>\n <DropdownMenu.Trigger>\n <IconButton title={pipeActionsTitle}>\n <DotsHorizontalIcon />\n </IconButton>\n </DropdownMenu.Trigger>\n <DropdownMenu.Content align=\"end\">\n {integration.installation.state === \"needs_reauthorization\" && (\n <DropdownMenu.Item\n onClick={async () => {\n try {\n await authorizeEventHandler();\n } catch {\n // pass - error displayed in new tab\n }\n }}\n >\n <Flex gap=\"4\" width=\"100%\" justify=\"between\" align=\"center\">\n <Translation\n defaultMessage=\"Reauthorize\"\n id=\"0E29F1\"\n description=\"Menu option to reauthorize an integration\"\n trailingSpace\n />\n <ExternalLinkIcon aria-hidden />\n </Flex>\n </DropdownMenu.Item>\n )}\n <DropdownMenu.Item\n variant=\"destructive\"\n onClick={() => setDisconnectOpen(true)}\n >\n <Translation\n defaultMessage=\"Disconnect account\"\n id=\"esZQrd\"\n description=\"Menu option to disconnect an account\"\n />\n </DropdownMenu.Item>\n </DropdownMenu.Content>\n </DropdownMenu.Root>\n </Flex>\n </>\n );\n }\n\n if (integration.credentialsType === \"shared\") {\n return (\n <SharedCredentialsConnectIntegrationButton integration={integration} />\n );\n }\n\n return <ConnectIntegrationButton integration={integration} />;\n}\n\nfunction DisconnectAccountDialog({\n integrationName,\n installationId,\n open,\n onOpenChange,\n}: {\n integrationName: string;\n installationId: string;\n open: boolean;\n onOpenChange: (open: boolean) => void;\n}) {\n const queryClient = useQueryClient();\n const {\n mutate: deleteDataInstallation,\n error,\n reset,\n isPending,\n } = useDeleteDataInstallation({\n mutation: {\n onSuccess: () => {\n onOpenChange(false);\n queryClient.invalidateQueries({\n queryKey: getMyDataIntegrationsQueryKey(),\n });\n },\n },\n });\n\n useEffect(() => {\n if (open) {\n reset();\n }\n }, [open, reset]);\n\n return (\n <AlertDialog.Root open={open} onOpenChange={onOpenChange}>\n <AlertDialog.Content style={{ width: \"80vw\", maxWidth: \"520px\" }}>\n <AlertDialog.Title>\n <Translation\n defaultMessage=\"Disconnect account\"\n id=\"9ABlCr\"\n description=\"Dialog title for disconnecting an account\"\n />\n </AlertDialog.Title>\n {error && (\n <Callout.Root my=\"5\" color=\"red\" role=\"alert\">\n <Callout.Text>\n <Translation\n defaultMessage=\"An error occurred while disconnecting your account. Please refresh the page and try again.\"\n id=\"qKBKF7\"\n description=\"Error message when disconnecting an account fails\"\n />\n </Callout.Text>\n </Callout.Root>\n )}\n <AlertDialog.Description>\n <Translation\n defaultMessage=\"Are you sure you want to disconnect your {integrationName} account?\"\n id=\"eEXeqP\"\n description=\"Confirmation message for disconnecting an account\"\n values={{\n integrationName: (\n <Text as=\"span\" weight=\"bold\">\n {integrationName}\n </Text>\n ),\n }}\n />\n </AlertDialog.Description>\n <Flex gap=\"3\" justify=\"end\" mt=\"5\">\n <AlertDialog.Cancel>\n <Button variant=\"secondary\">\n <Translation\n defaultMessage=\"Cancel\"\n id=\"hHNj31\"\n description=\"Cancel button text\"\n />\n </Button>\n </AlertDialog.Cancel>\n <Button\n variant=\"destructive\"\n disabled={isPending}\n loading={isPending}\n onClick={() => deleteDataInstallation({ installationId })}\n >\n <Translation\n defaultMessage=\"Disconnect\"\n id=\"vMVXQh\"\n description=\"Button to disconnect an account\"\n />\n </Button>\n </Flex>\n </AlertDialog.Content>\n </AlertDialog.Root>\n );\n}\n\ninterface PipesLoadingProps extends WidgetRootDomProps {\n count: number;\n}\n\nconst PipesLoading: React.FC<PipesLoadingProps> = ({ count, ...domProps }) => {\n return (\n <CardList.Root {...getWidgetRootDomProps(\"loading\", domProps)}>\n {Array.from({ length: count }).map((_, index) => (\n <CardList.Item key={index}>\n <Flex direction=\"row\" justify=\"between\" align=\"center\" gap=\"2\">\n <Flex gap=\"4\" align=\"center\">\n <Skeleton>\n <IconPanel>\n <ProviderIcon provider=\"google\" />\n </IconPanel>\n </Skeleton>\n <Skeleton>\n <Text size=\"2\" weight=\"bold\">\n <Translation\n defaultMessage=\"Google Drive\"\n id=\"g11OOu\"\n description=\"Placeholder text for loading state\"\n />\n </Text>\n </Skeleton>\n </Flex>\n <Skeleton>\n <Button variant=\"secondary\" disabled>\n <Translation\n defaultMessage=\"Connect\"\n id=\"8TuDfA\"\n description=\"Placeholder button text for loading state\"\n />\n </Button>\n </Skeleton>\n </Flex>\n </CardList.Item>\n ))}\n </CardList.Root>\n );\n};\n\nconst Pipes: React.FC<PipesProps> = ({ integrations, ...domProps }) => {\n return (\n <CardList.Root {...getWidgetRootDomProps(\"resolved\", domProps)}>\n {integrations.map((integration) => (\n <CardList.Item key={integration.id}>\n <Flex direction=\"row\" justify=\"between\" align=\"center\" gap=\"2\">\n <Flex gap=\"4\" align=\"center\">\n <IconPanel color=\"panel\">\n <ProviderIcon provider={integration.integrationType} />\n </IconPanel>\n <Text size=\"2\" weight=\"bold\">\n {integration.name}\n </Text>\n </Flex>\n <ProviderStatus integration={integration} />\n </Flex>\n </CardList.Item>\n ))}\n </CardList.Root>\n );\n};\n\ninterface PipesErrorProps extends WidgetRootDomProps {\n error: unknown;\n}\n\nconst PipesError: React.FC<PipesErrorProps> = ({ error, ...domProps }) => {\n return (\n <Card size=\"2\" {...getWidgetRootDomProps(\"error\", domProps)}>\n <GenericError error={error} />\n </Card>\n );\n};\n\nfunction getWidgetRootDomProps(\n state: WidgetRootState,\n domProps: WidgetRootDomProps,\n) {\n return getDomProps({\n ...domProps,\n isWidgetRoot: true,\n widgetId: \"pipes\",\n widgetState: state,\n });\n}\n\nexport type { PipesProps, PipesLoadingProps, PipesErrorProps };\nexport { Pipes, PipesLoading, PipesError };\n"],"mappings":"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","names":[]}
|
|
@@ -83,7 +83,8 @@ function Content({
|
|
|
83
83
|
{
|
|
84
84
|
defaultMessage: "Turning off MFA will remove the additional layer of security on your account.",
|
|
85
85
|
id: "24huc/",
|
|
86
|
-
description: "Warning that disabling MFA reduces security"
|
|
86
|
+
description: "Warning that disabling MFA reduces security",
|
|
87
|
+
trailingSpace: true
|
|
87
88
|
}
|
|
88
89
|
),
|
|
89
90
|
isPasswordSet ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/lib/reset-mfa-dialog.tsx"],"sourcesContent":["\"use client\";\n\nimport * as React from \"react\";\nimport { Flex } from \"@radix-ui/themes\";\nimport { type ReactNode } from \"react\";\nimport { AlertDialog, Button } from \"./elements.js\";\nimport { useDeleteTotpFactors } from \"../api/endpoint.js\";\nimport { useSecuritySettings } from \"./use-security-settings.js\";\nimport { ElevatedAccess } from \"./elevated-access.js\";\nimport { SaveButton } from \"./save-button.js\";\nimport { useDialogClose } from \"./use-dialog-close.js\";\nimport { Translation } from \"./i18n/translation.js\";\n\ninterface ResetMfaDialogProps extends AlertDialog.RootProps {\n children?: ReactNode;\n isPasswordSet: boolean;\n}\n\nexport function ResetMfaDialog({\n children,\n isPasswordSet,\n ...props\n}: ResetMfaDialogProps) {\n const [open, setOpen] = React.useState(false);\n\n const handleClose = React.useCallback(() => {\n setOpen(false);\n }, []);\n\n return (\n <AlertDialog.Root {...props} open={open} onOpenChange={setOpen}>\n <AlertDialog.Trigger>{children}</AlertDialog.Trigger>\n\n <AlertDialog.Content maxWidth=\"480px\">\n <ElevatedAccess type=\"alert\">\n <Content onClose={handleClose} isPasswordSet={isPasswordSet} />\n </ElevatedAccess>\n </AlertDialog.Content>\n </AlertDialog.Root>\n );\n}\n\nfunction Content({\n onClose,\n isPasswordSet,\n}: {\n onClose: () => void;\n isPasswordSet: boolean;\n}) {\n const securitySettings = useSecuritySettings();\n const resetMfa = useDeleteTotpFactors();\n\n const onSubmitForm = () => {\n resetMfa.mutate();\n };\n\n useDialogClose(resetMfa.isSuccess, () => {\n securitySettings.update(\"Mfa\", false);\n });\n\n return (\n <>\n <AlertDialog.Title>\n <Translation\n defaultMessage=\"Disable multi-factor authentication?\"\n id=\"a4wDlZ\"\n description=\"Dialog title asking to confirm disabling MFA\"\n />\n </AlertDialog.Title>\n <AlertDialog.Description>\n <Translation\n defaultMessage=\"Turning off MFA will remove the additional layer of security on your account.\"\n id=\"24huc/\"\n description=\"Warning that disabling MFA reduces security\"\n />\n {isPasswordSet ? (\n <Translation\n defaultMessage=\"We will only ask for your password during sign-in.\"\n id=\"Z6coCJ\"\n description=\"Explanation when password is set but MFA will be disabled\"\n />\n ) : (\n <Translation\n defaultMessage=\"We will not ask for additional verification during sign-in.\"\n id=\"4SH+qg\"\n description=\"Explanation when no password set and MFA will be disabled\"\n />\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={resetMfa.isPending || resetMfa.isSuccess}\n >\n <Translation\n defaultMessage=\"Cancel\"\n id=\"OdCEs1\"\n description=\"Button to cancel disabling MFA\"\n />\n </Button>\n </AlertDialog.Cancel>\n\n <SaveButton\n type=\"submit\"\n loading={resetMfa.isPending}\n done={resetMfa.isSuccess}\n onDone={onClose}\n variant=\"destructive\"\n >\n <Translation\n defaultMessage=\"Disable\"\n id=\"uvxVJM\"\n description=\"Button to confirm disabling MFA\"\n />\n </SaveButton>\n </form>\n </Flex>\n </>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AA8BI;AA5BJ,YAAuB;AACvB,oBAAqB;AAErB,sBAAoC;AACpC,sBAAqC;AACrC,mCAAoC;AACpC,6BAA+B;AAC/B,yBAA2B;AAC3B,8BAA+B;AAC/B,yBAA4B;AAOrB,SAAS,eAAe;AAAA,EAC7B;AAAA,EACA;AAAA,EACA,GAAG;AACL,GAAwB;AACtB,QAAM,CAAC,MAAM,OAAO,IAAI,MAAM,SAAS,KAAK;AAE5C,QAAM,cAAc,MAAM,YAAY,MAAM;AAC1C,YAAQ,KAAK;AAAA,EACf,GAAG,CAAC,CAAC;AAEL,SACE,6CAAC,4BAAY,MAAZ,EAAkB,GAAG,OAAO,MAAY,cAAc,SACrD;AAAA,gDAAC,4BAAY,SAAZ,EAAqB,UAAS;AAAA,IAE/B,4CAAC,4BAAY,SAAZ,EAAoB,UAAS,SAC5B,sDAAC,yCAAe,MAAK,SACnB,sDAAC,WAAQ,SAAS,aAAa,eAA8B,GAC/D,GACF;AAAA,KACF;AAEJ;AAEA,SAAS,QAAQ;AAAA,EACf;AAAA,EACA;AACF,GAGG;AACD,QAAM,uBAAmB,kDAAoB;AAC7C,QAAM,eAAW,sCAAqB;AAEtC,QAAM,eAAe,MAAM;AACzB,aAAS,OAAO;AAAA,EAClB;AAEA,8CAAe,SAAS,WAAW,MAAM;AACvC,qBAAiB,OAAO,OAAO,KAAK;AAAA,EACtC,CAAC;AAED,SACE,4EACE;AAAA,gDAAC,4BAAY,OAAZ,EACC;AAAA,MAAC;AAAA;AAAA,QACC,gBAAe;AAAA,QACf,IAAG;AAAA,QACH,aAAY;AAAA;AAAA,IACd,GACF;AAAA,IACA,6CAAC,4BAAY,aAAZ,EACC;AAAA;AAAA,QAAC;AAAA;AAAA,UACC,gBAAe;AAAA,UACf,IAAG;AAAA,UACH,aAAY;AAAA;AAAA,
|
|
1
|
+
{"version":3,"sources":["../../../src/lib/reset-mfa-dialog.tsx"],"sourcesContent":["\"use client\";\n\nimport * as React from \"react\";\nimport { Flex } from \"@radix-ui/themes\";\nimport { type ReactNode } from \"react\";\nimport { AlertDialog, Button } from \"./elements.js\";\nimport { useDeleteTotpFactors } from \"../api/endpoint.js\";\nimport { useSecuritySettings } from \"./use-security-settings.js\";\nimport { ElevatedAccess } from \"./elevated-access.js\";\nimport { SaveButton } from \"./save-button.js\";\nimport { useDialogClose } from \"./use-dialog-close.js\";\nimport { Translation } from \"./i18n/translation.js\";\n\ninterface ResetMfaDialogProps extends AlertDialog.RootProps {\n children?: ReactNode;\n isPasswordSet: boolean;\n}\n\nexport function ResetMfaDialog({\n children,\n isPasswordSet,\n ...props\n}: ResetMfaDialogProps) {\n const [open, setOpen] = React.useState(false);\n\n const handleClose = React.useCallback(() => {\n setOpen(false);\n }, []);\n\n return (\n <AlertDialog.Root {...props} open={open} onOpenChange={setOpen}>\n <AlertDialog.Trigger>{children}</AlertDialog.Trigger>\n\n <AlertDialog.Content maxWidth=\"480px\">\n <ElevatedAccess type=\"alert\">\n <Content onClose={handleClose} isPasswordSet={isPasswordSet} />\n </ElevatedAccess>\n </AlertDialog.Content>\n </AlertDialog.Root>\n );\n}\n\nfunction Content({\n onClose,\n isPasswordSet,\n}: {\n onClose: () => void;\n isPasswordSet: boolean;\n}) {\n const securitySettings = useSecuritySettings();\n const resetMfa = useDeleteTotpFactors();\n\n const onSubmitForm = () => {\n resetMfa.mutate();\n };\n\n useDialogClose(resetMfa.isSuccess, () => {\n securitySettings.update(\"Mfa\", false);\n });\n\n return (\n <>\n <AlertDialog.Title>\n <Translation\n defaultMessage=\"Disable multi-factor authentication?\"\n id=\"a4wDlZ\"\n description=\"Dialog title asking to confirm disabling MFA\"\n />\n </AlertDialog.Title>\n <AlertDialog.Description>\n <Translation\n defaultMessage=\"Turning off MFA will remove the additional layer of security on your account.\"\n id=\"24huc/\"\n description=\"Warning that disabling MFA reduces security\"\n trailingSpace\n />\n {isPasswordSet ? (\n <Translation\n defaultMessage=\"We will only ask for your password during sign-in.\"\n id=\"Z6coCJ\"\n description=\"Explanation when password is set but MFA will be disabled\"\n />\n ) : (\n <Translation\n defaultMessage=\"We will not ask for additional verification during sign-in.\"\n id=\"4SH+qg\"\n description=\"Explanation when no password set and MFA will be disabled\"\n />\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={resetMfa.isPending || resetMfa.isSuccess}\n >\n <Translation\n defaultMessage=\"Cancel\"\n id=\"OdCEs1\"\n description=\"Button to cancel disabling MFA\"\n />\n </Button>\n </AlertDialog.Cancel>\n\n <SaveButton\n type=\"submit\"\n loading={resetMfa.isPending}\n done={resetMfa.isSuccess}\n onDone={onClose}\n variant=\"destructive\"\n >\n <Translation\n defaultMessage=\"Disable\"\n id=\"uvxVJM\"\n description=\"Button to confirm disabling MFA\"\n />\n </SaveButton>\n </form>\n </Flex>\n </>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AA8BI;AA5BJ,YAAuB;AACvB,oBAAqB;AAErB,sBAAoC;AACpC,sBAAqC;AACrC,mCAAoC;AACpC,6BAA+B;AAC/B,yBAA2B;AAC3B,8BAA+B;AAC/B,yBAA4B;AAOrB,SAAS,eAAe;AAAA,EAC7B;AAAA,EACA;AAAA,EACA,GAAG;AACL,GAAwB;AACtB,QAAM,CAAC,MAAM,OAAO,IAAI,MAAM,SAAS,KAAK;AAE5C,QAAM,cAAc,MAAM,YAAY,MAAM;AAC1C,YAAQ,KAAK;AAAA,EACf,GAAG,CAAC,CAAC;AAEL,SACE,6CAAC,4BAAY,MAAZ,EAAkB,GAAG,OAAO,MAAY,cAAc,SACrD;AAAA,gDAAC,4BAAY,SAAZ,EAAqB,UAAS;AAAA,IAE/B,4CAAC,4BAAY,SAAZ,EAAoB,UAAS,SAC5B,sDAAC,yCAAe,MAAK,SACnB,sDAAC,WAAQ,SAAS,aAAa,eAA8B,GAC/D,GACF;AAAA,KACF;AAEJ;AAEA,SAAS,QAAQ;AAAA,EACf;AAAA,EACA;AACF,GAGG;AACD,QAAM,uBAAmB,kDAAoB;AAC7C,QAAM,eAAW,sCAAqB;AAEtC,QAAM,eAAe,MAAM;AACzB,aAAS,OAAO;AAAA,EAClB;AAEA,8CAAe,SAAS,WAAW,MAAM;AACvC,qBAAiB,OAAO,OAAO,KAAK;AAAA,EACtC,CAAC;AAED,SACE,4EACE;AAAA,gDAAC,4BAAY,OAAZ,EACC;AAAA,MAAC;AAAA;AAAA,QACC,gBAAe;AAAA,QACf,IAAG;AAAA,QACH,aAAY;AAAA;AAAA,IACd,GACF;AAAA,IACA,6CAAC,4BAAY,aAAZ,EACC;AAAA;AAAA,QAAC;AAAA;AAAA,UACC,gBAAe;AAAA,UACf,IAAG;AAAA,UACH,aAAY;AAAA,UACZ,eAAa;AAAA;AAAA,MACf;AAAA,MACC,gBACC;AAAA,QAAC;AAAA;AAAA,UACC,gBAAe;AAAA,UACf,IAAG;AAAA,UACH,aAAY;AAAA;AAAA,MACd,IAEA;AAAA,QAAC;AAAA;AAAA,UACC,gBAAe;AAAA,UACf,IAAG;AAAA,UACH,aAAY;AAAA;AAAA,MACd;AAAA,OAEJ;AAAA,IAEA,4CAAC,sBAAK,KAAI,KAAI,SAAQ,OAAM,IAAG,KAAI,SAAO,MACxC;AAAA,MAAC;AAAA;AAAA,QACC,UAAU,CAAC,UAAU;AACnB,gBAAM,eAAe;AACrB,uBAAa;AAAA,QACf;AAAA,QAEA;AAAA,sDAAC,4BAAY,QAAZ,EACC;AAAA,YAAC;AAAA;AAAA,cACC,SAAQ;AAAA,cACR,UAAU,SAAS,aAAa,SAAS;AAAA,cAEzC;AAAA,gBAAC;AAAA;AAAA,kBACC,gBAAe;AAAA,kBACf,IAAG;AAAA,kBACH,aAAY;AAAA;AAAA,cACd;AAAA;AAAA,UACF,GACF;AAAA,UAEA;AAAA,YAAC;AAAA;AAAA,cACC,MAAK;AAAA,cACL,SAAS,SAAS;AAAA,cAClB,MAAM,SAAS;AAAA,cACf,QAAQ;AAAA,cACR,SAAQ;AAAA,cAER;AAAA,gBAAC;AAAA;AAAA,kBACC,gBAAe;AAAA,kBACf,IAAG;AAAA,kBACH,aAAY;AAAA;AAAA,cACd;AAAA;AAAA,UACF;AAAA;AAAA;AAAA,IACF,GACF;AAAA,KACF;AAEJ;","names":[]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/lib/use-permissions.ts"],"sourcesContent":["import { skipToken, useQuery } from \"@tanstack/react-query\";\nimport { getClaims } from \"../api/utils.js\";\nimport { IncorrectPermissionsError, NoAuthTokenError } from \"./errors.js\";\nimport { useApi } from \"../api/api-provider.js\";\n\n// TODO find a way to reuse the same type in the @workos-inc/node package\ntype WidgetScope
|
|
1
|
+
{"version":3,"sources":["../../../src/lib/use-permissions.ts"],"sourcesContent":["import { skipToken, useQuery } from \"@tanstack/react-query\";\nimport { getClaims } from \"../api/utils.js\";\nimport { IncorrectPermissionsError, NoAuthTokenError } from \"./errors.js\";\nimport { useApi } from \"../api/api-provider.js\";\n\n// TODO find a way to reuse the same type in the @workos-inc/node package\ntype WidgetScope =\n | \"widgets:users-table:manage\"\n | \"widgets:sso:manage\"\n | \"widgets:domain-verification:manage\"\n | \"widgets:dsync:manage\"\n | \"widgets:api-keys:manage\";\n\nexport function usePermissions(scope: WidgetScope) {\n const { authToken } = useApi();\n\n return useQuery({\n queryKey: [\"permission\", scope, authToken],\n queryFn: authToken\n ? async () => {\n const { permissions } = getClaims(authToken);\n\n // When the permissions is not present in the token\n if (!permissions || !Array.isArray(permissions)) {\n throw new NoAuthTokenError();\n }\n\n // When the scope is not present in the permissions\n if (!permissions.includes(scope)) {\n throw new IncorrectPermissionsError();\n }\n\n return true;\n }\n : skipToken,\n });\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,yBAAoC;AACpC,mBAA0B;AAC1B,oBAA4D;AAC5D,0BAAuB;AAUhB,SAAS,eAAe,OAAoB;AACjD,QAAM,EAAE,UAAU,QAAI,4BAAO;AAE7B,aAAO,6BAAS;AAAA,IACd,UAAU,CAAC,cAAc,OAAO,SAAS;AAAA,IACzC,SAAS,YACL,YAAY;AACV,YAAM,EAAE,YAAY,QAAI,wBAAU,SAAS;AAG3C,UAAI,CAAC,eAAe,CAAC,MAAM,QAAQ,WAAW,GAAG;AAC/C,cAAM,IAAI,+BAAiB;AAAA,MAC7B;AAGA,UAAI,CAAC,YAAY,SAAS,KAAK,GAAG;AAChC,cAAM,IAAI,wCAA0B;AAAA,MACtC;AAEA,aAAO;AAAA,IACT,IACA;AAAA,EACN,CAAC;AACH;","names":[]}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import * as _tanstack_react_query from '@tanstack/react-query';
|
|
2
2
|
|
|
3
|
-
type WidgetScope = "widgets:users-table:manage" | "widgets:api-keys:manage";
|
|
3
|
+
type WidgetScope = "widgets:users-table:manage" | "widgets:sso:manage" | "widgets:domain-verification:manage" | "widgets:dsync:manage" | "widgets:api-keys:manage";
|
|
4
4
|
declare function usePermissions(scope: WidgetScope): _tanstack_react_query.UseQueryResult<boolean, Error>;
|
|
5
5
|
|
|
6
6
|
export { usePermissions };
|
|
@@ -55,7 +55,7 @@ const UsersManagementContextProvider = ({ children }) => {
|
|
|
55
55
|
return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(UsersManagementContext.Provider, { value: context, children });
|
|
56
56
|
};
|
|
57
57
|
const NOOP = () => void 0;
|
|
58
|
-
const EMPTY_PAGINATION = {};
|
|
58
|
+
const EMPTY_PAGINATION = { before: null, after: null };
|
|
59
59
|
function useUsersManagementContext(initialContext) {
|
|
60
60
|
const context = React.useContext(UsersManagementContext);
|
|
61
61
|
if (context) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/lib/users-management-context.tsx"],"sourcesContent":["\"use client\";\n\nimport * as React from \"react\";\nimport {\n UsersManagementAction,\n UsersManagementState,\n useUsersManagementState,\n} from \"./users-management-state.js\";\nimport { ListMetadata } from \"../api/endpoint.js\";\n\nexport interface UsersManagementContextType {\n state: UsersManagementState;\n dispatch: React.Dispatch<UsersManagementAction>;\n}\n\nconst UsersManagementContext = React.createContext<\n UsersManagementContextType | undefined\n>(undefined);\nUsersManagementContext.displayName = \"UsersManagementContext\";\n\nconst initialState: UsersManagementState = {\n pagination: null,\n role: null,\n searchQuery: null,\n};\n\nexport const UsersManagementContextProvider: React.FC<{\n children?: React.ReactNode;\n}> = ({ children }) => {\n const [state, dispatch] = useUsersManagementState(initialState);\n\n const context = React.useMemo<UsersManagementContextType>(\n () => ({\n state,\n dispatch,\n }),\n [state, dispatch],\n );\n\n return (\n <UsersManagementContext.Provider value={context}>\n {children}\n </UsersManagementContext.Provider>\n );\n};\n\nconst NOOP = () => void 0;\nconst EMPTY_PAGINATION: ListMetadata = {};\n\n/**\n * The context may be provided if it is instantiated in the tree above the user.\n */\nexport function useUsersManagementContext(\n initialContext?: UsersManagementContextType | null,\n): UsersManagementContextType {\n const context = React.useContext(UsersManagementContext);\n\n if (context) {\n return context;\n }\n\n if (initialContext) {\n return initialContext;\n }\n\n return {\n dispatch: NOOP,\n state: {\n pagination: EMPTY_PAGINATION,\n role: null,\n searchQuery: null,\n },\n };\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAwCI;AAtCJ,YAAuB;AACvB,oCAIO;AAQP,MAAM,yBAAyB,MAAM,cAEnC,MAAS;AACX,uBAAuB,cAAc;AAErC,MAAM,eAAqC;AAAA,EACzC,YAAY;AAAA,EACZ,MAAM;AAAA,EACN,aAAa;AACf;AAEO,MAAM,iCAER,CAAC,EAAE,SAAS,MAAM;AACrB,QAAM,CAAC,OAAO,QAAQ,QAAI,uDAAwB,YAAY;AAE9D,QAAM,UAAU,MAAM;AAAA,IACpB,OAAO;AAAA,MACL;AAAA,MACA;AAAA,IACF;AAAA,IACA,CAAC,OAAO,QAAQ;AAAA,EAClB;AAEA,SACE,4CAAC,uBAAuB,UAAvB,EAAgC,OAAO,SACrC,UACH;AAEJ;AAEA,MAAM,OAAO,MAAM;AACnB,MAAM,mBAAiC,
|
|
1
|
+
{"version":3,"sources":["../../../src/lib/users-management-context.tsx"],"sourcesContent":["\"use client\";\n\nimport * as React from \"react\";\nimport {\n UsersManagementAction,\n UsersManagementState,\n useUsersManagementState,\n} from \"./users-management-state.js\";\nimport { ListMetadata } from \"../api/endpoint.js\";\n\nexport interface UsersManagementContextType {\n state: UsersManagementState;\n dispatch: React.Dispatch<UsersManagementAction>;\n}\n\nconst UsersManagementContext = React.createContext<\n UsersManagementContextType | undefined\n>(undefined);\nUsersManagementContext.displayName = \"UsersManagementContext\";\n\nconst initialState: UsersManagementState = {\n pagination: null,\n role: null,\n searchQuery: null,\n};\n\nexport const UsersManagementContextProvider: React.FC<{\n children?: React.ReactNode;\n}> = ({ children }) => {\n const [state, dispatch] = useUsersManagementState(initialState);\n\n const context = React.useMemo<UsersManagementContextType>(\n () => ({\n state,\n dispatch,\n }),\n [state, dispatch],\n );\n\n return (\n <UsersManagementContext.Provider value={context}>\n {children}\n </UsersManagementContext.Provider>\n );\n};\n\nconst NOOP = () => void 0;\nconst EMPTY_PAGINATION: ListMetadata = { before: null, after: null };\n\n/**\n * The context may be provided if it is instantiated in the tree above the user.\n */\nexport function useUsersManagementContext(\n initialContext?: UsersManagementContextType | null,\n): UsersManagementContextType {\n const context = React.useContext(UsersManagementContext);\n\n if (context) {\n return context;\n }\n\n if (initialContext) {\n return initialContext;\n }\n\n return {\n dispatch: NOOP,\n state: {\n pagination: EMPTY_PAGINATION,\n role: null,\n searchQuery: null,\n },\n };\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAwCI;AAtCJ,YAAuB;AACvB,oCAIO;AAQP,MAAM,yBAAyB,MAAM,cAEnC,MAAS;AACX,uBAAuB,cAAc;AAErC,MAAM,eAAqC;AAAA,EACzC,YAAY;AAAA,EACZ,MAAM;AAAA,EACN,aAAa;AACf;AAEO,MAAM,iCAER,CAAC,EAAE,SAAS,MAAM;AACrB,QAAM,CAAC,OAAO,QAAQ,QAAI,uDAAwB,YAAY;AAE9D,QAAM,UAAU,MAAM;AAAA,IACpB,OAAO;AAAA,MACL;AAAA,MACA;AAAA,IACF;AAAA,IACA,CAAC,OAAO,QAAQ;AAAA,EAClB;AAEA,SACE,4CAAC,uBAAuB,UAAvB,EAAgC,OAAO,SACrC,UACH;AAEJ;AAEA,MAAM,OAAO,MAAM;AACnB,MAAM,mBAAiC,EAAE,QAAQ,MAAM,OAAO,KAAK;AAK5D,SAAS,0BACd,gBAC4B;AAC5B,QAAM,UAAU,MAAM,WAAW,sBAAsB;AAEvD,MAAI,SAAS;AACX,WAAO;AAAA,EACT;AAEA,MAAI,gBAAgB;AAClB,WAAO;AAAA,EACT;AAEA,SAAO;AAAA,IACL,UAAU;AAAA,IACV,OAAO;AAAA,MACL,YAAY;AAAA,MACZ,MAAM;AAAA,MACN,aAAa;AAAA,IACf;AAAA,EACF;AACF;","names":[]}
|
|
@@ -62,7 +62,7 @@ const UsersManagement = ({
|
|
|
62
62
|
const users = userData?.data ?? [];
|
|
63
63
|
const usersCount = users?.length ?? 0;
|
|
64
64
|
const isHydrated = (0, import_use_is_hydrated.useIsHydrated)();
|
|
65
|
-
const
|
|
65
|
+
const pagination = (0, import_utils.getListMetadata)(userData);
|
|
66
66
|
const { dispatch } = (0, import_users_management_context.useUsersManagementContext)();
|
|
67
67
|
const isMultipleRolesEnabled = rolesData.multipleRolesEnabled;
|
|
68
68
|
const translate = (0, import_use_translation.useTranslation)();
|
|
@@ -238,7 +238,7 @@ const UsersManagement = ({
|
|
|
238
238
|
if (pagination.after) {
|
|
239
239
|
dispatch({
|
|
240
240
|
type: "SET_PAGINATION",
|
|
241
|
-
pagination: { after: pagination.after }
|
|
241
|
+
pagination: { after: pagination.after, before: null }
|
|
242
242
|
});
|
|
243
243
|
}
|
|
244
244
|
},
|
|
@@ -263,7 +263,7 @@ const UsersManagement = ({
|
|
|
263
263
|
if (pagination.before) {
|
|
264
264
|
dispatch({
|
|
265
265
|
type: "SET_PAGINATION",
|
|
266
|
-
pagination: { before: pagination.before }
|
|
266
|
+
pagination: { before: pagination.before, after: null }
|
|
267
267
|
});
|
|
268
268
|
}
|
|
269
269
|
},
|