Send all in a folder

This commit is contained in:
Gregory Schier
2023-11-06 10:53:39 -08:00
parent 0ecb16a2e7
commit bed0e034aa
4 changed files with 41 additions and 12 deletions

View File

@@ -1,6 +1,6 @@
import classNames from 'classnames'; import classNames from 'classnames';
import type { ForwardedRef, ReactNode } from 'react'; import type { ForwardedRef, ReactNode } from 'react';
import React, { forwardRef, Fragment, memo, useCallback, useMemo, useRef, useState } from 'react'; import React, { forwardRef, Fragment, useCallback, useMemo, useRef, useState } from 'react';
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';
@@ -17,6 +17,7 @@ import { useKeyValue } from '../hooks/useKeyValue';
import { useLatestResponse } from '../hooks/useLatestResponse'; import { useLatestResponse } from '../hooks/useLatestResponse';
import { useListenToTauriEvent } from '../hooks/useListenToTauriEvent'; import { useListenToTauriEvent } from '../hooks/useListenToTauriEvent';
import { useRequests } from '../hooks/useRequests'; import { useRequests } from '../hooks/useRequests';
import { useSendAnyRequest } from '../hooks/useSendAnyRequest';
import { useSidebarHidden } from '../hooks/useSidebarHidden'; import { useSidebarHidden } from '../hooks/useSidebarHidden';
import { useUpdateAnyFolder } from '../hooks/useUpdateAnyFolder'; import { useUpdateAnyFolder } from '../hooks/useUpdateAnyFolder';
import { useUpdateAnyRequest } from '../hooks/useUpdateAnyRequest'; import { useUpdateAnyRequest } from '../hooks/useUpdateAnyRequest';
@@ -45,7 +46,7 @@ interface TreeNode {
depth: number; depth: number;
} }
export const Sidebar = memo(function Sidebar({ className }: Props) { export function Sidebar({ className }: Props) {
const { hidden } = useSidebarHidden(); const { hidden } = useSidebarHidden();
const createRequest = useCreateRequest(); const createRequest = useCreateRequest();
const sidebarRef = useRef<HTMLLIElement>(null); const sidebarRef = useRef<HTMLLIElement>(null);
@@ -367,7 +368,7 @@ export const Sidebar = memo(function Sidebar({ className }: Props) {
/> />
</aside> </aside>
); );
}); }
interface SidebarItemsProps { interface SidebarItemsProps {
tree: TreeNode; tree: TreeNode;
@@ -426,6 +427,7 @@ function SidebarItems({
onDragStart={handleDragStart} onDragStart={handleDragStart}
useProminentStyles={focused} useProminentStyles={focused}
collapsed={collapsed} collapsed={collapsed}
child={child}
> >
{child.item.model === 'folder' && {child.item.model === 'folder' &&
!collapsed[child.item.id] && !collapsed[child.item.id] &&
@@ -467,6 +469,7 @@ type SidebarItemProps = {
draggable?: boolean; draggable?: boolean;
children?: ReactNode; children?: ReactNode;
collapsed: Record<string, boolean>; collapsed: Record<string, boolean>;
child: TreeNode;
}; };
const SidebarItem = forwardRef(function SidebarItem( const SidebarItem = forwardRef(function SidebarItem(
@@ -480,9 +483,11 @@ const SidebarItem = forwardRef(function SidebarItem(
selected, selected,
onSelect, onSelect,
collapsed, collapsed,
child,
}: SidebarItemProps, }: SidebarItemProps,
ref: ForwardedRef<HTMLLIElement>, ref: ForwardedRef<HTMLLIElement>,
) { ) {
const sendAnyRequest = useSendAnyRequest();
const createRequest = useCreateRequest(); const createRequest = useCreateRequest();
const createFolder = useCreateFolder(); const createFolder = useCreateFolder();
const deleteRequest = useDeleteFolder(itemId); const deleteRequest = useDeleteFolder(itemId);
@@ -554,6 +559,17 @@ const SidebarItem = forwardRef(function SidebarItem(
label: 'New Folder', label: 'New Folder',
onSelect: () => createFolder.mutate({ folderId: itemId, sortPriority: -1 }), onSelect: () => createFolder.mutate({ folderId: itemId, sortPriority: -1 }),
}, },
{
key: 'sendAll',
label: 'Send All',
onSelect: () => {
for (const { item } of child.children) {
if (item.model === 'http_request') {
sendAnyRequest.mutate(item.id);
}
}
},
},
{ type: 'separator' }, { type: 'separator' },
{ {
key: 'deleteFolder', key: 'deleteFolder',
@@ -631,6 +647,7 @@ type DraggableSidebarItemProps = SidebarItemProps & {
onEnd: (id: string) => void; onEnd: (id: string) => void;
onDragStart: (id: string) => void; onDragStart: (id: string) => void;
children?: ReactNode; children?: ReactNode;
child?: TreeNode;
}; };
type DragItem = { type DragItem = {
@@ -638,10 +655,11 @@ type DragItem = {
itemName: string; itemName: string;
}; };
const DraggableSidebarItem = memo(function DraggableSidebarItem({ function DraggableSidebarItem({
itemName, itemName,
itemId, itemId,
itemModel, itemModel,
child,
onMove, onMove,
onEnd, onEnd,
onDragStart, onDragStart,
@@ -688,7 +706,8 @@ const DraggableSidebarItem = memo(function DraggableSidebarItem({
itemName={itemName} itemName={itemName}
itemId={itemId} itemId={itemId}
itemModel={itemModel} itemModel={itemModel}
child={child}
{...props} {...props}
/> />
); );
}); }

View File

@@ -3,9 +3,9 @@ import type { EditorView } from 'codemirror';
import type { FormEvent } from 'react'; import type { FormEvent } from 'react';
import { memo, useCallback, useRef, useState } from 'react'; import { memo, useCallback, useRef, useState } from 'react';
import { useIsResponseLoading } from '../hooks/useIsResponseLoading'; import { useIsResponseLoading } from '../hooks/useIsResponseLoading';
import { useListenToTauriEvent } from '../hooks/useListenToTauriEvent';
import { useRequestUpdateKey } from '../hooks/useRequestUpdateKey'; import { useRequestUpdateKey } from '../hooks/useRequestUpdateKey';
import { useSendRequest } from '../hooks/useSendRequest'; import { useSendRequest } from '../hooks/useSendRequest';
import { useListenToTauriEvent } from '../hooks/useListenToTauriEvent';
import { useUpdateRequest } from '../hooks/useUpdateRequest'; import { useUpdateRequest } from '../hooks/useUpdateRequest';
import type { HttpRequest } from '../lib/models'; import type { HttpRequest } from '../lib/models';
import { IconButton } from './core/IconButton'; import { IconButton } from './core/IconButton';
@@ -35,7 +35,7 @@ export const UrlBar = memo(function UrlBar({ id: requestId, url, method, classNa
const handleSubmit = useCallback( const handleSubmit = useCallback(
async (e: FormEvent) => { async (e: FormEvent) => {
e.preventDefault(); e.preventDefault();
sendRequest(); sendRequest.mutate();
}, },
[sendRequest], [sendRequest],
); );

View File

@@ -0,0 +1,11 @@
import { useMutation } from '@tanstack/react-query';
import { invoke } from '@tauri-apps/api';
import type { HttpResponse } from '../lib/models';
import { useActiveEnvironmentId } from './useActiveEnvironmentId';
export function useSendAnyRequest() {
const environmentId = useActiveEnvironmentId();
return useMutation<HttpResponse, string, string | null>({
mutationFn: (id) => invoke('send_request', { requestId: id, environmentId }),
});
}

View File

@@ -1,11 +1,10 @@
import { useMutation } from '@tanstack/react-query'; import { useMutation } from '@tanstack/react-query';
import { invoke } from '@tauri-apps/api';
import type { HttpResponse } from '../lib/models'; import type { HttpResponse } from '../lib/models';
import { useActiveEnvironmentId } from './useActiveEnvironmentId'; import { useSendAnyRequest } from './useSendAnyRequest';
export function useSendRequest(id: string | null) { export function useSendRequest(id: string | null) {
const environmentId = useActiveEnvironmentId(); const sendAnyRequest = useSendAnyRequest();
return useMutation<HttpResponse, string>({ return useMutation<HttpResponse, string>({
mutationFn: () => invoke('send_request', { requestId: id, environmentId }), mutationFn: () => sendAnyRequest.mutateAsync(id),
}).mutate; });
} }