From 3bbb231e476c1d548e85131f356887a30d2c7229 Mon Sep 17 00:00:00 2001 From: Mike Kold Hermann Date: Fri, 20 Mar 2026 10:52:28 +0100 Subject: [PATCH 1/9] feat: add useRPC hook for RPC access --- src/mainview/hooks/use-rpc.ts | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 src/mainview/hooks/use-rpc.ts diff --git a/src/mainview/hooks/use-rpc.ts b/src/mainview/hooks/use-rpc.ts new file mode 100644 index 0000000..c78a896 --- /dev/null +++ b/src/mainview/hooks/use-rpc.ts @@ -0,0 +1,9 @@ +import { useRouteContext } from "@tanstack/react-router"; + +export const useRPC = () => { + const { electroview } = useRouteContext({ from: "__root__" }); + + return { + rpc: electroview.rpc, + }; +}; From 135fc873425e51f8998bc47c7f7d058ae9b2a408 Mon Sep 17 00:00:00 2001 From: Mike Kold Hermann Date: Fri, 20 Mar 2026 10:52:37 +0100 Subject: [PATCH 2/9] feat: replace useRouteContext with useRPC for mod info query --- src/mainview/components/forms/mod.version.form.tsx | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/mainview/components/forms/mod.version.form.tsx b/src/mainview/components/forms/mod.version.form.tsx index 0b7135c..9d020bc 100644 --- a/src/mainview/components/forms/mod.version.form.tsx +++ b/src/mainview/components/forms/mod.version.form.tsx @@ -1,7 +1,7 @@ import { useForm } from "@tanstack/react-form"; import { UseMutateAsyncFunction, useQuery } from "@tanstack/react-query"; -import { useRouteContext } from "@tanstack/react-router"; import * as v from "valibot"; +import { useRPC } from "@/mainview/hooks/use-rpc"; import { Button } from "../ui/button"; import { PopoverPrimitive } from "../ui/popover"; import { Select, SelectItem, SelectPopup, SelectTrigger, SelectValue } from "../ui/select"; @@ -44,10 +44,10 @@ export function ModVersionForm({ }; handle: PopoverPrimitive.Handle; }) { - const { electroview } = useRouteContext({ from: "__root__" }); + const { rpc } = useRPC(); const { data: modInfo } = useQuery({ queryKey: ["modInfo", modid], - queryFn: () => electroview.rpc?.request.fetchModInfo({ modid }), + queryFn: () => rpc?.request.fetchModInfo({ modid }), }); const defaultValues: { url: string | null } = { url: From e8c8b5d275fc29c522193a4d3ecf55305fece887 Mon Sep 17 00:00:00 2001 From: Mike Kold Hermann Date: Fri, 20 Mar 2026 10:52:42 +0100 Subject: [PATCH 3/9] feat: replace useRouteContext with useRPC hook --- src/mainview/components/ui/sidebar.tsx | 25 +++++++++++-------------- 1 file changed, 11 insertions(+), 14 deletions(-) diff --git a/src/mainview/components/ui/sidebar.tsx b/src/mainview/components/ui/sidebar.tsx index 2812d60..65b0354 100644 --- a/src/mainview/components/ui/sidebar.tsx +++ b/src/mainview/components/ui/sidebar.tsx @@ -1,7 +1,6 @@ import { mergeProps } from "@base-ui/react/merge-props"; import { useRender } from "@base-ui/react/use-render"; import { keepPreviousData, useMutation, useQuery } from "@tanstack/react-query"; -import { useRouteContext } from "@tanstack/react-router"; import { cva, type VariantProps } from "class-variance-authority"; import { Loader2Icon } from "lucide-react"; import * as React from "react"; @@ -27,6 +26,7 @@ import { import { Skeleton } from "@/mainview/components/ui/skeleton"; import { Tooltip, TooltipContent, TooltipTrigger } from "@/mainview/components/ui/tooltip"; import { useIsMobile } from "@/mainview/hooks/use-mobile"; +import { useRPC } from "@/mainview/hooks/use-rpc"; import { DownloadIcon } from "./icons/download"; const SIDEBAR_COOKIE_NAME = "sidebar_state"; @@ -70,9 +70,7 @@ function SidebarProvider({ open?: boolean; onOpenChange?: (open: boolean) => void; }) { - const { electroview } = useRouteContext({ - from: "__root__", - }); + const { rpc } = useRPC(); const isMobile = useIsMobile(); const [openMobile, setOpenMobile] = React.useState(false); @@ -143,14 +141,14 @@ function SidebarProvider({ const { data: version } = useQuery({ staleTime: 60_000, queryKey: ["version"], - queryFn: () => electroview.rpc?.request.getVersion(), + queryFn: () => rpc?.request.getVersion(), refetchOnMount: false, refetchOnWindowFocus: false, placeholderData: keepPreviousData, }); const { data: availableUpdate } = useQuery({ - queryFn: () => electroview.rpc?.request.getUpdate(), + queryFn: () => rpc?.request.getUpdate(), queryKey: ["availableUpdate"], staleTime: 60_000, }); @@ -160,14 +158,13 @@ function SidebarProvider({ isPending: isDownloading, error, } = useMutation({ - mutationFn: async () => electroview.rpc?.request.downloadUpdate(), - onMutate: () => - electroview.rpc?.addMessageListener("updateFinished", ({ done }) => setCanApply(done)), - onSettled: () => electroview.rpc?.removeMessageListener("updateFinished", () => {}), + mutationFn: async () => rpc?.request.downloadUpdate(), + onMutate: () => rpc?.addMessageListener("updateFinished", ({ done }) => setCanApply(done)), + onSettled: () => rpc?.removeMessageListener("updateFinished", () => {}), }); const { mutate: applyUpdate, isPending: isApplying } = useMutation({ - mutationFn: async () => electroview.rpc?.request.applyUpdate(), + mutationFn: async () => rpc?.request.applyUpdate(), }); return ( @@ -180,7 +177,7 @@ function SidebarProvider({ variant="ghost" className="hover:text-yellow-700 dark:hover:text-yellow-300" size="icon-sm" - onClick={() => electroview.rpc?.request.minimize()} + onClick={() => rpc?.request.minimize()} > @@ -188,7 +185,7 @@ function SidebarProvider({ variant="ghost" className="hover:text-green-700 dark:hover:text-green-300" size="icon-sm" - onClick={() => electroview.rpc?.request.maximize()} + onClick={() => rpc?.request.maximize()} > @@ -196,7 +193,7 @@ function SidebarProvider({ variant="ghost" className="hover:text-destructive" size="icon-sm" - onClick={() => electroview.rpc?.request.quit()} + onClick={() => rpc?.request.quit()} > From a3d58a4729fd9d130ace6ca7e6d74ed8d2966e6f Mon Sep 17 00:00:00 2001 From: Mike Kold Hermann Date: Fri, 20 Mar 2026 10:52:46 +0100 Subject: [PATCH 4/9] feat: replace useRouteContext with useRPC for version fetching --- src/mainview/hooks/use-all-versions.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/mainview/hooks/use-all-versions.ts b/src/mainview/hooks/use-all-versions.ts index 24bcf66..8431f51 100644 --- a/src/mainview/hooks/use-all-versions.ts +++ b/src/mainview/hooks/use-all-versions.ts @@ -1,10 +1,10 @@ import { keepPreviousData, useQuery } from "@tanstack/react-query"; -import { useRouteContext } from "@tanstack/react-router"; +import { useRPC } from "./use-rpc"; export const useAllVersions = () => { - const { electroview } = useRouteContext({ from: "__root__" }); + const { rpc } = useRPC(); return useQuery({ - queryFn: () => electroview.rpc?.request.getAllVersions(), + queryFn: () => rpc?.request.getAllVersions(), queryKey: ["allVersions"], placeholderData: keepPreviousData, refetchOnWindowFocus: false, From 24a40c94b07af77b31152baa3593163cf87720b6 Mon Sep 17 00:00:00 2001 From: Mike Kold Hermann Date: Fri, 20 Mar 2026 10:52:49 +0100 Subject: [PATCH 5/9] feat: replace electroview with rpc in useInstallations --- src/mainview/hooks/use-installations.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/mainview/hooks/use-installations.ts b/src/mainview/hooks/use-installations.ts index 8df3a41..dd780ff 100644 --- a/src/mainview/hooks/use-installations.ts +++ b/src/mainview/hooks/use-installations.ts @@ -1,10 +1,10 @@ import { keepPreviousData, useQuery } from "@tanstack/react-query"; -import { useRouteContext } from "@tanstack/react-router"; +import { useRPC } from "./use-rpc"; export const useInstallations = () => { - const { electroview } = useRouteContext({ from: "__root__" }); + const { rpc } = useRPC(); return useQuery({ - queryFn: () => electroview.rpc?.request.getInstallations(), + queryFn: () => rpc?.request.getInstallations(), queryKey: ["installations"], placeholderData: keepPreviousData, refetchOnWindowFocus: false, From c244a29d6b67c9bde51c2169c60b7dfe8730ed4a Mon Sep 17 00:00:00 2001 From: Mike Kold Hermann Date: Fri, 20 Mar 2026 10:52:55 +0100 Subject: [PATCH 6/9] feat: replace useRouteContext with useRPC for installed versions query --- src/mainview/hooks/use-installed-versions.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/mainview/hooks/use-installed-versions.ts b/src/mainview/hooks/use-installed-versions.ts index 5c4f07f..525130c 100644 --- a/src/mainview/hooks/use-installed-versions.ts +++ b/src/mainview/hooks/use-installed-versions.ts @@ -1,10 +1,10 @@ import { keepPreviousData, useQuery } from "@tanstack/react-query"; -import { useRouteContext } from "@tanstack/react-router"; +import { useRPC } from "./use-rpc"; export const useInstalledVersions = () => { - const { electroview } = useRouteContext({ from: "__root__" }); + const { rpc } = useRPC(); return useQuery({ - queryFn: () => electroview.rpc?.request.getInstalledVersions(), + queryFn: () => rpc?.request.getInstalledVersions(), queryKey: ["installedVersions"], placeholderData: keepPreviousData, refetchOnWindowFocus: false, From c0a3e86f933694e8bbd966265ef736f106713772 Mon Sep 17 00:00:00 2001 From: Mike Kold Hermann Date: Fri, 20 Mar 2026 10:52:59 +0100 Subject: [PATCH 7/9] Refactor: Replace useRouteContext with useRPC hook Replace all instances of electroview.rpc with rpc from the new useRPC hook --- src/mainview/hooks/use-mod-mutations.ts | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/src/mainview/hooks/use-mod-mutations.ts b/src/mainview/hooks/use-mod-mutations.ts index 3e5f891..7506917 100644 --- a/src/mainview/hooks/use-mod-mutations.ts +++ b/src/mainview/hooks/use-mod-mutations.ts @@ -1,6 +1,6 @@ import { useMutation, type UseMutateAsyncFunction } from "@tanstack/react-query"; -import { useRouteContext } from "@tanstack/react-router"; import { compareVersions, parseVersion } from "@/lib/utils"; +import { useRPC } from "./use-rpc"; export type RemoveModFunction = UseMutateAsyncFunction< { success: boolean; message?: string } | undefined, @@ -41,11 +41,11 @@ export function useModMutations({ updateDownloadingMod, removeDownloadingMod, }: UseModMutationsProps) { - const { electroview } = useRouteContext({ from: "__root__" }); + const { rpc } = useRPC(); const { mutateAsync: removeMod } = useMutation({ mutationFn: async ({ modzip }: { modzip: string }) => - electroview.rpc?.request.removeMod({ modzip: modzip, path }), + rpc?.request.removeMod({ modzip: modzip, path }), onSuccess: async (resp) => { if (resp?.success) { await refetchInstalledMods(); @@ -56,7 +56,7 @@ export function useModMutations({ }); const { mutate: cancelDownload } = useMutation({ - mutationFn: async (modid: number) => electroview.rpc?.request.cancelModDownload({ modid }), + mutationFn: async (modid: number) => rpc?.request.cancelModDownload({ modid }), onSuccess: (_, modid) => { removeDownloadingMod(modid); }, @@ -64,7 +64,7 @@ export function useModMutations({ const { mutateAsync: downloadMod } = useMutation({ mutationFn: async ({ url, modid }: { url: string; modid: number }) => - electroview.rpc?.request.installMod({ url, path, modid }), + rpc?.request.installMod({ url, path, modid }), onError: (_, options) => { removeDownloadingMod(options.modid); }, @@ -103,19 +103,19 @@ export function useModMutations({ if (status === "completed" || status === "error" || status === "cancelled") { removeDownloadingMod(options.modid); - electroview.rpc?.removeMessageListener("downloadModProgress", handleProgress); - electroview.rpc?.removeMessageListener("downloadModStatus", handleStatus); + rpc?.removeMessageListener("downloadModProgress", handleProgress); + rpc?.removeMessageListener("downloadModStatus", handleStatus); } }; - electroview.rpc?.addMessageListener("downloadModProgress", handleProgress); - electroview.rpc?.addMessageListener("downloadModStatus", handleStatus); + rpc?.addMessageListener("downloadModProgress", handleProgress); + rpc?.addMessageListener("downloadModStatus", handleStatus); }, }); const { mutate: downloadLatest } = useMutation({ mutationFn: async (modid: number) => { - const modInfo = await electroview.rpc?.request.fetchModInfo({ modid }); + const modInfo = await rpc?.request.fetchModInfo({ modid }); const latestVersion = modInfo?.mod?.releases ?.sort( (a, b) => compareVersions(parseVersion(a.modversion), parseVersion(b.modversion)) || 0, From 74a55115aa7c06b3946ff38f975a78acd392715f Mon Sep 17 00:00:00 2001 From: Mike Kold Hermann Date: Fri, 20 Mar 2026 10:53:04 +0100 Subject: [PATCH 8/9] feat: replace electroview.rpc with useRPC hook --- src/mainview/hooks/use-mod-queries.ts | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/mainview/hooks/use-mod-queries.ts b/src/mainview/hooks/use-mod-queries.ts index 51123e3..f148fe2 100644 --- a/src/mainview/hooks/use-mod-queries.ts +++ b/src/mainview/hooks/use-mod-queries.ts @@ -1,6 +1,6 @@ import { useQuery, keepPreviousData, useMutation } from "@tanstack/react-query"; -import { useRouteContext } from "@tanstack/react-router"; import { useMemo } from "react"; +import { useRPC } from "./use-rpc"; interface UseModQueriesProps { path: string; @@ -9,12 +9,12 @@ interface UseModQueriesProps { } export function useModQueries({ path, debouncedSearch, debouncedVersions }: UseModQueriesProps) { - const { electroview } = useRouteContext({ from: "__root__" }); + const { rpc } = useRPC(); const { data: installedMods, refetch: refetchInstalledMods } = useQuery({ queryKey: ["installedMods", path], queryFn: () => - electroview.rpc?.request.getInstalledMods({ + rpc?.request.getInstalledMods({ path, }), staleTime: 10 * 60 * 1000, @@ -23,7 +23,7 @@ export function useModQueries({ path, debouncedSearch, debouncedVersions }: UseM const { data: modsData } = useQuery({ queryKey: ["mods", debouncedSearch, debouncedVersions], queryFn: () => - electroview.rpc?.request.fetchMods({ + rpc?.request.fetchMods({ search: debouncedSearch, versions: debouncedVersions.map((v) => v.value), }), @@ -40,7 +40,7 @@ export function useModQueries({ path, debouncedSearch, debouncedVersions }: UseM queryKey: ["modUpdates", modsString], queryFn: async () => { if (!modsString) return {}; - return electroview.rpc?.request.fetchModUpdates({ modsString }); + return rpc?.request.fetchModUpdates({ modsString }); }, enabled: !!modsString, staleTime: 5 * 60 * 1000, @@ -62,7 +62,7 @@ export function useModQueries({ path, debouncedSearch, debouncedVersions }: UseM }, [installedMods, modsData]); const { mutate: openLink } = useMutation({ - mutationFn: async (url: string) => electroview.rpc?.request.openLink({ url }), + mutationFn: async (url: string) => rpc?.request.openLink({ url }), }); return { From b73a2c4e50e266bcd999675a85341ac1b084188d Mon Sep 17 00:00:00 2001 From: Mike Kold Hermann Date: Fri, 20 Mar 2026 10:53:19 +0100 Subject: [PATCH 9/9] feat: replace electroview.rpc with useRPC hook --- src/mainview/hooks/use-mods.ts | 12 +++++----- src/mainview/hooks/use-servers.ts | 6 ++--- src/mainview/hooks/use-worlds.ts | 6 ++--- src/mainview/routes/installations/index.tsx | 23 ++++++++++---------- src/mainview/routes/installations/logs.tsx | 17 ++++++++------- src/mainview/routes/installations/worlds.tsx | 21 +++++++++--------- src/mainview/routes/servers/public.tsx | 7 +++--- src/mainview/routes/versions/index.tsx | 19 ++++++++-------- 8 files changed, 58 insertions(+), 53 deletions(-) diff --git a/src/mainview/hooks/use-mods.ts b/src/mainview/hooks/use-mods.ts index dbf880d..f80cd3f 100644 --- a/src/mainview/hooks/use-mods.ts +++ b/src/mainview/hooks/use-mods.ts @@ -1,8 +1,8 @@ import { useQuery, keepPreviousData, useMutation } from "@tanstack/react-query"; -import { useRouteContext } from "@tanstack/react-router"; import { useMemo, useReducer } from "react"; import { initialFilterState, filterReducer, type SortingOption } from "@/mainview/types/mods"; import useDebounce from "./use-debounce"; +import { useRPC } from "./use-rpc"; interface UseModsReturn { // Query results @@ -31,7 +31,7 @@ interface UseModsReturn { } export function useMods(path: string): UseModsReturn { - const { electroview } = useRouteContext({ from: "__root__" }); + const { rpc } = useRPC(); const [filterState, filterDispatch] = useReducer(filterReducer, initialFilterState); const { sorting, showOnlyInstalled, search, author, versions } = filterState; @@ -44,7 +44,7 @@ export function useMods(path: string): UseModsReturn { const { data: installedMods, refetch: refetchInstalledMods } = useQuery({ queryKey: ["installedMods", path], queryFn: () => - electroview.rpc?.request.getInstalledMods({ + rpc?.request.getInstalledMods({ path, }), staleTime: 10 * 60 * 1000, @@ -54,7 +54,7 @@ export function useMods(path: string): UseModsReturn { const { data: modsData } = useQuery({ queryKey: ["mods", debouncedSearch, debouncedVersions], queryFn: () => - electroview.rpc?.request.fetchMods({ + rpc?.request.fetchMods({ search: debouncedSearch, versions: debouncedVersions.map((v) => v.value), }), @@ -73,7 +73,7 @@ export function useMods(path: string): UseModsReturn { queryKey: ["modUpdates", modsString], queryFn: async () => { if (!modsString) return {}; - return electroview.rpc?.request.fetchModUpdates({ modsString }); + return rpc?.request.fetchModUpdates({ modsString }); }, enabled: !!modsString, staleTime: 5 * 60 * 1000, @@ -136,7 +136,7 @@ export function useMods(path: string): UseModsReturn { // Open link mutation const { mutate: openLink } = useMutation({ - mutationFn: async (url: string) => electroview.rpc?.request.openLink({ url }), + mutationFn: async (url: string) => rpc?.request.openLink({ url }), }); return { diff --git a/src/mainview/hooks/use-servers.ts b/src/mainview/hooks/use-servers.ts index e0abf4b..356ef9a 100644 --- a/src/mainview/hooks/use-servers.ts +++ b/src/mainview/hooks/use-servers.ts @@ -1,10 +1,10 @@ import { keepPreviousData, useQuery } from "@tanstack/react-query"; -import { useRouteContext } from "@tanstack/react-router"; +import { useRPC } from "./use-rpc"; export const useServers = () => { - const { electroview } = useRouteContext({ from: "__root__" }); + const { rpc } = useRPC(); return useQuery({ - queryFn: () => electroview.rpc?.request.getServers(), + queryFn: () => rpc?.request.getServers(), queryKey: ["servers"], placeholderData: keepPreviousData, refetchOnWindowFocus: false, diff --git a/src/mainview/hooks/use-worlds.ts b/src/mainview/hooks/use-worlds.ts index 8f34e52..b8e5dc9 100644 --- a/src/mainview/hooks/use-worlds.ts +++ b/src/mainview/hooks/use-worlds.ts @@ -1,10 +1,10 @@ import { keepPreviousData, useQuery } from "@tanstack/react-query"; -import { useRouteContext } from "@tanstack/react-router"; +import { useRPC } from "./use-rpc"; export const useWorlds = () => { - const { electroview } = useRouteContext({ from: "__root__" }); + const { rpc } = useRPC(); return useQuery({ - queryFn: () => electroview.rpc?.request.getWorlds(), + queryFn: () => rpc?.request.getWorlds(), queryKey: ["worlds"], placeholderData: keepPreviousData, refetchOnWindowFocus: false, diff --git a/src/mainview/routes/installations/index.tsx b/src/mainview/routes/installations/index.tsx index 14b7eee..d9abfd3 100644 --- a/src/mainview/routes/installations/index.tsx +++ b/src/mainview/routes/installations/index.tsx @@ -33,6 +33,7 @@ import { } from "@/mainview/components/ui/tooltip"; import { useInstallations } from "@/mainview/hooks/use-installations"; import { useInstalledVersions } from "@/mainview/hooks/use-installed-versions"; +import { useRPC } from "@/mainview/hooks/use-rpc"; import { useDownloadsStore } from "@/mainview/stores/downloads.store"; export const Route = createFileRoute("/installations/")({ @@ -81,7 +82,7 @@ function RouteComponent() { }, }); const navigate = useNavigate(); - const { electroview } = Route.useRouteContext(); + const { rpc } = useRPC(); const deleteTimeoutRef = useRef(null); const downloadingVersions = useDownloadsStore((state) => state.downloadingVersions); const addDownloadingVersion = useDownloadsStore((state) => state.addDownloadingVersion); @@ -98,7 +99,7 @@ function RouteComponent() { version: { label: string; value: string }; startParams: string; }) => - electroview.rpc?.request.createInstallation({ + rpc?.request.createInstallation({ name: values.name, version: values.version.value, startParams: values.startParams, @@ -114,25 +115,25 @@ function RouteComponent() { }); const { mutate: cancelDownload } = useMutation({ - mutationFn: async (version: string) => electroview.rpc?.request.cancelDownload({ version }), + mutationFn: async (version: string) => rpc?.request.cancelDownload({ version }), }); const { mutate: playInstallation } = useMutation({ - mutationFn: async (path: string) => electroview.rpc?.request.playWithInstallation({ path }), + mutationFn: async (path: string) => rpc?.request.playWithInstallation({ path }), onError: (error) => { console.error("Failed to play with installation:", error); }, }); const { mutate: openInstallationFolder } = useMutation({ - mutationFn: async (path: string) => electroview.rpc?.request.openInstallationFolder({ path }), + mutationFn: async (path: string) => rpc?.request.openInstallationFolder({ path }), onError: (error) => { console.error("Failed to open installation folder:", error); }, }); const { mutate: deleteInstallation } = useMutation({ - mutationFn: async (path: string) => electroview.rpc?.request.deleteInstallation({ path }), + mutationFn: async (path: string) => rpc?.request.deleteInstallation({ path }), onError: (error) => { console.error("Failed to delete installation:", error); }, @@ -146,7 +147,7 @@ function RouteComponent() { }); const { mutate: downloadVersion } = useMutation({ - mutationFn: async (version: string) => electroview.rpc?.request.downloadVersion({ version }), + mutationFn: async (version: string) => rpc?.request.downloadVersion({ version }), onError: (_, version) => { // Remove from downloading list on error (including cancellation) removeDownloadingVersion(version); @@ -200,14 +201,14 @@ function RouteComponent() { // Remove listeners when download ends (completed, error, or cancelled) if (status === "completed" || status === "error" || status === "cancelled") { removeDownloadingVersion(version); - electroview.rpc?.removeMessageListener("downloadProgress", handleProgress); - electroview.rpc?.removeMessageListener("downloadStatus", handleStatus); + rpc?.removeMessageListener("downloadProgress", handleProgress); + rpc?.removeMessageListener("downloadStatus", handleStatus); } }; // Listen for progress updates - electroview.rpc?.addMessageListener("downloadProgress", handleProgress); - electroview.rpc?.addMessageListener("downloadStatus", handleStatus); + rpc?.addMessageListener("downloadProgress", handleProgress); + rpc?.addMessageListener("downloadStatus", handleStatus); }, }); diff --git a/src/mainview/routes/installations/logs.tsx b/src/mainview/routes/installations/logs.tsx index 9956d92..9da81b3 100644 --- a/src/mainview/routes/installations/logs.tsx +++ b/src/mainview/routes/installations/logs.tsx @@ -1,10 +1,11 @@ import { useQuery } from "@tanstack/react-query"; -import { createFileRoute, useRouteContext } from "@tanstack/react-router"; +import { createFileRoute } from "@tanstack/react-router"; import { useEffect, useRef, useState } from "react"; import * as v from "valibot"; import { cn } from "@/lib/utils"; import { ScrollArea } from "@/mainview/components/ui/scroll-area"; import { Tabs, TabsList, TabsPanel, TabsTab } from "@/mainview/components/ui/tabs"; +import { useRPC } from "@/mainview/hooks/use-rpc"; const SearchSchema = v.object({ path: v.string(), @@ -96,7 +97,7 @@ function LogLineComponent({ line }: { line: LogLine }) { function RouteComponent() { const { path } = Route.useSearch(); - const { electroview } = useRouteContext({ from: "__root__" }); + const { rpc } = useRPC(); const [logs, setLogs] = useState>({ main: "", chat: "", @@ -113,7 +114,7 @@ function RouteComponent() { const { data: initialLogs } = useQuery({ queryKey: ["logs", path], queryFn: async () => { - const result = await electroview.rpc?.request.getLogs({ path }); + const result = await rpc?.request.getLogs({ path }); return result; }, }); @@ -128,7 +129,7 @@ function RouteComponent() { // Start log watcher on mount useEffect(() => { // Start watching logs - void electroview.rpc?.request.startLogWatcher({ path }); + void rpc?.request.startLogWatcher({ path }); // Set up message listener for live updates const handleLogUpdate = ({ installationPath, logType, newContent }: LogUpdateEvent) => { @@ -140,14 +141,14 @@ function RouteComponent() { } }; - electroview.rpc?.addMessageListener("logUpdate", handleLogUpdate); + rpc?.addMessageListener("logUpdate", handleLogUpdate); return () => { // Clean up on unmount - void electroview.rpc?.request.stopLogWatcher({ path }); - electroview.rpc?.removeMessageListener("logUpdate", handleLogUpdate); + void rpc?.request.stopLogWatcher({ path }); + rpc?.removeMessageListener("logUpdate", handleLogUpdate); }; - }, [path, electroview]); + }, [path, rpc]); // Auto-scroll to bottom when logs change useEffect(() => { diff --git a/src/mainview/routes/installations/worlds.tsx b/src/mainview/routes/installations/worlds.tsx index 4f18fa9..b58b571 100644 --- a/src/mainview/routes/installations/worlds.tsx +++ b/src/mainview/routes/installations/worlds.tsx @@ -24,6 +24,7 @@ import { TooltipTrigger, } from "@/mainview/components/ui/tooltip"; import { useInstalledVersions } from "@/mainview/hooks/use-installed-versions"; +import { useRPC } from "@/mainview/hooks/use-rpc"; import { useWorlds } from "@/mainview/hooks/use-worlds"; import { useDownloadsStore } from "@/mainview/stores/downloads.store"; @@ -40,7 +41,7 @@ const tooltipHandle = TooltipCreateHandle(); function RouteComponent() { const navigate = useNavigate(); - const { electroview } = Route.useRouteContext(); + const { rpc } = useRPC(); const deleteTimeoutRef = useRef(null); const downloadingVersions = useDownloadsStore((state) => state.downloadingVersions); const addDownloadingVersion = useDownloadsStore((state) => state.addDownloadingVersion); @@ -51,26 +52,26 @@ function RouteComponent() { const { data: installedVersions, refetch: refetchInstalledVersions } = useInstalledVersions(); const { mutate: cancelDownload } = useMutation({ - mutationFn: async (version: string) => electroview.rpc?.request.cancelDownload({ version }), + mutationFn: async (version: string) => rpc?.request.cancelDownload({ version }), }); const { mutate: playWorld } = useMutation({ mutationFn: async ({ path, world }: { path: string; world: string }) => - electroview.rpc?.request.playWithInstallation({ path, world }), + rpc?.request.playWithInstallation({ path, world }), onError: (error) => { console.error("Failed to play with installation:", error); }, }); const { mutate: openInstallationFolder } = useMutation({ - mutationFn: async (path: string) => electroview.rpc?.request.openInstallationFolder({ path }), + mutationFn: async (path: string) => rpc?.request.openInstallationFolder({ path }), onError: (error) => { console.error("Failed to open installation folder:", error); }, }); const { mutate: deleteWorld } = useMutation({ - mutationFn: async (path: string) => electroview.rpc?.request.deleteWorld({ path }), + mutationFn: async (path: string) => rpc?.request.deleteWorld({ path }), onError: (error) => { console.error("Failed to delete world:", error); }, @@ -84,7 +85,7 @@ function RouteComponent() { }); const { mutate: downloadVersion } = useMutation({ - mutationFn: async (version: string) => electroview.rpc?.request.downloadVersion({ version }), + mutationFn: async (version: string) => rpc?.request.downloadVersion({ version }), onError: (_, version) => { // Remove from downloading list on error (including cancellation) removeDownloadingVersion(version); @@ -138,14 +139,14 @@ function RouteComponent() { // Remove listeners when download ends (completed, error, or cancelled) if (status === "completed" || status === "error" || status === "cancelled") { removeDownloadingVersion(version); - electroview.rpc?.removeMessageListener("downloadProgress", handleProgress); - electroview.rpc?.removeMessageListener("downloadStatus", handleStatus); + rpc?.removeMessageListener("downloadProgress", handleProgress); + rpc?.removeMessageListener("downloadStatus", handleStatus); } }; // Listen for progress updates - electroview.rpc?.addMessageListener("downloadProgress", handleProgress); - electroview.rpc?.addMessageListener("downloadStatus", handleStatus); + rpc?.addMessageListener("downloadProgress", handleProgress); + rpc?.addMessageListener("downloadStatus", handleStatus); }, }); diff --git a/src/mainview/routes/servers/public.tsx b/src/mainview/routes/servers/public.tsx index 75e18fc..94aa9e1 100644 --- a/src/mainview/routes/servers/public.tsx +++ b/src/mainview/routes/servers/public.tsx @@ -1,6 +1,6 @@ import { formatForDisplay, useHotkey } from "@tanstack/react-hotkeys"; import { useQuery } from "@tanstack/react-query"; -import { createFileRoute, useRouteContext } from "@tanstack/react-router"; +import { createFileRoute } from "@tanstack/react-router"; import { useVirtualizer } from "@tanstack/react-virtual"; import { ListCheckIcon, LockIcon, Package2Icon, ZapIcon } from "lucide-react"; import { Variants } from "motion/react"; @@ -23,6 +23,7 @@ import { TooltipPopup, TooltipTrigger, } from "@/mainview/components/ui/tooltip"; +import { useRPC } from "@/mainview/hooks/use-rpc"; export const Route = createFileRoute("/servers/public")({ component: RouteComponent, @@ -36,10 +37,10 @@ const variations = { } as Variants; function RouteComponent() { - const { electroview } = useRouteContext({ from: "__root__" }); + const { rpc } = useRPC(); const { data: publicServers } = useQuery({ - queryFn: () => electroview.rpc?.request.getPublicServers(), + queryFn: () => rpc?.request.getPublicServers(), queryKey: ["publicServers"], staleTime: 1000 * 60, // 1 minute }); diff --git a/src/mainview/routes/versions/index.tsx b/src/mainview/routes/versions/index.tsx index 03a0e56..d5e5f7a 100644 --- a/src/mainview/routes/versions/index.tsx +++ b/src/mainview/routes/versions/index.tsx @@ -23,6 +23,7 @@ import { TooltipTrigger, } from "@/mainview/components/ui/tooltip"; import { useInstalledVersions } from "@/mainview/hooks/use-installed-versions"; +import { useRPC } from "@/mainview/hooks/use-rpc"; import { useDownloadsStore } from "@/mainview/stores/downloads.store"; export const Route = createFileRoute("/versions/")({ @@ -37,7 +38,7 @@ const variations = { const tooltipHandle = TooltipCreateHandle(); function RouteComponent() { - const { electroview } = Route.useRouteContext(); + const { rpc } = useRPC(); const [selectedVersion, setSelectedVersion] = useState<{ label: string; value: string; @@ -51,14 +52,14 @@ function RouteComponent() { const { data: installedVersions, refetch } = useInstalledVersions(); const { mutate: cancelDownload } = useMutation({ - mutationFn: async (version: string) => electroview.rpc?.request.cancelDownload({ version }), + mutationFn: async (version: string) => rpc?.request.cancelDownload({ version }), onSuccess: (_, version) => { removeDownloadingVersion(version); }, }); const { mutate: downloadVersion } = useMutation({ - mutationFn: async (version: string) => electroview.rpc?.request.downloadVersion({ version }), + mutationFn: async (version: string) => rpc?.request.downloadVersion({ version }), onError: (_, version) => { // Remove from downloading list on error (including cancellation) removeDownloadingVersion(version); @@ -109,24 +110,24 @@ function RouteComponent() { // Remove listeners when download ends (completed, error, or cancelled) if (status === "completed" || status === "error" || status === "cancelled") { removeDownloadingVersion(version); - electroview.rpc?.removeMessageListener("downloadProgress", handleProgress); - electroview.rpc?.removeMessageListener("downloadStatus", handleStatus); + rpc?.removeMessageListener("downloadProgress", handleProgress); + rpc?.removeMessageListener("downloadStatus", handleStatus); } }; // Listen for progress updates - electroview.rpc?.addMessageListener("downloadProgress", handleProgress); - electroview.rpc?.addMessageListener("downloadStatus", handleStatus); + rpc?.addMessageListener("downloadProgress", handleProgress); + rpc?.addMessageListener("downloadStatus", handleStatus); }, }); const { mutate: openVersionFolder } = useMutation({ - mutationFn: async (version: string) => electroview.rpc?.request.openVersionFolder({ version }), + mutationFn: async (version: string) => rpc?.request.openVersionFolder({ version }), onError: (error) => console.error("Failed to open version folder:", error), }); const { mutate: deleteVersion } = useMutation({ - mutationFn: async (version: string) => electroview.rpc?.request.deleteVersion({ version }), + mutationFn: async (version: string) => rpc?.request.deleteVersion({ version }), onError: (error) => console.error("Failed to delete version:", error), onSuccess: (success, version) => success ? refetch() : console.error("Version folder not found for deletion:", version),