This commit is contained in:
Sara
2023-11-22 13:20:11 +01:00
parent f38dad3ad4
commit f14e6f5a7f
16 changed files with 38 additions and 40 deletions

View File

@@ -1,11 +1,18 @@
"use client"; "use client";
import { FiefAuthProvider } from "@fief/fief/nextjs/react"; import { FiefAuthProvider } from "@fief/fief/nextjs/react";
import { createContext } from "react";
export default function FiefWrapper({ children }) { export const CookieContext = createContext<{ hasAuthCookie: boolean }>({
hasAuthCookie: false,
});
export default function FiefWrapper({ children, hasAuthCookie }) {
return ( return (
<CookieContext.Provider value={{ hasAuthCookie }}>
<FiefAuthProvider currentUserPath="/api/current-user"> <FiefAuthProvider currentUserPath="/api/current-user">
{children} {children}
</FiefAuthProvider> </FiefAuthProvider>
</CookieContext.Provider>
); );
} }

View File

@@ -12,6 +12,8 @@ import Privacy from "../(aboutAndPrivacy)/privacy";
import { DomainContextProvider } from "./domainContext"; import { DomainContextProvider } from "./domainContext";
import { getConfig } from "../lib/edgeConfig"; import { getConfig } from "../lib/edgeConfig";
import { ErrorBoundary } from "@sentry/nextjs"; import { ErrorBoundary } from "@sentry/nextjs";
import { cookies } from "next/dist/client/components/headers";
import { SESSION_COOKIE_NAME } from "../lib/fief";
const poppins = Poppins({ subsets: ["latin"], weight: ["200", "400", "600"] }); const poppins = Poppins({ subsets: ["latin"], weight: ["200", "400", "600"] });
@@ -71,11 +73,12 @@ type LayoutProps = {
export default async function RootLayout({ children, params }: LayoutProps) { export default async function RootLayout({ children, params }: LayoutProps) {
const config = await getConfig(params.domain); const config = await getConfig(params.domain);
const { requireLogin, privacy, browse } = config.features; const { requireLogin, privacy, browse } = config.features;
const hasAuthCookie = !!cookies().get(SESSION_COOKIE_NAME);
return ( return (
<html lang="en"> <html lang="en">
<body className={poppins.className + " h-screen relative"}> <body className={poppins.className + " h-screen relative"}>
<FiefWrapper> <FiefWrapper hasAuthCookie={hasAuthCookie}>
<DomainContextProvider config={config}> <DomainContextProvider config={config}>
<ErrorBoundary fallback={<p>"something went really wrong"</p>}> <ErrorBoundary fallback={<p>"something went really wrong"</p>}>
<ErrorProvider> <ErrorProvider>

View File

@@ -22,15 +22,13 @@ type TranscriptDetails = {
}; };
}; };
const protectedPath = false;
export default function TranscriptDetails(details: TranscriptDetails) { export default function TranscriptDetails(details: TranscriptDetails) {
const transcriptId = details.params.transcriptId; const transcriptId = details.params.transcriptId;
const router = useRouter(); const router = useRouter();
const transcript = useTranscript(protectedPath, transcriptId); const transcript = useTranscript(transcriptId);
const topics = useTopics(protectedPath, transcriptId); const topics = useTopics(transcriptId);
const waveform = useWaveform(protectedPath, transcriptId); const waveform = useWaveform(transcriptId);
const useActiveTopic = useState<Topic | null>(null); const useActiveTopic = useState<Topic | null>(null);
const mp3 = useMp3(transcriptId); const mp3 = useMp3(transcriptId);
@@ -71,7 +69,6 @@ export default function TranscriptDetails(details: TranscriptDetails) {
<div className="flex flex-col"> <div className="flex flex-col">
{transcript?.response?.title && ( {transcript?.response?.title && (
<TranscriptTitle <TranscriptTitle
protectedPath={protectedPath}
title={transcript.response.title} title={transcript.response.title}
transcriptId={transcript.response.id} transcriptId={transcript.response.id}
/> />
@@ -101,7 +98,6 @@ export default function TranscriptDetails(details: TranscriptDetails) {
<section className=" bg-blue-400/20 rounded-lg md:rounded-xl p-2 md:px-4 h-full"> <section className=" bg-blue-400/20 rounded-lg md:rounded-xl p-2 md:px-4 h-full">
{transcript.response.longSummary ? ( {transcript.response.longSummary ? (
<FinalSummary <FinalSummary
protectedPath={protectedPath}
fullTranscript={fullTranscript} fullTranscript={fullTranscript}
summary={transcript.response.longSummary} summary={transcript.response.longSummary}
transcriptId={transcript.response.id} transcriptId={transcript.response.id}
@@ -130,7 +126,6 @@ export default function TranscriptDetails(details: TranscriptDetails) {
</div> </div>
<div className="flex-grow max-w-full"> <div className="flex-grow max-w-full">
<ShareLink <ShareLink
protectedPath={protectedPath}
transcriptId={transcript?.response?.id} transcriptId={transcript?.response?.id}
userId={transcript?.response?.userId} userId={transcript?.response?.userId}
shareMode={transcript?.response?.shareMode} shareMode={transcript?.response?.shareMode}

View File

@@ -15,7 +15,7 @@ import { faGear } from "@fortawesome/free-solid-svg-icons";
import { lockWakeState, releaseWakeState } from "../../../../lib/wakeLock"; import { lockWakeState, releaseWakeState } from "../../../../lib/wakeLock";
import { useRouter } from "next/navigation"; import { useRouter } from "next/navigation";
import Player from "../../player"; import Player from "../../player";
import useMp3, { Mp3Response } from "../../useMp3"; import useMp3 from "../../useMp3";
import WaveformLoading from "../../waveformLoading"; import WaveformLoading from "../../waveformLoading";
type TranscriptDetails = { type TranscriptDetails = {
@@ -39,8 +39,8 @@ const TranscriptRecord = (details: TranscriptDetails) => {
} }
}, []); }, []);
const transcript = useTranscript(true, details.params.transcriptId); const transcript = useTranscript(details.params.transcriptId);
const webRTC = useWebRTC(stream, details.params.transcriptId, true); const webRTC = useWebRTC(stream, details.params.transcriptId);
const webSockets = useWebSockets(details.params.transcriptId); const webSockets = useWebSockets(details.params.transcriptId);
const { audioDevices, getAudioStream } = useAudioDevice(); const { audioDevices, getAudioStream } = useAudioDevice();

View File

@@ -19,7 +19,7 @@ const useCreateTranscript = (): CreateTranscript => {
const [loading, setLoading] = useState<boolean>(false); const [loading, setLoading] = useState<boolean>(false);
const [error, setErrorState] = useState<Error | null>(null); const [error, setErrorState] = useState<Error | null>(null);
const { setError } = useError(); const { setError } = useError();
const api = getApi(true); const api = getApi();
const create = (params: V1TranscriptsCreateRequest["createTranscript"]) => { const create = (params: V1TranscriptsCreateRequest["createTranscript"]) => {
if (loading || !api) return; if (loading || !api) return;

View File

@@ -5,7 +5,6 @@ import "../../styles/markdown.css";
import getApi from "../../lib/getApi"; import getApi from "../../lib/getApi";
type FinalSummaryProps = { type FinalSummaryProps = {
protectedPath: boolean;
summary: string; summary: string;
fullTranscript: string; fullTranscript: string;
transcriptId: string; transcriptId: string;
@@ -18,7 +17,7 @@ export default function FinalSummary(props: FinalSummaryProps) {
const [isEditMode, setIsEditMode] = useState(false); const [isEditMode, setIsEditMode] = useState(false);
const [preEditSummary, setPreEditSummary] = useState(props.summary); const [preEditSummary, setPreEditSummary] = useState(props.summary);
const [editedSummary, setEditedSummary] = useState(props.summary); const [editedSummary, setEditedSummary] = useState(props.summary);
const api = getApi(props.protectedPath); const api = getApi();
const updateSummary = async (newSummary: string, transcriptId: string) => { const updateSummary = async (newSummary: string, transcriptId: string) => {
if (!api) return; if (!api) return;

View File

@@ -8,7 +8,6 @@ import "../../styles/button.css";
import "../../styles/form.scss"; import "../../styles/form.scss";
type ShareLinkProps = { type ShareLinkProps = {
protectedPath: boolean;
transcriptId: string; transcriptId: string;
userId: string | null; userId: string | null;
shareMode: string; shareMode: string;
@@ -21,8 +20,8 @@ const ShareLink = (props: ShareLinkProps) => {
const requireLogin = featureEnabled("requireLogin"); const requireLogin = featureEnabled("requireLogin");
const [isOwner, setIsOwner] = useState(false); const [isOwner, setIsOwner] = useState(false);
const [shareMode, setShareMode] = useState(props.shareMode); const [shareMode, setShareMode] = useState(props.shareMode);
const api = getApi(props.protectedPath);
const userinfo = useFiefUserinfo(); const userinfo = useFiefUserinfo();
const api = getApi();
useEffect(() => { useEffect(() => {
setCurrentUrl(window.location.href); setCurrentUrl(window.location.href);

View File

@@ -2,7 +2,6 @@ import { useState } from "react";
import getApi from "../../lib/getApi"; import getApi from "../../lib/getApi";
type TranscriptTitle = { type TranscriptTitle = {
protectedPath: boolean;
title: string; title: string;
transcriptId: string; transcriptId: string;
}; };
@@ -11,7 +10,7 @@ const TranscriptTitle = (props: TranscriptTitle) => {
const [displayedTitle, setDisplayedTitle] = useState(props.title); const [displayedTitle, setDisplayedTitle] = useState(props.title);
const [preEditTitle, setPreEditTitle] = useState(props.title); const [preEditTitle, setPreEditTitle] = useState(props.title);
const [isEditing, setIsEditing] = useState(false); const [isEditing, setIsEditing] = useState(false);
const api = getApi(props.protectedPath); const api = getApi();
const updateTitle = async (newTitle: string, transcriptId: string) => { const updateTitle = async (newTitle: string, transcriptId: string) => {
if (!api) return; if (!api) return;

View File

@@ -13,7 +13,7 @@ const useMp3 = (id: string, waiting?: boolean): Mp3Response => {
const [media, setMedia] = useState<HTMLMediaElement | null>(null); const [media, setMedia] = useState<HTMLMediaElement | null>(null);
const [later, setLater] = useState(waiting); const [later, setLater] = useState(waiting);
const [loading, setLoading] = useState<boolean>(false); const [loading, setLoading] = useState<boolean>(false);
const api = getApi(true); const api = getApi();
const { api_url } = useContext(DomainContext); const { api_url } = useContext(DomainContext);
const accessTokenInfo = useFiefAccessTokenInfo(); const accessTokenInfo = useFiefAccessTokenInfo();
const [serviceWorker, setServiceWorker] = const [serviceWorker, setServiceWorker] =

View File

@@ -14,12 +14,12 @@ type TranscriptTopics = {
error: Error | null; error: Error | null;
}; };
const useTopics = (protectedPath, id: string): TranscriptTopics => { const useTopics = (id: string): TranscriptTopics => {
const [topics, setTopics] = useState<Topic[] | null>(null); const [topics, setTopics] = useState<Topic[] | null>(null);
const [loading, setLoading] = useState<boolean>(false); const [loading, setLoading] = useState<boolean>(false);
const [error, setErrorState] = useState<Error | null>(null); const [error, setErrorState] = useState<Error | null>(null);
const { setError } = useError(); const { setError } = useError();
const api = getApi(protectedPath); const api = getApi();
useEffect(() => { useEffect(() => {
if (!id || !api) return; if (!id || !api) return;

View File

@@ -24,14 +24,13 @@ type SuccessTranscript = {
}; };
const useTranscript = ( const useTranscript = (
protectedPath: boolean,
id: string | null, id: string | null,
): ErrorTranscript | LoadingTranscript | SuccessTranscript => { ): ErrorTranscript | LoadingTranscript | SuccessTranscript => {
const [response, setResponse] = useState<GetTranscript | null>(null); const [response, setResponse] = useState<GetTranscript | null>(null);
const [loading, setLoading] = useState<boolean>(true); const [loading, setLoading] = useState<boolean>(true);
const [error, setErrorState] = useState<Error | null>(null); const [error, setErrorState] = useState<Error | null>(null);
const { setError } = useError(); const { setError } = useError();
const api = getApi(protectedPath); const api = getApi();
useEffect(() => { useEffect(() => {
if (!id || !api) return; if (!id || !api) return;

View File

@@ -15,7 +15,7 @@ const useTranscriptList = (page: number): TranscriptList => {
const [loading, setLoading] = useState<boolean>(true); const [loading, setLoading] = useState<boolean>(true);
const [error, setErrorState] = useState<Error | null>(null); const [error, setErrorState] = useState<Error | null>(null);
const { setError } = useError(); const { setError } = useError();
const api = getApi(true); const api = getApi();
useEffect(() => { useEffect(() => {
if (!api) return; if (!api) return;

View File

@@ -11,12 +11,12 @@ type AudioWaveFormResponse = {
error: Error | null; error: Error | null;
}; };
const useWaveform = (protectedPath, id: string): AudioWaveFormResponse => { const useWaveform = (id: string): AudioWaveFormResponse => {
const [waveform, setWaveform] = useState<AudioWaveform | null>(null); const [waveform, setWaveform] = useState<AudioWaveform | null>(null);
const [loading, setLoading] = useState<boolean>(true); const [loading, setLoading] = useState<boolean>(true);
const [error, setErrorState] = useState<Error | null>(null); const [error, setErrorState] = useState<Error | null>(null);
const { setError } = useError(); const { setError } = useError();
const api = getApi(protectedPath); const api = getApi();
useEffect(() => { useEffect(() => {
if (!id || !api) return; if (!id || !api) return;

View File

@@ -10,11 +10,10 @@ import getApi from "../../lib/getApi";
const useWebRTC = ( const useWebRTC = (
stream: MediaStream | null, stream: MediaStream | null,
transcriptId: string | null, transcriptId: string | null,
protectedPath,
): Peer => { ): Peer => {
const [peer, setPeer] = useState<Peer | null>(null); const [peer, setPeer] = useState<Peer | null>(null);
const { setError } = useError(); const { setError } = useError();
const api = getApi(protectedPath); const api = getApi();
useEffect(() => { useEffect(() => {
if (!stream || !transcriptId) { if (!stream || !transcriptId) {

View File

@@ -66,10 +66,6 @@ export const getFiefAuthMiddleware = async (url) => {
matcher: "/transcripts", matcher: "/transcripts",
parameters: {}, parameters: {},
}, },
{
matcher: "/transcripts/((?!new))",
parameters: {},
},
{ {
matcher: "/browse", matcher: "/browse",
parameters: {}, parameters: {},

View File

@@ -4,17 +4,19 @@ import { DefaultApi } from "../api/apis/DefaultApi";
import { useFiefAccessTokenInfo } from "@fief/fief/nextjs/react"; import { useFiefAccessTokenInfo } from "@fief/fief/nextjs/react";
import { useContext, useEffect, useState } from "react"; import { useContext, useEffect, useState } from "react";
import { DomainContext, featureEnabled } from "../[domain]/domainContext"; import { DomainContext, featureEnabled } from "../[domain]/domainContext";
import { CookieContext } from "../(auth)/fiefWrapper";
export default function getApi(protectedPath: boolean): DefaultApi | undefined { export default function getApi(): DefaultApi | undefined {
const accessTokenInfo = useFiefAccessTokenInfo(); const accessTokenInfo = useFiefAccessTokenInfo();
const api_url = useContext(DomainContext).api_url; const api_url = useContext(DomainContext).api_url;
const requireLogin = featureEnabled("requireLogin"); const requireLogin = featureEnabled("requireLogin");
const [api, setApi] = useState<DefaultApi>(); const [api, setApi] = useState<DefaultApi>();
const { hasAuthCookie } = useContext(CookieContext);
if (!api_url) throw new Error("no API URL"); if (!api_url) throw new Error("no API URL");
useEffect(() => { useEffect(() => {
if (protectedPath && requireLogin && !accessTokenInfo) { if (hasAuthCookie && requireLogin && !accessTokenInfo) {
return; return;
} }
@@ -25,7 +27,7 @@ export default function getApi(protectedPath: boolean): DefaultApi | undefined {
: undefined, : undefined,
}); });
setApi(new DefaultApi(apiConfiguration)); setApi(new DefaultApi(apiConfiguration));
}, [!accessTokenInfo, protectedPath]); }, [!accessTokenInfo, hasAuthCookie]);
return api; return api;
} }