Files
Space-Game/apps/game/src/spacetime/useSpacetimeConnection.ts
francy51 7c93b8a1ae Add game UI panels, keyboard shortcuts, docs narrative overhaul, and unified dev script
- Add MiniStarMap, NpcMarketPanel, ShipStatusPanel, useKeyboardShortcuts
- Add progress bars for approach/mining operations and cargo fill indicator
- Rewrite docs from spreadsheet-first to exploration-first open-world RPG
- Replace dev:db + dev:standalone with unified dev script (scripts/dev.sh)
- Add Vite chunk splitting for three.js and spacetimedb
- Fix displayName dependency in useSpacetimeConnection
- Remove stale usePlayerSession.ts
- Add AGENTS.md files across all packages
2026-06-02 17:32:15 -04:00

64 lines
1.9 KiB
TypeScript

import { useEffect, useMemo, useRef, useState } from "react";
import type { DbConnection } from "../module_bindings";
import { createSpacetimeConnection, type ConnectionStatus, type IdentityLike } from "./client";
const defaultUri = import.meta.env.VITE_SPACETIME_URI ?? import.meta.env.VITE_SPACETIMEDB_HOST ?? "http://localhost:3000";
const defaultDatabase =
import.meta.env.VITE_SPACETIME_DATABASE ?? import.meta.env.VITE_SPACETIMEDB_DB_NAME ?? "void-nav-dev";
export function useSpacetimeConnection(displayName: string) {
const [status, setStatus] = useState<ConnectionStatus>("idle");
const [message, setMessage] = useState<string>();
const [identity, setIdentity] = useState<IdentityLike>();
const [connection, setConnection] = useState<DbConnection | null>(null);
const [revision, setRevision] = useState(0);
const [reducerStatus, setReducerStatus] = useState<{ message: string; isError: boolean }>();
const config = useMemo(
() => ({
uri: defaultUri,
database: defaultDatabase,
}),
[],
);
const displayNameRef = useRef(displayName);
displayNameRef.current = displayName;
useEffect(() => {
const conn = createSpacetimeConnection({
...config,
displayName: displayNameRef.current,
onStatus: (nextStatus, nextMessage) => {
setStatus(nextStatus);
setMessage(nextMessage);
},
onIdentity: setIdentity,
onDataChanged: () => setRevision((value) => value + 1),
onReducerStatus: (nextMessage, isError = false) => setReducerStatus({ message: nextMessage, isError }),
});
setConnection(conn);
const refresh = window.setInterval(() => {
if (conn) setRevision((value) => value + 1);
}, 1500);
return () => {
window.clearInterval(refresh);
conn?.disconnect?.();
};
}, [config]);
return {
connection,
status,
message,
identity,
revision,
reducerStatus,
uri: config.uri,
database: config.database,
};
}