import { useCallback, useMemo } from "react"; import type { ConnectedLdoDataset, ConnectedLdoTransactionDataset, ConnectedPlugin, IConnectedLdoDataset, } from "@ldo/connected"; import type { useChangeCommitData } from "./types.js"; export type useChangeDatasetReturn = [ ConnectedLdoTransactionDataset, useChangeSetDataset, useChangeCommitData, ]; export type useChangeSetDataset = ( changer: (toChange: ConnectedLdoTransactionDataset) => void, ) => void; /** * @internal * * Creates a useChangeDataset function */ export function createUseChangeDataset( dataset: ConnectedLdoDataset, ) { /** * Returns a transaction on the dataset that can be modified and committed */ return function useChangeDataset( specificDataset?: IConnectedLdoDataset, ): useChangeDatasetReturn { const transactionDataset = useMemo(() => { return ( specificDataset ?? dataset ).startTransaction() as ConnectedLdoTransactionDataset; }, [specificDataset]); const setData = useCallback>( (changer) => { const subTransaction = transactionDataset.startTransaction(); changer(subTransaction); subTransaction.commit(); }, [transactionDataset], ); const commitData = useCallback>(() => { return transactionDataset.commitToRemote(); }, [transactionDataset]); return useMemo( () => [transactionDataset, setData, commitData], [transactionDataset, setData, commitData], ); }; }