diff --git a/.idea/runConfigurations/Run_client.xml b/.idea/runConfigurations/Run_client.xml index fcea7d1..d062d06 100644 --- a/.idea/runConfigurations/Run_client.xml +++ b/.idea/runConfigurations/Run_client.xml @@ -8,8 +8,9 @@ - - + + + diff --git a/todoblue/src/app/CreatePublicBoardPanel.tsx b/todoblue/src/app/CreatePublicBoardPanel.tsx index 7029ed5..07aa60e 100644 --- a/todoblue/src/app/CreatePublicBoardPanel.tsx +++ b/todoblue/src/app/CreatePublicBoardPanel.tsx @@ -1,4 +1,4 @@ -"use client" +"use client"; import {useBoardCreator} from "@/app/useBoardCreator" import {useLowerKebabState} from "@/app/useKebabState" diff --git a/todoblue/src/app/RootFooter.tsx b/todoblue/src/app/RootFooter.tsx new file mode 100644 index 0000000..b18bb69 --- /dev/null +++ b/todoblue/src/app/RootFooter.tsx @@ -0,0 +1,21 @@ +"use client"; + +import style from "@/app/page.module.css" +import {useServersideConfiguration} from "@/app/ServersideConfigurationManager" +import {default as React} from "react" + + +export function RootFooter() { + const {baseURL} = useServersideConfiguration() + + return ( + + ) +} diff --git a/todoblue/src/app/RootHeader.tsx b/todoblue/src/app/RootHeader.tsx new file mode 100644 index 0000000..4628cae --- /dev/null +++ b/todoblue/src/app/RootHeader.tsx @@ -0,0 +1,18 @@ +"use client"; + +import style from "@/app/page.module.css" +import {useServersideConfiguration} from "@/app/ServersideConfigurationManager" +import {default as React} from "react" + + +export function RootHeader() { + const {siteName} = useServersideConfiguration() + + return ( +
+

+ {siteName} +

+
+ ) +} diff --git a/todoblue/src/app/RootMain.tsx b/todoblue/src/app/RootMain.tsx new file mode 100644 index 0000000..2b16623 --- /dev/null +++ b/todoblue/src/app/RootMain.tsx @@ -0,0 +1,19 @@ +import {CreatePrivateBoardPanel} from "@/app/CreatePrivateBoardPanel" +import {CreatePublicBoardPanel} from "@/app/CreatePublicBoardPanel" +import style from "@/app/page.module.css" +import {default as React} from "react" + + +export function RootMain() { + return ( +
+
+

+ Crea un nuovo tabellone +

+ + +
+
+ ) +} diff --git a/todoblue/src/app/ServersideConfigurationManager.tsx b/todoblue/src/app/ServersideConfigurationManager.tsx new file mode 100644 index 0000000..732cd72 --- /dev/null +++ b/todoblue/src/app/ServersideConfigurationManager.tsx @@ -0,0 +1,47 @@ +"use client"; +import {createContext, ReactNode, useContext} from "react" + + +/** + * **Object** containing the site options configurable via runtime environment variables. + */ +export interface ServersideConfiguration { + siteName: string, + baseURL: string, +} + +/** + * **Context** where the {@link ServersideConfiguration} is stored in. + */ +export const ServersideConfigurationContext = createContext(null); + +/** + * **Component** acting as a provider for the {@link ServersideConfigurationContext} for its children. + * + * Required to execute only on the client. + * + * @param value The {@link ServersideConfiguration} to provide. + * @param children The {@link ReactNode}s to provide the {@link ServersideConfiguration} to. + * @constructor + */ +export function ServersideConfigurationManager({value, children}: {value: ServersideConfiguration, children: ReactNode}) { + return ( + + {children} + + ) +} + +/** + * **Hook** to access the globally provided {@link ServersideConfiguration} from children components. + */ +export function useServersideConfiguration(): ServersideConfiguration { + const context = useContext(ServersideConfigurationContext); + + if(context === null) { + console.error("[useServersideConfiguration] Was used outside of a ServersideConfigurationContext!") + throw Error("Used useServersideConfiguration outside of a ServersideConfigurationContext.") + } + + return context +} diff --git a/todoblue/src/app/SiteName.tsx b/todoblue/src/app/SiteName.tsx deleted file mode 100644 index df2421c..0000000 --- a/todoblue/src/app/SiteName.tsx +++ /dev/null @@ -1,7 +0,0 @@ -import "server-only" - -export function SiteName() { - return <> - {process.env["NEXT_PUBLIC_SITE_NAME"] ?? "Todoblue"} - -} diff --git a/todoblue/src/app/board/[board]/TaskDisplay.tsx b/todoblue/src/app/board/[board]/TaskDisplay.tsx index 7b17071..5cdd582 100644 --- a/todoblue/src/app/board/[board]/TaskDisplay.tsx +++ b/todoblue/src/app/board/[board]/TaskDisplay.tsx @@ -1,3 +1,5 @@ +"use client"; + import {TaskIconEl} from "@/app/board/[board]/TaskIconEl" import {TaskWithId} from "@/app/board/[board]/Types" import {useManagedBoard} from "@/app/board/[board]/BoardManager" diff --git a/todoblue/src/app/board/[board]/page.tsx b/todoblue/src/app/board/[board]/page.tsx index 07f2b89..1a84432 100644 --- a/todoblue/src/app/board/[board]/page.tsx +++ b/todoblue/src/app/board/[board]/page.tsx @@ -6,7 +6,6 @@ import {BoardHeader} from "@/app/board/[board]/BoardHeader" import {BoardTaskEditor} from "@/app/board/[board]/BoardTaskEditor" import style from "./page.module.css" - export default function Page({params: {board}}: {params: {board: string}}) { return ( diff --git a/todoblue/src/app/board/[board]/useBoardWebSocketURL.ts b/todoblue/src/app/board/[board]/useBoardWebSocketURL.ts index fd3bb94..0914d8c 100644 --- a/todoblue/src/app/board/[board]/useBoardWebSocketURL.ts +++ b/todoblue/src/app/board/[board]/useBoardWebSocketURL.ts @@ -1,7 +1,10 @@ +import {useServersideConfiguration} from "@/app/ServersideConfigurationManager" import {useMemo} from "react" export function useBoardWebSocketURL(name: string) { - const webSocketURL = useMemo(() => `${process.env.NEXT_PUBLIC_API_BASE_URL}/board/${name}/ws`, [name]); + const {baseURL} = useServersideConfiguration() + + const webSocketURL = useMemo(() => `${baseURL}/board/${name}/ws`, [name]); return {webSocketURL} } diff --git a/todoblue/src/app/layout.tsx b/todoblue/src/app/layout.tsx index b55c79a..301e9fc 100644 --- a/todoblue/src/app/layout.tsx +++ b/todoblue/src/app/layout.tsx @@ -2,25 +2,32 @@ import "./layout.css"; import {AppBody} from "@/app/AppBody" - -import { config } from '@fortawesome/fontawesome-svg-core'; -config.autoAddCss = false; /* eslint-disable import/first */ - +import {ServersideConfigurationManager} from "@/app/ServersideConfigurationManager" +import {useServersideConfigurationEnvvars} from "@/app/useServersideConfigurationEnvvars" import type {Metadata as NextMetadata} from "next" import {default as React, ReactNode} from "react" +import { config } from '@fortawesome/fontawesome-svg-core'; +config.autoAddCss = false; + export const metadata: NextMetadata = { - title: "Todoblue", - description: "Self-hostable todo app", + applicationName: process.env["TODOBLUE_SITE_NAME"] ?? "Todoblue", + title: "Home", + description: process.env["TODOBLUE_SITE_DESCRIPTION"] ?? "Self-hosted multiplayer todo app", + viewport: {userScalable: false} } -export default function RootLayout({children}: { children: ReactNode }) { +export default function layout({children}: { children: ReactNode }) { + const serversideConfiguration = useServersideConfigurationEnvvars() + return ( - - {children} - + + + {children} + + ) } diff --git a/todoblue/src/app/page.tsx b/todoblue/src/app/page.tsx index 1db888c..1f55eec 100644 --- a/todoblue/src/app/page.tsx +++ b/todoblue/src/app/page.tsx @@ -1,50 +1,17 @@ -import {CreatePrivateBoardPanel} from "@/app/CreatePrivateBoardPanel" -import {CreatePublicBoardPanel} from "@/app/CreatePublicBoardPanel" -import {SiteName} from "@/app/SiteName" +import {RootFooter} from "@/app/RootFooter" +import {RootHeader} from "@/app/RootHeader" +import {RootMain} from "@/app/RootMain" import {default as React} from "react"; import style from "./page.module.css" -export default function Page() { - return
- - - -
-} - -function PageHeader() { +export default function page() { return ( -
-

- -

-
+
+ + + +
) } -function PageMain() { - return ( -
-
-

- Crea un nuovo tabellone -

- - -
-
- ) -} - -function PageFooter() { - return ( - - ) -} diff --git a/todoblue/src/app/useServersideConfigurationEnvvars.ts b/todoblue/src/app/useServersideConfigurationEnvvars.ts new file mode 100644 index 0000000..510df38 --- /dev/null +++ b/todoblue/src/app/useServersideConfigurationEnvvars.ts @@ -0,0 +1,17 @@ +import "server-only"; +import {ServersideConfiguration} from "@/app/ServersideConfigurationManager" + + +export function useServersideConfigurationEnvvars(): ServersideConfiguration { + const siteName = process.env["TODOBLUE_SITE_NAME"] + const baseURL = process.env["TODORED_BASE_URL"] + + if(!siteName) { + throw Error("TODOBLUE_SITE_NAME is not set.") + } + if(!baseURL) { + throw Error("TODORED_BASE_URL is not set.") + } + + return {siteName, baseURL} +}