@renegade-fi/react
Version:
React library for Renegade
63 lines (54 loc) • 1.97 kB
text/typescript
"use client";
import type { Config } from "@renegade-fi/core";
import { type State, hydrate } from "@renegade-fi/core";
import { type ReactElement, createElement, useEffect, useRef, useState } from "react";
import * as RustUtils from "../renegade-utils/index.js";
import { WasmContext } from "./wasm.js";
export type HydrateProps = {
config: Config | undefined;
initialState?: State | undefined;
reconnectOnMount?: boolean | undefined;
};
export function Hydrate(parameters: React.PropsWithChildren<HydrateProps>) {
const { children, config, initialState, reconnectOnMount = true } = parameters;
const [isInitialized, setIsInitialized] = useState(false);
const { onMount } = hydrate(config, {
initialState,
reconnectOnMount,
});
// Hydrate for non-SSR
if (config && !config._internal.ssr) onMount();
useEffect(() => {
RustUtils.default().then(() => {
setIsInitialized(true);
console.log("Backup effect initialized WASM");
});
}, []);
// Hydrate for SSR
const active = useRef(true);
// biome-ignore lint/correctness/useExhaustiveDependencies: <explanation>
useEffect(() => {
if (!config) return;
config.utils
.default()
.then(() => {
console.log("🚀 ~ WASM initialized");
setIsInitialized(true);
if (!active.current) return;
if (!config._internal.ssr) return;
// Rehydrate after WASM is initialized to prevent race condition
onMount();
})
.catch((error: unknown) => {
console.error("❌ Failed to initialize Rust utils", error);
});
return () => {
active.current = false;
};
}, []);
return createElement(
WasmContext.Provider,
{ value: { isInitialized } },
children as ReactElement,
);
}