Skip to content

Commit 98210b0

Browse files
committed
feat: add breadcrumbs to folder setting
1 parent c20c0ef commit 98210b0

File tree

1 file changed

+35
-1
lines changed

1 file changed

+35
-1
lines changed

src-web/components/FolderSettingsDialog.tsx

Lines changed: 35 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,19 @@
1-
import { createWorkspaceModel, foldersAtom, patchModel } from '@yaakapp-internal/models';
1+
import {
2+
createWorkspaceModel,
3+
foldersAtom,
4+
patchModel,
5+
workspacesAtom,
6+
} from '@yaakapp-internal/models';
27
import { useAtomValue } from 'jotai';
38
import { useMemo, useState } from 'react';
49
import { useAuthTab } from '../hooks/useAuthTab';
510
import { useEnvironmentsBreakdown } from '../hooks/useEnvironmentsBreakdown';
611
import { useHeadersTab } from '../hooks/useHeadersTab';
712
import { useInheritedHeaders } from '../hooks/useInheritedHeaders';
13+
import { useParentFolders } from '../hooks/useParentFolders';
814
import { Button } from './core/Button';
915
import { CountBadge } from './core/CountBadge';
16+
import { Icon } from './core/Icon';
1017
import { Input } from './core/Input';
1118
import { Link } from './core/Link';
1219
import { VStack } from './core/Stacks';
@@ -36,7 +43,9 @@ export type FolderSettingsTab =
3643

3744
export function FolderSettingsDialog({ folderId, tab }: Props) {
3845
const folders = useAtomValue(foldersAtom);
46+
const workspaces = useAtomValue(workspacesAtom);
3947
const folder = folders.find((f) => f.id === folderId) ?? null;
48+
const parentFolders = useParentFolders(folder);
4049
const [activeTab, setActiveTab] = useState<string>(tab ?? TAB_GENERAL);
4150
const authTab = useAuthTab(TAB_AUTH, folder);
4251
const headersTab = useHeadersTab(TAB_HEADERS, folder);
@@ -47,6 +56,14 @@ export function FolderSettingsDialog({ folderId, tab }: Props) {
4756
);
4857
const numVars = (folderEnvironment?.variables ?? []).filter((v) => v.name).length;
4958

59+
const breadcrumbs = useMemo(() => {
60+
if (!folder) return [];
61+
62+
const workspace = workspaces.find((w) => w.id === folder.workspaceId);
63+
64+
return [workspace?.name, ...parentFolders.reverse().map((f) => f.name)].filter(Boolean);
65+
}, [folder, parentFolders, workspaces]);
66+
5067
const tabs = useMemo<TabItem[]>(() => {
5168
if (folder == null) return [];
5269

@@ -82,6 +99,23 @@ export function FolderSettingsDialog({ folderId, tab }: Props) {
8299
</TabContent>
83100
<TabContent value={TAB_GENERAL} className="overflow-y-auto h-full px-4">
84101
<VStack space={3} className="pb-3 h-full">
102+
{breadcrumbs.length > 0 && (
103+
<div className="flex flex-col gap-1.5">
104+
<div className="text-xs font-medium text-text-subtle uppercase tracking-wide">
105+
Location
106+
</div>
107+
<div className="flex items-center gap-1.5 text-sm text-text-subtlest px-2 py-1.5 bg-surface rounded border border-border">
108+
{breadcrumbs.map((name, index) => (
109+
<React.Fragment key={index}>
110+
{index > 0 && <Icon icon="chevron_right" size="sm" className="opacity-50" />}
111+
<span className={index === breadcrumbs.length - 1 ? 'text-text-subtle' : ''}>
112+
{name}
113+
</span>
114+
</React.Fragment>
115+
))}
116+
</div>
117+
</div>
118+
)}
85119
<Input
86120
label="Folder Name"
87121
defaultValue={folder.name}

0 commit comments

Comments
 (0)