diff --git a/app/components/Auth.js b/app/components/Auth.js index 90c9fd202..93a5dcd60 100644 --- a/app/components/Auth.js +++ b/app/components/Auth.js @@ -2,7 +2,8 @@ import React from 'react'; import { Provider } from 'mobx-react'; import stores from 'stores'; -import SettingsStore from 'stores/SettingsStore'; +import ApiKeysStore from 'stores/ApiKeysStore'; +import UsersStore from 'stores/UsersStore'; import DocumentsStore from 'stores/DocumentsStore'; import CollectionsStore from 'stores/CollectionsStore'; import CacheStore from 'stores/CacheStore'; @@ -22,7 +23,8 @@ const Auth = ({ children }: Props) => { const { user, team } = stores.auth; const cache = new CacheStore(user.id); authenticatedStores = { - settings: new SettingsStore(), + apiKeys: new ApiKeysStore(), + users: new UsersStore(), documents: new DocumentsStore({ ui: stores.ui, cache, diff --git a/app/components/Layout/Layout.js b/app/components/Layout/Layout.js index f01f72126..146e6f175 100644 --- a/app/components/Layout/Layout.js +++ b/app/components/Layout/Layout.js @@ -17,6 +17,7 @@ import Sidebar from 'components/Sidebar'; import SettingsSidebar from 'components/Sidebar/Settings'; import Modals from 'components/Modals'; import Toasts from 'components/Toasts'; +import ErrorSuspended from 'scenes/ErrorSuspended'; import AuthStore from 'stores/AuthStore'; import UiStore from 'stores/UiStore'; @@ -71,6 +72,8 @@ class Layout extends React.Component { const { user, team } = auth; const showSidebar = auth.authenticated && user && team; + if (auth.isSuspended) return ; + return ( diff --git a/app/components/Sidebar/Settings.js b/app/components/Sidebar/Settings.js index 90995ffc0..8f9534eb2 100644 --- a/app/components/Sidebar/Settings.js +++ b/app/components/Sidebar/Settings.js @@ -53,8 +53,8 @@ class SettingsSidebar extends Component {
Team
- }> - Members + }> + Users - + { + return ( + + +

+ + ⚠️ + {' '} + Your account has been suspended +

+ +

+ A team admin ({auth.suspendedContactEmail}) has + suspended your account. To re-activate your account, please reach out to + them directly. +

+
+ ); +}); + +export default inject('auth')(ErrorSuspended); diff --git a/app/scenes/ErrorSuspended/index.js b/app/scenes/ErrorSuspended/index.js new file mode 100644 index 000000000..9406c3935 --- /dev/null +++ b/app/scenes/ErrorSuspended/index.js @@ -0,0 +1,3 @@ +// @flow +import ErrorSuspended from './ErrorSuspended'; +export default ErrorSuspended; diff --git a/app/scenes/Settings/Members.js b/app/scenes/Settings/Members.js deleted file mode 100644 index 748b90f83..000000000 --- a/app/scenes/Settings/Members.js +++ /dev/null @@ -1,95 +0,0 @@ -// @flow -import React, { Component } from 'react'; -import { observable } from 'mobx'; -import { observer, inject } from 'mobx-react'; -import styled from 'styled-components'; -import Flex from 'shared/components/Flex'; -import Avatar from 'components/Avatar'; -import { color } from 'shared/styles/constants'; - -import ErrorsStore from 'stores/ErrorsStore'; -import SettingsStore from 'stores/SettingsStore'; -import CenteredContent from 'components/CenteredContent'; -import LoadingPlaceholder from 'components/LoadingPlaceholder'; -import PageTitle from 'components/PageTitle'; - -@observer -class Members extends Component { - props: { - errors: ErrorsStore, - settings: SettingsStore, - }; - - @observable members; - @observable isLoaded: boolean = false; - - @observable inviteEmails: string = ''; - @observable isInviting: boolean = false; - - componentDidMount() { - this.props.settings.fetchMembers(); - } - - render() { - return ( - - -

Members

- - {!this.props.settings.isFetching ? ( - - {this.props.settings.members && ( - - {this.props.settings.members.map(member => ( - - - - - {member.name} {member.email && `(${member.email})`} - {member.isAdmin && Admin} - - - - ))} - - )} - - ) : ( - - )} -
- ); - } -} - -const MemberList = styled(Flex)` - border: 1px solid ${color.smoke}; - border-radius: 4px; - - margin-top: 20px; - margin-bottom: 40px; -`; - -const Member = styled(Flex)` - padding: 10px; - border-bottom: 1px solid ${color.smoke}; - font-size: 15px; - - &:last-child { - border-bottom: none; - } -`; - -const UserName = styled.span` - padding-left: 8px; -`; - -const AdminBadge = styled.span` - margin-left: 10px; - color: #777; - font-size: 13px; - text-transform: uppercase; - font-weight: normal; -`; - -export default inject('errors', 'settings')(Members); diff --git a/app/scenes/Settings/Tokens.js b/app/scenes/Settings/Tokens.js index c7c9ff516..d753b41e9 100644 --- a/app/scenes/Settings/Tokens.js +++ b/app/scenes/Settings/Tokens.js @@ -5,7 +5,7 @@ import { observer, inject } from 'mobx-react'; import { Link } from 'react-router-dom'; import styled from 'styled-components'; import ApiToken from './components/ApiToken'; -import SettingsStore from 'stores/SettingsStore'; +import ApiKeysStore from 'stores/ApiKeysStore'; import { color } from 'shared/styles/constants'; import Button from 'components/Button'; @@ -19,11 +19,11 @@ import Subheading from 'components/Subheading'; class Tokens extends Component { @observable name: string = ''; props: { - settings: SettingsStore, + apiKeys: ApiKeysStore, }; componentDidMount() { - this.props.settings.fetchApiKeys(); + this.props.apiKeys.fetchPage({ limit: 100 }); } handleUpdate = (ev: SyntheticInputEvent) => { @@ -32,13 +32,13 @@ class Tokens extends Component { handleSubmit = async (ev: SyntheticEvent) => { ev.preventDefault(); - await this.props.settings.createApiKey(this.name); + await this.props.apiKeys.createApiKey(this.name); this.name = ''; }; render() { - const { settings } = this.props; - const hasApiKeys = settings.apiKeys.length > 0; + const { apiKeys } = this.props; + const hasApiKeys = apiKeys.data.length > 0; return ( @@ -49,13 +49,13 @@ class Tokens extends Component { Your tokens, - {settings.apiKeys.map(key => ( + {apiKeys.data.map(key => ( ))} @@ -78,7 +78,7 @@ class Tokens extends Component {