Skip to content

Commit 4e483af

Browse files
🔨 Refactor, 🧠 Overmind Hactoberfest | Refactor /app/pages/Da… (codesandbox#2906)
🔨 Refactor, 🧠 Overmind Hactoberfest | Refactor /app/pages/Dashboard/Content/routes/TeamView/AddTeamMember/index.js to use Overmind, Typescript, and Apollo hooks
2 parents aa0ff82 + 73d6585 commit 4e483af

File tree

5 files changed

+93
-88
lines changed

5 files changed

+93
-88
lines changed

‎packages/app/src/app/pages/Dashboard/Content/routes/TeamView/AddTeamMember/index.js‎

Lines changed: 0 additions & 85 deletions
This file was deleted.
Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,79 @@
1+
import React from 'react';
2+
import styled from 'styled-components';
3+
4+
import { useMutation } from '@apollo/react-hooks';
5+
6+
import Input from '@codesandbox/common/lib/components/Input';
7+
import { Button } from '@codesandbox/common/lib/components/Button';
8+
import track from '@codesandbox/common/lib/utils/analytics';
9+
10+
import { useOvermind } from 'app/overmind';
11+
import { INVITE_TO_TEAM } from '../../../../queries';
12+
import { IAddTeamMemberProps, IMutationVariables } from './types';
13+
14+
const ErrorMessage = styled.div`
15+
color: ${props => props.theme.red};
16+
font-weight: 600;
17+
font-size: 0.875rem;
18+
margin-bottom: 0.5rem;
19+
`;
20+
21+
export const AddTeamMember: React.FC<IAddTeamMemberProps> = ({ teamId }) => {
22+
const { actions } = useOvermind();
23+
const [inviteToTeam, { loading, error }] = useMutation(INVITE_TO_TEAM);
24+
let input: HTMLInputElement = null;
25+
26+
const submit: React.FormEventHandler = e => {
27+
e.preventDefault();
28+
e.stopPropagation();
29+
30+
let isEmail = input.value.includes('@');
31+
32+
track('Team - Add Member', { email: isEmail });
33+
34+
isEmail = false;
35+
36+
// We don't enable email for now for privacy reasons
37+
38+
const variables: IMutationVariables = { teamId };
39+
40+
const { value } = input;
41+
if (isEmail) {
42+
variables.email = value;
43+
} else {
44+
variables.username = value;
45+
}
46+
47+
inviteToTeam({
48+
variables,
49+
}).then(() => {
50+
actions.notificationAdded({
51+
title: `${value} has been invited!`,
52+
notificationType: 'success',
53+
});
54+
});
55+
56+
input.value = '';
57+
};
58+
59+
const errorMessage =
60+
error && error.graphQLErrors && error.graphQLErrors[0].message;
61+
62+
return (
63+
<>
64+
{errorMessage && <ErrorMessage>{errorMessage}</ErrorMessage>}
65+
<form style={{ display: 'flex' }} onSubmit={loading ? undefined : submit}>
66+
<Input
67+
ref={node => {
68+
input = node;
69+
}}
70+
placeholder="Add member by username"
71+
block
72+
/>
73+
<Button disabled={loading} style={{ width: 200 }} small>
74+
{loading ? 'Adding Member...' : 'Add Member'}
75+
</Button>
76+
</form>
77+
</>
78+
);
79+
};
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
type TeamId = string;
2+
3+
export interface IAddTeamMemberProps {
4+
teamId: TeamId;
5+
}
6+
7+
export interface IMutationVariables {
8+
teamId: TeamId;
9+
email?: string;
10+
username?: string;
11+
}

‎packages/app/src/app/pages/Dashboard/Content/routes/TeamView/RemoveTeamMember/index.js‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ import { REMOVE_FROM_TEAM, LEAVE_TEAM } from '../../../../queries';
1111

1212
import { StyledCrossIcon } from '../elements';
1313

14-
export default ({
14+
export const RemoveTeamMember = ({
1515
creatorId,
1616
currentUserId,
1717
userId,

‎packages/app/src/app/pages/Dashboard/Content/routes/TeamView/index.js‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,8 +24,8 @@ import {
2424
SET_TEAM_DESCRIPTION,
2525
} from '../../../queries';
2626

27-
import AddTeamMember from './AddTeamMember';
28-
import RemoveTeamMember from './RemoveTeamMember';
27+
import { AddTeamMember } from './AddTeamMember';
28+
import { RemoveTeamMember } from './RemoveTeamMember';
2929

3030
const User = ({ user, rightElement }) => (
3131
<div

0 commit comments

Comments
 (0)