// Copyright 2017-2022 @polkadot/react-components authors & contributors // SPDX-License-Identifier: Apache-2.0 // TODO: We have a lot shared between this and InputExtrinsic & InputStorage import type { DefinitionRpcExt } from '@polkadot/types/types'; import type { DropdownOptions } from '../util/types'; import React, { useCallback, useEffect, useState } from 'react'; import { useApi } from '@polkadot/react-hooks'; import LinkedWrapper from '../InputExtrinsic/LinkedWrapper'; import methodOptions from './options/method'; import sectionOptions from './options/section'; import SelectMethod from './SelectMethod'; import SelectSection from './SelectSection'; import useRpcs from './useRpcs'; interface Props { className?: string; defaultValue: DefinitionRpcExt; help?: React.ReactNode; isError?: boolean; label: React.ReactNode; onChange?: (value: DefinitionRpcExt) => void; withLabel?: boolean; } function InputRpc ({ className = '', defaultValue, help, label, onChange, withLabel }: Props): React.ReactElement { const { api } = useApi(); const rpcs = useRpcs(); const [optionsMethod, setOptionsMethod] = useState(() => methodOptions(api, rpcs, defaultValue.section)); const [optionsSection] = useState(() => sectionOptions(api)); const [value, setValue] = useState((): DefinitionRpcExt => defaultValue); useEffect((): void => { onChange && onChange(value); }, [onChange, value]); const _onMethodChange = useCallback( (newValue: DefinitionRpcExt): void => { if (value !== newValue) { // set via callback since the method is a function itself setValue(() => newValue); } }, [value] ); const _onSectionChange = useCallback( (newSection: string): void => { if (newSection !== value.section) { const optionsMethod = methodOptions(api, rpcs, newSection); setOptionsMethod(optionsMethod); _onMethodChange(rpcs[newSection][optionsMethod[0].value]); } }, [_onMethodChange, api, rpcs, value] ); return ( ); } export default React.memo(InputRpc);