diff --git a/umd/125.prod.js b/umd/125.prod.js
new file mode 100644
index 00000000..ee997fa9
--- /dev/null
+++ b/umd/125.prod.js
@@ -0,0 +1,2 @@
+"use strict";(self.webpackChunktinode_webapp=self.webpackChunktinode_webapp||[]).push([[125],{9125:function(d,e,c){c.r(e);var l=c(1594),o=c.n(l),a=c(8181),i=c(111),s=c(7256),n=c(4848);class t extends o().PureComponent{constructor(d){super(d),this.countries=[];const{formatDisplayName:e}=d.intl;i.forEach(d=>{d.dial.split(",").forEach(c=>{this.countries.push({dial:c.trim(),code:d.code,flag:(0,s.lb)(d.code),name:e(d.code,{type:"region"})})})}),this.countries.sort((d,e)=>d.name.localeCompare(e.name))}componentDidMount(){this.selectedRef&&this.selectedRef.scrollIntoView({block:"center",inline:"nearest"})}render(){const d=[],e=this.props.selected||"US";return this.countries.forEach((c,l)=>{const o=c.code==e?"selected ":"";d.push((0,n.jsxs)("li",{className:o,ref:d=>{c.code==e&&(this.selectedRef=d)},onClick:d=>this.props.onSubmit(c.code,c.dial),children:[(0,n.jsx)("span",{className:"country-flag",children:c.flag}),(0,n.jsxs)("span",{className:"country",children:[" ",c.name]}),(0,n.jsxs)("span",{className:"dial-code",children:[" +",c.dial]})]},l))}),(0,n.jsx)("div",{className:"scrollable-panel",style:{height:"30rem"},children:(0,n.jsx)("ul",{className:"phone-country-selector",children:d})})}}e.default=(0,a.injectIntl)(t)},111:function(d){d.exports=JSON.parse('[{"dial":"93","code":"AF"},{"dial":"355","code":"AL"},{"dial":"213","code":"DZ"},{"dial":"1-684","code":"AS"},{"dial":"376","code":"AD"},{"dial":"244","code":"AO"},{"dial":"1-264","code":"AI"},{"dial":"672","code":"AQ"},{"dial":"1-268","code":"AG"},{"dial":"54","code":"AR"},{"dial":"374","code":"AM"},{"dial":"297","code":"AW"},{"dial":"61","code":"AU"},{"dial":"43","code":"AT"},{"dial":"994","code":"AZ"},{"dial":"1-242","code":"BS"},{"dial":"973","code":"BH"},{"dial":"880","code":"BD"},{"dial":"1-246","code":"BB"},{"dial":"375","code":"BY"},{"dial":"32","code":"BE"},{"dial":"501","code":"BZ"},{"dial":"229","code":"BJ"},{"dial":"1-441","code":"BM"},{"dial":"975","code":"BT"},{"dial":"591","code":"BO"},{"dial":"387","code":"BA"},{"dial":"267","code":"BW"},{"dial":"55","code":"BR"},{"dial":"246","code":"IO"},{"dial":"1-284","code":"VG"},{"dial":"673","code":"BN"},{"dial":"359","code":"BG"},{"dial":"226","code":"BF"},{"dial":"257","code":"BI"},{"dial":"855","code":"KH"},{"dial":"237","code":"CM"},{"dial":"1","code":"CA"},{"dial":"238","code":"CV"},{"dial":"1-345","code":"KY"},{"dial":"236","code":"CF"},{"dial":"235","code":"TD"},{"dial":"56","code":"CL"},{"dial":"86","code":"CN"},{"dial":"61","code":"CX"},{"dial":"61","code":"CC"},{"dial":"57","code":"CO"},{"dial":"269","code":"KM"},{"dial":"682","code":"CK"},{"dial":"506","code":"CR"},{"dial":"385","code":"HR"},{"dial":"53","code":"CU"},{"dial":"599","code":"CW"},{"dial":"357","code":"CY"},{"dial":"420","code":"CZ"},{"dial":"243","code":"CD"},{"dial":"45","code":"DK"},{"dial":"253","code":"DJ"},{"dial":"1-767","code":"DM"},{"dial":"1-809, 1-829, 1-849","code":"DO"},{"dial":"670","code":"TL"},{"dial":"593","code":"EC"},{"dial":"20","code":"EG"},{"dial":"503","code":"SV"},{"dial":"240","code":"GQ"},{"dial":"291","code":"ER"},{"dial":"372","code":"EE"},{"dial":"251","code":"ET"},{"dial":"500","code":"FK"},{"dial":"298","code":"FO"},{"dial":"679","code":"FJ"},{"dial":"358","code":"FI"},{"dial":"33","code":"FR"},{"dial":"689","code":"PF"},{"dial":"241","code":"GA"},{"dial":"220","code":"GM"},{"dial":"995","code":"GE"},{"dial":"49","code":"DE"},{"dial":"233","code":"GH"},{"dial":"350","code":"GI"},{"dial":"30","code":"GR"},{"dial":"299","code":"GL"},{"dial":"1-473","code":"GD"},{"dial":"1-671","code":"GU"},{"dial":"502","code":"GT"},{"dial":"44-1481","code":"GG"},{"dial":"224","code":"GN"},{"dial":"245","code":"GW"},{"dial":"592","code":"GY"},{"dial":"509","code":"HT"},{"dial":"504","code":"HN"},{"dial":"852","code":"HK"},{"dial":"36","code":"HU"},{"dial":"354","code":"IS"},{"dial":"91","code":"IN"},{"dial":"62","code":"ID"},{"dial":"98","code":"IR"},{"dial":"964","code":"IQ"},{"dial":"353","code":"IE"},{"dial":"44-1624","code":"IM"},{"dial":"972","code":"IL"},{"dial":"39","code":"IT"},{"dial":"225","code":"CI"},{"dial":"1-876","code":"JM"},{"dial":"81","code":"JP"},{"dial":"44-1534","code":"JE"},{"dial":"962","code":"JO"},{"dial":"7, 997","code":"KZ"},{"dial":"254","code":"KE"},{"dial":"686","code":"KI"},{"dial":"383","code":"XK"},{"dial":"965","code":"KW"},{"dial":"996","code":"KG"},{"dial":"856","code":"LA"},{"dial":"371","code":"LV"},{"dial":"961","code":"LB"},{"dial":"266","code":"LS"},{"dial":"231","code":"LR"},{"dial":"218","code":"LY"},{"dial":"423","code":"LI"},{"dial":"370","code":"LT"},{"dial":"352","code":"LU"},{"dial":"853","code":"MO"},{"dial":"389","code":"MK"},{"dial":"261","code":"MG"},{"dial":"265","code":"MW"},{"dial":"60","code":"MY"},{"dial":"960","code":"MV"},{"dial":"223","code":"ML"},{"dial":"356","code":"MT"},{"dial":"692","code":"MH"},{"dial":"222","code":"MR"},{"dial":"230","code":"MU"},{"dial":"262","code":"YT"},{"dial":"52","code":"MX"},{"dial":"691","code":"FM"},{"dial":"373","code":"MD"},{"dial":"377","code":"MC"},{"dial":"976","code":"MN"},{"dial":"382","code":"ME"},{"dial":"1-664","code":"MS"},{"dial":"212","code":"MA"},{"dial":"258","code":"MZ"},{"dial":"95","code":"MM"},{"dial":"264","code":"NA"},{"dial":"674","code":"NR"},{"dial":"977","code":"NP"},{"dial":"31","code":"NL"},{"dial":"599","code":"CW"},{"dial":"687","code":"NC"},{"dial":"64","code":"NZ"},{"dial":"505","code":"NI"},{"dial":"227","code":"NE"},{"dial":"234","code":"NG"},{"dial":"683","code":"NU"},{"dial":"850","code":"KP"},{"dial":"1-670","code":"MP"},{"dial":"47","code":"NO"},{"dial":"968","code":"OM"},{"dial":"92","code":"PK"},{"dial":"680","code":"PW"},{"dial":"970","code":"PS"},{"dial":"507","code":"PA"},{"dial":"675","code":"PG"},{"dial":"595","code":"PY"},{"dial":"51","code":"PE"},{"dial":"63","code":"PH"},{"dial":"64","code":"PN"},{"dial":"48","code":"PL"},{"dial":"351","code":"PT"},{"dial":"1-787, 1-939","code":"PR"},{"dial":"974","code":"QA"},{"dial":"242","code":"CG"},{"dial":"262","code":"RE"},{"dial":"40","code":"RO"},{"dial":"7","code":"RU"},{"dial":"250","code":"RW"},{"dial":"590","code":"BL"},{"dial":"290","code":"SH"},{"dial":"1-869","code":"KN"},{"dial":"1-758","code":"LC"},{"dial":"590","code":"MF"},{"dial":"508","code":"PM"},{"dial":"1-784","code":"VC"},{"dial":"685","code":"WS"},{"dial":"378","code":"SM"},{"dial":"239","code":"ST"},{"dial":"966","code":"SA"},{"dial":"221","code":"SN"},{"dial":"381","code":"RS"},{"dial":"248","code":"SC"},{"dial":"232","code":"SL"},{"dial":"65","code":"SG"},{"dial":"1-721","code":"SX"},{"dial":"421","code":"SK"},{"dial":"386","code":"SI"},{"dial":"677","code":"SB"},{"dial":"252","code":"SO"},{"dial":"27","code":"ZA"},{"dial":"82","code":"KR"},{"dial":"211","code":"SS"},{"dial":"34","code":"ES"},{"dial":"94","code":"LK"},{"dial":"249","code":"SD"},{"dial":"597","code":"SR"},{"dial":"47","code":"SJ"},{"dial":"268","code":"SZ"},{"dial":"46","code":"SE"},{"dial":"41","code":"CH"},{"dial":"963","code":"SY"},{"dial":"886","code":"TW"},{"dial":"992","code":"TJ"},{"dial":"255","code":"TZ"},{"dial":"66","code":"TH"},{"dial":"228","code":"TG"},{"dial":"690","code":"TK"},{"dial":"676","code":"TO"},{"dial":"1-868","code":"TT"},{"dial":"216","code":"TN"},{"dial":"90","code":"TR"},{"dial":"993","code":"TM"},{"dial":"1-649","code":"TC"},{"dial":"688","code":"TV"},{"dial":"1-340","code":"VI"},{"dial":"256","code":"UG"},{"dial":"380","code":"UA"},{"dial":"971","code":"AE"},{"dial":"44","code":"GB"},{"dial":"1","code":"US"},{"dial":"598","code":"UY"},{"dial":"998","code":"UZ"},{"dial":"678","code":"VU"},{"dial":"379","code":"VA"},{"dial":"58","code":"VE"},{"dial":"84","code":"VN"},{"dial":"681","code":"WF"},{"dial":"212","code":"EH"},{"dial":"967","code":"YE"},{"dial":"260","code":"ZM"},{"dial":"263","code":"ZW"}]')}}]);
+//# sourceMappingURL=125.prod.js.map
\ No newline at end of file
diff --git a/umd/125.prod.js.map b/umd/125.prod.js.map
new file mode 100644
index 00000000..8bf9c7c3
--- /dev/null
+++ b/umd/125.prod.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"125.prod.js","mappings":"wLASA,MAAMA,UAA6BC,IAAA,cACjC,WAAAC,CAAYC,GACVC,MAAMD,GAENE,KAAKC,UAAY,GACjB,MAAMC,kBAAEA,GAAsBJ,EAAMK,KACpCC,EAAeC,QAAQC,IACPA,EAAGC,KAAKC,MAAM,KACtBH,QAAQI,IACZT,KAAKC,UAAUS,KAAK,CAClBH,KAAME,EAAKE,OACXC,KAAMN,EAAGM,KACTC,MAAM,EAAAC,EAAAC,IAAUT,EAAGM,MACnBI,KAAMd,EAAkBI,EAAGM,KAAM,CAACK,KAAM,iBAK9CjB,KAAKC,UAAUiB,KAAK,CAACC,EAAGC,IAAMD,EAAEH,KAAKK,cAAcD,EAAEJ,MACvD,CAEA,iBAAAM,GACMtB,KAAKuB,aACPvB,KAAKuB,YAAYC,eAAe,CAACC,MAAO,SAAUC,OAAQ,WAE9D,CAEA,MAAAC,GACE,MAAM1B,EAAY,GACZ2B,EAAW5B,KAAKF,MAAM8B,UAAY,KAYxC,OAXA5B,KAAKC,UAAUI,QAAQ,CAACwB,EAAGC,KACzB,MAAMC,EAASF,EAAEjB,MAAQgB,EAAW,YAAc,GAClD3B,EAAUS,MAAK,EAAAsB,EAAAC,MAAA,MAAIC,UAAWH,EAC5BI,IAAKA,IAAYN,EAAEjB,MAAQgB,IAAW5B,KAAKuB,YAAcY,IACzDC,QAASC,GAAKrC,KAAKF,MAAMwC,SAAST,EAAEjB,KAAMiB,EAAEtB,MAAMgC,SAAA,EAClD,EAAAP,EAAAQ,KAAA,QAAMN,UAAU,eAAcK,SAAEV,EAAEhB,QAClC,EAAAmB,EAAAC,MAAA,QAAMC,UAAU,UAASK,SAAA,CAAC,IAAOV,EAAEb,SACnC,EAAAgB,EAAAC,MAAA,QAAMC,UAAU,YAAWK,SAAA,CAAC,KAAQV,EAAEtB,UALEuB,OAU1C,EAAAE,EAAAQ,KAAA,OAAKN,UAAU,mBAAmBH,MAAO,CAACU,OAAQ,SAASF,UACzD,EAAAP,EAAAQ,KAAA,MAAIN,UAAU,yBAAwBK,SACnCtC,KAIT,EAGFyC,EAAA,SAAe,EAAAC,EAAAC,YAAWjD","sources":["webpack://tinode-webapp/./src/widgets/phone-country-selector.jsx"],"sourcesContent":["// Selector for country dialing code.\n\nimport React from 'react';\nimport { injectIntl } from 'react-intl';\n\nimport * as dcodes from '../dcodes.json';\n\nimport { flagEmoji } from '../lib/strformat';\n\nclass PhoneCountrySelector extends React.PureComponent {\n constructor(props) {\n super(props);\n\n this.countries = [];\n const { formatDisplayName } = props.intl;\n dcodes.default.forEach(dc => {\n const parts = dc.dial.split(',');\n parts.forEach(part => {\n this.countries.push({\n dial: part.trim(),\n code: dc.code,\n flag: flagEmoji(dc.code),\n name: formatDisplayName(dc.code, {type: 'region'})\n });\n });\n });\n\n this.countries.sort((a, b) => a.name.localeCompare(b.name));\n }\n\n componentDidMount() {\n if (this.selectedRef) {\n this.selectedRef.scrollIntoView({block: 'center', inline: 'nearest'});\n }\n }\n\n render() {\n const countries = [];\n const selected = this.props.selected || 'US';\n this.countries.forEach((c, idx) => {\n const style = (c.code == selected ? 'selected ' : '');\n countries.push(
{if (c.code == selected) {this.selectedRef = ref}}}\n onClick={_ => this.props.onSubmit(c.code, c.dial)}>\n {c.flag} \n {c.name} \n +{c.dial} \n );\n });\n\n return (\n \n );\n }\n}\n\nexport default injectIntl(PhoneCountrySelector);\n"],"names":["PhoneCountrySelector","react__WEBPACK_IMPORTED_MODULE_0___default","constructor","props","super","this","countries","formatDisplayName","intl","_dcodes_json__WEBPACK_IMPORTED_MODULE_2__","forEach","dc","dial","split","part","push","trim","code","flag","_lib_strformat__WEBPACK_IMPORTED_MODULE_3__","lb","name","type","sort","a","b","localeCompare","componentDidMount","selectedRef","scrollIntoView","block","inline","render","selected","c","idx","style","react_jsx_runtime__WEBPACK_IMPORTED_MODULE_4__","jsxs","className","ref","onClick","_","onSubmit","children","jsx","height","__webpack_exports__","react_intl__WEBPACK_IMPORTED_MODULE_1__","injectIntl"],"sourceRoot":""}
\ No newline at end of file
diff --git a/umd/158.prod.js b/umd/158.prod.js
new file mode 100644
index 00000000..85d91a30
--- /dev/null
+++ b/umd/158.prod.js
@@ -0,0 +1,2 @@
+"use strict";(self.webpackChunktinode_webapp=self.webpackChunktinode_webapp||[]).push([[158],{158:function(e,s,t){t.r(s),t.d(s,{default:function(){return D}});var i=t(1594),a=t.n(i),n=t(8181),o=t(4532),r=t(3889),l=t(6686),d=t(3207),c=t(3717),h=t(3405),p=t(4306),m=t(4848);const u=(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"},add_members_prompt:{id:"add_members_prompt",defaultMessage:"add members",description:"Placeholder in group members input field"}});class g extends a().Component{constructor(e){super(e),this.state={members:e.members,index:g.indexMembers(e.members),staticMembers:g.staticMembers(e.members,e.keepInitialMembers,e.requiredMember),contactFilter:"",noContactsMessage:e.intl.formatMessage(u.no_contacts),selectedContacts:g.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 s={};return e.forEach(e=>{s[e.user]={delta:0,present:!0}}),s}static staticMembers(e,s,t){let i=[];return e.forEach(e=>{(s||e.user==t)&&i.push(e.user)}),i}static selectedContacts(e){let s=[];return e.forEach(e=>{s.push(e.user)}),s}handleContactSelected(e,s){let t=this.state.index[e];if(t){if(t.present)return;t.delta+=1,t.present=!0}else t={delta:1,present:!0};let i=this.state.members.slice();i.push(this.props.contacts[s]);const a=g.selectedContacts(i),n=this.state.index;n[e]=t,this.setState({members:i,index:n,selectedContacts:a})}handleMemberRemoved(e,s){const t=this.state.index[e];if(!t||!t.present)return;t.present=!1,t.delta-=1;let i=this.state.members.slice();i.splice(s,1);const a=g.selectedContacts(i),n=this.state.index;n[e]=t,this.setState({members:i,index:n,selectedContacts:a})}handleContactFilter(e){const{formatMessage:s}=this.props.intl,t=e?s(u.contacts_not_found_short,{query:e}):s(u.no_contacts);this.setState({contactFilter:e,noContactsMessage:t})}static doContactFiltering(e,s){if(e){for(let t=0;t=0)return!0;return!1}return!0}handleSubmit(){const e=[],s=[],t=[];Object.keys(this.state.index).forEach(i=>{this.state.index[i].present&&e.push(i),this.state.index[i].delta>0?s.push(i):this.state.index[i].delta<0&&t.push(i)}),this.props.onSubmit(e,s,t)}handleCancel(){this.props.onCancel()}render(){return(0,m.jsxs)("div",{id:"group-manager",children:[(0,m.jsx)("div",{className:"panel-form-row",children:(0,m.jsx)("label",{className:"small",children:(0,m.jsx)(n.FormattedMessage,{id:"title_group_members",defaultMessage:"Group Members",description:"Section title"})})}),(0,m.jsx)("div",{className:"panel-form-row",children:(0,m.jsx)(p.A,{tinode:this.props.tinode,chips:this.state.members,staticMembers:this.state.staticMembers,prompt:this.props.intl.formatMessage(u.add_members_prompt),filterFunc:this.handleContactFilter,onChipRemoved:this.handleMemberRemoved})}),(0,m.jsx)("div",{className:"panel-form-row",children:(0,m.jsx)("label",{className:"small",children:(0,m.jsx)(n.FormattedMessage,{id:"title_all_contacts",defaultMessage:"All Contacts",description:"Section title [All Contacts]"})})}),(0,m.jsx)(c.A,{tinode:this.props.tinode,contacts:this.props.contacts,myUserId:this.props.myUserId,topicSelected:this.state.selectedContacts,filter:this.state.contactFilter,filterFunc:g.doContactFiltering,emptyListMessage:this.state.noContactsMessage,showOnline:!1,showUnread:!1,onTopicSelected:this.handleContactSelected}),(0,m.jsxs)("div",{id:"group-manager-buttons",className:"panel-form-row",children:[(0,m.jsx)("button",{className:"secondary",onClick:this.handleCancel,children:(0,m.jsx)(n.FormattedMessage,{id:"button_cancel",defaultMessage:"Cancel",description:"Button [Cancel]"})}),(0,m.jsx)("button",{className:"primary",onClick:this.handleSubmit,children:(0,m.jsx)(n.FormattedMessage,{id:"button_ok",defaultMessage:"OK",description:"Button [OK]"})})]})]})}}var b=(0,n.injectIntl)(g),f=t(5370),v=t(9022),x=t(9593),_=t.n(x);t(3272);class M extends a().PureComponent{constructor(e){super(e),this.qrCodeRef=a().createRef()}componentDidMount(){new(_())(this.qrCodeRef.current,{text:this.props.uri,width:128,height:128})}render(){return(0,m.jsxs)("div",{className:"panel-form-column",children:[(0,m.jsx)("br",{}),(0,m.jsx)("div",{className:"qr-code",ref:this.qrCodeRef}),(0,m.jsx)("div",{children:(0,m.jsx)("tt",{children:this.props.uri})}),(0,m.jsx)("div",{className:"dialog-buttons",children:(0,m.jsx)("button",{className:"outline",onClick:this.props.onCancel,children:(0,m.jsx)(n.FormattedMessage,{id:"button_ok",defaultMessage:"OK",description:"Button [OK]"})})})]})}}var j=t(6916);const C=(0,n.defineMessages)({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."},topic_delete:{id:"topic_delete",defaultMessage:"Delete Conversation",description:"Alert title when deleting the topic."},topic_delete_warning:{id:"topic_delete_warning",defaultMessage:"Are you sure you want to delete this conversation? It cannot be undone.",description:"Alert warning when deleting entire topic"},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"},other_user:{id:"label_other_user",defaultMessage:"Other",description:"Label for the other user when the user is unnamed"}});class N extends a().PureComponent{constructor(e){super(e),this.handleDeleteTopic=this.handleDeleteTopic.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)}handleDeleteTopic(e){e.preventDefault();const{formatMessage:s}=this.props.intl;this.props.onShowAlert(s(C.topic_delete),s(C.topic_delete_warning),e=>this.props.onDeleteTopic(this.props.topic),null,!0,null)}handleDeleteMessages(e){e.preventDefault();const{formatMessage:s}=this.props.intl;this.props.onShowAlert(s(this.props.deleter?C.delete_messages:C.clear_messages),s(this.props.deleter?C.delete_messages_warning:C.clear_messages_warning),e=>this.props.onDeleteMessages(this.props.topic),null,!0,null)}handleLeave(e){e.preventDefault();const{formatMessage:s}=this.props.intl;this.props.onShowAlert(s(C.leave_chat),s(C.leave_chat_warning),e=>this.props.onLeaveTopic(this.props.topic),null,!0,null)}handleBlock(e){e.preventDefault();const{formatMessage:s}=this.props.intl;this.props.onShowAlert(s(C.block_contact),s(C.block_contact_warning),e=>this.props.onBlockTopic(this.props.topic),null,!0,null)}handleReport(e){e.preventDefault();const{formatMessage:s}=this.props.intl;this.props.onShowAlert(s(C.report_chat),s(C.report_chat_warning),e=>{this.props.onReportTopic(this.props.topic)},null,!0,null)}render(){const{formatMessage:e}=this.props.intl;return(0,m.jsxs)("div",{className:"scrollable-panel",children:[(0,m.jsxs)("div",{className:"panel-form-column",children:[this.props.channel?null:(0,m.jsxs)("a",{href:"#",className:"flat-button",onClick:this.handleDeleteMessages,children:[(0,m.jsx)("i",{className:"material-icons",children:"delete_outline"})," ",e(this.props.deleter?C.delete_messages:C.clear_messages)]}),this.props.owner?(0,m.jsxs)("a",{href:"#",className:"danger flat-button",onClick:this.handleDeleteTopic,children:[(0,m.jsx)("i",{className:"material-icons",children:"delete"})," ",e(C.topic_delete)]}):(0,m.jsxs)("a",{href:"#",className:"danger flat-button",onClick:this.handleLeave,children:[(0,m.jsx)("i",{className:"material-icons",children:"exit_to_app"})," ",e(C.leave_chat)]}),this.props.groupTopic?null:(0,m.jsxs)("a",{href:"#",className:"danger flat-button",onClick:this.handleBlock,children:[(0,m.jsx)("i",{className:"material-icons",children:"block"})," ",e(C.block_contact)]}),this.props.owner?null:(0,m.jsxs)("a",{href:"#",className:"danger flat-button",onClick:this.handleReport,children:[(0,m.jsx)("i",{className:"material-icons",children:"report"})," ",e(C.report_chat)]})]}),(0,m.jsx)("div",{className:"hr"}),(0,m.jsx)("div",{className:"panel-form-column",children:this.props.groupTopic?(0,m.jsxs)(m.Fragment,{children:[(0,m.jsxs)("div",{className:"group",children:[(0,m.jsx)("label",{children:(0,m.jsx)(n.FormattedMessage,{id:"label_your_permissions",defaultMessage:"Your permissions:",description:"Label for current user permissions"})})," ",(0,m.jsx)("tt",{className:"clickable",onClick:e=>{e.preventDefault(),this.props.onLaunchPermissionsEditor("want")},children:this.props.access})]}),this.props.channel?null:(0,m.jsxs)("div",{className:"group",children:[(0,m.jsx)("div",{children:(0,m.jsx)("label",{className:"small",children:(0,m.jsx)(n.FormattedMessage,{id:"label_default_access_mode",defaultMessage:"Default access mode:",description:"Label for default access mode"})})}),(0,m.jsxs)("div",{className:"quoted",children:[(0,m.jsxs)("div",{children:["Auth: ",(0,m.jsx)("tt",{className:this.props.owner?"clickable":null,onClick:e=>{e.preventDefault(),this.props.owner&&this.props.onLaunchPermissionsEditor("auth")},children:this.props.auth})]}),(0,m.jsxs)("div",{children:["Anon: ",(0,m.jsx)("tt",{className:this.props.owner?"clickable":null,onClick:e=>{e.preventDefault(),this.props.owner&&this.props.onLaunchPermissionsEditor("anon")},children:this.props.anon})]})]})]})]}):(0,m.jsxs)("div",{className:"group",children:[(0,m.jsx)("div",{children:(0,m.jsx)("label",{className:"small",children:(0,m.jsx)(n.FormattedMessage,{id:"label_permissions",defaultMessage:"Permissions:",description:"Section title"})})}),(0,m.jsxs)("div",{className:"quoted",children:[(0,m.jsxs)("div",{children:[(0,m.jsx)(n.FormattedMessage,{id:"label_you",defaultMessage:"You:",description:"Label for the current user"})," ",(0,m.jsx)("tt",{className:"clickable",onClick:e=>{e.preventDefault(),this.props.onLaunchPermissionsEditor("want")},children:this.props.access})]}),(0,m.jsxs)("div",{children:[this.props.fullName?this.props.fullName:e(C.other_user),": ",(0,m.jsx)("tt",{className:"clickable",onClick:e=>{e.preventDefault(),this.props.onLaunchPermissionsEditor("given")},children:this.props.modeGiven2})]})]})]})})]})}}var w=(0,n.injectIntl)(N),S=t(7981),T=t(7256);const k=(0,n.defineMessages)({info:{id:"panel_title_info",description:"Title for InfoView",defaultMessage:"Info"},general:{id:"panel_title_general",description:"Title for TopicCommon.",defaultMessage:"General"},security:{id:"panel_title_security",description:"Title for TopicSecirity and AccSecurity.",defaultMessage:"Security"},members:{id:"panel_title_members",description:"Title for managing group members view.",defaultMessage:"Members"},crop:{id:"panel_title_crop",description:"Title for AvatarCropView.",defaultMessage:"Drag to Adjust"},perm_want:{id:"requested_permissions",defaultMessage:"Requested",description:"Title for permissions"},perm_given:{id:"granted_permissions",defaultMessage:"Granted",description:"Title for permissions"},perm_auth:{id:"permissions_authenticated",defaultMessage:"Authenticated",description:"Title for editing default authenticated permissions"},perm_anon:{id:"permissions_anonymous",defaultMessage:"Anonymous",description:"Title for editing default anonymous permissions"},perm_user:{id:"permissions_user",defaultMessage:"User's Permissions",description:"Title for editing user's permissions"},edit_permissions:{id:"menu_item_edit_permissions",defaultMessage:"Edit permissions",description:"Menu item [Edit permissions]"},qrcode:{id:"scan_qr_code",defaultMessage:"Scan QR Code",description:"Title for scanning QR code"},text_copied:{id:"text_copied",defaultMessage:"Copied to clipboard",description:"Notification that text has been copied to clipboard"},self_topic_name:{id:"self_topic_name",defaultMessage:"Saved messages",description:"Name of self topic for UI"},self_topic_comment:{id:"self_topic_comment",defaultMessage:"Notes, messages, links, files saved for posterity",description:"Comment for self topic for UI"}});class A extends a().Component{constructor(e){super(e),this.state={topic:null,owner:!1,admin:!1,sharer:!1,deleter:!1,muted:!1,address:null,groupTopic:void 0,isSelf:!1,channel:void 0,fullName:void 0,description:void 0,avatar:null,private:null,selectedContact:null,access:null,modeGiven:null,modeWant:null,modeGiven2:null,modeWant2:null,auth:null,anon:null,contactList:[],trustedBadges:[],previousMetaDesc:void 0,previousSubsUpdated:void 0},this.propsUpdated=this.propsUpdated.bind(this),this.resetSubs=this.resetSubs.bind(this),this.resetDesc=this.resetDesc.bind(this),this.resetTags=this.resetTags.bind(this),this.onMetaDesc=this.onMetaDesc.bind(this),this.onSubsUpdated=this.onSubsUpdated.bind(this),this.handleImageChanged=this.handleImageChanged.bind(this),this.handleMuted=this.handleMuted.bind(this),this.handleUnarchive=this.handleUnarchive.bind(this),this.handlePermissionsChanged=this.handlePermissionsChanged.bind(this),this.handleLaunchPermissionsEditor=this.handleLaunchPermissionsEditor.bind(this),this.handleShowQRCode=this.handleShowQRCode.bind(this),this.handleCopyToClipboard=this.handleCopyToClipboard.bind(this),this.handleShare=this.handleShare.bind(this),this.handleShowAddMembers=this.handleShowAddMembers.bind(this),this.handleMemberUpdateRequest=this.handleMemberUpdateRequest.bind(this),this.handleMemberSelected=this.handleMemberSelected.bind(this),this.handleContextMenu=this.handleContextMenu.bind(this),this.handleBackNavigate=this.handleBackNavigate.bind(this)}propsUpdated(e){const s=this.props.tinode.getTopic(e.topic);s&&(this.onMetaDesc!=s.onMetaDesc&&(this.previousMetaDesc=s.onMetaDesc,s.onMetaDesc=this.onMetaDesc,this.previousSubsUpdated=s.onSubsUpdated,s.onSubsUpdated=this.onSubsUpdated),this.state.topic!=e.topic&&(this.setState({topic:e.topic}),this.resetDesc(s,e),this.resetSubs(s,e),this.resetTags(s)))}componentDidMount(){this.propsUpdated(this.props)}componentDidUpdate(e){this.propsUpdated(e)}componentWillUnmount(){const e=this.props.tinode.getTopic(this.props.topic);e&&(this.setState({topic:null}),e.onMetaDesc=this.previousMetaDesc,e.onSubsUpdated=this.previousSubsUpdated)}resetSubs(e,s){const t={contactList:[]};if("p2p"==e.getType()){const i=e.subscriber(s.topic);i?(t.modeGiven2=i.acs.getGiven(),t.modeWant2=i.acs.getWant()):(t.modeGiven2="N",t.modeWant2="N")}else e.subscribers(e=>{t.contactList.push(e)},this);this.setState(t)}resetDesc(e,s){const t=e.getDefaultAccess()||{},i=e.getAccessMode(),a=[];if(e.trusted)for(const[s,t]of Object.entries(e.trusted))t&&a.push(s);const n=e.isSelfType();this.setState({owner:i&&i.isOwner(),admin:i&&i.isAdmin(),sharer:i&&i.isSharer(),deleter:i&&i.isDeleter(),muted:i&&i.isMuted(),fullName:n?s.intl.formatMessage(k.self_topic_name):(0,T.W5)(e.public&&e.public.fn,60),description:n?s.intl.formatMessage(k.self_topic_comment):(0,T.W5)(e.public&&e.public.note,360),avatar:(0,S.to)(e.public?e.public.photo:null),trustedBadges:a,private:(0,T.W5)(e.private&&e.private.comment,60),archived:e.isArchived(),address:e.name,groupTopic:e.isGroupType(),isSelf:n,channel:e.isChannelType()||e.chan,access:i?i.getMode():void 0,modeGiven:i?i.getGiven():void 0,modeWant:i?i.getWant():void 0,auth:t.auth,anon:t.anon})}resetTags(e){if("grp"!=e.getType())return;const s=e.getAccessMode();s&&s.isOwner()&&e.getMeta(e.startMetaQuery().withTags().build())}onMetaDesc(e){const s=this.props.tinode.getTopic(this.props.topic);s&&(this.resetDesc(s,this.props),this.previousMetaDesc&&this.previousMetaDesc!=this.onMetaDesc&&this.previousMetaDesc(e))}onSubsUpdated(e){const s=this.props.tinode.getTopic(this.props.topic);s&&(this.resetSubs(s,this.props),this.previousSubsUpdated&&this.previousSubsUpdated!=this.onSubsUpdated&&this.previousSubsUpdated(e))}handleImageChanged(e,s){this.setState({avatar:s}),this.props.onTopicDescUpdate(this.props.topic,new o.TheCard(null,s||o.Tinode.DEL_CHAR),null)}handleMuted(e,s){this.setState({muted:s}),this.props.onChangePermissions(this.props.topic,s?"-P":"+P")}handleUnarchive(e,s){this.props.onTopicUnArchive(this.props.topic)}handlePermissionsChanged(e,s){switch(e){case"auth":this.props.onTopicDescUpdateRequest(this.props.topic,null,null,{auth:s});break;case"anon":this.props.onTopicDescUpdateRequest(this.props.topic,null,null,{anon:s});break;case"mode":case"want":this.props.onChangePermissions(this.props.topic,s);break;case"given":this.props.onChangePermissions(this.props.topic,s,this.props.topic);break;case"user":this.props.onChangePermissions(this.props.topic,s,this.state.userPermissionsEdited)}this.handleBackNavigate()}handleLaunchPermissionsEditor(e,s){const{formatMessage:t}=this.props.intl;let i,a,n,r,l,d,c;switch(e){case"mode":i=this.state.access;break;case"want":i=this.state.modeWant,a=this.state.modeGiven,this.state.owner?n="O":(n=o.AccessMode.encode(o.AccessMode.diff("ASDO",this.state.modeGiven)),this.state.channel&&(n+="W")),r=t(k.perm_want),l=t(k.perm_given);break;case"given":i=this.state.modeGiven2,a=this.state.modeWant2,n=this.state.groupTopic?this.state.owner?"":"O":"ASDO",r=t(k.perm_given),l=t(k.perm_want);break;case"auth":i=this.state.auth,n="O";break;case"anon":i=this.state.anon,n="O";break;case"user":{const e=this.props.tinode.getTopic(this.props.topic);if(!e)return;const o=e.subscriber(s);if(!o||!o.acs)return;i=o.acs.getGiven(),a=o.acs.getWant(),n=this.state.owner?"":"O",r=t(k.perm_given),l=t(k.perm_want),o.public&&(d=o.public.fn,c=o.public.photo);break}default:return void console.error("Unknown permission editing mode '"+e+"'")}this.setState({userPermissionsEdited:s,userPermissionsTitle:d,userPermissionsAvatar:c,editedPermissions:i,immutablePermissions:a,editedPermissionsTitle:r,immutablePermissionsTitle:l,editedPermissionsSkipped:n}),this.props.onNavigate(`perm/${e}`)}handleShowQRCode(e){e.preventDefault(),this.props.onNavigate("qrcode")}handleCopyToClipboard(e,s){e.preventDefault(),navigator.clipboard.writeText(s).then(e=>{this.setState({toast:this.props.intl.formatMessage(k.text_copied)}),setTimeout(e=>{this.setState({toast:""})},3e3)})}handleShare(e){e.preventDefault();const s=new o.TheCard(this.state.fullName,this.state.avatar,null,this.state.description);o.TheCard.setTinodeID(s,o.Tinode.URI_TOPIC_ID_PREFIX+this.props.topic),this.props.onShareTheCard(s)}handleShowAddMembers(e){e.preventDefault(),this.props.onInitFind(),this.props.onNavigate("members")}handleMemberUpdateRequest(e,s,t){this.props.onMemberUpdateRequest(this.props.topic,s,t),this.props.onNavigate("info")}handleMemberSelected(e){this.setState({selectedContact:e})}handleBackNavigate(){const e=(this.props.panel||"info").split("/");"info"==e[0]?this.props.onNavigate(null):"perm"==e[0]?"user"==e[1]?this.props.onNavigate("info"):this.props.onNavigate("security"):this.props.onNavigate("info")}handleContextMenu(e){const{formatMessage:s}=this.props.intl,t=this.props.tinode.getTopic(this.props.topic);if(!t)return;const i=t.subscriber(e.topicName);if(!i||!i.acs)return;const a=this.props.tinode.isMe(e.topicName),n=[{title:s(k.edit_permissions),handler:s=>this.handleLaunchPermissionsEditor(a?"want":"user",e.topicName)}];a||n.push("member_delete"),n.push(i.acs.isMuted()?"member_unmute":"member_mute"),a||n.push(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 e=(this.props.panel||"info").split("/"),s=e[0];e.shift();const{formatMessage:t}=this.props.intl,i=t(("perm"==s?k["perm_"+e[0]]:k[s])||k.info),a=this.props.tinode.getTopic(this.state.topic),p=a&&a.alias();return(0,m.jsxs)("div",{id:"info-view",children:[(0,m.jsx)("div",{className:"toast"+(this.state.toast?" show":""),children:this.state.toast}),(0,m.jsxs)("div",{className:"caption-panel",id:"info-caption-panel",children:[(0,m.jsx)("div",{className:"panel-title",id:"info-title",children:i}),(0,m.jsx)("div",{children:(0,m.jsx)(f.A,{onCancel:this.handleBackNavigate})})]}),this.props.displayMobile?(0,m.jsx)(h.A,{level:this.props.errorLevel,text:this.props.errorText,onClearError:this.props.onError}):null,"members"==s?(0,m.jsx)(b,{tinode:this.props.tinode,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.handleBackNavigate,onSubmit:this.handleMemberUpdateRequest}):"perm"==s&&e.length>0?(0,m.jsx)(v.A,{tinode:this.props.tinode,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:s=>this.handlePermissionsChanged(e[0],s),onCancel:this.handleBackNavigate}):"general"==s?(0,m.jsx)(j.A,{tinode:this.props.tinode,topic:this.props.topic,reqCredMethod:this.props.reqCredMethod,onCredAdd:this.props.onCredAdd,onUpdateTagsRequest:this.props.onTopicTagsUpdateRequest,onCredConfirm:this.props.onCredConfirm,onCredDelete:this.props.onCredDelete,onUpdateTopicDesc:this.props.onTopicDescUpdateRequest,onError:this.props.onError}):"security"==s?(0,m.jsx)(w,{topic:this.props.topic,owner:this.state.owner,admin:this.state.admin,sharer:this.state.sharer,deleter:this.state.deleter,muted:this.state.muted,groupTopic:this.state.groupTopic,channel:this.state.channel,access:this.state.access,modeGiven:this.state.modeGiven,modeWant:this.state.modeWant,modeGiven2:this.state.modeGiven2,modeWant2:this.state.modeWant2,auth:this.state.auth,anon:this.state.anon,onShowAlert:this.props.onShowAlert,onDeleteMessages:this.props.onDeleteMessages,onLeaveTopic:this.props.onLeaveTopic,onBlockTopic:this.props.onBlockTopic,onReportTopic:this.props.onReportTopic,onLaunchPermissionsEditor:this.handleLaunchPermissionsEditor,onNavigate:this.props.onNavigate}):"qrcode"==s?(0,m.jsx)(M,{uri:o.Tinode.URI_TOPIC_ID_PREFIX+this.props.topic,onCancel:this.handleBackNavigate}):(0,m.jsxs)("div",{id:"info-view-content",className:"scrollable-panel",children:[(0,m.jsxs)("div",{className:"panel-form-column",children:[this.state.isSelf?null:(0,m.jsxs)("a",{href:"#",className:"flat-button float-right",onClick:e=>{e.preventDefault(),this.props.onNavigate("general")},children:[(0,m.jsx)("i",{className:"material-icons",children:"edit"})," ",(0,m.jsx)(n.FormattedMessage,{id:"button_edit",defaultMessage:"Edit",description:"Call to action [Edit]"})]}),(0,m.jsx)("center",{children:(0,m.jsx)(r.A,{tinode:this.props.tinode,avatar:this.state.avatar,readOnly:!0,uid:this.props.topic,title:this.state.fullName})}),(0,m.jsxs)("div",{className:"group",children:[(0,m.jsx)("div",{children:(0,m.jsx)("label",{className:"small",children:(0,m.jsx)(n.FormattedMessage,{id:"label_topic_name",defaultMessage:"Name",description:"Label for editing topic name"})})}),(0,m.jsxs)("div",{className:"large ellipsized",children:[this.state.fullName," ",this.state.channel?(0,m.jsx)("i",{className:"material-icons",children:"podcasts"}):null]})]}),this.state.private?(0,m.jsxs)("div",{className:"group",children:[(0,m.jsx)("div",{children:(0,m.jsx)("label",{className:"small",children:(0,m.jsx)(n.FormattedMessage,{id:"label_private",defaultMessage:"Private comment",description:"Label for editing 'private'"})})}),(0,m.jsx)("div",{className:"large ellipsized",children:this.state.private})]}):null,this.state.isSelf?null:(0,m.jsxs)(m.Fragment,{children:[(0,m.jsxs)("div",{className:"panel-form-row",children:[(0,m.jsxs)("div",{children:[(0,m.jsx)("label",{className:"small",children:(0,m.jsx)(n.FormattedMessage,{id:"label_user_id",defaultMessage:"ID:",description:"Label for user address (ID)"})})," ",(0,m.jsx)("tt",{children:this.state.address})]}),(0,m.jsxs)("div",{style:{marginLeft:"auto"},children:[" ",(0,m.jsx)("a",{href:"#",onClick:e=>{this.handleCopyToClipboard(e,this.state.address)},children:(0,m.jsx)("i",{className:"material-icons",children:"content_copy"})})," ",(0,m.jsx)("a",{href:"#",onClick:this.handleShowQRCode,children:(0,m.jsx)("i",{className:"material-icons",children:"qr_code"})})," ",(0,m.jsx)("a",{href:"#",onClick:this.handleShare,children:(0,m.jsx)("i",{className:"material-icons",children:"share"})})," "]})]}),p?(0,m.jsxs)("div",{className:"panel-form-row",children:[(0,m.jsxs)("div",{children:[(0,m.jsx)("label",{className:"small",children:(0,m.jsx)(n.FormattedMessage,{id:"label_alias",defaultMessage:"Alias:",description:"Label for user or topic alias"})})," ",(0,m.jsx)("tt",{children:p})]}),(0,m.jsxs)("div",{style:{marginLeft:"auto"},children:[" ",(0,m.jsx)("a",{href:"#",onClick:e=>{this.handleCopyToClipboard(e,p)},children:(0,m.jsx)("i",{className:"material-icons",children:"content_copy"})})," ",(0,m.jsx)("i",{className:"material-icons",style:{opacity:0},children:"qr_code"})," "]})]}):null]}),this.state.trustedBadges.length>0?(0,m.jsx)("div",{className:"group",children:(0,m.jsx)(l.A,{trustedBadges:this.state.trustedBadges})}):null,this.state.groupTopic&&a.subcnt>0?(0,m.jsxs)("div",{className:"group",children:[(0,m.jsx)("label",{className:"small",children:this.state.channel?(0,m.jsx)(n.FormattedMessage,{id:"label_subscriber_count",defaultMessage:"Subscribers:",description:"Label for the count of channel subscribers"}):(0,m.jsx)(n.FormattedMessage,{id:"label_member_count",defaultMessage:"Members:",description:"Label for the count of group topic members"})})," ",(0,m.jsx)(n.FormattedNumber,{value:a.subcnt})]}):null,this.state.description?(0,m.jsxs)("div",{className:"group",children:[(0,m.jsx)("label",{className:"small",children:(0,m.jsx)(n.FormattedMessage,{id:"label_description",defaultMessage:"Description",description:"Label for description of user or topic"})}),(0,m.jsx)("div",{children:this.state.description})]}):null]}),this.state.isSelf?null:(0,m.jsxs)(m.Fragment,{children:[(0,m.jsx)("div",{className:"hr"}),(0,m.jsxs)("div",{className:"panel-form-row",children:[(0,m.jsx)("label",{children:(0,m.jsx)(n.FormattedMessage,{id:"label_muting_topic",defaultMessage:"Muted:",description:"Label for Muting/unmuting the topic"})}),(0,m.jsx)(d.A,{name:"P",checked:this.state.muted,onChange:this.handleMuted})]})]}),this.state.archived?(0,m.jsxs)("div",{className:"panel-form-row",children:[(0,m.jsx)("label",{children:(0,m.jsx)(n.FormattedMessage,{id:"label_unarchive_topic",defaultMessage:"Archived:",description:"Label for unarchiving the topic"})}),(0,m.jsx)(d.A,{name:"archived",checked:!0,onChange:this.handleUnarchive})]}):null,this.state.isSelf?null:(0,m.jsxs)(m.Fragment,{children:[(0,m.jsx)("div",{className:"hr"}),(0,m.jsx)("div",{className:"panel-form-row",children:(0,m.jsxs)("a",{href:"#",className:"flat-button",onClick:e=>{e.preventDefault(),this.props.onNavigate("security")},children:[(0,m.jsx)("i",{className:"material-icons",children:"security"})," ",(0,m.jsx)(n.FormattedMessage,{id:"button_security",defaultMessage:"Security",description:"Navigaton button for security panel."})]})})]}),this.state.groupTopic&&this.state.sharer?(0,m.jsxs)(m.Fragment,{children:[(0,m.jsx)("div",{className:"hr"}),(0,m.jsx)("div",{className:"panel-form-row",children:(0,m.jsx)("label",{className:"small",children:(0,m.jsx)(n.FormattedMessage,{id:"label_group_members",defaultMessage:"Group members:",description:"Section title or label"})})}),(0,m.jsx)("div",{className:"panel-form-row",children:(0,m.jsxs)("a",{href:"#",className:"flat-button",onClick:this.handleShowAddMembers,children:[(0,m.jsx)("i",{className:"material-icons",children:"person_add"})," ",(0,m.jsx)(n.FormattedMessage,{id:"button_add_members",defaultMessage:"Add members",description:"Flat button [Add members] (to topic)"})]})}),(0,m.jsx)(n.FormattedMessage,{id:"group_has_no_members",defaultMessage:"No members",description:"Shown in place of group members",children:e=>(0,m.jsx)(c.A,{tinode:this.props.tinode,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]})]})}}var D=(0,n.injectIntl)(A)},9022:function(e,s,t){var i=t(1594),a=t.n(i),n=t(8181),o=t(3207),r=t(1974),l=t(7981),d=t(4848);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 h extends a().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 s=this.state.mode;-1==s.indexOf(e)?s+=e:s=s.replace(e,""),this.setState({mode:s})}handleSubmit(){const 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,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 t=this.props.skip||"",i=this.state.mode,a=(this.props.compare||"").replace("N",""),h=[];for(let e=0;e<8;e++){let n="JRWPASDO".charAt(e);t.indexOf(n)>=0&&i.indexOf(n)<0||h.push((0,d.jsxs)("tr",{children:[(0,d.jsx)("td",{children:s[n]}),(0,d.jsx)("td",{className:"checkbox",children:t.indexOf(n)<0?(0,d.jsx)(o.A,{name:n,checked:i.indexOf(n)>=0,onChange:this.handleChange}):(0,d.jsx)(o.A,{name:n,checked:i.indexOf(n)>=0})}),this.props.compare?(0,d.jsx)("td",{className:"checkbox",children:(0,d.jsx)(o.A,{name:n,checked:a.indexOf(n)>=0})}):null]},n))}return(0,d.jsxs)("div",{className:"panel-form-column",children:[this.props.userTitle?(0,d.jsx)("ul",{className:"contact-box small",children:(0,d.jsx)(r.A,{tinode:this.props.tinode,item:this.props.item,title:this.props.userTitle,small:!0,avatar:(0,l.to)(this.props.userAvatar?this.props.userAvatar:null)})}):null,(0,d.jsx)("label",{className:"small",children:(0,d.jsx)(n.FormattedMessage,{id:"title_permissions",defaultMessage:"Permissions",description:"Section title"})}),(0,d.jsxs)("table",{className:"permission-editor",children:[this.props.compare?(0,d.jsx)("thead",{children:(0,d.jsxs)("tr",{children:[(0,d.jsx)("th",{}),(0,d.jsx)("th",{children:this.props.modeTitle}),(0,d.jsx)("th",{children:this.props.compareTitle})]})}):null,(0,d.jsx)("tbody",{children:h})]}),(0,d.jsx)("br",{}),(0,d.jsxs)("div",{className:"dialog-buttons",children:[(0,d.jsx)("button",{className:"outline",onClick:this.handleCancel,children:(0,d.jsx)(n.FormattedMessage,{id:"button_cancel",defaultMessage:"Cancel",description:"Button [Cancel]"})}),(0,d.jsx)("button",{className:"primary",onClick:this.handleSubmit,children:(0,d.jsx)(n.FormattedMessage,{id:"button_ok",defaultMessage:"OK",description:"Button [OK]"})})]})]})}}s.A=(0,n.injectIntl)(h)}}]);
+//# sourceMappingURL=158.prod.js.map
\ No newline at end of file
diff --git a/umd/158.prod.js.map b/umd/158.prod.js.map
new file mode 100644
index 00000000..438c9699
--- /dev/null
+++ b/umd/158.prod.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"158.prod.js","mappings":"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","sources":["webpack://tinode-webapp/./src/widgets/group-manager.jsx","webpack://tinode-webapp/./src/widgets/show-qrcode.jsx","webpack://tinode-webapp/./src/widgets/topic-security.jsx","webpack://tinode-webapp/./src/views/info-view.jsx","webpack://tinode-webapp/./src/widgets/permissions-editor.jsx"],"sourcesContent":["// 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 add_members_prompt: {\n id: 'add_members_prompt',\n defaultMessage: 'add members',\n description: 'Placeholder in group members input field'\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.forEach(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.forEach(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.forEach(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 const members = [];\n const added = [];\n const removed = [];\n\n const keys = Object.keys(this.state.index);\n keys.forEach(k => {\n if (this.state.index[k].present) {\n members.push(k);\n }\n\n if (this.state.index[k].delta > 0) {\n added.push(k);\n } else if (this.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 return (\n \n
\n \n \n \n
\n
\n \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","import QRCode from 'qrcodejs';\nimport React from 'react';\nimport { FormattedMessage } from 'react-intl';\n\nimport { QRCODE_SIZE } from '../config';\n\nexport default class ShowQRCode extends React.PureComponent {\n constructor(props) {\n super(props);\n this.qrCodeRef = React.createRef();\n }\n\n componentDidMount() {\n new QRCode(this.qrCodeRef.current, {\n text: this.props.uri,\n width: QRCODE_SIZE,\n height: QRCODE_SIZE,\n });\n }\n\n render() {\n return (\n \n
\n
\n
{this.props.uri}
\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\nconst messages = defineMessages({\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 topic_delete: {\n id: 'topic_delete',\n defaultMessage: 'Delete Conversation',\n description: 'Alert title when deleting the topic.'\n },\n topic_delete_warning: {\n id: 'topic_delete_warning',\n defaultMessage: 'Are you sure you want to delete this conversation? It cannot be undone.',\n description: 'Alert warning when deleting entire topic'\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 other_user: {\n id: 'label_other_user',\n defaultMessage: 'Other',\n description: 'Label for the other user when the user is unnamed'\n },\n});\n\nclass TopicSecurity extends React.PureComponent {\n constructor(props) {\n super(props);\n\n this.handleDeleteTopic = this.handleDeleteTopic.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 }\n\n handleDeleteTopic(e) {\n e.preventDefault();\n const {formatMessage} = this.props.intl;\n this.props.onShowAlert(\n formatMessage(messages.topic_delete), // title\n formatMessage(messages.topic_delete_warning), // content\n _ => this.props.onDeleteTopic(this.props.topic), // onConfirm\n null, // \"OK\"\n true, // Show Reject button\n null // \"Cancel\"\n );\n }\n\n handleDeleteMessages(e) {\n e.preventDefault();\n const {formatMessage} = this.props.intl;\n this.props.onShowAlert(\n formatMessage(this.props.deleter ? messages.delete_messages : messages.clear_messages), // title\n formatMessage(this.props.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 render() {\n const {formatMessage} = this.props.intl;\n return (\n \n
\n
\n
\n {this.props.groupTopic ?\n <>\n
\n \n \n {e.preventDefault(); this.props.onLaunchPermissionsEditor('want')}}>\n {this.props.access}\n \n
\n {!this.props.channel ?\n
\n
\n \n \n \n
\n
\n
Auth: {\n e.preventDefault();\n if (this.props.owner) {\n this.props.onLaunchPermissionsEditor('auth');\n }\n }}>{this.props.auth} \n
\n
Anon: {\n e.preventDefault();\n if (this.props.owner) {\n this.props.onLaunchPermissionsEditor('anon');\n }\n }}>{this.props.anon} \n
\n
\n
\n :\n null\n }\n >\n :\n
\n
\n \n \n \n
\n
\n
\n {e.preventDefault(); this.props.onLaunchPermissionsEditor('want')}}>\n {this.props.access}\n \n
\n
{this.props.fullName ? this.props.fullName : formatMessage(messages.other_user)}:\n {e.preventDefault(); this.props.onLaunchPermissionsEditor('given')}}>\n {this.props.modeGiven2}\n \n
\n
\n
\n }\n
\n
\n );\n }\n};\n\nexport default injectIntl(TopicSecurity);\n","// InfoView: panel with topic/user info.\nimport React from 'react';\nimport { FormattedMessage, FormattedNumber, defineMessages, injectIntl } from 'react-intl';\n\nimport { AccessMode, Tinode, TheCard } from 'tinode-sdk';\n\nimport AvatarUpload from '../widgets/avatar-upload.jsx';\nimport BadgeList from '../widgets/badge-list.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 MenuCancel from '../widgets/menu-cancel.jsx';\nimport PermissionsEditor from '../widgets/permissions-editor.jsx';\nimport ShowQRCode from '../widgets/show-qrcode.jsx';\nimport TopicCommonView from './topic-common-view.jsx';\nimport TopicSecurity from '../widgets/topic-security.jsx';\n\nimport { MAX_TITLE_LENGTH, MAX_TOPIC_DESCRIPTION_LENGTH,\n NO_ACCESS_MODE, TOAST_DURATION } from '../config.js';\n\nimport { makeImageUrl } from '../lib/blob-helpers.js';\nimport { truncateString } from '../lib/strformat.js';\n\nconst messages = defineMessages({\n info: {\n id: 'panel_title_info',\n description: 'Title for InfoView',\n defaultMessage: 'Info'\n },\n general: {\n id: 'panel_title_general',\n description: 'Title for TopicCommon.',\n defaultMessage: 'General'\n },\n security: {\n id: 'panel_title_security',\n description: 'Title for TopicSecirity and AccSecurity.',\n defaultMessage: 'Security'\n },\n members: {\n id: 'panel_title_members',\n description: 'Title for managing group members view.',\n defaultMessage: 'Members'\n },\n crop: {\n id: 'panel_title_crop',\n description: 'Title for AvatarCropView.',\n defaultMessage: 'Drag to Adjust'\n },\n perm_want: {\n id: 'requested_permissions',\n defaultMessage: 'Requested',\n description: 'Title for permissions'\n },\n perm_given: {\n id: 'granted_permissions',\n defaultMessage: 'Granted',\n description: 'Title for permissions'\n },\n perm_auth: {\n id: 'permissions_authenticated',\n defaultMessage: 'Authenticated',\n description: 'Title for editing default authenticated permissions'\n },\n perm_anon: {\n id: 'permissions_anonymous',\n defaultMessage: 'Anonymous',\n description: 'Title for editing default anonymous permissions'\n },\n perm_user: {\n id: 'permissions_user',\n defaultMessage: 'User\\'s Permissions',\n description: 'Title for editing user\\'s permissions'\n },\n edit_permissions: {\n id: 'menu_item_edit_permissions',\n defaultMessage: 'Edit permissions',\n description: 'Menu item [Edit permissions]'\n },\n qrcode: {\n id: 'scan_qr_code',\n defaultMessage: 'Scan QR Code',\n description: 'Title for scanning QR code'\n },\n text_copied: {\n id: 'text_copied',\n defaultMessage: 'Copied to clipboard',\n description: 'Notification that text has been copied to clipboard'\n },\n self_topic_name: {\n id: 'self_topic_name',\n defaultMessage: 'Saved messages',\n description: 'Name of self topic for UI',\n },\n self_topic_comment: {\n id: 'self_topic_comment',\n defaultMessage: 'Notes, messages, links, files saved for posterity',\n description: 'Comment for self topic for UI',\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 isSelf: false,\n channel: undefined,\n fullName: undefined,\n description: 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 trustedBadges: [],\n previousMetaDesc: undefined,\n previousSubsUpdated: undefined,\n };\n\n this.propsUpdated = this.propsUpdated.bind(this);\n this.resetSubs = this.resetSubs.bind(this);\n this.resetDesc = this.resetDesc.bind(this);\n this.resetTags = this.resetTags.bind(this);\n this.onMetaDesc = this.onMetaDesc.bind(this);\n this.onSubsUpdated = this.onSubsUpdated.bind(this);\n this.handleImageChanged = this.handleImageChanged.bind(this);\n this.handleMuted = this.handleMuted.bind(this);\n this.handleUnarchive = this.handleUnarchive.bind(this);\n this.handlePermissionsChanged = this.handlePermissionsChanged.bind(this);\n this.handleLaunchPermissionsEditor = this.handleLaunchPermissionsEditor.bind(this);\n this.handleShowQRCode = this.handleShowQRCode.bind(this);\n this.handleCopyToClipboard = this.handleCopyToClipboard.bind(this);\n this.handleShare = this.handleShare.bind(this);\n this.handleShowAddMembers = this.handleShowAddMembers.bind(this);\n this.handleMemberUpdateRequest = this.handleMemberUpdateRequest.bind(this);\n this.handleMemberSelected = this.handleMemberSelected.bind(this);\n this.handleContextMenu = this.handleContextMenu.bind(this);\n this.handleBackNavigate = this.handleBackNavigate.bind(this);\n }\n\n propsUpdated(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\n if (this.state.topic != props.topic) {\n this.setState({topic: props.topic});\n this.resetDesc(topic, props);\n this.resetSubs(topic, props);\n this.resetTags(topic);\n }\n }\n\n // Must provide this for lazy loaded components.\n componentDidMount() {\n this.propsUpdated(this.props);\n }\n\n componentDidUpdate(props) {\n this.propsUpdated(props);\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 }\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 const badges = [];\n if (topic.trusted) {\n for (const [key, val] of Object.entries(topic.trusted)) {\n if (val) {\n badges.push(key);\n }\n }\n }\n\n const isSelf = topic.isSelfType();\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: isSelf ?\n props.intl.formatMessage(messages.self_topic_name) :\n truncateString(topic.public && topic.public.fn, MAX_TITLE_LENGTH),\n description: isSelf ?\n props.intl.formatMessage(messages.self_topic_comment) :\n truncateString(topic.public && topic.public.note, MAX_TOPIC_DESCRIPTION_LENGTH),\n avatar: makeImageUrl(topic.public ? topic.public.photo : null),\n trustedBadges: badges,\n private: truncateString(topic.private && topic.private.comment, MAX_TITLE_LENGTH),\n archived: topic.isArchived(),\n address: topic.name,\n groupTopic: topic.isGroupType(),\n isSelf: isSelf,\n channel: topic.isChannelType() || topic.chan,\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\n resetTags(topic) {\n if (topic.getType() != 'grp') {\n return;\n }\n\n const acs = topic.getAccessMode();\n if (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 handleImageChanged(mime, img) {\n this.setState({avatar: img});\n this.props.onTopicDescUpdate(this.props.topic, new TheCard(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 handleUnarchive(ignored, ignored2) {\n this.props.onTopicUnArchive(this.props.topic);\n }\n\n handlePermissionsChanged(which, perm) {\n switch (which) {\n case 'auth':\n this.props.onTopicDescUpdateRequest(this.props.topic, null, null, {auth: perm});\n break;\n case 'anon':\n this.props.onTopicDescUpdateRequest(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.handleBackNavigate();\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 = AccessMode.encode(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.perm_want);\n titleCompare = formatMessage(messages.perm_given);\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.perm_given);\n titleCompare = formatMessage(messages.perm_want);\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.perm_given);\n titleCompare = formatMessage(messages.perm_want);\n if (user.public) {\n userTitle = user.public.fn;\n userAvatar = user.public.photo;\n }\n break;\n }\n default:\n console.error(\"Unknown permission editing mode '\" + which + \"'\");\n return;\n }\n this.setState({\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 this.props.onNavigate(`perm/${which}`);\n }\n\n handleShowQRCode(e) {\n e.preventDefault();\n this.props.onNavigate('qrcode');\n }\n\n handleCopyToClipboard(e, text) {\n e.preventDefault();\n navigator.clipboard.writeText(text).then(_ => {\n this.setState({toast: this.props.intl.formatMessage(messages.text_copied)});\n setTimeout(_ => { this.setState({toast: ''}); }, TOAST_DURATION);\n });\n }\n\n handleShare(e) {\n e.preventDefault();\n const card = new TheCard(this.state.fullName, this.state.avatar, null, this.state.description);\n TheCard.setTinodeID(card, Tinode.URI_TOPIC_ID_PREFIX + this.props.topic);\n this.props.onShareTheCard(card);\n }\n\n handleShowAddMembers(e) {\n e.preventDefault();\n this.props.onInitFind();\n this.props.onNavigate('members');\n }\n\n handleMemberUpdateRequest(members, added, removed) {\n this.props.onMemberUpdateRequest(this.props.topic, added, removed);\n this.props.onNavigate('info');\n }\n\n handleMemberSelected(uid) {\n this.setState({selectedContact: uid});\n }\n\n handleBackNavigate() {\n const args = (this.props.panel || 'info').split('/');\n if (args[0] == 'info') {\n this.props.onNavigate(null);\n } else if (args[0] == 'perm') {\n if (args[1] == 'user') {\n this.props.onNavigate('info');\n } else {\n this.props.onNavigate('security');\n }\n } else {\n this.props.onNavigate('info');\n }\n }\n\n handleContextMenu(params) {\n const {formatMessage} = this.props.intl;\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 isMe = this.props.tinode.isMe(params.topicName);\n const menuItems = [{\n title: formatMessage(messages.edit_permissions),\n handler: _ => this.handleLaunchPermissionsEditor(isMe ? 'want' : 'user', params.topicName)\n }];\n if (!isMe) {\n menuItems.push('member_delete');\n }\n menuItems.push(user.acs.isMuted() ? 'member_unmute' : 'member_mute');\n if (!isMe) {\n menuItems.push(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 args = (this.props.panel || 'info').split('/');\n const view = args[0];\n args.shift();\n\n const {formatMessage} = this.props.intl;\n const panelTitle = formatMessage((view == 'perm' ? messages['perm_' + args[0]] : messages[view])\n || messages['info']);\n\n const topic = this.props.tinode.getTopic(this.state.topic);\n const alias = topic && topic.alias();\n\n return (\n \n
{this.state.toast}
\n
\n
{panelTitle}
\n
\n \n
\n
\n {this.props.displayMobile ?\n
: null}\n {view == 'members' ?\n
\n :\n view == 'perm' && args.length > 0 ?\n
this.handlePermissionsChanged(args[0], mode)}\n onCancel={this.handleBackNavigate} />\n :\n view == 'general' ?\n \n :\n view == 'security' ?\n \n :\n view == 'qrcode' ?\n \n :\n \n
\n {!this.state.isSelf ?\n
{e.preventDefault(); this.props.onNavigate('general');}}>\n edit \n \n \n : null\n }\n
\n \n \n
\n
\n \n
\n
{this.state.fullName} \n {this.state.channel ? podcasts : null}
\n
\n {this.state.private ?\n
\n
\n \n
\n
{this.state.private}
\n
\n : null\n }\n {!this.state.isSelf ?\n <>\n
\n
\n \n {this.state.address} \n
\n
\n
\n {alias ?\n
\n : null}\n >\n : null\n }\n {this.state.trustedBadges.length > 0 ?\n
\n \n
\n : null\n }\n {this.state.groupTopic && topic.subcnt > 0 ?\n
\n {this.state.channel ?\n \n :\n \n }\n
\n : null\n }\n {this.state.description ?\n
\n
\n \n \n
{this.state.description}
\n
: null}\n
\n {!this.state.isSelf ?\n <>
\n
\n \n \n \n \n
>\n : null\n }\n {this.state.archived ?\n
\n \n \n \n \n
\n :\n null\n }\n {!this.state.isSelf ?\n <>
\n
>\n : null\n }\n {this.state.groupTopic && this.state.sharer ?\n <>\n
\n
\n \n \n \n
\n
\n
{\n (no_members) => \n } \n >\n :\n null\n }\n
\n }\n \n );\n }\n};\n\nexport default injectIntl(InfoView);\n","// PermissionsEditor: Component for editing permissions\n// \nimport React from 'react';\nimport { FormattedMessage, defineMessages, injectIntl } from 'react-intl';\n\nimport CheckBox from './checkbox.jsx';\nimport Contact from './contact.jsx';\n\nimport { makeImageUrl } from '../lib/blob-helpers.js';\n\n// Translatable permission names.\nconst messages = defineMessages({\n joiner: {\n id: 'permission_join',\n defaultMessage: \"Join ({val})\",\n description: 'Name of J permission'\n },\n reader: {\n id: 'permission_read',\n defaultMessage: \"Read ({val})\",\n description: 'Name of R permission'\n },\n writer: {\n id: 'permission_write',\n defaultMessage: \"Write ({val})\",\n description: 'Name of W permission'\n },\n preser: {\n id: 'permission_pres',\n defaultMessage: \"Get notified ({val})\",\n description: 'Name of P permission'\n },\n approver: {\n id: 'permission_admin',\n defaultMessage: \"Approve ({val})\",\n description: 'Name of A permission'\n },\n sharer: {\n id: 'permission_share',\n defaultMessage: \"Share ({val})\",\n description: 'Name of S permission'\n },\n deleter: {\n id: 'permission_delete',\n defaultMessage: \"Delete ({val})\",\n description: 'Name of D permission'\n },\n owner: {\n id: 'permission_owner',\n defaultMessage: \"Owner ({val})\",\n description: 'Name of O permission'\n }\n});\n\nclass PermissionsEditor extends React.Component {\n constructor(props) {\n super(props);\n\n this.state = {\n mode: (props.mode || '').replace('N', '')\n };\n\n this.handleChange = this.handleChange.bind(this);\n this.handleSubmit = this.handleSubmit.bind(this);\n this.handleCancel = this.handleCancel.bind(this);\n }\n\n handleChange(val) {\n let mode = this.state.mode;\n const idx = mode.indexOf(val);\n if (idx == -1) {\n mode += val;\n } else {\n mode = mode.replace(val, '');\n }\n this.setState({mode: mode});\n }\n\n handleSubmit() {\n // Normalize string, otherwise cannot check if mode has changed.\n const mode = (this.state.mode || 'N').split('').sort().join('');\n const before = (this.props.mode || 'N').split('').sort().join('')\n if (mode !== before) {\n this.props.onSubmit(mode);\n } else {\n this.props.onCancel();\n }\n }\n\n handleCancel() {\n this.props.onCancel();\n }\n\n render() {\n const {formatMessage} = this.props.intl;\n const all = 'JRWPASDO';\n const names = {\n 'J': formatMessage(messages.joiner, {val: 'J'}),\n 'R': formatMessage(messages.reader, {val: 'R'}),\n 'W': formatMessage(messages.writer, {val: 'W'}),\n 'P': formatMessage(messages.preser, {val: 'P'}),\n 'A': formatMessage(messages.approver, {val: 'A'}),\n 'S': formatMessage(messages.sharer, {val: 'S'}),\n 'D': formatMessage(messages.deleter, {val: 'D'}),\n 'O': formatMessage(messages.owner, {val: 'O'})\n };\n\n let skip = this.props.skip || '';\n let mode = this.state.mode;\n let compare = (this.props.compare || '').replace('N', '');\n let items = [];\n for (let i=0; i= 0 && mode.indexOf(c) < 0) {\n // Permission is marked as inactive: hide unchecked permissions, disable checked permissions\n continue;\n }\n items.push(\n \n {names[c]} \n {skip.indexOf(c) < 0 ?\n = 0)} onChange={this.handleChange}/>\n :\n = 0)} />\n } {this.props.compare ? \n = 0)}/>\n : null}\n \n );\n }\n\n return (\n \n {this.props.userTitle ?\n
: null}\n
\n
\n {this.props.compare ?\n \n {this.props.modeTitle} \n {this.props.compareTitle} \n :\n null}\n \n {items}\n
\n
\n
\n \n \n \n \n \n \n
\n
\n );\n }\n};\n\nexport default injectIntl(PermissionsEditor);\n"],"names":["messages","external_ReactIntl_","defineMessages","no_contacts","id","defaultMessage","description","contacts_not_found_short","add_members_prompt","GroupManager","external_React_default","Component","constructor","props","super","this","state","members","index","indexMembers","staticMembers","keepInitialMembers","requiredMember","contactFilter","noContactsMessage","intl","formatMessage","selectedContacts","handleContactSelected","bind","handleMemberRemoved","handleContactFilter","handleSubmit","handleCancel","forEach","m","user","delta","present","keepInitial","stat","push","sel","userId","status","slice","contacts","i","setState","splice","val","msg","query","doContactFiltering","filter","values","length","indexOf","added","removed","Object","keys","k","onSubmit","onCancel","render","jsx_runtime","jsxs","children","jsx","className","FormattedMessage","chip_input","A","tinode","chips","prompt","filterFunc","onChipRemoved","contact_list","myUserId","topicSelected","emptyListMessage","showOnline","showUnread","onTopicSelected","onClick","group_manager","injectIntl","ShowQRCode","PureComponent","qrCodeRef","createRef","componentDidMount","external_QRCode_default","current","text","uri","width","height","ref","topic_security_messages","clear_messages","clear_messages_warning","delete_messages","delete_messages_warning","topic_delete","topic_delete_warning","leave_chat","leave_chat_warning","block_contact","block_contact_warning","report_chat","report_chat_warning","other_user","TopicSecurity","handleDeleteTopic","handleDeleteMessages","handleLeave","handleBlock","handleReport","e","preventDefault","onShowAlert","_","onDeleteTopic","topic","deleter","onDeleteMessages","onLeaveTopic","onBlockTopic","onReportTopic","channel","href","owner","groupTopic","Fragment","onLaunchPermissionsEditor","access","auth","anon","fullName","modeGiven2","topic_security","info_view_messages","info","general","security","crop","perm_want","perm_given","perm_auth","perm_anon","perm_user","edit_permissions","qrcode","text_copied","self_topic_name","self_topic_comment","InfoView","admin","sharer","muted","address","undefined","isSelf","avatar","private","selectedContact","modeGiven","modeWant","modeWant2","contactList","trustedBadges","previousMetaDesc","previousSubsUpdated","propsUpdated","resetSubs","resetDesc","resetTags","onMetaDesc","onSubsUpdated","handleImageChanged","handleMuted","handleUnarchive","handlePermissionsChanged","handleLaunchPermissionsEditor","handleShowQRCode","handleCopyToClipboard","handleShare","handleShowAddMembers","handleMemberUpdateRequest","handleMemberSelected","handleContextMenu","handleBackNavigate","getTopic","componentDidUpdate","componentWillUnmount","newState","getType","user2","subscriber","acs","getGiven","getWant","subscribers","sub","defacs","getDefaultAccess","getAccessMode","badges","trusted","key","entries","isSelfType","isOwner","isAdmin","isSharer","isDeleter","isMuted","strformat","W5","public","fn","note","blob_helpers","to","photo","comment","archived","isArchived","name","isGroupType","isChannelType","chan","getMode","getMeta","startMetaQuery","withTags","build","desc","subs","mime","img","onTopicDescUpdate","external_tinode_","TheCard","Tinode","DEL_CHAR","ignored","checked","onChangePermissions","ignored2","onTopicUnArchive","which","perm","onTopicDescUpdateRequest","userPermissionsEdited","uid","toEdit","toCompare","toSkip","titleEdit","titleCompare","userTitle","userAvatar","AccessMode","encode","diff","console","error","userPermissionsTitle","userPermissionsAvatar","editedPermissions","immutablePermissions","editedPermissionsTitle","immutablePermissionsTitle","editedPermissionsSkipped","onNavigate","navigator","clipboard","writeText","then","toast","setTimeout","card","setTinodeID","URI_TOPIC_ID_PREFIX","onShareTheCard","onInitFind","onMemberUpdateRequest","args","panel","split","params","topicName","isMe","menuItems","title","handler","isJoiner","showContextMenu","x","y","view","shift","panelTitle","alias","menu_cancel","displayMobile","error_panel","level","errorLevel","errorText","onClearError","onError","searchableContacts","permissions_editor","mode","compare","skip","modeTitle","compareTitle","item","topic_common_view","reqCredMethod","onCredAdd","onUpdateTagsRequest","onTopicTagsUpdateRequest","onCredConfirm","onCredDelete","onUpdateTopicDesc","avatar_upload","readOnly","style","marginLeft","opacity","badge_list","subcnt","FormattedNumber","value","widgets_checkbox","onChange","no_members","showMode","noScroll","info_view","react_intl__WEBPACK_IMPORTED_MODULE_1__","joiner","reader","writer","preser","approver","PermissionsEditor","react__WEBPACK_IMPORTED_MODULE_0___default","replace","handleChange","sort","join","names","J","R","W","P","S","D","O","items","all","c","charAt","react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__","_checkbox_jsx__WEBPACK_IMPORTED_MODULE_2__","_contact_jsx__WEBPACK_IMPORTED_MODULE_3__","small","_lib_blob_helpers_js__WEBPACK_IMPORTED_MODULE_4__","__webpack_exports__"],"sourceRoot":""}
\ No newline at end of file
diff --git a/umd/331.prod.js b/umd/331.prod.js
new file mode 100644
index 00000000..bae688fd
--- /dev/null
+++ b/umd/331.prod.js
@@ -0,0 +1,2 @@
+"use strict";(self.webpackChunktinode_webapp=self.webpackChunktinode_webapp||[]).push([[331],{6331:function(e,s,i){i.r(s);var t=i(1594),n=i.n(t),a=i(8181),o=i(3207),d=i(2514),l=i(9022),r=i(4848);const c=(0,a.defineMessages)({delete_account:{id:"delete_account",defaultMessage:"Delete account",description:"Title for delete account warning"},delete_account_warning:{id:"delete_account_warning",defaultMessage:"Are you sure you want to delete your account? It cannot be undone.",description:"Warning message when deleting an account"}});class h extends n().Component{constructor(e){super(e);const s=this.props.tinode.getMeTopic();let i=0;s.contacts(e=>{e.acs&&!e.acs.isJoiner()&&i++});const t=s.getDefaultAccess();this.state={auth:t?t.auth:null,anon:t?t.anon:null,showPermissionEditorFor:void 0,blockedCount:i},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),this.handleCheckboxClick=this.handleCheckboxClick.bind(this)}handlePasswordUpdate(e){this.setState({password:e}),this.props.onUpdatePassword(e)}handleLaunchPermissionsEditor(e){this.setState({showPermissionEditorFor:e,editedPermissions:this.state[e]})}handleHidePermissionsEditor(){this.setState({showPermissionEditorFor:void 0})}handlePermissionsChanged(e){let s={};s[this.state.showPermissionEditorFor]=e,this.props.onUpdateAccountDesc("me",void 0,void 0,s);let i={showPermissionEditorFor:void 0};i[this.state.showPermissionEditorFor]=e,this.setState(i)}handleCheckboxClick(e,s){this.props.onToggleIncognitoMode(s)}handleDeleteAccount(e){e.preventDefault();const{formatMessage:s}=this.props.intl;this.props.onShowAlert(s(c.delete_account),s(c.delete_account_warning),e=>this.props.onDeleteAccount(),null,!0,null)}render(){return(0,r.jsx)(r.Fragment,{children:this.state.showPermissionEditorFor?(0,r.jsx)(l.A,{mode:this.state.editedPermissions,skip:"O",onSubmit:this.handlePermissionsChanged,onCancel:this.handleHidePermissionsEditor}):(0,r.jsxs)("div",{className:"scrollable-panel",children:[(0,r.jsxs)("div",{className:"panel-form-column",children:[(0,r.jsx)("label",{className:"small",children:(0,r.jsx)(a.FormattedMessage,{id:"label_password",defaultMessage:"Password",description:"Label for password editing"})}),(0,r.jsx)("div",{children:(0,r.jsx)(a.FormattedMessage,{id:"password_unchanged_prompt",defaultMessage:"Unchanged",description:"Message in editor while password is unchanged",children:e=>(0,r.jsx)(d.A,{placeholder:e,type:"password",onFinished:this.handlePasswordUpdate})})})]}),(0,r.jsx)("div",{className:"hr"}),(0,r.jsxs)("div",{className:"panel-form-row",children:[(0,r.jsx)("label",{htmlFor:"incognito-mode",children:(0,r.jsx)(a.FormattedMessage,{id:"label_incognito_mode",defaultMessage:"Incognito mode:",description:"Label for incognito mode toggle"})}),(0,r.jsx)(o.A,{name:"incognito",id:"incognito-mode",checked:this.props.incognitoMode,onChange:this.handleCheckboxClick})]}),(0,r.jsx)("div",{className:"panel-form-row",children:(0,r.jsx)("span",{className:"small gray",children:(0,r.jsx)(a.FormattedMessage,{id:"incognito_mode_description",defaultMessage:"Hide your online status and typing indicators.",description:"Description for incognito mode toggle"})})}),(0,r.jsx)("div",{className:"hr"}),(0,r.jsxs)("div",{className:"panel-form-column",children:[(0,r.jsxs)("a",{href:"#",className:"danger flat-button",onClick:e=>{e.preventDefault(),this.props.onLogout()},children:[(0,r.jsx)("i",{className:"material-icons",children:"exit_to_app"})," ",(0,r.jsx)(a.FormattedMessage,{id:"button_logout",defaultMessage:"Logout",description:"Button [Logout]"})]}),(0,r.jsxs)("a",{href:"#",className:"danger flat-button",onClick:e=>{this.handleDeleteAccount(e)},children:[(0,r.jsx)("i",{className:"material-icons",children:"delete"})," ",(0,r.jsx)(a.FormattedMessage,{id:"button_delete_account",defaultMessage:"Delete account",description:"Button [Delete account]"})]})]}),(0,r.jsx)("div",{className:"hr"}),(0,r.jsxs)("div",{className:"panel-form-column",children:[(0,r.jsx)("div",{children:(0,r.jsx)("label",{className:"small",children:(0,r.jsx)(a.FormattedMessage,{id:"label_default_access_mode",defaultMessage:"Default access mode:",description:"Label for default access mode"})})}),(0,r.jsxs)("div",{className:"quoted",children:[(0,r.jsxs)("div",{children:["Auth: ",(0,r.jsx)("tt",{className:"clickable",onClick:this.handleLaunchPermissionsEditor.bind(this,"auth"),children:this.state.auth})]}),(0,r.jsxs)("div",{children:["Anon: ",(0,r.jsx)("tt",{className:"clickable",onClick:this.handleLaunchPermissionsEditor.bind(this,"anon"),children:this.state.anon})]})]})]}),this.state.blockedCount>0?(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)("div",{className:"hr"}),(0,r.jsxs)("div",{className:"panel-form-row",children:[(0,r.jsx)("i",{className:"material-icons",children:"block"})," ",(0,r.jsx)("a",{href:"#",className:"gray",onClick:e=>{e.preventDefault(),this.props.onShowBlocked()},children:(0,r.jsx)(a.FormattedMessage,{id:"blocked_contacts_link",defaultMessage:"Blocked contacts ({count})",values:{count:this.state.blockedCount},description:"Blocked contacts link"})})]})]}):null]})})}}s.default=(0,a.injectIntl)(h)},9022:function(e,s,i){var t=i(1594),n=i.n(t),a=i(8181),o=i(3207),d=i(1974),l=i(7981),r=i(4848);const c=(0,a.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 h 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 s=this.state.mode;-1==s.indexOf(e)?s+=e:s=s.replace(e,""),this.setState({mode:s})}handleSubmit(){const 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,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 i=this.props.skip||"",t=this.state.mode,n=(this.props.compare||"").replace("N",""),h=[];for(let e=0;e<8;e++){let a="JRWPASDO".charAt(e);i.indexOf(a)>=0&&t.indexOf(a)<0||h.push((0,r.jsxs)("tr",{children:[(0,r.jsx)("td",{children:s[a]}),(0,r.jsx)("td",{className:"checkbox",children:i.indexOf(a)<0?(0,r.jsx)(o.A,{name:a,checked:t.indexOf(a)>=0,onChange:this.handleChange}):(0,r.jsx)(o.A,{name:a,checked:t.indexOf(a)>=0})}),this.props.compare?(0,r.jsx)("td",{className:"checkbox",children:(0,r.jsx)(o.A,{name:a,checked:n.indexOf(a)>=0})}):null]},a))}return(0,r.jsxs)("div",{className:"panel-form-column",children:[this.props.userTitle?(0,r.jsx)("ul",{className:"contact-box small",children:(0,r.jsx)(d.A,{tinode:this.props.tinode,item:this.props.item,title:this.props.userTitle,small:!0,avatar:(0,l.to)(this.props.userAvatar?this.props.userAvatar:null)})}):null,(0,r.jsx)("label",{className:"small",children:(0,r.jsx)(a.FormattedMessage,{id:"title_permissions",defaultMessage:"Permissions",description:"Section title"})}),(0,r.jsxs)("table",{className:"permission-editor",children:[this.props.compare?(0,r.jsx)("thead",{children:(0,r.jsxs)("tr",{children:[(0,r.jsx)("th",{}),(0,r.jsx)("th",{children:this.props.modeTitle}),(0,r.jsx)("th",{children:this.props.compareTitle})]})}):null,(0,r.jsx)("tbody",{children:h})]}),(0,r.jsx)("br",{}),(0,r.jsxs)("div",{className:"dialog-buttons",children:[(0,r.jsx)("button",{className:"outline",onClick:this.handleCancel,children:(0,r.jsx)(a.FormattedMessage,{id:"button_cancel",defaultMessage:"Cancel",description:"Button [Cancel]"})}),(0,r.jsx)("button",{className:"primary",onClick:this.handleSubmit,children:(0,r.jsx)(a.FormattedMessage,{id:"button_ok",defaultMessage:"OK",description:"Button [OK]"})})]})]})}}s.A=(0,a.injectIntl)(h)}}]);
+//# sourceMappingURL=331.prod.js.map
\ No newline at end of file
diff --git a/umd/331.prod.js.map b/umd/331.prod.js.map
new file mode 100644
index 00000000..1f9b1f9c
--- /dev/null
+++ b/umd/331.prod.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"331.prod.js","mappings":"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","sources":["webpack://tinode-webapp/./src/views/acc-security-view.jsx","webpack://tinode-webapp/./src/widgets/permissions-editor.jsx"],"sourcesContent":["// Edit account parameters.\nimport React from 'react';\nimport { FormattedMessage, defineMessages, injectIntl } from 'react-intl';\n\nimport CheckBox from '../widgets/checkbox.jsx';\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_warning',\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 this.handleCheckboxClick = this.handleCheckboxClick.bind(this);\n }\n\n handlePasswordUpdate(pwd) {\n this.setState({password: pwd});\n this.props.onUpdatePassword(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.onUpdateAccountDesc('me', undefined, undefined, defacs);\n\n let newState = {showPermissionEditorFor: undefined};\n newState[this.state.showPermissionEditorFor] = perm;\n this.setState(newState);\n }\n\n handleCheckboxClick(what, checked) {\n this.props.onToggleIncognitoMode(checked);\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
\n {\n (password_unchanged) => \n } \n
\n
\n
\n
\n \n \n \n \n
\n
\n \n \n \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 : null }\n
\n }>\n );\n }\n};\n\nexport default injectIntl(AccSecurityView);\n","// PermissionsEditor: Component for editing permissions\n// \nimport React from 'react';\nimport { FormattedMessage, defineMessages, injectIntl } from 'react-intl';\n\nimport CheckBox from './checkbox.jsx';\nimport Contact from './contact.jsx';\n\nimport { makeImageUrl } from '../lib/blob-helpers.js';\n\n// Translatable permission names.\nconst messages = defineMessages({\n joiner: {\n id: 'permission_join',\n defaultMessage: \"Join ({val})\",\n description: 'Name of J permission'\n },\n reader: {\n id: 'permission_read',\n defaultMessage: \"Read ({val})\",\n description: 'Name of R permission'\n },\n writer: {\n id: 'permission_write',\n defaultMessage: \"Write ({val})\",\n description: 'Name of W permission'\n },\n preser: {\n id: 'permission_pres',\n defaultMessage: \"Get notified ({val})\",\n description: 'Name of P permission'\n },\n approver: {\n id: 'permission_admin',\n defaultMessage: \"Approve ({val})\",\n description: 'Name of A permission'\n },\n sharer: {\n id: 'permission_share',\n defaultMessage: \"Share ({val})\",\n description: 'Name of S permission'\n },\n deleter: {\n id: 'permission_delete',\n defaultMessage: \"Delete ({val})\",\n description: 'Name of D permission'\n },\n owner: {\n id: 'permission_owner',\n defaultMessage: \"Owner ({val})\",\n description: 'Name of O permission'\n }\n});\n\nclass PermissionsEditor extends React.Component {\n constructor(props) {\n super(props);\n\n this.state = {\n mode: (props.mode || '').replace('N', '')\n };\n\n this.handleChange = this.handleChange.bind(this);\n this.handleSubmit = this.handleSubmit.bind(this);\n this.handleCancel = this.handleCancel.bind(this);\n }\n\n handleChange(val) {\n let mode = this.state.mode;\n const idx = mode.indexOf(val);\n if (idx == -1) {\n mode += val;\n } else {\n mode = mode.replace(val, '');\n }\n this.setState({mode: mode});\n }\n\n handleSubmit() {\n // Normalize string, otherwise cannot check if mode has changed.\n const mode = (this.state.mode || 'N').split('').sort().join('');\n const before = (this.props.mode || 'N').split('').sort().join('')\n if (mode !== before) {\n this.props.onSubmit(mode);\n } else {\n this.props.onCancel();\n }\n }\n\n handleCancel() {\n this.props.onCancel();\n }\n\n render() {\n const {formatMessage} = this.props.intl;\n const all = 'JRWPASDO';\n const names = {\n 'J': formatMessage(messages.joiner, {val: 'J'}),\n 'R': formatMessage(messages.reader, {val: 'R'}),\n 'W': formatMessage(messages.writer, {val: 'W'}),\n 'P': formatMessage(messages.preser, {val: 'P'}),\n 'A': formatMessage(messages.approver, {val: 'A'}),\n 'S': formatMessage(messages.sharer, {val: 'S'}),\n 'D': formatMessage(messages.deleter, {val: 'D'}),\n 'O': formatMessage(messages.owner, {val: 'O'})\n };\n\n let skip = this.props.skip || '';\n let mode = this.state.mode;\n let compare = (this.props.compare || '').replace('N', '');\n let items = [];\n for (let i=0; i= 0 && mode.indexOf(c) < 0) {\n // Permission is marked as inactive: hide unchecked permissions, disable checked permissions\n continue;\n }\n items.push(\n \n {names[c]} \n {skip.indexOf(c) < 0 ?\n = 0)} onChange={this.handleChange}/>\n :\n = 0)} />\n } {this.props.compare ? \n = 0)}/>\n : null}\n \n );\n }\n\n return (\n \n {this.props.userTitle ?\n
: null}\n
\n
\n {this.props.compare ?\n \n {this.props.modeTitle} \n {this.props.compareTitle} \n :\n null}\n \n {items}\n
\n
\n
\n \n \n \n \n \n \n
\n
\n );\n }\n};\n\nexport default injectIntl(PermissionsEditor);\n"],"names":["messages","react_intl__WEBPACK_IMPORTED_MODULE_1__","defineMessages","delete_account","id","defaultMessage","description","delete_account_warning","AccSecurityView","react__WEBPACK_IMPORTED_MODULE_0___default","constructor","props","super","me","this","tinode","getMeTopic","blockedCount","contacts","c","acs","isJoiner","defacs","getDefaultAccess","state","auth","anon","showPermissionEditorFor","undefined","handlePasswordUpdate","bind","handleLaunchPermissionsEditor","handleHidePermissionsEditor","handlePermissionsChanged","handleDeleteAccount","handleCheckboxClick","pwd","setState","password","onUpdatePassword","which","editedPermissions","perm","onUpdateAccountDesc","newState","what","checked","onToggleIncognitoMode","e","preventDefault","formatMessage","intl","onShowAlert","_","onDeleteAccount","render","react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__","jsx","Fragment","children","_widgets_permissions_editor_jsx__WEBPACK_IMPORTED_MODULE_4__","A","mode","skip","onSubmit","onCancel","jsxs","className","FormattedMessage","password_unchanged","_widgets_in_place_edit_jsx__WEBPACK_IMPORTED_MODULE_3__","placeholder","type","onFinished","htmlFor","_widgets_checkbox_jsx__WEBPACK_IMPORTED_MODULE_2__","name","incognitoMode","onChange","href","onClick","onLogout","onShowBlocked","values","count","__webpack_exports__","injectIntl","joiner","reader","writer","preser","approver","sharer","deleter","owner","PermissionsEditor","replace","handleChange","handleSubmit","handleCancel","val","indexOf","split","sort","join","names","J","R","W","P","S","D","O","compare","items","i","all","charAt","push","_checkbox_jsx__WEBPACK_IMPORTED_MODULE_2__","userTitle","_contact_jsx__WEBPACK_IMPORTED_MODULE_3__","item","title","small","avatar","_lib_blob_helpers_js__WEBPACK_IMPORTED_MODULE_4__","to","userAvatar","modeTitle","compareTitle"],"sourceRoot":""}
\ No newline at end of file
diff --git a/umd/523.prod.js b/umd/523.prod.js
new file mode 100644
index 00000000..eea7dad0
--- /dev/null
+++ b/umd/523.prod.js
@@ -0,0 +1,2 @@
+"use strict";(self.webpackChunktinode_webapp=self.webpackChunktinode_webapp||[]).push([[523],{7523:function(e,t,s){s.r(t),s.d(t,{default:function(){return Q}});var i=s(1594),a=s.n(i),n=s(8181),o=s(4532),r=s(4752),l=s(7256),d=s(7849),h=s(4848);class c extends a().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 i=this.props.tinode.getLargeFileHelper();this.setState({downloader:i}),i.download(e,t,s,e=>this.setState({progress:e/this.props.size}),e=>this.props.onError(e,"err")).then(e=>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,i=this.props.size>0?(0,h.jsxs)("span",{className:"small gray",children:["(",(0,l.lX)(this.props.size),")"]}):null;this.props.uploading||this.state.downloader||!(0,d.YO)(this.props.downloadUrl)?(t=(0,d.Jf)(this.props.downloadUrl),s=null):(t="#",s=e=>{e.preventDefault(),this.downloadFile(this.props.downloadUrl,this.props.filename,this.props.mimetype)});const a=(0,h.jsxs)(h.Fragment,{children:[(0,h.jsx)("i",{className:"material-icons",children:"file_download"})," ",(0,h.jsx)(n.FormattedMessage,{id:"save_attachment",defaultMessage:"save",description:"Call to save an attachment"})]});return(0,h.jsxs)("div",{className:"attachment",children:[(0,h.jsx)("div",{children:(0,h.jsx)("i",{className:"material-icons big gray",children:"insert_drive_file"})}),(0,h.jsxs)("div",{className:"flex-column",children:[(0,h.jsxs)("div",{children:[e," ",i]}),this.props.uploading||this.state.downloader?(0,h.jsx)(r.A,{progress:this.props.uploading?this.props.progress:this.state.progress,onCancel:this.handleCancel}):(0,h.jsx)("div",{children:t?(0,h.jsx)("a",{href:t,download:this.props.filename,onClick:s,children:a}):(0,h.jsx)("span",{className:"light-gray",children:a})})]})]})}}var p=s(5247);const u=(0,n.defineMessages)({message_sending:{id:"message_sending",defaultMessage:"sending...",description:"Message being sent, in place of time stamp"},message_sending_failed:{id:"message_sending_failed",defaultMessage:"failed",description:"Failed to send message, in place of time stamp"},message_edited_marker:{id:"message_edited_marker",defaultMessage:", edited",description:"Marker indicating that the message was edited"}});class g extends a().PureComponent{render(){const{formatMessage:e}=this.props.intl;let t;t=this.props.received<=o.Tinode.MESSAGE_STATUS_SENDING?e(u.message_sending):this.props.received==o.Tinode.MESSAGE_STATUS_FAILED||this.props.received==o.Tinode.MESSAGE_STATUS_FATAL?e(u.message_sending_failed):this.props.timestamp.toLocaleTimeString(this.props.intl.locale,{timeStyle:"short"});const s=(0,d.LO)(this.props.received),i=s?(0,h.jsx)("i",{className:"material-icons small "+s.color,children:s.name}):null,a=this.props.edited?e(u.message_edited_marker):null;return(0,h.jsxs)("span",{className:"timestamp",children:[t,a," ",i]})}}var m=(0,n.injectIntl)(g),f=s(2067),v=s(184);class b extends a().PureComponent{constructor(e){super(e),this.state={progress:0},e.uploader&&(e.uploader.onProgress=this.handleProgress.bind(this)),this.handleExpandImage=this.handleExpandImage.bind(this),this.handlePlayVideo=this.handlePlayVideo.bind(this),this.handleFormButtonClick=this.handleFormButtonClick.bind(this),this.handleQuoteClick=this.handleQuoteClick.bind(this),this.handleContextClick=this.handleContextClick.bind(this),this.handleCancelUpload=this.handleCancelUpload.bind(this),this.handleDraftyClick=this.handleDraftyClick.bind(this),this.formatterContext={formatMessage:e.intl.formatMessage.bind(e.intl),viewportWidth:e.viewportWidth,authorizeURL:e.tinode.authorizeURL.bind(e.tinode),onHandleClick:this.handleDraftyClick}}handleDraftyClick=(e,t)=>{switch(t){case"image":this.handleExpandImage(e);break;case"video":this.handlePlayVideo(e);break;case"form_button":this.handleFormButtonClick(e);break;case"quote":this.handleQuoteClick(e);break;case"contact_chat":e.preventDefault();try{const t=new URL(e.target.dataset.val)?.pathname,s=t.split("/").filter(Boolean);v.A.navigateTo(v.A.setUrlTopic("",s.pop()||""))}catch(e){console.error("Invalid URL:",e)}break;case"contact_find":e.preventDefault();let s=v.A.setUrlSidePanel(window.location.hash,"newtpk");s=v.A.addUrlParam(s,"q",e.target.dataset.val),s=v.A.addUrlParam(s,"tab","find"),v.A.navigateTo(s);break;default:console.info("Unhandled drafty action.",t,e.target.dataset)}};handleExpandImage(e){e.preventDefault(),this.props.onExpandMedia({url:e.target.src,filename:e.target.dataset.name,width:e.target.dataset.width,height:e.target.dataset.height,size:e.target.dataset.size,type:e.target.dataset.mime})}handlePlayVideo(e){e.preventDefault(),this.props.onExpandMedia({video:!0,url:e.target.dataset.src,preview:e.target.src,filename:e.target.dataset.name,width:e.target.dataset.width,height:e.target.dataset.height,duration:e.target.dataset.duration,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,d.Jf)(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=[];if(this.props.received==o.Tinode.MESSAGE_STATUS_FAILED&&t.push("menu_item_send_retry"),this.props.received>o.Tinode.MESSAGE_STATUS_FATAL){if(this.props.userIsWriter&&(t.push("menu_item_reply"),!this.props.response)){let e=!1;o.Drafty.entities(this.props.content,(t,s,i)=>(e=["AU","EX","FM","IM","TC","VC","VD"].includes(i),e)),e||o.Drafty.styles(this.props.content,t=>(e=["QQ"].includes(t),e)),e||t.push("menu_item_edit")}this.props.userIsAdmin&&t.push(this.props.pinned?"menu_item_unpin":"menu_item_pin")}t.push("menu_item_forward"),this.props.showContextMenu({seq:this.props.seq,replace:this.props.edited?parseInt(this.props.edited.split(":")[1]):0,content:this.props.content,userFrom:this.props.userFrom,userName:this.props.userName,y:e.pageY,x:e.pageX,pickReply:this.props.pickReply,editMessage:this.props.editMessage,timestamp:this.props.timestamp},t)}handleProgress(e){this.setState({progress:e})}handleCancelUpload(){this.props.onCancelUpload(this.props.seq,this.props.uploader)}handleQuoteClick(e){e.preventDefault(),e.stopPropagation();const t=this.props.replyToSeq;t&&this.props.onQuoteClick(t)}render(){const e=this.props.sequence+" "+(this.props.response?"left":"right"),t="single"==this.props.sequence||"last"==this.props.sequence?"bubble tip":"bubble",s=this.props.userAvatar||!0;let i="message-content";const r=this.props.isGroup&&this.props.response&&("single"==this.props.sequence||"last"==this.props.sequence);let l=this.props.content;const d=[];if(this.props.mimeType==o.Drafty.getContentType()&&o.Drafty.isValid(l)){o.Drafty.attachments(l,(e,t)=>{o.Drafty.isFormResponseType(e.mime)||d.push((0,h.jsx)(c,{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},t))},this);const e=o.Drafty.format(l,f.e3,this.formatterContext);l=a().createElement(a().Fragment,null,e)}else"string"==typeof l?new RegExp("^\\p{RGI_Emoji}{1,5}$","v").test(l||"")&&(i+=" emoji-"+(l||"").match(/(?:👨🏻❤️💋👨🏻|👨🏻❤️💋👨🏼|👨🏻❤️💋👨🏽|👨🏻❤️💋👨🏾|👨🏻❤️💋👨🏿|👨🏼❤️💋👨🏻|👨🏼❤️💋👨🏼|👨🏼❤️💋👨🏽|👨🏼❤️💋👨🏾|👨🏼❤️💋👨🏿|👨🏽❤️💋👨🏻|👨🏽❤️💋👨🏼|👨🏽❤️💋👨🏽|👨🏽❤️💋👨🏾|👨🏽❤️💋👨🏿|👨🏾❤️💋👨🏻|👨🏾❤️💋👨🏼|👨🏾❤️💋👨🏽|👨🏾❤️💋👨🏾|👨🏾❤️💋👨🏿|👨🏿❤️💋👨🏻|👨🏿❤️💋👨🏼|👨🏿❤️💋👨🏽|👨🏿❤️💋👨🏾|👨🏿❤️💋👨🏿|👩🏻❤️💋👨🏻|👩🏻❤️💋👨🏼|👩🏻❤️💋👨🏽|👩🏻❤️💋👨🏾|👩🏻❤️💋👨🏿|👩🏻❤️💋👩🏻|👩🏻❤️💋👩🏼|👩🏻❤️💋👩🏽|👩🏻❤️💋👩🏾|👩🏻❤️💋👩🏿|👩🏼❤️💋👨🏻|👩🏼❤️💋👨🏼|👩🏼❤️💋👨🏽|👩🏼❤️💋👨🏾|👩🏼❤️💋👨🏿|👩🏼❤️💋👩🏻|👩🏼❤️💋👩🏼|👩🏼❤️💋👩🏽|👩🏼❤️💋👩🏾|👩🏼❤️💋👩🏿|👩🏽❤️💋👨🏻|👩🏽❤️💋👨🏼|👩🏽❤️💋👨🏽|👩🏽❤️💋👨🏾|👩🏽❤️💋👨🏿|👩🏽❤️💋👩🏻|👩🏽❤️💋👩🏼|👩🏽❤️💋👩🏽|👩🏽❤️💋👩🏾|👩🏽❤️💋👩🏿|👩🏾❤️💋👨🏻|👩🏾❤️💋👨🏼|👩🏾❤️💋👨🏽|👩🏾❤️💋👨🏾|👩🏾❤️💋👨🏿|👩🏾❤️💋👩🏻|👩🏾❤️💋👩🏼|👩🏾❤️💋👩🏽|👩🏾❤️💋👩🏾|👩🏾❤️💋👩🏿|👩🏿❤️💋👨🏻|👩🏿❤️💋👨🏼|👩🏿❤️💋👨🏽|👩🏿❤️💋👨🏾|👩🏿❤️💋👨🏿|👩🏿❤️💋👩🏻|👩🏿❤️💋👩🏼|👩🏿❤️💋👩🏽|👩🏿❤️💋👩🏾|👩🏿❤️💋👩🏿|🧑🏻❤️💋🧑🏼|🧑🏻❤️💋🧑🏽|🧑🏻❤️💋🧑🏾|🧑🏻❤️💋🧑🏿|🧑🏼❤️💋🧑🏻|🧑🏼❤️💋🧑🏽|🧑🏼❤️💋🧑🏾|🧑🏼❤️💋🧑🏿|🧑🏽❤️💋🧑🏻|🧑🏽❤️💋🧑🏼|🧑🏽❤️💋🧑🏾|🧑🏽❤️💋🧑🏿|🧑🏾❤️💋🧑🏻|🧑🏾❤️💋🧑🏼|🧑🏾❤️💋🧑🏽|🧑🏾❤️💋🧑🏿|🧑🏿❤️💋🧑🏻|🧑🏿❤️💋🧑🏼|🧑🏿❤️💋🧑🏽|🧑🏿❤️💋🧑🏾|🏴|🏴|🏴|👨🏻❤️👨🏻|👨🏻❤️👨🏼|👨🏻❤️👨🏽|👨🏻❤️👨🏾|👨🏻❤️👨🏿|👨🏻🐰👨🏼|👨🏻🐰👨🏽|👨🏻🐰👨🏾|👨🏻🐰👨🏿|👨🏻🤝👨🏼|👨🏻🤝👨🏽|👨🏻🤝👨🏾|👨🏻🤝👨🏿|👨🏻👨🏼|👨🏻👨🏽|👨🏻👨🏾|👨🏻👨🏿|👨🏼❤️👨🏻|👨🏼❤️👨🏼|👨🏼❤️👨🏽|👨🏼❤️👨🏾|👨🏼❤️👨🏿|👨🏼🐰👨🏻|👨🏼🐰👨🏽|👨🏼🐰👨🏾|👨🏼🐰👨🏿|👨🏼🤝👨🏻|👨🏼🤝👨🏽|👨🏼🤝👨🏾|👨🏼🤝👨🏿|👨🏼👨🏻|👨🏼👨🏽|👨🏼👨🏾|👨🏼👨🏿|👨🏽❤️👨🏻|👨🏽❤️👨🏼|👨🏽❤️👨🏽|👨🏽❤️👨🏾|👨🏽❤️👨🏿|👨🏽🐰👨🏻|👨🏽🐰👨🏼|👨🏽🐰👨🏾|👨🏽🐰👨🏿|👨🏽🤝👨🏻|👨🏽🤝👨🏼|👨🏽🤝👨🏾|👨🏽🤝👨🏿|👨🏽👨🏻|👨🏽👨🏼|👨🏽👨🏾|👨🏽👨🏿|👨🏾❤️👨🏻|👨🏾❤️👨🏼|👨🏾❤️👨🏽|👨🏾❤️👨🏾|👨🏾❤️👨🏿|👨🏾🐰👨🏻|👨🏾🐰👨🏼|👨🏾🐰👨🏽|👨🏾🐰👨🏿|👨🏾🤝👨🏻|👨🏾🤝👨🏼|👨🏾🤝👨🏽|👨🏾🤝👨🏿|👨🏾👨🏻|👨🏾👨🏼|👨🏾👨🏽|👨🏾👨🏿|👨🏿❤️👨🏻|👨🏿❤️👨🏼|👨🏿❤️👨🏽|👨🏿❤️👨🏾|👨🏿❤️👨🏿|👨🏿🐰👨🏻|👨🏿🐰👨🏼|👨🏿🐰👨🏽|👨🏿🐰👨🏾|👨🏿🤝👨🏻|👨🏿🤝👨🏼|👨🏿🤝👨🏽|👨🏿🤝👨🏾|👨🏿👨🏻|👨🏿👨🏼|👨🏿👨🏽|👨🏿👨🏾|👩🏻❤️👨🏻|👩🏻❤️👨🏼|👩🏻❤️👨🏽|👩🏻❤️👨🏾|👩🏻❤️👨🏿|👩🏻❤️👩🏻|👩🏻❤️👩🏼|👩🏻❤️👩🏽|👩🏻❤️👩🏾|👩🏻❤️👩🏿|👩🏻🐰👩🏼|👩🏻🐰👩🏽|👩🏻🐰👩🏾|👩🏻🐰👩🏿|👩🏻🤝👨🏼|👩🏻🤝👨🏽|👩🏻🤝👨🏾|👩🏻🤝👨🏿|👩🏻🤝👩🏼|👩🏻🤝👩🏽|👩🏻🤝👩🏾|👩🏻🤝👩🏿|👩🏻👩🏼|👩🏻👩🏽|👩🏻👩🏾|👩🏻👩🏿|👩🏼❤️👨🏻|👩🏼❤️👨🏼|👩🏼❤️👨🏽|👩🏼❤️👨🏾|👩🏼❤️👨🏿|👩🏼❤️👩🏻|👩🏼❤️👩🏼|👩🏼❤️👩🏽|👩🏼❤️👩🏾|👩🏼❤️👩🏿|👩🏼🐰👩🏻|👩🏼🐰👩🏽|👩🏼🐰👩🏾|👩🏼🐰👩🏿|👩🏼🤝👨🏻|👩🏼🤝👨🏽|👩🏼🤝👨🏾|👩🏼🤝👨🏿|👩🏼🤝👩🏻|👩🏼🤝👩🏽|👩🏼🤝👩🏾|👩🏼🤝👩🏿|👩🏼👩🏻|👩🏼👩🏽|👩🏼👩🏾|👩🏼👩🏿|👩🏽❤️👨🏻|👩🏽❤️👨🏼|👩🏽❤️👨🏽|👩🏽❤️👨🏾|👩🏽❤️👨🏿|👩🏽❤️👩🏻|👩🏽❤️👩🏼|👩🏽❤️👩🏽|👩🏽❤️👩🏾|👩🏽❤️👩🏿|👩🏽🐰👩🏻|👩🏽🐰👩🏼|👩🏽🐰👩🏾|👩🏽🐰👩🏿|👩🏽🤝👨🏻|👩🏽🤝👨🏼|👩🏽🤝👨🏾|👩🏽🤝👨🏿|👩🏽🤝👩🏻|👩🏽🤝👩🏼|👩🏽🤝👩🏾|👩🏽🤝👩🏿|👩🏽👩🏻|👩🏽👩🏼|👩🏽👩🏾|👩🏽👩🏿|👩🏾❤️👨🏻|👩🏾❤️👨🏼|👩🏾❤️👨🏽|👩🏾❤️👨🏾|👩🏾❤️👨🏿|👩🏾❤️👩🏻|👩🏾❤️👩🏼|👩🏾❤️👩🏽|👩🏾❤️👩🏾|👩🏾❤️👩🏿|👩🏾🐰👩🏻|👩🏾🐰👩🏼|👩🏾🐰👩🏽|👩🏾🐰👩🏿|👩🏾🤝👨🏻|👩🏾🤝👨🏼|👩🏾🤝👨🏽|👩🏾🤝👨🏿|👩🏾🤝👩🏻|👩🏾🤝👩🏼|👩🏾🤝👩🏽|👩🏾🤝👩🏿|👩🏾👩🏻|👩🏾👩🏼|👩🏾👩🏽|👩🏾👩🏿|👩🏿❤️👨🏻|👩🏿❤️👨🏼|👩🏿❤️👨🏽|👩🏿❤️👨🏾|👩🏿❤️👨🏿|👩🏿❤️👩🏻|👩🏿❤️👩🏼|👩🏿❤️👩🏽|👩🏿❤️👩🏾|👩🏿❤️👩🏿|👩🏿🐰👩🏻|👩🏿🐰👩🏼|👩🏿🐰👩🏽|👩🏿🐰👩🏾|👩🏿🤝👨🏻|👩🏿🤝👨🏼|👩🏿🤝👨🏽|👩🏿🤝👨🏾|👩🏿🤝👩🏻|👩🏿🤝👩🏼|👩🏿🤝👩🏽|👩🏿🤝👩🏾|👩🏿👩🏻|👩🏿👩🏼|👩🏿👩🏽|👩🏿👩🏾|🧑🏻❤️🧑🏼|🧑🏻❤️🧑🏽|🧑🏻❤️🧑🏾|🧑🏻❤️🧑🏿|🧑🏻🐰🧑🏼|🧑🏻🐰🧑🏽|🧑🏻🐰🧑🏾|🧑🏻🐰🧑🏿|🧑🏻🤝🧑🏻|🧑🏻🤝🧑🏼|🧑🏻🤝🧑🏽|🧑🏻🤝🧑🏾|🧑🏻🤝🧑🏿|🧑🏻🧑🏼|🧑🏻🧑🏽|🧑🏻🧑🏾|🧑🏻🧑🏿|🧑🏼❤️🧑🏻|🧑🏼❤️🧑🏽|🧑🏼❤️🧑🏾|🧑🏼❤️🧑🏿|🧑🏼🐰🧑🏻|🧑🏼🐰🧑🏽|🧑🏼🐰🧑🏾|🧑🏼🐰🧑🏿|🧑🏼🤝🧑🏻|🧑🏼🤝🧑🏼|🧑🏼🤝🧑🏽|🧑🏼🤝🧑🏾|🧑🏼🤝🧑🏿|🧑🏼🧑🏻|🧑🏼🧑🏽|🧑🏼🧑🏾|🧑🏼🧑🏿|🧑🏽❤️🧑🏻|🧑🏽❤️🧑🏼|🧑🏽❤️🧑🏾|🧑🏽❤️🧑🏿|🧑🏽🐰🧑🏻|🧑🏽🐰🧑🏼|🧑🏽🐰🧑🏾|🧑🏽🐰🧑🏿|🧑🏽🤝🧑🏻|🧑🏽🤝🧑🏼|🧑🏽🤝🧑🏽|🧑🏽🤝🧑🏾|🧑🏽🤝🧑🏿|🧑🏽🧑🏻|🧑🏽🧑🏼|🧑🏽🧑🏾|🧑🏽🧑🏿|🧑🏾❤️🧑🏻|🧑🏾❤️🧑🏼|🧑🏾❤️🧑🏽|🧑🏾❤️🧑🏿|🧑🏾🐰🧑🏻|🧑🏾🐰🧑🏼|🧑🏾🐰🧑🏽|🧑🏾🐰🧑🏿|🧑🏾🤝🧑🏻|🧑🏾🤝🧑🏼|🧑🏾🤝🧑🏽|🧑🏾🤝🧑🏾|🧑🏾🤝🧑🏿|🧑🏾🧑🏻|🧑🏾🧑🏼|🧑🏾🧑🏽|🧑🏾🧑🏿|🧑🏿❤️🧑🏻|🧑🏿❤️🧑🏼|🧑🏿❤️🧑🏽|🧑🏿❤️🧑🏾|🧑🏿🐰🧑🏻|🧑🏿🐰🧑🏼|🧑🏿🐰🧑🏽|🧑🏿🐰🧑🏾|🧑🏿🤝🧑🏻|🧑🏿🤝🧑🏼|🧑🏿🤝🧑🏽|🧑🏿🤝🧑🏾|🧑🏿🤝🧑🏿|🧑🏿🧑🏻|🧑🏿🧑🏼|🧑🏿🧑🏽|🧑🏿🧑🏾|👨❤️💋👨|👨👨👦👦|👨👨👧👦|👨👨👧👧|👨👩👦👦|👨👩👧👦|👨👩👧👧|👩❤️💋👨|👩❤️💋👩|👩👩👦👦|👩👩👧👦|👩👩👧👧|🧑🧑🧒🧒|🏃🏻♀️➡️|🏃🏻♂️➡️|🏃🏼♀️➡️|🏃🏼♂️➡️|🏃🏽♀️➡️|🏃🏽♂️➡️|🏃🏾♀️➡️|🏃🏾♂️➡️|🏃🏿♀️➡️|🏃🏿♂️➡️|👨🏻🦯➡️|👨🏻🦼➡️|👨🏻🦽➡️|👨🏼🦯➡️|👨🏼🦼➡️|👨🏼🦽➡️|👨🏽🦯➡️|👨🏽🦼➡️|👨🏽🦽➡️|👨🏾🦯➡️|👨🏾🦼➡️|👨🏾🦽➡️|👨🏿🦯➡️|👨🏿🦼➡️|👨🏿🦽➡️|👩🏻🦯➡️|👩🏻🦼➡️|👩🏻🦽➡️|👩🏼🦯➡️|👩🏼🦼➡️|👩🏼🦽➡️|👩🏽🦯➡️|👩🏽🦼➡️|👩🏽🦽➡️|👩🏾🦯➡️|👩🏾🦼➡️|👩🏾🦽➡️|👩🏿🦯➡️|👩🏿🦼➡️|👩🏿🦽➡️|🚶🏻♀️➡️|🚶🏻♂️➡️|🚶🏼♀️➡️|🚶🏼♂️➡️|🚶🏽♀️➡️|🚶🏽♂️➡️|🚶🏾♀️➡️|🚶🏾♂️➡️|🚶🏿♀️➡️|🚶🏿♂️➡️|🧎🏻♀️➡️|🧎🏻♂️➡️|🧎🏼♀️➡️|🧎🏼♂️➡️|🧎🏽♀️➡️|🧎🏽♂️➡️|🧎🏾♀️➡️|🧎🏾♂️➡️|🧎🏿♀️➡️|🧎🏿♂️➡️|🧑🏻🦯➡️|🧑🏻🦼➡️|🧑🏻🦽➡️|🧑🏼🦯➡️|🧑🏼🦼➡️|🧑🏼🦽➡️|🧑🏽🦯➡️|🧑🏽🦼➡️|🧑🏽🦽➡️|🧑🏾🦯➡️|🧑🏾🦼➡️|🧑🏾🦽➡️|🧑🏿🦯➡️|🧑🏿🦼➡️|🧑🏿🦽➡️|🫱🏻🫲🏼|🫱🏻🫲🏽|🫱🏻🫲🏾|🫱🏻🫲🏿|🫱🏼🫲🏻|🫱🏼🫲🏽|🫱🏼🫲🏾|🫱🏼🫲🏿|🫱🏽🫲🏻|🫱🏽🫲🏼|🫱🏽🫲🏾|🫱🏽🫲🏿|🫱🏾🫲🏻|🫱🏾🫲🏼|🫱🏾🫲🏽|🫱🏾🫲🏿|🫱🏿🫲🏻|🫱🏿🫲🏼|🫱🏿🫲🏽|🫱🏿🫲🏾|🏃♀️➡️|🏃♂️➡️|👨❤️👨|👨👦👦|👨👧👦|👨👧👧|👨👨👦|👨👨👧|👨👩👦|👨👩👧|👨🦯➡️|👨🦼➡️|👨🦽➡️|👩❤️👨|👩❤️👩|👩👦👦|👩👧👦|👩👧👧|👩👩👦|👩👩👧|👩🦯➡️|👩🦼➡️|👩🦽➡️|🚶♀️➡️|🚶♂️➡️|🧎♀️➡️|🧎♂️➡️|🧑🤝🧑|🧑🦯➡️|🧑🦼➡️|🧑🦽➡️|🧑🧑🧒|🧑🧒🧒|🏃🏻♀️|🏃🏻♂️|🏃🏻➡️|🏃🏼♀️|🏃🏼♂️|🏃🏼➡️|🏃🏽♀️|🏃🏽♂️|🏃🏽➡️|🏃🏾♀️|🏃🏾♂️|🏃🏾➡️|🏃🏿♀️|🏃🏿♂️|🏃🏿➡️|🏄🏻♀️|🏄🏻♂️|🏄🏼♀️|🏄🏼♂️|🏄🏽♀️|🏄🏽♂️|🏄🏾♀️|🏄🏾♂️|🏄🏿♀️|🏄🏿♂️|🏊🏻♀️|🏊🏻♂️|🏊🏼♀️|🏊🏼♂️|🏊🏽♀️|🏊🏽♂️|🏊🏾♀️|🏊🏾♂️|🏊🏿♀️|🏊🏿♂️|🏋🏻♀️|🏋🏻♂️|🏋🏼♀️|🏋🏼♂️|🏋🏽♀️|🏋🏽♂️|🏋🏾♀️|🏋🏾♂️|🏋🏿♀️|🏋🏿♂️|🏌🏻♀️|🏌🏻♂️|🏌🏼♀️|🏌🏼♂️|🏌🏽♀️|🏌🏽♂️|🏌🏾♀️|🏌🏾♂️|🏌🏿♀️|🏌🏿♂️|👁️🗨️|👨🏻⚕️|👨🏻⚖️|👨🏻✈️|👨🏻🌾|👨🏻🍳|👨🏻🍼|👨🏻🎓|👨🏻🎤|👨🏻🎨|👨🏻🏫|👨🏻🏭|👨🏻💻|👨🏻💼|👨🏻🔧|👨🏻🔬|👨🏻🚀|👨🏻🚒|👨🏻🦯|👨🏻🦰|👨🏻🦱|👨🏻🦲|👨🏻🦳|👨🏻🦼|👨🏻🦽|👨🏼⚕️|👨🏼⚖️|👨🏼✈️|👨🏼🌾|👨🏼🍳|👨🏼🍼|👨🏼🎓|👨🏼🎤|👨🏼🎨|👨🏼🏫|👨🏼🏭|👨🏼💻|👨🏼💼|👨🏼🔧|👨🏼🔬|👨🏼🚀|👨🏼🚒|👨🏼🦯|👨🏼🦰|👨🏼🦱|👨🏼🦲|👨🏼🦳|👨🏼🦼|👨🏼🦽|👨🏽⚕️|👨🏽⚖️|👨🏽✈️|👨🏽🌾|👨🏽🍳|👨🏽🍼|👨🏽🎓|👨🏽🎤|👨🏽🎨|👨🏽🏫|👨🏽🏭|👨🏽💻|👨🏽💼|👨🏽🔧|👨🏽🔬|👨🏽🚀|👨🏽🚒|👨🏽🦯|👨🏽🦰|👨🏽🦱|👨🏽🦲|👨🏽🦳|👨🏽🦼|👨🏽🦽|👨🏾⚕️|👨🏾⚖️|👨🏾✈️|👨🏾🌾|👨🏾🍳|👨🏾🍼|👨🏾🎓|👨🏾🎤|👨🏾🎨|👨🏾🏫|👨🏾🏭|👨🏾💻|👨🏾💼|👨🏾🔧|👨🏾🔬|👨🏾🚀|👨🏾🚒|👨🏾🦯|👨🏾🦰|👨🏾🦱|👨🏾🦲|👨🏾🦳|👨🏾🦼|👨🏾🦽|👨🏿⚕️|👨🏿⚖️|👨🏿✈️|👨🏿🌾|👨🏿🍳|👨🏿🍼|👨🏿🎓|👨🏿🎤|👨🏿🎨|👨🏿🏫|👨🏿🏭|👨🏿💻|👨🏿💼|👨🏿🔧|👨🏿🔬|👨🏿🚀|👨🏿🚒|👨🏿🦯|👨🏿🦰|👨🏿🦱|👨🏿🦲|👨🏿🦳|👨🏿🦼|👨🏿🦽|👩🏻⚕️|👩🏻⚖️|👩🏻✈️|👩🏻🌾|👩🏻🍳|👩🏻🍼|👩🏻🎓|👩🏻🎤|👩🏻🎨|👩🏻🏫|👩🏻🏭|👩🏻💻|👩🏻💼|👩🏻🔧|👩🏻🔬|👩🏻🚀|👩🏻🚒|👩🏻🦯|👩🏻🦰|👩🏻🦱|👩🏻🦲|👩🏻🦳|👩🏻🦼|👩🏻🦽|👩🏼⚕️|👩🏼⚖️|👩🏼✈️|👩🏼🌾|👩🏼🍳|👩🏼🍼|👩🏼🎓|👩🏼🎤|👩🏼🎨|👩🏼🏫|👩🏼🏭|👩🏼💻|👩🏼💼|👩🏼🔧|👩🏼🔬|👩🏼🚀|👩🏼🚒|👩🏼🦯|👩🏼🦰|👩🏼🦱|👩🏼🦲|👩🏼🦳|👩🏼🦼|👩🏼🦽|👩🏽⚕️|👩🏽⚖️|👩🏽✈️|👩🏽🌾|👩🏽🍳|👩🏽🍼|👩🏽🎓|👩🏽🎤|👩🏽🎨|👩🏽🏫|👩🏽🏭|👩🏽💻|👩🏽💼|👩🏽🔧|👩🏽🔬|👩🏽🚀|👩🏽🚒|👩🏽🦯|👩🏽🦰|👩🏽🦱|👩🏽🦲|👩🏽🦳|👩🏽🦼|👩🏽🦽|👩🏾⚕️|👩🏾⚖️|👩🏾✈️|👩🏾🌾|👩🏾🍳|👩🏾🍼|👩🏾🎓|👩🏾🎤|👩🏾🎨|👩🏾🏫|👩🏾🏭|👩🏾💻|👩🏾💼|👩🏾🔧|👩🏾🔬|👩🏾🚀|👩🏾🚒|👩🏾🦯|👩🏾🦰|👩🏾🦱|👩🏾🦲|👩🏾🦳|👩🏾🦼|👩🏾🦽|👩🏿⚕️|👩🏿⚖️|👩🏿✈️|👩🏿🌾|👩🏿🍳|👩🏿🍼|👩🏿🎓|👩🏿🎤|👩🏿🎨|👩🏿🏫|👩🏿🏭|👩🏿💻|👩🏿💼|👩🏿🔧|👩🏿🔬|👩🏿🚀|👩🏿🚒|👩🏿🦯|👩🏿🦰|👩🏿🦱|👩🏿🦲|👩🏿🦳|👩🏿🦼|👩🏿🦽|👮🏻♀️|👮🏻♂️|👮🏼♀️|👮🏼♂️|👮🏽♀️|👮🏽♂️|👮🏾♀️|👮🏾♂️|👮🏿♀️|👮🏿♂️|👯🏻♀️|👯🏻♂️|👯🏼♀️|👯🏼♂️|👯🏽♀️|👯🏽♂️|👯🏾♀️|👯🏾♂️|👯🏿♀️|👯🏿♂️|👰🏻♀️|👰🏻♂️|👰🏼♀️|👰🏼♂️|👰🏽♀️|👰🏽♂️|👰🏾♀️|👰🏾♂️|👰🏿♀️|👰🏿♂️|👱🏻♀️|👱🏻♂️|👱🏼♀️|👱🏼♂️|👱🏽♀️|👱🏽♂️|👱🏾♀️|👱🏾♂️|👱🏿♀️|👱🏿♂️|👳🏻♀️|👳🏻♂️|👳🏼♀️|👳🏼♂️|👳🏽♀️|👳🏽♂️|👳🏾♀️|👳🏾♂️|👳🏿♀️|👳🏿♂️|👷🏻♀️|👷🏻♂️|👷🏼♀️|👷🏼♂️|👷🏽♀️|👷🏽♂️|👷🏾♀️|👷🏾♂️|👷🏿♀️|👷🏿♂️|💁🏻♀️|💁🏻♂️|💁🏼♀️|💁🏼♂️|💁🏽♀️|💁🏽♂️|💁🏾♀️|💁🏾♂️|💁🏿♀️|💁🏿♂️|💂🏻♀️|💂🏻♂️|💂🏼♀️|💂🏼♂️|💂🏽♀️|💂🏽♂️|💂🏾♀️|💂🏾♂️|💂🏿♀️|💂🏿♂️|💆🏻♀️|💆🏻♂️|💆🏼♀️|💆🏼♂️|💆🏽♀️|💆🏽♂️|💆🏾♀️|💆🏾♂️|💆🏿♀️|💆🏿♂️|💇🏻♀️|💇🏻♂️|💇🏼♀️|💇🏼♂️|💇🏽♀️|💇🏽♂️|💇🏾♀️|💇🏾♂️|💇🏿♀️|💇🏿♂️|🕵🏻♀️|🕵🏻♂️|🕵🏼♀️|🕵🏼♂️|🕵🏽♀️|🕵🏽♂️|🕵🏾♀️|🕵🏾♂️|🕵🏿♀️|🕵🏿♂️|🙅🏻♀️|🙅🏻♂️|🙅🏼♀️|🙅🏼♂️|🙅🏽♀️|🙅🏽♂️|🙅🏾♀️|🙅🏾♂️|🙅🏿♀️|🙅🏿♂️|🙆🏻♀️|🙆🏻♂️|🙆🏼♀️|🙆🏼♂️|🙆🏽♀️|🙆🏽♂️|🙆🏾♀️|🙆🏾♂️|🙆🏿♀️|🙆🏿♂️|🙇🏻♀️|🙇🏻♂️|🙇🏼♀️|🙇🏼♂️|🙇🏽♀️|🙇🏽♂️|🙇🏾♀️|🙇🏾♂️|🙇🏿♀️|🙇🏿♂️|🙋🏻♀️|🙋🏻♂️|🙋🏼♀️|🙋🏼♂️|🙋🏽♀️|🙋🏽♂️|🙋🏾♀️|🙋🏾♂️|🙋🏿♀️|🙋🏿♂️|🙍🏻♀️|🙍🏻♂️|🙍🏼♀️|🙍🏼♂️|🙍🏽♀️|🙍🏽♂️|🙍🏾♀️|🙍🏾♂️|🙍🏿♀️|🙍🏿♂️|🙎🏻♀️|🙎🏻♂️|🙎🏼♀️|🙎🏼♂️|🙎🏽♀️|🙎🏽♂️|🙎🏾♀️|🙎🏾♂️|🙎🏿♀️|🙎🏿♂️|🚣🏻♀️|🚣🏻♂️|🚣🏼♀️|🚣🏼♂️|🚣🏽♀️|🚣🏽♂️|🚣🏾♀️|🚣🏾♂️|🚣🏿♀️|🚣🏿♂️|🚴🏻♀️|🚴🏻♂️|🚴🏼♀️|🚴🏼♂️|🚴🏽♀️|🚴🏽♂️|🚴🏾♀️|🚴🏾♂️|🚴🏿♀️|🚴🏿♂️|🚵🏻♀️|🚵🏻♂️|🚵🏼♀️|🚵🏼♂️|🚵🏽♀️|🚵🏽♂️|🚵🏾♀️|🚵🏾♂️|🚵🏿♀️|🚵🏿♂️|🚶🏻♀️|🚶🏻♂️|🚶🏻➡️|🚶🏼♀️|🚶🏼♂️|🚶🏼➡️|🚶🏽♀️|🚶🏽♂️|🚶🏽➡️|🚶🏾♀️|🚶🏾♂️|🚶🏾➡️|🚶🏿♀️|🚶🏿♂️|🚶🏿➡️|🤦🏻♀️|🤦🏻♂️|🤦🏼♀️|🤦🏼♂️|🤦🏽♀️|🤦🏽♂️|🤦🏾♀️|🤦🏾♂️|🤦🏿♀️|🤦🏿♂️|🤵🏻♀️|🤵🏻♂️|🤵🏼♀️|🤵🏼♂️|🤵🏽♀️|🤵🏽♂️|🤵🏾♀️|🤵🏾♂️|🤵🏿♀️|🤵🏿♂️|🤷🏻♀️|🤷🏻♂️|🤷🏼♀️|🤷🏼♂️|🤷🏽♀️|🤷🏽♂️|🤷🏾♀️|🤷🏾♂️|🤷🏿♀️|🤷🏿♂️|🤸🏻♀️|🤸🏻♂️|🤸🏼♀️|🤸🏼♂️|🤸🏽♀️|🤸🏽♂️|🤸🏾♀️|🤸🏾♂️|🤸🏿♀️|🤸🏿♂️|🤹🏻♀️|🤹🏻♂️|🤹🏼♀️|🤹🏼♂️|🤹🏽♀️|🤹🏽♂️|🤹🏾♀️|🤹🏾♂️|🤹🏿♀️|🤹🏿♂️|🤼🏻♀️|🤼🏻♂️|🤼🏼♀️|🤼🏼♂️|🤼🏽♀️|🤼🏽♂️|🤼🏾♀️|🤼🏾♂️|🤼🏿♀️|🤼🏿♂️|🤽🏻♀️|🤽🏻♂️|🤽🏼♀️|🤽🏼♂️|🤽🏽♀️|🤽🏽♂️|🤽🏾♀️|🤽🏾♂️|🤽🏿♀️|🤽🏿♂️|🤾🏻♀️|🤾🏻♂️|🤾🏼♀️|🤾🏼♂️|🤾🏽♀️|🤾🏽♂️|🤾🏾♀️|🤾🏾♂️|🤾🏿♀️|🤾🏿♂️|🦸🏻♀️|🦸🏻♂️|🦸🏼♀️|🦸🏼♂️|🦸🏽♀️|🦸🏽♂️|🦸🏾♀️|🦸🏾♂️|🦸🏿♀️|🦸🏿♂️|🦹🏻♀️|🦹🏻♂️|🦹🏼♀️|🦹🏼♂️|🦹🏽♀️|🦹🏽♂️|🦹🏾♀️|🦹🏾♂️|🦹🏿♀️|🦹🏿♂️|🧍🏻♀️|🧍🏻♂️|🧍🏼♀️|🧍🏼♂️|🧍🏽♀️|🧍🏽♂️|🧍🏾♀️|🧍🏾♂️|🧍🏿♀️|🧍🏿♂️|🧎🏻♀️|🧎🏻♂️|🧎🏻➡️|🧎🏼♀️|🧎🏼♂️|🧎🏼➡️|🧎🏽♀️|🧎🏽♂️|🧎🏽➡️|🧎🏾♀️|🧎🏾♂️|🧎🏾➡️|🧎🏿♀️|🧎🏿♂️|🧎🏿➡️|🧏🏻♀️|🧏🏻♂️|🧏🏼♀️|🧏🏼♂️|🧏🏽♀️|🧏🏽♂️|🧏🏾♀️|🧏🏾♂️|🧏🏿♀️|🧏🏿♂️|🧑🏻⚕️|🧑🏻⚖️|🧑🏻✈️|🧑🏻🌾|🧑🏻🍳|🧑🏻🍼|🧑🏻🎄|🧑🏻🎓|🧑🏻🎤|🧑🏻🎨|🧑🏻🏫|🧑🏻🏭|🧑🏻💻|🧑🏻💼|🧑🏻🔧|🧑🏻🔬|🧑🏻🚀|🧑🏻🚒|🧑🏻🦯|🧑🏻🦰|🧑🏻🦱|🧑🏻🦲|🧑🏻🦳|🧑🏻🦼|🧑🏻🦽|🧑🏻🩰|🧑🏼⚕️|🧑🏼⚖️|🧑🏼✈️|🧑🏼🌾|🧑🏼🍳|🧑🏼🍼|🧑🏼🎄|🧑🏼🎓|🧑🏼🎤|🧑🏼🎨|🧑🏼🏫|🧑🏼🏭|🧑🏼💻|🧑🏼💼|🧑🏼🔧|🧑🏼🔬|🧑🏼🚀|🧑🏼🚒|🧑🏼🦯|🧑🏼🦰|🧑🏼🦱|🧑🏼🦲|🧑🏼🦳|🧑🏼🦼|🧑🏼🦽|🧑🏼🩰|🧑🏽⚕️|🧑🏽⚖️|🧑🏽✈️|🧑🏽🌾|🧑🏽🍳|🧑🏽🍼|🧑🏽🎄|🧑🏽🎓|🧑🏽🎤|🧑🏽🎨|🧑🏽🏫|🧑🏽🏭|🧑🏽💻|🧑🏽💼|🧑🏽🔧|🧑🏽🔬|🧑🏽🚀|🧑🏽🚒|🧑🏽🦯|🧑🏽🦰|🧑🏽🦱|🧑🏽🦲|🧑🏽🦳|🧑🏽🦼|🧑🏽🦽|🧑🏽🩰|🧑🏾⚕️|🧑🏾⚖️|🧑🏾✈️|🧑🏾🌾|🧑🏾🍳|🧑🏾🍼|🧑🏾🎄|🧑🏾🎓|🧑🏾🎤|🧑🏾🎨|🧑🏾🏫|🧑🏾🏭|🧑🏾💻|🧑🏾💼|🧑🏾🔧|🧑🏾🔬|🧑🏾🚀|🧑🏾🚒|🧑🏾🦯|🧑🏾🦰|🧑🏾🦱|🧑🏾🦲|🧑🏾🦳|🧑🏾🦼|🧑🏾🦽|🧑🏾🩰|🧑🏿⚕️|🧑🏿⚖️|🧑🏿✈️|🧑🏿🌾|🧑🏿🍳|🧑🏿🍼|🧑🏿🎄|🧑🏿🎓|🧑🏿🎤|🧑🏿🎨|🧑🏿🏫|🧑🏿🏭|🧑🏿💻|🧑🏿💼|🧑🏿🔧|🧑🏿🔬|🧑🏿🚀|🧑🏿🚒|🧑🏿🦯|🧑🏿🦰|🧑🏿🦱|🧑🏿🦲|🧑🏿🦳|🧑🏿🦼|🧑🏿🦽|🧑🏿🩰|🧔🏻♀️|🧔🏻♂️|🧔🏼♀️|🧔🏼♂️|🧔🏽♀️|🧔🏽♂️|🧔🏾♀️|🧔🏾♂️|🧔🏿♀️|🧔🏿♂️|🧖🏻♀️|🧖🏻♂️|🧖🏼♀️|🧖🏼♂️|🧖🏽♀️|🧖🏽♂️|🧖🏾♀️|🧖🏾♂️|🧖🏿♀️|🧖🏿♂️|🧗🏻♀️|🧗🏻♂️|🧗🏼♀️|🧗🏼♂️|🧗🏽♀️|🧗🏽♂️|🧗🏾♀️|🧗🏾♂️|🧗🏿♀️|🧗🏿♂️|🧘🏻♀️|🧘🏻♂️|🧘🏼♀️|🧘🏼♂️|🧘🏽♀️|🧘🏽♂️|🧘🏾♀️|🧘🏾♂️|🧘🏿♀️|🧘🏿♂️|🧙🏻♀️|🧙🏻♂️|🧙🏼♀️|🧙🏼♂️|🧙🏽♀️|🧙🏽♂️|🧙🏾♀️|🧙🏾♂️|🧙🏿♀️|🧙🏿♂️|🧚🏻♀️|🧚🏻♂️|🧚🏼♀️|🧚🏼♂️|🧚🏽♀️|🧚🏽♂️|🧚🏾♀️|🧚🏾♂️|🧚🏿♀️|🧚🏿♂️|🧛🏻♀️|🧛🏻♂️|🧛🏼♀️|🧛🏼♂️|🧛🏽♀️|🧛🏽♂️|🧛🏾♀️|🧛🏾♂️|🧛🏿♀️|🧛🏿♂️|🧜🏻♀️|🧜🏻♂️|🧜🏼♀️|🧜🏼♂️|🧜🏽♀️|🧜🏽♂️|🧜🏾♀️|🧜🏾♂️|🧜🏿♀️|🧜🏿♂️|🧝🏻♀️|🧝🏻♂️|🧝🏼♀️|🧝🏼♂️|🧝🏽♀️|🧝🏽♂️|🧝🏾♀️|🧝🏾♂️|🧝🏿♀️|🧝🏿♂️|⛹🏻♀️|⛹🏻♂️|⛹🏼♀️|⛹🏼♂️|⛹🏽♀️|⛹🏽♂️|⛹🏾♀️|⛹🏾♂️|⛹🏿♀️|⛹🏿♂️|🏋️♀️|🏋️♂️|🏌️♀️|🏌️♂️|🏳️⚧️|🏳️🌈|🕵️♀️|🕵️♂️|😶🌫️|⛓️💥|⛹️♀️|⛹️♂️|❤️🔥|❤️🩹|🍄🟫|🍋🟩|🏃♀️|🏃♂️|🏃➡️|🏄♀️|🏄♂️|🏊♀️|🏊♂️|🏴☠️|🐕🦺|🐦🔥|🐻❄️|👨⚕️|👨⚖️|👨✈️|👨🌾|👨🍳|👨🍼|👨🎓|👨🎤|👨🎨|👨🏫|👨🏭|👨👦|👨👧|👨💻|👨💼|👨🔧|👨🔬|👨🚀|👨🚒|👨🦯|👨🦰|👨🦱|👨🦲|👨🦳|👨🦼|👨🦽|👩⚕️|👩⚖️|👩✈️|👩🌾|👩🍳|👩🍼|👩🎓|👩🎤|👩🎨|👩🏫|👩🏭|👩👦|👩👧|👩💻|👩💼|👩🔧|👩🔬|👩🚀|👩🚒|👩🦯|👩🦰|👩🦱|👩🦲|👩🦳|👩🦼|👩🦽|👮♀️|👮♂️|👯♀️|👯♂️|👰♀️|👰♂️|👱♀️|👱♂️|👳♀️|👳♂️|👷♀️|👷♂️|💁♀️|💁♂️|💂♀️|💂♂️|💆♀️|💆♂️|💇♀️|💇♂️|😮💨|😵💫|🙂↔️|🙂↕️|🙅♀️|🙅♂️|🙆♀️|🙆♂️|🙇♀️|🙇♂️|🙋♀️|🙋♂️|🙍♀️|🙍♂️|🙎♀️|🙎♂️|🚣♀️|🚣♂️|🚴♀️|🚴♂️|🚵♀️|🚵♂️|🚶♀️|🚶♂️|🚶➡️|🤦♀️|🤦♂️|🤵♀️|🤵♂️|🤷♀️|🤷♂️|🤸♀️|🤸♂️|🤹♀️|🤹♂️|🤼♀️|🤼♂️|🤽♀️|🤽♂️|🤾♀️|🤾♂️|🦸♀️|🦸♂️|🦹♀️|🦹♂️|🧍♀️|🧍♂️|🧎♀️|🧎♂️|🧎➡️|🧏♀️|🧏♂️|🧑⚕️|🧑⚖️|🧑✈️|🧑🌾|🧑🍳|🧑🍼|🧑🎄|🧑🎓|🧑🎤|🧑🎨|🧑🏫|🧑🏭|🧑💻|🧑💼|🧑🔧|🧑🔬|🧑🚀|🧑🚒|🧑🦯|🧑🦰|🧑🦱|🧑🦲|🧑🦳|🧑🦼|🧑🦽|🧑🧒|🧑🩰|🧔♀️|🧔♂️|🧖♀️|🧖♂️|🧗♀️|🧗♂️|🧘♀️|🧘♂️|🧙♀️|🧙♂️|🧚♀️|🧚♂️|🧛♀️|🧛♂️|🧜♀️|🧜♂️|🧝♀️|🧝♂️|🧞♀️|🧞♂️|🧟♀️|🧟♂️|\*️⃣|🇦🇨|🇦🇩|🇦🇪|🇦🇫|🇦🇬|🇦🇮|🇦🇱|🇦🇲|🇦🇴|🇦🇶|🇦🇷|🇦🇸|🇦🇹|🇦🇺|🇦🇼|🇦🇽|🇦🇿|🇧🇦|🇧🇧|🇧🇩|🇧🇪|🇧🇫|🇧🇬|🇧🇭|🇧🇮|🇧🇯|🇧🇱|🇧🇲|🇧🇳|🇧🇴|🇧🇶|🇧🇷|🇧🇸|🇧🇹|🇧🇻|🇧🇼|🇧🇾|🇧🇿|🇨🇦|🇨🇨|🇨🇩|🇨🇫|🇨🇬|🇨🇭|🇨🇮|🇨🇰|🇨🇱|🇨🇲|🇨🇳|🇨🇴|🇨🇵|🇨🇶|🇨🇷|🇨🇺|🇨🇻|🇨🇼|🇨🇽|🇨🇾|🇨🇿|🇩🇪|🇩🇬|🇩🇯|🇩🇰|🇩🇲|🇩🇴|🇩🇿|🇪🇦|🇪🇨|🇪🇪|🇪🇬|🇪🇭|🇪🇷|🇪🇸|🇪🇹|🇪🇺|🇫🇮|🇫🇯|🇫🇰|🇫🇲|🇫🇴|🇫🇷|🇬🇦|🇬🇧|🇬🇩|🇬🇪|🇬🇫|🇬🇬|🇬🇭|🇬🇮|🇬🇱|🇬🇲|🇬🇳|🇬🇵|🇬🇶|🇬🇷|🇬🇸|🇬🇹|🇬🇺|🇬🇼|🇬🇾|🇭🇰|🇭🇲|🇭🇳|🇭🇷|🇭🇹|🇭🇺|🇮🇨|🇮🇩|🇮🇪|🇮🇱|🇮🇲|🇮🇳|🇮🇴|🇮🇶|🇮🇷|🇮🇸|🇮🇹|🇯🇪|🇯🇲|🇯🇴|🇯🇵|🇰🇪|🇰🇬|🇰🇭|🇰🇮|🇰🇲|🇰🇳|🇰🇵|🇰🇷|🇰🇼|🇰🇾|🇰🇿|🇱🇦|🇱🇧|🇱🇨|🇱🇮|🇱🇰|🇱🇷|🇱🇸|🇱🇹|🇱🇺|🇱🇻|🇱🇾|🇲🇦|🇲🇨|🇲🇩|🇲🇪|🇲🇫|🇲🇬|🇲🇭|🇲🇰|🇲🇱|🇲🇲|🇲🇳|🇲🇴|🇲🇵|🇲🇶|🇲🇷|🇲🇸|🇲🇹|🇲🇺|🇲🇻|🇲🇼|🇲🇽|🇲🇾|🇲🇿|🇳🇦|🇳🇨|🇳🇪|🇳🇫|🇳🇬|🇳🇮|🇳🇱|🇳🇴|🇳🇵|🇳🇷|🇳🇺|🇳🇿|🇴🇲|🇵🇦|🇵🇪|🇵🇫|🇵🇬|🇵🇭|🇵🇰|🇵🇱|🇵🇲|🇵🇳|🇵🇷|🇵🇸|🇵🇹|🇵🇼|🇵🇾|🇶🇦|🇷🇪|🇷🇴|🇷🇸|🇷🇺|🇷🇼|🇸🇦|🇸🇧|🇸🇨|🇸🇩|🇸🇪|🇸🇬|🇸🇭|🇸🇮|🇸🇯|🇸🇰|🇸🇱|🇸🇲|🇸🇳|🇸🇴|🇸🇷|🇸🇸|🇸🇹|🇸🇻|🇸🇽|🇸🇾|🇸🇿|🇹🇦|🇹🇨|🇹🇩|🇹🇫|🇹🇬|🇹🇭|🇹🇯|🇹🇰|🇹🇱|🇹🇲|🇹🇳|🇹🇴|🇹🇷|🇹🇹|🇹🇻|🇹🇼|🇹🇿|🇺🇦|🇺🇬|🇺🇲|🇺🇳|🇺🇸|🇺🇾|🇺🇿|🇻🇦|🇻🇨|🇻🇪|🇻🇬|🇻🇮|🇻🇳|🇻🇺|🇼🇫|🇼🇸|🇽🇰|🇾🇪|🇾🇹|🇿🇦|🇿🇲|🇿🇼|🎅🏻|🎅🏼|🎅🏽|🎅🏾|🎅🏿|🏂🏻|🏂🏼|🏂🏽|🏂🏾|🏂🏿|🏃🏻|🏃🏼|🏃🏽|🏃🏾|🏃🏿|🏄🏻|🏄🏼|🏄🏽|🏄🏾|🏄🏿|🏇🏻|🏇🏼|🏇🏽|🏇🏾|🏇🏿|🏊🏻|🏊🏼|🏊🏽|🏊🏾|🏊🏿|🏋🏻|🏋🏼|🏋🏽|🏋🏾|🏋🏿|🏌🏻|🏌🏼|🏌🏽|🏌🏾|🏌🏿|🐈⬛|🐦⬛|👂🏻|👂🏼|👂🏽|👂🏾|👂🏿|👃🏻|👃🏼|👃🏽|👃🏾|👃🏿|👆🏻|👆🏼|👆🏽|👆🏾|👆🏿|👇🏻|👇🏼|👇🏽|👇🏾|👇🏿|👈🏻|👈🏼|👈🏽|👈🏾|👈🏿|👉🏻|👉🏼|👉🏽|👉🏾|👉🏿|👊🏻|👊🏼|👊🏽|👊🏾|👊🏿|👋🏻|👋🏼|👋🏽|👋🏾|👋🏿|👌🏻|👌🏼|👌🏽|👌🏾|👌🏿|👍🏻|👍🏼|👍🏽|👍🏾|👍🏿|👎🏻|👎🏼|👎🏽|👎🏾|👎🏿|👏🏻|👏🏼|👏🏽|👏🏾|👏🏿|👐🏻|👐🏼|👐🏽|👐🏾|👐🏿|👦🏻|👦🏼|👦🏽|👦🏾|👦🏿|👧🏻|👧🏼|👧🏽|👧🏾|👧🏿|👨🏻|👨🏼|👨🏽|👨🏾|👨🏿|👩🏻|👩🏼|👩🏽|👩🏾|👩🏿|👫🏻|👫🏼|👫🏽|👫🏾|👫🏿|👬🏻|👬🏼|👬🏽|👬🏾|👬🏿|👭🏻|👭🏼|👭🏽|👭🏾|👭🏿|👮🏻|👮🏼|👮🏽|👮🏾|👮🏿|👯🏻|👯🏼|👯🏽|👯🏾|👯🏿|👰🏻|👰🏼|👰🏽|👰🏾|👰🏿|👱🏻|👱🏼|👱🏽|👱🏾|👱🏿|👲🏻|👲🏼|👲🏽|👲🏾|👲🏿|👳🏻|👳🏼|👳🏽|👳🏾|👳🏿|👴🏻|👴🏼|👴🏽|👴🏾|👴🏿|👵🏻|👵🏼|👵🏽|👵🏾|👵🏿|👶🏻|👶🏼|👶🏽|👶🏾|👶🏿|👷🏻|👷🏼|👷🏽|👷🏾|👷🏿|👸🏻|👸🏼|👸🏽|👸🏾|👸🏿|👼🏻|👼🏼|👼🏽|👼🏾|👼🏿|💁🏻|💁🏼|💁🏽|💁🏾|💁🏿|💂🏻|💂🏼|💂🏽|💂🏾|💂🏿|💃🏻|💃🏼|💃🏽|💃🏾|💃🏿|💅🏻|💅🏼|💅🏽|💅🏾|💅🏿|💆🏻|💆🏼|💆🏽|💆🏾|💆🏿|💇🏻|💇🏼|💇🏽|💇🏾|💇🏿|💏🏻|💏🏼|💏🏽|💏🏾|💏🏿|💑🏻|💑🏼|💑🏽|💑🏾|💑🏿|💪🏻|💪🏼|💪🏽|💪🏾|💪🏿|🕴🏻|🕴🏼|🕴🏽|🕴🏾|🕴🏿|🕵🏻|🕵🏼|🕵🏽|🕵🏾|🕵🏿|🕺🏻|🕺🏼|🕺🏽|🕺🏾|🕺🏿|🖐🏻|🖐🏼|🖐🏽|🖐🏾|🖐🏿|🖕🏻|🖕🏼|🖕🏽|🖕🏾|🖕🏿|🖖🏻|🖖🏼|🖖🏽|🖖🏾|🖖🏿|🙅🏻|🙅🏼|🙅🏽|🙅🏾|🙅🏿|🙆🏻|🙆🏼|🙆🏽|🙆🏾|🙆🏿|🙇🏻|🙇🏼|🙇🏽|🙇🏾|🙇🏿|🙋🏻|🙋🏼|🙋🏽|🙋🏾|🙋🏿|🙌🏻|🙌🏼|🙌🏽|🙌🏾|🙌🏿|🙍🏻|🙍🏼|🙍🏽|🙍🏾|🙍🏿|🙎🏻|🙎🏼|🙎🏽|🙎🏾|🙎🏿|🙏🏻|🙏🏼|🙏🏽|🙏🏾|🙏🏿|🚣🏻|🚣🏼|🚣🏽|🚣🏾|🚣🏿|🚴🏻|🚴🏼|🚴🏽|🚴🏾|🚴🏿|🚵🏻|🚵🏼|🚵🏽|🚵🏾|🚵🏿|🚶🏻|🚶🏼|🚶🏽|🚶🏾|🚶🏿|🛀🏻|🛀🏼|🛀🏽|🛀🏾|🛀🏿|🛌🏻|🛌🏼|🛌🏽|🛌🏾|🛌🏿|🤌🏻|🤌🏼|🤌🏽|🤌🏾|🤌🏿|🤏🏻|🤏🏼|🤏🏽|🤏🏾|🤏🏿|🤘🏻|🤘🏼|🤘🏽|🤘🏾|🤘🏿|🤙🏻|🤙🏼|🤙🏽|🤙🏾|🤙🏿|🤚🏻|🤚🏼|🤚🏽|🤚🏾|🤚🏿|🤛🏻|🤛🏼|🤛🏽|🤛🏾|🤛🏿|🤜🏻|🤜🏼|🤜🏽|🤜🏾|🤜🏿|🤝🏻|🤝🏼|🤝🏽|🤝🏾|🤝🏿|🤞🏻|🤞🏼|🤞🏽|🤞🏾|🤞🏿|🤟🏻|🤟🏼|🤟🏽|🤟🏾|🤟🏿|🤦🏻|🤦🏼|🤦🏽|🤦🏾|🤦🏿|🤰🏻|🤰🏼|🤰🏽|🤰🏾|🤰🏿|🤱🏻|🤱🏼|🤱🏽|🤱🏾|🤱🏿|🤲🏻|🤲🏼|🤲🏽|🤲🏾|🤲🏿|🤳🏻|🤳🏼|🤳🏽|🤳🏾|🤳🏿|🤴🏻|🤴🏼|🤴🏽|🤴🏾|🤴🏿|🤵🏻|🤵🏼|🤵🏽|🤵🏾|🤵🏿|🤶🏻|🤶🏼|🤶🏽|🤶🏾|🤶🏿|🤷🏻|🤷🏼|🤷🏽|🤷🏾|🤷🏿|🤸🏻|🤸🏼|🤸🏽|🤸🏾|🤸🏿|🤹🏻|🤹🏼|🤹🏽|🤹🏾|🤹🏿|🤼🏻|🤼🏼|🤼🏽|🤼🏾|🤼🏿|🤽🏻|🤽🏼|🤽🏽|🤽🏾|🤽🏿|🤾🏻|🤾🏼|🤾🏽|🤾🏾|🤾🏿|🥷🏻|🥷🏼|🥷🏽|🥷🏾|🥷🏿|🦵🏻|🦵🏼|🦵🏽|🦵🏾|🦵🏿|🦶🏻|🦶🏼|🦶🏽|🦶🏾|🦶🏿|🦸🏻|🦸🏼|🦸🏽|🦸🏾|🦸🏿|🦹🏻|🦹🏼|🦹🏽|🦹🏾|🦹🏿|🦻🏻|🦻🏼|🦻🏽|🦻🏾|🦻🏿|🧍🏻|🧍🏼|🧍🏽|🧍🏾|🧍🏿|🧎🏻|🧎🏼|🧎🏽|🧎🏾|🧎🏿|🧏🏻|🧏🏼|🧏🏽|🧏🏾|🧏🏿|🧑🏻|🧑🏼|🧑🏽|🧑🏾|🧑🏿|🧒🏻|🧒🏼|🧒🏽|🧒🏾|🧒🏿|🧓🏻|🧓🏼|🧓🏽|🧓🏾|🧓🏿|🧔🏻|🧔🏼|🧔🏽|🧔🏾|🧔🏿|🧕🏻|🧕🏼|🧕🏽|🧕🏾|🧕🏿|🧖🏻|🧖🏼|🧖🏽|🧖🏾|🧖🏿|🧗🏻|🧗🏼|🧗🏽|🧗🏾|🧗🏿|🧘🏻|🧘🏼|🧘🏽|🧘🏾|🧘🏿|🧙🏻|🧙🏼|🧙🏽|🧙🏾|🧙🏿|🧚🏻|🧚🏼|🧚🏽|🧚🏾|🧚🏿|🧛🏻|🧛🏼|🧛🏽|🧛🏾|🧛🏿|🧜🏻|🧜🏼|🧜🏽|🧜🏾|🧜🏿|🧝🏻|🧝🏼|🧝🏽|🧝🏾|🧝🏿|🫃🏻|🫃🏼|🫃🏽|🫃🏾|🫃🏿|🫄🏻|🫄🏼|🫄🏽|🫄🏾|🫄🏿|🫅🏻|🫅🏼|🫅🏽|🫅🏾|🫅🏿|🫰🏻|🫰🏼|🫰🏽|🫰🏾|🫰🏿|🫱🏻|🫱🏼|🫱🏽|🫱🏾|🫱🏿|🫲🏻|🫲🏼|🫲🏽|🫲🏾|🫲🏿|🫳🏻|🫳🏼|🫳🏽|🫳🏾|🫳🏿|🫴🏻|🫴🏼|🫴🏽|🫴🏾|🫴🏿|🫵🏻|🫵🏼|🫵🏽|🫵🏾|🫵🏿|🫶🏻|🫶🏼|🫶🏽|🫶🏾|🫶🏿|🫷🏻|🫷🏼|🫷🏽|🫷🏾|🫷🏿|🫸🏻|🫸🏼|🫸🏽|🫸🏾|🫸🏿|#️⃣|0️⃣|1️⃣|2️⃣|3️⃣|4️⃣|5️⃣|6️⃣|7️⃣|8️⃣|9️⃣|☝🏻|☝🏼|☝🏽|☝🏾|☝🏿|⛹🏻|⛹🏼|⛹🏽|⛹🏾|⛹🏿|✊🏻|✊🏼|✊🏽|✊🏾|✊🏿|✋🏻|✋🏼|✋🏽|✋🏾|✋🏿|✌🏻|✌🏼|✌🏽|✌🏾|✌🏿|✍🏻|✍🏼|✍🏽|✍🏾|✍🏿|🅰️|🅱️|🅾️|🅿️|🈂️|🈷️|🌡️|🌤️|🌥️|🌦️|🌧️|🌨️|🌩️|🌪️|🌫️|🌬️|🌶️|🍽️|🎖️|🎗️|🎙️|🎚️|🎛️|🎞️|🎟️|🏋️|🏌️|🏍️|🏎️|🏔️|🏕️|🏖️|🏗️|🏘️|🏙️|🏚️|🏛️|🏜️|🏝️|🏞️|🏟️|🏳️|🏵️|🏷️|🐿️|👁️|📽️|🕉️|🕊️|🕯️|🕰️|🕳️|🕴️|🕵️|🕶️|🕷️|🕸️|🕹️|🖇️|🖊️|🖋️|🖌️|🖍️|🖐️|🖥️|🖨️|🖱️|🖲️|🖼️|🗂️|🗃️|🗄️|🗑️|🗒️|🗓️|🗜️|🗝️|🗞️|🗡️|🗣️|🗨️|🗯️|🗳️|🗺️|🛋️|🛍️|🛎️|🛏️|🛠️|🛡️|🛢️|🛣️|🛤️|🛥️|🛩️|🛰️|🛳️|©️|®️|‼️|⁉️|™️|ℹ️|↔️|↕️|↖️|↗️|↘️|↙️|↩️|↪️|⌨️|⏏️|⏭️|⏮️|⏯️|⏱️|⏲️|⏸️|⏹️|⏺️|Ⓜ️|▪️|▫️|▶️|◀️|◻️|◼️|☀️|☁️|☂️|☃️|☄️|☎️|☑️|☘️|☝️|☠️|☢️|☣️|☦️|☪️|☮️|☯️|☸️|☹️|☺️|♀️|♂️|♟️|♠️|♣️|♥️|♦️|♨️|♻️|♾️|⚒️|⚔️|⚕️|⚖️|⚗️|⚙️|⚛️|⚜️|⚠️|⚧️|⚰️|⚱️|⛈️|⛏️|⛑️|⛓️|⛩️|⛰️|⛱️|⛴️|⛷️|⛸️|⛹️|✂️|✈️|✉️|✌️|✍️|✏️|✒️|✔️|✖️|✝️|✡️|✳️|✴️|❄️|❇️|❣️|❤️|➡️|⤴️|⤵️|⬅️|⬆️|⬇️|〰️|〽️|㊗️|㊙️|[\u231A\u231B\u23E9-\u23EC\u23F0\u23F3\u25FD\u25FE\u2614\u2615\u2648-\u2653\u267F\u2693\u26A1\u26AA\u26AB\u26BD\u26BE\u26C4\u26C5\u26CE\u26D4\u26EA\u26F2\u26F3\u26F5\u26FA\u26FD\u2705\u270A\u270B\u2728\u274C\u274E\u2753-\u2755\u2757\u2795-\u2797\u27B0\u27BF\u2B1B\u2B1C\u2B50\u2B55\u{1F004}\u{1F0CF}\u{1F18E}\u{1F191}-\u{1F19A}\u{1F201}\u{1F21A}\u{1F22F}\u{1F232}-\u{1F236}\u{1F238}-\u{1F23A}\u{1F250}\u{1F251}\u{1F300}-\u{1F320}\u{1F32D}-\u{1F335}\u{1F337}-\u{1F37C}\u{1F37E}-\u{1F393}\u{1F3A0}-\u{1F3CA}\u{1F3CF}-\u{1F3D3}\u{1F3E0}-\u{1F3F0}\u{1F3F4}\u{1F3F8}-\u{1F43E}\u{1F440}\u{1F442}-\u{1F4FC}\u{1F4FF}-\u{1F53D}\u{1F54B}-\u{1F54E}\u{1F550}-\u{1F567}\u{1F57A}\u{1F595}\u{1F596}\u{1F5A4}\u{1F5FB}-\u{1F64F}\u{1F680}-\u{1F6C5}\u{1F6CC}\u{1F6D0}-\u{1F6D2}\u{1F6D5}-\u{1F6D8}\u{1F6DC}-\u{1F6DF}\u{1F6EB}\u{1F6EC}\u{1F6F4}-\u{1F6FC}\u{1F7E0}-\u{1F7EB}\u{1F7F0}\u{1F90C}-\u{1F93A}\u{1F93C}-\u{1F945}\u{1F947}-\u{1F9FF}\u{1FA70}-\u{1FA7C}\u{1FA80}-\u{1FA8A}\u{1FA8E}-\u{1FAC6}\u{1FAC8}\u{1FACD}-\u{1FADC}\u{1FADF}-\u{1FAEA}\u{1FAEF}-\u{1FAF8}])/gu).length):l=(0,h.jsxs)(h.Fragment,{children:[(0,h.jsx)("i",{className:"material-icons gray",children:"warning_amber"})," ",(0,h.jsx)("i",{className:"gray",children:(0,h.jsx)(n.FormattedMessage,{id:"invalid_content",defaultMessage:"invalid content",description:"Shown when the message is unreadable"})})]});return(0,h.jsxs)("li",{ref:this.props.innerRef,className:e,children:[this.props.isGroup&&this.props.response?(0,h.jsx)("div",{className:"avatar-box",children:r?(0,h.jsx)(p.A,{authorizeURL:this.props.tinode.authorizeURL,topic:this.props.userFrom,title:this.props.userName,avatar:s}):null}):null,(0,h.jsxs)("div",{children:[(0,h.jsxs)("div",{className:t,children:[(0,h.jsxs)("div",{className:"content-meta",children:[(0,h.jsxs)("div",{className:i,children:[l,d]}),this.props.timestamp?(0,h.jsx)(m,{edited:this.props.edited,timestamp:this.props.timestamp,received:this.props.received}):null]}),this.props.showContextMenu?(0,h.jsx)("span",{className:"menuTrigger",children:(0,h.jsx)("a",{href:"#",onClick:this.handleContextClick,children:(0,h.jsx)("i",{className:"material-icons",children:"expand_more"})})}):null]}),r?(0,h.jsx)("div",{className:"author",children:this.props.userName||(0,h.jsx)("i",{children:(0,h.jsx)(n.FormattedMessage,{id:"user_not_found",defaultMessage:"Not found",description:"In place of a user's full name when the user is not found."})})}):null]})]})}}const M=(0,n.injectIntl)(b);var S=a().forwardRef((e,t)=>(0,h.jsx)(M,{innerRef:t,...e})),y=s(6565),x=s(3405),w=s(3272),C=s(7981);class _ extends a().Component{constructor(e){super(e)}render(){const e=[],t=(this.props.subscribers||[]).length,s=Math.min(4,t);return(this.props.subscribers||[]).some(t=>(e.push((0,h.jsx)("div",{className:"avatar-box",children:(0,h.jsx)(p.A,{authorizeURL:this.props.tinode.authorizeURL,topic:t.user,avatar:(0,C.to)(t.public?t.public.photo:null)||!0,title:t.public?t.public.fn:null})},t.user)),e.length==s)),0==e.length?null:(0,h.jsxs)("div",{id:"topic-users",children:[e," ",t>s?(0,h.jsx)("span",{children:(0,h.jsx)(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]})}}class A extends a().PureComponent{constructor(e){super(e),this.handleButtonAction=this.handleButtonAction.bind(this)}handleButtonAction(e,t){e.preventDefault(),this.props.onAction(t)}render(){return(0,h.jsxs)("div",{className:"accept-invite-panel",children:[(0,h.jsx)("div",{className:"title",children:(0,h.jsx)(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]."})}),(0,h.jsxs)("div",{className:"footer",children:[(0,h.jsx)("button",{className:"primary",onClick:e=>{this.handleButtonAction(e,"accept")},children:(0,h.jsx)(n.FormattedMessage,{id:"chat_invitation_accept",defaultMessage:"Accept",description:"Action [Accept] for chat invitation."})}),(0,h.jsx)("button",{className:"secondary",onClick:e=>{this.handleButtonAction(e,"delete")},children:(0,h.jsx)(n.FormattedMessage,{id:"chat_invitation_ignore",defaultMessage:"Ignore",description:"Action [Ignore] for chat invitation."})}),(0,h.jsx)("button",{className:"secondary",onClick:e=>{this.handleButtonAction(e,"block")},children:(0,h.jsx)(n.FormattedMessage,{id:"chat_invitation_block",defaultMessage:"Block",description:"Action [Block] for chat invitation."})})]})]})}}var F=s(9304);class P extends a().PureComponent{render(){const e=w.C3+" ("+o.Tinode.getLibrary()+")";return(0,h.jsx)("div",{id:"dummy-view",children:(0,h.jsxs)("div",{children:[(0,h.jsxs)("a",{href:"https://github.com/tinode/chat/",children:[(0,h.jsx)("img",{id:"logo",alt:"logo",src:"img/logo.svg"}),(0,h.jsx)("h2",{children:"Tinode Web"})]}),(0,h.jsxs)("p",{children:[(0,h.jsx)(n.FormattedMessage,{id:"label_client",defaultMessage:"Client:",description:"Label for a client version"})," ",e]}),(0,h.jsxs)("p",{children:[(0,h.jsx)(n.FormattedMessage,{id:"label_server",defaultMessage:"Server:",description:"Label for a server version"})," ",this.props.serverVersion," (",this.props.serverAddress,")"]})]})})}}class D extends a().PureComponent{constructor(e){super(e)}render(){let e=null,t="bubble";return this.props.date&&(e=(0,h.jsx)(h.Fragment,{children:this.props.date}),t+=" date"),e?(0,h.jsx)("li",{className:"meta",children:(0,h.jsx)("div",{className:t,children:(0,h.jsx)("div",{className:"message-content",children:e})})}):(0,h.jsx)(h.Fragment,{children:null})}}const j=(0,n.defineMessages)({message_not_found:{id:"message_not_found",defaultMessage:"message not found",description:"Pinned message is not found"},message_deleted:{id:"message_deleted",defaultMessage:"message deleted",description:"Pinned message is deleted"}});class E extends a().PureComponent{constructor(e){super(e),this.touchX=null,this.touchY=null,this.touchSurface=a().createRef(),this.getSelectedIndex=this.getSelectedIndex.bind(this),this.handleCancel=this.handleCancel.bind(this),this.handleSelected=this.handleSelected.bind(this),this.handleMoveNext=this.handleMoveNext.bind(this),this.handleMovePrev=this.handleMovePrev.bind(this),this.handleTouchEventStart=this.handleTouchEventStart.bind(this),this.handleTouchEventEnd=this.handleTouchEventEnd.bind(this),this.handleTouchCancel=this.handleTouchCancel.bind(this)}componentDidMount(){this.touchSurface.current.addEventListener("touchstart",this.handleTouchEventStart,{passive:!0}),this.touchSurface.current.addEventListener("touchend",this.handleTouchEventEnd,{passive:!0}),this.touchSurface.current.addEventListener("touchcancel",this.handleTouchCancel,{passive:!0})}componentWillUnmount(){this.touchSurface.current.removeEventListener("touchstart",this.handleTouchEventStart),this.touchSurface.current.removeEventListener("touchend",this.handleTouchEventEnd),this.touchSurface.current.removeEventListener("touchcancel",this.handleTouchCancel)}getSelectedIndex(){return(this.props.pins||[]).length-this.props.selected-1}handleCancel(e){e.preventDefault(),this.props.onCancel(this.props.pins[this.getSelectedIndex()])}handleSelected(e){e.preventDefault(),this.props.onSelected(this.props.pins[this.getSelectedIndex()])}handleMoveNext(e,t){t||e.preventDefault(),e.stopPropagation();const s=Math.max(this.props.selected-1,0);s!=this.props.selected&&this.props.setSelected(s)}handleMovePrev(e,t){t||e.preventDefault(),e.stopPropagation();const s=Math.min(this.props.selected+1,(this.props.pins||[]).length-1);s!=this.props.selected&&this.props.setSelected(s)}handleTouchEventStart(e){1==e.touches.length&&(this.touchX=e.touches[0].clientX,this.touchY=e.touches[0].clientY)}handleTouchEventEnd(e){if(null===this.touchX||1!=e.changedTouches.length)return void(this.touchX=null);const t=this.touchX-e.changedTouches[0].clientX,s=this.touchY-e.changedTouches[0].clientY;this.touchX=null,Math.abs(t)>Math.abs(s)||Math.abs(s)<39||(s>0?this.handleMovePrev(e,!0):this.handleMoveNext(e,!0))}handleTouchCancel(){this.touchX=null}render(){const e=this.getSelectedIndex();let t=(this.props.messages||[])[e];t=t?t._deleted?(0,h.jsx)("i",{className:"gray",children:this.props.intl.formatMessage(j.message_deleted)}):o.Drafty.format(t.content,f.TU,{formatMessage:this.props.intl.formatMessage.bind(this.props.intl),authorizeURL:this.props.tinode.authorizeURL.bind(this.props.tinode)}):(0,h.jsx)("i",{className:"gray",children:this.props.intl.formatMessage(j.message_not_found)});const s=[];return this.props.pins.forEach(t=>{const i=s.length==e?"adot":"dot";s.push((0,h.jsx)("div",{className:i},t))}),(0,h.jsxs)("div",{id:"pinned-wrapper",ref:this.touchSurface,children:[this.props.isAdmin?(0,h.jsx)("div",{className:"cancel",children:(0,h.jsx)("a",{href:"#",onClick:this.handleCancel,children:(0,h.jsx)("i",{className:"material-icons gray",children:"close"})})}):(0,h.jsx)("div",{children:(0,h.jsx)("i",{className:"material-icons gray",children:"push_pin"})}),(0,h.jsx)("div",{className:"pinned-scroll",children:s}),(0,h.jsx)("div",{className:"pinned",onClick:this.handleSelected,children:(0,h.jsx)("p",{children:t})}),(0,h.jsxs)("div",{className:"pinned-menu",children:[(0,h.jsx)("span",{className:"menuTrigger upper",children:e>0?(0,h.jsx)("a",{href:"#",onClick:this.handleMovePrev,children:(0,h.jsx)("i",{className:"material-icons",children:"expand_less"})}):null}),(0,h.jsx)("span",{className:"menuTrigger lower",children:this.props.selected>0?(0,h.jsx)("a",{href:"#",onClick:this.handleMoveNext,children:(0,h.jsx)("i",{className:"material-icons",children:"expand_more"})}):null})]})]})}}var T=(0,n.injectIntl)(E),R=s(5372);const k=a().lazy(e=>s.e(821).then(s.bind(s,7821))),N=a().lazy(e=>s.e(623).then(s.bind(s,1623))),I=a().lazy(e=>s.e(534).then(s.bind(s,8534))),L=a().lazy(e=>Promise.all([s.e(892),s.e(803)]).then(s.bind(s,4803))),U=a().lazy(e=>s.e(592).then(s.bind(s,4592))),z=(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: {timestamp}",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"},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"},invalid_content:{id:"invalid_content",defaultMessage:"invalid content",description:"Shown when the message is unreadable"},editing_message:{id:"editing_message",defaultMessage:"Editing",description:"Title over message editing preview"},drag_file:{id:"drag_file",defaultMessage:"Drag file here",description:"Prompt on the file drag-n-drop overlay banner"},self_topic_name:{id:"self_topic_name",defaultMessage:"Saved messages",description:"Name of self topic for UI"},subscriber_count:{id:"subscriber_count",defaultMessage:"{count, plural, one {{count, number} subscriber} two {{count, number} subscribers} three {{count, number} subscribers} few {{count, number} subscribers} many {{count, number} subscribers} other {{count, number} subscribers}}",description:"Count of channel subscribers"},member_count:{id:"member_count",defaultMessage:"{count, plural, one {{count, number} member} two {{count, number} members} three {{count, number} members} few {{count, number} members} many {{count, number} members} other {{count, number} members}}",description:"Count of group topic members"},cannot_parse_vcard:{id:"cannot_parse_vcard",defaultMessage:"Cannot parse vCard file.",description:"Error message when vCard file cannot be parsed"}});function q(e){if(e){const t=e.getExcessive()||"";return e.isJoiner("given")&&(t.includes("R")||t.includes("W"))}return!1}function B(e){if(e){const t=e.getMissing()||"";return e.isJoiner("want")&&(t.includes("R")||t.includes("W"))}return!1}function O(e){return 1==e||3==e}class V extends a().Component{constructor(e){super(e),this.state=V.getDerivedStateFromProps(e,{}),this.componentSetup=this.componentSetup.bind(this),this.leave=this.leave.bind(this),this.sendMessage=this.sendMessage.bind(this),this.retrySend=this.retrySend.bind(this),this.sendImageAttachment=this.sendImageAttachment.bind(this),this.sendVideoAttachment=this.sendVideoAttachment.bind(this),this.sendFileAttachment=this.sendFileAttachment.bind(this),this.sendAudioAttachment=this.sendAudioAttachment.bind(this),this.sendTheCardAttachment=this.sendTheCardAttachment.bind(this),this.sendKeyPress=this.sendKeyPress.bind(this),this.subscribe=this.subscribe.bind(this),this.handleScrollReference=this.handleScrollReference.bind(this),this.mountDnDEvents=this.mountDnDEvents.bind(this),this.handleScrollEvent=this.handleScrollEvent.bind(this),this.handleDescChange=this.handleDescChange.bind(this),this.handleSubsUpdated=this.handleSubsUpdated.bind(this),this.handleMessageUpdate=this.handleMessageUpdate.bind(this),this.handleAuxUpdate=this.handleAuxUpdate.bind(this),this.handleAllMessagesReceived=this.handleAllMessagesReceived.bind(this),this.handleInfoReceipt=this.handleInfoReceipt.bind(this),this.handleExpandMedia=this.handleExpandMedia.bind(this),this.handleClosePreview=this.handleClosePreview.bind(this),this.handleCallPanelToggle=this.handleCallPanelToggle.bind(this),this.handleFormResponse=this.handleFormResponse.bind(this),this.handleContextClick=this.handleContextClick.bind(this),this.handleShowMessageContextMenu=this.handleShowMessageContextMenu.bind(this),this.handleNewChatAcceptance=this.handleNewChatAcceptance.bind(this),this.handleEnablePeer=this.handleEnablePeer.bind(this),this.handleAttachFile=this.handleAttachFile.bind(this),this.handleAttachImageOrVideo=this.handleAttachImageOrVideo.bind(this),this.handleCancelUpload=this.handleCancelUpload.bind(this),this.postReadNotification=this.postReadNotification.bind(this),this.clearNotificationQueue=this.clearNotificationQueue.bind(this),this.goToLatestMessage=this.goToLatestMessage.bind(this),this.handleFileDrop=this.handleFileDrop.bind(this),this.handlePickReply=this.handlePickReply.bind(this),this.handleEditMessage=this.handleEditMessage.bind(this),this.handleCancelReply=this.handleCancelReply.bind(this),this.handleQuoteClick=this.handleQuoteClick.bind(this),this.handleUnpinMessage=this.handleUnpinMessage.bind(this),this.handleCallHangup=this.handleCallHangup.bind(this),this.isDragEnabled=this.isDragEnabled.bind(this),this.handleDragStart=this.handleDragStart.bind(this),this.handleDragIn=this.handleDragIn.bind(this),this.handleDragOut=this.handleDragOut.bind(this),this.handleDrag=this.handleDrag.bind(this),this.handleDrop=this.handleDrop.bind(this),this.chatMessageRefs=[],this.getOrCreateMessageRef=this.getOrCreateMessageRef.bind(this),this.getVisibleMessageRange=this.getVisibleMessageRange.bind(this),this.dragCounter=0,this.dndRef=null,this.readNotificationQueue=[],this.readNotificationTimer=null,this.keyPressTimer=null}getOrCreateMessageRef(e){if(this.chatMessageRefs[e])return this.chatMessageRefs[e];const t=a().createRef();return this.chatMessageRefs[e]=t,t}getVisibleMessageRange(e){let t=Number.MAX_SAFE_INTEGER,s=-1,i=!1;return this.chatMessageRefs.every((a,n)=>{if(a.current){const{top:o,bottom:r,height:l}=a.current.getBoundingClientRect();if(o<=e.top?e.top-o<=l:r-e.bottom<=l)i=!0,t=Math.min(t,n),s=Math.max(s,n);else if(i)return!1}return!0}),s>=t?{min:t,max:s}:{min:0,max:0}}componentDidMount(){this.messagesScroller&&this.messagesScroller.addEventListener("scroll",this.handleScrollEvent),this.mountDnDEvents(this.dndRef),this.componentSetup({},{})}componentWillUnmount(){this.messagesScroller&&this.messagesScroller.removeEventListener("scroll",this.handleScrollEvent),this.clearNotificationQueue(),this.dndRef&&(this.dndRef.removeEventListener("dragstart",this.handleDragStart),this.dndRef.removeEventListener("dragenter",this.handleDragIn),this.dndRef.removeEventListener("dragleave",this.handleDragOut),this.dndRef.removeEventListener("dragover",this.handleDrag),this.dndRef.removeEventListener("drop",this.handleDrop))}componentDidUpdate(e,t){!this.messagesScroller||t.topic==this.state.topic&&t.maxSeqId==this.state.maxSeqId&&t.minSeqId==this.state.minSeqId||this.state.scrollPosition<100&&(this.messagesScroller.scrollTop=this.messagesScroller.scrollHeight-this.state.scrollPosition-this.messagesScroller.offsetHeight),this.props.applicationVisible?this.postReadNotification(0):this.clearNotificationQueue(),this.componentSetup(e,t)}componentSetup(e,t){const s=this.props.tinode?this.props.tinode.getTopic(this.state.topic):void 0;if(this.state.topic!=t.topic&&(t.topic&&!o.Tinode.isNewGroupTopicName(t.topic)&&(this.leave(t.topic),t.rtcPanel&&this.handleCallHangup(t.topic,e.callSeq)),s&&(s.onData=this.handleMessageUpdate,s.onAllMessagesReceived=this.handleAllMessagesReceived,s.onInfo=this.handleInfoReceipt,s.onMetaDesc=this.handleDescChange,s.onSubsUpdated=this.handleSubsUpdated,s.onPres=this.handleSubsUpdated,s.onAuxUpdated=this.handleAuxUpdate)),s)if(this.state.topic!=t.topic||this.props.myUserId&&!e.myUserId){const e=this.props.newTopicParams&&this.props.newTopicParams._topicName==this.props.topic;s.isP2PType()&&e?s.getMeta(s.startMetaQuery().withDesc().build()):this.props.myUserId&&this.subscribe(s)}else s.isSubscribed()&&this.state.isReader&&!t.isReader?s.getMeta(s.startMetaQuery().withLaterData().build()):s.isSubscribed()||!this.props.ready||e.ready||this.subscribe(s)}static getDerivedStateFromProps(e,t){let s={};if(e.topic)if(e.topic!=t.topic){const i=e.tinode.getTopic(e.topic);if(s={topic:e.topic,deleted:i._deleted,docPreview:null,imagePreview:null,imagePostview:null,videoPreview:null,videoPostview:null,rtcPanel:null,minimizedCallPanel:!1,typingIndicator:!1,scrollPosition:0,fetchingMessages:!1,showGoToLastButton:!1,contentToEdit:null,dragging:!1,selectedPin:0},e.forwardMessage)if(e.forwardMessage.content){const t=e.forwardMessage.content,i=t?.length||t?.size||0;s.docPreview={object:t,type:e.forwardMessage.type,size:i}}else s.reply={content:e.forwardMessage.preview,seq:null};else s.reply=null;if(i){const a=[];e.connected&&i.subscribers(t=>{t.online&&t.user!=e.myUserId&&a.push(t)}),Object.assign(s,{onlineSubs:a}),i.isSelfType()?Object.assign(s,{title:e.intl.formatMessage(z.self_topic_name),avatar:!0}):i.public?Object.assign(s,{title:i.public.fn,avatar:(0,C.to)(i.public.photo)}):Object.assign(s,{title:"",avatar:null});const n=i.p2pPeerDesc();n?Object.assign(s,{peerMessagingDisabled:B(n.acs)}):t.peerMessagingDisabled&&Object.assign(s,{peerMessagingDisabled:!1}),Object.assign(s,{minSeqId:i.minMsgSeq(),maxSeqId:i.maxMsgSeq(),latestClearId:i.maxClearId(),channel:i.isChannelType(),pins:(i.aux("pins")||[]).slice(),pinsLoaded:!1}),e.callTopic==i.name&&O(e.callState)&&(s.rtcPanel=e.callTopic)}else Object.assign(s,{minSeqId:-1,maxSeqId:-1,latestClearId:-1,onlineSubs:[],title:"",avatar:null,peerMessagingDisabled:!1,channel:!1,pins:[],pinsLoaded:!1})}else e.callTopic==t.topic&&!t.rtcPanel&&O(e.callState)&&(s.rtcPanel=e.callTopic);else s={minSeqId:-1,maxSeqId:-1,latestClearId:-1,onlineSubs:[],topic:null,title:"",avatar:null,isVerified:!1,isStaff:!1,isDangerous:!1,deleted:!1,docPreview:null,imagePreview:null,imagePostview:null,videoPreview:null,videoPostview:null,rtcPanel:null,minimizedCallPanel:!1,typingIndicator:!1,scrollPosition:0,fetchingMessages:!1,peerMessagingDisabled:!1,channel:!1,reply:null,contentToEdit:null,showGoToLastButton:!1,dragging:!1,pins:[],pinsLoaded:!1,selectedPin:0,subsVersion:0};return e.acs?(e.acs.isWriter()!=t.isWriter&&(s.isWriter=!t.isWriter),e.acs.isReader()!=t.isReader&&(s.isReader=!t.isReader),e.acs.isAdmin()!=t.isAdmin&&(s.isAdmin=!t.isAdmin),!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.isAdmin&&(s.isAdmin=!1),t.readingBlocked||(t.readingBlocked=!0),t.isSharer&&(s.isSharer=!1)),q(e.acs)==!t.unconformed&&(s.unconfirmed=!t.unconformed),!e.connected&&t.onlineSubs&&t.onlineSubs.length>0&&(s.onlineSubs=[]),s}subscribe(e){if(e.isSubscribed()||!this.props.ready)return;const t=this.props.newTopicParams&&this.props.newTopicParams._topicName==this.props.topic;let s=e.startMetaQuery().withLaterDesc().withLaterSub().withAux();(this.state.isReader||t)&&(s=s.withLaterData(24),this.state.isReader&&(s=s.withLaterDel()),this.setState({fetchingMessages:!0}));const i=t?this.props.newTopicParams:void 0;e.subscribe(s.build(),i).then(t=>{if(303==t.code)return void v.A.navigateTo(v.A.setUrlTopic("",t.params.topic));this.state.topic!=t.topic&&this.setState({topic:t.topic}),this.state.deleted&&this.setState({deleted:!1}),this.props.onNewTopicCreated(this.props.topic,t.topic);let s=[];e.queuedMessages(t=>{t._sending||(t._fatal||t.head&&t.head.webrtc?s.push(t.seq):e.isSubscribed()&&this.retrySend(t))}),s.length>0&&e.delMessagesList(s,!0)}).catch(e=>{console.error("Failed subscription to",this.state.topic,e),this.props.onError(e.message,"err");const t=V.getDerivedStateFromProps({},{});t.title=this.props.intl.formatMessage(z.not_found),this.setState(t)})}leave(e){if(!e||!this.props.tinode.isTopicCached(e))return;const t=this.props.tinode.getTopic(e);t&&t.isSubscribed()&&t.leave(!1).catch(e=>{}).finally(e=>{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,t.onAuxUpdated=void 0})}handleScrollReference(e){e&&(e.addEventListener("scroll",this.handleScrollEvent),this.messagesScroller=e,this.messagesScroller.scrollTop=this.messagesScroller.scrollHeight-this.state.scrollPosition-this.messagesScroller.offsetHeight)}handleScrollEvent(e){const t=e.target.scrollHeight-e.target.scrollTop-e.target.offsetHeight;if(this.setState({scrollPosition:t,showGoToLastButton:t>100&&t0&&this.setState({fetchingMessages:!0},e=>{t.getMessagesPage(24,a,s,i).catch(e=>this.props.onError(e.message,"err")).finally(e=>this.setState({fetchingMessages:!1}))})}}this.processingScrollEvent=!1}}mountDnDEvents(e){e&&(e.addEventListener("dragstart",this.handleDragStart),e.addEventListener("dragenter",this.handleDragIn),e.addEventListener("dragleave",this.handleDragOut),e.addEventListener("dragover",this.handleDrag),e.addEventListener("drop",this.handleDrop),this.dndRef=e)}goToLatestMessage(){this.setState({scrollPosition:0}),this.messagesScroller&&(this.messagesScroller.scrollTop=this.messagesScroller.scrollHeight-this.messagesScroller.offsetHeight)}handleDescChange(e){o.Tinode.isSelfTopicName(this.props.topic)?this.setState({title:this.props.intl.formatMessage(z.self_topic_name),avatar:!0}):e.public?this.setState({title:e.public.fn,avatar:(0,C.to)(e.public.photo)}):this.setState({title:"",avatar:null}),e.acs&&this.setState({isWriter:e.acs.isWriter(),isReader:e.acs.isReader(),isAdmin:e.acs.isAdmin(),readingBlocked:!e.acs.isReader("given"),unconfirmed:q(e.acs)})}postReadNotification(e){if(!this.props.applicationVisible||!this.state.topic)return;this.readNotificationTimer||(this.readNotificationTimer=setInterval(e=>{if(0==this.readNotificationQueue.length)return clearInterval(this.readNotificationTimer),void(this.readNotificationTimer=null);let t=-1;for(;this.readNotificationQueue.length>0;){const e=this.readNotificationQueue[0];if(e.topicName!=this.state.topic){this.readNotificationQueue.shift();continue}const s=new Date;if(!(e.sendAt<=s))break;this.readNotificationQueue.shift(),(0==e.seq||o.Tinode.isServerAssignedSeq(e.seq))&&(t=Math.max(t,e.seq))}if(t>=0){const e=this.props.tinode.getTopic(this.state.topic);if(e)try{e.noteRead(t)}catch(e){console.error("Failed to send read notification",e)}}},300));const t=new Date;this.readNotificationQueue.push({topicName:this.state.topic,seq:e,sendAt:t.setMilliseconds(t.getMilliseconds()+1500)})}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,subsVersion:this.state.subsVersion+1},i=t.p2pPeerDesc();i?Object.assign(s,{peerMessagingDisabled:B(i.acs)}):this.state.peerMessagingDisabled&&Object.assign(s,{peerMessagingDisabled:!1}),this.setState(s)}}handleMessageUpdate(e){if(!this.state.topic)return;const t=this.props.tinode.getTopic(this.state.topic);e?(clearTimeout(this.keyPressTimer),this.setState({maxSeqId:t.maxMsgSeq(),minSeqId:t.minMsgSeq(),typingIndicator:!1},s=>{t.isNewMessage(e.seq)?this.state.scrollPosition>100?this.setState({showGoToLastButton:!0}):this.goToLatestMessage():this.messagesScroller&&(this.messagesScroller.scrollTop=this.messagesScroller.scrollHeight-this.state.scrollPosition-this.messagesScroller.offsetHeight)}),t.msgStatus(e,!0)>=o.Tinode.MESSAGE_STATUS_SENT&&e.from!=this.props.myUserId&&this.postReadNotification(e.seq)):this.setState({latestClearId:t.maxClearId()})}handleAllMessagesReceived(e){if(this.setState({fetchingMessages:!1}),!e){const e=this.props.tinode.getTopic(this.state.topic);return void(e&&this.postReadNotification(e.seq))}if(this.state.pinsLoaded)this.setState({pinsLoaded:!1});else{const e=this.props.tinode.getTopic(this.state.topic);this.setState({pinsLoaded:!0},t=>{e.getPinnedMessages()})}}handleAuxUpdate(e){const t=(e.pins||[]).slice();let s=this.state.selectedPin;t.length>this.state.pins.length?s=0:s>=t.length&&(s=Math.max(0,t.length-1)),this.setState({pins:t,selectedPin:s})}handleInfoReceipt(e){switch(e.what){case"kp":clearTimeout(this.keyPressTimer),this.keyPressTimer=setTimeout(e=>this.setState({typingIndicator:!1}),4e3),this.state.typingIndicator||this.setState({typingIndicator:!0});break;case"read":case"recv":this.forceUpdate();break;default:console.info("Other change in topic: ",e.what)}}handleExpandMedia(e){e&&(e.video?this.setState({videoPostview:e}):this.setState({imagePostview:e}))}handleClosePreview(){this.state.imagePreview&&this.state.imagePreview.url&&URL.revokeObjectURL(this.state.imagePreview.url),this.state.videoPreview&&this.state.videoPreview.url&&URL.revokeObjectURL(this.state.videoPreview.url),this.setState({imagePostview:null,imagePreview:null,docPreview:null,videoPreview:null,videoPostview:null}),this.props.onCancelForwardMessage()}handleFormResponse(e,t,s){if("pub"==e)this.sendMessage(o.Drafty.attachJSON(o.Drafty.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"].forEach(e=>{s[e]&&t.set(e,s[e])}),t.set("uid",this.props.myUserId),t.set("topic",this.state.topic),e.search=t,window.open(e,"_blank")}else console.info("Unknown action in form",e)}handleContextClick(e){e.preventDefault(),e.stopPropagation(),this.props.showContextMenu({topicName:this.state.topic,y:e.pageY,x:e.pageX})}handleShowMessageContextMenu(e,t){"chan"==e.userFrom&&(e.userFrom=this.state.topic,e.userName=this.state.title),e.topicName=this.state.topic;const s=t||[],i=this.props.tinode.getTopic(e.topicName);if(i)if(i.isSelfType())s.push("message_delete_generic");else{i.isChannelType()||s.push("message_delete");const t=i.getAccessMode();if(t&&t.isDeleter()){let i=t.isOwner();if(!i){const t=0|this.props.tinode.getServerParam(o.Tinode.MSG_DELETE_AGE,0);i=0==t||!!(t>0&&e.timestamp)&&e.timestamp.getTime()>(new Date).getTime()-1e3*t}i&&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,"JRWPS",this.state.topic)}sendKeyPress(e){const t=this.props.tinode.getTopic(this.state.topic);t.isSubscribed()&&(e?t.noteRecording(!0):t.noteKeyPress())}sendMessage(e,t,s){let i;if(!e&&this.props.forwardMessage)e=this.props.forwardMessage.msg,i=this.props.forwardMessage.head,this.handleCancelReply();else if(this.state.reply){if(this.state.reply.editing){if(e==this.state.contentToEdit)return void this.handleCancelReply();i={replace:":"+this.state.reply.seq}}else this.state.reply.content&&(i={reply:""+this.state.reply.seq},"string"==typeof e&&(e=o.Drafty.parse(e)),e=o.Drafty.append(o.Drafty.sanitizeEntities(this.state.reply.content),e));this.handleCancelReply()}this.props.sendMessage(e,t,s,i)}retrySend(e){this.props.sendMessage(e.content,void 0,void 0,e.head).then(t=>{this.props.tinode.getTopic(this.state.topic).delMessagesList([e.seq],!0)})}sendFileAttachment(e){const t=.75*this.props.tinode.getServerParam("maxMessageSize",262144)-1024|0;if((o.TheCard.isFileSupported(e.type,e.name)||e.type==o.TheCard.contentType)&&this.sendTheCardAttachment(e,t))return;const s=e=>e===w.Uv?"application/octet-stream":e;if(e.size>t){const t=this.props.tinode.getLargeFileHelper();if(!t)return void this.props.onError(this.props.intl.formatMessage(z.cannot_initiate_upload));const i=t.upload(e),a=o.Drafty.attachFile(null,{mime:s(e.type),filename:e.name,size:e.size,urlPromise:i});this.sendMessage(a,i,t)}else(0,C.bB)(e).then(t=>this.sendMessage(o.Drafty.attachFile(null,{mime:s(t.mime),data:t.bits,filename:t.name,size:e.size}))).catch(e=>this.props.onError(e.message,"err"))}sendTheCardAttachment(e,t){return!(e.size>t||(e.type==o.TheCard.contentType?(this.sendMessage(o.Drafty.appendTheCard(null,e.object)),0):((0,C.QJ)(e).then(e=>{this.sendMessage(o.Drafty.appendTheCard(null,e))}).catch(e=>{this.props.onError(this.props.intl.formatMessage(z.cannot_parse_vcard,{error:e.message}),"err")}),0)))}handleAttachFile(e){const t=this.props.tinode.getServerParam("maxFileUploadSize",w.qy);e.size>t?this.props.onError(this.props.intl.formatMessage(z.file_attachment_too_large,{size:(0,l.lX)(e.size),limit:(0,l.lX)(t)}),"err"):this.setState({docPreview:{file:e,name:e.name,size:e.size,type:e.type}})}handleCallHangup(e,t){this.props.onVideoCallClosed(),this.setState({rtcPanel:null}),this.props.onCallHangup(e,t)}handleCallPanelToggle(){this.setState({minimizedCallPanel:!this.state.minimizedCallPanel})}sendImageAttachment(e,t){const s=this.state.imagePreview.mime,i=this.state.imagePreview.width,a=this.state.imagePreview.height,n=this.state.imagePreview.filename,r=.75*this.props.tinode.getServerParam("maxMessageSize",262144)-1024|0;if(t.size>r){const r=this.props.tinode.getLargeFileHelper();if(!r)return void this.props.onError(this.props.intl.formatMessage(z.cannot_initiate_upload));const l=r.upload(t);return void(0,C.ag)(t,64,64,-1,!1).then(e=>(0,C.Sk)(e.blob)).then(d=>{let h=o.Drafty.insertImage(null,0,{mime:s,_tempPreview:d.bits,bits:d.bits,width:i,height:a,filename:n,size:t.size,urlPromise:l});e&&(h=o.Drafty.appendLineBreak(h),h=o.Drafty.append(h,o.Drafty.parse(e))),this.sendMessage(h,l,r)}).catch(e=>this.props.onError(e,"err"))}(0,C.Sk)(t).then(s=>{let r=o.Drafty.insertImage(null,0,{mime:s.mime,bits:s.bits,width:i,height:a,filename:n,size:t.size});e&&(r=o.Drafty.appendLineBreak(r),r=o.Drafty.append(r,o.Drafty.parse(e))),this.sendMessage(r)})}sendVideoAttachment(e,t,s,i){const a=i.width,n=i.height,r=.75*this.props.tinode.getServerParam("maxMessageSize",262144)-1024|0,l=[];let d;if(t.size+s.size>r){if(d=this.props.tinode.getLargeFileHelper(),!d)return void this.props.onError(this.props.intl.formatMessage(z.cannot_initiate_upload));l[0]=t.size>.675*r?d.upload(t):null,l[1]=s.size>.275*r?d.upload(s):null}if(0==l.length)return void Promise.all([(0,C.Sk)(t),(0,C.Sk)(s)]).then(s=>{const[r,l]=s;let d=o.Drafty.insertVideo(null,0,{mime:r.mime,bits:r.bits,preview:l.bits,premime:l.mime,width:a,height:n,duration:i.duration,filename:i.name,size:t.size});e&&(d=o.Drafty.appendLineBreak(d),d=o.Drafty.append(d,o.Drafty.parse(e))),this.sendMessage(d)});const h=Promise.all(l),c=[];c[0]=l[0]?null:(0,C.Sk)(t),c[1]=l[1]?null:(0,C.ag)(s,1024,1024,-1,!1).then(e=>(0,C.Sk)(e.blob)),c[2]=(0,C.ag)(s,96,96,-1,!1).then(e=>(0,C.Sk)(e.blob)),Promise.all(c).then(s=>{const[r,l,c]=s;let p=o.Drafty.insertVideo(null,0,{mime:i.mime,bits:r?r.bits:null,_tempPreview:c.bits,preview:l?l.bits:c.bits,premime:l?l.mime:c.mime,width:a,height:n,duration:i.duration,filename:i.name,size:t.size,urlPromise:h});e&&(p=o.Drafty.appendLineBreak(p),p=o.Drafty.append(p,o.Drafty.parse(e))),this.sendMessage(p,h,d)}).catch(e=>this.props.onError(e.message,"err"))}handleAttachImageOrVideo(e){const t=this.props.tinode.getServerParam("maxFileUploadSize",w.qy);e.type.startsWith("video/")?this.setState({videoPreview:{url:URL.createObjectURL(e),blob:e,filename:e.name,size:e.size,mime:e.type}}):(0,C.ag)(e,1024,1024,t,!1).then(e=>{this.setState({imagePreview:{url:URL.createObjectURL(e.blob),blob:e.blob,filename:e.name,width:e.width,height:e.height,size:e.blob.size,mime:e.mime}})}).catch(e=>{this.props.onError(e.message,"err")})}handleFileDrop(e){if(!e||0==e.length)return;const t=e[0];t.type&&t.type.startsWith("image/")?this.handleAttachImageOrVideo(t):this.handleAttachFile(t)}sendAudioAttachment(e,t,s){fetch(e).then(e=>e.blob()).then(e=>{const i=.75*this.props.tinode.getServerParam("maxMessageSize",262144)-1024;if(e.size>i){const i=this.props.tinode.getLargeFileHelper();if(!i)return void this.props.onError(this.props.intl.formatMessage(z.cannot_initiate_upload));const a=i.upload(e),n=o.Drafty.appendAudio(null,{mime:e.type,size:e.size,duration:s,preview:t,urlPromise:a});this.sendMessage(n,a,i)}else(0,C.Sk)(e).then(i=>{this.sendMessage(o.Drafty.appendAudio(null,{mime:i.mime,bits:i.bits,size:e.size,duration:s,preview:t}))})}).catch(e=>{this.props.onError(e.message,"err")})}handleCancelUpload(e,t){const s=this.props.tinode.getTopic(this.state.topic).findMessage(e);s&&(s._cancelled=!0),t.cancel()}handlePickReply(e,t,s,i){e&&t?(t="string"==typeof t?o.Drafty.init(t):t,t=o.Drafty.isValid(t)?o.Drafty.replyContent(t,30):o.Drafty.append(o.Drafty.init("⚠ "),o.Drafty.wrapInto(this.props.intl.formatMessage(z.invalid_content),"EM")),this.setState({reply:{content:o.Drafty.quote(i,s,t),seq:e}}),this.props.onCancelForwardMessage()):this.setState({reply:null})}handleEditMessage(e,t){if(!e||!t)return void this.setState({reply:null});t="string"==typeof t?o.Drafty.init(t):t;const s=o.Drafty.toMarkdown(t);t=o.Drafty.isValid(t)?o.Drafty.replyContent(t,48):o.Drafty.append(o.Drafty.init("⚠ "),o.Drafty.wrapInto(this.props.intl.formatMessage(z.invalid_content),"EM")),this.setState({reply:{content:o.Drafty.quote(this.props.intl.formatMessage(z.editing_message),null,t),seq:e,editing:!0},contentToEdit:s}),this.props.onCancelForwardMessage()}handleCancelReply(){this.setState({reply:null,contentToEdit:null}),this.props.onCancelForwardMessage()}handleQuoteClick(e){const t=this.getOrCreateMessageRef(e);t&&t.current?(t.current.scrollIntoView({block:"center",behavior:"smooth"}),t.current.classList.add("flash"),setTimeout(e=>{t.current.classList.remove("flash")},1e3)):console.error("Unresolved message ref",e)}handleUnpinMessage(e){this.props.tinode.getTopic(this.state.topic).pinMessage(e,!1)}isDragEnabled(){return this.state.isWriter&&!this.state.unconfirmed&&!this.props.forwardMessage&&!this.state.peerMessagingDisabled}handleDragStart(e){e.preventDefault(),e.stopPropagation(),e.dataTransfer.clearData()}handleDragIn(e){e.preventDefault(),e.stopPropagation(),this.dragCounter++,e.dataTransfer.items&&e.dataTransfer.items.length>0&&this.setState({dragging:!0})}handleDragOut(e){e.preventDefault(),e.stopPropagation(),this.dragCounter--,this.dragCounter<=0&&this.setState({dragging:!1})}handleDrag(e){e.preventDefault(),e.stopPropagation()}handleDrop(e){e.preventDefault(),e.stopPropagation(),this.setState({dragging:!1}),this.isDragEnabled()&&e.dataTransfer.files&&e.dataTransfer.files.length>0&&(this.handleFileDrop(e.dataTransfer.files),this.dragCounter=0)}render(){const{formatMessage:e}=this.props.intl,t=this.state.rtcPanel&&(0,h.jsx)(i.Suspense,{fallback:(0,h.jsx)("div",{children:(0,h.jsx)(n.FormattedMessage,{id:"loading_note",defaultMessage:"Loading...",description:"Message shown when component is loading"})}),children:(0,h.jsx)(k,{topic:this.state.topic,seq:this.props.callSeq,callState:this.props.callState,callAudioOnly:this.props.callAudioOnly,tinode:this.props.tinode,title:this.state.title,avatar:this.state.avatar||!0,minimized:this.state.minimizedCallPanel,onError:this.props.onError,onHangup:this.handleCallHangup,onToggleMinimize:this.handleCallPanelToggle,onInvite:this.props.onCallInvite,onSendOffer:this.props.onCallSendOffer,onIceCandidate:this.props.onCallIceCandidate,onSendAnswer:this.props.onCallSendAnswer})});let s;if(this.state.topic){let a;if(this.state.imagePreview)a=(0,h.jsx)(i.Suspense,{fallback:(0,h.jsx)("div",{children:(0,h.jsx)(n.FormattedMessage,{id:"loading_note",defaultMessage:"Loading...",description:"Message shown when component is loading"})}),children:(0,h.jsx)(I,{content:this.state.imagePreview,tinode:this.props.tinode,reply:this.state.reply,onCancelReply:this.handleCancelReply,onClose:this.handleClosePreview,onSendMessage:this.sendImageAttachment})});else if(this.state.videoPreview)a=(0,h.jsx)(i.Suspense,{fallback:(0,h.jsx)("div",{children:(0,h.jsx)(n.FormattedMessage,{id:"loading_note",defaultMessage:"Loading...",description:"Message shown when component is loading"})}),children:(0,h.jsx)(U,{content:this.state.videoPreview,tinode:this.props.tinode,reply:this.state.reply,onError:this.props.onError,onCancelReply:this.handleCancelReply,onClose:this.handleClosePreview,onSendMessage:this.sendVideoAttachment})});else if(this.state.imagePostview)a=(0,h.jsx)(i.Suspense,{fallback:(0,h.jsx)("div",{children:(0,h.jsx)(n.FormattedMessage,{id:"loading_note",defaultMessage:"Loading...",description:"Message shown when component is loading"})}),children:(0,h.jsx)(I,{content:this.state.imagePostview,onClose:this.handleClosePreview})});else if(this.state.videoPostview)a=(0,h.jsx)(i.Suspense,{fallback:(0,h.jsx)("div",{children:(0,h.jsx)(n.FormattedMessage,{id:"loading_note",defaultMessage:"Loading...",description:"Message shown when component is loading"})}),children:(0,h.jsx)(U,{content:this.state.videoPostview,tinode:this.props.tinode,onError:this.props.onError,onClose:this.handleClosePreview})});else if(this.state.docPreview)a=o.TheCard.isFileSupported(this.state.docPreview.type,this.state.docPreview.name)||this.state.docPreview.type==o.TheCard.contentType?(0,h.jsx)(i.Suspense,{fallback:(0,h.jsx)("div",{children:(0,h.jsx)(n.FormattedMessage,{id:"loading_note",defaultMessage:"Loading...",description:"Message shown when component is loading"})}),children:(0,h.jsx)(L,{content:this.state.docPreview,tinode:this.props.tinode,reply:this.state.reply,onCancelReply:this.handleCancelReply,onClose:this.handleClosePreview,onSendMessage:this.sendFileAttachment})}):(0,h.jsx)(i.Suspense,{fallback:(0,h.jsx)("div",{children:(0,h.jsx)(n.FormattedMessage,{id:"loading_note",defaultMessage:"Loading...",description:"Message shown when component is loading"})}),children:(0,h.jsx)(N,{content:this.state.docPreview,tinode:this.props.tinode,reply:this.state.reply,onCancelReply:this.handleCancelReply,onClose:this.handleClosePreview,onSendMessage:this.sendFileAttachment})});else{const t=this.props.tinode.getTopic(this.state.topic),s=t.isChannelType()||t.chan,i=t.isGroupType()&&!s,r=[];t.trusted&&(t.trusted.verified&&r.push({icon:"verified",color:"badge-inv"}),t.trusted.staff&&r.push({icon:"staff",color:"badge-inv"}),t.trusted.danger&&r.push({icon:"dangerous",color:"badge-inv"}));const d=[];this.state.pins.forEach(e=>d.push(t.latestMsgVersion(e)||t.findMessage(e)));const c=[];let u=null,g=null,m=null;t.messages((e,s,a,n)=>{let o=a?a.from||"chan":null,r="single",d=e.from||"chan";d==u?r=d==o?"middle":"last":d==o&&(r="first"),u=d;const p=!(d==this.props.myUserId),f=t.msgStatus(e,!0);let v,b,M=d;const y=t.userDesc(d);y&&y.public&&(v=y.public.fn,b=(0,C.to)(y.public.photo)),m=i?"chat-box group":"chat-box";const x=this.getOrCreateMessageRef(e.seq);let w=e.head?parseInt(e.head.reply):null;if(w&&!isNaN(w)||(w=null),e.hi)c.push((0,h.jsx)(D,{deleted:!0},e.seq));else{const t=new Date(e.ts);g&&g.toDateString()==t.toDateString()||(c.push((0,h.jsx)(D,{date:(0,l.mf)(e.ts),locale:this.props.intl.locale},"date-"+e.seq)),g=t),c.push((0,h.jsx)(S,{tinode:this.props.tinode,topic:this.state.topic,content:e.content,mimeType:e.head&&e.head.mime,replyToSeq:w,edited:e.head&&!e.head.webrtc&&e.head.replace,timestamp:e.ts,response:p,seq:e.seq,isGroup:i,isChan:this.state.channel,userFrom:M,userName:v,userAvatar:b,sequence:r,received:f,uploader:e._uploader,userIsWriter:this.state.isWriter,userIsAdmin:this.state.isAdmin,pinned:this.state.pins.includes(e.seq),viewportWidth:this.props.viewportWidth,showContextMenu:this.handleShowMessageContextMenu,onExpandMedia:this.handleExpandMedia,onFormResponse:this.handleFormResponse,onCancelUpload:this.handleCancelUpload,pickReply:this.handlePickReply,editMessage:this.handleEditMessage,onQuoteClick:this.handleQuoteClick,onAcceptCall:this.props.onAcceptCall,onError:this.props.onError,ref:x},e.seq))}});let f=null;if(s)t.subcnt&&(f=e(z.subscriber_count,{count:t.subcnt}));else{const s=this.props.tinode.getMeTopic().getContact(this.state.topic);s&&(o.Tinode.isP2PTopicName(s.topic)?s.online?f=e(z.online_now):s.seen&&(f=e(z.last_seen,{timestamp:(0,l.cq)(s.seen.when,this.props.intl.locale)})):o.Tinode.isGroupTopicName(s.topic)&&t.subcnt&&(f=e(z.member_count,{count:t.subcnt})))}const v=this.state.avatar||!0,b=this.state.deleted||t.isSelfType()?null:this.props.online?"online"+(this.state.typingIndicator?" typing":""):"offline",M="panel-title"+(this.state.deleted?" deleted":""),w="dark"==this.props.colorSchema?"dark":"";let P=(0,h.jsxs)(h.Fragment,{children:[(0,h.jsxs)("div",{id:"messages-container",className:w,children:[(0,h.jsx)("button",{id:"go-to-latest",className:"action-button"+(this.state.showGoToLastButton?"":" hidden"),onClick:this.goToLatestMessage,children:(0,h.jsx)("i",{className:"material-icons",children:"arrow_downward"})}),(0,h.jsx)("div",{id:"messages-panel",ref:this.handleScrollReference,children:(0,h.jsx)("ul",{id:"scroller",className:m,children:c})}),this.state.isReader?null:(0,h.jsx)("div",{id:"write-only-background",children:this.state.readingBlocked?(0,h.jsx)("div",{id:"write-only-note",children:(0,h.jsx)(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?(0,h.jsxs)("div",{id:"peer-messaging-disabled-note",children:[(0,h.jsx)("i",{className:"material-icons secondary",children:"block"})," ",(0,h.jsx)(n.FormattedMessage,{id:"peers_messaging_disabled",defaultMessage:"Peer's messaging is disabled.",description:"Shown when the p2p peer's messaging is disabled"})," ",(0,h.jsx)("a",{href:"#",onClick:this.handleEnablePeer,children:(0,h.jsx)(n.FormattedMessage,{id:"enable_peers_messaging",defaultMessage:"Enable",description:"Call to action to enable peer's messaging"})}),"."]}):null,this.state.unconfirmed?(0,h.jsx)(A,{onAction:this.handleNewChatAcceptance}):(0,h.jsx)(R.A,{tinode:this.props.tinode,topicName:this.state.topic,noInput:!!this.props.forwardMessage,disabled:!this.state.isWriter||this.state.deleted,reply:this.state.reply,initMessage:this.state.contentToEdit,sendOnEnter:this.props.sendOnEnter,onKeyPress:this.sendKeyPress,onRecordingProgress:this.sendKeyPress,onSendMessage:this.sendMessage,onAttachFile:this.props.forwardMessage?null:this.handleAttachFile,onAttachImage:this.props.forwardMessage?null:this.handleAttachImageOrVideo,onAttachAudio:this.props.forwardMessage?null:this.sendAudioAttachment,onError:this.props.onError,onQuoteClick:this.handleQuoteClick,onCancelReply:this.handleCancelReply})]});a=(0,h.jsxs)(h.Fragment,{children:[(0,h.jsxs)("div",{id:"topic-caption-panel",className:"caption-panel",children:[this.props.displayMobile?(0,h.jsx)("a",{href:"#",id:"hide-message-view",onClick:e=>{e.preventDefault(),this.leave(this.state.topic),this.props.onHideMessagesView()},children:(0,h.jsx)("i",{className:"material-icons",children:"arrow_back"})}):null,(0,h.jsxs)("div",{className:"avatar-box",children:[(0,h.jsx)(p.A,{authorizeURL:this.props.tinode.authorizeURL,avatar:v,topic:this.state.topic,title:this.state.title,deleted:this.state.deleted}),s?null:(0,h.jsx)("span",{className:b})]}),(0,h.jsxs)("div",{id:"topic-title-group",children:[(0,h.jsxs)("div",{id:"topic-title",className:M,children:[this.state.title||(0,h.jsx)("i",{children:(0,h.jsx)(n.FormattedMessage,{id:"unnamed_topic",defaultMessage:"Unnamed",description:"Title shown when the topic has no name"})}),(0,h.jsx)(y.A,{badges:r})]}),(0,h.jsx)("div",{id:"topic-last-seen",children:f})]}),(0,h.jsx)("div",{style:{marginLeft:"auto"}}),!this.props.displayMobile&&this.state.pins.length>0?(0,h.jsx)(T,{tinode:this.props.tinode,pins:this.state.pins,messages:d,selected:this.state.selectedPin,isAdmin:this.state.isAdmin,setSelected:e=>this.setState({selectedPin:e}),onSelected:this.handleQuoteClick,onCancel:this.handleUnpinMessage}):null,i?(0,h.jsx)(_,{tinode:this.props.tinode,subscribers:this.state.onlineSubs}):null,(0,h.jsx)("div",{children:(0,h.jsx)("a",{href:"#",onClick:this.handleContextClick,children:(0,h.jsx)("i",{className:"material-icons",children:"more_vert"})})})]}),this.props.displayMobile?(0,h.jsxs)(h.Fragment,{children:[this.state.pins.length>0?(0,h.jsx)(T,{tinode:this.props.tinode,pins:this.state.pins,messages:d,selected:this.state.selectedPin,isAdmin:this.state.isAdmin,setSelected:e=>this.setState({selectedPin:e}),onSelected:this.handleQuoteClick,onCancel:this.handleUnpinMessage}):null,(0,h.jsx)(x.A,{level:this.props.errorLevel,text:this.props.errorText,onClearError:this.props.onError})]}):null,(0,h.jsx)(F.A,{show:this.state.fetchingMessages}),P,this.state.dragging&&this.isDragEnabled()?(0,h.jsx)("div",{className:"drag-n-drop",children:e(z.drag_file)}):null]})}s=(0,h.jsxs)("div",{id:"topic-view",ref:this.mountDnDEvents,children:[a,t]})}else s=(0,h.jsx)(P,{serverVersion:this.props.serverVersion,serverAddress:this.props.serverAddress});return s}}var Q=(0,n.injectIntl)(V)},5372:function(e,t,s){var i=s(1594),a=s.n(i),n=s(8181),o=s(4532),r=(s(3272),s(7981)),l=s(2067),d=s(4848);const h=a().lazy(e=>Promise.all([s.e(537),s.e(965)]).then(s.bind(s,965))),c=(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"},icon_title_record_voice:{id:"icon_title_record_voice",defaultMessage:"Record voice message",description:"Icon tool tip for recording a voice message"},icon_title_attach_file:{id:"icon_title_attach_file",defaultMessage:"Attach file",description:"Icon tool tip for attaching a file"},icon_title_add_image:{id:"icon_title_add_image",defaultMessage:"Add image",description:"Icon tool tip for attaching an image"},icon_title_send:{id:"icon_title_send",defaultMessage:"Send message",description:"Icon tool tip for sending a message"}});class p extends a().PureComponent{constructor(e){super(e),this.state={quote:null,message:"",audioRec:!1,audioAvailable:!(!navigator.mediaDevices||!navigator.mediaDevices.getUserMedia)},this.keypressTimestamp=0,this.handlePasteEvent=this.handlePasteEvent.bind(this),this.handleAttachImage=this.handleAttachImage.bind(this),this.handleAttachFile=this.handleAttachFile.bind(this),this.handleAttachAudio=this.handleAttachAudio.bind(this),this.handleSend=this.handleSend.bind(this),this.handleKeyPress=this.handleKeyPress.bind(this),this.handleMessageTyping=this.handleMessageTyping.bind(this),this.handleDropAttach=this.handleDropAttach.bind(this),this.handleQuoteClick=this.handleQuoteClick.bind(this),this.formatReply=this.formatReply.bind(this)}componentDidMount(){this.messageEditArea&&(this.messageEditArea.addEventListener("paste",this.handlePasteEvent,!1),"all"==window.getComputedStyle(this.messageEditArea).getPropertyValue("transition-property")&&this.messageEditArea.focus()),this.setState({quote:this.formatReply()})}componentWillUnmount(){this.messageEditArea&&this.messageEditArea.removeEventListener("paste",this.handlePasteEvent,!1)}componentDidUpdate(e){if(this.messageEditArea&&("all"==window.getComputedStyle(this.messageEditArea).getPropertyValue("transition-property")&&this.messageEditArea.focus(),this.messageEditArea.style.height="0px",this.messageEditArea.style.height=this.messageEditArea.scrollHeight+"px"),e.topicName!=this.props.topicName)this.setState({message:this.props.initMessage||"",audioRec:!1,quote:null});else if(e.initMessage!=this.props.initMessage){const e=this.props.initMessage||"";this.setState({message:e},t=>{this.messageEditArea.scrollTop=this.messageEditArea.scrollHeight,this.messageEditArea.setSelectionRange(e.length,e.length)})}e.reply!=this.props.reply&&this.setState({quote:this.formatReply()})}formatReply(){return this.props.reply?o.Drafty.format(this.props.reply.content,l.NV,{formatMessage:this.props.intl.formatMessage.bind(this.props.intl),authorizeURL:this.props.tinode.authorizeURL.bind(this.props.tinode)}):null}handlePasteEvent(e){this.props.disabled||(0,r.iJ)(e,e=>{this.props.onAttachImage(e)},e=>{this.props.onAttachFile(e)},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){e.target.files&&e.target.files.length>0&&this.props.onAttachFile(e.target.files[0]),e.target.value=""}handleDropAttach(e){e&&e.length>0&&this.props.onAttachFile(e[0])}handleAttachAudio(e,t,s){this.setState({audioRec:!1}),this.props.onAttachAudio(e,t,s)}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){if(this.state.audioRec)return e.preventDefault(),void e.stopPropagation();"Enter"===e.key&&("plain"==this.props.sendOnEnter?e.shiftKey||(e.preventDefault(),e.stopPropagation(),this.handleSend(e)):(e.ctrlKey||e.metaKey)&&(e.preventDefault(),e.stopPropagation(),this.handleSend(e)))}handleMessageTyping(e){if(this.setState({message:e.target.value}),this.props.onKeyPress){const e=(new Date).getTime();e-this.keypressTimestamp>3e3&&(this.props.onKeyPress(),this.keypressTimestamp=e)}}handleQuoteClick(e){if(e.preventDefault(),e.stopPropagation(),this.props.reply&&this.props.onQuoteClick){const e=this.props.reply.seq;this.props.onQuoteClick(e)}}render(){const{formatMessage:e}=this.props.intl,t=this.props.disabled?e(c.messaging_disabled):this.props.messagePrompt?e(c[this.props.messagePrompt]):e(c.type_new_message),s=this.props.reply&&this.props.reply.editing?"check_circle":"send",a=this.state.quote?(0,d.jsxs)("div",{id:"reply-quote-preview",children:[(0,d.jsx)("div",{className:"cancel",children:(0,d.jsx)("a",{href:"#",onClick:e=>{e.preventDefault(),this.props.onCancelReply()},children:(0,d.jsx)("i",{className:"material-icons gray",children:"close"})})}),this.state.quote]}):null,o=this.state.audioAvailable&&this.props.onAttachAudio;return(0,d.jsxs)("div",{id:"send-message-wrapper",children:[this.props.noInput?null:a,(0,d.jsx)("div",{id:"send-message-panel",children:this.props.disabled?(0,d.jsx)("div",{id:"writing-disabled",children:t}):(0,d.jsxs)(d.Fragment,{children:[this.props.onAttachFile&&!this.state.audioRec?(0,d.jsxs)(d.Fragment,{children:[(0,d.jsx)("a",{href:"#",onClick:e=>{e.preventDefault(),this.attachImage.click()},title:e(c.icon_title_add_image),children:(0,d.jsx)("i",{className:"material-icons secondary",children:"photo"})}),(0,d.jsx)("a",{href:"#",onClick:e=>{e.preventDefault(),this.attachFile.click()},title:e(c.icon_title_attach_file),children:(0,d.jsx)("i",{className:"material-icons secondary",children:"attach_file"})})]}):null,this.props.noInput?a||(0,d.jsx)("div",{className:"hr thin"}):this.state.audioRec?(0,d.jsx)(i.Suspense,{fallback:(0,d.jsx)("div",{children:(0,d.jsx)(n.FormattedMessage,{id:"loading_note",defaultMessage:"Loading...",description:"Message shown when component is loading"})}),children:(0,d.jsx)(h,{onRecordingProgress:e=>this.props.onKeyPress(!0),onDeleted:e=>this.setState({audioRec:!1}),onFinished:this.handleAttachAudio})}):(0,d.jsx)("textarea",{id:"send-message-input",placeholder:t,value:this.state.message,onChange:this.handleMessageTyping,onKeyDown:this.handleKeyPress,ref:e=>{this.messageEditArea=e}}),this.state.message||!o?(0,d.jsx)("a",{href:"#",onClick:this.handleSend,title:e(c.icon_title_send),children:(0,d.jsx)("i",{className:"material-icons",children:s})}):this.state.audioRec?null:(0,d.jsx)("a",{href:"#",onClick:e=>{e.preventDefault(),this.setState({audioRec:!0})},title:e(c.icon_title_record_voice),children:(0,d.jsx)("i",{className:"material-icons",children:"mic"})}),(0,d.jsx)("input",{type:"file",ref:e=>{this.attachFile=e},onChange:this.handleAttachFile,style:{display:"none"}}),(0,d.jsx)("input",{type:"file",ref:e=>{this.attachImage=e},accept:"image/*, video/*",onChange:this.handleAttachImage,style:{display:"none"}})]})})]})}}t.A=(0,n.injectIntl)(p)}}]);
+//# sourceMappingURL=523.prod.js.map
\ No newline at end of file
diff --git a/umd/523.prod.js.map b/umd/523.prod.js.map
new file mode 100644
index 00000000..1df584e2
--- /dev/null
+++ b/umd/523.prod.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"523.prod.js","mappings":"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","sources":["webpack://tinode-webapp/./src/widgets/attachment.jsx","webpack://tinode-webapp/./src/widgets/received-marker.jsx","webpack://tinode-webapp/./src/widgets/chat-message.jsx","webpack://tinode-webapp/./src/widgets/group-subs.jsx","webpack://tinode-webapp/./src/widgets/invitation.jsx","webpack://tinode-webapp/./src/views/logo-view.jsx","webpack://tinode-webapp/./src/widgets/meta-message.jsx","webpack://tinode-webapp/./src/widgets/pinned-messages.jsx","webpack://tinode-webapp/./src/views/messages-view.jsx","webpack://tinode-webapp/./src/widgets/send-message.jsx"],"sourcesContent":["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 => this.setState({progress: loaded / this.props.size}),\n err => this.props.onError(err, 'err')\n )\n .then(_ => 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
\n }\n
\n
\n );\n }\n};\n","// Received/read indicator.\nimport React from 'react';\nimport { defineMessages, injectIntl } from 'react-intl';\n\nimport { Tinode } from 'tinode-sdk';\n\nimport { deliveryMarker } from '../lib/utils.js';\n\nconst messages = defineMessages({\n message_sending: {\n id: 'message_sending',\n defaultMessage: 'sending...',\n description: 'Message being sent, in place of time stamp'\n },\n message_sending_failed: {\n id: 'message_sending_failed',\n defaultMessage: 'failed',\n description: 'Failed to send message, in place of time stamp'\n },\n message_edited_marker: {\n id: 'message_edited_marker',\n defaultMessage: ', edited',\n description: 'Marker indicating that the message was edited'\n }\n});\n\nclass ReceivedMarker extends React.PureComponent {\n render() {\n const {formatMessage} = this.props.intl;\n let timestamp;\n if (this.props.received <= Tinode.MESSAGE_STATUS_SENDING) {\n timestamp = formatMessage(messages.message_sending);\n } else if (this.props.received == Tinode.MESSAGE_STATUS_FAILED ||\n this.props.received == Tinode.MESSAGE_STATUS_FATAL) {\n timestamp = formatMessage(messages.message_sending_failed);\n } else {\n timestamp = this.props.timestamp.toLocaleTimeString(this.props.intl.locale, { timeStyle: 'short' });\n }\n\n const icon = deliveryMarker(this.props.received);\n const marker = icon ? {icon.name} : null;\n const edited = this.props.edited ? formatMessage(messages.message_edited_marker) : null;\n\n return (\n \n {timestamp}{edited}{'\\u00a0'}{marker}\n \n );\n }\n};\n\nexport default injectIntl(ReceivedMarker);\n","// Single chat message bubble, sent or received.\n\nimport React from 'react';\nimport { FormattedMessage, injectIntl } from 'react-intl';\nimport { Drafty, Tinode, TheCard } from 'tinode-sdk';\n\nimport Attachment from './attachment.jsx';\nimport LetterTile from './letter-tile.jsx';\nimport ReceivedMarker from './received-marker.jsx'\n\nimport { fullFormatter } from '../lib/formatters.js';\nimport { sanitizeUrl } from '../lib/utils.js';\nimport HashNavigation from '../lib/navigation.js';\n\nclass BaseChatMessage extends React.PureComponent {\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.handleExpandImage = this.handleExpandImage.bind(this);\n this.handlePlayVideo = this.handlePlayVideo.bind(this);\n this.handleFormButtonClick = this.handleFormButtonClick.bind(this);\n this.handleQuoteClick = this.handleQuoteClick.bind(this);\n this.handleContextClick = this.handleContextClick.bind(this);\n this.handleCancelUpload = this.handleCancelUpload.bind(this);\n this.handleDraftyClick = this.handleDraftyClick.bind(this);\n\n this.formatterContext = {\n formatMessage: props.intl.formatMessage.bind(props.intl),\n viewportWidth: props.viewportWidth,\n authorizeURL: props.tinode.authorizeURL.bind(props.tinode),\n\n onHandleClick: this.handleDraftyClick\n };\n }\n\n handleDraftyClick = (e, action) => {\n switch (action) {\n case 'image':\n this.handleExpandImage(e);\n break;\n case 'video':\n this.handlePlayVideo(e);\n break;\n case 'form_button':\n this.handleFormButtonClick(e);\n break;\n case 'quote':\n this.handleQuoteClick(e);\n break;\n case 'contact_chat':\n e.preventDefault();\n try {\n // tinode:topic/usr123abc -> usr123abc\n const pathname = new URL(e.target.dataset.val)?.pathname;\n const parts = pathname.split('/').filter(Boolean);\n HashNavigation.navigateTo(HashNavigation.setUrlTopic('', parts.pop() || ''));\n } catch (error) {\n console.error(\"Invalid URL:\", error);\n }\n break;\n case 'contact_find':\n e.preventDefault();\n let hashUrl = HashNavigation.setUrlSidePanel(window.location.hash, 'newtpk');\n hashUrl = HashNavigation.addUrlParam(hashUrl, 'q', e.target.dataset.val);\n hashUrl = HashNavigation.addUrlParam(hashUrl, 'tab', 'find');\n HashNavigation.navigateTo(hashUrl);\n break;\n default:\n // No special handling; let the browser deal with it.\n console.info('Unhandled drafty action.', action, e.target.dataset);\n break;\n }\n }\n\n handleExpandImage(e) {\n e.preventDefault();\n this.props.onExpandMedia({\n url: e.target.src,\n filename: e.target.dataset.name,\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 handlePlayVideo(e) {\n e.preventDefault();\n this.props.onExpandMedia({\n video: true,\n url: e.target.dataset.src,\n preview: e.target.src,\n filename: e.target.dataset.name,\n width: e.target.dataset.width,\n height: e.target.dataset.height,\n duration: e.target.dataset.duration,\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 = [];\n if (this.props.received == Tinode.MESSAGE_STATUS_FAILED) {\n menuItems.push('menu_item_send_retry');\n }\n if (this.props.received > Tinode.MESSAGE_STATUS_FATAL) {\n if (this.props.userIsWriter) {\n menuItems.push('menu_item_reply');\n if (!this.props.response) {\n let immutable = false;\n Drafty.entities(this.props.content, (_0, _1, tp) => {\n immutable = ['AU', 'EX', 'FM', 'IM', 'TC', 'VC', 'VD'].includes(tp);\n return immutable;\n });\n if (!immutable) {\n Drafty.styles(this.props.content, tp => {\n immutable = ['QQ'].includes(tp);\n return immutable;\n });\n }\n if (!immutable) {\n menuItems.push('menu_item_edit');\n }\n }\n }\n if (this.props.userIsAdmin) {\n menuItems.push(this.props.pinned ? 'menu_item_unpin' : 'menu_item_pin');\n }\n }\n menuItems.push('menu_item_forward');\n\n this.props.showContextMenu({\n seq: this.props.seq,\n replace: this.props.edited ? parseInt(this.props.edited.split(':')[1]) : 0,\n content: this.props.content,\n userFrom: this.props.userFrom,\n userName: this.props.userName,\n y: e.pageY,\n x: e.pageX,\n pickReply: this.props.pickReply,\n editMessage: this.props.editMessage,\n timestamp: this.props.timestamp,\n }, 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 handleQuoteClick(e) {\n e.preventDefault();\n e.stopPropagation();\n const replyToSeq = this.props.replyToSeq;\n if (replyToSeq) {\n this.props.onQuoteClick(replyToSeq);\n }\n }\n\n render() {\n const sideClass = 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.userAvatar || true;\n let textSizeClass = 'message-content';\n const fullDisplay = (this.props.isGroup && 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, (att, i) => {\n if (Drafty.isFormResponseType(att.mime)) {\n // Don't show json drafty form response objects as attachments.\n // They are not meant for users.\n return;\n }\n attachments.push( );\n }, this);\n const tree = Drafty.format(content, fullFormatter, this.formatterContext);\n content = React.createElement(React.Fragment, null, tree);\n } else if (typeof content == 'string') {\n // Make font bigger for emoji-only messages.\n // Must use 'new RegExp(...)' because React does not like /{1-5}/.\n if (new RegExp('^\\\\p{RGI_Emoji}{1,5}$', 'v').test(content || '')) {\n // Content consists of 1-5 emoji characters. Count how many and use it to increase the font size.\n textSizeClass += ' emoji-' + (content || '').match(/\\p{RGI_Emoji}/vg).length;\n }\n } else {\n content = <>warning_amber \n >\n }\n\n return (\n \n {this.props.isGroup && this.props.response ?\n \n {fullDisplay ?\n :\n null}\n
:\n null}\n \n
\n
\n
\n {content}\n {attachments}\n
\n {this.props.timestamp ?\n
\n : null}\n
\n {this.props.showContextMenu ?\n
\n \n expand_more \n \n : null\n }\n
\n {fullDisplay ?\n
\n {this.props.userName ||\n \n }\n
\n : null\n }\n
\n \n );\n }\n};\n\nconst IntlChatMessage = injectIntl(BaseChatMessage);\nconst ChatMessage = React.forwardRef((props, ref) => );\n\nexport default ChatMessage;\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 if (usersOnline.length == 0) {\n return null;\n }\n return (\n {usersOnline} {totalCount > countToShow ?\n \n \n : null}\n
\n );\n }\n};\n","// A single topic or user.\nimport React from 'react';\nimport { FormattedMessage } from 'react-intl';\n\nexport default class Invitation extends React.PureComponent {\n constructor(props) {\n super(props);\n\n this.handleButtonAction = this.handleButtonAction.bind(this);\n }\n\n handleButtonAction(evt, data) {\n evt.preventDefault();\n this.props.onAction(data);\n }\n\n render() {\n return (\n \n
\n \n
\n
\n { this.handleButtonAction(event, \"accept\"); }}>\n \n \n { this.handleButtonAction(event, \"delete\"); }}>\n \n \n { this.handleButtonAction(event, \"block\"); }}>\n \n \n
\n
\n );\n }\n};\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 \n Tinode Web \n \n
{version}
\n
{this.props.serverVersion} ({this.props.serverAddress})
\n
\n
\n );\n }\n};\n","// Message bubble with non-payload content, such as an indicator of deleted content or a date stamp.\n\nimport React from 'react';\n\nexport default class MetaMessage extends React.PureComponent {\n constructor(props) {\n super(props);\n }\n\n render() {\n let content = null;\n let bubbleClass = 'bubble';\n if (this.props.date) {\n // A date badge.\n content = <>{this.props.date}>\n bubbleClass += ' date';\n }\n\n if (!content) {\n return <>{null}>\n }\n\n return (\n \n \n \n );\n }\n};\n","// Send message form.\nimport React from 'react';\nimport { defineMessages, injectIntl } from 'react-intl';\nimport { Drafty } from 'tinode-sdk';\n\nimport { previewFormatter } from '../lib/formatters.js';\nimport { MIN_SWIPE_DISTANCE } from '../config.js';\n\nconst messages = defineMessages({\n message_not_found: {\n id: 'message_not_found',\n defaultMessage: 'message not found',\n description: 'Pinned message is not found'\n },\n message_deleted: {\n id: 'message_deleted',\n defaultMessage: 'message deleted',\n description: 'Pinned message is deleted'\n }\n});\n\nclass PinnedMessages extends React.PureComponent {\n constructor(props) {\n super(props);\n\n // Starting location of the touch gesture.\n this.touchX = null;\n this.touchY = null;\n\n this.touchSurface = React.createRef();\n\n this.getSelectedIndex = this.getSelectedIndex.bind(this);\n this.handleCancel = this.handleCancel.bind(this);\n this.handleSelected = this.handleSelected.bind(this);\n this.handleMoveNext = this.handleMoveNext.bind(this);\n this.handleMovePrev = this.handleMovePrev.bind(this);\n this.handleTouchEventStart = this.handleTouchEventStart.bind(this);\n this.handleTouchEventEnd = this.handleTouchEventEnd.bind(this);\n this.handleTouchCancel = this.handleTouchCancel.bind(this);\n }\n\n componentDidMount() {\n this.touchSurface.current.addEventListener('touchstart', this.handleTouchEventStart, {passive: true});\n this.touchSurface.current.addEventListener('touchend', this.handleTouchEventEnd, {passive: true});\n this.touchSurface.current.addEventListener('touchcancel', this.handleTouchCancel, {passive: true});\n }\n\n componentWillUnmount() {\n this.touchSurface.current.removeEventListener('touchstart', this.handleTouchEventStart);\n this.touchSurface.current.removeEventListener('touchend', this.handleTouchEventEnd);\n this.touchSurface.current.removeEventListener('touchcancel', this.handleTouchCancel);\n }\n getSelectedIndex() {\n const list = (this.props.pins || []);\n return list.length - this.props.selected - 1;\n }\n\n handleCancel(e) {\n e.preventDefault();\n this.props.onCancel(this.props.pins[this.getSelectedIndex()]);\n }\n\n handleSelected(e) {\n e.preventDefault();\n this.props.onSelected(this.props.pins[this.getSelectedIndex()]);\n }\n\n handleMoveNext(e, isTouch) {\n // Don't call preventDefault for touch events.\n isTouch || e.preventDefault();\n e.stopPropagation();\n const idx = Math.max(this.props.selected - 1, 0);\n if (idx != this.props.selected) {\n this.props.setSelected(idx);\n }\n }\n\n handleMovePrev(e, isTouch) {\n // Don't call preventDefault for touch events.\n isTouch || e.preventDefault();\n e.stopPropagation();\n const idx = Math.min(this.props.selected + 1, (this.props.pins || []).length - 1);\n if (idx != this.props.selected) {\n this.props.setSelected(idx);\n }\n }\n\n handleTouchEventStart(e) {\n if (e.touches.length == 1) {\n this.touchX = e.touches[0].clientX;\n this.touchY = e.touches[0].clientY;\n }\n }\n\n handleTouchEventEnd(e) {\n if (this.touchX === null || e.changedTouches.length != 1) {\n this.touchX = null;\n return;\n }\n\n const dX = this.touchX - e.changedTouches[0].clientX;\n const dY = this.touchY - e.changedTouches[0].clientY;\n this.touchX = null;\n\n if (Math.abs(dX) > Math.abs(dY) || Math.abs(dY) < MIN_SWIPE_DISTANCE) {\n // Horizontal swipe or too short vertical swipe.\n return;\n }\n\n if (dY > 0) {\n this.handleMovePrev(e, true);\n } else {\n this.handleMoveNext(e, true);\n }\n }\n\n handleTouchCancel() {\n this.touchX = null;\n }\n\n render() {\n const selected = this.getSelectedIndex();\n let messageShown = (this.props.messages || [])[selected];\n messageShown = messageShown ?\n messageShown._deleted ?\n {this.props.intl.formatMessage(messages.message_deleted)} \n :\n Drafty.format(messageShown.content, previewFormatter, {\n formatMessage: this.props.intl.formatMessage.bind(this.props.intl),\n authorizeURL: this.props.tinode.authorizeURL.bind(this.props.tinode)\n })\n :\n {this.props.intl.formatMessage(messages.message_not_found)} ;\n\n const dots = [];\n this.props.pins.forEach(seq => {\n const cn = dots.length == selected ? 'adot' : 'dot';\n dots.push(
);\n });\n\n return (\n \n {this.props.isAdmin ?\n
:\n
push_pin
\n }\n
{dots}
\n
\n
\n
\n );\n }\n}\n\nexport default injectIntl(PinnedMessages);\n","// Panel with a chat.\n\nimport React, { Suspense } from 'react';\nimport { FormattedMessage, defineMessages, injectIntl } from 'react-intl';\n\nimport { Drafty, Tinode, TheCard } from 'tinode-sdk';\n\nconst CallPanel = React.lazy(_ => import('../widgets/call-panel.jsx'));\nimport ChatMessage from '../widgets/chat-message.jsx';\nimport ContactBadges from '../widgets/contact-badges.jsx';\nconst DocPreview = React.lazy(_ => import('../widgets/doc-preview.jsx'));\nimport ErrorPanel from '../widgets/error-panel.jsx';\nimport GroupSubs from '../widgets/group-subs.jsx';\nconst ImagePreview = React.lazy(_ => import('../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 MetaMessage from '../widgets/meta-message.jsx';\nimport PinnedMessages from '../widgets/pinned-messages.jsx';\nimport SendMessage from '../widgets/send-message.jsx';\nconst TheCardPreview = React.lazy(_ => import('../widgets/the-card-preview.jsx'));\nconst VideoPreview = React.lazy(_ => import('../widgets/video-preview.jsx'));\n\nimport { DEFAULT_P2P_ACCESS_MODE, EDIT_PREVIEW_LENGTH, IMAGE_PREVIEW_DIM, IMMEDIATE_P2P_SUBSCRIPTION,\n DRAFTY_FR_MIME_TYPE_LEGACY, KEYPRESS_DELAY, MESSAGES_PAGE, MAX_EXTERN_ATTACHMENT_SIZE, MAX_IMAGE_DIM,\n MAX_INBAND_ATTACHMENT_SIZE, READ_DELAY, QUOTED_REPLY_LENGTH, VIDEO_PREVIEW_DIM } from '../config.js';\nimport { CALL_STATE_OUTGOING_INITATED, CALL_STATE_IN_PROGRESS } from '../constants.js';\nimport { blobToBase64, fileToBase64, imageScaled, importVCard, makeImageUrl } from '../lib/blob-helpers.js';\nimport HashNavigation from '../lib/navigation.js';\nimport { bytesToHumanSize, relativeDateFormat, shortDateFormat } from '../lib/strformat.js';\n\n// Run timer with this frequency (ms) for checking notification queue.\nconst NOTIFICATION_EXEC_INTERVAL = 300;\n// Scroll distance before [go to latest message] button is shown.\nconst SHOW_GO_TO_LAST_DIST = 100;\n// Sctoll distance from the top when fetching the page of earlier messages is triggered.\nconst FETCH_PAGE_TRIGGER = 40;\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: {timestamp}',\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 file_attachment_too_large: {\n id: 'file_attachment_too_large',\n defaultMessage: 'The file size {size} exceeds the {limit} limit.',\n description: 'Error message when attachment is too large'\n },\n invalid_content: {\n id: 'invalid_content',\n defaultMessage: 'invalid content',\n description: 'Shown when the message is unreadable'\n },\n editing_message: {\n id: 'editing_message',\n defaultMessage: 'Editing',\n description: 'Title over message editing preview'\n },\n drag_file: {\n id: 'drag_file',\n defaultMessage: 'Drag file here',\n description: 'Prompt on the file drag-n-drop overlay banner'\n },\n self_topic_name: {\n id: 'self_topic_name',\n defaultMessage: 'Saved messages',\n description: 'Name of self topic for UI'\n },\n subscriber_count: {\n id: 'subscriber_count',\n defaultMessage: '{count, plural, ' +\n 'one {{count, number} subscriber} ' +\n 'two {{count, number} subscribers} ' +\n 'three {{count, number} subscribers} ' +\n 'few {{count, number} subscribers} ' +\n 'many {{count, number} subscribers} ' +\n 'other {{count, number} subscribers}}',\n description: 'Count of channel subscribers'\n },\n member_count: {\n id: 'member_count',\n defaultMessage: '{count, plural, ' +\n 'one {{count, number} member} ' +\n 'two {{count, number} members} ' +\n 'three {{count, number} members} ' +\n 'few {{count, number} members} ' +\n 'many {{count, number} members} ' +\n 'other {{count, number} members}}',\n description: 'Count of group topic members'\n },\n cannot_parse_vcard: {\n id: 'cannot_parse_vcard',\n defaultMessage: 'Cannot parse vCard file.',\n description: 'Error message when vCard file cannot be parsed'\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\nfunction shouldPresentCallPanel(callState) {\n // Show call panel if either:\n // - call is outgoing (and the client is waiting for the other side to pick up) or,\n // - call is already in progress.\n return callState == CALL_STATE_OUTGOING_INITATED || callState == CALL_STATE_IN_PROGRESS;\n}\n\nclass MessagesView extends React.Component {\n constructor(props) {\n super(props);\n\n this.state = MessagesView.getDerivedStateFromProps(props, {});\n\n this.componentSetup = this.componentSetup.bind(this);\n this.leave = this.leave.bind(this);\n this.sendMessage = this.sendMessage.bind(this);\n this.retrySend = this.retrySend.bind(this);\n this.sendImageAttachment = this.sendImageAttachment.bind(this);\n this.sendVideoAttachment = this.sendVideoAttachment.bind(this);\n this.sendFileAttachment = this.sendFileAttachment.bind(this);\n this.sendAudioAttachment = this.sendAudioAttachment.bind(this);\n this.sendTheCardAttachment = this.sendTheCardAttachment.bind(this);\n this.sendKeyPress = this.sendKeyPress.bind(this);\n this.subscribe = this.subscribe.bind(this);\n this.handleScrollReference = this.handleScrollReference.bind(this);\n this.mountDnDEvents = this.mountDnDEvents.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.handleMessageUpdate = this.handleMessageUpdate.bind(this);\n this.handleAuxUpdate = this.handleAuxUpdate.bind(this);\n this.handleAllMessagesReceived = this.handleAllMessagesReceived.bind(this);\n this.handleInfoReceipt = this.handleInfoReceipt.bind(this);\n this.handleExpandMedia = this.handleExpandMedia.bind(this);\n this.handleClosePreview = this.handleClosePreview.bind(this);\n this.handleCallPanelToggle = this.handleCallPanelToggle.bind(this);\n this.handleFormResponse = this.handleFormResponse.bind(this);\n this.handleContextClick = this.handleContextClick.bind(this);\n this.handleShowMessageContextMenu = this.handleShowMessageContextMenu.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.handleAttachImageOrVideo = this.handleAttachImageOrVideo.bind(this);\n this.handleCancelUpload = this.handleCancelUpload.bind(this);\n this.postReadNotification = this.postReadNotification.bind(this);\n this.clearNotificationQueue = this.clearNotificationQueue.bind(this);\n this.goToLatestMessage = this.goToLatestMessage.bind(this);\n this.handleFileDrop = this.handleFileDrop.bind(this);\n\n this.handlePickReply = this.handlePickReply.bind(this);\n this.handleEditMessage = this.handleEditMessage.bind(this);\n this.handleCancelReply = this.handleCancelReply.bind(this);\n this.handleQuoteClick = this.handleQuoteClick.bind(this);\n this.handleUnpinMessage = this.handleUnpinMessage.bind(this);\n this.handleCallHangup = this.handleCallHangup.bind(this);\n\n this.isDragEnabled = this.isDragEnabled.bind(this);\n this.handleDragStart = this.handleDragStart.bind(this);\n this.handleDragIn = this.handleDragIn.bind(this);\n this.handleDragOut = this.handleDragOut.bind(this);\n this.handleDrag = this.handleDrag.bind(this);\n this.handleDrop = this.handleDrop.bind(this);\n\n this.chatMessageRefs = [];\n this.getOrCreateMessageRef = this.getOrCreateMessageRef.bind(this);\n this.getVisibleMessageRange = this.getVisibleMessageRange.bind(this);\n\n // Keeps track of the drag event.\n // Need a counter b/c the browser's 'drag' events may fire multiple times\n // when the user takes the mouse pointer over the container:\n // for the component itself and for all nested/child elements.\n this.dragCounter = 0;\n this.dndRef = null;\n\n this.readNotificationQueue = [];\n this.readNotificationTimer = null;\n\n this.keyPressTimer = null;\n }\n\n getOrCreateMessageRef(seqId) {\n if (this.chatMessageRefs[seqId]) {\n return this.chatMessageRefs[seqId];\n }\n const ref = React.createRef();\n this.chatMessageRefs[seqId] = ref;\n return ref;\n }\n\n getVisibleMessageRange(holderRect) {\n let min = Number.MAX_SAFE_INTEGER, max = -1;\n let visibilityStatus = false;\n this.chatMessageRefs.every((ref, seq) => {\n if (ref.current) {\n const { top, bottom, height } = ref.current.getBoundingClientRect();\n const visible = top <= holderRect.top ? holderRect.top - top <= height : bottom - holderRect.bottom <= height;\n if (visible) {\n visibilityStatus = true;\n min = Math.min(min, seq);\n max = Math.max(max, seq);\n } else if (visibilityStatus) {\n // The remaining elements are no longer visible, no need to iterate them.\n return false;\n }\n }\n return true;\n });\n\n return max >= min ? {min: min, max: max} : {min: 0, max: 0};\n }\n\n componentDidMount() {\n if (this.messagesScroller) {\n this.messagesScroller.addEventListener('scroll', this.handleScrollEvent);\n }\n\n // Drag and drop events\n this.mountDnDEvents(this.dndRef);\n\n this.componentSetup({}, {});\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 // Drag and drop events\n if (this.dndRef) {\n this.dndRef.removeEventListener('dragstart', this.handleDragStart);\n this.dndRef.removeEventListener('dragenter', this.handleDragIn);\n this.dndRef.removeEventListener('dragleave', this.handleDragOut);\n this.dndRef.removeEventListener('dragover', this.handleDrag);\n this.dndRef.removeEventListener('drop', this.handleDrop);\n }\n }\n\n componentDidUpdate(prevProps, prevState) {\n // Scroll last message into view on component update e.g. on message received\n // or vertical shrinking.\n if (this.messagesScroller &&\n (prevState.topic != this.state.topic || prevState.maxSeqId != this.state.maxSeqId ||\n prevState.minSeqId != this.state.minSeqId)) {\n // New message.\n if (this.state.scrollPosition < SHOW_GO_TO_LAST_DIST) {\n this.messagesScroller.scrollTop = this.messagesScroller.scrollHeight -\n this.state.scrollPosition - this.messagesScroller.offsetHeight;\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 this.componentSetup(prevProps, prevState);\n }\n\n componentSetup(prevProps, prevState) {\n const topic = this.props.tinode ? this.props.tinode.getTopic(this.state.topic) : undefined;\n if (this.state.topic != prevState.topic) {\n if (prevState.topic && !Tinode.isNewGroupTopicName(prevState.topic)) {\n this.leave(prevState.topic);\n if (prevState.rtcPanel) {\n this.handleCallHangup(prevState.topic, prevProps.callSeq);\n }\n }\n\n if (topic) {\n topic.onData = this.handleMessageUpdate;\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 topic.onAuxUpdated = this.handleAuxUpdate;\n }\n }\n\n if (topic) {\n if ((this.state.topic != prevState.topic) || (this.props.myUserId && !prevProps.myUserId)) {\n // Don't immediately subscribe to a new p2p topic, wait for the first message.\n const newTopic = (this.props.newTopicParams && this.props.newTopicParams._topicName == this.props.topic);\n if (topic.isP2PType() && newTopic && !IMMEDIATE_P2P_SUBSCRIPTION) {\n topic.getMeta(topic.startMetaQuery().withDesc().build());\n } else if (this.props.myUserId) {\n this.subscribe(topic);\n }\n } else if (topic.isSubscribed() && this.state.isReader && !prevState.isReader) {\n // If reader status has changed and data became available.\n topic.getMeta(topic.startMetaQuery().withLaterData().build());\n } else if (!topic.isSubscribed() && this.props.ready && !prevProps.ready) {\n // Connection restored (e.g. wake from sleep): resubscribe to the currently open topic.\n this.subscribe(topic);\n }\n }\n }\n\n static getDerivedStateFromProps(nextProps, prevState) {\n let nextState = {};\n if (!nextProps.topic) {\n // Default state: no topic.\n nextState = {\n minSeqId: -1,\n maxSeqId: -1,\n latestClearId: -1,\n onlineSubs: [],\n topic: null,\n title: '',\n avatar: null,\n isVerified: false,\n isStaff: false,\n isDangerous: false,\n deleted: false,\n docPreview: null,\n imagePreview: null,\n imagePostview: null,\n videoPreview: null,\n videoPostview: null,\n rtcPanel: null,\n minimizedCallPanel: false,\n typingIndicator: false,\n scrollPosition: 0,\n fetchingMessages: false,\n peerMessagingDisabled: false,\n channel: false,\n reply: null,\n contentToEdit: null,\n showGoToLastButton: false,\n dragging: false,\n pins: [],\n pinsLoaded: false,\n selectedPin: 0,\n subsVersion: 0\n };\n } else if (nextProps.topic != prevState.topic) {\n const topic = nextProps.tinode.getTopic(nextProps.topic);\n\n nextState = {\n topic: nextProps.topic,\n deleted: topic._deleted,\n docPreview: null,\n imagePreview: null,\n imagePostview: null,\n videoPreview: null,\n videoPostview: null,\n rtcPanel: null,\n minimizedCallPanel: false,\n typingIndicator: false,\n scrollPosition: 0,\n fetchingMessages: false,\n showGoToLastButton: false,\n contentToEdit: null,\n dragging: false,\n selectedPin: 0\n };\n\n if (nextProps.forwardMessage) {\n if (nextProps.forwardMessage.content) {\n const content = nextProps.forwardMessage.content;\n const size = content?.length || (content?.size || 0);\n nextState.docPreview = {\n object: content,\n type: nextProps.forwardMessage.type,\n size: size\n };\n } else {\n // We are forwarding a message. Show preview.\n nextState.reply = {\n content: nextProps.forwardMessage.preview,\n seq: null\n };\n }\n } else {\n nextState.reply = null;\n }\n\n if (topic) {\n // Topic exists.\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 Object.assign(nextState, {\n onlineSubs: subs\n });\n\n if (topic.isSelfType()) {\n Object.assign(nextState, {\n title: nextProps.intl.formatMessage(messages.self_topic_name),\n avatar: true\n });\n } else 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 minSeqId: topic.minMsgSeq(),\n maxSeqId: topic.maxMsgSeq(),\n latestClearId: topic.maxClearId(),\n channel: topic.isChannelType(),\n pins: (topic.aux('pins') || []).slice(),\n pinsLoaded: false\n });\n\n if (nextProps.callTopic == topic.name && shouldPresentCallPanel(nextProps.callState)) {\n nextState.rtcPanel = nextProps.callTopic;\n }\n } else {\n // Invalid topic.\n Object.assign(nextState, {\n minSeqId: -1,\n maxSeqId: -1,\n latestClearId: -1,\n onlineSubs: [],\n title: '',\n avatar: null,\n peerMessagingDisabled: false,\n channel: false,\n pins: [],\n pinsLoaded: false\n });\n }\n } else {\n // We are still in same topic. Show the call panel if necessary.\n if (nextProps.callTopic == prevState.topic && !prevState.rtcPanel &&\n shouldPresentCallPanel(nextProps.callState)) {\n nextState.rtcPanel = nextProps.callTopic;\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.isAdmin() != prevState.isAdmin) {\n nextState.isAdmin = !prevState.isAdmin;\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.isAdmin) {\n nextState.isAdmin = 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 subscribe(topic) {\n if (topic.isSubscribed() || !this.props.ready) {\n return;\n }\n\n // Is this a new topic?\n const newTopic = (this.props.newTopicParams && this.props.newTopicParams._topicName == this.props.topic);\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().withLaterSub().withAux();\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\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 if (this.state.deleted) {\n this.setState({deleted: false});\n }\n this.props.onNewTopicCreated(this.props.topic, ctrl.topic);\n // If there are unsent messages (except hard-failed and video call messages),\n // try sending them now. Hard-failed and unsent video call messages will be dropped.\n let discard = [];\n topic.queuedMessages(pub => {\n if (pub._sending) {\n return;\n }\n if (pub._fatal || (pub.head && pub.head.webrtc)) {\n // Filter out unsent failed & video call messages.\n discard.push(pub.seq);\n return;\n }\n if (topic.isSubscribed()) {\n this.retrySend(pub);\n }\n });\n if (discard.length > 0) {\n topic.delMessagesList(discard, true);\n }\n })\n .catch(err => {\n console.error(\"Failed subscription to\", this.state.topic, err);\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 leave(oldTopicName) {\n if (!oldTopicName || !this.props.tinode.isTopicCached(oldTopicName)) {\n return;\n }\n\n const 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 oldTopic.onAuxUpdated = undefined;\n });\n }\n }\n\n // Don't use React.createRef as the ref.current is not available in componentDidMount in this component.\n handleScrollReference(node) {\n if (node) {\n node.addEventListener('scroll', this.handleScrollEvent);\n this.messagesScroller = node;\n this.messagesScroller.scrollTop = this.messagesScroller.scrollHeight -\n this.state.scrollPosition - this.messagesScroller.offsetHeight;\n }\n }\n\n // Get older messages and show/hide [go to latest message] button.\n handleScrollEvent(event) {\n const pos = event.target.scrollHeight - event.target.scrollTop - event.target.offsetHeight;\n this.setState({\n scrollPosition: pos,\n // Show [go to latest message] if far enough from bottom and scrolling down.\n showGoToLastButton: (pos > SHOW_GO_TO_LAST_DIST) && (pos < this.state.scrollPosition),\n });\n\n if (this.state.fetchingMessages || this.processingScrollEvent) {\n return;\n }\n\n if (event.target.scrollTop <= FETCH_PAGE_TRIGGER) {\n const topic = this.props.tinode.getTopic(this.state.topic);\n if (topic && topic.isSubscribed()) {\n this.processingScrollEvent = true;\n const {min, max} = this.getVisibleMessageRange(event.target.getBoundingClientRect());\n const gaps = topic.msgHasMoreMessages(min, max, false);\n if (gaps.length > 0) {\n this.setState({fetchingMessages: true}, _ => {\n topic.getMessagesPage(MESSAGES_PAGE, gaps, min, max)\n .catch(err => this.props.onError(err.message, 'err'))\n .finally(_ => this.setState({fetchingMessages: false}));\n });\n }\n }\n }\n this.processingScrollEvent = false;\n }\n\n /* Mount drag and drop events */\n mountDnDEvents(dnd) {\n if (dnd) {\n dnd.addEventListener('dragstart', this.handleDragStart);\n dnd.addEventListener('dragenter', this.handleDragIn);\n dnd.addEventListener('dragleave', this.handleDragOut);\n dnd.addEventListener('dragover', this.handleDrag);\n dnd.addEventListener('drop', this.handleDrop);\n this.dndRef = dnd;\n }\n }\n\n goToLatestMessage() {\n this.setState({scrollPosition: 0});\n if (this.messagesScroller) {\n this.messagesScroller.scrollTop = this.messagesScroller.scrollHeight - this.messagesScroller.offsetHeight;\n }\n }\n\n handleDescChange(desc) {\n if (Tinode.isSelfTopicName(this.props.topic)) {\n this.setState({\n title: this.props.intl.formatMessage(messages.self_topic_name),\n avatar: true\n });\n } else 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 isAdmin: desc.acs.isAdmin(),\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 or topic is not yet available.\n if (!this.props.applicationVisible || !this.state.topic) {\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 if (n.seq == 0 || Tinode.isServerAssignedSeq(n.seq)) {\n seq = Math.max(seq, n.seq);\n }\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 try {\n topic.noteRead(seq);\n } catch (err) {\n console.error(\"Failed to send read notification\", err);\n }\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, subsVersion: this.state.subsVersion + 1};\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 // The 'msg' could be false-ish if some message ranges were deleted.\n handleMessageUpdate(msg) {\n if (!this.state.topic) {\n return;\n }\n const topic = this.props.tinode.getTopic(this.state.topic);\n if (!msg) {\n // msg could be null if one or more messages were deleted.\n // Updating state to force redraw.\n this.setState({latestClearId: topic.maxClearId()});\n return;\n }\n\n clearTimeout(this.keyPressTimer)\n this.setState({maxSeqId: topic.maxMsgSeq(), minSeqId: topic.minMsgSeq(), typingIndicator: false}, _ => {\n // Scroll to the bottom if the message is added to the end of the message\n // list if already at the bottom, otherwise show [go to latest] button.\n // Implemented as a callback to be sure the scroll height has been updated.\n if (topic.isNewMessage(msg.seq)) {\n if (this.state.scrollPosition > SHOW_GO_TO_LAST_DIST) {\n this.setState({showGoToLastButton: true});\n } else {\n this.goToLatestMessage();\n }\n } else {\n if (this.messagesScroller) {\n this.messagesScroller.scrollTop = this.messagesScroller.scrollHeight - this.state.scrollPosition -\n this.messagesScroller.offsetHeight;\n }\n }\n });\n\n // Aknowledge messages except own messages. They are\n // automatically assumed to be read and recived.\n const status = topic.msgStatus(msg, true);\n if (status >= Tinode.MESSAGE_STATUS_SENT && msg.from != this.props.myUserId) {\n this.postReadNotification(msg.seq);\n }\n }\n\n handleAllMessagesReceived(count) {\n this.setState({fetchingMessages: false});\n if (!count) {\n // All messages received. Nothing left to receive.\n const topic = this.props.tinode.getTopic(this.state.topic);\n if (topic) {\n // Send read notification for the absolute last message.\n this.postReadNotification(topic.seq);\n }\n return;\n }\n\n // Load pinned message too (if any);\n if (!this.state.pinsLoaded) {\n // This needs to be guarded to avoid an infinite loop.\n // The loop may happen if some pinned messages are deleted.\n const topic = this.props.tinode.getTopic(this.state.topic);\n this.setState({pinsLoaded: true}, _ => {\n topic.getPinnedMessages();\n });\n } else {\n this.setState({pinsLoaded: false});\n }\n }\n\n handleAuxUpdate(aux) {\n const pins = (aux['pins'] || []).slice();\n let selectedPin = this.state.selectedPin;\n if (pins.length > this.state.pins.length) {\n // New pins added, show the latest.\n selectedPin = 0;\n } else if (selectedPin >= pins.length) {\n selectedPin = Math.max(0, pins.length - 1);\n }\n this.setState({pins: pins, selectedPin: selectedPin});\n }\n\n handleInfoReceipt(info) {\n switch (info.what) {\n case 'kp': {\n clearTimeout(this.keyPressTimer);\n this.keyPressTimer = setTimeout(_ => this.setState({typingIndicator: false}), 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.info(\"Other change in topic: \", info.what);\n }\n }\n\n handleExpandMedia(content) {\n if (!content) {\n return;\n }\n\n if (content.video) {\n this.setState({videoPostview: content});\n } else {\n this.setState({imagePostview: content});\n }\n }\n\n handleClosePreview() {\n if (this.state.imagePreview && this.state.imagePreview.url) {\n URL.revokeObjectURL(this.state.imagePreview.url);\n }\n if (this.state.videoPreview && this.state.videoPreview.url) {\n URL.revokeObjectURL(this.state.videoPreview.url);\n }\n this.setState({\n imagePostview: null,\n imagePreview: null,\n docPreview: null,\n videoPreview: null,\n videoPostview: null,\n });\n this.props.onCancelForwardMessage();\n }\n\n handleFormResponse(action, text, data) {\n if (action == 'pub') {\n this.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'].forEach(key => {\n if (data[key]) {\n params.set(key, data[key]);\n }\n });\n params.set('uid', this.props.myUserId);\n params.set('topic', this.state.topic);\n url.search = params;\n window.open(url, '_blank');\n } else {\n console.info(\"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 handleShowMessageContextMenu(params, messageSpecificMenuItems) {\n if (params.userFrom == 'chan') {\n params.userFrom = this.state.topic;\n params.userName = this.state.title;\n }\n params.topicName = this.state.topic;\n const menuItems = messageSpecificMenuItems || [];\n const topic = this.props.tinode.getTopic(params.topicName);\n if (topic) {\n // Self -> (1) always hard-delete with [Delete] title.\n // P2P -> (1) hard-delete if allowed and not too old, (2) always soft-delete.\n // Group -> (1) hard-delete if allowed and not too old or owner, (2) always soft-delete.\n if (topic.isSelfType()) {\n // Hard-delete with plain [Delete] title.\n menuItems.push('message_delete_generic');\n } else {\n if (!topic.isChannelType()) {\n // P2P or normal group: always allow to soft-delete.\n menuItems.push('message_delete');\n }\n\n const acs = topic.getAccessMode();\n if (acs && acs.isDeleter()) {\n // Owner can always hard-delete regardless of age.\n let canDelete = acs.isOwner();\n if (!canDelete) {\n // Not owner: check message age if configured on the server.\n const maxDelAge = this.props.tinode.getServerParam(Tinode.MSG_DELETE_AGE, 0) | 0;\n // Make sure the message is not too old. This check is here just to make the UI\n // more user-friendly. The server will enforce the limit regardless of this.\n canDelete = maxDelAge == 0 || (maxDelAge > 0 && params.timestamp ?\n params.timestamp.getTime() > (new Date().getTime() - maxDelAge * 1000) : false);\n }\n if (canDelete) {\n // [Delete for All] title.\n menuItems.push('message_delete_hard');\n }\n }\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(audio) {\n const topic = this.props.tinode.getTopic(this.state.topic);\n if (topic.isSubscribed()) {\n if (audio) {\n topic.noteRecording(true);\n } else {\n topic.noteKeyPress();\n }\n }\n }\n\n // sendMessage sends the message with an optional subscription to topic first.\n sendMessage(msg, uploadCompletionPromise, uploader) {\n let head;\n if (!msg && this.props.forwardMessage) {\n // We are forwarding a message.\n msg = this.props.forwardMessage.msg;\n head = this.props.forwardMessage.head;\n this.handleCancelReply();\n } else if (this.state.reply) {\n if (this.state.reply.editing) {\n if (msg == this.state.contentToEdit) {\n // Message unchanged.\n this.handleCancelReply();\n return;\n }\n // Editing an existing message.\n head = {replace: ':' + this.state.reply.seq};\n } else if (this.state.reply.content) {\n // Replying to a message in this topic.\n // Turn it into Drafty so we can make a quoted Drafty object later.\n head = {reply: '' + this.state.reply.seq};\n if (typeof msg == 'string') {\n msg = Drafty.parse(msg);\n }\n msg = Drafty.append(Drafty.sanitizeEntities(this.state.reply.content), msg);\n }\n this.handleCancelReply();\n }\n this.props.sendMessage(msg, uploadCompletionPromise, uploader, head);\n }\n\n // Retry sending a message.\n retrySend(pub) {\n this.props.sendMessage(pub.content, undefined, undefined, pub.head)\n .then(_ => {\n // All good. Remove the original message draft from the cache.\n const topic = this.props.tinode.getTopic(this.state.topic);\n topic.delMessagesList([pub.seq], true);\n });\n }\n\n // sendFileAttachment sends the file 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.getServerParam('maxMessageSize',\n MAX_INBAND_ATTACHMENT_SIZE) * 0.75 - 1024) | 0;\n\n if (TheCard.isFileSupported(file.type, file.name) || file.type == TheCard.contentType) {\n // This is a vCard file, try to convert and send as TheCard.\n if (this.sendTheCardAttachment(file, maxInbandAttachmentSize)) {\n // Successfully sent as TheCard.\n return;\n }\n // Sending as TheCard failed, fall through to sending as generic file attachment.\n }\n\n // If the attachment is a JSON file, then use 'application/octet-stream' instead of 'application/json'.\n // This is a temporary workaround for the collision with the 'application/json' MIME type of form responses.\n // Remove this code in 2026 or so.\n const jsonMimeConverter = (fileType) => fileType === DRAFTY_FR_MIME_TYPE_LEGACY ? 'application/octet-stream' : fileType;\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: jsonMimeConverter(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.sendMessage(msg, uploadCompletionPromise, uploader);\n } else {\n // Small enough to send inband.\n fileToBase64(file)\n .then(b64 => this.sendMessage(Drafty.attachFile(null, {\n mime: jsonMimeConverter(b64.mime),\n data: b64.bits,\n filename: b64.name,\n size: file.size\n })))\n .catch(err => this.props.onError(err.message, 'err'));\n }\n }\n\n // Convert attached vCard to TheCard and send.\n sendTheCardAttachment(file, maxInbandAttachmentSize) {\n if (file.size > maxInbandAttachmentSize) {\n // Cannot convert to TheCard, send as a generic file attachment instead.\n return false;\n }\n\n if (file.type == TheCard.contentType) {\n // Already TheCard, no need to convert.\n this.sendMessage(Drafty.appendTheCard(null, file.object));\n return true;\n }\n\n importVCard(file)\n .then(card => {\n this.sendMessage(Drafty.appendTheCard(null, card));\n })\n .catch(err => {\n this.props.onError(this.props.intl.formatMessage(messages.cannot_parse_vcard, {error: err.message}), 'err');\n });\n return true;\n }\n\n // handleAttachFile method is called when [Attach file] button is clicked: launch attachment preview.\n handleAttachFile(file) {\n const maxExternAttachmentSize = this.props.tinode.getServerParam('maxFileUploadSize', MAX_EXTERN_ATTACHMENT_SIZE);\n\n if (file.size > maxExternAttachmentSize) {\n // Too large.\n this.props.onError(this.props.intl.formatMessage(messages.file_attachment_too_large,\n {size: bytesToHumanSize(file.size), limit: bytesToHumanSize(maxExternAttachmentSize)}), 'err');\n } else {\n this.setState({\n docPreview: {\n file: file,\n name: file.name,\n size: file.size,\n type: file.type\n }\n });\n }\n }\n\n handleCallHangup(topic, seq) {\n this.props.onVideoCallClosed();\n this.setState({\n rtcPanel: null\n });\n this.props.onCallHangup(topic, seq);\n }\n\n handleCallPanelToggle() {\n this.setState({minimizedCallPanel: !this.state.minimizedCallPanel});\n }\n\n // sendImageAttachment sends the image bits as Drafty message.\n sendImageAttachment(caption, blob) {\n const mime = this.state.imagePreview.mime;\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.getServerParam('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 // Convert tiny image into base64 for serialization and previewing.\n .then(scaled => blobToBase64(scaled.blob))\n .then(b64 => {\n let msg = Drafty.insertImage(null, 0, {\n mime: mime,\n _tempPreview: b64.bits, // This preview will not be serialized.\n bits: b64.bits, // Image thumbnail.\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.parse(caption));\n }\n // Pass data and the uploader to the TinodeWeb.\n this.sendMessage(msg, uploadCompletionPromise, uploader);\n })\n .catch(err => this.props.onError(err, 'err'));\n return;\n }\n\n // Send the image inband if it's not too big. The image has been scaled already\n // in image preview.\n blobToBase64(blob)\n .then(b64 => {\n let msg = Drafty.insertImage(null, 0, {\n mime: b64.mime,\n bits: b64.bits,\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.parse(caption));\n }\n this.sendMessage(msg);\n });\n }\n\n // sendVideoAttachment sends the video bits as Drafty message.\n sendVideoAttachment(caption, videoBlob, previewBlob, params) {\n const width = params.width;\n const height = params.height;\n\n // Server-provided limit reduced for base64 encoding and overhead.\n const maxInbandAttachmentSize = (this.props.tinode.getServerParam('maxMessageSize',\n MAX_INBAND_ATTACHMENT_SIZE) * 0.75 - 1024) | 0;\n\n const uploads = [];\n let uploader;\n if ((videoBlob.size + previewBlob.size) > maxInbandAttachmentSize) {\n // One or both are too large to send inband. Uploading out of band and sending as a link.\n uploader = this.props.tinode.getLargeFileHelper();\n if (!uploader) {\n this.props.onError(this.props.intl.formatMessage(messages.cannot_initiate_upload));\n return;\n }\n\n uploads[0] = videoBlob.size > maxInbandAttachmentSize * 0.675 ? uploader.upload(videoBlob) : null;\n uploads[1] = previewBlob.size > maxInbandAttachmentSize * 0.275 ? uploader.upload(previewBlob) : null;\n }\n\n if (uploads.length == 0) {\n // Both video and preview are small enough to send inband.\n Promise.all([blobToBase64(videoBlob), blobToBase64(previewBlob)])\n .then(b64s => {\n const [v64, i64] = b64s;\n let msg = Drafty.insertVideo(null, 0, {\n mime: v64.mime,\n bits: v64.bits,\n preview: i64.bits,\n premime: i64.mime,\n width: width,\n height: height,\n duration: params.duration,\n filename: params.name,\n size: videoBlob.size\n });\n if (caption) {\n msg = Drafty.appendLineBreak(msg);\n msg = Drafty.append(msg, Drafty.parse(caption));\n }\n this.sendMessage(msg);\n });\n return;\n }\n\n const uploadCompletionPromise = Promise.all(uploads);\n\n const b64conv = [];\n // Small video converted to base64.\n b64conv[0] = uploads[0] ? null : blobToBase64(videoBlob);\n // Full-size preview fits inline.\n b64conv[1] = uploads[1] ? null : imageScaled(previewBlob, MAX_IMAGE_DIM, MAX_IMAGE_DIM, -1, false)\n .then(scaled => blobToBase64(scaled.blob));\n // Small preview to show while uploading.\n b64conv[2] = imageScaled(previewBlob, VIDEO_PREVIEW_DIM, VIDEO_PREVIEW_DIM, -1, false)\n .then(scaled => blobToBase64(scaled.blob));\n // Convert tiny image into base64 for serialization and previewing.\n Promise.all(b64conv)\n .then(b64s => {\n const [video, img, preview] = b64s;\n let msg = Drafty.insertVideo(null, 0, {\n mime: params.mime,\n bits: video ? video.bits : null,\n _tempPreview: preview.bits,\n preview: img ? img.bits : preview.bits,\n premime: img ? img.mime : preview.mime,\n width: width,\n height: height,\n duration: params.duration,\n filename: params.name,\n size: videoBlob.size,\n urlPromise: uploadCompletionPromise\n });\n\n if (caption) {\n msg = Drafty.appendLineBreak(msg);\n msg = Drafty.append(msg, Drafty.parse(caption));\n }\n // Pass data and the uploader to the TinodeWeb.\n this.sendMessage(msg, uploadCompletionPromise, uploader);\n })\n .catch(err => this.props.onError(err.message, 'err'));\n }\n\n // handleAttachImageOrVideo method is called when [Attach image or video] button is clicked: launch image or video preview.\n handleAttachImageOrVideo(file) {\n const maxExternAttachmentSize = this.props.tinode.getServerParam('maxFileUploadSize', MAX_EXTERN_ATTACHMENT_SIZE);\n\n if (file.type.startsWith('video/')) {\n this.setState({videoPreview: {\n url: URL.createObjectURL(file),\n blob: file,\n filename: file.name,\n size: file.size,\n mime: file.type\n }});\n return;\n }\n\n // Get image dimensions and size, optionally scale it down.\n imageScaled(file, MAX_IMAGE_DIM, MAX_IMAGE_DIM, maxExternAttachmentSize, false)\n .then(scaled => {\n this.setState({imagePreview: {\n url: URL.createObjectURL(scaled.blob),\n blob: scaled.blob,\n filename: scaled.name,\n width: scaled.width,\n height: scaled.height,\n size: scaled.blob.size,\n mime: scaled.mime\n }});\n }).catch(err => {\n this.props.onError(err.message, 'err');\n });\n }\n\n // handleFileDrop is called when the user drags & drops a file upon the message view.\n handleFileDrop(files) {\n if (!files || files.length == 0) {\n return;\n }\n const file = files[0];\n if (file.type && file.type.startsWith('image/')) {\n this.handleAttachImageOrVideo(file);\n } else {\n this.handleAttachFile(file);\n }\n }\n\n // sendAudioAttachment sends audio bits inband as Drafty message (no preview).\n sendAudioAttachment(url, preview, duration) {\n fetch(url)\n .then(result => result.blob())\n .then(blob => {\n // Server-provided limit reduced for base64 encoding and overhead.\n const maxInbandAttachmentSize = this.props.tinode.getServerParam('maxMessageSize', MAX_INBAND_ATTACHMENT_SIZE) * 0.75 - 1024;\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 const msg = Drafty.appendAudio(null, {\n mime: blob.type,\n size: blob.size,\n duration: duration,\n preview: preview,\n urlPromise: uploadCompletionPromise\n });\n // Pass data and the uploader to the TinodeWeb.\n this.sendMessage(msg, uploadCompletionPromise, uploader);\n } else {\n // Small enough to send inband.\n blobToBase64(blob)\n .then(b64 => {\n this.sendMessage(Drafty.appendAudio(null, {\n mime: b64.mime,\n bits: b64.bits,\n size: blob.size,\n duration: duration,\n preview: preview,\n }))\n })\n }\n })\n .catch(err => {this.props.onError(err.message, 'err')});;\n }\n\n handleCancelUpload(seq, uploader) {\n const topic = this.props.tinode.getTopic(this.state.topic);\n const found = topic.findMessage(seq);\n if (found) {\n found._cancelled = true;\n }\n uploader.cancel();\n }\n\n // seq: seq ID of the source message\n // context: message content.\n // senderId: UID of the sender of the source message.\n // senderName: full name of the sender of the original message.\n handlePickReply(seq, content, senderId, senderName) {\n if (!seq || !content) {\n this.setState({reply: null});\n return;\n }\n\n content = typeof content == 'string' ? Drafty.init(content) : content;\n if (Drafty.isValid(content)) {\n content = Drafty.replyContent(content, QUOTED_REPLY_LENGTH);\n } else {\n // /!\\ invalid content.\n content = Drafty.append(Drafty.init('\\u26A0 '),\n Drafty.wrapInto(this.props.intl.formatMessage(messages.invalid_content), 'EM'));\n }\n\n this.setState({\n reply: {\n content: Drafty.quote(senderName, senderId, content),\n seq: seq\n }\n });\n this.props.onCancelForwardMessage();\n }\n\n // seq: seq ID of the message to edit.\n // context: message content.\n handleEditMessage(seq, content) {\n if (!seq || !content) {\n this.setState({reply: null});\n return;\n }\n\n content = typeof content == 'string' ? Drafty.init(content) : content;\n const editable = Drafty.toMarkdown(content);\n if (Drafty.isValid(content)) {\n content = Drafty.replyContent(content, EDIT_PREVIEW_LENGTH);\n } else {\n // /!\\ invalid content.\n content = Drafty.append(Drafty.init('\\u26A0 '),\n Drafty.wrapInto(this.props.intl.formatMessage(messages.invalid_content), 'EM'));\n }\n\n this.setState({\n reply: {\n content: Drafty.quote(this.props.intl.formatMessage(messages.editing_message), null, content),\n seq: seq,\n editing: true\n },\n contentToEdit: editable\n });\n this.props.onCancelForwardMessage();\n }\n\n\n handleCancelReply() {\n this.setState({reply: null, contentToEdit: null});\n this.props.onCancelForwardMessage();\n }\n\n handleQuoteClick(replyToSeq) {\n const ref = this.getOrCreateMessageRef(replyToSeq);\n if (ref && ref.current) {\n ref.current.scrollIntoView({block: \"center\", behavior: \"smooth\"});\n ref.current.classList.add('flash');\n setTimeout(_ => {ref.current.classList.remove('flash')} , 1000);\n } else {\n console.error(\"Unresolved message ref\", replyToSeq);\n }\n }\n\n handleUnpinMessage(seq) {\n const topic = this.props.tinode.getTopic(this.state.topic);\n topic.pinMessage(seq, false);\n }\n\n isDragEnabled() {\n return this.state.isWriter && !this.state.unconfirmed && !this.props.forwardMessage && !this.state.peerMessagingDisabled;\n }\n\n handleDragStart(e) {\n e.preventDefault();\n e.stopPropagation();\n e.dataTransfer.clearData();\n }\n\n handleDragIn(e) {\n e.preventDefault();\n e.stopPropagation();\n this.dragCounter++;\n if (e.dataTransfer.items && e.dataTransfer.items.length > 0) {\n this.setState({dragging: true});\n }\n }\n\n handleDragOut(e) {\n e.preventDefault();\n e.stopPropagation();\n this.dragCounter--;\n if (this.dragCounter <= 0) {\n this.setState({dragging: false});\n }\n }\n\n handleDrag(e) {\n e.preventDefault();\n e.stopPropagation();\n }\n\n handleDrop(e) {\n e.preventDefault();\n e.stopPropagation();\n this.setState({dragging: false});\n if (this.isDragEnabled() && e.dataTransfer.files && e.dataTransfer.files.length > 0) {\n this.handleFileDrop(e.dataTransfer.files);\n this.dragCounter = 0;\n }\n }\n\n render() {\n const {formatMessage} = this.props.intl;\n\n // P2P call is an overlay, not a separate component because it cannot be\n // re-mounted between full screen/minimized.\n const overlay = this.state.rtcPanel &&\n }>\n \n ;\n\n let component;\n if (!this.state.topic) {\n component = ;\n\n } else {\n let component2;\n if (this.state.imagePreview) {\n // Preview image before sending.\n component2 = (\n }>\n \n \n );\n } else if (this.state.videoPreview) {\n // Preview video.\n component2 = }>\n \n ;\n\n } else if (this.state.imagePostview) {\n // Expand received image.\n component2 = }>\n \n ;\n\n } else if (this.state.videoPostview) {\n // Play received video.\n component2 = }>\n \n ;\n\n } else if (this.state.docPreview) {\n // Preview attachment before sending.\n if (TheCard.isFileSupported(this.state.docPreview.type, this.state.docPreview.name) ||\n this.state.docPreview.type == TheCard.contentType) {\n component2 = }>\n \n ;\n } else {\n component2 = }>\n \n ;\n }\n } else {\n const topic = this.props.tinode.getTopic(this.state.topic);\n const isChannel = topic.isChannelType() || topic.chan;\n const groupTopic = topic.isGroupType() && !isChannel;\n const icon_badges = [];\n if (topic.trusted) {\n if (topic.trusted.verified) {\n icon_badges.push({icon: 'verified', color: 'badge-inv'});\n }\n if (topic.trusted.staff) {\n icon_badges.push({icon: 'staff', color: 'badge-inv'});\n }\n if (topic.trusted.danger) {\n icon_badges.push({icon: 'dangerous', color: 'badge-inv'});\n }\n }\n\n const pinnedMessages = [];\n this.state.pins.forEach(seq => pinnedMessages.push(topic.latestMsgVersion(seq) || topic.findMessage(seq)));\n\n const messageNodes = [];\n let previousFrom = null;\n let prevDate = null;\n let chatBoxClass = null;\n topic.messages((msg, prev, next, i) => {\n let nextFrom = next ? (next.from || 'chan') : null;\n\n let sequence = 'single';\n let thisFrom = msg.from || 'chan';\n if (thisFrom == previousFrom) {\n if (thisFrom == nextFrom) {\n sequence = 'middle';\n } else {\n sequence = 'last';\n }\n } else if (thisFrom == nextFrom) {\n sequence = 'first';\n }\n previousFrom = thisFrom;\n\n const isReply = !(thisFrom == this.props.myUserId);\n const deliveryStatus = topic.msgStatus(msg, true);\n\n let userFrom = thisFrom, userName, userAvatar;\n const user = topic.userDesc(thisFrom);\n if (user && user.public) {\n userName = user.public.fn;\n userAvatar = makeImageUrl(user.public.photo);\n }\n chatBoxClass = groupTopic ? 'chat-box group' : 'chat-box';\n\n // Ref for this chat message.\n const ref = this.getOrCreateMessageRef(msg.seq);\n let replyToSeq = msg.head ? parseInt(msg.head.reply) : null;\n if (!replyToSeq || isNaN(replyToSeq)) {\n replyToSeq = null;\n }\n\n if (msg.hi) {\n // Deleted message.\n messageNodes.push(\n \n );\n } else {\n const thisDate = new Date(msg.ts);\n // This message was sent on a different date than the previous.\n if (!prevDate || prevDate.toDateString() != thisDate.toDateString()) {\n messageNodes.push(\n \n );\n prevDate = thisDate;\n }\n messageNodes.push(\n \n );\n }\n });\n\n let lastSeen = null;\n if (isChannel) {\n if (topic.subcnt) {\n lastSeen = formatMessage(messages.subscriber_count, {count: topic.subcnt});\n }\n } else {\n const cont = this.props.tinode.getMeTopic().getContact(this.state.topic);\n if (cont) {\n if (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 {timestamp: shortDateFormat(cont.seen.when, this.props.intl.locale)});\n // TODO: also handle user agent in c.seen.ua\n }\n } else if (Tinode.isGroupTopicName(cont.topic)) {\n if (topic.subcnt) {\n lastSeen = formatMessage(messages.member_count, {count: topic.subcnt});\n }\n }\n }\n }\n const avatar = this.state.avatar || true;\n const online = this.state.deleted || topic.isSelfType() ? null :\n this.props.online ? 'online' + (this.state.typingIndicator ? ' typing' : '') : 'offline';\n\n const titleClass = 'panel-title' + (this.state.deleted ? ' deleted' : '');\n const darkModeClass = this.props.colorSchema == 'dark' ? 'dark' : '';\n\n let messagesComponent = (\n <>\n \n
\n arrow_downward \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 : null}\n {this.state.unconfirmed ?\n \n :\n }\n >\n );\n\n component2 = (\n <>\n \n {this.props.displayMobile ?\n <>\n {this.state.pins.length > 0 ?\n this.setState({selectedPin: index})}\n onSelected={this.handleQuoteClick}\n onCancel={this.handleUnpinMessage} />\n : null\n }\n \n >\n : null}\n \n {messagesComponent}\n {this.state.dragging && this.isDragEnabled() ?\n {formatMessage(messages.drag_file)}
\n : null}\n >\n );\n }\n component = {component2}{overlay}
\n }\n return component;\n }\n};\n\nexport default injectIntl(MessagesView);\n","// Send message form.\nimport React, { Suspense } from 'react';\nimport { FormattedMessage, defineMessages, injectIntl } from 'react-intl';\nimport { Drafty } from 'tinode-sdk';\n\n// Lazy-loading AudioRecorder because it's quite large due to\n// a dependency on webm-duration-fix.\nconst AudioRecorder = React.lazy(_ => import('./audio-recorder.jsx'));\n\nimport { KEYPRESS_DELAY } from '../config.js';\nimport { filePasted } from '../lib/blob-helpers.js';\nimport { replyFormatter } from '../lib/formatters.js';\n\nconst messages = defineMessages({\n messaging_disabled: {\n id: 'messaging_disabled_prompt',\n defaultMessage: 'Messaging disabled',\n description: 'Prompt in SendMessage in read-only topic'\n },\n type_new_message: {\n id: 'new_message_prompt',\n defaultMessage: 'New message',\n description: 'Prompt in send message field'\n },\n add_image_caption: {\n id: 'image_caption_prompt',\n defaultMessage: 'Image caption',\n description: 'Prompt in SendMessage for attached image'\n },\n file_attachment_too_large: {\n id: 'file_attachment_too_large',\n defaultMessage: 'The file size {size} exceeds the {limit} limit.',\n description: 'Error message when attachment is too large'\n },\n cannot_initiate_upload: {\n id: 'cannot_initiate_file_upload',\n defaultMessage: 'Cannot initiate file upload.',\n description: 'Generic error messagewhen attachment fails'\n },\n icon_title_record_voice: {\n id: 'icon_title_record_voice',\n defaultMessage: 'Record voice message',\n description: 'Icon tool tip for recording a voice message'\n },\n icon_title_attach_file: {\n id: 'icon_title_attach_file',\n defaultMessage: 'Attach file',\n description: 'Icon tool tip for attaching a file'\n },\n icon_title_add_image: {\n id: 'icon_title_add_image',\n defaultMessage: 'Add image',\n description: 'Icon tool tip for attaching an image'\n },\n icon_title_send: {\n id: 'icon_title_send',\n defaultMessage: 'Send message',\n description: 'Icon tool tip for sending a message'\n },\n});\n\nclass SendMessage extends React.PureComponent {\n constructor(props) {\n super(props);\n\n this.state = {\n quote: null,\n message: '',\n audioRec: false,\n audioAvailable: !!(navigator.mediaDevices && navigator.mediaDevices.getUserMedia),\n };\n\n // Timestamp when the previous key press was sent to the server.\n this.keypressTimestamp = 0;\n\n this.handlePasteEvent = this.handlePasteEvent.bind(this);\n this.handleAttachImage = this.handleAttachImage.bind(this);\n this.handleAttachFile = this.handleAttachFile.bind(this);\n this.handleAttachAudio = this.handleAttachAudio.bind(this);\n this.handleSend = this.handleSend.bind(this);\n this.handleKeyPress = this.handleKeyPress.bind(this);\n this.handleMessageTyping = this.handleMessageTyping.bind(this);\n this.handleDropAttach = this.handleDropAttach.bind(this);\n\n this.handleQuoteClick = this.handleQuoteClick.bind(this);\n\n this.formatReply = this.formatReply.bind(this);\n }\n\n componentDidMount() {\n if (this.messageEditArea) {\n this.messageEditArea.addEventListener('paste', this.handlePasteEvent, false);\n if (window.getComputedStyle(this.messageEditArea).getPropertyValue('transition-property') == 'all') {\n // Set focus on desktop, but not on mobile: focus causes soft keyboard to pop up.\n this.messageEditArea.focus();\n }\n }\n\n this.setState({quote: this.formatReply()});\n }\n\n componentWillUnmount() {\n if (this.messageEditArea) {\n this.messageEditArea.removeEventListener('paste', this.handlePasteEvent, false);\n }\n }\n\n componentDidUpdate(prevProps) {\n if (this.messageEditArea) {\n if (window.getComputedStyle(this.messageEditArea).getPropertyValue('transition-property') == 'all') {\n // Set focus on desktop, but not on mobile: focus causes soft keyboard to pop up.\n this.messageEditArea.focus();\n }\n\n // Adjust height of the message area for the amount of text.\n this.messageEditArea.style.height = '0px';\n this.messageEditArea.style.height = this.messageEditArea.scrollHeight + 'px';\n }\n\n if (prevProps.topicName != this.props.topicName) {\n this.setState({message: this.props.initMessage || '', audioRec: false, quote: null});\n } else if (prevProps.initMessage != this.props.initMessage) {\n const msg = this.props.initMessage || '';\n this.setState({message: msg}, _ => {\n // If there is text, scroll to bottom and set caret to the end.\n this.messageEditArea.scrollTop = this.messageEditArea.scrollHeight;\n this.messageEditArea.setSelectionRange(msg.length, msg.length);\n });\n }\n if (prevProps.reply != this.props.reply) {\n this.setState({quote: this.formatReply()});\n }\n }\n\n formatReply() {\n return this.props.reply ?\n Drafty.format(this.props.reply.content, replyFormatter, {\n formatMessage: this.props.intl.formatMessage.bind(this.props.intl),\n authorizeURL: this.props.tinode.authorizeURL.bind(this.props.tinode)\n }) : null;\n }\n\n handlePasteEvent(e) {\n if (this.props.disabled) {\n return;\n }\n // FIXME: handle large files too.\n if (filePasted(e,\n file => { this.props.onAttachImage(file); },\n file => { this.props.onAttachFile(file); },\n this.props.onError)) {\n\n // If a file was pasted, don't paste base64 data into input field.\n e.preventDefault();\n }\n }\n\n handleAttachImage(e) {\n if (e.target.files && e.target.files.length > 0) {\n this.props.onAttachImage(e.target.files[0]);\n }\n // Clear the value so the same file can be uploaded again.\n e.target.value = '';\n }\n\n handleAttachFile(e) {\n if (e.target.files && e.target.files.length > 0) {\n this.props.onAttachFile(e.target.files[0]);\n }\n // Clear the value so the same file can be uploaded again.\n e.target.value = '';\n }\n\n handleDropAttach(files) {\n if (files && files.length > 0) {\n this.props.onAttachFile(files[0]);\n }\n }\n\n handleAttachAudio(url, preview, duration) {\n this.setState({audioRec: false});\n this.props.onAttachAudio(url, preview, duration);\n }\n\n handleSend(e) {\n e.preventDefault();\n const message = this.state.message.trim();\n if (message || this.props.acceptBlank || this.props.noInput) {\n this.props.onSendMessage(message);\n this.setState({message: ''});\n }\n }\n\n /* Send on Enter key */\n handleKeyPress(e) {\n if (this.state.audioRec) {\n // Ignore key presses while audio is being recorded.\n e.preventDefault();\n e.stopPropagation();\n return;\n }\n\n // Enter pressed: either send, or enter a new line.\n if (e.key === 'Enter') {\n if (this.props.sendOnEnter == 'plain') {\n // Have Shift-Enter insert a line break instead\n if (!e.shiftKey) {\n e.preventDefault();\n e.stopPropagation();\n\n this.handleSend(e);\n }\n } else {\n if (e.ctrlKey || e.metaKey) {\n e.preventDefault();\n e.stopPropagation();\n\n this.handleSend(e);\n }\n }\n }\n }\n\n handleMessageTyping(e) {\n this.setState({message: e.target.value});\n if (this.props.onKeyPress) {\n const now = new Date().getTime();\n if (now - this.keypressTimestamp > KEYPRESS_DELAY) {\n this.props.onKeyPress();\n this.keypressTimestamp = now;\n }\n }\n }\n\n handleQuoteClick(e) {\n e.preventDefault();\n e.stopPropagation();\n if (this.props.reply && this.props.onQuoteClick) {\n const replyToSeq = this.props.reply.seq;\n this.props.onQuoteClick(replyToSeq);\n }\n }\n\n render() {\n const { formatMessage } = this.props.intl;\n const prompt = this.props.disabled ?\n formatMessage(messages.messaging_disabled) :\n (this.props.messagePrompt ?\n formatMessage(messages[this.props.messagePrompt]) :\n formatMessage(messages.type_new_message));\n\n const sendIcon = (this.props.reply && this.props.reply.editing) ?\n 'check_circle' : 'send';\n\n const quote = this.state.quote ?\n (\n
\n {this.state.quote}\n
) : null;\n const audioEnabled = this.state.audioAvailable && this.props.onAttachAudio;\n return (\n \n {!this.props.noInput ? quote : null}\n
}>\n
this.props.onKeyPress(true)}\n onDeleted={_ => this.setState({audioRec: false})}\n onFinished={this.handleAttachAudio}/>\n ) :\n \n \n );\n }\n};\n\nexport default injectIntl(SendMessage);\n"],"names":["Attachment","external_React_default","Component","constructor","props","super","this","state","downloader","progress","downloadFile","bind","handleCancel","url","filename","mimetype","onError","tinode","getLargeFileHelper","setState","download","loaded","size","err","then","_","catch","message","uploading","onCancelUpload","cancel","render","length","substr","helperFunc","jsx_runtime","jsxs","className","children","strformat","lX","utils","YO","downloadUrl","Jf","e","preventDefault","downloadWidget","Fragment","jsx","external_ReactIntl_","FormattedMessage","id","defaultMessage","description","file_progress","A","onCancel","href","onClick","messages","defineMessages","message_sending","message_sending_failed","message_edited_marker","ReceivedMarker","PureComponent","formatMessage","intl","timestamp","received","external_tinode_","Tinode","MESSAGE_STATUS_SENDING","MESSAGE_STATUS_FAILED","MESSAGE_STATUS_FATAL","toLocaleTimeString","locale","timeStyle","icon","LO","marker","color","name","edited","received_marker","injectIntl","BaseChatMessage","uploader","onProgress","handleProgress","handleExpandImage","handlePlayVideo","handleFormButtonClick","handleQuoteClick","handleContextClick","handleCancelUpload","handleDraftyClick","formatterContext","viewportWidth","authorizeURL","onHandleClick","action","pathname","URL","target","dataset","val","parts","split","filter","Boolean","navigation","navigateTo","setUrlTopic","pop","error","console","hashUrl","setUrlSidePanel","window","location","hash","addUrlParam","info","onExpandMedia","src","width","height","type","mime","video","preview","duration","data","seq","resp","undefined","act","ref","text","title","onFormResponse","stopPropagation","menuItems","push","userIsWriter","response","immutable","Drafty","entities","content","_0","_1","tp","includes","styles","userIsAdmin","pinned","showContextMenu","replace","parseInt","userFrom","userName","y","pageY","x","pageX","pickReply","editMessage","ratio","replyToSeq","onQuoteClick","sideClass","sequence","bubbleClass","avatar","userAvatar","textSizeClass","fullDisplay","isGroup","attachments","mimeType","getContentType","isValid","att","i","isFormResponseType","getDownloadUrl","isProcessing","getEntitySize","tree","format","formatters","e3","createElement","RegExp","test","match","innerRef","letter_tile","topic","IntlChatMessage","chat_message","forwardRef","GroupSubs","usersOnline","totalCount","subscribers","countToShow","Math","min","some","sub","user","blob_helpers","to","public","photo","fn","values","overflow","Invitation","handleButtonAction","evt","onAction","event","LogoView","version","config","C3","getLibrary","alt","serverVersion","serverAddress","MetaMessage","date","pinned_messages_messages","message_not_found","message_deleted","PinnedMessages","touchX","touchY","touchSurface","createRef","getSelectedIndex","handleSelected","handleMoveNext","handleMovePrev","handleTouchEventStart","handleTouchEventEnd","handleTouchCancel","componentDidMount","current","addEventListener","passive","componentWillUnmount","removeEventListener","pins","selected","onSelected","isTouch","idx","max","setSelected","touches","clientX","clientY","changedTouches","dX","dY","abs","messageShown","_deleted","TU","dots","forEach","cn","isAdmin","pinned_messages","CallPanel","lazy","__webpack_require__","DocPreview","ImagePreview","TheCardPreview","Promise","all","VideoPreview","messages_view_messages","online_now","last_seen","not_found","channel","file_attachment_too_large","invalid_content","editing_message","drag_file","self_topic_name","subscriber_count","member_count","cannot_parse_vcard","isUnconfirmed","acs","ex","getExcessive","isJoiner","isPeerRestricted","ms","getMissing","shouldPresentCallPanel","callState","MessagesView","getDerivedStateFromProps","componentSetup","leave","sendMessage","retrySend","sendImageAttachment","sendVideoAttachment","sendFileAttachment","sendAudioAttachment","sendTheCardAttachment","sendKeyPress","subscribe","handleScrollReference","mountDnDEvents","handleScrollEvent","handleDescChange","handleSubsUpdated","handleMessageUpdate","handleAuxUpdate","handleAllMessagesReceived","handleInfoReceipt","handleExpandMedia","handleClosePreview","handleCallPanelToggle","handleFormResponse","handleShowMessageContextMenu","handleNewChatAcceptance","handleEnablePeer","handleAttachFile","handleAttachImageOrVideo","postReadNotification","clearNotificationQueue","goToLatestMessage","handleFileDrop","handlePickReply","handleEditMessage","handleCancelReply","handleUnpinMessage","handleCallHangup","isDragEnabled","handleDragStart","handleDragIn","handleDragOut","handleDrag","handleDrop","chatMessageRefs","getOrCreateMessageRef","getVisibleMessageRange","dragCounter","dndRef","readNotificationQueue","readNotificationTimer","keyPressTimer","seqId","holderRect","Number","MAX_SAFE_INTEGER","visibilityStatus","every","top","bottom","getBoundingClientRect","messagesScroller","componentDidUpdate","prevProps","prevState","maxSeqId","minSeqId","scrollPosition","scrollTop","scrollHeight","offsetHeight","applicationVisible","getTopic","isNewGroupTopicName","rtcPanel","callSeq","onData","onAllMessagesReceived","onInfo","onMetaDesc","onSubsUpdated","onPres","onAuxUpdated","myUserId","newTopic","newTopicParams","_topicName","isP2PType","getMeta","startMetaQuery","withDesc","build","isSubscribed","isReader","withLaterData","ready","nextProps","nextState","deleted","docPreview","imagePreview","imagePostview","videoPreview","videoPostview","minimizedCallPanel","typingIndicator","fetchingMessages","showGoToLastButton","contentToEdit","dragging","selectedPin","forwardMessage","object","reply","subs","connected","online","Object","assign","onlineSubs","isSelfType","peer","p2pPeerDesc","peerMessagingDisabled","minMsgSeq","maxMsgSeq","latestClearId","maxClearId","isChannelType","aux","slice","pinsLoaded","callTopic","isVerified","isStaff","isDangerous","subsVersion","isWriter","readingBlocked","isSharer","unconformed","unconfirmed","getQuery","withLaterDesc","withLaterSub","withAux","withLaterDel","setQuery","ctrl","code","params","onNewTopicCreated","discard","queuedMessages","pub","_sending","_fatal","head","webrtc","delMessagesList","blankState","oldTopicName","isTopicCached","oldTopic","finally","node","pos","processingScrollEvent","gaps","msgHasMoreMessages","getMessagesPage","dnd","desc","isSelfTopicName","setInterval","clearInterval","n","topicName","shift","now","Date","sendAt","isServerAssignedSeq","noteRead","setMilliseconds","getMilliseconds","newState","msg","clearTimeout","isNewMessage","msgStatus","MESSAGE_STATUS_SENT","from","count","getPinnedMessages","what","setTimeout","forceUpdate","revokeObjectURL","onCancelForwardMessage","attachJSON","parse","searchParams","key","hasOwnProperty","set","search","open","messageSpecificMenuItems","getAccessMode","isDeleter","canDelete","isOwner","maxDelAge","getServerParam","MSG_DELETE_AGE","getTime","onNewChat","onChangePermissions","audio","noteRecording","noteKeyPress","uploadCompletionPromise","editing","append","sanitizeEntities","file","maxInbandAttachmentSize","TheCard","isFileSupported","contentType","jsonMimeConverter","fileType","Uv","cannot_initiate_upload","upload","attachFile","urlPromise","bB","b64","bits","appendTheCard","QJ","card","maxExternAttachmentSize","qy","limit","onVideoCallClosed","onCallHangup","caption","blob","fname","ag","scaled","Sk","insertImage","_tempPreview","appendLineBreak","videoBlob","previewBlob","uploads","b64s","v64","i64","insertVideo","premime","b64conv","img","startsWith","createObjectURL","files","fetch","result","appendAudio","found","findMessage","_cancelled","senderId","senderName","init","replyContent","wrapInto","quote","editable","toMarkdown","scrollIntoView","block","behavior","classList","add","remove","pinMessage","dataTransfer","clearData","items","overlay","external_React_","Suspense","fallback","callAudioOnly","minimized","onHangup","onToggleMinimize","onInvite","onCallInvite","onSendOffer","onCallSendOffer","onIceCandidate","onCallIceCandidate","onSendAnswer","onCallSendAnswer","component","component2","onCancelReply","onClose","onSendMessage","isChannel","chan","groupTopic","isGroupType","icon_badges","trusted","verified","staff","danger","pinnedMessages","latestMsgVersion","messageNodes","previousFrom","prevDate","chatBoxClass","prev","next","nextFrom","thisFrom","isReply","deliveryStatus","userDesc","isNaN","hi","thisDate","ts","toDateString","mf","isChan","_uploader","onAcceptCall","lastSeen","subcnt","cont","getMeTopic","getContact","isP2PTopicName","seen","cq","when","isGroupTopicName","titleClass","darkModeClass","colorSchema","messagesComponent","send_message","noInput","disabled","initMessage","sendOnEnter","onKeyPress","onRecordingProgress","onAttachFile","onAttachImage","onAttachAudio","displayMobile","onHideMessagesView","contact_badges","badges","style","marginLeft","index","error_panel","level","errorLevel","errorText","onClearError","load_spinner","show","messages_view","AudioRecorder","react__WEBPACK_IMPORTED_MODULE_0___default","react_intl__WEBPACK_IMPORTED_MODULE_1__","messaging_disabled","type_new_message","add_image_caption","icon_title_record_voice","icon_title_attach_file","icon_title_add_image","icon_title_send","SendMessage","audioRec","audioAvailable","navigator","mediaDevices","getUserMedia","keypressTimestamp","handlePasteEvent","handleAttachImage","handleAttachAudio","handleSend","handleKeyPress","handleMessageTyping","handleDropAttach","formatReply","messageEditArea","getComputedStyle","getPropertyValue","focus","setSelectionRange","tinode_sdk__WEBPACK_IMPORTED_MODULE_2__","_lib_formatters_js__WEBPACK_IMPORTED_MODULE_5__","NV","_lib_blob_helpers_js__WEBPACK_IMPORTED_MODULE_4__","iJ","value","trim","acceptBlank","shiftKey","ctrlKey","metaKey","prompt","messagePrompt","sendIcon","react_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__","audioEnabled","attachImage","click","react__WEBPACK_IMPORTED_MODULE_0__","onDeleted","onFinished","placeholder","onChange","onKeyDown","display","accept","__webpack_exports__"],"sourceRoot":""}
\ No newline at end of file
diff --git a/umd/534.prod.js b/umd/534.prod.js
new file mode 100644
index 00000000..f812bb66
--- /dev/null
+++ b/umd/534.prod.js
@@ -0,0 +1,2 @@
+"use strict";(self.webpackChunktinode_webapp=self.webpackChunktinode_webapp||[]).push([[534],{8534:function(e,t,s){s.r(t),s.d(t,{default:function(){return p}});var i=s(1594),n=s.n(i),o=s(8181),d=s(5372),h=(s(3272),s(7981)),a=s(7256),r=s(7849),l=s(4848);class p extends n().PureComponent{constructor(e){super(e),this.state={width:0,height:0},this.handleSendImage=this.handleSendImage.bind(this),this.handleKeyDown=this.handleKeyDown.bind(this)}componentDidMount(){document.addEventListener("keydown",this.handleKeyDown)}componentWillUnmount(){document.removeEventListener("keydown",this.handleKeyDown)}handleKeyDown(e){this.props.onSendMessage||(e.preventDefault(),"Escape"===e.key&&this.props.onClose())}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,h.ae)(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%";const s=Math.max((this.state.width/13/1.5|0)-2,12),i=(0,a.Tu)(this.props.content.filename,s)||"-",n=this.props.content.width||"-",p=this.props.content.height||"-",c=(0,r.FH)(this.props.content.url);return(0,l.jsxs)("div",{id:"image-preview",children:[(0,l.jsxs)("div",{id:"preview-caption-panel",children:[this.props.onSendMessage?(0,l.jsx)("span",{children:i}):(0,l.jsxs)("a",{href:c,download:this.props.content.filename,children:[(0,l.jsx)("i",{className:"material-icons",children:"file_download"})," ",(0,l.jsx)(o.FormattedMessage,{id:"download_action",defaultMessage:"download",description:"Call to action [download]"})]}),(0,l.jsx)("a",{href:"#",onClick:e=>{e.preventDefault(),this.props.onClose()},children:(0,l.jsx)("i",{className:"material-icons gray",children:"close"})})]}),(0,l.jsx)("div",{id:"image-preview-container",ref:e=>this.assignWidth(e),children:(0,l.jsx)("img",{src:this.props.content.url,style:t,className:"image-preview",alt:this.props.content.filename})}),this.props.onSendMessage?(0,l.jsx)(d.A,{messagePrompt:"add_image_caption",acceptBlank:!0,tinode:this.props.tinode,reply:this.props.reply,onCancelReply:this.props.onCancelReply,onSendMessage:this.handleSendImage,onError:this.props.onError}):(0,l.jsxs)("div",{id:"image-preview-footer",children:[(0,l.jsxs)("div",{children:[(0,l.jsx)("div",{children:(0,l.jsx)("b",{children:(0,l.jsx)(o.FormattedMessage,{id:"label_file_name",defaultMessage:"File name:",description:"Label for a file name"})})}),(0,l.jsx)("div",{children:(0,l.jsx)("span",{title:this.props.content.filename,children:i})})]}),(0,l.jsxs)("div",{children:[(0,l.jsx)("div",{children:(0,l.jsx)("b",{children:(0,l.jsx)(o.FormattedMessage,{id:"label_content_type",defaultMessage:"Content type:",description:"Label for file content type (mime)"})})}),(0,l.jsx)("div",{children:this.props.content.type})]}),(0,l.jsxs)("div",{children:[(0,l.jsx)("div",{children:(0,l.jsx)("b",{children:(0,l.jsx)(o.FormattedMessage,{id:"label_size",defaultMessage:"Size:",description:"Label for file size"})})}),(0,l.jsxs)("div",{children:[n," × ",p," px; ",(0,a.lX)(this.props.content.size)]})]})]})]})}}}}]);
+//# sourceMappingURL=534.prod.js.map
\ No newline at end of file
diff --git a/umd/534.prod.js.map b/umd/534.prod.js.map
new file mode 100644
index 00000000..619c6799
--- /dev/null
+++ b/umd/534.prod.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"534.prod.js","mappings":"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","sources":["webpack://tinode-webapp/./src/widgets/image-preview.jsx"],"sourcesContent":["import React from 'react';\nimport { FormattedMessage } from 'react-intl';\nimport SendMessage from './send-message.jsx';\n\nimport { REM_SIZE } from '../config.js';\nimport { fitImageSize } from '../lib/blob-helpers.js';\nimport { bytesToHumanSize, shortenFileName } from '../lib/strformat.js';\nimport { urlAsAttachment } from '../lib/utils.js';\n\nexport default class ImagePreview extends React.PureComponent {\n constructor(props) {\n super(props);\n\n this.state = {\n width: 0,\n height: 0\n };\n\n this.handleSendImage = this.handleSendImage.bind(this);\n this.handleKeyDown = this.handleKeyDown.bind(this);\n }\n\n componentDidMount() {\n document.addEventListener('keydown', this.handleKeyDown);\n }\n\n componentWillUnmount() {\n document.removeEventListener('keydown', this.handleKeyDown);\n }\n\n handleKeyDown(e) {\n if (this.props.onSendMessage) {\n return;\n }\n\n e.preventDefault();\n if (e.key === 'Escape') {\n this.props.onClose();\n }\n }\n\n assignWidth(node) {\n if (node && !this.state.width) {\n const bounds = node.getBoundingClientRect();\n this.setState({\n width: bounds.width | 0,\n height: bounds.height | 0\n });\n }\n }\n\n handleSendImage(caption) {\n this.props.onClose();\n this.props.onSendMessage(caption, this.props.content.blob);\n }\n\n render() {\n if (!this.props.content) {\n return null;\n }\n\n const dim = fitImageSize(this.props.content.width, this.props.content.height,\n this.state.width, this.state.height, false);\n const size = dim ? { width: dim.dstWidth + 'px', height: dim.dstHeight + 'px' } :\n ((this.props.content.width > this.props.content.height) ? {width: '100%'} : {height: '100%'});\n size.maxWidth = '100%';\n size.maxHeight = '100%';\n\n // Average font aspect ratio is ~0.5; File name takes 1/3 of the viewport width.\n const maxlength = Math.max(((this.state.width / REM_SIZE / 1.5) | 0) - 2, 12);\n const fname = shortenFileName(this.props.content.filename, maxlength) || '-';\n\n const width = this.props.content.width || '-';\n const height = this.props.content.height || '-';\n\n const download_url = urlAsAttachment(this.props.content.url);\n\n return (\n \n
\n
this.assignWidth(node)}>\n
\n
\n {this.props.onSendMessage ?\n
\n :\n }\n
\n );\n }\n};\n"],"names":["ImagePreview","react__WEBPACK_IMPORTED_MODULE_0___default","constructor","props","super","this","state","width","height","handleSendImage","bind","handleKeyDown","componentDidMount","document","addEventListener","componentWillUnmount","removeEventListener","e","onSendMessage","preventDefault","key","onClose","assignWidth","node","bounds","getBoundingClientRect","setState","caption","content","blob","render","dim","_lib_blob_helpers_js__WEBPACK_IMPORTED_MODULE_4__","ae","size","dstWidth","dstHeight","maxWidth","maxHeight","maxlength","Math","max","fname","_lib_strformat_js__WEBPACK_IMPORTED_MODULE_5__","Tu","filename","download_url","_lib_utils_js__WEBPACK_IMPORTED_MODULE_6__","FH","url","react_jsx_runtime__WEBPACK_IMPORTED_MODULE_7__","jsxs","id","children","jsx","href","download","className","react_intl__WEBPACK_IMPORTED_MODULE_1__","FormattedMessage","defaultMessage","description","onClick","ref","src","style","alt","_send_message_jsx__WEBPACK_IMPORTED_MODULE_2__","A","messagePrompt","acceptBlank","tinode","reply","onCancelReply","onError","title","type","lX"],"sourceRoot":""}
\ No newline at end of file
diff --git a/umd/537.prod.js.LICENSE.txt b/umd/537.prod.js.LICENSE.txt
new file mode 100644
index 00000000..df537c53
--- /dev/null
+++ b/umd/537.prod.js.LICENSE.txt
@@ -0,0 +1,8 @@
+/*!
+ * The buffer module from node.js, for the browser.
+ *
+ * @author Feross Aboukhadijeh
+ * @license MIT
+ */
+
+/*! ieee754. BSD-3-Clause License. Feross Aboukhadijeh */
diff --git a/umd/592.prod.js b/umd/592.prod.js
new file mode 100644
index 00000000..75139dd2
--- /dev/null
+++ b/umd/592.prod.js
@@ -0,0 +1,2 @@
+"use strict";(self.webpackChunktinode_webapp=self.webpackChunktinode_webapp||[]).push([[592],{4592:function(e,i,n){n.r(i);var s=n(1594),t=n.n(s),o=n(8181),r=n(5372),d=n(7256),a=n(4848);const p=(0,o.defineMessages)({unrecognized_video_format:{id:"unrecognized_video_format",defaultMessage:"Format of this video is not recognized",description:"Error message when uploaded video is invalid"}});class h extends t().PureComponent{constructor(e){super(e),this.videoRef=t().createRef(),this.handleSendVideo=this.handleSendVideo.bind(this),this.handleKeyDown=this.handleKeyDown.bind(this)}componentDidMount(){document.addEventListener("keydown",this.handleKeyDown)}componentWillUnmount(){document.removeEventListener("keydown",this.handleKeyDown)}handleKeyDown(e){this.props.onSendMessage||(e.preventDefault(),"Escape"===e.key&&this.props.onClose())}handleSendVideo(e){this.props.onClose();const i={width:this.videoRef.current.videoWidth,height:this.videoRef.current.videoHeight,duration:1e3*this.videoRef.current.duration|0,mime:this.props.content.mime,name:this.props.content.filename};if(0==i.width||0==i.height)return void this.props.onError(this.props.intl.formatMessage(p.unrecognized_video_format),"err");const n=document.createElement("canvas");n.width=i.width,n.height=i.height;const s=n.getContext("2d");s.drawImage(this.videoRef.current,0,0,n.width,n.height),s.canvas.toBlob(n=>this.props.onSendMessage(e,this.props.content.blob,n,i),"image/jpeg",.75)}render(){if(!this.props.content)return null;const e=this.props.content.width||"-",i=this.props.content.height||"-",n=this.props.onSendMessage?"nodownload":"",s=!this.props.onSendMessage;return(0,a.jsxs)("div",{id:"image-preview",children:[(0,a.jsxs)("div",{id:"preview-caption-panel",children:[(0,a.jsx)("span",{children:this.props.content.filename}),(0,a.jsx)("a",{href:"#",onClick:e=>{e.preventDefault(),this.props.onClose()},children:(0,a.jsx)("i",{className:"material-icons gray",children:"close"})})]}),(0,a.jsx)("div",{id:"image-preview-container",children:(0,a.jsx)("video",{className:"image-preview",controls:!0,controlsList:n,disablePictureInPicture:!0,ref:this.videoRef,autoPlay:s,src:this.props.tinode.authorizeURL(this.props.content.url),poster:this.props.content.preview,alt:this.props.content.filename})}),this.props.onSendMessage?(0,a.jsx)(r.A,{messagePrompt:"add_image_caption",acceptBlank:!0,tinode:this.props.tinode,reply:this.props.reply,onCancelReply:this.props.onCancelReply,onSendMessage:this.handleSendVideo,onError:this.props.onError}):(0,a.jsxs)("div",{id:"image-preview-footer",children:[(0,a.jsxs)("div",{children:[(0,a.jsx)("div",{children:(0,a.jsx)("b",{children:(0,a.jsx)(o.FormattedMessage,{id:"label_file_name",defaultMessage:"File name:",description:"Label for a file name"})})}),(0,a.jsx)("div",{children:(0,a.jsx)("span",{title:this.props.content.filename,children:this.props.content.filename})})]}),(0,a.jsxs)("div",{children:[(0,a.jsx)("div",{children:(0,a.jsx)("b",{children:(0,a.jsx)(o.FormattedMessage,{id:"label_content_type",defaultMessage:"Content type:",description:"Label for file content type (mime)"})})}),(0,a.jsx)("div",{children:this.props.content.type})]}),(0,a.jsxs)("div",{children:[(0,a.jsx)("div",{children:(0,a.jsx)("b",{children:(0,a.jsx)(o.FormattedMessage,{id:"label_size",defaultMessage:"Size:",description:"Label for file size"})})}),(0,a.jsxs)("div",{children:[e," × ",i," px; ",(0,d.lX)(this.props.content.size)]})]})]})]})}}i.default=(0,o.injectIntl)(h)}}]);
+//# sourceMappingURL=592.prod.js.map
\ No newline at end of file
diff --git a/umd/592.prod.js.map b/umd/592.prod.js.map
new file mode 100644
index 00000000..52eb0988
--- /dev/null
+++ b/umd/592.prod.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"592.prod.js","mappings":"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","sources":["webpack://tinode-webapp/./src/widgets/video-preview.jsx"],"sourcesContent":["import React from 'react';\nimport { FormattedMessage, defineMessages, injectIntl } from 'react-intl';\nimport SendMessage from './send-message.jsx';\n\nimport { bytesToHumanSize } from '../lib/strformat.js';\n\nconst messages = defineMessages({\n unrecognized_video_format: {\n id: 'unrecognized_video_format',\n defaultMessage: 'Format of this video is not recognized',\n description: 'Error message when uploaded video is invalid',\n }\n});\n\nclass VideoPreview extends React.PureComponent {\n constructor(props) {\n super(props);\n\n this.videoRef = React.createRef();\n\n this.handleSendVideo = this.handleSendVideo.bind(this);\n this.handleKeyDown = this.handleKeyDown.bind(this);\n }\n\n componentDidMount() {\n document.addEventListener('keydown', this.handleKeyDown);\n }\n\n componentWillUnmount() {\n document.removeEventListener('keydown', this.handleKeyDown);\n }\n\n handleKeyDown(e) {\n if (this.props.onSendMessage) {\n return;\n }\n\n e.preventDefault();\n if (e.key === 'Escape') {\n this.props.onClose();\n }\n }\n\n handleSendVideo(caption) {\n this.props.onClose();\n const params = {\n width: this.videoRef.current.videoWidth,\n height: this.videoRef.current.videoHeight,\n duration: (this.videoRef.current.duration * 1000) | 0,\n mime: this.props.content.mime,\n name: this.props.content.filename\n }\n\n if (params.width == 0 || params.height == 0) {\n this.props.onError(this.props.intl.formatMessage(messages.unrecognized_video_format), 'err');\n return;\n }\n\n // Capture screen from a video.\n const canvas = document.createElement('canvas');\n canvas.width = params.width;\n canvas.height = params.height;\n const ctx = canvas.getContext('2d');\n ctx.drawImage(this.videoRef.current, 0, 0, canvas.width, canvas.height);\n ctx.canvas.toBlob(\n preview => this.props.onSendMessage(caption, this.props.content.blob, preview, params),\n 'image/jpeg', 0.75\n );\n }\n\n render() {\n if (!this.props.content) {\n return null;\n }\n\n const width = this.props.content.width || '-';\n const height = this.props.content.height || '-';\n\n const controlist = this.props.onSendMessage ? 'nodownload' : '';\n const autoPlay = !this.props.onSendMessage;\n\n return (\n \n
\n
\n \n
\n {this.props.onSendMessage ?\n
\n :\n }\n
\n );\n }\n};\n\nexport default injectIntl(VideoPreview);\n"],"names":["messages","react_intl__WEBPACK_IMPORTED_MODULE_1__","defineMessages","unrecognized_video_format","id","defaultMessage","description","VideoPreview","react__WEBPACK_IMPORTED_MODULE_0___default","constructor","props","super","this","videoRef","createRef","handleSendVideo","bind","handleKeyDown","componentDidMount","document","addEventListener","componentWillUnmount","removeEventListener","e","onSendMessage","preventDefault","key","onClose","caption","params","width","current","videoWidth","height","videoHeight","duration","mime","content","name","filename","onError","intl","formatMessage","canvas","createElement","ctx","getContext","drawImage","toBlob","preview","blob","render","controlist","autoPlay","react_jsx_runtime__WEBPACK_IMPORTED_MODULE_4__","jsxs","children","jsx","href","onClick","className","controls","controlsList","disablePictureInPicture","ref","src","tinode","authorizeURL","url","poster","alt","_send_message_jsx__WEBPACK_IMPORTED_MODULE_2__","A","messagePrompt","acceptBlank","reply","onCancelReply","FormattedMessage","title","type","_lib_strformat_js__WEBPACK_IMPORTED_MODULE_3__","lX","size","__webpack_exports__","injectIntl"],"sourceRoot":""}
\ No newline at end of file
diff --git a/umd/623.prod.js b/umd/623.prod.js
new file mode 100644
index 00000000..673e6b59
--- /dev/null
+++ b/umd/623.prod.js
@@ -0,0 +1,2 @@
+"use strict";(self.webpackChunktinode_webapp=self.webpackChunktinode_webapp||[]).push([[623],{1623:function(e,n,s){s.r(n),s.d(n,{default:function(){return p}});var t=s(1594),i=s.n(t),o=s(8181),r=s(5372),a=s(7256),d=s(4848);function l(e){const n={default:"insert_drive_file",image:"image",text:"description",video:"theaters"};return n[e]||n[(e||"").split("/")[0]]||n.default}class p extends i().PureComponent{constructor(e){super(e),this.handleSendDoc=this.handleSendDoc.bind(this),this.handleKeyDown=this.handleKeyDown.bind(this)}componentDidMount(){document.addEventListener("keydown",this.handleKeyDown)}componentWillUnmount(){document.removeEventListener("keydown",this.handleKeyDown)}handleKeyDown(e){e.preventDefault(),"Escape"===e.key&&this.props.onClose()}handleSendDoc(e){this.props.onClose(),this.props.onSendMessage(this.props.content.file)}render(){return this.props.content?(0,d.jsxs)("div",{id:"image-preview",children:[(0,d.jsxs)("div",{id:"preview-caption-panel",children:[(0,d.jsx)("span",{children:this.props.content.name}),(0,d.jsx)("a",{href:"#",onClick:e=>{e.preventDefault(),this.props.onClose()},children:(0,d.jsx)("i",{className:"material-icons gray",children:"close"})})]}),(0,d.jsx)("div",{id:"image-preview-container",children:(0,d.jsxs)("div",{className:"doc-card",children:[(0,d.jsx)("i",{className:"material-icons gray",children:l(this.props.content.type)}),(0,d.jsxs)("div",{children:[(0,d.jsx)("b",{children:(0,d.jsx)(o.FormattedMessage,{id:"label_file_name",defaultMessage:"File name:",description:"Label for a file name"})})," ",(0,a.Tu)(this.props.content.name,24)||"-"]}),(0,d.jsxs)("div",{children:[(0,d.jsx)("b",{children:(0,d.jsx)(o.FormattedMessage,{id:"label_content_type",defaultMessage:"Content type:",description:"Label for file content type (mime)"})})," ",this.props.content.type||"application/octet-stream"]}),(0,d.jsxs)("div",{children:[(0,d.jsx)("b",{children:(0,d.jsx)(o.FormattedMessage,{id:"label_size",defaultMessage:"Size:",description:"Label for file size"})})," ",(0,a.lX)(this.props.content.size)]})]})}),(0,d.jsx)(r.A,{noInput:!0,tinode:this.props.tinode,reply:this.props.reply,onCancelReply:this.props.onCancelReply,onSendMessage:this.handleSendDoc,onError:this.props.onError})]}):null}}}}]);
+//# sourceMappingURL=623.prod.js.map
\ No newline at end of file
diff --git a/umd/623.prod.js.map b/umd/623.prod.js.map
new file mode 100644
index 00000000..fa784225
--- /dev/null
+++ b/umd/623.prod.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"623.prod.js","mappings":"+NAOA,SAASA,EAAaC,GAEpB,MAAMC,EAAa,CAACC,QAAS,oBAAqBC,MAAO,QAASC,KAAM,cAAeC,MAAO,YAE9F,OAAOJ,EAAWD,IAASC,GAAYD,GAAQ,IAAIM,MAAM,KAAK,KAAOL,EAAoB,OAC3F,CAEe,MAAMM,UAAmBC,IAAA,cACtC,WAAAC,CAAYC,GACVC,MAAMD,GAENE,KAAKC,cAAgBD,KAAKC,cAAcC,KAAKF,MAC7CA,KAAKG,cAAgBH,KAAKG,cAAcD,KAAKF,KAC/C,CAEA,iBAAAI,GACEC,SAASC,iBAAiB,UAAWN,KAAKG,cAC5C,CAEA,oBAAAI,GACEF,SAASG,oBAAoB,UAAWR,KAAKG,cAC/C,CAEA,aAAAA,CAAcM,GACZA,EAAEC,iBACY,WAAVD,EAAEE,KACJX,KAAKF,MAAMc,SAEf,CAEA,aAAAX,CAAcY,GACZb,KAAKF,MAAMc,UACXZ,KAAKF,MAAMgB,cAAcd,KAAKF,MAAMiB,QAAQC,KAC9C,CAEA,MAAAC,GACE,OAAKjB,KAAKF,MAAMiB,SAId,EAAAG,EAAAC,MAAA,OAAKC,GAAG,gBAAeC,SAAA,EACrB,EAAAH,EAAAC,MAAA,OAAKC,GAAG,wBAAuBC,SAAA,EAC7B,EAAAH,EAAAI,KAAA,QAAAD,SAAOrB,KAAKF,MAAMiB,QAAQQ,QAC1B,EAAAL,EAAAI,KAAA,KAAGE,KAAK,IAAIC,QAAUhB,IAAOA,EAAEC,iBAAkBV,KAAKF,MAAMc,WAAYS,UAAC,EAAAH,EAAAI,KAAA,KAAGI,UAAU,sBAAqBL,SAAC,gBAE9G,EAAAH,EAAAI,KAAA,OAAKF,GAAG,0BAAyBC,UAC/B,EAAAH,EAAAC,MAAA,OAAKO,UAAU,WAAUL,SAAA,EACvB,EAAAH,EAAAI,KAAA,KAAGI,UAAU,sBAAqBL,SAAElC,EAAaa,KAAKF,MAAMiB,QAAQY,SACpE,EAAAT,EAAAC,MAAA,OAAAE,SAAA,EAAK,EAAAH,EAAAI,KAAA,KAAAD,UAAG,EAAAH,EAAAI,KAACM,EAAAC,iBAAgB,CAACT,GAAG,kBAAkBU,eAAe,aAC5DC,YAAY,4BAA8B,KAAE,EAAAC,EAAAC,IAAgBjC,KAAKF,MAAMiB,QAAQQ,KAAM,KAAO,QAC9F,EAAAL,EAAAC,MAAA,OAAAE,SAAA,EAAK,EAAAH,EAAAI,KAAA,KAAAD,UAAG,EAAAH,EAAAI,KAACM,EAAAC,iBAAgB,CAACT,GAAG,qBAAqBU,eAAe,gBAC/DC,YAAY,yCAA2C,IAAE/B,KAAKF,MAAMiB,QAAQY,MAAQ,+BACtF,EAAAT,EAAAC,MAAA,OAAAE,SAAA,EAAK,EAAAH,EAAAI,KAAA,KAAAD,UAAG,EAAAH,EAAAI,KAACM,EAAAC,iBAAgB,CAACT,GAAG,aAAaU,eAAe,QACvDC,YAAY,0BAA4B,KAAE,EAAAC,EAAAE,IAAiBlC,KAAKF,MAAMiB,QAAQoB,eAGpF,EAAAjB,EAAAI,KAACc,EAAAC,EAAW,CACVC,SAAS,EACTC,OAAQvC,KAAKF,MAAMyC,OACnBC,MAAOxC,KAAKF,MAAM0C,MAClBC,cAAezC,KAAKF,MAAM2C,cAC1B3B,cAAed,KAAKC,cACpByC,QAAS1C,KAAKF,MAAM4C,aAzBjB,IA4BX","sources":["webpack://tinode-webapp/./src/widgets/doc-preview.jsx"],"sourcesContent":["import React from 'react';\nimport { FormattedMessage } from 'react-intl';\nimport SendMessage from '../widgets/send-message.jsx';\n\nimport { bytesToHumanSize, shortenFileName } 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 this.handleKeyDown = this.handleKeyDown.bind(this);\n }\n\n componentDidMount() {\n document.addEventListener('keydown', this.handleKeyDown);\n }\n\n componentWillUnmount() {\n document.removeEventListener('keydown', this.handleKeyDown);\n }\n\n handleKeyDown(e) {\n e.preventDefault();\n if (e.key === 'Escape') {\n this.props.onClose();\n }\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
\n
\n
{iconFromMime(this.props.content.type)} \n
{shortenFileName(this.props.content.name, 24) || '-'}
\n
{this.props.content.type || 'application/octet-stream'}
\n
{bytesToHumanSize(this.props.content.size)}
\n
\n
\n
\n
\n );\n }\n};\n"],"names":["iconFromMime","mime","mimeToIcon","default","image","text","video","split","DocPreview","react__WEBPACK_IMPORTED_MODULE_0___default","constructor","props","super","this","handleSendDoc","bind","handleKeyDown","componentDidMount","document","addEventListener","componentWillUnmount","removeEventListener","e","preventDefault","key","onClose","caption","onSendMessage","content","file","render","react_jsx_runtime__WEBPACK_IMPORTED_MODULE_4__","jsxs","id","children","jsx","name","href","onClick","className","type","react_intl__WEBPACK_IMPORTED_MODULE_1__","FormattedMessage","defaultMessage","description","_lib_strformat_js__WEBPACK_IMPORTED_MODULE_3__","Tu","lX","size","_widgets_send_message_jsx__WEBPACK_IMPORTED_MODULE_2__","A","noInput","tinode","reply","onCancelReply","onError"],"sourceRoot":""}
\ No newline at end of file
diff --git a/umd/627.prod.js b/umd/627.prod.js
new file mode 100644
index 00000000..f1375320
--- /dev/null
+++ b/umd/627.prod.js
@@ -0,0 +1,2 @@
+"use strict";(self.webpackChunktinode_webapp=self.webpackChunktinode_webapp||[]).push([[627],{3627:function(e,d,a){a.r(d),a.d(d,{default:function(){return b}});var i=a(1594),l=a.n(i),o=a(8181),t=a(995),s=a(3889),c=a(3207),n=a(2685),r=a(8568),h=a(99),u=a(7981),p=a(7849),m=a(7256),g=a(3272),C=a(4848);class b extends l().PureComponent{constructor(e){super(e),this.state={login:"",password:"",meth:"",email:"",tel:"",fn:"",imageUrl:null,uploadUrl:null,newAvatar:null,newAvatarMime:null,buttonDisabled:!1,saveToken:h.A.getObject("keep-logged-in")},this.handleLoginChange=this.handleLoginChange.bind(this),this.handlePasswordChange=this.handlePasswordChange.bind(this),this.handleEmailChange=this.handleEmailChange.bind(this),this.handlePhoneChange=this.handlePhoneChange.bind(this),this.handleFnChange=this.handleFnChange.bind(this),this.handleImageChanged=this.handleImageChanged.bind(this),this.handleToggleSaveToken=this.handleToggleSaveToken.bind(this),this.handleAvatarCropped=this.handleAvatarCropped.bind(this),this.handleAvatarCropCancel=this.handleAvatarCropCancel.bind(this),this.uploadAvatar=this.uploadAvatar.bind(this),this.handleSubmit=this.handleSubmit.bind(this),e.tinode.connect().catch(e=>{this.props.onError(e.message,"err")})}handleLoginChange(e){this.setState({login:e.target.value})}handlePasswordChange(e){this.setState({password:e})}handleEmailChange(e){this.setState({meth:"email",email:e.target.value})}handlePhoneChange(e){this.setState({meth:"tel",tel:e})}handleFnChange(e){this.setState({fn:e.target.value})}handleImageChanged(e,d){this.setState({newAvatar:d,newAvatarMime:e}),d||this.setState({imageUrl:null,uploadUrl:null})}handleToggleSaveToken(){h.A.setObject("keep-logged-in",!this.state.saveToken),this.setState({saveToken:!this.state.saveToken})}handleSubmit(e){e.preventDefault(),this.props.onCreateAccount(this.state.login.trim(),this.state.password.trim(),(0,p.k6)((0,m.W5)(this.state.fn.trim(),60),this.state.uploadUrl),{meth:this.state.meth,val:"email"==this.state.meth?this.state.email:"tel"==this.state.meth?this.state.tel:null})}handleAvatarCropped(e,d,a,i){d&&URL.createObjectURL(d),this.setState({newAvatar:null,newAvatarMime:null}),d&&this.uploadAvatar(e,d,a,i)}handleAvatarCropCancel(){this.setState({newAvatar:null,newAvatarMime:null})}uploadAvatar(e,d,a,i){const l=e=>{let{mime:d,blob:a}=e;this.setState({imageUrl:URL.createObjectURL(a),buttonDisabled:!0}),a.size>4096?this.props.tinode.getLargeFileHelper().upload(a,"newacc").then(e=>this.setState({uploadUrl:e})).catch(e=>this.props.onError(e.message,"err")).finally(e=>this.setState({buttonDisabled:!1})):(0,u.Sk)(a).then(e=>this.setState({uploadUrl:(0,u.to)({data:e.bits,type:d})})).finally(e=>this.setState({buttonDisabled:!1}))};a>384||i>384||a!=i?(0,u.ag)(d,384,384,g.qy,!0).then(e=>l(e)).catch(e=>this.props.onError(e.message,"err")):l({mime:e,blob:d,width:a,height:i})}render(){if(this.state.newAvatar)return(0,C.jsx)(t.A,{avatar:this.state.newAvatar,mime:this.state.newAvatarMime,onSubmit:this.handleAvatarCropped,onCancel:this.handleAvatarCropCancel,onError:this.props.onError});let e="primary";return this.props.disabled&&(e+=" disabled"),(0,C.jsxs)("form",{className:"panel-form-column",onSubmit:this.handleSubmit,children:[(0,C.jsxs)("div",{className:"panel-form-row",children:[(0,C.jsxs)("div",{className:"umn",children:[(0,C.jsx)(o.FormattedMessage,{id:"login_prompt",defaultMessage:"Login",description:"Placeholer for username/login",children:e=>(0,C.jsx)("input",{type:"text",placeholder:e,autoComplete:"user-name",value:this.state.login,onChange:this.handleLoginChange,required:!0,autoFocus:!0})}),(0,C.jsx)(o.FormattedMessage,{id:"password_prompt",defaultMessage:"Password",description:"Placeholder/prompt for entering password",children:e=>(0,C.jsx)(r.A,{placeholder:e,autoComplete:"new-password",value:this.state.password,onFinished:this.handlePasswordChange,required:!0})})]}),(0,C.jsx)(s.A,{tinode:this.props.tinode,avatar:this.state.imageUrl,onImageUpdated:this.handleImageChanged,onError:this.props.onError})]}),(0,C.jsx)("div",{className:"panel-form-row",children:(0,C.jsx)(o.FormattedMessage,{id:"full_name_prompt",defaultMessage:"Full name, e.g. John Doe",description:"Input placeholder for person's full name",children:e=>(0,C.jsx)("input",{type:"text",placeholder:e,autoComplete:"name",value:this.state.fn,onChange:this.handleFnChange,required:!0})})}),"email"==this.props.reqCredMethod?(0,C.jsx)("div",{className:"panel-form-row",children:(0,C.jsx)(o.FormattedMessage,{id:"email_prompt",defaultMessage:"Email, e.g. jdoe@example.com",description:"Input placeholder for email entry",children:e=>(0,C.jsx)("input",{type:"email",placeholder:e,autoComplete:"email",value:this.state.email,onChange:this.handleEmailChange,required:!0})})}):"tel"==this.props.reqCredMethod?(0,C.jsxs)(C.Fragment,{children:[(0,C.jsx)("div",{className:"panel-form-row",children:(0,C.jsx)("label",{className:"small gray",children:(0,C.jsx)(o.FormattedMessage,{id:"mobile_phone_number",defaultMessage:"Mobile phone number",description:"Prompt for entering a mobile phone number"})})}),(0,C.jsx)("div",{className:"panel-form-row",children:(0,C.jsx)(n.A,{autoFocus:!1,onShowCountrySelector:this.props.onShowCountrySelector,onSubmit:this.handlePhoneChange})})]}):null,(0,C.jsxs)("div",{className:"panel-form-row",children:[(0,C.jsx)(c.A,{id:"save-token",name:"save-token",checked:this.state.saveToken,onChange:this.handleToggleSaveToken}),(0,C.jsx)(o.FormattedMessage,{id:"stay_logged_in",defaultMessage:"Stay logged in",description:"Label for a checkbox",children:e=>(0,C.jsxs)("label",{htmlFor:"save-token",children:[" ",e]})})]}),(0,C.jsx)("div",{className:"dialog-buttons",children:(0,C.jsx)("button",{className:e,type:"submit",disabled:this.state.buttonDisabled,children:(0,C.jsx)(o.FormattedMessage,{id:"button_sign_up",defaultMessage:"Sign up",description:"Create account button [Sign Up]"})})})]})}}},2685:function(e,d,a){var i=a(1594),l=a.n(i),o=a(8181),t=a(8892),s=a(4724),c=a(6187),n=a(4701),r=a(111),h=a(7256),u=a(4848);const p=(0,o.defineMessages)({mobile_number_required:{id:"mobile_number_required",defaultMessage:"Mobile phone number required",description:"Error message"}});class m extends l().PureComponent{constructor(e){super(e),this.codeMap={},r.forEach(e=>{this.codeMap[e.code]=e.dial});const d=e.countryCode||"US",a=this.codeMap[d];this.state={countryCode:d,dialCode:a,localNumber:"",placeholderNumber:this.placeholderNumber(d,a)},this.handleChange=this.handleChange.bind(this),this.handleFinished=this.handleFinished.bind(this),this.handleKeyDown=this.handleKeyDown.bind(this),this.showCountrySelector=this.showCountrySelector.bind(this)}handleChange(e){const d=`+${this.state.dialCode}`;let a=(new s.Q).input(`${d}${this.filterNumber(e.target.value)}`);a=a.substring(d.length).trim(),this.setState({localNumber:a})}handleFinished(e){e.preventDefault();const d=`${this.state.dialCode}${this.state.localNumber.trim()}`.replace(/[^\d]/g,"");let a=null;try{a=(0,t.L)(`+${d}`)}catch(e){}a&&a.isValid()?(this.inputField.setCustomValidity(""),this.props.onSubmit(a.format("E.164"))):this.inputField.setCustomValidity(this.props.intl.formatMessage(p.mobile_number_required))}handleKeyDown(e){"Enter"===e.key&&this.handleFinished(e)}showCountrySelector(){this.props.onShowCountrySelector(this.state.countryCode,this.state.dialCode,(e,d)=>{this.setState({countryCode:e,dialCode:d,placeholderNumber:this.placeholderNumber(e,d)})})}filterNumber(e){return e?e.replace(/[^-\s().\d]/g,""):e}placeholderNumber(e,d){const a=(0,c.a)(e,n.A);return a?a.formatInternational().substring(d.length+1).trim():"123 0123"}render(){return(0,u.jsxs)(u.Fragment,{children:[(0,u.jsxs)("span",{className:"dial-code",onClick:this.showCountrySelector,children:[(0,u.jsxs)("span",{className:"country-flag",children:[(0,h.lb)(this.state.countryCode)," "]}),"+",this.state.dialCode," "]}),(0,u.jsx)("input",{type:"tel",ref:e=>{this.inputField=e},placeholder:this.state.placeholderNumber,value:this.state.localNumber,onChange:this.handleChange,maxLength:17,onKeyDown:this.handleKeyDown,onBlur:this.handleFinished,required:!0,autoFocus:this.props.autoFocus})]})}}d.A=(0,o.injectIntl)(m)},111:function(e){e.exports=JSON.parse('[{"dial":"93","code":"AF"},{"dial":"355","code":"AL"},{"dial":"213","code":"DZ"},{"dial":"1-684","code":"AS"},{"dial":"376","code":"AD"},{"dial":"244","code":"AO"},{"dial":"1-264","code":"AI"},{"dial":"672","code":"AQ"},{"dial":"1-268","code":"AG"},{"dial":"54","code":"AR"},{"dial":"374","code":"AM"},{"dial":"297","code":"AW"},{"dial":"61","code":"AU"},{"dial":"43","code":"AT"},{"dial":"994","code":"AZ"},{"dial":"1-242","code":"BS"},{"dial":"973","code":"BH"},{"dial":"880","code":"BD"},{"dial":"1-246","code":"BB"},{"dial":"375","code":"BY"},{"dial":"32","code":"BE"},{"dial":"501","code":"BZ"},{"dial":"229","code":"BJ"},{"dial":"1-441","code":"BM"},{"dial":"975","code":"BT"},{"dial":"591","code":"BO"},{"dial":"387","code":"BA"},{"dial":"267","code":"BW"},{"dial":"55","code":"BR"},{"dial":"246","code":"IO"},{"dial":"1-284","code":"VG"},{"dial":"673","code":"BN"},{"dial":"359","code":"BG"},{"dial":"226","code":"BF"},{"dial":"257","code":"BI"},{"dial":"855","code":"KH"},{"dial":"237","code":"CM"},{"dial":"1","code":"CA"},{"dial":"238","code":"CV"},{"dial":"1-345","code":"KY"},{"dial":"236","code":"CF"},{"dial":"235","code":"TD"},{"dial":"56","code":"CL"},{"dial":"86","code":"CN"},{"dial":"61","code":"CX"},{"dial":"61","code":"CC"},{"dial":"57","code":"CO"},{"dial":"269","code":"KM"},{"dial":"682","code":"CK"},{"dial":"506","code":"CR"},{"dial":"385","code":"HR"},{"dial":"53","code":"CU"},{"dial":"599","code":"CW"},{"dial":"357","code":"CY"},{"dial":"420","code":"CZ"},{"dial":"243","code":"CD"},{"dial":"45","code":"DK"},{"dial":"253","code":"DJ"},{"dial":"1-767","code":"DM"},{"dial":"1-809, 1-829, 1-849","code":"DO"},{"dial":"670","code":"TL"},{"dial":"593","code":"EC"},{"dial":"20","code":"EG"},{"dial":"503","code":"SV"},{"dial":"240","code":"GQ"},{"dial":"291","code":"ER"},{"dial":"372","code":"EE"},{"dial":"251","code":"ET"},{"dial":"500","code":"FK"},{"dial":"298","code":"FO"},{"dial":"679","code":"FJ"},{"dial":"358","code":"FI"},{"dial":"33","code":"FR"},{"dial":"689","code":"PF"},{"dial":"241","code":"GA"},{"dial":"220","code":"GM"},{"dial":"995","code":"GE"},{"dial":"49","code":"DE"},{"dial":"233","code":"GH"},{"dial":"350","code":"GI"},{"dial":"30","code":"GR"},{"dial":"299","code":"GL"},{"dial":"1-473","code":"GD"},{"dial":"1-671","code":"GU"},{"dial":"502","code":"GT"},{"dial":"44-1481","code":"GG"},{"dial":"224","code":"GN"},{"dial":"245","code":"GW"},{"dial":"592","code":"GY"},{"dial":"509","code":"HT"},{"dial":"504","code":"HN"},{"dial":"852","code":"HK"},{"dial":"36","code":"HU"},{"dial":"354","code":"IS"},{"dial":"91","code":"IN"},{"dial":"62","code":"ID"},{"dial":"98","code":"IR"},{"dial":"964","code":"IQ"},{"dial":"353","code":"IE"},{"dial":"44-1624","code":"IM"},{"dial":"972","code":"IL"},{"dial":"39","code":"IT"},{"dial":"225","code":"CI"},{"dial":"1-876","code":"JM"},{"dial":"81","code":"JP"},{"dial":"44-1534","code":"JE"},{"dial":"962","code":"JO"},{"dial":"7, 997","code":"KZ"},{"dial":"254","code":"KE"},{"dial":"686","code":"KI"},{"dial":"383","code":"XK"},{"dial":"965","code":"KW"},{"dial":"996","code":"KG"},{"dial":"856","code":"LA"},{"dial":"371","code":"LV"},{"dial":"961","code":"LB"},{"dial":"266","code":"LS"},{"dial":"231","code":"LR"},{"dial":"218","code":"LY"},{"dial":"423","code":"LI"},{"dial":"370","code":"LT"},{"dial":"352","code":"LU"},{"dial":"853","code":"MO"},{"dial":"389","code":"MK"},{"dial":"261","code":"MG"},{"dial":"265","code":"MW"},{"dial":"60","code":"MY"},{"dial":"960","code":"MV"},{"dial":"223","code":"ML"},{"dial":"356","code":"MT"},{"dial":"692","code":"MH"},{"dial":"222","code":"MR"},{"dial":"230","code":"MU"},{"dial":"262","code":"YT"},{"dial":"52","code":"MX"},{"dial":"691","code":"FM"},{"dial":"373","code":"MD"},{"dial":"377","code":"MC"},{"dial":"976","code":"MN"},{"dial":"382","code":"ME"},{"dial":"1-664","code":"MS"},{"dial":"212","code":"MA"},{"dial":"258","code":"MZ"},{"dial":"95","code":"MM"},{"dial":"264","code":"NA"},{"dial":"674","code":"NR"},{"dial":"977","code":"NP"},{"dial":"31","code":"NL"},{"dial":"599","code":"CW"},{"dial":"687","code":"NC"},{"dial":"64","code":"NZ"},{"dial":"505","code":"NI"},{"dial":"227","code":"NE"},{"dial":"234","code":"NG"},{"dial":"683","code":"NU"},{"dial":"850","code":"KP"},{"dial":"1-670","code":"MP"},{"dial":"47","code":"NO"},{"dial":"968","code":"OM"},{"dial":"92","code":"PK"},{"dial":"680","code":"PW"},{"dial":"970","code":"PS"},{"dial":"507","code":"PA"},{"dial":"675","code":"PG"},{"dial":"595","code":"PY"},{"dial":"51","code":"PE"},{"dial":"63","code":"PH"},{"dial":"64","code":"PN"},{"dial":"48","code":"PL"},{"dial":"351","code":"PT"},{"dial":"1-787, 1-939","code":"PR"},{"dial":"974","code":"QA"},{"dial":"242","code":"CG"},{"dial":"262","code":"RE"},{"dial":"40","code":"RO"},{"dial":"7","code":"RU"},{"dial":"250","code":"RW"},{"dial":"590","code":"BL"},{"dial":"290","code":"SH"},{"dial":"1-869","code":"KN"},{"dial":"1-758","code":"LC"},{"dial":"590","code":"MF"},{"dial":"508","code":"PM"},{"dial":"1-784","code":"VC"},{"dial":"685","code":"WS"},{"dial":"378","code":"SM"},{"dial":"239","code":"ST"},{"dial":"966","code":"SA"},{"dial":"221","code":"SN"},{"dial":"381","code":"RS"},{"dial":"248","code":"SC"},{"dial":"232","code":"SL"},{"dial":"65","code":"SG"},{"dial":"1-721","code":"SX"},{"dial":"421","code":"SK"},{"dial":"386","code":"SI"},{"dial":"677","code":"SB"},{"dial":"252","code":"SO"},{"dial":"27","code":"ZA"},{"dial":"82","code":"KR"},{"dial":"211","code":"SS"},{"dial":"34","code":"ES"},{"dial":"94","code":"LK"},{"dial":"249","code":"SD"},{"dial":"597","code":"SR"},{"dial":"47","code":"SJ"},{"dial":"268","code":"SZ"},{"dial":"46","code":"SE"},{"dial":"41","code":"CH"},{"dial":"963","code":"SY"},{"dial":"886","code":"TW"},{"dial":"992","code":"TJ"},{"dial":"255","code":"TZ"},{"dial":"66","code":"TH"},{"dial":"228","code":"TG"},{"dial":"690","code":"TK"},{"dial":"676","code":"TO"},{"dial":"1-868","code":"TT"},{"dial":"216","code":"TN"},{"dial":"90","code":"TR"},{"dial":"993","code":"TM"},{"dial":"1-649","code":"TC"},{"dial":"688","code":"TV"},{"dial":"1-340","code":"VI"},{"dial":"256","code":"UG"},{"dial":"380","code":"UA"},{"dial":"971","code":"AE"},{"dial":"44","code":"GB"},{"dial":"1","code":"US"},{"dial":"598","code":"UY"},{"dial":"998","code":"UZ"},{"dial":"678","code":"VU"},{"dial":"379","code":"VA"},{"dial":"58","code":"VE"},{"dial":"84","code":"VN"},{"dial":"681","code":"WF"},{"dial":"212","code":"EH"},{"dial":"967","code":"YE"},{"dial":"260","code":"ZM"},{"dial":"263","code":"ZW"}]')}}]);
+//# sourceMappingURL=627.prod.js.map
\ No newline at end of file
diff --git a/umd/627.prod.js.map b/umd/627.prod.js.map
new file mode 100644
index 00000000..eca53d3d
--- /dev/null
+++ b/umd/627.prod.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"627.prod.js","mappings":"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","sources":["webpack://tinode-webapp/./src/views/create-account-view.jsx","webpack://tinode-webapp/./src/widgets/phone-edit.jsx"],"sourcesContent":["// Account registration.\nimport React, { Suspense } from 'react';\nimport { FormattedMessage } from 'react-intl';\n\nimport AvatarCrop from '../widgets/avatar-crop.jsx';\nimport AvatarUpload from '../widgets/avatar-upload.jsx';\nimport CheckBox from '../widgets/checkbox.jsx';\nimport PhoneEdit from '../widgets/phone-edit.jsx';\nimport VisiblePassword from '../widgets/visible-password.jsx';\n\nimport LocalStorageUtil from '../lib/local-storage.js';\nimport { imageScaled, blobToBase64, makeImageUrl } from '../lib/blob-helpers.js';\nimport { theCard } from '../lib/utils.js';\nimport { truncateString } from '../lib/strformat.js';\n\nimport { AVATAR_SIZE, MAX_AVATAR_BYTES, MAX_EXTERN_ATTACHMENT_SIZE,\n 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 meth: '',\n email: '',\n tel: '',\n fn: '', // full/formatted name\n imageUrl: null,\n uploadUrl: null,\n newAvatar: null,\n newAvatarMime: null,\n buttonDisabled: 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.handlePhoneChange = this.handlePhoneChange.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.handleAvatarCropped = this.handleAvatarCropped.bind(this);\n this.handleAvatarCropCancel = this.handleAvatarCropCancel.bind(this);\n this.uploadAvatar = this.uploadAvatar.bind(this);\n this.handleSubmit = this.handleSubmit.bind(this);\n\n // Connection will trigger change by changing the this.props.serverVersion.\n props.tinode.connect()\n .catch(err => {\n this.props.onError(err.message, 'err');\n });\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({meth: 'email', email: e.target.value});\n }\n\n handlePhoneChange(number) {\n this.setState({meth: 'tel', tel: number});\n }\n\n handleFnChange(e) {\n this.setState({fn: e.target.value});\n }\n\n handleImageChanged(mime, img) {\n this.setState({newAvatar: img, newAvatarMime: mime});\n if (!img) {\n // User cleared the image.\n this.setState({imageUrl: null, uploadUrl: null});\n }\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.onCreateAccount(\n this.state.login.trim(),\n this.state.password.trim(),\n theCard(truncateString(this.state.fn.trim(), MAX_TITLE_LENGTH), this.state.uploadUrl),\n {\n 'meth': this.state.meth,\n 'val': this.state.meth == 'email' ?\n this.state.email :\n this.state.meth == 'tel' ? this.state.tel : null\n }\n );\n }\n\n // AvatarCropView calls this method when the user has cropped the image.\n handleAvatarCropped(mime, blob, width, height) {\n const url = blob ? URL.createObjectURL(blob) : null;\n this.setState({newAvatar: null, newAvatarMime: null});\n if (blob) {\n this.uploadAvatar(mime, blob, width, height);\n }\n }\n\n handleAvatarCropCancel() {\n this.setState({newAvatar: null, newAvatarMime: null});\n }\n\n // Utility method for converting cropped avatar blob to bytes for sending inband or\n // for uploading it to the server out of band.\n uploadAvatar(mime, blob, width, height) {\n const readyToUpload = image => {\n let {mime, blob} = image;\n this.setState({imageUrl: URL.createObjectURL(blob), buttonDisabled: true});\n if (blob.size > MAX_AVATAR_BYTES) {\n // Too large to send inband - uploading out of band and sending as a link.\n const uploader = this.props.tinode.getLargeFileHelper();\n uploader.upload(blob, 'newacc')\n .then(url => this.setState({uploadUrl: url}))\n .catch(err => this.props.onError(err.message, 'err'))\n .finally(_ => this.setState({buttonDisabled: false}));\n } else {\n // Convert blob to base64-encoded bits.\n blobToBase64(blob)\n .then(b64 => this.setState({uploadUrl: makeImageUrl({data: b64.bits, type: mime})}))\n .finally(_ => this.setState({buttonDisabled: false}));\n }\n };\n\n if (width > AVATAR_SIZE || height > AVATAR_SIZE || width != height) {\n // Avatar is not square or too large even after cropping. Shrink it and make square.\n imageScaled(blob, AVATAR_SIZE, AVATAR_SIZE, MAX_EXTERN_ATTACHMENT_SIZE, true)\n .then(scaled => readyToUpload(scaled))\n .catch(err => this.props.onError(err.message, 'err'));\n } else {\n readyToUpload({mime: mime, blob: blob, width: width, height: height});\n }\n }\n\n render() {\n if (this.state.newAvatar) {\n return (\n \n );\n }\n\n let submitClasses = 'primary';\n if (this.props.disabled) {\n submitClasses += ' disabled';\n }\n\n return (\n \n );\n }\n};\n","// Editor for a phone number.\n\nimport React from 'react';\nimport { defineMessages, injectIntl } from 'react-intl';\nimport { AsYouType, getExampleNumber, parsePhoneNumber } from 'libphonenumber-js/mobile';\nimport examples from 'libphonenumber-js/mobile/examples'\n\nimport * as dcodes from '../dcodes.json';\nimport { flagEmoji } from '../lib/strformat';\n\nconst messages = defineMessages({\n mobile_number_required: {\n id: 'mobile_number_required',\n defaultMessage: 'Mobile phone number required',\n description: 'Error message'\n }\n});\n\nclass PhoneEdit extends React.PureComponent {\n constructor(props) {\n super(props);\n\n this.codeMap = {};\n dcodes.default.forEach(dc => { this.codeMap[dc.code] = dc.dial; });\n\n const code = props.countryCode || 'US';\n const dial = this.codeMap[code];\n\n this.state = {\n countryCode: code,\n dialCode: dial,\n localNumber: '',\n placeholderNumber: this.placeholderNumber(code, dial)\n };\n\n this.handleChange = this.handleChange.bind(this);\n this.handleFinished = this.handleFinished.bind(this);\n this.handleKeyDown = this.handleKeyDown.bind(this);\n this.showCountrySelector = this.showCountrySelector.bind(this);\n }\n\n handleChange(e) {\n const prefix = `+${this.state.dialCode}`;\n let formatted = new AsYouType().input(`${prefix}${this.filterNumber(e.target.value)}`);\n formatted = formatted.substring(prefix.length).trim();\n this.setState({localNumber: formatted});\n }\n\n handleFinished(e) {\n e.preventDefault();\n const raw = `${this.state.dialCode}${this.state.localNumber.trim()}`.replace(/[^\\d]/g, '');\n let number = null;\n try {\n number = parsePhoneNumber(`+${raw}`);\n } catch (err) {}\n\n if (!number || !number.isValid()) {\n this.inputField.setCustomValidity(this.props.intl.formatMessage(messages.mobile_number_required));\n return;\n }\n\n this.inputField.setCustomValidity('');\n this.props.onSubmit(number.format('E.164'));\n }\n\n\n handleKeyDown(e) {\n if (e.key === 'Enter') {\n this.handleFinished(e);\n }\n }\n\n showCountrySelector() {\n this.props.onShowCountrySelector(this.state.countryCode, this.state.dialCode,\n (code, dial) => {\n this.setState({\n countryCode: code,\n dialCode: dial,\n placeholderNumber: this.placeholderNumber(code, dial)\n })\n });\n }\n\n // Filter out characters not permitted in a phone number.\n filterNumber(number) {\n if (!number) {\n return number;\n }\n // Leave numbers, space, (, ), -, and .\n // The + is not allowed: it's handled by the country code portion.\n return number.replace(/[^-\\s().\\d]/g, '');\n }\n\n placeholderNumber(code, dial) {\n const sample = getExampleNumber(code, examples);\n return sample ? sample.formatInternational().substring(dial.length + 1).trim() : '123 0123';\n }\n\n render() {\n return (\n <>\n \n {flagEmoji(this.state.countryCode)} \n +{this.state.dialCode} \n {this.inputField = ref}} placeholder={this.state.placeholderNumber}\n value={this.state.localNumber} onChange={this.handleChange}\n maxLength={17} onKeyDown={this.handleKeyDown} onBlur={this.handleFinished}\n required autoFocus={this.props.autoFocus} />\n >\n );\n }\n}\n\nexport default injectIntl(PhoneEdit);\n"],"names":["CreateAccountView","react__WEBPACK_IMPORTED_MODULE_0___default","constructor","props","super","this","state","login","password","meth","email","tel","fn","imageUrl","uploadUrl","newAvatar","newAvatarMime","buttonDisabled","saveToken","_lib_local_storage_js__WEBPACK_IMPORTED_MODULE_7__","A","getObject","handleLoginChange","bind","handlePasswordChange","handleEmailChange","handlePhoneChange","handleFnChange","handleImageChanged","handleToggleSaveToken","handleAvatarCropped","handleAvatarCropCancel","uploadAvatar","handleSubmit","tinode","connect","catch","err","onError","message","e","setState","target","value","number","mime","img","setObject","preventDefault","onCreateAccount","trim","_lib_utils_js__WEBPACK_IMPORTED_MODULE_9__","k6","_lib_strformat_js__WEBPACK_IMPORTED_MODULE_10__","W5","val","blob","width","height","URL","createObjectURL","readyToUpload","image","size","getLargeFileHelper","upload","then","url","finally","_","_lib_blob_helpers_js__WEBPACK_IMPORTED_MODULE_8__","Sk","b64","to","data","bits","type","ag","_config_js__WEBPACK_IMPORTED_MODULE_11__","qy","scaled","render","react_jsx_runtime__WEBPACK_IMPORTED_MODULE_12__","jsx","_widgets_avatar_crop_jsx__WEBPACK_IMPORTED_MODULE_2__","avatar","onSubmit","onCancel","submitClasses","disabled","jsxs","className","children","react_intl__WEBPACK_IMPORTED_MODULE_1__","FormattedMessage","id","defaultMessage","description","login_prompt","placeholder","autoComplete","onChange","required","autoFocus","password_prompt","_widgets_visible_password_jsx__WEBPACK_IMPORTED_MODULE_6__","onFinished","_widgets_avatar_upload_jsx__WEBPACK_IMPORTED_MODULE_3__","onImageUpdated","full_name_prompt","reqCredMethod","email_prompt","Fragment","_widgets_phone_edit_jsx__WEBPACK_IMPORTED_MODULE_5__","onShowCountrySelector","_widgets_checkbox_jsx__WEBPACK_IMPORTED_MODULE_4__","name","checked","stay_logged_in","htmlFor","messages","defineMessages","mobile_number_required","PhoneEdit","codeMap","_dcodes_json__WEBPACK_IMPORTED_MODULE_6__","forEach","dc","code","dial","countryCode","dialCode","localNumber","placeholderNumber","handleChange","handleFinished","handleKeyDown","showCountrySelector","prefix","formatted","libphonenumber_js_mobile__WEBPACK_IMPORTED_MODULE_3__","Q","input","filterNumber","substring","length","raw","replace","libphonenumber_js_mobile__WEBPACK_IMPORTED_MODULE_2__","L","isValid","inputField","setCustomValidity","format","intl","formatMessage","key","sample","libphonenumber_js_mobile__WEBPACK_IMPORTED_MODULE_4__","a","libphonenumber_js_mobile_examples__WEBPACK_IMPORTED_MODULE_5__","formatInternational","react_jsx_runtime__WEBPACK_IMPORTED_MODULE_8__","onClick","_lib_strformat__WEBPACK_IMPORTED_MODULE_7__","lb","ref","maxLength","onKeyDown","onBlur","__webpack_exports__","injectIntl"],"sourceRoot":""}
\ No newline at end of file
diff --git a/umd/686.prod.js b/umd/686.prod.js
new file mode 100644
index 00000000..f10cd3de
--- /dev/null
+++ b/umd/686.prod.js
@@ -0,0 +1,2 @@
+"use strict";(self.webpackChunktinode_webapp=self.webpackChunktinode_webapp||[]).push([[686],{3686:function(e,a,t){t.r(a),t.d(a,{default:function(){return c}});var s=t(1594),l=t.n(s),i=t(8181),r=t(184),n=t(3272),d=t(7849),h=t(1781),p=t(4848);class c extends l().PureComponent{constructor(e){super(e);const a=(0,d.MC)(this.props.wallpaper),t=(0,d.t7)(this.props.wallpaper);this.state={tab:a||n.S.type,selectedType:a||n.S.type,wallpaper:t||h[n.S.type][n.S.index].name,blur:0|this.props.wallpaperBlur},this.blurValues=[0,1,2,4,8,16],this.handleTabClick=this.handleTabClick.bind(this),this.handleWallpaperSelected=this.handleWallpaperSelected.bind(this),this.handleBlurChanged=this.handleBlurChanged.bind(this),this.hasChanged=this.hasChanged.bind(this)}handleTabClick(e){e.preventDefault(),r.A.navigateTo(r.A.addUrlParam(window.location.hash,"tab",e.currentTarget.dataset.id)),this.setState({tab:e.currentTarget.dataset.id})}handleWallpaperSelected(e){let a,t,s;if(e)e.preventDefault(),t=this.state.tab,a=e.currentTarget.dataset.id,s="patt"==t?0:this.state.blur;else{if(!this.hasChanged())return;t=n.S.type,a=n.S.index,s=0}const l=h[t][a].name,i="patt"==t?h[t][a].size:0;this.setState({tab:t,wallpaper:l,selectedType:t,blur:s}),this.props.onWallpaperSelected(`../${n.S.path}${l}`,i,this.blurValues[s])}handleBlurChanged(e){e.preventDefault();const a=e.currentTarget.value;this.setState({blur:a}),"img"==this.state.selectedType&&this.props.onWallpaperSelected(`../${n.S.path}${this.state.wallpaper}`,0,this.blurValues[a])}hasChanged(){return this.state.selectedType!=n.S.type||this.state.wallpaper!=h[n.S.type][n.S.index].name||0!=this.state.blur}render(){return(0,p.jsxs)("div",{className:"flex-column",children:[(0,p.jsx)("div",{className:"panel-form-row"+(this.hasChanged()?" clean-clickable":""),children:(0,p.jsxs)("a",{className:"flat-button"+(this.hasChanged()?"":" disabled"),onClick:()=>this.handleWallpaperSelected(null),children:[(0,p.jsx)("i",{className:"material-icons",children:"undo"})," ",(0,p.jsx)(i.FormattedMessage,{id:"button_restore",defaultMessage:"Restore default",description:"Reset setting to default"})]})}),(0,p.jsxs)("ul",{className:"tabbar",children:[(0,p.jsx)("li",{className:"patt"===this.state.tab?"active":null,children:(0,p.jsx)("a",{href:"#","data-id":"patt",onClick:this.handleTabClick,children:(0,p.jsx)(i.FormattedMessage,{id:"tabtitle_pattern",defaultMessage:"pattern",description:"Tab title Pattern"})})}),(0,p.jsx)("li",{className:"img"===this.state.tab?"active":null,children:(0,p.jsx)("a",{href:"#","data-id":"img",onClick:this.handleTabClick,children:(0,p.jsx)(i.FormattedMessage,{id:"tabtitle_image",defaultMessage:"image",description:"Tab title Image"})})})]}),(0,p.jsx)("div",{id:"settings-form",className:"scrollable-panel",children:"patt"===this.state.tab?(0,p.jsx)("div",{className:"image-grid",children:h.patt.map((e,a)=>{const t=this.state.wallpaper===e.name?" selected":"",s="dark"==this.props.colorSchema?"inverted":null;return(0,p.jsx)("div",{"data-id":a,className:`image-grid-cell${t}`,onClick:this.handleWallpaperSelected,children:(0,p.jsx)("img",{src:n.S.path+e.name,alt:e.name,className:s,style:{width:`${e.size}px`,height:`${e.size}px`}})},a)})}):(0,p.jsxs)(p.Fragment,{children:[(0,p.jsxs)("div",{className:"panel-form-column",children:[(0,p.jsx)("div",{className:"panel-form-row",children:(0,p.jsx)("label",{className:"small",children:(0,p.jsx)(i.FormattedMessage,{id:"label_blur_wallpaper",defaultMessage:"Blur:",description:"Label adjusting blur amount"})})}),(0,p.jsx)("div",{className:"panel-form-row",children:(0,p.jsx)("input",{type:"range",id:"blur",name:"blur",min:"0",max:"5",step:"1",value:this.state.blur,onChange:this.handleBlurChanged})})]}),(0,p.jsx)("div",{className:"image-grid",children:h.img.map((e,a)=>{const t=this.state.wallpaper===e.name?" selected":"";return(0,p.jsx)("div",{"data-id":a,className:`image-grid-cell${t}`,onClick:this.handleWallpaperSelected,children:(0,p.jsx)("img",{src:n.S.path+e.pr,alt:e.name,style:{width:"100%",height:"100%"}})},a)})})]})})]})}}}}]);
+//# sourceMappingURL=686.prod.js.map
\ No newline at end of file
diff --git a/umd/686.prod.js.map b/umd/686.prod.js.map
new file mode 100644
index 00000000..b527f0d6
--- /dev/null
+++ b/umd/686.prod.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"686.prod.js","mappings":"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","sources":["webpack://tinode-webapp/./src/views/wallpapers.jsx"],"sourcesContent":["// Edit account parameters.\nimport React from 'react';\nimport { FormattedMessage } from 'react-intl';\nimport HashNavigation from '../lib/navigation.js';\nimport { WALLPAPER_DEFAULTS } from '../config.js';\nimport { wallpaperNameFromUrl, wallpaperTypeFromUrl } from '../lib/utils.js';\nimport imageIndex from '../../img/bkg/index.json';\n\nexport default class WallpapersView extends React.PureComponent {\n constructor(props) {\n super(props);\n\n const type = wallpaperTypeFromUrl(this.props.wallpaper);\n const name = wallpaperNameFromUrl(this.props.wallpaper);\n this.state = {\n tab: type || WALLPAPER_DEFAULTS.type, // currently selected tab: 'patt' | 'img'\n selectedType: type || WALLPAPER_DEFAULTS.type, // type of the selected wallpaper.\n wallpaper: name || imageIndex[WALLPAPER_DEFAULTS.type][WALLPAPER_DEFAULTS.index].name,\n blur: this.props.wallpaperBlur | 0,\n };\n\n this.blurValues = [0, 1, 2, 4, 8, 16];\n\n this.handleTabClick = this.handleTabClick.bind(this);\n this.handleWallpaperSelected = this.handleWallpaperSelected.bind(this);\n this.handleBlurChanged = this.handleBlurChanged.bind(this);\n this.hasChanged = this.hasChanged.bind(this);\n }\n\n handleTabClick(e) {\n e.preventDefault();\n HashNavigation.navigateTo(HashNavigation.addUrlParam(window.location.hash, 'tab', e.currentTarget.dataset.id));\n this.setState({tab: e.currentTarget.dataset.id});\n }\n\n handleWallpaperSelected(e) {\n let index, type, blur\n if (!e) {\n if (!this.hasChanged()) {\n return;\n }\n\n // Restore default.\n type = WALLPAPER_DEFAULTS.type;\n index = WALLPAPER_DEFAULTS.index;\n blur = 0;\n } else {\n e.preventDefault();\n type = this.state.tab;\n index = e.currentTarget.dataset.id;\n blur = type == 'patt' ? 0 : this.state.blur;\n }\n const fname = imageIndex[type][index].name;\n const size = type == 'patt' ? imageIndex[type][index].size : 0;\n this.setState({tab: type, wallpaper: fname, selectedType: type, blur: blur});\n this.props.onWallpaperSelected(`../${WALLPAPER_DEFAULTS.path}${fname}`, size, this.blurValues[blur]);\n }\n\n handleBlurChanged(e) {\n e.preventDefault();\n const blur = e.currentTarget.value;\n this.setState({blur: blur});\n if (this.state.selectedType == 'img') {\n // Apply blur to patterns only. Path relative to CSS file.\n this.props.onWallpaperSelected(`../${WALLPAPER_DEFAULTS.path}${this.state.wallpaper}`, 0, this.blurValues[blur]);\n }\n }\n\n hasChanged() {\n return this.state.selectedType != WALLPAPER_DEFAULTS.type ||\n this.state.wallpaper != imageIndex[WALLPAPER_DEFAULTS.type][WALLPAPER_DEFAULTS.index].name ||\n this.state.blur != 0;\n }\n\n render() {\n return (\n \n );\n }\n}\n"],"names":["WallpapersView","react__WEBPACK_IMPORTED_MODULE_0___default","constructor","props","super","type","_lib_utils_js__WEBPACK_IMPORTED_MODULE_4__","MC","this","wallpaper","name","t7","state","tab","_config_js__WEBPACK_IMPORTED_MODULE_3__","S","selectedType","_img_bkg_index_json__WEBPACK_IMPORTED_MODULE_5__","index","blur","wallpaperBlur","blurValues","handleTabClick","bind","handleWallpaperSelected","handleBlurChanged","hasChanged","e","preventDefault","_lib_navigation_js__WEBPACK_IMPORTED_MODULE_2__","A","navigateTo","addUrlParam","window","location","hash","currentTarget","dataset","id","setState","fname","size","onWallpaperSelected","path","value","render","react_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__","jsxs","className","children","jsx","onClick","react_intl__WEBPACK_IMPORTED_MODULE_1__","FormattedMessage","defaultMessage","description","href","patt","map","img","idx","selected","dark","colorSchema","src","alt","style","width","height","Fragment","min","max","step","onChange","pr"],"sourceRoot":""}
\ No newline at end of file
diff --git a/umd/803.prod.js b/umd/803.prod.js
new file mode 100644
index 00000000..d0513db5
--- /dev/null
+++ b/umd/803.prod.js
@@ -0,0 +1,2 @@
+"use strict";(self.webpackChunktinode_webapp=self.webpackChunktinode_webapp||[]).push([[803],{4803:function(e,s,n){n.r(s),n.d(s,{default:function(){return m}});var a=n(1594),t=n.n(a),r=n(8181),i=n(8892),o=n(5372),l=n(5247),d=n(4532),c=n(7981),h=n(4848);const p=(0,r.defineMessages)({unknown_name:{id:"unknown_name",defaultMessage:"Unknown",description:"Name to show when the name is missing"}});class m extends t().PureComponent{constructor(e){super(e),this.state={content:e.content.object},e.content.object||(0,c.QJ)(e.content.file).then(e=>{this.setState({content:e})}),this.handleSendCard=this.handleSendCard.bind(this),this.handleKeyDown=this.handleKeyDown.bind(this)}componentDidMount(){document.addEventListener("keydown",this.handleKeyDown)}componentWillUnmount(){document.removeEventListener("keydown",this.handleKeyDown)}handleKeyDown(e){e.preventDefault(),"Escape"===e.key&&this.props.onClose()}handleSendCard(){this.props.onClose(),this.props.onSendMessage(this.props.content)}render(){const e=this.state.content,s=d.TheCard.getFn(e),n=d.TheCard.getPhotoUrl(e)||null,a=e?.note,t=d.TheCard.getOrg(e),c=d.TheCard.getComm(e,"email")||[],m=d.TheCard.getComm(e,"tel")||[],u=d.TheCard.getComm(e,"tinode")||[],j=d.TheCard.getComm(e,"http")||[],x=[];return c.forEach((e,s)=>{const n=Array.isArray(e.des)?e.des.join(", "):"";x.push((0,h.jsxs)("div",{className:"group quoted",children:[(0,h.jsx)("tt",{children:e.value}),(0,h.jsxs)("span",{className:"small gray",children:[" ",n?`(${n})`:""]})]},`email-${s}`))}),m.forEach((e,s)=>{let n=e.value;try{const s=(0,i.L)(e.value);n=s?s.formatInternational():e.value}catch(e){}const a=Array.isArray(e.des)?e.des.join(", "):"";x.push((0,h.jsxs)("div",{className:"group quoted",children:[(0,h.jsx)("tt",{children:n}),(0,h.jsxs)("span",{className:"small gray",children:[" ",a?`(${a})`:""]})]},`tel-${s}`))}),u.forEach((e,s)=>{const n=Array.isArray(e.des)?e.des.join(", "):"";x.push((0,h.jsxs)("div",{className:"group quoted",children:[(0,h.jsx)("tt",{children:e.value}),(0,h.jsxs)("span",{className:"small gray",children:[" ",n?`(${n})`:""]})]},`tinode-${s}`))}),j.forEach((e,s)=>{const n=Array.isArray(e.des)?e.des.join(", "):"";x.push((0,h.jsxs)("div",{className:"group quoted",children:[(0,h.jsx)("tt",{children:e.value}),(0,h.jsxs)("span",{className:"small gray",children:[" ",n?`(${n})`:""]})]},`url-${s}`))}),(0,h.jsxs)("div",{id:"image-preview",children:[(0,h.jsxs)("div",{id:"preview-caption-panel",children:[(0,h.jsx)("span",{children:(0,h.jsx)(r.FormattedMessage,{id:"label_contact_card",defaultMessage:"Contact Card",description:"Label for contact card preview"})}),(0,h.jsx)("a",{href:"#",onClick:e=>{e.preventDefault(),this.props.onClose()},children:(0,h.jsx)("i",{className:"material-icons gray",children:"close"})})]}),(0,h.jsx)("div",{id:"image-preview-container",children:(0,h.jsx)("div",{className:"doc-card",children:(0,h.jsxs)("div",{className:"panel-form-column",children:[(0,h.jsx)("center",{children:(0,h.jsx)("div",{className:"avatar-box",children:(0,h.jsx)(l.A,{authorizeURL:this.props.tinode.authorizeURL,avatar:n||!0,topic:"usrXXX123",title:s})})}),(0,h.jsx)("div",{className:"group",children:(0,h.jsx)("div",{className:"large ellipsized",children:s||(0,h.jsx)(r.FormattedMessage,{...p.unknown_name})})}),t?(0,h.jsx)("div",{className:"group",children:(0,h.jsx)("div",{children:t})}):null,a?(0,h.jsxs)("div",{className:"group",children:[(0,h.jsx)("label",{className:"small",children:(0,h.jsx)(r.FormattedMessage,{id:"label_description",defaultMessage:"Description",description:"Label for description of user or topic"})}),(0,h.jsx)("div",{className:"quoted",children:a})]}):null,x.length>0?(0,h.jsxs)("div",{className:"group",children:[(0,h.jsx)("label",{className:"small",children:(0,h.jsx)(r.FormattedMessage,{id:"label_contacts",defaultMessage:"Contacts",description:"Label for contact information"})}),x]}):null]})})}),(0,h.jsx)(o.A,{noInput:!0,tinode:this.props.tinode,reply:this.props.reply,onCancelReply:this.props.onCancelReply,onSendMessage:this.handleSendCard,onError:this.props.onError})]})}}}}]);
+//# sourceMappingURL=803.prod.js.map
\ No newline at end of file
diff --git a/umd/803.prod.js.map b/umd/803.prod.js.map
new file mode 100644
index 00000000..638c8e28
--- /dev/null
+++ b/umd/803.prod.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"803.prod.js","mappings":"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","sources":["webpack://tinode-webapp/./src/widgets/the-card-preview.jsx"],"sourcesContent":["import React from 'react';\nimport { defineMessages, FormattedMessage } from 'react-intl';\nimport { parsePhoneNumber } from 'libphonenumber-js/mobile';\n\nimport SendMessage from './send-message.jsx';\nimport LetterTile from './letter-tile.jsx';\n\nimport { TheCard } from 'tinode-sdk';\nimport { importVCard } from '../lib/blob-helpers.js';\n\nconst messages = defineMessages({\n unknown_name: {\n id: 'unknown_name',\n defaultMessage: 'Unknown',\n description: 'Name to show when the name is missing'\n }\n});\n\nexport default class TheCardPreview extends React.PureComponent {\n constructor(props) {\n super(props);\n\n this.state = {\n content: props.content.object\n };\n\n if (!props.content.object) {\n importVCard(props.content.file)\n .then(card => {\n this.setState({ content: card });\n });\n }\n\n this.handleSendCard = this.handleSendCard.bind(this);\n this.handleKeyDown = this.handleKeyDown.bind(this);\n }\n\n componentDidMount() {\n document.addEventListener('keydown', this.handleKeyDown);\n }\n\n componentWillUnmount() {\n document.removeEventListener('keydown', this.handleKeyDown);\n }\n\n handleKeyDown(e) {\n e.preventDefault();\n if (e.key === 'Escape') {\n this.props.onClose();\n }\n }\n\n handleSendCard() {\n this.props.onClose();\n this.props.onSendMessage(this.props.content);\n }\n\n render() {\n const card = this.state.content;\n\n const fullName = TheCard.getFn(card);\n const photoUrl = TheCard.getPhotoUrl(card) || null;\n const note = card?.note;\n const org = TheCard.getOrg(card);\n\n // Get communication methods\n const emails = TheCard.getComm(card, 'email') || [];\n const phones = TheCard.getComm(card, 'tel') || [];\n const tinodeIds = TheCard.getComm(card, 'tinode') || [];\n const urls = TheCard.getComm(card, 'http') || [];\n\n const contacts = [];\n\n // Add emails\n emails.forEach((email, idx) => {\n const types = Array.isArray(email.des) ? email.des.join(', ') : '';\n contacts.push(\n \n {email.value} \n {types ? `(${types})` : ''} \n
\n );\n });\n\n // Add phones\n phones.forEach((phone, idx) => {\n let val = phone.value;\n try {\n const number = parsePhoneNumber(phone.value);\n val = number ? number.formatInternational() : phone.value;\n } catch (err) {\n // Use original value if parsing fails\n }\n const types = Array.isArray(phone.des) ? phone.des.join(', ') : '';\n contacts.push(\n \n {val} \n {types ? `(${types})` : ''} \n
\n );\n });\n\n // Add Tinode IDs\n tinodeIds.forEach((tid, idx) => {\n const types = Array.isArray(tid.des) ? tid.des.join(', ') : '';\n contacts.push(\n \n {tid.value} \n {types ? `(${types})` : ''} \n
\n );\n });\n\n // Add URLs\n urls.forEach((url, idx) => {\n const types = Array.isArray(url.des) ? url.des.join(', ') : '';\n contacts.push(\n \n {url.value} \n {types ? `(${types})` : ''} \n
\n );\n });\n\n return (\n \n
\n
\n
\n
\n
\n \n \n
\n \n
\n {org ?\n
\n : null}\n {note ?\n
\n : null}\n {contacts.length > 0 ?\n
\n \n \n \n {contacts}\n
\n : null}\n
\n
\n
\n
\n
\n );\n }\n}\n"],"names":["messages","react_intl__WEBPACK_IMPORTED_MODULE_1__","defineMessages","unknown_name","id","defaultMessage","description","TheCardPreview","react__WEBPACK_IMPORTED_MODULE_0___default","constructor","props","super","this","state","content","object","_lib_blob_helpers_js__WEBPACK_IMPORTED_MODULE_6__","QJ","file","then","card","setState","handleSendCard","bind","handleKeyDown","componentDidMount","document","addEventListener","componentWillUnmount","removeEventListener","e","preventDefault","key","onClose","onSendMessage","render","fullName","tinode_sdk__WEBPACK_IMPORTED_MODULE_5__","TheCard","getFn","photoUrl","getPhotoUrl","note","org","getOrg","emails","getComm","phones","tinodeIds","urls","contacts","forEach","email","idx","types","Array","isArray","des","join","push","react_jsx_runtime__WEBPACK_IMPORTED_MODULE_7__","jsxs","className","children","jsx","value","phone","val","number","libphonenumber_js_mobile__WEBPACK_IMPORTED_MODULE_2__","L","formatInternational","err","tid","url","FormattedMessage","href","onClick","_letter_tile_jsx__WEBPACK_IMPORTED_MODULE_4__","A","authorizeURL","tinode","avatar","topic","title","length","_send_message_jsx__WEBPACK_IMPORTED_MODULE_3__","noInput","reply","onCancelReply","onError"],"sourceRoot":""}
\ No newline at end of file
diff --git a/umd/806.prod.js b/umd/806.prod.js
new file mode 100644
index 00000000..4aa58167
--- /dev/null
+++ b/umd/806.prod.js
@@ -0,0 +1,2 @@
+"use strict";(self.webpackChunktinode_webapp=self.webpackChunktinode_webapp||[]).push([[806],{3806:function(e,d,a){a.r(d);var i=a(1594),o=a.n(i),t=a(8181),s=a(2685),l=a(8568),c=a(184),r=a(4848);const n=(0,t.defineMessages)({password_reset_email_sent:{id:"password_reset_email_sent",defaultMessage:"An email with security code has been sent.",description:"Notification that the email with password reset instructions has been sent"},password_reset_sms_sent:{id:"password_reset_sms_sent",defaultMessage:"A text message with security code has been sent.",description:"Notification that the SMS with password reset instructions has been sent"}});class h extends o().PureComponent{constructor(e){super(e),this.state={tel:"",email:"",password:"",sent:!1,haveCode:!1,code:""},this.handleSubmit=this.handleSubmit.bind(this),this.handleEmailChange=this.handleEmailChange.bind(this),this.handlePasswordChange=this.handlePasswordChange.bind(this),this.handleCodeChange=this.handleCodeChange.bind(this),this.handleShowCodeField=this.handleShowCodeField.bind(this),e.tinode.connect().catch(e=>{this.props.onError(e.message,"err")})}componentDidMount(){const e=c.A.parseUrlHash(window.location.hash),d={token:e.params.token,scheme:e.params.scheme,code:e.params.code||""};this.savedCred=e.params.cred,this.props.reqCredMethod&&e.params.cred&&(d[this.props.reqCredMethod]=this.savedCred),this.setState(d)}componentDidUpdate(e,d){e.reqCredMethod!=this.props.reqCredMethod&&this.props.reqCredMethod&&this.setState({[this.props.reqCredMethod]:this.savedCred||""})}handleSubmit(e){if(e.preventDefault(),this.state.token)this.props.onReset(this.state.password.trim(),{scheme:"token",secret:this.state.token});else if(this.state.code&&this.props.reqCredMethod){const e="email"==this.props.reqCredMethod?this.state.email.trim():this.state.tel.trim();this.props.onReset(this.state.password.trim(),{scheme:"code",secret:btoa(`${this.state.code}:${this.props.reqCredMethod}:${e}`)})}else{const e=this.state.email.trim(),d=this.state.tel.trim();this.setState({email:e,tel:d}),this.props.onRequest(this.props.reqCredMethod,e||d).then(e=>{this.setState({sent:!0});const d="email"==this.props.reqCredMethod?n.password_reset_email_sent:"tel"==this.props.reqCredMethod?n.password_reset_sms_sent:null;d&&this.props.onError(this.props.intl.formatMessage(d),"info")})}}handleEmailChange(e){this.setState({email:e.target.value})}handlePasswordChange(e){this.setState({password:e.target.value})}handleCodeChange(e){this.setState({code:e.target.value.replace(/[^\d]/g,"")})}handleShowCodeField(e){e.preventDefault(),this.setState({haveCode:!0})}render(){const e=!((this.state.token||this.state.code&&this.props.reqCredMethod)&&this.state.scheme),d=!e||this.state.haveCode||this.state.sent,a=(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)("label",{className:"small gray",htmlFor:"new-password",children:(0,r.jsx)(t.FormattedMessage,{id:"label_new_password",defaultMessage:"New password",description:"Label for entering a new password"})}),(0,r.jsx)(t.FormattedMessage,{id:"new_password_placeholder",defaultMessage:"Enter new password",description:"Placeholder for entering new password",children:e=>(0,r.jsx)(l.A,{id:"new-password",placeholder:e,autoComplete:"new-password",value:this.state.password,required:!0,autoFocus:!0,onChange:this.handlePasswordChange})})]}),i=(0,r.jsxs)(r.Fragment,{children:[this.state.haveCode?null:(0,r.jsx)("label",{htmlFor:"inputEmail",children:(0,r.jsx)(t.FormattedMessage,{id:"label_reset_password",defaultMessage:"Send a password reset email",description:"Label for password reset field"})}),(0,r.jsx)(t.FormattedMessage,{id:"credential_email_prompt",defaultMessage:"Your registration email",description:"Placeholder for entering email",children:e=>(0,r.jsx)("input",{type:"email",id:"inputEmail",placeholder:e,autoComplete:"email",value:this.state.email,onChange:this.handleEmailChange,required:!0,autoFocus:!0})})]}),o=(0,r.jsxs)(r.Fragment,{children:[this.state.haveCode?null:(0,r.jsx)("div",{children:(0,r.jsx)("label",{children:(0,r.jsx)(t.FormattedMessage,{id:"label_reset_password_tel",defaultMessage:"Send SMS to reset password",description:"Label for password reset field by phone"})})}),(0,r.jsx)("div",{children:(0,r.jsx)("label",{className:"small gray",children:(0,r.jsx)(t.FormattedMessage,{id:"mobile_phone_number",defaultMessage:"Mobile phone number",description:"Prompt for entering a mobile phone number"})})}),(0,r.jsx)("div",{className:"panel-form-row",children:(0,r.jsx)(s.A,{autoFocus:!0,onShowCountrySelector:this.props.onShowCountrySelector,onSubmit:e=>this.setState({tel:e})})})]}),c=(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)("div",{children:(0,r.jsx)("label",{className:"small gray",htmlFor:"enter-confirmation-code",children:(0,r.jsx)(t.FormattedMessage,{id:"enter_confirmation_code_prompt",defaultMessage:"Confirmation code",description:"Request to enter confirmation code"})})}),(0,r.jsx)("div",{children:(0,r.jsx)(t.FormattedMessage,{id:"numeric_confirmation_code_prompt",defaultMessage:"Numbers only",description:"Prompt for numeric conformation code",children:e=>(0,r.jsx)("input",{type:"text",id:"enter-confirmation-code",placeholder:e,maxLength:10,value:this.state.code,onChange:this.handleCodeChange,required:!0})})})]}),n="email"==this.props.reqCredMethod?i:"tel"==this.props.reqCredMethod?o:null;return(0,r.jsxs)("form",{id:"password-reset-form",onSubmit:this.handleSubmit,children:[!this.state.sent&&e?n:null,this.state.haveCode||this.state.sent?c:null,d?a:null,(0,r.jsxs)("div",{className:"dialog-buttons",children:[this.state.haveCode||this.state.sent||this.state.token||this.state.code?null:(0,r.jsx)("a",{href:"#",onClick:this.handleShowCodeField,style:{marginRight:"auto"},children:(0,r.jsx)(t.FormattedMessage,{id:"password_i_have_code",defaultMessage:"I have code",description:"Call to open field to enter password reset code"})}),(0,r.jsx)("button",{className:"primary",type:"submit",children:d?(0,r.jsx)(t.FormattedMessage,{id:"button_reset",defaultMessage:"Reset",description:"Button [Reset]"}):(0,r.jsx)(t.FormattedMessage,{id:"button_send_request",defaultMessage:"Send request",description:"Button [Send request]"})})]})]})}}d.default=(0,t.injectIntl)(h)},2685:function(e,d,a){var i=a(1594),o=a.n(i),t=a(8181),s=a(8892),l=a(4724),c=a(6187),r=a(4701),n=a(111),h=a(7256),p=a(4848);const m=(0,t.defineMessages)({mobile_number_required:{id:"mobile_number_required",defaultMessage:"Mobile phone number required",description:"Error message"}});class u extends o().PureComponent{constructor(e){super(e),this.codeMap={},n.forEach(e=>{this.codeMap[e.code]=e.dial});const d=e.countryCode||"US",a=this.codeMap[d];this.state={countryCode:d,dialCode:a,localNumber:"",placeholderNumber:this.placeholderNumber(d,a)},this.handleChange=this.handleChange.bind(this),this.handleFinished=this.handleFinished.bind(this),this.handleKeyDown=this.handleKeyDown.bind(this),this.showCountrySelector=this.showCountrySelector.bind(this)}handleChange(e){const d=`+${this.state.dialCode}`;let a=(new l.Q).input(`${d}${this.filterNumber(e.target.value)}`);a=a.substring(d.length).trim(),this.setState({localNumber:a})}handleFinished(e){e.preventDefault();const d=`${this.state.dialCode}${this.state.localNumber.trim()}`.replace(/[^\d]/g,"");let a=null;try{a=(0,s.L)(`+${d}`)}catch(e){}a&&a.isValid()?(this.inputField.setCustomValidity(""),this.props.onSubmit(a.format("E.164"))):this.inputField.setCustomValidity(this.props.intl.formatMessage(m.mobile_number_required))}handleKeyDown(e){"Enter"===e.key&&this.handleFinished(e)}showCountrySelector(){this.props.onShowCountrySelector(this.state.countryCode,this.state.dialCode,(e,d)=>{this.setState({countryCode:e,dialCode:d,placeholderNumber:this.placeholderNumber(e,d)})})}filterNumber(e){return e?e.replace(/[^-\s().\d]/g,""):e}placeholderNumber(e,d){const a=(0,c.a)(e,r.A);return a?a.formatInternational().substring(d.length+1).trim():"123 0123"}render(){return(0,p.jsxs)(p.Fragment,{children:[(0,p.jsxs)("span",{className:"dial-code",onClick:this.showCountrySelector,children:[(0,p.jsxs)("span",{className:"country-flag",children:[(0,h.lb)(this.state.countryCode)," "]}),"+",this.state.dialCode," "]}),(0,p.jsx)("input",{type:"tel",ref:e=>{this.inputField=e},placeholder:this.state.placeholderNumber,value:this.state.localNumber,onChange:this.handleChange,maxLength:17,onKeyDown:this.handleKeyDown,onBlur:this.handleFinished,required:!0,autoFocus:this.props.autoFocus})]})}}d.A=(0,t.injectIntl)(u)},111:function(e){e.exports=JSON.parse('[{"dial":"93","code":"AF"},{"dial":"355","code":"AL"},{"dial":"213","code":"DZ"},{"dial":"1-684","code":"AS"},{"dial":"376","code":"AD"},{"dial":"244","code":"AO"},{"dial":"1-264","code":"AI"},{"dial":"672","code":"AQ"},{"dial":"1-268","code":"AG"},{"dial":"54","code":"AR"},{"dial":"374","code":"AM"},{"dial":"297","code":"AW"},{"dial":"61","code":"AU"},{"dial":"43","code":"AT"},{"dial":"994","code":"AZ"},{"dial":"1-242","code":"BS"},{"dial":"973","code":"BH"},{"dial":"880","code":"BD"},{"dial":"1-246","code":"BB"},{"dial":"375","code":"BY"},{"dial":"32","code":"BE"},{"dial":"501","code":"BZ"},{"dial":"229","code":"BJ"},{"dial":"1-441","code":"BM"},{"dial":"975","code":"BT"},{"dial":"591","code":"BO"},{"dial":"387","code":"BA"},{"dial":"267","code":"BW"},{"dial":"55","code":"BR"},{"dial":"246","code":"IO"},{"dial":"1-284","code":"VG"},{"dial":"673","code":"BN"},{"dial":"359","code":"BG"},{"dial":"226","code":"BF"},{"dial":"257","code":"BI"},{"dial":"855","code":"KH"},{"dial":"237","code":"CM"},{"dial":"1","code":"CA"},{"dial":"238","code":"CV"},{"dial":"1-345","code":"KY"},{"dial":"236","code":"CF"},{"dial":"235","code":"TD"},{"dial":"56","code":"CL"},{"dial":"86","code":"CN"},{"dial":"61","code":"CX"},{"dial":"61","code":"CC"},{"dial":"57","code":"CO"},{"dial":"269","code":"KM"},{"dial":"682","code":"CK"},{"dial":"506","code":"CR"},{"dial":"385","code":"HR"},{"dial":"53","code":"CU"},{"dial":"599","code":"CW"},{"dial":"357","code":"CY"},{"dial":"420","code":"CZ"},{"dial":"243","code":"CD"},{"dial":"45","code":"DK"},{"dial":"253","code":"DJ"},{"dial":"1-767","code":"DM"},{"dial":"1-809, 1-829, 1-849","code":"DO"},{"dial":"670","code":"TL"},{"dial":"593","code":"EC"},{"dial":"20","code":"EG"},{"dial":"503","code":"SV"},{"dial":"240","code":"GQ"},{"dial":"291","code":"ER"},{"dial":"372","code":"EE"},{"dial":"251","code":"ET"},{"dial":"500","code":"FK"},{"dial":"298","code":"FO"},{"dial":"679","code":"FJ"},{"dial":"358","code":"FI"},{"dial":"33","code":"FR"},{"dial":"689","code":"PF"},{"dial":"241","code":"GA"},{"dial":"220","code":"GM"},{"dial":"995","code":"GE"},{"dial":"49","code":"DE"},{"dial":"233","code":"GH"},{"dial":"350","code":"GI"},{"dial":"30","code":"GR"},{"dial":"299","code":"GL"},{"dial":"1-473","code":"GD"},{"dial":"1-671","code":"GU"},{"dial":"502","code":"GT"},{"dial":"44-1481","code":"GG"},{"dial":"224","code":"GN"},{"dial":"245","code":"GW"},{"dial":"592","code":"GY"},{"dial":"509","code":"HT"},{"dial":"504","code":"HN"},{"dial":"852","code":"HK"},{"dial":"36","code":"HU"},{"dial":"354","code":"IS"},{"dial":"91","code":"IN"},{"dial":"62","code":"ID"},{"dial":"98","code":"IR"},{"dial":"964","code":"IQ"},{"dial":"353","code":"IE"},{"dial":"44-1624","code":"IM"},{"dial":"972","code":"IL"},{"dial":"39","code":"IT"},{"dial":"225","code":"CI"},{"dial":"1-876","code":"JM"},{"dial":"81","code":"JP"},{"dial":"44-1534","code":"JE"},{"dial":"962","code":"JO"},{"dial":"7, 997","code":"KZ"},{"dial":"254","code":"KE"},{"dial":"686","code":"KI"},{"dial":"383","code":"XK"},{"dial":"965","code":"KW"},{"dial":"996","code":"KG"},{"dial":"856","code":"LA"},{"dial":"371","code":"LV"},{"dial":"961","code":"LB"},{"dial":"266","code":"LS"},{"dial":"231","code":"LR"},{"dial":"218","code":"LY"},{"dial":"423","code":"LI"},{"dial":"370","code":"LT"},{"dial":"352","code":"LU"},{"dial":"853","code":"MO"},{"dial":"389","code":"MK"},{"dial":"261","code":"MG"},{"dial":"265","code":"MW"},{"dial":"60","code":"MY"},{"dial":"960","code":"MV"},{"dial":"223","code":"ML"},{"dial":"356","code":"MT"},{"dial":"692","code":"MH"},{"dial":"222","code":"MR"},{"dial":"230","code":"MU"},{"dial":"262","code":"YT"},{"dial":"52","code":"MX"},{"dial":"691","code":"FM"},{"dial":"373","code":"MD"},{"dial":"377","code":"MC"},{"dial":"976","code":"MN"},{"dial":"382","code":"ME"},{"dial":"1-664","code":"MS"},{"dial":"212","code":"MA"},{"dial":"258","code":"MZ"},{"dial":"95","code":"MM"},{"dial":"264","code":"NA"},{"dial":"674","code":"NR"},{"dial":"977","code":"NP"},{"dial":"31","code":"NL"},{"dial":"599","code":"CW"},{"dial":"687","code":"NC"},{"dial":"64","code":"NZ"},{"dial":"505","code":"NI"},{"dial":"227","code":"NE"},{"dial":"234","code":"NG"},{"dial":"683","code":"NU"},{"dial":"850","code":"KP"},{"dial":"1-670","code":"MP"},{"dial":"47","code":"NO"},{"dial":"968","code":"OM"},{"dial":"92","code":"PK"},{"dial":"680","code":"PW"},{"dial":"970","code":"PS"},{"dial":"507","code":"PA"},{"dial":"675","code":"PG"},{"dial":"595","code":"PY"},{"dial":"51","code":"PE"},{"dial":"63","code":"PH"},{"dial":"64","code":"PN"},{"dial":"48","code":"PL"},{"dial":"351","code":"PT"},{"dial":"1-787, 1-939","code":"PR"},{"dial":"974","code":"QA"},{"dial":"242","code":"CG"},{"dial":"262","code":"RE"},{"dial":"40","code":"RO"},{"dial":"7","code":"RU"},{"dial":"250","code":"RW"},{"dial":"590","code":"BL"},{"dial":"290","code":"SH"},{"dial":"1-869","code":"KN"},{"dial":"1-758","code":"LC"},{"dial":"590","code":"MF"},{"dial":"508","code":"PM"},{"dial":"1-784","code":"VC"},{"dial":"685","code":"WS"},{"dial":"378","code":"SM"},{"dial":"239","code":"ST"},{"dial":"966","code":"SA"},{"dial":"221","code":"SN"},{"dial":"381","code":"RS"},{"dial":"248","code":"SC"},{"dial":"232","code":"SL"},{"dial":"65","code":"SG"},{"dial":"1-721","code":"SX"},{"dial":"421","code":"SK"},{"dial":"386","code":"SI"},{"dial":"677","code":"SB"},{"dial":"252","code":"SO"},{"dial":"27","code":"ZA"},{"dial":"82","code":"KR"},{"dial":"211","code":"SS"},{"dial":"34","code":"ES"},{"dial":"94","code":"LK"},{"dial":"249","code":"SD"},{"dial":"597","code":"SR"},{"dial":"47","code":"SJ"},{"dial":"268","code":"SZ"},{"dial":"46","code":"SE"},{"dial":"41","code":"CH"},{"dial":"963","code":"SY"},{"dial":"886","code":"TW"},{"dial":"992","code":"TJ"},{"dial":"255","code":"TZ"},{"dial":"66","code":"TH"},{"dial":"228","code":"TG"},{"dial":"690","code":"TK"},{"dial":"676","code":"TO"},{"dial":"1-868","code":"TT"},{"dial":"216","code":"TN"},{"dial":"90","code":"TR"},{"dial":"993","code":"TM"},{"dial":"1-649","code":"TC"},{"dial":"688","code":"TV"},{"dial":"1-340","code":"VI"},{"dial":"256","code":"UG"},{"dial":"380","code":"UA"},{"dial":"971","code":"AE"},{"dial":"44","code":"GB"},{"dial":"1","code":"US"},{"dial":"598","code":"UY"},{"dial":"998","code":"UZ"},{"dial":"678","code":"VU"},{"dial":"379","code":"VA"},{"dial":"58","code":"VE"},{"dial":"84","code":"VN"},{"dial":"681","code":"WF"},{"dial":"212","code":"EH"},{"dial":"967","code":"YE"},{"dial":"260","code":"ZM"},{"dial":"263","code":"ZW"}]')}}]);
+//# sourceMappingURL=806.prod.js.map
\ No newline at end of file
diff --git a/umd/806.prod.js.map b/umd/806.prod.js.map
new file mode 100644
index 00000000..0122ddbf
--- /dev/null
+++ b/umd/806.prod.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"806.prod.js","mappings":"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","sources":["webpack://tinode-webapp/./src/views/password-reset-view.jsx","webpack://tinode-webapp/./src/widgets/phone-edit.jsx"],"sourcesContent":["// A password reset form.\nimport React from 'react';\nimport { FormattedMessage, defineMessages, injectIntl } from 'react-intl';\n\nimport PhoneEdit from '../widgets/phone-edit.jsx';\nimport VisiblePassword from '../widgets/visible-password.jsx';\n\nimport HashNavigation from '../lib/navigation.js';\n\nconst messages = defineMessages({\n password_reset_email_sent: {\n id: 'password_reset_email_sent',\n defaultMessage: 'An email with security code has been sent.',\n description: 'Notification that the email with password reset instructions has been sent'\n },\n password_reset_sms_sent: {\n id: 'password_reset_sms_sent',\n defaultMessage: 'A text message with security code has been sent.',\n description: 'Notification that the SMS with password reset instructions has been sent'\n }\n});\n\nclass PasswordResetView extends React.PureComponent {\n constructor(props) {\n super(props);\n\n this.state = {\n tel: '',\n email: '',\n password: '',\n sent: false,\n haveCode: false,\n code: ''\n };\n\n this.handleSubmit = this.handleSubmit.bind(this);\n this.handleEmailChange = this.handleEmailChange.bind(this);\n this.handlePasswordChange = this.handlePasswordChange.bind(this);\n this.handleCodeChange = this.handleCodeChange.bind(this);\n this.handleShowCodeField = this.handleShowCodeField.bind(this);\n\n // Connection will trigger change by changing the this.props.serverVersion.\n props.tinode.connect()\n .catch(err => {\n this.props.onError(err.message, 'err');\n });\n }\n\n componentDidMount() {\n const parsed = HashNavigation.parseUrlHash(window.location.hash);\n const newState = {\n token: parsed.params.token,\n scheme: parsed.params.scheme,\n code: parsed.params.code || ''\n }\n\n this.savedCred = parsed.params.cred;\n if (this.props.reqCredMethod && parsed.params.cred) {\n newState[this.props.reqCredMethod] = this.savedCred;\n }\n this.setState(newState);\n }\n\n componentDidUpdate(prevProps, prevState) {\n if (prevProps.reqCredMethod != this.props.reqCredMethod && this.props.reqCredMethod) {\n this.setState({[this.props.reqCredMethod]: this.savedCred || ''});\n }\n }\n\n handleSubmit(e) {\n e.preventDefault();\n if (this.state.token) {\n // Reset using token.\n this.props.onReset(this.state.password.trim(), {\n scheme: 'token',\n secret: this.state.token\n });\n } else if (this.state.code && this.props.reqCredMethod) {\n // Reset using security code.\n // The secret is structured as ::, \"123456:email:alice@example.com\".\n const cred = this.props.reqCredMethod == 'email' ? this.state.email.trim() : this.state.tel.trim();\n this.props.onReset(this.state.password.trim(), {\n scheme: 'code',\n secret: btoa(`${this.state.code}:${this.props.reqCredMethod}:${cred}`)\n });\n } else {\n // Send email or SMS with the secret code.\n const email = this.state.email.trim();\n const tel = this.state.tel.trim();\n this.setState({email: email, tel: tel});\n this.props.onRequest(this.props.reqCredMethod, email || tel)\n .then(_ => {\n this.setState({sent: true});\n const msg = this.props.reqCredMethod == 'email' ? messages.password_reset_email_sent :\n this.props.reqCredMethod == 'tel' ? messages.password_reset_sms_sent : null;\n if (msg) {\n this.props.onError(this.props.intl.formatMessage(msg), 'info');\n }\n });\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 handleCodeChange(e) {\n this.setState({code: e.target.value.replace(/[^\\d]/g, '')});\n }\n\n handleShowCodeField(e) {\n e.preventDefault();\n this.setState({haveCode: true});\n }\n\n render() {\n const showCredentialInput = !((this.state.token || (this.state.code && this.props.reqCredMethod)) && this.state.scheme);\n const showPasswordInput = !showCredentialInput || this.state.haveCode || this.state.sent;\n\n const passwordInput = (<>\n \n \n \n {\n (placeholder) => \n } \n >);\n\n const emailInput = (<>\n {this.state.haveCode ?\n null :\n \n \n \n }\n {\n (placeholder) => \n } \n >);\n\n const phoneInput = (<>\n {this.state.haveCode ?\n null :\n \n \n
\n }\n \n \n \n \n
\n \n
this.setState({tel: number})} />\n \n >);\n\n const codeInput = (<>\n \n \n \n \n
\n \n {\n (numbers_only) => \n } \n
\n >);\n\n const credentialInput = this.props.reqCredMethod == 'email' ?\n emailInput : this.props.reqCredMethod == 'tel' ? phoneInput : null;\n\n return (\n \n );\n }\n}\n\nexport default injectIntl(PasswordResetView);\n","// Editor for a phone number.\n\nimport React from 'react';\nimport { defineMessages, injectIntl } from 'react-intl';\nimport { AsYouType, getExampleNumber, parsePhoneNumber } from 'libphonenumber-js/mobile';\nimport examples from 'libphonenumber-js/mobile/examples'\n\nimport * as dcodes from '../dcodes.json';\nimport { flagEmoji } from '../lib/strformat';\n\nconst messages = defineMessages({\n mobile_number_required: {\n id: 'mobile_number_required',\n defaultMessage: 'Mobile phone number required',\n description: 'Error message'\n }\n});\n\nclass PhoneEdit extends React.PureComponent {\n constructor(props) {\n super(props);\n\n this.codeMap = {};\n dcodes.default.forEach(dc => { this.codeMap[dc.code] = dc.dial; });\n\n const code = props.countryCode || 'US';\n const dial = this.codeMap[code];\n\n this.state = {\n countryCode: code,\n dialCode: dial,\n localNumber: '',\n placeholderNumber: this.placeholderNumber(code, dial)\n };\n\n this.handleChange = this.handleChange.bind(this);\n this.handleFinished = this.handleFinished.bind(this);\n this.handleKeyDown = this.handleKeyDown.bind(this);\n this.showCountrySelector = this.showCountrySelector.bind(this);\n }\n\n handleChange(e) {\n const prefix = `+${this.state.dialCode}`;\n let formatted = new AsYouType().input(`${prefix}${this.filterNumber(e.target.value)}`);\n formatted = formatted.substring(prefix.length).trim();\n this.setState({localNumber: formatted});\n }\n\n handleFinished(e) {\n e.preventDefault();\n const raw = `${this.state.dialCode}${this.state.localNumber.trim()}`.replace(/[^\\d]/g, '');\n let number = null;\n try {\n number = parsePhoneNumber(`+${raw}`);\n } catch (err) {}\n\n if (!number || !number.isValid()) {\n this.inputField.setCustomValidity(this.props.intl.formatMessage(messages.mobile_number_required));\n return;\n }\n\n this.inputField.setCustomValidity('');\n this.props.onSubmit(number.format('E.164'));\n }\n\n\n handleKeyDown(e) {\n if (e.key === 'Enter') {\n this.handleFinished(e);\n }\n }\n\n showCountrySelector() {\n this.props.onShowCountrySelector(this.state.countryCode, this.state.dialCode,\n (code, dial) => {\n this.setState({\n countryCode: code,\n dialCode: dial,\n placeholderNumber: this.placeholderNumber(code, dial)\n })\n });\n }\n\n // Filter out characters not permitted in a phone number.\n filterNumber(number) {\n if (!number) {\n return number;\n }\n // Leave numbers, space, (, ), -, and .\n // The + is not allowed: it's handled by the country code portion.\n return number.replace(/[^-\\s().\\d]/g, '');\n }\n\n placeholderNumber(code, dial) {\n const sample = getExampleNumber(code, examples);\n return sample ? sample.formatInternational().substring(dial.length + 1).trim() : '123 0123';\n }\n\n render() {\n return (\n <>\n \n {flagEmoji(this.state.countryCode)} \n +{this.state.dialCode} \n {this.inputField = ref}} placeholder={this.state.placeholderNumber}\n value={this.state.localNumber} onChange={this.handleChange}\n maxLength={17} onKeyDown={this.handleKeyDown} onBlur={this.handleFinished}\n required autoFocus={this.props.autoFocus} />\n >\n );\n }\n}\n\nexport default injectIntl(PhoneEdit);\n"],"names":["messages","react_intl__WEBPACK_IMPORTED_MODULE_1__","defineMessages","password_reset_email_sent","id","defaultMessage","description","password_reset_sms_sent","PasswordResetView","react__WEBPACK_IMPORTED_MODULE_0___default","constructor","props","super","this","state","tel","email","password","sent","haveCode","code","handleSubmit","bind","handleEmailChange","handlePasswordChange","handleCodeChange","handleShowCodeField","tinode","connect","catch","err","onError","message","componentDidMount","parsed","_lib_navigation_js__WEBPACK_IMPORTED_MODULE_4__","A","parseUrlHash","window","location","hash","newState","token","params","scheme","savedCred","cred","reqCredMethod","setState","componentDidUpdate","prevProps","prevState","e","preventDefault","onReset","trim","secret","btoa","onRequest","then","_","msg","intl","formatMessage","target","value","replace","render","showCredentialInput","showPasswordInput","passwordInput","react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__","jsxs","Fragment","children","jsx","className","htmlFor","FormattedMessage","placeholder","_widgets_visible_password_jsx__WEBPACK_IMPORTED_MODULE_3__","autoComplete","required","autoFocus","onChange","emailInput","type","phoneInput","_widgets_phone_edit_jsx__WEBPACK_IMPORTED_MODULE_2__","onShowCountrySelector","onSubmit","number","codeInput","numbers_only","maxLength","credentialInput","href","onClick","style","marginRight","__webpack_exports__","injectIntl","mobile_number_required","PhoneEdit","codeMap","_dcodes_json__WEBPACK_IMPORTED_MODULE_6__","forEach","dc","dial","countryCode","dialCode","localNumber","placeholderNumber","handleChange","handleFinished","handleKeyDown","showCountrySelector","prefix","formatted","libphonenumber_js_mobile__WEBPACK_IMPORTED_MODULE_3__","Q","input","filterNumber","substring","length","raw","libphonenumber_js_mobile__WEBPACK_IMPORTED_MODULE_2__","L","isValid","inputField","setCustomValidity","format","key","sample","libphonenumber_js_mobile__WEBPACK_IMPORTED_MODULE_4__","a","libphonenumber_js_mobile_examples__WEBPACK_IMPORTED_MODULE_5__","formatInternational","react_jsx_runtime__WEBPACK_IMPORTED_MODULE_8__","_lib_strformat__WEBPACK_IMPORTED_MODULE_7__","lb","ref","onKeyDown","onBlur"],"sourceRoot":""}
\ No newline at end of file
diff --git a/umd/821.prod.js b/umd/821.prod.js
new file mode 100644
index 00000000..4f876cea
--- /dev/null
+++ b/umd/821.prod.js
@@ -0,0 +1,2 @@
+"use strict";(self.webpackChunktinode_webapp=self.webpackChunktinode_webapp||[]).push([[821],{7821:function(e,t,a){a.r(t);var i=a(1594),n=a.n(i),s=a(8181),r=a(5247),o=(a(3272),a(7256)),h=a(4848);const d=new Audio("audio/call-out.m4a");d.loop=!0;const c=new Audio("audio/call-end.m4a");c.loop=!0;const l=new Audio("audio/dialing.m4a"),p="video:muted",g="video:unmuted",m=(0,s.defineMessages)({already_in_call:{id:"already_in_call",defaultMessage:"You already in an ongoing call!",description:"Error message when the user tried to accept a new call without finishing pervious one"}});class C extends n().PureComponent{constructor(e){super(e),this.state={localStream:void 0,remoteStream:void 0,pc:void 0,dataChannel:void 0,previousOnInfo:void 0,waitingForPeer:!1,callInitialSetupComplete:!1,audioOnly:e.callAudioOnly,videoToggleInProgress:!1,remoteVideoLive:!1},this.localStreamConstraints={audio:!0,video:!e.callAudioOnly},this.isOutgoingCall=1==e.callState,this.containerRef=n().createRef(),this.localRef=n().createRef(),this.remoteRef=n().createRef(),this.remoteIceCandidatesCache=[],this.onInfo=this.onInfo.bind(this),this.start=this.start.bind(this),this.stop=this.stop.bind(this),this.createPeerConnection=this.createPeerConnection.bind(this),this.canSendOffer=this.canSendOffer.bind(this),this.drainRemoteIceCandidatesCache=this.drainRemoteIceCandidatesCache.bind(this),this.handleNegotiationNeededEvent=this.handleNegotiationNeededEvent.bind(this),this.handleICECandidateEvent=this.handleICECandidateEvent.bind(this),this.handleNewICECandidateMsg=this.handleNewICECandidateMsg.bind(this),this.handleICEConnectionStateChangeEvent=this.handleICEConnectionStateChangeEvent.bind(this),this.handleSignalingStateChangeEvent=this.handleSignalingStateChangeEvent.bind(this),this.handleICEGatheringStateChangeEvent=this.handleICEGatheringStateChangeEvent.bind(this),this.handleIceCandidateErrorEvent=this.handleIceCandidateErrorEvent.bind(this),this.handleTrackEvent=this.handleTrackEvent.bind(this),this.handleVideoOfferMsg=this.handleVideoOfferMsg.bind(this),this.handleVideoAnswerMsg=this.handleVideoAnswerMsg.bind(this),this.handleNewICECandidateMsg=this.handleNewICECandidateMsg.bind(this),this.reportError=this.reportError.bind(this),this.handleGetUserMediaError=this.handleGetUserMediaError.bind(this),this.stopTracks=this.stopTracks.bind(this),this.disconnectMedia=this.disconnectMedia.bind(this),this.handleCloseClick=this.handleCloseClick.bind(this),this.handleToggleCameraClick=this.handleToggleCameraClick.bind(this),this.handleToggleMicClick=this.handleToggleMicClick.bind(this),this.handleRemoteHangup=this.handleRemoteHangup.bind(this),this.handleVideoCallAccepted=this.handleVideoCallAccepted.bind(this),this.muteVideo=this.muteVideo.bind(this),this.unmuteVideo=this.unmuteVideo.bind(this),this.emptyVideoTrack=this.emptyVideoTrack.bind(this),this.handleDataChannelEvent=this.handleDataChannelEvent.bind(this),this.handleDataChannelError=this.handleDataChannelError.bind(this),this.handleDataChannelMessage=this.handleDataChannelMessage.bind(this),this.handleDataChannelOpen=this.handleDataChannelOpen.bind(this),this.handleDataChannelClose=this.handleDataChannelClose.bind(this),this.bounds={},this.dragStart=e=>{if(e.target.classList.contains("draggable")&&!window.matchMedia("(width<=640px)")&&this.props.minimized&&this.containerRef){e.stopPropagation(),this.containerRef.current.setPointerCapture(e.pointerId),this.containerRef.current.style.cursor="grabbing",this.bounds.left=this.containerRef.current.offsetLeft,this.bounds.top=this.containerRef.current.offsetTop,this.bounds.width=this.containerRef.current.offsetWidth,this.bounds.height=this.containerRef.current.offsetHeight;const t=this.containerRef.current.offsetParent;this.bounds.maxX=t.offsetWidth,this.bounds.maxY=t.offsetHeight}},this.drag=e=>{e.stopPropagation();const t=this.containerRef.current;this.props.minimized&&this.containerRef&&t.hasPointerCapture(e.pointerId)&&(this.bounds.left=Math.min(Math.max(this.bounds.left+e.movementX,0),this.bounds.maxX-this.bounds.width),this.bounds.top=Math.min(Math.max(this.bounds.top+e.movementY,0),this.bounds.maxY-this.bounds.height),t.style.left=`${this.bounds.left}px`,t.style.top=`${this.bounds.top}px`)},this.dragEnd=e=>{e.stopPropagation(),this.props.minimized&&this.containerRef&&(this.containerRef.current.releasePointerCapture(e.pointerId),this.containerRef.current.style.cursor="grab")}}componentDidMount(){const e=this.props.tinode.getTopic(this.props.topic);this.previousOnInfo=e.onInfo,e.onInfo=this.onInfo,1!=this.props.callState&&3!=this.props.callState||!this.localRef.current||this.start(),this.containerRef&&(this.containerRef.current.addEventListener("pointerdown",this.dragStart),this.containerRef.current.addEventListener("pointermove",this.drag),this.containerRef.current.addEventListener("pointerup",this.dragEnd))}componentWillUnmount(){this.props.tinode.getTopic(this.props.topic).onInfo=this.previousOnInfo,this.stop(),this.containerRef&&(this.containerRef.current.removeEventListener("pointerdown",this.dragStart),this.containerRef.current.removeEventListener("pointermove",this.drag),this.containerRef.current.removeEventListener("pointerup",this.dragEnd))}handleVideoCallAccepted(e){d.pause();const t=this.createPeerConnection(!0),a=this.state.localStream;a.getTracks().forEach(e=>{t.addTrack(e,a),"video"==e.kind&&this.state.audioOnly&&(e.enabled=!1,e.stop(),a.removeTrack(e))})}onInfo(e){if("call"==e.what)switch(e.event){case"accept":this.handleVideoCallAccepted(e);break;case"answer":this.handleVideoAnswerMsg(e);break;case"ice-candidate":this.handleNewICECandidateMsg(e);break;case"hang-up":this.handleRemoteHangup(e);break;case"offer":this.handleVideoOfferMsg(e);break;case"ringing":d.play().catch(e=>{});break;default:console.warn("Unknown call event",e.event)}}emptyVideoTrack(){const e=Object.assign(document.createElement("canvas"),{width:640,height:480});e.getContext("2d").fillRect(0,0,640,480);const t=e.captureStream(0);return Object.assign(t.getVideoTracks()[0],{enabled:!1})}start(){this.state.localStream?this.props.onError(this.props.intl.formatMessage(m.already_in_call),"info"):3!=this.props.callState?navigator.mediaDevices.getUserMedia(this.localStreamConstraints).then(e=>{this.localStreamConstraints.video||e.addTrack(this.emptyVideoTrack()),this.setState({localStream:e,waitingForPeer:!0}),this.localRef.current.srcObject=e,l.play(),this.props.onInvite(this.props.topic,this.props.seq,this.props.callState,this.props.callAudioOnly)}).catch(this.handleGetUserMediaError):this.props.onInvite(this.props.topic,this.props.seq,3,this.props.callAudioOnly)}stop(){c.pause(),c.currentTime=0,d.pause(),d.currentTime=0,this.stopTracks(this.state.localStream),this.stopTracks(this.state.remoteStream),this.disconnectMedia(this.localRef.current),this.disconnectMedia(this.remoteRef.current),this.state.pc&&(this.state.pc.ontrack=null,this.state.pc.onremovetrack=null,this.state.pc.onremovestream=null,this.state.pc.onicecandidate=null,this.state.pc.oniceconnectionstatechange=null,this.state.pc.onsignalingstatechange=null,this.state.pc.onicegatheringstatechange=null,this.state.pc.onnegotiationneeded=null,this.state.pc.onicecandidateerror=null,this.state.pc.ondatachannel=null,!this.state.dataChannel||"open"!=this.state.dataChannel.readyState&&"connecting"!=this.state.dataChannel.readyState||this.state.dataChannel.close(),this.state.pc.close()),this.setState({pc:null,waitingForPeer:!1})}disconnectMedia(e){e&&(e.srcObject=null,e.src="")}stopTracks(e){if(!e)return;let t=e.getTracks();t&&t.forEach(e=>{e.stop(),e.enabled=!1})}handleDataChannelError(e){console.error("data channel error",e)}handleDataChannelMessage(e){switch(e.data){case p:this.setState({remoteVideoLive:!1},e=>{this.remoteRef.current.srcObject=this.state.remoteStream});break;case g:this.setState({remoteVideoLive:!0},e=>{this.remoteRef.current.srcObject=this.state.remoteStream})}}handleDataChannelOpen(e){this.state.audioOnly||e.target.send(g)}handleDataChannelClose(e){console.info("close data channel:",e)}handleDataChannelEvent(e){console.info("data channel event:",e);const t=e.channel;t.onerror=this.handleDataChannelError,t.onmessage=this.handleDataChannelMessage,t.onopen=this.handleDataChannelOpen,t.onclose=this.handleDataChannelClose,this.setState({dataChannel:t})}createPeerConnection(e){const t=this.props.tinode.getServerParam("iceServers",null),a=t?new RTCPeerConnection({iceServers:t}):new RTCPeerConnection;a.onicecandidate=this.handleICECandidateEvent,a.oniceconnectionstatechange=this.handleICEConnectionStateChangeEvent,a.onicegatheringstatechange=this.handleICEGatheringStateChangeEvent,a.onsignalingstatechange=this.handleSignalingStateChangeEvent,a.onnegotiationneeded=this.handleNegotiationNeededEvent,a.onicecandidateerror=this.handleIceCandidateErrorEvent,a.ontrack=this.handleTrackEvent,a.ondatachannel=this.handleDataChannelEvent;let i={pc:a,waitingForPeer:!1};if(e){const e=a.createDataChannel("events",{ordered:!0});e.onerror=this.handleDataChannelError,e.onmessage=this.handleDataChannelMessage,e.onopen=this.handleDataChannelOpen,e.onclose=this.handleDataChannelClose,i.dataChannel=e}return this.setState(i),a}handleVideoAnswerMsg(e){const t=new RTCSessionDescription(e.payload);this.state.pc.setRemoteDescription(t).then(e=>{this.setState({callInitialSetupComplete:!0},e=>this.drainRemoteIceCandidatesCache())}).catch(e=>this.reportError(e))}reportError(e){this.props.onError(e.message,"err")}canSendOffer(){return this.isOutgoingCall||this.state.callInitialSetupComplete}handleNegotiationNeededEvent(e){const t=e.target;this.canSendOffer()&&t.createOffer().then(e=>t.setLocalDescription(e)).then(e=>{this.props.onSendOffer(this.props.topic,this.props.seq,t.localDescription.toJSON())}).catch(e=>this.reportError(e))}handleIceCandidateErrorEvent(e){console.warn("ICE candidate error:",e)}handleICECandidateEvent(e){e.candidate&&this.props.onIceCandidate(this.props.topic,this.props.seq,e.candidate.toJSON())}handleNewICECandidateMsg(e){const t=new RTCIceCandidate(e.payload);this.state.callInitialSetupComplete?this.state.pc.addIceCandidate(t).catch(e=>{t.candidate&&this.reportError(e),console.warn("Error adding new ice candidate",t,e)}):this.remoteIceCandidatesCache.push(t)}drainRemoteIceCandidatesCache(){this.remoteIceCandidatesCache.forEach(e=>{this.state.pc.addIceCandidate(e).catch(t=>{e.candidate&&this.reportError(t),console.warn("Error adding cached ice candidate",e,t)})}),this.remoteIceCandidatesCache=[]}handleICEConnectionStateChangeEvent(e){switch(e.target.iceConnectionState){case"closed":case"failed":this.handleCloseClick()}}handleSignalingStateChangeEvent(e){"closed"==e.target.signalingState&&this.handleCloseClick()}handleICEGatheringStateChangeEvent(e){}handleTrackEvent(e){this.remoteRef.current.srcObject=e.streams[0],this.setState({remoteStream:e.streams[0]})}handleGetUserMediaError(e){switch(console.error("Error opening camera and/or microphone",e),e.name){case"NotFoundError":default:this.reportError(e);case"SecurityError":case"PermissionDeniedError":}this.handleCloseClick()}handleVideoOfferMsg(e){let t=null;const a=this.state.pc?this.state.pc:this.createPeerConnection(!1),i=new RTCSessionDescription(e.payload);a.setRemoteDescription(i).then(e=>navigator.mediaDevices.getUserMedia(this.localStreamConstraints)).then(e=>{let i;this.localStreamConstraints.video||(i=this.emptyVideoTrack(),e.addTrack(i)),t=e,this.localRef.current.srcObject=e,this.setState({localStream:e}),t.getTracks().forEach(e=>{a.addTrack(e,t)}),i&&(i.enabled=!1,i.stop(),e.removeTrack(i))}).then(e=>a.createAnswer()).then(e=>a.setLocalDescription(e)).then(e=>{this.props.onSendAnswer(this.props.topic,this.props.seq,a.localDescription.toJSON()),this.setState({callInitialSetupComplete:!0},e=>this.drainRemoteIceCandidatesCache())}).catch(this.handleGetUserMediaError)}handleRemoteHangup(){this.state.waitingForPeer?(this.setState({waitingForPeer:!1}),d.pause(),d.currentTime=0,c.loop=!0,c.play().catch(e=>{}),setTimeout(e=>{this.handleCloseClick()},2e3)):this.handleCloseClick()}handleCloseClick(){this.stop(),this.props.onHangup(this.props.topic,this.props.seq)}muteVideo(){if(!this.state.pc||!this.state.dataChannel)return;const e=this.state.localStream,t=e.getVideoTracks()[0];t.enabled=!1,t.stop(),e.removeTrack(t),this.state.dataChannel.send(p),this.setState({videoToggleInProgress:!1})}unmuteVideo(){this.state.pc&&this.state.dataChannel&&navigator.mediaDevices.getUserMedia({video:!0}).then(e=>{this.localRef.current.srcObject=null;const t=this.state.pc.getSenders().find(e=>"video"==e.track.kind),a=e.getVideoTracks()[0];return e.removeTrack(a),this.state.localStream.addTrack(a),t.replaceTrack(a)}).then(e=>{this.localRef.current.srcObject=this.state.localStream,this.state.dataChannel.send(g)}).catch(e=>this.handleGetUserMediaError(e)).finally(e=>{this.setState({videoToggleInProgress:!1})})}handleToggleCameraClick(){if(this.state.videoToggleInProgress)return;const e=this.state.localStream.getVideoTracks();this.setState({videoToggleInProgress:!0},t=>{e&&e.length>0&&e[0].enabled&&"live"==e[0].readyState?this.muteVideo():this.unmuteVideo(),this.setState({audioOnly:!this.state.audioOnly})})}handleToggleMicClick(){const e=this.state.localStream.getAudioTracks()[0];e.enabled=!e.enabled,this.forceUpdate()}render(){const e=this.state.localStream&&this.state.localStream.getAudioTracks(),t=!this.state.audioOnly&&this.state.localStream&&this.state.localStream.getVideoTracks(),a=!this.state.pc||!this.state.dataChannel||!(e&&e[0]),i=e&&e[0]&&e[0].enabled?"mic":"mic_off",n=t&&t[0]&&t[0].enabled&&"live"==t[0].readyState?"videocam":"videocam_off",d=(0,o.W5)(this.props.title,24),c=this.state.waitingForPeer?" pulse":"";let l=!1;if(this.remoteRef.current&&this.remoteRef.current.srcObject&&this.state.remoteVideoLive){const e=this.remoteRef.current.srcObject;if(e.getVideoTracks().length>0){const t=e.getVideoTracks()[0];l=t.enabled&&"live"==t.readyState}}const p=this.props.minimized?"minimized":null,g=this.props.minimized?"fullscreen":"fullscreen_exit";return(0,h.jsxs)("div",{id:"video-container",className:p,ref:this.containerRef,children:[(0,h.jsxs)("div",{id:"video-container-panel",children:[(0,h.jsxs)("div",{className:"call-party self",disabled:this.state.audioOnly||this.props.minimized,children:[(0,h.jsx)("video",{ref:this.localRef,autoPlay:!0,muted:!0,playsInline:!0}),(0,h.jsx)("div",{className:"caller-name inactive",children:(0,h.jsx)(s.FormattedMessage,{id:"calls_you_label",defaultMessage:"You",description:"Shown over the local video screen"})})]}),(0,h.jsx)("div",{className:"call-party peer",disabled:!l,children:l?(0,h.jsxs)(h.Fragment,{children:[(0,h.jsx)("video",{ref:this.remoteRef,autoPlay:!0,playsInline:!0}),(0,h.jsx)("div",{className:"caller-name inactive",children:d})]}):(0,h.jsxs)(h.Fragment,{children:[(0,h.jsx)("audio",{ref:this.remoteRef,autoPlay:!0}),(0,h.jsxs)("div",{className:`caller-card${c} draggable`,children:[(0,h.jsx)("div",{className:"avatar-box",children:(0,h.jsx)(r.A,{authorizeURL:this.props.tinode.authorizeURL,avatar:this.props.avatar,topic:this.props.topic,title:this.props.title})}),(0,h.jsx)("div",{className:"caller-name",children:d})]})]})})]}),(0,h.jsx)("button",{className:"full-screen",onClick:this.props.onToggleMinimize,children:(0,h.jsx)("i",{className:"material-icons",children:g})}),(0,h.jsxs)("div",{id:"controls",className:p,children:[(0,h.jsx)("button",{className:"danger",onClick:this.handleCloseClick,children:(0,h.jsx)("i",{className:"material-icons",children:"call_end"})}),(0,h.jsx)("button",{className:"secondary",onClick:this.handleToggleCameraClick,disabled:a,children:(0,h.jsx)("i",{className:"material-icons",children:n})}),(0,h.jsx)("button",{className:"secondary",onClick:this.handleToggleMicClick,disabled:a,children:(0,h.jsx)("i",{className:"material-icons",children:i})})]})]})}}t.default=(0,s.injectIntl)(C)}}]);
+//# sourceMappingURL=821.prod.js.map
\ No newline at end of file
diff --git a/umd/821.prod.js.map b/umd/821.prod.js.map
new file mode 100644
index 00000000..55e85551
--- /dev/null
+++ b/umd/821.prod.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"821.prod.js","mappings":"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","sources":["webpack://tinode-webapp/./src/widgets/call-panel.jsx"],"sourcesContent":["// CallPanel displays call in progress: local and remote viewports and controls.\nimport React from 'react';\nimport { FormattedMessage, defineMessages, injectIntl } from 'react-intl';\n\nimport LetterTile from './letter-tile.jsx';\n\nimport { MAX_PEER_TITLE_LENGTH } from '../config.js';\nimport { CALL_STATE_OUTGOING_INITATED, CALL_STATE_IN_PROGRESS } from '../constants.js';\nimport { truncateString } from '../lib/strformat.js';\n\nconst RING_SOUND = new Audio('audio/call-out.m4a');\nRING_SOUND.loop = true;\nconst CALL_ENDED_SOUND = new Audio('audio/call-end.m4a');\nCALL_ENDED_SOUND.loop = true;\nconst DIALING_SOUND = new Audio('audio/dialing.m4a');\n\nconst VIDEO_MUTED_EVENT = 'video:muted';\nconst VIDEO_UNMUTED_EVENT = 'video:unmuted';\n\nconst messages = defineMessages({\n already_in_call: {\n id: 'already_in_call',\n defaultMessage: 'You already in an ongoing call!',\n description: 'Error message when the user tried to accept a new call without finishing pervious one',\n }\n});\n\nclass CallPanel extends React.PureComponent {\n constructor(props) {\n super(props);\n\n this.state = {\n localStream: undefined,\n remoteStream: undefined,\n pc: undefined,\n dataChannel: undefined,\n\n previousOnInfo: undefined,\n waitingForPeer: false,\n // If true, the client has received a remote SDP from the peer and has sent a local SDP to the peer.\n callInitialSetupComplete: false,\n audioOnly: props.callAudioOnly,\n // Video mute/unmute in progress.\n videoToggleInProgress: false,\n // Indicates if the remote peer has informed us that their camera is on.\n remoteVideoLive: false,\n };\n\n this.localStreamConstraints = {\n audio: true,\n video: !props.callAudioOnly\n };\n this.isOutgoingCall = props.callState == CALL_STATE_OUTGOING_INITATED;\n\n this.containerRef = React.createRef();\n this.localRef = React.createRef();\n this.remoteRef = React.createRef();\n\n // Cache for remote ice candidates until initial setup gets completed.\n this.remoteIceCandidatesCache = [];\n\n this.onInfo = this.onInfo.bind(this);\n this.start = this.start.bind(this);\n this.stop = this.stop.bind(this);\n\n this.createPeerConnection = this.createPeerConnection.bind(this);\n this.canSendOffer = this.canSendOffer.bind(this);\n this.drainRemoteIceCandidatesCache = this.drainRemoteIceCandidatesCache.bind(this);\n\n this.handleNegotiationNeededEvent = this.handleNegotiationNeededEvent.bind(this);\n this.handleICECandidateEvent = this.handleICECandidateEvent.bind(this);\n this.handleNewICECandidateMsg = this.handleNewICECandidateMsg.bind(this);\n this.handleICEConnectionStateChangeEvent = this.handleICEConnectionStateChangeEvent.bind(this);\n this.handleSignalingStateChangeEvent = this.handleSignalingStateChangeEvent.bind(this);\n this.handleICEGatheringStateChangeEvent = this.handleICEGatheringStateChangeEvent.bind(this);\n this.handleIceCandidateErrorEvent = this.handleIceCandidateErrorEvent.bind(this);\n this.handleTrackEvent = this.handleTrackEvent.bind(this);\n\n this.handleVideoOfferMsg = this.handleVideoOfferMsg.bind(this);\n this.handleVideoAnswerMsg = this.handleVideoAnswerMsg.bind(this);\n this.handleNewICECandidateMsg = this.handleNewICECandidateMsg.bind(this);\n\n this.reportError = this.reportError.bind(this);\n this.handleGetUserMediaError = this.handleGetUserMediaError.bind(this);\n\n this.stopTracks = this.stopTracks.bind(this);\n this.disconnectMedia = this.disconnectMedia.bind(this);\n\n this.handleCloseClick = this.handleCloseClick.bind(this);\n this.handleToggleCameraClick = this.handleToggleCameraClick.bind(this);\n this.handleToggleMicClick = this.handleToggleMicClick.bind(this);\n\n this.handleRemoteHangup = this.handleRemoteHangup.bind(this);\n this.handleVideoCallAccepted = this.handleVideoCallAccepted.bind(this);\n\n this.muteVideo = this.muteVideo.bind(this);\n this.unmuteVideo = this.unmuteVideo.bind(this);\n this.emptyVideoTrack = this.emptyVideoTrack.bind(this);\n\n this.handleDataChannelEvent = this.handleDataChannelEvent.bind(this);\n this.handleDataChannelError = this.handleDataChannelError.bind(this);\n this.handleDataChannelMessage = this.handleDataChannelMessage.bind(this);\n this.handleDataChannelOpen = this.handleDataChannelOpen.bind(this);\n this.handleDataChannelClose = this.handleDataChannelClose.bind(this);\n\n this.bounds = {};\n\n this.dragStart = (event) => {\n if (!event.target.classList.contains('draggable')) {\n // Prevent dragging when clicking on buttons or other non-draggable elements.\n return;\n }\n if (window.matchMedia('(width<=640px)')) {\n // No dragging on small screens.\n return;\n }\n if (this.props.minimized && this.containerRef) {\n event.stopPropagation();\n this.containerRef.current.setPointerCapture(event.pointerId);\n this.containerRef.current.style.cursor = 'grabbing';\n this.bounds.left = this.containerRef.current.offsetLeft;\n this.bounds.top = this.containerRef.current.offsetTop;\n this.bounds.width = this.containerRef.current.offsetWidth;\n this.bounds.height = this.containerRef.current.offsetHeight;\n\n const parent = this.containerRef.current.offsetParent;\n this.bounds.maxX = parent.offsetWidth;\n this.bounds.maxY = parent.offsetHeight;\n }\n };\n this.drag = (event) => {\n event.stopPropagation();\n const el = this.containerRef.current;\n if (this.props.minimized && this.containerRef && el.hasPointerCapture(event.pointerId)) {\n // Calculate new position. Restrict to the visible area of the parent element.\n this.bounds.left = Math.min(Math.max(this.bounds.left + event.movementX, 0),\n this.bounds.maxX - this.bounds.width);\n this.bounds.top = Math.min(Math.max(this.bounds.top + event.movementY, 0),\n this.bounds.maxY - this.bounds.height);\n\n el.style.left = `${this.bounds.left}px`;\n el.style.top = `${this.bounds.top}px`;\n }\n };\n this.dragEnd = (event) => {\n event.stopPropagation();\n if (this.props.minimized && this.containerRef) {\n this.containerRef.current.releasePointerCapture(event.pointerId);\n this.containerRef.current.style.cursor = 'grab';\n }\n };\n }\n\n componentDidMount() {\n const topic = this.props.tinode.getTopic(this.props.topic);\n this.previousOnInfo = topic.onInfo;\n topic.onInfo = this.onInfo;\n if ((this.props.callState == CALL_STATE_OUTGOING_INITATED ||\n this.props.callState == CALL_STATE_IN_PROGRESS) && this.localRef.current) {\n this.start();\n }\n\n if (this.containerRef) {\n this.containerRef.current.addEventListener('pointerdown', this.dragStart);\n this.containerRef.current.addEventListener('pointermove', this.drag);\n this.containerRef.current.addEventListener('pointerup', this.dragEnd);\n }\n }\n\n componentWillUnmount() {\n const topic = this.props.tinode.getTopic(this.props.topic);\n topic.onInfo = this.previousOnInfo;\n this.stop();\n\n if (this.containerRef) {\n this.containerRef.current.removeEventListener('pointerdown', this.dragStart);\n this.containerRef.current.removeEventListener('pointermove', this.drag);\n this.containerRef.current.removeEventListener('pointerup', this.dragEnd);\n }\n }\n\n handleVideoCallAccepted(info) {\n RING_SOUND.pause();\n // Create peer connection with a data channel.\n const pc = this.createPeerConnection(true);\n const stream = this.state.localStream;\n stream.getTracks().forEach(track => {\n pc.addTrack(track, stream);\n\n if (track.kind == 'video' && this.state.audioOnly) {\n // This is an audio-only call.\n // Remove dummy video track (placeholder remains).\n track.enabled = false;\n track.stop();\n stream.removeTrack(track);\n }\n });\n }\n\n onInfo(info) {\n if (info.what != 'call') {\n return;\n }\n switch (info.event) {\n case 'accept':\n this.handleVideoCallAccepted(info);\n break;\n case 'answer':\n this.handleVideoAnswerMsg(info);\n break;\n case 'ice-candidate':\n this.handleNewICECandidateMsg(info);\n break;\n case 'hang-up':\n this.handleRemoteHangup(info);\n break;\n case 'offer':\n this.handleVideoOfferMsg(info);\n break;\n case 'ringing':\n // play() throws if the user did not click the app first: https://goo.gl/xX8pDD.\n RING_SOUND.play().catch(_ => {});\n break;\n default:\n console.warn(\"Unknown call event\", info.event);\n break;\n }\n }\n\n // Creates an empty video track placeholder.\n emptyVideoTrack() {\n const width = 640;\n const height = 480;\n const canvas = Object.assign(document.createElement(\"canvas\"), {width, height});\n canvas.getContext('2d').fillRect(0, 0, width, height);\n const stream = canvas.captureStream(0);\n return Object.assign(stream.getVideoTracks()[0], {enabled: false});\n }\n\n start() {\n if (this.state.localStream) {\n this.props.onError(this.props.intl.formatMessage(messages.already_in_call), 'info');\n return;\n }\n\n if (this.props.callState == CALL_STATE_IN_PROGRESS) {\n // We apparently just accepted the call.\n this.props.onInvite(this.props.topic, this.props.seq, CALL_STATE_IN_PROGRESS, this.props.callAudioOnly);\n return;\n }\n\n // This is an outgoing call waiting for the other side to pick up.\n // Start local video.\n navigator.mediaDevices.getUserMedia(this.localStreamConstraints)\n .then(stream => {\n if (!this.localStreamConstraints.video) {\n // Starting an audio-only call. Create a dummy video track\n // (so video can be enabled during the call if the user desires).\n stream.addTrack(this.emptyVideoTrack());\n }\n this.setState({localStream: stream, waitingForPeer: true});\n this.localRef.current.srcObject = stream;\n\n DIALING_SOUND.play();\n\n // Send call invitation.\n this.props.onInvite(this.props.topic, this.props.seq, this.props.callState, this.props.callAudioOnly);\n })\n .catch(this.handleGetUserMediaError);\n }\n\n stop() {\n CALL_ENDED_SOUND.pause();\n CALL_ENDED_SOUND.currentTime = 0;\n RING_SOUND.pause();\n RING_SOUND.currentTime = 0;\n\n this.stopTracks(this.state.localStream);\n this.stopTracks(this.state.remoteStream);\n this.disconnectMedia(this.localRef.current);\n this.disconnectMedia(this.remoteRef.current);\n if (this.state.pc) {\n this.state.pc.ontrack = null;\n this.state.pc.onremovetrack = null;\n this.state.pc.onremovestream = null;\n this.state.pc.onicecandidate = null;\n this.state.pc.oniceconnectionstatechange = null;\n this.state.pc.onsignalingstatechange = null;\n this.state.pc.onicegatheringstatechange = null;\n this.state.pc.onnegotiationneeded = null;\n this.state.pc.onicecandidateerror = null;\n this.state.pc.ondatachannel = null;\n\n if (this.state.dataChannel && (this.state.dataChannel.readyState == 'open' || this.state.dataChannel.readyState == 'connecting')) {\n this.state.dataChannel.close();\n }\n this.state.pc.close();\n }\n this.setState({pc: null, waitingForPeer: false});\n }\n\n disconnectMedia(el) {\n if (!el) {\n return;\n }\n\n el.srcObject = null;\n el.src = '';\n }\n\n stopTracks(stream) {\n if (!stream) {\n return;\n }\n\n let tracks = stream.getTracks();\n if (tracks) {\n tracks.forEach(track => {\n track.stop();\n track.enabled = false;\n });\n }\n }\n\n handleDataChannelError(error) {\n console.error('data channel error', error);\n }\n\n handleDataChannelMessage(event) {\n switch (event.data) {\n case VIDEO_MUTED_EVENT:\n this.setState({remoteVideoLive: false}, _ => { this.remoteRef.current.srcObject = this.state.remoteStream; });\n break;\n case VIDEO_UNMUTED_EVENT:\n this.setState({remoteVideoLive: true}, _ => { this.remoteRef.current.srcObject = this.state.remoteStream; });\n break;\n default:\n break;\n }\n }\n\n handleDataChannelOpen(event) {\n if (!this.state.audioOnly) {\n event.target.send(VIDEO_UNMUTED_EVENT);\n }\n }\n\n handleDataChannelClose(event) {\n console.info('close data channel:', event);\n }\n\n handleDataChannelEvent(event) {\n console.info('data channel event:', event);\n const channel = event.channel;\n channel.onerror = this.handleDataChannelError;\n channel.onmessage = this.handleDataChannelMessage;\n channel.onopen = this.handleDataChannelOpen;\n channel.onclose = this.handleDataChannelClose;\n this.setState({dataChannel: channel});\n }\n\n createPeerConnection(withDataChannel) {\n const iceServers = this.props.tinode.getServerParam('iceServers', null);\n const pc = iceServers ? new RTCPeerConnection({iceServers: iceServers}) : new RTCPeerConnection();\n\n pc.onicecandidate = this.handleICECandidateEvent;\n pc.oniceconnectionstatechange = this.handleICEConnectionStateChangeEvent;\n pc.onicegatheringstatechange = this.handleICEGatheringStateChangeEvent;\n pc.onsignalingstatechange = this.handleSignalingStateChangeEvent;\n pc.onnegotiationneeded = this.handleNegotiationNeededEvent;\n pc.onicecandidateerror = this.handleIceCandidateErrorEvent;\n pc.ontrack = this.handleTrackEvent;\n pc.ondatachannel = this.handleDataChannelEvent;\n\n let stateUpdate = {pc: pc, waitingForPeer: false};\n if (withDataChannel) {\n // Create data channel for exchanging events.\n const channel = pc.createDataChannel(\"events\", {ordered: true});\n channel.onerror = this.handleDataChannelError;\n channel.onmessage = this.handleDataChannelMessage;\n channel.onopen = this.handleDataChannelOpen;\n channel.onclose = this.handleDataChannelClose;\n stateUpdate.dataChannel = channel;\n }\n this.setState(stateUpdate);\n return pc;\n }\n\n handleVideoAnswerMsg(info) {\n // Configure the remote description, which is the SDP payload\n // in 'info' message.\n const desc = new RTCSessionDescription(info.payload);\n this.state.pc.setRemoteDescription(desc)\n .then(_ => {\n this.setState({ callInitialSetupComplete: true }, _ => this.drainRemoteIceCandidatesCache());\n })\n .catch(err => this.reportError(err));\n }\n\n reportError(err) {\n this.props.onError(err.message, 'err');\n }\n\n canSendOffer() {\n return this.isOutgoingCall || this.state.callInitialSetupComplete;\n }\n\n handleNegotiationNeededEvent(event) {\n const pc = event.target;\n if (!this.canSendOffer()) {\n return;\n }\n pc.createOffer().then(offer => {\n return pc.setLocalDescription(offer);\n })\n .then(_ => {\n this.props.onSendOffer(this.props.topic, this.props.seq, pc.localDescription.toJSON());\n })\n .catch(err => this.reportError(err));\n }\n\n handleIceCandidateErrorEvent(event) {\n console.warn(\"ICE candidate error:\", event);\n }\n\n handleICECandidateEvent(event) {\n if (event.candidate) {\n this.props.onIceCandidate(this.props.topic, this.props.seq, event.candidate.toJSON());\n }\n }\n\n handleNewICECandidateMsg(info) {\n const candidate = new RTCIceCandidate(info.payload);\n if (this.state.callInitialSetupComplete) {\n this.state.pc.addIceCandidate(candidate)\n .catch(err => {\n if (candidate.candidate) {\n this.reportError(err);\n }\n console.warn(\"Error adding new ice candidate\", candidate, err);\n });\n } else {\n this.remoteIceCandidatesCache.push(candidate);\n }\n }\n\n drainRemoteIceCandidatesCache() {\n this.remoteIceCandidatesCache.forEach(candidate => {\n this.state.pc.addIceCandidate(candidate)\n .catch(err => {\n if (candidate.candidate) {\n this.reportError(err);\n }\n console.warn(\"Error adding cached ice candidate\", candidate, err);\n });\n });\n this.remoteIceCandidatesCache = [];\n }\n\n handleICEConnectionStateChangeEvent(event) {\n switch (event.target.iceConnectionState) {\n case 'closed':\n case 'failed':\n this.handleCloseClick();\n break;\n }\n }\n\n handleSignalingStateChangeEvent(event) {\n if (event.target.signalingState == 'closed') {\n this.handleCloseClick();\n }\n }\n\n handleICEGatheringStateChangeEvent(event) {\n // ICE gathering change state\n }\n\n handleTrackEvent(event) {\n // Remote video becomes available.\n this.remoteRef.current.srcObject = event.streams[0];\n this.setState({remoteStream: event.streams[0]});\n }\n\n handleGetUserMediaError(e) {\n console.error(\"Error opening camera and/or microphone\", e);\n switch(e.name) {\n case 'NotFoundError':\n // Cannot start the call b/c no camera and/or microphone found.\n this.reportError(e);\n break;\n case 'SecurityError':\n case 'PermissionDeniedError':\n // Do nothing; this is the same as the user canceling the call.\n break;\n default:\n this.reportError(e);\n break;\n }\n\n // Make sure we shut down our end of the RTCPeerConnection so we're\n // ready to try again.\n this.handleCloseClick();\n }\n\n handleVideoOfferMsg(info) {\n let localStream = null;\n // If needed, create peer connection.\n // Not creating data channel since it should be created by the peer.\n const pc = this.state.pc ? this.state.pc : this.createPeerConnection(false);\n const desc = new RTCSessionDescription(info.payload);\n\n pc.setRemoteDescription(desc).then(_ => {\n return navigator.mediaDevices.getUserMedia(this.localStreamConstraints);\n })\n .then(stream => {\n let dummyVideo;\n if (!this.localStreamConstraints.video) {\n // Starting an audio-only call. Create an empty video track so\n // so the user can enable the video during the call.\n dummyVideo = this.emptyVideoTrack();\n stream.addTrack(dummyVideo);\n }\n localStream = stream;\n this.localRef.current.srcObject = stream;\n this.setState({localStream: stream});\n\n localStream.getTracks().forEach(track => {\n pc.addTrack(track, localStream);\n });\n\n if (dummyVideo) {\n dummyVideo.enabled = false;\n dummyVideo.stop();\n stream.removeTrack(dummyVideo);\n }\n })\n .then(_ => {\n return pc.createAnswer();\n })\n .then(answer => {\n return pc.setLocalDescription(answer);\n })\n .then(_ => {\n this.props.onSendAnswer(this.props.topic, this.props.seq, pc.localDescription.toJSON());\n this.setState({ callInitialSetupComplete: true }, _ => this.drainRemoteIceCandidatesCache());\n })\n .catch(this.handleGetUserMediaError);\n }\n\n // Call disconnected by remote.\n handleRemoteHangup() {\n if (!this.state.waitingForPeer) {\n // This is live call, just hang up.\n this.handleCloseClick();\n } else {\n // This is a call which is not yet connected.\n // Stop pulse animation.\n this.setState({waitingForPeer: false});\n // Change sound and wait a bit before ending it.\n RING_SOUND.pause();\n RING_SOUND.currentTime = 0;\n CALL_ENDED_SOUND.loop = true;\n CALL_ENDED_SOUND.play().catch(_ => {});\n setTimeout(_ => {\n this.handleCloseClick();\n }, 2000);\n }\n }\n\n handleCloseClick() {\n this.stop();\n this.props.onHangup(this.props.topic, this.props.seq);\n }\n\n // Ends video track and turns off the camera.\n muteVideo() {\n if (!this.state.pc || !this.state.dataChannel) {\n return;\n }\n\n const stream = this.state.localStream;\n const t = stream.getVideoTracks()[0];\n t.enabled = false;\n t.stop();\n\n stream.removeTrack(t);\n this.state.dataChannel.send(VIDEO_MUTED_EVENT);\n this.setState({videoToggleInProgress: false});\n }\n\n unmuteVideo() {\n if (!this.state.pc || !this.state.dataChannel) {\n return;\n }\n navigator.mediaDevices.getUserMedia({ video: true })\n .then(stream => {\n // Will extract video track from stream and throw stream away,\n // and replace video track in the media sender.\n this.localRef.current.srcObject = null;\n const sender = this.state.pc.getSenders().find(s => s.track.kind == 'video');\n const track = stream.getVideoTracks()[0];\n // Remote track from new stream.\n stream.removeTrack(track);\n // Add this track to the existing local stream.\n this.state.localStream.addTrack(track);\n return sender.replaceTrack(track);\n })\n .then(_ => {\n this.localRef.current.srcObject = this.state.localStream;\n this.state.dataChannel.send(VIDEO_UNMUTED_EVENT);\n })\n .catch(err => this.handleGetUserMediaError(err))\n .finally(_ => { this.setState({videoToggleInProgress: false}); }); // Make sure we redraw the mute/unmute icons (e.g. camera -> camera_off).\n }\n\n handleToggleCameraClick() {\n if (this.state.videoToggleInProgress) {\n // Toggle currently in progress.\n return;\n }\n const tracks = this.state.localStream.getVideoTracks();\n this.setState({videoToggleInProgress: true}, _ => {\n if (tracks && tracks.length > 0 && tracks[0].enabled && tracks[0].readyState == 'live') {\n this.muteVideo();\n } else {\n this.unmuteVideo();\n }\n this.setState({audioOnly: !this.state.audioOnly});\n });\n }\n\n handleToggleMicClick() {\n const stream = this.state.localStream;\n const t = stream.getAudioTracks()[0];\n t.enabled = !t.enabled;\n // Make sure we redraw the mute/unmute icons (e.g. mic -> mic_off).\n this.forceUpdate();\n }\n\n render() {\n const audioTracks = this.state.localStream && this.state.localStream.getAudioTracks();\n const videoTracks = !this.state.audioOnly && this.state.localStream && this.state.localStream.getVideoTracks();\n const disabled = !this.state.pc || !this.state.dataChannel || !(audioTracks && audioTracks[0]);\n const audioIcon = audioTracks && audioTracks[0] && audioTracks[0].enabled ? 'mic' : 'mic_off';\n const videoIcon = videoTracks && videoTracks[0] && videoTracks[0].enabled && videoTracks[0].readyState == 'live' ? 'videocam' : 'videocam_off';\n const peerTitle = truncateString(this.props.title, MAX_PEER_TITLE_LENGTH);\n const pulseAnimation = this.state.waitingForPeer ? ' pulse' : '';\n\n let remoteActive = false;\n if (this.remoteRef.current && this.remoteRef.current.srcObject && this.state.remoteVideoLive) {\n const rstream = this.remoteRef.current.srcObject;\n if (rstream.getVideoTracks().length > 0) {\n const t = rstream.getVideoTracks()[0];\n remoteActive = t.enabled && t.readyState == 'live';\n }\n }\n\n const minimizedClass = this.props.minimized ? 'minimized' : null;\n const fullScreen = this.props.minimized ? 'fullscreen' : 'fullscreen_exit';\n\n return (\n \n
\n
\n
\n {remoteActive ?\n <>\n
\n
{peerTitle}
\n > :\n <>\n
\n
\n
\n \n
\n
{peerTitle}
\n
\n >\n }\n
\n
\n
\n {fullScreen} \n \n
\n \n call_end \n \n \n {videoIcon} \n \n \n {audioIcon} \n \n
\n
\n );\n }\n};\n\nexport default injectIntl(CallPanel);\n"],"names":["RING_SOUND","Audio","loop","CALL_ENDED_SOUND","DIALING_SOUND","VIDEO_MUTED_EVENT","VIDEO_UNMUTED_EVENT","messages","react_intl__WEBPACK_IMPORTED_MODULE_1__","defineMessages","already_in_call","id","defaultMessage","description","CallPanel","react__WEBPACK_IMPORTED_MODULE_0___default","constructor","props","super","this","state","localStream","undefined","remoteStream","pc","dataChannel","previousOnInfo","waitingForPeer","callInitialSetupComplete","audioOnly","callAudioOnly","videoToggleInProgress","remoteVideoLive","localStreamConstraints","audio","video","isOutgoingCall","callState","containerRef","createRef","localRef","remoteRef","remoteIceCandidatesCache","onInfo","bind","start","stop","createPeerConnection","canSendOffer","drainRemoteIceCandidatesCache","handleNegotiationNeededEvent","handleICECandidateEvent","handleNewICECandidateMsg","handleICEConnectionStateChangeEvent","handleSignalingStateChangeEvent","handleICEGatheringStateChangeEvent","handleIceCandidateErrorEvent","handleTrackEvent","handleVideoOfferMsg","handleVideoAnswerMsg","reportError","handleGetUserMediaError","stopTracks","disconnectMedia","handleCloseClick","handleToggleCameraClick","handleToggleMicClick","handleRemoteHangup","handleVideoCallAccepted","muteVideo","unmuteVideo","emptyVideoTrack","handleDataChannelEvent","handleDataChannelError","handleDataChannelMessage","handleDataChannelOpen","handleDataChannelClose","bounds","dragStart","event","target","classList","contains","window","matchMedia","minimized","stopPropagation","current","setPointerCapture","pointerId","style","cursor","left","offsetLeft","top","offsetTop","width","offsetWidth","height","offsetHeight","parent","offsetParent","maxX","maxY","drag","el","hasPointerCapture","Math","min","max","movementX","movementY","dragEnd","releasePointerCapture","componentDidMount","topic","tinode","getTopic","addEventListener","componentWillUnmount","removeEventListener","info","pause","stream","getTracks","forEach","track","addTrack","kind","enabled","removeTrack","what","play","catch","_","console","warn","canvas","Object","assign","document","createElement","getContext","fillRect","captureStream","getVideoTracks","onError","intl","formatMessage","navigator","mediaDevices","getUserMedia","then","setState","srcObject","onInvite","seq","currentTime","ontrack","onremovetrack","onremovestream","onicecandidate","oniceconnectionstatechange","onsignalingstatechange","onicegatheringstatechange","onnegotiationneeded","onicecandidateerror","ondatachannel","readyState","close","src","tracks","error","data","send","channel","onerror","onmessage","onopen","onclose","withDataChannel","iceServers","getServerParam","RTCPeerConnection","stateUpdate","createDataChannel","ordered","desc","RTCSessionDescription","payload","setRemoteDescription","err","message","createOffer","offer","setLocalDescription","onSendOffer","localDescription","toJSON","candidate","onIceCandidate","RTCIceCandidate","addIceCandidate","push","iceConnectionState","signalingState","streams","e","name","dummyVideo","createAnswer","answer","onSendAnswer","setTimeout","onHangup","t","sender","getSenders","find","s","replaceTrack","finally","length","getAudioTracks","forceUpdate","render","audioTracks","videoTracks","disabled","audioIcon","videoIcon","peerTitle","_lib_strformat_js__WEBPACK_IMPORTED_MODULE_5__","W5","title","pulseAnimation","remoteActive","rstream","minimizedClass","fullScreen","react_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__","jsxs","className","ref","children","jsx","autoPlay","muted","playsInline","FormattedMessage","Fragment","_letter_tile_jsx__WEBPACK_IMPORTED_MODULE_2__","A","authorizeURL","avatar","onClick","onToggleMinimize","__webpack_exports__","injectIntl"],"sourceRoot":""}
\ No newline at end of file
diff --git a/umd/965.prod.js b/umd/965.prod.js
new file mode 100644
index 00000000..18475ddb
--- /dev/null
+++ b/umd/965.prod.js
@@ -0,0 +1,2 @@
+"use strict";(self.webpackChunktinode_webapp=self.webpackChunktinode_webapp||[]).push([[965],{965:function(e,t,i){i.r(t);var s=i(1594),a=i.n(s),n=i(8181),r=i(8492),o=i(3537),d=i.n(o),h=i(7981),l=i(7256),c=(i(3272),i(4848));const u=100,p="audio/webm",m=[p,"audio/mp4",""],f=(0,n.defineMessages)({icon_title_delete:{id:"icon_title_delete",defaultMessage:"Delete recording",description:"Icon tool tip for deleting recorded audio"},icon_title_pause:{id:"icon_title_pause",defaultMessage:"Pause playback",description:"Icon tool tip for pausing audio playback"},icon_title_resume:{id:"icon_title_resume",defaultMessage:"Resume playback",description:"Icon tool tip for resuming audio playback"},icon_title_send:{id:"icon_title_send",defaultMessage:"Send message",description:"Icon tool tip for sending a message"},failed_to_init_audio:{id:"failed_to_init_audio",defaultMessage:"Failed to initialize audio recording",description:"Error message when audio is not available"}});class g extends a().PureComponent{constructor(e){super(e),this.state={enabled:!0,audioRecord:null,recording:!0,paused:!1,duration:"0:00",blobUrl:null,preview:null},this.visualize=this.visualize.bind(this),this.initMediaRecording=this.initMediaRecording.bind(this),this.initCanvas=this.initCanvas.bind(this),this.getRecording=this.getRecording.bind(this),this.cleanUp=this.cleanUp.bind(this),this.handleResume=this.handleResume.bind(this),this.handlePause=this.handlePause.bind(this),this.handleDelete=this.handleDelete.bind(this),this.handleDone=this.handleDone.bind(this),this.durationMillis=0,this.startedOn=null,this.viewBuffer=[],this.canvasRef=a().createRef(),this.recordingTimestamp=0}componentDidMount(){this.stream=null,this.mediaRecorder=null,this.audioContext=null,this.audioInput=null,this.analyser=null,this.audioChunks=[];try{navigator.mediaDevices.getUserMedia({audio:!0,video:!1}).then(this.initMediaRecording,this.props.onError)}catch(e){this.props.onError(e)}}componentWillUnmount(){this.startedOn=null,this.stream&&this.cleanUp()}visualize(){this.initCanvas();const e=new Uint8Array(this.analyser.frequencyBinCount),t=this.canvasWidth,i=this.canvasHeight,s=t/10|0,a=u*s;this.canvasContext.lineWidth=6,this.canvasContext.strokeStyle="#BBBD";let n=0,r=0,o=0;const d=h=>{if(!this.startedOn)return;window.requestAnimationFrame(d);const c=this.durationMillis+(Date.now()-this.startedOn);this.setState({duration:(0,l.Ye)(c/1e3)}),c>6e5&&(this.startedOn=null,this.mediaRecorder.pause(),this.durationMillis+=Date.now()-this.startedOn,this.setState({enabled:!1,recording:!1,duration:(0,l.Ye)(this.durationMillis/1e3)})),this.analyser.getByteTimeDomainData(e);let p=0;for(const t of e)p+=(t-127)**2;r+=Math.sqrt(p/e.length),o++;let m=c/u|0;const f=a>c?0:(c-u*m)/u*10;n!=m&&(n=m,this.viewBuffer.push(r/o),r=0,o=0,this.viewBuffer.length>s&&this.viewBuffer.shift()),this.canvasContext.clearRect(0,0,t,i),this.canvasContext.beginPath();for(let e=0;e3e3&&(this.props.onRecordingProgress(),this.recordingTimestamp=g)};d()}handlePause(e){e.preventDefault(),this.mediaRecorder.pause(),this.mediaRecorder.requestData(),this.durationMillis+=Date.now()-this.startedOn,this.startedOn=null,this.setState({recording:!1})}handleResume(e){e.preventDefault(),this.state.enabled&&(this.startedOn=Date.now(),this.mediaRecorder.resume(),this.setState({recording:!0},this.visualize))}handleDelete(e){e.preventDefault(),this.durationMillis=0,this.startedOn=null,this.mediaRecorder.stop(),this.cleanUp(),this.setState({recording:!1})}handleDone(e){e.preventDefault(),this.setState({recording:!1}),this.startedOn&&(this.durationMillis+=Date.now()-this.startedOn,this.startedOn=null),this.mediaRecorder&&this.mediaRecorder.stop()}initCanvas(){this.canvasRef.current.width=2*this.canvasRef.current.offsetWidth,this.canvasRef.current.height=2*this.canvasRef.current.offsetHeight,this.canvasContext=this.canvasRef.current.getContext("2d"),this.canvasContext.lineCap="round",this.canvasContext.translate(.5,.5),this.canvasWidth=this.canvasRef.current.width,this.canvasHeight=this.canvasRef.current.height}initMediaRecording(e){return this.stream=e,m.some(t=>!!MediaRecorder.isTypeSupported(t)&&(this.mediaRecorder=new MediaRecorder(e,{mimeType:t,audioBitsPerSecond:24e3}),!0)),this.mediaRecorder?(this.audioContext=new AudioContext,this.audioInput=this.audioContext.createMediaStreamSource(e),this.audioInput?(this.analyser=this.audioContext.createAnalyser(),this.analyser.fftSize=256,this.audioInput.connect(this.analyser),this.mediaRecorder.onstop=e=>{this.durationMillis>2e3?this.getRecording(this.mediaRecorder.mimeType).then(e=>this.props.onFinished(e.url,e.preview,this.durationMillis)):this.props.onDeleted(),this.cleanUp()},this.mediaRecorder.ondataavailable=e=>{e.data.size>0&&this.audioChunks.push(e.data),"inactive"!=this.mediaRecorder.state&&this.getRecording(this.mediaRecorder.mimeType).then(e=>{this.setState({blobUrl:e.url,preview:e.preview})})},this.durationMillis=0,this.startedOn=Date.now(),this.mediaRecorder.start(),this.visualize(),this.props.onRecordingProgress(),void(this.recordingTimestamp=this.startedOn)):(console.warn("createMediaStreamSource returned null: audio input unavailable"),void this.props.onError(this.props.intl.formatMessage(f.failed_to_init_audio)))):(console.warn("MediaRecorder failed to initialize: no supported audio formats"),void this.props.onError(this.props.intl.formatMessage(f.failed_to_init_audio)))}getRecording(e){e=e||p;let t=new Blob(this.audioChunks,{type:e});return(e==p?d()(t,e):Promise.resolve(t)).then(e=>(t=e,e.arrayBuffer())).then(e=>this.audioContext.decodeAudioData(e)).then(e=>this.createPreview(e)).then(e=>({url:window.URL.createObjectURL(t),preview:(0,h.Pv)(e)}))}createPreview(e){const t=e.getChannelData(0),i=Math.min(t.length,96),s=t.length/i|0,a=Math.max(1,s/10|0);let n=[],r=-1;for(let e=0;e0&&(n=n.map(e=>100*e/r|0)),n}cleanUp(){this.audioInput&&this.audioInput.disconnect(),this.stream.getTracks().forEach(e=>e.stop())}render(){const{formatMessage:e}=this.props.intl,t="material-icons "+(this.state.enabled?"red":"gray");return(0,c.jsxs)("div",{className:"audio",children:[(0,c.jsx)("a",{href:"#",onClick:this.handleDelete,title:e(f.icon_title_delete),children:(0,c.jsx)("i",{className:"material-icons gray",children:"delete_outline"})}),this.state.recording?(0,c.jsx)("canvas",{ref:this.canvasRef}):(0,c.jsx)(r.A,{src:this.state.blobUrl,preview:this.state.preview,duration:this.durationMillis,short:!0}),(0,c.jsx)("div",{className:"duration",children:this.state.duration}),this.state.recording?(0,c.jsx)("a",{href:"#",onClick:this.handlePause,title:e(f.icon_title_pause),children:(0,c.jsx)("i",{className:"material-icons",children:"pause_circle_outline"})}):(0,c.jsx)("a",{href:"#",onClick:this.handleResume,title:e(f.icon_title_resume),children:(0,c.jsx)("i",{className:t,children:"radio_button_checked"})}),(0,c.jsx)("a",{href:"#",onClick:this.handleDone,title:e(f.icon_title_send),children:(0,c.jsx)("i",{className:"material-icons",children:"send"})})]})}}t.default=(0,n.injectIntl)(g)}}]);
+//# sourceMappingURL=965.prod.js.map
\ No newline at end of file
diff --git a/umd/965.prod.js.map b/umd/965.prod.js.map
new file mode 100644
index 00000000..0624d482
--- /dev/null
+++ b/umd/965.prod.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"965.prod.js","mappings":"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","sources":["webpack://tinode-webapp/./src/widgets/audio-recorder.jsx"],"sourcesContent":["// Audio recorder widget.\n\nimport React from 'react';\nimport { defineMessages, injectIntl } from 'react-intl';\n\nimport AudioPlayer from './audio-player.jsx';\n// Workaround for https://bugs.chromium.org/p/chromium/issues/detail?id=642012\n// It adds duration and SeekHead to the webm record.\nimport fixWebmDuration from 'webm-duration-fix';\n\nimport { intArrayToBase64 } from '../lib/blob-helpers.js'\nimport { secondsToTime } from '../lib/strformat';\nimport { KEYPRESS_DELAY, MAX_DURATION, MIN_DURATION } from '../config.js';\n\n// FFT resolution.\nconst BUFFER_SIZE = 256;\n// Make canvas bigger than the element size to reduce blurring.\nconst CANVAS_UPSCALING = 2.0;\n// Thickness of a visualization bar.\nconst LINE_WIDTH = 3 * CANVAS_UPSCALING;\n// Spacing between two visualization bars.\nconst SPACING = 2 * CANVAS_UPSCALING;\n// Duration represented by one visualization bar.\nconst MILLIS_PER_BAR = 100;\n// Color of histogram bars\nconst BAR_COLOR = '#BBBD';\n// Vertical scaling for visualization bars.\nconst BAR_SCALE = 64.0;\n// Number of bars in preview.\nconst VISUALIZATION_BARS = 96;\n// Maximum number of samples per bar.\nconst MAX_SAMPLES_PER_BAR = 10;\n\n// Default recording format (FF, Chrome except on iOS).\nconst DEFAULT_AUDIO_MIME_TYPE = 'audio/webm';\n// Safari supports only mp4 as audio recording format.\nconst SAFARI_AUDIO_MIME_TYPE = 'audio/mp4';\nconst AUDIO_MIME_TYPES = [DEFAULT_AUDIO_MIME_TYPE, SAFARI_AUDIO_MIME_TYPE, ''];\n\nconst messages = defineMessages({\n icon_title_delete: {\n id: 'icon_title_delete',\n defaultMessage: 'Delete recording',\n description: 'Icon tool tip for deleting recorded audio'\n },\n icon_title_pause: {\n id: 'icon_title_pause',\n defaultMessage: 'Pause playback',\n description: 'Icon tool tip for pausing audio playback'\n },\n icon_title_resume: {\n id: 'icon_title_resume',\n defaultMessage: 'Resume playback',\n description: 'Icon tool tip for resuming audio playback'\n },\n icon_title_send: {\n id: 'icon_title_send',\n defaultMessage: 'Send message',\n description: 'Icon tool tip for sending a message'\n },\n failed_to_init_audio: {\n id: 'failed_to_init_audio',\n defaultMessage: 'Failed to initialize audio recording',\n description: 'Error message when audio is not available'\n }\n});\n\nclass AudioRecorder extends React.PureComponent {\n constructor(props) {\n super(props);\n\n this.state = {\n enabled: true,\n audioRecord: null,\n recording: true,\n paused: false,\n duration: '0:00',\n blobUrl: null,\n preview: null\n };\n\n this.visualize = this.visualize.bind(this);\n this.initMediaRecording = this.initMediaRecording.bind(this);\n this.initCanvas = this.initCanvas.bind(this);\n this.getRecording = this.getRecording.bind(this);\n this.cleanUp = this.cleanUp.bind(this);\n\n this.handleResume = this.handleResume.bind(this);\n this.handlePause = this.handlePause.bind(this);\n this.handleDelete = this.handleDelete.bind(this);\n this.handleDone = this.handleDone.bind(this);\n\n this.durationMillis = 0;\n this.startedOn = null;\n this.viewBuffer = [];\n this.canvasRef = React.createRef();\n\n // Timestamp for sending \"recording\" notifications.\n this.recordingTimestamp = 0;\n }\n\n componentDidMount() {\n this.stream = null;\n this.mediaRecorder = null;\n this.audioContext = null;\n this.audioInput = null;\n this.analyser = null;\n\n this.audioChunks = [];\n\n // Start recorder right away.\n try {\n navigator.mediaDevices.getUserMedia({audio: true, video: false}).then(this.initMediaRecording, this.props.onError);\n } catch (err) {\n this.props.onError(err);\n }\n }\n\n componentWillUnmount() {\n this.startedOn = null;\n if (this.stream) {\n this.cleanUp();\n }\n }\n\n // Draw amplitude of sound.\n visualize() {\n this.initCanvas();\n\n const pcmData = new Uint8Array(this.analyser.frequencyBinCount);\n const width = this.canvasWidth;\n const height = this.canvasHeight;\n // Number of bars.\n const viewLength = (width / (LINE_WIDTH + SPACING)) | 0;\n // Duration of audio which fits onto the screen.\n const viewDuration = MILLIS_PER_BAR * viewLength;\n\n this.canvasContext.lineWidth = LINE_WIDTH;\n this.canvasContext.strokeStyle = BAR_COLOR;\n\n let prevBarCount = 0;\n let volume = 0.0;\n let countPerBar = 0;\n const drawFrame = _ => {\n if (!this.startedOn) {\n return;\n }\n window.requestAnimationFrame(drawFrame);\n\n const duration = this.durationMillis + (Date.now() - this.startedOn);\n // Update record length timer.\n this.setState({duration: secondsToTime(duration / 1000)});\n\n // Check if record is too long.\n if (duration > MAX_DURATION) {\n this.startedOn = null;\n this.mediaRecorder.pause();\n this.durationMillis += Date.now() - this.startedOn;\n this.setState({enabled: false, recording: false, duration: secondsToTime(this.durationMillis / 1000)});\n }\n\n // Draw histogram.\n\n // Get current waveform and calculate its amplitude.\n this.analyser.getByteTimeDomainData(pcmData);\n let amp = 0.0;\n for (const amplitude of pcmData) {\n amp += (amplitude - 127) ** 2;\n }\n\n // Sum the amplitude.\n volume += Math.sqrt(amp/pcmData.length);\n countPerBar ++;\n\n let barCount = (duration / MILLIS_PER_BAR) | 0;\n // Shift of the histogram along x-axis to make scrolling smooth. No need to shift if recording is too short.\n const dx = viewDuration > duration ? 0 :\n (duration - MILLIS_PER_BAR * barCount) / MILLIS_PER_BAR * (LINE_WIDTH + SPACING);\n\n if (prevBarCount != barCount) {\n prevBarCount = barCount;\n // Add new amplitude visualization bar.\n this.viewBuffer.push(volume/countPerBar);\n volume = 0.0;\n countPerBar = 0;\n if (this.viewBuffer.length > viewLength) {\n // Keep at most 'viewLength' amplitude bars.\n this.viewBuffer.shift();\n }\n }\n\n // Clear canvas.\n this.canvasContext.clearRect(0, 0, width, height);\n\n // Draw amplitude bars.\n this.canvasContext.beginPath();\n for (let i = 0; i < this.viewBuffer.length; i++) {\n let x = i * (LINE_WIDTH + SPACING) - dx;\n let y = Math.max(Math.min(this.viewBuffer[i] / BAR_SCALE, 0.9) * height, 1);\n\n this.canvasContext.moveTo(x, (height - y) * 0.5);\n this.canvasContext.lineTo(x, (height + y) * 0.5);\n }\n // Actually draw the bars on canvas.\n this.canvasContext.stroke();\n\n // Send notification, if needed.\n const now = new Date().getTime();\n if (now - this.recordingTimestamp > KEYPRESS_DELAY) {\n this.props.onRecordingProgress();\n this.recordingTimestamp = now;\n }\n }\n\n drawFrame();\n }\n\n handlePause(e) {\n e.preventDefault();\n this.mediaRecorder.pause();\n this.mediaRecorder.requestData();\n this.durationMillis += Date.now() - this.startedOn;\n this.startedOn = null;\n this.setState({recording: false});\n }\n\n handleResume(e) {\n e.preventDefault();\n if (this.state.enabled) {\n this.startedOn = Date.now();\n this.mediaRecorder.resume();\n this.setState({recording: true}, this.visualize);\n }\n }\n\n handleDelete(e) {\n e.preventDefault();\n this.durationMillis = 0;\n this.startedOn = null;\n this.mediaRecorder.stop();\n this.cleanUp();\n this.setState({recording: false});\n }\n\n handleDone(e) {\n e.preventDefault();\n this.setState({recording: false});\n if (this.startedOn) {\n this.durationMillis += Date.now() - this.startedOn;\n this.startedOn = null;\n }\n // Stop recording and return data.\n if (this.mediaRecorder) {\n this.mediaRecorder.stop();\n }\n }\n\n initCanvas() {\n this.canvasRef.current.width = this.canvasRef.current.offsetWidth * CANVAS_UPSCALING;\n this.canvasRef.current.height = this.canvasRef.current.offsetHeight * CANVAS_UPSCALING;\n\n this.canvasContext = this.canvasRef.current.getContext('2d');\n this.canvasContext.lineCap = 'round';\n // To reduce line blurring.\n this.canvasContext.translate(0.5, 0.5);\n this.canvasWidth = this.canvasRef.current.width;\n this.canvasHeight = this.canvasRef.current.height;\n }\n\n initMediaRecording(stream) {\n this.stream = stream;\n AUDIO_MIME_TYPES.some(mimeType => {\n if (MediaRecorder.isTypeSupported(mimeType)) {\n this.mediaRecorder = new MediaRecorder(stream, {mimeType: mimeType, audioBitsPerSecond: 24_000});\n return true;\n }\n return false;\n });\n\n if (!this.mediaRecorder) {\n console.warn('MediaRecorder failed to initialize: no supported audio formats');\n this.props.onError(this.props.intl.formatMessage(messages.failed_to_init_audio));\n return;\n }\n\n // The following code is needed for visualization.\n this.audioContext = new AudioContext();\n this.audioInput = this.audioContext.createMediaStreamSource(stream);\n if (!this.audioInput) {\n console.warn('createMediaStreamSource returned null: audio input unavailable');\n this.props.onError(this.props.intl.formatMessage(messages.failed_to_init_audio));\n return;\n }\n\n this.analyser = this.audioContext.createAnalyser();\n this.analyser.fftSize = BUFFER_SIZE;\n this.audioInput.connect(this.analyser);\n\n this.mediaRecorder.onstop = _ => {\n if (this.durationMillis > MIN_DURATION) {\n this.getRecording(this.mediaRecorder.mimeType)\n .then(result => this.props.onFinished(result.url, result.preview, this.durationMillis));\n } else {\n this.props.onDeleted();\n }\n this.cleanUp();\n }\n\n this.mediaRecorder.ondataavailable = (e) => {\n if (e.data.size > 0) {\n this.audioChunks.push(e.data);\n }\n\n if (this.mediaRecorder.state != 'inactive') {\n this.getRecording(this.mediaRecorder.mimeType).then(result => {\n this.setState({\n blobUrl: result.url,\n preview: result.preview\n });\n });\n }\n }\n\n this.durationMillis = 0;\n this.startedOn = Date.now();\n this.mediaRecorder.start();\n this.visualize();\n\n this.props.onRecordingProgress();\n this.recordingTimestamp = this.startedOn;\n }\n\n // Obtain data in a form sutable for sending or playing back.\n getRecording(mimeType) {\n mimeType = mimeType || DEFAULT_AUDIO_MIME_TYPE;\n let blob = new Blob(this.audioChunks, {type: mimeType});\n // If duration is valid, apply fix for Chrome's WebM duration bug.\n const result = mimeType == DEFAULT_AUDIO_MIME_TYPE ?\n fixWebmDuration(blob, mimeType) :\n Promise.resolve(blob);\n return result\n .then(fixedBlob => { blob = fixedBlob; return fixedBlob.arrayBuffer(); })\n .then(arrayBuff => this.audioContext.decodeAudioData(arrayBuff))\n .then(decoded => this.createPreview(decoded))\n .then(preview => ({url: window.URL.createObjectURL(blob), preview: intArrayToBase64(preview)}));\n }\n\n // Preview must be calculated at the source: Chrome does not allow background AudioContext.\n createPreview(audio) {\n const data = audio.getChannelData(0);\n // Number of amplitude bars in preview.\n const viewLength = Math.min(data.length, VISUALIZATION_BARS);\n // The number of samples in each bar.\n const totalSPB = (data.length / viewLength) | 0;\n // Distance between samples: we are going to take just a fracton of samples.\n const samplingRate = Math.max(1, (totalSPB / MAX_SAMPLES_PER_BAR) | 0);\n\n let buffer = [];\n let max = -1;\n for (let i = 0; i < viewLength; i++) {\n let amplitude = 0;\n let count = 0;\n for (let j = 0; j < totalSPB; j += samplingRate) {\n amplitude += data[totalSPB * i + j] ** 2;\n count ++;\n }\n const val = Math.sqrt(amplitude / count);\n buffer.push(val);\n max = Math.max(max, val);\n }\n // Normalize amplitude to 0..100.\n if (max > 0) {\n buffer = buffer.map(a => (100 * a / max) | 0);\n }\n return buffer;\n }\n\n cleanUp() {\n if (this.audioInput) {\n this.audioInput.disconnect();\n }\n this.stream.getTracks().forEach(track => track.stop());\n }\n\n render() {\n const {formatMessage} = this.props.intl;\n const resumeClass = 'material-icons ' + (this.state.enabled ? 'red' : 'gray');\n return (\n \n );\n }\n}\n\nexport default injectIntl(AudioRecorder);\n"],"names":["MILLIS_PER_BAR","DEFAULT_AUDIO_MIME_TYPE","AUDIO_MIME_TYPES","messages","react_intl__WEBPACK_IMPORTED_MODULE_1__","defineMessages","icon_title_delete","id","defaultMessage","description","icon_title_pause","icon_title_resume","icon_title_send","failed_to_init_audio","AudioRecorder","react__WEBPACK_IMPORTED_MODULE_0___default","constructor","props","super","this","state","enabled","audioRecord","recording","paused","duration","blobUrl","preview","visualize","bind","initMediaRecording","initCanvas","getRecording","cleanUp","handleResume","handlePause","handleDelete","handleDone","durationMillis","startedOn","viewBuffer","canvasRef","createRef","recordingTimestamp","componentDidMount","stream","mediaRecorder","audioContext","audioInput","analyser","audioChunks","navigator","mediaDevices","getUserMedia","audio","video","then","onError","err","componentWillUnmount","pcmData","Uint8Array","frequencyBinCount","width","canvasWidth","height","canvasHeight","viewLength","viewDuration","canvasContext","lineWidth","strokeStyle","prevBarCount","volume","countPerBar","drawFrame","_","window","requestAnimationFrame","Date","now","setState","_lib_strformat__WEBPACK_IMPORTED_MODULE_5__","Ye","pause","getByteTimeDomainData","amp","amplitude","Math","sqrt","length","barCount","dx","push","shift","clearRect","beginPath","i","x","y","max","min","moveTo","lineTo","stroke","getTime","onRecordingProgress","e","preventDefault","requestData","resume","stop","current","offsetWidth","offsetHeight","getContext","lineCap","translate","some","mimeType","MediaRecorder","isTypeSupported","audioBitsPerSecond","AudioContext","createMediaStreamSource","createAnalyser","fftSize","connect","onstop","result","onFinished","url","onDeleted","ondataavailable","data","size","start","console","warn","intl","formatMessage","blob","Blob","type","webm_duration_fix__WEBPACK_IMPORTED_MODULE_3___default","Promise","resolve","fixedBlob","arrayBuffer","arrayBuff","decodeAudioData","decoded","createPreview","URL","createObjectURL","_lib_blob_helpers_js__WEBPACK_IMPORTED_MODULE_4__","Pv","getChannelData","totalSPB","samplingRate","buffer","count","j","val","map","a","disconnect","getTracks","forEach","track","render","resumeClass","react_jsx_runtime__WEBPACK_IMPORTED_MODULE_7__","jsxs","className","children","jsx","href","onClick","title","ref","_audio_player_jsx__WEBPACK_IMPORTED_MODULE_2__","A","src","short","__webpack_exports__","injectIntl"],"sourceRoot":""}
\ No newline at end of file
diff --git a/umd/983.prod.js b/umd/983.prod.js
new file mode 100644
index 00000000..3676e867
--- /dev/null
+++ b/umd/983.prod.js
@@ -0,0 +1,2 @@
+"use strict";(self.webpackChunktinode_webapp=self.webpackChunktinode_webapp||[]).push([[983],{7983:function(e,d,a){a.r(d),a.d(d,{default:function(){return C}});var i=a(1594),s=a.n(i),l=a(8181),t=a(8892),o=a(3889),c=a(6686),n=a(2685),r=a(4848);const h=(0,l.defineMessages)({password_reset_email_sent:{id:"password_reset_email_sent",defaultMessage:"An email with security code has been sent.",description:"Notification that the email with password reset instructions has been sent"},password_reset_sms_sent:{id:"password_reset_sms_sent",defaultMessage:"A text message with security code has been sent.",description:"Notification that the SMS with password reset instructions has been sent"}});class m extends s().PureComponent{constructor(e){super(e),this.state={code:"",tel:"",email:"",sent:!1},this.handleSubmit=this.handleSubmit.bind(this),this.handleEmailChange=this.handleEmailChange.bind(this),this.handlePhoneChange=this.handlePhoneChange.bind(this),this.handleCodeChange=this.handleCodeChange.bind(this)}static formatPhoneNumber(e){let d;try{d=(0,t.L)(e)}catch(e){}return d?d.formatInternational():e}handleEmailChange(e){this.setState({email:e.target.value})}handlePhoneChange(e){this.setState({tel:e})}handleCodeChange(e){this.setState({code:e.target.value.replace(/[^\d]/g,"")})}handleSubmit(e){e.preventDefault();const d="email"==this.props.method?this.state.email:this.state.tel;if(this.state.code)this.props.onError(null),this.props.onCredConfirm(this.props.method,this.state.code);else if(d){this.props.onCredAdd(this.props.method,d),this.setState({sent:!0});const e="email"==this.props.method?h.password_reset_email_sent:h.password_reset_sms_sent;this.props.onError(this.props.intl.formatMessage(e),"info")}}render(){const e=this.state.sent||!this.props.done,d=e?this.state.tel||this.state.email:this.props.val,a="tel"==this.props.method?m.formatPhoneNumber(d):d,i=(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)("div",{className:"panel-form-row",children:(0,r.jsx)("label",{className:"large",children:(0,r.jsx)(l.FormattedMessage,{id:"change_email",defaultMessage:"Change email",description:"Prompt to change current email"})})}),(0,r.jsx)("div",{className:"group",children:(0,r.jsx)("label",{className:"small gray",children:(0,r.jsx)(l.FormattedMessage,{id:"current_email",defaultMessage:"Current email",description:"Label for old email"})})})]}),s=(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)("div",{className:"panel-form-row",children:(0,r.jsx)("label",{className:"large",children:(0,r.jsx)(l.FormattedMessage,{id:"change_phone",defaultMessage:"Change phone number",description:"Prompt to change current phone number"})})}),(0,r.jsx)("div",{className:"group",children:(0,r.jsx)("label",{className:"small gray",children:(0,r.jsx)(l.FormattedMessage,{id:"current_phone",defaultMessage:"Current phone number",description:"Label for old phone"})})})]}),t=(0,r.jsx)("label",{className:"small gray",children:(0,r.jsx)(l.FormattedMessage,{id:"new_email",defaultMessage:"New email",description:"Prompt for entering a new email"})}),o=(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)("div",{className:"group",children:t}),(0,r.jsx)("div",{className:"group",children:(0,r.jsx)(l.FormattedMessage,{id:"email_prompt",defaultMessage:"Email, e.g. jdoe@example.com",description:"Input placeholder for email entry",children:e=>(0,r.jsx)("input",{type:"email",placeholder:e,autoComplete:"email",value:this.state.email,onChange:this.handleEmailChange,required:!0})})})]}),c=(0,r.jsx)("label",{className:"small gray",children:(0,r.jsx)(l.FormattedMessage,{id:"new_phone_number",defaultMessage:"New phone number",description:"Prompt for entering a new telephone number"})}),h=(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)("div",{className:"group",children:c}),(0,r.jsx)("div",{className:"panel-form-row",children:(0,r.jsx)(n.A,{autoFocus:!0,onShowCountrySelector:this.props.onShowCountrySelector,onSubmit:this.handlePhoneChange})})]}),p=(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)("div",{className:"group",children:(0,r.jsx)("label",{className:"small gray",children:(0,r.jsx)(l.FormattedMessage,{id:"enter_confirmation_code_prompt",defaultMessage:"Confirmation code",description:"Request to enter confirmation code"})})}),(0,r.jsx)("div",{className:"group",children:(0,r.jsx)(l.FormattedMessage,{id:"numeric_confirmation_code_prompt",defaultMessage:"Numbers only",description:"Prompt for numeric conformation code",children:e=>(0,r.jsx)("input",{type:"text",placeholder:e,maxLength:10,value:this.state.code,onChange:this.handleCodeChange,required:!0})})})]});return(0,r.jsxs)("form",{className:"panel-form-column",onSubmit:this.handleSubmit,children:[e?"email"==this.props.method?t:"tel"==this.props.method?c:null:"email"==this.props.method?i:"tel"==this.props.method?s:null,(0,r.jsx)("div",{className:"panel-form-row",children:(0,r.jsx)("tt",{className:"quoted",children:a})}),e?null:"email"==this.props.method?o:"tel"==this.props.method?h:null,e?p:null,(0,r.jsxs)("div",{className:"dialog-buttons",children:[(0,r.jsx)("button",{className:"secondary",onClick:this.props.onCancel,children:(0,r.jsx)(l.FormattedMessage,{id:"button_cancel",defaultMessage:"Cancel",description:"Button [Cancel]"})}),(0,r.jsx)("button",{className:"primary",type:"submit",children:(0,r.jsx)(l.FormattedMessage,{id:"button_ok",defaultMessage:"OK",description:"Button [OK]"})})]})]})}}var p=(0,l.injectIntl)(m),u=a(7981),g=a(7256);function f(e,d){return(0,g.W5)(e,d)}a(3272);class C extends s().Component{constructor(e){super(e);const d=this.props.tinode.getMeTopic();this.state={fullName:f(d.public?d.public.fn:void 0,60),description:f(d.public?d.public.note:void 0,360),avatar:(0,u.to)(d.public?d.public.photo:null),credentials:d.getCredentials()||[],credEdit:void 0,alias:((d.tags()||[]).find(e=>e.startsWith("alias:"))||"").substring(6)}}componentDidMount(){const e=this.props.tinode.getMeTopic();e.onCredsUpdated=d=>this.setState({credentials:e.getCredentials()})}componentWillUnmount(){this.props.tinode.getMeTopic().onCredsUpdated=null}render(){if(this.state.credEdit)return(0,r.jsx)(p,{method:this.state.credEdit.meth,val:this.state.credEdit.val,done:this.state.credEdit.done,onShowCountrySelector:this.props.onShowCountrySelector,onCredAdd:this.props.onCredAdd,onCredConfirm:this.props.onCredConfirm,onCancel:e=>this.setState({credEdit:void 0}),onError:this.props.onError});const e={};this.state.credentials.forEach(d=>{d.done&&(e[d.meth]=(e[d.meth]||0)+1)});const d=[];return this.state.credentials.forEach((a,i)=>{if(!["email","tel"].includes(a.meth))return;let s=a.val;if("tel"==a.meth){const e=(0,t.L)(a.val);s=e?e.formatInternational():a.val}d.push((0,r.jsxs)("div",{className:"group quoted",children:[(0,r.jsx)("tt",{className:"clickable",onClick:e=>{e.preventDefault(),this.setState({credEdit:a})},children:s}),(0,r.jsxs)("span",{children:[" ",a.done?null:(0,r.jsx)("i",{className:"material-icons",children:"pending"})," ",!a.done||e[a.meth]>1||this.props.reqCredMethod!=a.meth?(0,r.jsx)("a",{href:"#",onClick:e=>{e.preventDefault(),this.props.onCredDelete(a.meth,a.val)},children:(0,r.jsx)("i",{className:"material-icons",children:"delete"})}):null]})]},i))}),d.length>0&&d.unshift((0,r.jsx)("label",{className:"small",children:(0,r.jsx)(l.FormattedMessage,{id:"label_user_contacts",defaultMessage:"Contacts",description:"Label for user contacts"})},"title")),(0,r.jsxs)("div",{className:"scrollable-panel",children:[(0,r.jsxs)("div",{className:"panel-form-column",children:[(0,r.jsxs)("a",{href:"#",className:"flat-button float-right",onClick:e=>{e.preventDefault(),this.props.onNavigate("general")},children:[(0,r.jsx)("i",{className:"material-icons",children:"edit"})," ",(0,r.jsx)(l.FormattedMessage,{id:"button_edit",defaultMessage:"Edit",description:"Call to action [Edit]"})]}),(0,r.jsx)("center",{children:(0,r.jsx)(o.A,{tinode:this.props.tinode,avatar:this.state.avatar,readOnly:!0,uid:this.props.myUserId,title:this.state.fullName})}),(0,r.jsxs)("div",{className:"group",children:[(0,r.jsx)("label",{className:"small",children:(0,r.jsx)(l.FormattedMessage,{id:"label_your_name",defaultMessage:"Your name",description:"Label for full name editing"})}),(0,r.jsx)("div",{className:"large ellipsized",children:this.state.fullName})]}),(0,r.jsxs)("div",{className:"group",children:[(0,r.jsx)("label",{className:"small",children:(0,r.jsx)(l.FormattedMessage,{id:"label_user_id",defaultMessage:"ID:",description:"Label for user address (ID)"})})," ",(0,r.jsx)("tt",{children:this.props.myUserId})]}),this.state.alias?(0,r.jsxs)("div",{className:"group",children:[(0,r.jsx)("label",{className:"small",children:(0,r.jsx)(l.FormattedMessage,{id:"label_alias",defaultMessage:"Alias:",description:"Label for user or topic alias"})})," ",(0,r.jsxs)("tt",{children:["@",this.state.alias]})]}):null,(0,r.jsx)("div",{className:"group",children:(0,r.jsx)(c.A,{trustedBadges:this.props.trustedBadges})}),this.state.description?(0,r.jsxs)("div",{className:"group",children:[(0,r.jsx)("label",{className:"small",children:(0,r.jsx)(l.FormattedMessage,{id:"label_description",defaultMessage:"Description",description:"Label for description of user or topic"})}),(0,r.jsx)("div",{className:"quoted",children:this.state.description})]}):null]}),(0,r.jsx)("div",{className:"hr"}),(0,r.jsx)("div",{className:"panel-form-column",children:(0,r.jsx)("div",{className:"group",children:d})}),(0,r.jsx)("div",{className:"hr"}),(0,r.jsxs)("div",{className:"panel-form-column",children:[(0,r.jsxs)("a",{href:"#",className:"flat-button",onClick:e=>{e.preventDefault(),this.props.onNavigate("acc_general")},children:[(0,r.jsx)("i",{className:"material-icons",children:"tune"})," ",(0,r.jsx)(l.FormattedMessage,{id:"sidepanel_title_acc_general",defaultMessage:"General",description:"Sidepanel title for AccGeneralView."})]}),(0,r.jsxs)("a",{href:"#",className:"flat-button",onClick:e=>{e.preventDefault(),this.props.onNavigate("notif")},children:[(0,r.jsx)("i",{className:"material-icons",children:"notifications"})," ",(0,r.jsx)(l.FormattedMessage,{id:"sidepanel_title_acc_notifications",defaultMessage:"Notifications",description:"Sidepanel title for AccNotificationsView."})]}),(0,r.jsxs)("a",{href:"#",className:"flat-button",onClick:e=>{e.preventDefault(),this.props.onNavigate("security")},children:[(0,r.jsx)("i",{className:"material-icons",children:"security"})," ",(0,r.jsx)(l.FormattedMessage,{id:"button_security",defaultMessage:"Security",description:"Navigaton button for security panel."})]}),(0,r.jsxs)("a",{href:"#",className:"flat-button",onClick:e=>{e.preventDefault(),this.props.onNavigate("support")},children:[(0,r.jsx)("i",{className:"material-icons",children:"contact_support"})," ",(0,r.jsx)(l.FormattedMessage,{id:"sidepanel_title_acc_support",defaultMessage:"Support",description:"Sidepanel title for AccSupportView."})]})]})]})}}},2685:function(e,d,a){var i=a(1594),s=a.n(i),l=a(8181),t=a(8892),o=a(4724),c=a(6187),n=a(4701),r=a(111),h=a(7256),m=a(4848);const p=(0,l.defineMessages)({mobile_number_required:{id:"mobile_number_required",defaultMessage:"Mobile phone number required",description:"Error message"}});class u extends s().PureComponent{constructor(e){super(e),this.codeMap={},r.forEach(e=>{this.codeMap[e.code]=e.dial});const d=e.countryCode||"US",a=this.codeMap[d];this.state={countryCode:d,dialCode:a,localNumber:"",placeholderNumber:this.placeholderNumber(d,a)},this.handleChange=this.handleChange.bind(this),this.handleFinished=this.handleFinished.bind(this),this.handleKeyDown=this.handleKeyDown.bind(this),this.showCountrySelector=this.showCountrySelector.bind(this)}handleChange(e){const d=`+${this.state.dialCode}`;let a=(new o.Q).input(`${d}${this.filterNumber(e.target.value)}`);a=a.substring(d.length).trim(),this.setState({localNumber:a})}handleFinished(e){e.preventDefault();const d=`${this.state.dialCode}${this.state.localNumber.trim()}`.replace(/[^\d]/g,"");let a=null;try{a=(0,t.L)(`+${d}`)}catch(e){}a&&a.isValid()?(this.inputField.setCustomValidity(""),this.props.onSubmit(a.format("E.164"))):this.inputField.setCustomValidity(this.props.intl.formatMessage(p.mobile_number_required))}handleKeyDown(e){"Enter"===e.key&&this.handleFinished(e)}showCountrySelector(){this.props.onShowCountrySelector(this.state.countryCode,this.state.dialCode,(e,d)=>{this.setState({countryCode:e,dialCode:d,placeholderNumber:this.placeholderNumber(e,d)})})}filterNumber(e){return e?e.replace(/[^-\s().\d]/g,""):e}placeholderNumber(e,d){const a=(0,c.a)(e,n.A);return a?a.formatInternational().substring(d.length+1).trim():"123 0123"}render(){return(0,m.jsxs)(m.Fragment,{children:[(0,m.jsxs)("span",{className:"dial-code",onClick:this.showCountrySelector,children:[(0,m.jsxs)("span",{className:"country-flag",children:[(0,h.lb)(this.state.countryCode)," "]}),"+",this.state.dialCode," "]}),(0,m.jsx)("input",{type:"tel",ref:e=>{this.inputField=e},placeholder:this.state.placeholderNumber,value:this.state.localNumber,onChange:this.handleChange,maxLength:17,onKeyDown:this.handleKeyDown,onBlur:this.handleFinished,required:!0,autoFocus:this.props.autoFocus})]})}}d.A=(0,l.injectIntl)(u)},111:function(e){e.exports=JSON.parse('[{"dial":"93","code":"AF"},{"dial":"355","code":"AL"},{"dial":"213","code":"DZ"},{"dial":"1-684","code":"AS"},{"dial":"376","code":"AD"},{"dial":"244","code":"AO"},{"dial":"1-264","code":"AI"},{"dial":"672","code":"AQ"},{"dial":"1-268","code":"AG"},{"dial":"54","code":"AR"},{"dial":"374","code":"AM"},{"dial":"297","code":"AW"},{"dial":"61","code":"AU"},{"dial":"43","code":"AT"},{"dial":"994","code":"AZ"},{"dial":"1-242","code":"BS"},{"dial":"973","code":"BH"},{"dial":"880","code":"BD"},{"dial":"1-246","code":"BB"},{"dial":"375","code":"BY"},{"dial":"32","code":"BE"},{"dial":"501","code":"BZ"},{"dial":"229","code":"BJ"},{"dial":"1-441","code":"BM"},{"dial":"975","code":"BT"},{"dial":"591","code":"BO"},{"dial":"387","code":"BA"},{"dial":"267","code":"BW"},{"dial":"55","code":"BR"},{"dial":"246","code":"IO"},{"dial":"1-284","code":"VG"},{"dial":"673","code":"BN"},{"dial":"359","code":"BG"},{"dial":"226","code":"BF"},{"dial":"257","code":"BI"},{"dial":"855","code":"KH"},{"dial":"237","code":"CM"},{"dial":"1","code":"CA"},{"dial":"238","code":"CV"},{"dial":"1-345","code":"KY"},{"dial":"236","code":"CF"},{"dial":"235","code":"TD"},{"dial":"56","code":"CL"},{"dial":"86","code":"CN"},{"dial":"61","code":"CX"},{"dial":"61","code":"CC"},{"dial":"57","code":"CO"},{"dial":"269","code":"KM"},{"dial":"682","code":"CK"},{"dial":"506","code":"CR"},{"dial":"385","code":"HR"},{"dial":"53","code":"CU"},{"dial":"599","code":"CW"},{"dial":"357","code":"CY"},{"dial":"420","code":"CZ"},{"dial":"243","code":"CD"},{"dial":"45","code":"DK"},{"dial":"253","code":"DJ"},{"dial":"1-767","code":"DM"},{"dial":"1-809, 1-829, 1-849","code":"DO"},{"dial":"670","code":"TL"},{"dial":"593","code":"EC"},{"dial":"20","code":"EG"},{"dial":"503","code":"SV"},{"dial":"240","code":"GQ"},{"dial":"291","code":"ER"},{"dial":"372","code":"EE"},{"dial":"251","code":"ET"},{"dial":"500","code":"FK"},{"dial":"298","code":"FO"},{"dial":"679","code":"FJ"},{"dial":"358","code":"FI"},{"dial":"33","code":"FR"},{"dial":"689","code":"PF"},{"dial":"241","code":"GA"},{"dial":"220","code":"GM"},{"dial":"995","code":"GE"},{"dial":"49","code":"DE"},{"dial":"233","code":"GH"},{"dial":"350","code":"GI"},{"dial":"30","code":"GR"},{"dial":"299","code":"GL"},{"dial":"1-473","code":"GD"},{"dial":"1-671","code":"GU"},{"dial":"502","code":"GT"},{"dial":"44-1481","code":"GG"},{"dial":"224","code":"GN"},{"dial":"245","code":"GW"},{"dial":"592","code":"GY"},{"dial":"509","code":"HT"},{"dial":"504","code":"HN"},{"dial":"852","code":"HK"},{"dial":"36","code":"HU"},{"dial":"354","code":"IS"},{"dial":"91","code":"IN"},{"dial":"62","code":"ID"},{"dial":"98","code":"IR"},{"dial":"964","code":"IQ"},{"dial":"353","code":"IE"},{"dial":"44-1624","code":"IM"},{"dial":"972","code":"IL"},{"dial":"39","code":"IT"},{"dial":"225","code":"CI"},{"dial":"1-876","code":"JM"},{"dial":"81","code":"JP"},{"dial":"44-1534","code":"JE"},{"dial":"962","code":"JO"},{"dial":"7, 997","code":"KZ"},{"dial":"254","code":"KE"},{"dial":"686","code":"KI"},{"dial":"383","code":"XK"},{"dial":"965","code":"KW"},{"dial":"996","code":"KG"},{"dial":"856","code":"LA"},{"dial":"371","code":"LV"},{"dial":"961","code":"LB"},{"dial":"266","code":"LS"},{"dial":"231","code":"LR"},{"dial":"218","code":"LY"},{"dial":"423","code":"LI"},{"dial":"370","code":"LT"},{"dial":"352","code":"LU"},{"dial":"853","code":"MO"},{"dial":"389","code":"MK"},{"dial":"261","code":"MG"},{"dial":"265","code":"MW"},{"dial":"60","code":"MY"},{"dial":"960","code":"MV"},{"dial":"223","code":"ML"},{"dial":"356","code":"MT"},{"dial":"692","code":"MH"},{"dial":"222","code":"MR"},{"dial":"230","code":"MU"},{"dial":"262","code":"YT"},{"dial":"52","code":"MX"},{"dial":"691","code":"FM"},{"dial":"373","code":"MD"},{"dial":"377","code":"MC"},{"dial":"976","code":"MN"},{"dial":"382","code":"ME"},{"dial":"1-664","code":"MS"},{"dial":"212","code":"MA"},{"dial":"258","code":"MZ"},{"dial":"95","code":"MM"},{"dial":"264","code":"NA"},{"dial":"674","code":"NR"},{"dial":"977","code":"NP"},{"dial":"31","code":"NL"},{"dial":"599","code":"CW"},{"dial":"687","code":"NC"},{"dial":"64","code":"NZ"},{"dial":"505","code":"NI"},{"dial":"227","code":"NE"},{"dial":"234","code":"NG"},{"dial":"683","code":"NU"},{"dial":"850","code":"KP"},{"dial":"1-670","code":"MP"},{"dial":"47","code":"NO"},{"dial":"968","code":"OM"},{"dial":"92","code":"PK"},{"dial":"680","code":"PW"},{"dial":"970","code":"PS"},{"dial":"507","code":"PA"},{"dial":"675","code":"PG"},{"dial":"595","code":"PY"},{"dial":"51","code":"PE"},{"dial":"63","code":"PH"},{"dial":"64","code":"PN"},{"dial":"48","code":"PL"},{"dial":"351","code":"PT"},{"dial":"1-787, 1-939","code":"PR"},{"dial":"974","code":"QA"},{"dial":"242","code":"CG"},{"dial":"262","code":"RE"},{"dial":"40","code":"RO"},{"dial":"7","code":"RU"},{"dial":"250","code":"RW"},{"dial":"590","code":"BL"},{"dial":"290","code":"SH"},{"dial":"1-869","code":"KN"},{"dial":"1-758","code":"LC"},{"dial":"590","code":"MF"},{"dial":"508","code":"PM"},{"dial":"1-784","code":"VC"},{"dial":"685","code":"WS"},{"dial":"378","code":"SM"},{"dial":"239","code":"ST"},{"dial":"966","code":"SA"},{"dial":"221","code":"SN"},{"dial":"381","code":"RS"},{"dial":"248","code":"SC"},{"dial":"232","code":"SL"},{"dial":"65","code":"SG"},{"dial":"1-721","code":"SX"},{"dial":"421","code":"SK"},{"dial":"386","code":"SI"},{"dial":"677","code":"SB"},{"dial":"252","code":"SO"},{"dial":"27","code":"ZA"},{"dial":"82","code":"KR"},{"dial":"211","code":"SS"},{"dial":"34","code":"ES"},{"dial":"94","code":"LK"},{"dial":"249","code":"SD"},{"dial":"597","code":"SR"},{"dial":"47","code":"SJ"},{"dial":"268","code":"SZ"},{"dial":"46","code":"SE"},{"dial":"41","code":"CH"},{"dial":"963","code":"SY"},{"dial":"886","code":"TW"},{"dial":"992","code":"TJ"},{"dial":"255","code":"TZ"},{"dial":"66","code":"TH"},{"dial":"228","code":"TG"},{"dial":"690","code":"TK"},{"dial":"676","code":"TO"},{"dial":"1-868","code":"TT"},{"dial":"216","code":"TN"},{"dial":"90","code":"TR"},{"dial":"993","code":"TM"},{"dial":"1-649","code":"TC"},{"dial":"688","code":"TV"},{"dial":"1-340","code":"VI"},{"dial":"256","code":"UG"},{"dial":"380","code":"UA"},{"dial":"971","code":"AE"},{"dial":"44","code":"GB"},{"dial":"1","code":"US"},{"dial":"598","code":"UY"},{"dial":"998","code":"UZ"},{"dial":"678","code":"VU"},{"dial":"379","code":"VA"},{"dial":"58","code":"VE"},{"dial":"84","code":"VN"},{"dial":"681","code":"WF"},{"dial":"212","code":"EH"},{"dial":"967","code":"YE"},{"dial":"260","code":"ZM"},{"dial":"263","code":"ZW"}]')}}]);
+//# sourceMappingURL=983.prod.js.map
\ No newline at end of file
diff --git a/umd/983.prod.js.map b/umd/983.prod.js.map
new file mode 100644
index 00000000..d418136a
--- /dev/null
+++ b/umd/983.prod.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"983.prod.js","mappings":"mPAOA,MAAMA,GAAW,EAAAC,EAAAC,gBAAe,CAC9BC,0BAA2B,CACzBC,GAAI,4BACJC,eAAgB,6CAChBC,YAAa,8EAEfC,wBAAyB,CACvBH,GAAI,0BACJC,eAAgB,mDAChBC,YAAa,8EAIjB,MAAME,UAAuBC,IAAAC,cAC3B,WAAAC,CAAYC,GACVC,MAAMD,GAENE,KAAKC,MAAQ,CACXC,KAAM,GACNC,IAAK,GACLC,MAAO,GACPC,MAAM,GAGRL,KAAKM,aAAeN,KAAKM,aAAaC,KAAKP,MAC3CA,KAAKQ,kBAAoBR,KAAKQ,kBAAkBD,KAAKP,MACrDA,KAAKS,kBAAoBT,KAAKS,kBAAkBF,KAAKP,MACrDA,KAAKU,iBAAmBV,KAAKU,iBAAiBH,KAAKP,KACrD,CAEA,wBAAOW,CAAkBC,GACvB,IAAIC,EACJ,IACEA,GAAS,EAAAC,EAAAC,GAAiBH,EAC5B,CAAE,MAAOI,GAAM,CACf,OAAOH,EAASA,EAAOI,sBAAwBL,CACjD,CAEA,iBAAAJ,CAAkBU,GAChBlB,KAAKmB,SAAS,CAACf,MAAOc,EAAEE,OAAOC,OACjC,CAEA,iBAAAZ,CAAkBI,GAChBb,KAAKmB,SAAS,CAAChB,IAAKU,GACtB,CAEA,gBAAAH,CAAiBQ,GACflB,KAAKmB,SAAS,CAACjB,KAAMgB,EAAEE,OAAOC,MAAMC,QAAQ,SAAU,KACxD,CAEA,YAAAhB,CAAaY,GACXA,EAAEK,iBACF,MAAMF,EAA6B,SAArBrB,KAAKF,MAAM0B,OAAoBxB,KAAKC,MAAMG,MAAQJ,KAAKC,MAAME,IAC3E,GAAIH,KAAKC,MAAMC,KACbF,KAAKF,MAAM2B,QAAQ,MACnBzB,KAAKF,MAAM4B,cAAc1B,KAAKF,MAAM0B,OAAQxB,KAAKC,MAAMC,WAClD,GAAImB,EAAO,CAChBrB,KAAKF,MAAM6B,UAAU3B,KAAKF,MAAM0B,OAAQH,GACxCrB,KAAKmB,SAAS,CAACd,MAAM,IACrB,MAAMuB,EAA2B,SAArB5B,KAAKF,MAAM0B,OAAoBtC,EAASG,0BAA4BH,EAASO,wBACzFO,KAAKF,MAAM2B,QAAQzB,KAAKF,MAAM+B,KAAKC,cAAcF,GAAM,OACzD,CACF,CAEA,MAAAG,GACE,MAAMC,EAAehC,KAAKC,MAAMI,OAASL,KAAKF,MAAMmC,KAC9CC,EAAWF,EAAgBhC,KAAKC,MAAME,KAAOH,KAAKC,MAAMG,MAASJ,KAAKF,MAAMqC,IAC5EC,EAAsC,OAArBpC,KAAKF,MAAM0B,OAAkB9B,EAAeiB,kBAAkBuB,GAAYA,EAE3FG,GACJ,EAAAC,EAAAC,MAAAD,EAAAE,SAAA,CAAAC,SAAA,EAAE,EAAAH,EAAAI,KAAA,OAAKC,UAAU,iBAAgBF,UAC/B,EAAAH,EAAAI,KAAA,SAAOC,UAAU,QAAOF,UAAC,EAAAH,EAAAI,KAACvD,EAAAyD,iBAAgB,CAACtD,GAAG,eAAeC,eAAe,eAC1EC,YAAY,wCAEhB,EAAA8C,EAAAI,KAAA,OAAKC,UAAU,QAAOF,UACpB,EAAAH,EAAAI,KAAA,SAAOC,UAAU,aAAYF,UAC3B,EAAAH,EAAAI,KAACvD,EAAAyD,iBAAgB,CAACtD,GAAG,gBAAgBC,eAAe,gBAAgBC,YAAY,+BAIhFqD,GACJ,EAAAP,EAAAC,MAAAD,EAAAE,SAAA,CAAAC,SAAA,EAAE,EAAAH,EAAAI,KAAA,OAAKC,UAAU,iBAAgBF,UACjC,EAAAH,EAAAI,KAAA,SAAOC,UAAU,QAAOF,UAAC,EAAAH,EAAAI,KAACvD,EAAAyD,iBAAgB,CAACtD,GAAG,eAAeC,eAAe,sBAC1EC,YAAY,+CAEd,EAAA8C,EAAAI,KAAA,OAAKC,UAAU,QAAOF,UACpB,EAAAH,EAAAI,KAAA,SAAOC,UAAU,aAAYF,UAC3B,EAAAH,EAAAI,KAACvD,EAAAyD,iBAAgB,CAACtD,GAAG,gBAAgBC,eAAe,uBAAuBC,YAAY,+BAKvFsD,GAAiB,EAAAR,EAAAI,KAAA,SAAOC,UAAU,aAAYF,UAChD,EAAAH,EAAAI,KAACvD,EAAAyD,iBAAgB,CAACtD,GAAG,YAAYC,eAAe,YAC9CC,YAAY,sCAGZuD,GACJ,EAAAT,EAAAC,MAAAD,EAAAE,SAAA,CAAAC,SAAA,EAAE,EAAAH,EAAAI,KAAA,OAAKC,UAAU,QAAOF,SAAEK,KAC1B,EAAAR,EAAAI,KAAA,OAAKC,UAAU,QAAOF,UACpB,EAAAH,EAAAI,KAACvD,EAAAyD,iBAAgB,CAACtD,GAAG,eAAeC,eAAe,+BACjDC,YAAY,oCAAmCiD,SAC9CO,IAAiB,EAAAV,EAAAI,KAAA,SAAOO,KAAK,QAAQC,YAAaF,EAAcG,aAAa,QAC5E9B,MAAOrB,KAAKC,MAAMG,MAAOgD,SAAUpD,KAAKQ,kBAAmB6C,UAAQ,WAKrEC,GAAiB,EAAAhB,EAAAI,KAAA,SAAOC,UAAU,aAAYF,UAChD,EAAAH,EAAAI,KAACvD,EAAAyD,iBAAgB,CAACtD,GAAG,mBAAmBC,eAAe,mBACvDC,YAAY,iDAGV+D,GACJ,EAAAjB,EAAAC,MAAAD,EAAAE,SAAA,CAAAC,SAAA,EAAE,EAAAH,EAAAI,KAAA,OAAKC,UAAU,QAAOF,SAAEa,KAC1B,EAAAhB,EAAAI,KAAA,OAAKC,UAAU,iBAAgBF,UAC7B,EAAAH,EAAAI,KAACc,EAAAC,EAAS,CACRC,WAAW,EACXC,sBAAuB3D,KAAKF,MAAM6D,sBAClCC,SAAU5D,KAAKS,yBAIfoD,GACJ,EAAAvB,EAAAC,MAAAD,EAAAE,SAAA,CAAAC,SAAA,EAAE,EAAAH,EAAAI,KAAA,OAAKC,UAAU,QAAOF,UACtB,EAAAH,EAAAI,KAAA,SAAOC,UAAU,aAAYF,UAAC,EAAAH,EAAAI,KAACvD,EAAAyD,iBAAgB,CAACtD,GAAG,iCAAiCC,eAAe,oBAC/FC,YAAY,4CAElB,EAAA8C,EAAAI,KAAA,OAAKC,UAAU,QAAOF,UACpB,EAAAH,EAAAI,KAACvD,EAAAyD,iBAAgB,CAACtD,GAAG,mCAAmCC,eAAe,eACrEC,YAAY,uCAAsCiD,SACjDqB,IAAiB,EAAAxB,EAAAI,KAAA,SAAOO,KAAK,OAAOC,YAAaY,EAAcC,UAAW,GAC3E1C,MAAOrB,KAAKC,MAAMC,KAAMkD,SAAUpD,KAAKU,iBAAkB2C,UAAQ,WAKvE,OAAQ,EAAAf,EAAAC,MAAA,QAAMI,UAAU,oBAAoBiB,SAAU5D,KAAKM,aAAamC,SAAA,CACrET,EACuB,SAArBhC,KAAKF,MAAM0B,OAAoBsB,EAAqC,OAArB9C,KAAKF,MAAM0B,OAAkB8B,EAAgB,KAEvE,SAArBtD,KAAKF,MAAM0B,OAAoBa,EAAmC,OAArBrC,KAAKF,MAAM0B,OAAkBqB,EAAc,MAE3F,EAAAP,EAAAI,KAAA,OAAKC,UAAU,iBAAgBF,UAC7B,EAAAH,EAAAI,KAAA,MAAIC,UAAU,SAAQF,SAAEL,MAEzBJ,EACC,KAEsB,SAArBhC,KAAKF,MAAM0B,OAAoBuB,EAAqC,OAArB/C,KAAKF,MAAM0B,OAAkB+B,EAAgB,KAE9FvB,EAAe6B,EAAY,MAC5B,EAAAvB,EAAAC,MAAA,OAAKI,UAAU,iBAAgBF,SAAA,EAC7B,EAAAH,EAAAI,KAAA,UAAQC,UAAU,YAAYqB,QAAShE,KAAKF,MAAMmE,SAASxB,UACzD,EAAAH,EAAAI,KAACvD,EAAAyD,iBAAgB,CAACtD,GAAG,gBAAgBC,eAAe,SAASC,YAAY,uBAE3E,EAAA8C,EAAAI,KAAA,UAAQC,UAAU,UAAUM,KAAK,SAAQR,UACvC,EAAAH,EAAAI,KAACvD,EAAAyD,iBAAgB,CAACtD,GAAG,YAAYC,eAAe,KAAKC,YAAY,uBAIzE,EAGF,IAAA0E,GAAe,EAAA/E,EAAAgF,YAAWzE,uBC9J1B,SAAS0E,EAAMC,EAAKC,GAClB,OAAO,EAAAC,EAAAC,IAAeH,EAAKC,EAC7B,SAEe,MAAMG,UAA4B9E,IAAA+E,UAC/C,WAAA7E,CAAYC,GACVC,MAAMD,GAEN,MAAM6E,EAAK3E,KAAKF,MAAM8E,OAAOC,aAC7B7E,KAAKC,MAAQ,CACX6E,SAAUV,EAAMO,EAAGI,OAASJ,EAAGI,OAAOC,QAAKC,EAAW,IACtDzF,YAAa4E,EAAMO,EAAGI,OAASJ,EAAGI,OAAOG,UAAOD,EAAW,KAC3DE,QAAQ,EAAAC,EAAAC,IAAaV,EAAGI,OAASJ,EAAGI,OAAOO,MAAQ,MACnDC,YAAaZ,EAAGa,kBAAoB,GACpCC,cAAUR,EACVS,QAASf,EAAGgB,QAAU,IAAIC,KAAKC,GAAOA,EAAIC,WAAW,YAAc,IAAIC,UAAU,GAErF,CAEA,iBAAAC,GACE,MAAMrB,EAAK3E,KAAKF,MAAM8E,OAAOC,aAC7BF,EAAGsB,eAAiBC,GAAKlG,KAAKmB,SAAS,CAACoE,YAAaZ,EAAGa,kBAC1D,CAEA,oBAAAW,GACanG,KAAKF,MAAM8E,OAAOC,aAC1BoB,eAAiB,IACtB,CAEA,MAAAlE,GACE,GAAI/B,KAAKC,MAAMwF,SACb,OACE,EAAAnD,EAAAI,KAACwB,EAAc,CACb1C,OAAQxB,KAAKC,MAAMwF,SAASW,KAC5BjE,IAAKnC,KAAKC,MAAMwF,SAAStD,IACzBF,KAAMjC,KAAKC,MAAMwF,SAASxD,KAC1B0B,sBAAuB3D,KAAKF,MAAM6D,sBAClChC,UAAW3B,KAAKF,MAAM6B,UACtBD,cAAe1B,KAAKF,MAAM4B,cAC1BuC,SAAUiC,GAAKlG,KAAKmB,SAAS,CAACsE,cAAUR,IACxCxD,QAASzB,KAAKF,MAAM2B,UAK1B,MAAM4E,EAAY,CAAC,EACnBrG,KAAKC,MAAMsF,YAAYe,QAAQC,IACzBA,EAAKtE,OACPoE,EAAUE,EAAKH,OAASC,EAAUE,EAAKH,OAAS,GAAK,KAIzD,MAAMb,EAAc,GAmCpB,OAlCAvF,KAAKC,MAAMsF,YAAYe,QAAQ,CAACC,EAAMC,KACpC,IAAK,CAAC,QAAS,OAAOC,SAASF,EAAKH,MAElC,OAGF,IAAIjE,EAAMoE,EAAKpE,IACf,GAAiB,OAAboE,EAAKH,KAAe,CACtB,MAAMvF,GAAS,EAAAC,EAAAC,GAAiBwF,EAAKpE,KACrCA,EAAMtB,EAASA,EAAOI,sBAAwBsF,EAAKpE,GACrD,CAEAoD,EAAYmB,MACV,EAAApE,EAAAC,MAAA,OAAKI,UAAU,eAAcF,SAAA,EAC3B,EAAAH,EAAAI,KAAA,MAAIC,UAAU,YAAYqB,QAAS9C,IAAMA,EAAEK,iBAAkBvB,KAAKmB,SAAS,CAACsE,SAAUc,KAAS9D,SAAEN,KACjG,EAAAG,EAAAC,MAAA,QAAAE,SAAA,CAAM,IAAE8D,EAAKtE,KAAO,MAAO,EAAAK,EAAAI,KAAA,KAAGC,UAAU,iBAAgBF,SAAC,YAAY,KACjE8D,EAAKtE,MAAQoE,EAAUE,EAAKH,MAAQ,GAAKpG,KAAKF,MAAM6G,eAAiBJ,EAAKH,MAC1E,EAAA9D,EAAAI,KAAA,KAAGkE,KAAK,IAAI5C,QAAS9C,IAAMA,EAAEK,iBAAkBvB,KAAKF,MAAM+G,aAAaN,EAAKH,KAAMG,EAAKpE,MAAOM,UAC5F,EAAAH,EAAAI,KAAA,KAAGC,UAAU,iBAAgBF,SAAC,aAGlC,UAR+B+D,MAYnCjB,EAAYjB,OAAS,GAEvBiB,EAAYuB,SACV,EAAAxE,EAAAI,KAAA,SAAOC,UAAU,QAAOF,UACtB,EAAAH,EAAAI,KAACvD,EAAAyD,iBAAgB,CAACtD,GAAG,sBAAsBC,eAAe,WACxDC,YAAY,6BAFc,WAOhC,EAAA8C,EAAAC,MAAA,OAAKI,UAAU,mBAAkBF,SAAA,EAC/B,EAAAH,EAAAC,MAAA,OAAKI,UAAU,oBAAmBF,SAAA,EAChC,EAAAH,EAAAC,MAAA,KAAGqE,KAAK,IAAIjE,UAAU,0BAA0BqB,QAAS9C,IAAMA,EAAEK,iBAAkBvB,KAAKF,MAAMiH,WAAW,YAAatE,SAAA,EACpH,EAAAH,EAAAI,KAAA,KAAGC,UAAU,iBAAgBF,SAAC,SAAQ,KACtC,EAAAH,EAAAI,KAACvD,EAAAyD,iBAAgB,CAACtD,GAAG,cAAcC,eAAe,OAAOC,YAAY,8BAEvE,EAAA8C,EAAAI,KAAA,UAAAD,UACE,EAAAH,EAAAI,KAACsE,EAAAvD,EAAY,CACXmB,OAAQ5E,KAAKF,MAAM8E,OACnBO,OAAQnF,KAAKC,MAAMkF,OACnB8B,UAAU,EACVC,IAAKlH,KAAKF,MAAMqH,SAChBC,MAAOpH,KAAKC,MAAM6E,cAEtB,EAAAxC,EAAAC,MAAA,OAAKI,UAAU,QAAOF,SAAA,EACpB,EAAAH,EAAAI,KAAA,SAAOC,UAAU,QAAOF,UACtB,EAAAH,EAAAI,KAACvD,EAAAyD,iBAAgB,CAACtD,GAAG,kBAAkBC,eAAe,YACpDC,YAAY,mCAEhB,EAAA8C,EAAAI,KAAA,OAAKC,UAAU,mBAAkBF,SAAEzC,KAAKC,MAAM6E,eAEhD,EAAAxC,EAAAC,MAAA,OAAKI,UAAU,QAAOF,SAAA,EACpB,EAAAH,EAAAI,KAAA,SAAOC,UAAU,QAAOF,UAAC,EAAAH,EAAAI,KAACvD,EAAAyD,iBAAgB,CAACtD,GAAG,gBAAgBC,eAAe,MAC3EC,YAAY,kCAAwC,KACtD,EAAA8C,EAAAI,KAAA,MAAAD,SAAKzC,KAAKF,MAAMqH,cAEjBnH,KAAKC,MAAMyF,OACZ,EAAApD,EAAAC,MAAA,OAAKI,UAAU,QAAOF,SAAA,EACpB,EAAAH,EAAAI,KAAA,SAAOC,UAAU,QAAOF,UAAC,EAAAH,EAAAI,KAACvD,EAAAyD,iBAAgB,CAACtD,GAAG,cAAcC,eAAe,SACzEC,YAAY,oCAA0C,KACxD,EAAA8C,EAAAC,MAAA,MAAAE,SAAA,CAAI,IAAEzC,KAAKC,MAAMyF,YACV,MACT,EAAApD,EAAAI,KAAA,OAAKC,UAAU,QAAOF,UACpB,EAAAH,EAAAI,KAAC2E,EAAA5D,EAAS,CAAC6D,cAAetH,KAAKF,MAAMwH,kBAEtCtH,KAAKC,MAAMT,aACV,EAAA8C,EAAAC,MAAA,OAAKI,UAAU,QAAOF,SAAA,EACpB,EAAAH,EAAAI,KAAA,SAAOC,UAAU,QAAOF,UACtB,EAAAH,EAAAI,KAACvD,EAAAyD,iBAAgB,CAACtD,GAAG,oBAAoBC,eAAe,cACtDC,YAAY,8CAEhB,EAAA8C,EAAAI,KAAA,OAAKC,UAAU,SAAQF,SAAEzC,KAAKC,MAAMT,iBAC7B,SAEb,EAAA8C,EAAAI,KAAA,OAAKC,UAAU,QACf,EAAAL,EAAAI,KAAA,OAAKC,UAAU,oBAAmBF,UAChC,EAAAH,EAAAI,KAAA,OAAKC,UAAU,QAAOF,SAAE8C,OAE1B,EAAAjD,EAAAI,KAAA,OAAKC,UAAU,QACf,EAAAL,EAAAC,MAAA,OAAKI,UAAU,oBAAmBF,SAAA,EAChC,EAAAH,EAAAC,MAAA,KAAGqE,KAAK,IAAIjE,UAAU,cAAcqB,QAAS9C,IAAMA,EAAEK,iBAAkBvB,KAAKF,MAAMiH,WAAW,gBAAiBtE,SAAA,EAC5G,EAAAH,EAAAI,KAAA,KAAGC,UAAU,iBAAgBF,SAAC,SAAQ,KAAM,EAAAH,EAAAI,KAACvD,EAAAyD,iBAAgB,CAACtD,GAAG,8BAC/DC,eAAe,UAAUC,YAAY,4CAEzC,EAAA8C,EAAAC,MAAA,KAAGqE,KAAK,IAAIjE,UAAU,cAAcqB,QAAS9C,IAAMA,EAAEK,iBAAkBvB,KAAKF,MAAMiH,WAAW,UAAWtE,SAAA,EACtG,EAAAH,EAAAI,KAAA,KAAGC,UAAU,iBAAgBF,SAAC,kBAAiB,KAAM,EAAAH,EAAAI,KAACvD,EAAAyD,iBAAgB,CAACtD,GAAG,oCACxEC,eAAe,gBAAgBC,YAAY,kDAE/C,EAAA8C,EAAAC,MAAA,KAAGqE,KAAK,IAAIjE,UAAU,cAAcqB,QAAS9C,IAAMA,EAAEK,iBAAkBvB,KAAKF,MAAMiH,WAAW,aAActE,SAAA,EACzG,EAAAH,EAAAI,KAAA,KAAGC,UAAU,iBAAgBF,SAAC,aAAY,KAAM,EAAAH,EAAAI,KAACvD,EAAAyD,iBAAgB,CAACtD,GAAG,kBACnEC,eAAe,WAAWC,YAAY,6CAE1C,EAAA8C,EAAAC,MAAA,KAAGqE,KAAK,IAAIjE,UAAU,cAAcqB,QAAS9C,IAAMA,EAAEK,iBAAkBvB,KAAKF,MAAMiH,WAAW,YAAatE,SAAA,EACxG,EAAAH,EAAAI,KAAA,KAAGC,UAAU,iBAAgBF,SAAC,oBAAmB,KAAM,EAAAH,EAAAI,KAACvD,EAAAyD,iBAAgB,CAACtD,GAAG,8BAC1EC,eAAe,UAAUC,YAAY,gDAKjD,+HChKF,MAAMN,GAAW,EAAAqI,EAAAnI,gBAAe,CAC9BoI,uBAAwB,CACtBlI,GAAI,yBACJC,eAAgB,+BAChBC,YAAa,mBAIjB,MAAMiI,UAAkBC,IAAA,cACtB,WAAA7H,CAAYC,GACVC,MAAMD,GAENE,KAAK2H,QAAU,CAAC,EAChBC,EAAetB,QAAQuB,IAAQ7H,KAAK2H,QAAQE,EAAG3H,MAAQ2H,EAAGC,OAE1D,MAAM5H,EAAOJ,EAAMiI,aAAe,KAC5BD,EAAO9H,KAAK2H,QAAQzH,GAE1BF,KAAKC,MAAQ,CACX8H,YAAa7H,EACb8H,SAAUF,EACVG,YAAa,GACbC,kBAAmBlI,KAAKkI,kBAAkBhI,EAAM4H,IAGlD9H,KAAKmI,aAAenI,KAAKmI,aAAa5H,KAAKP,MAC3CA,KAAKoI,eAAiBpI,KAAKoI,eAAe7H,KAAKP,MAC/CA,KAAKqI,cAAgBrI,KAAKqI,cAAc9H,KAAKP,MAC7CA,KAAKsI,oBAAsBtI,KAAKsI,oBAAoB/H,KAAKP,KAC3D,CAEA,YAAAmI,CAAajH,GACX,MAAMqH,EAAS,IAAIvI,KAAKC,MAAM+H,WAC9B,IAAIQ,GAAY,IAAIC,EAAAC,GAAYC,MAAM,GAAGJ,IAASvI,KAAK4I,aAAa1H,EAAEE,OAAOC,UAC7EmH,EAAYA,EAAUzC,UAAUwC,EAAOjE,QAAQuE,OAC/C7I,KAAKmB,SAAS,CAAC8G,YAAaO,GAC9B,CAEA,cAAAJ,CAAelH,GACbA,EAAEK,iBACF,MAAMX,EAAM,GAAGZ,KAAKC,MAAM+H,WAAWhI,KAAKC,MAAMgI,YAAYY,SAASvH,QAAQ,SAAU,IACvF,IAAIT,EAAS,KACb,IACEA,GAAS,EAAAiI,EAAA/H,GAAiB,IAAIH,IAChC,CAAE,MAAOI,GAAM,CAEVH,GAAWA,EAAOkI,WAKvB/I,KAAKgJ,WAAWC,kBAAkB,IAClCjJ,KAAKF,MAAM8D,SAAS/C,EAAOqI,OAAO,WALhClJ,KAAKgJ,WAAWC,kBAAkBjJ,KAAKF,MAAM+B,KAAKC,cAAc5C,EAASsI,wBAM7E,CAGA,aAAAa,CAAcnH,GACE,UAAVA,EAAEiI,KACJnJ,KAAKoI,eAAelH,EAExB,CAEA,mBAAAoH,GACEtI,KAAKF,MAAM6D,sBAAsB3D,KAAKC,MAAM8H,YAAa/H,KAAKC,MAAM+H,SAClE,CAAC9H,EAAM4H,KACH9H,KAAKmB,SAAS,CACZ4G,YAAa7H,EACb8H,SAAUF,EACVI,kBAAmBlI,KAAKkI,kBAAkBhI,EAAM4H,MAG1D,CAGA,YAAAc,CAAa/H,GACX,OAAKA,EAKEA,EAAOS,QAAQ,eAAgB,IAJ7BT,CAKX,CAEA,iBAAAqH,CAAkBhI,EAAM4H,GACtB,MAAMsB,GAAS,EAAAC,EAAAC,GAAiBpJ,EAAMqJ,EAAA9F,GACtC,OAAO2F,EAASA,EAAOnI,sBAAsB8E,UAAU+B,EAAKxD,OAAS,GAAGuE,OAAS,UACnF,CAEA,MAAA9G,GACE,OACE,EAAAyH,EAAAjH,MAAAiH,EAAAhH,SAAA,CAAAC,SAAA,EACE,EAAA+G,EAAAjH,MAAA,QAAMI,UAAU,YAAYqB,QAAShE,KAAKsI,oBAAoB7F,SAAA,EAC5D,EAAA+G,EAAAjH,MAAA,QAAMI,UAAU,eAAcF,SAAA,EAAE,EAAAgH,EAAAC,IAAU1J,KAAKC,MAAM8H,aAAa,OAAa,IAC7E/H,KAAKC,MAAM+H,SAAS,QACxB,EAAAwB,EAAA9G,KAAA,SAAOO,KAAK,MAAM0G,IAAKA,IAAQ3J,KAAKgJ,WAAaW,GAAMzG,YAAalD,KAAKC,MAAMiI,kBAC3E7G,MAAOrB,KAAKC,MAAMgI,YAAa7E,SAAUpD,KAAKmI,aAC9CpE,UAAW,GAAI6F,UAAW5J,KAAKqI,cAAewB,OAAQ7J,KAAKoI,eAC3D/E,UAAQ,EAACK,UAAW1D,KAAKF,MAAM4D,cAGzC,EAGFoG,EAAArG,GAAe,EAAA8D,EAAApD,YAAWsD","sources":["webpack://tinode-webapp/./src/widgets/credential-edit.jsx","webpack://tinode-webapp/./src/views/account-settings-view.jsx","webpack://tinode-webapp/./src/widgets/phone-edit.jsx"],"sourcesContent":["// Enter one credential at a time.\n\nimport React from 'react';\nimport { defineMessages, FormattedMessage, injectIntl } from 'react-intl';\nimport PhoneEdit from './phone-edit.jsx';\nimport { parsePhoneNumber } from 'libphonenumber-js/mobile';\n\nconst messages = defineMessages({\n password_reset_email_sent: {\n id: 'password_reset_email_sent',\n defaultMessage: 'An email with security code has been sent.',\n description: 'Notification that the email with password reset instructions has been sent'\n },\n password_reset_sms_sent: {\n id: 'password_reset_sms_sent',\n defaultMessage: 'A text message with security code has been sent.',\n description: 'Notification that the SMS with password reset instructions has been sent'\n },\n});\n\nclass CredentialEdit extends React.PureComponent {\n constructor(props) {\n super(props);\n\n this.state = {\n code: '',\n tel: '',\n email: '',\n sent: false\n };\n\n this.handleSubmit = this.handleSubmit.bind(this);\n this.handleEmailChange = this.handleEmailChange.bind(this);\n this.handlePhoneChange = this.handlePhoneChange.bind(this);\n this.handleCodeChange = this.handleCodeChange.bind(this);\n }\n\n static formatPhoneNumber(raw) {\n let number;\n try {\n number = parsePhoneNumber(raw);\n } catch (err) {}\n return number ? number.formatInternational() : raw;\n }\n\n handleEmailChange(e) {\n this.setState({email: e.target.value});\n }\n\n handlePhoneChange(number) {\n this.setState({tel: number});\n }\n\n handleCodeChange(e) {\n this.setState({code: e.target.value.replace(/[^\\d]/g, '')});\n }\n\n handleSubmit(e) {\n e.preventDefault();\n const value = this.props.method == 'email' ? this.state.email : this.state.tel;\n if (this.state.code) {\n this.props.onError(null);\n this.props.onCredConfirm(this.props.method, this.state.code);\n } else if (value) {\n this.props.onCredAdd(this.props.method, value);\n this.setState({sent: true});\n const msg = this.props.method == 'email' ? messages.password_reset_email_sent : messages.password_reset_sms_sent;\n this.props.onError(this.props.intl.formatMessage(msg), 'info');\n }\n }\n\n render() {\n const readyForCode = this.state.sent || !this.props.done;\n const rawValue = readyForCode ? (this.state.tel || this.state.email) : this.props.val;\n const formattedValue = this.props.method == 'tel' ? CredentialEdit.formatPhoneNumber(rawValue) : rawValue;\n\n const changeEmail = (\n <> \n \n
\n \n \n \n \n
>);\n\n const changePhone = (\n <>\n \n
\n \n \n \n \n
>\n );\n\n const newEmailLabel = (\n \n );\n\n const newEmailInput = (\n <>{newEmailLabel}
\n \n {\n (email_prompt) => \n } \n
>\n );\n\n const newPhoneLabel = (\n \n );\n\n const newPhoneInput = (\n <>{newPhoneLabel}
\n >\n );\n\n const codeInput = (\n <>\n \n
\n \n {\n (numbers_only) => \n } \n
>\n );\n\n return ();\n }\n}\n\nexport default injectIntl(CredentialEdit);\n","// Edit account parameters.\nimport React from 'react';\nimport { FormattedMessage } from 'react-intl';\nimport { parsePhoneNumber } from 'libphonenumber-js/mobile';\n\nimport AvatarUpload from '../widgets/avatar-upload.jsx';\nimport BadgeList from '../widgets/badge-list.jsx';\nimport CredentialEdit from '../widgets/credential-edit.jsx';\n\nimport { makeImageUrl } from '../lib/blob-helpers.js';\nimport { truncateString } from '../lib/strformat.js';\nimport { MAX_TITLE_LENGTH, MAX_TOPIC_DESCRIPTION_LENGTH } from '../config.js';\n\nfunction _clip(str, length) {\n return truncateString(str, length);\n}\n\nexport default class AccountSettingsView extends React.Component {\n constructor(props) {\n super(props);\n\n const me = this.props.tinode.getMeTopic();\n this.state = {\n fullName: _clip(me.public ? me.public.fn : undefined, MAX_TITLE_LENGTH),\n description: _clip(me.public ? me.public.note : undefined, MAX_TOPIC_DESCRIPTION_LENGTH),\n avatar: makeImageUrl(me.public ? me.public.photo : null),\n credentials: me.getCredentials() || [],\n credEdit: undefined,\n alias: ((me.tags() || []).find(tag => tag.startsWith('alias:')) || '').substring(6),\n };\n }\n\n componentDidMount() {\n const me = this.props.tinode.getMeTopic();\n me.onCredsUpdated = _ => this.setState({credentials: me.getCredentials()});\n }\n\n componentWillUnmount() {\n const me = this.props.tinode.getMeTopic();\n me.onCredsUpdated = null;\n }\n\n render() {\n if (this.state.credEdit) {\n return (\n this.setState({credEdit: undefined})}\n onError={this.props.onError} />\n );\n }\n\n // Count how many times each method is validated.\n const validated = {};\n this.state.credentials.forEach(cred => {\n if (cred.done) {\n validated[cred.meth] = (validated[cred.meth] || 0) + 1;\n }\n });\n\n const credentials = [];\n this.state.credentials.forEach((cred, idx) => {\n if (!['email', 'tel'].includes(cred.meth)) {\n // Skip unknown methods.\n return ;\n }\n\n let val = cred.val\n if (cred.meth == 'tel') {\n const number = parsePhoneNumber(cred.val);\n val = number ? number.formatInternational() : cred.val;\n }\n\n credentials.push(\n );\n });\n if (credentials.length > 0) {\n // Add title as the first element.\n credentials.unshift(\n \n \n );\n }\n\n return (\n \n );\n }\n};\n","// Editor for a phone number.\n\nimport React from 'react';\nimport { defineMessages, injectIntl } from 'react-intl';\nimport { AsYouType, getExampleNumber, parsePhoneNumber } from 'libphonenumber-js/mobile';\nimport examples from 'libphonenumber-js/mobile/examples'\n\nimport * as dcodes from '../dcodes.json';\nimport { flagEmoji } from '../lib/strformat';\n\nconst messages = defineMessages({\n mobile_number_required: {\n id: 'mobile_number_required',\n defaultMessage: 'Mobile phone number required',\n description: 'Error message'\n }\n});\n\nclass PhoneEdit extends React.PureComponent {\n constructor(props) {\n super(props);\n\n this.codeMap = {};\n dcodes.default.forEach(dc => { this.codeMap[dc.code] = dc.dial; });\n\n const code = props.countryCode || 'US';\n const dial = this.codeMap[code];\n\n this.state = {\n countryCode: code,\n dialCode: dial,\n localNumber: '',\n placeholderNumber: this.placeholderNumber(code, dial)\n };\n\n this.handleChange = this.handleChange.bind(this);\n this.handleFinished = this.handleFinished.bind(this);\n this.handleKeyDown = this.handleKeyDown.bind(this);\n this.showCountrySelector = this.showCountrySelector.bind(this);\n }\n\n handleChange(e) {\n const prefix = `+${this.state.dialCode}`;\n let formatted = new AsYouType().input(`${prefix}${this.filterNumber(e.target.value)}`);\n formatted = formatted.substring(prefix.length).trim();\n this.setState({localNumber: formatted});\n }\n\n handleFinished(e) {\n e.preventDefault();\n const raw = `${this.state.dialCode}${this.state.localNumber.trim()}`.replace(/[^\\d]/g, '');\n let number = null;\n try {\n number = parsePhoneNumber(`+${raw}`);\n } catch (err) {}\n\n if (!number || !number.isValid()) {\n this.inputField.setCustomValidity(this.props.intl.formatMessage(messages.mobile_number_required));\n return;\n }\n\n this.inputField.setCustomValidity('');\n this.props.onSubmit(number.format('E.164'));\n }\n\n\n handleKeyDown(e) {\n if (e.key === 'Enter') {\n this.handleFinished(e);\n }\n }\n\n showCountrySelector() {\n this.props.onShowCountrySelector(this.state.countryCode, this.state.dialCode,\n (code, dial) => {\n this.setState({\n countryCode: code,\n dialCode: dial,\n placeholderNumber: this.placeholderNumber(code, dial)\n })\n });\n }\n\n // Filter out characters not permitted in a phone number.\n filterNumber(number) {\n if (!number) {\n return number;\n }\n // Leave numbers, space, (, ), -, and .\n // The + is not allowed: it's handled by the country code portion.\n return number.replace(/[^-\\s().\\d]/g, '');\n }\n\n placeholderNumber(code, dial) {\n const sample = getExampleNumber(code, examples);\n return sample ? sample.formatInternational().substring(dial.length + 1).trim() : '123 0123';\n }\n\n render() {\n return (\n <>\n \n {flagEmoji(this.state.countryCode)} \n +{this.state.dialCode} \n {this.inputField = ref}} placeholder={this.state.placeholderNumber}\n value={this.state.localNumber} onChange={this.handleChange}\n maxLength={17} onKeyDown={this.handleKeyDown} onBlur={this.handleFinished}\n required autoFocus={this.props.autoFocus} />\n >\n );\n }\n}\n\nexport default injectIntl(PhoneEdit);\n"],"names":["messages","external_ReactIntl_","defineMessages","password_reset_email_sent","id","defaultMessage","description","password_reset_sms_sent","CredentialEdit","external_React_default","PureComponent","constructor","props","super","this","state","code","tel","email","sent","handleSubmit","bind","handleEmailChange","handlePhoneChange","handleCodeChange","formatPhoneNumber","raw","number","parsePhoneNumberWithError","L","err","formatInternational","e","setState","target","value","replace","preventDefault","method","onError","onCredConfirm","onCredAdd","msg","intl","formatMessage","render","readyForCode","done","rawValue","val","formattedValue","changeEmail","jsx_runtime","jsxs","Fragment","children","jsx","className","FormattedMessage","changePhone","newEmailLabel","newEmailInput","email_prompt","type","placeholder","autoComplete","onChange","required","newPhoneLabel","newPhoneInput","phone_edit","A","autoFocus","onShowCountrySelector","onSubmit","codeInput","numbers_only","maxLength","onClick","onCancel","credential_edit","injectIntl","_clip","str","length","strformat","W5","AccountSettingsView","Component","me","tinode","getMeTopic","fullName","public","fn","undefined","note","avatar","blob_helpers","to","photo","credentials","getCredentials","credEdit","alias","tags","find","tag","startsWith","substring","componentDidMount","onCredsUpdated","_","componentWillUnmount","meth","validated","forEach","cred","idx","includes","push","reqCredMethod","href","onCredDelete","unshift","onNavigate","avatar_upload","readOnly","uid","myUserId","title","badge_list","trustedBadges","react_intl__WEBPACK_IMPORTED_MODULE_1__","mobile_number_required","PhoneEdit","react__WEBPACK_IMPORTED_MODULE_0___default","codeMap","_dcodes_json__WEBPACK_IMPORTED_MODULE_6__","dc","dial","countryCode","dialCode","localNumber","placeholderNumber","handleChange","handleFinished","handleKeyDown","showCountrySelector","prefix","formatted","libphonenumber_js_mobile__WEBPACK_IMPORTED_MODULE_3__","Q","input","filterNumber","trim","libphonenumber_js_mobile__WEBPACK_IMPORTED_MODULE_2__","isValid","inputField","setCustomValidity","format","key","sample","libphonenumber_js_mobile__WEBPACK_IMPORTED_MODULE_4__","a","libphonenumber_js_mobile_examples__WEBPACK_IMPORTED_MODULE_5__","react_jsx_runtime__WEBPACK_IMPORTED_MODULE_8__","_lib_strformat__WEBPACK_IMPORTED_MODULE_7__","lb","ref","onKeyDown","onBlur","__webpack_exports__"],"sourceRoot":""}
\ No newline at end of file
diff --git a/umd/index.prod.js.LICENSE.txt b/umd/index.prod.js.LICENSE.txt
new file mode 100644
index 00000000..78e41bd6
--- /dev/null
+++ b/umd/index.prod.js.LICENSE.txt
@@ -0,0 +1,128 @@
+/**
+ * @license
+ * Copyright 2017 Google LLC
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/**
+ * @license
+ * Copyright 2019 Google LLC
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/**
+ * @license
+ * Copyright 2020 Google LLC
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/**
+ * @license
+ * Copyright 2021 Google LLC
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/**
+ * @license
+ * Copyright 2022 Google LLC
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/**
+ * @license
+ * Copyright 2023 Google LLC
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/**
+ * @license
+ * Copyright 2025 Google LLC
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/**
+ * @license React
+ * react-jsx-runtime.production.min.js
+ *
+ * Copyright (c) Facebook, Inc. and its affiliates.
+ *
+ * This source code is licensed under the MIT license found in the
+ * LICENSE file in the root directory of this source tree.
+ */