Skip to content

Commit 2bee65e

Browse files
committed
#286 refactor: NamingModal and RequestFolderNamingModal
1 parent a854e27 commit 2bee65e

File tree

7 files changed

+139
-104
lines changed

7 files changed

+139
-104
lines changed

.gitignore

+1
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@ typings/
4444

4545
# Optional npm cache directory
4646
.npm
47+
package-lock.json
4748

4849
# Optional eslint cache
4950
.eslintcache
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
import {
2+
Dialog,
3+
DialogContent,
4+
DialogFooter,
5+
DialogHeader,
6+
DialogTitle,
7+
} from '@/components/ui/dialog';
8+
import { Button } from '@/components/ui/button';
9+
10+
interface NamingModalProps {
11+
open: boolean;
12+
onOpenChange: (open: boolean) => void;
13+
modalTitle: string;
14+
onSubmit: () => Promise<void>;
15+
onReset: () => void;
16+
value: string;
17+
onChange: (value: string) => void;
18+
placeholder: string;
19+
valid: boolean;
20+
}
21+
22+
export const NamingModal = (props: NamingModalProps) => {
23+
return (
24+
<Dialog open={props.open} onOpenChange={props.onOpenChange}>
25+
<DialogContent>
26+
<DialogHeader>
27+
<DialogTitle>{props.modalTitle}</DialogTitle>
28+
</DialogHeader>
29+
<form onSubmit={props.onSubmit} onReset={props.onReset}>
30+
<div className="p-4">
31+
<input
32+
type="text"
33+
value={props.value}
34+
onChange={(e) => props.onChange(e.target.value)}
35+
className="w-full bg-transparent outline-none"
36+
placeholder={props.placeholder}
37+
/>
38+
</div>
39+
<DialogFooter className="bottom-0">
40+
<Button disabled={!props.valid} variant={props.valid ? 'default' : 'defaultDisable'}>
41+
<span className="leading-4 font-bold">Save</span>
42+
</Button>
43+
<Button type="reset" variant="destructive">
44+
<span className="leading-4 font-bold">Cancel</span>
45+
</Button>
46+
</DialogFooter>
47+
</form>
48+
</DialogContent>
49+
</Dialog>
50+
);
51+
};

src/renderer/components/sidebar/SidebarHeaderBar.tsx

+2-2
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import { SidebarHeader } from '@/components/ui/sidebar';
33
import { Button } from '@/components/ui/button';
44
import { cn } from '@/lib/utils';
55
import { AddIcon } from '@/components/icons';
6-
import { NamingModal } from '@/components/sidebar/SidebarRequestList/Nav/Dropdown/modals/NamingModal';
6+
import { RequestFolderNamingModal } from '@/components/sidebar/SidebarRequestList/Nav/Dropdown/modals/RequestFolderNamingModal';
77
import { useCollectionStore } from '@/state/collectionStore';
88

