Selection.tsx 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. // Copyright 2017-2020 @polkadot/app-extrinsics authors & contributors
  2. // This software may be modified and distributed under the terms
  3. // of the Apache-2.0 license. See the LICENSE file for details.
  4. import { SubmittableExtrinsic } from '@polkadot/api/types';
  5. import React, { useCallback, useState } from 'react';
  6. import { Button, Extrinsic, InputAddress, TxButton } from '@polkadot/react-components';
  7. import { useApi } from '@polkadot/react-hooks';
  8. import { BalanceFree } from '@polkadot/react-query';
  9. import { useTranslation } from './translate';
  10. function Selection (): React.ReactElement {
  11. const { t } = useTranslation();
  12. const { apiDefaultTxSudo } = useApi();
  13. const [accountId, setAccountId] = useState<string | null>(null);
  14. const [error, setError] = useState<string | null>(null);
  15. const [extrinsic, setExtrinsic] = useState<SubmittableExtrinsic<'promise'> | null>(null);
  16. const _onExtrinsicChange = useCallback(
  17. (method?: SubmittableExtrinsic<'promise'>) => setExtrinsic(() => method || null),
  18. []
  19. );
  20. const _onExtrinsicError = useCallback(
  21. (error?: Error | null) => setError(error ? error.message : null),
  22. []
  23. );
  24. return (
  25. <div className='extrinsics--Selection'>
  26. <InputAddress
  27. label={t<string>('using the selected account')}
  28. labelExtra={
  29. <BalanceFree
  30. label={<label>{t<string>('free balance')}</label>}
  31. params={accountId}
  32. />
  33. }
  34. onChange={setAccountId}
  35. type='account'
  36. />
  37. <Extrinsic
  38. defaultValue={apiDefaultTxSudo}
  39. label={t<string>('submit the following extrinsic')}
  40. onChange={_onExtrinsicChange}
  41. onError={_onExtrinsicError}
  42. />
  43. {error && (
  44. <article className='error'>{error}</article>
  45. )}
  46. <Button.Group>
  47. <TxButton
  48. extrinsic={extrinsic}
  49. icon='sign-in-alt'
  50. isBasic
  51. isDisabled={!extrinsic}
  52. isUnsigned
  53. label={t<string>('Submit Unsigned')}
  54. withSpinner
  55. />
  56. <TxButton
  57. accountId={accountId}
  58. extrinsic={extrinsic}
  59. icon='sign-in-alt'
  60. isDisabled={!extrinsic || !accountId}
  61. isPrimary={false}
  62. label={t<string>('Submit Transaction')}
  63. />
  64. </Button.Group>
  65. </div>
  66. );
  67. }
  68. export default React.memo(Selection);