From 2d490f7dc13016cd82f6985d53ef94ecc690009f Mon Sep 17 00:00:00 2001 From: Victor Oliva Date: Fri, 29 Aug 2025 09:49:46 +0800 Subject: [PATCH] feat: make sidebar permanent with theme toggle, github link --- src/ThemeProvider.tsx | 28 ++++++++++++++++++++++------ src/pages/Header.tsx | 38 +++++++++++++++++++++++++++++++++++--- 2 files changed, 57 insertions(+), 9 deletions(-) diff --git a/src/ThemeProvider.tsx b/src/ThemeProvider.tsx index 7241cbe..165e856 100644 --- a/src/ThemeProvider.tsx +++ b/src/ThemeProvider.tsx @@ -1,4 +1,5 @@ import { state, useStateObservable } from "@react-rxjs/core" +import { createSignal } from "@react-rxjs/utils" import { createContext, FC, @@ -6,7 +7,9 @@ import { useContext, useLayoutEffect, } from "react" -import { fromEvent, map } from "rxjs" +import { fromEvent, map, merge } from "rxjs" + +export const [changeTheme$, changeTheme] = createSignal<"light" | "dark">() const getCurrentMedia = (): "light" | "dark" => window.matchMedia @@ -15,17 +18,30 @@ const getCurrentMedia = (): "light" | "dark" => : "light" : "dark" -const defaultTheme = getCurrentMedia() +const prefLSKey = "theme" +changeTheme$.subscribe((theme) => { + if (getCurrentMedia() === theme) { + localStorage.removeItem(prefLSKey) + } else { + localStorage.setItem(prefLSKey, theme) + } +}) + +const defaultTheme = + (localStorage.getItem(prefLSKey) as "light" | "dark") || getCurrentMedia() const ThemeContext = createContext<"light" | "dark">(defaultTheme) export const useTheme = () => useContext(ThemeContext) const theme$ = state( - fromEvent( - window.matchMedia("(prefers-color-scheme: dark)"), - "change", - ).pipe(map((evt) => (evt.matches ? "dark" : "light"))), + merge( + fromEvent( + window.matchMedia("(prefers-color-scheme: dark)"), + "change", + ).pipe(map((evt) => (evt.matches ? "dark" : "light"))), + changeTheme$, + ), defaultTheme, ) diff --git a/src/pages/Header.tsx b/src/pages/Header.tsx index 5c56e4c..4a00581 100644 --- a/src/pages/Header.tsx +++ b/src/pages/Header.tsx @@ -6,6 +6,8 @@ import { FC, PropsWithChildren, useState } from "react" import { useLocation } from "react-router-dom" import { twMerge } from "tailwind-merge" import { NetworkSwitcher } from "./Network/Network" +import SliderToggle from "@/components/Toggle" +import { changeTheme, useTheme } from "@/ThemeProvider" const navigationItems = [ { path: "/explorer", label: "Explorer", important: true }, @@ -13,7 +15,6 @@ const navigationItems = [ { path: "/extrinsics", label: "Extrinsics", important: true }, { path: "/constants", label: "Constants", important: false }, { path: "/runtimeCalls", label: "Runtime Calls", important: true }, - { path: "/rpcCalls", label: "RPC Calls", important: false }, { path: "/metadata", label: "Metadata", important: false }, ] @@ -61,7 +62,7 @@ export const Header = () => { @@ -71,7 +72,7 @@ export const Header = () => { className="bg-background border-accent w-64 pt-10" > -