mirror of
https://github.com/Kong/insomnia
synced 2024-11-08 23:00:30 +00:00
d675222bdd
* Add Slack badge to README * Add Twitter badge * Appveyor badge * Fix badges again on README * Fix Twitter badge link * Simplify README.md * Migrate Travis secure items to Travis project settings (#198) * Remove docker linux build (using Travis now) (#199) * Fix travis build * Update Issue and PR templates (#200) * Add template for future pull requests * Format issue template like pull request template * Will not clear selected file if dialog is dismissed (#202) * #183, Body type "Text -> Other" reverts to previous body type (#193) * ISSUE#183 * Adding condition to check mime-type to other * Removing older changes for fixing issue. * Save full response to a file (#207) * Save full response to a file * Add a new button on the response preview pane * Save full response to file when button clicked * Update after PR comments * It's a Response, not a Request * Remove file extension requirement * Implement lazy tag rendering and some fixes (#211) * expanding to 3 decimals (#213) * Update PULL_REQUEST_TEMPLATE.md (#214) * Show build info in console (#216) * Add waiting message in dev mode while webpack compile happens * Switch license from GPL to AGPL (#221) * Default remote URLs to production * Don't use Curl's cookie handling (#220) * Some improvements to the response tag * Add tests for XPath response queries * Refactor conditional element syntax * Add option to toggle Menu Bar showing for Windows/Linux (#225) * Add option to toggle MenuBar showing on Windows/Linux * Extract Toggling Menu Bar functionality to App Container. Default show Menu Bar. Remove tip from Response Pane. * Finalize {% response ... %} Tag (#224) * Some improvements to the response tag * Add tests for XPath response queries * Refactor conditional element syntax * Update nunjucks-tags.js * Better Nunjucks Tag Editor (#234) * Helper to tokenize Nunjucks tag * More granular types * Add tag definitions * Improve editor to be more WYSIWYG * Fixed tests * Added raw response tag * A few improvements to tag editor enum * fix NTLM typo (#244) * Tweaks and fixes for next release (#245)
194 lines
6.0 KiB
JavaScript
194 lines
6.0 KiB
JavaScript
import React, {PureComponent, PropTypes} from 'react';
|
|
import autobind from 'autobind-decorator';
|
|
import {Dropdown, DropdownButton, DropdownItem, DropdownDivider} 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 {showModal} from './index';
|
|
import PromptModal from './prompt-modal';
|
|
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});
|
|
}
|
|
}
|
|
|
|
async _handleShareWithTeam (team) {
|
|
const passphrase = await showModal(PromptModal, {
|
|
headerName: 'Share Workspace',
|
|
label: 'Confirm password to share workspace',
|
|
placeholder: '•••••••••••••••••',
|
|
submitName: 'Share with Team',
|
|
inputType: 'password'
|
|
});
|
|
|
|
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 (
|
|
<form onSubmit={this._handleSubmit}>
|
|
<Modal ref={this._setModalRef}>
|
|
<ModalHeader key="header">Share Workspace</ModalHeader>
|
|
<ModalBody key="body" className="pad text-center" noScroll>
|
|
<p>
|
|
Share <strong>{workspace.name}</strong> to automatically sync
|
|
your API workspace with your team members.
|
|
</p>
|
|
<div className="form-control pad">
|
|
{error ? <div className="danger">Oops: {error}</div> : null}
|
|
<Dropdown outline>
|
|
<DropdownDivider>Teams</DropdownDivider>
|
|
{!loading ? (
|
|
resourceGroup && resourceGroup.teamId ? (
|
|
<DropdownButton className="btn btn--clicky">
|
|
<i className="fa fa-users"/> Shared with
|
|
{' '}
|
|
<strong>{resourceGroup.teamName}</strong>
|
|
{' '}
|
|
<i className="fa fa-caret-down"/>
|
|
</DropdownButton>
|
|
) : (
|
|
<DropdownButton className="btn btn--clicky">
|
|
<i className="fa fa-lock"/> Private <i className="fa fa-caret-down"/>
|
|
</DropdownButton>
|
|
)
|
|
) : (
|
|
<DropdownButton className="btn btn--clicky">
|
|
<i className="fa fa-spin fa-refresh"/> Loading...
|
|
{' '}
|
|
<i className="fa fa-caret-down"/>
|
|
</DropdownButton>
|
|
)}
|
|
{teams.map(team => (
|
|
<DropdownItem key={team.id} value={team} onClick={this._handleShareWithTeam}>
|
|
<i className="fa fa-users"/> Share with <strong>{team.name}</strong>
|
|
</DropdownItem>
|
|
))}
|
|
{teams.length === 0 && (
|
|
<DropdownItem disabled onClick={this._handleShareWithTeam}>
|
|
<i className="fa fa-warning"/> You have no teams
|
|
</DropdownItem>
|
|
)}
|
|
<DropdownDivider>Other</DropdownDivider>
|
|
<DropdownItem addIcon buttonClass={PromptButton}
|
|
confirmMessage="Really make private?"
|
|
onClick={this._handleUnshare}>
|
|
<i className="fa fa-lock"/> Private
|
|
</DropdownItem>
|
|
</Dropdown>
|
|
|
|
<Link button className="btn btn--super-compact inline-block"
|
|
href="https://insomnia.rest/app/teams/">
|
|
Manage Teams
|
|
</Link>
|
|
</div>
|
|
</ModalBody>
|
|
<ModalFooter key="footer">
|
|
<button type="button" className="btn" onClick={this._handleClose}>
|
|
Done
|
|
</button>
|
|
</ModalFooter>
|
|
</Modal>
|
|
</form>
|
|
);
|
|
}
|
|
}
|
|
|
|
WorkspaceShareSettingsModal.propTypes = {
|
|
workspace: PropTypes.object.isRequired
|
|
};
|
|
|
|
export default WorkspaceShareSettingsModal;
|