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:
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]);
-
}