layout.tsx 2.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. import type { Metadata } from "next";
  2. import { Geist, Geist_Mono } from "next/font/google";
  3. import Script from "next/script";
  4. import React from "react";
  5. import "./globals.scss";
  6. import { SignalRProvider } from '@/contexts/signalrProvider';
  7. import { AuthProvider } from "@/contexts/authProvider";
  8. import { MemberProvider } from "@/contexts/memberProvider";
  9. import { ConfigProvider } from "@/contexts/configProvider";
  10. import { getAccessToken, getSignalRCryptoUrl, getSignalRChatUrl } from "@/lib/utils/server";
  11. import { fetchConfig } from "@/lib/api/system";
  12. const geistSans = Geist({
  13. variable: "--font-geist-sans",
  14. subsets: ["latin"],
  15. });
  16. const geistMono = Geist_Mono({
  17. variable: "--font-geist-mono",
  18. subsets: ["latin"],
  19. });
  20. export async function generateMetadata(): Promise<Metadata> {
  21. const config = (await fetchConfig())?.data;
  22. return {
  23. title: config?.basic?.siteName ?? 'bitforum',
  24. description: config?.meta?.description ?? '',
  25. keywords: config?.meta?.keywords ?? '',
  26. authors: config?.meta?.author ? [{ name: config.meta.author }] : undefined,
  27. applicationName: config?.meta.applicationName,
  28. generator: config?.meta.generator,
  29. robots: config?.meta.robots
  30. };
  31. }
  32. export default async function RootLayout({
  33. children,
  34. }: Readonly<{
  35. children: React.ReactNode;
  36. }>) {
  37. const accessToken = await getAccessToken();
  38. const signalRCryptoUrl = await getSignalRCryptoUrl();
  39. const signalRChatUrl = await getSignalRChatUrl();
  40. const config = (await fetchConfig())?.data;
  41. return (
  42. <html lang="ko">
  43. <head>
  44. <Script src="https://www.googletagmanager.com/gtag/js?id=G-DY6YFW4CTM" strategy="afterInteractive" />
  45. <Script id="gtag-init" strategy="afterInteractive">
  46. {`
  47. window.dataLayer = window.dataLayer || [];
  48. function gtag(){dataLayer.push(arguments);}
  49. gtag('js', new Date());
  50. gtag('config', 'G-DY6YFW4CTM');
  51. `}
  52. </Script>
  53. </head>
  54. <body className={`${geistSans.variable} ${geistMono.variable} antialiased`}>
  55. <SignalRProvider accessToken={accessToken} signalRCryptoUrl={signalRCryptoUrl} signalRChatUrl={signalRChatUrl}>
  56. <AuthProvider>
  57. <MemberProvider>
  58. <ConfigProvider initialConfig={config}>
  59. {children}
  60. </ConfigProvider>
  61. </MemberProvider>
  62. </AuthProvider>
  63. </SignalRProvider>
  64. </body>
  65. </html>
  66. );
  67. }