repositories
loading repo index
repositories
loading repo index
repository
loading code, commits, and activity
Projectflow
stars
latest
clone command
git clone gitlawb://did:key:z6Mkfh4Y...QBEi/projectflowgit clone gitlawb://did:key:z6Mkfh4Y.../projectflowb3cded1async from playground1d ago| #1 | import { StateCreator } from "zustand"; |
| #2 | import type { Priority, IssueStatus } from "../../../domain/value-objects"; |
| #3 | import type { StoreState } from "../store.types"; |
| #4 | |
| #5 | export type ThemePreference = "system" | "light" | "dark"; |
| #6 | |
| #7 | export interface UISlice { |
| #8 | theme: ThemePreference; |
| #9 | setTheme: (theme: ThemePreference) => void; |
| #10 | sidebarCollapsed: boolean; |
| #11 | toggleSidebar: () => void; |
| #12 | searchOpen: boolean; |
| #13 | setSearchOpen: (open: boolean) => void; |
| #14 | activeView: string; |
| #15 | setActiveView: (view: string) => void; |
| #16 | filters: { |
| #17 | assignee: string | null; |
| #18 | priority: Priority | null; |
| #19 | status: IssueStatus | null; |
| #20 | label: string | null; |
| #21 | search: string; |
| #22 | }; |
| #23 | setFilter: ( |
| #24 | key: UISlice["filters"] extends Record<infer K, unknown> ? K : never, |
| #25 | value: string | null |
| #26 | ) => void; |
| #27 | clearFilters: () => void; |
| #28 | } |
| #29 | |
| #30 | const STORAGE_KEY = "projectflow-theme"; |
| #31 | |
| #32 | function getInitialTheme(): ThemePreference { |
| #33 | if (typeof window === "undefined") return "system"; |
| #34 | const stored = localStorage.getItem(STORAGE_KEY); |
| #35 | if (stored === "light" || stored === "dark" || stored === "system") { |
| #36 | return stored; |
| #37 | } |
| #38 | return "system"; |
| #39 | } |
| #40 | |
| #41 | export const createUISlice: StateCreator<StoreState, [], [], UISlice> = ( |
| #42 | set |
| #43 | ) => ({ |
| #44 | theme: getInitialTheme(), |
| #45 | setTheme: (theme) => { |
| #46 | localStorage.setItem(STORAGE_KEY, theme); |
| #47 | set({ theme }); |
| #48 | }, |
| #49 | sidebarCollapsed: false, |
| #50 | toggleSidebar: () => |
| #51 | set((s) => ({ sidebarCollapsed: !s.sidebarCollapsed })), |
| #52 | searchOpen: false, |
| #53 | setSearchOpen: (open) => set({ searchOpen: open }), |
| #54 | activeView: "dashboard", |
| #55 | setActiveView: (view) => set({ activeView: view }), |
| #56 | filters: { |
| #57 | assignee: null, |
| #58 | priority: null, |
| #59 | status: null, |
| #60 | label: null, |
| #61 | search: "", |
| #62 | }, |
| #63 | setFilter: (key, value) => |
| #64 | set((s) => ({ |
| #65 | filters: { ...s.filters, [key]: value }, |
| #66 | })), |
| #67 | clearFilters: () => |
| #68 | set({ |
| #69 | filters: { |
| #70 | assignee: null, |
| #71 | priority: null, |
| #72 | status: null, |
| #73 | label: null, |
| #74 | search: "", |
| #75 | }, |
| #76 | }), |
| #77 | }); |
| #78 |