From 9dd448904956ea02330bebd1bc501a04be71ef07 Mon Sep 17 00:00:00 2001 From: Gregory Schier Date: Sun, 29 Oct 2023 11:31:13 -0700 Subject: [PATCH] Restore recent environment on workspace change Fixes #6 --- src-tauri/tauri.conf.json | 2 +- src-web/components/GlobalHooks.tsx | 3 ++ .../components/WorkspaceActionsDropdown.tsx | 19 +++++----- src-web/hooks/useRecentEnvironments.ts | 35 +++++++++++++------ 4 files changed, 40 insertions(+), 19 deletions(-) diff --git a/src-tauri/tauri.conf.json b/src-tauri/tauri.conf.json index ad0b6e0a..3cb438b2 100644 --- a/src-tauri/tauri.conf.json +++ b/src-tauri/tauri.conf.json @@ -8,7 +8,7 @@ }, "package": { "productName": "Yaak", - "version": "2023.1.2" + "version": "2023.1.3" }, "tauri": { "windows": [], diff --git a/src-web/components/GlobalHooks.tsx b/src-web/components/GlobalHooks.tsx index effdbd1c..6086e18e 100644 --- a/src-web/components/GlobalHooks.tsx +++ b/src-web/components/GlobalHooks.tsx @@ -18,9 +18,12 @@ import { useEffect } from 'react'; import { setPathname } from '../lib/persistPathname'; export function GlobalHooks() { + // Include here so they always update, even + // if no component references them useRecentWorkspaces(); useRecentEnvironments(); useRecentRequests(); + const queryClient = useQueryClient(); const { wasUpdatedExternally } = useRequestUpdateKey(null); diff --git a/src-web/components/WorkspaceActionsDropdown.tsx b/src-web/components/WorkspaceActionsDropdown.tsx index 7bf3695d..c063f987 100644 --- a/src-web/components/WorkspaceActionsDropdown.tsx +++ b/src-web/components/WorkspaceActionsDropdown.tsx @@ -16,6 +16,7 @@ import { Icon } from './core/Icon'; import { InlineCode } from './core/InlineCode'; import { HStack } from './core/Stacks'; import { useDialog } from './DialogContext'; +import { getRecentEnvironments } from '../hooks/useRecentEnvironments'; type Props = Pick; @@ -54,26 +55,28 @@ export const WorkspaceActionsDropdown = memo(function WorkspaceActionsDropdown({ ); diff --git a/src-web/hooks/useRecentEnvironments.ts b/src-web/hooks/useRecentEnvironments.ts index aaa4f792..e96b94b2 100644 --- a/src-web/hooks/useRecentEnvironments.ts +++ b/src-web/hooks/useRecentEnvironments.ts @@ -1,31 +1,38 @@ import { useEffect } from 'react'; -import { createGlobalState, useEffectOnce, useLocalStorage } from 'react-use'; -import { useActiveRequestId } from './useActiveRequestId'; +import { createGlobalState, useEffectOnce } from 'react-use'; import { useActiveWorkspaceId } from './useActiveWorkspaceId'; import { useActiveEnvironmentId } from './useActiveEnvironmentId'; +import { useKeyValue } from './useKeyValue'; +import { NAMESPACE_GLOBAL, getKeyValue } from '../lib/keyValueStore'; const useHistoryState = createGlobalState([]); +const kvKey = (workspaceId: string) => 'recent_environments::' + workspaceId; +const namespace = NAMESPACE_GLOBAL; +const defaultValue: string[] = []; + export function useRecentEnvironments() { const activeWorkspaceId = useActiveWorkspaceId(); const activeEnvironmentId = useActiveEnvironmentId(); const [history, setHistory] = useHistoryState(); - const [lsState, setLSState] = useLocalStorage( - 'recent_environments::' + activeWorkspaceId, - [], - ); + const kv = useKeyValue({ + key: kvKey(activeWorkspaceId ?? 'n/a'), + namespace, + defaultValue, + }); // Load local storage state on initial render useEffectOnce(() => { - if (lsState) { - setHistory(lsState); + if (kv.value) { + setHistory(kv.value); } }); // Update local storage state when history changes useEffect(() => { - setLSState(history); - }, [history, setLSState]); + kv.set(history); + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [history]); // Set history when active request changes useEffect(() => { @@ -38,3 +45,11 @@ export function useRecentEnvironments() { return history; } + +export async function getRecentEnvironments(workspaceId: string) { + return getKeyValue({ + namespace, + key: kvKey(workspaceId), + fallback: defaultValue, + }); +}