fix: unattended component reload due to session changes (#407)

* fix: unattended component reload due to session changes

When the session is updated, status goes back to loading then
authenticated or unauthenticated. session.accessTokenExpires may also be
updated.

This triggered various component refresh at unattented times, and brake
the user experience.

By splitting to only what's needed with memoization, it will prevent
unattented refresh.

* review

* review: change syntax
This commit is contained in:
2024-09-05 10:46:47 -06:00
committed by GitHub
parent c5f7fcc06b
commit db714f6390
9 changed files with 124 additions and 37 deletions

View File

@@ -1,6 +1,5 @@
"use client";
import React, { useEffect, useState } from "react";
import { useSession } from "next-auth/react";
import { GetTranscript } from "../../api";
import Pagination from "./pagination";
@@ -13,6 +12,7 @@ import { formatTimeMs } from "../../lib/time";
import useApi from "../../lib/useApi";
import { useError } from "../../(errors)/errorContext";
import { FaEllipsisVertical } from "react-icons/fa6";
import useSessionUser from "../../lib/useSessionUser";
import {
Flex,
Spinner,
@@ -45,7 +45,7 @@ import { ExpandableText } from "../../lib/expandableText";
export default function TranscriptBrowser() {
const [page, setPage] = useState<number>(1);
const { loading, response, refetch } = useTranscriptList(page);
const { data: session } = useSession();
const userName = useSessionUser().name;
const [deletionLoading, setDeletionLoading] = useState(false);
const api = useApi();
const { setError } = useError();
@@ -136,8 +136,8 @@ export default function TranscriptBrowser() {
flexWrap={"wrap-reverse"}
mt={4}
>
{session?.user?.name ? (
<Heading size="md">{session?.user?.name}'s Meetings</Heading>
{userName ? (
<Heading size="md">{userName}'s Meetings</Heading>
) : (
<Heading size="md">Your meetings</Heading>
)}

View File

@@ -10,7 +10,7 @@ import { useRouter } from "next/navigation";
import useCreateTranscript from "../createTranscript";
import SelectSearch from "react-select-search";
import { supportedLanguages } from "../../../supportedLanguages";
import { useSession } from "next-auth/react";
import useSessionStatus from "../../../lib/useSessionStatus";
import { featureEnabled } from "../../../domainContext";
import { signIn } from "next-auth/react";
import {
@@ -44,9 +44,7 @@ import {
} from "@chakra-ui/react";
const TranscriptCreate = () => {
const router = useRouter();
const { status } = useSession();
const sessionReady = status !== "loading";
const isAuthenticated = status === "authenticated";
const { isLoading, isAuthenticated } = useSessionStatus();
const requireLogin = featureEnabled("requireLogin");
const [name, setName] = useState<string>("");
@@ -141,7 +139,7 @@ const TranscriptCreate = () => {
</Flex>
<Flex flexDir="column" h="full" flexBasis="1" flexGrow={1}>
<Center>
{!sessionReady ? (
{isLoading ? (
<Spinner />
) : requireLogin && !isAuthenticated ? (
<Button onClick={() => signIn("authentik")} colorScheme="blue">

View File

@@ -16,7 +16,7 @@ import {
} from "@chakra-ui/react";
import { FaShare } from "react-icons/fa";
import useApi from "../../lib/useApi";
import { useSession } from "next-auth/react";
import useSessionUser from "../../lib/useSessionUser";
import { CustomSession } from "../../lib/types";
import { Select } from "chakra-react-select";
import ShareLink from "./shareLink";
@@ -70,9 +70,7 @@ export default function ShareAndPrivacy(props: ShareAndPrivacyProps) {
setShareLoading(false);
};
const { data: session } = useSession();
const customSession = session as CustomSession;
const userId = customSession?.user?.id;
const userId = useSessionUser().id;
useEffect(() => {
setIsOwner(!!(requireLogin && userId === props.transcriptResponse.user_id));