import React, { useState, useEffect } from 'react'; import { Form, Divider } from 'semantic-ui-react'; import { getFormErrorLabelsProps } from './errorHandling'; import * as Yup from 'yup'; import { GenericProposalForm, GenericFormValues, genericFormDefaultOptions, genericFormDefaultValues, withProposalFormData, ProposalFormExportProps, ProposalFormContainerProps, ProposalFormInnerProps } from './GenericProposalForm'; import Validation from '../validationSchema'; import { InputFormField } from './FormFields'; import { withFormContainer } from './FormContainer'; import { BlockNumber, Balance } from '@polkadot/types/interfaces'; import { u32 } from '@polkadot/types/primitive'; import { createType } from '@polkadot/types'; import { useTransport, usePromise } from '@polkadot/joy-utils/react/hooks'; import { StorageRoleParameters, IStorageRoleParameters } from '@polkadot/joy-utils/types/storageProviders'; import { formatBalance } from '@polkadot/util'; import './forms.css'; // Move to joy-types? type RoleParameters = { min_stake: Balance; min_actors: u32; max_actors: u32; reward: Balance; reward_period: BlockNumber; bonding_period: BlockNumber; unbonding_period: BlockNumber; min_service_period: BlockNumber; startup_grace_period: BlockNumber; entry_request_fee: Balance; }; // All of those are strings, because that's how those values are beeing passed from inputs type FormValues = GenericFormValues & { [K in keyof RoleParameters]: string; }; const defaultValues: FormValues = { ...genericFormDefaultValues, min_stake: '', min_actors: '', max_actors: '', reward: '', reward_period: '', bonding_period: '', unbonding_period: '', min_service_period: '', startup_grace_period: '', entry_request_fee: '' }; type FormAdditionalProps = {}; // Aditional props coming all the way from export comonent into the inner form. type ExportComponentProps = ProposalFormExportProps; type FormContainerProps = ProposalFormContainerProps; type FormInnerProps = ProposalFormInnerProps; function createRoleParameters (values: FormValues): RoleParameters { return { min_stake: createType('Balance', values.min_stake), min_actors: createType('u32', values.min_actors), max_actors: createType('u32', values.max_actors), reward: createType('Balance', values.reward), reward_period: createType('BlockNumber', values.reward_period), bonding_period: createType('BlockNumber', values.bonding_period), unbonding_period: createType('BlockNumber', values.unbonding_period), min_service_period: createType('BlockNumber', values.min_service_period), startup_grace_period: createType('BlockNumber', values.startup_grace_period), entry_request_fee: createType('Balance', values.entry_request_fee) }; } const SetStorageRoleParamsForm: React.FunctionComponent = props => { const transport = useTransport(); const [params] = usePromise(() => transport.storageProviders.roleParameters(), null); const { handleChange, errors, touched, values, setFieldValue } = props; const [placeholders, setPlaceholders] = useState<{ [k in keyof FormValues]: string }>(defaultValues); const errorLabelsProps = getFormErrorLabelsProps(errors, touched); useEffect(() => { if (params) { const stringParams = Object.keys(params).reduce((obj, key) => { return { ...obj, [`${key}`]: String(params[key as keyof IStorageRoleParameters]) }; }, {}); const fetchedPlaceholders = { ...placeholders, ...stringParams }; StorageRoleParameters.forEach(field => { setFieldValue(field, params[field].toString()); }); setPlaceholders(fetchedPlaceholders); } }, [params]); return ( Parameters ); }; const FormContainer = withFormContainer({ mapPropsToValues: (props: FormContainerProps) => ({ ...defaultValues, ...(props.initialData || {}) }), validationSchema: Yup.object().shape({ ...genericFormDefaultOptions.validationSchema, min_stake: Validation.SetStorageRoleParameters.min_stake, min_actors: Validation.SetStorageRoleParameters.min_actors, max_actors: Validation.SetStorageRoleParameters.max_actors, reward: Validation.SetStorageRoleParameters.reward, reward_period: Validation.SetStorageRoleParameters.reward_period, bonding_period: Validation.SetStorageRoleParameters.bonding_period, unbonding_period: Validation.SetStorageRoleParameters.unbonding_period, min_service_period: Validation.SetStorageRoleParameters.min_service_period, startup_grace_period: Validation.SetStorageRoleParameters.startup_grace_period, entry_request_fee: Validation.SetStorageRoleParameters.entry_request_fee }), handleSubmit: genericFormDefaultOptions.handleSubmit, displayName: 'SetStorageRoleParamsForm' })(SetStorageRoleParamsForm); export default withProposalFormData(FormContainer);