diff --git a/css/base.css b/css/base.css index 03e31055..3ad6a01a 100644 --- a/css/base.css +++ b/css/base.css @@ -625,17 +625,21 @@ i.search { display: flex; background-color: #fff9c4; border-bottom: 1px solid #fff59d; - color: #607d8b; + color: #6d4c41; +} +.alert-box.info { + display: flex; + background-color: #e1f5fe; + border-bottom: 1px solid #4fc3f7; + color: #0288d1; } .alert-box .cancel .material-icons { font-size: 1rem; + color: #757575; } .alert-box.error .cancel .material-icons { color: #b71c1c; } -.alert-box.warning .cancel .material-icons { - color: #757575; -} .alert-box .icon { display: block; margin-right: 0.5rem; @@ -649,7 +653,9 @@ i.search { .alert-box.error .icon .material-icons { color: #ef5350; } - +.alert-box.info .icon .material-icons { + color: #0288d1; +} /* List of contacts */ .flex-column { display: flex; diff --git a/css/base.min.css b/css/base.min.css index a706725c..27858431 100644 --- a/css/base.min.css +++ b/css/base.min.css @@ -1 +1 @@ -*{box-sizing:border-box;font-family:Roboto,Arial,sans-serif;margin:0;padding:0;text-rendering:optimizeLegibility}body,html{background-color:silver;box-shadow:inset 0 10rem #3949ab;color:#666;font-size:10pt;height:100%;overflow:hidden;width:100%}tt{font-family:Roboto Mono,Courier,monospace}a{color:#2196f3;text-decoration:none}a:focus,a:hover{color:#0a6ebd;text-decoration:underline}a.red:focus,a.red:hover{color:#f44336}a.flat-button{align-items:center;display:flex;font-weight:400;height:2em;line-height:2em;margin:.15rem .35rem;text-align:center;text-transform:uppercase;touch-action:manipulation;vertical-align:middle;white-space:nowrap}a.flat-button:focus,a.flat-button:hover{text-decoration:none}form{line-height:1.5;padding:.5rem .75rem}form,label{font-size:1.1rem}label{margin-right:auto}label.small{color:#1e88e5;font-size:.95rem}img.avatar{border-radius:50%;height:100%;width:100%}button{border:1px solid transparent;border-radius:2px;box-shadow:0 2px 5px 0 rgba(0,0,0,.25);cursor:pointer;display:inline-block;font-family:inherit;font-size:1.1rem;font-weight:400;height:2.2em;line-height:2.2em;padding-left:2rem;padding-right:2rem;text-align:center;text-transform:uppercase;touch-action:manipulation;vertical-align:middle;white-space:nowrap}button[disabled],html input[disabled]{box-shadow:none;cursor:default;opacity:.65}button.round{border-radius:50%;box-shadow:0 2px .5rem 0 rgba(0,0,0,.25);height:3rem;line-height:3.5rem;margin:0;outline:none;padding:0;width:3rem;z-index:2}button.round.small{box-shadow:0 2px .35rem 0 rgba(0,0,0,.25);height:2rem;line-height:2rem;width:2rem}button:active,button:focus,button:hover{color:#fff}button:active{box-shadow:inset 0 3px .5rem rgba(0,0,0,.125)}button:active.round.small{box-shadow:inset 0 2px .35rem rgba(0,0,0,.125)}button.blue{background-color:#1e88e5;color:#fff}button.blue:active,button.blue:focus,button.blue:hover{background-color:#1976d2}button.white{background-color:#fff;color:#2196f3}button.blue:active,button.white:focus,button.white:hover{background-color:#e3f2fd}input,textarea{background:transparent;border:none;color:#666;font-family:inherit;font-size:1.1rem;margin:.25rem 0;outline:none;padding:0 .125rem}textarea{resize:none}input[type=email],input[type=password],input[type=search],input[type=text],textarea{border-bottom:1px solid #ccc;box-shadow:0 1px 0 rgba(0,0,0,.1);height:2.5rem;transition:all .1s ease-in-out}input[type=email],input[type=password],input[type=text],textarea{width:100%}input[type=email]:focus,input[type=password]:focus,input[type=search]:focus,input[type=text]:focus,textarea:focus{border-bottom:1px solid #2196f3;box-shadow:0 1px 0 rgba(33,150,243,.25)}input[type=email]::placeholder,input[type=password]::placeholder,input[type=search]::placeholder,input[type=text]::placeholder,textarea::placeholder{color:#bbb}input[type=password].with-visibility,input[type=text].with-visibility{margin-right:-2rem;padding-right:2rem}::-webkit-scrollbar{width:.6rem}::-webkit-scrollbar-track{-webkit-box-shadow:inset 0 0 6px rgba(0,0,0,.2);background-color:hsla(0,0%,100%,.1)}::-webkit-scrollbar-thumb{background-color:rgba(0,0,0,.3)}ul.menu{background-color:#fff;border-radius:.2rem;box-shadow:0 1px 6px rgba(0,0,0,.45);list-style:none;padding-bottom:.35rem;padding-top:.35rem;position:absolute;width:12rem;z-index:4}ul.menu>li{padding:.75rem .75rem .75rem 1.25rem}ul.menu>li:hover{background-color:#f5f5f5}ul.menu>li.separator{height:1px;margin:2px;padding:0}ul.menu>li.separator,ul.menu>li.separator:hover{background-color:#ccc}li .menuTrigger{border-radius:.6rem;height:1.2rem;line-height:1.2rem;opacity:0;position:absolute;right:.25rem;text-align:center;top:.25rem;width:1.5rem}li:hover .menuTrigger{opacity:1}li:hover .menuTrigger a{color:#757575}li.left:hover .menuTrigger{-text-shadow:#c5e1a5 0 0 15px,#c5e1a5 0 0 5px;background-image:radial-gradient(#c5e1a5 40%,transparent 75%)}li.right:hover .menuTrigger{-text-shadow:#fafafa 0 0 15px,#fafafa 0 0 5px;background-image:radial-gradient(#fafafa 40%,transparent 75%)}.blue{color:#2196f3}.red{color:#d32f2f}.gray{color:#757575}.light-gray{color:#bbb}.small{font-size:90%}.hr{background-color:#f0f0f0;box-shadow:inset 0 .25rem .25rem -.25rem rgba(0,0,0,.15),inset 0 -.25rem .25rem -.25rem rgba(0,0,0,.15);display:block;height:.6rem;min-height:.3rem;width:100%}.group-focus{outline:none}#mountPoint{height:100%;padding-bottom:3rem;padding-top:1rem}#noscript-alertbox{background-color:#fff;border-radius:.25rem;box-shadow:1px 2px .3rem grey;display:flex;flex-direction:column;margin-left:auto;margin-right:auto;margin-top:5rem;max-width:30rem;overflow:hidden;position:relative}#noscript-title{background-color:#2196f3;color:#bbdefb;font-size:120%;font-weight:bolder;padding:1rem}#noscript-content{padding:1rem}#app-container{background-color:#fff;border-radius:.25rem;box-shadow:1px 2px .3rem grey;margin-left:auto;margin-right:auto;max-width:80rem;overflow:hidden}#app-container,#sidepanel{display:flex;height:100%;position:relative}#sidepanel{flex-direction:column;flex-grow:0;flex-shrink:0.3;min-width:18rem;width:24rem}#topic-view{width:100%}#info-view,#topic-view{display:flex;flex-direction:column;height:100%}#info-view{flex-grow:0;flex-shrink:0.3;min-width:18rem;width:24rem}@media (max-width:960px){#mountPoint{padding:0}}@media (max-width:640px){#app-container{border-radius:0;box-shadow:none;width:100%}#info-view,#sidepanel{width:100%}}.center-medium-text{align-items:center;display:flex;font-size:1.4rem;height:100%;justify-content:center;text-align:center;width:100%}.nodisplay{display:none!important}.quoted{margin-left:1.5rem}.in-place-edit{border-bottom:1px dashed #ddd;cursor:pointer;display:inline-block;font-family:inherit;font-size:1.1rem;height:2.5rem;line-height:2.25;margin:.25rem .125rem;vertical-align:baseline;width:100%}.in-place-edit.disabled{border-bottom:none;cursor:default}.in-place-edit.placeholder{color:#bbb}.in-place-edit .content{display:block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}table.permission-editor{width:100%}table.permission-editor td{font-size:1.1rem;margin:.35rem 0;vertical-align:middle}table.permission-editor td.checkbox{color:#999;text-align:center}.permission-editor .material-icons{font-size:1.1rem;line-height:1.1rem}.material-icons.clickable{border-bottom:none;cursor:pointer}.clickable{border-bottom:1px dashed #ddd;cursor:pointer}.panel-title{font-size:1.4rem;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.caption-panel{align-items:center;box-shadow:0 1px 2px grey;display:flex;flex:none;height:4rem;padding:.5rem;white-space:nowrap;z-index:1}.dialog-buttons{display:flex;justify-content:flex-end;padding:.5rem}.dialog-buttons button{margin:0 .5rem}.avatar-box{flex-grow:0;flex-shrink:0;position:relative}#side-caption-panel{background-color:#2196f3;color:#bbdefb}#side-caption-panel a{color:#bbdefb;line-height:1;padding-left:.5rem}#side-caption-panel :hover{color:#fff}#sidepanel-title{margin-left:.5rem;margin-right:auto}#self-avatar{border-radius:50%;flex:none;height:3rem;min-width:3rem;width:3rem}#self-avatar.avatar-box{font-size:1.8rem}#settings-form ul{list-style:none}#settings-form li{vertical-align:middle}#settings-form label{display:inline-block;padding-left:.5rem}input.search{text-indent:1.4rem}i.search{left:.6rem;position:absolute}.alert-box{display:none;overflow:hidden;padding:1rem 1.5rem 1rem .5rem;position:relative}.alert-box .cancel{position:absolute;right:.25rem;top:.5rem}.alert-box.error{background-color:#ffcdd2;border-bottom:1px solid #ffbfc8;color:#b71c1c;display:flex}.alert-box.warning{background-color:#fff9c4;border-bottom:1px solid #fff59d;color:#607d8b;display:flex}.alert-box .cancel .material-icons{font-size:1rem}.alert-box.error .cancel .material-icons{color:#b71c1c}.alert-box.warning .cancel .material-icons{color:#757575}.alert-box .icon{display:block;margin-right:.5rem}.alert-box .icon .material-icons{font-size:1.5rem}.alert-box.warning .icon .material-icons{color:#fbc02d}.alert-box.error .icon .material-icons{color:#ef5350}.flex-column{display:flex;flex-direction:column;height:100%;overflow:hidden}.scrollable-panel{height:100%;margin-bottom:auto;margin-top:.25rem;overflow-y:auto}.contact-box{list-style:none;overflow-x:hidden}.contact-box>li{border-bottom:1px solid #eee;border-collapse:collapse;display:flex;flex-grow:0;flex-shrink:0;min-height:3.5rem;overflow-x:hidden;padding:.35rem .25rem .5rem .35rem;position:relative}.contact-box>li:hover{background-color:#eceff1}.contact-box>li.selected{background-color:#cfd8dc}.contact-box .text-box{overflow-x:hidden}.contact-box .contact-title{font-size:1.05rem;overflow:hidden;text-overflow:ellipsis}.contact-box .contact-comment{font-weight:lighter;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.contact-box .avatar-box{font-size:1.8rem;height:3rem;margin-right:.35rem;min-height:3rem;min-width:3rem;overflow:hidden;padding:0;position:relative;width:3rem}.contact-box .avatar{border-radius:50%;height:3rem;width:3rem}.contact-box .avatar-box>.material-icons{height:3rem;width:3rem}.contact-box .avatar-box>.material-icons,.contact-box .text-box{display:flex;flex-direction:column;justify-content:space-around}.avatar-box .online,.offline{border-radius:50%;bottom:.1rem;display:inline-block;flex-shrink:0;height:.75rem;min-height:.75rem;min-width:.75rem;position:absolute;right:0;width:.75rem}.avatar-box .online{background-color:#4caf50}.avatar-box .offline{background-color:silver}.online.typing{animation:typing .5s infinite}@keyframes typing{0%,to{transform:translateX(0)}50%{transform:translateX(-.3rem)}}.contact-box .checkmark.material-icons{background-color:#fff;border:0 solid transparent;bottom:.05rem;color:#0097a7;display:inline-block;font-size:1.5rem;height:1.5rem;line-height:1.5rem;overflow:visible;position:absolute;right:.05rem;width:1.5rem}#add-topic{bottom:1rem;position:absolute;right:1rem}.panel-form{display:flex;flex-direction:column;padding:0}.panel-form-row{align-items:center;justify-content:flex-start}.panel-form-column,.panel-form-row{display:flex;flex-grow:0;flex-shrink:0;line-height:1.5;padding:.5rem .75rem}.panel-form-column{flex-direction:column}.panel-form-column>.panel-form-column,.panel-form-row>.panel-form-column{flex-grow:1;padding:0!important}.panel-form-column>.panel-form-row,.panel-form-row>.panel-form-row{padding:0!important}.avatar-upload{display:flex;flex-direction:column;flex-shrink:0;font-size:4.5rem;height:9rem;margin-left:.5rem;padding:0;width:7rem}.avatar-upload .avatar-box{height:7rem;position:relative;width:7rem}.avatar-upload .avatar-box>.material-icons{font-size:4rem;height:7rem;line-height:7rem;position:relative;vertical-align:middle;width:7rem}.avatar-upload:after{clear:both;content:".";display:block;height:0;visibility:hidden}.avatar-upload .blank{border:1px dashed #999;border-radius:50%;color:#999;flex-shrink:0;font-size:1rem;height:7rem;line-height:7rem;overflow:hidden;text-align:center;vertical-align:middle;width:7rem}.avatar-upload .preview{border-radius:50%;height:7rem;overflow:hidden;width:7rem}.avatar-upload .inputfile.hidden{height:.1px;opacity:0;overflow:hidden;position:absolute;width:.1px}.avatar-upload .inputfile+label.round{align-items:center;background-color:#fafafa;border-radius:50%;bottom:0;box-shadow:0 1px 4px rgba(0,0,0,.4);cursor:pointer;display:flex;height:3rem;justify-content:center;line-height:3rem;margin-left:auto;margin-right:auto;margin-top:-1rem;width:3rem}.avatar-upload .inputfile:focus+label.round{outline:none}.avatar-upload .inputfile+label:hover,.avatar-upload .inputfile:focus+label{background-color:#e3f2fd;color:#42a5f5}#topic-view{position:relative}#topic-caption-panel{background-color:#b0bec5}#topic-caption-panel a{color:#757575;text-decoration:none}#topic-caption-panel :hover{color:#000}#topic-caption-panel .avatar-box{font-size:1.8rem;height:3rem;margin-right:.35rem;min-width:3rem;position:relative;width:3rem}#hide-message-view{display:block;margin-right:.35rem}#topic-users{margin-left:auto;margin-right:1rem}#topic-users .avatar-box{display:inline-block;font-size:1rem;height:1.8rem;margin-right:.2rem;min-height:1.8rem;min-width:1.8rem;width:1.8rem}#messages-panel{background-color:#eceff1;background-image:url(../img/ignasi_pattern_s.png);height:100%;overflow-y:scroll;padding:.75rem;position:relative}#messages-container{height:100%;overflow-y:hidden;position:relative}#write-only-background{background-image:repeating-linear-gradient(45deg,hsla(0,0%,100%,.5),hsla(0,0%,100%,.5) .5rem,hsla(0,0%,100%,.8) 0,hsla(0,0%,100%,.8) 1rem);height:100%;left:0;position:absolute;top:0;width:100%}#write-only-note{background-color:#fff;box-shadow:.1rem .1rem .1rem rgba(0,0,0,.2);color:#666;height:auto;left:50%;line-height:2rem;padding:.25rem 1.5rem;position:absolute;text-align:center;top:50%;transform:translate(-50%,-50%);width:auto}#send-message-panel{align-items:center;background-color:#eceff1;box-shadow:0 -1px rgba(0,0,0,.1);display:flex;flex:none;height:4rem;padding:.4rem .4rem .4rem .6rem;z-index:2}#sendMessage{overflow:hidden;overflow-wrap:break-word}#send-message-panel .material-icons{min-width:1.75rem}#send-message-panel .material-icons.secondary,.material-icons.disabled{color:#999!important}#send-message-panel .material-icons.secondary:hover{color:#2196f3!important}#dummy-view{align-items:center;background-color:#e0f7fa;display:flex;height:100%;justify-content:center;width:100%}#dummy-view a{display:block;text-align:center;text-decoration:none;vertical-align:middle}#image-preview{background-color:hsla(0,0%,100%,.9);display:flex;flex-direction:column;height:100%;left:0;position:absolute;top:0;width:100%;z-index:2}#image-preview-caption-panel{background-color:transparent;display:flex;height:3.5rem;justify-content:space-between;line-height:2.5rem;padding:1rem .75rem 0}#image-preview-caption-panel a{color:#757575;text-decoration:none}#image-preview-caption-panel a:hover{color:#000}#image-preview-container{margin:auto;overflow:hidden}#image-preview-footer{background-color:transparent;display:flex;height:3.2rem;justify-content:space-around;line-height:1.5rem}.chat-box{list-style:none;margin:0 .5rem;padding:0 0 3.5rem}.chat-box.group{margin-left:-.4rem}.chat-box li{align-items:flex-end;display:flex;margin:0;overflow:hidden;padding:0}.chat-box .right{justify-content:flex-end}.chat-box .bubble{border-radius:.5rem;display:flex;height:auto;margin:0;max-width:40rem;min-width:12rem;padding:.75rem .5rem .75rem 1.25rem;position:relative;text-align:left}.chat-box li.single{margin-bottom:.75rem;margin-top:.25rem}.chat-box li.first{margin-bottom:.15rem;margin-top:.25rem}.chat-box li.middle{margin-bottom:.15rem;margin-top:.15rem}.chat-box li.last{margin-bottom:.75rem;margin-top:.15rem}.chat-box .left .bubble{background-color:#c5e1a5}.chat-box .right .bubble{background-color:#fafafa}.chat-box .left .tip:before{color:#c5e1a5;left:-10px;right:auto}.chat-box .left .tip:before,.chat-box .right .tip:before{border:10px solid transparent;border-bottom-color:currentColor;bottom:0;content:"";height:0;position:absolute;top:auto;width:0}.chat-box .right .tip:before{color:#fafafa;display:flex;justify-content:space-between;left:auto;right:-10px}.chat-box .avatar-box{font-size:.8rem;height:1.4rem;margin-bottom:.8rem;margin-right:.8rem;min-height:1.4rem;min-width:1.4rem;position:relative;width:1.4rem}.chat-box .bubble div.message-content{color:#212121;margin:0;max-width:36rem;overflow-wrap:break-word}.chat-box .bubble div.message-content:after{clear:both;content:".";display:block;height:0;visibility:hidden}.chat-box .timestamp{color:#777;display:inline-block;float:right;font-size:80%;padding-left:1rem;position:relative;top:.5rem;white-space:nowrap}.chat-box .typing{border-radius:.5rem;color:#aaa;display:inline-block;margin-top:.75rem;padding:.25rem .35rem;text-align:center;vertical-align:middle;width:2rem}.chat-box .author{color:#777;font-size:80%}.inline-image{border-radius:.1rem;cursor:pointer;display:block;max-height:24rem;max-width:36rem;overflow:hidden}.attachment{display:flex}.attachment:last-of-type{margin-bottom:-.45rem}#info-caption-panel{background-color:#b0bec5}#info-caption-panel a{color:#757575;line-height:1;text-decoration:none}#info-caption-panel :hover{color:#000}#info-title{margin-right:auto}#group-manager{display:flex;flex-direction:column;height:100%;position:relative}#group-manager-buttons{background-color:#eceff1;border-left:1px solid #ccc;box-shadow:0 -1px rgba(0,0,0,.1);display:flex;height:4rem;justify-content:space-around;padding:.4rem;z-index:2}.dialog-overlay{background-color:hsla(0,0%,100%,.9);height:100%;left:0;position:absolute;top:0;width:100%;z-index:10}.dialog-overlay,.modal-dialog{display:flex;flex-direction:column}.modal-dialog{background-color:#fff;border-radius:.3rem;box-shadow:0 .5rem 1rem 0 rgba(0,0,0,.25);justify-content:space-between;margin:auto;min-height:16rem;min-width:24rem}.modal-dialog .title-panel{display:flex;font-size:1.4rem;justify-content:space-between;padding:1rem}.modal-dialog .body-panel{margin:auto .5rem}.modal-dialog .dialog-buttons{background-color:#fafafa;border-top:1px solid #f5f5f5}.modal-dialog .dialog-buttons a{display:inline-block;font-size:1.1rem;padding:.35rem 1.5rem;text-decoration:none;text-transform:uppercase}ul.tabbar{background:#eee;flex-grow:0;flex-shrink:0;list-style:none;margin:0;overflow:hidden;padding:0 0 0 1rem;width:100%}ul.tabbar>li{float:left}ul.tabbar>li>a{box-shadow:inset 0 -2px 2.5px -1px rgba(0,0,0,.25);color:rgba(33,150,243,.6);display:block;font-size:1.3rem;font-variant:small-caps;font-weight:400;line-height:2rem;overflow:hidden;padding-left:1rem;padding-right:1rem;padding-top:.75rem;position:relative;text-align:center;text-decoration:none}ul.tabbar li.active>a{color:#2196f3}ul.tabbar li.active>a:after{animation:tabbar-border-expand .2s cubic-bezier(.4,0,.4,1) 0s alternate forwards;background:#2196f3;bottom:0;content:"";display:block;height:.15rem;left:0;position:absolute}@keyframes tabbar-border-expand{0%{opacity:0;width:0}to{opacity:1;width:100%}}.unread{background-color:#0097a7;border-radius:50%;color:#fff;font-weight:bolder;height:1.35rem;line-height:1.35rem;margin-left:.5rem;text-align:center;vertical-align:middle;width:1.35rem}.badge,.unread{display:inline-block;font-size:.75rem}.badge{align-self:flex-start;background-color:#eee;border:1px solid #666;border-radius:.15rem;color:#666;font-family:Roboto Mono,Courier,monospace,sans-serif;margin-bottom:.1rem;margin-left:.1rem;margin-right:.1rem;padding:0 .15rem}.badge.green{background-color:#efe;border-color:#383;color:#383}.badge.yellow{background-color:#ffe;border-color:#660;color:#660}.badge.blue{background-color:#eef;border-color:#339;color:#339}.badge.red{background-color:#fee;border-color:#933;color:#933}.badge.magenta{background-color:#fef;border-color:#939;color:#939}.lettertile{border-radius:50%;padding-bottom:100%;width:100%}.lettertile>div{align-items:center;border-radius:50%;bottom:0;color:hsla(0,0%,98%,.8);display:flex;flex-grow:0;flex-shrink:0;justify-content:center;left:0;line-height:1;position:absolute;right:0;text-align:center;text-transform:uppercase;top:0}.lettertile:hover{color:#fff}.lettertile.color0{background-color:#ef9a9a}.lettertile.color1{background-color:#90caf9}.lettertile.color2{background-color:#b0bec5}.lettertile.color3{background-color:#b39ddb}.lettertile.color4{background-color:#ffab91}.lettertile.color5{background-color:#a5d6a7}.lettertile.color6{background-color:#eee}.lettertile.color7{background-color:#e6ee9c}.lettertile.color8{background-color:#c5e1a5}.lettertile.color9{background-color:#f0e57d}.lettertile.color10{background-color:#f48fb1}.lettertile.color11{background-color:#9fa8da}.lettertile.color12{background-color:#ffe082}.lettertile.color13{background-color:#bcaaa4}.lettertile.color14{background-color:#80deea}.lettertile.color15{background-color:#ce93d8}.lettertile.dark-color0{background-color:#c62828}.lettertile.dark-color1{background-color:#ad1457}.lettertile.dark-color2{background-color:#6a1b9a}.lettertile.dark-color3{background-color:#4527a0}.lettertile.dark-color4{background-color:#283593}.lettertile.dark-color5{background-color:#1565c0}.lettertile.dark-color6{background-color:#0277bd}.lettertile.dark-color7{background-color:#00838f}.lettertile.dark-color8{background-color:#00695c}.lettertile.dark-color9{background-color:#2e7d32}.lettertile.dark-color10{background-color:#558b2f}.lettertile.dark-color11{background-color:#9e9d24}.lettertile.dark-color12{background-color:#f9a825}.lettertile.dark-color13{background-color:#ff8f00}.lettertile.dark-color14{background-color:#ef6c00}.lettertile.dark-color15{background-color:#d84315}.material-icons{font-size:1.4rem;line-height:1;text-align:center;vertical-align:middle}.material-icons.small{font-size:1rem}.material-icons.big{font-size:2.4rem}#self-avatar.material-icons,.avatar-box .material-icons{font-size:2.4rem;height:3rem;line-height:3rem;width:3rem}.avatar-box .material-icons{background-color:silver;border-radius:50%;color:hsla(0,0%,98%,.8)}.chip-input{align-items:center;background:transparent;border-bottom:1px solid #ccc;box-shadow:0 1px 0 rgba(0,0,0,.1);color:#666;cursor:text;display:flex;flex-grow:1;flex-wrap:wrap;font-size:1.1rem;font-weight:400;justify-content:flex-start;margin:.25rem 0;max-height:10rem;min-height:4rem;outline:none;overflow-y:scroll;text-align:center;transition:all .1s ease-in-out}.chip-input.focused{border-bottom:1px solid #2196f3;box-shadow:0 1px 0 rgba(33,150,243,.25)}.chip-input>input[type=text]{border:none;box-shadow:none;display:inline-block;flex:1 0 auto;min-width:4rem;width:auto}.chip,.chip-input>input[type=text]{height:1.8rem;line-height:1.8;margin:.125rem}.chip{align-items:center;background-color:#eee;border-radius:.9rem;display:flex;flex:0 0 auto;font-size:90%;white-space:nowrap}.chip>a{background-color:#aaa;border-radius:50%;color:#ccc;display:inline-block;height:1.175rem;line-height:1.15;margin:.3rem;text-decoration:none;width:1.175rem}.chip>a:focus,.chip>a:hover{background-color:#bbb;color:#ddd;text-decoration:none}.chip .avatar-box{font-size:1rem;height:1.8rem;margin-right:.2rem;min-height:1.8rem;min-width:1.8rem;position:relative;width:1.8rem}.chip .avatar-box .material-icons{font-size:1.8rem}.chip .spacer{display:inline-block;height:1.175rem;margin:.3rem;width:.25rem}.load-spinner-box{background-color:#fff;border-radius:50%;box-shadow:.1rem .1rem .15rem 1px rgba(0,0,0,.25);height:2.5rem;left:0;margin-left:auto;margin-right:auto;padding:.25rem;position:absolute;right:0;top:5rem;width:2.5rem;z-index:2}.loader-spinner{animation:spin 1.5s linear infinite;border:.35rem solid #f3f3f3;border-radius:50%;border-top-color:#1e88e5;height:2rem;width:2rem}@keyframes spin{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}.uploader{display:flex}.uploader>div{background-color:#cfd8dc;border-radius:.1rem;height:.6rem;line-height:0;margin:.35rem;padding:.15rem;position:relative;width:6rem}.uploader>div>span{background-color:#1e88e5;border-radius:.08rem;display:inline-block;height:.3rem} \ No newline at end of file +*{box-sizing:border-box;font-family:Roboto,Arial,sans-serif;margin:0;padding:0;text-rendering:optimizeLegibility}body,html{background-color:silver;box-shadow:inset 0 10rem #3949ab;color:#666;font-size:10pt;height:100%;overflow:hidden;width:100%}tt{font-family:Roboto Mono,Courier,monospace}a{color:#2196f3;text-decoration:none}a:focus,a:hover{color:#0a6ebd;text-decoration:underline}a.red:focus,a.red:hover{color:#f44336}a.flat-button{align-items:center;display:flex;font-weight:400;height:2em;line-height:2em;margin:.15rem .35rem;text-align:center;text-transform:uppercase;touch-action:manipulation;vertical-align:middle;white-space:nowrap}a.flat-button:focus,a.flat-button:hover{text-decoration:none}form{line-height:1.5;padding:.5rem .75rem}form,label{font-size:1.1rem}label{margin-right:auto}label.small{color:#1e88e5;font-size:.95rem}img.avatar{border-radius:50%;height:100%;width:100%}button{border:1px solid transparent;border-radius:2px;box-shadow:0 2px 5px 0 rgba(0,0,0,.25);cursor:pointer;display:inline-block;font-family:inherit;font-size:1.1rem;font-weight:400;height:2.2em;line-height:2.2em;padding-left:2rem;padding-right:2rem;text-align:center;text-transform:uppercase;touch-action:manipulation;vertical-align:middle;white-space:nowrap}button[disabled],html input[disabled]{box-shadow:none;cursor:default;opacity:.65}button.round{border-radius:50%;box-shadow:0 2px .5rem 0 rgba(0,0,0,.25);height:3rem;line-height:3.5rem;margin:0;outline:none;padding:0;width:3rem;z-index:2}button.round.small{box-shadow:0 2px .35rem 0 rgba(0,0,0,.25);height:2rem;line-height:2rem;width:2rem}button:active,button:focus,button:hover{color:#fff}button:active{box-shadow:inset 0 3px .5rem rgba(0,0,0,.125)}button:active.round.small{box-shadow:inset 0 2px .35rem rgba(0,0,0,.125)}button.blue{background-color:#1e88e5;color:#fff}button.blue:active,button.blue:focus,button.blue:hover{background-color:#1976d2}button.white{background-color:#fff;color:#2196f3}button.blue:active,button.white:focus,button.white:hover{background-color:#e3f2fd}input,textarea{background:transparent;border:none;color:#666;font-family:inherit;font-size:1.1rem;margin:.25rem 0;outline:none;padding:0 .125rem}textarea{resize:none}input[type=email],input[type=password],input[type=search],input[type=text],textarea{border-bottom:1px solid #ccc;box-shadow:0 1px 0 rgba(0,0,0,.1);height:2.5rem;transition:all .1s ease-in-out}input[type=email],input[type=password],input[type=text],textarea{width:100%}input[type=email]:focus,input[type=password]:focus,input[type=search]:focus,input[type=text]:focus,textarea:focus{border-bottom:1px solid #2196f3;box-shadow:0 1px 0 rgba(33,150,243,.25)}input[type=email]::placeholder,input[type=password]::placeholder,input[type=search]::placeholder,input[type=text]::placeholder,textarea::placeholder{color:#bbb}input[type=password].with-visibility,input[type=text].with-visibility{margin-right:-2rem;padding-right:2rem}::-webkit-scrollbar{width:.6rem}::-webkit-scrollbar-track{-webkit-box-shadow:inset 0 0 6px rgba(0,0,0,.2);background-color:hsla(0,0%,100%,.1)}::-webkit-scrollbar-thumb{background-color:rgba(0,0,0,.3)}ul.menu{background-color:#fff;border-radius:.2rem;box-shadow:0 1px 6px rgba(0,0,0,.45);list-style:none;padding-bottom:.35rem;padding-top:.35rem;position:absolute;width:12rem;z-index:4}ul.menu>li{padding:.75rem .75rem .75rem 1.25rem}ul.menu>li:hover{background-color:#f5f5f5}ul.menu>li.separator{height:1px;margin:2px;padding:0}ul.menu>li.separator,ul.menu>li.separator:hover{background-color:#ccc}li .menuTrigger{border-radius:.6rem;height:1.2rem;line-height:1.2rem;opacity:0;position:absolute;right:.25rem;text-align:center;top:.25rem;width:1.5rem}li:hover .menuTrigger{opacity:1}li:hover .menuTrigger a{color:#757575}li.left:hover .menuTrigger{-text-shadow:#c5e1a5 0 0 15px,#c5e1a5 0 0 5px;background-image:radial-gradient(#c5e1a5 40%,transparent 75%)}li.right:hover .menuTrigger{-text-shadow:#fafafa 0 0 15px,#fafafa 0 0 5px;background-image:radial-gradient(#fafafa 40%,transparent 75%)}.blue{color:#2196f3}.red{color:#d32f2f}.gray{color:#757575}.light-gray{color:#bbb}.small{font-size:90%}.hr{background-color:#f0f0f0;box-shadow:inset 0 .25rem .25rem -.25rem rgba(0,0,0,.15),inset 0 -.25rem .25rem -.25rem rgba(0,0,0,.15);display:block;height:.6rem;min-height:.3rem;width:100%}.group-focus{outline:none}#mountPoint{height:100%;padding-bottom:3rem;padding-top:1rem}#noscript-alertbox{background-color:#fff;border-radius:.25rem;box-shadow:1px 2px .3rem grey;display:flex;flex-direction:column;margin-left:auto;margin-right:auto;margin-top:5rem;max-width:30rem;overflow:hidden;position:relative}#noscript-title{background-color:#2196f3;color:#bbdefb;font-size:120%;font-weight:bolder;padding:1rem}#noscript-content{padding:1rem}#app-container{background-color:#fff;border-radius:.25rem;box-shadow:1px 2px .3rem grey;margin-left:auto;margin-right:auto;max-width:80rem;overflow:hidden}#app-container,#sidepanel{display:flex;height:100%;position:relative}#sidepanel{flex-direction:column;flex-grow:0;flex-shrink:0.3;min-width:18rem;width:24rem}#topic-view{width:100%}#info-view,#topic-view{display:flex;flex-direction:column;height:100%}#info-view{flex-grow:0;flex-shrink:0.3;min-width:18rem;width:24rem}@media (max-width:960px){#mountPoint{padding:0}}@media (max-width:640px){#app-container{border-radius:0;box-shadow:none;width:100%}#info-view,#sidepanel{width:100%}}.center-medium-text{align-items:center;display:flex;font-size:1.4rem;height:100%;justify-content:center;text-align:center;width:100%}.nodisplay{display:none!important}.quoted{margin-left:1.5rem}.in-place-edit{border-bottom:1px dashed #ddd;cursor:pointer;display:inline-block;font-family:inherit;font-size:1.1rem;height:2.5rem;line-height:2.25;margin:.25rem .125rem;vertical-align:baseline;width:100%}.in-place-edit.disabled{border-bottom:none;cursor:default}.in-place-edit.placeholder{color:#bbb}.in-place-edit .content{display:block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}table.permission-editor{width:100%}table.permission-editor td{font-size:1.1rem;margin:.35rem 0;vertical-align:middle}table.permission-editor td.checkbox{color:#999;text-align:center}.permission-editor .material-icons{font-size:1.1rem;line-height:1.1rem}.material-icons.clickable{border-bottom:none;cursor:pointer}.clickable{border-bottom:1px dashed #ddd;cursor:pointer}.panel-title{font-size:1.4rem;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.caption-panel{align-items:center;box-shadow:0 1px 2px grey;display:flex;flex:none;height:4rem;padding:.5rem;white-space:nowrap;z-index:1}.dialog-buttons{display:flex;justify-content:flex-end;padding:.5rem}.dialog-buttons button{margin:0 .5rem}.avatar-box{flex-grow:0;flex-shrink:0;position:relative}#side-caption-panel{background-color:#2196f3;color:#bbdefb}#side-caption-panel a{color:#bbdefb;line-height:1;padding-left:.5rem}#side-caption-panel :hover{color:#fff}#sidepanel-title{margin-left:.5rem;margin-right:auto}#self-avatar{border-radius:50%;flex:none;height:3rem;min-width:3rem;width:3rem}#self-avatar.avatar-box{font-size:1.8rem}#settings-form ul{list-style:none}#settings-form li{vertical-align:middle}#settings-form label{display:inline-block;padding-left:.5rem}input.search{text-indent:1.4rem}i.search{left:.6rem;position:absolute}.alert-box{display:none;overflow:hidden;padding:1rem 1.5rem 1rem .5rem;position:relative}.alert-box .cancel{position:absolute;right:.25rem;top:.5rem}.alert-box.error{background-color:#ffcdd2;border-bottom:1px solid #ffbfc8;color:#b71c1c;display:flex}.alert-box.warning{background-color:#fff9c4;border-bottom:1px solid #fff59d;color:#6d4c41;display:flex}.alert-box.info{background-color:#e1f5fe;border-bottom:1px solid #4fc3f7;color:#0288d1;display:flex}.alert-box .cancel .material-icons{color:#757575;font-size:1rem}.alert-box.error .cancel .material-icons{color:#b71c1c}.alert-box .icon{display:block;margin-right:.5rem}.alert-box .icon .material-icons{font-size:1.5rem}.alert-box.warning .icon .material-icons{color:#fbc02d}.alert-box.error .icon .material-icons{color:#ef5350}.alert-box.info .icon .material-icons{color:#0288d1}.flex-column{display:flex;flex-direction:column;height:100%;overflow:hidden}.scrollable-panel{height:100%;margin-bottom:auto;margin-top:.25rem;overflow-y:auto}.contact-box{list-style:none;overflow-x:hidden}.contact-box>li{border-bottom:1px solid #eee;border-collapse:collapse;display:flex;flex-grow:0;flex-shrink:0;min-height:3.5rem;overflow-x:hidden;padding:.35rem .25rem .5rem .35rem;position:relative}.contact-box>li:hover{background-color:#eceff1}.contact-box>li.selected{background-color:#cfd8dc}.contact-box .text-box{overflow-x:hidden}.contact-box .contact-title{font-size:1.05rem;overflow:hidden;text-overflow:ellipsis}.contact-box .contact-comment{font-weight:lighter;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.contact-box .avatar-box{font-size:1.8rem;height:3rem;margin-right:.35rem;min-height:3rem;min-width:3rem;overflow:hidden;padding:0;position:relative;width:3rem}.contact-box .avatar{border-radius:50%;height:3rem;width:3rem}.contact-box .avatar-box>.material-icons{height:3rem;width:3rem}.contact-box .avatar-box>.material-icons,.contact-box .text-box{display:flex;flex-direction:column;justify-content:space-around}.avatar-box .online,.offline{border-radius:50%;bottom:.1rem;display:inline-block;flex-shrink:0;height:.75rem;min-height:.75rem;min-width:.75rem;position:absolute;right:0;width:.75rem}.avatar-box .online{background-color:#4caf50}.avatar-box .offline{background-color:silver}.online.typing{animation:typing .5s infinite}@keyframes typing{0%,to{transform:translateX(0)}50%{transform:translateX(-.3rem)}}.contact-box .checkmark.material-icons{background-color:#fff;border:0 solid transparent;bottom:.05rem;color:#0097a7;display:inline-block;font-size:1.5rem;height:1.5rem;line-height:1.5rem;overflow:visible;position:absolute;right:.05rem;width:1.5rem}#add-topic{bottom:1rem;position:absolute;right:1rem}.panel-form{display:flex;flex-direction:column;padding:0}.panel-form-row{align-items:center;justify-content:flex-start}.panel-form-column,.panel-form-row{display:flex;flex-grow:0;flex-shrink:0;line-height:1.5;padding:.5rem .75rem}.panel-form-column{flex-direction:column}.panel-form-column>.panel-form-column,.panel-form-row>.panel-form-column{flex-grow:1;padding:0!important}.panel-form-column>.panel-form-row,.panel-form-row>.panel-form-row{padding:0!important}.avatar-upload{display:flex;flex-direction:column;flex-shrink:0;font-size:4.5rem;height:9rem;margin-left:.5rem;padding:0;width:7rem}.avatar-upload .avatar-box{height:7rem;position:relative;width:7rem}.avatar-upload .avatar-box>.material-icons{font-size:4rem;height:7rem;line-height:7rem;position:relative;vertical-align:middle;width:7rem}.avatar-upload:after{clear:both;content:".";display:block;height:0;visibility:hidden}.avatar-upload .blank{border:1px dashed #999;border-radius:50%;color:#999;flex-shrink:0;font-size:1rem;height:7rem;line-height:7rem;overflow:hidden;text-align:center;vertical-align:middle;width:7rem}.avatar-upload .preview{border-radius:50%;height:7rem;overflow:hidden;width:7rem}.avatar-upload .inputfile.hidden{height:.1px;opacity:0;overflow:hidden;position:absolute;width:.1px}.avatar-upload .inputfile+label.round{align-items:center;background-color:#fafafa;border-radius:50%;bottom:0;box-shadow:0 1px 4px rgba(0,0,0,.4);cursor:pointer;display:flex;height:3rem;justify-content:center;line-height:3rem;margin-left:auto;margin-right:auto;margin-top:-1rem;width:3rem}.avatar-upload .inputfile:focus+label.round{outline:none}.avatar-upload .inputfile+label:hover,.avatar-upload .inputfile:focus+label{background-color:#e3f2fd;color:#42a5f5}#topic-view{position:relative}#topic-caption-panel{background-color:#b0bec5}#topic-caption-panel a{color:#757575;text-decoration:none}#topic-caption-panel :hover{color:#000}#topic-caption-panel .avatar-box{font-size:1.8rem;height:3rem;margin-right:.35rem;min-width:3rem;position:relative;width:3rem}#hide-message-view{display:block;margin-right:.35rem}#topic-users{margin-left:auto;margin-right:1rem}#topic-users .avatar-box{display:inline-block;font-size:1rem;height:1.8rem;margin-right:.2rem;min-height:1.8rem;min-width:1.8rem;width:1.8rem}#messages-panel{background-color:#eceff1;background-image:url(../img/ignasi_pattern_s.png);height:100%;overflow-y:scroll;padding:.75rem;position:relative}#messages-container{height:100%;overflow-y:hidden;position:relative}#write-only-background{background-image:repeating-linear-gradient(45deg,hsla(0,0%,100%,.5),hsla(0,0%,100%,.5) .5rem,hsla(0,0%,100%,.8) 0,hsla(0,0%,100%,.8) 1rem);height:100%;left:0;position:absolute;top:0;width:100%}#write-only-note{background-color:#fff;box-shadow:.1rem .1rem .1rem rgba(0,0,0,.2);color:#666;height:auto;left:50%;line-height:2rem;padding:.25rem 1.5rem;position:absolute;text-align:center;top:50%;transform:translate(-50%,-50%);width:auto}#send-message-panel{align-items:center;background-color:#eceff1;box-shadow:0 -1px rgba(0,0,0,.1);display:flex;flex:none;height:4rem;padding:.4rem .4rem .4rem .6rem;z-index:2}#sendMessage{overflow:hidden;overflow-wrap:break-word}#send-message-panel .material-icons{min-width:1.75rem}#send-message-panel .material-icons.secondary,.material-icons.disabled{color:#999!important}#send-message-panel .material-icons.secondary:hover{color:#2196f3!important}#dummy-view{align-items:center;background-color:#e0f7fa;display:flex;height:100%;justify-content:center;width:100%}#dummy-view a{display:block;text-align:center;text-decoration:none;vertical-align:middle}#image-preview{background-color:hsla(0,0%,100%,.9);display:flex;flex-direction:column;height:100%;left:0;position:absolute;top:0;width:100%;z-index:2}#image-preview-caption-panel{background-color:transparent;display:flex;height:3.5rem;justify-content:space-between;line-height:2.5rem;padding:1rem .75rem 0}#image-preview-caption-panel a{color:#757575;text-decoration:none}#image-preview-caption-panel a:hover{color:#000}#image-preview-container{margin:auto;overflow:hidden}#image-preview-footer{background-color:transparent;display:flex;height:3.2rem;justify-content:space-around;line-height:1.5rem}.chat-box{list-style:none;margin:0 .5rem;padding:0 0 3.5rem}.chat-box.group{margin-left:-.4rem}.chat-box li{align-items:flex-end;display:flex;margin:0;overflow:hidden;padding:0}.chat-box .right{justify-content:flex-end}.chat-box .bubble{border-radius:.5rem;display:flex;height:auto;margin:0;max-width:40rem;min-width:12rem;padding:.75rem .5rem .75rem 1.25rem;position:relative;text-align:left}.chat-box li.single{margin-bottom:.75rem;margin-top:.25rem}.chat-box li.first{margin-bottom:.15rem;margin-top:.25rem}.chat-box li.middle{margin-bottom:.15rem;margin-top:.15rem}.chat-box li.last{margin-bottom:.75rem;margin-top:.15rem}.chat-box .left .bubble{background-color:#c5e1a5}.chat-box .right .bubble{background-color:#fafafa}.chat-box .left .tip:before{color:#c5e1a5;left:-10px;right:auto}.chat-box .left .tip:before,.chat-box .right .tip:before{border:10px solid transparent;border-bottom-color:currentColor;bottom:0;content:"";height:0;position:absolute;top:auto;width:0}.chat-box .right .tip:before{color:#fafafa;display:flex;justify-content:space-between;left:auto;right:-10px}.chat-box .avatar-box{font-size:.8rem;height:1.4rem;margin-bottom:.8rem;margin-right:.8rem;min-height:1.4rem;min-width:1.4rem;position:relative;width:1.4rem}.chat-box .bubble div.message-content{color:#212121;margin:0;max-width:36rem;overflow-wrap:break-word}.chat-box .bubble div.message-content:after{clear:both;content:".";display:block;height:0;visibility:hidden}.chat-box .timestamp{color:#777;display:inline-block;float:right;font-size:80%;padding-left:1rem;position:relative;top:.5rem;white-space:nowrap}.chat-box .typing{border-radius:.5rem;color:#aaa;display:inline-block;margin-top:.75rem;padding:.25rem .35rem;text-align:center;vertical-align:middle;width:2rem}.chat-box .author{color:#777;font-size:80%}.inline-image{border-radius:.1rem;cursor:pointer;display:block;max-height:24rem;max-width:36rem;overflow:hidden}.attachment{display:flex}.attachment:last-of-type{margin-bottom:-.45rem}#info-caption-panel{background-color:#b0bec5}#info-caption-panel a{color:#757575;line-height:1;text-decoration:none}#info-caption-panel :hover{color:#000}#info-title{margin-right:auto}#group-manager{display:flex;flex-direction:column;height:100%;position:relative}#group-manager-buttons{background-color:#eceff1;border-left:1px solid #ccc;box-shadow:0 -1px rgba(0,0,0,.1);display:flex;height:4rem;justify-content:space-around;padding:.4rem;z-index:2}.dialog-overlay{background-color:hsla(0,0%,100%,.9);height:100%;left:0;position:absolute;top:0;width:100%;z-index:10}.dialog-overlay,.modal-dialog{display:flex;flex-direction:column}.modal-dialog{background-color:#fff;border-radius:.3rem;box-shadow:0 .5rem 1rem 0 rgba(0,0,0,.25);justify-content:space-between;margin:auto;min-height:16rem;min-width:24rem}.modal-dialog .title-panel{display:flex;font-size:1.4rem;justify-content:space-between;padding:1rem}.modal-dialog .body-panel{margin:auto .5rem}.modal-dialog .dialog-buttons{background-color:#fafafa;border-top:1px solid #f5f5f5}.modal-dialog .dialog-buttons a{display:inline-block;font-size:1.1rem;padding:.35rem 1.5rem;text-decoration:none;text-transform:uppercase}ul.tabbar{background:#eee;flex-grow:0;flex-shrink:0;list-style:none;margin:0;overflow:hidden;padding:0 0 0 1rem;width:100%}ul.tabbar>li{float:left}ul.tabbar>li>a{box-shadow:inset 0 -2px 2.5px -1px rgba(0,0,0,.25);color:rgba(33,150,243,.6);display:block;font-size:1.3rem;font-variant:small-caps;font-weight:400;line-height:2rem;overflow:hidden;padding-left:1rem;padding-right:1rem;padding-top:.75rem;position:relative;text-align:center;text-decoration:none}ul.tabbar li.active>a{color:#2196f3}ul.tabbar li.active>a:after{animation:tabbar-border-expand .2s cubic-bezier(.4,0,.4,1) 0s alternate forwards;background:#2196f3;bottom:0;content:"";display:block;height:.15rem;left:0;position:absolute}@keyframes tabbar-border-expand{0%{opacity:0;width:0}to{opacity:1;width:100%}}.unread{background-color:#0097a7;border-radius:50%;color:#fff;font-weight:bolder;height:1.35rem;line-height:1.35rem;margin-left:.5rem;text-align:center;vertical-align:middle;width:1.35rem}.badge,.unread{display:inline-block;font-size:.75rem}.badge{align-self:flex-start;background-color:#eee;border:1px solid #666;border-radius:.15rem;color:#666;font-family:Roboto Mono,Courier,monospace,sans-serif;margin-bottom:.1rem;margin-left:.1rem;margin-right:.1rem;padding:0 .15rem}.badge.green{background-color:#efe;border-color:#383;color:#383}.badge.yellow{background-color:#ffe;border-color:#660;color:#660}.badge.blue{background-color:#eef;border-color:#339;color:#339}.badge.red{background-color:#fee;border-color:#933;color:#933}.badge.magenta{background-color:#fef;border-color:#939;color:#939}.lettertile{border-radius:50%;padding-bottom:100%;width:100%}.lettertile>div{align-items:center;border-radius:50%;bottom:0;color:hsla(0,0%,98%,.8);display:flex;flex-grow:0;flex-shrink:0;justify-content:center;left:0;line-height:1;position:absolute;right:0;text-align:center;text-transform:uppercase;top:0}.lettertile:hover{color:#fff}.lettertile.color0{background-color:#ef9a9a}.lettertile.color1{background-color:#90caf9}.lettertile.color2{background-color:#b0bec5}.lettertile.color3{background-color:#b39ddb}.lettertile.color4{background-color:#ffab91}.lettertile.color5{background-color:#a5d6a7}.lettertile.color6{background-color:#eee}.lettertile.color7{background-color:#e6ee9c}.lettertile.color8{background-color:#c5e1a5}.lettertile.color9{background-color:#f0e57d}.lettertile.color10{background-color:#f48fb1}.lettertile.color11{background-color:#9fa8da}.lettertile.color12{background-color:#ffe082}.lettertile.color13{background-color:#bcaaa4}.lettertile.color14{background-color:#80deea}.lettertile.color15{background-color:#ce93d8}.lettertile.dark-color0{background-color:#c62828}.lettertile.dark-color1{background-color:#ad1457}.lettertile.dark-color2{background-color:#6a1b9a}.lettertile.dark-color3{background-color:#4527a0}.lettertile.dark-color4{background-color:#283593}.lettertile.dark-color5{background-color:#1565c0}.lettertile.dark-color6{background-color:#0277bd}.lettertile.dark-color7{background-color:#00838f}.lettertile.dark-color8{background-color:#00695c}.lettertile.dark-color9{background-color:#2e7d32}.lettertile.dark-color10{background-color:#558b2f}.lettertile.dark-color11{background-color:#9e9d24}.lettertile.dark-color12{background-color:#f9a825}.lettertile.dark-color13{background-color:#ff8f00}.lettertile.dark-color14{background-color:#ef6c00}.lettertile.dark-color15{background-color:#d84315}.material-icons{font-size:1.4rem;line-height:1;text-align:center;vertical-align:middle}.material-icons.small{font-size:1rem}.material-icons.big{font-size:2.4rem}#self-avatar.material-icons,.avatar-box .material-icons{font-size:2.4rem;height:3rem;line-height:3rem;width:3rem}.avatar-box .material-icons{background-color:silver;border-radius:50%;color:hsla(0,0%,98%,.8)}.chip-input{align-items:center;background:transparent;border-bottom:1px solid #ccc;box-shadow:0 1px 0 rgba(0,0,0,.1);color:#666;cursor:text;display:flex;flex-grow:1;flex-wrap:wrap;font-size:1.1rem;font-weight:400;justify-content:flex-start;margin:.25rem 0;max-height:10rem;min-height:4rem;outline:none;overflow-y:scroll;text-align:center;transition:all .1s ease-in-out}.chip-input.focused{border-bottom:1px solid #2196f3;box-shadow:0 1px 0 rgba(33,150,243,.25)}.chip-input>input[type=text]{border:none;box-shadow:none;display:inline-block;flex:1 0 auto;min-width:4rem;width:auto}.chip,.chip-input>input[type=text]{height:1.8rem;line-height:1.8;margin:.125rem}.chip{align-items:center;background-color:#eee;border-radius:.9rem;display:flex;flex:0 0 auto;font-size:90%;white-space:nowrap}.chip>a{background-color:#aaa;border-radius:50%;color:#ccc;display:inline-block;height:1.175rem;line-height:1.15;margin:.3rem;text-decoration:none;width:1.175rem}.chip>a:focus,.chip>a:hover{background-color:#bbb;color:#ddd;text-decoration:none}.chip .avatar-box{font-size:1rem;height:1.8rem;margin-right:.2rem;min-height:1.8rem;min-width:1.8rem;position:relative;width:1.8rem}.chip .avatar-box .material-icons{font-size:1.8rem}.chip .spacer{display:inline-block;height:1.175rem;margin:.3rem;width:.25rem}.load-spinner-box{background-color:#fff;border-radius:50%;box-shadow:.1rem .1rem .15rem 1px rgba(0,0,0,.25);height:2.5rem;left:0;margin-left:auto;margin-right:auto;padding:.25rem;position:absolute;right:0;top:5rem;width:2.5rem;z-index:2}.loader-spinner{animation:spin 1.5s linear infinite;border:.35rem solid #f3f3f3;border-radius:50%;border-top-color:#1e88e5;height:2rem;width:2rem}@keyframes spin{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}.uploader{display:flex}.uploader>div{background-color:#cfd8dc;border-radius:.1rem;height:.6rem;line-height:0;margin:.35rem;padding:.15rem;position:relative;width:6rem}.uploader>div>span{background-color:#1e88e5;border-radius:.08rem;display:inline-block;height:.3rem} \ No newline at end of file diff --git a/service-worker.js b/service-worker.js index 7a736a02..ac839ef9 100644 --- a/service-worker.js +++ b/service-worker.js @@ -20,7 +20,6 @@ firebase.messaging().setBackgroundMessageHandler(function(payload) { return self.registration.showNotification(title, options); }); - // This code handles a click on notification: takes // the user to the browser tab with the chat or opens a new tab. self.addEventListener('notificationclick', function(event) { diff --git a/src/i18n/en.json b/src/i18n/en.json index 20478240..191dd1d8 100644 --- a/src/i18n/en.json +++ b/src/i18n/en.json @@ -63,6 +63,7 @@ "sidepanel_title_newtpk": "Start New Chat", "sidepanel_title_cred": "Confirm Credentials", "sidepanel_title_reset": "Reset Password", + "update_available": "Update available. Reload.", "phone_dative": "phone", "email_dative": "email", "enter_confirmation_code_prompt": "Enter confirmation code sent to you by {method}:", diff --git a/src/i18n/ru.json b/src/i18n/ru.json index 4dc60fc2..3ea8a8b0 100644 --- a/src/i18n/ru.json +++ b/src/i18n/ru.json @@ -117,5 +117,6 @@ "topic_name_editing_placeholder": "Название чата", "button_create": "Создать", "badge_you": "вы", - "badge_owner": "влад." + "badge_owner": "влад.", + "update_available": "Есть новая версия приложения. Обновить." } diff --git a/src/messages.json b/src/messages.json index acdb87b9..ceadb74f 100644 --- a/src/messages.json +++ b/src/messages.json @@ -64,6 +64,7 @@ "sidepanel_title_newtpk": "Start New Chat", "sidepanel_title_cred": "Confirm Credentials", "sidepanel_title_reset": "Reset Password", + "update_available": "Update available. Reload.", "phone_dative": "phone", "email_dative": "email", "enter_confirmation_code_prompt": "Enter confirmation code sent to you by {method}:", @@ -239,6 +240,7 @@ "topic_name_editing_placeholder": "Название чата", "button_create": "Создать", "badge_you": "вы", - "badge_owner": "влад." + "badge_owner": "влад.", + "update_available": "Есть новая версия приложения. Обновить." } } diff --git a/src/views/tinode-web.jsx b/src/views/tinode-web.jsx index ae3edf90..607f8809 100644 --- a/src/views/tinode-web.jsx +++ b/src/views/tinode-web.jsx @@ -1,7 +1,7 @@ // The top-level class to hold all functionality together. import React from 'react'; import ReactDOM from 'react-dom'; -import { injectIntl } from 'react-intl'; +import { defineMessages, injectIntl } from 'react-intl'; import * as firebase from 'firebase/app'; import 'firebase/messaging'; @@ -24,6 +24,14 @@ import { updateFavicon } from '../lib/utils.js'; // Sound to play on message received. const POP_SOUND = new Audio('audio/msg.mp3'); +const messages = defineMessages({ + update_available: { + id: 'update_available', + defaultMessage: 'Update available. Reload.', + description: 'Message shown when an app update is available.' + } +}); + class TinodeWeb extends React.Component { constructor(props) { super(props); @@ -33,6 +41,7 @@ class TinodeWeb extends React.Component { this.handleResize = this.handleResize.bind(this); this.handleHashRoute = this.handleHashRoute.bind(this); this.handleOnline = this.handleOnline.bind(this); + this.checkForAppUpdate = this.checkForAppUpdate.bind(this); this.handleAppVisibility = this.handleAppVisibility.bind(this); this.handleReadTimer = this.handleReadTimer.bind(this); this.handleVisibilityEvent = this.handleVisibilityEvent.bind(this); @@ -159,6 +168,7 @@ class TinodeWeb extends React.Component { this.fbPush = firebase.initializeApp(FIREBASE_INIT, APP_NAME).messaging(); this.fbPush.usePublicVapidKey(FIREBASE_INIT.messagingVapidKey); navigator.serviceWorker.register('/service-worker.js').then((reg) => { + this.checkForAppUpdate(reg, () => {}); this.fbPush.useServiceWorker(reg); this.initDesktopAlerts(); if (this.state.desktopAlerts) { @@ -226,6 +236,19 @@ class TinodeWeb extends React.Component { } } + // Check if a newer version of TinodeWeb app is available at the server. + checkForAppUpdate(reg) { + const {formatHTMLMessage} = this.props.intl; + reg.onupdatefound = () => { + const installingWorker = reg.installing; + installingWorker.onstatechange = () => { + if (installingWorker.state == 'installed' && navigator.serviceWorker.controller) { + this.handleError(formatHTMLMessage(messages.update_available), 'info'); + } + } + } + } + // Handle for hashchange event: display appropriate panels. handleHashRoute() { var hash = HashNavigation.parseUrlHash(window.location.hash); diff --git a/src/widgets/error-panel.jsx b/src/widgets/error-panel.jsx index 3ff11117..4bc67cad 100644 --- a/src/widgets/error-panel.jsx +++ b/src/widgets/error-panel.jsx @@ -27,13 +27,13 @@ export default class ErrorPanel extends React.PureComponent { } render() { - var icon = this.props.level == 'err' ? 'error': 'warning'; + const icons = {err: 'error', warn: 'warning', info: 'info'} + const level = icons[this.props.level] || ''; + const className = 'alert-box ' + level; return ( -
-
{icon}
- {this.props.text} +
+
{level}
+
); diff --git a/umd/index.dev.js b/umd/index.dev.js index 79b53966..018e060e 100644 --- a/umd/index.dev.js +++ b/umd/index.dev.js @@ -222,7 +222,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) * /*! exports provided: en, ru, default */ /***/ (function(module) { -eval("module.exports = {\"en\":{\"contacts_not_found\":\"You have no chats
¯\\\\\\\\_(ツ)_/¯\",\"full_name_prompt\":\"Full name, e.g. John Doe\",\"email_prompt\":\"Email, e.g. jdoe@example.com\",\"button_sign_up\":\"Sign up\",\"label_your_name\":\"Your name\",\"label_password\":\"Password\",\"password_unchanged_prompt\":\"Unchanged\",\"label_user_id\":\"Address:\",\"label_default_access_mode\":\"Default access mode:\",\"label_message_sound\":\"Message sound:\",\"label_push_notifications\":\"Notification alerts:\",\"label_push_notifications_disabled\":\"Notification alerts (requires HTTPS):\",\"title_tag_manager\":\"Tags (user discovery)\",\"button_logout\":\"Logout\",\"requested_permissions\":\"Requested\",\"granted_permissions\":\"Granted\",\"menu_item_edit_permissions\":\"Edit permissions\",\"label_other_user\":\"Other\",\"title_info\":\"Info\",\"label_topic_name\":\"Name\",\"label_private\":\"Private comment\",\"private_editing_placeholder\":\"Visible to you only\",\"label_muting_topic\":\"Muted:\",\"action_more\":\"More\",\"label_your_permissions\":\"Your permissions:\",\"label_permissions\":\"Permissions:\",\"label_you\":\"You:\",\"label_default_access\":\"Default access mode:\",\"label_group_members\":\"Group members:\",\"button_add_members\":\"Add members\",\"button_leave\":\"Leave\",\"group_has_no_members\":\"No members\",\"action_leave_chat\":\"Leave\",\"login_prompt\":\"Login\",\"password_prompt\":\"Password\",\"stay_logged_in\":\"Stay logged in\",\"forgot_password_link\":\"Forgot password?\",\"button_sign_in\":\"Sign in\",\"label_client\":\"Client:\",\"label_server\":\"Server:\",\"online_now\":\"online now\",\"last_seen_timestamp\":\"Last seen\",\"title_not_found\":\"Not found\",\"unnamed_topic\":\"Unnamed\",\"messages_not_readable\":\"no access to messages\",\"tabtitle_find_user\":\"find\",\"tabtitle_new_group\":\"new group\",\"tabtitle_group_by_id\":\"by id\",\"search_for_contacts\":\"Use search to find contacts\",\"new_password_placeholder\":\"Enter new password\",\"label_reset_password\":\"Send a password reset email:\",\"credential_email_prompt\":\"Your registration email\",\"button_reset\":\"Reset\",\"button_send_request\":\"Send request\",\"label_server_to_use\":\"Server to use:\",\"label_wire_transport\":\"Wire transport:\",\"button_update\":\"Update\",\"sidepanel_title_login\":\"Sign In\",\"sidepanel_title_register\":\"Create Account\",\"sidepanel_title_settings\":\"Settings\",\"sidepanel_title_edit_account\":\"Edit Account\",\"sidepanel_title_newtpk\":\"Start New Chat\",\"sidepanel_title_cred\":\"Confirm Credentials\",\"sidepanel_title_reset\":\"Reset Password\",\"phone_dative\":\"phone\",\"email_dative\":\"email\",\"enter_confirmation_code_prompt\":\"Enter confirmation code sent to you by {method}:\",\"numeric_confirmation_code_prompt\":\"Numbers only\",\"button_confirm\":\"Confirm\",\"invalid_content\":\"invalid content\",\"badge_you\":\"you\",\"badge_owner\":\"owner\",\"menu_item_info\":\"Info\",\"menu_item_clear_messages\":\"Clear messages\",\"menu_item_clear_messages_for_all\":\"Clear for All\",\"menu_item_delete\":\"Delete\",\"menu_item_delete_for_all\":\"Delete for All\",\"menu_item_mute\":\"Mute\",\"menu_item_unmute\":\"Unmute\",\"menu_item_delete_topic\":\"Delete\",\"menu_item_unblock\":\"Unblock\",\"menu_item_block\":\"Block\",\"menu_item_member_delete\":\"Remove\",\"action_cancel\":\"cancel\",\"upload_finishing\":\"finishing...\",\"no_contacts\":\"You have no contacts :-(\",\"contacts_not_found_short\":\"No contacts match '{query}'\",\"title_group_members\":\"Group Members\",\"title_all_contacts\":\"All Contacts\",\"button_ok\":\"OK\",\"button_cancel\":\"Cancel\",\"download_action\":\"download\",\"label_file_name\":\"File name:\",\"label_content_type\":\"Content type:\",\"label_size\":\"Size:\",\"error_invalid_id\":\"Invalid ID\",\"group_user_id_prompt\":\"Group or User ID\",\"button_subscribe\":\"Subscribe\",\"topic_name_editing_placeholder\":\"Freeform name of the group\",\"button_create\":\"Create\",\"permission_join\":\"Join ({val})\",\"permission_read\":\"Read ({val})\",\"permission_write\":\"Write ({val})\",\"permission_pres\":\"Get notified ({val})\",\"permission_admin\":\"Approve ({val})\",\"permission_share\":\"Share ({val})\",\"permission_delete\":\"Delete ({val})\",\"permission_owner\":\"Owner ({val})\",\"title_permissions\":\"Permissions\",\"message_sending\":\"sending...\",\"message_sending_failed\":\"failed\",\"search_placeholder\":\"List like email:alice@example.com, tel:17025550003...\",\"messaging_disabled_prompt\":\"Messaging disabled\",\"new_message_prompt\":\"New message\",\"file_attachment_too_large\":\"The file size {size} exceeds the {limit} limit.\",\"cannot_initiate_file_upload\":\"Cannot initiate file upload.\",\"tags_not_found\":\"No tags defined. Add some.\",\"tags_editor_no_tags\":\"Add some tags\",\"title_manage_tags\":\"Manage tags\"},\"ru\":{\"contacts_not_found\":\"Чатов нет
¯\\\\\\\\_(ツ)_/¯\",\"full_name_prompt\":\"Полное имя, напр. Иван Петров\",\"email_prompt\":\"Email, напр. ivan@example.com\",\"button_sign_up\":\"Создать счет\",\"label_your_name\":\"Ваше имя\",\"label_password\":\"Пароль\",\"password_unchanged_prompt\":\"Не изменен\",\"label_user_id\":\"Адрес:\",\"label_default_access_mode\":\"Доступ по умолчанию:\",\"label_message_sound\":\"Звук нового сообщения:\",\"label_push_notifications\":\"Уведомления:\",\"label_push_notifications_disabled\":\"Уведомления (требуют HTTPS):\",\"title_tag_manager\":\"Таги для поиска\",\"button_logout\":\"Выйти\",\"login_prompt\":\"Логин\",\"password_prompt\":\"Пароль\",\"stay_logged_in\":\"Запомнить\",\"forgot_password_link\":\"Напомнить пароль\",\"button_sign_in\":\"Войти\",\"label_client\":\"Клиент:\",\"label_server\":\"Сервер:\",\"online_now\":\"онлайн\",\"last_seen_timestamp\":\"Был активен\",\"title_not_found\":\"Не найден\",\"unnamed_topic\":\"Без названия\",\"messages_not_readable\":\"нет доступа к сообщениям\",\"tabtitle_find_user\":\"найти\",\"tabtitle_new_group\":\"создать\",\"tabtitle_group_by_id\":\"по id\",\"label_server_to_use\":\"Использовать сервер:\",\"label_wire_transport\":\"Соединение:\",\"button_update\":\"Применить\",\"sidepanel_title_login\":\"Авторизация\",\"sidepanel_title_register\":\"Зарегистрироваться\",\"sidepanel_title_settings\":\"Настройки\",\"sidepanel_title_edit_account\":\"Редактировать счет\",\"sidepanel_title_newtpk\":\"Новый чат\",\"sidepanel_title_cred\":\"Подтвердить\",\"sidepanel_title_reset\":\"Сменить пароль\",\"tags_not_found\":\"Тагов нет. Добавьте\",\"tags_editor_no_tags\":\"Добавьте таги\",\"title_manage_tags\":\"Редактор тагов\",\"message_sending\":\"в пути...\",\"message_sending_failed\":\"ошибка\",\"search_placeholder\":\"Список, напр. email:alice@example.com, tel:17025550003...\",\"messaging_disabled_prompt\":\"Отправка недоступна\",\"new_message_prompt\":\"Новое сообщение\",\"file_attachment_too_large\":\"Размер файла {size} превышает {limit} лимит.\",\"cannot_initiate_file_upload\":\"Ошибка загрузки файла.\",\"search_for_contacts\":\"Поиск контактов\",\"enter_confirmation_code_prompt\":\"Код подтверждения, полученный по {method}:\",\"numeric_confirmation_code_prompt\":\"Только цифры\",\"button_confirm\":\"Подтвердить\",\"button_ok\":\"OK\",\"button_cancel\":\"Отменить\",\"invalid_content\":\"сообщение не читается\",\"label_file_name\":\"Имя файла:\",\"label_content_type\":\"Тип:\",\"label_size\":\"Размер:\",\"phone_dative\":\"телефону\",\"email_dative\":\"емейлу\",\"title_group_members\":\"Участники\",\"download_action\":\"скачать\",\"permission_join\":\"Подписываться ({val})\",\"permission_read\":\"Читать ({val})\",\"permission_write\":\"Писать ({val})\",\"permission_pres\":\"Уведомлять ({val})\",\"permission_admin\":\"Подтверждать ({val})\",\"permission_share\":\"Приглашать ({val})\",\"permission_delete\":\"Удалять ({val})\",\"permission_owner\":\"Владелец ({val})\",\"title_permissions\":\"Права доступа\",\"requested_permissions\":\"Требуются\",\"granted_permissions\":\"Получены\",\"menu_item_edit_permissions\":\"Права доступа\",\"label_other_user\":\"Второй\",\"label_topic_name\":\"Название\",\"label_private\":\"Комментарий\",\"private_editing_placeholder\":\"Виден только вам\",\"label_muting_topic\":\"Без уведомлений\",\"action_more\":\"Ещё\",\"label_your_permissions\":\"Ваши права доступа:\",\"label_permissions\":\"Права доступа:\",\"label_you\":\"Вы:\",\"label_default_access\":\"Права по умолчанию:\",\"label_group_members\":\"Участники чата:\",\"button_add_members\":\"Добавить\",\"button_leave\":\"Отписаться\",\"group_has_no_members\":\"Нет участников\",\"action_leave_chat\":\"Уйти из чата\",\"menu_item_info\":\"Информация\",\"menu_item_clear_messages\":\"Удалить сообщения\",\"menu_item_clear_messages_for_all\":\"Удалить для всех\",\"menu_item_delete\":\"Удалить\",\"menu_item_delete_for_all\":\"Удалить для всех\",\"menu_item_mute\":\"Не уведомлять\",\"menu_item_unmute\":\"Уведомлять\",\"menu_item_delete_topic\":\"Удалить чат\",\"menu_item_unblock\":\"Разблокировать\",\"menu_item_block\":\"Заблокировать\",\"menu_item_member_delete\":\"Отписать\",\"title_info\":\"Подробности\",\"new_password_placeholder\":\"Введите новый пароль\",\"label_reset_password\":\"Отправить емейл для смены пароля:\",\"credential_email_prompt\":\"Регистрационный емейл\",\"button_reset\":\"Изменить\",\"button_send_request\":\"Отправить\",\"action_cancel\":\"отменить\",\"upload_finishing\":\"завершение...\",\"no_contacts\":\"Ничего нет :-(\",\"contacts_not_found_short\":\"Нет контактов для запроса '{query}'\",\"title_all_contacts\":\"Все контакты\",\"error_invalid_id\":\"Неверный ID\",\"group_user_id_prompt\":\"ID чата или пользователя\",\"button_subscribe\":\"Подписаться\",\"topic_name_editing_placeholder\":\"Название чата\",\"button_create\":\"Создать\",\"badge_you\":\"вы\",\"badge_owner\":\"влад.\"}};\n\n//# sourceURL=webpack:///./src/messages.json?"); +eval("module.exports = {\"en\":{\"contacts_not_found\":\"You have no chats
¯\\\\\\\\_(ツ)_/¯\",\"full_name_prompt\":\"Full name, e.g. John Doe\",\"email_prompt\":\"Email, e.g. jdoe@example.com\",\"button_sign_up\":\"Sign up\",\"label_your_name\":\"Your name\",\"label_password\":\"Password\",\"password_unchanged_prompt\":\"Unchanged\",\"label_user_id\":\"Address:\",\"label_default_access_mode\":\"Default access mode:\",\"label_message_sound\":\"Message sound:\",\"label_push_notifications\":\"Notification alerts:\",\"label_push_notifications_disabled\":\"Notification alerts (requires HTTPS):\",\"title_tag_manager\":\"Tags (user discovery)\",\"button_logout\":\"Logout\",\"requested_permissions\":\"Requested\",\"granted_permissions\":\"Granted\",\"menu_item_edit_permissions\":\"Edit permissions\",\"label_other_user\":\"Other\",\"title_info\":\"Info\",\"label_topic_name\":\"Name\",\"label_private\":\"Private comment\",\"private_editing_placeholder\":\"Visible to you only\",\"label_muting_topic\":\"Muted:\",\"action_more\":\"More\",\"label_your_permissions\":\"Your permissions:\",\"label_permissions\":\"Permissions:\",\"label_you\":\"You:\",\"label_default_access\":\"Default access mode:\",\"label_group_members\":\"Group members:\",\"button_add_members\":\"Add members\",\"button_leave\":\"Leave\",\"group_has_no_members\":\"No members\",\"action_leave_chat\":\"Leave\",\"login_prompt\":\"Login\",\"password_prompt\":\"Password\",\"stay_logged_in\":\"Stay logged in\",\"forgot_password_link\":\"Forgot password?\",\"button_sign_in\":\"Sign in\",\"label_client\":\"Client:\",\"label_server\":\"Server:\",\"online_now\":\"online now\",\"last_seen_timestamp\":\"Last seen\",\"title_not_found\":\"Not found\",\"unnamed_topic\":\"Unnamed\",\"messages_not_readable\":\"no access to messages\",\"tabtitle_find_user\":\"find\",\"tabtitle_new_group\":\"new group\",\"tabtitle_group_by_id\":\"by id\",\"search_for_contacts\":\"Use search to find contacts\",\"new_password_placeholder\":\"Enter new password\",\"label_reset_password\":\"Send a password reset email:\",\"credential_email_prompt\":\"Your registration email\",\"button_reset\":\"Reset\",\"button_send_request\":\"Send request\",\"label_server_to_use\":\"Server to use:\",\"label_wire_transport\":\"Wire transport:\",\"button_update\":\"Update\",\"sidepanel_title_login\":\"Sign In\",\"sidepanel_title_register\":\"Create Account\",\"sidepanel_title_settings\":\"Settings\",\"sidepanel_title_edit_account\":\"Edit Account\",\"sidepanel_title_newtpk\":\"Start New Chat\",\"sidepanel_title_cred\":\"Confirm Credentials\",\"sidepanel_title_reset\":\"Reset Password\",\"update_available\":\"Update available. Reload.\",\"phone_dative\":\"phone\",\"email_dative\":\"email\",\"enter_confirmation_code_prompt\":\"Enter confirmation code sent to you by {method}:\",\"numeric_confirmation_code_prompt\":\"Numbers only\",\"button_confirm\":\"Confirm\",\"invalid_content\":\"invalid content\",\"badge_you\":\"you\",\"badge_owner\":\"owner\",\"menu_item_info\":\"Info\",\"menu_item_clear_messages\":\"Clear messages\",\"menu_item_clear_messages_for_all\":\"Clear for All\",\"menu_item_delete\":\"Delete\",\"menu_item_delete_for_all\":\"Delete for All\",\"menu_item_mute\":\"Mute\",\"menu_item_unmute\":\"Unmute\",\"menu_item_delete_topic\":\"Delete\",\"menu_item_unblock\":\"Unblock\",\"menu_item_block\":\"Block\",\"menu_item_member_delete\":\"Remove\",\"action_cancel\":\"cancel\",\"upload_finishing\":\"finishing...\",\"no_contacts\":\"You have no contacts :-(\",\"contacts_not_found_short\":\"No contacts match '{query}'\",\"title_group_members\":\"Group Members\",\"title_all_contacts\":\"All Contacts\",\"button_ok\":\"OK\",\"button_cancel\":\"Cancel\",\"download_action\":\"download\",\"label_file_name\":\"File name:\",\"label_content_type\":\"Content type:\",\"label_size\":\"Size:\",\"error_invalid_id\":\"Invalid ID\",\"group_user_id_prompt\":\"Group or User ID\",\"button_subscribe\":\"Subscribe\",\"topic_name_editing_placeholder\":\"Freeform name of the group\",\"button_create\":\"Create\",\"permission_join\":\"Join ({val})\",\"permission_read\":\"Read ({val})\",\"permission_write\":\"Write ({val})\",\"permission_pres\":\"Get notified ({val})\",\"permission_admin\":\"Approve ({val})\",\"permission_share\":\"Share ({val})\",\"permission_delete\":\"Delete ({val})\",\"permission_owner\":\"Owner ({val})\",\"title_permissions\":\"Permissions\",\"message_sending\":\"sending...\",\"message_sending_failed\":\"failed\",\"search_placeholder\":\"List like email:alice@example.com, tel:17025550003...\",\"messaging_disabled_prompt\":\"Messaging disabled\",\"new_message_prompt\":\"New message\",\"file_attachment_too_large\":\"The file size {size} exceeds the {limit} limit.\",\"cannot_initiate_file_upload\":\"Cannot initiate file upload.\",\"tags_not_found\":\"No tags defined. Add some.\",\"tags_editor_no_tags\":\"Add some tags\",\"title_manage_tags\":\"Manage tags\"},\"ru\":{\"contacts_not_found\":\"Чатов нет
¯\\\\\\\\_(ツ)_/¯\",\"full_name_prompt\":\"Полное имя, напр. Иван Петров\",\"email_prompt\":\"Email, напр. ivan@example.com\",\"button_sign_up\":\"Создать счет\",\"label_your_name\":\"Ваше имя\",\"label_password\":\"Пароль\",\"password_unchanged_prompt\":\"Не изменен\",\"label_user_id\":\"Адрес:\",\"label_default_access_mode\":\"Доступ по умолчанию:\",\"label_message_sound\":\"Звук нового сообщения:\",\"label_push_notifications\":\"Уведомления:\",\"label_push_notifications_disabled\":\"Уведомления (требуют HTTPS):\",\"title_tag_manager\":\"Таги для поиска\",\"button_logout\":\"Выйти\",\"login_prompt\":\"Логин\",\"password_prompt\":\"Пароль\",\"stay_logged_in\":\"Запомнить\",\"forgot_password_link\":\"Напомнить пароль\",\"button_sign_in\":\"Войти\",\"label_client\":\"Клиент:\",\"label_server\":\"Сервер:\",\"online_now\":\"онлайн\",\"last_seen_timestamp\":\"Был активен\",\"title_not_found\":\"Не найден\",\"unnamed_topic\":\"Без названия\",\"messages_not_readable\":\"нет доступа к сообщениям\",\"tabtitle_find_user\":\"найти\",\"tabtitle_new_group\":\"создать\",\"tabtitle_group_by_id\":\"по id\",\"label_server_to_use\":\"Использовать сервер:\",\"label_wire_transport\":\"Соединение:\",\"button_update\":\"Применить\",\"sidepanel_title_login\":\"Авторизация\",\"sidepanel_title_register\":\"Зарегистрироваться\",\"sidepanel_title_settings\":\"Настройки\",\"sidepanel_title_edit_account\":\"Редактировать счет\",\"sidepanel_title_newtpk\":\"Новый чат\",\"sidepanel_title_cred\":\"Подтвердить\",\"sidepanel_title_reset\":\"Сменить пароль\",\"tags_not_found\":\"Тагов нет. Добавьте\",\"tags_editor_no_tags\":\"Добавьте таги\",\"title_manage_tags\":\"Редактор тагов\",\"message_sending\":\"в пути...\",\"message_sending_failed\":\"ошибка\",\"search_placeholder\":\"Список, напр. email:alice@example.com, tel:17025550003...\",\"messaging_disabled_prompt\":\"Отправка недоступна\",\"new_message_prompt\":\"Новое сообщение\",\"file_attachment_too_large\":\"Размер файла {size} превышает {limit} лимит.\",\"cannot_initiate_file_upload\":\"Ошибка загрузки файла.\",\"search_for_contacts\":\"Поиск контактов\",\"enter_confirmation_code_prompt\":\"Код подтверждения, полученный по {method}:\",\"numeric_confirmation_code_prompt\":\"Только цифры\",\"button_confirm\":\"Подтвердить\",\"button_ok\":\"OK\",\"button_cancel\":\"Отменить\",\"invalid_content\":\"сообщение не читается\",\"label_file_name\":\"Имя файла:\",\"label_content_type\":\"Тип:\",\"label_size\":\"Размер:\",\"phone_dative\":\"телефону\",\"email_dative\":\"емейлу\",\"title_group_members\":\"Участники\",\"download_action\":\"скачать\",\"permission_join\":\"Подписываться ({val})\",\"permission_read\":\"Читать ({val})\",\"permission_write\":\"Писать ({val})\",\"permission_pres\":\"Уведомлять ({val})\",\"permission_admin\":\"Подтверждать ({val})\",\"permission_share\":\"Приглашать ({val})\",\"permission_delete\":\"Удалять ({val})\",\"permission_owner\":\"Владелец ({val})\",\"title_permissions\":\"Права доступа\",\"requested_permissions\":\"Требуются\",\"granted_permissions\":\"Получены\",\"menu_item_edit_permissions\":\"Права доступа\",\"label_other_user\":\"Второй\",\"label_topic_name\":\"Название\",\"label_private\":\"Комментарий\",\"private_editing_placeholder\":\"Виден только вам\",\"label_muting_topic\":\"Без уведомлений\",\"action_more\":\"Ещё\",\"label_your_permissions\":\"Ваши права доступа:\",\"label_permissions\":\"Права доступа:\",\"label_you\":\"Вы:\",\"label_default_access\":\"Права по умолчанию:\",\"label_group_members\":\"Участники чата:\",\"button_add_members\":\"Добавить\",\"button_leave\":\"Отписаться\",\"group_has_no_members\":\"Нет участников\",\"action_leave_chat\":\"Уйти из чата\",\"menu_item_info\":\"Информация\",\"menu_item_clear_messages\":\"Удалить сообщения\",\"menu_item_clear_messages_for_all\":\"Удалить для всех\",\"menu_item_delete\":\"Удалить\",\"menu_item_delete_for_all\":\"Удалить для всех\",\"menu_item_mute\":\"Не уведомлять\",\"menu_item_unmute\":\"Уведомлять\",\"menu_item_delete_topic\":\"Удалить чат\",\"menu_item_unblock\":\"Разблокировать\",\"menu_item_block\":\"Заблокировать\",\"menu_item_member_delete\":\"Отписать\",\"title_info\":\"Подробности\",\"new_password_placeholder\":\"Введите новый пароль\",\"label_reset_password\":\"Отправить емейл для смены пароля:\",\"credential_email_prompt\":\"Регистрационный емейл\",\"button_reset\":\"Изменить\",\"button_send_request\":\"Отправить\",\"action_cancel\":\"отменить\",\"upload_finishing\":\"завершение...\",\"no_contacts\":\"Ничего нет :-(\",\"contacts_not_found_short\":\"Нет контактов для запроса '{query}'\",\"title_all_contacts\":\"Все контакты\",\"error_invalid_id\":\"Неверный ID\",\"group_user_id_prompt\":\"ID чата или пользователя\",\"button_subscribe\":\"Подписаться\",\"topic_name_editing_placeholder\":\"Название чата\",\"button_create\":\"Создать\",\"badge_you\":\"вы\",\"badge_owner\":\"влад.\",\"update_available\":\"Есть новая версия приложения. Обновить.\"}};\n\n//# sourceURL=webpack:///./src/messages.json?"); /***/ }), @@ -378,7 +378,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var reac /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"react\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var react_dom__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react-dom */ \"react-dom\");\n/* harmony import */ var react_dom__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react_dom__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var react_intl__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! react-intl */ \"react-intl\");\n/* harmony import */ var react_intl__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(react_intl__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var firebase_app__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! firebase/app */ \"firebase/app\");\n/* harmony import */ var firebase_app__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(firebase_app__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var firebase_messaging__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! firebase/messaging */ \"firebase/messaging\");\n/* harmony import */ var firebase_messaging__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(firebase_messaging__WEBPACK_IMPORTED_MODULE_4__);\n/* harmony import */ var tinode_sdk__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! tinode-sdk */ \"../tinode-js/umd/tinode.prod.js\");\n/* harmony import */ var tinode_sdk__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(tinode_sdk__WEBPACK_IMPORTED_MODULE_5__);\n/* harmony import */ var _widgets_context_menu_jsx__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../widgets/context-menu.jsx */ \"./src/widgets/context-menu.jsx\");\n/* harmony import */ var _info_view_jsx__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./info-view.jsx */ \"./src/views/info-view.jsx\");\n/* harmony import */ var _messages_view_jsx__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./messages-view.jsx */ \"./src/views/messages-view.jsx\");\n/* harmony import */ var _sidepanel_view_jsx__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./sidepanel-view.jsx */ \"./src/views/sidepanel-view.jsx\");\n/* harmony import */ var _config_js__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../config.js */ \"./src/config.js\");\n/* harmony import */ var _lib_blob_helpers_js__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../lib/blob-helpers.js */ \"./src/lib/blob-helpers.js\");\n/* harmony import */ var _lib_host_name_js__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ../lib/host-name.js */ \"./src/lib/host-name.js\");\n/* harmony import */ var _lib_local_storage_js__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ../lib/local-storage.js */ \"./src/lib/local-storage.js\");\n/* harmony import */ var _lib_navigation_js__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ../lib/navigation.js */ \"./src/lib/navigation.js\");\n/* harmony import */ var _lib_utils_js__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ../lib/utils.js */ \"./src/lib/utils.js\");\nfunction _typeof(obj) { if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; } return _typeof(obj); }\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }\n\nfunction _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === \"object\" || typeof call === \"function\")) { return call; } return _assertThisInitialized(self); }\n\nfunction _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function\"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); }\n\nfunction _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }\n\nfunction _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return self; }\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nvar POP_SOUND = new Audio('audio/msg.mp3');\n\nvar TinodeWeb = function (_React$Component) {\n _inherits(TinodeWeb, _React$Component);\n\n function TinodeWeb(props) {\n var _this;\n\n _classCallCheck(this, TinodeWeb);\n\n _this = _possibleConstructorReturn(this, _getPrototypeOf(TinodeWeb).call(this, props));\n _this.state = _this.getBlankState();\n _this.handleResize = _this.handleResize.bind(_assertThisInitialized(_assertThisInitialized(_this)));\n _this.handleHashRoute = _this.handleHashRoute.bind(_assertThisInitialized(_assertThisInitialized(_this)));\n _this.handleOnline = _this.handleOnline.bind(_assertThisInitialized(_assertThisInitialized(_this)));\n _this.handleAppVisibility = _this.handleAppVisibility.bind(_assertThisInitialized(_assertThisInitialized(_this)));\n _this.handleReadTimer = _this.handleReadTimer.bind(_assertThisInitialized(_assertThisInitialized(_this)));\n _this.handleVisibilityEvent = _this.handleVisibilityEvent.bind(_assertThisInitialized(_assertThisInitialized(_this)));\n _this.handleError = _this.handleError.bind(_assertThisInitialized(_assertThisInitialized(_this)));\n _this.handleLoginRequest = _this.handleLoginRequest.bind(_assertThisInitialized(_assertThisInitialized(_this)));\n _this.handleConnected = _this.handleConnected.bind(_assertThisInitialized(_assertThisInitialized(_this)));\n _this.doLogin = _this.doLogin.bind(_assertThisInitialized(_assertThisInitialized(_this)));\n _this.handleCredentialsRequest = _this.handleCredentialsRequest.bind(_assertThisInitialized(_assertThisInitialized(_this)));\n _this.handleLoginSuccessful = _this.handleLoginSuccessful.bind(_assertThisInitialized(_assertThisInitialized(_this)));\n _this.handleDisconnect = _this.handleDisconnect.bind(_assertThisInitialized(_assertThisInitialized(_this)));\n _this.tnMeMetaDesc = _this.tnMeMetaDesc.bind(_assertThisInitialized(_assertThisInitialized(_this)));\n _this.tnMeContactUpdate = _this.tnMeContactUpdate.bind(_assertThisInitialized(_assertThisInitialized(_this)));\n _this.tnMeSubsUpdated = _this.tnMeSubsUpdated.bind(_assertThisInitialized(_assertThisInitialized(_this)));\n _this.resetContactList = _this.resetContactList.bind(_assertThisInitialized(_assertThisInitialized(_this)));\n _this.tnData = _this.tnData.bind(_assertThisInitialized(_assertThisInitialized(_this)));\n _this.tnInitFind = _this.tnInitFind.bind(_assertThisInitialized(_assertThisInitialized(_this)));\n _this.tnFndSubsUpdated = _this.tnFndSubsUpdated.bind(_assertThisInitialized(_assertThisInitialized(_this)));\n _this.handleSearchContacts = _this.handleSearchContacts.bind(_assertThisInitialized(_assertThisInitialized(_this)));\n _this.handleTopicSelected = _this.handleTopicSelected.bind(_assertThisInitialized(_assertThisInitialized(_this)));\n _this.handleHideMessagesView = _this.handleHideMessagesView.bind(_assertThisInitialized(_assertThisInitialized(_this)));\n _this.handleSendMessage = _this.handleSendMessage.bind(_assertThisInitialized(_assertThisInitialized(_this)));\n _this.handleNewAccount = _this.handleNewAccount.bind(_assertThisInitialized(_assertThisInitialized(_this)));\n _this.handleNewAccountRequest = _this.handleNewAccountRequest.bind(_assertThisInitialized(_assertThisInitialized(_this)));\n _this.handleUpdateAccountRequest = _this.handleUpdateAccountRequest.bind(_assertThisInitialized(_assertThisInitialized(_this)));\n _this.handleUpdateAccountTagsRequest = _this.handleUpdateAccountTagsRequest.bind(_assertThisInitialized(_assertThisInitialized(_this)));\n _this.handleSettings = _this.handleSettings.bind(_assertThisInitialized(_assertThisInitialized(_this)));\n _this.handleGlobalSettings = _this.handleGlobalSettings.bind(_assertThisInitialized(_assertThisInitialized(_this)));\n _this.handleToggleMessageSounds = _this.handleToggleMessageSounds.bind(_assertThisInitialized(_assertThisInitialized(_this)));\n _this.initDesktopAlerts = _this.initDesktopAlerts.bind(_assertThisInitialized(_assertThisInitialized(_this)));\n _this.togglePushToken = _this.togglePushToken.bind(_assertThisInitialized(_assertThisInitialized(_this)));\n _this.requestPushToken = _this.requestPushToken.bind(_assertThisInitialized(_assertThisInitialized(_this)));\n _this.handleSidepanelCancel = _this.handleSidepanelCancel.bind(_assertThisInitialized(_assertThisInitialized(_this)));\n _this.handleNewTopic = _this.handleNewTopic.bind(_assertThisInitialized(_assertThisInitialized(_this)));\n _this.handleNewTopicRequest = _this.handleNewTopicRequest.bind(_assertThisInitialized(_assertThisInitialized(_this)));\n _this.handleNewTopicCreated = _this.handleNewTopicCreated.bind(_assertThisInitialized(_assertThisInitialized(_this)));\n _this.handleTopicUpdateRequest = _this.handleTopicUpdateRequest.bind(_assertThisInitialized(_assertThisInitialized(_this)));\n _this.handleChangePermissions = _this.handleChangePermissions.bind(_assertThisInitialized(_assertThisInitialized(_this)));\n _this.handleTagsUpdated = _this.handleTagsUpdated.bind(_assertThisInitialized(_assertThisInitialized(_this)));\n _this.handleLogout = _this.handleLogout.bind(_assertThisInitialized(_assertThisInitialized(_this)));\n _this.handleLeaveUnsubRequest = _this.handleLeaveUnsubRequest.bind(_assertThisInitialized(_assertThisInitialized(_this)));\n _this.handleDialogCancel = _this.handleDialogCancel.bind(_assertThisInitialized(_assertThisInitialized(_this)));\n _this.handleShowContextMenu = _this.handleShowContextMenu.bind(_assertThisInitialized(_assertThisInitialized(_this)));\n _this.defaultTopicContextMenu = _this.defaultTopicContextMenu.bind(_assertThisInitialized(_assertThisInitialized(_this)));\n _this.handleHideContextMenu = _this.handleHideContextMenu.bind(_assertThisInitialized(_assertThisInitialized(_this)));\n _this.handleShowInfoView = _this.handleShowInfoView.bind(_assertThisInitialized(_assertThisInitialized(_this)));\n _this.handleHideInfoView = _this.handleHideInfoView.bind(_assertThisInitialized(_assertThisInitialized(_this)));\n _this.handleMemberUpdateRequest = _this.handleMemberUpdateRequest.bind(_assertThisInitialized(_assertThisInitialized(_this)));\n _this.handleValidateCredentialsRequest = _this.handleValidateCredentialsRequest.bind(_assertThisInitialized(_assertThisInitialized(_this)));\n _this.handlePasswordResetRequest = _this.handlePasswordResetRequest.bind(_assertThisInitialized(_assertThisInitialized(_this)));\n _this.handleResetPassword = _this.handleResetPassword.bind(_assertThisInitialized(_assertThisInitialized(_this)));\n return _this;\n }\n\n _createClass(TinodeWeb, [{\n key: \"getBlankState\",\n value: function getBlankState() {\n var _ref;\n\n var settings = _lib_local_storage_js__WEBPACK_IMPORTED_MODULE_13__[\"default\"].getObject(\"settings\") || {};\n return _ref = {\n connected: false,\n transport: settings.transport || null,\n serverAddress: settings.serverAddress || Object(_lib_host_name_js__WEBPACK_IMPORTED_MODULE_12__[\"detectServerAddress\"])(),\n serverVersion: \"no connection\",\n messageSounds: !settings.messageSoundsOff,\n desktopAlerts: settings.desktopAlerts,\n desktopAlertsEnabled: (Object(_lib_host_name_js__WEBPACK_IMPORTED_MODULE_12__[\"isSecureConnection\"])() || Object(_lib_host_name_js__WEBPACK_IMPORTED_MODULE_12__[\"isLocalHost\"])()) && typeof firebase_app__WEBPACK_IMPORTED_MODULE_3__ != 'undefined' && typeof navigator != 'undefined' && typeof FIREBASE_INIT != 'undefined',\n firebaseToken: _lib_local_storage_js__WEBPACK_IMPORTED_MODULE_13__[\"default\"].getObject(\"firebase-token\"),\n errorText: '',\n errorLevel: null,\n sidePanelSelected: 'login',\n sidePanelTitle: null,\n sidePanelAvatar: null,\n dialogSelected: null,\n contextMenuVisible: false,\n login: '',\n password: '',\n myUserId: null,\n liveConnection: navigator.onLine,\n topicSelected: '',\n topicSelectedOnline: false,\n topicSelectedAcs: null,\n newGroupTopicParams: null,\n loginDisabled: false,\n displayMobile: window.innerWidth <= _config_js__WEBPACK_IMPORTED_MODULE_10__[\"MEDIA_BREAKPOINT\"],\n showInfoPanel: false,\n mobilePanel: 'sidepanel'\n }, _defineProperty(_ref, \"contextMenuVisible\", false), _defineProperty(_ref, \"contextMenuBounds\", null), _defineProperty(_ref, \"contextMenuClickAt\", null), _defineProperty(_ref, \"contextMenuParams\", null), _defineProperty(_ref, \"contextMenuItems\", []), _defineProperty(_ref, \"chatList\", []), _defineProperty(_ref, \"searchResults\", []), _defineProperty(_ref, \"searchableContacts\", []), _defineProperty(_ref, \"credMethod\", undefined), _defineProperty(_ref, \"credCode\", undefined), _ref;\n }\n }, {\n key: \"componentDidMount\",\n value: function componentDidMount() {\n var _this2 = this;\n\n window.addEventListener('resize', this.handleResize);\n window.addEventListener('online', function (e) {\n _this2.handleOnline(true);\n });\n window.addEventListener('offline', function (e) {\n _this2.handleOnline(false);\n });\n window.addEventListener('hashchange', this.handleHashRoute);\n document.addEventListener('visibilitychange', this.handleVisibilityEvent);\n this.setState({\n viewportWidth: document.documentElement.clientWidth\n });\n this.tinode = TinodeWeb.tnSetup(this.state.serverAddress, this.state.transport);\n this.tinode.onConnect = this.handleConnected;\n this.tinode.onDisconnect = this.handleDisconnect;\n\n if (this.state.desktopAlertsEnabled) {\n try {\n this.fbPush = firebase_app__WEBPACK_IMPORTED_MODULE_3__[\"initializeApp\"](FIREBASE_INIT, _config_js__WEBPACK_IMPORTED_MODULE_10__[\"APP_NAME\"]).messaging();\n this.fbPush.usePublicVapidKey(FIREBASE_INIT.messagingVapidKey);\n navigator.serviceWorker.register('/service-worker.js').then(function (reg) {\n _this2.fbPush.useServiceWorker(reg);\n\n _this2.initDesktopAlerts();\n\n if (_this2.state.desktopAlerts) {\n if (!_this2.state.firebaseToken) {\n _this2.togglePushToken(true);\n } else {\n _this2.tinode.setDeviceToken(_this2.state.firebaseToken);\n }\n }\n }).catch(function (err) {\n console.log(\"Failed to register service worker:\", err);\n });\n } catch (err) {\n this.handleError(\"Failed to initialize push notifications\", 'err');\n console.log(\"Failed to initialize push notifications\", err);\n this.setState({\n desktopAlertsEnabled: false\n });\n }\n }\n\n var token = _lib_local_storage_js__WEBPACK_IMPORTED_MODULE_13__[\"default\"].getObject('keep-logged-in') ? _lib_local_storage_js__WEBPACK_IMPORTED_MODULE_13__[\"default\"].getObject('auth-token') : undefined;\n var parsedNav = _lib_navigation_js__WEBPACK_IMPORTED_MODULE_14__[\"default\"].parseUrlHash(window.location.hash);\n\n if (token) {\n token.expires = new Date(token.expires);\n this.tinode.setAuthToken(token);\n this.tinode.connect().catch(function (err) {\n _this2.handleError(err.message, 'err');\n });\n delete parsedNav.params.info;\n delete parsedNav.params.tab;\n parsedNav.path[0] = '';\n _lib_navigation_js__WEBPACK_IMPORTED_MODULE_14__[\"default\"].navigateTo(_lib_navigation_js__WEBPACK_IMPORTED_MODULE_14__[\"default\"].composeUrlHash(parsedNav.path, parsedNav.params));\n } else if (!parsedNav.params.token) {\n _lib_navigation_js__WEBPACK_IMPORTED_MODULE_14__[\"default\"].navigateTo('');\n }\n\n this.readTimer = null;\n this.readTimerCallback = null;\n this.handleHashRoute();\n }\n }, {\n key: \"componentWillUnmount\",\n value: function componentWillUnmount() {\n window.removeEventListener('resize', this.handleResize);\n window.removeEventListener('hashchange', this.handleHashRoute);\n document.removeEventListener('visibilitychange', this.handleVisibilityEvent);\n }\n }, {\n key: \"handleResize\",\n value: function handleResize() {\n var mobile = document.documentElement.clientWidth <= _config_js__WEBPACK_IMPORTED_MODULE_10__[\"MEDIA_BREAKPOINT\"];\n this.setState({\n viewportWidth: document.documentElement.clientWidth\n });\n\n if (this.state.displayMobile != mobile) {\n this.setState({\n displayMobile: mobile\n });\n }\n }\n }, {\n key: \"handleHashRoute\",\n value: function handleHashRoute() {\n var hash = _lib_navigation_js__WEBPACK_IMPORTED_MODULE_14__[\"default\"].parseUrlHash(window.location.hash);\n\n if (hash.path && hash.path.length > 0) {\n if (['register', 'settings', 'edit', 'cred', 'reset', 'newtpk', 'contacts', ''].includes(hash.path[0])) {\n this.setState({\n sidePanelSelected: hash.path[0]\n });\n } else {\n console.log(\"Unknown sidepanel view\", hash.path[0]);\n }\n\n if (hash.path.length > 1 && hash.path[1] != this.state.topicSelected) {\n this.setState({\n topicSelected: tinode_sdk__WEBPACK_IMPORTED_MODULE_5___default.a.topicType(hash.path[1]) ? hash.path[1] : null\n });\n }\n } else {\n this.setState({\n sidePanelSelected: ''\n });\n }\n\n if (hash.params.method) {\n this.setState({\n credMethod: hash.params.method\n });\n }\n\n if (hash.params.code) {\n this.setState({\n credCode: hash.params.code\n });\n }\n\n this.setState({\n showInfoPanel: hash.params.info,\n newTopicTabSelected: hash.params.tab\n });\n }\n }, {\n key: \"handleOnline\",\n value: function handleOnline(online) {\n var newState = {\n liveConnection: online\n };\n\n if (online) {\n this.handleError('', null);\n } else {\n this.handleError(\"No connection\", 'warn');\n }\n\n this.setState({\n liveConnection: online\n });\n }\n }, {\n key: \"handleAppVisibility\",\n value: function handleAppVisibility(visible, callback) {\n clearTimeout(this.readTimer);\n this.readTimerCallback = callback;\n\n if (visible && callback) {\n this.readTimer = setTimeout(callback, _config_js__WEBPACK_IMPORTED_MODULE_10__[\"READ_DELAY\"]);\n } else {\n this.readTimer = null;\n }\n }\n }, {\n key: \"handleReadTimer\",\n value: function handleReadTimer(callback) {\n this.handleAppVisibility(!document.hidden, callback);\n }\n }, {\n key: \"handleVisibilityEvent\",\n value: function handleVisibilityEvent() {\n this.handleAppVisibility(!document.hidden, this.readTimerCallback);\n }\n }, {\n key: \"handleError\",\n value: function handleError(err, level) {\n this.setState({\n errorText: err,\n errorLevel: level\n });\n }\n }, {\n key: \"handleLoginRequest\",\n value: function handleLoginRequest(login, password) {\n var _this3 = this;\n\n this.setState({\n loginDisabled: true,\n login: login,\n password: password\n });\n this.handleError('', null);\n\n if (this.tinode.isConnected()) {\n this.doLogin(login, password, {\n meth: this.state.credMethod,\n resp: this.state.credCode\n });\n } else {\n this.tinode.connect().catch(function (err) {\n _this3.setState({\n loginDisabled: false\n });\n\n _this3.handleError(err.message, 'err');\n });\n }\n }\n }, {\n key: \"handleConnected\",\n value: function handleConnected() {\n var params = this.tinode.getServerInfo();\n this.setState({\n serverVersion: params.ver + ' ' + (params.build ? params.build : 'none') + '; '\n });\n this.doLogin(this.state.login, this.state.password, {\n meth: this.state.credMethod,\n resp: this.state.credCode\n });\n }\n }, {\n key: \"doLogin\",\n value: function doLogin(login, password, cred) {\n var _this4 = this;\n\n if (this.tinode.isAuthenticated()) {\n _lib_navigation_js__WEBPACK_IMPORTED_MODULE_14__[\"default\"].navigateTo('');\n return;\n }\n\n cred = tinode_sdk__WEBPACK_IMPORTED_MODULE_5___default.a.credential(cred);\n var promise = null;\n var token = this.tinode.getAuthToken();\n\n if (login && password) {\n this.setState({\n password: null\n });\n promise = this.tinode.loginBasic(login, password, cred);\n } else if (token) {\n promise = this.tinode.loginToken(token.token, cred);\n }\n\n if (promise) {\n promise.then(function (ctrl) {\n if (ctrl.code >= 300 && ctrl.text === 'validate credentials') {\n if (cred) {\n _this4.handleError(\"Code does not match\", 'warn');\n }\n\n _this4.handleCredentialsRequest(ctrl.params);\n } else {\n _this4.handleLoginSuccessful();\n }\n }).catch(function (err) {\n _this4.setState({\n loginDisabled: false,\n credMethod: undefined,\n credCode: undefined\n });\n\n _this4.handleError(err.message, 'err');\n\n localStorage.removeItem('auth-token');\n _lib_navigation_js__WEBPACK_IMPORTED_MODULE_14__[\"default\"].navigateTo('');\n });\n } else {\n _lib_navigation_js__WEBPACK_IMPORTED_MODULE_14__[\"default\"].navigateTo('');\n this.setState({\n loginDisabled: false\n });\n }\n }\n }, {\n key: \"handleCredentialsRequest\",\n value: function handleCredentialsRequest(params) {\n var parsed = _lib_navigation_js__WEBPACK_IMPORTED_MODULE_14__[\"default\"].parseUrlHash(window.location.hash);\n parsed.path[0] = 'cred';\n parsed.params['method'] = params.cred[0];\n _lib_navigation_js__WEBPACK_IMPORTED_MODULE_14__[\"default\"].navigateTo(_lib_navigation_js__WEBPACK_IMPORTED_MODULE_14__[\"default\"].composeUrlHash(parsed.path, parsed.params));\n }\n }, {\n key: \"handleLoginSuccessful\",\n value: function handleLoginSuccessful() {\n var _this5 = this;\n\n this.handleError('', null);\n\n if (_lib_local_storage_js__WEBPACK_IMPORTED_MODULE_13__[\"default\"].getObject('keep-logged-in')) {\n _lib_local_storage_js__WEBPACK_IMPORTED_MODULE_13__[\"default\"].setObject('auth-token', this.tinode.getAuthToken());\n }\n\n var me = this.tinode.getMeTopic();\n me.onMetaDesc = this.tnMeMetaDesc;\n me.onContactUpdate = this.tnMeContactUpdate;\n me.onSubsUpdated = this.tnMeSubsUpdated;\n this.setState({\n connected: true,\n credMethod: undefined,\n credCode: undefined,\n myUserId: this.tinode.getCurrentUserID()\n });\n me.subscribe(me.startMetaQuery().withLaterSub().withDesc().build()).catch(function (err) {\n localStorage.removeItem('auth-token');\n\n _this5.handleError(err.message, 'err');\n\n _lib_navigation_js__WEBPACK_IMPORTED_MODULE_14__[\"default\"].navigateTo('');\n });\n _lib_navigation_js__WEBPACK_IMPORTED_MODULE_14__[\"default\"].navigateTo(_lib_navigation_js__WEBPACK_IMPORTED_MODULE_14__[\"default\"].setUrlSidePanel(window.location.hash, 'contacts'));\n }\n }, {\n key: \"handleDisconnect\",\n value: function handleDisconnect(err) {\n this.setState({\n connected: false,\n topicSelectedOnline: false,\n dialogSelected: null,\n errorText: err && err.message ? err.message : \"Disconnected\",\n errorLevel: err && err.message ? 'err' : 'warn',\n loginDisabled: false,\n contextMenuVisible: false,\n serverVersion: \"no connection\"\n });\n }\n }, {\n key: \"tnMeMetaDesc\",\n value: function tnMeMetaDesc(desc) {\n if (desc && desc.public) {\n this.setState({\n sidePanelTitle: desc.public.fn,\n sidePanelAvatar: Object(_lib_blob_helpers_js__WEBPACK_IMPORTED_MODULE_11__[\"makeImageUrl\"])(desc.public.photo)\n });\n }\n }\n }, {\n key: \"tnMeContactUpdate\",\n value: function tnMeContactUpdate(what, cont) {\n if (what == 'on' || what == 'off') {\n this.resetContactList();\n\n if (this.state.topicSelected == cont.topic) {\n this.setState({\n topicSelectedOnline: what == 'on'\n });\n }\n } else if (what == 'read') {\n this.resetContactList();\n } else if (what == 'msg') {\n if (this.state.topicSelected != cont.topic) {\n if (this.state.messageSounds) {\n POP_SOUND.play();\n }\n\n this.resetContactList();\n } else if (document.hidden && this.state.messageSounds) {\n POP_SOUND.play();\n }\n } else if (what == 'recv') {} else if (what == 'gone' || what == 'unsub') {\n if (this.state.topicSelected == cont.topic) {\n this.handleTopicSelected(null);\n }\n\n this.resetContactList();\n } else if (what == 'acs') {\n if (this.state.topicSelected == cont.topic) {\n this.setState({\n topicSelectedAcs: cont.acs\n });\n }\n } else if (what == 'del') {} else {\n console.log(\"Unsupported (yet) presence update:\" + what + \" in: \" + cont.topic);\n }\n }\n }, {\n key: \"tnMeSubsUpdated\",\n value: function tnMeSubsUpdated(unused) {\n this.resetContactList();\n }\n }, {\n key: \"resetContactList\",\n value: function resetContactList() {\n var _this6 = this;\n\n var newState = {\n chatList: []\n };\n this.tinode.getMeTopic().contacts(function (c) {\n newState.chatList.push(c);\n\n if (_this6.state.topicSelected == c.topic) {\n newState.topicSelectedOnline = c.online;\n newState.topicSelectedAcs = c.acs;\n }\n });\n newState.searchableContacts = TinodeWeb.prepareSearchableContacts(newState.chatList, this.state.searchResults);\n this.setState(newState);\n }\n }, {\n key: \"tnData\",\n value: function tnData(data) {\n var _this7 = this;\n\n var topic = this.tinode.getTopic(data.topic);\n\n if (topic.msgStatus(data) >= tinode_sdk__WEBPACK_IMPORTED_MODULE_5___default.a.MESSAGE_STATUS_SENT) {\n clearTimeout(this.receivedTimer);\n this.receivedTimer = setTimeout(function () {\n _this7.receivedTimer = undefined;\n topic.noteRecv(data.seq);\n }, _config_js__WEBPACK_IMPORTED_MODULE_10__[\"RECEIVED_DELAY\"]);\n }\n }\n }, {\n key: \"tnInitFind\",\n value: function tnInitFind() {\n var _this8 = this;\n\n var fnd = this.tinode.getFndTopic();\n\n if (fnd.isSubscribed()) {\n this.tnFndSubsUpdated();\n } else {\n fnd.onSubsUpdated = this.tnFndSubsUpdated;\n fnd.subscribe(fnd.startMetaQuery().withSub().withTags().build()).catch(function (err) {\n _this8.handleError(err.message, 'err');\n });\n }\n }\n }, {\n key: \"tnFndSubsUpdated\",\n value: function tnFndSubsUpdated() {\n var foundContacts = [];\n this.tinode.getFndTopic().contacts(function (s) {\n foundContacts.push(s);\n });\n this.setState({\n searchResults: foundContacts,\n searchableContacts: TinodeWeb.prepareSearchableContacts(this.state.chatList, foundContacts)\n });\n }\n }, {\n key: \"handleSearchContacts\",\n value: function handleSearchContacts(query) {\n var _this9 = this;\n\n var fnd = this.tinode.getFndTopic();\n fnd.setMeta({\n desc: {\n public: query\n }\n }).then(function (ctrl) {\n return fnd.getMeta(fnd.startMetaQuery().withSub().build());\n }).catch(function (err) {\n _this9.handleError(err.message, 'err');\n });\n }\n }, {\n key: \"handleTopicSelected\",\n value: function handleTopicSelected(topicName, unused_index, online, acs) {\n if (topicName) {\n this.setState({\n errorText: '',\n errorLevel: null,\n mobilePanel: 'topic-view',\n showInfoPanel: false\n });\n\n if (this.state.topicSelected != topicName) {\n this.setState({\n topicSelectedOnline: online,\n topicSelectedAcs: acs\n });\n _lib_navigation_js__WEBPACK_IMPORTED_MODULE_14__[\"default\"].navigateTo(_lib_navigation_js__WEBPACK_IMPORTED_MODULE_14__[\"default\"].setUrlTopic('', topicName));\n }\n } else {\n this.setState({\n errorText: '',\n errorLevel: null,\n mobilePanel: 'sidepanel',\n topicSelectedOnline: false,\n topicSelectedAcs: null,\n showInfoPanel: false\n });\n\n if (this.state.topicSelected) {\n _lib_navigation_js__WEBPACK_IMPORTED_MODULE_14__[\"default\"].navigateTo(_lib_navigation_js__WEBPACK_IMPORTED_MODULE_14__[\"default\"].setUrlTopic('', null));\n }\n }\n }\n }, {\n key: \"handleHideMessagesView\",\n value: function handleHideMessagesView() {\n this.setState({\n mobilePanel: 'sidepanel'\n });\n _lib_navigation_js__WEBPACK_IMPORTED_MODULE_14__[\"default\"].navigateTo(_lib_navigation_js__WEBPACK_IMPORTED_MODULE_14__[\"default\"].setUrlTopic(window.location.hash, null));\n }\n }, {\n key: \"handleSendMessage\",\n value: function handleSendMessage(msg, promise, uploader) {\n var _this10 = this;\n\n var topic = this.tinode.getTopic(this.state.topicSelected);\n msg = topic.createMessage(msg, false);\n msg._uploader = uploader;\n\n if (!topic.isSubscribed()) {\n if (!promise) {\n promise = Promise.resolve();\n }\n\n promise = promise.then(function () {\n return topic.subscribe();\n });\n }\n\n if (promise) {\n promise = promise.catch(function (err) {\n _this10.handleError(err.message, 'err');\n });\n }\n\n topic.publishDraft(msg, promise).catch(function (err) {\n _this10.handleError(err.message, 'err');\n });\n }\n }, {\n key: \"handleNewAccount\",\n value: function handleNewAccount() {\n _lib_navigation_js__WEBPACK_IMPORTED_MODULE_14__[\"default\"].navigateTo(_lib_navigation_js__WEBPACK_IMPORTED_MODULE_14__[\"default\"].setUrlSidePanel(window.location.hash, 'register'));\n }\n }, {\n key: \"handleNewAccountRequest\",\n value: function handleNewAccountRequest(login_, password_, public_, cred_, tags_) {\n var _this11 = this;\n\n this.tinode.connect(this.state.serverAddress).then(function () {\n return _this11.tinode.createAccountBasic(login_, password_, {\n public: public_,\n tags: tags_,\n cred: tinode_sdk__WEBPACK_IMPORTED_MODULE_5___default.a.credential(cred_)\n });\n }).then(function (ctrl) {\n if (ctrl.code >= 300 && ctrl.text == 'validate credentials') {\n _this11.handleCredentialsRequest(ctrl.params);\n } else {\n _this11.handleLoginSuccessful(_this11);\n }\n }).catch(function (err) {\n _this11.handleError(err.message, 'err');\n });\n }\n }, {\n key: \"handleUpdateAccountRequest\",\n value: function handleUpdateAccountRequest(password, pub, defacs) {\n var _this12 = this;\n\n if (pub || defacs) {\n this.tinode.getMeTopic().setMeta({\n desc: {\n public: pub,\n defacs: defacs\n }\n }).catch(function (err) {\n _this12.handleError(err.message, 'err');\n });\n }\n\n if (password) {\n this.tinode.updateAccountBasic(null, this.tinode.getCurrentLogin(), password).catch(function (err) {\n _this12.handleError(err.message, 'err');\n });\n }\n }\n }, {\n key: \"handleUpdateAccountTagsRequest\",\n value: function handleUpdateAccountTagsRequest(tags) {\n var _this13 = this;\n\n this.tinode.getFndTopic().setMeta({\n tags: tags\n }).catch(function (err) {\n _this13.handleError(err.message, 'err');\n });\n }\n }, {\n key: \"handleSettings\",\n value: function handleSettings() {\n _lib_navigation_js__WEBPACK_IMPORTED_MODULE_14__[\"default\"].navigateTo(_lib_navigation_js__WEBPACK_IMPORTED_MODULE_14__[\"default\"].setUrlSidePanel(window.location.hash, this.state.myUserId ? 'edit' : 'settings'));\n }\n }, {\n key: \"handleGlobalSettings\",\n value: function handleGlobalSettings(settings) {\n var serverAddress = settings.serverAddress || this.state.serverAddress;\n var transport = settings.transport || this.state.transport;\n\n if (this.tinode) {\n this.tinode.onDisconnect = undefined;\n this.tinode.disconnect();\n }\n\n this.tinode = TinodeWeb.tnSetup(serverAddress, transport);\n this.tinode.onConnect = this.handleConnected;\n this.tinode.onDisconnect = this.handleDisconnect;\n this.setState({\n serverAddress: serverAddress,\n transport: transport\n });\n _lib_local_storage_js__WEBPACK_IMPORTED_MODULE_13__[\"default\"].setObject('settings', {\n serverAddress: serverAddress,\n transport: transport\n });\n _lib_navigation_js__WEBPACK_IMPORTED_MODULE_14__[\"default\"].navigateTo(_lib_navigation_js__WEBPACK_IMPORTED_MODULE_14__[\"default\"].setUrlSidePanel(window.location.hash, ''));\n }\n }, {\n key: \"initDesktopAlerts\",\n value: function initDesktopAlerts() {\n var _this14 = this;\n\n this.fbPush.onTokenRefresh(function () {\n _this14.requestPushToken(true);\n });\n this.fbPush.onMessage(function (payload) {});\n }\n }, {\n key: \"togglePushToken\",\n value: function togglePushToken(enabled) {\n var _this15 = this;\n\n if (enabled) {\n if (!this.state.firebaseToken) {\n this.fbPush.requestPermission().then(function () {\n _this15.requestPushToken(true);\n }).catch(function (err) {\n _this15.handleError(err.message, 'err');\n\n _this15.setState({\n desktopAlerts: false,\n firebaseToken: null\n });\n\n _lib_local_storage_js__WEBPACK_IMPORTED_MODULE_13__[\"default\"].updateObject('settings', {\n desktopAlerts: false\n });\n console.log(\"Failed to get permission to notify.\", err);\n });\n } else {\n this.setState({\n desktopAlerts: true\n });\n _lib_local_storage_js__WEBPACK_IMPORTED_MODULE_13__[\"default\"].updateObject('settings', {\n desktopAlerts: true\n });\n }\n } else if (this.state.firebaseToken) {\n this.fbPush.deleteToken(this.state.firebaseToken).catch(function (err) {\n console.log(\"Unable to delete token.\", err);\n }).finally(function () {\n _lib_local_storage_js__WEBPACK_IMPORTED_MODULE_13__[\"default\"].updateObject('settings', {\n desktopAlerts: false\n });\n localStorage.removeItem('firebase-token');\n\n _this15.setState({\n desktopAlerts: false,\n firebaseToken: null\n });\n });\n } else {\n this.setState({\n desktopAlerts: false,\n firebaseToken: null\n });\n _lib_local_storage_js__WEBPACK_IMPORTED_MODULE_13__[\"default\"].updateObject('settings', {\n desktopAlerts: false\n });\n }\n }\n }, {\n key: \"requestPushToken\",\n value: function requestPushToken(sendToServer) {\n var _this16 = this;\n\n this.fbPush.getToken().then(function (refreshedToken) {\n if (refreshedToken != _this16.state.firebaseToken) {\n _this16.tinode.setDeviceToken(refreshedToken, sendToServer);\n\n _lib_local_storage_js__WEBPACK_IMPORTED_MODULE_13__[\"default\"].setObject('firebase-token', refreshedToken);\n }\n\n _this16.setState({\n firebaseToken: refreshedToken,\n desktopAlerts: true\n });\n\n _lib_local_storage_js__WEBPACK_IMPORTED_MODULE_13__[\"default\"].updateObject('settings', {\n desktopAlerts: true\n });\n }).catch(function (err) {\n _this16.handleError(err.message, 'err');\n\n console.log(\"Failed to retrieve firebase token\", err);\n });\n }\n }, {\n key: \"handleToggleMessageSounds\",\n value: function handleToggleMessageSounds(enabled) {\n this.setState({\n messageSounds: enabled\n });\n _lib_local_storage_js__WEBPACK_IMPORTED_MODULE_13__[\"default\"].updateObject('settings', {\n messageSoundsOff: !enabled\n });\n }\n }, {\n key: \"handleSidepanelCancel\",\n value: function handleSidepanelCancel() {\n var parsed = _lib_navigation_js__WEBPACK_IMPORTED_MODULE_14__[\"default\"].parseUrlHash(window.location.hash);\n parsed.path[0] = this.state.myUserId ? 'contacts' : '';\n\n if (parsed.params) {\n delete parsed.params.code;\n delete parsed.params.method;\n delete parsed.params.tab;\n }\n\n _lib_navigation_js__WEBPACK_IMPORTED_MODULE_14__[\"default\"].navigateTo(_lib_navigation_js__WEBPACK_IMPORTED_MODULE_14__[\"default\"].composeUrlHash(parsed.path, parsed.params));\n this.setState({\n errorText: '',\n errorLevel: null\n });\n }\n }, {\n key: \"handleNewTopic\",\n value: function handleNewTopic() {\n _lib_navigation_js__WEBPACK_IMPORTED_MODULE_14__[\"default\"].navigateTo(_lib_navigation_js__WEBPACK_IMPORTED_MODULE_14__[\"default\"].setUrlSidePanel(window.location.hash, 'newtpk'));\n }\n }, {\n key: \"handleNewTopicRequest\",\n value: function handleNewTopicRequest(peerName, pub, priv, tags) {\n var _this17 = this;\n\n var topicName = peerName || this.tinode.newGroupTopicName();\n\n if (!peerName) {\n this.setState({\n newGroupTopicParams: {\n desc: {\n public: pub,\n private: {\n comment: priv\n }\n },\n tags: tags\n }\n }, function () {\n _this17.handleTopicSelected(topicName);\n });\n } else {\n this.handleTopicSelected(topicName);\n }\n }\n }, {\n key: \"handleNewTopicCreated\",\n value: function handleNewTopicCreated(oldName, newName) {\n if (this.state.topicSelected == oldName && oldName != newName) {\n this.setState({\n topicSelected: newName\n }, function () {\n _lib_navigation_js__WEBPACK_IMPORTED_MODULE_14__[\"default\"].navigateTo(_lib_navigation_js__WEBPACK_IMPORTED_MODULE_14__[\"default\"].setUrlTopic('', newName));\n });\n }\n }\n }, {\n key: \"handleTopicUpdateRequest\",\n value: function handleTopicUpdateRequest(topicName, pub, priv, permissions) {\n var _this18 = this;\n\n var topic = this.tinode.getTopic(topicName);\n\n if (topic) {\n var params = {};\n\n if (pub) {\n params.public = pub;\n }\n\n if (priv) {\n params.private = priv === tinode_sdk__WEBPACK_IMPORTED_MODULE_5___default.a.DEL_CHAR ? tinode_sdk__WEBPACK_IMPORTED_MODULE_5___default.a.DEL_CHAR : {\n comment: priv\n };\n }\n\n if (permissions) {\n params.defacs = permissions;\n }\n\n topic.setMeta({\n desc: params\n }).catch(function (err) {\n _this18.handleError(err.message, 'err');\n });\n }\n }\n }, {\n key: \"handleChangePermissions\",\n value: function handleChangePermissions(topicName, mode, uid) {\n var _this19 = this;\n\n var topic = this.tinode.getTopic(topicName);\n\n if (topic) {\n var am = topic.getAccessMode();\n\n if (uid) {\n am.updateGiven(mode);\n mode = am.getGiven();\n } else {\n am.updateWant(mode);\n mode = am.getWant();\n }\n\n topic.setMeta({\n sub: {\n user: uid,\n mode: mode\n }\n }).catch(function (err) {\n _this19.handleError(err.message, 'err');\n });\n }\n }\n }, {\n key: \"handleTagsUpdated\",\n value: function handleTagsUpdated(topicName, tags) {\n var _this20 = this;\n\n var topic = this.tinode.getTopic(topicName);\n\n if (topic) {\n var instance = this;\n topic.setMeta({\n tags: tags\n }).catch(function (err) {\n _this20.handleError(err.message, 'err');\n });\n }\n }\n }, {\n key: \"handleLogout\",\n value: function handleLogout() {\n Object(_lib_utils_js__WEBPACK_IMPORTED_MODULE_15__[\"updateFavicon\"])(0);\n localStorage.removeItem('auth-token');\n\n if (this.tinode) {\n this.tinode.onDisconnect = undefined;\n this.tinode.disconnect();\n }\n\n this.setState(this.getBlankState());\n this.tinode = TinodeWeb.tnSetup(this.state.serverAddress, this.state.transport);\n this.tinode.onConnect = this.handleConnected;\n this.tinode.onDisconnect = this.handleDisconnect;\n _lib_navigation_js__WEBPACK_IMPORTED_MODULE_14__[\"default\"].navigateTo('');\n }\n }, {\n key: \"handleLeaveUnsubRequest\",\n value: function handleLeaveUnsubRequest(topicName) {\n var _this21 = this;\n\n var topic = this.tinode.getTopic(topicName);\n\n if (!topic) {\n return;\n }\n\n topic.leave(true).then(function (ctrl) {\n _lib_navigation_js__WEBPACK_IMPORTED_MODULE_14__[\"default\"].navigateTo(_lib_navigation_js__WEBPACK_IMPORTED_MODULE_14__[\"default\"].setUrlTopic(window.location.hash, ''));\n }).catch(function (err) {\n _this21.handleError(err.message, 'err');\n });\n }\n }, {\n key: \"handleDialogCancel\",\n value: function handleDialogCancel() {\n this.setState({\n dialogSelected: null\n });\n }\n }, {\n key: \"handleShowContextMenu\",\n value: function handleShowContextMenu(params, menuItems) {\n this.setState({\n contextMenuVisible: true,\n contextMenuClickAt: {\n x: params.x,\n y: params.y\n },\n contextMenuParams: params,\n contextMenuItems: menuItems || this.defaultTopicContextMenu(params.topicName),\n contextMenuBounds: react_dom__WEBPACK_IMPORTED_MODULE_1___default.a.findDOMNode(this).getBoundingClientRect()\n });\n }\n }, {\n key: \"defaultTopicContextMenu\",\n value: function defaultTopicContextMenu(topicName) {\n var topic = this.tinode.getTopic(topicName);\n var formatMessage = this.props.intl.formatMessage;\n var muted = false,\n blocked = false,\n subscribed = false,\n deleter = false;\n\n if (topic) {\n if (topic.isSubscribed()) {\n subscribed = true;\n var acs = topic.getAccessMode();\n muted = acs && acs.isMuted();\n blocked = acs && !acs.isJoiner();\n deleter = acs && acs.isDeleter();\n }\n }\n\n return [subscribed ? {\n title: formatMessage({\n id: 'menu_item_info'\n }),\n handler: this.handleShowInfoView\n } : null, subscribed ? 'messages_clear' : null, subscribed && deleter ? 'messages_clear_hard' : null, subscribed ? muted ? 'topic_unmute' : 'topic_mute' : null, subscribed ? blocked ? 'topic_unblock' : 'topic_block' : null, 'topic_delete'];\n }\n }, {\n key: \"handleHideContextMenu\",\n value: function handleHideContextMenu() {\n this.setState({\n contextMenuVisible: false,\n contextMenuClickAt: null,\n contextMenuParams: null,\n contextMenuBounds: null\n });\n }\n }, {\n key: \"handleShowInfoView\",\n value: function handleShowInfoView() {\n _lib_navigation_js__WEBPACK_IMPORTED_MODULE_14__[\"default\"].navigateTo(_lib_navigation_js__WEBPACK_IMPORTED_MODULE_14__[\"default\"].addUrlParam(window.location.hash, 'info', true));\n this.setState({\n showInfoPanel: true\n });\n }\n }, {\n key: \"handleHideInfoView\",\n value: function handleHideInfoView() {\n _lib_navigation_js__WEBPACK_IMPORTED_MODULE_14__[\"default\"].navigateTo(_lib_navigation_js__WEBPACK_IMPORTED_MODULE_14__[\"default\"].removeUrlParam(window.location.hash, 'info'));\n this.setState({\n showInfoPanel: false\n });\n }\n }, {\n key: \"handleMemberUpdateRequest\",\n value: function handleMemberUpdateRequest(topicName, added, removed) {\n var _this22 = this;\n\n if (!topicName) {\n return;\n }\n\n var topic = this.tinode.getTopic(topicName);\n\n if (!topic) {\n return;\n }\n\n if (added && added.length > 0) {\n added.map(function (uid) {\n topic.invite(uid, null).catch(function (err) {\n _this22.handleError(err.message, 'err');\n });\n });\n }\n\n if (removed && removed.length > 0) {\n removed.map(function (uid) {\n topic.delSubscription(uid).catch(function (err) {\n _this22.handleError(err.message, 'err');\n });\n });\n }\n }\n }, {\n key: \"handleValidateCredentialsRequest\",\n value: function handleValidateCredentialsRequest(cred, code) {\n this.setState({\n credMethod: cred,\n credCode: code\n });\n this.doLogin(null, null, {\n meth: cred,\n resp: code\n });\n }\n }, {\n key: \"handlePasswordResetRequest\",\n value: function handlePasswordResetRequest(method, value) {\n var _this23 = this;\n\n this.tinode.connect().then(function () {\n return _this23.tinode.requestResetAuthSecret('basic', method, value);\n }).catch(function (err) {\n _this23.handleError(err.message, 'err');\n });\n }\n }, {\n key: \"handleResetPassword\",\n value: function handleResetPassword(scheme, newPassword, token) {\n var _this24 = this;\n\n token = base64ReEncode(token);\n\n if (!token) {\n this.handleError(\"Invalid security token\", 'err');\n } else {\n this.tinode.connect().then(function () {\n return _this24.tinode.updateAccountBasic(null, null, newPassword, {\n token: token\n });\n }).catch(function (err) {\n _this24.handleError(err.message, 'err');\n });\n }\n }\n }, {\n key: \"render\",\n value: function render() {\n return react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"div\", {\n id: \"app-container\"\n }, this.state.contextMenuVisible ? react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_widgets_context_menu_jsx__WEBPACK_IMPORTED_MODULE_6__[\"default\"], {\n tinode: this.tinode,\n bounds: this.state.contextMenuBounds,\n clickAt: this.state.contextMenuClickAt,\n params: this.state.contextMenuParams,\n items: this.state.contextMenuItems,\n hide: this.handleHideContextMenu,\n onAction: this.handleContextMenuAction,\n onError: this.handleError\n }) : null, react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_sidepanel_view_jsx__WEBPACK_IMPORTED_MODULE_9__[\"default\"], {\n tinode: this.tinode,\n connected: this.state.connected,\n displayMobile: this.state.displayMobile,\n hideSelf: this.state.displayMobile && this.state.mobilePanel !== 'sidepanel',\n state: this.state.sidePanelSelected,\n title: this.state.sidePanelTitle,\n avatar: this.state.sidePanelAvatar,\n login: this.state.login,\n myUserId: this.state.myUserId,\n loginDisabled: this.state.loginDisabled,\n errorText: this.state.errorText,\n errorLevel: this.state.errorLevel,\n topicSelected: this.state.topicSelected,\n chatList: this.state.chatList,\n credMethod: this.state.credMethod,\n credCode: this.state.credCode,\n transport: this.state.transport,\n messageSounds: this.state.messageSounds,\n desktopAlerts: this.state.desktopAlerts,\n desktopAlertsEnabled: this.state.desktopAlertsEnabled,\n serverAddress: this.state.serverAddress,\n onGlobalSettings: this.handleGlobalSettings,\n onSignUp: this.handleNewAccount,\n onSettings: this.handleSettings,\n onLoginRequest: this.handleLoginRequest,\n onCreateAccount: this.handleNewAccountRequest,\n onUpdateAccount: this.handleUpdateAccountRequest,\n onUpdateAccountTags: this.handleUpdateAccountTagsRequest,\n onTogglePushNotifications: this.togglePushToken,\n onToggleMessageSounds: this.handleToggleMessageSounds,\n onTopicSelected: this.handleTopicSelected,\n onCreateTopic: this.handleNewTopicRequest,\n onNewTopic: this.handleNewTopic,\n onLogout: this.handleLogout,\n onCancel: this.handleSidepanelCancel,\n onError: this.handleError,\n onValidateCredentials: this.handleValidateCredentialsRequest,\n onPasswordResetRequest: this.handlePasswordResetRequest,\n onResetPassword: this.handleResetPassword,\n onInitFind: this.tnInitFind,\n searchResults: this.state.searchResults,\n onSearchContacts: this.handleSearchContacts,\n showContextMenu: this.handleShowContextMenu\n }), react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_messages_view_jsx__WEBPACK_IMPORTED_MODULE_8__[\"default\"], {\n tinode: this.tinode,\n connected: this.state.connected,\n online: this.state.topicSelectedOnline,\n acs: this.state.topicSelectedAcs,\n displayMobile: this.state.displayMobile,\n viewportWidth: this.state.viewportWidth,\n hideSelf: this.state.displayMobile && (this.state.mobilePanel !== 'topic-view' || this.state.showInfoPanel),\n topic: this.state.topicSelected,\n myUserId: this.state.myUserId,\n serverVersion: this.state.serverVersion,\n serverAddress: this.state.serverAddress,\n errorText: this.state.errorText,\n errorLevel: this.state.errorLevel,\n newGroupTopicParams: this.state.newGroupTopicParams,\n onHideMessagesView: this.handleHideMessagesView,\n onData: this.tnData,\n onError: this.handleError,\n onNewTopicCreated: this.handleNewTopicCreated,\n readTimerHandler: this.handleReadTimer,\n showContextMenu: this.handleShowContextMenu,\n sendMessage: this.handleSendMessage\n }), this.state.showInfoPanel ? react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_info_view_jsx__WEBPACK_IMPORTED_MODULE_7__[\"default\"], {\n tinode: this.tinode,\n connected: this.state.connected,\n displayMobile: this.state.displayMobile,\n topic: this.state.topicSelected,\n searchableContacts: this.state.searchableContacts,\n myUserId: this.state.myUserId,\n errorText: this.state.errorText,\n errorLevel: this.state.errorLevel,\n onTopicDescUpdate: this.handleTopicUpdateRequest,\n onCancel: this.handleHideInfoView,\n onChangePermissions: this.handleChangePermissions,\n onMemberUpdateRequest: this.handleMemberUpdateRequest,\n onLeaveTopic: this.handleLeaveUnsubRequest,\n onAddMember: this.handleManageGroupMembers,\n onTopicTagsUpdate: this.handleTagsUpdated,\n onInitFind: this.tnInitFind,\n onError: this.handleError,\n showContextMenu: this.handleShowContextMenu\n }) : null);\n }\n }], [{\n key: \"tnSetup\",\n value: function tnSetup(serverAddress, transport) {\n var tinode = new tinode_sdk__WEBPACK_IMPORTED_MODULE_5___default.a(_config_js__WEBPACK_IMPORTED_MODULE_10__[\"APP_NAME\"], serverAddress, _config_js__WEBPACK_IMPORTED_MODULE_10__[\"API_KEY\"], transport, Object(_lib_host_name_js__WEBPACK_IMPORTED_MODULE_12__[\"isSecureConnection\"])());\n tinode.enableLogging(true, true);\n return tinode;\n }\n }, {\n key: \"prepareSearchableContacts\",\n value: function prepareSearchableContacts(chatList, foundContacts) {\n var merged = {};\n var _iteratorNormalCompletion = true;\n var _didIteratorError = false;\n var _iteratorError = undefined;\n\n try {\n for (var _iterator = chatList[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {\n var c = _step.value;\n\n if (tinode_sdk__WEBPACK_IMPORTED_MODULE_5___default.a.topicType(c.topic) == 'p2p') {\n merged[c.topic] = {\n user: c.topic,\n updated: c.updated,\n public: c.public,\n private: c.private,\n acs: c.acs\n };\n }\n }\n } catch (err) {\n _didIteratorError = true;\n _iteratorError = err;\n } finally {\n try {\n if (!_iteratorNormalCompletion && _iterator.return != null) {\n _iterator.return();\n }\n } finally {\n if (_didIteratorError) {\n throw _iteratorError;\n }\n }\n }\n\n var _iteratorNormalCompletion2 = true;\n var _didIteratorError2 = false;\n var _iteratorError2 = undefined;\n\n try {\n for (var _iterator2 = foundContacts[Symbol.iterator](), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true) {\n var _c = _step2.value;\n\n if (!merged[_c.user]) {\n merged[_c.user] = _c;\n }\n }\n } catch (err) {\n _didIteratorError2 = true;\n _iteratorError2 = err;\n } finally {\n try {\n if (!_iteratorNormalCompletion2 && _iterator2.return != null) {\n _iterator2.return();\n }\n } finally {\n if (_didIteratorError2) {\n throw _iteratorError2;\n }\n }\n }\n\n return Object.values(merged);\n }\n }]);\n\n return TinodeWeb;\n}(react__WEBPACK_IMPORTED_MODULE_0___default.a.Component);\n\n;\n/* harmony default export */ __webpack_exports__[\"default\"] = (Object(react_intl__WEBPACK_IMPORTED_MODULE_2__[\"injectIntl\"])(TinodeWeb));\n\n//# sourceURL=webpack:///./src/views/tinode-web.jsx?"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"react\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var react_dom__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react-dom */ \"react-dom\");\n/* harmony import */ var react_dom__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react_dom__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var react_intl__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! react-intl */ \"react-intl\");\n/* harmony import */ var react_intl__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(react_intl__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var firebase_app__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! firebase/app */ \"firebase/app\");\n/* harmony import */ var firebase_app__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(firebase_app__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var firebase_messaging__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! firebase/messaging */ \"firebase/messaging\");\n/* harmony import */ var firebase_messaging__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(firebase_messaging__WEBPACK_IMPORTED_MODULE_4__);\n/* harmony import */ var tinode_sdk__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! tinode-sdk */ \"../tinode-js/umd/tinode.prod.js\");\n/* harmony import */ var tinode_sdk__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(tinode_sdk__WEBPACK_IMPORTED_MODULE_5__);\n/* harmony import */ var _widgets_context_menu_jsx__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../widgets/context-menu.jsx */ \"./src/widgets/context-menu.jsx\");\n/* harmony import */ var _info_view_jsx__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./info-view.jsx */ \"./src/views/info-view.jsx\");\n/* harmony import */ var _messages_view_jsx__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./messages-view.jsx */ \"./src/views/messages-view.jsx\");\n/* harmony import */ var _sidepanel_view_jsx__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./sidepanel-view.jsx */ \"./src/views/sidepanel-view.jsx\");\n/* harmony import */ var _config_js__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../config.js */ \"./src/config.js\");\n/* harmony import */ var _lib_blob_helpers_js__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../lib/blob-helpers.js */ \"./src/lib/blob-helpers.js\");\n/* harmony import */ var _lib_host_name_js__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ../lib/host-name.js */ \"./src/lib/host-name.js\");\n/* harmony import */ var _lib_local_storage_js__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ../lib/local-storage.js */ \"./src/lib/local-storage.js\");\n/* harmony import */ var _lib_navigation_js__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ../lib/navigation.js */ \"./src/lib/navigation.js\");\n/* harmony import */ var _lib_utils_js__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ../lib/utils.js */ \"./src/lib/utils.js\");\nfunction _typeof(obj) { if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; } return _typeof(obj); }\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }\n\nfunction _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === \"object\" || typeof call === \"function\")) { return call; } return _assertThisInitialized(self); }\n\nfunction _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function\"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); }\n\nfunction _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }\n\nfunction _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return self; }\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nvar POP_SOUND = new Audio('audio/msg.mp3');\nvar messages = Object(react_intl__WEBPACK_IMPORTED_MODULE_2__[\"defineMessages\"])({\n update_available: {\n \"id\": \"update_available\",\n \"defaultMessage\": \"Update available. Reload.\"\n }\n});\n\nvar TinodeWeb = function (_React$Component) {\n _inherits(TinodeWeb, _React$Component);\n\n function TinodeWeb(props) {\n var _this;\n\n _classCallCheck(this, TinodeWeb);\n\n _this = _possibleConstructorReturn(this, _getPrototypeOf(TinodeWeb).call(this, props));\n _this.state = _this.getBlankState();\n _this.handleResize = _this.handleResize.bind(_assertThisInitialized(_assertThisInitialized(_this)));\n _this.handleHashRoute = _this.handleHashRoute.bind(_assertThisInitialized(_assertThisInitialized(_this)));\n _this.handleOnline = _this.handleOnline.bind(_assertThisInitialized(_assertThisInitialized(_this)));\n _this.checkForAppUpdate = _this.checkForAppUpdate.bind(_assertThisInitialized(_assertThisInitialized(_this)));\n _this.handleAppVisibility = _this.handleAppVisibility.bind(_assertThisInitialized(_assertThisInitialized(_this)));\n _this.handleReadTimer = _this.handleReadTimer.bind(_assertThisInitialized(_assertThisInitialized(_this)));\n _this.handleVisibilityEvent = _this.handleVisibilityEvent.bind(_assertThisInitialized(_assertThisInitialized(_this)));\n _this.handleError = _this.handleError.bind(_assertThisInitialized(_assertThisInitialized(_this)));\n _this.handleLoginRequest = _this.handleLoginRequest.bind(_assertThisInitialized(_assertThisInitialized(_this)));\n _this.handleConnected = _this.handleConnected.bind(_assertThisInitialized(_assertThisInitialized(_this)));\n _this.doLogin = _this.doLogin.bind(_assertThisInitialized(_assertThisInitialized(_this)));\n _this.handleCredentialsRequest = _this.handleCredentialsRequest.bind(_assertThisInitialized(_assertThisInitialized(_this)));\n _this.handleLoginSuccessful = _this.handleLoginSuccessful.bind(_assertThisInitialized(_assertThisInitialized(_this)));\n _this.handleDisconnect = _this.handleDisconnect.bind(_assertThisInitialized(_assertThisInitialized(_this)));\n _this.tnMeMetaDesc = _this.tnMeMetaDesc.bind(_assertThisInitialized(_assertThisInitialized(_this)));\n _this.tnMeContactUpdate = _this.tnMeContactUpdate.bind(_assertThisInitialized(_assertThisInitialized(_this)));\n _this.tnMeSubsUpdated = _this.tnMeSubsUpdated.bind(_assertThisInitialized(_assertThisInitialized(_this)));\n _this.resetContactList = _this.resetContactList.bind(_assertThisInitialized(_assertThisInitialized(_this)));\n _this.tnData = _this.tnData.bind(_assertThisInitialized(_assertThisInitialized(_this)));\n _this.tnInitFind = _this.tnInitFind.bind(_assertThisInitialized(_assertThisInitialized(_this)));\n _this.tnFndSubsUpdated = _this.tnFndSubsUpdated.bind(_assertThisInitialized(_assertThisInitialized(_this)));\n _this.handleSearchContacts = _this.handleSearchContacts.bind(_assertThisInitialized(_assertThisInitialized(_this)));\n _this.handleTopicSelected = _this.handleTopicSelected.bind(_assertThisInitialized(_assertThisInitialized(_this)));\n _this.handleHideMessagesView = _this.handleHideMessagesView.bind(_assertThisInitialized(_assertThisInitialized(_this)));\n _this.handleSendMessage = _this.handleSendMessage.bind(_assertThisInitialized(_assertThisInitialized(_this)));\n _this.handleNewAccount = _this.handleNewAccount.bind(_assertThisInitialized(_assertThisInitialized(_this)));\n _this.handleNewAccountRequest = _this.handleNewAccountRequest.bind(_assertThisInitialized(_assertThisInitialized(_this)));\n _this.handleUpdateAccountRequest = _this.handleUpdateAccountRequest.bind(_assertThisInitialized(_assertThisInitialized(_this)));\n _this.handleUpdateAccountTagsRequest = _this.handleUpdateAccountTagsRequest.bind(_assertThisInitialized(_assertThisInitialized(_this)));\n _this.handleSettings = _this.handleSettings.bind(_assertThisInitialized(_assertThisInitialized(_this)));\n _this.handleGlobalSettings = _this.handleGlobalSettings.bind(_assertThisInitialized(_assertThisInitialized(_this)));\n _this.handleToggleMessageSounds = _this.handleToggleMessageSounds.bind(_assertThisInitialized(_assertThisInitialized(_this)));\n _this.initDesktopAlerts = _this.initDesktopAlerts.bind(_assertThisInitialized(_assertThisInitialized(_this)));\n _this.togglePushToken = _this.togglePushToken.bind(_assertThisInitialized(_assertThisInitialized(_this)));\n _this.requestPushToken = _this.requestPushToken.bind(_assertThisInitialized(_assertThisInitialized(_this)));\n _this.handleSidepanelCancel = _this.handleSidepanelCancel.bind(_assertThisInitialized(_assertThisInitialized(_this)));\n _this.handleNewTopic = _this.handleNewTopic.bind(_assertThisInitialized(_assertThisInitialized(_this)));\n _this.handleNewTopicRequest = _this.handleNewTopicRequest.bind(_assertThisInitialized(_assertThisInitialized(_this)));\n _this.handleNewTopicCreated = _this.handleNewTopicCreated.bind(_assertThisInitialized(_assertThisInitialized(_this)));\n _this.handleTopicUpdateRequest = _this.handleTopicUpdateRequest.bind(_assertThisInitialized(_assertThisInitialized(_this)));\n _this.handleChangePermissions = _this.handleChangePermissions.bind(_assertThisInitialized(_assertThisInitialized(_this)));\n _this.handleTagsUpdated = _this.handleTagsUpdated.bind(_assertThisInitialized(_assertThisInitialized(_this)));\n _this.handleLogout = _this.handleLogout.bind(_assertThisInitialized(_assertThisInitialized(_this)));\n _this.handleLeaveUnsubRequest = _this.handleLeaveUnsubRequest.bind(_assertThisInitialized(_assertThisInitialized(_this)));\n _this.handleDialogCancel = _this.handleDialogCancel.bind(_assertThisInitialized(_assertThisInitialized(_this)));\n _this.handleShowContextMenu = _this.handleShowContextMenu.bind(_assertThisInitialized(_assertThisInitialized(_this)));\n _this.defaultTopicContextMenu = _this.defaultTopicContextMenu.bind(_assertThisInitialized(_assertThisInitialized(_this)));\n _this.handleHideContextMenu = _this.handleHideContextMenu.bind(_assertThisInitialized(_assertThisInitialized(_this)));\n _this.handleShowInfoView = _this.handleShowInfoView.bind(_assertThisInitialized(_assertThisInitialized(_this)));\n _this.handleHideInfoView = _this.handleHideInfoView.bind(_assertThisInitialized(_assertThisInitialized(_this)));\n _this.handleMemberUpdateRequest = _this.handleMemberUpdateRequest.bind(_assertThisInitialized(_assertThisInitialized(_this)));\n _this.handleValidateCredentialsRequest = _this.handleValidateCredentialsRequest.bind(_assertThisInitialized(_assertThisInitialized(_this)));\n _this.handlePasswordResetRequest = _this.handlePasswordResetRequest.bind(_assertThisInitialized(_assertThisInitialized(_this)));\n _this.handleResetPassword = _this.handleResetPassword.bind(_assertThisInitialized(_assertThisInitialized(_this)));\n return _this;\n }\n\n _createClass(TinodeWeb, [{\n key: \"getBlankState\",\n value: function getBlankState() {\n var _ref;\n\n var settings = _lib_local_storage_js__WEBPACK_IMPORTED_MODULE_13__[\"default\"].getObject(\"settings\") || {};\n return _ref = {\n connected: false,\n transport: settings.transport || null,\n serverAddress: settings.serverAddress || Object(_lib_host_name_js__WEBPACK_IMPORTED_MODULE_12__[\"detectServerAddress\"])(),\n serverVersion: \"no connection\",\n messageSounds: !settings.messageSoundsOff,\n desktopAlerts: settings.desktopAlerts,\n desktopAlertsEnabled: (Object(_lib_host_name_js__WEBPACK_IMPORTED_MODULE_12__[\"isSecureConnection\"])() || Object(_lib_host_name_js__WEBPACK_IMPORTED_MODULE_12__[\"isLocalHost\"])()) && typeof firebase_app__WEBPACK_IMPORTED_MODULE_3__ != 'undefined' && typeof navigator != 'undefined' && typeof FIREBASE_INIT != 'undefined',\n firebaseToken: _lib_local_storage_js__WEBPACK_IMPORTED_MODULE_13__[\"default\"].getObject(\"firebase-token\"),\n errorText: '',\n errorLevel: null,\n sidePanelSelected: 'login',\n sidePanelTitle: null,\n sidePanelAvatar: null,\n dialogSelected: null,\n contextMenuVisible: false,\n login: '',\n password: '',\n myUserId: null,\n liveConnection: navigator.onLine,\n topicSelected: '',\n topicSelectedOnline: false,\n topicSelectedAcs: null,\n newGroupTopicParams: null,\n loginDisabled: false,\n displayMobile: window.innerWidth <= _config_js__WEBPACK_IMPORTED_MODULE_10__[\"MEDIA_BREAKPOINT\"],\n showInfoPanel: false,\n mobilePanel: 'sidepanel'\n }, _defineProperty(_ref, \"contextMenuVisible\", false), _defineProperty(_ref, \"contextMenuBounds\", null), _defineProperty(_ref, \"contextMenuClickAt\", null), _defineProperty(_ref, \"contextMenuParams\", null), _defineProperty(_ref, \"contextMenuItems\", []), _defineProperty(_ref, \"chatList\", []), _defineProperty(_ref, \"searchResults\", []), _defineProperty(_ref, \"searchableContacts\", []), _defineProperty(_ref, \"credMethod\", undefined), _defineProperty(_ref, \"credCode\", undefined), _ref;\n }\n }, {\n key: \"componentDidMount\",\n value: function componentDidMount() {\n var _this2 = this;\n\n window.addEventListener('resize', this.handleResize);\n window.addEventListener('online', function (e) {\n _this2.handleOnline(true);\n });\n window.addEventListener('offline', function (e) {\n _this2.handleOnline(false);\n });\n window.addEventListener('hashchange', this.handleHashRoute);\n document.addEventListener('visibilitychange', this.handleVisibilityEvent);\n this.setState({\n viewportWidth: document.documentElement.clientWidth\n });\n this.tinode = TinodeWeb.tnSetup(this.state.serverAddress, this.state.transport);\n this.tinode.onConnect = this.handleConnected;\n this.tinode.onDisconnect = this.handleDisconnect;\n\n if (this.state.desktopAlertsEnabled) {\n try {\n this.fbPush = firebase_app__WEBPACK_IMPORTED_MODULE_3__[\"initializeApp\"](FIREBASE_INIT, _config_js__WEBPACK_IMPORTED_MODULE_10__[\"APP_NAME\"]).messaging();\n this.fbPush.usePublicVapidKey(FIREBASE_INIT.messagingVapidKey);\n navigator.serviceWorker.register('/service-worker.js').then(function (reg) {\n _this2.checkForAppUpdate(reg, function () {});\n\n _this2.fbPush.useServiceWorker(reg);\n\n _this2.initDesktopAlerts();\n\n if (_this2.state.desktopAlerts) {\n if (!_this2.state.firebaseToken) {\n _this2.togglePushToken(true);\n } else {\n _this2.tinode.setDeviceToken(_this2.state.firebaseToken);\n }\n }\n }).catch(function (err) {\n console.log(\"Failed to register service worker:\", err);\n });\n } catch (err) {\n this.handleError(\"Failed to initialize push notifications\", 'err');\n console.log(\"Failed to initialize push notifications\", err);\n this.setState({\n desktopAlertsEnabled: false\n });\n }\n }\n\n var token = _lib_local_storage_js__WEBPACK_IMPORTED_MODULE_13__[\"default\"].getObject('keep-logged-in') ? _lib_local_storage_js__WEBPACK_IMPORTED_MODULE_13__[\"default\"].getObject('auth-token') : undefined;\n var parsedNav = _lib_navigation_js__WEBPACK_IMPORTED_MODULE_14__[\"default\"].parseUrlHash(window.location.hash);\n\n if (token) {\n token.expires = new Date(token.expires);\n this.tinode.setAuthToken(token);\n this.tinode.connect().catch(function (err) {\n _this2.handleError(err.message, 'err');\n });\n delete parsedNav.params.info;\n delete parsedNav.params.tab;\n parsedNav.path[0] = '';\n _lib_navigation_js__WEBPACK_IMPORTED_MODULE_14__[\"default\"].navigateTo(_lib_navigation_js__WEBPACK_IMPORTED_MODULE_14__[\"default\"].composeUrlHash(parsedNav.path, parsedNav.params));\n } else if (!parsedNav.params.token) {\n _lib_navigation_js__WEBPACK_IMPORTED_MODULE_14__[\"default\"].navigateTo('');\n }\n\n this.readTimer = null;\n this.readTimerCallback = null;\n this.handleHashRoute();\n }\n }, {\n key: \"componentWillUnmount\",\n value: function componentWillUnmount() {\n window.removeEventListener('resize', this.handleResize);\n window.removeEventListener('hashchange', this.handleHashRoute);\n document.removeEventListener('visibilitychange', this.handleVisibilityEvent);\n }\n }, {\n key: \"handleResize\",\n value: function handleResize() {\n var mobile = document.documentElement.clientWidth <= _config_js__WEBPACK_IMPORTED_MODULE_10__[\"MEDIA_BREAKPOINT\"];\n this.setState({\n viewportWidth: document.documentElement.clientWidth\n });\n\n if (this.state.displayMobile != mobile) {\n this.setState({\n displayMobile: mobile\n });\n }\n }\n }, {\n key: \"checkForAppUpdate\",\n value: function checkForAppUpdate(reg) {\n var _this3 = this;\n\n var formatHTMLMessage = this.props.intl.formatHTMLMessage;\n\n reg.onupdatefound = function () {\n var installingWorker = reg.installing;\n\n installingWorker.onstatechange = function () {\n if (installingWorker.state == 'installed' && navigator.serviceWorker.controller) {\n _this3.handleError(formatHTMLMessage(messages.update_available), 'info');\n }\n };\n };\n }\n }, {\n key: \"handleHashRoute\",\n value: function handleHashRoute() {\n var hash = _lib_navigation_js__WEBPACK_IMPORTED_MODULE_14__[\"default\"].parseUrlHash(window.location.hash);\n\n if (hash.path && hash.path.length > 0) {\n if (['register', 'settings', 'edit', 'cred', 'reset', 'newtpk', 'contacts', ''].includes(hash.path[0])) {\n this.setState({\n sidePanelSelected: hash.path[0]\n });\n } else {\n console.log(\"Unknown sidepanel view\", hash.path[0]);\n }\n\n if (hash.path.length > 1 && hash.path[1] != this.state.topicSelected) {\n this.setState({\n topicSelected: tinode_sdk__WEBPACK_IMPORTED_MODULE_5___default.a.topicType(hash.path[1]) ? hash.path[1] : null\n });\n }\n } else {\n this.setState({\n sidePanelSelected: ''\n });\n }\n\n if (hash.params.method) {\n this.setState({\n credMethod: hash.params.method\n });\n }\n\n if (hash.params.code) {\n this.setState({\n credCode: hash.params.code\n });\n }\n\n this.setState({\n showInfoPanel: hash.params.info,\n newTopicTabSelected: hash.params.tab\n });\n }\n }, {\n key: \"handleOnline\",\n value: function handleOnline(online) {\n var newState = {\n liveConnection: online\n };\n\n if (online) {\n this.handleError('', null);\n } else {\n this.handleError(\"No connection\", 'warn');\n }\n\n this.setState({\n liveConnection: online\n });\n }\n }, {\n key: \"handleAppVisibility\",\n value: function handleAppVisibility(visible, callback) {\n clearTimeout(this.readTimer);\n this.readTimerCallback = callback;\n\n if (visible && callback) {\n this.readTimer = setTimeout(callback, _config_js__WEBPACK_IMPORTED_MODULE_10__[\"READ_DELAY\"]);\n } else {\n this.readTimer = null;\n }\n }\n }, {\n key: \"handleReadTimer\",\n value: function handleReadTimer(callback) {\n this.handleAppVisibility(!document.hidden, callback);\n }\n }, {\n key: \"handleVisibilityEvent\",\n value: function handleVisibilityEvent() {\n this.handleAppVisibility(!document.hidden, this.readTimerCallback);\n }\n }, {\n key: \"handleError\",\n value: function handleError(err, level) {\n this.setState({\n errorText: err,\n errorLevel: level\n });\n }\n }, {\n key: \"handleLoginRequest\",\n value: function handleLoginRequest(login, password) {\n var _this4 = this;\n\n this.setState({\n loginDisabled: true,\n login: login,\n password: password\n });\n this.handleError('', null);\n\n if (this.tinode.isConnected()) {\n this.doLogin(login, password, {\n meth: this.state.credMethod,\n resp: this.state.credCode\n });\n } else {\n this.tinode.connect().catch(function (err) {\n _this4.setState({\n loginDisabled: false\n });\n\n _this4.handleError(err.message, 'err');\n });\n }\n }\n }, {\n key: \"handleConnected\",\n value: function handleConnected() {\n var params = this.tinode.getServerInfo();\n this.setState({\n serverVersion: params.ver + ' ' + (params.build ? params.build : 'none') + '; '\n });\n this.doLogin(this.state.login, this.state.password, {\n meth: this.state.credMethod,\n resp: this.state.credCode\n });\n }\n }, {\n key: \"doLogin\",\n value: function doLogin(login, password, cred) {\n var _this5 = this;\n\n if (this.tinode.isAuthenticated()) {\n _lib_navigation_js__WEBPACK_IMPORTED_MODULE_14__[\"default\"].navigateTo('');\n return;\n }\n\n cred = tinode_sdk__WEBPACK_IMPORTED_MODULE_5___default.a.credential(cred);\n var promise = null;\n var token = this.tinode.getAuthToken();\n\n if (login && password) {\n this.setState({\n password: null\n });\n promise = this.tinode.loginBasic(login, password, cred);\n } else if (token) {\n promise = this.tinode.loginToken(token.token, cred);\n }\n\n if (promise) {\n promise.then(function (ctrl) {\n if (ctrl.code >= 300 && ctrl.text === 'validate credentials') {\n if (cred) {\n _this5.handleError(\"Code does not match\", 'warn');\n }\n\n _this5.handleCredentialsRequest(ctrl.params);\n } else {\n _this5.handleLoginSuccessful();\n }\n }).catch(function (err) {\n _this5.setState({\n loginDisabled: false,\n credMethod: undefined,\n credCode: undefined\n });\n\n _this5.handleError(err.message, 'err');\n\n localStorage.removeItem('auth-token');\n _lib_navigation_js__WEBPACK_IMPORTED_MODULE_14__[\"default\"].navigateTo('');\n });\n } else {\n _lib_navigation_js__WEBPACK_IMPORTED_MODULE_14__[\"default\"].navigateTo('');\n this.setState({\n loginDisabled: false\n });\n }\n }\n }, {\n key: \"handleCredentialsRequest\",\n value: function handleCredentialsRequest(params) {\n var parsed = _lib_navigation_js__WEBPACK_IMPORTED_MODULE_14__[\"default\"].parseUrlHash(window.location.hash);\n parsed.path[0] = 'cred';\n parsed.params['method'] = params.cred[0];\n _lib_navigation_js__WEBPACK_IMPORTED_MODULE_14__[\"default\"].navigateTo(_lib_navigation_js__WEBPACK_IMPORTED_MODULE_14__[\"default\"].composeUrlHash(parsed.path, parsed.params));\n }\n }, {\n key: \"handleLoginSuccessful\",\n value: function handleLoginSuccessful() {\n var _this6 = this;\n\n this.handleError('', null);\n\n if (_lib_local_storage_js__WEBPACK_IMPORTED_MODULE_13__[\"default\"].getObject('keep-logged-in')) {\n _lib_local_storage_js__WEBPACK_IMPORTED_MODULE_13__[\"default\"].setObject('auth-token', this.tinode.getAuthToken());\n }\n\n var me = this.tinode.getMeTopic();\n me.onMetaDesc = this.tnMeMetaDesc;\n me.onContactUpdate = this.tnMeContactUpdate;\n me.onSubsUpdated = this.tnMeSubsUpdated;\n this.setState({\n connected: true,\n credMethod: undefined,\n credCode: undefined,\n myUserId: this.tinode.getCurrentUserID()\n });\n me.subscribe(me.startMetaQuery().withLaterSub().withDesc().build()).catch(function (err) {\n localStorage.removeItem('auth-token');\n\n _this6.handleError(err.message, 'err');\n\n _lib_navigation_js__WEBPACK_IMPORTED_MODULE_14__[\"default\"].navigateTo('');\n });\n _lib_navigation_js__WEBPACK_IMPORTED_MODULE_14__[\"default\"].navigateTo(_lib_navigation_js__WEBPACK_IMPORTED_MODULE_14__[\"default\"].setUrlSidePanel(window.location.hash, 'contacts'));\n }\n }, {\n key: \"handleDisconnect\",\n value: function handleDisconnect(err) {\n this.setState({\n connected: false,\n topicSelectedOnline: false,\n dialogSelected: null,\n errorText: err && err.message ? err.message : \"Disconnected\",\n errorLevel: err && err.message ? 'err' : 'warn',\n loginDisabled: false,\n contextMenuVisible: false,\n serverVersion: \"no connection\"\n });\n }\n }, {\n key: \"tnMeMetaDesc\",\n value: function tnMeMetaDesc(desc) {\n if (desc && desc.public) {\n this.setState({\n sidePanelTitle: desc.public.fn,\n sidePanelAvatar: Object(_lib_blob_helpers_js__WEBPACK_IMPORTED_MODULE_11__[\"makeImageUrl\"])(desc.public.photo)\n });\n }\n }\n }, {\n key: \"tnMeContactUpdate\",\n value: function tnMeContactUpdate(what, cont) {\n if (what == 'on' || what == 'off') {\n this.resetContactList();\n\n if (this.state.topicSelected == cont.topic) {\n this.setState({\n topicSelectedOnline: what == 'on'\n });\n }\n } else if (what == 'read') {\n this.resetContactList();\n } else if (what == 'msg') {\n if (this.state.topicSelected != cont.topic) {\n if (this.state.messageSounds) {\n POP_SOUND.play();\n }\n\n this.resetContactList();\n } else if (document.hidden && this.state.messageSounds) {\n POP_SOUND.play();\n }\n } else if (what == 'recv') {} else if (what == 'gone' || what == 'unsub') {\n if (this.state.topicSelected == cont.topic) {\n this.handleTopicSelected(null);\n }\n\n this.resetContactList();\n } else if (what == 'acs') {\n if (this.state.topicSelected == cont.topic) {\n this.setState({\n topicSelectedAcs: cont.acs\n });\n }\n } else if (what == 'del') {} else {\n console.log(\"Unsupported (yet) presence update:\" + what + \" in: \" + cont.topic);\n }\n }\n }, {\n key: \"tnMeSubsUpdated\",\n value: function tnMeSubsUpdated(unused) {\n this.resetContactList();\n }\n }, {\n key: \"resetContactList\",\n value: function resetContactList() {\n var _this7 = this;\n\n var newState = {\n chatList: []\n };\n this.tinode.getMeTopic().contacts(function (c) {\n newState.chatList.push(c);\n\n if (_this7.state.topicSelected == c.topic) {\n newState.topicSelectedOnline = c.online;\n newState.topicSelectedAcs = c.acs;\n }\n });\n newState.searchableContacts = TinodeWeb.prepareSearchableContacts(newState.chatList, this.state.searchResults);\n this.setState(newState);\n }\n }, {\n key: \"tnData\",\n value: function tnData(data) {\n var _this8 = this;\n\n var topic = this.tinode.getTopic(data.topic);\n\n if (topic.msgStatus(data) >= tinode_sdk__WEBPACK_IMPORTED_MODULE_5___default.a.MESSAGE_STATUS_SENT) {\n clearTimeout(this.receivedTimer);\n this.receivedTimer = setTimeout(function () {\n _this8.receivedTimer = undefined;\n topic.noteRecv(data.seq);\n }, _config_js__WEBPACK_IMPORTED_MODULE_10__[\"RECEIVED_DELAY\"]);\n }\n }\n }, {\n key: \"tnInitFind\",\n value: function tnInitFind() {\n var _this9 = this;\n\n var fnd = this.tinode.getFndTopic();\n\n if (fnd.isSubscribed()) {\n this.tnFndSubsUpdated();\n } else {\n fnd.onSubsUpdated = this.tnFndSubsUpdated;\n fnd.subscribe(fnd.startMetaQuery().withSub().withTags().build()).catch(function (err) {\n _this9.handleError(err.message, 'err');\n });\n }\n }\n }, {\n key: \"tnFndSubsUpdated\",\n value: function tnFndSubsUpdated() {\n var foundContacts = [];\n this.tinode.getFndTopic().contacts(function (s) {\n foundContacts.push(s);\n });\n this.setState({\n searchResults: foundContacts,\n searchableContacts: TinodeWeb.prepareSearchableContacts(this.state.chatList, foundContacts)\n });\n }\n }, {\n key: \"handleSearchContacts\",\n value: function handleSearchContacts(query) {\n var _this10 = this;\n\n var fnd = this.tinode.getFndTopic();\n fnd.setMeta({\n desc: {\n public: query\n }\n }).then(function (ctrl) {\n return fnd.getMeta(fnd.startMetaQuery().withSub().build());\n }).catch(function (err) {\n _this10.handleError(err.message, 'err');\n });\n }\n }, {\n key: \"handleTopicSelected\",\n value: function handleTopicSelected(topicName, unused_index, online, acs) {\n if (topicName) {\n this.setState({\n errorText: '',\n errorLevel: null,\n mobilePanel: 'topic-view',\n showInfoPanel: false\n });\n\n if (this.state.topicSelected != topicName) {\n this.setState({\n topicSelectedOnline: online,\n topicSelectedAcs: acs\n });\n _lib_navigation_js__WEBPACK_IMPORTED_MODULE_14__[\"default\"].navigateTo(_lib_navigation_js__WEBPACK_IMPORTED_MODULE_14__[\"default\"].setUrlTopic('', topicName));\n }\n } else {\n this.setState({\n errorText: '',\n errorLevel: null,\n mobilePanel: 'sidepanel',\n topicSelectedOnline: false,\n topicSelectedAcs: null,\n showInfoPanel: false\n });\n\n if (this.state.topicSelected) {\n _lib_navigation_js__WEBPACK_IMPORTED_MODULE_14__[\"default\"].navigateTo(_lib_navigation_js__WEBPACK_IMPORTED_MODULE_14__[\"default\"].setUrlTopic('', null));\n }\n }\n }\n }, {\n key: \"handleHideMessagesView\",\n value: function handleHideMessagesView() {\n this.setState({\n mobilePanel: 'sidepanel'\n });\n _lib_navigation_js__WEBPACK_IMPORTED_MODULE_14__[\"default\"].navigateTo(_lib_navigation_js__WEBPACK_IMPORTED_MODULE_14__[\"default\"].setUrlTopic(window.location.hash, null));\n }\n }, {\n key: \"handleSendMessage\",\n value: function handleSendMessage(msg, promise, uploader) {\n var _this11 = this;\n\n var topic = this.tinode.getTopic(this.state.topicSelected);\n msg = topic.createMessage(msg, false);\n msg._uploader = uploader;\n\n if (!topic.isSubscribed()) {\n if (!promise) {\n promise = Promise.resolve();\n }\n\n promise = promise.then(function () {\n return topic.subscribe();\n });\n }\n\n if (promise) {\n promise = promise.catch(function (err) {\n _this11.handleError(err.message, 'err');\n });\n }\n\n topic.publishDraft(msg, promise).catch(function (err) {\n _this11.handleError(err.message, 'err');\n });\n }\n }, {\n key: \"handleNewAccount\",\n value: function handleNewAccount() {\n _lib_navigation_js__WEBPACK_IMPORTED_MODULE_14__[\"default\"].navigateTo(_lib_navigation_js__WEBPACK_IMPORTED_MODULE_14__[\"default\"].setUrlSidePanel(window.location.hash, 'register'));\n }\n }, {\n key: \"handleNewAccountRequest\",\n value: function handleNewAccountRequest(login_, password_, public_, cred_, tags_) {\n var _this12 = this;\n\n this.tinode.connect(this.state.serverAddress).then(function () {\n return _this12.tinode.createAccountBasic(login_, password_, {\n public: public_,\n tags: tags_,\n cred: tinode_sdk__WEBPACK_IMPORTED_MODULE_5___default.a.credential(cred_)\n });\n }).then(function (ctrl) {\n if (ctrl.code >= 300 && ctrl.text == 'validate credentials') {\n _this12.handleCredentialsRequest(ctrl.params);\n } else {\n _this12.handleLoginSuccessful(_this12);\n }\n }).catch(function (err) {\n _this12.handleError(err.message, 'err');\n });\n }\n }, {\n key: \"handleUpdateAccountRequest\",\n value: function handleUpdateAccountRequest(password, pub, defacs) {\n var _this13 = this;\n\n if (pub || defacs) {\n this.tinode.getMeTopic().setMeta({\n desc: {\n public: pub,\n defacs: defacs\n }\n }).catch(function (err) {\n _this13.handleError(err.message, 'err');\n });\n }\n\n if (password) {\n this.tinode.updateAccountBasic(null, this.tinode.getCurrentLogin(), password).catch(function (err) {\n _this13.handleError(err.message, 'err');\n });\n }\n }\n }, {\n key: \"handleUpdateAccountTagsRequest\",\n value: function handleUpdateAccountTagsRequest(tags) {\n var _this14 = this;\n\n this.tinode.getFndTopic().setMeta({\n tags: tags\n }).catch(function (err) {\n _this14.handleError(err.message, 'err');\n });\n }\n }, {\n key: \"handleSettings\",\n value: function handleSettings() {\n _lib_navigation_js__WEBPACK_IMPORTED_MODULE_14__[\"default\"].navigateTo(_lib_navigation_js__WEBPACK_IMPORTED_MODULE_14__[\"default\"].setUrlSidePanel(window.location.hash, this.state.myUserId ? 'edit' : 'settings'));\n }\n }, {\n key: \"handleGlobalSettings\",\n value: function handleGlobalSettings(settings) {\n var serverAddress = settings.serverAddress || this.state.serverAddress;\n var transport = settings.transport || this.state.transport;\n\n if (this.tinode) {\n this.tinode.onDisconnect = undefined;\n this.tinode.disconnect();\n }\n\n this.tinode = TinodeWeb.tnSetup(serverAddress, transport);\n this.tinode.onConnect = this.handleConnected;\n this.tinode.onDisconnect = this.handleDisconnect;\n this.setState({\n serverAddress: serverAddress,\n transport: transport\n });\n _lib_local_storage_js__WEBPACK_IMPORTED_MODULE_13__[\"default\"].setObject('settings', {\n serverAddress: serverAddress,\n transport: transport\n });\n _lib_navigation_js__WEBPACK_IMPORTED_MODULE_14__[\"default\"].navigateTo(_lib_navigation_js__WEBPACK_IMPORTED_MODULE_14__[\"default\"].setUrlSidePanel(window.location.hash, ''));\n }\n }, {\n key: \"initDesktopAlerts\",\n value: function initDesktopAlerts() {\n var _this15 = this;\n\n this.fbPush.onTokenRefresh(function () {\n _this15.requestPushToken(true);\n });\n this.fbPush.onMessage(function (payload) {});\n }\n }, {\n key: \"togglePushToken\",\n value: function togglePushToken(enabled) {\n var _this16 = this;\n\n if (enabled) {\n if (!this.state.firebaseToken) {\n this.fbPush.requestPermission().then(function () {\n _this16.requestPushToken(true);\n }).catch(function (err) {\n _this16.handleError(err.message, 'err');\n\n _this16.setState({\n desktopAlerts: false,\n firebaseToken: null\n });\n\n _lib_local_storage_js__WEBPACK_IMPORTED_MODULE_13__[\"default\"].updateObject('settings', {\n desktopAlerts: false\n });\n console.log(\"Failed to get permission to notify.\", err);\n });\n } else {\n this.setState({\n desktopAlerts: true\n });\n _lib_local_storage_js__WEBPACK_IMPORTED_MODULE_13__[\"default\"].updateObject('settings', {\n desktopAlerts: true\n });\n }\n } else if (this.state.firebaseToken) {\n this.fbPush.deleteToken(this.state.firebaseToken).catch(function (err) {\n console.log(\"Unable to delete token.\", err);\n }).finally(function () {\n _lib_local_storage_js__WEBPACK_IMPORTED_MODULE_13__[\"default\"].updateObject('settings', {\n desktopAlerts: false\n });\n localStorage.removeItem('firebase-token');\n\n _this16.setState({\n desktopAlerts: false,\n firebaseToken: null\n });\n });\n } else {\n this.setState({\n desktopAlerts: false,\n firebaseToken: null\n });\n _lib_local_storage_js__WEBPACK_IMPORTED_MODULE_13__[\"default\"].updateObject('settings', {\n desktopAlerts: false\n });\n }\n }\n }, {\n key: \"requestPushToken\",\n value: function requestPushToken(sendToServer) {\n var _this17 = this;\n\n this.fbPush.getToken().then(function (refreshedToken) {\n if (refreshedToken != _this17.state.firebaseToken) {\n _this17.tinode.setDeviceToken(refreshedToken, sendToServer);\n\n _lib_local_storage_js__WEBPACK_IMPORTED_MODULE_13__[\"default\"].setObject('firebase-token', refreshedToken);\n }\n\n _this17.setState({\n firebaseToken: refreshedToken,\n desktopAlerts: true\n });\n\n _lib_local_storage_js__WEBPACK_IMPORTED_MODULE_13__[\"default\"].updateObject('settings', {\n desktopAlerts: true\n });\n }).catch(function (err) {\n _this17.handleError(err.message, 'err');\n\n console.log(\"Failed to retrieve firebase token\", err);\n });\n }\n }, {\n key: \"handleToggleMessageSounds\",\n value: function handleToggleMessageSounds(enabled) {\n this.setState({\n messageSounds: enabled\n });\n _lib_local_storage_js__WEBPACK_IMPORTED_MODULE_13__[\"default\"].updateObject('settings', {\n messageSoundsOff: !enabled\n });\n }\n }, {\n key: \"handleSidepanelCancel\",\n value: function handleSidepanelCancel() {\n var parsed = _lib_navigation_js__WEBPACK_IMPORTED_MODULE_14__[\"default\"].parseUrlHash(window.location.hash);\n parsed.path[0] = this.state.myUserId ? 'contacts' : '';\n\n if (parsed.params) {\n delete parsed.params.code;\n delete parsed.params.method;\n delete parsed.params.tab;\n }\n\n _lib_navigation_js__WEBPACK_IMPORTED_MODULE_14__[\"default\"].navigateTo(_lib_navigation_js__WEBPACK_IMPORTED_MODULE_14__[\"default\"].composeUrlHash(parsed.path, parsed.params));\n this.setState({\n errorText: '',\n errorLevel: null\n });\n }\n }, {\n key: \"handleNewTopic\",\n value: function handleNewTopic() {\n _lib_navigation_js__WEBPACK_IMPORTED_MODULE_14__[\"default\"].navigateTo(_lib_navigation_js__WEBPACK_IMPORTED_MODULE_14__[\"default\"].setUrlSidePanel(window.location.hash, 'newtpk'));\n }\n }, {\n key: \"handleNewTopicRequest\",\n value: function handleNewTopicRequest(peerName, pub, priv, tags) {\n var _this18 = this;\n\n var topicName = peerName || this.tinode.newGroupTopicName();\n\n if (!peerName) {\n this.setState({\n newGroupTopicParams: {\n desc: {\n public: pub,\n private: {\n comment: priv\n }\n },\n tags: tags\n }\n }, function () {\n _this18.handleTopicSelected(topicName);\n });\n } else {\n this.handleTopicSelected(topicName);\n }\n }\n }, {\n key: \"handleNewTopicCreated\",\n value: function handleNewTopicCreated(oldName, newName) {\n if (this.state.topicSelected == oldName && oldName != newName) {\n this.setState({\n topicSelected: newName\n }, function () {\n _lib_navigation_js__WEBPACK_IMPORTED_MODULE_14__[\"default\"].navigateTo(_lib_navigation_js__WEBPACK_IMPORTED_MODULE_14__[\"default\"].setUrlTopic('', newName));\n });\n }\n }\n }, {\n key: \"handleTopicUpdateRequest\",\n value: function handleTopicUpdateRequest(topicName, pub, priv, permissions) {\n var _this19 = this;\n\n var topic = this.tinode.getTopic(topicName);\n\n if (topic) {\n var params = {};\n\n if (pub) {\n params.public = pub;\n }\n\n if (priv) {\n params.private = priv === tinode_sdk__WEBPACK_IMPORTED_MODULE_5___default.a.DEL_CHAR ? tinode_sdk__WEBPACK_IMPORTED_MODULE_5___default.a.DEL_CHAR : {\n comment: priv\n };\n }\n\n if (permissions) {\n params.defacs = permissions;\n }\n\n topic.setMeta({\n desc: params\n }).catch(function (err) {\n _this19.handleError(err.message, 'err');\n });\n }\n }\n }, {\n key: \"handleChangePermissions\",\n value: function handleChangePermissions(topicName, mode, uid) {\n var _this20 = this;\n\n var topic = this.tinode.getTopic(topicName);\n\n if (topic) {\n var am = topic.getAccessMode();\n\n if (uid) {\n am.updateGiven(mode);\n mode = am.getGiven();\n } else {\n am.updateWant(mode);\n mode = am.getWant();\n }\n\n topic.setMeta({\n sub: {\n user: uid,\n mode: mode\n }\n }).catch(function (err) {\n _this20.handleError(err.message, 'err');\n });\n }\n }\n }, {\n key: \"handleTagsUpdated\",\n value: function handleTagsUpdated(topicName, tags) {\n var _this21 = this;\n\n var topic = this.tinode.getTopic(topicName);\n\n if (topic) {\n var instance = this;\n topic.setMeta({\n tags: tags\n }).catch(function (err) {\n _this21.handleError(err.message, 'err');\n });\n }\n }\n }, {\n key: \"handleLogout\",\n value: function handleLogout() {\n Object(_lib_utils_js__WEBPACK_IMPORTED_MODULE_15__[\"updateFavicon\"])(0);\n localStorage.removeItem('auth-token');\n\n if (this.tinode) {\n this.tinode.onDisconnect = undefined;\n this.tinode.disconnect();\n }\n\n this.setState(this.getBlankState());\n this.tinode = TinodeWeb.tnSetup(this.state.serverAddress, this.state.transport);\n this.tinode.onConnect = this.handleConnected;\n this.tinode.onDisconnect = this.handleDisconnect;\n _lib_navigation_js__WEBPACK_IMPORTED_MODULE_14__[\"default\"].navigateTo('');\n }\n }, {\n key: \"handleLeaveUnsubRequest\",\n value: function handleLeaveUnsubRequest(topicName) {\n var _this22 = this;\n\n var topic = this.tinode.getTopic(topicName);\n\n if (!topic) {\n return;\n }\n\n topic.leave(true).then(function (ctrl) {\n _lib_navigation_js__WEBPACK_IMPORTED_MODULE_14__[\"default\"].navigateTo(_lib_navigation_js__WEBPACK_IMPORTED_MODULE_14__[\"default\"].setUrlTopic(window.location.hash, ''));\n }).catch(function (err) {\n _this22.handleError(err.message, 'err');\n });\n }\n }, {\n key: \"handleDialogCancel\",\n value: function handleDialogCancel() {\n this.setState({\n dialogSelected: null\n });\n }\n }, {\n key: \"handleShowContextMenu\",\n value: function handleShowContextMenu(params, menuItems) {\n this.setState({\n contextMenuVisible: true,\n contextMenuClickAt: {\n x: params.x,\n y: params.y\n },\n contextMenuParams: params,\n contextMenuItems: menuItems || this.defaultTopicContextMenu(params.topicName),\n contextMenuBounds: react_dom__WEBPACK_IMPORTED_MODULE_1___default.a.findDOMNode(this).getBoundingClientRect()\n });\n }\n }, {\n key: \"defaultTopicContextMenu\",\n value: function defaultTopicContextMenu(topicName) {\n var topic = this.tinode.getTopic(topicName);\n var formatMessage = this.props.intl.formatMessage;\n var muted = false,\n blocked = false,\n subscribed = false,\n deleter = false;\n\n if (topic) {\n if (topic.isSubscribed()) {\n subscribed = true;\n var acs = topic.getAccessMode();\n muted = acs && acs.isMuted();\n blocked = acs && !acs.isJoiner();\n deleter = acs && acs.isDeleter();\n }\n }\n\n return [subscribed ? {\n title: formatMessage({\n id: 'menu_item_info'\n }),\n handler: this.handleShowInfoView\n } : null, subscribed ? 'messages_clear' : null, subscribed && deleter ? 'messages_clear_hard' : null, subscribed ? muted ? 'topic_unmute' : 'topic_mute' : null, subscribed ? blocked ? 'topic_unblock' : 'topic_block' : null, 'topic_delete'];\n }\n }, {\n key: \"handleHideContextMenu\",\n value: function handleHideContextMenu() {\n this.setState({\n contextMenuVisible: false,\n contextMenuClickAt: null,\n contextMenuParams: null,\n contextMenuBounds: null\n });\n }\n }, {\n key: \"handleShowInfoView\",\n value: function handleShowInfoView() {\n _lib_navigation_js__WEBPACK_IMPORTED_MODULE_14__[\"default\"].navigateTo(_lib_navigation_js__WEBPACK_IMPORTED_MODULE_14__[\"default\"].addUrlParam(window.location.hash, 'info', true));\n this.setState({\n showInfoPanel: true\n });\n }\n }, {\n key: \"handleHideInfoView\",\n value: function handleHideInfoView() {\n _lib_navigation_js__WEBPACK_IMPORTED_MODULE_14__[\"default\"].navigateTo(_lib_navigation_js__WEBPACK_IMPORTED_MODULE_14__[\"default\"].removeUrlParam(window.location.hash, 'info'));\n this.setState({\n showInfoPanel: false\n });\n }\n }, {\n key: \"handleMemberUpdateRequest\",\n value: function handleMemberUpdateRequest(topicName, added, removed) {\n var _this23 = this;\n\n if (!topicName) {\n return;\n }\n\n var topic = this.tinode.getTopic(topicName);\n\n if (!topic) {\n return;\n }\n\n if (added && added.length > 0) {\n added.map(function (uid) {\n topic.invite(uid, null).catch(function (err) {\n _this23.handleError(err.message, 'err');\n });\n });\n }\n\n if (removed && removed.length > 0) {\n removed.map(function (uid) {\n topic.delSubscription(uid).catch(function (err) {\n _this23.handleError(err.message, 'err');\n });\n });\n }\n }\n }, {\n key: \"handleValidateCredentialsRequest\",\n value: function handleValidateCredentialsRequest(cred, code) {\n this.setState({\n credMethod: cred,\n credCode: code\n });\n this.doLogin(null, null, {\n meth: cred,\n resp: code\n });\n }\n }, {\n key: \"handlePasswordResetRequest\",\n value: function handlePasswordResetRequest(method, value) {\n var _this24 = this;\n\n this.tinode.connect().then(function () {\n return _this24.tinode.requestResetAuthSecret('basic', method, value);\n }).catch(function (err) {\n _this24.handleError(err.message, 'err');\n });\n }\n }, {\n key: \"handleResetPassword\",\n value: function handleResetPassword(scheme, newPassword, token) {\n var _this25 = this;\n\n token = base64ReEncode(token);\n\n if (!token) {\n this.handleError(\"Invalid security token\", 'err');\n } else {\n this.tinode.connect().then(function () {\n return _this25.tinode.updateAccountBasic(null, null, newPassword, {\n token: token\n });\n }).catch(function (err) {\n _this25.handleError(err.message, 'err');\n });\n }\n }\n }, {\n key: \"render\",\n value: function render() {\n return react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"div\", {\n id: \"app-container\"\n }, this.state.contextMenuVisible ? react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_widgets_context_menu_jsx__WEBPACK_IMPORTED_MODULE_6__[\"default\"], {\n tinode: this.tinode,\n bounds: this.state.contextMenuBounds,\n clickAt: this.state.contextMenuClickAt,\n params: this.state.contextMenuParams,\n items: this.state.contextMenuItems,\n hide: this.handleHideContextMenu,\n onAction: this.handleContextMenuAction,\n onError: this.handleError\n }) : null, react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_sidepanel_view_jsx__WEBPACK_IMPORTED_MODULE_9__[\"default\"], {\n tinode: this.tinode,\n connected: this.state.connected,\n displayMobile: this.state.displayMobile,\n hideSelf: this.state.displayMobile && this.state.mobilePanel !== 'sidepanel',\n state: this.state.sidePanelSelected,\n title: this.state.sidePanelTitle,\n avatar: this.state.sidePanelAvatar,\n login: this.state.login,\n myUserId: this.state.myUserId,\n loginDisabled: this.state.loginDisabled,\n errorText: this.state.errorText,\n errorLevel: this.state.errorLevel,\n topicSelected: this.state.topicSelected,\n chatList: this.state.chatList,\n credMethod: this.state.credMethod,\n credCode: this.state.credCode,\n transport: this.state.transport,\n messageSounds: this.state.messageSounds,\n desktopAlerts: this.state.desktopAlerts,\n desktopAlertsEnabled: this.state.desktopAlertsEnabled,\n serverAddress: this.state.serverAddress,\n onGlobalSettings: this.handleGlobalSettings,\n onSignUp: this.handleNewAccount,\n onSettings: this.handleSettings,\n onLoginRequest: this.handleLoginRequest,\n onCreateAccount: this.handleNewAccountRequest,\n onUpdateAccount: this.handleUpdateAccountRequest,\n onUpdateAccountTags: this.handleUpdateAccountTagsRequest,\n onTogglePushNotifications: this.togglePushToken,\n onToggleMessageSounds: this.handleToggleMessageSounds,\n onTopicSelected: this.handleTopicSelected,\n onCreateTopic: this.handleNewTopicRequest,\n onNewTopic: this.handleNewTopic,\n onLogout: this.handleLogout,\n onCancel: this.handleSidepanelCancel,\n onError: this.handleError,\n onValidateCredentials: this.handleValidateCredentialsRequest,\n onPasswordResetRequest: this.handlePasswordResetRequest,\n onResetPassword: this.handleResetPassword,\n onInitFind: this.tnInitFind,\n searchResults: this.state.searchResults,\n onSearchContacts: this.handleSearchContacts,\n showContextMenu: this.handleShowContextMenu\n }), react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_messages_view_jsx__WEBPACK_IMPORTED_MODULE_8__[\"default\"], {\n tinode: this.tinode,\n connected: this.state.connected,\n online: this.state.topicSelectedOnline,\n acs: this.state.topicSelectedAcs,\n displayMobile: this.state.displayMobile,\n viewportWidth: this.state.viewportWidth,\n hideSelf: this.state.displayMobile && (this.state.mobilePanel !== 'topic-view' || this.state.showInfoPanel),\n topic: this.state.topicSelected,\n myUserId: this.state.myUserId,\n serverVersion: this.state.serverVersion,\n serverAddress: this.state.serverAddress,\n errorText: this.state.errorText,\n errorLevel: this.state.errorLevel,\n newGroupTopicParams: this.state.newGroupTopicParams,\n onHideMessagesView: this.handleHideMessagesView,\n onData: this.tnData,\n onError: this.handleError,\n onNewTopicCreated: this.handleNewTopicCreated,\n readTimerHandler: this.handleReadTimer,\n showContextMenu: this.handleShowContextMenu,\n sendMessage: this.handleSendMessage\n }), this.state.showInfoPanel ? react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_info_view_jsx__WEBPACK_IMPORTED_MODULE_7__[\"default\"], {\n tinode: this.tinode,\n connected: this.state.connected,\n displayMobile: this.state.displayMobile,\n topic: this.state.topicSelected,\n searchableContacts: this.state.searchableContacts,\n myUserId: this.state.myUserId,\n errorText: this.state.errorText,\n errorLevel: this.state.errorLevel,\n onTopicDescUpdate: this.handleTopicUpdateRequest,\n onCancel: this.handleHideInfoView,\n onChangePermissions: this.handleChangePermissions,\n onMemberUpdateRequest: this.handleMemberUpdateRequest,\n onLeaveTopic: this.handleLeaveUnsubRequest,\n onAddMember: this.handleManageGroupMembers,\n onTopicTagsUpdate: this.handleTagsUpdated,\n onInitFind: this.tnInitFind,\n onError: this.handleError,\n showContextMenu: this.handleShowContextMenu\n }) : null);\n }\n }], [{\n key: \"tnSetup\",\n value: function tnSetup(serverAddress, transport) {\n var tinode = new tinode_sdk__WEBPACK_IMPORTED_MODULE_5___default.a(_config_js__WEBPACK_IMPORTED_MODULE_10__[\"APP_NAME\"], serverAddress, _config_js__WEBPACK_IMPORTED_MODULE_10__[\"API_KEY\"], transport, Object(_lib_host_name_js__WEBPACK_IMPORTED_MODULE_12__[\"isSecureConnection\"])());\n tinode.enableLogging(true, true);\n return tinode;\n }\n }, {\n key: \"prepareSearchableContacts\",\n value: function prepareSearchableContacts(chatList, foundContacts) {\n var merged = {};\n var _iteratorNormalCompletion = true;\n var _didIteratorError = false;\n var _iteratorError = undefined;\n\n try {\n for (var _iterator = chatList[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {\n var c = _step.value;\n\n if (tinode_sdk__WEBPACK_IMPORTED_MODULE_5___default.a.topicType(c.topic) == 'p2p') {\n merged[c.topic] = {\n user: c.topic,\n updated: c.updated,\n public: c.public,\n private: c.private,\n acs: c.acs\n };\n }\n }\n } catch (err) {\n _didIteratorError = true;\n _iteratorError = err;\n } finally {\n try {\n if (!_iteratorNormalCompletion && _iterator.return != null) {\n _iterator.return();\n }\n } finally {\n if (_didIteratorError) {\n throw _iteratorError;\n }\n }\n }\n\n var _iteratorNormalCompletion2 = true;\n var _didIteratorError2 = false;\n var _iteratorError2 = undefined;\n\n try {\n for (var _iterator2 = foundContacts[Symbol.iterator](), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true) {\n var _c = _step2.value;\n\n if (!merged[_c.user]) {\n merged[_c.user] = _c;\n }\n }\n } catch (err) {\n _didIteratorError2 = true;\n _iteratorError2 = err;\n } finally {\n try {\n if (!_iteratorNormalCompletion2 && _iterator2.return != null) {\n _iterator2.return();\n }\n } finally {\n if (_didIteratorError2) {\n throw _iteratorError2;\n }\n }\n }\n\n return Object.values(merged);\n }\n }]);\n\n return TinodeWeb;\n}(react__WEBPACK_IMPORTED_MODULE_0___default.a.Component);\n\n;\n/* harmony default export */ __webpack_exports__[\"default\"] = (Object(react_intl__WEBPACK_IMPORTED_MODULE_2__[\"injectIntl\"])(TinodeWeb));\n\n//# sourceURL=webpack:///./src/views/tinode-web.jsx?"); /***/ }), @@ -522,7 +522,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var reac /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return ErrorPanel; });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"react\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _menu_cancel_jsx__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./menu-cancel.jsx */ \"./src/widgets/menu-cancel.jsx\");\nfunction _typeof(obj) { if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; } return _typeof(obj); }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }\n\nfunction _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === \"object\" || typeof call === \"function\")) { return call; } return _assertThisInitialized(self); }\n\nfunction _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function\"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); }\n\nfunction _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }\n\nfunction _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return self; }\n\n\n\n\nvar ErrorPanel = function (_React$PureComponent) {\n _inherits(ErrorPanel, _React$PureComponent);\n\n function ErrorPanel(props) {\n var _this;\n\n _classCallCheck(this, ErrorPanel);\n\n _this = _possibleConstructorReturn(this, _getPrototypeOf(ErrorPanel).call(this, props));\n _this.state = {\n show: false\n };\n _this.hide = _this.hide.bind(_assertThisInitialized(_assertThisInitialized(_this)));\n return _this;\n }\n\n _createClass(ErrorPanel, [{\n key: \"hide\",\n value: function hide() {\n this.setState({\n show: false\n });\n\n if (this.props.onClearError) {\n this.props.onClearError();\n }\n }\n }, {\n key: \"render\",\n value: function render() {\n var icon = this.props.level == 'err' ? 'error' : 'warning';\n return react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"div\", {\n className: this.state.show ? this.props.level == 'err' ? 'alert-box error' : 'alert-box warning' : \"alert-box\"\n }, react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"div\", {\n className: \"icon\"\n }, react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"i\", {\n className: \"material-icons\"\n }, icon)), this.props.text, react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"div\", {\n className: \"cancel\"\n }, react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_menu_cancel_jsx__WEBPACK_IMPORTED_MODULE_1__[\"default\"], {\n onCancel: this.hide\n })));\n }\n }], [{\n key: \"getDerivedStateFromProps\",\n value: function getDerivedStateFromProps(nextProps, prevState) {\n return {\n show: !!nextProps.level\n };\n }\n }]);\n\n return ErrorPanel;\n}(react__WEBPACK_IMPORTED_MODULE_0___default.a.PureComponent);\n\n\n;\n\n//# sourceURL=webpack:///./src/widgets/error-panel.jsx?"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return ErrorPanel; });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"react\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _menu_cancel_jsx__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./menu-cancel.jsx */ \"./src/widgets/menu-cancel.jsx\");\nfunction _typeof(obj) { if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; } return _typeof(obj); }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }\n\nfunction _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === \"object\" || typeof call === \"function\")) { return call; } return _assertThisInitialized(self); }\n\nfunction _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function\"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); }\n\nfunction _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }\n\nfunction _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return self; }\n\n\n\n\nvar ErrorPanel = function (_React$PureComponent) {\n _inherits(ErrorPanel, _React$PureComponent);\n\n function ErrorPanel(props) {\n var _this;\n\n _classCallCheck(this, ErrorPanel);\n\n _this = _possibleConstructorReturn(this, _getPrototypeOf(ErrorPanel).call(this, props));\n _this.state = {\n show: false\n };\n _this.hide = _this.hide.bind(_assertThisInitialized(_assertThisInitialized(_this)));\n return _this;\n }\n\n _createClass(ErrorPanel, [{\n key: \"hide\",\n value: function hide() {\n this.setState({\n show: false\n });\n\n if (this.props.onClearError) {\n this.props.onClearError();\n }\n }\n }, {\n key: \"render\",\n value: function render() {\n var icons = {\n err: 'error',\n warn: 'warning',\n info: 'info'\n };\n var level = icons[this.props.level] || '';\n var className = 'alert-box ' + level;\n return react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"div\", {\n className: className\n }, react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"div\", {\n className: \"icon\"\n }, react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"i\", {\n className: \"material-icons\"\n }, level)), react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"span\", {\n dangerouslySetInnerHTML: {\n __html: this.props.text\n }\n }), react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"div\", {\n className: \"cancel\"\n }, react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_menu_cancel_jsx__WEBPACK_IMPORTED_MODULE_1__[\"default\"], {\n onCancel: this.hide\n })));\n }\n }], [{\n key: \"getDerivedStateFromProps\",\n value: function getDerivedStateFromProps(nextProps, prevState) {\n return {\n show: !!nextProps.level\n };\n }\n }]);\n\n return ErrorPanel;\n}(react__WEBPACK_IMPORTED_MODULE_0___default.a.PureComponent);\n\n\n;\n\n//# sourceURL=webpack:///./src/widgets/error-panel.jsx?"); /***/ }), diff --git a/umd/index.prod.js b/umd/index.prod.js index 2f239e29..7d6c55d3 100644 --- a/umd/index.prod.js +++ b/umd/index.prod.js @@ -1 +1 @@ -!function(e){var t={};function n(a){if(t[a])return t[a].exports;var o=t[a]={i:a,l:!1,exports:{}};return e[a].call(o.exports,o,o.exports,n),o.l=!0,o.exports}n.m=e,n.c=t,n.d=function(e,t,a){n.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:a})},n.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},n.t=function(e,t){if(1&t&&(e=n(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var a=Object.create(null);if(n.r(a),Object.defineProperty(a,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var o in e)n.d(a,o,function(t){return e[t]}.bind(null,o));return a},n.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return n.d(t,"a",t),t},n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},n.p="",n(n.s=7)}([function(e,t){e.exports=React},function(e,t){e.exports=ReactIntl},function(e,t,n){(function(t){e.exports=function(){var e={exports:{}},n=[{name:"ST",start:/(?:^|\W)(\*)[^\s*]/,end:/[^\s*](\*)(?=$|\W)/},{name:"EM",start:/(?:^|[\W_])(_)[^\s_]/,end:/[^\s_](_)(?=$|[\W_])/},{name:"DL",start:/(?:^|\W)(~)[^\s~]/,end:/[^\s~](~)(?=$|\W)/},{name:"CO",start:/(?:^|\W)(`)[^`]/,end:/[^`](`)(?=$|\W)/}],a=[{name:"LN",dataName:"url",pack:function(e){return/^[a-z]+:\/\//i.test(e)||(e="http://"+e),{url:e}},re:/(?:(?:https?|ftp):\/\/|www\.|ftp\.)[-A-Z0-9+&@#\/%=~_|$?!:,.]*[A-Z0-9+&@#\/%=~_|$]/gi},{name:"MN",dataName:"val",pack:function(e){return{val:e.slice(1)}},re:/\B@(\w\w+)/g},{name:"HT",dataName:"val",pack:function(e){return{val:e.slice(1)}},re:/\B#(\w\w+)/g}],o={ST:{name:"b",isVoid:!1},EM:{name:"i",isVoid:!1},DL:{name:"del",isVoid:!1},CO:{name:"tt",isVoid:!1},BR:{name:"br",isVoid:!0},LN:{name:"a",isVoid:!1},MN:{name:"a",isVoid:!1},HT:{name:"a",isVoid:!1},IM:{name:"img",isVoid:!0}};function r(e,t){var n;try{n=atob(e)}catch(e){console.log("Drafty: failed to decode base64-encoded object",e.message),n=atob("")}for(var a=n.length,o=new ArrayBuffer(a),r=new Uint8Array(o),i=0;i"},close:function(){return""}},EM:{open:function(){return""},close:function(){return""}},DL:{open:function(){return""},close:function(){return""}},CO:{open:function(){return""},close:function(){return""}},BR:{open:function(){return""},close:function(){return"
"}},LN:{open:function(e){return''},close:function(e){return""},props:function(e){return{href:e.url,target:"_blank"}}},MN:{open:function(e){return''},close:function(e){return""},props:function(e){return{name:e.val}}},HT:{open:function(e){return''},close:function(e){return""},props:function(e){return{name:e.val}}},IM:{open:function(e){var t=r(e.val,e.mime),n=e.ref?e.ref:t,a=(e.name?'':"")+'';return console.log("open: "+a),a},close:function(e){return e.name?"":""},props:function(e){return{src:r(e.val,e.mime),title:e.name,"data-width":e.width,"data-height":e.height,"data-name":e.name,"data-size":.75*e.val.length|0,"data-mime":e.mime}}}},s=function(){};s.parse=function(e){if("string"!=typeof e)return null;var t=e.split(/\r?\n/),o=[],r={},i=[];t.map(function(e){var t,s,l=[];if(n.map(function(t){l=l.concat(function(e,t,n,a){for(var o=[],r=0,i=e.slice(0);i.length>0;){var s=t.exec(i);if(null==s)break;var l=s.index+s[0].lastIndexOf(s[1]);i=i.slice(l+1),r=(l+=r)+1;var c=n?n.exec(i):null;if(null==c)break;var u=c.index+c[0].indexOf(c[1]);i=i.slice(u+1),r=(u+=r)+1,o.push({text:e.slice(l+1,u),children:[],start:l,end:u,type:a})}return o}(e,t.start,t.end,t.name))}),0==l.length)s={txt:e};else{l.sort(function(e,t){return e.start-t.start}),l=function e(t){if(0==t.length)return[];for(var n=[t[0]],a=t[0],o=1;oa.end?(n.push(t[o]),a=t[o]):t[o].endn&&r.push({text:t.slice(n,s.start)});var l={type:s.type},c=e(t,s.start+1,s.end-1,s.children);c.length>0?l.children=c:l.text=s.text,r.push(l),n=s.end+1}return no;return o=e.offset+e.len,t})}(s.txt)).length>0){var u=[];for(var d in t){var p=t[d],h=r[p.unique];h||(h=o.length,r[p.unique]=h,o.push({tp:p.type,data:p.data})),u.push({at:p.offset,len:p.len,key:h})}s.ent=u}i.push(s)});var s={txt:""};if(i.length>0){s.txt=i[0].txt,s.fmt=(i[0].fmt||[]).concat(i[0].ent||[]);for(var l=1;l0&&(s.ent=o)}return s},s.insertImage=function(e,t,n,a,o,r,i,s,l){return(e=e||{txt:" "}).ent=e.ent||[],e.fmt=e.fmt||[],e.fmt.push({at:t,len:1,key:e.ent.length}),e.ent.push({tp:"IM",data:{mime:n,val:a,width:o,height:r,name:i,ref:l,size:0|s}}),e},s.attachFile=function(e,t,n,a,o,r){(e=e||{txt:""}).ent=e.ent||[],e.fmt=e.fmt||[],e.fmt.push({at:-1,len:0,key:e.ent.length});var i={tp:"EX",data:{mime:t,val:n,name:a,ref:r,size:0|o}};return r instanceof Promise&&(i.data.ref=r.then(function(e){i.data.ref=e},function(e){})),e.ent.push(i),e},s.UNSAFE_toHTML=function(e){var t,n,a,o=e.txt,r=e.fmt,s=e.ent,l=[];if(r)for(var c in r){var u,d=r[c],p=d.tp;if(!p){var h=s[d.key];h&&(p=h.tp,u=h.data)}i[p]&&(l.push({idx:d.at+d.len,what:i[p].close(u)}),l.push({idx:d.at,what:i[p].open(u)}))}for(var c in l.sort(function(e,t){return t.idx-e.idx}),l)l[c].what&&(t=o,n=l[c].idx,a=l[c].what,o=t.slice(0,n)+a+t.slice(n));return o},s.format=function(e,t,n){var a=e.txt,r=e.fmt,i=e.ent;if(a=a||"",!r)return[a];var s=[].concat(r);return s.map(function(e){e.at=e.at||0,e.len=e.len||0}),s.sort(function(e,t){return e.at-t.at==0?t.len-e.len:e.at-t.at}),s=s.map(function(e){var t,n=e.tp;return n||(e.key=e.key||0,t=i[e.key].data,n=i[e.key].tp),{tp:n,data:t,at:e.at,len:e.len}}),function e(t,n,a,r,i,s){for(var l=[],c=0;c0)for(var t in e.ent)if("EX"==e.ent[t].tp)return!0;return!1},s.attachments=function(e,t,n){if(e.ent&&e.ent.length>0)for(var a in e.ent)"EX"==e.ent[a].tp&&t.call(n,e.ent[a].data,a)},s.getDownloadUrl=function(e){var t=null;return e.val?t=r(e.val,e.mime):"string"==typeof e.ref&&(t=e.ref),t},s.isUploading=function(e){return e.ref instanceof Promise},s.getPreviewUrl=function(e){return e.val?r(e.val,e.mime):null},s.getEntitySize=function(e){return e.size?e.size:e.val?.75*e.val.length|0:0},s.getEntityMimeType=function(e){return e.mime||"text/plain"},s.tagName=function(e){return o[e]?o[e].name:void 0},s.attrValue=function(e,t){if(t&&i[e])return i[e].props(t)},s.getContentType=function(){return"text/x-drafty"},e.exports=s,e=e.exports;var l={exports:{}};return function(t){"use strict";function n(e){return(n="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}var a,o="0.15.9-rc1";"undefined"!=typeof WebSocket&&(a=WebSocket),"undefined"==typeof btoa&&(t.btoa=function(){for(var e,t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"",n="",a=0,o=0,r="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";t.charAt(0|o)||(r="=",o%1);n+=r.charAt(63&a>>8-o%1*8)){if((e=t.charCodeAt(o+=.75))>255)throw new Error("'btoa' failed: The string to be encoded contains characters outside of the Latin1 range.");a=a<<8|e}return n}),"undefined"==typeof atob&&(t.atob=function(){var e=(arguments.length>0&&void 0!==arguments[0]?arguments[0]:"").replace(/=+$/,""),t="";if(e.length%4==1)throw new Error("'atob' failed: The string to be decoded is not correctly encoded.");for(var n,a=0,o=0,r=0;n=e.charAt(r++);~n&&(o=a%4?64*o+n:n,a++%4)?t+=String.fromCharCode(255&o>>(-2*a&6)):0)n="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=".indexOf(n);return t}),"undefined"==typeof window&&(t.window={WebSocket:a,URL:{createObjectURL:function(){throw new Error("Unable to use window.URL in a non browser application")}}});var r="0",i=o||"0.15",s="tinodejs/"+i,c=503,u="Connection failed";function d(e){return btoa(encodeURIComponent(e).replace(/%([0-9A-F]{2})/g,function(e,t){return String.fromCharCode("0x"+t)}))}function p(e,t,a){if(null==t)return e;if("object"!=n(t))return t||e;if(t instanceof Date)return t;if(t instanceof w)return new w(t);if(t instanceof Array)return t.length>0?t:e;for(var o in e&&e!==y.DEL_CHAR||(e=t.constructor()),t)!t.hasOwnProperty(o)||!t[o]&&!1!==t[o]||a&&a[o]||"_generated"==o||(e[o]=p(e[o],t[o]));return e}function h(e,t,n,a){return e[t]=p(e[t],n,a),e[t]}function f(){var e=null;if("withCredentials"in new XMLHttpRequest)e=new XMLHttpRequest;else{if("undefined"==typeof XDomainRequest)throw new Error("Browser not supported");e=new XDomainRequest}return e}function m(e,t){if("ts"===e&&"string"==typeof t&&t.length>=20&&t.length<=24){var a=new Date(t);if(a)return a}else if("acs"===e&&"object"===n(t))return new w(t);return t}function g(e,t){return"string"==typeof t&&t.length>128?"<"+t.length+", bytes: "+t.substring(0,12)+"..."+t.substring(t.length-12)+">":function(e,t){if(t instanceof Date)t=function(e){if(e&&0!=e.getTime()){var t=e.getUTCMilliseconds();return e.getUTCFullYear()+"-"+n(e.getUTCMonth()+1)+"-"+n(e.getUTCDate())+"T"+n(e.getUTCHours())+":"+n(e.getUTCMinutes())+":"+n(e.getUTCSeconds())+(t?"."+n(t,3):"")+"Z"}function n(e,t){return"0".repeat((t=t||2)-(""+e).length)+e}}(t);else if(null==t||!1===t||Array.isArray(t)&&0==t.length||"object"==n(t)&&0==Object.keys(t).length)return;return t}(0,t)}function b(e,t,n){var a=null;return"http"!==t&&"https"!==t&&"ws"!==t&&"wss"!==t||(a=t+"://","/"!==(a+=e).charAt(a.length-1)&&(a+="/"),a+="v"+r+"/channels","http"!==t&&"https"!==t||(a+="/lp"),a+="?apikey="+n),a}var v=function(e,t,o,r,i){var s=this,l=e,d=r,p=t,h=i,g=2e3,v=10,y=.3,_=null,w=0,S=!1,E=function(e){s.logger&&s.logger(e)};function C(e){var t=null;e.connect=function(n){return t&&1===t.readyState?Promise.resolve():(n&&(l=n),new Promise(function(n,o){var r=b(l,d?"wss":"ws",p);E("Connecting to: "+r);var i=new a(r);i.onopen=function(t){S=!1,e.onOpen&&e.onOpen(),n(),h&&(clearTimeout(_),_=null,w=0)},i.onclose=function(n){t=null,e.onDisconnect&&e.onDisconnect(null),!S&&h&&function(){var e=this;clearTimeout(_);var t=g*(Math.pow(2,w)*(1+y*Math.random()));w=w>=v?w:w+1,_=setTimeout(function(){E("Reconnecting, iter="+w+", timeout="+t),S||e.connect().catch(function(){})},t)}.call(e)},i.onerror=function(e){o(e)},i.onmessage=function(t){e.onMessage&&e.onMessage(t.data)},t=i}))},e.disconnect=function(){t&&(S=!0,t.close()),t=null},e.sendText=function(e){if(!t||t.readyState!=t.OPEN)throw new Error("Websocket is not connected");t.send(e)},e.isConnected=function(){return t&&1===t.readyState},e.transport=function(){return"ws"}}function k(e){var t=null,n=null,a=null;e.connect=function(a){return n?Promise.resolve():(a&&(l=a),new Promise(function(a,o){var r=b(l,d?"https":"http",p);E("Connecting to: "+r),(n=function n(a,o,r){var i=f();return i.onreadystatechange=function(s){if(4==i.readyState)if(201==i.status){var l=JSON.parse(i.responseText,m);i.responseText,t=a+"&sid="+l.ctrl.params.sid,(i=n(t)).send(null),e.onOpen&&e.onOpen(),o&&o()}else if(200==i.status)e.onMessage&&e.onMessage(i.responseText),(i=n(t)).send(null);else if(r&&r(i.responseText),e.onMessage&&i.responseText&&e.onMessage(i.responseText),e.onDisconnect){var d=i.status||c,p=i.responseText||u;e.onDisconnect(new Error(p+"("+d+")"))}},i.open("GET",a,!0),i}(r,a,o)).send(null)}).catch(function(){}))},e.disconnect=function(){a&&(a.onreadystatechange=void 0,a.abort(),a=null),n&&(n.onreadystatechange=void 0,n.abort(),n=null),e.onDisconnect&&e.onDisconnect(null),t=null},e.sendText=function(e){var n,o;if(n=t,(o=f()).onreadystatechange=function(e){if(4==o.readyState&&o.status>=400)throw new Error("LP sender failed, "+o.status)},o.open("POST",n,!0),!(a=o)||1!=a.readyState)throw new Error("Long poller failed to connect");a.send(e)},e.isConnected=function(){return n&&!0},e.transport=function(){return"lp"}}"lp"===o?k(this):"ws"===o?C(this):"object"==("undefined"==typeof window?"undefined":n(window))&&window.WebSocket?C(this):k(this),this.onMessage=void 0,this.onDisconnect=void 0,this.onOpen=void 0,this.logger=void 0},y=function(e,t,a,o,r){var l=this;this._appName=e||"Undefined",this._apiKey=a,this._browser="",this._platform="undefined",this._humanLanguage="xx","undefined"!=typeof navigator&&(this._browser=function(e){var t,n=(e=(e||"").replace(" (KHTML, like Gecko)","")).match(/(AppleWebKit\/[.\d]+)/i);if(n){for(var a=["chrome","safari","mobile","version"],o=e.substr(n.index+n[0].length).split(" "),r=[],i=0;i0?r[0][0]+"/"+r[0][1]:n[1]}else t=/trident/i.test(e)?(n=/(?:\brv[ :]+([.\d]+))|(?:\bMSIE ([.\d]+))/g.exec(e))?"MSIE/"+(n[1]||n[2]):"MSIE/?":/firefox/i.test(e)?(n=/Firefox\/([.\d]+)/g.exec(e))?"Firefox/"+n[1]:"Firefox/?":/presto/i.test(e)?(n=/Opera\/([.\d]+)/g.exec(e))?"Opera/"+n[1]:"Opera/?":(n=/([\w.]+)\/([.\d]+)/.exec(e))?n[1]+"/"+n[2]:(n=e.split(" "))[0];if((n=t.split("/")).length>1){var l=n[1].split(".");t=n[0]+"/"+l[0]+(l[1]?"."+l[1]:"")}return t}(navigator.userAgent),this._platform=navigator.platform,this._humanLanguage=navigator.language||"en-US"),this._loggingEnabled=!1,this._trimLongStrings=!1,this._myUID=null,this._authenticated=!1,this._login=null,this._authToken=null,this._inPacketCount=0,this._messageId=Math.floor(65535*Math.random()+65535),this._serverInfo=null,this._deviceToken=null,this._pendingPromises={},this._connection=new v(t,a,o,r,!0),this.logger=function(e){if(l._loggingEnabled){var t=new Date,n=("0"+t.getUTCHours()).slice(-2)+":"+("0"+t.getUTCMinutes()).slice(-2)+":"+("0"+t.getUTCSeconds()).slice(-2)+":"+("0"+t.getUTCMilliseconds()).slice(-3);console.log("["+n+"] "+e)}},this._connection.logger=this.logger,this._cache={};var d=this.cachePut=function(e,t,n){l._cache[e+":"+t]=n},h=this.cacheGet=function(e,t){return l._cache[e+":"+t]},f=this.cacheDel=function(e,t){delete l._cache[e+":"+t]},b=this.cacheMap=function(e,t){for(var n in l._cache)if(e(l._cache[n],n,t))break};this.attachCacheToTopic=function(e){e._tinode=l,e._cacheGetUser=function(e){var t=h("user",e);if(t)return{user:e,public:p({},t)}},e._cachePutUser=function(e,t){return d("user",e,p({},t.public))},e._cacheDelUser=function(e){return f("user",e)},e._cachePutSelf=function(){return d("topic",e.name,e)},e._cacheDelSelf=function(){return f("topic",e.name)}};var y=function(e,t,n,a){var o=l._pendingPromises[e];o&&(delete l._pendingPromises[e],t>=200&&t<400?o.resolve&&o.resolve(n):o.reject&&o.reject(new Error("Error: "+a+" ("+t+")")))},_=this.getNextUniqueId=function(){return 0!=l._messageId?""+l._messageId++:void 0};this.initPacket=function(e,t){switch(e){case"hi":return{hi:{id:_(),ver:i,ua:l._appName+" ("+(l._browser?l._browser+"; ":"")+l._platform+"); "+s,dev:l._deviceToken,lang:l._humanLanguage}};case"acc":return{acc:{id:_(),user:null,scheme:null,secret:null,login:!1,tags:null,desc:{},cred:{}}};case"login":return{login:{id:_(),scheme:null,secret:null}};case"sub":return{sub:{id:_(),topic:t,set:{},get:{}}};case"leave":return{leave:{id:_(),topic:t,unsub:!1}};case"pub":return{pub:{id:_(),topic:t,noecho:!1,head:null,content:{}}};case"get":return{get:{id:_(),topic:t,what:null,desc:{},sub:{},data:{}}};case"set":return{set:{id:_(),topic:t,desc:{},sub:{},tags:[]}};case"del":return{del:{id:_(),topic:t,what:null,delseq:null,user:null,hard:!1}};case"note":return{note:{topic:t,what:null,seq:void 0}};default:throw new Error("Unknown packet type requested: "+e)}},this.send=function(e,t){var a;t&&(a=function(e){var t=null;return e&&(t=new Promise(function(t,n){l._pendingPromises[e]={resolve:t,reject:n}})),t}(t)),e=function e(t){return Object.keys(t).forEach(function(a){"_"==a[0]?delete t[a]:t[a]?Array.isArray(t[a])&&0==t[a].length?delete t[a]:t[a]?"object"!=n(t[a])||t[a]instanceof Date||(e(t[a]),0==Object.getOwnPropertyNames(t[a]).length&&delete t[a]):delete t[a]:delete t[a]}),t}(e);var o=JSON.stringify(e);l.logger("out: "+(l._trimLongStrings?JSON.stringify(e,g):o));try{l._connection.sendText(o)}catch(e){if(!t)throw e;y(t,c,null,e.message)}return a},this.loginSuccessful=function(e){e.params&&e.params.user&&(l._myUID=e.params.user,l._authenticated=e&&e.code>=200&&e.code<300,e.params&&e.params.token&&e.params.expires?l._authToken={token:e.params.token,expires:new Date(e.params.expires)}:l._authToken=null,l.onLogin&&l.onLogin(e.code,e.text))},this._connection.onMessage=function(e){if(e){l._inPacketCount++,l.onRawMessage&&l.onRawMessage(e);var t=JSON.parse(e,m);if(t)if(l.logger("in: "+(l._trimLongStrings?JSON.stringify(t,g):e)),l.onMessage&&l.onMessage(t),t.ctrl)l.onCtrlMessage&&l.onCtrlMessage(t.ctrl),t.ctrl.id&&y(t.ctrl.id,t.ctrl.code,t.ctrl,t.ctrl.text),t.ctrl.params&&"data"==t.ctrl.params.what&&(n=h("topic",t.ctrl.topic))&&n._allMessagesReceived(t.ctrl.params.count);else if(t.meta)(n=h("topic",t.meta.topic))&&n._routeMeta(t.meta),l.onMetaMessage&&l.onMetaMessage(t.meta);else if(t.data)(n=h("topic",t.data.topic))&&n._routeData(t.data),l.onDataMessage&&l.onDataMessage(t.data);else if(t.pres)(n=h("topic",t.pres.topic))&&n._routePres(t.pres),l.onPresMessage&&l.onPresMessage(t.pres);else if(t.info){var n;(n=h("topic",t.info.topic))&&n._routeInfo(t.info),l.onInfoMessage&&l.onInfoMessage(t.info)}else l.logger("ERROR: Unknown packet received.");else l.logger("in: "+e),l.logger("ERROR: failed to parse data")}},this._connection.onOpen=function(){l.hello()},this._connection.onDisconnect=function(e){for(var t in l._inPacketCount=0,l._serverInfo=null,l._authenticated=!1,l._pendingPromises){var n=l._pendingPromises[t];n&&n.reject&&n.reject(new Error(u+" ("+c+")"))}l._pendingPromises={},b(function(e,t){0===t.lastIndexOf("topic:",0)&&e._resetSub()}),l.onDisconnect&&l.onDisconnect(e)}};y.credential=function(e,t,a,o){if("object"==n(e)){var r=e;t=r.val,a=r.params,o=r.resp,e=r.meth}return e&&(t||o)?[{meth:e,val:t,resp:o,params:a}]:null},y.topicType=function(e){return{me:"me",fnd:"fnd",grp:"grp",new:"grp",usr:"p2p"}["string"==typeof e?e.substring(0,3):"xxx"]},y.isNewGroupTopicName=function(e){return"string"==typeof e&&"new"==e.substring(0,3)},y.getVersion=function(){return i},y.setWebSocketProvider=function(e){a=e},y.getLibrary=function(){return s},y.MESSAGE_STATUS_NONE=0,y.MESSAGE_STATUS_QUEUED=1,y.MESSAGE_STATUS_SENDING=2,y.MESSAGE_STATUS_FAILED=3,y.MESSAGE_STATUS_SENT=4,y.MESSAGE_STATUS_RECEIVED=5,y.MESSAGE_STATUS_READ=6,y.MESSAGE_STATUS_TO_ME=7,y.DEL_CHAR="␡",y.prototype={connect:function(e){return this._connection.connect(e)},disconnect:function(){this._connection&&this._connection.disconnect()},isConnected:function(){return this._connection&&this._connection.isConnected()},isAuthenticated:function(){return this._authenticated},account:function(e,t,n,a,o){var r=this.initPacket("acc");return r.acc.user=e,r.acc.scheme=t,r.acc.secret=n,r.acc.login=a,o&&(r.acc.desc.defacs=o.defacs,r.acc.desc.public=o.public,r.acc.desc.private=o.private,r.acc.tags=o.tags,r.acc.cred=o.cred,r.acc.token=o.token),this.send(r,r.acc.id)},createAccount:function(e,t,n,a){var o=this,r=this.account("new",e,t,n,a);return n&&(r=r.then(function(e){return o.loginSuccessful(e),e})),r},createAccountBasic:function(e,t,n){return e=e||"",t=t||"",this.createAccount("basic",d(e+":"+t),!0,n)},updateAccountBasic:function(e,t,n,a){return t=t||"",n=n||"",this.account(e,"basic",d(t+":"+n),!1,a)},hello:function(){var e=this,t=this.initPacket("hi");return this.send(t,t.hi.id).then(function(t){return t.params&&(e._serverInfo=t.params),e.onConnect&&e.onConnect(),t}).catch(function(t){e.onDisconnect&&e.onDisconnect(t)})},setDeviceToken:function(e,t){var n=!1;return e&&e!=this._deviceToken&&(this._deviceToken=e,t&&this.isConnected()&&this.isAuthenticated()&&(this.send({hi:{dev:e}}),n=!0)),n},login:function(e,t,n){var a=this,o=this.initPacket("login");return o.login.scheme=e,o.login.secret=t,o.login.cred=n,this.send(o,o.login.id).then(function(e){return a.loginSuccessful(e),e})},loginBasic:function(e,t,n){var a=this;return this.login("basic",d(e+":"+t),n).then(function(t){return a._login=e,t})},loginToken:function(e,t){return this.login("token",e,t)},requestResetAuthSecret:function(e,t,n){return this.login("reset",d(e+":"+t+":"+n))},getAuthToken:function(){return this._authToken&&this._authToken.expires.getTime()>Date.now()?this._authToken:(this._authToken=null,null)},setAuthToken:function(e){this._authToken=e},subscribe:function(e,t,n){var a=this.initPacket("sub",e);return e||(e="new"),a.sub.get=t,n&&(n.sub&&(a.sub.set.sub=n.sub),y.isNewGroupTopicName(e)&&n.desc&&(a.sub.set.desc=n.desc),n.tags&&(a.sub.set.tags=n.tags)),this.send(a,a.sub.id)},leave:function(e,t){var n=this.initPacket("leave",e);return n.leave.unsub=t,this.send(n,n.leave.id)},createMessage:function(t,n,a){var o=this.initPacket("pub",t),r="string"==typeof n?e.parse(n):n;return r&&!e.isPlainText(r)&&(o.pub.head={mime:e.getContentType()},n=r),o.pub.noecho=a,o.pub.content=n,o.pub},publish:function(e,t,n){return this.publishMessage(this.createMessage(e,t,n))},publishMessage:function(e){return(e=Object.assign({},e)).seq=void 0,e.from=void 0,e.ts=void 0,this.send({pub:e},e.id)},getMeta:function(e,t){var n=this.initPacket("get",e);return n.get=p(n.get,t),this.send(n,n.get.id)},setMeta:function(e,t){var n=this.initPacket("set",e),a=[];return t&&["desc","sub","tags"].map(function(e){t.hasOwnProperty(e)&&(a.push(e),n.set[e]=t[e])}),0==a.length?Promise.reject(new Error("Invalid {set} parameters")):this.send(n,n.set.id)},delMessages:function(e,t,n){var a=this.initPacket("del",e);return a.del.what="msg",a.del.delseq=t,a.del.hard=n,this.send(a,a.del.id)},delTopic:function(e){var t=this,n=this.initPacket("del",e);return n.del.what="topic",this.send(n,n.del.id).then(function(n){return t.cacheDel("topic",e),t.ctrl})},delSubscription:function(e,t){var n=this.initPacket("del",e);return n.del.what="sub",n.del.user=t,this.send(n,n.del.id)},note:function(e,t,n){if(n<=0||n>=268435455)throw new Error("Invalid message id "+n);var a=this.initPacket("note",e);a.note.what=t,a.note.seq=n,this.send(a)},noteKeyPress:function(e){var t=this.initPacket("note",e);t.note.what="kp",this.send(t)},getTopic:function(e){var t=this.cacheGet("topic",e);return!t&&e&&(t="me"==e?new E:"fnd"==e?new C:new S(e),this.cachePut("topic",e,t),this.attachCacheToTopic(t)),t},newTopic:function(e){var t=new S("new",e);return this.attachCacheToTopic(t),t},newGroupTopicName:function(){return"new"+this.getNextUniqueId()},newTopicWith:function(e,t){var n=new S(e,t);return this.attachCacheToTopic(n),n},getMeTopic:function(){return this.getTopic("me")},getFndTopic:function(){return this.getTopic("fnd")},getLargeFileHelper:function(){return new k(this)},getCurrentUserID:function(){return this._myUID},getCurrentLogin:function(){return this._login},getServerInfo:function(){return this._serverInfo},enableLogging:function(e,t){this._loggingEnabled=e,this._trimLongStrings=e&&t},isTopicOnline:function(e){var t=this.getMeTopic(),n=t&&t.getContact(e);return n&&n.online},wantAkn:function(e){this._messageId=e?Math.floor(16777215*Math.random()+16777215):0},onWebsocketOpen:void 0,onConnect:void 0,onDisconnect:void 0,onLogin:void 0,onCtrlMessage:void 0,onDataMessage:void 0,onPresMessage:void 0,onMessage:void 0,onRawMessage:void 0};var _=function(e){this.topic=e;var t=e._tinode.getMeTopic();this.contact=t&&t.getContact(e.name),this.what={}};_.prototype={_get_ims:function(){var e=this.contact&&this.contact.updated,t=this.topic._lastDescUpdate||0;return e>t?e:t},withData:function(e,t,n){return this.what.data={since:e,before:t,limit:n},this},withLaterData:function(e){return this.withData(this.topic._maxSeq>0?this.topic._maxSeq+1:void 0,void 0,e)},withEarlierData:function(e){return this.withData(void 0,this.topic._minSeq>0?this.topic._minSeq:void 0,e)},withDesc:function(e){return this.what.desc={ims:e},this},withLaterDesc:function(){return this.withDesc(this._get_ims())},withSub:function(e,t,n){var a={ims:e,limit:t};return"me"==this.topic.getType()?a.topic=n:a.user=n,this.what.sub=a,this},withOneSub:function(e,t){return this.withSub(e,void 0,t)},withLaterOneSub:function(e){return this.withOneSub(this.topic._lastSubsUpdate,e)},withLaterSub:function(e){return this.withSub("p2p"==this.topic.getType()?this._get_ims():this.topic._lastSubsUpdate,e)},withTags:function(){return this.what.tags=!0,this},withDel:function(e,t){return(e||t)&&(this.what.del={since:e,limit:t}),this},withLaterDel:function(e){return this.withDel(this.topic._maxSeq>0?this.topic._maxDel+1:void 0,e)},build:function(){var e={},t=[],n=this;return["data","sub","desc","tags","del"].map(function(a){n.what.hasOwnProperty(a)&&(t.push(a),Object.getOwnPropertyNames(n.what[a]).length>0&&(e[a]=n.what[a]))}),t.length>0?e.what=t.join(" "):e=void 0,e}};var w=function e(t){t&&(this.given="number"==typeof t.given?t.given:e.decode(t.given),this.want="number"==typeof t.want?t.want:e.decode(t.want),this.mode=t.mode?"number"==typeof t.mode?t.mode:e.decode(t.mode):this.given&this.want)};w._NONE=0,w._JOIN=1,w._READ=2,w._WRITE=4,w._PRES=8,w._APPROVE=16,w._SHARE=32,w._DELETE=64,w._OWNER=128,w._BITMASK=w._JOIN|w._READ|w._WRITE|w._PRES|w._APPROVE|w._SHARE|w._DELETE|w._OWNER,w._INVALID=1048576,w.decode=function(e){if(!e)return null;if("number"==typeof e)return e&w._BITMASK;if("N"===e||"n"===e)return w._NONE;for(var t={J:w._JOIN,R:w._READ,W:w._WRITE,P:w._PRES,A:w._APPROVE,S:w._SHARE,D:w._DELETE,O:w._OWNER},n=w._NONE,a=0;a0)){l=!0;break}r=i-1}return l?i:a?-1:s<0?i+1:i}function a(e,t){var a=n(e,t,!1);return t.splice(a,0,e),t}return e=e||function(e,t){return e===t?0:e0)return n[0]},delRange:function(e,n){return t.splice(e,n-e)},size:function(){return t.length},reset:function(e){t=[]},forEach:function(e,n,a,o){n|=0,a=a||t.length;for(var r=n;r=300)return e;if(n._subscribed=!0,n.acs=e.params&&e.params.acs?e.params.acs:n.acs,n._new){n._new=!1,n.name=e.topic,n.created=e.ts,n.updated=e.ts,n.touched=e.ts,n._cachePutSelf();var a=n._tinode.getMeTopic();a&&a._processMetaSub([{_generated:!0,topic:n.name,created:e.ts,updated:e.ts,touched:e.ts,acs:n.acs}]),t&&t.desc&&(t.desc._generated=!0,n._processMetaDesc(t.desc))}return e})},createMessage:function(e,t){return this._tinode.createMessage(this.name,e,t)},publish:function(e,t){return this.publishMessage(this.createMessage(e,t))},publishMessage:function(t){var n=this;if(!this._subscribed)return Promise.reject(new Error("Cannot publish on inactive topic"));if(e.hasAttachments(t.content)&&!t.head.attachments){var a=[];e.attachments(t.content,function(e){a.push(e.ref)}),t.head.attachments=a}return t._sending=!0,this._tinode.publishMessage(t).then(function(e){return t._sending=!1,t.seq=e.params.seq,t.ts=e.ts,n._routeData(t),e}).catch(function(e){t._sending=!1,t._failed=!0})},publishDraft:function(e,t){var n=this;if(!t&&!this._subscribed)return Promise.reject(new Error("Cannot publish on inactive topic"));var a=e.seq||this._getQueuedSeqId();return e._generated||(e._generated=!0,e.seq=a,e.ts=new Date,e.from=this._tinode.getCurrentUserID(),e.noecho=!0,this._messages.put(e),this.onData&&this.onData(e)),(t||Promise.resolve()).then(function(){return e._cancelled?{code:300,text:"cancelled"}:n.publishMessage(e)},function(t){e._sending=!1,n._messages.delAt(n._messages.find(e)),n.onData&&n.onData()})},leave:function(e){var t=this;return this._subscribed||e?this._tinode.leave(this.name,e).then(function(n){return t._resetSub(),e&&t._gone(),n}):Promise.reject(new Error("Cannot leave inactive topic"))},getMeta:function(e){return this._subscribed?this._tinode.getMeta(this.name,e):Promise.reject(new Error("Cannot query inactive topic"))},getMessagesPage:function(e,t){var n=this,a=this.startMetaQuery();t?a.withLaterData(e):a.withEarlierData(e);var o=this.getMeta(a.build());return t||(o=o.then(function(e){e&&e.params&&!e.params.count&&(n._noEarlierMsgs=!0)})),o},setMeta:function(e){var t=this;return this._subscribed?(e.tags&&(e.tags=function(e){var t=[];if(Array.isArray(e)){for(var n=0,a=e.length;n1&&t.push(o)}t.sort().filter(function(e,t,n){return!t||e!=n[t-1]})}return 0==t.length&&t.push(y.DEL_CHAR),t}(e.tags)),this._tinode.setMeta(this.name,e).then(function(n){return n&&n.code>=300?n:(e.sub&&(n.params&&n.params.acs&&(e.sub.acs=n.params.acs,e.sub.updated=n.ts),e.sub.user||(e.sub.user=t._tinode.getCurrentUserID(),e.desc||(e.desc={})),e.sub._generated=!0,t._processMetaSub([e.sub])),e.desc&&(n.params&&n.params.acs&&(e.desc.acs=n.params.acs,e.desc.updated=n.ts),t._processMetaDesc(e.desc)),e.tags&&t._processMetaTags(e.tags),n)})):Promise.reject(new Error("Cannot update inactive topic"))},invite:function(e,t){return this.setMeta({sub:{user:e,mode:t}})},delMessages:function(e,t){var n=this;if(!this._subscribed)return Promise.reject(new Error("Cannot delete messages in inactive topic"));e.sort(function(e,t){return e.low=t.hi)});var a=e.reduce(function(e,t){return t.low<268435455&&(!t.hi||t.hi<268435455?e.push(t):e.push({low:t.low,hi:n._maxSeq+1})),e},[]);return(e.length>0?this._tinode.delMessages(this.name,a,t):Promise.resolve({params:{del:0}})).then(function(t){return t.params.del>n._maxDel&&(n._maxDel=t.params.del),e.map(function(e){e.hi?n.flushMessageRange(e.low,e.hi):n.flushMessage(e.low)}),n.onData&&n.onData(),t})},delMessagesAll:function(e){return this.delMessages([{low:1,hi:this._maxSeq+1,_all:!0}],e)},delMessagesList:function(e,t){e.sort(function(e,t){return e-t});var n=e.reduce(function(e,t){if(0==e.length)e.push({low:t});else{var n=e[e.length-1];!n.hi&&t!=n.low+1||t>n.hi?e.push({low:t}):n.hi=n.hi?Math.max(n.hi,t+1):t+1}return e},[]);return this.delMessages(n,t)},delTopic:function(){var e=this;return this._tinode.delTopic(this.name).then(function(t){return e._resetSub(),e._gone(),t})},delSubscription:function(e){var t=this;return this._subscribed?this._tinode.delSubscription(this.name,e).then(function(n){return delete t._users[e],t.onSubsUpdated&&t.onSubsUpdated(Object.keys(t._users)),n}):Promise.reject(new Error("Cannot delete subscription in inactive topic"))},note:function(e,t){var n=this._users[this._tinode.getCurrentUserID()];n?((!n[e]||n[e]0)for(var o in this._users){var r=this._users[o];r.user!==a&&r[e]>=t&&n++}return n},msgReadCount:function(e){return this.msgReceiptCount("read",e)},msgRecvCount:function(e){return this.msgReceiptCount("recv",e)},msgHasMoreMessages:function(e){return e?this.seq>this._maxSeq:this._minSeq>1&&!this._noEarlierMsgs},isNewMessage:function(e){return this._maxSeq<=e},flushMessage:function(e){var t=this._messages.find({seq:e});return t>=0?this._messages.delAt(t):void 0},flushMessageRange:function(e,t){var n=this._messages.find({seq:e});return n>=0?this._messages.delRange(n,this._messages.find({seq:t},!0)):[]},cancelSend:function(e){var t=this._messages.find({seq:e});if(t>=0){var n=this._messages.getAt(t);if(1==this.msgStatus(n))return n._cancelled=!0,this._messages.delAt(t),!0}return!1},getType:function(){return y.topicType(this.name)},getAccessMode:function(){return this.acs},getDefaultAccess:function(){return this.defacs},startMetaQuery:function(){return new _(this)},msgStatus:function(e){var t=0;return e.from==this._tinode.getCurrentUserID()?e._sending?t=2:e._failed?t=3:e.seq>=268435455?t=1:this.msgReadCount(e.seq)>0?t=6:this.msgRecvCount(e.seq)>0?t=5:e.seq>0&&(t=4):t=7,t},_routeData:function(e){e.content&&((!this.touched||this.touchedthis._maxSeq&&(this._maxSeq=e.seq),(e.seq0&&(this._lastSubsUpdate=e.ts,this._processMetaSub(e.sub)),e.del&&this._processDelMessages(e.del.clear,e.del.delseq),e.tags&&this._processMetaTags(e.tags),this.onMeta&&this.onMeta(e)},_routePres:function(e){var t;switch(e.what){case"del":this._processDelMessages(e.clear,e.delseq);break;case"on":case"off":(t=this._users[e.src])?t.online="on"==e.what:this._tinode.logger("Presence update for an unknown user",this.name,e.src);break;case"acs":var n="me"==e.src?this._tinode.getCurrentUserID():e.src;if(t=this._users[n])t.acs.updateAll(e.dacs),n==this._tinode.getCurrentUserID()&&this.acs.updateAll(e.dacs),t.acs&&t.acs.mode!=w._NONE||("p2p"==this.getType()&&this.leave(),this._processMetaSub([{user:n,deleted:new Date,_generated:!0}]));else{var a=(new w).updateAll(e.dacs);a&&a.mode!=w._NONE&&((t=this._cacheGetUser(n))?t.acs=a:(t={user:n,acs:a},this.getMeta(this.startMetaQuery().withOneSub(void 0,n).build())),t._generated=!0,t.updated=new Date,this._processMetaSub([t]))}break;default:this._tinode.logger("Ignored presence update",e.what)}this.onPres&&this.onPres(e)},_routeInfo:function(e){if("kp"!==e.what){var t=this._users[e.from];t&&(t[e.what]=e.seq)}this.onInfo&&this.onInfo(e)},_processMetaDesc:function(e,t){if(p(this,e),"string"==typeof this.created&&(this.created=new Date(this.created)),"string"==typeof this.updated&&(this.updated=new Date(this.updated)),"string"==typeof this.touched&&(this.touched=new Date(this.touched)),"me"!==this.name&&!t&&!e._generated){var n=this._tinode.getMeTopic();n&&n._processMetaSub([{_generated:!0,topic:this.name,updated:this.updated,touched:this.touched,acs:this.acs,public:this.public,private:this.private}])}this.onMetaDesc&&this.onMetaDesc(this)},_processMetaSub:function(e){var t=void 0;for(var n in e){var a=e[n];if(a.user){a.updated=new Date(a.updated),a.deleted=a.deleted?new Date(a.deleted):null;var o=null;a.deleted?(delete this._users[a.user],o=a):((o=this._users[a.user])||(o=this._cacheGetUser(a.user)),o=this._updateCachedUser(a.user,a,a._generated)),this.onMetaSub&&this.onMetaSub(o)}else a._generated||(t=a)}t&&this.onMetaDesc&&this.onMetaDesc(t),this.onSubsUpdated&&this.onSubsUpdated(Object.keys(this._users))},_processMetaTags:function(e){1==e.length&&e[0]==y.DEL_CHAR&&(e=[]),this._tags=e,this.onTagsUpdated&&this.onTagsUpdated(e)},_processDelMessages:function(e,t){this._maxDel=Math.max(e,this._maxDel),this.clear=Math.max(e,this.clear);var n=this,a=0;Array.isArray(t)&&t.map(function(e){if(e.hi)for(var t=e.low;t0&&this.onData&&this.onData()},_allMessagesReceived:function(e){this.onAllMessagesReceived&&this.onAllMessagesReceived(e)},_resetSub:function(){this._subscribed=!1},_gone:function(){this._messages.reset(),this._users={},this.acs=new w(null),this.private=null,this.public=null,this._maxSeq=0,this._minSeq=0,this._subscribed=!1;var e=this._tinode.getMeTopic();e&&e._routePres({_generated:!0,what:"gone",topic:"me",src:this.name}),this.onDeleteTopic&&this.onDeleteTopic()},_updateCachedUser:function(e,t,n){var a=this._cacheGetUser(e);return a?a=p(a,t):(n&&this.getMeta(this.startMetaQuery().withLaterOneSub(e).build()),a=p({},t)),this._cachePutUser(e,a),h(this._users,e,a)},_getQueuedSeqId:function(){return this._queuedSeqId++}};var E=function(e){S.call(this,"me",e),this._contacts={},e&&(this.onContactUpdate=e.onContactUpdate)};E.prototype=Object.create(S.prototype,{_processMetaSub:{value:function(e){var t=0;for(var n in e){var a=e[n],o=a.topic;if("fnd"!=o&&"me"!=o){a.updated=new Date(a.updated),a.touched=a.touched?new Date(a.touched):null,a.deleted=a.deleted?new Date(a.deleted):null,a.seq=0|a.seq,a.recv=0|a.recv,a.read=0|a.read,a.unread=a.seq-a.read;var r=null;if(a.deleted)r=a,delete this._contacts[o];else if(a.seen&&a.seen.when&&(a.seen.when=new Date(a.seen.when)),r=h(this._contacts,o,a),"p2p"==y.topicType(o)&&this._cachePutUser(o,r),!a._generated){var i=this._tinode.getTopic(o);i&&i._processMetaDesc(a,!0)}t++,this.onMetaSub&&this.onMetaSub(r)}}t>0&&this.onSubsUpdated&&this.onSubsUpdated(Object.keys(this._contacts))},enumerable:!0,configurable:!0,writable:!1},_routePres:{value:function(e){var t=this._contacts[e.src];if(t){switch(e.what){case"on":t.online=!0;break;case"off":t.online&&(t.online=!1,t.seen?t.seen.when=new Date:t.seen={when:new Date});break;case"msg":t.touched=new Date,t.seq=0|e.seq,t.unread=t.seq-t.read;break;case"upd":this.getMeta(this.startMetaQuery().withLaterOneSub(e.src).build());break;case"acs":t.acs?t.acs.updateAll(e.dacs):t.acs=(new w).updateAll(e.dacs);break;case"ua":t.seen={when:new Date,ua:e.ua};break;case"recv":t.recv=t.recv?Math.max(t.recv,e.seq):0|e.seq;break;case"read":t.read=t.read?Math.max(t.read,e.seq):0|e.seq,t.unread=t.seq-t.read;break;case"gone":delete this._contacts[e.src]}this.onContactUpdate&&this.onContactUpdate(e.what,t)}else if("acs"==e.what){var n=new w(e.dacs);if(!n||n.mode==w._INVALID)return void this._tinode.logger("Invalid access mode update",e.src,e.dacs);if(n.mode==w._NONE)return void this._tinode.logger("Removing non-existent subscription",e.src,e.dacs);this.getMeta(this.startMetaQuery().withOneSub(void 0,e.src).build()),this._contacts[e.src]={topic:e.src,online:!1,acs:n}}this.onPres&&this.onPres(e)},enumerable:!0,configurable:!0,writable:!1},publish:{value:function(){return Promise.reject(new Error("Publishing to 'me' is not supported"))},enumerable:!0,configurable:!0,writable:!1},contacts:{value:function(e,t){var n=e||this.onMetaSub;if(n)for(var a in this._contacts)n.call(t,this._contacts[a],a,this._contacts)},enumerable:!0,configurable:!0,writable:!0},setMsgReadRecv:{value:function(e,t,n,a){var o,r=this._contacts[e],i=!1;if(r){switch(n|=0,t){case"recv":o=r.recv,r.recv=r.recv?Math.max(r.recv,n):n,i=o!=r.recv;break;case"read":o=r.read,r.read=r.read?Math.max(r.read,n):n,r.unread=r.seq-r.read,i=o!=r.read,r.recv0&&this.onSubsUpdated&&this.onSubsUpdated(Object.keys(this._contacts))},enumerable:!0,configurable:!0,writable:!1},publish:{value:function(){return Promise.reject(new Error("Publishing to 'fnd' is not supported"))},enumerable:!0,configurable:!0,writable:!1},setMeta:{value:function(e){var t=this;return Object.getPrototypeOf(C.prototype).setMeta.call(this,e).then(function(){Object.keys(t._contacts).length>0&&(t._contacts={},t.onSubsUpdated&&t.onSubsUpdated([]))})},enumerable:!0,configurable:!0,writable:!1},contacts:{value:function(e,t){var n=e||this.onMetaSub;if(n)for(var a in this._contacts)n.call(t,this._contacts[a],a,this._contacts)},enumerable:!0,configurable:!0,writable:!0}}),C.prototype.constructor=C;var k=function(e){this._tinode=e,this._apiKey=e._apiKey,this._authToken=e.getAuthToken(),this._msgId=e.getNextUniqueId(),this.xhr=f(),this.toResolve=null,this.toReject=null,this.onProgress=null,this.onSuccess=null,this.onFailure=null};k.prototype={upload:function(e,t,n,a){var o=this;if(!this._authToken)throw new Error("Must authenticate first");var i=this;this.xhr.open("POST","/v"+r+"/file/u/",!0),this.xhr.setRequestHeader("X-Tinode-APIKey",this._apiKey),this.xhr.setRequestHeader("X-Tinode-Auth","Token "+this._authToken.token);var s=new Promise(function(e,t){o.toResolve=e,o.toReject=t});this.onProgress=t,this.onSuccess=n,this.onFailure=a,this.xhr.upload.onprogress=function(e){e.lengthComputable&&i.onProgress&&i.onProgress(e.loaded/e.total)},this.xhr.onload=function(){var e;try{e=JSON.parse(this.response,m)}catch(e){i._tinode.logger("Invalid server response in LargeFileHelper",this.response)}this.status>=200&&this.status<300?(i.toResolve&&i.toResolve(e.ctrl.params.url),i.onSuccess&&i.onSuccess(e.ctrl)):this.status>=400?(i.toReject&&i.toReject(new Error(e.ctrl.text+" ("+e.ctrl.code+")")),i.onFailure&&i.onFailure(e.ctrl)):i._tinode.logger("Unexpected server response status",this.status,this.response)},this.xhr.onerror=function(e){i.toReject&&i.toReject(new Error("failed")),i.onFailure&&i.onFailure(null)},this.xhr.onabort=function(e){i.toReject&&i.toReject(new Error("upload cancelled by user")),i.onFailure&&i.onFailure(null)};try{var l=new FormData;l.append("file",e),l.set("id",this._msgId),this.xhr.send(l)}catch(e){this.toReject&&this.toReject(e),this.onFailure&&this.onFailure(null)}return s},download:function(e,t,n,a){var o=this;if(/^(?:(?:[a-z]+:)?\/\/)/i.test(e))throw new Error("The URL '"+e+"' must be relative, not absolute");if(!this._authToken)throw new Error("Must authenticate first");var r=this;this.xhr.open("GET",e,!0),this.xhr.setRequestHeader("X-Tinode-APIKey",this._apiKey),this.xhr.setRequestHeader("X-Tinode-Auth","Token "+this._authToken.token),this.xhr.responseType="blob",this.onProgress=a,this.xhr.onprogress=function(e){r.onProgress&&r.onProgress(e.loaded)};var i=new Promise(function(e,t){o.toResolve=e,o.toReject=t});this.xhr.onload=function(){if(200==this.status){var e=document.createElement("a");e.href=window.URL.createObjectURL(new Blob([this.response],{type:n})),e.style.display="none",e.setAttribute("download",t),document.body.appendChild(e),e.click(),document.body.removeChild(e),window.URL.revokeObjectURL(e.href),r.toResolve&&r.toResolve()}else if(this.status>=400&&r.toReject){var a=new FileReader;a.onload=function(){try{var e=JSON.parse(this.result,m);r.toReject(new Error(e.ctrl.text+" ("+e.ctrl.code+")"))}catch(e){r._tinode.logger("Invalid server response in LargeFileHelper",this.result),r.toReject(e)}},a.readAsText(this.response)}},this.xhr.onerror=function(e){r.toReject&&r.toReject(new Error("failed"))},this.xhr.onabort=function(){r.toReject&&r.toReject(null)};try{this.xhr.send()}catch(e){this.toReject&&this.toReject(e)}return i},cancel:function(){this.xhr&&this.xhr.readyState<4&&this.xhr.abort()},getId:function(){return this._msgId}};var M=function e(t,n){this.status=e.STATUS_NONE,this.topic=t,this.content=n};M.STATUS_NONE=0,M.STATUS_QUEUED=1,M.STATUS_SENDING=2,M.STATUS_FAILED=3,M.STATUS_SENT=4,M.STATUS_RECEIVED=5,M.STATUS_READ=6,M.STATUS_TO_ME=7,(M.prototype={toJSON:function(){},fromJSON:function(e){}}).constructor=M,l.exports=y,l.exports.Drafty=e}.call(this,void 0!==t?t:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{}),l=l.exports}()}).call(this,n(9))},function(e,t){e.exports=ReactDOM},function(e){e.exports={en:{contacts_not_found:"You have no chats
¯\\\\_(ツ)_/¯",full_name_prompt:"Full name, e.g. John Doe",email_prompt:"Email, e.g. jdoe@example.com",button_sign_up:"Sign up",label_your_name:"Your name",label_password:"Password",password_unchanged_prompt:"Unchanged",label_user_id:"Address:",label_default_access_mode:"Default access mode:",label_message_sound:"Message sound:",label_push_notifications:"Notification alerts:",label_push_notifications_disabled:"Notification alerts (requires HTTPS):",title_tag_manager:"Tags (user discovery)",button_logout:"Logout",requested_permissions:"Requested",granted_permissions:"Granted",menu_item_edit_permissions:"Edit permissions",label_other_user:"Other",title_info:"Info",label_topic_name:"Name",label_private:"Private comment",private_editing_placeholder:"Visible to you only",label_muting_topic:"Muted:",action_more:"More",label_your_permissions:"Your permissions:",label_permissions:"Permissions:",label_you:"You:",label_default_access:"Default access mode:",label_group_members:"Group members:",button_add_members:"Add members",button_leave:"Leave",group_has_no_members:"No members",action_leave_chat:"Leave",login_prompt:"Login",password_prompt:"Password",stay_logged_in:"Stay logged in",forgot_password_link:"Forgot password?",button_sign_in:"Sign in",label_client:"Client:",label_server:"Server:",online_now:"online now",last_seen_timestamp:"Last seen",title_not_found:"Not found",unnamed_topic:"Unnamed",messages_not_readable:"no access to messages",tabtitle_find_user:"find",tabtitle_new_group:"new group",tabtitle_group_by_id:"by id",search_for_contacts:"Use search to find contacts",new_password_placeholder:"Enter new password",label_reset_password:"Send a password reset email:",credential_email_prompt:"Your registration email",button_reset:"Reset",button_send_request:"Send request",label_server_to_use:"Server to use:",label_wire_transport:"Wire transport:",button_update:"Update",sidepanel_title_login:"Sign In",sidepanel_title_register:"Create Account",sidepanel_title_settings:"Settings",sidepanel_title_edit_account:"Edit Account",sidepanel_title_newtpk:"Start New Chat",sidepanel_title_cred:"Confirm Credentials",sidepanel_title_reset:"Reset Password",phone_dative:"phone",email_dative:"email",enter_confirmation_code_prompt:"Enter confirmation code sent to you by {method}:",numeric_confirmation_code_prompt:"Numbers only",button_confirm:"Confirm",invalid_content:"invalid content",badge_you:"you",badge_owner:"owner",menu_item_info:"Info",menu_item_clear_messages:"Clear messages",menu_item_clear_messages_for_all:"Clear for All",menu_item_delete:"Delete",menu_item_delete_for_all:"Delete for All",menu_item_mute:"Mute",menu_item_unmute:"Unmute",menu_item_delete_topic:"Delete",menu_item_unblock:"Unblock",menu_item_block:"Block",menu_item_member_delete:"Remove",action_cancel:"cancel",upload_finishing:"finishing...",no_contacts:"You have no contacts :-(",contacts_not_found_short:"No contacts match '{query}'",title_group_members:"Group Members",title_all_contacts:"All Contacts",button_ok:"OK",button_cancel:"Cancel",download_action:"download",label_file_name:"File name:",label_content_type:"Content type:",label_size:"Size:",error_invalid_id:"Invalid ID",group_user_id_prompt:"Group or User ID",button_subscribe:"Subscribe",topic_name_editing_placeholder:"Freeform name of the group",button_create:"Create",permission_join:"Join ({val})",permission_read:"Read ({val})",permission_write:"Write ({val})",permission_pres:"Get notified ({val})",permission_admin:"Approve ({val})",permission_share:"Share ({val})",permission_delete:"Delete ({val})",permission_owner:"Owner ({val})",title_permissions:"Permissions",message_sending:"sending...",message_sending_failed:"failed",search_placeholder:"List like email:alice@example.com, tel:17025550003...",messaging_disabled_prompt:"Messaging disabled",new_message_prompt:"New message",file_attachment_too_large:"The file size {size} exceeds the {limit} limit.",cannot_initiate_file_upload:"Cannot initiate file upload.",tags_not_found:"No tags defined. Add some.",tags_editor_no_tags:"Add some tags",title_manage_tags:"Manage tags"},ru:{contacts_not_found:"Чатов нет
¯\\\\_(ツ)_/¯",full_name_prompt:"Полное имя, напр. Иван Петров",email_prompt:"Email, напр. ivan@example.com",button_sign_up:"Создать счет",label_your_name:"Ваше имя",label_password:"Пароль",password_unchanged_prompt:"Не изменен",label_user_id:"Адрес:",label_default_access_mode:"Доступ по умолчанию:",label_message_sound:"Звук нового сообщения:",label_push_notifications:"Уведомления:",label_push_notifications_disabled:"Уведомления (требуют HTTPS):",title_tag_manager:"Таги для поиска",button_logout:"Выйти",login_prompt:"Логин",password_prompt:"Пароль",stay_logged_in:"Запомнить",forgot_password_link:"Напомнить пароль",button_sign_in:"Войти",label_client:"Клиент:",label_server:"Сервер:",online_now:"онлайн",last_seen_timestamp:"Был активен",title_not_found:"Не найден",unnamed_topic:"Без названия",messages_not_readable:"нет доступа к сообщениям",tabtitle_find_user:"найти",tabtitle_new_group:"создать",tabtitle_group_by_id:"по id",label_server_to_use:"Использовать сервер:",label_wire_transport:"Соединение:",button_update:"Применить",sidepanel_title_login:"Авторизация",sidepanel_title_register:"Зарегистрироваться",sidepanel_title_settings:"Настройки",sidepanel_title_edit_account:"Редактировать счет",sidepanel_title_newtpk:"Новый чат",sidepanel_title_cred:"Подтвердить",sidepanel_title_reset:"Сменить пароль",tags_not_found:"Тагов нет. Добавьте",tags_editor_no_tags:"Добавьте таги",title_manage_tags:"Редактор тагов",message_sending:"в пути...",message_sending_failed:"ошибка",search_placeholder:"Список, напр. email:alice@example.com, tel:17025550003...",messaging_disabled_prompt:"Отправка недоступна",new_message_prompt:"Новое сообщение",file_attachment_too_large:"Размер файла {size} превышает {limit} лимит.",cannot_initiate_file_upload:"Ошибка загрузки файла.",search_for_contacts:"Поиск контактов",enter_confirmation_code_prompt:"Код подтверждения, полученный по {method}:",numeric_confirmation_code_prompt:"Только цифры",button_confirm:"Подтвердить",button_ok:"OK",button_cancel:"Отменить",invalid_content:"сообщение не читается",label_file_name:"Имя файла:",label_content_type:"Тип:",label_size:"Размер:",phone_dative:"телефону",email_dative:"емейлу",title_group_members:"Участники",download_action:"скачать",permission_join:"Подписываться ({val})",permission_read:"Читать ({val})",permission_write:"Писать ({val})",permission_pres:"Уведомлять ({val})",permission_admin:"Подтверждать ({val})",permission_share:"Приглашать ({val})",permission_delete:"Удалять ({val})",permission_owner:"Владелец ({val})",title_permissions:"Права доступа",requested_permissions:"Требуются",granted_permissions:"Получены",menu_item_edit_permissions:"Права доступа",label_other_user:"Второй",label_topic_name:"Название",label_private:"Комментарий",private_editing_placeholder:"Виден только вам",label_muting_topic:"Без уведомлений",action_more:"Ещё",label_your_permissions:"Ваши права доступа:",label_permissions:"Права доступа:",label_you:"Вы:",label_default_access:"Права по умолчанию:",label_group_members:"Участники чата:",button_add_members:"Добавить",button_leave:"Отписаться",group_has_no_members:"Нет участников",action_leave_chat:"Уйти из чата",menu_item_info:"Информация",menu_item_clear_messages:"Удалить сообщения",menu_item_clear_messages_for_all:"Удалить для всех",menu_item_delete:"Удалить",menu_item_delete_for_all:"Удалить для всех",menu_item_mute:"Не уведомлять",menu_item_unmute:"Уведомлять",menu_item_delete_topic:"Удалить чат",menu_item_unblock:"Разблокировать",menu_item_block:"Заблокировать",menu_item_member_delete:"Отписать",title_info:"Подробности",new_password_placeholder:"Введите новый пароль",label_reset_password:"Отправить емейл для смены пароля:",credential_email_prompt:"Регистрационный емейл",button_reset:"Изменить",button_send_request:"Отправить",action_cancel:"отменить",upload_finishing:"завершение...",no_contacts:"Ничего нет :-(",contacts_not_found_short:"Нет контактов для запроса '{query}'",title_all_contacts:"Все контакты",error_invalid_id:"Неверный ID",group_user_id_prompt:"ID чата или пользователя",button_subscribe:"Подписаться",topic_name_editing_placeholder:"Название чата",button_create:"Создать",badge_you:"вы",badge_owner:"влад."}}},function(e,t){e.exports=firebase},function(e,t,n){e.exports=function(){"use strict";return[{locale:"ru",pluralRuleFunction:function(e,t){var n=String(e).split("."),a=n[0],o=!n[1],r=a.slice(-1),i=a.slice(-2);return t?"other":o&&1==r&&11!=i?"one":o&&r>=2&&r<=4&&(i<12||i>14)?"few":o&&0==r||o&&r>=5&&r<=9||o&&i>=11&&i<=14?"many":"other"},fields:{year:{displayName:"год",relative:{0:"в этом году",1:"в следующем году","-1":"в прошлом году"},relativeTime:{future:{one:"через {0} год",few:"через {0} года",many:"через {0} лет",other:"через {0} года"},past:{one:"{0} год назад",few:"{0} года назад",many:"{0} лет назад",other:"{0} года назад"}}},month:{displayName:"месяц",relative:{0:"в этом месяце",1:"в следующем месяце","-1":"в прошлом месяце"},relativeTime:{future:{one:"через {0} месяц",few:"через {0} месяца",many:"через {0} месяцев",other:"через {0} месяца"},past:{one:"{0} месяц назад",few:"{0} месяца назад",many:"{0} месяцев назад",other:"{0} месяца назад"}}},day:{displayName:"день",relative:{0:"сегодня",1:"завтра",2:"послезавтра","-2":"позавчера","-1":"вчера"},relativeTime:{future:{one:"через {0} день",few:"через {0} дня",many:"через {0} дней",other:"через {0} дня"},past:{one:"{0} день назад",few:"{0} дня назад",many:"{0} дней назад",other:"{0} дня назад"}}},hour:{displayName:"час",relative:{0:"в этом часе"},relativeTime:{future:{one:"через {0} час",few:"через {0} часа",many:"через {0} часов",other:"через {0} часа"},past:{one:"{0} час назад",few:"{0} часа назад",many:"{0} часов назад",other:"{0} часа назад"}}},minute:{displayName:"минута",relative:{0:"в эту минуту"},relativeTime:{future:{one:"через {0} минуту",few:"через {0} минуты",many:"через {0} минут",other:"через {0} минуты"},past:{one:"{0} минуту назад",few:"{0} минуты назад",many:"{0} минут назад",other:"{0} минуты назад"}}},second:{displayName:"секунда",relative:{0:"сейчас"},relativeTime:{future:{one:"через {0} секунду",few:"через {0} секунды",many:"через {0} секунд",other:"через {0} секунды"},past:{one:"{0} секунду назад",few:"{0} секунды назад",many:"{0} секунд назад",other:"{0} секунды назад"}}}}},{locale:"ru-BY",parentLocale:"ru"},{locale:"ru-KG",parentLocale:"ru"},{locale:"ru-KZ",parentLocale:"ru"},{locale:"ru-MD",parentLocale:"ru"},{locale:"ru-UA",parentLocale:"ru"}]}()},function(e,t,n){e.exports=n(10)},function(e,t){e.exports=firebase.messaging},function(e,t){var n;n=function(){return this}();try{n=n||Function("return this")()||(0,eval)("this")}catch(e){"object"==typeof window&&(n=window)}e.exports=n},function(e,t,n){"use strict";n.r(t);var a=n(0),o=n.n(a),r=n(3),i=n.n(r),s=n(1),l=n(6),c=n.n(l),u=n(4),d=n(5),p=(n(8),n(2)),h=n.n(p),f="TinodeWeb/0.15.9-rc1",m={hosted:"api.tinode.co",local:"localhost:6060"},g=m.hosted,b=3e3,v=195840,y=768;function _(e){return(_="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}function w(e,t){for(var n=0;n0?a<3?2:a<30?1:0:0;return a.toFixed(o)+" "+t[n]}function j(e){return(j="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}function N(e,t){for(var n=0;n=0&&(e=e.substring(0,o)),e+"."+a}function H(e,t,n,a,o,r){var i=new Image;i.crossOrigin="Anonymous",i.onerror=function(e){r("Image format unrecognized")},i.onload=function(){var i=L(this.width,this.height,t,n,a);if(i){var s=document.createElement("canvas");s.width=i.dstWidth,s.height=i.dstHeight;var l=s.getContext("2d");l.imageSmoothingEnabled=!0,l.drawImage(this,i.xoffset,i.yoffset,i.srcWidth,i.srcHeight,0,0,i.dstWidth,i.dstHeight);var c=this.width!=i.dstWidth||this.height!=i.dstHeight||R.indexOf(e.type)<0?"image/jpeg":e.type,u=s.toDataURL(c);if(c=V(u.split(",")[0])){var d=.78;if(K(u.length)>v&&(c="image/jpeg"),"image/jpeg"==c)for(;K(u.length)>v&&d>.45;)u=s.toDataURL(c,d),d*=.84;K(u.length)>v?r("The image size "+bytesToHumanSize(K(u.length))+" exceeds the "+bytesToHumanSize(v)+" limit.","err"):(s=null,o(u.split(",")[1],c,i.dstWidth,i.dstHeight,q(e.name,c)))}else r("Unsupported image format")}else r("Invalid image")},i.src=URL.createObjectURL(e)}function W(e,t,n){var a=new FileReader;a.addEventListener("load",function(){var o=a.result.split(","),r=V(o[0]);if(r){var i=new Image;i.crossOrigin="Anonymous",i.onload=function(){t(o[1],r,this.width,this.height,q(e.name,r))},i.onerror=function(e){n("Image format not recognized")},i.src=URL.createObjectURL(e)}else n("Failed to process image file")},!1),a.readAsDataURL(e)}function G(e,t,n){var a=new FileReader;a.addEventListener("load",function(){t(e.type,a.result.split(",")[1],e.name)}),a.readAsDataURL(e)}function V(e){var t=/^data:(image\/[-+a-z0-9.]+);base64/.exec(e);return t&&t.length>1?t[1]:null}function K(e){return 3*Math.floor(e/4)}function B(e){return(B="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}function z(e,t){for(var n=0;n0&&(e=[],this.props.badges.map(function(t){var n="badge"+(t.color?" "+t.color:"");e.push(o.a.createElement("span",{className:n,key:t.key||t.name},t.name))})),o.a.createElement("span",null,e)}}])&&re(n.prototype,a),r&&re(n,r),t}();function ue(e){return(ue="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}function de(e,t){for(var n=0;n0){var t=this.props.count>9?"9+":this.props.count;e=o.a.createElement("span",{className:"unread"},t)}return e}}])&&de(n.prototype,a),r&&de(n,r),t}();function ge(e){return(ge="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}function be(e,t){for(var n=0;n30&&(e=e.substring(0,28)+"..."):e=o.a.createElement("i",null,o.a.createElement(s.FormattedMessage,{id:"unnamed_topic"}));var t=this.props.now?"online":"offline",n=!this.props.avatar||this.props.avatar,a=this.props.badges.slice();return this.props.showMode&&this.props.acs&&a.push({name:this.props.acs.getMode(),key:"mode"}),o.a.createElement("li",{className:!this.props.showCheckmark&&this.props.selected?"selected":null,onClick:this.handleClick},o.a.createElement("div",{className:"avatar-box"},o.a.createElement(D,{avatar:n,title:this.props.title,topic:this.props.item}),this.props.showOnline?o.a.createElement("span",{className:t}):this.props.showCheckmark&&this.props.selected?o.a.createElement("i",{className:"checkmark material-icons"},"check_circle"):null),o.a.createElement("div",{className:"text-box"},o.a.createElement("div",null,o.a.createElement("span",{className:"contact-title"},e),this.props.unread>0?o.a.createElement(me,{count:this.props.unread}):null),this.props.comment?o.a.createElement("div",{className:"contact-comment"},this.props.comment):null,o.a.createElement(ce,{badges:a})),this.props.showContextMenu?o.a.createElement("span",{className:"menuTrigger"},o.a.createElement("a",{href:"javascript:;",onClick:this.handleContextClick},o.a.createElement("i",{className:"material-icons"},"expand_more"))):null)}}])&&be(n.prototype,a),r&&be(n,r),t}();function Se(e){return(Se="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}function Ee(e,t){for(var n=0;n0&&this.props.contacts.map(function(r){var i=r.topic?r.topic:r.user;if(e.props.filterFunc&&e.props.filter){var s=[i];if(r.private&&r.private.comment&&s.push((""+r.private.comment).toLowerCase()),r.public&&r.public.fn&&s.push((""+r.public.fn).toLowerCase()),!e.props.filterFunc(e.props.filter,s))return}var l=n?e.props.topicSelected.indexOf(i)>-1:e.props.topicSelected===i,c=[];e.props.showMode&&(i===e.props.myUserId&&c.push({name:t(Te.badge_you),color:"green"}),r.acs&&r.acs.isOwner()&&c.push({name:t(Te.badge_owner),color:"blue"}));var u=Array.isArray(r.private)?r.private.join(","):r.private?r.private.comment:null;a.push(o.a.createElement(we,{title:r.public?r.public.fn:null,avatar:I(r.public?r.public.photo:null),comment:u,unread:e.props.showUnread?r.unread:0,now:r.online&&e.props.connected,acs:r.acs,showMode:e.props.showMode,badges:c,showCheckmark:n,selected:l,showOnline:e.props.showOnline,onSelected:e.props.onTopicSelected,showContextMenu:e.props.showContextMenu,item:i,index:a.length,key:i}))},this),o.a.createElement("div",{className:this.props.noScroll?null:"scrollable-panel"},a.length>0?o.a.createElement("ul",{className:"contact-box"},a):o.a.createElement("div",{className:"center-medium-text"},this.props.emptyListMessage))}}])&&Ee(n.prototype,a),r&&Ee(n,r),t}(),Pe=Object(s.injectIntl)(Oe);function je(e){return(je="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}function Ne(e,t){for(var n=0;nthis.props.chips.length&&this.setState({input:""})}},{key:"handleTextInput",value:function(e){this.setState({input:e.target.value}),this.props.filterFunc&&this.props.filterFunc(e.target.value)}},{key:"removeChipAt",value:function(e){var t=this.state.sortedChips[e];this.props.onChipRemoved(t.user,this.state.chipIndex[t.user])}},{key:"handleChipCancel",value:function(e,t){this.removeChipAt(t)}},{key:"handleFocusGained",value:function(){this.setState({focused:!0})}},{key:"handleFocusLost",value:function(){this.setState({focused:!1}),this.props.onFocusLost&&this.props.onFocusLost(this.state.input)}},{key:"handleKeyDown",value:function(e){if("Backspace"===e.key){if(0==this.state.input.length&&this.state.sortedChips.length>0){var t=this.state.sortedChips.length-1;this.state.sortedChips[t].user!==this.props.required&&this.removeChipAt(t)}}else"Enter"===e.key?this.props.onEnter&&this.props.onEnter(this.state.input):"Escape"===e.key&&this.props.onCancel&&this.props.onCancel()}},{key:"render",value:function(){var e=this,t=[],n=0;this.state.sortedChips.map(function(a){t.push(o.a.createElement(De,{onCancel:e.handleChipCancel,avatar:I(a.public?a.public.photo:null),title:a.public?a.public.fn:void 0,noAvatar:e.props.avatarDisabled,topic:a.user,required:a.user===e.props.required,index:n,key:a.user})),n++});var a="chip-input"+(this.state.focused?" focused":"");return o.a.createElement("div",{className:a},t,o.a.createElement("input",{type:"text",placeholder:this.state.placeholder,onChange:this.handleTextInput,onFocus:this.handleFocusGained,onBlur:this.handleFocusLost,onKeyDown:this.handleKeyDown,value:this.state.input,autoFocus:!0}))}}])&&Fe(n.prototype,a),r&&Fe(n,r),t}();function We(e){return(We="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}function Ge(e,t){for(var n=0;n=0)return!0;return!1}return!0}}],(a=[{key:"handleContactSelected",value:function(e,n){var a=this.state.index[e];if(a){if(a.present)return;a.delta+=1,a.present=!0}else a={delta:1,present:!0};var o=this.state.members.slice();o.push(this.props.contacts[n]);var r=t.selectedContacts(o),i=this.state.index;i[e]=a,this.setState({members:o,index:i,selectedContacts:r})}},{key:"handleMemberRemoved",value:function(e,n){var a=this.state.index[e];if(a&&a.present){a.present=!1,a.delta-=1;var o=this.state.members.slice();o.splice(n,1);var r=t.selectedContacts(o),i=this.state.index;i[e]=a,this.setState({members:o,index:i,selectedContacts:r})}}},{key:"handleContactFilter",value:function(e){var t=this.props.intl.formatMessage,n=e?t(ze.contacts_not_found,{query:e}):t(ze.no_contacts);this.setState({contactFilter:e,noContactsMessage:n})}},{key:"handleSubmit",value:function(){var e=this,t=[],n=[],a=[];Object.keys(this.state.index).map(function(o){e.state.index[o].present&&t.push(o),e.state.index[o].delta>0?n.push(o):e.state.index[o].delta<0&&a.push(o)}),this.props.onSubmit(t,n,a)}},{key:"handleCancel",value:function(){this.props.onCancel()}},{key:"render",value:function(){this.props.intl.formatMessage;return o.a.createElement("div",{id:"group-manager"},o.a.createElement("div",{className:"panel-form-row"},o.a.createElement("label",{className:"small"},o.a.createElement(s.FormattedMessage,{id:"title_group_members",defaultMessage:"Group Members"}))),o.a.createElement("div",{className:"panel-form-row"},o.a.createElement(He,{chips:this.state.members,required:this.props.requiredMember,prompt:"add members",filterFunc:this.handleContactFilter,onChipRemoved:this.handleMemberRemoved})),o.a.createElement("div",{className:"panel-form-row"},o.a.createElement("label",{className:"small"},o.a.createElement(s.FormattedMessage,{id:"title_all_contacts",defaultMessage:"All Contacts"}))),o.a.createElement(Pe,{contacts:this.props.contacts,myUserId:this.props.myUserId,topicSelected:this.state.selectedContacts,filter:this.state.contactFilter,filterFunc:t.doContactFiltering,emptyListMessage:this.state.noContactsMessage,showOnline:!1,showUnread:!1,onTopicSelected:this.handleContactSelected}),o.a.createElement("div",{id:"group-manager-buttons",className:"panel-form-row"},o.a.createElement("button",{className:"blue",onClick:this.handleSubmit},o.a.createElement(s.FormattedMessage,{id:"button_ok",defaultMessage:"OK"})),o.a.createElement("button",{className:"white",onClick:this.handleCancel},o.a.createElement(s.FormattedMessage,{id:"button_cancel",defaultMessage:"Cancel"}))))}}])&&Ge(n.prototype,a),r&&Ge(n,r),t}(),Ye=Object(s.injectIntl)(Je);function Qe(e){return(Qe="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}function Xe(e,t){for(var n=0;n20&&(t=t.substring(0,19)+"...")}return this.state.active?"password"==e?o.a.createElement(tt,{value:this.state.value,placeholder:this.props.placeholder,required:this.props.required?"required":"",autoComplete:this.props.autoComplete,autoFocus:!0,onFinished:this.handlePasswordFinished}):o.a.createElement("input",{type:e,value:this.state.value,placeholder:this.props.placeholder,required:this.props.required?"required":"",autoComplete:this.props.autoComplete,autoFocus:!0,onChange:this.handeTextChange,onKeyDown:this.handleKeyDown,onBlur:this.handleEditingFinished}):o.a.createElement("span",{className:n,onClick:this.handleStartEditing},o.a.createElement("span",{className:"content"},t))}}])&&at(n.prototype,a),r&&at(n,r),t}();function lt(e){return(lt="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}function ct(e,t){for(var n=0;n=0&&a.indexOf(c)<0||i.push(o.a.createElement("tr",{key:c},o.a.createElement("td",null,t[c]),o.a.createElement("td",{className:"checkbox"},n.indexOf(c)<0?o.a.createElement(ae,{name:c,checked:a.indexOf(c)>=0,onChange:this.handleChange}):o.a.createElement(ae,{name:c,checked:a.indexOf(c)>=0})),this.props.compare?o.a.createElement("td",{className:"checkbox"},o.a.createElement(ae,{name:c,checked:r.indexOf(c)>=0})):null))}return o.a.createElement("div",{className:"panel-form-column"},this.props.userTitle?o.a.createElement("ul",{className:"contact-box"},o.a.createElement(we,{item:this.props.item,title:this.props.userTitle,avatar:I(this.props.userAvatar?this.props.userAvatar:null)})):null,o.a.createElement("label",{className:"small"},o.a.createElement(s.FormattedMessage,{id:"title_permissions",defaultMessage:"Permissions"})),o.a.createElement("table",{className:"permission-editor"},this.props.compare?o.a.createElement("thead",null,o.a.createElement("tr",null,o.a.createElement("th",null),o.a.createElement("th",null,this.props.modeTitle),o.a.createElement("th",null,this.props.compareTitle))):null,o.a.createElement("tbody",null,i)),o.a.createElement("br",null),o.a.createElement("div",{className:"dialog-buttons"},o.a.createElement("button",{className:"blue",onClick:this.handleSubmit},o.a.createElement(s.FormattedMessage,{id:"button_ok"})),o.a.createElement("button",{className:"white",onClick:this.handleCancel},o.a.createElement(s.FormattedMessage,{id:"button_cancel"}))))}}])&&wt(n.prototype,a),r&&wt(n,r),t}(),Tt=Object(s.injectIntl)(Mt);function Ot(e){var t=document.getElementById("shortcut-icon");if(t){var n=document.head||document.getElementsByTagName("head")[0],a=document.createElement("link");a.type="image/png",a.id="shortcut-icon",a.rel="shortcut icon",a.href="img/logo32x32"+(e>0?"a":"")+".png",n.removeChild(t),n.appendChild(a)}document.title=(e>0?"("+e+") ":"")+"Tinode"}function Pt(e){return(Pt="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}function jt(e,t){for(var n=0;n0){var t=e[e.length-1];if(","==t||" "==t||";"==t){var n=e.substr(0,e.length-1).trim();n.length>=4&&this.handleAddTag(n)}}}},{key:"handleAddTag",value:function(e){if((e=e.trim()).length>0){var t=this.state.tags.slice(0);t.push(e),this.setState({tags:t,tagInput:""}),this.props.onTagsChanged&&this.props.onTagsChanged(t)}}},{key:"handleRemoveTag",value:function(e,t){var n=this.state.tags.slice(0);n.splice(t,1),this.setState({tags:n}),this.props.onTagsChanged&&this.props.onTagsChanged(n)}},{key:"handleSubmit",value:function(){var e=this.state.tags.slice(0),t=this.state.tagInput.trim();t.length>0&&(e.push(t),this.props.onTagsChanged&&this.props.onTagsChanged(e)),this.props.onSubmit(e),this.setState({activated:!1,tagInput:"",tags:this.props.tags})}},{key:"handleCancel",value:function(){this.setState({activated:!1,tagInput:"",tags:this.props.tags}),this.props.onCancel&&this.props.onCancel()}},{key:"render",value:function(){var e=this,t=[];return this.state.activated?this.state.tags.map(function(e){t.push({user:e})}):(this.state.tags.map(function(e){t.push(o.a.createElement("span",{className:"badge",key:t.length},e))}),0==t.length&&(t=o.a.createElement("i",null,o.a.createElement(s.FormattedMessage,{id:"tags_not_found",defaultMessage:"No tags defined. Add some."})))),o.a.createElement("div",{className:"panel-form-column"},o.a.createElement("div",{className:"panel-form-row"},o.a.createElement("label",{className:"small"},this.props.title)),this.state.activated?o.a.createElement("div",null,o.a.createElement(s.FormattedMessage,{id:"tags_editor_no_tags",defaultMessage:"Add some tags"},function(n){return o.a.createElement(He,{chips:t,avatarDisabled:!0,prompt:n,onEnter:e.handleAddTag,onFocusLost:e.handleAddTag,onCancel:e.handleCancel,onChipRemoved:e.handleRemoveTag,filterFunc:e.handleTagInput})}),this.props.onSubmit||this.props.onCancel?o.a.createElement("div",{id:"tag-manager-buttons",className:"panel-form-row"},o.a.createElement("button",{className:"blue",onClick:this.handleSubmit},o.a.createElement(s.FormattedMessage,{id:"button_ok",defautMessage:"OK",description:"Confirmation button [OK]"})),o.a.createElement("button",{className:"white",onClick:this.handleCancel},o.a.createElement(s.FormattedMessage,{id:"button_cancel",defautMessage:"Cancel",description:"Rejection button [Cancel]"}))):null):o.a.createElement("div",null,o.a.createElement("a",{href:"javascript:;",className:"flat-button",onClick:this.handleShowTagManager},o.a.createElement("i",{className:"material-icons"},"edit")," ",o.a.createElement(s.FormattedMessage,{id:"title_manage_tags",defaultMessage:"Manage tags"})),o.a.createElement("span",null,t)))}}])&&jt(n.prototype,a),r&&jt(n,r),t}();function Dt(e){return(Dt="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}function Rt(e,t){for(var n=0;n36&&(t=t.substr(0,16)+"..."+t.substr(-16));var n,a,r=this.props.size>0?o.a.createElement("span",{className:"small gray"},"(",bytesToHumanSize(this.props.size),")"):null;return this.props.uploader||this.state.downloader||/^(?:(?:[a-z]+:)?\/\/)/i.test(this.props.downloadUrl)?(n=this.props.downloadUrl,a=null):(n="javascript:;",a=function(t){e.downloadFile(e.props.downloadUrl,e.props.filename,e.props.mimetype)}),o.a.createElement("div",{className:"attachment"},o.a.createElement("div",null,o.a.createElement("i",{className:"material-icons big gray"},"insert_drive_file")),o.a.createElement("div",{className:"flex-column"},o.a.createElement("div",null,t," ",r),this.props.uploader||this.state.downloader?o.a.createElement(Jt,{progress:this.props.uploader?this.props.progress:this.state.progress,onCancel:this.handleCancel}):o.a.createElement("div",null,o.a.createElement("a",{href:n,download:this.props.filename,onClick:a},o.a.createElement("i",{className:"material-icons"},"file_download")," save"))))}}])&&Qt(n.prototype,a),r&&Qt(n,r),t}();function tn(e){return(tn="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}function nn(e,t){for(var n=0;nthis.props.content.height?{width:"100%"}:{height:"100%"};n.maxWidth="100%",n.maxHeight="100%";var a=this.props.content.filename,r=this.props.content.width/13|0;return a.length>r&&(a=a.slice(0,r-2)+"..."+a.slice(2-r)),o.a.createElement("div",{id:"image-preview",onClick:this.props.onClose},o.a.createElement("div",{id:"image-preview-caption-panel"},o.a.createElement("a",{href:this.props.content.url,download:this.props.content.filename},o.a.createElement("i",{className:"material-icons"},"file_download")," ",o.a.createElement(s.FormattedMessage,{id:"download_action",defaultMessage:"download"})),o.a.createElement("a",{href:"javascript:;",onClick:this.props.onClose},o.a.createElement("i",{className:"material-icons gray"},"close"))),o.a.createElement("div",{id:"image-preview-container",ref:function(t){e.container=t}},o.a.createElement("img",{src:this.props.content.url,style:n})),o.a.createElement("div",{id:"image-preview-footer"},o.a.createElement("div",null,o.a.createElement("div",null,o.a.createElement("b",null,o.a.createElement(s.FormattedMessage,{id:"label_file_name",defaultMessage:"File name:"}))),o.a.createElement("div",null,o.a.createElement("span",{title:this.props.content.filename},a))),o.a.createElement("div",null,o.a.createElement("div",null,o.a.createElement("b",null,o.a.createElement(s.FormattedMessage,{id:"label_content_type",defaultMessage:"Content type:"}))),o.a.createElement("div",null,this.props.content.type)),o.a.createElement("div",null,o.a.createElement("div",null,o.a.createElement("b",null,o.a.createElement(s.FormattedMessage,{id:"label_size",defaultMessage:"Size:"}))),o.a.createElement("div",null,this.props.content.width," × ",this.props.content.height," px; ",P(this.props.content.size)))))}}])&&Pn(n.prototype,a),r&&Pn(n,r),t}();function An(e){return(An="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}function Dn(e,t){for(var n=0;nv||R.indexOf(s.type)<0?H(s,y,y,!1,t,a):W(s,t,a):G(s,n),!0}}return!1}(e,function(e,n,a,o,r){t.props.sendMessage(p.Drafty.insertImage(null,0,n,e,a,o,r))},function(e,n,a){t.props.sendMessage(p.Drafty.attachFile(null,e,n,a))},this.props.onError)&&e.preventDefault()}},{key:"handleAttachImage",value:function(e){var t=this;if(e.target.files&&e.target.files.length>0){var n=e.target.files[0];n.size>v||R.indexOf(n.type)<0?H(n,y,y,!1,function(e,n,a,o,r){t.props.sendMessage(p.Drafty.insertImage(null,0,n,e,a,o,r))},function(e){t.props.onError(e,"err")}):W(n,function(e,n,a,o,r){t.props.sendMessage(p.Drafty.insertImage(null,0,n,e,a,o,r))},function(e){t.props.onError(e,"err")})}e.target.value=""}},{key:"handleAttachFile",value:function(e){var t=this,n=this.props.intl.formatMessage;if(e.target.files&&e.target.files.length>0){var a=e.target.files[0];if(a.size>1<<23)this.props.onError(n(Xn.file_attachment_too_large,{size:P(a.size),limit:P(1<<23)}),"err");else if(a.size>v){var o=this.props.tinode.getLargeFileHelper();if(!o)return void this.props.onError(n(Xn.cannot_initiate_upload));var r=o.upload(a),i=p.Drafty.attachFile(null,a.type,null,a.name,a.size,r);this.props.sendMessage(i,r,o)}else fileToBase64(a,function(e,n,a){t.props.sendMessage(p.Drafty.attachFile(null,e,n,a))},this.props.onError)}e.target.value=""}},{key:"handleSend",value:function(){this.state.message.trim()&&(this.props.sendMessage(this.state.message.trim()),this.setState({message:""}))}},{key:"handleKeyPress",value:function(e){"Enter"===e.key&&(e.shiftKey||(e.preventDefault(),e.stopPropagation(),this.handleSend()))}},{key:"handleMessageTyping",value:function(e){var t={message:e.target.value},n=(new Date).getTime();if(n-this.state.keypressTimestamp>b){var a=this.props.tinode.getTopic(this.props.topic);a.isSubscribed()&&a.noteKeyPress(),t.keypressTimestamp=n}this.setState(t)}},{key:"render",value:function(){var e=this.props.intl.formatMessage,t=this.props.disabled?e(Xn.messaging_disabled):e(Xn.type_new_message),n=this;return o.a.createElement("div",{id:"send-message-panel"},this.props.disabled?o.a.createElement("i",{className:"material-icons disabled"},"photo"):o.a.createElement("a",{href:"javascript:;",onClick:function(e){n.attachImage.click()},title:"Add image"},o.a.createElement("i",{className:"material-icons secondary"},"photo")),this.props.disabled?o.a.createElement("i",{className:"material-icons disabled"},"attach_file"):o.a.createElement("a",{href:"javascript:;",onClick:function(e){n.attachFile.click()},title:"Attach file"},o.a.createElement("i",{className:"material-icons secondary"},"attach_file")),o.a.createElement("textarea",{id:"sendMessage",placeholder:t,disabled:this.props.disabled,value:this.state.message,onChange:this.handleMessageTyping,onKeyPress:this.handleKeyPress,ref:function(e){n.pasteFile=e},autoFocus:!0}),this.props.disabled?o.a.createElement("i",{className:"material-icons disabled"},"send"):o.a.createElement("a",{href:"javascript:;",onClick:this.handleSend,title:"Send"},o.a.createElement("i",{className:"material-icons"},"send")),o.a.createElement("input",{type:"file",ref:function(e){n.attachFile=e},onChange:this.handleAttachFile,style:{display:"none"}}),o.a.createElement("input",{type:"file",ref:function(e){n.attachImage=e},accept:"image/*",onChange:this.handleAttachImage,style:{display:"none"}}))}}])&&zn(n.prototype,a),r&&zn(n,r),t}(),Zn=Object(s.injectIntl)($n);function ea(e){return(ea="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}function ta(e,t){for(var n=0;n=h.a.MESSAGE_STATUS_SENT&&this.props.readTimerHandler(function(){t.noteRead(e.seq)}),this.props.onData(e));this.setState(n)}},{key:"handleAllMessagesReceived",value:function(e){this.setState({fetchingMessages:!1})}},{key:"handleInfoReceipt",value:function(e){switch(e.what){case"kp":clearTimeout(this.keyPressTimer);var t=this;this.keyPressTimer=setTimeout(function(){t.setState({typingIndicator:!1})},b+1e3),this.state.typingIndicator||this.setState({typingIndicator:!0});break;case"read":case"recv":this.forceUpdate();break;default:console.log("Other change in topic: ",e.what)}}},{key:"handleImagePreview",value:function(e){this.setState({imagePreview:e})}},{key:"handleCloseImagePreview",value:function(){this.setState({imagePreview:null})}},{key:"handleContextClick",value:function(e){e.preventDefault(),e.stopPropagation(),this.props.showContextMenu({topicName:this.state.topic,y:e.pageY,x:e.pageX})}},{key:"handleShowContextMenuMessage",value:function(e){e.topicName=this.state.topic;var t=["message_delete"],n=this.props.tinode.getTopic(e.topicName);if(n){var a=n.getAccessMode();a&&a.isDeleter()&&t.push("message_delete_hard")}this.props.showContextMenu(e,t)}},{key:"handleBackNavigation",value:function(){this.props.onHideMessagesView()}},{key:"render",value:function(){var e,t=this.props.intl.formatMessage;if(this.state.topic){for(var n=[],a=this.props.tinode.getTopic(this.state.topic),r="grp"==a.getType(),i=null,l=null,c=0;c¯\\\\_(ツ)_/¯"}}),xa=function(e){function t(e){var n;return function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,t),(n=Oa(this,Pa(t).call(this,e))).state=t.getDerivedStateFromProps(e,{}),n}var n,a,r;return function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),t&&ja(e,t)}(t,o.a.Component),n=t,r=[{key:"getDerivedStateFromProps",value:function(e,t){var n=[],a=0;return e.chatList.map(function(e){a+=e.unread>0?1:0,n.push(e)}),n.sort(function(e,t){return(t.touched||0)-(e.touched||0)}),Ot(a),{contactList:n}}}],(a=[{key:"render",value:function(){var e=this.props.intl.formatHTMLMessage;return o.a.createElement(Pe,{connected:this.props.connected,contacts:this.state.contactList,emptyListMessage:o.a.createElement("span",null,e(Na.contacts_not_found)),topicSelected:this.props.topicSelected,myUserId:this.props.myUserId,showOnline:!0,showUnread:!0,onTopicSelected:this.props.onTopicSelected,showContextMenu:this.props.showContextMenu})}}])&&Ta(n.prototype,a),r&&Ta(n,r),t}(),Ua=Object(s.injectIntl)(xa);function Aa(e,t){for(var n=0;n3&&("usr"==t.substr(0,3)||"grp"==t.substr(0,3))?this.props.onSubmit(t):this.props.onError(this.props.intl.formatMessage(ro.invalid_id),"err")}}},{key:"render",value:function(){var e=this;return o.a.createElement("div",{className:"panel-form"},o.a.createElement("div",{className:"panel-form-row"},o.a.createElement(s.FormattedMessage,{id:"group_user_id_prompt",defaultMessage:"Group or User ID"},function(t){return o.a.createElement("input",{type:"text",placeholder:t,value:e.state.groupId,onChange:e.handleChange,onKeyPress:e.handleKeyPress,required:!0})})),o.a.createElement("div",{className:"dialog-buttons"},o.a.createElement("button",{className:"blue",onClick:this.handleSubmit},o.a.createElement(s.FormattedMessage,{id:"button_subscribe",defaultMessage:"Subscribe"}))))}}])&&to(n.prototype,a),r&&to(n,r),t}(),so=Object(s.injectIntl)(io);function lo(e){return(lo="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}function co(e,t){for(var n=0;n0}),this.props.onSearchContacts(t.length>0?t:h.a.DEL_CHAR)}},{key:"handleClear",value:function(){this.state.edited&&this.props.onSearchContacts(h.a.DEL_CHAR),this.setState({search:"",edited:!1})}},{key:"handleKeyDown",value:function(e){"Enter"===e.key?this.handleSearch(e):"Escape"===e.key&&this.handleClear()}},{key:"render",value:function(){var e=this;return o.a.createElement("div",{className:"panel-form"},o.a.createElement("div",{className:"panel-form-row"},o.a.createElement("i",{className:"material-icons search"},"search"),o.a.createElement(s.FormattedMessage,{id:"search_placeholder",defaultMessage:"List like email:alice@example.com, tel:17025550003..."},function(t){return o.a.createElement("input",{className:"search",type:"text",placeholder:t,value:e.state.search,onChange:e.handleSearchChange,onKeyDown:e.handleKeyDown,required:!0,autoFocus:!0})}),o.a.createElement("a",{href:"javascript:;",onClick:this.handleClear},o.a.createElement("i",{className:"material-icons"},"close"))))}}])&&go(n.prototype,a),r&&go(n,r),t}();function wo(e,t){for(var n=0;n0?(["register","settings","edit","cred","reset","newtpk","contacts",""].includes(e.path[0])?this.setState({sidePanelSelected:e.path[0]}):console.log("Unknown sidepanel view",e.path[0]),e.path.length>1&&e.path[1]!=this.state.topicSelected&&this.setState({topicSelected:h.a.topicType(e.path[1])?e.path[1]:null})):this.setState({sidePanelSelected:""}),e.params.method&&this.setState({credMethod:e.params.method}),e.params.code&&this.setState({credCode:e.params.code}),this.setState({showInfoPanel:e.params.info,newTopicTabSelected:e.params.tab})}},{key:"handleOnline",value:function(e){e?this.handleError("",null):this.handleError("No connection","warn"),this.setState({liveConnection:e})}},{key:"handleAppVisibility",value:function(e,t){clearTimeout(this.readTimer),this.readTimerCallback=t,this.readTimer=e&&t?setTimeout(t,1e3):null}},{key:"handleReadTimer",value:function(e){this.handleAppVisibility(!document.hidden,e)}},{key:"handleVisibilityEvent",value:function(){this.handleAppVisibility(!document.hidden,this.readTimerCallback)}},{key:"handleError",value:function(e,t){this.setState({errorText:e,errorLevel:t})}},{key:"handleLoginRequest",value:function(e,t){var n=this;this.setState({loginDisabled:!0,login:e,password:t}),this.handleError("",null),this.tinode.isConnected()?this.doLogin(e,t,{meth:this.state.credMethod,resp:this.state.credCode}):this.tinode.connect().catch(function(e){n.setState({loginDisabled:!1}),n.handleError(e.message,"err")})}},{key:"handleConnected",value:function(){var e=this.tinode.getServerInfo();this.setState({serverVersion:e.ver+" "+(e.build?e.build:"none")+"; "}),this.doLogin(this.state.login,this.state.password,{meth:this.state.credMethod,resp:this.state.credCode})}},{key:"doLogin",value:function(e,t,n){var a=this;if(this.tinode.isAuthenticated())So.navigateTo("");else{n=h.a.credential(n);var o=null,r=this.tinode.getAuthToken();e&&t?(this.setState({password:null}),o=this.tinode.loginBasic(e,t,n)):r&&(o=this.tinode.loginToken(r.token,n)),o?o.then(function(e){e.code>=300&&"validate credentials"===e.text?(n&&a.handleError("Code does not match","warn"),a.handleCredentialsRequest(e.params)):a.handleLoginSuccessful()}).catch(function(e){a.setState({loginDisabled:!1,credMethod:void 0,credCode:void 0}),a.handleError(e.message,"err"),localStorage.removeItem("auth-token"),So.navigateTo("")}):(So.navigateTo(""),this.setState({loginDisabled:!1}))}}},{key:"handleCredentialsRequest",value:function(e){var t=So.parseUrlHash(window.location.hash);t.path[0]="cred",t.params.method=e.cred[0],So.navigateTo(So.composeUrlHash(t.path,t.params))}},{key:"handleLoginSuccessful",value:function(){var e=this;this.handleError("",null),Da.getObject("keep-logged-in")&&Da.setObject("auth-token",this.tinode.getAuthToken());var t=this.tinode.getMeTopic();t.onMetaDesc=this.tnMeMetaDesc,t.onContactUpdate=this.tnMeContactUpdate,t.onSubsUpdated=this.tnMeSubsUpdated,this.setState({connected:!0,credMethod:void 0,credCode:void 0,myUserId:this.tinode.getCurrentUserID()}),t.subscribe(t.startMetaQuery().withLaterSub().withDesc().build()).catch(function(t){localStorage.removeItem("auth-token"),e.handleError(t.message,"err"),So.navigateTo("")}),So.navigateTo(So.setUrlSidePanel(window.location.hash,"contacts"))}},{key:"handleDisconnect",value:function(e){this.setState({connected:!1,topicSelectedOnline:!1,dialogSelected:null,errorText:e&&e.message?e.message:"Disconnected",errorLevel:e&&e.message?"err":"warn",loginDisabled:!1,contextMenuVisible:!1,serverVersion:"no connection"})}},{key:"tnMeMetaDesc",value:function(e){e&&e.public&&this.setState({sidePanelTitle:e.public.fn,sidePanelAvatar:I(e.public.photo)})}},{key:"tnMeContactUpdate",value:function(e,t){"on"==e||"off"==e?(this.resetContactList(),this.state.topicSelected==t.topic&&this.setState({topicSelectedOnline:"on"==e})):"read"==e?this.resetContactList():"msg"==e?this.state.topicSelected!=t.topic?(this.state.messageSounds&&br.play(),this.resetContactList()):document.hidden&&this.state.messageSounds&&br.play():"recv"==e||("gone"==e||"unsub"==e?(this.state.topicSelected==t.topic&&this.handleTopicSelected(null),this.resetContactList()):"acs"==e?this.state.topicSelected==t.topic&&this.setState({topicSelectedAcs:t.acs}):"del"==e||console.log("Unsupported (yet) presence update:"+e+" in: "+t.topic))}},{key:"tnMeSubsUpdated",value:function(e){this.resetContactList()}},{key:"resetContactList",value:function(){var e=this,n={chatList:[]};this.tinode.getMeTopic().contacts(function(t){n.chatList.push(t),e.state.topicSelected==t.topic&&(n.topicSelectedOnline=t.online,n.topicSelectedAcs=t.acs)}),n.searchableContacts=t.prepareSearchableContacts(n.chatList,this.state.searchResults),this.setState(n)}},{key:"tnData",value:function(e){var t=this,n=this.tinode.getTopic(e.topic);n.msgStatus(e)>=h.a.MESSAGE_STATUS_SENT&&(clearTimeout(this.receivedTimer),this.receivedTimer=setTimeout(function(){t.receivedTimer=void 0,n.noteRecv(e.seq)},500))}},{key:"tnInitFind",value:function(){var e=this,t=this.tinode.getFndTopic();t.isSubscribed()?this.tnFndSubsUpdated():(t.onSubsUpdated=this.tnFndSubsUpdated,t.subscribe(t.startMetaQuery().withSub().withTags().build()).catch(function(t){e.handleError(t.message,"err")}))}},{key:"tnFndSubsUpdated",value:function(){var e=[];this.tinode.getFndTopic().contacts(function(t){e.push(t)}),this.setState({searchResults:e,searchableContacts:t.prepareSearchableContacts(this.state.chatList,e)})}},{key:"handleSearchContacts",value:function(e){var t=this,n=this.tinode.getFndTopic();n.setMeta({desc:{public:e}}).then(function(e){return n.getMeta(n.startMetaQuery().withSub().build())}).catch(function(e){t.handleError(e.message,"err")})}},{key:"handleTopicSelected",value:function(e,t,n,a){e?(this.setState({errorText:"",errorLevel:null,mobilePanel:"topic-view",showInfoPanel:!1}),this.state.topicSelected!=e&&(this.setState({topicSelectedOnline:n,topicSelectedAcs:a}),So.navigateTo(So.setUrlTopic("",e)))):(this.setState({errorText:"",errorLevel:null,mobilePanel:"sidepanel",topicSelectedOnline:!1,topicSelectedAcs:null,showInfoPanel:!1}),this.state.topicSelected&&So.navigateTo(So.setUrlTopic("",null)))}},{key:"handleHideMessagesView",value:function(){this.setState({mobilePanel:"sidepanel"}),So.navigateTo(So.setUrlTopic(window.location.hash,null))}},{key:"handleSendMessage",value:function(e,t,n){var a=this,o=this.tinode.getTopic(this.state.topicSelected);(e=o.createMessage(e,!1))._uploader=n,o.isSubscribed()||(t||(t=Promise.resolve()),t=t.then(function(){return o.subscribe()})),t&&(t=t.catch(function(e){a.handleError(e.message,"err")})),o.publishDraft(e,t).catch(function(e){a.handleError(e.message,"err")})}},{key:"handleNewAccount",value:function(){So.navigateTo(So.setUrlSidePanel(window.location.hash,"register"))}},{key:"handleNewAccountRequest",value:function(e,t,n,a,o){var r=this;this.tinode.connect(this.state.serverAddress).then(function(){return r.tinode.createAccountBasic(e,t,{public:n,tags:o,cred:h.a.credential(a)})}).then(function(e){e.code>=300&&"validate credentials"==e.text?r.handleCredentialsRequest(e.params):r.handleLoginSuccessful(r)}).catch(function(e){r.handleError(e.message,"err")})}},{key:"handleUpdateAccountRequest",value:function(e,t,n){var a=this;(t||n)&&this.tinode.getMeTopic().setMeta({desc:{public:t,defacs:n}}).catch(function(e){a.handleError(e.message,"err")}),e&&this.tinode.updateAccountBasic(null,this.tinode.getCurrentLogin(),e).catch(function(e){a.handleError(e.message,"err")})}},{key:"handleUpdateAccountTagsRequest",value:function(e){var t=this;this.tinode.getFndTopic().setMeta({tags:e}).catch(function(e){t.handleError(e.message,"err")})}},{key:"handleSettings",value:function(){So.navigateTo(So.setUrlSidePanel(window.location.hash,this.state.myUserId?"edit":"settings"))}},{key:"handleGlobalSettings",value:function(e){var n=e.serverAddress||this.state.serverAddress,a=e.transport||this.state.transport;this.tinode&&(this.tinode.onDisconnect=void 0,this.tinode.disconnect()),this.tinode=t.tnSetup(n,a),this.tinode.onConnect=this.handleConnected,this.tinode.onDisconnect=this.handleDisconnect,this.setState({serverAddress:n,transport:a}),Da.setObject("settings",{serverAddress:n,transport:a}),So.navigateTo(So.setUrlSidePanel(window.location.hash,""))}},{key:"initDesktopAlerts",value:function(){var e=this;this.fbPush.onTokenRefresh(function(){e.requestPushToken(!0)}),this.fbPush.onMessage(function(e){})}},{key:"togglePushToken",value:function(e){var t=this;e?this.state.firebaseToken?(this.setState({desktopAlerts:!0}),Da.updateObject("settings",{desktopAlerts:!0})):this.fbPush.requestPermission().then(function(){t.requestPushToken(!0)}).catch(function(e){t.handleError(e.message,"err"),t.setState({desktopAlerts:!1,firebaseToken:null}),Da.updateObject("settings",{desktopAlerts:!1}),console.log("Failed to get permission to notify.",e)}):this.state.firebaseToken?this.fbPush.deleteToken(this.state.firebaseToken).catch(function(e){console.log("Unable to delete token.",e)}).finally(function(){Da.updateObject("settings",{desktopAlerts:!1}),localStorage.removeItem("firebase-token"),t.setState({desktopAlerts:!1,firebaseToken:null})}):(this.setState({desktopAlerts:!1,firebaseToken:null}),Da.updateObject("settings",{desktopAlerts:!1}))}},{key:"requestPushToken",value:function(e){var t=this;this.fbPush.getToken().then(function(n){n!=t.state.firebaseToken&&(t.tinode.setDeviceToken(n,e),Da.setObject("firebase-token",n)),t.setState({firebaseToken:n,desktopAlerts:!0}),Da.updateObject("settings",{desktopAlerts:!0})}).catch(function(e){t.handleError(e.message,"err"),console.log("Failed to retrieve firebase token",e)})}},{key:"handleToggleMessageSounds",value:function(e){this.setState({messageSounds:e}),Da.updateObject("settings",{messageSoundsOff:!e})}},{key:"handleSidepanelCancel",value:function(){var e=So.parseUrlHash(window.location.hash);e.path[0]=this.state.myUserId?"contacts":"",e.params&&(delete e.params.code,delete e.params.method,delete e.params.tab),So.navigateTo(So.composeUrlHash(e.path,e.params)),this.setState({errorText:"",errorLevel:null})}},{key:"handleNewTopic",value:function(){So.navigateTo(So.setUrlSidePanel(window.location.hash,"newtpk"))}},{key:"handleNewTopicRequest",value:function(e,t,n,a){var o=this,r=e||this.tinode.newGroupTopicName();e?this.handleTopicSelected(r):this.setState({newGroupTopicParams:{desc:{public:t,private:{comment:n}},tags:a}},function(){o.handleTopicSelected(r)})}},{key:"handleNewTopicCreated",value:function(e,t){this.state.topicSelected==e&&e!=t&&this.setState({topicSelected:t},function(){So.navigateTo(So.setUrlTopic("",t))})}},{key:"handleTopicUpdateRequest",value:function(e,t,n,a){var o=this,r=this.tinode.getTopic(e);if(r){var i={};t&&(i.public=t),n&&(i.private=n===h.a.DEL_CHAR?h.a.DEL_CHAR:{comment:n}),a&&(i.defacs=a),r.setMeta({desc:i}).catch(function(e){o.handleError(e.message,"err")})}}},{key:"handleChangePermissions",value:function(e,t,n){var a=this,o=this.tinode.getTopic(e);if(o){var r=o.getAccessMode();n?(r.updateGiven(t),t=r.getGiven()):(r.updateWant(t),t=r.getWant()),o.setMeta({sub:{user:n,mode:t}}).catch(function(e){a.handleError(e.message,"err")})}}},{key:"handleTagsUpdated",value:function(e,t){var n=this,a=this.tinode.getTopic(e);if(a){a.setMeta({tags:t}).catch(function(e){n.handleError(e.message,"err")})}}},{key:"handleLogout",value:function(){Ot(0),localStorage.removeItem("auth-token"),this.tinode&&(this.tinode.onDisconnect=void 0,this.tinode.disconnect()),this.setState(this.getBlankState()),this.tinode=t.tnSetup(this.state.serverAddress,this.state.transport),this.tinode.onConnect=this.handleConnected,this.tinode.onDisconnect=this.handleDisconnect,So.navigateTo("")}},{key:"handleLeaveUnsubRequest",value:function(e){var t=this,n=this.tinode.getTopic(e);n&&n.leave(!0).then(function(e){So.navigateTo(So.setUrlTopic(window.location.hash,""))}).catch(function(e){t.handleError(e.message,"err")})}},{key:"handleDialogCancel",value:function(){this.setState({dialogSelected:null})}},{key:"handleShowContextMenu",value:function(e,t){this.setState({contextMenuVisible:!0,contextMenuClickAt:{x:e.x,y:e.y},contextMenuParams:e,contextMenuItems:t||this.defaultTopicContextMenu(e.topicName),contextMenuBounds:i.a.findDOMNode(this).getBoundingClientRect()})}},{key:"defaultTopicContextMenu",value:function(e){var t=this.tinode.getTopic(e),n=this.props.intl.formatMessage,a=!1,o=!1,r=!1,i=!1;if(t&&t.isSubscribed()){r=!0;var s=t.getAccessMode();a=s&&s.isMuted(),o=s&&!s.isJoiner(),i=s&&s.isDeleter()}return[r?{title:n({id:"menu_item_info"}),handler:this.handleShowInfoView}:null,r?"messages_clear":null,r&&i?"messages_clear_hard":null,r?a?"topic_unmute":"topic_mute":null,r?o?"topic_unblock":"topic_block":null,"topic_delete"]}},{key:"handleHideContextMenu",value:function(){this.setState({contextMenuVisible:!1,contextMenuClickAt:null,contextMenuParams:null,contextMenuBounds:null})}},{key:"handleShowInfoView",value:function(){So.navigateTo(So.addUrlParam(window.location.hash,"info",!0)),this.setState({showInfoPanel:!0})}},{key:"handleHideInfoView",value:function(){So.navigateTo(So.removeUrlParam(window.location.hash,"info")),this.setState({showInfoPanel:!1})}},{key:"handleMemberUpdateRequest",value:function(e,t,n){var a=this;if(e){var o=this.tinode.getTopic(e);o&&(t&&t.length>0&&t.map(function(e){o.invite(e,null).catch(function(e){a.handleError(e.message,"err")})}),n&&n.length>0&&n.map(function(e){o.delSubscription(e).catch(function(e){a.handleError(e.message,"err")})}))}}},{key:"handleValidateCredentialsRequest",value:function(e,t){this.setState({credMethod:e,credCode:t}),this.doLogin(null,null,{meth:e,resp:t})}},{key:"handlePasswordResetRequest",value:function(e,t){var n=this;this.tinode.connect().then(function(){return n.tinode.requestResetAuthSecret("basic",e,t)}).catch(function(e){n.handleError(e.message,"err")})}},{key:"handleResetPassword",value:function(e,t,n){var a=this;(n=base64ReEncode(n))?this.tinode.connect().then(function(){return a.tinode.updateAccountBasic(null,null,t,{token:n})}).catch(function(e){a.handleError(e.message,"err")}):this.handleError("Invalid security token","err")}},{key:"render",value:function(){return o.a.createElement("div",{id:"app-container"},this.state.contextMenuVisible?o.a.createElement(T,{tinode:this.tinode,bounds:this.state.contextMenuBounds,clickAt:this.state.contextMenuClickAt,params:this.state.contextMenuParams,items:this.state.contextMenuItems,hide:this.handleHideContextMenu,onAction:this.handleContextMenuAction,onError:this.handleError}):null,o.a.createElement(lr,{tinode:this.tinode,connected:this.state.connected,displayMobile:this.state.displayMobile,hideSelf:this.state.displayMobile&&"sidepanel"!==this.state.mobilePanel,state:this.state.sidePanelSelected,title:this.state.sidePanelTitle,avatar:this.state.sidePanelAvatar,login:this.state.login,myUserId:this.state.myUserId,loginDisabled:this.state.loginDisabled,errorText:this.state.errorText,errorLevel:this.state.errorLevel,topicSelected:this.state.topicSelected,chatList:this.state.chatList,credMethod:this.state.credMethod,credCode:this.state.credCode,transport:this.state.transport,messageSounds:this.state.messageSounds,desktopAlerts:this.state.desktopAlerts,desktopAlertsEnabled:this.state.desktopAlertsEnabled,serverAddress:this.state.serverAddress,onGlobalSettings:this.handleGlobalSettings,onSignUp:this.handleNewAccount,onSettings:this.handleSettings,onLoginRequest:this.handleLoginRequest,onCreateAccount:this.handleNewAccountRequest,onUpdateAccount:this.handleUpdateAccountRequest,onUpdateAccountTags:this.handleUpdateAccountTagsRequest,onTogglePushNotifications:this.togglePushToken,onToggleMessageSounds:this.handleToggleMessageSounds,onTopicSelected:this.handleTopicSelected,onCreateTopic:this.handleNewTopicRequest,onNewTopic:this.handleNewTopic,onLogout:this.handleLogout,onCancel:this.handleSidepanelCancel,onError:this.handleError,onValidateCredentials:this.handleValidateCredentialsRequest,onPasswordResetRequest:this.handlePasswordResetRequest,onResetPassword:this.handleResetPassword,onInitFind:this.tnInitFind,searchResults:this.state.searchResults,onSearchContacts:this.handleSearchContacts,showContextMenu:this.handleShowContextMenu}),o.a.createElement(sa,{tinode:this.tinode,connected:this.state.connected,online:this.state.topicSelectedOnline,acs:this.state.topicSelectedAcs,displayMobile:this.state.displayMobile,viewportWidth:this.state.viewportWidth,hideSelf:this.state.displayMobile&&("topic-view"!==this.state.mobilePanel||this.state.showInfoPanel),topic:this.state.topicSelected,myUserId:this.state.myUserId,serverVersion:this.state.serverVersion,serverAddress:this.state.serverAddress,errorText:this.state.errorText,errorLevel:this.state.errorLevel,newGroupTopicParams:this.state.newGroupTopicParams,onHideMessagesView:this.handleHideMessagesView,onData:this.tnData,onError:this.handleError,onNewTopicCreated:this.handleNewTopicCreated,readTimerHandler:this.handleReadTimer,showContextMenu:this.handleShowContextMenu,sendMessage:this.handleSendMessage}),this.state.showInfoPanel?o.a.createElement(Wt,{tinode:this.tinode,connected:this.state.connected,displayMobile:this.state.displayMobile,topic:this.state.topicSelected,searchableContacts:this.state.searchableContacts,myUserId:this.state.myUserId,errorText:this.state.errorText,errorLevel:this.state.errorLevel,onTopicDescUpdate:this.handleTopicUpdateRequest,onCancel:this.handleHideInfoView,onChangePermissions:this.handleChangePermissions,onMemberUpdateRequest:this.handleMemberUpdateRequest,onLeaveTopic:this.handleLeaveUnsubRequest,onAddMember:this.handleManageGroupMembers,onTopicTagsUpdate:this.handleTagsUpdated,onInitFind:this.tnInitFind,onError:this.handleError,showContextMenu:this.handleShowContextMenu}):null)}}])&&hr(n.prototype,a),r&&hr(n,r),t}(),yr=Object(s.injectIntl)(vr);Object(s.addLocaleData)(c.a);var _r=So.parseUrlHash(window.location.hash).params,wr=_r&&_r.hl||navigator.languages&&navigator.languages[0]||navigator.language||navigator.userLanguage,Sr=wr.toLowerCase().split(/[-_]+/)[0],Er=u[wr]||u[Sr]||u.en;i.a.render(o.a.createElement(s.IntlProvider,{locale:wr,messages:Er,textComponent:o.a.Fragment},o.a.createElement(yr,null)),document.getElementById("mountPoint"))}]); \ No newline at end of file +!function(e){var t={};function n(a){if(t[a])return t[a].exports;var o=t[a]={i:a,l:!1,exports:{}};return e[a].call(o.exports,o,o.exports,n),o.l=!0,o.exports}n.m=e,n.c=t,n.d=function(e,t,a){n.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:a})},n.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},n.t=function(e,t){if(1&t&&(e=n(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var a=Object.create(null);if(n.r(a),Object.defineProperty(a,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var o in e)n.d(a,o,function(t){return e[t]}.bind(null,o));return a},n.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return n.d(t,"a",t),t},n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},n.p="",n(n.s=7)}([function(e,t){e.exports=React},function(e,t){e.exports=ReactIntl},function(e,t,n){(function(t){e.exports=function(){var e={exports:{}},n=[{name:"ST",start:/(?:^|\W)(\*)[^\s*]/,end:/[^\s*](\*)(?=$|\W)/},{name:"EM",start:/(?:^|[\W_])(_)[^\s_]/,end:/[^\s_](_)(?=$|[\W_])/},{name:"DL",start:/(?:^|\W)(~)[^\s~]/,end:/[^\s~](~)(?=$|\W)/},{name:"CO",start:/(?:^|\W)(`)[^`]/,end:/[^`](`)(?=$|\W)/}],a=[{name:"LN",dataName:"url",pack:function(e){return/^[a-z]+:\/\//i.test(e)||(e="http://"+e),{url:e}},re:/(?:(?:https?|ftp):\/\/|www\.|ftp\.)[-A-Z0-9+&@#\/%=~_|$?!:,.]*[A-Z0-9+&@#\/%=~_|$]/gi},{name:"MN",dataName:"val",pack:function(e){return{val:e.slice(1)}},re:/\B@(\w\w+)/g},{name:"HT",dataName:"val",pack:function(e){return{val:e.slice(1)}},re:/\B#(\w\w+)/g}],o={ST:{name:"b",isVoid:!1},EM:{name:"i",isVoid:!1},DL:{name:"del",isVoid:!1},CO:{name:"tt",isVoid:!1},BR:{name:"br",isVoid:!0},LN:{name:"a",isVoid:!1},MN:{name:"a",isVoid:!1},HT:{name:"a",isVoid:!1},IM:{name:"img",isVoid:!0}};function r(e,t){var n;try{n=atob(e)}catch(e){console.log("Drafty: failed to decode base64-encoded object",e.message),n=atob("")}for(var a=n.length,o=new ArrayBuffer(a),r=new Uint8Array(o),i=0;i"},close:function(){return""}},EM:{open:function(){return""},close:function(){return""}},DL:{open:function(){return""},close:function(){return""}},CO:{open:function(){return""},close:function(){return""}},BR:{open:function(){return""},close:function(){return"
"}},LN:{open:function(e){return''},close:function(e){return""},props:function(e){return{href:e.url,target:"_blank"}}},MN:{open:function(e){return''},close:function(e){return""},props:function(e){return{name:e.val}}},HT:{open:function(e){return''},close:function(e){return""},props:function(e){return{name:e.val}}},IM:{open:function(e){var t=r(e.val,e.mime),n=e.ref?e.ref:t,a=(e.name?'':"")+'';return console.log("open: "+a),a},close:function(e){return e.name?"":""},props:function(e){return{src:r(e.val,e.mime),title:e.name,"data-width":e.width,"data-height":e.height,"data-name":e.name,"data-size":.75*e.val.length|0,"data-mime":e.mime}}}},s=function(){};s.parse=function(e){if("string"!=typeof e)return null;var t=e.split(/\r?\n/),o=[],r={},i=[];t.map(function(e){var t,s,l=[];if(n.map(function(t){l=l.concat(function(e,t,n,a){for(var o=[],r=0,i=e.slice(0);i.length>0;){var s=t.exec(i);if(null==s)break;var l=s.index+s[0].lastIndexOf(s[1]);i=i.slice(l+1),r=(l+=r)+1;var c=n?n.exec(i):null;if(null==c)break;var u=c.index+c[0].indexOf(c[1]);i=i.slice(u+1),r=(u+=r)+1,o.push({text:e.slice(l+1,u),children:[],start:l,end:u,type:a})}return o}(e,t.start,t.end,t.name))}),0==l.length)s={txt:e};else{l.sort(function(e,t){return e.start-t.start}),l=function e(t){if(0==t.length)return[];for(var n=[t[0]],a=t[0],o=1;oa.end?(n.push(t[o]),a=t[o]):t[o].endn&&r.push({text:t.slice(n,s.start)});var l={type:s.type},c=e(t,s.start+1,s.end-1,s.children);c.length>0?l.children=c:l.text=s.text,r.push(l),n=s.end+1}return no;return o=e.offset+e.len,t})}(s.txt)).length>0){var u=[];for(var d in t){var p=t[d],h=r[p.unique];h||(h=o.length,r[p.unique]=h,o.push({tp:p.type,data:p.data})),u.push({at:p.offset,len:p.len,key:h})}s.ent=u}i.push(s)});var s={txt:""};if(i.length>0){s.txt=i[0].txt,s.fmt=(i[0].fmt||[]).concat(i[0].ent||[]);for(var l=1;l0&&(s.ent=o)}return s},s.insertImage=function(e,t,n,a,o,r,i,s,l){return(e=e||{txt:" "}).ent=e.ent||[],e.fmt=e.fmt||[],e.fmt.push({at:t,len:1,key:e.ent.length}),e.ent.push({tp:"IM",data:{mime:n,val:a,width:o,height:r,name:i,ref:l,size:0|s}}),e},s.attachFile=function(e,t,n,a,o,r){(e=e||{txt:""}).ent=e.ent||[],e.fmt=e.fmt||[],e.fmt.push({at:-1,len:0,key:e.ent.length});var i={tp:"EX",data:{mime:t,val:n,name:a,ref:r,size:0|o}};return r instanceof Promise&&(i.data.ref=r.then(function(e){i.data.ref=e},function(e){})),e.ent.push(i),e},s.UNSAFE_toHTML=function(e){var t,n,a,o=e.txt,r=e.fmt,s=e.ent,l=[];if(r)for(var c in r){var u,d=r[c],p=d.tp;if(!p){var h=s[d.key];h&&(p=h.tp,u=h.data)}i[p]&&(l.push({idx:d.at+d.len,what:i[p].close(u)}),l.push({idx:d.at,what:i[p].open(u)}))}for(var c in l.sort(function(e,t){return t.idx-e.idx}),l)l[c].what&&(t=o,n=l[c].idx,a=l[c].what,o=t.slice(0,n)+a+t.slice(n));return o},s.format=function(e,t,n){var a=e.txt,r=e.fmt,i=e.ent;if(a=a||"",!r)return[a];var s=[].concat(r);return s.map(function(e){e.at=e.at||0,e.len=e.len||0}),s.sort(function(e,t){return e.at-t.at==0?t.len-e.len:e.at-t.at}),s=s.map(function(e){var t,n=e.tp;return n||(e.key=e.key||0,t=i[e.key].data,n=i[e.key].tp),{tp:n,data:t,at:e.at,len:e.len}}),function e(t,n,a,r,i,s){for(var l=[],c=0;c0)for(var t in e.ent)if("EX"==e.ent[t].tp)return!0;return!1},s.attachments=function(e,t,n){if(e.ent&&e.ent.length>0)for(var a in e.ent)"EX"==e.ent[a].tp&&t.call(n,e.ent[a].data,a)},s.getDownloadUrl=function(e){var t=null;return e.val?t=r(e.val,e.mime):"string"==typeof e.ref&&(t=e.ref),t},s.isUploading=function(e){return e.ref instanceof Promise},s.getPreviewUrl=function(e){return e.val?r(e.val,e.mime):null},s.getEntitySize=function(e){return e.size?e.size:e.val?.75*e.val.length|0:0},s.getEntityMimeType=function(e){return e.mime||"text/plain"},s.tagName=function(e){return o[e]?o[e].name:void 0},s.attrValue=function(e,t){if(t&&i[e])return i[e].props(t)},s.getContentType=function(){return"text/x-drafty"},e.exports=s,e=e.exports;var l={exports:{}};return function(t){"use strict";function n(e){return(n="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}var a,o="0.15.9-rc1";"undefined"!=typeof WebSocket&&(a=WebSocket),"undefined"==typeof btoa&&(t.btoa=function(){for(var e,t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"",n="",a=0,o=0,r="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";t.charAt(0|o)||(r="=",o%1);n+=r.charAt(63&a>>8-o%1*8)){if((e=t.charCodeAt(o+=.75))>255)throw new Error("'btoa' failed: The string to be encoded contains characters outside of the Latin1 range.");a=a<<8|e}return n}),"undefined"==typeof atob&&(t.atob=function(){var e=(arguments.length>0&&void 0!==arguments[0]?arguments[0]:"").replace(/=+$/,""),t="";if(e.length%4==1)throw new Error("'atob' failed: The string to be decoded is not correctly encoded.");for(var n,a=0,o=0,r=0;n=e.charAt(r++);~n&&(o=a%4?64*o+n:n,a++%4)?t+=String.fromCharCode(255&o>>(-2*a&6)):0)n="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=".indexOf(n);return t}),"undefined"==typeof window&&(t.window={WebSocket:a,URL:{createObjectURL:function(){throw new Error("Unable to use window.URL in a non browser application")}}});var r="0",i=o||"0.15",s="tinodejs/"+i,c=503,u="Connection failed";function d(e){return btoa(encodeURIComponent(e).replace(/%([0-9A-F]{2})/g,function(e,t){return String.fromCharCode("0x"+t)}))}function p(e,t,a){if(null==t)return e;if("object"!=n(t))return t||e;if(t instanceof Date)return t;if(t instanceof w)return new w(t);if(t instanceof Array)return t.length>0?t:e;for(var o in e&&e!==y.DEL_CHAR||(e=t.constructor()),t)!t.hasOwnProperty(o)||!t[o]&&!1!==t[o]||a&&a[o]||"_generated"==o||(e[o]=p(e[o],t[o]));return e}function h(e,t,n,a){return e[t]=p(e[t],n,a),e[t]}function f(){var e=null;if("withCredentials"in new XMLHttpRequest)e=new XMLHttpRequest;else{if("undefined"==typeof XDomainRequest)throw new Error("Browser not supported");e=new XDomainRequest}return e}function m(e,t){if("ts"===e&&"string"==typeof t&&t.length>=20&&t.length<=24){var a=new Date(t);if(a)return a}else if("acs"===e&&"object"===n(t))return new w(t);return t}function g(e,t){return"string"==typeof t&&t.length>128?"<"+t.length+", bytes: "+t.substring(0,12)+"..."+t.substring(t.length-12)+">":function(e,t){if(t instanceof Date)t=function(e){if(e&&0!=e.getTime()){var t=e.getUTCMilliseconds();return e.getUTCFullYear()+"-"+n(e.getUTCMonth()+1)+"-"+n(e.getUTCDate())+"T"+n(e.getUTCHours())+":"+n(e.getUTCMinutes())+":"+n(e.getUTCSeconds())+(t?"."+n(t,3):"")+"Z"}function n(e,t){return"0".repeat((t=t||2)-(""+e).length)+e}}(t);else if(null==t||!1===t||Array.isArray(t)&&0==t.length||"object"==n(t)&&0==Object.keys(t).length)return;return t}(0,t)}function b(e,t,n){var a=null;return"http"!==t&&"https"!==t&&"ws"!==t&&"wss"!==t||(a=t+"://","/"!==(a+=e).charAt(a.length-1)&&(a+="/"),a+="v"+r+"/channels","http"!==t&&"https"!==t||(a+="/lp"),a+="?apikey="+n),a}var v=function(e,t,o,r,i){var s=this,l=e,d=r,p=t,h=i,g=2e3,v=10,y=.3,_=null,w=0,S=!1,E=function(e){s.logger&&s.logger(e)};function k(e){var t=null;e.connect=function(n){return t&&1===t.readyState?Promise.resolve():(n&&(l=n),new Promise(function(n,o){var r=b(l,d?"wss":"ws",p);E("Connecting to: "+r);var i=new a(r);i.onopen=function(t){S=!1,e.onOpen&&e.onOpen(),n(),h&&(clearTimeout(_),_=null,w=0)},i.onclose=function(n){t=null,e.onDisconnect&&e.onDisconnect(null),!S&&h&&function(){var e=this;clearTimeout(_);var t=g*(Math.pow(2,w)*(1+y*Math.random()));w=w>=v?w:w+1,_=setTimeout(function(){E("Reconnecting, iter="+w+", timeout="+t),S||e.connect().catch(function(){})},t)}.call(e)},i.onerror=function(e){o(e)},i.onmessage=function(t){e.onMessage&&e.onMessage(t.data)},t=i}))},e.disconnect=function(){t&&(S=!0,t.close()),t=null},e.sendText=function(e){if(!t||t.readyState!=t.OPEN)throw new Error("Websocket is not connected");t.send(e)},e.isConnected=function(){return t&&1===t.readyState},e.transport=function(){return"ws"}}function C(e){var t=null,n=null,a=null;e.connect=function(a){return n?Promise.resolve():(a&&(l=a),new Promise(function(a,o){var r=b(l,d?"https":"http",p);E("Connecting to: "+r),(n=function n(a,o,r){var i=f();return i.onreadystatechange=function(s){if(4==i.readyState)if(201==i.status){var l=JSON.parse(i.responseText,m);i.responseText,t=a+"&sid="+l.ctrl.params.sid,(i=n(t)).send(null),e.onOpen&&e.onOpen(),o&&o()}else if(200==i.status)e.onMessage&&e.onMessage(i.responseText),(i=n(t)).send(null);else if(r&&r(i.responseText),e.onMessage&&i.responseText&&e.onMessage(i.responseText),e.onDisconnect){var d=i.status||c,p=i.responseText||u;e.onDisconnect(new Error(p+"("+d+")"))}},i.open("GET",a,!0),i}(r,a,o)).send(null)}).catch(function(){}))},e.disconnect=function(){a&&(a.onreadystatechange=void 0,a.abort(),a=null),n&&(n.onreadystatechange=void 0,n.abort(),n=null),e.onDisconnect&&e.onDisconnect(null),t=null},e.sendText=function(e){var n,o;if(n=t,(o=f()).onreadystatechange=function(e){if(4==o.readyState&&o.status>=400)throw new Error("LP sender failed, "+o.status)},o.open("POST",n,!0),!(a=o)||1!=a.readyState)throw new Error("Long poller failed to connect");a.send(e)},e.isConnected=function(){return n&&!0},e.transport=function(){return"lp"}}"lp"===o?C(this):"ws"===o?k(this):"object"==("undefined"==typeof window?"undefined":n(window))&&window.WebSocket?k(this):C(this),this.onMessage=void 0,this.onDisconnect=void 0,this.onOpen=void 0,this.logger=void 0},y=function(e,t,a,o,r){var l=this;this._appName=e||"Undefined",this._apiKey=a,this._browser="",this._platform="undefined",this._humanLanguage="xx","undefined"!=typeof navigator&&(this._browser=function(e){var t,n=(e=(e||"").replace(" (KHTML, like Gecko)","")).match(/(AppleWebKit\/[.\d]+)/i);if(n){for(var a=["chrome","safari","mobile","version"],o=e.substr(n.index+n[0].length).split(" "),r=[],i=0;i0?r[0][0]+"/"+r[0][1]:n[1]}else t=/trident/i.test(e)?(n=/(?:\brv[ :]+([.\d]+))|(?:\bMSIE ([.\d]+))/g.exec(e))?"MSIE/"+(n[1]||n[2]):"MSIE/?":/firefox/i.test(e)?(n=/Firefox\/([.\d]+)/g.exec(e))?"Firefox/"+n[1]:"Firefox/?":/presto/i.test(e)?(n=/Opera\/([.\d]+)/g.exec(e))?"Opera/"+n[1]:"Opera/?":(n=/([\w.]+)\/([.\d]+)/.exec(e))?n[1]+"/"+n[2]:(n=e.split(" "))[0];if((n=t.split("/")).length>1){var l=n[1].split(".");t=n[0]+"/"+l[0]+(l[1]?"."+l[1]:"")}return t}(navigator.userAgent),this._platform=navigator.platform,this._humanLanguage=navigator.language||"en-US"),this._loggingEnabled=!1,this._trimLongStrings=!1,this._myUID=null,this._authenticated=!1,this._login=null,this._authToken=null,this._inPacketCount=0,this._messageId=Math.floor(65535*Math.random()+65535),this._serverInfo=null,this._deviceToken=null,this._pendingPromises={},this._connection=new v(t,a,o,r,!0),this.logger=function(e){if(l._loggingEnabled){var t=new Date,n=("0"+t.getUTCHours()).slice(-2)+":"+("0"+t.getUTCMinutes()).slice(-2)+":"+("0"+t.getUTCSeconds()).slice(-2)+":"+("0"+t.getUTCMilliseconds()).slice(-3);console.log("["+n+"] "+e)}},this._connection.logger=this.logger,this._cache={};var d=this.cachePut=function(e,t,n){l._cache[e+":"+t]=n},h=this.cacheGet=function(e,t){return l._cache[e+":"+t]},f=this.cacheDel=function(e,t){delete l._cache[e+":"+t]},b=this.cacheMap=function(e,t){for(var n in l._cache)if(e(l._cache[n],n,t))break};this.attachCacheToTopic=function(e){e._tinode=l,e._cacheGetUser=function(e){var t=h("user",e);if(t)return{user:e,public:p({},t)}},e._cachePutUser=function(e,t){return d("user",e,p({},t.public))},e._cacheDelUser=function(e){return f("user",e)},e._cachePutSelf=function(){return d("topic",e.name,e)},e._cacheDelSelf=function(){return f("topic",e.name)}};var y=function(e,t,n,a){var o=l._pendingPromises[e];o&&(delete l._pendingPromises[e],t>=200&&t<400?o.resolve&&o.resolve(n):o.reject&&o.reject(new Error("Error: "+a+" ("+t+")")))},_=this.getNextUniqueId=function(){return 0!=l._messageId?""+l._messageId++:void 0};this.initPacket=function(e,t){switch(e){case"hi":return{hi:{id:_(),ver:i,ua:l._appName+" ("+(l._browser?l._browser+"; ":"")+l._platform+"); "+s,dev:l._deviceToken,lang:l._humanLanguage}};case"acc":return{acc:{id:_(),user:null,scheme:null,secret:null,login:!1,tags:null,desc:{},cred:{}}};case"login":return{login:{id:_(),scheme:null,secret:null}};case"sub":return{sub:{id:_(),topic:t,set:{},get:{}}};case"leave":return{leave:{id:_(),topic:t,unsub:!1}};case"pub":return{pub:{id:_(),topic:t,noecho:!1,head:null,content:{}}};case"get":return{get:{id:_(),topic:t,what:null,desc:{},sub:{},data:{}}};case"set":return{set:{id:_(),topic:t,desc:{},sub:{},tags:[]}};case"del":return{del:{id:_(),topic:t,what:null,delseq:null,user:null,hard:!1}};case"note":return{note:{topic:t,what:null,seq:void 0}};default:throw new Error("Unknown packet type requested: "+e)}},this.send=function(e,t){var a;t&&(a=function(e){var t=null;return e&&(t=new Promise(function(t,n){l._pendingPromises[e]={resolve:t,reject:n}})),t}(t)),e=function e(t){return Object.keys(t).forEach(function(a){"_"==a[0]?delete t[a]:t[a]?Array.isArray(t[a])&&0==t[a].length?delete t[a]:t[a]?"object"!=n(t[a])||t[a]instanceof Date||(e(t[a]),0==Object.getOwnPropertyNames(t[a]).length&&delete t[a]):delete t[a]:delete t[a]}),t}(e);var o=JSON.stringify(e);l.logger("out: "+(l._trimLongStrings?JSON.stringify(e,g):o));try{l._connection.sendText(o)}catch(e){if(!t)throw e;y(t,c,null,e.message)}return a},this.loginSuccessful=function(e){e.params&&e.params.user&&(l._myUID=e.params.user,l._authenticated=e&&e.code>=200&&e.code<300,e.params&&e.params.token&&e.params.expires?l._authToken={token:e.params.token,expires:new Date(e.params.expires)}:l._authToken=null,l.onLogin&&l.onLogin(e.code,e.text))},this._connection.onMessage=function(e){if(e){l._inPacketCount++,l.onRawMessage&&l.onRawMessage(e);var t=JSON.parse(e,m);if(t)if(l.logger("in: "+(l._trimLongStrings?JSON.stringify(t,g):e)),l.onMessage&&l.onMessage(t),t.ctrl)l.onCtrlMessage&&l.onCtrlMessage(t.ctrl),t.ctrl.id&&y(t.ctrl.id,t.ctrl.code,t.ctrl,t.ctrl.text),t.ctrl.params&&"data"==t.ctrl.params.what&&(n=h("topic",t.ctrl.topic))&&n._allMessagesReceived(t.ctrl.params.count);else if(t.meta)(n=h("topic",t.meta.topic))&&n._routeMeta(t.meta),l.onMetaMessage&&l.onMetaMessage(t.meta);else if(t.data)(n=h("topic",t.data.topic))&&n._routeData(t.data),l.onDataMessage&&l.onDataMessage(t.data);else if(t.pres)(n=h("topic",t.pres.topic))&&n._routePres(t.pres),l.onPresMessage&&l.onPresMessage(t.pres);else if(t.info){var n;(n=h("topic",t.info.topic))&&n._routeInfo(t.info),l.onInfoMessage&&l.onInfoMessage(t.info)}else l.logger("ERROR: Unknown packet received.");else l.logger("in: "+e),l.logger("ERROR: failed to parse data")}},this._connection.onOpen=function(){l.hello()},this._connection.onDisconnect=function(e){for(var t in l._inPacketCount=0,l._serverInfo=null,l._authenticated=!1,l._pendingPromises){var n=l._pendingPromises[t];n&&n.reject&&n.reject(new Error(u+" ("+c+")"))}l._pendingPromises={},b(function(e,t){0===t.lastIndexOf("topic:",0)&&e._resetSub()}),l.onDisconnect&&l.onDisconnect(e)}};y.credential=function(e,t,a,o){if("object"==n(e)){var r=e;t=r.val,a=r.params,o=r.resp,e=r.meth}return e&&(t||o)?[{meth:e,val:t,resp:o,params:a}]:null},y.topicType=function(e){return{me:"me",fnd:"fnd",grp:"grp",new:"grp",usr:"p2p"}["string"==typeof e?e.substring(0,3):"xxx"]},y.isNewGroupTopicName=function(e){return"string"==typeof e&&"new"==e.substring(0,3)},y.getVersion=function(){return i},y.setWebSocketProvider=function(e){a=e},y.getLibrary=function(){return s},y.MESSAGE_STATUS_NONE=0,y.MESSAGE_STATUS_QUEUED=1,y.MESSAGE_STATUS_SENDING=2,y.MESSAGE_STATUS_FAILED=3,y.MESSAGE_STATUS_SENT=4,y.MESSAGE_STATUS_RECEIVED=5,y.MESSAGE_STATUS_READ=6,y.MESSAGE_STATUS_TO_ME=7,y.DEL_CHAR="␡",y.prototype={connect:function(e){return this._connection.connect(e)},disconnect:function(){this._connection&&this._connection.disconnect()},isConnected:function(){return this._connection&&this._connection.isConnected()},isAuthenticated:function(){return this._authenticated},account:function(e,t,n,a,o){var r=this.initPacket("acc");return r.acc.user=e,r.acc.scheme=t,r.acc.secret=n,r.acc.login=a,o&&(r.acc.desc.defacs=o.defacs,r.acc.desc.public=o.public,r.acc.desc.private=o.private,r.acc.tags=o.tags,r.acc.cred=o.cred,r.acc.token=o.token),this.send(r,r.acc.id)},createAccount:function(e,t,n,a){var o=this,r=this.account("new",e,t,n,a);return n&&(r=r.then(function(e){return o.loginSuccessful(e),e})),r},createAccountBasic:function(e,t,n){return e=e||"",t=t||"",this.createAccount("basic",d(e+":"+t),!0,n)},updateAccountBasic:function(e,t,n,a){return t=t||"",n=n||"",this.account(e,"basic",d(t+":"+n),!1,a)},hello:function(){var e=this,t=this.initPacket("hi");return this.send(t,t.hi.id).then(function(t){return t.params&&(e._serverInfo=t.params),e.onConnect&&e.onConnect(),t}).catch(function(t){e.onDisconnect&&e.onDisconnect(t)})},setDeviceToken:function(e,t){var n=!1;return e&&e!=this._deviceToken&&(this._deviceToken=e,t&&this.isConnected()&&this.isAuthenticated()&&(this.send({hi:{dev:e}}),n=!0)),n},login:function(e,t,n){var a=this,o=this.initPacket("login");return o.login.scheme=e,o.login.secret=t,o.login.cred=n,this.send(o,o.login.id).then(function(e){return a.loginSuccessful(e),e})},loginBasic:function(e,t,n){var a=this;return this.login("basic",d(e+":"+t),n).then(function(t){return a._login=e,t})},loginToken:function(e,t){return this.login("token",e,t)},requestResetAuthSecret:function(e,t,n){return this.login("reset",d(e+":"+t+":"+n))},getAuthToken:function(){return this._authToken&&this._authToken.expires.getTime()>Date.now()?this._authToken:(this._authToken=null,null)},setAuthToken:function(e){this._authToken=e},subscribe:function(e,t,n){var a=this.initPacket("sub",e);return e||(e="new"),a.sub.get=t,n&&(n.sub&&(a.sub.set.sub=n.sub),y.isNewGroupTopicName(e)&&n.desc&&(a.sub.set.desc=n.desc),n.tags&&(a.sub.set.tags=n.tags)),this.send(a,a.sub.id)},leave:function(e,t){var n=this.initPacket("leave",e);return n.leave.unsub=t,this.send(n,n.leave.id)},createMessage:function(t,n,a){var o=this.initPacket("pub",t),r="string"==typeof n?e.parse(n):n;return r&&!e.isPlainText(r)&&(o.pub.head={mime:e.getContentType()},n=r),o.pub.noecho=a,o.pub.content=n,o.pub},publish:function(e,t,n){return this.publishMessage(this.createMessage(e,t,n))},publishMessage:function(e){return(e=Object.assign({},e)).seq=void 0,e.from=void 0,e.ts=void 0,this.send({pub:e},e.id)},getMeta:function(e,t){var n=this.initPacket("get",e);return n.get=p(n.get,t),this.send(n,n.get.id)},setMeta:function(e,t){var n=this.initPacket("set",e),a=[];return t&&["desc","sub","tags"].map(function(e){t.hasOwnProperty(e)&&(a.push(e),n.set[e]=t[e])}),0==a.length?Promise.reject(new Error("Invalid {set} parameters")):this.send(n,n.set.id)},delMessages:function(e,t,n){var a=this.initPacket("del",e);return a.del.what="msg",a.del.delseq=t,a.del.hard=n,this.send(a,a.del.id)},delTopic:function(e){var t=this,n=this.initPacket("del",e);return n.del.what="topic",this.send(n,n.del.id).then(function(n){return t.cacheDel("topic",e),t.ctrl})},delSubscription:function(e,t){var n=this.initPacket("del",e);return n.del.what="sub",n.del.user=t,this.send(n,n.del.id)},note:function(e,t,n){if(n<=0||n>=268435455)throw new Error("Invalid message id "+n);var a=this.initPacket("note",e);a.note.what=t,a.note.seq=n,this.send(a)},noteKeyPress:function(e){var t=this.initPacket("note",e);t.note.what="kp",this.send(t)},getTopic:function(e){var t=this.cacheGet("topic",e);return!t&&e&&(t="me"==e?new E:"fnd"==e?new k:new S(e),this.cachePut("topic",e,t),this.attachCacheToTopic(t)),t},newTopic:function(e){var t=new S("new",e);return this.attachCacheToTopic(t),t},newGroupTopicName:function(){return"new"+this.getNextUniqueId()},newTopicWith:function(e,t){var n=new S(e,t);return this.attachCacheToTopic(n),n},getMeTopic:function(){return this.getTopic("me")},getFndTopic:function(){return this.getTopic("fnd")},getLargeFileHelper:function(){return new C(this)},getCurrentUserID:function(){return this._myUID},getCurrentLogin:function(){return this._login},getServerInfo:function(){return this._serverInfo},enableLogging:function(e,t){this._loggingEnabled=e,this._trimLongStrings=e&&t},isTopicOnline:function(e){var t=this.getMeTopic(),n=t&&t.getContact(e);return n&&n.online},wantAkn:function(e){this._messageId=e?Math.floor(16777215*Math.random()+16777215):0},onWebsocketOpen:void 0,onConnect:void 0,onDisconnect:void 0,onLogin:void 0,onCtrlMessage:void 0,onDataMessage:void 0,onPresMessage:void 0,onMessage:void 0,onRawMessage:void 0};var _=function(e){this.topic=e;var t=e._tinode.getMeTopic();this.contact=t&&t.getContact(e.name),this.what={}};_.prototype={_get_ims:function(){var e=this.contact&&this.contact.updated,t=this.topic._lastDescUpdate||0;return e>t?e:t},withData:function(e,t,n){return this.what.data={since:e,before:t,limit:n},this},withLaterData:function(e){return this.withData(this.topic._maxSeq>0?this.topic._maxSeq+1:void 0,void 0,e)},withEarlierData:function(e){return this.withData(void 0,this.topic._minSeq>0?this.topic._minSeq:void 0,e)},withDesc:function(e){return this.what.desc={ims:e},this},withLaterDesc:function(){return this.withDesc(this._get_ims())},withSub:function(e,t,n){var a={ims:e,limit:t};return"me"==this.topic.getType()?a.topic=n:a.user=n,this.what.sub=a,this},withOneSub:function(e,t){return this.withSub(e,void 0,t)},withLaterOneSub:function(e){return this.withOneSub(this.topic._lastSubsUpdate,e)},withLaterSub:function(e){return this.withSub("p2p"==this.topic.getType()?this._get_ims():this.topic._lastSubsUpdate,e)},withTags:function(){return this.what.tags=!0,this},withDel:function(e,t){return(e||t)&&(this.what.del={since:e,limit:t}),this},withLaterDel:function(e){return this.withDel(this.topic._maxSeq>0?this.topic._maxDel+1:void 0,e)},build:function(){var e={},t=[],n=this;return["data","sub","desc","tags","del"].map(function(a){n.what.hasOwnProperty(a)&&(t.push(a),Object.getOwnPropertyNames(n.what[a]).length>0&&(e[a]=n.what[a]))}),t.length>0?e.what=t.join(" "):e=void 0,e}};var w=function e(t){t&&(this.given="number"==typeof t.given?t.given:e.decode(t.given),this.want="number"==typeof t.want?t.want:e.decode(t.want),this.mode=t.mode?"number"==typeof t.mode?t.mode:e.decode(t.mode):this.given&this.want)};w._NONE=0,w._JOIN=1,w._READ=2,w._WRITE=4,w._PRES=8,w._APPROVE=16,w._SHARE=32,w._DELETE=64,w._OWNER=128,w._BITMASK=w._JOIN|w._READ|w._WRITE|w._PRES|w._APPROVE|w._SHARE|w._DELETE|w._OWNER,w._INVALID=1048576,w.decode=function(e){if(!e)return null;if("number"==typeof e)return e&w._BITMASK;if("N"===e||"n"===e)return w._NONE;for(var t={J:w._JOIN,R:w._READ,W:w._WRITE,P:w._PRES,A:w._APPROVE,S:w._SHARE,D:w._DELETE,O:w._OWNER},n=w._NONE,a=0;a0)){l=!0;break}r=i-1}return l?i:a?-1:s<0?i+1:i}function a(e,t){var a=n(e,t,!1);return t.splice(a,0,e),t}return e=e||function(e,t){return e===t?0:e0)return n[0]},delRange:function(e,n){return t.splice(e,n-e)},size:function(){return t.length},reset:function(e){t=[]},forEach:function(e,n,a,o){n|=0,a=a||t.length;for(var r=n;r=300)return e;if(n._subscribed=!0,n.acs=e.params&&e.params.acs?e.params.acs:n.acs,n._new){n._new=!1,n.name=e.topic,n.created=e.ts,n.updated=e.ts,n.touched=e.ts,n._cachePutSelf();var a=n._tinode.getMeTopic();a&&a._processMetaSub([{_generated:!0,topic:n.name,created:e.ts,updated:e.ts,touched:e.ts,acs:n.acs}]),t&&t.desc&&(t.desc._generated=!0,n._processMetaDesc(t.desc))}return e})},createMessage:function(e,t){return this._tinode.createMessage(this.name,e,t)},publish:function(e,t){return this.publishMessage(this.createMessage(e,t))},publishMessage:function(t){var n=this;if(!this._subscribed)return Promise.reject(new Error("Cannot publish on inactive topic"));if(e.hasAttachments(t.content)&&!t.head.attachments){var a=[];e.attachments(t.content,function(e){a.push(e.ref)}),t.head.attachments=a}return t._sending=!0,this._tinode.publishMessage(t).then(function(e){return t._sending=!1,t.seq=e.params.seq,t.ts=e.ts,n._routeData(t),e}).catch(function(e){t._sending=!1,t._failed=!0})},publishDraft:function(e,t){var n=this;if(!t&&!this._subscribed)return Promise.reject(new Error("Cannot publish on inactive topic"));var a=e.seq||this._getQueuedSeqId();return e._generated||(e._generated=!0,e.seq=a,e.ts=new Date,e.from=this._tinode.getCurrentUserID(),e.noecho=!0,this._messages.put(e),this.onData&&this.onData(e)),(t||Promise.resolve()).then(function(){return e._cancelled?{code:300,text:"cancelled"}:n.publishMessage(e)},function(t){e._sending=!1,n._messages.delAt(n._messages.find(e)),n.onData&&n.onData()})},leave:function(e){var t=this;return this._subscribed||e?this._tinode.leave(this.name,e).then(function(n){return t._resetSub(),e&&t._gone(),n}):Promise.reject(new Error("Cannot leave inactive topic"))},getMeta:function(e){return this._subscribed?this._tinode.getMeta(this.name,e):Promise.reject(new Error("Cannot query inactive topic"))},getMessagesPage:function(e,t){var n=this,a=this.startMetaQuery();t?a.withLaterData(e):a.withEarlierData(e);var o=this.getMeta(a.build());return t||(o=o.then(function(e){e&&e.params&&!e.params.count&&(n._noEarlierMsgs=!0)})),o},setMeta:function(e){var t=this;return this._subscribed?(e.tags&&(e.tags=function(e){var t=[];if(Array.isArray(e)){for(var n=0,a=e.length;n1&&t.push(o)}t.sort().filter(function(e,t,n){return!t||e!=n[t-1]})}return 0==t.length&&t.push(y.DEL_CHAR),t}(e.tags)),this._tinode.setMeta(this.name,e).then(function(n){return n&&n.code>=300?n:(e.sub&&(n.params&&n.params.acs&&(e.sub.acs=n.params.acs,e.sub.updated=n.ts),e.sub.user||(e.sub.user=t._tinode.getCurrentUserID(),e.desc||(e.desc={})),e.sub._generated=!0,t._processMetaSub([e.sub])),e.desc&&(n.params&&n.params.acs&&(e.desc.acs=n.params.acs,e.desc.updated=n.ts),t._processMetaDesc(e.desc)),e.tags&&t._processMetaTags(e.tags),n)})):Promise.reject(new Error("Cannot update inactive topic"))},invite:function(e,t){return this.setMeta({sub:{user:e,mode:t}})},delMessages:function(e,t){var n=this;if(!this._subscribed)return Promise.reject(new Error("Cannot delete messages in inactive topic"));e.sort(function(e,t){return e.low=t.hi)});var a=e.reduce(function(e,t){return t.low<268435455&&(!t.hi||t.hi<268435455?e.push(t):e.push({low:t.low,hi:n._maxSeq+1})),e},[]);return(e.length>0?this._tinode.delMessages(this.name,a,t):Promise.resolve({params:{del:0}})).then(function(t){return t.params.del>n._maxDel&&(n._maxDel=t.params.del),e.map(function(e){e.hi?n.flushMessageRange(e.low,e.hi):n.flushMessage(e.low)}),n.onData&&n.onData(),t})},delMessagesAll:function(e){return this.delMessages([{low:1,hi:this._maxSeq+1,_all:!0}],e)},delMessagesList:function(e,t){e.sort(function(e,t){return e-t});var n=e.reduce(function(e,t){if(0==e.length)e.push({low:t});else{var n=e[e.length-1];!n.hi&&t!=n.low+1||t>n.hi?e.push({low:t}):n.hi=n.hi?Math.max(n.hi,t+1):t+1}return e},[]);return this.delMessages(n,t)},delTopic:function(){var e=this;return this._tinode.delTopic(this.name).then(function(t){return e._resetSub(),e._gone(),t})},delSubscription:function(e){var t=this;return this._subscribed?this._tinode.delSubscription(this.name,e).then(function(n){return delete t._users[e],t.onSubsUpdated&&t.onSubsUpdated(Object.keys(t._users)),n}):Promise.reject(new Error("Cannot delete subscription in inactive topic"))},note:function(e,t){var n=this._users[this._tinode.getCurrentUserID()];n?((!n[e]||n[e]0)for(var o in this._users){var r=this._users[o];r.user!==a&&r[e]>=t&&n++}return n},msgReadCount:function(e){return this.msgReceiptCount("read",e)},msgRecvCount:function(e){return this.msgReceiptCount("recv",e)},msgHasMoreMessages:function(e){return e?this.seq>this._maxSeq:this._minSeq>1&&!this._noEarlierMsgs},isNewMessage:function(e){return this._maxSeq<=e},flushMessage:function(e){var t=this._messages.find({seq:e});return t>=0?this._messages.delAt(t):void 0},flushMessageRange:function(e,t){var n=this._messages.find({seq:e});return n>=0?this._messages.delRange(n,this._messages.find({seq:t},!0)):[]},cancelSend:function(e){var t=this._messages.find({seq:e});if(t>=0){var n=this._messages.getAt(t);if(1==this.msgStatus(n))return n._cancelled=!0,this._messages.delAt(t),!0}return!1},getType:function(){return y.topicType(this.name)},getAccessMode:function(){return this.acs},getDefaultAccess:function(){return this.defacs},startMetaQuery:function(){return new _(this)},msgStatus:function(e){var t=0;return e.from==this._tinode.getCurrentUserID()?e._sending?t=2:e._failed?t=3:e.seq>=268435455?t=1:this.msgReadCount(e.seq)>0?t=6:this.msgRecvCount(e.seq)>0?t=5:e.seq>0&&(t=4):t=7,t},_routeData:function(e){e.content&&((!this.touched||this.touchedthis._maxSeq&&(this._maxSeq=e.seq),(e.seq0&&(this._lastSubsUpdate=e.ts,this._processMetaSub(e.sub)),e.del&&this._processDelMessages(e.del.clear,e.del.delseq),e.tags&&this._processMetaTags(e.tags),this.onMeta&&this.onMeta(e)},_routePres:function(e){var t;switch(e.what){case"del":this._processDelMessages(e.clear,e.delseq);break;case"on":case"off":(t=this._users[e.src])?t.online="on"==e.what:this._tinode.logger("Presence update for an unknown user",this.name,e.src);break;case"acs":var n="me"==e.src?this._tinode.getCurrentUserID():e.src;if(t=this._users[n])t.acs.updateAll(e.dacs),n==this._tinode.getCurrentUserID()&&this.acs.updateAll(e.dacs),t.acs&&t.acs.mode!=w._NONE||("p2p"==this.getType()&&this.leave(),this._processMetaSub([{user:n,deleted:new Date,_generated:!0}]));else{var a=(new w).updateAll(e.dacs);a&&a.mode!=w._NONE&&((t=this._cacheGetUser(n))?t.acs=a:(t={user:n,acs:a},this.getMeta(this.startMetaQuery().withOneSub(void 0,n).build())),t._generated=!0,t.updated=new Date,this._processMetaSub([t]))}break;default:this._tinode.logger("Ignored presence update",e.what)}this.onPres&&this.onPres(e)},_routeInfo:function(e){if("kp"!==e.what){var t=this._users[e.from];t&&(t[e.what]=e.seq)}this.onInfo&&this.onInfo(e)},_processMetaDesc:function(e,t){if(p(this,e),"string"==typeof this.created&&(this.created=new Date(this.created)),"string"==typeof this.updated&&(this.updated=new Date(this.updated)),"string"==typeof this.touched&&(this.touched=new Date(this.touched)),"me"!==this.name&&!t&&!e._generated){var n=this._tinode.getMeTopic();n&&n._processMetaSub([{_generated:!0,topic:this.name,updated:this.updated,touched:this.touched,acs:this.acs,public:this.public,private:this.private}])}this.onMetaDesc&&this.onMetaDesc(this)},_processMetaSub:function(e){var t=void 0;for(var n in e){var a=e[n];if(a.user){a.updated=new Date(a.updated),a.deleted=a.deleted?new Date(a.deleted):null;var o=null;a.deleted?(delete this._users[a.user],o=a):((o=this._users[a.user])||(o=this._cacheGetUser(a.user)),o=this._updateCachedUser(a.user,a,a._generated)),this.onMetaSub&&this.onMetaSub(o)}else a._generated||(t=a)}t&&this.onMetaDesc&&this.onMetaDesc(t),this.onSubsUpdated&&this.onSubsUpdated(Object.keys(this._users))},_processMetaTags:function(e){1==e.length&&e[0]==y.DEL_CHAR&&(e=[]),this._tags=e,this.onTagsUpdated&&this.onTagsUpdated(e)},_processDelMessages:function(e,t){this._maxDel=Math.max(e,this._maxDel),this.clear=Math.max(e,this.clear);var n=this,a=0;Array.isArray(t)&&t.map(function(e){if(e.hi)for(var t=e.low;t0&&this.onData&&this.onData()},_allMessagesReceived:function(e){this.onAllMessagesReceived&&this.onAllMessagesReceived(e)},_resetSub:function(){this._subscribed=!1},_gone:function(){this._messages.reset(),this._users={},this.acs=new w(null),this.private=null,this.public=null,this._maxSeq=0,this._minSeq=0,this._subscribed=!1;var e=this._tinode.getMeTopic();e&&e._routePres({_generated:!0,what:"gone",topic:"me",src:this.name}),this.onDeleteTopic&&this.onDeleteTopic()},_updateCachedUser:function(e,t,n){var a=this._cacheGetUser(e);return a?a=p(a,t):(n&&this.getMeta(this.startMetaQuery().withLaterOneSub(e).build()),a=p({},t)),this._cachePutUser(e,a),h(this._users,e,a)},_getQueuedSeqId:function(){return this._queuedSeqId++}};var E=function(e){S.call(this,"me",e),this._contacts={},e&&(this.onContactUpdate=e.onContactUpdate)};E.prototype=Object.create(S.prototype,{_processMetaSub:{value:function(e){var t=0;for(var n in e){var a=e[n],o=a.topic;if("fnd"!=o&&"me"!=o){a.updated=new Date(a.updated),a.touched=a.touched?new Date(a.touched):null,a.deleted=a.deleted?new Date(a.deleted):null,a.seq=0|a.seq,a.recv=0|a.recv,a.read=0|a.read,a.unread=a.seq-a.read;var r=null;if(a.deleted)r=a,delete this._contacts[o];else if(a.seen&&a.seen.when&&(a.seen.when=new Date(a.seen.when)),r=h(this._contacts,o,a),"p2p"==y.topicType(o)&&this._cachePutUser(o,r),!a._generated){var i=this._tinode.getTopic(o);i&&i._processMetaDesc(a,!0)}t++,this.onMetaSub&&this.onMetaSub(r)}}t>0&&this.onSubsUpdated&&this.onSubsUpdated(Object.keys(this._contacts))},enumerable:!0,configurable:!0,writable:!1},_routePres:{value:function(e){var t=this._contacts[e.src];if(t){switch(e.what){case"on":t.online=!0;break;case"off":t.online&&(t.online=!1,t.seen?t.seen.when=new Date:t.seen={when:new Date});break;case"msg":t.touched=new Date,t.seq=0|e.seq,t.unread=t.seq-t.read;break;case"upd":this.getMeta(this.startMetaQuery().withLaterOneSub(e.src).build());break;case"acs":t.acs?t.acs.updateAll(e.dacs):t.acs=(new w).updateAll(e.dacs);break;case"ua":t.seen={when:new Date,ua:e.ua};break;case"recv":t.recv=t.recv?Math.max(t.recv,e.seq):0|e.seq;break;case"read":t.read=t.read?Math.max(t.read,e.seq):0|e.seq,t.unread=t.seq-t.read;break;case"gone":delete this._contacts[e.src]}this.onContactUpdate&&this.onContactUpdate(e.what,t)}else if("acs"==e.what){var n=new w(e.dacs);if(!n||n.mode==w._INVALID)return void this._tinode.logger("Invalid access mode update",e.src,e.dacs);if(n.mode==w._NONE)return void this._tinode.logger("Removing non-existent subscription",e.src,e.dacs);this.getMeta(this.startMetaQuery().withOneSub(void 0,e.src).build()),this._contacts[e.src]={topic:e.src,online:!1,acs:n}}this.onPres&&this.onPres(e)},enumerable:!0,configurable:!0,writable:!1},publish:{value:function(){return Promise.reject(new Error("Publishing to 'me' is not supported"))},enumerable:!0,configurable:!0,writable:!1},contacts:{value:function(e,t){var n=e||this.onMetaSub;if(n)for(var a in this._contacts)n.call(t,this._contacts[a],a,this._contacts)},enumerable:!0,configurable:!0,writable:!0},setMsgReadRecv:{value:function(e,t,n,a){var o,r=this._contacts[e],i=!1;if(r){switch(n|=0,t){case"recv":o=r.recv,r.recv=r.recv?Math.max(r.recv,n):n,i=o!=r.recv;break;case"read":o=r.read,r.read=r.read?Math.max(r.read,n):n,r.unread=r.seq-r.read,i=o!=r.read,r.recv0&&this.onSubsUpdated&&this.onSubsUpdated(Object.keys(this._contacts))},enumerable:!0,configurable:!0,writable:!1},publish:{value:function(){return Promise.reject(new Error("Publishing to 'fnd' is not supported"))},enumerable:!0,configurable:!0,writable:!1},setMeta:{value:function(e){var t=this;return Object.getPrototypeOf(k.prototype).setMeta.call(this,e).then(function(){Object.keys(t._contacts).length>0&&(t._contacts={},t.onSubsUpdated&&t.onSubsUpdated([]))})},enumerable:!0,configurable:!0,writable:!1},contacts:{value:function(e,t){var n=e||this.onMetaSub;if(n)for(var a in this._contacts)n.call(t,this._contacts[a],a,this._contacts)},enumerable:!0,configurable:!0,writable:!0}}),k.prototype.constructor=k;var C=function(e){this._tinode=e,this._apiKey=e._apiKey,this._authToken=e.getAuthToken(),this._msgId=e.getNextUniqueId(),this.xhr=f(),this.toResolve=null,this.toReject=null,this.onProgress=null,this.onSuccess=null,this.onFailure=null};C.prototype={upload:function(e,t,n,a){var o=this;if(!this._authToken)throw new Error("Must authenticate first");var i=this;this.xhr.open("POST","/v"+r+"/file/u/",!0),this.xhr.setRequestHeader("X-Tinode-APIKey",this._apiKey),this.xhr.setRequestHeader("X-Tinode-Auth","Token "+this._authToken.token);var s=new Promise(function(e,t){o.toResolve=e,o.toReject=t});this.onProgress=t,this.onSuccess=n,this.onFailure=a,this.xhr.upload.onprogress=function(e){e.lengthComputable&&i.onProgress&&i.onProgress(e.loaded/e.total)},this.xhr.onload=function(){var e;try{e=JSON.parse(this.response,m)}catch(e){i._tinode.logger("Invalid server response in LargeFileHelper",this.response)}this.status>=200&&this.status<300?(i.toResolve&&i.toResolve(e.ctrl.params.url),i.onSuccess&&i.onSuccess(e.ctrl)):this.status>=400?(i.toReject&&i.toReject(new Error(e.ctrl.text+" ("+e.ctrl.code+")")),i.onFailure&&i.onFailure(e.ctrl)):i._tinode.logger("Unexpected server response status",this.status,this.response)},this.xhr.onerror=function(e){i.toReject&&i.toReject(new Error("failed")),i.onFailure&&i.onFailure(null)},this.xhr.onabort=function(e){i.toReject&&i.toReject(new Error("upload cancelled by user")),i.onFailure&&i.onFailure(null)};try{var l=new FormData;l.append("file",e),l.set("id",this._msgId),this.xhr.send(l)}catch(e){this.toReject&&this.toReject(e),this.onFailure&&this.onFailure(null)}return s},download:function(e,t,n,a){var o=this;if(/^(?:(?:[a-z]+:)?\/\/)/i.test(e))throw new Error("The URL '"+e+"' must be relative, not absolute");if(!this._authToken)throw new Error("Must authenticate first");var r=this;this.xhr.open("GET",e,!0),this.xhr.setRequestHeader("X-Tinode-APIKey",this._apiKey),this.xhr.setRequestHeader("X-Tinode-Auth","Token "+this._authToken.token),this.xhr.responseType="blob",this.onProgress=a,this.xhr.onprogress=function(e){r.onProgress&&r.onProgress(e.loaded)};var i=new Promise(function(e,t){o.toResolve=e,o.toReject=t});this.xhr.onload=function(){if(200==this.status){var e=document.createElement("a");e.href=window.URL.createObjectURL(new Blob([this.response],{type:n})),e.style.display="none",e.setAttribute("download",t),document.body.appendChild(e),e.click(),document.body.removeChild(e),window.URL.revokeObjectURL(e.href),r.toResolve&&r.toResolve()}else if(this.status>=400&&r.toReject){var a=new FileReader;a.onload=function(){try{var e=JSON.parse(this.result,m);r.toReject(new Error(e.ctrl.text+" ("+e.ctrl.code+")"))}catch(e){r._tinode.logger("Invalid server response in LargeFileHelper",this.result),r.toReject(e)}},a.readAsText(this.response)}},this.xhr.onerror=function(e){r.toReject&&r.toReject(new Error("failed"))},this.xhr.onabort=function(){r.toReject&&r.toReject(null)};try{this.xhr.send()}catch(e){this.toReject&&this.toReject(e)}return i},cancel:function(){this.xhr&&this.xhr.readyState<4&&this.xhr.abort()},getId:function(){return this._msgId}};var M=function e(t,n){this.status=e.STATUS_NONE,this.topic=t,this.content=n};M.STATUS_NONE=0,M.STATUS_QUEUED=1,M.STATUS_SENDING=2,M.STATUS_FAILED=3,M.STATUS_SENT=4,M.STATUS_RECEIVED=5,M.STATUS_READ=6,M.STATUS_TO_ME=7,(M.prototype={toJSON:function(){},fromJSON:function(e){}}).constructor=M,l.exports=y,l.exports.Drafty=e}.call(this,void 0!==t?t:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{}),l=l.exports}()}).call(this,n(9))},function(e,t){e.exports=ReactDOM},function(e){e.exports={en:{contacts_not_found:"You have no chats
¯\\\\_(ツ)_/¯",full_name_prompt:"Full name, e.g. John Doe",email_prompt:"Email, e.g. jdoe@example.com",button_sign_up:"Sign up",label_your_name:"Your name",label_password:"Password",password_unchanged_prompt:"Unchanged",label_user_id:"Address:",label_default_access_mode:"Default access mode:",label_message_sound:"Message sound:",label_push_notifications:"Notification alerts:",label_push_notifications_disabled:"Notification alerts (requires HTTPS):",title_tag_manager:"Tags (user discovery)",button_logout:"Logout",requested_permissions:"Requested",granted_permissions:"Granted",menu_item_edit_permissions:"Edit permissions",label_other_user:"Other",title_info:"Info",label_topic_name:"Name",label_private:"Private comment",private_editing_placeholder:"Visible to you only",label_muting_topic:"Muted:",action_more:"More",label_your_permissions:"Your permissions:",label_permissions:"Permissions:",label_you:"You:",label_default_access:"Default access mode:",label_group_members:"Group members:",button_add_members:"Add members",button_leave:"Leave",group_has_no_members:"No members",action_leave_chat:"Leave",login_prompt:"Login",password_prompt:"Password",stay_logged_in:"Stay logged in",forgot_password_link:"Forgot password?",button_sign_in:"Sign in",label_client:"Client:",label_server:"Server:",online_now:"online now",last_seen_timestamp:"Last seen",title_not_found:"Not found",unnamed_topic:"Unnamed",messages_not_readable:"no access to messages",tabtitle_find_user:"find",tabtitle_new_group:"new group",tabtitle_group_by_id:"by id",search_for_contacts:"Use search to find contacts",new_password_placeholder:"Enter new password",label_reset_password:"Send a password reset email:",credential_email_prompt:"Your registration email",button_reset:"Reset",button_send_request:"Send request",label_server_to_use:"Server to use:",label_wire_transport:"Wire transport:",button_update:"Update",sidepanel_title_login:"Sign In",sidepanel_title_register:"Create Account",sidepanel_title_settings:"Settings",sidepanel_title_edit_account:"Edit Account",sidepanel_title_newtpk:"Start New Chat",sidepanel_title_cred:"Confirm Credentials",sidepanel_title_reset:"Reset Password",update_available:'Update available. Reload.',phone_dative:"phone",email_dative:"email",enter_confirmation_code_prompt:"Enter confirmation code sent to you by {method}:",numeric_confirmation_code_prompt:"Numbers only",button_confirm:"Confirm",invalid_content:"invalid content",badge_you:"you",badge_owner:"owner",menu_item_info:"Info",menu_item_clear_messages:"Clear messages",menu_item_clear_messages_for_all:"Clear for All",menu_item_delete:"Delete",menu_item_delete_for_all:"Delete for All",menu_item_mute:"Mute",menu_item_unmute:"Unmute",menu_item_delete_topic:"Delete",menu_item_unblock:"Unblock",menu_item_block:"Block",menu_item_member_delete:"Remove",action_cancel:"cancel",upload_finishing:"finishing...",no_contacts:"You have no contacts :-(",contacts_not_found_short:"No contacts match '{query}'",title_group_members:"Group Members",title_all_contacts:"All Contacts",button_ok:"OK",button_cancel:"Cancel",download_action:"download",label_file_name:"File name:",label_content_type:"Content type:",label_size:"Size:",error_invalid_id:"Invalid ID",group_user_id_prompt:"Group or User ID",button_subscribe:"Subscribe",topic_name_editing_placeholder:"Freeform name of the group",button_create:"Create",permission_join:"Join ({val})",permission_read:"Read ({val})",permission_write:"Write ({val})",permission_pres:"Get notified ({val})",permission_admin:"Approve ({val})",permission_share:"Share ({val})",permission_delete:"Delete ({val})",permission_owner:"Owner ({val})",title_permissions:"Permissions",message_sending:"sending...",message_sending_failed:"failed",search_placeholder:"List like email:alice@example.com, tel:17025550003...",messaging_disabled_prompt:"Messaging disabled",new_message_prompt:"New message",file_attachment_too_large:"The file size {size} exceeds the {limit} limit.",cannot_initiate_file_upload:"Cannot initiate file upload.",tags_not_found:"No tags defined. Add some.",tags_editor_no_tags:"Add some tags",title_manage_tags:"Manage tags"},ru:{contacts_not_found:"Чатов нет
¯\\\\_(ツ)_/¯",full_name_prompt:"Полное имя, напр. Иван Петров",email_prompt:"Email, напр. ivan@example.com",button_sign_up:"Создать счет",label_your_name:"Ваше имя",label_password:"Пароль",password_unchanged_prompt:"Не изменен",label_user_id:"Адрес:",label_default_access_mode:"Доступ по умолчанию:",label_message_sound:"Звук нового сообщения:",label_push_notifications:"Уведомления:",label_push_notifications_disabled:"Уведомления (требуют HTTPS):",title_tag_manager:"Таги для поиска",button_logout:"Выйти",login_prompt:"Логин",password_prompt:"Пароль",stay_logged_in:"Запомнить",forgot_password_link:"Напомнить пароль",button_sign_in:"Войти",label_client:"Клиент:",label_server:"Сервер:",online_now:"онлайн",last_seen_timestamp:"Был активен",title_not_found:"Не найден",unnamed_topic:"Без названия",messages_not_readable:"нет доступа к сообщениям",tabtitle_find_user:"найти",tabtitle_new_group:"создать",tabtitle_group_by_id:"по id",label_server_to_use:"Использовать сервер:",label_wire_transport:"Соединение:",button_update:"Применить",sidepanel_title_login:"Авторизация",sidepanel_title_register:"Зарегистрироваться",sidepanel_title_settings:"Настройки",sidepanel_title_edit_account:"Редактировать счет",sidepanel_title_newtpk:"Новый чат",sidepanel_title_cred:"Подтвердить",sidepanel_title_reset:"Сменить пароль",tags_not_found:"Тагов нет. Добавьте",tags_editor_no_tags:"Добавьте таги",title_manage_tags:"Редактор тагов",message_sending:"в пути...",message_sending_failed:"ошибка",search_placeholder:"Список, напр. email:alice@example.com, tel:17025550003...",messaging_disabled_prompt:"Отправка недоступна",new_message_prompt:"Новое сообщение",file_attachment_too_large:"Размер файла {size} превышает {limit} лимит.",cannot_initiate_file_upload:"Ошибка загрузки файла.",search_for_contacts:"Поиск контактов",enter_confirmation_code_prompt:"Код подтверждения, полученный по {method}:",numeric_confirmation_code_prompt:"Только цифры",button_confirm:"Подтвердить",button_ok:"OK",button_cancel:"Отменить",invalid_content:"сообщение не читается",label_file_name:"Имя файла:",label_content_type:"Тип:",label_size:"Размер:",phone_dative:"телефону",email_dative:"емейлу",title_group_members:"Участники",download_action:"скачать",permission_join:"Подписываться ({val})",permission_read:"Читать ({val})",permission_write:"Писать ({val})",permission_pres:"Уведомлять ({val})",permission_admin:"Подтверждать ({val})",permission_share:"Приглашать ({val})",permission_delete:"Удалять ({val})",permission_owner:"Владелец ({val})",title_permissions:"Права доступа",requested_permissions:"Требуются",granted_permissions:"Получены",menu_item_edit_permissions:"Права доступа",label_other_user:"Второй",label_topic_name:"Название",label_private:"Комментарий",private_editing_placeholder:"Виден только вам",label_muting_topic:"Без уведомлений",action_more:"Ещё",label_your_permissions:"Ваши права доступа:",label_permissions:"Права доступа:",label_you:"Вы:",label_default_access:"Права по умолчанию:",label_group_members:"Участники чата:",button_add_members:"Добавить",button_leave:"Отписаться",group_has_no_members:"Нет участников",action_leave_chat:"Уйти из чата",menu_item_info:"Информация",menu_item_clear_messages:"Удалить сообщения",menu_item_clear_messages_for_all:"Удалить для всех",menu_item_delete:"Удалить",menu_item_delete_for_all:"Удалить для всех",menu_item_mute:"Не уведомлять",menu_item_unmute:"Уведомлять",menu_item_delete_topic:"Удалить чат",menu_item_unblock:"Разблокировать",menu_item_block:"Заблокировать",menu_item_member_delete:"Отписать",title_info:"Подробности",new_password_placeholder:"Введите новый пароль",label_reset_password:"Отправить емейл для смены пароля:",credential_email_prompt:"Регистрационный емейл",button_reset:"Изменить",button_send_request:"Отправить",action_cancel:"отменить",upload_finishing:"завершение...",no_contacts:"Ничего нет :-(",contacts_not_found_short:"Нет контактов для запроса '{query}'",title_all_contacts:"Все контакты",error_invalid_id:"Неверный ID",group_user_id_prompt:"ID чата или пользователя",button_subscribe:"Подписаться",topic_name_editing_placeholder:"Название чата",button_create:"Создать",badge_you:"вы",badge_owner:"влад.",update_available:'Есть новая версия приложения. Обновить.'}}},function(e,t){e.exports=firebase},function(e,t,n){e.exports=function(){"use strict";return[{locale:"ru",pluralRuleFunction:function(e,t){var n=String(e).split("."),a=n[0],o=!n[1],r=a.slice(-1),i=a.slice(-2);return t?"other":o&&1==r&&11!=i?"one":o&&r>=2&&r<=4&&(i<12||i>14)?"few":o&&0==r||o&&r>=5&&r<=9||o&&i>=11&&i<=14?"many":"other"},fields:{year:{displayName:"год",relative:{0:"в этом году",1:"в следующем году","-1":"в прошлом году"},relativeTime:{future:{one:"через {0} год",few:"через {0} года",many:"через {0} лет",other:"через {0} года"},past:{one:"{0} год назад",few:"{0} года назад",many:"{0} лет назад",other:"{0} года назад"}}},month:{displayName:"месяц",relative:{0:"в этом месяце",1:"в следующем месяце","-1":"в прошлом месяце"},relativeTime:{future:{one:"через {0} месяц",few:"через {0} месяца",many:"через {0} месяцев",other:"через {0} месяца"},past:{one:"{0} месяц назад",few:"{0} месяца назад",many:"{0} месяцев назад",other:"{0} месяца назад"}}},day:{displayName:"день",relative:{0:"сегодня",1:"завтра",2:"послезавтра","-2":"позавчера","-1":"вчера"},relativeTime:{future:{one:"через {0} день",few:"через {0} дня",many:"через {0} дней",other:"через {0} дня"},past:{one:"{0} день назад",few:"{0} дня назад",many:"{0} дней назад",other:"{0} дня назад"}}},hour:{displayName:"час",relative:{0:"в этом часе"},relativeTime:{future:{one:"через {0} час",few:"через {0} часа",many:"через {0} часов",other:"через {0} часа"},past:{one:"{0} час назад",few:"{0} часа назад",many:"{0} часов назад",other:"{0} часа назад"}}},minute:{displayName:"минута",relative:{0:"в эту минуту"},relativeTime:{future:{one:"через {0} минуту",few:"через {0} минуты",many:"через {0} минут",other:"через {0} минуты"},past:{one:"{0} минуту назад",few:"{0} минуты назад",many:"{0} минут назад",other:"{0} минуты назад"}}},second:{displayName:"секунда",relative:{0:"сейчас"},relativeTime:{future:{one:"через {0} секунду",few:"через {0} секунды",many:"через {0} секунд",other:"через {0} секунды"},past:{one:"{0} секунду назад",few:"{0} секунды назад",many:"{0} секунд назад",other:"{0} секунды назад"}}}}},{locale:"ru-BY",parentLocale:"ru"},{locale:"ru-KG",parentLocale:"ru"},{locale:"ru-KZ",parentLocale:"ru"},{locale:"ru-MD",parentLocale:"ru"},{locale:"ru-UA",parentLocale:"ru"}]}()},function(e,t,n){e.exports=n(10)},function(e,t){e.exports=firebase.messaging},function(e,t){var n;n=function(){return this}();try{n=n||Function("return this")()||(0,eval)("this")}catch(e){"object"==typeof window&&(n=window)}e.exports=n},function(e,t,n){"use strict";n.r(t);var a=n(0),o=n.n(a),r=n(3),i=n.n(r),s=n(1),l=n(6),c=n.n(l),u=n(4),d=n(5),p=(n(8),n(2)),h=n.n(p),f="TinodeWeb/0.15.9-rc1",m={hosted:"api.tinode.co",local:"localhost:6060"},g=m.hosted,b=3e3,v=195840,y=768;function _(e){return(_="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}function w(e,t){for(var n=0;n0?a<3?2:a<30?1:0:0;return a.toFixed(o)+" "+t[n]}function j(e){return(j="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}function N(e,t){for(var n=0;n=0&&(e=e.substring(0,o)),e+"."+a}function H(e,t,n,a,o,r){var i=new Image;i.crossOrigin="Anonymous",i.onerror=function(e){r("Image format unrecognized")},i.onload=function(){var i=L(this.width,this.height,t,n,a);if(i){var s=document.createElement("canvas");s.width=i.dstWidth,s.height=i.dstHeight;var l=s.getContext("2d");l.imageSmoothingEnabled=!0,l.drawImage(this,i.xoffset,i.yoffset,i.srcWidth,i.srcHeight,0,0,i.dstWidth,i.dstHeight);var c=this.width!=i.dstWidth||this.height!=i.dstHeight||R.indexOf(e.type)<0?"image/jpeg":e.type,u=s.toDataURL(c);if(c=V(u.split(",")[0])){var d=.78;if(K(u.length)>v&&(c="image/jpeg"),"image/jpeg"==c)for(;K(u.length)>v&&d>.45;)u=s.toDataURL(c,d),d*=.84;K(u.length)>v?r("The image size "+bytesToHumanSize(K(u.length))+" exceeds the "+bytesToHumanSize(v)+" limit.","err"):(s=null,o(u.split(",")[1],c,i.dstWidth,i.dstHeight,q(e.name,c)))}else r("Unsupported image format")}else r("Invalid image")},i.src=URL.createObjectURL(e)}function W(e,t,n){var a=new FileReader;a.addEventListener("load",function(){var o=a.result.split(","),r=V(o[0]);if(r){var i=new Image;i.crossOrigin="Anonymous",i.onload=function(){t(o[1],r,this.width,this.height,q(e.name,r))},i.onerror=function(e){n("Image format not recognized")},i.src=URL.createObjectURL(e)}else n("Failed to process image file")},!1),a.readAsDataURL(e)}function G(e,t,n){var a=new FileReader;a.addEventListener("load",function(){t(e.type,a.result.split(",")[1],e.name)}),a.readAsDataURL(e)}function V(e){var t=/^data:(image\/[-+a-z0-9.]+);base64/.exec(e);return t&&t.length>1?t[1]:null}function K(e){return 3*Math.floor(e/4)}function B(e){return(B="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}function z(e,t){for(var n=0;n0&&(e=[],this.props.badges.map(function(t){var n="badge"+(t.color?" "+t.color:"");e.push(o.a.createElement("span",{className:n,key:t.key||t.name},t.name))})),o.a.createElement("span",null,e)}}])&&re(n.prototype,a),r&&re(n,r),t}();function ue(e){return(ue="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}function de(e,t){for(var n=0;n0){var t=this.props.count>9?"9+":this.props.count;e=o.a.createElement("span",{className:"unread"},t)}return e}}])&&de(n.prototype,a),r&&de(n,r),t}();function ge(e){return(ge="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}function be(e,t){for(var n=0;n30&&(e=e.substring(0,28)+"..."):e=o.a.createElement("i",null,o.a.createElement(s.FormattedMessage,{id:"unnamed_topic"}));var t=this.props.now?"online":"offline",n=!this.props.avatar||this.props.avatar,a=this.props.badges.slice();return this.props.showMode&&this.props.acs&&a.push({name:this.props.acs.getMode(),key:"mode"}),o.a.createElement("li",{className:!this.props.showCheckmark&&this.props.selected?"selected":null,onClick:this.handleClick},o.a.createElement("div",{className:"avatar-box"},o.a.createElement(D,{avatar:n,title:this.props.title,topic:this.props.item}),this.props.showOnline?o.a.createElement("span",{className:t}):this.props.showCheckmark&&this.props.selected?o.a.createElement("i",{className:"checkmark material-icons"},"check_circle"):null),o.a.createElement("div",{className:"text-box"},o.a.createElement("div",null,o.a.createElement("span",{className:"contact-title"},e),this.props.unread>0?o.a.createElement(me,{count:this.props.unread}):null),this.props.comment?o.a.createElement("div",{className:"contact-comment"},this.props.comment):null,o.a.createElement(ce,{badges:a})),this.props.showContextMenu?o.a.createElement("span",{className:"menuTrigger"},o.a.createElement("a",{href:"javascript:;",onClick:this.handleContextClick},o.a.createElement("i",{className:"material-icons"},"expand_more"))):null)}}])&&be(n.prototype,a),r&&be(n,r),t}();function Se(e){return(Se="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}function Ee(e,t){for(var n=0;n0&&this.props.contacts.map(function(r){var i=r.topic?r.topic:r.user;if(e.props.filterFunc&&e.props.filter){var s=[i];if(r.private&&r.private.comment&&s.push((""+r.private.comment).toLowerCase()),r.public&&r.public.fn&&s.push((""+r.public.fn).toLowerCase()),!e.props.filterFunc(e.props.filter,s))return}var l=n?e.props.topicSelected.indexOf(i)>-1:e.props.topicSelected===i,c=[];e.props.showMode&&(i===e.props.myUserId&&c.push({name:t(Te.badge_you),color:"green"}),r.acs&&r.acs.isOwner()&&c.push({name:t(Te.badge_owner),color:"blue"}));var u=Array.isArray(r.private)?r.private.join(","):r.private?r.private.comment:null;a.push(o.a.createElement(we,{title:r.public?r.public.fn:null,avatar:I(r.public?r.public.photo:null),comment:u,unread:e.props.showUnread?r.unread:0,now:r.online&&e.props.connected,acs:r.acs,showMode:e.props.showMode,badges:c,showCheckmark:n,selected:l,showOnline:e.props.showOnline,onSelected:e.props.onTopicSelected,showContextMenu:e.props.showContextMenu,item:i,index:a.length,key:i}))},this),o.a.createElement("div",{className:this.props.noScroll?null:"scrollable-panel"},a.length>0?o.a.createElement("ul",{className:"contact-box"},a):o.a.createElement("div",{className:"center-medium-text"},this.props.emptyListMessage))}}])&&Ee(n.prototype,a),r&&Ee(n,r),t}(),Pe=Object(s.injectIntl)(Oe);function je(e){return(je="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}function Ne(e,t){for(var n=0;nthis.props.chips.length&&this.setState({input:""})}},{key:"handleTextInput",value:function(e){this.setState({input:e.target.value}),this.props.filterFunc&&this.props.filterFunc(e.target.value)}},{key:"removeChipAt",value:function(e){var t=this.state.sortedChips[e];this.props.onChipRemoved(t.user,this.state.chipIndex[t.user])}},{key:"handleChipCancel",value:function(e,t){this.removeChipAt(t)}},{key:"handleFocusGained",value:function(){this.setState({focused:!0})}},{key:"handleFocusLost",value:function(){this.setState({focused:!1}),this.props.onFocusLost&&this.props.onFocusLost(this.state.input)}},{key:"handleKeyDown",value:function(e){if("Backspace"===e.key){if(0==this.state.input.length&&this.state.sortedChips.length>0){var t=this.state.sortedChips.length-1;this.state.sortedChips[t].user!==this.props.required&&this.removeChipAt(t)}}else"Enter"===e.key?this.props.onEnter&&this.props.onEnter(this.state.input):"Escape"===e.key&&this.props.onCancel&&this.props.onCancel()}},{key:"render",value:function(){var e=this,t=[],n=0;this.state.sortedChips.map(function(a){t.push(o.a.createElement(De,{onCancel:e.handleChipCancel,avatar:I(a.public?a.public.photo:null),title:a.public?a.public.fn:void 0,noAvatar:e.props.avatarDisabled,topic:a.user,required:a.user===e.props.required,index:n,key:a.user})),n++});var a="chip-input"+(this.state.focused?" focused":"");return o.a.createElement("div",{className:a},t,o.a.createElement("input",{type:"text",placeholder:this.state.placeholder,onChange:this.handleTextInput,onFocus:this.handleFocusGained,onBlur:this.handleFocusLost,onKeyDown:this.handleKeyDown,value:this.state.input,autoFocus:!0}))}}])&&Fe(n.prototype,a),r&&Fe(n,r),t}();function We(e){return(We="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}function Ge(e,t){for(var n=0;n=0)return!0;return!1}return!0}}],(a=[{key:"handleContactSelected",value:function(e,n){var a=this.state.index[e];if(a){if(a.present)return;a.delta+=1,a.present=!0}else a={delta:1,present:!0};var o=this.state.members.slice();o.push(this.props.contacts[n]);var r=t.selectedContacts(o),i=this.state.index;i[e]=a,this.setState({members:o,index:i,selectedContacts:r})}},{key:"handleMemberRemoved",value:function(e,n){var a=this.state.index[e];if(a&&a.present){a.present=!1,a.delta-=1;var o=this.state.members.slice();o.splice(n,1);var r=t.selectedContacts(o),i=this.state.index;i[e]=a,this.setState({members:o,index:i,selectedContacts:r})}}},{key:"handleContactFilter",value:function(e){var t=this.props.intl.formatMessage,n=e?t(ze.contacts_not_found,{query:e}):t(ze.no_contacts);this.setState({contactFilter:e,noContactsMessage:n})}},{key:"handleSubmit",value:function(){var e=this,t=[],n=[],a=[];Object.keys(this.state.index).map(function(o){e.state.index[o].present&&t.push(o),e.state.index[o].delta>0?n.push(o):e.state.index[o].delta<0&&a.push(o)}),this.props.onSubmit(t,n,a)}},{key:"handleCancel",value:function(){this.props.onCancel()}},{key:"render",value:function(){this.props.intl.formatMessage;return o.a.createElement("div",{id:"group-manager"},o.a.createElement("div",{className:"panel-form-row"},o.a.createElement("label",{className:"small"},o.a.createElement(s.FormattedMessage,{id:"title_group_members",defaultMessage:"Group Members"}))),o.a.createElement("div",{className:"panel-form-row"},o.a.createElement(He,{chips:this.state.members,required:this.props.requiredMember,prompt:"add members",filterFunc:this.handleContactFilter,onChipRemoved:this.handleMemberRemoved})),o.a.createElement("div",{className:"panel-form-row"},o.a.createElement("label",{className:"small"},o.a.createElement(s.FormattedMessage,{id:"title_all_contacts",defaultMessage:"All Contacts"}))),o.a.createElement(Pe,{contacts:this.props.contacts,myUserId:this.props.myUserId,topicSelected:this.state.selectedContacts,filter:this.state.contactFilter,filterFunc:t.doContactFiltering,emptyListMessage:this.state.noContactsMessage,showOnline:!1,showUnread:!1,onTopicSelected:this.handleContactSelected}),o.a.createElement("div",{id:"group-manager-buttons",className:"panel-form-row"},o.a.createElement("button",{className:"blue",onClick:this.handleSubmit},o.a.createElement(s.FormattedMessage,{id:"button_ok",defaultMessage:"OK"})),o.a.createElement("button",{className:"white",onClick:this.handleCancel},o.a.createElement(s.FormattedMessage,{id:"button_cancel",defaultMessage:"Cancel"}))))}}])&&Ge(n.prototype,a),r&&Ge(n,r),t}(),Ye=Object(s.injectIntl)(Je);function Qe(e){return(Qe="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}function Xe(e,t){for(var n=0;n20&&(t=t.substring(0,19)+"...")}return this.state.active?"password"==e?o.a.createElement(tt,{value:this.state.value,placeholder:this.props.placeholder,required:this.props.required?"required":"",autoComplete:this.props.autoComplete,autoFocus:!0,onFinished:this.handlePasswordFinished}):o.a.createElement("input",{type:e,value:this.state.value,placeholder:this.props.placeholder,required:this.props.required?"required":"",autoComplete:this.props.autoComplete,autoFocus:!0,onChange:this.handeTextChange,onKeyDown:this.handleKeyDown,onBlur:this.handleEditingFinished}):o.a.createElement("span",{className:n,onClick:this.handleStartEditing},o.a.createElement("span",{className:"content"},t))}}])&&at(n.prototype,a),r&&at(n,r),t}();function lt(e){return(lt="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}function ct(e,t){for(var n=0;n=0&&a.indexOf(c)<0||i.push(o.a.createElement("tr",{key:c},o.a.createElement("td",null,t[c]),o.a.createElement("td",{className:"checkbox"},n.indexOf(c)<0?o.a.createElement(ae,{name:c,checked:a.indexOf(c)>=0,onChange:this.handleChange}):o.a.createElement(ae,{name:c,checked:a.indexOf(c)>=0})),this.props.compare?o.a.createElement("td",{className:"checkbox"},o.a.createElement(ae,{name:c,checked:r.indexOf(c)>=0})):null))}return o.a.createElement("div",{className:"panel-form-column"},this.props.userTitle?o.a.createElement("ul",{className:"contact-box"},o.a.createElement(we,{item:this.props.item,title:this.props.userTitle,avatar:I(this.props.userAvatar?this.props.userAvatar:null)})):null,o.a.createElement("label",{className:"small"},o.a.createElement(s.FormattedMessage,{id:"title_permissions",defaultMessage:"Permissions"})),o.a.createElement("table",{className:"permission-editor"},this.props.compare?o.a.createElement("thead",null,o.a.createElement("tr",null,o.a.createElement("th",null),o.a.createElement("th",null,this.props.modeTitle),o.a.createElement("th",null,this.props.compareTitle))):null,o.a.createElement("tbody",null,i)),o.a.createElement("br",null),o.a.createElement("div",{className:"dialog-buttons"},o.a.createElement("button",{className:"blue",onClick:this.handleSubmit},o.a.createElement(s.FormattedMessage,{id:"button_ok"})),o.a.createElement("button",{className:"white",onClick:this.handleCancel},o.a.createElement(s.FormattedMessage,{id:"button_cancel"}))))}}])&&wt(n.prototype,a),r&&wt(n,r),t}(),Tt=Object(s.injectIntl)(Mt);function Ot(e){var t=document.getElementById("shortcut-icon");if(t){var n=document.head||document.getElementsByTagName("head")[0],a=document.createElement("link");a.type="image/png",a.id="shortcut-icon",a.rel="shortcut icon",a.href="img/logo32x32"+(e>0?"a":"")+".png",n.removeChild(t),n.appendChild(a)}document.title=(e>0?"("+e+") ":"")+"Tinode"}function Pt(e){return(Pt="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}function jt(e,t){for(var n=0;n0){var t=e[e.length-1];if(","==t||" "==t||";"==t){var n=e.substr(0,e.length-1).trim();n.length>=4&&this.handleAddTag(n)}}}},{key:"handleAddTag",value:function(e){if((e=e.trim()).length>0){var t=this.state.tags.slice(0);t.push(e),this.setState({tags:t,tagInput:""}),this.props.onTagsChanged&&this.props.onTagsChanged(t)}}},{key:"handleRemoveTag",value:function(e,t){var n=this.state.tags.slice(0);n.splice(t,1),this.setState({tags:n}),this.props.onTagsChanged&&this.props.onTagsChanged(n)}},{key:"handleSubmit",value:function(){var e=this.state.tags.slice(0),t=this.state.tagInput.trim();t.length>0&&(e.push(t),this.props.onTagsChanged&&this.props.onTagsChanged(e)),this.props.onSubmit(e),this.setState({activated:!1,tagInput:"",tags:this.props.tags})}},{key:"handleCancel",value:function(){this.setState({activated:!1,tagInput:"",tags:this.props.tags}),this.props.onCancel&&this.props.onCancel()}},{key:"render",value:function(){var e=this,t=[];return this.state.activated?this.state.tags.map(function(e){t.push({user:e})}):(this.state.tags.map(function(e){t.push(o.a.createElement("span",{className:"badge",key:t.length},e))}),0==t.length&&(t=o.a.createElement("i",null,o.a.createElement(s.FormattedMessage,{id:"tags_not_found",defaultMessage:"No tags defined. Add some."})))),o.a.createElement("div",{className:"panel-form-column"},o.a.createElement("div",{className:"panel-form-row"},o.a.createElement("label",{className:"small"},this.props.title)),this.state.activated?o.a.createElement("div",null,o.a.createElement(s.FormattedMessage,{id:"tags_editor_no_tags",defaultMessage:"Add some tags"},function(n){return o.a.createElement(He,{chips:t,avatarDisabled:!0,prompt:n,onEnter:e.handleAddTag,onFocusLost:e.handleAddTag,onCancel:e.handleCancel,onChipRemoved:e.handleRemoveTag,filterFunc:e.handleTagInput})}),this.props.onSubmit||this.props.onCancel?o.a.createElement("div",{id:"tag-manager-buttons",className:"panel-form-row"},o.a.createElement("button",{className:"blue",onClick:this.handleSubmit},o.a.createElement(s.FormattedMessage,{id:"button_ok",defautMessage:"OK",description:"Confirmation button [OK]"})),o.a.createElement("button",{className:"white",onClick:this.handleCancel},o.a.createElement(s.FormattedMessage,{id:"button_cancel",defautMessage:"Cancel",description:"Rejection button [Cancel]"}))):null):o.a.createElement("div",null,o.a.createElement("a",{href:"javascript:;",className:"flat-button",onClick:this.handleShowTagManager},o.a.createElement("i",{className:"material-icons"},"edit")," ",o.a.createElement(s.FormattedMessage,{id:"title_manage_tags",defaultMessage:"Manage tags"})),o.a.createElement("span",null,t)))}}])&&jt(n.prototype,a),r&&jt(n,r),t}();function Dt(e){return(Dt="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}function Rt(e,t){for(var n=0;n36&&(t=t.substr(0,16)+"..."+t.substr(-16));var n,a,r=this.props.size>0?o.a.createElement("span",{className:"small gray"},"(",bytesToHumanSize(this.props.size),")"):null;return this.props.uploader||this.state.downloader||/^(?:(?:[a-z]+:)?\/\/)/i.test(this.props.downloadUrl)?(n=this.props.downloadUrl,a=null):(n="javascript:;",a=function(t){e.downloadFile(e.props.downloadUrl,e.props.filename,e.props.mimetype)}),o.a.createElement("div",{className:"attachment"},o.a.createElement("div",null,o.a.createElement("i",{className:"material-icons big gray"},"insert_drive_file")),o.a.createElement("div",{className:"flex-column"},o.a.createElement("div",null,t," ",r),this.props.uploader||this.state.downloader?o.a.createElement(Jt,{progress:this.props.uploader?this.props.progress:this.state.progress,onCancel:this.handleCancel}):o.a.createElement("div",null,o.a.createElement("a",{href:n,download:this.props.filename,onClick:a},o.a.createElement("i",{className:"material-icons"},"file_download")," save"))))}}])&&Qt(n.prototype,a),r&&Qt(n,r),t}();function tn(e){return(tn="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}function nn(e,t){for(var n=0;nthis.props.content.height?{width:"100%"}:{height:"100%"};n.maxWidth="100%",n.maxHeight="100%";var a=this.props.content.filename,r=this.props.content.width/13|0;return a.length>r&&(a=a.slice(0,r-2)+"..."+a.slice(2-r)),o.a.createElement("div",{id:"image-preview",onClick:this.props.onClose},o.a.createElement("div",{id:"image-preview-caption-panel"},o.a.createElement("a",{href:this.props.content.url,download:this.props.content.filename},o.a.createElement("i",{className:"material-icons"},"file_download")," ",o.a.createElement(s.FormattedMessage,{id:"download_action",defaultMessage:"download"})),o.a.createElement("a",{href:"javascript:;",onClick:this.props.onClose},o.a.createElement("i",{className:"material-icons gray"},"close"))),o.a.createElement("div",{id:"image-preview-container",ref:function(t){e.container=t}},o.a.createElement("img",{src:this.props.content.url,style:n})),o.a.createElement("div",{id:"image-preview-footer"},o.a.createElement("div",null,o.a.createElement("div",null,o.a.createElement("b",null,o.a.createElement(s.FormattedMessage,{id:"label_file_name",defaultMessage:"File name:"}))),o.a.createElement("div",null,o.a.createElement("span",{title:this.props.content.filename},a))),o.a.createElement("div",null,o.a.createElement("div",null,o.a.createElement("b",null,o.a.createElement(s.FormattedMessage,{id:"label_content_type",defaultMessage:"Content type:"}))),o.a.createElement("div",null,this.props.content.type)),o.a.createElement("div",null,o.a.createElement("div",null,o.a.createElement("b",null,o.a.createElement(s.FormattedMessage,{id:"label_size",defaultMessage:"Size:"}))),o.a.createElement("div",null,this.props.content.width," × ",this.props.content.height," px; ",P(this.props.content.size)))))}}])&&Pn(n.prototype,a),r&&Pn(n,r),t}();function An(e){return(An="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}function Dn(e,t){for(var n=0;nv||R.indexOf(s.type)<0?H(s,y,y,!1,t,a):W(s,t,a):G(s,n),!0}}return!1}(e,function(e,n,a,o,r){t.props.sendMessage(p.Drafty.insertImage(null,0,n,e,a,o,r))},function(e,n,a){t.props.sendMessage(p.Drafty.attachFile(null,e,n,a))},this.props.onError)&&e.preventDefault()}},{key:"handleAttachImage",value:function(e){var t=this;if(e.target.files&&e.target.files.length>0){var n=e.target.files[0];n.size>v||R.indexOf(n.type)<0?H(n,y,y,!1,function(e,n,a,o,r){t.props.sendMessage(p.Drafty.insertImage(null,0,n,e,a,o,r))},function(e){t.props.onError(e,"err")}):W(n,function(e,n,a,o,r){t.props.sendMessage(p.Drafty.insertImage(null,0,n,e,a,o,r))},function(e){t.props.onError(e,"err")})}e.target.value=""}},{key:"handleAttachFile",value:function(e){var t=this,n=this.props.intl.formatMessage;if(e.target.files&&e.target.files.length>0){var a=e.target.files[0];if(a.size>1<<23)this.props.onError(n(Xn.file_attachment_too_large,{size:P(a.size),limit:P(1<<23)}),"err");else if(a.size>v){var o=this.props.tinode.getLargeFileHelper();if(!o)return void this.props.onError(n(Xn.cannot_initiate_upload));var r=o.upload(a),i=p.Drafty.attachFile(null,a.type,null,a.name,a.size,r);this.props.sendMessage(i,r,o)}else fileToBase64(a,function(e,n,a){t.props.sendMessage(p.Drafty.attachFile(null,e,n,a))},this.props.onError)}e.target.value=""}},{key:"handleSend",value:function(){this.state.message.trim()&&(this.props.sendMessage(this.state.message.trim()),this.setState({message:""}))}},{key:"handleKeyPress",value:function(e){"Enter"===e.key&&(e.shiftKey||(e.preventDefault(),e.stopPropagation(),this.handleSend()))}},{key:"handleMessageTyping",value:function(e){var t={message:e.target.value},n=(new Date).getTime();if(n-this.state.keypressTimestamp>b){var a=this.props.tinode.getTopic(this.props.topic);a.isSubscribed()&&a.noteKeyPress(),t.keypressTimestamp=n}this.setState(t)}},{key:"render",value:function(){var e=this.props.intl.formatMessage,t=this.props.disabled?e(Xn.messaging_disabled):e(Xn.type_new_message),n=this;return o.a.createElement("div",{id:"send-message-panel"},this.props.disabled?o.a.createElement("i",{className:"material-icons disabled"},"photo"):o.a.createElement("a",{href:"javascript:;",onClick:function(e){n.attachImage.click()},title:"Add image"},o.a.createElement("i",{className:"material-icons secondary"},"photo")),this.props.disabled?o.a.createElement("i",{className:"material-icons disabled"},"attach_file"):o.a.createElement("a",{href:"javascript:;",onClick:function(e){n.attachFile.click()},title:"Attach file"},o.a.createElement("i",{className:"material-icons secondary"},"attach_file")),o.a.createElement("textarea",{id:"sendMessage",placeholder:t,disabled:this.props.disabled,value:this.state.message,onChange:this.handleMessageTyping,onKeyPress:this.handleKeyPress,ref:function(e){n.pasteFile=e},autoFocus:!0}),this.props.disabled?o.a.createElement("i",{className:"material-icons disabled"},"send"):o.a.createElement("a",{href:"javascript:;",onClick:this.handleSend,title:"Send"},o.a.createElement("i",{className:"material-icons"},"send")),o.a.createElement("input",{type:"file",ref:function(e){n.attachFile=e},onChange:this.handleAttachFile,style:{display:"none"}}),o.a.createElement("input",{type:"file",ref:function(e){n.attachImage=e},accept:"image/*",onChange:this.handleAttachImage,style:{display:"none"}}))}}])&&zn(n.prototype,a),r&&zn(n,r),t}(),Zn=Object(s.injectIntl)($n);function ea(e){return(ea="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}function ta(e,t){for(var n=0;n=h.a.MESSAGE_STATUS_SENT&&this.props.readTimerHandler(function(){t.noteRead(e.seq)}),this.props.onData(e));this.setState(n)}},{key:"handleAllMessagesReceived",value:function(e){this.setState({fetchingMessages:!1})}},{key:"handleInfoReceipt",value:function(e){switch(e.what){case"kp":clearTimeout(this.keyPressTimer);var t=this;this.keyPressTimer=setTimeout(function(){t.setState({typingIndicator:!1})},b+1e3),this.state.typingIndicator||this.setState({typingIndicator:!0});break;case"read":case"recv":this.forceUpdate();break;default:console.log("Other change in topic: ",e.what)}}},{key:"handleImagePreview",value:function(e){this.setState({imagePreview:e})}},{key:"handleCloseImagePreview",value:function(){this.setState({imagePreview:null})}},{key:"handleContextClick",value:function(e){e.preventDefault(),e.stopPropagation(),this.props.showContextMenu({topicName:this.state.topic,y:e.pageY,x:e.pageX})}},{key:"handleShowContextMenuMessage",value:function(e){e.topicName=this.state.topic;var t=["message_delete"],n=this.props.tinode.getTopic(e.topicName);if(n){var a=n.getAccessMode();a&&a.isDeleter()&&t.push("message_delete_hard")}this.props.showContextMenu(e,t)}},{key:"handleBackNavigation",value:function(){this.props.onHideMessagesView()}},{key:"render",value:function(){var e,t=this.props.intl.formatMessage;if(this.state.topic){for(var n=[],a=this.props.tinode.getTopic(this.state.topic),r="grp"==a.getType(),i=null,l=null,c=0;c¯\\\\_(ツ)_/¯"}}),xa=function(e){function t(e){var n;return function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,t),(n=Oa(this,Pa(t).call(this,e))).state=t.getDerivedStateFromProps(e,{}),n}var n,a,r;return function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),t&&ja(e,t)}(t,o.a.Component),n=t,r=[{key:"getDerivedStateFromProps",value:function(e,t){var n=[],a=0;return e.chatList.map(function(e){a+=e.unread>0?1:0,n.push(e)}),n.sort(function(e,t){return(t.touched||0)-(e.touched||0)}),Ot(a),{contactList:n}}}],(a=[{key:"render",value:function(){var e=this.props.intl.formatHTMLMessage;return o.a.createElement(Pe,{connected:this.props.connected,contacts:this.state.contactList,emptyListMessage:o.a.createElement("span",null,e(Na.contacts_not_found)),topicSelected:this.props.topicSelected,myUserId:this.props.myUserId,showOnline:!0,showUnread:!0,onTopicSelected:this.props.onTopicSelected,showContextMenu:this.props.showContextMenu})}}])&&Ta(n.prototype,a),r&&Ta(n,r),t}(),Ua=Object(s.injectIntl)(xa);function Aa(e,t){for(var n=0;n3&&("usr"==t.substr(0,3)||"grp"==t.substr(0,3))?this.props.onSubmit(t):this.props.onError(this.props.intl.formatMessage(ro.invalid_id),"err")}}},{key:"render",value:function(){var e=this;return o.a.createElement("div",{className:"panel-form"},o.a.createElement("div",{className:"panel-form-row"},o.a.createElement(s.FormattedMessage,{id:"group_user_id_prompt",defaultMessage:"Group or User ID"},function(t){return o.a.createElement("input",{type:"text",placeholder:t,value:e.state.groupId,onChange:e.handleChange,onKeyPress:e.handleKeyPress,required:!0})})),o.a.createElement("div",{className:"dialog-buttons"},o.a.createElement("button",{className:"blue",onClick:this.handleSubmit},o.a.createElement(s.FormattedMessage,{id:"button_subscribe",defaultMessage:"Subscribe"}))))}}])&&to(n.prototype,a),r&&to(n,r),t}(),so=Object(s.injectIntl)(io);function lo(e){return(lo="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}function co(e,t){for(var n=0;n0}),this.props.onSearchContacts(t.length>0?t:h.a.DEL_CHAR)}},{key:"handleClear",value:function(){this.state.edited&&this.props.onSearchContacts(h.a.DEL_CHAR),this.setState({search:"",edited:!1})}},{key:"handleKeyDown",value:function(e){"Enter"===e.key?this.handleSearch(e):"Escape"===e.key&&this.handleClear()}},{key:"render",value:function(){var e=this;return o.a.createElement("div",{className:"panel-form"},o.a.createElement("div",{className:"panel-form-row"},o.a.createElement("i",{className:"material-icons search"},"search"),o.a.createElement(s.FormattedMessage,{id:"search_placeholder",defaultMessage:"List like email:alice@example.com, tel:17025550003..."},function(t){return o.a.createElement("input",{className:"search",type:"text",placeholder:t,value:e.state.search,onChange:e.handleSearchChange,onKeyDown:e.handleKeyDown,required:!0,autoFocus:!0})}),o.a.createElement("a",{href:"javascript:;",onClick:this.handleClear},o.a.createElement("i",{className:"material-icons"},"close"))))}}])&&go(n.prototype,a),r&&go(n,r),t}();function wo(e,t){for(var n=0;nReload.'}}),yr=function(e){function t(e){var n,a,o;return function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,t),a=this,(n=!(o=fr(t).call(this,e))||"object"!==dr(o)&&"function"!=typeof o?gr(a):o).state=n.getBlankState(),n.handleResize=n.handleResize.bind(gr(gr(n))),n.handleHashRoute=n.handleHashRoute.bind(gr(gr(n))),n.handleOnline=n.handleOnline.bind(gr(gr(n))),n.checkForAppUpdate=n.checkForAppUpdate.bind(gr(gr(n))),n.handleAppVisibility=n.handleAppVisibility.bind(gr(gr(n))),n.handleReadTimer=n.handleReadTimer.bind(gr(gr(n))),n.handleVisibilityEvent=n.handleVisibilityEvent.bind(gr(gr(n))),n.handleError=n.handleError.bind(gr(gr(n))),n.handleLoginRequest=n.handleLoginRequest.bind(gr(gr(n))),n.handleConnected=n.handleConnected.bind(gr(gr(n))),n.doLogin=n.doLogin.bind(gr(gr(n))),n.handleCredentialsRequest=n.handleCredentialsRequest.bind(gr(gr(n))),n.handleLoginSuccessful=n.handleLoginSuccessful.bind(gr(gr(n))),n.handleDisconnect=n.handleDisconnect.bind(gr(gr(n))),n.tnMeMetaDesc=n.tnMeMetaDesc.bind(gr(gr(n))),n.tnMeContactUpdate=n.tnMeContactUpdate.bind(gr(gr(n))),n.tnMeSubsUpdated=n.tnMeSubsUpdated.bind(gr(gr(n))),n.resetContactList=n.resetContactList.bind(gr(gr(n))),n.tnData=n.tnData.bind(gr(gr(n))),n.tnInitFind=n.tnInitFind.bind(gr(gr(n))),n.tnFndSubsUpdated=n.tnFndSubsUpdated.bind(gr(gr(n))),n.handleSearchContacts=n.handleSearchContacts.bind(gr(gr(n))),n.handleTopicSelected=n.handleTopicSelected.bind(gr(gr(n))),n.handleHideMessagesView=n.handleHideMessagesView.bind(gr(gr(n))),n.handleSendMessage=n.handleSendMessage.bind(gr(gr(n))),n.handleNewAccount=n.handleNewAccount.bind(gr(gr(n))),n.handleNewAccountRequest=n.handleNewAccountRequest.bind(gr(gr(n))),n.handleUpdateAccountRequest=n.handleUpdateAccountRequest.bind(gr(gr(n))),n.handleUpdateAccountTagsRequest=n.handleUpdateAccountTagsRequest.bind(gr(gr(n))),n.handleSettings=n.handleSettings.bind(gr(gr(n))),n.handleGlobalSettings=n.handleGlobalSettings.bind(gr(gr(n))),n.handleToggleMessageSounds=n.handleToggleMessageSounds.bind(gr(gr(n))),n.initDesktopAlerts=n.initDesktopAlerts.bind(gr(gr(n))),n.togglePushToken=n.togglePushToken.bind(gr(gr(n))),n.requestPushToken=n.requestPushToken.bind(gr(gr(n))),n.handleSidepanelCancel=n.handleSidepanelCancel.bind(gr(gr(n))),n.handleNewTopic=n.handleNewTopic.bind(gr(gr(n))),n.handleNewTopicRequest=n.handleNewTopicRequest.bind(gr(gr(n))),n.handleNewTopicCreated=n.handleNewTopicCreated.bind(gr(gr(n))),n.handleTopicUpdateRequest=n.handleTopicUpdateRequest.bind(gr(gr(n))),n.handleChangePermissions=n.handleChangePermissions.bind(gr(gr(n))),n.handleTagsUpdated=n.handleTagsUpdated.bind(gr(gr(n))),n.handleLogout=n.handleLogout.bind(gr(gr(n))),n.handleLeaveUnsubRequest=n.handleLeaveUnsubRequest.bind(gr(gr(n))),n.handleDialogCancel=n.handleDialogCancel.bind(gr(gr(n))),n.handleShowContextMenu=n.handleShowContextMenu.bind(gr(gr(n))),n.defaultTopicContextMenu=n.defaultTopicContextMenu.bind(gr(gr(n))),n.handleHideContextMenu=n.handleHideContextMenu.bind(gr(gr(n))),n.handleShowInfoView=n.handleShowInfoView.bind(gr(gr(n))),n.handleHideInfoView=n.handleHideInfoView.bind(gr(gr(n))),n.handleMemberUpdateRequest=n.handleMemberUpdateRequest.bind(gr(gr(n))),n.handleValidateCredentialsRequest=n.handleValidateCredentialsRequest.bind(gr(gr(n))),n.handlePasswordResetRequest=n.handlePasswordResetRequest.bind(gr(gr(n))),n.handleResetPassword=n.handleResetPassword.bind(gr(gr(n))),n}var n,a,r;return function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),t&&mr(e,t)}(t,o.a.Component),n=t,r=[{key:"tnSetup",value:function(e,t){var n=new h.a(f,e,"AQEAAAABAAD_rAp4DJh05a1HAwFT3A6K",t,ur());return n.enableLogging(!0,!0),n}},{key:"prepareSearchableContacts",value:function(e,t){var n={},a=!0,o=!1,r=void 0;try{for(var i,s=e[Symbol.iterator]();!(a=(i=s.next()).done);a=!0){var l=i.value;"p2p"==h.a.topicType(l.topic)&&(n[l.topic]={user:l.topic,updated:l.updated,public:l.public,private:l.private,acs:l.acs})}}catch(e){o=!0,r=e}finally{try{a||null==s.return||s.return()}finally{if(o)throw r}}var c=!0,u=!1,d=void 0;try{for(var p,f=t[Symbol.iterator]();!(c=(p=f.next()).done);c=!0){var m=p.value;n[m.user]||(n[m.user]=m)}}catch(e){u=!0,d=e}finally{try{c||null==f.return||f.return()}finally{if(u)throw d}}return Object.values(n)}}],(a=[{key:"getBlankState",value:function(){var e,t,n=Da.getObject("settings")||{};return pr(e={connected:!1,transport:n.transport||null,serverAddress:n.serverAddress||(t=g,"object"==cr(window.location)&&("file:"==window.location.protocol||"localhost"==window.location.hostname?t=m.local:window.location.hostname&&(t=window.location.hostname+(window.location.port?":"+window.location.port:""))),t),serverVersion:"no connection",messageSounds:!n.messageSoundsOff,desktopAlerts:n.desktopAlerts,desktopAlertsEnabled:(ur()||"object"==cr(window.location)&&"localhost"==window.location.hostname)&&void 0!==d&&"undefined"!=typeof navigator&&"undefined"!=typeof FIREBASE_INIT,firebaseToken:Da.getObject("firebase-token"),errorText:"",errorLevel:null,sidePanelSelected:"login",sidePanelTitle:null,sidePanelAvatar:null,dialogSelected:null,contextMenuVisible:!1,login:"",password:"",myUserId:null,liveConnection:navigator.onLine,topicSelected:"",topicSelectedOnline:!1,topicSelectedAcs:null,newGroupTopicParams:null,loginDisabled:!1,displayMobile:window.innerWidth<=640,showInfoPanel:!1,mobilePanel:"sidepanel"},"contextMenuVisible",!1),pr(e,"contextMenuBounds",null),pr(e,"contextMenuClickAt",null),pr(e,"contextMenuParams",null),pr(e,"contextMenuItems",[]),pr(e,"chatList",[]),pr(e,"searchResults",[]),pr(e,"searchableContacts",[]),pr(e,"credMethod",void 0),pr(e,"credCode",void 0),e}},{key:"componentDidMount",value:function(){var e=this;if(window.addEventListener("resize",this.handleResize),window.addEventListener("online",function(t){e.handleOnline(!0)}),window.addEventListener("offline",function(t){e.handleOnline(!1)}),window.addEventListener("hashchange",this.handleHashRoute),document.addEventListener("visibilitychange",this.handleVisibilityEvent),this.setState({viewportWidth:document.documentElement.clientWidth}),this.tinode=t.tnSetup(this.state.serverAddress,this.state.transport),this.tinode.onConnect=this.handleConnected,this.tinode.onDisconnect=this.handleDisconnect,this.state.desktopAlertsEnabled)try{this.fbPush=d.initializeApp(FIREBASE_INIT,f).messaging(),this.fbPush.usePublicVapidKey(FIREBASE_INIT.messagingVapidKey),navigator.serviceWorker.register("/service-worker.js").then(function(t){e.checkForAppUpdate(t,function(){}),e.fbPush.useServiceWorker(t),e.initDesktopAlerts(),e.state.desktopAlerts&&(e.state.firebaseToken?e.tinode.setDeviceToken(e.state.firebaseToken):e.togglePushToken(!0))}).catch(function(e){console.log("Failed to register service worker:",e)})}catch(e){this.handleError("Failed to initialize push notifications","err"),console.log("Failed to initialize push notifications",e),this.setState({desktopAlertsEnabled:!1})}var n=Da.getObject("keep-logged-in")?Da.getObject("auth-token"):void 0,a=So.parseUrlHash(window.location.hash);n?(n.expires=new Date(n.expires),this.tinode.setAuthToken(n),this.tinode.connect().catch(function(t){e.handleError(t.message,"err")}),delete a.params.info,delete a.params.tab,a.path[0]="",So.navigateTo(So.composeUrlHash(a.path,a.params))):a.params.token||So.navigateTo(""),this.readTimer=null,this.readTimerCallback=null,this.handleHashRoute()}},{key:"componentWillUnmount",value:function(){window.removeEventListener("resize",this.handleResize),window.removeEventListener("hashchange",this.handleHashRoute),document.removeEventListener("visibilitychange",this.handleVisibilityEvent)}},{key:"handleResize",value:function(){var e=document.documentElement.clientWidth<=640;this.setState({viewportWidth:document.documentElement.clientWidth}),this.state.displayMobile!=e&&this.setState({displayMobile:e})}},{key:"checkForAppUpdate",value:function(e){var t=this,n=this.props.intl.formatHTMLMessage;e.onupdatefound=function(){var a=e.installing;a.onstatechange=function(){"installed"==a.state&&navigator.serviceWorker.controller&&t.handleError(n(vr.update_available),"info")}}}},{key:"handleHashRoute",value:function(){var e=So.parseUrlHash(window.location.hash);e.path&&e.path.length>0?(["register","settings","edit","cred","reset","newtpk","contacts",""].includes(e.path[0])?this.setState({sidePanelSelected:e.path[0]}):console.log("Unknown sidepanel view",e.path[0]),e.path.length>1&&e.path[1]!=this.state.topicSelected&&this.setState({topicSelected:h.a.topicType(e.path[1])?e.path[1]:null})):this.setState({sidePanelSelected:""}),e.params.method&&this.setState({credMethod:e.params.method}),e.params.code&&this.setState({credCode:e.params.code}),this.setState({showInfoPanel:e.params.info,newTopicTabSelected:e.params.tab})}},{key:"handleOnline",value:function(e){e?this.handleError("",null):this.handleError("No connection","warn"),this.setState({liveConnection:e})}},{key:"handleAppVisibility",value:function(e,t){clearTimeout(this.readTimer),this.readTimerCallback=t,this.readTimer=e&&t?setTimeout(t,1e3):null}},{key:"handleReadTimer",value:function(e){this.handleAppVisibility(!document.hidden,e)}},{key:"handleVisibilityEvent",value:function(){this.handleAppVisibility(!document.hidden,this.readTimerCallback)}},{key:"handleError",value:function(e,t){this.setState({errorText:e,errorLevel:t})}},{key:"handleLoginRequest",value:function(e,t){var n=this;this.setState({loginDisabled:!0,login:e,password:t}),this.handleError("",null),this.tinode.isConnected()?this.doLogin(e,t,{meth:this.state.credMethod,resp:this.state.credCode}):this.tinode.connect().catch(function(e){n.setState({loginDisabled:!1}),n.handleError(e.message,"err")})}},{key:"handleConnected",value:function(){var e=this.tinode.getServerInfo();this.setState({serverVersion:e.ver+" "+(e.build?e.build:"none")+"; "}),this.doLogin(this.state.login,this.state.password,{meth:this.state.credMethod,resp:this.state.credCode})}},{key:"doLogin",value:function(e,t,n){var a=this;if(this.tinode.isAuthenticated())So.navigateTo("");else{n=h.a.credential(n);var o=null,r=this.tinode.getAuthToken();e&&t?(this.setState({password:null}),o=this.tinode.loginBasic(e,t,n)):r&&(o=this.tinode.loginToken(r.token,n)),o?o.then(function(e){e.code>=300&&"validate credentials"===e.text?(n&&a.handleError("Code does not match","warn"),a.handleCredentialsRequest(e.params)):a.handleLoginSuccessful()}).catch(function(e){a.setState({loginDisabled:!1,credMethod:void 0,credCode:void 0}),a.handleError(e.message,"err"),localStorage.removeItem("auth-token"),So.navigateTo("")}):(So.navigateTo(""),this.setState({loginDisabled:!1}))}}},{key:"handleCredentialsRequest",value:function(e){var t=So.parseUrlHash(window.location.hash);t.path[0]="cred",t.params.method=e.cred[0],So.navigateTo(So.composeUrlHash(t.path,t.params))}},{key:"handleLoginSuccessful",value:function(){var e=this;this.handleError("",null),Da.getObject("keep-logged-in")&&Da.setObject("auth-token",this.tinode.getAuthToken());var t=this.tinode.getMeTopic();t.onMetaDesc=this.tnMeMetaDesc,t.onContactUpdate=this.tnMeContactUpdate,t.onSubsUpdated=this.tnMeSubsUpdated,this.setState({connected:!0,credMethod:void 0,credCode:void 0,myUserId:this.tinode.getCurrentUserID()}),t.subscribe(t.startMetaQuery().withLaterSub().withDesc().build()).catch(function(t){localStorage.removeItem("auth-token"),e.handleError(t.message,"err"),So.navigateTo("")}),So.navigateTo(So.setUrlSidePanel(window.location.hash,"contacts"))}},{key:"handleDisconnect",value:function(e){this.setState({connected:!1,topicSelectedOnline:!1,dialogSelected:null,errorText:e&&e.message?e.message:"Disconnected",errorLevel:e&&e.message?"err":"warn",loginDisabled:!1,contextMenuVisible:!1,serverVersion:"no connection"})}},{key:"tnMeMetaDesc",value:function(e){e&&e.public&&this.setState({sidePanelTitle:e.public.fn,sidePanelAvatar:I(e.public.photo)})}},{key:"tnMeContactUpdate",value:function(e,t){"on"==e||"off"==e?(this.resetContactList(),this.state.topicSelected==t.topic&&this.setState({topicSelectedOnline:"on"==e})):"read"==e?this.resetContactList():"msg"==e?this.state.topicSelected!=t.topic?(this.state.messageSounds&&br.play(),this.resetContactList()):document.hidden&&this.state.messageSounds&&br.play():"recv"==e||("gone"==e||"unsub"==e?(this.state.topicSelected==t.topic&&this.handleTopicSelected(null),this.resetContactList()):"acs"==e?this.state.topicSelected==t.topic&&this.setState({topicSelectedAcs:t.acs}):"del"==e||console.log("Unsupported (yet) presence update:"+e+" in: "+t.topic))}},{key:"tnMeSubsUpdated",value:function(e){this.resetContactList()}},{key:"resetContactList",value:function(){var e=this,n={chatList:[]};this.tinode.getMeTopic().contacts(function(t){n.chatList.push(t),e.state.topicSelected==t.topic&&(n.topicSelectedOnline=t.online,n.topicSelectedAcs=t.acs)}),n.searchableContacts=t.prepareSearchableContacts(n.chatList,this.state.searchResults),this.setState(n)}},{key:"tnData",value:function(e){var t=this,n=this.tinode.getTopic(e.topic);n.msgStatus(e)>=h.a.MESSAGE_STATUS_SENT&&(clearTimeout(this.receivedTimer),this.receivedTimer=setTimeout(function(){t.receivedTimer=void 0,n.noteRecv(e.seq)},500))}},{key:"tnInitFind",value:function(){var e=this,t=this.tinode.getFndTopic();t.isSubscribed()?this.tnFndSubsUpdated():(t.onSubsUpdated=this.tnFndSubsUpdated,t.subscribe(t.startMetaQuery().withSub().withTags().build()).catch(function(t){e.handleError(t.message,"err")}))}},{key:"tnFndSubsUpdated",value:function(){var e=[];this.tinode.getFndTopic().contacts(function(t){e.push(t)}),this.setState({searchResults:e,searchableContacts:t.prepareSearchableContacts(this.state.chatList,e)})}},{key:"handleSearchContacts",value:function(e){var t=this,n=this.tinode.getFndTopic();n.setMeta({desc:{public:e}}).then(function(e){return n.getMeta(n.startMetaQuery().withSub().build())}).catch(function(e){t.handleError(e.message,"err")})}},{key:"handleTopicSelected",value:function(e,t,n,a){e?(this.setState({errorText:"",errorLevel:null,mobilePanel:"topic-view",showInfoPanel:!1}),this.state.topicSelected!=e&&(this.setState({topicSelectedOnline:n,topicSelectedAcs:a}),So.navigateTo(So.setUrlTopic("",e)))):(this.setState({errorText:"",errorLevel:null,mobilePanel:"sidepanel",topicSelectedOnline:!1,topicSelectedAcs:null,showInfoPanel:!1}),this.state.topicSelected&&So.navigateTo(So.setUrlTopic("",null)))}},{key:"handleHideMessagesView",value:function(){this.setState({mobilePanel:"sidepanel"}),So.navigateTo(So.setUrlTopic(window.location.hash,null))}},{key:"handleSendMessage",value:function(e,t,n){var a=this,o=this.tinode.getTopic(this.state.topicSelected);(e=o.createMessage(e,!1))._uploader=n,o.isSubscribed()||(t||(t=Promise.resolve()),t=t.then(function(){return o.subscribe()})),t&&(t=t.catch(function(e){a.handleError(e.message,"err")})),o.publishDraft(e,t).catch(function(e){a.handleError(e.message,"err")})}},{key:"handleNewAccount",value:function(){So.navigateTo(So.setUrlSidePanel(window.location.hash,"register"))}},{key:"handleNewAccountRequest",value:function(e,t,n,a,o){var r=this;this.tinode.connect(this.state.serverAddress).then(function(){return r.tinode.createAccountBasic(e,t,{public:n,tags:o,cred:h.a.credential(a)})}).then(function(e){e.code>=300&&"validate credentials"==e.text?r.handleCredentialsRequest(e.params):r.handleLoginSuccessful(r)}).catch(function(e){r.handleError(e.message,"err")})}},{key:"handleUpdateAccountRequest",value:function(e,t,n){var a=this;(t||n)&&this.tinode.getMeTopic().setMeta({desc:{public:t,defacs:n}}).catch(function(e){a.handleError(e.message,"err")}),e&&this.tinode.updateAccountBasic(null,this.tinode.getCurrentLogin(),e).catch(function(e){a.handleError(e.message,"err")})}},{key:"handleUpdateAccountTagsRequest",value:function(e){var t=this;this.tinode.getFndTopic().setMeta({tags:e}).catch(function(e){t.handleError(e.message,"err")})}},{key:"handleSettings",value:function(){So.navigateTo(So.setUrlSidePanel(window.location.hash,this.state.myUserId?"edit":"settings"))}},{key:"handleGlobalSettings",value:function(e){var n=e.serverAddress||this.state.serverAddress,a=e.transport||this.state.transport;this.tinode&&(this.tinode.onDisconnect=void 0,this.tinode.disconnect()),this.tinode=t.tnSetup(n,a),this.tinode.onConnect=this.handleConnected,this.tinode.onDisconnect=this.handleDisconnect,this.setState({serverAddress:n,transport:a}),Da.setObject("settings",{serverAddress:n,transport:a}),So.navigateTo(So.setUrlSidePanel(window.location.hash,""))}},{key:"initDesktopAlerts",value:function(){var e=this;this.fbPush.onTokenRefresh(function(){e.requestPushToken(!0)}),this.fbPush.onMessage(function(e){})}},{key:"togglePushToken",value:function(e){var t=this;e?this.state.firebaseToken?(this.setState({desktopAlerts:!0}),Da.updateObject("settings",{desktopAlerts:!0})):this.fbPush.requestPermission().then(function(){t.requestPushToken(!0)}).catch(function(e){t.handleError(e.message,"err"),t.setState({desktopAlerts:!1,firebaseToken:null}),Da.updateObject("settings",{desktopAlerts:!1}),console.log("Failed to get permission to notify.",e)}):this.state.firebaseToken?this.fbPush.deleteToken(this.state.firebaseToken).catch(function(e){console.log("Unable to delete token.",e)}).finally(function(){Da.updateObject("settings",{desktopAlerts:!1}),localStorage.removeItem("firebase-token"),t.setState({desktopAlerts:!1,firebaseToken:null})}):(this.setState({desktopAlerts:!1,firebaseToken:null}),Da.updateObject("settings",{desktopAlerts:!1}))}},{key:"requestPushToken",value:function(e){var t=this;this.fbPush.getToken().then(function(n){n!=t.state.firebaseToken&&(t.tinode.setDeviceToken(n,e),Da.setObject("firebase-token",n)),t.setState({firebaseToken:n,desktopAlerts:!0}),Da.updateObject("settings",{desktopAlerts:!0})}).catch(function(e){t.handleError(e.message,"err"),console.log("Failed to retrieve firebase token",e)})}},{key:"handleToggleMessageSounds",value:function(e){this.setState({messageSounds:e}),Da.updateObject("settings",{messageSoundsOff:!e})}},{key:"handleSidepanelCancel",value:function(){var e=So.parseUrlHash(window.location.hash);e.path[0]=this.state.myUserId?"contacts":"",e.params&&(delete e.params.code,delete e.params.method,delete e.params.tab),So.navigateTo(So.composeUrlHash(e.path,e.params)),this.setState({errorText:"",errorLevel:null})}},{key:"handleNewTopic",value:function(){So.navigateTo(So.setUrlSidePanel(window.location.hash,"newtpk"))}},{key:"handleNewTopicRequest",value:function(e,t,n,a){var o=this,r=e||this.tinode.newGroupTopicName();e?this.handleTopicSelected(r):this.setState({newGroupTopicParams:{desc:{public:t,private:{comment:n}},tags:a}},function(){o.handleTopicSelected(r)})}},{key:"handleNewTopicCreated",value:function(e,t){this.state.topicSelected==e&&e!=t&&this.setState({topicSelected:t},function(){So.navigateTo(So.setUrlTopic("",t))})}},{key:"handleTopicUpdateRequest",value:function(e,t,n,a){var o=this,r=this.tinode.getTopic(e);if(r){var i={};t&&(i.public=t),n&&(i.private=n===h.a.DEL_CHAR?h.a.DEL_CHAR:{comment:n}),a&&(i.defacs=a),r.setMeta({desc:i}).catch(function(e){o.handleError(e.message,"err")})}}},{key:"handleChangePermissions",value:function(e,t,n){var a=this,o=this.tinode.getTopic(e);if(o){var r=o.getAccessMode();n?(r.updateGiven(t),t=r.getGiven()):(r.updateWant(t),t=r.getWant()),o.setMeta({sub:{user:n,mode:t}}).catch(function(e){a.handleError(e.message,"err")})}}},{key:"handleTagsUpdated",value:function(e,t){var n=this,a=this.tinode.getTopic(e);if(a){a.setMeta({tags:t}).catch(function(e){n.handleError(e.message,"err")})}}},{key:"handleLogout",value:function(){Ot(0),localStorage.removeItem("auth-token"),this.tinode&&(this.tinode.onDisconnect=void 0,this.tinode.disconnect()),this.setState(this.getBlankState()),this.tinode=t.tnSetup(this.state.serverAddress,this.state.transport),this.tinode.onConnect=this.handleConnected,this.tinode.onDisconnect=this.handleDisconnect,So.navigateTo("")}},{key:"handleLeaveUnsubRequest",value:function(e){var t=this,n=this.tinode.getTopic(e);n&&n.leave(!0).then(function(e){So.navigateTo(So.setUrlTopic(window.location.hash,""))}).catch(function(e){t.handleError(e.message,"err")})}},{key:"handleDialogCancel",value:function(){this.setState({dialogSelected:null})}},{key:"handleShowContextMenu",value:function(e,t){this.setState({contextMenuVisible:!0,contextMenuClickAt:{x:e.x,y:e.y},contextMenuParams:e,contextMenuItems:t||this.defaultTopicContextMenu(e.topicName),contextMenuBounds:i.a.findDOMNode(this).getBoundingClientRect()})}},{key:"defaultTopicContextMenu",value:function(e){var t=this.tinode.getTopic(e),n=this.props.intl.formatMessage,a=!1,o=!1,r=!1,i=!1;if(t&&t.isSubscribed()){r=!0;var s=t.getAccessMode();a=s&&s.isMuted(),o=s&&!s.isJoiner(),i=s&&s.isDeleter()}return[r?{title:n({id:"menu_item_info"}),handler:this.handleShowInfoView}:null,r?"messages_clear":null,r&&i?"messages_clear_hard":null,r?a?"topic_unmute":"topic_mute":null,r?o?"topic_unblock":"topic_block":null,"topic_delete"]}},{key:"handleHideContextMenu",value:function(){this.setState({contextMenuVisible:!1,contextMenuClickAt:null,contextMenuParams:null,contextMenuBounds:null})}},{key:"handleShowInfoView",value:function(){So.navigateTo(So.addUrlParam(window.location.hash,"info",!0)),this.setState({showInfoPanel:!0})}},{key:"handleHideInfoView",value:function(){So.navigateTo(So.removeUrlParam(window.location.hash,"info")),this.setState({showInfoPanel:!1})}},{key:"handleMemberUpdateRequest",value:function(e,t,n){var a=this;if(e){var o=this.tinode.getTopic(e);o&&(t&&t.length>0&&t.map(function(e){o.invite(e,null).catch(function(e){a.handleError(e.message,"err")})}),n&&n.length>0&&n.map(function(e){o.delSubscription(e).catch(function(e){a.handleError(e.message,"err")})}))}}},{key:"handleValidateCredentialsRequest",value:function(e,t){this.setState({credMethod:e,credCode:t}),this.doLogin(null,null,{meth:e,resp:t})}},{key:"handlePasswordResetRequest",value:function(e,t){var n=this;this.tinode.connect().then(function(){return n.tinode.requestResetAuthSecret("basic",e,t)}).catch(function(e){n.handleError(e.message,"err")})}},{key:"handleResetPassword",value:function(e,t,n){var a=this;(n=base64ReEncode(n))?this.tinode.connect().then(function(){return a.tinode.updateAccountBasic(null,null,t,{token:n})}).catch(function(e){a.handleError(e.message,"err")}):this.handleError("Invalid security token","err")}},{key:"render",value:function(){return o.a.createElement("div",{id:"app-container"},this.state.contextMenuVisible?o.a.createElement(T,{tinode:this.tinode,bounds:this.state.contextMenuBounds,clickAt:this.state.contextMenuClickAt,params:this.state.contextMenuParams,items:this.state.contextMenuItems,hide:this.handleHideContextMenu,onAction:this.handleContextMenuAction,onError:this.handleError}):null,o.a.createElement(lr,{tinode:this.tinode,connected:this.state.connected,displayMobile:this.state.displayMobile,hideSelf:this.state.displayMobile&&"sidepanel"!==this.state.mobilePanel,state:this.state.sidePanelSelected,title:this.state.sidePanelTitle,avatar:this.state.sidePanelAvatar,login:this.state.login,myUserId:this.state.myUserId,loginDisabled:this.state.loginDisabled,errorText:this.state.errorText,errorLevel:this.state.errorLevel,topicSelected:this.state.topicSelected,chatList:this.state.chatList,credMethod:this.state.credMethod,credCode:this.state.credCode,transport:this.state.transport,messageSounds:this.state.messageSounds,desktopAlerts:this.state.desktopAlerts,desktopAlertsEnabled:this.state.desktopAlertsEnabled,serverAddress:this.state.serverAddress,onGlobalSettings:this.handleGlobalSettings,onSignUp:this.handleNewAccount,onSettings:this.handleSettings,onLoginRequest:this.handleLoginRequest,onCreateAccount:this.handleNewAccountRequest,onUpdateAccount:this.handleUpdateAccountRequest,onUpdateAccountTags:this.handleUpdateAccountTagsRequest,onTogglePushNotifications:this.togglePushToken,onToggleMessageSounds:this.handleToggleMessageSounds,onTopicSelected:this.handleTopicSelected,onCreateTopic:this.handleNewTopicRequest,onNewTopic:this.handleNewTopic,onLogout:this.handleLogout,onCancel:this.handleSidepanelCancel,onError:this.handleError,onValidateCredentials:this.handleValidateCredentialsRequest,onPasswordResetRequest:this.handlePasswordResetRequest,onResetPassword:this.handleResetPassword,onInitFind:this.tnInitFind,searchResults:this.state.searchResults,onSearchContacts:this.handleSearchContacts,showContextMenu:this.handleShowContextMenu}),o.a.createElement(sa,{tinode:this.tinode,connected:this.state.connected,online:this.state.topicSelectedOnline,acs:this.state.topicSelectedAcs,displayMobile:this.state.displayMobile,viewportWidth:this.state.viewportWidth,hideSelf:this.state.displayMobile&&("topic-view"!==this.state.mobilePanel||this.state.showInfoPanel),topic:this.state.topicSelected,myUserId:this.state.myUserId,serverVersion:this.state.serverVersion,serverAddress:this.state.serverAddress,errorText:this.state.errorText,errorLevel:this.state.errorLevel,newGroupTopicParams:this.state.newGroupTopicParams,onHideMessagesView:this.handleHideMessagesView,onData:this.tnData,onError:this.handleError,onNewTopicCreated:this.handleNewTopicCreated,readTimerHandler:this.handleReadTimer,showContextMenu:this.handleShowContextMenu,sendMessage:this.handleSendMessage}),this.state.showInfoPanel?o.a.createElement(Wt,{tinode:this.tinode,connected:this.state.connected,displayMobile:this.state.displayMobile,topic:this.state.topicSelected,searchableContacts:this.state.searchableContacts,myUserId:this.state.myUserId,errorText:this.state.errorText,errorLevel:this.state.errorLevel,onTopicDescUpdate:this.handleTopicUpdateRequest,onCancel:this.handleHideInfoView,onChangePermissions:this.handleChangePermissions,onMemberUpdateRequest:this.handleMemberUpdateRequest,onLeaveTopic:this.handleLeaveUnsubRequest,onAddMember:this.handleManageGroupMembers,onTopicTagsUpdate:this.handleTagsUpdated,onInitFind:this.tnInitFind,onError:this.handleError,showContextMenu:this.handleShowContextMenu}):null)}}])&&hr(n.prototype,a),r&&hr(n,r),t}(),_r=Object(s.injectIntl)(yr);Object(s.addLocaleData)(c.a);var wr=So.parseUrlHash(window.location.hash).params,Sr=wr&&wr.hl||navigator.languages&&navigator.languages[0]||navigator.language||navigator.userLanguage,Er=Sr.toLowerCase().split(/[-_]+/)[0],kr=u[Sr]||u[Er]||u.en;i.a.render(o.a.createElement(s.IntlProvider,{locale:Sr,messages:kr,textComponent:o.a.Fragment},o.a.createElement(_r,null)),document.getElementById("mountPoint"))}]); \ No newline at end of file