From 346e3df0092282737deecf7b7a795e37f2472d55 Mon Sep 17 00:00:00 2001 From: giorgoslytos Date: Fri, 17 May 2024 12:14:47 +0300 Subject: [PATCH] feat: Addition of FederatedIdentity Account Page --- src/account/Fallback.tsx | 3 + src/account/kcContext/KcContext.ts | 23 +++++++- src/account/kcContext/kcContextMocks.ts | 16 +++++ src/account/pages/FederatedIdentity.tsx | 58 +++++++++++++++++++ src/bin/keycloakify/generateFtl/pageId.ts | 10 +++- .../pages/FederatedIdentity.stories.tsx | 34 +++++++++++ 6 files changed, 142 insertions(+), 2 deletions(-) create mode 100644 src/account/pages/FederatedIdentity.tsx create mode 100644 stories/account/pages/FederatedIdentity.stories.tsx diff --git a/src/account/Fallback.tsx b/src/account/Fallback.tsx index 8fe62daf..d19f3227 100644 --- a/src/account/Fallback.tsx +++ b/src/account/Fallback.tsx @@ -3,6 +3,7 @@ import type { PageProps } from "keycloakify/account/pages/PageProps"; import type { I18n } from "keycloakify/account/i18n"; import type { KcContext } from "./kcContext"; import { assert, type Equals } from "tsafe/assert"; +import FederatedIdentity from "./pages/FederatedIdentity"; const Password = lazy(() => import("keycloakify/account/pages/Password")); const Account = lazy(() => import("keycloakify/account/pages/Account")); @@ -30,6 +31,8 @@ export default function Fallback(props: PageProps) { return ; case "log.ftl": return ; + case "federatedIdentity.ftl": + return ; } assert>(false); })()} diff --git a/src/account/kcContext/KcContext.ts b/src/account/kcContext/KcContext.ts index 19ca1a6f..9b32c0cf 100644 --- a/src/account/kcContext/KcContext.ts +++ b/src/account/kcContext/KcContext.ts @@ -3,7 +3,14 @@ import { assert } from "tsafe/assert"; import type { Equals } from "tsafe"; import { type ThemeType } from "keycloakify/bin/constants"; -export type KcContext = KcContext.Password | KcContext.Account | KcContext.Sessions | KcContext.Totp | KcContext.Applications | KcContext.Log; +export type KcContext = + | KcContext.Password + | KcContext.Account + | KcContext.Sessions + | KcContext.Totp + | KcContext.Applications + | KcContext.Log + | KcContext.FederatedIdentity; export declare namespace KcContext { export type Common = { @@ -264,6 +271,20 @@ export declare namespace KcContext { }[]; }; }; + + export type FederatedIdentity = Common & { + pageId: "federatedIdentity.ftl"; + stateChecker: string; + federatedIdentity: { + identities: { + providerId: string; + displayName: string; + userName: string; + connected: boolean; + }[]; + removeLinkPossible: boolean; + }; + }; } { diff --git a/src/account/kcContext/kcContextMocks.ts b/src/account/kcContext/kcContextMocks.ts index 69d0a8d4..1053b367 100644 --- a/src/account/kcContext/kcContextMocks.ts +++ b/src/account/kcContext/kcContextMocks.ts @@ -240,5 +240,21 @@ export const kcContextMocks: KcContext[] = [ } ] } + }), + id({ + ...kcContextCommonMock, + "stateChecker": "", + "pageId": "federatedIdentity.ftl", + "federatedIdentity": { + "identities": [ + { + "providerId": "keycloak-oidc", + "displayName": "keycloak-oidc", + "userName": "John", + "connected": true + } + ], + "removeLinkPossible": true + } }) ]; diff --git a/src/account/pages/FederatedIdentity.tsx b/src/account/pages/FederatedIdentity.tsx new file mode 100644 index 00000000..91833952 --- /dev/null +++ b/src/account/pages/FederatedIdentity.tsx @@ -0,0 +1,58 @@ +import { PageProps } from "keycloakify/account"; +import { I18n } from "keycloakify/account/i18n"; +import { KcContext } from "keycloakify/account/kcContext"; + +export default function FederatedIdentity(props: PageProps, I18n>) { + const { kcContext, i18n, doUseDefaultCss, classes, Template } = props; + + const { url, federatedIdentity, stateChecker } = kcContext; + const { msg } = i18n; + return ( + + ); +} diff --git a/src/bin/keycloakify/generateFtl/pageId.ts b/src/bin/keycloakify/generateFtl/pageId.ts index e0dce92c..cd1083c8 100644 --- a/src/bin/keycloakify/generateFtl/pageId.ts +++ b/src/bin/keycloakify/generateFtl/pageId.ts @@ -27,7 +27,15 @@ export const loginThemePageIds = [ "saml-post-form.ftl" ] as const; -export const accountThemePageIds = ["password.ftl", "account.ftl", "sessions.ftl", "totp.ftl", "applications.ftl", "log.ftl"] as const; +export const accountThemePageIds = [ + "password.ftl", + "account.ftl", + "sessions.ftl", + "totp.ftl", + "applications.ftl", + "log.ftl", + "federatedIdentity.ftl" +] as const; export type LoginThemePageId = (typeof loginThemePageIds)[number]; export type AccountThemePageId = (typeof accountThemePageIds)[number]; diff --git a/stories/account/pages/FederatedIdentity.stories.tsx b/stories/account/pages/FederatedIdentity.stories.tsx new file mode 100644 index 00000000..ab9d782c --- /dev/null +++ b/stories/account/pages/FederatedIdentity.stories.tsx @@ -0,0 +1,34 @@ +import React from "react"; +import { Meta } from "@storybook/react"; +import { createPageStory } from "../createPageStory"; + +const pageId = "federatedIdentity.ftl"; + +const { PageStory } = createPageStory({ pageId }); + +const meta = { + title: "account/FederatedIdentity", + component: PageStory +} satisfies Meta; + +export default meta; + +export const Default = () => ; + +export const NotConnected = () => ( + +);