diff --git a/src/typescript/frontend/src/app/home/HomePage.tsx b/src/typescript/frontend/src/app/home/HomePage.tsx
index 40593916d..6d6fc48e6 100644
--- a/src/typescript/frontend/src/app/home/HomePage.tsx
+++ b/src/typescript/frontend/src/app/home/HomePage.tsx
@@ -1,3 +1,4 @@
+import { SubscribeToHomePageEvents } from "@/components/pages/home/components/SubscribeToHomePageEvents";
import { ARENA_MODULE_ADDRESS } from "@sdk/const";
import {
type ArenaInfoModel,
@@ -67,6 +68,7 @@ export default async function HomePageComponent({
sortBy={sortBy}
searchBytes={searchBytes}
/>
+
);
}
diff --git a/src/typescript/frontend/src/components/pages/home/components/SubscribeToHomePageEvents.tsx b/src/typescript/frontend/src/components/pages/home/components/SubscribeToHomePageEvents.tsx
new file mode 100644
index 000000000..48ed72721
--- /dev/null
+++ b/src/typescript/frontend/src/components/pages/home/components/SubscribeToHomePageEvents.tsx
@@ -0,0 +1,22 @@
+"use client";
+
+import { useReliableSubscribe } from "@hooks/use-reliable-subscribe";
+import { type ArenaInfoModel } from "@sdk/indexer-v2";
+import { useEventStore } from "context/event-store-context";
+import { useEffect } from "react";
+
+export const SubscribeToHomePageEvents = ({ info }: { info?: ArenaInfoModel }) => {
+ const loadArenaInfoFromServer = useEventStore((s) => s.loadArenaInfoFromServer);
+ useEffect(() => {
+ if (info) {
+ loadArenaInfoFromServer(info);
+ }
+ }, [loadArenaInfoFromServer, info]);
+
+ useReliableSubscribe({
+ arena: true,
+ eventTypes: ["MarketLatestState"],
+ });
+
+ return <>>;
+};
diff --git a/src/typescript/frontend/src/components/pages/home/components/emoji-table/index.tsx b/src/typescript/frontend/src/components/pages/home/components/emoji-table/index.tsx
index 831831a68..cfe99dc6d 100644
--- a/src/typescript/frontend/src/components/pages/home/components/emoji-table/index.tsx
+++ b/src/typescript/frontend/src/components/pages/home/components/emoji-table/index.tsx
@@ -31,7 +31,6 @@ import { Text } from "components/text";
import Link from "next/link";
import { ROUTES } from "router/routes";
import { type HomePageProps } from "app/home/HomePage";
-import { useReliableSubscribe } from "@hooks/use-reliable-subscribe";
import { SortMarketsBy } from "@sdk/indexer-v2/types/common";
import { Emoji } from "utils/emoji";
@@ -99,10 +98,6 @@ const EmojiTable = (props: EmojiTableProps) => {
const rowLength = useGridRowLength();
- useReliableSubscribe({
- eventTypes: ["MarketLatestState"],
- });
-
return (
<>
{
+ const melees = useEventStore((s) => s.meleeEvents);
+
+ const latest = useMemo(
+ () =>
+ melees
+ .map(({ melee }) => melee.meleeID)
+ .sort()
+ .at(-1) ?? -1n,
+ [melees]
+ );
+
+ return latest;
+};
diff --git a/src/typescript/frontend/src/hooks/use-reliable-subscribe.ts b/src/typescript/frontend/src/hooks/use-reliable-subscribe.ts
index 09ff77675..057b11576 100644
--- a/src/typescript/frontend/src/hooks/use-reliable-subscribe.ts
+++ b/src/typescript/frontend/src/hooks/use-reliable-subscribe.ts
@@ -15,28 +15,18 @@ export const useReliableSubscribe = (args: ReliableSubscribeArgs) => {
const { eventTypes, arena } = args;
const subscribeEvents = useEventStore((s) => s.subscribeEvents);
const unsubscribeEvents = useEventStore((s) => s.unsubscribeEvents);
- const subscribeArena = useEventStore((s) => s.subscribeArena);
- const unsubscribeArena = useEventStore((s) => s.unsubscribeArena);
useEffect(() => {
// Don't subscribe right away, to let other components unmounting time to unsubscribe, that way
// components unmounting don't undo/overwrite another component subscribing.
const timeout = window.setTimeout(() => {
- subscribeEvents(eventTypes);
- if (arena) {
- subscribeArena();
- } else {
- unsubscribeArena();
- }
+ subscribeEvents(eventTypes, arena);
}, 250);
// Unsubscribe from all topics passed into the hook when the component unmounts.
return () => {
clearTimeout(timeout);
- unsubscribeEvents(eventTypes);
- if (arena) {
- unsubscribeArena();
- }
+ unsubscribeEvents(eventTypes, arena);
};
- }, [eventTypes, arena, subscribeEvents, unsubscribeEvents, subscribeArena, unsubscribeArena]);
+ }, [eventTypes, arena, subscribeEvents, unsubscribeEvents]);
};
diff --git a/src/typescript/frontend/src/lib/store/arena/store.ts b/src/typescript/frontend/src/lib/store/arena/store.ts
new file mode 100644
index 000000000..91c504d63
--- /dev/null
+++ b/src/typescript/frontend/src/lib/store/arena/store.ts
@@ -0,0 +1,36 @@
+import {
+ type ArenaMeleeModel,
+ type ArenaEnterModel,
+ type ArenaExitModel,
+ type ArenaSwapModel,
+ type ArenaInfoModel,
+} from "@sdk/indexer-v2";
+import { type WritableDraft } from "immer";
+
+export type MeleeState = {
+ swaps: readonly ArenaSwapModel[];
+ enters: readonly ArenaEnterModel[];
+ exits: readonly ArenaExitModel[];
+};
+
+export type ArenaState = {
+ arenaInfoFromServer?: ArenaInfoModel;
+ meleeEvents: readonly ArenaMeleeModel[];
+ melees: Readonly