Files
mattermostest/src/browser/index.jsx

156 lines
4.6 KiB
JavaScript

// Copyright (c) 2015-2016 Yuya Ochiai
// Copyright (c) 2016-present Mattermost, Inc. All Rights Reserved.
// See LICENSE.txt for license information.
import './css/index.css';
window.eval = global.eval = () => { // eslint-disable-line no-multi-assign, no-eval
throw new Error('Sorry, Mattermost does not support window.eval() for security reasons.');
};
import url from 'url';
import React from 'react';
import ReactDOM from 'react-dom';
import {remote, ipcRenderer} from 'electron';
import Config from '../common/config';
import EnhancedNotification from './js/notification';
import MainPage from './components/MainPage.jsx';
import {createDataURL as createBadgeDataURL} from './js/badge';
Notification = EnhancedNotification; // eslint-disable-line no-global-assign, no-native-reassign
const config = new Config(remote.app.getPath('userData') + '/config.json', remote.getCurrentWindow().registryConfigData);
const teams = config.teams;
remote.getCurrentWindow().removeAllListeners('focus');
if (teams.length === 0) {
remote.getCurrentWindow().loadFile('browser/settings.html');
}
const parsedURL = url.parse(window.location.href, true);
const initialIndex = parsedURL.query.index ? parseInt(parsedURL.query.index, 10) : 0;
let deeplinkingUrl = null;
if (!parsedURL.query.index || parsedURL.query.index === null) {
deeplinkingUrl = remote.getCurrentWindow().deeplinkingUrl;
}
config.on('update', (configData) => {
teams.splice(0, teams.length, ...configData.teams);
});
config.on('synchronize', () => {
ipcRenderer.send('reload-config');
});
ipcRenderer.on('reload-config', () => {
config.reload();
});
function showBadgeWindows(sessionExpired, unreadCount, mentionCount) {
function sendBadge(dataURL, description) {
// window.setOverlayIcon() does't work with NativeImage across remote boundaries.
// https://github.com/atom/electron/issues/4011
ipcRenderer.send('update-unread', {
overlayDataURL: dataURL,
description,
sessionExpired,
unreadCount,
mentionCount,
});
}
if (sessionExpired) {
const dataURL = createBadgeDataURL('•');
sendBadge(dataURL, 'Session Expired: Please sign in to continue receiving notifications.');
} else if (mentionCount > 0) {
const dataURL = createBadgeDataURL((mentionCount > 99) ? '99+' : mentionCount.toString(), mentionCount > 99);
sendBadge(dataURL, 'You have unread mentions (' + mentionCount + ')');
} else if (unreadCount > 0 && config.showUnreadBadge) {
const dataURL = createBadgeDataURL('•');
sendBadge(dataURL, 'You have unread channels (' + unreadCount + ')');
} else {
sendBadge(null, 'You have no unread messages');
}
}
function showBadgeOSX(sessionExpired, unreadCount, mentionCount) {
if (sessionExpired) {
remote.app.dock.setBadge('•');
} else if (mentionCount > 0) {
remote.app.dock.setBadge(mentionCount.toString());
} else if (unreadCount > 0 && config.showUnreadBadge) {
remote.app.dock.setBadge('•');
} else {
remote.app.dock.setBadge('');
}
ipcRenderer.send('update-unread', {
sessionExpired,
unreadCount,
mentionCount,
});
}
function showBadgeLinux(sessionExpired, unreadCount, mentionCount) {
if (remote.app.isUnityRunning()) {
if (sessionExpired) {
remote.app.setBadgeCount(mentionCount + 1);
} else {
remote.app.setBadgeCount(mentionCount);
}
}
ipcRenderer.send('update-unread', {
sessionExpired,
unreadCount,
mentionCount,
});
}
function showBadge(sessionExpired, unreadCount, mentionCount) {
switch (process.platform) {
case 'win32':
showBadgeWindows(sessionExpired, unreadCount, mentionCount);
break;
case 'darwin':
showBadgeOSX(sessionExpired, unreadCount, mentionCount);
break;
case 'linux':
showBadgeLinux(sessionExpired, unreadCount, mentionCount);
break;
}
}
function teamConfigChange(updatedTeams) {
config.set('teams', updatedTeams);
}
function handleSelectSpellCheckerLocale(locale) {
config.set('spellCheckerLocale', locale);
}
ReactDOM.render(
<MainPage
teams={teams}
initialIndex={initialIndex}
onBadgeChange={showBadge}
onTeamConfigChange={teamConfigChange}
useSpellChecker={config.useSpellChecker}
onSelectSpellCheckerLocale={handleSelectSpellCheckerLocale}
deeplinkingUrl={deeplinkingUrl}
showAddServerButton={config.enableServerManagement}
/>,
document.getElementById('content')
);
// Deny drag&drop navigation in mainWindow.
// Drag&drop is allowed in webview of index.html.
document.addEventListener('dragover', (event) => event.preventDefault());
document.addEventListener('drop', (event) => event.preventDefault());