You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
58 lines
1.7 KiB
58 lines
1.7 KiB
import { useCallback, useMemo } from "react";
|
|
import type {
|
|
ConnectedLdoDataset,
|
|
ConnectedLdoTransactionDataset,
|
|
ConnectedPlugin,
|
|
IConnectedLdoDataset,
|
|
} from "@ldo/connected";
|
|
import type { useChangeCommitData } from "./types.js";
|
|
|
|
export type useChangeDatasetReturn<Plugins extends ConnectedPlugin[]> = [
|
|
ConnectedLdoTransactionDataset<Plugins>,
|
|
useChangeSetDataset<Plugins>,
|
|
useChangeCommitData<Plugins>,
|
|
];
|
|
|
|
export type useChangeSetDataset<Plugins extends ConnectedPlugin[]> = (
|
|
changer: (toChange: ConnectedLdoTransactionDataset<Plugins>) => void,
|
|
) => void;
|
|
|
|
/**
|
|
* @internal
|
|
*
|
|
* Creates a useChangeDataset function
|
|
*/
|
|
export function createUseChangeDataset<Plugins extends ConnectedPlugin[]>(
|
|
dataset: ConnectedLdoDataset<Plugins>,
|
|
) {
|
|
/**
|
|
* Returns a transaction on the dataset that can be modified and committed
|
|
*/
|
|
return function useChangeDataset(
|
|
specificDataset?: IConnectedLdoDataset<Plugins>,
|
|
): useChangeDatasetReturn<Plugins> {
|
|
const transactionDataset = useMemo(() => {
|
|
return (
|
|
specificDataset ?? dataset
|
|
).startTransaction() as ConnectedLdoTransactionDataset<Plugins>;
|
|
}, [specificDataset]);
|
|
|
|
const setData = useCallback<useChangeSetDataset<Plugins>>(
|
|
(changer) => {
|
|
const subTransaction = transactionDataset.startTransaction();
|
|
changer(subTransaction);
|
|
subTransaction.commit();
|
|
},
|
|
[transactionDataset],
|
|
);
|
|
|
|
const commitData = useCallback<useChangeCommitData<Plugins>>(() => {
|
|
return transactionDataset.commitToRemote();
|
|
}, [transactionDataset]);
|
|
|
|
return useMemo(
|
|
() => [transactionDataset, setData, commitData],
|
|
[transactionDataset, setData, commitData],
|
|
);
|
|
};
|
|
}
|
|
|