Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
28 commits
Select commit Hold shift + click to select a range
6a672b2
chore: save unstaged changes to feature/controller-mode
Jayian1890 Mar 12, 2026
f9b5671
feat: add PlayStation controller button components and integrate dyna…
Jayian1890 Mar 12, 2026
59d5229
feat: add portal for exit stream confirmation dialog to improve UI re…
Jayian1890 Mar 12, 2026
433cfca
feat: enhance IPv6 handling in normalizeIceServers function for impro…
Jayian1890 Mar 12, 2026
5847afe
feat: update onResumeGame handler to close controller overlay when re…
Jayian1890 Mar 13, 2026
1ccf481
feat: enhance game closing process by adding overlay close animation …
Jayian1890 Mar 13, 2026
05c4680
feat: add controller mode cursor hiding and XMB logo positioning styles
Jayian1890 Mar 13, 2026
d6bbef2
feat: add auto fullscreen setting and bandwidth limiter for controlle…
Jayian1890 Mar 13, 2026
31a8bd3
feat: improve category navigation and update max bitrate adjustment l…
Jayian1890 Mar 13, 2026
94cb4f6
feat: implement media management features including listing and thumb…
Jayian1890 Mar 13, 2026
8bdbb1d
feat: add remaining playtime display and related styles in Controller…
Jayian1890 Mar 13, 2026
e6fc9c0
feat: enhance controller back action handling in library mode
Jayian1890 Mar 13, 2026
e6d30b0
feat: add session elapsed time display in ControllerLibraryPage
Jayian1890 Mar 14, 2026
f7a5c70
feat: update max bitrate settings and adjust related UI components in…
Jayian1890 Mar 16, 2026
31fd22c
feat: improve controller back action handling to prevent default beha…
Jayian1890 Mar 16, 2026
b1ecbf7
feat: add autoFullScreen setting to application and controller librar…
Jayian1890 Mar 16, 2026
304ac7c
feat: add aspect ratio setting to video options and remove bandwidth …
Jayian1890 Mar 17, 2026
3ada8c0
feat: implement ControllerStreamLoading component and associated styl…
Jayian1890 Mar 17, 2026
0508712
feat(regression fix): add secondary activation handler for controller…
Jayian1890 Mar 17, 2026
c2d6469
feat: update stream status checks for controller mode handling in App…
Jayian1890 Mar 17, 2026
ee7f279
feat: add controller background animations setting for enhanced loadi…
Jayian1890 Mar 17, 2026
af7ee51
feat: enhance loading visuals by updating background animations and s…
Jayian1890 Mar 17, 2026
46b74ad
feat: update game loading background
Jayian1890 Mar 17, 2026
ebe56be
feat: update initial category index logic based on favorite games pre…
Jayian1890 Mar 17, 2026
f90f1b8
feat: add ref for streamStatus to ensure async callbacks observe late…
Jayian1890 Mar 17, 2026
0ed132d
feat: enhance media file path validation and thumbnail generation logic
Jayian1890 Mar 17, 2026
9f1d6d2
feat: enhance cache management by adding thumbnail directory cleanup …
Jayian1890 Mar 17, 2026
05420cd
feat: pause input during window blur and visibility change to improve…
Jayian1890 Mar 18, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
36 changes: 26 additions & 10 deletions opennow-stable/src/main/gfn/auth.ts
Original file line number Diff line number Diff line change
Expand Up @@ -369,6 +369,12 @@ function mergeTokenSnapshot(base: AuthTokens, refreshed: TokenResponse): AuthTok
};
}

function gravatarUrl(email: string, size = 80): string {
const normalized = email.trim().toLowerCase();
const hash = createHash("md5").update(normalized).digest("hex");
return `https://www.gravatar.com/avatar/${hash}?s=${size}&d=identicon`;
}

async function fetchUserInfo(tokens: AuthTokens): Promise<AuthUser> {
const jwtToken = tokens.idToken ?? tokens.accessToken;
const parsed = parseJwtPayload<{
Expand All @@ -380,13 +386,18 @@ async function fetchUserInfo(tokens: AuthTokens): Promise<AuthUser> {
}>(jwtToken);

if (parsed?.sub) {
return {
userId: parsed.sub,
displayName: parsed.preferred_username ?? parsed.email?.split("@")[0] ?? "User",
email: parsed.email,
avatarUrl: parsed.picture,
membershipTier: parsed.gfn_tier ?? "FREE",
};
const emailFromToken = parsed.email;
const pictureFromToken = parsed.picture;
if (emailFromToken || pictureFromToken) {
const avatar = pictureFromToken ?? (emailFromToken ? gravatarUrl(emailFromToken) : undefined);
return {
userId: parsed.sub,
displayName: parsed.preferred_username ?? emailFromToken?.split("@")[0] ?? "User",
email: emailFromToken,
avatarUrl: avatar,
membershipTier: parsed.gfn_tier ?? "FREE",
};
}
}

const response = await fetch(USERINFO_ENDPOINT, {
Expand All @@ -409,11 +420,14 @@ async function fetchUserInfo(tokens: AuthTokens): Promise<AuthUser> {
picture?: string;
};

const email = payload.email;
const avatar = payload.picture ?? (email ? gravatarUrl(email) : undefined);

return {
userId: payload.sub,
displayName: payload.preferred_username ?? payload.email?.split("@")[0] ?? "User",
email: payload.email,
avatarUrl: payload.picture,
displayName: payload.preferred_username ?? email?.split("@")[0] ?? "User",
email,
avatarUrl: avatar,
membershipTier: "FREE",
};
}
Expand Down Expand Up @@ -623,6 +637,7 @@ export class AuthService {

const initialTokens = await exchangeAuthorizationCode(code, verifier, port);
const user = await fetchUserInfo(initialTokens);
console.debug("auth: fetched user info during login", { userId: user.userId, email: user.email, avatarUrl: user.avatarUrl });
let tokens = initialTokens;
try {
tokens = await this.ensureClientToken(initialTokens, user.userId);
Expand Down Expand Up @@ -851,6 +866,7 @@ export class AuthService {
let user = this.session?.user;
try {
user = await fetchUserInfo(refreshedTokens);
console.debug("auth: fetched user info on token refresh", { userId: user.userId, email: user.email, avatarUrl: user.avatarUrl });
} catch (error) {
console.warn("Token refresh succeeded but user info refresh failed. Keeping cached user:", error);
}
Expand Down
Loading
Loading