import type { Folder, GrpcRequest, HttpRequest, WebsocketRequest } from '@yaakapp-internal/models'; import { foldersAtom } from '@yaakapp-internal/models'; import classNames from 'classnames'; import { useAtomValue } from 'jotai'; import type { CSSProperties, ReactNode } from 'react'; import { useCallback, useMemo } from 'react'; import { allRequestsAtom } from '../hooks/useAllRequests'; import { useFolderActions } from '../hooks/useFolderActions'; import { useLatestHttpResponse } from '../hooks/useLatestHttpResponse'; import { sendAnyHttpRequest } from '../hooks/useSendAnyHttpRequest'; import { showDialog } from '../lib/dialog'; import { resolvedModelName } from '../lib/resolvedModelName'; import { router } from '../lib/router'; import { Button } from './core/Button'; import { Heading } from './core/Heading'; import { HttpResponseDurationTag } from './core/HttpResponseDurationTag'; import { HttpStatusTag } from './core/HttpStatusTag'; import { Icon } from './core/Icon'; import { IconButton } from './core/IconButton'; import { LoadingIcon } from './core/LoadingIcon'; import { Separator } from './core/Separator'; import { SizeTag } from './core/SizeTag'; import { HStack } from './core/Stacks'; import { HttpResponsePane } from './HttpResponsePane'; interface Props { folder: Folder; style: CSSProperties; } export function FolderLayout({ folder, style }: Props) { const folders = useAtomValue(foldersAtom); const requests = useAtomValue(allRequestsAtom); const folderActions = useFolderActions(); const sendAllAction = useMemo( () => folderActions.find((a) => a.label === 'Send All'), [folderActions], ); const children = useMemo(() => { return [ ...folders.filter((f) => f.folderId === folder.id), ...requests.filter((r) => r.folderId === folder.id), ]; }, [folder.id, folders, requests]); const handleSendAll = useCallback(() => { sendAllAction?.call(folder); }, [sendAllAction, folder]); return (
{resolvedModelName(folder)}
{children.map((child) => ( ))}
); } function ChildCard({ child }: { child: Folder | HttpRequest | GrpcRequest | WebsocketRequest }) { let card: ReactNode; if (child.model === 'folder') { card = ; } else if (child.model === 'http_request') { card = ; } else if (child.model === 'grpc_request') { card = ; } else if (child.model === 'websocket_request') { card = ; } else { card =
Unknown model
; } const navigate = useCallback(async () => { await router.navigate({ to: '/workspaces/$workspaceId', params: { workspaceId: child.workspaceId }, search: (prev) => ({ ...prev, request_id: child.id }), }); }, [child.id, child.workspaceId]); return (
{child.model === 'folder' && } {resolvedModelName(child)} { sendAnyHttpRequest.mutate(child.id); }} />
{card}
); } function FolderCard({ folder }: { folder: Folder }) { return (
); } function RequestCard({ request }: { request: HttpRequest | GrpcRequest | WebsocketRequest }) { return
TODO {request.id}
; } function HttpRequestCard({ request }: { request: HttpRequest }) { const latestResponse = useLatestHttpResponse(request.id); return (
{request.method} {request.url} {latestResponse ? ( ) : (
No Responses
)}
); }