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 (
{request.method} {request.url}
{latestResponse ? (
) : (