From cbe8cf3a0549adf5dab7b80fd9724846d93f2175 Mon Sep 17 00:00:00 2001 From: Gregory Schier Date: Thu, 16 Mar 2023 11:01:30 -0700 Subject: [PATCH] Store appearance in k/v --- src-web/components/RequestPane.tsx | 7 +++++++ src-web/components/core/Tabs/Tabs.tsx | 17 +++++++++++++---- src-web/hooks/useKeyValues.ts | 4 ++-- src-web/hooks/useTheme.ts | 25 +++++++++---------------- src-web/main.tsx | 11 +++++++++-- 5 files changed, 40 insertions(+), 24 deletions(-) diff --git a/src-web/components/RequestPane.tsx b/src-web/components/RequestPane.tsx index f6da2c14..9fe6ed3c 100644 --- a/src-web/components/RequestPane.tsx +++ b/src-web/components/RequestPane.tsx @@ -1,6 +1,7 @@ import classnames from 'classnames'; import { useActiveRequest } from '../hooks/useActiveRequest'; import { useIsResponseLoading } from '../hooks/useIsResponseLoading'; +import { useKeyValues } from '../hooks/useKeyValues'; import { useSendRequest } from '../hooks/useSendRequest'; import { useUpdateRequest } from '../hooks/useUpdateRequest'; import { tryFormatJson } from '../lib/formatters'; @@ -20,6 +21,10 @@ export function RequestPane({ fullHeight, className }: Props) { const updateRequest = useUpdateRequest(activeRequest); const sendRequest = useSendRequest(activeRequest); const responseLoading = useIsResponseLoading(); + const activeTab = useKeyValues({ + key: ['active_request_body_tab', activeRequest?.id ?? 'n/a'], + initialValue: 'body', + }); if (activeRequest === null) return null; @@ -35,6 +40,8 @@ export function RequestPane({ fullHeight, className }: Props) { loading={responseLoading} /> void; + value: string; tabs: { value: string; label: string; @@ -27,12 +28,20 @@ interface Props { children: ReactNode; } -export function Tabs({ defaultValue, label, children, tabs, className, tabListClassName }: Props) { - const [value, setValue] = useState(defaultValue); +export function Tabs({ + value, + onChangeValue, + defaultValue, + label, + children, + tabs, + className, + tabListClassName, +}: Props) { return ( { - setAppearance(appearance); + appearanceKv.set(appearance); }; const handleToggleAppearance = async () => { - const newAppearance = toggleAppearance(); - await queryClient.setQueryData(appearanceQueryKey(), newAppearance); + appearanceKv.set(appearanceKv.value === 'dark' ? 'light' : 'dark'); }; + // Set appearance when preferred theme changes useEffect(() => subscribeToPreferredAppearanceChange(themeChange), []); + // Sync appearance when k/v changes + useEffect(() => setAppearance(appearanceKv.value as Appearance), [appearanceKv.value]); + return { - appearance, + appearance: appearanceKv.value, toggleAppearance: handleToggleAppearance, }; } diff --git a/src-web/main.tsx b/src-web/main.tsx index 51eb4622..87f9b0d7 100644 --- a/src-web/main.tsx +++ b/src-web/main.tsx @@ -1,10 +1,17 @@ +import { invoke } from '@tauri-apps/api'; import { StrictMode } from 'react'; import ReactDOM from 'react-dom/client'; import { App } from './components/App'; -import { setAppearance } from './lib/theme/window'; +import type { KeyValue } from './lib/models'; +import type { Appearance } from './lib/theme/window'; +import { getPreferredAppearance, setAppearance } from './lib/theme/window'; import './main.css'; -setAppearance(); +const appearance: KeyValue = await invoke('get_key_value', { + namespace: 'app', + key: 'appearance', +}); +setAppearance((appearance?.value ?? getPreferredAppearance()) as Appearance); // root holds our app's root DOM Element: ReactDOM.createRoot(document.getElementById('root') as HTMLElement).render(