From ee8b64e59076ff8d1cf5eb077e07dd30a21eda19 Mon Sep 17 00:00:00 2001 From: Siddharth Date: Sun, 9 Nov 2025 17:36:32 -0700 Subject: [PATCH] external url direct handler --- dist-electron/main.js | 11 ++++++++++- dist-electron/preload.mjs | 3 +++ electron/electron-env.d.ts | 1 + electron/ipc/handlers.ts | 12 +++++++++++- electron/preload.ts | 3 +++ src/components/video-editor/SettingsPanel.tsx | 12 +++++++++++- src/vite-env.d.ts | 1 + 7 files changed, 40 insertions(+), 3 deletions(-) diff --git a/dist-electron/main.js b/dist-electron/main.js index aab9e19..779e356 100644 --- a/dist-electron/main.js +++ b/dist-electron/main.js @@ -1,4 +1,4 @@ -import { BrowserWindow, screen, ipcMain, desktopCapturer, app, nativeImage, Tray, Menu } from "electron"; +import { BrowserWindow, screen, ipcMain, desktopCapturer, shell, app, nativeImage, Tray, Menu } from "electron"; import { fileURLToPath } from "node:url"; import path from "node:path"; import fs from "node:fs/promises"; @@ -318,6 +318,15 @@ function registerIpcHandlers(createEditorWindow2, createSourceSelectorWindow2, g onRecordingStateChange(recording, source.name); } }); + ipcMain.handle("open-external-url", async (_, url) => { + try { + await shell.openExternal(url); + return { success: true }; + } catch (error) { + console.error("Failed to open URL:", error); + return { success: false, error: String(error) }; + } + }); } const __dirname = path.dirname(fileURLToPath(import.meta.url)); const RECORDINGS_DIR = path.join(app.getPath("userData"), "recordings"); diff --git a/dist-electron/preload.mjs b/dist-electron/preload.mjs index caae4a3..768f2e9 100644 --- a/dist-electron/preload.mjs +++ b/dist-electron/preload.mjs @@ -38,5 +38,8 @@ electron.contextBridge.exposeInMainWorld("electronAPI", { const listener = () => callback(); electron.ipcRenderer.on("stop-recording-from-tray", listener); return () => electron.ipcRenderer.removeListener("stop-recording-from-tray", listener); + }, + openExternalUrl: (url) => { + return electron.ipcRenderer.invoke("open-external-url", url); } }); diff --git a/electron/electron-env.d.ts b/electron/electron-env.d.ts index ddeaa0c..c985c47 100644 --- a/electron/electron-env.d.ts +++ b/electron/electron-env.d.ts @@ -36,6 +36,7 @@ interface Window { getRecordedVideoPath: () => Promise<{ success: boolean; path?: string; message?: string }> setRecordingState: (recording: boolean) => Promise onStopRecordingFromTray: (callback: () => void) => () => void + openExternalUrl: (url: string) => Promise<{ success: boolean; error?: string }> } } diff --git a/electron/ipc/handlers.ts b/electron/ipc/handlers.ts index 9d2e361..bb4fe68 100644 --- a/electron/ipc/handlers.ts +++ b/electron/ipc/handlers.ts @@ -1,4 +1,4 @@ -import { ipcMain, desktopCapturer, BrowserWindow } from 'electron' +import { ipcMain, desktopCapturer, BrowserWindow, shell } from 'electron' import { startMouseTracking, stopMouseTracking, getTrackingData } from './mouseTracking' import fs from 'node:fs/promises' import path from 'node:path' @@ -134,4 +134,14 @@ export function registerIpcHandlers( onRecordingStateChange(recording, source.name) } }) + + ipcMain.handle('open-external-url', async (_, url: string) => { + try { + await shell.openExternal(url) + return { success: true } + } catch (error) { + console.error('Failed to open URL:', error) + return { success: false, error: String(error) } + } + }) } diff --git a/electron/preload.ts b/electron/preload.ts index 46a09fa..62ecbe5 100644 --- a/electron/preload.ts +++ b/electron/preload.ts @@ -38,5 +38,8 @@ contextBridge.exposeInMainWorld('electronAPI', { const listener = () => callback() ipcRenderer.on('stop-recording-from-tray', listener) return () => ipcRenderer.removeListener('stop-recording-from-tray', listener) + }, + openExternalUrl: (url: string) => { + return ipcRenderer.invoke('open-external-url', url) } }) \ No newline at end of file diff --git a/src/components/video-editor/SettingsPanel.tsx b/src/components/video-editor/SettingsPanel.tsx index 88caa1e..2c9f7f2 100644 --- a/src/components/video-editor/SettingsPanel.tsx +++ b/src/components/video-editor/SettingsPanel.tsx @@ -5,7 +5,7 @@ import { Button } from "@/components/ui/button"; import { useState } from "react"; import Colorful from '@uiw/react-color-colorful'; import { hsvaToHex } from '@uiw/color-convert'; -import { Trash2, Download, Crop, X } from "lucide-react"; +import { Trash2, Download, Crop, X, Bug } from "lucide-react"; import type { ZoomDepth, CropRegion } from "./types"; import { CropControl } from "./CropControl"; @@ -244,6 +244,16 @@ export function SettingsPanel({ selected, onWallpaperChange, selectedZoomDepth, Export Video + ); diff --git a/src/vite-env.d.ts b/src/vite-env.d.ts index 2a84e08..545909e 100644 --- a/src/vite-env.d.ts +++ b/src/vite-env.d.ts @@ -38,5 +38,6 @@ interface Window { }> setRecordingState: (recording: boolean) => Promise onStopRecordingFromTray: (callback: () => void) => () => void + openExternalUrl: (url: string) => Promise<{ success: boolean; error?: string }> } } \ No newline at end of file