Folder chevron icon

This commit is contained in:
Gregory Schier
2023-11-03 23:10:44 -07:00
parent f0e3f29606
commit 5aed4b79be
3 changed files with 34 additions and 18 deletions

View File

@@ -7,6 +7,12 @@
#[macro_use] #[macro_use]
extern crate objc; 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 base64::Engine;
use http::header::{HeaderName, ACCEPT, USER_AGENT}; use http::header::{HeaderName, ACCEPT, USER_AGENT};
use http::{HeaderMap, HeaderValue, Method}; use http::{HeaderMap, HeaderValue, Method};
@@ -17,17 +23,13 @@ use sqlx::migrate::Migrator;
use sqlx::sqlite::SqlitePoolOptions; use sqlx::sqlite::SqlitePoolOptions;
use sqlx::types::Json; use sqlx::types::Json;
use sqlx::{Pool, Sqlite}; 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")] #[cfg(target_os = "macos")]
use tauri::TitleBarStyle; use tauri::TitleBarStyle;
use tauri::{AppHandle, Menu, RunEvent, State, Submenu, Window, WindowUrl, Wry}; use tauri::{AppHandle, Menu, RunEvent, State, Submenu, Window, WindowUrl, Wry};
use tauri::{CustomMenuItem, Manager, WindowEvent}; use tauri::{CustomMenuItem, Manager, WindowEvent};
use tauri_plugin_window_state::{StateFlags, WindowExt}; use tauri_plugin_window_state::{StateFlags, WindowExt};
use tokio::sync::Mutex; use tokio::sync::Mutex;
use window_ext::TrafficLightWindowExt; use window_ext::TrafficLightWindowExt;
mod menu; mod menu;
@@ -881,7 +883,7 @@ fn create_window(handle: &AppHandle<Wry>, url: Option<&str>) -> Window<Wry> {
let win2 = win.clone(); let win2 = win.clone();
let handle2 = handle.clone(); let handle2 = handle.clone();
win.on_menu_event(move |event| match event.menu_item_id() { win.on_menu_event(move |event| match event.menu_item_id() {
"quit" => std::process::exit(0), "quit" => exit(0),
"close" => win2.close().unwrap(), "close" => win2.close().unwrap(),
"zoom_reset" => win2.emit("zoom", 0).unwrap(), "zoom_reset" => win2.emit("zoom", 0).unwrap(),
"zoom_in" => win2.emit("zoom", 1).unwrap(), "zoom_in" => win2.emit("zoom", 1).unwrap(),

View File

@@ -4,26 +4,26 @@ import React, { forwardRef, Fragment, memo, useCallback, useMemo, useRef, useSta
import type { XYCoord } from 'react-dnd'; import type { XYCoord } from 'react-dnd';
import { useDrag, useDrop } from 'react-dnd'; import { useDrag, useDrop } from 'react-dnd';
import { useKey, useKeyPressEvent } from 'react-use'; import { useKey, useKeyPressEvent } from 'react-use';
import { useActiveEnvironmentId } from '../hooks/useActiveEnvironmentId';
import { useActiveRequestId } from '../hooks/useActiveRequestId'; import { useActiveRequestId } from '../hooks/useActiveRequestId';
import { useActiveWorkspace } from '../hooks/useActiveWorkspace';
import { useAppRoutes } from '../hooks/useAppRoutes'; import { useAppRoutes } from '../hooks/useAppRoutes';
import { useCreateRequest } from '../hooks/useCreateRequest';
import { useDeleteAnyRequest } from '../hooks/useDeleteAnyRequest'; import { useDeleteAnyRequest } from '../hooks/useDeleteAnyRequest';
import { useFolders } from '../hooks/useFolders';
import { useLatestResponse } from '../hooks/useLatestResponse'; import { useLatestResponse } from '../hooks/useLatestResponse';
import { useListenToTauriEvent } from '../hooks/useListenToTauriEvent';
import { useRequests } from '../hooks/useRequests'; import { useRequests } from '../hooks/useRequests';
import { useSidebarHidden } from '../hooks/useSidebarHidden'; import { useSidebarHidden } from '../hooks/useSidebarHidden';
import { useListenToTauriEvent } from '../hooks/useListenToTauriEvent'; 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 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 { Icon } from './core/Icon'; import { Icon } from './core/Icon';
import { VStack } from './core/Stacks';
import { StatusTag } from './core/StatusTag'; import { StatusTag } from './core/StatusTag';
import { DropMarker } from './DropMarker'; 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 { interface Props {
className?: string; className?: string;
@@ -402,6 +402,7 @@ function SidebarItems({
onSelect={onSelect} onSelect={onSelect}
onDragStart={handleDragStart} onDragStart={handleDragStart}
useProminentStyles={focused} useProminentStyles={focused}
collapsed={collapsed}
className={classNames(tree.depth > 0 && 'border-l border-highlight ml-5')} className={classNames(tree.depth > 0 && 'border-l border-highlight ml-5')}
> >
{child.item.model === 'folder' && {child.item.model === 'folder' &&
@@ -443,17 +444,20 @@ type SidebarItemProps = {
onSelect: (id: string) => void; onSelect: (id: string) => void;
draggable?: boolean; draggable?: boolean;
children?: ReactNode; children?: ReactNode;
collapsed: Record<string, boolean>;
}; };
const _SidebarItem = forwardRef(function SidebarItem( const SidebarItem = forwardRef(function SidebarItem(
{ {
children, children,
className, className,
itemName, itemName,
itemId, itemId,
itemModel,
useProminentStyles, useProminentStyles,
selected, selected,
onSelect, onSelect,
collapsed,
}: SidebarItemProps, }: SidebarItemProps,
ref: ForwardedRef<HTMLLIElement>, ref: ForwardedRef<HTMLLIElement>,
) { ) {
@@ -493,7 +497,10 @@ const _SidebarItem = forwardRef(function SidebarItem(
[handleSubmitNameEdit], [handleSubmitNameEdit],
); );
const handleStartEditing = useCallback(() => setEditing(true), [setEditing]); const handleStartEditing = useCallback(() => {
if (itemModel !== 'http_request') return;
setEditing(true);
}, [setEditing, itemModel]);
const handleBlur = useCallback( const handleBlur = useCallback(
(e: React.FocusEvent<HTMLInputElement>) => { (e: React.FocusEvent<HTMLInputElement>) => {
@@ -525,6 +532,13 @@ const _SidebarItem = forwardRef(function SidebarItem(
selected && useProminentStyles && '!bg-violet-500/20 text-gray-900', selected && useProminentStyles && '!bg-violet-500/20 text-gray-900',
)} )}
> >
{itemModel === 'folder' && (
<Icon
size="sm"
icon={collapsed[itemId] ? 'chevronRight' : 'chevronDown'}
className="-ml-0.5 mr-2"
/>
)}
{editing ? ( {editing ? (
<input <input
ref={handleFocus} ref={handleFocus}
@@ -554,8 +568,6 @@ const _SidebarItem = forwardRef(function SidebarItem(
); );
}); });
const SidebarItem = memo(_SidebarItem);
type DraggableSidebarItemProps = SidebarItemProps & { type DraggableSidebarItemProps = SidebarItemProps & {
onMove: (id: string, side: 'above' | 'below') => void; onMove: (id: string, side: 'above' | 'below') => void;
onEnd: (id: string) => void; onEnd: (id: string) => void;

View File

@@ -4,6 +4,7 @@ import {
CheckboxIcon, CheckboxIcon,
CheckIcon, CheckIcon,
ChevronDownIcon, ChevronDownIcon,
ChevronRightIcon,
ClockIcon, ClockIcon,
CodeIcon, CodeIcon,
ColorWheelIcon, ColorWheelIcon,
@@ -12,6 +13,7 @@ import {
DividerHorizontalIcon, DividerHorizontalIcon,
DotsHorizontalIcon, DotsHorizontalIcon,
DotsVerticalIcon, DotsVerticalIcon,
DownloadIcon,
DragHandleDots2Icon, DragHandleDots2Icon,
EyeClosedIcon, EyeClosedIcon,
EyeOpenIcon, EyeOpenIcon,
@@ -34,7 +36,6 @@ import {
TriangleDownIcon, TriangleDownIcon,
TriangleLeftIcon, TriangleLeftIcon,
TriangleRightIcon, TriangleRightIcon,
DownloadIcon,
UpdateIcon, UpdateIcon,
} from '@radix-ui/react-icons'; } from '@radix-ui/react-icons';
import classNames from 'classnames'; import classNames from 'classnames';
@@ -50,6 +51,7 @@ const icons = {
checkbox: CheckboxIcon, checkbox: CheckboxIcon,
clock: ClockIcon, clock: ClockIcon,
chevronDown: ChevronDownIcon, chevronDown: ChevronDownIcon,
chevronRight: ChevronRightIcon,
code: CodeIcon, code: CodeIcon,
colorWheel: ColorWheelIcon, colorWheel: ColorWheelIcon,
copy: CopyIcon, copy: CopyIcon,