import React from 'react'; import lodash from 'lodash'; import { Input, Form, Col, Row, Button, Icon, Alert } from 'antd'; import { SOCIAL_INFO } from 'utils/social'; import { SOCIAL_SERVICE, User } from 'types'; import { UserState } from 'modules/users/reducers'; import { getCreateTeamMemberError } from 'modules/create/utils'; import UserAvatar from 'components/UserAvatar'; import './ProfileEdit.less'; interface Props { user: UserState; onDone(): void; onEdit(user: User): void; } interface State { fields: User; isChanged: boolean; showError: boolean; } export default class ProfileEdit extends React.PureComponent { state: State = { fields: { ...this.props.user } as User, isChanged: false, showError: false, }; componentDidUpdate(prevProps: Props, _: State) { if ( prevProps.user.isUpdating && !this.props.user.isUpdating && !this.state.showError ) { this.setState({ showError: true }); } if ( prevProps.user.isUpdating && !this.props.user.isUpdating && !this.props.user.updateError ) { this.props.onDone(); } } render() { const { fields } = this.state; const error = getCreateTeamMemberError(fields); const isMissingField = !fields.displayName || !fields.title || !fields.emailAddress || !fields.accountAddress; const isDisabled = !!error || isMissingField || !this.state.isChanged; return ( <>
{fields.avatar && (
{Object.values(SOCIAL_INFO).map(s => { const field = fields.socialMedias.find(sm => sm.service === s.service); return ( this.handleSocialChange(ev, s.service)} addonBefore={s.icon} /> ); })} {!isMissingField && error && ( )} {this.state.showError && this.props.user.updateError && ( )}
); } private handleSave = (evt: React.SyntheticEvent) => { evt.preventDefault(); this.props.onEdit(this.state.fields); }; private handleCancel = () => { this.props.onDone(); }; private handleChangeField = (ev: React.ChangeEvent) => { const { name, value } = ev.currentTarget; const fields = { ...this.state.fields, [name as any]: value, }; const isChanged = this.isChangedCheck(fields); this.setState({ isChanged, fields, }); }; private handleSocialChange = ( ev: React.ChangeEvent, service: SOCIAL_SERVICE, ) => { const { value } = ev.currentTarget; // First remove... const socialMedias = this.state.fields.socialMedias.filter( sm => sm.service !== service, ); if (value) { // Then re-add if there as a value socialMedias.push({ service, username: value, }); } const fields = { ...this.state.fields, socialMedias, }; const isChanged = this.isChangedCheck(fields); this.setState({ isChanged, fields, }); }; private handleChangePhoto = () => { // TODO: Actual file uploading const gender = ['men', 'women'][Math.floor(Math.random() * 2)]; const num = Math.floor(Math.random() * 80); const fields = { ...this.state.fields, avatar: { image_url: `https://randomuser.me/api/portraits/${gender}/${num}.jpg`, }, }; const isChanged = this.isChangedCheck(fields); this.setState({ isChanged, fields, }); }; private handleDeletePhoto = () => { const fields = { ...this.state.fields, avatar: null, }; const isChanged = this.isChangedCheck(fields); this.setState({ isChanged, fields }); }; private isChangedCheck = (a: User) => { return !lodash.isEqual(a, this.props.user); }; }