Folder clarity (#3180)

* folder clarity

* k
This commit is contained in:
pablodanswer 2024-11-20 19:11:17 -08:00 committed by GitHub
parent c875a4774f
commit 3f648cbc31
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 74 additions and 49 deletions

View File

@ -23,16 +23,22 @@ import { useRouter } from "next/navigation";
import { CHAT_SESSION_ID_KEY } from "@/lib/drag/constants"; import { CHAT_SESSION_ID_KEY } from "@/lib/drag/constants";
import Cookies from "js-cookie"; import Cookies from "js-cookie";
import { Popover } from "@/components/popover/Popover"; import { Popover } from "@/components/popover/Popover";
import { ChatSession } from "../interfaces";
const FolderItem = ({ const FolderItem = ({
folder, folder,
currentChatId, currentChatId,
isInitiallyExpanded, isInitiallyExpanded,
initiallySelected, initiallySelected,
showShareModal,
showDeleteModal,
}: { }: {
folder: Folder; folder: Folder;
currentChatId?: string; currentChatId?: string;
isInitiallyExpanded: boolean; isInitiallyExpanded: boolean;
initiallySelected: boolean; initiallySelected: boolean;
showShareModal: ((chatSession: ChatSession) => void) | undefined;
showDeleteModal: ((chatSession: ChatSession) => void) | undefined;
}) => { }) => {
const [isExpanded, setIsExpanded] = useState<boolean>(isInitiallyExpanded); const [isExpanded, setIsExpanded] = useState<boolean>(isInitiallyExpanded);
const [isEditing, setIsEditing] = useState<boolean>(initiallySelected); const [isEditing, setIsEditing] = useState<boolean>(initiallySelected);
@ -161,6 +167,9 @@ const FolderItem = ({
return a.time_created.localeCompare(b.time_created); return a.time_created.localeCompare(b.time_created);
}); });
// Determine whether to show the trash can icon
const showTrashIcon = (isHovering && !isEditing) || showDeleteConfirm;
return ( return (
<div <div
key={folder.folder_id} key={folder.folder_id}
@ -206,55 +215,60 @@ const FolderItem = ({
{editedFolderName || folder.folder_name} {editedFolderName || folder.folder_name}
</div> </div>
)} )}
{isHovering && !isEditing && (
<div className="flex ml-auto my-auto"> <div className="flex ml-auto my-auto">
<div <div
onClick={handleEditFolderName} onClick={handleEditFolderName}
className="hover:bg-black/10 p-1 -m-1 rounded" className={`hover:bg-black/10 p-1 -m-1 rounded ${
> isHovering && !isEditing
<FiEdit2 size={16} /> ? ""
</div> : "opacity-0 pointer-events-none"
<div className="relative"> }`}
<Popover >
open={showDeleteConfirm} <FiEdit2 size={16} />
onOpenChange={setShowDeleteConfirm}
content={
<div
onClick={handleDeleteClick}
className="hover:bg-black/10 p-1 -m-1 rounded ml-2"
>
<FiTrash size={16} />
</div>
}
popover={
<div className="p-2 w-[225px] bg-background-100 rounded shadow-lg">
<p className="text-sm mb-2">
Are you sure you want to delete{" "}
<i>{folder.folder_name}</i>? All the content inside
this folder will also be deleted.
</p>
<div className="flex justify-end">
<button
onClick={confirmDelete}
className="bg-red-500 hover:bg-red-600 text-white px-2 py-1 rounded text-xs mr-2"
>
Yes
</button>
<button
onClick={cancelDelete}
className="bg-gray-300 hover:bg-gray-200 px-2 py-1 rounded text-xs"
>
No
</button>
</div>
</div>
}
side="top"
align="center"
/>
</div>
</div> </div>
)}
<div className="relative">
<Popover
open={showDeleteConfirm}
onOpenChange={setShowDeleteConfirm}
content={
<div
onClick={handleDeleteClick}
className={`hover:bg-black/10 p-1 -m-1 rounded ml-2 ${
showTrashIcon ? "" : "opacity-0 pointer-events-none"
}`}
>
<FiTrash size={16} />
</div>
}
popover={
<div className="p-2 w-[225px] bg-background-100 rounded shadow-lg">
<p className="text-sm mb-2">
Are you sure you want to delete folder{" "}
<i>{folder.folder_name}</i>?
</p>
<div className="flex justify-end">
<button
onClick={confirmDelete}
className="bg-red-500 hover:bg-red-600 text-white px-2 py-1 rounded text-xs mr-2"
>
Yes
</button>
<button
onClick={cancelDelete}
className="bg-gray-300 hover:bg-gray-200 px-2 py-1 rounded text-xs"
>
No
</button>
</div>
</div>
}
side="top"
align="center"
/>
</div>
</div>
{isEditing && ( {isEditing && (
<div className="flex ml-auto my-auto"> <div className="flex ml-auto my-auto">
@ -276,6 +290,8 @@ const FolderItem = ({
</div> </div>
</div> </div>
</BasicSelectable> </BasicSelectable>
{/* Expanded Folder Content */}
{isExpanded && folders && ( {isExpanded && folders && (
<div className={"ml-2 pl-2 border-l border-border"}> <div className={"ml-2 pl-2 border-l border-border"}>
{folders.map((chatSession) => ( {folders.map((chatSession) => (
@ -284,6 +300,8 @@ const FolderItem = ({
chatSession={chatSession} chatSession={chatSession}
isSelected={chatSession.id === currentChatId} isSelected={chatSession.id === currentChatId}
skipGradient={isDragOver} skipGradient={isDragOver}
showShareModal={showShareModal}
showDeleteModal={showDeleteModal}
/> />
))} ))}
</div> </div>
@ -297,11 +315,15 @@ export const FolderList = ({
currentChatId, currentChatId,
openedFolders, openedFolders,
newFolderId, newFolderId,
showShareModal,
showDeleteModal,
}: { }: {
folders: Folder[]; folders: Folder[];
currentChatId?: string; currentChatId?: string;
openedFolders?: { [key: number]: boolean }; openedFolders?: { [key: number]: boolean };
newFolderId: number | null; newFolderId: number | null;
showShareModal: ((chatSession: ChatSession) => void) | undefined;
showDeleteModal: ((chatSession: ChatSession) => void) | undefined;
}) => { }) => {
if (folders.length === 0) { if (folders.length === 0) {
return null; return null;
@ -318,6 +340,8 @@ export const FolderList = ({
isInitiallyExpanded={ isInitiallyExpanded={
openedFolders ? openedFolders[folder.folder_id] || false : false openedFolders ? openedFolders[folder.folder_id] || false : false
} }
showShareModal={showShareModal}
showDeleteModal={showDeleteModal}
/> />
))} ))}
{folders.length == 1 && folders[0].chat_sessions.length == 0 && ( {folders.length == 1 && folders[0].chat_sessions.length == 0 && (

View File

@ -191,7 +191,6 @@ export function ChatSessionDisplay({
</div> </div>
</CustomTooltip> </CustomTooltip>
)} )}
<div> <div>
{search ? ( {search ? (
showDeleteModal && ( showDeleteModal && (

View File

@ -74,6 +74,8 @@ export function PagesTab({
folders={folders} folders={folders}
currentChatId={currentChatId} currentChatId={currentChatId}
openedFolders={openedFolders} openedFolders={openedFolders}
showShareModal={showShareModal}
showDeleteModal={showDeleteModal}
/> />
</div> </div>
)} )}