@ -3,15 +3,15 @@ import useSWR from "swr";
import Head from "next/head" ;
import dynamic from "next/dynamic" ;
import { useTranslation } from "react-i18next" ;
import { useEffect } from "react" ;
import { useEffect , useContext } from "react" ;
import ServicesGroup from "components/services/group" ;
import BookmarksGroup from "components/bookmarks/group" ;
import Widget from "components/widget" ;
import Revalidate from "components/revalidate" ;
import { getSettings } from "utils/config" ;
import { Color Provider } from "utils/color-context" ;
import { Theme Provider } from "utils/theme-context" ;
import { Color Context } from "utils/color-context" ;
import { Theme Context } from "utils/theme-context" ;
const ThemeToggle = dynamic ( ( ) => import ( "components/theme-toggle" ) , {
ssr : false ,
@ -35,6 +35,8 @@ export async function getStaticProps() {
export default function Home ( { settings } ) {
const { i18n } = useTranslation ( ) ;
const { theme , setTheme } = useContext ( ThemeContext ) ;
const { color , setColor } = useContext ( ColorContext ) ;
const { data : services } = useSWR ( "/api/services" ) ;
const { data : bookmarks } = useSWR ( "/api/bookmarks" ) ;
@ -50,61 +52,67 @@ export default function Home({ settings }) {
if ( settings . language ) {
i18n . changeLanguage ( settings . language ) ;
}
} , [ i18n , settings . language ] ) ;
if ( settings . theme && theme !== settings . theme ) {
setTheme ( settings . theme ) ;
}
if ( settings . color && color !== settings . color ) {
setColor ( settings . color ) ;
}
} , [ i18n , settings , color , setColor , theme , setTheme ] ) ;
return (
< ColorProvider >
< ThemeProvider >
< Head >
< title > { settings . title || "Homepage" } < / title >
{ settings . base && < base href = { settings . base } / > }
{ settings . favicon && < link rel = "icon" href = { settings . favicon } / > }
< / Head >
< div className = "fixed w-full h-full m-0 p-0" style = { wrappedStyle } / >
< div className = "relative w-full container m-auto flex flex-col h-screen justify-between" >
< div className = "flex flex-row flex-wrap m-8 pb-4 mt-10 border-b-2 border-theme-800 dark:border-theme-200 justify-between" >
{ widgets && (
< >
< >
< Head >
< title > { settings . title || "Homepage" } < / title >
{ settings . base && < base href = { settings . base } / > }
{ settings . favicon && < link rel = "icon" href = { settings . favicon } / > }
< / Head >
< div className = "fixed w-full h-full m-0 p-0" style = { wrappedStyle } / >
< div className = "relative w-full container m-auto flex flex-col h-screen justify-between" >
< div className = "flex flex-row flex-wrap m-8 pb-4 mt-10 border-b-2 border-theme-800 dark:border-theme-200 justify-between" >
{ widgets && (
< >
{ widgets
. filter ( ( widget ) => ! rightAlignedWidgets . includes ( widget . type ) )
. map ( ( widget , i ) => (
< Widget key = { i } widget = { widget } / >
) ) }
< div className = "ml-4 flex flex-wrap basis-full grow sm:basis-auto justify-between md:justify-end mt-2 md:mt-0" >
{ widgets
. filter ( ( widget ) => ! rightAlignedWidgets . includes ( widget . type ) )
. filter ( ( widget ) => rightAlignedWidgets . includes ( widget . type ) )
. map ( ( widget , i ) => (
< Widget key = { i } widget = { widget } / >
) ) }
< div className = "ml-4 flex flex-wrap basis-full grow sm:basis-auto justify-between md:justify-end mt-2 md:mt-0" >
{ widgets
. filter ( ( widget ) => rightAlignedWidgets . includes ( widget . type ) )
. map ( ( widget , i ) => (
< Widget key = { i } widget = { widget } / >
) ) }
< / div >
< / >
) }
< / div >
{ services && (
< div className = "flex flex-wrap p-8 items-start" >
{ services . map ( ( group ) => (
< ServicesGroup key = { group . name } services = { group } / >
) ) }
< / div >
< / div >
< / >
) }
< / div >
{ bookmark s && (
< div className = " grow flex flex-wrap pt-0 p-8 ">
{ bookmark s. map ( ( group ) => (
< Bookmark sGroup key = { group . name } group= { group} / >
) ) }
< / div >
) }
{ services && (
< div className = "flex flex-wrap p-8 items-start" >
{ services . map ( ( group ) => (
< ServicesGroup key = { group . name } services = { group } layout = { settings . layout ? . [ group . name ] } / >
) ) }
< / div >
) }
< div className = "rounded-full flex p-8 w-full justify-between" >
< ColorToggle / >
< Revalidate / >
< ThemeToggle / >
{ bookmarks && (
< div className = "grow flex flex-wrap pt-0 p-8" >
{ bookmarks . map ( ( group ) => (
< BookmarksGroup key = { group . name } group = { group } / >
) ) }
< / div >
) }
< div className = "rounded-full flex p-8 w-full justify-end" >
{ ! settings ? . color && < ColorToggle / > }
< Revalidate / >
{ ! settings ? . theme && < ThemeToggle / > }
< / div >
< / ThemeProvider >
< / ColorProvider >
< / div >
< / >
) ;
}