import classnames from 'classnames'; import React, { useRef, useState } from 'react'; import { useActiveRequest } from '../hooks/useActiveRequest'; import { useCreateRequest } from '../hooks/useCreateRequest'; import { useDeleteRequest } from '../hooks/useDeleteRequest'; import { useKeyValues } from '../hooks/useKeyValues'; import { useRequests } from '../hooks/useRequests'; import { useTheme } from '../hooks/useTheme'; import { useUpdateRequest } from '../hooks/useUpdateRequest'; import type { HttpRequest } from '../lib/models'; import { Button } from './core/Button'; import { Dropdown, DropdownMenuTrigger } from './core/Dropdown'; import { Icon } from './core/Icon'; import { IconButton } from './core/IconButton'; import { HStack, VStack } from './core/Stacks'; import { WindowDragRegion } from './core/WindowDragRegion'; interface Props { className?: string; } const MIN_WIDTH = 130; export function Sidebar({ className }: Props) { const [isDragging, setIsDragging] = useState(false); const width = useKeyValues({ key: 'sidebar_width', initialValue: 200 }); const requests = useRequests(); const activeRequest = useActiveRequest(); const createRequest = useCreateRequest({ navigateAfter: true }); const { appearance, toggleAppearance } = useTheme(); const moveState = useRef<{ move: (e: MouseEvent) => void; up: () => void } | null>(null); const unsub = () => { if (moveState.current !== null) { document.documentElement.removeEventListener('mousemove', moveState.current.move); document.documentElement.removeEventListener('mouseup', moveState.current.up); } }; const handleResizeStart = (e: React.MouseEvent) => { unsub(); const mouseStartX = e.clientX; const startWidth = width.value; moveState.current = { move: (e: MouseEvent) => { const newWidth = Math.max(MIN_WIDTH, startWidth + (e.clientX - mouseStartX)); width.set(newWidth); }, up: () => { unsub(); setIsDragging(false); }, }; document.documentElement.addEventListener('mousemove', moveState.current.move); document.documentElement.addEventListener('mouseup', moveState.current.up); setIsDragging(true); }; return (
{/* eslint-disable-next-line jsx-a11y/no-noninteractive-element-interactions */}
{ await createRequest.mutate({ name: 'Test Request' }); }} /> {requests.map((r) => ( ))} {/**/}
); } function SidebarItem({ request, active }: { request: HttpRequest; active: boolean }) { const deleteRequest = useDeleteRequest(request); const updateRequest = useUpdateRequest(request); const [editing, setEditing] = useState(false); const handleSubmitNameEdit = async (el: HTMLInputElement) => { await updateRequest.mutate({ name: el.value }); setEditing(false); }; const handleFocus = (el: HTMLInputElement | null) => { el?.focus(); el?.select(); }; return (
  • , }, ]} >
  • ); }