'use client'; import { DevToolsManager, GCInterface, initManager } from '@data-client/core'; import type { Controller, Manager, State } from '@data-client/core'; import React, { useEffect, useMemo } from 'react'; import ExternalCacheProvider from './ExternalDataProvider.js'; import { prepareStore } from './prepareStore.js'; import { DevToolsPosition } from '../../components/DevToolsButton.js'; /** For usage with https://dataclient.io/docs/api/makeRenderDataHook */ export default function TestExternalDataProvider({ children, managers, initialState, Controller, gcPolicy, devButton = 'bottom-right', }: Props) { const { selector, store, controller } = useMemo( () => prepareStore(initialState, managers, Controller, {}, [], gcPolicy), // eslint-disable-next-line react-hooks/exhaustive-deps [Controller, ...managers], ); // this is not handled in ExternalCacheProvider as it doesn't // own its managers. Since we are owning them here, we should ensure it happens // eslint-disable-next-line react-hooks/exhaustive-deps useEffect( initManager(managers, controller, selector(store.getState())), // we're ignoring state here, because it shouldn't trigger inits managers, ); // only include if they have devtools integrated const hasDevManager = !!managers.find( manager => manager instanceof DevToolsManager, ); return ( {children} ); } interface Props { children: React.ReactNode; managers: Manager[]; initialState: State; Controller: new (props: { gcPolicy: GCInterface }) => Controller; gcPolicy?: GCInterface; devButton?: DevToolsPosition | null | undefined; }