Spaces:
Running
Running
File size: 3,635 Bytes
c10f8f8 de2f961 c10f8f8 8bce833 c10f8f8 de2f961 c10f8f8 de2f961 c10f8f8 de2f961 8bce833 c10f8f8 8bce833 c10f8f8 8bce833 c10f8f8 de2f961 c10f8f8 ddb7f1c c10f8f8 ddb7f1c c10f8f8 ddb7f1c c10f8f8 de2f961 c10f8f8 8bce833 de2f961 8bce833 c10f8f8 de2f961 c10f8f8 de2f961 c10f8f8 de2f961 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 |
/* eslint-disable @typescript-eslint/no-explicit-any */
import type { Metadata, Viewport } from "next";
import { Inter, PT_Sans } from "next/font/google";
import { cookies } from "next/headers";
import Script from "next/script";
import "@/assets/globals.css";
import { Toaster } from "@/components/ui/sonner";
import MY_TOKEN_KEY from "@/lib/get-cookie-name";
import { apiServer } from "@/lib/api";
import IframeDetector from "@/components/iframe-detector";
import AppContext from "@/components/contexts/app-context";
import TanstackContext from "@/components/contexts/tanstack-query-context";
import { LoginProvider } from "@/components/contexts/login-context";
import { ProProvider } from "@/components/contexts/pro-context";
import { generateSEO, generateStructuredData } from "@/lib/seo";
const inter = Inter({
variable: "--font-inter-sans",
subsets: ["latin"],
});
const ptSans = PT_Sans({
variable: "--font-ptSans-mono",
subsets: ["latin"],
weight: ["400", "700"],
});
export const metadata: Metadata = {
...generateSEO({
title: "DeepSite | Build with AI ✨",
description:
"DeepSite is a web development tool that helps you build websites with AI, no code required. Let's deploy your website with DeepSite and enjoy the magic of AI.",
path: "/",
}),
appleWebApp: {
capable: true,
title: "DeepSite",
statusBarStyle: "black-translucent",
},
icons: {
icon: "/logo.svg",
shortcut: "/logo.svg",
apple: "/logo.svg",
},
verification: {
google: process.env.GOOGLE_SITE_VERIFICATION,
},
};
export const viewport: Viewport = {
initialScale: 1,
maximumScale: 1,
themeColor: "#000000",
};
async function getMe() {
const cookieStore = await cookies();
const token = cookieStore.get(MY_TOKEN_KEY())?.value;
if (!token) return { user: null, projects: [], errCode: null };
try {
const res = await apiServer.get("/me", {
headers: {
Authorization: `Bearer ${token}`,
},
});
return { user: res.data.user, projects: res.data.projects, errCode: null };
} catch (err: any) {
return { user: null, projects: [], errCode: err.status };
}
}
export default async function RootLayout({
children,
}: Readonly<{
children: React.ReactNode;
}>) {
const data = await getMe();
// Generate structured data
const structuredData = generateStructuredData("WebApplication", {
name: "DeepSite",
description: "Build websites with AI, no code required",
url: "https://deepsite.hf.co",
});
const organizationData = generateStructuredData("Organization", {
name: "DeepSite",
url: "https://deepsite.hf.co",
});
return (
<html lang="en">
<head>
<script
type="application/ld+json"
dangerouslySetInnerHTML={{
__html: JSON.stringify(structuredData),
}}
/>
</Script>
<body
className={`${inter.variable} ${ptSans.variable} antialiased bg-black dark h-[100dvh] overflow-hidden`}
>
<IframeDetector />
<Toaster richColors position="bottom-center" />
<TanstackContext>
<AppContext me={data}>
<LoginProvider>
<ProProvider>{children}</ProProvider>
</LoginProvider>
</AppContext>
</TanstackContext>
</body>
</html>
);
}
|