compile fix

This commit is contained in:
Igor Loskutov
2025-09-02 19:12:04 -04:00
parent 1d5a22ad1d
commit 5e4f519c83
7 changed files with 38 additions and 27 deletions

View File

@@ -19,7 +19,6 @@ import {
parseAsStringLiteral, parseAsStringLiteral,
} from "nuqs"; } from "nuqs";
import { LuX } from "react-icons/lu"; import { LuX } from "react-icons/lu";
import useSessionUser from "../../lib/useUserId";
import type { components } from "../../reflector-api"; import type { components } from "../../reflector-api";
type Room = components["schemas"]["Room"]; type Room = components["schemas"]["Room"];

View File

@@ -22,7 +22,7 @@ import { useTranscriptUpdate } from "../../lib/apiHooks";
import ShareLink from "./shareLink"; import ShareLink from "./shareLink";
import ShareCopy from "./shareCopy"; import ShareCopy from "./shareCopy";
import ShareZulip from "./shareZulip"; import ShareZulip from "./shareZulip";
import useUserId from "../../lib/useUserId"; import { useAuth } from "../../lib/AuthProvider";
type ShareAndPrivacyProps = { type ShareAndPrivacyProps = {
finalSummaryRef: any; finalSummaryRef: any;
@@ -85,7 +85,8 @@ export default function ShareAndPrivacy(props: ShareAndPrivacyProps) {
} }
}; };
const userId = useUserId(); const auth = useAuth();
const userId = auth.status === "authenticated" ? auth.user?.id : null;
useEffect(() => { useEffect(() => {
setIsOwner(!!(requireLogin && userId === props.transcriptResponse.user_id)); setIsOwner(!!(requireLogin && userId === props.transcriptResponse.user_id));

View File

@@ -260,7 +260,9 @@ export default function Room(details: RoomDetails) {
const roomName = details.params.roomName; const roomName = details.params.roomName;
const meeting = useRoomMeeting(roomName); const meeting = useRoomMeeting(roomName);
const router = useRouter(); const router = useRouter();
const { isLoading, isAuthenticated } = useSessionStatus(); const status = useSessionStatus();
const isAuthenticated = status === "authenticated";
const isLoading = status === "loading" || meeting.loading;
const roomUrl = meeting?.response?.host_room_url const roomUrl = meeting?.response?.host_room_url
? meeting?.response?.host_room_url ? meeting?.response?.host_room_url

View File

@@ -3,7 +3,11 @@
import { createContext, useContext, useEffect } from "react"; import { createContext, useContext, useEffect } from "react";
import { useSession as useNextAuthSession } from "next-auth/react"; import { useSession as useNextAuthSession } from "next-auth/react";
import { configureApiAuth } from "./apiClient"; import { configureApiAuth } from "./apiClient";
import { assertExtendedToken, CustomSession } from "./types"; import {
assertExtendedToken,
assertExtendedTokenAndUserId,
CustomSession,
} from "./types";
type AuthContextType = type AuthContextType =
| { status: "loading" } | { status: "loading" }
@@ -19,7 +23,7 @@ const AuthContext = createContext<AuthContextType | undefined>(undefined);
export function AuthProvider({ children }: { children: React.ReactNode }) { export function AuthProvider({ children }: { children: React.ReactNode }) {
const { data: session, status } = useNextAuthSession(); const { data: session, status } = useNextAuthSession();
const customSession = session ? assertExtendedToken(session) : null; const customSession = session ? assertExtendedTokenAndUserId(session) : null;
const contextValue: AuthContextType = const contextValue: AuthContextType =
status === "loading" status === "loading"

View File

@@ -83,7 +83,6 @@ export const authOptions: AuthOptions = {
return await lockedRefreshAccessToken(token); return await lockedRefreshAccessToken(token);
}, },
async session({ session, token }) { async session({ session, token }) {
// TODO no as
const extendedToken = token as JWTWithAccessToken; const extendedToken = token as JWTWithAccessToken;
return { return {
...session, ...session,
@@ -91,7 +90,7 @@ export const authOptions: AuthOptions = {
accessTokenExpires: extendedToken.accessTokenExpires, accessTokenExpires: extendedToken.accessTokenExpires,
error: extendedToken.error, error: extendedToken.error,
user: { user: {
id: extendedToken.sub, id: assertExists(extendedToken.sub),
name: extendedToken.name, name: extendedToken.name,
email: extendedToken.email, email: extendedToken.email,
}, },

View File

@@ -13,6 +13,9 @@ export interface CustomSession extends Session {
accessToken: string; accessToken: string;
accessTokenExpires: number; accessTokenExpires: number;
error?: string; error?: string;
user: Session["user"] & {
id: string;
};
} }
// assumption that JWT is JWTWithAccessToken - not ideal, TODO find a reason we have to do that // assumption that JWT is JWTWithAccessToken - not ideal, TODO find a reason we have to do that
@@ -39,3 +42,25 @@ export const assertExtendedToken = <T>(
} }
throw new Error("Token is not extended with access token"); throw new Error("Token is not extended with access token");
}; };
export const assertExtendedTokenAndUserId = <U, T extends { user?: U }>(
t: T,
): T & {
accessTokenExpires: number;
accessToken: string;
user: U & {
id: string;
};
} => {
const extendedToken = assertExtendedToken(t);
if (typeof (extendedToken.user as any)?.id === "string") {
return t as T & {
accessTokenExpires: number;
accessToken: string;
user: U & {
id: string;
};
};
}
throw new Error("Token is not extended with user id");
};

View File

@@ -1,19 +0,0 @@
"use client";
import { useState, useEffect } from "react";
import { useSession as useNextAuthSession } from "next-auth/react";
import { Session } from "next-auth";
import { useAuth } from "./AuthProvider";
const assertUserId = <T>(u: T): T & { id: string } => {
if (typeof (u as { id: string }).id !== "string")
throw new Error("Expected user.id to be a string");
return u as T & { id: string };
};
// the current assumption in useSessionUser is that "useNextAuthSession" also returns user.id, although useNextAuthSession documentation states it doesn't
// the hook is to isolate the potential impact and to document this behaviour
export default function useUserId() {
const auth = useAuth();
return auth.status === "authenticated" ? assertUserId(auth.user) : null;
}