From 5aed4b79bee8be8a5e63c75fef7d07f5ad42baec Mon Sep 17 00:00:00 2001 From: Gregory Schier Date: Fri, 3 Nov 2023 23:10:44 -0700 Subject: [PATCH] Folder chevron icon --- src-tauri/src/main.rs | 14 +++++++------ src-web/components/Sidebar.tsx | 34 +++++++++++++++++++++----------- src-web/components/core/Icon.tsx | 4 +++- 3 files changed, 34 insertions(+), 18 deletions(-) diff --git a/src-tauri/src/main.rs b/src-tauri/src/main.rs index 989c843b..114a5c06 100644 --- a/src-tauri/src/main.rs +++ b/src-tauri/src/main.rs @@ -7,6 +7,12 @@ #[macro_use] extern crate objc; +use std::collections::HashMap; +use std::env::current_dir; +use std::fs::{create_dir_all, File}; +use std::io::Write; +use std::process::exit; + use base64::Engine; use http::header::{HeaderName, ACCEPT, USER_AGENT}; use http::{HeaderMap, HeaderValue, Method}; @@ -17,17 +23,13 @@ use sqlx::migrate::Migrator; use sqlx::sqlite::SqlitePoolOptions; use sqlx::types::Json; use sqlx::{Pool, Sqlite}; -use std::collections::HashMap; -use std::env::current_dir; -use std::fs::{create_dir_all, File}; -use std::io::Write; -use std::process::exit; #[cfg(target_os = "macos")] use tauri::TitleBarStyle; use tauri::{AppHandle, Menu, RunEvent, State, Submenu, Window, WindowUrl, Wry}; use tauri::{CustomMenuItem, Manager, WindowEvent}; use tauri_plugin_window_state::{StateFlags, WindowExt}; use tokio::sync::Mutex; + use window_ext::TrafficLightWindowExt; mod menu; @@ -881,7 +883,7 @@ fn create_window(handle: &AppHandle, url: Option<&str>) -> Window { let win2 = win.clone(); let handle2 = handle.clone(); win.on_menu_event(move |event| match event.menu_item_id() { - "quit" => std::process::exit(0), + "quit" => exit(0), "close" => win2.close().unwrap(), "zoom_reset" => win2.emit("zoom", 0).unwrap(), "zoom_in" => win2.emit("zoom", 1).unwrap(), diff --git a/src-web/components/Sidebar.tsx b/src-web/components/Sidebar.tsx index 7e41776e..9f720a22 100644 --- a/src-web/components/Sidebar.tsx +++ b/src-web/components/Sidebar.tsx @@ -4,26 +4,26 @@ import React, { forwardRef, Fragment, memo, useCallback, useMemo, useRef, useSta import type { XYCoord } from 'react-dnd'; import { useDrag, useDrop } from 'react-dnd'; import { useKey, useKeyPressEvent } from 'react-use'; +import { useActiveEnvironmentId } from '../hooks/useActiveEnvironmentId'; import { useActiveRequestId } from '../hooks/useActiveRequestId'; +import { useActiveWorkspace } from '../hooks/useActiveWorkspace'; import { useAppRoutes } from '../hooks/useAppRoutes'; +import { useCreateRequest } from '../hooks/useCreateRequest'; import { useDeleteAnyRequest } from '../hooks/useDeleteAnyRequest'; +import { useFolders } from '../hooks/useFolders'; import { useLatestResponse } from '../hooks/useLatestResponse'; +import { useListenToTauriEvent } from '../hooks/useListenToTauriEvent'; import { useRequests } from '../hooks/useRequests'; import { useSidebarHidden } from '../hooks/useSidebarHidden'; -import { useListenToTauriEvent } from '../hooks/useListenToTauriEvent'; +import { useUpdateAnyFolder } from '../hooks/useUpdateAnyFolder'; import { useUpdateAnyRequest } from '../hooks/useUpdateAnyRequest'; import { useUpdateRequest } from '../hooks/useUpdateRequest'; import type { Folder, HttpRequest, Workspace } from '../lib/models'; import { isResponseLoading } from '../lib/models'; import { Icon } from './core/Icon'; +import { VStack } from './core/Stacks'; import { StatusTag } from './core/StatusTag'; import { DropMarker } from './DropMarker'; -import { useActiveEnvironmentId } from '../hooks/useActiveEnvironmentId'; -import { useCreateRequest } from '../hooks/useCreateRequest'; -import { VStack } from './core/Stacks'; -import { useFolders } from '../hooks/useFolders'; -import { useActiveWorkspace } from '../hooks/useActiveWorkspace'; -import { useUpdateAnyFolder } from '../hooks/useUpdateAnyFolder'; interface Props { className?: string; @@ -402,6 +402,7 @@ function SidebarItems({ onSelect={onSelect} onDragStart={handleDragStart} useProminentStyles={focused} + collapsed={collapsed} className={classNames(tree.depth > 0 && 'border-l border-highlight ml-5')} > {child.item.model === 'folder' && @@ -443,17 +444,20 @@ type SidebarItemProps = { onSelect: (id: string) => void; draggable?: boolean; children?: ReactNode; + collapsed: Record; }; -const _SidebarItem = forwardRef(function SidebarItem( +const SidebarItem = forwardRef(function SidebarItem( { children, className, itemName, itemId, + itemModel, useProminentStyles, selected, onSelect, + collapsed, }: SidebarItemProps, ref: ForwardedRef, ) { @@ -493,7 +497,10 @@ const _SidebarItem = forwardRef(function SidebarItem( [handleSubmitNameEdit], ); - const handleStartEditing = useCallback(() => setEditing(true), [setEditing]); + const handleStartEditing = useCallback(() => { + if (itemModel !== 'http_request') return; + setEditing(true); + }, [setEditing, itemModel]); const handleBlur = useCallback( (e: React.FocusEvent) => { @@ -525,6 +532,13 @@ const _SidebarItem = forwardRef(function SidebarItem( selected && useProminentStyles && '!bg-violet-500/20 text-gray-900', )} > + {itemModel === 'folder' && ( + + )} {editing ? ( void; onEnd: (id: string) => void; diff --git a/src-web/components/core/Icon.tsx b/src-web/components/core/Icon.tsx index 6380f98f..6c62c0dc 100644 --- a/src-web/components/core/Icon.tsx +++ b/src-web/components/core/Icon.tsx @@ -4,6 +4,7 @@ import { CheckboxIcon, CheckIcon, ChevronDownIcon, + ChevronRightIcon, ClockIcon, CodeIcon, ColorWheelIcon, @@ -12,6 +13,7 @@ import { DividerHorizontalIcon, DotsHorizontalIcon, DotsVerticalIcon, + DownloadIcon, DragHandleDots2Icon, EyeClosedIcon, EyeOpenIcon, @@ -34,7 +36,6 @@ import { TriangleDownIcon, TriangleLeftIcon, TriangleRightIcon, - DownloadIcon, UpdateIcon, } from '@radix-ui/react-icons'; import classNames from 'classnames'; @@ -50,6 +51,7 @@ const icons = { checkbox: CheckboxIcon, clock: ClockIcon, chevronDown: ChevronDownIcon, + chevronRight: ChevronRightIcon, code: CodeIcon, colorWheel: ColorWheelIcon, copy: CopyIcon,