Files
pezkuwi-apps/packages/page-extrinsics/src/Submission.tsx
T
pezkuwichain d21bfb1320 feat: initial Pezkuwi Apps rebrand from polkadot-apps
Rebranded terminology:
- Polkadot → Pezkuwi
- Kusama → Dicle
- Westend → Zagros
- Rococo → PezkuwiChain
- Substrate → Bizinikiwi
- parachain → teyrchain

Custom logos with Kurdistan brand colors (#e6007a → #86e62a):
- bizinikiwi-hexagon.svg
- sora-bizinikiwi.svg
- hezscanner.svg
- heztreasury.svg
- pezkuwiscan.svg
- pezkuwistats.svg
- pezkuwiassembly.svg
- pezkuwiholic.svg
2026-01-07 13:05:27 +03:00

109 lines
3.0 KiB
TypeScript

// Copyright 2017-2025 @pezkuwi/app-extrinsics authors & contributors
// SPDX-License-Identifier: Apache-2.0
import type { SubmittableExtrinsic, SubmittableExtrinsicFunction } from '@pezkuwi/api/types';
import type { RawParam } from '@pezkuwi/react-params/types';
import type { DecodedExtrinsic } from './types.js';
import React, { useCallback, useState } from 'react';
import { Button, InputAddress, MarkError, TxButton } from '@pezkuwi/react-components';
import { useApi } from '@pezkuwi/react-hooks';
import { Extrinsic } from '@pezkuwi/react-params';
import { BalanceFree } from '@pezkuwi/react-query';
import Decoded from './Decoded.js';
import { useTranslation } from './translate.js';
interface Props {
className?: string;
defaultValue: DecodedExtrinsic | null;
}
interface DefaultExtrinsic {
defaultArgs?: RawParam[];
defaultFn: SubmittableExtrinsicFunction<'promise'>;
}
function extractDefaults (value: DecodedExtrinsic | null, defaultFn: SubmittableExtrinsicFunction<'promise'>): DefaultExtrinsic {
if (!value) {
return { defaultFn };
}
return {
defaultArgs: value.call.args.map((value) => ({
isValid: true,
value
})),
defaultFn: value.fn
};
}
function Selection ({ className, defaultValue }: Props): React.ReactElement<Props> {
const { t } = useTranslation();
const { apiDefaultTxSudo } = useApi();
const [accountId, setAccountId] = useState<string | null>(null);
const [error, setError] = useState<string | null>(null);
const [extrinsic, setExtrinsic] = useState<SubmittableExtrinsic<'promise'> | null>(null);
const [{ defaultArgs, defaultFn }] = useState<DefaultExtrinsic>(() => extractDefaults(defaultValue, apiDefaultTxSudo));
const _onExtrinsicChange = useCallback(
(method?: SubmittableExtrinsic<'promise'>) =>
setExtrinsic(() => method || null),
[]
);
const _onExtrinsicError = useCallback(
(error?: Error | null) =>
setError(error ? error.message : null),
[]
);
return (
<div className={className}>
<InputAddress
label={t('using the selected account')}
labelExtra={
<BalanceFree
label={<label>{t('free balance')}</label>}
params={accountId}
/>
}
onChange={setAccountId}
type='account'
/>
<Extrinsic
defaultArgs={defaultArgs}
defaultValue={defaultFn}
label={t('submit the following extrinsic')}
onChange={_onExtrinsicChange}
onError={_onExtrinsicError}
/>
<Decoded
extrinsic={extrinsic}
isCall
/>
{error && !extrinsic && (
<MarkError content={error} />
)}
<Button.Group>
<TxButton
extrinsic={extrinsic}
icon='sign-in-alt'
isUnsigned
label={t('Submit Unsigned')}
withSpinner
/>
<TxButton
accountId={accountId}
extrinsic={extrinsic}
icon='sign-in-alt'
label={t('Submit Transaction')}
/>
</Button.Group>
</div>
);
}
export default React.memo(Selection);