diff --git a/src/context/LauncherContext.tsx b/src/context/LauncherContext.tsx index 0e0a7b8..f98acd1 100644 --- a/src/context/LauncherContext.tsx +++ b/src/context/LauncherContext.tsx @@ -7,6 +7,7 @@ import { useSkinSync } from "../hooks/useSkinSync"; import { useDiscordRPC } from "../hooks/useDiscordRPC"; import { useGamepad } from "../hooks/useGamepad"; import { useUpdateCheck } from "../hooks/useUpdateCheck"; +import RpcService from "../services/RpcService"; interface UIContextType { activeView: string; @@ -161,8 +162,11 @@ export function LauncherProvider({ children }: { children: React.ReactNode }) { const setupVisibilityDetection = async () => { try { const { listen } = await import("@tauri-apps/api/event"); - const unlistenClose = await listen("tauri://close-requested", () => { + const unlistenClose = await listen("tauri://close-requested", async () => { setIsWindowVisible(false); + if (config.rpcEnabled) { + await RpcService.StopRPC(); + } }); const unlistenShow = await listen("tauri://window-shown", () => { @@ -190,7 +194,7 @@ export function LauncherProvider({ children }: { children: React.ReactNode }) { }; setupVisibilityDetection(); - }, []); + }, [config.rpcEnabled]); const uiValue = useMemo(() => ({ activeView, setActiveView, showIntro, setShowIntro, diff --git a/src/services/RpcService.ts b/src/services/RpcService.ts index 678cb19..53839d4 100644 --- a/src/services/RpcService.ts +++ b/src/services/RpcService.ts @@ -1,4 +1,4 @@ -import { setActivity, start } from "tauri-plugin-drpc"; +import { setActivity, start, clearActivity, stop } from "tauri-plugin-drpc"; import { Activity, ActivityType, @@ -72,6 +72,19 @@ class RPC { console.error("Failed to set RPC activity:", e); } } + + public async StopRPC() { + try { + await clearActivity(); + await stop(); + } catch (e) { + // no need to handle errors here as the launcher will close anyways! + } finally { + this.initialized = false; + this.initializationPromise = null; + sessionStorage.removeItem("lce_rpc_started"); + } + } } export default new RPC();