import { useApi, useAccount } from '@gear-js/react-hooks';
import { web3FromSource } from '@polkadot/extension-dapp';
import { ISubmittableResult } from '@polkadot/types/types';
import { generatePath } from 'react-router-dom';
import { useAddMetadata, useAddProgramName, useChain, useModal, useSignAndSend } from '@/hooks';
import { addLocalProgram } from '@/features/local-indexer';
import { absoluteRoutes } from '@/shared/config';
import { CustomLink } from '@/shared/ui/customLink';
import { useProgramStatus } from '@/features/program';
import { useAddIdl } from '@/features/sails';
import { ContractApi, Program, Values } from './types';
const useProgramActions = () => {
const { api, isApiReady } = useApi();
const { account } = useAccount();
const { isDevChain } = useChain();
const addMetadata = useAddMetadata();
const addIdl = useAddIdl();
const addProgramName = useAddProgramName();
const signAndSend = useSignAndSend();
const { showModal } = useModal();
const { getProgramStatus } = useProgramStatus();
const getSuccessAlert = (programId: string) => (
ID:
);
const handleMetadataUpload = async (
{ programId, codeId }: Program,
{ metadata, sails }: ContractApi,
{ programName }: Values,
result: ISubmittableResult,
) => {
if (!isApiReady) throw new Error('API is not initialized');
if (!account) throw new Error('Account not found');
const name = programName || programId;
const genesis = api.genesisHash.toHex();
const timestamp = Date();
if (isDevChain) {
const id = programId;
const owner = account.decodedAddress;
const metahash = metadata?.hash || null;
const status = await getProgramStatus(programId);
const blockHash = result.status.asFinalized.toHex();
await addLocalProgram({ id, owner, codeId, status, blockHash, metahash, name, genesis, timestamp });
}
if (!isDevChain) await addProgramName({ id: programId, codeId, name, metaHex: metadata?.hex, idl: sails?.idl });
if (metadata && metadata.hash && metadata.hex && !metadata.isFromStorage) addMetadata(metadata.hash, metadata.hex);
if (sails && sails.idl && !sails.isFromStorage) addIdl(codeId, sails.idl);
};
return async (
program: Program,
contractApi: ContractApi,
values: Values,
onSuccess?: () => void,
onError?: () => void,
) => {
if (!isApiReady) throw new Error('API is not initialized');
if (!account) throw new Error('Account not found');
const { meta, address } = account;
const { signer } = await web3FromSource(meta.source);
const { partialFee } = await api.program.paymentInfo(address, { signer });
const successAlert = getSuccessAlert(program.programId);
const onFinalized = (result: ISubmittableResult) => handleMetadataUpload(program, contractApi, values, result);
const onConfirm = () =>
signAndSend(program.extrinsic, 'ProgramChanged', { successAlert, onSuccess, onError, onFinalized });
showModal('transaction', {
fee: partialFee.toHuman(),
name: `${program.extrinsic.method.section}.${program.extrinsic.method.method}`,
addressFrom: address,
onAbort: onError,
onConfirm,
});
};
};
export { useProgramActions };