diff --git a/.changeset/spicy-olives-itch.md b/.changeset/spicy-olives-itch.md new file mode 100644 index 000000000..73a30f5b6 --- /dev/null +++ b/.changeset/spicy-olives-itch.md @@ -0,0 +1,5 @@ +--- +"@orchestrator-ui/orchestrator-ui-components": minor +--- + +Signs user out when api calls fail because of expired token diff --git a/apps/wfo-ui b/apps/wfo-ui index 854d788c7..6999cb6bb 160000 --- a/apps/wfo-ui +++ b/apps/wfo-ui @@ -1 +1 @@ -Subproject commit 854d788c7a8acce956d3892163a80655c9bb1c1f +Subproject commit 6999cb6bb154f6bb624ad9461ea8ee611b89ddf7 diff --git a/packages/orchestrator-ui-components/src/components/WfoRouteChangeListener/WfoRouteChangeListener.tsx b/packages/orchestrator-ui-components/src/components/WfoRouteChangeListener/WfoRouteChangeListener.tsx new file mode 100644 index 000000000..2691a08ae --- /dev/null +++ b/packages/orchestrator-ui-components/src/components/WfoRouteChangeListener/WfoRouteChangeListener.tsx @@ -0,0 +1,22 @@ +import React, { useEffect } from 'react'; + +import { getSession, signOut } from 'next-auth/react'; +import { useRouter } from 'next/router'; + +import { useGetOrchestratorConfig } from '@/hooks'; + +export const WfoRouteChangeListener = () => { + const router = useRouter(); + const { authActive } = useGetOrchestratorConfig(); + + useEffect(() => { + if (authActive) { + getSession().then((session) => { + if (!session) { + signOut(); + } + }); + } + }, [authActive, router]); + return <>; +}; diff --git a/packages/orchestrator-ui-components/src/components/WfoRouteChangeListener/index.tsx b/packages/orchestrator-ui-components/src/components/WfoRouteChangeListener/index.tsx new file mode 100644 index 000000000..1c628f76d --- /dev/null +++ b/packages/orchestrator-ui-components/src/components/WfoRouteChangeListener/index.tsx @@ -0,0 +1 @@ +export * from './WfoRouteChangeListener'; diff --git a/packages/orchestrator-ui-components/src/components/index.ts b/packages/orchestrator-ui-components/src/components/index.ts index 995aeee49..5b0aad79d 100644 --- a/packages/orchestrator-ui-components/src/components/index.ts +++ b/packages/orchestrator-ui-components/src/components/index.ts @@ -28,3 +28,4 @@ export * from './WfoNoResults'; export * from './WfoStartButton'; export * from './WfoSubscriptionsList'; export * from './WfoSummary'; +export * from './WfoRouteChangeListener'; diff --git a/packages/orchestrator-ui-components/src/rtk/api.ts b/packages/orchestrator-ui-components/src/rtk/api.ts index e24bc91ab..57aae71c9 100644 --- a/packages/orchestrator-ui-components/src/rtk/api.ts +++ b/packages/orchestrator-ui-components/src/rtk/api.ts @@ -1,4 +1,4 @@ -import { getSession } from 'next-auth/react'; +import { getSession, signOut } from 'next-auth/react'; import { createApi, fetchBaseQuery } from '@reduxjs/toolkit/query/react'; import { graphqlRequestBaseQuery } from '@rtk-query/graphql-request-base-query'; @@ -85,6 +85,21 @@ export const orchestratorApi = createApi({ const graphqlFn = graphqlRequestBaseQuery({ url: customApi ? customApi.apiBaseUrl : graphqlEndpointCore, prepareHeaders, + customErrors: (error) => { + const { name, message, stack, response } = error; + if (response?.errors && response.errors?.length > 0) { + response.errors.map((error) => { + // TODO: https://github.com/workfloworchestrator/orchestrator-ui-library/issues/1105 + if ( + error.extensions?.error_type === + 'not_authorized' + ) { + signOut(); + } + }); + } + return { name, message, stack }; + }, }); return graphqlFn(args, api, {}); }