create group functionality

This commit is contained in:
Matilde Park 2019-12-11 01:36:12 -05:00 committed by Logan Allen
parent 56a1c3400a
commit 761ea7cc9c

View File

@ -1,6 +1,8 @@
import React, { Component } from 'react' import React, { Component } from 'react'
import { Route, Link } from 'react-router-dom'; import { Route, Link } from 'react-router-dom';
import { deSig } from '/lib/util';
import urbitOb from 'urbit-ob';
export class NewScreen extends Component { export class NewScreen extends Component {
constructor(props) { constructor(props) {
@ -9,8 +11,10 @@ export class NewScreen extends Component {
this.state = { this.state = {
groupName: '', groupName: '',
invites: '', invites: '',
color: '' color: '',
} groupNameError: false,
inviteError: false
};
this.groupNameChange = this.groupNameChange.bind(this); this.groupNameChange = this.groupNameChange.bind(this);
this.invChange = this.invChange.bind(this); this.invChange = this.invChange.bind(this);
@ -35,13 +39,87 @@ export class NewScreen extends Component {
// }); // });
// } // }
onClickCreate() {
const { props, state } = this;
if (!state.groupName) {
this.setState({
groupNameError: true,
inviteError: false
});
return;
}
let group = `/~${window.ship}` + `/${state.groupName}`;
let aud = [];
let isValid = true;
if (state.invites.length > 2) {
aud = state.invites.split(',')
.map((mem) => `~${deSig(mem.trim())}`);
aud.forEach((mem) => {
if (!urbitOb.isValidPatp(mem)) {
isValid = false;
}
});
}
if (!isValid) {
this.setState({
inviteError: true,
groupNameError: false
});
return;
}
if (this.textarea) {
this.textarea.value = '';
}
this.setState({
error: false,
success: true,
invites: ''
}, () => {
props.setSpinner(true);
props.api.contactCreate(group);
//TODO add YOU to the group, but without invites
aud.forEach((ship) => {
if (ship !== `~${window.ship}`) {
props.api.invite.invite(group, ship);
}
});
});
}
render() { render() {
let groupNameErrElem = (<span />);
if (this.state.groupNameError) {
groupNameErrElem = (
<span className="f9 inter red2 ml3 mt1 db">
Group must have a valid name.
</span>
);
}
let invErrElem = (<span />);
if (this.state.inviteError) {
invErrElem = (
<span className="f9 inter red2 ml3 mb5 db">
Invites must be validly formatted ship names.
</span>
);
}
return ( return (
<div className="h-100 w-100 flex flex-column overflow-y-scroll"> <div className="h-100 w-100 flex flex-column overflow-y-scroll">
<div className="w-100 w-50-l w-50-xl mb4"> <div className="w-100 dn-m dn-l dn-xl inter pt1 pb6 pl3 pt3 f8">
<Link to="/~contacts/">{"⟵ All Groups"}</Link>
</div>
<div className="w-100 w-50-l w-50-xl mb4 pr6 pr0-l pr0-xl">
<h2 className="f8 pl3 pt4">Create New Group</h2> <h2 className="f8 pl3 pt4">Create New Group</h2>
<h2 className="f8 pl3 pt6">Group Name</h2> <h2 className="f8 pl3 pt6">Group Name</h2>
<p className="f9 pl3 gray2 lh-copy">Alphanumeric characters only</p> <p className="f9 pl3 gray2 lh-copy">Alphanumeric characters and hyphens only</p>
<textarea <textarea
className="f7 ba b--gray3 w-100 pa3 ml3 mt2" className="f7 ba b--gray3 w-100 pa3 ml3 mt2"
rows={1} rows={1}
@ -51,7 +129,8 @@ export class NewScreen extends Component {
height: 48, height: 48,
paddingTop: 14 paddingTop: 14
}} }}
/> onChange={this.groupNameChange}/>
{groupNameErrElem}
{/* <h2 className="f8 pl3 pt6">Group Avatar</h2> {/* <h2 className="f8 pl3 pt6">Group Avatar</h2>
<p className="f9 pl3 gray2 lh-copy"> <p className="f9 pl3 gray2 lh-copy">
Select a color to represent your group Select a color to represent your group
@ -68,31 +147,34 @@ export class NewScreen extends Component {
/> */} /> */}
<h2 className="f8 pl3 pt6">Add Group Members</h2> <h2 className="f8 pl3 pt6">Add Group Members</h2>
<p className="f9 pl3 gray2 lh-copy"> <p className="f9 pl3 gray2 lh-copy">
Search for ships to invite to your group Invite ships to your group
</p> </p>
<div className="relative"> <div className="relative">
<textarea <textarea
className="f8 ba b--gray3 w-100 pa3 pl7 ml3 mt2 mb7" className="f8 ba b--gray3 w-100 pa3 pl3 ml3 mt2 mb2"
rows={1} rows={1}
placeholder="Search for ships..." placeholder="~zod, ~dopzod, ~ravmel-ropdyl"
style={{ style={{
resize: "none", resize: "none",
height: 48, height: 48,
paddingTop: 15 paddingTop: 15
}} }}
/> onChange={this.invChange}/>
<span className="f5 gray3 absolute" {invErrElem}
{/* <span className="f5 gray3 absolute"
style={{transform: "rotate(-45deg)", style={{transform: "rotate(-45deg)",
left: 21, left: 21,
top: 18}}> top: 18}}>
</span> </span> */}
</div> </div>
<button className="ml3 f8 ba pa2 b--green2 green2"> <button
onClick={this.onClickCreate.bind(this)}
className="ml3 f8 ba pa2 b--green2 green2 pointer">
Start Group Start Group
</button> </button>
<Link to="/~contacts"> <Link to="/~contacts">
<button className="f8 ml3 ba pa2 b--black">Cancel</button> <button className="f8 ml3 ba pa2 b--black pointer">Cancel</button>
</Link> </Link>
</div> </div>
</div> </div>