mirror of
https://github.com/Monadical-SAS/reflector.git
synced 2025-12-21 04:39:06 +00:00
fix auth
This commit is contained in:
@@ -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>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
@@ -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}
|
||||||
|
|||||||
@@ -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();
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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] =
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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) {
|
||||||
|
|||||||
@@ -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: {},
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user