mirror of
https://github.com/Monadical-SAS/reflector.git
synced 2025-12-20 12:19:06 +00:00
* sso: first pass for integrating SSO still have issue on refreshing maybe customize the login page, or completely avoid it make 100% to understand how session server/client are working need to test with different configuration option (features flags and requireLogin) * sso: correctly handle refresh token, with pro-active refresh Going on interceptors make extra calls to reflector when 401. We need then to circle back with NextJS backend to update the jwt, session, then retry the failed request. I prefered to go pro-active, and ensure the session AND jwt are always up to date. A minute before the expiration, we'll try to refresh it. useEffect() of NextJS cannot be asynchronous, so we cannot wait for the token to be refreshed. Every 20s, a minute before the expiration (so 3x in total max) we'll try to renew. When the accessToken is renewed, the session is updated, and dispatching up to the client, which updates the useApi(). Therefore, no component will left without a incorrect token. * fixes: issue with missing key on react-select-search because the default value is undefined * sso: fixes login/logout button, and avoid seeing the login with authentik page when clicking * sso: ensure /transcripts/new is not behind protected page, and feature flags page are honored * sso: fixes user sub->id * fixes: remove old layout not used * fixes: set default NEXT_PUBLIC_SITE_URL as localhost * fixes: removing fief again due to merge with main * sso: ensure session is always ready before doing any action * sso: add migration from fief to jwt in server, only from transcripts list * fixes: user tests * fixes: compilation issues
90 lines
3.1 KiB
TypeScript
90 lines
3.1 KiB
TypeScript
import "./styles/globals.scss";
|
||
import { Poppins } from "next/font/google";
|
||
import { Metadata, Viewport } from "next";
|
||
import SessionProvider from "./lib/SessionProvider";
|
||
import { ErrorProvider } from "./(errors)/errorContext";
|
||
import ErrorMessage from "./(errors)/errorMessage";
|
||
import { DomainContextProvider } from "./domainContext";
|
||
import { getConfig } from "./lib/edgeConfig";
|
||
import { ErrorBoundary } from "@sentry/nextjs";
|
||
import { Providers } from "./providers";
|
||
|
||
const poppins = Poppins({ subsets: ["latin"], weight: ["200", "400", "600"] });
|
||
|
||
export const viewport: Viewport = {
|
||
themeColor: "black",
|
||
width: "device-width",
|
||
initialScale: 1,
|
||
maximumScale: 1,
|
||
};
|
||
|
||
export const metadata: Metadata = {
|
||
metadataBase: new URL(process.env.DEV_URL || "https://reflector.media"),
|
||
title: {
|
||
template: "%s – Reflector",
|
||
default: "Reflector - AI-Powered Meeting Transcriptions by Monadical",
|
||
},
|
||
description:
|
||
"Reflector is an AI-powered tool that transcribes your meetings with unparalleled accuracy, divides content by topics, and provides insightful summaries. Maximize your productivity with Reflector, brought to you by Monadical. Capture the signal, not the noise",
|
||
applicationName: "Reflector",
|
||
referrer: "origin-when-cross-origin",
|
||
keywords: ["Reflector", "Monadical", "AI", "Meetings", "Transcription"],
|
||
authors: [{ name: "Monadical Team", url: "https://monadical.com/team.html" }],
|
||
formatDetection: {
|
||
email: false,
|
||
address: false,
|
||
telephone: false,
|
||
},
|
||
|
||
openGraph: {
|
||
title: "Reflector",
|
||
description:
|
||
"Reflector is an AI-powered tool that transcribes your meetings with unparalleled accuracy, divides content by topics, and provides insightful summaries. Maximize your productivity with Reflector, brought to you by Monadical. Capture the signal, not the noise.",
|
||
type: "website",
|
||
},
|
||
|
||
twitter: {
|
||
card: "summary_large_image",
|
||
title: "Reflector",
|
||
description:
|
||
"Reflector is an AI-powered tool that transcribes your meetings with unparalleled accuracy, divides content by topics, and provides insightful summaries. Maximize your productivity with Reflector, brought to you by Monadical. Capture the signal, not the noise.",
|
||
images: ["/r-icon.png"],
|
||
},
|
||
|
||
icons: {
|
||
icon: "/r-icon.png",
|
||
shortcut: "/r-icon.png",
|
||
apple: "/r-icon.png",
|
||
},
|
||
robots: { index: false, follow: false, noarchive: true, noimageindex: true },
|
||
};
|
||
|
||
export default async function RootLayout({
|
||
children,
|
||
}: {
|
||
children: React.ReactNode;
|
||
}) {
|
||
const config = await getConfig();
|
||
|
||
return (
|
||
<html lang="en">
|
||
<body
|
||
className={
|
||
poppins.className + "h-[100svh] w-[100svw] overflow-hidden relative"
|
||
}
|
||
>
|
||
<SessionProvider>
|
||
<DomainContextProvider config={config}>
|
||
<ErrorBoundary fallback={<p>"something went really wrong"</p>}>
|
||
<ErrorProvider>
|
||
<ErrorMessage />
|
||
<Providers>{children}</Providers>
|
||
</ErrorProvider>
|
||
</ErrorBoundary>
|
||
</DomainContextProvider>
|
||
</SessionProvider>
|
||
</body>
|
||
</html>
|
||
);
|
||
}
|