import React, {PropTypes, PureComponent} from 'react'; import autobind from 'autobind-decorator'; import {Dropdown, DropdownButton, DropdownDivider, DropdownItem} from '../base/dropdown'; import Link from '../base/link'; import Modal from '../base/modal'; import ModalBody from '../base/modal-body'; import ModalHeader from '../base/modal-header'; import ModalFooter from '../base/modal-footer'; import * as session from '../../../sync/session'; import * as sync from '../../../sync/index'; import {showPrompt} from './index'; import PromptButton from '../base/prompt-button'; import {trackEvent} from '../../../analytics/index'; @autobind class WorkspaceShareSettingsModal extends PureComponent { constructor (props) { super(props); this.state = {}; } _handleSubmit (e) { e.preventDefault(); } _handleClose () { this.hide(); } _setModalRef (n) { this.modal = n; } async _handleUnshare () { if (!session.isLoggedIn()) { return; } const {resourceGroup} = this.state; this._resetState({loading: true}); try { await session.unshareWithAllTeams(resourceGroup.id); await this._load(); } catch (err) { console.warn('Failed to unshare workspace', err); this._resetState({error: err.message, loading: false}); } } _handleShareWithTeam (team) { showPrompt({ headerName: 'Share Workspace', label: 'Confirm password to share workspace', placeholder: '•••••••••••••••••', submitName: 'Share with Team', inputType: 'password', onComplete: async passphrase => { const {resourceGroup} = this.state; this._resetState({loading: true}); try { await session.shareWithTeam(resourceGroup.id, team.id, passphrase); await this._load(); } catch (err) { this._resetState({error: err.message, loading: false}); } } }); } async _load () { if (!session.isLoggedIn()) { this._resetState({}); return; } const {workspace} = this.props; const resource = await sync.getOrCreateResourceForDoc(workspace); const teams = await session.listTeams(); try { const resourceGroup = await sync.fetchResourceGroup(resource.resourceGroupId, true); this.setState({teams, resourceGroup, loading: false, error: ''}); } catch (err) { console.warn('Failed to fetch ResourceGroup', err); this.setState({error: 'No sync info found. Please try again.', loading: false}); trackEvent('Sync', 'Error', 'Share Fetch Fail'); } } _resetState (patch = {}) { this.setState(Object.assign({ teams: [], resourceGroup: null, error: '', loading: false }, patch)); } async show () { this.modal.show(); this._resetState(); await this._load(); } hide () { this.modal.hide(); } componentWillMount () { this._resetState(); } render () { const {teams, resourceGroup, error, loading} = this.state; const {workspace} = this.props; return (
Share Workspace

Share {workspace.name} to automatically sync your API workspace with your team members.

{error ?
Oops: {error}
: null} Teams {!loading ? ( resourceGroup && resourceGroup.teamId ? ( Shared with {' '} {resourceGroup.teamName} {' '} ) : ( Private ) ) : ( Loading... {' '} )} {teams.map(team => ( Share with {team.name} ))} {teams.length === 0 && ( You have no teams )} Other Private    Manage Teams
); } } WorkspaceShareSettingsModal.propTypes = { workspace: PropTypes.object.isRequired }; export default WorkspaceShareSettingsModal;