From 71bbfb4fdd06c26a33c25650313a017123d82b59 Mon Sep 17 00:00:00 2001 From: or-else Date: Fri, 26 Oct 2018 16:36:30 +0300 Subject: [PATCH] more fixes --- package.json | 2 +- src/i18n/en.json | 10 +++- src/i18n/ru.json | 8 ++++ src/index.js | 12 +++-- src/version.js | 2 +- src/views/create-account-view.jsx | 13 +++--- src/views/messages-view.jsx | 78 ++++++++++++++++++++++--------- src/views/password-reset-view.jsx | 4 +- src/views/settings-view.jsx | 20 ++++++-- src/widgets/host-selector.jsx | 6 ++- umd/index.dev.js | 45 +++++++++++++----- umd/index.prod.js | 12 ++--- 12 files changed, 152 insertions(+), 60 deletions(-) diff --git a/package.json b/package.json index b090582f..6b64e06f 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "tinode-webapp", "description": "Tinode messenger for the web", - "version": "0.15.8-rc1", + "version": "0.15.9-rc1", "devDependencies": { "@babel/core": "^7.1.2", "@babel/preset-env": "^7.1.0", diff --git a/src/i18n/en.json b/src/i18n/en.json index 37b3b5fd..665b1194 100644 --- a/src/i18n/en.json +++ b/src/i18n/en.json @@ -10,6 +10,14 @@ "sign_in_button": "Sign in", "label_client": "Client:", "label_server": "Server:", + "online_now": "online now", + "last_seen_timestamp": "Last seen", + "title_not_found": "Not found", + "unnamed_topic": "Unnamed", + "messages_not_readable": "no access to messages", + "label_server_to_use": "Server to use:", + "label_wire_transport": "Wire transport:", + "button_update": "Update", "sidepanel_title_login": "Sign In", "sidepanel_title_register": "Create Account", "sidepanel_title_settings": "Settings", @@ -17,4 +25,4 @@ "sidepanel_title_newtpk": "Start New Chat", "sidepanel_title_cred": "Confirm Credentials", "sidepanel_title_reset": "Reset Password" -} +} \ No newline at end of file diff --git a/src/i18n/ru.json b/src/i18n/ru.json index a0cb161c..d87c3020 100644 --- a/src/i18n/ru.json +++ b/src/i18n/ru.json @@ -10,6 +10,14 @@ "sign_in_button": "Войти", "label_client": "Клиент:", "label_server": "Сервер:", + "online_now": "онлайн", + "last_seen_timestamp": "Был активен", + "title_not_found": "Не найден", + "unnamed_topic": "Без названия", + "messages_not_readable": "нет доступа к сообщениям", + "label_server_to_use": "Использовать сервер:", + "label_wire_transport": "Соединение:", + "button_update": "Применить", "sidepanel_title_login": "Авторизация", "sidepanel_title_register": "Зарегистрироваться", "sidepanel_title_settings": "Настройки", diff --git a/src/index.js b/src/index.js index 8a49be28..04154e7c 100644 --- a/src/index.js +++ b/src/index.js @@ -11,10 +11,16 @@ import ru from './i18n/ru.json'; import TinodeWeb from './views/tinode-web.jsx'; +import HashNavigation from './lib/navigation.js'; + +const {params} = HashNavigation.parseUrlHash(window.location.hash); +const language = (params && params.hl) || + (navigator.languages && navigator.languages[0]) || + navigator.language || + navigator.userLanguage; + ReactDOM.render( - + , document.getElementById('mountPoint') diff --git a/src/version.js b/src/version.js index 79390195..4d97f3da 100644 --- a/src/version.js +++ b/src/version.js @@ -1,3 +1,3 @@ // This is a generated file. Don't edit. -export const PACKAGE_VERSION = "0.15.8-rc1"; +export const PACKAGE_VERSION = "0.15.9-rc1"; diff --git a/src/views/create-account-view.jsx b/src/views/create-account-view.jsx index 7ad27a2f..2748463f 100644 --- a/src/views/create-account-view.jsx +++ b/src/views/create-account-view.jsx @@ -95,27 +95,28 @@ export default class CreateAccountView extends React.PureComponent {
{ - }
{ - }
- - {(stay_logged_in) => } - + { + (stay_logged_in) => + }
diff --git a/src/views/messages-view.jsx b/src/views/messages-view.jsx index a1b46a35..a2ec908e 100644 --- a/src/views/messages-view.jsx +++ b/src/views/messages-view.jsx @@ -1,4 +1,5 @@ import React from 'react'; +import { FormattedMessage, defineMessages, injectIntl } from 'react-intl'; import ChatMessage from '../widgets/chat-message.jsx'; import ErrorPanel from '../widgets/error-panel.jsx'; @@ -9,9 +10,27 @@ import LoadSpinner from '../widgets/load-spinner.jsx'; import LogoView from './logo-view.jsx'; import SendMessage from '../widgets/send-message.jsx'; -const NOT_FOUND_TOPIC_TITLE = "Not found"; +import { shortDateFormat } from '../lib/strformat.js'; -export default class MessagesView extends React.Component { +const messages = defineMessages({ + online_now: { + id: 'online_now', + defaultMessage: 'online now', + description: 'Indicator that the user or topic is currently online', + }, + last_seen: { + id: 'last_seen_timestamp', + defaultMessage: 'Last seen', + description: 'Label for the timestamp of when the user or topic was last online' + }, + 'not_found': { + id: 'title_not_found', + defaultMessage: 'Not found', + description: 'Title shown when topic is not found' + } +}); + +class MessagesView extends React.Component { constructor(props) { super(props); @@ -162,8 +181,9 @@ export default class MessagesView extends React.Component { }) .catch((err) => { this.props.onError(err.message, 'err'); + const {formatMessage} = this.props.intl; this.setState({ - title: NOT_FOUND_TOPIC_TITLE, + title: formatMessage(messages.not_found), avatar: null, readOnly: true, writeOnly: true, @@ -349,21 +369,24 @@ export default class MessagesView extends React.Component { } render() { - var component = null; + const {formatMessage} = this.props.intl; + + let component; + if (this.state.topic) { - var messageNodes = []; - var topic = this.props.tinode.getTopic(this.state.topic); - var groupTopic = topic.getType() == 'grp'; - var previousFrom = null; - for (var i=0; i @@ -437,7 +460,11 @@ export default class MessagesView extends React.Component {
-
{this.state.title || Unknown}
+
{ + this.state.title || + + }
{lastSeen}
{groupTopic ? @@ -466,7 +493,10 @@ export default class MessagesView extends React.Component { {this.state.writeOnly ?
-
no access to messages
+
+ +
: null @@ -493,3 +523,5 @@ export default class MessagesView extends React.Component { return component; } }; + +export default injectIntl(MessagesView); diff --git a/src/views/password-reset-view.jsx b/src/views/password-reset-view.jsx index 38ff9946..09afa3b0 100644 --- a/src/views/password-reset-view.jsx +++ b/src/views/password-reset-view.jsx @@ -3,6 +3,8 @@ import React from 'react'; import VisiblePassword from '../widgets/visible-password.jsx'; +import HashNavigation from '../lib/navigation.js'; + export default class PasswordResetView extends React.PureComponent { constructor(props) { super(props); @@ -18,7 +20,7 @@ export default class PasswordResetView extends React.PureComponent { } componentDidMount() { - let parsed = parseUrlHash(window.location.hash); + let parsed = HashNavigation.parseUrlHash(window.location.hash); this.setState({token: parsed.params.token, scheme: parsed.params.scheme}); } diff --git a/src/views/settings-view.jsx b/src/views/settings-view.jsx index ce1eee89..8d1802ed 100644 --- a/src/views/settings-view.jsx +++ b/src/views/settings-view.jsx @@ -1,5 +1,6 @@ // Tinode config panel. import React from 'react'; +import { FormattedMessage } from 'react-intl'; import HostSelector from '../widgets/host-selector.jsx'; @@ -35,10 +36,10 @@ export default class SettingsView extends React.PureComponent { } render() { - var names = {def: "default", ws: "websocket", lp: "long polling"}; + const names = {def: "default", ws: "websocket", lp: "long polling"}; var transportOptions = []; var instance = this; - ['def', 'ws', 'lp'].map(function(item){ + ['def', 'ws', 'lp'].map(function(item) { var id = 'transport-' + item; var name = names[item]; transportOptions.push( @@ -54,12 +55,18 @@ export default class SettingsView extends React.PureComponent { return (
- +
- +
    @@ -67,7 +74,10 @@ export default class SettingsView extends React.PureComponent {
- +
); diff --git a/src/widgets/host-selector.jsx b/src/widgets/host-selector.jsx index 29a4d7e0..bafd9862 100644 --- a/src/widgets/host-selector.jsx +++ b/src/widgets/host-selector.jsx @@ -1,5 +1,7 @@ import React from 'react'; +import { KNOWN_HOSTS } from '../config.js'; + /* Combobox for selecting host name */ export default class HostSelector extends React.PureComponent { @@ -28,8 +30,8 @@ export default class HostSelector extends React.PureComponent { render() { var hostOptions = []; - for (var key in KNOWN_HOSTS) { - var item = KNOWN_HOSTS[key]; + for (let key in KNOWN_HOSTS) { + let item = KNOWN_HOSTS[key]; hostOptions.push(