diff --git a/.babelrc b/.babelrc index 6bf79013..dadaf7ac 100644 --- a/.babelrc +++ b/.babelrc @@ -1,4 +1,13 @@ { "presets": ["@babel/preset-react", "@babel/preset-env"], "comments": false, + "plugins": [ + [ + "formatjs", + { + "idInterpolationPattern": "[sha512:contenthash:base64:6]", + "ast": true + } + ] + ] } diff --git a/package.json b/package.json index 1a40d57d..d82e22c5 100644 --- a/package.json +++ b/package.json @@ -67,8 +67,8 @@ "@babel/core": "^7.12.10", "@babel/preset-env": "^7.12.11", "@babel/preset-react": "^7.12.10", - "@formatjs/cli": "^3.0.1", "babel-loader": "^8.2.2", + "babel-plugin-formatjs": "^9.0.2", "browserslist": "^4.16.1", "copy-webpack-plugin": "^6.4.1", "cssnano": "^4.1.10", diff --git a/src/views/tinode-web.jsx b/src/views/tinode-web.jsx index 9f9527c1..a976a50d 100644 --- a/src/views/tinode-web.jsx +++ b/src/views/tinode-web.jsx @@ -240,7 +240,7 @@ class TinodeWeb extends React.Component { console.log("Failed to register service worker:", err); }); } catch (err) { - this.handleError(formatMessage({id: 'push_init_failed'}), 'err'); + this.handleError(formatMessage(messages.push_init_failed), 'err'); console.log("Failed to initialize push notifications", err); this.setState({desktopAlertsEnabled: false}); } @@ -361,7 +361,7 @@ class TinodeWeb extends React.Component { if (online) { this.handleError(); } else { - this.handleError(this.props.intl.formatMessage({id: 'no_connection'}), 'warn'); + this.handleError(this.props.intl.formatMessage(messages.no_connection), 'warn'); } this.setState({liveConnection: online}); } @@ -484,7 +484,7 @@ class TinodeWeb extends React.Component { if (ctrl.code >= 300 && ctrl.text === 'validate credentials') { this.setState({loadSpinnerVisible: false}); if (cred) { - this.handleError(this.props.intl.formatMessage({id: 'code_doesnot_match'}), 'warn'); + this.handleError(this.props.intl.formatMessage(messages.code_doesnot_match), 'warn'); } this.handleCredentialsRequest(ctrl.params); } else { @@ -1375,7 +1375,7 @@ class TinodeWeb extends React.Component { handleResetPassword(scheme, newPassword, token) { token = base64ReEncode(token); if (!token) { - this.handleError(this.props.intl.formatMessage({id: 'invalid_security_token'}), 'err'); + this.handleError(this.props.intl.formatMessage(messages.invalid_security_token), 'err'); } else { this.tinode.connect() .then(() => { diff --git a/src/widgets/context-menu.jsx b/src/widgets/context-menu.jsx index 92f78fbb..909f4cd4 100644 --- a/src/widgets/context-menu.jsx +++ b/src/widgets/context-menu.jsx @@ -107,7 +107,7 @@ class ContextMenu extends React.Component { title: formatMessage(messages.clear_messages), handler: (params, errorHandler) => { return props.onShowAlert( - formatMessage({id: 'menu_item_clear_messages'}), // title + formatMessage(messages.menu_item_clear_messages), // title formatMessage({id: 'clear_messages_warning'}), // content (() => { this.deleteMessages(true, false, params, errorHandler); }), // onConfirm null, // "OK" @@ -121,7 +121,7 @@ class ContextMenu extends React.Component { title: formatMessage(messages.clear_for_all), handler: (params, errorHandler) => { return props.onShowAlert( - formatMessage({id: 'menu_item_clear_messages_for_all'}), // title + formatMessage(messages.menu_item_clear_messages_for_all), // title formatMessage({id: 'delete_messages_warning'}), // content (() => { return this.deleteMessages(true, true, params, errorHandler); }), null, // "OK" @@ -171,7 +171,7 @@ class ContextMenu extends React.Component { title: formatMessage(messages.block), handler: (params, errorHandler) => { return props.onShowAlert( - formatMessage({id: 'menu_item_block'}), // title + formatMessage(messages.menu_item_block), // title formatMessage(messages.topic_block_warning), // content (() => { return this.topicPermissionSetter('-JP', params, errorHandler).then((ctrl) => { @@ -190,7 +190,7 @@ class ContextMenu extends React.Component { title: formatMessage(messages.topic_delete), handler: (params, errorHandler) => { return props.onShowAlert( - formatMessage({id: 'menu_item_delete_topic'}), // title + formatMessage(messages.menu_item_delete_topic), // title formatMessage(messages.topic_delete_warning), // content (() => { const topic = this.props.tinode.getTopic(params.topicName); diff --git a/umd/index.dev.js b/umd/index.dev.js index e2fd9546..ff9392b5 100644 --- a/umd/index.dev.js +++ b/umd/index.dev.js @@ -1,2 +1,2 @@ -!function(){"use strict";var e={"./src/config.js":function(e,t,s){s.r(t),s.d(t,{APP_NAME:function(){return a},API_KEY:function(){return i},KNOWN_HOSTS:function(){return n},DEFAULT_HOST:function(){return o},LOGGING_ENABLED:function(){return r},KEYPRESS_DELAY:function(){return l},RECEIVED_DELAY:function(){return c},READ_DELAY:function(){return d},MIN_TAG_LENGTH:function(){return h},MAX_TAG_LENGTH:function(){return p},MAX_TAG_COUNT:function(){return m},DEFAULT_P2P_ACCESS_MODE:function(){return u},NEW_GRP_ACCESS_MODE:function(){return g},CHANNEL_ACCESS_MODE:function(){return _},NO_ACCESS_MODE:function(){return b},MEDIA_BREAKPOINT:function(){return f},REM_SIZE:function(){return v},AVATAR_SIZE:function(){return E},BROKEN_IMAGE_SIZE:function(){return w},MESSAGES_PAGE:function(){return S},MAX_INBAND_ATTACHMENT_SIZE:function(){return C},MAX_EXTERN_ATTACHMENT_SIZE:function(){return M},MAX_IMAGE_DIM:function(){return k},IMAGE_PREVIEW_DIM:function(){return T},MAX_ONLINE_IN_TOPIC:function(){return A},MAX_TITLE_LENGTH:function(){return N},LINK_CONTACT_US:function(){return y},LINK_PRIVACY_POLICY:function(){return P},LINK_TERMS_OF_SERVICE:function(){return x}});const a="TinodeWeb/"+(s("./src/version.js").PACKAGE_VERSION||"0.16"),i="AQEAAAABAAD_rAp4DJh05a1HAwFT3A6K",n={hosted:"web.tinode.co",local:"localhost:6060"},o=n.hosted,r=!0,l=3e3,c=500,d=1e3,h=2,p=96,m=16,u="JRWPS",g="JRWPSAO",_="JR",b="N",f=640,v=13,E=128,w=32,S=24,C=262144,M=1<<23,k=1024,T=64,A=4,N=60,y="email:info@tinode.co",P="https://tinode.co/privacy.html",x="https://tinode.co/terms.html"},"./src/index.js":function(e,t,s){s.r(t);var a=s("react"),i=s.n(a),n=s("react-dom"),o=s.n(n),r=s("react-intl"),l=s("./src/messages.json"),c=s("./src/views/tinode-web.jsx"),d=s("./src/lib/navigation.js");const{params:h}=d.default.parseUrlHash(window.location.hash),p=h&&h.hl||navigator.languages&&navigator.languages[0]||navigator.language||navigator.userLanguage||"en",m=p.toLowerCase().split(/[-_]/)[0],u=l[p]||l[m]||l.en;o().render(i().createElement(r.IntlProvider,{locale:p,messages:u,textComponent:i().Fragment},i().createElement(c.default,null)),document.getElementById("mountPoint"))},"./src/lib/blob-helpers.js":function(e,t,s){s.r(t),s.d(t,{SUPPORTED_IMAGE_FORMATS:function(){return i},MIME_EXTENSIONS:function(){return n},makeImageUrl:function(){return o},fitImageSize:function(){return r},fileNameForMime:function(){return l},imageScaled:function(){return c},fileToBase64:function(){return d},blobToBase64:function(){return h},filePasted:function(){return p},getMimeType:function(){return m},base64EncodedLen:function(){return u},base64DecodedLen:function(){return g},base64ReEncode:function(){return _}});var a=s("./src/config.js");s("./src/lib/strformat.js");const i=["image/jpeg","image/gif","image/png","image/svg","image/svg+xml"],n=["jpg","gif","png","svg","svg"];function o(e){return e&&e.type&&e.data?"data:image/"+e.type+";base64,"+e.data:null}function r(e,t,s,a,i){if(t|=0,s|=0,a|=0,(e|=0)<=0||t<=0||s<=0||a<=0)return null;i&&(s=a=Math.min(s,a));let n=Math.min(Math.min(e,s)/e,Math.min(t,a)/t),o={dstWidth:e*n|0,dstHeight:t*n|0};return i?(o.dstWidth=o.dstHeight=Math.min(o.dstWidth,o.dstHeight),o.srcWidth=o.srcHeight=Math.min(e,t),o.xoffset=(e-o.srcWidth)/2|0,o.yoffset=(t-o.srcWidth)/2|0):(o.xoffset=o.yoffset=0,o.srcWidth=e,o.srcHeight=t),o}function l(e,t){const s=i.indexOf(t);if(s<0||!e)return e;const a=n[s],o=e.lastIndexOf(".");return o>=0&&(e=e.substring(0,o)),e+"."+a}function c(e,t,s,a,n,o,c){const d=new Image;d.crossOrigin="Anonymous",d.onerror=function(e){c("Image format unrecognized")},d.onload=async function(){URL.revokeObjectURL(d.src);const h=r(this.width,this.height,t,s,n);if(!h)return void c("Invalid image");let p=document.createElement("canvas");p.width=h.dstWidth,p.height=h.dstHeight;let m=p.getContext("2d");m.imageSmoothingEnabled=!0,m.drawImage(this,h.xoffset,h.yoffset,h.srcWidth,h.srcHeight,0,0,h.dstWidth,h.dstHeight);const u=i.indexOf(e.type)<0?"image/jpeg":e.type;let g=await new Promise((e=>p.toBlob(e,u)));if(g){for(;a>0&&g.length>a;)h.dstWidth=.70710678118*h.dstWidth|0,h.dstHeight=.70710678118*h.dstHeight|0,p.width=h.dstWidth,p.height=h.dstHeight,m=p.getContext("2d"),m.clearRect(0,0,p.width,p.height),m.drawImage(this,h.xoffset,h.yoffset,h.srcWidth,h.srcHeight,0,0,h.dstWidth,h.dstHeight),g=await new Promise((e=>p.toBlob(e,u)));p=null,o(g,u,h.dstWidth,h.dstHeight,l(e.name,u))}else c("Unsupported image format")},d.src=URL.createObjectURL(e)}function d(e,t){const s=new FileReader;s.addEventListener("load",(function(){t(e.type,s.result.split(",")[1],e.name)})),s.readAsDataURL(e)}function h(e,t){const s=new FileReader;s.addEventListener("load",(function(){t(e.type,s.result.split(",")[1])})),s.readAsDataURL(e)}function p(e,t,s,n){var o=(e.clipboardData||e.originalEvent.clipboardData||{}).items;for(var r in o){var l=o[r];if("file"===l.kind){var c=l.getAsFile();if(!c){console.log("Failed to get file object from pasted file item",l.kind,l.type);continue}return c.type&&"image"==c.type.split("/")[0]?c.size>a.MAX_INBAND_ATTACHMENT_SIZE||i.indexOf(c.type)<0?imageFileScaledToBase64(c,a.MAX_IMAGE_DIM,a.MAX_IMAGE_DIM,!1,t,n):imageFileToBase64(c,t,n):d(c,s),!0}}return!1}function m(e){var t=/^data:(image\/[-+a-z0-9.]+);base64/.exec(e);return t&&t.length>1?t[1]:null}function u(e){return 4*Math.floor((e+2)/3)}function g(e){return 3*Math.floor(e/4)}function _(e){if(e){e=e.replace(/-/g,"+").replace(/_/g,"/");try{e=btoa(atob(e))}catch(t){console.log("Failed to base64 re-encode string.",t),e=null}}return e}},"./src/lib/host-name.js":function(e,t,s){s.r(t),s.d(t,{detectServerAddress:function(){return i},isSecureConnection:function(){return n},isLocalHost:function(){return o}});var a=s("./src/config.js");function i(){let e=a.DEFAULT_HOST;return"object"==typeof window.location&&("file:"==window.location.protocol||"localhost"==window.location.hostname?e=a.KNOWN_HOSTS.local:window.location.hostname&&(e=window.location.hostname+(window.location.port?":"+window.location.port:""))),e}function n(){return"object"==typeof window.location&&"https:"==window.location.protocol}function o(){return"object"==typeof window.location&&"localhost"==window.location.hostname}},"./src/lib/local-storage.js":function(e,t,s){s.r(t),s.d(t,{default:function(){return a}});class a{static setObject(e,t){localStorage.setItem(e,JSON.stringify(t))}static getObject(e){const t=localStorage.getItem(e);return t&&JSON.parse(t)}static updateObject(e,t){const s=this.getObject(e);this.setObject(e,Object.assign(s||{},t))}static removeItem(e){localStorage.removeItem(e)}}},"./src/lib/navigation.js":function(e,t,s){s.r(t),s.d(t,{default:function(){return a}});class a{static parseUrlHash(e){const t=e.split("?",2),s={};let a=[];return t[0]&&(a=t[0].substr(1).split("/")),t[1]&&t[1].split("&").forEach((function(e){let t=e.split("=");t[0]&&(s[decodeURIComponent(t[0])]=decodeURIComponent(t[1]))})),{path:a,params:s}}static navigateTo(e){window.location.hash=e}static composeUrlHash(e,t){let s=e.join("/");const a=[];for(const e in t)t.hasOwnProperty(e)&&a.push(e+"="+t[e]);return a.length>0&&(s+="?"+a.join("&")),s}static addUrlParam(e,t,s){const a=this.parseUrlHash(e);return a.params[t]=s,this.composeUrlHash(a.path,a.params)}static removeUrlParam(e,t){const s=this.parseUrlHash(e);return delete s.params[t],this.composeUrlHash(s.path,s.params)}static setUrlSidePanel(e,t){const s=this.parseUrlHash(e);return s.path[0]=t,this.composeUrlHash(s.path,s.params)}static setUrlTopic(e,t){const s=this.parseUrlHash(e);return s.path[1]=t,delete s.params.info,this.composeUrlHash(s.path,s.params)}}},"./src/lib/strformat.js":function(e,t,s){function a(e,t){t=t||window.navigator.userLanguage||window.navigator.language;const s=new Date;return e.getFullYear()==s.getFullYear()?e.getMonth()==s.getMonth()&&e.getDate()==s.getDate()?e.toLocaleTimeString(t,{hour12:!1,hour:"2-digit",minute:"2-digit"}):e.toLocaleDateString(t,{hour12:!1,month:"short",day:"numeric",hour:"2-digit",minute:"2-digit"}):e.toLocaleDateString(t,{hour12:!1,year:"numeric",month:"short",day:"numeric",hour:"2-digit",minute:"2-digit"})}function i(e){const t=Math.floor(e/60);let s=e%60;return s=s<10?"0".concat(s):s,"".concat(t,":").concat(s)}function n(e){if(!e||0==e)return"0 Bytes";const t=["Bytes","KB","MB","GB","TB","PB"],s=Math.min(0|Math.floor(Math.log2(e)/10),t.length-1),a=e/Math.pow(1024,s),i=s>0?a<3?2:a<30?1:0:0;return a.toFixed(i)+" "+t[s]}function o(e){let t=0;e=""+e;for(let s=0;s0?"a":"")+".png",t&&s.removeChild(t),s.appendChild(a),document.title=(e>0?"("+e+") ":"")+"Tinode"}function i(e,t){let s=null;if((e&&e.trim()||t)&&(s={},e&&(s.fn=e.trim()),t)){const e=t.indexOf(",");s.photo=e>=0?{data:t.substring(e+1),type:"jpg"}:t}return s}function n(e,t){if(e===t)return!0;if(!Array.isArray(e)||!Array.isArray(t))return!1;if(e.length!=t.length)return!1;e.sort(),t.sort();for(let s=0,a=e.length;s{e.push(i().createElement("div",{key:t.meth+":"+t.val+":"+t.done},t.meth,": ",i().createElement("tt",null,t.val),i().createElement("span",null," ",t.done?null:i().createElement("a",{href:"#",onClick:e=>{e.preventDefault(),this.props.onCredConfirm(t.meth,t.val)}},i().createElement(n.FormattedMessage,{id:"validate_credential_action",defaultMessage:"confirm",description:"Validate credentail call to action"}))," ",i().createElement("a",{href:"#",onClick:e=>{e.preventDefault(),this.props.onCredDelete(t.meth,t.val)}},i().createElement("i",{className:"material-icons gray"},"delete_outline")))))})),i().createElement("div",{className:"scrollable-panel"},i().createElement("div",{className:"panel-form-row"},i().createElement("div",{className:"panel-form-column"},i().createElement("label",{className:"small"},i().createElement(n.FormattedMessage,{id:"label_your_name"})),i().createElement("div",null,i().createElement(n.FormattedMessage,{id:"full_name_prompt"},(e=>i().createElement(c.default,{placeholder:e,value:this.state.fullName,onFinished:this.handleFullNameUpdate}))))),i().createElement(l.default,{avatar:this.state.avatar,uid:this.props.myUserId,title:this.state.fullName,onImageChanged:this.handleImageChanged,onError:this.props.onError})),i().createElement("div",{className:"hr"}),i().createElement(n.FormattedMessage,{id:"title_tag_manager",defaultMessage:"Tags (user discovery)",description:"Section title for TagManager"},(e=>i().createElement(d.default,{title:e,activated:!1,tags:this.state.tags,tinode:this.props.tinode,onSubmit:this.handleTagsUpdated}))),i().createElement("div",{className:"hr"}),i().createElement("div",{className:"panel-form-column"},i().createElement("label",{className:"small"},i().createElement(n.FormattedMessage,{id:"label_user_contacts",defaultMessage:"Contacts:",description:"Label for user contacts"})),i().createElement("div",{className:"quoted"},e,this.state.addCredActive?i().createElement("input",{type:"text",value:this.state.value,className:this.state.addCredInvalid?"invalid":null,placeholder:"Phone number or email",required:"required",autoFocus:!0,onChange:this.handleCredChange,onKeyDown:this.handleCredKeyDown,onBlur:this.handleCredEntered}):null,i().createElement("div",null,i().createElement("a",{href:"#",onClick:e=>{e.preventDefault(),this.setState({addCredActive:!0})}},i().createElement("i",{className:"material-icons"},"add"),i().createElement(n.FormattedMessage,{id:"button_add_another",defaultMessage:"Add another",description:"Call to action [+ add another]"}))))))}}},"./src/views/acc-notifications-view.jsx":function(e,t,s){s.r(t),s.d(t,{default:function(){return r}});var a=s("react"),i=s.n(a),n=s("react-intl"),o=s("./src/widgets/checkbox.jsx");class r extends i().PureComponent{constructor(e){super(e),this.handleCheckboxClick=this.handleCheckboxClick.bind(this)}handleCheckboxClick(e,t){"sound"==e?this.props.onToggleMessageSounds(t):"alert"==e?this.props.onTogglePushNotifications(t):"incognito"==e&&this.props.onToggleIncognitoMode(t)}render(){return i().createElement("div",{className:"scrollable-panel"},i().createElement("div",{className:"panel-form-row"},i().createElement("label",{htmlFor:"message-sound"},i().createElement(n.FormattedMessage,{id:"label_message_sound",defaultMessage:"Message sound:",description:"Label for message sounds toggle"})),i().createElement(o.default,{name:"sound",id:"message-sound",checked:this.props.messageSounds,onChange:this.handleCheckboxClick})),i().createElement("div",{className:"panel-form-row"},i().createElement("label",{htmlFor:"desktop-alerts"},this.props.desktopAlertsEnabled?i().createElement(n.FormattedMessage,{id:"label_push_notifications",defaultMessage:"Notification alerts:",description:"Label for push notifications switch"}):i().createElement(n.FormattedMessage,{id:"label_push_notifications_disabled",defaultMessage:"Notification alerts (requires HTTPS):",description:"Label for push notifications switch"})),i().createElement(o.default,{name:"alert",id:"desktop-alerts",checked:this.props.desktopAlerts,onChange:this.props.desktopAlertsEnabled?this.handleCheckboxClick:null})),i().createElement("div",{className:"panel-form-row"},i().createElement("label",{htmlFor:"incognito-mode"},i().createElement(n.FormattedMessage,{id:"label_incognito_mode",defaultMessage:"Incognito mode:",description:"Label for incognito mode toggle"})),i().createElement(o.default,{name:"incognito",id:"incognito-mode",checked:this.props.incognitoMode,onChange:this.handleCheckboxClick})))}}},"./src/views/acc-security-view.jsx":function(e,t,s){s.r(t);var a=s("react"),i=s.n(a),n=s("react-intl"),o=s("./src/widgets/in-place-edit.jsx"),r=s("./src/widgets/permissions-editor.jsx");const l=(0,n.defineMessages)({delete_account:{id:"delete_account",defaultMessage:"Delete account",description:"Title for delete account warning"},delete_account_warning:{id:"delete_account_arning",defaultMessage:"Are you sure you want to delete your account? It cannot be undone.",description:"Warning message when deleting an account"}});class c extends i().Component{constructor(e){super(e);const t=this.props.tinode.getMeTopic();let s=0;t.contacts((e=>{e.acs&&!e.acs.isJoiner()&&s++}));const a=t.getDefaultAccess();this.state={auth:a?a.auth:null,anon:a?a.anon:null,showPermissionEditorFor:void 0,blockedCount:s},this.handlePasswordUpdate=this.handlePasswordUpdate.bind(this),this.handleLaunchPermissionsEditor=this.handleLaunchPermissionsEditor.bind(this),this.handleHidePermissionsEditor=this.handleHidePermissionsEditor.bind(this),this.handlePermissionsChanged=this.handlePermissionsChanged.bind(this),this.handleDeleteAccount=this.handleDeleteAccount.bind(this)}handlePasswordUpdate(e){this.setState({password:e}),this.props.onUpdateAccount(e)}handleLaunchPermissionsEditor(e){this.setState({showPermissionEditorFor:e,editedPermissions:this.state[e]})}handleHidePermissionsEditor(){this.setState({showPermissionEditorFor:void 0})}handlePermissionsChanged(e){let t={};t[this.state.showPermissionEditorFor]=e,this.props.onUpdateAccount(void 0,void 0,t);let s={showPermissionEditorFor:void 0};s[this.state.showPermissionEditorFor]=e,this.setState(s)}handleDeleteAccount(e){e.preventDefault();const{formatMessage:t}=this.props.intl;this.props.onShowAlert(t(l.delete_account),t(l.delete_account_warning),(()=>{this.props.onDeleteAccount()}),null,!0,null)}render(){return i().createElement(i().Fragment,null,this.state.showPermissionEditorFor?i().createElement(r.default,{mode:this.state.editedPermissions,skip:"O",onSubmit:this.handlePermissionsChanged,onCancel:this.handleHidePermissionsEditor}):i().createElement("div",{className:"scrollable-panel"},i().createElement("div",{className:"panel-form-column"},i().createElement("label",{className:"small"},i().createElement(n.FormattedMessage,{id:"label_password",defaultMessage:"Password",description:"Label for password editing"})),i().createElement("div",null,i().createElement(n.FormattedMessage,{id:"password_unchanged_prompt",defaultMessage:"Unchanged",description:"Message in editor while password is unchanged"},(e=>i().createElement(o.default,{placeholder:e,type:"password",onFinished:this.handlePasswordUpdate}))))),i().createElement("div",{className:"hr"}),i().createElement("div",{className:"panel-form-column"},i().createElement("a",{href:"#",className:"red flat-button",onClick:e=>{e.preventDefault(),this.props.onLogout()}},i().createElement("i",{className:"material-icons"},"exit_to_app"),"  ",i().createElement(n.FormattedMessage,{id:"button_logout",defaultMessage:"Logout",description:"Button [Logout]"})),i().createElement("a",{href:"#",className:"red flat-button",onClick:e=>{this.handleDeleteAccount(e)}},i().createElement("i",{className:"material-icons"},"delete"),"  ",i().createElement(n.FormattedMessage,{id:"button_delete_account",defaultMessage:"Delete account",description:"Button [Delete account]"}))),i().createElement("div",{className:"hr"}),i().createElement("div",{className:"panel-form-column"},i().createElement("div",null,i().createElement("label",{className:"small"},i().createElement(n.FormattedMessage,{id:"label_default_access_mode",defaultMessage:"Default access mode:",description:"Label for default access mode"}))),i().createElement("div",{className:"quoted"},i().createElement("div",null,"Auth: ",i().createElement("tt",{className:"clickable",onClick:this.handleLaunchPermissionsEditor.bind(this,"auth")},this.state.auth)),i().createElement("div",null,"Anon: ",i().createElement("tt",{className:"clickable",onClick:this.handleLaunchPermissionsEditor.bind(this,"anon")},this.state.anon)))),this.state.blockedCount>0?i().createElement(i().Fragment,null,i().createElement("div",{className:"hr"}),i().createElement("div",{className:"panel-form-row"},i().createElement("i",{className:"material-icons"},"block")," ",i().createElement("a",{href:"#",className:"gray",onClick:e=>{e.preventDefault(),this.props.onShowBlocked()}},i().createElement(n.FormattedMessage,{id:"blocked_contacts_link",defaultMessage:"Blocked contacts ({count})",values:{count:this.state.blockedCount},description:"Blocked contacts link"})))):null))}}t.default=(0,n.injectIntl)(c)},"./src/views/acc-support-view.jsx":function(e,t,s){s.r(t),s.d(t,{default:function(){return c}});var a=s("react"),i=s.n(a),n=s("react-intl"),o=s("tinode-sdk"),r=s.n(o),l=s("./src/config.js");class c extends i().PureComponent{render(){return i().createElement("div",{className:"scrollable-panel"},i().createElement("div",{className:"panel-form-column"},i().createElement("a",{href:l.LINK_CONTACT_US,className:"flat-button",target:"_blank"},i().createElement("i",{className:"material-icons"},"email"),"  ",i().createElement(n.FormattedMessage,{id:"link_contact_us",defaultMessage:"Contact Us",description:"Ancor text for contacting us by email"})),i().createElement("a",{href:l.LINK_TERMS_OF_SERVICE,className:"flat-button",target:"_blank"},i().createElement("i",{className:"material-icons"},"description"),"  ",i().createElement(n.FormattedMessage,{id:"link_terms_of_service",defaultMessage:"Terms of Service",description:"Ancor text for terms of service link"})),i().createElement("a",{href:l.LINK_PRIVACY_POLICY,className:"flat-button",target:"_blank"},i().createElement("i",{className:"material-icons"},"policy"),"  ",i().createElement(n.FormattedMessage,{id:"link_privacy_policy",defaultMessage:"Privacy Policy",description:"Ancor text for privacy policy link"}))),i().createElement("div",{className:"hr"}),i().createElement("div",{className:"panel-form-column"},i().createElement("div",{className:"panel-form-row"},i().createElement("label",{className:"small"},i().createElement(n.FormattedMessage,{id:"label_client"})),l.APP_NAME),i().createElement("div",{className:"panel-form-row"},i().createElement("label",{className:"small"},i().createElement(n.FormattedMessage,{id:"label_sdk",defaultMessage:"SDK:"})),r().getLibrary()),i().createElement("div",{className:"panel-form-row"},i().createElement("label",{className:"small"},i().createElement(n.FormattedMessage,{id:"label_server"})),this.props.serverVersion),i().createElement("div",{className:"panel-form-row"},i().createElement("label",{className:"small"},i().createElement(n.FormattedMessage,{id:"label_server_address",defaultMessage:"Server address:"})),this.props.serverAddress)))}}},"./src/views/contacts-view.jsx":function(e,t,s){s.r(t),s.d(t,{default:function(){return c}});var a=s("react"),i=s.n(a),n=s("react-intl"),o=s("./src/widgets/contact-list.jsx"),r=s("./src/lib/utils.js");const l=(0,n.defineMessages)({archived_contacts_title:{id:"archived_contacts",defaultMessage:"Archived contacts ({count})",description:"Label for archived chats"}});class c extends i().Component{constructor(e){super(e),this.handleAction=this.handleAction.bind(this),this.state=c.deriveStateFromProps(e)}static deriveStateFromProps(e){const t=[];let s=0,a=0;return e.chatList.map((i=>{const n=i.acs&&!i.acs.isJoiner();n&&e.blocked&&t.push(i),n||e.blocked||(i.private&&i.private.arch?e.archive?t.push(i):a++:e.archive||(t.push(i),s+=i.unread>0?1:0))})),t.sort(((e,t)=>(t.touched||0)-(e.touched||0))),a>0&&t.push({action:"archive",title:l.archived_contacts_title,values:{count:a}}),{contactList:t,unreadThreads:s}}componentDidUpdate(e,t){if(e.chatList!=this.props.chatList||e.archive!=this.props.archive||e.blocked!=this.props.blocked){const e=c.deriveStateFromProps(this.props);this.setState(e),e.unreadThreads!=t.unreadThreads&&(0,r.updateFavicon)(e.unreadThreads)}}handleAction(e){this.props.onShowArchive()}render(){return i().createElement(n.FormattedMessage,{id:"contacts_not_found",defaultMessage:"You have no chats
¯∖_(ツ)_/¯",description:"HTML message shown in ContactList when no contacts are found"},(e=>i().createElement(o.default,{connected:this.props.connected,contacts:this.state.contactList,emptyListMessage:e,topicSelected:this.props.topicSelected,myUserId:this.props.myUserId,showOnline:!0,showUnread:!0,onTopicSelected:this.props.onTopicSelected,showContextMenu:this.props.showContextMenu,onAction:this.handleAction})))}}},"./src/views/create-account-view.jsx":function(e,t,s){s.r(t),s.d(t,{default:function(){return p}});var a=s("react"),i=s.n(a),n=s("react-intl"),o=s("./src/widgets/avatar-upload.jsx"),r=s("./src/widgets/checkbox.jsx"),l=s("./src/widgets/visible-password.jsx"),c=s("./src/lib/local-storage.js"),d=s("./src/lib/utils.js"),h=s("./src/config.js");class p extends i().PureComponent{constructor(e){super(e),this.state={login:"",password:"",email:"",fn:"",imageDataUrl:null,errorCleared:!1,saveToken:c.default.getObject("keep-logged-in")},this.handleLoginChange=this.handleLoginChange.bind(this),this.handlePasswordChange=this.handlePasswordChange.bind(this),this.handleEmailChange=this.handleEmailChange.bind(this),this.handleFnChange=this.handleFnChange.bind(this),this.handleImageChanged=this.handleImageChanged.bind(this),this.handleToggleSaveToken=this.handleToggleSaveToken.bind(this),this.handleSubmit=this.handleSubmit.bind(this)}handleLoginChange(e){this.setState({login:e.target.value})}handlePasswordChange(e){this.setState({password:e})}handleEmailChange(e){this.setState({email:e.target.value})}handleFnChange(e){this.setState({fn:e.target.value})}handleImageChanged(e){this.setState({imageDataUrl:e})}handleToggleSaveToken(){c.default.setObject("keep-logged-in",!this.state.saveToken),this.setState({saveToken:!this.state.saveToken})}handleSubmit(e){e.preventDefault(),this.setState({errorCleared:!1}),this.props.onCreateAccount(this.state.login.trim(),this.state.password.trim(),(0,d.vcard)(this.state.fn.trim().substring(0,h.MAX_TITLE_LENGTH),this.state.imageDataUrl),{meth:"email",val:this.state.email})}render(){let e="blue";return this.props.disabled&&(e+=" disabled"),i().createElement("form",{className:"panel-form-column",onSubmit:this.handleSubmit},i().createElement("div",{className:"panel-form-row"},i().createElement("div",{className:"panel-form-column"},i().createElement(n.FormattedMessage,{id:"login_prompt"},(e=>i().createElement("input",{type:"text",placeholder:e,autoComplete:"user-name",value:this.state.login,onChange:this.handleLoginChange,required:!0,autoFocus:!0}))),i().createElement(n.FormattedMessage,{id:"password_prompt"},(e=>i().createElement(l.default,{placeholder:e,autoComplete:"new-password",value:this.state.password,onFinished:this.handlePasswordChange,required:!0})))),i().createElement(o.default,{onImageChanged:this.handleImageChanged,onError:this.props.onError})),i().createElement("div",{className:"panel-form-row"},i().createElement(n.FormattedMessage,{id:"full_name_prompt",defaultMessage:"Full name, e.g. John Doe",description:"Input placeholder for person's full name"},(e=>i().createElement("input",{type:"text",placeholder:e,autoComplete:"name",value:this.state.fn,onChange:this.handleFnChange,required:!0})))),i().createElement("div",{className:"panel-form-row"},i().createElement(n.FormattedMessage,{id:"email_prompt",defaultMessage:"Email, e.g. jdoe@example.com",description:"Input placeholder for email entry"},(e=>i().createElement("input",{type:"email",placeholder:e,autoComplete:"email",value:this.state.email,onChange:this.handleEmailChange,required:!0})))),i().createElement("div",{className:"panel-form-row"},i().createElement(r.default,{id:"save-token",name:"save-token",checked:this.state.saveToken,onChange:this.handleToggleSaveToken}),i().createElement(n.FormattedMessage,{id:"stay_logged_in"},(e=>i().createElement("label",{htmlFor:"save-token"}," ",e)))),i().createElement("div",{className:"dialog-buttons"},i().createElement("button",{className:e,type:"submit"},i().createElement(n.FormattedMessage,{id:"button_sign_up",defaultMessage:"Sign up",description:"Create account button [Sign Up]"}))))}}},"./src/views/edit-account-view.jsx":function(e,t,s){s.r(t),s.d(t,{default:function(){return l}});var a=s("react"),i=s.n(a),n=s("react-intl"),o=s("./src/widgets/avatar-upload.jsx"),r=s("./src/lib/blob-helpers.js");class l extends i().Component{constructor(e){super(e);const t=this.props.tinode.getMeTopic();this.state={fullName:t.public?t.public.fn:void 0,avatar:(0,r.makeImageUrl)(t.public?t.public.photo:null)}}render(){return i().createElement("div",{className:"scrollable-panel"},i().createElement("div",{className:"panel-form-row"},i().createElement("div",{className:"panel-form-column"},i().createElement("label",{className:"small"},i().createElement(n.FormattedMessage,{id:"label_your_name",defaultMessage:"Your name",description:"Label for full name editing"})),i().createElement("div",{className:"large"},this.state.fullName),i().createElement("div",null,i().createElement("label",{className:"small"},i().createElement(n.FormattedMessage,{id:"label_user_id",defaultMessage:"ID:",description:"Label for user address (ID)"}))," ",i().createElement("tt",null,this.props.myUserId))),i().createElement(o.default,{avatar:this.state.avatar,readOnly:!this.state.owner,uid:this.props.myUserId,title:this.state.fullName})),i().createElement("div",{className:"panel-form-row"},i().createElement("a",{href:"#",className:"flat-button",onClick:e=>{e.preventDefault(),this.props.onBasicNavigate("general")}},i().createElement("i",{className:"material-icons"},"edit")," ",i().createElement(n.FormattedMessage,{id:"button_edit",defaultMessage:"Edit",description:"Call to action [Edit]"}))),i().createElement("div",{className:"hr"}),i().createElement("div",{className:"panel-form-column"},i().createElement("a",{href:"#",className:"flat-button",onClick:e=>{e.preventDefault(),this.props.onBasicNavigate("notif")}},i().createElement("i",{className:"material-icons"},"notifications")," ",i().createElement(n.FormattedMessage,{id:"sidepanel_title_acc_notifications"})),i().createElement("a",{href:"#",className:"flat-button",onClick:e=>{e.preventDefault(),this.props.onBasicNavigate("security")}},i().createElement("i",{className:"material-icons"},"security")," ",i().createElement(n.FormattedMessage,{id:"sidepanel_title_acc_security"})),i().createElement("a",{href:"#",className:"flat-button",onClick:e=>{e.preventDefault(),this.props.onBasicNavigate("support")}},i().createElement("i",{className:"material-icons"},"contact_support")," ",i().createElement(n.FormattedMessage,{id:"sidepanel_title_acc_support"}))))}}},"./src/views/info-view.jsx":function(e,t,s){s.r(t);var a=s("react"),i=s.n(a),n=s("react-intl"),o=s("tinode-sdk"),r=s.n(o),l=s("./src/widgets/avatar-upload.jsx"),c=s("./src/widgets/checkbox.jsx"),d=s("./src/widgets/contact-list.jsx"),h=s("./src/widgets/error-panel.jsx"),p=s("./src/widgets/group-manager.jsx"),m=s("./src/widgets/in-place-edit.jsx"),u=s("./src/widgets/menu-cancel.jsx"),g=s("./src/widgets/more-button.jsx"),_=s("./src/widgets/permissions-editor.jsx"),b=s("./src/widgets/tag-manager.jsx"),f=s("./src/config.js"),v=s("./src/lib/blob-helpers.js"),E=s("./src/lib/utils.js");const w=(0,n.defineMessages)({requested:{id:"requested_permissions",defaultMessage:"Requested",description:"Title for permissions"},granted:{id:"granted_permissions",defaultMessage:"Granted",description:"Title for permissions"},edit_permissions:{id:"menu_item_edit_permissions",defaultMessage:"Edit permissions",description:"Menu item [Edit permissions]"},other_user:{id:"label_other_user",defaultMessage:"Other",description:"Label for the other user when the user is unnamed"},clear_messages:{id:"action_clear_messages",defaultMessage:"Clear Messages",description:"Flat button [Clear Messages] (soft-delete messages)"},clear_messages_warning:{id:"clear_messages_warning",defaultMessage:"Are you sure you want to clear all messages? It cannot be undone.",description:"Alert dialog warning when deleting all messages."},delete_messages:{id:"action_delete_messages",defaultMessage:"Clear Messages for All",description:"Flat button [Clear for All] (hard-delete all messages)"},delete_messages_warning:{id:"delete_messages_warning",defaultMessage:"Are you sure you want to delete all messages for everyone? It cannot be undone.",description:"Alert dialog warning when hard-deleting all messages."},leave_chat:{id:"action_leave_chat",defaultMessage:"Leave Conversation",description:"Flat button [Leave Conversation]"},leave_chat_warning:{id:"leave_chat_warning",defaultMessage:"Are you sure you want to leave this conversation?",description:"Alert dialog warning when unsubscribing from a chat."},block_contact:{id:"action_block_contact",defaultMessage:"Block Contact",description:"Flat button [Block Contact]"},block_contact_warning:{id:"block_contact_warning",defaultMessage:"Are you sure you want to block this contact?",description:"Alert dialog warning when blocking a contact."},report_chat:{id:"action_report_chat",defaultMessage:"Report Conversation",description:"Flat button [Report Group]"},report_chat_warning:{id:"report_chat_warning",defaultMessage:"Are you sure you want to block and report this conversation?",description:"Alert dialog warning when reporting a conversation for abuse"}});class S extends i().Component{constructor(e){super(e),this.state={topic:null,owner:!1,admin:!1,sharer:!1,deleter:!1,muted:!1,address:null,groupTopic:void 0,channel:void 0,fullName:void 0,avatar:null,private:null,selectedContact:null,access:null,modeGiven:null,modeWant:null,modeGiven2:null,modeWant2:null,auth:null,anon:null,contactList:[],tags:[],showMemberPanel:!1,showPermissionEditorFor:void 0,moreInfoExpanded:!1,previousMetaDesc:void 0,previousSubsUpdated:void 0,previousTagsUpdated:void 0},this.resetSubs=this.resetSubs.bind(this),this.resetDesc=this.resetDesc.bind(this),this.onMetaDesc=this.onMetaDesc.bind(this),this.onSubsUpdated=this.onSubsUpdated.bind(this),this.onTagsUpdated=this.onTagsUpdated.bind(this),this.handleFullNameUpdate=this.handleFullNameUpdate.bind(this),this.handlePrivateUpdate=this.handlePrivateUpdate.bind(this),this.handleImageChanged=this.handleImageChanged.bind(this),this.handleMuted=this.handleMuted.bind(this),this.handlePermissionsChanged=this.handlePermissionsChanged.bind(this),this.handleLaunchPermissionsEditor=this.handleLaunchPermissionsEditor.bind(this),this.handleHidePermissionsEditor=this.handleHidePermissionsEditor.bind(this),this.handleShowAddMembers=this.handleShowAddMembers.bind(this),this.handleHideAddMembers=this.handleHideAddMembers.bind(this),this.handleMemberUpdateRequest=this.handleMemberUpdateRequest.bind(this),this.handleDeleteMessages=this.handleDeleteMessages.bind(this),this.handleLeave=this.handleLeave.bind(this),this.handleBlock=this.handleBlock.bind(this),this.handleReport=this.handleReport.bind(this),this.handleMemberSelected=this.handleMemberSelected.bind(this),this.handleMoreInfo=this.handleMoreInfo.bind(this),this.handleTagsUpdated=this.handleTagsUpdated.bind(this),this.handleContextMenu=this.handleContextMenu.bind(this)}componentDidUpdate(e){const t=this.props.tinode.getTopic(e.topic);t&&(this.onMetaDesc!=t.onMetaDesc&&(this.previousMetaDesc=t.onMetaDesc,t.onMetaDesc=this.onMetaDesc,this.previousSubsUpdated=t.onSubsUpdated,t.onSubsUpdated=this.onSubsUpdated,"grp"==t.getType()?(this.previousTagsUpdated=t.onTagsUpdated,t.onTagsUpdated=this.onTagsUpdated):this.previousTagsUpdated=void 0),this.state.topic!=e.topic&&(this.setState({topic:e.topic}),this.resetDesc(t,e),this.resetSubs(t,e)))}componentWillUnmount(){const e=this.props.tinode.getTopic(this.props.topic);e&&(this.setState({topic:null}),e.onMetaDesc=this.previousMetaDesc,e.onSubsUpdated=this.previousSubsUpdated,e.onTagsUpdated=this.previousTagsUpdated)}resetSubs(e,t){const s={contactList:[]};if("p2p"==e.getType()){const a=e.subscriber(t.topic);a?(s.modeGiven2=a.acs.getGiven(),s.modeWant2=a.acs.getWant()):(s.modeGiven2=f.NO_ACCESS_MODE,s.modeWant2=f.NO_ACCESS_MODE)}else e.subscribers((e=>{s.contactList.push(e)}),this);this.setState(s)}resetDesc(e,t){const s=e.getDefaultAccess()||{},a=e.getAccessMode();this.setState({owner:a&&a.isOwner(),admin:a&&a.isAdmin(),sharer:a&&a.isSharer(),deleter:a&&a.isDeleter(),muted:a&&a.isMuted(),fullName:e.public?e.public.fn:void 0,avatar:(0,v.makeImageUrl)(e.public?e.public.photo:null),private:e.private?e.private.comment:null,address:e.name,groupTopic:"grp"==e.getType(),channel:e.isChannel(),showMemberPanel:!1,access:a?a.getMode():void 0,modeGiven:a?a.getGiven():void 0,modeWant:a?a.getWant():void 0,auth:s.auth,anon:s.anon}),"grp"==e.getType()&&a&&a.isOwner()&&e.getMeta(e.startMetaQuery().withTags().build())}onMetaDesc(e){const t=this.props.tinode.getTopic(this.props.topic);t&&(this.resetDesc(t,this.props),this.previousMetaDesc&&this.previousMetaDesc!=this.onMetaDesc&&this.previousMetaDesc(e))}onSubsUpdated(e){const t=this.props.tinode.getTopic(this.props.topic);t&&(this.resetSubs(t,this.props),this.previousSubsUpdated&&this.previousSubsUpdated!=this.onSubsUpdated&&this.previousSubsUpdated(e))}onTagsUpdated(e){this.setState({tags:e}),this.previousTagsUpdated&&this.previousTagsUpdated!=this.onTagsUpdated&&this.previousTagsUpdated()}handleFullNameUpdate(e){e=e.trim().substring(0,f.MAX_TITLE_LENGTH),this.state.fullName!==e&&(this.setState({fullName:e}),this.props.onTopicDescUpdate(this.props.topic,(0,E.vcard)(e,null),null))}handlePrivateUpdate(e){e=e.trim().substring(0,f.MAX_TITLE_LENGTH),this.state.private!==e&&(this.setState({private:e}),this.props.onTopicDescUpdate(this.props.topic,null,e||r().DEL_CHAR))}handleImageChanged(e){this.setState({avatar:e}),this.props.onTopicDescUpdate(this.props.topic,(0,E.vcard)(null,e||r().DEL_CHAR),null)}handleMuted(e,t){this.setState({muted:t}),this.props.onChangePermissions(this.props.topic,t?"-P":"+P")}handlePermissionsChanged(e){switch(this.state.showPermissionEditorFor){case"auth":this.props.onTopicDescUpdate(this.props.topic,null,null,{auth:e});break;case"anon":this.props.onTopicDescUpdate(this.props.topic,null,null,{anon:e});break;case"mode":case"want":this.props.onChangePermissions(this.props.topic,e);break;case"given":this.props.onChangePermissions(this.props.topic,e,this.props.topic);break;case"user":this.props.onChangePermissions(this.props.topic,e,this.state.userPermissionsEdited)}this.setState({showPermissionEditorFor:void 0})}handleLaunchPermissionsEditor(e,t){const{formatMessage:s}=this.props.intl;let a,i,n,o,l,c,d;switch(e){case"mode":a=this.state.access;break;case"want":a=this.state.modeWant,i=this.state.modeGiven,this.state.owner?n="O":(n=r().AccessMode.encode(r().AccessMode.diff("ASDO",this.state.modeGiven)),this.state.channel&&(n+="W")),o=s(w.requested),l=s(w.granted);break;case"given":a=this.state.modeGiven2,i=this.state.modeWant2,n=this.state.groupTopic?this.state.owner?"":"O":"ASDO",o=s(w.granted),l=s(w.requested);break;case"auth":a=this.state.auth,n="O";break;case"anon":a=this.state.anon,n="O";break;case"user":{const e=this.props.tinode.getTopic(this.props.topic);if(!e)return;const r=e.subscriber(t);if(!r||!r.acs)return;a=r.acs.getGiven(),i=r.acs.getWant(),n=this.state.owner?"":"O",o=s(w.granted),l=s(w.requested),r.public&&(c=r.public.fn,d=r.public.photo);break}default:console.log("Unknown permission editing mode '"+e+"'")}this.setState({showPermissionEditorFor:e,userPermissionsEdited:t,userPermissionsTitle:c,userPermissionsAvatar:d,editedPermissions:a,immutablePermissions:i,editedPermissionsTitle:o,immutablePermissionsTitle:l,editedPermissionsSkipped:n})}handleHidePermissionsEditor(){this.setState({showPermissionEditorFor:void 0})}handleShowAddMembers(e){e.preventDefault(),this.props.onInitFind(),this.setState({showMemberPanel:!0})}handleHideAddMembers(){this.setState({showMemberPanel:!1})}handleMemberUpdateRequest(e,t,s){this.props.onMemberUpdateRequest(this.props.topic,t,s),this.setState({showMemberPanel:!1})}handleDeleteMessages(e){e.preventDefault();const{formatMessage:t}=this.props.intl;this.props.onShowAlert(t(this.state.deleter?w.delete_messages:w.clear_messages),t(this.state.deleter?w.delete_messages_warning:w.clear_messages_warning),(()=>{this.props.onDeleteMessages(this.props.topic)}),null,!0,null)}handleLeave(e){e.preventDefault();const{formatMessage:t}=this.props.intl;this.props.onShowAlert(t(w.leave_chat),t(w.leave_chat_warning),(()=>{this.props.onLeaveTopic(this.props.topic)}),null,!0,null)}handleBlock(e){e.preventDefault();const{formatMessage:t}=this.props.intl;this.props.onShowAlert(t(w.block_contact),t(w.block_contact_warning),(()=>{this.props.onBlockTopic(this.props.topic)}),null,!0,null)}handleReport(e){e.preventDefault();const{formatMessage:t}=this.props.intl;this.props.onShowAlert(t(w.report_chat),t(w.report_chat_warning),(()=>{this.props.onReportTopic(this.props.topic)}),null,!0,null)}handleMemberSelected(e){this.setState({selectedContact:e})}handleMoreInfo(e){this.setState({moreInfoExpanded:e})}handleTagsUpdated(e){(0,E.arrayEqual)(this.state.tags.slice(0),e.slice(0))||this.props.onTopicTagsUpdate(this.props.topic,e)}handleContextMenu(e){const{formatMessage:t}=this.props.intl,s=this,a=this.props.tinode.getTopic(this.props.topic);if(!a)return;const i=a.subscriber(e.topicName);if(!i||!i.acs)return;const n=[{title:t(w.edit_permissions),handler:function(){s.handleLaunchPermissionsEditor("user",e.topicName)}},"member_delete",i.acs.isMuted()?"member_unmute":"member_mute",i.acs.isJoiner()?"member_block":"member_unblock"];this.props.showContextMenu({topicName:this.props.topic,x:e.x,y:e.y,user:e.topicName},n)}render(){const{formatMessage:e}=this.props.intl;return i().createElement("div",{id:"info-view"},i().createElement("div",{className:"caption-panel",id:"info-caption-panel"},i().createElement("div",{className:"panel-title",id:"info-title"},i().createElement(n.FormattedMessage,{id:"title_info",defaultMessage:"Info",description:"Title for InfoView"})),i().createElement("div",null,i().createElement(u.default,{onCancel:this.props.onCancel}))),this.props.displayMobile?i().createElement(h.default,{level:this.props.errorLevel,text:this.props.errorText,onClearError:this.props.onError}):null,this.state.showMemberPanel?i().createElement(p.default,{members:this.state.contactList,requiredMember:this.props.myUserId,keepInitialMembers:!this.state.admin&&!this.state.owner,myUserId:this.props.myUserId,contacts:this.props.searchableContacts,onCancel:this.handleHideAddMembers,onSubmit:this.handleMemberUpdateRequest}):this.state.showPermissionEditorFor?i().createElement(_.default,{mode:this.state.editedPermissions,compare:this.state.immutablePermissions,skip:this.state.editedPermissionsSkipped,modeTitle:this.state.editedPermissionsTitle,compareTitle:this.state.immutablePermissionsTitle,userTitle:this.state.userPermissionsTitle,item:this.state.userPermissionsEdited,userAvatar:this.state.userPermissionsAvatar,onSubmit:this.handlePermissionsChanged,onCancel:this.handleHidePermissionsEditor}):i().createElement("div",{id:"info-view-content",className:"scrollable-panel"},i().createElement("div",{className:"panel-form-row"},i().createElement("div",{className:"panel-form-column"},i().createElement("div",null,i().createElement("label",{className:"small"},i().createElement(n.FormattedMessage,{id:"label_topic_name",defaultMessage:"Name",description:"Label for editing topic name"}))),i().createElement("div",null,i().createElement(m.default,{placeholder:this.state.groupTopic?"Group name":i().createElement("i",null,"Unknown"),readOnly:!this.state.owner,value:this.state.fullName,required:!0,onFinished:this.handleFullNameUpdate})),i().createElement("div",null,i().createElement("label",{className:"small"},i().createElement(n.FormattedMessage,{id:"label_private",defaultMessage:"Private comment",description:"Label for editing 'private'"}))),i().createElement("div",null,i().createElement(n.FormattedMessage,{id:"private_editing_placeholder",defaultMessage:"Visible to you only",description:"Placeholder for editing 'private'"},(e=>i().createElement(m.default,{placeholder:e,value:this.state.private,onFinished:this.handlePrivateUpdate}))))),i().createElement(l.default,{avatar:this.state.avatar,readOnly:!this.state.owner,uid:this.props.topic,title:this.state.fullName,onImageChanged:this.handleImageChanged,onError:this.props.onError})),i().createElement("div",{className:"hr"}),i().createElement("div",{className:"panel-form-column"},i().createElement("div",{className:"panel-form-row"},i().createElement("label",null,i().createElement(n.FormattedMessage,{id:"label_muting_topic",defaultMessage:"Muted:",description:"Label for Muting/unmuting the topic"})),i().createElement(c.default,{name:"P",checked:this.state.muted,onChange:this.handleMuted})),i().createElement(n.FormattedMessage,{id:"action_more",defaultMessage:"More",description:"Action for showing more content"},(e=>i().createElement(g.default,{title:e,open:this.state.moreInfoExpanded,onToggle:this.handleMoreInfo}))),this.state.moreInfoExpanded?i().createElement("div",{className:"panel-form-column"},i().createElement("div",{className:"panel-form-row"},i().createElement("label",null,i().createElement(n.FormattedMessage,{id:"label_user_id"})),i().createElement("tt",null,this.state.address)),this.state.groupTopic?i().createElement("div",{className:"panel-form-row"},i().createElement("label",null,i().createElement(n.FormattedMessage,{id:"label_your_permissions",defaultMessage:"Your permissions:",description:"Label for current user permissions"})),i().createElement("tt",{className:"clickable",onClick:this.handleLaunchPermissionsEditor.bind(this,"want")},this.state.access)):i().createElement("div",null,i().createElement("div",null,i().createElement("label",{className:"small"},i().createElement(n.FormattedMessage,{id:"label_permissions",defaultMessage:"Permissions:",description:"Section title"}))),i().createElement("div",{className:"quoted"},i().createElement("div",null,i().createElement(n.FormattedMessage,{id:"label_you",defaultMessage:"You:",description:"Label for the current user"}),"  ",i().createElement("tt",{className:"clickable",onClick:this.handleLaunchPermissionsEditor.bind(this,"want")},this.state.access)),i().createElement("div",null,this.state.fullName?this.state.fullName:e(w.other_user),":  ",i().createElement("tt",{className:"clickable",onClick:this.handleLaunchPermissionsEditor.bind(this,"given")},this.state.modeGiven2)))),this.state.sharer&&(this.state.auth||this.state.anon)?i().createElement("div",null,i().createElement("div",null,i().createElement("label",{className:"small"},i().createElement(n.FormattedMessage,{id:"label_default_access",defaultMessage:"Default access mode:",description:"Section title"}))),i().createElement("div",{className:"quoted"},i().createElement("div",null,"Auth: ",this.state.admin?i().createElement("tt",{className:"clickable",onClick:this.handleLaunchPermissionsEditor.bind(this,"auth")},this.state.auth):i().createElement("tt",null,this.state.auth)),i().createElement("div",null,"Anon: ",this.state.admin?i().createElement("tt",{className:"clickable",onClick:this.handleLaunchPermissionsEditor.bind(this,"anon")},this.state.anon):i().createElement("tt",null,this.state.anon)))):null):null),i().createElement("div",{className:"hr"}),this.state.owner?i().createElement(i().Fragment,null,i().createElement(n.FormattedMessage,{id:"title_tag_manager"},(e=>i().createElement(b.default,{title:e,tags:this.state.tags,activated:!1,tinode:this.props.tinode,onSubmit:this.handleTagsUpdated}))),i().createElement("div",{className:"hr"})):null,i().createElement("div",{className:"panel-form-column"},this.state.channel?null:i().createElement("a",{href:"#",className:"flat-button",onClick:this.handleDeleteMessages},i().createElement("i",{className:"material-icons"},"delete_outline"),"  ",e(this.state.deleter?w.delete_messages:w.clear_messages)),i().createElement("a",{href:"#",className:"red flat-button",onClick:this.handleLeave},i().createElement("i",{className:"material-icons"},"exit_to_app"),"  ",e(w.leave_chat)),this.state.groupTopic?null:i().createElement("a",{href:"#",className:"red flat-button",onClick:this.handleBlock},i().createElement("i",{className:"material-icons"},"block"),"  ",e(w.block_contact)),this.state.owner?null:i().createElement("a",{href:"#",className:"red flat-button",onClick:this.handleReport},i().createElement("i",{className:"material-icons"},"report"),"  ",e(w.report_chat))),this.state.groupTopic&&this.state.sharer?i().createElement(i().Fragment,null,i().createElement("div",{className:"hr"}),i().createElement("div",{className:"panel-form-column"},i().createElement("div",{className:"panel-form-row"},i().createElement("label",{className:"small"},i().createElement(n.FormattedMessage,{id:"label_group_members",defaultMessage:"Group members:",description:"Section title or label"}))),i().createElement("div",{className:"panel-form-row"},i().createElement("a",{href:"#",className:"flat-button",onClick:this.handleShowAddMembers},i().createElement("i",{className:"material-icons"},"person_add"),"  ",i().createElement(n.FormattedMessage,{id:"button_add_members",defaultMessage:"Add members",description:"Flat button [Add members] (to topic)"}))),i().createElement(n.FormattedMessage,{id:"group_has_no_members",defaultMessage:"No members",description:"Shown in place of group members"},(e=>i().createElement(d.default,{contacts:this.state.contactList,myUserId:this.props.myUserId,emptyListMessage:e,topicSelected:this.state.selectedContact,showOnline:!1,showUnread:!1,showMode:!0,noScroll:!0,onTopicSelected:this.handleMemberSelected,showContextMenu:!!this.state.admin&&this.handleContextMenu}))))):null))}}t.default=(0,n.injectIntl)(S)},"./src/views/login-view.jsx":function(e,t,s){s.r(t),s.d(t,{default:function(){return c}});var a=s("react"),i=s.n(a),n=s("react-intl"),o=s("./src/widgets/checkbox.jsx"),r=s("./src/widgets/visible-password.jsx"),l=s("./src/lib/local-storage.js");class c extends i().Component{constructor(e){super(e),this.state={login:e.login,password:"",hostName:e.serverAddress,saveToken:l.default.getObject("keep-logged-in")},this.handleLoginChange=this.handleLoginChange.bind(this),this.handlePasswordChange=this.handlePasswordChange.bind(this),this.handleToggleSaveToken=this.handleToggleSaveToken.bind(this),this.handleSubmit=this.handleSubmit.bind(this)}handleLoginChange(e){this.setState({login:e.target.value})}handlePasswordChange(e){this.setState({password:e.target.value})}handleToggleSaveToken(){l.default.setObject("keep-logged-in",!this.state.saveToken),this.setState({saveToken:!this.state.saveToken})}handleSubmit(e){e.preventDefault(),this.props.onLogin(this.state.login.trim(),this.state.password.trim())}render(){var e="blue";return this.props.disabled&&(e+=" disabled"),i().createElement("form",{id:"login-form",onSubmit:this.handleSubmit},i().createElement(n.FormattedMessage,{id:"login_prompt",defaultMessage:"Login",description:"Login placeholder in LoginView"},(e=>i().createElement("input",{type:"text",id:"inputLogin",placeholder:e,autoComplete:"username",autoCorrect:"off",autoCapitalize:"none",value:this.state.login,onChange:this.handleLoginChange,required:!0,autoFocus:!0}))),i().createElement(n.FormattedMessage,{id:"password_prompt",defaultMessage:"Password",description:"Password placeholder in LoginView"},(e=>i().createElement(r.default,{type:"password",id:"inputPassword",placeholder:e,autoComplete:"current-password",value:this.state.password,onChange:this.handlePasswordChange,required:!0}))),i().createElement("div",{className:"panel-form-row"},i().createElement(o.default,{id:"save-token",name:"save-token",checked:this.state.saveToken,onChange:this.handleToggleSaveToken}),i().createElement("label",{htmlFor:"save-token"}," ",i().createElement(n.FormattedMessage,{id:"stay_logged_in",defaultMessage:"Stay logged in",description:"Label for a checkbox"})),i().createElement("a",{href:"#reset"},i().createElement(n.FormattedMessage,{id:"forgot_password_link",defaultMessage:"Forgot password?",description:"Link to Reset password form"}))),i().createElement("div",{className:"dialog-buttons"},i().createElement("button",{className:e,type:"submit"},i().createElement(n.FormattedMessage,{id:"button_sign_in",defaultMessage:"Sign in",description:"Button [Sign In]"}))))}}},"./src/views/logo-view.jsx":function(e,t,s){s.r(t),s.d(t,{default:function(){return c}});var a=s("react"),i=s.n(a),n=s("react-intl"),o=s("tinode-sdk"),r=s.n(o),l=s("./src/config.js");class c extends i().PureComponent{render(){const e=l.APP_NAME+" ("+r().getLibrary()+")";return i().createElement("div",{id:"dummy-view"},i().createElement("div",null,i().createElement("a",{href:"https://github.com/tinode/chat/"},i().createElement("img",{id:"logo",alt:"logo",src:"img/logo.svg"}),i().createElement("h2",null,"Tinode Web")),i().createElement("p",null,i().createElement(n.FormattedMessage,{id:"label_client",defaultMessage:"Client:"})," ",e),i().createElement("p",null,i().createElement(n.FormattedMessage,{id:"label_server",defaultMessage:"Server:"})," ",this.props.serverVersion," (",this.props.serverAddress,")")))}}},"./src/views/messages-view.jsx":function(e,t,s){s.r(t);var a=s("react"),i=s.n(a),n=s("react-intl"),o=s("tinode-sdk"),r=s.n(o),l=s("./src/widgets/chat-message.jsx"),c=s("./src/widgets/doc-preview.jsx"),d=s("./src/widgets/error-panel.jsx"),h=s("./src/widgets/group-subs.jsx"),p=s("./src/widgets/image-preview.jsx"),m=s("./src/widgets/invitation.jsx"),u=s("./src/widgets/letter-tile.jsx"),g=s("./src/widgets/load-spinner.jsx"),_=s("./src/views/logo-view.jsx"),b=s("./src/widgets/send-message.jsx"),f=s("./src/config.js"),v=s("./src/lib/blob-helpers.js"),E=s("./src/lib/navigation.js"),w=s("./src/lib/strformat.js");const S=r().Drafty,C=(0,n.defineMessages)({online_now:{id:"online_now",defaultMessage:"online now",description:"Indicator that the user or topic is currently online"},last_seen:{id:"last_seen_timestamp",defaultMessage:"Last seen",description:"Label for the timestamp of when the user or topic was last online"},not_found:{id:"title_not_found",defaultMessage:"Not found",description:"Title shown when topic is not found"},channel:{id:"channel",defaultMessage:"channel",description:"Subtitle shown for channels in MessagesView instead of last seen"}});function M(e){if(e){const t=e.getExcessive()||"";return e.isJoiner("given")&&(t.includes("R")||t.includes("W"))}return!1}function k(e){if(e){const t=e.getMissing()||"";return e.isJoiner("want")&&(t.includes("R")||t.includes("W"))}return!1}class T extends i().Component{constructor(e){super(e),this.state=T.getDerivedStateFromProps(e,{}),this.leave=this.leave.bind(this),this.sendImageAttachment=this.sendImageAttachment.bind(this),this.sendFileAttachment=this.sendFileAttachment.bind(this),this.sendKeyPress=this.sendKeyPress.bind(this),this.handleScrollReference=this.handleScrollReference.bind(this),this.handleScrollEvent=this.handleScrollEvent.bind(this),this.handleDescChange=this.handleDescChange.bind(this),this.handleSubsUpdated=this.handleSubsUpdated.bind(this),this.handleNewMessage=this.handleNewMessage.bind(this),this.handleAllMessagesReceived=this.handleAllMessagesReceived.bind(this),this.handleInfoReceipt=this.handleInfoReceipt.bind(this),this.handleImagePostview=this.handleImagePostview.bind(this),this.handleClosePreview=this.handleClosePreview.bind(this),this.handleFormResponse=this.handleFormResponse.bind(this),this.handleContextClick=this.handleContextClick.bind(this),this.handleShowContextMenuMessage=this.handleShowContextMenuMessage.bind(this),this.handleNewChatAcceptance=this.handleNewChatAcceptance.bind(this),this.handleEnablePeer=this.handleEnablePeer.bind(this),this.handleAttachFile=this.handleAttachFile.bind(this),this.handleAttachImage=this.handleAttachImage.bind(this),this.handleCancelUpload=this.handleCancelUpload.bind(this),this.postReadNotification=this.postReadNotification.bind(this),this.clearNotificationQueue=this.clearNotificationQueue.bind(this),this.readNotificationQueue=[],this.readNotificationTimer=null}componentDidMount(){this.messagesScroller&&this.messagesScroller.addEventListener("scroll",this.handleScrollEvent)}componentWillUnmount(){this.messagesScroller&&this.messagesScroller.removeEventListener("scroll",this.handleScrollEvent),this.clearNotificationQueue()}componentDidUpdate(e,t){this.messagesScroller&&(t.topic!=this.state.topic||t.messages.length!=this.state.messages.length?this.messagesScroller.scrollTop=this.messagesScroller.scrollHeight-this.state.scrollPosition:e.viewportHeight>this.props.viewportHeight&&(this.messagesScroller.scrollTop+=e.viewportHeight-this.props.viewportHeight));const s=this.props.tinode.getTopic(this.state.topic);if(this.state.topic!=t.topic&&(t.topic&&!r().isNewGroupTopicName(t.topic)&&this.leave(t.topic),s&&(s.onData=this.handleNewMessage,s.onAllMessagesReceived=this.handleAllMessagesReceived,s.onInfo=this.handleInfoReceipt,s.onMetaDesc=this.handleDescChange,s.onSubsUpdated=this.handleSubsUpdated,s.onPres=this.handleSubsUpdated)),this.props.applicationVisible?this.postReadNotification(0):this.clearNotificationQueue(),s&&!s.isSubscribed()&&this.props.ready&&(this.state.topic!=t.topic||!e.ready)){const e=this.props.newTopicParams&&this.props.newTopicParams._topicName==this.props.topic;let t=s.startMetaQuery().withLaterDesc();(this.state.isSharer||e&&!s.isChannel())&&(t=t.withLaterSub()),(this.state.isReader||e)&&(t=t.withLaterData(f.MESSAGES_PAGE),this.state.isReader&&(t=t.withLaterDel()),this.setState({fetchingMessages:!0}));const a=e?this.props.newTopicParams:void 0;s.subscribe(t.build(),a).then((e=>{303!=e.code?(this.state.topic!=e.topic&&this.setState({topic:e.topic}),this.props.onNewTopicCreated(this.props.topic,e.topic),s.queuedMessages((e=>{!e._sending&&s.isSubscribed()&&s.publishMessage(e)}))):E.default.navigateTo(E.default.setUrlTopic("",e.params.topic))})).catch((e=>{console.log("Failed subscription to",this.state.topic),this.props.onError(e.message,"err");const t=T.getDerivedStateFromProps({},{});t.title=this.props.intl.formatMessage(C.not_found),this.setState(t)}))}}static getDerivedStateFromProps(e,t){let s={};if(e.topic){if(e.topic!=t.topic){const a=e.tinode.getTopic(e.topic);if(s={topic:e.topic,docPreview:null,imagePreview:null,imagePostview:null,typingIndicator:!1,scrollPosition:0,fetchingMessages:!1},a){const i=[],n=[];e.connected&&a.subscribers((t=>{t.online&&t.user!=e.myUserId&&n.push(t)})),a.messages((function(e){e.deleted||i.push(e)})),Object.assign(s,{messages:i,onlineSubs:n}),a.public?Object.assign(s,{title:a.public.fn,avatar:(0,v.makeImageUrl)(a.public.photo)}):Object.assign(s,{title:"",avatar:null});const o=a.p2pPeerDesc();o?Object.assign(s,{peerMessagingDisabled:k(o.acs)}):t.peerMessagingDisabled&&Object.assign(s,{peerMessagingDisabled:!1}),Object.assign(s,{channel:a.isChannel()})}else Object.assign(s,{messages:[],onlineSubs:[],title:"",avatar:null,peerMessagingDisabled:!1,channel:!1})}}else s={messages:[],onlineSubs:[],topic:null,title:"",avatar:null,docPreview:null,imagePreview:null,imagePostview:null,typingIndicator:!1,scrollPosition:0,fetchingMessages:!1,peerMessagingDisabled:!1,channel:!1};return e.acs?(e.acs.isWriter()!=t.isWriter&&(s.isWriter=!t.isWriter),e.acs.isReader()!=t.isReader&&(s.isReader=!t.isReader),!e.acs.isReader("given")!=t.readingBlocked&&(s.readingBlocked=!t.readingBlocked),e.acs.isSharer()!=t.isSharer&&(s.isSharer=!t.isSharer)):(t.isWriter&&(s.isWriter=!1),t.isReader&&(s.isReader=!1),t.readingBlocked||(t.readingBlocked=!0),t.isSharer&&(s.isSharer=!1)),M(e.acs)==!t.unconformed&&(s.unconfirmed=!t.unconformed),!e.connected&&t.onlineSubs&&t.onlineSubs.length>0&&(s.onlineSubs=[]),s}leave(e){if(!e)return;let t=this.props.tinode.getTopic(e);t&&t.isSubscribed()&&t.leave(!1).catch((()=>{})).finally((()=>{this.setState({fetchingMessages:!1}),t.onData=void 0,t.onAllMessagesReceived=void 0,t.onInfo=void 0,t.onMetaDesc=void 0,t.onSubsUpdated=void 0,t.onPres=void 0}))}handleScrollReference(e){e&&(e.addEventListener("scroll",this.handleScrollEvent),this.messagesScroller=e,this.messagesScroller.scrollTop=this.messagesScroller.scrollHeight-this.state.scrollPosition)}handleScrollEvent(e){this.setState({scrollPosition:e.target.scrollHeight-e.target.scrollTop}),e.target.scrollTop<=0&&this.setState(((e,t)=>{const s={};if(!e.fetchingMessages){const e=this.props.tinode.getTopic(this.state.topic);e&&e.isSubscribed()&&e.msgHasMoreMessages()&&(s.fetchingMessages=!0,e.getMessagesPage(f.MESSAGES_PAGE).catch((e=>{this.setState({fetchingMessages:!1}),this.props.onError(e.message,"err")})))}return s}))}handleDescChange(e){e.public?this.setState({title:e.public.fn,avatar:(0,v.makeImageUrl)(e.public.photo)}):this.setState({title:"",avatar:null}),e.acs&&this.setState({isWriter:e.acs.isWriter(),isReader:e.acs.isReader(),readingBlocked:!e.acs.isReader("given"),unconfirmed:M(e.acs)})}postReadNotification(e){if(!this.props.applicationVisible)return;this.readNotificationTimer||(this.readNotificationTimer=setInterval((()=>{if(0==this.readNotificationQueue.length)return clearInterval(this.readNotificationTimer),void(this.readNotificationTimer=null);let e=-1;for(;this.readNotificationQueue.length>0;){const t=this.readNotificationQueue[0];if(t.topicName!=this.state.topic){this.readNotificationQueue.shift();continue}const s=new Date;if(!(t.sendAt<=s))break;this.readNotificationQueue.shift(),e=Math.max(e,t.seq)}if(e>=0){const t=this.props.tinode.getTopic(this.state.topic);t&&t.noteRead(e)}}),300));const t=new Date;this.readNotificationQueue.push({topicName:this.state.topic,seq:e,sendAt:t.setMilliseconds(t.getMilliseconds()+f.READ_DELAY)})}clearNotificationQueue(){this.readNotificationQueue=[],this.readNotificationTimer&&(clearInterval(this.readNotificationTimer),this.readNotificationTimer=null)}handleSubsUpdated(){if(this.state.topic){const e=[],t=this.props.tinode.getTopic(this.state.topic);t.subscribers((t=>{t.online&&t.user!=this.props.myUserId&&e.push(t)}));const s={onlineSubs:e},a=t.p2pPeerDesc();a?Object.assign(s,{peerMessagingDisabled:k(a.acs)}):this.state.peerMessagingDisabled&&Object.assign(s,{peerMessagingDisabled:!1}),this.setState(s)}}handleNewMessage(e){const t=this.props.tinode.getTopic(this.state.topic),s={messages:[]};if(t.messages((e=>{e.deleted||s.messages.push(e)})),e&&!e.deleted){t.isNewMessage(e.seq)&&(s.scrollPosition=0);t.msgStatus(e)>=r().MESSAGE_STATUS_SENT&&e.from!=this.props.myUserId&&this.postReadNotification(e.seq),this.props.onData(e)}this.setState(s)}handleAllMessagesReceived(e){this.setState({fetchingMessages:!1}),e>0&&this.postReadNotification(0)}handleInfoReceipt(e){switch(e.what){case"kp":clearTimeout(this.keyPressTimer);var t=this;this.keyPressTimer=setTimeout((function(){t.setState({typingIndicator:!1})}),f.KEYPRESS_DELAY+1e3),this.state.typingIndicator||this.setState({typingIndicator:!0});break;case"read":case"recv":this.forceUpdate();break;default:console.log("Other change in topic: ",e.what)}}handleImagePostview(e){this.setState({imagePostview:e})}handleClosePreview(){this.state.imagePreview&&this.state.imagePreview.url&&URL.revokeObjectURL(this.state.imagePreview.url),this.setState({imagePostview:null,imagePreview:null,docPreview:null})}handleFormResponse(e,t,s){if("pub"==e)this.props.sendMessage(S.attachJSON(S.parse(t),s));else if("url"==e){const e=new URL(s.ref),t=e.searchParams;for(let e in s.resp)s.resp.hasOwnProperty(e)&&t.set(e,s.resp[e]);["name","seq"].map((function(e){s[e]&&t.set(e,s[e])})),t.set("uid",this.props.myUserId),e.search=t,window.open(e,"_blank")}else console.log("Unknown action in form",e)}handleContextClick(e){e.preventDefault(),e.stopPropagation(),this.props.showContextMenu({topicName:this.state.topic,y:e.pageY,x:e.pageX})}handleShowContextMenuMessage(e,t){e.topicName=this.state.topic;const s=t||[],a=this.props.tinode.getTopic(e.topicName);if(a){a.isChannel()||s.push("message_delete");const e=a.getAccessMode();e&&e.isDeleter()&&s.push("message_delete_hard")}this.props.showContextMenu(e,s)}handleNewChatAcceptance(e){this.props.onNewChat(this.state.topic,e)}handleEnablePeer(e){e.preventDefault(),this.props.onChangePermissions(this.state.topic,f.DEFAULT_P2P_ACCESS_MODE,this.state.topic)}sendKeyPress(){const e=this.props.tinode.getTopic(this.state.topic);e.isSubscribed()&&e.noteKeyPress()}sendFileAttachment(e){const t=.75*this.props.tinode.getServerLimit("maxMessageSize",f.MAX_INBAND_ATTACHMENT_SIZE)-1024|0;if(e.size>t){const t=this.props.tinode.getLargeFileHelper();if(!t)return void this.props.onError(this.props.intl.formatMessage(C.cannot_initiate_upload));const s=t.upload(e),a=S.attachFile(null,{mime:e.type,filename:e.name,size:e.size,urlPromise:s});this.props.sendMessage(a,s,t)}else(0,v.fileToBase64)(e,((e,t,s)=>{this.props.sendMessage(S.attachFile(null,{mime:e,data:t,filename:s}))}),this.props.onError)}handleAttachFile(e){const t=this.props.tinode.getServerLimit("maxFileUploadSize",f.MAX_EXTERN_ATTACHMENT_SIZE);e.size>t?this.props.onError(this.props.intl.formatMessage({id:"file_attachment_too_large"},{size:(0,w.bytesToHumanSize)(e.size),limit:(0,w.bytesToHumanSize)(t)}),"err"):this.setState({docPreview:{file:e,filename:e.name,size:e.size,type:e.type}})}sendImageAttachment(e,t){const s=this.state.imagePreview.type,a=this.state.imagePreview.width,i=this.state.imagePreview.height,n=this.state.imagePreview.filename,o=.75*this.props.tinode.getServerLimit("maxMessageSize",f.MAX_INBAND_ATTACHMENT_SIZE)-1024|0;if(t.size>o){const o=this.props.tinode.getLargeFileHelper();if(!o)return void this.props.onError(this.props.intl.formatMessage(C.cannot_initiate_upload));const r=o.upload(t);(0,v.imageScaled)(t,f.IMAGE_PREVIEW_DIM,f.IMAGE_PREVIEW_DIM,-1,!1,(l=>{(0,v.blobToBase64)(l,((l,c)=>{let d=S.insertImage(null,0,{mime:s,_tempPreview:c,width:a,height:i,filename:n,size:t.size,urlPromise:r});e&&(d=S.appendLineBreak(d),d=S.append(d,S.init(e))),this.props.sendMessage(d,r,o)}))}),(e=>{this.props.onError(e,"err")}))}else(0,v.blobToBase64)(t,((s,o)=>{let r=S.insertImage(null,0,{mime:s,preview:o,width:a,height:i,filename:n,size:t.size});e&&(r=S.appendLineBreak(r),r=S.append(r,S.init(e))),this.props.sendMessage(r)}))}handleAttachImage(e){const t=this.props.tinode.getServerLimit("maxFileUploadSize",f.MAX_EXTERN_ATTACHMENT_SIZE);(0,v.imageScaled)(e,f.MAX_IMAGE_DIM,f.MAX_IMAGE_DIM,t,!1,((e,t,s,a,i)=>{this.setState({imagePreview:{url:URL.createObjectURL(e),blob:e,filename:i,width:s,height:a,size:e.size,type:t}})}),(e=>{this.props.onError(e,"err")}))}handleCancelUpload(e,t){const s=this.state.messages.find((t=>t.seq==e));s&&(s._cancelled=!0),t.cancel()}render(){const{formatMessage:e}=this.props.intl;let t;if(this.props.hideSelf)t=null;else if(this.state.topic){let s;if(this.state.imagePreview)s=i().createElement(p.default,{content:this.state.imagePreview,onClose:this.handleClosePreview,onSendMessage:this.sendImageAttachment});else if(this.state.imagePostview)s=i().createElement(p.default,{content:this.state.imagePostview,onClose:this.handleClosePreview});else if(this.state.docPreview)s=i().createElement(c.default,{content:this.state.docPreview,onClose:this.handleClosePreview,onSendMessage:this.sendFileAttachment});else{const t=this.props.tinode.getTopic(this.state.topic),a=t.isChannel(),o="grp"==t.getType()&&!a;let c=[],p=null,_=null;for(let e=0;e{e.preventDefault(),this.props.onHideMessagesView()}},i().createElement("i",{className:"material-icons"},"arrow_back")):null,i().createElement("div",{className:"avatar-box"},i().createElement(u.default,{avatar:E,topic:this.state.topic,title:this.state.title}),a?null:i().createElement("span",{className:S})),i().createElement("div",{id:"topic-title-group"},i().createElement("div",{id:"topic-title",className:"panel-title"},this.state.title||i().createElement("i",null,i().createElement(n.FormattedMessage,{id:"unnamed_topic",defaultMessage:"Unnamed",description:"Title shown when the topic has no name"}))),i().createElement("div",{id:"topic-last-seen"},f)),o?i().createElement(h.default,{subscribers:this.state.onlineSubs}):i().createElement("div",{id:"topic-users"}),i().createElement("div",null,i().createElement("a",{href:"#",onClick:this.handleContextClick},i().createElement("i",{className:"material-icons"},"more_vert")))),this.props.displayMobile?i().createElement(d.default,{level:this.props.errorLevel,text:this.props.errorText,onClearError:this.props.onError}):null,i().createElement(g.default,{show:this.state.fetchingMessages}),i().createElement("div",{id:"messages-container"},i().createElement("div",{id:"messages-panel",ref:this.handleScrollReference},i().createElement("ul",{id:"scroller",className:_},c)),this.state.isReader?null:i().createElement("div",{id:"write-only-background"},this.state.readingBlocked?i().createElement("div",{id:"write-only-note"},i().createElement(n.FormattedMessage,{id:"messages_not_readable",defaultMessage:"no access to messages",description:"Message shown in topic without the read access"})):null)),this.state.peerMessagingDisabled&&!this.state.unconfirmed?i().createElement("div",{id:"peer-messaging-disabled-note"},i().createElement("i",{className:"material-icons secondary"},"block")," ",i().createElement(n.FormattedMessage,{id:"peers_messaging_disabled",defaultMessage:"Peer's messaging is disabled.",description:"Shown when the p2p peer's messaging is disabled"})," ",i().createElement("a",{href:"#",onClick:this.handleEnablePeer},i().createElement(n.FormattedMessage,{id:"enable_peers_messaging",defaultMessage:"Enable",description:"Call to action to enable peer's messaging"})),"."):null,this.state.unconfirmed?i().createElement(m.default,{onAction:this.handleNewChatAcceptance}):i().createElement(b.default,{disabled:!this.state.isWriter,onSendMessage:this.props.sendMessage,onKeyPress:this.sendKeyPress,onAttachFile:this.handleAttachFile,onAttachImage:this.handleAttachImage,onError:this.props.onError}))}t=i().createElement("div",{id:"topic-view"},s)}else t=i().createElement(_.default,{serverVersion:this.props.serverVersion,serverAddress:this.props.serverAddress});return t}}t.default=(0,n.injectIntl)(T)},"./src/views/new-topic-view.jsx":function(e,t,s){s.r(t);var a=s("react"),i=s.n(a),n=s("react-intl"),o=s("tinode-sdk"),r=s.n(o),l=s("./src/widgets/contact-list.jsx"),c=s("./src/widgets/new-topic-by-id.jsx"),d=s("./src/widgets/new-topic-group.jsx"),h=s("./src/widgets/search-contacts.jsx"),p=s("./src/lib/navigation.js"),m=s("./src/lib/utils.js");const u=(0,n.defineMessages)({search_for_contacts:{id:"search_for_contacts",defaultMessage:"Use search to find contacts",description:"Text shown in contacts view when user entered no search query."},search_no_results:{id:"search_no_results",defaultMessage:"Search returned no results",description:"Text shown in contacts view when query returned no results."}});class g extends i().Component{constructor(e){super(e),this.state={tabSelected:"p2p",searchQuery:null},this.handleTabClick=this.handleTabClick.bind(this),this.handleSearchContacts=this.handleSearchContacts.bind(this),this.handleContactSelected=this.handleContactSelected.bind(this),this.handleNewGroupSubmit=this.handleNewGroupSubmit.bind(this),this.handleGroupByID=this.handleGroupByID.bind(this)}componentDidMount(){this.props.onInitFind()}handleTabClick(e){e.preventDefault(),p.default.navigateTo(p.default.addUrlParam(window.location.hash,"tab",e.currentTarget.dataset.id)),this.setState({tabSelected:e.currentTarget.dataset.id})}handleSearchContacts(e){this.props.onSearchContacts(e),this.setState({searchQuery:r().isNullValue(e)?null:e})}handleContactSelected(e){"p2p"===this.state.tabSelected&&(p.default.navigateTo(p.default.removeUrlParam(window.location.hash,"tab")),this.props.onCreateTopic(e))}handleNewGroupSubmit(e,t,s,a,i){p.default.navigateTo(p.default.removeUrlParam(window.location.hash,"tab")),this.props.onCreateTopic(void 0,(0,m.vcard)(e,t),s,a,i)}handleGroupByID(e){p.default.navigateTo(p.default.removeUrlParam(window.location.hash,"tab")),this.props.onCreateTopic(e)}render(){const{formatMessage:e}=this.props.intl,t=e(this.state.searchQuery?u.search_no_results:u.search_for_contacts);return i().createElement("div",{className:"flex-column"},i().createElement("ul",{className:"tabbar"},i().createElement("li",{className:"p2p"===this.state.tabSelected?"active":null},i().createElement("a",{href:"#","data-id":"p2p",onClick:this.handleTabClick},i().createElement(n.FormattedMessage,{id:"tabtitle_find_user",defaultMessage:"find",description:"Tab title Find"}))),i().createElement("li",{className:"grp"===this.state.tabSelected?"active":null},i().createElement("a",{href:"#","data-id":"grp",onClick:this.handleTabClick},i().createElement(n.FormattedMessage,{id:"tabtitle_new_group",defaultMessage:"new group",description:"Tab title New Group"}))),i().createElement("li",{className:"byid"===this.state.tabSelected?"active":null},i().createElement("a",{href:"#","data-id":"byid",onClick:this.handleTabClick},i().createElement(n.FormattedMessage,{id:"tabtitle_group_by_id",defaultMessage:"by id",description:"Tab title Find topic by ID"})))),"grp"===this.state.tabSelected?i().createElement(d.default,{tinode:this.props.tinode,onSubmit:this.handleNewGroupSubmit}):"byid"===this.state.tabSelected?i().createElement(c.default,{onSubmit:this.handleGroupByID,onError:this.props.onError}):i().createElement("div",{className:"flex-column"},i().createElement(h.default,{type:"p2p",onSearchContacts:this.handleSearchContacts}),i().createElement(l.default,{contacts:this.props.searchResults,myUserId:this.props.myUserId,emptyListMessage:t,showOnline:!1,showUnread:!1,showContextMenu:!1,onTopicSelected:this.handleContactSelected})))}}t.default=(0,n.injectIntl)(g)},"./src/views/password-reset-view.jsx":function(e,t,s){s.r(t),s.d(t,{default:function(){return l}});var a=s("react"),i=s.n(a),n=s("react-intl"),o=s("./src/widgets/visible-password.jsx"),r=s("./src/lib/navigation.js");class l extends i().PureComponent{constructor(e){super(e),this.state={email:"",password:""},this.handleSubmit=this.handleSubmit.bind(this),this.handleEmailChange=this.handleEmailChange.bind(this),this.handlePasswordChange=this.handlePasswordChange.bind(this)}componentDidMount(){let e=r.default.parseUrlHash(window.location.hash);this.setState({token:e.params.token,scheme:e.params.scheme})}handleSubmit(e){e.preventDefault(),this.state.token?this.props.onReset(this.state.scheme,this.state.password.trim(),this.state.token):this.props.onRequest("email",this.state.email.trim())}handleEmailChange(e){this.setState({email:e.target.value})}handlePasswordChange(e){this.setState({password:e.target.value})}render(){let e=this.state.token&&this.state.scheme;return i().createElement("form",{id:"password-reset-form",onSubmit:this.handleSubmit},e?i().createElement(n.FormattedMessage,{id:"new_password_placeholder",defaultMessage:"Enter new password",description:"Placeholder for entering new password"},(e=>i().createElement(o.default,{placeholder:e,autoComplete:"new-password",value:this.state.password,required:!0,autoFocus:!0,onChange:this.handlePasswordChange}))):i().createElement(i().Fragment,null,i().createElement("label",{htmlFor:"inputEmail"},i().createElement(n.FormattedMessage,{id:"label_reset_password",defaultMessage:"Send a password reset email:",description:"Label for password reset field"})),i().createElement(n.FormattedMessage,{id:"credential_email_prompt",defaultMessage:"Your registration email",description:"Placeholder for entering email"},(e=>i().createElement("input",{type:"email",id:"inputEmail",placeholder:e,autoComplete:"email",value:this.state.email,onChange:this.handleEmailChange,required:!0,autoFocus:!0})))),i().createElement("div",{className:"dialog-buttons"},i().createElement("button",{className:"blue",type:"submit"},e?i().createElement(n.FormattedMessage,{id:"button_reset",defaultMessage:"Reset",description:"Button [Reset]"}):i().createElement(n.FormattedMessage,{id:"button_send_request",defaultMessage:"Send request",description:"Button [Send request]"}))))}}},"./src/views/settings-view.jsx":function(e,t,s){s.r(t),s.d(t,{default:function(){return r}});var a=s("react"),i=s.n(a),n=s("react-intl"),o=s("./src/widgets/host-selector.jsx");class r extends i().PureComponent{constructor(e){super(e),this.state={transport:e.transport||"def",serverAddress:e.serverAddress},this.handleSubmit=this.handleSubmit.bind(this),this.handleTransportSelected=this.handleTransportSelected.bind(this),this.handleServerAddressChange=this.handleServerAddressChange.bind(this)}handleSubmit(e){e.preventDefault(),this.props.onUpdate({transport:this.state.transport,serverAddress:this.state.serverAddress})}handleTransportSelected(e){this.setState({transport:e.currentTarget.value})}handleServerAddressChange(e){this.setState({serverAddress:e})}render(){const e={def:"default",ws:"websocket",lp:"long polling"};var t=[],s=this;return["def","ws","lp"].map((function(a){var n="transport-"+a,o=e[a];t.push(i().createElement("li",{key:a},i().createElement("input",{type:"radio",id:n,name:"transport-select",value:a,checked:s.state.transport===a,onChange:s.handleTransportSelected}),i().createElement("label",{htmlFor:n},o)))})),i().createElement("form",{id:"settings-form",className:"panel-form",onSubmit:this.handleSubmit},i().createElement("div",{className:"panel-form-row"},i().createElement("label",{className:"small"},i().createElement(n.FormattedMessage,{id:"label_server_to_use",defaultMessage:"Server to use:",description:"Label for server selector in SettingsView"}))),i().createElement(o.default,{serverAddress:this.state.serverAddress,onServerAddressChange:this.handleServerAddressChange}),i().createElement("div",{className:"panel-form-row"},i().createElement("label",{className:"small"},i().createElement(n.FormattedMessage,{id:"label_wire_transport",defaultMessage:"Wire transport:",description:"Label for wire transport selection in SettingsView"}))),i().createElement("div",{className:"panel-form-row"},i().createElement("ul",{className:"quoted"},t)),i().createElement("div",{className:"dialog-buttons"},i().createElement("button",{type:"submit",className:"blue"},i().createElement(n.FormattedMessage,{id:"button_update",defaultMessage:"Update",description:"Button [Update]"}))))}}},"./src/views/sidepanel-view.jsx":function(e,t,s){s.r(t);var a=s("react"),i=s.n(a),n=s("react-intl"),o=s("./src/widgets/error-panel.jsx"),r=s("./src/widgets/load-spinner.jsx"),l=s("./src/widgets/side-navbar.jsx"),c=s("./src/views/contacts-view.jsx"),d=s("./src/views/create-account-view.jsx"),h=s("./src/views/edit-account-view.jsx"),p=s("./src/views/acc-general-view.jsx"),m=s("./src/views/acc-notifications-view.jsx"),u=s("./src/views/acc-security-view.jsx"),g=s("./src/views/acc-support-view.jsx"),_=s("./src/views/login-view.jsx"),b=s("./src/views/new-topic-view.jsx"),f=s("./src/views/password-reset-view.jsx"),v=s("./src/views/settings-view.jsx"),E=s("./src/views/validation-view.jsx");const w=(0,n.defineMessages)({login:{id:"sidepanel_title_login",description:"Sidepanel title for LoginView.",defaultMessage:"Sign In"},register:{id:"sidepanel_title_register",description:"Sidepanel title for CreateAccountView.",defaultMessage:"Create Account"},settings:{id:"sidepanel_title_settings",description:"Sidepanel title for SettingsView.",defaultMessage:"Settings"},edit:{id:"sidepanel_title_account_settings",description:"Sidepanel title for EditAccountView.",defaultMessage:"Account Settings"},general:{id:"sidepanel_title_acc_general",description:"Sidepanel title for AccGeneralView.",defaultMessage:"General"},security:{id:"sidepanel_title_acc_security",description:"Sidepanel title for AccSecurityView.",defaultMessage:"Security"},notif:{id:"sidepanel_title_acc_notifications",description:"Sidepanel title for AccNotificationsView.",defaultMessage:"Notifications"},support:{id:"sidepanel_title_acc_support",description:"Sidepanel title for AccSupportView.",defaultMessage:"Support"},newtpk:{id:"sidepanel_title_newtpk",description:"Sidepanel title for NewTopicView.",defaultMessage:"Start New Chat"},cred:{id:"sidepanel_title_cred",description:"Sidepanel title for ValidationView.",defaultMessage:"Confirm Credentials"},reset:{id:"sidepanel_title_reset",description:"Sidepanel title for PasswordResetView.",defaultMessage:"Reset Password"},archive:{id:"sidepanel_title_archive",description:"Sidepanel title for ContactsView-Archive.",defaultMessage:"Archived Chats"},blocked:{id:"sidepanel_title_blocked",description:"Sidepanel title for ContactsView-Blocked.",defaultMessage:"Blocked Chats"}});class S extends i().Component{constructor(e){super(e),this.handleLoginRequested=this.handleLoginRequested.bind(this),this.handleNewTopic=this.handleNewTopic.bind(this)}handleLoginRequested(e,t){this.props.onLoginRequest(e,t)}handleNewTopic(){this.props.onBasicNavigate("newtpk")}render(){const{formatMessage:e}=this.props.intl,t=this.props.state||(this.props.myUserId?"contacts":"login");let s,a,n;return"contacts"==t?(s=this.props.title,a=!this.props.avatar||this.props.avatar):(s=e(w[t]),a=!1),-1==["login","contacts"].indexOf(t)&&(n=this.props.onCancel),i().createElement("div",{id:"sidepanel",className:this.props.hideSelf?"nodisplay":null},i().createElement(l.default,{state:t,title:s,avatar:a,myUserId:this.props.myUserId,onSignUp:this.props.onSignUp,onSettings:this.props.onSettings,onNewTopic:this.handleNewTopic,onCancel:n}),i().createElement(o.default,{level:this.props.errorLevel,text:this.props.errorText,action:this.props.errorAction,actionText:this.props.errorActionText,onClearError:this.props.onError}),i().createElement(r.default,{show:this.props.loadSpinnerVisible}),"login"===t?i().createElement(_.default,{login:this.props.login,disabled:this.props.loginDisabled,onLogin:this.handleLoginRequested}):"register"===t?i().createElement(d.default,{onCreateAccount:this.props.onCreateAccount,onCancel:this.props.onCancel,onError:this.props.onError}):"settings"===t?i().createElement(v.default,{transport:this.props.transport,serverAddress:this.props.serverAddress,onCancel:this.props.onCancel,onUpdate:this.props.onGlobalSettings}):"edit"===t?i().createElement(h.default,{tinode:this.props.tinode,myUserId:this.props.myUserId,onBasicNavigate:this.props.onBasicNavigate}):"general"===t?i().createElement(p.default,{tinode:this.props.tinode,myUserId:this.props.myUserId,onUpdateAccount:this.props.onUpdateAccount,onUpdateTags:this.props.onUpdateAccountTags,onCredAdd:this.props.onCredAdd,onCredDelete:this.props.onCredDelete,onCredConfirm:this.props.onCredConfirm,onBasicNavigate:this.props.onBasicNavigate,onError:this.props.onError}):"notif"===t?i().createElement(m.default,{messageSounds:this.props.messageSounds,desktopAlerts:this.props.desktopAlerts,desktopAlertsEnabled:this.props.desktopAlertsEnabled,incognitoMode:this.props.incognitoMode,onTogglePushNotifications:this.props.onTogglePushNotifications,onToggleMessageSounds:this.props.onToggleMessageSounds,onToggleIncognitoMode:this.props.onToggleIncognitoMode}):"security"===t?i().createElement(u.default,{tinode:this.props.tinode,onUpdateAccount:this.props.onUpdateAccount,onLogout:this.props.onLogout,onDeleteAccount:this.props.onDeleteAccount,onShowAlert:this.props.onShowAlert,onShowBlocked:this.props.onShowBlocked}):"support"===t?i().createElement(g.default,{serverAddress:this.props.serverAddress,serverVersion:this.props.serverVersion}):"contacts"===t||"archive"==t||"blocked"==t?i().createElement(c.default,{tinode:this.props.tinode,myUserId:this.props.myUserId,connected:this.props.connected,topicSelected:this.props.topicSelected,archive:"archive"==t,blocked:"blocked"==t,chatList:this.props.chatList,showContextMenu:this.props.showContextMenu,onTopicSelected:this.props.onTopicSelected,onShowArchive:this.props.onShowArchive}):"newtpk"===t?i().createElement(b.default,{tinode:this.props.tinode,searchResults:this.props.searchResults,onInitFind:this.props.onInitFind,onSearchContacts:this.props.onSearchContacts,onCreateTopic:this.props.onCreateTopic,onError:this.props.onError}):"cred"===t?i().createElement(E.default,{credCode:this.props.credCode,credMethod:this.props.credMethod,onSubmit:this.props.onValidateCredentials,onCancel:this.props.onCancel,onError:this.props.onError}):"reset"===t?i().createElement(f.default,{onRequest:this.props.onPasswordResetRequest,onReset:this.props.onResetPassword}):null)}}t.default=(0,n.injectIntl)(S)},"./src/views/tinode-web.jsx":function(e,t,s){s.r(t);var a=s("react"),i=s.n(a),n=s("react-dom"),o=s.n(n),r=s("react-intl"),l=s("firebase/app"),c=(s("firebase/messaging"),s("tinode-sdk")),d=s.n(c),h=s("./src/widgets/alert.jsx"),p=s("./src/widgets/context-menu.jsx"),m=s("./src/views/info-view.jsx"),u=s("./src/views/messages-view.jsx"),g=s("./src/views/sidepanel-view.jsx"),_=s("./src/config.js"),b=s("./src/lib/blob-helpers.js"),f=s("./src/lib/host-name.js"),v=s("./src/lib/local-storage.js"),E=s("./src/lib/navigation.js"),w=s("./src/lib/strformat.js"),S=s("./src/lib/utils.js");const C=new Audio("audio/msg.mp3"),M=(0,r.defineMessages)({reconnect_countdown:{id:"reconnect_countdown",defaultMessage:"Disconnected. Reconnecting in {seconds}…",description:"Message shown when an app update is available."},reconnect_now:{id:"reconnect_now",defaultMessage:"Try now",description:"Prompt for reconnecting now"},push_init_failed:{id:"push_init_failed",defaultMessage:"Failed to initialize push notifications",description:"Error message when push notifications have failed to initialize."},invalid_security_token:{id:"invalid_security_token",defaultMessage:"Invalid security token",description:"Error message when resetting password."},no_connection:{id:"no_connection",defaultMessage:"No connection",description:"Warning that the user is offline."},code_doesnot_match:{id:"code_doesnot_match",defaultMessage:"Code does not match",description:"Error message when the credential validation code is incorrect."}});class k extends i().Component{constructor(e){super(e),this.state=this.getBlankState(),this.handleResize=this.handleResize.bind(this),this.handleHashRoute=this.handleHashRoute.bind(this),this.handleOnline=this.handleOnline.bind(this),this.checkForAppUpdate=this.checkForAppUpdate.bind(this),this.handleVisibilityEvent=this.handleVisibilityEvent.bind(this),this.handleError=this.handleError.bind(this),this.handleLoginRequest=this.handleLoginRequest.bind(this),this.handleConnected=this.handleConnected.bind(this),this.handleAutoreconnectIteration=this.handleAutoreconnectIteration.bind(this),this.doLogin=this.doLogin.bind(this),this.handleCredentialsRequest=this.handleCredentialsRequest.bind(this),this.handleLoginSuccessful=this.handleLoginSuccessful.bind(this),this.handleDisconnect=this.handleDisconnect.bind(this),this.tnMeMetaDesc=this.tnMeMetaDesc.bind(this),this.tnMeContactUpdate=this.tnMeContactUpdate.bind(this),this.tnMeSubsUpdated=this.tnMeSubsUpdated.bind(this),this.resetContactList=this.resetContactList.bind(this),this.tnData=this.tnData.bind(this),this.tnInitFind=this.tnInitFind.bind(this),this.tnFndSubsUpdated=this.tnFndSubsUpdated.bind(this),this.handleSearchContacts=this.handleSearchContacts.bind(this),this.handleTopicSelected=this.handleTopicSelected.bind(this),this.handleHideMessagesView=this.handleHideMessagesView.bind(this),this.handleSendMessage=this.handleSendMessage.bind(this),this.handleNewChatInvitation=this.handleNewChatInvitation.bind(this),this.handleNewAccount=this.handleNewAccount.bind(this),this.handleNewAccountRequest=this.handleNewAccountRequest.bind(this),this.handleUpdateAccountRequest=this.handleUpdateAccountRequest.bind(this),this.handleUpdateAccountTagsRequest=this.handleUpdateAccountTagsRequest.bind(this),this.handleToggleIncognitoMode=this.handleToggleIncognitoMode.bind(this),this.handleSettings=this.handleSettings.bind(this),this.handleGlobalSettings=this.handleGlobalSettings.bind(this),this.handleShowArchive=this.handleShowArchive.bind(this),this.handleShowBlocked=this.handleShowBlocked.bind(this),this.handleToggleMessageSounds=this.handleToggleMessageSounds.bind(this),this.handleCredAdd=this.handleCredAdd.bind(this),this.handleCredDelete=this.handleCredDelete.bind(this),this.handleCredConfirm=this.handleCredConfirm.bind(this),this.initDesktopAlerts=this.initDesktopAlerts.bind(this),this.togglePushToken=this.togglePushToken.bind(this),this.requestPushToken=this.requestPushToken.bind(this),this.handleSidepanelCancel=this.handleSidepanelCancel.bind(this),this.handleStartTopicRequest=this.handleStartTopicRequest.bind(this),this.handleNewTopicCreated=this.handleNewTopicCreated.bind(this),this.handleTopicUpdateRequest=this.handleTopicUpdateRequest.bind(this),this.handleChangePermissions=this.handleChangePermissions.bind(this),this.handleTagsUpdated=this.handleTagsUpdated.bind(this),this.handleLogout=this.handleLogout.bind(this),this.handleDeleteAccount=this.handleDeleteAccount.bind(this),this.handleDeleteMessagesRequest=this.handleDeleteMessagesRequest.bind(this),this.handleLeaveUnsubRequest=this.handleLeaveUnsubRequest.bind(this),this.handleBlockTopicRequest=this.handleBlockTopicRequest.bind(this),this.handleReportTopic=this.handleReportTopic.bind(this),this.handleShowContextMenu=this.handleShowContextMenu.bind(this),this.defaultTopicContextMenu=this.defaultTopicContextMenu.bind(this),this.handleHideContextMenu=this.handleHideContextMenu.bind(this),this.handleShowAlert=this.handleShowAlert.bind(this),this.handleShowInfoView=this.handleShowInfoView.bind(this),this.handleHideInfoView=this.handleHideInfoView.bind(this),this.handleMemberUpdateRequest=this.handleMemberUpdateRequest.bind(this),this.handleValidateCredentialsRequest=this.handleValidateCredentialsRequest.bind(this),this.handlePasswordResetRequest=this.handlePasswordResetRequest.bind(this),this.handleResetPassword=this.handleResetPassword.bind(this),this.handleContextMenuAction=this.handleContextMenuAction.bind(this)}getBlankState(){const e=v.default.getObject("settings")||{};return{connected:!1,ready:!1,autoLogin:!1,transport:e.transport||null,serverAddress:e.serverAddress||(0,f.detectServerAddress)(),serverVersion:"no connection",messageSounds:!e.messageSoundsOff,incognitoMode:!1,desktopAlerts:e.desktopAlerts,desktopAlertsEnabled:((0,f.isSecureConnection)()||(0,f.isLocalHost)())&&void 0!==l&&"undefined"!=typeof navigator&&"undefined"!=typeof FIREBASE_INIT,firebaseToken:v.default.getObject("firebase-token"),applicationVisible:!document.hidden,errorText:"",errorLevel:null,errorAction:void 0,errorActionText:null,sidePanelSelected:"login",sidePanelTitle:null,sidePanelAvatar:null,loadSpinnerVisible:!1,login:"",password:"",myUserId:null,liveConnection:navigator.onLine,topicSelected:"",topicSelectedOnline:!1,topicSelectedAcs:null,newTopicParams:null,loginDisabled:!1,displayMobile:window.innerWidth<=_.MEDIA_BREAKPOINT,showInfoPanel:!1,mobilePanel:"sidepanel",contextMenuVisible:!1,contextMenuBounds:null,contextMenuClickAt:null,contextMenuParams:null,contextMenuItems:[],alertVisible:!1,alertParams:{},chatList:[],searchResults:[],searchableContacts:[],credMethod:void 0,credCode:void 0}}componentDidMount(){window.addEventListener("resize",this.handleResize),window.addEventListener("online",(e=>{this.handleOnline(!0)})),window.addEventListener("offline",(e=>{this.handleOnline(!1)})),window.addEventListener("hashchange",this.handleHashRoute),document.addEventListener("visibilitychange",this.handleVisibilityEvent),this.setState({viewportWidth:document.documentElement.clientWidth,viewportHeight:document.documentElement.clientHeight});const{formatMessage:e,locale:t}=this.props.intl;if(this.tinode=k.tnSetup(this.state.serverAddress,this.state.transport,t),this.tinode.onConnect=this.handleConnected,this.tinode.onDisconnect=this.handleDisconnect,this.tinode.onAutoreconnectIteration=this.handleAutoreconnectIteration,this.state.desktopAlertsEnabled)try{this.fbPush=l.initializeApp(FIREBASE_INIT,_.APP_NAME).messaging(),this.fbPush.usePublicVapidKey(FIREBASE_INIT.messagingVapidKey),navigator.serviceWorker.register("/service-worker.js").then((e=>{this.checkForAppUpdate(e),this.fbPush.useServiceWorker(e),e.active.postMessage(JSON.stringify({locale:t})),this.initDesktopAlerts(),this.state.desktopAlerts&&(this.state.firebaseToken?this.tinode.setDeviceToken(this.state.firebaseToken,!0):this.togglePushToken(!0))})).catch((e=>{console.log("Failed to register service worker:",e)}))}catch(t){this.handleError(e({id:"push_init_failed"}),"err"),console.log("Failed to initialize push notifications",t),this.setState({desktopAlertsEnabled:!1})}const s=v.default.getObject("keep-logged-in")?v.default.getObject("auth-token"):void 0,a=E.default.parseUrlHash(window.location.hash);s?(this.setState({autoLogin:!0}),s.expires=new Date(s.expires),this.tinode.setAuthToken(s),this.tinode.connect().catch((e=>{this.handleError(e.message,"err")})),delete a.params.info,delete a.params.tab,a.path[0]="",E.default.navigateTo(E.default.composeUrlHash(a.path,a.params))):a.params.token||E.default.navigateTo(""),this.readTimer=null,this.readTimerCallback=null,this.handleHashRoute()}componentWillUnmount(){window.removeEventListener("resize",this.handleResize),window.removeEventListener("hashchange",this.handleHashRoute),document.removeEventListener("visibilitychange",this.handleVisibilityEvent)}static tnSetup(e,t,s){const a=new(d())(_.APP_NAME,e,_.API_KEY,t,(0,f.isSecureConnection)());return a.setHumanLanguage(s),a.enableLogging(_.LOGGING_ENABLED,!0),a}handleResize(){const e=document.documentElement.clientWidth<=_.MEDIA_BREAKPOINT;this.setState({viewportWidth:document.documentElement.clientWidth,viewportHeight:document.documentElement.clientHeight}),this.state.displayMobile!=e&&this.setState({displayMobile:e})}checkForAppUpdate(e){e.onupdatefound=()=>{const t=e.installing;t.onstatechange=()=>{if("installed"==t.state&&navigator.serviceWorker.controller){const e=i().createElement(i().Fragment,null,i().createElement(r.FormattedMessage,{id:"update_available",defaultMessage:"Update available.",description:"Message shown when an app update is available."})," ",i().createElement("a",{href:""},i().createElement(r.FormattedMessage,{id:"reload_update",defaultMessage:"Reload",description:"Call to action to reload application when update is available."})),".");this.handleError(e,"info")}}}}handleHashRoute(){const e=E.default.parseUrlHash(window.location.hash);e.path&&e.path.length>0?(["register","settings","edit","notif","security","support","general","cred","reset","newtpk","archive","blocked","contacts",""].includes(e.path[0])?this.setState({sidePanelSelected:e.path[0]}):console.log("Unknown sidepanel view",e.path[0]),e.path.length>1&&e.path[1]!=this.state.topicSelected&&this.setState({topicSelected:d().topicType(e.path[1])?e.path[1]:null})):this.setState({sidePanelSelected:""}),e.params.method&&this.setState({credMethod:e.params.method}),e.params.code&&this.setState({credCode:e.params.code}),this.setState({showInfoPanel:e.params.info,newTopicTabSelected:e.params.tab})}handleOnline(e){e?this.handleError():this.handleError(this.props.intl.formatMessage({id:"no_connection"}),"warn"),this.setState({liveConnection:e})}handleVisibilityEvent(){this.setState({applicationVisible:!document.hidden})}handleError(e,t,s,a){this.setState({errorText:e,errorLevel:t,errorAction:s,errorActionText:a})}handleLoginRequest(e,t){this.setState({loginDisabled:!0,login:e,password:t,loadSpinnerVisible:!0,autoLogin:!0}),this.handleError("",null),this.tinode.isConnected()?this.doLogin(e,t,{meth:this.state.credMethod,resp:this.state.credCode}):this.tinode.connect().catch((e=>{this.setState({loginDisabled:!1,autoLogin:!1,loadSpinnerVisible:!1}),this.handleError(e.message,"err")}))}handleConnected(){const e=this.tinode.getServerInfo();this.setState({serverVersion:e.ver+" "+(e.build?e.build:"none")}),this.state.autoLogin&&this.doLogin(this.state.login,this.state.password,{meth:this.state.credMethod,resp:this.state.credCode})}handleAutoreconnectIteration(e,t){if(clearInterval(this.reconnectCountdown),e<0)return void this.handleError();if(t)return void t.then((()=>{this.handleError()})).catch((e=>{this.handleError(e.message,"err")}));const{formatMessage:s}=this.props.intl;let a=e/1e3;a|=a,this.reconnectCountdown=setInterval((()=>{const e=a>99?(0,w.secondsToTime)(a):a;this.handleError(s(M.reconnect_countdown,{seconds:e}),"warn",(()=>{clearInterval(this.reconnectCountdown),this.tinode.reconnect()}),s(M.reconnect_now)),a-=1}),1e3)}handleDisconnect(e){this.setState({connected:!1,ready:!1,topicSelectedOnline:!1,errorText:e&&e.message?e.message:"Disconnected",errorLevel:e&&e.message?"err":"warn",loginDisabled:!1,contextMenuVisible:!1,serverVersion:"no connection"})}doLogin(e,t,s){if(this.tinode.isAuthenticated())return void E.default.navigateTo("");s=d().credential(s);let a=null;const i=this.tinode.getAuthToken();e&&t?(this.setState({password:null}),a=this.tinode.loginBasic(e,t,s)):i&&(a=this.tinode.loginToken(i.token,s)),a?a.then((e=>{e.code>=300&&"validate credentials"===e.text?(this.setState({loadSpinnerVisible:!1}),s&&this.handleError(this.props.intl.formatMessage({id:"code_doesnot_match"}),"warn"),this.handleCredentialsRequest(e.params)):this.handleLoginSuccessful()})).catch((e=>{this.setState({loginDisabled:!1,credMethod:void 0,credCode:void 0,loadSpinnerVisible:!1,autoLogin:!1}),this.handleError(e.message,"err"),localStorage.removeItem("auth-token"),E.default.navigateTo("")})):(E.default.navigateTo(""),this.setState({loginDisabled:!1}))}handleCredentialsRequest(e){const t=E.default.parseUrlHash(window.location.hash);t.path[0]="cred",t.params.method=e.cred[0],E.default.navigateTo(E.default.composeUrlHash(t.path,t.params))}handleLoginSuccessful(){this.handleError(),v.default.getObject("keep-logged-in")&&v.default.setObject("auth-token",this.tinode.getAuthToken());const e=this.tinode.getMeTopic();e.onMetaDesc=this.tnMeMetaDesc,e.onContactUpdate=this.tnMeContactUpdate,e.onSubsUpdated=this.tnMeSubsUpdated,this.setState({connected:!0,credMethod:void 0,credCode:void 0,myUserId:this.tinode.getCurrentUserID(),autoLogin:!0}),e.subscribe(e.startMetaQuery().withLaterSub().withDesc().withTags().withCred().build()).catch((e=>{this.tinode.disconnect(),localStorage.removeItem("auth-token"),this.handleError(e.message,"err"),E.default.navigateTo("")})).finally((()=>{this.setState({loadSpinnerVisible:!1})})),E.default.navigateTo(E.default.setUrlSidePanel(window.location.hash,"contacts"))}tnMeMetaDesc(e){e&&(e.public&&this.setState({sidePanelTitle:e.public.fn,sidePanelAvatar:(0,b.makeImageUrl)(e.public.photo)}),e.acs&&this.setState({incognitoMode:!e.acs.isPresencer()}))}tnMeContactUpdate(e,t){if("on"==e||"off"==e)this.resetContactList(),this.state.topicSelected==t.topic&&this.setState({topicSelectedOnline:"on"==e});else if("read"==e)this.resetContactList();else if("msg"==e){const e=this.tinode.getTopic(t.topic),s=e&&e.isArchived();t.unread>0&&this.state.messageSounds&&!s&&(document.hidden||this.state.topicSelected!=t.topic)&&C.play(),this.resetContactList()}else"recv"==e||("gone"==e||"unsub"==e?(this.state.topicSelected==t.topic&&this.handleTopicSelected(null),this.resetContactList()):"acs"==e?this.state.topicSelected==t.topic&&this.setState({topicSelectedAcs:t.acs}):"del"==e||"upd"==e||console.log("Unsupported (yet) presence update:"+e+" in: "+t.topic))}tnMeSubsUpdated(e){this.resetContactList()}static prepareSearchableContacts(e,t){const s={};for(const t of e)d().isP2PTopicName(t.topic)&&(s[t.topic]={user:t.topic,updated:t.updated,public:t.public,private:t.private,acs:t.acs});for(const e of t)s[e.user]||(s[e.user]=e);return Object.values(s)}resetContactList(){const e={chatList:[]};this.state.ready||(e.ready=!0),this.tinode.getMeTopic().contacts((t=>{e.chatList.push(t),this.state.topicSelected==t.topic&&(e.topicSelectedOnline=t.online,e.topicSelectedAcs=t.acs)})),e.searchableContacts=k.prepareSearchableContacts(e.chatList,this.state.searchResults),this.setState(e)}tnData(e){const t=this.tinode.getTopic(e.topic);t.msgStatus(e)>=d().MESSAGE_STATUS_SENT&&e.from!=this.state.myUserId&&(clearTimeout(this.receivedTimer),this.receivedTimer=setTimeout((()=>{this.receivedTimer=void 0,t.noteRecv(e.seq)}),_.RECEIVED_DELAY))}tnInitFind(){const e=this.tinode.getFndTopic();e.onSubsUpdated=this.tnFndSubsUpdated,e.isSubscribed()?this.tnFndSubsUpdated():e.subscribe(e.startMetaQuery().withSub().build()).catch((e=>{this.handleError(e.message,"err")}))}tnFndSubsUpdated(){const e=[];this.tinode.getFndTopic().contacts((t=>{e.push(t)})),this.setState({searchResults:e,searchableContacts:k.prepareSearchableContacts(this.state.chatList,e)})}handleSearchContacts(e){const t=this.tinode.getFndTopic();t.setMeta({desc:{public:e}}).then((e=>t.getMeta(t.startMetaQuery().withSub().build()))).catch((e=>{this.handleError(e.message,"err")}))}handleTopicSelected(e){this.state.newTopicParams&&this.state.newTopicParams._topicName!=e&&this.setState({newTopicParams:null}),e?(this.setState({errorText:"",errorLevel:null,mobilePanel:"topic-view",showInfoPanel:!1}),this.state.topicSelected!=e&&(this.setState({topicSelectedOnline:this.tinode.isTopicOnline(e),topicSelectedAcs:this.tinode.getTopicAccessMode(e)}),E.default.navigateTo(E.default.setUrlTopic("",e)))):(this.setState({errorText:"",errorLevel:null,mobilePanel:"sidepanel",topicSelectedOnline:!1,topicSelectedAcs:null,showInfoPanel:!1}),E.default.navigateTo(E.default.setUrlTopic("",null)))}handleHideMessagesView(){this.setState({mobilePanel:"sidepanel"}),E.default.navigateTo(E.default.setUrlTopic(window.location.hash,null))}handleSendMessage(e,t,s){const a=this.tinode.getTopic(this.state.topicSelected);(e=a.createMessage(e,!1))._uploader=s,a.isSubscribed()||(t||(t=Promise.resolve()),t=t.then((()=>a.subscribe()))),t&&(t=t.catch((e=>{this.handleError(e.message,"err")}))),a.publishDraft(e,t).then((e=>{if(a.isArchived())return a.archive(!1)})).catch((e=>{this.handleError(e.message,"err")}))}handleNewChatInvitation(e,t){const s=this.tinode.getTopic(e);let a=null;switch(t){case"accept":const i=s.getAccessMode().getGiven();a=s.setMeta({sub:{mode:i}}),s.isP2P()&&(a=a.then((t=>{s.setMeta({sub:{user:e,mode:i}})})));break;case"delete":a=s.delTopic(!0);break;case"block":const n=s.getAccessMode().updateWant("-JP").getWant();a=s.setMeta({sub:{mode:n}}).then((e=>this.handleTopicSelected(null)));break;default:console.log("Unknown invitation action",'"'+t+'""')}null!=a&&a.catch((e=>{this.handleError(e.message,"err")}))}handleNewAccount(){this.handleError(),E.default.navigateTo(E.default.setUrlSidePanel(window.location.hash,"register"))}handleNewAccountRequest(e,t,s,a,i){this.handleError(),this.tinode.connect(this.state.serverAddress).then((()=>this.tinode.createAccountBasic(e,t,{public:s,tags:i,cred:d().credential(a)}))).then((e=>{e.code>=300&&"validate credentials"==e.text?this.handleCredentialsRequest(e.params):this.handleLoginSuccessful(this)})).catch((e=>{this.handleError(e.message,"err")}))}handleUpdateAccountRequest(e,t,s){if(this.handleError(),t||s){const e={};t&&(e.public=t),s&&(e.defacs=s),this.tinode.getMeTopic().setMeta({desc:e}).catch((e=>{this.handleError(e.message,"err")}))}e&&this.tinode.updateAccountBasic(null,this.tinode.getCurrentLogin(),e).catch((e=>{this.handleError(e.message,"err")}))}handleToggleIncognitoMode(e){const t=this.tinode.getMeTopic(),s=t.getAccessMode().updateWant(e?"-P":"+P").getWant();t.setMeta({sub:{mode:s}}).catch((e=>{this.handleError(e.message,"err")}))}handleUpdateAccountTagsRequest(e){this.tinode.getMeTopic().setMeta({tags:e}).catch((e=>{this.handleError(e.message,"err")}))}handleSettings(){this.handleError(),E.default.navigateTo(E.default.setUrlSidePanel(window.location.hash,this.state.myUserId?"edit":"settings"))}handleGlobalSettings(e){const t=e.serverAddress||this.state.serverAddress,s=e.transport||this.state.transport;this.tinode&&(this.tinode.onDisconnect=void 0,this.tinode.disconnect()),this.tinode=k.tnSetup(t,s,this.props.intl.locale),this.tinode.onConnect=this.handleConnected,this.tinode.onDisconnect=this.handleDisconnect,this.setState({serverAddress:t,transport:s}),v.default.setObject("settings",{serverAddress:t,transport:s}),E.default.navigateTo(E.default.setUrlSidePanel(window.location.hash,""))}handleShowArchive(){E.default.navigateTo(E.default.setUrlSidePanel(window.location.hash,this.state.myUserId?"archive":""))}handleShowBlocked(){E.default.navigateTo(E.default.setUrlSidePanel(window.location.hash,this.state.myUserId?"blocked":""))}initDesktopAlerts(){this.fbPush.onTokenRefresh((()=>{this.requestPushToken()})),this.fbPush.onMessage((e=>{}))}togglePushToken(e){e?this.state.firebaseToken?(this.setState({desktopAlerts:!0}),v.default.updateObject("settings",{desktopAlerts:!0})):this.fbPush.requestPermission().then((()=>{this.requestPushToken()})).catch((e=>{this.handleError(e.message,"err"),this.setState({desktopAlerts:!1,firebaseToken:null}),v.default.updateObject("settings",{desktopAlerts:!1}),console.log("Failed to get permission to notify.",e)})):this.state.firebaseToken?this.fbPush.deleteToken(this.state.firebaseToken).catch((e=>{console.log("Unable to delete token.",e)})).finally((()=>{v.default.updateObject("settings",{desktopAlerts:!1}),localStorage.removeItem("firebase-token"),this.setState({desktopAlerts:!1,firebaseToken:null})})):(this.setState({desktopAlerts:!1,firebaseToken:null}),v.default.updateObject("settings",{desktopAlerts:!1}))}requestPushToken(){this.fbPush.getToken().then((e=>{e!=this.state.firebaseToken&&(this.tinode.setDeviceToken(e,!0),v.default.setObject("firebase-token",e)),this.setState({firebaseToken:e,desktopAlerts:!0}),v.default.updateObject("settings",{desktopAlerts:!0})})).catch((e=>{this.handleError(e.message,"err"),console.log("Failed to retrieve firebase token",e)}))}handleToggleMessageSounds(e){this.setState({messageSounds:e}),v.default.updateObject("settings",{messageSoundsOff:!e})}handleCredAdd(e,t){this.tinode.getMeTopic().setMeta({cred:{meth:e,val:t}}).catch((e=>{this.handleError(e.message,"err")}))}handleCredDelete(e,t){this.tinode.getMeTopic().delCredential(e,t).catch((e=>{this.handleError(e.message,"err")}))}handleCredConfirm(e,t){this.handleCredentialsRequest({cred:[e]})}handleSidepanelCancel(){const e=E.default.parseUrlHash(window.location.hash);let t="";["security","support","general","notif"].includes(e.path[0])?t="edit":"blocked"==e.path[0]?t="security":this.state.myUserId&&(t="contacts"),e.path[0]=t,e.params&&(delete e.params.code,delete e.params.method,delete e.params.tab),E.default.navigateTo(E.default.composeUrlHash(e.path,e.params)),this.setState({errorText:"",errorLevel:null})}basicNavigator(e){E.default.navigateTo(E.default.setUrlSidePanel(window.location.hash,e))}handleStartTopicRequest(e,t,s,a,i){if(e&&this.tinode.isTopicCached(e))return void this.handleTopicSelected(e);const n={};d().isP2PTopicName(e)?(n.sub={mode:_.DEFAULT_P2P_ACCESS_MODE},n.desc={defacs:{auth:_.DEFAULT_P2P_ACCESS_MODE}}):(e=e||this.tinode.newGroupTopicName(i),n.desc={public:t,private:{comment:s}},n.tags=a),n._topicName=e,this.setState({newTopicParams:n},(()=>{this.handleTopicSelected(e)}))}handleNewTopicCreated(e,t){this.state.topicSelected==e&&e!=t&&this.setState({topicSelected:t},(()=>{E.default.navigateTo(E.default.setUrlTopic("",t))}))}handleTopicUpdateRequest(e,t,s,a){const i=this.tinode.getTopic(e);if(i){const e={};t&&(e.public=t),s&&(e.private=s===d().DEL_CHAR?d().DEL_CHAR:{comment:s}),a&&(e.defacs=a),i.setMeta({desc:e}).catch((e=>{this.handleError(e.message,"err")}))}}handleChangePermissions(e,t,s){const a=this.tinode.getTopic(e);if(a){const e=a.getAccessMode();s?(e.updateGiven(t),t=e.getGiven()):(e.updateWant(t),t=e.getWant()),a.setMeta({sub:{user:s,mode:t}}).catch((e=>{this.handleError(e.message,"err")}))}}handleTagsUpdated(e,t){const s=this.tinode.getTopic(e);s&&s.setMeta({tags:t}).catch((e=>{this.handleError(e.message,"err")}))}handleLogout(){(0,S.updateFavicon)(0),localStorage.removeItem("auth-token"),localStorage.removeItem("firebase-token"),localStorage.removeItem("settings"),this.state.firebaseToken&&this.fbPush.deleteToken(this.state.firebaseToken),this.tinode&&(this.tinode.onDisconnect=void 0,this.tinode.disconnect()),this.setState(this.getBlankState()),this.tinode=k.tnSetup(this.state.serverAddress,this.state.transport,this.props.intl.locale),this.tinode.onConnect=this.handleConnected,this.tinode.onDisconnect=this.handleDisconnect,E.default.navigateTo("")}handleDeleteAccount(){this.tinode.delCurrentUser(!0).then((e=>{this.handleLogout()}))}handleDeleteMessagesRequest(e){const t=this.tinode.getTopic(e);t&&t.delMessagesAll(!0).catch((e=>{this.handleError(e.message,"err")}))}handleLeaveUnsubRequest(e){const t=this.tinode.getTopic(e);t&&t.leave(!0).then((e=>{E.default.navigateTo(E.default.setUrlTopic(window.location.hash,""))})).catch((e=>{this.handleError(e.message,"err")}))}handleBlockTopicRequest(e){const t=this.tinode.getTopic(e);t&&t.updateMode(null,"-JP").then((e=>{E.default.navigateTo(E.default.setUrlTopic(window.location.hash,""))})).catch((e=>{this.handleError(e.message,"err")}))}handleReportTopic(e){const t=this.tinode.getTopic(e);t&&(this.tinode.publish(d().TOPIC_SYS,d().Drafty.attachJSON(null,{action:"report",target:e})),t.updateMode(null,"-JP").then((e=>{E.default.navigateTo(E.default.setUrlTopic(window.location.hash,""))})).catch((e=>{this.handleError(e.message,"err")})))}handleShowContextMenu(e,t){this.setState({contextMenuVisible:!0,contextMenuClickAt:{x:e.x,y:e.y},contextMenuParams:e,contextMenuItems:t||this.defaultTopicContextMenu(e.topicName),contextMenuBounds:o().findDOMNode(this).getBoundingClientRect()})}defaultTopicContextMenu(e){const t=this.tinode.getTopic(e);let s=!1,a=!1,i=!1,n=!1,o=!1,r=!1;if(t){n=t.isSubscribed(),r=t.isArchived();const e=t.getAccessMode();e&&(s=e.isMuted(),a=!e.isJoiner(),i=!e.isJoiner("want"),o=e.isDeleter())}return[n?{title:this.props.intl.formatMessage({id:"menu_item_info"}),handler:this.handleShowInfoView}:null,n?"messages_clear":null,n&&o?"messages_clear_hard":null,s?a?null:"topic_unmute":"topic_mute",i?"topic_unblock":"topic_block",r?null:"topic_archive","topic_delete"]}handleHideContextMenu(){this.setState({contextMenuVisible:!1,contextMenuClickAt:null,contextMenuParams:null,contextMenuBounds:null})}handleContextMenuAction(e,t,s){"topic_archive"==e&&t&&s.topicName&&s.topicName==this.state.topicSelected&&t.then((()=>{this.handleTopicSelected(null)}))}handleShowAlert(e,t,s,a,i,n){this.setState({alertVisible:!0,alertParams:{title:e,content:t,onConfirm:s,confirm:a,onReject:i,reject:n}})}handleShowInfoView(){E.default.navigateTo(E.default.addUrlParam(window.location.hash,"info",!0)),this.setState({showInfoPanel:!0})}handleHideInfoView(){E.default.navigateTo(E.default.removeUrlParam(window.location.hash,"info")),this.setState({showInfoPanel:!1})}handleMemberUpdateRequest(e,t,s){if(!e)return;const a=this.tinode.getTopic(e);a&&(t&&t.length>0&&t.map((e=>{a.invite(e,null).catch((e=>{this.handleError(e.message,"err")}))})),s&&s.length>0&&s.map((e=>{a.delSubscription(e).catch((e=>{this.handleError(e.message,"err")}))})))}handleValidateCredentialsRequest(e,t){if(this.tinode.isAuthenticated()){this.tinode.getMeTopic().setMeta({cred:{meth:e,resp:t}}).then((()=>{E.default.navigateTo("")})).catch((e=>{this.handleError(e.message,"err")}))}else this.setState({credMethod:e,credCode:t}),this.doLogin(null,null,{meth:e,resp:t})}handlePasswordResetRequest(e,t){this.tinode.connect().then((()=>this.tinode.requestResetAuthSecret("basic",e,t))).catch((e=>{this.handleError(e.message,"err")}))}handleResetPassword(e,t,s){(s=(0,b.base64ReEncode)(s))?this.tinode.connect().then((()=>this.tinode.updateAccountBasic(null,null,t,{token:s}))).catch((e=>{this.handleError(e.message,"err")})):this.handleError(this.props.intl.formatMessage({id:"invalid_security_token"}),"err")}render(){return i().createElement("div",{id:"app-container"},this.state.contextMenuVisible?i().createElement(p.default,{tinode:this.tinode,bounds:this.state.contextMenuBounds,clickAt:this.state.contextMenuClickAt,params:this.state.contextMenuParams,items:this.state.contextMenuItems,hide:this.handleHideContextMenu,onShowAlert:this.handleShowAlert,onAction:this.handleContextMenuAction,onTopicRemoved:e=>{e==this.state.topicSelected&&this.handleTopicSelected(null)},onError:this.handleError}):null,i().createElement(h.default,{visible:this.state.alertVisible,title:this.state.alertParams.title,content:this.state.alertParams.content,onReject:this.state.alertParams.onReject?()=>{this.setState({alertVisible:!1})}:null,reject:this.state.alertParams.reject,onConfirm:()=>{this.setState({alertVisible:!1}),this.state.alertParams.onConfirm()},confirm:this.state.alertParams.confirm}),i().createElement(g.default,{tinode:this.tinode,connected:this.state.connected,displayMobile:this.state.displayMobile,hideSelf:this.state.displayMobile&&"sidepanel"!==this.state.mobilePanel,state:this.state.sidePanelSelected,title:this.state.sidePanelTitle,avatar:this.state.sidePanelAvatar,login:this.state.login,myUserId:this.state.myUserId,loginDisabled:this.state.loginDisabled,loadSpinnerVisible:this.state.loadSpinnerVisible,errorText:this.state.errorText,errorLevel:this.state.errorLevel,errorAction:this.state.errorAction,errorActionText:this.state.errorActionText,topicSelected:this.state.topicSelected,chatList:this.state.chatList,credMethod:this.state.credMethod,credCode:this.state.credCode,transport:this.state.transport,messageSounds:this.state.messageSounds,desktopAlerts:this.state.desktopAlerts,desktopAlertsEnabled:this.state.desktopAlertsEnabled,incognitoMode:this.state.incognitoMode,serverAddress:this.state.serverAddress,serverVersion:this.state.serverVersion,onGlobalSettings:this.handleGlobalSettings,onSignUp:this.handleNewAccount,onSettings:this.handleSettings,onBasicNavigate:this.basicNavigator,onLoginRequest:this.handleLoginRequest,onCreateAccount:this.handleNewAccountRequest,onUpdateAccount:this.handleUpdateAccountRequest,onUpdateAccountTags:this.handleUpdateAccountTagsRequest,onTogglePushNotifications:this.togglePushToken,onToggleMessageSounds:this.handleToggleMessageSounds,onToggleIncognitoMode:this.handleToggleIncognitoMode,onCredAdd:this.handleCredAdd,onCredDelete:this.handleCredDelete,onCredConfirm:this.handleCredConfirm,onTopicSelected:this.handleTopicSelected,onCreateTopic:this.handleStartTopicRequest,onLogout:this.handleLogout,onDeleteAccount:this.handleDeleteAccount,onShowAlert:this.handleShowAlert,onCancel:this.handleSidepanelCancel,onError:this.handleError,onValidateCredentials:this.handleValidateCredentialsRequest,onPasswordResetRequest:this.handlePasswordResetRequest,onResetPassword:this.handleResetPassword,onShowArchive:this.handleShowArchive,onShowBlocked:this.handleShowBlocked,onInitFind:this.tnInitFind,searchResults:this.state.searchResults,onSearchContacts:this.handleSearchContacts,showContextMenu:this.handleShowContextMenu}),i().createElement(u.default,{tinode:this.tinode,connected:this.state.connected,ready:this.state.ready,online:this.state.topicSelectedOnline,acs:this.state.topicSelectedAcs,displayMobile:this.state.displayMobile,viewportWidth:this.state.viewportWidth,viewportHeight:this.state.viewportHeight,hideSelf:this.state.displayMobile&&("topic-view"!==this.state.mobilePanel||this.state.showInfoPanel),topic:this.state.topicSelected,myUserId:this.state.myUserId,serverVersion:this.state.serverVersion,serverAddress:this.state.serverAddress,applicationVisible:this.state.applicationVisible,errorText:this.state.errorText,errorLevel:this.state.errorLevel,errorAction:this.state.errorAction,errorActionText:this.state.errorActionText,newTopicParams:this.state.newTopicParams,onHideMessagesView:this.handleHideMessagesView,onData:this.tnData,onError:this.handleError,onNewTopicCreated:this.handleNewTopicCreated,showContextMenu:this.handleShowContextMenu,onChangePermissions:this.handleChangePermissions,onNewChat:this.handleNewChatInvitation,sendMessage:this.handleSendMessage}),this.state.showInfoPanel?i().createElement(m.default,{tinode:this.tinode,connected:this.state.connected,displayMobile:this.state.displayMobile,topic:this.state.topicSelected,searchableContacts:this.state.searchableContacts,myUserId:this.state.myUserId,errorText:this.state.errorText,errorLevel:this.state.errorLevel,errorAction:this.state.errorAction,errorActionText:this.state.errorActionText,onTopicDescUpdate:this.handleTopicUpdateRequest,onCancel:this.handleHideInfoView,onShowAlert:this.handleShowAlert,onChangePermissions:this.handleChangePermissions,onMemberUpdateRequest:this.handleMemberUpdateRequest,onDeleteMessages:this.handleDeleteMessagesRequest,onLeaveTopic:this.handleLeaveUnsubRequest,onBlockTopic:this.handleBlockTopicRequest,onReportTopic:this.handleReportTopic,onAddMember:this.handleManageGroupMembers,onTopicTagsUpdate:this.handleTagsUpdated,onInitFind:this.tnInitFind,onError:this.handleError,showContextMenu:this.handleShowContextMenu}):null)}}t.default=(0,r.injectIntl)(k)},"./src/views/validation-view.jsx":function(e,t,s){s.r(t);var a=s("react"),i=s.n(a),n=s("react-intl");const o=(0,n.defineMessages)({phone:{id:"phone_dative",defaultMessage:"phone",description:"Dative case of 'phone', i.e. 'phone' in 'by phone'"},email:{id:"email_dative",defaultMessage:"email",description:"Dative case of 'email', i.e. 'email' in 'by email'"}});class r extends i().PureComponent{constructor(e){super(e),this.state={code:e.credCode||""},this.handleChange=this.handleChange.bind(this),this.handleKeyPress=this.handleKeyPress.bind(this),this.handleSubmit=this.handleSubmit.bind(this),this.handleCancel=this.handleCancel.bind(this)}handleChange(e){this.setState({code:e.target.value})}handleKeyPress(e){"Enter"===e.key?this.handleSubmit(e):"Escape"==e.key&&this.handleCancel(e)}handleSubmit(e){e.preventDefault(),this.state.code&&this.state.code.trim()&&this.props.onSubmit(this.props.credMethod,this.state.code.trim())}handleCancel(e){e.preventDefault(),this.props.onCancel()}render(){const{formatMessage:e}=this.props.intl;let t={email:e(o.email),tel:e(o.phone)}[this.props.credMethod]||this.props.credMethod;return i().createElement("div",{className:"panel-form"},i().createElement("div",{className:"panel-form-row"},i().createElement("label",{className:"small",htmlFor:"enter-confirmation-code"},i().createElement(n.FormattedMessage,{id:"enter_confirmation_code_prompt",defaultMessage:"Enter confirmation code sent to you by {method}:",description:"Request to enter confirmation code",values:{method:t}}))),i().createElement("div",{className:"panel-form-row"},i().createElement(n.FormattedMessage,{id:"numeric_confirmation_code_prompt",defaultMessage:"Numbers only",description:"Prompt for numeric conformation code"},(e=>i().createElement("input",{type:"text",id:"enter-confirmation-code",placeholder:e,value:this.state.code,onChange:this.handleChange,onKeyPress:this.handleKeyPress,required:!0})))),i().createElement("div",{className:"dialog-buttons"},i().createElement("button",{className:"blue",onClick:this.handleSubmit},i().createElement(n.FormattedMessage,{id:"button_confirm",defaultMessage:"Confirm",description:"Button [Confirm]"})),i().createElement("button",{className:"white",onClick:this.handleCancel},i().createElement(n.FormattedMessage,{id:"button_cancel"}))))}}t.default=(0,n.injectIntl)(r)},"./src/widgets/alert.jsx":function(e,t,s){s.r(t),s.d(t,{default:function(){return o}});var a=s("react"),i=s.n(a),n=s("react-intl");class o extends i().PureComponent{render(){return this.props.visible?i().createElement("div",{className:"alert-container"},i().createElement("div",{className:"alert"},i().createElement("div",{className:"title"},this.props.title),i().createElement("div",{className:"content"},this.props.content),i().createElement("div",{className:"dialog-buttons"},this.props.onReject?i().createElement("button",{className:"outline",onClick:this.props.onReject},this.props.reject||i().createElement(n.FormattedMessage,{id:"button_cancel"})):null,i().createElement("button",{className:"blue",onClick:this.props.onConfirm},this.props.confirm||i().createElement(n.FormattedMessage,{id:"button_ok"}))))):null}}},"./src/widgets/attachment.jsx":function(e,t,s){s.r(t),s.d(t,{default:function(){return c}});var a=s("react"),i=s.n(a),n=s("react-intl"),o=s("./src/widgets/file-progress.jsx"),r=s("./src/lib/strformat.js"),l=s("./src/lib/utils.js");class c extends i().Component{constructor(e){super(e),this.state={downloader:null,progress:0},this.downloadFile=this.downloadFile.bind(this),this.handleCancel=this.handleCancel.bind(this)}downloadFile(e,t,s){if(!e)return void this.props.onError("Invalid download URL '"+e+"'");const a=this.props.tinode.getLargeFileHelper();this.setState({downloader:a}),a.download(e,t,s,(e=>{this.setState({progress:e/this.props.size})}),(e=>{this.props.onError(e,"err")})).then((()=>{this.setState({downloader:null,progress:0})})).catch((e=>{e&&this.props.onError("Error downloading file: "+e.message,"err"),this.setState({downloader:null,progress:0})}))}handleCancel(){this.props.uploading?this.props.onCancelUpload():this.state.downloader&&this.state.downloader.cancel()}render(){let e=this.props.filename||"file_attachment";e.length>36&&(e=e.substr(0,16)+"..."+e.substr(-16));let t,s,a=this.props.size>0?i().createElement("span",{className:"small gray"},"(",(0,r.bytesToHumanSize)(this.props.size),")"):null;this.props.uploading||this.state.downloader||!(0,l.isUrlRelative)(this.props.downloadUrl)?(t=(0,l.sanitizeUrl)(this.props.downloadUrl),s=null):(t="#",s=e=>{e.preventDefault(),this.downloadFile(this.props.downloadUrl,this.props.filename,this.props.mimetype)});const c=i().createElement(i().Fragment,null,i().createElement("i",{className:"material-icons"},"file_download")," ",i().createElement(n.FormattedMessage,{id:"save_attachment",defaultMessage:"save",description:"Call to save an attachment"}));return i().createElement("div",{className:"attachment"},i().createElement("div",null,i().createElement("i",{className:"material-icons big gray"},"insert_drive_file")),i().createElement("div",{className:"flex-column"},i().createElement("div",null,e," ",a),this.props.uploading||this.state.downloader?i().createElement(o.default,{progress:this.props.uploading?this.props.progress:this.state.progress,onCancel:this.handleCancel}):i().createElement("div",null,t?i().createElement("a",{href:t,download:this.props.filename,onClick:s},c):i().createElement("span",{className:"light-gray"},c))))}}},"./src/widgets/avatar-upload.jsx":function(e,t,s){s.r(t),s.d(t,{default:function(){return l}});var a=s("react"),i=s.n(a),n=s("./src/widgets/letter-tile.jsx"),o=s("./src/config.js"),r=s("./src/lib/blob-helpers.js");class l extends i().Component{constructor(e){super(e),this.state={dataUrl:e.avatar},this.handleFileUpload=this.handleFileUpload.bind(this)}componentDidUpdate(e){this.props.avatar!=e.avatar&&this.setState({dataUrl:this.props.avatar})}handleFileUpload(e){(0,r.imageScaled)(e.target.files[0],o.AVATAR_SIZE,o.AVATAR_SIZE,o.MAX_EXTERN_ATTACHMENT_SIZE,!0,((e,t)=>{(0,r.blobToBase64)(t,((t,s)=>{const a=(0,r.makeImageUrl)({data:s,type:e});this.setState({dataUrl:a}),this.props.onImageChanged(a)}))}),(e=>{this.props.onError(e,"err")})),e.target.value=""}render(){const e="file-input-avatar-"+(Math.random()+"").substr(2),t="avatar-upload"+(this.props.readOnly?" read-only":"");return i().createElement("div",{className:t},this.props.readOnly||!this.state.dataUrl?null:i().createElement("a",{href:"#",className:"clear-avatar",onClick:e=>{e.preventDefault(),this.props.onImageChanged(null)}},i().createElement("i",{className:"material-icons"},"clear")),this.state.dataUrl?i().createElement("img",{src:this.state.dataUrl,className:"preview"}):this.props.readOnly&&this.props.uid?i().createElement("div",{className:"avatar-box"},i().createElement(n.default,{avatar:!0,topic:this.props.uid,title:this.props.title})):i().createElement("div",{className:"blank"},o.AVATAR_SIZE,"×",o.AVATAR_SIZE),this.props.readOnly?null:i().createElement("input",{type:"file",id:e,className:"inputfile hidden",accept:"image/*",onChange:this.handleFileUpload}),this.props.readOnly?null:i().createElement("label",{htmlFor:e,className:"round"},i().createElement("i",{className:"material-icons"},"file_upload")))}}},"./src/widgets/button-back.jsx":function(e,t,s){s.r(t),s.d(t,{default:function(){return n}});var a=s("react"),i=s.n(a);class n extends i().PureComponent{render(){return i().createElement("a",{href:"#",onClick:e=>{e.preventDefault(),this.props.onBack()}},i().createElement("i",{className:"material-icons"},"arrow_back"))}}},"./src/widgets/chat-message.jsx":function(e,t,s){s.r(t),s.d(t,{default:function(){return u}});var a=s("react"),i=s.n(a),n=s("react-intl"),o=s("tinode-sdk"),r=s("./src/widgets/attachment.jsx"),l=s("./src/widgets/letter-tile.jsx"),c=s("./src/widgets/received-marker.jsx"),d=s("./src/widgets/uploading-image.jsx"),h=s("./src/lib/utils.js"),p=s("./src/config.js"),m=s("./src/lib/blob-helpers.js");class u extends i().Component{constructor(e){super(e),this.state={progress:0},e.uploader&&(e.uploader.onProgress=this.handleProgress.bind(this)),this.handleImagePreview=this.handleImagePreview.bind(this),this.handleFormButtonClick=this.handleFormButtonClick.bind(this),this.handleContextClick=this.handleContextClick.bind(this),this.handleCancelUpload=this.handleCancelUpload.bind(this)}handleImagePreview(e){e.preventDefault(),this.props.onImagePreview({url:e.target.src,filename:e.target.title,width:e.target.dataset.width,height:e.target.dataset.height,size:e.target.dataset.size,type:e.target.dataset.mime})}handleFormButtonClick(e){e.preventDefault();const t={seq:this.props.seq,resp:{}};e.target.dataset.name&&(t.resp[e.target.dataset.name]=e.target.dataset.val?e.target.dataset.val:void 0===e.target.dataset.val?1:""+e.target.dataset.val),"url"==e.target.dataset.act&&(t.ref=(0,h.sanitizeUrl)(e.target.dataset.ref)||"about:blank");const s=e.target.dataset.title||"unknown";this.props.onFormResponse(e.target.dataset.act,s,t)}handleContextClick(e){e.preventDefault(),e.stopPropagation();const t=this.props.received==Tinode.MESSAGE_STATUS_FAILED?["menu_item_send_retry"]:[];this.props.showContextMenu({seq:this.props.seq,content:this.props.content,y:e.pageY,x:e.pageX},t)}handleProgress(e){this.setState({progress:e})}handleCancelUpload(){this.props.onCancelUpload(this.props.seq,this.props.uploader)}render(){const e=this.props.deleted?"center":this.props.sequence+" "+(this.props.response?"left":"right"),t="single"==this.props.sequence||"last"==this.props.sequence?"bubble tip":"bubble",s=this.props.deleted?null:this.props.userAvatar||!0,a=this.props.userFrom&&this.props.response&&("single"==this.props.sequence||"last"==this.props.sequence);let d=this.props.content;const h=[];return this.props.mimeType==o.Drafty.getContentType()&&o.Drafty.isValid(d)?(o.Drafty.attachments(d,(function(e,t){"application/json"!=e.mime&&h.push(i().createElement(r.default,{tinode:this.props.tinode,downloadUrl:o.Drafty.getDownloadUrl(e),filename:e.name,uploading:o.Drafty.isProcessing(e),mimetype:e.mime,size:o.Drafty.getEntitySize(e),progress:this.state.progress,onCancelUpload:this.handleCancelUpload,onError:this.props.onError,key:t}))}),this),d=i().createElement(i().Fragment,null,o.Drafty.format(d,g,this))):this.props.deleted?d=i().createElement(i().Fragment,null,i().createElement("i",{className:"material-icons gray"},"block")," ",i().createElement("i",{className:"gray"},i().createElement(n.FormattedMessage,{id:"deleted_content",defaultMessage:"content deleted",description:"Shown when messages are deleted"}))):"string"!=typeof d&&(d=i().createElement(i().Fragment,null,i().createElement("i",{className:"material-icons gray"},"error_outline")," ",i().createElement("i",{className:"gray"},i().createElement(n.FormattedMessage,{id:"invalid_content",defaultMessage:"invalid content",description:"Shown when message is unreadable"})))),i().createElement("li",{className:e},this.props.userFrom&&this.props.response?i().createElement("div",{className:"avatar-box"},a?i().createElement(l.default,{topic:this.props.userFrom,title:this.props.userName,avatar:s}):null):null,i().createElement("div",null,i().createElement("div",{className:t},i().createElement("div",{className:"message-content"},d,h,this.props.timestamp?i().createElement(c.default,{timestamp:this.props.timestamp,received:this.props.received}):null),this.props.deleted||!this.props.showContextMenu?null:i().createElement("span",{className:"menuTrigger"},i().createElement("a",{href:"#",onClick:this.handleContextClick},i().createElement("i",{className:"material-icons"},"expand_more")))),a?i().createElement("div",{className:"author"},i().createElement(n.FormattedMessage,{id:"user_not_found",defaultMessage:"Not found",description:"In place of a user's full name when the user is not found."},(e=>this.props.userName||i().createElement("i",null,e)))):null))}}function g(e,t,s,a){let n=o.Drafty.tagName(e);if(n){const r=o.Drafty.attrValue(e,t)||{};switch(r.key=a,e){case"IM":if(t){r.className="inline-image";const e=(0,m.fitImageSize)(t.width,t.height,Math.min(this.props.viewportWidth-4*p.REM_SIZE,36*p.REM_SIZE),24*p.REM_SIZE,!1)||{dstWidth:p.BROKEN_IMAGE_SIZE,dstHeight:p.BROKEN_IMAGE_SIZE};r.style={width:e.dstWidth+"px",height:e.dstHeight+"px"},o.Drafty.isProcessing(t)?n=d.default:(r.src=this.props.tinode.authorizeURL((0,h.sanitizeImageUrl)(r.src)),r.alt=t.name,r.src?(r.onClick=this.handleImagePreview,r.className+=" image-clickable"):r.src="img/broken_image.png")}break;case"BN":r.onClick=this.handleFormButtonClick;let e=i().Children.map(s,(e=>"string"==typeof e?e:void 0));e&&0!=e.length||(e=[r.name]),r["data-title"]=e.join("");break;case"FM":r.className="bot-form"}return i().createElement(n,r,s)}return s}},"./src/widgets/checkbox.jsx":function(e,t,s){s.r(t),s.d(t,{default:function(){return n}});var a=s("react"),i=s.n(a);class n extends i().PureComponent{constructor(e){super(e),this.handleChange=this.handleChange.bind(this)}handleChange(){this.props.onChange(this.props.name,!this.props.checked)}render(){return this.props.onChange?this.props.checked?i().createElement("i",{className:"material-icons blue clickable",onClick:this.handleChange},"check_box"):i().createElement("i",{className:"material-icons blue clickable",onClick:this.handleChange},"check_box_outline_blank"):this.props.checked?i().createElement("i",{className:"material-icons"},"check_box"):i().createElement("i",{className:"material-icons"},"check_box_outline_blank")}}},"./src/widgets/chip-input.jsx":function(e,t,s){s.r(t),s.d(t,{default:function(){return r}});var a=s("react"),i=s.n(a),n=s("./src/widgets/chip.jsx"),o=s("./src/lib/blob-helpers.js");class r extends i().Component{constructor(e){super(e),this.state=r.deriveStateFromProps(e),this.state.input="",this.state.focused=!1,this.handleTextInput=this.handleTextInput.bind(this),this.removeChipAt=this.removeChipAt.bind(this),this.handleChipCancel=this.handleChipCancel.bind(this),this.handleFocusGained=this.handleFocusGained.bind(this),this.handleFocusLost=this.handleFocusLost.bind(this),this.handleKeyDown=this.handleKeyDown.bind(this)}static deriveStateFromProps(e){return{placeholder:e.chips?"":e.prompt,sortedChips:r.sortChips(e.chips,e.staticMembers),chipIndex:r.indexChips(e.chips)}}componentDidUpdate(e,t){e.chips==this.props.chips&&e.staticMembers==this.props.staticMembers&&e.prompt==this.props.prompt||this.setState(r.deriveStateFromProps(this.props)),(!t||this.props.chips.length>t.sortedChips.length)&&this.setState({input:""})}static indexChips(e){const t={};let s=0;return e.map((e=>{t[e.user]=s,s++})),t}static sortChips(e,t){const s=[],a=[];return e.map((e=>{t&&t.includes(e.user)?s.push(e):a.push(e)})),s.concat(a)}handleTextInput(e){this.setState({input:e.target.value}),this.props.filterFunc&&this.props.filterFunc(e.target.value)}removeChipAt(e){const t=this.state.sortedChips[e];this.props.onChipRemoved(t.user,this.state.chipIndex[t.user])}handleChipCancel(e,t){this.removeChipAt(t)}handleFocusGained(){this.setState({focused:!0})}handleFocusLost(){this.setState({focused:!1}),this.props.onFocusLost&&this.props.onFocusLost(this.state.input)}handleKeyDown(e){if("Backspace"===e.key){if(0==this.state.input.length&&this.state.sortedChips.length>0){const e=this.state.sortedChips.length-1;this.state.sortedChips[e].user!==this.props.staticMembers&&this.removeChipAt(e)}}else"Enter"===e.key?this.props.onEnter&&this.props.onEnter(this.state.input):"Escape"===e.key&&this.props.onCancel&&this.props.onCancel()}render(){const e=[];let t=0;const s=this.props.staticMembers||[];this.state.sortedChips.map((a=>{e.push(i().createElement(n.default,{onCancel:this.handleChipCancel,avatar:(0,o.makeImageUrl)(a.public?a.public.photo:null),title:a.public?a.public.fn:void 0,noAvatar:this.props.avatarDisabled,topic:a.user,required:s.includes(a.user),invalid:a.invalid,index:t,key:a.user})),t++}));const a="chip-input"+(this.state.focused?" focused":"");return i().createElement("div",{className:a},e,i().createElement("input",{type:"text",placeholder:this.state.placeholder,onChange:this.handleTextInput,onFocus:this.handleFocusGained,onBlur:this.handleFocusLost,onKeyDown:this.handleKeyDown,value:this.state.input,autoFocus:!0}))}}},"./src/widgets/chip.jsx":function(e,t,s){s.r(t),s.d(t,{default:function(){return o}});var a=s("react"),i=s.n(a),n=s("./src/widgets/letter-tile.jsx");class o extends i().PureComponent{constructor(e){super(e),this.handleCancel=this.handleCancel.bind(this)}handleCancel(e){e.preventDefault(),this.props.onCancel(this.props.topic,this.props.index)}render(){const e=this.props.title||this.props.topic,t=this.props.invalid?"chip invalid":"chip";return i().createElement("div",{className:t},this.props.noAvatar?i().createElement("span",{className:"spacer"}):i().createElement("div",{className:"avatar-box"},i().createElement(n.default,{avatar:this.props.avatar||!0,topic:this.props.topic,title:this.props.title})),i().createElement("span",null,e),this.props.onCancel&&!this.props.required?i().createElement("a",{href:"#",onClick:this.handleCancel},"×"):i().createElement("span",{className:"spacer"}))}}},"./src/widgets/contact-action.jsx":function(e,t,s){s.r(t);var a=s("react"),i=s.n(a),n=s("react-intl");class o extends i().PureComponent{constructor(e){super(e),this.handleClick=this.handleClick.bind(this)}handleClick(e){e.preventDefault(),e.stopPropagation(),this.props.onAction(this.props.action)}render(){const{formatMessage:e}=this.props.intl;return i().createElement("li",{onClick:this.handleClick,className:"action"},i().createElement("div",{className:"action-text"},e(this.props.title,this.props.values)))}}t.default=(0,n.injectIntl)(o)},"./src/widgets/contact-badges.jsx":function(e,t,s){s.r(t),s.d(t,{default:function(){return o}});var a=s("react"),i=s.n(a);const n={muted:"notifications_off",banned:"block"};class o extends i().PureComponent{render(){let e=null;return this.props.badges&&this.props.badges.length>0?(e=[],this.props.badges.map((function(t){if(t.icon)e.push(i().createElement("i",{className:"material-icons as-badge",key:t.key||t.icon},n[t.icon]));else{const s="badge"+(t.color?" "+t.color:"");e.push(i().createElement("span",{className:s,key:t.key||t.name},t.name))}})),i().createElement(i().Fragment,null,e)):null}}},"./src/widgets/contact-list.jsx":function(e,t,s){s.r(t);var a=s("react"),i=s.n(a),n=s("react-intl"),o=s("tinode-sdk"),r=s.n(o),l=s("./src/widgets/contact.jsx"),c=s("./src/widgets/contact-action.jsx"),d=s("./src/lib/blob-helpers.js");const h=(0,n.defineMessages)({badge_you:{id:"badge_you",defaultMessage:"you",description:"Badge for indicating the current user"},badge_owner:{id:"badge_owner",defaultMessage:"owner",description:"Badge for indicating the owner"}});class p extends i().Component{render(){const{formatMessage:e}=this.props.intl,t=Array.isArray(this.props.topicSelected),s=[];let a=0;return this.props.contacts&&this.props.contacts.length>0&&this.props.contacts.map((n=>{if(n.action)s.push(i().createElement(c.default,{title:n.title,action:n.action,values:n.values,key:n.action,onAction:this.props.onAction}));else{const o=this.props.showMode?n.user:n.topic||n.user;if(this.props.filterFunc&&this.props.filter){let e=[o];if(n.private&&n.private.comment&&e.push((""+n.private.comment).toLowerCase()),n.public&&n.public.fn&&e.push((""+n.public.fn).toLowerCase()),!this.props.filterFunc(this.props.filter,e))return}const c=r().isChannelTopicName(o),p=t?this.props.topicSelected.indexOf(o)>-1:this.props.topicSelected===o,m=[];this.props.showMode&&(o==this.props.myUserId&&m.push({name:e(h.badge_you),color:"green"}),n.acs&&n.acs.isOwner()&&m.push({name:e(h.badge_owner),color:"blue"}));const u=Array.isArray(n.private)?n.private.join(","):n.private?n.private.comment:null;s.push(i().createElement(l.default,{title:n.public?n.public.fn:null,avatar:(0,d.makeImageUrl)(n.public?n.public.photo:null),comment:u,unread:this.props.showUnread?n.unread:0,now:n.online&&this.props.connected,acs:n.acs,showMode:this.props.showMode,badges:m,showCheckmark:t,selected:p,showOnline:this.props.showOnline&&!c,isChannel:c,onSelected:this.props.onTopicSelected,showContextMenu:this.props.showContextMenu,item:o,index:s.length,key:o})),a++}}),this),i().createElement("div",{className:this.props.noScroll?null:"scrollable-panel"},0==a?i().createElement("div",{className:"center-medium-text",dangerouslySetInnerHTML:{__html:this.props.emptyListMessage}}):null,s.length>0?i().createElement("ul",{className:"contact-box"},s):null)}}t.default=(0,n.injectIntl)(p)},"./src/widgets/contact.jsx":function(e,t,s){s.r(t),s.d(t,{default:function(){return c}});var a=s("react"),i=s.n(a),n=s("react-intl"),o=s("./src/widgets/letter-tile.jsx"),r=s("./src/widgets/contact-badges.jsx"),l=s("./src/widgets/unread-badge.jsx");class c extends i().Component{constructor(e){super(e),this.handleClick=this.handleClick.bind(this),this.handleContextClick=this.handleContextClick.bind(this)}handleClick(e){e.preventDefault(),e.stopPropagation(),this.props.onSelected&&this.props.onSelected(this.props.item,this.props.index)}handleContextClick(e){e.preventDefault(),e.stopPropagation(),this.props.showContextMenu({topicName:this.props.item,y:e.pageY,x:e.pageX})}render(){let e=this.props.title;e?e.length>30&&(e=e.substring(0,28)+"..."):e=i().createElement("i",null,i().createElement(n.FormattedMessage,{id:"unnamed_topic"}));const t=this.props.now?"online":"offline",s=!this.props.avatar||this.props.avatar,a=this.props.badges?this.props.badges.slice():[],c=[];return this.props.acs&&(this.props.showMode&&a.push({name:this.props.acs.getMode(),key:"mode"}),this.props.acs.isMuted()&&c.push({icon:"muted"}),this.props.acs.isJoiner()||c.push({icon:"banned"})),i().createElement("li",{className:!this.props.showCheckmark&&this.props.selected?"selected":null,onClick:this.handleClick},i().createElement("div",{className:"avatar-box"},i().createElement(o.default,{avatar:s,title:this.props.title,topic:this.props.item}),this.props.showOnline?i().createElement("span",{className:t}):this.props.showCheckmark&&this.props.selected?i().createElement("i",{className:"checkmark material-icons"},"check_circle"):null),i().createElement("div",{className:"text-box"},i().createElement("div",null,i().createElement("span",{className:"contact-title"},e),this.props.isChannel?i().createElement("img",{src:"/img/channel.png",className:"channel",alt:"channel"}):null,i().createElement(l.default,{count:this.props.unread}),i().createElement(r.default,{badges:c})),this.props.comment?i().createElement("div",{className:"contact-comment"},this.props.comment):null,i().createElement("span",null,i().createElement(r.default,{badges:a}))),this.props.showContextMenu?i().createElement("span",{className:"menuTrigger"},i().createElement("a",{href:"#",onClick:this.handleContextClick},i().createElement("i",{className:"material-icons"},"expand_more"))):null)}}},"./src/widgets/context-menu.jsx":function(e,t,s){s.r(t);var a=s("react"),i=s.n(a),n=s("react-dom"),o=s.n(n),r=s("react-intl"),l=s("./src/config.js");s("./src/lib/navigation.js");const c=(0,r.defineMessages)({info:{id:"menu_item_info",defaultMessage:"Info",description:"Show extended topic information"},clear_messages:{id:"menu_item_clear_messages",defaultMessage:"Clear messages",description:"Delete all messages"},clear_for_all:{id:"menu_item_clear_messages_for_all",defaultMessage:"Clear for All",description:"Delete all message(s) for all members"},delete:{id:"menu_item_delete",defaultMessage:"Delete",description:"Delete selected messages"},delete_for_all:{id:"menu_item_delete_for_all",defaultMessage:"Delete for All",description:"Delete selected message(s) for all members"},send_retry:{id:"menu_item_send_retry",defaultMessage:"Retry",description:"Retry sending message"},mute:{id:"menu_item_mute",defaultMessage:"Mute",description:"Turn off notifications"},unmute:{id:"menu_item_unmute",defaultMessage:"Unmute",description:"Turn notifications on"},topic_delete:{id:"menu_item_delete_topic",defaultMessage:"Delete",description:"Delete entire topic"},topic_delete_warning:{id:"topic_delete_warning",defaultMessage:"Are you sure you want to delete this conversation?",description:"Alert warning when deleting entire topic"},unblock:{id:"menu_item_unblock",defaultMessage:"Unblock",description:"Unblock topic or user"},block:{id:"menu_item_block",defaultMessage:"Block",description:"Block topic or user"},topic_block_warning:{id:"topic_block_warning",defaultMessage:"Are you sure you want to block this conversation?",description:"Alert warning when blocking a topic."},member_delete:{id:"menu_item_member_delete",defaultMessage:"Remove",description:"Remove user from topic"},archive:{id:"menu_item_archive_topic",defaultMessage:"Archive",description:"Move topic from the list of active chats to archive"}});class d extends i().Component{constructor(e){super(e);const{formatMessage:t}=e.intl;this.handlePageClick=this.handlePageClick.bind(this),this.handleEscapeKey=this.handleEscapeKey.bind(this),this.handleClick=this.handleClick.bind(this),this.MenuItems={topic_info:{id:"topic_info",title:t(c.info),handler:null},messages_clear:{id:"messages_clear",title:t(c.clear_messages),handler:(s,a)=>e.onShowAlert(t({id:"menu_item_clear_messages"}),t({id:"clear_messages_warning"}),(()=>{this.deleteMessages(!0,!1,s,a)}),null,!0,null)},messages_clear_hard:{id:"messages_clear_hard",title:t(c.clear_for_all),handler:(s,a)=>e.onShowAlert(t({id:"menu_item_clear_messages_for_all"}),t({id:"delete_messages_warning"}),(()=>this.deleteMessages(!0,!0,s,a)),null,!0,null)},message_delete:{id:"message_delete",title:t(c.delete),handler:(e,t)=>this.deleteMessages(!1,!1,e,t)},message_delete_hard:{id:"message_delete_hard",title:t(c.delete_for_all),handler:(e,t)=>this.deleteMessages(!1,!0,e,t)},menu_item_send_retry:{id:"menu_item_send_retry",title:t(c.send_retry),handler:(e,t)=>this.retryMessage(e,t)},topic_unmute:{id:"topic_unmute",title:t(c.unmute),handler:this.topicPermissionSetter.bind(this,"+P")},topic_mute:{id:"topic_mute",title:t(c.mute),handler:this.topicPermissionSetter.bind(this,"-P")},topic_unblock:{id:"topic_unblock",title:t(c.unblock),handler:this.topicPermissionSetter.bind(this,"+JP")},topic_block:{id:"topic_block",title:t(c.block),handler:(s,a)=>e.onShowAlert(t({id:"menu_item_block"}),t(c.topic_block_warning),(()=>this.topicPermissionSetter("-JP",s,a).then((e=>(this.props.onTopicRemoved(s.topicName),e)))),null,!0,null)},topic_delete:{id:"topic_delete",title:t(c.topic_delete),handler:(s,a)=>e.onShowAlert(t({id:"menu_item_delete_topic"}),t(c.topic_delete_warning),(()=>{const e=this.props.tinode.getTopic(s.topicName);if(e)return e.delTopic(!0).catch((e=>{a&&a(e.message,"err")}));console.log("Topic not found: ",s.topicName)}),null,!0,null)},topic_archive:{id:"topic_archive",title:t(c.archive),handler:(e,t)=>{const s=this.props.tinode.getTopic(e.topicName);if(s)return s.archive(!0).catch((e=>{t&&t(e.message,"err")}));console.log("Topic not found: ",e.topicName)}},permissions:{id:"permissions",title:t({id:"menu_item_edit_permissions"}),handler:null},member_delete:{id:"member_delete",title:t(c.member_delete),handler:(e,t)=>{const s=this.props.tinode.getTopic(e.topicName);if(s&&e.user)return s.delSubscription(e.user).catch((e=>{t&&t(e.message,"err")}));console.log("Topic or user not found: '"+e.topicName+"', '"+e.user+"'")}},member_mute:{id:"member_mute",title:t(c.mute),handler:this.topicPermissionSetter.bind(this,"-P")},member_unmute:{id:"member_unmute",title:t(c.unmute),handler:this.topicPermissionSetter.bind(this,"+P")},member_block:{id:"member_block",title:t(c.block),handler:this.topicPermissionSetter.bind(this,"-JP")},member_unblock:{id:"member_unblock",title:t(c.unblock),handler:this.topicPermissionSetter.bind(this,"+JP")}}}componentDidMount(){document.addEventListener("mousedown",this.handlePageClick,!1),document.addEventListener("keyup",this.handleEscapeKey,!1)}componentWillUnmount(){document.removeEventListener("mousedown",this.handlePageClick,!1),document.removeEventListener("keyup",this.handleEscapeKey,!1)}handlePageClick(e){o().findDOMNode(this).contains(e.target)||(e.preventDefault(),e.stopPropagation(),this.props.hide())}handleEscapeKey(e){27===e.keyCode&&this.props.hide()}handleClick(e){e.preventDefault(),e.stopPropagation(),this.props.hide();let t=this.props.items[e.currentTarget.dataset.id];"string"==typeof t&&(t=this.MenuItems[t]),t?this.props.onAction(t.id,t.handler(this.props.params,this.props.onError),this.props.params):console.log("Invalid menu item ID",e.currentTarget.dataset.id)}deleteMessages(e,t,s,a){const i=this.props.tinode.getTopic(s.topicName);if(!i)return void console.log("Topic not found: ",s.topicName);if(!e&&i.cancelSend(s.seq))return;return(e?i.delMessagesAll(t):i.delMessagesList([s.seq],t)).catch((e=>{a&&a(e.message,"err")}))}retryMessage(e,t){const s=this.props.tinode.getTopic(e.topicName);if(!s||!s.flushMessage(e.seq))return;const a=s.createMessage(e.content,!1);return s.publishDraft(a).catch((e=>{t&&t(e.message,"err")}))}topicPermissionSetter(e,t,s){const a=this.props.tinode.getTopic(t.topicName);if(!a)return void console.log("Topic not found",t.topicName);let i=a.updateMode(t.user,e);return s&&(i=i.catch((e=>{s(e.message,"err")}))),i}render(){let e=0,t=[];this.props.items.map((s=>{"string"==typeof s&&(s=this.MenuItems[s]),s&&s.title&&t.push("-"==s.title?i().createElement("li",{className:"separator",key:e}):i().createElement("li",{onClick:this.handleClick,"data-id":e,key:e},s.title)),e++}));const s=12*l.REM_SIZE,a=l.REM_SIZE*(.7+2.5*t.length),n={left:(this.props.bounds.right-this.props.clickAt.x{e.preventDefault(),this.props.onClose()}},i().createElement("i",{className:"material-icons gray"},"close"))),i().createElement("div",{id:"image-preview-container"},i().createElement("div",{className:"flex-column narrow"},i().createElement("i",{className:"material-icons gray"},function(e){const t={default:"insert_drive_file",image:"image",text:"description",video:"theaters"};return t[e]||t[(e||"").split("/")[0]]||t.default}(this.props.content.type)),i().createElement("div",null,i().createElement("b",null,i().createElement(n.FormattedMessage,{id:"label_content_type"}))," ",this.props.content.type||"application/octet-stream"),i().createElement("div",null,i().createElement("b",null,i().createElement(n.FormattedMessage,{id:"label_size"}))," ",(0,r.bytesToHumanSize)(this.props.content.size)))),i().createElement(o.default,{noInput:!0,onSendMessage:this.handleSendDoc,onError:this.props.onError})):null}}},"./src/widgets/error-panel.jsx":function(e,t,s){s.r(t),s.d(t,{default:function(){return o}});var a=s("react"),i=s.n(a),n=s("./src/widgets/menu-cancel.jsx");class o extends i().PureComponent{constructor(e){super(e),this.state={show:!1},this.hide=this.hide.bind(this)}componentDidUpdate(e){e.level!==this.props.level&&this.setState({show:!!this.props.level})}hide(){this.setState({show:!1}),this.props.onClearError&&this.props.onClearError()}render(){const e={err:"error",warn:"warning",info:"info"}[this.props.level]||"",t="info-box "+e;return i().createElement("div",{className:t},i().createElement("div",{className:"icon"},i().createElement("i",{className:"material-icons"},e)),i().createElement("span",null,this.props.text,this.props.action?i().createElement(i().Fragment,null,i().createElement("a",{href:"#",style:{whiteSpace:"nowrap"},onClick:e=>{e.preventDefault(),this.props.action()}},this.props.actionText)):null),i().createElement("div",{className:"cancel"},i().createElement(n.default,{onCancel:this.hide})))}}},"./src/widgets/file-progress.jsx":function(e,t,s){s.r(t),s.d(t,{default:function(){return o}});var a=s("react"),i=s.n(a),n=s("react-intl");class o extends i().PureComponent{render(){return i().createElement("div",{className:"uploader"},i().createElement("div",null,i().createElement("span",{style:{width:100*this.props.progress+"%"}})),this.props.progress<.999?i().createElement("a",{href:"#",onClick:e=>{e.preventDefault(),this.props.onCancel()}},i().createElement("i",{className:"material-icons"},"close")," ",i().createElement(n.FormattedMessage,{id:"action_cancel",defaultMessage:"cancel",description:"Call to action [cancel]"})):i().createElement(n.FormattedMessage,{id:"upload_finishing",defaultMessage:"finishing...",description:"Notification that upload is finishing"}))}}},"./src/widgets/group-manager.jsx":function(e,t,s){s.r(t);var a=s("react"),i=s.n(a),n=s("react-intl"),o=s("./src/widgets/chip-input.jsx"),r=s("./src/widgets/contact-list.jsx");const l=(0,n.defineMessages)({no_contacts:{id:"no_contacts",defaultMessage:"You have no contacts :-(",description:"Shown in ContactsView when the user has no contacts"},contacts_not_found_short:{id:"contacts_not_found_short",defaultMessage:"No contacts match ''{query}''",description:"Shown in ContactsView when search returned no results"}});class c extends i().Component{constructor(e){super(e),this.state={members:e.members,index:c.indexMembers(e.members),staticMembers:c.staticMembers(e.members,e.keepInitialMembers,e.requiredMember),contactFilter:"",noContactsMessage:e.intl.formatMessage(l.no_contacts),selectedContacts:c.selectedContacts(e.members)},this.handleContactSelected=this.handleContactSelected.bind(this),this.handleMemberRemoved=this.handleMemberRemoved.bind(this),this.handleContactFilter=this.handleContactFilter.bind(this),this.handleSubmit=this.handleSubmit.bind(this),this.handleCancel=this.handleCancel.bind(this)}static indexMembers(e){let t={};return e.map((e=>{t[e.user]={delta:0,present:!0}})),t}static staticMembers(e,t,s){let a=[];return e.map((e=>{(t||e.user==s)&&a.push(e.user)})),a}static selectedContacts(e){let t=[];return e.map((e=>{t.push(e.user)})),t}handleContactSelected(e,t){let s=this.state.index[e];if(s){if(s.present)return;s.delta+=1,s.present=!0}else s={delta:1,present:!0};let a=this.state.members.slice();a.push(this.props.contacts[t]);const i=c.selectedContacts(a),n=this.state.index;n[e]=s,this.setState({members:a,index:n,selectedContacts:i})}handleMemberRemoved(e,t){const s=this.state.index[e];if(!s||!s.present)return;s.present=!1,s.delta-=1;let a=this.state.members.slice();a.splice(t,1);const i=c.selectedContacts(a),n=this.state.index;n[e]=s,this.setState({members:a,index:n,selectedContacts:i})}handleContactFilter(e){const{formatMessage:t}=this.props.intl,s=e?t(l.contacts_not_found_short,{query:e}):t(l.no_contacts);this.setState({contactFilter:e,noContactsMessage:s})}static doContactFiltering(e,t){if(e){for(let s=0;s=0)return!0;return!1}return!0}handleSubmit(){var e=this,t=[],s=[],a=[];Object.keys(this.state.index).map((function(i){e.state.index[i].present&&t.push(i),e.state.index[i].delta>0?s.push(i):e.state.index[i].delta<0&&a.push(i)})),this.props.onSubmit(t,s,a)}handleCancel(){this.props.onCancel()}render(){const{formatMessage:e}=this.props.intl;return i().createElement("div",{id:"group-manager"},i().createElement("div",{className:"panel-form-row"},i().createElement("label",{className:"small"},i().createElement(n.FormattedMessage,{id:"title_group_members",defaultMessage:"Group Members",description:"Section title"}))),i().createElement("div",{className:"panel-form-row"},i().createElement(o.default,{chips:this.state.members,staticMembers:this.state.staticMembers,prompt:"add members",filterFunc:this.handleContactFilter,onChipRemoved:this.handleMemberRemoved})),i().createElement("div",{className:"panel-form-row"},i().createElement("label",{className:"small"},i().createElement(n.FormattedMessage,{id:"title_all_contacts",defaultMessage:"All Contacts",description:"Section title [All Contacts]"}))),i().createElement(r.default,{contacts:this.props.contacts,myUserId:this.props.myUserId,topicSelected:this.state.selectedContacts,filter:this.state.contactFilter,filterFunc:c.doContactFiltering,emptyListMessage:this.state.noContactsMessage,showOnline:!1,showUnread:!1,onTopicSelected:this.handleContactSelected}),i().createElement("div",{id:"group-manager-buttons",className:"panel-form-row"},i().createElement("button",{className:"blue",onClick:this.handleSubmit},i().createElement(n.FormattedMessage,{id:"button_ok",defaultMessage:"OK",description:"Button [OK]"})),i().createElement("button",{className:"white",onClick:this.handleCancel},i().createElement(n.FormattedMessage,{id:"button_cancel",defaultMessage:"Cancel",description:"Button [Cancel]"}))))}}t.default=(0,n.injectIntl)(c)},"./src/widgets/group-subs.jsx":function(e,t,s){s.r(t),s.d(t,{default:function(){return c}});var a=s("react"),i=s.n(a),n=s("react-intl"),o=s("./src/config.js"),r=s("./src/widgets/letter-tile.jsx"),l=s("./src/lib/blob-helpers.js");class c extends i().Component{constructor(e){super(e)}render(){const e=[],t=(this.props.subscribers||[]).length,s=Math.min(o.MAX_ONLINE_IN_TOPIC,t);return(this.props.subscribers||[]).some((t=>(e.push(i().createElement("div",{className:"avatar-box",key:t.user},i().createElement(r.default,{topic:t.user,avatar:(0,l.makeImageUrl)(t.public?t.public.photo:null)||!0,title:t.public?t.public.fn:null}))),e.length==s))),i().createElement("div",{id:"topic-users"},e," ",t>s?i().createElement("span",null,i().createElement(n.FormattedMessage,{id:"more_online_members",defaultMessage:"+{overflow} more",description:"Shown in MessagesView title bar when the number of online subscribers exceeds MAX_ONLINE_IN_TOPIC",values:{overflow:t-s}})):null)}}},"./src/widgets/host-selector.jsx":function(e,t,s){s.r(t),s.d(t,{default:function(){return o}});var a=s("react"),i=s.n(a),n=s("./src/config.js");class o extends i().PureComponent{constructor(e){super(e),this.state={hostName:e.serverAddress,changed:!1},this.handleHostNameChange=this.handleHostNameChange.bind(this),this.handleEditingFinished=this.handleEditingFinished.bind(this)}handleHostNameChange(e){this.setState({hostName:e.target.value,changed:!0})}handleEditingFinished(){this.state.changed&&(this.setState({changed:!1}),this.props.onServerAddressChange(this.state.hostName.trim()))}render(){var e=[];for(let t in n.KNOWN_HOSTS){let s=n.KNOWN_HOSTS[t];e.push(i().createElement("option",{key:s,value:s}))}return i().createElement("div",{className:"panel-form-row"},i().createElement("input",{type:"search",id:"host-name",placeholder:this.props.hostName,list:"known-hosts",className:"quoted",value:this.state.hostName,onChange:this.handleHostNameChange,onBlur:this.handleEditingFinished,required:!0}),i().createElement("datalist",{id:"known-hosts"},e))}}},"./src/widgets/image-preview.jsx":function(e,t,s){s.r(t),s.d(t,{default:function(){return d}});var a=s("react"),i=s.n(a),n=s("react-intl"),o=s("./src/widgets/send-message.jsx"),r=s("./src/config.js"),l=s("./src/lib/blob-helpers.js"),c=s("./src/lib/strformat.js");class d extends i().PureComponent{constructor(e){super(e),this.state={width:0,height:0},this.handleSendImage=this.handleSendImage.bind(this)}assignWidth(e){if(e&&!this.state.width){const t=e.getBoundingClientRect();this.setState({width:0|t.width,height:0|t.height})}}handleSendImage(e){this.props.onClose(),this.props.onSendMessage(e,this.props.content.blob)}render(){if(!this.props.content)return null;const e=(0,l.fitImageSize)(this.props.content.width,this.props.content.height,this.state.width,this.state.height,!1),t=e?{width:e.dstWidth+"px",height:e.dstHeight+"px"}:this.props.content.width>this.props.content.height?{width:"100%"}:{height:"100%"};t.maxWidth="100%",t.maxHeight="100%";let s=this.props.content.filename;const a=Math.max((this.state.width/r.REM_SIZE/1.5|0)-2,12);s.length>a&&(s=s.slice(0,a/2-1)+"…"+s.slice(1-a/2));const d=this.props.content.width||"-",h=this.props.content.height||"-";return i().createElement("div",{id:"image-preview"},i().createElement("div",{id:"image-preview-caption-panel"},this.props.onSendMessage?i().createElement("span",null,this.props.content.filename):i().createElement("a",{href:this.props.content.url,download:this.props.content.filename},i().createElement("i",{className:"material-icons"},"file_download")," ",i().createElement(n.FormattedMessage,{id:"download_action",defaultMessage:"download",description:"Call to action [download]"})),i().createElement("a",{href:"#",onClick:e=>{e.preventDefault(),this.props.onClose()}},i().createElement("i",{className:"material-icons gray"},"close"))),i().createElement("div",{id:"image-preview-container",ref:e=>this.assignWidth(e)},i().createElement("img",{src:this.props.content.url,style:t,className:"image-preview",alt:this.props.content.filename})),this.props.onSendMessage?i().createElement(o.default,{messagePrompt:"add_image_caption",acceptBlank:!0,onSendMessage:this.handleSendImage,onError:this.props.onError}):i().createElement("div",{id:"image-preview-footer"},i().createElement("div",null,i().createElement("div",null,i().createElement("b",null,i().createElement(n.FormattedMessage,{id:"label_file_name",defaultMessage:"File name:",description:"Label for a file name"}))),i().createElement("div",null,i().createElement("span",{title:this.props.content.filename},s||"-"))),i().createElement("div",null,i().createElement("div",null,i().createElement("b",null,i().createElement(n.FormattedMessage,{id:"label_content_type",defaultMessage:"Content type:",description:"Label for file content type (mime)"}))),i().createElement("div",null,this.props.content.type)),i().createElement("div",null,i().createElement("div",null,i().createElement("b",null,i().createElement(n.FormattedMessage,{id:"label_size",defaultMessage:"Size:",description:"Label for file size"}))),i().createElement("div",null,d," × ",h," px; ",(0,c.bytesToHumanSize)(this.props.content.size)))))}}},"./src/widgets/in-place-edit.jsx":function(e,t,s){s.r(t),s.d(t,{default:function(){return l}});var a=s("react"),i=s.n(a),n=s("react-dom"),o=s.n(n),r=s("./src/widgets/visible-password.jsx");class l extends i().Component{constructor(e){super(e),this.state={active:e.active,initialValue:e.value||"",value:e.value||""},this.handeTextChange=this.handeTextChange.bind(this),this.handleKeyDown=this.handleKeyDown.bind(this),this.handleStartEditing=this.handleStartEditing.bind(this),this.handleEditingFinished=this.handleEditingFinished.bind(this),this.handlePasswordFinished=this.handlePasswordFinished.bind(this)}componentDidUpdate(e,t){const s=this.props.value||"";t.initialValue==s||t.active||this.setState({initialValue:s,value:s})}handeTextChange(e){this.setState({value:e.target.value})}handleKeyDown(e){27===e.keyCode?this.setState({value:this.props.value,active:!1}):13===e.keyCode&&this.handleEditingFinished(e)}handleStartEditing(){this.props.readOnly||(o().findDOMNode(this).focus(),this.setState({active:!0}))}handleEditingFinished(e){if(this.props.required&&!e.target.checkValidity())return void this.setState({value:this.props.value,active:!1});this.setState({active:!1});let t=this.state.value.trim();(t||this.props.value)&&t!==this.props.value&&this.props.onFinished(t)}handlePasswordFinished(e){this.setState({active:!1}),e&&e!==this.props.value&&this.props.onFinished(e)}render(){if(this.state.active)var e=this.props.type||"text";else{var t="password"==this.props.type?"••••••••":this.state.value,s="in-place-edit"+(this.props.readOnly?" disabled":"");t||(t=this.props.placeholder,s+=" placeholder"),t.length>20&&(t=t.substring(0,19)+"...")}return this.state.active?"password"==e?i().createElement(r.default,{value:this.state.value,placeholder:this.props.placeholder,required:this.props.required?"required":"",autoComplete:this.props.autoComplete,autoFocus:!0,onFinished:this.handlePasswordFinished}):i().createElement("input",{type:e,value:this.state.value,placeholder:this.props.placeholder,required:this.props.required?"required":"",autoComplete:this.props.autoComplete,autoFocus:!0,onChange:this.handeTextChange,onKeyDown:this.handleKeyDown,onBlur:this.handleEditingFinished}):i().createElement("span",{className:s,onClick:this.handleStartEditing},i().createElement("span",{className:"content"},t))}}},"./src/widgets/invitation.jsx":function(e,t,s){s.r(t),s.d(t,{default:function(){return o}});var a=s("react"),i=s.n(a),n=s("react-intl");class o extends i().PureComponent{constructor(e){super(e),this.handleButtonAction=this.handleButtonAction.bind(this)}handleButtonAction(e,t){e.preventDefault(),this.props.onAction(t)}render(){return i().createElement("div",{className:"accept-invite-panel"},i().createElement("div",{className:"title"},i().createElement(n.FormattedMessage,{id:"chat_invitation",defaultMessage:"You are invited to start a new chat. What would you like to do?",description:"New chat invitation message: [Accept] [Ignore] [Block]."})),i().createElement("div",{className:"footer"},i().createElement("button",{className:"blue",onClick:e=>{this.handleButtonAction(e,"accept")}},i().createElement(n.FormattedMessage,{id:"chat_invitation_accept",defaultMessage:"Accept",description:"Action [Accept] for chat invitation."})),i().createElement("button",{className:"white",onClick:e=>{this.handleButtonAction(e,"delete")}},i().createElement(n.FormattedMessage,{id:"chat_invitation_ignore",defaultMessage:"Ignore",description:"Action [Ignore] for chat invitation."})),i().createElement("button",{className:"white",onClick:e=>{this.handleButtonAction(e,"block")}},i().createElement(n.FormattedMessage,{id:"chat_invitation_block",defaultMessage:"Block",description:"Action [Block] for chat invitation."}))))}}},"./src/widgets/letter-tile.jsx":function(e,t,s){s.r(t),s.d(t,{default:function(){return l}});var a=s("react"),i=s.n(a),n=s("tinode-sdk"),o=s.n(n),r=s("./src/lib/strformat.js");class l extends i().PureComponent{render(){let e;if(!0===this.props.avatar){const t="grp"==o().topicType(this.props.topic),s=(t?"light-color":"dark-color")+Math.abs((0,r.stringHash)(this.props.topic))%16;if(this.props.topic&&this.props.title&&this.props.title.trim()){const t=this.props.title.trim().charAt(0),a="lettertile "+s;e=i().createElement("div",{className:a},i().createElement("div",null,t))}else{const a="material-icons "+s;e=t?i().createElement("i",{className:a},"group"):i().createElement("i",{className:a},"person")}}else e=this.props.avatar?i().createElement("img",{className:"avatar",alt:"avatar",src:this.props.avatar,onError:e=>{e.target.onerror=null,e.target.src="/img/broken_image.png"}}):null;return e}}},"./src/widgets/load-spinner.jsx":function(e,t,s){s.r(t),s.d(t,{default:function(){return n}});var a=s("react"),i=s.n(a);class n extends i().PureComponent{render(){return this.props.show?i().createElement("div",{className:"load-spinner-box"},i().createElement("div",{className:"loader-spinner"})):null}}},"./src/widgets/menu-cancel.jsx":function(e,t,s){s.r(t),s.d(t,{default:function(){return n}});var a=s("react"),i=s.n(a);class n extends i().PureComponent{render(){return i().createElement("a",{href:"#",onClick:e=>{e.preventDefault(),this.props.onCancel()}},i().createElement("i",{className:"material-icons"},"close"))}}},"./src/widgets/menu-contacts.jsx":function(e,t,s){s.r(t),s.d(t,{default:function(){return n}});var a=s("react"),i=s.n(a);class n extends i().PureComponent{render(){return i().createElement("div",null,i().createElement("a",{href:"#",onClick:e=>{e.preventDefault(),this.props.onNewTopic()}},i().createElement("i",{className:"material-icons"},"chat"))," ",i().createElement("a",{href:"#",onClick:e=>{e.preventDefault(),this.props.onSettings()}},i().createElement("i",{className:"material-icons"},"settings")))}}},"./src/widgets/menu-start.jsx":function(e,t,s){s.r(t),s.d(t,{default:function(){return n}});var a=s("react"),i=s.n(a);class n extends i().PureComponent{render(){return i().createElement("div",null,i().createElement("a",{href:"#",onClick:e=>{e.preventDefault(),this.props.onSignUp()}},i().createElement("i",{className:"material-icons"},"person_add"))," ",i().createElement("a",{href:"#",onClick:e=>{e.preventDefault(),this.props.onSettings()}},i().createElement("i",{className:"material-icons"},"settings")))}}},"./src/widgets/more-button.jsx":function(e,t,s){s.r(t),s.d(t,{default:function(){return n}});var a=s("react"),i=s.n(a);class n extends i().PureComponent{constructor(e){super(e),this.state={open:e.open},this.handleToggle=this.handleToggle.bind(this)}handleToggle(){const e=!this.state.open;this.setState({open:e}),this.props.onToggle&&this.props.onToggle(e)}render(){return i().createElement("label",{className:"small clean-clickable",onClick:this.handleToggle},this.props.title,"...",this.state.open?i().createElement("i",{className:"material-icons"},"expand_more"):i().createElement("i",{className:"material-icons"},"chevron_right"))}}},"./src/widgets/new-topic-by-id.jsx":function(e,t,s){s.r(t);var a=s("react"),i=s.n(a),n=s("react-intl");const o=(0,n.defineMessages)({invalid_id:{id:"error_invalid_id",defaultMessage:"Invalid ID",description:"Error message"}});class r extends i().PureComponent{constructor(e){super(e),this.state={groupId:""},this.handleChange=this.handleChange.bind(this),this.handleKeyPress=this.handleKeyPress.bind(this),this.handleSubmit=this.handleSubmit.bind(this)}handleChange(e){this.setState({groupId:e.target.value})}handleKeyPress(e){"Enter"===e.key&&this.handleSubmit(e)}handleSubmit(e){if(e.preventDefault(),this.state.groupId){var t=this.state.groupId.trim();t.length>3&&("usr"==t.substr(0,3)||"grp"==t.substr(0,3))?this.props.onSubmit(t):this.props.onError(this.props.intl.formatMessage(o.invalid_id),"err")}}render(){return i().createElement("div",{className:"panel-form"},i().createElement("div",{className:"panel-form-row"},i().createElement(n.FormattedMessage,{id:"group_user_id_prompt",defaultMessage:"Group or User ID",description:"Prompt for entering user or group ID"},(e=>i().createElement("input",{type:"text",placeholder:e,value:this.state.groupId,onChange:this.handleChange,onKeyPress:this.handleKeyPress,required:!0,autoFocus:!0})))),i().createElement("div",{className:"dialog-buttons"},i().createElement("button",{className:"blue",onClick:this.handleSubmit},i().createElement(n.FormattedMessage,{id:"button_subscribe",defaultMessage:"Subscribe",description:"Button [Subscribe]"}))))}}t.default=(0,n.injectIntl)(r)},"./src/widgets/new-topic-group.jsx":function(e,t,s){s.r(t),s.d(t,{default:function(){return d}});var a=s("react"),i=s.n(a),n=s("react-intl"),o=s("./src/widgets/avatar-upload.jsx"),r=s("./src/widgets/checkbox.jsx"),l=s("./src/widgets/tag-manager.jsx"),c=s("./src/config.js");class d extends i().PureComponent{constructor(e){super(e),this.state={fn:"",private:"",imageDataUrl:null,tags:[],isChannel:!1},this.handleFnChange=this.handleFnChange.bind(this),this.handlePrivateChange=this.handlePrivateChange.bind(this),this.handleImageChanged=this.handleImageChanged.bind(this),this.handleTagsChanged=this.handleTagsChanged.bind(this),this.handleChannelToggle=this.handleChannelToggle.bind(this),this.handleSubmit=this.handleSubmit.bind(this)}handleFnChange(e){this.setState({fn:e.target.value})}handlePrivateChange(e){this.setState({private:e.target.value})}handleImageChanged(e){this.setState({imageDataUrl:e})}handleTagsChanged(e){this.setState({tags:e})}handleChannelToggle(){this.setState({isChannel:!this.state.isChannel})}handleSubmit(e){e.preventDefault();const t=this.state.fn.trim().substring(0,c.MAX_TITLE_LENGTH),s=this.state.private.trim().substring(0,c.MAX_TITLE_LENGTH);t&&this.props.onSubmit(t,this.state.imageDataUrl,s,this.state.tags,this.state.isChannel)}render(){var e="blue";return this.props.disabled&&(e+=" disabled"),i().createElement("form",{className:"panel-form",onSubmit:this.handleSubmit},i().createElement("div",{className:"panel-form-row"},i().createElement("div",{className:"panel-form-column"},i().createElement("label",{className:"small",htmlFor:"new-topic-fn"},i().createElement(n.FormattedMessage,{id:"label_topic_name"})),i().createElement(n.FormattedMessage,{id:"topic_name_editing_placeholder",defaultMessage:"Freeform name of the group",description:"Prompt for entering topic name"},(e=>i().createElement("input",{type:"text",id:"new-topic-fn",placeholder:e,value:this.state.fn,onChange:this.handleFnChange,autoFocus:!0,required:!0}))),i().createElement("br",null),i().createElement("label",{className:"small",htmlFor:"new-topic-priv"},i().createElement(n.FormattedMessage,{id:"label_private"})),i().createElement(n.FormattedMessage,{id:"private_editing_placeholder"},(e=>i().createElement("input",{type:"text",id:"new-topic-priv",placeholder:e,value:this.state.private,onChange:this.handlePrivateChange})))),i().createElement(o.default,{onError:this.props.onError,onImageChanged:this.handleImageChanged})),i().createElement("div",{className:"panel-form-row"},i().createElement(r.default,{checked:this.state.isChannel,onChange:this.handleChannelToggle})," ",i().createElement("label",{onClick:this.handleChannelToggle},i().createElement(n.FormattedMessage,{id:"channel_prompt",defaultMessage:"This is a channel",description:"Checkbox label when creating a channel"}))),i().createElement(n.FormattedMessage,{id:"title_tag_manager"},(e=>i().createElement(l.default,{tags:this.state.tags,activated:!0,onTagsChanged:this.handleTagsChanged,tinode:this.props.tinode,title:e}))),i().createElement("div",{className:"dialog-buttons"},i().createElement("button",{className:e},i().createElement(n.FormattedMessage,{id:"button_create",defaultMessage:"Create",description:"Button [Create]"}))))}}},"./src/widgets/permissions-editor.jsx":function(e,t,s){s.r(t);var a=s("react"),i=s.n(a),n=s("react-intl"),o=s("./src/widgets/checkbox.jsx"),r=s("./src/widgets/contact.jsx"),l=s("./src/lib/blob-helpers.js");const c=(0,n.defineMessages)({joiner:{id:"permission_join",defaultMessage:"Join ({val})",description:"Name of J permission"},reader:{id:"permission_read",defaultMessage:"Read ({val})",description:"Name of R permission"},writer:{id:"permission_write",defaultMessage:"Write ({val})",description:"Name of W permission"},preser:{id:"permission_pres",defaultMessage:"Get notified ({val})",description:"Name of P permission"},approver:{id:"permission_admin",defaultMessage:"Approve ({val})",description:"Name of A permission"},sharer:{id:"permission_share",defaultMessage:"Share ({val})",description:"Name of S permission"},deleter:{id:"permission_delete",defaultMessage:"Delete ({val})",description:"Name of D permission"},owner:{id:"permission_owner",defaultMessage:"Owner ({val})",description:"Name of O permission"}});class d extends i().Component{constructor(e){super(e),this.state={mode:(e.mode||"").replace("N","")},this.handleChange=this.handleChange.bind(this),this.handleSubmit=this.handleSubmit.bind(this),this.handleCancel=this.handleCancel.bind(this)}handleChange(e){let t=this.state.mode;-1==t.indexOf(e)?t+=e:t=t.replace(e,""),this.setState({mode:t})}handleSubmit(){var e=(this.state.mode||"N").split("").sort().join("");e!==(this.props.mode||"N").split("").sort().join("")?this.props.onSubmit(e):this.props.onCancel()}handleCancel(){this.props.onCancel()}render(){const{formatMessage:e}=this.props.intl,t="JRWPASDO",s={J:e(c.joiner,{val:"J"}),R:e(c.reader,{val:"R"}),W:e(c.writer,{val:"W"}),P:e(c.preser,{val:"P"}),A:e(c.approver,{val:"A"}),S:e(c.sharer,{val:"S"}),D:e(c.deleter,{val:"D"}),O:e(c.owner,{val:"O"})};let a=this.props.skip||"",d=this.state.mode,h=(this.props.compare||"").replace("N",""),p=[];for(let e=0;e=0&&d.indexOf(n)<0||p.push(i().createElement("tr",{key:n},i().createElement("td",null,s[n]),i().createElement("td",{className:"checkbox"},a.indexOf(n)<0?i().createElement(o.default,{name:n,checked:d.indexOf(n)>=0,onChange:this.handleChange}):i().createElement(o.default,{name:n,checked:d.indexOf(n)>=0})),this.props.compare?i().createElement("td",{className:"checkbox"},i().createElement(o.default,{name:n,checked:h.indexOf(n)>=0})):null))}return i().createElement("div",{className:"panel-form-column"},this.props.userTitle?i().createElement("ul",{className:"contact-box"},i().createElement(r.default,{item:this.props.item,title:this.props.userTitle,avatar:(0,l.makeImageUrl)(this.props.userAvatar?this.props.userAvatar:null)})):null,i().createElement("label",{className:"small"},i().createElement(n.FormattedMessage,{id:"title_permissions",defaultMessage:"Permissions",description:"Section title"})),i().createElement("table",{className:"permission-editor"},this.props.compare?i().createElement("thead",null,i().createElement("tr",null,i().createElement("th",null),i().createElement("th",null,this.props.modeTitle),i().createElement("th",null,this.props.compareTitle))):null,i().createElement("tbody",null,p)),i().createElement("br",null),i().createElement("div",{className:"dialog-buttons"},i().createElement("button",{className:"outline",onClick:this.handleCancel},i().createElement(n.FormattedMessage,{id:"button_cancel"})),i().createElement("button",{className:"blue",onClick:this.handleSubmit},i().createElement(n.FormattedMessage,{id:"button_ok"}))))}}t.default=(0,n.injectIntl)(d)},"./src/widgets/received-marker.jsx":function(e,t,s){s.r(t);var a=s("react"),i=s.n(a),n=s("react-intl"),o=s("tinode-sdk"),r=s.n(o),l=s("./src/lib/strformat.js");const c=(0,n.defineMessages)({sending:{id:"message_sending",defaultMessage:"sending...",description:"Message being sent, in place of time stamp"},failed:{id:"message_sending_failed",defaultMessage:"failed",description:"Failed to send message, in place of time stamp"}});class d extends i().PureComponent{render(){const{formatMessage:e}=this.props.intl;let t;t=this.props.received<=r().MESSAGE_STATUS_SENDING?e(c.sending):this.props.received==r().MESSAGE_STATUS_FAILED?e(c.failed):(0,l.shortDateFormat)(this.props.timestamp,this.props.intl.locale);let s=null;return this.props.received<=r().MESSAGE_STATUS_SENDING?s=i().createElement("i",{className:"material-icons small"},"access_time"):this.props.received==r().MESSAGE_STATUS_FAILED?s=i().createElement("i",{className:"material-icons small amber"},"warning"):this.props.received==r().MESSAGE_STATUS_SENT?s=i().createElement("i",{className:"material-icons small"},"done"):this.props.received==r().MESSAGE_STATUS_RECEIVED?s=i().createElement("i",{className:"material-icons small"},"done_all"):this.props.received==r().MESSAGE_STATUS_READ&&(s=i().createElement("i",{className:"material-icons small blue"},"done_all")),i().createElement("span",{className:"timestamp"},t," ",s)}}t.default=(0,n.injectIntl)(d)},"./src/widgets/search-contacts.jsx":function(e,t,s){s.r(t),s.d(t,{default:function(){return l}});var a=s("react"),i=s.n(a),n=s("react-intl"),o=s("tinode-sdk"),r=s.n(o);class l extends i().PureComponent{constructor(e){super(e),this.state={edited:!1,search:""},this.handleSearchChange=this.handleSearchChange.bind(this),this.handleSearch=this.handleSearch.bind(this),this.handleClear=this.handleClear.bind(this),this.handleKeyDown=this.handleKeyDown.bind(this)}componentWillUnmount(){this.state.edited&&(this.setState({search:"",edited:!1}),this.props.onSearchContacts(r().DEL_CHAR))}handleSearchChange(e){this.setState({search:e.target.value})}handleSearch(e){e.preventDefault();var t=this.state.search.trim();this.setState({edited:t.length>0}),this.props.onSearchContacts(t.length>0?t:r().DEL_CHAR)}handleClear(e){e.preventDefault(),this.state.edited&&this.props.onSearchContacts(r().DEL_CHAR),this.setState({search:"",edited:!1})}handleKeyDown(e){"Enter"===e.key?this.handleSearch(e):"Escape"===e.key&&this.handleClear()}render(){return i().createElement("div",{className:"panel-form"},i().createElement("div",{className:"panel-form-row"},i().createElement("i",{className:"material-icons search"},"search"),i().createElement(n.FormattedMessage,{id:"search_placeholder",defaultMessage:"List like email:alice@example.com, tel:17025550003...",description:"Placeholder in contacts search field"},(e=>i().createElement("input",{className:"search",type:"text",placeholder:e,value:this.state.search,onChange:this.handleSearchChange,onKeyDown:this.handleKeyDown,required:!0,autoFocus:!0}))),i().createElement("a",{href:"#",onClick:this.handleClear},i().createElement("i",{className:"material-icons"},"close"))))}}},"./src/widgets/send-message.jsx":function(e,t,s){s.r(t);var a=s("react"),i=s.n(a),n=s("react-intl"),o=(s("tinode-sdk"),s("./src/config.js")),r=s("./src/lib/blob-helpers.js");const l=(0,n.defineMessages)({messaging_disabled:{id:"messaging_disabled_prompt",defaultMessage:"Messaging disabled",description:"Prompt in SendMessage in read-only topic"},type_new_message:{id:"new_message_prompt",defaultMessage:"New message",description:"Prompt in send message field"},add_image_caption:{id:"image_caption_prompt",defaultMessage:"Image caption",description:"Prompt in SendMessage for attached image"},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 c extends i().PureComponent{constructor(e){super(e),this.state={message:"",keypressTimestamp:(new Date).getTime()-o.KEYPRESS_DELAY-1},this.handlePasteEvent=this.handlePasteEvent.bind(this),this.handleAttachImage=this.handleAttachImage.bind(this),this.handleAttachFile=this.handleAttachFile.bind(this),this.handleSend=this.handleSend.bind(this),this.handleKeyPress=this.handleKeyPress.bind(this),this.handleMessageTyping=this.handleMessageTyping.bind(this)}componentDidMount(){this.messageEditArea&&this.messageEditArea.addEventListener("paste",this.handlePasteEvent,!1)}componentWillUnmount(){this.messageEditArea&&this.messageEditArea.removeEventListener("paste",this.handlePasteEvent,!1)}componentDidUpdate(){this.messageEditArea&&this.messageEditArea.focus()}handlePasteEvent(e){this.props.disabled||(0,r.filePasted)(e,((e,t,s,a,i)=>{this.props.onAttachImage(t,e,s,a,i)}),((e,t,s)=>{this.props.onAttachFile(e,t,s)}),this.props.onError)&&e.preventDefault()}handleAttachImage(e){e.target.files&&e.target.files.length>0&&this.props.onAttachImage(e.target.files[0]),e.target.value=""}handleAttachFile(e){const{formatMessage:t}=this.props.intl;e.target.files&&e.target.files.length>0&&this.props.onAttachFile(e.target.files[0]),e.target.value=""}handleSend(e){e.preventDefault();const t=this.state.message.trim();(t||this.props.acceptBlank||this.props.noInput)&&(this.props.onSendMessage(t),this.setState({message:""}))}handleKeyPress(e){"Enter"===e.key&&(e.shiftKey||(e.preventDefault(),e.stopPropagation(),this.handleSend(e)))}handleMessageTyping(e){const t={message:e.target.value};if(this.props.onKeyPress){const e=(new Date).getTime();e-this.state.keypressTimestamp>o.KEYPRESS_DELAY&&(this.props.onKeyPress(),t.keypressTimestamp=e)}this.setState(t)}render(){const{formatMessage:e}=this.props.intl,t=this.props.disabled?e(l.messaging_disabled):this.props.messagePrompt?e(l[this.props.messagePrompt]):e(l.type_new_message);return i().createElement("div",{id:"send-message-panel"},this.props.disabled?i().createElement("div",{id:"writing-disabled"},t):i().createElement(i().Fragment,null,this.props.onAttachFile?i().createElement(i().Fragment,null,i().createElement("a",{href:"#",onClick:e=>{e.preventDefault(),this.attachImage.click()},title:"Add image"},i().createElement("i",{className:"material-icons secondary"},"photo")),i().createElement("a",{href:"#",onClick:e=>{e.preventDefault(),this.attachFile.click()},title:"Attach file"},i().createElement("i",{className:"material-icons secondary"},"attach_file"))):null,this.props.noInput?i().createElement("div",{className:"hr thin"}):i().createElement("textarea",{id:"sendMessage",placeholder:t,value:this.state.message,onChange:this.handleMessageTyping,onKeyPress:this.handleKeyPress,ref:e=>{this.messageEditArea=e},autoFocus:!0}),i().createElement("a",{href:"#",onClick:this.handleSend,title:"Send"},i().createElement("i",{className:"material-icons"},"send")),i().createElement("input",{type:"file",ref:e=>{this.attachFile=e},onChange:this.handleAttachFile,style:{display:"none"}}),i().createElement("input",{type:"file",ref:e=>{this.attachImage=e},accept:"image/*",onChange:this.handleAttachImage,style:{display:"none"}})))}}t.default=(0,n.injectIntl)(c)},"./src/widgets/side-navbar.jsx":function(e,t,s){s.r(t),s.d(t,{default:function(){return c}});var a=s("react"),i=s.n(a),n=s("./src/widgets/letter-tile.jsx"),o=s("./src/widgets/button-back.jsx"),r=s("./src/widgets/menu-contacts.jsx"),l=s("./src/widgets/menu-start.jsx");class c extends i().PureComponent{render(){return i().createElement("div",{id:"side-caption-panel",className:"caption-panel"},this.props.onCancel?i().createElement(o.default,{onBack:this.props.onCancel}):null,this.props.avatar?i().createElement("div",{id:"self-avatar",className:"avatar-box"},i().createElement(n.default,{avatar:this.props.avatar,topic:this.props.myUserId,title:this.props.title})):null,i().createElement("div",{id:"sidepanel-title",className:"panel-title"},this.props.title),"login"===this.props.state?i().createElement(l.default,{onSignUp:this.props.onSignUp,onSettings:this.props.onSettings}):"contacts"===this.props.state?i().createElement(r.default,{onNewTopic:this.props.onNewTopic,onSettings:this.props.onSettings}):null)}}},"./src/widgets/tag-manager.jsx":function(e,t,s){s.r(t),s.d(t,{default:function(){return c}});var a=s("react"),i=s.n(a),n=s("react-intl"),o=s("./src/widgets/chip-input.jsx"),r=s("./src/config.js"),l=s("./src/lib/utils.js");class c extends i().Component{constructor(e){super(e),this.state={tags:this.props.tags,tagInput:"",activated:this.props.activated},this.handleTagInput=this.handleTagInput.bind(this),this.handleAddTag=this.handleAddTag.bind(this),this.handleRemoveTag=this.handleRemoveTag.bind(this),this.handleSubmit=this.handleSubmit.bind(this),this.handleCancel=this.handleCancel.bind(this)}static getDerivedStateFromProps(e,t){return(0,l.arrayEqual)(e.tags,t.tags)||t.activated?null:{tags:e.tags}}handleTagInput(e){if(this.setState({tagInput:e}),e.length>0){const t=e[e.length-1];'"'==e[0]?e.length>1&&'"'==t&&this.handleAddTag(e.substring(1,e.length-1)):","!=t&&" "!=t&&";"!=t&&'"'!=t||this.handleAddTag(e.substring(0,e.length-1).trim())}}handleAddTag(e){const t=this.props.tinode.getServerLimit("maxTagCount",r.MAX_TAG_COUNT);if(e.length>0&&this.state.tags.length{s.push({user:a,invalid:a.lengtht})})):(this.state.tags.map((e=>{s.push(i().createElement("span",{className:"badge",key:s.length},e))})),0==s.length&&(s=i().createElement("i",null,i().createElement(n.FormattedMessage,{id:"tags_not_found",defaultMessage:"No tags defined. Add some.",description:""})))),i().createElement("div",{className:"panel-form-column"},i().createElement("div",{className:"panel-form-row"},i().createElement("label",{className:"small"},this.props.title)),this.state.activated?i().createElement("div",null,i().createElement(n.FormattedMessage,{id:"tags_editor_no_tags",defaultMessage:"Add some tags",description:"Tag editor prompt when no tags are found."},(e=>i().createElement(o.default,{chips:s,avatarDisabled:!0,prompt:e,onEnter:this.handleAddTag,onFocusLost:this.handleAddTag,onCancel:this.handleCancel,onChipRemoved:this.handleRemoveTag,filterFunc:this.handleTagInput}))),this.props.onSubmit||this.props.onCancel?i().createElement("div",{id:"tag-manager-buttons",className:"dialog-buttons panel-form-row"},i().createElement("button",{className:"outline",onClick:this.handleCancel},i().createElement(n.FormattedMessage,{id:"button_cancel",defautMessage:"Cancel",description:"Rejection button [Cancel]"})),i().createElement("button",{className:"blue",onClick:this.handleSubmit},i().createElement(n.FormattedMessage,{id:"button_ok",defautMessage:"OK",description:"Confirmation button [OK]"}))):null):i().createElement("div",{className:"quoted"},i().createElement("a",{href:"#",className:"flat-button",onClick:e=>{e.preventDefault(),this.setState({activated:!0})}},i().createElement("i",{className:"material-icons"},"edit"),"  ",i().createElement(n.FormattedMessage,{id:"title_manage_tags",defaultMessage:"Manage",description:"Section title for the list of tags"})),i().createElement(i().Fragment,null,s)))}}},"./src/widgets/unread-badge.jsx":function(e,t,s){s.r(t),s.d(t,{default:function(){return n}});var a=s("react"),i=s.n(a);class n extends i().PureComponent{render(){return this.props.count>0?i().createElement("span",{className:"unread"},this.props.count>9?"9+":this.props.count):null}}},"./src/widgets/uploading-image.jsx":function(e,t,s){s.r(t),s.d(t,{default:function(){return o}});var a=s("react"),i=s.n(a),n=(s("react-intl"),s("./src/widgets/file-progress.jsx"));class o extends i().PureComponent{constructor(e){super(e)}render(){return i().createElement("div",{className:"inline-image"},i().createElement("img",this.props),i().createElement("div",{className:"rounded-container"},i().createElement(n.default,{progress:this.props.progress,onCancel:this.props.onCancelUpload})))}}},"./src/widgets/visible-password.jsx":function(e,t,s){s.r(t),s.d(t,{default:function(){return n}});var a=s("react"),i=s.n(a);class n extends i().PureComponent{constructor(e){super(e),this.state={value:this.props.value,visible:!1},this.handleVisibility=this.handleVisibility.bind(this),this.handeTextChange=this.handeTextChange.bind(this),this.handleKeyDown=this.handleKeyDown.bind(this),this.handleEditingFinished=this.handleEditingFinished.bind(this)}handeTextChange(e){this.setState({value:e.target.value}),this.props.onChange&&this.props.onChange(e)}handleVisibility(e){e.preventDefault(),this.setState({visible:!this.state.visible})}handleKeyDown(e){27==e.keyCode?(this.setState({value:this.props.value,visible:!1}),this.props.onFinished&&this.props.onFinished()):13==e.keyCode&&this.handleEditingFinished()}handleEditingFinished(e){if(e){let t=e.currentTarget;setTimeout((()=>{t.contains(document.activeElement)||this.props.onFinished&&this.props.onFinished(this.state.value)}),0)}else this.props.onFinished&&this.props.onFinished(this.state.value.trim())}render(){return i().createElement("div",{tabIndex:"-1",className:"group-focus",onBlur:this.handleEditingFinished},i().createElement("input",{className:"with-visibility",type:this.state.visible?"text":"password",value:this.state.value,placeholder:this.props.placeholder,required:this.props.required?"required":"",autoFocus:this.props.autoFocus?"autoFocus":"",autoComplete:this.props.autoComplete,onChange:this.handeTextChange,onKeyDown:this.handleKeyDown}),i().createElement("span",{onClick:this.handleVisibility},i().createElement("i",{className:"material-icons clickable light-gray"},this.state.visible?"visibility":"visibility_off")))}}},"./src/messages.json":function(e){e.exports=JSON.parse('{"de":{"validate_credential_action":"bestätigen","title_tag_manager":"Schlagworte (Nutzer entdecken)","label_user_contacts":"Kontakte:","button_add_another":"Hinzufügen","label_message_sound":"Benachrichtigungston:","label_push_notifications":"Benachrichtigungsmeldungen:","label_push_notifications_disabled":"Benachrichtigungsmeldungen (erfordert HTTPS):","label_incognito_mode":"inkognito-Modus:","delete_account":"Konto löschen","delete_account_arning":"Möchten Sie das Konto wirklich löschen? Das kann nicht rückgängig gemacht werden","label_password":"Passwort","password_unchanged_prompt":"unverändert","button_logout":"Abmelden","button_delete_account":"Konto löschen","label_default_access_mode":"Standard Zugriffsmodus:","blocked_contacts_link":"Blockierte Kontakte ({count})","link_contact_us":"Kontakt","link_terms_of_service":"Nutzungsbedingungen","link_privacy_policy":"Datenschutzerklärung","label_sdk":"SDK:","label_server_address":"Server Adresse:","archived_contacts":"Archivierte Kontakte ({count})","contacts_not_found":"Sie haben keine Unterhaltungen
¯∖_(ツ)_/¯","full_name_prompt":"Vollständiger Name, z.B. Lisa Musterfrau","email_prompt":"E-Mail, z.B. jdoe@beispiel.de","button_sign_up":"Anmelden","label_your_name":"Ihr Name","label_user_id":"ID:","button_edit":"Bearbeiten","requested_permissions":"Angefordert","granted_permissions":"Erteilt","menu_item_edit_permissions":"Berechtigungen ändern","label_other_user":"Andere","action_clear_messages":"Nachrichten leeren","clear_messages_warning":"Sind Sie sicher, dass Sie diese Unterhaltung für alle leeren wollen? Das kann nicht rückgängig gemacht werden.","action_delete_messages":"Nachrichten für alle löschen","delete_messages_warning":"Sind Sie sicher, dass Sie diese Unterhaltung für alle löschen wollen? Das kann nicht rückgängig gemacht werden.","action_leave_chat":"Unterhaltung verlassen","leave_chat_warning":"Möchten Sie diese Unterhaltung wirklich verlassen?","action_block_contact":"Kontakt blockieren","block_contact_warning":"Möchten Sie diesen Kontakt wirklich blockieren?","action_report_chat":"Unterhaltung melden","report_chat_warning":"Möchten Sie diese Unterhaltung wirklich blockieren und melden?","title_info":"Info","label_topic_name":"Name","label_private":"Privater Kommentar","private_editing_placeholder":"Nur für Sie sichtbar","label_muting_topic":"Stumm geschaltet:","action_more":"Mehr","label_your_permissions":"Ihre Berechtigungen:","label_permissions":"Berechtigungen:","label_you":"Sie:","label_default_access":"Standard Zugriffsmodus:","label_group_members":"Gruppenmitglieder:","button_add_members":"Mitglieder hinzufügen","group_has_no_members":"Keine Mitglieder","login_prompt":"Anmelden","password_prompt":"Passwort","stay_logged_in":"Angemeldet bleiben","forgot_password_link":"Passwort vergessen?","button_sign_in":"Anmelden","label_client":"Client:","label_server":"Server:","online_now":"jetzt online","last_seen_timestamp":"Zuletzt gesehen","title_not_found":"Nicht gefunden","unnamed_topic":"Unbenannt","messages_not_readable":"Neue Nachrichten können nicht gelesen werden","peers_messaging_disabled":"Gruppennachrichten sind deaktiviert","enable_peers_messaging":"Aktivieren","search_for_contacts":"Nutzen Sie die Suche um Kontakte zu finden","search_no_results":"Die Suche hatte keine Ergebnisse","tabtitle_find_user":"Suchen","tabtitle_new_group":"Neue Gruppe","tabtitle_group_by_id":"nach ID","new_password_placeholder":"Geben Sie ein neues Passwort ein","label_reset_password":"Passwort per E-Mail wiederherstellen:","credential_email_prompt":"E-Mail Adresse für Registrierung","button_reset":"Zurücksetzen","button_send_request":"Anfrage senden","label_server_to_use":"Server verwenden:","label_wire_transport":"Übertragung per Kabel:","button_update":"Aktualisieren","sidepanel_title_login":"Anmelden","sidepanel_title_register":"Konto erstellen","sidepanel_title_settings":"Einstellungen","sidepanel_title_account_settings":"Konto-Einstellungen","sidepanel_title_acc_general":"Allgemein","sidepanel_title_acc_security":"Sicherheit","sidepanel_title_acc_notifications":"Benachrichtigungen","sidepanel_title_acc_support":"Unterstützung","sidepanel_title_newtpk":"Neue Unterhaltung starten","sidepanel_title_cred":"Anmeldeinformationen bestätigen","sidepanel_title_reset":"Passwort zurücksetzen","sidepanel_title_archive":"Archivierte Unterhaltungen","sidepanel_title_blocked":"Blockierte Unterhaltungen","reconnect_countdown":"Getrennt. Wiederverbinden in {seconds}…","reconnect_now":"Jetzt probieren","push_init_failed":"Initialisierung von Push-Benachrichtigungen fehlgeschlagen","invalid_security_token":"Ungültiger Sicherheitsschlüssel","no_connection":"Keine Verbindung","code_doesnot_match":"Code stimmt nicht überein","update_available":"Aktualisierung verfügbar.","reload_update":"Neu laden","phone_dative":"Telefon","email_dative":"E-Mail","enter_confirmation_code_prompt":"Geben Sie den Bestätigungscode ein, der per {method} geschickt wurde:","numeric_confirmation_code_prompt":"Nur zahlen","button_confirm":"Bestätigen","save_attachment":"Speichern","deleted_content":"Inhalt gelöscht","invalid_content":"ungültiger Inhalt","user_not_found":"Nicht gefunden","badge_you":"Sie","badge_owner":"Besitzer","menu_item_info":"Info","menu_item_clear_messages":"Nachrichten leeren","menu_item_clear_messages_for_all":"Für alle leeren","menu_item_delete":"Löschen","menu_item_delete_for_all":"Für alle löschen","menu_item_send_retry":"Wiederholen","menu_item_mute":"Unterhaltung stumm schalten","menu_item_unmute":"Stumm schalten beenden","menu_item_delete_topic":"Entfernen","topic_delete_warning":"Möchten Sie diese Unterhaltung wirklich löschen?","menu_item_unblock":"Blockierung aufheben","menu_item_block":"Blockieren","topic_block_warning":"Möchten Sie diese Unterhaltung wirklich blockieren?","menu_item_member_delete":"Entfernen","menu_item_archive_topic":"Archivieren","action_cancel":"Abbrechen","upload_finishing":"wird abgeschlossen...","no_contacts":"Sie haben keine Kontakte :-(","contacts_not_found_short":"Keine Kontakte für \'\'{query}\'\'","title_group_members":"Gruppenmitglieder","title_all_contacts":"Alle Kontakte","button_ok":"OK","button_cancel":"Abbrechen","more_online_members":"+{overflow} mehr","download_action":"herunterladen","label_file_name":"Dateiname:","label_content_type":"Inhaltsart:","label_size":"Größe:","chat_invitation":"Sie sind eingeladen, an einem neuen Chat teilzunehmen. Was möchten Sie tun?","chat_invitation_accept":"Akzeptieren","chat_invitation_ignore":"Ignorieren","chat_invitation_block":"Blockieren","error_invalid_id":"ungültige ID","group_user_id_prompt":"Gruppe oder Benutzer ID","button_subscribe":"Abbonieren","topic_name_editing_placeholder":"Freiform Name der Gruppe","button_create":"Erstellen","permission_join":"Beitreten ({val})","permission_read":"Lesen ({val})","permission_write":"Schreiben ({val})","permission_pres":"Benachrichtigt werden ({val})","permission_admin":"Bestätigen ({val})","permission_share":"Teilen ({val})","permission_delete":"Entfernen ({val})","permission_owner":"Besitzer ({val})","title_permissions":"Berechtigungen","message_sending":"wird gesendet...","message_sending_failed":"fehlgeschlagen","search_placeholder":"Liste: email:lisa@beispiel.de, tel:17025550003...","messaging_disabled_prompt":"Nachrichtenübermittlung deaktiviert","new_message_prompt":"Neue Nachricht","image_caption_prompt":"Bildunterschrift","file_attachment_too_large":"Die Dateigröße {size} überschreitet das Limit von {limit}.","cannot_initiate_file_upload":"Datei kann nicht hochgeladen werden.","tags_not_found":"Keine Schlagworte definiert. Erstellen Sie welche.","tags_editor_no_tags":"Schlagworte hinzufügen","title_manage_tags":"Verwalten","channel_prompt":"Dies ist ein Sender","channel":"Sender"},"en":{"validate_credential_action":"confirm","title_tag_manager":"Tags (user discovery)","label_user_contacts":"Contacts:","button_add_another":"Add another","label_message_sound":"Message sound:","label_push_notifications":"Notification alerts:","label_push_notifications_disabled":"Notification alerts (requires HTTPS):","label_incognito_mode":"Incognito mode:","delete_account":"Delete account","delete_account_arning":"Are you sure you want to delete your account? It cannot be undone.","label_password":"Password","password_unchanged_prompt":"Unchanged","button_logout":"Logout","button_delete_account":"Delete account","label_default_access_mode":"Default access mode:","blocked_contacts_link":"Blocked contacts ({count})","link_contact_us":"Contact Us","link_terms_of_service":"Terms of Service","link_privacy_policy":"Privacy Policy","label_sdk":"SDK:","label_server_address":"Server address:","archived_contacts":"Archived contacts ({count})","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_user_id":"ID:","button_edit":"Edit","requested_permissions":"Requested","granted_permissions":"Granted","menu_item_edit_permissions":"Edit permissions","label_other_user":"Other","action_clear_messages":"Clear Messages","clear_messages_warning":"Are you sure you want to clear all messages? It cannot be undone.","action_delete_messages":"Clear Messages for All","delete_messages_warning":"Are you sure you want to delete all messages for everyone? It cannot be undone.","action_leave_chat":"Leave Conversation","leave_chat_warning":"Are you sure you want to leave this conversation?","action_block_contact":"Block Contact","block_contact_warning":"Are you sure you want to block this contact?","action_report_chat":"Report Conversation","report_chat_warning":"Are you sure you want to block and report this conversation?","title_info":"Info","label_topic_name":"Name","label_private":"Private comment","private_editing_placeholder":"Visible to you only","label_muting_topic":"Muted:","action_more":"More","label_your_permissions":"Your permissions:","label_permissions":"Permissions:","label_you":"You:","label_default_access":"Default access mode:","label_group_members":"Group members:","button_add_members":"Add members","group_has_no_members":"No members","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","channel":"channel","unnamed_topic":"Unnamed","messages_not_readable":"no access to messages","peers_messaging_disabled":"Peer\'s messaging is disabled.","enable_peers_messaging":"Enable","search_for_contacts":"Use search to find contacts","search_no_results":"Search returned no results","tabtitle_find_user":"find","tabtitle_new_group":"new group","tabtitle_group_by_id":"by id","new_password_placeholder":"Enter new password","label_reset_password":"Send a password reset email:","credential_email_prompt":"Your registration email","button_reset":"Reset","button_send_request":"Send request","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_account_settings":"Account Settings","sidepanel_title_acc_general":"General","sidepanel_title_acc_security":"Security","sidepanel_title_acc_notifications":"Notifications","sidepanel_title_acc_support":"Support","sidepanel_title_newtpk":"Start New Chat","sidepanel_title_cred":"Confirm Credentials","sidepanel_title_reset":"Reset Password","sidepanel_title_archive":"Archived Chats","sidepanel_title_blocked":"Blocked Chats","reconnect_countdown":"Disconnected. Reconnecting in {seconds}…","reconnect_now":"Try now","push_init_failed":"Failed to initialize push notifications","invalid_security_token":"Invalid security token","no_connection":"No connection","code_doesnot_match":"Code does not match","update_available":"Update available.","reload_update":"Reload","phone_dative":"phone","email_dative":"email","enter_confirmation_code_prompt":"Enter confirmation code sent to you by {method}:","numeric_confirmation_code_prompt":"Numbers only","button_confirm":"Confirm","save_attachment":"save","deleted_content":"content deleted","invalid_content":"invalid content","user_not_found":"Not found","badge_you":"you","badge_owner":"owner","menu_item_info":"Info","menu_item_clear_messages":"Clear messages","menu_item_clear_messages_for_all":"Clear for All","menu_item_delete":"Delete","menu_item_delete_for_all":"Delete for All","menu_item_send_retry":"Retry","menu_item_mute":"Mute","menu_item_unmute":"Unmute","menu_item_delete_topic":"Delete","topic_delete_warning":"Are you sure you want to delete this conversation?","menu_item_unblock":"Unblock","menu_item_block":"Block","topic_block_warning":"Are you sure you want to block this conversation?","menu_item_member_delete":"Remove","menu_item_archive_topic":"Archive","action_cancel":"cancel","upload_finishing":"finishing...","no_contacts":"You have no contacts :-(","contacts_not_found_short":"No contacts match \'\'{query}\'\'","title_group_members":"Group Members","title_all_contacts":"All Contacts","button_ok":"OK","button_cancel":"Cancel","more_online_members":"+{overflow} more","download_action":"download","label_file_name":"File name:","label_content_type":"Content type:","label_size":"Size:","chat_invitation":"You are invited to start a new chat. What would you like to do?","chat_invitation_accept":"Accept","chat_invitation_ignore":"Ignore","chat_invitation_block":"Block","error_invalid_id":"Invalid ID","group_user_id_prompt":"Group or User ID","button_subscribe":"Subscribe","topic_name_editing_placeholder":"Freeform name of the group","channel_prompt":"This is a channel","button_create":"Create","permission_join":"Join ({val})","permission_read":"Read ({val})","permission_write":"Write ({val})","permission_pres":"Get notified ({val})","permission_admin":"Approve ({val})","permission_share":"Share ({val})","permission_delete":"Delete ({val})","permission_owner":"Owner ({val})","title_permissions":"Permissions","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","image_caption_prompt":"Image caption","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"},"es":{"validate_credential_action":"confirmar","title_tag_manager":"Etiquetas (descubrimiento de usuarios)","label_user_contacts":"Contactos:","button_add_another":"Añadir contacto","label_message_sound":"Sonido de mensaje:","label_push_notifications":"Alertas de notificaciones:","label_push_notifications_disabled":"Alertas de notificaciones (requiere HTTPS):","label_incognito_mode":"Modo incógnito:","delete_account":"Eliminar cuenta","delete_account_arning":"¿Estás seguro de que deseas eliminar permanentemente tu cuenta? Esta acción es irreversible.","label_password":"Contraseña","password_unchanged_prompt":"Sin cambios","button_logout":"Cerrar sesión","button_delete_account":"Eliminar cuenta","label_default_access_mode":"Modo de acceso predeterminado:","blocked_contacts_link":"Contactos bloqueados ({count})","link_contact_us":"Contáctanos","link_terms_of_service":"Términos de uso","link_privacy_policy":"Política de privacidad","label_sdk":"SDK:","label_server_address":"Dirección del servidor:","archived_contacts":"Contactos archivados ({count})","contacts_not_found":"No tienes chats
¯∖_(ツ)_/¯","full_name_prompt":"Nombre completo, p.ej. Juan González Hernández","email_prompt":"Correo electrónico, p.ej. juan@example.com","button_sign_up":"Regístrate","label_your_name":"Tu nombre","label_user_id":"ID:","button_edit":"Editar","requested_permissions":"Solicitados","granted_permissions":"Otorgados","menu_item_edit_permissions":"Editar permisos","label_other_user":"Otros","action_clear_messages":"Borrar mensajes","clear_messages_warning":"¿Estás seguro de que quieres eliminar todos los mensajes? Esta acción es irreversible.","action_delete_messages":"Borrar mensajes para todos","delete_messages_warning":"¿Estás seguro de que quieres eliminar todos los mensajes para todos? Esta acción es irreversible.","action_leave_chat":"Dejar conversación","leave_chat_warning":"¿Estás seguro de que quieres dejar esta conversación?","action_block_contact":"Bloquear contacto","block_contact_warning":"¿Estás seguro de que quieres bloquear a este contacto?","action_report_chat":"Reportar conversación","report_chat_warning":"¿Estás seguro de que quieres bloquear y reportar a esta conversación?","title_info":"Información","label_topic_name":"Nombre del tema","label_private":"Comentario privado","private_editing_placeholder":"Sólo visible para tí","label_muting_topic":"Silenciado:","action_more":"Más","label_your_permissions":"Tus permisoss:","label_permissions":"Permisos:","label_you":"Tú:","label_default_access":"Modo de acceso predeterminado:","label_group_members":"Miembros del grupo:","button_add_members":"Añadir miembros","group_has_no_members":"No hay miembros","login_prompt":"Nombre de usuario","password_prompt":"Contraseña","stay_logged_in":"Permanecer conectado","forgot_password_link":"¿Olvidaste tu contraseña?","button_sign_in":"Entrar","label_client":"Cliente:","label_server":"Servidor:","online_now":"en línea","last_seen_timestamp":"Últ. vez","title_not_found":"No encontrado","unnamed_topic":"Sin nombre","messages_not_readable":"sin acceso a mensajes","peers_messaging_disabled":"La mensajería Peer está deshabilitada.","enable_peers_messaging":"Habilitar","search_for_contacts":"Usa la búsqueda para encontrar contactos","search_no_results":"La búsqueda no arrojó resultados","tabtitle_find_user":"encontrar","tabtitle_new_group":"nuevo grupo","tabtitle_group_by_id":"por ID","new_password_placeholder":"Introduzca una nueva contraseña","label_reset_password":"Enviar un correo electrónico de restablecimiento de contraseña:","credential_email_prompt":"Tu correo electrónico de registro","button_reset":"Restablecer","button_send_request":"Enviar petición","label_server_to_use":"Servidor para usar:","label_wire_transport":"Transporte de alambre:","button_update":"Actualizar","sidepanel_title_login":"Iniciar sesión","sidepanel_title_register":"Crear cuenta","sidepanel_title_settings":"Ajustes","sidepanel_title_account_settings":"Ajustes de la cuenta","sidepanel_title_acc_general":"General","sidepanel_title_acc_security":"Seguridad","sidepanel_title_acc_notifications":"Notificaciones","sidepanel_title_acc_support":"Soporte","sidepanel_title_newtpk":"Iniciar un nuevo chat","sidepanel_title_cred":"Confirmar credenciales","sidepanel_title_reset":"Restablecer contraseña","sidepanel_title_archive":"Chats archivados","sidepanel_title_blocked":"Chats bloqueados","update_available":"Actualización disponible.","reload_update":"Recargar","reconnect_countdown":"Desconectado. Reconectando en {seconds}…","reconnect_now":"Reintentar","push_init_failed":"Error al inicializar las notificaciones push","invalid_security_token":"Token de seguridad inválido","no_connection":"Sin conexión","code_doesnot_match":"El código no coincide","phone_dative":"teléfono","email_dative":"correo electrónico","enter_confirmation_code_prompt":"Intruduzca el código de confirmación enviado a tu {method}:","numeric_confirmation_code_prompt":"Sólo números","button_confirm":"Confirmar","save_attachment":"guardar","deleted_content":"este mensaje fue eliminado","invalid_content":"contenido inválido","user_not_found":"Usuario no encontrado","badge_you":"tú","badge_owner":"propietario","menu_item_info":"Información","menu_item_clear_messages":"Borrar mensajes","menu_item_clear_messages_for_all":"Borrar para todos","menu_item_delete":"Eliminar","menu_item_delete_for_all":"Eliminar para todos","menu_item_send_retry":"Inténtalo de nuevo","menu_item_mute":"Silenciar","menu_item_unmute":"Anular el silencio","menu_item_delete_topic":"Eliminar","topic_delete_warning":"¿Estás seguro de que quieres eliminar esta conversación?","menu_item_unblock":"Desbloquear","menu_item_block":"Bloquear","topic_block_warning":"¿Estás seguro de que quieres bloquear esta conversación","menu_item_member_delete":"Eliminar","menu_item_archive_topic":"Archivar","action_cancel":"cancelar","upload_finishing":"terminando...","no_contacts":"No tienes contactos :-(","contacts_not_found_short":"Ningún contacto coincide con \'\'{query}\'\'","title_group_members":"Miembros del grupo","title_all_contacts":"Todos los contactos","button_ok":"OK","button_cancel":"Cancelar","more_online_members":"+{overflow} más","download_action":"descargar","label_file_name":"Nombre del archivo:","label_content_type":"Tipo de contenido:","label_size":"Tamaño:","chat_invitation":"Estás invitado a participar en un nuevo chat. ¿Qué te gustaría hacer?","chat_invitation_accept":"Aceptar","chat_invitation_ignore":"Ignorar","chat_invitation_block":"Bloquear","error_invalid_id":"ID inválido","group_user_id_prompt":"ID del grupo o usuario","button_subscribe":"Suscribirse","topic_name_editing_placeholder":"Nombre del grupo","button_create":"Crear","permission_join":"Unirse ({val})","permission_read":"Leer ({val})","permission_write":"Escribir ({val})","permission_pres":"Ser notificado ({val})","permission_admin":"Approbar ({val})","permission_share":"Compartir ({val})","permission_delete":"Eliminar ({val})","permission_owner":"Propietario ({val})","title_permissions":"Permisos","message_sending":"enviando...","message_sending_failed":"no se pudo enviar el mensaje","search_placeholder":"Ej. email:alice@example.com, tel:17025550003...","messaging_disabled_prompt":"El envío de mensajes está deshabilitado","new_message_prompt":"Nuevo mensaje","image_caption_prompt":"Añade un comentario","file_attachment_too_large":"El tamaño del archivo {size} excede el límite de {limit}.","cannot_initiate_file_upload":"No se pudo iniciar la carga del archivo.","tags_not_found":"No hay etiquetas definidas. Añade unas.","tags_editor_no_tags":"Añadir etiquetas","title_manage_tags":"Gestionar","channel_prompt":"Este es un canal","channel":"canal"},"ko":{"validate_credential_action":"확인","title_tag_manager":"태그(사용자검색)","label_user_contacts":"연락처: ","button_add_another":"다른항목추가","label_message_sound":"메시지소리: ","label_push_notifications":"통지경보: ","label_push_notifications_disabled":"통지경보(HTTPS필요): ","label_incognito_mode":"시크릿모드: ","delete_account":"계정삭제","delete_account_arning":"계정을삭제하시겠습니까?실행취소할수없습니다.","label_password":"비밀번호","password_unchanged_prompt":"변경되지않음","button_logout":"로그아웃","button_delete_account":"계정삭제","label_default_access_mode":"기본액세스모드: ","blocked_contacts_link":"차단된연락처({수})","link_contact_us":"문의처","link_terms_of_service":"서비스약관","link_privacy_policy":"개인정보보호정책","label_sdk":"SDK:","label_server_address":"서버주소: ","archived_contacts":"보관된연락처({수})","contacts_not_found":"채팅이없습니다
¯∖_(ツ)_/¯","full_name_prompt":"전체이름(예:홍길동)","email_prompt":"이메일(예:hong@example.com)","button_sign_up":"가입","label_your_name":"이름","label_user_id":"ID:","button_edit":"편집","requested_permissions":"요청","menu_item_edit_permissions":"편집권한","label_other_user":"기타","action_clear_messages":"메시지지우기","clear_messages_warning":"모든메시지를지우시겠습니까?실행취소할수없습니다.","action_delete_messages":"모든메시지지우기","delete_messages_warning":"모든사람의모든메시지를삭제하시겠습니까?실행취소할수없습니다.","action_leave_chat":"대화나누기","leave_chat_warning":"이대화를나가시겠습니까?","action_block_contact":"연락차단","block_contact_warning":"이연락처를차단하시겠습니까?","action_report_chat":"대화기록","report_chat_warning":"이대화를차단하고기록하시겠습니까?","title_info":"정보","label_topic_name":"이름","label_private":"개인코멘트","private_editing_placeholder":"나만볼수있습니다","label_muting_topic":"음소거: ","action_more":"더보기","label_your_permissions":"권한: ","label_permissions":"권한: ","label_you":"당신: ","label_default_access":"기본액세스모드: ","label_group_members":"그룹회원: ","button_add_members":"회원추가","group_has_no_members":"회원없음","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":"이름없는","peers_messaging_disabled":"동료의메시지가비활성화되었습니다.","enable_peers_messaging":"활성화","search_for_contacts":"검색을사용하여연락처찾기","search_no_results":"검색결과가없습니다","tabtitle_find_user":"찾기","tabtitle_new_group":"새그룹","tabtitle_group_by_id":"id로","new_password_placeholder":"새비밀번호입력","label_reset_password":"비밀번호재설정이메일보내기: ","credential_email_prompt":"등록이메일","button_reset":"재설정","button_send_request":"요청보내기","label_server_to_use":"사용할서버:","label_wire_transport":"와이어수송:","button_update":"업데이트","sidepanel_title_login":"로그인","sidepanel_title_register":"계정만들기","sidepanel_title_settings":"설정","sidepanel_title_account_settings":"계정설정","sidepanel_title_acc_general":"일반","sidepanel_title_acc_security":"보안","sidepanel_title_acc_notifications":"알림","sidepanel_title_acc_support":"지원","sidepanel_title_newtpk":"새채팅시작","sidepanel_title_cred":"자격증명확인","sidepanel_title_reset":"비밀번호재설정","sidepanel_title_archive":"보관된채팅","sidepanel_title_blocked":"차단된채팅","update_available":"업데이트가능.","reload_update":"재로드","reconnect_countdown":"연결이끊어졌습니다.다시연결하는중{초}…","reconnect_now":"지금시도","push_init_failed":"푸시알림을초기화하지못했습니다","invalid_security_token":"유효하지않은보안토큰","no_connection":"연결없음","code_doesnot_match":"코드가일치하지않습니다","phone_dative":"전화","email_dative":"이메일","enter_confirmation_code_prompt":"{방법}으로보낸확인코드를입력하십시오:","numeric_confirmation_code_prompt":"숫자만","button_confirm":"확인","save_attachment":"저장","invalid_content":"잘못된내용","user_not_found":"찾을수없음","badge_you":"당신","badge_owner":"소유자","menu_item_info":"정보","menu_item_clear_messages":"메시지지우기","menu_item_clear_messages_for_all":"모두지우기","menu_item_delete":"삭제","menu_item_delete_for_all":"모두삭제","menu_item_send_retry":"다시시도","menu_item_mute":"음소거","menu_item_unmute":"음소거해제","menu_item_delete_topic":"삭제","topic_delete_warning":"이대화를삭제하시겠습니까?","menu_item_unblock":"차단해제","menu_item_block":"차단","topic_block_warning":"이대화를차단하시겠습니까?","menu_item_member_delete":"제거","menu_item_archive_topic":"보관","action_cancel":"취소","upload_finishing":"마무리...","no_contacts":"연락처가없습니다 (._.)","contacts_not_found_short":"\'{문의}\'와일치하는연락처가없습니다.","title_group_members":"그룹구성원","title_all_contacts":"모든연락처","button_ok":"OK","button_cancel":"취소","more_online_members":"+{넘침}더보기","download_action":"다운로드","label_file_name":"파일이름: ","label_content_type":"컨텐츠유형: ","label_size":"크기: ","chat_invitation":"새로운대화를시작하도록초대되었습니다.무엇을하시겠습니까?","chat_invitation_accept":"수락","chat_invitation_ignore":"무시","chat_invitation_block":"차단","error_invalid_id":"잘못된ID","group_user_id_prompt":"그룹또는사용자ID","button_subscribe":"구독","topic_name_editing_placeholder":"그룹의자유형이름","button_create":"작성","permission_join":"참여({val})","permission_read":"읽기({val})","permission_write":"쓰기({val})","permission_pres":"알림받기({val})","permission_admin":"승인({val})","permission_share":"공유({val})","permission_delete":"삭제({val})","permission_owner":"소유자({val})","title_permissions":"권한","message_sending":"보내기...","message_sending_failed":"실패","search_placeholder":"email:alice@example.com,tel:17025550003...와같은목록","messaging_disabled_prompt":"메시지비활성화","new_message_prompt":"새메시지","image_caption_prompt":"이미지설명","file_attachment_too_large":"파일크기{크기}이(가){제한}제한을초과합니다.","cannot_initiate_file_upload":"파일업로드를시작할수없습니다.","tags_not_found":"태그가정의되지않았습니다.일부를추가하십시오.","tags_editor_no_tags":"일부태그추가","title_manage_tags":"관리","granted_permissions":"승낙하다","messages_not_readable":"메시지에 액세스 할 수 없습니다","deleted_content":"내용이 삭제되었습니다","channel_prompt":"이 채널입니다","channel":"채널"},"ro":{"validate_credential_action":"confirmă","title_tag_manager":"Tag-uri (user discovery)","label_user_contacts":"Contacte:","button_add_another":"Adaugă","label_message_sound":"Sunet de mesaj:","label_push_notifications":"Alerte de notificare:","label_push_notifications_disabled":"Alerte de notificare (necesită HTTPS):","label_incognito_mode":"Mod incognito:","delete_account":"Șterge contul","delete_account_arning":"Ești sigur că dorești să ștergi contul? Acesta nu va putea fi recuperat.","label_password":"Parola","password_unchanged_prompt":"Neschimbată","button_logout":"Deconectare","button_delete_account":"Șterge cont","label_default_access_mode":"Default access mode:","blocked_contacts_link":"Contact blocate ({count})","link_contact_us":"Contactează-ne","link_terms_of_service":"Termenii Serviciului","link_privacy_policy":"Politica de Confidențialitate","label_sdk":"SDK:","label_server_address":"Adresa serverului:","archived_contacts":"Contacte arhivate ({count})","contacts_not_found":"Nu ai contacte salvate
¯∖_(ツ)_/¯","full_name_prompt":"Numele tău","email_prompt":"Adresa de e-mail","button_sign_up":"Creează cont","label_your_name":"Numele tău","label_user_id":"ID:","button_edit":"Editează","requested_permissions":"Necesare","granted_permissions":"Oferite","menu_item_edit_permissions":"Editează permisiuni","label_other_user":"Altele","action_clear_messages":"Șterge mesajele","clear_messages_warning":"Ești sigur că dorești să ștergi mesajele? Acestea nu pot fi recuperate.","action_delete_messages":"Șterge toate mesajele","delete_messages_warning":"Ești sigur că dorești să șterge mesajele din toate conversațiile? Acestea nu pot fi recuperate.","action_leave_chat":"Ieși din conversație","leave_chat_warning":"Ești sigur că dorești să ieși din conersație?","action_block_contact":"Blochează contact","block_contact_warning":"Ești sigur că dorești să blochezi acest contact?","action_report_chat":"Raportează conversația","report_chat_warning":"Ești sigur că dorești să blochezi și să raportezi această conversație?","title_info":"Info","label_topic_name":"Nume","label_private":"Comentariu privat","private_editing_placeholder":"Vizibil doar ție","label_muting_topic":"Mod silențios (muted):","action_more":"Mai multe","label_your_permissions":"Permisiuniile tale:","label_permissions":"Permisiuni:","label_you":"Tu:","label_default_access":"Modul default:","label_group_members":"Membrii grupului:","button_add_members":"Adaugă persoane","group_has_no_members":"În acest grup nu se află persoane","login_prompt":"Conectează-te","password_prompt":"Parola","stay_logged_in":"Rămâi conectat","forgot_password_link":"Ți-ai uitat parola?","button_sign_in":"Conectează-te","label_client":"Client:","label_server":"Server:","online_now":"online acum","last_seen_timestamp":"Văzut ultima dată","title_not_found":"Nu a fost găsit","channel":"canal","unnamed_topic":"Nedenumit","messages_not_readable":"Mesajele nu pot fi citite","peers_messaging_disabled":"Mesageria de tip Peer este dezactivată.","enable_peers_messaging":"Activează","search_for_contacts":"Caută în contacte","search_no_results":"Nu s-au găsit rezultate","tabtitle_find_user":"caută","tabtitle_new_group":"grup nou","tabtitle_group_by_id":"după id","new_password_placeholder":"Introdu parolă","label_reset_password":"Resetează parola:","credential_email_prompt":"Adresa de e-mail","button_reset":"Resetează","button_send_request":"Trimite cerere","label_server_to_use":"Server de utilizat:","label_wire_transport":"Transportul legat:","button_update":"Actualizează","sidepanel_title_login":"Conectează-te","sidepanel_title_register":"Creează Cont","sidepanel_title_settings":"Setări","sidepanel_title_account_settings":"Setările Contului","sidepanel_title_acc_general":"Generale","sidepanel_title_acc_security":"Securitate","sidepanel_title_acc_notifications":"Notificări","sidepanel_title_acc_support":"Ajutor","sidepanel_title_newtpk":"Creeză un nou Chat","sidepanel_title_cred":"Confirmă credențiale","sidepanel_title_reset":"Resetează Parola","sidepanel_title_archive":"Conversații Arhivate","sidepanel_title_blocked":"Conversații Blocate","reconnect_countdown":"Deconectat. Se încearcă conectarea în {seconds}…","reconnect_now":"Încearcă din nou","push_init_failed":"Nu s-a reușit inițializarea tip push notifications","invalid_security_token":"Codul de securitate este invalid","no_connection":"Nu există conexiune","code_doesnot_match":"Codul furnizat nu este valid","update_available":"Actualizare disponibilă.","reload_update":"Reîncarcă","phone_dative":"telefon","email_dative":"email","enter_confirmation_code_prompt":"Introu codul de confirmare trimis pe {method}:","numeric_confirmation_code_prompt":"Doar cifre","button_confirm":"Confirmă","save_attachment":"salvează","deleted_content":"conținut șters","invalid_content":"conținut invalid","user_not_found":"Utilizatorul nu a fost găsit","badge_you":"tu","badge_owner":"owner","menu_item_info":"Info","menu_item_clear_messages":"Șterge mesajele","menu_item_clear_messages_for_all":"Ștergele pe toate","menu_item_delete":"Șterge","menu_item_delete_for_all":"Ștergele pe toate","menu_item_send_retry":"Reîncearcă","menu_item_mute":"Mute","menu_item_unmute":"Unmute","menu_item_delete_topic":"Șterge","topic_delete_warning":"Ești sigur că dorești să șterge această conversație?","menu_item_unblock":"Deblochează","menu_item_block":"Blochează","topic_block_warning":"Ești sigur că dorești să blochezi această conversație?","menu_item_member_delete":"Șterge persoană","menu_item_archive_topic":"Arhivează","action_cancel":"anulează","upload_finishing":"se încarcă...","no_contacts":"Nu ai contacte adăugate :-(","contacts_not_found_short":"Niciun contact găsit după criteriile \'\'{query}\'\'","title_group_members":"Persoanele din grup","title_all_contacts":"Toate Contactele","button_ok":"OK","button_cancel":"Anulează","more_online_members":"+{overflow} mai mult","download_action":"download","label_file_name":"Nume fișier:","label_content_type":"Tip conținut:","label_size":"Size:","chat_invitation":"Ai primit invitație într-o conversație. Accepți?","chat_invitation_accept":"Da, accept","chat_invitation_ignore":"Ignoră","chat_invitation_block":"Blochează","error_invalid_id":"ID Invalid","group_user_id_prompt":"Grup sau user ID","button_subscribe":"Subscribe","topic_name_editing_placeholder":"Numele grupului","channel_prompt":"Acesta este un canal","button_create":"Creează","permission_join":"Participare ({val})","permission_read":"Citire ({val})","permission_write":"Scriere ({val})","permission_pres":"Notificare ({val})","permission_admin":"Aprobare ({val})","permission_share":"Distribuire ({val})","permission_delete":"Ștergere ({val})","permission_owner":"Deținător ({val})","title_permissions":"Permisiuni","message_sending":"se trimite...","message_sending_failed":"eroare","search_placeholder":"Caută după e-mail sau număr telefon...","messaging_disabled_prompt":"Mesageria este dezactivată","new_message_prompt":"Mesaj nou","image_caption_prompt":"Titlul imaginii","file_attachment_too_large":"Dimensiunea fișiterului {size} depășește limita de {limit}.","cannot_initiate_file_upload":"Nu se poate face încărcarea.","tags_not_found":"Niciun tag definit. Adaugă.","tags_editor_no_tags":"Adaugă tag-uri","title_manage_tags":"Administrează"},"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":"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_account_settings":"Настройки аккаунта","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":"Ошибка загрузки файла.","search_for_contacts":"Поиск контактов","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":"Размер:","phone_dative":"телефону","email_dative":"емейлу","title_group_members":"Участники","download_action":"скачать","permission_join":"Подписываться ({val})","permission_read":"Читать ({val})","permission_write":"Писать ({val})","permission_pres":"Уведомлять ({val})","permission_admin":"Подтверждать ({val})","permission_share":"Приглашать ({val})","permission_delete":"Удалять ({val})","permission_owner":"Владелец ({val})","title_permissions":"Права доступа","requested_permissions":"Требуются","granted_permissions":"Получены","menu_item_edit_permissions":"Права доступа","label_other_user":"Второй","label_topic_name":"Название","label_private":"Комментарий","private_editing_placeholder":"Виден только вам","label_muting_topic":"Без уведомлений","action_more":"Ещё","label_your_permissions":"Ваши права доступа:","label_permissions":"Права доступа:","label_you":"Вы:","label_default_access":"Права по умолчанию:","label_group_members":"Участники чата:","button_add_members":"Добавить","group_has_no_members":"Нет участников","action_leave_chat":"Уйти из чата","menu_item_info":"Информация","menu_item_clear_messages":"Удалить сообщения","menu_item_clear_messages_for_all":"Удалить для всех","menu_item_delete":"Удалить","menu_item_delete_for_all":"Удалить для всех","menu_item_send_retry":"Отправить заново","menu_item_mute":"Не уведомлять","menu_item_unmute":"Уведомлять","menu_item_delete_topic":"Удалить чат","menu_item_unblock":"Разблокировать","menu_item_block":"Заблокировать","menu_item_member_delete":"Отписать","title_info":"Подробности","new_password_placeholder":"Введите новый пароль","label_reset_password":"Отправить емейл для смены пароля:","credential_email_prompt":"Регистрационный емейл","button_reset":"Изменить","button_send_request":"Отправить","action_cancel":"отменить","upload_finishing":"завершение...","no_contacts":"Ничего нет :-(","contacts_not_found_short":"Нет контактов для запроса \'\'{query}\'\'","title_all_contacts":"Все контакты","error_invalid_id":"Неверный ID","group_user_id_prompt":"ID чата или пользователя","button_subscribe":"Подписаться","topic_name_editing_placeholder":"Название чата","button_create":"Создать","badge_you":"вы","badge_owner":"влад.","update_available":"Есть новая версия приложения.","reload_update":"Обновить","user_not_found":"Не найден","reconnect_countdown":"Нет связи. Подключение через {seconds}…","reconnect_now":"Подключить сейчас.","save_attachment":"сохранить","menu_item_archive_topic":"В архив","archived_contacts":"Чаты в архиве ({count})","sidepanel_title_archive":"Архив чатов","chat_invitation":"Вас пригласили начать новый чат. Как вы хотите поступить?","chat_invitation_accept":"Принять","chat_invitation_ignore":"Игнорировать","chat_invitation_block":"Заблокировать","peers_messaging_disabled":"Чат заблокирован у корреспондента.","enable_peers_messaging":"Разблокировать.","more_online_members":"+еще {overflow}","label_user_contacts":"Конакты:","validate_credential_action":"подтвердить","link_contact_us":"Связаться с нами","link_terms_of_service":"Условия сервиса","link_privacy_policy":"Политика конфиденциальности","action_delete_messages":"Удалить сообщения","action_block_contact":"Заблокировать контакт","action_report_chat":"Сообщить о нарушении","delete_messages_warning":"Вы действительно хотите удалить все сообщения?","leave_chat_warning":"Вы действительно хотите покинуть этот чат?","block_contact_warning":"Вы действительно заблокировать этот контакт?","report_chat_warning":"Вы действительно хотите сообщить о нарушении и заблокировать этот чат?","action_clear_messages":"Удалить сообщения","clear_messages_warning":"Вы действительно хотите удалить все сообщения в чате? Их будет невозможно восстановить.","topic_delete_warning":"Вы действительно хотите удалить этот чат?","topic_block_warning":"Вы действительно хотите заблокировать этот чат?","search_no_results":"Ничего не найдено","deleted_content":"удалено","image_caption_prompt":"Подпись к фото","label_incognito_mode":"Режим инкогнито:","delete_account":"Удалить аккаунт","delete_account_arning":"Вы уверены, что ходите удалить свой аккаунт? Его невозможно будет восстановить.","button_delete_account":"Удалить аккаунт","sidepanel_title_acc_security":"Безопасность","sidepanel_title_acc_notifications":"Уведомления","sidepanel_title_acc_support":"Поддержка","label_sdk":"SDK:","label_server_address":"Адрес сервера:","button_edit":"Редактировать","button_add_another":"Добавить","sidepanel_title_acc_general":"Общие настройки","blocked_contacts_link":"Заблокированные ({count})","sidepanel_title_blocked":"Заблокированные чаты","push_init_failed":"Ошибка инициализации пуш уведомлений","invalid_security_token":"Токен некорректен","no_connection":"Нет связи","code_doesnot_match":"Код не совпадает","channel_prompt":"Создать канал","channel":"канал"},"zh":{"archived_contacts":"已归档联系人 ({count})","contacts_not_found":"你尚无会话
¯∖_(ツ)_/¯","full_name_prompt":"全名,例如张伟","email_prompt":"电子邮件,例如 zhang@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":"登出","requested_permissions":"已请求","granted_permissions":"已授予","menu_item_edit_permissions":"编辑权限","label_other_user":"其他","title_info":"信息","label_topic_name":"名称","label_private":"私人评论","private_editing_placeholder":"仅自己可见","label_muting_topic":"已静音:","action_more":"更多","label_your_permissions":"你的权限:","label_permissions":"权限:","label_you":"你:","label_default_access":"默认权限模式:","label_group_members":"群组成员:","button_add_members":"添加成员","group_has_no_members":"无成员","action_leave_chat":"离开","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":"无消息访问权限","peers_messaging_disabled":"成员间消息已禁用。","enable_peers_messaging":"启用","tabtitle_find_user":"搜索","tabtitle_new_group":"新群组","tabtitle_group_by_id":"通过 id","search_for_contacts":"使用搜索寻找联系人","new_password_placeholder":"输入新密码","label_reset_password":"发送密码重置邮件:","credential_email_prompt":"你的注册邮箱","button_reset":"重置","button_send_request":"发送请求","label_server_to_use":"使用的服务器:","label_wire_transport":"线路传输:","button_update":"更新","sidepanel_title_login":"登录","sidepanel_title_register":"创建账户","sidepanel_title_settings":"设置","sidepanel_title_account_settings":"帐号设定","sidepanel_title_newtpk":"开始新会话","sidepanel_title_cred":"确认凭据","sidepanel_title_reset":"重置密码","sidepanel_title_archive":"已存档会话","update_available":"更新可用。","reload_update":"重新载入","reconnect_countdown":"连接已断开。{seconds} 秒后重新连接…","reconnect_now":"立即尝试","phone_dative":"电话","email_dative":"电子邮件","enter_confirmation_code_prompt":"输入通过{method}发送的验证码:","numeric_confirmation_code_prompt":"仅数字","button_confirm":"确认","save_attachment":"保存","invalid_content":"无效内容","user_not_found":"未找到","badge_you":"你","badge_owner":"所有者","menu_item_info":"信息","menu_item_clear_messages":"清空消息","menu_item_clear_messages_for_all":"全部清除","menu_item_delete":"删除","menu_item_delete_for_all":"全部删除","menu_item_mute":"静音","menu_item_unmute":"取消静音","menu_item_delete_topic":"删除","menu_item_unblock":"取消屏蔽","menu_item_block":"屏蔽","menu_item_member_delete":"移除","menu_item_archive_topic":"归档","action_cancel":"取消","upload_finishing":"正在结束...","no_contacts":"你尚无联系人 (._.)","contacts_not_found_short":"无联系人匹配\'\'{query}\'\'","title_group_members":"群组成员","title_all_contacts":"全部联系人","button_ok":"好","button_cancel":"取消","download_action":"下载","label_file_name":"文件名:","label_content_type":"内容类型:","label_size":"大小:","chat_invitation":"你受邀开始新会话。你想怎么做?","chat_invitation_accept":"接受","chat_invitation_ignore":"忽略","chat_invitation_block":"屏蔽","error_invalid_id":"无效 ID","group_user_id_prompt":"群组或用户 ID","button_subscribe":"订阅","topic_name_editing_placeholder":"群组自由格式名称","button_create":"创建","permission_join":"加入 ({val})","permission_read":"读取 ({val})","permission_write":"写入 ({val})","permission_pres":"获取通知 ({val})","permission_admin":"批准 ({val})","permission_share":"分享 ({val})","permission_delete":"删除 ({val})","permission_owner":"所有者 ({val})","title_permissions":"权限","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":"无法初始化文件上传。","tags_not_found":"尚未定义标签。添加一些。","tags_editor_no_tags":"添加一些标签","title_manage_tags":"管理标签","more_online_members":"还有{overflow}个","label_user_contacts":"往来:","validate_credential_action":"确认","link_contact_us":"联系我们","link_terms_of_service":"条款和条件","link_privacy_policy":"隐私政策","action_delete_messages":"删除所有帖子","action_block_contact":"屏蔽联系人","delete_messages_warning":"您确定要删除所有消息吗?无法撤消。","leave_chat_warning":"您确定要退出此对话吗?","block_contact_warning":"您确定要阻止此联系人吗?","action_report_chat":"检举垃圾邮件","report_chat_warning":"您确定要停止并报告此对话吗?","action_clear_messages":"删除讯息","clear_messages_warning":"您确定要清除所有消息吗?无法撤消。","topic_delete_warning":"您确定要删除此对话吗?","topic_block_warning":"您确定要阻止此对话吗?","search_no_results":"搜索返回任何结果","deleted_content":"内容已删除","image_caption_prompt":"图片标题","menu_item_send_retry":"重试","label_incognito_mode":"无痕模式:","delete_account":"删除帐户","delete_account_arning":"您确定要删除您的帐户吗?无法撤消。","button_delete_account":"删除帐户","sidepanel_title_acc_security":"安全","sidepanel_title_acc_notifications":"通知","sidepanel_title_acc_support":"支持","label_sdk":"开发包:","label_server_address":"服务器地址:","button_edit":"编辑","button_add_another":"加上另一个","sidepanel_title_acc_general":"常用设定","blocked_contacts_link":"封锁的联络人 ({count})","sidepanel_title_blocked":"被阻止的聊天","push_init_failed":"初始化推送通知失败","invalid_security_token":"无效的安全令牌","no_connection":"无连接","code_doesnot_match":"代码不匹配","channel_prompt":"这是一个频道","channel":"频道"}}')},react:function(e){e.exports=React},"react-dom":function(e){e.exports=ReactDOM},"react-intl":function(e){e.exports=ReactIntl},"tinode-sdk":function(e){e.exports=Tinode},"firebase/app":function(e){e.exports=firebase},"firebase/messaging":function(e){e.exports=firebase.messaging}},t={};function s(a){if(t[a])return t[a].exports;var i=t[a]={exports:{}};return e[a](i,i.exports,s),i.exports}s.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return s.d(t,{a:t}),t},s.d=function(e,t){for(var a in t)s.o(t,a)&&!s.o(e,a)&&Object.defineProperty(e,a,{enumerable:!0,get:t[a]})},s.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},s.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},s("./src/index.js")}(); +!function(){"use strict";var e={"./src/config.js":function(e,t,s){s.r(t),s.d(t,{APP_NAME:function(){return a},API_KEY:function(){return n},KNOWN_HOSTS:function(){return i},DEFAULT_HOST:function(){return o},LOGGING_ENABLED:function(){return r},KEYPRESS_DELAY:function(){return l},RECEIVED_DELAY:function(){return c},READ_DELAY:function(){return d},MIN_TAG_LENGTH:function(){return h},MAX_TAG_LENGTH:function(){return p},MAX_TAG_COUNT:function(){return u},DEFAULT_P2P_ACCESS_MODE:function(){return m},NEW_GRP_ACCESS_MODE:function(){return _},CHANNEL_ACCESS_MODE:function(){return g},NO_ACCESS_MODE:function(){return b},MEDIA_BREAKPOINT:function(){return v},REM_SIZE:function(){return f},AVATAR_SIZE:function(){return E},BROKEN_IMAGE_SIZE:function(){return w},MESSAGES_PAGE:function(){return S},MAX_INBAND_ATTACHMENT_SIZE:function(){return C},MAX_EXTERN_ATTACHMENT_SIZE:function(){return M},MAX_IMAGE_DIM:function(){return y},IMAGE_PREVIEW_DIM:function(){return k},MAX_ONLINE_IN_TOPIC:function(){return T},MAX_TITLE_LENGTH:function(){return N},LINK_CONTACT_US:function(){return A},LINK_PRIVACY_POLICY:function(){return P},LINK_TERMS_OF_SERVICE:function(){return x}});const a="TinodeWeb/"+(s("./src/version.js").PACKAGE_VERSION||"0.16"),n="AQEAAAABAAD_rAp4DJh05a1HAwFT3A6K",i={hosted:"web.tinode.co",local:"localhost:6060"},o=i.hosted,r=!0,l=3e3,c=500,d=1e3,h=2,p=96,u=16,m="JRWPS",_="JRWPSAO",g="JR",b="N",v=640,f=13,E=128,w=32,S=24,C=262144,M=1<<23,y=1024,k=64,T=4,N=60,A="email:info@tinode.co",P="https://tinode.co/privacy.html",x="https://tinode.co/terms.html"},"./src/index.js":function(e,t,s){s.r(t);var a=s("react"),n=s.n(a),i=s("react-dom"),o=s.n(i),r=s("react-intl"),l=s("./src/messages.json"),c=s("./src/views/tinode-web.jsx"),d=s("./src/lib/navigation.js");const{params:h}=d.default.parseUrlHash(window.location.hash),p=h&&h.hl||navigator.languages&&navigator.languages[0]||navigator.language||navigator.userLanguage||"en",u=p.toLowerCase().split(/[-_]/)[0],m=l[p]||l[u]||l.en;o().render(n().createElement(r.IntlProvider,{locale:p,messages:m,textComponent:n().Fragment},n().createElement(c.default,null)),document.getElementById("mountPoint"))},"./src/lib/blob-helpers.js":function(e,t,s){s.r(t),s.d(t,{SUPPORTED_IMAGE_FORMATS:function(){return n},MIME_EXTENSIONS:function(){return i},makeImageUrl:function(){return o},fitImageSize:function(){return r},fileNameForMime:function(){return l},imageScaled:function(){return c},fileToBase64:function(){return d},blobToBase64:function(){return h},filePasted:function(){return p},getMimeType:function(){return u},base64EncodedLen:function(){return m},base64DecodedLen:function(){return _},base64ReEncode:function(){return g}});var a=s("./src/config.js");s("./src/lib/strformat.js");const n=["image/jpeg","image/gif","image/png","image/svg","image/svg+xml"],i=["jpg","gif","png","svg","svg"];function o(e){return e&&e.type&&e.data?"data:image/"+e.type+";base64,"+e.data:null}function r(e,t,s,a,n){if(t|=0,s|=0,a|=0,(e|=0)<=0||t<=0||s<=0||a<=0)return null;n&&(s=a=Math.min(s,a));let i=Math.min(Math.min(e,s)/e,Math.min(t,a)/t),o={dstWidth:e*i|0,dstHeight:t*i|0};return n?(o.dstWidth=o.dstHeight=Math.min(o.dstWidth,o.dstHeight),o.srcWidth=o.srcHeight=Math.min(e,t),o.xoffset=(e-o.srcWidth)/2|0,o.yoffset=(t-o.srcWidth)/2|0):(o.xoffset=o.yoffset=0,o.srcWidth=e,o.srcHeight=t),o}function l(e,t){const s=n.indexOf(t);if(s<0||!e)return e;const a=i[s],o=e.lastIndexOf(".");return o>=0&&(e=e.substring(0,o)),e+"."+a}function c(e,t,s,a,i,o,c){const d=new Image;d.crossOrigin="Anonymous",d.onerror=function(e){c("Image format unrecognized")},d.onload=async function(){URL.revokeObjectURL(d.src);const h=r(this.width,this.height,t,s,i);if(!h)return void c("Invalid image");let p=document.createElement("canvas");p.width=h.dstWidth,p.height=h.dstHeight;let u=p.getContext("2d");u.imageSmoothingEnabled=!0,u.drawImage(this,h.xoffset,h.yoffset,h.srcWidth,h.srcHeight,0,0,h.dstWidth,h.dstHeight);const m=n.indexOf(e.type)<0?"image/jpeg":e.type;let _=await new Promise((e=>p.toBlob(e,m)));if(_){for(;a>0&&_.length>a;)h.dstWidth=.70710678118*h.dstWidth|0,h.dstHeight=.70710678118*h.dstHeight|0,p.width=h.dstWidth,p.height=h.dstHeight,u=p.getContext("2d"),u.clearRect(0,0,p.width,p.height),u.drawImage(this,h.xoffset,h.yoffset,h.srcWidth,h.srcHeight,0,0,h.dstWidth,h.dstHeight),_=await new Promise((e=>p.toBlob(e,m)));p=null,o(_,m,h.dstWidth,h.dstHeight,l(e.name,m))}else c("Unsupported image format")},d.src=URL.createObjectURL(e)}function d(e,t){const s=new FileReader;s.addEventListener("load",(function(){t(e.type,s.result.split(",")[1],e.name)})),s.readAsDataURL(e)}function h(e,t){const s=new FileReader;s.addEventListener("load",(function(){t(e.type,s.result.split(",")[1])})),s.readAsDataURL(e)}function p(e,t,s,i){var o=(e.clipboardData||e.originalEvent.clipboardData||{}).items;for(var r in o){var l=o[r];if("file"===l.kind){var c=l.getAsFile();if(!c){console.log("Failed to get file object from pasted file item",l.kind,l.type);continue}return c.type&&"image"==c.type.split("/")[0]?c.size>a.MAX_INBAND_ATTACHMENT_SIZE||n.indexOf(c.type)<0?imageFileScaledToBase64(c,a.MAX_IMAGE_DIM,a.MAX_IMAGE_DIM,!1,t,i):imageFileToBase64(c,t,i):d(c,s),!0}}return!1}function u(e){var t=/^data:(image\/[-+a-z0-9.]+);base64/.exec(e);return t&&t.length>1?t[1]:null}function m(e){return 4*Math.floor((e+2)/3)}function _(e){return 3*Math.floor(e/4)}function g(e){if(e){e=e.replace(/-/g,"+").replace(/_/g,"/");try{e=btoa(atob(e))}catch(t){console.log("Failed to base64 re-encode string.",t),e=null}}return e}},"./src/lib/host-name.js":function(e,t,s){s.r(t),s.d(t,{detectServerAddress:function(){return n},isSecureConnection:function(){return i},isLocalHost:function(){return o}});var a=s("./src/config.js");function n(){let e=a.DEFAULT_HOST;return"object"==typeof window.location&&("file:"==window.location.protocol||"localhost"==window.location.hostname?e=a.KNOWN_HOSTS.local:window.location.hostname&&(e=window.location.hostname+(window.location.port?":"+window.location.port:""))),e}function i(){return"object"==typeof window.location&&"https:"==window.location.protocol}function o(){return"object"==typeof window.location&&"localhost"==window.location.hostname}},"./src/lib/local-storage.js":function(e,t,s){s.r(t),s.d(t,{default:function(){return a}});class a{static setObject(e,t){localStorage.setItem(e,JSON.stringify(t))}static getObject(e){const t=localStorage.getItem(e);return t&&JSON.parse(t)}static updateObject(e,t){const s=this.getObject(e);this.setObject(e,Object.assign(s||{},t))}static removeItem(e){localStorage.removeItem(e)}}},"./src/lib/navigation.js":function(e,t,s){s.r(t),s.d(t,{default:function(){return a}});class a{static parseUrlHash(e){const t=e.split("?",2),s={};let a=[];return t[0]&&(a=t[0].substr(1).split("/")),t[1]&&t[1].split("&").forEach((function(e){let t=e.split("=");t[0]&&(s[decodeURIComponent(t[0])]=decodeURIComponent(t[1]))})),{path:a,params:s}}static navigateTo(e){window.location.hash=e}static composeUrlHash(e,t){let s=e.join("/");const a=[];for(const e in t)t.hasOwnProperty(e)&&a.push(e+"="+t[e]);return a.length>0&&(s+="?"+a.join("&")),s}static addUrlParam(e,t,s){const a=this.parseUrlHash(e);return a.params[t]=s,this.composeUrlHash(a.path,a.params)}static removeUrlParam(e,t){const s=this.parseUrlHash(e);return delete s.params[t],this.composeUrlHash(s.path,s.params)}static setUrlSidePanel(e,t){const s=this.parseUrlHash(e);return s.path[0]=t,this.composeUrlHash(s.path,s.params)}static setUrlTopic(e,t){const s=this.parseUrlHash(e);return s.path[1]=t,delete s.params.info,this.composeUrlHash(s.path,s.params)}}},"./src/lib/strformat.js":function(e,t,s){function a(e,t){t=t||window.navigator.userLanguage||window.navigator.language;const s=new Date;return e.getFullYear()==s.getFullYear()?e.getMonth()==s.getMonth()&&e.getDate()==s.getDate()?e.toLocaleTimeString(t,{hour12:!1,hour:"2-digit",minute:"2-digit"}):e.toLocaleDateString(t,{hour12:!1,month:"short",day:"numeric",hour:"2-digit",minute:"2-digit"}):e.toLocaleDateString(t,{hour12:!1,year:"numeric",month:"short",day:"numeric",hour:"2-digit",minute:"2-digit"})}function n(e){const t=Math.floor(e/60);let s=e%60;return s=s<10?"0".concat(s):s,"".concat(t,":").concat(s)}function i(e){if(!e||0==e)return"0 Bytes";const t=["Bytes","KB","MB","GB","TB","PB"],s=Math.min(0|Math.floor(Math.log2(e)/10),t.length-1),a=e/Math.pow(1024,s),n=s>0?a<3?2:a<30?1:0:0;return a.toFixed(n)+" "+t[s]}function o(e){let t=0;e=""+e;for(let s=0;s0?"a":"")+".png",t&&s.removeChild(t),s.appendChild(a),document.title=(e>0?"("+e+") ":"")+"Tinode"}function n(e,t){let s=null;if((e&&e.trim()||t)&&(s={},e&&(s.fn=e.trim()),t)){const e=t.indexOf(",");s.photo=e>=0?{data:t.substring(e+1),type:"jpg"}:t}return s}function i(e,t){if(e===t)return!0;if(!Array.isArray(e)||!Array.isArray(t))return!1;if(e.length!=t.length)return!1;e.sort(),t.sort();for(let s=0,a=e.length;s{e.push(n().createElement("div",{key:t.meth+":"+t.val+":"+t.done},t.meth,": ",n().createElement("tt",null,t.val),n().createElement("span",null," ",t.done?null:n().createElement("a",{href:"#",onClick:e=>{e.preventDefault(),this.props.onCredConfirm(t.meth,t.val)}},n().createElement(i.FormattedMessage,{id:"validate_credential_action",defaultMessage:[{type:0,value:"confirm"}]}))," ",n().createElement("a",{href:"#",onClick:e=>{e.preventDefault(),this.props.onCredDelete(t.meth,t.val)}},n().createElement("i",{className:"material-icons gray"},"delete_outline")))))})),n().createElement("div",{className:"scrollable-panel"},n().createElement("div",{className:"panel-form-row"},n().createElement("div",{className:"panel-form-column"},n().createElement("label",{className:"small"},n().createElement(i.FormattedMessage,{id:"label_your_name"})),n().createElement("div",null,n().createElement(i.FormattedMessage,{id:"full_name_prompt"},(e=>n().createElement(c.default,{placeholder:e,value:this.state.fullName,onFinished:this.handleFullNameUpdate}))))),n().createElement(l.default,{avatar:this.state.avatar,uid:this.props.myUserId,title:this.state.fullName,onImageChanged:this.handleImageChanged,onError:this.props.onError})),n().createElement("div",{className:"hr"}),n().createElement(i.FormattedMessage,{id:"title_tag_manager",defaultMessage:[{type:0,value:"Tags (user discovery)"}]},(e=>n().createElement(d.default,{title:e,activated:!1,tags:this.state.tags,tinode:this.props.tinode,onSubmit:this.handleTagsUpdated}))),n().createElement("div",{className:"hr"}),n().createElement("div",{className:"panel-form-column"},n().createElement("label",{className:"small"},n().createElement(i.FormattedMessage,{id:"label_user_contacts",defaultMessage:[{type:0,value:"Contacts:"}]})),n().createElement("div",{className:"quoted"},e,this.state.addCredActive?n().createElement("input",{type:"text",value:this.state.value,className:this.state.addCredInvalid?"invalid":null,placeholder:"Phone number or email",required:"required",autoFocus:!0,onChange:this.handleCredChange,onKeyDown:this.handleCredKeyDown,onBlur:this.handleCredEntered}):null,n().createElement("div",null,n().createElement("a",{href:"#",onClick:e=>{e.preventDefault(),this.setState({addCredActive:!0})}},n().createElement("i",{className:"material-icons"},"add"),n().createElement(i.FormattedMessage,{id:"button_add_another",defaultMessage:[{type:0,value:"Add another"}]}))))))}}},"./src/views/acc-notifications-view.jsx":function(e,t,s){s.r(t),s.d(t,{default:function(){return r}});var a=s("react"),n=s.n(a),i=s("react-intl"),o=s("./src/widgets/checkbox.jsx");class r extends n().PureComponent{constructor(e){super(e),this.handleCheckboxClick=this.handleCheckboxClick.bind(this)}handleCheckboxClick(e,t){"sound"==e?this.props.onToggleMessageSounds(t):"alert"==e?this.props.onTogglePushNotifications(t):"incognito"==e&&this.props.onToggleIncognitoMode(t)}render(){return n().createElement("div",{className:"scrollable-panel"},n().createElement("div",{className:"panel-form-row"},n().createElement("label",{htmlFor:"message-sound"},n().createElement(i.FormattedMessage,{id:"label_message_sound",defaultMessage:[{type:0,value:"Message sound:"}]})),n().createElement(o.default,{name:"sound",id:"message-sound",checked:this.props.messageSounds,onChange:this.handleCheckboxClick})),n().createElement("div",{className:"panel-form-row"},n().createElement("label",{htmlFor:"desktop-alerts"},this.props.desktopAlertsEnabled?n().createElement(i.FormattedMessage,{id:"label_push_notifications",defaultMessage:[{type:0,value:"Notification alerts:"}]}):n().createElement(i.FormattedMessage,{id:"label_push_notifications_disabled",defaultMessage:[{type:0,value:"Notification alerts (requires HTTPS):"}]})),n().createElement(o.default,{name:"alert",id:"desktop-alerts",checked:this.props.desktopAlerts,onChange:this.props.desktopAlertsEnabled?this.handleCheckboxClick:null})),n().createElement("div",{className:"panel-form-row"},n().createElement("label",{htmlFor:"incognito-mode"},n().createElement(i.FormattedMessage,{id:"label_incognito_mode",defaultMessage:[{type:0,value:"Incognito mode:"}]})),n().createElement(o.default,{name:"incognito",id:"incognito-mode",checked:this.props.incognitoMode,onChange:this.handleCheckboxClick})))}}},"./src/views/acc-security-view.jsx":function(e,t,s){s.r(t);var a=s("react"),n=s.n(a),i=s("react-intl"),o=s("./src/widgets/in-place-edit.jsx"),r=s("./src/widgets/permissions-editor.jsx");const l=(0,i.defineMessages)({delete_account:{id:"delete_account",defaultMessage:[{type:0,value:"Delete account"}]},delete_account_warning:{id:"delete_account_arning",defaultMessage:[{type:0,value:"Are you sure you want to delete your account? It cannot be undone."}]}});class c extends n().Component{constructor(e){super(e);const t=this.props.tinode.getMeTopic();let s=0;t.contacts((e=>{e.acs&&!e.acs.isJoiner()&&s++}));const a=t.getDefaultAccess();this.state={auth:a?a.auth:null,anon:a?a.anon:null,showPermissionEditorFor:void 0,blockedCount:s},this.handlePasswordUpdate=this.handlePasswordUpdate.bind(this),this.handleLaunchPermissionsEditor=this.handleLaunchPermissionsEditor.bind(this),this.handleHidePermissionsEditor=this.handleHidePermissionsEditor.bind(this),this.handlePermissionsChanged=this.handlePermissionsChanged.bind(this),this.handleDeleteAccount=this.handleDeleteAccount.bind(this)}handlePasswordUpdate(e){this.setState({password:e}),this.props.onUpdateAccount(e)}handleLaunchPermissionsEditor(e){this.setState({showPermissionEditorFor:e,editedPermissions:this.state[e]})}handleHidePermissionsEditor(){this.setState({showPermissionEditorFor:void 0})}handlePermissionsChanged(e){let t={};t[this.state.showPermissionEditorFor]=e,this.props.onUpdateAccount(void 0,void 0,t);let s={showPermissionEditorFor:void 0};s[this.state.showPermissionEditorFor]=e,this.setState(s)}handleDeleteAccount(e){e.preventDefault();const{formatMessage:t}=this.props.intl;this.props.onShowAlert(t(l.delete_account),t(l.delete_account_warning),(()=>{this.props.onDeleteAccount()}),null,!0,null)}render(){return n().createElement(n().Fragment,null,this.state.showPermissionEditorFor?n().createElement(r.default,{mode:this.state.editedPermissions,skip:"O",onSubmit:this.handlePermissionsChanged,onCancel:this.handleHidePermissionsEditor}):n().createElement("div",{className:"scrollable-panel"},n().createElement("div",{className:"panel-form-column"},n().createElement("label",{className:"small"},n().createElement(i.FormattedMessage,{id:"label_password",defaultMessage:[{type:0,value:"Password"}]})),n().createElement("div",null,n().createElement(i.FormattedMessage,{id:"password_unchanged_prompt",defaultMessage:[{type:0,value:"Unchanged"}]},(e=>n().createElement(o.default,{placeholder:e,type:"password",onFinished:this.handlePasswordUpdate}))))),n().createElement("div",{className:"hr"}),n().createElement("div",{className:"panel-form-column"},n().createElement("a",{href:"#",className:"red flat-button",onClick:e=>{e.preventDefault(),this.props.onLogout()}},n().createElement("i",{className:"material-icons"},"exit_to_app"),"  ",n().createElement(i.FormattedMessage,{id:"button_logout",defaultMessage:[{type:0,value:"Logout"}]})),n().createElement("a",{href:"#",className:"red flat-button",onClick:e=>{this.handleDeleteAccount(e)}},n().createElement("i",{className:"material-icons"},"delete"),"  ",n().createElement(i.FormattedMessage,{id:"button_delete_account",defaultMessage:[{type:0,value:"Delete account"}]}))),n().createElement("div",{className:"hr"}),n().createElement("div",{className:"panel-form-column"},n().createElement("div",null,n().createElement("label",{className:"small"},n().createElement(i.FormattedMessage,{id:"label_default_access_mode",defaultMessage:[{type:0,value:"Default access mode:"}]}))),n().createElement("div",{className:"quoted"},n().createElement("div",null,"Auth: ",n().createElement("tt",{className:"clickable",onClick:this.handleLaunchPermissionsEditor.bind(this,"auth")},this.state.auth)),n().createElement("div",null,"Anon: ",n().createElement("tt",{className:"clickable",onClick:this.handleLaunchPermissionsEditor.bind(this,"anon")},this.state.anon)))),this.state.blockedCount>0?n().createElement(n().Fragment,null,n().createElement("div",{className:"hr"}),n().createElement("div",{className:"panel-form-row"},n().createElement("i",{className:"material-icons"},"block")," ",n().createElement("a",{href:"#",className:"gray",onClick:e=>{e.preventDefault(),this.props.onShowBlocked()}},n().createElement(i.FormattedMessage,{id:"blocked_contacts_link",defaultMessage:[{type:0,value:"Blocked contacts ("},{type:1,value:"count"},{type:0,value:")"}],values:{count:this.state.blockedCount}})))):null))}}t.default=(0,i.injectIntl)(c)},"./src/views/acc-support-view.jsx":function(e,t,s){s.r(t),s.d(t,{default:function(){return c}});var a=s("react"),n=s.n(a),i=s("react-intl"),o=s("tinode-sdk"),r=s.n(o),l=s("./src/config.js");class c extends n().PureComponent{render(){return n().createElement("div",{className:"scrollable-panel"},n().createElement("div",{className:"panel-form-column"},n().createElement("a",{href:l.LINK_CONTACT_US,className:"flat-button",target:"_blank"},n().createElement("i",{className:"material-icons"},"email"),"  ",n().createElement(i.FormattedMessage,{id:"link_contact_us",defaultMessage:[{type:0,value:"Contact Us"}]})),n().createElement("a",{href:l.LINK_TERMS_OF_SERVICE,className:"flat-button",target:"_blank"},n().createElement("i",{className:"material-icons"},"description"),"  ",n().createElement(i.FormattedMessage,{id:"link_terms_of_service",defaultMessage:[{type:0,value:"Terms of Service"}]})),n().createElement("a",{href:l.LINK_PRIVACY_POLICY,className:"flat-button",target:"_blank"},n().createElement("i",{className:"material-icons"},"policy"),"  ",n().createElement(i.FormattedMessage,{id:"link_privacy_policy",defaultMessage:[{type:0,value:"Privacy Policy"}]}))),n().createElement("div",{className:"hr"}),n().createElement("div",{className:"panel-form-column"},n().createElement("div",{className:"panel-form-row"},n().createElement("label",{className:"small"},n().createElement(i.FormattedMessage,{id:"label_client"})),l.APP_NAME),n().createElement("div",{className:"panel-form-row"},n().createElement("label",{className:"small"},n().createElement(i.FormattedMessage,{id:"label_sdk",defaultMessage:[{type:0,value:"SDK:"}]})),r().getLibrary()),n().createElement("div",{className:"panel-form-row"},n().createElement("label",{className:"small"},n().createElement(i.FormattedMessage,{id:"label_server"})),this.props.serverVersion),n().createElement("div",{className:"panel-form-row"},n().createElement("label",{className:"small"},n().createElement(i.FormattedMessage,{id:"label_server_address",defaultMessage:[{type:0,value:"Server address:"}]})),this.props.serverAddress)))}}},"./src/views/contacts-view.jsx":function(e,t,s){s.r(t),s.d(t,{default:function(){return c}});var a=s("react"),n=s.n(a),i=s("react-intl"),o=s("./src/widgets/contact-list.jsx"),r=s("./src/lib/utils.js");const l=(0,i.defineMessages)({archived_contacts_title:{id:"archived_contacts",defaultMessage:[{type:0,value:"Archived contacts ("},{type:1,value:"count"},{type:0,value:")"}]}});class c extends n().Component{constructor(e){super(e),this.handleAction=this.handleAction.bind(this),this.state=c.deriveStateFromProps(e)}static deriveStateFromProps(e){const t=[];let s=0,a=0;return e.chatList.map((n=>{const i=n.acs&&!n.acs.isJoiner();i&&e.blocked&&t.push(n),i||e.blocked||(n.private&&n.private.arch?e.archive?t.push(n):a++:e.archive||(t.push(n),s+=n.unread>0?1:0))})),t.sort(((e,t)=>(t.touched||0)-(e.touched||0))),a>0&&t.push({action:"archive",title:l.archived_contacts_title,values:{count:a}}),{contactList:t,unreadThreads:s}}componentDidUpdate(e,t){if(e.chatList!=this.props.chatList||e.archive!=this.props.archive||e.blocked!=this.props.blocked){const e=c.deriveStateFromProps(this.props);this.setState(e),e.unreadThreads!=t.unreadThreads&&(0,r.updateFavicon)(e.unreadThreads)}}handleAction(e){this.props.onShowArchive()}render(){return n().createElement(i.FormattedMessage,{id:"contacts_not_found",defaultMessage:[{type:0,value:"You have no chats"},{type:0,value:"
"},{type:0,value:"¯∖_(ツ)_/¯"}]},(e=>n().createElement(o.default,{connected:this.props.connected,contacts:this.state.contactList,emptyListMessage:e,topicSelected:this.props.topicSelected,myUserId:this.props.myUserId,showOnline:!0,showUnread:!0,onTopicSelected:this.props.onTopicSelected,showContextMenu:this.props.showContextMenu,onAction:this.handleAction})))}}},"./src/views/create-account-view.jsx":function(e,t,s){s.r(t),s.d(t,{default:function(){return p}});var a=s("react"),n=s.n(a),i=s("react-intl"),o=s("./src/widgets/avatar-upload.jsx"),r=s("./src/widgets/checkbox.jsx"),l=s("./src/widgets/visible-password.jsx"),c=s("./src/lib/local-storage.js"),d=s("./src/lib/utils.js"),h=s("./src/config.js");class p extends n().PureComponent{constructor(e){super(e),this.state={login:"",password:"",email:"",fn:"",imageDataUrl:null,errorCleared:!1,saveToken:c.default.getObject("keep-logged-in")},this.handleLoginChange=this.handleLoginChange.bind(this),this.handlePasswordChange=this.handlePasswordChange.bind(this),this.handleEmailChange=this.handleEmailChange.bind(this),this.handleFnChange=this.handleFnChange.bind(this),this.handleImageChanged=this.handleImageChanged.bind(this),this.handleToggleSaveToken=this.handleToggleSaveToken.bind(this),this.handleSubmit=this.handleSubmit.bind(this)}handleLoginChange(e){this.setState({login:e.target.value})}handlePasswordChange(e){this.setState({password:e})}handleEmailChange(e){this.setState({email:e.target.value})}handleFnChange(e){this.setState({fn:e.target.value})}handleImageChanged(e){this.setState({imageDataUrl:e})}handleToggleSaveToken(){c.default.setObject("keep-logged-in",!this.state.saveToken),this.setState({saveToken:!this.state.saveToken})}handleSubmit(e){e.preventDefault(),this.setState({errorCleared:!1}),this.props.onCreateAccount(this.state.login.trim(),this.state.password.trim(),(0,d.vcard)(this.state.fn.trim().substring(0,h.MAX_TITLE_LENGTH),this.state.imageDataUrl),{meth:"email",val:this.state.email})}render(){let e="blue";return this.props.disabled&&(e+=" disabled"),n().createElement("form",{className:"panel-form-column",onSubmit:this.handleSubmit},n().createElement("div",{className:"panel-form-row"},n().createElement("div",{className:"panel-form-column"},n().createElement(i.FormattedMessage,{id:"login_prompt"},(e=>n().createElement("input",{type:"text",placeholder:e,autoComplete:"user-name",value:this.state.login,onChange:this.handleLoginChange,required:!0,autoFocus:!0}))),n().createElement(i.FormattedMessage,{id:"password_prompt"},(e=>n().createElement(l.default,{placeholder:e,autoComplete:"new-password",value:this.state.password,onFinished:this.handlePasswordChange,required:!0})))),n().createElement(o.default,{onImageChanged:this.handleImageChanged,onError:this.props.onError})),n().createElement("div",{className:"panel-form-row"},n().createElement(i.FormattedMessage,{id:"full_name_prompt",defaultMessage:[{type:0,value:"Full name, e.g. John Doe"}]},(e=>n().createElement("input",{type:"text",placeholder:e,autoComplete:"name",value:this.state.fn,onChange:this.handleFnChange,required:!0})))),n().createElement("div",{className:"panel-form-row"},n().createElement(i.FormattedMessage,{id:"email_prompt",defaultMessage:[{type:0,value:"Email, e.g. jdoe@example.com"}]},(e=>n().createElement("input",{type:"email",placeholder:e,autoComplete:"email",value:this.state.email,onChange:this.handleEmailChange,required:!0})))),n().createElement("div",{className:"panel-form-row"},n().createElement(r.default,{id:"save-token",name:"save-token",checked:this.state.saveToken,onChange:this.handleToggleSaveToken}),n().createElement(i.FormattedMessage,{id:"stay_logged_in"},(e=>n().createElement("label",{htmlFor:"save-token"}," ",e)))),n().createElement("div",{className:"dialog-buttons"},n().createElement("button",{className:e,type:"submit"},n().createElement(i.FormattedMessage,{id:"button_sign_up",defaultMessage:[{type:0,value:"Sign up"}]}))))}}},"./src/views/edit-account-view.jsx":function(e,t,s){s.r(t),s.d(t,{default:function(){return l}});var a=s("react"),n=s.n(a),i=s("react-intl"),o=s("./src/widgets/avatar-upload.jsx"),r=s("./src/lib/blob-helpers.js");class l extends n().Component{constructor(e){super(e);const t=this.props.tinode.getMeTopic();this.state={fullName:t.public?t.public.fn:void 0,avatar:(0,r.makeImageUrl)(t.public?t.public.photo:null)}}render(){return n().createElement("div",{className:"scrollable-panel"},n().createElement("div",{className:"panel-form-row"},n().createElement("div",{className:"panel-form-column"},n().createElement("label",{className:"small"},n().createElement(i.FormattedMessage,{id:"label_your_name",defaultMessage:[{type:0,value:"Your name"}]})),n().createElement("div",{className:"large"},this.state.fullName),n().createElement("div",null,n().createElement("label",{className:"small"},n().createElement(i.FormattedMessage,{id:"label_user_id",defaultMessage:[{type:0,value:"ID:"}]}))," ",n().createElement("tt",null,this.props.myUserId))),n().createElement(o.default,{avatar:this.state.avatar,readOnly:!this.state.owner,uid:this.props.myUserId,title:this.state.fullName})),n().createElement("div",{className:"panel-form-row"},n().createElement("a",{href:"#",className:"flat-button",onClick:e=>{e.preventDefault(),this.props.onBasicNavigate("general")}},n().createElement("i",{className:"material-icons"},"edit")," ",n().createElement(i.FormattedMessage,{id:"button_edit",defaultMessage:[{type:0,value:"Edit"}]}))),n().createElement("div",{className:"hr"}),n().createElement("div",{className:"panel-form-column"},n().createElement("a",{href:"#",className:"flat-button",onClick:e=>{e.preventDefault(),this.props.onBasicNavigate("notif")}},n().createElement("i",{className:"material-icons"},"notifications")," ",n().createElement(i.FormattedMessage,{id:"sidepanel_title_acc_notifications"})),n().createElement("a",{href:"#",className:"flat-button",onClick:e=>{e.preventDefault(),this.props.onBasicNavigate("security")}},n().createElement("i",{className:"material-icons"},"security")," ",n().createElement(i.FormattedMessage,{id:"sidepanel_title_acc_security"})),n().createElement("a",{href:"#",className:"flat-button",onClick:e=>{e.preventDefault(),this.props.onBasicNavigate("support")}},n().createElement("i",{className:"material-icons"},"contact_support")," ",n().createElement(i.FormattedMessage,{id:"sidepanel_title_acc_support"}))))}}},"./src/views/info-view.jsx":function(e,t,s){s.r(t);var a=s("react"),n=s.n(a),i=s("react-intl"),o=s("tinode-sdk"),r=s.n(o),l=s("./src/widgets/avatar-upload.jsx"),c=s("./src/widgets/checkbox.jsx"),d=s("./src/widgets/contact-list.jsx"),h=s("./src/widgets/error-panel.jsx"),p=s("./src/widgets/group-manager.jsx"),u=s("./src/widgets/in-place-edit.jsx"),m=s("./src/widgets/menu-cancel.jsx"),_=s("./src/widgets/more-button.jsx"),g=s("./src/widgets/permissions-editor.jsx"),b=s("./src/widgets/tag-manager.jsx"),v=s("./src/config.js"),f=s("./src/lib/blob-helpers.js"),E=s("./src/lib/utils.js");const w=(0,i.defineMessages)({requested:{id:"requested_permissions",defaultMessage:[{type:0,value:"Requested"}]},granted:{id:"granted_permissions",defaultMessage:[{type:0,value:"Granted"}]},edit_permissions:{id:"menu_item_edit_permissions",defaultMessage:[{type:0,value:"Edit permissions"}]},other_user:{id:"label_other_user",defaultMessage:[{type:0,value:"Other"}]},clear_messages:{id:"action_clear_messages",defaultMessage:[{type:0,value:"Clear Messages"}]},clear_messages_warning:{id:"clear_messages_warning",defaultMessage:[{type:0,value:"Are you sure you want to clear all messages? It cannot be undone."}]},delete_messages:{id:"action_delete_messages",defaultMessage:[{type:0,value:"Clear Messages for All"}]},delete_messages_warning:{id:"delete_messages_warning",defaultMessage:[{type:0,value:"Are you sure you want to delete all messages for everyone? It cannot be undone."}]},leave_chat:{id:"action_leave_chat",defaultMessage:[{type:0,value:"Leave Conversation"}]},leave_chat_warning:{id:"leave_chat_warning",defaultMessage:[{type:0,value:"Are you sure you want to leave this conversation?"}]},block_contact:{id:"action_block_contact",defaultMessage:[{type:0,value:"Block Contact"}]},block_contact_warning:{id:"block_contact_warning",defaultMessage:[{type:0,value:"Are you sure you want to block this contact?"}]},report_chat:{id:"action_report_chat",defaultMessage:[{type:0,value:"Report Conversation"}]},report_chat_warning:{id:"report_chat_warning",defaultMessage:[{type:0,value:"Are you sure you want to block and report this conversation?"}]}});class S extends n().Component{constructor(e){super(e),this.state={topic:null,owner:!1,admin:!1,sharer:!1,deleter:!1,muted:!1,address:null,groupTopic:void 0,channel:void 0,fullName:void 0,avatar:null,private:null,selectedContact:null,access:null,modeGiven:null,modeWant:null,modeGiven2:null,modeWant2:null,auth:null,anon:null,contactList:[],tags:[],showMemberPanel:!1,showPermissionEditorFor:void 0,moreInfoExpanded:!1,previousMetaDesc:void 0,previousSubsUpdated:void 0,previousTagsUpdated:void 0},this.resetSubs=this.resetSubs.bind(this),this.resetDesc=this.resetDesc.bind(this),this.onMetaDesc=this.onMetaDesc.bind(this),this.onSubsUpdated=this.onSubsUpdated.bind(this),this.onTagsUpdated=this.onTagsUpdated.bind(this),this.handleFullNameUpdate=this.handleFullNameUpdate.bind(this),this.handlePrivateUpdate=this.handlePrivateUpdate.bind(this),this.handleImageChanged=this.handleImageChanged.bind(this),this.handleMuted=this.handleMuted.bind(this),this.handlePermissionsChanged=this.handlePermissionsChanged.bind(this),this.handleLaunchPermissionsEditor=this.handleLaunchPermissionsEditor.bind(this),this.handleHidePermissionsEditor=this.handleHidePermissionsEditor.bind(this),this.handleShowAddMembers=this.handleShowAddMembers.bind(this),this.handleHideAddMembers=this.handleHideAddMembers.bind(this),this.handleMemberUpdateRequest=this.handleMemberUpdateRequest.bind(this),this.handleDeleteMessages=this.handleDeleteMessages.bind(this),this.handleLeave=this.handleLeave.bind(this),this.handleBlock=this.handleBlock.bind(this),this.handleReport=this.handleReport.bind(this),this.handleMemberSelected=this.handleMemberSelected.bind(this),this.handleMoreInfo=this.handleMoreInfo.bind(this),this.handleTagsUpdated=this.handleTagsUpdated.bind(this),this.handleContextMenu=this.handleContextMenu.bind(this)}componentDidUpdate(e){const t=this.props.tinode.getTopic(e.topic);t&&(this.onMetaDesc!=t.onMetaDesc&&(this.previousMetaDesc=t.onMetaDesc,t.onMetaDesc=this.onMetaDesc,this.previousSubsUpdated=t.onSubsUpdated,t.onSubsUpdated=this.onSubsUpdated,"grp"==t.getType()?(this.previousTagsUpdated=t.onTagsUpdated,t.onTagsUpdated=this.onTagsUpdated):this.previousTagsUpdated=void 0),this.state.topic!=e.topic&&(this.setState({topic:e.topic}),this.resetDesc(t,e),this.resetSubs(t,e)))}componentWillUnmount(){const e=this.props.tinode.getTopic(this.props.topic);e&&(this.setState({topic:null}),e.onMetaDesc=this.previousMetaDesc,e.onSubsUpdated=this.previousSubsUpdated,e.onTagsUpdated=this.previousTagsUpdated)}resetSubs(e,t){const s={contactList:[]};if("p2p"==e.getType()){const a=e.subscriber(t.topic);a?(s.modeGiven2=a.acs.getGiven(),s.modeWant2=a.acs.getWant()):(s.modeGiven2=v.NO_ACCESS_MODE,s.modeWant2=v.NO_ACCESS_MODE)}else e.subscribers((e=>{s.contactList.push(e)}),this);this.setState(s)}resetDesc(e,t){const s=e.getDefaultAccess()||{},a=e.getAccessMode();this.setState({owner:a&&a.isOwner(),admin:a&&a.isAdmin(),sharer:a&&a.isSharer(),deleter:a&&a.isDeleter(),muted:a&&a.isMuted(),fullName:e.public?e.public.fn:void 0,avatar:(0,f.makeImageUrl)(e.public?e.public.photo:null),private:e.private?e.private.comment:null,address:e.name,groupTopic:"grp"==e.getType(),channel:e.isChannel(),showMemberPanel:!1,access:a?a.getMode():void 0,modeGiven:a?a.getGiven():void 0,modeWant:a?a.getWant():void 0,auth:s.auth,anon:s.anon}),"grp"==e.getType()&&a&&a.isOwner()&&e.getMeta(e.startMetaQuery().withTags().build())}onMetaDesc(e){const t=this.props.tinode.getTopic(this.props.topic);t&&(this.resetDesc(t,this.props),this.previousMetaDesc&&this.previousMetaDesc!=this.onMetaDesc&&this.previousMetaDesc(e))}onSubsUpdated(e){const t=this.props.tinode.getTopic(this.props.topic);t&&(this.resetSubs(t,this.props),this.previousSubsUpdated&&this.previousSubsUpdated!=this.onSubsUpdated&&this.previousSubsUpdated(e))}onTagsUpdated(e){this.setState({tags:e}),this.previousTagsUpdated&&this.previousTagsUpdated!=this.onTagsUpdated&&this.previousTagsUpdated()}handleFullNameUpdate(e){e=e.trim().substring(0,v.MAX_TITLE_LENGTH),this.state.fullName!==e&&(this.setState({fullName:e}),this.props.onTopicDescUpdate(this.props.topic,(0,E.vcard)(e,null),null))}handlePrivateUpdate(e){e=e.trim().substring(0,v.MAX_TITLE_LENGTH),this.state.private!==e&&(this.setState({private:e}),this.props.onTopicDescUpdate(this.props.topic,null,e||r().DEL_CHAR))}handleImageChanged(e){this.setState({avatar:e}),this.props.onTopicDescUpdate(this.props.topic,(0,E.vcard)(null,e||r().DEL_CHAR),null)}handleMuted(e,t){this.setState({muted:t}),this.props.onChangePermissions(this.props.topic,t?"-P":"+P")}handlePermissionsChanged(e){switch(this.state.showPermissionEditorFor){case"auth":this.props.onTopicDescUpdate(this.props.topic,null,null,{auth:e});break;case"anon":this.props.onTopicDescUpdate(this.props.topic,null,null,{anon:e});break;case"mode":case"want":this.props.onChangePermissions(this.props.topic,e);break;case"given":this.props.onChangePermissions(this.props.topic,e,this.props.topic);break;case"user":this.props.onChangePermissions(this.props.topic,e,this.state.userPermissionsEdited)}this.setState({showPermissionEditorFor:void 0})}handleLaunchPermissionsEditor(e,t){const{formatMessage:s}=this.props.intl;let a,n,i,o,l,c,d;switch(e){case"mode":a=this.state.access;break;case"want":a=this.state.modeWant,n=this.state.modeGiven,this.state.owner?i="O":(i=r().AccessMode.encode(r().AccessMode.diff("ASDO",this.state.modeGiven)),this.state.channel&&(i+="W")),o=s(w.requested),l=s(w.granted);break;case"given":a=this.state.modeGiven2,n=this.state.modeWant2,i=this.state.groupTopic?this.state.owner?"":"O":"ASDO",o=s(w.granted),l=s(w.requested);break;case"auth":a=this.state.auth,i="O";break;case"anon":a=this.state.anon,i="O";break;case"user":{const e=this.props.tinode.getTopic(this.props.topic);if(!e)return;const r=e.subscriber(t);if(!r||!r.acs)return;a=r.acs.getGiven(),n=r.acs.getWant(),i=this.state.owner?"":"O",o=s(w.granted),l=s(w.requested),r.public&&(c=r.public.fn,d=r.public.photo);break}default:console.log("Unknown permission editing mode '"+e+"'")}this.setState({showPermissionEditorFor:e,userPermissionsEdited:t,userPermissionsTitle:c,userPermissionsAvatar:d,editedPermissions:a,immutablePermissions:n,editedPermissionsTitle:o,immutablePermissionsTitle:l,editedPermissionsSkipped:i})}handleHidePermissionsEditor(){this.setState({showPermissionEditorFor:void 0})}handleShowAddMembers(e){e.preventDefault(),this.props.onInitFind(),this.setState({showMemberPanel:!0})}handleHideAddMembers(){this.setState({showMemberPanel:!1})}handleMemberUpdateRequest(e,t,s){this.props.onMemberUpdateRequest(this.props.topic,t,s),this.setState({showMemberPanel:!1})}handleDeleteMessages(e){e.preventDefault();const{formatMessage:t}=this.props.intl;this.props.onShowAlert(t(this.state.deleter?w.delete_messages:w.clear_messages),t(this.state.deleter?w.delete_messages_warning:w.clear_messages_warning),(()=>{this.props.onDeleteMessages(this.props.topic)}),null,!0,null)}handleLeave(e){e.preventDefault();const{formatMessage:t}=this.props.intl;this.props.onShowAlert(t(w.leave_chat),t(w.leave_chat_warning),(()=>{this.props.onLeaveTopic(this.props.topic)}),null,!0,null)}handleBlock(e){e.preventDefault();const{formatMessage:t}=this.props.intl;this.props.onShowAlert(t(w.block_contact),t(w.block_contact_warning),(()=>{this.props.onBlockTopic(this.props.topic)}),null,!0,null)}handleReport(e){e.preventDefault();const{formatMessage:t}=this.props.intl;this.props.onShowAlert(t(w.report_chat),t(w.report_chat_warning),(()=>{this.props.onReportTopic(this.props.topic)}),null,!0,null)}handleMemberSelected(e){this.setState({selectedContact:e})}handleMoreInfo(e){this.setState({moreInfoExpanded:e})}handleTagsUpdated(e){(0,E.arrayEqual)(this.state.tags.slice(0),e.slice(0))||this.props.onTopicTagsUpdate(this.props.topic,e)}handleContextMenu(e){const{formatMessage:t}=this.props.intl,s=this,a=this.props.tinode.getTopic(this.props.topic);if(!a)return;const n=a.subscriber(e.topicName);if(!n||!n.acs)return;const i=[{title:t(w.edit_permissions),handler:function(){s.handleLaunchPermissionsEditor("user",e.topicName)}},"member_delete",n.acs.isMuted()?"member_unmute":"member_mute",n.acs.isJoiner()?"member_block":"member_unblock"];this.props.showContextMenu({topicName:this.props.topic,x:e.x,y:e.y,user:e.topicName},i)}render(){const{formatMessage:e}=this.props.intl;return n().createElement("div",{id:"info-view"},n().createElement("div",{className:"caption-panel",id:"info-caption-panel"},n().createElement("div",{className:"panel-title",id:"info-title"},n().createElement(i.FormattedMessage,{id:"title_info",defaultMessage:[{type:0,value:"Info"}]})),n().createElement("div",null,n().createElement(m.default,{onCancel:this.props.onCancel}))),this.props.displayMobile?n().createElement(h.default,{level:this.props.errorLevel,text:this.props.errorText,onClearError:this.props.onError}):null,this.state.showMemberPanel?n().createElement(p.default,{members:this.state.contactList,requiredMember:this.props.myUserId,keepInitialMembers:!this.state.admin&&!this.state.owner,myUserId:this.props.myUserId,contacts:this.props.searchableContacts,onCancel:this.handleHideAddMembers,onSubmit:this.handleMemberUpdateRequest}):this.state.showPermissionEditorFor?n().createElement(g.default,{mode:this.state.editedPermissions,compare:this.state.immutablePermissions,skip:this.state.editedPermissionsSkipped,modeTitle:this.state.editedPermissionsTitle,compareTitle:this.state.immutablePermissionsTitle,userTitle:this.state.userPermissionsTitle,item:this.state.userPermissionsEdited,userAvatar:this.state.userPermissionsAvatar,onSubmit:this.handlePermissionsChanged,onCancel:this.handleHidePermissionsEditor}):n().createElement("div",{id:"info-view-content",className:"scrollable-panel"},n().createElement("div",{className:"panel-form-row"},n().createElement("div",{className:"panel-form-column"},n().createElement("div",null,n().createElement("label",{className:"small"},n().createElement(i.FormattedMessage,{id:"label_topic_name",defaultMessage:[{type:0,value:"Name"}]}))),n().createElement("div",null,n().createElement(u.default,{placeholder:this.state.groupTopic?"Group name":n().createElement("i",null,"Unknown"),readOnly:!this.state.owner,value:this.state.fullName,required:!0,onFinished:this.handleFullNameUpdate})),n().createElement("div",null,n().createElement("label",{className:"small"},n().createElement(i.FormattedMessage,{id:"label_private",defaultMessage:[{type:0,value:"Private comment"}]}))),n().createElement("div",null,n().createElement(i.FormattedMessage,{id:"private_editing_placeholder",defaultMessage:[{type:0,value:"Visible to you only"}]},(e=>n().createElement(u.default,{placeholder:e,value:this.state.private,onFinished:this.handlePrivateUpdate}))))),n().createElement(l.default,{avatar:this.state.avatar,readOnly:!this.state.owner,uid:this.props.topic,title:this.state.fullName,onImageChanged:this.handleImageChanged,onError:this.props.onError})),n().createElement("div",{className:"hr"}),n().createElement("div",{className:"panel-form-column"},n().createElement("div",{className:"panel-form-row"},n().createElement("label",null,n().createElement(i.FormattedMessage,{id:"label_muting_topic",defaultMessage:[{type:0,value:"Muted:"}]})),n().createElement(c.default,{name:"P",checked:this.state.muted,onChange:this.handleMuted})),n().createElement(i.FormattedMessage,{id:"action_more",defaultMessage:[{type:0,value:"More"}]},(e=>n().createElement(_.default,{title:e,open:this.state.moreInfoExpanded,onToggle:this.handleMoreInfo}))),this.state.moreInfoExpanded?n().createElement("div",{className:"panel-form-column"},n().createElement("div",{className:"panel-form-row"},n().createElement("label",null,n().createElement(i.FormattedMessage,{id:"label_user_id"})),n().createElement("tt",null,this.state.address)),this.state.groupTopic?n().createElement("div",{className:"panel-form-row"},n().createElement("label",null,n().createElement(i.FormattedMessage,{id:"label_your_permissions",defaultMessage:[{type:0,value:"Your permissions:"}]})),n().createElement("tt",{className:"clickable",onClick:this.handleLaunchPermissionsEditor.bind(this,"want")},this.state.access)):n().createElement("div",null,n().createElement("div",null,n().createElement("label",{className:"small"},n().createElement(i.FormattedMessage,{id:"label_permissions",defaultMessage:[{type:0,value:"Permissions:"}]}))),n().createElement("div",{className:"quoted"},n().createElement("div",null,n().createElement(i.FormattedMessage,{id:"label_you",defaultMessage:[{type:0,value:"You:"}]}),"  ",n().createElement("tt",{className:"clickable",onClick:this.handleLaunchPermissionsEditor.bind(this,"want")},this.state.access)),n().createElement("div",null,this.state.fullName?this.state.fullName:e(w.other_user),":  ",n().createElement("tt",{className:"clickable",onClick:this.handleLaunchPermissionsEditor.bind(this,"given")},this.state.modeGiven2)))),this.state.sharer&&(this.state.auth||this.state.anon)?n().createElement("div",null,n().createElement("div",null,n().createElement("label",{className:"small"},n().createElement(i.FormattedMessage,{id:"label_default_access",defaultMessage:[{type:0,value:"Default access mode:"}]}))),n().createElement("div",{className:"quoted"},n().createElement("div",null,"Auth: ",this.state.admin?n().createElement("tt",{className:"clickable",onClick:this.handleLaunchPermissionsEditor.bind(this,"auth")},this.state.auth):n().createElement("tt",null,this.state.auth)),n().createElement("div",null,"Anon: ",this.state.admin?n().createElement("tt",{className:"clickable",onClick:this.handleLaunchPermissionsEditor.bind(this,"anon")},this.state.anon):n().createElement("tt",null,this.state.anon)))):null):null),n().createElement("div",{className:"hr"}),this.state.owner?n().createElement(n().Fragment,null,n().createElement(i.FormattedMessage,{id:"title_tag_manager"},(e=>n().createElement(b.default,{title:e,tags:this.state.tags,activated:!1,tinode:this.props.tinode,onSubmit:this.handleTagsUpdated}))),n().createElement("div",{className:"hr"})):null,n().createElement("div",{className:"panel-form-column"},this.state.channel?null:n().createElement("a",{href:"#",className:"flat-button",onClick:this.handleDeleteMessages},n().createElement("i",{className:"material-icons"},"delete_outline"),"  ",e(this.state.deleter?w.delete_messages:w.clear_messages)),n().createElement("a",{href:"#",className:"red flat-button",onClick:this.handleLeave},n().createElement("i",{className:"material-icons"},"exit_to_app"),"  ",e(w.leave_chat)),this.state.groupTopic?null:n().createElement("a",{href:"#",className:"red flat-button",onClick:this.handleBlock},n().createElement("i",{className:"material-icons"},"block"),"  ",e(w.block_contact)),this.state.owner?null:n().createElement("a",{href:"#",className:"red flat-button",onClick:this.handleReport},n().createElement("i",{className:"material-icons"},"report"),"  ",e(w.report_chat))),this.state.groupTopic&&this.state.sharer?n().createElement(n().Fragment,null,n().createElement("div",{className:"hr"}),n().createElement("div",{className:"panel-form-column"},n().createElement("div",{className:"panel-form-row"},n().createElement("label",{className:"small"},n().createElement(i.FormattedMessage,{id:"label_group_members",defaultMessage:[{type:0,value:"Group members:"}]}))),n().createElement("div",{className:"panel-form-row"},n().createElement("a",{href:"#",className:"flat-button",onClick:this.handleShowAddMembers},n().createElement("i",{className:"material-icons"},"person_add"),"  ",n().createElement(i.FormattedMessage,{id:"button_add_members",defaultMessage:[{type:0,value:"Add members"}]}))),n().createElement(i.FormattedMessage,{id:"group_has_no_members",defaultMessage:[{type:0,value:"No members"}]},(e=>n().createElement(d.default,{contacts:this.state.contactList,myUserId:this.props.myUserId,emptyListMessage:e,topicSelected:this.state.selectedContact,showOnline:!1,showUnread:!1,showMode:!0,noScroll:!0,onTopicSelected:this.handleMemberSelected,showContextMenu:!!this.state.admin&&this.handleContextMenu}))))):null))}}t.default=(0,i.injectIntl)(S)},"./src/views/login-view.jsx":function(e,t,s){s.r(t),s.d(t,{default:function(){return c}});var a=s("react"),n=s.n(a),i=s("react-intl"),o=s("./src/widgets/checkbox.jsx"),r=s("./src/widgets/visible-password.jsx"),l=s("./src/lib/local-storage.js");class c extends n().Component{constructor(e){super(e),this.state={login:e.login,password:"",hostName:e.serverAddress,saveToken:l.default.getObject("keep-logged-in")},this.handleLoginChange=this.handleLoginChange.bind(this),this.handlePasswordChange=this.handlePasswordChange.bind(this),this.handleToggleSaveToken=this.handleToggleSaveToken.bind(this),this.handleSubmit=this.handleSubmit.bind(this)}handleLoginChange(e){this.setState({login:e.target.value})}handlePasswordChange(e){this.setState({password:e.target.value})}handleToggleSaveToken(){l.default.setObject("keep-logged-in",!this.state.saveToken),this.setState({saveToken:!this.state.saveToken})}handleSubmit(e){e.preventDefault(),this.props.onLogin(this.state.login.trim(),this.state.password.trim())}render(){var e="blue";return this.props.disabled&&(e+=" disabled"),n().createElement("form",{id:"login-form",onSubmit:this.handleSubmit},n().createElement(i.FormattedMessage,{id:"login_prompt",defaultMessage:[{type:0,value:"Login"}]},(e=>n().createElement("input",{type:"text",id:"inputLogin",placeholder:e,autoComplete:"username",autoCorrect:"off",autoCapitalize:"none",value:this.state.login,onChange:this.handleLoginChange,required:!0,autoFocus:!0}))),n().createElement(i.FormattedMessage,{id:"password_prompt",defaultMessage:[{type:0,value:"Password"}]},(e=>n().createElement(r.default,{type:"password",id:"inputPassword",placeholder:e,autoComplete:"current-password",value:this.state.password,onChange:this.handlePasswordChange,required:!0}))),n().createElement("div",{className:"panel-form-row"},n().createElement(o.default,{id:"save-token",name:"save-token",checked:this.state.saveToken,onChange:this.handleToggleSaveToken}),n().createElement("label",{htmlFor:"save-token"}," ",n().createElement(i.FormattedMessage,{id:"stay_logged_in",defaultMessage:[{type:0,value:"Stay logged in"}]})),n().createElement("a",{href:"#reset"},n().createElement(i.FormattedMessage,{id:"forgot_password_link",defaultMessage:[{type:0,value:"Forgot password?"}]}))),n().createElement("div",{className:"dialog-buttons"},n().createElement("button",{className:e,type:"submit"},n().createElement(i.FormattedMessage,{id:"button_sign_in",defaultMessage:[{type:0,value:"Sign in"}]}))))}}},"./src/views/logo-view.jsx":function(e,t,s){s.r(t),s.d(t,{default:function(){return c}});var a=s("react"),n=s.n(a),i=s("react-intl"),o=s("tinode-sdk"),r=s.n(o),l=s("./src/config.js");class c extends n().PureComponent{render(){const e=l.APP_NAME+" ("+r().getLibrary()+")";return n().createElement("div",{id:"dummy-view"},n().createElement("div",null,n().createElement("a",{href:"https://github.com/tinode/chat/"},n().createElement("img",{id:"logo",alt:"logo",src:"img/logo.svg"}),n().createElement("h2",null,"Tinode Web")),n().createElement("p",null,n().createElement(i.FormattedMessage,{id:"label_client",defaultMessage:[{type:0,value:"Client:"}]})," ",e),n().createElement("p",null,n().createElement(i.FormattedMessage,{id:"label_server",defaultMessage:[{type:0,value:"Server:"}]})," ",this.props.serverVersion," (",this.props.serverAddress,")")))}}},"./src/views/messages-view.jsx":function(e,t,s){s.r(t);var a=s("react"),n=s.n(a),i=s("react-intl"),o=s("tinode-sdk"),r=s.n(o),l=s("./src/widgets/chat-message.jsx"),c=s("./src/widgets/doc-preview.jsx"),d=s("./src/widgets/error-panel.jsx"),h=s("./src/widgets/group-subs.jsx"),p=s("./src/widgets/image-preview.jsx"),u=s("./src/widgets/invitation.jsx"),m=s("./src/widgets/letter-tile.jsx"),_=s("./src/widgets/load-spinner.jsx"),g=s("./src/views/logo-view.jsx"),b=s("./src/widgets/send-message.jsx"),v=s("./src/config.js"),f=s("./src/lib/blob-helpers.js"),E=s("./src/lib/navigation.js"),w=s("./src/lib/strformat.js");const S=r().Drafty,C=(0,i.defineMessages)({online_now:{id:"online_now",defaultMessage:[{type:0,value:"online now"}]},last_seen:{id:"last_seen_timestamp",defaultMessage:[{type:0,value:"Last seen"}]},not_found:{id:"title_not_found",defaultMessage:[{type:0,value:"Not found"}]},channel:{id:"channel",defaultMessage:[{type:0,value:"channel"}]}});function M(e){if(e){const t=e.getExcessive()||"";return e.isJoiner("given")&&(t.includes("R")||t.includes("W"))}return!1}function y(e){if(e){const t=e.getMissing()||"";return e.isJoiner("want")&&(t.includes("R")||t.includes("W"))}return!1}class k extends n().Component{constructor(e){super(e),this.state=k.getDerivedStateFromProps(e,{}),this.leave=this.leave.bind(this),this.sendImageAttachment=this.sendImageAttachment.bind(this),this.sendFileAttachment=this.sendFileAttachment.bind(this),this.sendKeyPress=this.sendKeyPress.bind(this),this.handleScrollReference=this.handleScrollReference.bind(this),this.handleScrollEvent=this.handleScrollEvent.bind(this),this.handleDescChange=this.handleDescChange.bind(this),this.handleSubsUpdated=this.handleSubsUpdated.bind(this),this.handleNewMessage=this.handleNewMessage.bind(this),this.handleAllMessagesReceived=this.handleAllMessagesReceived.bind(this),this.handleInfoReceipt=this.handleInfoReceipt.bind(this),this.handleImagePostview=this.handleImagePostview.bind(this),this.handleClosePreview=this.handleClosePreview.bind(this),this.handleFormResponse=this.handleFormResponse.bind(this),this.handleContextClick=this.handleContextClick.bind(this),this.handleShowContextMenuMessage=this.handleShowContextMenuMessage.bind(this),this.handleNewChatAcceptance=this.handleNewChatAcceptance.bind(this),this.handleEnablePeer=this.handleEnablePeer.bind(this),this.handleAttachFile=this.handleAttachFile.bind(this),this.handleAttachImage=this.handleAttachImage.bind(this),this.handleCancelUpload=this.handleCancelUpload.bind(this),this.postReadNotification=this.postReadNotification.bind(this),this.clearNotificationQueue=this.clearNotificationQueue.bind(this),this.readNotificationQueue=[],this.readNotificationTimer=null}componentDidMount(){this.messagesScroller&&this.messagesScroller.addEventListener("scroll",this.handleScrollEvent)}componentWillUnmount(){this.messagesScroller&&this.messagesScroller.removeEventListener("scroll",this.handleScrollEvent),this.clearNotificationQueue()}componentDidUpdate(e,t){this.messagesScroller&&(t.topic!=this.state.topic||t.messages.length!=this.state.messages.length?this.messagesScroller.scrollTop=this.messagesScroller.scrollHeight-this.state.scrollPosition:e.viewportHeight>this.props.viewportHeight&&(this.messagesScroller.scrollTop+=e.viewportHeight-this.props.viewportHeight));const s=this.props.tinode.getTopic(this.state.topic);if(this.state.topic!=t.topic&&(t.topic&&!r().isNewGroupTopicName(t.topic)&&this.leave(t.topic),s&&(s.onData=this.handleNewMessage,s.onAllMessagesReceived=this.handleAllMessagesReceived,s.onInfo=this.handleInfoReceipt,s.onMetaDesc=this.handleDescChange,s.onSubsUpdated=this.handleSubsUpdated,s.onPres=this.handleSubsUpdated)),this.props.applicationVisible?this.postReadNotification(0):this.clearNotificationQueue(),s&&!s.isSubscribed()&&this.props.ready&&(this.state.topic!=t.topic||!e.ready)){const e=this.props.newTopicParams&&this.props.newTopicParams._topicName==this.props.topic;let t=s.startMetaQuery().withLaterDesc();(this.state.isSharer||e&&!s.isChannel())&&(t=t.withLaterSub()),(this.state.isReader||e)&&(t=t.withLaterData(v.MESSAGES_PAGE),this.state.isReader&&(t=t.withLaterDel()),this.setState({fetchingMessages:!0}));const a=e?this.props.newTopicParams:void 0;s.subscribe(t.build(),a).then((e=>{303!=e.code?(this.state.topic!=e.topic&&this.setState({topic:e.topic}),this.props.onNewTopicCreated(this.props.topic,e.topic),s.queuedMessages((e=>{!e._sending&&s.isSubscribed()&&s.publishMessage(e)}))):E.default.navigateTo(E.default.setUrlTopic("",e.params.topic))})).catch((e=>{console.log("Failed subscription to",this.state.topic),this.props.onError(e.message,"err");const t=k.getDerivedStateFromProps({},{});t.title=this.props.intl.formatMessage(C.not_found),this.setState(t)}))}}static getDerivedStateFromProps(e,t){let s={};if(e.topic){if(e.topic!=t.topic){const a=e.tinode.getTopic(e.topic);if(s={topic:e.topic,docPreview:null,imagePreview:null,imagePostview:null,typingIndicator:!1,scrollPosition:0,fetchingMessages:!1},a){const n=[],i=[];e.connected&&a.subscribers((t=>{t.online&&t.user!=e.myUserId&&i.push(t)})),a.messages((function(e){e.deleted||n.push(e)})),Object.assign(s,{messages:n,onlineSubs:i}),a.public?Object.assign(s,{title:a.public.fn,avatar:(0,f.makeImageUrl)(a.public.photo)}):Object.assign(s,{title:"",avatar:null});const o=a.p2pPeerDesc();o?Object.assign(s,{peerMessagingDisabled:y(o.acs)}):t.peerMessagingDisabled&&Object.assign(s,{peerMessagingDisabled:!1}),Object.assign(s,{channel:a.isChannel()})}else Object.assign(s,{messages:[],onlineSubs:[],title:"",avatar:null,peerMessagingDisabled:!1,channel:!1})}}else s={messages:[],onlineSubs:[],topic:null,title:"",avatar:null,docPreview:null,imagePreview:null,imagePostview:null,typingIndicator:!1,scrollPosition:0,fetchingMessages:!1,peerMessagingDisabled:!1,channel:!1};return e.acs?(e.acs.isWriter()!=t.isWriter&&(s.isWriter=!t.isWriter),e.acs.isReader()!=t.isReader&&(s.isReader=!t.isReader),!e.acs.isReader("given")!=t.readingBlocked&&(s.readingBlocked=!t.readingBlocked),e.acs.isSharer()!=t.isSharer&&(s.isSharer=!t.isSharer)):(t.isWriter&&(s.isWriter=!1),t.isReader&&(s.isReader=!1),t.readingBlocked||(t.readingBlocked=!0),t.isSharer&&(s.isSharer=!1)),M(e.acs)==!t.unconformed&&(s.unconfirmed=!t.unconformed),!e.connected&&t.onlineSubs&&t.onlineSubs.length>0&&(s.onlineSubs=[]),s}leave(e){if(!e)return;let t=this.props.tinode.getTopic(e);t&&t.isSubscribed()&&t.leave(!1).catch((()=>{})).finally((()=>{this.setState({fetchingMessages:!1}),t.onData=void 0,t.onAllMessagesReceived=void 0,t.onInfo=void 0,t.onMetaDesc=void 0,t.onSubsUpdated=void 0,t.onPres=void 0}))}handleScrollReference(e){e&&(e.addEventListener("scroll",this.handleScrollEvent),this.messagesScroller=e,this.messagesScroller.scrollTop=this.messagesScroller.scrollHeight-this.state.scrollPosition)}handleScrollEvent(e){this.setState({scrollPosition:e.target.scrollHeight-e.target.scrollTop}),e.target.scrollTop<=0&&this.setState(((e,t)=>{const s={};if(!e.fetchingMessages){const e=this.props.tinode.getTopic(this.state.topic);e&&e.isSubscribed()&&e.msgHasMoreMessages()&&(s.fetchingMessages=!0,e.getMessagesPage(v.MESSAGES_PAGE).catch((e=>{this.setState({fetchingMessages:!1}),this.props.onError(e.message,"err")})))}return s}))}handleDescChange(e){e.public?this.setState({title:e.public.fn,avatar:(0,f.makeImageUrl)(e.public.photo)}):this.setState({title:"",avatar:null}),e.acs&&this.setState({isWriter:e.acs.isWriter(),isReader:e.acs.isReader(),readingBlocked:!e.acs.isReader("given"),unconfirmed:M(e.acs)})}postReadNotification(e){if(!this.props.applicationVisible)return;this.readNotificationTimer||(this.readNotificationTimer=setInterval((()=>{if(0==this.readNotificationQueue.length)return clearInterval(this.readNotificationTimer),void(this.readNotificationTimer=null);let e=-1;for(;this.readNotificationQueue.length>0;){const t=this.readNotificationQueue[0];if(t.topicName!=this.state.topic){this.readNotificationQueue.shift();continue}const s=new Date;if(!(t.sendAt<=s))break;this.readNotificationQueue.shift(),e=Math.max(e,t.seq)}if(e>=0){const t=this.props.tinode.getTopic(this.state.topic);t&&t.noteRead(e)}}),300));const t=new Date;this.readNotificationQueue.push({topicName:this.state.topic,seq:e,sendAt:t.setMilliseconds(t.getMilliseconds()+v.READ_DELAY)})}clearNotificationQueue(){this.readNotificationQueue=[],this.readNotificationTimer&&(clearInterval(this.readNotificationTimer),this.readNotificationTimer=null)}handleSubsUpdated(){if(this.state.topic){const e=[],t=this.props.tinode.getTopic(this.state.topic);t.subscribers((t=>{t.online&&t.user!=this.props.myUserId&&e.push(t)}));const s={onlineSubs:e},a=t.p2pPeerDesc();a?Object.assign(s,{peerMessagingDisabled:y(a.acs)}):this.state.peerMessagingDisabled&&Object.assign(s,{peerMessagingDisabled:!1}),this.setState(s)}}handleNewMessage(e){const t=this.props.tinode.getTopic(this.state.topic),s={messages:[]};if(t.messages((e=>{e.deleted||s.messages.push(e)})),e&&!e.deleted){t.isNewMessage(e.seq)&&(s.scrollPosition=0);t.msgStatus(e)>=r().MESSAGE_STATUS_SENT&&e.from!=this.props.myUserId&&this.postReadNotification(e.seq),this.props.onData(e)}this.setState(s)}handleAllMessagesReceived(e){this.setState({fetchingMessages:!1}),e>0&&this.postReadNotification(0)}handleInfoReceipt(e){switch(e.what){case"kp":clearTimeout(this.keyPressTimer);var t=this;this.keyPressTimer=setTimeout((function(){t.setState({typingIndicator:!1})}),v.KEYPRESS_DELAY+1e3),this.state.typingIndicator||this.setState({typingIndicator:!0});break;case"read":case"recv":this.forceUpdate();break;default:console.log("Other change in topic: ",e.what)}}handleImagePostview(e){this.setState({imagePostview:e})}handleClosePreview(){this.state.imagePreview&&this.state.imagePreview.url&&URL.revokeObjectURL(this.state.imagePreview.url),this.setState({imagePostview:null,imagePreview:null,docPreview:null})}handleFormResponse(e,t,s){if("pub"==e)this.props.sendMessage(S.attachJSON(S.parse(t),s));else if("url"==e){const e=new URL(s.ref),t=e.searchParams;for(let e in s.resp)s.resp.hasOwnProperty(e)&&t.set(e,s.resp[e]);["name","seq"].map((function(e){s[e]&&t.set(e,s[e])})),t.set("uid",this.props.myUserId),e.search=t,window.open(e,"_blank")}else console.log("Unknown action in form",e)}handleContextClick(e){e.preventDefault(),e.stopPropagation(),this.props.showContextMenu({topicName:this.state.topic,y:e.pageY,x:e.pageX})}handleShowContextMenuMessage(e,t){e.topicName=this.state.topic;const s=t||[],a=this.props.tinode.getTopic(e.topicName);if(a){a.isChannel()||s.push("message_delete");const e=a.getAccessMode();e&&e.isDeleter()&&s.push("message_delete_hard")}this.props.showContextMenu(e,s)}handleNewChatAcceptance(e){this.props.onNewChat(this.state.topic,e)}handleEnablePeer(e){e.preventDefault(),this.props.onChangePermissions(this.state.topic,v.DEFAULT_P2P_ACCESS_MODE,this.state.topic)}sendKeyPress(){const e=this.props.tinode.getTopic(this.state.topic);e.isSubscribed()&&e.noteKeyPress()}sendFileAttachment(e){const t=.75*this.props.tinode.getServerLimit("maxMessageSize",v.MAX_INBAND_ATTACHMENT_SIZE)-1024|0;if(e.size>t){const t=this.props.tinode.getLargeFileHelper();if(!t)return void this.props.onError(this.props.intl.formatMessage(C.cannot_initiate_upload));const s=t.upload(e),a=S.attachFile(null,{mime:e.type,filename:e.name,size:e.size,urlPromise:s});this.props.sendMessage(a,s,t)}else(0,f.fileToBase64)(e,((e,t,s)=>{this.props.sendMessage(S.attachFile(null,{mime:e,data:t,filename:s}))}),this.props.onError)}handleAttachFile(e){const t=this.props.tinode.getServerLimit("maxFileUploadSize",v.MAX_EXTERN_ATTACHMENT_SIZE);e.size>t?this.props.onError(this.props.intl.formatMessage({id:"file_attachment_too_large"},{size:(0,w.bytesToHumanSize)(e.size),limit:(0,w.bytesToHumanSize)(t)}),"err"):this.setState({docPreview:{file:e,filename:e.name,size:e.size,type:e.type}})}sendImageAttachment(e,t){const s=this.state.imagePreview.type,a=this.state.imagePreview.width,n=this.state.imagePreview.height,i=this.state.imagePreview.filename,o=.75*this.props.tinode.getServerLimit("maxMessageSize",v.MAX_INBAND_ATTACHMENT_SIZE)-1024|0;if(t.size>o){const o=this.props.tinode.getLargeFileHelper();if(!o)return void this.props.onError(this.props.intl.formatMessage(C.cannot_initiate_upload));const r=o.upload(t);(0,f.imageScaled)(t,v.IMAGE_PREVIEW_DIM,v.IMAGE_PREVIEW_DIM,-1,!1,(l=>{(0,f.blobToBase64)(l,((l,c)=>{let d=S.insertImage(null,0,{mime:s,_tempPreview:c,width:a,height:n,filename:i,size:t.size,urlPromise:r});e&&(d=S.appendLineBreak(d),d=S.append(d,S.init(e))),this.props.sendMessage(d,r,o)}))}),(e=>{this.props.onError(e,"err")}))}else(0,f.blobToBase64)(t,((s,o)=>{let r=S.insertImage(null,0,{mime:s,preview:o,width:a,height:n,filename:i,size:t.size});e&&(r=S.appendLineBreak(r),r=S.append(r,S.init(e))),this.props.sendMessage(r)}))}handleAttachImage(e){const t=this.props.tinode.getServerLimit("maxFileUploadSize",v.MAX_EXTERN_ATTACHMENT_SIZE);(0,f.imageScaled)(e,v.MAX_IMAGE_DIM,v.MAX_IMAGE_DIM,t,!1,((e,t,s,a,n)=>{this.setState({imagePreview:{url:URL.createObjectURL(e),blob:e,filename:n,width:s,height:a,size:e.size,type:t}})}),(e=>{this.props.onError(e,"err")}))}handleCancelUpload(e,t){const s=this.state.messages.find((t=>t.seq==e));s&&(s._cancelled=!0),t.cancel()}render(){const{formatMessage:e}=this.props.intl;let t;if(this.props.hideSelf)t=null;else if(this.state.topic){let s;if(this.state.imagePreview)s=n().createElement(p.default,{content:this.state.imagePreview,onClose:this.handleClosePreview,onSendMessage:this.sendImageAttachment});else if(this.state.imagePostview)s=n().createElement(p.default,{content:this.state.imagePostview,onClose:this.handleClosePreview});else if(this.state.docPreview)s=n().createElement(c.default,{content:this.state.docPreview,onClose:this.handleClosePreview,onSendMessage:this.sendFileAttachment});else{const t=this.props.tinode.getTopic(this.state.topic),a=t.isChannel(),o="grp"==t.getType()&&!a;let c=[],p=null,g=null;for(let e=0;e{e.preventDefault(),this.props.onHideMessagesView()}},n().createElement("i",{className:"material-icons"},"arrow_back")):null,n().createElement("div",{className:"avatar-box"},n().createElement(m.default,{avatar:E,topic:this.state.topic,title:this.state.title}),a?null:n().createElement("span",{className:S})),n().createElement("div",{id:"topic-title-group"},n().createElement("div",{id:"topic-title",className:"panel-title"},this.state.title||n().createElement("i",null,n().createElement(i.FormattedMessage,{id:"unnamed_topic",defaultMessage:[{type:0,value:"Unnamed"}]}))),n().createElement("div",{id:"topic-last-seen"},v)),o?n().createElement(h.default,{subscribers:this.state.onlineSubs}):n().createElement("div",{id:"topic-users"}),n().createElement("div",null,n().createElement("a",{href:"#",onClick:this.handleContextClick},n().createElement("i",{className:"material-icons"},"more_vert")))),this.props.displayMobile?n().createElement(d.default,{level:this.props.errorLevel,text:this.props.errorText,onClearError:this.props.onError}):null,n().createElement(_.default,{show:this.state.fetchingMessages}),n().createElement("div",{id:"messages-container"},n().createElement("div",{id:"messages-panel",ref:this.handleScrollReference},n().createElement("ul",{id:"scroller",className:g},c)),this.state.isReader?null:n().createElement("div",{id:"write-only-background"},this.state.readingBlocked?n().createElement("div",{id:"write-only-note"},n().createElement(i.FormattedMessage,{id:"messages_not_readable",defaultMessage:[{type:0,value:"no access to messages"}]})):null)),this.state.peerMessagingDisabled&&!this.state.unconfirmed?n().createElement("div",{id:"peer-messaging-disabled-note"},n().createElement("i",{className:"material-icons secondary"},"block")," ",n().createElement(i.FormattedMessage,{id:"peers_messaging_disabled",defaultMessage:[{type:0,value:"Peer's messaging is disabled."}]})," ",n().createElement("a",{href:"#",onClick:this.handleEnablePeer},n().createElement(i.FormattedMessage,{id:"enable_peers_messaging",defaultMessage:[{type:0,value:"Enable"}]})),"."):null,this.state.unconfirmed?n().createElement(u.default,{onAction:this.handleNewChatAcceptance}):n().createElement(b.default,{disabled:!this.state.isWriter,onSendMessage:this.props.sendMessage,onKeyPress:this.sendKeyPress,onAttachFile:this.handleAttachFile,onAttachImage:this.handleAttachImage,onError:this.props.onError}))}t=n().createElement("div",{id:"topic-view"},s)}else t=n().createElement(g.default,{serverVersion:this.props.serverVersion,serverAddress:this.props.serverAddress});return t}}t.default=(0,i.injectIntl)(k)},"./src/views/new-topic-view.jsx":function(e,t,s){s.r(t);var a=s("react"),n=s.n(a),i=s("react-intl"),o=s("tinode-sdk"),r=s.n(o),l=s("./src/widgets/contact-list.jsx"),c=s("./src/widgets/new-topic-by-id.jsx"),d=s("./src/widgets/new-topic-group.jsx"),h=s("./src/widgets/search-contacts.jsx"),p=s("./src/lib/navigation.js"),u=s("./src/lib/utils.js");const m=(0,i.defineMessages)({search_for_contacts:{id:"search_for_contacts",defaultMessage:[{type:0,value:"Use search to find contacts"}]},search_no_results:{id:"search_no_results",defaultMessage:[{type:0,value:"Search returned no results"}]}});class _ extends n().Component{constructor(e){super(e),this.state={tabSelected:"p2p",searchQuery:null},this.handleTabClick=this.handleTabClick.bind(this),this.handleSearchContacts=this.handleSearchContacts.bind(this),this.handleContactSelected=this.handleContactSelected.bind(this),this.handleNewGroupSubmit=this.handleNewGroupSubmit.bind(this),this.handleGroupByID=this.handleGroupByID.bind(this)}componentDidMount(){this.props.onInitFind()}handleTabClick(e){e.preventDefault(),p.default.navigateTo(p.default.addUrlParam(window.location.hash,"tab",e.currentTarget.dataset.id)),this.setState({tabSelected:e.currentTarget.dataset.id})}handleSearchContacts(e){this.props.onSearchContacts(e),this.setState({searchQuery:r().isNullValue(e)?null:e})}handleContactSelected(e){"p2p"===this.state.tabSelected&&(p.default.navigateTo(p.default.removeUrlParam(window.location.hash,"tab")),this.props.onCreateTopic(e))}handleNewGroupSubmit(e,t,s,a,n){p.default.navigateTo(p.default.removeUrlParam(window.location.hash,"tab")),this.props.onCreateTopic(void 0,(0,u.vcard)(e,t),s,a,n)}handleGroupByID(e){p.default.navigateTo(p.default.removeUrlParam(window.location.hash,"tab")),this.props.onCreateTopic(e)}render(){const{formatMessage:e}=this.props.intl,t=e(this.state.searchQuery?m.search_no_results:m.search_for_contacts);return n().createElement("div",{className:"flex-column"},n().createElement("ul",{className:"tabbar"},n().createElement("li",{className:"p2p"===this.state.tabSelected?"active":null},n().createElement("a",{href:"#","data-id":"p2p",onClick:this.handleTabClick},n().createElement(i.FormattedMessage,{id:"tabtitle_find_user",defaultMessage:[{type:0,value:"find"}]}))),n().createElement("li",{className:"grp"===this.state.tabSelected?"active":null},n().createElement("a",{href:"#","data-id":"grp",onClick:this.handleTabClick},n().createElement(i.FormattedMessage,{id:"tabtitle_new_group",defaultMessage:[{type:0,value:"new group"}]}))),n().createElement("li",{className:"byid"===this.state.tabSelected?"active":null},n().createElement("a",{href:"#","data-id":"byid",onClick:this.handleTabClick},n().createElement(i.FormattedMessage,{id:"tabtitle_group_by_id",defaultMessage:[{type:0,value:"by id"}]})))),"grp"===this.state.tabSelected?n().createElement(d.default,{tinode:this.props.tinode,onSubmit:this.handleNewGroupSubmit}):"byid"===this.state.tabSelected?n().createElement(c.default,{onSubmit:this.handleGroupByID,onError:this.props.onError}):n().createElement("div",{className:"flex-column"},n().createElement(h.default,{type:"p2p",onSearchContacts:this.handleSearchContacts}),n().createElement(l.default,{contacts:this.props.searchResults,myUserId:this.props.myUserId,emptyListMessage:t,showOnline:!1,showUnread:!1,showContextMenu:!1,onTopicSelected:this.handleContactSelected})))}}t.default=(0,i.injectIntl)(_)},"./src/views/password-reset-view.jsx":function(e,t,s){s.r(t),s.d(t,{default:function(){return l}});var a=s("react"),n=s.n(a),i=s("react-intl"),o=s("./src/widgets/visible-password.jsx"),r=s("./src/lib/navigation.js");class l extends n().PureComponent{constructor(e){super(e),this.state={email:"",password:""},this.handleSubmit=this.handleSubmit.bind(this),this.handleEmailChange=this.handleEmailChange.bind(this),this.handlePasswordChange=this.handlePasswordChange.bind(this)}componentDidMount(){let e=r.default.parseUrlHash(window.location.hash);this.setState({token:e.params.token,scheme:e.params.scheme})}handleSubmit(e){e.preventDefault(),this.state.token?this.props.onReset(this.state.scheme,this.state.password.trim(),this.state.token):this.props.onRequest("email",this.state.email.trim())}handleEmailChange(e){this.setState({email:e.target.value})}handlePasswordChange(e){this.setState({password:e.target.value})}render(){let e=this.state.token&&this.state.scheme;return n().createElement("form",{id:"password-reset-form",onSubmit:this.handleSubmit},e?n().createElement(i.FormattedMessage,{id:"new_password_placeholder",defaultMessage:[{type:0,value:"Enter new password"}]},(e=>n().createElement(o.default,{placeholder:e,autoComplete:"new-password",value:this.state.password,required:!0,autoFocus:!0,onChange:this.handlePasswordChange}))):n().createElement(n().Fragment,null,n().createElement("label",{htmlFor:"inputEmail"},n().createElement(i.FormattedMessage,{id:"label_reset_password",defaultMessage:[{type:0,value:"Send a password reset email:"}]})),n().createElement(i.FormattedMessage,{id:"credential_email_prompt",defaultMessage:[{type:0,value:"Your registration email"}]},(e=>n().createElement("input",{type:"email",id:"inputEmail",placeholder:e,autoComplete:"email",value:this.state.email,onChange:this.handleEmailChange,required:!0,autoFocus:!0})))),n().createElement("div",{className:"dialog-buttons"},n().createElement("button",{className:"blue",type:"submit"},e?n().createElement(i.FormattedMessage,{id:"button_reset",defaultMessage:[{type:0,value:"Reset"}]}):n().createElement(i.FormattedMessage,{id:"button_send_request",defaultMessage:[{type:0,value:"Send request"}]}))))}}},"./src/views/settings-view.jsx":function(e,t,s){s.r(t),s.d(t,{default:function(){return r}});var a=s("react"),n=s.n(a),i=s("react-intl"),o=s("./src/widgets/host-selector.jsx");class r extends n().PureComponent{constructor(e){super(e),this.state={transport:e.transport||"def",serverAddress:e.serverAddress},this.handleSubmit=this.handleSubmit.bind(this),this.handleTransportSelected=this.handleTransportSelected.bind(this),this.handleServerAddressChange=this.handleServerAddressChange.bind(this)}handleSubmit(e){e.preventDefault(),this.props.onUpdate({transport:this.state.transport,serverAddress:this.state.serverAddress})}handleTransportSelected(e){this.setState({transport:e.currentTarget.value})}handleServerAddressChange(e){this.setState({serverAddress:e})}render(){const e={def:"default",ws:"websocket",lp:"long polling"};var t=[],s=this;return["def","ws","lp"].map((function(a){var i="transport-"+a,o=e[a];t.push(n().createElement("li",{key:a},n().createElement("input",{type:"radio",id:i,name:"transport-select",value:a,checked:s.state.transport===a,onChange:s.handleTransportSelected}),n().createElement("label",{htmlFor:i},o)))})),n().createElement("form",{id:"settings-form",className:"panel-form",onSubmit:this.handleSubmit},n().createElement("div",{className:"panel-form-row"},n().createElement("label",{className:"small"},n().createElement(i.FormattedMessage,{id:"label_server_to_use",defaultMessage:[{type:0,value:"Server to use:"}]}))),n().createElement(o.default,{serverAddress:this.state.serverAddress,onServerAddressChange:this.handleServerAddressChange}),n().createElement("div",{className:"panel-form-row"},n().createElement("label",{className:"small"},n().createElement(i.FormattedMessage,{id:"label_wire_transport",defaultMessage:[{type:0,value:"Wire transport:"}]}))),n().createElement("div",{className:"panel-form-row"},n().createElement("ul",{className:"quoted"},t)),n().createElement("div",{className:"dialog-buttons"},n().createElement("button",{type:"submit",className:"blue"},n().createElement(i.FormattedMessage,{id:"button_update",defaultMessage:[{type:0,value:"Update"}]}))))}}},"./src/views/sidepanel-view.jsx":function(e,t,s){s.r(t);var a=s("react"),n=s.n(a),i=s("react-intl"),o=s("./src/widgets/error-panel.jsx"),r=s("./src/widgets/load-spinner.jsx"),l=s("./src/widgets/side-navbar.jsx"),c=s("./src/views/contacts-view.jsx"),d=s("./src/views/create-account-view.jsx"),h=s("./src/views/edit-account-view.jsx"),p=s("./src/views/acc-general-view.jsx"),u=s("./src/views/acc-notifications-view.jsx"),m=s("./src/views/acc-security-view.jsx"),_=s("./src/views/acc-support-view.jsx"),g=s("./src/views/login-view.jsx"),b=s("./src/views/new-topic-view.jsx"),v=s("./src/views/password-reset-view.jsx"),f=s("./src/views/settings-view.jsx"),E=s("./src/views/validation-view.jsx");const w=(0,i.defineMessages)({login:{id:"sidepanel_title_login",defaultMessage:[{type:0,value:"Sign In"}]},register:{id:"sidepanel_title_register",defaultMessage:[{type:0,value:"Create Account"}]},settings:{id:"sidepanel_title_settings",defaultMessage:[{type:0,value:"Settings"}]},edit:{id:"sidepanel_title_account_settings",defaultMessage:[{type:0,value:"Account Settings"}]},general:{id:"sidepanel_title_acc_general",defaultMessage:[{type:0,value:"General"}]},security:{id:"sidepanel_title_acc_security",defaultMessage:[{type:0,value:"Security"}]},notif:{id:"sidepanel_title_acc_notifications",defaultMessage:[{type:0,value:"Notifications"}]},support:{id:"sidepanel_title_acc_support",defaultMessage:[{type:0,value:"Support"}]},newtpk:{id:"sidepanel_title_newtpk",defaultMessage:[{type:0,value:"Start New Chat"}]},cred:{id:"sidepanel_title_cred",defaultMessage:[{type:0,value:"Confirm Credentials"}]},reset:{id:"sidepanel_title_reset",defaultMessage:[{type:0,value:"Reset Password"}]},archive:{id:"sidepanel_title_archive",defaultMessage:[{type:0,value:"Archived Chats"}]},blocked:{id:"sidepanel_title_blocked",defaultMessage:[{type:0,value:"Blocked Chats"}]}});class S extends n().Component{constructor(e){super(e),this.handleLoginRequested=this.handleLoginRequested.bind(this),this.handleNewTopic=this.handleNewTopic.bind(this)}handleLoginRequested(e,t){this.props.onLoginRequest(e,t)}handleNewTopic(){this.props.onBasicNavigate("newtpk")}render(){const{formatMessage:e}=this.props.intl,t=this.props.state||(this.props.myUserId?"contacts":"login");let s,a,i;return"contacts"==t?(s=this.props.title,a=!this.props.avatar||this.props.avatar):(s=e(w[t]),a=!1),-1==["login","contacts"].indexOf(t)&&(i=this.props.onCancel),n().createElement("div",{id:"sidepanel",className:this.props.hideSelf?"nodisplay":null},n().createElement(l.default,{state:t,title:s,avatar:a,myUserId:this.props.myUserId,onSignUp:this.props.onSignUp,onSettings:this.props.onSettings,onNewTopic:this.handleNewTopic,onCancel:i}),n().createElement(o.default,{level:this.props.errorLevel,text:this.props.errorText,action:this.props.errorAction,actionText:this.props.errorActionText,onClearError:this.props.onError}),n().createElement(r.default,{show:this.props.loadSpinnerVisible}),"login"===t?n().createElement(g.default,{login:this.props.login,disabled:this.props.loginDisabled,onLogin:this.handleLoginRequested}):"register"===t?n().createElement(d.default,{onCreateAccount:this.props.onCreateAccount,onCancel:this.props.onCancel,onError:this.props.onError}):"settings"===t?n().createElement(f.default,{transport:this.props.transport,serverAddress:this.props.serverAddress,onCancel:this.props.onCancel,onUpdate:this.props.onGlobalSettings}):"edit"===t?n().createElement(h.default,{tinode:this.props.tinode,myUserId:this.props.myUserId,onBasicNavigate:this.props.onBasicNavigate}):"general"===t?n().createElement(p.default,{tinode:this.props.tinode,myUserId:this.props.myUserId,onUpdateAccount:this.props.onUpdateAccount,onUpdateTags:this.props.onUpdateAccountTags,onCredAdd:this.props.onCredAdd,onCredDelete:this.props.onCredDelete,onCredConfirm:this.props.onCredConfirm,onBasicNavigate:this.props.onBasicNavigate,onError:this.props.onError}):"notif"===t?n().createElement(u.default,{messageSounds:this.props.messageSounds,desktopAlerts:this.props.desktopAlerts,desktopAlertsEnabled:this.props.desktopAlertsEnabled,incognitoMode:this.props.incognitoMode,onTogglePushNotifications:this.props.onTogglePushNotifications,onToggleMessageSounds:this.props.onToggleMessageSounds,onToggleIncognitoMode:this.props.onToggleIncognitoMode}):"security"===t?n().createElement(m.default,{tinode:this.props.tinode,onUpdateAccount:this.props.onUpdateAccount,onLogout:this.props.onLogout,onDeleteAccount:this.props.onDeleteAccount,onShowAlert:this.props.onShowAlert,onShowBlocked:this.props.onShowBlocked}):"support"===t?n().createElement(_.default,{serverAddress:this.props.serverAddress,serverVersion:this.props.serverVersion}):"contacts"===t||"archive"==t||"blocked"==t?n().createElement(c.default,{tinode:this.props.tinode,myUserId:this.props.myUserId,connected:this.props.connected,topicSelected:this.props.topicSelected,archive:"archive"==t,blocked:"blocked"==t,chatList:this.props.chatList,showContextMenu:this.props.showContextMenu,onTopicSelected:this.props.onTopicSelected,onShowArchive:this.props.onShowArchive}):"newtpk"===t?n().createElement(b.default,{tinode:this.props.tinode,searchResults:this.props.searchResults,onInitFind:this.props.onInitFind,onSearchContacts:this.props.onSearchContacts,onCreateTopic:this.props.onCreateTopic,onError:this.props.onError}):"cred"===t?n().createElement(E.default,{credCode:this.props.credCode,credMethod:this.props.credMethod,onSubmit:this.props.onValidateCredentials,onCancel:this.props.onCancel,onError:this.props.onError}):"reset"===t?n().createElement(v.default,{onRequest:this.props.onPasswordResetRequest,onReset:this.props.onResetPassword}):null)}}t.default=(0,i.injectIntl)(S)},"./src/views/tinode-web.jsx":function(e,t,s){s.r(t);var a=s("react"),n=s.n(a),i=s("react-dom"),o=s.n(i),r=s("react-intl"),l=s("firebase/app"),c=(s("firebase/messaging"),s("tinode-sdk")),d=s.n(c),h=s("./src/widgets/alert.jsx"),p=s("./src/widgets/context-menu.jsx"),u=s("./src/views/info-view.jsx"),m=s("./src/views/messages-view.jsx"),_=s("./src/views/sidepanel-view.jsx"),g=s("./src/config.js"),b=s("./src/lib/blob-helpers.js"),v=s("./src/lib/host-name.js"),f=s("./src/lib/local-storage.js"),E=s("./src/lib/navigation.js"),w=s("./src/lib/strformat.js"),S=s("./src/lib/utils.js");const C=new Audio("audio/msg.mp3"),M=(0,r.defineMessages)({reconnect_countdown:{id:"reconnect_countdown",defaultMessage:[{type:0,value:"Disconnected. Reconnecting in "},{type:1,value:"seconds"},{type:0,value:"…"}]},reconnect_now:{id:"reconnect_now",defaultMessage:[{type:0,value:"Try now"}]},push_init_failed:{id:"push_init_failed",defaultMessage:[{type:0,value:"Failed to initialize push notifications"}]},invalid_security_token:{id:"invalid_security_token",defaultMessage:[{type:0,value:"Invalid security token"}]},no_connection:{id:"no_connection",defaultMessage:[{type:0,value:"No connection"}]},code_doesnot_match:{id:"code_doesnot_match",defaultMessage:[{type:0,value:"Code does not match"}]}});class y extends n().Component{constructor(e){super(e),this.state=this.getBlankState(),this.handleResize=this.handleResize.bind(this),this.handleHashRoute=this.handleHashRoute.bind(this),this.handleOnline=this.handleOnline.bind(this),this.checkForAppUpdate=this.checkForAppUpdate.bind(this),this.handleVisibilityEvent=this.handleVisibilityEvent.bind(this),this.handleError=this.handleError.bind(this),this.handleLoginRequest=this.handleLoginRequest.bind(this),this.handleConnected=this.handleConnected.bind(this),this.handleAutoreconnectIteration=this.handleAutoreconnectIteration.bind(this),this.doLogin=this.doLogin.bind(this),this.handleCredentialsRequest=this.handleCredentialsRequest.bind(this),this.handleLoginSuccessful=this.handleLoginSuccessful.bind(this),this.handleDisconnect=this.handleDisconnect.bind(this),this.tnMeMetaDesc=this.tnMeMetaDesc.bind(this),this.tnMeContactUpdate=this.tnMeContactUpdate.bind(this),this.tnMeSubsUpdated=this.tnMeSubsUpdated.bind(this),this.resetContactList=this.resetContactList.bind(this),this.tnData=this.tnData.bind(this),this.tnInitFind=this.tnInitFind.bind(this),this.tnFndSubsUpdated=this.tnFndSubsUpdated.bind(this),this.handleSearchContacts=this.handleSearchContacts.bind(this),this.handleTopicSelected=this.handleTopicSelected.bind(this),this.handleHideMessagesView=this.handleHideMessagesView.bind(this),this.handleSendMessage=this.handleSendMessage.bind(this),this.handleNewChatInvitation=this.handleNewChatInvitation.bind(this),this.handleNewAccount=this.handleNewAccount.bind(this),this.handleNewAccountRequest=this.handleNewAccountRequest.bind(this),this.handleUpdateAccountRequest=this.handleUpdateAccountRequest.bind(this),this.handleUpdateAccountTagsRequest=this.handleUpdateAccountTagsRequest.bind(this),this.handleToggleIncognitoMode=this.handleToggleIncognitoMode.bind(this),this.handleSettings=this.handleSettings.bind(this),this.handleGlobalSettings=this.handleGlobalSettings.bind(this),this.handleShowArchive=this.handleShowArchive.bind(this),this.handleShowBlocked=this.handleShowBlocked.bind(this),this.handleToggleMessageSounds=this.handleToggleMessageSounds.bind(this),this.handleCredAdd=this.handleCredAdd.bind(this),this.handleCredDelete=this.handleCredDelete.bind(this),this.handleCredConfirm=this.handleCredConfirm.bind(this),this.initDesktopAlerts=this.initDesktopAlerts.bind(this),this.togglePushToken=this.togglePushToken.bind(this),this.requestPushToken=this.requestPushToken.bind(this),this.handleSidepanelCancel=this.handleSidepanelCancel.bind(this),this.handleStartTopicRequest=this.handleStartTopicRequest.bind(this),this.handleNewTopicCreated=this.handleNewTopicCreated.bind(this),this.handleTopicUpdateRequest=this.handleTopicUpdateRequest.bind(this),this.handleChangePermissions=this.handleChangePermissions.bind(this),this.handleTagsUpdated=this.handleTagsUpdated.bind(this),this.handleLogout=this.handleLogout.bind(this),this.handleDeleteAccount=this.handleDeleteAccount.bind(this),this.handleDeleteMessagesRequest=this.handleDeleteMessagesRequest.bind(this),this.handleLeaveUnsubRequest=this.handleLeaveUnsubRequest.bind(this),this.handleBlockTopicRequest=this.handleBlockTopicRequest.bind(this),this.handleReportTopic=this.handleReportTopic.bind(this),this.handleShowContextMenu=this.handleShowContextMenu.bind(this),this.defaultTopicContextMenu=this.defaultTopicContextMenu.bind(this),this.handleHideContextMenu=this.handleHideContextMenu.bind(this),this.handleShowAlert=this.handleShowAlert.bind(this),this.handleShowInfoView=this.handleShowInfoView.bind(this),this.handleHideInfoView=this.handleHideInfoView.bind(this),this.handleMemberUpdateRequest=this.handleMemberUpdateRequest.bind(this),this.handleValidateCredentialsRequest=this.handleValidateCredentialsRequest.bind(this),this.handlePasswordResetRequest=this.handlePasswordResetRequest.bind(this),this.handleResetPassword=this.handleResetPassword.bind(this),this.handleContextMenuAction=this.handleContextMenuAction.bind(this)}getBlankState(){const e=f.default.getObject("settings")||{};return{connected:!1,ready:!1,autoLogin:!1,transport:e.transport||null,serverAddress:e.serverAddress||(0,v.detectServerAddress)(),serverVersion:"no connection",messageSounds:!e.messageSoundsOff,incognitoMode:!1,desktopAlerts:e.desktopAlerts,desktopAlertsEnabled:((0,v.isSecureConnection)()||(0,v.isLocalHost)())&&void 0!==l&&"undefined"!=typeof navigator&&"undefined"!=typeof FIREBASE_INIT,firebaseToken:f.default.getObject("firebase-token"),applicationVisible:!document.hidden,errorText:"",errorLevel:null,errorAction:void 0,errorActionText:null,sidePanelSelected:"login",sidePanelTitle:null,sidePanelAvatar:null,loadSpinnerVisible:!1,login:"",password:"",myUserId:null,liveConnection:navigator.onLine,topicSelected:"",topicSelectedOnline:!1,topicSelectedAcs:null,newTopicParams:null,loginDisabled:!1,displayMobile:window.innerWidth<=g.MEDIA_BREAKPOINT,showInfoPanel:!1,mobilePanel:"sidepanel",contextMenuVisible:!1,contextMenuBounds:null,contextMenuClickAt:null,contextMenuParams:null,contextMenuItems:[],alertVisible:!1,alertParams:{},chatList:[],searchResults:[],searchableContacts:[],credMethod:void 0,credCode:void 0}}componentDidMount(){window.addEventListener("resize",this.handleResize),window.addEventListener("online",(e=>{this.handleOnline(!0)})),window.addEventListener("offline",(e=>{this.handleOnline(!1)})),window.addEventListener("hashchange",this.handleHashRoute),document.addEventListener("visibilitychange",this.handleVisibilityEvent),this.setState({viewportWidth:document.documentElement.clientWidth,viewportHeight:document.documentElement.clientHeight});const{formatMessage:e,locale:t}=this.props.intl;if(this.tinode=y.tnSetup(this.state.serverAddress,this.state.transport,t),this.tinode.onConnect=this.handleConnected,this.tinode.onDisconnect=this.handleDisconnect,this.tinode.onAutoreconnectIteration=this.handleAutoreconnectIteration,this.state.desktopAlertsEnabled)try{this.fbPush=l.initializeApp(FIREBASE_INIT,g.APP_NAME).messaging(),this.fbPush.usePublicVapidKey(FIREBASE_INIT.messagingVapidKey),navigator.serviceWorker.register("/service-worker.js").then((e=>{this.checkForAppUpdate(e),this.fbPush.useServiceWorker(e),e.active.postMessage(JSON.stringify({locale:t})),this.initDesktopAlerts(),this.state.desktopAlerts&&(this.state.firebaseToken?this.tinode.setDeviceToken(this.state.firebaseToken,!0):this.togglePushToken(!0))})).catch((e=>{console.log("Failed to register service worker:",e)}))}catch(t){this.handleError(e(M.push_init_failed),"err"),console.log("Failed to initialize push notifications",t),this.setState({desktopAlertsEnabled:!1})}const s=f.default.getObject("keep-logged-in")?f.default.getObject("auth-token"):void 0,a=E.default.parseUrlHash(window.location.hash);s?(this.setState({autoLogin:!0}),s.expires=new Date(s.expires),this.tinode.setAuthToken(s),this.tinode.connect().catch((e=>{this.handleError(e.message,"err")})),delete a.params.info,delete a.params.tab,a.path[0]="",E.default.navigateTo(E.default.composeUrlHash(a.path,a.params))):a.params.token||E.default.navigateTo(""),this.readTimer=null,this.readTimerCallback=null,this.handleHashRoute()}componentWillUnmount(){window.removeEventListener("resize",this.handleResize),window.removeEventListener("hashchange",this.handleHashRoute),document.removeEventListener("visibilitychange",this.handleVisibilityEvent)}static tnSetup(e,t,s){const a=new(d())(g.APP_NAME,e,g.API_KEY,t,(0,v.isSecureConnection)());return a.setHumanLanguage(s),a.enableLogging(g.LOGGING_ENABLED,!0),a}handleResize(){const e=document.documentElement.clientWidth<=g.MEDIA_BREAKPOINT;this.setState({viewportWidth:document.documentElement.clientWidth,viewportHeight:document.documentElement.clientHeight}),this.state.displayMobile!=e&&this.setState({displayMobile:e})}checkForAppUpdate(e){e.onupdatefound=()=>{const t=e.installing;t.onstatechange=()=>{if("installed"==t.state&&navigator.serviceWorker.controller){const e=n().createElement(n().Fragment,null,n().createElement(r.FormattedMessage,{id:"update_available",defaultMessage:[{type:0,value:"Update available."}]})," ",n().createElement("a",{href:""},n().createElement(r.FormattedMessage,{id:"reload_update",defaultMessage:[{type:0,value:"Reload"}]})),".");this.handleError(e,"info")}}}}handleHashRoute(){const e=E.default.parseUrlHash(window.location.hash);e.path&&e.path.length>0?(["register","settings","edit","notif","security","support","general","cred","reset","newtpk","archive","blocked","contacts",""].includes(e.path[0])?this.setState({sidePanelSelected:e.path[0]}):console.log("Unknown sidepanel view",e.path[0]),e.path.length>1&&e.path[1]!=this.state.topicSelected&&this.setState({topicSelected:d().topicType(e.path[1])?e.path[1]:null})):this.setState({sidePanelSelected:""}),e.params.method&&this.setState({credMethod:e.params.method}),e.params.code&&this.setState({credCode:e.params.code}),this.setState({showInfoPanel:e.params.info,newTopicTabSelected:e.params.tab})}handleOnline(e){e?this.handleError():this.handleError(this.props.intl.formatMessage(M.no_connection),"warn"),this.setState({liveConnection:e})}handleVisibilityEvent(){this.setState({applicationVisible:!document.hidden})}handleError(e,t,s,a){this.setState({errorText:e,errorLevel:t,errorAction:s,errorActionText:a})}handleLoginRequest(e,t){this.setState({loginDisabled:!0,login:e,password:t,loadSpinnerVisible:!0,autoLogin:!0}),this.handleError("",null),this.tinode.isConnected()?this.doLogin(e,t,{meth:this.state.credMethod,resp:this.state.credCode}):this.tinode.connect().catch((e=>{this.setState({loginDisabled:!1,autoLogin:!1,loadSpinnerVisible:!1}),this.handleError(e.message,"err")}))}handleConnected(){const e=this.tinode.getServerInfo();this.setState({serverVersion:e.ver+" "+(e.build?e.build:"none")}),this.state.autoLogin&&this.doLogin(this.state.login,this.state.password,{meth:this.state.credMethod,resp:this.state.credCode})}handleAutoreconnectIteration(e,t){if(clearInterval(this.reconnectCountdown),e<0)return void this.handleError();if(t)return void t.then((()=>{this.handleError()})).catch((e=>{this.handleError(e.message,"err")}));const{formatMessage:s}=this.props.intl;let a=e/1e3;a|=a,this.reconnectCountdown=setInterval((()=>{const e=a>99?(0,w.secondsToTime)(a):a;this.handleError(s(M.reconnect_countdown,{seconds:e}),"warn",(()=>{clearInterval(this.reconnectCountdown),this.tinode.reconnect()}),s(M.reconnect_now)),a-=1}),1e3)}handleDisconnect(e){this.setState({connected:!1,ready:!1,topicSelectedOnline:!1,errorText:e&&e.message?e.message:"Disconnected",errorLevel:e&&e.message?"err":"warn",loginDisabled:!1,contextMenuVisible:!1,serverVersion:"no connection"})}doLogin(e,t,s){if(this.tinode.isAuthenticated())return void E.default.navigateTo("");s=d().credential(s);let a=null;const n=this.tinode.getAuthToken();e&&t?(this.setState({password:null}),a=this.tinode.loginBasic(e,t,s)):n&&(a=this.tinode.loginToken(n.token,s)),a?a.then((e=>{e.code>=300&&"validate credentials"===e.text?(this.setState({loadSpinnerVisible:!1}),s&&this.handleError(this.props.intl.formatMessage(M.code_doesnot_match),"warn"),this.handleCredentialsRequest(e.params)):this.handleLoginSuccessful()})).catch((e=>{this.setState({loginDisabled:!1,credMethod:void 0,credCode:void 0,loadSpinnerVisible:!1,autoLogin:!1}),this.handleError(e.message,"err"),localStorage.removeItem("auth-token"),E.default.navigateTo("")})):(E.default.navigateTo(""),this.setState({loginDisabled:!1}))}handleCredentialsRequest(e){const t=E.default.parseUrlHash(window.location.hash);t.path[0]="cred",t.params.method=e.cred[0],E.default.navigateTo(E.default.composeUrlHash(t.path,t.params))}handleLoginSuccessful(){this.handleError(),f.default.getObject("keep-logged-in")&&f.default.setObject("auth-token",this.tinode.getAuthToken());const e=this.tinode.getMeTopic();e.onMetaDesc=this.tnMeMetaDesc,e.onContactUpdate=this.tnMeContactUpdate,e.onSubsUpdated=this.tnMeSubsUpdated,this.setState({connected:!0,credMethod:void 0,credCode:void 0,myUserId:this.tinode.getCurrentUserID(),autoLogin:!0}),e.subscribe(e.startMetaQuery().withLaterSub().withDesc().withTags().withCred().build()).catch((e=>{this.tinode.disconnect(),localStorage.removeItem("auth-token"),this.handleError(e.message,"err"),E.default.navigateTo("")})).finally((()=>{this.setState({loadSpinnerVisible:!1})})),E.default.navigateTo(E.default.setUrlSidePanel(window.location.hash,"contacts"))}tnMeMetaDesc(e){e&&(e.public&&this.setState({sidePanelTitle:e.public.fn,sidePanelAvatar:(0,b.makeImageUrl)(e.public.photo)}),e.acs&&this.setState({incognitoMode:!e.acs.isPresencer()}))}tnMeContactUpdate(e,t){if("on"==e||"off"==e)this.resetContactList(),this.state.topicSelected==t.topic&&this.setState({topicSelectedOnline:"on"==e});else if("read"==e)this.resetContactList();else if("msg"==e){const e=this.tinode.getTopic(t.topic),s=e&&e.isArchived();t.unread>0&&this.state.messageSounds&&!s&&(document.hidden||this.state.topicSelected!=t.topic)&&C.play(),this.resetContactList()}else"recv"==e||("gone"==e||"unsub"==e?(this.state.topicSelected==t.topic&&this.handleTopicSelected(null),this.resetContactList()):"acs"==e?this.state.topicSelected==t.topic&&this.setState({topicSelectedAcs:t.acs}):"del"==e||"upd"==e||console.log("Unsupported (yet) presence update:"+e+" in: "+t.topic))}tnMeSubsUpdated(e){this.resetContactList()}static prepareSearchableContacts(e,t){const s={};for(const t of e)d().isP2PTopicName(t.topic)&&(s[t.topic]={user:t.topic,updated:t.updated,public:t.public,private:t.private,acs:t.acs});for(const e of t)s[e.user]||(s[e.user]=e);return Object.values(s)}resetContactList(){const e={chatList:[]};this.state.ready||(e.ready=!0),this.tinode.getMeTopic().contacts((t=>{e.chatList.push(t),this.state.topicSelected==t.topic&&(e.topicSelectedOnline=t.online,e.topicSelectedAcs=t.acs)})),e.searchableContacts=y.prepareSearchableContacts(e.chatList,this.state.searchResults),this.setState(e)}tnData(e){const t=this.tinode.getTopic(e.topic);t.msgStatus(e)>=d().MESSAGE_STATUS_SENT&&e.from!=this.state.myUserId&&(clearTimeout(this.receivedTimer),this.receivedTimer=setTimeout((()=>{this.receivedTimer=void 0,t.noteRecv(e.seq)}),g.RECEIVED_DELAY))}tnInitFind(){const e=this.tinode.getFndTopic();e.onSubsUpdated=this.tnFndSubsUpdated,e.isSubscribed()?this.tnFndSubsUpdated():e.subscribe(e.startMetaQuery().withSub().build()).catch((e=>{this.handleError(e.message,"err")}))}tnFndSubsUpdated(){const e=[];this.tinode.getFndTopic().contacts((t=>{e.push(t)})),this.setState({searchResults:e,searchableContacts:y.prepareSearchableContacts(this.state.chatList,e)})}handleSearchContacts(e){const t=this.tinode.getFndTopic();t.setMeta({desc:{public:e}}).then((e=>t.getMeta(t.startMetaQuery().withSub().build()))).catch((e=>{this.handleError(e.message,"err")}))}handleTopicSelected(e){this.state.newTopicParams&&this.state.newTopicParams._topicName!=e&&this.setState({newTopicParams:null}),e?(this.setState({errorText:"",errorLevel:null,mobilePanel:"topic-view",showInfoPanel:!1}),this.state.topicSelected!=e&&(this.setState({topicSelectedOnline:this.tinode.isTopicOnline(e),topicSelectedAcs:this.tinode.getTopicAccessMode(e)}),E.default.navigateTo(E.default.setUrlTopic("",e)))):(this.setState({errorText:"",errorLevel:null,mobilePanel:"sidepanel",topicSelectedOnline:!1,topicSelectedAcs:null,showInfoPanel:!1}),E.default.navigateTo(E.default.setUrlTopic("",null)))}handleHideMessagesView(){this.setState({mobilePanel:"sidepanel"}),E.default.navigateTo(E.default.setUrlTopic(window.location.hash,null))}handleSendMessage(e,t,s){const a=this.tinode.getTopic(this.state.topicSelected);(e=a.createMessage(e,!1))._uploader=s,a.isSubscribed()||(t||(t=Promise.resolve()),t=t.then((()=>a.subscribe()))),t&&(t=t.catch((e=>{this.handleError(e.message,"err")}))),a.publishDraft(e,t).then((e=>{if(a.isArchived())return a.archive(!1)})).catch((e=>{this.handleError(e.message,"err")}))}handleNewChatInvitation(e,t){const s=this.tinode.getTopic(e);let a=null;switch(t){case"accept":const n=s.getAccessMode().getGiven();a=s.setMeta({sub:{mode:n}}),s.isP2P()&&(a=a.then((t=>{s.setMeta({sub:{user:e,mode:n}})})));break;case"delete":a=s.delTopic(!0);break;case"block":const i=s.getAccessMode().updateWant("-JP").getWant();a=s.setMeta({sub:{mode:i}}).then((e=>this.handleTopicSelected(null)));break;default:console.log("Unknown invitation action",'"'+t+'""')}null!=a&&a.catch((e=>{this.handleError(e.message,"err")}))}handleNewAccount(){this.handleError(),E.default.navigateTo(E.default.setUrlSidePanel(window.location.hash,"register"))}handleNewAccountRequest(e,t,s,a,n){this.handleError(),this.tinode.connect(this.state.serverAddress).then((()=>this.tinode.createAccountBasic(e,t,{public:s,tags:n,cred:d().credential(a)}))).then((e=>{e.code>=300&&"validate credentials"==e.text?this.handleCredentialsRequest(e.params):this.handleLoginSuccessful(this)})).catch((e=>{this.handleError(e.message,"err")}))}handleUpdateAccountRequest(e,t,s){if(this.handleError(),t||s){const e={};t&&(e.public=t),s&&(e.defacs=s),this.tinode.getMeTopic().setMeta({desc:e}).catch((e=>{this.handleError(e.message,"err")}))}e&&this.tinode.updateAccountBasic(null,this.tinode.getCurrentLogin(),e).catch((e=>{this.handleError(e.message,"err")}))}handleToggleIncognitoMode(e){const t=this.tinode.getMeTopic(),s=t.getAccessMode().updateWant(e?"-P":"+P").getWant();t.setMeta({sub:{mode:s}}).catch((e=>{this.handleError(e.message,"err")}))}handleUpdateAccountTagsRequest(e){this.tinode.getMeTopic().setMeta({tags:e}).catch((e=>{this.handleError(e.message,"err")}))}handleSettings(){this.handleError(),E.default.navigateTo(E.default.setUrlSidePanel(window.location.hash,this.state.myUserId?"edit":"settings"))}handleGlobalSettings(e){const t=e.serverAddress||this.state.serverAddress,s=e.transport||this.state.transport;this.tinode&&(this.tinode.onDisconnect=void 0,this.tinode.disconnect()),this.tinode=y.tnSetup(t,s,this.props.intl.locale),this.tinode.onConnect=this.handleConnected,this.tinode.onDisconnect=this.handleDisconnect,this.setState({serverAddress:t,transport:s}),f.default.setObject("settings",{serverAddress:t,transport:s}),E.default.navigateTo(E.default.setUrlSidePanel(window.location.hash,""))}handleShowArchive(){E.default.navigateTo(E.default.setUrlSidePanel(window.location.hash,this.state.myUserId?"archive":""))}handleShowBlocked(){E.default.navigateTo(E.default.setUrlSidePanel(window.location.hash,this.state.myUserId?"blocked":""))}initDesktopAlerts(){this.fbPush.onTokenRefresh((()=>{this.requestPushToken()})),this.fbPush.onMessage((e=>{}))}togglePushToken(e){e?this.state.firebaseToken?(this.setState({desktopAlerts:!0}),f.default.updateObject("settings",{desktopAlerts:!0})):this.fbPush.requestPermission().then((()=>{this.requestPushToken()})).catch((e=>{this.handleError(e.message,"err"),this.setState({desktopAlerts:!1,firebaseToken:null}),f.default.updateObject("settings",{desktopAlerts:!1}),console.log("Failed to get permission to notify.",e)})):this.state.firebaseToken?this.fbPush.deleteToken(this.state.firebaseToken).catch((e=>{console.log("Unable to delete token.",e)})).finally((()=>{f.default.updateObject("settings",{desktopAlerts:!1}),localStorage.removeItem("firebase-token"),this.setState({desktopAlerts:!1,firebaseToken:null})})):(this.setState({desktopAlerts:!1,firebaseToken:null}),f.default.updateObject("settings",{desktopAlerts:!1}))}requestPushToken(){this.fbPush.getToken().then((e=>{e!=this.state.firebaseToken&&(this.tinode.setDeviceToken(e,!0),f.default.setObject("firebase-token",e)),this.setState({firebaseToken:e,desktopAlerts:!0}),f.default.updateObject("settings",{desktopAlerts:!0})})).catch((e=>{this.handleError(e.message,"err"),console.log("Failed to retrieve firebase token",e)}))}handleToggleMessageSounds(e){this.setState({messageSounds:e}),f.default.updateObject("settings",{messageSoundsOff:!e})}handleCredAdd(e,t){this.tinode.getMeTopic().setMeta({cred:{meth:e,val:t}}).catch((e=>{this.handleError(e.message,"err")}))}handleCredDelete(e,t){this.tinode.getMeTopic().delCredential(e,t).catch((e=>{this.handleError(e.message,"err")}))}handleCredConfirm(e,t){this.handleCredentialsRequest({cred:[e]})}handleSidepanelCancel(){const e=E.default.parseUrlHash(window.location.hash);let t="";["security","support","general","notif"].includes(e.path[0])?t="edit":"blocked"==e.path[0]?t="security":this.state.myUserId&&(t="contacts"),e.path[0]=t,e.params&&(delete e.params.code,delete e.params.method,delete e.params.tab),E.default.navigateTo(E.default.composeUrlHash(e.path,e.params)),this.setState({errorText:"",errorLevel:null})}basicNavigator(e){E.default.navigateTo(E.default.setUrlSidePanel(window.location.hash,e))}handleStartTopicRequest(e,t,s,a,n){if(e&&this.tinode.isTopicCached(e))return void this.handleTopicSelected(e);const i={};d().isP2PTopicName(e)?(i.sub={mode:g.DEFAULT_P2P_ACCESS_MODE},i.desc={defacs:{auth:g.DEFAULT_P2P_ACCESS_MODE}}):(e=e||this.tinode.newGroupTopicName(n),i.desc={public:t,private:{comment:s}},i.tags=a),i._topicName=e,this.setState({newTopicParams:i},(()=>{this.handleTopicSelected(e)}))}handleNewTopicCreated(e,t){this.state.topicSelected==e&&e!=t&&this.setState({topicSelected:t},(()=>{E.default.navigateTo(E.default.setUrlTopic("",t))}))}handleTopicUpdateRequest(e,t,s,a){const n=this.tinode.getTopic(e);if(n){const e={};t&&(e.public=t),s&&(e.private=s===d().DEL_CHAR?d().DEL_CHAR:{comment:s}),a&&(e.defacs=a),n.setMeta({desc:e}).catch((e=>{this.handleError(e.message,"err")}))}}handleChangePermissions(e,t,s){const a=this.tinode.getTopic(e);if(a){const e=a.getAccessMode();s?(e.updateGiven(t),t=e.getGiven()):(e.updateWant(t),t=e.getWant()),a.setMeta({sub:{user:s,mode:t}}).catch((e=>{this.handleError(e.message,"err")}))}}handleTagsUpdated(e,t){const s=this.tinode.getTopic(e);s&&s.setMeta({tags:t}).catch((e=>{this.handleError(e.message,"err")}))}handleLogout(){(0,S.updateFavicon)(0),localStorage.removeItem("auth-token"),localStorage.removeItem("firebase-token"),localStorage.removeItem("settings"),this.state.firebaseToken&&this.fbPush.deleteToken(this.state.firebaseToken),this.tinode&&(this.tinode.onDisconnect=void 0,this.tinode.disconnect()),this.setState(this.getBlankState()),this.tinode=y.tnSetup(this.state.serverAddress,this.state.transport,this.props.intl.locale),this.tinode.onConnect=this.handleConnected,this.tinode.onDisconnect=this.handleDisconnect,E.default.navigateTo("")}handleDeleteAccount(){this.tinode.delCurrentUser(!0).then((e=>{this.handleLogout()}))}handleDeleteMessagesRequest(e){const t=this.tinode.getTopic(e);t&&t.delMessagesAll(!0).catch((e=>{this.handleError(e.message,"err")}))}handleLeaveUnsubRequest(e){const t=this.tinode.getTopic(e);t&&t.leave(!0).then((e=>{E.default.navigateTo(E.default.setUrlTopic(window.location.hash,""))})).catch((e=>{this.handleError(e.message,"err")}))}handleBlockTopicRequest(e){const t=this.tinode.getTopic(e);t&&t.updateMode(null,"-JP").then((e=>{E.default.navigateTo(E.default.setUrlTopic(window.location.hash,""))})).catch((e=>{this.handleError(e.message,"err")}))}handleReportTopic(e){const t=this.tinode.getTopic(e);t&&(this.tinode.publish(d().TOPIC_SYS,d().Drafty.attachJSON(null,{action:"report",target:e})),t.updateMode(null,"-JP").then((e=>{E.default.navigateTo(E.default.setUrlTopic(window.location.hash,""))})).catch((e=>{this.handleError(e.message,"err")})))}handleShowContextMenu(e,t){this.setState({contextMenuVisible:!0,contextMenuClickAt:{x:e.x,y:e.y},contextMenuParams:e,contextMenuItems:t||this.defaultTopicContextMenu(e.topicName),contextMenuBounds:o().findDOMNode(this).getBoundingClientRect()})}defaultTopicContextMenu(e){const t=this.tinode.getTopic(e);let s=!1,a=!1,n=!1,i=!1,o=!1,r=!1;if(t){i=t.isSubscribed(),r=t.isArchived();const e=t.getAccessMode();e&&(s=e.isMuted(),a=!e.isJoiner(),n=!e.isJoiner("want"),o=e.isDeleter())}return[i?{title:this.props.intl.formatMessage({id:"menu_item_info"}),handler:this.handleShowInfoView}:null,i?"messages_clear":null,i&&o?"messages_clear_hard":null,s?a?null:"topic_unmute":"topic_mute",n?"topic_unblock":"topic_block",r?null:"topic_archive","topic_delete"]}handleHideContextMenu(){this.setState({contextMenuVisible:!1,contextMenuClickAt:null,contextMenuParams:null,contextMenuBounds:null})}handleContextMenuAction(e,t,s){"topic_archive"==e&&t&&s.topicName&&s.topicName==this.state.topicSelected&&t.then((()=>{this.handleTopicSelected(null)}))}handleShowAlert(e,t,s,a,n,i){this.setState({alertVisible:!0,alertParams:{title:e,content:t,onConfirm:s,confirm:a,onReject:n,reject:i}})}handleShowInfoView(){E.default.navigateTo(E.default.addUrlParam(window.location.hash,"info",!0)),this.setState({showInfoPanel:!0})}handleHideInfoView(){E.default.navigateTo(E.default.removeUrlParam(window.location.hash,"info")),this.setState({showInfoPanel:!1})}handleMemberUpdateRequest(e,t,s){if(!e)return;const a=this.tinode.getTopic(e);a&&(t&&t.length>0&&t.map((e=>{a.invite(e,null).catch((e=>{this.handleError(e.message,"err")}))})),s&&s.length>0&&s.map((e=>{a.delSubscription(e).catch((e=>{this.handleError(e.message,"err")}))})))}handleValidateCredentialsRequest(e,t){if(this.tinode.isAuthenticated()){this.tinode.getMeTopic().setMeta({cred:{meth:e,resp:t}}).then((()=>{E.default.navigateTo("")})).catch((e=>{this.handleError(e.message,"err")}))}else this.setState({credMethod:e,credCode:t}),this.doLogin(null,null,{meth:e,resp:t})}handlePasswordResetRequest(e,t){this.tinode.connect().then((()=>this.tinode.requestResetAuthSecret("basic",e,t))).catch((e=>{this.handleError(e.message,"err")}))}handleResetPassword(e,t,s){(s=(0,b.base64ReEncode)(s))?this.tinode.connect().then((()=>this.tinode.updateAccountBasic(null,null,t,{token:s}))).catch((e=>{this.handleError(e.message,"err")})):this.handleError(this.props.intl.formatMessage(M.invalid_security_token),"err")}render(){return n().createElement("div",{id:"app-container"},this.state.contextMenuVisible?n().createElement(p.default,{tinode:this.tinode,bounds:this.state.contextMenuBounds,clickAt:this.state.contextMenuClickAt,params:this.state.contextMenuParams,items:this.state.contextMenuItems,hide:this.handleHideContextMenu,onShowAlert:this.handleShowAlert,onAction:this.handleContextMenuAction,onTopicRemoved:e=>{e==this.state.topicSelected&&this.handleTopicSelected(null)},onError:this.handleError}):null,n().createElement(h.default,{visible:this.state.alertVisible,title:this.state.alertParams.title,content:this.state.alertParams.content,onReject:this.state.alertParams.onReject?()=>{this.setState({alertVisible:!1})}:null,reject:this.state.alertParams.reject,onConfirm:()=>{this.setState({alertVisible:!1}),this.state.alertParams.onConfirm()},confirm:this.state.alertParams.confirm}),n().createElement(_.default,{tinode:this.tinode,connected:this.state.connected,displayMobile:this.state.displayMobile,hideSelf:this.state.displayMobile&&"sidepanel"!==this.state.mobilePanel,state:this.state.sidePanelSelected,title:this.state.sidePanelTitle,avatar:this.state.sidePanelAvatar,login:this.state.login,myUserId:this.state.myUserId,loginDisabled:this.state.loginDisabled,loadSpinnerVisible:this.state.loadSpinnerVisible,errorText:this.state.errorText,errorLevel:this.state.errorLevel,errorAction:this.state.errorAction,errorActionText:this.state.errorActionText,topicSelected:this.state.topicSelected,chatList:this.state.chatList,credMethod:this.state.credMethod,credCode:this.state.credCode,transport:this.state.transport,messageSounds:this.state.messageSounds,desktopAlerts:this.state.desktopAlerts,desktopAlertsEnabled:this.state.desktopAlertsEnabled,incognitoMode:this.state.incognitoMode,serverAddress:this.state.serverAddress,serverVersion:this.state.serverVersion,onGlobalSettings:this.handleGlobalSettings,onSignUp:this.handleNewAccount,onSettings:this.handleSettings,onBasicNavigate:this.basicNavigator,onLoginRequest:this.handleLoginRequest,onCreateAccount:this.handleNewAccountRequest,onUpdateAccount:this.handleUpdateAccountRequest,onUpdateAccountTags:this.handleUpdateAccountTagsRequest,onTogglePushNotifications:this.togglePushToken,onToggleMessageSounds:this.handleToggleMessageSounds,onToggleIncognitoMode:this.handleToggleIncognitoMode,onCredAdd:this.handleCredAdd,onCredDelete:this.handleCredDelete,onCredConfirm:this.handleCredConfirm,onTopicSelected:this.handleTopicSelected,onCreateTopic:this.handleStartTopicRequest,onLogout:this.handleLogout,onDeleteAccount:this.handleDeleteAccount,onShowAlert:this.handleShowAlert,onCancel:this.handleSidepanelCancel,onError:this.handleError,onValidateCredentials:this.handleValidateCredentialsRequest,onPasswordResetRequest:this.handlePasswordResetRequest,onResetPassword:this.handleResetPassword,onShowArchive:this.handleShowArchive,onShowBlocked:this.handleShowBlocked,onInitFind:this.tnInitFind,searchResults:this.state.searchResults,onSearchContacts:this.handleSearchContacts,showContextMenu:this.handleShowContextMenu}),n().createElement(m.default,{tinode:this.tinode,connected:this.state.connected,ready:this.state.ready,online:this.state.topicSelectedOnline,acs:this.state.topicSelectedAcs,displayMobile:this.state.displayMobile,viewportWidth:this.state.viewportWidth,viewportHeight:this.state.viewportHeight,hideSelf:this.state.displayMobile&&("topic-view"!==this.state.mobilePanel||this.state.showInfoPanel),topic:this.state.topicSelected,myUserId:this.state.myUserId,serverVersion:this.state.serverVersion,serverAddress:this.state.serverAddress,applicationVisible:this.state.applicationVisible,errorText:this.state.errorText,errorLevel:this.state.errorLevel,errorAction:this.state.errorAction,errorActionText:this.state.errorActionText,newTopicParams:this.state.newTopicParams,onHideMessagesView:this.handleHideMessagesView,onData:this.tnData,onError:this.handleError,onNewTopicCreated:this.handleNewTopicCreated,showContextMenu:this.handleShowContextMenu,onChangePermissions:this.handleChangePermissions,onNewChat:this.handleNewChatInvitation,sendMessage:this.handleSendMessage}),this.state.showInfoPanel?n().createElement(u.default,{tinode:this.tinode,connected:this.state.connected,displayMobile:this.state.displayMobile,topic:this.state.topicSelected,searchableContacts:this.state.searchableContacts,myUserId:this.state.myUserId,errorText:this.state.errorText,errorLevel:this.state.errorLevel,errorAction:this.state.errorAction,errorActionText:this.state.errorActionText,onTopicDescUpdate:this.handleTopicUpdateRequest,onCancel:this.handleHideInfoView,onShowAlert:this.handleShowAlert,onChangePermissions:this.handleChangePermissions,onMemberUpdateRequest:this.handleMemberUpdateRequest,onDeleteMessages:this.handleDeleteMessagesRequest,onLeaveTopic:this.handleLeaveUnsubRequest,onBlockTopic:this.handleBlockTopicRequest,onReportTopic:this.handleReportTopic,onAddMember:this.handleManageGroupMembers,onTopicTagsUpdate:this.handleTagsUpdated,onInitFind:this.tnInitFind,onError:this.handleError,showContextMenu:this.handleShowContextMenu}):null)}}t.default=(0,r.injectIntl)(y)},"./src/views/validation-view.jsx":function(e,t,s){s.r(t);var a=s("react"),n=s.n(a),i=s("react-intl");const o=(0,i.defineMessages)({phone:{id:"phone_dative",defaultMessage:[{type:0,value:"phone"}]},email:{id:"email_dative",defaultMessage:[{type:0,value:"email"}]}});class r extends n().PureComponent{constructor(e){super(e),this.state={code:e.credCode||""},this.handleChange=this.handleChange.bind(this),this.handleKeyPress=this.handleKeyPress.bind(this),this.handleSubmit=this.handleSubmit.bind(this),this.handleCancel=this.handleCancel.bind(this)}handleChange(e){this.setState({code:e.target.value})}handleKeyPress(e){"Enter"===e.key?this.handleSubmit(e):"Escape"==e.key&&this.handleCancel(e)}handleSubmit(e){e.preventDefault(),this.state.code&&this.state.code.trim()&&this.props.onSubmit(this.props.credMethod,this.state.code.trim())}handleCancel(e){e.preventDefault(),this.props.onCancel()}render(){const{formatMessage:e}=this.props.intl;let t={email:e(o.email),tel:e(o.phone)}[this.props.credMethod]||this.props.credMethod;return n().createElement("div",{className:"panel-form"},n().createElement("div",{className:"panel-form-row"},n().createElement("label",{className:"small",htmlFor:"enter-confirmation-code"},n().createElement(i.FormattedMessage,{id:"enter_confirmation_code_prompt",defaultMessage:[{type:0,value:"Enter confirmation code sent to you by "},{type:1,value:"method"},{type:0,value:":"}],values:{method:t}}))),n().createElement("div",{className:"panel-form-row"},n().createElement(i.FormattedMessage,{id:"numeric_confirmation_code_prompt",defaultMessage:[{type:0,value:"Numbers only"}]},(e=>n().createElement("input",{type:"text",id:"enter-confirmation-code",placeholder:e,value:this.state.code,onChange:this.handleChange,onKeyPress:this.handleKeyPress,required:!0})))),n().createElement("div",{className:"dialog-buttons"},n().createElement("button",{className:"blue",onClick:this.handleSubmit},n().createElement(i.FormattedMessage,{id:"button_confirm",defaultMessage:[{type:0,value:"Confirm"}]})),n().createElement("button",{className:"white",onClick:this.handleCancel},n().createElement(i.FormattedMessage,{id:"button_cancel"}))))}}t.default=(0,i.injectIntl)(r)},"./src/widgets/alert.jsx":function(e,t,s){s.r(t),s.d(t,{default:function(){return o}});var a=s("react"),n=s.n(a),i=s("react-intl");class o extends n().PureComponent{render(){return this.props.visible?n().createElement("div",{className:"alert-container"},n().createElement("div",{className:"alert"},n().createElement("div",{className:"title"},this.props.title),n().createElement("div",{className:"content"},this.props.content),n().createElement("div",{className:"dialog-buttons"},this.props.onReject?n().createElement("button",{className:"outline",onClick:this.props.onReject},this.props.reject||n().createElement(i.FormattedMessage,{id:"button_cancel"})):null,n().createElement("button",{className:"blue",onClick:this.props.onConfirm},this.props.confirm||n().createElement(i.FormattedMessage,{id:"button_ok"}))))):null}}},"./src/widgets/attachment.jsx":function(e,t,s){s.r(t),s.d(t,{default:function(){return c}});var a=s("react"),n=s.n(a),i=s("react-intl"),o=s("./src/widgets/file-progress.jsx"),r=s("./src/lib/strformat.js"),l=s("./src/lib/utils.js");class c extends n().Component{constructor(e){super(e),this.state={downloader:null,progress:0},this.downloadFile=this.downloadFile.bind(this),this.handleCancel=this.handleCancel.bind(this)}downloadFile(e,t,s){if(!e)return void this.props.onError("Invalid download URL '"+e+"'");const a=this.props.tinode.getLargeFileHelper();this.setState({downloader:a}),a.download(e,t,s,(e=>{this.setState({progress:e/this.props.size})}),(e=>{this.props.onError(e,"err")})).then((()=>{this.setState({downloader:null,progress:0})})).catch((e=>{e&&this.props.onError("Error downloading file: "+e.message,"err"),this.setState({downloader:null,progress:0})}))}handleCancel(){this.props.uploading?this.props.onCancelUpload():this.state.downloader&&this.state.downloader.cancel()}render(){let e=this.props.filename||"file_attachment";e.length>36&&(e=e.substr(0,16)+"..."+e.substr(-16));let t,s,a=this.props.size>0?n().createElement("span",{className:"small gray"},"(",(0,r.bytesToHumanSize)(this.props.size),")"):null;this.props.uploading||this.state.downloader||!(0,l.isUrlRelative)(this.props.downloadUrl)?(t=(0,l.sanitizeUrl)(this.props.downloadUrl),s=null):(t="#",s=e=>{e.preventDefault(),this.downloadFile(this.props.downloadUrl,this.props.filename,this.props.mimetype)});const c=n().createElement(n().Fragment,null,n().createElement("i",{className:"material-icons"},"file_download")," ",n().createElement(i.FormattedMessage,{id:"save_attachment",defaultMessage:[{type:0,value:"save"}]}));return n().createElement("div",{className:"attachment"},n().createElement("div",null,n().createElement("i",{className:"material-icons big gray"},"insert_drive_file")),n().createElement("div",{className:"flex-column"},n().createElement("div",null,e," ",a),this.props.uploading||this.state.downloader?n().createElement(o.default,{progress:this.props.uploading?this.props.progress:this.state.progress,onCancel:this.handleCancel}):n().createElement("div",null,t?n().createElement("a",{href:t,download:this.props.filename,onClick:s},c):n().createElement("span",{className:"light-gray"},c))))}}},"./src/widgets/avatar-upload.jsx":function(e,t,s){s.r(t),s.d(t,{default:function(){return l}});var a=s("react"),n=s.n(a),i=s("./src/widgets/letter-tile.jsx"),o=s("./src/config.js"),r=s("./src/lib/blob-helpers.js");class l extends n().Component{constructor(e){super(e),this.state={dataUrl:e.avatar},this.handleFileUpload=this.handleFileUpload.bind(this)}componentDidUpdate(e){this.props.avatar!=e.avatar&&this.setState({dataUrl:this.props.avatar})}handleFileUpload(e){(0,r.imageScaled)(e.target.files[0],o.AVATAR_SIZE,o.AVATAR_SIZE,o.MAX_EXTERN_ATTACHMENT_SIZE,!0,((e,t)=>{(0,r.blobToBase64)(t,((t,s)=>{const a=(0,r.makeImageUrl)({data:s,type:e});this.setState({dataUrl:a}),this.props.onImageChanged(a)}))}),(e=>{this.props.onError(e,"err")})),e.target.value=""}render(){const e="file-input-avatar-"+(Math.random()+"").substr(2),t="avatar-upload"+(this.props.readOnly?" read-only":"");return n().createElement("div",{className:t},this.props.readOnly||!this.state.dataUrl?null:n().createElement("a",{href:"#",className:"clear-avatar",onClick:e=>{e.preventDefault(),this.props.onImageChanged(null)}},n().createElement("i",{className:"material-icons"},"clear")),this.state.dataUrl?n().createElement("img",{src:this.state.dataUrl,className:"preview"}):this.props.readOnly&&this.props.uid?n().createElement("div",{className:"avatar-box"},n().createElement(i.default,{avatar:!0,topic:this.props.uid,title:this.props.title})):n().createElement("div",{className:"blank"},o.AVATAR_SIZE,"×",o.AVATAR_SIZE),this.props.readOnly?null:n().createElement("input",{type:"file",id:e,className:"inputfile hidden",accept:"image/*",onChange:this.handleFileUpload}),this.props.readOnly?null:n().createElement("label",{htmlFor:e,className:"round"},n().createElement("i",{className:"material-icons"},"file_upload")))}}},"./src/widgets/button-back.jsx":function(e,t,s){s.r(t),s.d(t,{default:function(){return i}});var a=s("react"),n=s.n(a);class i extends n().PureComponent{render(){return n().createElement("a",{href:"#",onClick:e=>{e.preventDefault(),this.props.onBack()}},n().createElement("i",{className:"material-icons"},"arrow_back"))}}},"./src/widgets/chat-message.jsx":function(e,t,s){s.r(t),s.d(t,{default:function(){return m}});var a=s("react"),n=s.n(a),i=s("react-intl"),o=s("tinode-sdk"),r=s("./src/widgets/attachment.jsx"),l=s("./src/widgets/letter-tile.jsx"),c=s("./src/widgets/received-marker.jsx"),d=s("./src/widgets/uploading-image.jsx"),h=s("./src/lib/utils.js"),p=s("./src/config.js"),u=s("./src/lib/blob-helpers.js");class m extends n().Component{constructor(e){super(e),this.state={progress:0},e.uploader&&(e.uploader.onProgress=this.handleProgress.bind(this)),this.handleImagePreview=this.handleImagePreview.bind(this),this.handleFormButtonClick=this.handleFormButtonClick.bind(this),this.handleContextClick=this.handleContextClick.bind(this),this.handleCancelUpload=this.handleCancelUpload.bind(this)}handleImagePreview(e){e.preventDefault(),this.props.onImagePreview({url:e.target.src,filename:e.target.title,width:e.target.dataset.width,height:e.target.dataset.height,size:e.target.dataset.size,type:e.target.dataset.mime})}handleFormButtonClick(e){e.preventDefault();const t={seq:this.props.seq,resp:{}};e.target.dataset.name&&(t.resp[e.target.dataset.name]=e.target.dataset.val?e.target.dataset.val:void 0===e.target.dataset.val?1:""+e.target.dataset.val),"url"==e.target.dataset.act&&(t.ref=(0,h.sanitizeUrl)(e.target.dataset.ref)||"about:blank");const s=e.target.dataset.title||"unknown";this.props.onFormResponse(e.target.dataset.act,s,t)}handleContextClick(e){e.preventDefault(),e.stopPropagation();const t=this.props.received==Tinode.MESSAGE_STATUS_FAILED?["menu_item_send_retry"]:[];this.props.showContextMenu({seq:this.props.seq,content:this.props.content,y:e.pageY,x:e.pageX},t)}handleProgress(e){this.setState({progress:e})}handleCancelUpload(){this.props.onCancelUpload(this.props.seq,this.props.uploader)}render(){const e=this.props.deleted?"center":this.props.sequence+" "+(this.props.response?"left":"right"),t="single"==this.props.sequence||"last"==this.props.sequence?"bubble tip":"bubble",s=this.props.deleted?null:this.props.userAvatar||!0,a=this.props.userFrom&&this.props.response&&("single"==this.props.sequence||"last"==this.props.sequence);let d=this.props.content;const h=[];return this.props.mimeType==o.Drafty.getContentType()&&o.Drafty.isValid(d)?(o.Drafty.attachments(d,(function(e,t){"application/json"!=e.mime&&h.push(n().createElement(r.default,{tinode:this.props.tinode,downloadUrl:o.Drafty.getDownloadUrl(e),filename:e.name,uploading:o.Drafty.isProcessing(e),mimetype:e.mime,size:o.Drafty.getEntitySize(e),progress:this.state.progress,onCancelUpload:this.handleCancelUpload,onError:this.props.onError,key:t}))}),this),d=n().createElement(n().Fragment,null,o.Drafty.format(d,_,this))):this.props.deleted?d=n().createElement(n().Fragment,null,n().createElement("i",{className:"material-icons gray"},"block")," ",n().createElement("i",{className:"gray"},n().createElement(i.FormattedMessage,{id:"deleted_content",defaultMessage:[{type:0,value:"content deleted"}]}))):"string"!=typeof d&&(d=n().createElement(n().Fragment,null,n().createElement("i",{className:"material-icons gray"},"error_outline")," ",n().createElement("i",{className:"gray"},n().createElement(i.FormattedMessage,{id:"invalid_content",defaultMessage:[{type:0,value:"invalid content"}]})))),n().createElement("li",{className:e},this.props.userFrom&&this.props.response?n().createElement("div",{className:"avatar-box"},a?n().createElement(l.default,{topic:this.props.userFrom,title:this.props.userName,avatar:s}):null):null,n().createElement("div",null,n().createElement("div",{className:t},n().createElement("div",{className:"message-content"},d,h,this.props.timestamp?n().createElement(c.default,{timestamp:this.props.timestamp,received:this.props.received}):null),this.props.deleted||!this.props.showContextMenu?null:n().createElement("span",{className:"menuTrigger"},n().createElement("a",{href:"#",onClick:this.handleContextClick},n().createElement("i",{className:"material-icons"},"expand_more")))),a?n().createElement("div",{className:"author"},n().createElement(i.FormattedMessage,{id:"user_not_found",defaultMessage:[{type:0,value:"Not found"}]},(e=>this.props.userName||n().createElement("i",null,e)))):null))}}function _(e,t,s,a){let i=o.Drafty.tagName(e);if(i){const r=o.Drafty.attrValue(e,t)||{};switch(r.key=a,e){case"IM":if(t){r.className="inline-image";const e=(0,u.fitImageSize)(t.width,t.height,Math.min(this.props.viewportWidth-4*p.REM_SIZE,36*p.REM_SIZE),24*p.REM_SIZE,!1)||{dstWidth:p.BROKEN_IMAGE_SIZE,dstHeight:p.BROKEN_IMAGE_SIZE};r.style={width:e.dstWidth+"px",height:e.dstHeight+"px"},o.Drafty.isProcessing(t)?i=d.default:(r.src=this.props.tinode.authorizeURL((0,h.sanitizeImageUrl)(r.src)),r.alt=t.name,r.src?(r.onClick=this.handleImagePreview,r.className+=" image-clickable"):r.src="img/broken_image.png")}break;case"BN":r.onClick=this.handleFormButtonClick;let e=n().Children.map(s,(e=>"string"==typeof e?e:void 0));e&&0!=e.length||(e=[r.name]),r["data-title"]=e.join("");break;case"FM":r.className="bot-form"}return n().createElement(i,r,s)}return s}},"./src/widgets/checkbox.jsx":function(e,t,s){s.r(t),s.d(t,{default:function(){return i}});var a=s("react"),n=s.n(a);class i extends n().PureComponent{constructor(e){super(e),this.handleChange=this.handleChange.bind(this)}handleChange(){this.props.onChange(this.props.name,!this.props.checked)}render(){return this.props.onChange?this.props.checked?n().createElement("i",{className:"material-icons blue clickable",onClick:this.handleChange},"check_box"):n().createElement("i",{className:"material-icons blue clickable",onClick:this.handleChange},"check_box_outline_blank"):this.props.checked?n().createElement("i",{className:"material-icons"},"check_box"):n().createElement("i",{className:"material-icons"},"check_box_outline_blank")}}},"./src/widgets/chip-input.jsx":function(e,t,s){s.r(t),s.d(t,{default:function(){return r}});var a=s("react"),n=s.n(a),i=s("./src/widgets/chip.jsx"),o=s("./src/lib/blob-helpers.js");class r extends n().Component{constructor(e){super(e),this.state=r.deriveStateFromProps(e),this.state.input="",this.state.focused=!1,this.handleTextInput=this.handleTextInput.bind(this),this.removeChipAt=this.removeChipAt.bind(this),this.handleChipCancel=this.handleChipCancel.bind(this),this.handleFocusGained=this.handleFocusGained.bind(this),this.handleFocusLost=this.handleFocusLost.bind(this),this.handleKeyDown=this.handleKeyDown.bind(this)}static deriveStateFromProps(e){return{placeholder:e.chips?"":e.prompt,sortedChips:r.sortChips(e.chips,e.staticMembers),chipIndex:r.indexChips(e.chips)}}componentDidUpdate(e,t){e.chips==this.props.chips&&e.staticMembers==this.props.staticMembers&&e.prompt==this.props.prompt||this.setState(r.deriveStateFromProps(this.props)),(!t||this.props.chips.length>t.sortedChips.length)&&this.setState({input:""})}static indexChips(e){const t={};let s=0;return e.map((e=>{t[e.user]=s,s++})),t}static sortChips(e,t){const s=[],a=[];return e.map((e=>{t&&t.includes(e.user)?s.push(e):a.push(e)})),s.concat(a)}handleTextInput(e){this.setState({input:e.target.value}),this.props.filterFunc&&this.props.filterFunc(e.target.value)}removeChipAt(e){const t=this.state.sortedChips[e];this.props.onChipRemoved(t.user,this.state.chipIndex[t.user])}handleChipCancel(e,t){this.removeChipAt(t)}handleFocusGained(){this.setState({focused:!0})}handleFocusLost(){this.setState({focused:!1}),this.props.onFocusLost&&this.props.onFocusLost(this.state.input)}handleKeyDown(e){if("Backspace"===e.key){if(0==this.state.input.length&&this.state.sortedChips.length>0){const e=this.state.sortedChips.length-1;this.state.sortedChips[e].user!==this.props.staticMembers&&this.removeChipAt(e)}}else"Enter"===e.key?this.props.onEnter&&this.props.onEnter(this.state.input):"Escape"===e.key&&this.props.onCancel&&this.props.onCancel()}render(){const e=[];let t=0;const s=this.props.staticMembers||[];this.state.sortedChips.map((a=>{e.push(n().createElement(i.default,{onCancel:this.handleChipCancel,avatar:(0,o.makeImageUrl)(a.public?a.public.photo:null),title:a.public?a.public.fn:void 0,noAvatar:this.props.avatarDisabled,topic:a.user,required:s.includes(a.user),invalid:a.invalid,index:t,key:a.user})),t++}));const a="chip-input"+(this.state.focused?" focused":"");return n().createElement("div",{className:a},e,n().createElement("input",{type:"text",placeholder:this.state.placeholder,onChange:this.handleTextInput,onFocus:this.handleFocusGained,onBlur:this.handleFocusLost,onKeyDown:this.handleKeyDown,value:this.state.input,autoFocus:!0}))}}},"./src/widgets/chip.jsx":function(e,t,s){s.r(t),s.d(t,{default:function(){return o}});var a=s("react"),n=s.n(a),i=s("./src/widgets/letter-tile.jsx");class o extends n().PureComponent{constructor(e){super(e),this.handleCancel=this.handleCancel.bind(this)}handleCancel(e){e.preventDefault(),this.props.onCancel(this.props.topic,this.props.index)}render(){const e=this.props.title||this.props.topic,t=this.props.invalid?"chip invalid":"chip";return n().createElement("div",{className:t},this.props.noAvatar?n().createElement("span",{className:"spacer"}):n().createElement("div",{className:"avatar-box"},n().createElement(i.default,{avatar:this.props.avatar||!0,topic:this.props.topic,title:this.props.title})),n().createElement("span",null,e),this.props.onCancel&&!this.props.required?n().createElement("a",{href:"#",onClick:this.handleCancel},"×"):n().createElement("span",{className:"spacer"}))}}},"./src/widgets/contact-action.jsx":function(e,t,s){s.r(t);var a=s("react"),n=s.n(a),i=s("react-intl");class o extends n().PureComponent{constructor(e){super(e),this.handleClick=this.handleClick.bind(this)}handleClick(e){e.preventDefault(),e.stopPropagation(),this.props.onAction(this.props.action)}render(){const{formatMessage:e}=this.props.intl;return n().createElement("li",{onClick:this.handleClick,className:"action"},n().createElement("div",{className:"action-text"},e(this.props.title,this.props.values)))}}t.default=(0,i.injectIntl)(o)},"./src/widgets/contact-badges.jsx":function(e,t,s){s.r(t),s.d(t,{default:function(){return o}});var a=s("react"),n=s.n(a);const i={muted:"notifications_off",banned:"block"};class o extends n().PureComponent{render(){let e=null;return this.props.badges&&this.props.badges.length>0?(e=[],this.props.badges.map((function(t){if(t.icon)e.push(n().createElement("i",{className:"material-icons as-badge",key:t.key||t.icon},i[t.icon]));else{const s="badge"+(t.color?" "+t.color:"");e.push(n().createElement("span",{className:s,key:t.key||t.name},t.name))}})),n().createElement(n().Fragment,null,e)):null}}},"./src/widgets/contact-list.jsx":function(e,t,s){s.r(t);var a=s("react"),n=s.n(a),i=s("react-intl"),o=s("tinode-sdk"),r=s.n(o),l=s("./src/widgets/contact.jsx"),c=s("./src/widgets/contact-action.jsx"),d=s("./src/lib/blob-helpers.js");const h=(0,i.defineMessages)({badge_you:{id:"badge_you",defaultMessage:[{type:0,value:"you"}]},badge_owner:{id:"badge_owner",defaultMessage:[{type:0,value:"owner"}]}});class p extends n().Component{render(){const{formatMessage:e}=this.props.intl,t=Array.isArray(this.props.topicSelected),s=[];let a=0;return this.props.contacts&&this.props.contacts.length>0&&this.props.contacts.map((i=>{if(i.action)s.push(n().createElement(c.default,{title:i.title,action:i.action,values:i.values,key:i.action,onAction:this.props.onAction}));else{const o=this.props.showMode?i.user:i.topic||i.user;if(this.props.filterFunc&&this.props.filter){let e=[o];if(i.private&&i.private.comment&&e.push((""+i.private.comment).toLowerCase()),i.public&&i.public.fn&&e.push((""+i.public.fn).toLowerCase()),!this.props.filterFunc(this.props.filter,e))return}const c=r().isChannelTopicName(o),p=t?this.props.topicSelected.indexOf(o)>-1:this.props.topicSelected===o,u=[];this.props.showMode&&(o==this.props.myUserId&&u.push({name:e(h.badge_you),color:"green"}),i.acs&&i.acs.isOwner()&&u.push({name:e(h.badge_owner),color:"blue"}));const m=Array.isArray(i.private)?i.private.join(","):i.private?i.private.comment:null;s.push(n().createElement(l.default,{title:i.public?i.public.fn:null,avatar:(0,d.makeImageUrl)(i.public?i.public.photo:null),comment:m,unread:this.props.showUnread?i.unread:0,now:i.online&&this.props.connected,acs:i.acs,showMode:this.props.showMode,badges:u,showCheckmark:t,selected:p,showOnline:this.props.showOnline&&!c,isChannel:c,onSelected:this.props.onTopicSelected,showContextMenu:this.props.showContextMenu,item:o,index:s.length,key:o})),a++}}),this),n().createElement("div",{className:this.props.noScroll?null:"scrollable-panel"},0==a?n().createElement("div",{className:"center-medium-text",dangerouslySetInnerHTML:{__html:this.props.emptyListMessage}}):null,s.length>0?n().createElement("ul",{className:"contact-box"},s):null)}}t.default=(0,i.injectIntl)(p)},"./src/widgets/contact.jsx":function(e,t,s){s.r(t),s.d(t,{default:function(){return c}});var a=s("react"),n=s.n(a),i=s("react-intl"),o=s("./src/widgets/letter-tile.jsx"),r=s("./src/widgets/contact-badges.jsx"),l=s("./src/widgets/unread-badge.jsx");class c extends n().Component{constructor(e){super(e),this.handleClick=this.handleClick.bind(this),this.handleContextClick=this.handleContextClick.bind(this)}handleClick(e){e.preventDefault(),e.stopPropagation(),this.props.onSelected&&this.props.onSelected(this.props.item,this.props.index)}handleContextClick(e){e.preventDefault(),e.stopPropagation(),this.props.showContextMenu({topicName:this.props.item,y:e.pageY,x:e.pageX})}render(){let e=this.props.title;e?e.length>30&&(e=e.substring(0,28)+"..."):e=n().createElement("i",null,n().createElement(i.FormattedMessage,{id:"unnamed_topic"}));const t=this.props.now?"online":"offline",s=!this.props.avatar||this.props.avatar,a=this.props.badges?this.props.badges.slice():[],c=[];return this.props.acs&&(this.props.showMode&&a.push({name:this.props.acs.getMode(),key:"mode"}),this.props.acs.isMuted()&&c.push({icon:"muted"}),this.props.acs.isJoiner()||c.push({icon:"banned"})),n().createElement("li",{className:!this.props.showCheckmark&&this.props.selected?"selected":null,onClick:this.handleClick},n().createElement("div",{className:"avatar-box"},n().createElement(o.default,{avatar:s,title:this.props.title,topic:this.props.item}),this.props.showOnline?n().createElement("span",{className:t}):this.props.showCheckmark&&this.props.selected?n().createElement("i",{className:"checkmark material-icons"},"check_circle"):null),n().createElement("div",{className:"text-box"},n().createElement("div",null,n().createElement("span",{className:"contact-title"},e),this.props.isChannel?n().createElement("img",{src:"/img/channel.png",className:"channel",alt:"channel"}):null,n().createElement(l.default,{count:this.props.unread}),n().createElement(r.default,{badges:c})),this.props.comment?n().createElement("div",{className:"contact-comment"},this.props.comment):null,n().createElement("span",null,n().createElement(r.default,{badges:a}))),this.props.showContextMenu?n().createElement("span",{className:"menuTrigger"},n().createElement("a",{href:"#",onClick:this.handleContextClick},n().createElement("i",{className:"material-icons"},"expand_more"))):null)}}},"./src/widgets/context-menu.jsx":function(e,t,s){s.r(t);var a=s("react"),n=s.n(a),i=s("react-dom"),o=s.n(i),r=s("react-intl"),l=s("./src/config.js");s("./src/lib/navigation.js");const c=(0,r.defineMessages)({info:{id:"menu_item_info",defaultMessage:[{type:0,value:"Info"}]},clear_messages:{id:"menu_item_clear_messages",defaultMessage:[{type:0,value:"Clear messages"}]},clear_for_all:{id:"menu_item_clear_messages_for_all",defaultMessage:[{type:0,value:"Clear for All"}]},delete:{id:"menu_item_delete",defaultMessage:[{type:0,value:"Delete"}]},delete_for_all:{id:"menu_item_delete_for_all",defaultMessage:[{type:0,value:"Delete for All"}]},send_retry:{id:"menu_item_send_retry",defaultMessage:[{type:0,value:"Retry"}]},mute:{id:"menu_item_mute",defaultMessage:[{type:0,value:"Mute"}]},unmute:{id:"menu_item_unmute",defaultMessage:[{type:0,value:"Unmute"}]},topic_delete:{id:"menu_item_delete_topic",defaultMessage:[{type:0,value:"Delete"}]},topic_delete_warning:{id:"topic_delete_warning",defaultMessage:[{type:0,value:"Are you sure you want to delete this conversation?"}]},unblock:{id:"menu_item_unblock",defaultMessage:[{type:0,value:"Unblock"}]},block:{id:"menu_item_block",defaultMessage:[{type:0,value:"Block"}]},topic_block_warning:{id:"topic_block_warning",defaultMessage:[{type:0,value:"Are you sure you want to block this conversation?"}]},member_delete:{id:"menu_item_member_delete",defaultMessage:[{type:0,value:"Remove"}]},archive:{id:"menu_item_archive_topic",defaultMessage:[{type:0,value:"Archive"}]}});class d extends n().Component{constructor(e){super(e);const{formatMessage:t}=e.intl;this.handlePageClick=this.handlePageClick.bind(this),this.handleEscapeKey=this.handleEscapeKey.bind(this),this.handleClick=this.handleClick.bind(this),this.MenuItems={topic_info:{id:"topic_info",title:t(c.info),handler:null},messages_clear:{id:"messages_clear",title:t(c.clear_messages),handler:(s,a)=>e.onShowAlert(t(c.menu_item_clear_messages),t({id:"clear_messages_warning"}),(()=>{this.deleteMessages(!0,!1,s,a)}),null,!0,null)},messages_clear_hard:{id:"messages_clear_hard",title:t(c.clear_for_all),handler:(s,a)=>e.onShowAlert(t(c.menu_item_clear_messages_for_all),t({id:"delete_messages_warning"}),(()=>this.deleteMessages(!0,!0,s,a)),null,!0,null)},message_delete:{id:"message_delete",title:t(c.delete),handler:(e,t)=>this.deleteMessages(!1,!1,e,t)},message_delete_hard:{id:"message_delete_hard",title:t(c.delete_for_all),handler:(e,t)=>this.deleteMessages(!1,!0,e,t)},menu_item_send_retry:{id:"menu_item_send_retry",title:t(c.send_retry),handler:(e,t)=>this.retryMessage(e,t)},topic_unmute:{id:"topic_unmute",title:t(c.unmute),handler:this.topicPermissionSetter.bind(this,"+P")},topic_mute:{id:"topic_mute",title:t(c.mute),handler:this.topicPermissionSetter.bind(this,"-P")},topic_unblock:{id:"topic_unblock",title:t(c.unblock),handler:this.topicPermissionSetter.bind(this,"+JP")},topic_block:{id:"topic_block",title:t(c.block),handler:(s,a)=>e.onShowAlert(t(c.menu_item_block),t(c.topic_block_warning),(()=>this.topicPermissionSetter("-JP",s,a).then((e=>(this.props.onTopicRemoved(s.topicName),e)))),null,!0,null)},topic_delete:{id:"topic_delete",title:t(c.topic_delete),handler:(s,a)=>e.onShowAlert(t(c.menu_item_delete_topic),t(c.topic_delete_warning),(()=>{const e=this.props.tinode.getTopic(s.topicName);if(e)return e.delTopic(!0).catch((e=>{a&&a(e.message,"err")}));console.log("Topic not found: ",s.topicName)}),null,!0,null)},topic_archive:{id:"topic_archive",title:t(c.archive),handler:(e,t)=>{const s=this.props.tinode.getTopic(e.topicName);if(s)return s.archive(!0).catch((e=>{t&&t(e.message,"err")}));console.log("Topic not found: ",e.topicName)}},permissions:{id:"permissions",title:t({id:"menu_item_edit_permissions"}),handler:null},member_delete:{id:"member_delete",title:t(c.member_delete),handler:(e,t)=>{const s=this.props.tinode.getTopic(e.topicName);if(s&&e.user)return s.delSubscription(e.user).catch((e=>{t&&t(e.message,"err")}));console.log("Topic or user not found: '"+e.topicName+"', '"+e.user+"'")}},member_mute:{id:"member_mute",title:t(c.mute),handler:this.topicPermissionSetter.bind(this,"-P")},member_unmute:{id:"member_unmute",title:t(c.unmute),handler:this.topicPermissionSetter.bind(this,"+P")},member_block:{id:"member_block",title:t(c.block),handler:this.topicPermissionSetter.bind(this,"-JP")},member_unblock:{id:"member_unblock",title:t(c.unblock),handler:this.topicPermissionSetter.bind(this,"+JP")}}}componentDidMount(){document.addEventListener("mousedown",this.handlePageClick,!1),document.addEventListener("keyup",this.handleEscapeKey,!1)}componentWillUnmount(){document.removeEventListener("mousedown",this.handlePageClick,!1),document.removeEventListener("keyup",this.handleEscapeKey,!1)}handlePageClick(e){o().findDOMNode(this).contains(e.target)||(e.preventDefault(),e.stopPropagation(),this.props.hide())}handleEscapeKey(e){27===e.keyCode&&this.props.hide()}handleClick(e){e.preventDefault(),e.stopPropagation(),this.props.hide();let t=this.props.items[e.currentTarget.dataset.id];"string"==typeof t&&(t=this.MenuItems[t]),t?this.props.onAction(t.id,t.handler(this.props.params,this.props.onError),this.props.params):console.log("Invalid menu item ID",e.currentTarget.dataset.id)}deleteMessages(e,t,s,a){const n=this.props.tinode.getTopic(s.topicName);if(!n)return void console.log("Topic not found: ",s.topicName);if(!e&&n.cancelSend(s.seq))return;return(e?n.delMessagesAll(t):n.delMessagesList([s.seq],t)).catch((e=>{a&&a(e.message,"err")}))}retryMessage(e,t){const s=this.props.tinode.getTopic(e.topicName);if(!s||!s.flushMessage(e.seq))return;const a=s.createMessage(e.content,!1);return s.publishDraft(a).catch((e=>{t&&t(e.message,"err")}))}topicPermissionSetter(e,t,s){const a=this.props.tinode.getTopic(t.topicName);if(!a)return void console.log("Topic not found",t.topicName);let n=a.updateMode(t.user,e);return s&&(n=n.catch((e=>{s(e.message,"err")}))),n}render(){let e=0,t=[];this.props.items.map((s=>{"string"==typeof s&&(s=this.MenuItems[s]),s&&s.title&&t.push("-"==s.title?n().createElement("li",{className:"separator",key:e}):n().createElement("li",{onClick:this.handleClick,"data-id":e,key:e},s.title)),e++}));const s=12*l.REM_SIZE,a=l.REM_SIZE*(.7+2.5*t.length),i={left:(this.props.bounds.right-this.props.clickAt.x{e.preventDefault(),this.props.onClose()}},n().createElement("i",{className:"material-icons gray"},"close"))),n().createElement("div",{id:"image-preview-container"},n().createElement("div",{className:"flex-column narrow"},n().createElement("i",{className:"material-icons gray"},function(e){const t={default:"insert_drive_file",image:"image",text:"description",video:"theaters"};return t[e]||t[(e||"").split("/")[0]]||t.default}(this.props.content.type)),n().createElement("div",null,n().createElement("b",null,n().createElement(i.FormattedMessage,{id:"label_content_type"}))," ",this.props.content.type||"application/octet-stream"),n().createElement("div",null,n().createElement("b",null,n().createElement(i.FormattedMessage,{id:"label_size"}))," ",(0,r.bytesToHumanSize)(this.props.content.size)))),n().createElement(o.default,{noInput:!0,onSendMessage:this.handleSendDoc,onError:this.props.onError})):null}}},"./src/widgets/error-panel.jsx":function(e,t,s){s.r(t),s.d(t,{default:function(){return o}});var a=s("react"),n=s.n(a),i=s("./src/widgets/menu-cancel.jsx");class o extends n().PureComponent{constructor(e){super(e),this.state={show:!1},this.hide=this.hide.bind(this)}componentDidUpdate(e){e.level!==this.props.level&&this.setState({show:!!this.props.level})}hide(){this.setState({show:!1}),this.props.onClearError&&this.props.onClearError()}render(){const e={err:"error",warn:"warning",info:"info"}[this.props.level]||"",t="info-box "+e;return n().createElement("div",{className:t},n().createElement("div",{className:"icon"},n().createElement("i",{className:"material-icons"},e)),n().createElement("span",null,this.props.text,this.props.action?n().createElement(n().Fragment,null,n().createElement("a",{href:"#",style:{whiteSpace:"nowrap"},onClick:e=>{e.preventDefault(),this.props.action()}},this.props.actionText)):null),n().createElement("div",{className:"cancel"},n().createElement(i.default,{onCancel:this.hide})))}}},"./src/widgets/file-progress.jsx":function(e,t,s){s.r(t),s.d(t,{default:function(){return o}});var a=s("react"),n=s.n(a),i=s("react-intl");class o extends n().PureComponent{render(){return n().createElement("div",{className:"uploader"},n().createElement("div",null,n().createElement("span",{style:{width:100*this.props.progress+"%"}})),this.props.progress<.999?n().createElement("a",{href:"#",onClick:e=>{e.preventDefault(),this.props.onCancel()}},n().createElement("i",{className:"material-icons"},"close")," ",n().createElement(i.FormattedMessage,{id:"action_cancel",defaultMessage:[{type:0,value:"cancel"}]})):n().createElement(i.FormattedMessage,{id:"upload_finishing",defaultMessage:[{type:0,value:"finishing..."}]}))}}},"./src/widgets/group-manager.jsx":function(e,t,s){s.r(t);var a=s("react"),n=s.n(a),i=s("react-intl"),o=s("./src/widgets/chip-input.jsx"),r=s("./src/widgets/contact-list.jsx");const l=(0,i.defineMessages)({no_contacts:{id:"no_contacts",defaultMessage:[{type:0,value:"You have no contacts :-("}]},contacts_not_found_short:{id:"contacts_not_found_short",defaultMessage:[{type:0,value:"No contacts match '"},{type:1,value:"query"},{type:0,value:"'"}]}});class c extends n().Component{constructor(e){super(e),this.state={members:e.members,index:c.indexMembers(e.members),staticMembers:c.staticMembers(e.members,e.keepInitialMembers,e.requiredMember),contactFilter:"",noContactsMessage:e.intl.formatMessage(l.no_contacts),selectedContacts:c.selectedContacts(e.members)},this.handleContactSelected=this.handleContactSelected.bind(this),this.handleMemberRemoved=this.handleMemberRemoved.bind(this),this.handleContactFilter=this.handleContactFilter.bind(this),this.handleSubmit=this.handleSubmit.bind(this),this.handleCancel=this.handleCancel.bind(this)}static indexMembers(e){let t={};return e.map((e=>{t[e.user]={delta:0,present:!0}})),t}static staticMembers(e,t,s){let a=[];return e.map((e=>{(t||e.user==s)&&a.push(e.user)})),a}static selectedContacts(e){let t=[];return e.map((e=>{t.push(e.user)})),t}handleContactSelected(e,t){let s=this.state.index[e];if(s){if(s.present)return;s.delta+=1,s.present=!0}else s={delta:1,present:!0};let a=this.state.members.slice();a.push(this.props.contacts[t]);const n=c.selectedContacts(a),i=this.state.index;i[e]=s,this.setState({members:a,index:i,selectedContacts:n})}handleMemberRemoved(e,t){const s=this.state.index[e];if(!s||!s.present)return;s.present=!1,s.delta-=1;let a=this.state.members.slice();a.splice(t,1);const n=c.selectedContacts(a),i=this.state.index;i[e]=s,this.setState({members:a,index:i,selectedContacts:n})}handleContactFilter(e){const{formatMessage:t}=this.props.intl,s=e?t(l.contacts_not_found_short,{query:e}):t(l.no_contacts);this.setState({contactFilter:e,noContactsMessage:s})}static doContactFiltering(e,t){if(e){for(let s=0;s=0)return!0;return!1}return!0}handleSubmit(){var e=this,t=[],s=[],a=[];Object.keys(this.state.index).map((function(n){e.state.index[n].present&&t.push(n),e.state.index[n].delta>0?s.push(n):e.state.index[n].delta<0&&a.push(n)})),this.props.onSubmit(t,s,a)}handleCancel(){this.props.onCancel()}render(){const{formatMessage:e}=this.props.intl;return n().createElement("div",{id:"group-manager"},n().createElement("div",{className:"panel-form-row"},n().createElement("label",{className:"small"},n().createElement(i.FormattedMessage,{id:"title_group_members",defaultMessage:[{type:0,value:"Group Members"}]}))),n().createElement("div",{className:"panel-form-row"},n().createElement(o.default,{chips:this.state.members,staticMembers:this.state.staticMembers,prompt:"add members",filterFunc:this.handleContactFilter,onChipRemoved:this.handleMemberRemoved})),n().createElement("div",{className:"panel-form-row"},n().createElement("label",{className:"small"},n().createElement(i.FormattedMessage,{id:"title_all_contacts",defaultMessage:[{type:0,value:"All Contacts"}]}))),n().createElement(r.default,{contacts:this.props.contacts,myUserId:this.props.myUserId,topicSelected:this.state.selectedContacts,filter:this.state.contactFilter,filterFunc:c.doContactFiltering,emptyListMessage:this.state.noContactsMessage,showOnline:!1,showUnread:!1,onTopicSelected:this.handleContactSelected}),n().createElement("div",{id:"group-manager-buttons",className:"panel-form-row"},n().createElement("button",{className:"blue",onClick:this.handleSubmit},n().createElement(i.FormattedMessage,{id:"button_ok",defaultMessage:[{type:0,value:"OK"}]})),n().createElement("button",{className:"white",onClick:this.handleCancel},n().createElement(i.FormattedMessage,{id:"button_cancel",defaultMessage:[{type:0,value:"Cancel"}]}))))}}t.default=(0,i.injectIntl)(c)},"./src/widgets/group-subs.jsx":function(e,t,s){s.r(t),s.d(t,{default:function(){return c}});var a=s("react"),n=s.n(a),i=s("react-intl"),o=s("./src/config.js"),r=s("./src/widgets/letter-tile.jsx"),l=s("./src/lib/blob-helpers.js");class c extends n().Component{constructor(e){super(e)}render(){const e=[],t=(this.props.subscribers||[]).length,s=Math.min(o.MAX_ONLINE_IN_TOPIC,t);return(this.props.subscribers||[]).some((t=>(e.push(n().createElement("div",{className:"avatar-box",key:t.user},n().createElement(r.default,{topic:t.user,avatar:(0,l.makeImageUrl)(t.public?t.public.photo:null)||!0,title:t.public?t.public.fn:null}))),e.length==s))),n().createElement("div",{id:"topic-users"},e," ",t>s?n().createElement("span",null,n().createElement(i.FormattedMessage,{id:"more_online_members",defaultMessage:[{type:0,value:"+"},{type:1,value:"overflow"},{type:0,value:" more"}],values:{overflow:t-s}})):null)}}},"./src/widgets/host-selector.jsx":function(e,t,s){s.r(t),s.d(t,{default:function(){return o}});var a=s("react"),n=s.n(a),i=s("./src/config.js");class o extends n().PureComponent{constructor(e){super(e),this.state={hostName:e.serverAddress,changed:!1},this.handleHostNameChange=this.handleHostNameChange.bind(this),this.handleEditingFinished=this.handleEditingFinished.bind(this)}handleHostNameChange(e){this.setState({hostName:e.target.value,changed:!0})}handleEditingFinished(){this.state.changed&&(this.setState({changed:!1}),this.props.onServerAddressChange(this.state.hostName.trim()))}render(){var e=[];for(let t in i.KNOWN_HOSTS){let s=i.KNOWN_HOSTS[t];e.push(n().createElement("option",{key:s,value:s}))}return n().createElement("div",{className:"panel-form-row"},n().createElement("input",{type:"search",id:"host-name",placeholder:this.props.hostName,list:"known-hosts",className:"quoted",value:this.state.hostName,onChange:this.handleHostNameChange,onBlur:this.handleEditingFinished,required:!0}),n().createElement("datalist",{id:"known-hosts"},e))}}},"./src/widgets/image-preview.jsx":function(e,t,s){s.r(t),s.d(t,{default:function(){return d}});var a=s("react"),n=s.n(a),i=s("react-intl"),o=s("./src/widgets/send-message.jsx"),r=s("./src/config.js"),l=s("./src/lib/blob-helpers.js"),c=s("./src/lib/strformat.js");class d extends n().PureComponent{constructor(e){super(e),this.state={width:0,height:0},this.handleSendImage=this.handleSendImage.bind(this)}assignWidth(e){if(e&&!this.state.width){const t=e.getBoundingClientRect();this.setState({width:0|t.width,height:0|t.height})}}handleSendImage(e){this.props.onClose(),this.props.onSendMessage(e,this.props.content.blob)}render(){if(!this.props.content)return null;const e=(0,l.fitImageSize)(this.props.content.width,this.props.content.height,this.state.width,this.state.height,!1),t=e?{width:e.dstWidth+"px",height:e.dstHeight+"px"}:this.props.content.width>this.props.content.height?{width:"100%"}:{height:"100%"};t.maxWidth="100%",t.maxHeight="100%";let s=this.props.content.filename;const a=Math.max((this.state.width/r.REM_SIZE/1.5|0)-2,12);s.length>a&&(s=s.slice(0,a/2-1)+"…"+s.slice(1-a/2));const d=this.props.content.width||"-",h=this.props.content.height||"-";return n().createElement("div",{id:"image-preview"},n().createElement("div",{id:"image-preview-caption-panel"},this.props.onSendMessage?n().createElement("span",null,this.props.content.filename):n().createElement("a",{href:this.props.content.url,download:this.props.content.filename},n().createElement("i",{className:"material-icons"},"file_download")," ",n().createElement(i.FormattedMessage,{id:"download_action",defaultMessage:[{type:0,value:"download"}]})),n().createElement("a",{href:"#",onClick:e=>{e.preventDefault(),this.props.onClose()}},n().createElement("i",{className:"material-icons gray"},"close"))),n().createElement("div",{id:"image-preview-container",ref:e=>this.assignWidth(e)},n().createElement("img",{src:this.props.content.url,style:t,className:"image-preview",alt:this.props.content.filename})),this.props.onSendMessage?n().createElement(o.default,{messagePrompt:"add_image_caption",acceptBlank:!0,onSendMessage:this.handleSendImage,onError:this.props.onError}):n().createElement("div",{id:"image-preview-footer"},n().createElement("div",null,n().createElement("div",null,n().createElement("b",null,n().createElement(i.FormattedMessage,{id:"label_file_name",defaultMessage:[{type:0,value:"File name:"}]}))),n().createElement("div",null,n().createElement("span",{title:this.props.content.filename},s||"-"))),n().createElement("div",null,n().createElement("div",null,n().createElement("b",null,n().createElement(i.FormattedMessage,{id:"label_content_type",defaultMessage:[{type:0,value:"Content type:"}]}))),n().createElement("div",null,this.props.content.type)),n().createElement("div",null,n().createElement("div",null,n().createElement("b",null,n().createElement(i.FormattedMessage,{id:"label_size",defaultMessage:[{type:0,value:"Size:"}]}))),n().createElement("div",null,d," × ",h," px; ",(0,c.bytesToHumanSize)(this.props.content.size)))))}}},"./src/widgets/in-place-edit.jsx":function(e,t,s){s.r(t),s.d(t,{default:function(){return l}});var a=s("react"),n=s.n(a),i=s("react-dom"),o=s.n(i),r=s("./src/widgets/visible-password.jsx");class l extends n().Component{constructor(e){super(e),this.state={active:e.active,initialValue:e.value||"",value:e.value||""},this.handeTextChange=this.handeTextChange.bind(this),this.handleKeyDown=this.handleKeyDown.bind(this),this.handleStartEditing=this.handleStartEditing.bind(this),this.handleEditingFinished=this.handleEditingFinished.bind(this),this.handlePasswordFinished=this.handlePasswordFinished.bind(this)}componentDidUpdate(e,t){const s=this.props.value||"";t.initialValue==s||t.active||this.setState({initialValue:s,value:s})}handeTextChange(e){this.setState({value:e.target.value})}handleKeyDown(e){27===e.keyCode?this.setState({value:this.props.value,active:!1}):13===e.keyCode&&this.handleEditingFinished(e)}handleStartEditing(){this.props.readOnly||(o().findDOMNode(this).focus(),this.setState({active:!0}))}handleEditingFinished(e){if(this.props.required&&!e.target.checkValidity())return void this.setState({value:this.props.value,active:!1});this.setState({active:!1});let t=this.state.value.trim();(t||this.props.value)&&t!==this.props.value&&this.props.onFinished(t)}handlePasswordFinished(e){this.setState({active:!1}),e&&e!==this.props.value&&this.props.onFinished(e)}render(){if(this.state.active)var e=this.props.type||"text";else{var t="password"==this.props.type?"••••••••":this.state.value,s="in-place-edit"+(this.props.readOnly?" disabled":"");t||(t=this.props.placeholder,s+=" placeholder"),t.length>20&&(t=t.substring(0,19)+"...")}return this.state.active?"password"==e?n().createElement(r.default,{value:this.state.value,placeholder:this.props.placeholder,required:this.props.required?"required":"",autoComplete:this.props.autoComplete,autoFocus:!0,onFinished:this.handlePasswordFinished}):n().createElement("input",{type:e,value:this.state.value,placeholder:this.props.placeholder,required:this.props.required?"required":"",autoComplete:this.props.autoComplete,autoFocus:!0,onChange:this.handeTextChange,onKeyDown:this.handleKeyDown,onBlur:this.handleEditingFinished}):n().createElement("span",{className:s,onClick:this.handleStartEditing},n().createElement("span",{className:"content"},t))}}},"./src/widgets/invitation.jsx":function(e,t,s){s.r(t),s.d(t,{default:function(){return o}});var a=s("react"),n=s.n(a),i=s("react-intl");class o extends n().PureComponent{constructor(e){super(e),this.handleButtonAction=this.handleButtonAction.bind(this)}handleButtonAction(e,t){e.preventDefault(),this.props.onAction(t)}render(){return n().createElement("div",{className:"accept-invite-panel"},n().createElement("div",{className:"title"},n().createElement(i.FormattedMessage,{id:"chat_invitation",defaultMessage:[{type:0,value:"You are invited to start a new chat. What would you like to do?"}]})),n().createElement("div",{className:"footer"},n().createElement("button",{className:"blue",onClick:e=>{this.handleButtonAction(e,"accept")}},n().createElement(i.FormattedMessage,{id:"chat_invitation_accept",defaultMessage:[{type:0,value:"Accept"}]})),n().createElement("button",{className:"white",onClick:e=>{this.handleButtonAction(e,"delete")}},n().createElement(i.FormattedMessage,{id:"chat_invitation_ignore",defaultMessage:[{type:0,value:"Ignore"}]})),n().createElement("button",{className:"white",onClick:e=>{this.handleButtonAction(e,"block")}},n().createElement(i.FormattedMessage,{id:"chat_invitation_block",defaultMessage:[{type:0,value:"Block"}]}))))}}},"./src/widgets/letter-tile.jsx":function(e,t,s){s.r(t),s.d(t,{default:function(){return l}});var a=s("react"),n=s.n(a),i=s("tinode-sdk"),o=s.n(i),r=s("./src/lib/strformat.js");class l extends n().PureComponent{render(){let e;if(!0===this.props.avatar){const t="grp"==o().topicType(this.props.topic),s=(t?"light-color":"dark-color")+Math.abs((0,r.stringHash)(this.props.topic))%16;if(this.props.topic&&this.props.title&&this.props.title.trim()){const t=this.props.title.trim().charAt(0),a="lettertile "+s;e=n().createElement("div",{className:a},n().createElement("div",null,t))}else{const a="material-icons "+s;e=t?n().createElement("i",{className:a},"group"):n().createElement("i",{className:a},"person")}}else e=this.props.avatar?n().createElement("img",{className:"avatar",alt:"avatar",src:this.props.avatar,onError:e=>{e.target.onerror=null,e.target.src="/img/broken_image.png"}}):null;return e}}},"./src/widgets/load-spinner.jsx":function(e,t,s){s.r(t),s.d(t,{default:function(){return i}});var a=s("react"),n=s.n(a);class i extends n().PureComponent{render(){return this.props.show?n().createElement("div",{className:"load-spinner-box"},n().createElement("div",{className:"loader-spinner"})):null}}},"./src/widgets/menu-cancel.jsx":function(e,t,s){s.r(t),s.d(t,{default:function(){return i}});var a=s("react"),n=s.n(a);class i extends n().PureComponent{render(){return n().createElement("a",{href:"#",onClick:e=>{e.preventDefault(),this.props.onCancel()}},n().createElement("i",{className:"material-icons"},"close"))}}},"./src/widgets/menu-contacts.jsx":function(e,t,s){s.r(t),s.d(t,{default:function(){return i}});var a=s("react"),n=s.n(a);class i extends n().PureComponent{render(){return n().createElement("div",null,n().createElement("a",{href:"#",onClick:e=>{e.preventDefault(),this.props.onNewTopic()}},n().createElement("i",{className:"material-icons"},"chat"))," ",n().createElement("a",{href:"#",onClick:e=>{e.preventDefault(),this.props.onSettings()}},n().createElement("i",{className:"material-icons"},"settings")))}}},"./src/widgets/menu-start.jsx":function(e,t,s){s.r(t),s.d(t,{default:function(){return i}});var a=s("react"),n=s.n(a);class i extends n().PureComponent{render(){return n().createElement("div",null,n().createElement("a",{href:"#",onClick:e=>{e.preventDefault(),this.props.onSignUp()}},n().createElement("i",{className:"material-icons"},"person_add"))," ",n().createElement("a",{href:"#",onClick:e=>{e.preventDefault(),this.props.onSettings()}},n().createElement("i",{className:"material-icons"},"settings")))}}},"./src/widgets/more-button.jsx":function(e,t,s){s.r(t),s.d(t,{default:function(){return i}});var a=s("react"),n=s.n(a);class i extends n().PureComponent{constructor(e){super(e),this.state={open:e.open},this.handleToggle=this.handleToggle.bind(this)}handleToggle(){const e=!this.state.open;this.setState({open:e}),this.props.onToggle&&this.props.onToggle(e)}render(){return n().createElement("label",{className:"small clean-clickable",onClick:this.handleToggle},this.props.title,"...",this.state.open?n().createElement("i",{className:"material-icons"},"expand_more"):n().createElement("i",{className:"material-icons"},"chevron_right"))}}},"./src/widgets/new-topic-by-id.jsx":function(e,t,s){s.r(t);var a=s("react"),n=s.n(a),i=s("react-intl");const o=(0,i.defineMessages)({invalid_id:{id:"error_invalid_id",defaultMessage:[{type:0,value:"Invalid ID"}]}});class r extends n().PureComponent{constructor(e){super(e),this.state={groupId:""},this.handleChange=this.handleChange.bind(this),this.handleKeyPress=this.handleKeyPress.bind(this),this.handleSubmit=this.handleSubmit.bind(this)}handleChange(e){this.setState({groupId:e.target.value})}handleKeyPress(e){"Enter"===e.key&&this.handleSubmit(e)}handleSubmit(e){if(e.preventDefault(),this.state.groupId){var t=this.state.groupId.trim();t.length>3&&("usr"==t.substr(0,3)||"grp"==t.substr(0,3))?this.props.onSubmit(t):this.props.onError(this.props.intl.formatMessage(o.invalid_id),"err")}}render(){return n().createElement("div",{className:"panel-form"},n().createElement("div",{className:"panel-form-row"},n().createElement(i.FormattedMessage,{id:"group_user_id_prompt",defaultMessage:[{type:0,value:"Group or User ID"}]},(e=>n().createElement("input",{type:"text",placeholder:e,value:this.state.groupId,onChange:this.handleChange,onKeyPress:this.handleKeyPress,required:!0,autoFocus:!0})))),n().createElement("div",{className:"dialog-buttons"},n().createElement("button",{className:"blue",onClick:this.handleSubmit},n().createElement(i.FormattedMessage,{id:"button_subscribe",defaultMessage:[{type:0,value:"Subscribe"}]}))))}}t.default=(0,i.injectIntl)(r)},"./src/widgets/new-topic-group.jsx":function(e,t,s){s.r(t),s.d(t,{default:function(){return d}});var a=s("react"),n=s.n(a),i=s("react-intl"),o=s("./src/widgets/avatar-upload.jsx"),r=s("./src/widgets/checkbox.jsx"),l=s("./src/widgets/tag-manager.jsx"),c=s("./src/config.js");class d extends n().PureComponent{constructor(e){super(e),this.state={fn:"",private:"",imageDataUrl:null,tags:[],isChannel:!1},this.handleFnChange=this.handleFnChange.bind(this),this.handlePrivateChange=this.handlePrivateChange.bind(this),this.handleImageChanged=this.handleImageChanged.bind(this),this.handleTagsChanged=this.handleTagsChanged.bind(this),this.handleChannelToggle=this.handleChannelToggle.bind(this),this.handleSubmit=this.handleSubmit.bind(this)}handleFnChange(e){this.setState({fn:e.target.value})}handlePrivateChange(e){this.setState({private:e.target.value})}handleImageChanged(e){this.setState({imageDataUrl:e})}handleTagsChanged(e){this.setState({tags:e})}handleChannelToggle(){this.setState({isChannel:!this.state.isChannel})}handleSubmit(e){e.preventDefault();const t=this.state.fn.trim().substring(0,c.MAX_TITLE_LENGTH),s=this.state.private.trim().substring(0,c.MAX_TITLE_LENGTH);t&&this.props.onSubmit(t,this.state.imageDataUrl,s,this.state.tags,this.state.isChannel)}render(){var e="blue";return this.props.disabled&&(e+=" disabled"),n().createElement("form",{className:"panel-form",onSubmit:this.handleSubmit},n().createElement("div",{className:"panel-form-row"},n().createElement("div",{className:"panel-form-column"},n().createElement("label",{className:"small",htmlFor:"new-topic-fn"},n().createElement(i.FormattedMessage,{id:"label_topic_name"})),n().createElement(i.FormattedMessage,{id:"topic_name_editing_placeholder",defaultMessage:[{type:0,value:"Freeform name of the group"}]},(e=>n().createElement("input",{type:"text",id:"new-topic-fn",placeholder:e,value:this.state.fn,onChange:this.handleFnChange,autoFocus:!0,required:!0}))),n().createElement("br",null),n().createElement("label",{className:"small",htmlFor:"new-topic-priv"},n().createElement(i.FormattedMessage,{id:"label_private"})),n().createElement(i.FormattedMessage,{id:"private_editing_placeholder"},(e=>n().createElement("input",{type:"text",id:"new-topic-priv",placeholder:e,value:this.state.private,onChange:this.handlePrivateChange})))),n().createElement(o.default,{onError:this.props.onError,onImageChanged:this.handleImageChanged})),n().createElement("div",{className:"panel-form-row"},n().createElement(r.default,{checked:this.state.isChannel,onChange:this.handleChannelToggle})," ",n().createElement("label",{onClick:this.handleChannelToggle},n().createElement(i.FormattedMessage,{id:"channel_prompt",defaultMessage:[{type:0,value:"This is a channel"}]}))),n().createElement(i.FormattedMessage,{id:"title_tag_manager"},(e=>n().createElement(l.default,{tags:this.state.tags,activated:!0,onTagsChanged:this.handleTagsChanged,tinode:this.props.tinode,title:e}))),n().createElement("div",{className:"dialog-buttons"},n().createElement("button",{className:e},n().createElement(i.FormattedMessage,{id:"button_create",defaultMessage:[{type:0,value:"Create"}]}))))}}},"./src/widgets/permissions-editor.jsx":function(e,t,s){s.r(t);var a=s("react"),n=s.n(a),i=s("react-intl"),o=s("./src/widgets/checkbox.jsx"),r=s("./src/widgets/contact.jsx"),l=s("./src/lib/blob-helpers.js");const c=(0,i.defineMessages)({joiner:{id:"permission_join",defaultMessage:[{type:0,value:"Join ("},{type:1,value:"val"},{type:0,value:")"}]},reader:{id:"permission_read",defaultMessage:[{type:0,value:"Read ("},{type:1,value:"val"},{type:0,value:")"}]},writer:{id:"permission_write",defaultMessage:[{type:0,value:"Write ("},{type:1,value:"val"},{type:0,value:")"}]},preser:{id:"permission_pres",defaultMessage:[{type:0,value:"Get notified ("},{type:1,value:"val"},{type:0,value:")"}]},approver:{id:"permission_admin",defaultMessage:[{type:0,value:"Approve ("},{type:1,value:"val"},{type:0,value:")"}]},sharer:{id:"permission_share",defaultMessage:[{type:0,value:"Share ("},{type:1,value:"val"},{type:0,value:")"}]},deleter:{id:"permission_delete",defaultMessage:[{type:0,value:"Delete ("},{type:1,value:"val"},{type:0,value:")"}]},owner:{id:"permission_owner",defaultMessage:[{type:0,value:"Owner ("},{type:1,value:"val"},{type:0,value:")"}]}});class d extends n().Component{constructor(e){super(e),this.state={mode:(e.mode||"").replace("N","")},this.handleChange=this.handleChange.bind(this),this.handleSubmit=this.handleSubmit.bind(this),this.handleCancel=this.handleCancel.bind(this)}handleChange(e){let t=this.state.mode;-1==t.indexOf(e)?t+=e:t=t.replace(e,""),this.setState({mode:t})}handleSubmit(){var e=(this.state.mode||"N").split("").sort().join("");e!==(this.props.mode||"N").split("").sort().join("")?this.props.onSubmit(e):this.props.onCancel()}handleCancel(){this.props.onCancel()}render(){const{formatMessage:e}=this.props.intl,t="JRWPASDO",s={J:e(c.joiner,{val:"J"}),R:e(c.reader,{val:"R"}),W:e(c.writer,{val:"W"}),P:e(c.preser,{val:"P"}),A:e(c.approver,{val:"A"}),S:e(c.sharer,{val:"S"}),D:e(c.deleter,{val:"D"}),O:e(c.owner,{val:"O"})};let a=this.props.skip||"",d=this.state.mode,h=(this.props.compare||"").replace("N",""),p=[];for(let e=0;e=0&&d.indexOf(i)<0||p.push(n().createElement("tr",{key:i},n().createElement("td",null,s[i]),n().createElement("td",{className:"checkbox"},a.indexOf(i)<0?n().createElement(o.default,{name:i,checked:d.indexOf(i)>=0,onChange:this.handleChange}):n().createElement(o.default,{name:i,checked:d.indexOf(i)>=0})),this.props.compare?n().createElement("td",{className:"checkbox"},n().createElement(o.default,{name:i,checked:h.indexOf(i)>=0})):null))}return n().createElement("div",{className:"panel-form-column"},this.props.userTitle?n().createElement("ul",{className:"contact-box"},n().createElement(r.default,{item:this.props.item,title:this.props.userTitle,avatar:(0,l.makeImageUrl)(this.props.userAvatar?this.props.userAvatar:null)})):null,n().createElement("label",{className:"small"},n().createElement(i.FormattedMessage,{id:"title_permissions",defaultMessage:[{type:0,value:"Permissions"}]})),n().createElement("table",{className:"permission-editor"},this.props.compare?n().createElement("thead",null,n().createElement("tr",null,n().createElement("th",null),n().createElement("th",null,this.props.modeTitle),n().createElement("th",null,this.props.compareTitle))):null,n().createElement("tbody",null,p)),n().createElement("br",null),n().createElement("div",{className:"dialog-buttons"},n().createElement("button",{className:"outline",onClick:this.handleCancel},n().createElement(i.FormattedMessage,{id:"button_cancel"})),n().createElement("button",{className:"blue",onClick:this.handleSubmit},n().createElement(i.FormattedMessage,{id:"button_ok"}))))}}t.default=(0,i.injectIntl)(d)},"./src/widgets/received-marker.jsx":function(e,t,s){s.r(t);var a=s("react"),n=s.n(a),i=s("react-intl"),o=s("tinode-sdk"),r=s.n(o),l=s("./src/lib/strformat.js");const c=(0,i.defineMessages)({sending:{id:"message_sending",defaultMessage:[{type:0,value:"sending..."}]},failed:{id:"message_sending_failed",defaultMessage:[{type:0,value:"failed"}]}});class d extends n().PureComponent{render(){const{formatMessage:e}=this.props.intl;let t;t=this.props.received<=r().MESSAGE_STATUS_SENDING?e(c.sending):this.props.received==r().MESSAGE_STATUS_FAILED?e(c.failed):(0,l.shortDateFormat)(this.props.timestamp,this.props.intl.locale);let s=null;return this.props.received<=r().MESSAGE_STATUS_SENDING?s=n().createElement("i",{className:"material-icons small"},"access_time"):this.props.received==r().MESSAGE_STATUS_FAILED?s=n().createElement("i",{className:"material-icons small amber"},"warning"):this.props.received==r().MESSAGE_STATUS_SENT?s=n().createElement("i",{className:"material-icons small"},"done"):this.props.received==r().MESSAGE_STATUS_RECEIVED?s=n().createElement("i",{className:"material-icons small"},"done_all"):this.props.received==r().MESSAGE_STATUS_READ&&(s=n().createElement("i",{className:"material-icons small blue"},"done_all")),n().createElement("span",{className:"timestamp"},t," ",s)}}t.default=(0,i.injectIntl)(d)},"./src/widgets/search-contacts.jsx":function(e,t,s){s.r(t),s.d(t,{default:function(){return l}});var a=s("react"),n=s.n(a),i=s("react-intl"),o=s("tinode-sdk"),r=s.n(o);class l extends n().PureComponent{constructor(e){super(e),this.state={edited:!1,search:""},this.handleSearchChange=this.handleSearchChange.bind(this),this.handleSearch=this.handleSearch.bind(this),this.handleClear=this.handleClear.bind(this),this.handleKeyDown=this.handleKeyDown.bind(this)}componentWillUnmount(){this.state.edited&&(this.setState({search:"",edited:!1}),this.props.onSearchContacts(r().DEL_CHAR))}handleSearchChange(e){this.setState({search:e.target.value})}handleSearch(e){e.preventDefault();var t=this.state.search.trim();this.setState({edited:t.length>0}),this.props.onSearchContacts(t.length>0?t:r().DEL_CHAR)}handleClear(e){e.preventDefault(),this.state.edited&&this.props.onSearchContacts(r().DEL_CHAR),this.setState({search:"",edited:!1})}handleKeyDown(e){"Enter"===e.key?this.handleSearch(e):"Escape"===e.key&&this.handleClear()}render(){return n().createElement("div",{className:"panel-form"},n().createElement("div",{className:"panel-form-row"},n().createElement("i",{className:"material-icons search"},"search"),n().createElement(i.FormattedMessage,{id:"search_placeholder",defaultMessage:[{type:0,value:"List like email:alice@example.com, tel:17025550003..."}]},(e=>n().createElement("input",{className:"search",type:"text",placeholder:e,value:this.state.search,onChange:this.handleSearchChange,onKeyDown:this.handleKeyDown,required:!0,autoFocus:!0}))),n().createElement("a",{href:"#",onClick:this.handleClear},n().createElement("i",{className:"material-icons"},"close"))))}}},"./src/widgets/send-message.jsx":function(e,t,s){s.r(t);var a=s("react"),n=s.n(a),i=s("react-intl"),o=(s("tinode-sdk"),s("./src/config.js")),r=s("./src/lib/blob-helpers.js");const l=(0,i.defineMessages)({messaging_disabled:{id:"messaging_disabled_prompt",defaultMessage:[{type:0,value:"Messaging disabled"}]},type_new_message:{id:"new_message_prompt",defaultMessage:[{type:0,value:"New message"}]},add_image_caption:{id:"image_caption_prompt",defaultMessage:[{type:0,value:"Image caption"}]},file_attachment_too_large:{id:"file_attachment_too_large",defaultMessage:[{type:0,value:"The file size "},{type:1,value:"size"},{type:0,value:" exceeds the "},{type:1,value:"limit"},{type:0,value:" limit."}]},cannot_initiate_upload:{id:"cannot_initiate_file_upload",defaultMessage:[{type:0,value:"Cannot initiate file upload."}]}});class c extends n().PureComponent{constructor(e){super(e),this.state={message:"",keypressTimestamp:(new Date).getTime()-o.KEYPRESS_DELAY-1},this.handlePasteEvent=this.handlePasteEvent.bind(this),this.handleAttachImage=this.handleAttachImage.bind(this),this.handleAttachFile=this.handleAttachFile.bind(this),this.handleSend=this.handleSend.bind(this),this.handleKeyPress=this.handleKeyPress.bind(this),this.handleMessageTyping=this.handleMessageTyping.bind(this)}componentDidMount(){this.messageEditArea&&this.messageEditArea.addEventListener("paste",this.handlePasteEvent,!1)}componentWillUnmount(){this.messageEditArea&&this.messageEditArea.removeEventListener("paste",this.handlePasteEvent,!1)}componentDidUpdate(){this.messageEditArea&&this.messageEditArea.focus()}handlePasteEvent(e){this.props.disabled||(0,r.filePasted)(e,((e,t,s,a,n)=>{this.props.onAttachImage(t,e,s,a,n)}),((e,t,s)=>{this.props.onAttachFile(e,t,s)}),this.props.onError)&&e.preventDefault()}handleAttachImage(e){e.target.files&&e.target.files.length>0&&this.props.onAttachImage(e.target.files[0]),e.target.value=""}handleAttachFile(e){const{formatMessage:t}=this.props.intl;e.target.files&&e.target.files.length>0&&this.props.onAttachFile(e.target.files[0]),e.target.value=""}handleSend(e){e.preventDefault();const t=this.state.message.trim();(t||this.props.acceptBlank||this.props.noInput)&&(this.props.onSendMessage(t),this.setState({message:""}))}handleKeyPress(e){"Enter"===e.key&&(e.shiftKey||(e.preventDefault(),e.stopPropagation(),this.handleSend(e)))}handleMessageTyping(e){const t={message:e.target.value};if(this.props.onKeyPress){const e=(new Date).getTime();e-this.state.keypressTimestamp>o.KEYPRESS_DELAY&&(this.props.onKeyPress(),t.keypressTimestamp=e)}this.setState(t)}render(){const{formatMessage:e}=this.props.intl,t=this.props.disabled?e(l.messaging_disabled):this.props.messagePrompt?e(l[this.props.messagePrompt]):e(l.type_new_message);return n().createElement("div",{id:"send-message-panel"},this.props.disabled?n().createElement("div",{id:"writing-disabled"},t):n().createElement(n().Fragment,null,this.props.onAttachFile?n().createElement(n().Fragment,null,n().createElement("a",{href:"#",onClick:e=>{e.preventDefault(),this.attachImage.click()},title:"Add image"},n().createElement("i",{className:"material-icons secondary"},"photo")),n().createElement("a",{href:"#",onClick:e=>{e.preventDefault(),this.attachFile.click()},title:"Attach file"},n().createElement("i",{className:"material-icons secondary"},"attach_file"))):null,this.props.noInput?n().createElement("div",{className:"hr thin"}):n().createElement("textarea",{id:"sendMessage",placeholder:t,value:this.state.message,onChange:this.handleMessageTyping,onKeyPress:this.handleKeyPress,ref:e=>{this.messageEditArea=e},autoFocus:!0}),n().createElement("a",{href:"#",onClick:this.handleSend,title:"Send"},n().createElement("i",{className:"material-icons"},"send")),n().createElement("input",{type:"file",ref:e=>{this.attachFile=e},onChange:this.handleAttachFile,style:{display:"none"}}),n().createElement("input",{type:"file",ref:e=>{this.attachImage=e},accept:"image/*",onChange:this.handleAttachImage,style:{display:"none"}})))}}t.default=(0,i.injectIntl)(c)},"./src/widgets/side-navbar.jsx":function(e,t,s){s.r(t),s.d(t,{default:function(){return c}});var a=s("react"),n=s.n(a),i=s("./src/widgets/letter-tile.jsx"),o=s("./src/widgets/button-back.jsx"),r=s("./src/widgets/menu-contacts.jsx"),l=s("./src/widgets/menu-start.jsx");class c extends n().PureComponent{render(){return n().createElement("div",{id:"side-caption-panel",className:"caption-panel"},this.props.onCancel?n().createElement(o.default,{onBack:this.props.onCancel}):null,this.props.avatar?n().createElement("div",{id:"self-avatar",className:"avatar-box"},n().createElement(i.default,{avatar:this.props.avatar,topic:this.props.myUserId,title:this.props.title})):null,n().createElement("div",{id:"sidepanel-title",className:"panel-title"},this.props.title),"login"===this.props.state?n().createElement(l.default,{onSignUp:this.props.onSignUp,onSettings:this.props.onSettings}):"contacts"===this.props.state?n().createElement(r.default,{onNewTopic:this.props.onNewTopic,onSettings:this.props.onSettings}):null)}}},"./src/widgets/tag-manager.jsx":function(e,t,s){s.r(t),s.d(t,{default:function(){return c}});var a=s("react"),n=s.n(a),i=s("react-intl"),o=s("./src/widgets/chip-input.jsx"),r=s("./src/config.js"),l=s("./src/lib/utils.js");class c extends n().Component{constructor(e){super(e),this.state={tags:this.props.tags,tagInput:"",activated:this.props.activated},this.handleTagInput=this.handleTagInput.bind(this),this.handleAddTag=this.handleAddTag.bind(this),this.handleRemoveTag=this.handleRemoveTag.bind(this),this.handleSubmit=this.handleSubmit.bind(this),this.handleCancel=this.handleCancel.bind(this)}static getDerivedStateFromProps(e,t){return(0,l.arrayEqual)(e.tags,t.tags)||t.activated?null:{tags:e.tags}}handleTagInput(e){if(this.setState({tagInput:e}),e.length>0){const t=e[e.length-1];'"'==e[0]?e.length>1&&'"'==t&&this.handleAddTag(e.substring(1,e.length-1)):","!=t&&" "!=t&&";"!=t&&'"'!=t||this.handleAddTag(e.substring(0,e.length-1).trim())}}handleAddTag(e){const t=this.props.tinode.getServerLimit("maxTagCount",r.MAX_TAG_COUNT);if(e.length>0&&this.state.tags.length{s.push({user:a,invalid:a.lengtht})})):(this.state.tags.map((e=>{s.push(n().createElement("span",{className:"badge",key:s.length},e))})),0==s.length&&(s=n().createElement("i",null,n().createElement(i.FormattedMessage,{id:"tags_not_found",defaultMessage:[{type:0,value:"No tags defined. Add some."}]})))),n().createElement("div",{className:"panel-form-column"},n().createElement("div",{className:"panel-form-row"},n().createElement("label",{className:"small"},this.props.title)),this.state.activated?n().createElement("div",null,n().createElement(i.FormattedMessage,{id:"tags_editor_no_tags",defaultMessage:[{type:0,value:"Add some tags"}]},(e=>n().createElement(o.default,{chips:s,avatarDisabled:!0,prompt:e,onEnter:this.handleAddTag,onFocusLost:this.handleAddTag,onCancel:this.handleCancel,onChipRemoved:this.handleRemoveTag,filterFunc:this.handleTagInput}))),this.props.onSubmit||this.props.onCancel?n().createElement("div",{id:"tag-manager-buttons",className:"dialog-buttons panel-form-row"},n().createElement("button",{className:"outline",onClick:this.handleCancel},n().createElement(i.FormattedMessage,{id:"button_cancel",defautMessage:"Cancel"})),n().createElement("button",{className:"blue",onClick:this.handleSubmit},n().createElement(i.FormattedMessage,{id:"button_ok",defautMessage:"OK"}))):null):n().createElement("div",{className:"quoted"},n().createElement("a",{href:"#",className:"flat-button",onClick:e=>{e.preventDefault(),this.setState({activated:!0})}},n().createElement("i",{className:"material-icons"},"edit"),"  ",n().createElement(i.FormattedMessage,{id:"title_manage_tags",defaultMessage:[{type:0,value:"Manage"}]})),n().createElement(n().Fragment,null,s)))}}},"./src/widgets/unread-badge.jsx":function(e,t,s){s.r(t),s.d(t,{default:function(){return i}});var a=s("react"),n=s.n(a);class i extends n().PureComponent{render(){return this.props.count>0?n().createElement("span",{className:"unread"},this.props.count>9?"9+":this.props.count):null}}},"./src/widgets/uploading-image.jsx":function(e,t,s){s.r(t),s.d(t,{default:function(){return o}});var a=s("react"),n=s.n(a),i=(s("react-intl"),s("./src/widgets/file-progress.jsx"));class o extends n().PureComponent{constructor(e){super(e)}render(){return n().createElement("div",{className:"inline-image"},n().createElement("img",this.props),n().createElement("div",{className:"rounded-container"},n().createElement(i.default,{progress:this.props.progress,onCancel:this.props.onCancelUpload})))}}},"./src/widgets/visible-password.jsx":function(e,t,s){s.r(t),s.d(t,{default:function(){return i}});var a=s("react"),n=s.n(a);class i extends n().PureComponent{constructor(e){super(e),this.state={value:this.props.value,visible:!1},this.handleVisibility=this.handleVisibility.bind(this),this.handeTextChange=this.handeTextChange.bind(this),this.handleKeyDown=this.handleKeyDown.bind(this),this.handleEditingFinished=this.handleEditingFinished.bind(this)}handeTextChange(e){this.setState({value:e.target.value}),this.props.onChange&&this.props.onChange(e)}handleVisibility(e){e.preventDefault(),this.setState({visible:!this.state.visible})}handleKeyDown(e){27==e.keyCode?(this.setState({value:this.props.value,visible:!1}),this.props.onFinished&&this.props.onFinished()):13==e.keyCode&&this.handleEditingFinished()}handleEditingFinished(e){if(e){let t=e.currentTarget;setTimeout((()=>{t.contains(document.activeElement)||this.props.onFinished&&this.props.onFinished(this.state.value)}),0)}else this.props.onFinished&&this.props.onFinished(this.state.value.trim())}render(){return n().createElement("div",{tabIndex:"-1",className:"group-focus",onBlur:this.handleEditingFinished},n().createElement("input",{className:"with-visibility",type:this.state.visible?"text":"password",value:this.state.value,placeholder:this.props.placeholder,required:this.props.required?"required":"",autoFocus:this.props.autoFocus?"autoFocus":"",autoComplete:this.props.autoComplete,onChange:this.handeTextChange,onKeyDown:this.handleKeyDown}),n().createElement("span",{onClick:this.handleVisibility},n().createElement("i",{className:"material-icons clickable light-gray"},this.state.visible?"visibility":"visibility_off")))}}},"./src/messages.json":function(e){e.exports=JSON.parse('{"de":{"validate_credential_action":"bestätigen","title_tag_manager":"Schlagworte (Nutzer entdecken)","label_user_contacts":"Kontakte:","button_add_another":"Hinzufügen","label_message_sound":"Benachrichtigungston:","label_push_notifications":"Benachrichtigungsmeldungen:","label_push_notifications_disabled":"Benachrichtigungsmeldungen (erfordert HTTPS):","label_incognito_mode":"inkognito-Modus:","delete_account":"Konto löschen","delete_account_arning":"Möchten Sie das Konto wirklich löschen? Das kann nicht rückgängig gemacht werden","label_password":"Passwort","password_unchanged_prompt":"unverändert","button_logout":"Abmelden","button_delete_account":"Konto löschen","label_default_access_mode":"Standard Zugriffsmodus:","blocked_contacts_link":"Blockierte Kontakte ({count})","link_contact_us":"Kontakt","link_terms_of_service":"Nutzungsbedingungen","link_privacy_policy":"Datenschutzerklärung","label_sdk":"SDK:","label_server_address":"Server Adresse:","archived_contacts":"Archivierte Kontakte ({count})","contacts_not_found":"Sie haben keine Unterhaltungen
¯∖_(ツ)_/¯","full_name_prompt":"Vollständiger Name, z.B. Lisa Musterfrau","email_prompt":"E-Mail, z.B. jdoe@beispiel.de","button_sign_up":"Anmelden","label_your_name":"Ihr Name","label_user_id":"ID:","button_edit":"Bearbeiten","requested_permissions":"Angefordert","granted_permissions":"Erteilt","menu_item_edit_permissions":"Berechtigungen ändern","label_other_user":"Andere","action_clear_messages":"Nachrichten leeren","clear_messages_warning":"Sind Sie sicher, dass Sie diese Unterhaltung für alle leeren wollen? Das kann nicht rückgängig gemacht werden.","action_delete_messages":"Nachrichten für alle löschen","delete_messages_warning":"Sind Sie sicher, dass Sie diese Unterhaltung für alle löschen wollen? Das kann nicht rückgängig gemacht werden.","action_leave_chat":"Unterhaltung verlassen","leave_chat_warning":"Möchten Sie diese Unterhaltung wirklich verlassen?","action_block_contact":"Kontakt blockieren","block_contact_warning":"Möchten Sie diesen Kontakt wirklich blockieren?","action_report_chat":"Unterhaltung melden","report_chat_warning":"Möchten Sie diese Unterhaltung wirklich blockieren und melden?","title_info":"Info","label_topic_name":"Name","label_private":"Privater Kommentar","private_editing_placeholder":"Nur für Sie sichtbar","label_muting_topic":"Stumm geschaltet:","action_more":"Mehr","label_your_permissions":"Ihre Berechtigungen:","label_permissions":"Berechtigungen:","label_you":"Sie:","label_default_access":"Standard Zugriffsmodus:","label_group_members":"Gruppenmitglieder:","button_add_members":"Mitglieder hinzufügen","group_has_no_members":"Keine Mitglieder","login_prompt":"Anmelden","password_prompt":"Passwort","stay_logged_in":"Angemeldet bleiben","forgot_password_link":"Passwort vergessen?","button_sign_in":"Anmelden","label_client":"Client:","label_server":"Server:","online_now":"jetzt online","last_seen_timestamp":"Zuletzt gesehen","title_not_found":"Nicht gefunden","unnamed_topic":"Unbenannt","messages_not_readable":"Neue Nachrichten können nicht gelesen werden","peers_messaging_disabled":"Gruppennachrichten sind deaktiviert","enable_peers_messaging":"Aktivieren","search_for_contacts":"Nutzen Sie die Suche um Kontakte zu finden","search_no_results":"Die Suche hatte keine Ergebnisse","tabtitle_find_user":"Suchen","tabtitle_new_group":"Neue Gruppe","tabtitle_group_by_id":"nach ID","new_password_placeholder":"Geben Sie ein neues Passwort ein","label_reset_password":"Passwort per E-Mail wiederherstellen:","credential_email_prompt":"E-Mail Adresse für Registrierung","button_reset":"Zurücksetzen","button_send_request":"Anfrage senden","label_server_to_use":"Server verwenden:","label_wire_transport":"Übertragung per Kabel:","button_update":"Aktualisieren","sidepanel_title_login":"Anmelden","sidepanel_title_register":"Konto erstellen","sidepanel_title_settings":"Einstellungen","sidepanel_title_account_settings":"Konto-Einstellungen","sidepanel_title_acc_general":"Allgemein","sidepanel_title_acc_security":"Sicherheit","sidepanel_title_acc_notifications":"Benachrichtigungen","sidepanel_title_acc_support":"Unterstützung","sidepanel_title_newtpk":"Neue Unterhaltung starten","sidepanel_title_cred":"Anmeldeinformationen bestätigen","sidepanel_title_reset":"Passwort zurücksetzen","sidepanel_title_archive":"Archivierte Unterhaltungen","sidepanel_title_blocked":"Blockierte Unterhaltungen","reconnect_countdown":"Getrennt. Wiederverbinden in {seconds}…","reconnect_now":"Jetzt probieren","push_init_failed":"Initialisierung von Push-Benachrichtigungen fehlgeschlagen","invalid_security_token":"Ungültiger Sicherheitsschlüssel","no_connection":"Keine Verbindung","code_doesnot_match":"Code stimmt nicht überein","update_available":"Aktualisierung verfügbar.","reload_update":"Neu laden","phone_dative":"Telefon","email_dative":"E-Mail","enter_confirmation_code_prompt":"Geben Sie den Bestätigungscode ein, der per {method} geschickt wurde:","numeric_confirmation_code_prompt":"Nur zahlen","button_confirm":"Bestätigen","save_attachment":"Speichern","deleted_content":"Inhalt gelöscht","invalid_content":"ungültiger Inhalt","user_not_found":"Nicht gefunden","badge_you":"Sie","badge_owner":"Besitzer","menu_item_info":"Info","menu_item_clear_messages":"Nachrichten leeren","menu_item_clear_messages_for_all":"Für alle leeren","menu_item_delete":"Löschen","menu_item_delete_for_all":"Für alle löschen","menu_item_send_retry":"Wiederholen","menu_item_mute":"Unterhaltung stumm schalten","menu_item_unmute":"Stumm schalten beenden","menu_item_delete_topic":"Entfernen","topic_delete_warning":"Möchten Sie diese Unterhaltung wirklich löschen?","menu_item_unblock":"Blockierung aufheben","menu_item_block":"Blockieren","topic_block_warning":"Möchten Sie diese Unterhaltung wirklich blockieren?","menu_item_member_delete":"Entfernen","menu_item_archive_topic":"Archivieren","action_cancel":"Abbrechen","upload_finishing":"wird abgeschlossen...","no_contacts":"Sie haben keine Kontakte :-(","contacts_not_found_short":"Keine Kontakte für \'\'{query}\'\'","title_group_members":"Gruppenmitglieder","title_all_contacts":"Alle Kontakte","button_ok":"OK","button_cancel":"Abbrechen","more_online_members":"+{overflow} mehr","download_action":"herunterladen","label_file_name":"Dateiname:","label_content_type":"Inhaltsart:","label_size":"Größe:","chat_invitation":"Sie sind eingeladen, an einem neuen Chat teilzunehmen. Was möchten Sie tun?","chat_invitation_accept":"Akzeptieren","chat_invitation_ignore":"Ignorieren","chat_invitation_block":"Blockieren","error_invalid_id":"ungültige ID","group_user_id_prompt":"Gruppe oder Benutzer ID","button_subscribe":"Abbonieren","topic_name_editing_placeholder":"Freiform Name der Gruppe","button_create":"Erstellen","permission_join":"Beitreten ({val})","permission_read":"Lesen ({val})","permission_write":"Schreiben ({val})","permission_pres":"Benachrichtigt werden ({val})","permission_admin":"Bestätigen ({val})","permission_share":"Teilen ({val})","permission_delete":"Entfernen ({val})","permission_owner":"Besitzer ({val})","title_permissions":"Berechtigungen","message_sending":"wird gesendet...","message_sending_failed":"fehlgeschlagen","search_placeholder":"Liste: email:lisa@beispiel.de, tel:17025550003...","messaging_disabled_prompt":"Nachrichtenübermittlung deaktiviert","new_message_prompt":"Neue Nachricht","image_caption_prompt":"Bildunterschrift","file_attachment_too_large":"Die Dateigröße {size} überschreitet das Limit von {limit}.","cannot_initiate_file_upload":"Datei kann nicht hochgeladen werden.","tags_not_found":"Keine Schlagworte definiert. Erstellen Sie welche.","tags_editor_no_tags":"Schlagworte hinzufügen","title_manage_tags":"Verwalten","channel_prompt":"Dies ist ein Sender","channel":"Sender"},"en":{"validate_credential_action":"confirm","title_tag_manager":"Tags (user discovery)","label_user_contacts":"Contacts:","button_add_another":"Add another","label_message_sound":"Message sound:","label_push_notifications":"Notification alerts:","label_push_notifications_disabled":"Notification alerts (requires HTTPS):","label_incognito_mode":"Incognito mode:","delete_account":"Delete account","delete_account_arning":"Are you sure you want to delete your account? It cannot be undone.","label_password":"Password","password_unchanged_prompt":"Unchanged","button_logout":"Logout","button_delete_account":"Delete account","label_default_access_mode":"Default access mode:","blocked_contacts_link":"Blocked contacts ({count})","link_contact_us":"Contact Us","link_terms_of_service":"Terms of Service","link_privacy_policy":"Privacy Policy","label_sdk":"SDK:","label_server_address":"Server address:","archived_contacts":"Archived contacts ({count})","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_user_id":"ID:","button_edit":"Edit","requested_permissions":"Requested","granted_permissions":"Granted","menu_item_edit_permissions":"Edit permissions","label_other_user":"Other","action_clear_messages":"Clear Messages","clear_messages_warning":"Are you sure you want to clear all messages? It cannot be undone.","action_delete_messages":"Clear Messages for All","delete_messages_warning":"Are you sure you want to delete all messages for everyone? It cannot be undone.","action_leave_chat":"Leave Conversation","leave_chat_warning":"Are you sure you want to leave this conversation?","action_block_contact":"Block Contact","block_contact_warning":"Are you sure you want to block this contact?","action_report_chat":"Report Conversation","report_chat_warning":"Are you sure you want to block and report this conversation?","title_info":"Info","label_topic_name":"Name","label_private":"Private comment","private_editing_placeholder":"Visible to you only","label_muting_topic":"Muted:","action_more":"More","label_your_permissions":"Your permissions:","label_permissions":"Permissions:","label_you":"You:","label_default_access":"Default access mode:","label_group_members":"Group members:","button_add_members":"Add members","group_has_no_members":"No members","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","channel":"channel","unnamed_topic":"Unnamed","messages_not_readable":"no access to messages","peers_messaging_disabled":"Peer\'s messaging is disabled.","enable_peers_messaging":"Enable","search_for_contacts":"Use search to find contacts","search_no_results":"Search returned no results","tabtitle_find_user":"find","tabtitle_new_group":"new group","tabtitle_group_by_id":"by id","new_password_placeholder":"Enter new password","label_reset_password":"Send a password reset email:","credential_email_prompt":"Your registration email","button_reset":"Reset","button_send_request":"Send request","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_account_settings":"Account Settings","sidepanel_title_acc_general":"General","sidepanel_title_acc_security":"Security","sidepanel_title_acc_notifications":"Notifications","sidepanel_title_acc_support":"Support","sidepanel_title_newtpk":"Start New Chat","sidepanel_title_cred":"Confirm Credentials","sidepanel_title_reset":"Reset Password","sidepanel_title_archive":"Archived Chats","sidepanel_title_blocked":"Blocked Chats","reconnect_countdown":"Disconnected. Reconnecting in {seconds}…","reconnect_now":"Try now","push_init_failed":"Failed to initialize push notifications","invalid_security_token":"Invalid security token","no_connection":"No connection","code_doesnot_match":"Code does not match","update_available":"Update available.","reload_update":"Reload","phone_dative":"phone","email_dative":"email","enter_confirmation_code_prompt":"Enter confirmation code sent to you by {method}:","numeric_confirmation_code_prompt":"Numbers only","button_confirm":"Confirm","save_attachment":"save","deleted_content":"content deleted","invalid_content":"invalid content","user_not_found":"Not found","badge_you":"you","badge_owner":"owner","menu_item_info":"Info","menu_item_clear_messages":"Clear messages","menu_item_clear_messages_for_all":"Clear for All","menu_item_delete":"Delete","menu_item_delete_for_all":"Delete for All","menu_item_send_retry":"Retry","menu_item_mute":"Mute","menu_item_unmute":"Unmute","menu_item_delete_topic":"Delete","topic_delete_warning":"Are you sure you want to delete this conversation?","menu_item_unblock":"Unblock","menu_item_block":"Block","topic_block_warning":"Are you sure you want to block this conversation?","menu_item_member_delete":"Remove","menu_item_archive_topic":"Archive","action_cancel":"cancel","upload_finishing":"finishing...","no_contacts":"You have no contacts :-(","contacts_not_found_short":"No contacts match \'\'{query}\'\'","title_group_members":"Group Members","title_all_contacts":"All Contacts","button_ok":"OK","button_cancel":"Cancel","more_online_members":"+{overflow} more","download_action":"download","label_file_name":"File name:","label_content_type":"Content type:","label_size":"Size:","chat_invitation":"You are invited to start a new chat. What would you like to do?","chat_invitation_accept":"Accept","chat_invitation_ignore":"Ignore","chat_invitation_block":"Block","error_invalid_id":"Invalid ID","group_user_id_prompt":"Group or User ID","button_subscribe":"Subscribe","topic_name_editing_placeholder":"Freeform name of the group","channel_prompt":"This is a channel","button_create":"Create","permission_join":"Join ({val})","permission_read":"Read ({val})","permission_write":"Write ({val})","permission_pres":"Get notified ({val})","permission_admin":"Approve ({val})","permission_share":"Share ({val})","permission_delete":"Delete ({val})","permission_owner":"Owner ({val})","title_permissions":"Permissions","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","image_caption_prompt":"Image caption","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"},"es":{"validate_credential_action":"confirmar","title_tag_manager":"Etiquetas (descubrimiento de usuarios)","label_user_contacts":"Contactos:","button_add_another":"Añadir contacto","label_message_sound":"Sonido de mensaje:","label_push_notifications":"Alertas de notificaciones:","label_push_notifications_disabled":"Alertas de notificaciones (requiere HTTPS):","label_incognito_mode":"Modo incógnito:","delete_account":"Eliminar cuenta","delete_account_arning":"¿Estás seguro de que deseas eliminar permanentemente tu cuenta? Esta acción es irreversible.","label_password":"Contraseña","password_unchanged_prompt":"Sin cambios","button_logout":"Cerrar sesión","button_delete_account":"Eliminar cuenta","label_default_access_mode":"Modo de acceso predeterminado:","blocked_contacts_link":"Contactos bloqueados ({count})","link_contact_us":"Contáctanos","link_terms_of_service":"Términos de uso","link_privacy_policy":"Política de privacidad","label_sdk":"SDK:","label_server_address":"Dirección del servidor:","archived_contacts":"Contactos archivados ({count})","contacts_not_found":"No tienes chats
¯∖_(ツ)_/¯","full_name_prompt":"Nombre completo, p.ej. Juan González Hernández","email_prompt":"Correo electrónico, p.ej. juan@example.com","button_sign_up":"Regístrate","label_your_name":"Tu nombre","label_user_id":"ID:","button_edit":"Editar","requested_permissions":"Solicitados","granted_permissions":"Otorgados","menu_item_edit_permissions":"Editar permisos","label_other_user":"Otros","action_clear_messages":"Borrar mensajes","clear_messages_warning":"¿Estás seguro de que quieres eliminar todos los mensajes? Esta acción es irreversible.","action_delete_messages":"Borrar mensajes para todos","delete_messages_warning":"¿Estás seguro de que quieres eliminar todos los mensajes para todos? Esta acción es irreversible.","action_leave_chat":"Dejar conversación","leave_chat_warning":"¿Estás seguro de que quieres dejar esta conversación?","action_block_contact":"Bloquear contacto","block_contact_warning":"¿Estás seguro de que quieres bloquear a este contacto?","action_report_chat":"Reportar conversación","report_chat_warning":"¿Estás seguro de que quieres bloquear y reportar a esta conversación?","title_info":"Información","label_topic_name":"Nombre del tema","label_private":"Comentario privado","private_editing_placeholder":"Sólo visible para tí","label_muting_topic":"Silenciado:","action_more":"Más","label_your_permissions":"Tus permisoss:","label_permissions":"Permisos:","label_you":"Tú:","label_default_access":"Modo de acceso predeterminado:","label_group_members":"Miembros del grupo:","button_add_members":"Añadir miembros","group_has_no_members":"No hay miembros","login_prompt":"Nombre de usuario","password_prompt":"Contraseña","stay_logged_in":"Permanecer conectado","forgot_password_link":"¿Olvidaste tu contraseña?","button_sign_in":"Entrar","label_client":"Cliente:","label_server":"Servidor:","online_now":"en línea","last_seen_timestamp":"Últ. vez","title_not_found":"No encontrado","unnamed_topic":"Sin nombre","messages_not_readable":"sin acceso a mensajes","peers_messaging_disabled":"La mensajería Peer está deshabilitada.","enable_peers_messaging":"Habilitar","search_for_contacts":"Usa la búsqueda para encontrar contactos","search_no_results":"La búsqueda no arrojó resultados","tabtitle_find_user":"encontrar","tabtitle_new_group":"nuevo grupo","tabtitle_group_by_id":"por ID","new_password_placeholder":"Introduzca una nueva contraseña","label_reset_password":"Enviar un correo electrónico de restablecimiento de contraseña:","credential_email_prompt":"Tu correo electrónico de registro","button_reset":"Restablecer","button_send_request":"Enviar petición","label_server_to_use":"Servidor para usar:","label_wire_transport":"Transporte de alambre:","button_update":"Actualizar","sidepanel_title_login":"Iniciar sesión","sidepanel_title_register":"Crear cuenta","sidepanel_title_settings":"Ajustes","sidepanel_title_account_settings":"Ajustes de la cuenta","sidepanel_title_acc_general":"General","sidepanel_title_acc_security":"Seguridad","sidepanel_title_acc_notifications":"Notificaciones","sidepanel_title_acc_support":"Soporte","sidepanel_title_newtpk":"Iniciar un nuevo chat","sidepanel_title_cred":"Confirmar credenciales","sidepanel_title_reset":"Restablecer contraseña","sidepanel_title_archive":"Chats archivados","sidepanel_title_blocked":"Chats bloqueados","update_available":"Actualización disponible.","reload_update":"Recargar","reconnect_countdown":"Desconectado. Reconectando en {seconds}…","reconnect_now":"Reintentar","push_init_failed":"Error al inicializar las notificaciones push","invalid_security_token":"Token de seguridad inválido","no_connection":"Sin conexión","code_doesnot_match":"El código no coincide","phone_dative":"teléfono","email_dative":"correo electrónico","enter_confirmation_code_prompt":"Intruduzca el código de confirmación enviado a tu {method}:","numeric_confirmation_code_prompt":"Sólo números","button_confirm":"Confirmar","save_attachment":"guardar","deleted_content":"este mensaje fue eliminado","invalid_content":"contenido inválido","user_not_found":"Usuario no encontrado","badge_you":"tú","badge_owner":"propietario","menu_item_info":"Información","menu_item_clear_messages":"Borrar mensajes","menu_item_clear_messages_for_all":"Borrar para todos","menu_item_delete":"Eliminar","menu_item_delete_for_all":"Eliminar para todos","menu_item_send_retry":"Inténtalo de nuevo","menu_item_mute":"Silenciar","menu_item_unmute":"Anular el silencio","menu_item_delete_topic":"Eliminar","topic_delete_warning":"¿Estás seguro de que quieres eliminar esta conversación?","menu_item_unblock":"Desbloquear","menu_item_block":"Bloquear","topic_block_warning":"¿Estás seguro de que quieres bloquear esta conversación","menu_item_member_delete":"Eliminar","menu_item_archive_topic":"Archivar","action_cancel":"cancelar","upload_finishing":"terminando...","no_contacts":"No tienes contactos :-(","contacts_not_found_short":"Ningún contacto coincide con \'\'{query}\'\'","title_group_members":"Miembros del grupo","title_all_contacts":"Todos los contactos","button_ok":"OK","button_cancel":"Cancelar","more_online_members":"+{overflow} más","download_action":"descargar","label_file_name":"Nombre del archivo:","label_content_type":"Tipo de contenido:","label_size":"Tamaño:","chat_invitation":"Estás invitado a participar en un nuevo chat. ¿Qué te gustaría hacer?","chat_invitation_accept":"Aceptar","chat_invitation_ignore":"Ignorar","chat_invitation_block":"Bloquear","error_invalid_id":"ID inválido","group_user_id_prompt":"ID del grupo o usuario","button_subscribe":"Suscribirse","topic_name_editing_placeholder":"Nombre del grupo","button_create":"Crear","permission_join":"Unirse ({val})","permission_read":"Leer ({val})","permission_write":"Escribir ({val})","permission_pres":"Ser notificado ({val})","permission_admin":"Approbar ({val})","permission_share":"Compartir ({val})","permission_delete":"Eliminar ({val})","permission_owner":"Propietario ({val})","title_permissions":"Permisos","message_sending":"enviando...","message_sending_failed":"no se pudo enviar el mensaje","search_placeholder":"Ej. email:alice@example.com, tel:17025550003...","messaging_disabled_prompt":"El envío de mensajes está deshabilitado","new_message_prompt":"Nuevo mensaje","image_caption_prompt":"Añade un comentario","file_attachment_too_large":"El tamaño del archivo {size} excede el límite de {limit}.","cannot_initiate_file_upload":"No se pudo iniciar la carga del archivo.","tags_not_found":"No hay etiquetas definidas. Añade unas.","tags_editor_no_tags":"Añadir etiquetas","title_manage_tags":"Gestionar","channel_prompt":"Este es un canal","channel":"canal"},"ko":{"validate_credential_action":"확인","title_tag_manager":"태그(사용자검색)","label_user_contacts":"연락처: ","button_add_another":"다른항목추가","label_message_sound":"메시지소리: ","label_push_notifications":"통지경보: ","label_push_notifications_disabled":"통지경보(HTTPS필요): ","label_incognito_mode":"시크릿모드: ","delete_account":"계정삭제","delete_account_arning":"계정을삭제하시겠습니까?실행취소할수없습니다.","label_password":"비밀번호","password_unchanged_prompt":"변경되지않음","button_logout":"로그아웃","button_delete_account":"계정삭제","label_default_access_mode":"기본액세스모드: ","blocked_contacts_link":"차단된연락처({수})","link_contact_us":"문의처","link_terms_of_service":"서비스약관","link_privacy_policy":"개인정보보호정책","label_sdk":"SDK:","label_server_address":"서버주소: ","archived_contacts":"보관된연락처({수})","contacts_not_found":"채팅이없습니다
¯∖_(ツ)_/¯","full_name_prompt":"전체이름(예:홍길동)","email_prompt":"이메일(예:hong@example.com)","button_sign_up":"가입","label_your_name":"이름","label_user_id":"ID:","button_edit":"편집","requested_permissions":"요청","menu_item_edit_permissions":"편집권한","label_other_user":"기타","action_clear_messages":"메시지지우기","clear_messages_warning":"모든메시지를지우시겠습니까?실행취소할수없습니다.","action_delete_messages":"모든메시지지우기","delete_messages_warning":"모든사람의모든메시지를삭제하시겠습니까?실행취소할수없습니다.","action_leave_chat":"대화나누기","leave_chat_warning":"이대화를나가시겠습니까?","action_block_contact":"연락차단","block_contact_warning":"이연락처를차단하시겠습니까?","action_report_chat":"대화기록","report_chat_warning":"이대화를차단하고기록하시겠습니까?","title_info":"정보","label_topic_name":"이름","label_private":"개인코멘트","private_editing_placeholder":"나만볼수있습니다","label_muting_topic":"음소거: ","action_more":"더보기","label_your_permissions":"권한: ","label_permissions":"권한: ","label_you":"당신: ","label_default_access":"기본액세스모드: ","label_group_members":"그룹회원: ","button_add_members":"회원추가","group_has_no_members":"회원없음","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":"이름없는","peers_messaging_disabled":"동료의메시지가비활성화되었습니다.","enable_peers_messaging":"활성화","search_for_contacts":"검색을사용하여연락처찾기","search_no_results":"검색결과가없습니다","tabtitle_find_user":"찾기","tabtitle_new_group":"새그룹","tabtitle_group_by_id":"id로","new_password_placeholder":"새비밀번호입력","label_reset_password":"비밀번호재설정이메일보내기: ","credential_email_prompt":"등록이메일","button_reset":"재설정","button_send_request":"요청보내기","label_server_to_use":"사용할서버:","label_wire_transport":"와이어수송:","button_update":"업데이트","sidepanel_title_login":"로그인","sidepanel_title_register":"계정만들기","sidepanel_title_settings":"설정","sidepanel_title_account_settings":"계정설정","sidepanel_title_acc_general":"일반","sidepanel_title_acc_security":"보안","sidepanel_title_acc_notifications":"알림","sidepanel_title_acc_support":"지원","sidepanel_title_newtpk":"새채팅시작","sidepanel_title_cred":"자격증명확인","sidepanel_title_reset":"비밀번호재설정","sidepanel_title_archive":"보관된채팅","sidepanel_title_blocked":"차단된채팅","update_available":"업데이트가능.","reload_update":"재로드","reconnect_countdown":"연결이끊어졌습니다.다시연결하는중{초}…","reconnect_now":"지금시도","push_init_failed":"푸시알림을초기화하지못했습니다","invalid_security_token":"유효하지않은보안토큰","no_connection":"연결없음","code_doesnot_match":"코드가일치하지않습니다","phone_dative":"전화","email_dative":"이메일","enter_confirmation_code_prompt":"{방법}으로보낸확인코드를입력하십시오:","numeric_confirmation_code_prompt":"숫자만","button_confirm":"확인","save_attachment":"저장","invalid_content":"잘못된내용","user_not_found":"찾을수없음","badge_you":"당신","badge_owner":"소유자","menu_item_info":"정보","menu_item_clear_messages":"메시지지우기","menu_item_clear_messages_for_all":"모두지우기","menu_item_delete":"삭제","menu_item_delete_for_all":"모두삭제","menu_item_send_retry":"다시시도","menu_item_mute":"음소거","menu_item_unmute":"음소거해제","menu_item_delete_topic":"삭제","topic_delete_warning":"이대화를삭제하시겠습니까?","menu_item_unblock":"차단해제","menu_item_block":"차단","topic_block_warning":"이대화를차단하시겠습니까?","menu_item_member_delete":"제거","menu_item_archive_topic":"보관","action_cancel":"취소","upload_finishing":"마무리...","no_contacts":"연락처가없습니다 (._.)","contacts_not_found_short":"\'{문의}\'와일치하는연락처가없습니다.","title_group_members":"그룹구성원","title_all_contacts":"모든연락처","button_ok":"OK","button_cancel":"취소","more_online_members":"+{넘침}더보기","download_action":"다운로드","label_file_name":"파일이름: ","label_content_type":"컨텐츠유형: ","label_size":"크기: ","chat_invitation":"새로운대화를시작하도록초대되었습니다.무엇을하시겠습니까?","chat_invitation_accept":"수락","chat_invitation_ignore":"무시","chat_invitation_block":"차단","error_invalid_id":"잘못된ID","group_user_id_prompt":"그룹또는사용자ID","button_subscribe":"구독","topic_name_editing_placeholder":"그룹의자유형이름","button_create":"작성","permission_join":"참여({val})","permission_read":"읽기({val})","permission_write":"쓰기({val})","permission_pres":"알림받기({val})","permission_admin":"승인({val})","permission_share":"공유({val})","permission_delete":"삭제({val})","permission_owner":"소유자({val})","title_permissions":"권한","message_sending":"보내기...","message_sending_failed":"실패","search_placeholder":"email:alice@example.com,tel:17025550003...와같은목록","messaging_disabled_prompt":"메시지비활성화","new_message_prompt":"새메시지","image_caption_prompt":"이미지설명","file_attachment_too_large":"파일크기{크기}이(가){제한}제한을초과합니다.","cannot_initiate_file_upload":"파일업로드를시작할수없습니다.","tags_not_found":"태그가정의되지않았습니다.일부를추가하십시오.","tags_editor_no_tags":"일부태그추가","title_manage_tags":"관리","granted_permissions":"승낙하다","messages_not_readable":"메시지에 액세스 할 수 없습니다","deleted_content":"내용이 삭제되었습니다","channel_prompt":"이 채널입니다","channel":"채널"},"ro":{"validate_credential_action":"confirmă","title_tag_manager":"Tag-uri (user discovery)","label_user_contacts":"Contacte:","button_add_another":"Adaugă","label_message_sound":"Sunet de mesaj:","label_push_notifications":"Alerte de notificare:","label_push_notifications_disabled":"Alerte de notificare (necesită HTTPS):","label_incognito_mode":"Mod incognito:","delete_account":"Șterge contul","delete_account_arning":"Ești sigur că dorești să ștergi contul? Acesta nu va putea fi recuperat.","label_password":"Parola","password_unchanged_prompt":"Neschimbată","button_logout":"Deconectare","button_delete_account":"Șterge cont","label_default_access_mode":"Default access mode:","blocked_contacts_link":"Contact blocate ({count})","link_contact_us":"Contactează-ne","link_terms_of_service":"Termenii Serviciului","link_privacy_policy":"Politica de Confidențialitate","label_sdk":"SDK:","label_server_address":"Adresa serverului:","archived_contacts":"Contacte arhivate ({count})","contacts_not_found":"Nu ai contacte salvate
¯∖_(ツ)_/¯","full_name_prompt":"Numele tău","email_prompt":"Adresa de e-mail","button_sign_up":"Creează cont","label_your_name":"Numele tău","label_user_id":"ID:","button_edit":"Editează","requested_permissions":"Necesare","granted_permissions":"Oferite","menu_item_edit_permissions":"Editează permisiuni","label_other_user":"Altele","action_clear_messages":"Șterge mesajele","clear_messages_warning":"Ești sigur că dorești să ștergi mesajele? Acestea nu pot fi recuperate.","action_delete_messages":"Șterge toate mesajele","delete_messages_warning":"Ești sigur că dorești să șterge mesajele din toate conversațiile? Acestea nu pot fi recuperate.","action_leave_chat":"Ieși din conversație","leave_chat_warning":"Ești sigur că dorești să ieși din conersație?","action_block_contact":"Blochează contact","block_contact_warning":"Ești sigur că dorești să blochezi acest contact?","action_report_chat":"Raportează conversația","report_chat_warning":"Ești sigur că dorești să blochezi și să raportezi această conversație?","title_info":"Info","label_topic_name":"Nume","label_private":"Comentariu privat","private_editing_placeholder":"Vizibil doar ție","label_muting_topic":"Mod silențios (muted):","action_more":"Mai multe","label_your_permissions":"Permisiuniile tale:","label_permissions":"Permisiuni:","label_you":"Tu:","label_default_access":"Modul default:","label_group_members":"Membrii grupului:","button_add_members":"Adaugă persoane","group_has_no_members":"În acest grup nu se află persoane","login_prompt":"Conectează-te","password_prompt":"Parola","stay_logged_in":"Rămâi conectat","forgot_password_link":"Ți-ai uitat parola?","button_sign_in":"Conectează-te","label_client":"Client:","label_server":"Server:","online_now":"online acum","last_seen_timestamp":"Văzut ultima dată","title_not_found":"Nu a fost găsit","channel":"canal","unnamed_topic":"Nedenumit","messages_not_readable":"Mesajele nu pot fi citite","peers_messaging_disabled":"Mesageria de tip Peer este dezactivată.","enable_peers_messaging":"Activează","search_for_contacts":"Caută în contacte","search_no_results":"Nu s-au găsit rezultate","tabtitle_find_user":"caută","tabtitle_new_group":"grup nou","tabtitle_group_by_id":"după id","new_password_placeholder":"Introdu parolă","label_reset_password":"Resetează parola:","credential_email_prompt":"Adresa de e-mail","button_reset":"Resetează","button_send_request":"Trimite cerere","label_server_to_use":"Server de utilizat:","label_wire_transport":"Transportul legat:","button_update":"Actualizează","sidepanel_title_login":"Conectează-te","sidepanel_title_register":"Creează Cont","sidepanel_title_settings":"Setări","sidepanel_title_account_settings":"Setările Contului","sidepanel_title_acc_general":"Generale","sidepanel_title_acc_security":"Securitate","sidepanel_title_acc_notifications":"Notificări","sidepanel_title_acc_support":"Ajutor","sidepanel_title_newtpk":"Creeză un nou Chat","sidepanel_title_cred":"Confirmă credențiale","sidepanel_title_reset":"Resetează Parola","sidepanel_title_archive":"Conversații Arhivate","sidepanel_title_blocked":"Conversații Blocate","reconnect_countdown":"Deconectat. Se încearcă conectarea în {seconds}…","reconnect_now":"Încearcă din nou","push_init_failed":"Nu s-a reușit inițializarea tip push notifications","invalid_security_token":"Codul de securitate este invalid","no_connection":"Nu există conexiune","code_doesnot_match":"Codul furnizat nu este valid","update_available":"Actualizare disponibilă.","reload_update":"Reîncarcă","phone_dative":"telefon","email_dative":"email","enter_confirmation_code_prompt":"Introu codul de confirmare trimis pe {method}:","numeric_confirmation_code_prompt":"Doar cifre","button_confirm":"Confirmă","save_attachment":"salvează","deleted_content":"conținut șters","invalid_content":"conținut invalid","user_not_found":"Utilizatorul nu a fost găsit","badge_you":"tu","badge_owner":"owner","menu_item_info":"Info","menu_item_clear_messages":"Șterge mesajele","menu_item_clear_messages_for_all":"Ștergele pe toate","menu_item_delete":"Șterge","menu_item_delete_for_all":"Ștergele pe toate","menu_item_send_retry":"Reîncearcă","menu_item_mute":"Mute","menu_item_unmute":"Unmute","menu_item_delete_topic":"Șterge","topic_delete_warning":"Ești sigur că dorești să șterge această conversație?","menu_item_unblock":"Deblochează","menu_item_block":"Blochează","topic_block_warning":"Ești sigur că dorești să blochezi această conversație?","menu_item_member_delete":"Șterge persoană","menu_item_archive_topic":"Arhivează","action_cancel":"anulează","upload_finishing":"se încarcă...","no_contacts":"Nu ai contacte adăugate :-(","contacts_not_found_short":"Niciun contact găsit după criteriile \'\'{query}\'\'","title_group_members":"Persoanele din grup","title_all_contacts":"Toate Contactele","button_ok":"OK","button_cancel":"Anulează","more_online_members":"+{overflow} mai mult","download_action":"download","label_file_name":"Nume fișier:","label_content_type":"Tip conținut:","label_size":"Size:","chat_invitation":"Ai primit invitație într-o conversație. Accepți?","chat_invitation_accept":"Da, accept","chat_invitation_ignore":"Ignoră","chat_invitation_block":"Blochează","error_invalid_id":"ID Invalid","group_user_id_prompt":"Grup sau user ID","button_subscribe":"Subscribe","topic_name_editing_placeholder":"Numele grupului","channel_prompt":"Acesta este un canal","button_create":"Creează","permission_join":"Participare ({val})","permission_read":"Citire ({val})","permission_write":"Scriere ({val})","permission_pres":"Notificare ({val})","permission_admin":"Aprobare ({val})","permission_share":"Distribuire ({val})","permission_delete":"Ștergere ({val})","permission_owner":"Deținător ({val})","title_permissions":"Permisiuni","message_sending":"se trimite...","message_sending_failed":"eroare","search_placeholder":"Caută după e-mail sau număr telefon...","messaging_disabled_prompt":"Mesageria este dezactivată","new_message_prompt":"Mesaj nou","image_caption_prompt":"Titlul imaginii","file_attachment_too_large":"Dimensiunea fișiterului {size} depășește limita de {limit}.","cannot_initiate_file_upload":"Nu se poate face încărcarea.","tags_not_found":"Niciun tag definit. Adaugă.","tags_editor_no_tags":"Adaugă tag-uri","title_manage_tags":"Administrează"},"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":"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_account_settings":"Настройки аккаунта","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":"Ошибка загрузки файла.","search_for_contacts":"Поиск контактов","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":"Размер:","phone_dative":"телефону","email_dative":"емейлу","title_group_members":"Участники","download_action":"скачать","permission_join":"Подписываться ({val})","permission_read":"Читать ({val})","permission_write":"Писать ({val})","permission_pres":"Уведомлять ({val})","permission_admin":"Подтверждать ({val})","permission_share":"Приглашать ({val})","permission_delete":"Удалять ({val})","permission_owner":"Владелец ({val})","title_permissions":"Права доступа","requested_permissions":"Требуются","granted_permissions":"Получены","menu_item_edit_permissions":"Права доступа","label_other_user":"Второй","label_topic_name":"Название","label_private":"Комментарий","private_editing_placeholder":"Виден только вам","label_muting_topic":"Без уведомлений","action_more":"Ещё","label_your_permissions":"Ваши права доступа:","label_permissions":"Права доступа:","label_you":"Вы:","label_default_access":"Права по умолчанию:","label_group_members":"Участники чата:","button_add_members":"Добавить","group_has_no_members":"Нет участников","action_leave_chat":"Уйти из чата","menu_item_info":"Информация","menu_item_clear_messages":"Удалить сообщения","menu_item_clear_messages_for_all":"Удалить для всех","menu_item_delete":"Удалить","menu_item_delete_for_all":"Удалить для всех","menu_item_send_retry":"Отправить заново","menu_item_mute":"Не уведомлять","menu_item_unmute":"Уведомлять","menu_item_delete_topic":"Удалить чат","menu_item_unblock":"Разблокировать","menu_item_block":"Заблокировать","menu_item_member_delete":"Отписать","title_info":"Подробности","new_password_placeholder":"Введите новый пароль","label_reset_password":"Отправить емейл для смены пароля:","credential_email_prompt":"Регистрационный емейл","button_reset":"Изменить","button_send_request":"Отправить","action_cancel":"отменить","upload_finishing":"завершение...","no_contacts":"Ничего нет :-(","contacts_not_found_short":"Нет контактов для запроса \'\'{query}\'\'","title_all_contacts":"Все контакты","error_invalid_id":"Неверный ID","group_user_id_prompt":"ID чата или пользователя","button_subscribe":"Подписаться","topic_name_editing_placeholder":"Название чата","button_create":"Создать","badge_you":"вы","badge_owner":"влад.","update_available":"Есть новая версия приложения.","reload_update":"Обновить","user_not_found":"Не найден","reconnect_countdown":"Нет связи. Подключение через {seconds}…","reconnect_now":"Подключить сейчас.","save_attachment":"сохранить","menu_item_archive_topic":"В архив","archived_contacts":"Чаты в архиве ({count})","sidepanel_title_archive":"Архив чатов","chat_invitation":"Вас пригласили начать новый чат. Как вы хотите поступить?","chat_invitation_accept":"Принять","chat_invitation_ignore":"Игнорировать","chat_invitation_block":"Заблокировать","peers_messaging_disabled":"Чат заблокирован у корреспондента.","enable_peers_messaging":"Разблокировать.","more_online_members":"+еще {overflow}","label_user_contacts":"Конакты:","validate_credential_action":"подтвердить","link_contact_us":"Связаться с нами","link_terms_of_service":"Условия сервиса","link_privacy_policy":"Политика конфиденциальности","action_delete_messages":"Удалить сообщения","action_block_contact":"Заблокировать контакт","action_report_chat":"Сообщить о нарушении","delete_messages_warning":"Вы действительно хотите удалить все сообщения?","leave_chat_warning":"Вы действительно хотите покинуть этот чат?","block_contact_warning":"Вы действительно заблокировать этот контакт?","report_chat_warning":"Вы действительно хотите сообщить о нарушении и заблокировать этот чат?","action_clear_messages":"Удалить сообщения","clear_messages_warning":"Вы действительно хотите удалить все сообщения в чате? Их будет невозможно восстановить.","topic_delete_warning":"Вы действительно хотите удалить этот чат?","topic_block_warning":"Вы действительно хотите заблокировать этот чат?","search_no_results":"Ничего не найдено","deleted_content":"удалено","image_caption_prompt":"Подпись к фото","label_incognito_mode":"Режим инкогнито:","delete_account":"Удалить аккаунт","delete_account_arning":"Вы уверены, что ходите удалить свой аккаунт? Его невозможно будет восстановить.","button_delete_account":"Удалить аккаунт","sidepanel_title_acc_security":"Безопасность","sidepanel_title_acc_notifications":"Уведомления","sidepanel_title_acc_support":"Поддержка","label_sdk":"SDK:","label_server_address":"Адрес сервера:","button_edit":"Редактировать","button_add_another":"Добавить","sidepanel_title_acc_general":"Общие настройки","blocked_contacts_link":"Заблокированные ({count})","sidepanel_title_blocked":"Заблокированные чаты","push_init_failed":"Ошибка инициализации пуш уведомлений","invalid_security_token":"Токен некорректен","no_connection":"Нет связи","code_doesnot_match":"Код не совпадает","channel_prompt":"Создать канал","channel":"канал"},"zh":{"archived_contacts":"已归档联系人 ({count})","contacts_not_found":"你尚无会话
¯∖_(ツ)_/¯","full_name_prompt":"全名,例如张伟","email_prompt":"电子邮件,例如 zhang@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":"登出","requested_permissions":"已请求","granted_permissions":"已授予","menu_item_edit_permissions":"编辑权限","label_other_user":"其他","title_info":"信息","label_topic_name":"名称","label_private":"私人评论","private_editing_placeholder":"仅自己可见","label_muting_topic":"已静音:","action_more":"更多","label_your_permissions":"你的权限:","label_permissions":"权限:","label_you":"你:","label_default_access":"默认权限模式:","label_group_members":"群组成员:","button_add_members":"添加成员","group_has_no_members":"无成员","action_leave_chat":"离开","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":"无消息访问权限","peers_messaging_disabled":"成员间消息已禁用。","enable_peers_messaging":"启用","tabtitle_find_user":"搜索","tabtitle_new_group":"新群组","tabtitle_group_by_id":"通过 id","search_for_contacts":"使用搜索寻找联系人","new_password_placeholder":"输入新密码","label_reset_password":"发送密码重置邮件:","credential_email_prompt":"你的注册邮箱","button_reset":"重置","button_send_request":"发送请求","label_server_to_use":"使用的服务器:","label_wire_transport":"线路传输:","button_update":"更新","sidepanel_title_login":"登录","sidepanel_title_register":"创建账户","sidepanel_title_settings":"设置","sidepanel_title_account_settings":"帐号设定","sidepanel_title_newtpk":"开始新会话","sidepanel_title_cred":"确认凭据","sidepanel_title_reset":"重置密码","sidepanel_title_archive":"已存档会话","update_available":"更新可用。","reload_update":"重新载入","reconnect_countdown":"连接已断开。{seconds} 秒后重新连接…","reconnect_now":"立即尝试","phone_dative":"电话","email_dative":"电子邮件","enter_confirmation_code_prompt":"输入通过{method}发送的验证码:","numeric_confirmation_code_prompt":"仅数字","button_confirm":"确认","save_attachment":"保存","invalid_content":"无效内容","user_not_found":"未找到","badge_you":"你","badge_owner":"所有者","menu_item_info":"信息","menu_item_clear_messages":"清空消息","menu_item_clear_messages_for_all":"全部清除","menu_item_delete":"删除","menu_item_delete_for_all":"全部删除","menu_item_mute":"静音","menu_item_unmute":"取消静音","menu_item_delete_topic":"删除","menu_item_unblock":"取消屏蔽","menu_item_block":"屏蔽","menu_item_member_delete":"移除","menu_item_archive_topic":"归档","action_cancel":"取消","upload_finishing":"正在结束...","no_contacts":"你尚无联系人 (._.)","contacts_not_found_short":"无联系人匹配\'\'{query}\'\'","title_group_members":"群组成员","title_all_contacts":"全部联系人","button_ok":"好","button_cancel":"取消","download_action":"下载","label_file_name":"文件名:","label_content_type":"内容类型:","label_size":"大小:","chat_invitation":"你受邀开始新会话。你想怎么做?","chat_invitation_accept":"接受","chat_invitation_ignore":"忽略","chat_invitation_block":"屏蔽","error_invalid_id":"无效 ID","group_user_id_prompt":"群组或用户 ID","button_subscribe":"订阅","topic_name_editing_placeholder":"群组自由格式名称","button_create":"创建","permission_join":"加入 ({val})","permission_read":"读取 ({val})","permission_write":"写入 ({val})","permission_pres":"获取通知 ({val})","permission_admin":"批准 ({val})","permission_share":"分享 ({val})","permission_delete":"删除 ({val})","permission_owner":"所有者 ({val})","title_permissions":"权限","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":"无法初始化文件上传。","tags_not_found":"尚未定义标签。添加一些。","tags_editor_no_tags":"添加一些标签","title_manage_tags":"管理标签","more_online_members":"还有{overflow}个","label_user_contacts":"往来:","validate_credential_action":"确认","link_contact_us":"联系我们","link_terms_of_service":"条款和条件","link_privacy_policy":"隐私政策","action_delete_messages":"删除所有帖子","action_block_contact":"屏蔽联系人","delete_messages_warning":"您确定要删除所有消息吗?无法撤消。","leave_chat_warning":"您确定要退出此对话吗?","block_contact_warning":"您确定要阻止此联系人吗?","action_report_chat":"检举垃圾邮件","report_chat_warning":"您确定要停止并报告此对话吗?","action_clear_messages":"删除讯息","clear_messages_warning":"您确定要清除所有消息吗?无法撤消。","topic_delete_warning":"您确定要删除此对话吗?","topic_block_warning":"您确定要阻止此对话吗?","search_no_results":"搜索返回任何结果","deleted_content":"内容已删除","image_caption_prompt":"图片标题","menu_item_send_retry":"重试","label_incognito_mode":"无痕模式:","delete_account":"删除帐户","delete_account_arning":"您确定要删除您的帐户吗?无法撤消。","button_delete_account":"删除帐户","sidepanel_title_acc_security":"安全","sidepanel_title_acc_notifications":"通知","sidepanel_title_acc_support":"支持","label_sdk":"开发包:","label_server_address":"服务器地址:","button_edit":"编辑","button_add_another":"加上另一个","sidepanel_title_acc_general":"常用设定","blocked_contacts_link":"封锁的联络人 ({count})","sidepanel_title_blocked":"被阻止的聊天","push_init_failed":"初始化推送通知失败","invalid_security_token":"无效的安全令牌","no_connection":"无连接","code_doesnot_match":"代码不匹配","channel_prompt":"这是一个频道","channel":"频道"}}')},react:function(e){e.exports=React},"react-dom":function(e){e.exports=ReactDOM},"react-intl":function(e){e.exports=ReactIntl},"tinode-sdk":function(e){e.exports=Tinode},"firebase/app":function(e){e.exports=firebase},"firebase/messaging":function(e){e.exports=firebase.messaging}},t={};function s(a){if(t[a])return t[a].exports;var n=t[a]={exports:{}};return e[a](n,n.exports,s),n.exports}s.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return s.d(t,{a:t}),t},s.d=function(e,t){for(var a in t)s.o(t,a)&&!s.o(e,a)&&Object.defineProperty(e,a,{enumerable:!0,get:t[a]})},s.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},s.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},s("./src/index.js")}(); //# sourceMappingURL=index.dev.js.map \ No newline at end of file diff --git a/umd/index.dev.js.map b/umd/index.dev.js.map index 283228d2..9833c0bc 100644 --- a/umd/index.dev.js.map +++ b/umd/index.dev.js.map @@ -1 +1 @@ -{"version":3,"sources":["webpack://tinode-webapp/./src/config.js","webpack://tinode-webapp/./src/index.js","webpack://tinode-webapp/./src/lib/blob-helpers.js","webpack://tinode-webapp/./src/lib/host-name.js","webpack://tinode-webapp/./src/lib/local-storage.js","webpack://tinode-webapp/./src/lib/navigation.js","webpack://tinode-webapp/./src/lib/strformat.js","webpack://tinode-webapp/./src/lib/utils.js","webpack://tinode-webapp/./src/version.js","webpack://tinode-webapp/./src/views/acc-general-view.jsx","webpack://tinode-webapp/./src/views/acc-notifications-view.jsx","webpack://tinode-webapp/./src/views/acc-security-view.jsx","webpack://tinode-webapp/./src/views/acc-support-view.jsx","webpack://tinode-webapp/./src/views/contacts-view.jsx","webpack://tinode-webapp/./src/views/create-account-view.jsx","webpack://tinode-webapp/./src/views/edit-account-view.jsx","webpack://tinode-webapp/./src/views/info-view.jsx","webpack://tinode-webapp/./src/views/login-view.jsx","webpack://tinode-webapp/./src/views/logo-view.jsx","webpack://tinode-webapp/./src/views/messages-view.jsx","webpack://tinode-webapp/./src/views/new-topic-view.jsx","webpack://tinode-webapp/./src/views/password-reset-view.jsx","webpack://tinode-webapp/./src/views/settings-view.jsx","webpack://tinode-webapp/./src/views/sidepanel-view.jsx","webpack://tinode-webapp/./src/views/tinode-web.jsx","webpack://tinode-webapp/./src/views/validation-view.jsx","webpack://tinode-webapp/./src/widgets/alert.jsx","webpack://tinode-webapp/./src/widgets/attachment.jsx","webpack://tinode-webapp/./src/widgets/avatar-upload.jsx","webpack://tinode-webapp/./src/widgets/button-back.jsx","webpack://tinode-webapp/./src/widgets/chat-message.jsx","webpack://tinode-webapp/./src/widgets/checkbox.jsx","webpack://tinode-webapp/./src/widgets/chip-input.jsx","webpack://tinode-webapp/./src/widgets/chip.jsx","webpack://tinode-webapp/./src/widgets/contact-action.jsx","webpack://tinode-webapp/./src/widgets/contact-badges.jsx","webpack://tinode-webapp/./src/widgets/contact-list.jsx","webpack://tinode-webapp/./src/widgets/contact.jsx","webpack://tinode-webapp/./src/widgets/context-menu.jsx","webpack://tinode-webapp/./src/widgets/doc-preview.jsx","webpack://tinode-webapp/./src/widgets/error-panel.jsx","webpack://tinode-webapp/./src/widgets/file-progress.jsx","webpack://tinode-webapp/./src/widgets/group-manager.jsx","webpack://tinode-webapp/./src/widgets/group-subs.jsx","webpack://tinode-webapp/./src/widgets/host-selector.jsx","webpack://tinode-webapp/./src/widgets/image-preview.jsx","webpack://tinode-webapp/./src/widgets/in-place-edit.jsx","webpack://tinode-webapp/./src/widgets/invitation.jsx","webpack://tinode-webapp/./src/widgets/letter-tile.jsx","webpack://tinode-webapp/./src/widgets/load-spinner.jsx","webpack://tinode-webapp/./src/widgets/menu-cancel.jsx","webpack://tinode-webapp/./src/widgets/menu-contacts.jsx","webpack://tinode-webapp/./src/widgets/menu-start.jsx","webpack://tinode-webapp/./src/widgets/more-button.jsx","webpack://tinode-webapp/./src/widgets/new-topic-by-id.jsx","webpack://tinode-webapp/./src/widgets/new-topic-group.jsx","webpack://tinode-webapp/./src/widgets/permissions-editor.jsx","webpack://tinode-webapp/./src/widgets/received-marker.jsx","webpack://tinode-webapp/./src/widgets/search-contacts.jsx","webpack://tinode-webapp/./src/widgets/send-message.jsx","webpack://tinode-webapp/./src/widgets/side-navbar.jsx","webpack://tinode-webapp/./src/widgets/tag-manager.jsx","webpack://tinode-webapp/./src/widgets/unread-badge.jsx","webpack://tinode-webapp/./src/widgets/uploading-image.jsx","webpack://tinode-webapp/./src/widgets/visible-password.jsx","webpack://tinode-webapp/external \"React\"","webpack://tinode-webapp/external \"ReactDOM\"","webpack://tinode-webapp/external \"ReactIntl\"","webpack://tinode-webapp/external \"Tinode\"","webpack://tinode-webapp/external \"firebase\"","webpack://tinode-webapp/external [\"firebase\",\"messaging\"]","webpack://tinode-webapp/webpack/bootstrap","webpack://tinode-webapp/webpack/runtime/compat get default export","webpack://tinode-webapp/webpack/runtime/define property getters","webpack://tinode-webapp/webpack/runtime/hasOwnProperty shorthand","webpack://tinode-webapp/webpack/runtime/make namespace object","webpack://tinode-webapp/webpack/startup"],"names":["APP_NAME","PACKAGE_VERSION","API_KEY","KNOWN_HOSTS","hosted","local","DEFAULT_HOST","LOGGING_ENABLED","KEYPRESS_DELAY","RECEIVED_DELAY","READ_DELAY","MIN_TAG_LENGTH","MAX_TAG_LENGTH","MAX_TAG_COUNT","DEFAULT_P2P_ACCESS_MODE","NEW_GRP_ACCESS_MODE","CHANNEL_ACCESS_MODE","NO_ACCESS_MODE","MEDIA_BREAKPOINT","REM_SIZE","AVATAR_SIZE","BROKEN_IMAGE_SIZE","MESSAGES_PAGE","MAX_INBAND_ATTACHMENT_SIZE","MAX_EXTERN_ATTACHMENT_SIZE","MAX_IMAGE_DIM","IMAGE_PREVIEW_DIM","MAX_ONLINE_IN_TOPIC","MAX_TITLE_LENGTH","LINK_CONTACT_US","LINK_PRIVACY_POLICY","LINK_TERMS_OF_SERVICE","params","HashNavigation","window","location","hash","language","hl","navigator","languages","userLanguage","baseLanguage","toLowerCase","split","messages","allMessages","ReactDOM","IntlProvider","locale","textComponent","React","document","getElementById","SUPPORTED_IMAGE_FORMATS","MIME_EXTENSIONS","makeImageUrl","photo","type","data","fitImageSize","width","height","maxWidth","maxHeight","forceSquare","Math","min","scale","size","dstWidth","dstHeight","srcWidth","srcHeight","xoffset","yoffset","fileNameForMime","fname","mime","idx","indexOf","ext","at","lastIndexOf","substring","imageScaled","fileOrBlob","maxSize","onSuccess","onError","img","Image","crossOrigin","onerror","err","onload","async","URL","revokeObjectURL","src","dim","this","canvas","createElement","ctx","getContext","imageSmoothingEnabled","drawImage","blob","Promise","resolve","toBlob","length","clearRect","name","createObjectURL","fileToBase64","file","reader","FileReader","addEventListener","result","readAsDataURL","blobToBase64","filePasted","event","onImageSuccess","onAttachmentSuccess","items","clipboardData","originalEvent","i","item","kind","getAsFile","console","log","imageFileScaledToBase64","imageFileToBase64","getMimeType","header","exec","base64EncodedLen","n","floor","base64DecodedLen","base64ReEncode","str","replace","btoa","atob","detectServerAddress","host","protocol","hostname","port","isSecureConnection","isLocalHost","LocalStorageUtil","key","value","localStorage","setItem","JSON","stringify","getItem","parse","oldVal","getObject","setObject","Object","assign","removeItem","parts","path","substr","forEach","part","decodeURIComponent","url","join","args","hasOwnProperty","push","parsed","parseUrlHash","composeUrlHash","sidepanel","topic","info","shortDateFormat","then","now","Date","getFullYear","getMonth","getDate","toLocaleTimeString","hour12","hour","minute","toLocaleDateString","month","day","year","secondsToTime","seconds","sec","bytesToHumanSize","bytes","sizes","bucket","log2","count","pow","round","toFixed","stringHash","charCodeAt","updateFavicon","oldIcon","head","getElementsByTagName","newIcon","id","rel","href","removeChild","appendChild","title","vcard","fn","imageDataUrl","card","trim","dataStart","arrayEqual","a","b","Array","isArray","sort","l","asPhone","val","test","asEmail","isUrlRelative","sanitizeUrl","allowedSchemes","schemes","RegExp","sanitizeImageUrl","sanitizedUrl","AccGeneralView","constructor","props","super","me","tinode","getMeTopic","state","fullName","public","undefined","avatar","tags","credentials","getCredentials","addCredActive","addCredInvalid","newCred","previousOnTags","onTagsUpdated","tnNewTags","bind","tnCredsUpdated","handleFullNameUpdate","handleImageChanged","handleCredChange","handleCredKeyDown","handleCredEntered","handleTagsUpdated","componentDidMount","onCredsUpdated","componentWillUnmount","setState","creds","onUpdateAccount","Tinode","e","target","keyCode","method","onCredAdd","slice","onUpdateTags","render","map","cred","meth","done","onClick","preventDefault","onCredConfirm","FormattedMessage","defaultMessage","description","onCredDelete","className","full_name_placeholder","placeholder","onFinished","uid","myUserId","onImageChanged","title_tag_manager","activated","onSubmit","required","autoFocus","onChange","onKeyDown","onBlur","EditAccountView","handleCheckboxClick","what","checked","onToggleMessageSounds","onTogglePushNotifications","onToggleIncognitoMode","htmlFor","messageSounds","desktopAlertsEnabled","desktopAlerts","incognitoMode","defineMessages","delete_account","delete_account_warning","AccSecurityView","blockedCount","contacts","c","acs","isJoiner","defacs","getDefaultAccess","auth","anon","showPermissionEditorFor","handlePasswordUpdate","handleLaunchPermissionsEditor","handleHidePermissionsEditor","handlePermissionsChanged","handleDeleteAccount","pwd","password","which","editedPermissions","perm","newState","formatMessage","intl","onShowAlert","onDeleteAccount","mode","skip","onCancel","password_unchanged","onLogout","onShowBlocked","values","injectIntl","AccSupportView","serverVersion","serverAddress","archived_contacts_title","ContactsView","handleAction","deriveStateFromProps","unreadThreads","archivedCount","chatList","blocked","private","arch","archive","unread","touched","action","contactList","componentDidUpdate","prevProps","prevState","action_ignored","onShowArchive","no_contacts","connected","emptyListMessage","topicSelected","showOnline","showUnread","onTopicSelected","showContextMenu","onAction","CreateAccountView","login","email","errorCleared","saveToken","handleLoginChange","handlePasswordChange","handleEmailChange","handleFnChange","handleToggleSaveToken","handleSubmit","onCreateAccount","submitClasses","disabled","login_prompt","autoComplete","password_prompt","full_name_prompt","email_prompt","stay_logged_in","readOnly","owner","onBasicNavigate","requested","granted","edit_permissions","other_user","clear_messages","clear_messages_warning","delete_messages","delete_messages_warning","leave_chat","leave_chat_warning","block_contact","block_contact_warning","report_chat","report_chat_warning","InfoView","admin","sharer","deleter","muted","address","groupTopic","channel","selectedContact","access","modeGiven","modeWant","modeGiven2","modeWant2","showMemberPanel","moreInfoExpanded","previousMetaDesc","previousSubsUpdated","previousTagsUpdated","resetSubs","resetDesc","onMetaDesc","onSubsUpdated","handlePrivateUpdate","handleMuted","handleShowAddMembers","handleHideAddMembers","handleMemberUpdateRequest","handleDeleteMessages","handleLeave","handleBlock","handleReport","handleMemberSelected","handleMoreInfo","handleContextMenu","getTopic","getType","user2","subscriber","getGiven","getWant","subscribers","sub","getAccessMode","isOwner","isAdmin","isSharer","isDeleter","isMuted","comment","isChannel","getMode","getMeta","startMetaQuery","withTags","build","desc","subs","onTopicDescUpdate","ignored","onChangePermissions","userPermissionsEdited","toEdit","toCompare","toSkip","titleEdit","titleCompare","userTitle","userAvatar","user","userPermissionsTitle","userPermissionsAvatar","immutablePermissions","editedPermissionsTitle","immutablePermissionsTitle","editedPermissionsSkipped","onInitFind","members","added","removed","onMemberUpdateRequest","onDeleteMessages","onLeaveTopic","onBlockTopic","onReportTopic","open","onTopicTagsUpdate","instance","topicName","menuItems","handler","x","y","displayMobile","level","errorLevel","text","errorText","onClearError","requiredMember","keepInitialMembers","searchableContacts","compare","modeTitle","compareTitle","private_placeholder","more","onToggle","no_members","showMode","noScroll","LoginView","hostName","onLogin","autoCorrect","autoCapitalize","LogoView","version","alt","Drafty","isUnconfirmed","ex","getExcessive","includes","isPeerRestricted","ms","getMissing","MessagesView","getDerivedStateFromProps","leave","sendImageAttachment","sendFileAttachment","sendKeyPress","handleScrollReference","handleScrollEvent","handleDescChange","handleSubsUpdated","handleNewMessage","handleAllMessagesReceived","handleInfoReceipt","handleImagePostview","handleClosePreview","handleFormResponse","handleContextClick","handleShowContextMenuMessage","handleNewChatAcceptance","handleEnablePeer","handleAttachFile","handleAttachImage","handleCancelUpload","postReadNotification","clearNotificationQueue","readNotificationQueue","readNotificationTimer","messagesScroller","removeEventListener","scrollTop","scrollHeight","scrollPosition","viewportHeight","onData","onAllMessagesReceived","onInfo","onPres","applicationVisible","isSubscribed","ready","newTopic","newTopicParams","_topicName","getQuery","withLaterDesc","withLaterSub","isReader","withLaterData","withLaterDel","fetchingMessages","setQuery","subscribe","ctrl","code","onNewTopicCreated","queuedMessages","pub","_sending","publishMessage","catch","message","blankState","not_found","nextProps","nextState","docPreview","imagePreview","imagePostview","typingIndicator","msgs","online","msg","deleted","onlineSubs","peer","p2pPeerDesc","peerMessagingDisabled","isWriter","readingBlocked","unconformed","unconfirmed","oldTopicName","oldTopic","finally","node","msgHasMoreMessages","getMessagesPage","seq","setInterval","clearInterval","shift","sendAt","max","noteRead","setMilliseconds","getMilliseconds","m","isNewMessage","msgStatus","from","clearTimeout","keyPressTimer","setTimeout","forceUpdate","content","sendMessage","attachJSON","ref","searchParams","resp","set","search","stopPropagation","pageY","pageX","messageSpecificMenuItems","onNewChat","noteKeyPress","maxInbandAttachmentSize","getServerLimit","uploader","getLargeFileHelper","cannot_initiate_upload","uploadCompletionPromise","upload","attachFile","filename","urlPromise","bits","maxExternAttachmentSize","limit","caption","tinyBlob","blobMime","tinyBits64","insertImage","_tempPreview","appendLineBreak","append","init","bits64","preview","found","find","_cancelled","cancel","component","hideSelf","component2","onClose","onSendMessage","messageNodes","previousFrom","chatBoxClass","nextFrom","sequence","thisFrom","isReply","deliveryStatus","userName","userFrom","userDesc","hi","mimeType","timestamp","ts","response","received","_uploader","viewportWidth","onImagePreview","onFormResponse","onCancelUpload","lastSeen","cont","getContact","online_now","seen","last_seen","when","onHideMessagesView","show","onKeyPress","onAttachFile","onAttachImage","search_for_contacts","search_no_results","NewTopicView","tabSelected","searchQuery","handleTabClick","handleSearchContacts","handleContactSelected","handleNewGroupSubmit","handleGroupByID","currentTarget","dataset","query","onSearchContacts","sel","onCreateTopic","dataUrl","priv","no_contacts_placeholder","data-id","searchResults","PasswordResetView","token","scheme","onReset","onRequest","reset","SettingsView","transport","handleTransportSelected","handleServerAddressChange","onUpdate","names","def","ws","lp","transportOptions","onServerAddressChange","SidepanelView","handleLoginRequested","handleNewTopic","onLoginRequest","view","onSignUp","onSettings","onNewTopic","errorAction","actionText","errorActionText","loadSpinnerVisible","loginDisabled","onGlobalSettings","onUpdateAccountTags","credCode","credMethod","onValidateCredentials","onPasswordResetRequest","onResetPassword","POP_SOUND","Audio","reconnect_countdown","reconnect_now","push_init_failed","invalid_security_token","no_connection","code_doesnot_match","TinodeWeb","getBlankState","handleResize","handleHashRoute","handleOnline","checkForAppUpdate","handleVisibilityEvent","handleError","handleLoginRequest","handleConnected","handleAutoreconnectIteration","doLogin","handleCredentialsRequest","handleLoginSuccessful","handleDisconnect","tnMeMetaDesc","tnMeContactUpdate","tnMeSubsUpdated","resetContactList","tnData","tnInitFind","tnFndSubsUpdated","handleTopicSelected","handleHideMessagesView","handleSendMessage","handleNewChatInvitation","handleNewAccount","handleNewAccountRequest","handleUpdateAccountRequest","handleUpdateAccountTagsRequest","handleToggleIncognitoMode","handleSettings","handleGlobalSettings","handleShowArchive","handleShowBlocked","handleToggleMessageSounds","handleCredAdd","handleCredDelete","handleCredConfirm","initDesktopAlerts","togglePushToken","requestPushToken","handleSidepanelCancel","handleStartTopicRequest","handleNewTopicCreated","handleTopicUpdateRequest","handleChangePermissions","handleLogout","handleDeleteMessagesRequest","handleLeaveUnsubRequest","handleBlockTopicRequest","handleReportTopic","handleShowContextMenu","defaultTopicContextMenu","handleHideContextMenu","handleShowAlert","handleShowInfoView","handleHideInfoView","handleValidateCredentialsRequest","handlePasswordResetRequest","handleResetPassword","handleContextMenuAction","settings","autoLogin","messageSoundsOff","firebase","FIREBASE_INIT","firebaseToken","hidden","sidePanelSelected","sidePanelTitle","sidePanelAvatar","liveConnection","onLine","topicSelectedOnline","topicSelectedAcs","innerWidth","showInfoPanel","mobilePanel","contextMenuVisible","contextMenuBounds","contextMenuClickAt","contextMenuParams","contextMenuItems","alertVisible","alertParams","documentElement","clientWidth","clientHeight","tnSetup","onConnect","onDisconnect","onAutoreconnectIteration","fbPush","messaging","usePublicVapidKey","messagingVapidKey","serviceWorker","register","reg","useServiceWorker","active","postMessage","setDeviceToken","parsedNav","expires","setAuthToken","connect","tab","readTimer","readTimerCallback","setHumanLanguage","enableLogging","mobile","onupdatefound","installingWorker","installing","onstatechange","controller","newTopicTabSelected","isConnected","getServerInfo","ver","prom","reconnectCountdown","timeLeft","reconnect","isAuthenticated","promise","getAuthToken","loginBasic","loginToken","onContactUpdate","getCurrentUserID","withDesc","withCred","disconnect","isPresencer","archived","isArchived","play","unused","foundContacts","merged","updated","prepareSearchableContacts","receivedTimer","noteRecv","fnd","getFndTopic","withSub","s","setMeta","isTopicOnline","getTopicAccessMode","createMessage","publishDraft","isP2P","delTopic","am","updateWant","login_","password_","public_","cred_","tags_","createAccountBasic","updateAccountBasic","getCurrentLogin","on","onTokenRefresh","onMessage","payload","enabled","requestPermission","deleteToken","getToken","refreshedToken","delCredential","basicNavigator","isTopicCached","newGroupTopicName","oldName","newName","permissions","updateGiven","delCurrentUser","delMessagesAll","updateMode","publish","getBoundingClientRect","self_blocked","subscribed","onConfirm","confirmText","onReject","rejectText","confirm","reject","invite","delSubscription","requestResetAuthSecret","newPassword","bounds","clickAt","hide","onTopicRemoved","visible","onAddMember","handleManageGroupMembers","phone","ValidationView","handleChange","handleKeyPress","handleCancel","numbers_only","Alert","Attachment","downloader","progress","downloadFile","mimetype","download","loaded","uploading","helperFunc","downloadUrl","downloadWidget","AvatarUpload","handleFileUpload","files","base64bits","du","randId","random","accept","ButtonBack","onBack","ChatMessage","onProgress","handleProgress","handleImagePreview","handleFormButtonClick","act","MESSAGE_STATUS_FAILED","ratio","sideClass","bubbleClass","fullDisplay","attachments","att","draftyFormatter","notFound","style","el","attr","UploadingImage","authorizeURL","inner","child","CheckBox","ChipInput","input","focused","handleTextInput","removeChipAt","handleChipCancel","handleFocusGained","handleFocusLost","handleKeyDown","chips","prompt","sortedChips","sortChips","staticMembers","chipIndex","indexChips","index","keep","normal","concat","filterFunc","onChipRemoved","onFocusLost","onEnter","noAvatar","avatarDisabled","invalid","onFocus","Chip","ContactAction","handleClick","icon_mapping","ContactBadges","badges","icon","color","badge_you","badge_owner","ContactList","showCheckmark","contactNodes","contactsCount","filter","selected","onSelected","dangerouslySetInnerHTML","__html","Contact","icon_badges","clear_for_all","delete_for_all","send_retry","mute","unmute","topic_delete","topic_delete_warning","unblock","block","topic_block_warning","member_delete","ContextMenu","handlePageClick","handleEscapeKey","MenuItems","errorHandler","deleteMessages","delete","retryMessage","topicPermissionSetter","contains","all","hard","cancelSend","delMessagesList","flushMessage","menu","hSize","vSize","position","left","right","top","bottom","DocPreview","handleSendDoc","mimeToIcon","default","image","video","iconFromMime","noInput","ErrorPanel","warn","whiteSpace","FileProgress","contacts_not_found_short","GroupManager","indexMembers","contactFilter","noContactsMessage","selectedContacts","handleMemberRemoved","handleContactFilter","delta","present","keepInitial","stat","userId","status","splice","keys","k","doContactFiltering","GroupSubs","usersOnline","totalCount","countToShow","some","overflow","HostSelector","changed","handleHostNameChange","handleEditingFinished","hostOptions","list","ImagePreview","handleSendImage","assignWidth","maxlength","messagePrompt","acceptBlank","InPlaceEdit","initialValue","handeTextChange","handleStartEditing","handlePasswordFinished","newValue","focus","checkValidity","fieldType","spanText","spanClass","Invitation","handleButtonAction","evt","LetterTile","isGroup","iconColor","abs","letter","charAt","LoadSpinner","MenuCancel","MenuContacts","MenuStart","MoreButton","handleToggle","invalid_id","NewTopicById","groupId","NewTopicGroup","handlePrivateChange","handleTagsChanged","handleChannelToggle","onTagsChanged","PermissionsEditor","joiner","writer","preser","approver","ReceivedMarker","sending","failed","marker","SearchContacts","edited","handleSearchChange","handleSearch","handleClear","search_placeholder","SendMessage","keypressTimestamp","getTime","handlePasteEvent","handleSend","handleMessageTyping","messageEditArea","shiftKey","messaging_disabled","type_new_message","attachImage","click","display","SideNavbar","TagManager","tagInput","handleTagInput","handleAddTag","handleRemoveTag","last","tag","maxTagCount","minTagLength","maxTagLength","add_tags_prompt","defautMessage","UnreadBadge","VisiblePassword","handleVisibility","activeElement","tabIndex","module","exports","ReactIntl","__webpack_module_cache__","__webpack_require__","moduleId","__webpack_modules__","getter","__esModule","d","definition","o","defineProperty","enumerable","get","obj","prop","prototype","call","r","Symbol","toStringTag"],"mappings":"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","file":"index.dev.js","sourcesContent":["import { PACKAGE_VERSION } from './version.js';\n\n// Name of this application, used in the User-Agent.\nexport const APP_NAME = 'TinodeWeb/' + (PACKAGE_VERSION || '0.16');\n\n// API key. Use https://github.com/tinode/chat/tree/master/keygen to generate your own\nexport const API_KEY = 'AQEAAAABAAD_rAp4DJh05a1HAwFT3A6K';\n\n// The array of possible hosts to connect to.\nexport const KNOWN_HOSTS = {hosted: 'web.tinode.co', local: 'localhost:6060'};\n\n// Default host name and port to connect to.\nexport const DEFAULT_HOST = KNOWN_HOSTS.hosted;\n\n// Enable console logging.\nexport const LOGGING_ENABLED = true;\n\n// Minimum time between two keypress notifications, milliseconds.\nexport const KEYPRESS_DELAY = 3*1000;\n// Delay before sending a {note} for reciving a message, milliseconds.\nexport const RECEIVED_DELAY = 500;\n// Delay before sending a read notification, milliseconds.\nexport const READ_DELAY = 1000;\n\n// The shortest allowed tag length. Matches the value on the server.\nexport const MIN_TAG_LENGTH = 2;\n// The greatest allowed tag length. Matches the value on the server.\nexport const MAX_TAG_LENGTH = 96;\n// The maximum number of tags allowed. Matches the value on the server.\nexport const MAX_TAG_COUNT = 16;\n\n// Access mode for P2P subscriptions initiated by the current user.\nexport const DEFAULT_P2P_ACCESS_MODE = 'JRWPS';\n// Access mode for new group topics created by the current user.\nexport const NEW_GRP_ACCESS_MODE = 'JRWPSAO';\n// Access mode for a channel.\nexport const CHANNEL_ACCESS_MODE = 'JR';\n\n// Access mode for no access.\nexport const NO_ACCESS_MODE = 'N';\n\n// Mediaquery breakpoint between desktop and mobile, in px. Should match the value\n// in @media (max-size: 640px) in base.css\nexport const MEDIA_BREAKPOINT = 640;\n// Size of css 'rem' unit in pixels. Default 1rem = 10pt = 13px.\nexport const REM_SIZE = 13;\n\n// Size of the avatar image: When an avatar image is uploaded, it's resized to\n// a square of this size.\nexport const AVATAR_SIZE = 128;\n\n// Size of the broken_image shown in MessagesView\nexport const BROKEN_IMAGE_SIZE = 32;\n\n// Number of chat messages to fetch in one call.\nexport const MESSAGES_PAGE = 24;\n\n// Default maximum in-band (included directly into the message) attachment size which fits into\n// a message of 256K in size. The actual binary size of the attachment should be smaller due to\n// base64 encoding expansion and some overhead, for instance 1024 bytes.\n// Increase this limit to a greater value in production, if desired. Also increase\n// max_message_size in the server config.\nexport const MAX_INBAND_ATTACHMENT_SIZE = 262144;\n\n// Absolute maximum attachment size to be used with the server = 8MB. Increase to\n// something like 100MB in production.\nexport const MAX_EXTERN_ATTACHMENT_SIZE = 1 << 23;\n\n// Maximum allowed linear dimension of an inline image in pixels. Larer images will be shrunk\n// to make the larger dimension fit under this size. You may want to adjust it to 1600 or\n// 2400 for production.\nexport const MAX_IMAGE_DIM = 1024;\n\n// Linear dimensions of image preview: shrink image under this size for previews.\nexport const IMAGE_PREVIEW_DIM = 64;\n\n// Maximum number of online users to be shown in a topic title bar. Others will be\n// hidden under \"+X more\"\nexport const MAX_ONLINE_IN_TOPIC = 4;\n\n// Maximum length of user name, topic title, and private comment.\nexport const MAX_TITLE_LENGTH = 60;\n\n// Link for \"Contact Us\".\nexport const LINK_CONTACT_US = 'email:info@tinode.co';\n\n// Link to Privacy Policy.\nexport const LINK_PRIVACY_POLICY = 'https://tinode.co/privacy.html';\n\n// Link to Terms of Service.\nexport const LINK_TERMS_OF_SERVICE = 'https://tinode.co/terms.html';\n","// Put all packages together.\n// Used to generate umd/index.prod.js\n\nimport React from 'react';\nimport ReactDOM from 'react-dom';\n\nimport { IntlProvider } from 'react-intl';\n\nimport allMessages from './messages.json';\nimport TinodeWeb from './views/tinode-web.jsx';\nimport HashNavigation from './lib/navigation.js';\n\n// Detect human language to use in the UI:\n// Check parameters from URL hash #?hl=ru, then browser, then use 'en' as a fallback.\nconst { params } = HashNavigation.parseUrlHash(window.location.hash);\nconst language = (params && params.hl) ||\n (navigator.languages && navigator.languages[0]) ||\n navigator.language ||\n navigator.userLanguage ||\n 'en';\n\n// Get the base language 'en' from a more specific 'en_GB' or 'en-US' as a partial fallback.\nconst baseLanguage = language.toLowerCase().split(/[-_]/)[0];\n\n// Try the full locale first, then the locale without the region code, fallback to 'en'.\nconst messages =\n allMessages[language] ||\n allMessages[baseLanguage] ||\n allMessages.en;\n\nReactDOM.render(\n \n \n ,\n document.getElementById('mountPoint')\n);\n","// File and image helper functions.\nimport { MAX_INBAND_ATTACHMENT_SIZE, MAX_IMAGE_DIM } from '../config.js';\nimport { bytesToHumanSize } from './strformat.js'\n\n// Supported image MIME types and corresponding file extensions.\nexport const SUPPORTED_IMAGE_FORMATS = ['image/jpeg', 'image/gif', 'image/png', 'image/svg', 'image/svg+xml'];\nexport const MIME_EXTENSIONS = ['jpg', 'gif', 'png', 'svg', 'svg'];\n\n// Make a data URL from public.photo\nexport function makeImageUrl(photo) {\n return (photo && photo.type && photo.data) ?\n 'data:image/' + photo.type + ';base64,' + photo.data : null;\n}\n\n// Calculate linear dimensions for scaling image down to fit under a certain size.\n// Returns an object which contains destination sizes, source sizes, and offsets\n// into source (when making square images).\nexport function fitImageSize(width, height, maxWidth, maxHeight, forceSquare) {\n // Sanitize input\n width = width | 0;\n height = height | 0;\n maxWidth = maxWidth | 0;\n maxHeight = maxHeight | 0;\n\n if (width <= 0 || height <= 0 || maxWidth <= 0 || maxHeight <= 0) {\n return null;\n }\n\n if (forceSquare) {\n maxWidth = maxHeight = Math.min(maxWidth, maxHeight);\n }\n\n let scale = Math.min(\n Math.min(width, maxWidth) / width,\n Math.min(height, maxHeight) / height\n );\n\n let size = {\n dstWidth: (width * scale) | 0,\n dstHeight: (height * scale) | 0,\n };\n\n if (forceSquare) {\n // Also calculate parameters for making the image square.\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 return size;\n}\n\n// Ensure file's extension matches mime content type\nexport function fileNameForMime(fname, mime) {\n const idx = SUPPORTED_IMAGE_FORMATS.indexOf(mime);\n if (idx < 0 || !fname) {\n // Unknown mime or empty name.\n return fname;\n }\n const ext = MIME_EXTENSIONS[idx];\n\n const at = fname.lastIndexOf('.');\n if (at >= 0) {\n fname = fname.substring(0, at);\n }\n return fname + '.' + ext;\n}\n\n// Scale uploaded image to fit under certain dimensions and byte size, optionally constraining to a square.\n// On success calls onSuccess callback with the scaled image as Blob.\nexport function imageScaled(fileOrBlob, maxWidth, maxHeight, maxSize, forceSquare, onSuccess, onError) {\n const img = new Image();\n img.crossOrigin = 'Anonymous';\n img.onerror = function(err) {\n onError(\"Image format unrecognized\");\n }\n img.onload = async function() {\n // Once the image is loaded, the URL is no longer needed.\n URL.revokeObjectURL(img.src);\n\n // Calculate the desired image dimensions.\n const dim = fitImageSize(this.width, this.height, maxWidth, maxHeight, forceSquare);\n if (!dim) {\n onError(\"Invalid image\");\n return;\n }\n let canvas = document.createElement('canvas');\n canvas.width = dim.dstWidth;\n canvas.height = dim.dstHeight;\n let ctx = canvas.getContext('2d');\n ctx.imageSmoothingEnabled = true;\n ctx.drawImage(this, dim.xoffset, dim.yoffset, dim.srcWidth, dim.srcHeight,\n 0, 0, dim.dstWidth, dim.dstHeight);\n\n const mime = SUPPORTED_IMAGE_FORMATS.indexOf(fileOrBlob.type) < 0 ? 'image/jpeg' : fileOrBlob.type;\n // Generate blob to check size of the image.\n let blob = await new Promise(resolve => canvas.toBlob(resolve, mime));\n if (!blob) {\n onError(\"Unsupported image format\");\n return;\n }\n\n // Ensure the image is not too large. Shrink the image keeping the aspect ratio.\n // Do nothing if maxsize is <= 0.\n while (maxSize > 0 && blob.length > maxSize) {\n dim.dstWidth = (dim.dstWidth * 0.70710678118) | 0;\n dim.dstHeight = (dim.dstHeight * 0.70710678118) | 0;\n canvas.width = dim.dstWidth;\n canvas.height = dim.dstHeight;\n ctx = canvas.getContext('2d');\n ctx.clearRect(0, 0, canvas.width, canvas.height);\n ctx.drawImage(this, dim.xoffset, dim.yoffset, dim.srcWidth, dim.srcHeight,\n 0, 0, dim.dstWidth, dim.dstHeight);\n blob = await new Promise(resolve => canvas.toBlob(resolve, mime));\n }\n\n canvas = null;\n onSuccess(blob, mime, dim.dstWidth, dim.dstHeight, fileNameForMime(fileOrBlob.name, mime));\n };\n img.src = URL.createObjectURL(fileOrBlob);\n}\n\n// Convert File to base64 string.\nexport function fileToBase64(file, onSuccess) {\n const reader = new FileReader();\n reader.addEventListener('load', function() {\n onSuccess(file.type, reader.result.split(',')[1], file.name);\n });\n reader.readAsDataURL(file);\n}\n\n// Convert Blob to base64 string.\nexport function blobToBase64(blob, onSuccess) {\n const reader = new FileReader();\n reader.addEventListener('load', function() {\n onSuccess(blob.type, reader.result.split(',')[1]);\n });\n reader.readAsDataURL(blob);\n}\n\n// File pasted from the clipboard. It's either an inline image or a file attachment.\n// FIXME: handle large files out of band.\nexport function filePasted(event, onImageSuccess, onAttachmentSuccess, onError) {\n var items = (event.clipboardData || event.originalEvent.clipboardData || {}).items;\n for (var i in items) {\n var item = items[i];\n if (item.kind === 'file') {\n var file = item.getAsFile();\n if (!file) {\n console.log(\"Failed to get file object from pasted file item\", item.kind, item.type);\n continue;\n }\n if (file.type && file.type.split('/')[0] == 'image') {\n // Handle inline 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 // Handle file attachment\n fileToBase64(file, onAttachmentSuccess, onError)\n }\n // Indicate that the pasted data contains a file.\n return true;\n }\n }\n // No file found.\n return false;\n}\n\n// Get mime type from data URL header.\nexport function getMimeType(header) {\n var mime = /^data:(image\\/[-+a-z0-9.]+);base64/.exec(header);\n return (mime && mime.length > 1) ? mime[1] : null;\n}\n\n// Given length of a binary object in bytes, calculate the length after\n// base64 encoding.\nexport function base64EncodedLen(n) {\n return Math.floor((n + 2) / 3) * 4;\n}\n\n// Given length of a base64-encoded object, calculate decoded size of the\n// pbject in bytes.\nexport function base64DecodedLen(n) {\n return Math.floor(n / 4) * 3;\n}\n\n// Re-encode string to standard base64 encoding with padding.\n// The string may be base64-URL encoded without the padding.\nexport function base64ReEncode(str) {\n if (str) {\n str = str.replace(/-/g, '+').replace(/_/g, '/');\n try {\n str = btoa(atob(str));\n } catch(err) {\n console.log(\"Failed to base64 re-encode string.\", err);\n str = null;\n }\n }\n return str;\n}\n","import { KNOWN_HOSTS, DEFAULT_HOST } from '../config.js';\n\n// Detect server address from the URL\nexport function detectServerAddress() {\n let host = DEFAULT_HOST;\n if (typeof window.location == 'object') {\n if (window.location.protocol == 'file:' || window.location.hostname == 'localhost') {\n host = KNOWN_HOSTS.local;\n } else if (window.location.hostname) {\n host = window.location.hostname + (window.location.port ? ':' + window.location.port : '');\n }\n }\n return host;\n}\n\n// Detect if the page is served over HTTPS.\nexport function isSecureConnection() {\n if (typeof window.location == 'object') {\n return window.location.protocol == 'https:';\n }\n return false;\n}\n\nexport function isLocalHost() {\n if (typeof window.location == 'object') {\n return window.location.hostname == 'localhost';\n }\n return false;\n}\n","// Helper functions for storing values in localStorage.\n// By default localStorage can store only strings, not objects or other types.\n\nexport default class LocalStorageUtil {\n // Replace old object with the new one.\n static setObject(key, value) {\n localStorage.setItem(key, JSON.stringify(value));\n }\n\n // Get stored object.\n static getObject(key) {\n const value = localStorage.getItem(key);\n return value && JSON.parse(value);\n }\n\n // Partially or wholly update stored object.\n static updateObject(key, value) {\n const oldVal = this.getObject(key);\n this.setObject(key, Object.assign(oldVal || {}, value));\n }\n\n // Just a wrapper.\n static removeItem(key) {\n localStorage.removeItem(key);\n }\n}\n","// Utility class for hash navigation.\n\n// Parse hash as in http://www.example.com/path#hash as if it were\n// path and arguments.\nexport default class HashNavigation {\n static parseUrlHash(hash) {\n // Split path from args, path -> parts[0], args->path[1]\n const parts = hash.split('?', 2);\n const params = {};\n let path = [];\n if (parts[0]) {\n path = parts[0].substr(1).split('/');\n }\n if (parts[1]) {\n parts[1].split('&').forEach(function(part) {\n let item = part.split('=');\n if (item[0]) {\n params[decodeURIComponent(item[0])] = decodeURIComponent(item[1]);\n }\n });\n }\n return {path: path, params: params};\n }\n\n static navigateTo(url) {\n window.location.hash = url;\n }\n\n static composeUrlHash(path, params) {\n let url = path.join('/');\n const args = [];\n for (const key in params) {\n if (params.hasOwnProperty(key)) {\n args.push(key + '=' + params[key]);\n }\n }\n if (args.length > 0) {\n url += '?' + args.join('&');\n }\n return url;\n }\n\n static addUrlParam(hash, key, value) {\n const parsed = this.parseUrlHash(hash);\n parsed.params[key] = value;\n return this.composeUrlHash(parsed.path, parsed.params);\n }\n\n static removeUrlParam(hash, key) {\n const parsed = this.parseUrlHash(hash);\n delete parsed.params[key];\n return this.composeUrlHash(parsed.path, parsed.params);\n }\n\n static setUrlSidePanel(hash, sidepanel) {\n const parsed = this.parseUrlHash(hash);\n parsed.path[0] = sidepanel;\n return this.composeUrlHash(parsed.path, parsed.params);\n }\n\n static setUrlTopic(hash, topic) {\n const parsed = this.parseUrlHash(hash);\n parsed.path[1] = topic;\n // Close InfoView on topic change.\n delete parsed.params.info;\n return this.composeUrlHash(parsed.path, parsed.params);\n }\n}\n","// Short representation of time in the past.\nexport function shortDateFormat(then, locale) {\n locale = locale || window.navigator.userLanguage || window.navigator.language;\n const now = new Date();\n if (then.getFullYear() == now.getFullYear()) {\n if (then.getMonth() == now.getMonth() && then.getDate() == now.getDate()) {\n\t return then.toLocaleTimeString(locale, {hour12: false, hour: '2-digit', minute: '2-digit'});\n } else {\n\t return then.toLocaleDateString(locale,\n {hour12: false, month: 'short', day: 'numeric', hour: '2-digit', minute: '2-digit'});\n }\n }\n return then.toLocaleDateString(locale,\n {hour12: false, year: 'numeric', month: 'short', day: 'numeric', hour: '2-digit', minute: '2-digit'});\n}\n\n// Convert seconds to minutes:seconds, i.e. 156 sec -> 2:36.\nexport function secondsToTime(seconds) {\n const min = Math.floor(seconds / 60);\n let sec = seconds % 60;\n sec = sec < 10 ? `0${sec}` : sec;\n return `${min}:${sec}`;\n}\n\n// Convert a number of bytes to human-readable format.\nexport function bytesToHumanSize(bytes) {\n if (!bytes || bytes == 0) {\n return '0 Bytes';\n }\n\n const sizes = ['Bytes', 'KB', 'MB', 'GB', 'TB', 'PB'];\n const bucket = Math.min(Math.floor(Math.log2(bytes) / 10) | 0, sizes.length-1);\n const count = bytes / Math.pow(1024, bucket);\n const round = bucket > 0 ? (count < 3 ? 2 : (count < 30 ? 1 : 0)) : 0;\n return count.toFixed(round) + ' ' + sizes[bucket];\n}\n\n// Get 32 bit integer hash value for a string. Ideally it should produce the same value\n// as Java's String#hash().\nexport function stringHash(value) {\n let hash = 0;\n value = '' + value;\n for (let i = 0; i < value.length; i++) {\n hash = ((hash << 5) - hash) + value.charCodeAt(i);\n hash = hash & hash; // Convert to 32bit integer\n }\n return hash;\n}\n","// Odds and ends\n\n// Make shortcut icon appear with a green dot + show unread count in title.\nexport function updateFavicon(count) {\n const oldIcon = document.getElementById('shortcut-icon');\n const head = document.head || document.getElementsByTagName('head')[0];\n const newIcon = document.createElement('link');\n newIcon.type = 'image/png';\n newIcon.id = 'shortcut-icon';\n newIcon.rel = 'shortcut icon';\n newIcon.href = 'img/logo32x32' + (count > 0 ? 'a' : '') + '.png';\n if (oldIcon) {\n head.removeChild(oldIcon);\n }\n head.appendChild(newIcon);\n\n document.title = (count > 0 ? '('+count+') ' : '') + 'Tinode';\n}\n\n// Create VCard which represents topic 'public' info\nexport function vcard(fn, imageDataUrl) {\n let card = null;\n\n if ((fn && fn.trim()) || imageDataUrl) {\n card = {};\n if (fn) {\n card.fn = fn.trim();\n }\n if (imageDataUrl) {\n const dataStart = imageDataUrl.indexOf(',');\n card.photo = dataStart >= 0 ? {\n data: imageDataUrl.substring(dataStart+1),\n type: 'jpg'\n } : imageDataUrl;\n }\n }\n return card;\n}\n\n// Deep-shallow compare two arrays: shallow compare each element.\nexport function arrayEqual(a, b) {\n if (a === b) {\n return true;\n }\n\n if (!Array.isArray(a) || !Array.isArray(b)) {\n return false;\n }\n\n // Compare lengths first.\n if (a.length != b.length) {\n return false;\n }\n // Order of elements is ignored.\n a.sort();\n b.sort();\n for (let i = 0, l = a.length; i < l; i++) {\n if (a[i] !== b[i]) {\n return false;\n }\n }\n return true;\n}\n\n// Checks (loosely) if the given string is a phone. If so, returns the phone number in a format\n// as close to E.164 as possible.\nexport function asPhone(val) {\n val = val.trim();\n if (/^(?:\\+?(\\d{1,3}))?[- (.]*(\\d{3})[- ).]*(\\d{3})[- .]*(\\d{2})[- .]*(\\d{2})?$/.test(val)) {\n return val.replace(/[- ().]*/, '');\n }\n return null;\n}\n\n// Checks (loosely) if the given string is an email. If so returns the email.\nexport function asEmail(val) {\n val = val.trim();\n if (/^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\\.[a-zA-Z0-9-.]+$/.test(val)) {\n return val;\n }\n return null;\n}\n\n// Checks if URL is a relative url, i.e. has no 'scheme://', including the case of missing scheme '//'.\n// The scheme is expected to be RFC-compliant, e.g. [a-z][a-z0-9+.-]*\n// example.html - ok\n// https:example.com - not ok.\n// http:/example.com - not ok.\n// ' ↲ https://example.com' - not ok. (↲ means carriage return)\nexport function isUrlRelative(url) {\n return url && !/^\\s*([a-z][a-z0-9+.-]*:|\\/\\/)/im.test(url);\n}\n\n// Ensure URL does not present an XSS risk. Optional allowedSchemes may contain an array of\n// strings with permitted URL schemes, such as ['ftp', 'ftps']; otherwise accept http and https only.\n// If apikey and/or token is defined, it's appended to relative URL.\nexport function sanitizeUrl(url, allowedSchemes) {\n if (!url) {\n return null;\n }\n\n // Strip control characters and whitespace. They are not valid URL characters anyway.\n url = url.replace(/[^\\x20-\\x7E]/gmi, '').trim();\n\n // Relative URLs are safe.\n // Relative URL does not start with ':', abcd123: or '//'.\n if (!/^([a-z][a-z0-9+.-]*:|\\/\\/)/i.test(url)) {\n return url;\n }\n\n // Blob URLs are safe.\n if (/^blob:http/.test(url)) {\n return url;\n }\n\n // Absolute URL. Accept only safe schemes, or no scheme.\n const schemes = Array.isArray(allowedSchemes) ? allowedSchemes.join('|') : 'http|https';\n const re = new RegExp('^((' + schemes + '):|//)', 'i');\n if (!re.test(url)) {\n return null;\n }\n\n return url;\n}\n\n// Ensure URL is suitable for field: the URL must be a relative URL or\n// have http:, https:, blob: or data: scheme.\n// The relative URL is appended with the API key and/or auth token.\n// In case of data: scheme, the URL must start with a 'data:image/XXXX;base64,'.\nexport function sanitizeImageUrl(url) {\n if (!url) {\n return null;\n }\n\n const sanitizedUrl = sanitizeUrl(url);\n if (sanitizedUrl) {\n return sanitizedUrl;\n }\n\n // Is this a data: URL of an image?\n if (/data:image\\/[a-z0-9.-]+;base64,/i.test(url.trim())) {\n return url;\n }\n\n return null;\n}\n","// This is a generated file. Don't edit.\n\nexport const PACKAGE_VERSION = \"0.16.10\";\n","// Edit account parameters.\nimport React from 'react';\nimport { FormattedMessage } from 'react-intl';\n\nimport Tinode from 'tinode-sdk';\n\nimport AvatarUpload from '../widgets/avatar-upload.jsx';\nimport InPlaceEdit from '../widgets/in-place-edit.jsx';\nimport TagManager from '../widgets/tag-manager.jsx';\n\nimport { MAX_TITLE_LENGTH } from '../config.js';\nimport { makeImageUrl } from '../lib/blob-helpers.js';\nimport { arrayEqual, asEmail, asPhone, vcard } from '../lib/utils.js';\n\nexport default class AccGeneralView extends React.Component {\n constructor(props) {\n super(props);\n\n const me = this.props.tinode.getMeTopic();\n this.state = {\n fullName: me.public ? me.public.fn : undefined,\n avatar: makeImageUrl(me.public ? me.public.photo : null),\n tags: me.tags(),\n credentials: me.getCredentials() || [],\n addCredActive: false,\n addCredInvalid: false,\n newCred: '',\n previousOnTags: me.onTagsUpdated\n };\n\n this.tnNewTags = this.tnNewTags.bind(this);\n this.tnCredsUpdated = this.tnCredsUpdated.bind(this);\n this.handleFullNameUpdate = this.handleFullNameUpdate.bind(this);\n this.handleImageChanged = this.handleImageChanged.bind(this);\n this.handleCredChange = this.handleCredChange.bind(this);\n this.handleCredKeyDown = this.handleCredKeyDown.bind(this);\n this.handleCredEntered = this.handleCredEntered.bind(this);\n this.handleTagsUpdated = this.handleTagsUpdated.bind(this);\n }\n\n componentDidMount() {\n const me = this.props.tinode.getMeTopic();\n me.onCredsUpdated = this.tnCredsUpdated;\n me.onTagsUpdated = this.tnNewTags;\n }\n\n componentWillUnmount() {\n const me = this.props.tinode.getMeTopic();\n me.onTagsUpdated = this.state.previousOnTags;\n me.onCredsUpdated = undefined;\n }\n\n tnNewTags(tags) {\n this.setState({tags: tags});\n }\n\n tnCredsUpdated(creds) {\n this.setState({credentials: creds || []});\n }\n\n handleFullNameUpdate(fn) {\n fn = fn.trim().substring(0, MAX_TITLE_LENGTH);\n if (fn) {\n this.setState({fullName: fn});\n this.props.onUpdateAccount(undefined, vcard(fn, null));\n }\n }\n\n handleImageChanged(img) {\n this.setState({avatar: img});\n this.props.onUpdateAccount(undefined, vcard(null, img || Tinode.DEL_CHAR));\n }\n\n handleCredChange(e) {\n this.setState({newCred: e.target.value, addCredInvalid: false});\n }\n\n handleCredKeyDown(e) {\n if (e.keyCode === 27) {\n // Escape pressed\n this.setState({newCred: '', addCredActive: false});\n } else if (e.keyCode === 13) {\n // Enter pressed\n this.handleCredEntered(e);\n }\n }\n\n handleCredEntered(e) {\n let value = this.state.newCred.trim();\n if (!value) {\n this.setState({addCredActive: false, addCredInvalid: false});\n return;\n }\n\n let val = asPhone(value);\n let method;\n if (val) {\n method = 'tel';\n } else {\n val = asEmail(value);\n if (val) {\n method = 'email';\n }\n }\n if (method) {\n this.props.onCredAdd(method, val);\n this.setState({addCredActive: false, newCred: ''});\n } else {\n this.setState({addCredInvalid: true});\n }\n }\n\n handleTagsUpdated(tags) {\n // Check if tags have actually changed.\n if (arrayEqual(this.state.tags.slice(0), tags.slice(0))) {\n return;\n }\n this.props.onUpdateTags(tags);\n }\n\n render() {\n const credentials = [];\n this.state.credentials.map((cred) => {\n credentials.push();\n });\n\n return (\n
\n
\n
\n \n
{\n (full_name_placeholder) => \n }
\n
\n \n
\n
\n {\n (title_tag_manager) => \n }\n
\n
\n \n
\n {credentials}\n {this.state.addCredActive ?\n \n : null}\n \n
\n
\n
\n );\n }\n};\n","// Edit account parameters.\nimport React from 'react';\nimport { FormattedMessage } from 'react-intl';\n\nimport CheckBox from '../widgets/checkbox.jsx';\n\nexport default class EditAccountView extends React.PureComponent {\n constructor(props) {\n super(props);\n\n this.handleCheckboxClick = this.handleCheckboxClick.bind(this);\n }\n\n handleCheckboxClick(what, checked) {\n if (what == 'sound') {\n this.props.onToggleMessageSounds(checked);\n } else if (what == 'alert') {\n this.props.onTogglePushNotifications(checked);\n } else if (what == 'incognito') {\n this.props.onToggleIncognitoMode(checked);\n }\n }\n\n render() {\n return (\n
\n
\n \n \n
\n
\n \n \n
\n
\n \n \n
\n
\n );\n }\n};\n","// Edit account parameters.\nimport React from 'react';\nimport { FormattedMessage, defineMessages, injectIntl } from 'react-intl';\n\nimport InPlaceEdit from '../widgets/in-place-edit.jsx';\nimport PermissionsEditor from '../widgets/permissions-editor.jsx';\n\nconst messages = defineMessages({\n delete_account: {\n id: 'delete_account',\n defaultMessage: 'Delete account',\n description: 'Title for delete account warning'\n },\n delete_account_warning: {\n id: 'delete_account_arning',\n defaultMessage: 'Are you sure you want to delete your account? It cannot be undone.',\n description: 'Warning message when deleting an account'\n }\n});\n\nclass AccSecurityView extends React.Component {\n constructor(props) {\n super(props);\n\n const me = this.props.tinode.getMeTopic();\n let blockedCount = 0;\n me.contacts((c) => {\n if (c.acs && !c.acs.isJoiner()) {\n blockedCount ++;\n }\n });\n const defacs = me.getDefaultAccess();\n this.state = {\n auth: defacs ? defacs.auth : null,\n anon: defacs ? defacs.anon : null,\n showPermissionEditorFor: undefined,\n blockedCount: blockedCount,\n };\n\n this.handlePasswordUpdate = this.handlePasswordUpdate.bind(this);\n this.handleLaunchPermissionsEditor = this.handleLaunchPermissionsEditor.bind(this);\n this.handleHidePermissionsEditor = this.handleHidePermissionsEditor.bind(this);\n this.handlePermissionsChanged = this.handlePermissionsChanged.bind(this);\n this.handleDeleteAccount = this.handleDeleteAccount.bind(this);\n }\n\n handlePasswordUpdate(pwd) {\n this.setState({password: pwd});\n this.props.onUpdateAccount(pwd);\n }\n\n handleLaunchPermissionsEditor(which) {\n this.setState({\n showPermissionEditorFor: which,\n editedPermissions: this.state[which]\n });\n }\n\n handleHidePermissionsEditor() {\n this.setState({showPermissionEditorFor: undefined});\n }\n\n handlePermissionsChanged(perm) {\n let defacs = {};\n defacs[this.state.showPermissionEditorFor] = perm;\n this.props.onUpdateAccount(undefined, undefined, defacs);\n\n let newState = {showPermissionEditorFor: undefined};\n newState[this.state.showPermissionEditorFor] = perm;\n this.setState(newState);\n }\n\n handleDeleteAccount(e) {\n e.preventDefault();\n const {formatMessage} = this.props.intl;\n this.props.onShowAlert(\n formatMessage(messages.delete_account), // title\n formatMessage(messages.delete_account_warning), // content\n (() => { this.props.onDeleteAccount(); }), // onConfirm\n null, // use default text \"OK\"\n true, // Show Reject button\n null // use default text \"Cancel\"\n );\n }\n\n render() {\n return (\n {this.state.showPermissionEditorFor ?\n \n :\n
\n
\n \n
\n {\n (password_unchanged) => \n }\n
\n
\n
\n \n
\n
\n
\n \n
\n
\n
Auth: {this.state.auth}
\n
Anon: {this.state.anon}
\n
\n
\n {this.state.blockedCount > 0 ?\n <>\n \n }\n );\n }\n};\n\nexport default injectIntl(AccSecurityView);\n","// Edit account parameters.\nimport React from 'react';\nimport { FormattedMessage } from 'react-intl';\n\nimport Tinode from 'tinode-sdk';\n\nimport { APP_NAME, LINK_CONTACT_US, LINK_PRIVACY_POLICY, LINK_TERMS_OF_SERVICE } from '../config.js';\n\nexport default class AccSupportView extends React.PureComponent {\n render() {\n return (\n
\n \n
\n
\n
\n \n {APP_NAME}\n
\n
\n \n {Tinode.getLibrary()}\n
\n
\n \n {this.props.serverVersion}\n
\n
\n \n {this.props.serverAddress}\n
\n
\n
\n );\n }\n};\n","/* ContactsView holds all contacts-related stuff */\nimport React from 'react';\nimport { FormattedMessage, defineMessages } from 'react-intl';\n\nimport ContactList from '../widgets/contact-list.jsx';\n\nimport { updateFavicon } from '../lib/utils.js';\n\nconst messages = defineMessages({\n archived_contacts_title: {\n id: \"archived_contacts\",\n defaultMessage: \"Archived contacts ({count})\",\n description: \"Label for archived chats\"\n }\n});\n\nexport default class ContactsView extends React.Component {\n constructor(props) {\n super(props);\n\n this.handleAction = this.handleAction.bind(this);\n\n this.state = ContactsView.deriveStateFromProps(props);\n }\n\n static deriveStateFromProps(props) {\n const contacts = [];\n let unreadThreads = 0;\n let archivedCount = 0;\n props.chatList.map((c) => {\n const blocked = c.acs && !c.acs.isJoiner();\n // Show only blocked contacts only when props.blocked == true.\n if (blocked && props.blocked) {\n contacts.push(c);\n }\n if (blocked || props.blocked) {\n return;\n }\n\n if (c.private && c.private.arch) {\n if (props.archive) {\n contacts.push(c);\n } else {\n archivedCount ++;\n }\n } else if (!props.archive) {\n contacts.push(c);\n unreadThreads += c.unread > 0 ? 1 : 0;\n }\n });\n\n contacts.sort((a, b) => {\n return (b.touched || 0) - (a.touched || 0);\n });\n\n if (archivedCount > 0) {\n contacts.push({\n action: 'archive',\n title: messages.archived_contacts_title,\n values: {count: archivedCount}\n });\n }\n\n return {\n contactList: contacts,\n unreadThreads: unreadThreads\n };\n }\n\n componentDidUpdate(prevProps, prevState) {\n if (prevProps.chatList != this.props.chatList ||\n prevProps.archive != this.props.archive ||\n prevProps.blocked != this.props.blocked) {\n const newState = ContactsView.deriveStateFromProps(this.props);\n this.setState(newState);\n if (newState.unreadThreads != prevState.unreadThreads) {\n updateFavicon(newState.unreadThreads);\n }\n }\n }\n\n handleAction(action_ignored) {\n this.props.onShowArchive();\n }\n\n render() {\n return (\n ¯∖_(ツ)_/¯\"\n description=\"HTML message shown in ContactList when no contacts are found\">{\n (no_contacts) => \n }\n );\n }\n};\n","// Account registration.\nimport React from 'react';\nimport { FormattedMessage } from 'react-intl';\n\nimport AvatarUpload from '../widgets/avatar-upload.jsx';\nimport CheckBox from '../widgets/checkbox.jsx';\nimport VisiblePassword from '../widgets/visible-password.jsx';\n\nimport LocalStorageUtil from '../lib/local-storage.js';\nimport { vcard } from '../lib/utils.js';\n\nimport { MAX_TITLE_LENGTH } from '../config.js';\n\nexport default class CreateAccountView extends React.PureComponent {\n constructor(props) {\n super(props);\n\n this.state = {\n login: '',\n password: '',\n email: '',\n fn: '', // full/formatted name\n imageDataUrl: null,\n errorCleared: false,\n saveToken: LocalStorageUtil.getObject('keep-logged-in')\n };\n\n this.handleLoginChange = this.handleLoginChange.bind(this);\n this.handlePasswordChange = this.handlePasswordChange.bind(this);\n this.handleEmailChange = this.handleEmailChange.bind(this);\n this.handleFnChange = this.handleFnChange.bind(this);\n this.handleImageChanged = this.handleImageChanged.bind(this);\n this.handleToggleSaveToken = this.handleToggleSaveToken.bind(this);\n this.handleSubmit = this.handleSubmit.bind(this);\n }\n\n handleLoginChange(e) {\n this.setState({login: e.target.value});\n }\n\n handlePasswordChange(password) {\n this.setState({password: password});\n }\n\n handleEmailChange(e) {\n this.setState({email: e.target.value})\n }\n\n handleFnChange(e) {\n this.setState({fn: e.target.value});\n }\n\n handleImageChanged(img) {\n this.setState({imageDataUrl: img});\n }\n\n handleToggleSaveToken() {\n LocalStorageUtil.setObject('keep-logged-in', !this.state.saveToken);\n this.setState({saveToken: !this.state.saveToken});\n }\n\n handleSubmit(e) {\n e.preventDefault();\n this.setState({errorCleared: false});\n this.props.onCreateAccount(\n this.state.login.trim(),\n this.state.password.trim(),\n vcard(this.state.fn.trim().substring(0, MAX_TITLE_LENGTH), this.state.imageDataUrl),\n {'meth': 'email', 'val': this.state.email});\n }\n\n render() {\n let submitClasses = 'blue';\n if (this.props.disabled) {\n submitClasses += ' disabled';\n }\n\n return (\n
\n
\n
\n {\n (login_prompt) => \n }\n {\n (password_prompt) => \n }\n
\n \n
\n
\n {\n (full_name_prompt) => \n }\n
\n
\n {\n (email_prompt) => \n }\n
\n
\n \n {\n (stay_logged_in) => \n }\n
\n
\n \n
\n
\n );\n }\n};\n","// Edit account parameters.\nimport React from 'react';\nimport { FormattedMessage } from 'react-intl';\n\nimport AvatarUpload from '../widgets/avatar-upload.jsx';\n\nimport { makeImageUrl } from '../lib/blob-helpers.js';\n\nexport default class EditAccountView extends React.Component {\n constructor(props) {\n super(props);\n\n const me = this.props.tinode.getMeTopic();\n this.state = {\n fullName: me.public ? me.public.fn : undefined,\n avatar: makeImageUrl(me.public ? me.public.photo : null)\n };\n }\n\n render() {\n return (\n
\n
\n
\n \n
{this.state.fullName}
\n
\n  \n {this.props.myUserId}\n
\n
\n \n
\n \n \n );\n }\n};\n","// InfoView: panel with topic/user info.\nimport React from 'react';\nimport { FormattedMessage, defineMessages, injectIntl } from 'react-intl';\n\nimport Tinode from 'tinode-sdk';\n\nimport AvatarUpload from '../widgets/avatar-upload.jsx';\nimport CheckBox from '../widgets/checkbox.jsx';\nimport ContactList from '../widgets/contact-list.jsx';\nimport ErrorPanel from '../widgets/error-panel.jsx';\nimport GroupManager from '../widgets/group-manager.jsx';\nimport InPlaceEdit from '../widgets/in-place-edit.jsx';\nimport MenuCancel from '../widgets/menu-cancel.jsx';\nimport MoreButton from '../widgets/more-button.jsx';\nimport PermissionsEditor from '../widgets/permissions-editor.jsx';\nimport TagManager from '../widgets/tag-manager.jsx';\n\nimport { MAX_TITLE_LENGTH, NO_ACCESS_MODE } from '../config.js';\n\nimport { makeImageUrl } from '../lib/blob-helpers.js';\nimport { arrayEqual, vcard } from '../lib/utils.js';\n\nconst messages = defineMessages({\n requested: {\n id: 'requested_permissions',\n defaultMessage: 'Requested',\n description: 'Title for permissions'\n },\n granted: {\n id: 'granted_permissions',\n defaultMessage: 'Granted',\n description: 'Title for permissions'\n },\n edit_permissions: {\n id: 'menu_item_edit_permissions',\n defaultMessage: 'Edit permissions',\n description: 'Menu item [Edit permissions]'\n },\n other_user: {\n id: 'label_other_user',\n defaultMessage: 'Other',\n description: 'Label for the other user when the user is unnamed'\n },\n clear_messages: {\n id: 'action_clear_messages',\n defaultMessage: 'Clear Messages',\n description: 'Flat button [Clear Messages] (soft-delete messages)'\n },\n clear_messages_warning: {\n id: 'clear_messages_warning',\n defaultMessage: 'Are you sure you want to clear all messages? It cannot be undone.',\n description: 'Alert dialog warning when deleting all messages.'\n },\n delete_messages: {\n id: 'action_delete_messages',\n defaultMessage: 'Clear Messages for All',\n description: 'Flat button [Clear for All] (hard-delete all messages)'\n },\n delete_messages_warning: {\n id: 'delete_messages_warning',\n defaultMessage: 'Are you sure you want to delete all messages for everyone? It cannot be undone.',\n description: 'Alert dialog warning when hard-deleting all messages.'\n },\n leave_chat: {\n id: 'action_leave_chat',\n defaultMessage: 'Leave Conversation',\n description: 'Flat button [Leave Conversation]'\n },\n leave_chat_warning: {\n id: 'leave_chat_warning',\n defaultMessage: 'Are you sure you want to leave this conversation?',\n description: 'Alert dialog warning when unsubscribing from a chat.'\n },\n block_contact: {\n id: 'action_block_contact',\n defaultMessage: \"Block Contact\",\n description: \"Flat button [Block Contact]\"\n },\n block_contact_warning: {\n id: 'block_contact_warning',\n defaultMessage: 'Are you sure you want to block this contact?',\n description: 'Alert dialog warning when blocking a contact.'\n },\n report_chat: {\n id: 'action_report_chat',\n defaultMessage: 'Report Conversation',\n description: 'Flat button [Report Group]'\n },\n report_chat_warning: {\n id: 'report_chat_warning',\n defaultMessage: 'Are you sure you want to block and report this conversation?',\n description: 'Alert dialog warning when reporting a conversation for abuse'\n },\n});\n\nclass InfoView extends React.Component {\n constructor(props) {\n super(props);\n\n this.state = {\n topic: null,\n owner: false,\n admin: false,\n sharer: false,\n deleter: false,\n muted: false,\n address: null,\n groupTopic: undefined,\n channel: 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, // P2P topic, the other user mode given\n modeWant2: null, // P2P topic, the other user mode want\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\n this.resetSubs = this.resetSubs.bind(this);\n this.resetDesc = this.resetDesc.bind(this);\n this.onMetaDesc = this.onMetaDesc.bind(this);\n this.onSubsUpdated = this.onSubsUpdated.bind(this);\n this.onTagsUpdated = this.onTagsUpdated.bind(this);\n this.handleFullNameUpdate = this.handleFullNameUpdate.bind(this);\n this.handlePrivateUpdate = this.handlePrivateUpdate.bind(this);\n this.handleImageChanged = this.handleImageChanged.bind(this);\n this.handleMuted = this.handleMuted.bind(this);\n this.handlePermissionsChanged = this.handlePermissionsChanged.bind(this);\n this.handleLaunchPermissionsEditor = this.handleLaunchPermissionsEditor.bind(this);\n this.handleHidePermissionsEditor = this.handleHidePermissionsEditor.bind(this);\n this.handleShowAddMembers = this.handleShowAddMembers.bind(this);\n this.handleHideAddMembers = this.handleHideAddMembers.bind(this);\n this.handleMemberUpdateRequest = this.handleMemberUpdateRequest.bind(this);\n this.handleDeleteMessages = this.handleDeleteMessages.bind(this);\n this.handleLeave = this.handleLeave.bind(this);\n this.handleBlock = this.handleBlock.bind(this);\n this.handleReport = this.handleReport.bind(this);\n this.handleMemberSelected = this.handleMemberSelected.bind(this);\n this.handleMoreInfo = this.handleMoreInfo.bind(this);\n this.handleTagsUpdated = this.handleTagsUpdated.bind(this);\n this.handleContextMenu = this.handleContextMenu.bind(this);\n }\n\n // No need to separately handle component mount.\n componentDidUpdate(props) {\n const topic = this.props.tinode.getTopic(props.topic);\n if (!topic) {\n return;\n }\n\n if (this.onMetaDesc != topic.onMetaDesc) {\n this.previousMetaDesc = topic.onMetaDesc;\n topic.onMetaDesc = this.onMetaDesc;\n\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({topic: props.topic});\n this.resetDesc(topic, props);\n this.resetSubs(topic, props);\n }\n }\n\n componentWillUnmount() {\n const topic = this.props.tinode.getTopic(this.props.topic);\n if (!topic) {\n return;\n }\n this.setState({topic: null});\n topic.onMetaDesc = this.previousMetaDesc;\n topic.onSubsUpdated = this.previousSubsUpdated;\n topic.onTagsUpdated = this.previousTagsUpdated;\n }\n\n resetSubs(topic, props) {\n const newState = {contactList: []};\n if (topic.getType() == 'p2p') {\n // Fetch the other party in the p2p conversation.\n // Topic may not be ready yet, so check if user is found.\n const user2 = topic.subscriber(props.topic);\n if (user2) {\n newState.modeGiven2 = user2.acs.getGiven();\n newState.modeWant2 = user2.acs.getWant();\n } else {\n newState.modeGiven2 = NO_ACCESS_MODE;\n newState.modeWant2 = NO_ACCESS_MODE;\n }\n } else {\n topic.subscribers((sub) => {\n newState.contactList.push(sub);\n }, this);\n }\n\n this.setState(newState);\n }\n\n resetDesc(topic, props) {\n const defacs = topic.getDefaultAccess() || {};\n const acs = topic.getAccessMode();\n\n this.setState({\n owner: acs && acs.isOwner(),\n admin: acs && acs.isAdmin(),\n sharer: acs && acs.isSharer(),\n deleter: acs && acs.isDeleter(),\n muted: acs && acs.isMuted(),\n\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 channel: topic.isChannel(),\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 // Requesting tags: owner is editing the topic.\n topic.getMeta(topic.startMetaQuery().withTags().build());\n }\n }\n\n onMetaDesc(desc) {\n const topic = this.props.tinode.getTopic(this.props.topic);\n if (!topic) {\n return;\n }\n this.resetDesc(topic, this.props);\n\n if (this.previousMetaDesc && this.previousMetaDesc != this.onMetaDesc) {\n this.previousMetaDesc(desc);\n }\n }\n\n onSubsUpdated(subs) {\n const topic = this.props.tinode.getTopic(this.props.topic);\n if (!topic) {\n return;\n }\n this.resetSubs(topic, this.props);\n\n if (this.previousSubsUpdated && this.previousSubsUpdated != this.onSubsUpdated) {\n this.previousSubsUpdated(subs);\n }\n }\n\n onTagsUpdated(tags) {\n this.setState({tags: tags});\n\n if (this.previousTagsUpdated && this.previousTagsUpdated != this.onTagsUpdated) {\n this.previousTagsUpdated();\n }\n }\n\n handleFullNameUpdate(fn) {\n fn = fn.trim().substring(0, MAX_TITLE_LENGTH);\n if (this.state.fullName !== fn) {\n this.setState({fullName: fn});\n this.props.onTopicDescUpdate(this.props.topic, vcard(fn, null), null);\n }\n }\n\n handlePrivateUpdate(comment) {\n comment = comment.trim().substring(0, MAX_TITLE_LENGTH);\n if (this.state.private !== comment) {\n this.setState({private: comment});\n this.props.onTopicDescUpdate(this.props.topic, null, comment || Tinode.DEL_CHAR);\n }\n }\n\n handleImageChanged(img) {\n this.setState({avatar: img});\n this.props.onTopicDescUpdate(this.props.topic, vcard(null, img || Tinode.DEL_CHAR), null);\n }\n\n handleMuted(ignored, checked) {\n this.setState({muted: checked});\n this.props.onChangePermissions(this.props.topic, checked ? '-P' : '+P');\n }\n\n handlePermissionsChanged(perm) {\n switch (this.state.showPermissionEditorFor) {\n case 'auth':\n this.props.onTopicDescUpdate(this.props.topic, null, null, {auth: perm});\n break;\n case 'anon':\n this.props.onTopicDescUpdate(this.props.topic, null, null, {anon: perm});\n break;\n case 'mode':\n case 'want':\n this.props.onChangePermissions(this.props.topic, perm);\n break;\n case 'given':\n this.props.onChangePermissions(this.props.topic, perm, this.props.topic);\n break;\n case 'user':\n this.props.onChangePermissions(this.props.topic, perm, this.state.userPermissionsEdited);\n break;\n }\n\n this.setState({showPermissionEditorFor: undefined});\n }\n\n handleLaunchPermissionsEditor(which, uid) {\n const {formatMessage} = this.props.intl;\n let toEdit, toCompare, toSkip, titleEdit, titleCompare, userTitle, userAvatar;\n switch (which) {\n case 'mode':\n toEdit = this.state.access;\n break;\n case 'want':\n toEdit = this.state.modeWant;\n toCompare = this.state.modeGiven;\n if (this.state.owner) {\n // Don't allow owner to unset 'O' permission. All other permissions are OK.\n toSkip = 'O';\n } else {\n // Allow accepting any of 'ASDO' permissions but don't allow asking for them.\n toSkip = Tinode.AccessMode.encode(Tinode.AccessMode.diff('ASDO', this.state.modeGiven));\n if (this.state.channel) {\n // Channels are read-only.\n toSkip += 'W';\n }\n }\n titleEdit = formatMessage(messages.requested);\n titleCompare = formatMessage(messages.granted);\n break;\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 = formatMessage(messages.granted);\n titleCompare = formatMessage(messages.requested);\n break;\n case 'auth':\n toEdit = this.state.auth;\n toSkip = 'O';\n break;\n case 'anon':\n toEdit = this.state.anon;\n toSkip = 'O';\n break;\n case 'user': {\n const topic = this.props.tinode.getTopic(this.props.topic);\n if (!topic) {\n return;\n }\n const user = topic.subscriber(uid);\n if (!user || !user.acs) {\n return;\n }\n toEdit = user.acs.getGiven();\n toCompare = user.acs.getWant();\n toSkip = this.state.owner ? '' : 'O';\n titleEdit = formatMessage(messages.granted);\n titleCompare = formatMessage(messages.requested);\n if (user.public) {\n userTitle = user.public.fn;\n userAvatar = user.public.photo;\n }\n break;\n }\n default:\n console.log(\"Unknown permission editing mode '\" + which + \"'\");\n break;\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 handleHidePermissionsEditor() {\n this.setState({showPermissionEditorFor: undefined});\n }\n\n handleShowAddMembers(e) {\n e.preventDefault();\n this.props.onInitFind();\n this.setState({showMemberPanel: true});\n }\n\n handleHideAddMembers() {\n this.setState({showMemberPanel: false});\n }\n\n handleMemberUpdateRequest(members, added, removed) {\n this.props.onMemberUpdateRequest(this.props.topic, added, removed);\n this.setState({showMemberPanel: false});\n }\n\n handleDeleteMessages(e) {\n e.preventDefault();\n const {formatMessage} = this.props.intl;\n this.props.onShowAlert(\n formatMessage(this.state.deleter ? messages.delete_messages : messages.clear_messages), // title\n formatMessage(this.state.deleter ? messages.delete_messages_warning : messages.clear_messages_warning), // content\n (() => { this.props.onDeleteMessages(this.props.topic); }), // onConfirm\n null, // \"OK\"\n true, // Show Reject button\n null // \"Cancel\"\n );\n }\n\n handleLeave(e) {\n e.preventDefault();\n const {formatMessage} = this.props.intl;\n this.props.onShowAlert(\n formatMessage(messages.leave_chat), // title\n formatMessage(messages.leave_chat_warning), // content\n (() => { this.props.onLeaveTopic(this.props.topic); }), // onConfirm\n null, // \"OK\"\n true, // Show Reject button\n null // \"Cancel\"\n );\n }\n\n handleBlock(e) {\n e.preventDefault();\n const {formatMessage} = this.props.intl;\n this.props.onShowAlert(\n formatMessage(messages.block_contact), // title\n formatMessage(messages.block_contact_warning), // content\n (() => { this.props.onBlockTopic(this.props.topic); }), // onConfirm\n null, // \"OK\"\n true, // Show Reject button\n null // \"Cancel\"\n );\n }\n\n handleReport(e) {\n e.preventDefault();\n const {formatMessage} = this.props.intl;\n this.props.onShowAlert(\n formatMessage(messages.report_chat), // title\n formatMessage(messages.report_chat_warning), // content\n (() => { this.props.onReportTopic(this.props.topic); }), // onConfirm\n null, // \"OK\"\n true, // Show Reject button\n null // \"Cancel\"\n );\n }\n\n handleMemberSelected(uid) {\n this.setState({selectedContact: uid});\n }\n\n handleMoreInfo(open) {\n this.setState({moreInfoExpanded: open});\n }\n\n 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 handleContextMenu(params) {\n const {formatMessage} = this.props.intl;\n const instance = this;\n const topic = this.props.tinode.getTopic(this.props.topic);\n if (!topic) {\n return;\n }\n const user = topic.subscriber(params.topicName);\n if (!user || !user.acs) {\n return;\n }\n\n const menuItems = [\n {title: formatMessage(messages.edit_permissions), handler: function() {\n instance.handleLaunchPermissionsEditor('user', params.topicName);\n }},\n 'member_delete',\n user.acs.isMuted() ? 'member_unmute' : 'member_mute',\n user.acs.isJoiner() ? 'member_block' : 'member_unblock'\n ];\n this.props.showContextMenu({\n topicName: this.props.topic,\n x: params.x,\n y: params.y,\n user: params.topicName}, menuItems);\n }\n\n render() {\n const {formatMessage} = this.props.intl;\n\n return (\n
\n
\n
\n \n
\n
\n \n
\n
\n {this.props.displayMobile ?\n : null}\n {this.state.showMemberPanel ?\n \n :\n this.state.showPermissionEditorFor ?\n \n :\n
\n
\n
\n
\n
Unknown}\n readOnly={!this.state.owner}\n value={this.state.fullName}\n required={true}\n onFinished={this.handleFullNameUpdate} />
\n
\n \n
\n
\n {\n (private_placeholder) => \n }\n
\n
\n \n
\n
\n
\n
\n \n \n
\n {\n (more) => \n }\n {this.state.moreInfoExpanded ?\n
\n
\n \n {this.state.address}\n
\n {this.state.groupTopic ?\n
\n \n \n {this.state.access}\n \n
\n :\n
\n
\n \n
\n
\n
\n  \n {this.state.access}\n
\n
{this.state.fullName ? this.state.fullName : formatMessage(messages.other_user)}:\n  \n {this.state.modeGiven2}\n \n
\n
\n
\n }\n {this.state.sharer && (this.state.auth || this.state.anon) ?\n
\n
\n \n
\n
\n
Auth: {this.state.admin ?\n \n {this.state.auth}\n \n :\n {this.state.auth}\n }\n
\n
Anon: {this.state.admin ?\n \n {this.state.anon}\n \n :\n {this.state.anon}\n }\n
\n
\n
\n :\n null\n }\n
\n :\n null\n }\n
\n
\n {this.state.owner ?\n <>\n {\n (tags) => \n }\n
\n \n :\n null\n }\n \n {this.state.groupTopic && this.state.sharer ?\n <>\n
\n
\n
\n \n
\n \n {\n (no_members) => \n }\n
\n \n :\n null\n }\n
\n }\n
\n );\n }\n};\n\nexport default injectIntl(InfoView);\n","// Login form.\nimport React from 'react';\nimport { FormattedMessage } from 'react-intl';\n\nimport CheckBox from '../widgets/checkbox.jsx';\nimport VisiblePassword from '../widgets/visible-password.jsx';\n\nimport LocalStorageUtil from '../lib/local-storage.js';\n\nexport default class LoginView extends React.Component {\n constructor(props) {\n super(props);\n\n this.state = {\n login: props.login,\n password: '',\n hostName: props.serverAddress,\n saveToken: LocalStorageUtil.getObject('keep-logged-in')\n };\n this.handleLoginChange = this.handleLoginChange.bind(this);\n this.handlePasswordChange = this.handlePasswordChange.bind(this);\n this.handleToggleSaveToken = this.handleToggleSaveToken.bind(this);\n this.handleSubmit = this.handleSubmit.bind(this);\n }\n\n handleLoginChange(e) {\n this.setState({login: e.target.value});\n }\n\n handlePasswordChange(e) {\n this.setState({password: e.target.value});\n }\n\n handleToggleSaveToken() {\n LocalStorageUtil.setObject('keep-logged-in', !this.state.saveToken);\n this.setState({saveToken: !this.state.saveToken});\n }\n\n handleSubmit(e) {\n e.preventDefault();\n this.props.onLogin(this.state.login.trim(), this.state.password.trim());\n }\n\n render() {\n var submitClasses = 'blue';\n if (this.props.disabled) {\n submitClasses += ' disabled';\n }\n\n return (\n
\n \n {\n (login_prompt) => \n }\n \n \n {\n (password_prompt) => \n }\n \n
\n \n \n \n \n \n
\n
\n \n
\n
\n );\n }\n};\n/* END Login */\n","/* This is just a static page to display when no conversation is selected. */\nimport React from 'react';\nimport { FormattedMessage } from 'react-intl';\n\nimport Tinode from 'tinode-sdk';\n\nimport { APP_NAME } from '../config.js';\n\nexport default class LogoView extends React.PureComponent {\n render() {\n const version = APP_NAME + ' (' + Tinode.getLibrary() + ')';\n return (\n
\n
\n \n \"logo\"\n

Tinode Web

\n
\n

{version}

\n

{this.props.serverVersion} ({this.props.serverAddress})

\n
\n
\n );\n }\n};\n","import React from 'react';\nimport { FormattedMessage, defineMessages, injectIntl } from 'react-intl';\n\nimport Tinode from 'tinode-sdk';\nconst Drafty = Tinode.Drafty;\n\nimport ChatMessage from '../widgets/chat-message.jsx';\nimport DocPreview from '../widgets/doc-preview.jsx';\nimport ErrorPanel from '../widgets/error-panel.jsx';\nimport GroupSubs from '../widgets/group-subs.jsx';\nimport ImagePreview from '../widgets/image-preview.jsx';\nimport Invitation from '../widgets/invitation.jsx';\nimport LetterTile from '../widgets/letter-tile.jsx';\nimport LoadSpinner from '../widgets/load-spinner.jsx';\nimport LogoView from './logo-view.jsx';\nimport SendMessage from '../widgets/send-message.jsx';\n\nimport { DEFAULT_P2P_ACCESS_MODE, IMAGE_PREVIEW_DIM, KEYPRESS_DELAY, MESSAGES_PAGE,\n MAX_EXTERN_ATTACHMENT_SIZE, MAX_IMAGE_DIM, MAX_INBAND_ATTACHMENT_SIZE, READ_DELAY } from '../config.js';\nimport { SUPPORTED_IMAGE_FORMATS, blobToBase64, filePasted, fileToBase64,\n imageScaled, makeImageUrl } from '../lib/blob-helpers.js';\nimport HashNavigation from '../lib/navigation.js';\nimport { bytesToHumanSize, shortDateFormat } from '../lib/strformat.js';\n\n// Run timer with this frequency (ms) for checking notification queue.\nconst NOTIFICATION_EXEC_INTERVAL = 300;\n\nconst messages = defineMessages({\n 'online_now': {\n id: 'online_now',\n defaultMessage: 'online now',\n description: 'Indicator that the user or topic is currently online',\n },\n 'last_seen': {\n id: 'last_seen_timestamp',\n defaultMessage: 'Last seen',\n description: 'Label for the timestamp of when the user or topic was last online'\n },\n 'not_found': {\n id: 'title_not_found',\n defaultMessage: 'Not found',\n description: 'Title shown when topic is not found'\n },\n 'channel': {\n id: 'channel',\n defaultMessage: 'channel',\n description: 'Subtitle shown for channels in MessagesView instead of last seen'\n }\n});\n\n// Checks if the access permissions are granted but not yet accepted.\nfunction isUnconfirmed(acs) {\n if (acs) {\n const ex = acs.getExcessive() || '';\n return acs.isJoiner('given') && (ex.includes('R') || ex.includes('W'));\n }\n return false;\n}\n\nfunction isPeerRestricted(acs) {\n if (acs) {\n const ms = acs.getMissing() || '';\n return acs.isJoiner('want') && (ms.includes('R') || ms.includes('W'));\n }\n return false;\n}\n\nclass MessagesView extends React.Component {\n constructor(props) {\n super(props);\n\n this.state = MessagesView.getDerivedStateFromProps(props, {});\n\n this.leave = this.leave.bind(this);\n this.sendImageAttachment = this.sendImageAttachment.bind(this);\n this.sendFileAttachment = this.sendFileAttachment.bind(this);\n this.sendKeyPress = this.sendKeyPress.bind(this);\n this.handleScrollReference = this.handleScrollReference.bind(this);\n this.handleScrollEvent = this.handleScrollEvent.bind(this);\n this.handleDescChange = this.handleDescChange.bind(this);\n this.handleSubsUpdated = this.handleSubsUpdated.bind(this);\n this.handleNewMessage = this.handleNewMessage.bind(this);\n this.handleAllMessagesReceived = this.handleAllMessagesReceived.bind(this);\n this.handleInfoReceipt = this.handleInfoReceipt.bind(this);\n this.handleImagePostview = this.handleImagePostview.bind(this);\n this.handleClosePreview = this.handleClosePreview.bind(this);\n this.handleFormResponse = this.handleFormResponse.bind(this);\n this.handleContextClick = this.handleContextClick.bind(this);\n this.handleShowContextMenuMessage = this.handleShowContextMenuMessage.bind(this);\n this.handleNewChatAcceptance = this.handleNewChatAcceptance.bind(this);\n this.handleEnablePeer = this.handleEnablePeer.bind(this);\n this.handleAttachFile = this.handleAttachFile.bind(this);\n this.handleAttachImage = this.handleAttachImage.bind(this);\n this.handleCancelUpload = this.handleCancelUpload.bind(this);\n this.postReadNotification = this.postReadNotification.bind(this);\n this.clearNotificationQueue = this.clearNotificationQueue.bind(this);\n\n this.readNotificationQueue = [];\n this.readNotificationTimer = null;\n }\n\n componentDidMount() {\n // this.propsChange(this.props, this.state);\n if (this.messagesScroller) {\n this.messagesScroller.addEventListener('scroll', this.handleScrollEvent);\n }\n }\n\n componentWillUnmount() {\n if (this.messagesScroller) {\n this.messagesScroller.removeEventListener('scroll', this.handleScrollEvent);\n }\n\n // Flush all notifications.\n this.clearNotificationQueue();\n }\n\n // Scroll last message into view on component update e.g. on message received\n // or vertical shrinking.\n componentDidUpdate(prevProps, prevState) {\n if (this.messagesScroller) {\n if (prevState.topic != this.state.topic || prevState.messages.length != this.state.messages.length) {\n // New message\n this.messagesScroller.scrollTop = this.messagesScroller.scrollHeight - this.state.scrollPosition;\n } else if (prevProps.viewportHeight > this.props.viewportHeight) {\n // Componet changed height.\n this.messagesScroller.scrollTop += prevProps.viewportHeight - this.props.viewportHeight;\n }\n }\n\n const topic = this.props.tinode.getTopic(this.state.topic);\n if (this.state.topic != prevState.topic) {\n if (prevState.topic && !Tinode.isNewGroupTopicName(prevState.topic)) {\n this.leave(prevState.topic);\n }\n\n if (topic) {\n topic.onData = this.handleNewMessage;\n topic.onAllMessagesReceived = this.handleAllMessagesReceived;\n topic.onInfo = this.handleInfoReceipt;\n topic.onMetaDesc = this.handleDescChange;\n topic.onSubsUpdated = this.handleSubsUpdated;\n topic.onPres = this.handleSubsUpdated;\n }\n }\n\n if (!this.props.applicationVisible) {\n // If application is not visible, flush all unsent 'read' notifications.\n this.clearNotificationQueue();\n } else {\n // Otherwise assume there are unread messages.\n this.postReadNotification(0);\n }\n\n if (topic && !topic.isSubscribed() && this.props.ready &&\n ((this.state.topic != prevState.topic) || !prevProps.ready)) {\n // Is this a new topic?\n const newTopic = (this.props.newTopicParams && this.props.newTopicParams._topicName == this.props.topic);\n\n // Don't request the tags. They are useless unless the user\n // is the owner and is editing the topic.\n let getQuery = topic.startMetaQuery().withLaterDesc();\n if (this.state.isSharer || (newTopic && !topic.isChannel())) {\n // Request subscriptions only if one of S,O,A is given or it's a new non-channel topic.\n getQuery = getQuery.withLaterSub();\n }\n if (this.state.isReader || newTopic) {\n // Reading is either permitted or we don't know because it's a new topic. Ask for messages.\n getQuery = getQuery.withLaterData(MESSAGES_PAGE);\n if (this.state.isReader) {\n getQuery = getQuery.withLaterDel();\n }\n // And show \"loading\" spinner.\n this.setState({ fetchingMessages: true });\n }\n const setQuery = newTopic ? this.props.newTopicParams : undefined;\n topic.subscribe(getQuery.build(), setQuery)\n .then((ctrl) => {\n if (ctrl.code == 303) {\n // Redirect to another topic requested.\n HashNavigation.navigateTo(HashNavigation.setUrlTopic('', ctrl.params.topic));\n return;\n }\n if (this.state.topic != ctrl.topic) {\n this.setState({topic: ctrl.topic});\n }\n this.props.onNewTopicCreated(this.props.topic, ctrl.topic);\n // If there are unsent messages, try sending them now.\n topic.queuedMessages((pub) => {\n if (!pub._sending && topic.isSubscribed()) {\n topic.publishMessage(pub);\n }\n });\n })\n .catch((err) => {\n console.log(\"Failed subscription to\", this.state.topic);\n this.props.onError(err.message, 'err');\n const blankState = MessagesView.getDerivedStateFromProps({}, {});\n blankState.title = this.props.intl.formatMessage(messages.not_found);\n this.setState(blankState);\n });\n }\n }\n\n static getDerivedStateFromProps(nextProps, prevState) {\n let nextState = {};\n if (!nextProps.topic) {\n // Default state: no topic.\n nextState = {\n messages: [],\n onlineSubs: [],\n topic: null,\n title: '',\n avatar: null,\n docPreview: null,\n imagePreview: null,\n imagePostview: null,\n typingIndicator: false,\n scrollPosition: 0,\n fetchingMessages: false,\n peerMessagingDisabled: false,\n channel: false\n };\n } else if (nextProps.topic != prevState.topic) {\n const topic = nextProps.tinode.getTopic(nextProps.topic);\n nextState = {\n topic: nextProps.topic,\n docPreview: null,\n imagePreview: null,\n imagePostview: null,\n typingIndicator: false,\n scrollPosition: 0,\n fetchingMessages: false\n };\n\n if (topic) {\n // Topic exists.\n const msgs = [];\n const subs = [];\n\n if (nextProps.connected) {\n topic.subscribers((sub) => {\n if (sub.online && sub.user != nextProps.myUserId) {\n subs.push(sub);\n }\n });\n }\n\n topic.messages(function(msg) {\n if (!msg.deleted) {\n msgs.push(msg);\n }\n });\n\n Object.assign(nextState, {\n messages: msgs,\n onlineSubs: subs\n });\n\n if (topic.public) {\n Object.assign(nextState, {\n title: topic.public.fn,\n avatar: makeImageUrl(topic.public.photo)\n });\n } else {\n Object.assign(nextState, {\n title: '',\n avatar: null\n });\n }\n\n const peer = topic.p2pPeerDesc();\n if (peer) {\n Object.assign(nextState, {\n peerMessagingDisabled: isPeerRestricted(peer.acs)\n });\n } else if (prevState.peerMessagingDisabled) {\n Object.assign(nextState, {\n peerMessagingDisabled: false\n });\n }\n Object.assign(nextState, {\n channel: topic.isChannel()\n });\n } else {\n // Invalid topic.\n Object.assign(nextState, {\n messages: [],\n onlineSubs: [],\n title: '',\n avatar: null,\n peerMessagingDisabled: false,\n channel: false\n });\n }\n }\n\n if (nextProps.acs) {\n if (nextProps.acs.isWriter() != prevState.isWriter) {\n nextState.isWriter = !prevState.isWriter;\n }\n if (nextProps.acs.isReader() != prevState.isReader) {\n nextState.isReader = !prevState.isReader;\n }\n if (!nextProps.acs.isReader('given') != prevState.readingBlocked) {\n nextState.readingBlocked = !prevState.readingBlocked;\n }\n if (nextProps.acs.isSharer() != prevState.isSharer) {\n nextState.isSharer = !prevState.isSharer;\n }\n } else {\n if (prevState.isWriter) {\n nextState.isWriter = false;\n }\n if (prevState.isReader) {\n nextState.isReader = false;\n }\n if (!prevState.readingBlocked) {\n prevState.readingBlocked = true;\n }\n if (prevState.isSharer) {\n nextState.isSharer = false;\n }\n }\n\n if (isUnconfirmed(nextProps.acs) == !prevState.unconformed) {\n nextState.unconfirmed = !prevState.unconformed;\n }\n\n // Clear subscribers online when there is no connection.\n if (!nextProps.connected && prevState.onlineSubs && prevState.onlineSubs.length > 0) {\n nextState.onlineSubs = [];\n }\n\n return nextState;\n }\n\n leave(oldTopicName) {\n if (!oldTopicName) {\n return;\n }\n let oldTopic = this.props.tinode.getTopic(oldTopicName);\n if (oldTopic && oldTopic.isSubscribed()) {\n oldTopic.leave(false)\n .catch(() => { /* do nothing here */ })\n .finally(() => {\n // We don't care if the request succeeded or failed.\n // The topic is dead regardless.\n this.setState({fetchingMessages: false});\n oldTopic.onData = undefined;\n oldTopic.onAllMessagesReceived = undefined;\n oldTopic.onInfo = undefined;\n oldTopic.onMetaDesc = undefined;\n oldTopic.onSubsUpdated = undefined;\n oldTopic.onPres = undefined;\n });\n }\n }\n\n handleScrollReference(node) {\n if (node) {\n node.addEventListener('scroll', this.handleScrollEvent);\n this.messagesScroller = node;\n this.messagesScroller.scrollTop = this.messagesScroller.scrollHeight - this.state.scrollPosition;\n }\n }\n\n // Get older messages\n handleScrollEvent(event) {\n this.setState({scrollPosition: event.target.scrollHeight - event.target.scrollTop});\n if (event.target.scrollTop <= 0) {\n this.setState((prevState, props) => {\n const newState = {};\n if (!prevState.fetchingMessages) {\n const topic = this.props.tinode.getTopic(this.state.topic);\n if (topic && topic.isSubscribed() && topic.msgHasMoreMessages()) {\n newState.fetchingMessages = true;\n topic.getMessagesPage(MESSAGES_PAGE).catch((err) => {\n this.setState({fetchingMessages: false});\n this.props.onError(err.message, 'err');\n });\n }\n }\n return newState;\n });\n }\n }\n\n handleDescChange(desc) {\n if (desc.public) {\n this.setState({\n title: desc.public.fn,\n avatar: makeImageUrl(desc.public.photo)\n });\n } else {\n this.setState({\n title: '',\n avatar: null\n });\n }\n\n if (desc.acs) {\n this.setState({\n isWriter: desc.acs.isWriter(),\n isReader: desc.acs.isReader(),\n readingBlocked: !desc.acs.isReader('given'),\n unconfirmed: isUnconfirmed(desc.acs),\n });\n }\n }\n\n postReadNotification(seq) {\n // Ignore notifications if the app is invisible.\n if (!this.props.applicationVisible) {\n return;\n }\n\n // Set up the timer if it's not running already.\n if (!this.readNotificationTimer) {\n this.readNotificationTimer = setInterval(() => {\n if (this.readNotificationQueue.length == 0) {\n // Shut down the timer if the queue is empty.\n clearInterval(this.readNotificationTimer);\n this.readNotificationTimer = null;\n return;\n }\n\n let seq = -1;\n while (this.readNotificationQueue.length > 0) {\n const n = this.readNotificationQueue[0];\n if (n.topicName != this.state.topic) {\n // Topic has changed. Drop the notification.\n this.readNotificationQueue.shift();\n continue;\n }\n\n const now = new Date();\n if (n.sendAt <= now) {\n // Remove expired notification from queue.\n this.readNotificationQueue.shift();\n seq = Math.max(seq, n.seq);\n } else {\n break;\n }\n }\n\n // Send only one notification for the whole batch of messages.\n if (seq >= 0) {\n const topic = this.props.tinode.getTopic(this.state.topic);\n if (topic) {\n topic.noteRead(seq);\n }\n }\n }, NOTIFICATION_EXEC_INTERVAL);\n }\n\n const now = new Date();\n this.readNotificationQueue.push({\n topicName: this.state.topic,\n seq: seq,\n sendAt: now.setMilliseconds(now.getMilliseconds() + READ_DELAY)\n });\n }\n\n // Clear notification queue and timer.\n clearNotificationQueue() {\n this.readNotificationQueue = [];\n if (this.readNotificationTimer) {\n clearInterval(this.readNotificationTimer);\n this.readNotificationTimer = null;\n }\n }\n\n handleSubsUpdated() {\n if (this.state.topic) {\n const subs = [];\n const topic = this.props.tinode.getTopic(this.state.topic);\n topic.subscribers((sub) => {\n if (sub.online && sub.user != this.props.myUserId) {\n subs.push(sub);\n }\n });\n const newState = {onlineSubs: subs};\n const peer = topic.p2pPeerDesc();\n if (peer) {\n Object.assign(newState, {\n peerMessagingDisabled: isPeerRestricted(peer.acs)\n });\n } else if (this.state.peerMessagingDisabled) {\n Object.assign(newState, {\n peerMessagingDisabled: false\n });\n }\n this.setState(newState);\n }\n }\n\n handleNewMessage(msg) {\n // Regenerate messages list\n const topic = this.props.tinode.getTopic(this.state.topic);\n const newState = {messages: []};\n topic.messages((m) => {\n if (!m.deleted) {\n newState.messages.push(m);\n }\n });\n\n // msg could be null if one or more messages were deleted.\n if (msg && !msg.deleted) {\n // If the message is added to the end of the message list,\n // scroll to the bottom.\n if (topic.isNewMessage(msg.seq)) {\n newState.scrollPosition = 0;\n }\n\n // Aknowledge messages except own messages. They are\n // automatically assumed to be read and recived.\n const status = topic.msgStatus(msg);\n if (status >= Tinode.MESSAGE_STATUS_SENT && msg.from != this.props.myUserId) {\n this.postReadNotification(msg.seq);\n }\n this.props.onData(msg);\n }\n this.setState(newState);\n }\n\n handleAllMessagesReceived(count) {\n this.setState({fetchingMessages: false});\n if (count > 0) {\n // 0 means \"latest\".\n this.postReadNotification(0);\n }\n }\n\n handleInfoReceipt(info) {\n switch (info.what) {\n case 'kp': {\n clearTimeout(this.keyPressTimer);\n var instance = this;\n this.keyPressTimer = setTimeout(function() {\n instance.setState({typingIndicator: false});\n }, KEYPRESS_DELAY + 1000);\n if (!this.state.typingIndicator) {\n this.setState({typingIndicator: true});\n }\n break;\n }\n case 'read':\n case 'recv':\n // Redraw due to changed recv/read status.\n this.forceUpdate();\n break;\n default:\n console.log(\"Other change in topic: \", info.what);\n }\n }\n\n handleImagePostview(content) {\n this.setState({ imagePostview: content });\n }\n\n handleClosePreview() {\n if (this.state.imagePreview && this.state.imagePreview.url) {\n URL.revokeObjectURL(this.state.imagePreview.url);\n }\n this.setState({ imagePostview: null, imagePreview: null, docPreview: null });\n }\n\n handleFormResponse(action, text, data) {\n if (action == 'pub') {\n this.props.sendMessage(Drafty.attachJSON(Drafty.parse(text), data));\n } else if (action == 'url') {\n const url = new URL(data.ref);\n const params = url.searchParams;\n for (let key in data.resp) {\n if (data.resp.hasOwnProperty(key)) {\n params.set(key, data.resp[key]);\n }\n }\n ['name', 'seq'].map(function(key) {\n if (data[key]) {\n params.set(key, data[key]);\n }\n });\n params.set('uid', this.props.myUserId);\n url.search = params;\n window.open(url, '_blank');\n } else {\n console.log(\"Unknown action in form\", action);\n }\n }\n\n handleContextClick(e) {\n e.preventDefault();\n e.stopPropagation();\n this.props.showContextMenu({ topicName: this.state.topic, y: e.pageY, x: e.pageX });\n }\n\n handleShowContextMenuMessage(params, messageSpecificMenuItems) {\n params.topicName = this.state.topic;\n const menuItems = messageSpecificMenuItems || [];\n const topic = this.props.tinode.getTopic(params.topicName);\n if (topic) {\n if (!topic.isChannel()) {\n menuItems.push('message_delete');\n }\n const acs = topic.getAccessMode();\n if (acs && acs.isDeleter()) {\n menuItems.push('message_delete_hard');\n }\n }\n this.props.showContextMenu(params, menuItems);\n }\n\n handleNewChatAcceptance(action) {\n this.props.onNewChat(this.state.topic, action);\n }\n\n handleEnablePeer(e) {\n e.preventDefault();\n this.props.onChangePermissions(this.state.topic, DEFAULT_P2P_ACCESS_MODE, this.state.topic);\n }\n\n sendKeyPress() {\n const topic = this.props.tinode.getTopic(this.state.topic);\n if (topic.isSubscribed()) {\n topic.noteKeyPress();\n }\n }\n\n // Send attachment as Drafty message:\n // - if file is too large, upload it and send a s link.\n // - if file is small enough, just send it in-band.\n sendFileAttachment(file) {\n // Server-provided limit reduced for base64 encoding and overhead.\n const maxInbandAttachmentSize = (this.props.tinode.getServerLimit('maxMessageSize',\n MAX_INBAND_ATTACHMENT_SIZE) * 0.75 - 1024) | 0;\n\n if (file.size > maxInbandAttachmentSize) {\n // Too large to send inband - uploading out of band and sending as a link.\n const uploader = this.props.tinode.getLargeFileHelper();\n if (!uploader) {\n this.props.onError(this.props.intl.formatMessage(messages.cannot_initiate_upload));\n return;\n }\n const uploadCompletionPromise = uploader.upload(file);\n const msg = Drafty.attachFile(null, {\n mime: file.type,\n filename: file.name,\n size: file.size,\n urlPromise: uploadCompletionPromise\n });\n // Pass data and the uploader to the TinodeWeb.\n this.props.sendMessage(msg, uploadCompletionPromise, uploader);\n } else {\n // Small enough to send inband.\n fileToBase64(file,\n (mime, bits, fname) => {\n this.props.sendMessage(Drafty.attachFile(null, {mime: mime, data: bits, filename: fname}));\n },\n this.props.onError\n );\n }\n }\n\n // handleAttachFile method is called when [Attach file] button is clicked.\n handleAttachFile(file) {\n const maxExternAttachmentSize = this.props.tinode.getServerLimit('maxFileUploadSize', MAX_EXTERN_ATTACHMENT_SIZE);\n\n if (file.size > maxExternAttachmentSize) {\n // Too large.\n this.props.onError(this.props.intl.formatMessage({id: 'file_attachment_too_large'},\n {size: bytesToHumanSize(file.size), limit: bytesToHumanSize(maxExternAttachmentSize)}), 'err');\n } else {\n this.setState({ docPreview: {\n file: file,\n filename: file.name,\n size: file.size,\n type: file.type\n }});\n }\n }\n\n // sendImageAttachment sends the image bits inband as Drafty message.\n sendImageAttachment(caption, blob) {\n const mime = this.state.imagePreview.type;\n const width = this.state.imagePreview.width;\n const height = this.state.imagePreview.height;\n const fname = this.state.imagePreview.filename;\n\n // Server-provided limit reduced for base64 encoding and overhead.\n const maxInbandAttachmentSize = (this.props.tinode.getServerLimit('maxMessageSize',\n MAX_INBAND_ATTACHMENT_SIZE) * 0.75 - 1024) | 0;\n\n if (blob.size > maxInbandAttachmentSize) {\n // Too large to send inband - uploading out of band and sending as a link.\n const uploader = this.props.tinode.getLargeFileHelper();\n if (!uploader) {\n this.props.onError(this.props.intl.formatMessage(messages.cannot_initiate_upload));\n return;\n }\n const uploadCompletionPromise = uploader.upload(blob);\n\n // Make small preview to show while uploading.\n imageScaled(blob, IMAGE_PREVIEW_DIM, IMAGE_PREVIEW_DIM, -1, false,\n (tinyBlob) => {\n // Convert tiny image into base64 for serialization and previewing.\n blobToBase64(tinyBlob, (blobMime, tinyBits64) => {\n let msg = Drafty.insertImage(null, 0, {\n mime: mime,\n _tempPreview: tinyBits64, // This preview will not be serialized.\n width: width,\n height: height,\n filename: fname,\n size: blob.size,\n urlPromise: uploadCompletionPromise\n });\n if (caption) {\n msg = Drafty.appendLineBreak(msg);\n msg = Drafty.append(msg, Drafty.init(caption));\n }\n // Pass data and the uploader to the TinodeWeb.\n this.props.sendMessage(msg, uploadCompletionPromise, uploader);\n }\n )},\n // Failure\n (err) => {\n this.props.onError(err, 'err');\n }\n );\n return;\n }\n\n // Upload the image if it's too big to be send inband.\n blobToBase64(blob, (blobMime, bits64) => {\n let msg = Drafty.insertImage(null, 0, {\n mime: blobMime,\n preview: bits64, // Serializable preview\n width: width,\n height: height,\n filename: fname,\n size: blob.size\n });\n if (caption) {\n msg = Drafty.appendLineBreak(msg);\n msg = Drafty.append(msg, Drafty.init(caption));\n }\n this.props.sendMessage(msg);\n });\n }\n\n // handleAttachImage method is called when [Attach image] button is clicked.\n handleAttachImage(file) {\n const maxExternAttachmentSize = this.props.tinode.getServerLimit('maxFileUploadSize', MAX_EXTERN_ATTACHMENT_SIZE);\n\n // Get image dimensions and size, optionally scale it down.\n imageScaled(file, MAX_IMAGE_DIM, MAX_IMAGE_DIM, maxExternAttachmentSize, false,\n // Success\n (blob, mime, width, height, fname) => {\n this.setState({imagePreview: {\n url: URL.createObjectURL(blob),\n blob: blob,\n filename: fname,\n width: width,\n height: height,\n size: blob.size,\n type: mime\n }});\n },\n // Failure\n (err) => {\n this.props.onError(err, 'err');\n }\n );\n }\n\n handleCancelUpload(seq, uploader) {\n const found = this.state.messages.find(msg => msg.seq == seq);\n if (found) {\n found._cancelled = true;\n }\n uploader.cancel();\n }\n\n render() {\n const {formatMessage} = this.props.intl;\n\n let component;\n if (this.props.hideSelf) {\n component = null;\n } else if (!this.state.topic) {\n component = (\n \n );\n } else {\n let component2;\n if (this.state.imagePreview) {\n // Preview image before sending.\n component2 = (\n \n );\n } else if (this.state.imagePostview) {\n // Expand received image.\n component2 = (\n \n );\n } else if (this.state.docPreview) {\n // Preview attachment before sending.\n component2 = (\n \n );\n } else {\n const topic = this.props.tinode.getTopic(this.state.topic);\n const isChannel = topic.isChannel();\n const groupTopic = topic.getType() == 'grp' && !isChannel;\n let messageNodes = [];\n let previousFrom = null;\n let chatBoxClass = null;\n for (let i=0; i\n );\n }\n\n let lastSeen = null;\n if (isChannel) {\n lastSeen = formatMessage(messages.channel);\n } else {\n const cont = this.props.tinode.getMeTopic().getContact(this.state.topic);\n if (cont && Tinode.isP2PTopicName(cont.topic)) {\n if (cont.online) {\n lastSeen = formatMessage(messages.online_now);\n } else if (cont.seen) {\n lastSeen = formatMessage(messages.last_seen) + \": \" +\n shortDateFormat(cont.seen.when, this.props.intl.locale);\n // TODO: also handle user agent in c.seen.ua\n }\n }\n }\n const avatar = this.state.avatar || true;\n const online = this.props.online ? 'online' + (this.state.typingIndicator ? ' typing' : '') : 'offline';\n\n component2 = (\n <>\n
\n {this.props.displayMobile ?\n {e.preventDefault(); this.props.onHideMessagesView();}}>\n arrow_back\n \n :\n null}\n
\n \n {!isChannel ? : null}\n
\n
\n
{\n this.state.title ||\n \n }
\n
{lastSeen}
\n
\n {groupTopic ?\n :\n
\n }\n \n
\n {this.props.displayMobile ?\n \n : null}\n \n
\n
\n
    \n {messageNodes}\n
\n
\n {!this.state.isReader ?\n
\n {this.state.readingBlocked ?\n
\n \n
\n : null }\n
\n : null }\n
\n {this.state.peerMessagingDisabled && !this.state.unconfirmed ?\n
\n block .\n
: null}\n {this.state.unconfirmed ?\n \n :\n }\n \n );\n }\n\n component =
{component2}
\n }\n return component;\n }\n};\n\nexport default injectIntl(MessagesView);\n","// Create new topic and invite users or send an invite.\nimport React from 'react';\nimport { FormattedMessage, defineMessages, injectIntl } from 'react-intl';\n\nimport Tinode from 'tinode-sdk';\n\nimport ContactList from '../widgets/contact-list.jsx';\nimport NewTopicById from '../widgets/new-topic-by-id.jsx';\nimport NewTopicGroup from '../widgets/new-topic-group.jsx';\nimport SearchContacts from '../widgets/search-contacts.jsx';\n\nimport HashNavigation from '../lib/navigation.js';\nimport { vcard } from '../lib/utils.js';\n\nconst messages = defineMessages({\n search_for_contacts: {\n id: \"search_for_contacts\",\n defaultMessage: \"Use search to find contacts\",\n description: \"Text shown in contacts view when user entered no search query.\"\n },\n search_no_results: {\n id: \"search_no_results\",\n defaultMessage: \"Search returned no results\",\n description: \"Text shown in contacts view when query returned no results.\"\n }\n});\n\nclass NewTopicView extends React.Component {\n constructor(props) {\n super(props);\n\n this.state = {\n tabSelected: 'p2p',\n searchQuery: null\n };\n\n this.handleTabClick = this.handleTabClick.bind(this);\n this.handleSearchContacts = this.handleSearchContacts.bind(this);\n this.handleContactSelected = this.handleContactSelected.bind(this);\n this.handleNewGroupSubmit = this.handleNewGroupSubmit.bind(this);\n this.handleGroupByID = this.handleGroupByID.bind(this);\n }\n\n componentDidMount() {\n this.props.onInitFind();\n }\n\n handleTabClick(e) {\n e.preventDefault();\n HashNavigation.navigateTo(HashNavigation.addUrlParam(window.location.hash, 'tab', e.currentTarget.dataset.id));\n this.setState({tabSelected: e.currentTarget.dataset.id});\n }\n\n handleSearchContacts(query) {\n this.props.onSearchContacts(query);\n this.setState({searchQuery: Tinode.isNullValue(query) ? null : query});\n }\n\n handleContactSelected(sel) {\n if (this.state.tabSelected === 'p2p') {\n HashNavigation.navigateTo(HashNavigation.removeUrlParam(window.location.hash, 'tab'));\n this.props.onCreateTopic(sel);\n }\n }\n\n handleNewGroupSubmit(name, dataUrl, priv, tags, isChannel) {\n HashNavigation.navigateTo(HashNavigation.removeUrlParam(window.location.hash, 'tab'));\n this.props.onCreateTopic(undefined, vcard(name, dataUrl), priv, tags, isChannel);\n }\n\n handleGroupByID(topicName) {\n HashNavigation.navigateTo(HashNavigation.removeUrlParam(window.location.hash, 'tab'));\n this.props.onCreateTopic(topicName);\n }\n\n render() {\n const {formatMessage} = this.props.intl;\n const no_contacts_placeholder = formatMessage(this.state.searchQuery ?\n messages.search_no_results : messages.search_for_contacts);\n return (\n
\n \n {this.state.tabSelected === 'grp' ?\n :\n this.state.tabSelected === 'byid' ?\n :\n
\n \n \n
}\n
\n );\n }\n};\n\nexport default injectIntl(NewTopicView);\n","// A password reset form.\nimport React from 'react';\nimport { FormattedMessage } from 'react-intl';\n\nimport VisiblePassword from '../widgets/visible-password.jsx';\n\nimport HashNavigation from '../lib/navigation.js';\n\nexport default class PasswordResetView extends React.PureComponent {\n constructor(props) {\n super(props);\n\n this.state = {\n email: '',\n password: ''\n };\n\n this.handleSubmit = this.handleSubmit.bind(this);\n this.handleEmailChange = this.handleEmailChange.bind(this);\n this.handlePasswordChange = this.handlePasswordChange.bind(this);\n }\n\n componentDidMount() {\n let parsed = HashNavigation.parseUrlHash(window.location.hash);\n this.setState({token: parsed.params.token, scheme: parsed.params.scheme});\n }\n\n handleSubmit(e) {\n e.preventDefault();\n if (this.state.token) {\n this.props.onReset(this.state.scheme, this.state.password.trim(), this.state.token);\n } else {\n this.props.onRequest('email', this.state.email.trim());\n }\n }\n\n handleEmailChange(e) {\n this.setState({email: e.target.value});\n }\n\n handlePasswordChange(e) {\n this.setState({password: e.target.value});\n }\n\n render() {\n let reset = (this.state.token && this.state.scheme);\n return (\n
\n {reset ?\n {\n (placeholder) => \n }\n :\n <>\n \n {\n (placeholder) => \n }\n \n }\n
\n \n
\n
\n );\n }\n}\n","// Tinode config panel.\nimport React from 'react';\nimport { FormattedMessage } from 'react-intl';\n\nimport HostSelector from '../widgets/host-selector.jsx';\n\nexport default class SettingsView extends React.PureComponent {\n constructor(props) {\n super(props);\n\n this.state = {\n transport: props.transport || 'def',\n serverAddress: props.serverAddress,\n };\n\n this.handleSubmit = this.handleSubmit.bind(this);\n this.handleTransportSelected = this.handleTransportSelected.bind(this);\n this.handleServerAddressChange = this.handleServerAddressChange.bind(this);\n }\n\n handleSubmit(e) {\n e.preventDefault();\n this.props.onUpdate({\n transport: this.state.transport,\n serverAddress: this.state.serverAddress\n });\n }\n\n handleTransportSelected(e) {\n this.setState({transport: e.currentTarget.value});\n }\n\n handleServerAddressChange(name) {\n this.setState({serverAddress: name});\n }\n\n render() {\n const names = {def: \"default\", ws: \"websocket\", lp: \"long polling\"};\n var transportOptions = [];\n var instance = this;\n ['def', 'ws', 'lp'].map(function(item) {\n var id = 'transport-' + item;\n var name = names[item];\n transportOptions.push(\n
  • \n \n \n
  • \n );\n });\n\n return (\n
    \n
    \n \n
    \n \n
    \n \n
    \n
    \n
      \n {transportOptions}\n
    \n
    \n
    \n \n
    \n \n );\n }\n};\n","import React from 'react';\nimport { defineMessages, injectIntl } from 'react-intl';\n\nimport ErrorPanel from '../widgets/error-panel.jsx';\nimport LoadSpinner from '../widgets/load-spinner.jsx';\nimport SideNavbar from '../widgets/side-navbar.jsx';\n\nimport ContactsView from './contacts-view.jsx';\nimport CreateAccountView from './create-account-view.jsx';\nimport EditAccountView from './edit-account-view.jsx';\nimport AccGeneralView from './acc-general-view.jsx';\nimport AccNotificationsView from './acc-notifications-view.jsx';\nimport AccSecurityView from './acc-security-view.jsx';\nimport AccSupportView from './acc-support-view.jsx';\nimport LoginView from './login-view.jsx';\nimport NewTopicView from './new-topic-view.jsx';\nimport PasswordResetView from './password-reset-view.jsx';\nimport SettingsView from './settings-view.jsx';\nimport ValidationView from './validation-view.jsx';\n\n// Panel titles for translation.\nconst messages = defineMessages({\n 'login': {\n id: 'sidepanel_title_login',\n description: 'Sidepanel title for LoginView.',\n defaultMessage: 'Sign In'\n },\n 'register': {\n id: 'sidepanel_title_register',\n description: 'Sidepanel title for CreateAccountView.',\n defaultMessage: 'Create Account'\n },\n 'settings': {\n id: 'sidepanel_title_settings',\n description: 'Sidepanel title for SettingsView.',\n defaultMessage: 'Settings'\n },\n 'edit': {\n id: 'sidepanel_title_account_settings',\n description: 'Sidepanel title for EditAccountView.',\n defaultMessage: 'Account Settings'\n },\n 'general': {\n id: 'sidepanel_title_acc_general',\n description: 'Sidepanel title for AccGeneralView.',\n defaultMessage: 'General'\n },\n 'security': {\n id: 'sidepanel_title_acc_security',\n description: 'Sidepanel title for AccSecurityView.',\n defaultMessage: 'Security'\n },\n 'notif': {\n id: 'sidepanel_title_acc_notifications',\n description: 'Sidepanel title for AccNotificationsView.',\n defaultMessage: 'Notifications'\n },\n 'support': {\n id: 'sidepanel_title_acc_support',\n description: 'Sidepanel title for AccSupportView.',\n defaultMessage: 'Support'\n },\n 'newtpk': {\n id: 'sidepanel_title_newtpk',\n description: 'Sidepanel title for NewTopicView.',\n defaultMessage: 'Start New Chat'\n },\n 'cred': {\n id: 'sidepanel_title_cred',\n description: 'Sidepanel title for ValidationView.',\n defaultMessage: 'Confirm Credentials'\n },\n 'reset': {\n id: 'sidepanel_title_reset',\n description: 'Sidepanel title for PasswordResetView.',\n defaultMessage: 'Reset Password'\n },\n 'archive': {\n id: 'sidepanel_title_archive',\n description: 'Sidepanel title for ContactsView-Archive.',\n defaultMessage: 'Archived Chats'\n },\n 'blocked': {\n id: 'sidepanel_title_blocked',\n description: 'Sidepanel title for ContactsView-Blocked.',\n defaultMessage: 'Blocked Chats'\n }\n});\n\nclass SidepanelView extends React.Component {\n constructor(props) {\n super(props);\n\n this.handleLoginRequested = this.handleLoginRequested.bind(this);\n this.handleNewTopic = this.handleNewTopic.bind(this);\n }\n\n handleLoginRequested(login, password) {\n this.props.onLoginRequest(login, password);\n }\n\n handleNewTopic() {\n this.props.onBasicNavigate('newtpk');\n }\n\n render() {\n const {formatMessage} = this.props.intl;\n const view = this.props.state || (this.props.myUserId ? 'contacts' : 'login');\n\n let title, avatar;\n if (view == 'contacts') {\n title = this.props.title;\n avatar = this.props.avatar ? this.props.avatar : true;\n } else {\n title = formatMessage(messages[view]);\n avatar = false;\n }\n\n let onCancel;\n if (['login', 'contacts'].indexOf(view) == -1) {\n onCancel = this.props.onCancel;\n }\n\n return (\n
    \n \n\n \n\n \n\n {view === 'login' ?\n :\n\n view === 'register' ?\n :\n\n view === 'settings' ?\n :\n\n view === 'edit' ?\n :\n\n view === 'general' ?\n :\n\n view === 'notif' ?\n :\n\n view === 'security' ?\n :\n\n view === 'support' ?\n :\n\n (view === 'contacts' || view == 'archive' || view == 'blocked') ?\n :\n\n view === 'newtpk' ?\n :\n\n view === 'cred' ?\n :\n\n view === 'reset' ?\n :\n null}\n
    \n );\n }\n};\n\nexport default injectIntl(SidepanelView);\n","// The top-level class to hold all functionality together.\nimport React from 'react';\nimport ReactDOM from 'react-dom';\nimport { FormattedMessage, defineMessages, injectIntl } from 'react-intl';\n\nimport * as firebase from 'firebase/app';\nimport 'firebase/messaging';\n\nimport Tinode from 'tinode-sdk';\n\nimport Alert from '../widgets/alert.jsx';\nimport ContextMenu from '../widgets/context-menu.jsx';\n\nimport InfoView from './info-view.jsx';\nimport MessagesView from './messages-view.jsx';\nimport SidepanelView from './sidepanel-view.jsx';\n\nimport { API_KEY, APP_NAME, DEFAULT_P2P_ACCESS_MODE, LOGGING_ENABLED,\n MEDIA_BREAKPOINT, RECEIVED_DELAY } from '../config.js';\nimport { base64ReEncode, makeImageUrl } from '../lib/blob-helpers.js';\nimport { detectServerAddress, isLocalHost, isSecureConnection } from '../lib/host-name.js';\nimport LocalStorageUtil from '../lib/local-storage.js';\nimport HashNavigation from '../lib/navigation.js';\nimport { secondsToTime } from '../lib/strformat.js'\nimport { updateFavicon } from '../lib/utils.js';\n\n// Sound to play on message received.\nconst POP_SOUND = new Audio('audio/msg.mp3');\n\nconst messages = defineMessages({\n reconnect_countdown: {\n id: 'reconnect_countdown',\n defaultMessage: 'Disconnected. Reconnecting in {seconds}…',\n description: 'Message shown when an app update is available.'\n },\n reconnect_now: {\n id: 'reconnect_now',\n defaultMessage: 'Try now',\n description: 'Prompt for reconnecting now'\n },\n push_init_failed: {\n id: 'push_init_failed',\n defaultMessage: 'Failed to initialize push notifications',\n description: 'Error message when push notifications have failed to initialize.'\n },\n invalid_security_token: {\n id: 'invalid_security_token',\n defaultMessage: 'Invalid security token',\n description: 'Error message when resetting password.'\n },\n no_connection: {\n id: 'no_connection',\n defaultMessage: 'No connection',\n description: 'Warning that the user is offline.'\n },\n code_doesnot_match: {\n id: 'code_doesnot_match',\n defaultMessage: 'Code does not match',\n description: 'Error message when the credential validation code is incorrect.'\n }\n});\n\nclass TinodeWeb extends React.Component {\n constructor(props) {\n super(props);\n\n this.state = this.getBlankState();\n\n this.handleResize = this.handleResize.bind(this);\n this.handleHashRoute = this.handleHashRoute.bind(this);\n this.handleOnline = this.handleOnline.bind(this);\n this.checkForAppUpdate = this.checkForAppUpdate.bind(this);\n this.handleVisibilityEvent = this.handleVisibilityEvent.bind(this);\n this.handleError = this.handleError.bind(this);\n this.handleLoginRequest = this.handleLoginRequest.bind(this);\n this.handleConnected = this.handleConnected.bind(this);\n this.handleAutoreconnectIteration = this.handleAutoreconnectIteration.bind(this);\n this.doLogin = this.doLogin.bind(this);\n this.handleCredentialsRequest = this.handleCredentialsRequest.bind(this);\n this.handleLoginSuccessful = this.handleLoginSuccessful.bind(this);\n this.handleDisconnect = this.handleDisconnect.bind(this);\n this.tnMeMetaDesc = this.tnMeMetaDesc.bind(this);\n this.tnMeContactUpdate = this.tnMeContactUpdate.bind(this);\n this.tnMeSubsUpdated = this.tnMeSubsUpdated.bind(this);\n this.resetContactList = this.resetContactList.bind(this);\n this.tnData = this.tnData.bind(this);\n this.tnInitFind = this.tnInitFind.bind(this);\n this.tnFndSubsUpdated = this.tnFndSubsUpdated.bind(this);\n this.handleSearchContacts = this.handleSearchContacts.bind(this);\n this.handleTopicSelected = this.handleTopicSelected.bind(this);\n this.handleHideMessagesView = this.handleHideMessagesView.bind(this);\n this.handleSendMessage = this.handleSendMessage.bind(this);\n this.handleNewChatInvitation = this.handleNewChatInvitation.bind(this);\n this.handleNewAccount = this.handleNewAccount.bind(this);\n this.handleNewAccountRequest = this.handleNewAccountRequest.bind(this);\n this.handleUpdateAccountRequest = this.handleUpdateAccountRequest.bind(this);\n this.handleUpdateAccountTagsRequest = this.handleUpdateAccountTagsRequest.bind(this);\n this.handleToggleIncognitoMode = this.handleToggleIncognitoMode.bind(this);\n this.handleSettings = this.handleSettings.bind(this);\n this.handleGlobalSettings = this.handleGlobalSettings.bind(this);\n this.handleShowArchive = this.handleShowArchive.bind(this);\n this.handleShowBlocked = this.handleShowBlocked.bind(this);\n this.handleToggleMessageSounds = this.handleToggleMessageSounds.bind(this);\n this.handleCredAdd = this.handleCredAdd.bind(this);\n this.handleCredDelete = this.handleCredDelete.bind(this);\n this.handleCredConfirm = this.handleCredConfirm.bind(this);\n this.initDesktopAlerts = this.initDesktopAlerts.bind(this);\n this.togglePushToken = this.togglePushToken.bind(this);\n this.requestPushToken = this.requestPushToken.bind(this);\n this.handleSidepanelCancel = this.handleSidepanelCancel.bind(this);\n this.handleStartTopicRequest = this.handleStartTopicRequest.bind(this);\n this.handleNewTopicCreated = this.handleNewTopicCreated.bind(this);\n this.handleTopicUpdateRequest = this.handleTopicUpdateRequest.bind(this);\n this.handleChangePermissions = this.handleChangePermissions.bind(this);\n this.handleTagsUpdated = this.handleTagsUpdated.bind(this);\n this.handleLogout = this.handleLogout.bind(this);\n this.handleDeleteAccount = this.handleDeleteAccount.bind(this);\n this.handleDeleteMessagesRequest = this.handleDeleteMessagesRequest.bind(this);\n this.handleLeaveUnsubRequest = this.handleLeaveUnsubRequest.bind(this);\n this.handleBlockTopicRequest = this.handleBlockTopicRequest.bind(this);\n this.handleReportTopic = this.handleReportTopic.bind(this);\n this.handleShowContextMenu = this.handleShowContextMenu.bind(this);\n this.defaultTopicContextMenu = this.defaultTopicContextMenu.bind(this);\n this.handleHideContextMenu = this.handleHideContextMenu.bind(this);\n this.handleShowAlert = this.handleShowAlert.bind(this);\n this.handleShowInfoView = this.handleShowInfoView.bind(this);\n this.handleHideInfoView = this.handleHideInfoView.bind(this);\n this.handleMemberUpdateRequest = this.handleMemberUpdateRequest.bind(this);\n this.handleValidateCredentialsRequest = this.handleValidateCredentialsRequest.bind(this);\n this.handlePasswordResetRequest = this.handlePasswordResetRequest.bind(this);\n this.handleResetPassword = this.handleResetPassword.bind(this);\n this.handleContextMenuAction = this.handleContextMenuAction.bind(this);\n }\n\n getBlankState() {\n const settings = LocalStorageUtil.getObject('settings') || {};\n\n return {\n connected: false,\n // Connected and subscribed to 'me'\n ready: false,\n // Try to re-login on new connection.\n autoLogin: false,\n transport: settings.transport || null,\n serverAddress: settings.serverAddress || detectServerAddress(),\n serverVersion: \"no connection\",\n // \"On\" is the default, so saving the \"off\" state.\n messageSounds: !settings.messageSoundsOff,\n incognitoMode: false,\n desktopAlerts: settings.desktopAlerts,\n desktopAlertsEnabled: (isSecureConnection() || isLocalHost()) &&\n (typeof firebase != 'undefined') && (typeof navigator != 'undefined') &&\n (typeof FIREBASE_INIT != 'undefined'),\n firebaseToken: LocalStorageUtil.getObject('firebase-token'),\n\n applicationVisible: !document.hidden,\n\n errorText: '',\n errorLevel: null,\n errorAction: undefined,\n errorActionText: null,\n\n sidePanelSelected: 'login',\n sidePanelTitle: null,\n sidePanelAvatar: null,\n loadSpinnerVisible: false,\n\n login: '',\n password: '',\n myUserId: null,\n liveConnection: navigator.onLine,\n topicSelected: '',\n topicSelectedOnline: false,\n topicSelectedAcs: null,\n newTopicParams: null,\n loginDisabled: false,\n displayMobile: (window.innerWidth <= MEDIA_BREAKPOINT),\n showInfoPanel: false,\n mobilePanel: 'sidepanel',\n\n contextMenuVisible: false,\n contextMenuBounds: null,\n contextMenuClickAt: null,\n contextMenuParams: null,\n contextMenuItems: [],\n\n // Modal alert dialog.\n alertVisible: false,\n alertParams: {},\n\n // Chats as shown in the ContactsView\n chatList: [],\n // Contacts returned by a search query.\n searchResults: [],\n // Merged results of a search query and p2p chats.\n searchableContacts: [],\n credMethod: undefined,\n credCode: undefined\n };\n }\n\n componentDidMount() {\n window.addEventListener('resize', this.handleResize);\n window.addEventListener('online', (e) => { this.handleOnline(true); });\n window.addEventListener('offline', (e) => { this.handleOnline(false); });\n window.addEventListener('hashchange', this.handleHashRoute);\n // Window/tab visible or invisible for pausing timers.\n document.addEventListener('visibilitychange', this.handleVisibilityEvent);\n\n this.setState({\n viewportWidth: document.documentElement.clientWidth,\n viewportHeight: document.documentElement.clientHeight\n });\n\n const {formatMessage, locale} = this.props.intl;\n this.tinode = TinodeWeb.tnSetup(this.state.serverAddress, this.state.transport, locale);\n this.tinode.onConnect = this.handleConnected;\n this.tinode.onDisconnect = this.handleDisconnect;\n this.tinode.onAutoreconnectIteration = this.handleAutoreconnectIteration;\n\n // Initialize desktop alerts.\n if (this.state.desktopAlertsEnabled) {\n try {\n this.fbPush = firebase.initializeApp(FIREBASE_INIT, APP_NAME).messaging();\n this.fbPush.usePublicVapidKey(FIREBASE_INIT.messagingVapidKey);\n navigator.serviceWorker.register('/service-worker.js').then((reg) => {\n this.checkForAppUpdate(reg);\n this.fbPush.useServiceWorker(reg);\n reg.active.postMessage(JSON.stringify({locale: locale}));\n this.initDesktopAlerts();\n if (this.state.desktopAlerts) {\n if (!this.state.firebaseToken) {\n this.togglePushToken(true);\n } else {\n this.tinode.setDeviceToken(this.state.firebaseToken, true);\n }\n }\n }).catch((err) => {\n // registration failed :(\n console.log(\"Failed to register service worker:\", err);\n });\n } catch (err) {\n this.handleError(formatMessage({id: 'push_init_failed'}), 'err');\n console.log(\"Failed to initialize push notifications\", err);\n this.setState({desktopAlertsEnabled: false});\n }\n }\n\n const token = LocalStorageUtil.getObject('keep-logged-in') ?\n LocalStorageUtil.getObject('auth-token') : undefined;\n\n const parsedNav = HashNavigation.parseUrlHash(window.location.hash);\n if (token) {\n this.setState({autoLogin: true});\n\n // When reading from storage, date is returned as string.\n token.expires = new Date(token.expires);\n this.tinode.setAuthToken(token);\n this.tinode.connect().catch((err) => {\n // Socket error\n this.handleError(err.message, 'err');\n });\n delete parsedNav.params.info;\n delete parsedNav.params.tab;\n parsedNav.path[0] = '';\n HashNavigation.navigateTo(HashNavigation.composeUrlHash(parsedNav.path, parsedNav.params));\n } else if (!parsedNav.params.token) {\n HashNavigation.navigateTo('');\n }\n\n this.readTimer = null;\n this.readTimerCallback = null;\n\n this.handleHashRoute();\n }\n\n componentWillUnmount() {\n window.removeEventListener('resize', this.handleResize);\n window.removeEventListener('hashchange', this.handleHashRoute);\n document.removeEventListener('visibilitychange', this.handleVisibilityEvent);\n }\n\n // Setup transport (usually websocket) and server address. This will terminate connection with the server.\n static tnSetup(serverAddress, transport, locale) {\n const tinode = new Tinode(APP_NAME, serverAddress, API_KEY, transport, isSecureConnection());\n tinode.setHumanLanguage(locale);\n tinode.enableLogging(LOGGING_ENABLED, true);\n return tinode;\n }\n\n handleResize() {\n const mobile = document.documentElement.clientWidth <= MEDIA_BREAKPOINT;\n this.setState({\n viewportWidth: document.documentElement.clientWidth,\n viewportHeight: document.documentElement.clientHeight\n });\n if (this.state.displayMobile != mobile) {\n this.setState({displayMobile: mobile});\n }\n }\n\n // Check if a newer version of TinodeWeb app is available at the server.\n checkForAppUpdate(reg) {\n reg.onupdatefound = () => {\n const installingWorker = reg.installing;\n installingWorker.onstatechange = () => {\n if (installingWorker.state == 'installed' && navigator.serviceWorker.controller) {\n const msg = <>\n \n \n .;\n this.handleError(msg, 'info');\n }\n }\n }\n }\n\n // Handle for hashchange event: display appropriate panels.\n handleHashRoute() {\n const hash = HashNavigation.parseUrlHash(window.location.hash);\n if (hash.path && hash.path.length > 0) {\n // Left-side panel selector.\n if (['register','settings','edit','notif','security','support','general',\n 'cred','reset','newtpk','archive','blocked','contacts',''].includes(hash.path[0])) {\n this.setState({sidePanelSelected: hash.path[0]});\n } else {\n console.log(\"Unknown sidepanel view\", hash.path[0]);\n }\n\n // Topic for MessagesView selector.\n if (hash.path.length > 1 && hash.path[1] != this.state.topicSelected) {\n this.setState({\n topicSelected: Tinode.topicType(hash.path[1]) ? hash.path[1] : null\n });\n }\n } else {\n // Empty hashpath\n this.setState({sidePanelSelected: ''});\n }\n\n // Save validation credentials, if available.\n if (hash.params.method) {\n this.setState({ credMethod: hash.params.method });\n }\n if (hash.params.code) {\n this.setState({ credCode: hash.params.code });\n }\n\n // Additional parameters of panels.\n this.setState({\n showInfoPanel: hash.params.info,\n newTopicTabSelected: hash.params.tab\n });\n }\n\n handleOnline(online) {\n if (online) {\n this.handleError();\n } else {\n this.handleError(this.props.intl.formatMessage({id: 'no_connection'}), 'warn');\n }\n this.setState({liveConnection: online});\n }\n\n handleVisibilityEvent() {\n this.setState({applicationVisible: !document.hidden});\n }\n\n handleError(err, level, action, actionText) {\n this.setState({errorText: err, errorLevel: level, errorAction: action, errorActionText: actionText});\n }\n\n // User clicked Login button in the side panel.\n handleLoginRequest(login, password) {\n this.setState({\n loginDisabled: true,\n login: login,\n password: password,\n loadSpinnerVisible: true,\n autoLogin: true\n });\n this.handleError('', null);\n\n if (this.tinode.isConnected()) {\n this.doLogin(login, password, {meth: this.state.credMethod, resp: this.state.credCode});\n } else {\n this.tinode.connect().catch((err) => {\n // Socket error\n this.setState({loginDisabled: false, autoLogin: false, loadSpinnerVisible: false});\n this.handleError(err.message, 'err');\n });\n }\n }\n\n // Connection succeeded.\n handleConnected() {\n const params = this.tinode.getServerInfo();\n this.setState({\n serverVersion: params.ver + ' ' + (params.build ? params.build : 'none')\n });\n\n if (this.state.autoLogin) {\n this.doLogin(this.state.login, this.state.password, {meth: this.state.credMethod, resp: this.state.credCode});\n }\n }\n\n // Called for each auto-reconnect iteration.\n handleAutoreconnectIteration(sec, prom) {\n clearInterval(this.reconnectCountdown);\n\n if (sec < 0) {\n // Clear error\n this.handleError();\n return;\n }\n\n if (prom) {\n // Reconnecting now\n prom.then(() => {\n // Reconnected: clear error\n this.handleError();\n }).catch((err) => {\n this.handleError(err.message, 'err');\n });\n return;\n }\n\n const {formatMessage} = this.props.intl;\n let count = sec / 1000;\n count = count | count;\n this.reconnectCountdown = setInterval(() => {\n const timeLeft = (count > 99) ? secondsToTime(count) : count;\n this.handleError(\n formatMessage(messages.reconnect_countdown, {seconds: timeLeft}),\n 'warn',\n () => {\n clearInterval(this.reconnectCountdown);\n this.tinode.reconnect();\n },\n formatMessage(messages.reconnect_now)\n );\n count -= 1;\n }, 1000);\n }\n\n // Connection lost\n handleDisconnect(err) {\n this.setState({\n connected: false,\n ready: false,\n topicSelectedOnline: false,\n errorText: err && err.message ? err.message : \"Disconnected\",\n errorLevel: err && err.message ? 'err' : 'warn',\n loginDisabled: false,\n contextMenuVisible: false,\n serverVersion: \"no connection\"\n });\n }\n\n doLogin(login, password, cred) {\n if (this.tinode.isAuthenticated()) {\n // Already logged in. Go to default screen.\n HashNavigation.navigateTo('');\n return;\n }\n // Sanitize and package credentail.\n cred = Tinode.credential(cred);\n // Try to login with login/password. If they are not available, try token. If no token, ask for login/password.\n let promise = null;\n const token = this.tinode.getAuthToken();\n if (login && password) {\n this.setState({password: null});\n promise = this.tinode.loginBasic(login, password, cred);\n } else if (token) {\n promise = this.tinode.loginToken(token.token, cred);\n }\n\n if (promise) {\n promise.then((ctrl) => {\n if (ctrl.code >= 300 && ctrl.text === 'validate credentials') {\n this.setState({loadSpinnerVisible: false});\n if (cred) {\n this.handleError(this.props.intl.formatMessage({id: 'code_doesnot_match'}), 'warn');\n }\n this.handleCredentialsRequest(ctrl.params);\n } else {\n this.handleLoginSuccessful();\n }\n }).catch((err) => {\n // Login failed, report error.\n this.setState({\n loginDisabled: false,\n credMethod: undefined,\n credCode: undefined,\n loadSpinnerVisible: false,\n autoLogin: false\n });\n this.handleError(err.message, 'err');\n localStorage.removeItem('auth-token');\n HashNavigation.navigateTo('');\n });\n } else {\n // No login credentials provided.\n // Make sure we are on the login page.\n HashNavigation.navigateTo('');\n this.setState({loginDisabled: false});\n }\n }\n\n handleCredentialsRequest(params) {\n const parsed = HashNavigation.parseUrlHash(window.location.hash);\n parsed.path[0] = 'cred';\n parsed.params['method'] = params.cred[0];\n HashNavigation.navigateTo(HashNavigation.composeUrlHash(parsed.path, parsed.params));\n }\n\n handleLoginSuccessful() {\n this.handleError();\n\n // Refresh authentication token.\n if (LocalStorageUtil.getObject('keep-logged-in')) {\n LocalStorageUtil.setObject('auth-token', this.tinode.getAuthToken());\n }\n // Logged in fine, subscribe to 'me' attaching callbacks from the contacts view.\n const me = this.tinode.getMeTopic();\n me.onMetaDesc = this.tnMeMetaDesc;\n me.onContactUpdate = this.tnMeContactUpdate;\n me.onSubsUpdated = this.tnMeSubsUpdated;\n this.setState({\n connected: true,\n credMethod: undefined,\n credCode: undefined,\n myUserId: this.tinode.getCurrentUserID(),\n autoLogin: true,\n });\n // Subscribe, fetch topic desc, the list of subscriptions. Messages are not fetched.\n me.subscribe(\n me.startMetaQuery().\n withLaterSub().\n withDesc().\n withTags().\n withCred().\n build()\n ).catch((err) => {\n this.tinode.disconnect();\n localStorage.removeItem('auth-token');\n this.handleError(err.message, 'err');\n HashNavigation.navigateTo('');\n }).finally(() => {\n this.setState({loadSpinnerVisible: false});\n });\n HashNavigation.navigateTo(HashNavigation.setUrlSidePanel(window.location.hash, 'contacts'));\n }\n\n tnMeMetaDesc(desc) {\n if (desc) {\n if (desc.public) {\n this.setState({\n sidePanelTitle: desc.public.fn,\n sidePanelAvatar: makeImageUrl(desc.public.photo)\n });\n }\n if (desc.acs) {\n this.setState({\n incognitoMode: !desc.acs.isPresencer()\n });\n }\n }\n }\n\n // Reactions to updates to the contact list.\n tnMeContactUpdate(what, cont) {\n if (what == 'on' || what == 'off') {\n this.resetContactList();\n if (this.state.topicSelected == cont.topic) {\n this.setState({topicSelectedOnline: (what == 'on')});\n }\n } else if (what == 'read') {\n this.resetContactList();\n } else if (what == 'msg') {\n // Check if the topic is archived. If so, don't play a sound.\n const topic = this.tinode.getTopic(cont.topic);\n const archived = topic && topic.isArchived();\n\n // New message received. Maybe the message is from the current user, then unread is 0.\n if (cont.unread > 0 && this.state.messageSounds && !archived) {\n // Skip update if the topic is currently open, otherwise the badge will annoyingly flash.\n if (document.hidden || this.state.topicSelected != cont.topic) {\n POP_SOUND.play();\n }\n }\n // Reorder contact list to use possibly updated 'touched'.\n this.resetContactList();\n } else if (what == 'recv') {\n // Explicitly ignoring \"recv\" -- it causes no visible updates to contact list.\n } else if (what == 'gone' || what == 'unsub') {\n // Topic deleted or user unsubscribed. Remove topic from view.\n // If the currently selected topic is gone, clear the selection.\n if (this.state.topicSelected == cont.topic) {\n this.handleTopicSelected(null);\n }\n // Redraw without the deleted topic.\n this.resetContactList();\n } else if (what == 'acs') {\n // Permissions changed. If it's for the currently selected topic,\n // update the views.\n if (this.state.topicSelected == cont.topic) {\n this.setState({topicSelectedAcs: cont.acs});\n }\n } else if (what == 'del') {\n // TODO: messages deleted (hard or soft) -- update pill counter.\n } else if (what == 'upd') {\n // upd - handled by the SDK. Explicitly ignoring here.\n } else {\n // TODO(gene): handle other types of notifications:\n // * ua -- user agent changes (maybe display a pictogram for mobile/desktop).\n console.log(\"Unsupported (yet) presence update:\" + what + \" in: \" + cont.topic);\n }\n }\n\n tnMeSubsUpdated(unused) {\n this.resetContactList();\n }\n\n // Merge search results and contact list to create a single flat\n // list of kown contacts for GroupManager to use.\n static prepareSearchableContacts(chatList, foundContacts) {\n const merged = {};\n\n // For chatList topics merge only p2p topics and convert them to the\n // same format as foundContacts.\n for (const c of chatList) {\n if (Tinode.isP2PTopicName(c.topic)) {\n merged[c.topic] = {\n user: c.topic,\n updated: c.updated,\n public: c.public,\n private: c.private,\n acs: c.acs\n };\n }\n }\n\n // Add all foundCountacts if they have not been added already.\n for (const c of foundContacts) {\n if (!merged[c.user]) {\n merged[c.user] = c;\n }\n }\n\n return Object.values(merged);\n }\n\n resetContactList() {\n const newState = {\n chatList: []\n };\n\n if (!this.state.ready) {\n newState.ready = true;\n }\n\n this.tinode.getMeTopic().contacts((c) => {\n newState.chatList.push(c);\n if (this.state.topicSelected == c.topic) {\n newState.topicSelectedOnline = c.online;\n newState.topicSelectedAcs = c.acs;\n }\n });\n // Merge search results and chat list.\n newState.searchableContacts = TinodeWeb.prepareSearchableContacts(newState.chatList, this.state.searchResults);\n this.setState(newState);\n }\n\n // Sending \"received\" notifications\n tnData(data) {\n const topic = this.tinode.getTopic(data.topic);\n if (topic.msgStatus(data) >= Tinode.MESSAGE_STATUS_SENT && data.from != this.state.myUserId) {\n clearTimeout(this.receivedTimer);\n this.receivedTimer = setTimeout(() => {\n this.receivedTimer = undefined;\n topic.noteRecv(data.seq);\n }, RECEIVED_DELAY);\n }\n }\n\n /* Fnd topic: find contacts by tokens */\n tnInitFind() {\n const fnd = this.tinode.getFndTopic();\n fnd.onSubsUpdated = this.tnFndSubsUpdated;\n if (fnd.isSubscribed()) {\n this.tnFndSubsUpdated();\n } else {\n fnd.subscribe(fnd.startMetaQuery().withSub().build()).catch((err) => {\n this.handleError(err.message, 'err');\n });\n }\n }\n\n tnFndSubsUpdated() {\n const foundContacts = [];\n // Don't attempt to create P2P topics which already exist. Server will reject the duplicates.\n this.tinode.getFndTopic().contacts((s) => {\n foundContacts.push(s);\n });\n this.setState({\n searchResults: foundContacts,\n searchableContacts: TinodeWeb.prepareSearchableContacts(this.state.chatList, foundContacts)\n });\n }\n\n /** Called when the user enters a contact into the contact search field in the NewAccount panel\n @param query {Array} is an array of contacts to search for\n */\n handleSearchContacts(query) {\n const fnd = this.tinode.getFndTopic();\n fnd.setMeta({desc: {public: query}}).then((ctrl) => {\n return fnd.getMeta(fnd.startMetaQuery().withSub().build());\n }).catch((err) => {\n this.handleError(err.message, 'err');\n });\n }\n\n // User clicked on a contact in the side panel or deleted a contact.\n handleTopicSelected(topicName) {\n // Clear newTopicParams after use.\n if (this.state.newTopicParams && this.state.newTopicParams._topicName != topicName) {\n this.setState({\n newTopicParams: null\n });\n }\n\n if (topicName) {\n this.setState({\n errorText: '',\n errorLevel: null,\n mobilePanel: 'topic-view',\n showInfoPanel: false\n });\n // Different contact selected.\n if (this.state.topicSelected != topicName) {\n this.setState({\n topicSelectedOnline: this.tinode.isTopicOnline(topicName),\n topicSelectedAcs: this.tinode.getTopicAccessMode(topicName)\n });\n HashNavigation.navigateTo(HashNavigation.setUrlTopic('', topicName));\n }\n } else {\n // Currently selected contact deleted\n this.setState({\n errorText: '',\n errorLevel: null,\n mobilePanel: 'sidepanel',\n topicSelectedOnline: false,\n topicSelectedAcs: null,\n showInfoPanel: false\n });\n\n HashNavigation.navigateTo(HashNavigation.setUrlTopic('', null));\n }\n }\n\n // In mobile view user requested to show sidepanel\n handleHideMessagesView() {\n this.setState({\n mobilePanel: 'sidepanel'\n });\n HashNavigation.navigateTo(HashNavigation.setUrlTopic(window.location.hash, null));\n }\n\n // User is sending a message, either plain text or a drafty object, possibly\n // with attachments.\n // - msg - Drafty message with content\n // - promise - Promise to be resolved when the upload is completed\n // - uploader - for tracking progress\n handleSendMessage(msg, promise, uploader) {\n const topic = this.tinode.getTopic(this.state.topicSelected);\n\n msg = topic.createMessage(msg, false);\n // The uploader is used to show progress.\n msg._uploader = uploader;\n\n if (!topic.isSubscribed()) {\n if (!promise) {\n promise = Promise.resolve();\n }\n promise = promise.then(() => { return topic.subscribe(); });\n }\n\n if (promise) {\n promise = promise.catch((err) => {\n this.handleError(err.message, 'err');\n });\n }\n\n topic.publishDraft(msg, promise)\n .then((ctrl) => {\n if (topic.isArchived()) {\n return topic.archive(false);\n }\n })\n .catch((err) => {\n this.handleError(err.message, 'err');\n });\n }\n\n handleNewChatInvitation(topicName, action) {\n const topic = this.tinode.getTopic(topicName);\n let response = null;\n switch (action) {\n case 'accept':\n // Accept given permissions.\n const mode = topic.getAccessMode().getGiven();\n response = topic.setMeta({sub: {mode: mode}});\n if (topic.isP2P()) {\n // For P2P topics change 'given' permission of the peer too.\n // In p2p topics the other user has the same name as the topic.\n response = response.then((ctrl) => {\n topic.setMeta({sub: {user: topicName, mode: mode}});\n });\n }\n break;\n case 'delete':\n // Ignore invitation by deleting it.\n response = topic.delTopic(true);\n break;\n case 'block':\n // Ban the topic making futher invites impossible.\n // Just self-ban.\n const am = topic.getAccessMode().updateWant('-JP').getWant();\n response = topic.setMeta({sub: {mode: am}}).then((ctrl) => {\n return this.handleTopicSelected(null);\n });\n break;\n default:\n console.log(\"Unknown invitation action\", '\"' + action + '\"\"');\n }\n\n if (response != null) {\n response.catch((err) => {\n this.handleError(err.message, 'err');\n });\n }\n }\n\n // User chose a Sign Up menu item.\n handleNewAccount() {\n this.handleError();\n\n HashNavigation.navigateTo(HashNavigation.setUrlSidePanel(window.location.hash, 'register'));\n }\n\n // Actual registration of a new account.\n handleNewAccountRequest(login_, password_, public_, cred_, tags_) {\n // Clear old error, if any.\n this.handleError();\n\n this.tinode.connect(this.state.serverAddress)\n .then(() => {\n return this.tinode.createAccountBasic(login_, password_,\n {public: public_, tags: tags_, cred: Tinode.credential(cred_)});\n }).then((ctrl) => {\n if (ctrl.code >= 300 && ctrl.text == 'validate credentials') {\n this.handleCredentialsRequest(ctrl.params);\n } else {\n this.handleLoginSuccessful(this);\n }\n }).catch((err) => {\n this.handleError(err.message, 'err');\n });\n }\n\n handleUpdateAccountRequest(password, pub, defacs) {\n this.handleError();\n\n if (pub || defacs) {\n const params = {};\n if (pub) {\n params.public = pub;\n }\n if (defacs) {\n params.defacs = defacs;\n }\n this.tinode.getMeTopic().setMeta({desc: params}).catch((err) => {\n this.handleError(err.message, 'err');\n });\n }\n if (password) {\n this.tinode.updateAccountBasic(null, this.tinode.getCurrentLogin(), password).catch((err) => {\n this.handleError(err.message, 'err');\n });\n }\n }\n\n handleToggleIncognitoMode(on) {\n const me = this.tinode.getMeTopic();\n const am = me.getAccessMode().updateWant(on ? '-P' : '+P').getWant();\n me.setMeta({sub: {mode: am}}).catch((err) => {\n this.handleError(err.message, 'err');\n });\n }\n\n handleUpdateAccountTagsRequest(tags) {\n this.tinode.getMeTopic().setMeta({tags: tags})\n .catch((err) => {\n this.handleError(err.message, 'err');\n });\n }\n\n // User chose Settings menu item.\n handleSettings() {\n this.handleError();\n\n HashNavigation.navigateTo(HashNavigation.setUrlSidePanel(window.location.hash,\n this.state.myUserId ? 'edit' : 'settings'));\n }\n\n // User updated global parameters.\n handleGlobalSettings(settings) {\n const serverAddress = settings.serverAddress || this.state.serverAddress;\n const transport = settings.transport || this.state.transport;\n if (this.tinode) {\n this.tinode.onDisconnect = undefined;\n this.tinode.disconnect();\n }\n this.tinode = TinodeWeb.tnSetup(serverAddress, transport, this.props.intl.locale);\n this.tinode.onConnect = this.handleConnected;\n this.tinode.onDisconnect = this.handleDisconnect;\n\n this.setState({\n serverAddress: serverAddress,\n transport: transport\n });\n LocalStorageUtil.setObject('settings', {\n serverAddress: serverAddress,\n transport: transport\n });\n\n HashNavigation.navigateTo(HashNavigation.setUrlSidePanel(window.location.hash, ''));\n }\n\n // User chose 'Archived chats'.\n handleShowArchive() {\n HashNavigation.navigateTo(HashNavigation.setUrlSidePanel(window.location.hash,\n this.state.myUserId ? 'archive' : ''));\n }\n\n // User viewes 'Blocked chats'.\n handleShowBlocked() {\n HashNavigation.navigateTo(HashNavigation.setUrlSidePanel(window.location.hash,\n this.state.myUserId ? 'blocked' : ''));\n }\n\n // Initialize desktop alerts = push notifications.\n initDesktopAlerts() {\n // Google could not be bothered to mention that\n // onTokenRefresh is never called.\n this.fbPush.onTokenRefresh(() => {\n this.requestPushToken();\n });\n\n this.fbPush.onMessage((payload) => {\n // No need to do anything about it.\n // All the magic happends in the service worker.\n });\n }\n\n togglePushToken(enabled) {\n if (enabled) {\n if (!this.state.firebaseToken) {\n this.fbPush.requestPermission().then(() => {\n this.requestPushToken();\n }).catch((err) => {\n this.handleError(err.message, 'err');\n this.setState({desktopAlerts: false, firebaseToken: null});\n LocalStorageUtil.updateObject('settings', {desktopAlerts: false});\n console.log(\"Failed to get permission to notify.\", err);\n });\n } else {\n this.setState({desktopAlerts: true});\n LocalStorageUtil.updateObject('settings', {desktopAlerts: true});\n }\n } else if (this.state.firebaseToken) {\n this.fbPush.deleteToken(this.state.firebaseToken).catch((err) => {\n console.log(\"Unable to delete token.\", err);\n }).finally(() => {\n LocalStorageUtil.updateObject('settings', {desktopAlerts: false});\n localStorage.removeItem('firebase-token');\n this.setState({desktopAlerts: false, firebaseToken: null});\n });\n } else {\n this.setState({desktopAlerts: false, firebaseToken: null});\n LocalStorageUtil.updateObject('settings', {desktopAlerts: false});\n }\n }\n\n requestPushToken() {\n this.fbPush.getToken().then((refreshedToken) => {\n if (refreshedToken != this.state.firebaseToken) {\n this.tinode.setDeviceToken(refreshedToken, true);\n LocalStorageUtil.setObject('firebase-token', refreshedToken);\n }\n this.setState({firebaseToken: refreshedToken, desktopAlerts: true});\n LocalStorageUtil.updateObject('settings', {desktopAlerts: true});\n }).catch((err) => {\n this.handleError(err.message, 'err');\n console.log(\"Failed to retrieve firebase token\", err);\n });\n }\n\n handleToggleMessageSounds(enabled) {\n this.setState({messageSounds: enabled});\n LocalStorageUtil.updateObject('settings', {\n messageSoundsOff: !enabled\n });\n }\n\n handleCredAdd(method, value) {\n const me = this.tinode.getMeTopic();\n me.setMeta({cred: {meth: method, val: value}}).catch((err) => {\n this.handleError(err.message, 'err');\n });\n }\n\n handleCredDelete(method, value) {\n const me = this.tinode.getMeTopic();\n me.delCredential(method, value).catch((err) => {\n this.handleError(err.message, 'err');\n });\n }\n\n handleCredConfirm(method, response) {\n this.handleCredentialsRequest({cred: [method]});\n }\n\n // User clicked Cancel button in Setting or Sign Up panel.\n handleSidepanelCancel() {\n const parsed = HashNavigation.parseUrlHash(window.location.hash);\n let path = '';\n if (['security','support','general','notif'].includes(parsed.path[0])) {\n path = 'edit';\n } else if ('blocked' == parsed.path[0]) {\n path = 'security';\n } else if (this.state.myUserId) {\n path = 'contacts';\n }\n parsed.path[0] = path;\n if (parsed.params) {\n delete parsed.params.code;\n delete parsed.params.method;\n delete parsed.params.tab;\n }\n HashNavigation.navigateTo(HashNavigation.composeUrlHash(parsed.path, parsed.params));\n this.setState({errorText: '', errorLevel: null});\n }\n\n // Basic nagigator by hash value. No need to bind to this.\n basicNavigator(hash) {\n HashNavigation.navigateTo(HashNavigation.setUrlSidePanel(window.location.hash, hash));\n }\n\n // Request to start a topic, new or selected from search results, or \"by ID\".\n handleStartTopicRequest(topicName, pub, priv, tags, isChannel) {\n // Check if topic is indeed new. If not, launch it.\n if (topicName && this.tinode.isTopicCached(topicName)) {\n this.handleTopicSelected(topicName);\n return;\n }\n\n const params = {};\n if (Tinode.isP2PTopicName(topicName)) {\n // Because we are initialing the subscription, set 'want' to all permissions.\n params.sub = {mode: DEFAULT_P2P_ACCESS_MODE};\n // Give the other user all permissions too.\n params.desc = {defacs: {auth: DEFAULT_P2P_ACCESS_MODE}};\n } else {\n topicName = topicName || this.tinode.newGroupTopicName(isChannel);\n params.desc = {public: pub, private: {comment: priv}};\n params.tags = tags;\n }\n params._topicName = topicName;\n this.setState({newTopicParams: params}, () => {this.handleTopicSelected(topicName)});\n }\n\n // New topic was creted, here is the new topic name.\n handleNewTopicCreated(oldName, newName) {\n if (this.state.topicSelected == oldName && oldName != newName) {\n // If the current URl contains the old topic name, replace it with new.\n // Update the name of the selected topic first so the navigator doen't clear\n // the state.\n this.setState({topicSelected: newName}, () => {\n HashNavigation.navigateTo(HashNavigation.setUrlTopic('', newName));\n });\n }\n }\n\n handleTopicUpdateRequest(topicName, pub, priv, permissions) {\n const topic = this.tinode.getTopic(topicName);\n if (topic) {\n const params = {};\n if (pub) {\n params.public = pub;\n }\n if (priv) {\n params.private = (priv === Tinode.DEL_CHAR) ?\n Tinode.DEL_CHAR : {comment: priv};\n }\n if (permissions) {\n params.defacs = permissions;\n }\n topic.setMeta({desc: params}).catch((err) => {\n this.handleError(err.message, 'err');\n });\n }\n }\n\n handleChangePermissions(topicName, mode, uid) {\n const topic = this.tinode.getTopic(topicName);\n if (topic) {\n const am = topic.getAccessMode();\n if (uid) {\n am.updateGiven(mode);\n mode = am.getGiven();\n } else {\n am.updateWant(mode);\n mode = am.getWant();\n }\n topic.setMeta({sub: {user: uid, mode: mode}}).catch((err) => {\n this.handleError(err.message, 'err');\n });\n }\n }\n\n handleTagsUpdated(topicName, tags) {\n const topic = this.tinode.getTopic(topicName);\n if (topic) {\n topic.setMeta({tags: tags}).catch((err) => {\n this.handleError(err.message, 'err');\n });\n }\n }\n\n handleLogout() {\n updateFavicon(0);\n\n // Remove stored data.\n localStorage.removeItem('auth-token');\n localStorage.removeItem('firebase-token');\n localStorage.removeItem('settings');\n if (this.state.firebaseToken) {\n this.fbPush.deleteToken(this.state.firebaseToken)\n }\n\n if (this.tinode) {\n this.tinode.onDisconnect = undefined;\n this.tinode.disconnect();\n }\n this.setState(this.getBlankState());\n this.tinode = TinodeWeb.tnSetup(this.state.serverAddress, this.state.transport, this.props.intl.locale);\n this.tinode.onConnect = this.handleConnected;\n this.tinode.onDisconnect = this.handleDisconnect;\n HashNavigation.navigateTo('');\n }\n\n handleDeleteAccount() {\n this.tinode.delCurrentUser(true).then((ctrl) => {\n this.handleLogout();\n });\n }\n\n handleDeleteMessagesRequest(topicName) {\n const topic = this.tinode.getTopic(topicName);\n if (!topic) {\n return;\n }\n\n // Request hard-delete all messages.\n topic.delMessagesAll(true).catch((err) => {\n this.handleError(err.message, 'err');\n });\n }\n\n handleLeaveUnsubRequest(topicName) {\n const topic = this.tinode.getTopic(topicName);\n if (!topic) {\n return;\n }\n\n topic.leave(true).then((ctrl) => {\n // Hide MessagesView and InfoView panels.\n HashNavigation.navigateTo(HashNavigation.setUrlTopic(window.location.hash, ''));\n }).catch((err) => {\n this.handleError(err.message, 'err');\n });\n }\n\n handleBlockTopicRequest(topicName) {\n const topic = this.tinode.getTopic(topicName);\n if (!topic) {\n return;\n }\n\n topic.updateMode(null, '-JP').then((ctrl) => {\n // Hide MessagesView and InfoView panels.\n HashNavigation.navigateTo(HashNavigation.setUrlTopic(window.location.hash, ''));\n }).catch((err) => {\n this.handleError(err.message, 'err');\n });\n }\n\n handleReportTopic(topicName) {\n const topic = this.tinode.getTopic(topicName);\n if (!topic) {\n return;\n }\n\n // Publish spam report.\n this.tinode.publish(Tinode.TOPIC_SYS, Tinode.Drafty.attachJSON(null, {\n 'action': 'report',\n 'target': topicName\n }));\n\n // Remove J and P permissions.\n topic.updateMode(null, '-JP').then((ctrl) => {\n // Hide MessagesView and InfoView panels.\n HashNavigation.navigateTo(HashNavigation.setUrlTopic(window.location.hash, ''));\n }).catch((err) => {\n this.handleError(err.message, 'err');\n });\n }\n\n handleShowContextMenu(params, menuItems) {\n this.setState({\n contextMenuVisible: true,\n contextMenuClickAt: {x: params.x, y: params.y},\n contextMenuParams: params,\n contextMenuItems: menuItems || this.defaultTopicContextMenu(params.topicName),\n contextMenuBounds: ReactDOM.findDOMNode(this).getBoundingClientRect()\n });\n }\n\n defaultTopicContextMenu(topicName) {\n const topic = this.tinode.getTopic(topicName);\n\n let muted = false, blocked = false, self_blocked = false, subscribed = false, deleter = false, archived = false;\n if (topic) {\n subscribed = topic.isSubscribed();\n archived = topic.isArchived();\n\n const acs = topic.getAccessMode();\n if (acs) {\n muted = acs.isMuted();\n blocked = !acs.isJoiner();\n self_blocked = !acs.isJoiner('want');\n deleter = acs.isDeleter();\n }\n }\n\n return [\n subscribed ? {\n title: this.props.intl.formatMessage({id: 'menu_item_info'}),\n handler: this.handleShowInfoView\n } : null,\n subscribed ? 'messages_clear' : null,\n subscribed && deleter ? 'messages_clear_hard' : null,\n muted ? (blocked ? null : 'topic_unmute') : 'topic_mute',\n self_blocked ? 'topic_unblock' : 'topic_block',\n !archived ? 'topic_archive' : null,\n 'topic_delete'\n ];\n }\n\n handleHideContextMenu() {\n this.setState({\n contextMenuVisible: false,\n contextMenuClickAt: null,\n contextMenuParams: null,\n contextMenuBounds: null\n });\n }\n\n handleContextMenuAction(action, promise, params) {\n if (action == 'topic_archive') {\n if (promise && params.topicName && params.topicName == this.state.topicSelected) {\n promise.then(() => {\n this.handleTopicSelected(null);\n });\n }\n }\n }\n\n handleShowAlert(title, content, onConfirm, confirmText, onReject, rejectText) {\n this.setState({\n alertVisible: true,\n alertParams: {\n title: title,\n content: content,\n onConfirm: onConfirm,\n confirm: confirmText,\n onReject: onReject,\n reject: rejectText\n }\n });\n }\n\n handleShowInfoView() {\n HashNavigation.navigateTo(HashNavigation.addUrlParam(window.location.hash, 'info', true));\n this.setState({showInfoPanel: true});\n }\n\n handleHideInfoView() {\n HashNavigation.navigateTo(HashNavigation.removeUrlParam(window.location.hash, 'info'));\n this.setState({showInfoPanel: false});\n }\n\n handleMemberUpdateRequest(topicName, added, removed) {\n if (!topicName) {\n return;\n }\n\n const topic = this.tinode.getTopic(topicName);\n if (!topic) {\n return;\n }\n\n if (added && added.length > 0) {\n added.map((uid) => {\n topic.invite(uid, null).catch((err) => {\n this.handleError(err.message, 'err');\n });\n });\n }\n\n if (removed && removed.length > 0) {\n removed.map((uid) => {\n topic.delSubscription(uid).catch((err) => {\n this.handleError(err.message, 'err');\n });\n });\n }\n }\n\n handleValidateCredentialsRequest(cred, code) {\n if (this.tinode.isAuthenticated()) {\n const me = this.tinode.getMeTopic();\n me.setMeta({cred: {meth: cred, resp: code}})\n .then(() => {\n HashNavigation.navigateTo('');\n })\n .catch((err) => {\n this.handleError(err.message, 'err');\n });\n } else {\n this.setState({credMethod: cred, credCode: code});\n this.doLogin(null, null, {meth: cred, resp: code});\n }\n }\n\n handlePasswordResetRequest(method, value) {\n // If already connected, connnect() will return a resolved promise.\n this.tinode.connect()\n .then(() => {\n return this.tinode.requestResetAuthSecret('basic', method, value);\n })\n .catch((err) => {\n // Socket error\n this.handleError(err.message, 'err');\n });\n }\n\n handleResetPassword(scheme, newPassword, token) {\n token = base64ReEncode(token);\n if (!token) {\n this.handleError(this.props.intl.formatMessage({id: 'invalid_security_token'}), 'err');\n } else {\n this.tinode.connect()\n .then(() => {\n return this.tinode.updateAccountBasic(null, null, newPassword, {token: token});\n })\n .catch((err) => {\n // Socket error\n this.handleError(err.message, 'err');\n });\n }\n }\n\n render() {\n return (\n
    \n {this.state.contextMenuVisible ?\n {\n if (topicName == this.state.topicSelected) {\n this.handleTopicSelected(null);\n }\n }}\n onError={this.handleError} />\n :\n null\n }\n { this.setState({alertVisible: false}); }) : null}\n reject={this.state.alertParams.reject}\n onConfirm={() => { this.setState({alertVisible: false}); this.state.alertParams.onConfirm(); }}\n confirm={this.state.alertParams.confirm}\n />\n \n\n \n\n {this.state.showInfoPanel ?\n \n :\n null\n }\n
    \n );\n }\n};\n\nexport default injectIntl(TinodeWeb);\n","// ValidationView: panel for confirming credentials, like email or phone.\nimport React from 'react';\nimport { FormattedMessage, defineMessages, injectIntl } from 'react-intl';\n\nconst messages = defineMessages({\n phone: {\n id: 'phone_dative',\n defaultMessage: 'phone',\n description: \"Dative case of 'phone', i.e. 'phone' in 'by phone'\",\n },\n email: {\n id: 'email_dative',\n defaultMessage: 'email',\n description: \"Dative case of 'email', i.e. 'email' in 'by email'\",\n }\n});\n\nclass ValidationView extends React.PureComponent {\n constructor(props) {\n super(props);\n\n this.state = {\n code: props.credCode || ''\n };\n\n this.handleChange = this.handleChange.bind(this);\n this.handleKeyPress = this.handleKeyPress.bind(this);\n this.handleSubmit = this.handleSubmit.bind(this);\n this.handleCancel = this.handleCancel.bind(this);\n }\n\n handleChange(e) {\n this.setState({code: e.target.value});\n }\n\n handleKeyPress(e) {\n if (e.key === 'Enter') {\n this.handleSubmit(e);\n } else if (e.key == 'Escape') {\n this.handleCancel(e);\n }\n }\n\n handleSubmit(e) {\n e.preventDefault();\n if (this.state.code && this.state.code.trim()) {\n this.props.onSubmit(this.props.credMethod, this.state.code.trim());\n }\n }\n\n handleCancel(e) {\n e.preventDefault();\n this.props.onCancel();\n }\n\n\n render() {\n const { formatMessage } = this.props.intl;\n const methods = {'email': formatMessage(messages.email), 'tel': formatMessage(messages.phone)};\n let method = methods[this.props.credMethod] || this.props.credMethod;\n return (\n
    \n
    \n \n
    \n
    \n {\n (numbers_only) => \n }\n
    \n
    \n \n \n
    \n
    \n );\n }\n};\n\nexport default injectIntl(ValidationView);\n","import React from 'react';\nimport { FormattedMessage } from 'react-intl';\n\nexport default class Alert extends React.PureComponent {\n render() {\n return this.props.visible ?\n
    \n
    \n
    {this.props.title}
    \n
    {this.props.content}
    \n
    \n {this.props.onReject ?\n \n :\n null\n }\n \n
    \n
    \n
    \n :\n null;\n }\n};\n","import React from 'react';\nimport { FormattedMessage } from 'react-intl';\n\nimport FileProgress from './file-progress.jsx';\nimport { bytesToHumanSize } from '../lib/strformat.js';\nimport { isUrlRelative, sanitizeUrl } from '../lib/utils.js';\n\nexport default class Attachment extends React.Component {\n constructor(props) {\n super(props);\n\n this.state = {\n downloader: null,\n progress: 0\n };\n\n this.downloadFile = this.downloadFile.bind(this);\n this.handleCancel = this.handleCancel.bind(this);\n }\n\n downloadFile(url, filename, mimetype) {\n if (!url) {\n this.props.onError(\"Invalid download URL '\" + url + \"'\");\n return;\n }\n\n const downloader = this.props.tinode.getLargeFileHelper();\n this.setState({downloader: downloader});\n downloader.download(url, filename, mimetype,\n (loaded) => {\n this.setState({progress: loaded / this.props.size});\n },\n (err) => {\n this.props.onError(err, 'err');\n }\n ).then(() => {\n this.setState({downloader: null, progress: 0});\n }).catch((err) => {\n if (err) {\n this.props.onError(\"Error downloading file: \" + err.message, 'err');\n }\n this.setState({downloader: null, progress: 0});\n });\n }\n\n handleCancel() {\n if (this.props.uploading) {\n this.props.onCancelUpload();\n } else if (this.state.downloader) {\n this.state.downloader.cancel();\n }\n }\n\n render() {\n let filename = this.props.filename || 'file_attachment';\n if (filename.length > 36) {\n filename = filename.substr(0, 16) + '...' + filename.substr(-16);\n }\n let size = this.props.size > 0 ?\n ({bytesToHumanSize(this.props.size)}) :\n null;\n\n // Detect if the download URL is relative or absolute.\n // If the URL is relative use LargeFileHelper to attach authentication\n // credentials to the request.\n let url, helperFunc;\n if (!this.props.uploading && !this.state.downloader && isUrlRelative(this.props.downloadUrl)) {\n // Relative URL. Use download helper.\n url = '#';\n helperFunc = (e) => {\n e.preventDefault();\n this.downloadFile(this.props.downloadUrl, this.props.filename, this.props.mimetype);\n };\n } else {\n url = sanitizeUrl(this.props.downloadUrl);\n helperFunc = null;\n }\n const downloadWidget = <>file_download ;\n return (\n
    \n
    insert_drive_file
    \n
    \n
    {filename} {size}
    \n {this.props.uploading || this.state.downloader ?\n \n :\n
    {url ?\n {downloadWidget}\n :\n {downloadWidget}\n }
    \n }\n
    \n
    \n );\n }\n};\n","import React from 'react';\n\nimport LetterTile from './letter-tile.jsx';\n\nimport { AVATAR_SIZE, MAX_EXTERN_ATTACHMENT_SIZE } from '../config.js';\nimport { imageScaled, blobToBase64, makeImageUrl } from '../lib/blob-helpers.js';\n\nexport default class AvatarUpload extends React.Component {\n constructor(props) {\n super(props);\n\n this.state = {\n dataUrl: props.avatar\n };\n\n this.handleFileUpload = this.handleFileUpload.bind(this);\n }\n\n componentDidUpdate(prevProps) {\n if (this.props.avatar != prevProps.avatar) {\n this.setState({dataUrl: this.props.avatar})\n }\n }\n\n handleFileUpload(e) {\n imageScaled(e.target.files[0], AVATAR_SIZE, AVATAR_SIZE, MAX_EXTERN_ATTACHMENT_SIZE, true,\n // Image successfully scaled and converted.\n (mime, blob) => {\n // Convert blob to base64-encoded bits.\n blobToBase64(blob, (unused, base64bits) => {\n const du = makeImageUrl({data: base64bits, type: mime});\n this.setState({dataUrl: du});\n this.props.onImageChanged(du);\n });\n },\n // Failure\n (err) => {\n this.props.onError(err, 'err');\n });\n // Clear the value so the same file can be uploaded again.\n e.target.value = '';\n }\n\n render() {\n // Randomize id value in case more than one AvatarUpload is shown\n // at the same time.\n const randId = 'file-input-avatar-' + (Math.random() + '').substr(2);\n const className = 'avatar-upload' + (this.props.readOnly ? ' read-only' : '');\n return (\n
    \n {this.props.readOnly || !this.state.dataUrl ?\n null :\n {e.preventDefault(); this.props.onImageChanged(null);}}>\n clear\n }\n {this.state.dataUrl ?\n :\n this.props.readOnly && this.props.uid ?\n
    \n \n
    \n :\n
    {AVATAR_SIZE}×{AVATAR_SIZE}
    }\n {this.props.readOnly ? null :\n }\n {this.props.readOnly ? null :\n }\n
    \n );\n }\n};\n","// The <- button to be displayed in title bars.\nimport React from 'react';\n\nexport default class ButtonBack extends React.PureComponent {\n render() {\n return (\n {e.preventDefault(); this.props.onBack();}}>\n arrow_back\n \n );\n }\n}\n","// Single message, sent or received.\nimport React from 'react';\nimport { FormattedMessage } from 'react-intl';\nimport { Drafty } from 'tinode-sdk'\n\nimport Attachment from './attachment.jsx';\nimport LetterTile from './letter-tile.jsx';\nimport ReceivedMarker from './received-marker.jsx'\nimport UploadingImage from './uploading-image.jsx'\nimport { sanitizeImageUrl, sanitizeUrl } from '../lib/utils.js';\n\nexport default class ChatMessage extends React.Component {\n constructor(props) {\n super(props);\n\n this.state = {\n progress: 0\n };\n\n if (props.uploader) {\n props.uploader.onProgress = this.handleProgress.bind(this);\n }\n\n this.handleImagePreview = this.handleImagePreview.bind(this);\n this.handleFormButtonClick = this.handleFormButtonClick.bind(this);\n this.handleContextClick = this.handleContextClick.bind(this);\n this.handleCancelUpload = this.handleCancelUpload.bind(this);\n }\n\n handleImagePreview(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 handleFormButtonClick(e) {\n e.preventDefault();\n const data = {\n seq: this.props.seq\n };\n data.resp = {};\n if (e.target.dataset.name) {\n data.resp[e.target.dataset.name] = e.target.dataset.val ? e.target.dataset.val :\n e.target.dataset.val === undefined ? 1 : '' + e.target.dataset.val;\n }\n if (e.target.dataset.act == 'url') {\n data.ref = sanitizeUrl(e.target.dataset.ref) || 'about:blank';\n }\n const text = e.target.dataset.title || 'unknown';\n this.props.onFormResponse(e.target.dataset.act, text, data);\n }\n\n handleContextClick(e) {\n e.preventDefault();\n e.stopPropagation();\n const menuItems = this.props.received == Tinode.MESSAGE_STATUS_FAILED ? ['menu_item_send_retry'] : [];\n this.props.showContextMenu({ seq: this.props.seq, content: this.props.content,\n y: e.pageY, x: e.pageX }, menuItems);\n }\n\n handleProgress(ratio) {\n this.setState({progress: ratio});\n }\n\n handleCancelUpload() {\n this.props.onCancelUpload(this.props.seq, this.props.uploader);\n }\n\n render() {\n const sideClass = this.props.deleted ? 'center' :\n (this.props.sequence + ' ' + (this.props.response ? 'left' : 'right'));\n const bubbleClass = (this.props.sequence == 'single' || this.props.sequence == 'last') ? 'bubble tip' : 'bubble';\n const avatar = this.props.deleted ? null : (this.props.userAvatar || true);\n const fullDisplay = (this.props.userFrom && this.props.response &&\n (this.props.sequence == 'single' || this.props.sequence == 'last'));\n\n let content = this.props.content;\n const attachments = [];\n if (this.props.mimeType == Drafty.getContentType() && Drafty.isValid(content)) {\n Drafty.attachments(content, function(att, i) {\n if (att.mime == 'application/json') {\n // Don't show json objects as attachments.\n // They are not meant for users.\n return;\n }\n attachments.push();\n }, this);\n content = React.createElement(React.Fragment, null, Drafty.format(content, draftyFormatter, this));\n } else if (this.props.deleted) {\n // Message represents a range of deleted messages.\n content = <>block \n \n \n } else if (typeof content != 'string') {\n content = <>\n error_outline \n \n \n }\n\n return (\n
  • \n {this.props.userFrom && this.props.response ?\n
    \n {fullDisplay ?\n :\n null}\n
    :\n null}\n
    \n
    \n
    \n {content}\n {attachments}\n {this.props.timestamp ?\n \n : null}\n
    \n {this.props.deleted || !this.props.showContextMenu ?\n null :\n \n \n expand_more\n \n \n }\n
    \n {fullDisplay ?\n
    \n {\n (notFound) => {return this.props.userName || {notFound}}\n }\n
    \n : null\n }\n
    \n
  • \n );\n }\n};\n\n// Convert Drafty object to a tree of React elements.\nimport { BROKEN_IMAGE_SIZE, REM_SIZE } from '../config.js';\nimport { fitImageSize } from '../lib/blob-helpers.js';\n\nfunction draftyFormatter(style, data, values, key) {\n let el = Drafty.tagName(style);\n if (el) {\n const attr = Drafty.attrValue(style, data) || {};\n attr.key = key;\n switch (style) {\n case 'IM':\n // Additional processing for images\n if (data) {\n attr.className = 'inline-image';\n const dim = fitImageSize(data.width, data.height,\n Math.min(this.props.viewportWidth - REM_SIZE * 4, REM_SIZE * 36), REM_SIZE * 24, false) ||\n {dstWidth: BROKEN_IMAGE_SIZE, dstHeight: BROKEN_IMAGE_SIZE};\n attr.style = { width: dim.dstWidth + 'px', height: dim.dstHeight + 'px' };\n if (!Drafty.isProcessing(data)) {\n attr.src = this.props.tinode.authorizeURL(sanitizeImageUrl(attr.src));\n attr.alt = data.name;\n if (attr.src) {\n attr.onClick = this.handleImagePreview;\n attr.className += ' image-clickable';\n } else {\n attr.src = 'img/broken_image.png';\n }\n } else {\n // Use custom element instead of .\n el = UploadingImage;\n }\n }\n break;\n case 'BN':\n // Button\n attr.onClick = this.handleFormButtonClick;\n let inner = React.Children.map(values, (child) => {\n return typeof child == 'string' ? child : undefined;\n });\n if (!inner || inner.length == 0) {\n inner = [attr.name]\n }\n // Get text which will be sent back when the button is clicked.\n attr['data-title'] = inner.join('');\n break;\n case 'FM':\n // Form\n attr.className = 'bot-form';\n break;\n case 'FE':\n // Form element formatting is dependent on element content.\n break;\n }\n return React.createElement(el, attr, values);\n } else {\n return values;\n }\n};\n","import React from 'react';\n\n/* BEGIN CheckBox: styled checkbox */\nexport default class CheckBox extends React.PureComponent {\n constructor(props) {\n super(props);\n\n this.handleChange = this.handleChange.bind(this);\n }\n\n handleChange() {\n this.props.onChange(this.props.name, !this.props.checked);\n }\n\n render() {\n return (\n this.props.onChange ? (\n this.props.checked ?\n check_box :\n check_box_outline_blank\n ) : (\n this.props.checked ?\n check_box :\n check_box_outline_blank\n )\n );\n }\n}\n/* END CheckBox */\n","import React from 'react';\n\nimport Chip from './chip.jsx';\n\nimport { makeImageUrl } from '../lib/blob-helpers.js';\n\n/* BEGIN ChipInput: group membership widget */\nexport default class ChipInput extends React.Component {\n constructor(props) {\n super(props);\n\n this.state = ChipInput.deriveStateFromProps(props);\n this.state.input = '';\n this.state.focused = false;\n\n this.handleTextInput = this.handleTextInput.bind(this);\n this.removeChipAt = this.removeChipAt.bind(this);\n this.handleChipCancel = this.handleChipCancel.bind(this);\n this.handleFocusGained = this.handleFocusGained.bind(this);\n this.handleFocusLost = this.handleFocusLost.bind(this);\n this.handleKeyDown = this.handleKeyDown.bind(this);\n }\n\n static deriveStateFromProps(props) {\n return {\n placeholder: props.chips ? '' : props.prompt,\n sortedChips: ChipInput.sortChips(props.chips, props.staticMembers),\n chipIndex: ChipInput.indexChips(props.chips)\n };\n }\n\n componentDidUpdate(prevProps, prevState) {\n if (prevProps.chips != this.props.chips ||\n prevProps.staticMembers != this.props.staticMembers ||\n prevProps.prompt != this.props.prompt) {\n this.setState(ChipInput.deriveStateFromProps(this.props));\n }\n if (!prevState || this.props.chips.length > prevState.sortedChips.length) {\n this.setState({input: ''});\n }\n }\n\n // Map chip index to user name\n static indexChips(chips) {\n const index = {};\n let count = 0;\n chips.map((item) => {\n index[item.user] = count;\n count ++;\n });\n return index;\n }\n\n // Have non-removable chips appear before all other chips.\n static sortChips(chips, keep) {\n const required = [];\n const normal = [];\n chips.map((item) => {\n if (keep && keep.includes(item.user)) {\n required.push(item);\n } else {\n normal.push(item);\n }\n });\n return required.concat(normal);\n }\n\n handleTextInput(e) {\n this.setState({input: e.target.value});\n if (this.props.filterFunc) {\n this.props.filterFunc(e.target.value);\n }\n }\n\n removeChipAt(idx) {\n const removed = this.state.sortedChips[idx];\n this.props.onChipRemoved(removed.user, this.state.chipIndex[removed.user]);\n }\n\n handleChipCancel(item, idx) {\n this.removeChipAt(idx);\n }\n\n handleFocusGained() {\n this.setState({focused: true});\n }\n\n handleFocusLost() {\n this.setState({focused: false});\n if (this.props.onFocusLost) {\n this.props.onFocusLost(this.state.input);\n }\n }\n\n handleKeyDown(e) {\n if (e.key === 'Backspace') {\n if (this.state.input.length == 0 && this.state.sortedChips.length > 0) {\n const at = this.state.sortedChips.length - 1;\n if (this.state.sortedChips[at].user !== this.props.staticMembers) {\n this.removeChipAt(at);\n }\n }\n } else if (e.key === 'Enter') {\n if (this.props.onEnter) {\n this.props.onEnter(this.state.input);\n }\n } else if (e.key === 'Escape') {\n if (this.props.onCancel) {\n this.props.onCancel();\n }\n }\n }\n\n render() {\n const chips = [];\n let count = 0;\n const staticMembers = this.props.staticMembers || [];\n this.state.sortedChips.map((item) => {\n chips.push(\n \n );\n count++;\n });\n const className = \"chip-input\" + (this.state.focused ? ' focused' : '');\n return (\n
    \n {chips}\n \n
    \n );\n }\n};\n","import React from 'react';\n\nimport LetterTile from './letter-tile.jsx';\n\nexport default class Chip extends React.PureComponent {\n constructor(props) {\n super(props);\n\n this.handleCancel = this.handleCancel.bind(this);\n }\n\n handleCancel(e) {\n e.preventDefault();\n this.props.onCancel(this.props.topic, this.props.index);\n }\n\n render() {\n const title = this.props.title || this.props.topic;\n const className = this.props.invalid ? 'chip invalid' : 'chip';\n return (\n
    \n {this.props.noAvatar ?\n :\n
    \n \n
    \n }\n {title}\n {this.props.onCancel && !this.props.required ?\n ×\n : }\n
    \n );\n }\n};\n","// A panel included into a list of contacts with an action text.\nimport React from 'react';\nimport { injectIntl } from 'react-intl';\n\nclass ContactAction extends React.PureComponent {\n constructor(props) {\n super(props);\n\n this.handleClick = this.handleClick.bind(this);\n }\n\n handleClick(e) {\n e.preventDefault();\n e.stopPropagation();\n this.props.onAction(this.props.action);\n }\n\n render() {\n const {formatMessage} = this.props.intl;\n return (\n
  • \n
    {formatMessage(this.props.title, this.props.values)}
    \n
  • \n );\n }\n};\n\nexport default injectIntl(ContactAction);\n","import React from 'react';\n\nconst icon_mapping = {'muted': 'notifications_off', 'banned': 'block'};\n\n/* Contact's labels: [you], or icons [muted], [blocked] */\nexport default class ContactBadges extends React.PureComponent {\n render() {\n let badges = null;\n if (this.props.badges && this.props.badges.length > 0) {\n badges = [];\n this.props.badges.map(function(b) {\n if (b.icon) {\n badges.push({icon_mapping[b.icon]});\n } else {\n const style = 'badge' + (b.color ? ' ' + b.color : '');\n badges.push({b.name});\n }\n });\n return <>{badges};\n }\n return null;\n }\n};\n","// ContactList: component for showing a list of contacts,\n// such as a list of group members in a group chat.\nimport React from 'react';\nimport { defineMessages, injectIntl } from 'react-intl';\n\nimport Tinode from 'tinode-sdk';\n\nimport Contact from './contact.jsx';\nimport ContactAction from './contact-action.jsx';\n\nimport { makeImageUrl } from '../lib/blob-helpers.js';\n\nconst messages = defineMessages({\n badge_you: {\n id: 'badge_you',\n defaultMessage: 'you',\n description: 'Badge for indicating the current user'\n },\n badge_owner: {\n id: 'badge_owner',\n defaultMessage: 'owner',\n description: 'Badge for indicating the owner'\n }\n});\n\nclass ContactList extends React.Component {\n render() {\n const {formatMessage} = this.props.intl;\n const showCheckmark = Array.isArray(this.props.topicSelected);\n const contactNodes = [];\n let contactsCount = 0;\n if (this.props.contacts && this.props.contacts.length > 0) {\n this.props.contacts.map((c) => {\n if (c.action) {\n // Action item\n contactNodes.push(\n );\n } else {\n // Normal contact\n const key = this.props.showMode ? c.user : (c.topic || c.user);\n // If filter function is provided, filter out the items\n // which don't satisfy the condition.\n if (this.props.filterFunc && this.props.filter) {\n let content = [key];\n if (c.private && c.private.comment) {\n content.push(('' + c.private.comment).toLowerCase());\n }\n if (c.public && c.public.fn) {\n content.push(('' + c.public.fn).toLowerCase());\n }\n if (!this.props.filterFunc(this.props.filter, content)) {\n return;\n }\n }\n\n const isChannel = Tinode.isChannelTopicName(key);\n const selected = showCheckmark ?\n (this.props.topicSelected.indexOf(key) > -1) :\n (this.props.topicSelected === key);\n const badges = [];\n if (this.props.showMode) {\n if (key == this.props.myUserId) {\n badges.push({name: formatMessage(messages.badge_you), color: 'green'});\n }\n if (c.acs && c.acs.isOwner()) {\n badges.push({name: formatMessage(messages.badge_owner), color: 'blue'});\n }\n }\n const comment = Array.isArray(c.private) ?\n c.private.join(',') : (c.private ? c.private.comment : null);\n\n contactNodes.push(\n \n );\n contactsCount ++;\n }\n }, this);\n }\n\n return (\n
    \n {contactsCount == 0 ?\n
    \n :\n null\n }\n {contactNodes.length > 0 ?\n
      \n {contactNodes}\n
    \n :\n null\n }\n
    \n );\n }\n};\n\nexport default injectIntl(ContactList);\n","// A single topic or user.\nimport React from 'react';\nimport { FormattedMessage } from 'react-intl';\n\nimport LetterTile from './letter-tile.jsx';\nimport ContactBadges from './contact-badges.jsx';\nimport UnreadBadge from './unread-badge.jsx';\n\nexport default class Contact extends React.Component {\n constructor(props) {\n super(props);\n\n this.handleClick = this.handleClick.bind(this);\n this.handleContextClick = this.handleContextClick.bind(this);\n }\n\n handleClick(e) {\n e.preventDefault();\n e.stopPropagation();\n if (this.props.onSelected) {\n // Index this.props.index is used by GroupManager.\n this.props.onSelected(this.props.item, this.props.index);\n }\n }\n\n handleContextClick(e) {\n e.preventDefault();\n e.stopPropagation();\n this.props.showContextMenu({ topicName: this.props.item, y: e.pageY, x: e.pageX });\n }\n\n render() {\n let title = this.props.title;\n if (!title) {\n title = ;\n } else if (title.length > 30) {\n // FIXME: this is probably wrong for RTL languages.\n title = title.substring(0, 28) + '...';\n }\n const online = this.props.now ? 'online' : 'offline';\n const avatar = this.props.avatar ? this.props.avatar : true;\n const badges = this.props.badges ? this.props.badges.slice() : [];\n const icon_badges = [];\n if (this.props.acs) {\n if (this.props.showMode) {\n badges.push({name: this.props.acs.getMode(), key: 'mode'});\n }\n if (this.props.acs.isMuted()) {\n icon_badges.push({icon: 'muted'});\n }\n if (!this.props.acs.isJoiner()) {\n icon_badges.push({icon: 'banned'});\n }\n }\n\n return (\n
  • \n
    \n \n {this.props.showOnline ? :\n (this.props.showCheckmark && this.props.selected ?\n check_circle\n : null)}\n
    \n
    \n
    {title}\n {this.props.isChannel ? \"channel\" : null}\n \n
    \n {this.props.comment ?
    {this.props.comment}
    : null}\n \n
    \n {this.props.showContextMenu ?\n \n \n expand_more\n \n : null}\n
  • \n );\n }\n};\n","// Context Menu: popup/dropdown menu.\nimport React from 'react';\nimport ReactDOM from 'react-dom';\nimport { injectIntl, defineMessages } from 'react-intl';\n\nimport { REM_SIZE } from '../config.js';\nimport HashNavigation from '../lib/navigation.js';\n\nconst messages = defineMessages({\n info: {\n id: 'menu_item_info',\n defaultMessage: 'Info',\n description: 'Show extended topic information'\n },\n clear_messages: {\n id: 'menu_item_clear_messages',\n defaultMessage: 'Clear messages',\n description: 'Delete all messages'\n },\n clear_for_all: {\n id: 'menu_item_clear_messages_for_all',\n defaultMessage: 'Clear for All',\n description: 'Delete all message(s) for all members'\n },\n 'delete': {\n id: 'menu_item_delete',\n defaultMessage: 'Delete',\n description: 'Delete selected messages'\n },\n delete_for_all: {\n id: 'menu_item_delete_for_all',\n defaultMessage: 'Delete for All',\n description: 'Delete selected message(s) for all members'\n },\n send_retry: {\n id: 'menu_item_send_retry',\n defaultMessage: 'Retry',\n description: 'Retry sending message'\n },\n mute: {\n id: 'menu_item_mute',\n defaultMessage: 'Mute',\n description: 'Turn off notifications'\n },\n unmute: {\n id: 'menu_item_unmute',\n defaultMessage: 'Unmute',\n description: 'Turn notifications on'\n },\n topic_delete: {\n id: 'menu_item_delete_topic',\n defaultMessage: 'Delete',\n description: 'Delete entire topic'\n },\n topic_delete_warning: {\n id: 'topic_delete_warning',\n defaultMessage: 'Are you sure you want to delete this conversation?',\n description: 'Alert warning when deleting entire topic'\n },\n unblock: {\n id: 'menu_item_unblock',\n defaultMessage: 'Unblock',\n description: 'Unblock topic or user'\n },\n // Generic string suitable for either topic or user.\n block: {\n id: 'menu_item_block',\n defaultMessage: 'Block',\n description: 'Block topic or user'\n },\n topic_block_warning: {\n id: 'topic_block_warning',\n defaultMessage: 'Are you sure you want to block this conversation?',\n description: 'Alert warning when blocking a topic.'\n },\n member_delete: {\n id: 'menu_item_member_delete',\n defaultMessage: 'Remove',\n description: 'Remove user from topic'\n },\n archive: {\n id: 'menu_item_archive_topic',\n defaultMessage: 'Archive',\n description: 'Move topic from the list of active chats to archive'\n }\n});\n\nclass ContextMenu extends React.Component {\n constructor(props) {\n super(props);\n\n const {formatMessage} = props.intl;\n\n this.handlePageClick = this.handlePageClick.bind(this);\n this.handleEscapeKey = this.handleEscapeKey.bind(this);\n this.handleClick = this.handleClick.bind(this);\n\n // Preconfigured menu items.\n this.MenuItems = {\n 'topic_info': {\n id: 'topic_info',\n title: formatMessage(messages.info),\n handler: null\n },\n 'messages_clear': {\n id: 'messages_clear',\n title: formatMessage(messages.clear_messages),\n handler: (params, errorHandler) => {\n return props.onShowAlert(\n formatMessage({id: 'menu_item_clear_messages'}), // title\n formatMessage({id: 'clear_messages_warning'}), // content\n (() => { this.deleteMessages(true, false, params, errorHandler); }), // onConfirm\n null, // \"OK\"\n true, // Show Reject button\n null // \"Cancel\"\n );\n }\n },\n 'messages_clear_hard': {\n id: 'messages_clear_hard',\n title: formatMessage(messages.clear_for_all),\n handler: (params, errorHandler) => {\n return props.onShowAlert(\n formatMessage({id: 'menu_item_clear_messages_for_all'}), // title\n formatMessage({id: 'delete_messages_warning'}), // content\n (() => { return this.deleteMessages(true, true, params, errorHandler); }),\n null, // \"OK\"\n true, // Show Reject button\n null // \"Cancel\"\n );\n }\n },\n 'message_delete': {\n id: 'message_delete',\n title: formatMessage(messages.delete),\n handler: (params, errorHandler) => {\n return this.deleteMessages(false, false, params, errorHandler);\n }\n },\n 'message_delete_hard': {\n id: 'message_delete_hard',\n title: formatMessage(messages.delete_for_all),\n handler: (params, errorHandler) => {\n return this.deleteMessages(false, true, params, errorHandler);\n }\n },\n 'menu_item_send_retry': {\n id: 'menu_item_send_retry',\n title: formatMessage(messages.send_retry),\n handler: (params, errorHandler) => {\n return this.retryMessage(params, errorHandler);\n }\n },\n 'topic_unmute': {\n id: 'topic_unmute',\n title: formatMessage(messages.unmute),\n handler: this.topicPermissionSetter.bind(this, '+P')\n },\n 'topic_mute': {\n id: 'topic_mute',\n title: formatMessage(messages.mute),\n handler: this.topicPermissionSetter.bind(this, '-P')\n },\n 'topic_unblock': {\n id: 'topic_unblock',\n title: formatMessage(messages.unblock),\n handler: this.topicPermissionSetter.bind(this, '+JP')\n },\n 'topic_block': {\n id: 'topic_block',\n title: formatMessage(messages.block),\n handler: (params, errorHandler) => {\n return props.onShowAlert(\n formatMessage({id: 'menu_item_block'}), // title\n formatMessage(messages.topic_block_warning), // content\n (() => {\n return this.topicPermissionSetter('-JP', params, errorHandler).then((ctrl) => {\n this.props.onTopicRemoved(params.topicName);\n return ctrl;\n });\n }),\n null, // \"OK\"\n true, // Show Reject button\n null // \"Cancel\"\n );\n }\n },\n 'topic_delete': {\n id: 'topic_delete',\n title: formatMessage(messages.topic_delete),\n handler: (params, errorHandler) => {\n return props.onShowAlert(\n formatMessage({id: 'menu_item_delete_topic'}), // title\n formatMessage(messages.topic_delete_warning), // content\n (() => {\n const topic = this.props.tinode.getTopic(params.topicName);\n if (!topic) {\n console.log(\"Topic not found: \", params.topicName);\n return;\n }\n return topic.delTopic(true).catch((err) => {\n if (errorHandler) {\n errorHandler(err.message, 'err');\n }\n });\n }),\n null, // \"OK\"\n true, // Show Reject button\n null // \"Cancel\"\n );\n }\n },\n 'topic_archive': {\n id: 'topic_archive',\n title: formatMessage(messages.archive),\n handler: (params, errorHandler) => {\n const topic = this.props.tinode.getTopic(params.topicName);\n if (!topic) {\n console.log(\"Topic not found: \", params.topicName);\n return;\n }\n return topic.archive(true).catch((err) => {\n if (errorHandler) {\n errorHandler(err.message, 'err');\n }\n });\n }\n },\n // menu_item_edit_permissions is defined elsewhere.\n 'permissions': {\n id: 'permissions',\n title: formatMessage({id: 'menu_item_edit_permissions'}),\n handler: null\n },\n 'member_delete': {\n id: 'member_delete',\n title: formatMessage(messages.member_delete),\n handler: (params, errorHandler) => {\n const topic = this.props.tinode.getTopic(params.topicName);\n if (!topic || !params.user) {\n console.log(\"Topic or user not found: '\" + params.topicName + \"', '\" + params.user + \"'\");\n return;\n }\n return topic.delSubscription(params.user).catch((err) => {\n if (errorHandler) {\n errorHandler(err.message, 'err');\n }\n });\n }\n },\n 'member_mute': {\n id: 'member_mute',\n title: formatMessage(messages.mute),\n handler: this.topicPermissionSetter.bind(this, '-P')\n },\n 'member_unmute': {\n id: 'member_unmute',\n title: formatMessage(messages.unmute),\n handler: this.topicPermissionSetter.bind(this, '+P')\n },\n 'member_block': {\n id: 'member_block',\n title: formatMessage(messages.block),\n handler: this.topicPermissionSetter.bind(this, '-JP')\n },\n 'member_unblock': {\n id: 'member_unblock',\n title: formatMessage(messages.unblock),\n handler: this.topicPermissionSetter.bind(this, '+JP')\n },\n };\n }\n\n componentDidMount() {\n document.addEventListener('mousedown', this.handlePageClick, false);\n document.addEventListener('keyup', this.handleEscapeKey, false);\n }\n\n componentWillUnmount() {\n document.removeEventListener('mousedown', this.handlePageClick, false);\n document.removeEventListener('keyup', this.handleEscapeKey, false);\n }\n\n handlePageClick(e) {\n if (ReactDOM.findDOMNode(this).contains(e.target)) {\n return;\n }\n e.preventDefault();\n e.stopPropagation();\n this.props.hide();\n }\n\n handleEscapeKey(e) {\n if (e.keyCode === 27) {\n this.props.hide();\n }\n }\n\n handleClick(e) {\n e.preventDefault();\n e.stopPropagation();\n this.props.hide();\n let item = this.props.items[e.currentTarget.dataset.id];\n if (typeof item == 'string') {\n item = this.MenuItems[item];\n }\n\n if (!item) {\n console.log(\"Invalid menu item ID\", e.currentTarget.dataset.id);\n } else {\n this.props.onAction(\n item.id,\n item.handler(this.props.params, this.props.onError),\n this.props.params);\n }\n }\n\n // Menu Actions\n\n deleteMessages(all, hard, params, errorHandler) {\n const topic = this.props.tinode.getTopic(params.topicName);\n if (!topic) {\n console.log(\"Topic not found: \", params.topicName);\n return;\n }\n\n // We don't know if the message is still pending (e.g. attachment is being uploaded),\n // so try cancelling first. No harm if we can't cancel.\n // The message can be cancelled if transmission to the server has not\n // started yet or if the message send has failed.\n if (!all && topic.cancelSend(params.seq)) {\n return;\n }\n // Can't cancel. Delete instead.\n const promise = all ?\n topic.delMessagesAll(hard) :\n topic.delMessagesList([params.seq], hard);\n\n return promise.catch((err) => {\n if (errorHandler) {\n errorHandler(err.message, 'err');\n }\n });\n }\n\n // Retries sending failed message.\n retryMessage(params, errorHandler) {\n const topic = this.props.tinode.getTopic(params.topicName);\n // Remove the existing message entry.\n if (!topic || !topic.flushMessage(params.seq)) {\n return;\n }\n const msg = topic.createMessage(params.content, false);\n return topic.publishDraft(msg).catch((err) => {\n if (errorHandler) {\n errorHandler(err.message, 'err');\n }\n });\n }\n\n // Function is used by context menu to set permissions.\n topicPermissionSetter(mode, params, errorHandler) {\n const topic = this.props.tinode.getTopic(params.topicName);\n if (!topic) {\n console.log(\"Topic not found\", params.topicName);\n return;\n }\n\n let result = topic.updateMode(params.user, mode);\n if (errorHandler) {\n result = result.catch((err) => {\n errorHandler(err.message, 'err');\n });\n }\n return result;\n }\n\n render() {\n let count = 0;\n let menu = [];\n this.props.items.map((item) => {\n if (typeof item == 'string') {\n item = this.MenuItems[item];\n }\n if (item && item.title) {\n menu.push(\n item.title == '-' ?\n
  • \n :\n
  • {item.title}
  • \n );\n }\n count++;\n });\n\n // Ensure that menu is inside the app-container.\n const hSize = 12 * REM_SIZE;\n const vSize = REM_SIZE * (0.7 + menu.length * 2.5);\n const left = (this.props.bounds.right - this.props.clickAt.x < hSize) ?\n (this.props.clickAt.x - this.props.bounds.left - hSize) :\n (this.props.clickAt.x - this.props.bounds.left);\n const top = (this.props.bounds.bottom - this.props.clickAt.y < vSize) ?\n (this.props.clickAt.y - this.props.bounds.top - vSize) :\n (this.props.clickAt.y - this.props.bounds.top);\n\n const position = {\n left: left + 'px',\n top: top + 'px'\n };\n\n return (\n
      \n {menu}\n
    \n );\n }\n}\n\nexport default injectIntl(ContextMenu);\n","import React from 'react';\nimport { FormattedMessage } from 'react-intl';\nimport SendMessage from '../widgets/send-message.jsx';\n\nimport { bytesToHumanSize } from '../lib/strformat.js';\n\n// Get material icon name from mime type.\nfunction iconFromMime(mime) {\n // If more icons become available in material icons, add them to this mime-to-icon mapping.\n const mimeToIcon = {default: 'insert_drive_file', image: 'image', text: 'description', video: 'theaters'};\n\n return mimeToIcon[mime] || mimeToIcon[(mime || '').split('/')[0]] || mimeToIcon['default'];\n}\n\nexport default class DocPreview extends React.PureComponent {\n constructor(props) {\n super(props);\n\n this.handleSendDoc = this.handleSendDoc.bind(this);\n }\n\n handleSendDoc(caption) {\n this.props.onClose();\n this.props.onSendMessage(this.props.content.file);\n }\n\n render() {\n if (!this.props.content) {\n return null;\n }\n return (\n
    \n
    \n {this.props.content.filename}\n {e.preventDefault(); this.props.onClose();}}>close\n
    \n
    \n
    \n {iconFromMime(this.props.content.type)}\n
    {this.props.content.type || 'application/octet-stream'}
    \n
    {bytesToHumanSize(this.props.content.size)}
    \n
    \n
    \n \n
    \n );\n }\n};\n","import React from 'react';\n\nimport MenuCancel from './menu-cancel.jsx';\n\nexport default class ErrorPanel extends React.PureComponent {\n constructor(props) {\n super(props);\n\n this.state = {\n show: false,\n };\n\n this.hide = this.hide.bind(this);\n }\n\n componentDidUpdate(prevProps) {\n if (prevProps.level !== this.props.level) {\n this.setState({\n show: !(!this.props.level)\n });\n }\n }\n\n hide() {\n this.setState({show: false});\n if (this.props.onClearError) {\n this.props.onClearError();\n }\n }\n\n render() {\n const icons = {err: 'error', warn: 'warning', info: 'info'}\n const level = icons[this.props.level] || '';\n const className = 'info-box ' + level;\n return (\n
    \n
    {level}
    \n \n {this.props.text}\n {this.props.action ?\n <>\n {e.preventDefault(); this.props.action();}}>\n {this.props.actionText}\n \n \n : null}\n \n
    \n
    \n );\n }\n};\n","// File uload/download progress indicator with a cancel inside.\nimport React from 'react';\nimport { FormattedMessage } from 'react-intl';\n\nexport default class FileProgress extends React.PureComponent {\n render() {\n return (\n
    \n
    \n {this.props.progress < 0.999 ?\n {e.preventDefault(); this.props.onCancel();}}>\n close \n \n :\n \n }\n
    \n );\n }\n}\n","// GroupMembers: control for managing a list of group members.\nimport React from 'react';\nimport { FormattedMessage, defineMessages, injectIntl } from 'react-intl';\n\nimport ChipInput from './chip-input.jsx';\nimport ContactList from './contact-list.jsx';\n\nconst messages = defineMessages({\n no_contacts: {\n id: 'no_contacts',\n defaultMessage: 'You have no contacts :-(',\n description: 'Shown in ContactsView when the user has no contacts'\n },\n contacts_not_found_short: {\n id: 'contacts_not_found_short',\n defaultMessage: \"No contacts match ''{query}''\",\n description: 'Shown in ContactsView when search returned no results'\n }\n});\n\nclass GroupManager extends React.Component {\n constructor(props) {\n super(props);\n\n this.state = {\n // Array of topic members\n members: props.members,\n index: GroupManager.indexMembers(props.members),\n staticMembers: GroupManager.staticMembers(props.members, props.keepInitialMembers, props.requiredMember),\n contactFilter: '',\n noContactsMessage: props.intl.formatMessage(messages.no_contacts),\n selectedContacts: GroupManager.selectedContacts(props.members)\n };\n\n this.handleContactSelected = this.handleContactSelected.bind(this);\n this.handleMemberRemoved = this.handleMemberRemoved.bind(this);\n this.handleContactFilter = this.handleContactFilter.bind(this);\n this.handleSubmit = this.handleSubmit.bind(this);\n this.handleCancel = this.handleCancel.bind(this);\n }\n\n static indexMembers(members) {\n let index = {};\n members.map((m) => {\n index[m.user] = {delta: 0, present: true}; // Delta: 0 unchanged, +1 added, -1 removed\n });\n return index;\n }\n\n static staticMembers(members, keepInitial, requiredMember) {\n let stat = [];\n members.map((m) => {\n if (keepInitial || m.user == requiredMember) {\n stat.push(m.user);\n }\n });\n return stat;\n }\n\n static selectedContacts(members) {\n let sel = [];\n members.map((m) => {\n sel.push(m.user);\n });\n return sel;\n }\n\n handleContactSelected(userId, index) {\n let status = this.state.index[userId];\n if (status) {\n if (status.present) {\n // Prevent duplicate members\n return;\n }\n status.delta += 1;\n status.present = true;\n } else {\n status = {delta: 1, present: true};\n }\n\n let m = this.state.members.slice();\n m.push(this.props.contacts[index]);\n\n const sel = GroupManager.selectedContacts(m);\n\n const i = this.state.index;\n i[userId] = status;\n\n this.setState({members: m, index: i, selectedContacts: sel});\n }\n\n handleMemberRemoved(userId, index) {\n const status = this.state.index[userId];\n if (!status || !status.present) {\n return;\n }\n status.present = false;\n status.delta -= 1;\n\n let m = this.state.members.slice();\n m.splice(index, 1);\n\n const sel = GroupManager.selectedContacts(m);\n\n const i = this.state.index;\n i[userId] = status;\n\n this.setState({members: m, index: i, selectedContacts: sel});\n }\n\n handleContactFilter(val) {\n const {formatMessage} = this.props.intl;\n const msg = !val ?\n formatMessage(messages.no_contacts) :\n formatMessage(messages.contacts_not_found_short, {query: val});\n\n this.setState({contactFilter: val, noContactsMessage: msg});\n }\n\n static doContactFiltering(filter, values) {\n if (filter) {\n for (let i=0; i= 0) {\n return true;\n }\n }\n return false;\n }\n return true;\n }\n\n handleSubmit() {\n var instance = this;\n var members = [];\n var added = [];\n var removed = [];\n\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 handleCancel() {\n this.props.onCancel();\n }\n\n render() {\n const {formatMessage} = this.props.intl;\n return (\n
    \n
    \n \n
    \n
    \n \n
    \n
    \n \n
    \n \n
    \n \n \n
    \n
    \n );\n }\n};\n\nexport default injectIntl(GroupManager);\n","// GroupSubs: a list of group subscribers currently online.\n// Show in the topic title bar\nimport React from 'react';\nimport { FormattedMessage } from 'react-intl';\n\nimport { MAX_ONLINE_IN_TOPIC } from '../config.js'\n\nimport LetterTile from './letter-tile.jsx';\nimport { makeImageUrl } from '../lib/blob-helpers.js';\n\nexport default class GroupSubs extends React.Component {\n constructor(props) {\n super(props);\n }\n\n render() {\n const usersOnline = [];\n const totalCount = (this.props.subscribers || []).length;\n const countToShow = Math.min(MAX_ONLINE_IN_TOPIC, totalCount);\n\n (this.props.subscribers || []).some((sub) => {\n usersOnline.push(\n
    \n \n
    \n );\n return usersOnline.length == countToShow;\n });\n\n return (\n
    {usersOnline} {totalCount > countToShow ?\n \n \n : null}\n
    \n );\n }\n};\n","import React from 'react';\n\nimport { KNOWN_HOSTS } from '../config.js';\n\n/* Combobox for selecting host name */\n\nexport default class HostSelector extends React.PureComponent {\n constructor(props) {\n super(props);\n\n this.state = {\n hostName: props.serverAddress,\n changed: false\n };\n\n this.handleHostNameChange = this.handleHostNameChange.bind(this);\n this.handleEditingFinished = this.handleEditingFinished.bind(this);\n }\n\n handleHostNameChange(e) {\n this.setState({hostName: e.target.value, changed: true});\n }\n\n handleEditingFinished() {\n if (this.state.changed) {\n this.setState({changed: false});\n this.props.onServerAddressChange(this.state.hostName.trim());\n }\n }\n\n render() {\n var hostOptions = [];\n for (let key in KNOWN_HOSTS) {\n let item = KNOWN_HOSTS[key];\n hostOptions.push(\n