diff --git a/components/CollectionCard.tsx b/components/CollectionCard.tsx index 02f3f34..d9aebfd 100644 --- a/components/CollectionCard.tsx +++ b/components/CollectionCard.tsx @@ -8,6 +8,7 @@ import ProfilePhoto from "./ProfilePhoto"; import { faCalendarDays } from "@fortawesome/free-regular-svg-icons"; import useModalStore from "@/store/modals"; import usePermissions from "@/hooks/usePermissions"; +import useLocalSettingsStore from "@/store/localSettings"; type Props = { collection: CollectionIncludingMembersAndLinkCount; @@ -23,6 +24,7 @@ type DropdownTrigger = export default function CollectionCard({ collection, className }: Props) { const { setModal } = useModalStore(); + const { settings } = useLocalSettingsStore(); const formattedDate = new Date(collection.createdAt as string).toLocaleString( "en-US", @@ -42,8 +44,8 @@ export default function CollectionCard({ collection, className }: Props) {
{ + if (settings.theme === "dark") { + updateSettings({ theme: "light" }); + } else { + updateSettings({ theme: "dark" }); + } + }; + useEffect(() => { setSidebar(false); }, [width]); @@ -95,9 +106,12 @@ export default function Navbar() { href: "/settings/account", }, { - name: `Switch to ${"light" ? "Dark" : "Light"}`, + name: `Switch to ${ + settings.theme === "light" ? "Dark" : "Light" + }`, onClick: () => { setProfileDropdown(!profileDropdown); + handleToggle(); }, }, { diff --git a/components/ToggleDarkMode.tsx b/components/ToggleDarkMode.tsx index b610ac0..f6078eb 100644 --- a/components/ToggleDarkMode.tsx +++ b/components/ToggleDarkMode.tsx @@ -1,3 +1,4 @@ +import useLocalSettingsStore from "@/store/localSettings"; import { useEffect, useState } from "react"; type Props = { @@ -5,9 +6,9 @@ type Props = { }; export default function ToggleDarkMode({ className }: Props) { - const [theme, setTheme] = useState( - localStorage.getItem("theme") ? localStorage.getItem("theme") : "light" - ); + const { updateSettings } = useLocalSettingsStore(); + + const [theme, setTheme] = useState(localStorage.getItem("theme")); const handleToggle = (e: any) => { if (e.target.checked) { @@ -18,11 +19,7 @@ export default function ToggleDarkMode({ className }: Props) { }; useEffect(() => { - localStorage.setItem("theme", theme || ""); - const localTheme = localStorage.getItem("theme"); - document - .querySelector("html") - ?.setAttribute("data-theme", localTheme || ""); + updateSettings({ theme: theme as string }); }, [theme]); return ( @@ -31,7 +28,7 @@ export default function ToggleDarkMode({ className }: Props) { type="checkbox" onChange={handleToggle} className="theme-controller" - checked={theme === "light" ? false : true} + checked={localStorage.getItem("theme") === "light" ? false : true} /> {/* sun icon */} diff --git a/layouts/CenteredForm.tsx b/layouts/CenteredForm.tsx index f3dfa35..2f875fe 100644 --- a/layouts/CenteredForm.tsx +++ b/layouts/CenteredForm.tsx @@ -1,3 +1,4 @@ +import useLocalSettingsStore from "@/store/localSettings"; import Image from "next/image"; import Link from "next/link"; import React, { ReactNode } from "react"; @@ -8,19 +9,22 @@ interface Props { } export default function CenteredForm({ text, children }: Props) { + const { settings } = useLocalSettingsStore(); return (
{true ? ( Linkwarden ) : undefined} - {/* {theme === "dark" ? ( + {/* {settings.theme === "dark" ? ( ) { - const [theme, setTheme] = useState(""); + const { setSettings } = useLocalSettingsStore(); useEffect(() => { - setTheme( - localStorage.getItem("theme") - ? (localStorage.getItem("theme") as string) - : "light" - ); - - if (theme) localStorage.setItem("theme", theme as string); - const localTheme = localStorage.getItem("theme"); - document - .querySelector("html") - ?.setAttribute("data-theme", localTheme || ""); + setSettings(); }, []); return ( diff --git a/pages/collections/[id].tsx b/pages/collections/[id].tsx index 7f23631..d2caa42 100644 --- a/pages/collections/[id].tsx +++ b/pages/collections/[id].tsx @@ -18,10 +18,13 @@ import useModalStore from "@/store/modals"; import useLinks from "@/hooks/useLinks"; import usePermissions from "@/hooks/usePermissions"; import NoLinksFound from "@/components/NoLinksFound"; +import useLocalSettingsStore from "@/store/localSettings"; export default function Index() { const { setModal } = useModalStore(); + const { settings } = useLocalSettingsStore(); + const router = useRouter(); const { links } = useLinkStore(); @@ -51,9 +54,9 @@ export default function Index() { style={{ backgroundImage: `linear-gradient(-45deg, ${ activeCollection?.color - }30 10%, ${"dark" ? "#262626" : "#f3f4f6"} 50%, ${ - "dark" ? "#262626" : "#f9fafb" - } 100%)`, + }30 10%, ${ + settings.theme === "dark" ? "#262626" : "#f3f4f6" + } 50%, ${settings.theme === "dark" ? "#262626" : "#f9fafb"} 100%)`, }} className="border border-solid border-sky-100 dark:border-neutral-700 rounded-2xl shadow min-h-[10rem] p-5 flex gap-5 flex-col justify-between" > diff --git a/pages/dashboard.tsx b/pages/dashboard.tsx index 5bf2786..4469c5a 100644 --- a/pages/dashboard.tsx +++ b/pages/dashboard.tsx @@ -106,8 +106,6 @@ export default function Dashboard() { return ( - -
{ modal ? (document.body.style.overflow = "hidden") @@ -103,8 +106,8 @@ export default function PublicCollections() { className="h-screen" style={{ backgroundImage: `linear-gradient(${collection?.color}30 10%, ${ - "dark" ? "#262626" : "#f3f4f6" - } 50%, ${"dark" ? "#171717" : "#ffffff"} 100%)`, + settings.theme === "dark" ? "#262626" : "#f3f4f6" + } 50%, ${settings.theme === "dark" ? "#171717" : "#ffffff"} 100%)`, }} > diff --git a/pages/public/links/[id].tsx b/pages/public/links/[id].tsx index c42e171..0b61b5f 100644 --- a/pages/public/links/[id].tsx +++ b/pages/public/links/[id].tsx @@ -16,6 +16,7 @@ import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; import { faBoxesStacked, faFolder } from "@fortawesome/free-solid-svg-icons"; import useModalStore from "@/store/modals"; import { useSession } from "next-auth/react"; +import useLocalSettingsStore from "@/store/localSettings"; type LinkContent = { title: string; @@ -33,6 +34,8 @@ export default function Index() { const { links, getLink } = useLinkStore(); const { setModal } = useModalStore(); + const { settings } = useLocalSettingsStore(); + const session = useSession(); const userId = session.data?.user.id; @@ -144,7 +147,7 @@ export default function Index() {
{ setSubmitLoader(true); @@ -75,8 +77,11 @@ export default function Appearance() {
updateSettings({ theme: "dark" })} >

Dark Theme

@@ -85,8 +90,11 @@ export default function Appearance() {
updateSettings({ theme: "light" })} >

Light Theme

diff --git a/store/localSettings.ts b/store/localSettings.ts index 8eebcef..8a3eb08 100644 --- a/store/localSettings.ts +++ b/store/localSettings.ts @@ -1,23 +1,45 @@ import { create } from "zustand"; type LocalSettings = { - darkMode: boolean; + theme: string; }; type LocalSettingsStore = { settings: LocalSettings; updateSettings: (settings: LocalSettings) => void; + setSettings: () => void; }; const useLocalSettingsStore = create((set) => ({ settings: { - darkMode: false, + theme: "", }, updateSettings: async (newSettings) => { + if ( + newSettings.theme && + newSettings.theme !== localStorage.getItem("theme") + ) { + localStorage.setItem("theme", newSettings.theme); + + const localTheme = localStorage.getItem("theme"); + + document + .querySelector("html") + ?.setAttribute("data-theme", localTheme || ""); + } + set((state) => ({ settings: { ...state.settings, ...newSettings } })); }, + setSettings: async () => { + if (!localStorage.getItem("theme")) { + localStorage.setItem("theme", "dark"); + } + + const localTheme = localStorage.getItem("theme"); + document + .querySelector("html") + ?.setAttribute("data-theme", localTheme || ""); + }, })); export default useLocalSettingsStore; - -// TODO: Add Dark mode. diff --git a/styles/globals.css b/styles/globals.css index 38abe37..5ac3955 100644 --- a/styles/globals.css +++ b/styles/globals.css @@ -2,8 +2,22 @@ @tailwind components; @tailwind utilities; +:root { + --my-color: #fff; + /* or any other variables/style */ +} + +[data-theme="dark"] { + --my-color: #000; +} + +[data-theme="light"] { + --my-color: #ffabc8; +} + html, body { + color-scheme: dark; scroll-behavior: smooth; } @@ -140,11 +154,6 @@ body { } /* Theme */ -@layer base { - body { - @apply dark:bg-neutral-900 bg-white text-black dark:text-white; - } -} /* react-select */ @layer components { diff --git a/tailwind.config.js b/tailwind.config.js index 796b4a4..932705e 100644 --- a/tailwind.config.js +++ b/tailwind.config.js @@ -10,7 +10,7 @@ module.exports = { secondary: "#22d3ee", accent: "#4f46e5", neutral: "#6b7280", - "base-100": "#f5f5f4", + "base-100": "#ffffff", info: "#a5f3fc", success: "#22c55e", warning: "#facc15", @@ -23,7 +23,7 @@ module.exports = { secondary: "#0284c7", accent: "#818cf8", neutral: "#1f2937", - "base-100": "#fcfcfc", + "base-100": "#171717", info: "#009ee4", success: "#00b17d", warning: "#eac700",