[MM-14093] Rename 'team' to 'server' and 'tab' to 'view' in most cases, some additional cleanup (#2711)

* Rename MattermostTeam -> UniqueServer, MattermostTab -> UniqueView

* Rename 'team' to 'server'

* Some further cleanup

* Rename weirdly named function

* Rename 'tab' to 'view' in most instances

* Fix i18n

* PR feedback
This commit is contained in:
Devin Binnie
2023-05-08 09:17:01 -04:00
committed by GitHub
parent 9f75ddcf0f
commit 316beba950
110 changed files with 1698 additions and 1757 deletions

View File

@@ -5,7 +5,7 @@ import React, {useState, useCallback, useEffect} from 'react';
import {useIntl, FormattedMessage} from 'react-intl';
import classNames from 'classnames';
import {MattermostTeam} from 'types/config';
import {UniqueServer} from 'types/config';
import {isValidURL, parseURL} from 'common/utils/url';
import {MODAL_TRANSITION_TIMEOUT} from 'common/utils/constants';
@@ -22,8 +22,8 @@ import 'renderer/css/components/ConfigureServer.scss';
import 'renderer/css/components/LoadingScreen.css';
type ConfigureServerProps = {
currentTeams: MattermostTeam[];
team?: MattermostTeam;
currentServers: UniqueServer[];
server?: UniqueServer;
mobileView?: boolean;
darkMode?: boolean;
messageTitle?: string;
@@ -32,12 +32,12 @@ type ConfigureServerProps = {
alternateLinkMessage?: string;
alternateLinkText?: string;
alternateLinkURL?: string;
onConnect: (data: MattermostTeam) => void;
onConnect: (data: UniqueServer) => void;
};
function ConfigureServer({
currentTeams,
team,
currentServers,
server,
mobileView,
darkMode,
messageTitle,
@@ -54,7 +54,7 @@ function ConfigureServer({
name: prevName,
url: prevURL,
id,
} = team || {};
} = server || {};
const [transition, setTransition] = useState<'inFromRight' | 'outToLeft'>();
const [name, setName] = useState(prevName || '');
@@ -92,14 +92,14 @@ function ConfigureServer({
if (!newName) {
return formatMessage({
id: 'renderer.components.newTeamModal.error.nameRequired',
id: 'renderer.components.newServerModal.error.nameRequired',
defaultMessage: 'Name is required.',
});
}
if (currentTeams.find(({name: existingName}) => existingName === newName)) {
if (currentServers.find(({name: existingName}) => existingName === newName)) {
return formatMessage({
id: 'renderer.components.newTeamModal.error.serverNameExists',
id: 'renderer.components.newServerModal.error.serverNameExists',
defaultMessage: 'A server with the same name already exists.',
});
}
@@ -110,28 +110,28 @@ function ConfigureServer({
const validateURL = async (fullURL: string) => {
if (!fullURL) {
return formatMessage({
id: 'renderer.components.newTeamModal.error.urlRequired',
id: 'renderer.components.newServerModal.error.urlRequired',
defaultMessage: 'URL is required.',
});
}
if (!parseURL(fullURL)) {
return formatMessage({
id: 'renderer.components.newTeamModal.error.urlIncorrectFormatting',
id: 'renderer.components.newServerModal.error.urlIncorrectFormatting',
defaultMessage: 'URL is not formatted correctly.',
});
}
if (!isValidURL(fullURL)) {
return formatMessage({
id: 'renderer.components.newTeamModal.error.urlNeedsHttp',
id: 'renderer.components.newServerModal.error.urlNeedsHttp',
defaultMessage: 'URL should start with http:// or https://.',
});
}
if (currentTeams.find(({url: existingURL}) => parseURL(existingURL)?.toString === parseURL(fullURL)?.toString())) {
if (currentServers.find(({url: existingURL}) => parseURL(existingURL)?.toString === parseURL(fullURL)?.toString())) {
return formatMessage({
id: 'renderer.components.newTeamModal.error.serverUrlExists',
id: 'renderer.components.newServerModal.error.serverUrlExists',
defaultMessage: 'A server with the same URL already exists.',
});
}

View File

@@ -10,7 +10,7 @@ import {Container, Row} from 'react-bootstrap';
import {DropResult} from 'react-beautiful-dnd';
import {injectIntl, IntlShape} from 'react-intl';
import {MattermostTab, MattermostTeam} from 'types/config';
import {UniqueView, UniqueServer} from 'types/config';
import {DownloadedItems} from 'types/downloads';
import restoreButton from '../../assets/titlebar/chrome-restore.svg';
@@ -23,7 +23,7 @@ import {playSound} from '../notificationSounds';
import TabBar from './TabBar';
import ExtraBar from './ExtraBar';
import ErrorView from './ErrorView';
import TeamDropdownButton from './TeamDropdownButton';
import ServerDropdownButton from './ServerDropdownButton';
import DownloadsDropdownButton from './DownloadsDropdown/DownloadsDropdownButton';
import '../css/components/UpgradeButton.scss';
@@ -47,8 +47,8 @@ type Props = {
type State = {
activeServerId?: string;
activeTabId?: string;
servers: MattermostTeam[];
tabs: Map<string, MattermostTab[]>;
servers: UniqueServer[];
tabs: Map<string, UniqueView[]>;
sessionsExpired: Record<string, boolean>;
unreadCounts: Record<string, boolean>;
mentionCounts: Record<string, number>;
@@ -147,7 +147,7 @@ class MainPage extends React.PureComponent<Props, State> {
setInitialActiveTab = async () => {
const lastActive = await window.desktop.getLastActive();
this.setActiveView(lastActive.server, lastActive.tab);
this.setActiveView(lastActive.server, lastActive.view);
}
updateServers = async () => {
@@ -239,11 +239,11 @@ class MainPage extends React.PureComponent<Props, State> {
this.setState({unreadCounts: newUnreads, mentionCounts: newMentionCounts, sessionsExpired: expired});
});
window.desktop.onCloseTeamsDropdown(() => {
window.desktop.onCloseServersDropdown(() => {
this.setState({isMenuOpen: false});
});
window.desktop.onOpenTeamsDropdown(() => {
window.desktop.onOpenServersDropdown(() => {
this.setState({isMenuOpen: true});
});
@@ -290,7 +290,7 @@ class MainPage extends React.PureComponent<Props, State> {
}
handleCloseDropdowns = () => {
window.desktop.closeTeamsDropdown();
window.desktop.closeServersDropdown();
this.closeDownloadsDropdown();
}
@@ -307,7 +307,7 @@ class MainPage extends React.PureComponent<Props, State> {
}
handleCloseTab = (tabId: string) => {
window.desktop.closeTab(tabId);
window.desktop.closeView(tabId);
}
handleDragAndDrop = async (dropResult: DropResult) => {
@@ -399,7 +399,7 @@ class MainPage extends React.PureComponent<Props, State> {
render() {
const {intl} = this.props;
let currentTabs: MattermostTab[] = [];
let currentTabs: UniqueView[] = [];
if (this.state.activeServerId) {
currentTabs = this.state.tabs.get(this.state.activeServerId) ?? [];
}
@@ -538,7 +538,7 @@ class MainPage extends React.PureComponent<Props, State> {
/>
</button>
{activeServer && (
<TeamDropdownButton
<ServerDropdownButton
isDisabled={this.state.modalOpen}
activeServerName={activeServer.name}
totalMentionCount={totalMentionCount}

View File

@@ -6,15 +6,15 @@ import React from 'react';
import {Modal, Button, FormGroup, FormControl, FormLabel, FormText} from 'react-bootstrap';
import {FormattedMessage, injectIntl, IntlShape} from 'react-intl';
import {MattermostTeam} from 'types/config';
import {UniqueServer} from 'types/config';
import {isValidURL} from 'common/utils/url';
type Props = {
onClose?: () => void;
onSave?: (team: MattermostTeam) => void;
team?: MattermostTeam;
currentTeams?: MattermostTeam[];
onSave?: (server: UniqueServer) => void;
server?: UniqueServer;
currentServers?: UniqueServer[];
editMode?: boolean;
show?: boolean;
restoreFocus?: boolean;
@@ -24,16 +24,16 @@ type Props = {
};
type State = {
teamName: string;
teamUrl: string;
teamId?: string;
teamOrder: number;
serverName: string;
serverUrl: string;
serverId?: string;
serverOrder: number;
saveStarted: boolean;
}
class NewTeamModal extends React.PureComponent<Props, State> {
class NewServerModal extends React.PureComponent<Props, State> {
wasShown?: boolean;
teamUrlInputRef?: HTMLInputElement;
serverUrlInputRef?: HTMLInputElement;
static defaultProps = {
restoreFocus: true,
@@ -44,90 +44,90 @@ class NewTeamModal extends React.PureComponent<Props, State> {
this.wasShown = false;
this.state = {
teamName: '',
teamUrl: '',
teamOrder: props.currentOrder || 0,
serverName: '',
serverUrl: '',
serverOrder: props.currentOrder || 0,
saveStarted: false,
};
}
initializeOnShow() {
this.setState({
teamName: this.props.team ? this.props.team.name : '',
teamUrl: this.props.team ? this.props.team.url : '',
teamId: this.props.team?.id,
serverName: this.props.server ? this.props.server.name : '',
serverUrl: this.props.server ? this.props.server.url : '',
serverId: this.props.server?.id,
saveStarted: false,
});
}
getTeamNameValidationError() {
getServerNameValidationError() {
if (!this.state.saveStarted) {
return null;
}
if (this.props.currentTeams) {
const currentTeams = [...this.props.currentTeams];
if (currentTeams.find((team) => team.id !== this.state.teamId && team.name === this.state.teamName)) {
if (this.props.currentServers) {
const currentServers = [...this.props.currentServers];
if (currentServers.find((server) => server.id !== this.state.serverId && server.name === this.state.serverName)) {
return (
<FormattedMessage
id='renderer.components.newTeamModal.error.serverNameExists'
id='renderer.components.newServerModal.error.serverNameExists'
defaultMessage='A server with the same name already exists.'
/>
);
}
}
return this.state.teamName.length > 0 ? null : (
return this.state.serverName.length > 0 ? null : (
<FormattedMessage
id='renderer.components.newTeamModal.error.nameRequired'
id='renderer.components.newServerModal.error.nameRequired'
defaultMessage='Name is required.'
/>
);
}
getTeamNameValidationState() {
return this.getTeamNameValidationError() === null ? null : 'error';
getServerNameValidationState() {
return this.getServerNameValidationError() === null ? null : 'error';
}
handleTeamNameChange = (e: React.ChangeEvent<HTMLInputElement>) => {
handleServerNameChange = (e: React.ChangeEvent<HTMLInputElement>) => {
this.setState({
teamName: e.target.value,
serverName: e.target.value,
});
}
getTeamUrlValidationError() {
getServerUrlValidationError() {
if (!this.state.saveStarted) {
return null;
}
if (this.props.currentTeams) {
const currentTeams = [...this.props.currentTeams];
if (currentTeams.find((team) => team.id !== this.state.teamId && team.url === this.state.teamUrl)) {
if (this.props.currentServers) {
const currentServers = [...this.props.currentServers];
if (currentServers.find((server) => server.id !== this.state.serverId && server.url === this.state.serverUrl)) {
return (
<FormattedMessage
id='renderer.components.newTeamModal.error.serverUrlExists'
id='renderer.components.newServerModal.error.serverUrlExists'
defaultMessage='A server with the same URL already exists.'
/>
);
}
}
if (this.state.teamUrl.length === 0) {
if (this.state.serverUrl.length === 0) {
return (
<FormattedMessage
id='renderer.components.newTeamModal.error.urlRequired'
id='renderer.components.newServerModal.error.urlRequired'
defaultMessage='URL is required.'
/>
);
}
if (!(/^https?:\/\/.*/).test(this.state.teamUrl.trim())) {
if (!(/^https?:\/\/.*/).test(this.state.serverUrl.trim())) {
return (
<FormattedMessage
id='renderer.components.newTeamModal.error.urlNeedsHttp'
id='renderer.components.newServerModal.error.urlNeedsHttp'
defaultMessage='URL should start with http:// or https://.'
/>
);
}
if (!isValidURL(this.state.teamUrl.trim())) {
if (!isValidURL(this.state.serverUrl.trim())) {
return (
<FormattedMessage
id='renderer.components.newTeamModal.error.urlIncorrectFormatting'
id='renderer.components.newServerModal.error.urlIncorrectFormatting'
defaultMessage='URL is not formatted correctly.'
/>
);
@@ -135,32 +135,32 @@ class NewTeamModal extends React.PureComponent<Props, State> {
return null;
}
getTeamUrlValidationState() {
return this.getTeamUrlValidationError() === null ? null : 'error';
getServerUrlValidationState() {
return this.getServerUrlValidationError() === null ? null : 'error';
}
handleTeamUrlChange = (e: React.ChangeEvent<HTMLInputElement>) => {
const teamUrl = e.target.value;
this.setState({teamUrl});
handleServerUrlChange = (e: React.ChangeEvent<HTMLInputElement>) => {
const serverUrl = e.target.value;
this.setState({serverUrl});
}
addProtocolToUrl = (teamUrl: string): Promise<void> => {
if (teamUrl.startsWith('http://') || teamUrl.startsWith('https://')) {
addProtocolToUrl = (serverUrl: string): Promise<void> => {
if (serverUrl.startsWith('http://') || serverUrl.startsWith('https://')) {
return Promise.resolve(undefined);
}
return window.desktop.modals.pingDomain(teamUrl).
return window.desktop.modals.pingDomain(serverUrl).
then((result: string) => {
this.setState({teamUrl: `${result}://${this.state.teamUrl}`});
this.setState({serverUrl: `${result}://${this.state.serverUrl}`});
}).
catch(() => {
console.error(`Could not ping url: ${teamUrl}`);
console.error(`Could not ping url: ${serverUrl}`);
});
}
getError() {
const nameError = this.getTeamNameValidationError();
const urlError = this.getTeamUrlValidationError();
const nameError = this.getServerNameValidationError();
const urlError = this.getServerUrlValidationError();
if (nameError && urlError) {
return (
@@ -179,20 +179,20 @@ class NewTeamModal extends React.PureComponent<Props, State> {
}
validateForm() {
return this.getTeamNameValidationState() === null &&
this.getTeamUrlValidationState() === null;
return this.getServerNameValidationState() === null &&
this.getServerUrlValidationState() === null;
}
save = async () => {
await this.addProtocolToUrl(this.state.teamUrl);
await this.addProtocolToUrl(this.state.serverUrl);
this.setState({
saveStarted: true,
}, () => {
if (this.validateForm()) {
this.props.onSave?.({
url: this.state.teamUrl,
name: this.state.teamName,
id: this.state.teamId,
url: this.state.serverUrl,
name: this.state.serverName,
id: this.state.serverId,
});
}
});
@@ -219,14 +219,14 @@ class NewTeamModal extends React.PureComponent<Props, State> {
if (this.props.editMode) {
return (
<FormattedMessage
id='renderer.components.newTeamModal.title.edit'
id='renderer.components.newServerModal.title.edit'
defaultMessage='Edit Server'
/>
);
}
return (
<FormattedMessage
id='renderer.components.newTeamModal.title.add'
id='renderer.components.newServerModal.title.add'
defaultMessage='Add Server'
/>
);
@@ -241,11 +241,11 @@ class NewTeamModal extends React.PureComponent<Props, State> {
return (
<Modal
bsClass='modal'
className='NewTeamModal'
className='NewServerModal'
show={this.props.show}
id='newServerModal'
enforceFocus={true}
onEntered={() => this.teamUrlInputRef?.focus()}
onEntered={() => this.serverUrlInputRef?.focus()}
onHide={this.props.onClose}
restoreFocus={this.props.restoreFocus}
onKeyDown={(e: React.KeyboardEvent) => {
@@ -272,58 +272,58 @@ class NewTeamModal extends React.PureComponent<Props, State> {
<FormGroup>
<FormLabel>
<FormattedMessage
id='renderer.components.newTeamModal.serverURL'
id='renderer.components.newServerModal.serverURL'
defaultMessage='Server URL'
/>
</FormLabel>
<FormControl
id='teamUrlInput'
id='serverUrlInput'
type='text'
value={this.state.teamUrl}
value={this.state.serverUrl}
placeholder='https://example.com'
onChange={this.handleTeamUrlChange}
onChange={this.handleServerUrlChange}
onClick={(e: React.MouseEvent<HTMLInputElement>) => {
e.stopPropagation();
}}
ref={(ref: HTMLInputElement) => {
this.teamUrlInputRef = ref;
this.serverUrlInputRef = ref;
if (this.props.setInputRef) {
this.props.setInputRef(ref);
}
}}
isInvalid={Boolean(this.getTeamUrlValidationState())}
isInvalid={Boolean(this.getServerUrlValidationState())}
autoFocus={true}
/>
<FormControl.Feedback/>
<FormText>
<FormattedMessage
id='renderer.components.newTeamModal.serverURL.description'
id='renderer.components.newServerModal.serverURL.description'
defaultMessage='The URL of your Mattermost server. Must start with http:// or https://.'
/>
</FormText>
</FormGroup>
<FormGroup className='NewTeamModal-noBottomSpace'>
<FormGroup className='NewServerModal-noBottomSpace'>
<FormLabel>
<FormattedMessage
id='renderer.components.newTeamModal.serverDisplayName'
id='renderer.components.newServerModal.serverDisplayName'
defaultMessage='Server Display Name'
/>
</FormLabel>
<FormControl
id='teamNameInput'
id='serverNameInput'
type='text'
value={this.state.teamName}
placeholder={this.props.intl.formatMessage({id: 'renderer.components.newTeamModal.serverDisplayName', defaultMessage: 'Server Display Name'})}
onChange={this.handleTeamNameChange}
value={this.state.serverName}
placeholder={this.props.intl.formatMessage({id: 'renderer.components.newServerModal.serverDisplayName', defaultMessage: 'Server Display Name'})}
onChange={this.handleServerNameChange}
onClick={(e: React.MouseEvent<HTMLInputElement>) => {
e.stopPropagation();
}}
isInvalid={Boolean(this.getTeamNameValidationState())}
isInvalid={Boolean(this.getServerNameValidationState())}
/>
<FormControl.Feedback/>
<FormText className='NewTeamModal-noBottomSpace'>
<FormText className='NewServerModal-noBottomSpace'>
<FormattedMessage
id='renderer.components.newTeamModal.serverDisplayName.description'
id='renderer.components.newServerModal.serverDisplayName.description'
defaultMessage='The name of the server displayed on your desktop app tab bar.'
/>
</FormText>
@@ -367,4 +367,4 @@ class NewTeamModal extends React.PureComponent<Props, State> {
}
}
export default injectIntl(NewTeamModal);
export default injectIntl(NewServerModal);

View File

@@ -5,7 +5,7 @@ import classNames from 'classnames';
import React, {useEffect} from 'react';
import {FormattedMessage} from 'react-intl';
import '../css/components/TeamDropdownButton.scss';
import '../css/components/ServerDropdownButton.scss';
type Props = {
isDisabled?: boolean;
@@ -16,7 +16,7 @@ type Props = {
darkMode: boolean;
}
const TeamDropdownButton: React.FC<Props> = (props: Props) => {
const ServerDropdownButton: React.FC<Props> = (props: Props) => {
const {isDisabled, activeServerName, totalMentionCount, hasUnreads, isMenuOpen, darkMode} = props;
const buttonRef: React.RefObject<HTMLButtonElement> = React.createRef();
@@ -30,22 +30,22 @@ const TeamDropdownButton: React.FC<Props> = (props: Props) => {
event.preventDefault();
event.stopPropagation();
if (isMenuOpen) {
window.desktop.closeTeamsDropdown();
window.desktop.closeServersDropdown();
} else {
window.desktop.openTeamsDropdown();
window.desktop.openServersDropdown();
}
};
let badgeDiv: React.ReactNode;
if (totalMentionCount > 0) {
badgeDiv = (
<div className='TeamDropdownButton__badge-count'>
<div className='ServerDropdownButton__badge-count'>
<span>{totalMentionCount > 99 ? '99+' : totalMentionCount}</span>
</div>
);
} else if (hasUnreads) {
badgeDiv = (
<div className='TeamDropdownButton__badge-unreads'/>
<div className='ServerDropdownButton__badge-unreads'/>
);
}
@@ -53,7 +53,7 @@ const TeamDropdownButton: React.FC<Props> = (props: Props) => {
<button
ref={buttonRef}
disabled={isDisabled}
className={classNames('TeamDropdownButton', {
className={classNames('ServerDropdownButton', {
disabled: isDisabled,
isMenuOpen,
darkMode,
@@ -63,14 +63,14 @@ const TeamDropdownButton: React.FC<Props> = (props: Props) => {
event.stopPropagation();
}}
>
<div className='TeamDropdownButton__badge'>
<div className='ServerDropdownButton__badge'>
<i className='icon-server-variant'/>
{badgeDiv}
</div>
{activeServerName && <span>{activeServerName}</span>}
{!activeServerName &&
<FormattedMessage
id='renderer.components.teamDropdownButton.noServersConfigured'
id='renderer.components.serverDropdownButton.noServersConfigured'
defaultMessage='No servers configured'
/>
}
@@ -79,4 +79,4 @@ const TeamDropdownButton: React.FC<Props> = (props: Props) => {
);
};
export default TeamDropdownButton;
export default ServerDropdownButton;

View File

@@ -8,9 +8,9 @@ import {DragDropContext, Draggable, DraggingStyle, Droppable, DropResult, NotDra
import {FormattedMessage, injectIntl, IntlShape} from 'react-intl';
import classNames from 'classnames';
import {MattermostTab} from 'types/config';
import {UniqueView} from 'types/config';
import {TabType, canCloseTab, getTabDisplayName} from 'common/tabs/TabView';
import {ViewType, canCloseView, getViewDisplayName} from 'common/views/View';
type Props = {
activeTabId?: string;
@@ -19,7 +19,7 @@ type Props = {
isDarkMode: boolean;
onSelect: (id: string) => void;
onCloseTab: (id: string) => void;
tabs: MattermostTab[];
tabs: UniqueView[];
sessionsExpired: Record<string, boolean>;
unreadCounts: Record<string, boolean>;
mentionCounts: Record<string, number>;
@@ -80,7 +80,7 @@ class TabBar extends React.PureComponent<Props> {
return (
<Draggable
key={tab.id}
draggableId={`teamTabItem-${tab.id}`}
draggableId={`serverTabItem-${tab.id}`}
index={index}
>
{(provided, snapshot) => {
@@ -98,10 +98,10 @@ class TabBar extends React.PureComponent<Props> {
<NavItem
ref={provided.innerRef}
as='li'
id={`teamTabItem${index}`}
id={`serverTabItem${index}`}
draggable={false}
title={this.props.intl.formatMessage({id: `common.tabs.${tab.name}`, defaultMessage: getTabDisplayName(tab.name as TabType)})}
className={classNames('teamTabItem', {
title={this.props.intl.formatMessage({id: `common.tabs.${tab.name}`, defaultMessage: getViewDisplayName(tab.name as ViewType)})}
className={classNames('serverTabItem', {
active: this.props.activeTabId === tab.id,
dragging: snapshot.isDragging,
})}
@@ -121,12 +121,12 @@ class TabBar extends React.PureComponent<Props> {
<div className='TabBar-tabSeperator'>
<FormattedMessage
id={`common.tabs.${tab.name}`}
defaultMessage={getTabDisplayName(tab.name as TabType)}
defaultMessage={getViewDisplayName(tab.name as ViewType)}
/>
{ badgeDiv }
{canCloseTab(tab.name as TabType) &&
{canCloseView(tab.name as ViewType) &&
<button
className='teamTabItem__close'
className='serverTabItem__close'
onClick={this.onCloseTab(tab.id!)}
>
<i className='icon-close'/>

View File

@@ -5,7 +5,7 @@ body {
min-height: 100%;
}
.NewTeamModal-noBottomSpace {
.NewServerModal-noBottomSpace {
padding-bottom: 0px;
margin-bottom: 0px;
}

View File

@@ -1,4 +1,4 @@
.NewTeamModal-noBottomSpace {
.NewServerModal-noBottomSpace {
padding-bottom: 0px;
margin-bottom: 0px;
}

View File

@@ -1,4 +1,4 @@
.TeamDropdownButton {
.ServerDropdownButton {
background-color: transparent;
border-width: 0 1px;
border-color: rgba(61, 60, 64, 0.08);
@@ -17,7 +17,7 @@
&:not(.disabled):hover {
background-color: #f4f4f4;
.TeamDropdownButton__badge-count, .TeamDropdownButton__badge-unreads {
.ServerDropdownButton__badge-count, .ServerDropdownButton__badge-unreads {
border-color: #f4f4f4;
}
}
@@ -25,7 +25,7 @@
&:not(.disabled):focus, &.isMenuOpen {
background-color: #fff;
.TeamDropdownButton__badge-count, .TeamDropdownButton__badge-unreads {
.ServerDropdownButton__badge-count, .ServerDropdownButton__badge-unreads {
border-color: #fff;
}
}
@@ -49,11 +49,11 @@
}
}
.TeamDropdownButton__badge {
.ServerDropdownButton__badge {
position: relative;
}
.TeamDropdownButton__badge-count {
.ServerDropdownButton__badge-count {
background: #F74343;
border-radius: 8px;
display: flex;
@@ -77,7 +77,7 @@
box-sizing: unset;
}
.TeamDropdownButton__badge-unreads {
.ServerDropdownButton__badge-unreads {
background: #579eff;
border-radius: 100px;
width: 12px;
@@ -88,13 +88,13 @@
border: 2px solid #efefef;
}
.TeamDropdownButton.darkMode {
.ServerDropdownButton.darkMode {
border-color: rgba(221, 221, 221, 0.08);
&:hover {
background-color: #292929;
.TeamDropdownButton__badge-count, .TeamDropdownButton__badge-unreads {
.ServerDropdownButton__badge-count, .ServerDropdownButton__badge-unreads {
border-color: #292929;
}
}
@@ -102,7 +102,7 @@
&:focus, &.isMenuOpen {
background-color: #1f1f1f;
.TeamDropdownButton__badge-count, .TeamDropdownButton__badge-unreads {
.ServerDropdownButton__badge-count, .ServerDropdownButton__badge-unreads {
border-color: #1f1f1f;
}
}
@@ -115,15 +115,15 @@
color: rgba(221, 221, 221, 0.56);
}
.TeamDropdownButton__badge-count {
.ServerDropdownButton__badge-count {
border-color: #2e2e2e;
}
.TeamDropdownButton__badge-unreads {
.ServerDropdownButton__badge-unreads {
border-color: #2e2e2e;
}
.TeamDropdownButton__badge-unreads {
.ServerDropdownButton__badge-unreads {
background: #196CAF;
}
}

View File

@@ -14,7 +14,7 @@
-webkit-app-region: no-drag;
}
.TabBar .teamTabItem span {
.TabBar .serverTabItem span {
flex: 0 1 auto;
overflow: hidden;
text-overflow: ellipsis;
@@ -64,7 +64,7 @@
text-decoration: none;
}
.TabBar>li.teamTabItem>a>div.TabBar-tabSeperator>.teamTabItem__close {
.TabBar>li.serverTabItem>a>div.TabBar-tabSeperator>.serverTabItem__close {
background: none;
border: none;
color: rgba(61,60,64,0.32);
@@ -72,19 +72,19 @@
padding: 0;
}
.TabBar>li.teamTabItem>a>div.TabBar-tabSeperator>.teamTabItem__close:hover {
.TabBar>li.serverTabItem>a>div.TabBar-tabSeperator>.serverTabItem__close:hover {
color: #3d3c40;
}
.TabBar.darkMode>li.teamTabItem>a>div.TabBar-tabSeperator>.teamTabItem__close:hover {
.TabBar.darkMode>li.serverTabItem>a>div.TabBar-tabSeperator>.serverTabItem__close:hover {
color: #ddd;
}
.TabBar>li.teamTabItem>a>div.TabBar-tabSeperator>.teamTabItem__close>i::before {
.TabBar>li.serverTabItem>a>div.TabBar-tabSeperator>.serverTabItem__close>i::before {
margin: 0;
}
.TabBar.darkMode>li.teamTabItem>a>div.TabBar-tabSeperator>.teamTabItem__close {
.TabBar.darkMode>li.serverTabItem>a>div.TabBar-tabSeperator>.serverTabItem__close {
color: rgba(221,221,221,0.32);
}
@@ -99,39 +99,39 @@
align-items: center;
}
.TabBar>li.teamTabItem.active>a, .TabBar>li.teamTabItem.dragging>a {
.TabBar>li.serverTabItem.active>a, .TabBar>li.serverTabItem.dragging>a {
border: none;
background-color: #fff;
color: #3d3c40;
z-index: 9;
}
.TabBar.darkMode>li.teamTabItem.active>a, .TabBar.darkMode>li.teamTabItem.dragging>a {
.TabBar.darkMode>li.serverTabItem.active>a, .TabBar.darkMode>li.serverTabItem.dragging>a {
background-color: #1f1f1f;
color: #ddd;
}
.TabBar>li.teamTabItem:not(.active)+li.teamTabItem:not(.active)>a>div.TabBar-tabSeperator {
.TabBar>li.serverTabItem:not(.active)+li.serverTabItem:not(.active)>a>div.TabBar-tabSeperator {
border-left: 1px solid rgba(61,60,64,0.08);
margin-left: -1px;
}
.TabBar.darkMode>li.teamTabItem:not(.active)+li.teamTabItem:not(.active)>a>div.TabBar-tabSeperator {
.TabBar.darkMode>li.serverTabItem:not(.active)+li.serverTabItem:not(.active)>a>div.TabBar-tabSeperator {
border-left: 1px solid rgba(221,221,221,0.08);
margin-left: -1px;
}
.TabBar>li.teamTabItem:not(.active):not(.disabled):hover+.TabBar-addServerButton>a>div.TabBar-tabSeperator {
.TabBar>li.serverTabItem:not(.active):not(.disabled):hover+.TabBar-addServerButton>a>div.TabBar-tabSeperator {
border-left: none;
margin-left: 0px;
}
.TabBar>li.teamTabItem:not(.active):not(.disabled):hover+li.teamTabItem:not(.active)>a>div.TabBar-tabSeperator {
.TabBar>li.serverTabItem:not(.active):not(.disabled):hover+li.serverTabItem:not(.active)>a>div.TabBar-tabSeperator {
border-left: none;
margin-left: 0px;
}
.TabBar>li.teamTabItem:not(.active):not(.disabled)+li.teamTabItem:not(.active)>a:hover>div.TabBar-tabSeperator {
.TabBar>li.serverTabItem:not(.active):not(.disabled)+li.serverTabItem:not(.active)>a:hover>div.TabBar-tabSeperator {
border-left: none;
margin-left: 0px;
}
@@ -194,6 +194,6 @@
border-radius: 50%;
}
.TabBar .teamTabItem-unread {
.TabBar .serverTabItem-unread {
font-weight: bold;
}

View File

@@ -2,7 +2,7 @@
@import url("HoveringURL.css");
@import url("MainPage.css");
@import url("MattermostView.css");
@import url("NewTeamModal.css");
@import url("NewServerModal.css");
@import url("PermissionRequestDialog.css");
@import url("TabBar.css");
@import url("UpdaterPage.css");

View File

@@ -14,7 +14,7 @@ body {
max-width: 600px;
}
.TeamDropdown {
.ServerDropdown {
display: flex;
flex-direction: column;
align-items: flex-start;
@@ -26,7 +26,7 @@ body {
min-width: 180px;
}
.TeamDropdown__droppable {
.ServerDropdown__droppable {
width: 100%;
overflow-y: scroll;
@@ -40,21 +40,21 @@ body {
}
}
.TeamDropdown__header {
.ServerDropdown__header {
padding: 6px 20px;
display: flex;
align-items: center;
width: -webkit-fill-available;
user-select: none;
.TeamDropdown__servers {
.ServerDropdown__servers {
font-weight: 600;
font-size: 14px;
line-height: 20px;
color: #3D3C40;
}
.TeamDropdown__keyboardShortcut {
.ServerDropdown__keyboardShortcut {
font-weight: 400;
font-size: 12px;
line-height: 16px;
@@ -63,14 +63,14 @@ body {
}
}
.TeamDropdown__divider {
.ServerDropdown__divider {
border-top: 1px solid rgba(61, 60, 64, 0.08);
border-bottom: 0;
width: 100%;
margin: 8px 0;
}
.TeamDropdown__button {
.ServerDropdown__button {
background-color: transparent;
border: none;
padding: 8px 18px 8px 7px;
@@ -83,12 +83,12 @@ body {
&:not(.anyDragging):hover {
background-color: rgba(61, 60, 64, 0.08);
.TeamDropdown__button-edit, .TeamDropdown__button-remove {
.ServerDropdown__button-edit, .ServerDropdown__button-remove {
opacity: 1;
pointer-events: all;
}
.TeamDropdown__draggable-handle > i.icon-drag-vertical {
.ServerDropdown__draggable-handle > i.icon-drag-vertical {
opacity: 1;
}
}
@@ -97,17 +97,17 @@ body {
background-color: rgba(22, 109, 224, 0.08);
outline: none;
.TeamDropdown__button-edit, .TeamDropdown__button-remove {
.ServerDropdown__button-edit, .ServerDropdown__button-remove {
opacity: 1;
pointer-events: all;
}
.TeamDropdown__draggable-handle > i.icon-drag-vertical {
.ServerDropdown__draggable-handle > i.icon-drag-vertical {
opacity: 1;
}
}
&.dragging .TeamDropdown__draggable-handle {
&.dragging .ServerDropdown__draggable-handle {
opacity: 1;
pointer-events: all;
}
@@ -126,7 +126,7 @@ body {
color: #166de0;
}
> .TeamDropdown__draggable-handle > span, &.addServer > span {
> .ServerDropdown__draggable-handle > span, &.addServer > span {
font-size: 14px;
line-height: 20px;
color: #3D3C40;
@@ -147,7 +147,7 @@ body {
}
}
.TeamDropdown__draggable-handle {
.ServerDropdown__draggable-handle {
cursor: pointer !important;
display: flex;
overflow: hidden;
@@ -174,7 +174,7 @@ body {
}
}
.TeamDropdown__badge {
.ServerDropdown__badge {
display: flex;
justify-content: center;
align-items: center;
@@ -182,7 +182,7 @@ body {
min-width: 32px;
}
.TeamDropdown__badge-dot {
.ServerDropdown__badge-dot {
background: #579EFF;
height: 8px;
width: 8px;
@@ -190,7 +190,7 @@ body {
flex: 0 0 8px;
}
.TeamDropdown__badge-count {
.ServerDropdown__badge-count {
background: #F74343;
text-align: center;
border-radius: 8px;
@@ -211,7 +211,7 @@ body {
}
}
.TeamDropdown__indicators {
.ServerDropdown__indicators {
margin-left: auto;
display: flex;
@@ -229,7 +229,7 @@ body {
outline: none;
}
&.TeamDropdown__button-remove:hover, &.TeamDropdown__button-remove:focus {
&.ServerDropdown__button-remove:hover, &.ServerDropdown__button-remove:focus {
background: rgba(247, 67, 67, 0.16);
box-shadow: 0px 0px 0px 4px rgba(247, 67, 67, 0.16);
}
@@ -240,7 +240,7 @@ body {
}
}
.TeamDropdown__button-edit, .TeamDropdown__button-remove {
.ServerDropdown__button-edit, .ServerDropdown__button-remove {
opacity: 0;
pointer-events: none;
@@ -250,10 +250,10 @@ body {
}
}
.TeamDropdown__button-remove {
.ServerDropdown__button-remove {
margin-right: 7px;
+ .TeamDropdown__badge {
+ .ServerDropdown__badge {
margin-left: 3px;
}
@@ -262,22 +262,22 @@ body {
}
}
.TeamDropdown.darkMode {
.ServerDropdown.darkMode {
background: #1f1f1f;
.TeamDropdown__header > span {
.ServerDropdown__header > span {
color: #DDD;
&.TeamDropdown__keyboardShortcut {
&.ServerDropdown__keyboardShortcut {
color: rgba(221, 221, 221, 0.56);
}
}
.TeamDropdown__divider {
.ServerDropdown__divider {
border-color: rgba(221, 221, 221, 0.08);
}
.TeamDropdown__button {
.ServerDropdown__button {
&:not(.anyDragging):hover {
background-color: rgba(221, 221, 221, 0.08);
}
@@ -290,37 +290,37 @@ body {
color: rgba(221, 221, 221, 0.56);
}
> .TeamDropdown__draggable-handle > span, &.addServer > span {
> .ServerDropdown__draggable-handle > span, &.addServer > span {
color: #DDD;
}
.TeamDropdown__button-remove i {
.ServerDropdown__button-remove i {
color: #F74343;
}
.TeamDropdown__button-edit:hover, .TeamDropdown__button-edit:focus {
.ServerDropdown__button-edit:hover, .ServerDropdown__button-edit:focus {
background: rgba(221, 223, 228, 0.08);
box-shadow: 0px 0px 0px 4px rgba(221, 223, 228, 0.08);
}
}
.TeamDropdown__badge-expired i {
.ServerDropdown__badge-expired i {
color: rgba(221, 221, 221, 0.56);
}
.TeamDropdown__button-edit > i {
.ServerDropdown__button-edit > i {
color: rgba(221, 221, 221, 0.56);
}
.TeamDropdown__draggable-handle > i.icon-drag-vertical::before {
.ServerDropdown__draggable-handle > i.icon-drag-vertical::before {
color:rgba(221, 221, 221, 0.32);
}
.TeamDropdown__badge-count i {
.ServerDropdown__badge-count i {
color: #e81023;
}
.TeamDropdown__badge-dot {
.ServerDropdown__badge-dot {
background: #196CAF;
}
}

View File

@@ -1,6 +1,6 @@
@import '~bootstrap-dark/src/bootstrap-dark.css';
.TeamListItem:hover {
.ServerListItem:hover {
background: #242a30;
}

View File

@@ -7,7 +7,7 @@ import {FormattedMessage} from 'react-intl';
import classNames from 'classnames';
import {DragDropContext, Draggable, DraggingStyle, Droppable, DropResult, NotDraggingStyle} from 'react-beautiful-dnd';
import {MattermostTeam} from 'types/config';
import {UniqueServer} from 'types/config';
import {TAB_BAR_HEIGHT, THREE_DOT_MENU_WIDTH_MAC} from 'common/utils/constants';
@@ -16,16 +16,16 @@ import './css/dropdown.scss';
import IntlProvider from './intl_provider';
type State = {
teams?: MattermostTeam[];
teamOrder?: string[];
orderedTeams?: MattermostTeam[];
activeTeam?: string;
servers?: UniqueServer[];
serverOrder?: string[];
orderedServers?: UniqueServer[];
activeServer?: string;
darkMode?: boolean;
enableServerManagement?: boolean;
unreads?: Map<string, boolean>;
mentions?: Map<string, number>;
expired?: Map<string, boolean>;
hasGPOTeams?: boolean;
hasGPOServers?: boolean;
isAnyDragging: boolean;
windowBounds?: Electron.Rectangle;
}
@@ -40,7 +40,7 @@ function getStyle(style?: DraggingStyle | NotDraggingStyle) {
}
return style;
}
class TeamDropdown extends React.PureComponent<Record<string, never>, State> {
class ServerDropdown extends React.PureComponent<Record<string, never>, State> {
buttonRefs: Map<number, HTMLButtonElement>;
addServerRef: React.RefObject<HTMLButtonElement>;
focusedIndex: number | null;
@@ -59,22 +59,22 @@ class TeamDropdown extends React.PureComponent<Record<string, never>, State> {
}
handleUpdate = (
teams: MattermostTeam[],
servers: UniqueServer[],
darkMode: boolean,
windowBounds: Electron.Rectangle,
activeTeam?: string,
activeServer?: string,
enableServerManagement?: boolean,
hasGPOTeams?: boolean,
hasGPOServers?: boolean,
expired?: Map<string, boolean>,
mentions?: Map<string, number>,
unreads?: Map<string, boolean>,
) => {
this.setState({
teams,
activeTeam,
servers,
activeServer,
darkMode,
enableServerManagement,
hasGPOTeams,
hasGPOServers,
unreads,
mentions,
expired,
@@ -82,12 +82,12 @@ class TeamDropdown extends React.PureComponent<Record<string, never>, State> {
});
}
selectServer = (team: MattermostTeam) => {
selectServer = (server: UniqueServer) => {
return () => {
if (!team.id) {
if (!server.id) {
return;
}
window.desktop.serverDropdown.switchServer(team.id);
window.desktop.serverDropdown.switchServer(server.id);
this.closeMenu();
};
}
@@ -95,7 +95,7 @@ class TeamDropdown extends React.PureComponent<Record<string, never>, State> {
closeMenu = () => {
if (!this.state.isAnyDragging) {
(document.activeElement as HTMLElement).blur();
window.desktop.closeTeamsDropdown();
window.desktop.closeServersDropdown();
}
}
@@ -108,8 +108,8 @@ class TeamDropdown extends React.PureComponent<Record<string, never>, State> {
this.closeMenu();
}
isActiveTeam = (team: MattermostTeam) => {
return team.id === this.state.activeTeam;
isActiveServer = (server: UniqueServer) => {
return server.id === this.state.activeServer;
}
onDragStart = () => {
@@ -123,17 +123,17 @@ class TeamDropdown extends React.PureComponent<Record<string, never>, State> {
this.setState({isAnyDragging: false});
return;
}
if (!this.state.teams) {
if (!this.state.servers) {
throw new Error('No config');
}
const teamsCopy = this.state.teams.concat();
const serversCopy = this.state.servers.concat();
const team = teamsCopy.splice(removedIndex, 1);
const newOrder = addedIndex < this.state.teams.length ? addedIndex : this.state.teams.length - 1;
teamsCopy.splice(newOrder, 0, team[0]);
const server = serversCopy.splice(removedIndex, 1);
const newOrder = addedIndex < this.state.servers.length ? addedIndex : this.state.servers.length - 1;
serversCopy.splice(newOrder, 0, server[0]);
this.setState({teams: teamsCopy, isAnyDragging: false});
window.desktop.updateServerOrder(teamsCopy.map((team) => team.id!));
this.setState({servers: serversCopy, isAnyDragging: false});
window.desktop.updateServerOrder(serversCopy.map((server) => server.id!));
}
componentDidMount() {
@@ -151,18 +151,18 @@ class TeamDropdown extends React.PureComponent<Record<string, never>, State> {
window.removeEventListener('keydown', this.handleKeyboardShortcuts);
}
setButtonRef = (teamIndex: number, refMethod?: (element: HTMLButtonElement) => unknown) => {
setButtonRef = (serverIndex: number, refMethod?: (element: HTMLButtonElement) => unknown) => {
return (ref: HTMLButtonElement) => {
this.addButtonRef(teamIndex, ref);
this.addButtonRef(serverIndex, ref);
refMethod?.(ref);
};
}
addButtonRef = (teamIndex: number, ref: HTMLButtonElement | null) => {
addButtonRef = (serverIndex: number, ref: HTMLButtonElement | null) => {
if (ref) {
this.buttonRefs.set(teamIndex, ref);
this.buttonRefs.set(serverIndex, ref);
ref.addEventListener('focusin', () => {
this.focusedIndex = teamIndex;
this.focusedIndex = serverIndex;
});
ref.addEventListener('blur', () => {
this.focusedIndex = null;
@@ -203,30 +203,30 @@ class TeamDropdown extends React.PureComponent<Record<string, never>, State> {
}
}
editServer = (teamId: string) => {
if (this.teamIsPredefined(teamId)) {
editServer = (serverId: string) => {
if (this.serverIsPredefined(serverId)) {
return () => {};
}
return (event: React.MouseEvent<HTMLButtonElement>) => {
event.stopPropagation();
window.desktop.serverDropdown.showEditServerModal(teamId);
window.desktop.serverDropdown.showEditServerModal(serverId);
this.closeMenu();
};
}
removeServer = (teamId: string) => {
if (this.teamIsPredefined(teamId)) {
removeServer = (serverId: string) => {
if (this.serverIsPredefined(serverId)) {
return () => {};
}
return (event: React.MouseEvent<HTMLButtonElement>) => {
event.stopPropagation();
window.desktop.serverDropdown.showRemoveServerModal(teamId);
window.desktop.serverDropdown.showRemoveServerModal(serverId);
this.closeMenu();
};
}
teamIsPredefined = (teamId: string) => {
return this.state.teams?.some((team) => team.id === teamId && team.isPredefined);
serverIsPredefined = (serverId: string) => {
return this.state.servers?.some((server) => server.id === serverId && server.isPredefined);
}
render() {
@@ -234,7 +234,7 @@ class TeamDropdown extends React.PureComponent<Record<string, never>, State> {
<IntlProvider>
<div
onClick={this.preventPropagation}
className={classNames('TeamDropdown', {
className={classNames('ServerDropdown', {
darkMode: this.state.darkMode,
})}
style={{
@@ -242,101 +242,101 @@ class TeamDropdown extends React.PureComponent<Record<string, never>, State> {
maxWidth: this.state.windowBounds ? (this.state.windowBounds.width - THREE_DOT_MENU_WIDTH_MAC) : undefined,
}}
>
<div className='TeamDropdown__header'>
<span className='TeamDropdown__servers'>
<div className='ServerDropdown__header'>
<span className='ServerDropdown__servers'>
<FormattedMessage
id='renderer.dropdown.servers'
defaultMessage='Servers'
/>
</span>
<span className='TeamDropdown__keyboardShortcut'>
<span className='ServerDropdown__keyboardShortcut'>
{window.process.platform === 'darwin' ? '⌃⌘S' : 'Ctrl + Shift + S'}
</span>
</div>
<hr className='TeamDropdown__divider'/>
<hr className='ServerDropdown__divider'/>
<DragDropContext
onDragStart={this.onDragStart}
onDragEnd={this.onDragEnd}
>
<Droppable
isDropDisabled={this.state.hasGPOTeams}
droppableId='TeamDropdown__droppable'
isDropDisabled={this.state.hasGPOServers}
droppableId='ServerDropdown__droppable'
>
{(provided) => (
<div
className='TeamDropdown__droppable'
className='ServerDropdown__droppable'
ref={provided.innerRef}
{...provided.droppableProps}
>
{this.state.teams?.map((team, orderedIndex) => {
const index = this.state.teams?.indexOf(team);
const sessionExpired = this.state.expired?.get(team.id!);
const hasUnreads = this.state.unreads?.get(team.id!);
const mentionCount = this.state.mentions?.get(team.id!);
{this.state.servers?.map((server, orderedIndex) => {
const index = this.state.servers?.indexOf(server);
const sessionExpired = this.state.expired?.get(server.id!);
const hasUnreads = this.state.unreads?.get(server.id!);
const mentionCount = this.state.mentions?.get(server.id!);
let badgeDiv: React.ReactNode;
if (sessionExpired) {
badgeDiv = (
<div className='TeamDropdown__badge-expired'>
<div className='ServerDropdown__badge-expired'>
<i className='icon-alert-circle-outline'/>
</div>
);
} else if (mentionCount && mentionCount > 0) {
badgeDiv = (
<div className='TeamDropdown__badge-count'>
<div className='ServerDropdown__badge-count'>
<span>{mentionCount > 99 ? '99+' : mentionCount}</span>
</div>
);
} else if (hasUnreads) {
badgeDiv = (
<div className='TeamDropdown__badge-dot'/>
<div className='ServerDropdown__badge-dot'/>
);
}
return (
<Draggable
key={index}
draggableId={`TeamDropdown__draggable-${index}`}
draggableId={`ServerDropdown__draggable-${index}`}
index={orderedIndex}
disableInteractiveElementBlocking={true}
>
{(provided, snapshot) => (
<button
className={classNames('TeamDropdown__button', {
className={classNames('ServerDropdown__button', {
dragging: snapshot.isDragging,
anyDragging: this.state.isAnyDragging,
active: this.isActiveTeam(team),
active: this.isActiveServer(server),
})}
ref={this.setButtonRef(orderedIndex, provided.innerRef)}
{...provided.draggableProps}
onClick={this.selectServer(team)}
onClick={this.selectServer(server)}
style={getStyle(provided.draggableProps.style)}
>
<div
className={classNames('TeamDropdown__draggable-handle', {
className={classNames('ServerDropdown__draggable-handle', {
dragging: snapshot.isDragging,
})}
{...provided.dragHandleProps}
onClick={this.handleClickOnDragHandle}
>
<i className='icon-drag-vertical'/>
{this.isActiveTeam(team) ? <i className='icon-check'/> : <i className='icon-server-variant'/>}
<span>{team.name}</span>
{this.isActiveServer(server) ? <i className='icon-check'/> : <i className='icon-server-variant'/>}
<span>{server.name}</span>
</div>
{!team.isPredefined && <div className='TeamDropdown__indicators'>
{!server.isPredefined && <div className='ServerDropdown__indicators'>
<button
className='TeamDropdown__button-edit'
onClick={this.editServer(team.id!)}
className='ServerDropdown__button-edit'
onClick={this.editServer(server.id!)}
>
<i className='icon-pencil-outline'/>
</button>
<button
className='TeamDropdown__button-remove'
onClick={this.removeServer(team.id!)}
className='ServerDropdown__button-remove'
onClick={this.removeServer(server.id!)}
>
<i className='icon-trash-can-outline'/>
</button>
{badgeDiv && <div className='TeamDropdown__badge'>
{badgeDiv && <div className='ServerDropdown__badge'>
{badgeDiv}
</div>}
</div>}
@@ -350,13 +350,13 @@ class TeamDropdown extends React.PureComponent<Record<string, never>, State> {
)}
</Droppable>
</DragDropContext>
<hr className='TeamDropdown__divider'/>
<hr className='ServerDropdown__divider'/>
{this.state.enableServerManagement &&
<button
ref={(ref) => {
this.addButtonRef(this.state.teams?.length || 0, ref);
this.addButtonRef(this.state.servers?.length || 0, ref);
}}
className='TeamDropdown__button addServer'
className='ServerDropdown__button addServer'
onClick={this.addServer}
>
<i className='icon-plus'/>
@@ -373,6 +373,6 @@ class TeamDropdown extends React.PureComponent<Record<string, never>, State> {
}
ReactDOM.render(
<TeamDropdown/>,
<ServerDropdown/>,
document.getElementById('app'),
);

View File

@@ -7,49 +7,49 @@ import 'renderer/css/modals.css';
import React, {useEffect, useState} from 'react';
import ReactDOM from 'react-dom';
import {MattermostTeam} from 'types/config';
import {UniqueServer} from 'types/config';
import IntlProvider from 'renderer/intl_provider';
import NewTeamModal from '../../components/NewTeamModal'; //'./addServer.jsx';
import NewServerModal from '../../components/NewServerModal';
import setupDarkMode from '../darkMode';
setupDarkMode();
type ModalInfo = {
team: MattermostTeam;
currentTeams: MattermostTeam[];
server: UniqueServer;
currentServers: UniqueServer[];
};
const onClose = () => {
window.desktop.modals.cancelModal();
};
const onSave = (data: MattermostTeam) => {
const onSave = (data: UniqueServer) => {
window.desktop.modals.finishModal(data);
};
const EditServerModalWrapper: React.FC = () => {
const [server, setServer] = useState<MattermostTeam>();
const [currentTeams, setCurrentTeams] = useState<MattermostTeam[]>();
const [server, setServer] = useState<UniqueServer>();
const [currentServers, setCurrentServers] = useState<UniqueServer[]>();
useEffect(() => {
window.desktop.modals.getModalInfo<ModalInfo>().then(({team, currentTeams}) => {
setServer(team);
setCurrentTeams(currentTeams);
window.desktop.modals.getModalInfo<ModalInfo>().then(({server, currentServers}) => {
setServer(server);
setCurrentServers(currentServers);
});
}, []);
return (
<IntlProvider>
<NewTeamModal
<NewServerModal
onClose={onClose}
onSave={onSave}
editMode={true}
show={Boolean(server)}
team={server}
currentTeams={currentTeams}
server={server}
currentServers={currentServers}
/>
</IntlProvider>
);

View File

@@ -35,7 +35,7 @@ class LoadingScreenRoot extends React.PureComponent<Props, State> {
window.desktop.loadingScreen.onToggleLoadingScreenVisibility(this.onToggleLoadingScreenVisibility);
window.addEventListener('click', () => {
window.desktop.closeTeamsDropdown();
window.desktop.closeServersDropdown();
window.desktop.closeDownloadsDropdown();
});
}

View File

@@ -7,11 +7,11 @@ import 'renderer/css/modals.css';
import React, {useEffect, useState} from 'react';
import ReactDOM from 'react-dom';
import {MattermostTeam} from 'types/config';
import {UniqueServer} from 'types/config';
import IntlProvider from 'renderer/intl_provider';
import NewTeamModal from '../../components/NewTeamModal'; //'./addServer.jsx';
import NewServerModal from '../../components/NewServerModal';
import setupDarkMode from '../darkMode';
@@ -21,31 +21,31 @@ const onClose = () => {
window.desktop.modals.cancelModal();
};
const onSave = (data: MattermostTeam) => {
const onSave = (data: UniqueServer) => {
window.desktop.modals.finishModal(data);
};
const NewServerModalWrapper: React.FC = () => {
const [unremoveable, setUnremovable] = useState<boolean>();
const [currentTeams, setCurrentTeams] = useState<MattermostTeam[]>();
const [currentServers, setCurrentServers] = useState<UniqueServer[]>();
useEffect(() => {
window.desktop.modals.isModalUncloseable().then((uncloseable) => {
setUnremovable(uncloseable);
});
window.desktop.modals.getModalInfo<MattermostTeam[]>().then((teams) => {
setCurrentTeams(teams);
window.desktop.modals.getModalInfo<UniqueServer[]>().then((servers) => {
setCurrentServers(servers);
});
}, []);
return (
<IntlProvider>
<NewTeamModal
<NewServerModal
onClose={unremoveable ? undefined : onClose}
onSave={onSave}
editMode={false}
show={true}
currentTeams={currentTeams}
currentServers={currentServers}
/>
</IntlProvider>
);

View File

@@ -4,7 +4,7 @@
import React, {useEffect, useState} from 'react';
import ReactDOM from 'react-dom';
import {MattermostTeam} from 'types/config';
import {UniqueServer} from 'types/config';
import IntlProvider from 'renderer/intl_provider';
@@ -15,7 +15,7 @@ import 'bootstrap/dist/css/bootstrap.min.css';
const MOBILE_SCREEN_WIDTH = 1200;
const onConnect = (data: MattermostTeam) => {
const onConnect = (data: UniqueServer) => {
window.desktop.modals.finishModal(data);
};
@@ -23,7 +23,7 @@ const WelcomeScreenModalWrapper = () => {
const [darkMode, setDarkMode] = useState(false);
const [getStarted, setGetStarted] = useState(false);
const [mobileView, setMobileView] = useState(false);
const [currentTeams, setCurrentTeams] = useState<MattermostTeam[]>([]);
const [currentServers, setCurrentServers] = useState<UniqueServer[]>([]);
const handleWindowResize = () => {
setMobileView(window.innerWidth < MOBILE_SCREEN_WIDTH);
@@ -38,8 +38,8 @@ const WelcomeScreenModalWrapper = () => {
setDarkMode(result);
});
window.desktop.modals.getModalInfo<MattermostTeam[]>().then((result) => {
setCurrentTeams(result);
window.desktop.modals.getModalInfo<UniqueServer[]>().then((result) => {
setCurrentServers(result);
});
handleWindowResize();
@@ -60,7 +60,7 @@ const WelcomeScreenModalWrapper = () => {
<ConfigureServer
mobileView={mobileView}
darkMode={darkMode}
currentTeams={currentTeams}
currentServers={currentServers}
onConnect={onConnect}
/>
) : (