SetStorageRoleParamsForm.tsx 9.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256
  1. import React, { useState, useEffect } from 'react';
  2. import { Form, Divider } from 'semantic-ui-react';
  3. import { getFormErrorLabelsProps } from './errorHandling';
  4. import * as Yup from 'yup';
  5. import {
  6. GenericProposalForm,
  7. GenericFormValues,
  8. genericFormDefaultOptions,
  9. genericFormDefaultValues,
  10. withProposalFormData,
  11. ProposalFormExportProps,
  12. ProposalFormContainerProps,
  13. ProposalFormInnerProps
  14. } from './GenericProposalForm';
  15. import Validation from '../validationSchema';
  16. import { InputFormField } from './FormFields';
  17. import { withFormContainer } from './FormContainer';
  18. import { BlockNumber, Balance } from '@polkadot/types/interfaces';
  19. import { u32 } from '@polkadot/types/primitive';
  20. import { createType } from '@polkadot/types';
  21. import { useTransport, usePromise } from '@polkadot/joy-utils/react/hooks';
  22. import { StorageRoleParameters, IStorageRoleParameters } from '@polkadot/joy-utils/types/storageProviders';
  23. import { formatBalance } from '@polkadot/util';
  24. import './forms.css';
  25. // Move to joy-types?
  26. type RoleParameters = {
  27. min_stake: Balance;
  28. min_actors: u32;
  29. max_actors: u32;
  30. reward: Balance;
  31. reward_period: BlockNumber;
  32. bonding_period: BlockNumber;
  33. unbonding_period: BlockNumber;
  34. min_service_period: BlockNumber;
  35. startup_grace_period: BlockNumber;
  36. entry_request_fee: Balance;
  37. };
  38. // All of those are strings, because that's how those values are beeing passed from inputs
  39. type FormValues = GenericFormValues &
  40. {
  41. [K in keyof RoleParameters]: string;
  42. };
  43. const defaultValues: FormValues = {
  44. ...genericFormDefaultValues,
  45. min_stake: '',
  46. min_actors: '',
  47. max_actors: '',
  48. reward: '',
  49. reward_period: '',
  50. bonding_period: '',
  51. unbonding_period: '',
  52. min_service_period: '',
  53. startup_grace_period: '',
  54. entry_request_fee: ''
  55. };
  56. type FormAdditionalProps = {}; // Aditional props coming all the way from export comonent into the inner form.
  57. type ExportComponentProps = ProposalFormExportProps<FormAdditionalProps, FormValues>;
  58. type FormContainerProps = ProposalFormContainerProps<ExportComponentProps>;
  59. type FormInnerProps = ProposalFormInnerProps<FormContainerProps, FormValues>;
  60. function createRoleParameters (values: FormValues): RoleParameters {
  61. return {
  62. min_stake: createType('Balance', values.min_stake),
  63. min_actors: createType('u32', values.min_actors),
  64. max_actors: createType('u32', values.max_actors),
  65. reward: createType('Balance', values.reward),
  66. reward_period: createType('BlockNumber', values.reward_period),
  67. bonding_period: createType('BlockNumber', values.bonding_period),
  68. unbonding_period: createType('BlockNumber', values.unbonding_period),
  69. min_service_period: createType('BlockNumber', values.min_service_period),
  70. startup_grace_period: createType('BlockNumber', values.startup_grace_period),
  71. entry_request_fee: createType('Balance', values.entry_request_fee)
  72. };
  73. }
  74. const SetStorageRoleParamsForm: React.FunctionComponent<FormInnerProps> = props => {
  75. const transport = useTransport();
  76. const [params] = usePromise<IStorageRoleParameters | null>(() => transport.storageProviders.roleParameters(), null);
  77. const { handleChange, errors, touched, values, setFieldValue } = props;
  78. const [placeholders, setPlaceholders] = useState<{ [k in keyof FormValues]: string }>(defaultValues);
  79. const errorLabelsProps = getFormErrorLabelsProps<FormValues>(errors, touched);
  80. useEffect(() => {
  81. if (params) {
  82. const stringParams = Object.keys(params).reduce((obj, key) => {
  83. return { ...obj, [`${key}`]: String(params[key as keyof IStorageRoleParameters]) };
  84. }, {});
  85. const fetchedPlaceholders = { ...placeholders, ...stringParams };
  86. StorageRoleParameters.forEach(field => {
  87. setFieldValue(field, params[field].toString());
  88. });
  89. setPlaceholders(fetchedPlaceholders);
  90. }
  91. }, [params]);
  92. return (
  93. <GenericProposalForm
  94. {...props}
  95. txMethod="createSetStorageRoleParametersProposal"
  96. proposalType="SetStorageRoleParameters"
  97. submitParams={[props.myMemberId, values.title, values.rationale, '{STAKE}', createRoleParameters(values)]}
  98. >
  99. <Divider horizontal>Parameters</Divider>
  100. <Form.Group widths="equal" style={{ marginBottom: '2em' }}>
  101. <InputFormField
  102. label="Min. actors"
  103. help="Minimum number of actors in this role"
  104. onChange={handleChange}
  105. name="min_actors"
  106. placeholder={placeholders.min_actors}
  107. error={errorLabelsProps.min_actors}
  108. value={values.min_actors}
  109. disabled
  110. />
  111. <InputFormField
  112. label="Max. actors"
  113. help="Maximum number of actors in this role"
  114. fluid
  115. onChange={handleChange}
  116. name="max_actors"
  117. placeholder={placeholders.max_actors}
  118. error={errorLabelsProps.max_actors}
  119. value={values.max_actors}
  120. />
  121. </Form.Group>
  122. <Form.Group widths="equal" style={{ marginBottom: '2em' }}>
  123. <InputFormField
  124. label="Reward"
  125. help="Reward for performing this role (for each period)"
  126. fluid
  127. onChange={handleChange}
  128. name="reward"
  129. placeholder={placeholders.reward}
  130. error={errorLabelsProps.reward}
  131. value={values.reward}
  132. unit={ formatBalance.getDefaults().unit }
  133. />
  134. <InputFormField
  135. label="Reward period"
  136. help="Reward period in blocks"
  137. fluid
  138. onChange={handleChange}
  139. name="reward_period"
  140. placeholder={placeholders.reward_period}
  141. error={errorLabelsProps.reward_period}
  142. value={values.reward_period}
  143. unit="blocks"
  144. disabled
  145. />
  146. </Form.Group>
  147. <Form.Group widths="equal" style={{ marginBottom: '2em' }}>
  148. <InputFormField
  149. label="Min. stake"
  150. help="Minimum stake for this role"
  151. onChange={handleChange}
  152. name="min_stake"
  153. placeholder={placeholders.min_stake}
  154. error={errorLabelsProps.min_stake}
  155. value={values.min_stake}
  156. unit={ formatBalance.getDefaults().unit }
  157. />
  158. <InputFormField
  159. label="Min. service period"
  160. help="Minimum period of service in blocks"
  161. fluid
  162. onChange={handleChange}
  163. name="min_service_period"
  164. placeholder={placeholders.min_service_period}
  165. error={errorLabelsProps.min_service_period}
  166. value={values.min_service_period}
  167. unit="blocks"
  168. disabled
  169. />
  170. </Form.Group>
  171. <Form.Group widths="equal" style={{ marginBottom: '2em' }}>
  172. <InputFormField
  173. label="Bonding period"
  174. help="Bonding period in blocks"
  175. fluid
  176. onChange={handleChange}
  177. name="bonding_period"
  178. placeholder={placeholders.bonding_period}
  179. error={errorLabelsProps.bonding_period}
  180. value={values.bonding_period}
  181. unit="blocks"
  182. disabled
  183. />
  184. <InputFormField
  185. label="Unbounding period"
  186. help="Unbounding period in blocks"
  187. fluid
  188. onChange={handleChange}
  189. name="unbonding_period"
  190. placeholder={placeholders.unbonding_period}
  191. error={errorLabelsProps.unbonding_period}
  192. value={values.unbonding_period}
  193. unit="blocks"
  194. />
  195. </Form.Group>
  196. <Form.Group widths="equal" style={{ marginBottom: '2em' }}>
  197. <InputFormField
  198. label="Startup grace period"
  199. help="Startup grace period in blocks"
  200. fluid
  201. onChange={handleChange}
  202. name="startup_grace_period"
  203. placeholder={placeholders.startup_grace_period}
  204. error={errorLabelsProps.startup_grace_period}
  205. value={values.startup_grace_period}
  206. unit="blocks"
  207. disabled
  208. />
  209. <InputFormField
  210. label="Entry request fee"
  211. help="Entry request fee"
  212. fluid
  213. onChange={handleChange}
  214. name="entry_request_fee"
  215. placeholder={placeholders.entry_request_fee}
  216. error={errorLabelsProps.entry_request_fee}
  217. value={values.entry_request_fee}
  218. unit={ formatBalance.getDefaults().unit }
  219. />
  220. </Form.Group>
  221. </GenericProposalForm>
  222. );
  223. };
  224. const FormContainer = withFormContainer<FormContainerProps, FormValues>({
  225. mapPropsToValues: (props: FormContainerProps) => ({
  226. ...defaultValues,
  227. ...(props.initialData || {})
  228. }),
  229. validationSchema: Yup.object().shape({
  230. ...genericFormDefaultOptions.validationSchema,
  231. min_stake: Validation.SetStorageRoleParameters.min_stake,
  232. min_actors: Validation.SetStorageRoleParameters.min_actors,
  233. max_actors: Validation.SetStorageRoleParameters.max_actors,
  234. reward: Validation.SetStorageRoleParameters.reward,
  235. reward_period: Validation.SetStorageRoleParameters.reward_period,
  236. bonding_period: Validation.SetStorageRoleParameters.bonding_period,
  237. unbonding_period: Validation.SetStorageRoleParameters.unbonding_period,
  238. min_service_period: Validation.SetStorageRoleParameters.min_service_period,
  239. startup_grace_period: Validation.SetStorageRoleParameters.startup_grace_period,
  240. entry_request_fee: Validation.SetStorageRoleParameters.entry_request_fee
  241. }),
  242. handleSubmit: genericFormDefaultOptions.handleSubmit,
  243. displayName: 'SetStorageRoleParamsForm'
  244. })(SetStorageRoleParamsForm);
  245. export default withProposalFormData(FormContainer);