Better HTTP methods

This commit is contained in:
Gregory Schier
2025-01-27 07:59:00 -08:00
parent 662c38d7a0
commit 229d9c1bd6
5 changed files with 28 additions and 34 deletions

View File

@@ -19,7 +19,7 @@ interface Props {
export function HttpAuthenticationEditor({ request }: Props) { export function HttpAuthenticationEditor({ request }: Props) {
const updateHttpRequest = useUpdateAnyHttpRequest(); const updateHttpRequest = useUpdateAnyHttpRequest();
const updateGrpcRequest = useUpdateAnyGrpcRequest(); const updateGrpcRequest = useUpdateAnyGrpcRequest();
const auth = useHttpAuthenticationConfig( const authConfig = useHttpAuthenticationConfig(
request.authenticationType, request.authenticationType,
request.authentication, request.authentication,
request.id, request.id,
@@ -43,7 +43,7 @@ export function HttpAuthenticationEditor({ request }: Props) {
[request.id, request.model, updateGrpcRequest, updateHttpRequest], [request.id, request.model, updateGrpcRequest, updateHttpRequest],
); );
if (auth.data == null) { if (authConfig.data == null) {
return <EmptyStateText>No Authentication {request.authenticationType}</EmptyStateText>; return <EmptyStateText>No Authentication {request.authenticationType}</EmptyStateText>;
} }
@@ -56,9 +56,9 @@ export function HttpAuthenticationEditor({ request }: Props) {
onChange={(disabled) => handleChange({ ...request.authentication, disabled: !disabled })} onChange={(disabled) => handleChange({ ...request.authentication, disabled: !disabled })}
title="Enabled" title="Enabled"
/> />
{auth.data.actions && ( {authConfig.data.actions && (
<Dropdown <Dropdown
items={auth.data.actions.map( items={authConfig.data.actions.map(
(a): DropdownItem => ({ (a): DropdownItem => ({
label: a.label, label: a.label,
leftSlot: a.icon ? <Icon icon={a.icon} /> : null, leftSlot: a.icon ? <Icon icon={a.icon} /> : null,
@@ -75,7 +75,7 @@ export function HttpAuthenticationEditor({ request }: Props) {
autocompleteVariables autocompleteVariables
useTemplating useTemplating
stateKey={`auth.${request.id}.${request.authenticationType}`} stateKey={`auth.${request.id}.${request.authenticationType}`}
inputs={auth.data.args} inputs={authConfig.data.args}
data={request.authentication} data={request.authentication}
onChange={handleChange} onChange={handleChange}
/> />

View File

@@ -59,8 +59,7 @@ export function RecentRequestsDropdown({ className }: Props) {
recentRequestItems.push({ recentRequestItems.push({
label: fallbackRequestName(request), label: fallbackRequestName(request),
// leftSlot: <CountBadge className="!ml-0 px-0 w-5" count={recentRequestItems.length} />, leftSlot: <HttpMethodTag request={request} />,
leftSlot: <HttpMethodTag className="text-right" shortNames request={request} />,
onSelect: async () => { onSelect: async () => {
await router.navigate({ await router.navigate({
to: '/workspaces/$workspaceId', to: '/workspaces/$workspaceId',

View File

@@ -217,7 +217,6 @@ export const SidebarItem = memo(function SidebarItem({
const itemPrefix = (item.model === 'http_request' || item.model === 'grpc_request') && ( const itemPrefix = (item.model === 'http_request' || item.model === 'grpc_request') && (
<HttpMethodTag <HttpMethodTag
shortNames
request={item} request={item}
className={classNames(!(active || selected) && 'text-text-subtlest')} className={classNames(!(active || selected) && 'text-text-subtlest')}
/> />
@@ -272,7 +271,7 @@ export const SidebarItem = memo(function SidebarItem({
onKeyDown={handleInputKeyDown} onKeyDown={handleInputKeyDown}
/> />
) : ( ) : (
<span className="truncate w-full">{itemName}</span> <div className="truncate w-full">{itemName}</div>
)} )}
</div> </div>
{latestGrpcConnection ? ( {latestGrpcConnection ? (

View File

@@ -1,5 +1,5 @@
import classNames from 'classnames';
import type { GrpcRequest, HttpRequest } from '@yaakapp-internal/models'; import type { GrpcRequest, HttpRequest } from '@yaakapp-internal/models';
import classNames from 'classnames';
interface Props { interface Props {
request: HttpRequest | GrpcRequest; request: HttpRequest | GrpcRequest;
@@ -7,46 +7,34 @@ interface Props {
shortNames?: boolean; shortNames?: boolean;
} }
const longMethodMap = { const methodNames: Record<string, string> = {
get: 'GET', get: ' GET',
put: 'PUT', put: ' PUT',
post: 'POST', post: 'POST',
patch: 'PATCH', patch: 'PTCH',
delete: 'DELETE', delete: 'DELE',
options: 'OPTIONS', options: 'OPTN',
head: 'HEAD', head: 'HEAD',
} as const; query: 'QURY',
const shortMethodMap: Record<keyof typeof longMethodMap, string> = {
get: 'GET',
put: 'PUT',
post: 'PST',
patch: 'PTC',
delete: 'DEL',
options: 'OPT',
head: 'HED',
}; };
export function HttpMethodTag({ shortNames, request, className }: Props) { export function HttpMethodTag({ request, className }: Props) {
const method = const method =
request.model === 'http_request' && request.bodyType === 'graphql' request.model === 'http_request' && request.bodyType === 'graphql'
? 'GQL' ? 'GQL'
: request.model === 'grpc_request' : request.model === 'grpc_request'
? 'GRP' ? 'GRPC'
: request.method; : request.method;
const m = method.toLowerCase();
const methodMap: Record<string, string> = shortNames ? shortMethodMap : longMethodMap;
return ( return (
<span <span
className={classNames( className={classNames(
className, className,
'text-xs font-mono text-text-subtle', 'text-xs font-mono text-text-subtle flex-shrink-0 whitespace-pre',
'pt-[0.25em]', // Fix for monospace font not vertically centering 'pt-[0.25em]', // Fix for monospace font not vertically centering
shortNames && 'w-[2.5em]',
)} )}
> >
{methodMap[m] ?? m.slice(0, 4).toUpperCase()} {(methodNames[method.toLowerCase()] ?? method.slice(0, 4)).toUpperCase()}
</span> </span>
); );
} }

View File

@@ -24,9 +24,17 @@ export function useHttpAuthenticationConfig(
); );
return useQuery({ return useQuery({
queryKey: ['http_authentication_config', requestId, authName, values, responseKey, forceRefreshCounter], queryKey: [
'http_authentication_config',
requestId,
authName,
values,
responseKey,
forceRefreshCounter,
],
placeholderData: (prev) => prev, // Keep previous data on refetch placeholderData: (prev) => prev, // Keep previous data on refetch
queryFn: async () => { queryFn: async () => {
if (authName == null) return null;
const config = await invokeCmd<GetHttpAuthenticationConfigResponse>( const config = await invokeCmd<GetHttpAuthenticationConfigResponse>(
'cmd_get_http_authentication_config', 'cmd_get_http_authentication_config',
{ {