diff --git a/app/soapbox/components/ui/checkbox/checkbox.tsx b/app/soapbox/components/ui/checkbox/checkbox.tsx new file mode 100644 index 000000000..68bb49645 --- /dev/null +++ b/app/soapbox/components/ui/checkbox/checkbox.tsx @@ -0,0 +1,16 @@ +import React from 'react'; + +interface ICheckbox extends Pick, 'disabled' | 'id' | 'name' | 'onChange' | 'checked' | 'required'> { } + +const Checkbox = React.forwardRef((props, ref) => { + return ( + + ); +}); + +export default Checkbox; diff --git a/app/soapbox/components/ui/form-group/form-group.tsx b/app/soapbox/components/ui/form-group/form-group.tsx index 454e8f307..4689a6b36 100644 --- a/app/soapbox/components/ui/form-group/form-group.tsx +++ b/app/soapbox/components/ui/form-group/form-group.tsx @@ -1,6 +1,10 @@ import React, { useMemo } from 'react'; import { v4 as uuidv4 } from 'uuid'; +import Checkbox from '../checkbox/checkbox'; +import HStack from '../hstack/hstack'; +import Stack from '../stack/stack'; + interface IFormGroup { /** Input label message. */ labelText?: React.ReactNode, @@ -23,6 +27,44 @@ const FormGroup: React.FC = (props) => { { id: formFieldId }, ); } + const isCheckboxFormGroup = firstChild?.type === Checkbox; + + if (isCheckboxFormGroup) { + return ( + + {firstChild} + + + {labelText && ( + + )} + + {errors?.length > 0 && ( +
+

+ {errors.join(', ')} +

+
+ )} + + {hintText && ( +

+ {hintText} +

+ )} +
+
+ ); + } return (
diff --git a/app/soapbox/components/ui/index.ts b/app/soapbox/components/ui/index.ts index 9bbc4ad87..43ff70dd1 100644 --- a/app/soapbox/components/ui/index.ts +++ b/app/soapbox/components/ui/index.ts @@ -1,6 +1,7 @@ export { default as Avatar } from './avatar/avatar'; export { default as Button } from './button/button'; export { Card, CardBody, CardHeader, CardTitle } from './card/card'; +export { default as Checkbox } from './checkbox/checkbox'; export { default as Column } from './column/column'; export { default as Counter } from './counter/counter'; export { default as Emoji } from './emoji/emoji'; diff --git a/app/soapbox/features/auth_login/components/registration_form.tsx b/app/soapbox/features/auth_login/components/registration_form.tsx index f0d095d49..c1be46e15 100644 --- a/app/soapbox/features/auth_login/components/registration_form.tsx +++ b/app/soapbox/features/auth_login/components/registration_form.tsx @@ -10,9 +10,8 @@ import { accountLookup } from 'soapbox/actions/accounts'; import { register, verifyCredentials } from 'soapbox/actions/auth'; import { openModal } from 'soapbox/actions/modals'; import BirthdayInput from 'soapbox/components/birthday_input'; -import { Form, FormGroup, FormActions, Button, Input, Textarea, Text } from 'soapbox/components/ui'; +import { Checkbox, Form, FormGroup, FormActions, Button, Input, Textarea, Text } from 'soapbox/components/ui'; import CaptchaField from 'soapbox/features/auth_login/components/captcha'; -import { Checkbox } from 'soapbox/features/forms'; import { useAppSelector, useAppDispatch, useSettings, useFeatures } from 'soapbox/hooks'; const messages = defineMessages({ @@ -328,24 +327,26 @@ const RegistrationForm: React.FC = ({ inviteToken }) => { value={params.get('captcha_solution', '')} /> -
+ {intl.formatMessage(messages.tos)} })} + > {intl.formatMessage(messages.tos)} })} name='agreement' onChange={onCheckboxChange} checked={params.get('agreement', false)} required /> + - {supportsEmailList && ( + {supportsEmailList && ( + - )} -
+ + )}