diff --git a/packages/plugin-runtime-types/src/bindings/gen_events.ts b/packages/plugin-runtime-types/src/bindings/gen_events.ts index 3af7dc76..79d5de19 100644 --- a/packages/plugin-runtime-types/src/bindings/gen_events.ts +++ b/packages/plugin-runtime-types/src/bindings/gen_events.ts @@ -4,6 +4,10 @@ import type { JsonValue } from "./serde_json/JsonValue"; export type BootRequest = { dir: string, watch: boolean, }; +export type CallFolderActionArgs = { folder: Folder, }; + +export type CallFolderActionRequest = { index: number, pluginRefId: string, args: CallFolderActionArgs, }; + export type CallGrpcRequestActionArgs = { grpcRequest: GrpcRequest, protoFiles: Array, }; export type CallGrpcRequestActionRequest = { index: number, pluginRefId: string, args: CallGrpcRequestActionArgs, }; @@ -26,10 +30,6 @@ setHeaders?: Array, */ setQueryParameters?: Array, }; -export type CallHttpCollectionActionArgs = { folder?: Folder, workspace?: Workspace, }; - -export type CallHttpCollectionActionRequest = { index: number, pluginRefId: string, args: CallHttpCollectionActionArgs, }; - export type CallHttpRequestActionArgs = { httpRequest: HttpRequest, }; export type CallHttpRequestActionRequest = { index: number, pluginRefId: string, args: CallHttpRequestActionArgs, }; @@ -40,6 +40,14 @@ export type CallTemplateFunctionRequest = { name: string, args: CallTemplateFunc export type CallTemplateFunctionResponse = { value: string | null, error?: string, }; +export type CallWebSocketRequestActionArgs = { websocketRequest: WebsocketRequest, }; + +export type CallWebSocketRequestActionRequest = { index: number, pluginRefId: string, args: CallWebSocketRequestActionArgs, }; + +export type CallWorkspaceActionArgs = { workspace: Workspace, }; + +export type CallWorkspaceActionRequest = { index: number, pluginRefId: string, args: CallWorkspaceActionArgs, }; + export type CloseWindowRequest = { label: string, }; export type Color = "primary" | "secondary" | "info" | "success" | "notice" | "warning" | "danger"; @@ -78,6 +86,8 @@ export type FindHttpResponsesRequest = { requestId: string, limit?: number, }; export type FindHttpResponsesResponse = { httpResponses: Array, }; +export type FolderAction = { label: string, icon?: Icon, }; + export type FormInput = { "type": "text" } & FormInputText | { "type": "editor" } & FormInputEditor | { "type": "select" } & FormInputSelect | { "type": "checkbox" } & FormInputCheckbox | { "type": "file" } & FormInputFile | { "type": "http_request" } & FormInputHttpRequest | { "type": "accordion" } & FormInputAccordion | { "type": "h_stack" } & FormInputHStack | { "type": "banner" } & FormInputBanner | { "type": "markdown" } & FormInputMarkdown; export type FormInputAccordion = { label: string, inputs?: Array, hidden?: boolean, }; @@ -349,6 +359,8 @@ export type GetCookieValueRequest = { name: string, }; export type GetCookieValueResponse = { value: string | null, }; +export type GetFolderActionsResponse = { actions: Array, pluginRefId: string, }; + export type GetGrpcRequestActionsResponse = { actions: Array, pluginRefId: string, }; export type GetHttpAuthenticationConfigRequest = { contextId: string, values: { [key in string]?: JsonPrimitive }, }; @@ -357,8 +369,6 @@ export type GetHttpAuthenticationConfigResponse = { args: Array, plug export type GetHttpAuthenticationSummaryResponse = { name: string, label: string, shortLabel: string, }; -export type GetHttpCollectionActionsResponse = { actions: Array, pluginRefId: string, }; - export type GetHttpRequestActionsResponse = { actions: Array, pluginRefId: string, }; export type GetHttpRequestByIdRequest = { id: string, }; @@ -379,12 +389,14 @@ export type GetThemesRequest = Record; export type GetThemesResponse = { themes: Array, }; +export type GetWebSocketRequestActionsResponse = { actions: Array, pluginRefId: string, }; + +export type GetWorkspaceActionsResponse = { actions: Array, pluginRefId: string, }; + export type GrpcRequestAction = { label: string, icon?: Icon, }; export type HttpAuthenticationAction = { label: string, icon?: Icon, }; -export type HttpCollectionAction = { label: string, icon?: Icon, }; - export type HttpHeader = { name: string, value: string, }; export type HttpRequestAction = { label: string, icon?: Icon, }; @@ -399,7 +411,7 @@ export type ImportResponse = { resources: ImportResources, }; export type InternalEvent = { id: string, pluginRefId: string, pluginName: string, replyId: string | null, context: PluginContext, payload: InternalEventPayload, }; -export type InternalEventPayload = { "type": "boot_request" } & BootRequest | { "type": "boot_response" } | { "type": "reload_response" } & ReloadResponse | { "type": "terminate_request" } | { "type": "terminate_response" } | { "type": "import_request" } & ImportRequest | { "type": "import_response" } & ImportResponse | { "type": "filter_request" } & FilterRequest | { "type": "filter_response" } & FilterResponse | { "type": "export_http_request_request" } & ExportHttpRequestRequest | { "type": "export_http_request_response" } & ExportHttpRequestResponse | { "type": "send_http_request_request" } & SendHttpRequestRequest | { "type": "send_http_request_response" } & SendHttpRequestResponse | { "type": "list_cookie_names_request" } & ListCookieNamesRequest | { "type": "list_cookie_names_response" } & ListCookieNamesResponse | { "type": "get_cookie_value_request" } & GetCookieValueRequest | { "type": "get_cookie_value_response" } & GetCookieValueResponse | { "type": "get_http_request_actions_request" } & EmptyPayload | { "type": "get_http_request_actions_response" } & GetHttpRequestActionsResponse | { "type": "call_http_request_action_request" } & CallHttpRequestActionRequest | { "type": "get_http_collection_actions_request" } & EmptyPayload | { "type": "get_http_collection_actions_response" } & GetHttpCollectionActionsResponse | { "type": "call_http_collection_action_request" } & CallHttpCollectionActionRequest | { "type": "get_grpc_request_actions_request" } & EmptyPayload | { "type": "get_grpc_request_actions_response" } & GetGrpcRequestActionsResponse | { "type": "call_grpc_request_action_request" } & CallGrpcRequestActionRequest | { "type": "get_template_function_summary_request" } & EmptyPayload | { "type": "get_template_function_summary_response" } & GetTemplateFunctionSummaryResponse | { "type": "get_template_function_config_request" } & GetTemplateFunctionConfigRequest | { "type": "get_template_function_config_response" } & GetTemplateFunctionConfigResponse | { "type": "call_template_function_request" } & CallTemplateFunctionRequest | { "type": "call_template_function_response" } & CallTemplateFunctionResponse | { "type": "get_http_authentication_summary_request" } & EmptyPayload | { "type": "get_http_authentication_summary_response" } & GetHttpAuthenticationSummaryResponse | { "type": "get_http_authentication_config_request" } & GetHttpAuthenticationConfigRequest | { "type": "get_http_authentication_config_response" } & GetHttpAuthenticationConfigResponse | { "type": "call_http_authentication_request" } & CallHttpAuthenticationRequest | { "type": "call_http_authentication_response" } & CallHttpAuthenticationResponse | { "type": "call_http_authentication_action_request" } & CallHttpAuthenticationActionRequest | { "type": "call_http_authentication_action_response" } & EmptyPayload | { "type": "copy_text_request" } & CopyTextRequest | { "type": "copy_text_response" } & EmptyPayload | { "type": "render_http_request_request" } & RenderHttpRequestRequest | { "type": "render_http_request_response" } & RenderHttpRequestResponse | { "type": "render_grpc_request_request" } & RenderGrpcRequestRequest | { "type": "render_grpc_request_response" } & RenderGrpcRequestResponse | { "type": "template_render_request" } & TemplateRenderRequest | { "type": "template_render_response" } & TemplateRenderResponse | { "type": "get_key_value_request" } & GetKeyValueRequest | { "type": "get_key_value_response" } & GetKeyValueResponse | { "type": "set_key_value_request" } & SetKeyValueRequest | { "type": "set_key_value_response" } & SetKeyValueResponse | { "type": "delete_key_value_request" } & DeleteKeyValueRequest | { "type": "delete_key_value_response" } & DeleteKeyValueResponse | { "type": "open_window_request" } & OpenWindowRequest | { "type": "window_navigate_event" } & WindowNavigateEvent | { "type": "window_close_event" } | { "type": "close_window_request" } & CloseWindowRequest | { "type": "show_toast_request" } & ShowToastRequest | { "type": "show_toast_response" } & EmptyPayload | { "type": "prompt_text_request" } & PromptTextRequest | { "type": "prompt_text_response" } & PromptTextResponse | { "type": "window_info_request" } & WindowInfoRequest | { "type": "window_info_response" } & WindowInfoResponse | { "type": "get_http_request_by_id_request" } & GetHttpRequestByIdRequest | { "type": "get_http_request_by_id_response" } & GetHttpRequestByIdResponse | { "type": "find_http_responses_request" } & FindHttpResponsesRequest | { "type": "find_http_responses_response" } & FindHttpResponsesResponse | { "type": "list_http_requests_request" } & ListHttpRequestsRequest | { "type": "list_http_requests_response" } & ListHttpRequestsResponse | { "type": "list_folders_request" } & ListFoldersRequest | { "type": "list_folders_response" } & ListFoldersResponse | { "type": "get_themes_request" } & GetThemesRequest | { "type": "get_themes_response" } & GetThemesResponse | { "type": "empty_response" } & EmptyPayload | { "type": "error_response" } & ErrorResponse; +export type InternalEventPayload = { "type": "boot_request" } & BootRequest | { "type": "boot_response" } | { "type": "reload_response" } & ReloadResponse | { "type": "terminate_request" } | { "type": "terminate_response" } | { "type": "import_request" } & ImportRequest | { "type": "import_response" } & ImportResponse | { "type": "filter_request" } & FilterRequest | { "type": "filter_response" } & FilterResponse | { "type": "export_http_request_request" } & ExportHttpRequestRequest | { "type": "export_http_request_response" } & ExportHttpRequestResponse | { "type": "send_http_request_request" } & SendHttpRequestRequest | { "type": "send_http_request_response" } & SendHttpRequestResponse | { "type": "list_cookie_names_request" } & ListCookieNamesRequest | { "type": "list_cookie_names_response" } & ListCookieNamesResponse | { "type": "get_cookie_value_request" } & GetCookieValueRequest | { "type": "get_cookie_value_response" } & GetCookieValueResponse | { "type": "get_http_request_actions_request" } & EmptyPayload | { "type": "get_http_request_actions_response" } & GetHttpRequestActionsResponse | { "type": "call_http_request_action_request" } & CallHttpRequestActionRequest | { "type": "get_web_socket_request_actions_request" } & EmptyPayload | { "type": "get_web_socket_request_actions_response" } & GetWebSocketRequestActionsResponse | { "type": "call_web_socket_request_action_request" } & CallWebSocketRequestActionRequest | { "type": "get_workspace_actions_request" } & EmptyPayload | { "type": "get_workspace_actions_response" } & GetWorkspaceActionsResponse | { "type": "call_workspace_action_request" } & CallWorkspaceActionRequest | { "type": "get_folder_actions_request" } & EmptyPayload | { "type": "get_folder_actions_response" } & GetFolderActionsResponse | { "type": "call_folder_action_request" } & CallFolderActionRequest | { "type": "get_grpc_request_actions_request" } & EmptyPayload | { "type": "get_grpc_request_actions_response" } & GetGrpcRequestActionsResponse | { "type": "call_grpc_request_action_request" } & CallGrpcRequestActionRequest | { "type": "get_template_function_summary_request" } & EmptyPayload | { "type": "get_template_function_summary_response" } & GetTemplateFunctionSummaryResponse | { "type": "get_template_function_config_request" } & GetTemplateFunctionConfigRequest | { "type": "get_template_function_config_response" } & GetTemplateFunctionConfigResponse | { "type": "call_template_function_request" } & CallTemplateFunctionRequest | { "type": "call_template_function_response" } & CallTemplateFunctionResponse | { "type": "get_http_authentication_summary_request" } & EmptyPayload | { "type": "get_http_authentication_summary_response" } & GetHttpAuthenticationSummaryResponse | { "type": "get_http_authentication_config_request" } & GetHttpAuthenticationConfigRequest | { "type": "get_http_authentication_config_response" } & GetHttpAuthenticationConfigResponse | { "type": "call_http_authentication_request" } & CallHttpAuthenticationRequest | { "type": "call_http_authentication_response" } & CallHttpAuthenticationResponse | { "type": "call_http_authentication_action_request" } & CallHttpAuthenticationActionRequest | { "type": "call_http_authentication_action_response" } & EmptyPayload | { "type": "copy_text_request" } & CopyTextRequest | { "type": "copy_text_response" } & EmptyPayload | { "type": "render_http_request_request" } & RenderHttpRequestRequest | { "type": "render_http_request_response" } & RenderHttpRequestResponse | { "type": "render_grpc_request_request" } & RenderGrpcRequestRequest | { "type": "render_grpc_request_response" } & RenderGrpcRequestResponse | { "type": "template_render_request" } & TemplateRenderRequest | { "type": "template_render_response" } & TemplateRenderResponse | { "type": "get_key_value_request" } & GetKeyValueRequest | { "type": "get_key_value_response" } & GetKeyValueResponse | { "type": "set_key_value_request" } & SetKeyValueRequest | { "type": "set_key_value_response" } & SetKeyValueResponse | { "type": "delete_key_value_request" } & DeleteKeyValueRequest | { "type": "delete_key_value_response" } & DeleteKeyValueResponse | { "type": "open_window_request" } & OpenWindowRequest | { "type": "window_navigate_event" } & WindowNavigateEvent | { "type": "window_close_event" } | { "type": "close_window_request" } & CloseWindowRequest | { "type": "show_toast_request" } & ShowToastRequest | { "type": "show_toast_response" } & EmptyPayload | { "type": "prompt_text_request" } & PromptTextRequest | { "type": "prompt_text_response" } & PromptTextResponse | { "type": "window_info_request" } & WindowInfoRequest | { "type": "window_info_response" } & WindowInfoResponse | { "type": "get_http_request_by_id_request" } & GetHttpRequestByIdRequest | { "type": "get_http_request_by_id_response" } & GetHttpRequestByIdResponse | { "type": "find_http_responses_request" } & FindHttpResponsesRequest | { "type": "find_http_responses_response" } & FindHttpResponsesResponse | { "type": "list_http_requests_request" } & ListHttpRequestsRequest | { "type": "list_http_requests_response" } & ListHttpRequestsResponse | { "type": "list_folders_request" } & ListFoldersRequest | { "type": "list_folders_response" } & ListFoldersResponse | { "type": "get_themes_request" } & GetThemesRequest | { "type": "get_themes_response" } & GetThemesResponse | { "type": "empty_response" } & EmptyPayload | { "type": "error_response" } & ErrorResponse; export type JsonPrimitive = string | number | boolean | null; @@ -509,6 +521,8 @@ export type ThemeComponentColors = { surface?: string, surfaceHighlight?: string export type ThemeComponents = { dialog?: ThemeComponentColors, menu?: ThemeComponentColors, toast?: ThemeComponentColors, sidebar?: ThemeComponentColors, responsePane?: ThemeComponentColors, appHeader?: ThemeComponentColors, button?: ThemeComponentColors, banner?: ThemeComponentColors, templateTag?: ThemeComponentColors, urlBar?: ThemeComponentColors, editor?: ThemeComponentColors, input?: ThemeComponentColors, }; +export type WebSocketRequestAction = { label: string, icon?: Icon, }; + export type WindowInfoRequest = { label: string, }; export type WindowInfoResponse = { requestId: string | null, environmentId: string | null, workspaceId: string | null, label: string, }; @@ -516,3 +530,5 @@ export type WindowInfoResponse = { requestId: string | null, environmentId: stri export type WindowNavigateEvent = { url: string, }; export type WindowSize = { width: number, height: number, }; + +export type WorkspaceAction = { label: string, icon?: Icon, }; diff --git a/packages/plugin-runtime-types/src/plugins/FolderActionPlugin.ts b/packages/plugin-runtime-types/src/plugins/FolderActionPlugin.ts new file mode 100644 index 00000000..165c1840 --- /dev/null +++ b/packages/plugin-runtime-types/src/plugins/FolderActionPlugin.ts @@ -0,0 +1,11 @@ +import type { Context } from './Context'; +import type { Folder } from '../bindings/gen_models'; +import type { Icon } from '../bindings/gen_events'; + +export type FolderAction = { label: string; icon?: Icon }; + +export type CallFolderActionArgs = { folder: Folder }; + +export type FolderActionPlugin = FolderAction & { + onSelect(ctx: Context, args: CallFolderActionArgs): Promise | void; +}; diff --git a/packages/plugin-runtime-types/src/plugins/HttpCollectionActionPlugin.ts b/packages/plugin-runtime-types/src/plugins/HttpCollectionActionPlugin.ts deleted file mode 100644 index b734e14f..00000000 --- a/packages/plugin-runtime-types/src/plugins/HttpCollectionActionPlugin.ts +++ /dev/null @@ -1,11 +0,0 @@ -import type { Context } from './Context'; -import type { Folder, Workspace } from '../bindings/gen_models'; -import type { Icon } from '../bindings/gen_events'; - -export type HttpCollectionAction = { label: string; icon?: Icon }; - -export type CallHttpCollectionActionArgs = { folder?: Folder; workspace?: Workspace }; - -export type HttpCollectionActionPlugin = HttpCollectionAction & { - onSelect(ctx: Context, args: CallHttpCollectionActionArgs): Promise | void; -}; diff --git a/packages/plugin-runtime-types/src/plugins/WebSocketRequestActionPlugin.ts b/packages/plugin-runtime-types/src/plugins/WebSocketRequestActionPlugin.ts new file mode 100644 index 00000000..b619ba15 --- /dev/null +++ b/packages/plugin-runtime-types/src/plugins/WebSocketRequestActionPlugin.ts @@ -0,0 +1,6 @@ +import type { CallWebSocketRequestActionArgs, WebSocketRequestAction } from '../bindings/gen_events'; +import type { Context } from './Context'; + +export type WebSocketRequestActionPlugin = WebSocketRequestAction & { + onSelect(ctx: Context, args: CallWebSocketRequestActionArgs): Promise | void; +}; diff --git a/packages/plugin-runtime-types/src/plugins/WorkspaceActionPlugin.ts b/packages/plugin-runtime-types/src/plugins/WorkspaceActionPlugin.ts new file mode 100644 index 00000000..d99f061f --- /dev/null +++ b/packages/plugin-runtime-types/src/plugins/WorkspaceActionPlugin.ts @@ -0,0 +1,11 @@ +import type { Context } from './Context'; +import type { Workspace } from '../bindings/gen_models'; +import type { Icon } from '../bindings/gen_events'; + +export type WorkspaceAction = { label: string; icon?: Icon }; + +export type CallWorkspaceActionArgs = { workspace: Workspace }; + +export type WorkspaceActionPlugin = WorkspaceAction & { + onSelect(ctx: Context, args: CallWorkspaceActionArgs): Promise | void; +}; diff --git a/packages/plugin-runtime-types/src/plugins/index.ts b/packages/plugin-runtime-types/src/plugins/index.ts index 72ed2e53..0f479d02 100644 --- a/packages/plugin-runtime-types/src/plugins/index.ts +++ b/packages/plugin-runtime-types/src/plugins/index.ts @@ -4,7 +4,9 @@ import type { Context } from './Context'; import type { FilterPlugin } from './FilterPlugin'; import { GrpcRequestActionPlugin } from './GrpcRequestActionPlugin'; import type { HttpRequestActionPlugin } from './HttpRequestActionPlugin'; -import type { HttpCollectionActionPlugin } from './HttpCollectionActionPlugin'; +import type { WebSocketRequestActionPlugin } from './WebSocketRequestActionPlugin'; +import type { WorkspaceActionPlugin } from './WorkspaceActionPlugin'; +import type { FolderActionPlugin } from './FolderActionPlugin'; import type { ImporterPlugin } from './ImporterPlugin'; import type { TemplateFunctionPlugin } from './TemplateFunctionPlugin'; import type { ThemePlugin } from './ThemePlugin'; @@ -13,7 +15,8 @@ export type { Context }; export type { DynamicTemplateFunctionArg } from './TemplateFunctionPlugin'; export type { DynamicAuthenticationArg } from './AuthenticationPlugin'; export type { TemplateFunctionPlugin }; -export type { HttpCollectionActionPlugin } from './HttpCollectionActionPlugin'; +export type { WorkspaceActionPlugin } from './WorkspaceActionPlugin'; +export type { FolderActionPlugin } from './FolderActionPlugin'; /** * The global structure of a Yaak plugin @@ -26,7 +29,9 @@ export type PluginDefinition = { filter?: FilterPlugin; authentication?: AuthenticationPlugin; httpRequestActions?: HttpRequestActionPlugin[]; - httpCollectionActions?: HttpCollectionActionPlugin[]; + websocketRequestActions?: WebSocketRequestActionPlugin[]; + workspaceActions?: WorkspaceActionPlugin[]; + folderActions?: FolderActionPlugin[]; grpcRequestActions?: GrpcRequestActionPlugin[]; templateFunctions?: TemplateFunctionPlugin[]; }; diff --git a/packages/plugin-runtime/src/PluginInstance.ts b/packages/plugin-runtime/src/PluginInstance.ts index 5ffe2e8b..14bf25ee 100644 --- a/packages/plugin-runtime/src/PluginInstance.ts +++ b/packages/plugin-runtime/src/PluginInstance.ts @@ -174,16 +174,49 @@ export class PluginInstance { } if ( - payload.type === 'get_http_collection_actions_request' && - Array.isArray(this.#mod?.httpCollectionActions) + payload.type === 'get_websocket_request_actions_request' && + Array.isArray(this.#mod?.websocketRequestActions) ) { - const reply: HttpRequestAction[] = this.#mod.httpCollectionActions.map((a) => ({ + const reply = this.#mod.websocketRequestActions.map((a) => ({ ...a, - // Add everything except onSelect onSelect: undefined, })); const replyPayload: InternalEventPayload = { - type: 'get_http_collection_actions_response', + type: 'get_websocket_request_actions_response', + pluginRefId: this.#workerData.pluginRefId, + actions: reply, + }; + this.#sendPayload(context, replyPayload, replyId); + return; + } + + if ( + payload.type === 'get_workspace_actions_request' && + Array.isArray(this.#mod?.workspaceActions) + ) { + const reply = this.#mod.workspaceActions.map((a) => ({ + ...a, + onSelect: undefined, + })); + const replyPayload: InternalEventPayload = { + type: 'get_workspace_actions_response', + pluginRefId: this.#workerData.pluginRefId, + actions: reply, + }; + this.#sendPayload(context, replyPayload, replyId); + return; + } + + if ( + payload.type === 'get_folder_actions_request' && + Array.isArray(this.#mod?.folderActions) + ) { + const reply = this.#mod.folderActions.map((a) => ({ + ...a, + onSelect: undefined, + })); + const replyPayload: InternalEventPayload = { + type: 'get_folder_actions_response', pluginRefId: this.#workerData.pluginRefId, actions: reply, }; @@ -322,10 +355,34 @@ export class PluginInstance { } if ( - payload.type === 'call_http_collection_action_request' && - Array.isArray(this.#mod.httpCollectionActions) + payload.type === 'call_websocket_request_action_request' && + Array.isArray(this.#mod.websocketRequestActions) ) { - const action = this.#mod.httpCollectionActions[payload.index]; + const action = this.#mod.websocketRequestActions[payload.index]; + if (typeof action?.onSelect === 'function') { + await action.onSelect(ctx, payload.args); + this.#sendEmpty(context, replyId); + return; + } + } + + if ( + payload.type === 'call_workspace_action_request' && + Array.isArray(this.#mod.workspaceActions) + ) { + const action = this.#mod.workspaceActions[payload.index]; + if (typeof action?.onSelect === 'function') { + await action.onSelect(ctx, payload.args); + this.#sendEmpty(context, replyId); + return; + } + } + + if ( + payload.type === 'call_folder_action_request' && + Array.isArray(this.#mod.folderActions) + ) { + const action = this.#mod.folderActions[payload.index]; if (typeof action?.onSelect === 'function') { await action.onSelect(ctx, payload.args); this.#sendEmpty(context, replyId); diff --git a/src-tauri/src/lib.rs b/src-tauri/src/lib.rs index 89be63ae..2e4e18ce 100644 --- a/src-tauri/src/lib.rs +++ b/src-tauri/src/lib.rs @@ -41,13 +41,15 @@ use yaak_models::models::{ use yaak_models::query_manager::QueryManagerExt; use yaak_models::util::{BatchUpsertResult, UpdateSource, get_workspace_export_resources}; use yaak_plugins::events::{ - CallGrpcRequestActionArgs, CallGrpcRequestActionRequest, CallHttpRequestActionArgs, - CallHttpRequestActionRequest, Color, FilterResponse, GetGrpcRequestActionsResponse, - GetHttpAuthenticationConfigResponse, GetHttpAuthenticationSummaryResponse, - GetHttpRequestActionsResponse, GetHttpCollectionActionsResponse, - CallHttpCollectionActionArgs, CallHttpCollectionActionRequest, GetTemplateFunctionConfigResponse, - GetTemplateFunctionSummaryResponse, InternalEvent, InternalEventPayload, JsonPrimitive, - PluginContext, RenderPurpose, ShowToastRequest, + CallFolderActionArgs, CallFolderActionRequest, CallGrpcRequestActionArgs, + CallGrpcRequestActionRequest, CallHttpRequestActionArgs, CallHttpRequestActionRequest, + CallWebSocketRequestActionArgs, CallWebSocketRequestActionRequest, CallWorkspaceActionArgs, + CallWorkspaceActionRequest, Color, FilterResponse, GetFolderActionsResponse, + GetGrpcRequestActionsResponse, GetHttpAuthenticationConfigResponse, + GetHttpAuthenticationSummaryResponse, GetHttpRequestActionsResponse, + GetTemplateFunctionConfigResponse, GetTemplateFunctionSummaryResponse, + GetWebSocketRequestActionsResponse, GetWorkspaceActionsResponse, InternalEvent, + InternalEventPayload, JsonPrimitive, PluginContext, RenderPurpose, ShowToastRequest, }; use yaak_plugins::manager::PluginManager; use yaak_plugins::plugin_meta::PluginMetadata; @@ -875,39 +877,77 @@ async fn cmd_http_request_actions( } #[tauri::command] -async fn cmd_http_collection_actions( +async fn cmd_websocket_request_actions( window: WebviewWindow, plugin_manager: State<'_, PluginManager>, -) -> YaakResult> { - Ok(plugin_manager.get_http_collection_actions(&window).await?) +) -> YaakResult> { + Ok(plugin_manager.get_websocket_request_actions(&window).await?) } #[tauri::command] -async fn cmd_call_http_collection_action( +async fn cmd_call_websocket_request_action( window: WebviewWindow, - req: CallHttpCollectionActionRequest, + req: CallWebSocketRequestActionRequest, plugin_manager: State<'_, PluginManager>, ) -> YaakResult<()> { - let folder = match &req.args.folder { - Some(f) => Some(window.db().get_folder(&f.id)?), - None => None, - }; - let workspace = match &req.args.workspace { - Some(w) => Some(window.db().get_workspace(&w.id)?), - None => None, - }; - + let websocket_request = window.db().get_websocket_request(&req.args.websocket_request.id)?; Ok(plugin_manager - .call_http_collection_action( + .call_websocket_request_action( &window, - CallHttpCollectionActionRequest { - args: CallHttpCollectionActionArgs { folder, workspace }, + CallWebSocketRequestActionRequest { + args: CallWebSocketRequestActionArgs { websocket_request }, ..req }, ) .await?) } +#[tauri::command] +async fn cmd_workspace_actions( + window: WebviewWindow, + plugin_manager: State<'_, PluginManager>, +) -> YaakResult> { + Ok(plugin_manager.get_workspace_actions(&window).await?) +} + +#[tauri::command] +async fn cmd_call_workspace_action( + window: WebviewWindow, + req: CallWorkspaceActionRequest, + plugin_manager: State<'_, PluginManager>, +) -> YaakResult<()> { + let workspace = window.db().get_workspace(&req.args.workspace.id)?; + Ok(plugin_manager + .call_workspace_action( + &window, + CallWorkspaceActionRequest { args: CallWorkspaceActionArgs { workspace }, ..req }, + ) + .await?) +} + +#[tauri::command] +async fn cmd_folder_actions( + window: WebviewWindow, + plugin_manager: State<'_, PluginManager>, +) -> YaakResult> { + Ok(plugin_manager.get_folder_actions(&window).await?) +} + +#[tauri::command] +async fn cmd_call_folder_action( + window: WebviewWindow, + req: CallFolderActionRequest, + plugin_manager: State<'_, PluginManager>, +) -> YaakResult<()> { + let folder = window.db().get_folder(&req.args.folder.id)?; + Ok(plugin_manager + .call_folder_action( + &window, + CallFolderActionRequest { args: CallFolderActionArgs { folder }, ..req }, + ) + .await?) +} + #[tauri::command] async fn cmd_grpc_request_actions( window: WebviewWindow, @@ -1496,7 +1536,9 @@ pub fn run() { .invoke_handler(tauri::generate_handler![ cmd_call_http_authentication_action, cmd_call_http_request_action, - cmd_call_http_collection_action, + cmd_call_websocket_request_action, + cmd_call_workspace_action, + cmd_call_folder_action, cmd_call_grpc_request_action, cmd_check_for_updates, cmd_create_grpc_request, @@ -1518,7 +1560,9 @@ pub fn run() { cmd_grpc_reflect, cmd_grpc_request_actions, cmd_http_request_actions, - cmd_http_collection_actions, + cmd_websocket_request_actions, + cmd_workspace_actions, + cmd_folder_actions, cmd_import_data, cmd_install_plugin, cmd_metadata, diff --git a/src-tauri/yaak-plugins/bindings/gen_events.ts b/src-tauri/yaak-plugins/bindings/gen_events.ts index 3af7dc76..79d5de19 100644 --- a/src-tauri/yaak-plugins/bindings/gen_events.ts +++ b/src-tauri/yaak-plugins/bindings/gen_events.ts @@ -4,6 +4,10 @@ import type { JsonValue } from "./serde_json/JsonValue"; export type BootRequest = { dir: string, watch: boolean, }; +export type CallFolderActionArgs = { folder: Folder, }; + +export type CallFolderActionRequest = { index: number, pluginRefId: string, args: CallFolderActionArgs, }; + export type CallGrpcRequestActionArgs = { grpcRequest: GrpcRequest, protoFiles: Array, }; export type CallGrpcRequestActionRequest = { index: number, pluginRefId: string, args: CallGrpcRequestActionArgs, }; @@ -26,10 +30,6 @@ setHeaders?: Array, */ setQueryParameters?: Array, }; -export type CallHttpCollectionActionArgs = { folder?: Folder, workspace?: Workspace, }; - -export type CallHttpCollectionActionRequest = { index: number, pluginRefId: string, args: CallHttpCollectionActionArgs, }; - export type CallHttpRequestActionArgs = { httpRequest: HttpRequest, }; export type CallHttpRequestActionRequest = { index: number, pluginRefId: string, args: CallHttpRequestActionArgs, }; @@ -40,6 +40,14 @@ export type CallTemplateFunctionRequest = { name: string, args: CallTemplateFunc export type CallTemplateFunctionResponse = { value: string | null, error?: string, }; +export type CallWebSocketRequestActionArgs = { websocketRequest: WebsocketRequest, }; + +export type CallWebSocketRequestActionRequest = { index: number, pluginRefId: string, args: CallWebSocketRequestActionArgs, }; + +export type CallWorkspaceActionArgs = { workspace: Workspace, }; + +export type CallWorkspaceActionRequest = { index: number, pluginRefId: string, args: CallWorkspaceActionArgs, }; + export type CloseWindowRequest = { label: string, }; export type Color = "primary" | "secondary" | "info" | "success" | "notice" | "warning" | "danger"; @@ -78,6 +86,8 @@ export type FindHttpResponsesRequest = { requestId: string, limit?: number, }; export type FindHttpResponsesResponse = { httpResponses: Array, }; +export type FolderAction = { label: string, icon?: Icon, }; + export type FormInput = { "type": "text" } & FormInputText | { "type": "editor" } & FormInputEditor | { "type": "select" } & FormInputSelect | { "type": "checkbox" } & FormInputCheckbox | { "type": "file" } & FormInputFile | { "type": "http_request" } & FormInputHttpRequest | { "type": "accordion" } & FormInputAccordion | { "type": "h_stack" } & FormInputHStack | { "type": "banner" } & FormInputBanner | { "type": "markdown" } & FormInputMarkdown; export type FormInputAccordion = { label: string, inputs?: Array, hidden?: boolean, }; @@ -349,6 +359,8 @@ export type GetCookieValueRequest = { name: string, }; export type GetCookieValueResponse = { value: string | null, }; +export type GetFolderActionsResponse = { actions: Array, pluginRefId: string, }; + export type GetGrpcRequestActionsResponse = { actions: Array, pluginRefId: string, }; export type GetHttpAuthenticationConfigRequest = { contextId: string, values: { [key in string]?: JsonPrimitive }, }; @@ -357,8 +369,6 @@ export type GetHttpAuthenticationConfigResponse = { args: Array, plug export type GetHttpAuthenticationSummaryResponse = { name: string, label: string, shortLabel: string, }; -export type GetHttpCollectionActionsResponse = { actions: Array, pluginRefId: string, }; - export type GetHttpRequestActionsResponse = { actions: Array, pluginRefId: string, }; export type GetHttpRequestByIdRequest = { id: string, }; @@ -379,12 +389,14 @@ export type GetThemesRequest = Record; export type GetThemesResponse = { themes: Array, }; +export type GetWebSocketRequestActionsResponse = { actions: Array, pluginRefId: string, }; + +export type GetWorkspaceActionsResponse = { actions: Array, pluginRefId: string, }; + export type GrpcRequestAction = { label: string, icon?: Icon, }; export type HttpAuthenticationAction = { label: string, icon?: Icon, }; -export type HttpCollectionAction = { label: string, icon?: Icon, }; - export type HttpHeader = { name: string, value: string, }; export type HttpRequestAction = { label: string, icon?: Icon, }; @@ -399,7 +411,7 @@ export type ImportResponse = { resources: ImportResources, }; export type InternalEvent = { id: string, pluginRefId: string, pluginName: string, replyId: string | null, context: PluginContext, payload: InternalEventPayload, }; -export type InternalEventPayload = { "type": "boot_request" } & BootRequest | { "type": "boot_response" } | { "type": "reload_response" } & ReloadResponse | { "type": "terminate_request" } | { "type": "terminate_response" } | { "type": "import_request" } & ImportRequest | { "type": "import_response" } & ImportResponse | { "type": "filter_request" } & FilterRequest | { "type": "filter_response" } & FilterResponse | { "type": "export_http_request_request" } & ExportHttpRequestRequest | { "type": "export_http_request_response" } & ExportHttpRequestResponse | { "type": "send_http_request_request" } & SendHttpRequestRequest | { "type": "send_http_request_response" } & SendHttpRequestResponse | { "type": "list_cookie_names_request" } & ListCookieNamesRequest | { "type": "list_cookie_names_response" } & ListCookieNamesResponse | { "type": "get_cookie_value_request" } & GetCookieValueRequest | { "type": "get_cookie_value_response" } & GetCookieValueResponse | { "type": "get_http_request_actions_request" } & EmptyPayload | { "type": "get_http_request_actions_response" } & GetHttpRequestActionsResponse | { "type": "call_http_request_action_request" } & CallHttpRequestActionRequest | { "type": "get_http_collection_actions_request" } & EmptyPayload | { "type": "get_http_collection_actions_response" } & GetHttpCollectionActionsResponse | { "type": "call_http_collection_action_request" } & CallHttpCollectionActionRequest | { "type": "get_grpc_request_actions_request" } & EmptyPayload | { "type": "get_grpc_request_actions_response" } & GetGrpcRequestActionsResponse | { "type": "call_grpc_request_action_request" } & CallGrpcRequestActionRequest | { "type": "get_template_function_summary_request" } & EmptyPayload | { "type": "get_template_function_summary_response" } & GetTemplateFunctionSummaryResponse | { "type": "get_template_function_config_request" } & GetTemplateFunctionConfigRequest | { "type": "get_template_function_config_response" } & GetTemplateFunctionConfigResponse | { "type": "call_template_function_request" } & CallTemplateFunctionRequest | { "type": "call_template_function_response" } & CallTemplateFunctionResponse | { "type": "get_http_authentication_summary_request" } & EmptyPayload | { "type": "get_http_authentication_summary_response" } & GetHttpAuthenticationSummaryResponse | { "type": "get_http_authentication_config_request" } & GetHttpAuthenticationConfigRequest | { "type": "get_http_authentication_config_response" } & GetHttpAuthenticationConfigResponse | { "type": "call_http_authentication_request" } & CallHttpAuthenticationRequest | { "type": "call_http_authentication_response" } & CallHttpAuthenticationResponse | { "type": "call_http_authentication_action_request" } & CallHttpAuthenticationActionRequest | { "type": "call_http_authentication_action_response" } & EmptyPayload | { "type": "copy_text_request" } & CopyTextRequest | { "type": "copy_text_response" } & EmptyPayload | { "type": "render_http_request_request" } & RenderHttpRequestRequest | { "type": "render_http_request_response" } & RenderHttpRequestResponse | { "type": "render_grpc_request_request" } & RenderGrpcRequestRequest | { "type": "render_grpc_request_response" } & RenderGrpcRequestResponse | { "type": "template_render_request" } & TemplateRenderRequest | { "type": "template_render_response" } & TemplateRenderResponse | { "type": "get_key_value_request" } & GetKeyValueRequest | { "type": "get_key_value_response" } & GetKeyValueResponse | { "type": "set_key_value_request" } & SetKeyValueRequest | { "type": "set_key_value_response" } & SetKeyValueResponse | { "type": "delete_key_value_request" } & DeleteKeyValueRequest | { "type": "delete_key_value_response" } & DeleteKeyValueResponse | { "type": "open_window_request" } & OpenWindowRequest | { "type": "window_navigate_event" } & WindowNavigateEvent | { "type": "window_close_event" } | { "type": "close_window_request" } & CloseWindowRequest | { "type": "show_toast_request" } & ShowToastRequest | { "type": "show_toast_response" } & EmptyPayload | { "type": "prompt_text_request" } & PromptTextRequest | { "type": "prompt_text_response" } & PromptTextResponse | { "type": "window_info_request" } & WindowInfoRequest | { "type": "window_info_response" } & WindowInfoResponse | { "type": "get_http_request_by_id_request" } & GetHttpRequestByIdRequest | { "type": "get_http_request_by_id_response" } & GetHttpRequestByIdResponse | { "type": "find_http_responses_request" } & FindHttpResponsesRequest | { "type": "find_http_responses_response" } & FindHttpResponsesResponse | { "type": "list_http_requests_request" } & ListHttpRequestsRequest | { "type": "list_http_requests_response" } & ListHttpRequestsResponse | { "type": "list_folders_request" } & ListFoldersRequest | { "type": "list_folders_response" } & ListFoldersResponse | { "type": "get_themes_request" } & GetThemesRequest | { "type": "get_themes_response" } & GetThemesResponse | { "type": "empty_response" } & EmptyPayload | { "type": "error_response" } & ErrorResponse; +export type InternalEventPayload = { "type": "boot_request" } & BootRequest | { "type": "boot_response" } | { "type": "reload_response" } & ReloadResponse | { "type": "terminate_request" } | { "type": "terminate_response" } | { "type": "import_request" } & ImportRequest | { "type": "import_response" } & ImportResponse | { "type": "filter_request" } & FilterRequest | { "type": "filter_response" } & FilterResponse | { "type": "export_http_request_request" } & ExportHttpRequestRequest | { "type": "export_http_request_response" } & ExportHttpRequestResponse | { "type": "send_http_request_request" } & SendHttpRequestRequest | { "type": "send_http_request_response" } & SendHttpRequestResponse | { "type": "list_cookie_names_request" } & ListCookieNamesRequest | { "type": "list_cookie_names_response" } & ListCookieNamesResponse | { "type": "get_cookie_value_request" } & GetCookieValueRequest | { "type": "get_cookie_value_response" } & GetCookieValueResponse | { "type": "get_http_request_actions_request" } & EmptyPayload | { "type": "get_http_request_actions_response" } & GetHttpRequestActionsResponse | { "type": "call_http_request_action_request" } & CallHttpRequestActionRequest | { "type": "get_web_socket_request_actions_request" } & EmptyPayload | { "type": "get_web_socket_request_actions_response" } & GetWebSocketRequestActionsResponse | { "type": "call_web_socket_request_action_request" } & CallWebSocketRequestActionRequest | { "type": "get_workspace_actions_request" } & EmptyPayload | { "type": "get_workspace_actions_response" } & GetWorkspaceActionsResponse | { "type": "call_workspace_action_request" } & CallWorkspaceActionRequest | { "type": "get_folder_actions_request" } & EmptyPayload | { "type": "get_folder_actions_response" } & GetFolderActionsResponse | { "type": "call_folder_action_request" } & CallFolderActionRequest | { "type": "get_grpc_request_actions_request" } & EmptyPayload | { "type": "get_grpc_request_actions_response" } & GetGrpcRequestActionsResponse | { "type": "call_grpc_request_action_request" } & CallGrpcRequestActionRequest | { "type": "get_template_function_summary_request" } & EmptyPayload | { "type": "get_template_function_summary_response" } & GetTemplateFunctionSummaryResponse | { "type": "get_template_function_config_request" } & GetTemplateFunctionConfigRequest | { "type": "get_template_function_config_response" } & GetTemplateFunctionConfigResponse | { "type": "call_template_function_request" } & CallTemplateFunctionRequest | { "type": "call_template_function_response" } & CallTemplateFunctionResponse | { "type": "get_http_authentication_summary_request" } & EmptyPayload | { "type": "get_http_authentication_summary_response" } & GetHttpAuthenticationSummaryResponse | { "type": "get_http_authentication_config_request" } & GetHttpAuthenticationConfigRequest | { "type": "get_http_authentication_config_response" } & GetHttpAuthenticationConfigResponse | { "type": "call_http_authentication_request" } & CallHttpAuthenticationRequest | { "type": "call_http_authentication_response" } & CallHttpAuthenticationResponse | { "type": "call_http_authentication_action_request" } & CallHttpAuthenticationActionRequest | { "type": "call_http_authentication_action_response" } & EmptyPayload | { "type": "copy_text_request" } & CopyTextRequest | { "type": "copy_text_response" } & EmptyPayload | { "type": "render_http_request_request" } & RenderHttpRequestRequest | { "type": "render_http_request_response" } & RenderHttpRequestResponse | { "type": "render_grpc_request_request" } & RenderGrpcRequestRequest | { "type": "render_grpc_request_response" } & RenderGrpcRequestResponse | { "type": "template_render_request" } & TemplateRenderRequest | { "type": "template_render_response" } & TemplateRenderResponse | { "type": "get_key_value_request" } & GetKeyValueRequest | { "type": "get_key_value_response" } & GetKeyValueResponse | { "type": "set_key_value_request" } & SetKeyValueRequest | { "type": "set_key_value_response" } & SetKeyValueResponse | { "type": "delete_key_value_request" } & DeleteKeyValueRequest | { "type": "delete_key_value_response" } & DeleteKeyValueResponse | { "type": "open_window_request" } & OpenWindowRequest | { "type": "window_navigate_event" } & WindowNavigateEvent | { "type": "window_close_event" } | { "type": "close_window_request" } & CloseWindowRequest | { "type": "show_toast_request" } & ShowToastRequest | { "type": "show_toast_response" } & EmptyPayload | { "type": "prompt_text_request" } & PromptTextRequest | { "type": "prompt_text_response" } & PromptTextResponse | { "type": "window_info_request" } & WindowInfoRequest | { "type": "window_info_response" } & WindowInfoResponse | { "type": "get_http_request_by_id_request" } & GetHttpRequestByIdRequest | { "type": "get_http_request_by_id_response" } & GetHttpRequestByIdResponse | { "type": "find_http_responses_request" } & FindHttpResponsesRequest | { "type": "find_http_responses_response" } & FindHttpResponsesResponse | { "type": "list_http_requests_request" } & ListHttpRequestsRequest | { "type": "list_http_requests_response" } & ListHttpRequestsResponse | { "type": "list_folders_request" } & ListFoldersRequest | { "type": "list_folders_response" } & ListFoldersResponse | { "type": "get_themes_request" } & GetThemesRequest | { "type": "get_themes_response" } & GetThemesResponse | { "type": "empty_response" } & EmptyPayload | { "type": "error_response" } & ErrorResponse; export type JsonPrimitive = string | number | boolean | null; @@ -509,6 +521,8 @@ export type ThemeComponentColors = { surface?: string, surfaceHighlight?: string export type ThemeComponents = { dialog?: ThemeComponentColors, menu?: ThemeComponentColors, toast?: ThemeComponentColors, sidebar?: ThemeComponentColors, responsePane?: ThemeComponentColors, appHeader?: ThemeComponentColors, button?: ThemeComponentColors, banner?: ThemeComponentColors, templateTag?: ThemeComponentColors, urlBar?: ThemeComponentColors, editor?: ThemeComponentColors, input?: ThemeComponentColors, }; +export type WebSocketRequestAction = { label: string, icon?: Icon, }; + export type WindowInfoRequest = { label: string, }; export type WindowInfoResponse = { requestId: string | null, environmentId: string | null, workspaceId: string | null, label: string, }; @@ -516,3 +530,5 @@ export type WindowInfoResponse = { requestId: string | null, environmentId: stri export type WindowNavigateEvent = { url: string, }; export type WindowSize = { width: number, height: number, }; + +export type WorkspaceAction = { label: string, icon?: Icon, }; diff --git a/src-tauri/yaak-plugins/src/events.rs b/src-tauri/yaak-plugins/src/events.rs index c7033739..af8334f7 100644 --- a/src-tauri/yaak-plugins/src/events.rs +++ b/src-tauri/yaak-plugins/src/events.rs @@ -89,10 +89,21 @@ pub enum InternalEventPayload { GetHttpRequestActionsRequest(EmptyPayload), GetHttpRequestActionsResponse(GetHttpRequestActionsResponse), CallHttpRequestActionRequest(CallHttpRequestActionRequest), - // HTTP Collection Actions - GetHttpCollectionActionsRequest(EmptyPayload), - GetHttpCollectionActionsResponse(GetHttpCollectionActionsResponse), - CallHttpCollectionActionRequest(CallHttpCollectionActionRequest), + + // WebSocket Request Actions + GetWebSocketRequestActionsRequest(EmptyPayload), + GetWebSocketRequestActionsResponse(GetWebSocketRequestActionsResponse), + CallWebSocketRequestActionRequest(CallWebSocketRequestActionRequest), + + // Workspace Actions + GetWorkspaceActionsRequest(EmptyPayload), + GetWorkspaceActionsResponse(GetWorkspaceActionsResponse), + CallWorkspaceActionRequest(CallWorkspaceActionRequest), + + // Folder Actions + GetFolderActionsRequest(EmptyPayload), + GetFolderActionsResponse(GetFolderActionsResponse), + CallFolderActionRequest(CallFolderActionRequest), // Grpc Request Actions GetGrpcRequestActionsRequest(EmptyPayload), @@ -1104,14 +1115,6 @@ pub struct GetHttpRequestActionsResponse { pub plugin_ref_id: String, } -#[derive(Debug, Clone, Default, Serialize, Deserialize, TS)] -#[serde(default, rename_all = "camelCase")] -#[ts(export, export_to = "gen_events.ts")] -pub struct GetHttpCollectionActionsResponse { - pub actions: Vec, - pub plugin_ref_id: String, -} - #[derive(Debug, Clone, Default, Serialize, Deserialize, TS)] #[serde(default, rename_all = "camelCase")] #[ts(export, export_to = "gen_events.ts")] @@ -1121,15 +1124,6 @@ pub struct HttpRequestAction { pub icon: Option, } -#[derive(Debug, Clone, Default, Serialize, Deserialize, TS)] -#[serde(default, rename_all = "camelCase")] -#[ts(export, export_to = "gen_events.ts")] -pub struct HttpCollectionAction { - pub label: String, - #[ts(optional)] - pub icon: Option, -} - #[derive(Debug, Clone, Default, Serialize, Deserialize, TS)] #[serde(default, rename_all = "camelCase")] #[ts(export, export_to = "gen_events.ts")] @@ -1139,15 +1133,6 @@ pub struct CallHttpRequestActionRequest { pub args: CallHttpRequestActionArgs, } -#[derive(Debug, Clone, Default, Serialize, Deserialize, TS)] -#[serde(default, rename_all = "camelCase")] -#[ts(export, export_to = "gen_events.ts")] -pub struct CallHttpCollectionActionRequest { - pub index: i32, - pub plugin_ref_id: String, - pub args: CallHttpCollectionActionArgs, -} - #[derive(Debug, Clone, Default, Serialize, Deserialize, TS)] #[serde(default, rename_all = "camelCase")] #[ts(export, export_to = "gen_events.ts")] @@ -1158,11 +1143,100 @@ pub struct CallHttpRequestActionArgs { #[derive(Debug, Clone, Default, Serialize, Deserialize, TS)] #[serde(default, rename_all = "camelCase")] #[ts(export, export_to = "gen_events.ts")] -pub struct CallHttpCollectionActionArgs { +pub struct GetWebSocketRequestActionsResponse { + pub actions: Vec, + pub plugin_ref_id: String, +} + +#[derive(Debug, Clone, Default, Serialize, Deserialize, TS)] +#[serde(default, rename_all = "camelCase")] +#[ts(export, export_to = "gen_events.ts")] +pub struct WebSocketRequestAction { + pub label: String, #[ts(optional)] - pub folder: Option, + pub icon: Option, +} + +#[derive(Debug, Clone, Default, Serialize, Deserialize, TS)] +#[serde(default, rename_all = "camelCase")] +#[ts(export, export_to = "gen_events.ts")] +pub struct CallWebSocketRequestActionRequest { + pub index: i32, + pub plugin_ref_id: String, + pub args: CallWebSocketRequestActionArgs, +} + +#[derive(Debug, Clone, Default, Serialize, Deserialize, TS)] +#[serde(default, rename_all = "camelCase")] +#[ts(export, export_to = "gen_events.ts")] +pub struct CallWebSocketRequestActionArgs { + pub websocket_request: WebsocketRequest, +} + +#[derive(Debug, Clone, Default, Serialize, Deserialize, TS)] +#[serde(default, rename_all = "camelCase")] +#[ts(export, export_to = "gen_events.ts")] +pub struct GetWorkspaceActionsResponse { + pub actions: Vec, + pub plugin_ref_id: String, +} + +#[derive(Debug, Clone, Default, Serialize, Deserialize, TS)] +#[serde(default, rename_all = "camelCase")] +#[ts(export, export_to = "gen_events.ts")] +pub struct WorkspaceAction { + pub label: String, #[ts(optional)] - pub workspace: Option, + pub icon: Option, +} + +#[derive(Debug, Clone, Default, Serialize, Deserialize, TS)] +#[serde(default, rename_all = "camelCase")] +#[ts(export, export_to = "gen_events.ts")] +pub struct CallWorkspaceActionRequest { + pub index: i32, + pub plugin_ref_id: String, + pub args: CallWorkspaceActionArgs, +} + +#[derive(Debug, Clone, Default, Serialize, Deserialize, TS)] +#[serde(default, rename_all = "camelCase")] +#[ts(export, export_to = "gen_events.ts")] +pub struct CallWorkspaceActionArgs { + pub workspace: Workspace, +} + +#[derive(Debug, Clone, Default, Serialize, Deserialize, TS)] +#[serde(default, rename_all = "camelCase")] +#[ts(export, export_to = "gen_events.ts")] +pub struct GetFolderActionsResponse { + pub actions: Vec, + pub plugin_ref_id: String, +} + +#[derive(Debug, Clone, Default, Serialize, Deserialize, TS)] +#[serde(default, rename_all = "camelCase")] +#[ts(export, export_to = "gen_events.ts")] +pub struct FolderAction { + pub label: String, + #[ts(optional)] + pub icon: Option, +} + +#[derive(Debug, Clone, Default, Serialize, Deserialize, TS)] +#[serde(default, rename_all = "camelCase")] +#[ts(export, export_to = "gen_events.ts")] +pub struct CallFolderActionRequest { + pub index: i32, + pub plugin_ref_id: String, + pub args: CallFolderActionArgs, +} + +#[derive(Debug, Clone, Default, Serialize, Deserialize, TS)] +#[serde(default, rename_all = "camelCase")] +#[ts(export, export_to = "gen_events.ts")] +pub struct CallFolderActionArgs { + pub folder: Folder, } #[derive(Debug, Clone, Default, Serialize, Deserialize, TS)] diff --git a/src-tauri/yaak-plugins/src/manager.rs b/src-tauri/yaak-plugins/src/manager.rs index e0e07e65..c49c24b1 100644 --- a/src-tauri/yaak-plugins/src/manager.rs +++ b/src-tauri/yaak-plugins/src/manager.rs @@ -3,18 +3,18 @@ use crate::error::Error::{ }; use crate::error::Result; use crate::events::{ - BootRequest, CallGrpcRequestActionRequest, CallHttpAuthenticationActionArgs, - CallHttpAuthenticationActionRequest, CallHttpAuthenticationRequest, - CallHttpAuthenticationResponse, CallHttpRequestActionRequest, CallTemplateFunctionArgs, - CallTemplateFunctionRequest, CallTemplateFunctionResponse, EmptyPayload, ErrorResponse, - FilterRequest, FilterResponse, GetGrpcRequestActionsResponse, + BootRequest, CallFolderActionRequest, CallGrpcRequestActionRequest, + CallHttpAuthenticationActionArgs, CallHttpAuthenticationActionRequest, + CallHttpAuthenticationRequest, CallHttpAuthenticationResponse, CallHttpRequestActionRequest, + CallTemplateFunctionArgs, CallTemplateFunctionRequest, CallTemplateFunctionResponse, + CallWebSocketRequestActionRequest, CallWorkspaceActionRequest, EmptyPayload, ErrorResponse, + FilterRequest, FilterResponse, GetFolderActionsResponse, GetGrpcRequestActionsResponse, GetHttpAuthenticationConfigRequest, GetHttpAuthenticationConfigResponse, GetHttpAuthenticationSummaryResponse, GetHttpRequestActionsResponse, - GetHttpCollectionActionsResponse, CallHttpCollectionActionRequest, GetTemplateFunctionConfigRequest, GetTemplateFunctionConfigResponse, - GetTemplateFunctionSummaryResponse, GetThemesRequest, GetThemesResponse, ImportRequest, - ImportResponse, InternalEvent, InternalEventPayload, JsonPrimitive, PluginContext, - RenderPurpose, + GetTemplateFunctionSummaryResponse, GetThemesRequest, GetThemesResponse, + GetWebSocketRequestActionsResponse, GetWorkspaceActionsResponse, ImportRequest, ImportResponse, + InternalEvent, InternalEventPayload, JsonPrimitive, PluginContext, RenderPurpose, }; use crate::native_template_functions::{template_function_keyring, template_function_secure}; use crate::nodejs::start_nodejs_plugin_runtime; @@ -483,20 +483,62 @@ impl PluginManager { Ok(all_actions) } - pub async fn get_http_collection_actions( + pub async fn get_websocket_request_actions( &self, window: &WebviewWindow, - ) -> Result> { + ) -> Result> { let reply_events = self .send_and_wait( &PluginContext::new(window), - &InternalEventPayload::GetHttpCollectionActionsRequest(EmptyPayload {}), + &InternalEventPayload::GetWebSocketRequestActionsRequest(EmptyPayload {}), ) .await?; let mut all_actions = Vec::new(); for event in reply_events { - if let InternalEventPayload::GetHttpCollectionActionsResponse(resp) = event.payload { + if let InternalEventPayload::GetWebSocketRequestActionsResponse(resp) = event.payload { + all_actions.push(resp.clone()); + } + } + + Ok(all_actions) + } + + pub async fn get_workspace_actions( + &self, + window: &WebviewWindow, + ) -> Result> { + let reply_events = self + .send_and_wait( + &PluginContext::new(window), + &InternalEventPayload::GetWorkspaceActionsRequest(EmptyPayload {}), + ) + .await?; + + let mut all_actions = Vec::new(); + for event in reply_events { + if let InternalEventPayload::GetWorkspaceActionsResponse(resp) = event.payload { + all_actions.push(resp.clone()); + } + } + + Ok(all_actions) + } + + pub async fn get_folder_actions( + &self, + window: &WebviewWindow, + ) -> Result> { + let reply_events = self + .send_and_wait( + &PluginContext::new(window), + &InternalEventPayload::GetFolderActionsRequest(EmptyPayload {}), + ) + .await?; + + let mut all_actions = Vec::new(); + for event in reply_events { + if let InternalEventPayload::GetFolderActionsResponse(resp) = event.payload { all_actions.push(resp.clone()); } } @@ -586,17 +628,51 @@ impl PluginManager { Ok(()) } - pub async fn call_http_collection_action( + pub async fn call_websocket_request_action( &self, window: &WebviewWindow, - req: CallHttpCollectionActionRequest, + req: CallWebSocketRequestActionRequest, ) -> Result<()> { let ref_id = req.plugin_ref_id.clone(); let plugin = self.get_plugin_by_ref_id(ref_id.as_str()).await.ok_or(PluginNotFoundErr(ref_id))?; let event = plugin.build_event_to_send( &PluginContext::new(window), - &InternalEventPayload::CallHttpCollectionActionRequest(req), + &InternalEventPayload::CallWebSocketRequestActionRequest(req), + None, + ); + plugin.send(&event).await?; + Ok(()) + } + + pub async fn call_workspace_action( + &self, + window: &WebviewWindow, + req: CallWorkspaceActionRequest, + ) -> Result<()> { + let ref_id = req.plugin_ref_id.clone(); + let plugin = + self.get_plugin_by_ref_id(ref_id.as_str()).await.ok_or(PluginNotFoundErr(ref_id))?; + let event = plugin.build_event_to_send( + &PluginContext::new(window), + &InternalEventPayload::CallWorkspaceActionRequest(req), + None, + ); + plugin.send(&event).await?; + Ok(()) + } + + pub async fn call_folder_action( + &self, + window: &WebviewWindow, + req: CallFolderActionRequest, + ) -> Result<()> { + let ref_id = req.plugin_ref_id.clone(); + let plugin = + self.get_plugin_by_ref_id(ref_id.as_str()).await.ok_or(PluginNotFoundErr(ref_id))?; + let event = plugin.build_event_to_send( + &PluginContext::new(window), + &InternalEventPayload::CallFolderActionRequest(req), None, ); plugin.send(&event).await?; diff --git a/src-web/components/Sidebar.tsx b/src-web/components/Sidebar.tsx index f813d89f..da04a1b0 100644 --- a/src-web/components/Sidebar.tsx +++ b/src-web/components/Sidebar.tsx @@ -37,7 +37,8 @@ import { getCreateDropdownItems } from '../hooks/useCreateDropdownItems'; import { getGrpcRequestActions } from '../hooks/useGrpcRequestActions'; import { useHotKey } from '../hooks/useHotKey'; import { getHttpRequestActions } from '../hooks/useHttpRequestActions'; -import { getHttpCollectionActions } from '../hooks/useHttpCollectionActions'; +import { getWorkspaceActions } from '../hooks/useWorkspaceActions'; +import { getFolderActions } from '../hooks/useFolderActions'; import { useListenToTauriEvent } from '../hooks/useListenToTauriEvent'; import { getModelAncestors } from '../hooks/useModelAncestors'; import { sendAnyHttpRequest } from '../hooks/useSendAnyHttpRequest'; @@ -375,8 +376,8 @@ function Sidebar({ className }: { className?: string }) { if (request != null) await a.call(request); }, })), - ...(items.length === 1 && (child.model === 'folder' || child.model === 'workspace') - ? await getHttpCollectionActions() + ...(items.length === 1 && child.model === 'workspace' + ? await getWorkspaceActions() : [] ).map((a) => ({ label: a.label, @@ -386,6 +387,16 @@ function Sidebar({ className }: { className?: string }) { if (model != null) await a.call(model as any); }, })), + ...(items.length === 1 && child.model === 'folder' ? await getFolderActions() : []).map( + (a) => ({ + label: a.label, + leftSlot: , + onSelect: async () => { + const model = getModel(child.model, child.id); + if (model != null) await a.call(model as any); + }, + }), + ), ]; const modelCreationItems: DropdownItem[] = items.length === 1 && child.model === 'folder' diff --git a/src-web/hooks/useFolderActions.ts b/src-web/hooks/useFolderActions.ts new file mode 100644 index 00000000..805c64b1 --- /dev/null +++ b/src-web/hooks/useFolderActions.ts @@ -0,0 +1,50 @@ +import { useQuery } from '@tanstack/react-query'; +import type { Folder } from '@yaakapp-internal/models'; +import type { + CallFolderActionRequest, + GetFolderActionsResponse, + FolderAction, +} from '@yaakapp-internal/plugins'; +import { useMemo } from 'react'; +import { invokeCmd } from '../lib/tauri'; +import { usePluginsKey } from './usePlugins'; + +export type CallableFolderAction = Pick & { + call: (folder: Folder) => Promise; +}; + +export function useFolderActions() { + const pluginsKey = usePluginsKey(); + + const actionsResult = useQuery({ + queryKey: ['folder_actions', pluginsKey], + queryFn: () => getFolderActions(), + }); + + // biome-ignore lint/correctness/useExhaustiveDependencies: none + const actions = useMemo(() => { + return actionsResult.data ?? []; + }, [JSON.stringify(actionsResult.data)]); + + return actions; +} + +export async function getFolderActions() { + const responses = await invokeCmd('cmd_folder_actions'); + const actions = responses.flatMap((r) => + r.actions.map((a, i) => ({ + label: a.label, + icon: a.icon, + call: async (folder: Folder) => { + const payload: CallFolderActionRequest = { + index: i, + pluginRefId: r.pluginRefId, + args: { folder }, + }; + await invokeCmd('cmd_call_folder_action', { req: payload }); + }, + })), + ); + + return actions; +} diff --git a/src-web/hooks/useHttpCollectionActions.ts b/src-web/hooks/useHttpCollectionActions.ts deleted file mode 100644 index c384bfca..00000000 --- a/src-web/hooks/useHttpCollectionActions.ts +++ /dev/null @@ -1,50 +0,0 @@ -import { useQuery } from '@tanstack/react-query'; -import type { Folder, Workspace } from '@yaakapp-internal/models'; -import type { - CallHttpCollectionActionRequest, - GetHttpCollectionActionsResponse, - HttpCollectionAction, -} from '@yaakapp-internal/plugins'; -import { useMemo } from 'react'; -import { invokeCmd } from '../lib/tauri'; -import { usePluginsKey } from './usePlugins'; - -export type CallableHttpCollectionAction = Pick & { - call: (model: Folder | Workspace) => Promise; -}; - -export function useHttpCollectionActions() { - const pluginsKey = usePluginsKey(); - - const actionsResult = useQuery({ - queryKey: ['http_collection_actions', pluginsKey], - queryFn: () => getHttpCollectionActions(), - }); - - // biome-ignore lint/correctness/useExhaustiveDependencies: none - const actions = useMemo(() => { - return actionsResult.data ?? []; - }, [JSON.stringify(actionsResult.data)]); - - return actions; -} - -export async function getHttpCollectionActions() { - const responses = await invokeCmd('cmd_http_collection_actions'); - const actions = responses.flatMap((r) => - r.actions.map((a, i) => ({ - label: a.label, - icon: a.icon, - call: async (model: Folder | Workspace) => { - const payload: CallHttpCollectionActionRequest = { - index: i, - pluginRefId: r.pluginRefId, - args: (model as any).model === 'folder' ? { folder: model as Folder } : { workspace: model as Workspace }, - } as any; - await invokeCmd('cmd_call_http_collection_action', { req: payload }); - }, - })), - ); - - return actions; -} diff --git a/src-web/hooks/useWorkspaceActions.ts b/src-web/hooks/useWorkspaceActions.ts new file mode 100644 index 00000000..197e0f47 --- /dev/null +++ b/src-web/hooks/useWorkspaceActions.ts @@ -0,0 +1,50 @@ +import { useQuery } from '@tanstack/react-query'; +import type { Workspace } from '@yaakapp-internal/models'; +import type { + CallWorkspaceActionRequest, + GetWorkspaceActionsResponse, + WorkspaceAction, +} from '@yaakapp-internal/plugins'; +import { useMemo } from 'react'; +import { invokeCmd } from '../lib/tauri'; +import { usePluginsKey } from './usePlugins'; + +export type CallableWorkspaceAction = Pick & { + call: (workspace: Workspace) => Promise; +}; + +export function useWorkspaceActions() { + const pluginsKey = usePluginsKey(); + + const actionsResult = useQuery({ + queryKey: ['workspace_actions', pluginsKey], + queryFn: () => getWorkspaceActions(), + }); + + // biome-ignore lint/correctness/useExhaustiveDependencies: none + const actions = useMemo(() => { + return actionsResult.data ?? []; + }, [JSON.stringify(actionsResult.data)]); + + return actions; +} + +export async function getWorkspaceActions() { + const responses = await invokeCmd('cmd_workspace_actions'); + const actions = responses.flatMap((r) => + r.actions.map((a, i) => ({ + label: a.label, + icon: a.icon, + call: async (workspace: Workspace) => { + const payload: CallWorkspaceActionRequest = { + index: i, + pluginRefId: r.pluginRefId, + args: { workspace }, + }; + await invokeCmd('cmd_call_workspace_action', { req: payload }); + }, + })), + ); + + return actions; +} diff --git a/src-web/lib/tauri.ts b/src-web/lib/tauri.ts index 218d2905..162fd7df 100644 --- a/src-web/lib/tauri.ts +++ b/src-web/lib/tauri.ts @@ -5,7 +5,9 @@ type TauriCmd = | 'cmd_call_grpc_request_action' | 'cmd_call_http_authentication_action' | 'cmd_call_http_request_action' - | 'cmd_call_http_collection_action' + | 'cmd_call_websocket_request_action' + | 'cmd_call_workspace_action' + | 'cmd_call_folder_action' | 'cmd_check_for_updates' | 'cmd_create_grpc_request' | 'cmd_curl_to_request' @@ -26,7 +28,9 @@ type TauriCmd = | 'cmd_grpc_reflect' | 'cmd_grpc_request_actions' | 'cmd_http_request_actions' - | 'cmd_http_collection_actions' + | 'cmd_websocket_request_actions' + | 'cmd_workspace_actions' + | 'cmd_folder_actions' | 'cmd_http_request_body' | 'cmd_http_response_body' | 'cmd_import_data'