insomnia/app/ui/components/dropdowns/WorkspaceDropdown.js

111 lines
3.8 KiB
JavaScript
Raw Normal View History

import React, {Component, PropTypes} from 'react';
2016-11-28 20:16:07 +00:00
import classnames from 'classnames';
import {ipcRenderer, shell} from 'electron';
2016-11-29 01:47:04 +00:00
import {Dropdown, DropdownDivider, DropdownButton, DropdownItem, DropdownHint, DropdownRight} from '../base/dropdown';
import PromptModal from '../modals/PromptModal';
2016-11-28 20:16:07 +00:00
import SettingsModal, {TAB_INDEX_EXPORT} from '../modals/SettingsModal';
import * as models from '../../../models';
import {getAppVersion} from '../../../common/constants';
import {showModal} from '../modals/index';
import {trackEvent} from '../../../analytics/index';
2016-11-23 20:10:53 +00:00
import Link from '../base/Link';
2016-11-28 20:16:07 +00:00
import WorkspaceSettingsModal from '../modals/WorkspaceSettingsModal';
class WorkspaceDropdown extends Component {
2016-11-28 20:16:07 +00:00
_handleShowExport = () => showModal(SettingsModal, TAB_INDEX_EXPORT);
_handleShowSettings = () => showModal(SettingsModal);
_handleShowWorkspaceSettings = () => {
showModal(WorkspaceSettingsModal, {
workspace: this.props.activeWorkspace,
});
2016-11-28 20:16:07 +00:00
};
2016-11-28 20:16:07 +00:00
_handleSwitchWorkspace = workspaceId => {
this.props.handleSetActiveWorkspace(workspaceId);
trackEvent('Workspace', 'Switch');
};
2016-11-28 20:16:07 +00:00
_handleWorkspaceCreate = async noTrack => {
const name = await showModal(PromptModal, {
headerName: 'Create New Workspace',
defaultValue: 'My Workspace',
submitName: 'Create',
selectText: true
});
const workspace = await models.workspace.create({name});
this.props.handleSetActiveWorkspace(workspace._id);
2016-11-28 20:16:07 +00:00
if (!noTrack) {
trackEvent('Workspace', 'Create');
}
};
render () {
const {
className,
workspaces,
activeWorkspace,
isLoading,
...other
} = this.props;
2016-11-28 20:16:07 +00:00
const nonActiveWorkspaces = workspaces.filter(w => w._id !== activeWorkspace._id);
return (
2016-11-29 01:47:04 +00:00
<Dropdown className={classnames(className, 'wide', 'workspace-dropdown')} {...other}>
<DropdownButton className="btn wide">
<h1 className="no-pad text-left">
<div className="pull-right">
2016-11-28 20:16:07 +00:00
{isLoading ? <i className="fa fa-refresh fa-spin txt-lg"/> : null}
{" "}
<i className="fa fa-caret-down"/>
</div>
{activeWorkspace.name}
</h1>
</DropdownButton>
2016-11-28 20:16:07 +00:00
<DropdownDivider name={activeWorkspace.name}/>
<DropdownItem onClick={this._handleShowWorkspaceSettings}>
2016-11-29 21:28:22 +00:00
<i className="fa fa-wrench"/> Workspace Settings
<DropdownHint char="&#8679;,"/>
</DropdownItem>
<DropdownDivider name="Switch Workspace"/>
2016-11-28 20:16:07 +00:00
{nonActiveWorkspaces.map(w => (
<DropdownItem key={w._id} onClick={this._handleSwitchWorkspace} value={w._id}>
<i className="fa fa-random"/> To <strong>{w.name}</strong>
</DropdownItem>
))}
2016-11-28 20:16:07 +00:00
<DropdownItem onClick={this._handleWorkspaceCreate}>
<i className="fa fa-empty"/> New Workspace
</DropdownItem>
<DropdownDivider name={`Insomnia Version ${getAppVersion()}`}/>
2016-11-28 20:16:07 +00:00
<DropdownItem onClick={this._handleShowSettings}>
<i className="fa fa-cog"/> Preferences
2016-11-29 01:47:04 +00:00
<DropdownHint char=","/>
</DropdownItem>
<DropdownItem onClick={this._handleShowExport}>
<i className="fa fa-share"/> Import/Export
</DropdownItem>
2016-11-23 20:10:53 +00:00
<DropdownItem buttonClass={Link} href="https://insomnia.rest/teams/" button={true}>
<i className="fa fa-users"/> Invite Your Team
</DropdownItem>
</Dropdown>
)
}
}
WorkspaceDropdown.propTypes = {
isLoading: PropTypes.bool.isRequired,
handleImportFile: PropTypes.func.isRequired,
handleExportFile: PropTypes.func.isRequired,
handleSetActiveWorkspace: PropTypes.func.isRequired,
workspaces: PropTypes.arrayOf(PropTypes.object).isRequired,
activeWorkspace: PropTypes.object.isRequired,
};
export default WorkspaceDropdown;