diff --git a/scripts/flatten-messages.js b/scripts/flatten-messages.js index 703e1909..df73efd9 100644 --- a/scripts/flatten-messages.js +++ b/scripts/flatten-messages.js @@ -8,12 +8,18 @@ var path = require('path'); var globSync = require('glob').sync; var mkdirpSync = require('mkdirp').sync; +const DEFAULT_TRANSLATION = 'en.json'; const MESSAGES_PATTERN = './src/i18n/src/**/*.json'; const LANG_DIR = './src/i18n/'; const LANG_PATTERN = './src/i18n/*.json'; const FINAL_FILE = './src/messages.json'; -// Read message files generated by react-intl-babel-plugin. +const MISSING_MARKER = ':!![MISSING]!!:'; +const OBSOLETE_MARKER = ':!![OBSOLETE]!!:'; + +// The react-intl-babel-plugin saves extracted messages +// into files, one fine per component. Rewrite them into +// a single file en.json. let messages = globSync(MESSAGES_PATTERN) .map((filename) => fs.readFileSync(filename, 'utf8')) .map((file) => JSON.parse(file)) @@ -28,17 +34,59 @@ let messages = globSync(MESSAGES_PATTERN) return collection; }, {}); -// Write English translation. -let filename = path.join(LANG_DIR, 'en.json'); +let filename = path.join(LANG_DIR, DEFAULT_TRANSLATION); mkdirpSync(path.dirname(filename)); fs.writeFileSync(filename, JSON.stringify(messages, null, 2)); +// Find messages present in en.json but missing in translations and vice versa. +// Mark missing or obsolete messages as such in translation files. +globSync(LANG_PATTERN) + .map((filename) => { + const parts = filename.split('/'); + if (parts[parts.length-1] != DEFAULT_TRANSLATION) { + const translated = JSON.parse(fs.readFileSync(filename, 'utf8')); + // Find missing messages. + Object.entries(messages).forEach((ent) => { + if (!translated.hasOwnProperty(ent[0])) { + translated[ent[0]] = MISSING_MARKER + ent[1]; + } + }); + // Find no longer needed messages. + Object.entries(translated).forEach((ent) => { + if (!messages.hasOwnProperty(ent[0])) { + let val = translated[ent[0]]; + if (val.indexOf(MISSING_MARKER) == 0) { + val = val.substring(0, MISSING_MARKER.length); + } + if (val.indexOf(OBSOLETE_MARKER) != 0) { + val = OBSOLETE_MARKER + val; + } + translated[ent[0]] = val; + } + }); + fs.writeFileSync(filename, JSON.stringify(translated, null, 2)); + } + }); + +// Combine all translations into a single json {"lang_1": {...}, "lang_2: {...}"}; +// Remove messages marked as missing or obsolete. + // Read all translations. messages = globSync(LANG_PATTERN) .map((filename) => { const parts = filename.split('/'); const locale = parts[parts.length - 1].split('.json')[0]; - return { [locale]: JSON.parse(fs.readFileSync(filename, 'utf8')) }; + const translated = JSON.parse(fs.readFileSync(filename, 'utf8')); + + // Strip messages prefixed with MISSING or OBSOLETE markers. + for (let id in translated) { + if (translated[id].indexOf(OBSOLETE_MARKER) == 0 || + translated[id].indexOf(MISSING_MARKER) == 0) { + delete translated[id]; + } + } + + return { [locale]: translated }; }) .reduce((collection, descriptors) => { return { ...collection, ...descriptors }; diff --git a/src/i18n/en.json b/src/i18n/en.json index 9ed55445..0e2905f3 100644 --- a/src/i18n/en.json +++ b/src/i18n/en.json @@ -10,7 +10,7 @@ "label_default_access_mode": "Default access mode:", "label_message_sound": "Message sound:", "label_push_notifications": "Notification alerts:", - "label_push_notifications_disabled": "Notification alerts (requires HTTPS)", + "label_push_notifications_disabled": "Notification alerts (requires HTTPS):", "title_tag_manager": "Tags (user discovery)", "button_logout": "Logout", "login_prompt": "Login", @@ -28,6 +28,7 @@ "tabtitle_find_user": "find", "tabtitle_new_group": "new group", "tabtitle_group_by_id": "by id", + "search_for_contacts": "Use search to find contacts", "label_server_to_use": "Server to use:", "label_wire_transport": "Wire transport:", "button_update": "Update", @@ -38,11 +39,24 @@ "sidepanel_title_newtpk": "Start New Chat", "sidepanel_title_cred": "Confirm Credentials", "sidepanel_title_reset": "Reset Password", + "phone": "phone", + "email": "email", + "enter_confirmation_code_prompt": "Enter confirmation code sent to you by {method}:", + "numeric_confirmation_code_prompt": "Numbers only", + "button_confirm": "Confirm", + "invalid_content": "invalid content", + "button_ok": "OK", + "button_cancel": "Cancel", + "label_file_name": "File name:", + "label_content_type": "Content type:", + "label_size": "Size:", "message_sending": "sending...", "message_sending_failed": "failed", "search_placeholder": "List like email:alice@example.com, tel:17025550003...", "messaging_disabled_prompt": "Messaging disabled", "new_message_prompt": "New message", + "file_attachment_too_large": "The file size {size} exceeds the {limit} limit.", + "cannot_initiate_file_upload": "Cannot initiate file upload.", "tags_not_found": "No tags defined. Add some.", "tags_editor_no_tags": "Add some tags", "title_manage_tags": "Manage tags" diff --git a/src/i18n/ru.json b/src/i18n/ru.json index f4f18c27..051ed2b1 100644 --- a/src/i18n/ru.json +++ b/src/i18n/ru.json @@ -40,5 +40,24 @@ "sidepanel_title_reset": "Сменить пароль", "tags_not_found": "Тагов нет. Добавьте", "tags_editor_no_tags": "Добавьте таги", - "title_manage_tags": "Редактор тагов" -} + "title_manage_tags": "Редактор тагов", + "message_sending": "шлём...", + "message_sending_failed": "ошибка", + "search_placeholder": "Список, напр. email:alice@example.com, tel:17025550003...", + "messaging_disabled_prompt": "Отправка недоступна", + "new_message_prompt": "Новое сообщение", + "file_attachment_too_large": "Размер файла {size} превышает {limit} лимит.", + "cannot_initiate_file_upload": "Ошибка загрузки файла.", + "search_for_contacts": ":!![MISSING]!!:Use search to find contacts", + "phone": "телефон", + "email": "емейл", + "enter_confirmation_code_prompt": "Введите код подтверждения {method}:", + "numeric_confirmation_code_prompt": "Только цифры", + "button_confirm": "Подтвердить", + "button_ok": "OK", + "button_cancel": "Отменить", + "invalid_content": "сообщение не читается", + "label_file_name": "Имя файла:", + "label_content_type": "Тип:", + "label_size": "Размер:" +} \ No newline at end of file diff --git a/src/lib/blob-helpers.js b/src/lib/blob-helpers.js index 97c99df4..545f8a6b 100644 --- a/src/lib/blob-helpers.js +++ b/src/lib/blob-helpers.js @@ -1,4 +1,5 @@ // File and image helper functions. +import { MAX_INBAND_ATTACHMENT_SIZE, MAX_IMAGE_DIM } from '../config.js'; // Supported image MIME types and corresponding file extensions. export const SUPPORTED_IMAGE_FORMATS = ['image/jpeg', 'image/gif', 'image/png', 'image/svg', 'image/svg+xml']; @@ -204,7 +205,7 @@ export function base64ReEncode(str) { try { str = btoa(atob(str)); } catch(err) { - console.log("Failed to base64 re-decode string"); + console.log("Failed to base64 re-encode string"); str = null; } } diff --git a/src/messages.json b/src/messages.json index 2a59b85d..8a6b5a9b 100644 --- a/src/messages.json +++ b/src/messages.json @@ -11,7 +11,7 @@ "label_default_access_mode": "Default access mode:", "label_message_sound": "Message sound:", "label_push_notifications": "Notification alerts:", - "label_push_notifications_disabled": "Notification alerts (requires HTTPS)", + "label_push_notifications_disabled": "Notification alerts (requires HTTPS):", "title_tag_manager": "Tags (user discovery)", "button_logout": "Logout", "login_prompt": "Login", @@ -29,6 +29,7 @@ "tabtitle_find_user": "find", "tabtitle_new_group": "new group", "tabtitle_group_by_id": "by id", + "search_for_contacts": "Use search to find contacts", "label_server_to_use": "Server to use:", "label_wire_transport": "Wire transport:", "button_update": "Update", @@ -39,11 +40,24 @@ "sidepanel_title_newtpk": "Start New Chat", "sidepanel_title_cred": "Confirm Credentials", "sidepanel_title_reset": "Reset Password", + "phone": "phone", + "email": "email", + "enter_confirmation_code_prompt": "Enter confirmation code sent to you by {method}:", + "numeric_confirmation_code_prompt": "Numbers only", + "button_confirm": "Confirm", + "invalid_content": "invalid content", + "button_ok": "OK", + "button_cancel": "Cancel", + "label_file_name": "File name:", + "label_content_type": "Content type:", + "label_size": "Size:", "message_sending": "sending...", "message_sending_failed": "failed", "search_placeholder": "List like email:alice@example.com, tel:17025550003...", "messaging_disabled_prompt": "Messaging disabled", "new_message_prompt": "New message", + "file_attachment_too_large": "The file size {size} exceeds the {limit} limit.", + "cannot_initiate_file_upload": "Cannot initiate file upload.", "tags_not_found": "No tags defined. Add some.", "tags_editor_no_tags": "Add some tags", "title_manage_tags": "Manage tags" @@ -90,6 +104,24 @@ "sidepanel_title_reset": "Сменить пароль", "tags_not_found": "Тагов нет. Добавьте", "tags_editor_no_tags": "Добавьте таги", - "title_manage_tags": "Редактор тагов" + "title_manage_tags": "Редактор тагов", + "message_sending": "шлём...", + "message_sending_failed": "ошибка", + "search_placeholder": "Список, напр. email:alice@example.com, tel:17025550003...", + "messaging_disabled_prompt": "Отправка недоступна", + "new_message_prompt": "Новое сообщение", + "file_attachment_too_large": "Размер файла {size} превышает {limit} лимит.", + "cannot_initiate_file_upload": "Ошибка загрузки файла.", + "phone": "телефон", + "email": "емейл", + "enter_confirmation_code_prompt": "Введите код подтверждения {method}:", + "numeric_confirmation_code_prompt": "Только цифры", + "button_confirm": "Подтвердить", + "button_ok": "OK", + "button_cancel": "Отменить", + "invalid_content": "сообщение не читается", + "label_file_name": "Имя файла:", + "label_content_type": "Тип:", + "label_size": "Размер:" } } \ No newline at end of file diff --git a/src/views/edit-account-view.jsx b/src/views/edit-account-view.jsx index 487c1f30..94156e2d 100644 --- a/src/views/edit-account-view.jsx +++ b/src/views/edit-account-view.jsx @@ -196,8 +196,8 @@ export default class EditAccountView extends React.Component { description="Label for push notifications switch" /> : + defaultMessage="Notification alerts (requires HTTPS):" + description="Label for push notifications switch (disabled)" /> } - + { + (search_for_contacts) => + } } ); diff --git a/src/views/password-reset-view.jsx b/src/views/password-reset-view.jsx index 09afa3b0..15fc5f1e 100644 --- a/src/views/password-reset-view.jsx +++ b/src/views/password-reset-view.jsx @@ -1,4 +1,4 @@ -/* A password reset form */ +// A password reset form. import React from 'react'; import VisiblePassword from '../widgets/visible-password.jsx'; diff --git a/src/views/validation-view.jsx b/src/views/validation-view.jsx index dbc817ac..9c55fb66 100644 --- a/src/views/validation-view.jsx +++ b/src/views/validation-view.jsx @@ -1,7 +1,21 @@ // ValidationView: panel for confirming credentials, like email or phone. import React from 'react'; +import { FormattedMessage, defineMessages, injectIntl } from 'react-intl'; -export default class ValidationView extends React.PureComponent { +const messages = defineMessages({ + phone: { + id: 'phone', + defaultMessage: 'phone', + description: "The word 'phone'", + }, + email: { + id: 'email', + defaultMessage: 'email', + description: "The word 'email'", + } +}); + +class ValidationView extends React.PureComponent { constructor(props) { super(props); @@ -32,24 +46,35 @@ export default class ValidationView extends React.PureComponent { } render() { - var methods = {'email': "email", 'tel': "phone"}; - var method = methods[this.props.credMethod] || this.props.credMethod; + const { formatMessage } = this.props.intl; + const methods = {'email': formatMessage(messages.email), 'tel': formatMessage(messages.phone)}; + let method = methods[this.props.credMethod] || this.props.credMethod; return (
- + { + (numbers_only) => + }
- +
); } }; + +export default injectIntl(ValidationView); diff --git a/src/widgets/chat-message.jsx b/src/widgets/chat-message.jsx index fa186554..754e0e68 100644 --- a/src/widgets/chat-message.jsx +++ b/src/widgets/chat-message.jsx @@ -1,11 +1,15 @@ +// Single message, sent or received. import React from 'react'; -import {Drafty} from 'tinode-sdk' +import { FormattedMessage } from 'react-intl'; +import { Drafty } from 'tinode-sdk' import Attachment from './attachment.jsx'; import LetterTile from './letter-tile.jsx'; import ReceivedMarker from './received-marker.jsx' -/* Single message, sent or received. */ +import { REM_SIZE } from '../config.js'; +import { fitImageSize } from '../lib/blob-helpers.js'; + export default class ChatMessage extends React.Component { constructor(props) { super(props); @@ -50,17 +54,16 @@ export default class ChatMessage extends React.Component { } render() { - var elementKey = 0; - - var formatter = function(style, data, values) { + let elementKey = 0; + const formatter = function(style, data, values) { elementKey += 1; - var el = Drafty.tagName(style); + let el = Drafty.tagName(style); if (el) { - var attr = Drafty.attrValue(style, data) || {}; + let attr = Drafty.attrValue(style, data) || {}; attr.key = elementKey; if (style == 'IM') { // Additional processing for images - var dim = fitImageSize(data.width, data.height, + let dim = fitImageSize(data.width, data.height, Math.min(this.props.viewportWidth - REM_SIZE * 4, REM_SIZE * 36), REM_SIZE * 24, false); attr.className = 'inline-image'; attr.style = dim ? { width: dim.dstWidth + 'px', height: dim.dstHeight + 'px' } : null; @@ -95,7 +98,10 @@ export default class ChatMessage extends React.Component { }, this); content = React.createElement('span', null, Drafty.format(content, formatter, this)); } else if (typeof content != 'string') { - content = error_outline invalid content + content = error_outline + + } return ( diff --git a/src/widgets/contact.jsx b/src/widgets/contact.jsx index 10e68fb4..fc21b705 100644 --- a/src/widgets/contact.jsx +++ b/src/widgets/contact.jsx @@ -1,10 +1,10 @@ +// A single topic or user. import React from 'react'; +import { FormattedMessage } from 'react-intl'; import LetterTile from './letter-tile.jsx'; import UnreadBadge from './unread-badge.jsx'; -/* A single topic or user */ - export default class Contact extends React.Component { constructor(props) { super(props); @@ -28,20 +28,20 @@ export default class Contact extends React.Component { } render() { - var title = this.props.title; + let title = this.props.title; if (!title) { - title = unknown; + title = ; } else if (title.length > 30) { - // FIXME: this is wrong for RTL languages. + // FIXME: this is probably wrong for RTL languages. title = title.substring(0, 28) + '...'; } - var online = this.props.now ? 'online' : 'offline'; - var avatar = this.props.avatar ? this.props.avatar : true; - var badges = []; + let online = this.props.now ? 'online' : 'offline'; + let avatar = this.props.avatar ? this.props.avatar : true; + let badges = []; if (this.props.badges && this.props.badges.length > 0) { - var count = 0; + let count = 0; this.props.badges.map(function(b) { - var style = 'badge' + (b.color ? ' ' + b.color : ''); + let style = 'badge' + (b.color ? ' ' + b.color : ''); badges.push({b.name}); count ++; }); diff --git a/src/widgets/context-menu.jsx b/src/widgets/context-menu.jsx index a79760de..97be0eeb 100644 --- a/src/widgets/context-menu.jsx +++ b/src/widgets/context-menu.jsx @@ -1,6 +1,6 @@ // Context Menu: popup/dropdown menu. import React from 'react'; -import ReactDom from 'react-dom'; +import ReactDOM from 'react-dom'; import { REM_SIZE } from '../config.js'; diff --git a/src/widgets/group-manager.jsx b/src/widgets/group-manager.jsx index 5a9272a3..448b5ccb 100644 --- a/src/widgets/group-manager.jsx +++ b/src/widgets/group-manager.jsx @@ -1,6 +1,6 @@ -/* GroupMembers: control for managing a list of group members */ - +// GroupMembers: control for managing a list of group members. import React from 'react'; +import { FormattedMessage } from 'react-intl'; import ChipInput from './chip-input.jsx'; import ContactList from './contact-list.jsx'; @@ -156,8 +156,12 @@ export default class GroupManager extends React.Component { showUnread={false} onTopicSelected={this.handleContactSelected} />
- - + +
); diff --git a/src/widgets/image-preview.jsx b/src/widgets/image-preview.jsx index dd22fa0a..482acab1 100644 --- a/src/widgets/image-preview.jsx +++ b/src/widgets/image-preview.jsx @@ -1,4 +1,9 @@ import React from 'react'; +import { FormattedMessage } from 'react-intl'; + +import { REM_SIZE } from '../config.js'; +import { fitImageSize } from '../lib/blob-helpers.js'; +import { bytesToHumanSize } from '../lib/strformat.js'; export default class ImagePreview extends React.PureComponent { constructor(props) { @@ -43,10 +48,19 @@ export default class ImagePreview extends React.PureComponent { diff --git a/src/widgets/in-place-edit.jsx b/src/widgets/in-place-edit.jsx index 1f53e0da..6a0bda66 100644 --- a/src/widgets/in-place-edit.jsx +++ b/src/widgets/in-place-edit.jsx @@ -1,6 +1,6 @@ // In-place text editor. Shows text with an icon which toggles it into an input field. import React from 'react'; -import ReactDom from 'react-dom'; +import ReactDOM from 'react-dom'; import VisiblePassword from './visible-password.jsx'; diff --git a/src/widgets/send-message.jsx b/src/widgets/send-message.jsx index 146ac31b..781573bf 100644 --- a/src/widgets/send-message.jsx +++ b/src/widgets/send-message.jsx @@ -1,8 +1,11 @@ // Send message form. import React from 'react'; import { defineMessages, injectIntl } from 'react-intl'; +import { Drafty } from 'tinode-sdk'; -import { KEYPRESS_DELAY } from '../config.js'; +import { KEYPRESS_DELAY, MAX_EXTERN_ATTACHMENT_SIZE, MAX_IMAGE_DIM, MAX_INBAND_ATTACHMENT_SIZE } from '../config.js'; +import { SUPPORTED_IMAGE_FORMATS, filePasted, imageFileToBase64, imageFileScaledToBase64 } from '../lib/blob-helpers.js'; +import { bytesToHumanSize } from '../lib/strformat.js'; const messages = defineMessages({ 'messaging_disabled': { @@ -14,7 +17,17 @@ const messages = defineMessages({ id: 'new_message_prompt', defaultMessage: 'New message', description: 'Prompt in SendMessage in read-only topic' - } + }, + 'file_attachment_too_large': { + id: 'file_attachment_too_large', + defaultMessage: 'The file size {size} exceeds the {limit} limit.', + description: 'Error message when attachment is too large' + }, + 'cannot_initiate_upload': { + id: 'cannot_initiate_file_upload', + defaultMessage: 'Cannot initiate file upload.', + description: 'Generic error messagewhen attachment fails' + }, }); class SendMessage extends React.PureComponent { @@ -99,17 +112,18 @@ class SendMessage extends React.PureComponent { } handleAttachFile(e) { + const {formatMessage} = this.props.intl; if (e.target.files && e.target.files.length > 0) { var file = e.target.files[0]; if (file.size > MAX_EXTERN_ATTACHMENT_SIZE) { // Too large. - this.props.onError("The file size " + bytesToHumanSize(file.size) + - " exceeds the " + bytesToHumanSize(MAX_EXTERN_ATTACHMENT_SIZE) + " limit.", 'err'); + this.props.onError(formatMessage(messages.file_attachment_too_large, + {size: bytesToHumanSize(file.size), limit: bytesToHumanSize(MAX_EXTERN_ATTACHMENT_SIZE)}), 'err'); } else if (file.size > MAX_INBAND_ATTACHMENT_SIZE) { // Too large to send inband - uploading out of band and sending as a link. let uploader = this.props.tinode.getLargeFileHelper(); if (!uploader) { - this.props.onError("Cannot initiate file upload."); + this.props.onError(formatMessage(messages.cannot_initiate_upload)); return; } // Format data and initiate upload. diff --git a/umd/index.dev.js b/umd/index.dev.js index 6379a039..5ded1b81 100644 --- a/umd/index.dev.js +++ b/umd/index.dev.js @@ -696,7 +696,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var reac /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"SUPPORTED_IMAGE_FORMATS\", function() { return SUPPORTED_IMAGE_FORMATS; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"MIME_EXTENSIONS\", function() { return MIME_EXTENSIONS; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"makeImageUrl\", function() { return makeImageUrl; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"fitImageSize\", function() { return fitImageSize; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"fileNameForMime\", function() { return fileNameForMime; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"imageFileScaledToBase64\", function() { return imageFileScaledToBase64; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"imageFileToBase64\", function() { return imageFileToBase64; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"fileToBase64\", function() { return fileToBase64; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"filePasted\", function() { return filePasted; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"getMimeType\", function() { return getMimeType; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"base64EncodedLen\", function() { return base64EncodedLen; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"base64DecodedLen\", function() { return base64DecodedLen; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"base64ReEncode\", function() { return base64ReEncode; });\nvar SUPPORTED_IMAGE_FORMATS = ['image/jpeg', 'image/gif', 'image/png', 'image/svg', 'image/svg+xml'];\nvar MIME_EXTENSIONS = ['jpg', 'gif', 'png', 'svg', 'svg'];\nfunction makeImageUrl(photo) {\n return photo && photo.type && photo.data ? 'data:image/' + photo.type + ';base64,' + photo.data : null;\n}\nfunction fitImageSize(width, height, maxWidth, maxHeight, forceSquare) {\n if (!width || !height || !maxWidth || !maxHeight) {\n return null;\n }\n\n if (forceSquare) {\n maxWidth = maxHeight = Math.min(maxWidth, maxHeight);\n }\n\n var scale = Math.min(Math.min(width, maxWidth) / width, Math.min(height, maxHeight) / height);\n var size = {\n dstWidth: width * scale | 0,\n dstHeight: height * scale | 0\n };\n\n if (forceSquare) {\n size.dstWidth = size.dstHeight = Math.min(size.dstWidth, size.dstHeight);\n size.srcWidth = size.srcHeight = Math.min(width, height);\n size.xoffset = (width - size.srcWidth) / 2 | 0;\n size.yoffset = (height - size.srcWidth) / 2 | 0;\n } else {\n size.xoffset = size.yoffset = 0;\n size.srcWidth = width;\n size.srcHeight = height;\n }\n\n return size;\n}\nfunction fileNameForMime(fname, mime) {\n var idx = SUPPORTED_IMAGE_FORMATS.indexOf(mime);\n var ext = MIME_EXTENSIONS[idx];\n var at = fname.lastIndexOf('.');\n\n if (at >= 0) {\n fname = fname.substring(0, at);\n }\n\n return fname + '.' + ext;\n}\nfunction imageFileScaledToBase64(file, width, height, forceSquare, onSuccess, onError) {\n var img = new Image();\n img.crossOrigin = 'Anonymous';\n\n img.onerror = function (err) {\n onError(\"Image format unrecognized\");\n };\n\n img.onload = function () {\n var dim = fitImageSize(this.width, this.height, width, height, forceSquare);\n\n if (!dim) {\n onError(\"Invalid image\");\n return;\n }\n\n var canvas = document.createElement('canvas');\n canvas.width = dim.dstWidth;\n canvas.height = dim.dstHeight;\n var ctx = canvas.getContext('2d');\n ctx.imageSmoothingEnabled = true;\n ctx.drawImage(this, dim.xoffset, dim.yoffset, dim.srcWidth, dim.srcHeight, 0, 0, dim.dstWidth, dim.dstHeight);\n var mime = this.width != dim.dstWidth || this.height != dim.dstHeight || SUPPORTED_IMAGE_FORMATS.indexOf(file.type) < 0 ? 'image/jpeg' : file.type;\n var imageBits = canvas.toDataURL(mime);\n var parts = imageBits.split(',');\n mime = getMimeType(parts[0]);\n\n if (!mime) {\n onError(\"Unsupported image format\");\n return;\n }\n\n var quality = 0.78;\n\n if (base64DecodedLen(imageBits.length) > MAX_INBAND_ATTACHMENT_SIZE) {\n mime = 'image/jpeg';\n }\n\n if (mime == 'image/jpeg') {\n while (base64DecodedLen(imageBits.length) > MAX_INBAND_ATTACHMENT_SIZE && quality > 0.45) {\n imageBits = canvas.toDataURL(mime, quality);\n quality *= 0.84;\n }\n }\n\n if (base64DecodedLen(imageBits.length) > MAX_INBAND_ATTACHMENT_SIZE) {\n onError(\"The image size \" + bytesToHumanSize(base64DecodedLen(imageBits.length)) + \" exceeds the \" + bytesToHumanSize(MAX_INBAND_ATTACHMENT_SIZE) + \" limit.\", \"err\");\n return;\n }\n\n canvas = null;\n onSuccess(imageBits.split(',')[1], mime, dim.dstWidth, dim.dstHeight, fileNameForMime(file.name, mime));\n };\n\n img.src = URL.createObjectURL(file);\n}\nfunction imageFileToBase64(file, onSuccess, onError) {\n var reader = new FileReader();\n reader.addEventListener('load', function () {\n var parts = reader.result.split(',');\n var mime = getMimeType(parts[0]);\n\n if (!mime) {\n onError(\"Failed to process image file\");\n return;\n }\n\n var img = new Image();\n img.crossOrigin = 'Anonymous';\n\n img.onload = function () {\n onSuccess(parts[1], mime, this.width, this.height, fileNameForMime(file.name, mime));\n };\n\n img.onerror = function (err) {\n onError(\"Image format not recognized\");\n };\n\n img.src = URL.createObjectURL(file);\n }, false);\n reader.readAsDataURL(file);\n}\nfunction fileToBase64(file, onSuccess, onError) {\n var reader = new FileReader();\n reader.addEventListener('load', function () {\n onSuccess(file.type, reader.result.split(',')[1], file.name);\n });\n reader.readAsDataURL(file);\n}\nfunction filePasted(event, onImageSuccess, onAttachmentSuccess, onError) {\n var items = (event.clipboardData || event.originalEvent.clipboardData || {}).items;\n\n for (var i in items) {\n var item = items[i];\n\n if (item.kind === 'file') {\n var file = item.getAsFile();\n\n if (!file) {\n console.log(\"Failed to get file object from pasted file item\", item.kind, item.type);\n continue;\n }\n\n if (file.type && file.type.split('/')[0] == 'image') {\n if (file.size > MAX_INBAND_ATTACHMENT_SIZE || SUPPORTED_IMAGE_FORMATS.indexOf(file.type) < 0) {\n imageFileScaledToBase64(file, MAX_IMAGE_DIM, MAX_IMAGE_DIM, false, onImageSuccess, onError);\n } else {\n imageFileToBase64(file, onImageSuccess, onError);\n }\n } else {\n fileToBase64(file, onAttachmentSuccess, onError);\n }\n\n return true;\n }\n }\n\n return false;\n}\nfunction getMimeType(header) {\n var mime = /^data:(image\\/[-+a-z0-9.]+);base64/.exec(header);\n return mime && mime.length > 1 ? mime[1] : null;\n}\nfunction base64EncodedLen(n) {\n return Math.floor((n + 2) / 3) * 4;\n}\nfunction base64DecodedLen(n) {\n return Math.floor(n / 4) * 3;\n}\nfunction base64ReEncode(str) {\n if (str) {\n str = str.replace('-', '+').replace('_', '/');\n\n try {\n str = btoa(atob(str));\n } catch (err) {\n console.log(\"Failed to base64 re-decode string\");\n str = null;\n }\n }\n\n return str;\n}\n\n//# sourceURL=webpack:///./src/lib/blob-helpers.js?"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"SUPPORTED_IMAGE_FORMATS\", function() { return SUPPORTED_IMAGE_FORMATS; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"MIME_EXTENSIONS\", function() { return MIME_EXTENSIONS; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"makeImageUrl\", function() { return makeImageUrl; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"fitImageSize\", function() { return fitImageSize; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"fileNameForMime\", function() { return fileNameForMime; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"imageFileScaledToBase64\", function() { return imageFileScaledToBase64; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"imageFileToBase64\", function() { return imageFileToBase64; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"fileToBase64\", function() { return fileToBase64; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"filePasted\", function() { return filePasted; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"getMimeType\", function() { return getMimeType; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"base64EncodedLen\", function() { return base64EncodedLen; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"base64DecodedLen\", function() { return base64DecodedLen; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"base64ReEncode\", function() { return base64ReEncode; });\n/* harmony import */ var _config_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../config.js */ \"./src/config.js\");\n\nvar SUPPORTED_IMAGE_FORMATS = ['image/jpeg', 'image/gif', 'image/png', 'image/svg', 'image/svg+xml'];\nvar MIME_EXTENSIONS = ['jpg', 'gif', 'png', 'svg', 'svg'];\nfunction makeImageUrl(photo) {\n return photo && photo.type && photo.data ? 'data:image/' + photo.type + ';base64,' + photo.data : null;\n}\nfunction fitImageSize(width, height, maxWidth, maxHeight, forceSquare) {\n if (!width || !height || !maxWidth || !maxHeight) {\n return null;\n }\n\n if (forceSquare) {\n maxWidth = maxHeight = Math.min(maxWidth, maxHeight);\n }\n\n var scale = Math.min(Math.min(width, maxWidth) / width, Math.min(height, maxHeight) / height);\n var size = {\n dstWidth: width * scale | 0,\n dstHeight: height * scale | 0\n };\n\n if (forceSquare) {\n size.dstWidth = size.dstHeight = Math.min(size.dstWidth, size.dstHeight);\n size.srcWidth = size.srcHeight = Math.min(width, height);\n size.xoffset = (width - size.srcWidth) / 2 | 0;\n size.yoffset = (height - size.srcWidth) / 2 | 0;\n } else {\n size.xoffset = size.yoffset = 0;\n size.srcWidth = width;\n size.srcHeight = height;\n }\n\n return size;\n}\nfunction fileNameForMime(fname, mime) {\n var idx = SUPPORTED_IMAGE_FORMATS.indexOf(mime);\n var ext = MIME_EXTENSIONS[idx];\n var at = fname.lastIndexOf('.');\n\n if (at >= 0) {\n fname = fname.substring(0, at);\n }\n\n return fname + '.' + ext;\n}\nfunction imageFileScaledToBase64(file, width, height, forceSquare, onSuccess, onError) {\n var img = new Image();\n img.crossOrigin = 'Anonymous';\n\n img.onerror = function (err) {\n onError(\"Image format unrecognized\");\n };\n\n img.onload = function () {\n var dim = fitImageSize(this.width, this.height, width, height, forceSquare);\n\n if (!dim) {\n onError(\"Invalid image\");\n return;\n }\n\n var canvas = document.createElement('canvas');\n canvas.width = dim.dstWidth;\n canvas.height = dim.dstHeight;\n var ctx = canvas.getContext('2d');\n ctx.imageSmoothingEnabled = true;\n ctx.drawImage(this, dim.xoffset, dim.yoffset, dim.srcWidth, dim.srcHeight, 0, 0, dim.dstWidth, dim.dstHeight);\n var mime = this.width != dim.dstWidth || this.height != dim.dstHeight || SUPPORTED_IMAGE_FORMATS.indexOf(file.type) < 0 ? 'image/jpeg' : file.type;\n var imageBits = canvas.toDataURL(mime);\n var parts = imageBits.split(',');\n mime = getMimeType(parts[0]);\n\n if (!mime) {\n onError(\"Unsupported image format\");\n return;\n }\n\n var quality = 0.78;\n\n if (base64DecodedLen(imageBits.length) > _config_js__WEBPACK_IMPORTED_MODULE_0__[\"MAX_INBAND_ATTACHMENT_SIZE\"]) {\n mime = 'image/jpeg';\n }\n\n if (mime == 'image/jpeg') {\n while (base64DecodedLen(imageBits.length) > _config_js__WEBPACK_IMPORTED_MODULE_0__[\"MAX_INBAND_ATTACHMENT_SIZE\"] && quality > 0.45) {\n imageBits = canvas.toDataURL(mime, quality);\n quality *= 0.84;\n }\n }\n\n if (base64DecodedLen(imageBits.length) > _config_js__WEBPACK_IMPORTED_MODULE_0__[\"MAX_INBAND_ATTACHMENT_SIZE\"]) {\n onError(\"The image size \" + bytesToHumanSize(base64DecodedLen(imageBits.length)) + \" exceeds the \" + bytesToHumanSize(_config_js__WEBPACK_IMPORTED_MODULE_0__[\"MAX_INBAND_ATTACHMENT_SIZE\"]) + \" limit.\", \"err\");\n return;\n }\n\n canvas = null;\n onSuccess(imageBits.split(',')[1], mime, dim.dstWidth, dim.dstHeight, fileNameForMime(file.name, mime));\n };\n\n img.src = URL.createObjectURL(file);\n}\nfunction imageFileToBase64(file, onSuccess, onError) {\n var reader = new FileReader();\n reader.addEventListener('load', function () {\n var parts = reader.result.split(',');\n var mime = getMimeType(parts[0]);\n\n if (!mime) {\n onError(\"Failed to process image file\");\n return;\n }\n\n var img = new Image();\n img.crossOrigin = 'Anonymous';\n\n img.onload = function () {\n onSuccess(parts[1], mime, this.width, this.height, fileNameForMime(file.name, mime));\n };\n\n img.onerror = function (err) {\n onError(\"Image format not recognized\");\n };\n\n img.src = URL.createObjectURL(file);\n }, false);\n reader.readAsDataURL(file);\n}\nfunction fileToBase64(file, onSuccess, onError) {\n var reader = new FileReader();\n reader.addEventListener('load', function () {\n onSuccess(file.type, reader.result.split(',')[1], file.name);\n });\n reader.readAsDataURL(file);\n}\nfunction filePasted(event, onImageSuccess, onAttachmentSuccess, onError) {\n var items = (event.clipboardData || event.originalEvent.clipboardData || {}).items;\n\n for (var i in items) {\n var item = items[i];\n\n if (item.kind === 'file') {\n var file = item.getAsFile();\n\n if (!file) {\n console.log(\"Failed to get file object from pasted file item\", item.kind, item.type);\n continue;\n }\n\n if (file.type && file.type.split('/')[0] == 'image') {\n if (file.size > _config_js__WEBPACK_IMPORTED_MODULE_0__[\"MAX_INBAND_ATTACHMENT_SIZE\"] || SUPPORTED_IMAGE_FORMATS.indexOf(file.type) < 0) {\n imageFileScaledToBase64(file, _config_js__WEBPACK_IMPORTED_MODULE_0__[\"MAX_IMAGE_DIM\"], _config_js__WEBPACK_IMPORTED_MODULE_0__[\"MAX_IMAGE_DIM\"], false, onImageSuccess, onError);\n } else {\n imageFileToBase64(file, onImageSuccess, onError);\n }\n } else {\n fileToBase64(file, onAttachmentSuccess, onError);\n }\n\n return true;\n }\n }\n\n return false;\n}\nfunction getMimeType(header) {\n var mime = /^data:(image\\/[-+a-z0-9.]+);base64/.exec(header);\n return mime && mime.length > 1 ? mime[1] : null;\n}\nfunction base64EncodedLen(n) {\n return Math.floor((n + 2) / 3) * 4;\n}\nfunction base64DecodedLen(n) {\n return Math.floor(n / 4) * 3;\n}\nfunction base64ReEncode(str) {\n if (str) {\n str = str.replace('-', '+').replace('_', '/');\n\n try {\n str = btoa(atob(str));\n } catch (err) {\n console.log(\"Failed to base64 re-encode string\");\n str = null;\n }\n }\n\n return str;\n}\n\n//# sourceURL=webpack:///./src/lib/blob-helpers.js?"); /***/ }), @@ -767,7 +767,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) * /*! exports provided: en, ru, default */ /***/ (function(module) { -eval("module.exports = {\"en\":{\"contacts_not_found\":\"You have no chats
¯\\\\\\\\_(ツ)_/¯\",\"full_name_prompt\":\"Full name, e.g. John Doe\",\"email_prompt\":\"Email, e.g. jdoe@example.com\",\"button_sign_up\":\"Sign up\",\"label_your_name\":\"Your name\",\"label_password\":\"Password\",\"password_unchanged_prompt\":\"Unchanged\",\"label_user_id\":\"Address:\",\"label_default_access_mode\":\"Default access mode:\",\"label_message_sound\":\"Message sound:\",\"label_push_notifications\":\"Notification alerts:\",\"label_push_notifications_disabled\":\"Notification alerts (requires HTTPS)\",\"title_tag_manager\":\"Tags (user discovery)\",\"button_logout\":\"Logout\",\"login_prompt\":\"Login\",\"password_prompt\":\"Password\",\"stay_logged_in\":\"Stay logged in\",\"forgot_password_link\":\"Forgot password?\",\"button_sign_in\":\"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\",\"tabtitle_find_user\":\"find\",\"tabtitle_new_group\":\"new group\",\"tabtitle_group_by_id\":\"by id\",\"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\",\"sidepanel_title_edit_account\":\"Edit Account\",\"sidepanel_title_newtpk\":\"Start New Chat\",\"sidepanel_title_cred\":\"Confirm Credentials\",\"sidepanel_title_reset\":\"Reset Password\",\"message_sending\":\"sending...\",\"message_sending_failed\":\"failed\",\"search_placeholder\":\"List like email:alice@example.com, tel:17025550003...\",\"messaging_disabled_prompt\":\"Messaging disabled\",\"new_message_prompt\":\"New message\",\"tags_not_found\":\"No tags defined. Add some.\",\"tags_editor_no_tags\":\"Add some tags\",\"title_manage_tags\":\"Manage tags\"},\"ru\":{\"contacts_not_found\":\"Чатов нет
¯\\\\\\\\_(ツ)_/¯\",\"full_name_prompt\":\"Полное имя, напр. Иван Петров\",\"email_prompt\":\"Email, напр. ivan@example.com\",\"button_sign_up\":\"Создать счет\",\"label_your_name\":\"Ваше имя\",\"label_password\":\"Пароль\",\"password_unchanged_prompt\":\"Не изменен\",\"label_user_id\":\"Адрес:\",\"label_default_access_mode\":\"Доступ по умолчанию:\",\"label_message_sound\":\"Звук нового сообщения:\",\"label_push_notifications\":\"Уведомления:\",\"label_push_notifications_disabled\":\"Уведомления (требуют HTTPS):\",\"title_tag_manager\":\"Таги для поиска\",\"button_logout\":\"Выйти\",\"login_prompt\":\"Логин\",\"password_prompt\":\"Пароль\",\"stay_logged_in\":\"Запомнить\",\"forgot_password_link\":\"Напомнить пароль\",\"button_sign_in\":\"Войти\",\"label_client\":\"Клиент:\",\"label_server\":\"Сервер:\",\"online_now\":\"онлайн\",\"last_seen_timestamp\":\"Был активен\",\"title_not_found\":\"Не найден\",\"unnamed_topic\":\"Без названия\",\"messages_not_readable\":\"нет доступа к сообщениям\",\"tabtitle_find_user\":\"найти\",\"tabtitle_new_group\":\"создать\",\"tabtitle_group_by_id\":\"по id\",\"label_server_to_use\":\"Использовать сервер:\",\"label_wire_transport\":\"Соединение:\",\"button_update\":\"Применить\",\"sidepanel_title_login\":\"Авторизация\",\"sidepanel_title_register\":\"Зарегистрироваться\",\"sidepanel_title_settings\":\"Настройки\",\"sidepanel_title_edit_account\":\"Редактировать счет\",\"sidepanel_title_newtpk\":\"Новый чат\",\"sidepanel_title_cred\":\"Подтвердить\",\"sidepanel_title_reset\":\"Сменить пароль\",\"tags_not_found\":\"Тагов нет. Добавьте\",\"tags_editor_no_tags\":\"Добавьте таги\",\"title_manage_tags\":\"Редактор тагов\"}};\n\n//# sourceURL=webpack:///./src/messages.json?"); +eval("module.exports = {\"en\":{\"contacts_not_found\":\"You have no chats
¯\\\\\\\\_(ツ)_/¯\",\"full_name_prompt\":\"Full name, e.g. John Doe\",\"email_prompt\":\"Email, e.g. jdoe@example.com\",\"button_sign_up\":\"Sign up\",\"label_your_name\":\"Your name\",\"label_password\":\"Password\",\"password_unchanged_prompt\":\"Unchanged\",\"label_user_id\":\"Address:\",\"label_default_access_mode\":\"Default access mode:\",\"label_message_sound\":\"Message sound:\",\"label_push_notifications\":\"Notification alerts:\",\"label_push_notifications_disabled\":\"Notification alerts (requires HTTPS):\",\"title_tag_manager\":\"Tags (user discovery)\",\"button_logout\":\"Logout\",\"login_prompt\":\"Login\",\"password_prompt\":\"Password\",\"stay_logged_in\":\"Stay logged in\",\"forgot_password_link\":\"Forgot password?\",\"button_sign_in\":\"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\",\"tabtitle_find_user\":\"find\",\"tabtitle_new_group\":\"new group\",\"tabtitle_group_by_id\":\"by id\",\"search_for_contacts\":\"Use search to find contacts\",\"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\",\"sidepanel_title_edit_account\":\"Edit Account\",\"sidepanel_title_newtpk\":\"Start New Chat\",\"sidepanel_title_cred\":\"Confirm Credentials\",\"sidepanel_title_reset\":\"Reset Password\",\"phone\":\"phone\",\"email\":\"email\",\"enter_confirmation_code_prompt\":\"Enter confirmation code sent to you by {method}:\",\"numeric_confirmation_code_prompt\":\"Numbers only\",\"button_confirm\":\"Confirm\",\"invalid_content\":\"invalid content\",\"button_ok\":\"OK\",\"button_cancel\":\"Cancel\",\"label_file_name\":\"File name:\",\"label_content_type\":\"Content type:\",\"label_size\":\"Size:\",\"message_sending\":\"sending...\",\"message_sending_failed\":\"failed\",\"search_placeholder\":\"List like email:alice@example.com, tel:17025550003...\",\"messaging_disabled_prompt\":\"Messaging disabled\",\"new_message_prompt\":\"New message\",\"file_attachment_too_large\":\"The file size {size} exceeds the {limit} limit.\",\"cannot_initiate_file_upload\":\"Cannot initiate file upload.\",\"tags_not_found\":\"No tags defined. Add some.\",\"tags_editor_no_tags\":\"Add some tags\",\"title_manage_tags\":\"Manage tags\"},\"ru\":{\"contacts_not_found\":\"Чатов нет
¯\\\\\\\\_(ツ)_/¯\",\"full_name_prompt\":\"Полное имя, напр. Иван Петров\",\"email_prompt\":\"Email, напр. ivan@example.com\",\"button_sign_up\":\"Создать счет\",\"label_your_name\":\"Ваше имя\",\"label_password\":\"Пароль\",\"password_unchanged_prompt\":\"Не изменен\",\"label_user_id\":\"Адрес:\",\"label_default_access_mode\":\"Доступ по умолчанию:\",\"label_message_sound\":\"Звук нового сообщения:\",\"label_push_notifications\":\"Уведомления:\",\"label_push_notifications_disabled\":\"Уведомления (требуют HTTPS):\",\"title_tag_manager\":\"Таги для поиска\",\"button_logout\":\"Выйти\",\"login_prompt\":\"Логин\",\"password_prompt\":\"Пароль\",\"stay_logged_in\":\"Запомнить\",\"forgot_password_link\":\"Напомнить пароль\",\"button_sign_in\":\"Войти\",\"label_client\":\"Клиент:\",\"label_server\":\"Сервер:\",\"online_now\":\"онлайн\",\"last_seen_timestamp\":\"Был активен\",\"title_not_found\":\"Не найден\",\"unnamed_topic\":\"Без названия\",\"messages_not_readable\":\"нет доступа к сообщениям\",\"tabtitle_find_user\":\"найти\",\"tabtitle_new_group\":\"создать\",\"tabtitle_group_by_id\":\"по id\",\"label_server_to_use\":\"Использовать сервер:\",\"label_wire_transport\":\"Соединение:\",\"button_update\":\"Применить\",\"sidepanel_title_login\":\"Авторизация\",\"sidepanel_title_register\":\"Зарегистрироваться\",\"sidepanel_title_settings\":\"Настройки\",\"sidepanel_title_edit_account\":\"Редактировать счет\",\"sidepanel_title_newtpk\":\"Новый чат\",\"sidepanel_title_cred\":\"Подтвердить\",\"sidepanel_title_reset\":\"Сменить пароль\",\"tags_not_found\":\"Тагов нет. Добавьте\",\"tags_editor_no_tags\":\"Добавьте таги\",\"title_manage_tags\":\"Редактор тагов\",\"message_sending\":\"шлём...\",\"message_sending_failed\":\"ошибка\",\"search_placeholder\":\"Список, напр. email:alice@example.com, tel:17025550003...\",\"messaging_disabled_prompt\":\"Отправка недоступна\",\"new_message_prompt\":\"Новое сообщение\",\"file_attachment_too_large\":\"Размер файла {size} превышает {limit} лимит.\",\"cannot_initiate_file_upload\":\"Ошибка загрузки файла.\"}};\n\n//# sourceURL=webpack:///./src/messages.json?"); /***/ }), @@ -815,7 +815,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) * /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return EditAccountView; });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var react_intl__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react-intl */ \"./node_modules/react-intl/lib/index.es.js\");\n/* harmony import */ var _widgets_avatar_upload_jsx__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../widgets/avatar-upload.jsx */ \"./src/widgets/avatar-upload.jsx\");\n/* harmony import */ var _widgets_checkbox_jsx__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../widgets/checkbox.jsx */ \"./src/widgets/checkbox.jsx\");\n/* harmony import */ var _widgets_in_place_edit_jsx__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../widgets/in-place-edit.jsx */ \"./src/widgets/in-place-edit.jsx\");\n/* harmony import */ var _widgets_permissions_editor_jsx__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../widgets/permissions-editor.jsx */ \"./src/widgets/permissions-editor.jsx\");\n/* harmony import */ var _widgets_tag_manager_jsx__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../widgets/tag-manager.jsx */ \"./src/widgets/tag-manager.jsx\");\n/* harmony import */ var _lib_blob_helpers_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../lib/blob-helpers.js */ \"./src/lib/blob-helpers.js\");\nfunction _typeof(obj) { if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; } return _typeof(obj); }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }\n\nfunction _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === \"object\" || typeof call === \"function\")) { return call; } return _assertThisInitialized(self); }\n\nfunction _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function\"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); }\n\nfunction _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }\n\nfunction _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return self; }\n\n\n\n\n\n\n\n\n\n\nvar EditAccountView = function (_React$Component) {\n _inherits(EditAccountView, _React$Component);\n\n function EditAccountView(props) {\n var _this;\n\n _classCallCheck(this, EditAccountView);\n\n _this = _possibleConstructorReturn(this, _getPrototypeOf(EditAccountView).call(this, props));\n\n var me = _this.props.tinode.getMeTopic();\n\n var defacs = me.getDefaultAccess();\n\n var fnd = _this.props.tinode.getFndTopic();\n\n _this.state = {\n fullName: me.public ? me.public.fn : undefined,\n avatar: Object(_lib_blob_helpers_js__WEBPACK_IMPORTED_MODULE_7__[\"makeImageUrl\"])(me.public ? me.public.photo : null),\n auth: defacs ? defacs.auth : null,\n anon: defacs ? defacs.anon : null,\n tags: fnd.tags(),\n showPermissionEditorFor: undefined,\n previousOnTags: fnd.onTagsUpdated\n };\n _this.tnNewTags = _this.tnNewTags.bind(_assertThisInitialized(_assertThisInitialized(_this)));\n _this.handleFullNameUpdate = _this.handleFullNameUpdate.bind(_assertThisInitialized(_assertThisInitialized(_this)));\n _this.handlePasswordUpdate = _this.handlePasswordUpdate.bind(_assertThisInitialized(_assertThisInitialized(_this)));\n _this.handleImageChanged = _this.handleImageChanged.bind(_assertThisInitialized(_assertThisInitialized(_this)));\n _this.handleCheckboxClick = _this.handleCheckboxClick.bind(_assertThisInitialized(_assertThisInitialized(_this)));\n _this.handleLaunchPermissionsEditor = _this.handleLaunchPermissionsEditor.bind(_assertThisInitialized(_assertThisInitialized(_this)));\n _this.handleHidePermissionsEditor = _this.handleHidePermissionsEditor.bind(_assertThisInitialized(_assertThisInitialized(_this)));\n _this.handlePermissionsChanged = _this.handlePermissionsChanged.bind(_assertThisInitialized(_assertThisInitialized(_this)));\n _this.handleTagsUpdated = _this.handleTagsUpdated.bind(_assertThisInitialized(_assertThisInitialized(_this)));\n return _this;\n }\n\n _createClass(EditAccountView, [{\n key: \"componentDidMount\",\n value: function componentDidMount() {\n var _this2 = this;\n\n var fnd = this.props.tinode.getFndTopic();\n fnd.onTagsUpdated = this.tnNewTags;\n\n if (!fnd.isSubscribed()) {\n fnd.subscribe(fnd.startMetaQuery().withLaterDesc().withTags().build()).catch(function (err) {\n _this2.props.onError(err.message, 'err');\n });\n }\n }\n }, {\n key: \"componentWillUnmount\",\n value: function componentWillUnmount() {\n var fnd = this.props.tinode.getFndTopic();\n fnd.onTagsUpdated = this.state.previousOnTags;\n }\n }, {\n key: \"tnNewTags\",\n value: function tnNewTags(tags) {\n this.setState({\n tags: tags\n });\n }\n }, {\n key: \"handleFullNameUpdate\",\n value: function handleFullNameUpdate(fn) {\n this.setState({\n fullName: fn\n });\n this.props.onUpdateAccount(undefined, vcard(fn, this.state.avatar));\n }\n }, {\n key: \"handlePasswordUpdate\",\n value: function handlePasswordUpdate(pwd) {\n this.setState({\n password: pwd\n });\n this.props.onUpdateAccount(pwd);\n }\n }, {\n key: \"handleImageChanged\",\n value: function handleImageChanged(img) {\n this.setState({\n avatar: img\n });\n this.props.onUpdateAccount(undefined, vcard(this.state.fullName, img));\n }\n }, {\n key: \"handleCheckboxClick\",\n value: function handleCheckboxClick(what, checked) {\n if (what == 'sound') {\n this.props.onToggleMessageSounds(checked);\n } else if (what == 'alert') {\n this.props.onTogglePushNotifications(checked);\n }\n }\n }, {\n key: \"handleLaunchPermissionsEditor\",\n value: function handleLaunchPermissionsEditor(which) {\n this.setState({\n showPermissionEditorFor: which,\n editedPermissions: this.state[which]\n });\n }\n }, {\n key: \"handleHidePermissionsEditor\",\n value: function handleHidePermissionsEditor() {\n this.setState({\n showPermissionEditorFor: undefined\n });\n }\n }, {\n key: \"handlePermissionsChanged\",\n value: function handlePermissionsChanged(perm) {\n var defacs = {};\n defacs[this.state.showPermissionEditorFor] = perm;\n this.props.onUpdateAccount(undefined, undefined, defacs);\n var newState = {\n showPermissionEditorFor: undefined\n };\n newState[this.state.showPermissionEditorFor] = perm;\n this.setState(newState);\n }\n }, {\n key: \"handleTagsUpdated\",\n value: function handleTagsUpdated(tags) {\n if (arrayEqual(this.state.tags.slice(0), tags.slice(0))) {\n return;\n }\n\n this.props.onUpdateTags(tags);\n }\n }, {\n key: \"render\",\n value: function render() {\n var _this3 = this;\n\n var tags = [];\n this.state.tags.map(function (tag) {\n tags.push(react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"span\", {\n className: \"badge\",\n key: tags.length\n }, tag));\n });\n\n if (tags.length == 0) {\n tags = react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"i\", null, react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_1__[\"FormattedMessage\"], {\n id: \"tags_not_found\"\n }));\n }\n\n return react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(react__WEBPACK_IMPORTED_MODULE_0___default.a.Fragment, null, this.state.showPermissionEditorFor ? react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_widgets_permissions_editor_jsx__WEBPACK_IMPORTED_MODULE_5__[\"default\"], {\n mode: this.state.editedPermissions,\n skip: \"O\",\n onSubmit: this.handlePermissionsChanged,\n onCancel: this.handleHidePermissionsEditor\n }) : react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"div\", {\n id: \"edit-account\",\n className: \"scrollable-panel\"\n }, react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"div\", {\n className: \"panel-form-row\"\n }, react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"div\", {\n className: \"panel-form-column\"\n }, react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"div\", null, react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"label\", {\n className: \"small\"\n }, react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_1__[\"FormattedMessage\"], {\n id: \"label_your_name\",\n defaultMessage: \"Your name\"\n }))), react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"div\", null, react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_1__[\"FormattedMessage\"], {\n id: \"full_name_prompt\"\n }, function (full_name_placeholder) {\n return react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_widgets_in_place_edit_jsx__WEBPACK_IMPORTED_MODULE_4__[\"default\"], {\n placeholder: full_name_placeholder,\n value: _this3.state.fullName,\n onFinished: _this3.handleFullNameUpdate\n });\n })), react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"div\", null, react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"label\", {\n className: \"small\"\n }, react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_1__[\"FormattedMessage\"], {\n id: \"label_password\",\n defaultMessage: \"Password\"\n }))), react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"div\", null, react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_1__[\"FormattedMessage\"], {\n id: \"password_unchanged_prompt\",\n defaultMessage: \"Unchanged\"\n }, function (password_unchanged) {\n return react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_widgets_in_place_edit_jsx__WEBPACK_IMPORTED_MODULE_4__[\"default\"], {\n placeholder: password_unchanged,\n type: \"password\",\n onFinished: _this3.handlePasswordUpdate\n });\n }))), react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_widgets_avatar_upload_jsx__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n avatar: this.state.avatar,\n uid: this.props.myUserId,\n title: this.state.fullName,\n onImageChanged: this.handleImageChanged,\n onError: this.props.onError\n })), react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"div\", {\n className: \"hr\"\n }), react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"div\", {\n className: \"panel-form-column\"\n }, react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"div\", {\n className: \"panel-form-row\"\n }, react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"label\", null, react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_1__[\"FormattedMessage\"], {\n id: \"label_user_id\",\n defaultMessage: \"Address:\"\n })), react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"tt\", null, this.props.myUserId)), react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"div\", null, react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"label\", {\n className: \"small\"\n }, react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_1__[\"FormattedMessage\"], {\n id: \"label_default_access_mode\",\n defaultMessage: \"Default access mode:\"\n }))), react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"div\", {\n className: \"quoted\"\n }, react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"div\", null, \"Auth: \", react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"tt\", {\n className: \"clickable\",\n onClick: this.handleLaunchPermissionsEditor.bind(this, 'auth')\n }, this.state.auth)), react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"div\", null, \"Anon: \", react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"tt\", {\n className: \"clickable\",\n onClick: this.handleLaunchPermissionsEditor.bind(this, 'anon')\n }, this.state.anon)))), react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"div\", {\n className: \"hr\"\n }), react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"div\", {\n className: \"panel-form-row\"\n }, react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"label\", {\n htmlFor: \"message-sound\"\n }, react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_1__[\"FormattedMessage\"], {\n id: \"label_message_sound\",\n defaultMessage: \"Message sound:\"\n })), react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_widgets_checkbox_jsx__WEBPACK_IMPORTED_MODULE_3__[\"default\"], {\n name: \"sound\",\n id: \"message-sound\",\n checked: this.props.messageSounds,\n onChange: this.handleCheckboxClick\n })), react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"div\", {\n className: \"panel-form-row\"\n }, react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"label\", {\n htmlFor: \"desktop-alerts\"\n }, this.props.desktopAlertsEnabled ? react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_1__[\"FormattedMessage\"], {\n id: \"label_push_notifications\",\n defaultMessage: \"Notification alerts:\"\n }) : react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_1__[\"FormattedMessage\"], {\n id: \"label_push_notifications_disabled\",\n defaultMessage: \"Notification alerts (requires HTTPS)\"\n })), react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_widgets_checkbox_jsx__WEBPACK_IMPORTED_MODULE_3__[\"default\"], {\n name: \"alert\",\n id: \"desktop-alerts\",\n checked: this.props.desktopAlerts,\n onChange: this.props.desktopAlertsEnabled ? this.handleCheckboxClick : null\n })), react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"div\", {\n className: \"hr\"\n }), react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_1__[\"FormattedMessage\"], {\n id: \"title_tag_manager\",\n defaultMessage: \"Tags (user discovery)\"\n }, function (title_tag_manager) {\n return react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_widgets_tag_manager_jsx__WEBPACK_IMPORTED_MODULE_6__[\"default\"], {\n title: title_tag_manager,\n activated: false,\n tags: _this3.state.tags,\n onSubmit: _this3.handleTagsUpdated\n });\n }), react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"div\", {\n className: \"hr\"\n }), react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"div\", {\n className: \"panel-form-column\"\n }, react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"a\", {\n href: \"javascript:;\",\n className: \"red flat-button\",\n onClick: this.props.onLogout\n }, react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"i\", {\n className: \"material-icons\"\n }, \"exit_to_app\"), \" \", react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_1__[\"FormattedMessage\"], {\n id: \"button_logout\",\n defaultMessage: \"Logout\"\n })))));\n }\n }]);\n\n return EditAccountView;\n}(react__WEBPACK_IMPORTED_MODULE_0___default.a.Component);\n\n\n;\n\n//# sourceURL=webpack:///./src/views/edit-account-view.jsx?"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return EditAccountView; });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var react_intl__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react-intl */ \"./node_modules/react-intl/lib/index.es.js\");\n/* harmony import */ var _widgets_avatar_upload_jsx__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../widgets/avatar-upload.jsx */ \"./src/widgets/avatar-upload.jsx\");\n/* harmony import */ var _widgets_checkbox_jsx__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../widgets/checkbox.jsx */ \"./src/widgets/checkbox.jsx\");\n/* harmony import */ var _widgets_in_place_edit_jsx__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../widgets/in-place-edit.jsx */ \"./src/widgets/in-place-edit.jsx\");\n/* harmony import */ var _widgets_permissions_editor_jsx__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../widgets/permissions-editor.jsx */ \"./src/widgets/permissions-editor.jsx\");\n/* harmony import */ var _widgets_tag_manager_jsx__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../widgets/tag-manager.jsx */ \"./src/widgets/tag-manager.jsx\");\n/* harmony import */ var _lib_blob_helpers_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../lib/blob-helpers.js */ \"./src/lib/blob-helpers.js\");\nfunction _typeof(obj) { if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; } return _typeof(obj); }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }\n\nfunction _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === \"object\" || typeof call === \"function\")) { return call; } return _assertThisInitialized(self); }\n\nfunction _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function\"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); }\n\nfunction _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }\n\nfunction _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return self; }\n\n\n\n\n\n\n\n\n\n\nvar EditAccountView = function (_React$Component) {\n _inherits(EditAccountView, _React$Component);\n\n function EditAccountView(props) {\n var _this;\n\n _classCallCheck(this, EditAccountView);\n\n _this = _possibleConstructorReturn(this, _getPrototypeOf(EditAccountView).call(this, props));\n\n var me = _this.props.tinode.getMeTopic();\n\n var defacs = me.getDefaultAccess();\n\n var fnd = _this.props.tinode.getFndTopic();\n\n _this.state = {\n fullName: me.public ? me.public.fn : undefined,\n avatar: Object(_lib_blob_helpers_js__WEBPACK_IMPORTED_MODULE_7__[\"makeImageUrl\"])(me.public ? me.public.photo : null),\n auth: defacs ? defacs.auth : null,\n anon: defacs ? defacs.anon : null,\n tags: fnd.tags(),\n showPermissionEditorFor: undefined,\n previousOnTags: fnd.onTagsUpdated\n };\n _this.tnNewTags = _this.tnNewTags.bind(_assertThisInitialized(_assertThisInitialized(_this)));\n _this.handleFullNameUpdate = _this.handleFullNameUpdate.bind(_assertThisInitialized(_assertThisInitialized(_this)));\n _this.handlePasswordUpdate = _this.handlePasswordUpdate.bind(_assertThisInitialized(_assertThisInitialized(_this)));\n _this.handleImageChanged = _this.handleImageChanged.bind(_assertThisInitialized(_assertThisInitialized(_this)));\n _this.handleCheckboxClick = _this.handleCheckboxClick.bind(_assertThisInitialized(_assertThisInitialized(_this)));\n _this.handleLaunchPermissionsEditor = _this.handleLaunchPermissionsEditor.bind(_assertThisInitialized(_assertThisInitialized(_this)));\n _this.handleHidePermissionsEditor = _this.handleHidePermissionsEditor.bind(_assertThisInitialized(_assertThisInitialized(_this)));\n _this.handlePermissionsChanged = _this.handlePermissionsChanged.bind(_assertThisInitialized(_assertThisInitialized(_this)));\n _this.handleTagsUpdated = _this.handleTagsUpdated.bind(_assertThisInitialized(_assertThisInitialized(_this)));\n return _this;\n }\n\n _createClass(EditAccountView, [{\n key: \"componentDidMount\",\n value: function componentDidMount() {\n var _this2 = this;\n\n var fnd = this.props.tinode.getFndTopic();\n fnd.onTagsUpdated = this.tnNewTags;\n\n if (!fnd.isSubscribed()) {\n fnd.subscribe(fnd.startMetaQuery().withLaterDesc().withTags().build()).catch(function (err) {\n _this2.props.onError(err.message, 'err');\n });\n }\n }\n }, {\n key: \"componentWillUnmount\",\n value: function componentWillUnmount() {\n var fnd = this.props.tinode.getFndTopic();\n fnd.onTagsUpdated = this.state.previousOnTags;\n }\n }, {\n key: \"tnNewTags\",\n value: function tnNewTags(tags) {\n this.setState({\n tags: tags\n });\n }\n }, {\n key: \"handleFullNameUpdate\",\n value: function handleFullNameUpdate(fn) {\n this.setState({\n fullName: fn\n });\n this.props.onUpdateAccount(undefined, vcard(fn, this.state.avatar));\n }\n }, {\n key: \"handlePasswordUpdate\",\n value: function handlePasswordUpdate(pwd) {\n this.setState({\n password: pwd\n });\n this.props.onUpdateAccount(pwd);\n }\n }, {\n key: \"handleImageChanged\",\n value: function handleImageChanged(img) {\n this.setState({\n avatar: img\n });\n this.props.onUpdateAccount(undefined, vcard(this.state.fullName, img));\n }\n }, {\n key: \"handleCheckboxClick\",\n value: function handleCheckboxClick(what, checked) {\n if (what == 'sound') {\n this.props.onToggleMessageSounds(checked);\n } else if (what == 'alert') {\n this.props.onTogglePushNotifications(checked);\n }\n }\n }, {\n key: \"handleLaunchPermissionsEditor\",\n value: function handleLaunchPermissionsEditor(which) {\n this.setState({\n showPermissionEditorFor: which,\n editedPermissions: this.state[which]\n });\n }\n }, {\n key: \"handleHidePermissionsEditor\",\n value: function handleHidePermissionsEditor() {\n this.setState({\n showPermissionEditorFor: undefined\n });\n }\n }, {\n key: \"handlePermissionsChanged\",\n value: function handlePermissionsChanged(perm) {\n var defacs = {};\n defacs[this.state.showPermissionEditorFor] = perm;\n this.props.onUpdateAccount(undefined, undefined, defacs);\n var newState = {\n showPermissionEditorFor: undefined\n };\n newState[this.state.showPermissionEditorFor] = perm;\n this.setState(newState);\n }\n }, {\n key: \"handleTagsUpdated\",\n value: function handleTagsUpdated(tags) {\n if (arrayEqual(this.state.tags.slice(0), tags.slice(0))) {\n return;\n }\n\n this.props.onUpdateTags(tags);\n }\n }, {\n key: \"render\",\n value: function render() {\n var _this3 = this;\n\n var tags = [];\n this.state.tags.map(function (tag) {\n tags.push(react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"span\", {\n className: \"badge\",\n key: tags.length\n }, tag));\n });\n\n if (tags.length == 0) {\n tags = react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"i\", null, react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_1__[\"FormattedMessage\"], {\n id: \"tags_not_found\"\n }));\n }\n\n return react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(react__WEBPACK_IMPORTED_MODULE_0___default.a.Fragment, null, this.state.showPermissionEditorFor ? react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_widgets_permissions_editor_jsx__WEBPACK_IMPORTED_MODULE_5__[\"default\"], {\n mode: this.state.editedPermissions,\n skip: \"O\",\n onSubmit: this.handlePermissionsChanged,\n onCancel: this.handleHidePermissionsEditor\n }) : react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"div\", {\n id: \"edit-account\",\n className: \"scrollable-panel\"\n }, react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"div\", {\n className: \"panel-form-row\"\n }, react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"div\", {\n className: \"panel-form-column\"\n }, react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"div\", null, react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"label\", {\n className: \"small\"\n }, react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_1__[\"FormattedMessage\"], {\n id: \"label_your_name\",\n defaultMessage: \"Your name\"\n }))), react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"div\", null, react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_1__[\"FormattedMessage\"], {\n id: \"full_name_prompt\"\n }, function (full_name_placeholder) {\n return react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_widgets_in_place_edit_jsx__WEBPACK_IMPORTED_MODULE_4__[\"default\"], {\n placeholder: full_name_placeholder,\n value: _this3.state.fullName,\n onFinished: _this3.handleFullNameUpdate\n });\n })), react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"div\", null, react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"label\", {\n className: \"small\"\n }, react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_1__[\"FormattedMessage\"], {\n id: \"label_password\",\n defaultMessage: \"Password\"\n }))), react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"div\", null, react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_1__[\"FormattedMessage\"], {\n id: \"password_unchanged_prompt\",\n defaultMessage: \"Unchanged\"\n }, function (password_unchanged) {\n return react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_widgets_in_place_edit_jsx__WEBPACK_IMPORTED_MODULE_4__[\"default\"], {\n placeholder: password_unchanged,\n type: \"password\",\n onFinished: _this3.handlePasswordUpdate\n });\n }))), react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_widgets_avatar_upload_jsx__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n avatar: this.state.avatar,\n uid: this.props.myUserId,\n title: this.state.fullName,\n onImageChanged: this.handleImageChanged,\n onError: this.props.onError\n })), react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"div\", {\n className: \"hr\"\n }), react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"div\", {\n className: \"panel-form-column\"\n }, react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"div\", {\n className: \"panel-form-row\"\n }, react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"label\", null, react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_1__[\"FormattedMessage\"], {\n id: \"label_user_id\",\n defaultMessage: \"Address:\"\n })), react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"tt\", null, this.props.myUserId)), react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"div\", null, react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"label\", {\n className: \"small\"\n }, react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_1__[\"FormattedMessage\"], {\n id: \"label_default_access_mode\",\n defaultMessage: \"Default access mode:\"\n }))), react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"div\", {\n className: \"quoted\"\n }, react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"div\", null, \"Auth: \", react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"tt\", {\n className: \"clickable\",\n onClick: this.handleLaunchPermissionsEditor.bind(this, 'auth')\n }, this.state.auth)), react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"div\", null, \"Anon: \", react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"tt\", {\n className: \"clickable\",\n onClick: this.handleLaunchPermissionsEditor.bind(this, 'anon')\n }, this.state.anon)))), react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"div\", {\n className: \"hr\"\n }), react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"div\", {\n className: \"panel-form-row\"\n }, react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"label\", {\n htmlFor: \"message-sound\"\n }, react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_1__[\"FormattedMessage\"], {\n id: \"label_message_sound\",\n defaultMessage: \"Message sound:\"\n })), react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_widgets_checkbox_jsx__WEBPACK_IMPORTED_MODULE_3__[\"default\"], {\n name: \"sound\",\n id: \"message-sound\",\n checked: this.props.messageSounds,\n onChange: this.handleCheckboxClick\n })), react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"div\", {\n className: \"panel-form-row\"\n }, react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"label\", {\n htmlFor: \"desktop-alerts\"\n }, this.props.desktopAlertsEnabled ? react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_1__[\"FormattedMessage\"], {\n id: \"label_push_notifications\",\n defaultMessage: \"Notification alerts:\"\n }) : react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_1__[\"FormattedMessage\"], {\n id: \"label_push_notifications_disabled\",\n defaultMessage: \"Notification alerts (requires HTTPS):\"\n })), react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_widgets_checkbox_jsx__WEBPACK_IMPORTED_MODULE_3__[\"default\"], {\n name: \"alert\",\n id: \"desktop-alerts\",\n checked: this.props.desktopAlerts,\n onChange: this.props.desktopAlertsEnabled ? this.handleCheckboxClick : null\n })), react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"div\", {\n className: \"hr\"\n }), react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_1__[\"FormattedMessage\"], {\n id: \"title_tag_manager\",\n defaultMessage: \"Tags (user discovery)\"\n }, function (title_tag_manager) {\n return react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_widgets_tag_manager_jsx__WEBPACK_IMPORTED_MODULE_6__[\"default\"], {\n title: title_tag_manager,\n activated: false,\n tags: _this3.state.tags,\n onSubmit: _this3.handleTagsUpdated\n });\n }), react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"div\", {\n className: \"hr\"\n }), react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"div\", {\n className: \"panel-form-column\"\n }, react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"a\", {\n href: \"javascript:;\",\n className: \"red flat-button\",\n onClick: this.props.onLogout\n }, react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"i\", {\n className: \"material-icons\"\n }, \"exit_to_app\"), \" \", react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_1__[\"FormattedMessage\"], {\n id: \"button_logout\",\n defaultMessage: \"Logout\"\n })))));\n }\n }]);\n\n return EditAccountView;\n}(react__WEBPACK_IMPORTED_MODULE_0___default.a.Component);\n\n\n;\n\n//# sourceURL=webpack:///./src/views/edit-account-view.jsx?"); /***/ }), @@ -827,7 +827,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) * /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return InfoView; });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _widgets_avatar_upload_jsx__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../widgets/avatar-upload.jsx */ \"./src/widgets/avatar-upload.jsx\");\n/* harmony import */ var _widgets_contact_list_jsx__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../widgets/contact-list.jsx */ \"./src/widgets/contact-list.jsx\");\n/* harmony import */ var _widgets_group_manager_jsx__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../widgets/group-manager.jsx */ \"./src/widgets/group-manager.jsx\");\n/* harmony import */ var _widgets_in_place_edit_jsx__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../widgets/in-place-edit.jsx */ \"./src/widgets/in-place-edit.jsx\");\n/* harmony import */ var _widgets_menu_cancel_jsx__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../widgets/menu-cancel.jsx */ \"./src/widgets/menu-cancel.jsx\");\n/* harmony import */ var _widgets_more_button_jsx__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../widgets/more-button.jsx */ \"./src/widgets/more-button.jsx\");\n/* harmony import */ var _widgets_permissions_editor_jsx__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../widgets/permissions-editor.jsx */ \"./src/widgets/permissions-editor.jsx\");\n/* harmony import */ var _widgets_tag_manager_jsx__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../widgets/tag-manager.jsx */ \"./src/widgets/tag-manager.jsx\");\nfunction _typeof(obj) { if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; } return _typeof(obj); }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }\n\nfunction _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === \"object\" || typeof call === \"function\")) { return call; } return _assertThisInitialized(self); }\n\nfunction _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function\"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); }\n\nfunction _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }\n\nfunction _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return self; }\n\n\n\n\n\n\n\n\n\n\n\nvar InfoView = function (_React$Component) {\n _inherits(InfoView, _React$Component);\n\n function InfoView(props) {\n var _this;\n\n _classCallCheck(this, InfoView);\n\n _this = _possibleConstructorReturn(this, _getPrototypeOf(InfoView).call(this, props));\n _this.state = {\n topic: null,\n owner: false,\n admin: false,\n sharer: false,\n muted: false,\n address: null,\n groupTopic: undefined,\n fullName: undefined,\n avatar: null,\n private: null,\n selectedContact: null,\n access: null,\n modeGiven: null,\n modeWant: null,\n modeGiven2: null,\n modeWant2: null,\n auth: null,\n anon: null,\n contactList: [],\n tags: [],\n showMemberPanel: false,\n showPermissionEditorFor: undefined,\n moreInfoExpanded: false,\n previousMetaDesc: undefined,\n previousSubsUpdated: undefined,\n previousTagsUpdated: undefined\n };\n _this.resetSubs = _this.resetSubs.bind(_assertThisInitialized(_assertThisInitialized(_this)));\n _this.resetDesc = _this.resetDesc.bind(_assertThisInitialized(_assertThisInitialized(_this)));\n _this.onMetaDesc = _this.onMetaDesc.bind(_assertThisInitialized(_assertThisInitialized(_this)));\n _this.onSubsUpdated = _this.onSubsUpdated.bind(_assertThisInitialized(_assertThisInitialized(_this)));\n _this.onTagsUpdated = _this.onTagsUpdated.bind(_assertThisInitialized(_assertThisInitialized(_this)));\n _this.handleFullNameUpdate = _this.handleFullNameUpdate.bind(_assertThisInitialized(_assertThisInitialized(_this)));\n _this.handlePrivateUpdate = _this.handlePrivateUpdate.bind(_assertThisInitialized(_assertThisInitialized(_this)));\n _this.handleImageChanged = _this.handleImageChanged.bind(_assertThisInitialized(_assertThisInitialized(_this)));\n _this.handleMuted = _this.handleMuted.bind(_assertThisInitialized(_assertThisInitialized(_this)));\n _this.handlePermissionsChanged = _this.handlePermissionsChanged.bind(_assertThisInitialized(_assertThisInitialized(_this)));\n _this.handleLaunchPermissionsEditor = _this.handleLaunchPermissionsEditor.bind(_assertThisInitialized(_assertThisInitialized(_this)));\n _this.handleHidePermissionsEditor = _this.handleHidePermissionsEditor.bind(_assertThisInitialized(_assertThisInitialized(_this)));\n _this.handleShowAddMembers = _this.handleShowAddMembers.bind(_assertThisInitialized(_assertThisInitialized(_this)));\n _this.handleHideAddMembers = _this.handleHideAddMembers.bind(_assertThisInitialized(_assertThisInitialized(_this)));\n _this.handleMemberUpdateRequest = _this.handleMemberUpdateRequest.bind(_assertThisInitialized(_assertThisInitialized(_this)));\n _this.handleLeave = _this.handleLeave.bind(_assertThisInitialized(_assertThisInitialized(_this)));\n _this.handleMemberSelected = _this.handleMemberSelected.bind(_assertThisInitialized(_assertThisInitialized(_this)));\n _this.handleMoreInfo = _this.handleMoreInfo.bind(_assertThisInitialized(_assertThisInitialized(_this)));\n _this.handleTagsUpdated = _this.handleTagsUpdated.bind(_assertThisInitialized(_assertThisInitialized(_this)));\n _this.handleContextMenu = _this.handleContextMenu.bind(_assertThisInitialized(_assertThisInitialized(_this)));\n return _this;\n }\n\n _createClass(InfoView, [{\n key: \"UNSAFE_componentWillReceiveProps\",\n value: function UNSAFE_componentWillReceiveProps(props) {\n var topic = this.props.tinode.getTopic(props.topic);\n\n if (!topic) {\n return;\n }\n\n if (this.onMetaDesc != topic.onMetaDesc) {\n this.previousMetaDesc = topic.onMetaDesc;\n topic.onMetaDesc = this.onMetaDesc;\n this.previousSubsUpdated = topic.onSubsUpdated;\n topic.onSubsUpdated = this.onSubsUpdated;\n\n if (topic.getType() == 'grp') {\n this.previousTagsUpdated = topic.onTagsUpdated;\n topic.onTagsUpdated = this.onTagsUpdated;\n } else {\n this.previousTagsUpdated = undefined;\n }\n }\n\n if (this.state.topic != props.topic) {\n this.setState({\n topic: props.topic\n });\n this.resetDesc(topic, props);\n this.resetSubs(topic, props);\n }\n }\n }, {\n key: \"componentWillUnmount\",\n value: function componentWillUnmount() {\n var topic = this.props.tinode.getTopic(this.props.topic);\n\n if (!topic) {\n return;\n }\n\n this.setState({\n topic: null\n });\n topic.onMetaDesc = this.previousMetaDesc;\n topic.onSubsUpdated = this.previousSubsUpdated;\n topic.onTagsUpdated = this.previousTagsUpdated;\n }\n }, {\n key: \"resetSubs\",\n value: function resetSubs(topic, props) {\n var newState = {\n contactList: []\n };\n\n if (topic.getType() == 'p2p') {\n var user2 = topic.subscriber(props.topic);\n\n if (user2) {\n newState.modeGiven2 = user2.acs.getGiven();\n newState.modeWant2 = user2.acs.getWant();\n }\n } else {\n topic.subscribers(function (sub) {\n newState.contactList.push(sub);\n }, this);\n }\n\n this.setState(newState);\n }\n }, {\n key: \"resetDesc\",\n value: function resetDesc(topic, props) {\n var defacs = topic.getDefaultAccess() || {};\n var acs = topic.getAccessMode();\n this.setState({\n owner: acs && acs.isOwner(),\n admin: acs && acs.isAdmin(),\n sharer: acs && (acs.isAdmin() || acs.isSharer()),\n muted: acs && acs.isMuted(),\n fullName: topic.public ? topic.public.fn : undefined,\n avatar: makeImageUrl(topic.public ? topic.public.photo : null),\n private: topic.private ? topic.private.comment : null,\n address: topic.name,\n groupTopic: topic.getType() == 'grp',\n showMemberPanel: false,\n access: acs ? acs.getMode() : undefined,\n modeGiven: acs ? acs.getGiven() : undefined,\n modeWant: acs ? acs.getWant() : undefined,\n auth: defacs.auth,\n anon: defacs.anon\n });\n\n if (topic.getType() == 'grp' && acs && acs.isOwner()) {\n topic.getMeta(topic.startMetaQuery().withTags().build());\n }\n }\n }, {\n key: \"onMetaDesc\",\n value: function onMetaDesc(desc) {\n var topic = this.props.tinode.getTopic(this.props.topic);\n\n if (!topic) {\n return;\n }\n\n this.resetDesc(topic, this.props);\n\n if (this.previousMetaDesc && this.previousMetaDesc != this.onMetaDesc) {\n this.previousMetaDesc(desc);\n }\n }\n }, {\n key: \"onSubsUpdated\",\n value: function onSubsUpdated() {\n var topic = this.props.tinode.getTopic(this.props.topic);\n\n if (!topic) {\n return;\n }\n\n this.resetSubs(topic, this.props);\n\n if (this.previousSubsUpdated && this.previousSubsUpdated != this.onSubsUpdated) {\n this.previousSubsUpdated();\n }\n }\n }, {\n key: \"onTagsUpdated\",\n value: function onTagsUpdated(tags) {\n this.setState({\n tags: tags\n });\n\n if (this.previousTagsUpdated && this.previousTagsUpdated != this.onTagsUpdated) {\n this.previousTagsUpdated();\n }\n }\n }, {\n key: \"handleFullNameUpdate\",\n value: function handleFullNameUpdate(fn) {\n if (this.state.fullName !== fn) {\n this.setState({\n fullName: fn\n });\n this.props.onTopicDescUpdate(this.props.topic, vcard(fn, this.state.avatar), null);\n }\n }\n }, {\n key: \"handlePrivateUpdate\",\n value: function handlePrivateUpdate(priv) {\n if (this.state.priv !== priv) {\n this.setState({\n private: priv\n });\n this.props.onTopicDescUpdate(this.props.topic, null, priv);\n }\n }\n }, {\n key: \"handleImageChanged\",\n value: function handleImageChanged(img) {\n this.setState({\n avatar: img\n });\n this.props.onTopicDescUpdate(this.props.topic, vcard(this.state.fullName, img), null);\n }\n }, {\n key: \"handleMuted\",\n value: function handleMuted(ignored, checked) {\n this.setState({\n muted: checked\n });\n this.props.onChangePermissions(this.props.topic, checked ? '-P' : '+P');\n }\n }, {\n key: \"handlePermissionsChanged\",\n value: function handlePermissionsChanged(perm) {\n switch (this.state.showPermissionEditorFor) {\n case 'auth':\n this.props.onTopicDescUpdate(this.props.topic, null, null, {\n auth: perm\n });\n break;\n\n case 'anon':\n this.props.onTopicDescUpdate(this.props.topic, null, null, {\n anon: perm\n });\n break;\n\n case 'mode':\n case 'want':\n this.props.onChangePermissions(this.props.topic, perm);\n break;\n\n case 'given':\n this.props.onChangePermissions(this.props.topic, perm, this.props.topic);\n break;\n\n case 'user':\n this.props.onChangePermissions(this.props.topic, perm, this.state.userPermissionsEdited);\n break;\n }\n\n this.setState({\n showPermissionEditorFor: undefined\n });\n }\n }, {\n key: \"handleLaunchPermissionsEditor\",\n value: function handleLaunchPermissionsEditor(which, uid) {\n var toEdit, toCompare, toSkip, titleEdit, titleCompare, userTitle, userAvatar;\n\n switch (which) {\n case 'mode':\n toEdit = this.state.access;\n break;\n\n case 'want':\n toEdit = this.state.modeWant;\n toCompare = this.state.modeGiven;\n toSkip = this.state.groupTopic ? 'O' : 'ASDO';\n titleEdit = \"Requested\";\n titleCompare = \"Granted\";\n break;\n\n case 'given':\n toEdit = this.state.modeGiven2;\n toCompare = this.state.modeWant2;\n toSkip = this.state.groupTopic ? this.state.owner ? '' : 'O' : 'ASDO';\n titleEdit = \"Granted\";\n titleCompare = \"Requested\";\n break;\n\n case 'auth':\n toEdit = this.state.auth;\n toSkip = 'O';\n break;\n\n case 'anon':\n toEdit = this.state.anon;\n toSkip = 'O';\n break;\n\n case 'user':\n {\n var topic = this.props.tinode.getTopic(this.props.topic);\n\n if (!topic) {\n return;\n }\n\n var user = topic.subscriber(uid);\n\n if (!user || !user.acs) {\n return;\n }\n\n toEdit = user.acs.getGiven();\n toCompare = user.acs.getWant();\n toSkip = this.state.owner ? '' : 'O';\n titleEdit = \"Granted\";\n titleCompare = \"Requested\";\n\n if (user.public) {\n userTitle = user.public.fn;\n userAvatar = user.public.photo;\n }\n\n break;\n }\n\n default:\n console.log(\"Unknown permission editing mode '\" + which + \"'\");\n break;\n }\n\n this.setState({\n showPermissionEditorFor: which,\n userPermissionsEdited: uid,\n userPermissionsTitle: userTitle,\n userPermissionsAvatar: userAvatar,\n editedPermissions: toEdit,\n immutablePermissions: toCompare,\n editedPermissionsTitle: titleEdit,\n immutablePermissionsTitle: titleCompare,\n editedPermissionsSkipped: toSkip\n });\n }\n }, {\n key: \"handleHidePermissionsEditor\",\n value: function handleHidePermissionsEditor() {\n this.setState({\n showPermissionEditorFor: undefined\n });\n }\n }, {\n key: \"handleShowAddMembers\",\n value: function handleShowAddMembers() {\n this.props.onInitFind();\n this.setState({\n showMemberPanel: true\n });\n }\n }, {\n key: \"handleHideAddMembers\",\n value: function handleHideAddMembers() {\n this.setState({\n showMemberPanel: false\n });\n }\n }, {\n key: \"handleMemberUpdateRequest\",\n value: function handleMemberUpdateRequest(members, added, removed) {\n this.props.onMemberUpdateRequest(this.props.topic, added, removed);\n this.setState({\n showMemberPanel: false\n });\n }\n }, {\n key: \"handleLeave\",\n value: function handleLeave() {\n this.props.onLeaveTopic(this.props.topic);\n }\n }, {\n key: \"handleMemberSelected\",\n value: function handleMemberSelected(uid) {\n this.setState({\n selectedContact: uid\n });\n }\n }, {\n key: \"handleMoreInfo\",\n value: function handleMoreInfo(open) {\n this.setState({\n moreInfoExpanded: open\n });\n }\n }, {\n key: \"handleTagsUpdated\",\n value: function handleTagsUpdated(tags) {\n if (!arrayEqual(this.state.tags.slice(0), tags.slice(0))) {\n this.props.onTopicTagsUpdate(this.props.topic, tags);\n }\n }\n }, {\n key: \"handleContextMenu\",\n value: function handleContextMenu(params) {\n var instance = this;\n var topic = this.props.tinode.getTopic(this.props.topic);\n\n if (!topic) {\n return;\n }\n\n var user = topic.subscriber(params.topicName);\n\n if (!user || !user.acs) {\n return;\n }\n\n var menuItems = [{\n title: \"Edit permissions\",\n handler: function handler() {\n instance.handleLaunchPermissionsEditor('user', params.topicName);\n }\n }, 'member_delete', user.acs.isMuted() ? 'member_unmute' : 'member_mute', user.acs.isJoiner() ? 'member_block' : 'member_unblock'];\n this.props.showContextMenu({\n topicName: this.props.topic,\n x: params.x,\n y: params.y,\n user: params.topicName\n }, menuItems);\n }\n }, {\n key: \"render\",\n value: function render() {\n return react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"div\", {\n id: \"info-view\"\n }, react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"div\", {\n className: \"caption-panel\",\n id: \"info-caption-panel\"\n }, react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"div\", {\n className: \"panel-title\",\n id: \"info-title\"\n }, \"Info\"), react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"div\", null, react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_widgets_menu_cancel_jsx__WEBPACK_IMPORTED_MODULE_5__[\"default\"], {\n onCancel: this.props.onCancel\n }))), this.props.displayMobile ? react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(ErrorPanel, {\n level: this.props.errorLevel,\n text: this.props.errorText,\n onClearError: this.props.onError\n }) : null, this.state.showMemberPanel ? react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_widgets_group_manager_jsx__WEBPACK_IMPORTED_MODULE_3__[\"default\"], {\n members: this.state.contactList,\n requiredMember: this.props.myUserId,\n myUserId: this.props.myUserId,\n contacts: this.props.searchableContacts,\n onCancel: this.handleHideAddMembers,\n onSubmit: this.handleMemberUpdateRequest\n }) : this.state.showPermissionEditorFor ? react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_widgets_permissions_editor_jsx__WEBPACK_IMPORTED_MODULE_7__[\"default\"], {\n mode: this.state.editedPermissions,\n compare: this.state.immutablePermissions,\n skip: this.state.editedPermissionsSkipped,\n modeTitle: this.state.editedPermissionsTitle,\n compareTitle: this.state.immutablePermissionsTitle,\n userTitle: this.state.userPermissionsTitle,\n item: this.state.userPermissionsEdited,\n userAvatar: this.state.userPermissionsAvatar,\n onSubmit: this.handlePermissionsChanged,\n onCancel: this.handleHidePermissionsEditor\n }) : react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"div\", {\n id: \"info-view-content\",\n className: \"scrollable-panel\"\n }, react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"div\", {\n className: \"panel-form-row\"\n }, react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"div\", {\n className: \"panel-form-column\"\n }, react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"div\", null, react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"label\", {\n className: \"small\"\n }, \"Name\")), react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"div\", null, react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_widgets_in_place_edit_jsx__WEBPACK_IMPORTED_MODULE_4__[\"default\"], {\n placeholder: this.state.groupTopic ? \"Group name\" : react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"i\", null, \"Unknown\"),\n readOnly: !this.state.owner,\n value: this.state.fullName,\n onFinished: this.handleFullNameUpdate\n })), react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"div\", null, react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"label\", {\n className: \"small\"\n }, \"Private comment\")), react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"div\", null, react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_widgets_in_place_edit_jsx__WEBPACK_IMPORTED_MODULE_4__[\"default\"], {\n placeholder: \"Visible to you only\",\n value: this.state.private,\n onFinished: this.handlePrivateUpdate\n }))), react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_widgets_avatar_upload_jsx__WEBPACK_IMPORTED_MODULE_1__[\"default\"], {\n avatar: this.state.avatar,\n readOnly: !this.state.owner,\n uid: this.props.topic,\n title: this.state.fullName,\n onImageChanged: this.handleImageChanged,\n onError: this.props.onError\n })), react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"div\", {\n className: \"hr\"\n }), react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"div\", {\n className: \"panel-form-column\"\n }, react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"div\", {\n className: \"panel-form-row\"\n }, react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"label\", null, \"Muted:\"), react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(CheckBox, {\n name: \"P\",\n checked: this.state.muted,\n onChange: this.handleMuted\n })), react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_widgets_more_button_jsx__WEBPACK_IMPORTED_MODULE_6__[\"default\"], {\n title: \"More\",\n open: this.state.moreInfoExpanded,\n onToggle: this.handleMoreInfo\n }), this.state.moreInfoExpanded ? react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"div\", {\n className: \"panel-form-column\"\n }, react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"div\", {\n className: \"panel-form-row\"\n }, react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"label\", null, \"Address:\"), react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"tt\", null, this.state.address)), this.state.groupTopic ? react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"div\", {\n className: \"panel-form-row\"\n }, react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"label\", null, \"Your permissions:\"), react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"tt\", {\n className: \"clickable\",\n onClick: this.handleLaunchPermissionsEditor.bind(this, 'want')\n }, this.state.access)) : react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"div\", null, react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"div\", null, react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"label\", {\n className: \"small\"\n }, \"Permissions:\")), react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"div\", {\n className: \"quoted\"\n }, react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"div\", null, \"Yours: \\xA0\", react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"tt\", {\n className: \"clickable\",\n onClick: this.handleLaunchPermissionsEditor.bind(this, 'want')\n }, this.state.access)), react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"div\", null, this.state.fullName ? this.state.fullName : \"Other\", \"\\u2032s: \\xA0\", react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"tt\", {\n className: \"clickable\",\n onClick: this.handleLaunchPermissionsEditor.bind(this, 'given')\n }, this.state.modeGiven2)))), this.state.sharer && (this.state.auth || this.state.anon) ? react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"div\", null, react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"div\", null, react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"label\", {\n className: \"small\"\n }, \"Default access mode:\")), react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"div\", {\n className: \"quoted\"\n }, react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"div\", null, \"Auth: \", this.state.admin ? react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"tt\", {\n className: \"clickable\",\n onClick: this.handleLaunchPermissionsEditor.bind(this, 'auth')\n }, this.state.auth) : react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"tt\", null, this.state.auth)), react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"div\", null, \"Anon: \", this.state.admin ? react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"tt\", {\n className: \"clickable\",\n onClick: this.handleLaunchPermissionsEditor.bind(this, 'anon')\n }, this.state.anon) : react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"tt\", null, this.state.anon)))) : null) : null), react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"div\", {\n className: \"hr\"\n }), this.state.owner ? react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_widgets_tag_manager_jsx__WEBPACK_IMPORTED_MODULE_8__[\"default\"], {\n title: \"Tags\",\n tags: this.state.tags,\n activated: false,\n onSubmit: this.handleTagsUpdated\n }) : null, this.state.owner ? react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"div\", {\n className: \"hr\"\n }) : null, this.state.groupTopic ? react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"div\", {\n className: \"panel-form-column\"\n }, react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"div\", {\n className: \"panel-form-row\"\n }, react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"label\", {\n className: \"small\"\n }, \"Group members:\")), react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"div\", {\n className: \"panel-form-row\"\n }, this.state.sharer ? react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"a\", {\n href: \"javascript:;\",\n className: \"flat-button\",\n onClick: this.handleShowAddMembers\n }, react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"i\", {\n className: \"material-icons\"\n }, \"person_add\"), \" Add members\") : null, !this.state.owner ? react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"a\", {\n href: \"javascript:;\",\n className: \"red flat-button\",\n onClick: this.handleLeave\n }, react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"i\", {\n className: \"material-icons\"\n }, \"exit_to_app\"), \" Leave\") : null), react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_widgets_contact_list_jsx__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n contacts: this.state.contactList,\n myUserId: this.props.myUserId,\n emptyListMessage: \"No members\",\n topicSelected: this.state.selectedContact,\n showOnline: false,\n showUnread: false,\n showMode: true,\n noScroll: true,\n onTopicSelected: this.handleMemberSelected,\n showContextMenu: this.state.admin ? this.handleContextMenu : false\n })) : react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"div\", {\n className: \"panel-form-row\"\n }, react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"a\", {\n href: \"javascript:;\",\n className: \"red flat-button\",\n onClick: this.handleLeave\n }, react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"i\", {\n className: \"material-icons\"\n }, \"exit_to_app\"), \" Leave\"))));\n }\n }]);\n\n return InfoView;\n}(react__WEBPACK_IMPORTED_MODULE_0___default.a.Component);\n\n\n;\n\n//# sourceURL=webpack:///./src/views/info-view.jsx?"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return InfoView; });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _widgets_avatar_upload_jsx__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../widgets/avatar-upload.jsx */ \"./src/widgets/avatar-upload.jsx\");\n/* harmony import */ var _widgets_checkbox_jsx__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../widgets/checkbox.jsx */ \"./src/widgets/checkbox.jsx\");\n/* harmony import */ var _widgets_contact_list_jsx__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../widgets/contact-list.jsx */ \"./src/widgets/contact-list.jsx\");\n/* harmony import */ var _widgets_group_manager_jsx__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../widgets/group-manager.jsx */ \"./src/widgets/group-manager.jsx\");\n/* harmony import */ var _widgets_in_place_edit_jsx__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../widgets/in-place-edit.jsx */ \"./src/widgets/in-place-edit.jsx\");\n/* harmony import */ var _widgets_menu_cancel_jsx__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../widgets/menu-cancel.jsx */ \"./src/widgets/menu-cancel.jsx\");\n/* harmony import */ var _widgets_more_button_jsx__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../widgets/more-button.jsx */ \"./src/widgets/more-button.jsx\");\n/* harmony import */ var _widgets_permissions_editor_jsx__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../widgets/permissions-editor.jsx */ \"./src/widgets/permissions-editor.jsx\");\n/* harmony import */ var _widgets_tag_manager_jsx__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../widgets/tag-manager.jsx */ \"./src/widgets/tag-manager.jsx\");\n/* harmony import */ var _lib_blob_helpers_js__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../lib/blob-helpers.js */ \"./src/lib/blob-helpers.js\");\nfunction _typeof(obj) { if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; } return _typeof(obj); }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }\n\nfunction _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === \"object\" || typeof call === \"function\")) { return call; } return _assertThisInitialized(self); }\n\nfunction _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function\"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); }\n\nfunction _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }\n\nfunction _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return self; }\n\n\n\n\n\n\n\n\n\n\n\n\n\nvar InfoView = function (_React$Component) {\n _inherits(InfoView, _React$Component);\n\n function InfoView(props) {\n var _this;\n\n _classCallCheck(this, InfoView);\n\n _this = _possibleConstructorReturn(this, _getPrototypeOf(InfoView).call(this, props));\n _this.state = {\n topic: null,\n owner: false,\n admin: false,\n sharer: false,\n muted: false,\n address: null,\n groupTopic: undefined,\n fullName: undefined,\n avatar: null,\n private: null,\n selectedContact: null,\n access: null,\n modeGiven: null,\n modeWant: null,\n modeGiven2: null,\n modeWant2: null,\n auth: null,\n anon: null,\n contactList: [],\n tags: [],\n showMemberPanel: false,\n showPermissionEditorFor: undefined,\n moreInfoExpanded: false,\n previousMetaDesc: undefined,\n previousSubsUpdated: undefined,\n previousTagsUpdated: undefined\n };\n _this.resetSubs = _this.resetSubs.bind(_assertThisInitialized(_assertThisInitialized(_this)));\n _this.resetDesc = _this.resetDesc.bind(_assertThisInitialized(_assertThisInitialized(_this)));\n _this.onMetaDesc = _this.onMetaDesc.bind(_assertThisInitialized(_assertThisInitialized(_this)));\n _this.onSubsUpdated = _this.onSubsUpdated.bind(_assertThisInitialized(_assertThisInitialized(_this)));\n _this.onTagsUpdated = _this.onTagsUpdated.bind(_assertThisInitialized(_assertThisInitialized(_this)));\n _this.handleFullNameUpdate = _this.handleFullNameUpdate.bind(_assertThisInitialized(_assertThisInitialized(_this)));\n _this.handlePrivateUpdate = _this.handlePrivateUpdate.bind(_assertThisInitialized(_assertThisInitialized(_this)));\n _this.handleImageChanged = _this.handleImageChanged.bind(_assertThisInitialized(_assertThisInitialized(_this)));\n _this.handleMuted = _this.handleMuted.bind(_assertThisInitialized(_assertThisInitialized(_this)));\n _this.handlePermissionsChanged = _this.handlePermissionsChanged.bind(_assertThisInitialized(_assertThisInitialized(_this)));\n _this.handleLaunchPermissionsEditor = _this.handleLaunchPermissionsEditor.bind(_assertThisInitialized(_assertThisInitialized(_this)));\n _this.handleHidePermissionsEditor = _this.handleHidePermissionsEditor.bind(_assertThisInitialized(_assertThisInitialized(_this)));\n _this.handleShowAddMembers = _this.handleShowAddMembers.bind(_assertThisInitialized(_assertThisInitialized(_this)));\n _this.handleHideAddMembers = _this.handleHideAddMembers.bind(_assertThisInitialized(_assertThisInitialized(_this)));\n _this.handleMemberUpdateRequest = _this.handleMemberUpdateRequest.bind(_assertThisInitialized(_assertThisInitialized(_this)));\n _this.handleLeave = _this.handleLeave.bind(_assertThisInitialized(_assertThisInitialized(_this)));\n _this.handleMemberSelected = _this.handleMemberSelected.bind(_assertThisInitialized(_assertThisInitialized(_this)));\n _this.handleMoreInfo = _this.handleMoreInfo.bind(_assertThisInitialized(_assertThisInitialized(_this)));\n _this.handleTagsUpdated = _this.handleTagsUpdated.bind(_assertThisInitialized(_assertThisInitialized(_this)));\n _this.handleContextMenu = _this.handleContextMenu.bind(_assertThisInitialized(_assertThisInitialized(_this)));\n return _this;\n }\n\n _createClass(InfoView, [{\n key: \"UNSAFE_componentWillReceiveProps\",\n value: function UNSAFE_componentWillReceiveProps(props) {\n var topic = this.props.tinode.getTopic(props.topic);\n\n if (!topic) {\n return;\n }\n\n if (this.onMetaDesc != topic.onMetaDesc) {\n this.previousMetaDesc = topic.onMetaDesc;\n topic.onMetaDesc = this.onMetaDesc;\n this.previousSubsUpdated = topic.onSubsUpdated;\n topic.onSubsUpdated = this.onSubsUpdated;\n\n if (topic.getType() == 'grp') {\n this.previousTagsUpdated = topic.onTagsUpdated;\n topic.onTagsUpdated = this.onTagsUpdated;\n } else {\n this.previousTagsUpdated = undefined;\n }\n }\n\n if (this.state.topic != props.topic) {\n this.setState({\n topic: props.topic\n });\n this.resetDesc(topic, props);\n this.resetSubs(topic, props);\n }\n }\n }, {\n key: \"componentWillUnmount\",\n value: function componentWillUnmount() {\n var topic = this.props.tinode.getTopic(this.props.topic);\n\n if (!topic) {\n return;\n }\n\n this.setState({\n topic: null\n });\n topic.onMetaDesc = this.previousMetaDesc;\n topic.onSubsUpdated = this.previousSubsUpdated;\n topic.onTagsUpdated = this.previousTagsUpdated;\n }\n }, {\n key: \"resetSubs\",\n value: function resetSubs(topic, props) {\n var newState = {\n contactList: []\n };\n\n if (topic.getType() == 'p2p') {\n var user2 = topic.subscriber(props.topic);\n\n if (user2) {\n newState.modeGiven2 = user2.acs.getGiven();\n newState.modeWant2 = user2.acs.getWant();\n }\n } else {\n topic.subscribers(function (sub) {\n newState.contactList.push(sub);\n }, this);\n }\n\n this.setState(newState);\n }\n }, {\n key: \"resetDesc\",\n value: function resetDesc(topic, props) {\n var defacs = topic.getDefaultAccess() || {};\n var acs = topic.getAccessMode();\n this.setState({\n owner: acs && acs.isOwner(),\n admin: acs && acs.isAdmin(),\n sharer: acs && (acs.isAdmin() || acs.isSharer()),\n muted: acs && acs.isMuted(),\n fullName: topic.public ? topic.public.fn : undefined,\n avatar: Object(_lib_blob_helpers_js__WEBPACK_IMPORTED_MODULE_10__[\"makeImageUrl\"])(topic.public ? topic.public.photo : null),\n private: topic.private ? topic.private.comment : null,\n address: topic.name,\n groupTopic: topic.getType() == 'grp',\n showMemberPanel: false,\n access: acs ? acs.getMode() : undefined,\n modeGiven: acs ? acs.getGiven() : undefined,\n modeWant: acs ? acs.getWant() : undefined,\n auth: defacs.auth,\n anon: defacs.anon\n });\n\n if (topic.getType() == 'grp' && acs && acs.isOwner()) {\n topic.getMeta(topic.startMetaQuery().withTags().build());\n }\n }\n }, {\n key: \"onMetaDesc\",\n value: function onMetaDesc(desc) {\n var topic = this.props.tinode.getTopic(this.props.topic);\n\n if (!topic) {\n return;\n }\n\n this.resetDesc(topic, this.props);\n\n if (this.previousMetaDesc && this.previousMetaDesc != this.onMetaDesc) {\n this.previousMetaDesc(desc);\n }\n }\n }, {\n key: \"onSubsUpdated\",\n value: function onSubsUpdated() {\n var topic = this.props.tinode.getTopic(this.props.topic);\n\n if (!topic) {\n return;\n }\n\n this.resetSubs(topic, this.props);\n\n if (this.previousSubsUpdated && this.previousSubsUpdated != this.onSubsUpdated) {\n this.previousSubsUpdated();\n }\n }\n }, {\n key: \"onTagsUpdated\",\n value: function onTagsUpdated(tags) {\n this.setState({\n tags: tags\n });\n\n if (this.previousTagsUpdated && this.previousTagsUpdated != this.onTagsUpdated) {\n this.previousTagsUpdated();\n }\n }\n }, {\n key: \"handleFullNameUpdate\",\n value: function handleFullNameUpdate(fn) {\n if (this.state.fullName !== fn) {\n this.setState({\n fullName: fn\n });\n this.props.onTopicDescUpdate(this.props.topic, vcard(fn, this.state.avatar), null);\n }\n }\n }, {\n key: \"handlePrivateUpdate\",\n value: function handlePrivateUpdate(priv) {\n if (this.state.priv !== priv) {\n this.setState({\n private: priv\n });\n this.props.onTopicDescUpdate(this.props.topic, null, priv);\n }\n }\n }, {\n key: \"handleImageChanged\",\n value: function handleImageChanged(img) {\n this.setState({\n avatar: img\n });\n this.props.onTopicDescUpdate(this.props.topic, vcard(this.state.fullName, img), null);\n }\n }, {\n key: \"handleMuted\",\n value: function handleMuted(ignored, checked) {\n this.setState({\n muted: checked\n });\n this.props.onChangePermissions(this.props.topic, checked ? '-P' : '+P');\n }\n }, {\n key: \"handlePermissionsChanged\",\n value: function handlePermissionsChanged(perm) {\n switch (this.state.showPermissionEditorFor) {\n case 'auth':\n this.props.onTopicDescUpdate(this.props.topic, null, null, {\n auth: perm\n });\n break;\n\n case 'anon':\n this.props.onTopicDescUpdate(this.props.topic, null, null, {\n anon: perm\n });\n break;\n\n case 'mode':\n case 'want':\n this.props.onChangePermissions(this.props.topic, perm);\n break;\n\n case 'given':\n this.props.onChangePermissions(this.props.topic, perm, this.props.topic);\n break;\n\n case 'user':\n this.props.onChangePermissions(this.props.topic, perm, this.state.userPermissionsEdited);\n break;\n }\n\n this.setState({\n showPermissionEditorFor: undefined\n });\n }\n }, {\n key: \"handleLaunchPermissionsEditor\",\n value: function handleLaunchPermissionsEditor(which, uid) {\n var toEdit, toCompare, toSkip, titleEdit, titleCompare, userTitle, userAvatar;\n\n switch (which) {\n case 'mode':\n toEdit = this.state.access;\n break;\n\n case 'want':\n toEdit = this.state.modeWant;\n toCompare = this.state.modeGiven;\n toSkip = this.state.groupTopic ? 'O' : 'ASDO';\n titleEdit = \"Requested\";\n titleCompare = \"Granted\";\n break;\n\n case 'given':\n toEdit = this.state.modeGiven2;\n toCompare = this.state.modeWant2;\n toSkip = this.state.groupTopic ? this.state.owner ? '' : 'O' : 'ASDO';\n titleEdit = \"Granted\";\n titleCompare = \"Requested\";\n break;\n\n case 'auth':\n toEdit = this.state.auth;\n toSkip = 'O';\n break;\n\n case 'anon':\n toEdit = this.state.anon;\n toSkip = 'O';\n break;\n\n case 'user':\n {\n var topic = this.props.tinode.getTopic(this.props.topic);\n\n if (!topic) {\n return;\n }\n\n var user = topic.subscriber(uid);\n\n if (!user || !user.acs) {\n return;\n }\n\n toEdit = user.acs.getGiven();\n toCompare = user.acs.getWant();\n toSkip = this.state.owner ? '' : 'O';\n titleEdit = \"Granted\";\n titleCompare = \"Requested\";\n\n if (user.public) {\n userTitle = user.public.fn;\n userAvatar = user.public.photo;\n }\n\n break;\n }\n\n default:\n console.log(\"Unknown permission editing mode '\" + which + \"'\");\n break;\n }\n\n this.setState({\n showPermissionEditorFor: which,\n userPermissionsEdited: uid,\n userPermissionsTitle: userTitle,\n userPermissionsAvatar: userAvatar,\n editedPermissions: toEdit,\n immutablePermissions: toCompare,\n editedPermissionsTitle: titleEdit,\n immutablePermissionsTitle: titleCompare,\n editedPermissionsSkipped: toSkip\n });\n }\n }, {\n key: \"handleHidePermissionsEditor\",\n value: function handleHidePermissionsEditor() {\n this.setState({\n showPermissionEditorFor: undefined\n });\n }\n }, {\n key: \"handleShowAddMembers\",\n value: function handleShowAddMembers() {\n this.props.onInitFind();\n this.setState({\n showMemberPanel: true\n });\n }\n }, {\n key: \"handleHideAddMembers\",\n value: function handleHideAddMembers() {\n this.setState({\n showMemberPanel: false\n });\n }\n }, {\n key: \"handleMemberUpdateRequest\",\n value: function handleMemberUpdateRequest(members, added, removed) {\n this.props.onMemberUpdateRequest(this.props.topic, added, removed);\n this.setState({\n showMemberPanel: false\n });\n }\n }, {\n key: \"handleLeave\",\n value: function handleLeave() {\n this.props.onLeaveTopic(this.props.topic);\n }\n }, {\n key: \"handleMemberSelected\",\n value: function handleMemberSelected(uid) {\n this.setState({\n selectedContact: uid\n });\n }\n }, {\n key: \"handleMoreInfo\",\n value: function handleMoreInfo(open) {\n this.setState({\n moreInfoExpanded: open\n });\n }\n }, {\n key: \"handleTagsUpdated\",\n value: function handleTagsUpdated(tags) {\n if (!arrayEqual(this.state.tags.slice(0), tags.slice(0))) {\n this.props.onTopicTagsUpdate(this.props.topic, tags);\n }\n }\n }, {\n key: \"handleContextMenu\",\n value: function handleContextMenu(params) {\n var instance = this;\n var topic = this.props.tinode.getTopic(this.props.topic);\n\n if (!topic) {\n return;\n }\n\n var user = topic.subscriber(params.topicName);\n\n if (!user || !user.acs) {\n return;\n }\n\n var menuItems = [{\n title: \"Edit permissions\",\n handler: function handler() {\n instance.handleLaunchPermissionsEditor('user', params.topicName);\n }\n }, 'member_delete', user.acs.isMuted() ? 'member_unmute' : 'member_mute', user.acs.isJoiner() ? 'member_block' : 'member_unblock'];\n this.props.showContextMenu({\n topicName: this.props.topic,\n x: params.x,\n y: params.y,\n user: params.topicName\n }, menuItems);\n }\n }, {\n key: \"render\",\n value: function render() {\n return react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"div\", {\n id: \"info-view\"\n }, react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"div\", {\n className: \"caption-panel\",\n id: \"info-caption-panel\"\n }, react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"div\", {\n className: \"panel-title\",\n id: \"info-title\"\n }, \"Info\"), react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"div\", null, react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_widgets_menu_cancel_jsx__WEBPACK_IMPORTED_MODULE_6__[\"default\"], {\n onCancel: this.props.onCancel\n }))), this.props.displayMobile ? react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(ErrorPanel, {\n level: this.props.errorLevel,\n text: this.props.errorText,\n onClearError: this.props.onError\n }) : null, this.state.showMemberPanel ? react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_widgets_group_manager_jsx__WEBPACK_IMPORTED_MODULE_4__[\"default\"], {\n members: this.state.contactList,\n requiredMember: this.props.myUserId,\n myUserId: this.props.myUserId,\n contacts: this.props.searchableContacts,\n onCancel: this.handleHideAddMembers,\n onSubmit: this.handleMemberUpdateRequest\n }) : this.state.showPermissionEditorFor ? react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_widgets_permissions_editor_jsx__WEBPACK_IMPORTED_MODULE_8__[\"default\"], {\n mode: this.state.editedPermissions,\n compare: this.state.immutablePermissions,\n skip: this.state.editedPermissionsSkipped,\n modeTitle: this.state.editedPermissionsTitle,\n compareTitle: this.state.immutablePermissionsTitle,\n userTitle: this.state.userPermissionsTitle,\n item: this.state.userPermissionsEdited,\n userAvatar: this.state.userPermissionsAvatar,\n onSubmit: this.handlePermissionsChanged,\n onCancel: this.handleHidePermissionsEditor\n }) : react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"div\", {\n id: \"info-view-content\",\n className: \"scrollable-panel\"\n }, react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"div\", {\n className: \"panel-form-row\"\n }, react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"div\", {\n className: \"panel-form-column\"\n }, react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"div\", null, react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"label\", {\n className: \"small\"\n }, \"Name\")), react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"div\", null, react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_widgets_in_place_edit_jsx__WEBPACK_IMPORTED_MODULE_5__[\"default\"], {\n placeholder: this.state.groupTopic ? \"Group name\" : react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"i\", null, \"Unknown\"),\n readOnly: !this.state.owner,\n value: this.state.fullName,\n onFinished: this.handleFullNameUpdate\n })), react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"div\", null, react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"label\", {\n className: \"small\"\n }, \"Private comment\")), react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"div\", null, react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_widgets_in_place_edit_jsx__WEBPACK_IMPORTED_MODULE_5__[\"default\"], {\n placeholder: \"Visible to you only\",\n value: this.state.private,\n onFinished: this.handlePrivateUpdate\n }))), react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_widgets_avatar_upload_jsx__WEBPACK_IMPORTED_MODULE_1__[\"default\"], {\n avatar: this.state.avatar,\n readOnly: !this.state.owner,\n uid: this.props.topic,\n title: this.state.fullName,\n onImageChanged: this.handleImageChanged,\n onError: this.props.onError\n })), react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"div\", {\n className: \"hr\"\n }), react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"div\", {\n className: \"panel-form-column\"\n }, react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"div\", {\n className: \"panel-form-row\"\n }, react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"label\", null, \"Muted:\"), react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_widgets_checkbox_jsx__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n name: \"P\",\n checked: this.state.muted,\n onChange: this.handleMuted\n })), react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_widgets_more_button_jsx__WEBPACK_IMPORTED_MODULE_7__[\"default\"], {\n title: \"More\",\n open: this.state.moreInfoExpanded,\n onToggle: this.handleMoreInfo\n }), this.state.moreInfoExpanded ? react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"div\", {\n className: \"panel-form-column\"\n }, react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"div\", {\n className: \"panel-form-row\"\n }, react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"label\", null, \"Address:\"), react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"tt\", null, this.state.address)), this.state.groupTopic ? react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"div\", {\n className: \"panel-form-row\"\n }, react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"label\", null, \"Your permissions:\"), react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"tt\", {\n className: \"clickable\",\n onClick: this.handleLaunchPermissionsEditor.bind(this, 'want')\n }, this.state.access)) : react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"div\", null, react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"div\", null, react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"label\", {\n className: \"small\"\n }, \"Permissions:\")), react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"div\", {\n className: \"quoted\"\n }, react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"div\", null, \"Yours: \\xA0\", react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"tt\", {\n className: \"clickable\",\n onClick: this.handleLaunchPermissionsEditor.bind(this, 'want')\n }, this.state.access)), react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"div\", null, this.state.fullName ? this.state.fullName : \"Other\", \"\\u2032s: \\xA0\", react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"tt\", {\n className: \"clickable\",\n onClick: this.handleLaunchPermissionsEditor.bind(this, 'given')\n }, this.state.modeGiven2)))), this.state.sharer && (this.state.auth || this.state.anon) ? react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"div\", null, react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"div\", null, react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"label\", {\n className: \"small\"\n }, \"Default access mode:\")), react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"div\", {\n className: \"quoted\"\n }, react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"div\", null, \"Auth: \", this.state.admin ? react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"tt\", {\n className: \"clickable\",\n onClick: this.handleLaunchPermissionsEditor.bind(this, 'auth')\n }, this.state.auth) : react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"tt\", null, this.state.auth)), react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"div\", null, \"Anon: \", this.state.admin ? react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"tt\", {\n className: \"clickable\",\n onClick: this.handleLaunchPermissionsEditor.bind(this, 'anon')\n }, this.state.anon) : react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"tt\", null, this.state.anon)))) : null) : null), react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"div\", {\n className: \"hr\"\n }), this.state.owner ? react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_widgets_tag_manager_jsx__WEBPACK_IMPORTED_MODULE_9__[\"default\"], {\n title: \"Tags\",\n tags: this.state.tags,\n activated: false,\n onSubmit: this.handleTagsUpdated\n }) : null, this.state.owner ? react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"div\", {\n className: \"hr\"\n }) : null, this.state.groupTopic ? react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"div\", {\n className: \"panel-form-column\"\n }, react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"div\", {\n className: \"panel-form-row\"\n }, react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"label\", {\n className: \"small\"\n }, \"Group members:\")), react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"div\", {\n className: \"panel-form-row\"\n }, this.state.sharer ? react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"a\", {\n href: \"javascript:;\",\n className: \"flat-button\",\n onClick: this.handleShowAddMembers\n }, react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"i\", {\n className: \"material-icons\"\n }, \"person_add\"), \" Add members\") : null, !this.state.owner ? react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"a\", {\n href: \"javascript:;\",\n className: \"red flat-button\",\n onClick: this.handleLeave\n }, react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"i\", {\n className: \"material-icons\"\n }, \"exit_to_app\"), \" Leave\") : null), react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_widgets_contact_list_jsx__WEBPACK_IMPORTED_MODULE_3__[\"default\"], {\n contacts: this.state.contactList,\n myUserId: this.props.myUserId,\n emptyListMessage: \"No members\",\n topicSelected: this.state.selectedContact,\n showOnline: false,\n showUnread: false,\n showMode: true,\n noScroll: true,\n onTopicSelected: this.handleMemberSelected,\n showContextMenu: this.state.admin ? this.handleContextMenu : false\n })) : react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"div\", {\n className: \"panel-form-row\"\n }, react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"a\", {\n href: \"javascript:;\",\n className: \"red flat-button\",\n onClick: this.handleLeave\n }, react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"i\", {\n className: \"material-icons\"\n }, \"exit_to_app\"), \" Leave\"))));\n }\n }]);\n\n return InfoView;\n}(react__WEBPACK_IMPORTED_MODULE_0___default.a.Component);\n\n\n;\n\n//# sourceURL=webpack:///./src/views/info-view.jsx?"); /***/ }), @@ -875,7 +875,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var reac /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return NewTopicView; });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var react_intl__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react-intl */ \"./node_modules/react-intl/lib/index.es.js\");\n/* harmony import */ var _widgets_contact_list_jsx__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../widgets/contact-list.jsx */ \"./src/widgets/contact-list.jsx\");\n/* harmony import */ var _widgets_new_topic_by_id_jsx__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../widgets/new-topic-by-id.jsx */ \"./src/widgets/new-topic-by-id.jsx\");\n/* harmony import */ var _widgets_new_topic_group_jsx__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../widgets/new-topic-group.jsx */ \"./src/widgets/new-topic-group.jsx\");\n/* harmony import */ var _widgets_search_contacts_jsx__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../widgets/search-contacts.jsx */ \"./src/widgets/search-contacts.jsx\");\n/* harmony import */ var _lib_navigation_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../lib/navigation.js */ \"./src/lib/navigation.js\");\nfunction _typeof(obj) { if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; } return _typeof(obj); }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }\n\nfunction _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === \"object\" || typeof call === \"function\")) { return call; } return _assertThisInitialized(self); }\n\nfunction _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function\"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); }\n\nfunction _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }\n\nfunction _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return self; }\n\n\n\n\n\n\n\n\n\nvar NewTopicView = function (_React$Component) {\n _inherits(NewTopicView, _React$Component);\n\n function NewTopicView(props) {\n var _this;\n\n _classCallCheck(this, NewTopicView);\n\n _this = _possibleConstructorReturn(this, _getPrototypeOf(NewTopicView).call(this, props));\n _this.state = {\n tabSelected: 'p2p',\n contactList: props.searchResults\n };\n _this.handleTabClick = _this.handleTabClick.bind(_assertThisInitialized(_assertThisInitialized(_this)));\n _this.handleContactSelected = _this.handleContactSelected.bind(_assertThisInitialized(_assertThisInitialized(_this)));\n _this.handleNewGroupSubmit = _this.handleNewGroupSubmit.bind(_assertThisInitialized(_assertThisInitialized(_this)));\n _this.handleGroupByID = _this.handleGroupByID.bind(_assertThisInitialized(_assertThisInitialized(_this)));\n return _this;\n }\n\n _createClass(NewTopicView, [{\n key: \"componentDidMount\",\n value: function componentDidMount() {\n this.props.onInitFind();\n }\n }, {\n key: \"handleTabClick\",\n value: function handleTabClick(e) {\n e.preventDefault();\n _lib_navigation_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].navigateTo(_lib_navigation_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].addUrlParam(window.location.hash, 'tab', e.currentTarget.dataset.id));\n this.setState({\n tabSelected: e.currentTarget.dataset.id\n });\n }\n }, {\n key: \"handleContactSelected\",\n value: function handleContactSelected(sel) {\n if (this.state.tabSelected === 'p2p') {\n _lib_navigation_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].navigateTo(_lib_navigation_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].removeUrlParam(window.location.hash, 'tab'));\n this.props.onCreateTopic(sel, undefined);\n }\n }\n }, {\n key: \"handleNewGroupSubmit\",\n value: function handleNewGroupSubmit(name, dataUrl, priv, tags) {\n _lib_navigation_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].navigateTo(_lib_navigation_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].removeUrlParam(window.location.hash, 'tab'));\n this.props.onCreateTopic(undefined, vcard(name, dataUrl), priv, tags);\n }\n }, {\n key: \"handleGroupByID\",\n value: function handleGroupByID(topicName) {\n _lib_navigation_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].navigateTo(_lib_navigation_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].removeUrlParam(window.location.hash, 'tab'));\n this.props.onCreateTopic(topicName);\n }\n }, {\n key: \"render\",\n value: function render() {\n return react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"div\", {\n className: \"flex-column\"\n }, react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"ul\", {\n className: \"tabbar\"\n }, react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"li\", {\n className: this.state.tabSelected === \"p2p\" ? \"active\" : null\n }, react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"a\", {\n href: \"javascript:;\",\n \"data-id\": \"p2p\",\n onClick: this.handleTabClick\n }, react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_1__[\"FormattedMessage\"], {\n id: \"tabtitle_find_user\",\n defaultMessage: \"find\"\n }))), react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"li\", {\n className: this.state.tabSelected === \"grp\" ? \"active\" : null\n }, react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"a\", {\n href: \"javascript:;\",\n \"data-id\": \"grp\",\n onClick: this.handleTabClick\n }, react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_1__[\"FormattedMessage\"], {\n id: \"tabtitle_new_group\",\n defaultMessage: \"new group\"\n }))), react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"li\", {\n className: this.state.tabSelected === \"byid\" ? \"active\" : null\n }, react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"a\", {\n href: \"javascript:;\",\n \"data-id\": \"byid\",\n onClick: this.handleTabClick\n }, react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_1__[\"FormattedMessage\"], {\n id: \"tabtitle_group_by_id\",\n defaultMessage: \"by id\"\n })))), this.state.tabSelected === 'grp' ? react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_widgets_new_topic_group_jsx__WEBPACK_IMPORTED_MODULE_4__[\"default\"], {\n onSubmit: this.handleNewGroupSubmit\n }) : this.state.tabSelected === 'byid' ? react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_widgets_new_topic_by_id_jsx__WEBPACK_IMPORTED_MODULE_3__[\"default\"], {\n onSubmit: this.handleGroupByID,\n onError: this.props.onError\n }) : react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"div\", {\n className: \"flex-column\"\n }, react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_widgets_search_contacts_jsx__WEBPACK_IMPORTED_MODULE_5__[\"default\"], {\n type: \"p2p\",\n onSearchContacts: this.props.onSearchContacts\n }), react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_widgets_contact_list_jsx__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n contacts: this.state.contactList,\n myUserId: this.props.myUserId,\n emptyListMessage: \"Use search to find contacts\",\n topicSelected: this.state.selectedContact,\n showOnline: false,\n showUnread: false,\n showContextMenu: false,\n onTopicSelected: this.handleContactSelected\n })));\n }\n }], [{\n key: \"getDerivedStateFromProps\",\n value: function getDerivedStateFromProps(nextProps, prevState) {\n return {\n contactList: nextProps.searchResults\n };\n }\n }]);\n\n return NewTopicView;\n}(react__WEBPACK_IMPORTED_MODULE_0___default.a.Component);\n\n\n;\n\n//# sourceURL=webpack:///./src/views/new-topic-view.jsx?"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return NewTopicView; });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var react_intl__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react-intl */ \"./node_modules/react-intl/lib/index.es.js\");\n/* harmony import */ var _widgets_contact_list_jsx__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../widgets/contact-list.jsx */ \"./src/widgets/contact-list.jsx\");\n/* harmony import */ var _widgets_new_topic_by_id_jsx__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../widgets/new-topic-by-id.jsx */ \"./src/widgets/new-topic-by-id.jsx\");\n/* harmony import */ var _widgets_new_topic_group_jsx__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../widgets/new-topic-group.jsx */ \"./src/widgets/new-topic-group.jsx\");\n/* harmony import */ var _widgets_search_contacts_jsx__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../widgets/search-contacts.jsx */ \"./src/widgets/search-contacts.jsx\");\n/* harmony import */ var _lib_navigation_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../lib/navigation.js */ \"./src/lib/navigation.js\");\nfunction _typeof(obj) { if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; } return _typeof(obj); }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }\n\nfunction _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === \"object\" || typeof call === \"function\")) { return call; } return _assertThisInitialized(self); }\n\nfunction _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function\"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); }\n\nfunction _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }\n\nfunction _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return self; }\n\n\n\n\n\n\n\n\n\nvar NewTopicView = function (_React$Component) {\n _inherits(NewTopicView, _React$Component);\n\n function NewTopicView(props) {\n var _this;\n\n _classCallCheck(this, NewTopicView);\n\n _this = _possibleConstructorReturn(this, _getPrototypeOf(NewTopicView).call(this, props));\n _this.state = {\n tabSelected: 'p2p',\n contactList: props.searchResults\n };\n _this.handleTabClick = _this.handleTabClick.bind(_assertThisInitialized(_assertThisInitialized(_this)));\n _this.handleContactSelected = _this.handleContactSelected.bind(_assertThisInitialized(_assertThisInitialized(_this)));\n _this.handleNewGroupSubmit = _this.handleNewGroupSubmit.bind(_assertThisInitialized(_assertThisInitialized(_this)));\n _this.handleGroupByID = _this.handleGroupByID.bind(_assertThisInitialized(_assertThisInitialized(_this)));\n return _this;\n }\n\n _createClass(NewTopicView, [{\n key: \"componentDidMount\",\n value: function componentDidMount() {\n this.props.onInitFind();\n }\n }, {\n key: \"handleTabClick\",\n value: function handleTabClick(e) {\n e.preventDefault();\n _lib_navigation_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].navigateTo(_lib_navigation_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].addUrlParam(window.location.hash, 'tab', e.currentTarget.dataset.id));\n this.setState({\n tabSelected: e.currentTarget.dataset.id\n });\n }\n }, {\n key: \"handleContactSelected\",\n value: function handleContactSelected(sel) {\n if (this.state.tabSelected === 'p2p') {\n _lib_navigation_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].navigateTo(_lib_navigation_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].removeUrlParam(window.location.hash, 'tab'));\n this.props.onCreateTopic(sel, undefined);\n }\n }\n }, {\n key: \"handleNewGroupSubmit\",\n value: function handleNewGroupSubmit(name, dataUrl, priv, tags) {\n _lib_navigation_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].navigateTo(_lib_navigation_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].removeUrlParam(window.location.hash, 'tab'));\n this.props.onCreateTopic(undefined, vcard(name, dataUrl), priv, tags);\n }\n }, {\n key: \"handleGroupByID\",\n value: function handleGroupByID(topicName) {\n _lib_navigation_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].navigateTo(_lib_navigation_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].removeUrlParam(window.location.hash, 'tab'));\n this.props.onCreateTopic(topicName);\n }\n }, {\n key: \"render\",\n value: function render() {\n var _this2 = this;\n\n return react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"div\", {\n className: \"flex-column\"\n }, react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"ul\", {\n className: \"tabbar\"\n }, react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"li\", {\n className: this.state.tabSelected === \"p2p\" ? \"active\" : null\n }, react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"a\", {\n href: \"javascript:;\",\n \"data-id\": \"p2p\",\n onClick: this.handleTabClick\n }, react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_1__[\"FormattedMessage\"], {\n id: \"tabtitle_find_user\",\n defaultMessage: \"find\"\n }))), react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"li\", {\n className: this.state.tabSelected === \"grp\" ? \"active\" : null\n }, react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"a\", {\n href: \"javascript:;\",\n \"data-id\": \"grp\",\n onClick: this.handleTabClick\n }, react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_1__[\"FormattedMessage\"], {\n id: \"tabtitle_new_group\",\n defaultMessage: \"new group\"\n }))), react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"li\", {\n className: this.state.tabSelected === \"byid\" ? \"active\" : null\n }, react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"a\", {\n href: \"javascript:;\",\n \"data-id\": \"byid\",\n onClick: this.handleTabClick\n }, react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_1__[\"FormattedMessage\"], {\n id: \"tabtitle_group_by_id\",\n defaultMessage: \"by id\"\n })))), this.state.tabSelected === 'grp' ? react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_widgets_new_topic_group_jsx__WEBPACK_IMPORTED_MODULE_4__[\"default\"], {\n onSubmit: this.handleNewGroupSubmit\n }) : this.state.tabSelected === 'byid' ? react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_widgets_new_topic_by_id_jsx__WEBPACK_IMPORTED_MODULE_3__[\"default\"], {\n onSubmit: this.handleGroupByID,\n onError: this.props.onError\n }) : react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"div\", {\n className: \"flex-column\"\n }, react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_widgets_search_contacts_jsx__WEBPACK_IMPORTED_MODULE_5__[\"default\"], {\n type: \"p2p\",\n onSearchContacts: this.props.onSearchContacts\n }), react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_1__[\"FormattedMessage\"], {\n id: \"search_for_contacts\",\n defaultMessage: \"Use search to find contacts\"\n }, function (search_for_contacts) {\n return react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_widgets_contact_list_jsx__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n contacts: _this2.state.contactList,\n myUserId: _this2.props.myUserId,\n emptyListMessage: search_for_contacts,\n topicSelected: _this2.state.selectedContact,\n showOnline: false,\n showUnread: false,\n showContextMenu: false,\n onTopicSelected: _this2.handleContactSelected\n });\n })));\n }\n }], [{\n key: \"getDerivedStateFromProps\",\n value: function getDerivedStateFromProps(nextProps, prevState) {\n return {\n contactList: nextProps.searchResults\n };\n }\n }]);\n\n return NewTopicView;\n}(react__WEBPACK_IMPORTED_MODULE_0___default.a.Component);\n\n\n;\n\n//# sourceURL=webpack:///./src/views/new-topic-view.jsx?"); /***/ }), @@ -935,7 +935,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) * /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return ValidationView; });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\nfunction _typeof(obj) { if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; } return _typeof(obj); }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }\n\nfunction _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === \"object\" || typeof call === \"function\")) { return call; } return _assertThisInitialized(self); }\n\nfunction _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function\"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); }\n\nfunction _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }\n\nfunction _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return self; }\n\n\n\nvar ValidationView = function (_React$PureComponent) {\n _inherits(ValidationView, _React$PureComponent);\n\n function ValidationView(props) {\n var _this;\n\n _classCallCheck(this, ValidationView);\n\n _this = _possibleConstructorReturn(this, _getPrototypeOf(ValidationView).call(this, props));\n _this.state = {\n code: props.credCode || ''\n };\n _this.handleChange = _this.handleChange.bind(_assertThisInitialized(_assertThisInitialized(_this)));\n _this.handleKeyPress = _this.handleKeyPress.bind(_assertThisInitialized(_assertThisInitialized(_this)));\n _this.handleSubmit = _this.handleSubmit.bind(_assertThisInitialized(_assertThisInitialized(_this)));\n return _this;\n }\n\n _createClass(ValidationView, [{\n key: \"handleChange\",\n value: function handleChange(e) {\n this.setState({\n code: e.target.value\n });\n }\n }, {\n key: \"handleKeyPress\",\n value: function handleKeyPress(e) {\n if (e.key === 'Enter') {\n this.handleSubmit(e);\n }\n }\n }, {\n key: \"handleSubmit\",\n value: function handleSubmit(e) {\n e.preventDefault();\n\n if (this.state.code && this.state.code.trim()) {\n this.props.onSubmit(this.props.credMethod, this.state.code.trim());\n }\n }\n }, {\n key: \"render\",\n value: function render() {\n var methods = {\n 'email': \"email\",\n 'tel': \"phone\"\n };\n var method = methods[this.props.credMethod] || this.props.credMethod;\n return react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"div\", {\n className: \"panel-form\"\n }, react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"div\", {\n className: \"panel-form-row\"\n }, react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"label\", {\n className: \"small\",\n htmlFor: \"enter-confirmation-code\"\n }, \"Enter confirmation code sent to you by \", method, \":\")), react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"div\", {\n className: \"panel-form-row\"\n }, react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"input\", {\n type: \"text\",\n id: \"enter-confirmation-code\",\n placeholder: \"Numbers only\",\n value: this.state.code,\n onChange: this.handleChange,\n onKeyPress: this.handleKeyPress,\n required: true\n })), react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"div\", {\n className: \"dialog-buttons\"\n }, react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"button\", {\n className: \"blue\",\n onClick: this.handleSubmit\n }, \"Confirm\")));\n }\n }]);\n\n return ValidationView;\n}(react__WEBPACK_IMPORTED_MODULE_0___default.a.PureComponent);\n\n\n;\n\n//# sourceURL=webpack:///./src/views/validation-view.jsx?"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var react_intl__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react-intl */ \"./node_modules/react-intl/lib/index.es.js\");\nfunction _typeof(obj) { if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; } return _typeof(obj); }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }\n\nfunction _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === \"object\" || typeof call === \"function\")) { return call; } return _assertThisInitialized(self); }\n\nfunction _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function\"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); }\n\nfunction _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }\n\nfunction _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return self; }\n\n\n\nvar messages = Object(react_intl__WEBPACK_IMPORTED_MODULE_1__[\"defineMessages\"])({\n phone: {\n \"id\": \"phone\",\n \"defaultMessage\": \"phone\"\n },\n email: {\n \"id\": \"email\",\n \"defaultMessage\": \"email\"\n }\n});\n\nvar ValidationView = function (_React$PureComponent) {\n _inherits(ValidationView, _React$PureComponent);\n\n function ValidationView(props) {\n var _this;\n\n _classCallCheck(this, ValidationView);\n\n _this = _possibleConstructorReturn(this, _getPrototypeOf(ValidationView).call(this, props));\n _this.state = {\n code: props.credCode || ''\n };\n _this.handleChange = _this.handleChange.bind(_assertThisInitialized(_assertThisInitialized(_this)));\n _this.handleKeyPress = _this.handleKeyPress.bind(_assertThisInitialized(_assertThisInitialized(_this)));\n _this.handleSubmit = _this.handleSubmit.bind(_assertThisInitialized(_assertThisInitialized(_this)));\n return _this;\n }\n\n _createClass(ValidationView, [{\n key: \"handleChange\",\n value: function handleChange(e) {\n this.setState({\n code: e.target.value\n });\n }\n }, {\n key: \"handleKeyPress\",\n value: function handleKeyPress(e) {\n if (e.key === 'Enter') {\n this.handleSubmit(e);\n }\n }\n }, {\n key: \"handleSubmit\",\n value: function handleSubmit(e) {\n e.preventDefault();\n\n if (this.state.code && this.state.code.trim()) {\n this.props.onSubmit(this.props.credMethod, this.state.code.trim());\n }\n }\n }, {\n key: \"render\",\n value: function render() {\n var _this2 = this;\n\n var formatMessage = this.props.intl.formatMessage;\n var methods = {\n 'email': formatMessage(messages.email),\n 'tel': formatMessage(messages.phone)\n };\n var method = methods[this.props.credMethod] || this.props.credMethod;\n return react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"div\", {\n className: \"panel-form\"\n }, react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"div\", {\n className: \"panel-form-row\"\n }, react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"label\", {\n className: \"small\",\n htmlFor: \"enter-confirmation-code\"\n }, react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_1__[\"FormattedMessage\"], {\n id: \"enter_confirmation_code_prompt\",\n defaultMessage: \"Enter confirmation code sent to you by {method}:\"\n }))), react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"div\", {\n className: \"panel-form-row\"\n }, react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_1__[\"FormattedMessage\"], {\n id: \"numeric_confirmation_code_prompt\",\n defaultMessage: \"Numbers only\"\n }, function (numbers_only) {\n return react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"input\", {\n type: \"text\",\n id: \"enter-confirmation-code\",\n placeholder: numbers_only,\n value: _this2.state.code,\n onChange: _this2.handleChange,\n onKeyPress: _this2.handleKeyPress,\n required: true\n });\n })), react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"div\", {\n className: \"dialog-buttons\"\n }, react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"button\", {\n className: \"blue\",\n onClick: this.handleSubmit\n }, react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_1__[\"FormattedMessage\"], {\n id: \"button_confirm\",\n defaultMessage: \"Confirm\"\n }))));\n }\n }]);\n\n return ValidationView;\n}(react__WEBPACK_IMPORTED_MODULE_0___default.a.PureComponent);\n\n;\n/* harmony default export */ __webpack_exports__[\"default\"] = (Object(react_intl__WEBPACK_IMPORTED_MODULE_1__[\"injectIntl\"])(ValidationView));\n\n//# sourceURL=webpack:///./src/views/validation-view.jsx?"); /***/ }), @@ -971,7 +971,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) * /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return ChatMessage; });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var tinode_sdk__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! tinode-sdk */ \"./node_modules/tinode-sdk/umd/tinode.prod.js\");\n/* harmony import */ var tinode_sdk__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(tinode_sdk__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var _attachment_jsx__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./attachment.jsx */ \"./src/widgets/attachment.jsx\");\n/* harmony import */ var _letter_tile_jsx__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./letter-tile.jsx */ \"./src/widgets/letter-tile.jsx\");\n/* harmony import */ var _received_marker_jsx__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./received-marker.jsx */ \"./src/widgets/received-marker.jsx\");\nfunction _typeof(obj) { if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; } return _typeof(obj); }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }\n\nfunction _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === \"object\" || typeof call === \"function\")) { return call; } return _assertThisInitialized(self); }\n\nfunction _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function\"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); }\n\nfunction _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }\n\nfunction _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return self; }\n\n\n\n\n\n\n\nvar ChatMessage = function (_React$Component) {\n _inherits(ChatMessage, _React$Component);\n\n function ChatMessage(props) {\n var _this;\n\n _classCallCheck(this, ChatMessage);\n\n _this = _possibleConstructorReturn(this, _getPrototypeOf(ChatMessage).call(this, props));\n _this.state = {\n progress: 0\n };\n\n if (props.uploader) {\n props.uploader.onProgress = _this.handleProgress.bind(_assertThisInitialized(_assertThisInitialized(_this)));\n }\n\n _this.handlePreviewImage = _this.handlePreviewImage.bind(_assertThisInitialized(_assertThisInitialized(_this)));\n _this.handleContextClick = _this.handleContextClick.bind(_assertThisInitialized(_assertThisInitialized(_this)));\n _this.handleCancelUpload = _this.handleCancelUpload.bind(_assertThisInitialized(_assertThisInitialized(_this)));\n return _this;\n }\n\n _createClass(ChatMessage, [{\n key: \"handlePreviewImage\",\n value: function handlePreviewImage(e) {\n e.preventDefault();\n this.props.onImagePreview({\n url: e.target.src,\n filename: e.target.title,\n width: e.target.dataset.width,\n height: e.target.dataset.height,\n size: e.target.dataset.size,\n type: e.target.dataset.mime\n });\n }\n }, {\n key: \"handleContextClick\",\n value: function handleContextClick(e) {\n e.preventDefault();\n e.stopPropagation();\n this.props.showContextMenu({\n seq: this.props.seq,\n y: e.pageY,\n x: e.pageX\n });\n }\n }, {\n key: \"handleProgress\",\n value: function handleProgress(ratio) {\n this.setState({\n progress: ratio\n });\n }\n }, {\n key: \"handleCancelUpload\",\n value: function handleCancelUpload() {\n this.props.uploader.cancel();\n }\n }, {\n key: \"render\",\n value: function render() {\n var elementKey = 0;\n\n var formatter = function formatter(style, data, values) {\n elementKey += 1;\n var el = tinode_sdk__WEBPACK_IMPORTED_MODULE_1__[\"Drafty\"].tagName(style);\n\n if (el) {\n var attr = tinode_sdk__WEBPACK_IMPORTED_MODULE_1__[\"Drafty\"].attrValue(style, data) || {};\n attr.key = elementKey;\n\n if (style == 'IM') {\n var dim = fitImageSize(data.width, data.height, Math.min(this.props.viewportWidth - REM_SIZE * 4, REM_SIZE * 36), REM_SIZE * 24, false);\n attr.className = 'inline-image';\n attr.style = dim ? {\n width: dim.dstWidth + 'px',\n height: dim.dstHeight + 'px'\n } : null;\n attr.onClick = this.handlePreviewImage;\n }\n\n return react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(el, attr, values);\n } else {\n return values;\n }\n };\n\n var sideClass = this.props.sequence + ' ' + (this.props.response ? 'left' : 'right');\n var bubbleClass = this.props.sequence == 'single' || this.props.sequence == 'last' ? 'bubble tip' : 'bubble';\n var avatar = this.props.userAvatar || true;\n var fullDisplay = this.props.userFrom && this.props.response && (this.props.sequence == 'single' || this.props.sequence == 'last');\n var content = this.props.content;\n var attachments = [];\n\n if (this.props.mimeType == tinode_sdk__WEBPACK_IMPORTED_MODULE_1__[\"Drafty\"].getContentType()) {\n tinode_sdk__WEBPACK_IMPORTED_MODULE_1__[\"Drafty\"].attachments(content, function (att, i) {\n attachments.push(react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_attachment_jsx__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n tinode: this.props.tinode,\n downloadUrl: tinode_sdk__WEBPACK_IMPORTED_MODULE_1__[\"Drafty\"].getDownloadUrl(att),\n filename: att.name,\n uploader: tinode_sdk__WEBPACK_IMPORTED_MODULE_1__[\"Drafty\"].isUploading(att),\n mimetype: att.mime,\n size: tinode_sdk__WEBPACK_IMPORTED_MODULE_1__[\"Drafty\"].getEntitySize(att),\n progress: this.state.progress,\n onCancelUpload: this.handleCancelUpload,\n onError: this.props.onError,\n key: i\n }));\n }, this);\n content = react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement('span', null, tinode_sdk__WEBPACK_IMPORTED_MODULE_1__[\"Drafty\"].format(content, formatter, this));\n } else if (typeof content != 'string') {\n content = react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"span\", null, react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"i\", {\n className: \"material-icons\"\n }, \"error_outline\"), \" \", react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"i\", null, \"invalid content\"));\n }\n\n return react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"li\", {\n className: sideClass\n }, this.props.userFrom && this.props.response ? react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"div\", {\n className: \"avatar-box\"\n }, fullDisplay ? react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_letter_tile_jsx__WEBPACK_IMPORTED_MODULE_3__[\"default\"], {\n topic: this.props.userFrom,\n title: this.props.userName,\n avatar: avatar\n }) : null) : null, react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"div\", null, react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"div\", {\n className: bubbleClass\n }, react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"div\", {\n className: \"message-content\"\n }, content, attachments, react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_received_marker_jsx__WEBPACK_IMPORTED_MODULE_4__[\"default\"], {\n timestamp: this.props.timestamp,\n received: this.props.received\n })), react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"span\", {\n className: \"menuTrigger\"\n }, react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"a\", {\n href: \"javascript:;\",\n onClick: this.handleContextClick\n }, react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"i\", {\n className: \"material-icons\"\n }, \"expand_more\")))), fullDisplay ? react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"div\", {\n className: \"author\"\n }, this.props.userName) : null));\n }\n }]);\n\n return ChatMessage;\n}(react__WEBPACK_IMPORTED_MODULE_0___default.a.Component);\n\n\n;\n\n//# sourceURL=webpack:///./src/widgets/chat-message.jsx?"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return ChatMessage; });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var react_intl__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react-intl */ \"./node_modules/react-intl/lib/index.es.js\");\n/* harmony import */ var tinode_sdk__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! tinode-sdk */ \"./node_modules/tinode-sdk/umd/tinode.prod.js\");\n/* harmony import */ var tinode_sdk__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(tinode_sdk__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var _attachment_jsx__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./attachment.jsx */ \"./src/widgets/attachment.jsx\");\n/* harmony import */ var _letter_tile_jsx__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./letter-tile.jsx */ \"./src/widgets/letter-tile.jsx\");\n/* harmony import */ var _received_marker_jsx__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./received-marker.jsx */ \"./src/widgets/received-marker.jsx\");\n/* harmony import */ var _config_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../config.js */ \"./src/config.js\");\n/* harmony import */ var _lib_blob_helpers_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../lib/blob-helpers.js */ \"./src/lib/blob-helpers.js\");\nfunction _typeof(obj) { if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; } return _typeof(obj); }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }\n\nfunction _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === \"object\" || typeof call === \"function\")) { return call; } return _assertThisInitialized(self); }\n\nfunction _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function\"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); }\n\nfunction _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }\n\nfunction _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return self; }\n\n\n\n\n\n\n\n\n\n\nvar ChatMessage = function (_React$Component) {\n _inherits(ChatMessage, _React$Component);\n\n function ChatMessage(props) {\n var _this;\n\n _classCallCheck(this, ChatMessage);\n\n _this = _possibleConstructorReturn(this, _getPrototypeOf(ChatMessage).call(this, props));\n _this.state = {\n progress: 0\n };\n\n if (props.uploader) {\n props.uploader.onProgress = _this.handleProgress.bind(_assertThisInitialized(_assertThisInitialized(_this)));\n }\n\n _this.handlePreviewImage = _this.handlePreviewImage.bind(_assertThisInitialized(_assertThisInitialized(_this)));\n _this.handleContextClick = _this.handleContextClick.bind(_assertThisInitialized(_assertThisInitialized(_this)));\n _this.handleCancelUpload = _this.handleCancelUpload.bind(_assertThisInitialized(_assertThisInitialized(_this)));\n return _this;\n }\n\n _createClass(ChatMessage, [{\n key: \"handlePreviewImage\",\n value: function handlePreviewImage(e) {\n e.preventDefault();\n this.props.onImagePreview({\n url: e.target.src,\n filename: e.target.title,\n width: e.target.dataset.width,\n height: e.target.dataset.height,\n size: e.target.dataset.size,\n type: e.target.dataset.mime\n });\n }\n }, {\n key: \"handleContextClick\",\n value: function handleContextClick(e) {\n e.preventDefault();\n e.stopPropagation();\n this.props.showContextMenu({\n seq: this.props.seq,\n y: e.pageY,\n x: e.pageX\n });\n }\n }, {\n key: \"handleProgress\",\n value: function handleProgress(ratio) {\n this.setState({\n progress: ratio\n });\n }\n }, {\n key: \"handleCancelUpload\",\n value: function handleCancelUpload() {\n this.props.uploader.cancel();\n }\n }, {\n key: \"render\",\n value: function render() {\n var elementKey = 0;\n\n var formatter = function formatter(style, data, values) {\n elementKey += 1;\n var el = tinode_sdk__WEBPACK_IMPORTED_MODULE_2__[\"Drafty\"].tagName(style);\n\n if (el) {\n var attr = tinode_sdk__WEBPACK_IMPORTED_MODULE_2__[\"Drafty\"].attrValue(style, data) || {};\n attr.key = elementKey;\n\n if (style == 'IM') {\n var dim = Object(_lib_blob_helpers_js__WEBPACK_IMPORTED_MODULE_7__[\"fitImageSize\"])(data.width, data.height, Math.min(this.props.viewportWidth - _config_js__WEBPACK_IMPORTED_MODULE_6__[\"REM_SIZE\"] * 4, _config_js__WEBPACK_IMPORTED_MODULE_6__[\"REM_SIZE\"] * 36), _config_js__WEBPACK_IMPORTED_MODULE_6__[\"REM_SIZE\"] * 24, false);\n attr.className = 'inline-image';\n attr.style = dim ? {\n width: dim.dstWidth + 'px',\n height: dim.dstHeight + 'px'\n } : null;\n attr.onClick = this.handlePreviewImage;\n }\n\n return react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(el, attr, values);\n } else {\n return values;\n }\n };\n\n var sideClass = this.props.sequence + ' ' + (this.props.response ? 'left' : 'right');\n var bubbleClass = this.props.sequence == 'single' || this.props.sequence == 'last' ? 'bubble tip' : 'bubble';\n var avatar = this.props.userAvatar || true;\n var fullDisplay = this.props.userFrom && this.props.response && (this.props.sequence == 'single' || this.props.sequence == 'last');\n var content = this.props.content;\n var attachments = [];\n\n if (this.props.mimeType == tinode_sdk__WEBPACK_IMPORTED_MODULE_2__[\"Drafty\"].getContentType()) {\n tinode_sdk__WEBPACK_IMPORTED_MODULE_2__[\"Drafty\"].attachments(content, function (att, i) {\n attachments.push(react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_attachment_jsx__WEBPACK_IMPORTED_MODULE_3__[\"default\"], {\n tinode: this.props.tinode,\n downloadUrl: tinode_sdk__WEBPACK_IMPORTED_MODULE_2__[\"Drafty\"].getDownloadUrl(att),\n filename: att.name,\n uploader: tinode_sdk__WEBPACK_IMPORTED_MODULE_2__[\"Drafty\"].isUploading(att),\n mimetype: att.mime,\n size: tinode_sdk__WEBPACK_IMPORTED_MODULE_2__[\"Drafty\"].getEntitySize(att),\n progress: this.state.progress,\n onCancelUpload: this.handleCancelUpload,\n onError: this.props.onError,\n key: i\n }));\n }, this);\n content = react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement('span', null, tinode_sdk__WEBPACK_IMPORTED_MODULE_2__[\"Drafty\"].format(content, formatter, this));\n } else if (typeof content != 'string') {\n content = react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"span\", null, react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"i\", {\n className: \"material-icons\"\n }, \"error_outline\"), \" \", react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"i\", null, react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_1__[\"FormattedMessage\"], {\n id: \"invalid_content\",\n defaultMessage: \"invalid content\"\n })));\n }\n\n return react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"li\", {\n className: sideClass\n }, this.props.userFrom && this.props.response ? react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"div\", {\n className: \"avatar-box\"\n }, fullDisplay ? react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_letter_tile_jsx__WEBPACK_IMPORTED_MODULE_4__[\"default\"], {\n topic: this.props.userFrom,\n title: this.props.userName,\n avatar: avatar\n }) : null) : null, react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"div\", null, react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"div\", {\n className: bubbleClass\n }, react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"div\", {\n className: \"message-content\"\n }, content, attachments, react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_received_marker_jsx__WEBPACK_IMPORTED_MODULE_5__[\"default\"], {\n timestamp: this.props.timestamp,\n received: this.props.received\n })), react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"span\", {\n className: \"menuTrigger\"\n }, react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"a\", {\n href: \"javascript:;\",\n onClick: this.handleContextClick\n }, react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"i\", {\n className: \"material-icons\"\n }, \"expand_more\")))), fullDisplay ? react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"div\", {\n className: \"author\"\n }, this.props.userName) : null));\n }\n }]);\n\n return ChatMessage;\n}(react__WEBPACK_IMPORTED_MODULE_0___default.a.Component);\n\n\n;\n\n//# sourceURL=webpack:///./src/widgets/chat-message.jsx?"); /***/ }), @@ -1031,7 +1031,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) * /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return Contact; });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _letter_tile_jsx__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./letter-tile.jsx */ \"./src/widgets/letter-tile.jsx\");\n/* harmony import */ var _unread_badge_jsx__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./unread-badge.jsx */ \"./src/widgets/unread-badge.jsx\");\nfunction _typeof(obj) { if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; } return _typeof(obj); }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }\n\nfunction _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === \"object\" || typeof call === \"function\")) { return call; } return _assertThisInitialized(self); }\n\nfunction _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function\"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); }\n\nfunction _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }\n\nfunction _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return self; }\n\n\n\n\n\nvar Contact = function (_React$Component) {\n _inherits(Contact, _React$Component);\n\n function Contact(props) {\n var _this;\n\n _classCallCheck(this, Contact);\n\n _this = _possibleConstructorReturn(this, _getPrototypeOf(Contact).call(this, props));\n _this.handleClick = _this.handleClick.bind(_assertThisInitialized(_assertThisInitialized(_this)));\n _this.handleContextClick = _this.handleContextClick.bind(_assertThisInitialized(_assertThisInitialized(_this)));\n return _this;\n }\n\n _createClass(Contact, [{\n key: \"handleClick\",\n value: function handleClick(e) {\n e.preventDefault();\n e.stopPropagation();\n\n if (this.props.onSelected) {\n this.props.onSelected(this.props.item, this.props.index, this.props.now, this.props.acs);\n }\n }\n }, {\n key: \"handleContextClick\",\n value: function handleContextClick(e) {\n e.preventDefault();\n e.stopPropagation();\n this.props.showContextMenu({\n topicName: this.props.item,\n y: e.pageY,\n x: e.pageX\n });\n }\n }, {\n key: \"render\",\n value: function render() {\n var title = this.props.title;\n\n if (!title) {\n title = react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"i\", null, \"unknown\");\n } else if (title.length > 30) {\n title = title.substring(0, 28) + '...';\n }\n\n var online = this.props.now ? 'online' : 'offline';\n var avatar = this.props.avatar ? this.props.avatar : true;\n var badges = [];\n\n if (this.props.badges && this.props.badges.length > 0) {\n var count = 0;\n this.props.badges.map(function (b) {\n var style = 'badge' + (b.color ? ' ' + b.color : '');\n badges.push(react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"span\", {\n className: style,\n key: count\n }, b.name));\n count++;\n });\n }\n\n if (this.props.showMode && this.props.acs) {\n badges.push(react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"span\", {\n className: \"badge\",\n key: \"mode\"\n }, this.props.acs.getMode()));\n }\n\n return react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"li\", {\n className: !this.props.showCheckmark && this.props.selected ? \"selected\" : null,\n onClick: this.handleClick\n }, react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"div\", {\n className: \"avatar-box\"\n }, react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_letter_tile_jsx__WEBPACK_IMPORTED_MODULE_1__[\"default\"], {\n avatar: avatar,\n title: this.props.title,\n topic: this.props.item\n }), this.props.showOnline ? react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"span\", {\n className: online\n }) : this.props.showCheckmark && this.props.selected ? react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"i\", {\n className: \"checkmark material-icons\"\n }, \"check_circle\") : null), react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"div\", {\n className: \"text-box\"\n }, react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"div\", null, react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"span\", {\n className: \"contact-title\"\n }, title), this.props.unread > 0 ? react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_unread_badge_jsx__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n count: this.props.unread\n }) : null), this.props.comment ? react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"div\", {\n className: \"contact-comment\"\n }, this.props.comment) : null, react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"span\", null, badges)), this.props.showContextMenu ? react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"span\", {\n className: \"menuTrigger\"\n }, react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"a\", {\n href: \"javascript:;\",\n onClick: this.handleContextClick\n }, react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"i\", {\n className: \"material-icons\"\n }, \"expand_more\"))) : null);\n }\n }]);\n\n return Contact;\n}(react__WEBPACK_IMPORTED_MODULE_0___default.a.Component);\n\n\n;\n\n//# sourceURL=webpack:///./src/widgets/contact.jsx?"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return Contact; });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var react_intl__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react-intl */ \"./node_modules/react-intl/lib/index.es.js\");\n/* harmony import */ var _letter_tile_jsx__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./letter-tile.jsx */ \"./src/widgets/letter-tile.jsx\");\n/* harmony import */ var _unread_badge_jsx__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./unread-badge.jsx */ \"./src/widgets/unread-badge.jsx\");\nfunction _typeof(obj) { if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; } return _typeof(obj); }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }\n\nfunction _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === \"object\" || typeof call === \"function\")) { return call; } return _assertThisInitialized(self); }\n\nfunction _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function\"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); }\n\nfunction _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }\n\nfunction _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return self; }\n\n\n\n\n\n\nvar Contact = function (_React$Component) {\n _inherits(Contact, _React$Component);\n\n function Contact(props) {\n var _this;\n\n _classCallCheck(this, Contact);\n\n _this = _possibleConstructorReturn(this, _getPrototypeOf(Contact).call(this, props));\n _this.handleClick = _this.handleClick.bind(_assertThisInitialized(_assertThisInitialized(_this)));\n _this.handleContextClick = _this.handleContextClick.bind(_assertThisInitialized(_assertThisInitialized(_this)));\n return _this;\n }\n\n _createClass(Contact, [{\n key: \"handleClick\",\n value: function handleClick(e) {\n e.preventDefault();\n e.stopPropagation();\n\n if (this.props.onSelected) {\n this.props.onSelected(this.props.item, this.props.index, this.props.now, this.props.acs);\n }\n }\n }, {\n key: \"handleContextClick\",\n value: function handleContextClick(e) {\n e.preventDefault();\n e.stopPropagation();\n this.props.showContextMenu({\n topicName: this.props.item,\n y: e.pageY,\n x: e.pageX\n });\n }\n }, {\n key: \"render\",\n value: function render() {\n var title = this.props.title;\n\n if (!title) {\n title = react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"i\", null, react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_1__[\"FormattedMessage\"], {\n id: \"unnamed_topic\"\n }));\n } else if (title.length > 30) {\n title = title.substring(0, 28) + '...';\n }\n\n var online = this.props.now ? 'online' : 'offline';\n var avatar = this.props.avatar ? this.props.avatar : true;\n var badges = [];\n\n if (this.props.badges && this.props.badges.length > 0) {\n var count = 0;\n this.props.badges.map(function (b) {\n var style = 'badge' + (b.color ? ' ' + b.color : '');\n badges.push(react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"span\", {\n className: style,\n key: count\n }, b.name));\n count++;\n });\n }\n\n if (this.props.showMode && this.props.acs) {\n badges.push(react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"span\", {\n className: \"badge\",\n key: \"mode\"\n }, this.props.acs.getMode()));\n }\n\n return react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"li\", {\n className: !this.props.showCheckmark && this.props.selected ? \"selected\" : null,\n onClick: this.handleClick\n }, react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"div\", {\n className: \"avatar-box\"\n }, react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_letter_tile_jsx__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n avatar: avatar,\n title: this.props.title,\n topic: this.props.item\n }), this.props.showOnline ? react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"span\", {\n className: online\n }) : this.props.showCheckmark && this.props.selected ? react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"i\", {\n className: \"checkmark material-icons\"\n }, \"check_circle\") : null), react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"div\", {\n className: \"text-box\"\n }, react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"div\", null, react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"span\", {\n className: \"contact-title\"\n }, title), this.props.unread > 0 ? react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_unread_badge_jsx__WEBPACK_IMPORTED_MODULE_3__[\"default\"], {\n count: this.props.unread\n }) : null), this.props.comment ? react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"div\", {\n className: \"contact-comment\"\n }, this.props.comment) : null, react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"span\", null, badges)), this.props.showContextMenu ? react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"span\", {\n className: \"menuTrigger\"\n }, react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"a\", {\n href: \"javascript:;\",\n onClick: this.handleContextClick\n }, react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"i\", {\n className: \"material-icons\"\n }, \"expand_more\"))) : null);\n }\n }]);\n\n return Contact;\n}(react__WEBPACK_IMPORTED_MODULE_0___default.a.Component);\n\n\n;\n\n//# sourceURL=webpack:///./src/widgets/contact.jsx?"); /***/ }), @@ -1043,7 +1043,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) * /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return ContextMenu; });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var react_dom__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react-dom */ \"./node_modules/react-dom/index.js\");\n/* harmony import */ var react_dom__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react_dom__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var _config_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../config.js */ \"./src/config.js\");\nfunction _typeof(obj) { if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; } return _typeof(obj); }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }\n\nfunction _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === \"object\" || typeof call === \"function\")) { return call; } return _assertThisInitialized(self); }\n\nfunction _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function\"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); }\n\nfunction _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }\n\nfunction _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return self; }\n\n\n\n\n\nvar ContextMenu = function (_React$Component) {\n _inherits(ContextMenu, _React$Component);\n\n function ContextMenu(props) {\n var _this;\n\n _classCallCheck(this, ContextMenu);\n\n _this = _possibleConstructorReturn(this, _getPrototypeOf(ContextMenu).call(this, props));\n _this.handlePageClick = _this.handlePageClick.bind(_assertThisInitialized(_assertThisInitialized(_this)));\n _this.handleEscapeKey = _this.handleEscapeKey.bind(_assertThisInitialized(_assertThisInitialized(_this)));\n _this.handleClick = _this.handleClick.bind(_assertThisInitialized(_assertThisInitialized(_this)));\n _this.MenuItems = {\n 'topic_info': {\n title: \"Info\",\n handler: null\n },\n 'messages_clear': {\n title: \"Clear messages\",\n handler: function handler(params, errorHandler) {\n _this.deleteMessages(true, false, params, errorHandler);\n }\n },\n 'messages_clear_hard': {\n title: \"Clear for All\",\n handler: function handler(params, errorHandler) {\n _this.deleteMessages(true, true, params, errorHandler);\n }\n },\n 'message_delete': {\n title: \"Delete\",\n handler: function handler(params, errorHandler) {\n _this.deleteMessages(false, false, params, errorHandler);\n }\n },\n 'message_delete_hard': {\n title: \"Delete for All\",\n handler: function handler(params, errorHandler) {\n _this.deleteMessages(false, true, params, errorHandler);\n }\n },\n 'topic_unmute': {\n title: \"Unmute\",\n handler: _this.topicPermissionSetter.bind(_assertThisInitialized(_assertThisInitialized(_this)), '+P')\n },\n 'topic_mute': {\n title: \"Mute\",\n handler: _this.topicPermissionSetter.bind(_assertThisInitialized(_assertThisInitialized(_this)), '-P')\n },\n 'topic_unblock': {\n title: \"Unblock\",\n handler: _this.topicPermissionSetter.bind(_assertThisInitialized(_assertThisInitialized(_this)), '+J')\n },\n 'topic_block': {\n title: \"Block\",\n handler: _this.topicPermissionSetter.bind(_assertThisInitialized(_assertThisInitialized(_this)), '-J')\n },\n 'topic_delete': {\n title: \"Delete\",\n handler: function handler(params, errorHandler) {\n var topic = _this.props.tinode.getTopic(params.topicName);\n\n if (!topic) {\n console.log(\"Topic not found: \", params.topicName);\n return;\n }\n\n topic.delTopic().catch(function (err) {\n if (errorHandler) {\n errorHandler(err.message, 'err');\n }\n });\n }\n },\n 'permissions': {\n title: \"Edit permissions\",\n handler: null\n },\n 'member_delete': {\n title: \"Remove\",\n handler: function handler(params, errorHandler) {\n var topic = _this.props.tinode.getTopic(params.topicName);\n\n if (!topic || !params.user) {\n console.log(\"Topic or user not found: '\" + params.topicName + \"', '\" + params.user + \"'\");\n return;\n }\n\n topic.delSubscription(params.user).catch(function (err) {\n if (errorHandler) {\n errorHandler(err.message, 'err');\n }\n });\n }\n },\n 'member_mute': {\n title: \"Mute\",\n handler: _this.topicPermissionSetter.bind(_assertThisInitialized(_assertThisInitialized(_this)), '-P')\n },\n 'member_unmute': {\n title: \"Unmute\",\n handler: _this.topicPermissionSetter.bind(_assertThisInitialized(_assertThisInitialized(_this)), '+P')\n },\n 'member_block': {\n title: \"Block\",\n handler: _this.topicPermissionSetter.bind(_assertThisInitialized(_assertThisInitialized(_this)), '-J')\n },\n 'member_unblock': {\n title: \"Unblock\",\n handler: _this.topicPermissionSetter.bind(_assertThisInitialized(_assertThisInitialized(_this)), '+J')\n }\n };\n return _this;\n }\n\n _createClass(ContextMenu, [{\n key: \"componentDidMount\",\n value: function componentDidMount() {\n document.addEventListener('mousedown', this.handlePageClick, false);\n document.addEventListener('keyup', this.handleEscapeKey, false);\n }\n }, {\n key: \"componentWillUnmount\",\n value: function componentWillUnmount() {\n document.removeEventListener('mousedown', this.handlePageClick, false);\n document.removeEventListener('keyup', this.handleEscapeKey, false);\n }\n }, {\n key: \"handlePageClick\",\n value: function handlePageClick(e) {\n if (ReactDOM.findDOMNode(this).contains(e.target)) {\n return;\n }\n\n e.preventDefault();\n e.stopPropagation();\n this.props.hide();\n }\n }, {\n key: \"handleEscapeKey\",\n value: function handleEscapeKey(e) {\n if (e.keyCode === 27) {\n this.props.hide();\n }\n }\n }, {\n key: \"handleClick\",\n value: function handleClick(e) {\n e.preventDefault();\n e.stopPropagation();\n this.props.hide();\n var item = this.props.items[e.currentTarget.dataset.id];\n\n if (typeof item == 'string') {\n item = this.MenuItems[item];\n }\n\n item.handler(this.props.params, this.props.onError);\n }\n }, {\n key: \"deleteMessages\",\n value: function deleteMessages(all, hard, params, errorHandler) {\n var topic = this.props.tinode.getTopic(params.topicName);\n\n if (!topic) {\n console.log(\"Topic not found: \", params.topicName);\n return;\n }\n\n if (topic.cancelSend(params.seq)) {\n return Promise.resolve();\n }\n\n var promise = all ? topic.delMessagesAll(hard) : topic.delMessagesList([params.seq], hard);\n promise.catch(function (err) {\n if (errorHandler) {\n errorHandler(err.message, 'err');\n }\n });\n }\n }, {\n key: \"topicPermissionSetter\",\n value: function topicPermissionSetter(mode, params, errorHandler) {\n var topic = this.props.tinode.getTopic(params.topicName);\n\n if (!topic) {\n console.log(\"Topic not found\", params.topicName);\n return;\n }\n\n var am, user;\n\n if (params.user) {\n user = topic.subscriber(params.user);\n\n if (!user) {\n console.log(\"Subscriber not found\", params.topicName + \"[\" + params.user + \"]\");\n return;\n }\n\n am = user.acs.updateGiven(mode).getGiven();\n } else {\n am = topic.getAccessMode().updateWant(mode).getWant();\n }\n\n topic.setMeta({\n sub: {\n user: params.user,\n mode: am\n }\n }).catch(function (err) {\n if (errorHandler) {\n errorHandler(err.message, 'err');\n }\n });\n }\n }, {\n key: \"render\",\n value: function render() {\n var _this2 = this;\n\n var count = 0;\n var menu = [];\n this.props.items.map(function (item) {\n if (typeof item == 'string') {\n item = _this2.MenuItems[item];\n }\n\n if (item && item.title) {\n menu.push(item.title == '-' ? react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"li\", {\n className: \"separator\",\n key: count\n }) : react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"li\", {\n onClick: _this2.handleClick,\n \"data-id\": count,\n key: count\n }, item.title));\n }\n\n count++;\n });\n var hSize = 12 * _config_js__WEBPACK_IMPORTED_MODULE_2__[\"REM_SIZE\"];\n var vSize = _config_js__WEBPACK_IMPORTED_MODULE_2__[\"REM_SIZE\"] * (0.7 + menu.length * 2.5);\n var left = this.props.bounds.right - this.props.clickAt.x < hSize ? this.props.clickAt.x - this.props.bounds.left - hSize : this.props.clickAt.x - this.props.bounds.left;\n var top = this.props.bounds.bottom - this.props.clickAt.y < vSize ? this.props.clickAt.y - this.props.bounds.top - vSize : this.props.clickAt.y - this.props.bounds.top;\n var position = {\n left: left + 'px',\n top: top + 'px'\n };\n return react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"ul\", {\n className: \"menu\",\n style: position\n }, menu);\n }\n }]);\n\n return ContextMenu;\n}(react__WEBPACK_IMPORTED_MODULE_0___default.a.Component);\n\n\n\n//# sourceURL=webpack:///./src/widgets/context-menu.jsx?"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return ContextMenu; });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var react_dom__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react-dom */ \"./node_modules/react-dom/index.js\");\n/* harmony import */ var react_dom__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react_dom__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var _config_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../config.js */ \"./src/config.js\");\nfunction _typeof(obj) { if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; } return _typeof(obj); }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }\n\nfunction _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === \"object\" || typeof call === \"function\")) { return call; } return _assertThisInitialized(self); }\n\nfunction _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function\"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); }\n\nfunction _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }\n\nfunction _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return self; }\n\n\n\n\n\nvar ContextMenu = function (_React$Component) {\n _inherits(ContextMenu, _React$Component);\n\n function ContextMenu(props) {\n var _this;\n\n _classCallCheck(this, ContextMenu);\n\n _this = _possibleConstructorReturn(this, _getPrototypeOf(ContextMenu).call(this, props));\n _this.handlePageClick = _this.handlePageClick.bind(_assertThisInitialized(_assertThisInitialized(_this)));\n _this.handleEscapeKey = _this.handleEscapeKey.bind(_assertThisInitialized(_assertThisInitialized(_this)));\n _this.handleClick = _this.handleClick.bind(_assertThisInitialized(_assertThisInitialized(_this)));\n _this.MenuItems = {\n 'topic_info': {\n title: \"Info\",\n handler: null\n },\n 'messages_clear': {\n title: \"Clear messages\",\n handler: function handler(params, errorHandler) {\n _this.deleteMessages(true, false, params, errorHandler);\n }\n },\n 'messages_clear_hard': {\n title: \"Clear for All\",\n handler: function handler(params, errorHandler) {\n _this.deleteMessages(true, true, params, errorHandler);\n }\n },\n 'message_delete': {\n title: \"Delete\",\n handler: function handler(params, errorHandler) {\n _this.deleteMessages(false, false, params, errorHandler);\n }\n },\n 'message_delete_hard': {\n title: \"Delete for All\",\n handler: function handler(params, errorHandler) {\n _this.deleteMessages(false, true, params, errorHandler);\n }\n },\n 'topic_unmute': {\n title: \"Unmute\",\n handler: _this.topicPermissionSetter.bind(_assertThisInitialized(_assertThisInitialized(_this)), '+P')\n },\n 'topic_mute': {\n title: \"Mute\",\n handler: _this.topicPermissionSetter.bind(_assertThisInitialized(_assertThisInitialized(_this)), '-P')\n },\n 'topic_unblock': {\n title: \"Unblock\",\n handler: _this.topicPermissionSetter.bind(_assertThisInitialized(_assertThisInitialized(_this)), '+J')\n },\n 'topic_block': {\n title: \"Block\",\n handler: _this.topicPermissionSetter.bind(_assertThisInitialized(_assertThisInitialized(_this)), '-J')\n },\n 'topic_delete': {\n title: \"Delete\",\n handler: function handler(params, errorHandler) {\n var topic = _this.props.tinode.getTopic(params.topicName);\n\n if (!topic) {\n console.log(\"Topic not found: \", params.topicName);\n return;\n }\n\n topic.delTopic().catch(function (err) {\n if (errorHandler) {\n errorHandler(err.message, 'err');\n }\n });\n }\n },\n 'permissions': {\n title: \"Edit permissions\",\n handler: null\n },\n 'member_delete': {\n title: \"Remove\",\n handler: function handler(params, errorHandler) {\n var topic = _this.props.tinode.getTopic(params.topicName);\n\n if (!topic || !params.user) {\n console.log(\"Topic or user not found: '\" + params.topicName + \"', '\" + params.user + \"'\");\n return;\n }\n\n topic.delSubscription(params.user).catch(function (err) {\n if (errorHandler) {\n errorHandler(err.message, 'err');\n }\n });\n }\n },\n 'member_mute': {\n title: \"Mute\",\n handler: _this.topicPermissionSetter.bind(_assertThisInitialized(_assertThisInitialized(_this)), '-P')\n },\n 'member_unmute': {\n title: \"Unmute\",\n handler: _this.topicPermissionSetter.bind(_assertThisInitialized(_assertThisInitialized(_this)), '+P')\n },\n 'member_block': {\n title: \"Block\",\n handler: _this.topicPermissionSetter.bind(_assertThisInitialized(_assertThisInitialized(_this)), '-J')\n },\n 'member_unblock': {\n title: \"Unblock\",\n handler: _this.topicPermissionSetter.bind(_assertThisInitialized(_assertThisInitialized(_this)), '+J')\n }\n };\n return _this;\n }\n\n _createClass(ContextMenu, [{\n key: \"componentDidMount\",\n value: function componentDidMount() {\n document.addEventListener('mousedown', this.handlePageClick, false);\n document.addEventListener('keyup', this.handleEscapeKey, false);\n }\n }, {\n key: \"componentWillUnmount\",\n value: function componentWillUnmount() {\n document.removeEventListener('mousedown', this.handlePageClick, false);\n document.removeEventListener('keyup', this.handleEscapeKey, false);\n }\n }, {\n key: \"handlePageClick\",\n value: function handlePageClick(e) {\n if (react_dom__WEBPACK_IMPORTED_MODULE_1___default.a.findDOMNode(this).contains(e.target)) {\n return;\n }\n\n e.preventDefault();\n e.stopPropagation();\n this.props.hide();\n }\n }, {\n key: \"handleEscapeKey\",\n value: function handleEscapeKey(e) {\n if (e.keyCode === 27) {\n this.props.hide();\n }\n }\n }, {\n key: \"handleClick\",\n value: function handleClick(e) {\n e.preventDefault();\n e.stopPropagation();\n this.props.hide();\n var item = this.props.items[e.currentTarget.dataset.id];\n\n if (typeof item == 'string') {\n item = this.MenuItems[item];\n }\n\n item.handler(this.props.params, this.props.onError);\n }\n }, {\n key: \"deleteMessages\",\n value: function deleteMessages(all, hard, params, errorHandler) {\n var topic = this.props.tinode.getTopic(params.topicName);\n\n if (!topic) {\n console.log(\"Topic not found: \", params.topicName);\n return;\n }\n\n if (topic.cancelSend(params.seq)) {\n return Promise.resolve();\n }\n\n var promise = all ? topic.delMessagesAll(hard) : topic.delMessagesList([params.seq], hard);\n promise.catch(function (err) {\n if (errorHandler) {\n errorHandler(err.message, 'err');\n }\n });\n }\n }, {\n key: \"topicPermissionSetter\",\n value: function topicPermissionSetter(mode, params, errorHandler) {\n var topic = this.props.tinode.getTopic(params.topicName);\n\n if (!topic) {\n console.log(\"Topic not found\", params.topicName);\n return;\n }\n\n var am, user;\n\n if (params.user) {\n user = topic.subscriber(params.user);\n\n if (!user) {\n console.log(\"Subscriber not found\", params.topicName + \"[\" + params.user + \"]\");\n return;\n }\n\n am = user.acs.updateGiven(mode).getGiven();\n } else {\n am = topic.getAccessMode().updateWant(mode).getWant();\n }\n\n topic.setMeta({\n sub: {\n user: params.user,\n mode: am\n }\n }).catch(function (err) {\n if (errorHandler) {\n errorHandler(err.message, 'err');\n }\n });\n }\n }, {\n key: \"render\",\n value: function render() {\n var _this2 = this;\n\n var count = 0;\n var menu = [];\n this.props.items.map(function (item) {\n if (typeof item == 'string') {\n item = _this2.MenuItems[item];\n }\n\n if (item && item.title) {\n menu.push(item.title == '-' ? react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"li\", {\n className: \"separator\",\n key: count\n }) : react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"li\", {\n onClick: _this2.handleClick,\n \"data-id\": count,\n key: count\n }, item.title));\n }\n\n count++;\n });\n var hSize = 12 * _config_js__WEBPACK_IMPORTED_MODULE_2__[\"REM_SIZE\"];\n var vSize = _config_js__WEBPACK_IMPORTED_MODULE_2__[\"REM_SIZE\"] * (0.7 + menu.length * 2.5);\n var left = this.props.bounds.right - this.props.clickAt.x < hSize ? this.props.clickAt.x - this.props.bounds.left - hSize : this.props.clickAt.x - this.props.bounds.left;\n var top = this.props.bounds.bottom - this.props.clickAt.y < vSize ? this.props.clickAt.y - this.props.bounds.top - vSize : this.props.clickAt.y - this.props.bounds.top;\n var position = {\n left: left + 'px',\n top: top + 'px'\n };\n return react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"ul\", {\n className: \"menu\",\n style: position\n }, menu);\n }\n }]);\n\n return ContextMenu;\n}(react__WEBPACK_IMPORTED_MODULE_0___default.a.Component);\n\n\n\n//# sourceURL=webpack:///./src/widgets/context-menu.jsx?"); /***/ }), @@ -1079,7 +1079,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) * /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return GroupManager; });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _chip_input_jsx__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./chip-input.jsx */ \"./src/widgets/chip-input.jsx\");\n/* harmony import */ var _contact_list_jsx__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./contact-list.jsx */ \"./src/widgets/contact-list.jsx\");\nfunction _typeof(obj) { if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; } return _typeof(obj); }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }\n\nfunction _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === \"object\" || typeof call === \"function\")) { return call; } return _assertThisInitialized(self); }\n\nfunction _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function\"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); }\n\nfunction _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }\n\nfunction _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return self; }\n\n\n\n\n\nvar GroupManager = function (_React$Component) {\n _inherits(GroupManager, _React$Component);\n\n function GroupManager(props) {\n var _this;\n\n _classCallCheck(this, GroupManager);\n\n _this = _possibleConstructorReturn(this, _getPrototypeOf(GroupManager).call(this, props));\n _this.state = {\n members: props.members,\n index: GroupManager.indexMembers(props.members),\n contactFilter: '',\n noContactsMessage: \"You have no contacts :-(\",\n selectedContacts: GroupManager.selectedContacts(props.members)\n };\n _this.handleContactSelected = _this.handleContactSelected.bind(_assertThisInitialized(_assertThisInitialized(_this)));\n _this.handleMemberRemoved = _this.handleMemberRemoved.bind(_assertThisInitialized(_assertThisInitialized(_this)));\n _this.handleContactFilter = _this.handleContactFilter.bind(_assertThisInitialized(_assertThisInitialized(_this)));\n _this.handleSubmit = _this.handleSubmit.bind(_assertThisInitialized(_assertThisInitialized(_this)));\n _this.handleCancel = _this.handleCancel.bind(_assertThisInitialized(_assertThisInitialized(_this)));\n return _this;\n }\n\n _createClass(GroupManager, [{\n key: \"handleContactSelected\",\n value: function handleContactSelected(userId, index) {\n var status = this.state.index[userId];\n\n if (status) {\n if (status.present) {\n return;\n }\n\n status.delta += 1;\n status.present = true;\n } else {\n status = {\n delta: 1,\n present: true\n };\n }\n\n var m = this.state.members.slice();\n m.push(this.props.contacts[index]);\n var sel = GroupManager.selectedContacts(m);\n var i = this.state.index;\n i[userId] = status;\n this.setState({\n members: m,\n index: i,\n selectedContacts: sel\n });\n }\n }, {\n key: \"handleMemberRemoved\",\n value: function handleMemberRemoved(userId, index) {\n var status = this.state.index[userId];\n\n if (!status || !status.present) {\n return;\n }\n\n status.present = false;\n status.delta -= 1;\n var m = this.state.members.slice();\n m.splice(index, 1);\n var sel = GroupManager.selectedContacts(m);\n var i = this.state.index;\n i[userId] = status;\n this.setState({\n members: m,\n index: i,\n selectedContacts: sel\n });\n }\n }, {\n key: \"handleContactFilter\",\n value: function handleContactFilter(val) {\n var msg = !val ? \"You have no contacts :-(\" : \"No contacts match '\" + val + \"'\";\n this.setState({\n contactFilter: val,\n noContactsMessage: msg\n });\n }\n }, {\n key: \"handleSubmit\",\n value: function handleSubmit() {\n var instance = this;\n var members = [];\n var added = [];\n var removed = [];\n var keys = Object.keys(this.state.index);\n keys.map(function (k) {\n if (instance.state.index[k].present) {\n members.push(k);\n }\n\n if (instance.state.index[k].delta > 0) {\n added.push(k);\n } else if (instance.state.index[k].delta < 0) {\n removed.push(k);\n }\n });\n this.props.onSubmit(members, added, removed);\n }\n }, {\n key: \"handleCancel\",\n value: function handleCancel() {\n this.props.onCancel();\n }\n }, {\n key: \"render\",\n value: function render() {\n return react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"div\", {\n id: \"group-manager\"\n }, react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"div\", {\n className: \"panel-form-row\"\n }, react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"label\", {\n className: \"small\"\n }, \"Group members\")), react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"div\", {\n className: \"panel-form-row\"\n }, react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_chip_input_jsx__WEBPACK_IMPORTED_MODULE_1__[\"default\"], {\n chips: this.state.members,\n required: this.props.requiredMember,\n prompt: \"add members\",\n filterFunc: this.handleContactFilter,\n onChipRemoved: this.handleMemberRemoved\n })), react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"div\", {\n className: \"panel-form-row\"\n }, react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"label\", {\n className: \"small\"\n }, \"All contacts\")), react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_contact_list_jsx__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n contacts: this.props.contacts,\n myUserId: this.props.myUserId,\n topicSelected: this.state.selectedContacts,\n filter: this.state.contactFilter,\n filterFunc: GroupManager.doContactFiltering,\n emptyListMessage: this.state.noContactsMessage,\n showOnline: false,\n showUnread: false,\n onTopicSelected: this.handleContactSelected\n }), react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"div\", {\n id: \"group-manager-buttons\",\n className: \"panel-form-row\"\n }, react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"button\", {\n className: \"blue\",\n onClick: this.handleSubmit\n }, \"OK\"), react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"button\", {\n className: \"white\",\n onClick: this.handleCancel\n }, \"Cancel\")));\n }\n }], [{\n key: \"indexMembers\",\n value: function indexMembers(members) {\n var index = {};\n members.map(function (m) {\n index[m.user] = {\n delta: 0,\n present: true\n };\n });\n return index;\n }\n }, {\n key: \"selectedContacts\",\n value: function selectedContacts(members) {\n var sel = [];\n members.map(function (m) {\n sel.push(m.user);\n });\n return sel;\n }\n }, {\n key: \"doContactFiltering\",\n value: function doContactFiltering(filter, values) {\n if (filter) {\n for (var i = 0; i < values.length; i++) {\n if (values[i].indexOf(filter) >= 0) {\n return true;\n }\n }\n\n return false;\n }\n\n return true;\n }\n }]);\n\n return GroupManager;\n}(react__WEBPACK_IMPORTED_MODULE_0___default.a.Component);\n\n\n;\n\n//# sourceURL=webpack:///./src/widgets/group-manager.jsx?"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return GroupManager; });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var react_intl__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react-intl */ \"./node_modules/react-intl/lib/index.es.js\");\n/* harmony import */ var _chip_input_jsx__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./chip-input.jsx */ \"./src/widgets/chip-input.jsx\");\n/* harmony import */ var _contact_list_jsx__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./contact-list.jsx */ \"./src/widgets/contact-list.jsx\");\nfunction _typeof(obj) { if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; } return _typeof(obj); }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }\n\nfunction _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === \"object\" || typeof call === \"function\")) { return call; } return _assertThisInitialized(self); }\n\nfunction _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function\"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); }\n\nfunction _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }\n\nfunction _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return self; }\n\n\n\n\n\n\nvar GroupManager = function (_React$Component) {\n _inherits(GroupManager, _React$Component);\n\n function GroupManager(props) {\n var _this;\n\n _classCallCheck(this, GroupManager);\n\n _this = _possibleConstructorReturn(this, _getPrototypeOf(GroupManager).call(this, props));\n _this.state = {\n members: props.members,\n index: GroupManager.indexMembers(props.members),\n contactFilter: '',\n noContactsMessage: \"You have no contacts :-(\",\n selectedContacts: GroupManager.selectedContacts(props.members)\n };\n _this.handleContactSelected = _this.handleContactSelected.bind(_assertThisInitialized(_assertThisInitialized(_this)));\n _this.handleMemberRemoved = _this.handleMemberRemoved.bind(_assertThisInitialized(_assertThisInitialized(_this)));\n _this.handleContactFilter = _this.handleContactFilter.bind(_assertThisInitialized(_assertThisInitialized(_this)));\n _this.handleSubmit = _this.handleSubmit.bind(_assertThisInitialized(_assertThisInitialized(_this)));\n _this.handleCancel = _this.handleCancel.bind(_assertThisInitialized(_assertThisInitialized(_this)));\n return _this;\n }\n\n _createClass(GroupManager, [{\n key: \"handleContactSelected\",\n value: function handleContactSelected(userId, index) {\n var status = this.state.index[userId];\n\n if (status) {\n if (status.present) {\n return;\n }\n\n status.delta += 1;\n status.present = true;\n } else {\n status = {\n delta: 1,\n present: true\n };\n }\n\n var m = this.state.members.slice();\n m.push(this.props.contacts[index]);\n var sel = GroupManager.selectedContacts(m);\n var i = this.state.index;\n i[userId] = status;\n this.setState({\n members: m,\n index: i,\n selectedContacts: sel\n });\n }\n }, {\n key: \"handleMemberRemoved\",\n value: function handleMemberRemoved(userId, index) {\n var status = this.state.index[userId];\n\n if (!status || !status.present) {\n return;\n }\n\n status.present = false;\n status.delta -= 1;\n var m = this.state.members.slice();\n m.splice(index, 1);\n var sel = GroupManager.selectedContacts(m);\n var i = this.state.index;\n i[userId] = status;\n this.setState({\n members: m,\n index: i,\n selectedContacts: sel\n });\n }\n }, {\n key: \"handleContactFilter\",\n value: function handleContactFilter(val) {\n var msg = !val ? \"You have no contacts :-(\" : \"No contacts match '\" + val + \"'\";\n this.setState({\n contactFilter: val,\n noContactsMessage: msg\n });\n }\n }, {\n key: \"handleSubmit\",\n value: function handleSubmit() {\n var instance = this;\n var members = [];\n var added = [];\n var removed = [];\n var keys = Object.keys(this.state.index);\n keys.map(function (k) {\n if (instance.state.index[k].present) {\n members.push(k);\n }\n\n if (instance.state.index[k].delta > 0) {\n added.push(k);\n } else if (instance.state.index[k].delta < 0) {\n removed.push(k);\n }\n });\n this.props.onSubmit(members, added, removed);\n }\n }, {\n key: \"handleCancel\",\n value: function handleCancel() {\n this.props.onCancel();\n }\n }, {\n key: \"render\",\n value: function render() {\n return react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"div\", {\n id: \"group-manager\"\n }, react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"div\", {\n className: \"panel-form-row\"\n }, react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"label\", {\n className: \"small\"\n }, \"Group members\")), react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"div\", {\n className: \"panel-form-row\"\n }, react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_chip_input_jsx__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n chips: this.state.members,\n required: this.props.requiredMember,\n prompt: \"add members\",\n filterFunc: this.handleContactFilter,\n onChipRemoved: this.handleMemberRemoved\n })), react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"div\", {\n className: \"panel-form-row\"\n }, react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"label\", {\n className: \"small\"\n }, \"All contacts\")), react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_contact_list_jsx__WEBPACK_IMPORTED_MODULE_3__[\"default\"], {\n contacts: this.props.contacts,\n myUserId: this.props.myUserId,\n topicSelected: this.state.selectedContacts,\n filter: this.state.contactFilter,\n filterFunc: GroupManager.doContactFiltering,\n emptyListMessage: this.state.noContactsMessage,\n showOnline: false,\n showUnread: false,\n onTopicSelected: this.handleContactSelected\n }), react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"div\", {\n id: \"group-manager-buttons\",\n className: \"panel-form-row\"\n }, react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"button\", {\n className: \"blue\",\n onClick: this.handleSubmit\n }, react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_1__[\"FormattedMessage\"], {\n id: \"button_ok\",\n defaultMessage: \"OK\"\n })), react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"button\", {\n className: \"white\",\n onClick: this.handleCancel\n }, react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_1__[\"FormattedMessage\"], {\n id: \"button_cancel\",\n defaultMessage: \"Cancel\"\n }))));\n }\n }], [{\n key: \"indexMembers\",\n value: function indexMembers(members) {\n var index = {};\n members.map(function (m) {\n index[m.user] = {\n delta: 0,\n present: true\n };\n });\n return index;\n }\n }, {\n key: \"selectedContacts\",\n value: function selectedContacts(members) {\n var sel = [];\n members.map(function (m) {\n sel.push(m.user);\n });\n return sel;\n }\n }, {\n key: \"doContactFiltering\",\n value: function doContactFiltering(filter, values) {\n if (filter) {\n for (var i = 0; i < values.length; i++) {\n if (values[i].indexOf(filter) >= 0) {\n return true;\n }\n }\n\n return false;\n }\n\n return true;\n }\n }]);\n\n return GroupManager;\n}(react__WEBPACK_IMPORTED_MODULE_0___default.a.Component);\n\n\n;\n\n//# sourceURL=webpack:///./src/widgets/group-manager.jsx?"); /***/ }), @@ -1115,7 +1115,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) * /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return ImagePreview; });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\nfunction _typeof(obj) { if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; } return _typeof(obj); }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }\n\nfunction _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === \"object\" || typeof call === \"function\")) { return call; } return _assertThisInitialized(self); }\n\nfunction _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return self; }\n\nfunction _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function\"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); }\n\nfunction _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }\n\n\n\nvar ImagePreview = function (_React$PureComponent) {\n _inherits(ImagePreview, _React$PureComponent);\n\n function ImagePreview(props) {\n var _this;\n\n _classCallCheck(this, ImagePreview);\n\n _this = _possibleConstructorReturn(this, _getPrototypeOf(ImagePreview).call(this, props));\n _this.state = {};\n return _this;\n }\n\n _createClass(ImagePreview, [{\n key: \"componentDidMount\",\n value: function componentDidMount() {\n this.setState({\n width: this.container.clientWidth,\n height: this.container.clientHeight\n });\n }\n }, {\n key: \"render\",\n value: function render() {\n if (!this.props.content) {\n return null;\n }\n\n var instance = this;\n var dim = fitImageSize(this.props.content.width, this.props.content.height, this.state.width, this.state.height, false);\n var size = dim ? {\n width: dim.dstWidth + 'px',\n height: dim.dstHeight + 'px'\n } : this.props.content.width > this.props.content.height ? {\n width: '100%'\n } : {\n height: '100%'\n };\n size.maxWidth = '100%';\n size.maxHeight = '100%';\n var filename = this.props.content.filename;\n var maxlength = this.props.content.width / REM_SIZE | 0;\n\n if (filename.length > maxlength) {\n filename = filename.slice(0, maxlength - 2) + '...' + filename.slice(2 - maxlength);\n }\n\n return react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"div\", {\n id: \"image-preview\",\n onClick: this.props.onClose\n }, react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"div\", {\n id: \"image-preview-caption-panel\"\n }, react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"a\", {\n href: this.props.content.url,\n download: this.props.content.filename\n }, react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"i\", {\n className: \"material-icons\"\n }, \"file_download\"), \" download\"), react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"a\", {\n href: \"javascript:;\",\n onClick: this.props.onClose\n }, react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"i\", {\n className: \"material-icons gray\"\n }, \"close\"))), react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"div\", {\n id: \"image-preview-container\",\n ref: function ref(_ref) {\n instance.container = _ref;\n }\n }, react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"img\", {\n src: this.props.content.url,\n style: size\n })), react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"div\", {\n id: \"image-preview-footer\"\n }, react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"div\", null, react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"div\", null, react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"b\", null, \"File name\"), \":\"), react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"div\", null, react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"span\", {\n title: this.props.content.filename\n }, filename))), react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"div\", null, react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"div\", null, react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"b\", null, \"Content type\"), \":\"), react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"div\", null, this.props.content.type)), react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"div\", null, react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"div\", null, react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"b\", null, \"Size\"), \":\"), react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"div\", null, this.props.content.width, \" \\xD7 \", this.props.content.height, \" px; \", bytesToHumanSize(this.props.content.size)))));\n }\n }]);\n\n return ImagePreview;\n}(react__WEBPACK_IMPORTED_MODULE_0___default.a.PureComponent);\n\n\n;\n\n//# sourceURL=webpack:///./src/widgets/image-preview.jsx?"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return ImagePreview; });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var react_intl__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react-intl */ \"./node_modules/react-intl/lib/index.es.js\");\n/* harmony import */ var _config_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../config.js */ \"./src/config.js\");\n/* harmony import */ var _lib_blob_helpers_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../lib/blob-helpers.js */ \"./src/lib/blob-helpers.js\");\n/* harmony import */ var _lib_strformat_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../lib/strformat.js */ \"./src/lib/strformat.js\");\nfunction _typeof(obj) { if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; } return _typeof(obj); }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }\n\nfunction _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === \"object\" || typeof call === \"function\")) { return call; } return _assertThisInitialized(self); }\n\nfunction _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return self; }\n\nfunction _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function\"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); }\n\nfunction _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }\n\n\n\n\n\n\n\nvar ImagePreview = function (_React$PureComponent) {\n _inherits(ImagePreview, _React$PureComponent);\n\n function ImagePreview(props) {\n var _this;\n\n _classCallCheck(this, ImagePreview);\n\n _this = _possibleConstructorReturn(this, _getPrototypeOf(ImagePreview).call(this, props));\n _this.state = {};\n return _this;\n }\n\n _createClass(ImagePreview, [{\n key: \"componentDidMount\",\n value: function componentDidMount() {\n this.setState({\n width: this.container.clientWidth,\n height: this.container.clientHeight\n });\n }\n }, {\n key: \"render\",\n value: function render() {\n if (!this.props.content) {\n return null;\n }\n\n var instance = this;\n var dim = Object(_lib_blob_helpers_js__WEBPACK_IMPORTED_MODULE_3__[\"fitImageSize\"])(this.props.content.width, this.props.content.height, this.state.width, this.state.height, false);\n var size = dim ? {\n width: dim.dstWidth + 'px',\n height: dim.dstHeight + 'px'\n } : this.props.content.width > this.props.content.height ? {\n width: '100%'\n } : {\n height: '100%'\n };\n size.maxWidth = '100%';\n size.maxHeight = '100%';\n var filename = this.props.content.filename;\n var maxlength = this.props.content.width / _config_js__WEBPACK_IMPORTED_MODULE_2__[\"REM_SIZE\"] | 0;\n\n if (filename.length > maxlength) {\n filename = filename.slice(0, maxlength - 2) + '...' + filename.slice(2 - maxlength);\n }\n\n return react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"div\", {\n id: \"image-preview\",\n onClick: this.props.onClose\n }, react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"div\", {\n id: \"image-preview-caption-panel\"\n }, react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"a\", {\n href: this.props.content.url,\n download: this.props.content.filename\n }, react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"i\", {\n className: \"material-icons\"\n }, \"file_download\"), \" download\"), react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"a\", {\n href: \"javascript:;\",\n onClick: this.props.onClose\n }, react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"i\", {\n className: \"material-icons gray\"\n }, \"close\"))), react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"div\", {\n id: \"image-preview-container\",\n ref: function ref(_ref) {\n instance.container = _ref;\n }\n }, react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"img\", {\n src: this.props.content.url,\n style: size\n })), react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"div\", {\n id: \"image-preview-footer\"\n }, react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"div\", null, react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"div\", null, react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"b\", null, react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_1__[\"FormattedMessage\"], {\n id: \"label_file_name\",\n defaultMessage: \"File name:\"\n }))), react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"div\", null, react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"span\", {\n title: this.props.content.filename\n }, filename))), react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"div\", null, react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"div\", null, react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"b\", null, react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_1__[\"FormattedMessage\"], {\n id: \"label_content_type\",\n defaultMessage: \"Content type:\"\n }))), react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"div\", null, this.props.content.type)), react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"div\", null, react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"div\", null, react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"b\", null, react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_1__[\"FormattedMessage\"], {\n id: \"label_size\",\n defaultMessage: \"Size:\"\n }))), react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"div\", null, this.props.content.width, \" \\xD7 \", this.props.content.height, \" px; \", Object(_lib_strformat_js__WEBPACK_IMPORTED_MODULE_4__[\"bytesToHumanSize\"])(this.props.content.size)))));\n }\n }]);\n\n return ImagePreview;\n}(react__WEBPACK_IMPORTED_MODULE_0___default.a.PureComponent);\n\n\n;\n\n//# sourceURL=webpack:///./src/widgets/image-preview.jsx?"); /***/ }), @@ -1127,7 +1127,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) * /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return InPlaceEdit; });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var react_dom__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react-dom */ \"./node_modules/react-dom/index.js\");\n/* harmony import */ var react_dom__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react_dom__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var _visible_password_jsx__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./visible-password.jsx */ \"./src/widgets/visible-password.jsx\");\nfunction _typeof(obj) { if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; } return _typeof(obj); }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }\n\nfunction _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === \"object\" || typeof call === \"function\")) { return call; } return _assertThisInitialized(self); }\n\nfunction _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function\"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); }\n\nfunction _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }\n\nfunction _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return self; }\n\n\n\n\n\nvar InPlaceEdit = function (_React$Component) {\n _inherits(InPlaceEdit, _React$Component);\n\n function InPlaceEdit(props) {\n var _this;\n\n _classCallCheck(this, InPlaceEdit);\n\n _this = _possibleConstructorReturn(this, _getPrototypeOf(InPlaceEdit).call(this, props));\n _this.state = {\n active: props.active,\n initialValue: props.value || '',\n value: props.value || ''\n };\n _this.handeTextChange = _this.handeTextChange.bind(_assertThisInitialized(_assertThisInitialized(_this)));\n _this.handleKeyDown = _this.handleKeyDown.bind(_assertThisInitialized(_assertThisInitialized(_this)));\n _this.handleStartEditing = _this.handleStartEditing.bind(_assertThisInitialized(_assertThisInitialized(_this)));\n _this.handleEditingFinished = _this.handleEditingFinished.bind(_assertThisInitialized(_assertThisInitialized(_this)));\n _this.handlePasswordFinished = _this.handlePasswordFinished.bind(_assertThisInitialized(_assertThisInitialized(_this)));\n return _this;\n }\n\n _createClass(InPlaceEdit, [{\n key: \"handeTextChange\",\n value: function handeTextChange(e) {\n this.setState({\n value: e.target.value\n });\n }\n }, {\n key: \"handleKeyDown\",\n value: function handleKeyDown(e) {\n if (e.keyCode === 27) {\n this.setState({\n value: this.props.value,\n active: false\n });\n } else if (e.keyCode === 13) {\n this.handleEditingFinished();\n }\n }\n }, {\n key: \"handleStartEditing\",\n value: function handleStartEditing() {\n if (!this.props.readOnly) {\n ReactDOM.findDOMNode(this).focus();\n this.setState({\n active: true\n });\n }\n }\n }, {\n key: \"handleEditingFinished\",\n value: function handleEditingFinished() {\n this.setState({\n active: false\n });\n var value = this.state.value.trim();\n\n if ((value || this.props.value) && value !== this.props.value) {\n this.props.onFinished(value);\n }\n }\n }, {\n key: \"handlePasswordFinished\",\n value: function handlePasswordFinished(value) {\n this.setState({\n active: false\n });\n\n if (value && value !== this.props.value) {\n this.props.onFinished(value);\n }\n }\n }, {\n key: \"render\",\n value: function render() {\n if (this.state.active) {\n var fieldType = this.props.type || 'text';\n } else {\n var spanText = this.props.type == 'password' ? '••••••••' : this.state.value;\n var spanClass = 'in-place-edit' + (this.props.readOnly ? ' disabled' : '');\n\n if (!spanText) {\n spanText = this.props.placeholder;\n spanClass += ' placeholder';\n }\n\n if (spanText.length > 20) {\n spanText = spanText.substring(0, 19) + '...';\n }\n }\n\n return this.state.active ? fieldType == 'password' ? react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_visible_password_jsx__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n value: this.state.value,\n placeholder: this.props.placeholder,\n required: this.props.required ? 'required' : '',\n autoComplete: this.props.autoComplete,\n autoFocus: true,\n onFinished: this.handlePasswordFinished\n }) : react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"input\", {\n type: fieldType,\n value: this.state.value,\n placeholder: this.props.placeholder,\n required: this.props.required ? 'required' : '',\n autoComplete: this.props.autoComplete,\n autoFocus: true,\n onChange: this.handeTextChange,\n onKeyDown: this.handleKeyDown,\n onBlur: this.handleEditingFinished\n }) : react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"span\", {\n className: spanClass,\n onClick: this.handleStartEditing\n }, react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"span\", {\n className: \"content\"\n }, spanText));\n }\n }], [{\n key: \"getDerivedStateFromProps\",\n value: function getDerivedStateFromProps(nextProps, prevState) {\n if (prevState.initialValue != nextProps.value && !prevState.active) {\n return {\n initialValue: nextProps.value || '',\n value: nextProps.value || ''\n };\n }\n\n return null;\n }\n }]);\n\n return InPlaceEdit;\n}(react__WEBPACK_IMPORTED_MODULE_0___default.a.Component);\n\n\n;\n\n//# sourceURL=webpack:///./src/widgets/in-place-edit.jsx?"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return InPlaceEdit; });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var react_dom__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react-dom */ \"./node_modules/react-dom/index.js\");\n/* harmony import */ var react_dom__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react_dom__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var _visible_password_jsx__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./visible-password.jsx */ \"./src/widgets/visible-password.jsx\");\nfunction _typeof(obj) { if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; } return _typeof(obj); }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }\n\nfunction _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === \"object\" || typeof call === \"function\")) { return call; } return _assertThisInitialized(self); }\n\nfunction _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function\"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); }\n\nfunction _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }\n\nfunction _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return self; }\n\n\n\n\n\nvar InPlaceEdit = function (_React$Component) {\n _inherits(InPlaceEdit, _React$Component);\n\n function InPlaceEdit(props) {\n var _this;\n\n _classCallCheck(this, InPlaceEdit);\n\n _this = _possibleConstructorReturn(this, _getPrototypeOf(InPlaceEdit).call(this, props));\n _this.state = {\n active: props.active,\n initialValue: props.value || '',\n value: props.value || ''\n };\n _this.handeTextChange = _this.handeTextChange.bind(_assertThisInitialized(_assertThisInitialized(_this)));\n _this.handleKeyDown = _this.handleKeyDown.bind(_assertThisInitialized(_assertThisInitialized(_this)));\n _this.handleStartEditing = _this.handleStartEditing.bind(_assertThisInitialized(_assertThisInitialized(_this)));\n _this.handleEditingFinished = _this.handleEditingFinished.bind(_assertThisInitialized(_assertThisInitialized(_this)));\n _this.handlePasswordFinished = _this.handlePasswordFinished.bind(_assertThisInitialized(_assertThisInitialized(_this)));\n return _this;\n }\n\n _createClass(InPlaceEdit, [{\n key: \"handeTextChange\",\n value: function handeTextChange(e) {\n this.setState({\n value: e.target.value\n });\n }\n }, {\n key: \"handleKeyDown\",\n value: function handleKeyDown(e) {\n if (e.keyCode === 27) {\n this.setState({\n value: this.props.value,\n active: false\n });\n } else if (e.keyCode === 13) {\n this.handleEditingFinished();\n }\n }\n }, {\n key: \"handleStartEditing\",\n value: function handleStartEditing() {\n if (!this.props.readOnly) {\n react_dom__WEBPACK_IMPORTED_MODULE_1___default.a.findDOMNode(this).focus();\n this.setState({\n active: true\n });\n }\n }\n }, {\n key: \"handleEditingFinished\",\n value: function handleEditingFinished() {\n this.setState({\n active: false\n });\n var value = this.state.value.trim();\n\n if ((value || this.props.value) && value !== this.props.value) {\n this.props.onFinished(value);\n }\n }\n }, {\n key: \"handlePasswordFinished\",\n value: function handlePasswordFinished(value) {\n this.setState({\n active: false\n });\n\n if (value && value !== this.props.value) {\n this.props.onFinished(value);\n }\n }\n }, {\n key: \"render\",\n value: function render() {\n if (this.state.active) {\n var fieldType = this.props.type || 'text';\n } else {\n var spanText = this.props.type == 'password' ? '••••••••' : this.state.value;\n var spanClass = 'in-place-edit' + (this.props.readOnly ? ' disabled' : '');\n\n if (!spanText) {\n spanText = this.props.placeholder;\n spanClass += ' placeholder';\n }\n\n if (spanText.length > 20) {\n spanText = spanText.substring(0, 19) + '...';\n }\n }\n\n return this.state.active ? fieldType == 'password' ? react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_visible_password_jsx__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n value: this.state.value,\n placeholder: this.props.placeholder,\n required: this.props.required ? 'required' : '',\n autoComplete: this.props.autoComplete,\n autoFocus: true,\n onFinished: this.handlePasswordFinished\n }) : react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"input\", {\n type: fieldType,\n value: this.state.value,\n placeholder: this.props.placeholder,\n required: this.props.required ? 'required' : '',\n autoComplete: this.props.autoComplete,\n autoFocus: true,\n onChange: this.handeTextChange,\n onKeyDown: this.handleKeyDown,\n onBlur: this.handleEditingFinished\n }) : react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"span\", {\n className: spanClass,\n onClick: this.handleStartEditing\n }, react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"span\", {\n className: \"content\"\n }, spanText));\n }\n }], [{\n key: \"getDerivedStateFromProps\",\n value: function getDerivedStateFromProps(nextProps, prevState) {\n if (prevState.initialValue != nextProps.value && !prevState.active) {\n return {\n initialValue: nextProps.value || '',\n value: nextProps.value || ''\n };\n }\n\n return null;\n }\n }]);\n\n return InPlaceEdit;\n}(react__WEBPACK_IMPORTED_MODULE_0___default.a.Component);\n\n\n;\n\n//# sourceURL=webpack:///./src/widgets/in-place-edit.jsx?"); /***/ }), @@ -1271,7 +1271,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) * /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var react_intl__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react-intl */ \"./node_modules/react-intl/lib/index.es.js\");\n/* harmony import */ var _config_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../config.js */ \"./src/config.js\");\nfunction _typeof(obj) { if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; } return _typeof(obj); }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }\n\nfunction _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === \"object\" || typeof call === \"function\")) { return call; } return _assertThisInitialized(self); }\n\nfunction _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function\"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); }\n\nfunction _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }\n\nfunction _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return self; }\n\n\n\n\nvar messages = Object(react_intl__WEBPACK_IMPORTED_MODULE_1__[\"defineMessages\"])({\n 'messaging_disabled': {\n \"id\": \"messaging_disabled_prompt\",\n \"defaultMessage\": \"Messaging disabled\"\n },\n 'type_new_message': {\n \"id\": \"new_message_prompt\",\n \"defaultMessage\": \"New message\"\n }\n});\n\nvar SendMessage = function (_React$PureComponent) {\n _inherits(SendMessage, _React$PureComponent);\n\n function SendMessage(props) {\n var _this;\n\n _classCallCheck(this, SendMessage);\n\n _this = _possibleConstructorReturn(this, _getPrototypeOf(SendMessage).call(this, props));\n _this.state = {\n message: '',\n keypressTimestamp: new Date().getTime() - _config_js__WEBPACK_IMPORTED_MODULE_2__[\"KEYPRESS_DELAY\"] - 1\n };\n _this.handlePasteEvent = _this.handlePasteEvent.bind(_assertThisInitialized(_assertThisInitialized(_this)));\n _this.handleAttachImage = _this.handleAttachImage.bind(_assertThisInitialized(_assertThisInitialized(_this)));\n _this.handleAttachFile = _this.handleAttachFile.bind(_assertThisInitialized(_assertThisInitialized(_this)));\n _this.handleSend = _this.handleSend.bind(_assertThisInitialized(_assertThisInitialized(_this)));\n _this.handleKeyPress = _this.handleKeyPress.bind(_assertThisInitialized(_assertThisInitialized(_this)));\n _this.handleMessageTyping = _this.handleMessageTyping.bind(_assertThisInitialized(_assertThisInitialized(_this)));\n return _this;\n }\n\n _createClass(SendMessage, [{\n key: \"componentDidMount\",\n value: function componentDidMount() {\n this.pasteFile.addEventListener('paste', this.handlePasteEvent, false);\n }\n }, {\n key: \"componentWillUnmount\",\n value: function componentWillUnmount() {\n this.pasteFile.removeEventListener('paste', this.handlePasteEvent, false);\n }\n }, {\n key: \"handlePasteEvent\",\n value: function handlePasteEvent(e) {\n var _this2 = this;\n\n if (this.props.disabled) {\n return;\n }\n\n if (filePasted(e, function (bits, mime, width, height, fname) {\n _this2.props.sendMessage(Drafty.insertImage(null, 0, mime, bits, width, height, fname));\n }, function (mime, bits, fname) {\n _this2.props.sendMessage(Drafty.attachFile(null, mime, bits, fname));\n }, this.props.onError)) {\n e.preventDefault();\n }\n }\n }, {\n key: \"handleAttachImage\",\n value: function handleAttachImage(e) {\n var _this3 = this;\n\n if (e.target.files && e.target.files.length > 0) {\n var file = e.target.files[0];\n\n if (file.size > MAX_INBAND_ATTACHMENT_SIZE || SUPPORTED_IMAGE_FORMATS.indexOf(file.type) < 0) {\n imageFileScaledToBase64(file, MAX_IMAGE_DIM, MAX_IMAGE_DIM, false, function (bits, mime, width, height, fname) {\n _this3.props.sendMessage(Drafty.insertImage(null, 0, mime, bits, width, height, fname));\n }, function (err) {\n _this3.props.onError(err, 'err');\n });\n } else {\n imageFileToBase64(file, function (bits, mime, width, height, fname) {\n _this3.props.sendMessage(Drafty.insertImage(null, 0, mime, bits, width, height, fname));\n }, function (err) {\n _this3.props.onError(err, 'err');\n });\n }\n }\n\n e.target.value = '';\n }\n }, {\n key: \"handleAttachFile\",\n value: function handleAttachFile(e) {\n var _this4 = this;\n\n if (e.target.files && e.target.files.length > 0) {\n var file = e.target.files[0];\n\n if (file.size > MAX_EXTERN_ATTACHMENT_SIZE) {\n this.props.onError(\"The file size \" + bytesToHumanSize(file.size) + \" exceeds the \" + bytesToHumanSize(MAX_EXTERN_ATTACHMENT_SIZE) + \" limit.\", 'err');\n } else if (file.size > MAX_INBAND_ATTACHMENT_SIZE) {\n var uploader = this.props.tinode.getLargeFileHelper();\n\n if (!uploader) {\n this.props.onError(\"Cannot initiate file upload.\");\n return;\n }\n\n var uploadCompletionPromise = uploader.upload(file);\n var msg = Drafty.attachFile(null, file.type, null, file.name, file.size, uploadCompletionPromise);\n this.props.sendMessage(msg, uploadCompletionPromise, uploader);\n } else {\n fileToBase64(file, function (mime, bits, fname) {\n _this4.props.sendMessage(Drafty.attachFile(null, mime, bits, fname));\n }, this.props.onError);\n }\n }\n\n e.target.value = '';\n }\n }, {\n key: \"handleSend\",\n value: function handleSend() {\n var message = this.state.message.trim();\n\n if (message) {\n this.props.sendMessage(this.state.message.trim());\n this.setState({\n message: ''\n });\n }\n }\n }, {\n key: \"handleKeyPress\",\n value: function handleKeyPress(e) {\n if (e.key === 'Enter') {\n if (!e.shiftKey) {\n e.preventDefault();\n e.stopPropagation();\n this.handleSend();\n }\n }\n }\n }, {\n key: \"handleMessageTyping\",\n value: function handleMessageTyping(e) {\n var newState = {\n message: e.target.value\n };\n var now = new Date().getTime();\n\n if (now - this.state.keypressTimestamp > _config_js__WEBPACK_IMPORTED_MODULE_2__[\"KEYPRESS_DELAY\"]) {\n var topic = this.props.tinode.getTopic(this.props.topic);\n\n if (topic.isSubscribed()) {\n topic.noteKeyPress();\n }\n\n newState.keypressTimestamp = now;\n }\n\n this.setState(newState);\n }\n }, {\n key: \"render\",\n value: function render() {\n var formatMessage = this.props.intl.formatMessage;\n var prompt = this.props.disabled ? formatMessage(messages.messaging_disabled) : formatMessage(messages.type_new_message);\n var instance = this;\n return react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"div\", {\n id: \"send-message-panel\"\n }, this.props.disabled ? react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"i\", {\n className: \"material-icons disabled\"\n }, \"photo\") : react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"a\", {\n href: \"javascript:;\",\n onClick: function onClick(e) {\n instance.attachImage.click();\n },\n title: \"Add image\"\n }, react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"i\", {\n className: \"material-icons secondary\"\n }, \"photo\")), this.props.disabled ? react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"i\", {\n className: \"material-icons disabled\"\n }, \"attach_file\") : react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"a\", {\n href: \"javascript:;\",\n onClick: function onClick(e) {\n instance.attachFile.click();\n },\n title: \"Attach file\"\n }, react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"i\", {\n className: \"material-icons secondary\"\n }, \"attach_file\")), react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"textarea\", {\n id: \"sendMessage\",\n placeholder: prompt,\n disabled: this.props.disabled,\n value: this.state.message,\n onChange: this.handleMessageTyping,\n onKeyPress: this.handleKeyPress,\n ref: function ref(_ref) {\n instance.pasteFile = _ref;\n },\n autoFocus: true\n }), this.props.disabled ? react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"i\", {\n className: \"material-icons disabled\"\n }, \"send\") : react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"a\", {\n href: \"javascript:;\",\n onClick: this.handleSend,\n title: \"Send\"\n }, react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"i\", {\n className: \"material-icons\"\n }, \"send\")), react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"input\", {\n type: \"file\",\n ref: function ref(_ref2) {\n instance.attachFile = _ref2;\n },\n onChange: this.handleAttachFile,\n style: {\n display: 'none'\n }\n }), react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"input\", {\n type: \"file\",\n ref: function ref(_ref3) {\n instance.attachImage = _ref3;\n },\n accept: \"image/*\",\n onChange: this.handleAttachImage,\n style: {\n display: 'none'\n }\n }));\n }\n }]);\n\n return SendMessage;\n}(react__WEBPACK_IMPORTED_MODULE_0___default.a.PureComponent);\n\n;\n/* harmony default export */ __webpack_exports__[\"default\"] = (Object(react_intl__WEBPACK_IMPORTED_MODULE_1__[\"injectIntl\"])(SendMessage));\n\n//# sourceURL=webpack:///./src/widgets/send-message.jsx?"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var react_intl__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react-intl */ \"./node_modules/react-intl/lib/index.es.js\");\n/* harmony import */ var tinode_sdk__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! tinode-sdk */ \"./node_modules/tinode-sdk/umd/tinode.prod.js\");\n/* harmony import */ var tinode_sdk__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(tinode_sdk__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var _config_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../config.js */ \"./src/config.js\");\n/* harmony import */ var _lib_blob_helpers_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../lib/blob-helpers.js */ \"./src/lib/blob-helpers.js\");\n/* harmony import */ var _lib_strformat_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../lib/strformat.js */ \"./src/lib/strformat.js\");\nfunction _typeof(obj) { if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; } return _typeof(obj); }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }\n\nfunction _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === \"object\" || typeof call === \"function\")) { return call; } return _assertThisInitialized(self); }\n\nfunction _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function\"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); }\n\nfunction _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }\n\nfunction _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return self; }\n\n\n\n\n\n\n\nvar messages = Object(react_intl__WEBPACK_IMPORTED_MODULE_1__[\"defineMessages\"])({\n 'messaging_disabled': {\n \"id\": \"messaging_disabled_prompt\",\n \"defaultMessage\": \"Messaging disabled\"\n },\n 'type_new_message': {\n \"id\": \"new_message_prompt\",\n \"defaultMessage\": \"New message\"\n },\n 'file_attachment_too_large': {\n \"id\": \"file_attachment_too_large\",\n \"defaultMessage\": \"The file size {size} exceeds the {limit} limit.\"\n },\n 'cannot_initiate_upload': {\n \"id\": \"cannot_initiate_file_upload\",\n \"defaultMessage\": \"Cannot initiate file upload.\"\n }\n});\n\nvar SendMessage = function (_React$PureComponent) {\n _inherits(SendMessage, _React$PureComponent);\n\n function SendMessage(props) {\n var _this;\n\n _classCallCheck(this, SendMessage);\n\n _this = _possibleConstructorReturn(this, _getPrototypeOf(SendMessage).call(this, props));\n _this.state = {\n message: '',\n keypressTimestamp: new Date().getTime() - _config_js__WEBPACK_IMPORTED_MODULE_3__[\"KEYPRESS_DELAY\"] - 1\n };\n _this.handlePasteEvent = _this.handlePasteEvent.bind(_assertThisInitialized(_assertThisInitialized(_this)));\n _this.handleAttachImage = _this.handleAttachImage.bind(_assertThisInitialized(_assertThisInitialized(_this)));\n _this.handleAttachFile = _this.handleAttachFile.bind(_assertThisInitialized(_assertThisInitialized(_this)));\n _this.handleSend = _this.handleSend.bind(_assertThisInitialized(_assertThisInitialized(_this)));\n _this.handleKeyPress = _this.handleKeyPress.bind(_assertThisInitialized(_assertThisInitialized(_this)));\n _this.handleMessageTyping = _this.handleMessageTyping.bind(_assertThisInitialized(_assertThisInitialized(_this)));\n return _this;\n }\n\n _createClass(SendMessage, [{\n key: \"componentDidMount\",\n value: function componentDidMount() {\n this.pasteFile.addEventListener('paste', this.handlePasteEvent, false);\n }\n }, {\n key: \"componentWillUnmount\",\n value: function componentWillUnmount() {\n this.pasteFile.removeEventListener('paste', this.handlePasteEvent, false);\n }\n }, {\n key: \"handlePasteEvent\",\n value: function handlePasteEvent(e) {\n var _this2 = this;\n\n if (this.props.disabled) {\n return;\n }\n\n if (Object(_lib_blob_helpers_js__WEBPACK_IMPORTED_MODULE_4__[\"filePasted\"])(e, function (bits, mime, width, height, fname) {\n _this2.props.sendMessage(tinode_sdk__WEBPACK_IMPORTED_MODULE_2__[\"Drafty\"].insertImage(null, 0, mime, bits, width, height, fname));\n }, function (mime, bits, fname) {\n _this2.props.sendMessage(tinode_sdk__WEBPACK_IMPORTED_MODULE_2__[\"Drafty\"].attachFile(null, mime, bits, fname));\n }, this.props.onError)) {\n e.preventDefault();\n }\n }\n }, {\n key: \"handleAttachImage\",\n value: function handleAttachImage(e) {\n var _this3 = this;\n\n if (e.target.files && e.target.files.length > 0) {\n var file = e.target.files[0];\n\n if (file.size > _config_js__WEBPACK_IMPORTED_MODULE_3__[\"MAX_INBAND_ATTACHMENT_SIZE\"] || _lib_blob_helpers_js__WEBPACK_IMPORTED_MODULE_4__[\"SUPPORTED_IMAGE_FORMATS\"].indexOf(file.type) < 0) {\n Object(_lib_blob_helpers_js__WEBPACK_IMPORTED_MODULE_4__[\"imageFileScaledToBase64\"])(file, _config_js__WEBPACK_IMPORTED_MODULE_3__[\"MAX_IMAGE_DIM\"], _config_js__WEBPACK_IMPORTED_MODULE_3__[\"MAX_IMAGE_DIM\"], false, function (bits, mime, width, height, fname) {\n _this3.props.sendMessage(tinode_sdk__WEBPACK_IMPORTED_MODULE_2__[\"Drafty\"].insertImage(null, 0, mime, bits, width, height, fname));\n }, function (err) {\n _this3.props.onError(err, 'err');\n });\n } else {\n Object(_lib_blob_helpers_js__WEBPACK_IMPORTED_MODULE_4__[\"imageFileToBase64\"])(file, function (bits, mime, width, height, fname) {\n _this3.props.sendMessage(tinode_sdk__WEBPACK_IMPORTED_MODULE_2__[\"Drafty\"].insertImage(null, 0, mime, bits, width, height, fname));\n }, function (err) {\n _this3.props.onError(err, 'err');\n });\n }\n }\n\n e.target.value = '';\n }\n }, {\n key: \"handleAttachFile\",\n value: function handleAttachFile(e) {\n var _this4 = this;\n\n var formatMessage = this.props.intl.formatMessage;\n\n if (e.target.files && e.target.files.length > 0) {\n var file = e.target.files[0];\n\n if (file.size > _config_js__WEBPACK_IMPORTED_MODULE_3__[\"MAX_EXTERN_ATTACHMENT_SIZE\"]) {\n this.props.onError(formatMessage(messages.file_attachment_too_large, {\n size: Object(_lib_strformat_js__WEBPACK_IMPORTED_MODULE_5__[\"bytesToHumanSize\"])(file.size),\n limit: Object(_lib_strformat_js__WEBPACK_IMPORTED_MODULE_5__[\"bytesToHumanSize\"])(_config_js__WEBPACK_IMPORTED_MODULE_3__[\"MAX_EXTERN_ATTACHMENT_SIZE\"])\n }), 'err');\n } else if (file.size > _config_js__WEBPACK_IMPORTED_MODULE_3__[\"MAX_INBAND_ATTACHMENT_SIZE\"]) {\n var uploader = this.props.tinode.getLargeFileHelper();\n\n if (!uploader) {\n this.props.onError(formatMessage(messages.cannot_initiate_upload));\n return;\n }\n\n var uploadCompletionPromise = uploader.upload(file);\n var msg = tinode_sdk__WEBPACK_IMPORTED_MODULE_2__[\"Drafty\"].attachFile(null, file.type, null, file.name, file.size, uploadCompletionPromise);\n this.props.sendMessage(msg, uploadCompletionPromise, uploader);\n } else {\n fileToBase64(file, function (mime, bits, fname) {\n _this4.props.sendMessage(tinode_sdk__WEBPACK_IMPORTED_MODULE_2__[\"Drafty\"].attachFile(null, mime, bits, fname));\n }, this.props.onError);\n }\n }\n\n e.target.value = '';\n }\n }, {\n key: \"handleSend\",\n value: function handleSend() {\n var message = this.state.message.trim();\n\n if (message) {\n this.props.sendMessage(this.state.message.trim());\n this.setState({\n message: ''\n });\n }\n }\n }, {\n key: \"handleKeyPress\",\n value: function handleKeyPress(e) {\n if (e.key === 'Enter') {\n if (!e.shiftKey) {\n e.preventDefault();\n e.stopPropagation();\n this.handleSend();\n }\n }\n }\n }, {\n key: \"handleMessageTyping\",\n value: function handleMessageTyping(e) {\n var newState = {\n message: e.target.value\n };\n var now = new Date().getTime();\n\n if (now - this.state.keypressTimestamp > _config_js__WEBPACK_IMPORTED_MODULE_3__[\"KEYPRESS_DELAY\"]) {\n var topic = this.props.tinode.getTopic(this.props.topic);\n\n if (topic.isSubscribed()) {\n topic.noteKeyPress();\n }\n\n newState.keypressTimestamp = now;\n }\n\n this.setState(newState);\n }\n }, {\n key: \"render\",\n value: function render() {\n var formatMessage = this.props.intl.formatMessage;\n var prompt = this.props.disabled ? formatMessage(messages.messaging_disabled) : formatMessage(messages.type_new_message);\n var instance = this;\n return react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"div\", {\n id: \"send-message-panel\"\n }, this.props.disabled ? react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"i\", {\n className: \"material-icons disabled\"\n }, \"photo\") : react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"a\", {\n href: \"javascript:;\",\n onClick: function onClick(e) {\n instance.attachImage.click();\n },\n title: \"Add image\"\n }, react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"i\", {\n className: \"material-icons secondary\"\n }, \"photo\")), this.props.disabled ? react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"i\", {\n className: \"material-icons disabled\"\n }, \"attach_file\") : react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"a\", {\n href: \"javascript:;\",\n onClick: function onClick(e) {\n instance.attachFile.click();\n },\n title: \"Attach file\"\n }, react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"i\", {\n className: \"material-icons secondary\"\n }, \"attach_file\")), react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"textarea\", {\n id: \"sendMessage\",\n placeholder: prompt,\n disabled: this.props.disabled,\n value: this.state.message,\n onChange: this.handleMessageTyping,\n onKeyPress: this.handleKeyPress,\n ref: function ref(_ref) {\n instance.pasteFile = _ref;\n },\n autoFocus: true\n }), this.props.disabled ? react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"i\", {\n className: \"material-icons disabled\"\n }, \"send\") : react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"a\", {\n href: \"javascript:;\",\n onClick: this.handleSend,\n title: \"Send\"\n }, react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"i\", {\n className: \"material-icons\"\n }, \"send\")), react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"input\", {\n type: \"file\",\n ref: function ref(_ref2) {\n instance.attachFile = _ref2;\n },\n onChange: this.handleAttachFile,\n style: {\n display: 'none'\n }\n }), react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"input\", {\n type: \"file\",\n ref: function ref(_ref3) {\n instance.attachImage = _ref3;\n },\n accept: \"image/*\",\n onChange: this.handleAttachImage,\n style: {\n display: 'none'\n }\n }));\n }\n }]);\n\n return SendMessage;\n}(react__WEBPACK_IMPORTED_MODULE_0___default.a.PureComponent);\n\n;\n/* harmony default export */ __webpack_exports__[\"default\"] = (Object(react_intl__WEBPACK_IMPORTED_MODULE_1__[\"injectIntl\"])(SendMessage));\n\n//# sourceURL=webpack:///./src/widgets/send-message.jsx?"); /***/ }), diff --git a/umd/index.prod.js b/umd/index.prod.js index 03a4b022..abf00eac 100644 --- a/umd/index.prod.js +++ b/umd/index.prod.js @@ -1,4 +1,4 @@ -!function(e,t){if("object"==typeof exports&&"object"==typeof module)module.exports=t();else if("function"==typeof define&&define.amd)define([],t);else{var n=t();for(var r in n)("object"==typeof exports?exports:e)[r]=n[r]}}(window,function(){return function(e){var t={};function n(r){if(t[r])return t[r].exports;var o=t[r]={i:r,l:!1,exports:{}};return e[r].call(o.exports,o,o.exports,n),o.l=!0,o.exports}return n.m=e,n.c=t,n.d=function(e,t,r){n.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:r})},n.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},n.t=function(e,t){if(1&t&&(e=n(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var r=Object.create(null);if(n.r(r),Object.defineProperty(r,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var o in e)n.d(r,o,function(t){return e[t]}.bind(null,o));return r},n.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return n.d(t,"a",t),t},n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},n.p="",n(n.s=18)}([function(e,t,n){"use strict";e.exports=n(19)},function(e,t,n){"use strict";n.r(t),n.d(t,"__extends",function(){return o}),n.d(t,"__assign",function(){return i}),n.d(t,"__rest",function(){return a}),n.d(t,"__decorate",function(){return s}),n.d(t,"__param",function(){return l}),n.d(t,"__metadata",function(){return u}),n.d(t,"__awaiter",function(){return c}),n.d(t,"__generator",function(){return p}),n.d(t,"__exportStar",function(){return f}),n.d(t,"__values",function(){return d}),n.d(t,"__read",function(){return h}),n.d(t,"__spread",function(){return m}),n.d(t,"__await",function(){return y}),n.d(t,"__asyncGenerator",function(){return v}),n.d(t,"__asyncDelegator",function(){return g}),n.d(t,"__asyncValues",function(){return b}),n.d(t,"__makeTemplateObject",function(){return _}),n.d(t,"__importStar",function(){return w}),n.d(t,"__importDefault",function(){return E}); +!function(e,t){if("object"==typeof exports&&"object"==typeof module)module.exports=t();else if("function"==typeof define&&define.amd)define([],t);else{var n=t();for(var r in n)("object"==typeof exports?exports:e)[r]=n[r]}}(window,function(){return function(e){var t={};function n(r){if(t[r])return t[r].exports;var o=t[r]={i:r,l:!1,exports:{}};return e[r].call(o.exports,o,o.exports,n),o.l=!0,o.exports}return n.m=e,n.c=t,n.d=function(e,t,r){n.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:r})},n.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},n.t=function(e,t){if(1&t&&(e=n(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var r=Object.create(null);if(n.r(r),Object.defineProperty(r,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var o in e)n.d(r,o,function(t){return e[t]}.bind(null,o));return r},n.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return n.d(t,"a",t),t},n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},n.p="",n(n.s=18)}([function(e,t,n){"use strict";e.exports=n(19)},function(e,t,n){"use strict";n.r(t),n.d(t,"__extends",function(){return o}),n.d(t,"__assign",function(){return i}),n.d(t,"__rest",function(){return a}),n.d(t,"__decorate",function(){return s}),n.d(t,"__param",function(){return l}),n.d(t,"__metadata",function(){return u}),n.d(t,"__awaiter",function(){return c}),n.d(t,"__generator",function(){return d}),n.d(t,"__exportStar",function(){return f}),n.d(t,"__values",function(){return p}),n.d(t,"__read",function(){return h}),n.d(t,"__spread",function(){return m}),n.d(t,"__await",function(){return y}),n.d(t,"__asyncGenerator",function(){return v}),n.d(t,"__asyncDelegator",function(){return g}),n.d(t,"__asyncValues",function(){return b}),n.d(t,"__makeTemplateObject",function(){return _}),n.d(t,"__importStar",function(){return w}),n.d(t,"__importDefault",function(){return E}); /*! ***************************************************************************** Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the Apache License, Version 2.0 (the "License"); you may not use @@ -13,12 +13,12 @@ MERCHANTABLITY OR NON-INFRINGEMENT. See the Apache Version 2.0 License for specific language governing permissions and limitations under the License. ***************************************************************************** */ -var r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n])};function o(e,t){function n(){this.constructor=e}r(e,t),e.prototype=null===t?Object.create(t):(n.prototype=t.prototype,new n)}var i=Object.assign||function(e){for(var t,n=1,r=arguments.length;n=0;s--)(o=e[s])&&(a=(i<3?o(a):i>3?o(t,n,a):o(t,n))||a);return i>3&&a&&Object.defineProperty(t,n,a),a}function l(e,t){return function(n,r){t(n,r,e)}}function u(e,t){if("object"==typeof Reflect&&"function"==typeof Reflect.metadata)return Reflect.metadata(e,t)}function c(e,t,n,r){return new(n||(n=Promise))(function(o,i){function a(e){try{l(r.next(e))}catch(e){i(e)}}function s(e){try{l(r.throw(e))}catch(e){i(e)}}function l(e){e.done?o(e.value):new n(function(t){t(e.value)}).then(a,s)}l((r=r.apply(e,t||[])).next())})}function p(e,t){var n,r,o,i,a={label:0,sent:function(){if(1&o[0])throw o[1];return o[1]},trys:[],ops:[]};return i={next:s(0),throw:s(1),return:s(2)},"function"==typeof Symbol&&(i[Symbol.iterator]=function(){return this}),i;function s(i){return function(s){return function(i){if(n)throw new TypeError("Generator is already executing.");for(;a;)try{if(n=1,r&&(o=r[2&i[0]?"return":i[0]?"throw":"next"])&&!(o=o.call(r,i[1])).done)return o;switch(r=0,o&&(i=[0,o.value]),i[0]){case 0:case 1:o=i;break;case 4:return a.label++,{value:i[1],done:!1};case 5:a.label++,r=i[1],i=[0];continue;case 7:i=a.ops.pop(),a.trys.pop();continue;default:if(!(o=(o=a.trys).length>0&&o[o.length-1])&&(6===i[0]||2===i[0])){a=0;continue}if(3===i[0]&&(!o||i[1]>o[0]&&i[1]=e.length&&(e=void 0),{value:e&&e[n++],done:!e}}}}function h(e,t){var n="function"==typeof Symbol&&e[Symbol.iterator];if(!n)return e;var r,o,i=n.call(e),a=[];try{for(;(void 0===t||t-- >0)&&!(r=i.next()).done;)a.push(r.value)}catch(e){o={error:e}}finally{try{r&&!r.done&&(n=i.return)&&n.call(i)}finally{if(o)throw o.error}}return a}function m(){for(var e=[],t=0;t1||s(e,t)})})}function s(e,t){try{!function(e){e.value instanceof y?Promise.resolve(e.value.v).then(l,u):c(i[0][2],e)}(o[e](t))}catch(e){c(i[0][3],e)}}function l(e){s("next",e)}function u(e){s("throw",e)}function c(e,t){e(t),i.shift(),i.length&&s(i[0][0],i[0][1])}}function g(e){var t,n;return t={},r("next"),r("throw",function(e){throw e}),r("return"),t[Symbol.iterator]=function(){return this},t;function r(r,o){e[r]&&(t[r]=function(t){return(n=!n)?{value:y(e[r](t)),done:"return"===r}:o?o(t):t})}}function b(e){if(!Symbol.asyncIterator)throw new TypeError("Symbol.asyncIterator is not defined.");var t=e[Symbol.asyncIterator];return t?t.call(e):d(e)}function _(e,t){return Object.defineProperty?Object.defineProperty(e,"raw",{value:t}):e.raw=t,e}function w(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var n in e)Object.hasOwnProperty.call(e,n)&&(t[n]=e[n]);return t.default=e,t}function E(e){return e&&e.__esModule?e:{default:e}}},function(e,t,n){(function(t){e.exports=function(){var e={},n=[{name:"ST",start:/(?:^|\W)(\*)[^\s*]/,end:/[^\s*](\*)(?=$|\W)/},{name:"EM",start:/(?:^|[\W_])(_)[^\s_]/,end:/[^\s_](_)(?=$|[\W_])/},{name:"DL",start:/(?:^|\W)(~)[^\s~]/,end:/[^\s~](~)(?=$|\W)/},{name:"CO",start:/(?:^|\W)(`)[^`]/,end:/[^`](`)(?=$|\W)/}],r=[{name:"LN",dataName:"url",pack:function(e){return/^[a-z]+:\/\//i.test(e)||(e="http://"+e),{url:e}},re:/(?:(?:https?|ftp):\/\/|www\.|ftp\.)[-A-Z0-9+&@#\/%=~_|$?!:,.]*[A-Z0-9+&@#\/%=~_|$]/gi},{name:"MN",dataName:"val",pack:function(e){return{val:e.slice(1)}},re:/\B@(\w\w+)/g},{name:"HT",dataName:"val",pack:function(e){return{val:e.slice(1)}},re:/\B#(\w\w+)/g}],o={ST:{name:"b",isVoid:!1},EM:{name:"i",isVoid:!1},DL:{name:"del",isVoid:!1},CO:{name:"tt",isVoid:!1},BR:{name:"br",isVoid:!0},LN:{name:"a",isVoid:!1},MN:{name:"a",isVoid:!1},HT:{name:"a",isVoid:!1},IM:{name:"img",isVoid:!0}};function i(e,t){var n;try{n=atob(e)}catch(e){console.log("Drafty: failed to decode base64-encoded object",e.message),n=atob("")}for(var r=n.length,o=new ArrayBuffer(r),i=new Uint8Array(o),a=0;a"},close:function(){return""}},EM:{open:function(){return""},close:function(){return""}},DL:{open:function(){return""},close:function(){return""}},CO:{open:function(){return""},close:function(){return""}},BR:{open:function(){return""},close:function(){return"
"}},LN:{open:function(e){return''},close:function(e){return""},props:function(e){return{href:e.url,target:"_blank"}}},MN:{open:function(e){return''},close:function(e){return""},props:function(e){return{name:e.val}}},HT:{open:function(e){return''},close:function(e){return""},props:function(e){return{name:e.val}}},IM:{open:function(e){var t=i(e.val,e.mime),n=e.ref?e.ref:t,r=(e.name?'':"")+'';return console.log("open: "+r),r},close:function(e){return e.name?"":""},props:function(e){return{src:i(e.val,e.mime),title:e.name,"data-width":e.width,"data-height":e.height,"data-name":e.name,"data-size":.75*e.val.length|0,"data-mime":e.mime}}}},s=function(){};s.parse=function(e){if("string"!=typeof e)return null;var t=e.split(/\r?\n/),o=[],i={},a=[];t.map(function(e){var t,s,l=[];if(n.map(function(t){l=l.concat(function(e,t,n,r){for(var o=[],i=0,a=e.slice(0);a.length>0;){var s=t.exec(a);if(null==s)break;var l=s.index+s[0].lastIndexOf(s[1]);a=a.slice(l+1),i=(l+=i)+1;var u=n?n.exec(a):null;if(null==u)break;var c=u.index+u[0].indexOf(u[1]);a=a.slice(c+1),i=(c+=i)+1,o.push({text:e.slice(l+1,c),children:[],start:l,end:c,type:r})}return o}(e,t.start,t.end,t.name))}),0==l.length)s={txt:e};else{l.sort(function(e,t){return e.start-t.start}),l=function e(t){if(0==t.length)return[];for(var n=[t[0]],r=t[0],o=1;or.end?(n.push(t[o]),r=t[o]):t[o].endn&&i.push({text:t.slice(n,s.start)});var l={type:s.type},u=e(t,s.start+1,s.end-1,s.children);u.length>0?l.children=u:l.text=s.text,i.push(l),n=s.end+1}return no;return o=e.offset+e.len,t})}(s.txt)).length>0){var c=[];for(var p in t){var f=t[p],d=i[f.unique];d||(d=o.length,i[f.unique]=d,o.push({tp:f.type,data:f.data})),c.push({at:f.offset,len:f.len,key:d})}s.ent=c}a.push(s)});var s={txt:""};if(a.length>0){s.txt=a[0].txt,s.fmt=(a[0].fmt||[]).concat(a[0].ent||[]);for(var l=1;l0&&(s.ent=o)}return s},s.insertImage=function(e,t,n,r,o,i,a,s,l){return(e=e||{txt:" "}).ent=e.ent||[],e.fmt=e.fmt||[],e.fmt.push({at:t,len:1,key:e.ent.length}),e.ent.push({tp:"IM",data:{mime:n,val:r,width:o,height:i,name:a,ref:l,size:0|s}}),e},s.attachFile=function(e,t,n,r,o,i){(e=e||{txt:""}).ent=e.ent||[],e.fmt=e.fmt||[],e.fmt.push({at:-1,len:0,key:e.ent.length});var a={tp:"EX",data:{mime:t,val:n,name:r,ref:i,size:0|o}};return i instanceof Promise&&(a.data.ref=i.then(function(e){a.data.ref=e},function(e){})),e.ent.push(a),e},s.UNSAFE_toHTML=function(e){var t,n,r,o=e.txt,i=e.fmt,s=e.ent,l=[];if(i)for(var u in i){var c,p=i[u],f=p.tp;if(!f){var d=s[p.key];d&&(f=d.tp,c=d.data)}a[f]&&(l.push({idx:p.at+p.len,what:a[f].close(c)}),l.push({idx:p.at,what:a[f].open(c)}))}for(var u in l.sort(function(e,t){return t.idx-e.idx}),l)l[u].what&&(t=o,n=l[u].idx,r=l[u].what,o=t.slice(0,n)+r+t.slice(n));return o},s.format=function(e,t,n){var r=e.txt,i=e.fmt,a=e.ent;if(r=r||"",!i)return[r];var s=[].concat(i);return s.map(function(e){e.at=e.at||0,e.len=e.len||0}),s.sort(function(e,t){return e.at-t.at==0?t.len-e.len:e.at-t.at}),s=s.map(function(e){var t,n=e.tp;return n||(e.key=e.key||0,t=a[e.key].data,n=a[e.key].tp),{tp:n,data:t,at:e.at,len:e.len}}),function e(t,n,r,i,a,s){for(var l=[],u=0;u0)for(var t in e.ent)if("EX"==e.ent[t].tp)return!0;return!1},s.attachments=function(e,t,n){if(e.ent&&e.ent.length>0)for(var r in e.ent)"EX"==e.ent[r].tp&&t.call(n,e.ent[r].data,r)},s.getDownloadUrl=function(e){var t=null;return e.val?t=i(e.val,e.mime):"string"==typeof e.ref&&(t=e.ref),t},s.isUploading=function(e){return e.ref instanceof Promise},s.getPreviewUrl=function(e){return e.val?i(e.val,e.mime):null},s.getEntitySize=function(e){return e.size?e.size:e.val?.75*e.val.length|0:0},s.getEntityMimeType=function(e){return e.mime||"text/plain"},s.tagName=function(e){return o[e]?o[e].name:void 0},s.attrValue=function(e,t){if(t&&a[e])return a[e].props(t)},s.getContentType=function(){return"text/x-drafty"},e=s;var l={};return function(t){"use strict";function n(e){return(n="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}var r,o="0.15.8-rc1";"undefined"!=typeof WebSocket&&(r=WebSocket),"undefined"==typeof btoa&&(t.btoa=function(){for(var e,t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"",n="",r=0,o=0,i="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";t.charAt(0|o)||(i="=",o%1);n+=i.charAt(63&r>>8-o%1*8)){if((e=t.charCodeAt(o+=.75))>255)throw new Error("'btoa' failed: The string to be encoded contains characters outside of the Latin1 range.");r=r<<8|e}return n}),"undefined"==typeof atob&&(t.atob=function(){var e=(arguments.length>0&&void 0!==arguments[0]?arguments[0]:"").replace(/=+$/,""),t="";if(e.length%4==1)throw new Error("'atob' failed: The string to be decoded is not correctly encoded.");for(var n,r=0,o=0,i=0;n=e.charAt(i++);~n&&(o=r%4?64*o+n:n,r++%4)?t+=String.fromCharCode(255&o>>(-2*r&6)):0)n="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=".indexOf(n);return t}),"undefined"==typeof window&&(t.window={WebSocket:r,URL:{createObjectURL:function(){throw new Error("Unable to use window.URL in a non browser application")}}});var i="0",a=o||"0.15",s="tinodejs/"+a,u=503,c="Connection failed";function p(e){return btoa(encodeURIComponent(e).replace(/%([0-9A-F]{2})/g,function(e,t){return String.fromCharCode("0x"+t)}))}function f(e,t,r){if(null==t)return e;if("object"!==n(t))return t||e;if(t instanceof Date)return t;if(t instanceof w)return new w(t);if(t instanceof Array)return t.length>0?t:e;for(var o in e||(e=t.constructor()),t)!t.hasOwnProperty(o)||!t[o]&&!1!==t[o]||r&&r[o]||"_generated"==o||(e[o]=f(e[o],t[o]));return e}function d(e,t,n,r){return e[t]=f(e[t],n,r),e[t]}function h(){var e=null;if("withCredentials"in new XMLHttpRequest)e=new XMLHttpRequest;else{if("undefined"==typeof XDomainRequest)throw new Error("browser not supported");e=new XDomainRequest}return e}function m(e,t){if("ts"===e&&"string"==typeof t&&t.length>=20&&t.length<=24){var r=new Date(t);if(r)return r}else if("acs"===e&&"object"===n(t))return new w(t);return t}function y(e,t){return"string"==typeof t&&t.length>128?"<"+t.length+", bytes: "+t.substring(0,12)+"..."+t.substring(t.length-12)+">":function(e,t){if(t instanceof Date)t=function(e){if(e&&0!=e.getTime()){var t=e.getUTCMilliseconds();return e.getUTCFullYear()+"-"+n(e.getUTCMonth()+1)+"-"+n(e.getUTCDate())+"T"+n(e.getUTCHours())+":"+n(e.getUTCMinutes())+":"+n(e.getUTCSeconds())+(t?"."+n(t,3):"")+"Z"}function n(e,t){return"0".repeat((t=t||2)-(""+e).length)+e}}(t);else if(null==t||!1===t||Array.isArray(t)&&0==t.length||"object"===n(t)&&0===Object.keys(t).length)return;return t}(0,t)}function v(e,t,n){var r=null;return"http"!==t&&"https"!==t&&"ws"!==t&&"wss"!==t||(r=t+"://","/"!==(r+=e).charAt(r.length-1)&&(r+="/"),r+="v"+i+"/channels","http"!==t&&"https"!==t||(r+="/lp"),r+="?apikey="+n),r}var g=function(e,t,o,i,a){var s=this,l=e,p=i,f=t,d=a,y=2e3,g=10,b=.3,_=null,w=0,E=!1,S=function(e){s.logger&&s.logger(e)};function T(e){var t=null;e.connect=function(n){return t&&1===t.readyState?Promise.resolve():(n&&(l=n),new Promise(function(n,o){var i=v(l,p?"wss":"ws",f);S("Connecting to: "+i);var a=new r(i);a.onopen=function(t){E=!1,e.onOpen&&e.onOpen(),n(),d&&(clearTimeout(_),_=null,w=0)},a.onclose=function(n){t=null,e.onDisconnect&&e.onDisconnect(null),!E&&d&&function(){var e=this;clearTimeout(_);var t=y*(Math.pow(2,w)*(1+b*Math.random()));w=w>=g?w:w+1,_=setTimeout(function(){S("Reconnecting, iter="+w+", timeout="+t),E||e.connect().catch(function(){})},t)}.call(e)},a.onerror=function(e){o(e)},a.onmessage=function(t){e.onMessage&&e.onMessage(t.data)},t=a}))},e.disconnect=function(){t&&(E=!0,t.close()),t=null},e.sendText=function(e){if(!t||t.readyState!=t.OPEN)throw new Error("Websocket is not connected");t.send(e)},e.isConnected=function(){return t&&1===t.readyState},e.transport=function(){return"ws"}}function k(e){var t=null,n=null,r=null;e.connect=function(r){return n?Promise.resolve():(r&&(l=r),new Promise(function(r,o){var i=v(l,p?"https":"http",f);S("Connecting to: "+i),(n=function n(r,o,i){var a=h();return a.onreadystatechange=function(s){if(4==a.readyState)if(201==a.status){var l=JSON.parse(a.responseText,m);a.responseText,t=r+"&sid="+l.ctrl.params.sid,(a=n(t)).send(null),e.onOpen&&e.onOpen(),o&&o()}else if(200==a.status)e.onMessage&&e.onMessage(a.responseText),(a=n(t)).send(null);else if(i&&i(a.responseText),e.onMessage&&a.responseText&&e.onMessage(a.responseText),e.onDisconnect){var p=a.status||u,f=a.responseText||c;e.onDisconnect(new Error(f+"("+p+")"))}},a.open("GET",r,!0),a}(i,r,o)).send(null)}).catch(function(){}))},e.disconnect=function(){r&&(r.onreadystatechange=void 0,r.abort(),r=null),n&&(n.onreadystatechange=void 0,n.abort(),n=null),e.onDisconnect&&e.onDisconnect(null),t=null},e.sendText=function(e){var n,o;if(n=t,(o=h()).onreadystatechange=function(e){if(4==o.readyState&&o.status>=400)throw new Error("LP sender failed, "+o.status)},o.open("POST",n,!0),!(r=o)||1!=r.readyState)throw new Error("Long poller failed to connect");r.send(e)},e.isConnected=function(){return n&&!0},e.transport=function(){return"lp"}}"lp"===o?k(this):"ws"===o?T(this):"object"==("undefined"==typeof window?"undefined":n(window))&&window.WebSocket?T(this):k(this),this.onMessage=void 0,this.onDisconnect=void 0,this.onOpen=void 0,this.logger=void 0},b=function(e,t,r,o,i){var l=this;this._appName=e||"Undefined",this._apiKey=r,this._browser="",this._platform="undefined",this._humanLanguage="xx","undefined"!=typeof navigator&&(this._browser=function(e){var t,n=(e=(e||"").replace(" (KHTML, like Gecko)","")).match(/(AppleWebKit\/[.\d]+)/i);if(n){for(var r=["chrome","safari","mobile","version"],o=e.substr(n.index+n[0].length).split(" "),i=[],a=0;a0?i[0][0]+"/"+i[0][1]:n[1]}else t=/trident/i.test(e)?(n=/(?:\brv[ :]+([.\d]+))|(?:\bMSIE ([.\d]+))/g.exec(e))?"MSIE/"+(n[1]||n[2]):"MSIE/?":/firefox/i.test(e)?(n=/Firefox\/([.\d]+)/g.exec(e))?"Firefox/"+n[1]:"Firefox/?":/presto/i.test(e)?(n=/Opera\/([.\d]+)/g.exec(e))?"Opera/"+n[1]:"Opera/?":(n=/([\w.]+)\/([.\d]+)/.exec(e))?n[1]+"/"+n[2]:(n=e.split(" "))[0];if((n=t.split("/")).length>1){var l=n[1].split(".");t=n[0]+"/"+l[0]+(l[1]?"."+l[1]:"")}return t}(navigator.userAgent),this._platform=navigator.platform,this._humanLanguage=navigator.language||"en-US"),this._loggingEnabled=!1,this._trimLongStrings=!1,this._myUID=null,this._authenticated=!1,this._login=null,this._authToken=null,this._inPacketCount=0,this._messageId=Math.floor(65535*Math.random()+65535),this._serverInfo=null,this._deviceToken=null,this._pendingPromises={},this._connection=new g(t,r,o,i,!0),this.logger=function(e){if(l._loggingEnabled){var t=new Date,n=("0"+t.getUTCHours()).slice(-2)+":"+("0"+t.getUTCMinutes()).slice(-2)+":"+("0"+t.getUTCSeconds()).slice(-2)+":"+("0"+t.getUTCMilliseconds()).slice(-3);console.log("["+n+"] "+e)}},this._connection.logger=this.logger,this._cache={};var p=this.cachePut=function(e,t,n){l._cache[e+":"+t]=n},d=this.cacheGet=function(e,t){return l._cache[e+":"+t]},h=this.cacheDel=function(e,t){delete l._cache[e+":"+t]},v=this.cacheMap=function(e,t){for(var n in l._cache)if(e(l._cache[n],n,t))break};this.attachCacheToTopic=function(e){e._tinode=l,e._cacheGetUser=function(e){var t=d("user",e);if(t)return{user:e,public:f({},t)}},e._cachePutUser=function(e,t){return p("user",e,f({},t.public))},e._cacheDelUser=function(e){return h("user",e)},e._cachePutSelf=function(){return p("topic",e.name,e)},e._cacheDelSelf=function(){return h("topic",e.name)}};var b=function(e,t,n,r){var o=l._pendingPromises[e];o&&(delete l._pendingPromises[e],t>=200&&t<400?o.resolve&&o.resolve(n):o.reject&&o.reject(new Error("Error: "+r+" ("+t+")")))},_=this.getNextUniqueId=function(){return 0!=l._messageId?""+l._messageId++:void 0};this.initPacket=function(e,t){switch(e){case"hi":return{hi:{id:_(),ver:a,ua:l._appName+" ("+(l._browser?l._browser+"; ":"")+l._platform+"); "+s,dev:l._deviceToken,lang:l._humanLanguage}};case"acc":return{acc:{id:_(),user:null,scheme:null,secret:null,login:!1,tags:null,desc:{},cred:{}}};case"login":return{login:{id:_(),scheme:null,secret:null}};case"sub":return{sub:{id:_(),topic:t,set:{},get:{}}};case"leave":return{leave:{id:_(),topic:t,unsub:!1}};case"pub":return{pub:{id:_(),topic:t,noecho:!1,head:null,content:{}}};case"get":return{get:{id:_(),topic:t,what:null,desc:{},sub:{},data:{}}};case"set":return{set:{id:_(),topic:t,desc:{},sub:{},tags:[]}};case"del":return{del:{id:_(),topic:t,what:null,delseq:null,user:null,hard:!1}};case"note":return{note:{topic:t,what:null,seq:void 0}};default:throw new Error("Unknown packet type requested: "+e)}},this.send=function(e,t){var r;t&&(r=function(e){var t=null;return e&&(t=new Promise(function(t,n){l._pendingPromises[e]={resolve:t,reject:n}})),t}(t)),e=function e(t){return Object.keys(t).forEach(function(r){"_"==r[0]?delete t[r]:t[r]?Array.isArray(t[r])&&0==t[r].length?delete t[r]:t[r]?"object"!=n(t[r])||t[r]instanceof Date||(e(t[r]),0==Object.getOwnPropertyNames(t[r]).length&&delete t[r]):delete t[r]:delete t[r]}),t}(e);var o=JSON.stringify(e);l.logger("out: "+(l._trimLongStrings?JSON.stringify(e,y):o));try{l._connection.sendText(o)}catch(e){if(!t)throw e;b(t,u,null,e.message)}return r},this.loginSuccessful=function(e){e.params&&e.params.user&&(l._myUID=e.params.user,l._authenticated=e&&e.code>=200&&e.code<300,e.params&&e.params.token&&e.params.expires?l._authToken={token:e.params.token,expires:new Date(e.params.expires)}:l._authToken=null,l.onLogin&&l.onLogin(e.code,e.text))},this._connection.onMessage=function(e){if(e){l._inPacketCount++,l.onRawMessage&&l.onRawMessage(e);var t=JSON.parse(e,m);if(t)if(l.logger("in: "+(l._trimLongStrings?JSON.stringify(t,y):e)),l.onMessage&&l.onMessage(t),t.ctrl)l.onCtrlMessage&&l.onCtrlMessage(t.ctrl),t.ctrl.id&&b(t.ctrl.id,t.ctrl.code,t.ctrl,t.ctrl.text),t.ctrl.params&&"data"==t.ctrl.params.what&&(n=d("topic",t.ctrl.topic))&&n._allMessagesReceived(t.ctrl.params.count);else if(t.meta)(n=d("topic",t.meta.topic))&&n._routeMeta(t.meta),l.onMetaMessage&&l.onMetaMessage(t.meta);else if(t.data)(n=d("topic",t.data.topic))&&n._routeData(t.data),l.onDataMessage&&l.onDataMessage(t.data);else if(t.pres)(n=d("topic",t.pres.topic))&&n._routePres(t.pres),l.onPresMessage&&l.onPresMessage(t.pres);else if(t.info){var n;(n=d("topic",t.info.topic))&&n._routeInfo(t.info),l.onInfoMessage&&l.onInfoMessage(t.info)}else l.logger("ERROR: Unknown packet received.");else l.logger("in: "+e),l.logger("ERROR: failed to parse data")}},this._connection.onOpen=function(){l.hello()},this._connection.onDisconnect=function(e){for(var t in l._inPacketCount=0,l._serverInfo=null,l._authenticated=!1,l._pendingPromises){var n=l._pendingPromises[t];n&&n.reject&&n.reject(new Error(c+" ("+u+")"))}l._pendingPromises={},v(function(e,t){0===t.lastIndexOf("topic:",0)&&e._resetSub()}),l.onDisconnect&&l.onDisconnect(e)}};b.credential=function(e,t,r,o){if("object"==n(e)){var i=e;t=i.val,r=i.params,o=i.resp,e=i.meth}return e&&(t||o)?[{meth:e,val:t,resp:o,params:r}]:null},b.topicType=function(e){return{me:"me",fnd:"fnd",grp:"grp",new:"grp",usr:"p2p"}["string"==typeof e?e.substring(0,3):"xxx"]},b.isNewGroupTopicName=function(e){return"string"==typeof e&&"new"==e.substring(0,3)},b.getVersion=function(){return a},b.setWebSocketProvider=function(e){r=e},b.getLibrary=function(){return s},b.MESSAGE_STATUS_NONE=0,b.MESSAGE_STATUS_QUEUED=1,b.MESSAGE_STATUS_SENDING=2,b.MESSAGE_STATUS_FAILED=3,b.MESSAGE_STATUS_SENT=4,b.MESSAGE_STATUS_RECEIVED=5,b.MESSAGE_STATUS_READ=6,b.MESSAGE_STATUS_TO_ME=7,b.DEL_CHAR="␡",b.prototype={connect:function(e){return this._connection.connect(e)},disconnect:function(){this._connection&&this._connection.disconnect()},isConnected:function(){return this._connection&&this._connection.isConnected()},isAuthenticated:function(){return this._authenticated},account:function(e,t,n,r,o){var i=this.initPacket("acc");return i.acc.user=e,i.acc.scheme=t,i.acc.secret=n,i.acc.login=r,o&&(i.acc.desc.defacs=o.defacs,i.acc.desc.public=o.public,i.acc.desc.private=o.private,i.acc.tags=o.tags,i.acc.cred=o.cred,i.acc.token=o.token),this.send(i,i.acc.id)},createAccount:function(e,t,n,r){var o=this,i=this.account("new",e,t,n,r);return n&&(i=i.then(function(e){return o.loginSuccessful(e),e})),i},createAccountBasic:function(e,t,n){return e=e||"",t=t||"",this.createAccount("basic",p(e+":"+t),!0,n)},updateAccountBasic:function(e,t,n,r){return t=t||"",n=n||"",this.account(e,"basic",p(t+":"+n),!1,r)},hello:function(){var e=this,t=this.initPacket("hi");return this.send(t,t.hi.id).then(function(t){return t.params&&(e._serverInfo=t.params),e.onConnect&&e.onConnect(),t}).catch(function(t){e.onDisconnect&&e.onDisconnect(t)})},setDeviceToken:function(e,t){var n=!1;return e&&e!=this._deviceToken&&(this._deviceToken=e,t&&this.isConnected()&&this.isAuthenticated()&&(this.send({hi:{dev:e}}),n=!0)),n},login:function(e,t,n){var r=this,o=this.initPacket("login");return o.login.scheme=e,o.login.secret=t,o.login.cred=n,this.send(o,o.login.id).then(function(e){return r.loginSuccessful(e),e})},loginBasic:function(e,t,n){var r=this;return this.login("basic",p(e+":"+t),n).then(function(t){return r._login=e,t})},loginToken:function(e,t){return this.login("token",e,t)},requestResetAuthSecret:function(e,t,n){return this.login("reset",p(e+":"+t+":"+n))},getAuthToken:function(){return this._authToken&&this._authToken.expires.getTime()>Date.now()?this._authToken:(this._authToken=null,null)},setAuthToken:function(e){this._authToken=e},subscribe:function(e,t,n){var r=this.initPacket("sub",e);return e||(e="new"),r.sub.get=t,n&&(n.sub&&(r.sub.set.sub=n.sub),b.isNewGroupTopicName(e)&&n.desc&&(r.sub.set.desc=n.desc),n.tags&&(r.sub.set.tags=n.tags)),this.send(r,r.sub.id)},leave:function(e,t){var n=this.initPacket("leave",e);return n.leave.unsub=t,this.send(n,n.leave.id)},createMessage:function(t,n,r){var o=this.initPacket("pub",t),i="string"==typeof n?e.parse(n):n;return i&&!e.isPlainText(i)&&(o.pub.head={mime:e.getContentType()},n=i),o.pub.noecho=r,o.pub.content=n,o.pub},publish:function(e,t,n){return this.publishMessage(this.createMessage(e,t,n))},publishMessage:function(e){return(e=Object.assign({},e)).seq=void 0,e.from=void 0,e.ts=void 0,this.send({pub:e},e.id)},getMeta:function(e,t){var n=this.initPacket("get",e);return n.get=f(n.get,t),this.send(n,n.get.id)},setMeta:function(e,t){var n=this.initPacket("set",e),r=[];return t&&["desc","sub","tags"].map(function(e){t.hasOwnProperty(e)&&(r.push(e),n.set[e]=t[e])}),0==r.length?Promise.reject(new Error("Invalid {set} parameters")):this.send(n,n.set.id)},delMessages:function(e,t,n){var r=this.initPacket("del",e);return r.del.what="msg",r.del.delseq=t,r.del.hard=n,this.send(r,r.del.id)},delTopic:function(e){var t=this,n=this.initPacket("del",e);return n.del.what="topic",this.send(n,n.del.id).then(function(n){return t.cacheDel("topic",e),t.ctrl})},delSubscription:function(e,t){var n=this.initPacket("del",e);return n.del.what="sub",n.del.user=t,this.send(n,n.del.id)},note:function(e,t,n){if(n<=0||n>=268435455)throw new Error("Invalid message id "+n);var r=this.initPacket("note",e);r.note.what=t,r.note.seq=n,this.send(r)},noteKeyPress:function(e){var t=this.initPacket("note",e);t.note.what="kp",this.send(t)},getTopic:function(e){var t=this.cacheGet("topic",e);return!t&&e&&(t="me"==e?new S:"fnd"==e?new T:new E(e),this.cachePut("topic",e,t),this.attachCacheToTopic(t)),t},newTopic:function(e){var t=new E("new",e);return this.attachCacheToTopic(t),t},newGroupTopicName:function(){return"new"+this.getNextUniqueId()},newTopicWith:function(e,t){var n=new E(e,t);return this.attachCacheToTopic(n),n},getMeTopic:function(){return this.getTopic("me")},getFndTopic:function(){return this.getTopic("fnd")},getLargeFileHelper:function(){return new k(this)},getCurrentUserID:function(){return this._myUID},getCurrentLogin:function(){return this._login},getServerInfo:function(){return this._serverInfo},enableLogging:function(e,t){this._loggingEnabled=e,this._trimLongStrings=e&&t},isTopicOnline:function(e){var t=this.getMeTopic(),n=t&&t.getContact(e);return n&&n.online},wantAkn:function(e){this._messageId=e?Math.floor(16777215*Math.random()+16777215):0},onWebsocketOpen:void 0,onConnect:void 0,onDisconnect:void 0,onLogin:void 0,onCtrlMessage:void 0,onDataMessage:void 0,onPresMessage:void 0,onMessage:void 0,onRawMessage:void 0};var _=function(e){this.topic=e;var t=e._tinode.getMeTopic();this.contact=t&&t.getContact(e.name),this.what={}};_.prototype={_get_ims:function(){var e=this.contact&&this.contact.updated,t=this.topic._lastDescUpdate||0;return e>t?e:t},withData:function(e,t,n){return this.what.data={since:e,before:t,limit:n},this},withLaterData:function(e){return this.withData(this.topic._maxSeq>0?this.topic._maxSeq+1:void 0,void 0,e)},withEarlierData:function(e){return this.withData(void 0,this.topic._minSeq>0?this.topic._minSeq:void 0,e)},withDesc:function(e){return this.what.desc={ims:e},this},withLaterDesc:function(){return this.withDesc(this._get_ims())},withSub:function(e,t,n){var r={ims:e,limit:t};return"me"==this.topic.getType()?r.topic=n:r.user=n,this.what.sub=r,this},withOneSub:function(e,t){return this.withSub(e,void 0,t)},withLaterOneSub:function(e){return this.withOneSub(this.topic._lastSubsUpdate,e)},withLaterSub:function(e){return this.withSub("p2p"==this.topic.getType()?this._get_ims():this.topic._lastSubsUpdate,e)},withTags:function(){return this.what.tags=!0,this},withDel:function(e,t){return(e||t)&&(this.what.del={since:e,limit:t}),this},withLaterDel:function(e){return this.withDel(this.topic._maxSeq>0?this.topic._maxDel+1:void 0,e)},build:function(){var e={},t=[],n=this;return["data","sub","desc","tags","del"].map(function(r){n.what.hasOwnProperty(r)&&(t.push(r),Object.getOwnPropertyNames(n.what[r]).length>0&&(e[r]=n.what[r]))}),t.length>0?e.what=t.join(" "):e=void 0,e}};var w=function e(t){t&&(this.given="number"==typeof t.given?t.given:e.decode(t.given),this.want="number"==typeof t.want?t.want:e.decode(t.want),this.mode=t.mode?"number"==typeof t.mode?t.mode:e.decode(t.mode):this.given&this.want)};w._NONE=0,w._JOIN=1,w._READ=2,w._WRITE=4,w._PRES=8,w._APPROVE=16,w._SHARE=32,w._DELETE=64,w._OWNER=128,w._BITMASK=w._JOIN|w._READ|w._WRITE|w._PRES|w._APPROVE|w._SHARE|w._DELETE|w._OWNER,w._INVALID=1048576,w.decode=function(e){if(!e)return null;if("number"==typeof e)return e&w._BITMASK;if("N"===e||"n"===e)return w._NONE;for(var t={J:w._JOIN,R:w._READ,W:w._WRITE,P:w._PRES,A:w._APPROVE,S:w._SHARE,D:w._DELETE,O:w._OWNER},n=w._NONE,r=0;r0)){l=!0;break}i=a-1}return l?a:r?-1:s<0?a+1:a}function r(e,t){var r=n(e,t,!1);return t.splice(r,0,e),t}return e=e||function(e,t){return e===t?0:e0)return n[0]},delRange:function(e,n){return t.splice(e,n-e)},size:function(){return t.length},reset:function(e){t=[]},forEach:function(e,n,r,o){n|=0,r=r||t.length;for(var i=n;i=300)return e;if(n._subscribed=!0,n.acs=e.params&&e.params.acs?e.params.acs:n.acs,n._new){n._new=!1,n.name=e.topic,n.created=e.ts,n.updated=e.ts,n.touched=e.ts,n._cachePutSelf();var r=n._tinode.getMeTopic();r&&r._processMetaSub([{_generated:!0,topic:n.name,created:e.ts,updated:e.ts,touched:e.ts,acs:n.acs}]),t&&t.desc&&(t.desc._generated=!0,n._processMetaDesc(t.desc))}return e})},createMessage:function(e,t){return this._tinode.createMessage(this.name,e,t)},publish:function(e,t){return this.publishMessage(this.createMessage(e,t))},publishMessage:function(t){var n=this;if(!this._subscribed)return Promise.reject(new Error("Cannot publish on inactive topic"));if(e.hasAttachments(t.content)&&!t.head.attachments){var r=[];e.attachments(t.content,function(e){r.push(e.ref)}),t.head.attachments=r}return t._sending=!0,this._tinode.publishMessage(t).then(function(e){return t._sending=!1,t.seq=e.params.seq,t.ts=e.ts,n._routeData(t),e}).catch(function(e){t._sending=!1,t._failed=!0})},publishDraft:function(e,t){var n=this;if(!t&&!this._subscribed)return Promise.reject(new Error("Cannot publish on inactive topic"));var r=e.seq||this._getQueuedSeqId();return e._generated||(e._generated=!0,e.seq=r,e.ts=new Date,e.from=this._tinode.getCurrentUserID(),e.noecho=!0,this._messages.put(e),this.onData&&this.onData(e)),(t||Promise.resolve()).then(function(){return e._cancelled?{code:300,text:"cancelled"}:n.publishMessage(e)},function(t){e._sending=!1,n._messages.delAt(n._messages.find(e)),n.onData&&n.onData()})},leave:function(e){var t=this;return this._subscribed||e?this._tinode.leave(this.name,e).then(function(n){return t._resetSub(),e&&t._gone(),n}):Promise.reject(new Error("Cannot leave inactive topic"))},getMeta:function(e){return this._subscribed?this._tinode.getMeta(this.name,e):Promise.reject(new Error("Cannot query inactive topic"))},getMessagesPage:function(e,t){var n=this,r=this.startMetaQuery();t?r.withLaterData(e):r.withEarlierData(e);var o=this.getMeta(r.build());return t||(o=o.then(function(e){e&&e.params&&!e.params.count&&(n._noEarlierMsgs=!0)})),o},setMeta:function(e){var t=this;return this._subscribed?(e.tags&&(e.tags=function(e){var t=[];if(Array.isArray(e)){for(var n=0,r=e.length;n1&&t.push(o)}t.sort().filter(function(e,t,n){return!t||e!=n[t-1]})}return 0==t.length&&t.push(b.DEL_CHAR),t}(e.tags)),this._tinode.setMeta(this.name,e).then(function(n){return n&&n.code>=300?n:(e.sub&&(n.params&&n.params.acs&&(e.sub.acs=n.params.acs,e.sub.updated=n.ts),e.sub.user||(e.sub.user=t._tinode.getCurrentUserID(),e.desc||(e.desc={})),e.sub._generated=!0,t._processMetaSub([e.sub])),e.desc&&(n.params&&n.params.acs&&(e.desc.acs=n.params.acs,e.desc.updated=n.ts),t._processMetaDesc(e.desc)),e.tags&&t._processMetaTags(e.tags),n)})):Promise.reject(new Error("Cannot update inactive topic"))},invite:function(e,t){return this.setMeta({sub:{user:e,mode:t}})},delMessages:function(e,t){var n=this;if(!this._subscribed)return Promise.reject(new Error("Cannot delete messages in inactive topic"));e.sort(function(e,t){return e.low=t.hi)});var r=e.reduce(function(e,t){return t.low<268435455&&(!t.hi||t.hi<268435455?e.push(t):e.push({low:t.low,hi:n._maxSeq+1})),e},[]);return(e.length>0?this._tinode.delMessages(this.name,r,t):Promise.resolve({params:{del:0}})).then(function(t){return t.params.del>n._maxDel&&(n._maxDel=t.params.del),e.map(function(e){e.hi?n.flushMessageRange(e.low,e.hi):n.flushMessage(e.low)}),n.onData&&n.onData(),t})},delMessagesAll:function(e){return this.delMessages([{low:1,hi:this._maxSeq+1,_all:!0}],e)},delMessagesList:function(e,t){e.sort(function(e,t){return e-t});var n=e.reduce(function(e,t){if(0==e.length)e.push({low:t});else{var n=e[e.length-1];!n.hi&&t!=n.low+1||t>n.hi?e.push({low:t}):n.hi=n.hi?Math.max(n.hi,t+1):t+1}return e},[]);return this.delMessages(n,t)},delTopic:function(){var e=this;return this._tinode.delTopic(this.name).then(function(t){return e._resetSub(),e._gone(),t})},delSubscription:function(e){var t=this;return this._subscribed?this._tinode.delSubscription(this.name,e).then(function(n){return delete t._users[e],t.onSubsUpdated&&t.onSubsUpdated(Object.keys(t._users)),n}):Promise.reject(new Error("Cannot delete subscription in inactive topic"))},note:function(e,t){var n=this._users[this._tinode.getCurrentUserID()];n?((!n[e]||n[e]0)for(var o in this._users){var i=this._users[o];i.user!==r&&i[e]>=t&&n++}return n},msgReadCount:function(e){return this.msgReceiptCount("read",e)},msgRecvCount:function(e){return this.msgReceiptCount("recv",e)},msgHasMoreMessages:function(e){return e?this.seq>this._maxSeq:this._minSeq>1&&!this._noEarlierMsgs},isNewMessage:function(e){return this._maxSeq<=e},flushMessage:function(e){var t=this._messages.find({seq:e});return t>=0?this._messages.delAt(t):void 0},flushMessageRange:function(e,t){var n=this._messages.find({seq:e});return n>=0?this._messages.delRange(n,this._messages.find({seq:t},!0)):[]},cancelSend:function(e){var t=this._messages.find({seq:e});if(t>=0){var n=this._messages.getAt(t);if(1==this.msgStatus(n))return n._cancelled=!0,this._messages.delAt(t),!0}return!1},getType:function(){return b.topicType(this.name)},getAccessMode:function(){return this.acs},getDefaultAccess:function(){return this.defacs},startMetaQuery:function(){return new _(this)},msgStatus:function(e){var t=0;return e.from==this._tinode.getCurrentUserID()?e._sending?t=2:e._failed?t=3:e.seq>=268435455?t=1:this.msgReadCount(e.seq)>0?t=6:this.msgRecvCount(e.seq)>0?t=5:e.seq>0&&(t=4):t=7,t},_routeData:function(e){e.content&&((!this.touched||this.touchedthis._maxSeq&&(this._maxSeq=e.seq),(e.seq0&&(this._lastSubsUpdate=e.ts,this._processMetaSub(e.sub)),e.del&&this._processDelMessages(e.del.clear,e.del.delseq),e.tags&&this._processMetaTags(e.tags),this.onMeta&&this.onMeta(e)},_routePres:function(e){var t;switch(e.what){case"del":this._processDelMessages(e.clear,e.delseq);break;case"on":case"off":(t=this._users[e.src])?t.online="on"==e.what:this._tinode.logger("Presence update for an unknown user",this.name,e.src);break;case"acs":var n="me"==e.src?this._tinode.getCurrentUserID():e.src;if(t=this._users[n])t.acs.updateAll(e.dacs),n==this._tinode.getCurrentUserID()&&this.acs.updateAll(e.dacs),t.acs&&t.acs.mode!=w._NONE||("p2p"==this.getType()&&this.leave(),this._processMetaSub([{user:n,deleted:new Date,_generated:!0}]));else{var r=(new w).updateAll(e.dacs);r&&r.mode!=w._NONE&&((t=this._cacheGetUser(n))?t.acs=r:(t={user:n,acs:r},this.getMeta(this.startMetaQuery().withOneSub(void 0,n).build())),t._generated=!0,t.updated=new Date,this._processMetaSub([t]))}break;default:this._tinode.logger("Ignored presence update",e.what)}this.onPres&&this.onPres(e)},_routeInfo:function(e){if("kp"!==e.what){var t=this._users[e.from];t&&(t[e.what]=e.seq)}this.onInfo&&this.onInfo(e)},_processMetaDesc:function(e,t){if(f(this,e),"string"==typeof this.created&&(this.created=new Date(this.created)),"string"==typeof this.updated&&(this.updated=new Date(this.updated)),"string"==typeof this.touched&&(this.touched=new Date(this.touched)),"me"!==this.name&&!t&&!e._generated){var n=this._tinode.getMeTopic();n&&n._processMetaSub([{_generated:!0,topic:this.name,updated:this.updated,touched:this.touched,acs:this.acs,public:this.public,private:this.private}])}this.onMetaDesc&&this.onMetaDesc(this)},_processMetaSub:function(e){var t=void 0;for(var n in e){var r=e[n];if(r.user){r.updated=new Date(r.updated),r.deleted=r.deleted?new Date(r.deleted):null;var o=null;r.deleted?(delete this._users[r.user],o=r):((o=this._users[r.user])||(o=this._cacheGetUser(r.user)),o=this._updateCachedUser(r.user,r,r._generated)),this.onMetaSub&&this.onMetaSub(o)}else r._generated||(t=r)}t&&this.onMetaDesc&&this.onMetaDesc(t),this.onSubsUpdated&&this.onSubsUpdated(Object.keys(this._users))},_processMetaTags:function(e){1==e.length&&e[0]==b.DEL_CHAR&&(e=[]),this._tags=e,this.onTagsUpdated&&this.onTagsUpdated(e)},_processDelMessages:function(e,t){this._maxDel=Math.max(e,this._maxDel),this.clear=Math.max(e,this.clear);var n=this,r=0;Array.isArray(t)&&t.map(function(e){if(e.hi)for(var t=e.low;t0&&this.onData&&this.onData()},_allMessagesReceived:function(e){this.onAllMessagesReceived&&this.onAllMessagesReceived(e)},_resetSub:function(){this._subscribed=!1},_gone:function(){this._messages.reset(),this._users={},this.acs=new w(null),this.private=null,this.public=null,this._maxSeq=0,this._minSeq=0,this._subscribed=!1;var e=this._tinode.getMeTopic();e&&e._routePres({_generated:!0,what:"gone",topic:"me",src:this.name}),this.onDeleteTopic&&this.onDeleteTopic()},_updateCachedUser:function(e,t,n){var r=this._cacheGetUser(e);return r?r=f(r,t):(n&&this.getMeta(this.startMetaQuery().withLaterOneSub(e).build()),r=f({},t)),this._cachePutUser(e,r),d(this._users,e,r)},_getQueuedSeqId:function(){return this._queuedSeqId++}};var S=function(e){E.call(this,"me",e),this._contacts={},e&&(this.onContactUpdate=e.onContactUpdate)};S.prototype=Object.create(E.prototype,{_processMetaSub:{value:function(e){var t=0;for(var n in e){var r=e[n],o=r.topic;if("fnd"!=o&&"me"!=o){r.updated=new Date(r.updated),r.touched=r.touched?new Date(r.touched):null,r.deleted=r.deleted?new Date(r.deleted):null,r.seq=0|r.seq,r.recv=0|r.recv,r.read=0|r.read,r.unread=r.seq-r.read;var i=null;if(r.deleted)i=r,delete this._contacts[o];else if(r.seen&&r.seen.when&&(r.seen.when=new Date(r.seen.when)),i=d(this._contacts,o,r),"p2p"==b.topicType(o)&&this._cachePutUser(o,i),!r._generated){var a=this._tinode.getTopic(o);a&&a._processMetaDesc(r,!0)}t++,this.onMetaSub&&this.onMetaSub(i)}}t>0&&this.onSubsUpdated&&this.onSubsUpdated(Object.keys(this._contacts))},enumerable:!0,configurable:!0,writable:!1},_routePres:{value:function(e){var t=this._contacts[e.src];if(t){switch(e.what){case"on":t.online=!0;break;case"off":t.online&&(t.online=!1,t.seen?t.seen.when=new Date:t.seen={when:new Date});break;case"msg":t.touched=new Date,t.seq=0|e.seq,t.unread=t.seq-t.read;break;case"upd":this.getMeta(this.startMetaQuery().withLaterOneSub(e.src).build());break;case"acs":t.acs?t.acs.updateAll(e.dacs):t.acs=(new w).updateAll(e.dacs);break;case"ua":t.seen={when:new Date,ua:e.ua};break;case"recv":t.recv=t.recv?Math.max(t.recv,e.seq):0|e.seq;break;case"read":t.read=t.read?Math.max(t.read,e.seq):0|e.seq,t.unread=t.seq-t.read;break;case"gone":delete this._contacts[e.src]}this.onContactUpdate&&this.onContactUpdate(e.what,t)}else if("acs"==e.what){var n=new w(e.dacs);if(!n||n.mode==w._INVALID)return void this._tinode.logger("Invalid access mode update",e.src,e.dacs);if(n.mode==w._NONE)return void this._tinode.logger("Removing non-existent subscription",e.src,e.dacs);this.getMeta(this.startMetaQuery().withOneSub(void 0,e.src).build()),this._contacts[e.src]={topic:e.src,online:!1,acs:n}}this.onPres&&this.onPres(e)},enumerable:!0,configurable:!0,writable:!1},publish:{value:function(){return Promise.reject(new Error("Publishing to 'me' is not supported"))},enumerable:!0,configurable:!0,writable:!1},contacts:{value:function(e,t){var n=e||this.onMetaSub;if(n)for(var r in this._contacts)n.call(t,this._contacts[r],r,this._contacts)},enumerable:!0,configurable:!0,writable:!0},setMsgReadRecv:{value:function(e,t,n,r){var o,i=this._contacts[e],a=!1;i&&(n|=0,"recv"===t?(o=i.recv,i.recv=i.recv?Math.max(i.recv,n):n,a=o!=i.recv):"read"===t?(o=i.read,i.read=i.read?Math.max(i.read,n):n,i.unread=i.seq-i.read,a=o!=i.read,i.recv0&&this.onSubsUpdated&&this.onSubsUpdated(Object.keys(this._contacts))},enumerable:!0,configurable:!0,writable:!1},publish:{value:function(){return Promise.reject(new Error("Publishing to 'fnd' is not supported"))},enumerable:!0,configurable:!0,writable:!1},setMeta:{value:function(e){var t=this;return Object.getPrototypeOf(T.prototype).setMeta.call(this,e).then(function(){Object.keys(t._contacts).length>0&&(t._contacts={},t.onSubsUpdated&&t.onSubsUpdated([]))})},enumerable:!0,configurable:!0,writable:!1},contacts:{value:function(e,t){var n=e||this.onMetaSub;if(n)for(var r in this._contacts)n.call(t,this._contacts[r],r,this._contacts)},enumerable:!0,configurable:!0,writable:!0}}),T.prototype.constructor=T;var k=function(e){this._tinode=e,this._apiKey=e._apiKey,this._authToken=e.getAuthToken(),this._msgId=e.getNextUniqueId(),this.xhr=h(),this.toResolve=null,this.toReject=null,this.onProgress=null,this.onSuccess=null,this.onFailure=null};k.prototype={upload:function(e,t,n,r){var o=this;if(!this._authToken)throw new Error("Must authenticate first");var a=this;this.xhr.open("POST","/v"+i+"/file/u/",!0),this.xhr.setRequestHeader("X-Tinode-APIKey",this._apiKey),this.xhr.setRequestHeader("X-Tinode-Auth","Token "+this._authToken.token);var s=new Promise(function(e,t){o.toResolve=e,o.toReject=t});this.onProgress=t,this.onSuccess=n,this.onFailure=r,this.xhr.upload.onprogress=function(e){e.lengthComputable&&a.onProgress&&a.onProgress(e.loaded/e.total)},this.xhr.onload=function(){var e;try{e=JSON.parse(this.response,m)}catch(e){a._tinode.logger("Invalid server response in LargeFileHelper",this.response)}this.status>=200&&this.status<300?(a.toResolve&&a.toResolve(e.ctrl.params.url),a.onSuccess&&a.onSuccess(e.ctrl)):this.status>=400?(a.toReject&&a.toReject(new Error(e.ctrl.text+" ("+e.ctrl.code+")")),a.onFailure&&a.onFailure(e.ctrl)):a._tinode.logger("Unexpected server response status",this.status,this.response)},this.xhr.onerror=function(e){a.toReject&&a.toReject(new Error("failed")),a.onFailure&&a.onFailure(null)},this.xhr.onabort=function(e){a.toReject&&a.toReject(new Error("upload cancelled by user")),a.onFailure&&a.onFailure(null)};try{var l=new FormData;l.append("file",e),l.set("id",this._msgId),this.xhr.send(l)}catch(e){this.toReject&&this.toReject(e),this.onFailure&&this.onFailure(null)}return s},download:function(e,t,n,r){var o=this;if(/^(?:(?:[a-z]+:)?\/\/)/i.test(e))throw new Error("The URL '"+e+"' must be relative, not absolute");if(!this._authToken)throw new Error("Must authenticate first");var i=this;this.xhr.open("GET",e,!0),this.xhr.setRequestHeader("X-Tinode-APIKey",this._apiKey),this.xhr.setRequestHeader("X-Tinode-Auth","Token "+this._authToken.token),this.xhr.responseType="blob",this.onProgress=r,this.xhr.onprogress=function(e){i.onProgress&&i.onProgress(e.loaded)};var a=new Promise(function(e,t){o.toResolve=e,o.toReject=t});this.xhr.onload=function(){if(200==this.status){var e=document.createElement("a");e.href=window.URL.createObjectURL(new Blob([this.response],{type:n})),e.style.display="none",e.setAttribute("download",t),document.body.appendChild(e),e.click(),document.body.removeChild(e),window.URL.revokeObjectURL(e.href),i.toResolve&&i.toResolve()}else if(this.status>=400&&i.toReject){var r=new FileReader;r.onload=function(){try{var e=JSON.parse(this.result,m);i.toReject(new Error(e.ctrl.text+" ("+e.ctrl.code+")"))}catch(e){i._tinode.logger("Invalid server response in LargeFileHelper",this.result),i.toReject(e)}},r.readAsText(this.response)}},this.xhr.onerror=function(e){i.toReject&&i.toReject(new Error("failed"))},this.xhr.onabort=function(){i.toReject&&i.toReject(null)};try{this.xhr.send()}catch(e){this.toReject&&this.toReject(e)}return a},cancel:function(){this.xhr&&this.xhr.readyState<4&&this.xhr.abort()},getId:function(){return this._msgId}};var C=function e(t,n){this.status=e.STATUS_NONE,this.topic=t,this.content=n};C.STATUS_NONE=0,C.STATUS_QUEUED=1,C.STATUS_SENDING=2,C.STATUS_FAILED=3,C.STATUS_SENT=4,C.STATUS_RECEIVED=5,C.STATUS_READ=6,C.STATUS_TO_ME=7,(C.prototype={toJSON:function(){},fromJSON:function(e){}}).constructor=C,(l=b).Drafty=e}.call(this,void 0!==t?t:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{}),l}()}).call(this,n(10))},function(e,t,n){e.exports=n(37)()},function(e,t,n){"use strict";var r=n(23).default;n(30),(t=e.exports=r).default=t},function(e,t,n){"use strict";(t=e.exports=n(39).default).default=t},function(e,t,n){"use strict";!function e(){if("undefined"!=typeof __REACT_DEVTOOLS_GLOBAL_HOOK__&&"function"==typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE)try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(e)}catch(e){console.error(e)}}(),e.exports=n(20)},function(e,t,n){"use strict";var r=n(31).default;n(36),(t=e.exports=r).default=t},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=n(1),o={NODE_CLIENT:!1,NODE_ADMIN:!1,SDK_VERSION:"${JSCORE_VERSION}"},i=function(e,t){if(!e)throw a(t)},a=function(e){return new Error("Firebase Database ("+o.SDK_VERSION+") INTERNAL ASSERT FAILED: "+e)},s=function(e){for(var t=[],n=0,r=0;r>6|192,t[n++]=63&o|128):55296==(64512&o)&&r+1>18|240,t[n++]=o>>12&63|128,t[n++]=o>>6&63|128,t[n++]=63&o|128):(t[n++]=o>>12|224,t[n++]=o>>6&63|128,t[n++]=63&o|128)}return t},l={byteToCharMap_:null,charToByteMap_:null,byteToCharMapWebSafe_:null,charToByteMapWebSafe_:null,ENCODED_VALS_BASE:"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789",get ENCODED_VALS(){return this.ENCODED_VALS_BASE+"+/="},get ENCODED_VALS_WEBSAFE(){return this.ENCODED_VALS_BASE+"-_."},HAS_NATIVE_SUPPORT:"function"==typeof atob,encodeByteArray:function(e,t){if(!Array.isArray(e))throw Error("encodeByteArray takes an array as a parameter");this.init_();for(var n=t?this.byteToCharMapWebSafe_:this.byteToCharMap_,r=[],o=0;o>2,p=(3&i)<<4|s>>4,f=(15&s)<<2|u>>6,d=63&u;l||(d=64,a||(f=64)),r.push(n[c],n[p],n[f],n[d])}return r.join("")},encodeString:function(e,t){return this.HAS_NATIVE_SUPPORT&&!t?btoa(e):this.encodeByteArray(s(e),t)},decodeString:function(e,t){return this.HAS_NATIVE_SUPPORT&&!t?atob(e):function(e){for(var t=[],n=0,r=0;n191&&o<224){var i=e[n++];t[r++]=String.fromCharCode((31&o)<<6|63&i)}else if(o>239&&o<365){var a=((7&o)<<18|(63&(i=e[n++]))<<12|(63&(s=e[n++]))<<6|63&e[n++])-65536;t[r++]=String.fromCharCode(55296+(a>>10)),t[r++]=String.fromCharCode(56320+(1023&a))}else{i=e[n++];var s=e[n++];t[r++]=String.fromCharCode((15&o)<<12|(63&i)<<6|63&s)}}return t.join("")}(this.decodeStringToByteArray(e,t))},decodeStringToByteArray:function(e,t){this.init_();for(var n=t?this.charToByteMapWebSafe_:this.charToByteMap_,r=[],o=0;o>4;if(r.push(u),64!=s){var c=a<<4&240|s>>2;if(r.push(c),64!=l){var p=s<<6&192|l;r.push(p)}}}return r},init_:function(){if(!this.byteToCharMap_){this.byteToCharMap_={},this.charToByteMap_={},this.byteToCharMapWebSafe_={},this.charToByteMapWebSafe_={};for(var e=0;e=this.ENCODED_VALS_BASE.length&&(this.charToByteMap_[this.ENCODED_VALS_WEBSAFE.charAt(e)]=e,this.charToByteMapWebSafe_[this.ENCODED_VALS.charAt(e)]=e)}}},u=function(e){try{return l.decodeString(e,!0)}catch(e){console.error("base64Decode failed: ",e)}return null};function c(e,t){if(!(t instanceof Object))return t;switch(t.constructor){case Date:return new Date(t.getTime());case Object:void 0===e&&(e={});break;case Array:e=[];break;default:return t}for(var n in t)t.hasOwnProperty(n)&&(e[n]=c(e[n],t[n]));return e}var p=function(){function e(){var e=this;this.promise=new Promise(function(t,n){e.resolve=t,e.reject=n})}return e.prototype.wrapCallback=function(e){var t=this;return function(n,r){n?t.reject(n):t.resolve(r),"function"==typeof e&&(t.promise.catch(function(){}),1===e.length?e(n):e(n,r))}},e}(),f=function(){return"undefined"!=typeof navigator&&"string"==typeof navigator.userAgent?navigator.userAgent:""},d="FirebaseError",h=Error.captureStackTrace;var m=function(){return function(e,t){if(this.code=e,this.message=t,h)h(this,y.prototype.create);else try{throw Error.apply(this,arguments)}catch(e){this.name=d,Object.defineProperty(this,"stack",{get:function(){return e.stack}})}}}();m.prototype=Object.create(Error.prototype),m.prototype.constructor=m,m.prototype.name=d;var y=function(){function e(e,t,n){this.service=e,this.serviceName=t,this.errors=n,this.pattern=/\{\$([^}]+)}/g}return e.prototype.create=function(e,t){void 0===t&&(t={});var n,r=this.errors[e],o=this.service+"/"+e;n=void 0===r?"Error":r.replace(this.pattern,function(e,n){var r=t[n];return void 0!==r?r.toString():"<"+n+"?>"}),n=this.serviceName+": "+n+" ("+o+").";var i=new m(o,n);for(var a in t)t.hasOwnProperty(a)&&"_"!==a.slice(-1)&&(i[a]=t[a]);return i},e}();function v(e){return JSON.parse(e)}var g=function(e){var t={},n={},r={},o="";try{var i=e.split(".");t=v(u(i[0])||""),n=v(u(i[1])||""),o=i[2],r=n.d||{},delete n.d}catch(e){}return{header:t,claims:n,data:r,signature:o}},b=function(e,t){for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&t(n,e[n])},_=function(e,t){return b(t,function(t,n){e[t]=n}),e},w=function(e,t,n){for(var r in e)if(t.call(n,e[r],r,e))return r},E=function(e){function t(){var t=e.call(this)||this;t.chain_=[],t.buf_=[],t.W_=[],t.pad_=[],t.inbuf_=0,t.total_=0,t.blockSize=64,t.pad_[0]=128;for(var n=1;n>>31)}var i,a,s=this.chain_[0],l=this.chain_[1],u=this.chain_[2],c=this.chain_[3],p=this.chain_[4];for(r=0;r<80;r++){r<40?r<20?(i=c^l&(u^c),a=1518500249):(i=l^u^c,a=1859775393):r<60?(i=l&u|c&(l|u),a=2400959708):(i=l^u^c,a=3395469782);o=(s<<5|s>>>27)+i+p+a+n[r]&4294967295;p=c,c=u,u=4294967295&(l<<30|l>>>2),l=s,s=o}this.chain_[0]=this.chain_[0]+s&4294967295,this.chain_[1]=this.chain_[1]+l&4294967295,this.chain_[2]=this.chain_[2]+u&4294967295,this.chain_[3]=this.chain_[3]+c&4294967295,this.chain_[4]=this.chain_[4]+p&4294967295},t.prototype.update=function(e,t){if(null!=e){void 0===t&&(t=e.length);for(var n=t-this.blockSize,r=0,o=this.buf_,i=this.inbuf_;r=56;n--)this.buf_[n]=255&t,t/=256;this.compress_(this.buf_);var r=0;for(n=0;n<5;n++)for(var o=24;o>=0;o-=8)e[r]=this.chain_[n]>>o&255,++r;return e},t}(function(){return function(){this.blockSize=-1}}());var S=function(){function e(e,t){var n=this;this.observers=[],this.unsubscribes=[],this.observerCount=0,this.task=Promise.resolve(),this.finalized=!1,this.onNoObservers=t,this.task.then(function(){e(n)}).catch(function(e){n.error(e)})}return e.prototype.next=function(e){this.forEachObserver(function(t){t.next(e)})},e.prototype.error=function(e){this.forEachObserver(function(t){t.error(e)}),this.close(e)},e.prototype.complete=function(){this.forEachObserver(function(e){e.complete()}),this.close()},e.prototype.subscribe=function(e,t,n){var r,o=this;if(void 0===e&&void 0===t&&void 0===n)throw new Error("Missing Observer.");void 0===(r=function(e,t){if("object"!=typeof e||null===e)return!1;for(var n=0,r=t;n 4. Need to update it?")}var o=e+" failed: ";return o+=r+" argument "}t.assert=i,t.assertionError=a,t.base64=l,t.base64Decode=u,t.base64Encode=function(e){var t=s(e);return l.encodeByteArray(t,!0)},t.CONSTANTS=o,t.deepCopy=function(e){return c(void 0,e)},t.deepExtend=c,t.patchProperty=function(e,t,n){e[t]=n},t.Deferred=p,t.getUA=f,t.isMobileCordova=function(){return"undefined"!=typeof window&&!!(window.cordova||window.phonegap||window.PhoneGap)&&/ios|iphone|ipod|ipad|android|blackberry|iemobile/i.test(f())},t.isNodeSdk=function(){return!0===o.NODE_CLIENT||!0===o.NODE_ADMIN},t.isReactNative=function(){return"object"==typeof navigator&&"ReactNative"===navigator.product},t.ErrorFactory=y,t.FirebaseError=m,t.patchCapture=function(e){var t=h;return h=e,t},t.jsonEval=v,t.stringify=function(e){return JSON.stringify(e)},t.decode=g,t.isAdmin=function(e){var t=g(e).claims;return"object"==typeof t&&!0===t.admin},t.issuedAtTime=function(e){var t=g(e).claims;return"object"==typeof t&&t.hasOwnProperty("iat")?t.iat:null},t.isValidFormat=function(e){var t=g(e).claims;return!!t&&"object"==typeof t&&t.hasOwnProperty("iat")},t.isValidTimestamp=function(e){var t,n,r=g(e).claims,o=Math.floor((new Date).getTime()/1e3);return"object"==typeof r&&(r.hasOwnProperty("nbf")?t=r.nbf:r.hasOwnProperty("iat")&&(t=r.iat),n=r.hasOwnProperty("exp")?r.exp:t+86400),o&&t&&n&&o>=t&&o<=n},t.clone=function(e){return _({},e)},t.contains=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},t.every=function(e,t){for(var n in e)if(Object.prototype.hasOwnProperty.call(e,n)&&!t(n,e[n]))return!1;return!0},t.extend=_,t.findKey=w,t.findValue=function(e,t,n){var r=w(e,t,n);return r&&e[r]},t.forEach=b,t.getAnyKey=function(e){for(var t in e)return t},t.getCount=function(e){var t=0;for(var n in e)t++;return t},t.getValues=function(e){var t=[],n=0;for(var r in e)t[n++]=e[r];return t},t.isEmpty=function(e){for(var t in e)return!1;return!0},t.isNonNullObject=function(e){return"object"==typeof e&&null!==e},t.map=function(e,t,n){var r={};for(var o in e)r[o]=t.call(n,e[o],o,e);return r},t.safeGet=function(e,t){if(Object.prototype.hasOwnProperty.call(e,t))return e[t]},t.querystring=function(e){var t=[];return b(e,function(e,n){Array.isArray(n)?n.forEach(function(n){t.push(encodeURIComponent(e)+"="+encodeURIComponent(n))}):t.push(encodeURIComponent(e)+"="+encodeURIComponent(n))}),t.length?"&"+t.join("&"):""},t.querystringDecode=function(e){var t={};return e.replace(/^\?/,"").split("&").forEach(function(e){if(e){var n=e.split("=");t[n[0]]=n[1]}}),t},t.Sha1=E,t.async=function(e,t){return function(){for(var n=[],r=0;rn&&(o=0===n?"none":"no more than "+n),o)throw new Error(e+" failed: Was called with "+r+(1===r?" argument.":" arguments.")+" Expects "+o+".")},t.validateCallback=function(e,t,n,r){if((!r||n)&&"function"!=typeof n)throw new Error(k(e,t,r)+"must be a valid function.")},t.validateContextObject=function(e,t,n,r){if((!r||n)&&("object"!=typeof n||null===n))throw new Error(k(e,t,r)+"must be a valid context object.")},t.validateNamespace=function(e,t,n,r){if((!r||n)&&"string"!=typeof n)throw new Error(k(e,t,r)+"must be a valid firebase namespace.")},t.stringLength=function(e){for(var t=0,n=0;n=55296&&r<=56319?(t+=4,n++):t+=3}return t},t.stringToByteArray=function(e){for(var t=[],n=0,r=0;r=55296&&o<=56319){var a=o-55296;i(++r>6|192,t[n++]=63&o|128):o<65536?(t[n++]=o>>12|224,t[n++]=o>>6&63|128,t[n++]=63&o|128):(t[n++]=o>>18|240,t[n++]=o>>12&63|128,t[n++]=o>>6&63|128,t[n++]=63&o|128)}return t}},function(e,t,n){"use strict";e.exports=function(e,t,n,r,o,i,a,s){if(!e){var l;if(void 0===t)l=new Error("Minified exception occurred; use the non-minified dev environment for the full error message and additional helpful warnings.");else{var u=[n,r,o,i,a,s],c=0;(l=new Error(t.replace(/%s/g,function(){return u[c++]}))).name="Invariant Violation"}throw l.framesToPop=1,l}}},function(e,t){var n;n=function(){return this}();try{n=n||Function("return this")()||(0,eval)("this")}catch(e){"object"==typeof window&&(n=window)}e.exports=n},function(e){e.exports={en:{contacts_not_found:"You have no chats
¯\\\\_(ツ)_/¯",full_name_prompt:"Full name, e.g. John Doe",email_prompt:"Email, e.g. jdoe@example.com",button_sign_up:"Sign up",label_your_name:"Your name",label_password:"Password",password_unchanged_prompt:"Unchanged",label_user_id:"Address:",label_default_access_mode:"Default access mode:",label_message_sound:"Message sound:",label_push_notifications:"Notification alerts:",label_push_notifications_disabled:"Notification alerts (requires HTTPS)",title_tag_manager:"Tags (user discovery)",button_logout:"Logout",login_prompt:"Login",password_prompt:"Password",stay_logged_in:"Stay logged in",forgot_password_link:"Forgot password?",button_sign_in:"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",tabtitle_find_user:"find",tabtitle_new_group:"new group",tabtitle_group_by_id:"by id",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",sidepanel_title_edit_account:"Edit Account",sidepanel_title_newtpk:"Start New Chat",sidepanel_title_cred:"Confirm Credentials",sidepanel_title_reset:"Reset Password",message_sending:"sending...",message_sending_failed:"failed",search_placeholder:"List like email:alice@example.com, tel:17025550003...",messaging_disabled_prompt:"Messaging disabled",new_message_prompt:"New message",tags_not_found:"No tags defined. Add some.",tags_editor_no_tags:"Add some tags",title_manage_tags:"Manage tags"},ru:{contacts_not_found:"Чатов нет
¯\\\\_(ツ)_/¯",full_name_prompt:"Полное имя, напр. Иван Петров",email_prompt:"Email, напр. ivan@example.com",button_sign_up:"Создать счет",label_your_name:"Ваше имя",label_password:"Пароль",password_unchanged_prompt:"Не изменен",label_user_id:"Адрес:",label_default_access_mode:"Доступ по умолчанию:",label_message_sound:"Звук нового сообщения:",label_push_notifications:"Уведомления:",label_push_notifications_disabled:"Уведомления (требуют HTTPS):",title_tag_manager:"Таги для поиска",button_logout:"Выйти",login_prompt:"Логин",password_prompt:"Пароль",stay_logged_in:"Запомнить",forgot_password_link:"Напомнить пароль",button_sign_in:"Войти",label_client:"Клиент:",label_server:"Сервер:",online_now:"онлайн",last_seen_timestamp:"Был активен",title_not_found:"Не найден",unnamed_topic:"Без названия",messages_not_readable:"нет доступа к сообщениям",tabtitle_find_user:"найти",tabtitle_new_group:"создать",tabtitle_group_by_id:"по id",label_server_to_use:"Использовать сервер:",label_wire_transport:"Соединение:",button_update:"Применить",sidepanel_title_login:"Авторизация",sidepanel_title_register:"Зарегистрироваться",sidepanel_title_settings:"Настройки",sidepanel_title_edit_account:"Редактировать счет",sidepanel_title_newtpk:"Новый чат",sidepanel_title_cred:"Подтвердить",sidepanel_title_reset:"Сменить пароль",tags_not_found:"Тагов нет. Добавьте",tags_editor_no_tags:"Добавьте таги",title_manage_tags:"Редактор тагов"}}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=n(8),o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},i="[DEFAULT]",a=[],s=function(){function e(e,t,n){this.firebase_=n,this.isDeleted_=!1,this.services_={},this.name_=t.name,this._automaticDataCollectionEnabled=t.automaticDataCollectionEnabled||!1,this.options_=r.deepCopy(e),this.INTERNAL={getUid:function(){return null},getToken:function(){return Promise.resolve(null)},addAuthTokenListener:function(e){a.push(e),setTimeout(function(){return e(null)},0)},removeAuthTokenListener:function(e){a=a.filter(function(t){return t!==e})}}}return Object.defineProperty(e.prototype,"automaticDataCollectionEnabled",{get:function(){return this.checkDestroyed_(),this._automaticDataCollectionEnabled},set:function(e){this.checkDestroyed_(),this._automaticDataCollectionEnabled=e},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"name",{get:function(){return this.checkDestroyed_(),this.name_},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"options",{get:function(){return this.checkDestroyed_(),this.options_},enumerable:!0,configurable:!0}),e.prototype.delete=function(){var e=this;return new Promise(function(t){e.checkDestroyed_(),t()}).then(function(){e.firebase_.INTERNAL.removeApp(e.name_);var t=[];return Object.keys(e.services_).forEach(function(n){Object.keys(e.services_[n]).forEach(function(r){t.push(e.services_[n][r])})}),Promise.all(t.map(function(e){return e.INTERNAL.delete()}))}).then(function(){e.isDeleted_=!0,e.services_={}})},e.prototype._getService=function(e,t){if(void 0===t&&(t=i),this.checkDestroyed_(),this.services_[e]||(this.services_[e]={}),!this.services_[e][t]){var n=t!==i?t:void 0,r=this.firebase_.INTERNAL.factories[e](this,this.extendApp.bind(this),n);this.services_[e][t]=r}return this.services_[e][t]},e.prototype.extendApp=function(e){var t=this;r.deepExtend(this,e),e.INTERNAL&&e.INTERNAL.addAuthTokenListener&&(a.forEach(function(e){t.INTERNAL.addAuthTokenListener(e)}),a=[])},e.prototype.checkDestroyed_=function(){this.isDeleted_&&l("app-deleted",{name:this.name_})},e}();function l(e,t){throw u.create(e,t)}s.prototype.name&&s.prototype.options||s.prototype.delete||console.log("dc");var u=new r.ErrorFactory("app","Firebase",{"no-app":"No Firebase App '{$name}' has been created - call Firebase App.initializeApp()","bad-app-name":"Illegal App name: '{$name}","duplicate-app":"Firebase App named '{$name}' already exists","app-deleted":"Firebase App named '{$name}' already deleted","duplicate-service":"Firebase service named '{$name}' already registered","sa-not-supported":"Initializing the Firebase SDK with a service account is only allowed in a Node.js environment. On client devices, you should instead initialize the SDK with an api key and auth domain","invalid-app-argument":"firebase.{$name}() takes either no argument or a Firebase App instance."}),c=function e(){var t={},n={},a={},u={__esModule:!0,initializeApp:function(e,n){if(void 0===n&&(n={}),"object"!=typeof n||null===n){var r=n;n={name:r}}var a=n;void 0===a.name&&(a.name=i);var c=a.name;"string"==typeof c&&c||l("bad-app-name",{name:c+""}),o(t,c)&&l("duplicate-app",{name:c});var p=new s(e,a,u);return t[c]=p,f(p,"create"),p},app:c,apps:null,Promise:Promise,SDK_VERSION:"5.5.0",INTERNAL:{registerService:function(e,t,o,i,f){n[e]&&l("duplicate-service",{name:e}),n[e]=t,i&&(a[e]=i,p().forEach(function(e){i("create",e)}));var d=function(t){return void 0===t&&(t=c()),"function"!=typeof t[e]&&l("invalid-app-argument",{name:e}),t[e]()};return void 0!==o&&r.deepExtend(d,o),u[e]=d,s.prototype[e]=function(){for(var t=[],n=0;n=0;s--)(o=e[s])&&(a=(i<3?o(a):i>3?o(t,n,a):o(t,n))||a);return i>3&&a&&Object.defineProperty(t,n,a),a}function l(e,t){return function(n,r){t(n,r,e)}}function u(e,t){if("object"==typeof Reflect&&"function"==typeof Reflect.metadata)return Reflect.metadata(e,t)}function c(e,t,n,r){return new(n||(n=Promise))(function(o,i){function a(e){try{l(r.next(e))}catch(e){i(e)}}function s(e){try{l(r.throw(e))}catch(e){i(e)}}function l(e){e.done?o(e.value):new n(function(t){t(e.value)}).then(a,s)}l((r=r.apply(e,t||[])).next())})}function d(e,t){var n,r,o,i,a={label:0,sent:function(){if(1&o[0])throw o[1];return o[1]},trys:[],ops:[]};return i={next:s(0),throw:s(1),return:s(2)},"function"==typeof Symbol&&(i[Symbol.iterator]=function(){return this}),i;function s(i){return function(s){return function(i){if(n)throw new TypeError("Generator is already executing.");for(;a;)try{if(n=1,r&&(o=r[2&i[0]?"return":i[0]?"throw":"next"])&&!(o=o.call(r,i[1])).done)return o;switch(r=0,o&&(i=[0,o.value]),i[0]){case 0:case 1:o=i;break;case 4:return a.label++,{value:i[1],done:!1};case 5:a.label++,r=i[1],i=[0];continue;case 7:i=a.ops.pop(),a.trys.pop();continue;default:if(!(o=(o=a.trys).length>0&&o[o.length-1])&&(6===i[0]||2===i[0])){a=0;continue}if(3===i[0]&&(!o||i[1]>o[0]&&i[1]=e.length&&(e=void 0),{value:e&&e[n++],done:!e}}}}function h(e,t){var n="function"==typeof Symbol&&e[Symbol.iterator];if(!n)return e;var r,o,i=n.call(e),a=[];try{for(;(void 0===t||t-- >0)&&!(r=i.next()).done;)a.push(r.value)}catch(e){o={error:e}}finally{try{r&&!r.done&&(n=i.return)&&n.call(i)}finally{if(o)throw o.error}}return a}function m(){for(var e=[],t=0;t1||s(e,t)})})}function s(e,t){try{!function(e){e.value instanceof y?Promise.resolve(e.value.v).then(l,u):c(i[0][2],e)}(o[e](t))}catch(e){c(i[0][3],e)}}function l(e){s("next",e)}function u(e){s("throw",e)}function c(e,t){e(t),i.shift(),i.length&&s(i[0][0],i[0][1])}}function g(e){var t,n;return t={},r("next"),r("throw",function(e){throw e}),r("return"),t[Symbol.iterator]=function(){return this},t;function r(r,o){e[r]&&(t[r]=function(t){return(n=!n)?{value:y(e[r](t)),done:"return"===r}:o?o(t):t})}}function b(e){if(!Symbol.asyncIterator)throw new TypeError("Symbol.asyncIterator is not defined.");var t=e[Symbol.asyncIterator];return t?t.call(e):p(e)}function _(e,t){return Object.defineProperty?Object.defineProperty(e,"raw",{value:t}):e.raw=t,e}function w(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var n in e)Object.hasOwnProperty.call(e,n)&&(t[n]=e[n]);return t.default=e,t}function E(e){return e&&e.__esModule?e:{default:e}}},function(e,t,n){(function(t){e.exports=function(){var e={},n=[{name:"ST",start:/(?:^|\W)(\*)[^\s*]/,end:/[^\s*](\*)(?=$|\W)/},{name:"EM",start:/(?:^|[\W_])(_)[^\s_]/,end:/[^\s_](_)(?=$|[\W_])/},{name:"DL",start:/(?:^|\W)(~)[^\s~]/,end:/[^\s~](~)(?=$|\W)/},{name:"CO",start:/(?:^|\W)(`)[^`]/,end:/[^`](`)(?=$|\W)/}],r=[{name:"LN",dataName:"url",pack:function(e){return/^[a-z]+:\/\//i.test(e)||(e="http://"+e),{url:e}},re:/(?:(?:https?|ftp):\/\/|www\.|ftp\.)[-A-Z0-9+&@#\/%=~_|$?!:,.]*[A-Z0-9+&@#\/%=~_|$]/gi},{name:"MN",dataName:"val",pack:function(e){return{val:e.slice(1)}},re:/\B@(\w\w+)/g},{name:"HT",dataName:"val",pack:function(e){return{val:e.slice(1)}},re:/\B#(\w\w+)/g}],o={ST:{name:"b",isVoid:!1},EM:{name:"i",isVoid:!1},DL:{name:"del",isVoid:!1},CO:{name:"tt",isVoid:!1},BR:{name:"br",isVoid:!0},LN:{name:"a",isVoid:!1},MN:{name:"a",isVoid:!1},HT:{name:"a",isVoid:!1},IM:{name:"img",isVoid:!0}};function i(e,t){var n;try{n=atob(e)}catch(e){console.log("Drafty: failed to decode base64-encoded object",e.message),n=atob("")}for(var r=n.length,o=new ArrayBuffer(r),i=new Uint8Array(o),a=0;a"},close:function(){return""}},EM:{open:function(){return""},close:function(){return""}},DL:{open:function(){return""},close:function(){return""}},CO:{open:function(){return""},close:function(){return""}},BR:{open:function(){return""},close:function(){return"
"}},LN:{open:function(e){return''},close:function(e){return""},props:function(e){return{href:e.url,target:"_blank"}}},MN:{open:function(e){return''},close:function(e){return""},props:function(e){return{name:e.val}}},HT:{open:function(e){return''},close:function(e){return""},props:function(e){return{name:e.val}}},IM:{open:function(e){var t=i(e.val,e.mime),n=e.ref?e.ref:t,r=(e.name?'':"")+'';return console.log("open: "+r),r},close:function(e){return e.name?"":""},props:function(e){return{src:i(e.val,e.mime),title:e.name,"data-width":e.width,"data-height":e.height,"data-name":e.name,"data-size":.75*e.val.length|0,"data-mime":e.mime}}}},s=function(){};s.parse=function(e){if("string"!=typeof e)return null;var t=e.split(/\r?\n/),o=[],i={},a=[];t.map(function(e){var t,s,l=[];if(n.map(function(t){l=l.concat(function(e,t,n,r){for(var o=[],i=0,a=e.slice(0);a.length>0;){var s=t.exec(a);if(null==s)break;var l=s.index+s[0].lastIndexOf(s[1]);a=a.slice(l+1),i=(l+=i)+1;var u=n?n.exec(a):null;if(null==u)break;var c=u.index+u[0].indexOf(u[1]);a=a.slice(c+1),i=(c+=i)+1,o.push({text:e.slice(l+1,c),children:[],start:l,end:c,type:r})}return o}(e,t.start,t.end,t.name))}),0==l.length)s={txt:e};else{l.sort(function(e,t){return e.start-t.start}),l=function e(t){if(0==t.length)return[];for(var n=[t[0]],r=t[0],o=1;or.end?(n.push(t[o]),r=t[o]):t[o].endn&&i.push({text:t.slice(n,s.start)});var l={type:s.type},u=e(t,s.start+1,s.end-1,s.children);u.length>0?l.children=u:l.text=s.text,i.push(l),n=s.end+1}return no;return o=e.offset+e.len,t})}(s.txt)).length>0){var c=[];for(var d in t){var f=t[d],p=i[f.unique];p||(p=o.length,i[f.unique]=p,o.push({tp:f.type,data:f.data})),c.push({at:f.offset,len:f.len,key:p})}s.ent=c}a.push(s)});var s={txt:""};if(a.length>0){s.txt=a[0].txt,s.fmt=(a[0].fmt||[]).concat(a[0].ent||[]);for(var l=1;l0&&(s.ent=o)}return s},s.insertImage=function(e,t,n,r,o,i,a,s,l){return(e=e||{txt:" "}).ent=e.ent||[],e.fmt=e.fmt||[],e.fmt.push({at:t,len:1,key:e.ent.length}),e.ent.push({tp:"IM",data:{mime:n,val:r,width:o,height:i,name:a,ref:l,size:0|s}}),e},s.attachFile=function(e,t,n,r,o,i){(e=e||{txt:""}).ent=e.ent||[],e.fmt=e.fmt||[],e.fmt.push({at:-1,len:0,key:e.ent.length});var a={tp:"EX",data:{mime:t,val:n,name:r,ref:i,size:0|o}};return i instanceof Promise&&(a.data.ref=i.then(function(e){a.data.ref=e},function(e){})),e.ent.push(a),e},s.UNSAFE_toHTML=function(e){var t,n,r,o=e.txt,i=e.fmt,s=e.ent,l=[];if(i)for(var u in i){var c,d=i[u],f=d.tp;if(!f){var p=s[d.key];p&&(f=p.tp,c=p.data)}a[f]&&(l.push({idx:d.at+d.len,what:a[f].close(c)}),l.push({idx:d.at,what:a[f].open(c)}))}for(var u in l.sort(function(e,t){return t.idx-e.idx}),l)l[u].what&&(t=o,n=l[u].idx,r=l[u].what,o=t.slice(0,n)+r+t.slice(n));return o},s.format=function(e,t,n){var r=e.txt,i=e.fmt,a=e.ent;if(r=r||"",!i)return[r];var s=[].concat(i);return s.map(function(e){e.at=e.at||0,e.len=e.len||0}),s.sort(function(e,t){return e.at-t.at==0?t.len-e.len:e.at-t.at}),s=s.map(function(e){var t,n=e.tp;return n||(e.key=e.key||0,t=a[e.key].data,n=a[e.key].tp),{tp:n,data:t,at:e.at,len:e.len}}),function e(t,n,r,i,a,s){for(var l=[],u=0;u0)for(var t in e.ent)if("EX"==e.ent[t].tp)return!0;return!1},s.attachments=function(e,t,n){if(e.ent&&e.ent.length>0)for(var r in e.ent)"EX"==e.ent[r].tp&&t.call(n,e.ent[r].data,r)},s.getDownloadUrl=function(e){var t=null;return e.val?t=i(e.val,e.mime):"string"==typeof e.ref&&(t=e.ref),t},s.isUploading=function(e){return e.ref instanceof Promise},s.getPreviewUrl=function(e){return e.val?i(e.val,e.mime):null},s.getEntitySize=function(e){return e.size?e.size:e.val?.75*e.val.length|0:0},s.getEntityMimeType=function(e){return e.mime||"text/plain"},s.tagName=function(e){return o[e]?o[e].name:void 0},s.attrValue=function(e,t){if(t&&a[e])return a[e].props(t)},s.getContentType=function(){return"text/x-drafty"},e=s;var l={};return function(t){"use strict";function n(e){return(n="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}var r,o="0.15.8-rc1";"undefined"!=typeof WebSocket&&(r=WebSocket),"undefined"==typeof btoa&&(t.btoa=function(){for(var e,t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"",n="",r=0,o=0,i="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";t.charAt(0|o)||(i="=",o%1);n+=i.charAt(63&r>>8-o%1*8)){if((e=t.charCodeAt(o+=.75))>255)throw new Error("'btoa' failed: The string to be encoded contains characters outside of the Latin1 range.");r=r<<8|e}return n}),"undefined"==typeof atob&&(t.atob=function(){var e=(arguments.length>0&&void 0!==arguments[0]?arguments[0]:"").replace(/=+$/,""),t="";if(e.length%4==1)throw new Error("'atob' failed: The string to be decoded is not correctly encoded.");for(var n,r=0,o=0,i=0;n=e.charAt(i++);~n&&(o=r%4?64*o+n:n,r++%4)?t+=String.fromCharCode(255&o>>(-2*r&6)):0)n="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=".indexOf(n);return t}),"undefined"==typeof window&&(t.window={WebSocket:r,URL:{createObjectURL:function(){throw new Error("Unable to use window.URL in a non browser application")}}});var i="0",a=o||"0.15",s="tinodejs/"+a,u=503,c="Connection failed";function d(e){return btoa(encodeURIComponent(e).replace(/%([0-9A-F]{2})/g,function(e,t){return String.fromCharCode("0x"+t)}))}function f(e,t,r){if(null==t)return e;if("object"!==n(t))return t||e;if(t instanceof Date)return t;if(t instanceof w)return new w(t);if(t instanceof Array)return t.length>0?t:e;for(var o in e||(e=t.constructor()),t)!t.hasOwnProperty(o)||!t[o]&&!1!==t[o]||r&&r[o]||"_generated"==o||(e[o]=f(e[o],t[o]));return e}function p(e,t,n,r){return e[t]=f(e[t],n,r),e[t]}function h(){var e=null;if("withCredentials"in new XMLHttpRequest)e=new XMLHttpRequest;else{if("undefined"==typeof XDomainRequest)throw new Error("browser not supported");e=new XDomainRequest}return e}function m(e,t){if("ts"===e&&"string"==typeof t&&t.length>=20&&t.length<=24){var r=new Date(t);if(r)return r}else if("acs"===e&&"object"===n(t))return new w(t);return t}function y(e,t){return"string"==typeof t&&t.length>128?"<"+t.length+", bytes: "+t.substring(0,12)+"..."+t.substring(t.length-12)+">":function(e,t){if(t instanceof Date)t=function(e){if(e&&0!=e.getTime()){var t=e.getUTCMilliseconds();return e.getUTCFullYear()+"-"+n(e.getUTCMonth()+1)+"-"+n(e.getUTCDate())+"T"+n(e.getUTCHours())+":"+n(e.getUTCMinutes())+":"+n(e.getUTCSeconds())+(t?"."+n(t,3):"")+"Z"}function n(e,t){return"0".repeat((t=t||2)-(""+e).length)+e}}(t);else if(null==t||!1===t||Array.isArray(t)&&0==t.length||"object"===n(t)&&0===Object.keys(t).length)return;return t}(0,t)}function v(e,t,n){var r=null;return"http"!==t&&"https"!==t&&"ws"!==t&&"wss"!==t||(r=t+"://","/"!==(r+=e).charAt(r.length-1)&&(r+="/"),r+="v"+i+"/channels","http"!==t&&"https"!==t||(r+="/lp"),r+="?apikey="+n),r}var g=function(e,t,o,i,a){var s=this,l=e,d=i,f=t,p=a,y=2e3,g=10,b=.3,_=null,w=0,E=!1,S=function(e){s.logger&&s.logger(e)};function T(e){var t=null;e.connect=function(n){return t&&1===t.readyState?Promise.resolve():(n&&(l=n),new Promise(function(n,o){var i=v(l,d?"wss":"ws",f);S("Connecting to: "+i);var a=new r(i);a.onopen=function(t){E=!1,e.onOpen&&e.onOpen(),n(),p&&(clearTimeout(_),_=null,w=0)},a.onclose=function(n){t=null,e.onDisconnect&&e.onDisconnect(null),!E&&p&&function(){var e=this;clearTimeout(_);var t=y*(Math.pow(2,w)*(1+b*Math.random()));w=w>=g?w:w+1,_=setTimeout(function(){S("Reconnecting, iter="+w+", timeout="+t),E||e.connect().catch(function(){})},t)}.call(e)},a.onerror=function(e){o(e)},a.onmessage=function(t){e.onMessage&&e.onMessage(t.data)},t=a}))},e.disconnect=function(){t&&(E=!0,t.close()),t=null},e.sendText=function(e){if(!t||t.readyState!=t.OPEN)throw new Error("Websocket is not connected");t.send(e)},e.isConnected=function(){return t&&1===t.readyState},e.transport=function(){return"ws"}}function k(e){var t=null,n=null,r=null;e.connect=function(r){return n?Promise.resolve():(r&&(l=r),new Promise(function(r,o){var i=v(l,d?"https":"http",f);S("Connecting to: "+i),(n=function n(r,o,i){var a=h();return a.onreadystatechange=function(s){if(4==a.readyState)if(201==a.status){var l=JSON.parse(a.responseText,m);a.responseText,t=r+"&sid="+l.ctrl.params.sid,(a=n(t)).send(null),e.onOpen&&e.onOpen(),o&&o()}else if(200==a.status)e.onMessage&&e.onMessage(a.responseText),(a=n(t)).send(null);else if(i&&i(a.responseText),e.onMessage&&a.responseText&&e.onMessage(a.responseText),e.onDisconnect){var d=a.status||u,f=a.responseText||c;e.onDisconnect(new Error(f+"("+d+")"))}},a.open("GET",r,!0),a}(i,r,o)).send(null)}).catch(function(){}))},e.disconnect=function(){r&&(r.onreadystatechange=void 0,r.abort(),r=null),n&&(n.onreadystatechange=void 0,n.abort(),n=null),e.onDisconnect&&e.onDisconnect(null),t=null},e.sendText=function(e){var n,o;if(n=t,(o=h()).onreadystatechange=function(e){if(4==o.readyState&&o.status>=400)throw new Error("LP sender failed, "+o.status)},o.open("POST",n,!0),!(r=o)||1!=r.readyState)throw new Error("Long poller failed to connect");r.send(e)},e.isConnected=function(){return n&&!0},e.transport=function(){return"lp"}}"lp"===o?k(this):"ws"===o?T(this):"object"==("undefined"==typeof window?"undefined":n(window))&&window.WebSocket?T(this):k(this),this.onMessage=void 0,this.onDisconnect=void 0,this.onOpen=void 0,this.logger=void 0},b=function(e,t,r,o,i){var l=this;this._appName=e||"Undefined",this._apiKey=r,this._browser="",this._platform="undefined",this._humanLanguage="xx","undefined"!=typeof navigator&&(this._browser=function(e){var t,n=(e=(e||"").replace(" (KHTML, like Gecko)","")).match(/(AppleWebKit\/[.\d]+)/i);if(n){for(var r=["chrome","safari","mobile","version"],o=e.substr(n.index+n[0].length).split(" "),i=[],a=0;a0?i[0][0]+"/"+i[0][1]:n[1]}else t=/trident/i.test(e)?(n=/(?:\brv[ :]+([.\d]+))|(?:\bMSIE ([.\d]+))/g.exec(e))?"MSIE/"+(n[1]||n[2]):"MSIE/?":/firefox/i.test(e)?(n=/Firefox\/([.\d]+)/g.exec(e))?"Firefox/"+n[1]:"Firefox/?":/presto/i.test(e)?(n=/Opera\/([.\d]+)/g.exec(e))?"Opera/"+n[1]:"Opera/?":(n=/([\w.]+)\/([.\d]+)/.exec(e))?n[1]+"/"+n[2]:(n=e.split(" "))[0];if((n=t.split("/")).length>1){var l=n[1].split(".");t=n[0]+"/"+l[0]+(l[1]?"."+l[1]:"")}return t}(navigator.userAgent),this._platform=navigator.platform,this._humanLanguage=navigator.language||"en-US"),this._loggingEnabled=!1,this._trimLongStrings=!1,this._myUID=null,this._authenticated=!1,this._login=null,this._authToken=null,this._inPacketCount=0,this._messageId=Math.floor(65535*Math.random()+65535),this._serverInfo=null,this._deviceToken=null,this._pendingPromises={},this._connection=new g(t,r,o,i,!0),this.logger=function(e){if(l._loggingEnabled){var t=new Date,n=("0"+t.getUTCHours()).slice(-2)+":"+("0"+t.getUTCMinutes()).slice(-2)+":"+("0"+t.getUTCSeconds()).slice(-2)+":"+("0"+t.getUTCMilliseconds()).slice(-3);console.log("["+n+"] "+e)}},this._connection.logger=this.logger,this._cache={};var d=this.cachePut=function(e,t,n){l._cache[e+":"+t]=n},p=this.cacheGet=function(e,t){return l._cache[e+":"+t]},h=this.cacheDel=function(e,t){delete l._cache[e+":"+t]},v=this.cacheMap=function(e,t){for(var n in l._cache)if(e(l._cache[n],n,t))break};this.attachCacheToTopic=function(e){e._tinode=l,e._cacheGetUser=function(e){var t=p("user",e);if(t)return{user:e,public:f({},t)}},e._cachePutUser=function(e,t){return d("user",e,f({},t.public))},e._cacheDelUser=function(e){return h("user",e)},e._cachePutSelf=function(){return d("topic",e.name,e)},e._cacheDelSelf=function(){return h("topic",e.name)}};var b=function(e,t,n,r){var o=l._pendingPromises[e];o&&(delete l._pendingPromises[e],t>=200&&t<400?o.resolve&&o.resolve(n):o.reject&&o.reject(new Error("Error: "+r+" ("+t+")")))},_=this.getNextUniqueId=function(){return 0!=l._messageId?""+l._messageId++:void 0};this.initPacket=function(e,t){switch(e){case"hi":return{hi:{id:_(),ver:a,ua:l._appName+" ("+(l._browser?l._browser+"; ":"")+l._platform+"); "+s,dev:l._deviceToken,lang:l._humanLanguage}};case"acc":return{acc:{id:_(),user:null,scheme:null,secret:null,login:!1,tags:null,desc:{},cred:{}}};case"login":return{login:{id:_(),scheme:null,secret:null}};case"sub":return{sub:{id:_(),topic:t,set:{},get:{}}};case"leave":return{leave:{id:_(),topic:t,unsub:!1}};case"pub":return{pub:{id:_(),topic:t,noecho:!1,head:null,content:{}}};case"get":return{get:{id:_(),topic:t,what:null,desc:{},sub:{},data:{}}};case"set":return{set:{id:_(),topic:t,desc:{},sub:{},tags:[]}};case"del":return{del:{id:_(),topic:t,what:null,delseq:null,user:null,hard:!1}};case"note":return{note:{topic:t,what:null,seq:void 0}};default:throw new Error("Unknown packet type requested: "+e)}},this.send=function(e,t){var r;t&&(r=function(e){var t=null;return e&&(t=new Promise(function(t,n){l._pendingPromises[e]={resolve:t,reject:n}})),t}(t)),e=function e(t){return Object.keys(t).forEach(function(r){"_"==r[0]?delete t[r]:t[r]?Array.isArray(t[r])&&0==t[r].length?delete t[r]:t[r]?"object"!=n(t[r])||t[r]instanceof Date||(e(t[r]),0==Object.getOwnPropertyNames(t[r]).length&&delete t[r]):delete t[r]:delete t[r]}),t}(e);var o=JSON.stringify(e);l.logger("out: "+(l._trimLongStrings?JSON.stringify(e,y):o));try{l._connection.sendText(o)}catch(e){if(!t)throw e;b(t,u,null,e.message)}return r},this.loginSuccessful=function(e){e.params&&e.params.user&&(l._myUID=e.params.user,l._authenticated=e&&e.code>=200&&e.code<300,e.params&&e.params.token&&e.params.expires?l._authToken={token:e.params.token,expires:new Date(e.params.expires)}:l._authToken=null,l.onLogin&&l.onLogin(e.code,e.text))},this._connection.onMessage=function(e){if(e){l._inPacketCount++,l.onRawMessage&&l.onRawMessage(e);var t=JSON.parse(e,m);if(t)if(l.logger("in: "+(l._trimLongStrings?JSON.stringify(t,y):e)),l.onMessage&&l.onMessage(t),t.ctrl)l.onCtrlMessage&&l.onCtrlMessage(t.ctrl),t.ctrl.id&&b(t.ctrl.id,t.ctrl.code,t.ctrl,t.ctrl.text),t.ctrl.params&&"data"==t.ctrl.params.what&&(n=p("topic",t.ctrl.topic))&&n._allMessagesReceived(t.ctrl.params.count);else if(t.meta)(n=p("topic",t.meta.topic))&&n._routeMeta(t.meta),l.onMetaMessage&&l.onMetaMessage(t.meta);else if(t.data)(n=p("topic",t.data.topic))&&n._routeData(t.data),l.onDataMessage&&l.onDataMessage(t.data);else if(t.pres)(n=p("topic",t.pres.topic))&&n._routePres(t.pres),l.onPresMessage&&l.onPresMessage(t.pres);else if(t.info){var n;(n=p("topic",t.info.topic))&&n._routeInfo(t.info),l.onInfoMessage&&l.onInfoMessage(t.info)}else l.logger("ERROR: Unknown packet received.");else l.logger("in: "+e),l.logger("ERROR: failed to parse data")}},this._connection.onOpen=function(){l.hello()},this._connection.onDisconnect=function(e){for(var t in l._inPacketCount=0,l._serverInfo=null,l._authenticated=!1,l._pendingPromises){var n=l._pendingPromises[t];n&&n.reject&&n.reject(new Error(c+" ("+u+")"))}l._pendingPromises={},v(function(e,t){0===t.lastIndexOf("topic:",0)&&e._resetSub()}),l.onDisconnect&&l.onDisconnect(e)}};b.credential=function(e,t,r,o){if("object"==n(e)){var i=e;t=i.val,r=i.params,o=i.resp,e=i.meth}return e&&(t||o)?[{meth:e,val:t,resp:o,params:r}]:null},b.topicType=function(e){return{me:"me",fnd:"fnd",grp:"grp",new:"grp",usr:"p2p"}["string"==typeof e?e.substring(0,3):"xxx"]},b.isNewGroupTopicName=function(e){return"string"==typeof e&&"new"==e.substring(0,3)},b.getVersion=function(){return a},b.setWebSocketProvider=function(e){r=e},b.getLibrary=function(){return s},b.MESSAGE_STATUS_NONE=0,b.MESSAGE_STATUS_QUEUED=1,b.MESSAGE_STATUS_SENDING=2,b.MESSAGE_STATUS_FAILED=3,b.MESSAGE_STATUS_SENT=4,b.MESSAGE_STATUS_RECEIVED=5,b.MESSAGE_STATUS_READ=6,b.MESSAGE_STATUS_TO_ME=7,b.DEL_CHAR="␡",b.prototype={connect:function(e){return this._connection.connect(e)},disconnect:function(){this._connection&&this._connection.disconnect()},isConnected:function(){return this._connection&&this._connection.isConnected()},isAuthenticated:function(){return this._authenticated},account:function(e,t,n,r,o){var i=this.initPacket("acc");return i.acc.user=e,i.acc.scheme=t,i.acc.secret=n,i.acc.login=r,o&&(i.acc.desc.defacs=o.defacs,i.acc.desc.public=o.public,i.acc.desc.private=o.private,i.acc.tags=o.tags,i.acc.cred=o.cred,i.acc.token=o.token),this.send(i,i.acc.id)},createAccount:function(e,t,n,r){var o=this,i=this.account("new",e,t,n,r);return n&&(i=i.then(function(e){return o.loginSuccessful(e),e})),i},createAccountBasic:function(e,t,n){return e=e||"",t=t||"",this.createAccount("basic",d(e+":"+t),!0,n)},updateAccountBasic:function(e,t,n,r){return t=t||"",n=n||"",this.account(e,"basic",d(t+":"+n),!1,r)},hello:function(){var e=this,t=this.initPacket("hi");return this.send(t,t.hi.id).then(function(t){return t.params&&(e._serverInfo=t.params),e.onConnect&&e.onConnect(),t}).catch(function(t){e.onDisconnect&&e.onDisconnect(t)})},setDeviceToken:function(e,t){var n=!1;return e&&e!=this._deviceToken&&(this._deviceToken=e,t&&this.isConnected()&&this.isAuthenticated()&&(this.send({hi:{dev:e}}),n=!0)),n},login:function(e,t,n){var r=this,o=this.initPacket("login");return o.login.scheme=e,o.login.secret=t,o.login.cred=n,this.send(o,o.login.id).then(function(e){return r.loginSuccessful(e),e})},loginBasic:function(e,t,n){var r=this;return this.login("basic",d(e+":"+t),n).then(function(t){return r._login=e,t})},loginToken:function(e,t){return this.login("token",e,t)},requestResetAuthSecret:function(e,t,n){return this.login("reset",d(e+":"+t+":"+n))},getAuthToken:function(){return this._authToken&&this._authToken.expires.getTime()>Date.now()?this._authToken:(this._authToken=null,null)},setAuthToken:function(e){this._authToken=e},subscribe:function(e,t,n){var r=this.initPacket("sub",e);return e||(e="new"),r.sub.get=t,n&&(n.sub&&(r.sub.set.sub=n.sub),b.isNewGroupTopicName(e)&&n.desc&&(r.sub.set.desc=n.desc),n.tags&&(r.sub.set.tags=n.tags)),this.send(r,r.sub.id)},leave:function(e,t){var n=this.initPacket("leave",e);return n.leave.unsub=t,this.send(n,n.leave.id)},createMessage:function(t,n,r){var o=this.initPacket("pub",t),i="string"==typeof n?e.parse(n):n;return i&&!e.isPlainText(i)&&(o.pub.head={mime:e.getContentType()},n=i),o.pub.noecho=r,o.pub.content=n,o.pub},publish:function(e,t,n){return this.publishMessage(this.createMessage(e,t,n))},publishMessage:function(e){return(e=Object.assign({},e)).seq=void 0,e.from=void 0,e.ts=void 0,this.send({pub:e},e.id)},getMeta:function(e,t){var n=this.initPacket("get",e);return n.get=f(n.get,t),this.send(n,n.get.id)},setMeta:function(e,t){var n=this.initPacket("set",e),r=[];return t&&["desc","sub","tags"].map(function(e){t.hasOwnProperty(e)&&(r.push(e),n.set[e]=t[e])}),0==r.length?Promise.reject(new Error("Invalid {set} parameters")):this.send(n,n.set.id)},delMessages:function(e,t,n){var r=this.initPacket("del",e);return r.del.what="msg",r.del.delseq=t,r.del.hard=n,this.send(r,r.del.id)},delTopic:function(e){var t=this,n=this.initPacket("del",e);return n.del.what="topic",this.send(n,n.del.id).then(function(n){return t.cacheDel("topic",e),t.ctrl})},delSubscription:function(e,t){var n=this.initPacket("del",e);return n.del.what="sub",n.del.user=t,this.send(n,n.del.id)},note:function(e,t,n){if(n<=0||n>=268435455)throw new Error("Invalid message id "+n);var r=this.initPacket("note",e);r.note.what=t,r.note.seq=n,this.send(r)},noteKeyPress:function(e){var t=this.initPacket("note",e);t.note.what="kp",this.send(t)},getTopic:function(e){var t=this.cacheGet("topic",e);return!t&&e&&(t="me"==e?new S:"fnd"==e?new T:new E(e),this.cachePut("topic",e,t),this.attachCacheToTopic(t)),t},newTopic:function(e){var t=new E("new",e);return this.attachCacheToTopic(t),t},newGroupTopicName:function(){return"new"+this.getNextUniqueId()},newTopicWith:function(e,t){var n=new E(e,t);return this.attachCacheToTopic(n),n},getMeTopic:function(){return this.getTopic("me")},getFndTopic:function(){return this.getTopic("fnd")},getLargeFileHelper:function(){return new k(this)},getCurrentUserID:function(){return this._myUID},getCurrentLogin:function(){return this._login},getServerInfo:function(){return this._serverInfo},enableLogging:function(e,t){this._loggingEnabled=e,this._trimLongStrings=e&&t},isTopicOnline:function(e){var t=this.getMeTopic(),n=t&&t.getContact(e);return n&&n.online},wantAkn:function(e){this._messageId=e?Math.floor(16777215*Math.random()+16777215):0},onWebsocketOpen:void 0,onConnect:void 0,onDisconnect:void 0,onLogin:void 0,onCtrlMessage:void 0,onDataMessage:void 0,onPresMessage:void 0,onMessage:void 0,onRawMessage:void 0};var _=function(e){this.topic=e;var t=e._tinode.getMeTopic();this.contact=t&&t.getContact(e.name),this.what={}};_.prototype={_get_ims:function(){var e=this.contact&&this.contact.updated,t=this.topic._lastDescUpdate||0;return e>t?e:t},withData:function(e,t,n){return this.what.data={since:e,before:t,limit:n},this},withLaterData:function(e){return this.withData(this.topic._maxSeq>0?this.topic._maxSeq+1:void 0,void 0,e)},withEarlierData:function(e){return this.withData(void 0,this.topic._minSeq>0?this.topic._minSeq:void 0,e)},withDesc:function(e){return this.what.desc={ims:e},this},withLaterDesc:function(){return this.withDesc(this._get_ims())},withSub:function(e,t,n){var r={ims:e,limit:t};return"me"==this.topic.getType()?r.topic=n:r.user=n,this.what.sub=r,this},withOneSub:function(e,t){return this.withSub(e,void 0,t)},withLaterOneSub:function(e){return this.withOneSub(this.topic._lastSubsUpdate,e)},withLaterSub:function(e){return this.withSub("p2p"==this.topic.getType()?this._get_ims():this.topic._lastSubsUpdate,e)},withTags:function(){return this.what.tags=!0,this},withDel:function(e,t){return(e||t)&&(this.what.del={since:e,limit:t}),this},withLaterDel:function(e){return this.withDel(this.topic._maxSeq>0?this.topic._maxDel+1:void 0,e)},build:function(){var e={},t=[],n=this;return["data","sub","desc","tags","del"].map(function(r){n.what.hasOwnProperty(r)&&(t.push(r),Object.getOwnPropertyNames(n.what[r]).length>0&&(e[r]=n.what[r]))}),t.length>0?e.what=t.join(" "):e=void 0,e}};var w=function e(t){t&&(this.given="number"==typeof t.given?t.given:e.decode(t.given),this.want="number"==typeof t.want?t.want:e.decode(t.want),this.mode=t.mode?"number"==typeof t.mode?t.mode:e.decode(t.mode):this.given&this.want)};w._NONE=0,w._JOIN=1,w._READ=2,w._WRITE=4,w._PRES=8,w._APPROVE=16,w._SHARE=32,w._DELETE=64,w._OWNER=128,w._BITMASK=w._JOIN|w._READ|w._WRITE|w._PRES|w._APPROVE|w._SHARE|w._DELETE|w._OWNER,w._INVALID=1048576,w.decode=function(e){if(!e)return null;if("number"==typeof e)return e&w._BITMASK;if("N"===e||"n"===e)return w._NONE;for(var t={J:w._JOIN,R:w._READ,W:w._WRITE,P:w._PRES,A:w._APPROVE,S:w._SHARE,D:w._DELETE,O:w._OWNER},n=w._NONE,r=0;r0)){l=!0;break}i=a-1}return l?a:r?-1:s<0?a+1:a}function r(e,t){var r=n(e,t,!1);return t.splice(r,0,e),t}return e=e||function(e,t){return e===t?0:e0)return n[0]},delRange:function(e,n){return t.splice(e,n-e)},size:function(){return t.length},reset:function(e){t=[]},forEach:function(e,n,r,o){n|=0,r=r||t.length;for(var i=n;i=300)return e;if(n._subscribed=!0,n.acs=e.params&&e.params.acs?e.params.acs:n.acs,n._new){n._new=!1,n.name=e.topic,n.created=e.ts,n.updated=e.ts,n.touched=e.ts,n._cachePutSelf();var r=n._tinode.getMeTopic();r&&r._processMetaSub([{_generated:!0,topic:n.name,created:e.ts,updated:e.ts,touched:e.ts,acs:n.acs}]),t&&t.desc&&(t.desc._generated=!0,n._processMetaDesc(t.desc))}return e})},createMessage:function(e,t){return this._tinode.createMessage(this.name,e,t)},publish:function(e,t){return this.publishMessage(this.createMessage(e,t))},publishMessage:function(t){var n=this;if(!this._subscribed)return Promise.reject(new Error("Cannot publish on inactive topic"));if(e.hasAttachments(t.content)&&!t.head.attachments){var r=[];e.attachments(t.content,function(e){r.push(e.ref)}),t.head.attachments=r}return t._sending=!0,this._tinode.publishMessage(t).then(function(e){return t._sending=!1,t.seq=e.params.seq,t.ts=e.ts,n._routeData(t),e}).catch(function(e){t._sending=!1,t._failed=!0})},publishDraft:function(e,t){var n=this;if(!t&&!this._subscribed)return Promise.reject(new Error("Cannot publish on inactive topic"));var r=e.seq||this._getQueuedSeqId();return e._generated||(e._generated=!0,e.seq=r,e.ts=new Date,e.from=this._tinode.getCurrentUserID(),e.noecho=!0,this._messages.put(e),this.onData&&this.onData(e)),(t||Promise.resolve()).then(function(){return e._cancelled?{code:300,text:"cancelled"}:n.publishMessage(e)},function(t){e._sending=!1,n._messages.delAt(n._messages.find(e)),n.onData&&n.onData()})},leave:function(e){var t=this;return this._subscribed||e?this._tinode.leave(this.name,e).then(function(n){return t._resetSub(),e&&t._gone(),n}):Promise.reject(new Error("Cannot leave inactive topic"))},getMeta:function(e){return this._subscribed?this._tinode.getMeta(this.name,e):Promise.reject(new Error("Cannot query inactive topic"))},getMessagesPage:function(e,t){var n=this,r=this.startMetaQuery();t?r.withLaterData(e):r.withEarlierData(e);var o=this.getMeta(r.build());return t||(o=o.then(function(e){e&&e.params&&!e.params.count&&(n._noEarlierMsgs=!0)})),o},setMeta:function(e){var t=this;return this._subscribed?(e.tags&&(e.tags=function(e){var t=[];if(Array.isArray(e)){for(var n=0,r=e.length;n1&&t.push(o)}t.sort().filter(function(e,t,n){return!t||e!=n[t-1]})}return 0==t.length&&t.push(b.DEL_CHAR),t}(e.tags)),this._tinode.setMeta(this.name,e).then(function(n){return n&&n.code>=300?n:(e.sub&&(n.params&&n.params.acs&&(e.sub.acs=n.params.acs,e.sub.updated=n.ts),e.sub.user||(e.sub.user=t._tinode.getCurrentUserID(),e.desc||(e.desc={})),e.sub._generated=!0,t._processMetaSub([e.sub])),e.desc&&(n.params&&n.params.acs&&(e.desc.acs=n.params.acs,e.desc.updated=n.ts),t._processMetaDesc(e.desc)),e.tags&&t._processMetaTags(e.tags),n)})):Promise.reject(new Error("Cannot update inactive topic"))},invite:function(e,t){return this.setMeta({sub:{user:e,mode:t}})},delMessages:function(e,t){var n=this;if(!this._subscribed)return Promise.reject(new Error("Cannot delete messages in inactive topic"));e.sort(function(e,t){return e.low=t.hi)});var r=e.reduce(function(e,t){return t.low<268435455&&(!t.hi||t.hi<268435455?e.push(t):e.push({low:t.low,hi:n._maxSeq+1})),e},[]);return(e.length>0?this._tinode.delMessages(this.name,r,t):Promise.resolve({params:{del:0}})).then(function(t){return t.params.del>n._maxDel&&(n._maxDel=t.params.del),e.map(function(e){e.hi?n.flushMessageRange(e.low,e.hi):n.flushMessage(e.low)}),n.onData&&n.onData(),t})},delMessagesAll:function(e){return this.delMessages([{low:1,hi:this._maxSeq+1,_all:!0}],e)},delMessagesList:function(e,t){e.sort(function(e,t){return e-t});var n=e.reduce(function(e,t){if(0==e.length)e.push({low:t});else{var n=e[e.length-1];!n.hi&&t!=n.low+1||t>n.hi?e.push({low:t}):n.hi=n.hi?Math.max(n.hi,t+1):t+1}return e},[]);return this.delMessages(n,t)},delTopic:function(){var e=this;return this._tinode.delTopic(this.name).then(function(t){return e._resetSub(),e._gone(),t})},delSubscription:function(e){var t=this;return this._subscribed?this._tinode.delSubscription(this.name,e).then(function(n){return delete t._users[e],t.onSubsUpdated&&t.onSubsUpdated(Object.keys(t._users)),n}):Promise.reject(new Error("Cannot delete subscription in inactive topic"))},note:function(e,t){var n=this._users[this._tinode.getCurrentUserID()];n?((!n[e]||n[e]0)for(var o in this._users){var i=this._users[o];i.user!==r&&i[e]>=t&&n++}return n},msgReadCount:function(e){return this.msgReceiptCount("read",e)},msgRecvCount:function(e){return this.msgReceiptCount("recv",e)},msgHasMoreMessages:function(e){return e?this.seq>this._maxSeq:this._minSeq>1&&!this._noEarlierMsgs},isNewMessage:function(e){return this._maxSeq<=e},flushMessage:function(e){var t=this._messages.find({seq:e});return t>=0?this._messages.delAt(t):void 0},flushMessageRange:function(e,t){var n=this._messages.find({seq:e});return n>=0?this._messages.delRange(n,this._messages.find({seq:t},!0)):[]},cancelSend:function(e){var t=this._messages.find({seq:e});if(t>=0){var n=this._messages.getAt(t);if(1==this.msgStatus(n))return n._cancelled=!0,this._messages.delAt(t),!0}return!1},getType:function(){return b.topicType(this.name)},getAccessMode:function(){return this.acs},getDefaultAccess:function(){return this.defacs},startMetaQuery:function(){return new _(this)},msgStatus:function(e){var t=0;return e.from==this._tinode.getCurrentUserID()?e._sending?t=2:e._failed?t=3:e.seq>=268435455?t=1:this.msgReadCount(e.seq)>0?t=6:this.msgRecvCount(e.seq)>0?t=5:e.seq>0&&(t=4):t=7,t},_routeData:function(e){e.content&&((!this.touched||this.touchedthis._maxSeq&&(this._maxSeq=e.seq),(e.seq0&&(this._lastSubsUpdate=e.ts,this._processMetaSub(e.sub)),e.del&&this._processDelMessages(e.del.clear,e.del.delseq),e.tags&&this._processMetaTags(e.tags),this.onMeta&&this.onMeta(e)},_routePres:function(e){var t;switch(e.what){case"del":this._processDelMessages(e.clear,e.delseq);break;case"on":case"off":(t=this._users[e.src])?t.online="on"==e.what:this._tinode.logger("Presence update for an unknown user",this.name,e.src);break;case"acs":var n="me"==e.src?this._tinode.getCurrentUserID():e.src;if(t=this._users[n])t.acs.updateAll(e.dacs),n==this._tinode.getCurrentUserID()&&this.acs.updateAll(e.dacs),t.acs&&t.acs.mode!=w._NONE||("p2p"==this.getType()&&this.leave(),this._processMetaSub([{user:n,deleted:new Date,_generated:!0}]));else{var r=(new w).updateAll(e.dacs);r&&r.mode!=w._NONE&&((t=this._cacheGetUser(n))?t.acs=r:(t={user:n,acs:r},this.getMeta(this.startMetaQuery().withOneSub(void 0,n).build())),t._generated=!0,t.updated=new Date,this._processMetaSub([t]))}break;default:this._tinode.logger("Ignored presence update",e.what)}this.onPres&&this.onPres(e)},_routeInfo:function(e){if("kp"!==e.what){var t=this._users[e.from];t&&(t[e.what]=e.seq)}this.onInfo&&this.onInfo(e)},_processMetaDesc:function(e,t){if(f(this,e),"string"==typeof this.created&&(this.created=new Date(this.created)),"string"==typeof this.updated&&(this.updated=new Date(this.updated)),"string"==typeof this.touched&&(this.touched=new Date(this.touched)),"me"!==this.name&&!t&&!e._generated){var n=this._tinode.getMeTopic();n&&n._processMetaSub([{_generated:!0,topic:this.name,updated:this.updated,touched:this.touched,acs:this.acs,public:this.public,private:this.private}])}this.onMetaDesc&&this.onMetaDesc(this)},_processMetaSub:function(e){var t=void 0;for(var n in e){var r=e[n];if(r.user){r.updated=new Date(r.updated),r.deleted=r.deleted?new Date(r.deleted):null;var o=null;r.deleted?(delete this._users[r.user],o=r):((o=this._users[r.user])||(o=this._cacheGetUser(r.user)),o=this._updateCachedUser(r.user,r,r._generated)),this.onMetaSub&&this.onMetaSub(o)}else r._generated||(t=r)}t&&this.onMetaDesc&&this.onMetaDesc(t),this.onSubsUpdated&&this.onSubsUpdated(Object.keys(this._users))},_processMetaTags:function(e){1==e.length&&e[0]==b.DEL_CHAR&&(e=[]),this._tags=e,this.onTagsUpdated&&this.onTagsUpdated(e)},_processDelMessages:function(e,t){this._maxDel=Math.max(e,this._maxDel),this.clear=Math.max(e,this.clear);var n=this,r=0;Array.isArray(t)&&t.map(function(e){if(e.hi)for(var t=e.low;t0&&this.onData&&this.onData()},_allMessagesReceived:function(e){this.onAllMessagesReceived&&this.onAllMessagesReceived(e)},_resetSub:function(){this._subscribed=!1},_gone:function(){this._messages.reset(),this._users={},this.acs=new w(null),this.private=null,this.public=null,this._maxSeq=0,this._minSeq=0,this._subscribed=!1;var e=this._tinode.getMeTopic();e&&e._routePres({_generated:!0,what:"gone",topic:"me",src:this.name}),this.onDeleteTopic&&this.onDeleteTopic()},_updateCachedUser:function(e,t,n){var r=this._cacheGetUser(e);return r?r=f(r,t):(n&&this.getMeta(this.startMetaQuery().withLaterOneSub(e).build()),r=f({},t)),this._cachePutUser(e,r),p(this._users,e,r)},_getQueuedSeqId:function(){return this._queuedSeqId++}};var S=function(e){E.call(this,"me",e),this._contacts={},e&&(this.onContactUpdate=e.onContactUpdate)};S.prototype=Object.create(E.prototype,{_processMetaSub:{value:function(e){var t=0;for(var n in e){var r=e[n],o=r.topic;if("fnd"!=o&&"me"!=o){r.updated=new Date(r.updated),r.touched=r.touched?new Date(r.touched):null,r.deleted=r.deleted?new Date(r.deleted):null,r.seq=0|r.seq,r.recv=0|r.recv,r.read=0|r.read,r.unread=r.seq-r.read;var i=null;if(r.deleted)i=r,delete this._contacts[o];else if(r.seen&&r.seen.when&&(r.seen.when=new Date(r.seen.when)),i=p(this._contacts,o,r),"p2p"==b.topicType(o)&&this._cachePutUser(o,i),!r._generated){var a=this._tinode.getTopic(o);a&&a._processMetaDesc(r,!0)}t++,this.onMetaSub&&this.onMetaSub(i)}}t>0&&this.onSubsUpdated&&this.onSubsUpdated(Object.keys(this._contacts))},enumerable:!0,configurable:!0,writable:!1},_routePres:{value:function(e){var t=this._contacts[e.src];if(t){switch(e.what){case"on":t.online=!0;break;case"off":t.online&&(t.online=!1,t.seen?t.seen.when=new Date:t.seen={when:new Date});break;case"msg":t.touched=new Date,t.seq=0|e.seq,t.unread=t.seq-t.read;break;case"upd":this.getMeta(this.startMetaQuery().withLaterOneSub(e.src).build());break;case"acs":t.acs?t.acs.updateAll(e.dacs):t.acs=(new w).updateAll(e.dacs);break;case"ua":t.seen={when:new Date,ua:e.ua};break;case"recv":t.recv=t.recv?Math.max(t.recv,e.seq):0|e.seq;break;case"read":t.read=t.read?Math.max(t.read,e.seq):0|e.seq,t.unread=t.seq-t.read;break;case"gone":delete this._contacts[e.src]}this.onContactUpdate&&this.onContactUpdate(e.what,t)}else if("acs"==e.what){var n=new w(e.dacs);if(!n||n.mode==w._INVALID)return void this._tinode.logger("Invalid access mode update",e.src,e.dacs);if(n.mode==w._NONE)return void this._tinode.logger("Removing non-existent subscription",e.src,e.dacs);this.getMeta(this.startMetaQuery().withOneSub(void 0,e.src).build()),this._contacts[e.src]={topic:e.src,online:!1,acs:n}}this.onPres&&this.onPres(e)},enumerable:!0,configurable:!0,writable:!1},publish:{value:function(){return Promise.reject(new Error("Publishing to 'me' is not supported"))},enumerable:!0,configurable:!0,writable:!1},contacts:{value:function(e,t){var n=e||this.onMetaSub;if(n)for(var r in this._contacts)n.call(t,this._contacts[r],r,this._contacts)},enumerable:!0,configurable:!0,writable:!0},setMsgReadRecv:{value:function(e,t,n,r){var o,i=this._contacts[e],a=!1;i&&(n|=0,"recv"===t?(o=i.recv,i.recv=i.recv?Math.max(i.recv,n):n,a=o!=i.recv):"read"===t?(o=i.read,i.read=i.read?Math.max(i.read,n):n,i.unread=i.seq-i.read,a=o!=i.read,i.recv0&&this.onSubsUpdated&&this.onSubsUpdated(Object.keys(this._contacts))},enumerable:!0,configurable:!0,writable:!1},publish:{value:function(){return Promise.reject(new Error("Publishing to 'fnd' is not supported"))},enumerable:!0,configurable:!0,writable:!1},setMeta:{value:function(e){var t=this;return Object.getPrototypeOf(T.prototype).setMeta.call(this,e).then(function(){Object.keys(t._contacts).length>0&&(t._contacts={},t.onSubsUpdated&&t.onSubsUpdated([]))})},enumerable:!0,configurable:!0,writable:!1},contacts:{value:function(e,t){var n=e||this.onMetaSub;if(n)for(var r in this._contacts)n.call(t,this._contacts[r],r,this._contacts)},enumerable:!0,configurable:!0,writable:!0}}),T.prototype.constructor=T;var k=function(e){this._tinode=e,this._apiKey=e._apiKey,this._authToken=e.getAuthToken(),this._msgId=e.getNextUniqueId(),this.xhr=h(),this.toResolve=null,this.toReject=null,this.onProgress=null,this.onSuccess=null,this.onFailure=null};k.prototype={upload:function(e,t,n,r){var o=this;if(!this._authToken)throw new Error("Must authenticate first");var a=this;this.xhr.open("POST","/v"+i+"/file/u/",!0),this.xhr.setRequestHeader("X-Tinode-APIKey",this._apiKey),this.xhr.setRequestHeader("X-Tinode-Auth","Token "+this._authToken.token);var s=new Promise(function(e,t){o.toResolve=e,o.toReject=t});this.onProgress=t,this.onSuccess=n,this.onFailure=r,this.xhr.upload.onprogress=function(e){e.lengthComputable&&a.onProgress&&a.onProgress(e.loaded/e.total)},this.xhr.onload=function(){var e;try{e=JSON.parse(this.response,m)}catch(e){a._tinode.logger("Invalid server response in LargeFileHelper",this.response)}this.status>=200&&this.status<300?(a.toResolve&&a.toResolve(e.ctrl.params.url),a.onSuccess&&a.onSuccess(e.ctrl)):this.status>=400?(a.toReject&&a.toReject(new Error(e.ctrl.text+" ("+e.ctrl.code+")")),a.onFailure&&a.onFailure(e.ctrl)):a._tinode.logger("Unexpected server response status",this.status,this.response)},this.xhr.onerror=function(e){a.toReject&&a.toReject(new Error("failed")),a.onFailure&&a.onFailure(null)},this.xhr.onabort=function(e){a.toReject&&a.toReject(new Error("upload cancelled by user")),a.onFailure&&a.onFailure(null)};try{var l=new FormData;l.append("file",e),l.set("id",this._msgId),this.xhr.send(l)}catch(e){this.toReject&&this.toReject(e),this.onFailure&&this.onFailure(null)}return s},download:function(e,t,n,r){var o=this;if(/^(?:(?:[a-z]+:)?\/\/)/i.test(e))throw new Error("The URL '"+e+"' must be relative, not absolute");if(!this._authToken)throw new Error("Must authenticate first");var i=this;this.xhr.open("GET",e,!0),this.xhr.setRequestHeader("X-Tinode-APIKey",this._apiKey),this.xhr.setRequestHeader("X-Tinode-Auth","Token "+this._authToken.token),this.xhr.responseType="blob",this.onProgress=r,this.xhr.onprogress=function(e){i.onProgress&&i.onProgress(e.loaded)};var a=new Promise(function(e,t){o.toResolve=e,o.toReject=t});this.xhr.onload=function(){if(200==this.status){var e=document.createElement("a");e.href=window.URL.createObjectURL(new Blob([this.response],{type:n})),e.style.display="none",e.setAttribute("download",t),document.body.appendChild(e),e.click(),document.body.removeChild(e),window.URL.revokeObjectURL(e.href),i.toResolve&&i.toResolve()}else if(this.status>=400&&i.toReject){var r=new FileReader;r.onload=function(){try{var e=JSON.parse(this.result,m);i.toReject(new Error(e.ctrl.text+" ("+e.ctrl.code+")"))}catch(e){i._tinode.logger("Invalid server response in LargeFileHelper",this.result),i.toReject(e)}},r.readAsText(this.response)}},this.xhr.onerror=function(e){i.toReject&&i.toReject(new Error("failed"))},this.xhr.onabort=function(){i.toReject&&i.toReject(null)};try{this.xhr.send()}catch(e){this.toReject&&this.toReject(e)}return a},cancel:function(){this.xhr&&this.xhr.readyState<4&&this.xhr.abort()},getId:function(){return this._msgId}};var C=function e(t,n){this.status=e.STATUS_NONE,this.topic=t,this.content=n};C.STATUS_NONE=0,C.STATUS_QUEUED=1,C.STATUS_SENDING=2,C.STATUS_FAILED=3,C.STATUS_SENT=4,C.STATUS_RECEIVED=5,C.STATUS_READ=6,C.STATUS_TO_ME=7,(C.prototype={toJSON:function(){},fromJSON:function(e){}}).constructor=C,(l=b).Drafty=e}.call(this,void 0!==t?t:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{}),l}()}).call(this,n(10))},function(e,t,n){e.exports=n(37)()},function(e,t,n){"use strict";!function e(){if("undefined"!=typeof __REACT_DEVTOOLS_GLOBAL_HOOK__&&"function"==typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE)try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(e)}catch(e){console.error(e)}}(),e.exports=n(20)},function(e,t,n){"use strict";var r=n(23).default;n(30),(t=e.exports=r).default=t},function(e,t,n){"use strict";(t=e.exports=n(39).default).default=t},function(e,t,n){"use strict";var r=n(31).default;n(36),(t=e.exports=r).default=t},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=n(1),o={NODE_CLIENT:!1,NODE_ADMIN:!1,SDK_VERSION:"${JSCORE_VERSION}"},i=function(e,t){if(!e)throw a(t)},a=function(e){return new Error("Firebase Database ("+o.SDK_VERSION+") INTERNAL ASSERT FAILED: "+e)},s=function(e){for(var t=[],n=0,r=0;r>6|192,t[n++]=63&o|128):55296==(64512&o)&&r+1>18|240,t[n++]=o>>12&63|128,t[n++]=o>>6&63|128,t[n++]=63&o|128):(t[n++]=o>>12|224,t[n++]=o>>6&63|128,t[n++]=63&o|128)}return t},l={byteToCharMap_:null,charToByteMap_:null,byteToCharMapWebSafe_:null,charToByteMapWebSafe_:null,ENCODED_VALS_BASE:"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789",get ENCODED_VALS(){return this.ENCODED_VALS_BASE+"+/="},get ENCODED_VALS_WEBSAFE(){return this.ENCODED_VALS_BASE+"-_."},HAS_NATIVE_SUPPORT:"function"==typeof atob,encodeByteArray:function(e,t){if(!Array.isArray(e))throw Error("encodeByteArray takes an array as a parameter");this.init_();for(var n=t?this.byteToCharMapWebSafe_:this.byteToCharMap_,r=[],o=0;o>2,d=(3&i)<<4|s>>4,f=(15&s)<<2|u>>6,p=63&u;l||(p=64,a||(f=64)),r.push(n[c],n[d],n[f],n[p])}return r.join("")},encodeString:function(e,t){return this.HAS_NATIVE_SUPPORT&&!t?btoa(e):this.encodeByteArray(s(e),t)},decodeString:function(e,t){return this.HAS_NATIVE_SUPPORT&&!t?atob(e):function(e){for(var t=[],n=0,r=0;n191&&o<224){var i=e[n++];t[r++]=String.fromCharCode((31&o)<<6|63&i)}else if(o>239&&o<365){var a=((7&o)<<18|(63&(i=e[n++]))<<12|(63&(s=e[n++]))<<6|63&e[n++])-65536;t[r++]=String.fromCharCode(55296+(a>>10)),t[r++]=String.fromCharCode(56320+(1023&a))}else{i=e[n++];var s=e[n++];t[r++]=String.fromCharCode((15&o)<<12|(63&i)<<6|63&s)}}return t.join("")}(this.decodeStringToByteArray(e,t))},decodeStringToByteArray:function(e,t){this.init_();for(var n=t?this.charToByteMapWebSafe_:this.charToByteMap_,r=[],o=0;o>4;if(r.push(u),64!=s){var c=a<<4&240|s>>2;if(r.push(c),64!=l){var d=s<<6&192|l;r.push(d)}}}return r},init_:function(){if(!this.byteToCharMap_){this.byteToCharMap_={},this.charToByteMap_={},this.byteToCharMapWebSafe_={},this.charToByteMapWebSafe_={};for(var e=0;e=this.ENCODED_VALS_BASE.length&&(this.charToByteMap_[this.ENCODED_VALS_WEBSAFE.charAt(e)]=e,this.charToByteMapWebSafe_[this.ENCODED_VALS.charAt(e)]=e)}}},u=function(e){try{return l.decodeString(e,!0)}catch(e){console.error("base64Decode failed: ",e)}return null};function c(e,t){if(!(t instanceof Object))return t;switch(t.constructor){case Date:return new Date(t.getTime());case Object:void 0===e&&(e={});break;case Array:e=[];break;default:return t}for(var n in t)t.hasOwnProperty(n)&&(e[n]=c(e[n],t[n]));return e}var d=function(){function e(){var e=this;this.promise=new Promise(function(t,n){e.resolve=t,e.reject=n})}return e.prototype.wrapCallback=function(e){var t=this;return function(n,r){n?t.reject(n):t.resolve(r),"function"==typeof e&&(t.promise.catch(function(){}),1===e.length?e(n):e(n,r))}},e}(),f=function(){return"undefined"!=typeof navigator&&"string"==typeof navigator.userAgent?navigator.userAgent:""},p="FirebaseError",h=Error.captureStackTrace;var m=function(){return function(e,t){if(this.code=e,this.message=t,h)h(this,y.prototype.create);else try{throw Error.apply(this,arguments)}catch(e){this.name=p,Object.defineProperty(this,"stack",{get:function(){return e.stack}})}}}();m.prototype=Object.create(Error.prototype),m.prototype.constructor=m,m.prototype.name=p;var y=function(){function e(e,t,n){this.service=e,this.serviceName=t,this.errors=n,this.pattern=/\{\$([^}]+)}/g}return e.prototype.create=function(e,t){void 0===t&&(t={});var n,r=this.errors[e],o=this.service+"/"+e;n=void 0===r?"Error":r.replace(this.pattern,function(e,n){var r=t[n];return void 0!==r?r.toString():"<"+n+"?>"}),n=this.serviceName+": "+n+" ("+o+").";var i=new m(o,n);for(var a in t)t.hasOwnProperty(a)&&"_"!==a.slice(-1)&&(i[a]=t[a]);return i},e}();function v(e){return JSON.parse(e)}var g=function(e){var t={},n={},r={},o="";try{var i=e.split(".");t=v(u(i[0])||""),n=v(u(i[1])||""),o=i[2],r=n.d||{},delete n.d}catch(e){}return{header:t,claims:n,data:r,signature:o}},b=function(e,t){for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&t(n,e[n])},_=function(e,t){return b(t,function(t,n){e[t]=n}),e},w=function(e,t,n){for(var r in e)if(t.call(n,e[r],r,e))return r},E=function(e){function t(){var t=e.call(this)||this;t.chain_=[],t.buf_=[],t.W_=[],t.pad_=[],t.inbuf_=0,t.total_=0,t.blockSize=64,t.pad_[0]=128;for(var n=1;n>>31)}var i,a,s=this.chain_[0],l=this.chain_[1],u=this.chain_[2],c=this.chain_[3],d=this.chain_[4];for(r=0;r<80;r++){r<40?r<20?(i=c^l&(u^c),a=1518500249):(i=l^u^c,a=1859775393):r<60?(i=l&u|c&(l|u),a=2400959708):(i=l^u^c,a=3395469782);o=(s<<5|s>>>27)+i+d+a+n[r]&4294967295;d=c,c=u,u=4294967295&(l<<30|l>>>2),l=s,s=o}this.chain_[0]=this.chain_[0]+s&4294967295,this.chain_[1]=this.chain_[1]+l&4294967295,this.chain_[2]=this.chain_[2]+u&4294967295,this.chain_[3]=this.chain_[3]+c&4294967295,this.chain_[4]=this.chain_[4]+d&4294967295},t.prototype.update=function(e,t){if(null!=e){void 0===t&&(t=e.length);for(var n=t-this.blockSize,r=0,o=this.buf_,i=this.inbuf_;r=56;n--)this.buf_[n]=255&t,t/=256;this.compress_(this.buf_);var r=0;for(n=0;n<5;n++)for(var o=24;o>=0;o-=8)e[r]=this.chain_[n]>>o&255,++r;return e},t}(function(){return function(){this.blockSize=-1}}());var S=function(){function e(e,t){var n=this;this.observers=[],this.unsubscribes=[],this.observerCount=0,this.task=Promise.resolve(),this.finalized=!1,this.onNoObservers=t,this.task.then(function(){e(n)}).catch(function(e){n.error(e)})}return e.prototype.next=function(e){this.forEachObserver(function(t){t.next(e)})},e.prototype.error=function(e){this.forEachObserver(function(t){t.error(e)}),this.close(e)},e.prototype.complete=function(){this.forEachObserver(function(e){e.complete()}),this.close()},e.prototype.subscribe=function(e,t,n){var r,o=this;if(void 0===e&&void 0===t&&void 0===n)throw new Error("Missing Observer.");void 0===(r=function(e,t){if("object"!=typeof e||null===e)return!1;for(var n=0,r=t;n 4. Need to update it?")}var o=e+" failed: ";return o+=r+" argument "}t.assert=i,t.assertionError=a,t.base64=l,t.base64Decode=u,t.base64Encode=function(e){var t=s(e);return l.encodeByteArray(t,!0)},t.CONSTANTS=o,t.deepCopy=function(e){return c(void 0,e)},t.deepExtend=c,t.patchProperty=function(e,t,n){e[t]=n},t.Deferred=d,t.getUA=f,t.isMobileCordova=function(){return"undefined"!=typeof window&&!!(window.cordova||window.phonegap||window.PhoneGap)&&/ios|iphone|ipod|ipad|android|blackberry|iemobile/i.test(f())},t.isNodeSdk=function(){return!0===o.NODE_CLIENT||!0===o.NODE_ADMIN},t.isReactNative=function(){return"object"==typeof navigator&&"ReactNative"===navigator.product},t.ErrorFactory=y,t.FirebaseError=m,t.patchCapture=function(e){var t=h;return h=e,t},t.jsonEval=v,t.stringify=function(e){return JSON.stringify(e)},t.decode=g,t.isAdmin=function(e){var t=g(e).claims;return"object"==typeof t&&!0===t.admin},t.issuedAtTime=function(e){var t=g(e).claims;return"object"==typeof t&&t.hasOwnProperty("iat")?t.iat:null},t.isValidFormat=function(e){var t=g(e).claims;return!!t&&"object"==typeof t&&t.hasOwnProperty("iat")},t.isValidTimestamp=function(e){var t,n,r=g(e).claims,o=Math.floor((new Date).getTime()/1e3);return"object"==typeof r&&(r.hasOwnProperty("nbf")?t=r.nbf:r.hasOwnProperty("iat")&&(t=r.iat),n=r.hasOwnProperty("exp")?r.exp:t+86400),o&&t&&n&&o>=t&&o<=n},t.clone=function(e){return _({},e)},t.contains=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},t.every=function(e,t){for(var n in e)if(Object.prototype.hasOwnProperty.call(e,n)&&!t(n,e[n]))return!1;return!0},t.extend=_,t.findKey=w,t.findValue=function(e,t,n){var r=w(e,t,n);return r&&e[r]},t.forEach=b,t.getAnyKey=function(e){for(var t in e)return t},t.getCount=function(e){var t=0;for(var n in e)t++;return t},t.getValues=function(e){var t=[],n=0;for(var r in e)t[n++]=e[r];return t},t.isEmpty=function(e){for(var t in e)return!1;return!0},t.isNonNullObject=function(e){return"object"==typeof e&&null!==e},t.map=function(e,t,n){var r={};for(var o in e)r[o]=t.call(n,e[o],o,e);return r},t.safeGet=function(e,t){if(Object.prototype.hasOwnProperty.call(e,t))return e[t]},t.querystring=function(e){var t=[];return b(e,function(e,n){Array.isArray(n)?n.forEach(function(n){t.push(encodeURIComponent(e)+"="+encodeURIComponent(n))}):t.push(encodeURIComponent(e)+"="+encodeURIComponent(n))}),t.length?"&"+t.join("&"):""},t.querystringDecode=function(e){var t={};return e.replace(/^\?/,"").split("&").forEach(function(e){if(e){var n=e.split("=");t[n[0]]=n[1]}}),t},t.Sha1=E,t.async=function(e,t){return function(){for(var n=[],r=0;rn&&(o=0===n?"none":"no more than "+n),o)throw new Error(e+" failed: Was called with "+r+(1===r?" argument.":" arguments.")+" Expects "+o+".")},t.validateCallback=function(e,t,n,r){if((!r||n)&&"function"!=typeof n)throw new Error(k(e,t,r)+"must be a valid function.")},t.validateContextObject=function(e,t,n,r){if((!r||n)&&("object"!=typeof n||null===n))throw new Error(k(e,t,r)+"must be a valid context object.")},t.validateNamespace=function(e,t,n,r){if((!r||n)&&"string"!=typeof n)throw new Error(k(e,t,r)+"must be a valid firebase namespace.")},t.stringLength=function(e){for(var t=0,n=0;n=55296&&r<=56319?(t+=4,n++):t+=3}return t},t.stringToByteArray=function(e){for(var t=[],n=0,r=0;r=55296&&o<=56319){var a=o-55296;i(++r>6|192,t[n++]=63&o|128):o<65536?(t[n++]=o>>12|224,t[n++]=o>>6&63|128,t[n++]=63&o|128):(t[n++]=o>>18|240,t[n++]=o>>12&63|128,t[n++]=o>>6&63|128,t[n++]=63&o|128)}return t}},function(e,t,n){"use strict";e.exports=function(e,t,n,r,o,i,a,s){if(!e){var l;if(void 0===t)l=new Error("Minified exception occurred; use the non-minified dev environment for the full error message and additional helpful warnings.");else{var u=[n,r,o,i,a,s],c=0;(l=new Error(t.replace(/%s/g,function(){return u[c++]}))).name="Invariant Violation"}throw l.framesToPop=1,l}}},function(e,t){var n;n=function(){return this}();try{n=n||Function("return this")()||(0,eval)("this")}catch(e){"object"==typeof window&&(n=window)}e.exports=n},function(e){e.exports={en:{contacts_not_found:"You have no chats
¯\\\\_(ツ)_/¯",full_name_prompt:"Full name, e.g. John Doe",email_prompt:"Email, e.g. jdoe@example.com",button_sign_up:"Sign up",label_your_name:"Your name",label_password:"Password",password_unchanged_prompt:"Unchanged",label_user_id:"Address:",label_default_access_mode:"Default access mode:",label_message_sound:"Message sound:",label_push_notifications:"Notification alerts:",label_push_notifications_disabled:"Notification alerts (requires HTTPS):",title_tag_manager:"Tags (user discovery)",button_logout:"Logout",login_prompt:"Login",password_prompt:"Password",stay_logged_in:"Stay logged in",forgot_password_link:"Forgot password?",button_sign_in:"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",tabtitle_find_user:"find",tabtitle_new_group:"new group",tabtitle_group_by_id:"by id",search_for_contacts:"Use search to find contacts",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",sidepanel_title_edit_account:"Edit Account",sidepanel_title_newtpk:"Start New Chat",sidepanel_title_cred:"Confirm Credentials",sidepanel_title_reset:"Reset Password",phone:"phone",email:"email",enter_confirmation_code_prompt:"Enter confirmation code sent to you by {method}:",numeric_confirmation_code_prompt:"Numbers only",button_confirm:"Confirm",invalid_content:"invalid content",button_ok:"OK",button_cancel:"Cancel",label_file_name:"File name:",label_content_type:"Content type:",label_size:"Size:",message_sending:"sending...",message_sending_failed:"failed",search_placeholder:"List like email:alice@example.com, tel:17025550003...",messaging_disabled_prompt:"Messaging disabled",new_message_prompt:"New message",file_attachment_too_large:"The file size {size} exceeds the {limit} limit.",cannot_initiate_file_upload:"Cannot initiate file upload.",tags_not_found:"No tags defined. Add some.",tags_editor_no_tags:"Add some tags",title_manage_tags:"Manage tags"},ru:{contacts_not_found:"Чатов нет
¯\\\\_(ツ)_/¯",full_name_prompt:"Полное имя, напр. Иван Петров",email_prompt:"Email, напр. ivan@example.com",button_sign_up:"Создать счет",label_your_name:"Ваше имя",label_password:"Пароль",password_unchanged_prompt:"Не изменен",label_user_id:"Адрес:",label_default_access_mode:"Доступ по умолчанию:",label_message_sound:"Звук нового сообщения:",label_push_notifications:"Уведомления:",label_push_notifications_disabled:"Уведомления (требуют HTTPS):",title_tag_manager:"Таги для поиска",button_logout:"Выйти",login_prompt:"Логин",password_prompt:"Пароль",stay_logged_in:"Запомнить",forgot_password_link:"Напомнить пароль",button_sign_in:"Войти",label_client:"Клиент:",label_server:"Сервер:",online_now:"онлайн",last_seen_timestamp:"Был активен",title_not_found:"Не найден",unnamed_topic:"Без названия",messages_not_readable:"нет доступа к сообщениям",tabtitle_find_user:"найти",tabtitle_new_group:"создать",tabtitle_group_by_id:"по id",label_server_to_use:"Использовать сервер:",label_wire_transport:"Соединение:",button_update:"Применить",sidepanel_title_login:"Авторизация",sidepanel_title_register:"Зарегистрироваться",sidepanel_title_settings:"Настройки",sidepanel_title_edit_account:"Редактировать счет",sidepanel_title_newtpk:"Новый чат",sidepanel_title_cred:"Подтвердить",sidepanel_title_reset:"Сменить пароль",tags_not_found:"Тагов нет. Добавьте",tags_editor_no_tags:"Добавьте таги",title_manage_tags:"Редактор тагов",message_sending:"шлём...",message_sending_failed:"ошибка",search_placeholder:"Список, напр. email:alice@example.com, tel:17025550003...",messaging_disabled_prompt:"Отправка недоступна",new_message_prompt:"Новое сообщение",file_attachment_too_large:"Размер файла {size} превышает {limit} лимит.",cannot_initiate_file_upload:"Ошибка загрузки файла."}}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=n(8),o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},i="[DEFAULT]",a=[],s=function(){function e(e,t,n){this.firebase_=n,this.isDeleted_=!1,this.services_={},this.name_=t.name,this._automaticDataCollectionEnabled=t.automaticDataCollectionEnabled||!1,this.options_=r.deepCopy(e),this.INTERNAL={getUid:function(){return null},getToken:function(){return Promise.resolve(null)},addAuthTokenListener:function(e){a.push(e),setTimeout(function(){return e(null)},0)},removeAuthTokenListener:function(e){a=a.filter(function(t){return t!==e})}}}return Object.defineProperty(e.prototype,"automaticDataCollectionEnabled",{get:function(){return this.checkDestroyed_(),this._automaticDataCollectionEnabled},set:function(e){this.checkDestroyed_(),this._automaticDataCollectionEnabled=e},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"name",{get:function(){return this.checkDestroyed_(),this.name_},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"options",{get:function(){return this.checkDestroyed_(),this.options_},enumerable:!0,configurable:!0}),e.prototype.delete=function(){var e=this;return new Promise(function(t){e.checkDestroyed_(),t()}).then(function(){e.firebase_.INTERNAL.removeApp(e.name_);var t=[];return Object.keys(e.services_).forEach(function(n){Object.keys(e.services_[n]).forEach(function(r){t.push(e.services_[n][r])})}),Promise.all(t.map(function(e){return e.INTERNAL.delete()}))}).then(function(){e.isDeleted_=!0,e.services_={}})},e.prototype._getService=function(e,t){if(void 0===t&&(t=i),this.checkDestroyed_(),this.services_[e]||(this.services_[e]={}),!this.services_[e][t]){var n=t!==i?t:void 0,r=this.firebase_.INTERNAL.factories[e](this,this.extendApp.bind(this),n);this.services_[e][t]=r}return this.services_[e][t]},e.prototype.extendApp=function(e){var t=this;r.deepExtend(this,e),e.INTERNAL&&e.INTERNAL.addAuthTokenListener&&(a.forEach(function(e){t.INTERNAL.addAuthTokenListener(e)}),a=[])},e.prototype.checkDestroyed_=function(){this.isDeleted_&&l("app-deleted",{name:this.name_})},e}();function l(e,t){throw u.create(e,t)}s.prototype.name&&s.prototype.options||s.prototype.delete||console.log("dc");var u=new r.ErrorFactory("app","Firebase",{"no-app":"No Firebase App '{$name}' has been created - call Firebase App.initializeApp()","bad-app-name":"Illegal App name: '{$name}","duplicate-app":"Firebase App named '{$name}' already exists","app-deleted":"Firebase App named '{$name}' already deleted","duplicate-service":"Firebase service named '{$name}' already registered","sa-not-supported":"Initializing the Firebase SDK with a service account is only allowed in a Node.js environment. On client devices, you should instead initialize the SDK with an api key and auth domain","invalid-app-argument":"firebase.{$name}() takes either no argument or a Firebase App instance."}),c=function e(){var t={},n={},a={},u={__esModule:!0,initializeApp:function(e,n){if(void 0===n&&(n={}),"object"!=typeof n||null===n){var r=n;n={name:r}}var a=n;void 0===a.name&&(a.name=i);var c=a.name;"string"==typeof c&&c||l("bad-app-name",{name:c+""}),o(t,c)&&l("duplicate-app",{name:c});var d=new s(e,a,u);return t[c]=d,f(d,"create"),d},app:c,apps:null,Promise:Promise,SDK_VERSION:"5.5.0",INTERNAL:{registerService:function(e,t,o,i,f){n[e]&&l("duplicate-service",{name:e}),n[e]=t,i&&(a[e]=i,d().forEach(function(e){i("create",e)}));var p=function(t){return void 0===t&&(t=c()),"function"!=typeof t[e]&&l("invalid-app-argument",{name:e}),t[e]()};return void 0!==o&&r.deepExtend(p,o),u[e]=p,s.prototype[e]=function(){for(var t=[],n=0;n=2&&i<=4&&(a<12||a>14)?"few":o&&0==i||o&&i>=5&&i<=9||o&&a>=11&&a<=14?"many":"other"},fields:{year:{displayName:"год",relative:{0:"в этом году",1:"в следующем году","-1":"в прошлом году"},relativeTime:{future:{one:"через {0} год",few:"через {0} года",many:"через {0} лет",other:"через {0} года"},past:{one:"{0} год назад",few:"{0} года назад",many:"{0} лет назад",other:"{0} года назад"}}},month:{displayName:"месяц",relative:{0:"в этом месяце",1:"в следующем месяце","-1":"в прошлом месяце"},relativeTime:{future:{one:"через {0} месяц",few:"через {0} месяца",many:"через {0} месяцев",other:"через {0} месяца"},past:{one:"{0} месяц назад",few:"{0} месяца назад",many:"{0} месяцев назад",other:"{0} месяца назад"}}},day:{displayName:"день",relative:{0:"сегодня",1:"завтра",2:"послезавтра","-2":"позавчера","-1":"вчера"},relativeTime:{future:{one:"через {0} день",few:"через {0} дня",many:"через {0} дней",other:"через {0} дня"},past:{one:"{0} день назад",few:"{0} дня назад",many:"{0} дней назад",other:"{0} дня назад"}}},hour:{displayName:"час",relative:{0:"в этом часе"},relativeTime:{future:{one:"через {0} час",few:"через {0} часа",many:"через {0} часов",other:"через {0} часа"},past:{one:"{0} час назад",few:"{0} часа назад",many:"{0} часов назад",other:"{0} часа назад"}}},minute:{displayName:"минута",relative:{0:"в эту минуту"},relativeTime:{future:{one:"через {0} минуту",few:"через {0} минуты",many:"через {0} минут",other:"через {0} минуты"},past:{one:"{0} минуту назад",few:"{0} минуты назад",many:"{0} минут назад",other:"{0} минуты назад"}}},second:{displayName:"секунда",relative:{0:"сейчас"},relativeTime:{future:{one:"через {0} секунду",few:"через {0} секунды",many:"через {0} секунд",other:"через {0} секунды"},past:{one:"{0} секунду назад",few:"{0} секунды назад",many:"{0} секунд назад",other:"{0} секунды назад"}}}}},{locale:"ru-BY",parentLocale:"ru"},{locale:"ru-KG",parentLocale:"ru"},{locale:"ru-KZ",parentLocale:"ru"},{locale:"ru-MD",parentLocale:"ru"},{locale:"ru-UA",parentLocale:"ru"}]}()},function(e,t,n){e.exports=n(47)},function(e,t,n){"use strict"; +*/var r=Object.getOwnPropertySymbols,o=Object.prototype.hasOwnProperty,i=Object.prototype.propertyIsEnumerable;e.exports=function(){try{if(!Object.assign)return!1;var e=new String("abc");if(e[5]="de","5"===Object.getOwnPropertyNames(e)[0])return!1;for(var t={},n=0;n<10;n++)t["_"+String.fromCharCode(n)]=n;if("0123456789"!==Object.getOwnPropertyNames(t).map(function(e){return t[e]}).join(""))return!1;var r={};return"abcdefghijklmnopqrst".split("").forEach(function(e){r[e]=e}),"abcdefghijklmnopqrst"===Object.keys(Object.assign({},r)).join("")}catch(e){return!1}}()?Object.assign:function(e,t){for(var n,a,s=function(e){if(null===e||void 0===e)throw new TypeError("Object.assign cannot be called with null or undefined");return Object(e)}(e),l=1;l=2&&i<=4&&(a<12||a>14)?"few":o&&0==i||o&&i>=5&&i<=9||o&&a>=11&&a<=14?"many":"other"},fields:{year:{displayName:"год",relative:{0:"в этом году",1:"в следующем году","-1":"в прошлом году"},relativeTime:{future:{one:"через {0} год",few:"через {0} года",many:"через {0} лет",other:"через {0} года"},past:{one:"{0} год назад",few:"{0} года назад",many:"{0} лет назад",other:"{0} года назад"}}},month:{displayName:"месяц",relative:{0:"в этом месяце",1:"в следующем месяце","-1":"в прошлом месяце"},relativeTime:{future:{one:"через {0} месяц",few:"через {0} месяца",many:"через {0} месяцев",other:"через {0} месяца"},past:{one:"{0} месяц назад",few:"{0} месяца назад",many:"{0} месяцев назад",other:"{0} месяца назад"}}},day:{displayName:"день",relative:{0:"сегодня",1:"завтра",2:"послезавтра","-2":"позавчера","-1":"вчера"},relativeTime:{future:{one:"через {0} день",few:"через {0} дня",many:"через {0} дней",other:"через {0} дня"},past:{one:"{0} день назад",few:"{0} дня назад",many:"{0} дней назад",other:"{0} дня назад"}}},hour:{displayName:"час",relative:{0:"в этом часе"},relativeTime:{future:{one:"через {0} час",few:"через {0} часа",many:"через {0} часов",other:"через {0} часа"},past:{one:"{0} час назад",few:"{0} часа назад",many:"{0} часов назад",other:"{0} часа назад"}}},minute:{displayName:"минута",relative:{0:"в эту минуту"},relativeTime:{future:{one:"через {0} минуту",few:"через {0} минуты",many:"через {0} минут",other:"через {0} минуты"},past:{one:"{0} минуту назад",few:"{0} минуты назад",many:"{0} минут назад",other:"{0} минуты назад"}}},second:{displayName:"секунда",relative:{0:"сейчас"},relativeTime:{future:{one:"через {0} секунду",few:"через {0} секунды",many:"через {0} секунд",other:"через {0} секунды"},past:{one:"{0} секунду назад",few:"{0} секунды назад",many:"{0} секунд назад",other:"{0} секунды назад"}}}}},{locale:"ru-BY",parentLocale:"ru"},{locale:"ru-KG",parentLocale:"ru"},{locale:"ru-KZ",parentLocale:"ru"},{locale:"ru-MD",parentLocale:"ru"},{locale:"ru-UA",parentLocale:"ru"}]}()},function(e,t,n){e.exports=n(47)},function(e,t,n){"use strict"; /** @license React v16.5.2 * react.production.min.js * @@ -26,7 +26,7 @@ object-assign * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. - */var r=n(13),o="function"==typeof Symbol&&Symbol.for,i=o?Symbol.for("react.element"):60103,a=o?Symbol.for("react.portal"):60106,s=o?Symbol.for("react.fragment"):60107,l=o?Symbol.for("react.strict_mode"):60108,u=o?Symbol.for("react.profiler"):60114,c=o?Symbol.for("react.provider"):60109,p=o?Symbol.for("react.context"):60110,f=o?Symbol.for("react.async_mode"):60111,d=o?Symbol.for("react.forward_ref"):60112;o&&Symbol.for("react.placeholder");var h="function"==typeof Symbol&&Symbol.iterator;function m(e){for(var t=arguments.length-1,n="https://reactjs.org/docs/error-decoder.html?invariant="+e,r=0;rP.length&&P.push(e)}function M(e,t,n){return null==e?0:function e(t,n,r,o){var s=typeof t;"undefined"!==s&&"boolean"!==s||(t=null);var l=!1;if(null===t)l=!0;else switch(s){case"string":case"number":l=!0;break;case"object":switch(t.$$typeof){case i:case a:l=!0}}if(l)return r(o,t,""===n?"."+A(t,0):n),1;if(l=0,n=""===n?".":n+":",Array.isArray(t))for(var u=0;uP.length&&P.push(e)}function M(e,t,n){return null==e?0:function e(t,n,r,o){var s=typeof t;"undefined"!==s&&"boolean"!==s||(t=null);var l=!1;if(null===t)l=!0;else switch(s){case"string":case"number":l=!0;break;case"object":switch(t.$$typeof){case i:case a:l=!0}}if(l)return r(o,t,""===n?"."+A(t,0):n),1;if(l=0,n=""===n?".":n+":",Array.isArray(t))for(var u=0;uthis.eventPool.length&&this.eventPool.push(e)}function de(e){e.eventPool=[],e.getPooled=pe,e.release=fe}o(ce.prototype,{preventDefault:function(){this.defaultPrevented=!0;var e=this.nativeEvent;e&&(e.preventDefault?e.preventDefault():"unknown"!=typeof e.returnValue&&(e.returnValue=!1),this.isDefaultPrevented=le)},stopPropagation:function(){var e=this.nativeEvent;e&&(e.stopPropagation?e.stopPropagation():"unknown"!=typeof e.cancelBubble&&(e.cancelBubble=!0),this.isPropagationStopped=le)},persist:function(){this.isPersistent=le},isPersistent:ue,destructor:function(){var e,t=this.constructor.Interface;for(e in t)this[e]=null;this.nativeEvent=this._targetInst=this.dispatchConfig=null,this.isPropagationStopped=this.isDefaultPrevented=ue,this._dispatchInstances=this._dispatchListeners=null}}),ce.Interface={type:null,target:null,currentTarget:function(){return null},eventPhase:null,bubbles:null,cancelable:null,timeStamp:function(e){return e.timeStamp||Date.now()},defaultPrevented:null,isTrusted:null},ce.extend=function(e){function t(){}function n(){return r.apply(this,arguments)}var r=this;t.prototype=r.prototype;var i=new t;return o(i,n.prototype),n.prototype=i,n.prototype.constructor=n,n.Interface=o({},r.Interface,e),n.extend=r.extend,de(n),n},de(ce);var he=ce.extend({data:null}),me=ce.extend({data:null}),ye=[9,13,27,32],ve=G&&"CompositionEvent"in window,ge=null;G&&"documentMode"in document&&(ge=document.documentMode);var be=G&&"TextEvent"in window&&!ge,_e=G&&(!ve||ge&&8=ge),we=String.fromCharCode(32),Ee={beforeInput:{phasedRegistrationNames:{bubbled:"onBeforeInput",captured:"onBeforeInputCapture"},dependencies:["compositionend","keypress","textInput","paste"]},compositionEnd:{phasedRegistrationNames:{bubbled:"onCompositionEnd",captured:"onCompositionEndCapture"},dependencies:"blur compositionend keydown keypress keyup mousedown".split(" ")},compositionStart:{phasedRegistrationNames:{bubbled:"onCompositionStart",captured:"onCompositionStartCapture"},dependencies:"blur compositionstart keydown keypress keyup mousedown".split(" ")},compositionUpdate:{phasedRegistrationNames:{bubbled:"onCompositionUpdate",captured:"onCompositionUpdateCapture"},dependencies:"blur compositionupdate keydown keypress keyup mousedown".split(" ")}},Se=!1;function Te(e,t){switch(e){case"keyup":return-1!==ye.indexOf(t.keyCode);case"keydown":return 229!==t.keyCode;case"keypress":case"mousedown":case"blur":return!0;default:return!1}}function ke(e){return"object"==typeof(e=e.detail)&&"data"in e?e.data:null}var Ce=!1;var Oe={eventTypes:Ee,extractEvents:function(e,t,n,r){var o=void 0,i=void 0;if(ve)e:{switch(e){case"compositionstart":o=Ee.compositionStart;break e;case"compositionend":o=Ee.compositionEnd;break e;case"compositionupdate":o=Ee.compositionUpdate;break e}o=void 0}else Ce?Te(e,n)&&(o=Ee.compositionEnd):"keydown"===e&&229===n.keyCode&&(o=Ee.compositionStart);return o?(_e&&"ko"!==n.locale&&(Ce||o!==Ee.compositionStart?o===Ee.compositionEnd&&Ce&&(i=se()):(ie="value"in(oe=r)?oe.value:oe.textContent,Ce=!0)),o=he.getPooled(o,t,n,r),i?o.data=i:null!==(i=ke(n))&&(o.data=i),z(o),i=o):i=null,(e=be?function(e,t){switch(e){case"compositionend":return ke(t);case"keypress":return 32!==t.which?null:(Se=!0,we);case"textInput":return(e=t.data)===we&&Se?null:e;default:return null}}(e,n):function(e,t){if(Ce)return"compositionend"===e||!ve&&Te(e,t)?(e=se(),ae=ie=oe=null,Ce=!1,e):null;switch(e){case"paste":return null;case"keypress":if(!(t.ctrlKey||t.altKey||t.metaKey)||t.ctrlKey&&t.altKey){if(t.char&&1