From 706ee8a0fee25fb05c3697f679dd343c44f413ba Mon Sep 17 00:00:00 2001 From: Saoud Rizwan <7799382+saoudrizwan@users.noreply.github.com> Date: Tue, 10 Sep 2024 17:18:21 -0400 Subject: [PATCH] Add ability to open images --- src/providers/ClaudeDevProvider.ts | 4 ++++ src/shared/WebviewMessage.ts | 1 + src/utils/open-image.ts | 20 ++++++++++++++++++++ webview-ui/src/components/HistoryPreview.tsx | 2 +- webview-ui/src/components/TaskHeader.tsx | 2 +- webview-ui/src/components/Thumbnails.tsx | 7 +++++++ 6 files changed, 34 insertions(+), 2 deletions(-) create mode 100644 src/utils/open-image.ts diff --git a/src/providers/ClaudeDevProvider.ts b/src/providers/ClaudeDevProvider.ts index ba0f037..8d1d513 100644 --- a/src/providers/ClaudeDevProvider.ts +++ b/src/providers/ClaudeDevProvider.ts @@ -10,6 +10,7 @@ import fs from "fs/promises" import { HistoryItem } from "../shared/HistoryItem" import axios from "axios" import { getTheme } from "../utils/getTheme" +import { openImage } from "../utils/open-image" /* https://github.com/microsoft/vscode-webview-ui-toolkit-samples/blob/main/default/weather-webview/src/providers/WeatherViewProvider.ts @@ -398,6 +399,9 @@ export class ClaudeDevProvider implements vscode.WebviewViewProvider { const models = await this.getOllamaModels(message.text) this.postMessageToWebview({ type: "ollamaModels", models }) break + case "openImage": + openImage(message.text!) + break // Add more switch case statements here as more webview message commands // are created within the webview context (i.e. inside media/main.js) } diff --git a/src/shared/WebviewMessage.ts b/src/shared/WebviewMessage.ts index 804e0aa..c3a35f0 100644 --- a/src/shared/WebviewMessage.ts +++ b/src/shared/WebviewMessage.ts @@ -17,6 +17,7 @@ export interface WebviewMessage { | "exportTaskWithId" | "resetState" | "requestOllamaModels" + | "openImage" text?: string askResponse?: ClaudeAskResponse apiConfiguration?: ApiConfiguration diff --git a/src/utils/open-image.ts b/src/utils/open-image.ts new file mode 100644 index 0000000..42e09ee --- /dev/null +++ b/src/utils/open-image.ts @@ -0,0 +1,20 @@ +import * as path from "path" +import * as os from "os" +import * as vscode from "vscode" + +export async function openImage(dataUri: string) { + const matches = dataUri.match(/^data:image\/([a-zA-Z]+);base64,(.+)$/) + if (!matches) { + vscode.window.showErrorMessage("Invalid data URI format") + return + } + const [, format, base64Data] = matches + const imageBuffer = Buffer.from(base64Data, "base64") + const tempFilePath = path.join(os.tmpdir(), `temp_image_${Date.now()}.${format}`) + try { + await vscode.workspace.fs.writeFile(vscode.Uri.file(tempFilePath), imageBuffer) + await vscode.commands.executeCommand("vscode.open", vscode.Uri.file(tempFilePath)) + } catch (error) { + vscode.window.showErrorMessage(`Error opening image: ${error}`) + } +} diff --git a/webview-ui/src/components/HistoryPreview.tsx b/webview-ui/src/components/HistoryPreview.tsx index a9aa2c7..b13d431 100644 --- a/webview-ui/src/components/HistoryPreview.tsx +++ b/webview-ui/src/components/HistoryPreview.tsx @@ -33,7 +33,7 @@ const HistoryPreview = ({ showHistoryView }: HistoryPreviewProps) => {