From 1572d9a2837c9b5437eb36561f34135349b06187 Mon Sep 17 00:00:00 2001 From: Vasilica Olariu Date: Mon, 14 Aug 2023 10:40:01 +0300 Subject: [PATCH] TAL-52 - Update uninav integration: for profiles we need to redirect to login after logout --- .../src/components/app-header/AppHeader.tsx | 8 +++-- src/apps/platform/src/providers/Providers.tsx | 15 ++++---- src/apps/profiles/src/ProfilesApp.tsx | 13 ++++--- .../authentication-url.config.ts | 7 ++-- .../auth/authentication-functions/index.ts | 1 + .../shared/lib/contexts/config.context.tsx | 34 +++++++++++++++++++ src/libs/shared/lib/contexts/index.ts | 1 + src/libs/shared/lib/index.ts | 1 + 8 files changed, 66 insertions(+), 14 deletions(-) create mode 100644 src/libs/shared/lib/contexts/config.context.tsx create mode 100644 src/libs/shared/lib/contexts/index.ts diff --git a/src/apps/platform/src/components/app-header/AppHeader.tsx b/src/apps/platform/src/components/app-header/AppHeader.tsx index df44f1d9e..c16722fb4 100644 --- a/src/apps/platform/src/components/app-header/AppHeader.tsx +++ b/src/apps/platform/src/components/app-header/AppHeader.tsx @@ -17,13 +17,13 @@ import classNames from 'classnames' import { EnvironmentConfig, PageSubheaderPortalId } from '~/config' import { authUrlLogin, - authUrlLogout, authUrlSignup, profileContext, ProfileContextData, routerContext, RouterContextData, } from '~/libs/core' +import { ConfigContextValue, useConfigContext } from '~/libs/shared' import UniNavSnippet from './universal-nav-snippet' @@ -39,6 +39,7 @@ const AppHeader: FC<{}> = () => { const { activeToolName, activeToolRoute }: RouterContextData = useContext(routerContext) const { profile, initialized: profileReady }: ProfileContextData = useContext(profileContext) + const { logoutUrl }: ConfigContextValue = useConfigContext() const [ready, setReady]: [boolean, Dispatch>] = useState(false) const headerInit: MutableRefObject = useRef(false) const navElementId: string = PageSubheaderPortalId @@ -95,7 +96,7 @@ const AppHeader: FC<{}> = () => { }, onReady() { setReady(true) }, signIn() { window.location.href = authUrlLogin() }, - signOut() { window.location.href = authUrlLogout }, + signOut() { window.location.href = logoutUrl }, signUp() { window.location.href = authUrlSignup() }, toolName: activeToolName, toolRoot: activeToolRoute, @@ -110,6 +111,7 @@ const AppHeader: FC<{}> = () => { navigationHandler, userInfo, profileReady, + logoutUrl, ]) // update uni-nav's tool details @@ -141,12 +143,14 @@ const AppHeader: FC<{}> = () => { navElementId, { ...userInfo, + signOut() { window.location.href = logoutUrl }, }, ) }, [ profileReady, userInfo, navElementId, + logoutUrl, ]) return ( diff --git a/src/apps/platform/src/providers/Providers.tsx b/src/apps/platform/src/providers/Providers.tsx index 1795e393b..b16709bb2 100644 --- a/src/apps/platform/src/providers/Providers.tsx +++ b/src/apps/platform/src/providers/Providers.tsx @@ -1,6 +1,7 @@ import { FC, ReactNode } from 'react' -import { ProfileProvider } from '~/libs/core' +import { authUrlLogout, ProfileProvider } from '~/libs/core' +import { ConfigContextProvider } from '~/libs/shared' import { PlatformRouterProvider } from './platform-router.provider' @@ -9,11 +10,13 @@ interface ProvidersProps { } const Providers: FC = props => ( - - - {props.children} - - + + + + {props.children} + + + ) export default Providers diff --git a/src/apps/profiles/src/ProfilesApp.tsx b/src/apps/profiles/src/ProfilesApp.tsx index 1761eb1f0..c31acfd42 100644 --- a/src/apps/profiles/src/ProfilesApp.tsx +++ b/src/apps/profiles/src/ProfilesApp.tsx @@ -1,14 +1,19 @@ -import { FC, useContext } from 'react' +import { FC, useContext, useEffect } from 'react' import { Outlet, Routes } from 'react-router-dom' -import { routerContext, RouterContextData } from '~/libs/core' -import { SharedSwrConfig } from '~/libs/shared' +import { authUrlLogin, authUrlLogoutFn, routerContext, RouterContextData } from '~/libs/core' +import { ConfigContextValue, SharedSwrConfig, useConfigContext } from '~/libs/shared' -import { toolTitle } from './profiles.routes' +import { absoluteRootRoute, toolTitle } from './profiles.routes' const ProfilesApp: FC<{}> = () => { + const { setLogoutUrl }: ConfigContextValue = useConfigContext() const { getChildRoutes }: RouterContextData = useContext(routerContext) + useEffect(() => { + setLogoutUrl(authUrlLogoutFn(authUrlLogin(absoluteRootRoute))) + }, [setLogoutUrl]) + return ( diff --git a/src/libs/core/lib/auth/authentication-functions/authentication-url.config.ts b/src/libs/core/lib/auth/authentication-functions/authentication-url.config.ts index b0dcf566a..a02abd79d 100644 --- a/src/libs/core/lib/auth/authentication-functions/authentication-url.config.ts +++ b/src/libs/core/lib/auth/authentication-functions/authentication-url.config.ts @@ -9,8 +9,11 @@ export function login(returnUrl?: string): string { return `${authentication}?retUrl=${encodeURIComponent(retUrl)}` } -export const logout: string - = `${authentication}?logout=true&retUrl=${encodeURIComponent(`https://${window.location.host}`)}` +export const logoutFn = (retUrl: string): string => ( + `${authentication}?logout=true&retUrl=${encodeURIComponent(retUrl)}` +) + +export const logout: string = logoutFn(`https://${window.location.host}`) export function signup(returnUrl?: string, regSource?: AuthenticationRegistrationSource): string { return `${login(returnUrl)}&mode=signUp${!!regSource ? `®Source=${regSource}` : ''}` diff --git a/src/libs/core/lib/auth/authentication-functions/index.ts b/src/libs/core/lib/auth/authentication-functions/index.ts index 868f7d4fc..48677e7c8 100644 --- a/src/libs/core/lib/auth/authentication-functions/index.ts +++ b/src/libs/core/lib/auth/authentication-functions/index.ts @@ -3,6 +3,7 @@ export { authentication as authUrl, login as authUrlLogin, logout as authUrlLogout, + logoutFn as authUrlLogoutFn, signup as authUrlSignup, } from './authentication-url.config' export { diff --git a/src/libs/shared/lib/contexts/config.context.tsx b/src/libs/shared/lib/contexts/config.context.tsx new file mode 100644 index 000000000..1fce52c48 --- /dev/null +++ b/src/libs/shared/lib/contexts/config.context.tsx @@ -0,0 +1,34 @@ +import { createContext, FC, ReactNode, useContext, useMemo, useState } from 'react' + +export interface ConfigContextValue { + logoutUrl: string + setLogoutUrl: (logoutUrl: string) => void +} + +const ConfigReactCtx = createContext({} as ConfigContextValue) + +interface ConfigContextProps { + children?: ReactNode + logoutUrl: string +} + +export const ConfigContextProvider: FC = props => { + const [logoutUrl, setLogoutUrl] = useState(props.logoutUrl) + + const contextValue = useMemo(() => ({ + logoutUrl, + setLogoutUrl, + }), [setLogoutUrl, logoutUrl]) + + return ( + + {props.children} + + ) +} + +export const useConfigContext = (): ConfigContextValue => ( + useContext(ConfigReactCtx) +) diff --git a/src/libs/shared/lib/contexts/index.ts b/src/libs/shared/lib/contexts/index.ts new file mode 100644 index 000000000..b81f11c74 --- /dev/null +++ b/src/libs/shared/lib/contexts/index.ts @@ -0,0 +1 @@ +export * from './config.context' diff --git a/src/libs/shared/lib/index.ts b/src/libs/shared/lib/index.ts index 4ec5adda2..35d676899 100644 --- a/src/libs/shared/lib/index.ts +++ b/src/libs/shared/lib/index.ts @@ -1,3 +1,4 @@ +export * from './contexts' export * from './components' export * from './containers' export * from './hooks'