-
Hi, I am experiencing a glitch in the contermber's app regarding sessions and redirection. Here's a detail of the issue as mentioned by client
I am using v2 engine of contember. Exactly: import { memo, useCallback, useMemo, useState } from 'react'
import { SessionTokenContext, SessionTokenContextValue, SetSessionTokenContext } from './auth'
import { ApiBaseUrlContext, LoginTokenContext } from './config'
import { ProjectSlugContext, StageSlugContext } from './project'
export interface ContemberClientProps {
apiBaseUrl: string
sessionToken?: string
loginToken?: string
project?: string
stage?: string
}
const sessionTokenKey = 'contember_session_token'
/**
* @group Entrypoints
*/
export const ContemberClient = memo<ContemberClientProps & { children: React.ReactNode }>(function ContemberClient({
apiBaseUrl,
children,
loginToken,
project,
sessionToken,
stage,
}) {
const [localStorageSessionToken, setLocalStorageSessionToken] = useLocalStorageSessionToken()
const sessionTokenContextValue = useMemo((): SessionTokenContextValue => ({
propsToken: sessionToken,
token: localStorageSessionToken ?? sessionToken,
source: localStorageSessionToken ? 'localstorage' : (sessionToken ? 'props' : undefined),
}), [localStorageSessionToken, sessionToken])
return (
<ApiBaseUrlContext.Provider value={apiBaseUrl}>
<LoginTokenContext.Provider value={loginToken}>
<SetSessionTokenContext.Provider value={setLocalStorageSessionToken}>
<SessionTokenContext.Provider value={sessionTokenContextValue}>
<ProjectSlugContext.Provider value={project}>
<StageSlugContext.Provider value={stage}>{children}</StageSlugContext.Provider>
</ProjectSlugContext.Provider>
</SessionTokenContext.Provider>
</SetSessionTokenContext.Provider>
</LoginTokenContext.Provider>
</ApiBaseUrlContext.Provider>
)
})
const useLocalStorageSessionToken = (): [value: string | undefined, set: (token: string | undefined) => void] => {
const [sessionTokenInner, setSessionTokenInner] = useState(() => localStorage.getItem(sessionTokenKey) ?? undefined)
const setSessionToken = useCallback((token: string | undefined) => {
if (token !== undefined) {
localStorage.setItem(sessionTokenKey, token)
} else {
localStorage.removeItem(sessionTokenKey)
}
setSessionTokenInner(token)
}, [])
return [sessionTokenInner, setSessionToken]
} Thank you! |
Beta Was this translation helpful? Give feedback.
Replies: 2 comments 2 replies
-
Hi, it looks like you might be using an older version of |
Beta Was this translation helpful? Give feedback.
-
Hi, I looked into the import { IdentityState} from "@contember/react-identity";
import { Loader } from "../ui/loader";
import { dict } from "../dict";
export const IdentityLoader = ({ children }: { children: React.ReactNode }) => {
return (
<>
<IdentityState state={["loading", "none", "cleared"]}>
<Loader />
</IdentityState>
<IdentityState state={"failed"}>
<p className="text-center text-lg text-gray-600">
{dict.identityLoader.fail}
</p>
</IdentityState>
<IdentityState state={"success"}>{children}</IdentityState>
</>
);
}; Here, as we can see on I looked into other newer projects and replicated the import { IdentityState, LogoutTrigger } from "@contember/react-identity";
import { Loader } from "../ui/loader";
import { dict } from "../dict";
import { useEffect } from "react";
import { Card, CardContent } from "../ui/card";
import { CircleAlert } from "lucide-react";
import { Button } from "../ui/button";
export const IdentityLoader = ({ children }: { children: React.ReactNode }) => {
return (
<>
<IdentityState state={["loading"]}>
<Loader />
</IdentityState>
<IdentityState state={["none", "cleared"]}>
<Redirect />
</IdentityState>
<IdentityState state={"failed"}>
<div className="flex justify-center items-center h-screen bg-gray-100">
<Card className="w-72">
<CardContent className="flex flex-col items-center gap-2">
<CircleAlert className="h-12 w-12 text-destructive" />
<p className="text-center text-lg text-gray-600">
{dict.identityLoader.fail}
</p>
<div className="flex gap-2">
<Button
onClick={() => window.location.reload()}
variant="secondary"
>
Try reload
</Button>
<LogoutTrigger>
<Button>Login again</Button>
</LogoutTrigger>
</div>
</CardContent>
</Card>
</div>
</IdentityState>
<IdentityState state={"success"}>{children}</IdentityState>
</>
);
};
const Redirect = () => {
useEffect(() => {
const backlink = window.location.pathname + window.location.search;
window.location.href = `/identity/redirect?backlink=${encodeURIComponent(
backlink
)}`;
});
return null;
}; Now it works as expected. Initially the project used |
Beta Was this translation helpful? Give feedback.
Hi,
I looked into the
identity.tsx
and found that the previous codebase didn't have a crucial detail.