import { Button, Column, Dialog, InputField, ModalContext, Switch } from '@8base/boost';
import get from 'lodash/get';
import React from 'react';
import { compose } from 'react-apollo';
import { getOperationName } from 'apollo-link';
import { ChatContext, IChatContext, withContext } from 'context';
import { DialogForm, UserSelectField } from 'shared/components';
import { UserContactsPreviewComponent } from 'shared/components/contacts-preview/intex';
import {
ChannelCreateMutationFn,
UserChannelsPreviewDocument,
// UserContactsPreviewComponent,
withChannelCreate,
} from 'shared/graphql/__generated__';
// -- TYPES
interface IChannelCreateHOCProps {
createChannel: ChannelCreateMutationFn;
}
interface ICreateChannelDialogWrapperProps {
user: IChatContext['user'];
setChannel: IChatContext['setChannel'];
usersFilter: IChatContext['usersFilter'];
}
interface ICreateChannelDialogProps
extends ICreateChannelDialogWrapperProps,
IChannelCreateHOCProps {}
interface IDialogContentProps extends ICreateChannelDialogProps {}
interface IDialogContentState {
data: {
name: string;
public: boolean;
users: string[];
purpose: string;
};
errors: {
[key in keyof IDialogContentState['data']]?: string;
};
submitting: boolean;
}
// -- CONSTANTS
export const CREATE_CHANNEL_DIALOG_ID = 'CREATE_CHANNEL_DIALOG_ID';
// -- MAIN
class DialogContent extends React.PureComponent<
IDialogContentProps,
IDialogContentState
> {
static contextType = ModalContext;
static id = CREATE_CHANNEL_DIALOG_ID;
constructor(props: IDialogContentProps) {
super(props);
this.state = {
data: {
name: '',
purpose: '',
public: false,
users: [],
},
errors: {},
submitting: false,
};
}
render() {
const { data, errors, submitting } = this.state;
const { user, usersFilter } = this.props;
return (
{({ data: resData, loading: queryLoading }) => (
({
label: `${el.firstName} ${el.lastName}`,
value: el.id,
src: el.avatar && el.avatar.downloadUrl,
firstName: el.firstName,
lastName: el.lastName,
}))
}
/>
)}
);
}
private onSubmit = async (e: any) => {
e.preventDefault();
if (!this.props.user || this.state.submitting) {
return;
}
const errors = this.validateData(this.state.data);
const currentUserId = this.props.user.id;
if (Object.keys(errors).length > 0) {
this.setState({
errors,
});
return;
}
const { name, purpose, users } = this.state.data;
const membersCreate = users
.filter(id => id !== currentUserId)
.map(id => ({ user: { connect: { id } } }));
this.setState({
submitting: true,
});
let response;
try {
response = await this.props.createChannel({
variables: {
data: {
name,
purpose,
public: this.state.data.public,
members: {
create: [
...membersCreate,
{
user: { connect: { id: currentUserId } },
},
],
},
},
},
refetchQueries: [getOperationName(UserChannelsPreviewDocument) as string],
});
} finally {
this.setState({
submitting: false,
});
}
const channelIdentity = get(response, 'data.channelCreate.members.items', []).find(
(el: any) => el.user.id === currentUserId,
);
if (channelIdentity) {
this.props.setChannel({
channelIdentityId: channelIdentity.id,
});
this.closeDialog();
}
};
private closeDialog = () => {
this.context.closeModal(CREATE_CHANNEL_DIALOG_ID);
};
private onChange = (val: string, e: any) => {
const targetName = e.target.name;
this.setState(s => ({
data: {
...s.data,
[targetName]: val,
},
errors: {
...s.errors,
[targetName]: undefined,
},
}));
};
private onChangeUserSelect = (val: string[]) => {
this.setState(s => ({
data: {
...s.data,
users: val,
},
}));
};
private validateData(data: IDialogContentState['data']) {
const errors: any = {};
if (!data.name) {
errors.name = 'Required';
}
return errors;
}
}
function CreateChannelDialog(props: ICreateChannelDialogProps) {
return (
);
}
export default compose(
withChannelCreate({
name: 'createChannel',
}),
withContext({ context: ChatContext, keys: ['user', 'setChannel', 'usersFilter'] }),
)(CreateChannelDialog);