taler-typescript-core

Wallet core logic and WebUIs for various components
Log | Files | Refs | Submodules | README | LICENSE

commit 6adddedd819be7514de3448066c95b8eff2314f3
parent 521454a1bd15511c54a2481dfc36402f13b8a7fa
Author: Sebastian <sebasjm@gmail.com>
Date:   Tue,  1 Jul 2025 15:38:47 -0300

mark expired if the loaded session is expired

Diffstat:
Mpackages/bank-ui/src/hooks/session.ts | 45++++++++++++++++++++++++++++++++++++++-------
1 file changed, 38 insertions(+), 7 deletions(-)

diff --git a/packages/bank-ui/src/hooks/session.ts b/packages/bank-ui/src/hooks/session.ts @@ -27,7 +27,11 @@ import { codecForString, codecOptionalDefault, } from "@gnu-taler/taler-util"; -import { buildStorageKey, useBankCoreApiContext, useLocalStorage } from "@gnu-taler/web-util/browser"; +import { + buildStorageKey, + useBankCoreApiContext, + useLocalStorage, +} from "@gnu-taler/web-util/browser"; import { mutate } from "swr"; import { SESSION_DURATION } from "../pages/LoginForm.js"; import { createRFC8959AccessTokenEncoded } from "@gnu-taler/taler-util"; @@ -60,7 +64,10 @@ export const codecForSessionStateLoggedIn = (): Codec<LoggedIn> => buildCodecForObject<LoggedIn>() .property("status", codecForConstString("loggedIn")) .property("username", codecForString()) - .property("expiration", codecOptionalDefault(codecForAbsoluteTime, AbsoluteTime.now())) + .property( + "expiration", + codecOptionalDefault(codecForAbsoluteTime, AbsoluteTime.now()), + ) .property("token", codecForString() as Codec<AccessToken>) .property("isUserAdministrator", codecForBoolean()) .build("SessionState.LoggedIn"); @@ -69,7 +76,10 @@ export const codecForSessionStateExpired = (): Codec<Expired> => buildCodecForObject<Expired>() .property("status", codecForConstString("expired")) .property("username", codecForString()) - .property("expiration", codecOptionalDefault(codecForAbsoluteTime, AbsoluteTime.now())) + .property( + "expiration", + codecOptionalDefault(codecForAbsoluteTime, AbsoluteTime.now()), + ) .property("isUserAdministrator", codecForBoolean()) .build("SessionState.Expired"); @@ -94,7 +104,11 @@ export interface SessionStateHandler { state: SessionState; logOut(): void; expired(): void; - logIn(info: { username: string; token: AccessToken, expiration: AbsoluteTime }): void; + logIn(info: { + username: string; + token: AccessToken; + expiration: AbsoluteTime; + }): void; } const SESSION_STATE_KEY = buildStorageKey( @@ -113,6 +127,21 @@ export function useSessionState(): SessionStateHandler { defaultState, ); + useEffect(() => { + if ( + state.status === "loggedIn" && + AbsoluteTime.isExpired(state.expiration) + ) { + const nextState: SessionState = { + status: "expired", + username: state.username, + expiration: state.expiration, + isUserAdministrator: state.username === "admin", + }; + update(nextState); + } + }); + return { state, logOut() { @@ -153,7 +182,7 @@ function cleanAllCache(): void { */ export function useRefreshSessionBeforeExpires() { const session = useSessionState(); - + const { lib: { bank }, } = useBankCoreApiContext(); @@ -170,7 +199,9 @@ export function useRefreshSessionBeforeExpires() { * we need to wait before refreshing the session. Waiting too much and the token will * be expired. So 20% before expiration should be close enough. */ - const timeLeftBeforeExpiration = Duration.getRemaining(refreshSession.expiration); + const timeLeftBeforeExpiration = Duration.getRemaining( + refreshSession.expiration, + ); const refreshWindow = Duration.multiply( Duration.fromTalerProtocolDuration(SESSION_DURATION), 0.2, @@ -184,6 +215,7 @@ export function useRefreshSessionBeforeExpires() { timeLeftBeforeExpiration.d_ms - refreshWindow.d_ms, 0, ); + console.log("CACACA", remain); const timeoutId = setTimeout(async () => { const result = await bank.createAccessToken( refreshSession.username, @@ -210,5 +242,4 @@ export function useRefreshSessionBeforeExpires() { clearTimeout(timeoutId); }; }, [refreshSession]); - }