Untitled

 avatar
unknown
typescript
a year ago
2.1 kB
6
Indexable
import type {Metadata} from 'next'
import Navbar from '@/components/Navbar'
import Providers from "@/app/utils/Providers";
import './globals.scss'
import React from "react";
import {Roboto} from "next/font/google";
import {cookies} from "next/headers";
import {setToken} from "@/lib/utils/setTokens";


const robotoFont = Roboto({subsets: ['latin'], weight: ["300", "400", "500", "700"], variable: '--font-roboto'})


const getMe = async () => {
  "use server"
  const cookiesStore = cookies();
  const access = cookiesStore.get("access")?.value;
  const refresh = cookiesStore.get("refresh")?.value;

  let accessToken = access;

  if (!access && refresh) {
    const refreshResult = await fetch(process.env.BACKEND_URL + "/auth/token/refresh/", {
      method: "POST",
      headers: {
        'Content-Type': 'application/json',
      },
      body: JSON.stringify({ refresh: refresh }),
    });

    if (refreshResult.ok) {
      // TODO: simplify this
      const refreshData: {access: string} = await refreshResult.json();
      accessToken = refreshData.access;
      setToken({token: accessToken, token_type: "access"});
      // Update access token in cookies, if needed
    } else {
      // Handle refresh token failure
      return null;
    }
  }

  if (accessToken) {
    const result = await fetch(process.env.URL + "/api/auth/me", {
      method: "GET",
      headers: {
        "Authorization": `Bearer ${accessToken}`,
      },
    });

    if (result.ok) {
      const data = await result.json();
      console.log(data);
      return data;
    }
  }

  return null;
}

export const metadata: Metadata = {
  title: 'Create Next App',
  description: 'Generated by create next app',
}

export default async function RootLayout({
                                           children,
                                         }: {
  children: React.ReactNode
}) {
  const user = await getMe()

  return (
    <html lang="en" className={`${robotoFont.variable} font-sans`}>
    <body>
    <Providers>
      <header>
        <Navbar user={user}/>
      </header>
      {children}
    </Providers>
    </body>
    </html>
  );
}
Editor is loading...
Leave a Comment