diff --git a/src/components/app/app.scss b/src/components/app/app.scss index eac63b8..a7d6203 100644 --- a/src/components/app/app.scss +++ b/src/components/app/app.scss @@ -91,7 +91,8 @@ div.group-list-item { div.member { border: solid 1px $grey-lighter; - min-width: 200px; + margin-right: 10px; + min-width: 150px; padding: 1rem; } diff --git a/src/components/group-invitations/group-invitations.tsx b/src/components/group-invitations/group-invitations.tsx index 312b165..6da2c60 100644 --- a/src/components/group-invitations/group-invitations.tsx +++ b/src/components/group-invitations/group-invitations.tsx @@ -52,16 +52,17 @@ const GroupInvitations: FC = ({
-
-
-
- +
+
 
+
+ +

diff --git a/src/components/member-list/member-list-item/index.tsx b/src/components/member-list/member-list-item/index.tsx index 3b26dca..753c8de 100644 --- a/src/components/member-list/member-list-item/index.tsx +++ b/src/components/member-list/member-list-item/index.tsx @@ -24,20 +24,13 @@ const MemberListItem: FC = ({ member }) => { } return ( -
-
-
-
- {member.name} -
- @{member.id} -
- {capitalize(member.membership as string)} -
- -
-
-
+
+ {member.name} +
+ @{member.id} +
+ {capitalize(member.membership as string)} +
) } diff --git a/src/components/pages/group-admin/group-admin.tsx b/src/components/pages/group-admin/group-admin.tsx index 2f01046..d614ee6 100644 --- a/src/components/pages/group-admin/group-admin.tsx +++ b/src/components/pages/group-admin/group-admin.tsx @@ -129,6 +129,8 @@ const GroupAdmin: FC = ({

+ +

Members

} diff --git a/src/components/pages/register-group/index.ts b/src/components/pages/register-group/index.ts index c5b8c85..74158c5 100644 --- a/src/components/pages/register-group/index.ts +++ b/src/components/pages/register-group/index.ts @@ -2,16 +2,30 @@ import { connect } from 'react-redux' import { handleApiError } from 'src/api/errors' import { fetchGroup } from 'src/actions/directory' +import { initField } from 'src/actions/forms' +import { showNotification } from 'src/actions/notifications' +import { register } from 'src/actions/registration' import { getEntity } from 'src/selectors/entities' -import { AppState, AppThunkDispatch, EntityType } from 'src/types' +import { getForm } from 'src/selectors/forms' + +import { valueFromForm } from 'src/utils' +import { AppState, AppThunkDispatch, EntityType, Form, NotificationType } from 'src/types' import RegisterGroup, { Props } from './register-group' const mapStateToProps = (state: AppState, ownProps: Props) => ({ group: getEntity(state, EntityType.Group, ownProps.match.params.id), + form: getForm(state), }) const mapDispatchToProps = (dispatch: AppThunkDispatch, ownProps: Props) => ({ + initForm: () => { + dispatch(initField('user-id', 'id')) + dispatch(initField('user-name', 'name')) + dispatch(initField('user-email', 'email')) + dispatch(initField('password')) + dispatch(initField('user-agree')) + }, fetchGroup: async () => { try { await dispatch(fetchGroup(ownProps.match.params.id)) @@ -19,6 +33,28 @@ const mapDispatchToProps = (dispatch: AppThunkDispatch, ownProps: Props) => ({ handleApiError(err, dispatch, ownProps.history) } }, + register: async (form: Form) => { + if (!valueFromForm(form, 'user-agree', false)) { + dispatch(showNotification(NotificationType.Error, 'You must agree to the terms and conditions.')) + return + } + + try { + await dispatch(register({ + id: valueFromForm(form, 'user-id', ''), + email: valueFromForm(form, 'user-email', ''), + password: valueFromForm(form, 'password', ''), + name: valueFromForm(form, 'user-name', ''), + group: ownProps.match.params.id, + })) + + dispatch(showNotification(NotificationType.Welcome, `Welcome to Flexor!`)) + + ownProps.history.push('/self') + } catch (err) { + handleApiError(err, dispatch, ownProps.history) + } + } }) export default connect( diff --git a/src/components/pages/register-group/register-group.tsx b/src/components/pages/register-group/register-group.tsx index 900dd3e..a7f2a5d 100644 --- a/src/components/pages/register-group/register-group.tsx +++ b/src/components/pages/register-group/register-group.tsx @@ -1,7 +1,16 @@ import React, { FC, useEffect } from 'react' import { RouteComponentProps } from 'react-router' +import { FontAwesomeIcon } from '@fortawesome/react-fontawesome' +import { faUserPlus } from '@fortawesome/free-solid-svg-icons' -import { Entity } from 'src/types' +import { setTitle } from 'src/utils' +import { useDeepCompareEffect } from 'src/hooks' + +import { Entity, Form } from 'src/types' + +import PageHeader from 'src/components/page-header' +import Loading from 'src/components/pages/loading' +import CreateUserForm from 'src/components/create-user-form' interface Params { id: string @@ -9,26 +18,42 @@ interface Params { export interface Props extends RouteComponentProps { group?: Entity + form: Form fetchGroup: () => void + initForm: () => void + register: (form: Form) => void } -const RegisterGroup: FC = ({ group, fetchGroup }) => { +const RegisterGroup: FC = ({ group, form, fetchGroup, initForm, register }) => { useEffect(() => { fetchGroup() + initForm() + setTitle('Register') }, []) - if (!group) { - return ( -
-

Community Not Found

-
- ) - } + useDeepCompareEffect(() => { + if (group) setTitle(`Register @ ${group.name}`) + }, [group]) + + if (!group) return return (
-

{group.name}

-

Create a new Account.

+ + +
+
+ +
+ + +
+
) } diff --git a/src/components/pages/register/index.ts b/src/components/pages/register/index.ts index c8dce0a..5b82da6 100644 --- a/src/components/pages/register/index.ts +++ b/src/components/pages/register/index.ts @@ -52,6 +52,8 @@ const mapDispatchToProps = (dispatch: AppThunkDispatch, ownProps: Props) => ({ name: valueFromForm(form, 'group-name', ''), registration: valueFromForm(form, 'group-registration', ''), })) + + dispatch(showNotification(NotificationType.Welcome, `Welcome to Flexor!`)) ownProps.history.push('/self') } catch (err) {