mirror of
https://github.com/usebruno/bruno.git
synced 2026-06-27 22:54:07 +00:00
* Refactor dropdown components to use MenuDropdown for improved functionality and keyboard accessibility - Replaced Dropdown with MenuDropdown in various components including BodyModeSelector, AuthMode, and RequestBodyMode. - Updated styles and structure for better usability and accessibility. - Removed unused Dropdown component and its associated styles. - Enhanced action buttons in ResponsePane and Collection components with ActionIcon for better UI consistency. * fix: Update HttpMethodSelector styles and tests for improved accessibility - Changed the class name for the "Add Custom" button to include 'text-link' for better styling. - Updated tests to use role-based queries for dropdown items, enhancing accessibility checks. - Ensured the correct application of classes in tests to reflect the updated structure. * refactor: Improve component accessibility and consistency * fix: update hover behavior for collection actions menu in runner.ts * refactor: streamline hover interactions for collection actions across tests * refactor: enhance component structure and accessibility across response actions * fix: correct fill property syntax in StyledWrapper for consistent styling * refactor: simplify isDisabled logic in response components for clarity * fix: correct tabIndex logic in ResponseCopy component for improved accessibility * fix: update tabIndex logic in ResponseBookmark component for improved accessibility * fix: enable action buttons in ResponsePaneActions for improved usability * refactor: remove unnecessary tabIndex attributes in response components for improved accessibility * refactor: remove keyDown event handlers from response components for cleaner interaction * refactor: remove SidebarHeader component and related styles for improved structure
153 lines
4.8 KiB
JavaScript
153 lines
4.8 KiB
JavaScript
import React, { useMemo, useCallback } from 'react';
|
|
import { useDispatch, useSelector } from 'react-redux';
|
|
import MenuDropdown from 'ui/MenuDropdown';
|
|
import { newHttpRequest, newGrpcRequest, newWsRequest } from 'providers/ReduxStore/slices/collections/actions';
|
|
import { generateUniqueRequestName } from 'utils/collections';
|
|
import { sanitizeName } from 'utils/common/regex';
|
|
import toast from 'react-hot-toast';
|
|
import { IconApi, IconBrandGraphql, IconPlugConnected, IconCode, IconPlus } from '@tabler/icons';
|
|
import ActionIcon from 'ui/ActionIcon';
|
|
|
|
const CreateUntitledRequest = ({ collectionUid, itemUid = null, onRequestCreated, placement = 'bottom' }) => {
|
|
const dispatch = useDispatch();
|
|
const collections = useSelector((state) => state.collections.collections);
|
|
const collection = collections?.find((c) => c.uid === collectionUid);
|
|
|
|
const handleCreateHttpRequest = useCallback(async () => {
|
|
const uniqueName = await generateUniqueRequestName(collection, 'Untitled', itemUid);
|
|
const filename = sanitizeName(uniqueName);
|
|
|
|
dispatch(
|
|
newHttpRequest({
|
|
requestName: uniqueName,
|
|
filename: filename,
|
|
requestType: 'http-request',
|
|
requestUrl: '',
|
|
requestMethod: 'GET',
|
|
collectionUid: collection.uid,
|
|
itemUid: itemUid
|
|
})
|
|
)
|
|
.then(() => {
|
|
toast.success('New request created!');
|
|
onRequestCreated?.();
|
|
})
|
|
.catch((err) => toast.error(err ? err.message : 'An error occurred while adding the request'));
|
|
}, [dispatch, collection, itemUid, onRequestCreated]);
|
|
|
|
const handleCreateGraphQLRequest = useCallback(async () => {
|
|
const uniqueName = await generateUniqueRequestName(collection, 'Untitled', itemUid);
|
|
const filename = sanitizeName(uniqueName);
|
|
|
|
dispatch(
|
|
newHttpRequest({
|
|
requestName: uniqueName,
|
|
filename: filename,
|
|
requestType: 'graphql-request',
|
|
requestUrl: '',
|
|
requestMethod: 'POST',
|
|
collectionUid: collection.uid,
|
|
itemUid: itemUid,
|
|
body: {
|
|
mode: 'graphql',
|
|
graphql: {
|
|
query: '',
|
|
variables: ''
|
|
}
|
|
}
|
|
})
|
|
)
|
|
.then(() => {
|
|
toast.success('New request created!');
|
|
onRequestCreated?.();
|
|
})
|
|
.catch((err) => toast.error(err ? err.message : 'An error occurred while adding the request'));
|
|
}, [dispatch, collection, itemUid, onRequestCreated]);
|
|
|
|
const handleCreateWebSocketRequest = useCallback(async () => {
|
|
const uniqueName = await generateUniqueRequestName(collection, 'Untitled', itemUid);
|
|
const filename = sanitizeName(uniqueName);
|
|
|
|
dispatch(
|
|
newWsRequest({
|
|
requestName: uniqueName,
|
|
filename: filename,
|
|
requestUrl: '',
|
|
requestMethod: 'ws',
|
|
collectionUid: collection.uid,
|
|
itemUid: itemUid
|
|
})
|
|
)
|
|
.then(() => {
|
|
toast.success('New request created!');
|
|
onRequestCreated?.();
|
|
})
|
|
.catch((err) => toast.error(err ? err.message : 'An error occurred while adding the request'));
|
|
}, [dispatch, collection, itemUid, onRequestCreated]);
|
|
|
|
const handleCreateGrpcRequest = useCallback(async () => {
|
|
const uniqueName = await generateUniqueRequestName(collection, 'Untitled', itemUid);
|
|
const filename = sanitizeName(uniqueName);
|
|
|
|
dispatch(
|
|
newGrpcRequest({
|
|
requestName: uniqueName,
|
|
filename: filename,
|
|
requestUrl: '',
|
|
collectionUid: collection.uid,
|
|
itemUid: itemUid
|
|
})
|
|
)
|
|
.then(() => {
|
|
toast.success('New request created!');
|
|
onRequestCreated?.();
|
|
})
|
|
.catch((err) => toast.error(err ? err.message : 'An error occurred while adding the request'));
|
|
}, [dispatch, collection, itemUid, onRequestCreated]);
|
|
|
|
const menuItems = useMemo(() => [
|
|
{
|
|
id: 'http',
|
|
label: 'HTTP',
|
|
leftSection: <IconApi size={16} strokeWidth={2} />,
|
|
onClick: handleCreateHttpRequest
|
|
},
|
|
{
|
|
id: 'graphql',
|
|
label: 'GraphQL',
|
|
leftSection: <IconBrandGraphql size={16} strokeWidth={2} />,
|
|
onClick: handleCreateGraphQLRequest
|
|
},
|
|
{
|
|
id: 'websocket',
|
|
label: 'WebSocket',
|
|
leftSection: <IconPlugConnected size={16} strokeWidth={2} />,
|
|
onClick: handleCreateWebSocketRequest
|
|
},
|
|
{
|
|
id: 'grpc',
|
|
label: 'gRPC',
|
|
leftSection: <IconCode size={16} strokeWidth={2} />,
|
|
onClick: handleCreateGrpcRequest
|
|
}
|
|
], [handleCreateHttpRequest, handleCreateGraphQLRequest, handleCreateWebSocketRequest, handleCreateGrpcRequest]);
|
|
|
|
if (!collection) {
|
|
return null;
|
|
}
|
|
|
|
return (
|
|
<MenuDropdown
|
|
items={menuItems}
|
|
placement={placement}
|
|
autoFocusFirstOption={true}
|
|
>
|
|
<ActionIcon size="sm">
|
|
<IconPlus size={16} strokeWidth={2} />
|
|
</ActionIcon>
|
|
</MenuDropdown>
|
|
);
|
|
};
|
|
|
|
export default CreateUntitledRequest;
|