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 ? (
) : 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",