@schemavaults/auth-ui 0.6.61 → 0.6.62
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/dist/components/AccountCard/account_card.js +12 -1
- package/dist/components/AccountCard/account_card.js.map +1 -1
- package/dist/components/AccountCard/index.d.ts +2 -0
- package/dist/components/AccountCard/index.js +1 -0
- package/dist/components/AccountCard/index.js.map +1 -1
- package/dist/components/AccountCard/useMyOrganizations.d.ts +13 -0
- package/dist/components/AccountCard/useMyOrganizations.js +50 -0
- package/dist/components/AccountCard/useMyOrganizations.js.map +1 -0
- package/package.json +3 -3
|
@@ -5,6 +5,7 @@ import { MAXIMUM_USER_ORGANIZATIONS, } from "@schemavaults/auth-common";
|
|
|
5
5
|
import SignOutButton from "../SignOutButton";
|
|
6
6
|
import ViewFullUserProfileButton from "./view_full_user_profile";
|
|
7
7
|
import ViewAdminDashboardButton from "./view_admin_page_link";
|
|
8
|
+
import { useMyOrganizations, } from "./useMyOrganizations";
|
|
8
9
|
import { getHardcodedClientWebAppDomain, SCHEMAVAULTS_AUTH_APP_DEFINITION, } from "@schemavaults/app-definitions";
|
|
9
10
|
import { Building2, Plus } from "lucide-react";
|
|
10
11
|
export function AccountDetailsCard(props) {
|
|
@@ -13,7 +14,17 @@ export function AccountDetailsCard(props) {
|
|
|
13
14
|
const auth_server_uri = getHardcodedClientWebAppDomain(SCHEMAVAULTS_AUTH_APP_DEFINITION.app_id, props.appEnvironment);
|
|
14
15
|
const cardClassName = cn("w-full", props.cardClassName);
|
|
15
16
|
const showLinkToAuthServerAccountPage = !props.isAuthServerAccountPage;
|
|
16
|
-
|
|
17
|
+
// Convert preloaded OrganizationDefinitions to MyOrganizationMembership format for SWR initialData
|
|
18
|
+
const preloadedMemberships = props.organizations?.map((org) => ({
|
|
19
|
+
organization_id: org.organization_id,
|
|
20
|
+
organization_name: org.name,
|
|
21
|
+
role: "",
|
|
22
|
+
created_at: org.created_at,
|
|
23
|
+
}));
|
|
24
|
+
const { data: memberships } = useMyOrganizations({
|
|
25
|
+
initialData: props.isAuthServerAccountPage ? preloadedMemberships : undefined,
|
|
26
|
+
});
|
|
27
|
+
return (_jsxs(Card, { className: cardClassName, children: [_jsxs(CardHeader, { children: [_jsx(CardTitle, { children: "Account Details" }), _jsx(CardDescription, { children: "View and manage your SchemaVaults account." })] }), _jsx(CardContent, { children: _jsxs("div", { className: "flex flex-col items-start justify-start gap-2", children: [_jsx(KeyValueWithSkeleton, { label: "User ID", value: currentUser?.uid }), _jsx(KeyValueWithSkeleton, { label: "Email", value: currentUser?.email }), props.isAuthServerAccountPage && (_jsxs("div", { className: "flex flex-row items-center justify-start gap-2 flex-wrap", children: [_jsx("h3", { className: "text-lg font-bold", children: "Organizations:" }), memberships && memberships.length > 0 ? (_jsx(_Fragment, { children: memberships.map((membership) => (_jsx(Link, { href: `/org/${membership.organization_id}`, children: _jsxs(Button, { variant: "outline", size: "sm", className: "flex flex-row flex-nowrap gap-2", children: [_jsx(Building2, { className: "h-4 w-4" }), membership.organization_name, membership.role && (_jsxs("span", { className: "text-xs text-muted-foreground", children: ["(", membership.role, ")"] }))] }) }, membership.organization_id))) })) : (_jsx("p", { className: "text-sm text-muted-foreground", children: "No organizations" })), (!memberships || memberships.length < MAXIMUM_USER_ORGANIZATIONS) && (_jsx(Link, { href: "/org/new", children: _jsxs(Button, { variant: "outline", size: "sm", className: "flex flex-row flex-nowrap gap-2", children: [_jsx(Plus, { className: "h-4 w-4" }), "Create Organization"] }) }))] }))] }) }), _jsx(CardFooter, { children: _jsxs("div", { className: "flex flex-row items-start justify-start flex-wrap gap-2", children: [_jsx(SignOutButton, { Link: props.Link }), showLinkToAuthServerAccountPage && (_jsx(ViewFullUserProfileButton, { navigate: async () => {
|
|
17
28
|
const accountUrl = `${auth_server_uri}/account`;
|
|
18
29
|
await props.redirect(accountUrl);
|
|
19
30
|
} })), _jsx(ViewAdminDashboardButton, { navigate: async () => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"account_card.js","sourceRoot":"","sources":["../../../src/components/AccountCard/account_card.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;;AAGb,OAAO,EACL,MAAM,EACN,IAAI,EACJ,WAAW,EACX,eAAe,EACf,UAAU,EACV,UAAU,EACV,SAAS,EACT,oBAAoB,EACpB,EAAE,GACH,MAAM,kBAAkB,CAAC;AAE1B,OAAO,EAEL,0BAA0B,GAC3B,MAAM,2BAA2B,CAAC;AACnC,OAAO,aAAa,MAAM,4BAA4B,CAAC;AACvD,OAAO,yBAAyB,MAAM,0BAA0B,CAAC;AACjE,OAAO,wBAAwB,MAAM,wBAAwB,CAAC;AAC9D,OAAO,EACL,8BAA8B,EAC9B,gCAAgC,GAEjC,MAAM,+BAA+B,CAAC;AACvC,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,cAAc,CAAC;AAa/C,MAAM,UAAU,kBAAkB,CAChC,KAA8B;IAE9B,MAAM,WAAW,GAAG,KAAK,CAAC,IAAI,CAAC;IAC/B,MAAM,IAAI,GAA4C,KAAK,CAAC,IAAI,CAAC;IAEjE,MAAM,eAAe,GAAW,8BAA8B,CAC5D,gCAAgC,CAAC,MAAM,EACvC,KAAK,CAAC,cAAc,CACrB,CAAC;IAEF,MAAM,aAAa,GAAW,EAAE,CAAC,QAAQ,EAAE,KAAK,CAAC,aAAa,CAAC,CAAC;IAEhE,MAAM,+BAA+B,GACnC,CAAC,KAAK,CAAC,uBAAuB,CAAC;IAEjC,OAAO,CACL,MAAC,IAAI,IAAC,SAAS,EAAE,aAAa,aAC5B,MAAC,UAAU,eACT,KAAC,SAAS,kCAA4B,EACtC,KAAC,eAAe,6DAEE,IACP,EACb,KAAC,WAAW,cACV,eAAK,SAAS,EAAC,+CAA+C,aAC5D,KAAC,oBAAoB,IAAC,KAAK,EAAC,SAAS,EAAC,KAAK,EAAE,WAAW,EAAE,GAAG,GAAI,EACjE,KAAC,oBAAoB,IAAC,KAAK,EAAC,OAAO,EAAC,KAAK,EAAE,WAAW,EAAE,KAAK,GAAI,EAGhE,KAAK,CAAC,uBAAuB,IAAI,CAChC,eAAK,SAAS,EAAC,0DAA0D,aACvE,aAAI,SAAS,EAAC,mBAAmB,+BAAoB,EACpD,
|
|
1
|
+
{"version":3,"file":"account_card.js","sourceRoot":"","sources":["../../../src/components/AccountCard/account_card.tsx"],"names":[],"mappings":"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"}
|
|
@@ -1,2 +1,4 @@
|
|
|
1
1
|
export { AccountDetailsCard, AccountDetailsCard as default, AccountDetailsCard as AccountCard, } from "./account_card";
|
|
2
2
|
export type * from "./account_card";
|
|
3
|
+
export { useMyOrganizations, clearMyOrganizationsCache } from "./useMyOrganizations";
|
|
4
|
+
export type { MyOrganizationMembership, UseMyOrganizationsOptions } from "./useMyOrganizations";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/components/AccountCard/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,kBAAkB,EAClB,kBAAkB,IAAI,OAAO,EAC7B,kBAAkB,IAAI,WAAW,GAClC,MAAM,gBAAgB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/components/AccountCard/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,kBAAkB,EAClB,kBAAkB,IAAI,OAAO,EAC7B,kBAAkB,IAAI,WAAW,GAClC,MAAM,gBAAgB,CAAC;AAGxB,OAAO,EAAE,kBAAkB,EAAE,yBAAyB,EAAE,MAAM,sBAAsB,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { type SWRResponse, useSWRConfig } from "swr";
|
|
2
|
+
export interface MyOrganizationMembership {
|
|
3
|
+
organization_id: string;
|
|
4
|
+
organization_name: string;
|
|
5
|
+
role: string;
|
|
6
|
+
created_at: number;
|
|
7
|
+
}
|
|
8
|
+
export interface UseMyOrganizationsOptions {
|
|
9
|
+
initialData?: readonly MyOrganizationMembership[] | undefined;
|
|
10
|
+
}
|
|
11
|
+
export declare function clearMyOrganizationsCache(mutate: ReturnType<typeof useSWRConfig>["mutate"]): void;
|
|
12
|
+
export declare function useMyOrganizations({ initialData, }: UseMyOrganizationsOptions): SWRResponse<readonly MyOrganizationMembership[]>;
|
|
13
|
+
export default useMyOrganizations;
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { useToast } from "@schemavaults/ui";
|
|
3
|
+
import useSWR from "swr";
|
|
4
|
+
const MY_ORGANIZATIONS_ENDPOINT = "/api/me/organizations";
|
|
5
|
+
export function clearMyOrganizationsCache(mutate) {
|
|
6
|
+
mutate((key) => key.startsWith(MY_ORGANIZATIONS_ENDPOINT), undefined, {
|
|
7
|
+
revalidate: true,
|
|
8
|
+
});
|
|
9
|
+
}
|
|
10
|
+
export function useMyOrganizations({ initialData, }) {
|
|
11
|
+
const { toast } = useToast();
|
|
12
|
+
return useSWR(MY_ORGANIZATIONS_ENDPOINT, async () => {
|
|
13
|
+
try {
|
|
14
|
+
const response = await fetch(MY_ORGANIZATIONS_ENDPOINT, {
|
|
15
|
+
method: "GET",
|
|
16
|
+
credentials: "include",
|
|
17
|
+
});
|
|
18
|
+
if (!response.ok || response.status !== 200) {
|
|
19
|
+
throw new Error(`Failed to list user organizations (response status: ${response.status})!`);
|
|
20
|
+
}
|
|
21
|
+
const body = await response.json();
|
|
22
|
+
if (typeof body !== "object" ||
|
|
23
|
+
!body ||
|
|
24
|
+
!("success" in body) ||
|
|
25
|
+
!body.success) {
|
|
26
|
+
throw new Error("Received failure response when attempting to list user organizations");
|
|
27
|
+
}
|
|
28
|
+
if (!("data" in body) ||
|
|
29
|
+
typeof body.data !== "object" ||
|
|
30
|
+
!body.data ||
|
|
31
|
+
!("memberships" in body.data) ||
|
|
32
|
+
!Array.isArray(body.data.memberships)) {
|
|
33
|
+
throw new Error("Failed to extract 'memberships' array from response!");
|
|
34
|
+
}
|
|
35
|
+
return body.data.memberships;
|
|
36
|
+
}
|
|
37
|
+
catch (error) {
|
|
38
|
+
toast({
|
|
39
|
+
variant: "destructive",
|
|
40
|
+
title: "Error loading organizations",
|
|
41
|
+
description: `${error instanceof Error ? error.message : "An unknown error occurred."}`,
|
|
42
|
+
});
|
|
43
|
+
throw error;
|
|
44
|
+
}
|
|
45
|
+
}, {
|
|
46
|
+
fallbackData: initialData ? [...initialData] : undefined,
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
export default useMyOrganizations;
|
|
50
|
+
//# sourceMappingURL=useMyOrganizations.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useMyOrganizations.js","sourceRoot":"","sources":["../../../src/components/AccountCard/useMyOrganizations.ts"],"names":[],"mappings":"AAAA,YAAY,CAAC;AAEb,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,MAA0C,MAAM,KAAK,CAAC;AAa7D,MAAM,yBAAyB,GAAG,uBAAuB,CAAC;AAE1D,MAAM,UAAU,yBAAyB,CACvC,MAAiD;IAEjD,MAAM,CACJ,CAAC,GAAW,EAAE,EAAE,CAAC,GAAG,CAAC,UAAU,CAAC,yBAAyB,CAAC,EAC1D,SAAS,EACT;QACE,UAAU,EAAE,IAAI;KACjB,CACF,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,EACjC,WAAW,GACe;IAC1B,MAAM,EAAE,KAAK,EAAE,GAAG,QAAQ,EAAE,CAAC;IAE7B,OAAO,MAAM,CACX,yBAAyB,EACzB,KAAK,IAAkD,EAAE;QACvD,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,yBAAyB,EAAE;gBACtD,MAAM,EAAE,KAAK;gBACb,WAAW,EAAE,SAAS;aACvB,CAAC,CAAC;YACH,IAAI,CAAC,QAAQ,CAAC,EAAE,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;gBAC5C,MAAM,IAAI,KAAK,CACb,uDAAuD,QAAQ,CAAC,MAAM,IAAI,CAC3E,CAAC;YACJ,CAAC;YACD,MAAM,IAAI,GAAY,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;YAC5C,IACE,OAAO,IAAI,KAAK,QAAQ;gBACxB,CAAC,IAAI;gBACL,CAAC,CAAC,SAAS,IAAI,IAAI,CAAC;gBACpB,CAAC,IAAI,CAAC,OAAO,EACb,CAAC;gBACD,MAAM,IAAI,KAAK,CACb,sEAAsE,CACvE,CAAC;YACJ,CAAC;YACD,IACE,CAAC,CAAC,MAAM,IAAI,IAAI,CAAC;gBACjB,OAAO,IAAI,CAAC,IAAI,KAAK,QAAQ;gBAC7B,CAAC,IAAI,CAAC,IAAI;gBACV,CAAC,CAAC,aAAa,IAAI,IAAI,CAAC,IAAI,CAAC;gBAC7B,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,EACrC,CAAC;gBACD,MAAM,IAAI,KAAK,CACb,sDAAsD,CACvD,CAAC;YACJ,CAAC;YAED,OAAO,IAAI,CAAC,IAAI,CAAC,WAAyC,CAAC;QAC7D,CAAC;QAAC,OAAO,KAAc,EAAE,CAAC;YACxB,KAAK,CAAC;gBACJ,OAAO,EAAE,aAAa;gBACtB,KAAK,EAAE,6BAA6B;gBACpC,WAAW,EAAE,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,4BAA4B,EAAE;aACxF,CAAC,CAAC;YACH,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC,EACD;QACE,YAAY,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC,SAAS;KACzD,CACF,CAAC;AACJ,CAAC;AAED,eAAe,kBAAkB,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@schemavaults/auth-ui",
|
|
3
|
-
"version": "0.6.
|
|
3
|
+
"version": "0.6.62",
|
|
4
4
|
"private": false,
|
|
5
5
|
"license": "UNLICENSED",
|
|
6
6
|
"description": "React.js UI components for authentication/authorization shared between different SchemaVaults apps",
|
|
@@ -11,9 +11,9 @@
|
|
|
11
11
|
},
|
|
12
12
|
"dependencies": {
|
|
13
13
|
"@schemavaults/ui": "0.14.5",
|
|
14
|
-
"@schemavaults/auth-react-provider": "0.10.
|
|
14
|
+
"@schemavaults/auth-react-provider": "0.10.17",
|
|
15
15
|
"@schemavaults/app-definitions": "0.6.21",
|
|
16
|
-
"@schemavaults/auth-common": "0.
|
|
16
|
+
"@schemavaults/auth-common": "0.10.0",
|
|
17
17
|
"@hookform/resolvers": "3.9.0"
|
|
18
18
|
},
|
|
19
19
|
"devDependencies": {
|