mirror of
https://github.com/mountain-loop/yaak.git
synced 2026-03-28 20:21:52 +01:00
Persist sidebar collapsed state (Closes #10)
This commit is contained in:
@@ -13,6 +13,7 @@ import { useCreateRequest } from '../hooks/useCreateRequest';
|
|||||||
import { useDeleteAnyRequest } from '../hooks/useDeleteAnyRequest';
|
import { useDeleteAnyRequest } from '../hooks/useDeleteAnyRequest';
|
||||||
import { useDeleteFolder } from '../hooks/useDeleteFolder';
|
import { useDeleteFolder } from '../hooks/useDeleteFolder';
|
||||||
import { useFolders } from '../hooks/useFolders';
|
import { useFolders } from '../hooks/useFolders';
|
||||||
|
import { useKeyValue } from '../hooks/useKeyValue';
|
||||||
import { useLatestResponse } from '../hooks/useLatestResponse';
|
import { useLatestResponse } from '../hooks/useLatestResponse';
|
||||||
import { useListenToTauriEvent } from '../hooks/useListenToTauriEvent';
|
import { useListenToTauriEvent } from '../hooks/useListenToTauriEvent';
|
||||||
import { useRequests } from '../hooks/useRequests';
|
import { useRequests } from '../hooks/useRequests';
|
||||||
@@ -20,6 +21,7 @@ import { useSidebarHidden } from '../hooks/useSidebarHidden';
|
|||||||
import { useUpdateAnyFolder } from '../hooks/useUpdateAnyFolder';
|
import { useUpdateAnyFolder } from '../hooks/useUpdateAnyFolder';
|
||||||
import { useUpdateAnyRequest } from '../hooks/useUpdateAnyRequest';
|
import { useUpdateAnyRequest } from '../hooks/useUpdateAnyRequest';
|
||||||
import { useUpdateRequest } from '../hooks/useUpdateRequest';
|
import { useUpdateRequest } from '../hooks/useUpdateRequest';
|
||||||
|
import { NAMESPACE_NO_SYNC } from '../lib/keyValueStore';
|
||||||
import type { Folder, HttpRequest, Workspace } from '../lib/models';
|
import type { Folder, HttpRequest, Workspace } from '../lib/models';
|
||||||
import { isResponseLoading } from '../lib/models';
|
import { isResponseLoading } from '../lib/models';
|
||||||
import { Dropdown } from './core/Dropdown';
|
import { Dropdown } from './core/Dropdown';
|
||||||
@@ -57,6 +59,16 @@ export const Sidebar = memo(function Sidebar({ className }: Props) {
|
|||||||
const [hasFocus, setHasFocus] = useState<boolean>(false);
|
const [hasFocus, setHasFocus] = useState<boolean>(false);
|
||||||
const [selectedId, setSelectedId] = useState<string | null>(null);
|
const [selectedId, setSelectedId] = useState<string | null>(null);
|
||||||
const [selectedTree, setSelectedTree] = useState<TreeNode | null>(null);
|
const [selectedTree, setSelectedTree] = useState<TreeNode | null>(null);
|
||||||
|
const updateAnyRequest = useUpdateAnyRequest();
|
||||||
|
const updateAnyFolder = useUpdateAnyFolder();
|
||||||
|
const [draggingId, setDraggingId] = useState<string | null>(null);
|
||||||
|
const [hoveredTree, setHoveredTree] = useState<TreeNode | null>(null);
|
||||||
|
const [hoveredIndex, setHoveredIndex] = useState<number | null>(null);
|
||||||
|
const collapsed = useKeyValue<Record<string, boolean>>({
|
||||||
|
key: ['sidebar_collapsed', activeWorkspace?.id ?? 'n/a'],
|
||||||
|
defaultValue: {},
|
||||||
|
namespace: NAMESPACE_NO_SYNC,
|
||||||
|
});
|
||||||
|
|
||||||
const { tree, treeParentMap, selectableRequests } = useMemo<{
|
const { tree, treeParentMap, selectableRequests } = useMemo<{
|
||||||
tree: TreeNode | null;
|
tree: TreeNode | null;
|
||||||
@@ -126,7 +138,7 @@ export const Sidebar = memo(function Sidebar({ className }: Props) {
|
|||||||
const { item } = node;
|
const { item } = node;
|
||||||
|
|
||||||
if (item.model === 'folder') {
|
if (item.model === 'folder') {
|
||||||
setCollapsed((c) => ({ ...c, [item.id]: !c[item.id] }));
|
collapsed.set((c) => ({ ...c, [item.id]: !c[item.id] }));
|
||||||
} else {
|
} else {
|
||||||
routes.navigate('request', {
|
routes.navigate('request', {
|
||||||
requestId: id,
|
requestId: id,
|
||||||
@@ -138,7 +150,7 @@ export const Sidebar = memo(function Sidebar({ className }: Props) {
|
|||||||
focusActiveRequest({ id, tree });
|
focusActiveRequest({ id, tree });
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
[treeParentMap, routes, activeEnvironmentId, focusActiveRequest],
|
[treeParentMap, collapsed, routes, activeEnvironmentId, focusActiveRequest],
|
||||||
);
|
);
|
||||||
|
|
||||||
const handleClearSelected = useCallback(() => {
|
const handleClearSelected = useCallback(() => {
|
||||||
@@ -230,13 +242,6 @@ export const Sidebar = memo(function Sidebar({ className }: Props) {
|
|||||||
undefined,
|
undefined,
|
||||||
[hasFocus, selectableRequests, selectedId, setSelectedId, setSelectedTree],
|
[hasFocus, selectableRequests, selectedId, setSelectedId, setSelectedTree],
|
||||||
);
|
);
|
||||||
const updateAnyRequest = useUpdateAnyRequest();
|
|
||||||
const updateAnyFolder = useUpdateAnyFolder();
|
|
||||||
|
|
||||||
const [collapsed, setCollapsed] = useState<Record<string, boolean>>({});
|
|
||||||
const [draggingId, setDraggingId] = useState<string | null>(null);
|
|
||||||
const [hoveredTree, setHoveredTree] = useState<TreeNode | null>(null);
|
|
||||||
const [hoveredIndex, setHoveredIndex] = useState<number | null>(null);
|
|
||||||
|
|
||||||
const handleMove = useCallback<DraggableSidebarItemProps['onMove']>(
|
const handleMove = useCallback<DraggableSidebarItemProps['onMove']>(
|
||||||
(id, side) => {
|
(id, side) => {
|
||||||
@@ -326,6 +331,10 @@ export const Sidebar = memo(function Sidebar({ className }: Props) {
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (collapsed.value == null) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div aria-hidden={hidden} className="h-full">
|
<div aria-hidden={hidden} className="h-full">
|
||||||
<aside
|
<aside
|
||||||
@@ -342,7 +351,7 @@ export const Sidebar = memo(function Sidebar({ className }: Props) {
|
|||||||
treeParentMap={treeParentMap}
|
treeParentMap={treeParentMap}
|
||||||
selectedId={selectedId}
|
selectedId={selectedId}
|
||||||
selectedTree={selectedTree}
|
selectedTree={selectedTree}
|
||||||
collapsed={collapsed}
|
collapsed={collapsed.value}
|
||||||
tree={tree}
|
tree={tree}
|
||||||
focused={hasFocus}
|
focused={hasFocus}
|
||||||
draggingId={draggingId}
|
draggingId={draggingId}
|
||||||
|
|||||||
Reference in New Issue
Block a user