From 24e45169786b1f4ccf3b7b141c7a6e6675875c37 Mon Sep 17 00:00:00 2001 From: str1k3r <115313679+S1l3ntStr1ke87@users.noreply.github.com> Date: Fri, 10 Jul 2026 22:55:42 -0400 Subject: [PATCH] fix: lceonline joining & add invite notification (#125) --- src/components/modals/ChooseInstanceModal.tsx | 8 +++--- src/components/views/LceOnlineView.tsx | 8 +++--- src/hooks/useLceOnlineNotifications.ts | 27 ++++++++++++++++--- src/pages/App.tsx | 14 +++++++++- 4 files changed, 45 insertions(+), 12 deletions(-) diff --git a/src/components/modals/ChooseInstanceModal.tsx b/src/components/modals/ChooseInstanceModal.tsx index 77827d9..39a3e0d 100644 --- a/src/components/modals/ChooseInstanceModal.tsx +++ b/src/components/modals/ChooseInstanceModal.tsx @@ -5,11 +5,11 @@ import { lceOnlineService } from "../../services/LceOnlineService"; import type { Edition } from "../../types/edition"; interface GameInvite { inviteId: string; - from: string | { displayName: string }; + from: string; hostIp: string; hostPort: number; hostName: string; - signalingSessionId?: string; + sessionId?: string; status: string; } @@ -62,7 +62,7 @@ export default function ChooseInstanceModal({ setError(""); setStatus("Launching game..."); try { - const sessionId = invite.signalingSessionId || ""; + const sessionId = invite.sessionId || ""; if (sessionId) { setStatus("Connecting via relay..."); const accessToken = lceOnlineService.accessToken ?? ""; @@ -142,7 +142,7 @@ export default function ChooseInstanceModal({ const hostName = invite ? typeof invite.from === "string" ? invite.from - : invite.from.displayName + : invite.hostName : ""; return ( diff --git a/src/components/views/LceOnlineView.tsx b/src/components/views/LceOnlineView.tsx index f76764a..83b0e04 100644 --- a/src/components/views/LceOnlineView.tsx +++ b/src/components/views/LceOnlineView.tsx @@ -32,7 +32,7 @@ const LceOnlineView = memo(function LceOnlineView({ const [addFriendUsername, setAddFriendUsername] = useState(""); const addFriendInputRef = useRef(null); const [errorModal, setErrorModal] = useState(null); - const [joinTarget, setJoinTarget] = useState<{ sessionId: string; hostName: string } | null>(null); + const [joinTarget, setJoinTarget] = useState<{ inviteid: string, sessionId: string; hostName: string } | null>(null); const [authMode, setAuthMode] = useState<"login" | "register">("login"); const [authUsername, setAuthUsername] = useState(""); const [authPassword, setAuthPassword] = useState(""); @@ -204,7 +204,7 @@ const LceOnlineView = memo(function LceOnlineView({ onClick: () => handleAction(async () => { const sessionId = await lceOnlineService.acceptInvite(inv.from.username); - setJoinTarget({ sessionId, hostName: inv.from.username }); + setJoinTarget({ inviteid: inv.inviteid, sessionId, hostName: inv.from.username }); }), onClickSecondary: () => handleAction(() => lceOnlineService.declineInvite(inv.from.username)), @@ -775,12 +775,12 @@ const LceOnlineView = memo(function LceOnlineView({ editions={game.editions} installs={game.installs} invite={{ - inviteId: joinTarget.sessionId, + inviteId: joinTarget.inviteid, from: joinTarget.hostName, hostIp: "", hostPort: 0, hostName: joinTarget.hostName, - signalingSessionId: joinTarget.sessionId, + sessionId: joinTarget.sessionId, status: "pending", }} /> diff --git a/src/hooks/useLceOnlineNotifications.ts b/src/hooks/useLceOnlineNotifications.ts index 2562992..0f6617e 100644 --- a/src/hooks/useLceOnlineNotifications.ts +++ b/src/hooks/useLceOnlineNotifications.ts @@ -2,8 +2,10 @@ import { useState, useEffect, useRef } from "react"; import { lceOnlineService } from "../services/LceOnlineService"; export function useLceOnlineNotifications() { const [friendRequestMessage, setFriendRequestMessage] = useState(null); + const [InviteMessage, setInviteMessage] = useState(null); const [invites, setInvites] = useState>([]); const seenRequests = useRef>(new Set()); + const seenInvites = useRef>(new Set()); useEffect(() => { let pollInterval: ReturnType; @@ -14,13 +16,19 @@ export function useLceOnlineNotifications() { lists.requests.forEach((r: string) => { if (!seenRequests.current.has(r)) { seenRequests.current.add(r); - setFriendRequestMessage(`New request from ${r}`); + setFriendRequestMessage(`New Friend request from ${r}`); } }); } catch (e) { } try { const invitesData = await lceOnlineService.getInvites(); setInvites(invitesData); + invitesData.forEach((i) => { + if (!seenInvites.current.has(i.inviteid)) { + seenInvites.current.add(i.inviteid); + setInviteMessage(`New invite from ${i.from.username}`); + } + }); } catch { } }; @@ -28,11 +36,22 @@ export function useLceOnlineNotifications() { if (lceOnlineService.signedIn) { try { const lists = await lceOnlineService.getSocialLists(); - lists.requests.forEach((r: string) => seenRequests.current.add(r)); + lists.requests.forEach((r: string) => { + if (!seenRequests.current.has(r)) { + seenRequests.current.add(r); + setFriendRequestMessage(`New Friend request from ${r}`); + } + }); } catch (e) { } try { const invitesData = await lceOnlineService.getInvites(); setInvites(invitesData); + invitesData.forEach((i) => { + if (!seenInvites.current.has(i.inviteid)) { + seenInvites.current.add(i.inviteid); + setInviteMessage(`New invite from ${i.from.username}`); + } + }); } catch { } } pollInterval = setInterval(poll, 10000); @@ -46,7 +65,9 @@ export function useLceOnlineNotifications() { return { friendRequestMessage, + InviteMessage, clearFriendRequestMessage: () => setFriendRequestMessage(null), - invites, + clearInviteMessage: () => setInviteMessage(null), + invites }; } diff --git a/src/pages/App.tsx b/src/pages/App.tsx index f2e5218..172751f 100644 --- a/src/pages/App.tsx +++ b/src/pages/App.tsx @@ -70,8 +70,10 @@ export default function App() { const notifications = useLceOnlineNotifications(); const { friendRequestMessage, + InviteMessage, clearFriendRequestMessage, - invites, + clearInviteMessage, + invites } = notifications; const [showSetup, setShowSetup] = useState(false); const [isSetupChecked, setIsSetupChecked] = useState(false); @@ -668,6 +670,16 @@ export default function App() { variant="update" /> + { + clearInviteMessage(); + setActiveView("lceonline"); + }} + title="Game Invite" + variant="update" + /> );