diff --git a/packages/plugin-runtime-types/src/plugins/Context.ts b/packages/plugin-runtime-types/src/plugins/Context.ts index 5a481b04..b03b6fd2 100644 --- a/packages/plugin-runtime-types/src/plugins/Context.ts +++ b/packages/plugin-runtime-types/src/plugins/Context.ts @@ -17,8 +17,8 @@ import type { SendHttpRequestResponse, ShowToastRequest, TemplateRenderRequest, - TemplateRenderResponse, } from '../bindings/gen_events.ts'; +import { JsonValue } from '../bindings/serde_json/JsonValue'; export interface Context { clipboard: { @@ -59,6 +59,6 @@ export interface Context { find(args: FindHttpResponsesRequest): Promise; }; templates: { - render(args: TemplateRenderRequest): Promise; + render(args: TemplateRenderRequest & { data: T }): Promise; }; } diff --git a/plugins/template-function-request/src/index.ts b/plugins/template-function-request/src/index.ts index df5d2ac9..28814558 100755 --- a/plugins/template-function-request/src/index.ts +++ b/plugins/template-function-request/src/index.ts @@ -1,3 +1,4 @@ +import type { HttpUrlParameter } from '@yaakapp-internal/models'; import type { CallTemplateFunctionArgs, Context, PluginDefinition } from '@yaakapp/api'; export const plugin: PluginDefinition = { @@ -53,5 +54,47 @@ export const plugin: PluginDefinition = { ); }, }, + { + name: 'request.param', + args: [ + { + name: 'requestId', + label: 'Http Request', + type: 'http_request', + }, + { + name: 'param', + label: 'Param Name', + type: 'text', + }, + ], + async onRender(ctx: Context, args: CallTemplateFunctionArgs): Promise { + const paramName = String(args.values.param ?? ''); + const requestId = String(args.values.requestId ?? 'n/a'); + const httpRequest = await ctx.httpRequest.getById({ id: requestId }); + if (httpRequest == null) return null; + + const renderedUrl = await ctx.templates.render({ + data: httpRequest.url, + purpose: args.purpose, + }); + + const querystring = renderedUrl.split('?')[1] ?? ''; + const paramsFromUrl: HttpUrlParameter[] = new URLSearchParams(querystring) + .entries() + .map(([name, value]): HttpUrlParameter => ({ name, value })) + .toArray(); + + const allParams = [...paramsFromUrl, ...httpRequest.urlParameters]; + const allEnabledParams = allParams.filter((p) => p.enabled !== false); + const foundParam = allEnabledParams.find((p) => p.name === paramName); + + const renderedValue = await ctx.templates.render({ + data: foundParam?.value ?? '', + purpose: args.purpose, + }); + return renderedValue; + }, + }, ], }; diff --git a/src-web/components/DynamicForm.tsx b/src-web/components/DynamicForm.tsx index 29b17c46..fe46a23a 100644 --- a/src-web/components/DynamicForm.tsx +++ b/src-web/components/DynamicForm.tsx @@ -12,7 +12,7 @@ import type { } from '@yaakapp-internal/plugins'; import classNames from 'classnames'; import { useAtomValue } from 'jotai'; -import { useCallback } from 'react'; +import { useCallback, useEffect } from 'react'; import { useActiveRequest } from '../hooks/useActiveRequest'; import { useRandomKey } from '../hooks/useRandomKey'; import { capitalize } from '../lib/capitalize'; @@ -415,7 +415,7 @@ function FileArg({ disabled={arg.disabled} help={arg.description} onChange={({ filePath }) => onChange(filePath)} - filePath={filePath === '__NULL__' ? null : filePath} + filePath={filePath === DYNAMIC_FORM_NULL_ARG ? null : filePath} directory={!!arg.directory} /> ); @@ -432,7 +432,14 @@ function HttpRequestArg({ }) { const folders = useAtomValue(foldersAtom); const httpRequests = useAtomValue(httpRequestsAtom); - const activeRequest = useActiveRequest(); + const activeHttpRequest = useActiveRequest('http_request'); + + useEffect(() => { + if (value === DYNAMIC_FORM_NULL_ARG && activeHttpRequest) { + onChange(activeHttpRequest.id); + } + }, [activeHttpRequest, onChange, value]); + return (