99
export const SidebarHeaderBar = () => {
@@ -43,7 +43,7 @@ export const SidebarHeaderBar = () => {
4343
</div>
4444
</SidebarHeader>
4545
{modalState.isOpen && (
46-
<NamingModal
46+
<RequestFolderNamingModal
4747
isOpen={modalState.isOpen}
4848
trufosObject={collection}
4949
createType={modalState.type}

src/renderer/components/sidebar/SidebarRequestList/Nav/Dropdown/FolderDropdown.tsx

+2-2
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ import { MoreHorizontal } from 'lucide-react';
1010
import { handleMouseEvent } from '@/util/callback-util';
1111
import { Folder } from 'shim/objects/folder';
1212
import { useCollectionActions } from '@/state/collectionStore';
13-
import { NamingModal } from '@/components/sidebar/SidebarRequestList/Nav/Dropdown/modals/NamingModal';
13+
import { RequestFolderNamingModal } from '@/components/sidebar/SidebarRequestList/Nav/Dropdown/modals/RequestFolderNamingModal';
1414

1515
export interface FolderDropdownProps {
1616
folder: Folder;
@@ -54,7 +54,7 @@ export const FolderDropdown = ({ folder }: FolderDropdownProps) => {
5454
</DropdownMenuContent>
5555
</DropdownMenu>
5656
{renameModalIsOpen && (
57-
<NamingModal
57+
<RequestFolderNamingModal
5858
isOpen={renameModalIsOpen}
5959
trufosObject={folder}
6060
createType={isCreateModal}

src/renderer/components/sidebar/SidebarRequestList/Nav/Dropdown/RequestDropdown.tsx

+2-2
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ import { handleMouseEvent } from '@/util/callback-util';
1010
import { useCollectionActions, useCollectionStore } from '@/state/collectionStore';
1111
import { useState } from 'react';
1212
import { TrufosRequest } from 'shim/objects/request';
13-
import { NamingModal } from '@/components/sidebar/SidebarRequestList/Nav/Dropdown/modals/NamingModal';
13+
import { RequestFolderNamingModal } from '@/components/sidebar/SidebarRequestList/Nav/Dropdown/modals/RequestFolderNamingModal';
1414

1515
export interface RequestDropdownProps {
1616
request: TrufosRequest;
@@ -43,7 +43,7 @@ export const RequestDropdown = ({ request }: RequestDropdownProps) => {
4343
</DropdownMenuContent>
4444
</DropdownMenu>
4545
{renameModalIsOpen && (
46-
<NamingModal
46+
<RequestFolderNamingModal
4747
isOpen={renameModalIsOpen}
4848
trufosObject={request}
4949
createType={null}

src/renderer/components/sidebar/SidebarRequestList/Nav/Dropdown/modals/NamingModal.tsx

-98
This file was deleted.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
import { useEffect, useState } from 'react';
2+
import { TrufosRequest } from 'shim/objects/request';
3+
import { Folder } from 'shim/objects/folder';
4+
import { selectFolder, useCollectionActions, useCollectionStore } from '@/state/collectionStore';
5+
import { Collection } from 'shim/objects/collection';
6+
import { NamingModal } from '@/components/shared/modal/NamingModal';
7+
8+
interface RequestFolderNamingModalProps {
9+
createType?: 'folder' | 'request';
10+
trufosObject: Folder | TrufosRequest | Omit<Collection, 'variables' | 'environments'>;
11+
isOpen: boolean;
12+
setOpen: (open: boolean) => void;
13+
}
14+
15+
export const RequestFolderNamingModal = ({
16+
createType,
17+
trufosObject,
18+
isOpen,
19+
setOpen,
20+
}: RequestFolderNamingModalProps) => {
21+
const [isValid, setValid] = useState(false);
22+
const [title, setTitle] = useState(createType ? '' : trufosObject.title);
23+
const { renameFolder, renameRequest, addNewRequest, addNewFolder } = useCollectionActions();
24+
const siblingTitles: string[] = [];
25+
if (createType !== null && trufosObject.type !== 'request') {
26+
siblingTitles.push(...trufosObject.children.map((parent) => parent.title));
27+
} else if (trufosObject.type !== 'collection') {
28+
const parent = useCollectionStore((state) => selectFolder(state, trufosObject.parentId));
29+
if (parent) {
30+
siblingTitles.push(...parent.children.map((child) => child.title));
31+
} else {
32+
const collection = useCollectionStore((state) => state.collection);
33+
if (collection.id === trufosObject.parentId) {
34+
siblingTitles.push(...collection.children.map((child) => child.title));
35+
}
36+
}
37+
}
38+
39+
const save = async () => {
40+
if (createType) {
41+
if (createType === 'folder') {
42+
addNewFolder(title, trufosObject.id);
43+
} else {
44+
addNewRequest(title, trufosObject.id);
45+
}
46+
} else {
47+
if (trufosObject.type === 'folder') {
48+
renameFolder(trufosObject.id, title);
49+
} else {
50+
renameRequest(trufosObject.id, title);
51+
}
52+
}
53+
setOpen(false);
54+
};
55+
56+
const header = createType
57+
? `Create a new ${createType.charAt(0).toUpperCase() + createType.slice(1)}`
58+
: `Rename the ${trufosObject.type.charAt(0).toUpperCase() + trufosObject.type.slice(1)}`;
59+
60+
useEffect(() => {
61+
setValid(
62+
title.trim().length > 0 &&
63+
title !== (createType ? '' : trufosObject.title) &&
64+
siblingTitles.indexOf(title) === -1
65+
);
66+
}, [title]);
67+
68+
return (
69+
<NamingModal
70+
open={isOpen}
71+
onOpenChange={(open) => !open && setOpen(false)}
72+
modalTitle={header}
73+
onSubmit={() => save()}
74+
onReset={() => setOpen(false)}
75+
value={title}
76+
onChange={(value) => setTitle(value)}
77+
placeholder={`Enter the ${createType ?? trufosObject.type} name`}
78+
valid={isValid}
79+
/>
80+
);
81+
};

0 commit comments

Comments
 (0)