diff --git a/css/base.css b/css/base.css
index 0ee3c1d0..d3902d78 100644
--- a/css/base.css
+++ b/css/base.css
@@ -42,7 +42,7 @@ a.gray:focus {
color: #999;
}
-a.flat-button {
+.flat-button {
display: flex;
align-items: center;
margin: 0.15rem 0.35rem;
@@ -55,11 +55,21 @@ a.flat-button {
white-space: nowrap;
text-transform: uppercase;
}
-a.flat-button:hover,
-a.flat-button:focus {
+.flat-button:hover,
+.flat-button:focus {
text-decoration: none;
}
+.flat-button .faux {
+ height: 1.5em;
+ line-height: 1.5em;
+ text-transform: none;
+ padding-left: .5rem;
+ padding-right: .5rem;
+ border: 1px solid gray;
+ border-radius: 3px;
+}
+
form {
font-size: 1.1rem;
padding: 0.5rem 0.75rem;
@@ -2066,3 +2076,14 @@ ul.tabbar li.active > a:after {
background-color: #1e88e5;
border-radius: 0.08rem;
}
+
+/* Highlighted text */
+.highlight {
+ color: teal;
+ font-weight: bolder;
+}
+
+.highlight .preview {
+ color: #5f9ea0;
+ font-weight: inherit;
+}
diff --git a/css/base.min.css b/css/base.min.css
index ed3832d1..059f9069 100644
--- a/css/base.min.css
+++ b/css/base.min.css
@@ -1 +1 @@
-*{box-sizing:border-box;padding:0;margin:0;font-family:Roboto,Arial,sans-serif;text-rendering:optimizeLegibility}body,html{height:100%;width:100%;font-size:10pt;color:#666;overflow:hidden;background-color:silver;box-shadow:inset 0 10rem #3949ab}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.gray:focus,a.gray:hover{color:#999}a.flat-button{display:flex;align-items:center;margin:.15rem .35rem;height:2em;line-height:2em;font-weight:400;text-align:center;vertical-align:middle;touch-action:manipulation;white-space:nowrap;text-transform:uppercase}a.flat-button:focus,a.flat-button:hover{text-decoration:none}form{padding:.5rem .75rem;line-height:1.5}form,label{font-size:1.1rem}label{margin-right:auto}label.small{color:#1e88e5;font-size:.95rem}img.avatar{width:100%;height:100%;border-radius:50%}button{display:inline-block;font-family:inherit;font-size:1.05rem;height:2.2rem;line-height:2.2rem;font-weight:400;text-align:center;vertical-align:middle;touch-action:manipulation;cursor:pointer;border:1px solid transparent;white-space:nowrap;padding-left:1.2rem;padding-right:1.2rem;border-radius:4px;box-shadow:0 2px 3px 0 rgba(0,0,0,.25);text-transform:uppercase;min-width:5rem;margin:0 .35rem}button[disabled],html input[disabled]{cursor:default;opacity:.65;box-shadow:none}button.round{border-radius:50%;width:3rem;height:3rem;padding:0;margin:0;line-height:3.5rem;outline:none;box-shadow:0 2px .5rem 0 rgba(0,0,0,.25);z-index:2}button.round.small{width:2rem;height:2rem;line-height:2rem;box-shadow:0 2px .35rem 0 rgba(0,0,0,.25)}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:active,button.blue:focus,button.blue:hover{background-color:#1976d2}button.blue{background-color:#1e88e5;color:#fff}button.blue:active,button.blue:focus,button.blue:hover{background-color:#2962ff}button.white{background-color:#fff;color:#2196f3}button.blue:active,button.white:focus,button.white:hover{background-color:#e3f2fd}button.outline{background-color:transparent;color:#2196f3;border:1px solid silver;box-shadow:none}button.outline:active,button.outline:focus,button.outline:hover{background-color:#e8eaf6}input,textarea{font-family:inherit;font-size:1.1rem;background:transparent;border:none;margin:.25rem 0;padding:0 .125rem;outline:none;color:#666}input[type=email],input[type=password],input[type=search],input[type=text],textarea{height:2.5rem;border-bottom:1px solid #ccc;box-shadow:0 1px 0 rgba(0,0,0,.1);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].invalid,input[type=password].invalid,input[type=search].invalid,input[type=text].invalid,textarea.invalid{border-bottom:1px solid #e57373;box-shadow:0 1px 0 rgba(229,115,115,.25)}input[type=email]::placeholder,input[type=password]::placeholder,input[type=search]::placeholder,input[type=text]::placeholder,textarea::placeholder{color:#bbb;font-weight:lighter}input[type=password].with-visibility,input[type=text].with-visibility{margin-right:-2rem;padding-right:2rem}textarea{resize:none;padding-top:.45rem}::-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)}*{scrollbar-width:thin;scrollbar-color:silver}ul.menu{position:absolute;list-style:none;width:12rem;border-radius:.2rem;padding-top:.35rem;padding-bottom:.35rem;box-shadow:0 1px 6px rgba(0,0,0,.45);background-color:#fff;z-index:4}ul.menu>li{padding:.75rem .75rem .75rem 1.25rem}ul.menu>li:hover{background-color:#f5f5f5}ul.menu>li.separator{padding:0;margin:2px;height:1px;background-color:#ccc}ul.menu>li.separator:hover{background-color:#ccc}li .menuTrigger{position:absolute;top:.25rem;right:.25rem;width:1.5rem;height:1.2rem;line-height:1.2rem;border-radius:.6rem;text-align:center;opacity:0}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%)}div.alert-container{display:flex;justify-content:center;align-items:center;width:100%;height:100%;position:absolute;-x-backdrop-filter:blur(4px);background:rgba(0,0,0,.33);z-index:3}div.alert{background-color:#fff;box-shadow:0 1px 6px rgba(0,0,0,.45);padding:1rem;border-radius:4px;margin:auto 2rem;width:content;min-width:16rem;max-width:24rem}div.alert .title{color:#2196f3;font-size:1.2rem;font-weight:500;width:100%;padding:0 0 .35rem}div.alert .content{padding:.5rem 0}.blue{color:#2196f3}.red{color:#d32f2f}.amber{color:#ffc107}.gray{color:#757575}.light-gray{color:#bbb}.large{font-size:120%}.small{font-size:90%}.float-right{margin-left:auto;float:right}.hr{display:block;width:100%;height:.45rem;min-height:.3rem;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)}.hr.thin{height:.015rem}.group-focus{outline:none}#mountPoint{height:100%;padding-top:1rem;padding-bottom:3rem}#noscript-message{position:relative;display:flex;flex-direction:column;max-width:30rem;overflow:hidden;margin-top:5rem;margin-left:auto;margin-right:auto;border-radius:.25rem;box-shadow:1px 2px .3rem grey;background-color:#fff}#noscript-title{padding:1rem;font-size:120%;font-weight:bolder;background-color:#2196f3;color:#bbdefb}#noscript-content{padding:1rem}#app-container{position:relative;display:flex;height:100%;max-width:80rem;overflow:hidden;margin-left:auto;margin-right:auto;border-radius:.25rem;box-shadow:1px 2px .3rem grey;background-color:#fff}#sidepanel{flex-grow:0;flex-shrink:0.3;width:24rem;min-width:18rem}#sidepanel,#topic-view{position:relative;display:flex;flex-direction:column;height:100%}#topic-view{overflow-x:hidden;width:100%}#info-view{display:flex;flex-direction:column;flex-grow:0;flex-shrink:0.3;width:24rem;min-width:18rem;height:100%}@media (max-width:960px){#mountPoint{padding:0}}@media (max-width:640px){#app-container{width:100%;border-radius:0;box-shadow:none}#info-view,#sidepanel{width:100%}}.center-medium-text{width:100%;height:100%;display:flex;align-items:center;justify-content:center;text-align:center;font-size:1.4rem}.nodisplay{display:none!important}.quoted{margin-left:1rem}.rounded-container{position:relative;background-color:#fafafa;border-radius:.1rem;padding:.25rem;margin:.25rem}.in-place-edit{display:inline-block;font-family:inherit;font-size:1.1rem;height:2.5rem;line-height:2.25;margin:.25rem .125rem;width:100%;vertical-align:baseline;border-bottom:1px dashed #ddd;cursor:pointer}.in-place-edit.disabled{border-bottom:none;cursor:default}.in-place-edit.placeholder{color:#bbb}.in-place-edit .content{display:block;white-space:nowrap;text-overflow:ellipsis;overflow:hidden}table.permission-editor{width:100%}table.permission-editor td{margin:.35rem 0;font-size:1.1rem;vertical-align:middle}table.permission-editor td.checkbox{text-align:center;color:#999}.permission-editor .material-icons{font-size:1.1rem;line-height:1.1rem}.material-icons.clickable{cursor:pointer;border-bottom:none}.clickable{border-bottom:1px dashed #ddd}.clean-clickable,.clickable,.image-clickable{cursor:pointer}.panel-title{font-size:1.4rem;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.caption-panel{display:flex;align-items:center;flex:none;padding:.5rem;height:4rem;white-space:nowrap;box-shadow:0 1px 2px grey;overflow-x:hidden;z-index:1}.dialog-buttons{display:flex;padding:.5rem;justify-content:flex-end}.dialog-buttons button{margin:0 .5rem}.avatar-box{position:relative;flex-grow:0;flex-shrink:0}.bot-form{display:flex;flex-direction:column;overflow:hidden;min-width:8rem;line-height:2rem}.bot-form div{min-height:2rem;vertical-align:middle}.bot-form button{display:inline-block;margin:.15rem;background-color:#eef;color:#2196f3;font-size:inherit;text-transform:none;height:2rem;line-height:2rem}.bot-form>div>button{width:auto}.bot-form button:active,.bot-form button:focus,.bot-form button:hover{outline:0;background-color:#e3f2fd}#side-caption-panel{background-color:#2196f3;color:#bbdefb}#side-caption-panel a{color:#bbdefb;padding-left:.5rem;line-height:1}#side-caption-panel :hover{color:#fff}#sidepanel-title{margin-right:auto;margin-left:.5rem}#self-avatar{width:3rem;min-width:3rem;height:3rem;flex:none;border-radius:50%}#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{position:absolute;left:.6rem}.info-box{position:relative;display:none;overflow:hidden;padding:1rem 1.5rem 1rem .5rem}.info-box .cancel{position:absolute;right:.25rem;top:.5rem}.info-box.error{display:flex;background-color:#ffcdd2;border-bottom:1px solid #ffbfc8;color:#b71c1c}.info-box.warning{display:flex;background-color:#fff9c4;border-bottom:1px solid #fff59d;color:#6d4c41}.info-box.info{display:flex;background-color:#e1f5fe;border-bottom:1px solid #b3e5fc;color:#0288d1}.info-box .cancel .material-icons{font-size:1rem;color:#757575}.info-box.error .cancel .material-icons{color:#b71c1c}.info-box .icon{display:block;margin-right:.5rem}.info-box .icon .material-icons{font-size:1.5rem}.info-box.warning .icon .material-icons{color:#fbc02d}.info-box.error .icon .material-icons{color:#ef5350}.info-box.info .icon .material-icons{color:#0288d1}.flex-column{display:flex;flex-direction:column;height:100%;overflow:hidden}.flex-column.narrow{height:auto}.scrollable-panel{overflow-y:auto;margin-top:.25rem;margin-bottom:auto;height:100%}.contact-box{list-style:none;overflow-x:hidden}.contact-box>li{display:flex;position:relative;padding:.35rem .25rem .5rem .35rem;min-height:3.5rem;flex-grow:0;flex-shrink:0;background:linear-gradient(90deg,transparent 3.5rem,#eee 1px,#eee) 0 100%/100% 1px no-repeat,#fff;overflow-x:hidden}.contact-box>li:last-child{background:#fff}.contact-box>li:hover{background-color:#eceff1}.contact-box>li.selected{background-color:#cfd8dc}.contact-box>li.action{min-height:2.5rem;border-bottom:none}.contact-box .text-box{overflow-x:hidden}.contact-box .contact-title{font-size:1.05rem;text-overflow:ellipsis;overflow:hidden}.contact-box .contact-comment{text-overflow:ellipsis;overflow:hidden;white-space:nowrap;font-weight:lighter}.contact-box .avatar-box{margin-right:.35rem;position:relative;width:3rem;min-width:3rem;height:3rem;min-height:3rem;font-size:1.8rem;overflow:hidden;padding:0}.contact-box .avatar{width:3rem;height:3rem;border-radius:50%}.contact-box .avatar-box>.material-icons{display:flex;flex-direction:column;justify-content:space-around;font-size:2.4rem;line-height:3rem}.contact-box .text-box{display:flex;flex-direction:column;justify-content:space-around}.contact-box .action-text{text-align:center;font-size:.95rem;line-height:2.5rem;margin:0 auto;cursor:pointer}.contact-box img.channel{width:1rem;height:1rem;vertical-align:middle;margin-left:.3rem}.avatar-box .online,.offline{display:inline-block;width:.75rem;min-width:.75rem;height:.75rem;min-height:.75rem;flex-shrink:0;border-radius:50%;position:absolute;right:0;bottom:.1rem}.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{display:inline-block;width:1.5rem;height:1.5rem;font-size:1.5rem;line-height:1.5rem;color:#0097a7;position:absolute;right:.05rem;bottom:.05rem;background-color:#fff;overflow:visible;border:0 solid transparent}#add-topic{position:absolute;right:1rem;bottom:1rem}.panel-form{display:flex;flex-direction:column;padding:0}.panel-form-row{align-items:center}.panel-form-column,.panel-form-row{display:flex;padding:.5rem .75rem;line-height:1.5;flex-grow:0;flex-shrink:0}.panel-form-column{flex-direction:column}.panel-form-column>.panel-form-column,.panel-form-row>.panel-form-column{padding:0!important;flex-grow:1}.panel-form-column>.panel-form-row,.panel-form-row>.panel-form-row{padding:0!important}.avatar-upload{display:flex;position:relative;flex-direction:column;flex-shrink:0;width:7rem;height:9rem;margin-left:.5rem;font-size:4.5rem;padding:0}.avatar-upload.read-only{height:auto}.avatar-upload .clear-avatar{position:absolute;font-size:1rem;top:0;right:0;opacity:0;background-image:radial-gradient(#fff 40%,transparent 75%)}.avatar-upload:hover .clear-avatar{opacity:1}.avatar-upload .avatar-box{position:relative;width:7rem;height:7rem}.avatar-upload .avatar-box>.material-icons{position:relative;font-size:4rem;line-height:7rem;vertical-align:middle}.avatar-upload:after{content:".";display:block;height:0;clear:both;visibility:hidden}.avatar-upload .blank{text-align:center;vertical-align:middle;border:1px dashed #999;font-size:1rem;flex-shrink:0;width:7rem;height:7rem;overflow:hidden;color:#999;line-height:7rem;border-radius:50%}.avatar-upload .preview{width:7rem;height:7rem;overflow:hidden;border-radius:50%}.avatar-upload .inputfile.hidden{width:.1px;height:.1px;opacity:0;overflow:hidden;position:absolute}.avatar-upload .inputfile+label.round{display:flex;align-items:center;justify-content:center;cursor:pointer;width:3rem;height:3rem;line-height:3rem;border-radius:50%;box-shadow:0 1px 4px rgba(0,0,0,.4);margin-left:auto;margin-right:auto;margin-top:-1rem;bottom:0;background-color:#fafafa}.avatar-upload .inputfile:focus+label.round{outline:none}.avatar-upload .inputfile+label:hover,.avatar-upload .inputfile:focus+label{background-color:#e3f2fd;color:#42a5f5}#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{position:relative;width:3rem;min-width:3rem;height:3rem;font-size:1.8rem;margin-right:.35rem}#topic-caption-panel .avatar-box>.material-icons{font-size:2.4rem;line-height:3rem}#topic-title-group{overflow-x:hidden}#hide-message-view{display:block;margin-right:.35rem}#topic-users{margin-left:auto;margin-right:1rem}#topic-users .avatar-box{display:inline-block;width:1.8rem;min-width:1.8rem;height:1.8rem;min-height:1.8rem;font-size:1rem;margin-right:.2rem}#topic-users .avatar-box>.material-icons{font-size:1.4rem;line-height:1.8rem}#topic-users>span{line-height:2rem;vertical-align:top}#messages-panel{position:relative;padding:.75rem;overflow-y:scroll;background-color:#eceff1;height:100%;background-image:url(../img/bg_messages.png)}#messages-container{position:relative;overflow-y:hidden;height:100%}#write-only-background{position:absolute;top:0;left:0;height:100%;width:100%;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)}#write-only-note{top:50%;transform:translate(-50%,-50%);height:auto;width:auto}#peer-messaging-disabled-note,#write-only-note{position:absolute;left:50%;background-color:#fff;color:#666;line-height:2rem;text-align:center;padding:.75rem 1.25rem;border-radius:.5rem;box-shadow:0 1px .5px rgba(0,0,0,.12)}#peer-messaging-disabled-note{bottom:4.3rem;transform:translate(-50%);width:fit-content}#send-message-panel{display:flex;align-items:center;flex:none;padding:.4rem .4rem .4rem .6rem;background-color:#eceff1;box-shadow:0 -2px 3px -1px rgba(0,0,0,.1);z-index:2;height:4rem}#send-message-panel #writing-disabled{width:100%;text-align:center;font-size:1.2rem}#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}.accept-invite-panel{background-color:#eceff1;box-shadow:0 -2px 3px -1px rgba(0,0,0,.1);width:100%;z-index:1}.accept-invite-panel .title{font-size:1.2rem;padding:.75rem}.accept-invite-panel .footer{background-color:#fafafa;white-space:nowrap;padding-bottom:.35rem;text-align:center}.accept-invite-panel button{font-size:1rem;height:2em;line-height:2em;border:1px solid transparent;margin:.25rem;box-shadow:0 1px 2px 0 rgba(0,0,0,.25)}#dummy-view{width:100%;height:100%;display:flex;align-items:center;justify-content:center;background-color:#e0f7fa}#dummy-view a{text-decoration:none;display:block;text-align:center;vertical-align:middle}#image-preview{position:absolute;display:flex;flex-direction:column;top:0;left:0;width:100%;height:100%;z-index:2;background-color:hsla(0,0%,100%,.9)}#image-preview-caption-panel{display:flex;justify-content:space-between;background-color:#eceff1;box-shadow:0 1px 2px silver;line-height:2.5rem;height:4.6rem;padding:1rem .75rem 0;z-index:3}#image-preview-caption-panel a{color:#757575;text-decoration:none}#image-preview-caption-panel a:hover{color:#000}#image-preview-container{display:flex;justify-content:space-around;align-items:center;overflow:hidden;width:100%;height:100%}#image-preview-footer{display:flex;justify-content:space-around;height:3.2rem;line-height:1.5rem;background-color:#eceff1;box-shadow:0 -2px 3px -1px rgba(0,0,0,.1)}#image-preview-container .material-icons{font-size:6rem}.chat-box{list-style:none;padding:0 0 3.5rem;margin:0 .5rem}.chat-box.group{margin-left:-.4rem}.chat-box li{display:flex;margin:0;padding:0;align-items:flex-end}.chat-box .right{justify-content:flex-end}.chat-box .center{justify-content:center;margin-top:.5rem;margin-bottom:.5rem}.chat-box .bubble{display:flex;position:relative;max-width:40rem;min-width:9rem;height:auto;padding:.75rem .5rem .75rem 1.25rem;margin:0;text-align:left;border-radius:.5rem;box-shadow:0 1px .5px rgba(0,0,0,.12)}.chat-box li.single{margin-top:.25rem;margin-bottom:.75rem}.chat-box li.first{margin-top:.25rem;margin-bottom:.15rem}.chat-box li.middle{margin-top:.15rem;margin-bottom:.15rem}.chat-box li.last{margin-top:.15rem;margin-bottom:.75rem}.chat-box .left .bubble{background-color:#c5e1a5}.chat-box .right .bubble{background-color:#fafafa}.chat-box .center .bubble{background-color:#e3f2fd;padding:.75rem .75rem .5rem}.chat-box .left .tip:before{content:"";position:absolute;width:0;height:0;right:auto;left:-.8rem;top:auto;bottom:0;color:#c5e1a5;border-color:transparent #c5e1a5 #c5e1a5 transparent;border-style:solid;border-width:.62rem;box-shadow:0 1.6px .5px -.8px rgba(0,0,0,.12)}.chat-box .right .tip:before{content:"";position:absolute;display:flex;justify-content:space-between;width:0;height:0;left:auto;right:-.8rem;top:auto;bottom:0;color:#fafafa;border-color:transparent transparent #fafafa #fafafa;border-style:solid;border-width:.62rem;box-shadow:0 1.6px .5px -.8px rgba(0,0,0,.12)}.chat-box .avatar-box{position:relative;width:1.4rem;min-width:1.4rem;height:1.4rem;min-height:1.4rem;font-size:.8rem;margin-bottom:.8rem;margin-right:.8rem}.chat-box .bubble div.message-content{color:#212121;margin:0;max-width:36rem;overflow-wrap:break-word}.chat-box .bubble div.message-content:after{content:".";display:block;height:0;clear:both;visibility:hidden}.chat-box .timestamp{display:inline-block;position:relative;font-size:80%;color:#777;padding-left:1rem;top:.5rem;float:right;white-space:nowrap}.chat-box .typing{display:inline-block;border-radius:.5rem;width:2rem;padding:.25rem .35rem;vertical-align:middle;text-align:center;color:#aaa;margin-top:.75rem}.chat-box .author{font-size:80%;color:#777}.image-preview,.inline-image{position:relative;overflow:hidden;border-radius:.1rem;display:block}.inline-image{max-width:36rem;max-height:24rem}.inline-image>.rounded-container{position:relative;margin:.25rem auto;bottom:2rem;border-left:.25rem solid transparent;border-right:.25rem solid transparent}img.image-preview:before,img.inline-image:before{font-size:.9rem;font-weight:lighter;color:#666;display:flex;position:absolute;top:0;left:0;width:100%;height:100%;justify-content:center;background:50% no-repeat #ccc url(../img/broken_image.png)}img.inline-image:before{content:attr(alt);background-size:2rem 2rem}img.image-preview:before{content:" ";background-size:8rem 8rem}.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{position:relative;display:flex;flex-direction:column;height:100%;overflow-y:hidden}#group-manager-buttons{display:flex;background-color:#eceff1;box-shadow:0 -1px rgba(0,0,0,.1);z-index:2;justify-content:space-around;padding:.4rem;height:4rem;border-left:1px solid #ccc}ul.tabbar{flex-shrink:0;flex-grow:0;background:#eee;list-style:none;margin:0;width:100%;overflow:hidden;padding:0 0 0 1rem}ul.tabbar>li{float:left}ul.tabbar>li>a{position:relative;padding-top:.75rem;padding-left:1rem;padding-right:1rem;display:block;text-align:center;line-height:2rem;font-weight:400;font-size:1.3rem;font-variant:small-caps;text-decoration:none;color:rgba(33,150,243,.6);overflow:hidden;box-shadow:inset 0 -2px 2.5px -1px rgba(0,0,0,.25)}ul.tabbar li.active>a{color:#2196f3}ul.tabbar li.active>a:after{height:.15rem;display:block;content:"";bottom:0;left:0;position:absolute;background:#2196f3;animation:tabbar-border-expand .2s cubic-bezier(.4,0,.4,1) 0s alternate forwards}@keyframes tabbar-border-expand{0%{opacity:0;width:0}to{opacity:1;width:100%}}.unread{display:inline-block;font-size:.75rem;font-weight:bolder;background-color:#0097a7;color:#fff;border-radius:50%;width:1.35rem;height:1.35rem;margin-left:.5rem;line-height:1.35rem;text-align:center;vertical-align:middle}.material-icons.as-badge{padding-left:.2rem;font-size:1.25rem;color:#bbb}.badge{font-family:Roboto Mono,Courier,monospace,sans-serif;font-size:.8rem;border:1px solid silver;background-color:#e8e8e8;color:#666;padding:.05rem .25rem;margin:.05rem .1rem;border-radius:.2rem;display:inline-block;align-self:flex-start}.badge.green{border-color:#9c9;background-color:#efe;color:#383}.badge.yellow{border-color:#cc9;background-color:#ffe;color:#660}.badge.blue{border-color:#99c;background-color:#eef;color:#339}.badge.red{border-color:#c99;background-color:#fee;color:#933}.badge.magenta{border-color:#c9c;background-color:#fef;color:#939}.lettertile{width:100%;padding-bottom:100%;border-radius:50%}.lettertile>div{display:flex;flex-shrink:0;flex-grow:0;position:absolute;top:0;bottom:0;left:0;right:0;text-transform:uppercase;align-items:center;justify-content:center;text-align:center;border-radius:50%;line-height:1;color:hsla(0,0%,98%,.8)}.lettertile:hover{color:#fff}.light-color0{background-color:#ef9a9a}.light-color1{background-color:#90caf9}.light-color2{background-color:#b0bec5}.light-color3{background-color:#b39ddb}.light-color4{background-color:#ffab91}.light-color5{background-color:#a5d6a7}.light-color6{background-color:#eee}.light-color7{background-color:#e6ee9c}.light-color8{background-color:#c5e1a5}.light-color9{background-color:#f0e57d}.light-color10{background-color:#f48fb1}.light-color11{background-color:#9fa8da}.light-color12{background-color:#ffe082}.light-color13{background-color:#bcaaa4}.light-color14{background-color:#80deea}.light-color15{background-color:#ce93d8}.dark-color0{background-color:#c62828}.dark-color1{background-color:#ad1457}.dark-color2{background-color:#6a1b9a}.dark-color3{background-color:#4527a0}.dark-color4{background-color:#283593}.dark-color5{background-color:#1565c0}.dark-color6{background-color:#0277bd}.dark-color7{background-color:#00838f}.dark-color8{background-color:#00695c}.dark-color9{background-color:#2e7d32}.dark-color10{background-color:#558b2f}.dark-color11{background-color:#9e9d24}.dark-color12{background-color:#f9a825}.dark-color13{background-color:#ff8f00}.dark-color14{background-color:#ef6c00}.dark-color15{background-color:#d84315}.material-icons{font-size:1.4rem;line-height:1;vertical-align:middle;text-align:center}.material-icons.small{font-size:1rem}.material-icons.big{font-size:2.4rem}#self-avatar .material-icons{font-size:2.4rem;line-height:3rem}.avatar-box .material-icons{color:hsla(0,0%,98%,.8);border-radius:50%;width:inherit;height:inherit}.chip-input{display:flex;flex-wrap:wrap;flex-grow:1;cursor:text;font-size:1.1rem;font-weight:400;background:transparent;border-bottom:1px solid #ccc;box-shadow:0 1px 0 rgba(0,0,0,.1);transition:all .1s ease-in-out;max-height:10rem;min-height:4rem;overflow-y:scroll;margin:.25rem 0;outline:none;color:#666;align-items:center;justify-content:flex-start;text-align:center}.chip-input.focused{border-bottom:1px solid #2196f3;box-shadow:0 1px 0 rgba(33,150,243,.25)}.chip-input>input[type=text]{display:inline-block;width:auto;border:none;line-height:1.8;box-shadow:none;min-width:4rem;flex:1 0 auto;height:1.8rem;margin:.125rem}.chip{display:flex;flex:0 0 auto;align-items:center;height:1.8rem;line-height:1.8;border-radius:.9rem;margin:.125rem;background-color:#eee;white-space:nowrap;font-size:90%}.chip.invalid{color:#c66;background-color:#fee}.chip>a{display:inline-block;color:#ccc;background-color:#aaa;border-radius:50%;margin:.3rem;width:1.175rem;height:1.175rem;line-height:1.15;text-decoration:none}.chip>a:focus,.chip>a:hover{text-decoration:none;color:#ddd;background-color:#bbb}.chip .avatar-box{position:relative;width:1.8rem;min-width:1.8rem;height:1.8rem;min-height:1.8rem;font-size:1rem;margin-right:.2rem}.chip .avatar-box .material-icons{font-size:1.4rem;line-height:1.8rem}.chip .spacer{display:inline-block;margin:.3rem;width:.25rem;height:1.175rem}.load-spinner-box{position:absolute;box-shadow:.1rem .1rem .15rem 1px rgba(0,0,0,.25);border-radius:50%;padding:.25rem;width:2.5rem;height:2.5rem;left:0;right:0;top:5rem;margin-left:auto;margin-right:auto;background-color:#fff;z-index:2}.loader-spinner{border-radius:50%;border:.35rem solid #f3f3f3;border-top-color:#1e88e5;width:2rem;height:2rem;animation:spin 1.5s linear infinite}@keyframes spin{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}.uploader{display:flex}.uploader>div{position:relative;height:.6rem;padding:.15rem;margin:.35rem;width:6rem;line-height:0;border-radius:.1rem;background-color:#cfd8dc}.uploader>div>span{display:inline-block;height:.3rem;background-color:#1e88e5;border-radius:.08rem}
\ No newline at end of file
+*{box-sizing:border-box;padding:0;margin:0;font-family:Roboto,Arial,sans-serif;text-rendering:optimizeLegibility}body,html{height:100%;width:100%;font-size:10pt;color:#666;overflow:hidden;background-color:silver;box-shadow:inset 0 10rem #3949ab}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.gray:focus,a.gray:hover{color:#999}.flat-button{display:flex;align-items:center;margin:.15rem .35rem;height:2em;line-height:2em;font-weight:400;text-align:center;vertical-align:middle;touch-action:manipulation;white-space:nowrap;text-transform:uppercase}.flat-button:focus,.flat-button:hover{text-decoration:none}.flat-button .faux{height:1.5em;line-height:1.5em;text-transform:none;padding-left:.5rem;padding-right:.5rem;border:1px solid grey;border-radius:3px}form{padding:.5rem .75rem;line-height:1.5}form,label{font-size:1.1rem}label{margin-right:auto}label.small{color:#1e88e5;font-size:.95rem}img.avatar{width:100%;height:100%;border-radius:50%}button{display:inline-block;font-family:inherit;font-size:1.05rem;height:2.2rem;line-height:2.2rem;font-weight:400;text-align:center;vertical-align:middle;touch-action:manipulation;cursor:pointer;border:1px solid transparent;white-space:nowrap;padding-left:1.2rem;padding-right:1.2rem;border-radius:4px;box-shadow:0 2px 3px 0 rgba(0,0,0,.25);text-transform:uppercase;min-width:5rem;margin:0 .35rem}button[disabled],html input[disabled]{cursor:default;opacity:.65;box-shadow:none}button.round{border-radius:50%;width:3rem;height:3rem;padding:0;margin:0;line-height:3.5rem;outline:none;box-shadow:0 2px .5rem 0 rgba(0,0,0,.25);z-index:2}button.round.small{width:2rem;height:2rem;line-height:2rem;box-shadow:0 2px .35rem 0 rgba(0,0,0,.25)}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:active,button.blue:focus,button.blue:hover{background-color:#1976d2}button.blue{background-color:#1e88e5;color:#fff}button.blue:active,button.blue:focus,button.blue:hover{background-color:#2962ff}button.white{background-color:#fff;color:#2196f3}button.blue:active,button.white:focus,button.white:hover{background-color:#e3f2fd}button.outline{background-color:transparent;color:#2196f3;border:1px solid silver;box-shadow:none}button.outline:active,button.outline:focus,button.outline:hover{background-color:#e8eaf6}input,textarea{font-family:inherit;font-size:1.1rem;background:transparent;border:none;margin:.25rem 0;padding:0 .125rem;outline:none;color:#666}input[type=email],input[type=password],input[type=search],input[type=text],textarea{height:2.5rem;border-bottom:1px solid #ccc;box-shadow:0 1px 0 rgba(0,0,0,.1);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].invalid,input[type=password].invalid,input[type=search].invalid,input[type=text].invalid,textarea.invalid{border-bottom:1px solid #e57373;box-shadow:0 1px 0 rgba(229,115,115,.25)}input[type=email]::placeholder,input[type=password]::placeholder,input[type=search]::placeholder,input[type=text]::placeholder,textarea::placeholder{color:#bbb;font-weight:lighter}input[type=password].with-visibility,input[type=text].with-visibility{margin-right:-2rem;padding-right:2rem}textarea{resize:none;padding-top:.45rem}::-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)}*{scrollbar-width:thin;scrollbar-color:silver}ul.menu{position:absolute;list-style:none;width:12rem;border-radius:.2rem;padding-top:.35rem;padding-bottom:.35rem;box-shadow:0 1px 6px rgba(0,0,0,.45);background-color:#fff;z-index:4}ul.menu>li{padding:.75rem .75rem .75rem 1.25rem}ul.menu>li:hover{background-color:#f5f5f5}ul.menu>li.separator{padding:0;margin:2px;height:1px;background-color:#ccc}ul.menu>li.separator:hover{background-color:#ccc}li .menuTrigger{position:absolute;top:.25rem;right:.25rem;width:1.5rem;height:1.2rem;line-height:1.2rem;border-radius:.6rem;text-align:center;opacity:0}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%)}div.alert-container{display:flex;justify-content:center;align-items:center;width:100%;height:100%;position:absolute;-x-backdrop-filter:blur(4px);background:rgba(0,0,0,.33);z-index:3}div.alert{background-color:#fff;box-shadow:0 1px 6px rgba(0,0,0,.45);padding:1rem;border-radius:4px;margin:auto 2rem;width:content;min-width:16rem;max-width:24rem}div.alert .title{color:#2196f3;font-size:1.2rem;font-weight:500;width:100%;padding:0 0 .35rem}div.alert .content{padding:.5rem 0}.blue{color:#2196f3}.red{color:#d32f2f}.amber{color:#ffc107}.gray{color:#757575}.light-gray{color:#bbb}.large{font-size:120%}.small{font-size:90%}.float-right{margin-left:auto;float:right}.hr{display:block;width:100%;height:.45rem;min-height:.3rem;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)}.hr.thin{height:.015rem}.group-focus{outline:none}#mountPoint{height:100%;padding-top:1rem;padding-bottom:3rem}#noscript-message{position:relative;display:flex;flex-direction:column;max-width:30rem;overflow:hidden;margin-top:5rem;margin-left:auto;margin-right:auto;border-radius:.25rem;box-shadow:1px 2px .3rem grey;background-color:#fff}#noscript-title{padding:1rem;font-size:120%;font-weight:bolder;background-color:#2196f3;color:#bbdefb}#noscript-content{padding:1rem}#app-container{position:relative;display:flex;height:100%;max-width:80rem;overflow:hidden;margin-left:auto;margin-right:auto;border-radius:.25rem;box-shadow:1px 2px .3rem grey;background-color:#fff}#sidepanel{flex-grow:0;flex-shrink:0.3;width:24rem;min-width:18rem}#sidepanel,#topic-view{position:relative;display:flex;flex-direction:column;height:100%}#topic-view{overflow-x:hidden;width:100%}#info-view{display:flex;flex-direction:column;flex-grow:0;flex-shrink:0.3;width:24rem;min-width:18rem;height:100%}@media (max-width:960px){#mountPoint{padding:0}}@media (max-width:640px){#app-container{width:100%;border-radius:0;box-shadow:none}#info-view,#sidepanel{width:100%}}.center-medium-text{width:100%;height:100%;display:flex;align-items:center;justify-content:center;text-align:center;font-size:1.4rem}.nodisplay{display:none!important}.quoted{margin-left:1rem}.rounded-container{position:relative;background-color:#fafafa;border-radius:.1rem;padding:.25rem;margin:.25rem}.in-place-edit{display:inline-block;font-family:inherit;font-size:1.1rem;height:2.5rem;line-height:2.25;margin:.25rem .125rem;width:100%;vertical-align:baseline;border-bottom:1px dashed #ddd;cursor:pointer}.in-place-edit.disabled{border-bottom:none;cursor:default}.in-place-edit.placeholder{color:#bbb}.in-place-edit .content{display:block;white-space:nowrap;text-overflow:ellipsis;overflow:hidden}table.permission-editor{width:100%}table.permission-editor td{margin:.35rem 0;font-size:1.1rem;vertical-align:middle}table.permission-editor td.checkbox{text-align:center;color:#999}.permission-editor .material-icons{font-size:1.1rem;line-height:1.1rem}.material-icons.clickable{cursor:pointer;border-bottom:none}.clickable{border-bottom:1px dashed #ddd}.clean-clickable,.clickable,.image-clickable{cursor:pointer}.panel-title{font-size:1.4rem;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.caption-panel{display:flex;align-items:center;flex:none;padding:.5rem;height:4rem;white-space:nowrap;box-shadow:0 1px 2px grey;overflow-x:hidden;z-index:1}.dialog-buttons{display:flex;padding:.5rem;justify-content:flex-end}.dialog-buttons button{margin:0 .5rem}.avatar-box{position:relative;flex-grow:0;flex-shrink:0}.bot-form{display:flex;flex-direction:column;overflow:hidden;min-width:8rem;line-height:2rem}.bot-form div{min-height:2rem;vertical-align:middle}.bot-form button{display:inline-block;margin:.15rem;background-color:#eef;color:#2196f3;font-size:inherit;text-transform:none;height:2rem;line-height:2rem}.bot-form>div>button{width:auto}.bot-form button:active,.bot-form button:focus,.bot-form button:hover{outline:0;background-color:#e3f2fd}#side-caption-panel{background-color:#2196f3;color:#bbdefb}#side-caption-panel a{color:#bbdefb;padding-left:.5rem;line-height:1}#side-caption-panel :hover{color:#fff}#sidepanel-title{margin-right:auto;margin-left:.5rem}#self-avatar{width:3rem;min-width:3rem;height:3rem;flex:none;border-radius:50%}#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{position:absolute;left:.6rem}.info-box{position:relative;display:none;overflow:hidden;padding:1rem 1.5rem 1rem .5rem}.info-box .cancel{position:absolute;right:.25rem;top:.5rem}.info-box.error{display:flex;background-color:#ffcdd2;border-bottom:1px solid #ffbfc8;color:#b71c1c}.info-box.warning{display:flex;background-color:#fff9c4;border-bottom:1px solid #fff59d;color:#6d4c41}.info-box.info{display:flex;background-color:#e1f5fe;border-bottom:1px solid #b3e5fc;color:#0288d1}.info-box .cancel .material-icons{font-size:1rem;color:#757575}.info-box.error .cancel .material-icons{color:#b71c1c}.info-box .icon{display:block;margin-right:.5rem}.info-box .icon .material-icons{font-size:1.5rem}.info-box.warning .icon .material-icons{color:#fbc02d}.info-box.error .icon .material-icons{color:#ef5350}.info-box.info .icon .material-icons{color:#0288d1}.flex-column{display:flex;flex-direction:column;height:100%;overflow:hidden}.flex-column.narrow{height:auto}.scrollable-panel{overflow-y:auto;margin-top:.25rem;margin-bottom:auto;height:100%}.contact-box{list-style:none;overflow-x:hidden}.contact-box>li{display:flex;position:relative;padding:.35rem .25rem .5rem .35rem;min-height:3.5rem;flex-grow:0;flex-shrink:0;background:linear-gradient(90deg,transparent 3.5rem,#eee 1px,#eee) 0 100%/100% 1px no-repeat,#fff;overflow-x:hidden}.contact-box>li:last-child{background:#fff}.contact-box>li:hover{background-color:#eceff1}.contact-box>li.selected{background-color:#cfd8dc}.contact-box>li.action{min-height:2.5rem;border-bottom:none}.contact-box .text-box{overflow-x:hidden}.contact-box .contact-title{font-size:1.05rem;text-overflow:ellipsis;overflow:hidden}.contact-box .contact-comment{text-overflow:ellipsis;overflow:hidden;white-space:nowrap;font-weight:lighter}.contact-box .avatar-box{margin-right:.35rem;position:relative;width:3rem;min-width:3rem;height:3rem;min-height:3rem;font-size:1.8rem;overflow:hidden;padding:0}.contact-box .avatar{width:3rem;height:3rem;border-radius:50%}.contact-box .avatar-box>.material-icons{display:flex;flex-direction:column;justify-content:space-around;font-size:2.4rem;line-height:3rem}.contact-box .text-box{display:flex;flex-direction:column;justify-content:space-around}.contact-box .action-text{text-align:center;font-size:.95rem;line-height:2.5rem;margin:0 auto;cursor:pointer}.contact-box img.channel{width:1rem;height:1rem;vertical-align:middle;margin-left:.3rem}.avatar-box .online,.offline{display:inline-block;width:.75rem;min-width:.75rem;height:.75rem;min-height:.75rem;flex-shrink:0;border-radius:50%;position:absolute;right:0;bottom:.1rem}.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{display:inline-block;width:1.5rem;height:1.5rem;font-size:1.5rem;line-height:1.5rem;color:#0097a7;position:absolute;right:.05rem;bottom:.05rem;background-color:#fff;overflow:visible;border:0 solid transparent}#add-topic{position:absolute;right:1rem;bottom:1rem}.panel-form{display:flex;flex-direction:column;padding:0}.panel-form-row{align-items:center}.panel-form-column,.panel-form-row{display:flex;padding:.5rem .75rem;line-height:1.5;flex-grow:0;flex-shrink:0}.panel-form-column{flex-direction:column}.panel-form-column>.panel-form-column,.panel-form-row>.panel-form-column{padding:0!important;flex-grow:1}.panel-form-column>.panel-form-row,.panel-form-row>.panel-form-row{padding:0!important}.avatar-upload{display:flex;position:relative;flex-direction:column;flex-shrink:0;width:7rem;height:9rem;margin-left:.5rem;font-size:4.5rem;padding:0}.avatar-upload.read-only{height:auto}.avatar-upload .clear-avatar{position:absolute;font-size:1rem;top:0;right:0;opacity:0;background-image:radial-gradient(#fff 40%,transparent 75%)}.avatar-upload:hover .clear-avatar{opacity:1}.avatar-upload .avatar-box{position:relative;width:7rem;height:7rem}.avatar-upload .avatar-box>.material-icons{position:relative;font-size:4rem;line-height:7rem;vertical-align:middle}.avatar-upload:after{content:".";display:block;height:0;clear:both;visibility:hidden}.avatar-upload .blank{text-align:center;vertical-align:middle;border:1px dashed #999;font-size:1rem;flex-shrink:0;width:7rem;height:7rem;overflow:hidden;color:#999;line-height:7rem;border-radius:50%}.avatar-upload .preview{width:7rem;height:7rem;overflow:hidden;border-radius:50%}.avatar-upload .inputfile.hidden{width:.1px;height:.1px;opacity:0;overflow:hidden;position:absolute}.avatar-upload .inputfile+label.round{display:flex;align-items:center;justify-content:center;cursor:pointer;width:3rem;height:3rem;line-height:3rem;border-radius:50%;box-shadow:0 1px 4px rgba(0,0,0,.4);margin-left:auto;margin-right:auto;margin-top:-1rem;bottom:0;background-color:#fafafa}.avatar-upload .inputfile:focus+label.round{outline:none}.avatar-upload .inputfile+label:hover,.avatar-upload .inputfile:focus+label{background-color:#e3f2fd;color:#42a5f5}#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{position:relative;width:3rem;min-width:3rem;height:3rem;font-size:1.8rem;margin-right:.35rem}#topic-caption-panel .avatar-box>.material-icons{font-size:2.4rem;line-height:3rem}#topic-title-group{overflow-x:hidden}#hide-message-view{display:block;margin-right:.35rem}#topic-users{margin-left:auto;margin-right:1rem}#topic-users .avatar-box{display:inline-block;width:1.8rem;min-width:1.8rem;height:1.8rem;min-height:1.8rem;font-size:1rem;margin-right:.2rem}#topic-users .avatar-box>.material-icons{font-size:1.4rem;line-height:1.8rem}#topic-users>span{line-height:2rem;vertical-align:top}#messages-panel{position:relative;padding:.75rem;overflow-y:scroll;background-color:#eceff1;height:100%;background-image:url(../img/bg_messages.png)}#messages-container{position:relative;overflow-y:hidden;height:100%}#write-only-background{position:absolute;top:0;left:0;height:100%;width:100%;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)}#write-only-note{top:50%;transform:translate(-50%,-50%);height:auto;width:auto}#peer-messaging-disabled-note,#write-only-note{position:absolute;left:50%;background-color:#fff;color:#666;line-height:2rem;text-align:center;padding:.75rem 1.25rem;border-radius:.5rem;box-shadow:0 1px .5px rgba(0,0,0,.12)}#peer-messaging-disabled-note{bottom:4.3rem;transform:translate(-50%);width:fit-content}#send-message-panel{display:flex;align-items:center;flex:none;padding:.4rem .4rem .4rem .6rem;background-color:#eceff1;box-shadow:0 -2px 3px -1px rgba(0,0,0,.1);z-index:2;height:4rem}#send-message-panel #writing-disabled{width:100%;text-align:center;font-size:1.2rem}#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}.accept-invite-panel{background-color:#eceff1;box-shadow:0 -2px 3px -1px rgba(0,0,0,.1);width:100%;z-index:1}.accept-invite-panel .title{font-size:1.2rem;padding:.75rem}.accept-invite-panel .footer{background-color:#fafafa;white-space:nowrap;padding-bottom:.35rem;text-align:center}.accept-invite-panel button{font-size:1rem;height:2em;line-height:2em;border:1px solid transparent;margin:.25rem;box-shadow:0 1px 2px 0 rgba(0,0,0,.25)}#dummy-view{width:100%;height:100%;display:flex;align-items:center;justify-content:center;background-color:#e0f7fa}#dummy-view a{text-decoration:none;display:block;text-align:center;vertical-align:middle}#image-preview{position:absolute;display:flex;flex-direction:column;top:0;left:0;width:100%;height:100%;z-index:2;background-color:hsla(0,0%,100%,.9)}#image-preview-caption-panel{display:flex;justify-content:space-between;background-color:#eceff1;box-shadow:0 1px 2px silver;line-height:2.5rem;height:4.6rem;padding:1rem .75rem 0;z-index:3}#image-preview-caption-panel a{color:#757575;text-decoration:none}#image-preview-caption-panel a:hover{color:#000}#image-preview-container{display:flex;justify-content:space-around;align-items:center;overflow:hidden;width:100%;height:100%}#image-preview-footer{display:flex;justify-content:space-around;height:3.2rem;line-height:1.5rem;background-color:#eceff1;box-shadow:0 -2px 3px -1px rgba(0,0,0,.1)}#image-preview-container .material-icons{font-size:6rem}.chat-box{list-style:none;padding:0 0 3.5rem;margin:0 .5rem}.chat-box.group{margin-left:-.4rem}.chat-box li{display:flex;margin:0;padding:0;align-items:flex-end}.chat-box .right{justify-content:flex-end}.chat-box .center{justify-content:center;margin-top:.5rem;margin-bottom:.5rem}.chat-box .bubble{display:flex;position:relative;max-width:40rem;min-width:9rem;height:auto;padding:.75rem .5rem .75rem 1.25rem;margin:0;text-align:left;border-radius:.5rem;box-shadow:0 1px .5px rgba(0,0,0,.12)}.chat-box li.single{margin-top:.25rem;margin-bottom:.75rem}.chat-box li.first{margin-top:.25rem;margin-bottom:.15rem}.chat-box li.middle{margin-top:.15rem;margin-bottom:.15rem}.chat-box li.last{margin-top:.15rem;margin-bottom:.75rem}.chat-box .left .bubble{background-color:#c5e1a5}.chat-box .right .bubble{background-color:#fafafa}.chat-box .center .bubble{background-color:#e3f2fd;padding:.75rem .75rem .5rem}.chat-box .left .tip:before{content:"";position:absolute;width:0;height:0;right:auto;left:-.8rem;top:auto;bottom:0;color:#c5e1a5;border-color:transparent #c5e1a5 #c5e1a5 transparent;border-style:solid;border-width:.62rem;box-shadow:0 1.6px .5px -.8px rgba(0,0,0,.12)}.chat-box .right .tip:before{content:"";position:absolute;display:flex;justify-content:space-between;width:0;height:0;left:auto;right:-.8rem;top:auto;bottom:0;color:#fafafa;border-color:transparent transparent #fafafa #fafafa;border-style:solid;border-width:.62rem;box-shadow:0 1.6px .5px -.8px rgba(0,0,0,.12)}.chat-box .avatar-box{position:relative;width:1.4rem;min-width:1.4rem;height:1.4rem;min-height:1.4rem;font-size:.8rem;margin-bottom:.8rem;margin-right:.8rem}.chat-box .bubble div.message-content{color:#212121;margin:0;max-width:36rem;overflow-wrap:break-word}.chat-box .bubble div.message-content:after{content:".";display:block;height:0;clear:both;visibility:hidden}.chat-box .timestamp{display:inline-block;position:relative;font-size:80%;color:#777;padding-left:1rem;top:.5rem;float:right;white-space:nowrap}.chat-box .typing{display:inline-block;border-radius:.5rem;width:2rem;padding:.25rem .35rem;vertical-align:middle;text-align:center;color:#aaa;margin-top:.75rem}.chat-box .author{font-size:80%;color:#777}.image-preview,.inline-image{position:relative;overflow:hidden;border-radius:.1rem;display:block}.inline-image{max-width:36rem;max-height:24rem}.inline-image>.rounded-container{position:relative;margin:.25rem auto;bottom:2rem;border-left:.25rem solid transparent;border-right:.25rem solid transparent}img.image-preview:before,img.inline-image:before{font-size:.9rem;font-weight:lighter;color:#666;display:flex;position:absolute;top:0;left:0;width:100%;height:100%;justify-content:center;background:50% no-repeat #ccc url(../img/broken_image.png)}img.inline-image:before{content:attr(alt);background-size:2rem 2rem}img.image-preview:before{content:" ";background-size:8rem 8rem}.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{position:relative;display:flex;flex-direction:column;height:100%;overflow-y:hidden}#group-manager-buttons{display:flex;background-color:#eceff1;box-shadow:0 -1px rgba(0,0,0,.1);z-index:2;justify-content:space-around;padding:.4rem;height:4rem;border-left:1px solid #ccc}ul.tabbar{flex-shrink:0;flex-grow:0;background:#eee;list-style:none;margin:0;width:100%;overflow:hidden;padding:0 0 0 1rem}ul.tabbar>li{float:left}ul.tabbar>li>a{position:relative;padding-top:.75rem;padding-left:1rem;padding-right:1rem;display:block;text-align:center;line-height:2rem;font-weight:400;font-size:1.3rem;font-variant:small-caps;text-decoration:none;color:rgba(33,150,243,.6);overflow:hidden;box-shadow:inset 0 -2px 2.5px -1px rgba(0,0,0,.25)}ul.tabbar li.active>a{color:#2196f3}ul.tabbar li.active>a:after{height:.15rem;display:block;content:"";bottom:0;left:0;position:absolute;background:#2196f3;animation:tabbar-border-expand .2s cubic-bezier(.4,0,.4,1) 0s alternate forwards}@keyframes tabbar-border-expand{0%{opacity:0;width:0}to{opacity:1;width:100%}}.unread{display:inline-block;font-size:.75rem;font-weight:bolder;background-color:#0097a7;color:#fff;border-radius:50%;width:1.35rem;height:1.35rem;margin-left:.5rem;line-height:1.35rem;text-align:center;vertical-align:middle}.material-icons.as-badge{padding-left:.2rem;font-size:1.25rem;color:#bbb}.badge{font-family:Roboto Mono,Courier,monospace,sans-serif;font-size:.8rem;border:1px solid silver;background-color:#e8e8e8;color:#666;padding:.05rem .25rem;margin:.05rem .1rem;border-radius:.2rem;display:inline-block;align-self:flex-start}.badge.green{border-color:#9c9;background-color:#efe;color:#383}.badge.yellow{border-color:#cc9;background-color:#ffe;color:#660}.badge.blue{border-color:#99c;background-color:#eef;color:#339}.badge.red{border-color:#c99;background-color:#fee;color:#933}.badge.magenta{border-color:#c9c;background-color:#fef;color:#939}.lettertile{width:100%;padding-bottom:100%;border-radius:50%}.lettertile>div{display:flex;flex-shrink:0;flex-grow:0;position:absolute;top:0;bottom:0;left:0;right:0;text-transform:uppercase;align-items:center;justify-content:center;text-align:center;border-radius:50%;line-height:1;color:hsla(0,0%,98%,.8)}.lettertile:hover{color:#fff}.light-color0{background-color:#ef9a9a}.light-color1{background-color:#90caf9}.light-color2{background-color:#b0bec5}.light-color3{background-color:#b39ddb}.light-color4{background-color:#ffab91}.light-color5{background-color:#a5d6a7}.light-color6{background-color:#eee}.light-color7{background-color:#e6ee9c}.light-color8{background-color:#c5e1a5}.light-color9{background-color:#f0e57d}.light-color10{background-color:#f48fb1}.light-color11{background-color:#9fa8da}.light-color12{background-color:#ffe082}.light-color13{background-color:#bcaaa4}.light-color14{background-color:#80deea}.light-color15{background-color:#ce93d8}.dark-color0{background-color:#c62828}.dark-color1{background-color:#ad1457}.dark-color2{background-color:#6a1b9a}.dark-color3{background-color:#4527a0}.dark-color4{background-color:#283593}.dark-color5{background-color:#1565c0}.dark-color6{background-color:#0277bd}.dark-color7{background-color:#00838f}.dark-color8{background-color:#00695c}.dark-color9{background-color:#2e7d32}.dark-color10{background-color:#558b2f}.dark-color11{background-color:#9e9d24}.dark-color12{background-color:#f9a825}.dark-color13{background-color:#ff8f00}.dark-color14{background-color:#ef6c00}.dark-color15{background-color:#d84315}.material-icons{font-size:1.4rem;line-height:1;vertical-align:middle;text-align:center}.material-icons.small{font-size:1rem}.material-icons.big{font-size:2.4rem}#self-avatar .material-icons{font-size:2.4rem;line-height:3rem}.avatar-box .material-icons{color:hsla(0,0%,98%,.8);border-radius:50%;width:inherit;height:inherit}.chip-input{display:flex;flex-wrap:wrap;flex-grow:1;cursor:text;font-size:1.1rem;font-weight:400;background:transparent;border-bottom:1px solid #ccc;box-shadow:0 1px 0 rgba(0,0,0,.1);transition:all .1s ease-in-out;max-height:10rem;min-height:4rem;overflow-y:scroll;margin:.25rem 0;outline:none;color:#666;align-items:center;justify-content:flex-start;text-align:center}.chip-input.focused{border-bottom:1px solid #2196f3;box-shadow:0 1px 0 rgba(33,150,243,.25)}.chip-input>input[type=text]{display:inline-block;width:auto;border:none;line-height:1.8;box-shadow:none;min-width:4rem;flex:1 0 auto;height:1.8rem;margin:.125rem}.chip{display:flex;flex:0 0 auto;align-items:center;height:1.8rem;line-height:1.8;border-radius:.9rem;margin:.125rem;background-color:#eee;white-space:nowrap;font-size:90%}.chip.invalid{color:#c66;background-color:#fee}.chip>a{display:inline-block;color:#ccc;background-color:#aaa;border-radius:50%;margin:.3rem;width:1.175rem;height:1.175rem;line-height:1.15;text-decoration:none}.chip>a:focus,.chip>a:hover{text-decoration:none;color:#ddd;background-color:#bbb}.chip .avatar-box{position:relative;width:1.8rem;min-width:1.8rem;height:1.8rem;min-height:1.8rem;font-size:1rem;margin-right:.2rem}.chip .avatar-box .material-icons{font-size:1.4rem;line-height:1.8rem}.chip .spacer{display:inline-block;margin:.3rem;width:.25rem;height:1.175rem}.load-spinner-box{position:absolute;box-shadow:.1rem .1rem .15rem 1px rgba(0,0,0,.25);border-radius:50%;padding:.25rem;width:2.5rem;height:2.5rem;left:0;right:0;top:5rem;margin-left:auto;margin-right:auto;background-color:#fff;z-index:2}.loader-spinner{border-radius:50%;border:.35rem solid #f3f3f3;border-top-color:#1e88e5;width:2rem;height:2rem;animation:spin 1.5s linear infinite}@keyframes spin{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}.uploader{display:flex}.uploader>div{position:relative;height:.6rem;padding:.15rem;margin:.35rem;width:6rem;line-height:0;border-radius:.1rem;background-color:#cfd8dc}.uploader>div>span{display:inline-block;height:.3rem;background-color:#1e88e5;border-radius:.08rem}.highlight{color:teal;font-weight:bolder}.highlight .preview{color:#5f9ea0;font-weight:inherit}
\ No newline at end of file
diff --git a/src/views/tinode-web.jsx b/src/views/tinode-web.jsx
index 9f9527c1..b6962a27 100644
--- a/src/views/tinode-web.jsx
+++ b/src/views/tinode-web.jsx
@@ -627,7 +627,7 @@ class TinodeWeb extends React.Component {
}
// Merge search results and contact list to create a single flat
- // list of kown contacts for GroupManager to use.
+ // list of known contacts for GroupManager to use.
static prepareSearchableContacts(chatList, foundContacts) {
const merged = {};
diff --git a/src/widgets/chat-message.jsx b/src/widgets/chat-message.jsx
index 08b3cb3f..e5243e99 100644
--- a/src/widgets/chat-message.jsx
+++ b/src/widgets/chat-message.jsx
@@ -1,7 +1,7 @@
// Single message, sent or received.
import React from 'react';
import { FormattedMessage } from 'react-intl';
-import { Drafty } from 'tinode-sdk'
+import { Drafty } from 'tinode-sdk';
import Attachment from './attachment.jsx';
import LetterTile from './letter-tile.jsx';
@@ -165,12 +165,23 @@ export default class ChatMessage extends React.Component {
import { BROKEN_IMAGE_SIZE, REM_SIZE } from '../config.js';
import { fitImageSize } from '../lib/blob-helpers.js';
+// Converts Drafty elements into React classes.
+// 'this' is set by the caller.
function draftyFormatter(style, data, values, key) {
+ if (style == 'EX') {
+ // attachments are handled elsewhere.
+ return null;
+ }
+
let el = Drafty.tagName(style);
if (el) {
const attr = Drafty.attrValue(style, data) || {};
attr.key = key;
switch (style) {
+ case 'HL':
+ // Highlighted text. Assign class name.
+ attr.className = 'highlight';
+ break;
case 'IM':
// Additional processing for images
if (data) {
@@ -210,9 +221,16 @@ function draftyFormatter(style, data, values, key) {
// Form
attr.className = 'bot-form';
break;
- case 'FE':
+ case 'RW':
// Form element formatting is dependent on element content.
break;
+ default:
+ if (el == '_UNKN') {
+ // Unknown element.
+ // TODO: make it prettier.
+ el = <>extension>;
+ }
+ break;
}
return React.createElement(el, attr, values);
} else {
diff --git a/src/widgets/contact-list.jsx b/src/widgets/contact-list.jsx
index 7e6e95e5..1165d36d 100644
--- a/src/widgets/contact-list.jsx
+++ b/src/widgets/contact-list.jsx
@@ -3,6 +3,7 @@
import React from 'react';
import { defineMessages, injectIntl } from 'react-intl';
+import { Drafty } from 'tinode-sdk';
import Tinode from 'tinode-sdk';
import Contact from './contact.jsx';
@@ -10,6 +11,11 @@ import ContactAction from './contact-action.jsx';
import { makeImageUrl } from '../lib/blob-helpers.js';
+const junk = {
+ "ent":[{"data":{"mime":"image/jpeg","name":"hello.jpg","val":"<38992, bytes: ...>","width":100, "height":80},"tp":"EX"}],
+ "fmt":[{"at":-1, "key":0}]
+ };
+
const messages = defineMessages({
badge_you: {
id: 'badge_you',
@@ -25,7 +31,7 @@ const messages = defineMessages({
class ContactList extends React.Component {
render() {
- const {formatMessage} = this.props.intl;
+ const { formatMessage } = this.props.intl;
const showCheckmark = Array.isArray(this.props.topicSelected);
const contactNodes = [];
let contactsCount = 0;
@@ -70,6 +76,7 @@ class ContactList extends React.Component {
badges.push({name: formatMessage(messages.badge_owner), color: 'blue'});
}
}
+ // const comment = React.createElement(React.Fragment, null, Drafty.format(junk, draftyFormatter, this));
const comment = Array.isArray(c.private) ?
c.private.join(',') : (c.private ? c.private.comment : null);
@@ -118,4 +125,52 @@ class ContactList extends React.Component {
}
};
+
+// Converts Drafty elements into a one-line preview.
+function draftyFormatter(style, data, values, key) {
+ let el = Drafty.tagName(style);
+ const attr = { key: key };
+ if (el) {
+ switch (style) {
+ case 'HL':
+ // Make highlight less prominent in preview.
+ attr.className = 'highlight preview';
+ break;
+ case 'LN':
+ // Disable links in previews.
+ el = 'span';
+ break;
+ case 'IM':
+ // Replace image with '[icon] Image'.
+ el = React.Fragment;
+ values = [photo, 'Picture'];
+ break;
+ case 'BN':
+ el = 'span';
+ attr.className = 'flat-button faux';
+ break;
+ case 'FM':
+ el = React.Fragment;
+ values = [dashboard, 'Form:'];
+ break;
+ case 'RW':
+ el = React.Fragment;
+ break;
+ case 'EX':
+ el = React.Fragment;
+ values = [attachment, 'Attachment'];
+ break;
+ default:
+ if (el == '_UNKN') {
+ el = React.Fragment;
+ values = [extension];
+ }
+ break;
+ }
+ return React.createElement(el, attr, values);
+ } else {
+ return values;
+ }
+};
+
export default injectIntl(ContactList);
diff --git a/umd/index.dev.js b/umd/index.dev.js
index e2fd9546..db41071f 100644
--- a/umd/index.dev.js
+++ b/umd/index.dev.js
@@ -1,2 +1,10542 @@
-!function(){"use strict";var e={"./src/config.js":function(e,t,s){s.r(t),s.d(t,{APP_NAME:function(){return a},API_KEY:function(){return i},KNOWN_HOSTS:function(){return n},DEFAULT_HOST:function(){return o},LOGGING_ENABLED:function(){return r},KEYPRESS_DELAY:function(){return l},RECEIVED_DELAY:function(){return c},READ_DELAY:function(){return d},MIN_TAG_LENGTH:function(){return h},MAX_TAG_LENGTH:function(){return p},MAX_TAG_COUNT:function(){return m},DEFAULT_P2P_ACCESS_MODE:function(){return u},NEW_GRP_ACCESS_MODE:function(){return g},CHANNEL_ACCESS_MODE:function(){return _},NO_ACCESS_MODE:function(){return b},MEDIA_BREAKPOINT:function(){return f},REM_SIZE:function(){return v},AVATAR_SIZE:function(){return E},BROKEN_IMAGE_SIZE:function(){return w},MESSAGES_PAGE:function(){return S},MAX_INBAND_ATTACHMENT_SIZE:function(){return C},MAX_EXTERN_ATTACHMENT_SIZE:function(){return M},MAX_IMAGE_DIM:function(){return k},IMAGE_PREVIEW_DIM:function(){return T},MAX_ONLINE_IN_TOPIC:function(){return A},MAX_TITLE_LENGTH:function(){return N},LINK_CONTACT_US:function(){return y},LINK_PRIVACY_POLICY:function(){return P},LINK_TERMS_OF_SERVICE:function(){return x}});const a="TinodeWeb/"+(s("./src/version.js").PACKAGE_VERSION||"0.16"),i="AQEAAAABAAD_rAp4DJh05a1HAwFT3A6K",n={hosted:"web.tinode.co",local:"localhost:6060"},o=n.hosted,r=!0,l=3e3,c=500,d=1e3,h=2,p=96,m=16,u="JRWPS",g="JRWPSAO",_="JR",b="N",f=640,v=13,E=128,w=32,S=24,C=262144,M=1<<23,k=1024,T=64,A=4,N=60,y="email:info@tinode.co",P="https://tinode.co/privacy.html",x="https://tinode.co/terms.html"},"./src/index.js":function(e,t,s){s.r(t);var a=s("react"),i=s.n(a),n=s("react-dom"),o=s.n(n),r=s("react-intl"),l=s("./src/messages.json"),c=s("./src/views/tinode-web.jsx"),d=s("./src/lib/navigation.js");const{params:h}=d.default.parseUrlHash(window.location.hash),p=h&&h.hl||navigator.languages&&navigator.languages[0]||navigator.language||navigator.userLanguage||"en",m=p.toLowerCase().split(/[-_]/)[0],u=l[p]||l[m]||l.en;o().render(i().createElement(r.IntlProvider,{locale:p,messages:u,textComponent:i().Fragment},i().createElement(c.default,null)),document.getElementById("mountPoint"))},"./src/lib/blob-helpers.js":function(e,t,s){s.r(t),s.d(t,{SUPPORTED_IMAGE_FORMATS:function(){return i},MIME_EXTENSIONS:function(){return n},makeImageUrl:function(){return o},fitImageSize:function(){return r},fileNameForMime:function(){return l},imageScaled:function(){return c},fileToBase64:function(){return d},blobToBase64:function(){return h},filePasted:function(){return p},getMimeType:function(){return m},base64EncodedLen:function(){return u},base64DecodedLen:function(){return g},base64ReEncode:function(){return _}});var a=s("./src/config.js");s("./src/lib/strformat.js");const i=["image/jpeg","image/gif","image/png","image/svg","image/svg+xml"],n=["jpg","gif","png","svg","svg"];function o(e){return e&&e.type&&e.data?"data:image/"+e.type+";base64,"+e.data:null}function r(e,t,s,a,i){if(t|=0,s|=0,a|=0,(e|=0)<=0||t<=0||s<=0||a<=0)return null;i&&(s=a=Math.min(s,a));let n=Math.min(Math.min(e,s)/e,Math.min(t,a)/t),o={dstWidth:e*n|0,dstHeight:t*n|0};return i?(o.dstWidth=o.dstHeight=Math.min(o.dstWidth,o.dstHeight),o.srcWidth=o.srcHeight=Math.min(e,t),o.xoffset=(e-o.srcWidth)/2|0,o.yoffset=(t-o.srcWidth)/2|0):(o.xoffset=o.yoffset=0,o.srcWidth=e,o.srcHeight=t),o}function l(e,t){const s=i.indexOf(t);if(s<0||!e)return e;const a=n[s],o=e.lastIndexOf(".");return o>=0&&(e=e.substring(0,o)),e+"."+a}function c(e,t,s,a,n,o,c){const d=new Image;d.crossOrigin="Anonymous",d.onerror=function(e){c("Image format unrecognized")},d.onload=async function(){URL.revokeObjectURL(d.src);const h=r(this.width,this.height,t,s,n);if(!h)return void c("Invalid image");let p=document.createElement("canvas");p.width=h.dstWidth,p.height=h.dstHeight;let m=p.getContext("2d");m.imageSmoothingEnabled=!0,m.drawImage(this,h.xoffset,h.yoffset,h.srcWidth,h.srcHeight,0,0,h.dstWidth,h.dstHeight);const u=i.indexOf(e.type)<0?"image/jpeg":e.type;let g=await new Promise((e=>p.toBlob(e,u)));if(g){for(;a>0&&g.length>a;)h.dstWidth=.70710678118*h.dstWidth|0,h.dstHeight=.70710678118*h.dstHeight|0,p.width=h.dstWidth,p.height=h.dstHeight,m=p.getContext("2d"),m.clearRect(0,0,p.width,p.height),m.drawImage(this,h.xoffset,h.yoffset,h.srcWidth,h.srcHeight,0,0,h.dstWidth,h.dstHeight),g=await new Promise((e=>p.toBlob(e,u)));p=null,o(g,u,h.dstWidth,h.dstHeight,l(e.name,u))}else c("Unsupported image format")},d.src=URL.createObjectURL(e)}function d(e,t){const s=new FileReader;s.addEventListener("load",(function(){t(e.type,s.result.split(",")[1],e.name)})),s.readAsDataURL(e)}function h(e,t){const s=new FileReader;s.addEventListener("load",(function(){t(e.type,s.result.split(",")[1])})),s.readAsDataURL(e)}function p(e,t,s,n){var o=(e.clipboardData||e.originalEvent.clipboardData||{}).items;for(var r in o){var l=o[r];if("file"===l.kind){var c=l.getAsFile();if(!c){console.log("Failed to get file object from pasted file item",l.kind,l.type);continue}return c.type&&"image"==c.type.split("/")[0]?c.size>a.MAX_INBAND_ATTACHMENT_SIZE||i.indexOf(c.type)<0?imageFileScaledToBase64(c,a.MAX_IMAGE_DIM,a.MAX_IMAGE_DIM,!1,t,n):imageFileToBase64(c,t,n):d(c,s),!0}}return!1}function m(e){var t=/^data:(image\/[-+a-z0-9.]+);base64/.exec(e);return t&&t.length>1?t[1]:null}function u(e){return 4*Math.floor((e+2)/3)}function g(e){return 3*Math.floor(e/4)}function _(e){if(e){e=e.replace(/-/g,"+").replace(/_/g,"/");try{e=btoa(atob(e))}catch(t){console.log("Failed to base64 re-encode string.",t),e=null}}return e}},"./src/lib/host-name.js":function(e,t,s){s.r(t),s.d(t,{detectServerAddress:function(){return i},isSecureConnection:function(){return n},isLocalHost:function(){return o}});var a=s("./src/config.js");function i(){let e=a.DEFAULT_HOST;return"object"==typeof window.location&&("file:"==window.location.protocol||"localhost"==window.location.hostname?e=a.KNOWN_HOSTS.local:window.location.hostname&&(e=window.location.hostname+(window.location.port?":"+window.location.port:""))),e}function n(){return"object"==typeof window.location&&"https:"==window.location.protocol}function o(){return"object"==typeof window.location&&"localhost"==window.location.hostname}},"./src/lib/local-storage.js":function(e,t,s){s.r(t),s.d(t,{default:function(){return a}});class a{static setObject(e,t){localStorage.setItem(e,JSON.stringify(t))}static getObject(e){const t=localStorage.getItem(e);return t&&JSON.parse(t)}static updateObject(e,t){const s=this.getObject(e);this.setObject(e,Object.assign(s||{},t))}static removeItem(e){localStorage.removeItem(e)}}},"./src/lib/navigation.js":function(e,t,s){s.r(t),s.d(t,{default:function(){return a}});class a{static parseUrlHash(e){const t=e.split("?",2),s={};let a=[];return t[0]&&(a=t[0].substr(1).split("/")),t[1]&&t[1].split("&").forEach((function(e){let t=e.split("=");t[0]&&(s[decodeURIComponent(t[0])]=decodeURIComponent(t[1]))})),{path:a,params:s}}static navigateTo(e){window.location.hash=e}static composeUrlHash(e,t){let s=e.join("/");const a=[];for(const e in t)t.hasOwnProperty(e)&&a.push(e+"="+t[e]);return a.length>0&&(s+="?"+a.join("&")),s}static addUrlParam(e,t,s){const a=this.parseUrlHash(e);return a.params[t]=s,this.composeUrlHash(a.path,a.params)}static removeUrlParam(e,t){const s=this.parseUrlHash(e);return delete s.params[t],this.composeUrlHash(s.path,s.params)}static setUrlSidePanel(e,t){const s=this.parseUrlHash(e);return s.path[0]=t,this.composeUrlHash(s.path,s.params)}static setUrlTopic(e,t){const s=this.parseUrlHash(e);return s.path[1]=t,delete s.params.info,this.composeUrlHash(s.path,s.params)}}},"./src/lib/strformat.js":function(e,t,s){function a(e,t){t=t||window.navigator.userLanguage||window.navigator.language;const s=new Date;return e.getFullYear()==s.getFullYear()?e.getMonth()==s.getMonth()&&e.getDate()==s.getDate()?e.toLocaleTimeString(t,{hour12:!1,hour:"2-digit",minute:"2-digit"}):e.toLocaleDateString(t,{hour12:!1,month:"short",day:"numeric",hour:"2-digit",minute:"2-digit"}):e.toLocaleDateString(t,{hour12:!1,year:"numeric",month:"short",day:"numeric",hour:"2-digit",minute:"2-digit"})}function i(e){const t=Math.floor(e/60);let s=e%60;return s=s<10?"0".concat(s):s,"".concat(t,":").concat(s)}function n(e){if(!e||0==e)return"0 Bytes";const t=["Bytes","KB","MB","GB","TB","PB"],s=Math.min(0|Math.floor(Math.log2(e)/10),t.length-1),a=e/Math.pow(1024,s),i=s>0?a<3?2:a<30?1:0:0;return a.toFixed(i)+" "+t[s]}function o(e){let t=0;e=""+e;for(let s=0;s
¯∖_(ツ)_/¯",description:"HTML message shown in ContactList when no contacts are found"},(e=>i().createElement(o.default,{connected:this.props.connected,contacts:this.state.contactList,emptyListMessage:e,topicSelected:this.props.topicSelected,myUserId:this.props.myUserId,showOnline:!0,showUnread:!0,onTopicSelected:this.props.onTopicSelected,showContextMenu:this.props.showContextMenu,onAction:this.handleAction})))}}},"./src/views/create-account-view.jsx":function(e,t,s){s.r(t),s.d(t,{default:function(){return p}});var a=s("react"),i=s.n(a),n=s("react-intl"),o=s("./src/widgets/avatar-upload.jsx"),r=s("./src/widgets/checkbox.jsx"),l=s("./src/widgets/visible-password.jsx"),c=s("./src/lib/local-storage.js"),d=s("./src/lib/utils.js"),h=s("./src/config.js");class p extends i().PureComponent{constructor(e){super(e),this.state={login:"",password:"",email:"",fn:"",imageDataUrl:null,errorCleared:!1,saveToken:c.default.getObject("keep-logged-in")},this.handleLoginChange=this.handleLoginChange.bind(this),this.handlePasswordChange=this.handlePasswordChange.bind(this),this.handleEmailChange=this.handleEmailChange.bind(this),this.handleFnChange=this.handleFnChange.bind(this),this.handleImageChanged=this.handleImageChanged.bind(this),this.handleToggleSaveToken=this.handleToggleSaveToken.bind(this),this.handleSubmit=this.handleSubmit.bind(this)}handleLoginChange(e){this.setState({login:e.target.value})}handlePasswordChange(e){this.setState({password:e})}handleEmailChange(e){this.setState({email:e.target.value})}handleFnChange(e){this.setState({fn:e.target.value})}handleImageChanged(e){this.setState({imageDataUrl:e})}handleToggleSaveToken(){c.default.setObject("keep-logged-in",!this.state.saveToken),this.setState({saveToken:!this.state.saveToken})}handleSubmit(e){e.preventDefault(),this.setState({errorCleared:!1}),this.props.onCreateAccount(this.state.login.trim(),this.state.password.trim(),(0,d.vcard)(this.state.fn.trim().substring(0,h.MAX_TITLE_LENGTH),this.state.imageDataUrl),{meth:"email",val:this.state.email})}render(){let e="blue";return this.props.disabled&&(e+=" disabled"),i().createElement("form",{className:"panel-form-column",onSubmit:this.handleSubmit},i().createElement("div",{className:"panel-form-row"},i().createElement("div",{className:"panel-form-column"},i().createElement(n.FormattedMessage,{id:"login_prompt"},(e=>i().createElement("input",{type:"text",placeholder:e,autoComplete:"user-name",value:this.state.login,onChange:this.handleLoginChange,required:!0,autoFocus:!0}))),i().createElement(n.FormattedMessage,{id:"password_prompt"},(e=>i().createElement(l.default,{placeholder:e,autoComplete:"new-password",value:this.state.password,onFinished:this.handlePasswordChange,required:!0})))),i().createElement(o.default,{onImageChanged:this.handleImageChanged,onError:this.props.onError})),i().createElement("div",{className:"panel-form-row"},i().createElement(n.FormattedMessage,{id:"full_name_prompt",defaultMessage:"Full name, e.g. John Doe",description:"Input placeholder for person's full name"},(e=>i().createElement("input",{type:"text",placeholder:e,autoComplete:"name",value:this.state.fn,onChange:this.handleFnChange,required:!0})))),i().createElement("div",{className:"panel-form-row"},i().createElement(n.FormattedMessage,{id:"email_prompt",defaultMessage:"Email, e.g. jdoe@example.com",description:"Input placeholder for email entry"},(e=>i().createElement("input",{type:"email",placeholder:e,autoComplete:"email",value:this.state.email,onChange:this.handleEmailChange,required:!0})))),i().createElement("div",{className:"panel-form-row"},i().createElement(r.default,{id:"save-token",name:"save-token",checked:this.state.saveToken,onChange:this.handleToggleSaveToken}),i().createElement(n.FormattedMessage,{id:"stay_logged_in"},(e=>i().createElement("label",{htmlFor:"save-token"}," ",e)))),i().createElement("div",{className:"dialog-buttons"},i().createElement("button",{className:e,type:"submit"},i().createElement(n.FormattedMessage,{id:"button_sign_up",defaultMessage:"Sign up",description:"Create account button [Sign Up]"}))))}}},"./src/views/edit-account-view.jsx":function(e,t,s){s.r(t),s.d(t,{default:function(){return l}});var a=s("react"),i=s.n(a),n=s("react-intl"),o=s("./src/widgets/avatar-upload.jsx"),r=s("./src/lib/blob-helpers.js");class l extends i().Component{constructor(e){super(e);const t=this.props.tinode.getMeTopic();this.state={fullName:t.public?t.public.fn:void 0,avatar:(0,r.makeImageUrl)(t.public?t.public.photo:null)}}render(){return i().createElement("div",{className:"scrollable-panel"},i().createElement("div",{className:"panel-form-row"},i().createElement("div",{className:"panel-form-column"},i().createElement("label",{className:"small"},i().createElement(n.FormattedMessage,{id:"label_your_name",defaultMessage:"Your name",description:"Label for full name editing"})),i().createElement("div",{className:"large"},this.state.fullName),i().createElement("div",null,i().createElement("label",{className:"small"},i().createElement(n.FormattedMessage,{id:"label_user_id",defaultMessage:"ID:",description:"Label for user address (ID)"}))," ",i().createElement("tt",null,this.props.myUserId))),i().createElement(o.default,{avatar:this.state.avatar,readOnly:!this.state.owner,uid:this.props.myUserId,title:this.state.fullName})),i().createElement("div",{className:"panel-form-row"},i().createElement("a",{href:"#",className:"flat-button",onClick:e=>{e.preventDefault(),this.props.onBasicNavigate("general")}},i().createElement("i",{className:"material-icons"},"edit")," ",i().createElement(n.FormattedMessage,{id:"button_edit",defaultMessage:"Edit",description:"Call to action [Edit]"}))),i().createElement("div",{className:"hr"}),i().createElement("div",{className:"panel-form-column"},i().createElement("a",{href:"#",className:"flat-button",onClick:e=>{e.preventDefault(),this.props.onBasicNavigate("notif")}},i().createElement("i",{className:"material-icons"},"notifications")," ",i().createElement(n.FormattedMessage,{id:"sidepanel_title_acc_notifications"})),i().createElement("a",{href:"#",className:"flat-button",onClick:e=>{e.preventDefault(),this.props.onBasicNavigate("security")}},i().createElement("i",{className:"material-icons"},"security")," ",i().createElement(n.FormattedMessage,{id:"sidepanel_title_acc_security"})),i().createElement("a",{href:"#",className:"flat-button",onClick:e=>{e.preventDefault(),this.props.onBasicNavigate("support")}},i().createElement("i",{className:"material-icons"},"contact_support")," ",i().createElement(n.FormattedMessage,{id:"sidepanel_title_acc_support"}))))}}},"./src/views/info-view.jsx":function(e,t,s){s.r(t);var a=s("react"),i=s.n(a),n=s("react-intl"),o=s("tinode-sdk"),r=s.n(o),l=s("./src/widgets/avatar-upload.jsx"),c=s("./src/widgets/checkbox.jsx"),d=s("./src/widgets/contact-list.jsx"),h=s("./src/widgets/error-panel.jsx"),p=s("./src/widgets/group-manager.jsx"),m=s("./src/widgets/in-place-edit.jsx"),u=s("./src/widgets/menu-cancel.jsx"),g=s("./src/widgets/more-button.jsx"),_=s("./src/widgets/permissions-editor.jsx"),b=s("./src/widgets/tag-manager.jsx"),f=s("./src/config.js"),v=s("./src/lib/blob-helpers.js"),E=s("./src/lib/utils.js");const w=(0,n.defineMessages)({requested:{id:"requested_permissions",defaultMessage:"Requested",description:"Title for permissions"},granted:{id:"granted_permissions",defaultMessage:"Granted",description:"Title for permissions"},edit_permissions:{id:"menu_item_edit_permissions",defaultMessage:"Edit permissions",description:"Menu item [Edit permissions]"},other_user:{id:"label_other_user",defaultMessage:"Other",description:"Label for the other user when the user is unnamed"},clear_messages:{id:"action_clear_messages",defaultMessage:"Clear Messages",description:"Flat button [Clear Messages] (soft-delete messages)"},clear_messages_warning:{id:"clear_messages_warning",defaultMessage:"Are you sure you want to clear all messages? It cannot be undone.",description:"Alert dialog warning when deleting all messages."},delete_messages:{id:"action_delete_messages",defaultMessage:"Clear Messages for All",description:"Flat button [Clear for All] (hard-delete all messages)"},delete_messages_warning:{id:"delete_messages_warning",defaultMessage:"Are you sure you want to delete all messages for everyone? It cannot be undone.",description:"Alert dialog warning when hard-deleting all messages."},leave_chat:{id:"action_leave_chat",defaultMessage:"Leave Conversation",description:"Flat button [Leave Conversation]"},leave_chat_warning:{id:"leave_chat_warning",defaultMessage:"Are you sure you want to leave this conversation?",description:"Alert dialog warning when unsubscribing from a chat."},block_contact:{id:"action_block_contact",defaultMessage:"Block Contact",description:"Flat button [Block Contact]"},block_contact_warning:{id:"block_contact_warning",defaultMessage:"Are you sure you want to block this contact?",description:"Alert dialog warning when blocking a contact."},report_chat:{id:"action_report_chat",defaultMessage:"Report Conversation",description:"Flat button [Report Group]"},report_chat_warning:{id:"report_chat_warning",defaultMessage:"Are you sure you want to block and report this conversation?",description:"Alert dialog warning when reporting a conversation for abuse"}});class S extends i().Component{constructor(e){super(e),this.state={topic:null,owner:!1,admin:!1,sharer:!1,deleter:!1,muted:!1,address:null,groupTopic:void 0,channel:void 0,fullName:void 0,avatar:null,private:null,selectedContact:null,access:null,modeGiven:null,modeWant:null,modeGiven2:null,modeWant2:null,auth:null,anon:null,contactList:[],tags:[],showMemberPanel:!1,showPermissionEditorFor:void 0,moreInfoExpanded:!1,previousMetaDesc:void 0,previousSubsUpdated:void 0,previousTagsUpdated:void 0},this.resetSubs=this.resetSubs.bind(this),this.resetDesc=this.resetDesc.bind(this),this.onMetaDesc=this.onMetaDesc.bind(this),this.onSubsUpdated=this.onSubsUpdated.bind(this),this.onTagsUpdated=this.onTagsUpdated.bind(this),this.handleFullNameUpdate=this.handleFullNameUpdate.bind(this),this.handlePrivateUpdate=this.handlePrivateUpdate.bind(this),this.handleImageChanged=this.handleImageChanged.bind(this),this.handleMuted=this.handleMuted.bind(this),this.handlePermissionsChanged=this.handlePermissionsChanged.bind(this),this.handleLaunchPermissionsEditor=this.handleLaunchPermissionsEditor.bind(this),this.handleHidePermissionsEditor=this.handleHidePermissionsEditor.bind(this),this.handleShowAddMembers=this.handleShowAddMembers.bind(this),this.handleHideAddMembers=this.handleHideAddMembers.bind(this),this.handleMemberUpdateRequest=this.handleMemberUpdateRequest.bind(this),this.handleDeleteMessages=this.handleDeleteMessages.bind(this),this.handleLeave=this.handleLeave.bind(this),this.handleBlock=this.handleBlock.bind(this),this.handleReport=this.handleReport.bind(this),this.handleMemberSelected=this.handleMemberSelected.bind(this),this.handleMoreInfo=this.handleMoreInfo.bind(this),this.handleTagsUpdated=this.handleTagsUpdated.bind(this),this.handleContextMenu=this.handleContextMenu.bind(this)}componentDidUpdate(e){const t=this.props.tinode.getTopic(e.topic);t&&(this.onMetaDesc!=t.onMetaDesc&&(this.previousMetaDesc=t.onMetaDesc,t.onMetaDesc=this.onMetaDesc,this.previousSubsUpdated=t.onSubsUpdated,t.onSubsUpdated=this.onSubsUpdated,"grp"==t.getType()?(this.previousTagsUpdated=t.onTagsUpdated,t.onTagsUpdated=this.onTagsUpdated):this.previousTagsUpdated=void 0),this.state.topic!=e.topic&&(this.setState({topic:e.topic}),this.resetDesc(t,e),this.resetSubs(t,e)))}componentWillUnmount(){const e=this.props.tinode.getTopic(this.props.topic);e&&(this.setState({topic:null}),e.onMetaDesc=this.previousMetaDesc,e.onSubsUpdated=this.previousSubsUpdated,e.onTagsUpdated=this.previousTagsUpdated)}resetSubs(e,t){const s={contactList:[]};if("p2p"==e.getType()){const a=e.subscriber(t.topic);a?(s.modeGiven2=a.acs.getGiven(),s.modeWant2=a.acs.getWant()):(s.modeGiven2=f.NO_ACCESS_MODE,s.modeWant2=f.NO_ACCESS_MODE)}else e.subscribers((e=>{s.contactList.push(e)}),this);this.setState(s)}resetDesc(e,t){const s=e.getDefaultAccess()||{},a=e.getAccessMode();this.setState({owner:a&&a.isOwner(),admin:a&&a.isAdmin(),sharer:a&&a.isSharer(),deleter:a&&a.isDeleter(),muted:a&&a.isMuted(),fullName:e.public?e.public.fn:void 0,avatar:(0,v.makeImageUrl)(e.public?e.public.photo:null),private:e.private?e.private.comment:null,address:e.name,groupTopic:"grp"==e.getType(),channel:e.isChannel(),showMemberPanel:!1,access:a?a.getMode():void 0,modeGiven:a?a.getGiven():void 0,modeWant:a?a.getWant():void 0,auth:s.auth,anon:s.anon}),"grp"==e.getType()&&a&&a.isOwner()&&e.getMeta(e.startMetaQuery().withTags().build())}onMetaDesc(e){const t=this.props.tinode.getTopic(this.props.topic);t&&(this.resetDesc(t,this.props),this.previousMetaDesc&&this.previousMetaDesc!=this.onMetaDesc&&this.previousMetaDesc(e))}onSubsUpdated(e){const t=this.props.tinode.getTopic(this.props.topic);t&&(this.resetSubs(t,this.props),this.previousSubsUpdated&&this.previousSubsUpdated!=this.onSubsUpdated&&this.previousSubsUpdated(e))}onTagsUpdated(e){this.setState({tags:e}),this.previousTagsUpdated&&this.previousTagsUpdated!=this.onTagsUpdated&&this.previousTagsUpdated()}handleFullNameUpdate(e){e=e.trim().substring(0,f.MAX_TITLE_LENGTH),this.state.fullName!==e&&(this.setState({fullName:e}),this.props.onTopicDescUpdate(this.props.topic,(0,E.vcard)(e,null),null))}handlePrivateUpdate(e){e=e.trim().substring(0,f.MAX_TITLE_LENGTH),this.state.private!==e&&(this.setState({private:e}),this.props.onTopicDescUpdate(this.props.topic,null,e||r().DEL_CHAR))}handleImageChanged(e){this.setState({avatar:e}),this.props.onTopicDescUpdate(this.props.topic,(0,E.vcard)(null,e||r().DEL_CHAR),null)}handleMuted(e,t){this.setState({muted:t}),this.props.onChangePermissions(this.props.topic,t?"-P":"+P")}handlePermissionsChanged(e){switch(this.state.showPermissionEditorFor){case"auth":this.props.onTopicDescUpdate(this.props.topic,null,null,{auth:e});break;case"anon":this.props.onTopicDescUpdate(this.props.topic,null,null,{anon:e});break;case"mode":case"want":this.props.onChangePermissions(this.props.topic,e);break;case"given":this.props.onChangePermissions(this.props.topic,e,this.props.topic);break;case"user":this.props.onChangePermissions(this.props.topic,e,this.state.userPermissionsEdited)}this.setState({showPermissionEditorFor:void 0})}handleLaunchPermissionsEditor(e,t){const{formatMessage:s}=this.props.intl;let a,i,n,o,l,c,d;switch(e){case"mode":a=this.state.access;break;case"want":a=this.state.modeWant,i=this.state.modeGiven,this.state.owner?n="O":(n=r().AccessMode.encode(r().AccessMode.diff("ASDO",this.state.modeGiven)),this.state.channel&&(n+="W")),o=s(w.requested),l=s(w.granted);break;case"given":a=this.state.modeGiven2,i=this.state.modeWant2,n=this.state.groupTopic?this.state.owner?"":"O":"ASDO",o=s(w.granted),l=s(w.requested);break;case"auth":a=this.state.auth,n="O";break;case"anon":a=this.state.anon,n="O";break;case"user":{const e=this.props.tinode.getTopic(this.props.topic);if(!e)return;const r=e.subscriber(t);if(!r||!r.acs)return;a=r.acs.getGiven(),i=r.acs.getWant(),n=this.state.owner?"":"O",o=s(w.granted),l=s(w.requested),r.public&&(c=r.public.fn,d=r.public.photo);break}default:console.log("Unknown permission editing mode '"+e+"'")}this.setState({showPermissionEditorFor:e,userPermissionsEdited:t,userPermissionsTitle:c,userPermissionsAvatar:d,editedPermissions:a,immutablePermissions:i,editedPermissionsTitle:o,immutablePermissionsTitle:l,editedPermissionsSkipped:n})}handleHidePermissionsEditor(){this.setState({showPermissionEditorFor:void 0})}handleShowAddMembers(e){e.preventDefault(),this.props.onInitFind(),this.setState({showMemberPanel:!0})}handleHideAddMembers(){this.setState({showMemberPanel:!1})}handleMemberUpdateRequest(e,t,s){this.props.onMemberUpdateRequest(this.props.topic,t,s),this.setState({showMemberPanel:!1})}handleDeleteMessages(e){e.preventDefault();const{formatMessage:t}=this.props.intl;this.props.onShowAlert(t(this.state.deleter?w.delete_messages:w.clear_messages),t(this.state.deleter?w.delete_messages_warning:w.clear_messages_warning),(()=>{this.props.onDeleteMessages(this.props.topic)}),null,!0,null)}handleLeave(e){e.preventDefault();const{formatMessage:t}=this.props.intl;this.props.onShowAlert(t(w.leave_chat),t(w.leave_chat_warning),(()=>{this.props.onLeaveTopic(this.props.topic)}),null,!0,null)}handleBlock(e){e.preventDefault();const{formatMessage:t}=this.props.intl;this.props.onShowAlert(t(w.block_contact),t(w.block_contact_warning),(()=>{this.props.onBlockTopic(this.props.topic)}),null,!0,null)}handleReport(e){e.preventDefault();const{formatMessage:t}=this.props.intl;this.props.onShowAlert(t(w.report_chat),t(w.report_chat_warning),(()=>{this.props.onReportTopic(this.props.topic)}),null,!0,null)}handleMemberSelected(e){this.setState({selectedContact:e})}handleMoreInfo(e){this.setState({moreInfoExpanded:e})}handleTagsUpdated(e){(0,E.arrayEqual)(this.state.tags.slice(0),e.slice(0))||this.props.onTopicTagsUpdate(this.props.topic,e)}handleContextMenu(e){const{formatMessage:t}=this.props.intl,s=this,a=this.props.tinode.getTopic(this.props.topic);if(!a)return;const i=a.subscriber(e.topicName);if(!i||!i.acs)return;const n=[{title:t(w.edit_permissions),handler:function(){s.handleLaunchPermissionsEditor("user",e.topicName)}},"member_delete",i.acs.isMuted()?"member_unmute":"member_mute",i.acs.isJoiner()?"member_block":"member_unblock"];this.props.showContextMenu({topicName:this.props.topic,x:e.x,y:e.y,user:e.topicName},n)}render(){const{formatMessage:e}=this.props.intl;return i().createElement("div",{id:"info-view"},i().createElement("div",{className:"caption-panel",id:"info-caption-panel"},i().createElement("div",{className:"panel-title",id:"info-title"},i().createElement(n.FormattedMessage,{id:"title_info",defaultMessage:"Info",description:"Title for InfoView"})),i().createElement("div",null,i().createElement(u.default,{onCancel:this.props.onCancel}))),this.props.displayMobile?i().createElement(h.default,{level:this.props.errorLevel,text:this.props.errorText,onClearError:this.props.onError}):null,this.state.showMemberPanel?i().createElement(p.default,{members:this.state.contactList,requiredMember:this.props.myUserId,keepInitialMembers:!this.state.admin&&!this.state.owner,myUserId:this.props.myUserId,contacts:this.props.searchableContacts,onCancel:this.handleHideAddMembers,onSubmit:this.handleMemberUpdateRequest}):this.state.showPermissionEditorFor?i().createElement(_.default,{mode:this.state.editedPermissions,compare:this.state.immutablePermissions,skip:this.state.editedPermissionsSkipped,modeTitle:this.state.editedPermissionsTitle,compareTitle:this.state.immutablePermissionsTitle,userTitle:this.state.userPermissionsTitle,item:this.state.userPermissionsEdited,userAvatar:this.state.userPermissionsAvatar,onSubmit:this.handlePermissionsChanged,onCancel:this.handleHidePermissionsEditor}):i().createElement("div",{id:"info-view-content",className:"scrollable-panel"},i().createElement("div",{className:"panel-form-row"},i().createElement("div",{className:"panel-form-column"},i().createElement("div",null,i().createElement("label",{className:"small"},i().createElement(n.FormattedMessage,{id:"label_topic_name",defaultMessage:"Name",description:"Label for editing topic name"}))),i().createElement("div",null,i().createElement(m.default,{placeholder:this.state.groupTopic?"Group name":i().createElement("i",null,"Unknown"),readOnly:!this.state.owner,value:this.state.fullName,required:!0,onFinished:this.handleFullNameUpdate})),i().createElement("div",null,i().createElement("label",{className:"small"},i().createElement(n.FormattedMessage,{id:"label_private",defaultMessage:"Private comment",description:"Label for editing 'private'"}))),i().createElement("div",null,i().createElement(n.FormattedMessage,{id:"private_editing_placeholder",defaultMessage:"Visible to you only",description:"Placeholder for editing 'private'"},(e=>i().createElement(m.default,{placeholder:e,value:this.state.private,onFinished:this.handlePrivateUpdate}))))),i().createElement(l.default,{avatar:this.state.avatar,readOnly:!this.state.owner,uid:this.props.topic,title:this.state.fullName,onImageChanged:this.handleImageChanged,onError:this.props.onError})),i().createElement("div",{className:"hr"}),i().createElement("div",{className:"panel-form-column"},i().createElement("div",{className:"panel-form-row"},i().createElement("label",null,i().createElement(n.FormattedMessage,{id:"label_muting_topic",defaultMessage:"Muted:",description:"Label for Muting/unmuting the topic"})),i().createElement(c.default,{name:"P",checked:this.state.muted,onChange:this.handleMuted})),i().createElement(n.FormattedMessage,{id:"action_more",defaultMessage:"More",description:"Action for showing more content"},(e=>i().createElement(g.default,{title:e,open:this.state.moreInfoExpanded,onToggle:this.handleMoreInfo}))),this.state.moreInfoExpanded?i().createElement("div",{className:"panel-form-column"},i().createElement("div",{className:"panel-form-row"},i().createElement("label",null,i().createElement(n.FormattedMessage,{id:"label_user_id"})),i().createElement("tt",null,this.state.address)),this.state.groupTopic?i().createElement("div",{className:"panel-form-row"},i().createElement("label",null,i().createElement(n.FormattedMessage,{id:"label_your_permissions",defaultMessage:"Your permissions:",description:"Label for current user permissions"})),i().createElement("tt",{className:"clickable",onClick:this.handleLaunchPermissionsEditor.bind(this,"want")},this.state.access)):i().createElement("div",null,i().createElement("div",null,i().createElement("label",{className:"small"},i().createElement(n.FormattedMessage,{id:"label_permissions",defaultMessage:"Permissions:",description:"Section title"}))),i().createElement("div",{className:"quoted"},i().createElement("div",null,i().createElement(n.FormattedMessage,{id:"label_you",defaultMessage:"You:",description:"Label for the current user"})," ",i().createElement("tt",{className:"clickable",onClick:this.handleLaunchPermissionsEditor.bind(this,"want")},this.state.access)),i().createElement("div",null,this.state.fullName?this.state.fullName:e(w.other_user),": ",i().createElement("tt",{className:"clickable",onClick:this.handleLaunchPermissionsEditor.bind(this,"given")},this.state.modeGiven2)))),this.state.sharer&&(this.state.auth||this.state.anon)?i().createElement("div",null,i().createElement("div",null,i().createElement("label",{className:"small"},i().createElement(n.FormattedMessage,{id:"label_default_access",defaultMessage:"Default access mode:",description:"Section title"}))),i().createElement("div",{className:"quoted"},i().createElement("div",null,"Auth: ",this.state.admin?i().createElement("tt",{className:"clickable",onClick:this.handleLaunchPermissionsEditor.bind(this,"auth")},this.state.auth):i().createElement("tt",null,this.state.auth)),i().createElement("div",null,"Anon: ",this.state.admin?i().createElement("tt",{className:"clickable",onClick:this.handleLaunchPermissionsEditor.bind(this,"anon")},this.state.anon):i().createElement("tt",null,this.state.anon)))):null):null),i().createElement("div",{className:"hr"}),this.state.owner?i().createElement(i().Fragment,null,i().createElement(n.FormattedMessage,{id:"title_tag_manager"},(e=>i().createElement(b.default,{title:e,tags:this.state.tags,activated:!1,tinode:this.props.tinode,onSubmit:this.handleTagsUpdated}))),i().createElement("div",{className:"hr"})):null,i().createElement("div",{className:"panel-form-column"},this.state.channel?null:i().createElement("a",{href:"#",className:"flat-button",onClick:this.handleDeleteMessages},i().createElement("i",{className:"material-icons"},"delete_outline")," ",e(this.state.deleter?w.delete_messages:w.clear_messages)),i().createElement("a",{href:"#",className:"red flat-button",onClick:this.handleLeave},i().createElement("i",{className:"material-icons"},"exit_to_app")," ",e(w.leave_chat)),this.state.groupTopic?null:i().createElement("a",{href:"#",className:"red flat-button",onClick:this.handleBlock},i().createElement("i",{className:"material-icons"},"block")," ",e(w.block_contact)),this.state.owner?null:i().createElement("a",{href:"#",className:"red flat-button",onClick:this.handleReport},i().createElement("i",{className:"material-icons"},"report")," ",e(w.report_chat))),this.state.groupTopic&&this.state.sharer?i().createElement(i().Fragment,null,i().createElement("div",{className:"hr"}),i().createElement("div",{className:"panel-form-column"},i().createElement("div",{className:"panel-form-row"},i().createElement("label",{className:"small"},i().createElement(n.FormattedMessage,{id:"label_group_members",defaultMessage:"Group members:",description:"Section title or label"}))),i().createElement("div",{className:"panel-form-row"},i().createElement("a",{href:"#",className:"flat-button",onClick:this.handleShowAddMembers},i().createElement("i",{className:"material-icons"},"person_add")," ",i().createElement(n.FormattedMessage,{id:"button_add_members",defaultMessage:"Add members",description:"Flat button [Add members] (to topic)"}))),i().createElement(n.FormattedMessage,{id:"group_has_no_members",defaultMessage:"No members",description:"Shown in place of group members"},(e=>i().createElement(d.default,{contacts:this.state.contactList,myUserId:this.props.myUserId,emptyListMessage:e,topicSelected:this.state.selectedContact,showOnline:!1,showUnread:!1,showMode:!0,noScroll:!0,onTopicSelected:this.handleMemberSelected,showContextMenu:!!this.state.admin&&this.handleContextMenu}))))):null))}}t.default=(0,n.injectIntl)(S)},"./src/views/login-view.jsx":function(e,t,s){s.r(t),s.d(t,{default:function(){return c}});var a=s("react"),i=s.n(a),n=s("react-intl"),o=s("./src/widgets/checkbox.jsx"),r=s("./src/widgets/visible-password.jsx"),l=s("./src/lib/local-storage.js");class c extends i().Component{constructor(e){super(e),this.state={login:e.login,password:"",hostName:e.serverAddress,saveToken:l.default.getObject("keep-logged-in")},this.handleLoginChange=this.handleLoginChange.bind(this),this.handlePasswordChange=this.handlePasswordChange.bind(this),this.handleToggleSaveToken=this.handleToggleSaveToken.bind(this),this.handleSubmit=this.handleSubmit.bind(this)}handleLoginChange(e){this.setState({login:e.target.value})}handlePasswordChange(e){this.setState({password:e.target.value})}handleToggleSaveToken(){l.default.setObject("keep-logged-in",!this.state.saveToken),this.setState({saveToken:!this.state.saveToken})}handleSubmit(e){e.preventDefault(),this.props.onLogin(this.state.login.trim(),this.state.password.trim())}render(){var e="blue";return this.props.disabled&&(e+=" disabled"),i().createElement("form",{id:"login-form",onSubmit:this.handleSubmit},i().createElement(n.FormattedMessage,{id:"login_prompt",defaultMessage:"Login",description:"Login placeholder in LoginView"},(e=>i().createElement("input",{type:"text",id:"inputLogin",placeholder:e,autoComplete:"username",autoCorrect:"off",autoCapitalize:"none",value:this.state.login,onChange:this.handleLoginChange,required:!0,autoFocus:!0}))),i().createElement(n.FormattedMessage,{id:"password_prompt",defaultMessage:"Password",description:"Password placeholder in LoginView"},(e=>i().createElement(r.default,{type:"password",id:"inputPassword",placeholder:e,autoComplete:"current-password",value:this.state.password,onChange:this.handlePasswordChange,required:!0}))),i().createElement("div",{className:"panel-form-row"},i().createElement(o.default,{id:"save-token",name:"save-token",checked:this.state.saveToken,onChange:this.handleToggleSaveToken}),i().createElement("label",{htmlFor:"save-token"}," ",i().createElement(n.FormattedMessage,{id:"stay_logged_in",defaultMessage:"Stay logged in",description:"Label for a checkbox"})),i().createElement("a",{href:"#reset"},i().createElement(n.FormattedMessage,{id:"forgot_password_link",defaultMessage:"Forgot password?",description:"Link to Reset password form"}))),i().createElement("div",{className:"dialog-buttons"},i().createElement("button",{className:e,type:"submit"},i().createElement(n.FormattedMessage,{id:"button_sign_in",defaultMessage:"Sign in",description:"Button [Sign In]"}))))}}},"./src/views/logo-view.jsx":function(e,t,s){s.r(t),s.d(t,{default:function(){return c}});var a=s("react"),i=s.n(a),n=s("react-intl"),o=s("tinode-sdk"),r=s.n(o),l=s("./src/config.js");class c extends i().PureComponent{render(){const e=l.APP_NAME+" ("+r().getLibrary()+")";return i().createElement("div",{id:"dummy-view"},i().createElement("div",null,i().createElement("a",{href:"https://github.com/tinode/chat/"},i().createElement("img",{id:"logo",alt:"logo",src:"img/logo.svg"}),i().createElement("h2",null,"Tinode Web")),i().createElement("p",null,i().createElement(n.FormattedMessage,{id:"label_client",defaultMessage:"Client:"})," ",e),i().createElement("p",null,i().createElement(n.FormattedMessage,{id:"label_server",defaultMessage:"Server:"})," ",this.props.serverVersion," (",this.props.serverAddress,")")))}}},"./src/views/messages-view.jsx":function(e,t,s){s.r(t);var a=s("react"),i=s.n(a),n=s("react-intl"),o=s("tinode-sdk"),r=s.n(o),l=s("./src/widgets/chat-message.jsx"),c=s("./src/widgets/doc-preview.jsx"),d=s("./src/widgets/error-panel.jsx"),h=s("./src/widgets/group-subs.jsx"),p=s("./src/widgets/image-preview.jsx"),m=s("./src/widgets/invitation.jsx"),u=s("./src/widgets/letter-tile.jsx"),g=s("./src/widgets/load-spinner.jsx"),_=s("./src/views/logo-view.jsx"),b=s("./src/widgets/send-message.jsx"),f=s("./src/config.js"),v=s("./src/lib/blob-helpers.js"),E=s("./src/lib/navigation.js"),w=s("./src/lib/strformat.js");const S=r().Drafty,C=(0,n.defineMessages)({online_now:{id:"online_now",defaultMessage:"online now",description:"Indicator that the user or topic is currently online"},last_seen:{id:"last_seen_timestamp",defaultMessage:"Last seen",description:"Label for the timestamp of when the user or topic was last online"},not_found:{id:"title_not_found",defaultMessage:"Not found",description:"Title shown when topic is not found"},channel:{id:"channel",defaultMessage:"channel",description:"Subtitle shown for channels in MessagesView instead of last seen"}});function M(e){if(e){const t=e.getExcessive()||"";return e.isJoiner("given")&&(t.includes("R")||t.includes("W"))}return!1}function k(e){if(e){const t=e.getMissing()||"";return e.isJoiner("want")&&(t.includes("R")||t.includes("W"))}return!1}class T extends i().Component{constructor(e){super(e),this.state=T.getDerivedStateFromProps(e,{}),this.leave=this.leave.bind(this),this.sendImageAttachment=this.sendImageAttachment.bind(this),this.sendFileAttachment=this.sendFileAttachment.bind(this),this.sendKeyPress=this.sendKeyPress.bind(this),this.handleScrollReference=this.handleScrollReference.bind(this),this.handleScrollEvent=this.handleScrollEvent.bind(this),this.handleDescChange=this.handleDescChange.bind(this),this.handleSubsUpdated=this.handleSubsUpdated.bind(this),this.handleNewMessage=this.handleNewMessage.bind(this),this.handleAllMessagesReceived=this.handleAllMessagesReceived.bind(this),this.handleInfoReceipt=this.handleInfoReceipt.bind(this),this.handleImagePostview=this.handleImagePostview.bind(this),this.handleClosePreview=this.handleClosePreview.bind(this),this.handleFormResponse=this.handleFormResponse.bind(this),this.handleContextClick=this.handleContextClick.bind(this),this.handleShowContextMenuMessage=this.handleShowContextMenuMessage.bind(this),this.handleNewChatAcceptance=this.handleNewChatAcceptance.bind(this),this.handleEnablePeer=this.handleEnablePeer.bind(this),this.handleAttachFile=this.handleAttachFile.bind(this),this.handleAttachImage=this.handleAttachImage.bind(this),this.handleCancelUpload=this.handleCancelUpload.bind(this),this.postReadNotification=this.postReadNotification.bind(this),this.clearNotificationQueue=this.clearNotificationQueue.bind(this),this.readNotificationQueue=[],this.readNotificationTimer=null}componentDidMount(){this.messagesScroller&&this.messagesScroller.addEventListener("scroll",this.handleScrollEvent)}componentWillUnmount(){this.messagesScroller&&this.messagesScroller.removeEventListener("scroll",this.handleScrollEvent),this.clearNotificationQueue()}componentDidUpdate(e,t){this.messagesScroller&&(t.topic!=this.state.topic||t.messages.length!=this.state.messages.length?this.messagesScroller.scrollTop=this.messagesScroller.scrollHeight-this.state.scrollPosition:e.viewportHeight>this.props.viewportHeight&&(this.messagesScroller.scrollTop+=e.viewportHeight-this.props.viewportHeight));const s=this.props.tinode.getTopic(this.state.topic);if(this.state.topic!=t.topic&&(t.topic&&!r().isNewGroupTopicName(t.topic)&&this.leave(t.topic),s&&(s.onData=this.handleNewMessage,s.onAllMessagesReceived=this.handleAllMessagesReceived,s.onInfo=this.handleInfoReceipt,s.onMetaDesc=this.handleDescChange,s.onSubsUpdated=this.handleSubsUpdated,s.onPres=this.handleSubsUpdated)),this.props.applicationVisible?this.postReadNotification(0):this.clearNotificationQueue(),s&&!s.isSubscribed()&&this.props.ready&&(this.state.topic!=t.topic||!e.ready)){const e=this.props.newTopicParams&&this.props.newTopicParams._topicName==this.props.topic;let t=s.startMetaQuery().withLaterDesc();(this.state.isSharer||e&&!s.isChannel())&&(t=t.withLaterSub()),(this.state.isReader||e)&&(t=t.withLaterData(f.MESSAGES_PAGE),this.state.isReader&&(t=t.withLaterDel()),this.setState({fetchingMessages:!0}));const a=e?this.props.newTopicParams:void 0;s.subscribe(t.build(),a).then((e=>{303!=e.code?(this.state.topic!=e.topic&&this.setState({topic:e.topic}),this.props.onNewTopicCreated(this.props.topic,e.topic),s.queuedMessages((e=>{!e._sending&&s.isSubscribed()&&s.publishMessage(e)}))):E.default.navigateTo(E.default.setUrlTopic("",e.params.topic))})).catch((e=>{console.log("Failed subscription to",this.state.topic),this.props.onError(e.message,"err");const t=T.getDerivedStateFromProps({},{});t.title=this.props.intl.formatMessage(C.not_found),this.setState(t)}))}}static getDerivedStateFromProps(e,t){let s={};if(e.topic){if(e.topic!=t.topic){const a=e.tinode.getTopic(e.topic);if(s={topic:e.topic,docPreview:null,imagePreview:null,imagePostview:null,typingIndicator:!1,scrollPosition:0,fetchingMessages:!1},a){const i=[],n=[];e.connected&&a.subscribers((t=>{t.online&&t.user!=e.myUserId&&n.push(t)})),a.messages((function(e){e.deleted||i.push(e)})),Object.assign(s,{messages:i,onlineSubs:n}),a.public?Object.assign(s,{title:a.public.fn,avatar:(0,v.makeImageUrl)(a.public.photo)}):Object.assign(s,{title:"",avatar:null});const o=a.p2pPeerDesc();o?Object.assign(s,{peerMessagingDisabled:k(o.acs)}):t.peerMessagingDisabled&&Object.assign(s,{peerMessagingDisabled:!1}),Object.assign(s,{channel:a.isChannel()})}else Object.assign(s,{messages:[],onlineSubs:[],title:"",avatar:null,peerMessagingDisabled:!1,channel:!1})}}else s={messages:[],onlineSubs:[],topic:null,title:"",avatar:null,docPreview:null,imagePreview:null,imagePostview:null,typingIndicator:!1,scrollPosition:0,fetchingMessages:!1,peerMessagingDisabled:!1,channel:!1};return e.acs?(e.acs.isWriter()!=t.isWriter&&(s.isWriter=!t.isWriter),e.acs.isReader()!=t.isReader&&(s.isReader=!t.isReader),!e.acs.isReader("given")!=t.readingBlocked&&(s.readingBlocked=!t.readingBlocked),e.acs.isSharer()!=t.isSharer&&(s.isSharer=!t.isSharer)):(t.isWriter&&(s.isWriter=!1),t.isReader&&(s.isReader=!1),t.readingBlocked||(t.readingBlocked=!0),t.isSharer&&(s.isSharer=!1)),M(e.acs)==!t.unconformed&&(s.unconfirmed=!t.unconformed),!e.connected&&t.onlineSubs&&t.onlineSubs.length>0&&(s.onlineSubs=[]),s}leave(e){if(!e)return;let t=this.props.tinode.getTopic(e);t&&t.isSubscribed()&&t.leave(!1).catch((()=>{})).finally((()=>{this.setState({fetchingMessages:!1}),t.onData=void 0,t.onAllMessagesReceived=void 0,t.onInfo=void 0,t.onMetaDesc=void 0,t.onSubsUpdated=void 0,t.onPres=void 0}))}handleScrollReference(e){e&&(e.addEventListener("scroll",this.handleScrollEvent),this.messagesScroller=e,this.messagesScroller.scrollTop=this.messagesScroller.scrollHeight-this.state.scrollPosition)}handleScrollEvent(e){this.setState({scrollPosition:e.target.scrollHeight-e.target.scrollTop}),e.target.scrollTop<=0&&this.setState(((e,t)=>{const s={};if(!e.fetchingMessages){const e=this.props.tinode.getTopic(this.state.topic);e&&e.isSubscribed()&&e.msgHasMoreMessages()&&(s.fetchingMessages=!0,e.getMessagesPage(f.MESSAGES_PAGE).catch((e=>{this.setState({fetchingMessages:!1}),this.props.onError(e.message,"err")})))}return s}))}handleDescChange(e){e.public?this.setState({title:e.public.fn,avatar:(0,v.makeImageUrl)(e.public.photo)}):this.setState({title:"",avatar:null}),e.acs&&this.setState({isWriter:e.acs.isWriter(),isReader:e.acs.isReader(),readingBlocked:!e.acs.isReader("given"),unconfirmed:M(e.acs)})}postReadNotification(e){if(!this.props.applicationVisible)return;this.readNotificationTimer||(this.readNotificationTimer=setInterval((()=>{if(0==this.readNotificationQueue.length)return clearInterval(this.readNotificationTimer),void(this.readNotificationTimer=null);let e=-1;for(;this.readNotificationQueue.length>0;){const t=this.readNotificationQueue[0];if(t.topicName!=this.state.topic){this.readNotificationQueue.shift();continue}const s=new Date;if(!(t.sendAt<=s))break;this.readNotificationQueue.shift(),e=Math.max(e,t.seq)}if(e>=0){const t=this.props.tinode.getTopic(this.state.topic);t&&t.noteRead(e)}}),300));const t=new Date;this.readNotificationQueue.push({topicName:this.state.topic,seq:e,sendAt:t.setMilliseconds(t.getMilliseconds()+f.READ_DELAY)})}clearNotificationQueue(){this.readNotificationQueue=[],this.readNotificationTimer&&(clearInterval(this.readNotificationTimer),this.readNotificationTimer=null)}handleSubsUpdated(){if(this.state.topic){const e=[],t=this.props.tinode.getTopic(this.state.topic);t.subscribers((t=>{t.online&&t.user!=this.props.myUserId&&e.push(t)}));const s={onlineSubs:e},a=t.p2pPeerDesc();a?Object.assign(s,{peerMessagingDisabled:k(a.acs)}):this.state.peerMessagingDisabled&&Object.assign(s,{peerMessagingDisabled:!1}),this.setState(s)}}handleNewMessage(e){const t=this.props.tinode.getTopic(this.state.topic),s={messages:[]};if(t.messages((e=>{e.deleted||s.messages.push(e)})),e&&!e.deleted){t.isNewMessage(e.seq)&&(s.scrollPosition=0);t.msgStatus(e)>=r().MESSAGE_STATUS_SENT&&e.from!=this.props.myUserId&&this.postReadNotification(e.seq),this.props.onData(e)}this.setState(s)}handleAllMessagesReceived(e){this.setState({fetchingMessages:!1}),e>0&&this.postReadNotification(0)}handleInfoReceipt(e){switch(e.what){case"kp":clearTimeout(this.keyPressTimer);var t=this;this.keyPressTimer=setTimeout((function(){t.setState({typingIndicator:!1})}),f.KEYPRESS_DELAY+1e3),this.state.typingIndicator||this.setState({typingIndicator:!0});break;case"read":case"recv":this.forceUpdate();break;default:console.log("Other change in topic: ",e.what)}}handleImagePostview(e){this.setState({imagePostview:e})}handleClosePreview(){this.state.imagePreview&&this.state.imagePreview.url&&URL.revokeObjectURL(this.state.imagePreview.url),this.setState({imagePostview:null,imagePreview:null,docPreview:null})}handleFormResponse(e,t,s){if("pub"==e)this.props.sendMessage(S.attachJSON(S.parse(t),s));else if("url"==e){const e=new URL(s.ref),t=e.searchParams;for(let e in s.resp)s.resp.hasOwnProperty(e)&&t.set(e,s.resp[e]);["name","seq"].map((function(e){s[e]&&t.set(e,s[e])})),t.set("uid",this.props.myUserId),e.search=t,window.open(e,"_blank")}else console.log("Unknown action in form",e)}handleContextClick(e){e.preventDefault(),e.stopPropagation(),this.props.showContextMenu({topicName:this.state.topic,y:e.pageY,x:e.pageX})}handleShowContextMenuMessage(e,t){e.topicName=this.state.topic;const s=t||[],a=this.props.tinode.getTopic(e.topicName);if(a){a.isChannel()||s.push("message_delete");const e=a.getAccessMode();e&&e.isDeleter()&&s.push("message_delete_hard")}this.props.showContextMenu(e,s)}handleNewChatAcceptance(e){this.props.onNewChat(this.state.topic,e)}handleEnablePeer(e){e.preventDefault(),this.props.onChangePermissions(this.state.topic,f.DEFAULT_P2P_ACCESS_MODE,this.state.topic)}sendKeyPress(){const e=this.props.tinode.getTopic(this.state.topic);e.isSubscribed()&&e.noteKeyPress()}sendFileAttachment(e){const t=.75*this.props.tinode.getServerLimit("maxMessageSize",f.MAX_INBAND_ATTACHMENT_SIZE)-1024|0;if(e.size>t){const t=this.props.tinode.getLargeFileHelper();if(!t)return void this.props.onError(this.props.intl.formatMessage(C.cannot_initiate_upload));const s=t.upload(e),a=S.attachFile(null,{mime:e.type,filename:e.name,size:e.size,urlPromise:s});this.props.sendMessage(a,s,t)}else(0,v.fileToBase64)(e,((e,t,s)=>{this.props.sendMessage(S.attachFile(null,{mime:e,data:t,filename:s}))}),this.props.onError)}handleAttachFile(e){const t=this.props.tinode.getServerLimit("maxFileUploadSize",f.MAX_EXTERN_ATTACHMENT_SIZE);e.size>t?this.props.onError(this.props.intl.formatMessage({id:"file_attachment_too_large"},{size:(0,w.bytesToHumanSize)(e.size),limit:(0,w.bytesToHumanSize)(t)}),"err"):this.setState({docPreview:{file:e,filename:e.name,size:e.size,type:e.type}})}sendImageAttachment(e,t){const s=this.state.imagePreview.type,a=this.state.imagePreview.width,i=this.state.imagePreview.height,n=this.state.imagePreview.filename,o=.75*this.props.tinode.getServerLimit("maxMessageSize",f.MAX_INBAND_ATTACHMENT_SIZE)-1024|0;if(t.size>o){const o=this.props.tinode.getLargeFileHelper();if(!o)return void this.props.onError(this.props.intl.formatMessage(C.cannot_initiate_upload));const r=o.upload(t);(0,v.imageScaled)(t,f.IMAGE_PREVIEW_DIM,f.IMAGE_PREVIEW_DIM,-1,!1,(l=>{(0,v.blobToBase64)(l,((l,c)=>{let d=S.insertImage(null,0,{mime:s,_tempPreview:c,width:a,height:i,filename:n,size:t.size,urlPromise:r});e&&(d=S.appendLineBreak(d),d=S.append(d,S.init(e))),this.props.sendMessage(d,r,o)}))}),(e=>{this.props.onError(e,"err")}))}else(0,v.blobToBase64)(t,((s,o)=>{let r=S.insertImage(null,0,{mime:s,preview:o,width:a,height:i,filename:n,size:t.size});e&&(r=S.appendLineBreak(r),r=S.append(r,S.init(e))),this.props.sendMessage(r)}))}handleAttachImage(e){const t=this.props.tinode.getServerLimit("maxFileUploadSize",f.MAX_EXTERN_ATTACHMENT_SIZE);(0,v.imageScaled)(e,f.MAX_IMAGE_DIM,f.MAX_IMAGE_DIM,t,!1,((e,t,s,a,i)=>{this.setState({imagePreview:{url:URL.createObjectURL(e),blob:e,filename:i,width:s,height:a,size:e.size,type:t}})}),(e=>{this.props.onError(e,"err")}))}handleCancelUpload(e,t){const s=this.state.messages.find((t=>t.seq==e));s&&(s._cancelled=!0),t.cancel()}render(){const{formatMessage:e}=this.props.intl;let t;if(this.props.hideSelf)t=null;else if(this.state.topic){let s;if(this.state.imagePreview)s=i().createElement(p.default,{content:this.state.imagePreview,onClose:this.handleClosePreview,onSendMessage:this.sendImageAttachment});else if(this.state.imagePostview)s=i().createElement(p.default,{content:this.state.imagePostview,onClose:this.handleClosePreview});else if(this.state.docPreview)s=i().createElement(c.default,{content:this.state.docPreview,onClose:this.handleClosePreview,onSendMessage:this.sendFileAttachment});else{const t=this.props.tinode.getTopic(this.state.topic),a=t.isChannel(),o="grp"==t.getType()&&!a;let c=[],p=null,_=null;for(let e=0;e{e.preventDefault(),this.props.onClose()}},i().createElement("i",{className:"material-icons gray"},"close"))),i().createElement("div",{id:"image-preview-container"},i().createElement("div",{className:"flex-column narrow"},i().createElement("i",{className:"material-icons gray"},function(e){const t={default:"insert_drive_file",image:"image",text:"description",video:"theaters"};return t[e]||t[(e||"").split("/")[0]]||t.default}(this.props.content.type)),i().createElement("div",null,i().createElement("b",null,i().createElement(n.FormattedMessage,{id:"label_content_type"}))," ",this.props.content.type||"application/octet-stream"),i().createElement("div",null,i().createElement("b",null,i().createElement(n.FormattedMessage,{id:"label_size"}))," ",(0,r.bytesToHumanSize)(this.props.content.size)))),i().createElement(o.default,{noInput:!0,onSendMessage:this.handleSendDoc,onError:this.props.onError})):null}}},"./src/widgets/error-panel.jsx":function(e,t,s){s.r(t),s.d(t,{default:function(){return o}});var a=s("react"),i=s.n(a),n=s("./src/widgets/menu-cancel.jsx");class o extends i().PureComponent{constructor(e){super(e),this.state={show:!1},this.hide=this.hide.bind(this)}componentDidUpdate(e){e.level!==this.props.level&&this.setState({show:!!this.props.level})}hide(){this.setState({show:!1}),this.props.onClearError&&this.props.onClearError()}render(){const e={err:"error",warn:"warning",info:"info"}[this.props.level]||"",t="info-box "+e;return i().createElement("div",{className:t},i().createElement("div",{className:"icon"},i().createElement("i",{className:"material-icons"},e)),i().createElement("span",null,this.props.text,this.props.action?i().createElement(i().Fragment,null,i().createElement("a",{href:"#",style:{whiteSpace:"nowrap"},onClick:e=>{e.preventDefault(),this.props.action()}},this.props.actionText)):null),i().createElement("div",{className:"cancel"},i().createElement(n.default,{onCancel:this.hide})))}}},"./src/widgets/file-progress.jsx":function(e,t,s){s.r(t),s.d(t,{default:function(){return o}});var a=s("react"),i=s.n(a),n=s("react-intl");class o extends i().PureComponent{render(){return i().createElement("div",{className:"uploader"},i().createElement("div",null,i().createElement("span",{style:{width:100*this.props.progress+"%"}})),this.props.progress<.999?i().createElement("a",{href:"#",onClick:e=>{e.preventDefault(),this.props.onCancel()}},i().createElement("i",{className:"material-icons"},"close")," ",i().createElement(n.FormattedMessage,{id:"action_cancel",defaultMessage:"cancel",description:"Call to action [cancel]"})):i().createElement(n.FormattedMessage,{id:"upload_finishing",defaultMessage:"finishing...",description:"Notification that upload is finishing"}))}}},"./src/widgets/group-manager.jsx":function(e,t,s){s.r(t);var a=s("react"),i=s.n(a),n=s("react-intl"),o=s("./src/widgets/chip-input.jsx"),r=s("./src/widgets/contact-list.jsx");const l=(0,n.defineMessages)({no_contacts:{id:"no_contacts",defaultMessage:"You have no contacts :-(",description:"Shown in ContactsView when the user has no contacts"},contacts_not_found_short:{id:"contacts_not_found_short",defaultMessage:"No contacts match ''{query}''",description:"Shown in ContactsView when search returned no results"}});class c extends i().Component{constructor(e){super(e),this.state={members:e.members,index:c.indexMembers(e.members),staticMembers:c.staticMembers(e.members,e.keepInitialMembers,e.requiredMember),contactFilter:"",noContactsMessage:e.intl.formatMessage(l.no_contacts),selectedContacts:c.selectedContacts(e.members)},this.handleContactSelected=this.handleContactSelected.bind(this),this.handleMemberRemoved=this.handleMemberRemoved.bind(this),this.handleContactFilter=this.handleContactFilter.bind(this),this.handleSubmit=this.handleSubmit.bind(this),this.handleCancel=this.handleCancel.bind(this)}static indexMembers(e){let t={};return e.map((e=>{t[e.user]={delta:0,present:!0}})),t}static staticMembers(e,t,s){let a=[];return e.map((e=>{(t||e.user==s)&&a.push(e.user)})),a}static selectedContacts(e){let t=[];return e.map((e=>{t.push(e.user)})),t}handleContactSelected(e,t){let s=this.state.index[e];if(s){if(s.present)return;s.delta+=1,s.present=!0}else s={delta:1,present:!0};let a=this.state.members.slice();a.push(this.props.contacts[t]);const i=c.selectedContacts(a),n=this.state.index;n[e]=s,this.setState({members:a,index:n,selectedContacts:i})}handleMemberRemoved(e,t){const s=this.state.index[e];if(!s||!s.present)return;s.present=!1,s.delta-=1;let a=this.state.members.slice();a.splice(t,1);const i=c.selectedContacts(a),n=this.state.index;n[e]=s,this.setState({members:a,index:n,selectedContacts:i})}handleContactFilter(e){const{formatMessage:t}=this.props.intl,s=e?t(l.contacts_not_found_short,{query:e}):t(l.no_contacts);this.setState({contactFilter:e,noContactsMessage:s})}static doContactFiltering(e,t){if(e){for(let s=0;s
¯∖_(ツ)_/¯","full_name_prompt":"Vollständiger Name, z.B. Lisa Musterfrau","email_prompt":"E-Mail, z.B. jdoe@beispiel.de","button_sign_up":"Anmelden","label_your_name":"Ihr Name","label_user_id":"ID:","button_edit":"Bearbeiten","requested_permissions":"Angefordert","granted_permissions":"Erteilt","menu_item_edit_permissions":"Berechtigungen ändern","label_other_user":"Andere","action_clear_messages":"Nachrichten leeren","clear_messages_warning":"Sind Sie sicher, dass Sie diese Unterhaltung für alle leeren wollen? Das kann nicht rückgängig gemacht werden.","action_delete_messages":"Nachrichten für alle löschen","delete_messages_warning":"Sind Sie sicher, dass Sie diese Unterhaltung für alle löschen wollen? Das kann nicht rückgängig gemacht werden.","action_leave_chat":"Unterhaltung verlassen","leave_chat_warning":"Möchten Sie diese Unterhaltung wirklich verlassen?","action_block_contact":"Kontakt blockieren","block_contact_warning":"Möchten Sie diesen Kontakt wirklich blockieren?","action_report_chat":"Unterhaltung melden","report_chat_warning":"Möchten Sie diese Unterhaltung wirklich blockieren und melden?","title_info":"Info","label_topic_name":"Name","label_private":"Privater Kommentar","private_editing_placeholder":"Nur für Sie sichtbar","label_muting_topic":"Stumm geschaltet:","action_more":"Mehr","label_your_permissions":"Ihre Berechtigungen:","label_permissions":"Berechtigungen:","label_you":"Sie:","label_default_access":"Standard Zugriffsmodus:","label_group_members":"Gruppenmitglieder:","button_add_members":"Mitglieder hinzufügen","group_has_no_members":"Keine Mitglieder","login_prompt":"Anmelden","password_prompt":"Passwort","stay_logged_in":"Angemeldet bleiben","forgot_password_link":"Passwort vergessen?","button_sign_in":"Anmelden","label_client":"Client:","label_server":"Server:","online_now":"jetzt online","last_seen_timestamp":"Zuletzt gesehen","title_not_found":"Nicht gefunden","unnamed_topic":"Unbenannt","messages_not_readable":"Neue Nachrichten können nicht gelesen werden","peers_messaging_disabled":"Gruppennachrichten sind deaktiviert","enable_peers_messaging":"Aktivieren","search_for_contacts":"Nutzen Sie die Suche um Kontakte zu finden","search_no_results":"Die Suche hatte keine Ergebnisse","tabtitle_find_user":"Suchen","tabtitle_new_group":"Neue Gruppe","tabtitle_group_by_id":"nach ID","new_password_placeholder":"Geben Sie ein neues Passwort ein","label_reset_password":"Passwort per E-Mail wiederherstellen:","credential_email_prompt":"E-Mail Adresse für Registrierung","button_reset":"Zurücksetzen","button_send_request":"Anfrage senden","label_server_to_use":"Server verwenden:","label_wire_transport":"Übertragung per Kabel:","button_update":"Aktualisieren","sidepanel_title_login":"Anmelden","sidepanel_title_register":"Konto erstellen","sidepanel_title_settings":"Einstellungen","sidepanel_title_account_settings":"Konto-Einstellungen","sidepanel_title_acc_general":"Allgemein","sidepanel_title_acc_security":"Sicherheit","sidepanel_title_acc_notifications":"Benachrichtigungen","sidepanel_title_acc_support":"Unterstützung","sidepanel_title_newtpk":"Neue Unterhaltung starten","sidepanel_title_cred":"Anmeldeinformationen bestätigen","sidepanel_title_reset":"Passwort zurücksetzen","sidepanel_title_archive":"Archivierte Unterhaltungen","sidepanel_title_blocked":"Blockierte Unterhaltungen","reconnect_countdown":"Getrennt. Wiederverbinden in {seconds}…","reconnect_now":"Jetzt probieren","push_init_failed":"Initialisierung von Push-Benachrichtigungen fehlgeschlagen","invalid_security_token":"Ungültiger Sicherheitsschlüssel","no_connection":"Keine Verbindung","code_doesnot_match":"Code stimmt nicht überein","update_available":"Aktualisierung verfügbar.","reload_update":"Neu laden","phone_dative":"Telefon","email_dative":"E-Mail","enter_confirmation_code_prompt":"Geben Sie den Bestätigungscode ein, der per {method} geschickt wurde:","numeric_confirmation_code_prompt":"Nur zahlen","button_confirm":"Bestätigen","save_attachment":"Speichern","deleted_content":"Inhalt gelöscht","invalid_content":"ungültiger Inhalt","user_not_found":"Nicht gefunden","badge_you":"Sie","badge_owner":"Besitzer","menu_item_info":"Info","menu_item_clear_messages":"Nachrichten leeren","menu_item_clear_messages_for_all":"Für alle leeren","menu_item_delete":"Löschen","menu_item_delete_for_all":"Für alle löschen","menu_item_send_retry":"Wiederholen","menu_item_mute":"Unterhaltung stumm schalten","menu_item_unmute":"Stumm schalten beenden","menu_item_delete_topic":"Entfernen","topic_delete_warning":"Möchten Sie diese Unterhaltung wirklich löschen?","menu_item_unblock":"Blockierung aufheben","menu_item_block":"Blockieren","topic_block_warning":"Möchten Sie diese Unterhaltung wirklich blockieren?","menu_item_member_delete":"Entfernen","menu_item_archive_topic":"Archivieren","action_cancel":"Abbrechen","upload_finishing":"wird abgeschlossen...","no_contacts":"Sie haben keine Kontakte :-(","contacts_not_found_short":"Keine Kontakte für \'\'{query}\'\'","title_group_members":"Gruppenmitglieder","title_all_contacts":"Alle Kontakte","button_ok":"OK","button_cancel":"Abbrechen","more_online_members":"+{overflow} mehr","download_action":"herunterladen","label_file_name":"Dateiname:","label_content_type":"Inhaltsart:","label_size":"Größe:","chat_invitation":"Sie sind eingeladen, an einem neuen Chat teilzunehmen. Was möchten Sie tun?","chat_invitation_accept":"Akzeptieren","chat_invitation_ignore":"Ignorieren","chat_invitation_block":"Blockieren","error_invalid_id":"ungültige ID","group_user_id_prompt":"Gruppe oder Benutzer ID","button_subscribe":"Abbonieren","topic_name_editing_placeholder":"Freiform Name der Gruppe","button_create":"Erstellen","permission_join":"Beitreten ({val})","permission_read":"Lesen ({val})","permission_write":"Schreiben ({val})","permission_pres":"Benachrichtigt werden ({val})","permission_admin":"Bestätigen ({val})","permission_share":"Teilen ({val})","permission_delete":"Entfernen ({val})","permission_owner":"Besitzer ({val})","title_permissions":"Berechtigungen","message_sending":"wird gesendet...","message_sending_failed":"fehlgeschlagen","search_placeholder":"Liste: email:lisa@beispiel.de, tel:17025550003...","messaging_disabled_prompt":"Nachrichtenübermittlung deaktiviert","new_message_prompt":"Neue Nachricht","image_caption_prompt":"Bildunterschrift","file_attachment_too_large":"Die Dateigröße {size} überschreitet das Limit von {limit}.","cannot_initiate_file_upload":"Datei kann nicht hochgeladen werden.","tags_not_found":"Keine Schlagworte definiert. Erstellen Sie welche.","tags_editor_no_tags":"Schlagworte hinzufügen","title_manage_tags":"Verwalten","channel_prompt":"Dies ist ein Sender","channel":"Sender"},"en":{"validate_credential_action":"confirm","title_tag_manager":"Tags (user discovery)","label_user_contacts":"Contacts:","button_add_another":"Add another","label_message_sound":"Message sound:","label_push_notifications":"Notification alerts:","label_push_notifications_disabled":"Notification alerts (requires HTTPS):","label_incognito_mode":"Incognito mode:","delete_account":"Delete account","delete_account_arning":"Are you sure you want to delete your account? It cannot be undone.","label_password":"Password","password_unchanged_prompt":"Unchanged","button_logout":"Logout","button_delete_account":"Delete account","label_default_access_mode":"Default access mode:","blocked_contacts_link":"Blocked contacts ({count})","link_contact_us":"Contact Us","link_terms_of_service":"Terms of Service","link_privacy_policy":"Privacy Policy","label_sdk":"SDK:","label_server_address":"Server address:","archived_contacts":"Archived contacts ({count})","contacts_not_found":"You have no chats
¯∖_(ツ)_/¯","full_name_prompt":"Full name, e.g. John Doe","email_prompt":"Email, e.g. jdoe@example.com","button_sign_up":"Sign up","label_your_name":"Your name","label_user_id":"ID:","button_edit":"Edit","requested_permissions":"Requested","granted_permissions":"Granted","menu_item_edit_permissions":"Edit permissions","label_other_user":"Other","action_clear_messages":"Clear Messages","clear_messages_warning":"Are you sure you want to clear all messages? It cannot be undone.","action_delete_messages":"Clear Messages for All","delete_messages_warning":"Are you sure you want to delete all messages for everyone? It cannot be undone.","action_leave_chat":"Leave Conversation","leave_chat_warning":"Are you sure you want to leave this conversation?","action_block_contact":"Block Contact","block_contact_warning":"Are you sure you want to block this contact?","action_report_chat":"Report Conversation","report_chat_warning":"Are you sure you want to block and report this conversation?","title_info":"Info","label_topic_name":"Name","label_private":"Private comment","private_editing_placeholder":"Visible to you only","label_muting_topic":"Muted:","action_more":"More","label_your_permissions":"Your permissions:","label_permissions":"Permissions:","label_you":"You:","label_default_access":"Default access mode:","label_group_members":"Group members:","button_add_members":"Add members","group_has_no_members":"No members","login_prompt":"Login","password_prompt":"Password","stay_logged_in":"Stay logged in","forgot_password_link":"Forgot password?","button_sign_in":"Sign in","label_client":"Client:","label_server":"Server:","online_now":"online now","last_seen_timestamp":"Last seen","title_not_found":"Not found","channel":"channel","unnamed_topic":"Unnamed","messages_not_readable":"no access to messages","peers_messaging_disabled":"Peer\'s messaging is disabled.","enable_peers_messaging":"Enable","search_for_contacts":"Use search to find contacts","search_no_results":"Search returned no results","tabtitle_find_user":"find","tabtitle_new_group":"new group","tabtitle_group_by_id":"by id","new_password_placeholder":"Enter new password","label_reset_password":"Send a password reset email:","credential_email_prompt":"Your registration email","button_reset":"Reset","button_send_request":"Send request","label_server_to_use":"Server to use:","label_wire_transport":"Wire transport:","button_update":"Update","sidepanel_title_login":"Sign In","sidepanel_title_register":"Create Account","sidepanel_title_settings":"Settings","sidepanel_title_account_settings":"Account Settings","sidepanel_title_acc_general":"General","sidepanel_title_acc_security":"Security","sidepanel_title_acc_notifications":"Notifications","sidepanel_title_acc_support":"Support","sidepanel_title_newtpk":"Start New Chat","sidepanel_title_cred":"Confirm Credentials","sidepanel_title_reset":"Reset Password","sidepanel_title_archive":"Archived Chats","sidepanel_title_blocked":"Blocked Chats","reconnect_countdown":"Disconnected. Reconnecting in {seconds}…","reconnect_now":"Try now","push_init_failed":"Failed to initialize push notifications","invalid_security_token":"Invalid security token","no_connection":"No connection","code_doesnot_match":"Code does not match","update_available":"Update available.","reload_update":"Reload","phone_dative":"phone","email_dative":"email","enter_confirmation_code_prompt":"Enter confirmation code sent to you by {method}:","numeric_confirmation_code_prompt":"Numbers only","button_confirm":"Confirm","save_attachment":"save","deleted_content":"content deleted","invalid_content":"invalid content","user_not_found":"Not found","badge_you":"you","badge_owner":"owner","menu_item_info":"Info","menu_item_clear_messages":"Clear messages","menu_item_clear_messages_for_all":"Clear for All","menu_item_delete":"Delete","menu_item_delete_for_all":"Delete for All","menu_item_send_retry":"Retry","menu_item_mute":"Mute","menu_item_unmute":"Unmute","menu_item_delete_topic":"Delete","topic_delete_warning":"Are you sure you want to delete this conversation?","menu_item_unblock":"Unblock","menu_item_block":"Block","topic_block_warning":"Are you sure you want to block this conversation?","menu_item_member_delete":"Remove","menu_item_archive_topic":"Archive","action_cancel":"cancel","upload_finishing":"finishing...","no_contacts":"You have no contacts :-(","contacts_not_found_short":"No contacts match \'\'{query}\'\'","title_group_members":"Group Members","title_all_contacts":"All Contacts","button_ok":"OK","button_cancel":"Cancel","more_online_members":"+{overflow} more","download_action":"download","label_file_name":"File name:","label_content_type":"Content type:","label_size":"Size:","chat_invitation":"You are invited to start a new chat. What would you like to do?","chat_invitation_accept":"Accept","chat_invitation_ignore":"Ignore","chat_invitation_block":"Block","error_invalid_id":"Invalid ID","group_user_id_prompt":"Group or User ID","button_subscribe":"Subscribe","topic_name_editing_placeholder":"Freeform name of the group","channel_prompt":"This is a channel","button_create":"Create","permission_join":"Join ({val})","permission_read":"Read ({val})","permission_write":"Write ({val})","permission_pres":"Get notified ({val})","permission_admin":"Approve ({val})","permission_share":"Share ({val})","permission_delete":"Delete ({val})","permission_owner":"Owner ({val})","title_permissions":"Permissions","message_sending":"sending...","message_sending_failed":"failed","search_placeholder":"List like email:alice@example.com, tel:17025550003...","messaging_disabled_prompt":"Messaging disabled","new_message_prompt":"New message","image_caption_prompt":"Image caption","file_attachment_too_large":"The file size {size} exceeds the {limit} limit.","cannot_initiate_file_upload":"Cannot initiate file upload.","tags_not_found":"No tags defined. Add some.","tags_editor_no_tags":"Add some tags","title_manage_tags":"Manage"},"es":{"validate_credential_action":"confirmar","title_tag_manager":"Etiquetas (descubrimiento de usuarios)","label_user_contacts":"Contactos:","button_add_another":"Añadir contacto","label_message_sound":"Sonido de mensaje:","label_push_notifications":"Alertas de notificaciones:","label_push_notifications_disabled":"Alertas de notificaciones (requiere HTTPS):","label_incognito_mode":"Modo incógnito:","delete_account":"Eliminar cuenta","delete_account_arning":"¿Estás seguro de que deseas eliminar permanentemente tu cuenta? Esta acción es irreversible.","label_password":"Contraseña","password_unchanged_prompt":"Sin cambios","button_logout":"Cerrar sesión","button_delete_account":"Eliminar cuenta","label_default_access_mode":"Modo de acceso predeterminado:","blocked_contacts_link":"Contactos bloqueados ({count})","link_contact_us":"Contáctanos","link_terms_of_service":"Términos de uso","link_privacy_policy":"Política de privacidad","label_sdk":"SDK:","label_server_address":"Dirección del servidor:","archived_contacts":"Contactos archivados ({count})","contacts_not_found":"No tienes chats
¯∖_(ツ)_/¯","full_name_prompt":"Nombre completo, p.ej. Juan González Hernández","email_prompt":"Correo electrónico, p.ej. juan@example.com","button_sign_up":"Regístrate","label_your_name":"Tu nombre","label_user_id":"ID:","button_edit":"Editar","requested_permissions":"Solicitados","granted_permissions":"Otorgados","menu_item_edit_permissions":"Editar permisos","label_other_user":"Otros","action_clear_messages":"Borrar mensajes","clear_messages_warning":"¿Estás seguro de que quieres eliminar todos los mensajes? Esta acción es irreversible.","action_delete_messages":"Borrar mensajes para todos","delete_messages_warning":"¿Estás seguro de que quieres eliminar todos los mensajes para todos? Esta acción es irreversible.","action_leave_chat":"Dejar conversación","leave_chat_warning":"¿Estás seguro de que quieres dejar esta conversación?","action_block_contact":"Bloquear contacto","block_contact_warning":"¿Estás seguro de que quieres bloquear a este contacto?","action_report_chat":"Reportar conversación","report_chat_warning":"¿Estás seguro de que quieres bloquear y reportar a esta conversación?","title_info":"Información","label_topic_name":"Nombre del tema","label_private":"Comentario privado","private_editing_placeholder":"Sólo visible para tí","label_muting_topic":"Silenciado:","action_more":"Más","label_your_permissions":"Tus permisoss:","label_permissions":"Permisos:","label_you":"Tú:","label_default_access":"Modo de acceso predeterminado:","label_group_members":"Miembros del grupo:","button_add_members":"Añadir miembros","group_has_no_members":"No hay miembros","login_prompt":"Nombre de usuario","password_prompt":"Contraseña","stay_logged_in":"Permanecer conectado","forgot_password_link":"¿Olvidaste tu contraseña?","button_sign_in":"Entrar","label_client":"Cliente:","label_server":"Servidor:","online_now":"en línea","last_seen_timestamp":"Últ. vez","title_not_found":"No encontrado","unnamed_topic":"Sin nombre","messages_not_readable":"sin acceso a mensajes","peers_messaging_disabled":"La mensajería Peer está deshabilitada.","enable_peers_messaging":"Habilitar","search_for_contacts":"Usa la búsqueda para encontrar contactos","search_no_results":"La búsqueda no arrojó resultados","tabtitle_find_user":"encontrar","tabtitle_new_group":"nuevo grupo","tabtitle_group_by_id":"por ID","new_password_placeholder":"Introduzca una nueva contraseña","label_reset_password":"Enviar un correo electrónico de restablecimiento de contraseña:","credential_email_prompt":"Tu correo electrónico de registro","button_reset":"Restablecer","button_send_request":"Enviar petición","label_server_to_use":"Servidor para usar:","label_wire_transport":"Transporte de alambre:","button_update":"Actualizar","sidepanel_title_login":"Iniciar sesión","sidepanel_title_register":"Crear cuenta","sidepanel_title_settings":"Ajustes","sidepanel_title_account_settings":"Ajustes de la cuenta","sidepanel_title_acc_general":"General","sidepanel_title_acc_security":"Seguridad","sidepanel_title_acc_notifications":"Notificaciones","sidepanel_title_acc_support":"Soporte","sidepanel_title_newtpk":"Iniciar un nuevo chat","sidepanel_title_cred":"Confirmar credenciales","sidepanel_title_reset":"Restablecer contraseña","sidepanel_title_archive":"Chats archivados","sidepanel_title_blocked":"Chats bloqueados","update_available":"Actualización disponible.","reload_update":"Recargar","reconnect_countdown":"Desconectado. Reconectando en {seconds}…","reconnect_now":"Reintentar","push_init_failed":"Error al inicializar las notificaciones push","invalid_security_token":"Token de seguridad inválido","no_connection":"Sin conexión","code_doesnot_match":"El código no coincide","phone_dative":"teléfono","email_dative":"correo electrónico","enter_confirmation_code_prompt":"Intruduzca el código de confirmación enviado a tu {method}:","numeric_confirmation_code_prompt":"Sólo números","button_confirm":"Confirmar","save_attachment":"guardar","deleted_content":"este mensaje fue eliminado","invalid_content":"contenido inválido","user_not_found":"Usuario no encontrado","badge_you":"tú","badge_owner":"propietario","menu_item_info":"Información","menu_item_clear_messages":"Borrar mensajes","menu_item_clear_messages_for_all":"Borrar para todos","menu_item_delete":"Eliminar","menu_item_delete_for_all":"Eliminar para todos","menu_item_send_retry":"Inténtalo de nuevo","menu_item_mute":"Silenciar","menu_item_unmute":"Anular el silencio","menu_item_delete_topic":"Eliminar","topic_delete_warning":"¿Estás seguro de que quieres eliminar esta conversación?","menu_item_unblock":"Desbloquear","menu_item_block":"Bloquear","topic_block_warning":"¿Estás seguro de que quieres bloquear esta conversación","menu_item_member_delete":"Eliminar","menu_item_archive_topic":"Archivar","action_cancel":"cancelar","upload_finishing":"terminando...","no_contacts":"No tienes contactos :-(","contacts_not_found_short":"Ningún contacto coincide con \'\'{query}\'\'","title_group_members":"Miembros del grupo","title_all_contacts":"Todos los contactos","button_ok":"OK","button_cancel":"Cancelar","more_online_members":"+{overflow} más","download_action":"descargar","label_file_name":"Nombre del archivo:","label_content_type":"Tipo de contenido:","label_size":"Tamaño:","chat_invitation":"Estás invitado a participar en un nuevo chat. ¿Qué te gustaría hacer?","chat_invitation_accept":"Aceptar","chat_invitation_ignore":"Ignorar","chat_invitation_block":"Bloquear","error_invalid_id":"ID inválido","group_user_id_prompt":"ID del grupo o usuario","button_subscribe":"Suscribirse","topic_name_editing_placeholder":"Nombre del grupo","button_create":"Crear","permission_join":"Unirse ({val})","permission_read":"Leer ({val})","permission_write":"Escribir ({val})","permission_pres":"Ser notificado ({val})","permission_admin":"Approbar ({val})","permission_share":"Compartir ({val})","permission_delete":"Eliminar ({val})","permission_owner":"Propietario ({val})","title_permissions":"Permisos","message_sending":"enviando...","message_sending_failed":"no se pudo enviar el mensaje","search_placeholder":"Ej. email:alice@example.com, tel:17025550003...","messaging_disabled_prompt":"El envío de mensajes está deshabilitado","new_message_prompt":"Nuevo mensaje","image_caption_prompt":"Añade un comentario","file_attachment_too_large":"El tamaño del archivo {size} excede el límite de {limit}.","cannot_initiate_file_upload":"No se pudo iniciar la carga del archivo.","tags_not_found":"No hay etiquetas definidas. Añade unas.","tags_editor_no_tags":"Añadir etiquetas","title_manage_tags":"Gestionar","channel_prompt":"Este es un canal","channel":"canal"},"ko":{"validate_credential_action":"확인","title_tag_manager":"태그(사용자검색)","label_user_contacts":"연락처: ","button_add_another":"다른항목추가","label_message_sound":"메시지소리: ","label_push_notifications":"통지경보: ","label_push_notifications_disabled":"통지경보(HTTPS필요): ","label_incognito_mode":"시크릿모드: ","delete_account":"계정삭제","delete_account_arning":"계정을삭제하시겠습니까?실행취소할수없습니다.","label_password":"비밀번호","password_unchanged_prompt":"변경되지않음","button_logout":"로그아웃","button_delete_account":"계정삭제","label_default_access_mode":"기본액세스모드: ","blocked_contacts_link":"차단된연락처({수})","link_contact_us":"문의처","link_terms_of_service":"서비스약관","link_privacy_policy":"개인정보보호정책","label_sdk":"SDK:","label_server_address":"서버주소: ","archived_contacts":"보관된연락처({수})","contacts_not_found":"채팅이없습니다
¯∖_(ツ)_/¯","full_name_prompt":"전체이름(예:홍길동)","email_prompt":"이메일(예:hong@example.com)","button_sign_up":"가입","label_your_name":"이름","label_user_id":"ID:","button_edit":"편집","requested_permissions":"요청","menu_item_edit_permissions":"편집권한","label_other_user":"기타","action_clear_messages":"메시지지우기","clear_messages_warning":"모든메시지를지우시겠습니까?실행취소할수없습니다.","action_delete_messages":"모든메시지지우기","delete_messages_warning":"모든사람의모든메시지를삭제하시겠습니까?실행취소할수없습니다.","action_leave_chat":"대화나누기","leave_chat_warning":"이대화를나가시겠습니까?","action_block_contact":"연락차단","block_contact_warning":"이연락처를차단하시겠습니까?","action_report_chat":"대화기록","report_chat_warning":"이대화를차단하고기록하시겠습니까?","title_info":"정보","label_topic_name":"이름","label_private":"개인코멘트","private_editing_placeholder":"나만볼수있습니다","label_muting_topic":"음소거: ","action_more":"더보기","label_your_permissions":"권한: ","label_permissions":"권한: ","label_you":"당신: ","label_default_access":"기본액세스모드: ","label_group_members":"그룹회원: ","button_add_members":"회원추가","group_has_no_members":"회원없음","login_prompt":"로그인","password_prompt":"비밀번호","stay_logged_in":"로그인상태유지","forgot_password_link":"비밀번호를잊으셨습니까?","button_sign_in":"로그인","label_client":"클라이언트: ","label_server":"서버: ","online_now":"현재접속중","last_seen_timestamp":"마지막으로본","title_not_found":"찾을수없음","unnamed_topic":"이름없는","peers_messaging_disabled":"동료의메시지가비활성화되었습니다.","enable_peers_messaging":"활성화","search_for_contacts":"검색을사용하여연락처찾기","search_no_results":"검색결과가없습니다","tabtitle_find_user":"찾기","tabtitle_new_group":"새그룹","tabtitle_group_by_id":"id로","new_password_placeholder":"새비밀번호입력","label_reset_password":"비밀번호재설정이메일보내기: ","credential_email_prompt":"등록이메일","button_reset":"재설정","button_send_request":"요청보내기","label_server_to_use":"사용할서버:","label_wire_transport":"와이어수송:","button_update":"업데이트","sidepanel_title_login":"로그인","sidepanel_title_register":"계정만들기","sidepanel_title_settings":"설정","sidepanel_title_account_settings":"계정설정","sidepanel_title_acc_general":"일반","sidepanel_title_acc_security":"보안","sidepanel_title_acc_notifications":"알림","sidepanel_title_acc_support":"지원","sidepanel_title_newtpk":"새채팅시작","sidepanel_title_cred":"자격증명확인","sidepanel_title_reset":"비밀번호재설정","sidepanel_title_archive":"보관된채팅","sidepanel_title_blocked":"차단된채팅","update_available":"업데이트가능.","reload_update":"재로드","reconnect_countdown":"연결이끊어졌습니다.다시연결하는중{초}…","reconnect_now":"지금시도","push_init_failed":"푸시알림을초기화하지못했습니다","invalid_security_token":"유효하지않은보안토큰","no_connection":"연결없음","code_doesnot_match":"코드가일치하지않습니다","phone_dative":"전화","email_dative":"이메일","enter_confirmation_code_prompt":"{방법}으로보낸확인코드를입력하십시오:","numeric_confirmation_code_prompt":"숫자만","button_confirm":"확인","save_attachment":"저장","invalid_content":"잘못된내용","user_not_found":"찾을수없음","badge_you":"당신","badge_owner":"소유자","menu_item_info":"정보","menu_item_clear_messages":"메시지지우기","menu_item_clear_messages_for_all":"모두지우기","menu_item_delete":"삭제","menu_item_delete_for_all":"모두삭제","menu_item_send_retry":"다시시도","menu_item_mute":"음소거","menu_item_unmute":"음소거해제","menu_item_delete_topic":"삭제","topic_delete_warning":"이대화를삭제하시겠습니까?","menu_item_unblock":"차단해제","menu_item_block":"차단","topic_block_warning":"이대화를차단하시겠습니까?","menu_item_member_delete":"제거","menu_item_archive_topic":"보관","action_cancel":"취소","upload_finishing":"마무리...","no_contacts":"연락처가없습니다 (._.)","contacts_not_found_short":"\'{문의}\'와일치하는연락처가없습니다.","title_group_members":"그룹구성원","title_all_contacts":"모든연락처","button_ok":"OK","button_cancel":"취소","more_online_members":"+{넘침}더보기","download_action":"다운로드","label_file_name":"파일이름: ","label_content_type":"컨텐츠유형: ","label_size":"크기: ","chat_invitation":"새로운대화를시작하도록초대되었습니다.무엇을하시겠습니까?","chat_invitation_accept":"수락","chat_invitation_ignore":"무시","chat_invitation_block":"차단","error_invalid_id":"잘못된ID","group_user_id_prompt":"그룹또는사용자ID","button_subscribe":"구독","topic_name_editing_placeholder":"그룹의자유형이름","button_create":"작성","permission_join":"참여({val})","permission_read":"읽기({val})","permission_write":"쓰기({val})","permission_pres":"알림받기({val})","permission_admin":"승인({val})","permission_share":"공유({val})","permission_delete":"삭제({val})","permission_owner":"소유자({val})","title_permissions":"권한","message_sending":"보내기...","message_sending_failed":"실패","search_placeholder":"email:alice@example.com,tel:17025550003...와같은목록","messaging_disabled_prompt":"메시지비활성화","new_message_prompt":"새메시지","image_caption_prompt":"이미지설명","file_attachment_too_large":"파일크기{크기}이(가){제한}제한을초과합니다.","cannot_initiate_file_upload":"파일업로드를시작할수없습니다.","tags_not_found":"태그가정의되지않았습니다.일부를추가하십시오.","tags_editor_no_tags":"일부태그추가","title_manage_tags":"관리","granted_permissions":"승낙하다","messages_not_readable":"메시지에 액세스 할 수 없습니다","deleted_content":"내용이 삭제되었습니다","channel_prompt":"이 채널입니다","channel":"채널"},"ro":{"validate_credential_action":"confirmă","title_tag_manager":"Tag-uri (user discovery)","label_user_contacts":"Contacte:","button_add_another":"Adaugă","label_message_sound":"Sunet de mesaj:","label_push_notifications":"Alerte de notificare:","label_push_notifications_disabled":"Alerte de notificare (necesită HTTPS):","label_incognito_mode":"Mod incognito:","delete_account":"Șterge contul","delete_account_arning":"Ești sigur că dorești să ștergi contul? Acesta nu va putea fi recuperat.","label_password":"Parola","password_unchanged_prompt":"Neschimbată","button_logout":"Deconectare","button_delete_account":"Șterge cont","label_default_access_mode":"Default access mode:","blocked_contacts_link":"Contact blocate ({count})","link_contact_us":"Contactează-ne","link_terms_of_service":"Termenii Serviciului","link_privacy_policy":"Politica de Confidențialitate","label_sdk":"SDK:","label_server_address":"Adresa serverului:","archived_contacts":"Contacte arhivate ({count})","contacts_not_found":"Nu ai contacte salvate
¯∖_(ツ)_/¯","full_name_prompt":"Numele tău","email_prompt":"Adresa de e-mail","button_sign_up":"Creează cont","label_your_name":"Numele tău","label_user_id":"ID:","button_edit":"Editează","requested_permissions":"Necesare","granted_permissions":"Oferite","menu_item_edit_permissions":"Editează permisiuni","label_other_user":"Altele","action_clear_messages":"Șterge mesajele","clear_messages_warning":"Ești sigur că dorești să ștergi mesajele? Acestea nu pot fi recuperate.","action_delete_messages":"Șterge toate mesajele","delete_messages_warning":"Ești sigur că dorești să șterge mesajele din toate conversațiile? Acestea nu pot fi recuperate.","action_leave_chat":"Ieși din conversație","leave_chat_warning":"Ești sigur că dorești să ieși din conersație?","action_block_contact":"Blochează contact","block_contact_warning":"Ești sigur că dorești să blochezi acest contact?","action_report_chat":"Raportează conversația","report_chat_warning":"Ești sigur că dorești să blochezi și să raportezi această conversație?","title_info":"Info","label_topic_name":"Nume","label_private":"Comentariu privat","private_editing_placeholder":"Vizibil doar ție","label_muting_topic":"Mod silențios (muted):","action_more":"Mai multe","label_your_permissions":"Permisiuniile tale:","label_permissions":"Permisiuni:","label_you":"Tu:","label_default_access":"Modul default:","label_group_members":"Membrii grupului:","button_add_members":"Adaugă persoane","group_has_no_members":"În acest grup nu se află persoane","login_prompt":"Conectează-te","password_prompt":"Parola","stay_logged_in":"Rămâi conectat","forgot_password_link":"Ți-ai uitat parola?","button_sign_in":"Conectează-te","label_client":"Client:","label_server":"Server:","online_now":"online acum","last_seen_timestamp":"Văzut ultima dată","title_not_found":"Nu a fost găsit","channel":"canal","unnamed_topic":"Nedenumit","messages_not_readable":"Mesajele nu pot fi citite","peers_messaging_disabled":"Mesageria de tip Peer este dezactivată.","enable_peers_messaging":"Activează","search_for_contacts":"Caută în contacte","search_no_results":"Nu s-au găsit rezultate","tabtitle_find_user":"caută","tabtitle_new_group":"grup nou","tabtitle_group_by_id":"după id","new_password_placeholder":"Introdu parolă","label_reset_password":"Resetează parola:","credential_email_prompt":"Adresa de e-mail","button_reset":"Resetează","button_send_request":"Trimite cerere","label_server_to_use":"Server de utilizat:","label_wire_transport":"Transportul legat:","button_update":"Actualizează","sidepanel_title_login":"Conectează-te","sidepanel_title_register":"Creează Cont","sidepanel_title_settings":"Setări","sidepanel_title_account_settings":"Setările Contului","sidepanel_title_acc_general":"Generale","sidepanel_title_acc_security":"Securitate","sidepanel_title_acc_notifications":"Notificări","sidepanel_title_acc_support":"Ajutor","sidepanel_title_newtpk":"Creeză un nou Chat","sidepanel_title_cred":"Confirmă credențiale","sidepanel_title_reset":"Resetează Parola","sidepanel_title_archive":"Conversații Arhivate","sidepanel_title_blocked":"Conversații Blocate","reconnect_countdown":"Deconectat. Se încearcă conectarea în {seconds}…","reconnect_now":"Încearcă din nou","push_init_failed":"Nu s-a reușit inițializarea tip push notifications","invalid_security_token":"Codul de securitate este invalid","no_connection":"Nu există conexiune","code_doesnot_match":"Codul furnizat nu este valid","update_available":"Actualizare disponibilă.","reload_update":"Reîncarcă","phone_dative":"telefon","email_dative":"email","enter_confirmation_code_prompt":"Introu codul de confirmare trimis pe {method}:","numeric_confirmation_code_prompt":"Doar cifre","button_confirm":"Confirmă","save_attachment":"salvează","deleted_content":"conținut șters","invalid_content":"conținut invalid","user_not_found":"Utilizatorul nu a fost găsit","badge_you":"tu","badge_owner":"owner","menu_item_info":"Info","menu_item_clear_messages":"Șterge mesajele","menu_item_clear_messages_for_all":"Ștergele pe toate","menu_item_delete":"Șterge","menu_item_delete_for_all":"Ștergele pe toate","menu_item_send_retry":"Reîncearcă","menu_item_mute":"Mute","menu_item_unmute":"Unmute","menu_item_delete_topic":"Șterge","topic_delete_warning":"Ești sigur că dorești să șterge această conversație?","menu_item_unblock":"Deblochează","menu_item_block":"Blochează","topic_block_warning":"Ești sigur că dorești să blochezi această conversație?","menu_item_member_delete":"Șterge persoană","menu_item_archive_topic":"Arhivează","action_cancel":"anulează","upload_finishing":"se încarcă...","no_contacts":"Nu ai contacte adăugate :-(","contacts_not_found_short":"Niciun contact găsit după criteriile \'\'{query}\'\'","title_group_members":"Persoanele din grup","title_all_contacts":"Toate Contactele","button_ok":"OK","button_cancel":"Anulează","more_online_members":"+{overflow} mai mult","download_action":"download","label_file_name":"Nume fișier:","label_content_type":"Tip conținut:","label_size":"Size:","chat_invitation":"Ai primit invitație într-o conversație. Accepți?","chat_invitation_accept":"Da, accept","chat_invitation_ignore":"Ignoră","chat_invitation_block":"Blochează","error_invalid_id":"ID Invalid","group_user_id_prompt":"Grup sau user ID","button_subscribe":"Subscribe","topic_name_editing_placeholder":"Numele grupului","channel_prompt":"Acesta este un canal","button_create":"Creează","permission_join":"Participare ({val})","permission_read":"Citire ({val})","permission_write":"Scriere ({val})","permission_pres":"Notificare ({val})","permission_admin":"Aprobare ({val})","permission_share":"Distribuire ({val})","permission_delete":"Ștergere ({val})","permission_owner":"Deținător ({val})","title_permissions":"Permisiuni","message_sending":"se trimite...","message_sending_failed":"eroare","search_placeholder":"Caută după e-mail sau număr telefon...","messaging_disabled_prompt":"Mesageria este dezactivată","new_message_prompt":"Mesaj nou","image_caption_prompt":"Titlul imaginii","file_attachment_too_large":"Dimensiunea fișiterului {size} depășește limita de {limit}.","cannot_initiate_file_upload":"Nu se poate face încărcarea.","tags_not_found":"Niciun tag definit. Adaugă.","tags_editor_no_tags":"Adaugă tag-uri","title_manage_tags":"Administrează"},"ru":{"contacts_not_found":"Чатов нет
¯∖_(ツ)_/¯","full_name_prompt":"Полное имя, напр. Иван Петров","email_prompt":"Email, напр. ivan@example.com","button_sign_up":"Создать аккаунт","label_your_name":"Ваше имя","label_password":"Пароль","password_unchanged_prompt":"Не изменен","label_user_id":"ID:","label_default_access_mode":"Доступ по умолчанию:","label_message_sound":"Звук нового сообщения:","label_push_notifications":"Уведомления:","label_push_notifications_disabled":"Уведомления (требуют HTTPS):","title_tag_manager":"Теги для поиска","button_logout":"Выйти","login_prompt":"Логин","password_prompt":"Пароль","stay_logged_in":"Запомнить","forgot_password_link":"Напомнить пароль","button_sign_in":"Войти","label_client":"Клиент:","label_server":"Сервер:","online_now":"онлайн","last_seen_timestamp":"Был активен","title_not_found":"Не найден","unnamed_topic":"Без названия","messages_not_readable":"нет доступа к сообщениям","tabtitle_find_user":"найти","tabtitle_new_group":"создать","tabtitle_group_by_id":"по id","label_server_to_use":"Использовать сервер:","label_wire_transport":"Соединение:","button_update":"Применить","sidepanel_title_login":"Авторизация","sidepanel_title_register":"Зарегистрироваться","sidepanel_title_settings":"Настройки","sidepanel_title_account_settings":"Настройки аккаунта","sidepanel_title_newtpk":"Новый чат","sidepanel_title_cred":"Подтвердить","sidepanel_title_reset":"Сменить пароль","tags_not_found":"Тегов нет. Добавьте","tags_editor_no_tags":"Добавьте теги","title_manage_tags":"Редактировать","message_sending":"в пути...","message_sending_failed":"ошибка","search_placeholder":"Список, напр. email:alice@example.com, tel:+17025550003...","messaging_disabled_prompt":"Отправка недоступна","new_message_prompt":"Новое сообщение","file_attachment_too_large":"Размер файла {size} превышает {limit} лимит.","cannot_initiate_file_upload":"Ошибка загрузки файла.","search_for_contacts":"Поиск контактов","enter_confirmation_code_prompt":"Код подтверждения, полученный по {method}:","numeric_confirmation_code_prompt":"Только цифры","button_confirm":"Подтвердить","button_ok":"OK","button_cancel":"Отменить","invalid_content":"сообщение не читается","label_file_name":"Имя файла:","label_content_type":"Тип:","label_size":"Размер:","phone_dative":"телефону","email_dative":"емейлу","title_group_members":"Участники","download_action":"скачать","permission_join":"Подписываться ({val})","permission_read":"Читать ({val})","permission_write":"Писать ({val})","permission_pres":"Уведомлять ({val})","permission_admin":"Подтверждать ({val})","permission_share":"Приглашать ({val})","permission_delete":"Удалять ({val})","permission_owner":"Владелец ({val})","title_permissions":"Права доступа","requested_permissions":"Требуются","granted_permissions":"Получены","menu_item_edit_permissions":"Права доступа","label_other_user":"Второй","label_topic_name":"Название","label_private":"Комментарий","private_editing_placeholder":"Виден только вам","label_muting_topic":"Без уведомлений","action_more":"Ещё","label_your_permissions":"Ваши права доступа:","label_permissions":"Права доступа:","label_you":"Вы:","label_default_access":"Права по умолчанию:","label_group_members":"Участники чата:","button_add_members":"Добавить","group_has_no_members":"Нет участников","action_leave_chat":"Уйти из чата","menu_item_info":"Информация","menu_item_clear_messages":"Удалить сообщения","menu_item_clear_messages_for_all":"Удалить для всех","menu_item_delete":"Удалить","menu_item_delete_for_all":"Удалить для всех","menu_item_send_retry":"Отправить заново","menu_item_mute":"Не уведомлять","menu_item_unmute":"Уведомлять","menu_item_delete_topic":"Удалить чат","menu_item_unblock":"Разблокировать","menu_item_block":"Заблокировать","menu_item_member_delete":"Отписать","title_info":"Подробности","new_password_placeholder":"Введите новый пароль","label_reset_password":"Отправить емейл для смены пароля:","credential_email_prompt":"Регистрационный емейл","button_reset":"Изменить","button_send_request":"Отправить","action_cancel":"отменить","upload_finishing":"завершение...","no_contacts":"Ничего нет :-(","contacts_not_found_short":"Нет контактов для запроса \'\'{query}\'\'","title_all_contacts":"Все контакты","error_invalid_id":"Неверный ID","group_user_id_prompt":"ID чата или пользователя","button_subscribe":"Подписаться","topic_name_editing_placeholder":"Название чата","button_create":"Создать","badge_you":"вы","badge_owner":"влад.","update_available":"Есть новая версия приложения.","reload_update":"Обновить","user_not_found":"Не найден","reconnect_countdown":"Нет связи. Подключение через {seconds}…","reconnect_now":"Подключить сейчас.","save_attachment":"сохранить","menu_item_archive_topic":"В архив","archived_contacts":"Чаты в архиве ({count})","sidepanel_title_archive":"Архив чатов","chat_invitation":"Вас пригласили начать новый чат. Как вы хотите поступить?","chat_invitation_accept":"Принять","chat_invitation_ignore":"Игнорировать","chat_invitation_block":"Заблокировать","peers_messaging_disabled":"Чат заблокирован у корреспондента.","enable_peers_messaging":"Разблокировать.","more_online_members":"+еще {overflow}","label_user_contacts":"Конакты:","validate_credential_action":"подтвердить","link_contact_us":"Связаться с нами","link_terms_of_service":"Условия сервиса","link_privacy_policy":"Политика конфиденциальности","action_delete_messages":"Удалить сообщения","action_block_contact":"Заблокировать контакт","action_report_chat":"Сообщить о нарушении","delete_messages_warning":"Вы действительно хотите удалить все сообщения?","leave_chat_warning":"Вы действительно хотите покинуть этот чат?","block_contact_warning":"Вы действительно заблокировать этот контакт?","report_chat_warning":"Вы действительно хотите сообщить о нарушении и заблокировать этот чат?","action_clear_messages":"Удалить сообщения","clear_messages_warning":"Вы действительно хотите удалить все сообщения в чате? Их будет невозможно восстановить.","topic_delete_warning":"Вы действительно хотите удалить этот чат?","topic_block_warning":"Вы действительно хотите заблокировать этот чат?","search_no_results":"Ничего не найдено","deleted_content":"удалено","image_caption_prompt":"Подпись к фото","label_incognito_mode":"Режим инкогнито:","delete_account":"Удалить аккаунт","delete_account_arning":"Вы уверены, что ходите удалить свой аккаунт? Его невозможно будет восстановить.","button_delete_account":"Удалить аккаунт","sidepanel_title_acc_security":"Безопасность","sidepanel_title_acc_notifications":"Уведомления","sidepanel_title_acc_support":"Поддержка","label_sdk":"SDK:","label_server_address":"Адрес сервера:","button_edit":"Редактировать","button_add_another":"Добавить","sidepanel_title_acc_general":"Общие настройки","blocked_contacts_link":"Заблокированные ({count})","sidepanel_title_blocked":"Заблокированные чаты","push_init_failed":"Ошибка инициализации пуш уведомлений","invalid_security_token":"Токен некорректен","no_connection":"Нет связи","code_doesnot_match":"Код не совпадает","channel_prompt":"Создать канал","channel":"канал"},"zh":{"archived_contacts":"已归档联系人 ({count})","contacts_not_found":"你尚无会话
¯∖_(ツ)_/¯","full_name_prompt":"全名,例如张伟","email_prompt":"电子邮件,例如 zhang@example.com","button_sign_up":"注册","label_your_name":"你的姓名","label_password":"密码","password_unchanged_prompt":"未改变","label_user_id":"地址:","label_default_access_mode":"蓦然访问模式:","label_message_sound":"消息提示音:","label_push_notifications":"通知提醒:","label_push_notifications_disabled":"通知提醒(需要 HTTPS):","title_tag_manager":"标签(用户发现)","button_logout":"登出","requested_permissions":"已请求","granted_permissions":"已授予","menu_item_edit_permissions":"编辑权限","label_other_user":"其他","title_info":"信息","label_topic_name":"名称","label_private":"私人评论","private_editing_placeholder":"仅自己可见","label_muting_topic":"已静音:","action_more":"更多","label_your_permissions":"你的权限:","label_permissions":"权限:","label_you":"你:","label_default_access":"默认权限模式:","label_group_members":"群组成员:","button_add_members":"添加成员","group_has_no_members":"无成员","action_leave_chat":"离开","login_prompt":"登录","password_prompt":"密码","stay_logged_in":"保持登录","forgot_password_link":"忘记密码?","button_sign_in":"登录","label_client":"客户端:","label_server":"服务器:","online_now":"在线","last_seen_timestamp":"最后可见","title_not_found":"无法找到","unnamed_topic":"未命名","messages_not_readable":"无消息访问权限","peers_messaging_disabled":"成员间消息已禁用。","enable_peers_messaging":"启用","tabtitle_find_user":"搜索","tabtitle_new_group":"新群组","tabtitle_group_by_id":"通过 id","search_for_contacts":"使用搜索寻找联系人","new_password_placeholder":"输入新密码","label_reset_password":"发送密码重置邮件:","credential_email_prompt":"你的注册邮箱","button_reset":"重置","button_send_request":"发送请求","label_server_to_use":"使用的服务器:","label_wire_transport":"线路传输:","button_update":"更新","sidepanel_title_login":"登录","sidepanel_title_register":"创建账户","sidepanel_title_settings":"设置","sidepanel_title_account_settings":"帐号设定","sidepanel_title_newtpk":"开始新会话","sidepanel_title_cred":"确认凭据","sidepanel_title_reset":"重置密码","sidepanel_title_archive":"已存档会话","update_available":"更新可用。","reload_update":"重新载入","reconnect_countdown":"连接已断开。{seconds} 秒后重新连接…","reconnect_now":"立即尝试","phone_dative":"电话","email_dative":"电子邮件","enter_confirmation_code_prompt":"输入通过{method}发送的验证码:","numeric_confirmation_code_prompt":"仅数字","button_confirm":"确认","save_attachment":"保存","invalid_content":"无效内容","user_not_found":"未找到","badge_you":"你","badge_owner":"所有者","menu_item_info":"信息","menu_item_clear_messages":"清空消息","menu_item_clear_messages_for_all":"全部清除","menu_item_delete":"删除","menu_item_delete_for_all":"全部删除","menu_item_mute":"静音","menu_item_unmute":"取消静音","menu_item_delete_topic":"删除","menu_item_unblock":"取消屏蔽","menu_item_block":"屏蔽","menu_item_member_delete":"移除","menu_item_archive_topic":"归档","action_cancel":"取消","upload_finishing":"正在结束...","no_contacts":"你尚无联系人 (._.)","contacts_not_found_short":"无联系人匹配\'\'{query}\'\'","title_group_members":"群组成员","title_all_contacts":"全部联系人","button_ok":"好","button_cancel":"取消","download_action":"下载","label_file_name":"文件名:","label_content_type":"内容类型:","label_size":"大小:","chat_invitation":"你受邀开始新会话。你想怎么做?","chat_invitation_accept":"接受","chat_invitation_ignore":"忽略","chat_invitation_block":"屏蔽","error_invalid_id":"无效 ID","group_user_id_prompt":"群组或用户 ID","button_subscribe":"订阅","topic_name_editing_placeholder":"群组自由格式名称","button_create":"创建","permission_join":"加入 ({val})","permission_read":"读取 ({val})","permission_write":"写入 ({val})","permission_pres":"获取通知 ({val})","permission_admin":"批准 ({val})","permission_share":"分享 ({val})","permission_delete":"删除 ({val})","permission_owner":"所有者 ({val})","title_permissions":"权限","message_sending":"正在发送...","message_sending_failed":"发送失败","search_placeholder":"列表如 email:alice@example.com, tel:+17025550003...","messaging_disabled_prompt":"消息已禁用","new_message_prompt":"新消息","file_attachment_too_large":"文件大小 {size} 超过 {limit} 限制。","cannot_initiate_file_upload":"无法初始化文件上传。","tags_not_found":"尚未定义标签。添加一些。","tags_editor_no_tags":"添加一些标签","title_manage_tags":"管理标签","more_online_members":"还有{overflow}个","label_user_contacts":"往来:","validate_credential_action":"确认","link_contact_us":"联系我们","link_terms_of_service":"条款和条件","link_privacy_policy":"隐私政策","action_delete_messages":"删除所有帖子","action_block_contact":"屏蔽联系人","delete_messages_warning":"您确定要删除所有消息吗?无法撤消。","leave_chat_warning":"您确定要退出此对话吗?","block_contact_warning":"您确定要阻止此联系人吗?","action_report_chat":"检举垃圾邮件","report_chat_warning":"您确定要停止并报告此对话吗?","action_clear_messages":"删除讯息","clear_messages_warning":"您确定要清除所有消息吗?无法撤消。","topic_delete_warning":"您确定要删除此对话吗?","topic_block_warning":"您确定要阻止此对话吗?","search_no_results":"搜索返回任何结果","deleted_content":"内容已删除","image_caption_prompt":"图片标题","menu_item_send_retry":"重试","label_incognito_mode":"无痕模式:","delete_account":"删除帐户","delete_account_arning":"您确定要删除您的帐户吗?无法撤消。","button_delete_account":"删除帐户","sidepanel_title_acc_security":"安全","sidepanel_title_acc_notifications":"通知","sidepanel_title_acc_support":"支持","label_sdk":"开发包:","label_server_address":"服务器地址:","button_edit":"编辑","button_add_another":"加上另一个","sidepanel_title_acc_general":"常用设定","blocked_contacts_link":"封锁的联络人 ({count})","sidepanel_title_blocked":"被阻止的聊天","push_init_failed":"初始化推送通知失败","invalid_security_token":"无效的安全令牌","no_connection":"无连接","code_doesnot_match":"代码不匹配","channel_prompt":"这是一个频道","channel":"频道"}}')},react:function(e){e.exports=React},"react-dom":function(e){e.exports=ReactDOM},"react-intl":function(e){e.exports=ReactIntl},"tinode-sdk":function(e){e.exports=Tinode},"firebase/app":function(e){e.exports=firebase},"firebase/messaging":function(e){e.exports=firebase.messaging}},t={};function s(a){if(t[a])return t[a].exports;var i=t[a]={exports:{}};return e[a](i,i.exports,s),i.exports}s.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return s.d(t,{a:t}),t},s.d=function(e,t){for(var a in t)s.o(t,a)&&!s.o(e,a)&&Object.defineProperty(e,a,{enumerable:!0,get:t[a]})},s.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},s.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},s("./src/index.js")}();
+/******/ (function() { // webpackBootstrap
+/******/ "use strict";
+/******/ var __webpack_modules__ = ({
+
+/***/ "./src/config.js":
+/*!***********************!*\
+ !*** ./src/config.js ***!
+ \***********************/
+/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
+
+__webpack_require__.r(__webpack_exports__);
+/* harmony export */ __webpack_require__.d(__webpack_exports__, {
+/* harmony export */ "APP_NAME": function() { return /* binding */ APP_NAME; },
+/* harmony export */ "API_KEY": function() { return /* binding */ API_KEY; },
+/* harmony export */ "KNOWN_HOSTS": function() { return /* binding */ KNOWN_HOSTS; },
+/* harmony export */ "DEFAULT_HOST": function() { return /* binding */ DEFAULT_HOST; },
+/* harmony export */ "LOGGING_ENABLED": function() { return /* binding */ LOGGING_ENABLED; },
+/* harmony export */ "KEYPRESS_DELAY": function() { return /* binding */ KEYPRESS_DELAY; },
+/* harmony export */ "RECEIVED_DELAY": function() { return /* binding */ RECEIVED_DELAY; },
+/* harmony export */ "READ_DELAY": function() { return /* binding */ READ_DELAY; },
+/* harmony export */ "MIN_TAG_LENGTH": function() { return /* binding */ MIN_TAG_LENGTH; },
+/* harmony export */ "MAX_TAG_LENGTH": function() { return /* binding */ MAX_TAG_LENGTH; },
+/* harmony export */ "MAX_TAG_COUNT": function() { return /* binding */ MAX_TAG_COUNT; },
+/* harmony export */ "DEFAULT_P2P_ACCESS_MODE": function() { return /* binding */ DEFAULT_P2P_ACCESS_MODE; },
+/* harmony export */ "NEW_GRP_ACCESS_MODE": function() { return /* binding */ NEW_GRP_ACCESS_MODE; },
+/* harmony export */ "CHANNEL_ACCESS_MODE": function() { return /* binding */ CHANNEL_ACCESS_MODE; },
+/* harmony export */ "NO_ACCESS_MODE": function() { return /* binding */ NO_ACCESS_MODE; },
+/* harmony export */ "MEDIA_BREAKPOINT": function() { return /* binding */ MEDIA_BREAKPOINT; },
+/* harmony export */ "REM_SIZE": function() { return /* binding */ REM_SIZE; },
+/* harmony export */ "AVATAR_SIZE": function() { return /* binding */ AVATAR_SIZE; },
+/* harmony export */ "BROKEN_IMAGE_SIZE": function() { return /* binding */ BROKEN_IMAGE_SIZE; },
+/* harmony export */ "MESSAGES_PAGE": function() { return /* binding */ MESSAGES_PAGE; },
+/* harmony export */ "MAX_INBAND_ATTACHMENT_SIZE": function() { return /* binding */ MAX_INBAND_ATTACHMENT_SIZE; },
+/* harmony export */ "MAX_EXTERN_ATTACHMENT_SIZE": function() { return /* binding */ MAX_EXTERN_ATTACHMENT_SIZE; },
+/* harmony export */ "MAX_IMAGE_DIM": function() { return /* binding */ MAX_IMAGE_DIM; },
+/* harmony export */ "IMAGE_PREVIEW_DIM": function() { return /* binding */ IMAGE_PREVIEW_DIM; },
+/* harmony export */ "MAX_ONLINE_IN_TOPIC": function() { return /* binding */ MAX_ONLINE_IN_TOPIC; },
+/* harmony export */ "MAX_TITLE_LENGTH": function() { return /* binding */ MAX_TITLE_LENGTH; },
+/* harmony export */ "LINK_CONTACT_US": function() { return /* binding */ LINK_CONTACT_US; },
+/* harmony export */ "LINK_PRIVACY_POLICY": function() { return /* binding */ LINK_PRIVACY_POLICY; },
+/* harmony export */ "LINK_TERMS_OF_SERVICE": function() { return /* binding */ LINK_TERMS_OF_SERVICE; }
+/* harmony export */ });
+/* harmony import */ var _version_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./version.js */ "./src/version.js");
+
+const APP_NAME = 'TinodeWeb/' + (_version_js__WEBPACK_IMPORTED_MODULE_0__.PACKAGE_VERSION || '0.16');
+const API_KEY = 'AQEAAAABAAD_rAp4DJh05a1HAwFT3A6K';
+const KNOWN_HOSTS = {
+ hosted: 'web.tinode.co',
+ local: 'localhost:6060'
+};
+const DEFAULT_HOST = KNOWN_HOSTS.hosted;
+const LOGGING_ENABLED = true;
+const KEYPRESS_DELAY = 3 * 1000;
+const RECEIVED_DELAY = 500;
+const READ_DELAY = 1000;
+const MIN_TAG_LENGTH = 2;
+const MAX_TAG_LENGTH = 96;
+const MAX_TAG_COUNT = 16;
+const DEFAULT_P2P_ACCESS_MODE = 'JRWPS';
+const NEW_GRP_ACCESS_MODE = 'JRWPSAO';
+const CHANNEL_ACCESS_MODE = 'JR';
+const NO_ACCESS_MODE = 'N';
+const MEDIA_BREAKPOINT = 640;
+const REM_SIZE = 13;
+const AVATAR_SIZE = 128;
+const BROKEN_IMAGE_SIZE = 32;
+const MESSAGES_PAGE = 24;
+const MAX_INBAND_ATTACHMENT_SIZE = 262144;
+const MAX_EXTERN_ATTACHMENT_SIZE = 1 << 23;
+const MAX_IMAGE_DIM = 1024;
+const IMAGE_PREVIEW_DIM = 64;
+const MAX_ONLINE_IN_TOPIC = 4;
+const MAX_TITLE_LENGTH = 60;
+const LINK_CONTACT_US = 'email:info@tinode.co';
+const LINK_PRIVACY_POLICY = 'https://tinode.co/privacy.html';
+const LINK_TERMS_OF_SERVICE = 'https://tinode.co/terms.html';
+
+/***/ }),
+
+/***/ "./src/index.js":
+/*!**********************!*\
+ !*** ./src/index.js ***!
+ \**********************/
+/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
+
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "react");
+/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);
+/* harmony import */ var react_dom__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react-dom */ "react-dom");
+/* harmony import */ var react_dom__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react_dom__WEBPACK_IMPORTED_MODULE_1__);
+/* harmony import */ var react_intl__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! react-intl */ "react-intl");
+/* harmony import */ var react_intl__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(react_intl__WEBPACK_IMPORTED_MODULE_2__);
+/* harmony import */ var _messages_json__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./messages.json */ "./src/messages.json");
+/* harmony import */ var _views_tinode_web_jsx__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./views/tinode-web.jsx */ "./src/views/tinode-web.jsx");
+/* harmony import */ var _lib_navigation_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./lib/navigation.js */ "./src/lib/navigation.js");
+
+
+
+
+
+
+const {
+ params
+} = _lib_navigation_js__WEBPACK_IMPORTED_MODULE_5__.default.parseUrlHash(window.location.hash);
+const language = params && params.hl || navigator.languages && navigator.languages[0] || navigator.language || navigator.userLanguage || 'en';
+const baseLanguage = language.toLowerCase().split(/[-_]/)[0];
+const messages = _messages_json__WEBPACK_IMPORTED_MODULE_3__[language] || _messages_json__WEBPACK_IMPORTED_MODULE_3__[baseLanguage] || _messages_json__WEBPACK_IMPORTED_MODULE_3__.en;
+react_dom__WEBPACK_IMPORTED_MODULE_1___default().render(react__WEBPACK_IMPORTED_MODULE_0___default().createElement(react_intl__WEBPACK_IMPORTED_MODULE_2__.IntlProvider, {
+ locale: language,
+ messages: messages,
+ textComponent: (react__WEBPACK_IMPORTED_MODULE_0___default().Fragment)
+}, react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_views_tinode_web_jsx__WEBPACK_IMPORTED_MODULE_4__.default, null)), document.getElementById('mountPoint'));
+
+/***/ }),
+
+/***/ "./src/lib/blob-helpers.js":
+/*!*********************************!*\
+ !*** ./src/lib/blob-helpers.js ***!
+ \*********************************/
+/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
+
+__webpack_require__.r(__webpack_exports__);
+/* harmony export */ __webpack_require__.d(__webpack_exports__, {
+/* harmony export */ "SUPPORTED_IMAGE_FORMATS": function() { return /* binding */ SUPPORTED_IMAGE_FORMATS; },
+/* harmony export */ "MIME_EXTENSIONS": function() { return /* binding */ MIME_EXTENSIONS; },
+/* harmony export */ "makeImageUrl": function() { return /* binding */ makeImageUrl; },
+/* harmony export */ "fitImageSize": function() { return /* binding */ fitImageSize; },
+/* harmony export */ "fileNameForMime": function() { return /* binding */ fileNameForMime; },
+/* harmony export */ "imageScaled": function() { return /* binding */ imageScaled; },
+/* harmony export */ "fileToBase64": function() { return /* binding */ fileToBase64; },
+/* harmony export */ "blobToBase64": function() { return /* binding */ blobToBase64; },
+/* harmony export */ "filePasted": function() { return /* binding */ filePasted; },
+/* harmony export */ "getMimeType": function() { return /* binding */ getMimeType; },
+/* harmony export */ "base64EncodedLen": function() { return /* binding */ base64EncodedLen; },
+/* harmony export */ "base64DecodedLen": function() { return /* binding */ base64DecodedLen; },
+/* harmony export */ "base64ReEncode": function() { return /* binding */ base64ReEncode; }
+/* harmony export */ });
+/* harmony import */ var _config_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../config.js */ "./src/config.js");
+/* harmony import */ var _strformat_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./strformat.js */ "./src/lib/strformat.js");
+
+
+const SUPPORTED_IMAGE_FORMATS = ['image/jpeg', 'image/gif', 'image/png', 'image/svg', 'image/svg+xml'];
+const MIME_EXTENSIONS = ['jpg', 'gif', 'png', 'svg', 'svg'];
+function makeImageUrl(photo) {
+ return photo && photo.type && photo.data ? 'data:image/' + photo.type + ';base64,' + photo.data : null;
+}
+function fitImageSize(width, height, maxWidth, maxHeight, forceSquare) {
+ width = width | 0;
+ height = height | 0;
+ maxWidth = maxWidth | 0;
+ maxHeight = maxHeight | 0;
+
+ if (width <= 0 || height <= 0 || maxWidth <= 0 || maxHeight <= 0) {
+ return null;
+ }
+
+ if (forceSquare) {
+ maxWidth = maxHeight = Math.min(maxWidth, maxHeight);
+ }
+
+ let scale = Math.min(Math.min(width, maxWidth) / width, Math.min(height, maxHeight) / height);
+ let size = {
+ dstWidth: width * scale | 0,
+ dstHeight: height * scale | 0
+ };
+
+ if (forceSquare) {
+ size.dstWidth = size.dstHeight = Math.min(size.dstWidth, size.dstHeight);
+ size.srcWidth = size.srcHeight = Math.min(width, height);
+ size.xoffset = (width - size.srcWidth) / 2 | 0;
+ size.yoffset = (height - size.srcWidth) / 2 | 0;
+ } else {
+ size.xoffset = size.yoffset = 0;
+ size.srcWidth = width;
+ size.srcHeight = height;
+ }
+
+ return size;
+}
+function fileNameForMime(fname, mime) {
+ const idx = SUPPORTED_IMAGE_FORMATS.indexOf(mime);
+
+ if (idx < 0 || !fname) {
+ return fname;
+ }
+
+ const ext = MIME_EXTENSIONS[idx];
+ const at = fname.lastIndexOf('.');
+
+ if (at >= 0) {
+ fname = fname.substring(0, at);
+ }
+
+ return fname + '.' + ext;
+}
+function imageScaled(fileOrBlob, maxWidth, maxHeight, maxSize, forceSquare, onSuccess, onError) {
+ const img = new Image();
+ img.crossOrigin = 'Anonymous';
+
+ img.onerror = function (err) {
+ onError("Image format unrecognized");
+ };
+
+ img.onload = async function () {
+ URL.revokeObjectURL(img.src);
+ const dim = fitImageSize(this.width, this.height, maxWidth, maxHeight, forceSquare);
+
+ if (!dim) {
+ onError("Invalid image");
+ return;
+ }
+
+ let canvas = document.createElement('canvas');
+ canvas.width = dim.dstWidth;
+ canvas.height = dim.dstHeight;
+ let ctx = canvas.getContext('2d');
+ ctx.imageSmoothingEnabled = true;
+ ctx.drawImage(this, dim.xoffset, dim.yoffset, dim.srcWidth, dim.srcHeight, 0, 0, dim.dstWidth, dim.dstHeight);
+ const mime = SUPPORTED_IMAGE_FORMATS.indexOf(fileOrBlob.type) < 0 ? 'image/jpeg' : fileOrBlob.type;
+ let blob = await new Promise(resolve => canvas.toBlob(resolve, mime));
+
+ if (!blob) {
+ onError("Unsupported image format");
+ return;
+ }
+
+ while (maxSize > 0 && blob.length > maxSize) {
+ dim.dstWidth = dim.dstWidth * 0.70710678118 | 0;
+ dim.dstHeight = dim.dstHeight * 0.70710678118 | 0;
+ canvas.width = dim.dstWidth;
+ canvas.height = dim.dstHeight;
+ ctx = canvas.getContext('2d');
+ ctx.clearRect(0, 0, canvas.width, canvas.height);
+ ctx.drawImage(this, dim.xoffset, dim.yoffset, dim.srcWidth, dim.srcHeight, 0, 0, dim.dstWidth, dim.dstHeight);
+ blob = await new Promise(resolve => canvas.toBlob(resolve, mime));
+ }
+
+ canvas = null;
+ onSuccess(blob, mime, dim.dstWidth, dim.dstHeight, fileNameForMime(fileOrBlob.name, mime));
+ };
+
+ img.src = URL.createObjectURL(fileOrBlob);
+}
+function fileToBase64(file, onSuccess) {
+ const reader = new FileReader();
+ reader.addEventListener('load', function () {
+ onSuccess(file.type, reader.result.split(',')[1], file.name);
+ });
+ reader.readAsDataURL(file);
+}
+function blobToBase64(blob, onSuccess) {
+ const reader = new FileReader();
+ reader.addEventListener('load', function () {
+ onSuccess(blob.type, reader.result.split(',')[1]);
+ });
+ reader.readAsDataURL(blob);
+}
+function filePasted(event, onImageSuccess, onAttachmentSuccess, onError) {
+ var items = (event.clipboardData || event.originalEvent.clipboardData || {}).items;
+
+ for (var i in items) {
+ var item = items[i];
+
+ if (item.kind === 'file') {
+ var file = item.getAsFile();
+
+ if (!file) {
+ console.log("Failed to get file object from pasted file item", item.kind, item.type);
+ continue;
+ }
+
+ if (file.type && file.type.split('/')[0] == 'image') {
+ if (file.size > _config_js__WEBPACK_IMPORTED_MODULE_0__.MAX_INBAND_ATTACHMENT_SIZE || SUPPORTED_IMAGE_FORMATS.indexOf(file.type) < 0) {
+ imageFileScaledToBase64(file, _config_js__WEBPACK_IMPORTED_MODULE_0__.MAX_IMAGE_DIM, _config_js__WEBPACK_IMPORTED_MODULE_0__.MAX_IMAGE_DIM, false, onImageSuccess, onError);
+ } else {
+ imageFileToBase64(file, onImageSuccess, onError);
+ }
+ } else {
+ fileToBase64(file, onAttachmentSuccess, onError);
+ }
+
+ return true;
+ }
+ }
+
+ return false;
+}
+function getMimeType(header) {
+ var mime = /^data:(image\/[-+a-z0-9.]+);base64/.exec(header);
+ return mime && mime.length > 1 ? mime[1] : null;
+}
+function base64EncodedLen(n) {
+ return Math.floor((n + 2) / 3) * 4;
+}
+function base64DecodedLen(n) {
+ return Math.floor(n / 4) * 3;
+}
+function base64ReEncode(str) {
+ if (str) {
+ str = str.replace(/-/g, '+').replace(/_/g, '/');
+
+ try {
+ str = btoa(atob(str));
+ } catch (err) {
+ console.log("Failed to base64 re-encode string.", err);
+ str = null;
+ }
+ }
+
+ return str;
+}
+
+/***/ }),
+
+/***/ "./src/lib/host-name.js":
+/*!******************************!*\
+ !*** ./src/lib/host-name.js ***!
+ \******************************/
+/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
+
+__webpack_require__.r(__webpack_exports__);
+/* harmony export */ __webpack_require__.d(__webpack_exports__, {
+/* harmony export */ "detectServerAddress": function() { return /* binding */ detectServerAddress; },
+/* harmony export */ "isSecureConnection": function() { return /* binding */ isSecureConnection; },
+/* harmony export */ "isLocalHost": function() { return /* binding */ isLocalHost; }
+/* harmony export */ });
+/* harmony import */ var _config_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../config.js */ "./src/config.js");
+
+function detectServerAddress() {
+ let host = _config_js__WEBPACK_IMPORTED_MODULE_0__.DEFAULT_HOST;
+
+ if (typeof window.location == 'object') {
+ if (window.location.protocol == 'file:' || window.location.hostname == 'localhost') {
+ host = _config_js__WEBPACK_IMPORTED_MODULE_0__.KNOWN_HOSTS.local;
+ } else if (window.location.hostname) {
+ host = window.location.hostname + (window.location.port ? ':' + window.location.port : '');
+ }
+ }
+
+ return host;
+}
+function isSecureConnection() {
+ if (typeof window.location == 'object') {
+ return window.location.protocol == 'https:';
+ }
+
+ return false;
+}
+function isLocalHost() {
+ if (typeof window.location == 'object') {
+ return window.location.hostname == 'localhost';
+ }
+
+ return false;
+}
+
+/***/ }),
+
+/***/ "./src/lib/local-storage.js":
+/*!**********************************!*\
+ !*** ./src/lib/local-storage.js ***!
+ \**********************************/
+/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
+
+__webpack_require__.r(__webpack_exports__);
+/* harmony export */ __webpack_require__.d(__webpack_exports__, {
+/* harmony export */ "default": function() { return /* binding */ LocalStorageUtil; }
+/* harmony export */ });
+class LocalStorageUtil {
+ static setObject(key, value) {
+ localStorage.setItem(key, JSON.stringify(value));
+ }
+
+ static getObject(key) {
+ const value = localStorage.getItem(key);
+ return value && JSON.parse(value);
+ }
+
+ static updateObject(key, value) {
+ const oldVal = this.getObject(key);
+ this.setObject(key, Object.assign(oldVal || {}, value));
+ }
+
+ static removeItem(key) {
+ localStorage.removeItem(key);
+ }
+
+}
+
+/***/ }),
+
+/***/ "./src/lib/navigation.js":
+/*!*******************************!*\
+ !*** ./src/lib/navigation.js ***!
+ \*******************************/
+/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
+
+__webpack_require__.r(__webpack_exports__);
+/* harmony export */ __webpack_require__.d(__webpack_exports__, {
+/* harmony export */ "default": function() { return /* binding */ HashNavigation; }
+/* harmony export */ });
+class HashNavigation {
+ static parseUrlHash(hash) {
+ const parts = hash.split('?', 2);
+ const params = {};
+ let path = [];
+
+ if (parts[0]) {
+ path = parts[0].substr(1).split('/');
+ }
+
+ if (parts[1]) {
+ parts[1].split('&').forEach(function (part) {
+ let item = part.split('=');
+
+ if (item[0]) {
+ params[decodeURIComponent(item[0])] = decodeURIComponent(item[1]);
+ }
+ });
+ }
+
+ return {
+ path: path,
+ params: params
+ };
+ }
+
+ static navigateTo(url) {
+ window.location.hash = url;
+ }
+
+ static composeUrlHash(path, params) {
+ let url = path.join('/');
+ const args = [];
+
+ for (const key in params) {
+ if (params.hasOwnProperty(key)) {
+ args.push(key + '=' + params[key]);
+ }
+ }
+
+ if (args.length > 0) {
+ url += '?' + args.join('&');
+ }
+
+ return url;
+ }
+
+ static addUrlParam(hash, key, value) {
+ const parsed = this.parseUrlHash(hash);
+ parsed.params[key] = value;
+ return this.composeUrlHash(parsed.path, parsed.params);
+ }
+
+ static removeUrlParam(hash, key) {
+ const parsed = this.parseUrlHash(hash);
+ delete parsed.params[key];
+ return this.composeUrlHash(parsed.path, parsed.params);
+ }
+
+ static setUrlSidePanel(hash, sidepanel) {
+ const parsed = this.parseUrlHash(hash);
+ parsed.path[0] = sidepanel;
+ return this.composeUrlHash(parsed.path, parsed.params);
+ }
+
+ static setUrlTopic(hash, topic) {
+ const parsed = this.parseUrlHash(hash);
+ parsed.path[1] = topic;
+ delete parsed.params.info;
+ return this.composeUrlHash(parsed.path, parsed.params);
+ }
+
+}
+
+/***/ }),
+
+/***/ "./src/lib/strformat.js":
+/*!******************************!*\
+ !*** ./src/lib/strformat.js ***!
+ \******************************/
+/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
+
+__webpack_require__.r(__webpack_exports__);
+/* harmony export */ __webpack_require__.d(__webpack_exports__, {
+/* harmony export */ "shortDateFormat": function() { return /* binding */ shortDateFormat; },
+/* harmony export */ "secondsToTime": function() { return /* binding */ secondsToTime; },
+/* harmony export */ "bytesToHumanSize": function() { return /* binding */ bytesToHumanSize; },
+/* harmony export */ "stringHash": function() { return /* binding */ stringHash; }
+/* harmony export */ });
+function shortDateFormat(then, locale) {
+ locale = locale || window.navigator.userLanguage || window.navigator.language;
+ const now = new Date();
+
+ if (then.getFullYear() == now.getFullYear()) {
+ if (then.getMonth() == now.getMonth() && then.getDate() == now.getDate()) {
+ return then.toLocaleTimeString(locale, {
+ hour12: false,
+ hour: '2-digit',
+ minute: '2-digit'
+ });
+ } else {
+ return then.toLocaleDateString(locale, {
+ hour12: false,
+ month: 'short',
+ day: 'numeric',
+ hour: '2-digit',
+ minute: '2-digit'
+ });
+ }
+ }
+
+ return then.toLocaleDateString(locale, {
+ hour12: false,
+ year: 'numeric',
+ month: 'short',
+ day: 'numeric',
+ hour: '2-digit',
+ minute: '2-digit'
+ });
+}
+function secondsToTime(seconds) {
+ const min = Math.floor(seconds / 60);
+ let sec = seconds % 60;
+ sec = sec < 10 ? "0".concat(sec) : sec;
+ return "".concat(min, ":").concat(sec);
+}
+function bytesToHumanSize(bytes) {
+ if (!bytes || bytes == 0) {
+ return '0 Bytes';
+ }
+
+ const sizes = ['Bytes', 'KB', 'MB', 'GB', 'TB', 'PB'];
+ const bucket = Math.min(Math.floor(Math.log2(bytes) / 10) | 0, sizes.length - 1);
+ const count = bytes / Math.pow(1024, bucket);
+ const round = bucket > 0 ? count < 3 ? 2 : count < 30 ? 1 : 0 : 0;
+ return count.toFixed(round) + ' ' + sizes[bucket];
+}
+function stringHash(value) {
+ let hash = 0;
+ value = '' + value;
+
+ for (let i = 0; i < value.length; i++) {
+ hash = (hash << 5) - hash + value.charCodeAt(i);
+ hash = hash & hash;
+ }
+
+ return hash;
+}
+
+/***/ }),
+
+/***/ "./src/lib/utils.js":
+/*!**************************!*\
+ !*** ./src/lib/utils.js ***!
+ \**************************/
+/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
+
+__webpack_require__.r(__webpack_exports__);
+/* harmony export */ __webpack_require__.d(__webpack_exports__, {
+/* harmony export */ "updateFavicon": function() { return /* binding */ updateFavicon; },
+/* harmony export */ "vcard": function() { return /* binding */ vcard; },
+/* harmony export */ "arrayEqual": function() { return /* binding */ arrayEqual; },
+/* harmony export */ "asPhone": function() { return /* binding */ asPhone; },
+/* harmony export */ "asEmail": function() { return /* binding */ asEmail; },
+/* harmony export */ "isUrlRelative": function() { return /* binding */ isUrlRelative; },
+/* harmony export */ "sanitizeUrl": function() { return /* binding */ sanitizeUrl; },
+/* harmony export */ "sanitizeImageUrl": function() { return /* binding */ sanitizeImageUrl; }
+/* harmony export */ });
+function updateFavicon(count) {
+ const oldIcon = document.getElementById('shortcut-icon');
+ const head = document.head || document.getElementsByTagName('head')[0];
+ const newIcon = document.createElement('link');
+ newIcon.type = 'image/png';
+ newIcon.id = 'shortcut-icon';
+ newIcon.rel = 'shortcut icon';
+ newIcon.href = 'img/logo32x32' + (count > 0 ? 'a' : '') + '.png';
+
+ if (oldIcon) {
+ head.removeChild(oldIcon);
+ }
+
+ head.appendChild(newIcon);
+ document.title = (count > 0 ? '(' + count + ') ' : '') + 'Tinode';
+}
+function vcard(fn, imageDataUrl) {
+ let card = null;
+
+ if (fn && fn.trim() || imageDataUrl) {
+ card = {};
+
+ if (fn) {
+ card.fn = fn.trim();
+ }
+
+ if (imageDataUrl) {
+ const dataStart = imageDataUrl.indexOf(',');
+ card.photo = dataStart >= 0 ? {
+ data: imageDataUrl.substring(dataStart + 1),
+ type: 'jpg'
+ } : imageDataUrl;
+ }
+ }
+
+ return card;
+}
+function arrayEqual(a, b) {
+ if (a === b) {
+ return true;
+ }
+
+ if (!Array.isArray(a) || !Array.isArray(b)) {
+ return false;
+ }
+
+ if (a.length != b.length) {
+ return false;
+ }
+
+ a.sort();
+ b.sort();
+
+ for (let i = 0, l = a.length; i < l; i++) {
+ if (a[i] !== b[i]) {
+ return false;
+ }
+ }
+
+ return true;
+}
+function asPhone(val) {
+ val = val.trim();
+
+ if (/^(?:\+?(\d{1,3}))?[- (.]*(\d{3})[- ).]*(\d{3})[- .]*(\d{2})[- .]*(\d{2})?$/.test(val)) {
+ return val.replace(/[- ().]*/, '');
+ }
+
+ return null;
+}
+function asEmail(val) {
+ val = val.trim();
+
+ if (/^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+$/.test(val)) {
+ return val;
+ }
+
+ return null;
+}
+function isUrlRelative(url) {
+ return url && !/^\s*([a-z][a-z0-9+.-]*:|\/\/)/im.test(url);
+}
+function sanitizeUrl(url, allowedSchemes) {
+ if (!url) {
+ return null;
+ }
+
+ url = url.replace(/[^\x20-\x7E]/gmi, '').trim();
+
+ if (!/^([a-z][a-z0-9+.-]*:|\/\/)/i.test(url)) {
+ return url;
+ }
+
+ if (/^blob:http/.test(url)) {
+ return url;
+ }
+
+ const schemes = Array.isArray(allowedSchemes) ? allowedSchemes.join('|') : 'http|https';
+ const re = new RegExp('^((' + schemes + '):|//)', 'i');
+
+ if (!re.test(url)) {
+ return null;
+ }
+
+ return url;
+}
+function sanitizeImageUrl(url) {
+ if (!url) {
+ return null;
+ }
+
+ const sanitizedUrl = sanitizeUrl(url);
+
+ if (sanitizedUrl) {
+ return sanitizedUrl;
+ }
+
+ if (/data:image\/[a-z0-9.-]+;base64,/i.test(url.trim())) {
+ return url;
+ }
+
+ return null;
+}
+
+/***/ }),
+
+/***/ "./src/version.js":
+/*!************************!*\
+ !*** ./src/version.js ***!
+ \************************/
+/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
+
+__webpack_require__.r(__webpack_exports__);
+/* harmony export */ __webpack_require__.d(__webpack_exports__, {
+/* harmony export */ "PACKAGE_VERSION": function() { return /* binding */ PACKAGE_VERSION; }
+/* harmony export */ });
+const PACKAGE_VERSION = "0.16.10";
+
+/***/ }),
+
+/***/ "./src/views/acc-general-view.jsx":
+/*!****************************************!*\
+ !*** ./src/views/acc-general-view.jsx ***!
+ \****************************************/
+/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
+
+__webpack_require__.r(__webpack_exports__);
+/* harmony export */ __webpack_require__.d(__webpack_exports__, {
+/* harmony export */ "default": function() { return /* binding */ AccGeneralView; }
+/* harmony export */ });
+/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "react");
+/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);
+/* harmony import */ var react_intl__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react-intl */ "react-intl");
+/* harmony import */ var react_intl__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react_intl__WEBPACK_IMPORTED_MODULE_1__);
+/* harmony import */ var tinode_sdk__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! tinode-sdk */ "tinode-sdk");
+/* harmony import */ var tinode_sdk__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(tinode_sdk__WEBPACK_IMPORTED_MODULE_2__);
+/* harmony import */ var _widgets_avatar_upload_jsx__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../widgets/avatar-upload.jsx */ "./src/widgets/avatar-upload.jsx");
+/* harmony import */ var _widgets_in_place_edit_jsx__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../widgets/in-place-edit.jsx */ "./src/widgets/in-place-edit.jsx");
+/* harmony import */ var _widgets_tag_manager_jsx__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../widgets/tag-manager.jsx */ "./src/widgets/tag-manager.jsx");
+/* harmony import */ var _config_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../config.js */ "./src/config.js");
+/* harmony import */ var _lib_blob_helpers_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../lib/blob-helpers.js */ "./src/lib/blob-helpers.js");
+/* harmony import */ var _lib_utils_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../lib/utils.js */ "./src/lib/utils.js");
+
+
+
+
+
+
+
+
+
+class AccGeneralView extends (react__WEBPACK_IMPORTED_MODULE_0___default().Component) {
+ constructor(props) {
+ super(props);
+ const me = this.props.tinode.getMeTopic();
+ this.state = {
+ fullName: me.public ? me.public.fn : undefined,
+ avatar: (0,_lib_blob_helpers_js__WEBPACK_IMPORTED_MODULE_7__.makeImageUrl)(me.public ? me.public.photo : null),
+ tags: me.tags(),
+ credentials: me.getCredentials() || [],
+ addCredActive: false,
+ addCredInvalid: false,
+ newCred: '',
+ previousOnTags: me.onTagsUpdated
+ };
+ this.tnNewTags = this.tnNewTags.bind(this);
+ this.tnCredsUpdated = this.tnCredsUpdated.bind(this);
+ this.handleFullNameUpdate = this.handleFullNameUpdate.bind(this);
+ this.handleImageChanged = this.handleImageChanged.bind(this);
+ this.handleCredChange = this.handleCredChange.bind(this);
+ this.handleCredKeyDown = this.handleCredKeyDown.bind(this);
+ this.handleCredEntered = this.handleCredEntered.bind(this);
+ this.handleTagsUpdated = this.handleTagsUpdated.bind(this);
+ }
+
+ componentDidMount() {
+ const me = this.props.tinode.getMeTopic();
+ me.onCredsUpdated = this.tnCredsUpdated;
+ me.onTagsUpdated = this.tnNewTags;
+ }
+
+ componentWillUnmount() {
+ const me = this.props.tinode.getMeTopic();
+ me.onTagsUpdated = this.state.previousOnTags;
+ me.onCredsUpdated = undefined;
+ }
+
+ tnNewTags(tags) {
+ this.setState({
+ tags: tags
+ });
+ }
+
+ tnCredsUpdated(creds) {
+ this.setState({
+ credentials: creds || []
+ });
+ }
+
+ handleFullNameUpdate(fn) {
+ fn = fn.trim().substring(0, _config_js__WEBPACK_IMPORTED_MODULE_6__.MAX_TITLE_LENGTH);
+
+ if (fn) {
+ this.setState({
+ fullName: fn
+ });
+ this.props.onUpdateAccount(undefined, (0,_lib_utils_js__WEBPACK_IMPORTED_MODULE_8__.vcard)(fn, null));
+ }
+ }
+
+ handleImageChanged(img) {
+ this.setState({
+ avatar: img
+ });
+ this.props.onUpdateAccount(undefined, (0,_lib_utils_js__WEBPACK_IMPORTED_MODULE_8__.vcard)(null, img || (tinode_sdk__WEBPACK_IMPORTED_MODULE_2___default().DEL_CHAR)));
+ }
+
+ handleCredChange(e) {
+ this.setState({
+ newCred: e.target.value,
+ addCredInvalid: false
+ });
+ }
+
+ handleCredKeyDown(e) {
+ if (e.keyCode === 27) {
+ this.setState({
+ newCred: '',
+ addCredActive: false
+ });
+ } else if (e.keyCode === 13) {
+ this.handleCredEntered(e);
+ }
+ }
+
+ handleCredEntered(e) {
+ let value = this.state.newCred.trim();
+
+ if (!value) {
+ this.setState({
+ addCredActive: false,
+ addCredInvalid: false
+ });
+ return;
+ }
+
+ let val = (0,_lib_utils_js__WEBPACK_IMPORTED_MODULE_8__.asPhone)(value);
+ let method;
+
+ if (val) {
+ method = 'tel';
+ } else {
+ val = (0,_lib_utils_js__WEBPACK_IMPORTED_MODULE_8__.asEmail)(value);
+
+ if (val) {
+ method = 'email';
+ }
+ }
+
+ if (method) {
+ this.props.onCredAdd(method, val);
+ this.setState({
+ addCredActive: false,
+ newCred: ''
+ });
+ } else {
+ this.setState({
+ addCredInvalid: true
+ });
+ }
+ }
+
+ handleTagsUpdated(tags) {
+ if ((0,_lib_utils_js__WEBPACK_IMPORTED_MODULE_8__.arrayEqual)(this.state.tags.slice(0), tags.slice(0))) {
+ return;
+ }
+
+ this.props.onUpdateTags(tags);
+ }
+
+ render() {
+ const credentials = [];
+ this.state.credentials.map(cred => {
+ credentials.push(react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
+ key: cred.meth + ":" + cred.val + ":" + cred.done
+ }, cred.meth, ": ", react__WEBPACK_IMPORTED_MODULE_0___default().createElement("tt", null, cred.val), react__WEBPACK_IMPORTED_MODULE_0___default().createElement("span", null, " ", !cred.done ? react__WEBPACK_IMPORTED_MODULE_0___default().createElement("a", {
+ href: "#",
+ onClick: e => {
+ e.preventDefault();
+ this.props.onCredConfirm(cred.meth, cred.val);
+ }
+ }, react__WEBPACK_IMPORTED_MODULE_0___default().createElement(react_intl__WEBPACK_IMPORTED_MODULE_1__.FormattedMessage, {
+ id: "validate_credential_action",
+ defaultMessage: "confirm",
+ description: "Validate credentail call to action"
+ })) : null, " ", react__WEBPACK_IMPORTED_MODULE_0___default().createElement("a", {
+ href: "#",
+ onClick: e => {
+ e.preventDefault();
+ this.props.onCredDelete(cred.meth, cred.val);
+ }
+ }, react__WEBPACK_IMPORTED_MODULE_0___default().createElement("i", {
+ className: "material-icons gray"
+ }, "delete_outline")))));
+ });
+ return react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
+ className: "scrollable-panel"
+ }, react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
+ className: "panel-form-row"
+ }, react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
+ className: "panel-form-column"
+ }, react__WEBPACK_IMPORTED_MODULE_0___default().createElement("label", {
+ className: "small"
+ }, react__WEBPACK_IMPORTED_MODULE_0___default().createElement(react_intl__WEBPACK_IMPORTED_MODULE_1__.FormattedMessage, {
+ id: "label_your_name"
+ })), react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", null, react__WEBPACK_IMPORTED_MODULE_0___default().createElement(react_intl__WEBPACK_IMPORTED_MODULE_1__.FormattedMessage, {
+ id: "full_name_prompt"
+ }, full_name_placeholder => react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_widgets_in_place_edit_jsx__WEBPACK_IMPORTED_MODULE_4__.default, {
+ placeholder: full_name_placeholder,
+ value: this.state.fullName,
+ onFinished: this.handleFullNameUpdate
+ })))), react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_widgets_avatar_upload_jsx__WEBPACK_IMPORTED_MODULE_3__.default, {
+ avatar: this.state.avatar,
+ uid: this.props.myUserId,
+ title: this.state.fullName,
+ onImageChanged: this.handleImageChanged,
+ onError: this.props.onError
+ })), react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
+ className: "hr"
+ }), react__WEBPACK_IMPORTED_MODULE_0___default().createElement(react_intl__WEBPACK_IMPORTED_MODULE_1__.FormattedMessage, {
+ id: "title_tag_manager",
+ defaultMessage: "Tags (user discovery)",
+ description: "Section title for TagManager"
+ }, title_tag_manager => react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_widgets_tag_manager_jsx__WEBPACK_IMPORTED_MODULE_5__.default, {
+ title: title_tag_manager,
+ activated: false,
+ tags: this.state.tags,
+ tinode: this.props.tinode,
+ onSubmit: this.handleTagsUpdated
+ })), react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
+ className: "hr"
+ }), react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
+ className: "panel-form-column"
+ }, react__WEBPACK_IMPORTED_MODULE_0___default().createElement("label", {
+ className: "small"
+ }, react__WEBPACK_IMPORTED_MODULE_0___default().createElement(react_intl__WEBPACK_IMPORTED_MODULE_1__.FormattedMessage, {
+ id: "label_user_contacts",
+ defaultMessage: "Contacts:",
+ description: "Label for user contacts"
+ })), react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
+ className: "quoted"
+ }, credentials, this.state.addCredActive ? react__WEBPACK_IMPORTED_MODULE_0___default().createElement("input", {
+ type: "text",
+ value: this.state.value,
+ className: this.state.addCredInvalid ? 'invalid' : null,
+ placeholder: "Phone number or email",
+ required: "required",
+ autoFocus: true,
+ onChange: this.handleCredChange,
+ onKeyDown: this.handleCredKeyDown,
+ onBlur: this.handleCredEntered
+ }) : null, react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", null, react__WEBPACK_IMPORTED_MODULE_0___default().createElement("a", {
+ href: "#",
+ onClick: e => {
+ e.preventDefault();
+ this.setState({
+ addCredActive: true
+ });
+ }
+ }, react__WEBPACK_IMPORTED_MODULE_0___default().createElement("i", {
+ className: "material-icons"
+ }, "add"), react__WEBPACK_IMPORTED_MODULE_0___default().createElement(react_intl__WEBPACK_IMPORTED_MODULE_1__.FormattedMessage, {
+ id: "button_add_another",
+ defaultMessage: "Add another",
+ description: "Call to action [+ add another]"
+ }))))));
+ }
+
+}
+;
+
+/***/ }),
+
+/***/ "./src/views/acc-notifications-view.jsx":
+/*!**********************************************!*\
+ !*** ./src/views/acc-notifications-view.jsx ***!
+ \**********************************************/
+/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
+
+__webpack_require__.r(__webpack_exports__);
+/* harmony export */ __webpack_require__.d(__webpack_exports__, {
+/* harmony export */ "default": function() { return /* binding */ EditAccountView; }
+/* harmony export */ });
+/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "react");
+/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);
+/* harmony import */ var react_intl__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react-intl */ "react-intl");
+/* harmony import */ var react_intl__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react_intl__WEBPACK_IMPORTED_MODULE_1__);
+/* harmony import */ var _widgets_checkbox_jsx__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../widgets/checkbox.jsx */ "./src/widgets/checkbox.jsx");
+
+
+
+class EditAccountView extends (react__WEBPACK_IMPORTED_MODULE_0___default().PureComponent) {
+ constructor(props) {
+ super(props);
+ this.handleCheckboxClick = this.handleCheckboxClick.bind(this);
+ }
+
+ handleCheckboxClick(what, checked) {
+ if (what == 'sound') {
+ this.props.onToggleMessageSounds(checked);
+ } else if (what == 'alert') {
+ this.props.onTogglePushNotifications(checked);
+ } else if (what == 'incognito') {
+ this.props.onToggleIncognitoMode(checked);
+ }
+ }
+
+ render() {
+ return react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
+ className: "scrollable-panel"
+ }, react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
+ className: "panel-form-row"
+ }, react__WEBPACK_IMPORTED_MODULE_0___default().createElement("label", {
+ htmlFor: "message-sound"
+ }, react__WEBPACK_IMPORTED_MODULE_0___default().createElement(react_intl__WEBPACK_IMPORTED_MODULE_1__.FormattedMessage, {
+ id: "label_message_sound",
+ defaultMessage: "Message sound:",
+ description: "Label for message sounds toggle"
+ })), react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_widgets_checkbox_jsx__WEBPACK_IMPORTED_MODULE_2__.default, {
+ name: "sound",
+ id: "message-sound",
+ checked: this.props.messageSounds,
+ onChange: this.handleCheckboxClick
+ })), react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
+ className: "panel-form-row"
+ }, react__WEBPACK_IMPORTED_MODULE_0___default().createElement("label", {
+ htmlFor: "desktop-alerts"
+ }, this.props.desktopAlertsEnabled ? react__WEBPACK_IMPORTED_MODULE_0___default().createElement(react_intl__WEBPACK_IMPORTED_MODULE_1__.FormattedMessage, {
+ id: "label_push_notifications",
+ defaultMessage: "Notification alerts:",
+ description: "Label for push notifications switch"
+ }) : react__WEBPACK_IMPORTED_MODULE_0___default().createElement(react_intl__WEBPACK_IMPORTED_MODULE_1__.FormattedMessage, {
+ id: "label_push_notifications_disabled",
+ defaultMessage: "Notification alerts (requires HTTPS):",
+ description: "Label for push notifications switch"
+ })), react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_widgets_checkbox_jsx__WEBPACK_IMPORTED_MODULE_2__.default, {
+ name: "alert",
+ id: "desktop-alerts",
+ checked: this.props.desktopAlerts,
+ onChange: this.props.desktopAlertsEnabled ? this.handleCheckboxClick : null
+ })), react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
+ className: "panel-form-row"
+ }, react__WEBPACK_IMPORTED_MODULE_0___default().createElement("label", {
+ htmlFor: "incognito-mode"
+ }, react__WEBPACK_IMPORTED_MODULE_0___default().createElement(react_intl__WEBPACK_IMPORTED_MODULE_1__.FormattedMessage, {
+ id: "label_incognito_mode",
+ defaultMessage: "Incognito mode:",
+ description: "Label for incognito mode toggle"
+ })), react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_widgets_checkbox_jsx__WEBPACK_IMPORTED_MODULE_2__.default, {
+ name: "incognito",
+ id: "incognito-mode",
+ checked: this.props.incognitoMode,
+ onChange: this.handleCheckboxClick
+ })));
+ }
+
+}
+;
+
+/***/ }),
+
+/***/ "./src/views/acc-security-view.jsx":
+/*!*****************************************!*\
+ !*** ./src/views/acc-security-view.jsx ***!
+ \*****************************************/
+/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
+
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "react");
+/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);
+/* harmony import */ var react_intl__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react-intl */ "react-intl");
+/* harmony import */ var react_intl__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react_intl__WEBPACK_IMPORTED_MODULE_1__);
+/* harmony import */ var _widgets_in_place_edit_jsx__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../widgets/in-place-edit.jsx */ "./src/widgets/in-place-edit.jsx");
+/* harmony import */ var _widgets_permissions_editor_jsx__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../widgets/permissions-editor.jsx */ "./src/widgets/permissions-editor.jsx");
+
+
+
+
+const messages = (0,react_intl__WEBPACK_IMPORTED_MODULE_1__.defineMessages)({
+ delete_account: {
+ id: 'delete_account',
+ defaultMessage: 'Delete account',
+ description: 'Title for delete account warning'
+ },
+ delete_account_warning: {
+ id: 'delete_account_arning',
+ defaultMessage: 'Are you sure you want to delete your account? It cannot be undone.',
+ description: 'Warning message when deleting an account'
+ }
+});
+
+class AccSecurityView extends (react__WEBPACK_IMPORTED_MODULE_0___default().Component) {
+ constructor(props) {
+ super(props);
+ const me = this.props.tinode.getMeTopic();
+ let blockedCount = 0;
+ me.contacts(c => {
+ if (c.acs && !c.acs.isJoiner()) {
+ blockedCount++;
+ }
+ });
+ const defacs = me.getDefaultAccess();
+ this.state = {
+ auth: defacs ? defacs.auth : null,
+ anon: defacs ? defacs.anon : null,
+ showPermissionEditorFor: undefined,
+ blockedCount: blockedCount
+ };
+ this.handlePasswordUpdate = this.handlePasswordUpdate.bind(this);
+ this.handleLaunchPermissionsEditor = this.handleLaunchPermissionsEditor.bind(this);
+ this.handleHidePermissionsEditor = this.handleHidePermissionsEditor.bind(this);
+ this.handlePermissionsChanged = this.handlePermissionsChanged.bind(this);
+ this.handleDeleteAccount = this.handleDeleteAccount.bind(this);
+ }
+
+ handlePasswordUpdate(pwd) {
+ this.setState({
+ password: pwd
+ });
+ this.props.onUpdateAccount(pwd);
+ }
+
+ handleLaunchPermissionsEditor(which) {
+ this.setState({
+ showPermissionEditorFor: which,
+ editedPermissions: this.state[which]
+ });
+ }
+
+ handleHidePermissionsEditor() {
+ this.setState({
+ showPermissionEditorFor: undefined
+ });
+ }
+
+ handlePermissionsChanged(perm) {
+ let defacs = {};
+ defacs[this.state.showPermissionEditorFor] = perm;
+ this.props.onUpdateAccount(undefined, undefined, defacs);
+ let newState = {
+ showPermissionEditorFor: undefined
+ };
+ newState[this.state.showPermissionEditorFor] = perm;
+ this.setState(newState);
+ }
+
+ handleDeleteAccount(e) {
+ e.preventDefault();
+ const {
+ formatMessage
+ } = this.props.intl;
+ this.props.onShowAlert(formatMessage(messages.delete_account), formatMessage(messages.delete_account_warning), () => {
+ this.props.onDeleteAccount();
+ }, null, true, null);
+ }
+
+ render() {
+ return react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null, this.state.showPermissionEditorFor ? react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_widgets_permissions_editor_jsx__WEBPACK_IMPORTED_MODULE_3__.default, {
+ mode: this.state.editedPermissions,
+ skip: "O",
+ onSubmit: this.handlePermissionsChanged,
+ onCancel: this.handleHidePermissionsEditor
+ }) : react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
+ className: "scrollable-panel"
+ }, react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
+ className: "panel-form-column"
+ }, react__WEBPACK_IMPORTED_MODULE_0___default().createElement("label", {
+ className: "small"
+ }, react__WEBPACK_IMPORTED_MODULE_0___default().createElement(react_intl__WEBPACK_IMPORTED_MODULE_1__.FormattedMessage, {
+ id: "label_password",
+ defaultMessage: "Password",
+ description: "Label for password editing"
+ })), react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", null, react__WEBPACK_IMPORTED_MODULE_0___default().createElement(react_intl__WEBPACK_IMPORTED_MODULE_1__.FormattedMessage, {
+ id: "password_unchanged_prompt",
+ defaultMessage: "Unchanged",
+ description: "Message in editor while password is unchanged"
+ }, password_unchanged => react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_widgets_in_place_edit_jsx__WEBPACK_IMPORTED_MODULE_2__.default, {
+ placeholder: password_unchanged,
+ type: "password",
+ onFinished: this.handlePasswordUpdate
+ })))), react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
+ className: "hr"
+ }), react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
+ className: "panel-form-column"
+ }, react__WEBPACK_IMPORTED_MODULE_0___default().createElement("a", {
+ href: "#",
+ className: "red flat-button",
+ onClick: e => {
+ e.preventDefault();
+ this.props.onLogout();
+ }
+ }, react__WEBPACK_IMPORTED_MODULE_0___default().createElement("i", {
+ className: "material-icons"
+ }, "exit_to_app"), " \xA0", react__WEBPACK_IMPORTED_MODULE_0___default().createElement(react_intl__WEBPACK_IMPORTED_MODULE_1__.FormattedMessage, {
+ id: "button_logout",
+ defaultMessage: "Logout",
+ description: "Button [Logout]"
+ })), react__WEBPACK_IMPORTED_MODULE_0___default().createElement("a", {
+ href: "#",
+ className: "red flat-button",
+ onClick: e => {
+ this.handleDeleteAccount(e);
+ }
+ }, react__WEBPACK_IMPORTED_MODULE_0___default().createElement("i", {
+ className: "material-icons"
+ }, "delete"), " \xA0", react__WEBPACK_IMPORTED_MODULE_0___default().createElement(react_intl__WEBPACK_IMPORTED_MODULE_1__.FormattedMessage, {
+ id: "button_delete_account",
+ defaultMessage: "Delete account",
+ description: "Button [Delete account]"
+ }))), react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
+ className: "hr"
+ }), react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
+ className: "panel-form-column"
+ }, react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", null, react__WEBPACK_IMPORTED_MODULE_0___default().createElement("label", {
+ className: "small"
+ }, react__WEBPACK_IMPORTED_MODULE_0___default().createElement(react_intl__WEBPACK_IMPORTED_MODULE_1__.FormattedMessage, {
+ id: "label_default_access_mode",
+ defaultMessage: "Default access mode:",
+ description: "Label for default access mode"
+ }))), react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
+ className: "quoted"
+ }, react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", null, "Auth: ", react__WEBPACK_IMPORTED_MODULE_0___default().createElement("tt", {
+ className: "clickable",
+ onClick: this.handleLaunchPermissionsEditor.bind(this, 'auth')
+ }, this.state.auth)), react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", null, "Anon: ", react__WEBPACK_IMPORTED_MODULE_0___default().createElement("tt", {
+ className: "clickable",
+ onClick: this.handleLaunchPermissionsEditor.bind(this, 'anon')
+ }, this.state.anon)))), this.state.blockedCount > 0 ? react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null, react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
+ className: "hr"
+ }), react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
+ className: "panel-form-row"
+ }, react__WEBPACK_IMPORTED_MODULE_0___default().createElement("i", {
+ className: "material-icons"
+ }, "block"), "\xA0", react__WEBPACK_IMPORTED_MODULE_0___default().createElement("a", {
+ href: "#",
+ className: "gray",
+ onClick: e => {
+ e.preventDefault();
+ this.props.onShowBlocked();
+ }
+ }, react__WEBPACK_IMPORTED_MODULE_0___default().createElement(react_intl__WEBPACK_IMPORTED_MODULE_1__.FormattedMessage, {
+ id: "blocked_contacts_link",
+ defaultMessage: "Blocked contacts ({count})",
+ values: {
+ count: this.state.blockedCount
+ },
+ description: "Blocked contacts link"
+ })))) : null));
+ }
+
+}
+
+;
+/* harmony default export */ __webpack_exports__["default"] = ((0,react_intl__WEBPACK_IMPORTED_MODULE_1__.injectIntl)(AccSecurityView));
+
+/***/ }),
+
+/***/ "./src/views/acc-support-view.jsx":
+/*!****************************************!*\
+ !*** ./src/views/acc-support-view.jsx ***!
+ \****************************************/
+/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
+
+__webpack_require__.r(__webpack_exports__);
+/* harmony export */ __webpack_require__.d(__webpack_exports__, {
+/* harmony export */ "default": function() { return /* binding */ AccSupportView; }
+/* harmony export */ });
+/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "react");
+/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);
+/* harmony import */ var react_intl__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react-intl */ "react-intl");
+/* harmony import */ var react_intl__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react_intl__WEBPACK_IMPORTED_MODULE_1__);
+/* harmony import */ var tinode_sdk__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! tinode-sdk */ "tinode-sdk");
+/* harmony import */ var tinode_sdk__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(tinode_sdk__WEBPACK_IMPORTED_MODULE_2__);
+/* harmony import */ var _config_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../config.js */ "./src/config.js");
+
+
+
+
+class AccSupportView extends (react__WEBPACK_IMPORTED_MODULE_0___default().PureComponent) {
+ render() {
+ return react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
+ className: "scrollable-panel"
+ }, react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
+ className: "panel-form-column"
+ }, react__WEBPACK_IMPORTED_MODULE_0___default().createElement("a", {
+ href: _config_js__WEBPACK_IMPORTED_MODULE_3__.LINK_CONTACT_US,
+ className: "flat-button",
+ target: "_blank"
+ }, react__WEBPACK_IMPORTED_MODULE_0___default().createElement("i", {
+ className: "material-icons"
+ }, "email"), " \xA0", react__WEBPACK_IMPORTED_MODULE_0___default().createElement(react_intl__WEBPACK_IMPORTED_MODULE_1__.FormattedMessage, {
+ id: "link_contact_us",
+ defaultMessage: "Contact Us",
+ description: "Ancor text for contacting us by email"
+ })), react__WEBPACK_IMPORTED_MODULE_0___default().createElement("a", {
+ href: _config_js__WEBPACK_IMPORTED_MODULE_3__.LINK_TERMS_OF_SERVICE,
+ className: "flat-button",
+ target: "_blank"
+ }, react__WEBPACK_IMPORTED_MODULE_0___default().createElement("i", {
+ className: "material-icons"
+ }, "description"), " \xA0", react__WEBPACK_IMPORTED_MODULE_0___default().createElement(react_intl__WEBPACK_IMPORTED_MODULE_1__.FormattedMessage, {
+ id: "link_terms_of_service",
+ defaultMessage: "Terms of Service",
+ description: "Ancor text for terms of service link"
+ })), react__WEBPACK_IMPORTED_MODULE_0___default().createElement("a", {
+ href: _config_js__WEBPACK_IMPORTED_MODULE_3__.LINK_PRIVACY_POLICY,
+ className: "flat-button",
+ target: "_blank"
+ }, react__WEBPACK_IMPORTED_MODULE_0___default().createElement("i", {
+ className: "material-icons"
+ }, "policy"), " \xA0", react__WEBPACK_IMPORTED_MODULE_0___default().createElement(react_intl__WEBPACK_IMPORTED_MODULE_1__.FormattedMessage, {
+ id: "link_privacy_policy",
+ defaultMessage: "Privacy Policy",
+ description: "Ancor text for privacy policy link"
+ }))), react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
+ className: "hr"
+ }), react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
+ className: "panel-form-column"
+ }, react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
+ className: "panel-form-row"
+ }, react__WEBPACK_IMPORTED_MODULE_0___default().createElement("label", {
+ className: "small"
+ }, react__WEBPACK_IMPORTED_MODULE_0___default().createElement(react_intl__WEBPACK_IMPORTED_MODULE_1__.FormattedMessage, {
+ id: "label_client"
+ })), _config_js__WEBPACK_IMPORTED_MODULE_3__.APP_NAME), react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
+ className: "panel-form-row"
+ }, react__WEBPACK_IMPORTED_MODULE_0___default().createElement("label", {
+ className: "small"
+ }, react__WEBPACK_IMPORTED_MODULE_0___default().createElement(react_intl__WEBPACK_IMPORTED_MODULE_1__.FormattedMessage, {
+ id: "label_sdk",
+ defaultMessage: "SDK:"
+ })), tinode_sdk__WEBPACK_IMPORTED_MODULE_2___default().getLibrary()), react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
+ className: "panel-form-row"
+ }, react__WEBPACK_IMPORTED_MODULE_0___default().createElement("label", {
+ className: "small"
+ }, react__WEBPACK_IMPORTED_MODULE_0___default().createElement(react_intl__WEBPACK_IMPORTED_MODULE_1__.FormattedMessage, {
+ id: "label_server"
+ })), this.props.serverVersion), react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
+ className: "panel-form-row"
+ }, react__WEBPACK_IMPORTED_MODULE_0___default().createElement("label", {
+ className: "small"
+ }, react__WEBPACK_IMPORTED_MODULE_0___default().createElement(react_intl__WEBPACK_IMPORTED_MODULE_1__.FormattedMessage, {
+ id: "label_server_address",
+ defaultMessage: "Server address:"
+ })), this.props.serverAddress)));
+ }
+
+}
+;
+
+/***/ }),
+
+/***/ "./src/views/contacts-view.jsx":
+/*!*************************************!*\
+ !*** ./src/views/contacts-view.jsx ***!
+ \*************************************/
+/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
+
+__webpack_require__.r(__webpack_exports__);
+/* harmony export */ __webpack_require__.d(__webpack_exports__, {
+/* harmony export */ "default": function() { return /* binding */ ContactsView; }
+/* harmony export */ });
+/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "react");
+/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);
+/* harmony import */ var react_intl__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react-intl */ "react-intl");
+/* harmony import */ var react_intl__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react_intl__WEBPACK_IMPORTED_MODULE_1__);
+/* harmony import */ var _widgets_contact_list_jsx__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../widgets/contact-list.jsx */ "./src/widgets/contact-list.jsx");
+/* harmony import */ var _lib_utils_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../lib/utils.js */ "./src/lib/utils.js");
+
+
+
+
+const messages = (0,react_intl__WEBPACK_IMPORTED_MODULE_1__.defineMessages)({
+ archived_contacts_title: {
+ id: "archived_contacts",
+ defaultMessage: "Archived contacts ({count})",
+ description: "Label for archived chats"
+ }
+});
+class ContactsView extends (react__WEBPACK_IMPORTED_MODULE_0___default().Component) {
+ constructor(props) {
+ super(props);
+ this.handleAction = this.handleAction.bind(this);
+ this.state = ContactsView.deriveStateFromProps(props);
+ }
+
+ static deriveStateFromProps(props) {
+ const contacts = [];
+ let unreadThreads = 0;
+ let archivedCount = 0;
+ props.chatList.map(c => {
+ const blocked = c.acs && !c.acs.isJoiner();
+
+ if (blocked && props.blocked) {
+ contacts.push(c);
+ }
+
+ if (blocked || props.blocked) {
+ return;
+ }
+
+ if (c.private && c.private.arch) {
+ if (props.archive) {
+ contacts.push(c);
+ } else {
+ archivedCount++;
+ }
+ } else if (!props.archive) {
+ contacts.push(c);
+ unreadThreads += c.unread > 0 ? 1 : 0;
+ }
+ });
+ contacts.sort((a, b) => {
+ return (b.touched || 0) - (a.touched || 0);
+ });
+
+ if (archivedCount > 0) {
+ contacts.push({
+ action: 'archive',
+ title: messages.archived_contacts_title,
+ values: {
+ count: archivedCount
+ }
+ });
+ }
+
+ return {
+ contactList: contacts,
+ unreadThreads: unreadThreads
+ };
+ }
+
+ componentDidUpdate(prevProps, prevState) {
+ if (prevProps.chatList != this.props.chatList || prevProps.archive != this.props.archive || prevProps.blocked != this.props.blocked) {
+ const newState = ContactsView.deriveStateFromProps(this.props);
+ this.setState(newState);
+
+ if (newState.unreadThreads != prevState.unreadThreads) {
+ (0,_lib_utils_js__WEBPACK_IMPORTED_MODULE_3__.updateFavicon)(newState.unreadThreads);
+ }
+ }
+ }
+
+ handleAction(action_ignored) {
+ this.props.onShowArchive();
+ }
+
+ render() {
+ return react__WEBPACK_IMPORTED_MODULE_0___default().createElement(react_intl__WEBPACK_IMPORTED_MODULE_1__.FormattedMessage, {
+ id: "contacts_not_found",
+ defaultMessage: "You have no chats
\xAF\u2216_(\u30C4)_/\xAF",
+ description: "HTML message shown in ContactList when no contacts are found"
+ }, no_contacts => react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_widgets_contact_list_jsx__WEBPACK_IMPORTED_MODULE_2__.default, {
+ connected: this.props.connected,
+ contacts: this.state.contactList,
+ emptyListMessage: no_contacts,
+ topicSelected: this.props.topicSelected,
+ myUserId: this.props.myUserId,
+ showOnline: true,
+ showUnread: true,
+ onTopicSelected: this.props.onTopicSelected,
+ showContextMenu: this.props.showContextMenu,
+ onAction: this.handleAction
+ }));
+ }
+
+}
+;
+
+/***/ }),
+
+/***/ "./src/views/create-account-view.jsx":
+/*!*******************************************!*\
+ !*** ./src/views/create-account-view.jsx ***!
+ \*******************************************/
+/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
+
+__webpack_require__.r(__webpack_exports__);
+/* harmony export */ __webpack_require__.d(__webpack_exports__, {
+/* harmony export */ "default": function() { return /* binding */ CreateAccountView; }
+/* harmony export */ });
+/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "react");
+/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);
+/* harmony import */ var react_intl__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react-intl */ "react-intl");
+/* harmony import */ var react_intl__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react_intl__WEBPACK_IMPORTED_MODULE_1__);
+/* harmony import */ var _widgets_avatar_upload_jsx__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../widgets/avatar-upload.jsx */ "./src/widgets/avatar-upload.jsx");
+/* harmony import */ var _widgets_checkbox_jsx__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../widgets/checkbox.jsx */ "./src/widgets/checkbox.jsx");
+/* harmony import */ var _widgets_visible_password_jsx__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../widgets/visible-password.jsx */ "./src/widgets/visible-password.jsx");
+/* harmony import */ var _lib_local_storage_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../lib/local-storage.js */ "./src/lib/local-storage.js");
+/* harmony import */ var _lib_utils_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../lib/utils.js */ "./src/lib/utils.js");
+/* harmony import */ var _config_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../config.js */ "./src/config.js");
+
+
+
+
+
+
+
+
+class CreateAccountView extends (react__WEBPACK_IMPORTED_MODULE_0___default().PureComponent) {
+ constructor(props) {
+ super(props);
+ this.state = {
+ login: '',
+ password: '',
+ email: '',
+ fn: '',
+ imageDataUrl: null,
+ errorCleared: false,
+ saveToken: _lib_local_storage_js__WEBPACK_IMPORTED_MODULE_5__.default.getObject('keep-logged-in')
+ };
+ this.handleLoginChange = this.handleLoginChange.bind(this);
+ this.handlePasswordChange = this.handlePasswordChange.bind(this);
+ this.handleEmailChange = this.handleEmailChange.bind(this);
+ this.handleFnChange = this.handleFnChange.bind(this);
+ this.handleImageChanged = this.handleImageChanged.bind(this);
+ this.handleToggleSaveToken = this.handleToggleSaveToken.bind(this);
+ this.handleSubmit = this.handleSubmit.bind(this);
+ }
+
+ handleLoginChange(e) {
+ this.setState({
+ login: e.target.value
+ });
+ }
+
+ handlePasswordChange(password) {
+ this.setState({
+ password: password
+ });
+ }
+
+ handleEmailChange(e) {
+ this.setState({
+ email: e.target.value
+ });
+ }
+
+ handleFnChange(e) {
+ this.setState({
+ fn: e.target.value
+ });
+ }
+
+ handleImageChanged(img) {
+ this.setState({
+ imageDataUrl: img
+ });
+ }
+
+ handleToggleSaveToken() {
+ _lib_local_storage_js__WEBPACK_IMPORTED_MODULE_5__.default.setObject('keep-logged-in', !this.state.saveToken);
+ this.setState({
+ saveToken: !this.state.saveToken
+ });
+ }
+
+ handleSubmit(e) {
+ e.preventDefault();
+ this.setState({
+ errorCleared: false
+ });
+ this.props.onCreateAccount(this.state.login.trim(), this.state.password.trim(), (0,_lib_utils_js__WEBPACK_IMPORTED_MODULE_6__.vcard)(this.state.fn.trim().substring(0, _config_js__WEBPACK_IMPORTED_MODULE_7__.MAX_TITLE_LENGTH), this.state.imageDataUrl), {
+ 'meth': 'email',
+ 'val': this.state.email
+ });
+ }
+
+ render() {
+ let submitClasses = 'blue';
+
+ if (this.props.disabled) {
+ submitClasses += ' disabled';
+ }
+
+ return react__WEBPACK_IMPORTED_MODULE_0___default().createElement("form", {
+ className: "panel-form-column",
+ onSubmit: this.handleSubmit
+ }, react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
+ className: "panel-form-row"
+ }, react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
+ className: "panel-form-column"
+ }, react__WEBPACK_IMPORTED_MODULE_0___default().createElement(react_intl__WEBPACK_IMPORTED_MODULE_1__.FormattedMessage, {
+ id: "login_prompt"
+ }, login_prompt => react__WEBPACK_IMPORTED_MODULE_0___default().createElement("input", {
+ type: "text",
+ placeholder: login_prompt,
+ autoComplete: "user-name",
+ value: this.state.login,
+ onChange: this.handleLoginChange,
+ required: true,
+ autoFocus: true
+ })), react__WEBPACK_IMPORTED_MODULE_0___default().createElement(react_intl__WEBPACK_IMPORTED_MODULE_1__.FormattedMessage, {
+ id: "password_prompt"
+ }, password_prompt => react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_widgets_visible_password_jsx__WEBPACK_IMPORTED_MODULE_4__.default, {
+ placeholder: password_prompt,
+ autoComplete: "new-password",
+ value: this.state.password,
+ onFinished: this.handlePasswordChange,
+ required: true
+ }))), react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_widgets_avatar_upload_jsx__WEBPACK_IMPORTED_MODULE_2__.default, {
+ onImageChanged: this.handleImageChanged,
+ onError: this.props.onError
+ })), react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
+ className: "panel-form-row"
+ }, react__WEBPACK_IMPORTED_MODULE_0___default().createElement(react_intl__WEBPACK_IMPORTED_MODULE_1__.FormattedMessage, {
+ id: "full_name_prompt",
+ defaultMessage: "Full name, e.g. John Doe",
+ description: "Input placeholder for person's full name"
+ }, full_name_prompt => react__WEBPACK_IMPORTED_MODULE_0___default().createElement("input", {
+ type: "text",
+ placeholder: full_name_prompt,
+ autoComplete: "name",
+ value: this.state.fn,
+ onChange: this.handleFnChange,
+ required: true
+ }))), react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
+ className: "panel-form-row"
+ }, react__WEBPACK_IMPORTED_MODULE_0___default().createElement(react_intl__WEBPACK_IMPORTED_MODULE_1__.FormattedMessage, {
+ id: "email_prompt",
+ defaultMessage: "Email, e.g. jdoe@example.com",
+ description: "Input placeholder for email entry"
+ }, email_prompt => react__WEBPACK_IMPORTED_MODULE_0___default().createElement("input", {
+ type: "email",
+ placeholder: email_prompt,
+ autoComplete: "email",
+ value: this.state.email,
+ onChange: this.handleEmailChange,
+ required: true
+ }))), react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
+ className: "panel-form-row"
+ }, react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_widgets_checkbox_jsx__WEBPACK_IMPORTED_MODULE_3__.default, {
+ id: "save-token",
+ name: "save-token",
+ checked: this.state.saveToken,
+ onChange: this.handleToggleSaveToken
+ }), react__WEBPACK_IMPORTED_MODULE_0___default().createElement(react_intl__WEBPACK_IMPORTED_MODULE_1__.FormattedMessage, {
+ id: "stay_logged_in"
+ }, stay_logged_in => react__WEBPACK_IMPORTED_MODULE_0___default().createElement("label", {
+ htmlFor: "save-token"
+ }, "\xA0", stay_logged_in))), react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
+ className: "dialog-buttons"
+ }, react__WEBPACK_IMPORTED_MODULE_0___default().createElement("button", {
+ className: submitClasses,
+ type: "submit"
+ }, react__WEBPACK_IMPORTED_MODULE_0___default().createElement(react_intl__WEBPACK_IMPORTED_MODULE_1__.FormattedMessage, {
+ id: "button_sign_up",
+ defaultMessage: "Sign up",
+ description: "Create account button [Sign Up]"
+ }))));
+ }
+
+}
+;
+
+/***/ }),
+
+/***/ "./src/views/edit-account-view.jsx":
+/*!*****************************************!*\
+ !*** ./src/views/edit-account-view.jsx ***!
+ \*****************************************/
+/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
+
+__webpack_require__.r(__webpack_exports__);
+/* harmony export */ __webpack_require__.d(__webpack_exports__, {
+/* harmony export */ "default": function() { return /* binding */ EditAccountView; }
+/* harmony export */ });
+/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "react");
+/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);
+/* harmony import */ var react_intl__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react-intl */ "react-intl");
+/* harmony import */ var react_intl__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react_intl__WEBPACK_IMPORTED_MODULE_1__);
+/* harmony import */ var _widgets_avatar_upload_jsx__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../widgets/avatar-upload.jsx */ "./src/widgets/avatar-upload.jsx");
+/* harmony import */ var _lib_blob_helpers_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../lib/blob-helpers.js */ "./src/lib/blob-helpers.js");
+
+
+
+
+class EditAccountView extends (react__WEBPACK_IMPORTED_MODULE_0___default().Component) {
+ constructor(props) {
+ super(props);
+ const me = this.props.tinode.getMeTopic();
+ this.state = {
+ fullName: me.public ? me.public.fn : undefined,
+ avatar: (0,_lib_blob_helpers_js__WEBPACK_IMPORTED_MODULE_3__.makeImageUrl)(me.public ? me.public.photo : null)
+ };
+ }
+
+ render() {
+ return react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
+ className: "scrollable-panel"
+ }, react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
+ className: "panel-form-row"
+ }, react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
+ className: "panel-form-column"
+ }, react__WEBPACK_IMPORTED_MODULE_0___default().createElement("label", {
+ className: "small"
+ }, react__WEBPACK_IMPORTED_MODULE_0___default().createElement(react_intl__WEBPACK_IMPORTED_MODULE_1__.FormattedMessage, {
+ id: "label_your_name",
+ defaultMessage: "Your name",
+ description: "Label for full name editing"
+ })), react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
+ className: "large"
+ }, this.state.fullName), react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", null, react__WEBPACK_IMPORTED_MODULE_0___default().createElement("label", {
+ className: "small"
+ }, react__WEBPACK_IMPORTED_MODULE_0___default().createElement(react_intl__WEBPACK_IMPORTED_MODULE_1__.FormattedMessage, {
+ id: "label_user_id",
+ defaultMessage: "ID:",
+ description: "Label for user address (ID)"
+ })), "\xA0", react__WEBPACK_IMPORTED_MODULE_0___default().createElement("tt", null, this.props.myUserId))), react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_widgets_avatar_upload_jsx__WEBPACK_IMPORTED_MODULE_2__.default, {
+ avatar: this.state.avatar,
+ readOnly: !this.state.owner,
+ uid: this.props.myUserId,
+ title: this.state.fullName
+ })), react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
+ className: "panel-form-row"
+ }, react__WEBPACK_IMPORTED_MODULE_0___default().createElement("a", {
+ href: "#",
+ className: "flat-button",
+ onClick: e => {
+ e.preventDefault();
+ this.props.onBasicNavigate('general');
+ }
+ }, react__WEBPACK_IMPORTED_MODULE_0___default().createElement("i", {
+ className: "material-icons"
+ }, "edit"), "\xA0", react__WEBPACK_IMPORTED_MODULE_0___default().createElement(react_intl__WEBPACK_IMPORTED_MODULE_1__.FormattedMessage, {
+ id: "button_edit",
+ defaultMessage: "Edit",
+ description: "Call to action [Edit]"
+ }))), react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
+ className: "hr"
+ }), react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
+ className: "panel-form-column"
+ }, react__WEBPACK_IMPORTED_MODULE_0___default().createElement("a", {
+ href: "#",
+ className: "flat-button",
+ onClick: e => {
+ e.preventDefault();
+ this.props.onBasicNavigate('notif');
+ }
+ }, react__WEBPACK_IMPORTED_MODULE_0___default().createElement("i", {
+ className: "material-icons"
+ }, "notifications"), "\xA0", react__WEBPACK_IMPORTED_MODULE_0___default().createElement(react_intl__WEBPACK_IMPORTED_MODULE_1__.FormattedMessage, {
+ id: "sidepanel_title_acc_notifications"
+ })), react__WEBPACK_IMPORTED_MODULE_0___default().createElement("a", {
+ href: "#",
+ className: "flat-button",
+ onClick: e => {
+ e.preventDefault();
+ this.props.onBasicNavigate('security');
+ }
+ }, react__WEBPACK_IMPORTED_MODULE_0___default().createElement("i", {
+ className: "material-icons"
+ }, "security"), "\xA0", react__WEBPACK_IMPORTED_MODULE_0___default().createElement(react_intl__WEBPACK_IMPORTED_MODULE_1__.FormattedMessage, {
+ id: "sidepanel_title_acc_security"
+ })), react__WEBPACK_IMPORTED_MODULE_0___default().createElement("a", {
+ href: "#",
+ className: "flat-button",
+ onClick: e => {
+ e.preventDefault();
+ this.props.onBasicNavigate('support');
+ }
+ }, react__WEBPACK_IMPORTED_MODULE_0___default().createElement("i", {
+ className: "material-icons"
+ }, "contact_support"), "\xA0", react__WEBPACK_IMPORTED_MODULE_0___default().createElement(react_intl__WEBPACK_IMPORTED_MODULE_1__.FormattedMessage, {
+ id: "sidepanel_title_acc_support"
+ }))));
+ }
+
+}
+;
+
+/***/ }),
+
+/***/ "./src/views/info-view.jsx":
+/*!*********************************!*\
+ !*** ./src/views/info-view.jsx ***!
+ \*********************************/
+/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
+
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "react");
+/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);
+/* harmony import */ var react_intl__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react-intl */ "react-intl");
+/* harmony import */ var react_intl__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react_intl__WEBPACK_IMPORTED_MODULE_1__);
+/* harmony import */ var tinode_sdk__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! tinode-sdk */ "tinode-sdk");
+/* harmony import */ var tinode_sdk__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(tinode_sdk__WEBPACK_IMPORTED_MODULE_2__);
+/* harmony import */ var _widgets_avatar_upload_jsx__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../widgets/avatar-upload.jsx */ "./src/widgets/avatar-upload.jsx");
+/* harmony import */ var _widgets_checkbox_jsx__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../widgets/checkbox.jsx */ "./src/widgets/checkbox.jsx");
+/* harmony import */ var _widgets_contact_list_jsx__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../widgets/contact-list.jsx */ "./src/widgets/contact-list.jsx");
+/* harmony import */ var _widgets_error_panel_jsx__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../widgets/error-panel.jsx */ "./src/widgets/error-panel.jsx");
+/* harmony import */ var _widgets_group_manager_jsx__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../widgets/group-manager.jsx */ "./src/widgets/group-manager.jsx");
+/* harmony import */ var _widgets_in_place_edit_jsx__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../widgets/in-place-edit.jsx */ "./src/widgets/in-place-edit.jsx");
+/* harmony import */ var _widgets_menu_cancel_jsx__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../widgets/menu-cancel.jsx */ "./src/widgets/menu-cancel.jsx");
+/* harmony import */ var _widgets_more_button_jsx__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../widgets/more-button.jsx */ "./src/widgets/more-button.jsx");
+/* harmony import */ var _widgets_permissions_editor_jsx__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../widgets/permissions-editor.jsx */ "./src/widgets/permissions-editor.jsx");
+/* harmony import */ var _widgets_tag_manager_jsx__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ../widgets/tag-manager.jsx */ "./src/widgets/tag-manager.jsx");
+/* harmony import */ var _config_js__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ../config.js */ "./src/config.js");
+/* harmony import */ var _lib_blob_helpers_js__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ../lib/blob-helpers.js */ "./src/lib/blob-helpers.js");
+/* harmony import */ var _lib_utils_js__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ../lib/utils.js */ "./src/lib/utils.js");
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+const messages = (0,react_intl__WEBPACK_IMPORTED_MODULE_1__.defineMessages)({
+ requested: {
+ id: 'requested_permissions',
+ defaultMessage: 'Requested',
+ description: 'Title for permissions'
+ },
+ granted: {
+ id: 'granted_permissions',
+ defaultMessage: 'Granted',
+ description: 'Title for permissions'
+ },
+ edit_permissions: {
+ id: 'menu_item_edit_permissions',
+ defaultMessage: 'Edit permissions',
+ description: 'Menu item [Edit permissions]'
+ },
+ other_user: {
+ id: 'label_other_user',
+ defaultMessage: 'Other',
+ description: 'Label for the other user when the user is unnamed'
+ },
+ clear_messages: {
+ id: 'action_clear_messages',
+ defaultMessage: 'Clear Messages',
+ description: 'Flat button [Clear Messages] (soft-delete messages)'
+ },
+ clear_messages_warning: {
+ id: 'clear_messages_warning',
+ defaultMessage: 'Are you sure you want to clear all messages? It cannot be undone.',
+ description: 'Alert dialog warning when deleting all messages.'
+ },
+ delete_messages: {
+ id: 'action_delete_messages',
+ defaultMessage: 'Clear Messages for All',
+ description: 'Flat button [Clear for All] (hard-delete all messages)'
+ },
+ delete_messages_warning: {
+ id: 'delete_messages_warning',
+ defaultMessage: 'Are you sure you want to delete all messages for everyone? It cannot be undone.',
+ description: 'Alert dialog warning when hard-deleting all messages.'
+ },
+ leave_chat: {
+ id: 'action_leave_chat',
+ defaultMessage: 'Leave Conversation',
+ description: 'Flat button [Leave Conversation]'
+ },
+ leave_chat_warning: {
+ id: 'leave_chat_warning',
+ defaultMessage: 'Are you sure you want to leave this conversation?',
+ description: 'Alert dialog warning when unsubscribing from a chat.'
+ },
+ block_contact: {
+ id: 'action_block_contact',
+ defaultMessage: "Block Contact",
+ description: "Flat button [Block Contact]"
+ },
+ block_contact_warning: {
+ id: 'block_contact_warning',
+ defaultMessage: 'Are you sure you want to block this contact?',
+ description: 'Alert dialog warning when blocking a contact.'
+ },
+ report_chat: {
+ id: 'action_report_chat',
+ defaultMessage: 'Report Conversation',
+ description: 'Flat button [Report Group]'
+ },
+ report_chat_warning: {
+ id: 'report_chat_warning',
+ defaultMessage: 'Are you sure you want to block and report this conversation?',
+ description: 'Alert dialog warning when reporting a conversation for abuse'
+ }
+});
+
+class InfoView extends (react__WEBPACK_IMPORTED_MODULE_0___default().Component) {
+ constructor(props) {
+ super(props);
+ this.state = {
+ topic: null,
+ owner: false,
+ admin: false,
+ sharer: false,
+ deleter: false,
+ muted: false,
+ address: null,
+ groupTopic: undefined,
+ channel: undefined,
+ fullName: undefined,
+ avatar: null,
+ private: null,
+ selectedContact: null,
+ access: null,
+ modeGiven: null,
+ modeWant: null,
+ modeGiven2: null,
+ modeWant2: null,
+ auth: null,
+ anon: null,
+ contactList: [],
+ tags: [],
+ showMemberPanel: false,
+ showPermissionEditorFor: undefined,
+ moreInfoExpanded: false,
+ previousMetaDesc: undefined,
+ previousSubsUpdated: undefined,
+ previousTagsUpdated: undefined
+ };
+ this.resetSubs = this.resetSubs.bind(this);
+ this.resetDesc = this.resetDesc.bind(this);
+ this.onMetaDesc = this.onMetaDesc.bind(this);
+ this.onSubsUpdated = this.onSubsUpdated.bind(this);
+ this.onTagsUpdated = this.onTagsUpdated.bind(this);
+ this.handleFullNameUpdate = this.handleFullNameUpdate.bind(this);
+ this.handlePrivateUpdate = this.handlePrivateUpdate.bind(this);
+ this.handleImageChanged = this.handleImageChanged.bind(this);
+ this.handleMuted = this.handleMuted.bind(this);
+ this.handlePermissionsChanged = this.handlePermissionsChanged.bind(this);
+ this.handleLaunchPermissionsEditor = this.handleLaunchPermissionsEditor.bind(this);
+ this.handleHidePermissionsEditor = this.handleHidePermissionsEditor.bind(this);
+ this.handleShowAddMembers = this.handleShowAddMembers.bind(this);
+ this.handleHideAddMembers = this.handleHideAddMembers.bind(this);
+ this.handleMemberUpdateRequest = this.handleMemberUpdateRequest.bind(this);
+ this.handleDeleteMessages = this.handleDeleteMessages.bind(this);
+ this.handleLeave = this.handleLeave.bind(this);
+ this.handleBlock = this.handleBlock.bind(this);
+ this.handleReport = this.handleReport.bind(this);
+ this.handleMemberSelected = this.handleMemberSelected.bind(this);
+ this.handleMoreInfo = this.handleMoreInfo.bind(this);
+ this.handleTagsUpdated = this.handleTagsUpdated.bind(this);
+ this.handleContextMenu = this.handleContextMenu.bind(this);
+ }
+
+ componentDidUpdate(props) {
+ const topic = this.props.tinode.getTopic(props.topic);
+
+ if (!topic) {
+ return;
+ }
+
+ if (this.onMetaDesc != topic.onMetaDesc) {
+ this.previousMetaDesc = topic.onMetaDesc;
+ topic.onMetaDesc = this.onMetaDesc;
+ this.previousSubsUpdated = topic.onSubsUpdated;
+ topic.onSubsUpdated = this.onSubsUpdated;
+
+ if (topic.getType() == 'grp') {
+ this.previousTagsUpdated = topic.onTagsUpdated;
+ topic.onTagsUpdated = this.onTagsUpdated;
+ } else {
+ this.previousTagsUpdated = undefined;
+ }
+ }
+
+ if (this.state.topic != props.topic) {
+ this.setState({
+ topic: props.topic
+ });
+ this.resetDesc(topic, props);
+ this.resetSubs(topic, props);
+ }
+ }
+
+ componentWillUnmount() {
+ const topic = this.props.tinode.getTopic(this.props.topic);
+
+ if (!topic) {
+ return;
+ }
+
+ this.setState({
+ topic: null
+ });
+ topic.onMetaDesc = this.previousMetaDesc;
+ topic.onSubsUpdated = this.previousSubsUpdated;
+ topic.onTagsUpdated = this.previousTagsUpdated;
+ }
+
+ resetSubs(topic, props) {
+ const newState = {
+ contactList: []
+ };
+
+ if (topic.getType() == 'p2p') {
+ const user2 = topic.subscriber(props.topic);
+
+ if (user2) {
+ newState.modeGiven2 = user2.acs.getGiven();
+ newState.modeWant2 = user2.acs.getWant();
+ } else {
+ newState.modeGiven2 = _config_js__WEBPACK_IMPORTED_MODULE_13__.NO_ACCESS_MODE;
+ newState.modeWant2 = _config_js__WEBPACK_IMPORTED_MODULE_13__.NO_ACCESS_MODE;
+ }
+ } else {
+ topic.subscribers(sub => {
+ newState.contactList.push(sub);
+ }, this);
+ }
+
+ this.setState(newState);
+ }
+
+ resetDesc(topic, props) {
+ const defacs = topic.getDefaultAccess() || {};
+ const acs = topic.getAccessMode();
+ this.setState({
+ owner: acs && acs.isOwner(),
+ admin: acs && acs.isAdmin(),
+ sharer: acs && acs.isSharer(),
+ deleter: acs && acs.isDeleter(),
+ muted: acs && acs.isMuted(),
+ fullName: topic.public ? topic.public.fn : undefined,
+ avatar: (0,_lib_blob_helpers_js__WEBPACK_IMPORTED_MODULE_14__.makeImageUrl)(topic.public ? topic.public.photo : null),
+ private: topic.private ? topic.private.comment : null,
+ address: topic.name,
+ groupTopic: topic.getType() == 'grp',
+ channel: topic.isChannel(),
+ showMemberPanel: false,
+ access: acs ? acs.getMode() : undefined,
+ modeGiven: acs ? acs.getGiven() : undefined,
+ modeWant: acs ? acs.getWant() : undefined,
+ auth: defacs.auth,
+ anon: defacs.anon
+ });
+
+ if (topic.getType() == 'grp' && acs && acs.isOwner()) {
+ topic.getMeta(topic.startMetaQuery().withTags().build());
+ }
+ }
+
+ onMetaDesc(desc) {
+ const topic = this.props.tinode.getTopic(this.props.topic);
+
+ if (!topic) {
+ return;
+ }
+
+ this.resetDesc(topic, this.props);
+
+ if (this.previousMetaDesc && this.previousMetaDesc != this.onMetaDesc) {
+ this.previousMetaDesc(desc);
+ }
+ }
+
+ onSubsUpdated(subs) {
+ const topic = this.props.tinode.getTopic(this.props.topic);
+
+ if (!topic) {
+ return;
+ }
+
+ this.resetSubs(topic, this.props);
+
+ if (this.previousSubsUpdated && this.previousSubsUpdated != this.onSubsUpdated) {
+ this.previousSubsUpdated(subs);
+ }
+ }
+
+ onTagsUpdated(tags) {
+ this.setState({
+ tags: tags
+ });
+
+ if (this.previousTagsUpdated && this.previousTagsUpdated != this.onTagsUpdated) {
+ this.previousTagsUpdated();
+ }
+ }
+
+ handleFullNameUpdate(fn) {
+ fn = fn.trim().substring(0, _config_js__WEBPACK_IMPORTED_MODULE_13__.MAX_TITLE_LENGTH);
+
+ if (this.state.fullName !== fn) {
+ this.setState({
+ fullName: fn
+ });
+ this.props.onTopicDescUpdate(this.props.topic, (0,_lib_utils_js__WEBPACK_IMPORTED_MODULE_15__.vcard)(fn, null), null);
+ }
+ }
+
+ handlePrivateUpdate(comment) {
+ comment = comment.trim().substring(0, _config_js__WEBPACK_IMPORTED_MODULE_13__.MAX_TITLE_LENGTH);
+
+ if (this.state.private !== comment) {
+ this.setState({
+ private: comment
+ });
+ this.props.onTopicDescUpdate(this.props.topic, null, comment || (tinode_sdk__WEBPACK_IMPORTED_MODULE_2___default().DEL_CHAR));
+ }
+ }
+
+ handleImageChanged(img) {
+ this.setState({
+ avatar: img
+ });
+ this.props.onTopicDescUpdate(this.props.topic, (0,_lib_utils_js__WEBPACK_IMPORTED_MODULE_15__.vcard)(null, img || (tinode_sdk__WEBPACK_IMPORTED_MODULE_2___default().DEL_CHAR)), null);
+ }
+
+ handleMuted(ignored, checked) {
+ this.setState({
+ muted: checked
+ });
+ this.props.onChangePermissions(this.props.topic, checked ? '-P' : '+P');
+ }
+
+ handlePermissionsChanged(perm) {
+ switch (this.state.showPermissionEditorFor) {
+ case 'auth':
+ this.props.onTopicDescUpdate(this.props.topic, null, null, {
+ auth: perm
+ });
+ break;
+
+ case 'anon':
+ this.props.onTopicDescUpdate(this.props.topic, null, null, {
+ anon: perm
+ });
+ break;
+
+ case 'mode':
+ case 'want':
+ this.props.onChangePermissions(this.props.topic, perm);
+ break;
+
+ case 'given':
+ this.props.onChangePermissions(this.props.topic, perm, this.props.topic);
+ break;
+
+ case 'user':
+ this.props.onChangePermissions(this.props.topic, perm, this.state.userPermissionsEdited);
+ break;
+ }
+
+ this.setState({
+ showPermissionEditorFor: undefined
+ });
+ }
+
+ handleLaunchPermissionsEditor(which, uid) {
+ const {
+ formatMessage
+ } = this.props.intl;
+ let toEdit, toCompare, toSkip, titleEdit, titleCompare, userTitle, userAvatar;
+
+ switch (which) {
+ case 'mode':
+ toEdit = this.state.access;
+ break;
+
+ case 'want':
+ toEdit = this.state.modeWant;
+ toCompare = this.state.modeGiven;
+
+ if (this.state.owner) {
+ toSkip = 'O';
+ } else {
+ toSkip = tinode_sdk__WEBPACK_IMPORTED_MODULE_2___default().AccessMode.encode(tinode_sdk__WEBPACK_IMPORTED_MODULE_2___default().AccessMode.diff('ASDO', this.state.modeGiven));
+
+ if (this.state.channel) {
+ toSkip += 'W';
+ }
+ }
+
+ titleEdit = formatMessage(messages.requested);
+ titleCompare = formatMessage(messages.granted);
+ break;
+
+ case 'given':
+ toEdit = this.state.modeGiven2;
+ toCompare = this.state.modeWant2;
+ toSkip = this.state.groupTopic ? this.state.owner ? '' : 'O' : 'ASDO';
+ titleEdit = formatMessage(messages.granted);
+ titleCompare = formatMessage(messages.requested);
+ break;
+
+ case 'auth':
+ toEdit = this.state.auth;
+ toSkip = 'O';
+ break;
+
+ case 'anon':
+ toEdit = this.state.anon;
+ toSkip = 'O';
+ break;
+
+ case 'user':
+ {
+ const topic = this.props.tinode.getTopic(this.props.topic);
+
+ if (!topic) {
+ return;
+ }
+
+ const user = topic.subscriber(uid);
+
+ if (!user || !user.acs) {
+ return;
+ }
+
+ toEdit = user.acs.getGiven();
+ toCompare = user.acs.getWant();
+ toSkip = this.state.owner ? '' : 'O';
+ titleEdit = formatMessage(messages.granted);
+ titleCompare = formatMessage(messages.requested);
+
+ if (user.public) {
+ userTitle = user.public.fn;
+ userAvatar = user.public.photo;
+ }
+
+ break;
+ }
+
+ default:
+ console.log("Unknown permission editing mode '" + which + "'");
+ break;
+ }
+
+ this.setState({
+ showPermissionEditorFor: which,
+ userPermissionsEdited: uid,
+ userPermissionsTitle: userTitle,
+ userPermissionsAvatar: userAvatar,
+ editedPermissions: toEdit,
+ immutablePermissions: toCompare,
+ editedPermissionsTitle: titleEdit,
+ immutablePermissionsTitle: titleCompare,
+ editedPermissionsSkipped: toSkip
+ });
+ }
+
+ handleHidePermissionsEditor() {
+ this.setState({
+ showPermissionEditorFor: undefined
+ });
+ }
+
+ handleShowAddMembers(e) {
+ e.preventDefault();
+ this.props.onInitFind();
+ this.setState({
+ showMemberPanel: true
+ });
+ }
+
+ handleHideAddMembers() {
+ this.setState({
+ showMemberPanel: false
+ });
+ }
+
+ handleMemberUpdateRequest(members, added, removed) {
+ this.props.onMemberUpdateRequest(this.props.topic, added, removed);
+ this.setState({
+ showMemberPanel: false
+ });
+ }
+
+ handleDeleteMessages(e) {
+ e.preventDefault();
+ const {
+ formatMessage
+ } = this.props.intl;
+ this.props.onShowAlert(formatMessage(this.state.deleter ? messages.delete_messages : messages.clear_messages), formatMessage(this.state.deleter ? messages.delete_messages_warning : messages.clear_messages_warning), () => {
+ this.props.onDeleteMessages(this.props.topic);
+ }, null, true, null);
+ }
+
+ handleLeave(e) {
+ e.preventDefault();
+ const {
+ formatMessage
+ } = this.props.intl;
+ this.props.onShowAlert(formatMessage(messages.leave_chat), formatMessage(messages.leave_chat_warning), () => {
+ this.props.onLeaveTopic(this.props.topic);
+ }, null, true, null);
+ }
+
+ handleBlock(e) {
+ e.preventDefault();
+ const {
+ formatMessage
+ } = this.props.intl;
+ this.props.onShowAlert(formatMessage(messages.block_contact), formatMessage(messages.block_contact_warning), () => {
+ this.props.onBlockTopic(this.props.topic);
+ }, null, true, null);
+ }
+
+ handleReport(e) {
+ e.preventDefault();
+ const {
+ formatMessage
+ } = this.props.intl;
+ this.props.onShowAlert(formatMessage(messages.report_chat), formatMessage(messages.report_chat_warning), () => {
+ this.props.onReportTopic(this.props.topic);
+ }, null, true, null);
+ }
+
+ handleMemberSelected(uid) {
+ this.setState({
+ selectedContact: uid
+ });
+ }
+
+ handleMoreInfo(open) {
+ this.setState({
+ moreInfoExpanded: open
+ });
+ }
+
+ handleTagsUpdated(tags) {
+ if (!(0,_lib_utils_js__WEBPACK_IMPORTED_MODULE_15__.arrayEqual)(this.state.tags.slice(0), tags.slice(0))) {
+ this.props.onTopicTagsUpdate(this.props.topic, tags);
+ }
+ }
+
+ handleContextMenu(params) {
+ const {
+ formatMessage
+ } = this.props.intl;
+ const instance = this;
+ const topic = this.props.tinode.getTopic(this.props.topic);
+
+ if (!topic) {
+ return;
+ }
+
+ const user = topic.subscriber(params.topicName);
+
+ if (!user || !user.acs) {
+ return;
+ }
+
+ const menuItems = [{
+ title: formatMessage(messages.edit_permissions),
+ handler: function () {
+ instance.handleLaunchPermissionsEditor('user', params.topicName);
+ }
+ }, 'member_delete', user.acs.isMuted() ? 'member_unmute' : 'member_mute', user.acs.isJoiner() ? 'member_block' : 'member_unblock'];
+ this.props.showContextMenu({
+ topicName: this.props.topic,
+ x: params.x,
+ y: params.y,
+ user: params.topicName
+ }, menuItems);
+ }
+
+ render() {
+ const {
+ formatMessage
+ } = this.props.intl;
+ return react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
+ id: "info-view"
+ }, react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
+ className: "caption-panel",
+ id: "info-caption-panel"
+ }, react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
+ className: "panel-title",
+ id: "info-title"
+ }, react__WEBPACK_IMPORTED_MODULE_0___default().createElement(react_intl__WEBPACK_IMPORTED_MODULE_1__.FormattedMessage, {
+ id: "title_info",
+ defaultMessage: "Info",
+ description: "Title for InfoView"
+ })), react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", null, react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_widgets_menu_cancel_jsx__WEBPACK_IMPORTED_MODULE_9__.default, {
+ onCancel: this.props.onCancel
+ }))), this.props.displayMobile ? react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_widgets_error_panel_jsx__WEBPACK_IMPORTED_MODULE_6__.default, {
+ level: this.props.errorLevel,
+ text: this.props.errorText,
+ onClearError: this.props.onError
+ }) : null, this.state.showMemberPanel ? react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_widgets_group_manager_jsx__WEBPACK_IMPORTED_MODULE_7__.default, {
+ members: this.state.contactList,
+ requiredMember: this.props.myUserId,
+ keepInitialMembers: !this.state.admin && !this.state.owner,
+ myUserId: this.props.myUserId,
+ contacts: this.props.searchableContacts,
+ onCancel: this.handleHideAddMembers,
+ onSubmit: this.handleMemberUpdateRequest
+ }) : this.state.showPermissionEditorFor ? react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_widgets_permissions_editor_jsx__WEBPACK_IMPORTED_MODULE_11__.default, {
+ mode: this.state.editedPermissions,
+ compare: this.state.immutablePermissions,
+ skip: this.state.editedPermissionsSkipped,
+ modeTitle: this.state.editedPermissionsTitle,
+ compareTitle: this.state.immutablePermissionsTitle,
+ userTitle: this.state.userPermissionsTitle,
+ item: this.state.userPermissionsEdited,
+ userAvatar: this.state.userPermissionsAvatar,
+ onSubmit: this.handlePermissionsChanged,
+ onCancel: this.handleHidePermissionsEditor
+ }) : react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
+ id: "info-view-content",
+ className: "scrollable-panel"
+ }, react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
+ className: "panel-form-row"
+ }, react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
+ className: "panel-form-column"
+ }, react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", null, react__WEBPACK_IMPORTED_MODULE_0___default().createElement("label", {
+ className: "small"
+ }, react__WEBPACK_IMPORTED_MODULE_0___default().createElement(react_intl__WEBPACK_IMPORTED_MODULE_1__.FormattedMessage, {
+ id: "label_topic_name",
+ defaultMessage: "Name",
+ description: "Label for editing topic name"
+ }))), react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", null, react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_widgets_in_place_edit_jsx__WEBPACK_IMPORTED_MODULE_8__.default, {
+ placeholder: this.state.groupTopic ? "Group name" : react__WEBPACK_IMPORTED_MODULE_0___default().createElement("i", null, "Unknown"),
+ readOnly: !this.state.owner,
+ value: this.state.fullName,
+ required: true,
+ onFinished: this.handleFullNameUpdate
+ })), react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", null, react__WEBPACK_IMPORTED_MODULE_0___default().createElement("label", {
+ className: "small"
+ }, react__WEBPACK_IMPORTED_MODULE_0___default().createElement(react_intl__WEBPACK_IMPORTED_MODULE_1__.FormattedMessage, {
+ id: "label_private",
+ defaultMessage: "Private comment",
+ description: "Label for editing 'private'"
+ }))), react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", null, react__WEBPACK_IMPORTED_MODULE_0___default().createElement(react_intl__WEBPACK_IMPORTED_MODULE_1__.FormattedMessage, {
+ id: "private_editing_placeholder",
+ defaultMessage: "Visible to you only",
+ description: "Placeholder for editing 'private'"
+ }, private_placeholder => react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_widgets_in_place_edit_jsx__WEBPACK_IMPORTED_MODULE_8__.default, {
+ placeholder: private_placeholder,
+ value: this.state.private,
+ onFinished: this.handlePrivateUpdate
+ })))), react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_widgets_avatar_upload_jsx__WEBPACK_IMPORTED_MODULE_3__.default, {
+ avatar: this.state.avatar,
+ readOnly: !this.state.owner,
+ uid: this.props.topic,
+ title: this.state.fullName,
+ onImageChanged: this.handleImageChanged,
+ onError: this.props.onError
+ })), react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
+ className: "hr"
+ }), react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
+ className: "panel-form-column"
+ }, react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
+ className: "panel-form-row"
+ }, react__WEBPACK_IMPORTED_MODULE_0___default().createElement("label", null, react__WEBPACK_IMPORTED_MODULE_0___default().createElement(react_intl__WEBPACK_IMPORTED_MODULE_1__.FormattedMessage, {
+ id: "label_muting_topic",
+ defaultMessage: "Muted:",
+ description: "Label for Muting/unmuting the topic"
+ })), react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_widgets_checkbox_jsx__WEBPACK_IMPORTED_MODULE_4__.default, {
+ name: "P",
+ checked: this.state.muted,
+ onChange: this.handleMuted
+ })), react__WEBPACK_IMPORTED_MODULE_0___default().createElement(react_intl__WEBPACK_IMPORTED_MODULE_1__.FormattedMessage, {
+ id: "action_more",
+ defaultMessage: "More",
+ description: "Action for showing more content"
+ }, more => react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_widgets_more_button_jsx__WEBPACK_IMPORTED_MODULE_10__.default, {
+ title: more,
+ open: this.state.moreInfoExpanded,
+ onToggle: this.handleMoreInfo
+ })), this.state.moreInfoExpanded ? react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
+ className: "panel-form-column"
+ }, react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
+ className: "panel-form-row"
+ }, react__WEBPACK_IMPORTED_MODULE_0___default().createElement("label", null, react__WEBPACK_IMPORTED_MODULE_0___default().createElement(react_intl__WEBPACK_IMPORTED_MODULE_1__.FormattedMessage, {
+ id: "label_user_id"
+ })), react__WEBPACK_IMPORTED_MODULE_0___default().createElement("tt", null, this.state.address)), this.state.groupTopic ? react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
+ className: "panel-form-row"
+ }, react__WEBPACK_IMPORTED_MODULE_0___default().createElement("label", null, react__WEBPACK_IMPORTED_MODULE_0___default().createElement(react_intl__WEBPACK_IMPORTED_MODULE_1__.FormattedMessage, {
+ id: "label_your_permissions",
+ defaultMessage: "Your permissions:",
+ description: "Label for current user permissions"
+ })), react__WEBPACK_IMPORTED_MODULE_0___default().createElement("tt", {
+ className: "clickable",
+ onClick: this.handleLaunchPermissionsEditor.bind(this, 'want')
+ }, this.state.access)) : react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", null, react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", null, react__WEBPACK_IMPORTED_MODULE_0___default().createElement("label", {
+ className: "small"
+ }, react__WEBPACK_IMPORTED_MODULE_0___default().createElement(react_intl__WEBPACK_IMPORTED_MODULE_1__.FormattedMessage, {
+ id: "label_permissions",
+ defaultMessage: "Permissions:",
+ description: "Section title"
+ }))), react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
+ className: "quoted"
+ }, react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", null, react__WEBPACK_IMPORTED_MODULE_0___default().createElement(react_intl__WEBPACK_IMPORTED_MODULE_1__.FormattedMessage, {
+ id: "label_you",
+ defaultMessage: "You:",
+ description: "Label for the current user"
+ }), " \xA0", react__WEBPACK_IMPORTED_MODULE_0___default().createElement("tt", {
+ className: "clickable",
+ onClick: this.handleLaunchPermissionsEditor.bind(this, 'want')
+ }, this.state.access)), react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", null, this.state.fullName ? this.state.fullName : formatMessage(messages.other_user), ": \xA0", react__WEBPACK_IMPORTED_MODULE_0___default().createElement("tt", {
+ className: "clickable",
+ onClick: this.handleLaunchPermissionsEditor.bind(this, 'given')
+ }, this.state.modeGiven2)))), this.state.sharer && (this.state.auth || this.state.anon) ? react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", null, react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", null, react__WEBPACK_IMPORTED_MODULE_0___default().createElement("label", {
+ className: "small"
+ }, react__WEBPACK_IMPORTED_MODULE_0___default().createElement(react_intl__WEBPACK_IMPORTED_MODULE_1__.FormattedMessage, {
+ id: "label_default_access",
+ defaultMessage: "Default access mode:",
+ description: "Section title"
+ }))), react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
+ className: "quoted"
+ }, react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", null, "Auth: ", this.state.admin ? react__WEBPACK_IMPORTED_MODULE_0___default().createElement("tt", {
+ className: "clickable",
+ onClick: this.handleLaunchPermissionsEditor.bind(this, 'auth')
+ }, this.state.auth) : react__WEBPACK_IMPORTED_MODULE_0___default().createElement("tt", null, this.state.auth)), react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", null, "Anon: ", this.state.admin ? react__WEBPACK_IMPORTED_MODULE_0___default().createElement("tt", {
+ className: "clickable",
+ onClick: this.handleLaunchPermissionsEditor.bind(this, 'anon')
+ }, this.state.anon) : react__WEBPACK_IMPORTED_MODULE_0___default().createElement("tt", null, this.state.anon)))) : null) : null), react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
+ className: "hr"
+ }), this.state.owner ? react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null, react__WEBPACK_IMPORTED_MODULE_0___default().createElement(react_intl__WEBPACK_IMPORTED_MODULE_1__.FormattedMessage, {
+ id: "title_tag_manager"
+ }, tags => react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_widgets_tag_manager_jsx__WEBPACK_IMPORTED_MODULE_12__.default, {
+ title: tags,
+ tags: this.state.tags,
+ activated: false,
+ tinode: this.props.tinode,
+ onSubmit: this.handleTagsUpdated
+ })), react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
+ className: "hr"
+ })) : null, react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
+ className: "panel-form-column"
+ }, !this.state.channel ? react__WEBPACK_IMPORTED_MODULE_0___default().createElement("a", {
+ href: "#",
+ className: "flat-button",
+ onClick: this.handleDeleteMessages
+ }, react__WEBPACK_IMPORTED_MODULE_0___default().createElement("i", {
+ className: "material-icons"
+ }, "delete_outline"), " \xA0", formatMessage(this.state.deleter ? messages.delete_messages : messages.clear_messages)) : null, react__WEBPACK_IMPORTED_MODULE_0___default().createElement("a", {
+ href: "#",
+ className: "red flat-button",
+ onClick: this.handleLeave
+ }, react__WEBPACK_IMPORTED_MODULE_0___default().createElement("i", {
+ className: "material-icons"
+ }, "exit_to_app"), " \xA0", formatMessage(messages.leave_chat)), !this.state.groupTopic ? react__WEBPACK_IMPORTED_MODULE_0___default().createElement("a", {
+ href: "#",
+ className: "red flat-button",
+ onClick: this.handleBlock
+ }, react__WEBPACK_IMPORTED_MODULE_0___default().createElement("i", {
+ className: "material-icons"
+ }, "block"), " \xA0", formatMessage(messages.block_contact)) : null, !this.state.owner ? react__WEBPACK_IMPORTED_MODULE_0___default().createElement("a", {
+ href: "#",
+ className: "red flat-button",
+ onClick: this.handleReport
+ }, react__WEBPACK_IMPORTED_MODULE_0___default().createElement("i", {
+ className: "material-icons"
+ }, "report"), " \xA0", formatMessage(messages.report_chat)) : null), this.state.groupTopic && this.state.sharer ? react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null, react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
+ className: "hr"
+ }), react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
+ className: "panel-form-column"
+ }, react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
+ className: "panel-form-row"
+ }, react__WEBPACK_IMPORTED_MODULE_0___default().createElement("label", {
+ className: "small"
+ }, react__WEBPACK_IMPORTED_MODULE_0___default().createElement(react_intl__WEBPACK_IMPORTED_MODULE_1__.FormattedMessage, {
+ id: "label_group_members",
+ defaultMessage: "Group members:",
+ description: "Section title or label"
+ }))), react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
+ className: "panel-form-row"
+ }, react__WEBPACK_IMPORTED_MODULE_0___default().createElement("a", {
+ href: "#",
+ className: "flat-button",
+ onClick: this.handleShowAddMembers
+ }, react__WEBPACK_IMPORTED_MODULE_0___default().createElement("i", {
+ className: "material-icons"
+ }, "person_add"), " \xA0", react__WEBPACK_IMPORTED_MODULE_0___default().createElement(react_intl__WEBPACK_IMPORTED_MODULE_1__.FormattedMessage, {
+ id: "button_add_members",
+ defaultMessage: "Add members",
+ description: "Flat button [Add members] (to topic)"
+ }))), react__WEBPACK_IMPORTED_MODULE_0___default().createElement(react_intl__WEBPACK_IMPORTED_MODULE_1__.FormattedMessage, {
+ id: "group_has_no_members",
+ defaultMessage: "No members",
+ description: "Shown in place of group members"
+ }, no_members => react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_widgets_contact_list_jsx__WEBPACK_IMPORTED_MODULE_5__.default, {
+ contacts: this.state.contactList,
+ myUserId: this.props.myUserId,
+ emptyListMessage: no_members,
+ topicSelected: this.state.selectedContact,
+ showOnline: false,
+ showUnread: false,
+ showMode: true,
+ noScroll: true,
+ onTopicSelected: this.handleMemberSelected,
+ showContextMenu: this.state.admin ? this.handleContextMenu : false
+ })))) : null));
+ }
+
+}
+
+;
+/* harmony default export */ __webpack_exports__["default"] = ((0,react_intl__WEBPACK_IMPORTED_MODULE_1__.injectIntl)(InfoView));
+
+/***/ }),
+
+/***/ "./src/views/login-view.jsx":
+/*!**********************************!*\
+ !*** ./src/views/login-view.jsx ***!
+ \**********************************/
+/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
+
+__webpack_require__.r(__webpack_exports__);
+/* harmony export */ __webpack_require__.d(__webpack_exports__, {
+/* harmony export */ "default": function() { return /* binding */ LoginView; }
+/* harmony export */ });
+/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "react");
+/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);
+/* harmony import */ var react_intl__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react-intl */ "react-intl");
+/* harmony import */ var react_intl__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react_intl__WEBPACK_IMPORTED_MODULE_1__);
+/* harmony import */ var _widgets_checkbox_jsx__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../widgets/checkbox.jsx */ "./src/widgets/checkbox.jsx");
+/* harmony import */ var _widgets_visible_password_jsx__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../widgets/visible-password.jsx */ "./src/widgets/visible-password.jsx");
+/* harmony import */ var _lib_local_storage_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../lib/local-storage.js */ "./src/lib/local-storage.js");
+
+
+
+
+
+class LoginView extends (react__WEBPACK_IMPORTED_MODULE_0___default().Component) {
+ constructor(props) {
+ super(props);
+ this.state = {
+ login: props.login,
+ password: '',
+ hostName: props.serverAddress,
+ saveToken: _lib_local_storage_js__WEBPACK_IMPORTED_MODULE_4__.default.getObject('keep-logged-in')
+ };
+ this.handleLoginChange = this.handleLoginChange.bind(this);
+ this.handlePasswordChange = this.handlePasswordChange.bind(this);
+ this.handleToggleSaveToken = this.handleToggleSaveToken.bind(this);
+ this.handleSubmit = this.handleSubmit.bind(this);
+ }
+
+ handleLoginChange(e) {
+ this.setState({
+ login: e.target.value
+ });
+ }
+
+ handlePasswordChange(e) {
+ this.setState({
+ password: e.target.value
+ });
+ }
+
+ handleToggleSaveToken() {
+ _lib_local_storage_js__WEBPACK_IMPORTED_MODULE_4__.default.setObject('keep-logged-in', !this.state.saveToken);
+ this.setState({
+ saveToken: !this.state.saveToken
+ });
+ }
+
+ handleSubmit(e) {
+ e.preventDefault();
+ this.props.onLogin(this.state.login.trim(), this.state.password.trim());
+ }
+
+ render() {
+ var submitClasses = 'blue';
+
+ if (this.props.disabled) {
+ submitClasses += ' disabled';
+ }
+
+ return react__WEBPACK_IMPORTED_MODULE_0___default().createElement("form", {
+ id: "login-form",
+ onSubmit: this.handleSubmit
+ }, react__WEBPACK_IMPORTED_MODULE_0___default().createElement(react_intl__WEBPACK_IMPORTED_MODULE_1__.FormattedMessage, {
+ id: "login_prompt",
+ defaultMessage: "Login",
+ description: "Login placeholder in LoginView"
+ }, login_prompt => react__WEBPACK_IMPORTED_MODULE_0___default().createElement("input", {
+ type: "text",
+ id: "inputLogin",
+ placeholder: login_prompt,
+ autoComplete: "username",
+ autoCorrect: "off",
+ autoCapitalize: "none",
+ value: this.state.login,
+ onChange: this.handleLoginChange,
+ required: true,
+ autoFocus: true
+ })), react__WEBPACK_IMPORTED_MODULE_0___default().createElement(react_intl__WEBPACK_IMPORTED_MODULE_1__.FormattedMessage, {
+ id: "password_prompt",
+ defaultMessage: "Password",
+ description: "Password placeholder in LoginView"
+ }, password_prompt => react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_widgets_visible_password_jsx__WEBPACK_IMPORTED_MODULE_3__.default, {
+ type: "password",
+ id: "inputPassword",
+ placeholder: password_prompt,
+ autoComplete: "current-password",
+ value: this.state.password,
+ onChange: this.handlePasswordChange,
+ required: true
+ })), react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
+ className: "panel-form-row"
+ }, react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_widgets_checkbox_jsx__WEBPACK_IMPORTED_MODULE_2__.default, {
+ id: "save-token",
+ name: "save-token",
+ checked: this.state.saveToken,
+ onChange: this.handleToggleSaveToken
+ }), react__WEBPACK_IMPORTED_MODULE_0___default().createElement("label", {
+ htmlFor: "save-token"
+ }, "\xA0", react__WEBPACK_IMPORTED_MODULE_0___default().createElement(react_intl__WEBPACK_IMPORTED_MODULE_1__.FormattedMessage, {
+ id: "stay_logged_in",
+ defaultMessage: "Stay logged in",
+ description: "Label for a checkbox"
+ })), react__WEBPACK_IMPORTED_MODULE_0___default().createElement("a", {
+ href: "#reset"
+ }, react__WEBPACK_IMPORTED_MODULE_0___default().createElement(react_intl__WEBPACK_IMPORTED_MODULE_1__.FormattedMessage, {
+ id: "forgot_password_link",
+ defaultMessage: "Forgot password?",
+ description: "Link to Reset password form"
+ }))), react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
+ className: "dialog-buttons"
+ }, react__WEBPACK_IMPORTED_MODULE_0___default().createElement("button", {
+ className: submitClasses,
+ type: "submit"
+ }, react__WEBPACK_IMPORTED_MODULE_0___default().createElement(react_intl__WEBPACK_IMPORTED_MODULE_1__.FormattedMessage, {
+ id: "button_sign_in",
+ defaultMessage: "Sign in",
+ description: "Button [Sign In]"
+ }))));
+ }
+
+}
+;
+
+/***/ }),
+
+/***/ "./src/views/logo-view.jsx":
+/*!*********************************!*\
+ !*** ./src/views/logo-view.jsx ***!
+ \*********************************/
+/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
+
+__webpack_require__.r(__webpack_exports__);
+/* harmony export */ __webpack_require__.d(__webpack_exports__, {
+/* harmony export */ "default": function() { return /* binding */ LogoView; }
+/* harmony export */ });
+/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "react");
+/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);
+/* harmony import */ var react_intl__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react-intl */ "react-intl");
+/* harmony import */ var react_intl__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react_intl__WEBPACK_IMPORTED_MODULE_1__);
+/* harmony import */ var tinode_sdk__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! tinode-sdk */ "tinode-sdk");
+/* harmony import */ var tinode_sdk__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(tinode_sdk__WEBPACK_IMPORTED_MODULE_2__);
+/* harmony import */ var _config_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../config.js */ "./src/config.js");
+
+
+
+
+class LogoView extends (react__WEBPACK_IMPORTED_MODULE_0___default().PureComponent) {
+ render() {
+ const version = _config_js__WEBPACK_IMPORTED_MODULE_3__.APP_NAME + ' (' + tinode_sdk__WEBPACK_IMPORTED_MODULE_2___default().getLibrary() + ')';
+ return react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
+ id: "dummy-view"
+ }, react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", null, react__WEBPACK_IMPORTED_MODULE_0___default().createElement("a", {
+ href: "https://github.com/tinode/chat/"
+ }, react__WEBPACK_IMPORTED_MODULE_0___default().createElement("img", {
+ id: "logo",
+ alt: "logo",
+ src: "img/logo.svg"
+ }), react__WEBPACK_IMPORTED_MODULE_0___default().createElement("h2", null, "Tinode Web")), react__WEBPACK_IMPORTED_MODULE_0___default().createElement("p", null, react__WEBPACK_IMPORTED_MODULE_0___default().createElement(react_intl__WEBPACK_IMPORTED_MODULE_1__.FormattedMessage, {
+ id: "label_client",
+ defaultMessage: "Client:"
+ }), " ", version), react__WEBPACK_IMPORTED_MODULE_0___default().createElement("p", null, react__WEBPACK_IMPORTED_MODULE_0___default().createElement(react_intl__WEBPACK_IMPORTED_MODULE_1__.FormattedMessage, {
+ id: "label_server",
+ defaultMessage: "Server:"
+ }), " ", this.props.serverVersion, " (", this.props.serverAddress, ")")));
+ }
+
+}
+;
+
+/***/ }),
+
+/***/ "./src/views/messages-view.jsx":
+/*!*************************************!*\
+ !*** ./src/views/messages-view.jsx ***!
+ \*************************************/
+/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
+
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "react");
+/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);
+/* harmony import */ var react_intl__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react-intl */ "react-intl");
+/* harmony import */ var react_intl__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react_intl__WEBPACK_IMPORTED_MODULE_1__);
+/* harmony import */ var tinode_sdk__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! tinode-sdk */ "tinode-sdk");
+/* harmony import */ var tinode_sdk__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(tinode_sdk__WEBPACK_IMPORTED_MODULE_2__);
+/* harmony import */ var _widgets_chat_message_jsx__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../widgets/chat-message.jsx */ "./src/widgets/chat-message.jsx");
+/* harmony import */ var _widgets_doc_preview_jsx__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../widgets/doc-preview.jsx */ "./src/widgets/doc-preview.jsx");
+/* harmony import */ var _widgets_error_panel_jsx__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../widgets/error-panel.jsx */ "./src/widgets/error-panel.jsx");
+/* harmony import */ var _widgets_group_subs_jsx__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../widgets/group-subs.jsx */ "./src/widgets/group-subs.jsx");
+/* harmony import */ var _widgets_image_preview_jsx__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../widgets/image-preview.jsx */ "./src/widgets/image-preview.jsx");
+/* harmony import */ var _widgets_invitation_jsx__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../widgets/invitation.jsx */ "./src/widgets/invitation.jsx");
+/* harmony import */ var _widgets_letter_tile_jsx__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../widgets/letter-tile.jsx */ "./src/widgets/letter-tile.jsx");
+/* harmony import */ var _widgets_load_spinner_jsx__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../widgets/load-spinner.jsx */ "./src/widgets/load-spinner.jsx");
+/* harmony import */ var _logo_view_jsx__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./logo-view.jsx */ "./src/views/logo-view.jsx");
+/* harmony import */ var _widgets_send_message_jsx__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ../widgets/send-message.jsx */ "./src/widgets/send-message.jsx");
+/* harmony import */ var _config_js__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ../config.js */ "./src/config.js");
+/* harmony import */ var _lib_blob_helpers_js__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ../lib/blob-helpers.js */ "./src/lib/blob-helpers.js");
+/* harmony import */ var _lib_navigation_js__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ../lib/navigation.js */ "./src/lib/navigation.js");
+/* harmony import */ var _lib_strformat_js__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ../lib/strformat.js */ "./src/lib/strformat.js");
+
+
+
+const Drafty = (tinode_sdk__WEBPACK_IMPORTED_MODULE_2___default().Drafty);
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+const NOTIFICATION_EXEC_INTERVAL = 300;
+const messages = (0,react_intl__WEBPACK_IMPORTED_MODULE_1__.defineMessages)({
+ 'online_now': {
+ id: 'online_now',
+ defaultMessage: 'online now',
+ description: 'Indicator that the user or topic is currently online'
+ },
+ 'last_seen': {
+ id: 'last_seen_timestamp',
+ defaultMessage: 'Last seen',
+ description: 'Label for the timestamp of when the user or topic was last online'
+ },
+ 'not_found': {
+ id: 'title_not_found',
+ defaultMessage: 'Not found',
+ description: 'Title shown when topic is not found'
+ },
+ 'channel': {
+ id: 'channel',
+ defaultMessage: 'channel',
+ description: 'Subtitle shown for channels in MessagesView instead of last seen'
+ }
+});
+
+function isUnconfirmed(acs) {
+ if (acs) {
+ const ex = acs.getExcessive() || '';
+ return acs.isJoiner('given') && (ex.includes('R') || ex.includes('W'));
+ }
+
+ return false;
+}
+
+function isPeerRestricted(acs) {
+ if (acs) {
+ const ms = acs.getMissing() || '';
+ return acs.isJoiner('want') && (ms.includes('R') || ms.includes('W'));
+ }
+
+ return false;
+}
+
+class MessagesView extends (react__WEBPACK_IMPORTED_MODULE_0___default().Component) {
+ constructor(props) {
+ super(props);
+ this.state = MessagesView.getDerivedStateFromProps(props, {});
+ this.leave = this.leave.bind(this);
+ this.sendImageAttachment = this.sendImageAttachment.bind(this);
+ this.sendFileAttachment = this.sendFileAttachment.bind(this);
+ this.sendKeyPress = this.sendKeyPress.bind(this);
+ this.handleScrollReference = this.handleScrollReference.bind(this);
+ this.handleScrollEvent = this.handleScrollEvent.bind(this);
+ this.handleDescChange = this.handleDescChange.bind(this);
+ this.handleSubsUpdated = this.handleSubsUpdated.bind(this);
+ this.handleNewMessage = this.handleNewMessage.bind(this);
+ this.handleAllMessagesReceived = this.handleAllMessagesReceived.bind(this);
+ this.handleInfoReceipt = this.handleInfoReceipt.bind(this);
+ this.handleImagePostview = this.handleImagePostview.bind(this);
+ this.handleClosePreview = this.handleClosePreview.bind(this);
+ this.handleFormResponse = this.handleFormResponse.bind(this);
+ this.handleContextClick = this.handleContextClick.bind(this);
+ this.handleShowContextMenuMessage = this.handleShowContextMenuMessage.bind(this);
+ this.handleNewChatAcceptance = this.handleNewChatAcceptance.bind(this);
+ this.handleEnablePeer = this.handleEnablePeer.bind(this);
+ this.handleAttachFile = this.handleAttachFile.bind(this);
+ this.handleAttachImage = this.handleAttachImage.bind(this);
+ this.handleCancelUpload = this.handleCancelUpload.bind(this);
+ this.postReadNotification = this.postReadNotification.bind(this);
+ this.clearNotificationQueue = this.clearNotificationQueue.bind(this);
+ this.readNotificationQueue = [];
+ this.readNotificationTimer = null;
+ }
+
+ componentDidMount() {
+ if (this.messagesScroller) {
+ this.messagesScroller.addEventListener('scroll', this.handleScrollEvent);
+ }
+ }
+
+ componentWillUnmount() {
+ if (this.messagesScroller) {
+ this.messagesScroller.removeEventListener('scroll', this.handleScrollEvent);
+ }
+
+ this.clearNotificationQueue();
+ }
+
+ componentDidUpdate(prevProps, prevState) {
+ if (this.messagesScroller) {
+ if (prevState.topic != this.state.topic || prevState.messages.length != this.state.messages.length) {
+ this.messagesScroller.scrollTop = this.messagesScroller.scrollHeight - this.state.scrollPosition;
+ } else if (prevProps.viewportHeight > this.props.viewportHeight) {
+ this.messagesScroller.scrollTop += prevProps.viewportHeight - this.props.viewportHeight;
+ }
+ }
+
+ const topic = this.props.tinode.getTopic(this.state.topic);
+
+ if (this.state.topic != prevState.topic) {
+ if (prevState.topic && !tinode_sdk__WEBPACK_IMPORTED_MODULE_2___default().isNewGroupTopicName(prevState.topic)) {
+ this.leave(prevState.topic);
+ }
+
+ if (topic) {
+ topic.onData = this.handleNewMessage;
+ topic.onAllMessagesReceived = this.handleAllMessagesReceived;
+ topic.onInfo = this.handleInfoReceipt;
+ topic.onMetaDesc = this.handleDescChange;
+ topic.onSubsUpdated = this.handleSubsUpdated;
+ topic.onPres = this.handleSubsUpdated;
+ }
+ }
+
+ if (!this.props.applicationVisible) {
+ this.clearNotificationQueue();
+ } else {
+ this.postReadNotification(0);
+ }
+
+ if (topic && !topic.isSubscribed() && this.props.ready && (this.state.topic != prevState.topic || !prevProps.ready)) {
+ const newTopic = this.props.newTopicParams && this.props.newTopicParams._topicName == this.props.topic;
+ let getQuery = topic.startMetaQuery().withLaterDesc();
+
+ if (this.state.isSharer || newTopic && !topic.isChannel()) {
+ getQuery = getQuery.withLaterSub();
+ }
+
+ if (this.state.isReader || newTopic) {
+ getQuery = getQuery.withLaterData(_config_js__WEBPACK_IMPORTED_MODULE_13__.MESSAGES_PAGE);
+
+ if (this.state.isReader) {
+ getQuery = getQuery.withLaterDel();
+ }
+
+ this.setState({
+ fetchingMessages: true
+ });
+ }
+
+ const setQuery = newTopic ? this.props.newTopicParams : undefined;
+ topic.subscribe(getQuery.build(), setQuery).then(ctrl => {
+ if (ctrl.code == 303) {
+ _lib_navigation_js__WEBPACK_IMPORTED_MODULE_15__.default.navigateTo(_lib_navigation_js__WEBPACK_IMPORTED_MODULE_15__.default.setUrlTopic('', ctrl.params.topic));
+ return;
+ }
+
+ if (this.state.topic != ctrl.topic) {
+ this.setState({
+ topic: ctrl.topic
+ });
+ }
+
+ this.props.onNewTopicCreated(this.props.topic, ctrl.topic);
+ topic.queuedMessages(pub => {
+ if (!pub._sending && topic.isSubscribed()) {
+ topic.publishMessage(pub);
+ }
+ });
+ }).catch(err => {
+ console.log("Failed subscription to", this.state.topic);
+ this.props.onError(err.message, 'err');
+ const blankState = MessagesView.getDerivedStateFromProps({}, {});
+ blankState.title = this.props.intl.formatMessage(messages.not_found);
+ this.setState(blankState);
+ });
+ }
+ }
+
+ static getDerivedStateFromProps(nextProps, prevState) {
+ let nextState = {};
+
+ if (!nextProps.topic) {
+ nextState = {
+ messages: [],
+ onlineSubs: [],
+ topic: null,
+ title: '',
+ avatar: null,
+ docPreview: null,
+ imagePreview: null,
+ imagePostview: null,
+ typingIndicator: false,
+ scrollPosition: 0,
+ fetchingMessages: false,
+ peerMessagingDisabled: false,
+ channel: false
+ };
+ } else if (nextProps.topic != prevState.topic) {
+ const topic = nextProps.tinode.getTopic(nextProps.topic);
+ nextState = {
+ topic: nextProps.topic,
+ docPreview: null,
+ imagePreview: null,
+ imagePostview: null,
+ typingIndicator: false,
+ scrollPosition: 0,
+ fetchingMessages: false
+ };
+
+ if (topic) {
+ const msgs = [];
+ const subs = [];
+
+ if (nextProps.connected) {
+ topic.subscribers(sub => {
+ if (sub.online && sub.user != nextProps.myUserId) {
+ subs.push(sub);
+ }
+ });
+ }
+
+ topic.messages(function (msg) {
+ if (!msg.deleted) {
+ msgs.push(msg);
+ }
+ });
+ Object.assign(nextState, {
+ messages: msgs,
+ onlineSubs: subs
+ });
+
+ if (topic.public) {
+ Object.assign(nextState, {
+ title: topic.public.fn,
+ avatar: (0,_lib_blob_helpers_js__WEBPACK_IMPORTED_MODULE_14__.makeImageUrl)(topic.public.photo)
+ });
+ } else {
+ Object.assign(nextState, {
+ title: '',
+ avatar: null
+ });
+ }
+
+ const peer = topic.p2pPeerDesc();
+
+ if (peer) {
+ Object.assign(nextState, {
+ peerMessagingDisabled: isPeerRestricted(peer.acs)
+ });
+ } else if (prevState.peerMessagingDisabled) {
+ Object.assign(nextState, {
+ peerMessagingDisabled: false
+ });
+ }
+
+ Object.assign(nextState, {
+ channel: topic.isChannel()
+ });
+ } else {
+ Object.assign(nextState, {
+ messages: [],
+ onlineSubs: [],
+ title: '',
+ avatar: null,
+ peerMessagingDisabled: false,
+ channel: false
+ });
+ }
+ }
+
+ if (nextProps.acs) {
+ if (nextProps.acs.isWriter() != prevState.isWriter) {
+ nextState.isWriter = !prevState.isWriter;
+ }
+
+ if (nextProps.acs.isReader() != prevState.isReader) {
+ nextState.isReader = !prevState.isReader;
+ }
+
+ if (!nextProps.acs.isReader('given') != prevState.readingBlocked) {
+ nextState.readingBlocked = !prevState.readingBlocked;
+ }
+
+ if (nextProps.acs.isSharer() != prevState.isSharer) {
+ nextState.isSharer = !prevState.isSharer;
+ }
+ } else {
+ if (prevState.isWriter) {
+ nextState.isWriter = false;
+ }
+
+ if (prevState.isReader) {
+ nextState.isReader = false;
+ }
+
+ if (!prevState.readingBlocked) {
+ prevState.readingBlocked = true;
+ }
+
+ if (prevState.isSharer) {
+ nextState.isSharer = false;
+ }
+ }
+
+ if (isUnconfirmed(nextProps.acs) == !prevState.unconformed) {
+ nextState.unconfirmed = !prevState.unconformed;
+ }
+
+ if (!nextProps.connected && prevState.onlineSubs && prevState.onlineSubs.length > 0) {
+ nextState.onlineSubs = [];
+ }
+
+ return nextState;
+ }
+
+ leave(oldTopicName) {
+ if (!oldTopicName) {
+ return;
+ }
+
+ let oldTopic = this.props.tinode.getTopic(oldTopicName);
+
+ if (oldTopic && oldTopic.isSubscribed()) {
+ oldTopic.leave(false).catch(() => {}).finally(() => {
+ this.setState({
+ fetchingMessages: false
+ });
+ oldTopic.onData = undefined;
+ oldTopic.onAllMessagesReceived = undefined;
+ oldTopic.onInfo = undefined;
+ oldTopic.onMetaDesc = undefined;
+ oldTopic.onSubsUpdated = undefined;
+ oldTopic.onPres = undefined;
+ });
+ }
+ }
+
+ handleScrollReference(node) {
+ if (node) {
+ node.addEventListener('scroll', this.handleScrollEvent);
+ this.messagesScroller = node;
+ this.messagesScroller.scrollTop = this.messagesScroller.scrollHeight - this.state.scrollPosition;
+ }
+ }
+
+ handleScrollEvent(event) {
+ this.setState({
+ scrollPosition: event.target.scrollHeight - event.target.scrollTop
+ });
+
+ if (event.target.scrollTop <= 0) {
+ this.setState((prevState, props) => {
+ const newState = {};
+
+ if (!prevState.fetchingMessages) {
+ const topic = this.props.tinode.getTopic(this.state.topic);
+
+ if (topic && topic.isSubscribed() && topic.msgHasMoreMessages()) {
+ newState.fetchingMessages = true;
+ topic.getMessagesPage(_config_js__WEBPACK_IMPORTED_MODULE_13__.MESSAGES_PAGE).catch(err => {
+ this.setState({
+ fetchingMessages: false
+ });
+ this.props.onError(err.message, 'err');
+ });
+ }
+ }
+
+ return newState;
+ });
+ }
+ }
+
+ handleDescChange(desc) {
+ if (desc.public) {
+ this.setState({
+ title: desc.public.fn,
+ avatar: (0,_lib_blob_helpers_js__WEBPACK_IMPORTED_MODULE_14__.makeImageUrl)(desc.public.photo)
+ });
+ } else {
+ this.setState({
+ title: '',
+ avatar: null
+ });
+ }
+
+ if (desc.acs) {
+ this.setState({
+ isWriter: desc.acs.isWriter(),
+ isReader: desc.acs.isReader(),
+ readingBlocked: !desc.acs.isReader('given'),
+ unconfirmed: isUnconfirmed(desc.acs)
+ });
+ }
+ }
+
+ postReadNotification(seq) {
+ if (!this.props.applicationVisible) {
+ return;
+ }
+
+ if (!this.readNotificationTimer) {
+ this.readNotificationTimer = setInterval(() => {
+ if (this.readNotificationQueue.length == 0) {
+ clearInterval(this.readNotificationTimer);
+ this.readNotificationTimer = null;
+ return;
+ }
+
+ let seq = -1;
+
+ while (this.readNotificationQueue.length > 0) {
+ const n = this.readNotificationQueue[0];
+
+ if (n.topicName != this.state.topic) {
+ this.readNotificationQueue.shift();
+ continue;
+ }
+
+ const now = new Date();
+
+ if (n.sendAt <= now) {
+ this.readNotificationQueue.shift();
+ seq = Math.max(seq, n.seq);
+ } else {
+ break;
+ }
+ }
+
+ if (seq >= 0) {
+ const topic = this.props.tinode.getTopic(this.state.topic);
+
+ if (topic) {
+ topic.noteRead(seq);
+ }
+ }
+ }, NOTIFICATION_EXEC_INTERVAL);
+ }
+
+ const now = new Date();
+ this.readNotificationQueue.push({
+ topicName: this.state.topic,
+ seq: seq,
+ sendAt: now.setMilliseconds(now.getMilliseconds() + _config_js__WEBPACK_IMPORTED_MODULE_13__.READ_DELAY)
+ });
+ }
+
+ clearNotificationQueue() {
+ this.readNotificationQueue = [];
+
+ if (this.readNotificationTimer) {
+ clearInterval(this.readNotificationTimer);
+ this.readNotificationTimer = null;
+ }
+ }
+
+ handleSubsUpdated() {
+ if (this.state.topic) {
+ const subs = [];
+ const topic = this.props.tinode.getTopic(this.state.topic);
+ topic.subscribers(sub => {
+ if (sub.online && sub.user != this.props.myUserId) {
+ subs.push(sub);
+ }
+ });
+ const newState = {
+ onlineSubs: subs
+ };
+ const peer = topic.p2pPeerDesc();
+
+ if (peer) {
+ Object.assign(newState, {
+ peerMessagingDisabled: isPeerRestricted(peer.acs)
+ });
+ } else if (this.state.peerMessagingDisabled) {
+ Object.assign(newState, {
+ peerMessagingDisabled: false
+ });
+ }
+
+ this.setState(newState);
+ }
+ }
+
+ handleNewMessage(msg) {
+ const topic = this.props.tinode.getTopic(this.state.topic);
+ const newState = {
+ messages: []
+ };
+ topic.messages(m => {
+ if (!m.deleted) {
+ newState.messages.push(m);
+ }
+ });
+
+ if (msg && !msg.deleted) {
+ if (topic.isNewMessage(msg.seq)) {
+ newState.scrollPosition = 0;
+ }
+
+ const status = topic.msgStatus(msg);
+
+ if (status >= (tinode_sdk__WEBPACK_IMPORTED_MODULE_2___default().MESSAGE_STATUS_SENT) && msg.from != this.props.myUserId) {
+ this.postReadNotification(msg.seq);
+ }
+
+ this.props.onData(msg);
+ }
+
+ this.setState(newState);
+ }
+
+ handleAllMessagesReceived(count) {
+ this.setState({
+ fetchingMessages: false
+ });
+
+ if (count > 0) {
+ this.postReadNotification(0);
+ }
+ }
+
+ handleInfoReceipt(info) {
+ switch (info.what) {
+ case 'kp':
+ {
+ clearTimeout(this.keyPressTimer);
+ var instance = this;
+ this.keyPressTimer = setTimeout(function () {
+ instance.setState({
+ typingIndicator: false
+ });
+ }, _config_js__WEBPACK_IMPORTED_MODULE_13__.KEYPRESS_DELAY + 1000);
+
+ if (!this.state.typingIndicator) {
+ this.setState({
+ typingIndicator: true
+ });
+ }
+
+ break;
+ }
+
+ case 'read':
+ case 'recv':
+ this.forceUpdate();
+ break;
+
+ default:
+ console.log("Other change in topic: ", info.what);
+ }
+ }
+
+ handleImagePostview(content) {
+ this.setState({
+ imagePostview: content
+ });
+ }
+
+ handleClosePreview() {
+ if (this.state.imagePreview && this.state.imagePreview.url) {
+ URL.revokeObjectURL(this.state.imagePreview.url);
+ }
+
+ this.setState({
+ imagePostview: null,
+ imagePreview: null,
+ docPreview: null
+ });
+ }
+
+ handleFormResponse(action, text, data) {
+ if (action == 'pub') {
+ this.props.sendMessage(Drafty.attachJSON(Drafty.parse(text), data));
+ } else if (action == 'url') {
+ const url = new URL(data.ref);
+ const params = url.searchParams;
+
+ for (let key in data.resp) {
+ if (data.resp.hasOwnProperty(key)) {
+ params.set(key, data.resp[key]);
+ }
+ }
+
+ ['name', 'seq'].map(function (key) {
+ if (data[key]) {
+ params.set(key, data[key]);
+ }
+ });
+ params.set('uid', this.props.myUserId);
+ url.search = params;
+ window.open(url, '_blank');
+ } else {
+ console.log("Unknown action in form", action);
+ }
+ }
+
+ handleContextClick(e) {
+ e.preventDefault();
+ e.stopPropagation();
+ this.props.showContextMenu({
+ topicName: this.state.topic,
+ y: e.pageY,
+ x: e.pageX
+ });
+ }
+
+ handleShowContextMenuMessage(params, messageSpecificMenuItems) {
+ params.topicName = this.state.topic;
+ const menuItems = messageSpecificMenuItems || [];
+ const topic = this.props.tinode.getTopic(params.topicName);
+
+ if (topic) {
+ if (!topic.isChannel()) {
+ menuItems.push('message_delete');
+ }
+
+ const acs = topic.getAccessMode();
+
+ if (acs && acs.isDeleter()) {
+ menuItems.push('message_delete_hard');
+ }
+ }
+
+ this.props.showContextMenu(params, menuItems);
+ }
+
+ handleNewChatAcceptance(action) {
+ this.props.onNewChat(this.state.topic, action);
+ }
+
+ handleEnablePeer(e) {
+ e.preventDefault();
+ this.props.onChangePermissions(this.state.topic, _config_js__WEBPACK_IMPORTED_MODULE_13__.DEFAULT_P2P_ACCESS_MODE, this.state.topic);
+ }
+
+ sendKeyPress() {
+ const topic = this.props.tinode.getTopic(this.state.topic);
+
+ if (topic.isSubscribed()) {
+ topic.noteKeyPress();
+ }
+ }
+
+ sendFileAttachment(file) {
+ const maxInbandAttachmentSize = this.props.tinode.getServerLimit('maxMessageSize', _config_js__WEBPACK_IMPORTED_MODULE_13__.MAX_INBAND_ATTACHMENT_SIZE) * 0.75 - 1024 | 0;
+
+ if (file.size > maxInbandAttachmentSize) {
+ const uploader = this.props.tinode.getLargeFileHelper();
+
+ if (!uploader) {
+ this.props.onError(this.props.intl.formatMessage(messages.cannot_initiate_upload));
+ return;
+ }
+
+ const uploadCompletionPromise = uploader.upload(file);
+ const msg = Drafty.attachFile(null, {
+ mime: file.type,
+ filename: file.name,
+ size: file.size,
+ urlPromise: uploadCompletionPromise
+ });
+ this.props.sendMessage(msg, uploadCompletionPromise, uploader);
+ } else {
+ (0,_lib_blob_helpers_js__WEBPACK_IMPORTED_MODULE_14__.fileToBase64)(file, (mime, bits, fname) => {
+ this.props.sendMessage(Drafty.attachFile(null, {
+ mime: mime,
+ data: bits,
+ filename: fname
+ }));
+ }, this.props.onError);
+ }
+ }
+
+ handleAttachFile(file) {
+ const maxExternAttachmentSize = this.props.tinode.getServerLimit('maxFileUploadSize', _config_js__WEBPACK_IMPORTED_MODULE_13__.MAX_EXTERN_ATTACHMENT_SIZE);
+
+ if (file.size > maxExternAttachmentSize) {
+ this.props.onError(this.props.intl.formatMessage({
+ id: 'file_attachment_too_large'
+ }, {
+ size: (0,_lib_strformat_js__WEBPACK_IMPORTED_MODULE_16__.bytesToHumanSize)(file.size),
+ limit: (0,_lib_strformat_js__WEBPACK_IMPORTED_MODULE_16__.bytesToHumanSize)(maxExternAttachmentSize)
+ }), 'err');
+ } else {
+ this.setState({
+ docPreview: {
+ file: file,
+ filename: file.name,
+ size: file.size,
+ type: file.type
+ }
+ });
+ }
+ }
+
+ sendImageAttachment(caption, blob) {
+ const mime = this.state.imagePreview.type;
+ const width = this.state.imagePreview.width;
+ const height = this.state.imagePreview.height;
+ const fname = this.state.imagePreview.filename;
+ const maxInbandAttachmentSize = this.props.tinode.getServerLimit('maxMessageSize', _config_js__WEBPACK_IMPORTED_MODULE_13__.MAX_INBAND_ATTACHMENT_SIZE) * 0.75 - 1024 | 0;
+
+ if (blob.size > maxInbandAttachmentSize) {
+ const uploader = this.props.tinode.getLargeFileHelper();
+
+ if (!uploader) {
+ this.props.onError(this.props.intl.formatMessage(messages.cannot_initiate_upload));
+ return;
+ }
+
+ const uploadCompletionPromise = uploader.upload(blob);
+ (0,_lib_blob_helpers_js__WEBPACK_IMPORTED_MODULE_14__.imageScaled)(blob, _config_js__WEBPACK_IMPORTED_MODULE_13__.IMAGE_PREVIEW_DIM, _config_js__WEBPACK_IMPORTED_MODULE_13__.IMAGE_PREVIEW_DIM, -1, false, tinyBlob => {
+ (0,_lib_blob_helpers_js__WEBPACK_IMPORTED_MODULE_14__.blobToBase64)(tinyBlob, (blobMime, tinyBits64) => {
+ let msg = Drafty.insertImage(null, 0, {
+ mime: mime,
+ _tempPreview: tinyBits64,
+ width: width,
+ height: height,
+ filename: fname,
+ size: blob.size,
+ urlPromise: uploadCompletionPromise
+ });
+
+ if (caption) {
+ msg = Drafty.appendLineBreak(msg);
+ msg = Drafty.append(msg, Drafty.init(caption));
+ }
+
+ this.props.sendMessage(msg, uploadCompletionPromise, uploader);
+ });
+ }, err => {
+ this.props.onError(err, 'err');
+ });
+ return;
+ }
+
+ (0,_lib_blob_helpers_js__WEBPACK_IMPORTED_MODULE_14__.blobToBase64)(blob, (blobMime, bits64) => {
+ let msg = Drafty.insertImage(null, 0, {
+ mime: blobMime,
+ preview: bits64,
+ width: width,
+ height: height,
+ filename: fname,
+ size: blob.size
+ });
+
+ if (caption) {
+ msg = Drafty.appendLineBreak(msg);
+ msg = Drafty.append(msg, Drafty.init(caption));
+ }
+
+ this.props.sendMessage(msg);
+ });
+ }
+
+ handleAttachImage(file) {
+ const maxExternAttachmentSize = this.props.tinode.getServerLimit('maxFileUploadSize', _config_js__WEBPACK_IMPORTED_MODULE_13__.MAX_EXTERN_ATTACHMENT_SIZE);
+ (0,_lib_blob_helpers_js__WEBPACK_IMPORTED_MODULE_14__.imageScaled)(file, _config_js__WEBPACK_IMPORTED_MODULE_13__.MAX_IMAGE_DIM, _config_js__WEBPACK_IMPORTED_MODULE_13__.MAX_IMAGE_DIM, maxExternAttachmentSize, false, (blob, mime, width, height, fname) => {
+ this.setState({
+ imagePreview: {
+ url: URL.createObjectURL(blob),
+ blob: blob,
+ filename: fname,
+ width: width,
+ height: height,
+ size: blob.size,
+ type: mime
+ }
+ });
+ }, err => {
+ this.props.onError(err, 'err');
+ });
+ }
+
+ handleCancelUpload(seq, uploader) {
+ const found = this.state.messages.find(msg => msg.seq == seq);
+
+ if (found) {
+ found._cancelled = true;
+ }
+
+ uploader.cancel();
+ }
+
+ render() {
+ const {
+ formatMessage
+ } = this.props.intl;
+ let component;
+
+ if (this.props.hideSelf) {
+ component = null;
+ } else if (!this.state.topic) {
+ component = react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_logo_view_jsx__WEBPACK_IMPORTED_MODULE_11__.default, {
+ serverVersion: this.props.serverVersion,
+ serverAddress: this.props.serverAddress
+ });
+ } else {
+ let component2;
+
+ if (this.state.imagePreview) {
+ component2 = react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_widgets_image_preview_jsx__WEBPACK_IMPORTED_MODULE_7__.default, {
+ content: this.state.imagePreview,
+ onClose: this.handleClosePreview,
+ onSendMessage: this.sendImageAttachment
+ });
+ } else if (this.state.imagePostview) {
+ component2 = react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_widgets_image_preview_jsx__WEBPACK_IMPORTED_MODULE_7__.default, {
+ content: this.state.imagePostview,
+ onClose: this.handleClosePreview
+ });
+ } else if (this.state.docPreview) {
+ component2 = react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_widgets_doc_preview_jsx__WEBPACK_IMPORTED_MODULE_4__.default, {
+ content: this.state.docPreview,
+ onClose: this.handleClosePreview,
+ onSendMessage: this.sendFileAttachment
+ });
+ } else {
+ const topic = this.props.tinode.getTopic(this.state.topic);
+ const isChannel = topic.isChannel();
+ const groupTopic = topic.getType() == 'grp' && !isChannel;
+ let messageNodes = [];
+ let previousFrom = null;
+ let chatBoxClass = null;
+
+ for (let i = 0; i < this.state.messages.length; i++) {
+ let msg = this.state.messages[i];
+ let nextFrom = null;
+
+ if (i + 1 < this.state.messages.length) {
+ nextFrom = this.state.messages[i + 1].from || 'chan';
+ }
+
+ let sequence = 'single';
+ let thisFrom = msg.from || 'chan';
+
+ if (thisFrom == previousFrom) {
+ if (thisFrom == nextFrom) {
+ sequence = 'middle';
+ } else {
+ sequence = 'last';
+ }
+ } else if (thisFrom == nextFrom) {
+ sequence = 'first';
+ }
+
+ previousFrom = thisFrom;
+ const isReply = !(thisFrom == this.props.myUserId);
+ const deliveryStatus = topic.msgStatus(msg);
+ let userName, userAvatar, userFrom;
+
+ if (groupTopic) {
+ const user = topic.userDesc(thisFrom);
+
+ if (user && user.public) {
+ userName = user.public.fn;
+ userAvatar = (0,_lib_blob_helpers_js__WEBPACK_IMPORTED_MODULE_14__.makeImageUrl)(user.public.photo);
+ }
+
+ userFrom = thisFrom;
+ chatBoxClass = 'chat-box group';
+ } else {
+ chatBoxClass = 'chat-box';
+ }
+
+ messageNodes.push(react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_widgets_chat_message_jsx__WEBPACK_IMPORTED_MODULE_3__.default, {
+ tinode: this.props.tinode,
+ content: msg.content,
+ deleted: msg.hi,
+ mimeType: msg.head ? msg.head.mime : null,
+ timestamp: msg.ts,
+ response: isReply,
+ seq: msg.seq,
+ userFrom: userFrom,
+ userName: userName,
+ userAvatar: userAvatar,
+ sequence: sequence,
+ received: deliveryStatus,
+ uploader: msg._uploader,
+ viewportWidth: this.props.viewportWidth,
+ showContextMenu: this.state.channel ? false : this.handleShowContextMenuMessage,
+ onImagePreview: this.handleImagePostview,
+ onFormResponse: this.handleFormResponse,
+ onError: this.props.onError,
+ onCancelUpload: this.handleCancelUpload,
+ key: msg.seq
+ }));
+ }
+
+ let lastSeen = null;
+
+ if (isChannel) {
+ lastSeen = formatMessage(messages.channel);
+ } else {
+ const cont = this.props.tinode.getMeTopic().getContact(this.state.topic);
+
+ if (cont && tinode_sdk__WEBPACK_IMPORTED_MODULE_2___default().isP2PTopicName(cont.topic)) {
+ if (cont.online) {
+ lastSeen = formatMessage(messages.online_now);
+ } else if (cont.seen) {
+ lastSeen = formatMessage(messages.last_seen) + ": " + (0,_lib_strformat_js__WEBPACK_IMPORTED_MODULE_16__.shortDateFormat)(cont.seen.when, this.props.intl.locale);
+ }
+ }
+ }
+
+ const avatar = this.state.avatar || true;
+ const online = this.props.online ? 'online' + (this.state.typingIndicator ? ' typing' : '') : 'offline';
+ component2 = react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null, react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
+ id: "topic-caption-panel",
+ className: "caption-panel"
+ }, this.props.displayMobile ? react__WEBPACK_IMPORTED_MODULE_0___default().createElement("a", {
+ href: "#",
+ id: "hide-message-view",
+ onClick: e => {
+ e.preventDefault();
+ this.props.onHideMessagesView();
+ }
+ }, react__WEBPACK_IMPORTED_MODULE_0___default().createElement("i", {
+ className: "material-icons"
+ }, "arrow_back")) : null, react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
+ className: "avatar-box"
+ }, react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_widgets_letter_tile_jsx__WEBPACK_IMPORTED_MODULE_9__.default, {
+ avatar: avatar,
+ topic: this.state.topic,
+ title: this.state.title
+ }), !isChannel ? react__WEBPACK_IMPORTED_MODULE_0___default().createElement("span", {
+ className: online
+ }) : null), react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
+ id: "topic-title-group"
+ }, react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
+ id: "topic-title",
+ className: "panel-title"
+ }, this.state.title || react__WEBPACK_IMPORTED_MODULE_0___default().createElement("i", null, react__WEBPACK_IMPORTED_MODULE_0___default().createElement(react_intl__WEBPACK_IMPORTED_MODULE_1__.FormattedMessage, {
+ id: "unnamed_topic",
+ defaultMessage: "Unnamed",
+ description: "Title shown when the topic has no name"
+ }))), react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
+ id: "topic-last-seen"
+ }, lastSeen)), groupTopic ? react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_widgets_group_subs_jsx__WEBPACK_IMPORTED_MODULE_6__.default, {
+ subscribers: this.state.onlineSubs
+ }) : react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
+ id: "topic-users"
+ }), react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", null, react__WEBPACK_IMPORTED_MODULE_0___default().createElement("a", {
+ href: "#",
+ onClick: this.handleContextClick
+ }, react__WEBPACK_IMPORTED_MODULE_0___default().createElement("i", {
+ className: "material-icons"
+ }, "more_vert")))), this.props.displayMobile ? react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_widgets_error_panel_jsx__WEBPACK_IMPORTED_MODULE_5__.default, {
+ level: this.props.errorLevel,
+ text: this.props.errorText,
+ onClearError: this.props.onError
+ }) : null, react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_widgets_load_spinner_jsx__WEBPACK_IMPORTED_MODULE_10__.default, {
+ show: this.state.fetchingMessages
+ }), react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
+ id: "messages-container"
+ }, react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
+ id: "messages-panel",
+ ref: this.handleScrollReference
+ }, react__WEBPACK_IMPORTED_MODULE_0___default().createElement("ul", {
+ id: "scroller",
+ className: chatBoxClass
+ }, messageNodes)), !this.state.isReader ? react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
+ id: "write-only-background"
+ }, this.state.readingBlocked ? react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
+ id: "write-only-note"
+ }, react__WEBPACK_IMPORTED_MODULE_0___default().createElement(react_intl__WEBPACK_IMPORTED_MODULE_1__.FormattedMessage, {
+ id: "messages_not_readable",
+ defaultMessage: "no access to messages",
+ description: "Message shown in topic without the read access"
+ })) : null) : null), this.state.peerMessagingDisabled && !this.state.unconfirmed ? react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
+ id: "peer-messaging-disabled-note"
+ }, react__WEBPACK_IMPORTED_MODULE_0___default().createElement("i", {
+ className: "material-icons secondary"
+ }, "block"), " ", react__WEBPACK_IMPORTED_MODULE_0___default().createElement(react_intl__WEBPACK_IMPORTED_MODULE_1__.FormattedMessage, {
+ id: "peers_messaging_disabled",
+ defaultMessage: "Peer's messaging is disabled.",
+ description: "Shown when the p2p peer's messaging is disabled"
+ }), " ", react__WEBPACK_IMPORTED_MODULE_0___default().createElement("a", {
+ href: "#",
+ onClick: this.handleEnablePeer
+ }, react__WEBPACK_IMPORTED_MODULE_0___default().createElement(react_intl__WEBPACK_IMPORTED_MODULE_1__.FormattedMessage, {
+ id: "enable_peers_messaging",
+ defaultMessage: "Enable",
+ description: "Call to action to enable peer's messaging"
+ })), ".") : null, this.state.unconfirmed ? react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_widgets_invitation_jsx__WEBPACK_IMPORTED_MODULE_8__.default, {
+ onAction: this.handleNewChatAcceptance
+ }) : react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_widgets_send_message_jsx__WEBPACK_IMPORTED_MODULE_12__.default, {
+ disabled: !this.state.isWriter,
+ onSendMessage: this.props.sendMessage,
+ onKeyPress: this.sendKeyPress,
+ onAttachFile: this.handleAttachFile,
+ onAttachImage: this.handleAttachImage,
+ onError: this.props.onError
+ }));
+ }
+
+ component = react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
+ id: "topic-view"
+ }, component2);
+ }
+
+ return component;
+ }
+
+}
+
+;
+/* harmony default export */ __webpack_exports__["default"] = ((0,react_intl__WEBPACK_IMPORTED_MODULE_1__.injectIntl)(MessagesView));
+
+/***/ }),
+
+/***/ "./src/views/new-topic-view.jsx":
+/*!**************************************!*\
+ !*** ./src/views/new-topic-view.jsx ***!
+ \**************************************/
+/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
+
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "react");
+/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);
+/* harmony import */ var react_intl__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react-intl */ "react-intl");
+/* harmony import */ var react_intl__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react_intl__WEBPACK_IMPORTED_MODULE_1__);
+/* harmony import */ var tinode_sdk__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! tinode-sdk */ "tinode-sdk");
+/* harmony import */ var tinode_sdk__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(tinode_sdk__WEBPACK_IMPORTED_MODULE_2__);
+/* harmony import */ var _widgets_contact_list_jsx__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../widgets/contact-list.jsx */ "./src/widgets/contact-list.jsx");
+/* harmony import */ var _widgets_new_topic_by_id_jsx__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../widgets/new-topic-by-id.jsx */ "./src/widgets/new-topic-by-id.jsx");
+/* harmony import */ var _widgets_new_topic_group_jsx__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../widgets/new-topic-group.jsx */ "./src/widgets/new-topic-group.jsx");
+/* harmony import */ var _widgets_search_contacts_jsx__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../widgets/search-contacts.jsx */ "./src/widgets/search-contacts.jsx");
+/* harmony import */ var _lib_navigation_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../lib/navigation.js */ "./src/lib/navigation.js");
+/* harmony import */ var _lib_utils_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../lib/utils.js */ "./src/lib/utils.js");
+
+
+
+
+
+
+
+
+
+const messages = (0,react_intl__WEBPACK_IMPORTED_MODULE_1__.defineMessages)({
+ search_for_contacts: {
+ id: "search_for_contacts",
+ defaultMessage: "Use search to find contacts",
+ description: "Text shown in contacts view when user entered no search query."
+ },
+ search_no_results: {
+ id: "search_no_results",
+ defaultMessage: "Search returned no results",
+ description: "Text shown in contacts view when query returned no results."
+ }
+});
+
+class NewTopicView extends (react__WEBPACK_IMPORTED_MODULE_0___default().Component) {
+ constructor(props) {
+ super(props);
+ this.state = {
+ tabSelected: 'p2p',
+ searchQuery: null
+ };
+ this.handleTabClick = this.handleTabClick.bind(this);
+ this.handleSearchContacts = this.handleSearchContacts.bind(this);
+ this.handleContactSelected = this.handleContactSelected.bind(this);
+ this.handleNewGroupSubmit = this.handleNewGroupSubmit.bind(this);
+ this.handleGroupByID = this.handleGroupByID.bind(this);
+ }
+
+ componentDidMount() {
+ this.props.onInitFind();
+ }
+
+ handleTabClick(e) {
+ e.preventDefault();
+ _lib_navigation_js__WEBPACK_IMPORTED_MODULE_7__.default.navigateTo(_lib_navigation_js__WEBPACK_IMPORTED_MODULE_7__.default.addUrlParam(window.location.hash, 'tab', e.currentTarget.dataset.id));
+ this.setState({
+ tabSelected: e.currentTarget.dataset.id
+ });
+ }
+
+ handleSearchContacts(query) {
+ this.props.onSearchContacts(query);
+ this.setState({
+ searchQuery: tinode_sdk__WEBPACK_IMPORTED_MODULE_2___default().isNullValue(query) ? null : query
+ });
+ }
+
+ handleContactSelected(sel) {
+ if (this.state.tabSelected === 'p2p') {
+ _lib_navigation_js__WEBPACK_IMPORTED_MODULE_7__.default.navigateTo(_lib_navigation_js__WEBPACK_IMPORTED_MODULE_7__.default.removeUrlParam(window.location.hash, 'tab'));
+ this.props.onCreateTopic(sel);
+ }
+ }
+
+ handleNewGroupSubmit(name, dataUrl, priv, tags, isChannel) {
+ _lib_navigation_js__WEBPACK_IMPORTED_MODULE_7__.default.navigateTo(_lib_navigation_js__WEBPACK_IMPORTED_MODULE_7__.default.removeUrlParam(window.location.hash, 'tab'));
+ this.props.onCreateTopic(undefined, (0,_lib_utils_js__WEBPACK_IMPORTED_MODULE_8__.vcard)(name, dataUrl), priv, tags, isChannel);
+ }
+
+ handleGroupByID(topicName) {
+ _lib_navigation_js__WEBPACK_IMPORTED_MODULE_7__.default.navigateTo(_lib_navigation_js__WEBPACK_IMPORTED_MODULE_7__.default.removeUrlParam(window.location.hash, 'tab'));
+ this.props.onCreateTopic(topicName);
+ }
+
+ render() {
+ const {
+ formatMessage
+ } = this.props.intl;
+ const no_contacts_placeholder = formatMessage(this.state.searchQuery ? messages.search_no_results : messages.search_for_contacts);
+ return react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
+ className: "flex-column"
+ }, react__WEBPACK_IMPORTED_MODULE_0___default().createElement("ul", {
+ className: "tabbar"
+ }, react__WEBPACK_IMPORTED_MODULE_0___default().createElement("li", {
+ className: this.state.tabSelected === "p2p" ? "active" : null
+ }, react__WEBPACK_IMPORTED_MODULE_0___default().createElement("a", {
+ href: "#",
+ "data-id": "p2p",
+ onClick: this.handleTabClick
+ }, react__WEBPACK_IMPORTED_MODULE_0___default().createElement(react_intl__WEBPACK_IMPORTED_MODULE_1__.FormattedMessage, {
+ id: "tabtitle_find_user",
+ defaultMessage: "find",
+ description: "Tab title Find"
+ }))), react__WEBPACK_IMPORTED_MODULE_0___default().createElement("li", {
+ className: this.state.tabSelected === "grp" ? "active" : null
+ }, react__WEBPACK_IMPORTED_MODULE_0___default().createElement("a", {
+ href: "#",
+ "data-id": "grp",
+ onClick: this.handleTabClick
+ }, react__WEBPACK_IMPORTED_MODULE_0___default().createElement(react_intl__WEBPACK_IMPORTED_MODULE_1__.FormattedMessage, {
+ id: "tabtitle_new_group",
+ defaultMessage: "new group",
+ description: "Tab title New Group"
+ }))), react__WEBPACK_IMPORTED_MODULE_0___default().createElement("li", {
+ className: this.state.tabSelected === "byid" ? "active" : null
+ }, react__WEBPACK_IMPORTED_MODULE_0___default().createElement("a", {
+ href: "#",
+ "data-id": "byid",
+ onClick: this.handleTabClick
+ }, react__WEBPACK_IMPORTED_MODULE_0___default().createElement(react_intl__WEBPACK_IMPORTED_MODULE_1__.FormattedMessage, {
+ id: "tabtitle_group_by_id",
+ defaultMessage: "by id",
+ description: "Tab title Find topic by ID"
+ })))), this.state.tabSelected === 'grp' ? react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_widgets_new_topic_group_jsx__WEBPACK_IMPORTED_MODULE_5__.default, {
+ tinode: this.props.tinode,
+ onSubmit: this.handleNewGroupSubmit
+ }) : this.state.tabSelected === 'byid' ? react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_widgets_new_topic_by_id_jsx__WEBPACK_IMPORTED_MODULE_4__.default, {
+ onSubmit: this.handleGroupByID,
+ onError: this.props.onError
+ }) : react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
+ className: "flex-column"
+ }, react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_widgets_search_contacts_jsx__WEBPACK_IMPORTED_MODULE_6__.default, {
+ type: "p2p",
+ onSearchContacts: this.handleSearchContacts
+ }), react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_widgets_contact_list_jsx__WEBPACK_IMPORTED_MODULE_3__.default, {
+ contacts: this.props.searchResults,
+ myUserId: this.props.myUserId,
+ emptyListMessage: no_contacts_placeholder,
+ showOnline: false,
+ showUnread: false,
+ showContextMenu: false,
+ onTopicSelected: this.handleContactSelected
+ })));
+ }
+
+}
+
+;
+/* harmony default export */ __webpack_exports__["default"] = ((0,react_intl__WEBPACK_IMPORTED_MODULE_1__.injectIntl)(NewTopicView));
+
+/***/ }),
+
+/***/ "./src/views/password-reset-view.jsx":
+/*!*******************************************!*\
+ !*** ./src/views/password-reset-view.jsx ***!
+ \*******************************************/
+/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
+
+__webpack_require__.r(__webpack_exports__);
+/* harmony export */ __webpack_require__.d(__webpack_exports__, {
+/* harmony export */ "default": function() { return /* binding */ PasswordResetView; }
+/* harmony export */ });
+/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "react");
+/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);
+/* harmony import */ var react_intl__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react-intl */ "react-intl");
+/* harmony import */ var react_intl__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react_intl__WEBPACK_IMPORTED_MODULE_1__);
+/* harmony import */ var _widgets_visible_password_jsx__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../widgets/visible-password.jsx */ "./src/widgets/visible-password.jsx");
+/* harmony import */ var _lib_navigation_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../lib/navigation.js */ "./src/lib/navigation.js");
+
+
+
+
+class PasswordResetView extends (react__WEBPACK_IMPORTED_MODULE_0___default().PureComponent) {
+ constructor(props) {
+ super(props);
+ this.state = {
+ email: '',
+ password: ''
+ };
+ this.handleSubmit = this.handleSubmit.bind(this);
+ this.handleEmailChange = this.handleEmailChange.bind(this);
+ this.handlePasswordChange = this.handlePasswordChange.bind(this);
+ }
+
+ componentDidMount() {
+ let parsed = _lib_navigation_js__WEBPACK_IMPORTED_MODULE_3__.default.parseUrlHash(window.location.hash);
+ this.setState({
+ token: parsed.params.token,
+ scheme: parsed.params.scheme
+ });
+ }
+
+ handleSubmit(e) {
+ e.preventDefault();
+
+ if (this.state.token) {
+ this.props.onReset(this.state.scheme, this.state.password.trim(), this.state.token);
+ } else {
+ this.props.onRequest('email', this.state.email.trim());
+ }
+ }
+
+ handleEmailChange(e) {
+ this.setState({
+ email: e.target.value
+ });
+ }
+
+ handlePasswordChange(e) {
+ this.setState({
+ password: e.target.value
+ });
+ }
+
+ render() {
+ let reset = this.state.token && this.state.scheme;
+ return react__WEBPACK_IMPORTED_MODULE_0___default().createElement("form", {
+ id: "password-reset-form",
+ onSubmit: this.handleSubmit
+ }, reset ? react__WEBPACK_IMPORTED_MODULE_0___default().createElement(react_intl__WEBPACK_IMPORTED_MODULE_1__.FormattedMessage, {
+ id: "new_password_placeholder",
+ defaultMessage: "Enter new password",
+ description: "Placeholder for entering new password"
+ }, placeholder => react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_widgets_visible_password_jsx__WEBPACK_IMPORTED_MODULE_2__.default, {
+ placeholder: placeholder,
+ autoComplete: "new-password",
+ value: this.state.password,
+ required: true,
+ autoFocus: true,
+ onChange: this.handlePasswordChange
+ })) : react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null, react__WEBPACK_IMPORTED_MODULE_0___default().createElement("label", {
+ htmlFor: "inputEmail"
+ }, react__WEBPACK_IMPORTED_MODULE_0___default().createElement(react_intl__WEBPACK_IMPORTED_MODULE_1__.FormattedMessage, {
+ id: "label_reset_password",
+ defaultMessage: "Send a password reset email:",
+ description: "Label for password reset field"
+ })), react__WEBPACK_IMPORTED_MODULE_0___default().createElement(react_intl__WEBPACK_IMPORTED_MODULE_1__.FormattedMessage, {
+ id: "credential_email_prompt",
+ defaultMessage: "Your registration email",
+ description: "Placeholder for entering email"
+ }, placeholder => react__WEBPACK_IMPORTED_MODULE_0___default().createElement("input", {
+ type: "email",
+ id: "inputEmail",
+ placeholder: placeholder,
+ autoComplete: "email",
+ value: this.state.email,
+ onChange: this.handleEmailChange,
+ required: true,
+ autoFocus: true
+ }))), react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
+ className: "dialog-buttons"
+ }, react__WEBPACK_IMPORTED_MODULE_0___default().createElement("button", {
+ className: "blue",
+ type: "submit"
+ }, reset ? react__WEBPACK_IMPORTED_MODULE_0___default().createElement(react_intl__WEBPACK_IMPORTED_MODULE_1__.FormattedMessage, {
+ id: "button_reset",
+ defaultMessage: "Reset",
+ description: "Button [Reset]"
+ }) : react__WEBPACK_IMPORTED_MODULE_0___default().createElement(react_intl__WEBPACK_IMPORTED_MODULE_1__.FormattedMessage, {
+ id: "button_send_request",
+ defaultMessage: "Send request",
+ description: "Button [Send request]"
+ }))));
+ }
+
+}
+
+/***/ }),
+
+/***/ "./src/views/settings-view.jsx":
+/*!*************************************!*\
+ !*** ./src/views/settings-view.jsx ***!
+ \*************************************/
+/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
+
+__webpack_require__.r(__webpack_exports__);
+/* harmony export */ __webpack_require__.d(__webpack_exports__, {
+/* harmony export */ "default": function() { return /* binding */ SettingsView; }
+/* harmony export */ });
+/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "react");
+/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);
+/* harmony import */ var react_intl__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react-intl */ "react-intl");
+/* harmony import */ var react_intl__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react_intl__WEBPACK_IMPORTED_MODULE_1__);
+/* harmony import */ var _widgets_host_selector_jsx__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../widgets/host-selector.jsx */ "./src/widgets/host-selector.jsx");
+
+
+
+class SettingsView extends (react__WEBPACK_IMPORTED_MODULE_0___default().PureComponent) {
+ constructor(props) {
+ super(props);
+ this.state = {
+ transport: props.transport || 'def',
+ serverAddress: props.serverAddress
+ };
+ this.handleSubmit = this.handleSubmit.bind(this);
+ this.handleTransportSelected = this.handleTransportSelected.bind(this);
+ this.handleServerAddressChange = this.handleServerAddressChange.bind(this);
+ }
+
+ handleSubmit(e) {
+ e.preventDefault();
+ this.props.onUpdate({
+ transport: this.state.transport,
+ serverAddress: this.state.serverAddress
+ });
+ }
+
+ handleTransportSelected(e) {
+ this.setState({
+ transport: e.currentTarget.value
+ });
+ }
+
+ handleServerAddressChange(name) {
+ this.setState({
+ serverAddress: name
+ });
+ }
+
+ render() {
+ const names = {
+ def: "default",
+ ws: "websocket",
+ lp: "long polling"
+ };
+ var transportOptions = [];
+ var instance = this;
+ ['def', 'ws', 'lp'].map(function (item) {
+ var id = 'transport-' + item;
+ var name = names[item];
+ transportOptions.push(react__WEBPACK_IMPORTED_MODULE_0___default().createElement("li", {
+ key: item
+ }, react__WEBPACK_IMPORTED_MODULE_0___default().createElement("input", {
+ type: "radio",
+ id: id,
+ name: "transport-select",
+ value: item,
+ checked: instance.state.transport === item,
+ onChange: instance.handleTransportSelected
+ }), react__WEBPACK_IMPORTED_MODULE_0___default().createElement("label", {
+ htmlFor: id
+ }, name)));
+ });
+ return react__WEBPACK_IMPORTED_MODULE_0___default().createElement("form", {
+ id: "settings-form",
+ className: "panel-form",
+ onSubmit: this.handleSubmit
+ }, react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
+ className: "panel-form-row"
+ }, react__WEBPACK_IMPORTED_MODULE_0___default().createElement("label", {
+ className: "small"
+ }, react__WEBPACK_IMPORTED_MODULE_0___default().createElement(react_intl__WEBPACK_IMPORTED_MODULE_1__.FormattedMessage, {
+ id: "label_server_to_use",
+ defaultMessage: "Server to use:",
+ description: "Label for server selector in SettingsView"
+ }))), react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_widgets_host_selector_jsx__WEBPACK_IMPORTED_MODULE_2__.default, {
+ serverAddress: this.state.serverAddress,
+ onServerAddressChange: this.handleServerAddressChange
+ }), react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
+ className: "panel-form-row"
+ }, react__WEBPACK_IMPORTED_MODULE_0___default().createElement("label", {
+ className: "small"
+ }, react__WEBPACK_IMPORTED_MODULE_0___default().createElement(react_intl__WEBPACK_IMPORTED_MODULE_1__.FormattedMessage, {
+ id: "label_wire_transport",
+ defaultMessage: "Wire transport:",
+ description: "Label for wire transport selection in SettingsView"
+ }))), react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
+ className: "panel-form-row"
+ }, react__WEBPACK_IMPORTED_MODULE_0___default().createElement("ul", {
+ className: "quoted"
+ }, transportOptions)), react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
+ className: "dialog-buttons"
+ }, react__WEBPACK_IMPORTED_MODULE_0___default().createElement("button", {
+ type: "submit",
+ className: "blue"
+ }, react__WEBPACK_IMPORTED_MODULE_0___default().createElement(react_intl__WEBPACK_IMPORTED_MODULE_1__.FormattedMessage, {
+ id: "button_update",
+ defaultMessage: "Update",
+ description: "Button [Update]"
+ }))));
+ }
+
+}
+;
+
+/***/ }),
+
+/***/ "./src/views/sidepanel-view.jsx":
+/*!**************************************!*\
+ !*** ./src/views/sidepanel-view.jsx ***!
+ \**************************************/
+/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
+
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "react");
+/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);
+/* harmony import */ var react_intl__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react-intl */ "react-intl");
+/* harmony import */ var react_intl__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react_intl__WEBPACK_IMPORTED_MODULE_1__);
+/* harmony import */ var _widgets_error_panel_jsx__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../widgets/error-panel.jsx */ "./src/widgets/error-panel.jsx");
+/* harmony import */ var _widgets_load_spinner_jsx__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../widgets/load-spinner.jsx */ "./src/widgets/load-spinner.jsx");
+/* harmony import */ var _widgets_side_navbar_jsx__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../widgets/side-navbar.jsx */ "./src/widgets/side-navbar.jsx");
+/* harmony import */ var _contacts_view_jsx__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./contacts-view.jsx */ "./src/views/contacts-view.jsx");
+/* harmony import */ var _create_account_view_jsx__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./create-account-view.jsx */ "./src/views/create-account-view.jsx");
+/* harmony import */ var _edit_account_view_jsx__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./edit-account-view.jsx */ "./src/views/edit-account-view.jsx");
+/* harmony import */ var _acc_general_view_jsx__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./acc-general-view.jsx */ "./src/views/acc-general-view.jsx");
+/* harmony import */ var _acc_notifications_view_jsx__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./acc-notifications-view.jsx */ "./src/views/acc-notifications-view.jsx");
+/* harmony import */ var _acc_security_view_jsx__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./acc-security-view.jsx */ "./src/views/acc-security-view.jsx");
+/* harmony import */ var _acc_support_view_jsx__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./acc-support-view.jsx */ "./src/views/acc-support-view.jsx");
+/* harmony import */ var _login_view_jsx__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./login-view.jsx */ "./src/views/login-view.jsx");
+/* harmony import */ var _new_topic_view_jsx__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./new-topic-view.jsx */ "./src/views/new-topic-view.jsx");
+/* harmony import */ var _password_reset_view_jsx__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ./password-reset-view.jsx */ "./src/views/password-reset-view.jsx");
+/* harmony import */ var _settings_view_jsx__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ./settings-view.jsx */ "./src/views/settings-view.jsx");
+/* harmony import */ var _validation_view_jsx__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ./validation-view.jsx */ "./src/views/validation-view.jsx");
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+const messages = (0,react_intl__WEBPACK_IMPORTED_MODULE_1__.defineMessages)({
+ 'login': {
+ id: 'sidepanel_title_login',
+ description: 'Sidepanel title for LoginView.',
+ defaultMessage: 'Sign In'
+ },
+ 'register': {
+ id: 'sidepanel_title_register',
+ description: 'Sidepanel title for CreateAccountView.',
+ defaultMessage: 'Create Account'
+ },
+ 'settings': {
+ id: 'sidepanel_title_settings',
+ description: 'Sidepanel title for SettingsView.',
+ defaultMessage: 'Settings'
+ },
+ 'edit': {
+ id: 'sidepanel_title_account_settings',
+ description: 'Sidepanel title for EditAccountView.',
+ defaultMessage: 'Account Settings'
+ },
+ 'general': {
+ id: 'sidepanel_title_acc_general',
+ description: 'Sidepanel title for AccGeneralView.',
+ defaultMessage: 'General'
+ },
+ 'security': {
+ id: 'sidepanel_title_acc_security',
+ description: 'Sidepanel title for AccSecurityView.',
+ defaultMessage: 'Security'
+ },
+ 'notif': {
+ id: 'sidepanel_title_acc_notifications',
+ description: 'Sidepanel title for AccNotificationsView.',
+ defaultMessage: 'Notifications'
+ },
+ 'support': {
+ id: 'sidepanel_title_acc_support',
+ description: 'Sidepanel title for AccSupportView.',
+ defaultMessage: 'Support'
+ },
+ 'newtpk': {
+ id: 'sidepanel_title_newtpk',
+ description: 'Sidepanel title for NewTopicView.',
+ defaultMessage: 'Start New Chat'
+ },
+ 'cred': {
+ id: 'sidepanel_title_cred',
+ description: 'Sidepanel title for ValidationView.',
+ defaultMessage: 'Confirm Credentials'
+ },
+ 'reset': {
+ id: 'sidepanel_title_reset',
+ description: 'Sidepanel title for PasswordResetView.',
+ defaultMessage: 'Reset Password'
+ },
+ 'archive': {
+ id: 'sidepanel_title_archive',
+ description: 'Sidepanel title for ContactsView-Archive.',
+ defaultMessage: 'Archived Chats'
+ },
+ 'blocked': {
+ id: 'sidepanel_title_blocked',
+ description: 'Sidepanel title for ContactsView-Blocked.',
+ defaultMessage: 'Blocked Chats'
+ }
+});
+
+class SidepanelView extends (react__WEBPACK_IMPORTED_MODULE_0___default().Component) {
+ constructor(props) {
+ super(props);
+ this.handleLoginRequested = this.handleLoginRequested.bind(this);
+ this.handleNewTopic = this.handleNewTopic.bind(this);
+ }
+
+ handleLoginRequested(login, password) {
+ this.props.onLoginRequest(login, password);
+ }
+
+ handleNewTopic() {
+ this.props.onBasicNavigate('newtpk');
+ }
+
+ render() {
+ const {
+ formatMessage
+ } = this.props.intl;
+ const view = this.props.state || (this.props.myUserId ? 'contacts' : 'login');
+ let title, avatar;
+
+ if (view == 'contacts') {
+ title = this.props.title;
+ avatar = this.props.avatar ? this.props.avatar : true;
+ } else {
+ title = formatMessage(messages[view]);
+ avatar = false;
+ }
+
+ let onCancel;
+
+ if (['login', 'contacts'].indexOf(view) == -1) {
+ onCancel = this.props.onCancel;
+ }
+
+ return react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
+ id: "sidepanel",
+ className: this.props.hideSelf ? 'nodisplay' : null
+ }, react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_widgets_side_navbar_jsx__WEBPACK_IMPORTED_MODULE_4__.default, {
+ state: view,
+ title: title,
+ avatar: avatar,
+ myUserId: this.props.myUserId,
+ onSignUp: this.props.onSignUp,
+ onSettings: this.props.onSettings,
+ onNewTopic: this.handleNewTopic,
+ onCancel: onCancel
+ }), react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_widgets_error_panel_jsx__WEBPACK_IMPORTED_MODULE_2__.default, {
+ level: this.props.errorLevel,
+ text: this.props.errorText,
+ action: this.props.errorAction,
+ actionText: this.props.errorActionText,
+ onClearError: this.props.onError
+ }), react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_widgets_load_spinner_jsx__WEBPACK_IMPORTED_MODULE_3__.default, {
+ show: this.props.loadSpinnerVisible
+ }), view === 'login' ? react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_login_view_jsx__WEBPACK_IMPORTED_MODULE_12__.default, {
+ login: this.props.login,
+ disabled: this.props.loginDisabled,
+ onLogin: this.handleLoginRequested
+ }) : view === 'register' ? react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_create_account_view_jsx__WEBPACK_IMPORTED_MODULE_6__.default, {
+ onCreateAccount: this.props.onCreateAccount,
+ onCancel: this.props.onCancel,
+ onError: this.props.onError
+ }) : view === 'settings' ? react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_settings_view_jsx__WEBPACK_IMPORTED_MODULE_15__.default, {
+ transport: this.props.transport,
+ serverAddress: this.props.serverAddress,
+ onCancel: this.props.onCancel,
+ onUpdate: this.props.onGlobalSettings
+ }) : view === 'edit' ? react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_edit_account_view_jsx__WEBPACK_IMPORTED_MODULE_7__.default, {
+ tinode: this.props.tinode,
+ myUserId: this.props.myUserId,
+ onBasicNavigate: this.props.onBasicNavigate
+ }) : view === 'general' ? react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_acc_general_view_jsx__WEBPACK_IMPORTED_MODULE_8__.default, {
+ tinode: this.props.tinode,
+ myUserId: this.props.myUserId,
+ onUpdateAccount: this.props.onUpdateAccount,
+ onUpdateTags: this.props.onUpdateAccountTags,
+ onCredAdd: this.props.onCredAdd,
+ onCredDelete: this.props.onCredDelete,
+ onCredConfirm: this.props.onCredConfirm,
+ onBasicNavigate: this.props.onBasicNavigate,
+ onError: this.props.onError
+ }) : view === 'notif' ? react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_acc_notifications_view_jsx__WEBPACK_IMPORTED_MODULE_9__.default, {
+ messageSounds: this.props.messageSounds,
+ desktopAlerts: this.props.desktopAlerts,
+ desktopAlertsEnabled: this.props.desktopAlertsEnabled,
+ incognitoMode: this.props.incognitoMode,
+ onTogglePushNotifications: this.props.onTogglePushNotifications,
+ onToggleMessageSounds: this.props.onToggleMessageSounds,
+ onToggleIncognitoMode: this.props.onToggleIncognitoMode
+ }) : view === 'security' ? react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_acc_security_view_jsx__WEBPACK_IMPORTED_MODULE_10__.default, {
+ tinode: this.props.tinode,
+ onUpdateAccount: this.props.onUpdateAccount,
+ onLogout: this.props.onLogout,
+ onDeleteAccount: this.props.onDeleteAccount,
+ onShowAlert: this.props.onShowAlert,
+ onShowBlocked: this.props.onShowBlocked
+ }) : view === 'support' ? react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_acc_support_view_jsx__WEBPACK_IMPORTED_MODULE_11__.default, {
+ serverAddress: this.props.serverAddress,
+ serverVersion: this.props.serverVersion
+ }) : view === 'contacts' || view == 'archive' || view == 'blocked' ? react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_contacts_view_jsx__WEBPACK_IMPORTED_MODULE_5__.default, {
+ tinode: this.props.tinode,
+ myUserId: this.props.myUserId,
+ connected: this.props.connected,
+ topicSelected: this.props.topicSelected,
+ archive: view == 'archive',
+ blocked: view == 'blocked',
+ chatList: this.props.chatList,
+ showContextMenu: this.props.showContextMenu,
+ onTopicSelected: this.props.onTopicSelected,
+ onShowArchive: this.props.onShowArchive
+ }) : view === 'newtpk' ? react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_new_topic_view_jsx__WEBPACK_IMPORTED_MODULE_13__.default, {
+ tinode: this.props.tinode,
+ searchResults: this.props.searchResults,
+ onInitFind: this.props.onInitFind,
+ onSearchContacts: this.props.onSearchContacts,
+ onCreateTopic: this.props.onCreateTopic,
+ onError: this.props.onError
+ }) : view === 'cred' ? react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_validation_view_jsx__WEBPACK_IMPORTED_MODULE_16__.default, {
+ credCode: this.props.credCode,
+ credMethod: this.props.credMethod,
+ onSubmit: this.props.onValidateCredentials,
+ onCancel: this.props.onCancel,
+ onError: this.props.onError
+ }) : view === 'reset' ? react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_password_reset_view_jsx__WEBPACK_IMPORTED_MODULE_14__.default, {
+ onRequest: this.props.onPasswordResetRequest,
+ onReset: this.props.onResetPassword
+ }) : null);
+ }
+
+}
+
+;
+/* harmony default export */ __webpack_exports__["default"] = ((0,react_intl__WEBPACK_IMPORTED_MODULE_1__.injectIntl)(SidepanelView));
+
+/***/ }),
+
+/***/ "./src/views/tinode-web.jsx":
+/*!**********************************!*\
+ !*** ./src/views/tinode-web.jsx ***!
+ \**********************************/
+/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
+
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "react");
+/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);
+/* harmony import */ var react_dom__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react-dom */ "react-dom");
+/* harmony import */ var react_dom__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react_dom__WEBPACK_IMPORTED_MODULE_1__);
+/* harmony import */ var react_intl__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! react-intl */ "react-intl");
+/* harmony import */ var react_intl__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(react_intl__WEBPACK_IMPORTED_MODULE_2__);
+/* harmony import */ var firebase_app__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! firebase/app */ "firebase/app");
+/* harmony import */ var firebase_app__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(firebase_app__WEBPACK_IMPORTED_MODULE_3__);
+/* harmony import */ var firebase_messaging__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! firebase/messaging */ "firebase/messaging");
+/* harmony import */ var firebase_messaging__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(firebase_messaging__WEBPACK_IMPORTED_MODULE_4__);
+/* harmony import */ var tinode_sdk__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! tinode-sdk */ "tinode-sdk");
+/* harmony import */ var tinode_sdk__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(tinode_sdk__WEBPACK_IMPORTED_MODULE_5__);
+/* harmony import */ var _widgets_alert_jsx__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../widgets/alert.jsx */ "./src/widgets/alert.jsx");
+/* harmony import */ var _widgets_context_menu_jsx__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../widgets/context-menu.jsx */ "./src/widgets/context-menu.jsx");
+/* harmony import */ var _info_view_jsx__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./info-view.jsx */ "./src/views/info-view.jsx");
+/* harmony import */ var _messages_view_jsx__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./messages-view.jsx */ "./src/views/messages-view.jsx");
+/* harmony import */ var _sidepanel_view_jsx__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./sidepanel-view.jsx */ "./src/views/sidepanel-view.jsx");
+/* harmony import */ var _config_js__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../config.js */ "./src/config.js");
+/* harmony import */ var _lib_blob_helpers_js__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ../lib/blob-helpers.js */ "./src/lib/blob-helpers.js");
+/* harmony import */ var _lib_host_name_js__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ../lib/host-name.js */ "./src/lib/host-name.js");
+/* harmony import */ var _lib_local_storage_js__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ../lib/local-storage.js */ "./src/lib/local-storage.js");
+/* harmony import */ var _lib_navigation_js__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ../lib/navigation.js */ "./src/lib/navigation.js");
+/* harmony import */ var _lib_strformat_js__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ../lib/strformat.js */ "./src/lib/strformat.js");
+/* harmony import */ var _lib_utils_js__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ../lib/utils.js */ "./src/lib/utils.js");
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+const POP_SOUND = new Audio('audio/msg.mp3');
+const messages = (0,react_intl__WEBPACK_IMPORTED_MODULE_2__.defineMessages)({
+ reconnect_countdown: {
+ id: 'reconnect_countdown',
+ defaultMessage: 'Disconnected. Reconnecting in {seconds}…',
+ description: 'Message shown when an app update is available.'
+ },
+ reconnect_now: {
+ id: 'reconnect_now',
+ defaultMessage: 'Try now',
+ description: 'Prompt for reconnecting now'
+ },
+ push_init_failed: {
+ id: 'push_init_failed',
+ defaultMessage: 'Failed to initialize push notifications',
+ description: 'Error message when push notifications have failed to initialize.'
+ },
+ invalid_security_token: {
+ id: 'invalid_security_token',
+ defaultMessage: 'Invalid security token',
+ description: 'Error message when resetting password.'
+ },
+ no_connection: {
+ id: 'no_connection',
+ defaultMessage: 'No connection',
+ description: 'Warning that the user is offline.'
+ },
+ code_doesnot_match: {
+ id: 'code_doesnot_match',
+ defaultMessage: 'Code does not match',
+ description: 'Error message when the credential validation code is incorrect.'
+ }
+});
+
+class TinodeWeb extends (react__WEBPACK_IMPORTED_MODULE_0___default().Component) {
+ constructor(props) {
+ super(props);
+ this.state = this.getBlankState();
+ this.handleResize = this.handleResize.bind(this);
+ this.handleHashRoute = this.handleHashRoute.bind(this);
+ this.handleOnline = this.handleOnline.bind(this);
+ this.checkForAppUpdate = this.checkForAppUpdate.bind(this);
+ this.handleVisibilityEvent = this.handleVisibilityEvent.bind(this);
+ this.handleError = this.handleError.bind(this);
+ this.handleLoginRequest = this.handleLoginRequest.bind(this);
+ this.handleConnected = this.handleConnected.bind(this);
+ this.handleAutoreconnectIteration = this.handleAutoreconnectIteration.bind(this);
+ this.doLogin = this.doLogin.bind(this);
+ this.handleCredentialsRequest = this.handleCredentialsRequest.bind(this);
+ this.handleLoginSuccessful = this.handleLoginSuccessful.bind(this);
+ this.handleDisconnect = this.handleDisconnect.bind(this);
+ this.tnMeMetaDesc = this.tnMeMetaDesc.bind(this);
+ this.tnMeContactUpdate = this.tnMeContactUpdate.bind(this);
+ this.tnMeSubsUpdated = this.tnMeSubsUpdated.bind(this);
+ this.resetContactList = this.resetContactList.bind(this);
+ this.tnData = this.tnData.bind(this);
+ this.tnInitFind = this.tnInitFind.bind(this);
+ this.tnFndSubsUpdated = this.tnFndSubsUpdated.bind(this);
+ this.handleSearchContacts = this.handleSearchContacts.bind(this);
+ this.handleTopicSelected = this.handleTopicSelected.bind(this);
+ this.handleHideMessagesView = this.handleHideMessagesView.bind(this);
+ this.handleSendMessage = this.handleSendMessage.bind(this);
+ this.handleNewChatInvitation = this.handleNewChatInvitation.bind(this);
+ this.handleNewAccount = this.handleNewAccount.bind(this);
+ this.handleNewAccountRequest = this.handleNewAccountRequest.bind(this);
+ this.handleUpdateAccountRequest = this.handleUpdateAccountRequest.bind(this);
+ this.handleUpdateAccountTagsRequest = this.handleUpdateAccountTagsRequest.bind(this);
+ this.handleToggleIncognitoMode = this.handleToggleIncognitoMode.bind(this);
+ this.handleSettings = this.handleSettings.bind(this);
+ this.handleGlobalSettings = this.handleGlobalSettings.bind(this);
+ this.handleShowArchive = this.handleShowArchive.bind(this);
+ this.handleShowBlocked = this.handleShowBlocked.bind(this);
+ this.handleToggleMessageSounds = this.handleToggleMessageSounds.bind(this);
+ this.handleCredAdd = this.handleCredAdd.bind(this);
+ this.handleCredDelete = this.handleCredDelete.bind(this);
+ this.handleCredConfirm = this.handleCredConfirm.bind(this);
+ this.initDesktopAlerts = this.initDesktopAlerts.bind(this);
+ this.togglePushToken = this.togglePushToken.bind(this);
+ this.requestPushToken = this.requestPushToken.bind(this);
+ this.handleSidepanelCancel = this.handleSidepanelCancel.bind(this);
+ this.handleStartTopicRequest = this.handleStartTopicRequest.bind(this);
+ this.handleNewTopicCreated = this.handleNewTopicCreated.bind(this);
+ this.handleTopicUpdateRequest = this.handleTopicUpdateRequest.bind(this);
+ this.handleChangePermissions = this.handleChangePermissions.bind(this);
+ this.handleTagsUpdated = this.handleTagsUpdated.bind(this);
+ this.handleLogout = this.handleLogout.bind(this);
+ this.handleDeleteAccount = this.handleDeleteAccount.bind(this);
+ this.handleDeleteMessagesRequest = this.handleDeleteMessagesRequest.bind(this);
+ this.handleLeaveUnsubRequest = this.handleLeaveUnsubRequest.bind(this);
+ this.handleBlockTopicRequest = this.handleBlockTopicRequest.bind(this);
+ this.handleReportTopic = this.handleReportTopic.bind(this);
+ this.handleShowContextMenu = this.handleShowContextMenu.bind(this);
+ this.defaultTopicContextMenu = this.defaultTopicContextMenu.bind(this);
+ this.handleHideContextMenu = this.handleHideContextMenu.bind(this);
+ this.handleShowAlert = this.handleShowAlert.bind(this);
+ this.handleShowInfoView = this.handleShowInfoView.bind(this);
+ this.handleHideInfoView = this.handleHideInfoView.bind(this);
+ this.handleMemberUpdateRequest = this.handleMemberUpdateRequest.bind(this);
+ this.handleValidateCredentialsRequest = this.handleValidateCredentialsRequest.bind(this);
+ this.handlePasswordResetRequest = this.handlePasswordResetRequest.bind(this);
+ this.handleResetPassword = this.handleResetPassword.bind(this);
+ this.handleContextMenuAction = this.handleContextMenuAction.bind(this);
+ }
+
+ getBlankState() {
+ const settings = _lib_local_storage_js__WEBPACK_IMPORTED_MODULE_14__.default.getObject('settings') || {};
+ return {
+ connected: false,
+ ready: false,
+ autoLogin: false,
+ transport: settings.transport || null,
+ serverAddress: settings.serverAddress || (0,_lib_host_name_js__WEBPACK_IMPORTED_MODULE_13__.detectServerAddress)(),
+ serverVersion: "no connection",
+ messageSounds: !settings.messageSoundsOff,
+ incognitoMode: false,
+ desktopAlerts: settings.desktopAlerts,
+ desktopAlertsEnabled: ((0,_lib_host_name_js__WEBPACK_IMPORTED_MODULE_13__.isSecureConnection)() || (0,_lib_host_name_js__WEBPACK_IMPORTED_MODULE_13__.isLocalHost)()) && typeof firebase_app__WEBPACK_IMPORTED_MODULE_3__ != 'undefined' && typeof navigator != 'undefined' && typeof FIREBASE_INIT != 'undefined',
+ firebaseToken: _lib_local_storage_js__WEBPACK_IMPORTED_MODULE_14__.default.getObject('firebase-token'),
+ applicationVisible: !document.hidden,
+ errorText: '',
+ errorLevel: null,
+ errorAction: undefined,
+ errorActionText: null,
+ sidePanelSelected: 'login',
+ sidePanelTitle: null,
+ sidePanelAvatar: null,
+ loadSpinnerVisible: false,
+ login: '',
+ password: '',
+ myUserId: null,
+ liveConnection: navigator.onLine,
+ topicSelected: '',
+ topicSelectedOnline: false,
+ topicSelectedAcs: null,
+ newTopicParams: null,
+ loginDisabled: false,
+ displayMobile: window.innerWidth <= _config_js__WEBPACK_IMPORTED_MODULE_11__.MEDIA_BREAKPOINT,
+ showInfoPanel: false,
+ mobilePanel: 'sidepanel',
+ contextMenuVisible: false,
+ contextMenuBounds: null,
+ contextMenuClickAt: null,
+ contextMenuParams: null,
+ contextMenuItems: [],
+ alertVisible: false,
+ alertParams: {},
+ chatList: [],
+ searchResults: [],
+ searchableContacts: [],
+ credMethod: undefined,
+ credCode: undefined
+ };
+ }
+
+ componentDidMount() {
+ window.addEventListener('resize', this.handleResize);
+ window.addEventListener('online', e => {
+ this.handleOnline(true);
+ });
+ window.addEventListener('offline', e => {
+ this.handleOnline(false);
+ });
+ window.addEventListener('hashchange', this.handleHashRoute);
+ document.addEventListener('visibilitychange', this.handleVisibilityEvent);
+ this.setState({
+ viewportWidth: document.documentElement.clientWidth,
+ viewportHeight: document.documentElement.clientHeight
+ });
+ const {
+ formatMessage,
+ locale
+ } = this.props.intl;
+ this.tinode = TinodeWeb.tnSetup(this.state.serverAddress, this.state.transport, locale);
+ this.tinode.onConnect = this.handleConnected;
+ this.tinode.onDisconnect = this.handleDisconnect;
+ this.tinode.onAutoreconnectIteration = this.handleAutoreconnectIteration;
+
+ if (this.state.desktopAlertsEnabled) {
+ try {
+ this.fbPush = firebase_app__WEBPACK_IMPORTED_MODULE_3__.initializeApp(FIREBASE_INIT, _config_js__WEBPACK_IMPORTED_MODULE_11__.APP_NAME).messaging();
+ this.fbPush.usePublicVapidKey(FIREBASE_INIT.messagingVapidKey);
+ navigator.serviceWorker.register('/service-worker.js').then(reg => {
+ this.checkForAppUpdate(reg);
+ this.fbPush.useServiceWorker(reg);
+ reg.active.postMessage(JSON.stringify({
+ locale: locale
+ }));
+ this.initDesktopAlerts();
+
+ if (this.state.desktopAlerts) {
+ if (!this.state.firebaseToken) {
+ this.togglePushToken(true);
+ } else {
+ this.tinode.setDeviceToken(this.state.firebaseToken, true);
+ }
+ }
+ }).catch(err => {
+ console.log("Failed to register service worker:", err);
+ });
+ } catch (err) {
+ this.handleError(formatMessage({
+ id: 'push_init_failed'
+ }), 'err');
+ console.log("Failed to initialize push notifications", err);
+ this.setState({
+ desktopAlertsEnabled: false
+ });
+ }
+ }
+
+ const token = _lib_local_storage_js__WEBPACK_IMPORTED_MODULE_14__.default.getObject('keep-logged-in') ? _lib_local_storage_js__WEBPACK_IMPORTED_MODULE_14__.default.getObject('auth-token') : undefined;
+ const parsedNav = _lib_navigation_js__WEBPACK_IMPORTED_MODULE_15__.default.parseUrlHash(window.location.hash);
+
+ if (token) {
+ this.setState({
+ autoLogin: true
+ });
+ token.expires = new Date(token.expires);
+ this.tinode.setAuthToken(token);
+ this.tinode.connect().catch(err => {
+ this.handleError(err.message, 'err');
+ });
+ delete parsedNav.params.info;
+ delete parsedNav.params.tab;
+ parsedNav.path[0] = '';
+ _lib_navigation_js__WEBPACK_IMPORTED_MODULE_15__.default.navigateTo(_lib_navigation_js__WEBPACK_IMPORTED_MODULE_15__.default.composeUrlHash(parsedNav.path, parsedNav.params));
+ } else if (!parsedNav.params.token) {
+ _lib_navigation_js__WEBPACK_IMPORTED_MODULE_15__.default.navigateTo('');
+ }
+
+ this.readTimer = null;
+ this.readTimerCallback = null;
+ this.handleHashRoute();
+ }
+
+ componentWillUnmount() {
+ window.removeEventListener('resize', this.handleResize);
+ window.removeEventListener('hashchange', this.handleHashRoute);
+ document.removeEventListener('visibilitychange', this.handleVisibilityEvent);
+ }
+
+ static tnSetup(serverAddress, transport, locale) {
+ const tinode = new (tinode_sdk__WEBPACK_IMPORTED_MODULE_5___default())(_config_js__WEBPACK_IMPORTED_MODULE_11__.APP_NAME, serverAddress, _config_js__WEBPACK_IMPORTED_MODULE_11__.API_KEY, transport, (0,_lib_host_name_js__WEBPACK_IMPORTED_MODULE_13__.isSecureConnection)());
+ tinode.setHumanLanguage(locale);
+ tinode.enableLogging(_config_js__WEBPACK_IMPORTED_MODULE_11__.LOGGING_ENABLED, true);
+ return tinode;
+ }
+
+ handleResize() {
+ const mobile = document.documentElement.clientWidth <= _config_js__WEBPACK_IMPORTED_MODULE_11__.MEDIA_BREAKPOINT;
+ this.setState({
+ viewportWidth: document.documentElement.clientWidth,
+ viewportHeight: document.documentElement.clientHeight
+ });
+
+ if (this.state.displayMobile != mobile) {
+ this.setState({
+ displayMobile: mobile
+ });
+ }
+ }
+
+ checkForAppUpdate(reg) {
+ reg.onupdatefound = () => {
+ const installingWorker = reg.installing;
+
+ installingWorker.onstatechange = () => {
+ if (installingWorker.state == 'installed' && navigator.serviceWorker.controller) {
+ const msg = react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null, react__WEBPACK_IMPORTED_MODULE_0___default().createElement(react_intl__WEBPACK_IMPORTED_MODULE_2__.FormattedMessage, {
+ id: "update_available",
+ defaultMessage: "Update available.",
+ description: "Message shown when an app update is available."
+ }), " ", react__WEBPACK_IMPORTED_MODULE_0___default().createElement("a", {
+ href: ""
+ }, react__WEBPACK_IMPORTED_MODULE_0___default().createElement(react_intl__WEBPACK_IMPORTED_MODULE_2__.FormattedMessage, {
+ id: "reload_update",
+ defaultMessage: "Reload",
+ description: "Call to action to reload application when update is available."
+ })), ".");
+ this.handleError(msg, 'info');
+ }
+ };
+ };
+ }
+
+ handleHashRoute() {
+ const hash = _lib_navigation_js__WEBPACK_IMPORTED_MODULE_15__.default.parseUrlHash(window.location.hash);
+
+ if (hash.path && hash.path.length > 0) {
+ if (['register', 'settings', 'edit', 'notif', 'security', 'support', 'general', 'cred', 'reset', 'newtpk', 'archive', 'blocked', 'contacts', ''].includes(hash.path[0])) {
+ this.setState({
+ sidePanelSelected: hash.path[0]
+ });
+ } else {
+ console.log("Unknown sidepanel view", hash.path[0]);
+ }
+
+ if (hash.path.length > 1 && hash.path[1] != this.state.topicSelected) {
+ this.setState({
+ topicSelected: tinode_sdk__WEBPACK_IMPORTED_MODULE_5___default().topicType(hash.path[1]) ? hash.path[1] : null
+ });
+ }
+ } else {
+ this.setState({
+ sidePanelSelected: ''
+ });
+ }
+
+ if (hash.params.method) {
+ this.setState({
+ credMethod: hash.params.method
+ });
+ }
+
+ if (hash.params.code) {
+ this.setState({
+ credCode: hash.params.code
+ });
+ }
+
+ this.setState({
+ showInfoPanel: hash.params.info,
+ newTopicTabSelected: hash.params.tab
+ });
+ }
+
+ handleOnline(online) {
+ if (online) {
+ this.handleError();
+ } else {
+ this.handleError(this.props.intl.formatMessage({
+ id: 'no_connection'
+ }), 'warn');
+ }
+
+ this.setState({
+ liveConnection: online
+ });
+ }
+
+ handleVisibilityEvent() {
+ this.setState({
+ applicationVisible: !document.hidden
+ });
+ }
+
+ handleError(err, level, action, actionText) {
+ this.setState({
+ errorText: err,
+ errorLevel: level,
+ errorAction: action,
+ errorActionText: actionText
+ });
+ }
+
+ handleLoginRequest(login, password) {
+ this.setState({
+ loginDisabled: true,
+ login: login,
+ password: password,
+ loadSpinnerVisible: true,
+ autoLogin: true
+ });
+ this.handleError('', null);
+
+ if (this.tinode.isConnected()) {
+ this.doLogin(login, password, {
+ meth: this.state.credMethod,
+ resp: this.state.credCode
+ });
+ } else {
+ this.tinode.connect().catch(err => {
+ this.setState({
+ loginDisabled: false,
+ autoLogin: false,
+ loadSpinnerVisible: false
+ });
+ this.handleError(err.message, 'err');
+ });
+ }
+ }
+
+ handleConnected() {
+ const params = this.tinode.getServerInfo();
+ this.setState({
+ serverVersion: params.ver + ' ' + (params.build ? params.build : 'none')
+ });
+
+ if (this.state.autoLogin) {
+ this.doLogin(this.state.login, this.state.password, {
+ meth: this.state.credMethod,
+ resp: this.state.credCode
+ });
+ }
+ }
+
+ handleAutoreconnectIteration(sec, prom) {
+ clearInterval(this.reconnectCountdown);
+
+ if (sec < 0) {
+ this.handleError();
+ return;
+ }
+
+ if (prom) {
+ prom.then(() => {
+ this.handleError();
+ }).catch(err => {
+ this.handleError(err.message, 'err');
+ });
+ return;
+ }
+
+ const {
+ formatMessage
+ } = this.props.intl;
+ let count = sec / 1000;
+ count = count | count;
+ this.reconnectCountdown = setInterval(() => {
+ const timeLeft = count > 99 ? (0,_lib_strformat_js__WEBPACK_IMPORTED_MODULE_16__.secondsToTime)(count) : count;
+ this.handleError(formatMessage(messages.reconnect_countdown, {
+ seconds: timeLeft
+ }), 'warn', () => {
+ clearInterval(this.reconnectCountdown);
+ this.tinode.reconnect();
+ }, formatMessage(messages.reconnect_now));
+ count -= 1;
+ }, 1000);
+ }
+
+ handleDisconnect(err) {
+ this.setState({
+ connected: false,
+ ready: false,
+ topicSelectedOnline: false,
+ errorText: err && err.message ? err.message : "Disconnected",
+ errorLevel: err && err.message ? 'err' : 'warn',
+ loginDisabled: false,
+ contextMenuVisible: false,
+ serverVersion: "no connection"
+ });
+ }
+
+ doLogin(login, password, cred) {
+ if (this.tinode.isAuthenticated()) {
+ _lib_navigation_js__WEBPACK_IMPORTED_MODULE_15__.default.navigateTo('');
+ return;
+ }
+
+ cred = tinode_sdk__WEBPACK_IMPORTED_MODULE_5___default().credential(cred);
+ let promise = null;
+ const token = this.tinode.getAuthToken();
+
+ if (login && password) {
+ this.setState({
+ password: null
+ });
+ promise = this.tinode.loginBasic(login, password, cred);
+ } else if (token) {
+ promise = this.tinode.loginToken(token.token, cred);
+ }
+
+ if (promise) {
+ promise.then(ctrl => {
+ if (ctrl.code >= 300 && ctrl.text === 'validate credentials') {
+ this.setState({
+ loadSpinnerVisible: false
+ });
+
+ if (cred) {
+ this.handleError(this.props.intl.formatMessage({
+ id: 'code_doesnot_match'
+ }), 'warn');
+ }
+
+ this.handleCredentialsRequest(ctrl.params);
+ } else {
+ this.handleLoginSuccessful();
+ }
+ }).catch(err => {
+ this.setState({
+ loginDisabled: false,
+ credMethod: undefined,
+ credCode: undefined,
+ loadSpinnerVisible: false,
+ autoLogin: false
+ });
+ this.handleError(err.message, 'err');
+ localStorage.removeItem('auth-token');
+ _lib_navigation_js__WEBPACK_IMPORTED_MODULE_15__.default.navigateTo('');
+ });
+ } else {
+ _lib_navigation_js__WEBPACK_IMPORTED_MODULE_15__.default.navigateTo('');
+ this.setState({
+ loginDisabled: false
+ });
+ }
+ }
+
+ handleCredentialsRequest(params) {
+ const parsed = _lib_navigation_js__WEBPACK_IMPORTED_MODULE_15__.default.parseUrlHash(window.location.hash);
+ parsed.path[0] = 'cred';
+ parsed.params['method'] = params.cred[0];
+ _lib_navigation_js__WEBPACK_IMPORTED_MODULE_15__.default.navigateTo(_lib_navigation_js__WEBPACK_IMPORTED_MODULE_15__.default.composeUrlHash(parsed.path, parsed.params));
+ }
+
+ handleLoginSuccessful() {
+ this.handleError();
+
+ if (_lib_local_storage_js__WEBPACK_IMPORTED_MODULE_14__.default.getObject('keep-logged-in')) {
+ _lib_local_storage_js__WEBPACK_IMPORTED_MODULE_14__.default.setObject('auth-token', this.tinode.getAuthToken());
+ }
+
+ const me = this.tinode.getMeTopic();
+ me.onMetaDesc = this.tnMeMetaDesc;
+ me.onContactUpdate = this.tnMeContactUpdate;
+ me.onSubsUpdated = this.tnMeSubsUpdated;
+ this.setState({
+ connected: true,
+ credMethod: undefined,
+ credCode: undefined,
+ myUserId: this.tinode.getCurrentUserID(),
+ autoLogin: true
+ });
+ me.subscribe(me.startMetaQuery().withLaterSub().withDesc().withTags().withCred().build()).catch(err => {
+ this.tinode.disconnect();
+ localStorage.removeItem('auth-token');
+ this.handleError(err.message, 'err');
+ _lib_navigation_js__WEBPACK_IMPORTED_MODULE_15__.default.navigateTo('');
+ }).finally(() => {
+ this.setState({
+ loadSpinnerVisible: false
+ });
+ });
+ _lib_navigation_js__WEBPACK_IMPORTED_MODULE_15__.default.navigateTo(_lib_navigation_js__WEBPACK_IMPORTED_MODULE_15__.default.setUrlSidePanel(window.location.hash, 'contacts'));
+ }
+
+ tnMeMetaDesc(desc) {
+ if (desc) {
+ if (desc.public) {
+ this.setState({
+ sidePanelTitle: desc.public.fn,
+ sidePanelAvatar: (0,_lib_blob_helpers_js__WEBPACK_IMPORTED_MODULE_12__.makeImageUrl)(desc.public.photo)
+ });
+ }
+
+ if (desc.acs) {
+ this.setState({
+ incognitoMode: !desc.acs.isPresencer()
+ });
+ }
+ }
+ }
+
+ tnMeContactUpdate(what, cont) {
+ if (what == 'on' || what == 'off') {
+ this.resetContactList();
+
+ if (this.state.topicSelected == cont.topic) {
+ this.setState({
+ topicSelectedOnline: what == 'on'
+ });
+ }
+ } else if (what == 'read') {
+ this.resetContactList();
+ } else if (what == 'msg') {
+ const topic = this.tinode.getTopic(cont.topic);
+ const archived = topic && topic.isArchived();
+
+ if (cont.unread > 0 && this.state.messageSounds && !archived) {
+ if (document.hidden || this.state.topicSelected != cont.topic) {
+ POP_SOUND.play();
+ }
+ }
+
+ this.resetContactList();
+ } else if (what == 'recv') {} else if (what == 'gone' || what == 'unsub') {
+ if (this.state.topicSelected == cont.topic) {
+ this.handleTopicSelected(null);
+ }
+
+ this.resetContactList();
+ } else if (what == 'acs') {
+ if (this.state.topicSelected == cont.topic) {
+ this.setState({
+ topicSelectedAcs: cont.acs
+ });
+ }
+ } else if (what == 'del') {} else if (what == 'upd') {} else {
+ console.log("Unsupported (yet) presence update:" + what + " in: " + cont.topic);
+ }
+ }
+
+ tnMeSubsUpdated(unused) {
+ this.resetContactList();
+ }
+
+ static prepareSearchableContacts(chatList, foundContacts) {
+ const merged = {};
+
+ for (const c of chatList) {
+ if (tinode_sdk__WEBPACK_IMPORTED_MODULE_5___default().isP2PTopicName(c.topic)) {
+ merged[c.topic] = {
+ user: c.topic,
+ updated: c.updated,
+ public: c.public,
+ private: c.private,
+ acs: c.acs
+ };
+ }
+ }
+
+ for (const c of foundContacts) {
+ if (!merged[c.user]) {
+ merged[c.user] = c;
+ }
+ }
+
+ return Object.values(merged);
+ }
+
+ resetContactList() {
+ const newState = {
+ chatList: []
+ };
+
+ if (!this.state.ready) {
+ newState.ready = true;
+ }
+
+ this.tinode.getMeTopic().contacts(c => {
+ newState.chatList.push(c);
+
+ if (this.state.topicSelected == c.topic) {
+ newState.topicSelectedOnline = c.online;
+ newState.topicSelectedAcs = c.acs;
+ }
+ });
+ newState.searchableContacts = TinodeWeb.prepareSearchableContacts(newState.chatList, this.state.searchResults);
+ this.setState(newState);
+ }
+
+ tnData(data) {
+ const topic = this.tinode.getTopic(data.topic);
+
+ if (topic.msgStatus(data) >= (tinode_sdk__WEBPACK_IMPORTED_MODULE_5___default().MESSAGE_STATUS_SENT) && data.from != this.state.myUserId) {
+ clearTimeout(this.receivedTimer);
+ this.receivedTimer = setTimeout(() => {
+ this.receivedTimer = undefined;
+ topic.noteRecv(data.seq);
+ }, _config_js__WEBPACK_IMPORTED_MODULE_11__.RECEIVED_DELAY);
+ }
+ }
+
+ tnInitFind() {
+ const fnd = this.tinode.getFndTopic();
+ fnd.onSubsUpdated = this.tnFndSubsUpdated;
+
+ if (fnd.isSubscribed()) {
+ this.tnFndSubsUpdated();
+ } else {
+ fnd.subscribe(fnd.startMetaQuery().withSub().build()).catch(err => {
+ this.handleError(err.message, 'err');
+ });
+ }
+ }
+
+ tnFndSubsUpdated() {
+ const foundContacts = [];
+ this.tinode.getFndTopic().contacts(s => {
+ foundContacts.push(s);
+ });
+ this.setState({
+ searchResults: foundContacts,
+ searchableContacts: TinodeWeb.prepareSearchableContacts(this.state.chatList, foundContacts)
+ });
+ }
+
+ handleSearchContacts(query) {
+ const fnd = this.tinode.getFndTopic();
+ fnd.setMeta({
+ desc: {
+ public: query
+ }
+ }).then(ctrl => {
+ return fnd.getMeta(fnd.startMetaQuery().withSub().build());
+ }).catch(err => {
+ this.handleError(err.message, 'err');
+ });
+ }
+
+ handleTopicSelected(topicName) {
+ if (this.state.newTopicParams && this.state.newTopicParams._topicName != topicName) {
+ this.setState({
+ newTopicParams: null
+ });
+ }
+
+ if (topicName) {
+ this.setState({
+ errorText: '',
+ errorLevel: null,
+ mobilePanel: 'topic-view',
+ showInfoPanel: false
+ });
+
+ if (this.state.topicSelected != topicName) {
+ this.setState({
+ topicSelectedOnline: this.tinode.isTopicOnline(topicName),
+ topicSelectedAcs: this.tinode.getTopicAccessMode(topicName)
+ });
+ _lib_navigation_js__WEBPACK_IMPORTED_MODULE_15__.default.navigateTo(_lib_navigation_js__WEBPACK_IMPORTED_MODULE_15__.default.setUrlTopic('', topicName));
+ }
+ } else {
+ this.setState({
+ errorText: '',
+ errorLevel: null,
+ mobilePanel: 'sidepanel',
+ topicSelectedOnline: false,
+ topicSelectedAcs: null,
+ showInfoPanel: false
+ });
+ _lib_navigation_js__WEBPACK_IMPORTED_MODULE_15__.default.navigateTo(_lib_navigation_js__WEBPACK_IMPORTED_MODULE_15__.default.setUrlTopic('', null));
+ }
+ }
+
+ handleHideMessagesView() {
+ this.setState({
+ mobilePanel: 'sidepanel'
+ });
+ _lib_navigation_js__WEBPACK_IMPORTED_MODULE_15__.default.navigateTo(_lib_navigation_js__WEBPACK_IMPORTED_MODULE_15__.default.setUrlTopic(window.location.hash, null));
+ }
+
+ handleSendMessage(msg, promise, uploader) {
+ const topic = this.tinode.getTopic(this.state.topicSelected);
+ msg = topic.createMessage(msg, false);
+ msg._uploader = uploader;
+
+ if (!topic.isSubscribed()) {
+ if (!promise) {
+ promise = Promise.resolve();
+ }
+
+ promise = promise.then(() => {
+ return topic.subscribe();
+ });
+ }
+
+ if (promise) {
+ promise = promise.catch(err => {
+ this.handleError(err.message, 'err');
+ });
+ }
+
+ topic.publishDraft(msg, promise).then(ctrl => {
+ if (topic.isArchived()) {
+ return topic.archive(false);
+ }
+ }).catch(err => {
+ this.handleError(err.message, 'err');
+ });
+ }
+
+ handleNewChatInvitation(topicName, action) {
+ const topic = this.tinode.getTopic(topicName);
+ let response = null;
+
+ switch (action) {
+ case 'accept':
+ const mode = topic.getAccessMode().getGiven();
+ response = topic.setMeta({
+ sub: {
+ mode: mode
+ }
+ });
+
+ if (topic.isP2P()) {
+ response = response.then(ctrl => {
+ topic.setMeta({
+ sub: {
+ user: topicName,
+ mode: mode
+ }
+ });
+ });
+ }
+
+ break;
+
+ case 'delete':
+ response = topic.delTopic(true);
+ break;
+
+ case 'block':
+ const am = topic.getAccessMode().updateWant('-JP').getWant();
+ response = topic.setMeta({
+ sub: {
+ mode: am
+ }
+ }).then(ctrl => {
+ return this.handleTopicSelected(null);
+ });
+ break;
+
+ default:
+ console.log("Unknown invitation action", '"' + action + '""');
+ }
+
+ if (response != null) {
+ response.catch(err => {
+ this.handleError(err.message, 'err');
+ });
+ }
+ }
+
+ handleNewAccount() {
+ this.handleError();
+ _lib_navigation_js__WEBPACK_IMPORTED_MODULE_15__.default.navigateTo(_lib_navigation_js__WEBPACK_IMPORTED_MODULE_15__.default.setUrlSidePanel(window.location.hash, 'register'));
+ }
+
+ handleNewAccountRequest(login_, password_, public_, cred_, tags_) {
+ this.handleError();
+ this.tinode.connect(this.state.serverAddress).then(() => {
+ return this.tinode.createAccountBasic(login_, password_, {
+ public: public_,
+ tags: tags_,
+ cred: tinode_sdk__WEBPACK_IMPORTED_MODULE_5___default().credential(cred_)
+ });
+ }).then(ctrl => {
+ if (ctrl.code >= 300 && ctrl.text == 'validate credentials') {
+ this.handleCredentialsRequest(ctrl.params);
+ } else {
+ this.handleLoginSuccessful(this);
+ }
+ }).catch(err => {
+ this.handleError(err.message, 'err');
+ });
+ }
+
+ handleUpdateAccountRequest(password, pub, defacs) {
+ this.handleError();
+
+ if (pub || defacs) {
+ const params = {};
+
+ if (pub) {
+ params.public = pub;
+ }
+
+ if (defacs) {
+ params.defacs = defacs;
+ }
+
+ this.tinode.getMeTopic().setMeta({
+ desc: params
+ }).catch(err => {
+ this.handleError(err.message, 'err');
+ });
+ }
+
+ if (password) {
+ this.tinode.updateAccountBasic(null, this.tinode.getCurrentLogin(), password).catch(err => {
+ this.handleError(err.message, 'err');
+ });
+ }
+ }
+
+ handleToggleIncognitoMode(on) {
+ const me = this.tinode.getMeTopic();
+ const am = me.getAccessMode().updateWant(on ? '-P' : '+P').getWant();
+ me.setMeta({
+ sub: {
+ mode: am
+ }
+ }).catch(err => {
+ this.handleError(err.message, 'err');
+ });
+ }
+
+ handleUpdateAccountTagsRequest(tags) {
+ this.tinode.getMeTopic().setMeta({
+ tags: tags
+ }).catch(err => {
+ this.handleError(err.message, 'err');
+ });
+ }
+
+ handleSettings() {
+ this.handleError();
+ _lib_navigation_js__WEBPACK_IMPORTED_MODULE_15__.default.navigateTo(_lib_navigation_js__WEBPACK_IMPORTED_MODULE_15__.default.setUrlSidePanel(window.location.hash, this.state.myUserId ? 'edit' : 'settings'));
+ }
+
+ handleGlobalSettings(settings) {
+ const serverAddress = settings.serverAddress || this.state.serverAddress;
+ const transport = settings.transport || this.state.transport;
+
+ if (this.tinode) {
+ this.tinode.onDisconnect = undefined;
+ this.tinode.disconnect();
+ }
+
+ this.tinode = TinodeWeb.tnSetup(serverAddress, transport, this.props.intl.locale);
+ this.tinode.onConnect = this.handleConnected;
+ this.tinode.onDisconnect = this.handleDisconnect;
+ this.setState({
+ serverAddress: serverAddress,
+ transport: transport
+ });
+ _lib_local_storage_js__WEBPACK_IMPORTED_MODULE_14__.default.setObject('settings', {
+ serverAddress: serverAddress,
+ transport: transport
+ });
+ _lib_navigation_js__WEBPACK_IMPORTED_MODULE_15__.default.navigateTo(_lib_navigation_js__WEBPACK_IMPORTED_MODULE_15__.default.setUrlSidePanel(window.location.hash, ''));
+ }
+
+ handleShowArchive() {
+ _lib_navigation_js__WEBPACK_IMPORTED_MODULE_15__.default.navigateTo(_lib_navigation_js__WEBPACK_IMPORTED_MODULE_15__.default.setUrlSidePanel(window.location.hash, this.state.myUserId ? 'archive' : ''));
+ }
+
+ handleShowBlocked() {
+ _lib_navigation_js__WEBPACK_IMPORTED_MODULE_15__.default.navigateTo(_lib_navigation_js__WEBPACK_IMPORTED_MODULE_15__.default.setUrlSidePanel(window.location.hash, this.state.myUserId ? 'blocked' : ''));
+ }
+
+ initDesktopAlerts() {
+ this.fbPush.onTokenRefresh(() => {
+ this.requestPushToken();
+ });
+ this.fbPush.onMessage(payload => {});
+ }
+
+ togglePushToken(enabled) {
+ if (enabled) {
+ if (!this.state.firebaseToken) {
+ this.fbPush.requestPermission().then(() => {
+ this.requestPushToken();
+ }).catch(err => {
+ this.handleError(err.message, 'err');
+ this.setState({
+ desktopAlerts: false,
+ firebaseToken: null
+ });
+ _lib_local_storage_js__WEBPACK_IMPORTED_MODULE_14__.default.updateObject('settings', {
+ desktopAlerts: false
+ });
+ console.log("Failed to get permission to notify.", err);
+ });
+ } else {
+ this.setState({
+ desktopAlerts: true
+ });
+ _lib_local_storage_js__WEBPACK_IMPORTED_MODULE_14__.default.updateObject('settings', {
+ desktopAlerts: true
+ });
+ }
+ } else if (this.state.firebaseToken) {
+ this.fbPush.deleteToken(this.state.firebaseToken).catch(err => {
+ console.log("Unable to delete token.", err);
+ }).finally(() => {
+ _lib_local_storage_js__WEBPACK_IMPORTED_MODULE_14__.default.updateObject('settings', {
+ desktopAlerts: false
+ });
+ localStorage.removeItem('firebase-token');
+ this.setState({
+ desktopAlerts: false,
+ firebaseToken: null
+ });
+ });
+ } else {
+ this.setState({
+ desktopAlerts: false,
+ firebaseToken: null
+ });
+ _lib_local_storage_js__WEBPACK_IMPORTED_MODULE_14__.default.updateObject('settings', {
+ desktopAlerts: false
+ });
+ }
+ }
+
+ requestPushToken() {
+ this.fbPush.getToken().then(refreshedToken => {
+ if (refreshedToken != this.state.firebaseToken) {
+ this.tinode.setDeviceToken(refreshedToken, true);
+ _lib_local_storage_js__WEBPACK_IMPORTED_MODULE_14__.default.setObject('firebase-token', refreshedToken);
+ }
+
+ this.setState({
+ firebaseToken: refreshedToken,
+ desktopAlerts: true
+ });
+ _lib_local_storage_js__WEBPACK_IMPORTED_MODULE_14__.default.updateObject('settings', {
+ desktopAlerts: true
+ });
+ }).catch(err => {
+ this.handleError(err.message, 'err');
+ console.log("Failed to retrieve firebase token", err);
+ });
+ }
+
+ handleToggleMessageSounds(enabled) {
+ this.setState({
+ messageSounds: enabled
+ });
+ _lib_local_storage_js__WEBPACK_IMPORTED_MODULE_14__.default.updateObject('settings', {
+ messageSoundsOff: !enabled
+ });
+ }
+
+ handleCredAdd(method, value) {
+ const me = this.tinode.getMeTopic();
+ me.setMeta({
+ cred: {
+ meth: method,
+ val: value
+ }
+ }).catch(err => {
+ this.handleError(err.message, 'err');
+ });
+ }
+
+ handleCredDelete(method, value) {
+ const me = this.tinode.getMeTopic();
+ me.delCredential(method, value).catch(err => {
+ this.handleError(err.message, 'err');
+ });
+ }
+
+ handleCredConfirm(method, response) {
+ this.handleCredentialsRequest({
+ cred: [method]
+ });
+ }
+
+ handleSidepanelCancel() {
+ const parsed = _lib_navigation_js__WEBPACK_IMPORTED_MODULE_15__.default.parseUrlHash(window.location.hash);
+ let path = '';
+
+ if (['security', 'support', 'general', 'notif'].includes(parsed.path[0])) {
+ path = 'edit';
+ } else if ('blocked' == parsed.path[0]) {
+ path = 'security';
+ } else if (this.state.myUserId) {
+ path = 'contacts';
+ }
+
+ parsed.path[0] = path;
+
+ if (parsed.params) {
+ delete parsed.params.code;
+ delete parsed.params.method;
+ delete parsed.params.tab;
+ }
+
+ _lib_navigation_js__WEBPACK_IMPORTED_MODULE_15__.default.navigateTo(_lib_navigation_js__WEBPACK_IMPORTED_MODULE_15__.default.composeUrlHash(parsed.path, parsed.params));
+ this.setState({
+ errorText: '',
+ errorLevel: null
+ });
+ }
+
+ basicNavigator(hash) {
+ _lib_navigation_js__WEBPACK_IMPORTED_MODULE_15__.default.navigateTo(_lib_navigation_js__WEBPACK_IMPORTED_MODULE_15__.default.setUrlSidePanel(window.location.hash, hash));
+ }
+
+ handleStartTopicRequest(topicName, pub, priv, tags, isChannel) {
+ if (topicName && this.tinode.isTopicCached(topicName)) {
+ this.handleTopicSelected(topicName);
+ return;
+ }
+
+ const params = {};
+
+ if (tinode_sdk__WEBPACK_IMPORTED_MODULE_5___default().isP2PTopicName(topicName)) {
+ params.sub = {
+ mode: _config_js__WEBPACK_IMPORTED_MODULE_11__.DEFAULT_P2P_ACCESS_MODE
+ };
+ params.desc = {
+ defacs: {
+ auth: _config_js__WEBPACK_IMPORTED_MODULE_11__.DEFAULT_P2P_ACCESS_MODE
+ }
+ };
+ } else {
+ topicName = topicName || this.tinode.newGroupTopicName(isChannel);
+ params.desc = {
+ public: pub,
+ private: {
+ comment: priv
+ }
+ };
+ params.tags = tags;
+ }
+
+ params._topicName = topicName;
+ this.setState({
+ newTopicParams: params
+ }, () => {
+ this.handleTopicSelected(topicName);
+ });
+ }
+
+ handleNewTopicCreated(oldName, newName) {
+ if (this.state.topicSelected == oldName && oldName != newName) {
+ this.setState({
+ topicSelected: newName
+ }, () => {
+ _lib_navigation_js__WEBPACK_IMPORTED_MODULE_15__.default.navigateTo(_lib_navigation_js__WEBPACK_IMPORTED_MODULE_15__.default.setUrlTopic('', newName));
+ });
+ }
+ }
+
+ handleTopicUpdateRequest(topicName, pub, priv, permissions) {
+ const topic = this.tinode.getTopic(topicName);
+
+ if (topic) {
+ const params = {};
+
+ if (pub) {
+ params.public = pub;
+ }
+
+ if (priv) {
+ params.private = priv === (tinode_sdk__WEBPACK_IMPORTED_MODULE_5___default().DEL_CHAR) ? (tinode_sdk__WEBPACK_IMPORTED_MODULE_5___default().DEL_CHAR) : {
+ comment: priv
+ };
+ }
+
+ if (permissions) {
+ params.defacs = permissions;
+ }
+
+ topic.setMeta({
+ desc: params
+ }).catch(err => {
+ this.handleError(err.message, 'err');
+ });
+ }
+ }
+
+ handleChangePermissions(topicName, mode, uid) {
+ const topic = this.tinode.getTopic(topicName);
+
+ if (topic) {
+ const am = topic.getAccessMode();
+
+ if (uid) {
+ am.updateGiven(mode);
+ mode = am.getGiven();
+ } else {
+ am.updateWant(mode);
+ mode = am.getWant();
+ }
+
+ topic.setMeta({
+ sub: {
+ user: uid,
+ mode: mode
+ }
+ }).catch(err => {
+ this.handleError(err.message, 'err');
+ });
+ }
+ }
+
+ handleTagsUpdated(topicName, tags) {
+ const topic = this.tinode.getTopic(topicName);
+
+ if (topic) {
+ topic.setMeta({
+ tags: tags
+ }).catch(err => {
+ this.handleError(err.message, 'err');
+ });
+ }
+ }
+
+ handleLogout() {
+ (0,_lib_utils_js__WEBPACK_IMPORTED_MODULE_17__.updateFavicon)(0);
+ localStorage.removeItem('auth-token');
+ localStorage.removeItem('firebase-token');
+ localStorage.removeItem('settings');
+
+ if (this.state.firebaseToken) {
+ this.fbPush.deleteToken(this.state.firebaseToken);
+ }
+
+ if (this.tinode) {
+ this.tinode.onDisconnect = undefined;
+ this.tinode.disconnect();
+ }
+
+ this.setState(this.getBlankState());
+ this.tinode = TinodeWeb.tnSetup(this.state.serverAddress, this.state.transport, this.props.intl.locale);
+ this.tinode.onConnect = this.handleConnected;
+ this.tinode.onDisconnect = this.handleDisconnect;
+ _lib_navigation_js__WEBPACK_IMPORTED_MODULE_15__.default.navigateTo('');
+ }
+
+ handleDeleteAccount() {
+ this.tinode.delCurrentUser(true).then(ctrl => {
+ this.handleLogout();
+ });
+ }
+
+ handleDeleteMessagesRequest(topicName) {
+ const topic = this.tinode.getTopic(topicName);
+
+ if (!topic) {
+ return;
+ }
+
+ topic.delMessagesAll(true).catch(err => {
+ this.handleError(err.message, 'err');
+ });
+ }
+
+ handleLeaveUnsubRequest(topicName) {
+ const topic = this.tinode.getTopic(topicName);
+
+ if (!topic) {
+ return;
+ }
+
+ topic.leave(true).then(ctrl => {
+ _lib_navigation_js__WEBPACK_IMPORTED_MODULE_15__.default.navigateTo(_lib_navigation_js__WEBPACK_IMPORTED_MODULE_15__.default.setUrlTopic(window.location.hash, ''));
+ }).catch(err => {
+ this.handleError(err.message, 'err');
+ });
+ }
+
+ handleBlockTopicRequest(topicName) {
+ const topic = this.tinode.getTopic(topicName);
+
+ if (!topic) {
+ return;
+ }
+
+ topic.updateMode(null, '-JP').then(ctrl => {
+ _lib_navigation_js__WEBPACK_IMPORTED_MODULE_15__.default.navigateTo(_lib_navigation_js__WEBPACK_IMPORTED_MODULE_15__.default.setUrlTopic(window.location.hash, ''));
+ }).catch(err => {
+ this.handleError(err.message, 'err');
+ });
+ }
+
+ handleReportTopic(topicName) {
+ const topic = this.tinode.getTopic(topicName);
+
+ if (!topic) {
+ return;
+ }
+
+ this.tinode.publish((tinode_sdk__WEBPACK_IMPORTED_MODULE_5___default().TOPIC_SYS), tinode_sdk__WEBPACK_IMPORTED_MODULE_5___default().Drafty.attachJSON(null, {
+ 'action': 'report',
+ 'target': topicName
+ }));
+ topic.updateMode(null, '-JP').then(ctrl => {
+ _lib_navigation_js__WEBPACK_IMPORTED_MODULE_15__.default.navigateTo(_lib_navigation_js__WEBPACK_IMPORTED_MODULE_15__.default.setUrlTopic(window.location.hash, ''));
+ }).catch(err => {
+ this.handleError(err.message, 'err');
+ });
+ }
+
+ handleShowContextMenu(params, menuItems) {
+ this.setState({
+ contextMenuVisible: true,
+ contextMenuClickAt: {
+ x: params.x,
+ y: params.y
+ },
+ contextMenuParams: params,
+ contextMenuItems: menuItems || this.defaultTopicContextMenu(params.topicName),
+ contextMenuBounds: react_dom__WEBPACK_IMPORTED_MODULE_1___default().findDOMNode(this).getBoundingClientRect()
+ });
+ }
+
+ defaultTopicContextMenu(topicName) {
+ const topic = this.tinode.getTopic(topicName);
+ let muted = false,
+ blocked = false,
+ self_blocked = false,
+ subscribed = false,
+ deleter = false,
+ archived = false;
+
+ if (topic) {
+ subscribed = topic.isSubscribed();
+ archived = topic.isArchived();
+ const acs = topic.getAccessMode();
+
+ if (acs) {
+ muted = acs.isMuted();
+ blocked = !acs.isJoiner();
+ self_blocked = !acs.isJoiner('want');
+ deleter = acs.isDeleter();
+ }
+ }
+
+ return [subscribed ? {
+ title: this.props.intl.formatMessage({
+ id: 'menu_item_info'
+ }),
+ handler: this.handleShowInfoView
+ } : null, subscribed ? 'messages_clear' : null, subscribed && deleter ? 'messages_clear_hard' : null, muted ? blocked ? null : 'topic_unmute' : 'topic_mute', self_blocked ? 'topic_unblock' : 'topic_block', !archived ? 'topic_archive' : null, 'topic_delete'];
+ }
+
+ handleHideContextMenu() {
+ this.setState({
+ contextMenuVisible: false,
+ contextMenuClickAt: null,
+ contextMenuParams: null,
+ contextMenuBounds: null
+ });
+ }
+
+ handleContextMenuAction(action, promise, params) {
+ if (action == 'topic_archive') {
+ if (promise && params.topicName && params.topicName == this.state.topicSelected) {
+ promise.then(() => {
+ this.handleTopicSelected(null);
+ });
+ }
+ }
+ }
+
+ handleShowAlert(title, content, onConfirm, confirmText, onReject, rejectText) {
+ this.setState({
+ alertVisible: true,
+ alertParams: {
+ title: title,
+ content: content,
+ onConfirm: onConfirm,
+ confirm: confirmText,
+ onReject: onReject,
+ reject: rejectText
+ }
+ });
+ }
+
+ handleShowInfoView() {
+ _lib_navigation_js__WEBPACK_IMPORTED_MODULE_15__.default.navigateTo(_lib_navigation_js__WEBPACK_IMPORTED_MODULE_15__.default.addUrlParam(window.location.hash, 'info', true));
+ this.setState({
+ showInfoPanel: true
+ });
+ }
+
+ handleHideInfoView() {
+ _lib_navigation_js__WEBPACK_IMPORTED_MODULE_15__.default.navigateTo(_lib_navigation_js__WEBPACK_IMPORTED_MODULE_15__.default.removeUrlParam(window.location.hash, 'info'));
+ this.setState({
+ showInfoPanel: false
+ });
+ }
+
+ handleMemberUpdateRequest(topicName, added, removed) {
+ if (!topicName) {
+ return;
+ }
+
+ const topic = this.tinode.getTopic(topicName);
+
+ if (!topic) {
+ return;
+ }
+
+ if (added && added.length > 0) {
+ added.map(uid => {
+ topic.invite(uid, null).catch(err => {
+ this.handleError(err.message, 'err');
+ });
+ });
+ }
+
+ if (removed && removed.length > 0) {
+ removed.map(uid => {
+ topic.delSubscription(uid).catch(err => {
+ this.handleError(err.message, 'err');
+ });
+ });
+ }
+ }
+
+ handleValidateCredentialsRequest(cred, code) {
+ if (this.tinode.isAuthenticated()) {
+ const me = this.tinode.getMeTopic();
+ me.setMeta({
+ cred: {
+ meth: cred,
+ resp: code
+ }
+ }).then(() => {
+ _lib_navigation_js__WEBPACK_IMPORTED_MODULE_15__.default.navigateTo('');
+ }).catch(err => {
+ this.handleError(err.message, 'err');
+ });
+ } else {
+ this.setState({
+ credMethod: cred,
+ credCode: code
+ });
+ this.doLogin(null, null, {
+ meth: cred,
+ resp: code
+ });
+ }
+ }
+
+ handlePasswordResetRequest(method, value) {
+ this.tinode.connect().then(() => {
+ return this.tinode.requestResetAuthSecret('basic', method, value);
+ }).catch(err => {
+ this.handleError(err.message, 'err');
+ });
+ }
+
+ handleResetPassword(scheme, newPassword, token) {
+ token = (0,_lib_blob_helpers_js__WEBPACK_IMPORTED_MODULE_12__.base64ReEncode)(token);
+
+ if (!token) {
+ this.handleError(this.props.intl.formatMessage({
+ id: 'invalid_security_token'
+ }), 'err');
+ } else {
+ this.tinode.connect().then(() => {
+ return this.tinode.updateAccountBasic(null, null, newPassword, {
+ token: token
+ });
+ }).catch(err => {
+ this.handleError(err.message, 'err');
+ });
+ }
+ }
+
+ render() {
+ return react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
+ id: "app-container"
+ }, this.state.contextMenuVisible ? react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_widgets_context_menu_jsx__WEBPACK_IMPORTED_MODULE_7__.default, {
+ tinode: this.tinode,
+ bounds: this.state.contextMenuBounds,
+ clickAt: this.state.contextMenuClickAt,
+ params: this.state.contextMenuParams,
+ items: this.state.contextMenuItems,
+ hide: this.handleHideContextMenu,
+ onShowAlert: this.handleShowAlert,
+ onAction: this.handleContextMenuAction,
+ onTopicRemoved: topicName => {
+ if (topicName == this.state.topicSelected) {
+ this.handleTopicSelected(null);
+ }
+ },
+ onError: this.handleError
+ }) : null, react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_widgets_alert_jsx__WEBPACK_IMPORTED_MODULE_6__.default, {
+ visible: this.state.alertVisible,
+ title: this.state.alertParams.title,
+ content: this.state.alertParams.content,
+ onReject: this.state.alertParams.onReject ? () => {
+ this.setState({
+ alertVisible: false
+ });
+ } : null,
+ reject: this.state.alertParams.reject,
+ onConfirm: () => {
+ this.setState({
+ alertVisible: false
+ });
+ this.state.alertParams.onConfirm();
+ },
+ confirm: this.state.alertParams.confirm
+ }), react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_sidepanel_view_jsx__WEBPACK_IMPORTED_MODULE_10__.default, {
+ tinode: this.tinode,
+ connected: this.state.connected,
+ displayMobile: this.state.displayMobile,
+ hideSelf: this.state.displayMobile && this.state.mobilePanel !== 'sidepanel',
+ state: this.state.sidePanelSelected,
+ title: this.state.sidePanelTitle,
+ avatar: this.state.sidePanelAvatar,
+ login: this.state.login,
+ myUserId: this.state.myUserId,
+ loginDisabled: this.state.loginDisabled,
+ loadSpinnerVisible: this.state.loadSpinnerVisible,
+ errorText: this.state.errorText,
+ errorLevel: this.state.errorLevel,
+ errorAction: this.state.errorAction,
+ errorActionText: this.state.errorActionText,
+ topicSelected: this.state.topicSelected,
+ chatList: this.state.chatList,
+ credMethod: this.state.credMethod,
+ credCode: this.state.credCode,
+ transport: this.state.transport,
+ messageSounds: this.state.messageSounds,
+ desktopAlerts: this.state.desktopAlerts,
+ desktopAlertsEnabled: this.state.desktopAlertsEnabled,
+ incognitoMode: this.state.incognitoMode,
+ serverAddress: this.state.serverAddress,
+ serverVersion: this.state.serverVersion,
+ onGlobalSettings: this.handleGlobalSettings,
+ onSignUp: this.handleNewAccount,
+ onSettings: this.handleSettings,
+ onBasicNavigate: this.basicNavigator,
+ onLoginRequest: this.handleLoginRequest,
+ onCreateAccount: this.handleNewAccountRequest,
+ onUpdateAccount: this.handleUpdateAccountRequest,
+ onUpdateAccountTags: this.handleUpdateAccountTagsRequest,
+ onTogglePushNotifications: this.togglePushToken,
+ onToggleMessageSounds: this.handleToggleMessageSounds,
+ onToggleIncognitoMode: this.handleToggleIncognitoMode,
+ onCredAdd: this.handleCredAdd,
+ onCredDelete: this.handleCredDelete,
+ onCredConfirm: this.handleCredConfirm,
+ onTopicSelected: this.handleTopicSelected,
+ onCreateTopic: this.handleStartTopicRequest,
+ onLogout: this.handleLogout,
+ onDeleteAccount: this.handleDeleteAccount,
+ onShowAlert: this.handleShowAlert,
+ onCancel: this.handleSidepanelCancel,
+ onError: this.handleError,
+ onValidateCredentials: this.handleValidateCredentialsRequest,
+ onPasswordResetRequest: this.handlePasswordResetRequest,
+ onResetPassword: this.handleResetPassword,
+ onShowArchive: this.handleShowArchive,
+ onShowBlocked: this.handleShowBlocked,
+ onInitFind: this.tnInitFind,
+ searchResults: this.state.searchResults,
+ onSearchContacts: this.handleSearchContacts,
+ showContextMenu: this.handleShowContextMenu
+ }), react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_messages_view_jsx__WEBPACK_IMPORTED_MODULE_9__.default, {
+ tinode: this.tinode,
+ connected: this.state.connected,
+ ready: this.state.ready,
+ online: this.state.topicSelectedOnline,
+ acs: this.state.topicSelectedAcs,
+ displayMobile: this.state.displayMobile,
+ viewportWidth: this.state.viewportWidth,
+ viewportHeight: this.state.viewportHeight,
+ hideSelf: this.state.displayMobile && (this.state.mobilePanel !== 'topic-view' || this.state.showInfoPanel),
+ topic: this.state.topicSelected,
+ myUserId: this.state.myUserId,
+ serverVersion: this.state.serverVersion,
+ serverAddress: this.state.serverAddress,
+ applicationVisible: this.state.applicationVisible,
+ errorText: this.state.errorText,
+ errorLevel: this.state.errorLevel,
+ errorAction: this.state.errorAction,
+ errorActionText: this.state.errorActionText,
+ newTopicParams: this.state.newTopicParams,
+ onHideMessagesView: this.handleHideMessagesView,
+ onData: this.tnData,
+ onError: this.handleError,
+ onNewTopicCreated: this.handleNewTopicCreated,
+ showContextMenu: this.handleShowContextMenu,
+ onChangePermissions: this.handleChangePermissions,
+ onNewChat: this.handleNewChatInvitation,
+ sendMessage: this.handleSendMessage
+ }), this.state.showInfoPanel ? react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_info_view_jsx__WEBPACK_IMPORTED_MODULE_8__.default, {
+ tinode: this.tinode,
+ connected: this.state.connected,
+ displayMobile: this.state.displayMobile,
+ topic: this.state.topicSelected,
+ searchableContacts: this.state.searchableContacts,
+ myUserId: this.state.myUserId,
+ errorText: this.state.errorText,
+ errorLevel: this.state.errorLevel,
+ errorAction: this.state.errorAction,
+ errorActionText: this.state.errorActionText,
+ onTopicDescUpdate: this.handleTopicUpdateRequest,
+ onCancel: this.handleHideInfoView,
+ onShowAlert: this.handleShowAlert,
+ onChangePermissions: this.handleChangePermissions,
+ onMemberUpdateRequest: this.handleMemberUpdateRequest,
+ onDeleteMessages: this.handleDeleteMessagesRequest,
+ onLeaveTopic: this.handleLeaveUnsubRequest,
+ onBlockTopic: this.handleBlockTopicRequest,
+ onReportTopic: this.handleReportTopic,
+ onAddMember: this.handleManageGroupMembers,
+ onTopicTagsUpdate: this.handleTagsUpdated,
+ onInitFind: this.tnInitFind,
+ onError: this.handleError,
+ showContextMenu: this.handleShowContextMenu
+ }) : null);
+ }
+
+}
+
+;
+/* harmony default export */ __webpack_exports__["default"] = ((0,react_intl__WEBPACK_IMPORTED_MODULE_2__.injectIntl)(TinodeWeb));
+
+/***/ }),
+
+/***/ "./src/views/validation-view.jsx":
+/*!***************************************!*\
+ !*** ./src/views/validation-view.jsx ***!
+ \***************************************/
+/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
+
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "react");
+/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);
+/* harmony import */ var react_intl__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react-intl */ "react-intl");
+/* harmony import */ var react_intl__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react_intl__WEBPACK_IMPORTED_MODULE_1__);
+
+
+const messages = (0,react_intl__WEBPACK_IMPORTED_MODULE_1__.defineMessages)({
+ phone: {
+ id: 'phone_dative',
+ defaultMessage: 'phone',
+ description: "Dative case of 'phone', i.e. 'phone' in 'by phone'"
+ },
+ email: {
+ id: 'email_dative',
+ defaultMessage: 'email',
+ description: "Dative case of 'email', i.e. 'email' in 'by email'"
+ }
+});
+
+class ValidationView extends (react__WEBPACK_IMPORTED_MODULE_0___default().PureComponent) {
+ constructor(props) {
+ super(props);
+ this.state = {
+ code: props.credCode || ''
+ };
+ this.handleChange = this.handleChange.bind(this);
+ this.handleKeyPress = this.handleKeyPress.bind(this);
+ this.handleSubmit = this.handleSubmit.bind(this);
+ this.handleCancel = this.handleCancel.bind(this);
+ }
+
+ handleChange(e) {
+ this.setState({
+ code: e.target.value
+ });
+ }
+
+ handleKeyPress(e) {
+ if (e.key === 'Enter') {
+ this.handleSubmit(e);
+ } else if (e.key == 'Escape') {
+ this.handleCancel(e);
+ }
+ }
+
+ handleSubmit(e) {
+ e.preventDefault();
+
+ if (this.state.code && this.state.code.trim()) {
+ this.props.onSubmit(this.props.credMethod, this.state.code.trim());
+ }
+ }
+
+ handleCancel(e) {
+ e.preventDefault();
+ this.props.onCancel();
+ }
+
+ render() {
+ const {
+ formatMessage
+ } = this.props.intl;
+ const methods = {
+ 'email': formatMessage(messages.email),
+ 'tel': formatMessage(messages.phone)
+ };
+ let method = methods[this.props.credMethod] || this.props.credMethod;
+ return react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
+ className: "panel-form"
+ }, react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
+ className: "panel-form-row"
+ }, react__WEBPACK_IMPORTED_MODULE_0___default().createElement("label", {
+ className: "small",
+ htmlFor: "enter-confirmation-code"
+ }, react__WEBPACK_IMPORTED_MODULE_0___default().createElement(react_intl__WEBPACK_IMPORTED_MODULE_1__.FormattedMessage, {
+ id: "enter_confirmation_code_prompt",
+ defaultMessage: "Enter confirmation code sent to you by {method}:",
+ description: "Request to enter confirmation code",
+ values: {
+ method: method
+ }
+ }))), react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
+ className: "panel-form-row"
+ }, react__WEBPACK_IMPORTED_MODULE_0___default().createElement(react_intl__WEBPACK_IMPORTED_MODULE_1__.FormattedMessage, {
+ id: "numeric_confirmation_code_prompt",
+ defaultMessage: "Numbers only",
+ description: "Prompt for numeric conformation code"
+ }, numbers_only => react__WEBPACK_IMPORTED_MODULE_0___default().createElement("input", {
+ type: "text",
+ id: "enter-confirmation-code",
+ placeholder: numbers_only,
+ value: this.state.code,
+ onChange: this.handleChange,
+ onKeyPress: this.handleKeyPress,
+ required: true
+ }))), react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
+ className: "dialog-buttons"
+ }, react__WEBPACK_IMPORTED_MODULE_0___default().createElement("button", {
+ className: "blue",
+ onClick: this.handleSubmit
+ }, react__WEBPACK_IMPORTED_MODULE_0___default().createElement(react_intl__WEBPACK_IMPORTED_MODULE_1__.FormattedMessage, {
+ id: "button_confirm",
+ defaultMessage: "Confirm",
+ description: "Button [Confirm]"
+ })), react__WEBPACK_IMPORTED_MODULE_0___default().createElement("button", {
+ className: "white",
+ onClick: this.handleCancel
+ }, react__WEBPACK_IMPORTED_MODULE_0___default().createElement(react_intl__WEBPACK_IMPORTED_MODULE_1__.FormattedMessage, {
+ id: "button_cancel"
+ }))));
+ }
+
+}
+
+;
+/* harmony default export */ __webpack_exports__["default"] = ((0,react_intl__WEBPACK_IMPORTED_MODULE_1__.injectIntl)(ValidationView));
+
+/***/ }),
+
+/***/ "./src/widgets/alert.jsx":
+/*!*******************************!*\
+ !*** ./src/widgets/alert.jsx ***!
+ \*******************************/
+/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
+
+__webpack_require__.r(__webpack_exports__);
+/* harmony export */ __webpack_require__.d(__webpack_exports__, {
+/* harmony export */ "default": function() { return /* binding */ Alert; }
+/* harmony export */ });
+/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "react");
+/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);
+/* harmony import */ var react_intl__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react-intl */ "react-intl");
+/* harmony import */ var react_intl__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react_intl__WEBPACK_IMPORTED_MODULE_1__);
+
+
+class Alert extends (react__WEBPACK_IMPORTED_MODULE_0___default().PureComponent) {
+ render() {
+ return this.props.visible ? react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
+ className: "alert-container"
+ }, react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
+ className: "alert"
+ }, react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
+ className: "title"
+ }, this.props.title), react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
+ className: "content"
+ }, this.props.content), react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
+ className: "dialog-buttons"
+ }, this.props.onReject ? react__WEBPACK_IMPORTED_MODULE_0___default().createElement("button", {
+ className: "outline",
+ onClick: this.props.onReject
+ }, this.props.reject || react__WEBPACK_IMPORTED_MODULE_0___default().createElement(react_intl__WEBPACK_IMPORTED_MODULE_1__.FormattedMessage, {
+ id: "button_cancel"
+ })) : null, react__WEBPACK_IMPORTED_MODULE_0___default().createElement("button", {
+ className: "blue",
+ onClick: this.props.onConfirm
+ }, this.props.confirm || react__WEBPACK_IMPORTED_MODULE_0___default().createElement(react_intl__WEBPACK_IMPORTED_MODULE_1__.FormattedMessage, {
+ id: "button_ok"
+ }))))) : null;
+ }
+
+}
+;
+
+/***/ }),
+
+/***/ "./src/widgets/attachment.jsx":
+/*!************************************!*\
+ !*** ./src/widgets/attachment.jsx ***!
+ \************************************/
+/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
+
+__webpack_require__.r(__webpack_exports__);
+/* harmony export */ __webpack_require__.d(__webpack_exports__, {
+/* harmony export */ "default": function() { return /* binding */ Attachment; }
+/* harmony export */ });
+/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "react");
+/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);
+/* harmony import */ var react_intl__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react-intl */ "react-intl");
+/* harmony import */ var react_intl__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react_intl__WEBPACK_IMPORTED_MODULE_1__);
+/* harmony import */ var _file_progress_jsx__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./file-progress.jsx */ "./src/widgets/file-progress.jsx");
+/* harmony import */ var _lib_strformat_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../lib/strformat.js */ "./src/lib/strformat.js");
+/* harmony import */ var _lib_utils_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../lib/utils.js */ "./src/lib/utils.js");
+
+
+
+
+
+class Attachment extends (react__WEBPACK_IMPORTED_MODULE_0___default().Component) {
+ constructor(props) {
+ super(props);
+ this.state = {
+ downloader: null,
+ progress: 0
+ };
+ this.downloadFile = this.downloadFile.bind(this);
+ this.handleCancel = this.handleCancel.bind(this);
+ }
+
+ downloadFile(url, filename, mimetype) {
+ if (!url) {
+ this.props.onError("Invalid download URL '" + url + "'");
+ return;
+ }
+
+ const downloader = this.props.tinode.getLargeFileHelper();
+ this.setState({
+ downloader: downloader
+ });
+ downloader.download(url, filename, mimetype, loaded => {
+ this.setState({
+ progress: loaded / this.props.size
+ });
+ }, err => {
+ this.props.onError(err, 'err');
+ }).then(() => {
+ this.setState({
+ downloader: null,
+ progress: 0
+ });
+ }).catch(err => {
+ if (err) {
+ this.props.onError("Error downloading file: " + err.message, 'err');
+ }
+
+ this.setState({
+ downloader: null,
+ progress: 0
+ });
+ });
+ }
+
+ handleCancel() {
+ if (this.props.uploading) {
+ this.props.onCancelUpload();
+ } else if (this.state.downloader) {
+ this.state.downloader.cancel();
+ }
+ }
+
+ render() {
+ let filename = this.props.filename || 'file_attachment';
+
+ if (filename.length > 36) {
+ filename = filename.substr(0, 16) + '...' + filename.substr(-16);
+ }
+
+ let size = this.props.size > 0 ? react__WEBPACK_IMPORTED_MODULE_0___default().createElement("span", {
+ className: "small gray"
+ }, "(", (0,_lib_strformat_js__WEBPACK_IMPORTED_MODULE_3__.bytesToHumanSize)(this.props.size), ")") : null;
+ let url, helperFunc;
+
+ if (!this.props.uploading && !this.state.downloader && (0,_lib_utils_js__WEBPACK_IMPORTED_MODULE_4__.isUrlRelative)(this.props.downloadUrl)) {
+ url = '#';
+
+ helperFunc = e => {
+ e.preventDefault();
+ this.downloadFile(this.props.downloadUrl, this.props.filename, this.props.mimetype);
+ };
+ } else {
+ url = (0,_lib_utils_js__WEBPACK_IMPORTED_MODULE_4__.sanitizeUrl)(this.props.downloadUrl);
+ helperFunc = null;
+ }
+
+ const downloadWidget = react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null, react__WEBPACK_IMPORTED_MODULE_0___default().createElement("i", {
+ className: "material-icons"
+ }, "file_download"), " ", react__WEBPACK_IMPORTED_MODULE_0___default().createElement(react_intl__WEBPACK_IMPORTED_MODULE_1__.FormattedMessage, {
+ id: "save_attachment",
+ defaultMessage: "save",
+ description: "Call to save an attachment"
+ }));
+ return react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
+ className: "attachment"
+ }, react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", null, react__WEBPACK_IMPORTED_MODULE_0___default().createElement("i", {
+ className: "material-icons big gray"
+ }, "insert_drive_file")), react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
+ className: "flex-column"
+ }, react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", null, filename, " ", size), this.props.uploading || this.state.downloader ? react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_file_progress_jsx__WEBPACK_IMPORTED_MODULE_2__.default, {
+ progress: this.props.uploading ? this.props.progress : this.state.progress,
+ onCancel: this.handleCancel
+ }) : react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", null, url ? react__WEBPACK_IMPORTED_MODULE_0___default().createElement("a", {
+ href: url,
+ download: this.props.filename,
+ onClick: helperFunc
+ }, downloadWidget) : react__WEBPACK_IMPORTED_MODULE_0___default().createElement("span", {
+ className: "light-gray"
+ }, downloadWidget))));
+ }
+
+}
+;
+
+/***/ }),
+
+/***/ "./src/widgets/avatar-upload.jsx":
+/*!***************************************!*\
+ !*** ./src/widgets/avatar-upload.jsx ***!
+ \***************************************/
+/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
+
+__webpack_require__.r(__webpack_exports__);
+/* harmony export */ __webpack_require__.d(__webpack_exports__, {
+/* harmony export */ "default": function() { return /* binding */ AvatarUpload; }
+/* harmony export */ });
+/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "react");
+/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);
+/* harmony import */ var _letter_tile_jsx__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./letter-tile.jsx */ "./src/widgets/letter-tile.jsx");
+/* harmony import */ var _config_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../config.js */ "./src/config.js");
+/* harmony import */ var _lib_blob_helpers_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../lib/blob-helpers.js */ "./src/lib/blob-helpers.js");
+
+
+
+
+class AvatarUpload extends (react__WEBPACK_IMPORTED_MODULE_0___default().Component) {
+ constructor(props) {
+ super(props);
+ this.state = {
+ dataUrl: props.avatar
+ };
+ this.handleFileUpload = this.handleFileUpload.bind(this);
+ }
+
+ componentDidUpdate(prevProps) {
+ if (this.props.avatar != prevProps.avatar) {
+ this.setState({
+ dataUrl: this.props.avatar
+ });
+ }
+ }
+
+ handleFileUpload(e) {
+ (0,_lib_blob_helpers_js__WEBPACK_IMPORTED_MODULE_3__.imageScaled)(e.target.files[0], _config_js__WEBPACK_IMPORTED_MODULE_2__.AVATAR_SIZE, _config_js__WEBPACK_IMPORTED_MODULE_2__.AVATAR_SIZE, _config_js__WEBPACK_IMPORTED_MODULE_2__.MAX_EXTERN_ATTACHMENT_SIZE, true, (mime, blob) => {
+ (0,_lib_blob_helpers_js__WEBPACK_IMPORTED_MODULE_3__.blobToBase64)(blob, (unused, base64bits) => {
+ const du = (0,_lib_blob_helpers_js__WEBPACK_IMPORTED_MODULE_3__.makeImageUrl)({
+ data: base64bits,
+ type: mime
+ });
+ this.setState({
+ dataUrl: du
+ });
+ this.props.onImageChanged(du);
+ });
+ }, err => {
+ this.props.onError(err, 'err');
+ });
+ e.target.value = '';
+ }
+
+ render() {
+ const randId = 'file-input-avatar-' + (Math.random() + '').substr(2);
+ const className = 'avatar-upload' + (this.props.readOnly ? ' read-only' : '');
+ return react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
+ className: className
+ }, this.props.readOnly || !this.state.dataUrl ? null : react__WEBPACK_IMPORTED_MODULE_0___default().createElement("a", {
+ href: "#",
+ className: "clear-avatar",
+ onClick: e => {
+ e.preventDefault();
+ this.props.onImageChanged(null);
+ }
+ }, react__WEBPACK_IMPORTED_MODULE_0___default().createElement("i", {
+ className: "material-icons"
+ }, "clear")), this.state.dataUrl ? react__WEBPACK_IMPORTED_MODULE_0___default().createElement("img", {
+ src: this.state.dataUrl,
+ className: "preview"
+ }) : this.props.readOnly && this.props.uid ? react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
+ className: "avatar-box"
+ }, react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_letter_tile_jsx__WEBPACK_IMPORTED_MODULE_1__.default, {
+ avatar: true,
+ topic: this.props.uid,
+ title: this.props.title
+ })) : react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
+ className: "blank"
+ }, _config_js__WEBPACK_IMPORTED_MODULE_2__.AVATAR_SIZE, "\xD7", _config_js__WEBPACK_IMPORTED_MODULE_2__.AVATAR_SIZE), this.props.readOnly ? null : react__WEBPACK_IMPORTED_MODULE_0___default().createElement("input", {
+ type: "file",
+ id: randId,
+ className: "inputfile hidden",
+ accept: "image/*",
+ onChange: this.handleFileUpload
+ }), this.props.readOnly ? null : react__WEBPACK_IMPORTED_MODULE_0___default().createElement("label", {
+ htmlFor: randId,
+ className: "round"
+ }, react__WEBPACK_IMPORTED_MODULE_0___default().createElement("i", {
+ className: "material-icons"
+ }, "file_upload")));
+ }
+
+}
+;
+
+/***/ }),
+
+/***/ "./src/widgets/button-back.jsx":
+/*!*************************************!*\
+ !*** ./src/widgets/button-back.jsx ***!
+ \*************************************/
+/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
+
+__webpack_require__.r(__webpack_exports__);
+/* harmony export */ __webpack_require__.d(__webpack_exports__, {
+/* harmony export */ "default": function() { return /* binding */ ButtonBack; }
+/* harmony export */ });
+/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "react");
+/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);
+
+class ButtonBack extends (react__WEBPACK_IMPORTED_MODULE_0___default().PureComponent) {
+ render() {
+ return react__WEBPACK_IMPORTED_MODULE_0___default().createElement("a", {
+ href: "#",
+ onClick: e => {
+ e.preventDefault();
+ this.props.onBack();
+ }
+ }, react__WEBPACK_IMPORTED_MODULE_0___default().createElement("i", {
+ className: "material-icons"
+ }, "arrow_back"));
+ }
+
+}
+
+/***/ }),
+
+/***/ "./src/widgets/chat-message.jsx":
+/*!**************************************!*\
+ !*** ./src/widgets/chat-message.jsx ***!
+ \**************************************/
+/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
+
+__webpack_require__.r(__webpack_exports__);
+/* harmony export */ __webpack_require__.d(__webpack_exports__, {
+/* harmony export */ "default": function() { return /* binding */ ChatMessage; }
+/* harmony export */ });
+/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "react");
+/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);
+/* harmony import */ var react_intl__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react-intl */ "react-intl");
+/* harmony import */ var react_intl__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react_intl__WEBPACK_IMPORTED_MODULE_1__);
+/* harmony import */ var tinode_sdk__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! tinode-sdk */ "tinode-sdk");
+/* harmony import */ var tinode_sdk__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(tinode_sdk__WEBPACK_IMPORTED_MODULE_2__);
+/* harmony import */ var _attachment_jsx__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./attachment.jsx */ "./src/widgets/attachment.jsx");
+/* harmony import */ var _letter_tile_jsx__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./letter-tile.jsx */ "./src/widgets/letter-tile.jsx");
+/* harmony import */ var _received_marker_jsx__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./received-marker.jsx */ "./src/widgets/received-marker.jsx");
+/* harmony import */ var _uploading_image_jsx__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./uploading-image.jsx */ "./src/widgets/uploading-image.jsx");
+/* harmony import */ var _lib_utils_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../lib/utils.js */ "./src/lib/utils.js");
+/* harmony import */ var _config_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../config.js */ "./src/config.js");
+/* harmony import */ var _lib_blob_helpers_js__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../lib/blob-helpers.js */ "./src/lib/blob-helpers.js");
+
+
+
+
+
+
+
+
+class ChatMessage extends (react__WEBPACK_IMPORTED_MODULE_0___default().Component) {
+ constructor(props) {
+ super(props);
+ this.state = {
+ progress: 0
+ };
+
+ if (props.uploader) {
+ props.uploader.onProgress = this.handleProgress.bind(this);
+ }
+
+ this.handleImagePreview = this.handleImagePreview.bind(this);
+ this.handleFormButtonClick = this.handleFormButtonClick.bind(this);
+ this.handleContextClick = this.handleContextClick.bind(this);
+ this.handleCancelUpload = this.handleCancelUpload.bind(this);
+ }
+
+ handleImagePreview(e) {
+ e.preventDefault();
+ this.props.onImagePreview({
+ url: e.target.src,
+ filename: e.target.title,
+ width: e.target.dataset.width,
+ height: e.target.dataset.height,
+ size: e.target.dataset.size,
+ type: e.target.dataset.mime
+ });
+ }
+
+ handleFormButtonClick(e) {
+ e.preventDefault();
+ const data = {
+ seq: this.props.seq
+ };
+ data.resp = {};
+
+ if (e.target.dataset.name) {
+ data.resp[e.target.dataset.name] = e.target.dataset.val ? e.target.dataset.val : e.target.dataset.val === undefined ? 1 : '' + e.target.dataset.val;
+ }
+
+ if (e.target.dataset.act == 'url') {
+ data.ref = (0,_lib_utils_js__WEBPACK_IMPORTED_MODULE_7__.sanitizeUrl)(e.target.dataset.ref) || 'about:blank';
+ }
+
+ const text = e.target.dataset.title || 'unknown';
+ this.props.onFormResponse(e.target.dataset.act, text, data);
+ }
+
+ handleContextClick(e) {
+ e.preventDefault();
+ e.stopPropagation();
+ const menuItems = this.props.received == Tinode.MESSAGE_STATUS_FAILED ? ['menu_item_send_retry'] : [];
+ this.props.showContextMenu({
+ seq: this.props.seq,
+ content: this.props.content,
+ y: e.pageY,
+ x: e.pageX
+ }, menuItems);
+ }
+
+ handleProgress(ratio) {
+ this.setState({
+ progress: ratio
+ });
+ }
+
+ handleCancelUpload() {
+ this.props.onCancelUpload(this.props.seq, this.props.uploader);
+ }
+
+ render() {
+ const sideClass = this.props.deleted ? 'center' : this.props.sequence + ' ' + (this.props.response ? 'left' : 'right');
+ const bubbleClass = this.props.sequence == 'single' || this.props.sequence == 'last' ? 'bubble tip' : 'bubble';
+ const avatar = this.props.deleted ? null : this.props.userAvatar || true;
+ const fullDisplay = this.props.userFrom && this.props.response && (this.props.sequence == 'single' || this.props.sequence == 'last');
+ let content = this.props.content;
+ const attachments = [];
+
+ if (this.props.mimeType == tinode_sdk__WEBPACK_IMPORTED_MODULE_2__.Drafty.getContentType() && tinode_sdk__WEBPACK_IMPORTED_MODULE_2__.Drafty.isValid(content)) {
+ tinode_sdk__WEBPACK_IMPORTED_MODULE_2__.Drafty.attachments(content, function (att, i) {
+ if (att.mime == 'application/json') {
+ return;
+ }
+
+ attachments.push(react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_attachment_jsx__WEBPACK_IMPORTED_MODULE_3__.default, {
+ tinode: this.props.tinode,
+ downloadUrl: tinode_sdk__WEBPACK_IMPORTED_MODULE_2__.Drafty.getDownloadUrl(att),
+ filename: att.name,
+ uploading: tinode_sdk__WEBPACK_IMPORTED_MODULE_2__.Drafty.isProcessing(att),
+ mimetype: att.mime,
+ size: tinode_sdk__WEBPACK_IMPORTED_MODULE_2__.Drafty.getEntitySize(att),
+ progress: this.state.progress,
+ onCancelUpload: this.handleCancelUpload,
+ onError: this.props.onError,
+ key: i
+ }));
+ }, this);
+ content = react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null, tinode_sdk__WEBPACK_IMPORTED_MODULE_2__.Drafty.format(content, draftyFormatter, this));
+ } else if (this.props.deleted) {
+ content = react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null, react__WEBPACK_IMPORTED_MODULE_0___default().createElement("i", {
+ className: "material-icons gray"
+ }, "block"), " ", react__WEBPACK_IMPORTED_MODULE_0___default().createElement("i", {
+ className: "gray"
+ }, react__WEBPACK_IMPORTED_MODULE_0___default().createElement(react_intl__WEBPACK_IMPORTED_MODULE_1__.FormattedMessage, {
+ id: "deleted_content",
+ defaultMessage: "content deleted",
+ description: "Shown when messages are deleted"
+ })));
+ } else if (typeof content != 'string') {
+ content = react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null, react__WEBPACK_IMPORTED_MODULE_0___default().createElement("i", {
+ className: "material-icons gray"
+ }, "error_outline"), " ", react__WEBPACK_IMPORTED_MODULE_0___default().createElement("i", {
+ className: "gray"
+ }, react__WEBPACK_IMPORTED_MODULE_0___default().createElement(react_intl__WEBPACK_IMPORTED_MODULE_1__.FormattedMessage, {
+ id: "invalid_content",
+ defaultMessage: "invalid content",
+ description: "Shown when message is unreadable"
+ })));
+ }
+
+ return react__WEBPACK_IMPORTED_MODULE_0___default().createElement("li", {
+ className: sideClass
+ }, this.props.userFrom && this.props.response ? react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
+ className: "avatar-box"
+ }, fullDisplay ? react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_letter_tile_jsx__WEBPACK_IMPORTED_MODULE_4__.default, {
+ topic: this.props.userFrom,
+ title: this.props.userName,
+ avatar: avatar
+ }) : null) : null, react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", null, react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
+ className: bubbleClass
+ }, react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
+ className: "message-content"
+ }, content, attachments, this.props.timestamp ? react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_received_marker_jsx__WEBPACK_IMPORTED_MODULE_5__.default, {
+ timestamp: this.props.timestamp,
+ received: this.props.received
+ }) : null), this.props.deleted || !this.props.showContextMenu ? null : react__WEBPACK_IMPORTED_MODULE_0___default().createElement("span", {
+ className: "menuTrigger"
+ }, react__WEBPACK_IMPORTED_MODULE_0___default().createElement("a", {
+ href: "#",
+ onClick: this.handleContextClick
+ }, react__WEBPACK_IMPORTED_MODULE_0___default().createElement("i", {
+ className: "material-icons"
+ }, "expand_more")))), fullDisplay ? react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
+ className: "author"
+ }, react__WEBPACK_IMPORTED_MODULE_0___default().createElement(react_intl__WEBPACK_IMPORTED_MODULE_1__.FormattedMessage, {
+ id: "user_not_found",
+ defaultMessage: "Not found",
+ description: "In place of a user's full name when the user is not found."
+ }, notFound => {
+ return this.props.userName || react__WEBPACK_IMPORTED_MODULE_0___default().createElement("i", null, notFound);
+ })) : null));
+ }
+
+}
+;
+
+
+
+function draftyFormatter(style, data, values, key) {
+ if (style == 'EX') {
+ return null;
+ }
+
+ let el = tinode_sdk__WEBPACK_IMPORTED_MODULE_2__.Drafty.tagName(style);
+
+ if (el) {
+ const attr = tinode_sdk__WEBPACK_IMPORTED_MODULE_2__.Drafty.attrValue(style, data) || {};
+ attr.key = key;
+
+ switch (style) {
+ case 'HL':
+ attr.className = 'highlight';
+ break;
+
+ case 'IM':
+ if (data) {
+ attr.className = 'inline-image';
+ const dim = (0,_lib_blob_helpers_js__WEBPACK_IMPORTED_MODULE_9__.fitImageSize)(data.width, data.height, Math.min(this.props.viewportWidth - _config_js__WEBPACK_IMPORTED_MODULE_8__.REM_SIZE * 4, _config_js__WEBPACK_IMPORTED_MODULE_8__.REM_SIZE * 36), _config_js__WEBPACK_IMPORTED_MODULE_8__.REM_SIZE * 24, false) || {
+ dstWidth: _config_js__WEBPACK_IMPORTED_MODULE_8__.BROKEN_IMAGE_SIZE,
+ dstHeight: _config_js__WEBPACK_IMPORTED_MODULE_8__.BROKEN_IMAGE_SIZE
+ };
+ attr.style = {
+ width: dim.dstWidth + 'px',
+ height: dim.dstHeight + 'px'
+ };
+
+ if (!tinode_sdk__WEBPACK_IMPORTED_MODULE_2__.Drafty.isProcessing(data)) {
+ attr.src = this.props.tinode.authorizeURL((0,_lib_utils_js__WEBPACK_IMPORTED_MODULE_7__.sanitizeImageUrl)(attr.src));
+ attr.alt = data.name;
+
+ if (attr.src) {
+ attr.onClick = this.handleImagePreview;
+ attr.className += ' image-clickable';
+ } else {
+ attr.src = 'img/broken_image.png';
+ }
+ } else {
+ el = _uploading_image_jsx__WEBPACK_IMPORTED_MODULE_6__.default;
+ }
+ }
+
+ break;
+
+ case 'BN':
+ attr.onClick = this.handleFormButtonClick;
+ let inner = react__WEBPACK_IMPORTED_MODULE_0___default().Children.map(values, child => {
+ return typeof child == 'string' ? child : undefined;
+ });
+
+ if (!inner || inner.length == 0) {
+ inner = [attr.name];
+ }
+
+ attr['data-title'] = inner.join('');
+ break;
+
+ case 'FM':
+ attr.className = 'bot-form';
+ break;
+
+ case 'RW':
+ break;
+
+ default:
+ if (el == '_UNKN') {
+ el = react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null, react__WEBPACK_IMPORTED_MODULE_0___default().createElement("span", {
+ className: "material-icons"
+ }, "extension"));
+ }
+
+ break;
+ }
+
+ return react__WEBPACK_IMPORTED_MODULE_0___default().createElement(el, attr, values);
+ } else {
+ return values;
+ }
+}
+
+;
+
+/***/ }),
+
+/***/ "./src/widgets/checkbox.jsx":
+/*!**********************************!*\
+ !*** ./src/widgets/checkbox.jsx ***!
+ \**********************************/
+/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
+
+__webpack_require__.r(__webpack_exports__);
+/* harmony export */ __webpack_require__.d(__webpack_exports__, {
+/* harmony export */ "default": function() { return /* binding */ CheckBox; }
+/* harmony export */ });
+/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "react");
+/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);
+
+class CheckBox extends (react__WEBPACK_IMPORTED_MODULE_0___default().PureComponent) {
+ constructor(props) {
+ super(props);
+ this.handleChange = this.handleChange.bind(this);
+ }
+
+ handleChange() {
+ this.props.onChange(this.props.name, !this.props.checked);
+ }
+
+ render() {
+ return this.props.onChange ? this.props.checked ? react__WEBPACK_IMPORTED_MODULE_0___default().createElement("i", {
+ className: "material-icons blue clickable",
+ onClick: this.handleChange
+ }, "check_box") : react__WEBPACK_IMPORTED_MODULE_0___default().createElement("i", {
+ className: "material-icons blue clickable",
+ onClick: this.handleChange
+ }, "check_box_outline_blank") : this.props.checked ? react__WEBPACK_IMPORTED_MODULE_0___default().createElement("i", {
+ className: "material-icons"
+ }, "check_box") : react__WEBPACK_IMPORTED_MODULE_0___default().createElement("i", {
+ className: "material-icons"
+ }, "check_box_outline_blank");
+ }
+
+}
+
+/***/ }),
+
+/***/ "./src/widgets/chip-input.jsx":
+/*!************************************!*\
+ !*** ./src/widgets/chip-input.jsx ***!
+ \************************************/
+/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
+
+__webpack_require__.r(__webpack_exports__);
+/* harmony export */ __webpack_require__.d(__webpack_exports__, {
+/* harmony export */ "default": function() { return /* binding */ ChipInput; }
+/* harmony export */ });
+/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "react");
+/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);
+/* harmony import */ var _chip_jsx__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./chip.jsx */ "./src/widgets/chip.jsx");
+/* harmony import */ var _lib_blob_helpers_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../lib/blob-helpers.js */ "./src/lib/blob-helpers.js");
+
+
+
+class ChipInput extends (react__WEBPACK_IMPORTED_MODULE_0___default().Component) {
+ constructor(props) {
+ super(props);
+ this.state = ChipInput.deriveStateFromProps(props);
+ this.state.input = '';
+ this.state.focused = false;
+ this.handleTextInput = this.handleTextInput.bind(this);
+ this.removeChipAt = this.removeChipAt.bind(this);
+ this.handleChipCancel = this.handleChipCancel.bind(this);
+ this.handleFocusGained = this.handleFocusGained.bind(this);
+ this.handleFocusLost = this.handleFocusLost.bind(this);
+ this.handleKeyDown = this.handleKeyDown.bind(this);
+ }
+
+ static deriveStateFromProps(props) {
+ return {
+ placeholder: props.chips ? '' : props.prompt,
+ sortedChips: ChipInput.sortChips(props.chips, props.staticMembers),
+ chipIndex: ChipInput.indexChips(props.chips)
+ };
+ }
+
+ componentDidUpdate(prevProps, prevState) {
+ if (prevProps.chips != this.props.chips || prevProps.staticMembers != this.props.staticMembers || prevProps.prompt != this.props.prompt) {
+ this.setState(ChipInput.deriveStateFromProps(this.props));
+ }
+
+ if (!prevState || this.props.chips.length > prevState.sortedChips.length) {
+ this.setState({
+ input: ''
+ });
+ }
+ }
+
+ static indexChips(chips) {
+ const index = {};
+ let count = 0;
+ chips.map(item => {
+ index[item.user] = count;
+ count++;
+ });
+ return index;
+ }
+
+ static sortChips(chips, keep) {
+ const required = [];
+ const normal = [];
+ chips.map(item => {
+ if (keep && keep.includes(item.user)) {
+ required.push(item);
+ } else {
+ normal.push(item);
+ }
+ });
+ return required.concat(normal);
+ }
+
+ handleTextInput(e) {
+ this.setState({
+ input: e.target.value
+ });
+
+ if (this.props.filterFunc) {
+ this.props.filterFunc(e.target.value);
+ }
+ }
+
+ removeChipAt(idx) {
+ const removed = this.state.sortedChips[idx];
+ this.props.onChipRemoved(removed.user, this.state.chipIndex[removed.user]);
+ }
+
+ handleChipCancel(item, idx) {
+ this.removeChipAt(idx);
+ }
+
+ handleFocusGained() {
+ this.setState({
+ focused: true
+ });
+ }
+
+ handleFocusLost() {
+ this.setState({
+ focused: false
+ });
+
+ if (this.props.onFocusLost) {
+ this.props.onFocusLost(this.state.input);
+ }
+ }
+
+ handleKeyDown(e) {
+ if (e.key === 'Backspace') {
+ if (this.state.input.length == 0 && this.state.sortedChips.length > 0) {
+ const at = this.state.sortedChips.length - 1;
+
+ if (this.state.sortedChips[at].user !== this.props.staticMembers) {
+ this.removeChipAt(at);
+ }
+ }
+ } else if (e.key === 'Enter') {
+ if (this.props.onEnter) {
+ this.props.onEnter(this.state.input);
+ }
+ } else if (e.key === 'Escape') {
+ if (this.props.onCancel) {
+ this.props.onCancel();
+ }
+ }
+ }
+
+ render() {
+ const chips = [];
+ let count = 0;
+ const staticMembers = this.props.staticMembers || [];
+ this.state.sortedChips.map(item => {
+ chips.push(react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_chip_jsx__WEBPACK_IMPORTED_MODULE_1__.default, {
+ onCancel: this.handleChipCancel,
+ avatar: (0,_lib_blob_helpers_js__WEBPACK_IMPORTED_MODULE_2__.makeImageUrl)(item.public ? item.public.photo : null),
+ title: item.public ? item.public.fn : undefined,
+ noAvatar: this.props.avatarDisabled,
+ topic: item.user,
+ required: staticMembers.includes(item.user),
+ invalid: item.invalid,
+ index: count,
+ key: item.user
+ }));
+ count++;
+ });
+ const className = "chip-input" + (this.state.focused ? ' focused' : '');
+ return react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
+ className: className
+ }, chips, react__WEBPACK_IMPORTED_MODULE_0___default().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: true
+ }));
+ }
+
+}
+;
+
+/***/ }),
+
+/***/ "./src/widgets/chip.jsx":
+/*!******************************!*\
+ !*** ./src/widgets/chip.jsx ***!
+ \******************************/
+/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
+
+__webpack_require__.r(__webpack_exports__);
+/* harmony export */ __webpack_require__.d(__webpack_exports__, {
+/* harmony export */ "default": function() { return /* binding */ Chip; }
+/* harmony export */ });
+/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "react");
+/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);
+/* harmony import */ var _letter_tile_jsx__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./letter-tile.jsx */ "./src/widgets/letter-tile.jsx");
+
+
+class Chip extends (react__WEBPACK_IMPORTED_MODULE_0___default().PureComponent) {
+ constructor(props) {
+ super(props);
+ this.handleCancel = this.handleCancel.bind(this);
+ }
+
+ handleCancel(e) {
+ e.preventDefault();
+ this.props.onCancel(this.props.topic, this.props.index);
+ }
+
+ render() {
+ const title = this.props.title || this.props.topic;
+ const className = this.props.invalid ? 'chip invalid' : 'chip';
+ return react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
+ className: className
+ }, this.props.noAvatar ? react__WEBPACK_IMPORTED_MODULE_0___default().createElement("span", {
+ className: "spacer"
+ }) : react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
+ className: "avatar-box"
+ }, react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_letter_tile_jsx__WEBPACK_IMPORTED_MODULE_1__.default, {
+ avatar: this.props.avatar || true,
+ topic: this.props.topic,
+ title: this.props.title
+ })), react__WEBPACK_IMPORTED_MODULE_0___default().createElement("span", null, title), this.props.onCancel && !this.props.required ? react__WEBPACK_IMPORTED_MODULE_0___default().createElement("a", {
+ href: "#",
+ onClick: this.handleCancel
+ }, "\xD7") : react__WEBPACK_IMPORTED_MODULE_0___default().createElement("span", {
+ className: "spacer"
+ }));
+ }
+
+}
+;
+
+/***/ }),
+
+/***/ "./src/widgets/contact-action.jsx":
+/*!****************************************!*\
+ !*** ./src/widgets/contact-action.jsx ***!
+ \****************************************/
+/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
+
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "react");
+/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);
+/* harmony import */ var react_intl__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react-intl */ "react-intl");
+/* harmony import */ var react_intl__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react_intl__WEBPACK_IMPORTED_MODULE_1__);
+
+
+
+class ContactAction extends (react__WEBPACK_IMPORTED_MODULE_0___default().PureComponent) {
+ constructor(props) {
+ super(props);
+ this.handleClick = this.handleClick.bind(this);
+ }
+
+ handleClick(e) {
+ e.preventDefault();
+ e.stopPropagation();
+ this.props.onAction(this.props.action);
+ }
+
+ render() {
+ const {
+ formatMessage
+ } = this.props.intl;
+ return react__WEBPACK_IMPORTED_MODULE_0___default().createElement("li", {
+ onClick: this.handleClick,
+ className: "action"
+ }, react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
+ className: "action-text"
+ }, formatMessage(this.props.title, this.props.values)));
+ }
+
+}
+
+;
+/* harmony default export */ __webpack_exports__["default"] = ((0,react_intl__WEBPACK_IMPORTED_MODULE_1__.injectIntl)(ContactAction));
+
+/***/ }),
+
+/***/ "./src/widgets/contact-badges.jsx":
+/*!****************************************!*\
+ !*** ./src/widgets/contact-badges.jsx ***!
+ \****************************************/
+/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
+
+__webpack_require__.r(__webpack_exports__);
+/* harmony export */ __webpack_require__.d(__webpack_exports__, {
+/* harmony export */ "default": function() { return /* binding */ ContactBadges; }
+/* harmony export */ });
+/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "react");
+/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);
+
+const icon_mapping = {
+ 'muted': 'notifications_off',
+ 'banned': 'block'
+};
+class ContactBadges extends (react__WEBPACK_IMPORTED_MODULE_0___default().PureComponent) {
+ render() {
+ let badges = null;
+
+ if (this.props.badges && this.props.badges.length > 0) {
+ badges = [];
+ this.props.badges.map(function (b) {
+ if (b.icon) {
+ badges.push(react__WEBPACK_IMPORTED_MODULE_0___default().createElement("i", {
+ className: "material-icons as-badge",
+ key: b.key || b.icon
+ }, icon_mapping[b.icon]));
+ } else {
+ const style = 'badge' + (b.color ? ' ' + b.color : '');
+ badges.push(react__WEBPACK_IMPORTED_MODULE_0___default().createElement("span", {
+ className: style,
+ key: b.key || b.name
+ }, b.name));
+ }
+ });
+ return react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null, badges);
+ }
+
+ return null;
+ }
+
+}
+;
+
+/***/ }),
+
+/***/ "./src/widgets/contact-list.jsx":
+/*!**************************************!*\
+ !*** ./src/widgets/contact-list.jsx ***!
+ \**************************************/
+/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
+
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "react");
+/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);
+/* harmony import */ var react_intl__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react-intl */ "react-intl");
+/* harmony import */ var react_intl__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react_intl__WEBPACK_IMPORTED_MODULE_1__);
+/* harmony import */ var tinode_sdk__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! tinode-sdk */ "tinode-sdk");
+/* harmony import */ var tinode_sdk__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(tinode_sdk__WEBPACK_IMPORTED_MODULE_2__);
+/* harmony import */ var _contact_jsx__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./contact.jsx */ "./src/widgets/contact.jsx");
+/* harmony import */ var _contact_action_jsx__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./contact-action.jsx */ "./src/widgets/contact-action.jsx");
+/* harmony import */ var _lib_blob_helpers_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../lib/blob-helpers.js */ "./src/lib/blob-helpers.js");
+
+
+
+
+
+
+
+const junk = {
+ "ent": [{
+ "data": {
+ "mime": "image/jpeg",
+ "name": "hello.jpg",
+ "val": "<38992, bytes: ...>",
+ "width": 100,
+ "height": 80
+ },
+ "tp": "EX"
+ }],
+ "fmt": [{
+ "at": -1,
+ "key": 0
+ }]
+};
+const messages = (0,react_intl__WEBPACK_IMPORTED_MODULE_1__.defineMessages)({
+ badge_you: {
+ id: 'badge_you',
+ defaultMessage: 'you',
+ description: 'Badge for indicating the current user'
+ },
+ badge_owner: {
+ id: 'badge_owner',
+ defaultMessage: 'owner',
+ description: 'Badge for indicating the owner'
+ }
+});
+
+class ContactList extends (react__WEBPACK_IMPORTED_MODULE_0___default().Component) {
+ render() {
+ const {
+ formatMessage
+ } = this.props.intl;
+ const showCheckmark = Array.isArray(this.props.topicSelected);
+ const contactNodes = [];
+ let contactsCount = 0;
+
+ if (this.props.contacts && this.props.contacts.length > 0) {
+ this.props.contacts.map(c => {
+ if (c.action) {
+ contactNodes.push(react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_contact_action_jsx__WEBPACK_IMPORTED_MODULE_4__.default, {
+ title: c.title,
+ action: c.action,
+ values: c.values,
+ key: c.action,
+ onAction: this.props.onAction
+ }));
+ } else {
+ const key = this.props.showMode ? c.user : c.topic || c.user;
+
+ if (this.props.filterFunc && this.props.filter) {
+ let content = [key];
+
+ if (c.private && c.private.comment) {
+ content.push(('' + c.private.comment).toLowerCase());
+ }
+
+ if (c.public && c.public.fn) {
+ content.push(('' + c.public.fn).toLowerCase());
+ }
+
+ if (!this.props.filterFunc(this.props.filter, content)) {
+ return;
+ }
+ }
+
+ const isChannel = tinode_sdk__WEBPACK_IMPORTED_MODULE_2___default().isChannelTopicName(key);
+ const selected = showCheckmark ? this.props.topicSelected.indexOf(key) > -1 : this.props.topicSelected === key;
+ const badges = [];
+
+ if (this.props.showMode) {
+ if (key == this.props.myUserId) {
+ badges.push({
+ name: formatMessage(messages.badge_you),
+ color: 'green'
+ });
+ }
+
+ if (c.acs && c.acs.isOwner()) {
+ badges.push({
+ name: formatMessage(messages.badge_owner),
+ color: 'blue'
+ });
+ }
+ }
+
+ const comment = Array.isArray(c.private) ? c.private.join(',') : c.private ? c.private.comment : null;
+ contactNodes.push(react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_contact_jsx__WEBPACK_IMPORTED_MODULE_3__.default, {
+ title: c.public ? c.public.fn : null,
+ avatar: (0,_lib_blob_helpers_js__WEBPACK_IMPORTED_MODULE_5__.makeImageUrl)(c.public ? c.public.photo : null),
+ comment: comment,
+ unread: this.props.showUnread ? c.unread : 0,
+ now: c.online && this.props.connected,
+ acs: c.acs,
+ showMode: this.props.showMode,
+ badges: badges,
+ showCheckmark: showCheckmark,
+ selected: selected,
+ showOnline: this.props.showOnline && !isChannel,
+ isChannel: isChannel,
+ onSelected: this.props.onTopicSelected,
+ showContextMenu: this.props.showContextMenu,
+ item: key,
+ index: contactNodes.length,
+ key: key
+ }));
+ contactsCount++;
+ }
+ }, this);
+ }
+
+ return react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
+ className: this.props.noScroll ? null : "scrollable-panel"
+ }, contactsCount == 0 ? react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
+ className: "center-medium-text",
+ dangerouslySetInnerHTML: {
+ __html: this.props.emptyListMessage
+ }
+ }) : null, contactNodes.length > 0 ? react__WEBPACK_IMPORTED_MODULE_0___default().createElement("ul", {
+ className: "contact-box"
+ }, contactNodes) : null);
+ }
+
+}
+
+;
+
+function draftyFormatter(style, data, values, key) {
+ let el = tinode_sdk__WEBPACK_IMPORTED_MODULE_2__.Drafty.tagName(style);
+ const attr = {
+ key: key
+ };
+
+ if (el) {
+ switch (style) {
+ case 'HL':
+ attr.className = 'highlight preview';
+ break;
+
+ case 'LN':
+ el = 'span';
+ break;
+
+ case 'IM':
+ el = (react__WEBPACK_IMPORTED_MODULE_0___default().Fragment);
+ values = [react__WEBPACK_IMPORTED_MODULE_0___default().createElement("i", {
+ className: "material-icons"
+ }, "photo"), 'Picture'];
+ break;
+
+ case 'BN':
+ el = 'span';
+ attr.className = 'flat-button faux';
+ break;
+
+ case 'FM':
+ el = (react__WEBPACK_IMPORTED_MODULE_0___default().Fragment);
+ values = [react__WEBPACK_IMPORTED_MODULE_0___default().createElement("i", {
+ className: "material-icons"
+ }, "dashboard"), 'Form:'];
+ break;
+
+ case 'RW':
+ el = (react__WEBPACK_IMPORTED_MODULE_0___default().Fragment);
+ break;
+
+ case 'EX':
+ el = (react__WEBPACK_IMPORTED_MODULE_0___default().Fragment);
+ values = [react__WEBPACK_IMPORTED_MODULE_0___default().createElement("i", {
+ className: "material-icons"
+ }, "attachment"), 'Attachment'];
+ break;
+
+ default:
+ if (el == '_UNKN') {
+ el = (react__WEBPACK_IMPORTED_MODULE_0___default().Fragment);
+ values = [react__WEBPACK_IMPORTED_MODULE_0___default().createElement("i", {
+ className: "material-icons"
+ }, "extension")];
+ }
+
+ break;
+ }
+
+ return react__WEBPACK_IMPORTED_MODULE_0___default().createElement(el, attr, values);
+ } else {
+ return values;
+ }
+}
+
+;
+/* harmony default export */ __webpack_exports__["default"] = ((0,react_intl__WEBPACK_IMPORTED_MODULE_1__.injectIntl)(ContactList));
+
+/***/ }),
+
+/***/ "./src/widgets/contact.jsx":
+/*!*********************************!*\
+ !*** ./src/widgets/contact.jsx ***!
+ \*********************************/
+/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
+
+__webpack_require__.r(__webpack_exports__);
+/* harmony export */ __webpack_require__.d(__webpack_exports__, {
+/* harmony export */ "default": function() { return /* binding */ Contact; }
+/* harmony export */ });
+/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "react");
+/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);
+/* harmony import */ var react_intl__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react-intl */ "react-intl");
+/* harmony import */ var react_intl__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react_intl__WEBPACK_IMPORTED_MODULE_1__);
+/* harmony import */ var _letter_tile_jsx__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./letter-tile.jsx */ "./src/widgets/letter-tile.jsx");
+/* harmony import */ var _contact_badges_jsx__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./contact-badges.jsx */ "./src/widgets/contact-badges.jsx");
+/* harmony import */ var _unread_badge_jsx__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./unread-badge.jsx */ "./src/widgets/unread-badge.jsx");
+
+
+
+
+
+class Contact extends (react__WEBPACK_IMPORTED_MODULE_0___default().Component) {
+ constructor(props) {
+ super(props);
+ this.handleClick = this.handleClick.bind(this);
+ this.handleContextClick = this.handleContextClick.bind(this);
+ }
+
+ handleClick(e) {
+ e.preventDefault();
+ e.stopPropagation();
+
+ if (this.props.onSelected) {
+ this.props.onSelected(this.props.item, this.props.index);
+ }
+ }
+
+ handleContextClick(e) {
+ e.preventDefault();
+ e.stopPropagation();
+ this.props.showContextMenu({
+ topicName: this.props.item,
+ y: e.pageY,
+ x: e.pageX
+ });
+ }
+
+ render() {
+ let title = this.props.title;
+
+ if (!title) {
+ title = react__WEBPACK_IMPORTED_MODULE_0___default().createElement("i", null, react__WEBPACK_IMPORTED_MODULE_0___default().createElement(react_intl__WEBPACK_IMPORTED_MODULE_1__.FormattedMessage, {
+ id: "unnamed_topic"
+ }));
+ } else if (title.length > 30) {
+ title = title.substring(0, 28) + '...';
+ }
+
+ const online = this.props.now ? 'online' : 'offline';
+ const avatar = this.props.avatar ? this.props.avatar : true;
+ const badges = this.props.badges ? this.props.badges.slice() : [];
+ const icon_badges = [];
+
+ if (this.props.acs) {
+ if (this.props.showMode) {
+ badges.push({
+ name: this.props.acs.getMode(),
+ key: 'mode'
+ });
+ }
+
+ if (this.props.acs.isMuted()) {
+ icon_badges.push({
+ icon: 'muted'
+ });
+ }
+
+ if (!this.props.acs.isJoiner()) {
+ icon_badges.push({
+ icon: 'banned'
+ });
+ }
+ }
+
+ return react__WEBPACK_IMPORTED_MODULE_0___default().createElement("li", {
+ className: !this.props.showCheckmark && this.props.selected ? "selected" : null,
+ onClick: this.handleClick
+ }, react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
+ className: "avatar-box"
+ }, react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_letter_tile_jsx__WEBPACK_IMPORTED_MODULE_2__.default, {
+ avatar: avatar,
+ title: this.props.title,
+ topic: this.props.item
+ }), this.props.showOnline ? react__WEBPACK_IMPORTED_MODULE_0___default().createElement("span", {
+ className: online
+ }) : this.props.showCheckmark && this.props.selected ? react__WEBPACK_IMPORTED_MODULE_0___default().createElement("i", {
+ className: "checkmark material-icons"
+ }, "check_circle") : null), react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
+ className: "text-box"
+ }, react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", null, react__WEBPACK_IMPORTED_MODULE_0___default().createElement("span", {
+ className: "contact-title"
+ }, title), this.props.isChannel ? react__WEBPACK_IMPORTED_MODULE_0___default().createElement("img", {
+ src: "/img/channel.png",
+ className: "channel",
+ alt: "channel"
+ }) : null, react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_unread_badge_jsx__WEBPACK_IMPORTED_MODULE_4__.default, {
+ count: this.props.unread
+ }), react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_contact_badges_jsx__WEBPACK_IMPORTED_MODULE_3__.default, {
+ badges: icon_badges
+ })), this.props.comment ? react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
+ className: "contact-comment"
+ }, this.props.comment) : null, react__WEBPACK_IMPORTED_MODULE_0___default().createElement("span", null, react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_contact_badges_jsx__WEBPACK_IMPORTED_MODULE_3__.default, {
+ badges: badges
+ }))), this.props.showContextMenu ? react__WEBPACK_IMPORTED_MODULE_0___default().createElement("span", {
+ className: "menuTrigger"
+ }, react__WEBPACK_IMPORTED_MODULE_0___default().createElement("a", {
+ href: "#",
+ onClick: this.handleContextClick
+ }, react__WEBPACK_IMPORTED_MODULE_0___default().createElement("i", {
+ className: "material-icons"
+ }, "expand_more"))) : null);
+ }
+
+}
+;
+
+/***/ }),
+
+/***/ "./src/widgets/context-menu.jsx":
+/*!**************************************!*\
+ !*** ./src/widgets/context-menu.jsx ***!
+ \**************************************/
+/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
+
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "react");
+/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);
+/* harmony import */ var react_dom__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react-dom */ "react-dom");
+/* harmony import */ var react_dom__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react_dom__WEBPACK_IMPORTED_MODULE_1__);
+/* harmony import */ var react_intl__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! react-intl */ "react-intl");
+/* harmony import */ var react_intl__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(react_intl__WEBPACK_IMPORTED_MODULE_2__);
+/* harmony import */ var _config_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../config.js */ "./src/config.js");
+/* harmony import */ var _lib_navigation_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../lib/navigation.js */ "./src/lib/navigation.js");
+
+
+
+
+
+const messages = (0,react_intl__WEBPACK_IMPORTED_MODULE_2__.defineMessages)({
+ info: {
+ id: 'menu_item_info',
+ defaultMessage: 'Info',
+ description: 'Show extended topic information'
+ },
+ clear_messages: {
+ id: 'menu_item_clear_messages',
+ defaultMessage: 'Clear messages',
+ description: 'Delete all messages'
+ },
+ clear_for_all: {
+ id: 'menu_item_clear_messages_for_all',
+ defaultMessage: 'Clear for All',
+ description: 'Delete all message(s) for all members'
+ },
+ 'delete': {
+ id: 'menu_item_delete',
+ defaultMessage: 'Delete',
+ description: 'Delete selected messages'
+ },
+ delete_for_all: {
+ id: 'menu_item_delete_for_all',
+ defaultMessage: 'Delete for All',
+ description: 'Delete selected message(s) for all members'
+ },
+ send_retry: {
+ id: 'menu_item_send_retry',
+ defaultMessage: 'Retry',
+ description: 'Retry sending message'
+ },
+ mute: {
+ id: 'menu_item_mute',
+ defaultMessage: 'Mute',
+ description: 'Turn off notifications'
+ },
+ unmute: {
+ id: 'menu_item_unmute',
+ defaultMessage: 'Unmute',
+ description: 'Turn notifications on'
+ },
+ topic_delete: {
+ id: 'menu_item_delete_topic',
+ defaultMessage: 'Delete',
+ description: 'Delete entire topic'
+ },
+ topic_delete_warning: {
+ id: 'topic_delete_warning',
+ defaultMessage: 'Are you sure you want to delete this conversation?',
+ description: 'Alert warning when deleting entire topic'
+ },
+ unblock: {
+ id: 'menu_item_unblock',
+ defaultMessage: 'Unblock',
+ description: 'Unblock topic or user'
+ },
+ block: {
+ id: 'menu_item_block',
+ defaultMessage: 'Block',
+ description: 'Block topic or user'
+ },
+ topic_block_warning: {
+ id: 'topic_block_warning',
+ defaultMessage: 'Are you sure you want to block this conversation?',
+ description: 'Alert warning when blocking a topic.'
+ },
+ member_delete: {
+ id: 'menu_item_member_delete',
+ defaultMessage: 'Remove',
+ description: 'Remove user from topic'
+ },
+ archive: {
+ id: 'menu_item_archive_topic',
+ defaultMessage: 'Archive',
+ description: 'Move topic from the list of active chats to archive'
+ }
+});
+
+class ContextMenu extends (react__WEBPACK_IMPORTED_MODULE_0___default().Component) {
+ constructor(props) {
+ super(props);
+ const {
+ formatMessage
+ } = props.intl;
+ this.handlePageClick = this.handlePageClick.bind(this);
+ this.handleEscapeKey = this.handleEscapeKey.bind(this);
+ this.handleClick = this.handleClick.bind(this);
+ this.MenuItems = {
+ 'topic_info': {
+ id: 'topic_info',
+ title: formatMessage(messages.info),
+ handler: null
+ },
+ 'messages_clear': {
+ id: 'messages_clear',
+ title: formatMessage(messages.clear_messages),
+ handler: (params, errorHandler) => {
+ return props.onShowAlert(formatMessage({
+ id: 'menu_item_clear_messages'
+ }), formatMessage({
+ id: 'clear_messages_warning'
+ }), () => {
+ this.deleteMessages(true, false, params, errorHandler);
+ }, null, true, null);
+ }
+ },
+ 'messages_clear_hard': {
+ id: 'messages_clear_hard',
+ title: formatMessage(messages.clear_for_all),
+ handler: (params, errorHandler) => {
+ return props.onShowAlert(formatMessage({
+ id: 'menu_item_clear_messages_for_all'
+ }), formatMessage({
+ id: 'delete_messages_warning'
+ }), () => {
+ return this.deleteMessages(true, true, params, errorHandler);
+ }, null, true, null);
+ }
+ },
+ 'message_delete': {
+ id: 'message_delete',
+ title: formatMessage(messages.delete),
+ handler: (params, errorHandler) => {
+ return this.deleteMessages(false, false, params, errorHandler);
+ }
+ },
+ 'message_delete_hard': {
+ id: 'message_delete_hard',
+ title: formatMessage(messages.delete_for_all),
+ handler: (params, errorHandler) => {
+ return this.deleteMessages(false, true, params, errorHandler);
+ }
+ },
+ 'menu_item_send_retry': {
+ id: 'menu_item_send_retry',
+ title: formatMessage(messages.send_retry),
+ handler: (params, errorHandler) => {
+ return this.retryMessage(params, errorHandler);
+ }
+ },
+ 'topic_unmute': {
+ id: 'topic_unmute',
+ title: formatMessage(messages.unmute),
+ handler: this.topicPermissionSetter.bind(this, '+P')
+ },
+ 'topic_mute': {
+ id: 'topic_mute',
+ title: formatMessage(messages.mute),
+ handler: this.topicPermissionSetter.bind(this, '-P')
+ },
+ 'topic_unblock': {
+ id: 'topic_unblock',
+ title: formatMessage(messages.unblock),
+ handler: this.topicPermissionSetter.bind(this, '+JP')
+ },
+ 'topic_block': {
+ id: 'topic_block',
+ title: formatMessage(messages.block),
+ handler: (params, errorHandler) => {
+ return props.onShowAlert(formatMessage({
+ id: 'menu_item_block'
+ }), formatMessage(messages.topic_block_warning), () => {
+ return this.topicPermissionSetter('-JP', params, errorHandler).then(ctrl => {
+ this.props.onTopicRemoved(params.topicName);
+ return ctrl;
+ });
+ }, null, true, null);
+ }
+ },
+ 'topic_delete': {
+ id: 'topic_delete',
+ title: formatMessage(messages.topic_delete),
+ handler: (params, errorHandler) => {
+ return props.onShowAlert(formatMessage({
+ id: 'menu_item_delete_topic'
+ }), formatMessage(messages.topic_delete_warning), () => {
+ const topic = this.props.tinode.getTopic(params.topicName);
+
+ if (!topic) {
+ console.log("Topic not found: ", params.topicName);
+ return;
+ }
+
+ return topic.delTopic(true).catch(err => {
+ if (errorHandler) {
+ errorHandler(err.message, 'err');
+ }
+ });
+ }, null, true, null);
+ }
+ },
+ 'topic_archive': {
+ id: 'topic_archive',
+ title: formatMessage(messages.archive),
+ handler: (params, errorHandler) => {
+ const topic = this.props.tinode.getTopic(params.topicName);
+
+ if (!topic) {
+ console.log("Topic not found: ", params.topicName);
+ return;
+ }
+
+ return topic.archive(true).catch(err => {
+ if (errorHandler) {
+ errorHandler(err.message, 'err');
+ }
+ });
+ }
+ },
+ 'permissions': {
+ id: 'permissions',
+ title: formatMessage({
+ id: 'menu_item_edit_permissions'
+ }),
+ handler: null
+ },
+ 'member_delete': {
+ id: 'member_delete',
+ title: formatMessage(messages.member_delete),
+ handler: (params, errorHandler) => {
+ const topic = this.props.tinode.getTopic(params.topicName);
+
+ if (!topic || !params.user) {
+ console.log("Topic or user not found: '" + params.topicName + "', '" + params.user + "'");
+ return;
+ }
+
+ return topic.delSubscription(params.user).catch(err => {
+ if (errorHandler) {
+ errorHandler(err.message, 'err');
+ }
+ });
+ }
+ },
+ 'member_mute': {
+ id: 'member_mute',
+ title: formatMessage(messages.mute),
+ handler: this.topicPermissionSetter.bind(this, '-P')
+ },
+ 'member_unmute': {
+ id: 'member_unmute',
+ title: formatMessage(messages.unmute),
+ handler: this.topicPermissionSetter.bind(this, '+P')
+ },
+ 'member_block': {
+ id: 'member_block',
+ title: formatMessage(messages.block),
+ handler: this.topicPermissionSetter.bind(this, '-JP')
+ },
+ 'member_unblock': {
+ id: 'member_unblock',
+ title: formatMessage(messages.unblock),
+ handler: this.topicPermissionSetter.bind(this, '+JP')
+ }
+ };
+ }
+
+ componentDidMount() {
+ document.addEventListener('mousedown', this.handlePageClick, false);
+ document.addEventListener('keyup', this.handleEscapeKey, false);
+ }
+
+ componentWillUnmount() {
+ document.removeEventListener('mousedown', this.handlePageClick, false);
+ document.removeEventListener('keyup', this.handleEscapeKey, false);
+ }
+
+ handlePageClick(e) {
+ if (react_dom__WEBPACK_IMPORTED_MODULE_1___default().findDOMNode(this).contains(e.target)) {
+ return;
+ }
+
+ e.preventDefault();
+ e.stopPropagation();
+ this.props.hide();
+ }
+
+ handleEscapeKey(e) {
+ if (e.keyCode === 27) {
+ this.props.hide();
+ }
+ }
+
+ handleClick(e) {
+ e.preventDefault();
+ e.stopPropagation();
+ this.props.hide();
+ let item = this.props.items[e.currentTarget.dataset.id];
+
+ if (typeof item == 'string') {
+ item = this.MenuItems[item];
+ }
+
+ if (!item) {
+ console.log("Invalid menu item ID", e.currentTarget.dataset.id);
+ } else {
+ this.props.onAction(item.id, item.handler(this.props.params, this.props.onError), this.props.params);
+ }
+ }
+
+ deleteMessages(all, hard, params, errorHandler) {
+ const topic = this.props.tinode.getTopic(params.topicName);
+
+ if (!topic) {
+ console.log("Topic not found: ", params.topicName);
+ return;
+ }
+
+ if (!all && topic.cancelSend(params.seq)) {
+ return;
+ }
+
+ const promise = all ? topic.delMessagesAll(hard) : topic.delMessagesList([params.seq], hard);
+ return promise.catch(err => {
+ if (errorHandler) {
+ errorHandler(err.message, 'err');
+ }
+ });
+ }
+
+ retryMessage(params, errorHandler) {
+ const topic = this.props.tinode.getTopic(params.topicName);
+
+ if (!topic || !topic.flushMessage(params.seq)) {
+ return;
+ }
+
+ const msg = topic.createMessage(params.content, false);
+ return topic.publishDraft(msg).catch(err => {
+ if (errorHandler) {
+ errorHandler(err.message, 'err');
+ }
+ });
+ }
+
+ topicPermissionSetter(mode, params, errorHandler) {
+ const topic = this.props.tinode.getTopic(params.topicName);
+
+ if (!topic) {
+ console.log("Topic not found", params.topicName);
+ return;
+ }
+
+ let result = topic.updateMode(params.user, mode);
+
+ if (errorHandler) {
+ result = result.catch(err => {
+ errorHandler(err.message, 'err');
+ });
+ }
+
+ return result;
+ }
+
+ render() {
+ let count = 0;
+ let menu = [];
+ this.props.items.map(item => {
+ if (typeof item == 'string') {
+ item = this.MenuItems[item];
+ }
+
+ if (item && item.title) {
+ menu.push(item.title == '-' ? react__WEBPACK_IMPORTED_MODULE_0___default().createElement("li", {
+ className: "separator",
+ key: count
+ }) : react__WEBPACK_IMPORTED_MODULE_0___default().createElement("li", {
+ onClick: this.handleClick,
+ "data-id": count,
+ key: count
+ }, item.title));
+ }
+
+ count++;
+ });
+ const hSize = 12 * _config_js__WEBPACK_IMPORTED_MODULE_3__.REM_SIZE;
+ const vSize = _config_js__WEBPACK_IMPORTED_MODULE_3__.REM_SIZE * (0.7 + menu.length * 2.5);
+ const left = this.props.bounds.right - this.props.clickAt.x < hSize ? this.props.clickAt.x - this.props.bounds.left - hSize : this.props.clickAt.x - this.props.bounds.left;
+ const top = this.props.bounds.bottom - this.props.clickAt.y < vSize ? this.props.clickAt.y - this.props.bounds.top - vSize : this.props.clickAt.y - this.props.bounds.top;
+ const position = {
+ left: left + 'px',
+ top: top + 'px'
+ };
+ return react__WEBPACK_IMPORTED_MODULE_0___default().createElement("ul", {
+ className: "menu",
+ style: position
+ }, menu);
+ }
+
+}
+
+/* harmony default export */ __webpack_exports__["default"] = ((0,react_intl__WEBPACK_IMPORTED_MODULE_2__.injectIntl)(ContextMenu));
+
+/***/ }),
+
+/***/ "./src/widgets/doc-preview.jsx":
+/*!*************************************!*\
+ !*** ./src/widgets/doc-preview.jsx ***!
+ \*************************************/
+/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
+
+__webpack_require__.r(__webpack_exports__);
+/* harmony export */ __webpack_require__.d(__webpack_exports__, {
+/* harmony export */ "default": function() { return /* binding */ DocPreview; }
+/* harmony export */ });
+/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "react");
+/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);
+/* harmony import */ var react_intl__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react-intl */ "react-intl");
+/* harmony import */ var react_intl__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react_intl__WEBPACK_IMPORTED_MODULE_1__);
+/* harmony import */ var _widgets_send_message_jsx__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../widgets/send-message.jsx */ "./src/widgets/send-message.jsx");
+/* harmony import */ var _lib_strformat_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../lib/strformat.js */ "./src/lib/strformat.js");
+
+
+
+
+
+function iconFromMime(mime) {
+ const mimeToIcon = {
+ default: 'insert_drive_file',
+ image: 'image',
+ text: 'description',
+ video: 'theaters'
+ };
+ return mimeToIcon[mime] || mimeToIcon[(mime || '').split('/')[0]] || mimeToIcon['default'];
+}
+
+class DocPreview extends (react__WEBPACK_IMPORTED_MODULE_0___default().PureComponent) {
+ constructor(props) {
+ super(props);
+ this.handleSendDoc = this.handleSendDoc.bind(this);
+ }
+
+ handleSendDoc(caption) {
+ this.props.onClose();
+ this.props.onSendMessage(this.props.content.file);
+ }
+
+ render() {
+ if (!this.props.content) {
+ return null;
+ }
+
+ return react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
+ id: "image-preview"
+ }, react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
+ id: "image-preview-caption-panel"
+ }, react__WEBPACK_IMPORTED_MODULE_0___default().createElement("span", null, this.props.content.filename), react__WEBPACK_IMPORTED_MODULE_0___default().createElement("a", {
+ href: "#",
+ onClick: e => {
+ e.preventDefault();
+ this.props.onClose();
+ }
+ }, react__WEBPACK_IMPORTED_MODULE_0___default().createElement("i", {
+ className: "material-icons gray"
+ }, "close"))), react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
+ id: "image-preview-container"
+ }, react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
+ className: "flex-column narrow"
+ }, react__WEBPACK_IMPORTED_MODULE_0___default().createElement("i", {
+ className: "material-icons gray"
+ }, iconFromMime(this.props.content.type)), react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", null, react__WEBPACK_IMPORTED_MODULE_0___default().createElement("b", null, react__WEBPACK_IMPORTED_MODULE_0___default().createElement(react_intl__WEBPACK_IMPORTED_MODULE_1__.FormattedMessage, {
+ id: "label_content_type"
+ })), " ", this.props.content.type || 'application/octet-stream'), react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", null, react__WEBPACK_IMPORTED_MODULE_0___default().createElement("b", null, react__WEBPACK_IMPORTED_MODULE_0___default().createElement(react_intl__WEBPACK_IMPORTED_MODULE_1__.FormattedMessage, {
+ id: "label_size"
+ })), " ", (0,_lib_strformat_js__WEBPACK_IMPORTED_MODULE_3__.bytesToHumanSize)(this.props.content.size)))), react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_widgets_send_message_jsx__WEBPACK_IMPORTED_MODULE_2__.default, {
+ noInput: true,
+ onSendMessage: this.handleSendDoc,
+ onError: this.props.onError
+ }));
+ }
+
+}
+;
+
+/***/ }),
+
+/***/ "./src/widgets/error-panel.jsx":
+/*!*************************************!*\
+ !*** ./src/widgets/error-panel.jsx ***!
+ \*************************************/
+/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
+
+__webpack_require__.r(__webpack_exports__);
+/* harmony export */ __webpack_require__.d(__webpack_exports__, {
+/* harmony export */ "default": function() { return /* binding */ ErrorPanel; }
+/* harmony export */ });
+/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "react");
+/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);
+/* harmony import */ var _menu_cancel_jsx__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./menu-cancel.jsx */ "./src/widgets/menu-cancel.jsx");
+
+
+class ErrorPanel extends (react__WEBPACK_IMPORTED_MODULE_0___default().PureComponent) {
+ constructor(props) {
+ super(props);
+ this.state = {
+ show: false
+ };
+ this.hide = this.hide.bind(this);
+ }
+
+ componentDidUpdate(prevProps) {
+ if (prevProps.level !== this.props.level) {
+ this.setState({
+ show: !!this.props.level
+ });
+ }
+ }
+
+ hide() {
+ this.setState({
+ show: false
+ });
+
+ if (this.props.onClearError) {
+ this.props.onClearError();
+ }
+ }
+
+ render() {
+ const icons = {
+ err: 'error',
+ warn: 'warning',
+ info: 'info'
+ };
+ const level = icons[this.props.level] || '';
+ const className = 'info-box ' + level;
+ return react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
+ className: className
+ }, react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
+ className: "icon"
+ }, react__WEBPACK_IMPORTED_MODULE_0___default().createElement("i", {
+ className: "material-icons"
+ }, level)), react__WEBPACK_IMPORTED_MODULE_0___default().createElement("span", null, this.props.text, this.props.action ? react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null, react__WEBPACK_IMPORTED_MODULE_0___default().createElement("a", {
+ href: "#",
+ style: {
+ whiteSpace: 'nowrap'
+ },
+ onClick: e => {
+ e.preventDefault();
+ this.props.action();
+ }
+ }, this.props.actionText)) : null), react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
+ className: "cancel"
+ }, react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_menu_cancel_jsx__WEBPACK_IMPORTED_MODULE_1__.default, {
+ onCancel: this.hide
+ })));
+ }
+
+}
+;
+
+/***/ }),
+
+/***/ "./src/widgets/file-progress.jsx":
+/*!***************************************!*\
+ !*** ./src/widgets/file-progress.jsx ***!
+ \***************************************/
+/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
+
+__webpack_require__.r(__webpack_exports__);
+/* harmony export */ __webpack_require__.d(__webpack_exports__, {
+/* harmony export */ "default": function() { return /* binding */ FileProgress; }
+/* harmony export */ });
+/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "react");
+/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);
+/* harmony import */ var react_intl__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react-intl */ "react-intl");
+/* harmony import */ var react_intl__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react_intl__WEBPACK_IMPORTED_MODULE_1__);
+
+
+class FileProgress extends (react__WEBPACK_IMPORTED_MODULE_0___default().PureComponent) {
+ render() {
+ return react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
+ className: "uploader"
+ }, react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", null, react__WEBPACK_IMPORTED_MODULE_0___default().createElement("span", {
+ style: {
+ width: this.props.progress * 100 + "%"
+ }
+ })), this.props.progress < 0.999 ? react__WEBPACK_IMPORTED_MODULE_0___default().createElement("a", {
+ href: "#",
+ onClick: e => {
+ e.preventDefault();
+ this.props.onCancel();
+ }
+ }, react__WEBPACK_IMPORTED_MODULE_0___default().createElement("i", {
+ className: "material-icons"
+ }, "close"), " ", react__WEBPACK_IMPORTED_MODULE_0___default().createElement(react_intl__WEBPACK_IMPORTED_MODULE_1__.FormattedMessage, {
+ id: "action_cancel",
+ defaultMessage: "cancel",
+ description: "Call to action [cancel]"
+ })) : react__WEBPACK_IMPORTED_MODULE_0___default().createElement(react_intl__WEBPACK_IMPORTED_MODULE_1__.FormattedMessage, {
+ id: "upload_finishing",
+ defaultMessage: "finishing...",
+ description: "Notification that upload is finishing"
+ }));
+ }
+
+}
+
+/***/ }),
+
+/***/ "./src/widgets/group-manager.jsx":
+/*!***************************************!*\
+ !*** ./src/widgets/group-manager.jsx ***!
+ \***************************************/
+/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
+
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "react");
+/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);
+/* harmony import */ var react_intl__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react-intl */ "react-intl");
+/* harmony import */ var react_intl__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react_intl__WEBPACK_IMPORTED_MODULE_1__);
+/* harmony import */ var _chip_input_jsx__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./chip-input.jsx */ "./src/widgets/chip-input.jsx");
+/* harmony import */ var _contact_list_jsx__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./contact-list.jsx */ "./src/widgets/contact-list.jsx");
+
+
+
+
+const messages = (0,react_intl__WEBPACK_IMPORTED_MODULE_1__.defineMessages)({
+ no_contacts: {
+ id: 'no_contacts',
+ defaultMessage: 'You have no contacts :-(',
+ description: 'Shown in ContactsView when the user has no contacts'
+ },
+ contacts_not_found_short: {
+ id: 'contacts_not_found_short',
+ defaultMessage: "No contacts match ''{query}''",
+ description: 'Shown in ContactsView when search returned no results'
+ }
+});
+
+class GroupManager extends (react__WEBPACK_IMPORTED_MODULE_0___default().Component) {
+ constructor(props) {
+ super(props);
+ this.state = {
+ members: props.members,
+ index: GroupManager.indexMembers(props.members),
+ staticMembers: GroupManager.staticMembers(props.members, props.keepInitialMembers, props.requiredMember),
+ contactFilter: '',
+ noContactsMessage: props.intl.formatMessage(messages.no_contacts),
+ selectedContacts: GroupManager.selectedContacts(props.members)
+ };
+ this.handleContactSelected = this.handleContactSelected.bind(this);
+ this.handleMemberRemoved = this.handleMemberRemoved.bind(this);
+ this.handleContactFilter = this.handleContactFilter.bind(this);
+ this.handleSubmit = this.handleSubmit.bind(this);
+ this.handleCancel = this.handleCancel.bind(this);
+ }
+
+ static indexMembers(members) {
+ let index = {};
+ members.map(m => {
+ index[m.user] = {
+ delta: 0,
+ present: true
+ };
+ });
+ return index;
+ }
+
+ static staticMembers(members, keepInitial, requiredMember) {
+ let stat = [];
+ members.map(m => {
+ if (keepInitial || m.user == requiredMember) {
+ stat.push(m.user);
+ }
+ });
+ return stat;
+ }
+
+ static selectedContacts(members) {
+ let sel = [];
+ members.map(m => {
+ sel.push(m.user);
+ });
+ return sel;
+ }
+
+ handleContactSelected(userId, index) {
+ let status = this.state.index[userId];
+
+ if (status) {
+ if (status.present) {
+ return;
+ }
+
+ status.delta += 1;
+ status.present = true;
+ } else {
+ status = {
+ delta: 1,
+ present: true
+ };
+ }
+
+ let m = this.state.members.slice();
+ m.push(this.props.contacts[index]);
+ const sel = GroupManager.selectedContacts(m);
+ const i = this.state.index;
+ i[userId] = status;
+ this.setState({
+ members: m,
+ index: i,
+ selectedContacts: sel
+ });
+ }
+
+ handleMemberRemoved(userId, index) {
+ const status = this.state.index[userId];
+
+ if (!status || !status.present) {
+ return;
+ }
+
+ status.present = false;
+ status.delta -= 1;
+ let m = this.state.members.slice();
+ m.splice(index, 1);
+ const sel = GroupManager.selectedContacts(m);
+ const i = this.state.index;
+ i[userId] = status;
+ this.setState({
+ members: m,
+ index: i,
+ selectedContacts: sel
+ });
+ }
+
+ handleContactFilter(val) {
+ const {
+ formatMessage
+ } = this.props.intl;
+ const msg = !val ? formatMessage(messages.no_contacts) : formatMessage(messages.contacts_not_found_short, {
+ query: val
+ });
+ this.setState({
+ contactFilter: val,
+ noContactsMessage: msg
+ });
+ }
+
+ static doContactFiltering(filter, values) {
+ if (filter) {
+ for (let i = 0; i < values.length; i++) {
+ if (values[i].indexOf(filter) >= 0) {
+ return true;
+ }
+ }
+
+ return false;
+ }
+
+ return true;
+ }
+
+ handleSubmit() {
+ var instance = this;
+ var members = [];
+ var added = [];
+ var removed = [];
+ var keys = Object.keys(this.state.index);
+ keys.map(function (k) {
+ if (instance.state.index[k].present) {
+ members.push(k);
+ }
+
+ if (instance.state.index[k].delta > 0) {
+ added.push(k);
+ } else if (instance.state.index[k].delta < 0) {
+ removed.push(k);
+ }
+ });
+ this.props.onSubmit(members, added, removed);
+ }
+
+ handleCancel() {
+ this.props.onCancel();
+ }
+
+ render() {
+ const {
+ formatMessage
+ } = this.props.intl;
+ return react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
+ id: "group-manager"
+ }, react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
+ className: "panel-form-row"
+ }, react__WEBPACK_IMPORTED_MODULE_0___default().createElement("label", {
+ className: "small"
+ }, react__WEBPACK_IMPORTED_MODULE_0___default().createElement(react_intl__WEBPACK_IMPORTED_MODULE_1__.FormattedMessage, {
+ id: "title_group_members",
+ defaultMessage: "Group Members",
+ description: "Section title"
+ }))), react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
+ className: "panel-form-row"
+ }, react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_chip_input_jsx__WEBPACK_IMPORTED_MODULE_2__.default, {
+ chips: this.state.members,
+ staticMembers: this.state.staticMembers,
+ prompt: "add members",
+ filterFunc: this.handleContactFilter,
+ onChipRemoved: this.handleMemberRemoved
+ })), react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
+ className: "panel-form-row"
+ }, react__WEBPACK_IMPORTED_MODULE_0___default().createElement("label", {
+ className: "small"
+ }, react__WEBPACK_IMPORTED_MODULE_0___default().createElement(react_intl__WEBPACK_IMPORTED_MODULE_1__.FormattedMessage, {
+ id: "title_all_contacts",
+ defaultMessage: "All Contacts",
+ description: "Section title [All Contacts]"
+ }))), react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_contact_list_jsx__WEBPACK_IMPORTED_MODULE_3__.default, {
+ contacts: this.props.contacts,
+ myUserId: this.props.myUserId,
+ topicSelected: this.state.selectedContacts,
+ filter: this.state.contactFilter,
+ filterFunc: GroupManager.doContactFiltering,
+ emptyListMessage: this.state.noContactsMessage,
+ showOnline: false,
+ showUnread: false,
+ onTopicSelected: this.handleContactSelected
+ }), react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
+ id: "group-manager-buttons",
+ className: "panel-form-row"
+ }, react__WEBPACK_IMPORTED_MODULE_0___default().createElement("button", {
+ className: "blue",
+ onClick: this.handleSubmit
+ }, react__WEBPACK_IMPORTED_MODULE_0___default().createElement(react_intl__WEBPACK_IMPORTED_MODULE_1__.FormattedMessage, {
+ id: "button_ok",
+ defaultMessage: "OK",
+ description: "Button [OK]"
+ })), react__WEBPACK_IMPORTED_MODULE_0___default().createElement("button", {
+ className: "white",
+ onClick: this.handleCancel
+ }, react__WEBPACK_IMPORTED_MODULE_0___default().createElement(react_intl__WEBPACK_IMPORTED_MODULE_1__.FormattedMessage, {
+ id: "button_cancel",
+ defaultMessage: "Cancel",
+ description: "Button [Cancel]"
+ }))));
+ }
+
+}
+
+;
+/* harmony default export */ __webpack_exports__["default"] = ((0,react_intl__WEBPACK_IMPORTED_MODULE_1__.injectIntl)(GroupManager));
+
+/***/ }),
+
+/***/ "./src/widgets/group-subs.jsx":
+/*!************************************!*\
+ !*** ./src/widgets/group-subs.jsx ***!
+ \************************************/
+/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
+
+__webpack_require__.r(__webpack_exports__);
+/* harmony export */ __webpack_require__.d(__webpack_exports__, {
+/* harmony export */ "default": function() { return /* binding */ GroupSubs; }
+/* harmony export */ });
+/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "react");
+/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);
+/* harmony import */ var react_intl__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react-intl */ "react-intl");
+/* harmony import */ var react_intl__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react_intl__WEBPACK_IMPORTED_MODULE_1__);
+/* harmony import */ var _config_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../config.js */ "./src/config.js");
+/* harmony import */ var _letter_tile_jsx__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./letter-tile.jsx */ "./src/widgets/letter-tile.jsx");
+/* harmony import */ var _lib_blob_helpers_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../lib/blob-helpers.js */ "./src/lib/blob-helpers.js");
+
+
+
+
+
+class GroupSubs extends (react__WEBPACK_IMPORTED_MODULE_0___default().Component) {
+ constructor(props) {
+ super(props);
+ }
+
+ render() {
+ const usersOnline = [];
+ const totalCount = (this.props.subscribers || []).length;
+ const countToShow = Math.min(_config_js__WEBPACK_IMPORTED_MODULE_2__.MAX_ONLINE_IN_TOPIC, totalCount);
+ (this.props.subscribers || []).some(sub => {
+ usersOnline.push(react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
+ className: "avatar-box",
+ key: sub.user
+ }, react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_letter_tile_jsx__WEBPACK_IMPORTED_MODULE_3__.default, {
+ topic: sub.user,
+ avatar: (0,_lib_blob_helpers_js__WEBPACK_IMPORTED_MODULE_4__.makeImageUrl)(sub.public ? sub.public.photo : null) || true,
+ title: sub.public ? sub.public.fn : null
+ })));
+ return usersOnline.length == countToShow;
+ });
+ return react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
+ id: "topic-users"
+ }, usersOnline, " ", totalCount > countToShow ? react__WEBPACK_IMPORTED_MODULE_0___default().createElement("span", null, react__WEBPACK_IMPORTED_MODULE_0___default().createElement(react_intl__WEBPACK_IMPORTED_MODULE_1__.FormattedMessage, {
+ id: "more_online_members",
+ defaultMessage: "+{overflow} more",
+ description: "Shown in MessagesView title bar when the number of online subscribers exceeds MAX_ONLINE_IN_TOPIC",
+ values: {
+ overflow: totalCount - countToShow
+ }
+ })) : null);
+ }
+
+}
+;
+
+/***/ }),
+
+/***/ "./src/widgets/host-selector.jsx":
+/*!***************************************!*\
+ !*** ./src/widgets/host-selector.jsx ***!
+ \***************************************/
+/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
+
+__webpack_require__.r(__webpack_exports__);
+/* harmony export */ __webpack_require__.d(__webpack_exports__, {
+/* harmony export */ "default": function() { return /* binding */ HostSelector; }
+/* harmony export */ });
+/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "react");
+/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);
+/* harmony import */ var _config_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../config.js */ "./src/config.js");
+
+
+class HostSelector extends (react__WEBPACK_IMPORTED_MODULE_0___default().PureComponent) {
+ constructor(props) {
+ super(props);
+ this.state = {
+ hostName: props.serverAddress,
+ changed: false
+ };
+ this.handleHostNameChange = this.handleHostNameChange.bind(this);
+ this.handleEditingFinished = this.handleEditingFinished.bind(this);
+ }
+
+ handleHostNameChange(e) {
+ this.setState({
+ hostName: e.target.value,
+ changed: true
+ });
+ }
+
+ handleEditingFinished() {
+ if (this.state.changed) {
+ this.setState({
+ changed: false
+ });
+ this.props.onServerAddressChange(this.state.hostName.trim());
+ }
+ }
+
+ render() {
+ var hostOptions = [];
+
+ for (let key in _config_js__WEBPACK_IMPORTED_MODULE_1__.KNOWN_HOSTS) {
+ let item = _config_js__WEBPACK_IMPORTED_MODULE_1__.KNOWN_HOSTS[key];
+ hostOptions.push(react__WEBPACK_IMPORTED_MODULE_0___default().createElement("option", {
+ key: item,
+ value: item
+ }));
+ }
+
+ return react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
+ className: "panel-form-row"
+ }, react__WEBPACK_IMPORTED_MODULE_0___default().createElement("input", {
+ type: "search",
+ id: "host-name",
+ placeholder: this.props.hostName,
+ list: "known-hosts",
+ className: "quoted",
+ value: this.state.hostName,
+ onChange: this.handleHostNameChange,
+ onBlur: this.handleEditingFinished,
+ required: true
+ }), react__WEBPACK_IMPORTED_MODULE_0___default().createElement("datalist", {
+ id: "known-hosts"
+ }, hostOptions));
+ }
+
+}
+
+/***/ }),
+
+/***/ "./src/widgets/image-preview.jsx":
+/*!***************************************!*\
+ !*** ./src/widgets/image-preview.jsx ***!
+ \***************************************/
+/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
+
+__webpack_require__.r(__webpack_exports__);
+/* harmony export */ __webpack_require__.d(__webpack_exports__, {
+/* harmony export */ "default": function() { return /* binding */ ImagePreview; }
+/* harmony export */ });
+/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "react");
+/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);
+/* harmony import */ var react_intl__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react-intl */ "react-intl");
+/* harmony import */ var react_intl__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react_intl__WEBPACK_IMPORTED_MODULE_1__);
+/* harmony import */ var _widgets_send_message_jsx__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../widgets/send-message.jsx */ "./src/widgets/send-message.jsx");
+/* harmony import */ var _config_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../config.js */ "./src/config.js");
+/* harmony import */ var _lib_blob_helpers_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../lib/blob-helpers.js */ "./src/lib/blob-helpers.js");
+/* harmony import */ var _lib_strformat_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../lib/strformat.js */ "./src/lib/strformat.js");
+
+
+
+
+
+
+class ImagePreview extends (react__WEBPACK_IMPORTED_MODULE_0___default().PureComponent) {
+ constructor(props) {
+ super(props);
+ this.state = {
+ width: 0,
+ height: 0
+ };
+ this.handleSendImage = this.handleSendImage.bind(this);
+ }
+
+ assignWidth(node) {
+ if (node && !this.state.width) {
+ const bounds = node.getBoundingClientRect();
+ this.setState({
+ width: bounds.width | 0,
+ height: bounds.height | 0
+ });
+ }
+ }
+
+ handleSendImage(caption) {
+ this.props.onClose();
+ this.props.onSendMessage(caption, this.props.content.blob);
+ }
+
+ render() {
+ if (!this.props.content) {
+ return null;
+ }
+
+ const dim = (0,_lib_blob_helpers_js__WEBPACK_IMPORTED_MODULE_4__.fitImageSize)(this.props.content.width, this.props.content.height, this.state.width, this.state.height, false);
+ const size = dim ? {
+ width: dim.dstWidth + 'px',
+ height: dim.dstHeight + 'px'
+ } : this.props.content.width > this.props.content.height ? {
+ width: '100%'
+ } : {
+ height: '100%'
+ };
+ size.maxWidth = '100%';
+ size.maxHeight = '100%';
+ let filename = this.props.content.filename;
+ const maxlength = Math.max((this.state.width / _config_js__WEBPACK_IMPORTED_MODULE_3__.REM_SIZE / 1.5 | 0) - 2, 12);
+
+ if (filename.length > maxlength) {
+ filename = filename.slice(0, maxlength / 2 - 1) + '…' + filename.slice(1 - maxlength / 2);
+ }
+
+ const width = this.props.content.width || '-';
+ const height = this.props.content.height || '-';
+ return react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
+ id: "image-preview"
+ }, react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
+ id: "image-preview-caption-panel"
+ }, !this.props.onSendMessage ? react__WEBPACK_IMPORTED_MODULE_0___default().createElement("a", {
+ href: this.props.content.url,
+ download: this.props.content.filename
+ }, react__WEBPACK_IMPORTED_MODULE_0___default().createElement("i", {
+ className: "material-icons"
+ }, "file_download"), " ", react__WEBPACK_IMPORTED_MODULE_0___default().createElement(react_intl__WEBPACK_IMPORTED_MODULE_1__.FormattedMessage, {
+ id: "download_action",
+ defaultMessage: "download",
+ description: "Call to action [download]"
+ })) : react__WEBPACK_IMPORTED_MODULE_0___default().createElement("span", null, this.props.content.filename), react__WEBPACK_IMPORTED_MODULE_0___default().createElement("a", {
+ href: "#",
+ onClick: e => {
+ e.preventDefault();
+ this.props.onClose();
+ }
+ }, react__WEBPACK_IMPORTED_MODULE_0___default().createElement("i", {
+ className: "material-icons gray"
+ }, "close"))), react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
+ id: "image-preview-container",
+ ref: node => this.assignWidth(node)
+ }, react__WEBPACK_IMPORTED_MODULE_0___default().createElement("img", {
+ src: this.props.content.url,
+ style: size,
+ className: "image-preview",
+ alt: this.props.content.filename
+ })), this.props.onSendMessage ? react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_widgets_send_message_jsx__WEBPACK_IMPORTED_MODULE_2__.default, {
+ messagePrompt: "add_image_caption",
+ acceptBlank: true,
+ onSendMessage: this.handleSendImage,
+ onError: this.props.onError
+ }) : react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
+ id: "image-preview-footer"
+ }, react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", null, react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", null, react__WEBPACK_IMPORTED_MODULE_0___default().createElement("b", null, react__WEBPACK_IMPORTED_MODULE_0___default().createElement(react_intl__WEBPACK_IMPORTED_MODULE_1__.FormattedMessage, {
+ id: "label_file_name",
+ defaultMessage: "File name:",
+ description: "Label for a file name"
+ }))), react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", null, react__WEBPACK_IMPORTED_MODULE_0___default().createElement("span", {
+ title: this.props.content.filename
+ }, filename ? filename : '-'))), react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", null, react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", null, react__WEBPACK_IMPORTED_MODULE_0___default().createElement("b", null, react__WEBPACK_IMPORTED_MODULE_0___default().createElement(react_intl__WEBPACK_IMPORTED_MODULE_1__.FormattedMessage, {
+ id: "label_content_type",
+ defaultMessage: "Content type:",
+ description: "Label for file content type (mime)"
+ }))), react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", null, this.props.content.type)), react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", null, react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", null, react__WEBPACK_IMPORTED_MODULE_0___default().createElement("b", null, react__WEBPACK_IMPORTED_MODULE_0___default().createElement(react_intl__WEBPACK_IMPORTED_MODULE_1__.FormattedMessage, {
+ id: "label_size",
+ defaultMessage: "Size:",
+ description: "Label for file size"
+ }))), react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", null, width, " \xD7 ", height, " px; ", (0,_lib_strformat_js__WEBPACK_IMPORTED_MODULE_5__.bytesToHumanSize)(this.props.content.size)))));
+ }
+
+}
+;
+
+/***/ }),
+
+/***/ "./src/widgets/in-place-edit.jsx":
+/*!***************************************!*\
+ !*** ./src/widgets/in-place-edit.jsx ***!
+ \***************************************/
+/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
+
+__webpack_require__.r(__webpack_exports__);
+/* harmony export */ __webpack_require__.d(__webpack_exports__, {
+/* harmony export */ "default": function() { return /* binding */ InPlaceEdit; }
+/* harmony export */ });
+/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "react");
+/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);
+/* harmony import */ var react_dom__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react-dom */ "react-dom");
+/* harmony import */ var react_dom__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react_dom__WEBPACK_IMPORTED_MODULE_1__);
+/* harmony import */ var _visible_password_jsx__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./visible-password.jsx */ "./src/widgets/visible-password.jsx");
+
+
+
+class InPlaceEdit extends (react__WEBPACK_IMPORTED_MODULE_0___default().Component) {
+ constructor(props) {
+ super(props);
+ this.state = {
+ active: props.active,
+ initialValue: props.value || '',
+ value: props.value || ''
+ };
+ this.handeTextChange = this.handeTextChange.bind(this);
+ this.handleKeyDown = this.handleKeyDown.bind(this);
+ this.handleStartEditing = this.handleStartEditing.bind(this);
+ this.handleEditingFinished = this.handleEditingFinished.bind(this);
+ this.handlePasswordFinished = this.handlePasswordFinished.bind(this);
+ }
+
+ componentDidUpdate(prevProps, prevState) {
+ const newValue = this.props.value || '';
+
+ if (prevState.initialValue != newValue && !prevState.active) {
+ this.setState({
+ initialValue: newValue,
+ value: newValue
+ });
+ }
+ }
+
+ handeTextChange(e) {
+ this.setState({
+ value: e.target.value
+ });
+ }
+
+ handleKeyDown(e) {
+ if (e.keyCode === 27) {
+ this.setState({
+ value: this.props.value,
+ active: false
+ });
+ } else if (e.keyCode === 13) {
+ this.handleEditingFinished(e);
+ }
+ }
+
+ handleStartEditing() {
+ if (!this.props.readOnly) {
+ react_dom__WEBPACK_IMPORTED_MODULE_1___default().findDOMNode(this).focus();
+ this.setState({
+ active: true
+ });
+ }
+ }
+
+ handleEditingFinished(event) {
+ if (this.props.required && !event.target.checkValidity()) {
+ this.setState({
+ value: this.props.value,
+ active: false
+ });
+ return;
+ }
+
+ this.setState({
+ active: false
+ });
+ let value = this.state.value.trim();
+
+ if ((value || this.props.value) && value !== this.props.value) {
+ this.props.onFinished(value);
+ }
+ }
+
+ handlePasswordFinished(value) {
+ this.setState({
+ active: false
+ });
+
+ if (value && value !== this.props.value) {
+ this.props.onFinished(value);
+ }
+ }
+
+ render() {
+ if (this.state.active) {
+ var fieldType = this.props.type || 'text';
+ } else {
+ var spanText = this.props.type == 'password' ? '••••••••' : this.state.value;
+ var spanClass = 'in-place-edit' + (this.props.readOnly ? ' disabled' : '');
+
+ if (!spanText) {
+ spanText = this.props.placeholder;
+ spanClass += ' placeholder';
+ }
+
+ if (spanText.length > 20) {
+ spanText = spanText.substring(0, 19) + '...';
+ }
+ }
+
+ return this.state.active ? fieldType == 'password' ? react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_visible_password_jsx__WEBPACK_IMPORTED_MODULE_2__.default, {
+ value: this.state.value,
+ placeholder: this.props.placeholder,
+ required: this.props.required ? 'required' : '',
+ autoComplete: this.props.autoComplete,
+ autoFocus: true,
+ onFinished: this.handlePasswordFinished
+ }) : react__WEBPACK_IMPORTED_MODULE_0___default().createElement("input", {
+ type: fieldType,
+ value: this.state.value,
+ placeholder: this.props.placeholder,
+ required: this.props.required ? 'required' : '',
+ autoComplete: this.props.autoComplete,
+ autoFocus: true,
+ onChange: this.handeTextChange,
+ onKeyDown: this.handleKeyDown,
+ onBlur: this.handleEditingFinished
+ }) : react__WEBPACK_IMPORTED_MODULE_0___default().createElement("span", {
+ className: spanClass,
+ onClick: this.handleStartEditing
+ }, react__WEBPACK_IMPORTED_MODULE_0___default().createElement("span", {
+ className: "content"
+ }, spanText));
+ }
+
+}
+;
+
+/***/ }),
+
+/***/ "./src/widgets/invitation.jsx":
+/*!************************************!*\
+ !*** ./src/widgets/invitation.jsx ***!
+ \************************************/
+/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
+
+__webpack_require__.r(__webpack_exports__);
+/* harmony export */ __webpack_require__.d(__webpack_exports__, {
+/* harmony export */ "default": function() { return /* binding */ Invitation; }
+/* harmony export */ });
+/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "react");
+/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);
+/* harmony import */ var react_intl__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react-intl */ "react-intl");
+/* harmony import */ var react_intl__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react_intl__WEBPACK_IMPORTED_MODULE_1__);
+
+
+class Invitation extends (react__WEBPACK_IMPORTED_MODULE_0___default().PureComponent) {
+ constructor(props) {
+ super(props);
+ this.handleButtonAction = this.handleButtonAction.bind(this);
+ }
+
+ handleButtonAction(evt, data) {
+ evt.preventDefault();
+ this.props.onAction(data);
+ }
+
+ render() {
+ return react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
+ className: "accept-invite-panel"
+ }, react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
+ className: "title"
+ }, react__WEBPACK_IMPORTED_MODULE_0___default().createElement(react_intl__WEBPACK_IMPORTED_MODULE_1__.FormattedMessage, {
+ id: "chat_invitation",
+ defaultMessage: "You are invited to start a new chat. What would you like to do?",
+ description: "New chat invitation message: [Accept] [Ignore] [Block]."
+ })), react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
+ className: "footer"
+ }, react__WEBPACK_IMPORTED_MODULE_0___default().createElement("button", {
+ className: "blue",
+ onClick: event => {
+ this.handleButtonAction(event, "accept");
+ }
+ }, react__WEBPACK_IMPORTED_MODULE_0___default().createElement(react_intl__WEBPACK_IMPORTED_MODULE_1__.FormattedMessage, {
+ id: "chat_invitation_accept",
+ defaultMessage: "Accept",
+ description: "Action [Accept] for chat invitation."
+ })), react__WEBPACK_IMPORTED_MODULE_0___default().createElement("button", {
+ className: "white",
+ onClick: event => {
+ this.handleButtonAction(event, "delete");
+ }
+ }, react__WEBPACK_IMPORTED_MODULE_0___default().createElement(react_intl__WEBPACK_IMPORTED_MODULE_1__.FormattedMessage, {
+ id: "chat_invitation_ignore",
+ defaultMessage: "Ignore",
+ description: "Action [Ignore] for chat invitation."
+ })), react__WEBPACK_IMPORTED_MODULE_0___default().createElement("button", {
+ className: "white",
+ onClick: event => {
+ this.handleButtonAction(event, "block");
+ }
+ }, react__WEBPACK_IMPORTED_MODULE_0___default().createElement(react_intl__WEBPACK_IMPORTED_MODULE_1__.FormattedMessage, {
+ id: "chat_invitation_block",
+ defaultMessage: "Block",
+ description: "Action [Block] for chat invitation."
+ }))));
+ }
+
+}
+;
+
+/***/ }),
+
+/***/ "./src/widgets/letter-tile.jsx":
+/*!*************************************!*\
+ !*** ./src/widgets/letter-tile.jsx ***!
+ \*************************************/
+/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
+
+__webpack_require__.r(__webpack_exports__);
+/* harmony export */ __webpack_require__.d(__webpack_exports__, {
+/* harmony export */ "default": function() { return /* binding */ LetterTile; }
+/* harmony export */ });
+/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "react");
+/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);
+/* harmony import */ var tinode_sdk__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! tinode-sdk */ "tinode-sdk");
+/* harmony import */ var tinode_sdk__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(tinode_sdk__WEBPACK_IMPORTED_MODULE_1__);
+/* harmony import */ var _lib_strformat_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../lib/strformat.js */ "./src/lib/strformat.js");
+
+
+
+class LetterTile extends (react__WEBPACK_IMPORTED_MODULE_0___default().PureComponent) {
+ render() {
+ let avatar;
+
+ if (this.props.avatar === true) {
+ const isGroup = tinode_sdk__WEBPACK_IMPORTED_MODULE_1___default().topicType(this.props.topic) == 'grp';
+ const iconColor = (isGroup ? 'light-color' : 'dark-color') + Math.abs((0,_lib_strformat_js__WEBPACK_IMPORTED_MODULE_2__.stringHash)(this.props.topic)) % 16;
+
+ if (this.props.topic && this.props.title && this.props.title.trim()) {
+ const letter = this.props.title.trim().charAt(0);
+ const className = 'lettertile ' + iconColor;
+ avatar = react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
+ className: className
+ }, react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", null, letter));
+ } else {
+ const className = 'material-icons ' + iconColor;
+ avatar = isGroup ? react__WEBPACK_IMPORTED_MODULE_0___default().createElement("i", {
+ className: className
+ }, "group") : react__WEBPACK_IMPORTED_MODULE_0___default().createElement("i", {
+ className: className
+ }, "person");
+ }
+ } else if (this.props.avatar) {
+ avatar = react__WEBPACK_IMPORTED_MODULE_0___default().createElement("img", {
+ className: "avatar",
+ alt: "avatar",
+ src: this.props.avatar,
+ onError: e => {
+ e.target.onerror = null;
+ e.target.src = "/img/broken_image.png";
+ }
+ });
+ } else {
+ avatar = null;
+ }
+
+ return avatar;
+ }
+
+}
+
+/***/ }),
+
+/***/ "./src/widgets/load-spinner.jsx":
+/*!**************************************!*\
+ !*** ./src/widgets/load-spinner.jsx ***!
+ \**************************************/
+/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
+
+__webpack_require__.r(__webpack_exports__);
+/* harmony export */ __webpack_require__.d(__webpack_exports__, {
+/* harmony export */ "default": function() { return /* binding */ LoadSpinner; }
+/* harmony export */ });
+/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "react");
+/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);
+
+class LoadSpinner extends (react__WEBPACK_IMPORTED_MODULE_0___default().PureComponent) {
+ render() {
+ return this.props.show ? react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
+ className: "load-spinner-box"
+ }, react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
+ className: "loader-spinner"
+ })) : null;
+ }
+
+}
+
+/***/ }),
+
+/***/ "./src/widgets/menu-cancel.jsx":
+/*!*************************************!*\
+ !*** ./src/widgets/menu-cancel.jsx ***!
+ \*************************************/
+/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
+
+__webpack_require__.r(__webpack_exports__);
+/* harmony export */ __webpack_require__.d(__webpack_exports__, {
+/* harmony export */ "default": function() { return /* binding */ MenuCancel; }
+/* harmony export */ });
+/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "react");
+/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);
+
+class MenuCancel extends (react__WEBPACK_IMPORTED_MODULE_0___default().PureComponent) {
+ render() {
+ return react__WEBPACK_IMPORTED_MODULE_0___default().createElement("a", {
+ href: "#",
+ onClick: e => {
+ e.preventDefault();
+ this.props.onCancel();
+ }
+ }, react__WEBPACK_IMPORTED_MODULE_0___default().createElement("i", {
+ className: "material-icons"
+ }, "close"));
+ }
+
+}
+
+/***/ }),
+
+/***/ "./src/widgets/menu-contacts.jsx":
+/*!***************************************!*\
+ !*** ./src/widgets/menu-contacts.jsx ***!
+ \***************************************/
+/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
+
+__webpack_require__.r(__webpack_exports__);
+/* harmony export */ __webpack_require__.d(__webpack_exports__, {
+/* harmony export */ "default": function() { return /* binding */ MenuContacts; }
+/* harmony export */ });
+/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "react");
+/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);
+
+class MenuContacts extends (react__WEBPACK_IMPORTED_MODULE_0___default().PureComponent) {
+ render() {
+ return react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", null, react__WEBPACK_IMPORTED_MODULE_0___default().createElement("a", {
+ href: "#",
+ onClick: e => {
+ e.preventDefault();
+ this.props.onNewTopic();
+ }
+ }, react__WEBPACK_IMPORTED_MODULE_0___default().createElement("i", {
+ className: "material-icons"
+ }, "chat")), "\xA0", react__WEBPACK_IMPORTED_MODULE_0___default().createElement("a", {
+ href: "#",
+ onClick: e => {
+ e.preventDefault();
+ this.props.onSettings();
+ }
+ }, react__WEBPACK_IMPORTED_MODULE_0___default().createElement("i", {
+ className: "material-icons"
+ }, "settings")));
+ }
+
+}
+;
+
+/***/ }),
+
+/***/ "./src/widgets/menu-start.jsx":
+/*!************************************!*\
+ !*** ./src/widgets/menu-start.jsx ***!
+ \************************************/
+/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
+
+__webpack_require__.r(__webpack_exports__);
+/* harmony export */ __webpack_require__.d(__webpack_exports__, {
+/* harmony export */ "default": function() { return /* binding */ MenuStart; }
+/* harmony export */ });
+/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "react");
+/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);
+
+class MenuStart extends (react__WEBPACK_IMPORTED_MODULE_0___default().PureComponent) {
+ render() {
+ return react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", null, react__WEBPACK_IMPORTED_MODULE_0___default().createElement("a", {
+ href: "#",
+ onClick: e => {
+ e.preventDefault();
+ this.props.onSignUp();
+ }
+ }, react__WEBPACK_IMPORTED_MODULE_0___default().createElement("i", {
+ className: "material-icons"
+ }, "person_add")), "\xA0", react__WEBPACK_IMPORTED_MODULE_0___default().createElement("a", {
+ href: "#",
+ onClick: e => {
+ e.preventDefault();
+ this.props.onSettings();
+ }
+ }, react__WEBPACK_IMPORTED_MODULE_0___default().createElement("i", {
+ className: "material-icons"
+ }, "settings")));
+ }
+
+}
+;
+
+/***/ }),
+
+/***/ "./src/widgets/more-button.jsx":
+/*!*************************************!*\
+ !*** ./src/widgets/more-button.jsx ***!
+ \*************************************/
+/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
+
+__webpack_require__.r(__webpack_exports__);
+/* harmony export */ __webpack_require__.d(__webpack_exports__, {
+/* harmony export */ "default": function() { return /* binding */ MoreButton; }
+/* harmony export */ });
+/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "react");
+/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);
+
+class MoreButton extends (react__WEBPACK_IMPORTED_MODULE_0___default().PureComponent) {
+ constructor(props) {
+ super(props);
+ this.state = {
+ open: props.open
+ };
+ this.handleToggle = this.handleToggle.bind(this);
+ }
+
+ handleToggle() {
+ const open = !this.state.open;
+ this.setState({
+ open: open
+ });
+
+ if (this.props.onToggle) {
+ this.props.onToggle(open);
+ }
+ }
+
+ render() {
+ return react__WEBPACK_IMPORTED_MODULE_0___default().createElement("label", {
+ className: "small clean-clickable",
+ onClick: this.handleToggle
+ }, this.props.title, "...", this.state.open ? react__WEBPACK_IMPORTED_MODULE_0___default().createElement("i", {
+ className: "material-icons"
+ }, "expand_more") : react__WEBPACK_IMPORTED_MODULE_0___default().createElement("i", {
+ className: "material-icons"
+ }, "chevron_right"));
+ }
+
+}
+
+/***/ }),
+
+/***/ "./src/widgets/new-topic-by-id.jsx":
+/*!*****************************************!*\
+ !*** ./src/widgets/new-topic-by-id.jsx ***!
+ \*****************************************/
+/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
+
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "react");
+/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);
+/* harmony import */ var react_intl__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react-intl */ "react-intl");
+/* harmony import */ var react_intl__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react_intl__WEBPACK_IMPORTED_MODULE_1__);
+
+
+const messages = (0,react_intl__WEBPACK_IMPORTED_MODULE_1__.defineMessages)({
+ invalid_id: {
+ id: 'error_invalid_id',
+ defaultMessage: 'Invalid ID',
+ description: 'Error message'
+ }
+});
+
+class NewTopicById extends (react__WEBPACK_IMPORTED_MODULE_0___default().PureComponent) {
+ constructor(props) {
+ super(props);
+ this.state = {
+ groupId: ''
+ };
+ this.handleChange = this.handleChange.bind(this);
+ this.handleKeyPress = this.handleKeyPress.bind(this);
+ this.handleSubmit = this.handleSubmit.bind(this);
+ }
+
+ handleChange(e) {
+ this.setState({
+ groupId: e.target.value
+ });
+ }
+
+ handleKeyPress(e) {
+ if (e.key === 'Enter') {
+ this.handleSubmit(e);
+ }
+ }
+
+ handleSubmit(e) {
+ e.preventDefault();
+
+ if (this.state.groupId) {
+ var name = this.state.groupId.trim();
+
+ if (name.length > 3 && (name.substr(0, 3) == 'usr' || name.substr(0, 3) == 'grp')) {
+ this.props.onSubmit(name);
+ } else {
+ this.props.onError(this.props.intl.formatMessage(messages.invalid_id), 'err');
+ }
+ }
+ }
+
+ render() {
+ return react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
+ className: "panel-form"
+ }, react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
+ className: "panel-form-row"
+ }, react__WEBPACK_IMPORTED_MODULE_0___default().createElement(react_intl__WEBPACK_IMPORTED_MODULE_1__.FormattedMessage, {
+ id: "group_user_id_prompt",
+ defaultMessage: "Group or User ID",
+ description: "Prompt for entering user or group ID"
+ }, prompt => react__WEBPACK_IMPORTED_MODULE_0___default().createElement("input", {
+ type: "text",
+ placeholder: prompt,
+ value: this.state.groupId,
+ onChange: this.handleChange,
+ onKeyPress: this.handleKeyPress,
+ required: true,
+ autoFocus: true
+ }))), react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
+ className: "dialog-buttons"
+ }, react__WEBPACK_IMPORTED_MODULE_0___default().createElement("button", {
+ className: "blue",
+ onClick: this.handleSubmit
+ }, react__WEBPACK_IMPORTED_MODULE_0___default().createElement(react_intl__WEBPACK_IMPORTED_MODULE_1__.FormattedMessage, {
+ id: "button_subscribe",
+ defaultMessage: "Subscribe",
+ description: "Button [Subscribe]"
+ }))));
+ }
+
+}
+
+;
+/* harmony default export */ __webpack_exports__["default"] = ((0,react_intl__WEBPACK_IMPORTED_MODULE_1__.injectIntl)(NewTopicById));
+
+/***/ }),
+
+/***/ "./src/widgets/new-topic-group.jsx":
+/*!*****************************************!*\
+ !*** ./src/widgets/new-topic-group.jsx ***!
+ \*****************************************/
+/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
+
+__webpack_require__.r(__webpack_exports__);
+/* harmony export */ __webpack_require__.d(__webpack_exports__, {
+/* harmony export */ "default": function() { return /* binding */ NewTopicGroup; }
+/* harmony export */ });
+/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "react");
+/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);
+/* harmony import */ var react_intl__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react-intl */ "react-intl");
+/* harmony import */ var react_intl__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react_intl__WEBPACK_IMPORTED_MODULE_1__);
+/* harmony import */ var _avatar_upload_jsx__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./avatar-upload.jsx */ "./src/widgets/avatar-upload.jsx");
+/* harmony import */ var _checkbox_jsx__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./checkbox.jsx */ "./src/widgets/checkbox.jsx");
+/* harmony import */ var _tag_manager_jsx__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./tag-manager.jsx */ "./src/widgets/tag-manager.jsx");
+/* harmony import */ var _config_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../config.js */ "./src/config.js");
+
+
+
+
+
+
+class NewTopicGroup extends (react__WEBPACK_IMPORTED_MODULE_0___default().PureComponent) {
+ constructor(props) {
+ super(props);
+ this.state = {
+ fn: '',
+ private: '',
+ imageDataUrl: null,
+ tags: [],
+ isChannel: false
+ };
+ this.handleFnChange = this.handleFnChange.bind(this);
+ this.handlePrivateChange = this.handlePrivateChange.bind(this);
+ this.handleImageChanged = this.handleImageChanged.bind(this);
+ this.handleTagsChanged = this.handleTagsChanged.bind(this);
+ this.handleChannelToggle = this.handleChannelToggle.bind(this);
+ this.handleSubmit = this.handleSubmit.bind(this);
+ }
+
+ handleFnChange(e) {
+ this.setState({
+ fn: e.target.value
+ });
+ }
+
+ handlePrivateChange(e) {
+ this.setState({
+ private: e.target.value
+ });
+ }
+
+ handleImageChanged(img) {
+ this.setState({
+ imageDataUrl: img
+ });
+ }
+
+ handleTagsChanged(tags) {
+ this.setState({
+ tags: tags
+ });
+ }
+
+ handleChannelToggle() {
+ this.setState({
+ isChannel: !this.state.isChannel
+ });
+ }
+
+ handleSubmit(e) {
+ e.preventDefault();
+ const fn = this.state.fn.trim().substring(0, _config_js__WEBPACK_IMPORTED_MODULE_5__.MAX_TITLE_LENGTH);
+ const comment = this.state.private.trim().substring(0, _config_js__WEBPACK_IMPORTED_MODULE_5__.MAX_TITLE_LENGTH);
+
+ if (fn) {
+ this.props.onSubmit(fn, this.state.imageDataUrl, comment, this.state.tags, this.state.isChannel);
+ }
+ }
+
+ render() {
+ var submitClasses = 'blue';
+
+ if (this.props.disabled) {
+ submitClasses += ' disabled';
+ }
+
+ return react__WEBPACK_IMPORTED_MODULE_0___default().createElement("form", {
+ className: "panel-form",
+ onSubmit: this.handleSubmit
+ }, react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
+ className: "panel-form-row"
+ }, react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
+ className: "panel-form-column"
+ }, react__WEBPACK_IMPORTED_MODULE_0___default().createElement("label", {
+ className: "small",
+ htmlFor: "new-topic-fn"
+ }, react__WEBPACK_IMPORTED_MODULE_0___default().createElement(react_intl__WEBPACK_IMPORTED_MODULE_1__.FormattedMessage, {
+ id: "label_topic_name"
+ })), react__WEBPACK_IMPORTED_MODULE_0___default().createElement(react_intl__WEBPACK_IMPORTED_MODULE_1__.FormattedMessage, {
+ id: "topic_name_editing_placeholder",
+ defaultMessage: "Freeform name of the group",
+ description: "Prompt for entering topic name"
+ }, placeholder => react__WEBPACK_IMPORTED_MODULE_0___default().createElement("input", {
+ type: "text",
+ id: "new-topic-fn",
+ placeholder: placeholder,
+ value: this.state.fn,
+ onChange: this.handleFnChange,
+ autoFocus: true,
+ required: true
+ })), react__WEBPACK_IMPORTED_MODULE_0___default().createElement("br", null), react__WEBPACK_IMPORTED_MODULE_0___default().createElement("label", {
+ className: "small",
+ htmlFor: "new-topic-priv"
+ }, react__WEBPACK_IMPORTED_MODULE_0___default().createElement(react_intl__WEBPACK_IMPORTED_MODULE_1__.FormattedMessage, {
+ id: "label_private"
+ })), react__WEBPACK_IMPORTED_MODULE_0___default().createElement(react_intl__WEBPACK_IMPORTED_MODULE_1__.FormattedMessage, {
+ id: "private_editing_placeholder"
+ }, placeholder => react__WEBPACK_IMPORTED_MODULE_0___default().createElement("input", {
+ type: "text",
+ id: "new-topic-priv",
+ placeholder: placeholder,
+ value: this.state.private,
+ onChange: this.handlePrivateChange
+ }))), react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_avatar_upload_jsx__WEBPACK_IMPORTED_MODULE_2__.default, {
+ onError: this.props.onError,
+ onImageChanged: this.handleImageChanged
+ })), react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
+ className: "panel-form-row"
+ }, react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_checkbox_jsx__WEBPACK_IMPORTED_MODULE_3__.default, {
+ checked: this.state.isChannel,
+ onChange: this.handleChannelToggle
+ }), "\xA0", react__WEBPACK_IMPORTED_MODULE_0___default().createElement("label", {
+ onClick: this.handleChannelToggle
+ }, react__WEBPACK_IMPORTED_MODULE_0___default().createElement(react_intl__WEBPACK_IMPORTED_MODULE_1__.FormattedMessage, {
+ id: "channel_prompt",
+ defaultMessage: "This is a channel",
+ description: "Checkbox label when creating a channel"
+ }))), react__WEBPACK_IMPORTED_MODULE_0___default().createElement(react_intl__WEBPACK_IMPORTED_MODULE_1__.FormattedMessage, {
+ id: "title_tag_manager"
+ }, title => react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_tag_manager_jsx__WEBPACK_IMPORTED_MODULE_4__.default, {
+ tags: this.state.tags,
+ activated: true,
+ onTagsChanged: this.handleTagsChanged,
+ tinode: this.props.tinode,
+ title: title
+ })), react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
+ className: "dialog-buttons"
+ }, react__WEBPACK_IMPORTED_MODULE_0___default().createElement("button", {
+ className: submitClasses
+ }, react__WEBPACK_IMPORTED_MODULE_0___default().createElement(react_intl__WEBPACK_IMPORTED_MODULE_1__.FormattedMessage, {
+ id: "button_create",
+ defaultMessage: "Create",
+ description: "Button [Create]"
+ }))));
+ }
+
+}
+;
+
+/***/ }),
+
+/***/ "./src/widgets/permissions-editor.jsx":
+/*!********************************************!*\
+ !*** ./src/widgets/permissions-editor.jsx ***!
+ \********************************************/
+/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
+
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "react");
+/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);
+/* harmony import */ var react_intl__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react-intl */ "react-intl");
+/* harmony import */ var react_intl__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react_intl__WEBPACK_IMPORTED_MODULE_1__);
+/* harmony import */ var _checkbox_jsx__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./checkbox.jsx */ "./src/widgets/checkbox.jsx");
+/* harmony import */ var _contact_jsx__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./contact.jsx */ "./src/widgets/contact.jsx");
+/* harmony import */ var _lib_blob_helpers_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../lib/blob-helpers.js */ "./src/lib/blob-helpers.js");
+
+
+
+
+
+const messages = (0,react_intl__WEBPACK_IMPORTED_MODULE_1__.defineMessages)({
+ 'joiner': {
+ id: 'permission_join',
+ defaultMessage: "Join ({val})",
+ description: 'Name of J permission'
+ },
+ 'reader': {
+ id: 'permission_read',
+ defaultMessage: "Read ({val})",
+ description: 'Name of R permission'
+ },
+ 'writer': {
+ id: 'permission_write',
+ defaultMessage: "Write ({val})",
+ description: 'Name of W permission'
+ },
+ 'preser': {
+ id: 'permission_pres',
+ defaultMessage: "Get notified ({val})",
+ description: 'Name of P permission'
+ },
+ 'approver': {
+ id: 'permission_admin',
+ defaultMessage: "Approve ({val})",
+ description: 'Name of A permission'
+ },
+ 'sharer': {
+ id: 'permission_share',
+ defaultMessage: "Share ({val})",
+ description: 'Name of S permission'
+ },
+ 'deleter': {
+ id: 'permission_delete',
+ defaultMessage: "Delete ({val})",
+ description: 'Name of D permission'
+ },
+ 'owner': {
+ id: 'permission_owner',
+ defaultMessage: "Owner ({val})",
+ description: 'Name of O permission'
+ }
+});
+
+class PermissionsEditor extends (react__WEBPACK_IMPORTED_MODULE_0___default().Component) {
+ constructor(props) {
+ super(props);
+ this.state = {
+ mode: (props.mode || '').replace('N', '')
+ };
+ this.handleChange = this.handleChange.bind(this);
+ this.handleSubmit = this.handleSubmit.bind(this);
+ this.handleCancel = this.handleCancel.bind(this);
+ }
+
+ handleChange(val) {
+ let mode = this.state.mode;
+ let idx = mode.indexOf(val);
+
+ if (idx == -1) {
+ mode += val;
+ } else {
+ mode = mode.replace(val, '');
+ }
+
+ this.setState({
+ mode: mode
+ });
+ }
+
+ handleSubmit() {
+ var mode = (this.state.mode || 'N').split('').sort().join('');
+ var before = (this.props.mode || 'N').split('').sort().join('');
+
+ if (mode !== before) {
+ this.props.onSubmit(mode);
+ } else {
+ this.props.onCancel();
+ }
+ }
+
+ handleCancel() {
+ this.props.onCancel();
+ }
+
+ render() {
+ const {
+ formatMessage
+ } = this.props.intl;
+ const all = 'JRWPASDO';
+ const names = {
+ 'J': formatMessage(messages.joiner, {
+ val: 'J'
+ }),
+ 'R': formatMessage(messages.reader, {
+ val: 'R'
+ }),
+ 'W': formatMessage(messages.writer, {
+ val: 'W'
+ }),
+ 'P': formatMessage(messages.preser, {
+ val: 'P'
+ }),
+ 'A': formatMessage(messages.approver, {
+ val: 'A'
+ }),
+ 'S': formatMessage(messages.sharer, {
+ val: 'S'
+ }),
+ 'D': formatMessage(messages.deleter, {
+ val: 'D'
+ }),
+ 'O': formatMessage(messages.owner, {
+ val: 'O'
+ })
+ };
+ let skip = this.props.skip || '';
+ let mode = this.state.mode;
+ let compare = (this.props.compare || '').replace('N', '');
+ let items = [];
+
+ for (let i = 0; i < all.length; i++) {
+ let c = all.charAt(i);
+
+ if (skip.indexOf(c) >= 0 && mode.indexOf(c) < 0) {
+ continue;
+ }
+
+ items.push(react__WEBPACK_IMPORTED_MODULE_0___default().createElement("tr", {
+ key: c
+ }, react__WEBPACK_IMPORTED_MODULE_0___default().createElement("td", null, names[c]), react__WEBPACK_IMPORTED_MODULE_0___default().createElement("td", {
+ className: "checkbox"
+ }, skip.indexOf(c) < 0 ? react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_checkbox_jsx__WEBPACK_IMPORTED_MODULE_2__.default, {
+ name: c,
+ checked: mode.indexOf(c) >= 0,
+ onChange: this.handleChange
+ }) : react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_checkbox_jsx__WEBPACK_IMPORTED_MODULE_2__.default, {
+ name: c,
+ checked: mode.indexOf(c) >= 0
+ })), this.props.compare ? react__WEBPACK_IMPORTED_MODULE_0___default().createElement("td", {
+ className: "checkbox"
+ }, react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_checkbox_jsx__WEBPACK_IMPORTED_MODULE_2__.default, {
+ name: c,
+ checked: compare.indexOf(c) >= 0
+ })) : null));
+ }
+
+ return react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
+ className: "panel-form-column"
+ }, this.props.userTitle ? react__WEBPACK_IMPORTED_MODULE_0___default().createElement("ul", {
+ className: "contact-box"
+ }, react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_contact_jsx__WEBPACK_IMPORTED_MODULE_3__.default, {
+ item: this.props.item,
+ title: this.props.userTitle,
+ avatar: (0,_lib_blob_helpers_js__WEBPACK_IMPORTED_MODULE_4__.makeImageUrl)(this.props.userAvatar ? this.props.userAvatar : null)
+ })) : null, react__WEBPACK_IMPORTED_MODULE_0___default().createElement("label", {
+ className: "small"
+ }, react__WEBPACK_IMPORTED_MODULE_0___default().createElement(react_intl__WEBPACK_IMPORTED_MODULE_1__.FormattedMessage, {
+ id: "title_permissions",
+ defaultMessage: "Permissions",
+ description: "Section title"
+ })), react__WEBPACK_IMPORTED_MODULE_0___default().createElement("table", {
+ className: "permission-editor"
+ }, this.props.compare ? react__WEBPACK_IMPORTED_MODULE_0___default().createElement("thead", null, react__WEBPACK_IMPORTED_MODULE_0___default().createElement("tr", null, react__WEBPACK_IMPORTED_MODULE_0___default().createElement("th", null), react__WEBPACK_IMPORTED_MODULE_0___default().createElement("th", null, this.props.modeTitle), react__WEBPACK_IMPORTED_MODULE_0___default().createElement("th", null, this.props.compareTitle))) : null, react__WEBPACK_IMPORTED_MODULE_0___default().createElement("tbody", null, items)), react__WEBPACK_IMPORTED_MODULE_0___default().createElement("br", null), react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
+ className: "dialog-buttons"
+ }, react__WEBPACK_IMPORTED_MODULE_0___default().createElement("button", {
+ className: "outline",
+ onClick: this.handleCancel
+ }, react__WEBPACK_IMPORTED_MODULE_0___default().createElement(react_intl__WEBPACK_IMPORTED_MODULE_1__.FormattedMessage, {
+ id: "button_cancel"
+ })), react__WEBPACK_IMPORTED_MODULE_0___default().createElement("button", {
+ className: "blue",
+ onClick: this.handleSubmit
+ }, react__WEBPACK_IMPORTED_MODULE_0___default().createElement(react_intl__WEBPACK_IMPORTED_MODULE_1__.FormattedMessage, {
+ id: "button_ok"
+ }))));
+ }
+
+}
+
+;
+/* harmony default export */ __webpack_exports__["default"] = ((0,react_intl__WEBPACK_IMPORTED_MODULE_1__.injectIntl)(PermissionsEditor));
+
+/***/ }),
+
+/***/ "./src/widgets/received-marker.jsx":
+/*!*****************************************!*\
+ !*** ./src/widgets/received-marker.jsx ***!
+ \*****************************************/
+/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
+
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "react");
+/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);
+/* harmony import */ var react_intl__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react-intl */ "react-intl");
+/* harmony import */ var react_intl__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react_intl__WEBPACK_IMPORTED_MODULE_1__);
+/* harmony import */ var tinode_sdk__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! tinode-sdk */ "tinode-sdk");
+/* harmony import */ var tinode_sdk__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(tinode_sdk__WEBPACK_IMPORTED_MODULE_2__);
+/* harmony import */ var _lib_strformat_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../lib/strformat.js */ "./src/lib/strformat.js");
+
+
+
+
+const messages = (0,react_intl__WEBPACK_IMPORTED_MODULE_1__.defineMessages)({
+ 'sending': {
+ 'id': 'message_sending',
+ 'defaultMessage': 'sending...',
+ 'description': 'Message being sent, in place of time stamp'
+ },
+ 'failed': {
+ 'id': 'message_sending_failed',
+ 'defaultMessage': 'failed',
+ 'description': 'Failed to send message, in place of time stamp'
+ }
+});
+
+class ReceivedMarker extends (react__WEBPACK_IMPORTED_MODULE_0___default().PureComponent) {
+ render() {
+ const {
+ formatMessage
+ } = this.props.intl;
+ let timestamp;
+
+ if (this.props.received <= (tinode_sdk__WEBPACK_IMPORTED_MODULE_2___default().MESSAGE_STATUS_SENDING)) {
+ timestamp = formatMessage(messages.sending);
+ } else if (this.props.received == (tinode_sdk__WEBPACK_IMPORTED_MODULE_2___default().MESSAGE_STATUS_FAILED)) {
+ timestamp = formatMessage(messages.failed);
+ } else {
+ timestamp = (0,_lib_strformat_js__WEBPACK_IMPORTED_MODULE_3__.shortDateFormat)(this.props.timestamp, this.props.intl.locale);
+ }
+
+ let marker = null;
+
+ if (this.props.received <= (tinode_sdk__WEBPACK_IMPORTED_MODULE_2___default().MESSAGE_STATUS_SENDING)) {
+ marker = react__WEBPACK_IMPORTED_MODULE_0___default().createElement("i", {
+ className: "material-icons small"
+ }, "access_time");
+ } else if (this.props.received == (tinode_sdk__WEBPACK_IMPORTED_MODULE_2___default().MESSAGE_STATUS_FAILED)) {
+ marker = react__WEBPACK_IMPORTED_MODULE_0___default().createElement("i", {
+ className: "material-icons small amber"
+ }, "warning");
+ } else if (this.props.received == (tinode_sdk__WEBPACK_IMPORTED_MODULE_2___default().MESSAGE_STATUS_SENT)) {
+ marker = react__WEBPACK_IMPORTED_MODULE_0___default().createElement("i", {
+ className: "material-icons small"
+ }, "done");
+ } else if (this.props.received == (tinode_sdk__WEBPACK_IMPORTED_MODULE_2___default().MESSAGE_STATUS_RECEIVED)) {
+ marker = react__WEBPACK_IMPORTED_MODULE_0___default().createElement("i", {
+ className: "material-icons small"
+ }, "done_all");
+ } else if (this.props.received == (tinode_sdk__WEBPACK_IMPORTED_MODULE_2___default().MESSAGE_STATUS_READ)) {
+ marker = react__WEBPACK_IMPORTED_MODULE_0___default().createElement("i", {
+ className: "material-icons small blue"
+ }, "done_all");
+ }
+
+ return react__WEBPACK_IMPORTED_MODULE_0___default().createElement("span", {
+ className: "timestamp"
+ }, timestamp, '\u00a0', marker);
+ }
+
+}
+
+;
+/* harmony default export */ __webpack_exports__["default"] = ((0,react_intl__WEBPACK_IMPORTED_MODULE_1__.injectIntl)(ReceivedMarker));
+
+/***/ }),
+
+/***/ "./src/widgets/search-contacts.jsx":
+/*!*****************************************!*\
+ !*** ./src/widgets/search-contacts.jsx ***!
+ \*****************************************/
+/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
+
+__webpack_require__.r(__webpack_exports__);
+/* harmony export */ __webpack_require__.d(__webpack_exports__, {
+/* harmony export */ "default": function() { return /* binding */ SearchContacts; }
+/* harmony export */ });
+/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "react");
+/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);
+/* harmony import */ var react_intl__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react-intl */ "react-intl");
+/* harmony import */ var react_intl__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react_intl__WEBPACK_IMPORTED_MODULE_1__);
+/* harmony import */ var tinode_sdk__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! tinode-sdk */ "tinode-sdk");
+/* harmony import */ var tinode_sdk__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(tinode_sdk__WEBPACK_IMPORTED_MODULE_2__);
+
+
+
+class SearchContacts extends (react__WEBPACK_IMPORTED_MODULE_0___default().PureComponent) {
+ constructor(props) {
+ super(props);
+ this.state = {
+ edited: false,
+ search: ''
+ };
+ this.handleSearchChange = this.handleSearchChange.bind(this);
+ this.handleSearch = this.handleSearch.bind(this);
+ this.handleClear = this.handleClear.bind(this);
+ this.handleKeyDown = this.handleKeyDown.bind(this);
+ }
+
+ componentWillUnmount() {
+ if (this.state.edited) {
+ this.setState({
+ search: '',
+ edited: false
+ });
+ this.props.onSearchContacts((tinode_sdk__WEBPACK_IMPORTED_MODULE_2___default().DEL_CHAR));
+ }
+ }
+
+ handleSearchChange(e) {
+ this.setState({
+ search: e.target.value
+ });
+ }
+
+ handleSearch(e) {
+ e.preventDefault();
+ var query = this.state.search.trim();
+ this.setState({
+ edited: query.length > 0
+ });
+ this.props.onSearchContacts(query.length > 0 ? query : (tinode_sdk__WEBPACK_IMPORTED_MODULE_2___default().DEL_CHAR));
+ }
+
+ handleClear(e) {
+ e.preventDefault();
+
+ if (this.state.edited) {
+ this.props.onSearchContacts((tinode_sdk__WEBPACK_IMPORTED_MODULE_2___default().DEL_CHAR));
+ }
+
+ this.setState({
+ search: '',
+ edited: false
+ });
+ }
+
+ handleKeyDown(e) {
+ if (e.key === 'Enter') {
+ this.handleSearch(e);
+ } else if (e.key === 'Escape') {
+ this.handleClear();
+ }
+ }
+
+ render() {
+ return react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
+ className: "panel-form"
+ }, react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
+ className: "panel-form-row"
+ }, react__WEBPACK_IMPORTED_MODULE_0___default().createElement("i", {
+ className: "material-icons search"
+ }, "search"), react__WEBPACK_IMPORTED_MODULE_0___default().createElement(react_intl__WEBPACK_IMPORTED_MODULE_1__.FormattedMessage, {
+ id: "search_placeholder",
+ defaultMessage: "List like email:alice@example.com, tel:17025550003...",
+ description: "Placeholder in contacts search field"
+ }, search_placeholder => react__WEBPACK_IMPORTED_MODULE_0___default().createElement("input", {
+ className: "search",
+ type: "text",
+ placeholder: search_placeholder,
+ value: this.state.search,
+ onChange: this.handleSearchChange,
+ onKeyDown: this.handleKeyDown,
+ required: true,
+ autoFocus: true
+ })), react__WEBPACK_IMPORTED_MODULE_0___default().createElement("a", {
+ href: "#",
+ onClick: this.handleClear
+ }, react__WEBPACK_IMPORTED_MODULE_0___default().createElement("i", {
+ className: "material-icons"
+ }, "close"))));
+ }
+
+}
+;
+
+/***/ }),
+
+/***/ "./src/widgets/send-message.jsx":
+/*!**************************************!*\
+ !*** ./src/widgets/send-message.jsx ***!
+ \**************************************/
+/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
+
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "react");
+/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);
+/* harmony import */ var react_intl__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react-intl */ "react-intl");
+/* harmony import */ var react_intl__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react_intl__WEBPACK_IMPORTED_MODULE_1__);
+/* harmony import */ var tinode_sdk__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! tinode-sdk */ "tinode-sdk");
+/* harmony import */ var tinode_sdk__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(tinode_sdk__WEBPACK_IMPORTED_MODULE_2__);
+/* harmony import */ var _config_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../config.js */ "./src/config.js");
+/* harmony import */ var _lib_blob_helpers_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../lib/blob-helpers.js */ "./src/lib/blob-helpers.js");
+
+
+
+
+
+const messages = (0,react_intl__WEBPACK_IMPORTED_MODULE_1__.defineMessages)({
+ 'messaging_disabled': {
+ id: 'messaging_disabled_prompt',
+ defaultMessage: 'Messaging disabled',
+ description: 'Prompt in SendMessage in read-only topic'
+ },
+ 'type_new_message': {
+ id: 'new_message_prompt',
+ defaultMessage: 'New message',
+ description: 'Prompt in send message field'
+ },
+ 'add_image_caption': {
+ id: 'image_caption_prompt',
+ defaultMessage: 'Image caption',
+ description: 'Prompt in SendMessage for attached image'
+ },
+ 'file_attachment_too_large': {
+ id: 'file_attachment_too_large',
+ defaultMessage: 'The file size {size} exceeds the {limit} limit.',
+ description: 'Error message when attachment is too large'
+ },
+ 'cannot_initiate_upload': {
+ id: 'cannot_initiate_file_upload',
+ defaultMessage: 'Cannot initiate file upload.',
+ description: 'Generic error messagewhen attachment fails'
+ }
+});
+
+class SendMessage extends (react__WEBPACK_IMPORTED_MODULE_0___default().PureComponent) {
+ constructor(props) {
+ super(props);
+ this.state = {
+ message: '',
+ keypressTimestamp: new Date().getTime() - _config_js__WEBPACK_IMPORTED_MODULE_3__.KEYPRESS_DELAY - 1
+ };
+ this.handlePasteEvent = this.handlePasteEvent.bind(this);
+ this.handleAttachImage = this.handleAttachImage.bind(this);
+ this.handleAttachFile = this.handleAttachFile.bind(this);
+ this.handleSend = this.handleSend.bind(this);
+ this.handleKeyPress = this.handleKeyPress.bind(this);
+ this.handleMessageTyping = this.handleMessageTyping.bind(this);
+ }
+
+ componentDidMount() {
+ if (this.messageEditArea) {
+ this.messageEditArea.addEventListener('paste', this.handlePasteEvent, false);
+ }
+ }
+
+ componentWillUnmount() {
+ if (this.messageEditArea) {
+ this.messageEditArea.removeEventListener('paste', this.handlePasteEvent, false);
+ }
+ }
+
+ componentDidUpdate() {
+ if (this.messageEditArea) {
+ this.messageEditArea.focus();
+ }
+ }
+
+ handlePasteEvent(e) {
+ if (this.props.disabled) {
+ return;
+ }
+
+ if ((0,_lib_blob_helpers_js__WEBPACK_IMPORTED_MODULE_4__.filePasted)(e, (bits, mime, width, height, fname) => {
+ this.props.onAttachImage(mime, bits, width, height, fname);
+ }, (mime, bits, fname) => {
+ this.props.onAttachFile(mime, bits, fname);
+ }, this.props.onError)) {
+ e.preventDefault();
+ }
+ }
+
+ handleAttachImage(e) {
+ if (e.target.files && e.target.files.length > 0) {
+ this.props.onAttachImage(e.target.files[0]);
+ }
+
+ e.target.value = '';
+ }
+
+ handleAttachFile(e) {
+ const {
+ formatMessage
+ } = this.props.intl;
+
+ if (e.target.files && e.target.files.length > 0) {
+ this.props.onAttachFile(e.target.files[0]);
+ }
+
+ e.target.value = '';
+ }
+
+ handleSend(e) {
+ e.preventDefault();
+ const message = this.state.message.trim();
+
+ if (message || this.props.acceptBlank || this.props.noInput) {
+ this.props.onSendMessage(message);
+ this.setState({
+ message: ''
+ });
+ }
+ }
+
+ handleKeyPress(e) {
+ if (e.key === 'Enter') {
+ if (!e.shiftKey) {
+ e.preventDefault();
+ e.stopPropagation();
+ this.handleSend(e);
+ }
+ }
+ }
+
+ handleMessageTyping(e) {
+ const newState = {
+ message: e.target.value
+ };
+
+ if (this.props.onKeyPress) {
+ const now = new Date().getTime();
+
+ if (now - this.state.keypressTimestamp > _config_js__WEBPACK_IMPORTED_MODULE_3__.KEYPRESS_DELAY) {
+ this.props.onKeyPress();
+ newState.keypressTimestamp = now;
+ }
+ }
+
+ this.setState(newState);
+ }
+
+ render() {
+ const {
+ formatMessage
+ } = this.props.intl;
+ const prompt = this.props.disabled ? formatMessage(messages.messaging_disabled) : this.props.messagePrompt ? formatMessage(messages[this.props.messagePrompt]) : formatMessage(messages.type_new_message);
+ return react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
+ id: "send-message-panel"
+ }, !this.props.disabled ? react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null, this.props.onAttachFile ? react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null, react__WEBPACK_IMPORTED_MODULE_0___default().createElement("a", {
+ href: "#",
+ onClick: e => {
+ e.preventDefault();
+ this.attachImage.click();
+ },
+ title: "Add image"
+ }, react__WEBPACK_IMPORTED_MODULE_0___default().createElement("i", {
+ className: "material-icons secondary"
+ }, "photo")), react__WEBPACK_IMPORTED_MODULE_0___default().createElement("a", {
+ href: "#",
+ onClick: e => {
+ e.preventDefault();
+ this.attachFile.click();
+ },
+ title: "Attach file"
+ }, react__WEBPACK_IMPORTED_MODULE_0___default().createElement("i", {
+ className: "material-icons secondary"
+ }, "attach_file"))) : null, this.props.noInput ? react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
+ className: "hr thin"
+ }) : react__WEBPACK_IMPORTED_MODULE_0___default().createElement("textarea", {
+ id: "sendMessage",
+ placeholder: prompt,
+ value: this.state.message,
+ onChange: this.handleMessageTyping,
+ onKeyPress: this.handleKeyPress,
+ ref: ref => {
+ this.messageEditArea = ref;
+ },
+ autoFocus: true
+ }), react__WEBPACK_IMPORTED_MODULE_0___default().createElement("a", {
+ href: "#",
+ onClick: this.handleSend,
+ title: "Send"
+ }, react__WEBPACK_IMPORTED_MODULE_0___default().createElement("i", {
+ className: "material-icons"
+ }, "send")), react__WEBPACK_IMPORTED_MODULE_0___default().createElement("input", {
+ type: "file",
+ ref: ref => {
+ this.attachFile = ref;
+ },
+ onChange: this.handleAttachFile,
+ style: {
+ display: 'none'
+ }
+ }), react__WEBPACK_IMPORTED_MODULE_0___default().createElement("input", {
+ type: "file",
+ ref: ref => {
+ this.attachImage = ref;
+ },
+ accept: "image/*",
+ onChange: this.handleAttachImage,
+ style: {
+ display: 'none'
+ }
+ })) : react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
+ id: "writing-disabled"
+ }, prompt));
+ }
+
+}
+
+;
+/* harmony default export */ __webpack_exports__["default"] = ((0,react_intl__WEBPACK_IMPORTED_MODULE_1__.injectIntl)(SendMessage));
+
+/***/ }),
+
+/***/ "./src/widgets/side-navbar.jsx":
+/*!*************************************!*\
+ !*** ./src/widgets/side-navbar.jsx ***!
+ \*************************************/
+/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
+
+__webpack_require__.r(__webpack_exports__);
+/* harmony export */ __webpack_require__.d(__webpack_exports__, {
+/* harmony export */ "default": function() { return /* binding */ SideNavbar; }
+/* harmony export */ });
+/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "react");
+/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);
+/* harmony import */ var _letter_tile_jsx__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./letter-tile.jsx */ "./src/widgets/letter-tile.jsx");
+/* harmony import */ var _button_back_jsx__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./button-back.jsx */ "./src/widgets/button-back.jsx");
+/* harmony import */ var _menu_contacts_jsx__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./menu-contacts.jsx */ "./src/widgets/menu-contacts.jsx");
+/* harmony import */ var _menu_start_jsx__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./menu-start.jsx */ "./src/widgets/menu-start.jsx");
+
+
+
+
+
+class SideNavbar extends (react__WEBPACK_IMPORTED_MODULE_0___default().PureComponent) {
+ render() {
+ return react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
+ id: "side-caption-panel",
+ className: "caption-panel"
+ }, this.props.onCancel ? react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_button_back_jsx__WEBPACK_IMPORTED_MODULE_2__.default, {
+ onBack: this.props.onCancel
+ }) : null, this.props.avatar ? react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
+ id: "self-avatar",
+ className: "avatar-box"
+ }, react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_letter_tile_jsx__WEBPACK_IMPORTED_MODULE_1__.default, {
+ avatar: this.props.avatar,
+ topic: this.props.myUserId,
+ title: this.props.title
+ })) : null, react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
+ id: "sidepanel-title",
+ className: "panel-title"
+ }, this.props.title), this.props.state === 'login' ? react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_menu_start_jsx__WEBPACK_IMPORTED_MODULE_4__.default, {
+ onSignUp: this.props.onSignUp,
+ onSettings: this.props.onSettings
+ }) : this.props.state === 'contacts' ? react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_menu_contacts_jsx__WEBPACK_IMPORTED_MODULE_3__.default, {
+ onNewTopic: this.props.onNewTopic,
+ onSettings: this.props.onSettings
+ }) : null);
+ }
+
+}
+;
+
+/***/ }),
+
+/***/ "./src/widgets/tag-manager.jsx":
+/*!*************************************!*\
+ !*** ./src/widgets/tag-manager.jsx ***!
+ \*************************************/
+/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
+
+__webpack_require__.r(__webpack_exports__);
+/* harmony export */ __webpack_require__.d(__webpack_exports__, {
+/* harmony export */ "default": function() { return /* binding */ TagManager; }
+/* harmony export */ });
+/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "react");
+/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);
+/* harmony import */ var react_intl__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react-intl */ "react-intl");
+/* harmony import */ var react_intl__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react_intl__WEBPACK_IMPORTED_MODULE_1__);
+/* harmony import */ var _chip_input_jsx__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./chip-input.jsx */ "./src/widgets/chip-input.jsx");
+/* harmony import */ var _config_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../config.js */ "./src/config.js");
+/* harmony import */ var _lib_utils_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../lib/utils.js */ "./src/lib/utils.js");
+
+
+
+
+
+class TagManager extends (react__WEBPACK_IMPORTED_MODULE_0___default().Component) {
+ constructor(props) {
+ super(props);
+ this.state = {
+ tags: this.props.tags,
+ tagInput: '',
+ activated: this.props.activated
+ };
+ this.handleTagInput = this.handleTagInput.bind(this);
+ this.handleAddTag = this.handleAddTag.bind(this);
+ this.handleRemoveTag = this.handleRemoveTag.bind(this);
+ this.handleSubmit = this.handleSubmit.bind(this);
+ this.handleCancel = this.handleCancel.bind(this);
+ }
+
+ static getDerivedStateFromProps(nextProps, prevState) {
+ if (!(0,_lib_utils_js__WEBPACK_IMPORTED_MODULE_4__.arrayEqual)(nextProps.tags, prevState.tags) && !prevState.activated) {
+ return {
+ tags: nextProps.tags
+ };
+ }
+
+ return null;
+ }
+
+ handleTagInput(text) {
+ this.setState({
+ tagInput: text
+ });
+
+ if (text.length > 0) {
+ const last = text[text.length - 1];
+
+ if (text[0] == '"') {
+ if (text.length > 1 && last == '"') {
+ this.handleAddTag(text.substring(1, text.length - 1));
+ }
+ } else if (last == ',' || last == ' ' || last == ';' || last == '"') {
+ this.handleAddTag(text.substring(0, text.length - 1).trim());
+ }
+ }
+ }
+
+ handleAddTag(tag) {
+ const maxTagCount = this.props.tinode.getServerLimit('maxTagCount', _config_js__WEBPACK_IMPORTED_MODULE_3__.MAX_TAG_COUNT);
+
+ if (tag.length > 0 && this.state.tags.length < maxTagCount) {
+ const tags = this.state.tags.slice(0);
+ tags.push(tag);
+ this.setState({
+ tags: tags,
+ tagInput: ''
+ });
+
+ if (this.props.onTagsChanged) {
+ this.props.onTagsChanged(tags);
+ }
+
+ return tags;
+ }
+
+ return this.state.tags;
+ }
+
+ handleRemoveTag(tag, index) {
+ const tags = this.state.tags.slice(0);
+ tags.splice(index, 1);
+ this.setState({
+ tags: tags
+ });
+
+ if (this.props.onTagsChanged) {
+ this.props.onTagsChanged(tags);
+ }
+ }
+
+ handleSubmit() {
+ this.props.onSubmit(this.handleAddTag(this.state.tagInput.trim()));
+ this.setState({
+ activated: false,
+ tags: this.props.tags
+ });
+ }
+
+ handleCancel() {
+ this.setState({
+ activated: false,
+ tagInput: '',
+ tags: this.props.tags
+ });
+
+ if (this.props.onCancel) {
+ this.props.onCancel();
+ }
+ }
+
+ render() {
+ const minTagLength = this.props.tinode.getServerLimit('minTagLength', _config_js__WEBPACK_IMPORTED_MODULE_3__.MIN_TAG_LENGTH);
+ const maxTagLength = this.props.tinode.getServerLimit('maxTagLength', _config_js__WEBPACK_IMPORTED_MODULE_3__.MAX_TAG_LENGTH);
+ let tags = [];
+
+ if (this.state.activated) {
+ this.state.tags.map(tag => {
+ tags.push({
+ user: tag,
+ invalid: tag.length < minTagLength || tag.length > maxTagLength
+ });
+ });
+ } else {
+ this.state.tags.map(tag => {
+ tags.push(react__WEBPACK_IMPORTED_MODULE_0___default().createElement("span", {
+ className: "badge",
+ key: tags.length
+ }, tag));
+ });
+
+ if (tags.length == 0) {
+ tags = react__WEBPACK_IMPORTED_MODULE_0___default().createElement("i", null, react__WEBPACK_IMPORTED_MODULE_0___default().createElement(react_intl__WEBPACK_IMPORTED_MODULE_1__.FormattedMessage, {
+ id: "tags_not_found",
+ defaultMessage: "No tags defined. Add some.",
+ description: ""
+ }));
+ }
+ }
+
+ return react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
+ className: "panel-form-column"
+ }, react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
+ className: "panel-form-row"
+ }, react__WEBPACK_IMPORTED_MODULE_0___default().createElement("label", {
+ className: "small"
+ }, this.props.title)), this.state.activated ? react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", null, react__WEBPACK_IMPORTED_MODULE_0___default().createElement(react_intl__WEBPACK_IMPORTED_MODULE_1__.FormattedMessage, {
+ id: "tags_editor_no_tags",
+ defaultMessage: "Add some tags",
+ description: "Tag editor prompt when no tags are found."
+ }, add_tags_prompt => react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_chip_input_jsx__WEBPACK_IMPORTED_MODULE_2__.default, {
+ chips: tags,
+ avatarDisabled: true,
+ prompt: add_tags_prompt,
+ onEnter: this.handleAddTag,
+ onFocusLost: this.handleAddTag,
+ onCancel: this.handleCancel,
+ onChipRemoved: this.handleRemoveTag,
+ filterFunc: this.handleTagInput
+ })), this.props.onSubmit || this.props.onCancel ? react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
+ id: "tag-manager-buttons",
+ className: "dialog-buttons panel-form-row"
+ }, react__WEBPACK_IMPORTED_MODULE_0___default().createElement("button", {
+ className: "outline",
+ onClick: this.handleCancel
+ }, react__WEBPACK_IMPORTED_MODULE_0___default().createElement(react_intl__WEBPACK_IMPORTED_MODULE_1__.FormattedMessage, {
+ id: "button_cancel",
+ defautMessage: "Cancel",
+ description: "Rejection button [Cancel]"
+ })), react__WEBPACK_IMPORTED_MODULE_0___default().createElement("button", {
+ className: "blue",
+ onClick: this.handleSubmit
+ }, react__WEBPACK_IMPORTED_MODULE_0___default().createElement(react_intl__WEBPACK_IMPORTED_MODULE_1__.FormattedMessage, {
+ id: "button_ok",
+ defautMessage: "OK",
+ description: "Confirmation button [OK]"
+ }))) : null) : react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
+ className: "quoted"
+ }, react__WEBPACK_IMPORTED_MODULE_0___default().createElement("a", {
+ href: "#",
+ className: "flat-button",
+ onClick: e => {
+ e.preventDefault();
+ this.setState({
+ activated: true
+ });
+ }
+ }, react__WEBPACK_IMPORTED_MODULE_0___default().createElement("i", {
+ className: "material-icons"
+ }, "edit"), " \xA0", react__WEBPACK_IMPORTED_MODULE_0___default().createElement(react_intl__WEBPACK_IMPORTED_MODULE_1__.FormattedMessage, {
+ id: "title_manage_tags",
+ defaultMessage: "Manage",
+ description: "Section title for the list of tags"
+ })), react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null, tags)));
+ }
+
+}
+;
+
+/***/ }),
+
+/***/ "./src/widgets/unread-badge.jsx":
+/*!**************************************!*\
+ !*** ./src/widgets/unread-badge.jsx ***!
+ \**************************************/
+/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
+
+__webpack_require__.r(__webpack_exports__);
+/* harmony export */ __webpack_require__.d(__webpack_exports__, {
+/* harmony export */ "default": function() { return /* binding */ UnreadBadge; }
+/* harmony export */ });
+/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "react");
+/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);
+
+class UnreadBadge extends (react__WEBPACK_IMPORTED_MODULE_0___default().PureComponent) {
+ render() {
+ return this.props.count > 0 ? react__WEBPACK_IMPORTED_MODULE_0___default().createElement("span", {
+ className: "unread"
+ }, this.props.count > 9 ? "9+" : this.props.count) : null;
+ }
+
+}
+;
+
+/***/ }),
+
+/***/ "./src/widgets/uploading-image.jsx":
+/*!*****************************************!*\
+ !*** ./src/widgets/uploading-image.jsx ***!
+ \*****************************************/
+/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
+
+__webpack_require__.r(__webpack_exports__);
+/* harmony export */ __webpack_require__.d(__webpack_exports__, {
+/* harmony export */ "default": function() { return /* binding */ UploadingImage; }
+/* harmony export */ });
+/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "react");
+/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);
+/* harmony import */ var react_intl__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react-intl */ "react-intl");
+/* harmony import */ var react_intl__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react_intl__WEBPACK_IMPORTED_MODULE_1__);
+/* harmony import */ var _file_progress_jsx__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./file-progress.jsx */ "./src/widgets/file-progress.jsx");
+
+
+
+class UploadingImage extends (react__WEBPACK_IMPORTED_MODULE_0___default().PureComponent) {
+ constructor(props) {
+ super(props);
+ }
+
+ render() {
+ return react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
+ className: "inline-image"
+ }, react__WEBPACK_IMPORTED_MODULE_0___default().createElement('img', this.props), react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
+ className: "rounded-container"
+ }, react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_file_progress_jsx__WEBPACK_IMPORTED_MODULE_2__.default, {
+ progress: this.props.progress,
+ onCancel: this.props.onCancelUpload
+ })));
+ }
+
+}
+;
+
+/***/ }),
+
+/***/ "./src/widgets/visible-password.jsx":
+/*!******************************************!*\
+ !*** ./src/widgets/visible-password.jsx ***!
+ \******************************************/
+/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
+
+__webpack_require__.r(__webpack_exports__);
+/* harmony export */ __webpack_require__.d(__webpack_exports__, {
+/* harmony export */ "default": function() { return /* binding */ VisiblePassword; }
+/* harmony export */ });
+/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "react");
+/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);
+
+class VisiblePassword extends (react__WEBPACK_IMPORTED_MODULE_0___default().PureComponent) {
+ constructor(props) {
+ super(props);
+ this.state = {
+ value: this.props.value,
+ visible: false
+ };
+ this.handleVisibility = this.handleVisibility.bind(this);
+ this.handeTextChange = this.handeTextChange.bind(this);
+ this.handleKeyDown = this.handleKeyDown.bind(this);
+ this.handleEditingFinished = this.handleEditingFinished.bind(this);
+ }
+
+ handeTextChange(e) {
+ this.setState({
+ value: e.target.value
+ });
+
+ if (this.props.onChange) {
+ this.props.onChange(e);
+ }
+ }
+
+ handleVisibility(e) {
+ e.preventDefault();
+ this.setState({
+ visible: !this.state.visible
+ });
+ }
+
+ handleKeyDown(e) {
+ if (e.keyCode == 27) {
+ this.setState({
+ value: this.props.value,
+ visible: false
+ });
+
+ if (this.props.onFinished) {
+ this.props.onFinished();
+ }
+ } else if (e.keyCode == 13) {
+ this.handleEditingFinished();
+ }
+ }
+
+ handleEditingFinished(e) {
+ if (e) {
+ let currentTarget = e.currentTarget;
+ setTimeout(() => {
+ if (!currentTarget.contains(document.activeElement)) {
+ if (this.props.onFinished) {
+ this.props.onFinished(this.state.value);
+ }
+ }
+ }, 0);
+ } else if (this.props.onFinished) {
+ this.props.onFinished(this.state.value.trim());
+ }
+ }
+
+ render() {
+ return react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
+ tabIndex: "-1",
+ className: "group-focus",
+ onBlur: this.handleEditingFinished
+ }, react__WEBPACK_IMPORTED_MODULE_0___default().createElement("input", {
+ className: "with-visibility",
+ type: this.state.visible ? "text" : "password",
+ value: this.state.value,
+ placeholder: this.props.placeholder,
+ required: this.props.required ? 'required' : '',
+ autoFocus: this.props.autoFocus ? 'autoFocus' : '',
+ autoComplete: this.props.autoComplete,
+ onChange: this.handeTextChange,
+ onKeyDown: this.handleKeyDown
+ }), react__WEBPACK_IMPORTED_MODULE_0___default().createElement("span", {
+ onClick: this.handleVisibility
+ }, react__WEBPACK_IMPORTED_MODULE_0___default().createElement("i", {
+ className: "material-icons clickable light-gray"
+ }, this.state.visible ? 'visibility' : 'visibility_off')));
+ }
+
+}
+
+/***/ }),
+
+/***/ "./src/messages.json":
+/*!***************************!*\
+ !*** ./src/messages.json ***!
+ \***************************/
+/***/ (function(module) {
+
+module.exports = JSON.parse("{\"de\":{\"validate_credential_action\":\"bestätigen\",\"title_tag_manager\":\"Schlagworte (Nutzer entdecken)\",\"label_user_contacts\":\"Kontakte:\",\"button_add_another\":\"Hinzufügen\",\"label_message_sound\":\"Benachrichtigungston:\",\"label_push_notifications\":\"Benachrichtigungsmeldungen:\",\"label_push_notifications_disabled\":\"Benachrichtigungsmeldungen (erfordert HTTPS):\",\"label_incognito_mode\":\"inkognito-Modus:\",\"delete_account\":\"Konto löschen\",\"delete_account_arning\":\"Möchten Sie das Konto wirklich löschen? Das kann nicht rückgängig gemacht werden\",\"label_password\":\"Passwort\",\"password_unchanged_prompt\":\"unverändert\",\"button_logout\":\"Abmelden\",\"button_delete_account\":\"Konto löschen\",\"label_default_access_mode\":\"Standard Zugriffsmodus:\",\"blocked_contacts_link\":\"Blockierte Kontakte ({count})\",\"link_contact_us\":\"Kontakt\",\"link_terms_of_service\":\"Nutzungsbedingungen\",\"link_privacy_policy\":\"Datenschutzerklärung\",\"label_sdk\":\"SDK:\",\"label_server_address\":\"Server Adresse:\",\"archived_contacts\":\"Archivierte Kontakte ({count})\",\"contacts_not_found\":\"Sie haben keine Unterhaltungen
¯∖_(ツ)_/¯\",\"full_name_prompt\":\"Vollständiger Name, z.B. Lisa Musterfrau\",\"email_prompt\":\"E-Mail, z.B. jdoe@beispiel.de\",\"button_sign_up\":\"Anmelden\",\"label_your_name\":\"Ihr Name\",\"label_user_id\":\"ID:\",\"button_edit\":\"Bearbeiten\",\"requested_permissions\":\"Angefordert\",\"granted_permissions\":\"Erteilt\",\"menu_item_edit_permissions\":\"Berechtigungen ändern\",\"label_other_user\":\"Andere\",\"action_clear_messages\":\"Nachrichten leeren\",\"clear_messages_warning\":\"Sind Sie sicher, dass Sie diese Unterhaltung für alle leeren wollen? Das kann nicht rückgängig gemacht werden.\",\"action_delete_messages\":\"Nachrichten für alle löschen\",\"delete_messages_warning\":\"Sind Sie sicher, dass Sie diese Unterhaltung für alle löschen wollen? Das kann nicht rückgängig gemacht werden.\",\"action_leave_chat\":\"Unterhaltung verlassen\",\"leave_chat_warning\":\"Möchten Sie diese Unterhaltung wirklich verlassen?\",\"action_block_contact\":\"Kontakt blockieren\",\"block_contact_warning\":\"Möchten Sie diesen Kontakt wirklich blockieren?\",\"action_report_chat\":\"Unterhaltung melden\",\"report_chat_warning\":\"Möchten Sie diese Unterhaltung wirklich blockieren und melden?\",\"title_info\":\"Info\",\"label_topic_name\":\"Name\",\"label_private\":\"Privater Kommentar\",\"private_editing_placeholder\":\"Nur für Sie sichtbar\",\"label_muting_topic\":\"Stumm geschaltet:\",\"action_more\":\"Mehr\",\"label_your_permissions\":\"Ihre Berechtigungen:\",\"label_permissions\":\"Berechtigungen:\",\"label_you\":\"Sie:\",\"label_default_access\":\"Standard Zugriffsmodus:\",\"label_group_members\":\"Gruppenmitglieder:\",\"button_add_members\":\"Mitglieder hinzufügen\",\"group_has_no_members\":\"Keine Mitglieder\",\"login_prompt\":\"Anmelden\",\"password_prompt\":\"Passwort\",\"stay_logged_in\":\"Angemeldet bleiben\",\"forgot_password_link\":\"Passwort vergessen?\",\"button_sign_in\":\"Anmelden\",\"label_client\":\"Client:\",\"label_server\":\"Server:\",\"online_now\":\"jetzt online\",\"last_seen_timestamp\":\"Zuletzt gesehen\",\"title_not_found\":\"Nicht gefunden\",\"unnamed_topic\":\"Unbenannt\",\"messages_not_readable\":\"Neue Nachrichten können nicht gelesen werden\",\"peers_messaging_disabled\":\"Gruppennachrichten sind deaktiviert\",\"enable_peers_messaging\":\"Aktivieren\",\"search_for_contacts\":\"Nutzen Sie die Suche um Kontakte zu finden\",\"search_no_results\":\"Die Suche hatte keine Ergebnisse\",\"tabtitle_find_user\":\"Suchen\",\"tabtitle_new_group\":\"Neue Gruppe\",\"tabtitle_group_by_id\":\"nach ID\",\"new_password_placeholder\":\"Geben Sie ein neues Passwort ein\",\"label_reset_password\":\"Passwort per E-Mail wiederherstellen:\",\"credential_email_prompt\":\"E-Mail Adresse für Registrierung\",\"button_reset\":\"Zurücksetzen\",\"button_send_request\":\"Anfrage senden\",\"label_server_to_use\":\"Server verwenden:\",\"label_wire_transport\":\"Übertragung per Kabel:\",\"button_update\":\"Aktualisieren\",\"sidepanel_title_login\":\"Anmelden\",\"sidepanel_title_register\":\"Konto erstellen\",\"sidepanel_title_settings\":\"Einstellungen\",\"sidepanel_title_account_settings\":\"Konto-Einstellungen\",\"sidepanel_title_acc_general\":\"Allgemein\",\"sidepanel_title_acc_security\":\"Sicherheit\",\"sidepanel_title_acc_notifications\":\"Benachrichtigungen\",\"sidepanel_title_acc_support\":\"Unterstützung\",\"sidepanel_title_newtpk\":\"Neue Unterhaltung starten\",\"sidepanel_title_cred\":\"Anmeldeinformationen bestätigen\",\"sidepanel_title_reset\":\"Passwort zurücksetzen\",\"sidepanel_title_archive\":\"Archivierte Unterhaltungen\",\"sidepanel_title_blocked\":\"Blockierte Unterhaltungen\",\"reconnect_countdown\":\"Getrennt. Wiederverbinden in {seconds}…\",\"reconnect_now\":\"Jetzt probieren\",\"push_init_failed\":\"Initialisierung von Push-Benachrichtigungen fehlgeschlagen\",\"invalid_security_token\":\"Ungültiger Sicherheitsschlüssel\",\"no_connection\":\"Keine Verbindung\",\"code_doesnot_match\":\"Code stimmt nicht überein\",\"update_available\":\"Aktualisierung verfügbar.\",\"reload_update\":\"Neu laden\",\"phone_dative\":\"Telefon\",\"email_dative\":\"E-Mail\",\"enter_confirmation_code_prompt\":\"Geben Sie den Bestätigungscode ein, der per {method} geschickt wurde:\",\"numeric_confirmation_code_prompt\":\"Nur zahlen\",\"button_confirm\":\"Bestätigen\",\"save_attachment\":\"Speichern\",\"deleted_content\":\"Inhalt gelöscht\",\"invalid_content\":\"ungültiger Inhalt\",\"user_not_found\":\"Nicht gefunden\",\"badge_you\":\"Sie\",\"badge_owner\":\"Besitzer\",\"menu_item_info\":\"Info\",\"menu_item_clear_messages\":\"Nachrichten leeren\",\"menu_item_clear_messages_for_all\":\"Für alle leeren\",\"menu_item_delete\":\"Löschen\",\"menu_item_delete_for_all\":\"Für alle löschen\",\"menu_item_send_retry\":\"Wiederholen\",\"menu_item_mute\":\"Unterhaltung stumm schalten\",\"menu_item_unmute\":\"Stumm schalten beenden\",\"menu_item_delete_topic\":\"Entfernen\",\"topic_delete_warning\":\"Möchten Sie diese Unterhaltung wirklich löschen?\",\"menu_item_unblock\":\"Blockierung aufheben\",\"menu_item_block\":\"Blockieren\",\"topic_block_warning\":\"Möchten Sie diese Unterhaltung wirklich blockieren?\",\"menu_item_member_delete\":\"Entfernen\",\"menu_item_archive_topic\":\"Archivieren\",\"action_cancel\":\"Abbrechen\",\"upload_finishing\":\"wird abgeschlossen...\",\"no_contacts\":\"Sie haben keine Kontakte :-(\",\"contacts_not_found_short\":\"Keine Kontakte für ''{query}''\",\"title_group_members\":\"Gruppenmitglieder\",\"title_all_contacts\":\"Alle Kontakte\",\"button_ok\":\"OK\",\"button_cancel\":\"Abbrechen\",\"more_online_members\":\"+{overflow} mehr\",\"download_action\":\"herunterladen\",\"label_file_name\":\"Dateiname:\",\"label_content_type\":\"Inhaltsart:\",\"label_size\":\"Größe:\",\"chat_invitation\":\"Sie sind eingeladen, an einem neuen Chat teilzunehmen. Was möchten Sie tun?\",\"chat_invitation_accept\":\"Akzeptieren\",\"chat_invitation_ignore\":\"Ignorieren\",\"chat_invitation_block\":\"Blockieren\",\"error_invalid_id\":\"ungültige ID\",\"group_user_id_prompt\":\"Gruppe oder Benutzer ID\",\"button_subscribe\":\"Abbonieren\",\"topic_name_editing_placeholder\":\"Freiform Name der Gruppe\",\"button_create\":\"Erstellen\",\"permission_join\":\"Beitreten ({val})\",\"permission_read\":\"Lesen ({val})\",\"permission_write\":\"Schreiben ({val})\",\"permission_pres\":\"Benachrichtigt werden ({val})\",\"permission_admin\":\"Bestätigen ({val})\",\"permission_share\":\"Teilen ({val})\",\"permission_delete\":\"Entfernen ({val})\",\"permission_owner\":\"Besitzer ({val})\",\"title_permissions\":\"Berechtigungen\",\"message_sending\":\"wird gesendet...\",\"message_sending_failed\":\"fehlgeschlagen\",\"search_placeholder\":\"Liste: email:lisa@beispiel.de, tel:17025550003...\",\"messaging_disabled_prompt\":\"Nachrichtenübermittlung deaktiviert\",\"new_message_prompt\":\"Neue Nachricht\",\"image_caption_prompt\":\"Bildunterschrift\",\"file_attachment_too_large\":\"Die Dateigröße {size} überschreitet das Limit von {limit}.\",\"cannot_initiate_file_upload\":\"Datei kann nicht hochgeladen werden.\",\"tags_not_found\":\"Keine Schlagworte definiert. Erstellen Sie welche.\",\"tags_editor_no_tags\":\"Schlagworte hinzufügen\",\"title_manage_tags\":\"Verwalten\",\"channel_prompt\":\"Dies ist ein Sender\",\"channel\":\"Sender\"},\"en\":{\"validate_credential_action\":\"confirm\",\"title_tag_manager\":\"Tags (user discovery)\",\"label_user_contacts\":\"Contacts:\",\"button_add_another\":\"Add another\",\"label_message_sound\":\"Message sound:\",\"label_push_notifications\":\"Notification alerts:\",\"label_push_notifications_disabled\":\"Notification alerts (requires HTTPS):\",\"label_incognito_mode\":\"Incognito mode:\",\"delete_account\":\"Delete account\",\"delete_account_arning\":\"Are you sure you want to delete your account? It cannot be undone.\",\"label_password\":\"Password\",\"password_unchanged_prompt\":\"Unchanged\",\"button_logout\":\"Logout\",\"button_delete_account\":\"Delete account\",\"label_default_access_mode\":\"Default access mode:\",\"blocked_contacts_link\":\"Blocked contacts ({count})\",\"link_contact_us\":\"Contact Us\",\"link_terms_of_service\":\"Terms of Service\",\"link_privacy_policy\":\"Privacy Policy\",\"label_sdk\":\"SDK:\",\"label_server_address\":\"Server address:\",\"archived_contacts\":\"Archived contacts ({count})\",\"contacts_not_found\":\"You have no chats
¯∖_(ツ)_/¯\",\"full_name_prompt\":\"Full name, e.g. John Doe\",\"email_prompt\":\"Email, e.g. jdoe@example.com\",\"button_sign_up\":\"Sign up\",\"label_your_name\":\"Your name\",\"label_user_id\":\"ID:\",\"button_edit\":\"Edit\",\"requested_permissions\":\"Requested\",\"granted_permissions\":\"Granted\",\"menu_item_edit_permissions\":\"Edit permissions\",\"label_other_user\":\"Other\",\"action_clear_messages\":\"Clear Messages\",\"clear_messages_warning\":\"Are you sure you want to clear all messages? It cannot be undone.\",\"action_delete_messages\":\"Clear Messages for All\",\"delete_messages_warning\":\"Are you sure you want to delete all messages for everyone? It cannot be undone.\",\"action_leave_chat\":\"Leave Conversation\",\"leave_chat_warning\":\"Are you sure you want to leave this conversation?\",\"action_block_contact\":\"Block Contact\",\"block_contact_warning\":\"Are you sure you want to block this contact?\",\"action_report_chat\":\"Report Conversation\",\"report_chat_warning\":\"Are you sure you want to block and report this conversation?\",\"title_info\":\"Info\",\"label_topic_name\":\"Name\",\"label_private\":\"Private comment\",\"private_editing_placeholder\":\"Visible to you only\",\"label_muting_topic\":\"Muted:\",\"action_more\":\"More\",\"label_your_permissions\":\"Your permissions:\",\"label_permissions\":\"Permissions:\",\"label_you\":\"You:\",\"label_default_access\":\"Default access mode:\",\"label_group_members\":\"Group members:\",\"button_add_members\":\"Add members\",\"group_has_no_members\":\"No members\",\"login_prompt\":\"Login\",\"password_prompt\":\"Password\",\"stay_logged_in\":\"Stay logged in\",\"forgot_password_link\":\"Forgot password?\",\"button_sign_in\":\"Sign in\",\"label_client\":\"Client:\",\"label_server\":\"Server:\",\"online_now\":\"online now\",\"last_seen_timestamp\":\"Last seen\",\"title_not_found\":\"Not found\",\"channel\":\"channel\",\"unnamed_topic\":\"Unnamed\",\"messages_not_readable\":\"no access to messages\",\"peers_messaging_disabled\":\"Peer's messaging is disabled.\",\"enable_peers_messaging\":\"Enable\",\"search_for_contacts\":\"Use search to find contacts\",\"search_no_results\":\"Search returned no results\",\"tabtitle_find_user\":\"find\",\"tabtitle_new_group\":\"new group\",\"tabtitle_group_by_id\":\"by id\",\"new_password_placeholder\":\"Enter new password\",\"label_reset_password\":\"Send a password reset email:\",\"credential_email_prompt\":\"Your registration email\",\"button_reset\":\"Reset\",\"button_send_request\":\"Send request\",\"label_server_to_use\":\"Server to use:\",\"label_wire_transport\":\"Wire transport:\",\"button_update\":\"Update\",\"sidepanel_title_login\":\"Sign In\",\"sidepanel_title_register\":\"Create Account\",\"sidepanel_title_settings\":\"Settings\",\"sidepanel_title_account_settings\":\"Account Settings\",\"sidepanel_title_acc_general\":\"General\",\"sidepanel_title_acc_security\":\"Security\",\"sidepanel_title_acc_notifications\":\"Notifications\",\"sidepanel_title_acc_support\":\"Support\",\"sidepanel_title_newtpk\":\"Start New Chat\",\"sidepanel_title_cred\":\"Confirm Credentials\",\"sidepanel_title_reset\":\"Reset Password\",\"sidepanel_title_archive\":\"Archived Chats\",\"sidepanel_title_blocked\":\"Blocked Chats\",\"reconnect_countdown\":\"Disconnected. Reconnecting in {seconds}…\",\"reconnect_now\":\"Try now\",\"push_init_failed\":\"Failed to initialize push notifications\",\"invalid_security_token\":\"Invalid security token\",\"no_connection\":\"No connection\",\"code_doesnot_match\":\"Code does not match\",\"update_available\":\"Update available.\",\"reload_update\":\"Reload\",\"phone_dative\":\"phone\",\"email_dative\":\"email\",\"enter_confirmation_code_prompt\":\"Enter confirmation code sent to you by {method}:\",\"numeric_confirmation_code_prompt\":\"Numbers only\",\"button_confirm\":\"Confirm\",\"save_attachment\":\"save\",\"deleted_content\":\"content deleted\",\"invalid_content\":\"invalid content\",\"user_not_found\":\"Not found\",\"badge_you\":\"you\",\"badge_owner\":\"owner\",\"menu_item_info\":\"Info\",\"menu_item_clear_messages\":\"Clear messages\",\"menu_item_clear_messages_for_all\":\"Clear for All\",\"menu_item_delete\":\"Delete\",\"menu_item_delete_for_all\":\"Delete for All\",\"menu_item_send_retry\":\"Retry\",\"menu_item_mute\":\"Mute\",\"menu_item_unmute\":\"Unmute\",\"menu_item_delete_topic\":\"Delete\",\"topic_delete_warning\":\"Are you sure you want to delete this conversation?\",\"menu_item_unblock\":\"Unblock\",\"menu_item_block\":\"Block\",\"topic_block_warning\":\"Are you sure you want to block this conversation?\",\"menu_item_member_delete\":\"Remove\",\"menu_item_archive_topic\":\"Archive\",\"action_cancel\":\"cancel\",\"upload_finishing\":\"finishing...\",\"no_contacts\":\"You have no contacts :-(\",\"contacts_not_found_short\":\"No contacts match ''{query}''\",\"title_group_members\":\"Group Members\",\"title_all_contacts\":\"All Contacts\",\"button_ok\":\"OK\",\"button_cancel\":\"Cancel\",\"more_online_members\":\"+{overflow} more\",\"download_action\":\"download\",\"label_file_name\":\"File name:\",\"label_content_type\":\"Content type:\",\"label_size\":\"Size:\",\"chat_invitation\":\"You are invited to start a new chat. What would you like to do?\",\"chat_invitation_accept\":\"Accept\",\"chat_invitation_ignore\":\"Ignore\",\"chat_invitation_block\":\"Block\",\"error_invalid_id\":\"Invalid ID\",\"group_user_id_prompt\":\"Group or User ID\",\"button_subscribe\":\"Subscribe\",\"topic_name_editing_placeholder\":\"Freeform name of the group\",\"channel_prompt\":\"This is a channel\",\"button_create\":\"Create\",\"permission_join\":\"Join ({val})\",\"permission_read\":\"Read ({val})\",\"permission_write\":\"Write ({val})\",\"permission_pres\":\"Get notified ({val})\",\"permission_admin\":\"Approve ({val})\",\"permission_share\":\"Share ({val})\",\"permission_delete\":\"Delete ({val})\",\"permission_owner\":\"Owner ({val})\",\"title_permissions\":\"Permissions\",\"message_sending\":\"sending...\",\"message_sending_failed\":\"failed\",\"search_placeholder\":\"List like email:alice@example.com, tel:17025550003...\",\"messaging_disabled_prompt\":\"Messaging disabled\",\"new_message_prompt\":\"New message\",\"image_caption_prompt\":\"Image caption\",\"file_attachment_too_large\":\"The file size {size} exceeds the {limit} limit.\",\"cannot_initiate_file_upload\":\"Cannot initiate file upload.\",\"tags_not_found\":\"No tags defined. Add some.\",\"tags_editor_no_tags\":\"Add some tags\",\"title_manage_tags\":\"Manage\"},\"es\":{\"validate_credential_action\":\"confirmar\",\"title_tag_manager\":\"Etiquetas (descubrimiento de usuarios)\",\"label_user_contacts\":\"Contactos:\",\"button_add_another\":\"Añadir contacto\",\"label_message_sound\":\"Sonido de mensaje:\",\"label_push_notifications\":\"Alertas de notificaciones:\",\"label_push_notifications_disabled\":\"Alertas de notificaciones (requiere HTTPS):\",\"label_incognito_mode\":\"Modo incógnito:\",\"delete_account\":\"Eliminar cuenta\",\"delete_account_arning\":\"¿Estás seguro de que deseas eliminar permanentemente tu cuenta? Esta acción es irreversible.\",\"label_password\":\"Contraseña\",\"password_unchanged_prompt\":\"Sin cambios\",\"button_logout\":\"Cerrar sesión\",\"button_delete_account\":\"Eliminar cuenta\",\"label_default_access_mode\":\"Modo de acceso predeterminado:\",\"blocked_contacts_link\":\"Contactos bloqueados ({count})\",\"link_contact_us\":\"Contáctanos\",\"link_terms_of_service\":\"Términos de uso\",\"link_privacy_policy\":\"Política de privacidad\",\"label_sdk\":\"SDK:\",\"label_server_address\":\"Dirección del servidor:\",\"archived_contacts\":\"Contactos archivados ({count})\",\"contacts_not_found\":\"No tienes chats
¯∖_(ツ)_/¯\",\"full_name_prompt\":\"Nombre completo, p.ej. Juan González Hernández\",\"email_prompt\":\"Correo electrónico, p.ej. juan@example.com\",\"button_sign_up\":\"Regístrate\",\"label_your_name\":\"Tu nombre\",\"label_user_id\":\"ID:\",\"button_edit\":\"Editar\",\"requested_permissions\":\"Solicitados\",\"granted_permissions\":\"Otorgados\",\"menu_item_edit_permissions\":\"Editar permisos\",\"label_other_user\":\"Otros\",\"action_clear_messages\":\"Borrar mensajes\",\"clear_messages_warning\":\"¿Estás seguro de que quieres eliminar todos los mensajes? Esta acción es irreversible.\",\"action_delete_messages\":\"Borrar mensajes para todos\",\"delete_messages_warning\":\"¿Estás seguro de que quieres eliminar todos los mensajes para todos? Esta acción es irreversible.\",\"action_leave_chat\":\"Dejar conversación\",\"leave_chat_warning\":\"¿Estás seguro de que quieres dejar esta conversación?\",\"action_block_contact\":\"Bloquear contacto\",\"block_contact_warning\":\"¿Estás seguro de que quieres bloquear a este contacto?\",\"action_report_chat\":\"Reportar conversación\",\"report_chat_warning\":\"¿Estás seguro de que quieres bloquear y reportar a esta conversación?\",\"title_info\":\"Información\",\"label_topic_name\":\"Nombre del tema\",\"label_private\":\"Comentario privado\",\"private_editing_placeholder\":\"Sólo visible para tí\",\"label_muting_topic\":\"Silenciado:\",\"action_more\":\"Más\",\"label_your_permissions\":\"Tus permisoss:\",\"label_permissions\":\"Permisos:\",\"label_you\":\"Tú:\",\"label_default_access\":\"Modo de acceso predeterminado:\",\"label_group_members\":\"Miembros del grupo:\",\"button_add_members\":\"Añadir miembros\",\"group_has_no_members\":\"No hay miembros\",\"login_prompt\":\"Nombre de usuario\",\"password_prompt\":\"Contraseña\",\"stay_logged_in\":\"Permanecer conectado\",\"forgot_password_link\":\"¿Olvidaste tu contraseña?\",\"button_sign_in\":\"Entrar\",\"label_client\":\"Cliente:\",\"label_server\":\"Servidor:\",\"online_now\":\"en línea\",\"last_seen_timestamp\":\"Últ. vez\",\"title_not_found\":\"No encontrado\",\"unnamed_topic\":\"Sin nombre\",\"messages_not_readable\":\"sin acceso a mensajes\",\"peers_messaging_disabled\":\"La mensajería Peer está deshabilitada.\",\"enable_peers_messaging\":\"Habilitar\",\"search_for_contacts\":\"Usa la búsqueda para encontrar contactos\",\"search_no_results\":\"La búsqueda no arrojó resultados\",\"tabtitle_find_user\":\"encontrar\",\"tabtitle_new_group\":\"nuevo grupo\",\"tabtitle_group_by_id\":\"por ID\",\"new_password_placeholder\":\"Introduzca una nueva contraseña\",\"label_reset_password\":\"Enviar un correo electrónico de restablecimiento de contraseña:\",\"credential_email_prompt\":\"Tu correo electrónico de registro\",\"button_reset\":\"Restablecer\",\"button_send_request\":\"Enviar petición\",\"label_server_to_use\":\"Servidor para usar:\",\"label_wire_transport\":\"Transporte de alambre:\",\"button_update\":\"Actualizar\",\"sidepanel_title_login\":\"Iniciar sesión\",\"sidepanel_title_register\":\"Crear cuenta\",\"sidepanel_title_settings\":\"Ajustes\",\"sidepanel_title_account_settings\":\"Ajustes de la cuenta\",\"sidepanel_title_acc_general\":\"General\",\"sidepanel_title_acc_security\":\"Seguridad\",\"sidepanel_title_acc_notifications\":\"Notificaciones\",\"sidepanel_title_acc_support\":\"Soporte\",\"sidepanel_title_newtpk\":\"Iniciar un nuevo chat\",\"sidepanel_title_cred\":\"Confirmar credenciales\",\"sidepanel_title_reset\":\"Restablecer contraseña\",\"sidepanel_title_archive\":\"Chats archivados\",\"sidepanel_title_blocked\":\"Chats bloqueados\",\"update_available\":\"Actualización disponible.\",\"reload_update\":\"Recargar\",\"reconnect_countdown\":\"Desconectado. Reconectando en {seconds}…\",\"reconnect_now\":\"Reintentar\",\"push_init_failed\":\"Error al inicializar las notificaciones push\",\"invalid_security_token\":\"Token de seguridad inválido\",\"no_connection\":\"Sin conexión\",\"code_doesnot_match\":\"El código no coincide\",\"phone_dative\":\"teléfono\",\"email_dative\":\"correo electrónico\",\"enter_confirmation_code_prompt\":\"Intruduzca el código de confirmación enviado a tu {method}:\",\"numeric_confirmation_code_prompt\":\"Sólo números\",\"button_confirm\":\"Confirmar\",\"save_attachment\":\"guardar\",\"deleted_content\":\"este mensaje fue eliminado\",\"invalid_content\":\"contenido inválido\",\"user_not_found\":\"Usuario no encontrado\",\"badge_you\":\"tú\",\"badge_owner\":\"propietario\",\"menu_item_info\":\"Información\",\"menu_item_clear_messages\":\"Borrar mensajes\",\"menu_item_clear_messages_for_all\":\"Borrar para todos\",\"menu_item_delete\":\"Eliminar\",\"menu_item_delete_for_all\":\"Eliminar para todos\",\"menu_item_send_retry\":\"Inténtalo de nuevo\",\"menu_item_mute\":\"Silenciar\",\"menu_item_unmute\":\"Anular el silencio\",\"menu_item_delete_topic\":\"Eliminar\",\"topic_delete_warning\":\"¿Estás seguro de que quieres eliminar esta conversación?\",\"menu_item_unblock\":\"Desbloquear\",\"menu_item_block\":\"Bloquear\",\"topic_block_warning\":\"¿Estás seguro de que quieres bloquear esta conversación\",\"menu_item_member_delete\":\"Eliminar\",\"menu_item_archive_topic\":\"Archivar\",\"action_cancel\":\"cancelar\",\"upload_finishing\":\"terminando...\",\"no_contacts\":\"No tienes contactos :-(\",\"contacts_not_found_short\":\"Ningún contacto coincide con ''{query}''\",\"title_group_members\":\"Miembros del grupo\",\"title_all_contacts\":\"Todos los contactos\",\"button_ok\":\"OK\",\"button_cancel\":\"Cancelar\",\"more_online_members\":\"+{overflow} más\",\"download_action\":\"descargar\",\"label_file_name\":\"Nombre del archivo:\",\"label_content_type\":\"Tipo de contenido:\",\"label_size\":\"Tamaño:\",\"chat_invitation\":\"Estás invitado a participar en un nuevo chat. ¿Qué te gustaría hacer?\",\"chat_invitation_accept\":\"Aceptar\",\"chat_invitation_ignore\":\"Ignorar\",\"chat_invitation_block\":\"Bloquear\",\"error_invalid_id\":\"ID inválido\",\"group_user_id_prompt\":\"ID del grupo o usuario\",\"button_subscribe\":\"Suscribirse\",\"topic_name_editing_placeholder\":\"Nombre del grupo\",\"button_create\":\"Crear\",\"permission_join\":\"Unirse ({val})\",\"permission_read\":\"Leer ({val})\",\"permission_write\":\"Escribir ({val})\",\"permission_pres\":\"Ser notificado ({val})\",\"permission_admin\":\"Approbar ({val})\",\"permission_share\":\"Compartir ({val})\",\"permission_delete\":\"Eliminar ({val})\",\"permission_owner\":\"Propietario ({val})\",\"title_permissions\":\"Permisos\",\"message_sending\":\"enviando...\",\"message_sending_failed\":\"no se pudo enviar el mensaje\",\"search_placeholder\":\"Ej. email:alice@example.com, tel:17025550003...\",\"messaging_disabled_prompt\":\"El envío de mensajes está deshabilitado\",\"new_message_prompt\":\"Nuevo mensaje\",\"image_caption_prompt\":\"Añade un comentario\",\"file_attachment_too_large\":\"El tamaño del archivo {size} excede el límite de {limit}.\",\"cannot_initiate_file_upload\":\"No se pudo iniciar la carga del archivo.\",\"tags_not_found\":\"No hay etiquetas definidas. Añade unas.\",\"tags_editor_no_tags\":\"Añadir etiquetas\",\"title_manage_tags\":\"Gestionar\",\"channel_prompt\":\"Este es un canal\",\"channel\":\"canal\"},\"ko\":{\"validate_credential_action\":\"확인\",\"title_tag_manager\":\"태그(사용자검색)\",\"label_user_contacts\":\"연락처: \",\"button_add_another\":\"다른항목추가\",\"label_message_sound\":\"메시지소리: \",\"label_push_notifications\":\"통지경보: \",\"label_push_notifications_disabled\":\"통지경보(HTTPS필요): \",\"label_incognito_mode\":\"시크릿모드: \",\"delete_account\":\"계정삭제\",\"delete_account_arning\":\"계정을삭제하시겠습니까?실행취소할수없습니다.\",\"label_password\":\"비밀번호\",\"password_unchanged_prompt\":\"변경되지않음\",\"button_logout\":\"로그아웃\",\"button_delete_account\":\"계정삭제\",\"label_default_access_mode\":\"기본액세스모드: \",\"blocked_contacts_link\":\"차단된연락처({수})\",\"link_contact_us\":\"문의처\",\"link_terms_of_service\":\"서비스약관\",\"link_privacy_policy\":\"개인정보보호정책\",\"label_sdk\":\"SDK:\",\"label_server_address\":\"서버주소: \",\"archived_contacts\":\"보관된연락처({수})\",\"contacts_not_found\":\"채팅이없습니다
¯∖_(ツ)_/¯\",\"full_name_prompt\":\"전체이름(예:홍길동)\",\"email_prompt\":\"이메일(예:hong@example.com)\",\"button_sign_up\":\"가입\",\"label_your_name\":\"이름\",\"label_user_id\":\"ID:\",\"button_edit\":\"편집\",\"requested_permissions\":\"요청\",\"menu_item_edit_permissions\":\"편집권한\",\"label_other_user\":\"기타\",\"action_clear_messages\":\"메시지지우기\",\"clear_messages_warning\":\"모든메시지를지우시겠습니까?실행취소할수없습니다.\",\"action_delete_messages\":\"모든메시지지우기\",\"delete_messages_warning\":\"모든사람의모든메시지를삭제하시겠습니까?실행취소할수없습니다.\",\"action_leave_chat\":\"대화나누기\",\"leave_chat_warning\":\"이대화를나가시겠습니까?\",\"action_block_contact\":\"연락차단\",\"block_contact_warning\":\"이연락처를차단하시겠습니까?\",\"action_report_chat\":\"대화기록\",\"report_chat_warning\":\"이대화를차단하고기록하시겠습니까?\",\"title_info\":\"정보\",\"label_topic_name\":\"이름\",\"label_private\":\"개인코멘트\",\"private_editing_placeholder\":\"나만볼수있습니다\",\"label_muting_topic\":\"음소거: \",\"action_more\":\"더보기\",\"label_your_permissions\":\"권한: \",\"label_permissions\":\"권한: \",\"label_you\":\"당신: \",\"label_default_access\":\"기본액세스모드: \",\"label_group_members\":\"그룹회원: \",\"button_add_members\":\"회원추가\",\"group_has_no_members\":\"회원없음\",\"login_prompt\":\"로그인\",\"password_prompt\":\"비밀번호\",\"stay_logged_in\":\"로그인상태유지\",\"forgot_password_link\":\"비밀번호를잊으셨습니까?\",\"button_sign_in\":\"로그인\",\"label_client\":\"클라이언트: \",\"label_server\":\"서버: \",\"online_now\":\"현재접속중\",\"last_seen_timestamp\":\"마지막으로본\",\"title_not_found\":\"찾을수없음\",\"unnamed_topic\":\"이름없는\",\"peers_messaging_disabled\":\"동료의메시지가비활성화되었습니다.\",\"enable_peers_messaging\":\"활성화\",\"search_for_contacts\":\"검색을사용하여연락처찾기\",\"search_no_results\":\"검색결과가없습니다\",\"tabtitle_find_user\":\"찾기\",\"tabtitle_new_group\":\"새그룹\",\"tabtitle_group_by_id\":\"id로\",\"new_password_placeholder\":\"새비밀번호입력\",\"label_reset_password\":\"비밀번호재설정이메일보내기: \",\"credential_email_prompt\":\"등록이메일\",\"button_reset\":\"재설정\",\"button_send_request\":\"요청보내기\",\"label_server_to_use\":\"사용할서버:\",\"label_wire_transport\":\"와이어수송:\",\"button_update\":\"업데이트\",\"sidepanel_title_login\":\"로그인\",\"sidepanel_title_register\":\"계정만들기\",\"sidepanel_title_settings\":\"설정\",\"sidepanel_title_account_settings\":\"계정설정\",\"sidepanel_title_acc_general\":\"일반\",\"sidepanel_title_acc_security\":\"보안\",\"sidepanel_title_acc_notifications\":\"알림\",\"sidepanel_title_acc_support\":\"지원\",\"sidepanel_title_newtpk\":\"새채팅시작\",\"sidepanel_title_cred\":\"자격증명확인\",\"sidepanel_title_reset\":\"비밀번호재설정\",\"sidepanel_title_archive\":\"보관된채팅\",\"sidepanel_title_blocked\":\"차단된채팅\",\"update_available\":\"업데이트가능.\",\"reload_update\":\"재로드\",\"reconnect_countdown\":\"연결이끊어졌습니다.다시연결하는중{초}…\",\"reconnect_now\":\"지금시도\",\"push_init_failed\":\"푸시알림을초기화하지못했습니다\",\"invalid_security_token\":\"유효하지않은보안토큰\",\"no_connection\":\"연결없음\",\"code_doesnot_match\":\"코드가일치하지않습니다\",\"phone_dative\":\"전화\",\"email_dative\":\"이메일\",\"enter_confirmation_code_prompt\":\"{방법}으로보낸확인코드를입력하십시오:\",\"numeric_confirmation_code_prompt\":\"숫자만\",\"button_confirm\":\"확인\",\"save_attachment\":\"저장\",\"invalid_content\":\"잘못된내용\",\"user_not_found\":\"찾을수없음\",\"badge_you\":\"당신\",\"badge_owner\":\"소유자\",\"menu_item_info\":\"정보\",\"menu_item_clear_messages\":\"메시지지우기\",\"menu_item_clear_messages_for_all\":\"모두지우기\",\"menu_item_delete\":\"삭제\",\"menu_item_delete_for_all\":\"모두삭제\",\"menu_item_send_retry\":\"다시시도\",\"menu_item_mute\":\"음소거\",\"menu_item_unmute\":\"음소거해제\",\"menu_item_delete_topic\":\"삭제\",\"topic_delete_warning\":\"이대화를삭제하시겠습니까?\",\"menu_item_unblock\":\"차단해제\",\"menu_item_block\":\"차단\",\"topic_block_warning\":\"이대화를차단하시겠습니까?\",\"menu_item_member_delete\":\"제거\",\"menu_item_archive_topic\":\"보관\",\"action_cancel\":\"취소\",\"upload_finishing\":\"마무리...\",\"no_contacts\":\"연락처가없습니다 (._.)\",\"contacts_not_found_short\":\"'{문의}'와일치하는연락처가없습니다.\",\"title_group_members\":\"그룹구성원\",\"title_all_contacts\":\"모든연락처\",\"button_ok\":\"OK\",\"button_cancel\":\"취소\",\"more_online_members\":\"+{넘침}더보기\",\"download_action\":\"다운로드\",\"label_file_name\":\"파일이름: \",\"label_content_type\":\"컨텐츠유형: \",\"label_size\":\"크기: \",\"chat_invitation\":\"새로운대화를시작하도록초대되었습니다.무엇을하시겠습니까?\",\"chat_invitation_accept\":\"수락\",\"chat_invitation_ignore\":\"무시\",\"chat_invitation_block\":\"차단\",\"error_invalid_id\":\"잘못된ID\",\"group_user_id_prompt\":\"그룹또는사용자ID\",\"button_subscribe\":\"구독\",\"topic_name_editing_placeholder\":\"그룹의자유형이름\",\"button_create\":\"작성\",\"permission_join\":\"참여({val})\",\"permission_read\":\"읽기({val})\",\"permission_write\":\"쓰기({val})\",\"permission_pres\":\"알림받기({val})\",\"permission_admin\":\"승인({val})\",\"permission_share\":\"공유({val})\",\"permission_delete\":\"삭제({val})\",\"permission_owner\":\"소유자({val})\",\"title_permissions\":\"권한\",\"message_sending\":\"보내기...\",\"message_sending_failed\":\"실패\",\"search_placeholder\":\"email:alice@example.com,tel:17025550003...와같은목록\",\"messaging_disabled_prompt\":\"메시지비활성화\",\"new_message_prompt\":\"새메시지\",\"image_caption_prompt\":\"이미지설명\",\"file_attachment_too_large\":\"파일크기{크기}이(가){제한}제한을초과합니다.\",\"cannot_initiate_file_upload\":\"파일업로드를시작할수없습니다.\",\"tags_not_found\":\"태그가정의되지않았습니다.일부를추가하십시오.\",\"tags_editor_no_tags\":\"일부태그추가\",\"title_manage_tags\":\"관리\",\"granted_permissions\":\"승낙하다\",\"messages_not_readable\":\"메시지에 액세스 할 수 없습니다\",\"deleted_content\":\"내용이 삭제되었습니다\",\"channel_prompt\":\"이 채널입니다\",\"channel\":\"채널\"},\"ro\":{\"validate_credential_action\":\"confirmă\",\"title_tag_manager\":\"Tag-uri (user discovery)\",\"label_user_contacts\":\"Contacte:\",\"button_add_another\":\"Adaugă\",\"label_message_sound\":\"Sunet de mesaj:\",\"label_push_notifications\":\"Alerte de notificare:\",\"label_push_notifications_disabled\":\"Alerte de notificare (necesită HTTPS):\",\"label_incognito_mode\":\"Mod incognito:\",\"delete_account\":\"Șterge contul\",\"delete_account_arning\":\"Ești sigur că dorești să ștergi contul? Acesta nu va putea fi recuperat.\",\"label_password\":\"Parola\",\"password_unchanged_prompt\":\"Neschimbată\",\"button_logout\":\"Deconectare\",\"button_delete_account\":\"Șterge cont\",\"label_default_access_mode\":\"Default access mode:\",\"blocked_contacts_link\":\"Contact blocate ({count})\",\"link_contact_us\":\"Contactează-ne\",\"link_terms_of_service\":\"Termenii Serviciului\",\"link_privacy_policy\":\"Politica de Confidențialitate\",\"label_sdk\":\"SDK:\",\"label_server_address\":\"Adresa serverului:\",\"archived_contacts\":\"Contacte arhivate ({count})\",\"contacts_not_found\":\"Nu ai contacte salvate
¯∖_(ツ)_/¯\",\"full_name_prompt\":\"Numele tău\",\"email_prompt\":\"Adresa de e-mail\",\"button_sign_up\":\"Creează cont\",\"label_your_name\":\"Numele tău\",\"label_user_id\":\"ID:\",\"button_edit\":\"Editează\",\"requested_permissions\":\"Necesare\",\"granted_permissions\":\"Oferite\",\"menu_item_edit_permissions\":\"Editează permisiuni\",\"label_other_user\":\"Altele\",\"action_clear_messages\":\"Șterge mesajele\",\"clear_messages_warning\":\"Ești sigur că dorești să ștergi mesajele? Acestea nu pot fi recuperate.\",\"action_delete_messages\":\"Șterge toate mesajele\",\"delete_messages_warning\":\"Ești sigur că dorești să șterge mesajele din toate conversațiile? Acestea nu pot fi recuperate.\",\"action_leave_chat\":\"Ieși din conversație\",\"leave_chat_warning\":\"Ești sigur că dorești să ieși din conersație?\",\"action_block_contact\":\"Blochează contact\",\"block_contact_warning\":\"Ești sigur că dorești să blochezi acest contact?\",\"action_report_chat\":\"Raportează conversația\",\"report_chat_warning\":\"Ești sigur că dorești să blochezi și să raportezi această conversație?\",\"title_info\":\"Info\",\"label_topic_name\":\"Nume\",\"label_private\":\"Comentariu privat\",\"private_editing_placeholder\":\"Vizibil doar ție\",\"label_muting_topic\":\"Mod silențios (muted):\",\"action_more\":\"Mai multe\",\"label_your_permissions\":\"Permisiuniile tale:\",\"label_permissions\":\"Permisiuni:\",\"label_you\":\"Tu:\",\"label_default_access\":\"Modul default:\",\"label_group_members\":\"Membrii grupului:\",\"button_add_members\":\"Adaugă persoane\",\"group_has_no_members\":\"În acest grup nu se află persoane\",\"login_prompt\":\"Conectează-te\",\"password_prompt\":\"Parola\",\"stay_logged_in\":\"Rămâi conectat\",\"forgot_password_link\":\"Ți-ai uitat parola?\",\"button_sign_in\":\"Conectează-te\",\"label_client\":\"Client:\",\"label_server\":\"Server:\",\"online_now\":\"online acum\",\"last_seen_timestamp\":\"Văzut ultima dată\",\"title_not_found\":\"Nu a fost găsit\",\"channel\":\"canal\",\"unnamed_topic\":\"Nedenumit\",\"messages_not_readable\":\"Mesajele nu pot fi citite\",\"peers_messaging_disabled\":\"Mesageria de tip Peer este dezactivată.\",\"enable_peers_messaging\":\"Activează\",\"search_for_contacts\":\"Caută în contacte\",\"search_no_results\":\"Nu s-au găsit rezultate\",\"tabtitle_find_user\":\"caută\",\"tabtitle_new_group\":\"grup nou\",\"tabtitle_group_by_id\":\"după id\",\"new_password_placeholder\":\"Introdu parolă\",\"label_reset_password\":\"Resetează parola:\",\"credential_email_prompt\":\"Adresa de e-mail\",\"button_reset\":\"Resetează\",\"button_send_request\":\"Trimite cerere\",\"label_server_to_use\":\"Server de utilizat:\",\"label_wire_transport\":\"Transportul legat:\",\"button_update\":\"Actualizează\",\"sidepanel_title_login\":\"Conectează-te\",\"sidepanel_title_register\":\"Creează Cont\",\"sidepanel_title_settings\":\"Setări\",\"sidepanel_title_account_settings\":\"Setările Contului\",\"sidepanel_title_acc_general\":\"Generale\",\"sidepanel_title_acc_security\":\"Securitate\",\"sidepanel_title_acc_notifications\":\"Notificări\",\"sidepanel_title_acc_support\":\"Ajutor\",\"sidepanel_title_newtpk\":\"Creeză un nou Chat\",\"sidepanel_title_cred\":\"Confirmă credențiale\",\"sidepanel_title_reset\":\"Resetează Parola\",\"sidepanel_title_archive\":\"Conversații Arhivate\",\"sidepanel_title_blocked\":\"Conversații Blocate\",\"reconnect_countdown\":\"Deconectat. Se încearcă conectarea în {seconds}…\",\"reconnect_now\":\"Încearcă din nou\",\"push_init_failed\":\"Nu s-a reușit inițializarea tip push notifications\",\"invalid_security_token\":\"Codul de securitate este invalid\",\"no_connection\":\"Nu există conexiune\",\"code_doesnot_match\":\"Codul furnizat nu este valid\",\"update_available\":\"Actualizare disponibilă.\",\"reload_update\":\"Reîncarcă\",\"phone_dative\":\"telefon\",\"email_dative\":\"email\",\"enter_confirmation_code_prompt\":\"Introu codul de confirmare trimis pe {method}:\",\"numeric_confirmation_code_prompt\":\"Doar cifre\",\"button_confirm\":\"Confirmă\",\"save_attachment\":\"salvează\",\"deleted_content\":\"conținut șters\",\"invalid_content\":\"conținut invalid\",\"user_not_found\":\"Utilizatorul nu a fost găsit\",\"badge_you\":\"tu\",\"badge_owner\":\"owner\",\"menu_item_info\":\"Info\",\"menu_item_clear_messages\":\"Șterge mesajele\",\"menu_item_clear_messages_for_all\":\"Ștergele pe toate\",\"menu_item_delete\":\"Șterge\",\"menu_item_delete_for_all\":\"Ștergele pe toate\",\"menu_item_send_retry\":\"Reîncearcă\",\"menu_item_mute\":\"Mute\",\"menu_item_unmute\":\"Unmute\",\"menu_item_delete_topic\":\"Șterge\",\"topic_delete_warning\":\"Ești sigur că dorești să șterge această conversație?\",\"menu_item_unblock\":\"Deblochează\",\"menu_item_block\":\"Blochează\",\"topic_block_warning\":\"Ești sigur că dorești să blochezi această conversație?\",\"menu_item_member_delete\":\"Șterge persoană\",\"menu_item_archive_topic\":\"Arhivează\",\"action_cancel\":\"anulează\",\"upload_finishing\":\"se încarcă...\",\"no_contacts\":\"Nu ai contacte adăugate :-(\",\"contacts_not_found_short\":\"Niciun contact găsit după criteriile ''{query}''\",\"title_group_members\":\"Persoanele din grup\",\"title_all_contacts\":\"Toate Contactele\",\"button_ok\":\"OK\",\"button_cancel\":\"Anulează\",\"more_online_members\":\"+{overflow} mai mult\",\"download_action\":\"download\",\"label_file_name\":\"Nume fișier:\",\"label_content_type\":\"Tip conținut:\",\"label_size\":\"Size:\",\"chat_invitation\":\"Ai primit invitație într-o conversație. Accepți?\",\"chat_invitation_accept\":\"Da, accept\",\"chat_invitation_ignore\":\"Ignoră\",\"chat_invitation_block\":\"Blochează\",\"error_invalid_id\":\"ID Invalid\",\"group_user_id_prompt\":\"Grup sau user ID\",\"button_subscribe\":\"Subscribe\",\"topic_name_editing_placeholder\":\"Numele grupului\",\"channel_prompt\":\"Acesta este un canal\",\"button_create\":\"Creează\",\"permission_join\":\"Participare ({val})\",\"permission_read\":\"Citire ({val})\",\"permission_write\":\"Scriere ({val})\",\"permission_pres\":\"Notificare ({val})\",\"permission_admin\":\"Aprobare ({val})\",\"permission_share\":\"Distribuire ({val})\",\"permission_delete\":\"Ștergere ({val})\",\"permission_owner\":\"Deținător ({val})\",\"title_permissions\":\"Permisiuni\",\"message_sending\":\"se trimite...\",\"message_sending_failed\":\"eroare\",\"search_placeholder\":\"Caută după e-mail sau număr telefon...\",\"messaging_disabled_prompt\":\"Mesageria este dezactivată\",\"new_message_prompt\":\"Mesaj nou\",\"image_caption_prompt\":\"Titlul imaginii\",\"file_attachment_too_large\":\"Dimensiunea fișiterului {size} depășește limita de {limit}.\",\"cannot_initiate_file_upload\":\"Nu se poate face încărcarea.\",\"tags_not_found\":\"Niciun tag definit. Adaugă.\",\"tags_editor_no_tags\":\"Adaugă tag-uri\",\"title_manage_tags\":\"Administrează\"},\"ru\":{\"contacts_not_found\":\"Чатов нет
¯∖_(ツ)_/¯\",\"full_name_prompt\":\"Полное имя, напр. Иван Петров\",\"email_prompt\":\"Email, напр. ivan@example.com\",\"button_sign_up\":\"Создать аккаунт\",\"label_your_name\":\"Ваше имя\",\"label_password\":\"Пароль\",\"password_unchanged_prompt\":\"Не изменен\",\"label_user_id\":\"ID:\",\"label_default_access_mode\":\"Доступ по умолчанию:\",\"label_message_sound\":\"Звук нового сообщения:\",\"label_push_notifications\":\"Уведомления:\",\"label_push_notifications_disabled\":\"Уведомления (требуют HTTPS):\",\"title_tag_manager\":\"Теги для поиска\",\"button_logout\":\"Выйти\",\"login_prompt\":\"Логин\",\"password_prompt\":\"Пароль\",\"stay_logged_in\":\"Запомнить\",\"forgot_password_link\":\"Напомнить пароль\",\"button_sign_in\":\"Войти\",\"label_client\":\"Клиент:\",\"label_server\":\"Сервер:\",\"online_now\":\"онлайн\",\"last_seen_timestamp\":\"Был активен\",\"title_not_found\":\"Не найден\",\"unnamed_topic\":\"Без названия\",\"messages_not_readable\":\"нет доступа к сообщениям\",\"tabtitle_find_user\":\"найти\",\"tabtitle_new_group\":\"создать\",\"tabtitle_group_by_id\":\"по id\",\"label_server_to_use\":\"Использовать сервер:\",\"label_wire_transport\":\"Соединение:\",\"button_update\":\"Применить\",\"sidepanel_title_login\":\"Авторизация\",\"sidepanel_title_register\":\"Зарегистрироваться\",\"sidepanel_title_settings\":\"Настройки\",\"sidepanel_title_account_settings\":\"Настройки аккаунта\",\"sidepanel_title_newtpk\":\"Новый чат\",\"sidepanel_title_cred\":\"Подтвердить\",\"sidepanel_title_reset\":\"Сменить пароль\",\"tags_not_found\":\"Тегов нет. Добавьте\",\"tags_editor_no_tags\":\"Добавьте теги\",\"title_manage_tags\":\"Редактировать\",\"message_sending\":\"в пути...\",\"message_sending_failed\":\"ошибка\",\"search_placeholder\":\"Список, напр. email:alice@example.com, tel:+17025550003...\",\"messaging_disabled_prompt\":\"Отправка недоступна\",\"new_message_prompt\":\"Новое сообщение\",\"file_attachment_too_large\":\"Размер файла {size} превышает {limit} лимит.\",\"cannot_initiate_file_upload\":\"Ошибка загрузки файла.\",\"search_for_contacts\":\"Поиск контактов\",\"enter_confirmation_code_prompt\":\"Код подтверждения, полученный по {method}:\",\"numeric_confirmation_code_prompt\":\"Только цифры\",\"button_confirm\":\"Подтвердить\",\"button_ok\":\"OK\",\"button_cancel\":\"Отменить\",\"invalid_content\":\"сообщение не читается\",\"label_file_name\":\"Имя файла:\",\"label_content_type\":\"Тип:\",\"label_size\":\"Размер:\",\"phone_dative\":\"телефону\",\"email_dative\":\"емейлу\",\"title_group_members\":\"Участники\",\"download_action\":\"скачать\",\"permission_join\":\"Подписываться ({val})\",\"permission_read\":\"Читать ({val})\",\"permission_write\":\"Писать ({val})\",\"permission_pres\":\"Уведомлять ({val})\",\"permission_admin\":\"Подтверждать ({val})\",\"permission_share\":\"Приглашать ({val})\",\"permission_delete\":\"Удалять ({val})\",\"permission_owner\":\"Владелец ({val})\",\"title_permissions\":\"Права доступа\",\"requested_permissions\":\"Требуются\",\"granted_permissions\":\"Получены\",\"menu_item_edit_permissions\":\"Права доступа\",\"label_other_user\":\"Второй\",\"label_topic_name\":\"Название\",\"label_private\":\"Комментарий\",\"private_editing_placeholder\":\"Виден только вам\",\"label_muting_topic\":\"Без уведомлений\",\"action_more\":\"Ещё\",\"label_your_permissions\":\"Ваши права доступа:\",\"label_permissions\":\"Права доступа:\",\"label_you\":\"Вы:\",\"label_default_access\":\"Права по умолчанию:\",\"label_group_members\":\"Участники чата:\",\"button_add_members\":\"Добавить\",\"group_has_no_members\":\"Нет участников\",\"action_leave_chat\":\"Уйти из чата\",\"menu_item_info\":\"Информация\",\"menu_item_clear_messages\":\"Удалить сообщения\",\"menu_item_clear_messages_for_all\":\"Удалить для всех\",\"menu_item_delete\":\"Удалить\",\"menu_item_delete_for_all\":\"Удалить для всех\",\"menu_item_send_retry\":\"Отправить заново\",\"menu_item_mute\":\"Не уведомлять\",\"menu_item_unmute\":\"Уведомлять\",\"menu_item_delete_topic\":\"Удалить чат\",\"menu_item_unblock\":\"Разблокировать\",\"menu_item_block\":\"Заблокировать\",\"menu_item_member_delete\":\"Отписать\",\"title_info\":\"Подробности\",\"new_password_placeholder\":\"Введите новый пароль\",\"label_reset_password\":\"Отправить емейл для смены пароля:\",\"credential_email_prompt\":\"Регистрационный емейл\",\"button_reset\":\"Изменить\",\"button_send_request\":\"Отправить\",\"action_cancel\":\"отменить\",\"upload_finishing\":\"завершение...\",\"no_contacts\":\"Ничего нет :-(\",\"contacts_not_found_short\":\"Нет контактов для запроса ''{query}''\",\"title_all_contacts\":\"Все контакты\",\"error_invalid_id\":\"Неверный ID\",\"group_user_id_prompt\":\"ID чата или пользователя\",\"button_subscribe\":\"Подписаться\",\"topic_name_editing_placeholder\":\"Название чата\",\"button_create\":\"Создать\",\"badge_you\":\"вы\",\"badge_owner\":\"влад.\",\"update_available\":\"Есть новая версия приложения.\",\"reload_update\":\"Обновить\",\"user_not_found\":\"Не найден\",\"reconnect_countdown\":\"Нет связи. Подключение через {seconds}…\",\"reconnect_now\":\"Подключить сейчас.\",\"save_attachment\":\"сохранить\",\"menu_item_archive_topic\":\"В архив\",\"archived_contacts\":\"Чаты в архиве ({count})\",\"sidepanel_title_archive\":\"Архив чатов\",\"chat_invitation\":\"Вас пригласили начать новый чат. Как вы хотите поступить?\",\"chat_invitation_accept\":\"Принять\",\"chat_invitation_ignore\":\"Игнорировать\",\"chat_invitation_block\":\"Заблокировать\",\"peers_messaging_disabled\":\"Чат заблокирован у корреспондента.\",\"enable_peers_messaging\":\"Разблокировать.\",\"more_online_members\":\"+еще {overflow}\",\"label_user_contacts\":\"Конакты:\",\"validate_credential_action\":\"подтвердить\",\"link_contact_us\":\"Связаться с нами\",\"link_terms_of_service\":\"Условия сервиса\",\"link_privacy_policy\":\"Политика конфиденциальности\",\"action_delete_messages\":\"Удалить сообщения\",\"action_block_contact\":\"Заблокировать контакт\",\"action_report_chat\":\"Сообщить о нарушении\",\"delete_messages_warning\":\"Вы действительно хотите удалить все сообщения?\",\"leave_chat_warning\":\"Вы действительно хотите покинуть этот чат?\",\"block_contact_warning\":\"Вы действительно заблокировать этот контакт?\",\"report_chat_warning\":\"Вы действительно хотите сообщить о нарушении и заблокировать этот чат?\",\"action_clear_messages\":\"Удалить сообщения\",\"clear_messages_warning\":\"Вы действительно хотите удалить все сообщения в чате? Их будет невозможно восстановить.\",\"topic_delete_warning\":\"Вы действительно хотите удалить этот чат?\",\"topic_block_warning\":\"Вы действительно хотите заблокировать этот чат?\",\"search_no_results\":\"Ничего не найдено\",\"deleted_content\":\"удалено\",\"image_caption_prompt\":\"Подпись к фото\",\"label_incognito_mode\":\"Режим инкогнито:\",\"delete_account\":\"Удалить аккаунт\",\"delete_account_arning\":\"Вы уверены, что ходите удалить свой аккаунт? Его невозможно будет восстановить.\",\"button_delete_account\":\"Удалить аккаунт\",\"sidepanel_title_acc_security\":\"Безопасность\",\"sidepanel_title_acc_notifications\":\"Уведомления\",\"sidepanel_title_acc_support\":\"Поддержка\",\"label_sdk\":\"SDK:\",\"label_server_address\":\"Адрес сервера:\",\"button_edit\":\"Редактировать\",\"button_add_another\":\"Добавить\",\"sidepanel_title_acc_general\":\"Общие настройки\",\"blocked_contacts_link\":\"Заблокированные ({count})\",\"sidepanel_title_blocked\":\"Заблокированные чаты\",\"push_init_failed\":\"Ошибка инициализации пуш уведомлений\",\"invalid_security_token\":\"Токен некорректен\",\"no_connection\":\"Нет связи\",\"code_doesnot_match\":\"Код не совпадает\",\"channel_prompt\":\"Создать канал\",\"channel\":\"канал\"},\"zh\":{\"archived_contacts\":\"已归档联系人 ({count})\",\"contacts_not_found\":\"你尚无会话
¯∖_(ツ)_/¯\",\"full_name_prompt\":\"全名,例如张伟\",\"email_prompt\":\"电子邮件,例如 zhang@example.com\",\"button_sign_up\":\"注册\",\"label_your_name\":\"你的姓名\",\"label_password\":\"密码\",\"password_unchanged_prompt\":\"未改变\",\"label_user_id\":\"地址:\",\"label_default_access_mode\":\"蓦然访问模式:\",\"label_message_sound\":\"消息提示音:\",\"label_push_notifications\":\"通知提醒:\",\"label_push_notifications_disabled\":\"通知提醒(需要 HTTPS):\",\"title_tag_manager\":\"标签(用户发现)\",\"button_logout\":\"登出\",\"requested_permissions\":\"已请求\",\"granted_permissions\":\"已授予\",\"menu_item_edit_permissions\":\"编辑权限\",\"label_other_user\":\"其他\",\"title_info\":\"信息\",\"label_topic_name\":\"名称\",\"label_private\":\"私人评论\",\"private_editing_placeholder\":\"仅自己可见\",\"label_muting_topic\":\"已静音:\",\"action_more\":\"更多\",\"label_your_permissions\":\"你的权限:\",\"label_permissions\":\"权限:\",\"label_you\":\"你:\",\"label_default_access\":\"默认权限模式:\",\"label_group_members\":\"群组成员:\",\"button_add_members\":\"添加成员\",\"group_has_no_members\":\"无成员\",\"action_leave_chat\":\"离开\",\"login_prompt\":\"登录\",\"password_prompt\":\"密码\",\"stay_logged_in\":\"保持登录\",\"forgot_password_link\":\"忘记密码?\",\"button_sign_in\":\"登录\",\"label_client\":\"客户端:\",\"label_server\":\"服务器:\",\"online_now\":\"在线\",\"last_seen_timestamp\":\"最后可见\",\"title_not_found\":\"无法找到\",\"unnamed_topic\":\"未命名\",\"messages_not_readable\":\"无消息访问权限\",\"peers_messaging_disabled\":\"成员间消息已禁用。\",\"enable_peers_messaging\":\"启用\",\"tabtitle_find_user\":\"搜索\",\"tabtitle_new_group\":\"新群组\",\"tabtitle_group_by_id\":\"通过 id\",\"search_for_contacts\":\"使用搜索寻找联系人\",\"new_password_placeholder\":\"输入新密码\",\"label_reset_password\":\"发送密码重置邮件:\",\"credential_email_prompt\":\"你的注册邮箱\",\"button_reset\":\"重置\",\"button_send_request\":\"发送请求\",\"label_server_to_use\":\"使用的服务器:\",\"label_wire_transport\":\"线路传输:\",\"button_update\":\"更新\",\"sidepanel_title_login\":\"登录\",\"sidepanel_title_register\":\"创建账户\",\"sidepanel_title_settings\":\"设置\",\"sidepanel_title_account_settings\":\"帐号设定\",\"sidepanel_title_newtpk\":\"开始新会话\",\"sidepanel_title_cred\":\"确认凭据\",\"sidepanel_title_reset\":\"重置密码\",\"sidepanel_title_archive\":\"已存档会话\",\"update_available\":\"更新可用。\",\"reload_update\":\"重新载入\",\"reconnect_countdown\":\"连接已断开。{seconds} 秒后重新连接…\",\"reconnect_now\":\"立即尝试\",\"phone_dative\":\"电话\",\"email_dative\":\"电子邮件\",\"enter_confirmation_code_prompt\":\"输入通过{method}发送的验证码:\",\"numeric_confirmation_code_prompt\":\"仅数字\",\"button_confirm\":\"确认\",\"save_attachment\":\"保存\",\"invalid_content\":\"无效内容\",\"user_not_found\":\"未找到\",\"badge_you\":\"你\",\"badge_owner\":\"所有者\",\"menu_item_info\":\"信息\",\"menu_item_clear_messages\":\"清空消息\",\"menu_item_clear_messages_for_all\":\"全部清除\",\"menu_item_delete\":\"删除\",\"menu_item_delete_for_all\":\"全部删除\",\"menu_item_mute\":\"静音\",\"menu_item_unmute\":\"取消静音\",\"menu_item_delete_topic\":\"删除\",\"menu_item_unblock\":\"取消屏蔽\",\"menu_item_block\":\"屏蔽\",\"menu_item_member_delete\":\"移除\",\"menu_item_archive_topic\":\"归档\",\"action_cancel\":\"取消\",\"upload_finishing\":\"正在结束...\",\"no_contacts\":\"你尚无联系人 (._.)\",\"contacts_not_found_short\":\"无联系人匹配''{query}''\",\"title_group_members\":\"群组成员\",\"title_all_contacts\":\"全部联系人\",\"button_ok\":\"好\",\"button_cancel\":\"取消\",\"download_action\":\"下载\",\"label_file_name\":\"文件名:\",\"label_content_type\":\"内容类型:\",\"label_size\":\"大小:\",\"chat_invitation\":\"你受邀开始新会话。你想怎么做?\",\"chat_invitation_accept\":\"接受\",\"chat_invitation_ignore\":\"忽略\",\"chat_invitation_block\":\"屏蔽\",\"error_invalid_id\":\"无效 ID\",\"group_user_id_prompt\":\"群组或用户 ID\",\"button_subscribe\":\"订阅\",\"topic_name_editing_placeholder\":\"群组自由格式名称\",\"button_create\":\"创建\",\"permission_join\":\"加入 ({val})\",\"permission_read\":\"读取 ({val})\",\"permission_write\":\"写入 ({val})\",\"permission_pres\":\"获取通知 ({val})\",\"permission_admin\":\"批准 ({val})\",\"permission_share\":\"分享 ({val})\",\"permission_delete\":\"删除 ({val})\",\"permission_owner\":\"所有者 ({val})\",\"title_permissions\":\"权限\",\"message_sending\":\"正在发送...\",\"message_sending_failed\":\"发送失败\",\"search_placeholder\":\"列表如 email:alice@example.com, tel:+17025550003...\",\"messaging_disabled_prompt\":\"消息已禁用\",\"new_message_prompt\":\"新消息\",\"file_attachment_too_large\":\"文件大小 {size} 超过 {limit} 限制。\",\"cannot_initiate_file_upload\":\"无法初始化文件上传。\",\"tags_not_found\":\"尚未定义标签。添加一些。\",\"tags_editor_no_tags\":\"添加一些标签\",\"title_manage_tags\":\"管理标签\",\"more_online_members\":\"还有{overflow}个\",\"label_user_contacts\":\"往来:\",\"validate_credential_action\":\"确认\",\"link_contact_us\":\"联系我们\",\"link_terms_of_service\":\"条款和条件\",\"link_privacy_policy\":\"隐私政策\",\"action_delete_messages\":\"删除所有帖子\",\"action_block_contact\":\"屏蔽联系人\",\"delete_messages_warning\":\"您确定要删除所有消息吗?无法撤消。\",\"leave_chat_warning\":\"您确定要退出此对话吗?\",\"block_contact_warning\":\"您确定要阻止此联系人吗?\",\"action_report_chat\":\"检举垃圾邮件\",\"report_chat_warning\":\"您确定要停止并报告此对话吗?\",\"action_clear_messages\":\"删除讯息\",\"clear_messages_warning\":\"您确定要清除所有消息吗?无法撤消。\",\"topic_delete_warning\":\"您确定要删除此对话吗?\",\"topic_block_warning\":\"您确定要阻止此对话吗?\",\"search_no_results\":\"搜索返回任何结果\",\"deleted_content\":\"内容已删除\",\"image_caption_prompt\":\"图片标题\",\"menu_item_send_retry\":\"重试\",\"label_incognito_mode\":\"无痕模式:\",\"delete_account\":\"删除帐户\",\"delete_account_arning\":\"您确定要删除您的帐户吗?无法撤消。\",\"button_delete_account\":\"删除帐户\",\"sidepanel_title_acc_security\":\"安全\",\"sidepanel_title_acc_notifications\":\"通知\",\"sidepanel_title_acc_support\":\"支持\",\"label_sdk\":\"开发包:\",\"label_server_address\":\"服务器地址:\",\"button_edit\":\"编辑\",\"button_add_another\":\"加上另一个\",\"sidepanel_title_acc_general\":\"常用设定\",\"blocked_contacts_link\":\"封锁的联络人 ({count})\",\"sidepanel_title_blocked\":\"被阻止的聊天\",\"push_init_failed\":\"初始化推送通知失败\",\"invalid_security_token\":\"无效的安全令牌\",\"no_connection\":\"无连接\",\"code_doesnot_match\":\"代码不匹配\",\"channel_prompt\":\"这是一个频道\",\"channel\":\"频道\"}}");
+
+/***/ }),
+
+/***/ "react":
+/*!************************!*\
+ !*** external "React" ***!
+ \************************/
+/***/ (function(module) {
+
+module.exports = React;
+
+/***/ }),
+
+/***/ "react-dom":
+/*!***************************!*\
+ !*** external "ReactDOM" ***!
+ \***************************/
+/***/ (function(module) {
+
+module.exports = ReactDOM;
+
+/***/ }),
+
+/***/ "react-intl":
+/*!****************************!*\
+ !*** external "ReactIntl" ***!
+ \****************************/
+/***/ (function(module) {
+
+module.exports = ReactIntl;
+
+/***/ }),
+
+/***/ "tinode-sdk":
+/*!*************************!*\
+ !*** external "Tinode" ***!
+ \*************************/
+/***/ (function(module) {
+
+module.exports = Tinode;
+
+/***/ }),
+
+/***/ "firebase/app":
+/*!***************************!*\
+ !*** external "firebase" ***!
+ \***************************/
+/***/ (function(module) {
+
+module.exports = firebase;
+
+/***/ }),
+
+/***/ "firebase/messaging":
+/*!*****************************************!*\
+ !*** external ["firebase","messaging"] ***!
+ \*****************************************/
+/***/ (function(module) {
+
+module.exports = firebase.messaging;
+
+/***/ })
+
+/******/ });
+/************************************************************************/
+/******/ // The module cache
+/******/ var __webpack_module_cache__ = {};
+/******/
+/******/ // The require function
+/******/ function __webpack_require__(moduleId) {
+/******/ // Check if module is in cache
+/******/ if(__webpack_module_cache__[moduleId]) {
+/******/ return __webpack_module_cache__[moduleId].exports;
+/******/ }
+/******/ // Create a new module (and put it into the cache)
+/******/ var module = __webpack_module_cache__[moduleId] = {
+/******/ // no module.id needed
+/******/ // no module.loaded needed
+/******/ exports: {}
+/******/ };
+/******/
+/******/ // Execute the module function
+/******/ __webpack_modules__[moduleId](module, module.exports, __webpack_require__);
+/******/
+/******/ // Return the exports of the module
+/******/ return module.exports;
+/******/ }
+/******/
+/************************************************************************/
+/******/ /* webpack/runtime/compat get default export */
+/******/ !function() {
+/******/ // getDefaultExport function for compatibility with non-harmony modules
+/******/ __webpack_require__.n = function(module) {
+/******/ var getter = module && module.__esModule ?
+/******/ function() { return module['default']; } :
+/******/ function() { return module; };
+/******/ __webpack_require__.d(getter, { a: getter });
+/******/ return getter;
+/******/ };
+/******/ }();
+/******/
+/******/ /* webpack/runtime/define property getters */
+/******/ !function() {
+/******/ // define getter functions for harmony exports
+/******/ __webpack_require__.d = function(exports, definition) {
+/******/ for(var key in definition) {
+/******/ if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {
+/******/ Object.defineProperty(exports, key, { enumerable: true, get: definition[key] });
+/******/ }
+/******/ }
+/******/ };
+/******/ }();
+/******/
+/******/ /* webpack/runtime/hasOwnProperty shorthand */
+/******/ !function() {
+/******/ __webpack_require__.o = function(obj, prop) { return Object.prototype.hasOwnProperty.call(obj, prop); }
+/******/ }();
+/******/
+/******/ /* webpack/runtime/make namespace object */
+/******/ !function() {
+/******/ // define __esModule on exports
+/******/ __webpack_require__.r = function(exports) {
+/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
+/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
+/******/ }
+/******/ Object.defineProperty(exports, '__esModule', { value: true });
+/******/ };
+/******/ }();
+/******/
+/************************************************************************/
+/******/ // startup
+/******/ // Load entry module
+/******/ __webpack_require__("./src/index.js");
+/******/ // This entry module used 'exports' so it can't be inlined
+/******/ })()
+;
//# sourceMappingURL=index.dev.js.map
\ No newline at end of file
diff --git a/umd/index.dev.js.map b/umd/index.dev.js.map
index 283228d2..ba9c4cbd 100644
--- a/umd/index.dev.js.map
+++ b/umd/index.dev.js.map
@@ -1 +1 @@
-{"version":3,"sources":["webpack://tinode-webapp/./src/config.js","webpack://tinode-webapp/./src/index.js","webpack://tinode-webapp/./src/lib/blob-helpers.js","webpack://tinode-webapp/./src/lib/host-name.js","webpack://tinode-webapp/./src/lib/local-storage.js","webpack://tinode-webapp/./src/lib/navigation.js","webpack://tinode-webapp/./src/lib/strformat.js","webpack://tinode-webapp/./src/lib/utils.js","webpack://tinode-webapp/./src/version.js","webpack://tinode-webapp/./src/views/acc-general-view.jsx","webpack://tinode-webapp/./src/views/acc-notifications-view.jsx","webpack://tinode-webapp/./src/views/acc-security-view.jsx","webpack://tinode-webapp/./src/views/acc-support-view.jsx","webpack://tinode-webapp/./src/views/contacts-view.jsx","webpack://tinode-webapp/./src/views/create-account-view.jsx","webpack://tinode-webapp/./src/views/edit-account-view.jsx","webpack://tinode-webapp/./src/views/info-view.jsx","webpack://tinode-webapp/./src/views/login-view.jsx","webpack://tinode-webapp/./src/views/logo-view.jsx","webpack://tinode-webapp/./src/views/messages-view.jsx","webpack://tinode-webapp/./src/views/new-topic-view.jsx","webpack://tinode-webapp/./src/views/password-reset-view.jsx","webpack://tinode-webapp/./src/views/settings-view.jsx","webpack://tinode-webapp/./src/views/sidepanel-view.jsx","webpack://tinode-webapp/./src/views/tinode-web.jsx","webpack://tinode-webapp/./src/views/validation-view.jsx","webpack://tinode-webapp/./src/widgets/alert.jsx","webpack://tinode-webapp/./src/widgets/attachment.jsx","webpack://tinode-webapp/./src/widgets/avatar-upload.jsx","webpack://tinode-webapp/./src/widgets/button-back.jsx","webpack://tinode-webapp/./src/widgets/chat-message.jsx","webpack://tinode-webapp/./src/widgets/checkbox.jsx","webpack://tinode-webapp/./src/widgets/chip-input.jsx","webpack://tinode-webapp/./src/widgets/chip.jsx","webpack://tinode-webapp/./src/widgets/contact-action.jsx","webpack://tinode-webapp/./src/widgets/contact-badges.jsx","webpack://tinode-webapp/./src/widgets/contact-list.jsx","webpack://tinode-webapp/./src/widgets/contact.jsx","webpack://tinode-webapp/./src/widgets/context-menu.jsx","webpack://tinode-webapp/./src/widgets/doc-preview.jsx","webpack://tinode-webapp/./src/widgets/error-panel.jsx","webpack://tinode-webapp/./src/widgets/file-progress.jsx","webpack://tinode-webapp/./src/widgets/group-manager.jsx","webpack://tinode-webapp/./src/widgets/group-subs.jsx","webpack://tinode-webapp/./src/widgets/host-selector.jsx","webpack://tinode-webapp/./src/widgets/image-preview.jsx","webpack://tinode-webapp/./src/widgets/in-place-edit.jsx","webpack://tinode-webapp/./src/widgets/invitation.jsx","webpack://tinode-webapp/./src/widgets/letter-tile.jsx","webpack://tinode-webapp/./src/widgets/load-spinner.jsx","webpack://tinode-webapp/./src/widgets/menu-cancel.jsx","webpack://tinode-webapp/./src/widgets/menu-contacts.jsx","webpack://tinode-webapp/./src/widgets/menu-start.jsx","webpack://tinode-webapp/./src/widgets/more-button.jsx","webpack://tinode-webapp/./src/widgets/new-topic-by-id.jsx","webpack://tinode-webapp/./src/widgets/new-topic-group.jsx","webpack://tinode-webapp/./src/widgets/permissions-editor.jsx","webpack://tinode-webapp/./src/widgets/received-marker.jsx","webpack://tinode-webapp/./src/widgets/search-contacts.jsx","webpack://tinode-webapp/./src/widgets/send-message.jsx","webpack://tinode-webapp/./src/widgets/side-navbar.jsx","webpack://tinode-webapp/./src/widgets/tag-manager.jsx","webpack://tinode-webapp/./src/widgets/unread-badge.jsx","webpack://tinode-webapp/./src/widgets/uploading-image.jsx","webpack://tinode-webapp/./src/widgets/visible-password.jsx","webpack://tinode-webapp/external \"React\"","webpack://tinode-webapp/external \"ReactDOM\"","webpack://tinode-webapp/external \"ReactIntl\"","webpack://tinode-webapp/external \"Tinode\"","webpack://tinode-webapp/external \"firebase\"","webpack://tinode-webapp/external [\"firebase\",\"messaging\"]","webpack://tinode-webapp/webpack/bootstrap","webpack://tinode-webapp/webpack/runtime/compat get default export","webpack://tinode-webapp/webpack/runtime/define property getters","webpack://tinode-webapp/webpack/runtime/hasOwnProperty shorthand","webpack://tinode-webapp/webpack/runtime/make namespace object","webpack://tinode-webapp/webpack/startup"],"names":["APP_NAME","PACKAGE_VERSION","API_KEY","KNOWN_HOSTS","hosted","local","DEFAULT_HOST","LOGGING_ENABLED","KEYPRESS_DELAY","RECEIVED_DELAY","READ_DELAY","MIN_TAG_LENGTH","MAX_TAG_LENGTH","MAX_TAG_COUNT","DEFAULT_P2P_ACCESS_MODE","NEW_GRP_ACCESS_MODE","CHANNEL_ACCESS_MODE","NO_ACCESS_MODE","MEDIA_BREAKPOINT","REM_SIZE","AVATAR_SIZE","BROKEN_IMAGE_SIZE","MESSAGES_PAGE","MAX_INBAND_ATTACHMENT_SIZE","MAX_EXTERN_ATTACHMENT_SIZE","MAX_IMAGE_DIM","IMAGE_PREVIEW_DIM","MAX_ONLINE_IN_TOPIC","MAX_TITLE_LENGTH","LINK_CONTACT_US","LINK_PRIVACY_POLICY","LINK_TERMS_OF_SERVICE","params","HashNavigation","window","location","hash","language","hl","navigator","languages","userLanguage","baseLanguage","toLowerCase","split","messages","allMessages","ReactDOM","IntlProvider","locale","textComponent","React","document","getElementById","SUPPORTED_IMAGE_FORMATS","MIME_EXTENSIONS","makeImageUrl","photo","type","data","fitImageSize","width","height","maxWidth","maxHeight","forceSquare","Math","min","scale","size","dstWidth","dstHeight","srcWidth","srcHeight","xoffset","yoffset","fileNameForMime","fname","mime","idx","indexOf","ext","at","lastIndexOf","substring","imageScaled","fileOrBlob","maxSize","onSuccess","onError","img","Image","crossOrigin","onerror","err","onload","async","URL","revokeObjectURL","src","dim","this","canvas","createElement","ctx","getContext","imageSmoothingEnabled","drawImage","blob","Promise","resolve","toBlob","length","clearRect","name","createObjectURL","fileToBase64","file","reader","FileReader","addEventListener","result","readAsDataURL","blobToBase64","filePasted","event","onImageSuccess","onAttachmentSuccess","items","clipboardData","originalEvent","i","item","kind","getAsFile","console","log","imageFileScaledToBase64","imageFileToBase64","getMimeType","header","exec","base64EncodedLen","n","floor","base64DecodedLen","base64ReEncode","str","replace","btoa","atob","detectServerAddress","host","protocol","hostname","port","isSecureConnection","isLocalHost","LocalStorageUtil","key","value","localStorage","setItem","JSON","stringify","getItem","parse","oldVal","getObject","setObject","Object","assign","removeItem","parts","path","substr","forEach","part","decodeURIComponent","url","join","args","hasOwnProperty","push","parsed","parseUrlHash","composeUrlHash","sidepanel","topic","info","shortDateFormat","then","now","Date","getFullYear","getMonth","getDate","toLocaleTimeString","hour12","hour","minute","toLocaleDateString","month","day","year","secondsToTime","seconds","sec","bytesToHumanSize","bytes","sizes","bucket","log2","count","pow","round","toFixed","stringHash","charCodeAt","updateFavicon","oldIcon","head","getElementsByTagName","newIcon","id","rel","href","removeChild","appendChild","title","vcard","fn","imageDataUrl","card","trim","dataStart","arrayEqual","a","b","Array","isArray","sort","l","asPhone","val","test","asEmail","isUrlRelative","sanitizeUrl","allowedSchemes","schemes","RegExp","sanitizeImageUrl","sanitizedUrl","AccGeneralView","constructor","props","super","me","tinode","getMeTopic","state","fullName","public","undefined","avatar","tags","credentials","getCredentials","addCredActive","addCredInvalid","newCred","previousOnTags","onTagsUpdated","tnNewTags","bind","tnCredsUpdated","handleFullNameUpdate","handleImageChanged","handleCredChange","handleCredKeyDown","handleCredEntered","handleTagsUpdated","componentDidMount","onCredsUpdated","componentWillUnmount","setState","creds","onUpdateAccount","Tinode","e","target","keyCode","method","onCredAdd","slice","onUpdateTags","render","map","cred","meth","done","onClick","preventDefault","onCredConfirm","FormattedMessage","defaultMessage","description","onCredDelete","className","full_name_placeholder","placeholder","onFinished","uid","myUserId","onImageChanged","title_tag_manager","activated","onSubmit","required","autoFocus","onChange","onKeyDown","onBlur","EditAccountView","handleCheckboxClick","what","checked","onToggleMessageSounds","onTogglePushNotifications","onToggleIncognitoMode","htmlFor","messageSounds","desktopAlertsEnabled","desktopAlerts","incognitoMode","defineMessages","delete_account","delete_account_warning","AccSecurityView","blockedCount","contacts","c","acs","isJoiner","defacs","getDefaultAccess","auth","anon","showPermissionEditorFor","handlePasswordUpdate","handleLaunchPermissionsEditor","handleHidePermissionsEditor","handlePermissionsChanged","handleDeleteAccount","pwd","password","which","editedPermissions","perm","newState","formatMessage","intl","onShowAlert","onDeleteAccount","mode","skip","onCancel","password_unchanged","onLogout","onShowBlocked","values","injectIntl","AccSupportView","serverVersion","serverAddress","archived_contacts_title","ContactsView","handleAction","deriveStateFromProps","unreadThreads","archivedCount","chatList","blocked","private","arch","archive","unread","touched","action","contactList","componentDidUpdate","prevProps","prevState","action_ignored","onShowArchive","no_contacts","connected","emptyListMessage","topicSelected","showOnline","showUnread","onTopicSelected","showContextMenu","onAction","CreateAccountView","login","email","errorCleared","saveToken","handleLoginChange","handlePasswordChange","handleEmailChange","handleFnChange","handleToggleSaveToken","handleSubmit","onCreateAccount","submitClasses","disabled","login_prompt","autoComplete","password_prompt","full_name_prompt","email_prompt","stay_logged_in","readOnly","owner","onBasicNavigate","requested","granted","edit_permissions","other_user","clear_messages","clear_messages_warning","delete_messages","delete_messages_warning","leave_chat","leave_chat_warning","block_contact","block_contact_warning","report_chat","report_chat_warning","InfoView","admin","sharer","deleter","muted","address","groupTopic","channel","selectedContact","access","modeGiven","modeWant","modeGiven2","modeWant2","showMemberPanel","moreInfoExpanded","previousMetaDesc","previousSubsUpdated","previousTagsUpdated","resetSubs","resetDesc","onMetaDesc","onSubsUpdated","handlePrivateUpdate","handleMuted","handleShowAddMembers","handleHideAddMembers","handleMemberUpdateRequest","handleDeleteMessages","handleLeave","handleBlock","handleReport","handleMemberSelected","handleMoreInfo","handleContextMenu","getTopic","getType","user2","subscriber","getGiven","getWant","subscribers","sub","getAccessMode","isOwner","isAdmin","isSharer","isDeleter","isMuted","comment","isChannel","getMode","getMeta","startMetaQuery","withTags","build","desc","subs","onTopicDescUpdate","ignored","onChangePermissions","userPermissionsEdited","toEdit","toCompare","toSkip","titleEdit","titleCompare","userTitle","userAvatar","user","userPermissionsTitle","userPermissionsAvatar","immutablePermissions","editedPermissionsTitle","immutablePermissionsTitle","editedPermissionsSkipped","onInitFind","members","added","removed","onMemberUpdateRequest","onDeleteMessages","onLeaveTopic","onBlockTopic","onReportTopic","open","onTopicTagsUpdate","instance","topicName","menuItems","handler","x","y","displayMobile","level","errorLevel","text","errorText","onClearError","requiredMember","keepInitialMembers","searchableContacts","compare","modeTitle","compareTitle","private_placeholder","more","onToggle","no_members","showMode","noScroll","LoginView","hostName","onLogin","autoCorrect","autoCapitalize","LogoView","version","alt","Drafty","isUnconfirmed","ex","getExcessive","includes","isPeerRestricted","ms","getMissing","MessagesView","getDerivedStateFromProps","leave","sendImageAttachment","sendFileAttachment","sendKeyPress","handleScrollReference","handleScrollEvent","handleDescChange","handleSubsUpdated","handleNewMessage","handleAllMessagesReceived","handleInfoReceipt","handleImagePostview","handleClosePreview","handleFormResponse","handleContextClick","handleShowContextMenuMessage","handleNewChatAcceptance","handleEnablePeer","handleAttachFile","handleAttachImage","handleCancelUpload","postReadNotification","clearNotificationQueue","readNotificationQueue","readNotificationTimer","messagesScroller","removeEventListener","scrollTop","scrollHeight","scrollPosition","viewportHeight","onData","onAllMessagesReceived","onInfo","onPres","applicationVisible","isSubscribed","ready","newTopic","newTopicParams","_topicName","getQuery","withLaterDesc","withLaterSub","isReader","withLaterData","withLaterDel","fetchingMessages","setQuery","subscribe","ctrl","code","onNewTopicCreated","queuedMessages","pub","_sending","publishMessage","catch","message","blankState","not_found","nextProps","nextState","docPreview","imagePreview","imagePostview","typingIndicator","msgs","online","msg","deleted","onlineSubs","peer","p2pPeerDesc","peerMessagingDisabled","isWriter","readingBlocked","unconformed","unconfirmed","oldTopicName","oldTopic","finally","node","msgHasMoreMessages","getMessagesPage","seq","setInterval","clearInterval","shift","sendAt","max","noteRead","setMilliseconds","getMilliseconds","m","isNewMessage","msgStatus","from","clearTimeout","keyPressTimer","setTimeout","forceUpdate","content","sendMessage","attachJSON","ref","searchParams","resp","set","search","stopPropagation","pageY","pageX","messageSpecificMenuItems","onNewChat","noteKeyPress","maxInbandAttachmentSize","getServerLimit","uploader","getLargeFileHelper","cannot_initiate_upload","uploadCompletionPromise","upload","attachFile","filename","urlPromise","bits","maxExternAttachmentSize","limit","caption","tinyBlob","blobMime","tinyBits64","insertImage","_tempPreview","appendLineBreak","append","init","bits64","preview","found","find","_cancelled","cancel","component","hideSelf","component2","onClose","onSendMessage","messageNodes","previousFrom","chatBoxClass","nextFrom","sequence","thisFrom","isReply","deliveryStatus","userName","userFrom","userDesc","hi","mimeType","timestamp","ts","response","received","_uploader","viewportWidth","onImagePreview","onFormResponse","onCancelUpload","lastSeen","cont","getContact","online_now","seen","last_seen","when","onHideMessagesView","show","onKeyPress","onAttachFile","onAttachImage","search_for_contacts","search_no_results","NewTopicView","tabSelected","searchQuery","handleTabClick","handleSearchContacts","handleContactSelected","handleNewGroupSubmit","handleGroupByID","currentTarget","dataset","query","onSearchContacts","sel","onCreateTopic","dataUrl","priv","no_contacts_placeholder","data-id","searchResults","PasswordResetView","token","scheme","onReset","onRequest","reset","SettingsView","transport","handleTransportSelected","handleServerAddressChange","onUpdate","names","def","ws","lp","transportOptions","onServerAddressChange","SidepanelView","handleLoginRequested","handleNewTopic","onLoginRequest","view","onSignUp","onSettings","onNewTopic","errorAction","actionText","errorActionText","loadSpinnerVisible","loginDisabled","onGlobalSettings","onUpdateAccountTags","credCode","credMethod","onValidateCredentials","onPasswordResetRequest","onResetPassword","POP_SOUND","Audio","reconnect_countdown","reconnect_now","push_init_failed","invalid_security_token","no_connection","code_doesnot_match","TinodeWeb","getBlankState","handleResize","handleHashRoute","handleOnline","checkForAppUpdate","handleVisibilityEvent","handleError","handleLoginRequest","handleConnected","handleAutoreconnectIteration","doLogin","handleCredentialsRequest","handleLoginSuccessful","handleDisconnect","tnMeMetaDesc","tnMeContactUpdate","tnMeSubsUpdated","resetContactList","tnData","tnInitFind","tnFndSubsUpdated","handleTopicSelected","handleHideMessagesView","handleSendMessage","handleNewChatInvitation","handleNewAccount","handleNewAccountRequest","handleUpdateAccountRequest","handleUpdateAccountTagsRequest","handleToggleIncognitoMode","handleSettings","handleGlobalSettings","handleShowArchive","handleShowBlocked","handleToggleMessageSounds","handleCredAdd","handleCredDelete","handleCredConfirm","initDesktopAlerts","togglePushToken","requestPushToken","handleSidepanelCancel","handleStartTopicRequest","handleNewTopicCreated","handleTopicUpdateRequest","handleChangePermissions","handleLogout","handleDeleteMessagesRequest","handleLeaveUnsubRequest","handleBlockTopicRequest","handleReportTopic","handleShowContextMenu","defaultTopicContextMenu","handleHideContextMenu","handleShowAlert","handleShowInfoView","handleHideInfoView","handleValidateCredentialsRequest","handlePasswordResetRequest","handleResetPassword","handleContextMenuAction","settings","autoLogin","messageSoundsOff","firebase","FIREBASE_INIT","firebaseToken","hidden","sidePanelSelected","sidePanelTitle","sidePanelAvatar","liveConnection","onLine","topicSelectedOnline","topicSelectedAcs","innerWidth","showInfoPanel","mobilePanel","contextMenuVisible","contextMenuBounds","contextMenuClickAt","contextMenuParams","contextMenuItems","alertVisible","alertParams","documentElement","clientWidth","clientHeight","tnSetup","onConnect","onDisconnect","onAutoreconnectIteration","fbPush","messaging","usePublicVapidKey","messagingVapidKey","serviceWorker","register","reg","useServiceWorker","active","postMessage","setDeviceToken","parsedNav","expires","setAuthToken","connect","tab","readTimer","readTimerCallback","setHumanLanguage","enableLogging","mobile","onupdatefound","installingWorker","installing","onstatechange","controller","newTopicTabSelected","isConnected","getServerInfo","ver","prom","reconnectCountdown","timeLeft","reconnect","isAuthenticated","promise","getAuthToken","loginBasic","loginToken","onContactUpdate","getCurrentUserID","withDesc","withCred","disconnect","isPresencer","archived","isArchived","play","unused","foundContacts","merged","updated","prepareSearchableContacts","receivedTimer","noteRecv","fnd","getFndTopic","withSub","s","setMeta","isTopicOnline","getTopicAccessMode","createMessage","publishDraft","isP2P","delTopic","am","updateWant","login_","password_","public_","cred_","tags_","createAccountBasic","updateAccountBasic","getCurrentLogin","on","onTokenRefresh","onMessage","payload","enabled","requestPermission","deleteToken","getToken","refreshedToken","delCredential","basicNavigator","isTopicCached","newGroupTopicName","oldName","newName","permissions","updateGiven","delCurrentUser","delMessagesAll","updateMode","publish","getBoundingClientRect","self_blocked","subscribed","onConfirm","confirmText","onReject","rejectText","confirm","reject","invite","delSubscription","requestResetAuthSecret","newPassword","bounds","clickAt","hide","onTopicRemoved","visible","onAddMember","handleManageGroupMembers","phone","ValidationView","handleChange","handleKeyPress","handleCancel","numbers_only","Alert","Attachment","downloader","progress","downloadFile","mimetype","download","loaded","uploading","helperFunc","downloadUrl","downloadWidget","AvatarUpload","handleFileUpload","files","base64bits","du","randId","random","accept","ButtonBack","onBack","ChatMessage","onProgress","handleProgress","handleImagePreview","handleFormButtonClick","act","MESSAGE_STATUS_FAILED","ratio","sideClass","bubbleClass","fullDisplay","attachments","att","draftyFormatter","notFound","style","el","attr","UploadingImage","authorizeURL","inner","child","CheckBox","ChipInput","input","focused","handleTextInput","removeChipAt","handleChipCancel","handleFocusGained","handleFocusLost","handleKeyDown","chips","prompt","sortedChips","sortChips","staticMembers","chipIndex","indexChips","index","keep","normal","concat","filterFunc","onChipRemoved","onFocusLost","onEnter","noAvatar","avatarDisabled","invalid","onFocus","Chip","ContactAction","handleClick","icon_mapping","ContactBadges","badges","icon","color","badge_you","badge_owner","ContactList","showCheckmark","contactNodes","contactsCount","filter","selected","onSelected","dangerouslySetInnerHTML","__html","Contact","icon_badges","clear_for_all","delete_for_all","send_retry","mute","unmute","topic_delete","topic_delete_warning","unblock","block","topic_block_warning","member_delete","ContextMenu","handlePageClick","handleEscapeKey","MenuItems","errorHandler","deleteMessages","delete","retryMessage","topicPermissionSetter","contains","all","hard","cancelSend","delMessagesList","flushMessage","menu","hSize","vSize","position","left","right","top","bottom","DocPreview","handleSendDoc","mimeToIcon","default","image","video","iconFromMime","noInput","ErrorPanel","warn","whiteSpace","FileProgress","contacts_not_found_short","GroupManager","indexMembers","contactFilter","noContactsMessage","selectedContacts","handleMemberRemoved","handleContactFilter","delta","present","keepInitial","stat","userId","status","splice","keys","k","doContactFiltering","GroupSubs","usersOnline","totalCount","countToShow","some","overflow","HostSelector","changed","handleHostNameChange","handleEditingFinished","hostOptions","list","ImagePreview","handleSendImage","assignWidth","maxlength","messagePrompt","acceptBlank","InPlaceEdit","initialValue","handeTextChange","handleStartEditing","handlePasswordFinished","newValue","focus","checkValidity","fieldType","spanText","spanClass","Invitation","handleButtonAction","evt","LetterTile","isGroup","iconColor","abs","letter","charAt","LoadSpinner","MenuCancel","MenuContacts","MenuStart","MoreButton","handleToggle","invalid_id","NewTopicById","groupId","NewTopicGroup","handlePrivateChange","handleTagsChanged","handleChannelToggle","onTagsChanged","PermissionsEditor","joiner","writer","preser","approver","ReceivedMarker","sending","failed","marker","SearchContacts","edited","handleSearchChange","handleSearch","handleClear","search_placeholder","SendMessage","keypressTimestamp","getTime","handlePasteEvent","handleSend","handleMessageTyping","messageEditArea","shiftKey","messaging_disabled","type_new_message","attachImage","click","display","SideNavbar","TagManager","tagInput","handleTagInput","handleAddTag","handleRemoveTag","last","tag","maxTagCount","minTagLength","maxTagLength","add_tags_prompt","defautMessage","UnreadBadge","VisiblePassword","handleVisibility","activeElement","tabIndex","module","exports","ReactIntl","__webpack_module_cache__","__webpack_require__","moduleId","__webpack_modules__","getter","__esModule","d","definition","o","defineProperty","enumerable","get","obj","prop","prototype","call","r","Symbol","toStringTag"],"mappings":"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","file":"index.dev.js","sourcesContent":["import { PACKAGE_VERSION } from './version.js';\n\n// Name of this application, used in the User-Agent.\nexport const APP_NAME = 'TinodeWeb/' + (PACKAGE_VERSION || '0.16');\n\n// API key. Use https://github.com/tinode/chat/tree/master/keygen to generate your own\nexport const API_KEY = 'AQEAAAABAAD_rAp4DJh05a1HAwFT3A6K';\n\n// The array of possible hosts to connect to.\nexport const KNOWN_HOSTS = {hosted: 'web.tinode.co', local: 'localhost:6060'};\n\n// Default host name and port to connect to.\nexport const DEFAULT_HOST = KNOWN_HOSTS.hosted;\n\n// Enable console logging.\nexport const LOGGING_ENABLED = true;\n\n// Minimum time between two keypress notifications, milliseconds.\nexport const KEYPRESS_DELAY = 3*1000;\n// Delay before sending a {note} for reciving a message, milliseconds.\nexport const RECEIVED_DELAY = 500;\n// Delay before sending a read notification, milliseconds.\nexport const READ_DELAY = 1000;\n\n// The shortest allowed tag length. Matches the value on the server.\nexport const MIN_TAG_LENGTH = 2;\n// The greatest allowed tag length. Matches the value on the server.\nexport const MAX_TAG_LENGTH = 96;\n// The maximum number of tags allowed. Matches the value on the server.\nexport const MAX_TAG_COUNT = 16;\n\n// Access mode for P2P subscriptions initiated by the current user.\nexport const DEFAULT_P2P_ACCESS_MODE = 'JRWPS';\n// Access mode for new group topics created by the current user.\nexport const NEW_GRP_ACCESS_MODE = 'JRWPSAO';\n// Access mode for a channel.\nexport const CHANNEL_ACCESS_MODE = 'JR';\n\n// Access mode for no access.\nexport const NO_ACCESS_MODE = 'N';\n\n// Mediaquery breakpoint between desktop and mobile, in px. Should match the value\n// in @media (max-size: 640px) in base.css\nexport const MEDIA_BREAKPOINT = 640;\n// Size of css 'rem' unit in pixels. Default 1rem = 10pt = 13px.\nexport const REM_SIZE = 13;\n\n// Size of the avatar image: When an avatar image is uploaded, it's resized to\n// a square of this size.\nexport const AVATAR_SIZE = 128;\n\n// Size of the broken_image shown in MessagesView\nexport const BROKEN_IMAGE_SIZE = 32;\n\n// Number of chat messages to fetch in one call.\nexport const MESSAGES_PAGE = 24;\n\n// Default maximum in-band (included directly into the message) attachment size which fits into\n// a message of 256K in size. The actual binary size of the attachment should be smaller due to\n// base64 encoding expansion and some overhead, for instance 1024 bytes.\n// Increase this limit to a greater value in production, if desired. Also increase\n// max_message_size in the server config.\nexport const MAX_INBAND_ATTACHMENT_SIZE = 262144;\n\n// Absolute maximum attachment size to be used with the server = 8MB. Increase to\n// something like 100MB in production.\nexport const MAX_EXTERN_ATTACHMENT_SIZE = 1 << 23;\n\n// Maximum allowed linear dimension of an inline image in pixels. Larer images will be shrunk\n// to make the larger dimension fit under this size. You may want to adjust it to 1600 or\n// 2400 for production.\nexport const MAX_IMAGE_DIM = 1024;\n\n// Linear dimensions of image preview: shrink image under this size for previews.\nexport const IMAGE_PREVIEW_DIM = 64;\n\n// Maximum number of online users to be shown in a topic title bar. Others will be\n// hidden under \"+X more\"\nexport const MAX_ONLINE_IN_TOPIC = 4;\n\n// Maximum length of user name, topic title, and private comment.\nexport const MAX_TITLE_LENGTH = 60;\n\n// Link for \"Contact Us\".\nexport const LINK_CONTACT_US = 'email:info@tinode.co';\n\n// Link to Privacy Policy.\nexport const LINK_PRIVACY_POLICY = 'https://tinode.co/privacy.html';\n\n// Link to Terms of Service.\nexport const LINK_TERMS_OF_SERVICE = 'https://tinode.co/terms.html';\n","// Put all packages together.\n// Used to generate umd/index.prod.js\n\nimport React from 'react';\nimport ReactDOM from 'react-dom';\n\nimport { IntlProvider } from 'react-intl';\n\nimport allMessages from './messages.json';\nimport TinodeWeb from './views/tinode-web.jsx';\nimport HashNavigation from './lib/navigation.js';\n\n// Detect human language to use in the UI:\n// Check parameters from URL hash #?hl=ru, then browser, then use 'en' as a fallback.\nconst { params } = HashNavigation.parseUrlHash(window.location.hash);\nconst language = (params && params.hl) ||\n (navigator.languages && navigator.languages[0]) ||\n navigator.language ||\n navigator.userLanguage ||\n 'en';\n\n// Get the base language 'en' from a more specific 'en_GB' or 'en-US' as a partial fallback.\nconst baseLanguage = language.toLowerCase().split(/[-_]/)[0];\n\n// Try the full locale first, then the locale without the region code, fallback to 'en'.\nconst messages =\n allMessages[language] ||\n allMessages[baseLanguage] ||\n allMessages.en;\n\nReactDOM.render(\n field: the URL must be a relative URL or\n// have http:, https:, blob: or data: scheme.\n// The relative URL is appended with the API key and/or auth token.\n// In case of data: scheme, the URL must start with a 'data:image/XXXX;base64,'.\nexport function sanitizeImageUrl(url) {\n if (!url) {\n return null;\n }\n\n const sanitizedUrl = sanitizeUrl(url);\n if (sanitizedUrl) {\n return sanitizedUrl;\n }\n\n // Is this a data: URL of an image?\n if (/data:image\\/[a-z0-9.-]+;base64,/i.test(url.trim())) {\n return url;\n }\n\n return null;\n}\n","// This is a generated file. Don't edit.\n\nexport const PACKAGE_VERSION = \"0.16.10\";\n","// Edit account parameters.\nimport React from 'react';\nimport { FormattedMessage } from 'react-intl';\n\nimport Tinode from 'tinode-sdk';\n\nimport AvatarUpload from '../widgets/avatar-upload.jsx';\nimport InPlaceEdit from '../widgets/in-place-edit.jsx';\nimport TagManager from '../widgets/tag-manager.jsx';\n\nimport { MAX_TITLE_LENGTH } from '../config.js';\nimport { makeImageUrl } from '../lib/blob-helpers.js';\nimport { arrayEqual, asEmail, asPhone, vcard } from '../lib/utils.js';\n\nexport default class AccGeneralView extends React.Component {\n constructor(props) {\n super(props);\n\n const me = this.props.tinode.getMeTopic();\n this.state = {\n fullName: me.public ? me.public.fn : undefined,\n avatar: makeImageUrl(me.public ? me.public.photo : null),\n tags: me.tags(),\n credentials: me.getCredentials() || [],\n addCredActive: false,\n addCredInvalid: false,\n newCred: '',\n previousOnTags: me.onTagsUpdated\n };\n\n this.tnNewTags = this.tnNewTags.bind(this);\n this.tnCredsUpdated = this.tnCredsUpdated.bind(this);\n this.handleFullNameUpdate = this.handleFullNameUpdate.bind(this);\n this.handleImageChanged = this.handleImageChanged.bind(this);\n this.handleCredChange = this.handleCredChange.bind(this);\n this.handleCredKeyDown = this.handleCredKeyDown.bind(this);\n this.handleCredEntered = this.handleCredEntered.bind(this);\n this.handleTagsUpdated = this.handleTagsUpdated.bind(this);\n }\n\n componentDidMount() {\n const me = this.props.tinode.getMeTopic();\n me.onCredsUpdated = this.tnCredsUpdated;\n me.onTagsUpdated = this.tnNewTags;\n }\n\n componentWillUnmount() {\n const me = this.props.tinode.getMeTopic();\n me.onTagsUpdated = this.state.previousOnTags;\n me.onCredsUpdated = undefined;\n }\n\n tnNewTags(tags) {\n this.setState({tags: tags});\n }\n\n tnCredsUpdated(creds) {\n this.setState({credentials: creds || []});\n }\n\n handleFullNameUpdate(fn) {\n fn = fn.trim().substring(0, MAX_TITLE_LENGTH);\n if (fn) {\n this.setState({fullName: fn});\n this.props.onUpdateAccount(undefined, vcard(fn, null));\n }\n }\n\n handleImageChanged(img) {\n this.setState({avatar: img});\n this.props.onUpdateAccount(undefined, vcard(null, img || Tinode.DEL_CHAR));\n }\n\n handleCredChange(e) {\n this.setState({newCred: e.target.value, addCredInvalid: false});\n }\n\n handleCredKeyDown(e) {\n if (e.keyCode === 27) {\n // Escape pressed\n this.setState({newCred: '', addCredActive: false});\n } else if (e.keyCode === 13) {\n // Enter pressed\n this.handleCredEntered(e);\n }\n }\n\n handleCredEntered(e) {\n let value = this.state.newCred.trim();\n if (!value) {\n this.setState({addCredActive: false, addCredInvalid: false});\n return;\n }\n\n let val = asPhone(value);\n let method;\n if (val) {\n method = 'tel';\n } else {\n val = asEmail(value);\n if (val) {\n method = 'email';\n }\n }\n if (method) {\n this.props.onCredAdd(method, val);\n this.setState({addCredActive: false, newCred: ''});\n } else {\n this.setState({addCredInvalid: true});\n }\n }\n\n handleTagsUpdated(tags) {\n // Check if tags have actually changed.\n if (arrayEqual(this.state.tags.slice(0), tags.slice(0))) {\n return;\n }\n this.props.onUpdateTags(tags);\n }\n\n render() {\n const credentials = [];\n this.state.credentials.map((cred) => {\n credentials.push(
\n {messageNodes}\n
\n :\n this.props.readOnly && this.props.uid ?\n
.\n el = UploadingImage;\n }\n }\n break;\n case 'BN':\n // Button\n attr.onClick = this.handleFormButtonClick;\n let inner = React.Children.map(values, (child) => {\n return typeof child == 'string' ? child : undefined;\n });\n if (!inner || inner.length == 0) {\n inner = [attr.name]\n }\n // Get text which will be sent back when the button is clicked.\n attr['data-title'] = inner.join('');\n break;\n case 'FM':\n // Form\n attr.className = 'bot-form';\n break;\n case 'FE':\n // Form element formatting is dependent on element content.\n break;\n }\n return React.createElement(el, attr, values);\n } else {\n return values;\n }\n};\n","import React from 'react';\n\n/* BEGIN CheckBox: styled checkbox */\nexport default class CheckBox extends React.PureComponent {\n constructor(props) {\n super(props);\n\n this.handleChange = this.handleChange.bind(this);\n }\n\n handleChange() {\n this.props.onChange(this.props.name, !this.props.checked);\n }\n\n render() {\n return (\n this.props.onChange ? (\n this.props.checked ?\n check_box :\n check_box_outline_blank\n ) : (\n this.props.checked ?\n check_box :\n check_box_outline_blank\n )\n );\n }\n}\n/* END CheckBox */\n","import React from 'react';\n\nimport Chip from './chip.jsx';\n\nimport { makeImageUrl } from '../lib/blob-helpers.js';\n\n/* BEGIN ChipInput: group membership widget */\nexport default class ChipInput extends React.Component {\n constructor(props) {\n super(props);\n\n this.state = ChipInput.deriveStateFromProps(props);\n this.state.input = '';\n this.state.focused = false;\n\n this.handleTextInput = this.handleTextInput.bind(this);\n this.removeChipAt = this.removeChipAt.bind(this);\n this.handleChipCancel = this.handleChipCancel.bind(this);\n this.handleFocusGained = this.handleFocusGained.bind(this);\n this.handleFocusLost = this.handleFocusLost.bind(this);\n this.handleKeyDown = this.handleKeyDown.bind(this);\n }\n\n static deriveStateFromProps(props) {\n return {\n placeholder: props.chips ? '' : props.prompt,\n sortedChips: ChipInput.sortChips(props.chips, props.staticMembers),\n chipIndex: ChipInput.indexChips(props.chips)\n };\n }\n\n componentDidUpdate(prevProps, prevState) {\n if (prevProps.chips != this.props.chips ||\n prevProps.staticMembers != this.props.staticMembers ||\n prevProps.prompt != this.props.prompt) {\n this.setState(ChipInput.deriveStateFromProps(this.props));\n }\n if (!prevState || this.props.chips.length > prevState.sortedChips.length) {\n this.setState({input: ''});\n }\n }\n\n // Map chip index to user name\n static indexChips(chips) {\n const index = {};\n let count = 0;\n chips.map((item) => {\n index[item.user] = count;\n count ++;\n });\n return index;\n }\n\n // Have non-removable chips appear before all other chips.\n static sortChips(chips, keep) {\n const required = [];\n const normal = [];\n chips.map((item) => {\n if (keep && keep.includes(item.user)) {\n required.push(item);\n } else {\n normal.push(item);\n }\n });\n return required.concat(normal);\n }\n\n handleTextInput(e) {\n this.setState({input: e.target.value});\n if (this.props.filterFunc) {\n this.props.filterFunc(e.target.value);\n }\n }\n\n removeChipAt(idx) {\n const removed = this.state.sortedChips[idx];\n this.props.onChipRemoved(removed.user, this.state.chipIndex[removed.user]);\n }\n\n handleChipCancel(item, idx) {\n this.removeChipAt(idx);\n }\n\n handleFocusGained() {\n this.setState({focused: true});\n }\n\n handleFocusLost() {\n this.setState({focused: false});\n if (this.props.onFocusLost) {\n this.props.onFocusLost(this.state.input);\n }\n }\n\n handleKeyDown(e) {\n if (e.key === 'Backspace') {\n if (this.state.input.length == 0 && this.state.sortedChips.length > 0) {\n const at = this.state.sortedChips.length - 1;\n if (this.state.sortedChips[at].user !== this.props.staticMembers) {\n this.removeChipAt(at);\n }\n }\n } else if (e.key === 'Enter') {\n if (this.props.onEnter) {\n this.props.onEnter(this.state.input);\n }\n } else if (e.key === 'Escape') {\n if (this.props.onCancel) {\n this.props.onCancel();\n }\n }\n }\n\n render() {\n const chips = [];\n let count = 0;\n const staticMembers = this.props.staticMembers || [];\n this.state.sortedChips.map((item) => {\n chips.push(\n
\n {contactNodes}\n
\n :\n null\n }\n
: null}\n \n {menu}\n
\n );\n }\n}\n\nexport default injectIntl(ContextMenu);\n","import React from 'react';\nimport { FormattedMessage } from 'react-intl';\nimport SendMessage from '../widgets/send-message.jsx';\n\nimport { bytesToHumanSize } from '../lib/strformat.js';\n\n// Get material icon name from mime type.\nfunction iconFromMime(mime) {\n // If more icons become available in material icons, add them to this mime-to-icon mapping.\n const mimeToIcon = {default: 'insert_drive_file', image: 'image', text: 'description', video: 'theaters'};\n\n return mimeToIcon[mime] || mimeToIcon[(mime || '').split('/')[0]] || mimeToIcon['default'];\n}\n\nexport default class DocPreview extends React.PureComponent {\n constructor(props) {\n super(props);\n\n this.handleSendDoc = this.handleSendDoc.bind(this);\n }\n\n handleSendDoc(caption) {\n this.props.onClose();\n this.props.onSendMessage(this.props.content.file);\n }\n\n render() {\n if (!this.props.content) {\n return null;\n }\n return (\n \n
{e.target.onerror = null; e.target.src=\"/img/broken_image.png\"}} />;\n } else {\n avatar = null;\n }\n return avatar;\n }\n}\n","import React from 'react';\n\nexport default class LoadSpinner extends React.PureComponent {\n render() {\n return (this.props.show ?\n
\n \n );\n }\n\n return (\n {names[c]} \n {skip.indexOf(c) < 0 ?\n {this.props.compare ? \n : null}\n
: null}\n \n \n {this.props.compare ?\n
\n \n :\n null}\n \n {items}\n {this.props.modeTitle} \n {this.props.compareTitle} \n
\n field: the URL must be a relative URL or\n// have http:, https:, blob: or data: scheme.\n// The relative URL is appended with the API key and/or auth token.\n// In case of data: scheme, the URL must start with a 'data:image/XXXX;base64,'.\nexport function sanitizeImageUrl(url) {\n if (!url) {\n return null;\n }\n\n const sanitizedUrl = sanitizeUrl(url);\n if (sanitizedUrl) {\n return sanitizedUrl;\n }\n\n // Is this a data: URL of an image?\n if (/data:image\\/[a-z0-9.-]+;base64,/i.test(url.trim())) {\n return url;\n }\n\n return null;\n}\n","// This is a generated file. Don't edit.\n\nexport const PACKAGE_VERSION = \"0.16.10\";\n","// Edit account parameters.\nimport React from 'react';\nimport { FormattedMessage } from 'react-intl';\n\nimport Tinode from 'tinode-sdk';\n\nimport AvatarUpload from '../widgets/avatar-upload.jsx';\nimport InPlaceEdit from '../widgets/in-place-edit.jsx';\nimport TagManager from '../widgets/tag-manager.jsx';\n\nimport { MAX_TITLE_LENGTH } from '../config.js';\nimport { makeImageUrl } from '../lib/blob-helpers.js';\nimport { arrayEqual, asEmail, asPhone, vcard } from '../lib/utils.js';\n\nexport default class AccGeneralView extends React.Component {\n constructor(props) {\n super(props);\n\n const me = this.props.tinode.getMeTopic();\n this.state = {\n fullName: me.public ? me.public.fn : undefined,\n avatar: makeImageUrl(me.public ? me.public.photo : null),\n tags: me.tags(),\n credentials: me.getCredentials() || [],\n addCredActive: false,\n addCredInvalid: false,\n newCred: '',\n previousOnTags: me.onTagsUpdated\n };\n\n this.tnNewTags = this.tnNewTags.bind(this);\n this.tnCredsUpdated = this.tnCredsUpdated.bind(this);\n this.handleFullNameUpdate = this.handleFullNameUpdate.bind(this);\n this.handleImageChanged = this.handleImageChanged.bind(this);\n this.handleCredChange = this.handleCredChange.bind(this);\n this.handleCredKeyDown = this.handleCredKeyDown.bind(this);\n this.handleCredEntered = this.handleCredEntered.bind(this);\n this.handleTagsUpdated = this.handleTagsUpdated.bind(this);\n }\n\n componentDidMount() {\n const me = this.props.tinode.getMeTopic();\n me.onCredsUpdated = this.tnCredsUpdated;\n me.onTagsUpdated = this.tnNewTags;\n }\n\n componentWillUnmount() {\n const me = this.props.tinode.getMeTopic();\n me.onTagsUpdated = this.state.previousOnTags;\n me.onCredsUpdated = undefined;\n }\n\n tnNewTags(tags) {\n this.setState({tags: tags});\n }\n\n tnCredsUpdated(creds) {\n this.setState({credentials: creds || []});\n }\n\n handleFullNameUpdate(fn) {\n fn = fn.trim().substring(0, MAX_TITLE_LENGTH);\n if (fn) {\n this.setState({fullName: fn});\n this.props.onUpdateAccount(undefined, vcard(fn, null));\n }\n }\n\n handleImageChanged(img) {\n this.setState({avatar: img});\n this.props.onUpdateAccount(undefined, vcard(null, img || Tinode.DEL_CHAR));\n }\n\n handleCredChange(e) {\n this.setState({newCred: e.target.value, addCredInvalid: false});\n }\n\n handleCredKeyDown(e) {\n if (e.keyCode === 27) {\n // Escape pressed\n this.setState({newCred: '', addCredActive: false});\n } else if (e.keyCode === 13) {\n // Enter pressed\n this.handleCredEntered(e);\n }\n }\n\n handleCredEntered(e) {\n let value = this.state.newCred.trim();\n if (!value) {\n this.setState({addCredActive: false, addCredInvalid: false});\n return;\n }\n\n let val = asPhone(value);\n let method;\n if (val) {\n method = 'tel';\n } else {\n val = asEmail(value);\n if (val) {\n method = 'email';\n }\n }\n if (method) {\n this.props.onCredAdd(method, val);\n this.setState({addCredActive: false, newCred: ''});\n } else {\n this.setState({addCredInvalid: true});\n }\n }\n\n handleTagsUpdated(tags) {\n // Check if tags have actually changed.\n if (arrayEqual(this.state.tags.slice(0), tags.slice(0))) {\n return;\n }\n this.props.onUpdateTags(tags);\n }\n\n render() {\n const credentials = [];\n this.state.credentials.map((cred) => {\n credentials.push(
\n {messageNodes}\n
\n :\n this.props.readOnly && this.props.uid ?\n
.\n el = UploadingImage;\n }\n }\n break;\n case 'BN':\n // Button\n attr.onClick = this.handleFormButtonClick;\n let inner = React.Children.map(values, (child) => {\n return typeof child == 'string' ? child : undefined;\n });\n if (!inner || inner.length == 0) {\n inner = [attr.name]\n }\n // Get text which will be sent back when the button is clicked.\n attr['data-title'] = inner.join('');\n break;\n case 'FM':\n // Form\n attr.className = 'bot-form';\n break;\n case 'RW':\n // Form element formatting is dependent on element content.\n break;\n default:\n if (el == '_UNKN') {\n // Unknown element.\n // TODO: make it prettier.\n el = <>extension>;\n }\n break;\n }\n return React.createElement(el, attr, values);\n } else {\n return values;\n }\n};\n","import React from 'react';\n\n/* BEGIN CheckBox: styled checkbox */\nexport default class CheckBox extends React.PureComponent {\n constructor(props) {\n super(props);\n\n this.handleChange = this.handleChange.bind(this);\n }\n\n handleChange() {\n this.props.onChange(this.props.name, !this.props.checked);\n }\n\n render() {\n return (\n this.props.onChange ? (\n this.props.checked ?\n check_box :\n check_box_outline_blank\n ) : (\n this.props.checked ?\n check_box :\n check_box_outline_blank\n )\n );\n }\n}\n/* END CheckBox */\n","import React from 'react';\n\nimport Chip from './chip.jsx';\n\nimport { makeImageUrl } from '../lib/blob-helpers.js';\n\n/* BEGIN ChipInput: group membership widget */\nexport default class ChipInput extends React.Component {\n constructor(props) {\n super(props);\n\n this.state = ChipInput.deriveStateFromProps(props);\n this.state.input = '';\n this.state.focused = false;\n\n this.handleTextInput = this.handleTextInput.bind(this);\n this.removeChipAt = this.removeChipAt.bind(this);\n this.handleChipCancel = this.handleChipCancel.bind(this);\n this.handleFocusGained = this.handleFocusGained.bind(this);\n this.handleFocusLost = this.handleFocusLost.bind(this);\n this.handleKeyDown = this.handleKeyDown.bind(this);\n }\n\n static deriveStateFromProps(props) {\n return {\n placeholder: props.chips ? '' : props.prompt,\n sortedChips: ChipInput.sortChips(props.chips, props.staticMembers),\n chipIndex: ChipInput.indexChips(props.chips)\n };\n }\n\n componentDidUpdate(prevProps, prevState) {\n if (prevProps.chips != this.props.chips ||\n prevProps.staticMembers != this.props.staticMembers ||\n prevProps.prompt != this.props.prompt) {\n this.setState(ChipInput.deriveStateFromProps(this.props));\n }\n if (!prevState || this.props.chips.length > prevState.sortedChips.length) {\n this.setState({input: ''});\n }\n }\n\n // Map chip index to user name\n static indexChips(chips) {\n const index = {};\n let count = 0;\n chips.map((item) => {\n index[item.user] = count;\n count ++;\n });\n return index;\n }\n\n // Have non-removable chips appear before all other chips.\n static sortChips(chips, keep) {\n const required = [];\n const normal = [];\n chips.map((item) => {\n if (keep && keep.includes(item.user)) {\n required.push(item);\n } else {\n normal.push(item);\n }\n });\n return required.concat(normal);\n }\n\n handleTextInput(e) {\n this.setState({input: e.target.value});\n if (this.props.filterFunc) {\n this.props.filterFunc(e.target.value);\n }\n }\n\n removeChipAt(idx) {\n const removed = this.state.sortedChips[idx];\n this.props.onChipRemoved(removed.user, this.state.chipIndex[removed.user]);\n }\n\n handleChipCancel(item, idx) {\n this.removeChipAt(idx);\n }\n\n handleFocusGained() {\n this.setState({focused: true});\n }\n\n handleFocusLost() {\n this.setState({focused: false});\n if (this.props.onFocusLost) {\n this.props.onFocusLost(this.state.input);\n }\n }\n\n handleKeyDown(e) {\n if (e.key === 'Backspace') {\n if (this.state.input.length == 0 && this.state.sortedChips.length > 0) {\n const at = this.state.sortedChips.length - 1;\n if (this.state.sortedChips[at].user !== this.props.staticMembers) {\n this.removeChipAt(at);\n }\n }\n } else if (e.key === 'Enter') {\n if (this.props.onEnter) {\n this.props.onEnter(this.state.input);\n }\n } else if (e.key === 'Escape') {\n if (this.props.onCancel) {\n this.props.onCancel();\n }\n }\n }\n\n render() {\n const chips = [];\n let count = 0;\n const staticMembers = this.props.staticMembers || [];\n this.state.sortedChips.map((item) => {\n chips.push(\n
\n {contactNodes}\n
\n :\n null\n }\n
: null}\n \n {menu}\n
\n );\n }\n}\n\nexport default injectIntl(ContextMenu);\n","import React from 'react';\nimport { FormattedMessage } from 'react-intl';\nimport SendMessage from '../widgets/send-message.jsx';\n\nimport { bytesToHumanSize } from '../lib/strformat.js';\n\n// Get material icon name from mime type.\nfunction iconFromMime(mime) {\n // If more icons become available in material icons, add them to this mime-to-icon mapping.\n const mimeToIcon = {default: 'insert_drive_file', image: 'image', text: 'description', video: 'theaters'};\n\n return mimeToIcon[mime] || mimeToIcon[(mime || '').split('/')[0]] || mimeToIcon['default'];\n}\n\nexport default class DocPreview extends React.PureComponent {\n constructor(props) {\n super(props);\n\n this.handleSendDoc = this.handleSendDoc.bind(this);\n }\n\n handleSendDoc(caption) {\n this.props.onClose();\n this.props.onSendMessage(this.props.content.file);\n }\n\n render() {\n if (!this.props.content) {\n return null;\n }\n return (\n \n
{e.target.onerror = null; e.target.src=\"/img/broken_image.png\"}} />;\n } else {\n avatar = null;\n }\n return avatar;\n }\n}\n","import React from 'react';\n\nexport default class LoadSpinner extends React.PureComponent {\n render() {\n return (this.props.show ?\n
\n \n );\n }\n\n return (\n {names[c]} \n {skip.indexOf(c) < 0 ?\n {this.props.compare ? \n : null}\n
: null}\n \n \n {this.props.compare ?\n
\n \n :\n null}\n \n {items}\n {this.props.modeTitle} \n {this.props.compareTitle} \n
\n
¯∖_(ツ)_/¯","full_name_prompt":"Vollständiger Name, z.B. Lisa Musterfrau","email_prompt":"E-Mail, z.B. jdoe@beispiel.de","button_sign_up":"Anmelden","label_your_name":"Ihr Name","label_user_id":"ID:","button_edit":"Bearbeiten","requested_permissions":"Angefordert","granted_permissions":"Erteilt","menu_item_edit_permissions":"Berechtigungen ändern","label_other_user":"Andere","action_clear_messages":"Nachrichten leeren","clear_messages_warning":"Sind Sie sicher, dass Sie diese Unterhaltung für alle leeren wollen? Das kann nicht rückgängig gemacht werden.","action_delete_messages":"Nachrichten für alle löschen","delete_messages_warning":"Sind Sie sicher, dass Sie diese Unterhaltung für alle löschen wollen? Das kann nicht rückgängig gemacht werden.","action_leave_chat":"Unterhaltung verlassen","leave_chat_warning":"Möchten Sie diese Unterhaltung wirklich verlassen?","action_block_contact":"Kontakt blockieren","block_contact_warning":"Möchten Sie diesen Kontakt wirklich blockieren?","action_report_chat":"Unterhaltung melden","report_chat_warning":"Möchten Sie diese Unterhaltung wirklich blockieren und melden?","title_info":"Info","label_topic_name":"Name","label_private":"Privater Kommentar","private_editing_placeholder":"Nur für Sie sichtbar","label_muting_topic":"Stumm geschaltet:","action_more":"Mehr","label_your_permissions":"Ihre Berechtigungen:","label_permissions":"Berechtigungen:","label_you":"Sie:","label_default_access":"Standard Zugriffsmodus:","label_group_members":"Gruppenmitglieder:","button_add_members":"Mitglieder hinzufügen","group_has_no_members":"Keine Mitglieder","login_prompt":"Anmelden","password_prompt":"Passwort","stay_logged_in":"Angemeldet bleiben","forgot_password_link":"Passwort vergessen?","button_sign_in":"Anmelden","label_client":"Client:","label_server":"Server:","online_now":"jetzt online","last_seen_timestamp":"Zuletzt gesehen","title_not_found":"Nicht gefunden","unnamed_topic":"Unbenannt","messages_not_readable":"Neue Nachrichten können nicht gelesen werden","peers_messaging_disabled":"Gruppennachrichten sind deaktiviert","enable_peers_messaging":"Aktivieren","search_for_contacts":"Nutzen Sie die Suche um Kontakte zu finden","search_no_results":"Die Suche hatte keine Ergebnisse","tabtitle_find_user":"Suchen","tabtitle_new_group":"Neue Gruppe","tabtitle_group_by_id":"nach ID","new_password_placeholder":"Geben Sie ein neues Passwort ein","label_reset_password":"Passwort per E-Mail wiederherstellen:","credential_email_prompt":"E-Mail Adresse für Registrierung","button_reset":"Zurücksetzen","button_send_request":"Anfrage senden","label_server_to_use":"Server verwenden:","label_wire_transport":"Übertragung per Kabel:","button_update":"Aktualisieren","sidepanel_title_login":"Anmelden","sidepanel_title_register":"Konto erstellen","sidepanel_title_settings":"Einstellungen","sidepanel_title_account_settings":"Konto-Einstellungen","sidepanel_title_acc_general":"Allgemein","sidepanel_title_acc_security":"Sicherheit","sidepanel_title_acc_notifications":"Benachrichtigungen","sidepanel_title_acc_support":"Unterstützung","sidepanel_title_newtpk":"Neue Unterhaltung starten","sidepanel_title_cred":"Anmeldeinformationen bestätigen","sidepanel_title_reset":"Passwort zurücksetzen","sidepanel_title_archive":"Archivierte Unterhaltungen","sidepanel_title_blocked":"Blockierte Unterhaltungen","reconnect_countdown":"Getrennt. Wiederverbinden in {seconds}…","reconnect_now":"Jetzt probieren","push_init_failed":"Initialisierung von Push-Benachrichtigungen fehlgeschlagen","invalid_security_token":"Ungültiger Sicherheitsschlüssel","no_connection":"Keine Verbindung","code_doesnot_match":"Code stimmt nicht überein","update_available":"Aktualisierung verfügbar.","reload_update":"Neu laden","phone_dative":"Telefon","email_dative":"E-Mail","enter_confirmation_code_prompt":"Geben Sie den Bestätigungscode ein, der per {method} geschickt wurde:","numeric_confirmation_code_prompt":"Nur zahlen","button_confirm":"Bestätigen","save_attachment":"Speichern","deleted_content":"Inhalt gelöscht","invalid_content":"ungültiger Inhalt","user_not_found":"Nicht gefunden","badge_you":"Sie","badge_owner":"Besitzer","menu_item_info":"Info","menu_item_clear_messages":"Nachrichten leeren","menu_item_clear_messages_for_all":"Für alle leeren","menu_item_delete":"Löschen","menu_item_delete_for_all":"Für alle löschen","menu_item_send_retry":"Wiederholen","menu_item_mute":"Unterhaltung stumm schalten","menu_item_unmute":"Stumm schalten beenden","menu_item_delete_topic":"Entfernen","topic_delete_warning":"Möchten Sie diese Unterhaltung wirklich löschen?","menu_item_unblock":"Blockierung aufheben","menu_item_block":"Blockieren","topic_block_warning":"Möchten Sie diese Unterhaltung wirklich blockieren?","menu_item_member_delete":"Entfernen","menu_item_archive_topic":"Archivieren","action_cancel":"Abbrechen","upload_finishing":"wird abgeschlossen...","no_contacts":"Sie haben keine Kontakte :-(","contacts_not_found_short":"Keine Kontakte für \'\'{query}\'\'","title_group_members":"Gruppenmitglieder","title_all_contacts":"Alle Kontakte","button_ok":"OK","button_cancel":"Abbrechen","more_online_members":"+{overflow} mehr","download_action":"herunterladen","label_file_name":"Dateiname:","label_content_type":"Inhaltsart:","label_size":"Größe:","chat_invitation":"Sie sind eingeladen, an einem neuen Chat teilzunehmen. Was möchten Sie tun?","chat_invitation_accept":"Akzeptieren","chat_invitation_ignore":"Ignorieren","chat_invitation_block":"Blockieren","error_invalid_id":"ungültige ID","group_user_id_prompt":"Gruppe oder Benutzer ID","button_subscribe":"Abbonieren","topic_name_editing_placeholder":"Freiform Name der Gruppe","button_create":"Erstellen","permission_join":"Beitreten ({val})","permission_read":"Lesen ({val})","permission_write":"Schreiben ({val})","permission_pres":"Benachrichtigt werden ({val})","permission_admin":"Bestätigen ({val})","permission_share":"Teilen ({val})","permission_delete":"Entfernen ({val})","permission_owner":"Besitzer ({val})","title_permissions":"Berechtigungen","message_sending":"wird gesendet...","message_sending_failed":"fehlgeschlagen","search_placeholder":"Liste: email:lisa@beispiel.de, tel:17025550003...","messaging_disabled_prompt":"Nachrichtenübermittlung deaktiviert","new_message_prompt":"Neue Nachricht","image_caption_prompt":"Bildunterschrift","file_attachment_too_large":"Die Dateigröße {size} überschreitet das Limit von {limit}.","cannot_initiate_file_upload":"Datei kann nicht hochgeladen werden.","tags_not_found":"Keine Schlagworte definiert. Erstellen Sie welche.","tags_editor_no_tags":"Schlagworte hinzufügen","title_manage_tags":"Verwalten","channel_prompt":"Dies ist ein Sender","channel":"Sender"},"en":{"validate_credential_action":"confirm","title_tag_manager":"Tags (user discovery)","label_user_contacts":"Contacts:","button_add_another":"Add another","label_message_sound":"Message sound:","label_push_notifications":"Notification alerts:","label_push_notifications_disabled":"Notification alerts (requires HTTPS):","label_incognito_mode":"Incognito mode:","delete_account":"Delete account","delete_account_arning":"Are you sure you want to delete your account? It cannot be undone.","label_password":"Password","password_unchanged_prompt":"Unchanged","button_logout":"Logout","button_delete_account":"Delete account","label_default_access_mode":"Default access mode:","blocked_contacts_link":"Blocked contacts ({count})","link_contact_us":"Contact Us","link_terms_of_service":"Terms of Service","link_privacy_policy":"Privacy Policy","label_sdk":"SDK:","label_server_address":"Server address:","archived_contacts":"Archived contacts ({count})","contacts_not_found":"You have no chats
¯∖_(ツ)_/¯","full_name_prompt":"Full name, e.g. John Doe","email_prompt":"Email, e.g. jdoe@example.com","button_sign_up":"Sign up","label_your_name":"Your name","label_user_id":"ID:","button_edit":"Edit","requested_permissions":"Requested","granted_permissions":"Granted","menu_item_edit_permissions":"Edit permissions","label_other_user":"Other","action_clear_messages":"Clear Messages","clear_messages_warning":"Are you sure you want to clear all messages? It cannot be undone.","action_delete_messages":"Clear Messages for All","delete_messages_warning":"Are you sure you want to delete all messages for everyone? It cannot be undone.","action_leave_chat":"Leave Conversation","leave_chat_warning":"Are you sure you want to leave this conversation?","action_block_contact":"Block Contact","block_contact_warning":"Are you sure you want to block this contact?","action_report_chat":"Report Conversation","report_chat_warning":"Are you sure you want to block and report this conversation?","title_info":"Info","label_topic_name":"Name","label_private":"Private comment","private_editing_placeholder":"Visible to you only","label_muting_topic":"Muted:","action_more":"More","label_your_permissions":"Your permissions:","label_permissions":"Permissions:","label_you":"You:","label_default_access":"Default access mode:","label_group_members":"Group members:","button_add_members":"Add members","group_has_no_members":"No members","login_prompt":"Login","password_prompt":"Password","stay_logged_in":"Stay logged in","forgot_password_link":"Forgot password?","button_sign_in":"Sign in","label_client":"Client:","label_server":"Server:","online_now":"online now","last_seen_timestamp":"Last seen","title_not_found":"Not found","channel":"channel","unnamed_topic":"Unnamed","messages_not_readable":"no access to messages","peers_messaging_disabled":"Peer\'s messaging is disabled.","enable_peers_messaging":"Enable","search_for_contacts":"Use search to find contacts","search_no_results":"Search returned no results","tabtitle_find_user":"find","tabtitle_new_group":"new group","tabtitle_group_by_id":"by id","new_password_placeholder":"Enter new password","label_reset_password":"Send a password reset email:","credential_email_prompt":"Your registration email","button_reset":"Reset","button_send_request":"Send request","label_server_to_use":"Server to use:","label_wire_transport":"Wire transport:","button_update":"Update","sidepanel_title_login":"Sign In","sidepanel_title_register":"Create Account","sidepanel_title_settings":"Settings","sidepanel_title_account_settings":"Account Settings","sidepanel_title_acc_general":"General","sidepanel_title_acc_security":"Security","sidepanel_title_acc_notifications":"Notifications","sidepanel_title_acc_support":"Support","sidepanel_title_newtpk":"Start New Chat","sidepanel_title_cred":"Confirm Credentials","sidepanel_title_reset":"Reset Password","sidepanel_title_archive":"Archived Chats","sidepanel_title_blocked":"Blocked Chats","reconnect_countdown":"Disconnected. Reconnecting in {seconds}…","reconnect_now":"Try now","push_init_failed":"Failed to initialize push notifications","invalid_security_token":"Invalid security token","no_connection":"No connection","code_doesnot_match":"Code does not match","update_available":"Update available.","reload_update":"Reload","phone_dative":"phone","email_dative":"email","enter_confirmation_code_prompt":"Enter confirmation code sent to you by {method}:","numeric_confirmation_code_prompt":"Numbers only","button_confirm":"Confirm","save_attachment":"save","deleted_content":"content deleted","invalid_content":"invalid content","user_not_found":"Not found","badge_you":"you","badge_owner":"owner","menu_item_info":"Info","menu_item_clear_messages":"Clear messages","menu_item_clear_messages_for_all":"Clear for All","menu_item_delete":"Delete","menu_item_delete_for_all":"Delete for All","menu_item_send_retry":"Retry","menu_item_mute":"Mute","menu_item_unmute":"Unmute","menu_item_delete_topic":"Delete","topic_delete_warning":"Are you sure you want to delete this conversation?","menu_item_unblock":"Unblock","menu_item_block":"Block","topic_block_warning":"Are you sure you want to block this conversation?","menu_item_member_delete":"Remove","menu_item_archive_topic":"Archive","action_cancel":"cancel","upload_finishing":"finishing...","no_contacts":"You have no contacts :-(","contacts_not_found_short":"No contacts match \'\'{query}\'\'","title_group_members":"Group Members","title_all_contacts":"All Contacts","button_ok":"OK","button_cancel":"Cancel","more_online_members":"+{overflow} more","download_action":"download","label_file_name":"File name:","label_content_type":"Content type:","label_size":"Size:","chat_invitation":"You are invited to start a new chat. What would you like to do?","chat_invitation_accept":"Accept","chat_invitation_ignore":"Ignore","chat_invitation_block":"Block","error_invalid_id":"Invalid ID","group_user_id_prompt":"Group or User ID","button_subscribe":"Subscribe","topic_name_editing_placeholder":"Freeform name of the group","channel_prompt":"This is a channel","button_create":"Create","permission_join":"Join ({val})","permission_read":"Read ({val})","permission_write":"Write ({val})","permission_pres":"Get notified ({val})","permission_admin":"Approve ({val})","permission_share":"Share ({val})","permission_delete":"Delete ({val})","permission_owner":"Owner ({val})","title_permissions":"Permissions","message_sending":"sending...","message_sending_failed":"failed","search_placeholder":"List like email:alice@example.com, tel:17025550003...","messaging_disabled_prompt":"Messaging disabled","new_message_prompt":"New message","image_caption_prompt":"Image caption","file_attachment_too_large":"The file size {size} exceeds the {limit} limit.","cannot_initiate_file_upload":"Cannot initiate file upload.","tags_not_found":"No tags defined. Add some.","tags_editor_no_tags":"Add some tags","title_manage_tags":"Manage"},"es":{"validate_credential_action":"confirmar","title_tag_manager":"Etiquetas (descubrimiento de usuarios)","label_user_contacts":"Contactos:","button_add_another":"Añadir contacto","label_message_sound":"Sonido de mensaje:","label_push_notifications":"Alertas de notificaciones:","label_push_notifications_disabled":"Alertas de notificaciones (requiere HTTPS):","label_incognito_mode":"Modo incógnito:","delete_account":"Eliminar cuenta","delete_account_arning":"¿Estás seguro de que deseas eliminar permanentemente tu cuenta? Esta acción es irreversible.","label_password":"Contraseña","password_unchanged_prompt":"Sin cambios","button_logout":"Cerrar sesión","button_delete_account":"Eliminar cuenta","label_default_access_mode":"Modo de acceso predeterminado:","blocked_contacts_link":"Contactos bloqueados ({count})","link_contact_us":"Contáctanos","link_terms_of_service":"Términos de uso","link_privacy_policy":"Política de privacidad","label_sdk":"SDK:","label_server_address":"Dirección del servidor:","archived_contacts":"Contactos archivados ({count})","contacts_not_found":"No tienes chats
¯∖_(ツ)_/¯","full_name_prompt":"Nombre completo, p.ej. Juan González Hernández","email_prompt":"Correo electrónico, p.ej. juan@example.com","button_sign_up":"Regístrate","label_your_name":"Tu nombre","label_user_id":"ID:","button_edit":"Editar","requested_permissions":"Solicitados","granted_permissions":"Otorgados","menu_item_edit_permissions":"Editar permisos","label_other_user":"Otros","action_clear_messages":"Borrar mensajes","clear_messages_warning":"¿Estás seguro de que quieres eliminar todos los mensajes? Esta acción es irreversible.","action_delete_messages":"Borrar mensajes para todos","delete_messages_warning":"¿Estás seguro de que quieres eliminar todos los mensajes para todos? Esta acción es irreversible.","action_leave_chat":"Dejar conversación","leave_chat_warning":"¿Estás seguro de que quieres dejar esta conversación?","action_block_contact":"Bloquear contacto","block_contact_warning":"¿Estás seguro de que quieres bloquear a este contacto?","action_report_chat":"Reportar conversación","report_chat_warning":"¿Estás seguro de que quieres bloquear y reportar a esta conversación?","title_info":"Información","label_topic_name":"Nombre del tema","label_private":"Comentario privado","private_editing_placeholder":"Sólo visible para tí","label_muting_topic":"Silenciado:","action_more":"Más","label_your_permissions":"Tus permisoss:","label_permissions":"Permisos:","label_you":"Tú:","label_default_access":"Modo de acceso predeterminado:","label_group_members":"Miembros del grupo:","button_add_members":"Añadir miembros","group_has_no_members":"No hay miembros","login_prompt":"Nombre de usuario","password_prompt":"Contraseña","stay_logged_in":"Permanecer conectado","forgot_password_link":"¿Olvidaste tu contraseña?","button_sign_in":"Entrar","label_client":"Cliente:","label_server":"Servidor:","online_now":"en línea","last_seen_timestamp":"Últ. vez","title_not_found":"No encontrado","unnamed_topic":"Sin nombre","messages_not_readable":"sin acceso a mensajes","peers_messaging_disabled":"La mensajería Peer está deshabilitada.","enable_peers_messaging":"Habilitar","search_for_contacts":"Usa la búsqueda para encontrar contactos","search_no_results":"La búsqueda no arrojó resultados","tabtitle_find_user":"encontrar","tabtitle_new_group":"nuevo grupo","tabtitle_group_by_id":"por ID","new_password_placeholder":"Introduzca una nueva contraseña","label_reset_password":"Enviar un correo electrónico de restablecimiento de contraseña:","credential_email_prompt":"Tu correo electrónico de registro","button_reset":"Restablecer","button_send_request":"Enviar petición","label_server_to_use":"Servidor para usar:","label_wire_transport":"Transporte de alambre:","button_update":"Actualizar","sidepanel_title_login":"Iniciar sesión","sidepanel_title_register":"Crear cuenta","sidepanel_title_settings":"Ajustes","sidepanel_title_account_settings":"Ajustes de la cuenta","sidepanel_title_acc_general":"General","sidepanel_title_acc_security":"Seguridad","sidepanel_title_acc_notifications":"Notificaciones","sidepanel_title_acc_support":"Soporte","sidepanel_title_newtpk":"Iniciar un nuevo chat","sidepanel_title_cred":"Confirmar credenciales","sidepanel_title_reset":"Restablecer contraseña","sidepanel_title_archive":"Chats archivados","sidepanel_title_blocked":"Chats bloqueados","update_available":"Actualización disponible.","reload_update":"Recargar","reconnect_countdown":"Desconectado. Reconectando en {seconds}…","reconnect_now":"Reintentar","push_init_failed":"Error al inicializar las notificaciones push","invalid_security_token":"Token de seguridad inválido","no_connection":"Sin conexión","code_doesnot_match":"El código no coincide","phone_dative":"teléfono","email_dative":"correo electrónico","enter_confirmation_code_prompt":"Intruduzca el código de confirmación enviado a tu {method}:","numeric_confirmation_code_prompt":"Sólo números","button_confirm":"Confirmar","save_attachment":"guardar","deleted_content":"este mensaje fue eliminado","invalid_content":"contenido inválido","user_not_found":"Usuario no encontrado","badge_you":"tú","badge_owner":"propietario","menu_item_info":"Información","menu_item_clear_messages":"Borrar mensajes","menu_item_clear_messages_for_all":"Borrar para todos","menu_item_delete":"Eliminar","menu_item_delete_for_all":"Eliminar para todos","menu_item_send_retry":"Inténtalo de nuevo","menu_item_mute":"Silenciar","menu_item_unmute":"Anular el silencio","menu_item_delete_topic":"Eliminar","topic_delete_warning":"¿Estás seguro de que quieres eliminar esta conversación?","menu_item_unblock":"Desbloquear","menu_item_block":"Bloquear","topic_block_warning":"¿Estás seguro de que quieres bloquear esta conversación","menu_item_member_delete":"Eliminar","menu_item_archive_topic":"Archivar","action_cancel":"cancelar","upload_finishing":"terminando...","no_contacts":"No tienes contactos :-(","contacts_not_found_short":"Ningún contacto coincide con \'\'{query}\'\'","title_group_members":"Miembros del grupo","title_all_contacts":"Todos los contactos","button_ok":"OK","button_cancel":"Cancelar","more_online_members":"+{overflow} más","download_action":"descargar","label_file_name":"Nombre del archivo:","label_content_type":"Tipo de contenido:","label_size":"Tamaño:","chat_invitation":"Estás invitado a participar en un nuevo chat. ¿Qué te gustaría hacer?","chat_invitation_accept":"Aceptar","chat_invitation_ignore":"Ignorar","chat_invitation_block":"Bloquear","error_invalid_id":"ID inválido","group_user_id_prompt":"ID del grupo o usuario","button_subscribe":"Suscribirse","topic_name_editing_placeholder":"Nombre del grupo","button_create":"Crear","permission_join":"Unirse ({val})","permission_read":"Leer ({val})","permission_write":"Escribir ({val})","permission_pres":"Ser notificado ({val})","permission_admin":"Approbar ({val})","permission_share":"Compartir ({val})","permission_delete":"Eliminar ({val})","permission_owner":"Propietario ({val})","title_permissions":"Permisos","message_sending":"enviando...","message_sending_failed":"no se pudo enviar el mensaje","search_placeholder":"Ej. email:alice@example.com, tel:17025550003...","messaging_disabled_prompt":"El envío de mensajes está deshabilitado","new_message_prompt":"Nuevo mensaje","image_caption_prompt":"Añade un comentario","file_attachment_too_large":"El tamaño del archivo {size} excede el límite de {limit}.","cannot_initiate_file_upload":"No se pudo iniciar la carga del archivo.","tags_not_found":"No hay etiquetas definidas. Añade unas.","tags_editor_no_tags":"Añadir etiquetas","title_manage_tags":"Gestionar","channel_prompt":"Este es un canal","channel":"canal"},"ko":{"validate_credential_action":"확인","title_tag_manager":"태그(사용자검색)","label_user_contacts":"연락처: ","button_add_another":"다른항목추가","label_message_sound":"메시지소리: ","label_push_notifications":"통지경보: ","label_push_notifications_disabled":"통지경보(HTTPS필요): ","label_incognito_mode":"시크릿모드: ","delete_account":"계정삭제","delete_account_arning":"계정을삭제하시겠습니까?실행취소할수없습니다.","label_password":"비밀번호","password_unchanged_prompt":"변경되지않음","button_logout":"로그아웃","button_delete_account":"계정삭제","label_default_access_mode":"기본액세스모드: ","blocked_contacts_link":"차단된연락처({수})","link_contact_us":"문의처","link_terms_of_service":"서비스약관","link_privacy_policy":"개인정보보호정책","label_sdk":"SDK:","label_server_address":"서버주소: ","archived_contacts":"보관된연락처({수})","contacts_not_found":"채팅이없습니다
¯∖_(ツ)_/¯","full_name_prompt":"전체이름(예:홍길동)","email_prompt":"이메일(예:hong@example.com)","button_sign_up":"가입","label_your_name":"이름","label_user_id":"ID:","button_edit":"편집","requested_permissions":"요청","menu_item_edit_permissions":"편집권한","label_other_user":"기타","action_clear_messages":"메시지지우기","clear_messages_warning":"모든메시지를지우시겠습니까?실행취소할수없습니다.","action_delete_messages":"모든메시지지우기","delete_messages_warning":"모든사람의모든메시지를삭제하시겠습니까?실행취소할수없습니다.","action_leave_chat":"대화나누기","leave_chat_warning":"이대화를나가시겠습니까?","action_block_contact":"연락차단","block_contact_warning":"이연락처를차단하시겠습니까?","action_report_chat":"대화기록","report_chat_warning":"이대화를차단하고기록하시겠습니까?","title_info":"정보","label_topic_name":"이름","label_private":"개인코멘트","private_editing_placeholder":"나만볼수있습니다","label_muting_topic":"음소거: ","action_more":"더보기","label_your_permissions":"권한: ","label_permissions":"권한: ","label_you":"당신: ","label_default_access":"기본액세스모드: ","label_group_members":"그룹회원: ","button_add_members":"회원추가","group_has_no_members":"회원없음","login_prompt":"로그인","password_prompt":"비밀번호","stay_logged_in":"로그인상태유지","forgot_password_link":"비밀번호를잊으셨습니까?","button_sign_in":"로그인","label_client":"클라이언트: ","label_server":"서버: ","online_now":"현재접속중","last_seen_timestamp":"마지막으로본","title_not_found":"찾을수없음","unnamed_topic":"이름없는","peers_messaging_disabled":"동료의메시지가비활성화되었습니다.","enable_peers_messaging":"활성화","search_for_contacts":"검색을사용하여연락처찾기","search_no_results":"검색결과가없습니다","tabtitle_find_user":"찾기","tabtitle_new_group":"새그룹","tabtitle_group_by_id":"id로","new_password_placeholder":"새비밀번호입력","label_reset_password":"비밀번호재설정이메일보내기: ","credential_email_prompt":"등록이메일","button_reset":"재설정","button_send_request":"요청보내기","label_server_to_use":"사용할서버:","label_wire_transport":"와이어수송:","button_update":"업데이트","sidepanel_title_login":"로그인","sidepanel_title_register":"계정만들기","sidepanel_title_settings":"설정","sidepanel_title_account_settings":"계정설정","sidepanel_title_acc_general":"일반","sidepanel_title_acc_security":"보안","sidepanel_title_acc_notifications":"알림","sidepanel_title_acc_support":"지원","sidepanel_title_newtpk":"새채팅시작","sidepanel_title_cred":"자격증명확인","sidepanel_title_reset":"비밀번호재설정","sidepanel_title_archive":"보관된채팅","sidepanel_title_blocked":"차단된채팅","update_available":"업데이트가능.","reload_update":"재로드","reconnect_countdown":"연결이끊어졌습니다.다시연결하는중{초}…","reconnect_now":"지금시도","push_init_failed":"푸시알림을초기화하지못했습니다","invalid_security_token":"유효하지않은보안토큰","no_connection":"연결없음","code_doesnot_match":"코드가일치하지않습니다","phone_dative":"전화","email_dative":"이메일","enter_confirmation_code_prompt":"{방법}으로보낸확인코드를입력하십시오:","numeric_confirmation_code_prompt":"숫자만","button_confirm":"확인","save_attachment":"저장","invalid_content":"잘못된내용","user_not_found":"찾을수없음","badge_you":"당신","badge_owner":"소유자","menu_item_info":"정보","menu_item_clear_messages":"메시지지우기","menu_item_clear_messages_for_all":"모두지우기","menu_item_delete":"삭제","menu_item_delete_for_all":"모두삭제","menu_item_send_retry":"다시시도","menu_item_mute":"음소거","menu_item_unmute":"음소거해제","menu_item_delete_topic":"삭제","topic_delete_warning":"이대화를삭제하시겠습니까?","menu_item_unblock":"차단해제","menu_item_block":"차단","topic_block_warning":"이대화를차단하시겠습니까?","menu_item_member_delete":"제거","menu_item_archive_topic":"보관","action_cancel":"취소","upload_finishing":"마무리...","no_contacts":"연락처가없습니다 (._.)","contacts_not_found_short":"\'{문의}\'와일치하는연락처가없습니다.","title_group_members":"그룹구성원","title_all_contacts":"모든연락처","button_ok":"OK","button_cancel":"취소","more_online_members":"+{넘침}더보기","download_action":"다운로드","label_file_name":"파일이름: ","label_content_type":"컨텐츠유형: ","label_size":"크기: ","chat_invitation":"새로운대화를시작하도록초대되었습니다.무엇을하시겠습니까?","chat_invitation_accept":"수락","chat_invitation_ignore":"무시","chat_invitation_block":"차단","error_invalid_id":"잘못된ID","group_user_id_prompt":"그룹또는사용자ID","button_subscribe":"구독","topic_name_editing_placeholder":"그룹의자유형이름","button_create":"작성","permission_join":"참여({val})","permission_read":"읽기({val})","permission_write":"쓰기({val})","permission_pres":"알림받기({val})","permission_admin":"승인({val})","permission_share":"공유({val})","permission_delete":"삭제({val})","permission_owner":"소유자({val})","title_permissions":"권한","message_sending":"보내기...","message_sending_failed":"실패","search_placeholder":"email:alice@example.com,tel:17025550003...와같은목록","messaging_disabled_prompt":"메시지비활성화","new_message_prompt":"새메시지","image_caption_prompt":"이미지설명","file_attachment_too_large":"파일크기{크기}이(가){제한}제한을초과합니다.","cannot_initiate_file_upload":"파일업로드를시작할수없습니다.","tags_not_found":"태그가정의되지않았습니다.일부를추가하십시오.","tags_editor_no_tags":"일부태그추가","title_manage_tags":"관리","granted_permissions":"승낙하다","messages_not_readable":"메시지에 액세스 할 수 없습니다","deleted_content":"내용이 삭제되었습니다","channel_prompt":"이 채널입니다","channel":"채널"},"ro":{"validate_credential_action":"confirmă","title_tag_manager":"Tag-uri (user discovery)","label_user_contacts":"Contacte:","button_add_another":"Adaugă","label_message_sound":"Sunet de mesaj:","label_push_notifications":"Alerte de notificare:","label_push_notifications_disabled":"Alerte de notificare (necesită HTTPS):","label_incognito_mode":"Mod incognito:","delete_account":"Șterge contul","delete_account_arning":"Ești sigur că dorești să ștergi contul? Acesta nu va putea fi recuperat.","label_password":"Parola","password_unchanged_prompt":"Neschimbată","button_logout":"Deconectare","button_delete_account":"Șterge cont","label_default_access_mode":"Default access mode:","blocked_contacts_link":"Contact blocate ({count})","link_contact_us":"Contactează-ne","link_terms_of_service":"Termenii Serviciului","link_privacy_policy":"Politica de Confidențialitate","label_sdk":"SDK:","label_server_address":"Adresa serverului:","archived_contacts":"Contacte arhivate ({count})","contacts_not_found":"Nu ai contacte salvate
¯∖_(ツ)_/¯","full_name_prompt":"Numele tău","email_prompt":"Adresa de e-mail","button_sign_up":"Creează cont","label_your_name":"Numele tău","label_user_id":"ID:","button_edit":"Editează","requested_permissions":"Necesare","granted_permissions":"Oferite","menu_item_edit_permissions":"Editează permisiuni","label_other_user":"Altele","action_clear_messages":"Șterge mesajele","clear_messages_warning":"Ești sigur că dorești să ștergi mesajele? Acestea nu pot fi recuperate.","action_delete_messages":"Șterge toate mesajele","delete_messages_warning":"Ești sigur că dorești să șterge mesajele din toate conversațiile? Acestea nu pot fi recuperate.","action_leave_chat":"Ieși din conversație","leave_chat_warning":"Ești sigur că dorești să ieși din conersație?","action_block_contact":"Blochează contact","block_contact_warning":"Ești sigur că dorești să blochezi acest contact?","action_report_chat":"Raportează conversația","report_chat_warning":"Ești sigur că dorești să blochezi și să raportezi această conversație?","title_info":"Info","label_topic_name":"Nume","label_private":"Comentariu privat","private_editing_placeholder":"Vizibil doar ție","label_muting_topic":"Mod silențios (muted):","action_more":"Mai multe","label_your_permissions":"Permisiuniile tale:","label_permissions":"Permisiuni:","label_you":"Tu:","label_default_access":"Modul default:","label_group_members":"Membrii grupului:","button_add_members":"Adaugă persoane","group_has_no_members":"În acest grup nu se află persoane","login_prompt":"Conectează-te","password_prompt":"Parola","stay_logged_in":"Rămâi conectat","forgot_password_link":"Ți-ai uitat parola?","button_sign_in":"Conectează-te","label_client":"Client:","label_server":"Server:","online_now":"online acum","last_seen_timestamp":"Văzut ultima dată","title_not_found":"Nu a fost găsit","channel":"canal","unnamed_topic":"Nedenumit","messages_not_readable":"Mesajele nu pot fi citite","peers_messaging_disabled":"Mesageria de tip Peer este dezactivată.","enable_peers_messaging":"Activează","search_for_contacts":"Caută în contacte","search_no_results":"Nu s-au găsit rezultate","tabtitle_find_user":"caută","tabtitle_new_group":"grup nou","tabtitle_group_by_id":"după id","new_password_placeholder":"Introdu parolă","label_reset_password":"Resetează parola:","credential_email_prompt":"Adresa de e-mail","button_reset":"Resetează","button_send_request":"Trimite cerere","label_server_to_use":"Server de utilizat:","label_wire_transport":"Transportul legat:","button_update":"Actualizează","sidepanel_title_login":"Conectează-te","sidepanel_title_register":"Creează Cont","sidepanel_title_settings":"Setări","sidepanel_title_account_settings":"Setările Contului","sidepanel_title_acc_general":"Generale","sidepanel_title_acc_security":"Securitate","sidepanel_title_acc_notifications":"Notificări","sidepanel_title_acc_support":"Ajutor","sidepanel_title_newtpk":"Creeză un nou Chat","sidepanel_title_cred":"Confirmă credențiale","sidepanel_title_reset":"Resetează Parola","sidepanel_title_archive":"Conversații Arhivate","sidepanel_title_blocked":"Conversații Blocate","reconnect_countdown":"Deconectat. Se încearcă conectarea în {seconds}…","reconnect_now":"Încearcă din nou","push_init_failed":"Nu s-a reușit inițializarea tip push notifications","invalid_security_token":"Codul de securitate este invalid","no_connection":"Nu există conexiune","code_doesnot_match":"Codul furnizat nu este valid","update_available":"Actualizare disponibilă.","reload_update":"Reîncarcă","phone_dative":"telefon","email_dative":"email","enter_confirmation_code_prompt":"Introu codul de confirmare trimis pe {method}:","numeric_confirmation_code_prompt":"Doar cifre","button_confirm":"Confirmă","save_attachment":"salvează","deleted_content":"conținut șters","invalid_content":"conținut invalid","user_not_found":"Utilizatorul nu a fost găsit","badge_you":"tu","badge_owner":"owner","menu_item_info":"Info","menu_item_clear_messages":"Șterge mesajele","menu_item_clear_messages_for_all":"Ștergele pe toate","menu_item_delete":"Șterge","menu_item_delete_for_all":"Ștergele pe toate","menu_item_send_retry":"Reîncearcă","menu_item_mute":"Mute","menu_item_unmute":"Unmute","menu_item_delete_topic":"Șterge","topic_delete_warning":"Ești sigur că dorești să șterge această conversație?","menu_item_unblock":"Deblochează","menu_item_block":"Blochează","topic_block_warning":"Ești sigur că dorești să blochezi această conversație?","menu_item_member_delete":"Șterge persoană","menu_item_archive_topic":"Arhivează","action_cancel":"anulează","upload_finishing":"se încarcă...","no_contacts":"Nu ai contacte adăugate :-(","contacts_not_found_short":"Niciun contact găsit după criteriile \'\'{query}\'\'","title_group_members":"Persoanele din grup","title_all_contacts":"Toate Contactele","button_ok":"OK","button_cancel":"Anulează","more_online_members":"+{overflow} mai mult","download_action":"download","label_file_name":"Nume fișier:","label_content_type":"Tip conținut:","label_size":"Size:","chat_invitation":"Ai primit invitație într-o conversație. Accepți?","chat_invitation_accept":"Da, accept","chat_invitation_ignore":"Ignoră","chat_invitation_block":"Blochează","error_invalid_id":"ID Invalid","group_user_id_prompt":"Grup sau user ID","button_subscribe":"Subscribe","topic_name_editing_placeholder":"Numele grupului","channel_prompt":"Acesta este un canal","button_create":"Creează","permission_join":"Participare ({val})","permission_read":"Citire ({val})","permission_write":"Scriere ({val})","permission_pres":"Notificare ({val})","permission_admin":"Aprobare ({val})","permission_share":"Distribuire ({val})","permission_delete":"Ștergere ({val})","permission_owner":"Deținător ({val})","title_permissions":"Permisiuni","message_sending":"se trimite...","message_sending_failed":"eroare","search_placeholder":"Caută după e-mail sau număr telefon...","messaging_disabled_prompt":"Mesageria este dezactivată","new_message_prompt":"Mesaj nou","image_caption_prompt":"Titlul imaginii","file_attachment_too_large":"Dimensiunea fișiterului {size} depășește limita de {limit}.","cannot_initiate_file_upload":"Nu se poate face încărcarea.","tags_not_found":"Niciun tag definit. Adaugă.","tags_editor_no_tags":"Adaugă tag-uri","title_manage_tags":"Administrează"},"ru":{"contacts_not_found":"Чатов нет
¯∖_(ツ)_/¯","full_name_prompt":"Полное имя, напр. Иван Петров","email_prompt":"Email, напр. ivan@example.com","button_sign_up":"Создать аккаунт","label_your_name":"Ваше имя","label_password":"Пароль","password_unchanged_prompt":"Не изменен","label_user_id":"ID:","label_default_access_mode":"Доступ по умолчанию:","label_message_sound":"Звук нового сообщения:","label_push_notifications":"Уведомления:","label_push_notifications_disabled":"Уведомления (требуют HTTPS):","title_tag_manager":"Теги для поиска","button_logout":"Выйти","login_prompt":"Логин","password_prompt":"Пароль","stay_logged_in":"Запомнить","forgot_password_link":"Напомнить пароль","button_sign_in":"Войти","label_client":"Клиент:","label_server":"Сервер:","online_now":"онлайн","last_seen_timestamp":"Был активен","title_not_found":"Не найден","unnamed_topic":"Без названия","messages_not_readable":"нет доступа к сообщениям","tabtitle_find_user":"найти","tabtitle_new_group":"создать","tabtitle_group_by_id":"по id","label_server_to_use":"Использовать сервер:","label_wire_transport":"Соединение:","button_update":"Применить","sidepanel_title_login":"Авторизация","sidepanel_title_register":"Зарегистрироваться","sidepanel_title_settings":"Настройки","sidepanel_title_account_settings":"Настройки аккаунта","sidepanel_title_newtpk":"Новый чат","sidepanel_title_cred":"Подтвердить","sidepanel_title_reset":"Сменить пароль","tags_not_found":"Тегов нет. Добавьте","tags_editor_no_tags":"Добавьте теги","title_manage_tags":"Редактировать","message_sending":"в пути...","message_sending_failed":"ошибка","search_placeholder":"Список, напр. email:alice@example.com, tel:+17025550003...","messaging_disabled_prompt":"Отправка недоступна","new_message_prompt":"Новое сообщение","file_attachment_too_large":"Размер файла {size} превышает {limit} лимит.","cannot_initiate_file_upload":"Ошибка загрузки файла.","search_for_contacts":"Поиск контактов","enter_confirmation_code_prompt":"Код подтверждения, полученный по {method}:","numeric_confirmation_code_prompt":"Только цифры","button_confirm":"Подтвердить","button_ok":"OK","button_cancel":"Отменить","invalid_content":"сообщение не читается","label_file_name":"Имя файла:","label_content_type":"Тип:","label_size":"Размер:","phone_dative":"телефону","email_dative":"емейлу","title_group_members":"Участники","download_action":"скачать","permission_join":"Подписываться ({val})","permission_read":"Читать ({val})","permission_write":"Писать ({val})","permission_pres":"Уведомлять ({val})","permission_admin":"Подтверждать ({val})","permission_share":"Приглашать ({val})","permission_delete":"Удалять ({val})","permission_owner":"Владелец ({val})","title_permissions":"Права доступа","requested_permissions":"Требуются","granted_permissions":"Получены","menu_item_edit_permissions":"Права доступа","label_other_user":"Второй","label_topic_name":"Название","label_private":"Комментарий","private_editing_placeholder":"Виден только вам","label_muting_topic":"Без уведомлений","action_more":"Ещё","label_your_permissions":"Ваши права доступа:","label_permissions":"Права доступа:","label_you":"Вы:","label_default_access":"Права по умолчанию:","label_group_members":"Участники чата:","button_add_members":"Добавить","group_has_no_members":"Нет участников","action_leave_chat":"Уйти из чата","menu_item_info":"Информация","menu_item_clear_messages":"Удалить сообщения","menu_item_clear_messages_for_all":"Удалить для всех","menu_item_delete":"Удалить","menu_item_delete_for_all":"Удалить для всех","menu_item_send_retry":"Отправить заново","menu_item_mute":"Не уведомлять","menu_item_unmute":"Уведомлять","menu_item_delete_topic":"Удалить чат","menu_item_unblock":"Разблокировать","menu_item_block":"Заблокировать","menu_item_member_delete":"Отписать","title_info":"Подробности","new_password_placeholder":"Введите новый пароль","label_reset_password":"Отправить емейл для смены пароля:","credential_email_prompt":"Регистрационный емейл","button_reset":"Изменить","button_send_request":"Отправить","action_cancel":"отменить","upload_finishing":"завершение...","no_contacts":"Ничего нет :-(","contacts_not_found_short":"Нет контактов для запроса \'\'{query}\'\'","title_all_contacts":"Все контакты","error_invalid_id":"Неверный ID","group_user_id_prompt":"ID чата или пользователя","button_subscribe":"Подписаться","topic_name_editing_placeholder":"Название чата","button_create":"Создать","badge_you":"вы","badge_owner":"влад.","update_available":"Есть новая версия приложения.","reload_update":"Обновить","user_not_found":"Не найден","reconnect_countdown":"Нет связи. Подключение через {seconds}…","reconnect_now":"Подключить сейчас.","save_attachment":"сохранить","menu_item_archive_topic":"В архив","archived_contacts":"Чаты в архиве ({count})","sidepanel_title_archive":"Архив чатов","chat_invitation":"Вас пригласили начать новый чат. Как вы хотите поступить?","chat_invitation_accept":"Принять","chat_invitation_ignore":"Игнорировать","chat_invitation_block":"Заблокировать","peers_messaging_disabled":"Чат заблокирован у корреспондента.","enable_peers_messaging":"Разблокировать.","more_online_members":"+еще {overflow}","label_user_contacts":"Конакты:","validate_credential_action":"подтвердить","link_contact_us":"Связаться с нами","link_terms_of_service":"Условия сервиса","link_privacy_policy":"Политика конфиденциальности","action_delete_messages":"Удалить сообщения","action_block_contact":"Заблокировать контакт","action_report_chat":"Сообщить о нарушении","delete_messages_warning":"Вы действительно хотите удалить все сообщения?","leave_chat_warning":"Вы действительно хотите покинуть этот чат?","block_contact_warning":"Вы действительно заблокировать этот контакт?","report_chat_warning":"Вы действительно хотите сообщить о нарушении и заблокировать этот чат?","action_clear_messages":"Удалить сообщения","clear_messages_warning":"Вы действительно хотите удалить все сообщения в чате? Их будет невозможно восстановить.","topic_delete_warning":"Вы действительно хотите удалить этот чат?","topic_block_warning":"Вы действительно хотите заблокировать этот чат?","search_no_results":"Ничего не найдено","deleted_content":"удалено","image_caption_prompt":"Подпись к фото","label_incognito_mode":"Режим инкогнито:","delete_account":"Удалить аккаунт","delete_account_arning":"Вы уверены, что ходите удалить свой аккаунт? Его невозможно будет восстановить.","button_delete_account":"Удалить аккаунт","sidepanel_title_acc_security":"Безопасность","sidepanel_title_acc_notifications":"Уведомления","sidepanel_title_acc_support":"Поддержка","label_sdk":"SDK:","label_server_address":"Адрес сервера:","button_edit":"Редактировать","button_add_another":"Добавить","sidepanel_title_acc_general":"Общие настройки","blocked_contacts_link":"Заблокированные ({count})","sidepanel_title_blocked":"Заблокированные чаты","push_init_failed":"Ошибка инициализации пуш уведомлений","invalid_security_token":"Токен некорректен","no_connection":"Нет связи","code_doesnot_match":"Код не совпадает","channel_prompt":"Создать канал","channel":"канал"},"zh":{"archived_contacts":"已归档联系人 ({count})","contacts_not_found":"你尚无会话
¯∖_(ツ)_/¯","full_name_prompt":"全名,例如张伟","email_prompt":"电子邮件,例如 zhang@example.com","button_sign_up":"注册","label_your_name":"你的姓名","label_password":"密码","password_unchanged_prompt":"未改变","label_user_id":"地址:","label_default_access_mode":"蓦然访问模式:","label_message_sound":"消息提示音:","label_push_notifications":"通知提醒:","label_push_notifications_disabled":"通知提醒(需要 HTTPS):","title_tag_manager":"标签(用户发现)","button_logout":"登出","requested_permissions":"已请求","granted_permissions":"已授予","menu_item_edit_permissions":"编辑权限","label_other_user":"其他","title_info":"信息","label_topic_name":"名称","label_private":"私人评论","private_editing_placeholder":"仅自己可见","label_muting_topic":"已静音:","action_more":"更多","label_your_permissions":"你的权限:","label_permissions":"权限:","label_you":"你:","label_default_access":"默认权限模式:","label_group_members":"群组成员:","button_add_members":"添加成员","group_has_no_members":"无成员","action_leave_chat":"离开","login_prompt":"登录","password_prompt":"密码","stay_logged_in":"保持登录","forgot_password_link":"忘记密码?","button_sign_in":"登录","label_client":"客户端:","label_server":"服务器:","online_now":"在线","last_seen_timestamp":"最后可见","title_not_found":"无法找到","unnamed_topic":"未命名","messages_not_readable":"无消息访问权限","peers_messaging_disabled":"成员间消息已禁用。","enable_peers_messaging":"启用","tabtitle_find_user":"搜索","tabtitle_new_group":"新群组","tabtitle_group_by_id":"通过 id","search_for_contacts":"使用搜索寻找联系人","new_password_placeholder":"输入新密码","label_reset_password":"发送密码重置邮件:","credential_email_prompt":"你的注册邮箱","button_reset":"重置","button_send_request":"发送请求","label_server_to_use":"使用的服务器:","label_wire_transport":"线路传输:","button_update":"更新","sidepanel_title_login":"登录","sidepanel_title_register":"创建账户","sidepanel_title_settings":"设置","sidepanel_title_account_settings":"帐号设定","sidepanel_title_newtpk":"开始新会话","sidepanel_title_cred":"确认凭据","sidepanel_title_reset":"重置密码","sidepanel_title_archive":"已存档会话","update_available":"更新可用。","reload_update":"重新载入","reconnect_countdown":"连接已断开。{seconds} 秒后重新连接…","reconnect_now":"立即尝试","phone_dative":"电话","email_dative":"电子邮件","enter_confirmation_code_prompt":"输入通过{method}发送的验证码:","numeric_confirmation_code_prompt":"仅数字","button_confirm":"确认","save_attachment":"保存","invalid_content":"无效内容","user_not_found":"未找到","badge_you":"你","badge_owner":"所有者","menu_item_info":"信息","menu_item_clear_messages":"清空消息","menu_item_clear_messages_for_all":"全部清除","menu_item_delete":"删除","menu_item_delete_for_all":"全部删除","menu_item_mute":"静音","menu_item_unmute":"取消静音","menu_item_delete_topic":"删除","menu_item_unblock":"取消屏蔽","menu_item_block":"屏蔽","menu_item_member_delete":"移除","menu_item_archive_topic":"归档","action_cancel":"取消","upload_finishing":"正在结束...","no_contacts":"你尚无联系人 (._.)","contacts_not_found_short":"无联系人匹配\'\'{query}\'\'","title_group_members":"群组成员","title_all_contacts":"全部联系人","button_ok":"好","button_cancel":"取消","download_action":"下载","label_file_name":"文件名:","label_content_type":"内容类型:","label_size":"大小:","chat_invitation":"你受邀开始新会话。你想怎么做?","chat_invitation_accept":"接受","chat_invitation_ignore":"忽略","chat_invitation_block":"屏蔽","error_invalid_id":"无效 ID","group_user_id_prompt":"群组或用户 ID","button_subscribe":"订阅","topic_name_editing_placeholder":"群组自由格式名称","button_create":"创建","permission_join":"加入 ({val})","permission_read":"读取 ({val})","permission_write":"写入 ({val})","permission_pres":"获取通知 ({val})","permission_admin":"批准 ({val})","permission_share":"分享 ({val})","permission_delete":"删除 ({val})","permission_owner":"所有者 ({val})","title_permissions":"权限","message_sending":"正在发送...","message_sending_failed":"发送失败","search_placeholder":"列表如 email:alice@example.com, tel:+17025550003...","messaging_disabled_prompt":"消息已禁用","new_message_prompt":"新消息","file_attachment_too_large":"文件大小 {size} 超过 {limit} 限制。","cannot_initiate_file_upload":"无法初始化文件上传。","tags_not_found":"尚未定义标签。添加一些。","tags_editor_no_tags":"添加一些标签","title_manage_tags":"管理标签","more_online_members":"还有{overflow}个","label_user_contacts":"往来:","validate_credential_action":"确认","link_contact_us":"联系我们","link_terms_of_service":"条款和条件","link_privacy_policy":"隐私政策","action_delete_messages":"删除所有帖子","action_block_contact":"屏蔽联系人","delete_messages_warning":"您确定要删除所有消息吗?无法撤消。","leave_chat_warning":"您确定要退出此对话吗?","block_contact_warning":"您确定要阻止此联系人吗?","action_report_chat":"检举垃圾邮件","report_chat_warning":"您确定要停止并报告此对话吗?","action_clear_messages":"删除讯息","clear_messages_warning":"您确定要清除所有消息吗?无法撤消。","topic_delete_warning":"您确定要删除此对话吗?","topic_block_warning":"您确定要阻止此对话吗?","search_no_results":"搜索返回任何结果","deleted_content":"内容已删除","image_caption_prompt":"图片标题","menu_item_send_retry":"重试","label_incognito_mode":"无痕模式:","delete_account":"删除帐户","delete_account_arning":"您确定要删除您的帐户吗?无法撤消。","button_delete_account":"删除帐户","sidepanel_title_acc_security":"安全","sidepanel_title_acc_notifications":"通知","sidepanel_title_acc_support":"支持","label_sdk":"开发包:","label_server_address":"服务器地址:","button_edit":"编辑","button_add_another":"加上另一个","sidepanel_title_acc_general":"常用设定","blocked_contacts_link":"封锁的联络人 ({count})","sidepanel_title_blocked":"被阻止的聊天","push_init_failed":"初始化推送通知失败","invalid_security_token":"无效的安全令牌","no_connection":"无连接","code_doesnot_match":"代码不匹配","channel_prompt":"这是一个频道","channel":"频道"}}'),r=firebase,l=(firebase.messaging,Tinode),c=e.n(l);class d extends s().PureComponent{render(){return this.props.visible?s().createElement("div",{className:"alert-container"},s().createElement("div",{className:"alert"},s().createElement("div",{className:"title"},this.props.title),s().createElement("div",{className:"content"},this.props.content),s().createElement("div",{className:"dialog-buttons"},this.props.onReject?s().createElement("button",{className:"outline",onClick:this.props.onReject},this.props.reject||s().createElement(n.FormattedMessage,{id:"button_cancel"})):null,s().createElement("button",{className:"blue",onClick:this.props.onConfirm},this.props.confirm||s().createElement(n.FormattedMessage,{id:"button_ok"}))))):null}}const h="TinodeWeb/0.16.10",p={hosted:"web.tinode.co",local:"localhost:6060"},m=p.hosted,u=3e3,_="JRWPS",g=13,b=128,v=262144,f=1<<23,E=1024,w=60,C=(0,n.defineMessages)({info:{id:"menu_item_info",defaultMessage:"Info",description:"Show extended topic information"},clear_messages:{id:"menu_item_clear_messages",defaultMessage:"Clear messages",description:"Delete all messages"},clear_for_all:{id:"menu_item_clear_messages_for_all",defaultMessage:"Clear for All",description:"Delete all message(s) for all members"},delete:{id:"menu_item_delete",defaultMessage:"Delete",description:"Delete selected messages"},delete_for_all:{id:"menu_item_delete_for_all",defaultMessage:"Delete for All",description:"Delete selected message(s) for all members"},send_retry:{id:"menu_item_send_retry",defaultMessage:"Retry",description:"Retry sending message"},mute:{id:"menu_item_mute",defaultMessage:"Mute",description:"Turn off notifications"},unmute:{id:"menu_item_unmute",defaultMessage:"Unmute",description:"Turn notifications on"},topic_delete:{id:"menu_item_delete_topic",defaultMessage:"Delete",description:"Delete entire topic"},topic_delete_warning:{id:"topic_delete_warning",defaultMessage:"Are you sure you want to delete this conversation?",description:"Alert warning when deleting entire topic"},unblock:{id:"menu_item_unblock",defaultMessage:"Unblock",description:"Unblock topic or user"},block:{id:"menu_item_block",defaultMessage:"Block",description:"Block topic or user"},topic_block_warning:{id:"topic_block_warning",defaultMessage:"Are you sure you want to block this conversation?",description:"Alert warning when blocking a topic."},member_delete:{id:"menu_item_member_delete",defaultMessage:"Remove",description:"Remove user from topic"},archive:{id:"menu_item_archive_topic",defaultMessage:"Archive",description:"Move topic from the list of active chats to archive"}});class S extends s().Component{constructor(e){super(e);const{formatMessage:t}=e.intl;this.handlePageClick=this.handlePageClick.bind(this),this.handleEscapeKey=this.handleEscapeKey.bind(this),this.handleClick=this.handleClick.bind(this),this.MenuItems={topic_info:{id:"topic_info",title:t(C.info),handler:null},messages_clear:{id:"messages_clear",title:t(C.clear_messages),handler:(s,a)=>e.onShowAlert(t({id:"menu_item_clear_messages"}),t({id:"clear_messages_warning"}),(()=>{this.deleteMessages(!0,!1,s,a)}),null,!0,null)},messages_clear_hard:{id:"messages_clear_hard",title:t(C.clear_for_all),handler:(s,a)=>e.onShowAlert(t({id:"menu_item_clear_messages_for_all"}),t({id:"delete_messages_warning"}),(()=>this.deleteMessages(!0,!0,s,a)),null,!0,null)},message_delete:{id:"message_delete",title:t(C.delete),handler:(e,t)=>this.deleteMessages(!1,!1,e,t)},message_delete_hard:{id:"message_delete_hard",title:t(C.delete_for_all),handler:(e,t)=>this.deleteMessages(!1,!0,e,t)},menu_item_send_retry:{id:"menu_item_send_retry",title:t(C.send_retry),handler:(e,t)=>this.retryMessage(e,t)},topic_unmute:{id:"topic_unmute",title:t(C.unmute),handler:this.topicPermissionSetter.bind(this,"+P")},topic_mute:{id:"topic_mute",title:t(C.mute),handler:this.topicPermissionSetter.bind(this,"-P")},topic_unblock:{id:"topic_unblock",title:t(C.unblock),handler:this.topicPermissionSetter.bind(this,"+JP")},topic_block:{id:"topic_block",title:t(C.block),handler:(s,a)=>e.onShowAlert(t({id:"menu_item_block"}),t(C.topic_block_warning),(()=>this.topicPermissionSetter("-JP",s,a).then((e=>(this.props.onTopicRemoved(s.topicName),e)))),null,!0,null)},topic_delete:{id:"topic_delete",title:t(C.topic_delete),handler:(s,a)=>e.onShowAlert(t({id:"menu_item_delete_topic"}),t(C.topic_delete_warning),(()=>{const e=this.props.tinode.getTopic(s.topicName);if(e)return e.delTopic(!0).catch((e=>{a&&a(e.message,"err")}));console.log("Topic not found: ",s.topicName)}),null,!0,null)},topic_archive:{id:"topic_archive",title:t(C.archive),handler:(e,t)=>{const s=this.props.tinode.getTopic(e.topicName);if(s)return s.archive(!0).catch((e=>{t&&t(e.message,"err")}));console.log("Topic not found: ",e.topicName)}},permissions:{id:"permissions",title:t({id:"menu_item_edit_permissions"}),handler:null},member_delete:{id:"member_delete",title:t(C.member_delete),handler:(e,t)=>{const s=this.props.tinode.getTopic(e.topicName);if(s&&e.user)return s.delSubscription(e.user).catch((e=>{t&&t(e.message,"err")}));console.log("Topic or user not found: '"+e.topicName+"', '"+e.user+"'")}},member_mute:{id:"member_mute",title:t(C.mute),handler:this.topicPermissionSetter.bind(this,"-P")},member_unmute:{id:"member_unmute",title:t(C.unmute),handler:this.topicPermissionSetter.bind(this,"+P")},member_block:{id:"member_block",title:t(C.block),handler:this.topicPermissionSetter.bind(this,"-JP")},member_unblock:{id:"member_unblock",title:t(C.unblock),handler:this.topicPermissionSetter.bind(this,"+JP")}}}componentDidMount(){document.addEventListener("mousedown",this.handlePageClick,!1),document.addEventListener("keyup",this.handleEscapeKey,!1)}componentWillUnmount(){document.removeEventListener("mousedown",this.handlePageClick,!1),document.removeEventListener("keyup",this.handleEscapeKey,!1)}handlePageClick(e){i().findDOMNode(this).contains(e.target)||(e.preventDefault(),e.stopPropagation(),this.props.hide())}handleEscapeKey(e){27===e.keyCode&&this.props.hide()}handleClick(e){e.preventDefault(),e.stopPropagation(),this.props.hide();let t=this.props.items[e.currentTarget.dataset.id];"string"==typeof t&&(t=this.MenuItems[t]),t?this.props.onAction(t.id,t.handler(this.props.params,this.props.onError),this.props.params):console.log("Invalid menu item ID",e.currentTarget.dataset.id)}deleteMessages(e,t,s,a){const i=this.props.tinode.getTopic(s.topicName);if(!i)return void console.log("Topic not found: ",s.topicName);if(!e&&i.cancelSend(s.seq))return;return(e?i.delMessagesAll(t):i.delMessagesList([s.seq],t)).catch((e=>{a&&a(e.message,"err")}))}retryMessage(e,t){const s=this.props.tinode.getTopic(e.topicName);if(!s||!s.flushMessage(e.seq))return;const a=s.createMessage(e.content,!1);return s.publishDraft(a).catch((e=>{t&&t(e.message,"err")}))}topicPermissionSetter(e,t,s){const a=this.props.tinode.getTopic(t.topicName);if(!a)return void console.log("Topic not found",t.topicName);let i=a.updateMode(t.user,e);return s&&(i=i.catch((e=>{s(e.message,"err")}))),i}render(){let e=0,t=[];this.props.items.map((a=>{"string"==typeof a&&(a=this.MenuItems[a]),a&&a.title&&t.push("-"==a.title?s().createElement("li",{className:"separator",key:e}):s().createElement("li",{onClick:this.handleClick,"data-id":e,key:e},a.title)),e++}));const a=g*(.7+2.5*t.length),i={left:(this.props.bounds.right-this.props.clickAt.x<156?this.props.clickAt.x-this.props.bounds.left-156:this.props.clickAt.x-this.props.bounds.left)+"px",top:(this.props.bounds.bottom-this.props.clickAt.y0?a<3?2:a<30?1:0:0;return a.toFixed(i)+" "+t[s]}class N extends s().PureComponent{render(){let e;if(!0===this.props.avatar){const t="grp"==c().topicType(this.props.topic),a=(t?"light-color":"dark-color")+Math.abs(function(e){let t=0;e=""+e;for(let s=0;s
¯∖_(ツ)_/¯",description:"HTML message shown in ContactList when no contacts are found"},(e=>s().createElement(K,{connected:this.props.connected,contacts:this.state.contactList,emptyListMessage:e,topicSelected:this.props.topicSelected,myUserId:this.props.myUserId,showOnline:!0,showUnread:!0,onTopicSelected:this.props.onTopicSelected,showContextMenu:this.props.showContextMenu,onAction:this.handleAction})))}}class He{static setObject(e,t){localStorage.setItem(e,JSON.stringify(t))}static getObject(e){const t=localStorage.getItem(e);return t&&JSON.parse(t)}static updateObject(e,t){const s=this.getObject(e);this.setObject(e,Object.assign(s||{},t))}static removeItem(e){localStorage.removeItem(e)}}class Ve extends s().PureComponent{constructor(e){super(e),this.state={login:"",password:"",email:"",fn:"",imageDataUrl:null,errorCleared:!1,saveToken:He.getObject("keep-logged-in")},this.handleLoginChange=this.handleLoginChange.bind(this),this.handlePasswordChange=this.handlePasswordChange.bind(this),this.handleEmailChange=this.handleEmailChange.bind(this),this.handleFnChange=this.handleFnChange.bind(this),this.handleImageChanged=this.handleImageChanged.bind(this),this.handleToggleSaveToken=this.handleToggleSaveToken.bind(this),this.handleSubmit=this.handleSubmit.bind(this)}handleLoginChange(e){this.setState({login:e.target.value})}handlePasswordChange(e){this.setState({password:e})}handleEmailChange(e){this.setState({email:e.target.value})}handleFnChange(e){this.setState({fn:e.target.value})}handleImageChanged(e){this.setState({imageDataUrl:e})}handleToggleSaveToken(){He.setObject("keep-logged-in",!this.state.saveToken),this.setState({saveToken:!this.state.saveToken})}handleSubmit(e){e.preventDefault(),this.setState({errorCleared:!1}),this.props.onCreateAccount(this.state.login.trim(),this.state.password.trim(),oe(this.state.fn.trim().substring(0,w),this.state.imageDataUrl),{meth:"email",val:this.state.email})}render(){let e="blue";return this.props.disabled&&(e+=" disabled"),s().createElement("form",{className:"panel-form-column",onSubmit:this.handleSubmit},s().createElement("div",{className:"panel-form-row"},s().createElement("div",{className:"panel-form-column"},s().createElement(n.FormattedMessage,{id:"login_prompt"},(e=>s().createElement("input",{type:"text",placeholder:e,autoComplete:"user-name",value:this.state.login,onChange:this.handleLoginChange,required:!0,autoFocus:!0}))),s().createElement(n.FormattedMessage,{id:"password_prompt"},(e=>s().createElement($,{placeholder:e,autoComplete:"new-password",value:this.state.password,onFinished:this.handlePasswordChange,required:!0})))),s().createElement(x,{onImageChanged:this.handleImageChanged,onError:this.props.onError})),s().createElement("div",{className:"panel-form-row"},s().createElement(n.FormattedMessage,{id:"full_name_prompt",defaultMessage:"Full name, e.g. John Doe",description:"Input placeholder for person's full name"},(e=>s().createElement("input",{type:"text",placeholder:e,autoComplete:"name",value:this.state.fn,onChange:this.handleFnChange,required:!0})))),s().createElement("div",{className:"panel-form-row"},s().createElement(n.FormattedMessage,{id:"email_prompt",defaultMessage:"Email, e.g. jdoe@example.com",description:"Input placeholder for email entry"},(e=>s().createElement("input",{type:"email",placeholder:e,autoComplete:"email",value:this.state.email,onChange:this.handleEmailChange,required:!0})))),s().createElement("div",{className:"panel-form-row"},s().createElement(R,{id:"save-token",name:"save-token",checked:this.state.saveToken,onChange:this.handleToggleSaveToken}),s().createElement(n.FormattedMessage,{id:"stay_logged_in"},(e=>s().createElement("label",{htmlFor:"save-token"}," ",e)))),s().createElement("div",{className:"dialog-buttons"},s().createElement("button",{className:e,type:"submit"},s().createElement(n.FormattedMessage,{id:"button_sign_up",defaultMessage:"Sign up",description:"Create account button [Sign Up]"}))))}}class Ke extends s().Component{constructor(e){super(e);const t=this.props.tinode.getMeTopic();this.state={fullName:t.public?t.public.fn:void 0,avatar:P(t.public?t.public.photo:null)}}render(){return s().createElement("div",{className:"scrollable-panel"},s().createElement("div",{className:"panel-form-row"},s().createElement("div",{className:"panel-form-column"},s().createElement("label",{className:"small"},s().createElement(n.FormattedMessage,{id:"label_your_name",defaultMessage:"Your name",description:"Label for full name editing"})),s().createElement("div",{className:"large"},this.state.fullName),s().createElement("div",null,s().createElement("label",{className:"small"},s().createElement(n.FormattedMessage,{id:"label_user_id",defaultMessage:"ID:",description:"Label for user address (ID)"}))," ",s().createElement("tt",null,this.props.myUserId))),s().createElement(x,{avatar:this.state.avatar,readOnly:!this.state.owner,uid:this.props.myUserId,title:this.state.fullName})),s().createElement("div",{className:"panel-form-row"},s().createElement("a",{href:"#",className:"flat-button",onClick:e=>{e.preventDefault(),this.props.onBasicNavigate("general")}},s().createElement("i",{className:"material-icons"},"edit")," ",s().createElement(n.FormattedMessage,{id:"button_edit",defaultMessage:"Edit",description:"Call to action [Edit]"}))),s().createElement("div",{className:"hr"}),s().createElement("div",{className:"panel-form-column"},s().createElement("a",{href:"#",className:"flat-button",onClick:e=>{e.preventDefault(),this.props.onBasicNavigate("notif")}},s().createElement("i",{className:"material-icons"},"notifications")," ",s().createElement(n.FormattedMessage,{id:"sidepanel_title_acc_notifications"})),s().createElement("a",{href:"#",className:"flat-button",onClick:e=>{e.preventDefault(),this.props.onBasicNavigate("security")}},s().createElement("i",{className:"material-icons"},"security")," ",s().createElement(n.FormattedMessage,{id:"sidepanel_title_acc_security"})),s().createElement("a",{href:"#",className:"flat-button",onClick:e=>{e.preventDefault(),this.props.onBasicNavigate("support")}},s().createElement("i",{className:"material-icons"},"contact_support")," ",s().createElement(n.FormattedMessage,{id:"sidepanel_title_acc_support"}))))}}class We extends s().Component{constructor(e){super(e);const t=this.props.tinode.getMeTopic();this.state={fullName:t.public?t.public.fn:void 0,avatar:P(t.public?t.public.photo:null),tags:t.tags(),credentials:t.getCredentials()||[],addCredActive:!1,addCredInvalid:!1,newCred:"",previousOnTags:t.onTagsUpdated},this.tnNewTags=this.tnNewTags.bind(this),this.tnCredsUpdated=this.tnCredsUpdated.bind(this),this.handleFullNameUpdate=this.handleFullNameUpdate.bind(this),this.handleImageChanged=this.handleImageChanged.bind(this),this.handleCredChange=this.handleCredChange.bind(this),this.handleCredKeyDown=this.handleCredKeyDown.bind(this),this.handleCredEntered=this.handleCredEntered.bind(this),this.handleTagsUpdated=this.handleTagsUpdated.bind(this)}componentDidMount(){const e=this.props.tinode.getMeTopic();e.onCredsUpdated=this.tnCredsUpdated,e.onTagsUpdated=this.tnNewTags}componentWillUnmount(){const e=this.props.tinode.getMeTopic();e.onTagsUpdated=this.state.previousOnTags,e.onCredsUpdated=void 0}tnNewTags(e){this.setState({tags:e})}tnCredsUpdated(e){this.setState({credentials:e||[]})}handleFullNameUpdate(e){(e=e.trim().substring(0,w))&&(this.setState({fullName:e}),this.props.onUpdateAccount(void 0,oe(e,null)))}handleImageChanged(e){this.setState({avatar:e}),this.props.onUpdateAccount(void 0,oe(null,e||c().DEL_CHAR))}handleCredChange(e){this.setState({newCred:e.target.value,addCredInvalid:!1})}handleCredKeyDown(e){27===e.keyCode?this.setState({newCred:"",addCredActive:!1}):13===e.keyCode&&this.handleCredEntered(e)}handleCredEntered(e){let t=this.state.newCred.trim();if(!t)return void this.setState({addCredActive:!1,addCredInvalid:!1});let s,a=function(e){return e=e.trim(),/^(?:\+?(\d{1,3}))?[- (.]*(\d{3})[- ).]*(\d{3})[- .]*(\d{2})[- .]*(\d{2})?$/.test(e)?e.replace(/[- ().]*/,""):null}(t);a?s="tel":(a=function(e){return e=e.trim(),/^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+$/.test(e)?e:null}(t),a&&(s="email")),s?(this.props.onCredAdd(s,a),this.setState({addCredActive:!1,newCred:""})):this.setState({addCredInvalid:!0})}handleTagsUpdated(e){re(this.state.tags.slice(0),e.slice(0))||this.props.onUpdateTags(e)}render(){const e=[];return this.state.credentials.map((t=>{e.push(s().createElement("div",{key:t.meth+":"+t.val+":"+t.done},t.meth,": ",s().createElement("tt",null,t.val),s().createElement("span",null," ",t.done?null:s().createElement("a",{href:"#",onClick:e=>{e.preventDefault(),this.props.onCredConfirm(t.meth,t.val)}},s().createElement(n.FormattedMessage,{id:"validate_credential_action",defaultMessage:"confirm",description:"Validate credentail call to action"}))," ",s().createElement("a",{href:"#",onClick:e=>{e.preventDefault(),this.props.onCredDelete(t.meth,t.val)}},s().createElement("i",{className:"material-icons gray"},"delete_outline")))))})),s().createElement("div",{className:"scrollable-panel"},s().createElement("div",{className:"panel-form-row"},s().createElement("div",{className:"panel-form-column"},s().createElement("label",{className:"small"},s().createElement(n.FormattedMessage,{id:"label_your_name"})),s().createElement("div",null,s().createElement(n.FormattedMessage,{id:"full_name_prompt"},(e=>s().createElement(ee,{placeholder:e,value:this.state.fullName,onFinished:this.handleFullNameUpdate}))))),s().createElement(x,{avatar:this.state.avatar,uid:this.props.myUserId,title:this.state.fullName,onImageChanged:this.handleImageChanged,onError:this.props.onError})),s().createElement("div",{className:"hr"}),s().createElement(n.FormattedMessage,{id:"title_tag_manager",defaultMessage:"Tags (user discovery)",description:"Section title for TagManager"},(e=>s().createElement(ce,{title:e,activated:!1,tags:this.state.tags,tinode:this.props.tinode,onSubmit:this.handleTagsUpdated}))),s().createElement("div",{className:"hr"}),s().createElement("div",{className:"panel-form-column"},s().createElement("label",{className:"small"},s().createElement(n.FormattedMessage,{id:"label_user_contacts",defaultMessage:"Contacts:",description:"Label for user contacts"})),s().createElement("div",{className:"quoted"},e,this.state.addCredActive?s().createElement("input",{type:"text",value:this.state.value,className:this.state.addCredInvalid?"invalid":null,placeholder:"Phone number or email",required:"required",autoFocus:!0,onChange:this.handleCredChange,onKeyDown:this.handleCredKeyDown,onBlur:this.handleCredEntered}):null,s().createElement("div",null,s().createElement("a",{href:"#",onClick:e=>{e.preventDefault(),this.setState({addCredActive:!0})}},s().createElement("i",{className:"material-icons"},"add"),s().createElement(n.FormattedMessage,{id:"button_add_another",defaultMessage:"Add another",description:"Call to action [+ add another]"}))))))}}class Ge extends s().PureComponent{constructor(e){super(e),this.handleCheckboxClick=this.handleCheckboxClick.bind(this)}handleCheckboxClick(e,t){"sound"==e?this.props.onToggleMessageSounds(t):"alert"==e?this.props.onTogglePushNotifications(t):"incognito"==e&&this.props.onToggleIncognitoMode(t)}render(){return s().createElement("div",{className:"scrollable-panel"},s().createElement("div",{className:"panel-form-row"},s().createElement("label",{htmlFor:"message-sound"},s().createElement(n.FormattedMessage,{id:"label_message_sound",defaultMessage:"Message sound:",description:"Label for message sounds toggle"})),s().createElement(R,{name:"sound",id:"message-sound",checked:this.props.messageSounds,onChange:this.handleCheckboxClick})),s().createElement("div",{className:"panel-form-row"},s().createElement("label",{htmlFor:"desktop-alerts"},this.props.desktopAlertsEnabled?s().createElement(n.FormattedMessage,{id:"label_push_notifications",defaultMessage:"Notification alerts:",description:"Label for push notifications switch"}):s().createElement(n.FormattedMessage,{id:"label_push_notifications_disabled",defaultMessage:"Notification alerts (requires HTTPS):",description:"Label for push notifications switch"})),s().createElement(R,{name:"alert",id:"desktop-alerts",checked:this.props.desktopAlerts,onChange:this.props.desktopAlertsEnabled?this.handleCheckboxClick:null})),s().createElement("div",{className:"panel-form-row"},s().createElement("label",{htmlFor:"incognito-mode"},s().createElement(n.FormattedMessage,{id:"label_incognito_mode",defaultMessage:"Incognito mode:",description:"Label for incognito mode toggle"})),s().createElement(R,{name:"incognito",id:"incognito-mode",checked:this.props.incognitoMode,onChange:this.handleCheckboxClick})))}}const Je=(0,n.defineMessages)({delete_account:{id:"delete_account",defaultMessage:"Delete account",description:"Title for delete account warning"},delete_account_warning:{id:"delete_account_arning",defaultMessage:"Are you sure you want to delete your account? It cannot be undone.",description:"Warning message when deleting an account"}});class Qe extends s().Component{constructor(e){super(e);const t=this.props.tinode.getMeTopic();let s=0;t.contacts((e=>{e.acs&&!e.acs.isJoiner()&&s++}));const a=t.getDefaultAccess();this.state={auth:a?a.auth:null,anon:a?a.anon:null,showPermissionEditorFor:void 0,blockedCount:s},this.handlePasswordUpdate=this.handlePasswordUpdate.bind(this),this.handleLaunchPermissionsEditor=this.handleLaunchPermissionsEditor.bind(this),this.handleHidePermissionsEditor=this.handleHidePermissionsEditor.bind(this),this.handlePermissionsChanged=this.handlePermissionsChanged.bind(this),this.handleDeleteAccount=this.handleDeleteAccount.bind(this)}handlePasswordUpdate(e){this.setState({password:e}),this.props.onUpdateAccount(e)}handleLaunchPermissionsEditor(e){this.setState({showPermissionEditorFor:e,editedPermissions:this.state[e]})}handleHidePermissionsEditor(){this.setState({showPermissionEditorFor:void 0})}handlePermissionsChanged(e){let t={};t[this.state.showPermissionEditorFor]=e,this.props.onUpdateAccount(void 0,void 0,t);let s={showPermissionEditorFor:void 0};s[this.state.showPermissionEditorFor]=e,this.setState(s)}handleDeleteAccount(e){e.preventDefault();const{formatMessage:t}=this.props.intl;this.props.onShowAlert(t(Je.delete_account),t(Je.delete_account_warning),(()=>{this.props.onDeleteAccount()}),null,!0,null)}render(){return s().createElement(s().Fragment,null,this.state.showPermissionEditorFor?s().createElement(ie,{mode:this.state.editedPermissions,skip:"O",onSubmit:this.handlePermissionsChanged,onCancel:this.handleHidePermissionsEditor}):s().createElement("div",{className:"scrollable-panel"},s().createElement("div",{className:"panel-form-column"},s().createElement("label",{className:"small"},s().createElement(n.FormattedMessage,{id:"label_password",defaultMessage:"Password",description:"Label for password editing"})),s().createElement("div",null,s().createElement(n.FormattedMessage,{id:"password_unchanged_prompt",defaultMessage:"Unchanged",description:"Message in editor while password is unchanged"},(e=>s().createElement(ee,{placeholder:e,type:"password",onFinished:this.handlePasswordUpdate}))))),s().createElement("div",{className:"hr"}),s().createElement("div",{className:"panel-form-column"},s().createElement("a",{href:"#",className:"red flat-button",onClick:e=>{e.preventDefault(),this.props.onLogout()}},s().createElement("i",{className:"material-icons"},"exit_to_app")," ",s().createElement(n.FormattedMessage,{id:"button_logout",defaultMessage:"Logout",description:"Button [Logout]"})),s().createElement("a",{href:"#",className:"red flat-button",onClick:e=>{this.handleDeleteAccount(e)}},s().createElement("i",{className:"material-icons"},"delete")," ",s().createElement(n.FormattedMessage,{id:"button_delete_account",defaultMessage:"Delete account",description:"Button [Delete account]"}))),s().createElement("div",{className:"hr"}),s().createElement("div",{className:"panel-form-column"},s().createElement("div",null,s().createElement("label",{className:"small"},s().createElement(n.FormattedMessage,{id:"label_default_access_mode",defaultMessage:"Default access mode:",description:"Label for default access mode"}))),s().createElement("div",{className:"quoted"},s().createElement("div",null,"Auth: ",s().createElement("tt",{className:"clickable",onClick:this.handleLaunchPermissionsEditor.bind(this,"auth")},this.state.auth)),s().createElement("div",null,"Anon: ",s().createElement("tt",{className:"clickable",onClick:this.handleLaunchPermissionsEditor.bind(this,"anon")},this.state.anon)))),this.state.blockedCount>0?s().createElement(s().Fragment,null,s().createElement("div",{className:"hr"}),s().createElement("div",{className:"panel-form-row"},s().createElement("i",{className:"material-icons"},"block")," ",s().createElement("a",{href:"#",className:"gray",onClick:e=>{e.preventDefault(),this.props.onShowBlocked()}},s().createElement(n.FormattedMessage,{id:"blocked_contacts_link",defaultMessage:"Blocked contacts ({count})",values:{count:this.state.blockedCount},description:"Blocked contacts link"})))):null))}}var Ye=(0,n.injectIntl)(Qe);class Ze extends s().PureComponent{render(){return s().createElement("div",{className:"scrollable-panel"},s().createElement("div",{className:"panel-form-column"},s().createElement("a",{href:"email:info@tinode.co",className:"flat-button",target:"_blank"},s().createElement("i",{className:"material-icons"},"email")," ",s().createElement(n.FormattedMessage,{id:"link_contact_us",defaultMessage:"Contact Us",description:"Ancor text for contacting us by email"})),s().createElement("a",{href:"https://tinode.co/terms.html",className:"flat-button",target:"_blank"},s().createElement("i",{className:"material-icons"},"description")," ",s().createElement(n.FormattedMessage,{id:"link_terms_of_service",defaultMessage:"Terms of Service",description:"Ancor text for terms of service link"})),s().createElement("a",{href:"https://tinode.co/privacy.html",className:"flat-button",target:"_blank"},s().createElement("i",{className:"material-icons"},"policy")," ",s().createElement(n.FormattedMessage,{id:"link_privacy_policy",defaultMessage:"Privacy Policy",description:"Ancor text for privacy policy link"}))),s().createElement("div",{className:"hr"}),s().createElement("div",{className:"panel-form-column"},s().createElement("div",{className:"panel-form-row"},s().createElement("label",{className:"small"},s().createElement(n.FormattedMessage,{id:"label_client"})),h),s().createElement("div",{className:"panel-form-row"},s().createElement("label",{className:"small"},s().createElement(n.FormattedMessage,{id:"label_sdk",defaultMessage:"SDK:"})),c().getLibrary()),s().createElement("div",{className:"panel-form-row"},s().createElement("label",{className:"small"},s().createElement(n.FormattedMessage,{id:"label_server"})),this.props.serverVersion),s().createElement("div",{className:"panel-form-row"},s().createElement("label",{className:"small"},s().createElement(n.FormattedMessage,{id:"label_server_address",defaultMessage:"Server address:"})),this.props.serverAddress)))}}class Xe extends s().Component{constructor(e){super(e),this.state={login:e.login,password:"",hostName:e.serverAddress,saveToken:He.getObject("keep-logged-in")},this.handleLoginChange=this.handleLoginChange.bind(this),this.handlePasswordChange=this.handlePasswordChange.bind(this),this.handleToggleSaveToken=this.handleToggleSaveToken.bind(this),this.handleSubmit=this.handleSubmit.bind(this)}handleLoginChange(e){this.setState({login:e.target.value})}handlePasswordChange(e){this.setState({password:e.target.value})}handleToggleSaveToken(){He.setObject("keep-logged-in",!this.state.saveToken),this.setState({saveToken:!this.state.saveToken})}handleSubmit(e){e.preventDefault(),this.props.onLogin(this.state.login.trim(),this.state.password.trim())}render(){var e="blue";return this.props.disabled&&(e+=" disabled"),s().createElement("form",{id:"login-form",onSubmit:this.handleSubmit},s().createElement(n.FormattedMessage,{id:"login_prompt",defaultMessage:"Login",description:"Login placeholder in LoginView"},(e=>s().createElement("input",{type:"text",id:"inputLogin",placeholder:e,autoComplete:"username",autoCorrect:"off",autoCapitalize:"none",value:this.state.login,onChange:this.handleLoginChange,required:!0,autoFocus:!0}))),s().createElement(n.FormattedMessage,{id:"password_prompt",defaultMessage:"Password",description:"Password placeholder in LoginView"},(e=>s().createElement($,{type:"password",id:"inputPassword",placeholder:e,autoComplete:"current-password",value:this.state.password,onChange:this.handlePasswordChange,required:!0}))),s().createElement("div",{className:"panel-form-row"},s().createElement(R,{id:"save-token",name:"save-token",checked:this.state.saveToken,onChange:this.handleToggleSaveToken}),s().createElement("label",{htmlFor:"save-token"}," ",s().createElement(n.FormattedMessage,{id:"stay_logged_in",defaultMessage:"Stay logged in",description:"Label for a checkbox"})),s().createElement("a",{href:"#reset"},s().createElement(n.FormattedMessage,{id:"forgot_password_link",defaultMessage:"Forgot password?",description:"Link to Reset password form"}))),s().createElement("div",{className:"dialog-buttons"},s().createElement("button",{className:e,type:"submit"},s().createElement(n.FormattedMessage,{id:"button_sign_in",defaultMessage:"Sign in",description:"Button [Sign In]"}))))}}const $e=(0,n.defineMessages)({invalid_id:{id:"error_invalid_id",defaultMessage:"Invalid ID",description:"Error message"}});class et extends s().PureComponent{constructor(e){super(e),this.state={groupId:""},this.handleChange=this.handleChange.bind(this),this.handleKeyPress=this.handleKeyPress.bind(this),this.handleSubmit=this.handleSubmit.bind(this)}handleChange(e){this.setState({groupId:e.target.value})}handleKeyPress(e){"Enter"===e.key&&this.handleSubmit(e)}handleSubmit(e){if(e.preventDefault(),this.state.groupId){var t=this.state.groupId.trim();t.length>3&&("usr"==t.substr(0,3)||"grp"==t.substr(0,3))?this.props.onSubmit(t):this.props.onError(this.props.intl.formatMessage($e.invalid_id),"err")}}render(){return s().createElement("div",{className:"panel-form"},s().createElement("div",{className:"panel-form-row"},s().createElement(n.FormattedMessage,{id:"group_user_id_prompt",defaultMessage:"Group or User ID",description:"Prompt for entering user or group ID"},(e=>s().createElement("input",{type:"text",placeholder:e,value:this.state.groupId,onChange:this.handleChange,onKeyPress:this.handleKeyPress,required:!0,autoFocus:!0})))),s().createElement("div",{className:"dialog-buttons"},s().createElement("button",{className:"blue",onClick:this.handleSubmit},s().createElement(n.FormattedMessage,{id:"button_subscribe",defaultMessage:"Subscribe",description:"Button [Subscribe]"}))))}}var tt=(0,n.injectIntl)(et);class st extends s().PureComponent{constructor(e){super(e),this.state={fn:"",private:"",imageDataUrl:null,tags:[],isChannel:!1},this.handleFnChange=this.handleFnChange.bind(this),this.handlePrivateChange=this.handlePrivateChange.bind(this),this.handleImageChanged=this.handleImageChanged.bind(this),this.handleTagsChanged=this.handleTagsChanged.bind(this),this.handleChannelToggle=this.handleChannelToggle.bind(this),this.handleSubmit=this.handleSubmit.bind(this)}handleFnChange(e){this.setState({fn:e.target.value})}handlePrivateChange(e){this.setState({private:e.target.value})}handleImageChanged(e){this.setState({imageDataUrl:e})}handleTagsChanged(e){this.setState({tags:e})}handleChannelToggle(){this.setState({isChannel:!this.state.isChannel})}handleSubmit(e){e.preventDefault();const t=this.state.fn.trim().substring(0,w),s=this.state.private.trim().substring(0,w);t&&this.props.onSubmit(t,this.state.imageDataUrl,s,this.state.tags,this.state.isChannel)}render(){var e="blue";return this.props.disabled&&(e+=" disabled"),s().createElement("form",{className:"panel-form",onSubmit:this.handleSubmit},s().createElement("div",{className:"panel-form-row"},s().createElement("div",{className:"panel-form-column"},s().createElement("label",{className:"small",htmlFor:"new-topic-fn"},s().createElement(n.FormattedMessage,{id:"label_topic_name"})),s().createElement(n.FormattedMessage,{id:"topic_name_editing_placeholder",defaultMessage:"Freeform name of the group",description:"Prompt for entering topic name"},(e=>s().createElement("input",{type:"text",id:"new-topic-fn",placeholder:e,value:this.state.fn,onChange:this.handleFnChange,autoFocus:!0,required:!0}))),s().createElement("br",null),s().createElement("label",{className:"small",htmlFor:"new-topic-priv"},s().createElement(n.FormattedMessage,{id:"label_private"})),s().createElement(n.FormattedMessage,{id:"private_editing_placeholder"},(e=>s().createElement("input",{type:"text",id:"new-topic-priv",placeholder:e,value:this.state.private,onChange:this.handlePrivateChange})))),s().createElement(x,{onError:this.props.onError,onImageChanged:this.handleImageChanged})),s().createElement("div",{className:"panel-form-row"},s().createElement(R,{checked:this.state.isChannel,onChange:this.handleChannelToggle})," ",s().createElement("label",{onClick:this.handleChannelToggle},s().createElement(n.FormattedMessage,{id:"channel_prompt",defaultMessage:"This is a channel",description:"Checkbox label when creating a channel"}))),s().createElement(n.FormattedMessage,{id:"title_tag_manager"},(e=>s().createElement(ce,{tags:this.state.tags,activated:!0,onTagsChanged:this.handleTagsChanged,tinode:this.props.tinode,title:e}))),s().createElement("div",{className:"dialog-buttons"},s().createElement("button",{className:e},s().createElement(n.FormattedMessage,{id:"button_create",defaultMessage:"Create",description:"Button [Create]"}))))}}class at extends s().PureComponent{constructor(e){super(e),this.state={edited:!1,search:""},this.handleSearchChange=this.handleSearchChange.bind(this),this.handleSearch=this.handleSearch.bind(this),this.handleClear=this.handleClear.bind(this),this.handleKeyDown=this.handleKeyDown.bind(this)}componentWillUnmount(){this.state.edited&&(this.setState({search:"",edited:!1}),this.props.onSearchContacts(c().DEL_CHAR))}handleSearchChange(e){this.setState({search:e.target.value})}handleSearch(e){e.preventDefault();var t=this.state.search.trim();this.setState({edited:t.length>0}),this.props.onSearchContacts(t.length>0?t:c().DEL_CHAR)}handleClear(e){e.preventDefault(),this.state.edited&&this.props.onSearchContacts(c().DEL_CHAR),this.setState({search:"",edited:!1})}handleKeyDown(e){"Enter"===e.key?this.handleSearch(e):"Escape"===e.key&&this.handleClear()}render(){return s().createElement("div",{className:"panel-form"},s().createElement("div",{className:"panel-form-row"},s().createElement("i",{className:"material-icons search"},"search"),s().createElement(n.FormattedMessage,{id:"search_placeholder",defaultMessage:"List like email:alice@example.com, tel:17025550003...",description:"Placeholder in contacts search field"},(e=>s().createElement("input",{className:"search",type:"text",placeholder:e,value:this.state.search,onChange:this.handleSearchChange,onKeyDown:this.handleKeyDown,required:!0,autoFocus:!0}))),s().createElement("a",{href:"#",onClick:this.handleClear},s().createElement("i",{className:"material-icons"},"close"))))}}const it=(0,n.defineMessages)({search_for_contacts:{id:"search_for_contacts",defaultMessage:"Use search to find contacts",description:"Text shown in contacts view when user entered no search query."},search_no_results:{id:"search_no_results",defaultMessage:"Search returned no results",description:"Text shown in contacts view when query returned no results."}});class nt extends s().Component{constructor(e){super(e),this.state={tabSelected:"p2p",searchQuery:null},this.handleTabClick=this.handleTabClick.bind(this),this.handleSearchContacts=this.handleSearchContacts.bind(this),this.handleContactSelected=this.handleContactSelected.bind(this),this.handleNewGroupSubmit=this.handleNewGroupSubmit.bind(this),this.handleGroupByID=this.handleGroupByID.bind(this)}componentDidMount(){this.props.onInitFind()}handleTabClick(e){e.preventDefault(),Pe.navigateTo(Pe.addUrlParam(window.location.hash,"tab",e.currentTarget.dataset.id)),this.setState({tabSelected:e.currentTarget.dataset.id})}handleSearchContacts(e){this.props.onSearchContacts(e),this.setState({searchQuery:c().isNullValue(e)?null:e})}handleContactSelected(e){"p2p"===this.state.tabSelected&&(Pe.navigateTo(Pe.removeUrlParam(window.location.hash,"tab")),this.props.onCreateTopic(e))}handleNewGroupSubmit(e,t,s,a,i){Pe.navigateTo(Pe.removeUrlParam(window.location.hash,"tab")),this.props.onCreateTopic(void 0,oe(e,t),s,a,i)}handleGroupByID(e){Pe.navigateTo(Pe.removeUrlParam(window.location.hash,"tab")),this.props.onCreateTopic(e)}render(){const{formatMessage:e}=this.props.intl,t=e(this.state.searchQuery?it.search_no_results:it.search_for_contacts);return s().createElement("div",{className:"flex-column"},s().createElement("ul",{className:"tabbar"},s().createElement("li",{className:"p2p"===this.state.tabSelected?"active":null},s().createElement("a",{href:"#","data-id":"p2p",onClick:this.handleTabClick},s().createElement(n.FormattedMessage,{id:"tabtitle_find_user",defaultMessage:"find",description:"Tab title Find"}))),s().createElement("li",{className:"grp"===this.state.tabSelected?"active":null},s().createElement("a",{href:"#","data-id":"grp",onClick:this.handleTabClick},s().createElement(n.FormattedMessage,{id:"tabtitle_new_group",defaultMessage:"new group",description:"Tab title New Group"}))),s().createElement("li",{className:"byid"===this.state.tabSelected?"active":null},s().createElement("a",{href:"#","data-id":"byid",onClick:this.handleTabClick},s().createElement(n.FormattedMessage,{id:"tabtitle_group_by_id",defaultMessage:"by id",description:"Tab title Find topic by ID"})))),"grp"===this.state.tabSelected?s().createElement(st,{tinode:this.props.tinode,onSubmit:this.handleNewGroupSubmit}):"byid"===this.state.tabSelected?s().createElement(tt,{onSubmit:this.handleGroupByID,onError:this.props.onError}):s().createElement("div",{className:"flex-column"},s().createElement(at,{type:"p2p",onSearchContacts:this.handleSearchContacts}),s().createElement(K,{contacts:this.props.searchResults,myUserId:this.props.myUserId,emptyListMessage:t,showOnline:!1,showUnread:!1,showContextMenu:!1,onTopicSelected:this.handleContactSelected})))}}var ot=(0,n.injectIntl)(nt);class rt extends s().PureComponent{constructor(e){super(e),this.state={email:"",password:""},this.handleSubmit=this.handleSubmit.bind(this),this.handleEmailChange=this.handleEmailChange.bind(this),this.handlePasswordChange=this.handlePasswordChange.bind(this)}componentDidMount(){let e=Pe.parseUrlHash(window.location.hash);this.setState({token:e.params.token,scheme:e.params.scheme})}handleSubmit(e){e.preventDefault(),this.state.token?this.props.onReset(this.state.scheme,this.state.password.trim(),this.state.token):this.props.onRequest("email",this.state.email.trim())}handleEmailChange(e){this.setState({email:e.target.value})}handlePasswordChange(e){this.setState({password:e.target.value})}render(){let e=this.state.token&&this.state.scheme;return s().createElement("form",{id:"password-reset-form",onSubmit:this.handleSubmit},e?s().createElement(n.FormattedMessage,{id:"new_password_placeholder",defaultMessage:"Enter new password",description:"Placeholder for entering new password"},(e=>s().createElement($,{placeholder:e,autoComplete:"new-password",value:this.state.password,required:!0,autoFocus:!0,onChange:this.handlePasswordChange}))):s().createElement(s().Fragment,null,s().createElement("label",{htmlFor:"inputEmail"},s().createElement(n.FormattedMessage,{id:"label_reset_password",defaultMessage:"Send a password reset email:",description:"Label for password reset field"})),s().createElement(n.FormattedMessage,{id:"credential_email_prompt",defaultMessage:"Your registration email",description:"Placeholder for entering email"},(e=>s().createElement("input",{type:"email",id:"inputEmail",placeholder:e,autoComplete:"email",value:this.state.email,onChange:this.handleEmailChange,required:!0,autoFocus:!0})))),s().createElement("div",{className:"dialog-buttons"},s().createElement("button",{className:"blue",type:"submit"},e?s().createElement(n.FormattedMessage,{id:"button_reset",defaultMessage:"Reset",description:"Button [Reset]"}):s().createElement(n.FormattedMessage,{id:"button_send_request",defaultMessage:"Send request",description:"Button [Send request]"}))))}}class lt extends s().PureComponent{constructor(e){super(e),this.state={hostName:e.serverAddress,changed:!1},this.handleHostNameChange=this.handleHostNameChange.bind(this),this.handleEditingFinished=this.handleEditingFinished.bind(this)}handleHostNameChange(e){this.setState({hostName:e.target.value,changed:!0})}handleEditingFinished(){this.state.changed&&(this.setState({changed:!1}),this.props.onServerAddressChange(this.state.hostName.trim()))}render(){var e=[];for(let t in p){let a=p[t];e.push(s().createElement("option",{key:a,value:a}))}return s().createElement("div",{className:"panel-form-row"},s().createElement("input",{type:"search",id:"host-name",placeholder:this.props.hostName,list:"known-hosts",className:"quoted",value:this.state.hostName,onChange:this.handleHostNameChange,onBlur:this.handleEditingFinished,required:!0}),s().createElement("datalist",{id:"known-hosts"},e))}}class ct extends s().PureComponent{constructor(e){super(e),this.state={transport:e.transport||"def",serverAddress:e.serverAddress},this.handleSubmit=this.handleSubmit.bind(this),this.handleTransportSelected=this.handleTransportSelected.bind(this),this.handleServerAddressChange=this.handleServerAddressChange.bind(this)}handleSubmit(e){e.preventDefault(),this.props.onUpdate({transport:this.state.transport,serverAddress:this.state.serverAddress})}handleTransportSelected(e){this.setState({transport:e.currentTarget.value})}handleServerAddressChange(e){this.setState({serverAddress:e})}render(){const e={def:"default",ws:"websocket",lp:"long polling"};var t=[],a=this;return["def","ws","lp"].map((function(i){var n="transport-"+i,o=e[i];t.push(s().createElement("li",{key:i},s().createElement("input",{type:"radio",id:n,name:"transport-select",value:i,checked:a.state.transport===i,onChange:a.handleTransportSelected}),s().createElement("label",{htmlFor:n},o)))})),s().createElement("form",{id:"settings-form",className:"panel-form",onSubmit:this.handleSubmit},s().createElement("div",{className:"panel-form-row"},s().createElement("label",{className:"small"},s().createElement(n.FormattedMessage,{id:"label_server_to_use",defaultMessage:"Server to use:",description:"Label for server selector in SettingsView"}))),s().createElement(lt,{serverAddress:this.state.serverAddress,onServerAddressChange:this.handleServerAddressChange}),s().createElement("div",{className:"panel-form-row"},s().createElement("label",{className:"small"},s().createElement(n.FormattedMessage,{id:"label_wire_transport",defaultMessage:"Wire transport:",description:"Label for wire transport selection in SettingsView"}))),s().createElement("div",{className:"panel-form-row"},s().createElement("ul",{className:"quoted"},t)),s().createElement("div",{className:"dialog-buttons"},s().createElement("button",{type:"submit",className:"blue"},s().createElement(n.FormattedMessage,{id:"button_update",defaultMessage:"Update",description:"Button [Update]"}))))}}const dt=(0,n.defineMessages)({phone:{id:"phone_dative",defaultMessage:"phone",description:"Dative case of 'phone', i.e. 'phone' in 'by phone'"},email:{id:"email_dative",defaultMessage:"email",description:"Dative case of 'email', i.e. 'email' in 'by email'"}});class ht extends s().PureComponent{constructor(e){super(e),this.state={code:e.credCode||""},this.handleChange=this.handleChange.bind(this),this.handleKeyPress=this.handleKeyPress.bind(this),this.handleSubmit=this.handleSubmit.bind(this),this.handleCancel=this.handleCancel.bind(this)}handleChange(e){this.setState({code:e.target.value})}handleKeyPress(e){"Enter"===e.key?this.handleSubmit(e):"Escape"==e.key&&this.handleCancel(e)}handleSubmit(e){e.preventDefault(),this.state.code&&this.state.code.trim()&&this.props.onSubmit(this.props.credMethod,this.state.code.trim())}handleCancel(e){e.preventDefault(),this.props.onCancel()}render(){const{formatMessage:e}=this.props.intl;let t={email:e(dt.email),tel:e(dt.phone)}[this.props.credMethod]||this.props.credMethod;return s().createElement("div",{className:"panel-form"},s().createElement("div",{className:"panel-form-row"},s().createElement("label",{className:"small",htmlFor:"enter-confirmation-code"},s().createElement(n.FormattedMessage,{id:"enter_confirmation_code_prompt",defaultMessage:"Enter confirmation code sent to you by {method}:",description:"Request to enter confirmation code",values:{method:t}}))),s().createElement("div",{className:"panel-form-row"},s().createElement(n.FormattedMessage,{id:"numeric_confirmation_code_prompt",defaultMessage:"Numbers only",description:"Prompt for numeric conformation code"},(e=>s().createElement("input",{type:"text",id:"enter-confirmation-code",placeholder:e,value:this.state.code,onChange:this.handleChange,onKeyPress:this.handleKeyPress,required:!0})))),s().createElement("div",{className:"dialog-buttons"},s().createElement("button",{className:"blue",onClick:this.handleSubmit},s().createElement(n.FormattedMessage,{id:"button_confirm",defaultMessage:"Confirm",description:"Button [Confirm]"})),s().createElement("button",{className:"white",onClick:this.handleCancel},s().createElement(n.FormattedMessage,{id:"button_cancel"}))))}}var pt=(0,n.injectIntl)(ht);const mt=(0,n.defineMessages)({login:{id:"sidepanel_title_login",description:"Sidepanel title for LoginView.",defaultMessage:"Sign In"},register:{id:"sidepanel_title_register",description:"Sidepanel title for CreateAccountView.",defaultMessage:"Create Account"},settings:{id:"sidepanel_title_settings",description:"Sidepanel title for SettingsView.",defaultMessage:"Settings"},edit:{id:"sidepanel_title_account_settings",description:"Sidepanel title for EditAccountView.",defaultMessage:"Account Settings"},general:{id:"sidepanel_title_acc_general",description:"Sidepanel title for AccGeneralView.",defaultMessage:"General"},security:{id:"sidepanel_title_acc_security",description:"Sidepanel title for AccSecurityView.",defaultMessage:"Security"},notif:{id:"sidepanel_title_acc_notifications",description:"Sidepanel title for AccNotificationsView.",defaultMessage:"Notifications"},support:{id:"sidepanel_title_acc_support",description:"Sidepanel title for AccSupportView.",defaultMessage:"Support"},newtpk:{id:"sidepanel_title_newtpk",description:"Sidepanel title for NewTopicView.",defaultMessage:"Start New Chat"},cred:{id:"sidepanel_title_cred",description:"Sidepanel title for ValidationView.",defaultMessage:"Confirm Credentials"},reset:{id:"sidepanel_title_reset",description:"Sidepanel title for PasswordResetView.",defaultMessage:"Reset Password"},archive:{id:"sidepanel_title_archive",description:"Sidepanel title for ContactsView-Archive.",defaultMessage:"Archived Chats"},blocked:{id:"sidepanel_title_blocked",description:"Sidepanel title for ContactsView-Blocked.",defaultMessage:"Blocked Chats"}});class ut extends s().Component{constructor(e){super(e),this.handleLoginRequested=this.handleLoginRequested.bind(this),this.handleNewTopic=this.handleNewTopic.bind(this)}handleLoginRequested(e,t){this.props.onLoginRequest(e,t)}handleNewTopic(){this.props.onBasicNavigate("newtpk")}render(){const{formatMessage:e}=this.props.intl,t=this.props.state||(this.props.myUserId?"contacts":"login");let a,i,n;return"contacts"==t?(a=this.props.title,i=!this.props.avatar||this.props.avatar):(a=e(mt[t]),i=!1),-1==["login","contacts"].indexOf(t)&&(n=this.props.onCancel),s().createElement("div",{id:"sidepanel",className:this.props.hideSelf?"nodisplay":null},s().createElement(ze,{state:t,title:a,avatar:i,myUserId:this.props.myUserId,onSignUp:this.props.onSignUp,onSettings:this.props.onSettings,onNewTopic:this.handleNewTopic,onCancel:n}),s().createElement(G,{level:this.props.errorLevel,text:this.props.errorText,action:this.props.errorAction,actionText:this.props.errorActionText,onClearError:this.props.onError}),s().createElement(Te,{show:this.props.loadSpinnerVisible}),"login"===t?s().createElement(Xe,{login:this.props.login,disabled:this.props.loginDisabled,onLogin:this.handleLoginRequested}):"register"===t?s().createElement(Ve,{onCreateAccount:this.props.onCreateAccount,onCancel:this.props.onCancel,onError:this.props.onError}):"settings"===t?s().createElement(ct,{transport:this.props.transport,serverAddress:this.props.serverAddress,onCancel:this.props.onCancel,onUpdate:this.props.onGlobalSettings}):"edit"===t?s().createElement(Ke,{tinode:this.props.tinode,myUserId:this.props.myUserId,onBasicNavigate:this.props.onBasicNavigate}):"general"===t?s().createElement(We,{tinode:this.props.tinode,myUserId:this.props.myUserId,onUpdateAccount:this.props.onUpdateAccount,onUpdateTags:this.props.onUpdateAccountTags,onCredAdd:this.props.onCredAdd,onCredDelete:this.props.onCredDelete,onCredConfirm:this.props.onCredConfirm,onBasicNavigate:this.props.onBasicNavigate,onError:this.props.onError}):"notif"===t?s().createElement(Ge,{messageSounds:this.props.messageSounds,desktopAlerts:this.props.desktopAlerts,desktopAlertsEnabled:this.props.desktopAlertsEnabled,incognitoMode:this.props.incognitoMode,onTogglePushNotifications:this.props.onTogglePushNotifications,onToggleMessageSounds:this.props.onToggleMessageSounds,onToggleIncognitoMode:this.props.onToggleIncognitoMode}):"security"===t?s().createElement(Ye,{tinode:this.props.tinode,onUpdateAccount:this.props.onUpdateAccount,onLogout:this.props.onLogout,onDeleteAccount:this.props.onDeleteAccount,onShowAlert:this.props.onShowAlert,onShowBlocked:this.props.onShowBlocked}):"support"===t?s().createElement(Ze,{serverAddress:this.props.serverAddress,serverVersion:this.props.serverVersion}):"contacts"===t||"archive"==t||"blocked"==t?s().createElement(je,{tinode:this.props.tinode,myUserId:this.props.myUserId,connected:this.props.connected,topicSelected:this.props.topicSelected,archive:"archive"==t,blocked:"blocked"==t,chatList:this.props.chatList,showContextMenu:this.props.showContextMenu,onTopicSelected:this.props.onTopicSelected,onShowArchive:this.props.onShowArchive}):"newtpk"===t?s().createElement(ot,{tinode:this.props.tinode,searchResults:this.props.searchResults,onInitFind:this.props.onInitFind,onSearchContacts:this.props.onSearchContacts,onCreateTopic:this.props.onCreateTopic,onError:this.props.onError}):"cred"===t?s().createElement(pt,{credCode:this.props.credCode,credMethod:this.props.credMethod,onSubmit:this.props.onValidateCredentials,onCancel:this.props.onCancel,onError:this.props.onError}):"reset"===t?s().createElement(rt,{onRequest:this.props.onPasswordResetRequest,onReset:this.props.onResetPassword}):null)}}var _t=(0,n.injectIntl)(ut);function gt(){let e=m;return"object"==typeof window.location&&("file:"==window.location.protocol||"localhost"==window.location.hostname?e=p.local:window.location.hostname&&(e=window.location.hostname+(window.location.port?":"+window.location.port:""))),e}function bt(){return"object"==typeof window.location&&"https:"==window.location.protocol}const vt=new Audio("audio/msg.mp3"),ft=(0,n.defineMessages)({reconnect_countdown:{id:"reconnect_countdown",defaultMessage:"Disconnected. Reconnecting in {seconds}…",description:"Message shown when an app update is available."},reconnect_now:{id:"reconnect_now",defaultMessage:"Try now",description:"Prompt for reconnecting now"},push_init_failed:{id:"push_init_failed",defaultMessage:"Failed to initialize push notifications",description:"Error message when push notifications have failed to initialize."},invalid_security_token:{id:"invalid_security_token",defaultMessage:"Invalid security token",description:"Error message when resetting password."},no_connection:{id:"no_connection",defaultMessage:"No connection",description:"Warning that the user is offline."},code_doesnot_match:{id:"code_doesnot_match",defaultMessage:"Code does not match",description:"Error message when the credential validation code is incorrect."}});class Et extends s().Component{constructor(e){super(e),this.state=this.getBlankState(),this.handleResize=this.handleResize.bind(this),this.handleHashRoute=this.handleHashRoute.bind(this),this.handleOnline=this.handleOnline.bind(this),this.checkForAppUpdate=this.checkForAppUpdate.bind(this),this.handleVisibilityEvent=this.handleVisibilityEvent.bind(this),this.handleError=this.handleError.bind(this),this.handleLoginRequest=this.handleLoginRequest.bind(this),this.handleConnected=this.handleConnected.bind(this),this.handleAutoreconnectIteration=this.handleAutoreconnectIteration.bind(this),this.doLogin=this.doLogin.bind(this),this.handleCredentialsRequest=this.handleCredentialsRequest.bind(this),this.handleLoginSuccessful=this.handleLoginSuccessful.bind(this),this.handleDisconnect=this.handleDisconnect.bind(this),this.tnMeMetaDesc=this.tnMeMetaDesc.bind(this),this.tnMeContactUpdate=this.tnMeContactUpdate.bind(this),this.tnMeSubsUpdated=this.tnMeSubsUpdated.bind(this),this.resetContactList=this.resetContactList.bind(this),this.tnData=this.tnData.bind(this),this.tnInitFind=this.tnInitFind.bind(this),this.tnFndSubsUpdated=this.tnFndSubsUpdated.bind(this),this.handleSearchContacts=this.handleSearchContacts.bind(this),this.handleTopicSelected=this.handleTopicSelected.bind(this),this.handleHideMessagesView=this.handleHideMessagesView.bind(this),this.handleSendMessage=this.handleSendMessage.bind(this),this.handleNewChatInvitation=this.handleNewChatInvitation.bind(this),this.handleNewAccount=this.handleNewAccount.bind(this),this.handleNewAccountRequest=this.handleNewAccountRequest.bind(this),this.handleUpdateAccountRequest=this.handleUpdateAccountRequest.bind(this),this.handleUpdateAccountTagsRequest=this.handleUpdateAccountTagsRequest.bind(this),this.handleToggleIncognitoMode=this.handleToggleIncognitoMode.bind(this),this.handleSettings=this.handleSettings.bind(this),this.handleGlobalSettings=this.handleGlobalSettings.bind(this),this.handleShowArchive=this.handleShowArchive.bind(this),this.handleShowBlocked=this.handleShowBlocked.bind(this),this.handleToggleMessageSounds=this.handleToggleMessageSounds.bind(this),this.handleCredAdd=this.handleCredAdd.bind(this),this.handleCredDelete=this.handleCredDelete.bind(this),this.handleCredConfirm=this.handleCredConfirm.bind(this),this.initDesktopAlerts=this.initDesktopAlerts.bind(this),this.togglePushToken=this.togglePushToken.bind(this),this.requestPushToken=this.requestPushToken.bind(this),this.handleSidepanelCancel=this.handleSidepanelCancel.bind(this),this.handleStartTopicRequest=this.handleStartTopicRequest.bind(this),this.handleNewTopicCreated=this.handleNewTopicCreated.bind(this),this.handleTopicUpdateRequest=this.handleTopicUpdateRequest.bind(this),this.handleChangePermissions=this.handleChangePermissions.bind(this),this.handleTagsUpdated=this.handleTagsUpdated.bind(this),this.handleLogout=this.handleLogout.bind(this),this.handleDeleteAccount=this.handleDeleteAccount.bind(this),this.handleDeleteMessagesRequest=this.handleDeleteMessagesRequest.bind(this),this.handleLeaveUnsubRequest=this.handleLeaveUnsubRequest.bind(this),this.handleBlockTopicRequest=this.handleBlockTopicRequest.bind(this),this.handleReportTopic=this.handleReportTopic.bind(this),this.handleShowContextMenu=this.handleShowContextMenu.bind(this),this.defaultTopicContextMenu=this.defaultTopicContextMenu.bind(this),this.handleHideContextMenu=this.handleHideContextMenu.bind(this),this.handleShowAlert=this.handleShowAlert.bind(this),this.handleShowInfoView=this.handleShowInfoView.bind(this),this.handleHideInfoView=this.handleHideInfoView.bind(this),this.handleMemberUpdateRequest=this.handleMemberUpdateRequest.bind(this),this.handleValidateCredentialsRequest=this.handleValidateCredentialsRequest.bind(this),this.handlePasswordResetRequest=this.handlePasswordResetRequest.bind(this),this.handleResetPassword=this.handleResetPassword.bind(this),this.handleContextMenuAction=this.handleContextMenuAction.bind(this)}getBlankState(){const e=He.getObject("settings")||{};return{connected:!1,ready:!1,autoLogin:!1,transport:e.transport||null,serverAddress:e.serverAddress||gt(),serverVersion:"no connection",messageSounds:!e.messageSoundsOff,incognitoMode:!1,desktopAlerts:e.desktopAlerts,desktopAlertsEnabled:(bt()||"object"==typeof window.location&&"localhost"==window.location.hostname)&&void 0!==r&&"undefined"!=typeof navigator&&"undefined"!=typeof FIREBASE_INIT,firebaseToken:He.getObject("firebase-token"),applicationVisible:!document.hidden,errorText:"",errorLevel:null,errorAction:void 0,errorActionText:null,sidePanelSelected:"login",sidePanelTitle:null,sidePanelAvatar:null,loadSpinnerVisible:!1,login:"",password:"",myUserId:null,liveConnection:navigator.onLine,topicSelected:"",topicSelectedOnline:!1,topicSelectedAcs:null,newTopicParams:null,loginDisabled:!1,displayMobile:window.innerWidth<=640,showInfoPanel:!1,mobilePanel:"sidepanel",contextMenuVisible:!1,contextMenuBounds:null,contextMenuClickAt:null,contextMenuParams:null,contextMenuItems:[],alertVisible:!1,alertParams:{},chatList:[],searchResults:[],searchableContacts:[],credMethod:void 0,credCode:void 0}}componentDidMount(){window.addEventListener("resize",this.handleResize),window.addEventListener("online",(e=>{this.handleOnline(!0)})),window.addEventListener("offline",(e=>{this.handleOnline(!1)})),window.addEventListener("hashchange",this.handleHashRoute),document.addEventListener("visibilitychange",this.handleVisibilityEvent),this.setState({viewportWidth:document.documentElement.clientWidth,viewportHeight:document.documentElement.clientHeight});const{formatMessage:e,locale:t}=this.props.intl;if(this.tinode=Et.tnSetup(this.state.serverAddress,this.state.transport,t),this.tinode.onConnect=this.handleConnected,this.tinode.onDisconnect=this.handleDisconnect,this.tinode.onAutoreconnectIteration=this.handleAutoreconnectIteration,this.state.desktopAlertsEnabled)try{this.fbPush=r.initializeApp(FIREBASE_INIT,h).messaging(),this.fbPush.usePublicVapidKey(FIREBASE_INIT.messagingVapidKey),navigator.serviceWorker.register("/service-worker.js").then((e=>{this.checkForAppUpdate(e),this.fbPush.useServiceWorker(e),e.active.postMessage(JSON.stringify({locale:t})),this.initDesktopAlerts(),this.state.desktopAlerts&&(this.state.firebaseToken?this.tinode.setDeviceToken(this.state.firebaseToken,!0):this.togglePushToken(!0))})).catch((e=>{console.log("Failed to register service worker:",e)}))}catch(t){this.handleError(e({id:"push_init_failed"}),"err"),console.log("Failed to initialize push notifications",t),this.setState({desktopAlertsEnabled:!1})}const s=He.getObject("keep-logged-in")?He.getObject("auth-token"):void 0,a=Pe.parseUrlHash(window.location.hash);s?(this.setState({autoLogin:!0}),s.expires=new Date(s.expires),this.tinode.setAuthToken(s),this.tinode.connect().catch((e=>{this.handleError(e.message,"err")})),delete a.params.info,delete a.params.tab,a.path[0]="",Pe.navigateTo(Pe.composeUrlHash(a.path,a.params))):a.params.token||Pe.navigateTo(""),this.readTimer=null,this.readTimerCallback=null,this.handleHashRoute()}componentWillUnmount(){window.removeEventListener("resize",this.handleResize),window.removeEventListener("hashchange",this.handleHashRoute),document.removeEventListener("visibilitychange",this.handleVisibilityEvent)}static tnSetup(e,t,s){const a=new(c())(h,e,"AQEAAAABAAD_rAp4DJh05a1HAwFT3A6K",t,bt());return a.setHumanLanguage(s),a.enableLogging(true,!0),a}handleResize(){const e=document.documentElement.clientWidth<=640;this.setState({viewportWidth:document.documentElement.clientWidth,viewportHeight:document.documentElement.clientHeight}),this.state.displayMobile!=e&&this.setState({displayMobile:e})}checkForAppUpdate(e){e.onupdatefound=()=>{const t=e.installing;t.onstatechange=()=>{if("installed"==t.state&&navigator.serviceWorker.controller){const e=s().createElement(s().Fragment,null,s().createElement(n.FormattedMessage,{id:"update_available",defaultMessage:"Update available.",description:"Message shown when an app update is available."})," ",s().createElement("a",{href:""},s().createElement(n.FormattedMessage,{id:"reload_update",defaultMessage:"Reload",description:"Call to action to reload application when update is available."})),".");this.handleError(e,"info")}}}}handleHashRoute(){const e=Pe.parseUrlHash(window.location.hash);e.path&&e.path.length>0?(["register","settings","edit","notif","security","support","general","cred","reset","newtpk","archive","blocked","contacts",""].includes(e.path[0])?this.setState({sidePanelSelected:e.path[0]}):console.log("Unknown sidepanel view",e.path[0]),e.path.length>1&&e.path[1]!=this.state.topicSelected&&this.setState({topicSelected:c().topicType(e.path[1])?e.path[1]:null})):this.setState({sidePanelSelected:""}),e.params.method&&this.setState({credMethod:e.params.method}),e.params.code&&this.setState({credCode:e.params.code}),this.setState({showInfoPanel:e.params.info,newTopicTabSelected:e.params.tab})}handleOnline(e){e?this.handleError():this.handleError(this.props.intl.formatMessage({id:"no_connection"}),"warn"),this.setState({liveConnection:e})}handleVisibilityEvent(){this.setState({applicationVisible:!document.hidden})}handleError(e,t,s,a){this.setState({errorText:e,errorLevel:t,errorAction:s,errorActionText:a})}handleLoginRequest(e,t){this.setState({loginDisabled:!0,login:e,password:t,loadSpinnerVisible:!0,autoLogin:!0}),this.handleError("",null),this.tinode.isConnected()?this.doLogin(e,t,{meth:this.state.credMethod,resp:this.state.credCode}):this.tinode.connect().catch((e=>{this.setState({loginDisabled:!1,autoLogin:!1,loadSpinnerVisible:!1}),this.handleError(e.message,"err")}))}handleConnected(){const e=this.tinode.getServerInfo();this.setState({serverVersion:e.ver+" "+(e.build?e.build:"none")}),this.state.autoLogin&&this.doLogin(this.state.login,this.state.password,{meth:this.state.credMethod,resp:this.state.credCode})}handleAutoreconnectIteration(e,t){if(clearInterval(this.reconnectCountdown),e<0)return void this.handleError();if(t)return void t.then((()=>{this.handleError()})).catch((e=>{this.handleError(e.message,"err")}));const{formatMessage:s}=this.props.intl;let a=e/1e3;a|=a,this.reconnectCountdown=setInterval((()=>{const e=a>99?function(e){const t=Math.floor(e/60);let s=e%60;return s=s<10?"0".concat(s):s,"".concat(t,":").concat(s)}(a):a;this.handleError(s(ft.reconnect_countdown,{seconds:e}),"warn",(()=>{clearInterval(this.reconnectCountdown),this.tinode.reconnect()}),s(ft.reconnect_now)),a-=1}),1e3)}handleDisconnect(e){this.setState({connected:!1,ready:!1,topicSelectedOnline:!1,errorText:e&&e.message?e.message:"Disconnected",errorLevel:e&&e.message?"err":"warn",loginDisabled:!1,contextMenuVisible:!1,serverVersion:"no connection"})}doLogin(e,t,s){if(this.tinode.isAuthenticated())return void Pe.navigateTo("");s=c().credential(s);let a=null;const i=this.tinode.getAuthToken();e&&t?(this.setState({password:null}),a=this.tinode.loginBasic(e,t,s)):i&&(a=this.tinode.loginToken(i.token,s)),a?a.then((e=>{e.code>=300&&"validate credentials"===e.text?(this.setState({loadSpinnerVisible:!1}),s&&this.handleError(this.props.intl.formatMessage({id:"code_doesnot_match"}),"warn"),this.handleCredentialsRequest(e.params)):this.handleLoginSuccessful()})).catch((e=>{this.setState({loginDisabled:!1,credMethod:void 0,credCode:void 0,loadSpinnerVisible:!1,autoLogin:!1}),this.handleError(e.message,"err"),localStorage.removeItem("auth-token"),Pe.navigateTo("")})):(Pe.navigateTo(""),this.setState({loginDisabled:!1}))}handleCredentialsRequest(e){const t=Pe.parseUrlHash(window.location.hash);t.path[0]="cred",t.params.method=e.cred[0],Pe.navigateTo(Pe.composeUrlHash(t.path,t.params))}handleLoginSuccessful(){this.handleError(),He.getObject("keep-logged-in")&&He.setObject("auth-token",this.tinode.getAuthToken());const e=this.tinode.getMeTopic();e.onMetaDesc=this.tnMeMetaDesc,e.onContactUpdate=this.tnMeContactUpdate,e.onSubsUpdated=this.tnMeSubsUpdated,this.setState({connected:!0,credMethod:void 0,credCode:void 0,myUserId:this.tinode.getCurrentUserID(),autoLogin:!0}),e.subscribe(e.startMetaQuery().withLaterSub().withDesc().withTags().withCred().build()).catch((e=>{this.tinode.disconnect(),localStorage.removeItem("auth-token"),this.handleError(e.message,"err"),Pe.navigateTo("")})).finally((()=>{this.setState({loadSpinnerVisible:!1})})),Pe.navigateTo(Pe.setUrlSidePanel(window.location.hash,"contacts"))}tnMeMetaDesc(e){e&&(e.public&&this.setState({sidePanelTitle:e.public.fn,sidePanelAvatar:P(e.public.photo)}),e.acs&&this.setState({incognitoMode:!e.acs.isPresencer()}))}tnMeContactUpdate(e,t){if("on"==e||"off"==e)this.resetContactList(),this.state.topicSelected==t.topic&&this.setState({topicSelectedOnline:"on"==e});else if("read"==e)this.resetContactList();else if("msg"==e){const e=this.tinode.getTopic(t.topic),s=e&&e.isArchived();t.unread>0&&this.state.messageSounds&&!s&&(document.hidden||this.state.topicSelected!=t.topic)&&vt.play(),this.resetContactList()}else"recv"==e||("gone"==e||"unsub"==e?(this.state.topicSelected==t.topic&&this.handleTopicSelected(null),this.resetContactList()):"acs"==e?this.state.topicSelected==t.topic&&this.setState({topicSelectedAcs:t.acs}):"del"==e||"upd"==e||console.log("Unsupported (yet) presence update:"+e+" in: "+t.topic))}tnMeSubsUpdated(e){this.resetContactList()}static prepareSearchableContacts(e,t){const s={};for(const t of e)c().isP2PTopicName(t.topic)&&(s[t.topic]={user:t.topic,updated:t.updated,public:t.public,private:t.private,acs:t.acs});for(const e of t)s[e.user]||(s[e.user]=e);return Object.values(s)}resetContactList(){const e={chatList:[]};this.state.ready||(e.ready=!0),this.tinode.getMeTopic().contacts((t=>{e.chatList.push(t),this.state.topicSelected==t.topic&&(e.topicSelectedOnline=t.online,e.topicSelectedAcs=t.acs)})),e.searchableContacts=Et.prepareSearchableContacts(e.chatList,this.state.searchResults),this.setState(e)}tnData(e){const t=this.tinode.getTopic(e.topic);t.msgStatus(e)>=c().MESSAGE_STATUS_SENT&&e.from!=this.state.myUserId&&(clearTimeout(this.receivedTimer),this.receivedTimer=setTimeout((()=>{this.receivedTimer=void 0,t.noteRecv(e.seq)}),500))}tnInitFind(){const e=this.tinode.getFndTopic();e.onSubsUpdated=this.tnFndSubsUpdated,e.isSubscribed()?this.tnFndSubsUpdated():e.subscribe(e.startMetaQuery().withSub().build()).catch((e=>{this.handleError(e.message,"err")}))}tnFndSubsUpdated(){const e=[];this.tinode.getFndTopic().contacts((t=>{e.push(t)})),this.setState({searchResults:e,searchableContacts:Et.prepareSearchableContacts(this.state.chatList,e)})}handleSearchContacts(e){const t=this.tinode.getFndTopic();t.setMeta({desc:{public:e}}).then((e=>t.getMeta(t.startMetaQuery().withSub().build()))).catch((e=>{this.handleError(e.message,"err")}))}handleTopicSelected(e){this.state.newTopicParams&&this.state.newTopicParams._topicName!=e&&this.setState({newTopicParams:null}),e?(this.setState({errorText:"",errorLevel:null,mobilePanel:"topic-view",showInfoPanel:!1}),this.state.topicSelected!=e&&(this.setState({topicSelectedOnline:this.tinode.isTopicOnline(e),topicSelectedAcs:this.tinode.getTopicAccessMode(e)}),Pe.navigateTo(Pe.setUrlTopic("",e)))):(this.setState({errorText:"",errorLevel:null,mobilePanel:"sidepanel",topicSelectedOnline:!1,topicSelectedAcs:null,showInfoPanel:!1}),Pe.navigateTo(Pe.setUrlTopic("",null)))}handleHideMessagesView(){this.setState({mobilePanel:"sidepanel"}),Pe.navigateTo(Pe.setUrlTopic(window.location.hash,null))}handleSendMessage(e,t,s){const a=this.tinode.getTopic(this.state.topicSelected);(e=a.createMessage(e,!1))._uploader=s,a.isSubscribed()||(t||(t=Promise.resolve()),t=t.then((()=>a.subscribe()))),t&&(t=t.catch((e=>{this.handleError(e.message,"err")}))),a.publishDraft(e,t).then((e=>{if(a.isArchived())return a.archive(!1)})).catch((e=>{this.handleError(e.message,"err")}))}handleNewChatInvitation(e,t){const s=this.tinode.getTopic(e);let a=null;switch(t){case"accept":const i=s.getAccessMode().getGiven();a=s.setMeta({sub:{mode:i}}),s.isP2P()&&(a=a.then((t=>{s.setMeta({sub:{user:e,mode:i}})})));break;case"delete":a=s.delTopic(!0);break;case"block":const n=s.getAccessMode().updateWant("-JP").getWant();a=s.setMeta({sub:{mode:n}}).then((e=>this.handleTopicSelected(null)));break;default:console.log("Unknown invitation action",'"'+t+'""')}null!=a&&a.catch((e=>{this.handleError(e.message,"err")}))}handleNewAccount(){this.handleError(),Pe.navigateTo(Pe.setUrlSidePanel(window.location.hash,"register"))}handleNewAccountRequest(e,t,s,a,i){this.handleError(),this.tinode.connect(this.state.serverAddress).then((()=>this.tinode.createAccountBasic(e,t,{public:s,tags:i,cred:c().credential(a)}))).then((e=>{e.code>=300&&"validate credentials"==e.text?this.handleCredentialsRequest(e.params):this.handleLoginSuccessful(this)})).catch((e=>{this.handleError(e.message,"err")}))}handleUpdateAccountRequest(e,t,s){if(this.handleError(),t||s){const e={};t&&(e.public=t),s&&(e.defacs=s),this.tinode.getMeTopic().setMeta({desc:e}).catch((e=>{this.handleError(e.message,"err")}))}e&&this.tinode.updateAccountBasic(null,this.tinode.getCurrentLogin(),e).catch((e=>{this.handleError(e.message,"err")}))}handleToggleIncognitoMode(e){const t=this.tinode.getMeTopic(),s=t.getAccessMode().updateWant(e?"-P":"+P").getWant();t.setMeta({sub:{mode:s}}).catch((e=>{this.handleError(e.message,"err")}))}handleUpdateAccountTagsRequest(e){this.tinode.getMeTopic().setMeta({tags:e}).catch((e=>{this.handleError(e.message,"err")}))}handleSettings(){this.handleError(),Pe.navigateTo(Pe.setUrlSidePanel(window.location.hash,this.state.myUserId?"edit":"settings"))}handleGlobalSettings(e){const t=e.serverAddress||this.state.serverAddress,s=e.transport||this.state.transport;this.tinode&&(this.tinode.onDisconnect=void 0,this.tinode.disconnect()),this.tinode=Et.tnSetup(t,s,this.props.intl.locale),this.tinode.onConnect=this.handleConnected,this.tinode.onDisconnect=this.handleDisconnect,this.setState({serverAddress:t,transport:s}),He.setObject("settings",{serverAddress:t,transport:s}),Pe.navigateTo(Pe.setUrlSidePanel(window.location.hash,""))}handleShowArchive(){Pe.navigateTo(Pe.setUrlSidePanel(window.location.hash,this.state.myUserId?"archive":""))}handleShowBlocked(){Pe.navigateTo(Pe.setUrlSidePanel(window.location.hash,this.state.myUserId?"blocked":""))}initDesktopAlerts(){this.fbPush.onTokenRefresh((()=>{this.requestPushToken()})),this.fbPush.onMessage((e=>{}))}togglePushToken(e){e?this.state.firebaseToken?(this.setState({desktopAlerts:!0}),He.updateObject("settings",{desktopAlerts:!0})):this.fbPush.requestPermission().then((()=>{this.requestPushToken()})).catch((e=>{this.handleError(e.message,"err"),this.setState({desktopAlerts:!1,firebaseToken:null}),He.updateObject("settings",{desktopAlerts:!1}),console.log("Failed to get permission to notify.",e)})):this.state.firebaseToken?this.fbPush.deleteToken(this.state.firebaseToken).catch((e=>{console.log("Unable to delete token.",e)})).finally((()=>{He.updateObject("settings",{desktopAlerts:!1}),localStorage.removeItem("firebase-token"),this.setState({desktopAlerts:!1,firebaseToken:null})})):(this.setState({desktopAlerts:!1,firebaseToken:null}),He.updateObject("settings",{desktopAlerts:!1}))}requestPushToken(){this.fbPush.getToken().then((e=>{e!=this.state.firebaseToken&&(this.tinode.setDeviceToken(e,!0),He.setObject("firebase-token",e)),this.setState({firebaseToken:e,desktopAlerts:!0}),He.updateObject("settings",{desktopAlerts:!0})})).catch((e=>{this.handleError(e.message,"err"),console.log("Failed to retrieve firebase token",e)}))}handleToggleMessageSounds(e){this.setState({messageSounds:e}),He.updateObject("settings",{messageSoundsOff:!e})}handleCredAdd(e,t){this.tinode.getMeTopic().setMeta({cred:{meth:e,val:t}}).catch((e=>{this.handleError(e.message,"err")}))}handleCredDelete(e,t){this.tinode.getMeTopic().delCredential(e,t).catch((e=>{this.handleError(e.message,"err")}))}handleCredConfirm(e,t){this.handleCredentialsRequest({cred:[e]})}handleSidepanelCancel(){const e=Pe.parseUrlHash(window.location.hash);let t="";["security","support","general","notif"].includes(e.path[0])?t="edit":"blocked"==e.path[0]?t="security":this.state.myUserId&&(t="contacts"),e.path[0]=t,e.params&&(delete e.params.code,delete e.params.method,delete e.params.tab),Pe.navigateTo(Pe.composeUrlHash(e.path,e.params)),this.setState({errorText:"",errorLevel:null})}basicNavigator(e){Pe.navigateTo(Pe.setUrlSidePanel(window.location.hash,e))}handleStartTopicRequest(e,t,s,a,i){if(e&&this.tinode.isTopicCached(e))return void this.handleTopicSelected(e);const n={};c().isP2PTopicName(e)?(n.sub={mode:_},n.desc={defacs:{auth:_}}):(e=e||this.tinode.newGroupTopicName(i),n.desc={public:t,private:{comment:s}},n.tags=a),n._topicName=e,this.setState({newTopicParams:n},(()=>{this.handleTopicSelected(e)}))}handleNewTopicCreated(e,t){this.state.topicSelected==e&&e!=t&&this.setState({topicSelected:t},(()=>{Pe.navigateTo(Pe.setUrlTopic("",t))}))}handleTopicUpdateRequest(e,t,s,a){const i=this.tinode.getTopic(e);if(i){const e={};t&&(e.public=t),s&&(e.private=s===c().DEL_CHAR?c().DEL_CHAR:{comment:s}),a&&(e.defacs=a),i.setMeta({desc:e}).catch((e=>{this.handleError(e.message,"err")}))}}handleChangePermissions(e,t,s){const a=this.tinode.getTopic(e);if(a){const e=a.getAccessMode();s?(e.updateGiven(t),t=e.getGiven()):(e.updateWant(t),t=e.getWant()),a.setMeta({sub:{user:s,mode:t}}).catch((e=>{this.handleError(e.message,"err")}))}}handleTagsUpdated(e,t){const s=this.tinode.getTopic(e);s&&s.setMeta({tags:t}).catch((e=>{this.handleError(e.message,"err")}))}handleLogout(){ne(0),localStorage.removeItem("auth-token"),localStorage.removeItem("firebase-token"),localStorage.removeItem("settings"),this.state.firebaseToken&&this.fbPush.deleteToken(this.state.firebaseToken),this.tinode&&(this.tinode.onDisconnect=void 0,this.tinode.disconnect()),this.setState(this.getBlankState()),this.tinode=Et.tnSetup(this.state.serverAddress,this.state.transport,this.props.intl.locale),this.tinode.onConnect=this.handleConnected,this.tinode.onDisconnect=this.handleDisconnect,Pe.navigateTo("")}handleDeleteAccount(){this.tinode.delCurrentUser(!0).then((e=>{this.handleLogout()}))}handleDeleteMessagesRequest(e){const t=this.tinode.getTopic(e);t&&t.delMessagesAll(!0).catch((e=>{this.handleError(e.message,"err")}))}handleLeaveUnsubRequest(e){const t=this.tinode.getTopic(e);t&&t.leave(!0).then((e=>{Pe.navigateTo(Pe.setUrlTopic(window.location.hash,""))})).catch((e=>{this.handleError(e.message,"err")}))}handleBlockTopicRequest(e){const t=this.tinode.getTopic(e);t&&t.updateMode(null,"-JP").then((e=>{Pe.navigateTo(Pe.setUrlTopic(window.location.hash,""))})).catch((e=>{this.handleError(e.message,"err")}))}handleReportTopic(e){const t=this.tinode.getTopic(e);t&&(this.tinode.publish(c().TOPIC_SYS,c().Drafty.attachJSON(null,{action:"report",target:e})),t.updateMode(null,"-JP").then((e=>{Pe.navigateTo(Pe.setUrlTopic(window.location.hash,""))})).catch((e=>{this.handleError(e.message,"err")})))}handleShowContextMenu(e,t){this.setState({contextMenuVisible:!0,contextMenuClickAt:{x:e.x,y:e.y},contextMenuParams:e,contextMenuItems:t||this.defaultTopicContextMenu(e.topicName),contextMenuBounds:i().findDOMNode(this).getBoundingClientRect()})}defaultTopicContextMenu(e){const t=this.tinode.getTopic(e);let s=!1,a=!1,i=!1,n=!1,o=!1,r=!1;if(t){n=t.isSubscribed(),r=t.isArchived();const e=t.getAccessMode();e&&(s=e.isMuted(),a=!e.isJoiner(),i=!e.isJoiner("want"),o=e.isDeleter())}return[n?{title:this.props.intl.formatMessage({id:"menu_item_info"}),handler:this.handleShowInfoView}:null,n?"messages_clear":null,n&&o?"messages_clear_hard":null,s?a?null:"topic_unmute":"topic_mute",i?"topic_unblock":"topic_block",r?null:"topic_archive","topic_delete"]}handleHideContextMenu(){this.setState({contextMenuVisible:!1,contextMenuClickAt:null,contextMenuParams:null,contextMenuBounds:null})}handleContextMenuAction(e,t,s){"topic_archive"==e&&t&&s.topicName&&s.topicName==this.state.topicSelected&&t.then((()=>{this.handleTopicSelected(null)}))}handleShowAlert(e,t,s,a,i,n){this.setState({alertVisible:!0,alertParams:{title:e,content:t,onConfirm:s,confirm:a,onReject:i,reject:n}})}handleShowInfoView(){Pe.navigateTo(Pe.addUrlParam(window.location.hash,"info",!0)),this.setState({showInfoPanel:!0})}handleHideInfoView(){Pe.navigateTo(Pe.removeUrlParam(window.location.hash,"info")),this.setState({showInfoPanel:!1})}handleMemberUpdateRequest(e,t,s){if(!e)return;const a=this.tinode.getTopic(e);a&&(t&&t.length>0&&t.map((e=>{a.invite(e,null).catch((e=>{this.handleError(e.message,"err")}))})),s&&s.length>0&&s.map((e=>{a.delSubscription(e).catch((e=>{this.handleError(e.message,"err")}))})))}handleValidateCredentialsRequest(e,t){if(this.tinode.isAuthenticated()){this.tinode.getMeTopic().setMeta({cred:{meth:e,resp:t}}).then((()=>{Pe.navigateTo("")})).catch((e=>{this.handleError(e.message,"err")}))}else this.setState({credMethod:e,credCode:t}),this.doLogin(null,null,{meth:e,resp:t})}handlePasswordResetRequest(e,t){this.tinode.connect().then((()=>this.tinode.requestResetAuthSecret("basic",e,t))).catch((e=>{this.handleError(e.message,"err")}))}handleResetPassword(e,t,s){(s=function(e){if(e){e=e.replace(/-/g,"+").replace(/_/g,"/");try{e=btoa(atob(e))}catch(t){console.log("Failed to base64 re-encode string.",t),e=null}}return e}(s))?this.tinode.connect().then((()=>this.tinode.updateAccountBasic(null,null,t,{token:s}))).catch((e=>{this.handleError(e.message,"err")})):this.handleError(this.props.intl.formatMessage({id:"invalid_security_token"}),"err")}render(){return s().createElement("div",{id:"app-container"},this.state.contextMenuVisible?s().createElement(M,{tinode:this.tinode,bounds:this.state.contextMenuBounds,clickAt:this.state.contextMenuClickAt,params:this.state.contextMenuParams,items:this.state.contextMenuItems,hide:this.handleHideContextMenu,onShowAlert:this.handleShowAlert,onAction:this.handleContextMenuAction,onTopicRemoved:e=>{e==this.state.topicSelected&&this.handleTopicSelected(null)},onError:this.handleError}):null,s().createElement(d,{visible:this.state.alertVisible,title:this.state.alertParams.title,content:this.state.alertParams.content,onReject:this.state.alertParams.onReject?()=>{this.setState({alertVisible:!1})}:null,reject:this.state.alertParams.reject,onConfirm:()=>{this.setState({alertVisible:!1}),this.state.alertParams.onConfirm()},confirm:this.state.alertParams.confirm}),s().createElement(_t,{tinode:this.tinode,connected:this.state.connected,displayMobile:this.state.displayMobile,hideSelf:this.state.displayMobile&&"sidepanel"!==this.state.mobilePanel,state:this.state.sidePanelSelected,title:this.state.sidePanelTitle,avatar:this.state.sidePanelAvatar,login:this.state.login,myUserId:this.state.myUserId,loginDisabled:this.state.loginDisabled,loadSpinnerVisible:this.state.loadSpinnerVisible,errorText:this.state.errorText,errorLevel:this.state.errorLevel,errorAction:this.state.errorAction,errorActionText:this.state.errorActionText,topicSelected:this.state.topicSelected,chatList:this.state.chatList,credMethod:this.state.credMethod,credCode:this.state.credCode,transport:this.state.transport,messageSounds:this.state.messageSounds,desktopAlerts:this.state.desktopAlerts,desktopAlertsEnabled:this.state.desktopAlertsEnabled,incognitoMode:this.state.incognitoMode,serverAddress:this.state.serverAddress,serverVersion:this.state.serverVersion,onGlobalSettings:this.handleGlobalSettings,onSignUp:this.handleNewAccount,onSettings:this.handleSettings,onBasicNavigate:this.basicNavigator,onLoginRequest:this.handleLoginRequest,onCreateAccount:this.handleNewAccountRequest,onUpdateAccount:this.handleUpdateAccountRequest,onUpdateAccountTags:this.handleUpdateAccountTagsRequest,onTogglePushNotifications:this.togglePushToken,onToggleMessageSounds:this.handleToggleMessageSounds,onToggleIncognitoMode:this.handleToggleIncognitoMode,onCredAdd:this.handleCredAdd,onCredDelete:this.handleCredDelete,onCredConfirm:this.handleCredConfirm,onTopicSelected:this.handleTopicSelected,onCreateTopic:this.handleStartTopicRequest,onLogout:this.handleLogout,onDeleteAccount:this.handleDeleteAccount,onShowAlert:this.handleShowAlert,onCancel:this.handleSidepanelCancel,onError:this.handleError,onValidateCredentials:this.handleValidateCredentialsRequest,onPasswordResetRequest:this.handlePasswordResetRequest,onResetPassword:this.handleResetPassword,onShowArchive:this.handleShowArchive,onShowBlocked:this.handleShowBlocked,onInitFind:this.tnInitFind,searchResults:this.state.searchResults,onSearchContacts:this.handleSearchContacts,showContextMenu:this.handleShowContextMenu}),s().createElement(Re,{tinode:this.tinode,connected:this.state.connected,ready:this.state.ready,online:this.state.topicSelectedOnline,acs:this.state.topicSelectedAcs,displayMobile:this.state.displayMobile,viewportWidth:this.state.viewportWidth,viewportHeight:this.state.viewportHeight,hideSelf:this.state.displayMobile&&("topic-view"!==this.state.mobilePanel||this.state.showInfoPanel),topic:this.state.topicSelected,myUserId:this.state.myUserId,serverVersion:this.state.serverVersion,serverAddress:this.state.serverAddress,applicationVisible:this.state.applicationVisible,errorText:this.state.errorText,errorLevel:this.state.errorLevel,errorAction:this.state.errorAction,errorActionText:this.state.errorActionText,newTopicParams:this.state.newTopicParams,onHideMessagesView:this.handleHideMessagesView,onData:this.tnData,onError:this.handleError,onNewTopicCreated:this.handleNewTopicCreated,showContextMenu:this.handleShowContextMenu,onChangePermissions:this.handleChangePermissions,onNewChat:this.handleNewChatInvitation,sendMessage:this.handleSendMessage}),this.state.showInfoPanel?s().createElement(pe,{tinode:this.tinode,connected:this.state.connected,displayMobile:this.state.displayMobile,topic:this.state.topicSelected,searchableContacts:this.state.searchableContacts,myUserId:this.state.myUserId,errorText:this.state.errorText,errorLevel:this.state.errorLevel,errorAction:this.state.errorAction,errorActionText:this.state.errorActionText,onTopicDescUpdate:this.handleTopicUpdateRequest,onCancel:this.handleHideInfoView,onShowAlert:this.handleShowAlert,onChangePermissions:this.handleChangePermissions,onMemberUpdateRequest:this.handleMemberUpdateRequest,onDeleteMessages:this.handleDeleteMessagesRequest,onLeaveTopic:this.handleLeaveUnsubRequest,onBlockTopic:this.handleBlockTopicRequest,onReportTopic:this.handleReportTopic,onAddMember:this.handleManageGroupMembers,onTopicTagsUpdate:this.handleTagsUpdated,onInitFind:this.tnInitFind,onError:this.handleError,showContextMenu:this.handleShowContextMenu}):null)}}var wt=(0,n.injectIntl)(Et);const{params:Ct}=Pe.parseUrlHash(window.location.hash),St=Ct&&Ct.hl||navigator.languages&&navigator.languages[0]||navigator.language||navigator.userLanguage||"en",Mt=St.toLowerCase().split(/[-_]/)[0],kt=o[St]||o[Mt]||o.en;i().render(s().createElement(n.IntlProvider,{locale:St,messages:kt,textComponent:s().Fragment},s().createElement(wt,null)),document.getElementById("mountPoint"))}();
+!function(){"use strict";var e={n:function(t){var s=t&&t.__esModule?function(){return t.default}:function(){return t};return e.d(s,{a:s}),s},d:function(t,s){for(var a in s)e.o(s,a)&&!e.o(t,a)&&Object.defineProperty(t,a,{enumerable:!0,get:s[a]})},o:function(e,t){return Object.prototype.hasOwnProperty.call(e,t)}},t=React,s=e.n(t),a=ReactDOM,i=e.n(a),n=ReactIntl,o=JSON.parse('{"de":{"validate_credential_action":"bestätigen","title_tag_manager":"Schlagworte (Nutzer entdecken)","label_user_contacts":"Kontakte:","button_add_another":"Hinzufügen","label_message_sound":"Benachrichtigungston:","label_push_notifications":"Benachrichtigungsmeldungen:","label_push_notifications_disabled":"Benachrichtigungsmeldungen (erfordert HTTPS):","label_incognito_mode":"inkognito-Modus:","delete_account":"Konto löschen","delete_account_arning":"Möchten Sie das Konto wirklich löschen? Das kann nicht rückgängig gemacht werden","label_password":"Passwort","password_unchanged_prompt":"unverändert","button_logout":"Abmelden","button_delete_account":"Konto löschen","label_default_access_mode":"Standard Zugriffsmodus:","blocked_contacts_link":"Blockierte Kontakte ({count})","link_contact_us":"Kontakt","link_terms_of_service":"Nutzungsbedingungen","link_privacy_policy":"Datenschutzerklärung","label_sdk":"SDK:","label_server_address":"Server Adresse:","archived_contacts":"Archivierte Kontakte ({count})","contacts_not_found":"Sie haben keine Unterhaltungen
¯∖_(ツ)_/¯","full_name_prompt":"Vollständiger Name, z.B. Lisa Musterfrau","email_prompt":"E-Mail, z.B. jdoe@beispiel.de","button_sign_up":"Anmelden","label_your_name":"Ihr Name","label_user_id":"ID:","button_edit":"Bearbeiten","requested_permissions":"Angefordert","granted_permissions":"Erteilt","menu_item_edit_permissions":"Berechtigungen ändern","label_other_user":"Andere","action_clear_messages":"Nachrichten leeren","clear_messages_warning":"Sind Sie sicher, dass Sie diese Unterhaltung für alle leeren wollen? Das kann nicht rückgängig gemacht werden.","action_delete_messages":"Nachrichten für alle löschen","delete_messages_warning":"Sind Sie sicher, dass Sie diese Unterhaltung für alle löschen wollen? Das kann nicht rückgängig gemacht werden.","action_leave_chat":"Unterhaltung verlassen","leave_chat_warning":"Möchten Sie diese Unterhaltung wirklich verlassen?","action_block_contact":"Kontakt blockieren","block_contact_warning":"Möchten Sie diesen Kontakt wirklich blockieren?","action_report_chat":"Unterhaltung melden","report_chat_warning":"Möchten Sie diese Unterhaltung wirklich blockieren und melden?","title_info":"Info","label_topic_name":"Name","label_private":"Privater Kommentar","private_editing_placeholder":"Nur für Sie sichtbar","label_muting_topic":"Stumm geschaltet:","action_more":"Mehr","label_your_permissions":"Ihre Berechtigungen:","label_permissions":"Berechtigungen:","label_you":"Sie:","label_default_access":"Standard Zugriffsmodus:","label_group_members":"Gruppenmitglieder:","button_add_members":"Mitglieder hinzufügen","group_has_no_members":"Keine Mitglieder","login_prompt":"Anmelden","password_prompt":"Passwort","stay_logged_in":"Angemeldet bleiben","forgot_password_link":"Passwort vergessen?","button_sign_in":"Anmelden","label_client":"Client:","label_server":"Server:","online_now":"jetzt online","last_seen_timestamp":"Zuletzt gesehen","title_not_found":"Nicht gefunden","unnamed_topic":"Unbenannt","messages_not_readable":"Neue Nachrichten können nicht gelesen werden","peers_messaging_disabled":"Gruppennachrichten sind deaktiviert","enable_peers_messaging":"Aktivieren","search_for_contacts":"Nutzen Sie die Suche um Kontakte zu finden","search_no_results":"Die Suche hatte keine Ergebnisse","tabtitle_find_user":"Suchen","tabtitle_new_group":"Neue Gruppe","tabtitle_group_by_id":"nach ID","new_password_placeholder":"Geben Sie ein neues Passwort ein","label_reset_password":"Passwort per E-Mail wiederherstellen:","credential_email_prompt":"E-Mail Adresse für Registrierung","button_reset":"Zurücksetzen","button_send_request":"Anfrage senden","label_server_to_use":"Server verwenden:","label_wire_transport":"Übertragung per Kabel:","button_update":"Aktualisieren","sidepanel_title_login":"Anmelden","sidepanel_title_register":"Konto erstellen","sidepanel_title_settings":"Einstellungen","sidepanel_title_account_settings":"Konto-Einstellungen","sidepanel_title_acc_general":"Allgemein","sidepanel_title_acc_security":"Sicherheit","sidepanel_title_acc_notifications":"Benachrichtigungen","sidepanel_title_acc_support":"Unterstützung","sidepanel_title_newtpk":"Neue Unterhaltung starten","sidepanel_title_cred":"Anmeldeinformationen bestätigen","sidepanel_title_reset":"Passwort zurücksetzen","sidepanel_title_archive":"Archivierte Unterhaltungen","sidepanel_title_blocked":"Blockierte Unterhaltungen","reconnect_countdown":"Getrennt. Wiederverbinden in {seconds}…","reconnect_now":"Jetzt probieren","push_init_failed":"Initialisierung von Push-Benachrichtigungen fehlgeschlagen","invalid_security_token":"Ungültiger Sicherheitsschlüssel","no_connection":"Keine Verbindung","code_doesnot_match":"Code stimmt nicht überein","update_available":"Aktualisierung verfügbar.","reload_update":"Neu laden","phone_dative":"Telefon","email_dative":"E-Mail","enter_confirmation_code_prompt":"Geben Sie den Bestätigungscode ein, der per {method} geschickt wurde:","numeric_confirmation_code_prompt":"Nur zahlen","button_confirm":"Bestätigen","save_attachment":"Speichern","deleted_content":"Inhalt gelöscht","invalid_content":"ungültiger Inhalt","user_not_found":"Nicht gefunden","badge_you":"Sie","badge_owner":"Besitzer","menu_item_info":"Info","menu_item_clear_messages":"Nachrichten leeren","menu_item_clear_messages_for_all":"Für alle leeren","menu_item_delete":"Löschen","menu_item_delete_for_all":"Für alle löschen","menu_item_send_retry":"Wiederholen","menu_item_mute":"Unterhaltung stumm schalten","menu_item_unmute":"Stumm schalten beenden","menu_item_delete_topic":"Entfernen","topic_delete_warning":"Möchten Sie diese Unterhaltung wirklich löschen?","menu_item_unblock":"Blockierung aufheben","menu_item_block":"Blockieren","topic_block_warning":"Möchten Sie diese Unterhaltung wirklich blockieren?","menu_item_member_delete":"Entfernen","menu_item_archive_topic":"Archivieren","action_cancel":"Abbrechen","upload_finishing":"wird abgeschlossen...","no_contacts":"Sie haben keine Kontakte :-(","contacts_not_found_short":"Keine Kontakte für \'\'{query}\'\'","title_group_members":"Gruppenmitglieder","title_all_contacts":"Alle Kontakte","button_ok":"OK","button_cancel":"Abbrechen","more_online_members":"+{overflow} mehr","download_action":"herunterladen","label_file_name":"Dateiname:","label_content_type":"Inhaltsart:","label_size":"Größe:","chat_invitation":"Sie sind eingeladen, an einem neuen Chat teilzunehmen. Was möchten Sie tun?","chat_invitation_accept":"Akzeptieren","chat_invitation_ignore":"Ignorieren","chat_invitation_block":"Blockieren","error_invalid_id":"ungültige ID","group_user_id_prompt":"Gruppe oder Benutzer ID","button_subscribe":"Abbonieren","topic_name_editing_placeholder":"Freiform Name der Gruppe","button_create":"Erstellen","permission_join":"Beitreten ({val})","permission_read":"Lesen ({val})","permission_write":"Schreiben ({val})","permission_pres":"Benachrichtigt werden ({val})","permission_admin":"Bestätigen ({val})","permission_share":"Teilen ({val})","permission_delete":"Entfernen ({val})","permission_owner":"Besitzer ({val})","title_permissions":"Berechtigungen","message_sending":"wird gesendet...","message_sending_failed":"fehlgeschlagen","search_placeholder":"Liste: email:lisa@beispiel.de, tel:17025550003...","messaging_disabled_prompt":"Nachrichtenübermittlung deaktiviert","new_message_prompt":"Neue Nachricht","image_caption_prompt":"Bildunterschrift","file_attachment_too_large":"Die Dateigröße {size} überschreitet das Limit von {limit}.","cannot_initiate_file_upload":"Datei kann nicht hochgeladen werden.","tags_not_found":"Keine Schlagworte definiert. Erstellen Sie welche.","tags_editor_no_tags":"Schlagworte hinzufügen","title_manage_tags":"Verwalten","channel_prompt":"Dies ist ein Sender","channel":"Sender"},"en":{"validate_credential_action":"confirm","title_tag_manager":"Tags (user discovery)","label_user_contacts":"Contacts:","button_add_another":"Add another","label_message_sound":"Message sound:","label_push_notifications":"Notification alerts:","label_push_notifications_disabled":"Notification alerts (requires HTTPS):","label_incognito_mode":"Incognito mode:","delete_account":"Delete account","delete_account_arning":"Are you sure you want to delete your account? It cannot be undone.","label_password":"Password","password_unchanged_prompt":"Unchanged","button_logout":"Logout","button_delete_account":"Delete account","label_default_access_mode":"Default access mode:","blocked_contacts_link":"Blocked contacts ({count})","link_contact_us":"Contact Us","link_terms_of_service":"Terms of Service","link_privacy_policy":"Privacy Policy","label_sdk":"SDK:","label_server_address":"Server address:","archived_contacts":"Archived contacts ({count})","contacts_not_found":"You have no chats
¯∖_(ツ)_/¯","full_name_prompt":"Full name, e.g. John Doe","email_prompt":"Email, e.g. jdoe@example.com","button_sign_up":"Sign up","label_your_name":"Your name","label_user_id":"ID:","button_edit":"Edit","requested_permissions":"Requested","granted_permissions":"Granted","menu_item_edit_permissions":"Edit permissions","label_other_user":"Other","action_clear_messages":"Clear Messages","clear_messages_warning":"Are you sure you want to clear all messages? It cannot be undone.","action_delete_messages":"Clear Messages for All","delete_messages_warning":"Are you sure you want to delete all messages for everyone? It cannot be undone.","action_leave_chat":"Leave Conversation","leave_chat_warning":"Are you sure you want to leave this conversation?","action_block_contact":"Block Contact","block_contact_warning":"Are you sure you want to block this contact?","action_report_chat":"Report Conversation","report_chat_warning":"Are you sure you want to block and report this conversation?","title_info":"Info","label_topic_name":"Name","label_private":"Private comment","private_editing_placeholder":"Visible to you only","label_muting_topic":"Muted:","action_more":"More","label_your_permissions":"Your permissions:","label_permissions":"Permissions:","label_you":"You:","label_default_access":"Default access mode:","label_group_members":"Group members:","button_add_members":"Add members","group_has_no_members":"No members","login_prompt":"Login","password_prompt":"Password","stay_logged_in":"Stay logged in","forgot_password_link":"Forgot password?","button_sign_in":"Sign in","label_client":"Client:","label_server":"Server:","online_now":"online now","last_seen_timestamp":"Last seen","title_not_found":"Not found","channel":"channel","unnamed_topic":"Unnamed","messages_not_readable":"no access to messages","peers_messaging_disabled":"Peer\'s messaging is disabled.","enable_peers_messaging":"Enable","search_for_contacts":"Use search to find contacts","search_no_results":"Search returned no results","tabtitle_find_user":"find","tabtitle_new_group":"new group","tabtitle_group_by_id":"by id","new_password_placeholder":"Enter new password","label_reset_password":"Send a password reset email:","credential_email_prompt":"Your registration email","button_reset":"Reset","button_send_request":"Send request","label_server_to_use":"Server to use:","label_wire_transport":"Wire transport:","button_update":"Update","sidepanel_title_login":"Sign In","sidepanel_title_register":"Create Account","sidepanel_title_settings":"Settings","sidepanel_title_account_settings":"Account Settings","sidepanel_title_acc_general":"General","sidepanel_title_acc_security":"Security","sidepanel_title_acc_notifications":"Notifications","sidepanel_title_acc_support":"Support","sidepanel_title_newtpk":"Start New Chat","sidepanel_title_cred":"Confirm Credentials","sidepanel_title_reset":"Reset Password","sidepanel_title_archive":"Archived Chats","sidepanel_title_blocked":"Blocked Chats","reconnect_countdown":"Disconnected. Reconnecting in {seconds}…","reconnect_now":"Try now","push_init_failed":"Failed to initialize push notifications","invalid_security_token":"Invalid security token","no_connection":"No connection","code_doesnot_match":"Code does not match","update_available":"Update available.","reload_update":"Reload","phone_dative":"phone","email_dative":"email","enter_confirmation_code_prompt":"Enter confirmation code sent to you by {method}:","numeric_confirmation_code_prompt":"Numbers only","button_confirm":"Confirm","save_attachment":"save","deleted_content":"content deleted","invalid_content":"invalid content","user_not_found":"Not found","badge_you":"you","badge_owner":"owner","menu_item_info":"Info","menu_item_clear_messages":"Clear messages","menu_item_clear_messages_for_all":"Clear for All","menu_item_delete":"Delete","menu_item_delete_for_all":"Delete for All","menu_item_send_retry":"Retry","menu_item_mute":"Mute","menu_item_unmute":"Unmute","menu_item_delete_topic":"Delete","topic_delete_warning":"Are you sure you want to delete this conversation?","menu_item_unblock":"Unblock","menu_item_block":"Block","topic_block_warning":"Are you sure you want to block this conversation?","menu_item_member_delete":"Remove","menu_item_archive_topic":"Archive","action_cancel":"cancel","upload_finishing":"finishing...","no_contacts":"You have no contacts :-(","contacts_not_found_short":"No contacts match \'\'{query}\'\'","title_group_members":"Group Members","title_all_contacts":"All Contacts","button_ok":"OK","button_cancel":"Cancel","more_online_members":"+{overflow} more","download_action":"download","label_file_name":"File name:","label_content_type":"Content type:","label_size":"Size:","chat_invitation":"You are invited to start a new chat. What would you like to do?","chat_invitation_accept":"Accept","chat_invitation_ignore":"Ignore","chat_invitation_block":"Block","error_invalid_id":"Invalid ID","group_user_id_prompt":"Group or User ID","button_subscribe":"Subscribe","topic_name_editing_placeholder":"Freeform name of the group","channel_prompt":"This is a channel","button_create":"Create","permission_join":"Join ({val})","permission_read":"Read ({val})","permission_write":"Write ({val})","permission_pres":"Get notified ({val})","permission_admin":"Approve ({val})","permission_share":"Share ({val})","permission_delete":"Delete ({val})","permission_owner":"Owner ({val})","title_permissions":"Permissions","message_sending":"sending...","message_sending_failed":"failed","search_placeholder":"List like email:alice@example.com, tel:17025550003...","messaging_disabled_prompt":"Messaging disabled","new_message_prompt":"New message","image_caption_prompt":"Image caption","file_attachment_too_large":"The file size {size} exceeds the {limit} limit.","cannot_initiate_file_upload":"Cannot initiate file upload.","tags_not_found":"No tags defined. Add some.","tags_editor_no_tags":"Add some tags","title_manage_tags":"Manage"},"es":{"validate_credential_action":"confirmar","title_tag_manager":"Etiquetas (descubrimiento de usuarios)","label_user_contacts":"Contactos:","button_add_another":"Añadir contacto","label_message_sound":"Sonido de mensaje:","label_push_notifications":"Alertas de notificaciones:","label_push_notifications_disabled":"Alertas de notificaciones (requiere HTTPS):","label_incognito_mode":"Modo incógnito:","delete_account":"Eliminar cuenta","delete_account_arning":"¿Estás seguro de que deseas eliminar permanentemente tu cuenta? Esta acción es irreversible.","label_password":"Contraseña","password_unchanged_prompt":"Sin cambios","button_logout":"Cerrar sesión","button_delete_account":"Eliminar cuenta","label_default_access_mode":"Modo de acceso predeterminado:","blocked_contacts_link":"Contactos bloqueados ({count})","link_contact_us":"Contáctanos","link_terms_of_service":"Términos de uso","link_privacy_policy":"Política de privacidad","label_sdk":"SDK:","label_server_address":"Dirección del servidor:","archived_contacts":"Contactos archivados ({count})","contacts_not_found":"No tienes chats
¯∖_(ツ)_/¯","full_name_prompt":"Nombre completo, p.ej. Juan González Hernández","email_prompt":"Correo electrónico, p.ej. juan@example.com","button_sign_up":"Regístrate","label_your_name":"Tu nombre","label_user_id":"ID:","button_edit":"Editar","requested_permissions":"Solicitados","granted_permissions":"Otorgados","menu_item_edit_permissions":"Editar permisos","label_other_user":"Otros","action_clear_messages":"Borrar mensajes","clear_messages_warning":"¿Estás seguro de que quieres eliminar todos los mensajes? Esta acción es irreversible.","action_delete_messages":"Borrar mensajes para todos","delete_messages_warning":"¿Estás seguro de que quieres eliminar todos los mensajes para todos? Esta acción es irreversible.","action_leave_chat":"Dejar conversación","leave_chat_warning":"¿Estás seguro de que quieres dejar esta conversación?","action_block_contact":"Bloquear contacto","block_contact_warning":"¿Estás seguro de que quieres bloquear a este contacto?","action_report_chat":"Reportar conversación","report_chat_warning":"¿Estás seguro de que quieres bloquear y reportar a esta conversación?","title_info":"Información","label_topic_name":"Nombre del tema","label_private":"Comentario privado","private_editing_placeholder":"Sólo visible para tí","label_muting_topic":"Silenciado:","action_more":"Más","label_your_permissions":"Tus permisoss:","label_permissions":"Permisos:","label_you":"Tú:","label_default_access":"Modo de acceso predeterminado:","label_group_members":"Miembros del grupo:","button_add_members":"Añadir miembros","group_has_no_members":"No hay miembros","login_prompt":"Nombre de usuario","password_prompt":"Contraseña","stay_logged_in":"Permanecer conectado","forgot_password_link":"¿Olvidaste tu contraseña?","button_sign_in":"Entrar","label_client":"Cliente:","label_server":"Servidor:","online_now":"en línea","last_seen_timestamp":"Últ. vez","title_not_found":"No encontrado","unnamed_topic":"Sin nombre","messages_not_readable":"sin acceso a mensajes","peers_messaging_disabled":"La mensajería Peer está deshabilitada.","enable_peers_messaging":"Habilitar","search_for_contacts":"Usa la búsqueda para encontrar contactos","search_no_results":"La búsqueda no arrojó resultados","tabtitle_find_user":"encontrar","tabtitle_new_group":"nuevo grupo","tabtitle_group_by_id":"por ID","new_password_placeholder":"Introduzca una nueva contraseña","label_reset_password":"Enviar un correo electrónico de restablecimiento de contraseña:","credential_email_prompt":"Tu correo electrónico de registro","button_reset":"Restablecer","button_send_request":"Enviar petición","label_server_to_use":"Servidor para usar:","label_wire_transport":"Transporte de alambre:","button_update":"Actualizar","sidepanel_title_login":"Iniciar sesión","sidepanel_title_register":"Crear cuenta","sidepanel_title_settings":"Ajustes","sidepanel_title_account_settings":"Ajustes de la cuenta","sidepanel_title_acc_general":"General","sidepanel_title_acc_security":"Seguridad","sidepanel_title_acc_notifications":"Notificaciones","sidepanel_title_acc_support":"Soporte","sidepanel_title_newtpk":"Iniciar un nuevo chat","sidepanel_title_cred":"Confirmar credenciales","sidepanel_title_reset":"Restablecer contraseña","sidepanel_title_archive":"Chats archivados","sidepanel_title_blocked":"Chats bloqueados","update_available":"Actualización disponible.","reload_update":"Recargar","reconnect_countdown":"Desconectado. Reconectando en {seconds}…","reconnect_now":"Reintentar","push_init_failed":"Error al inicializar las notificaciones push","invalid_security_token":"Token de seguridad inválido","no_connection":"Sin conexión","code_doesnot_match":"El código no coincide","phone_dative":"teléfono","email_dative":"correo electrónico","enter_confirmation_code_prompt":"Intruduzca el código de confirmación enviado a tu {method}:","numeric_confirmation_code_prompt":"Sólo números","button_confirm":"Confirmar","save_attachment":"guardar","deleted_content":"este mensaje fue eliminado","invalid_content":"contenido inválido","user_not_found":"Usuario no encontrado","badge_you":"tú","badge_owner":"propietario","menu_item_info":"Información","menu_item_clear_messages":"Borrar mensajes","menu_item_clear_messages_for_all":"Borrar para todos","menu_item_delete":"Eliminar","menu_item_delete_for_all":"Eliminar para todos","menu_item_send_retry":"Inténtalo de nuevo","menu_item_mute":"Silenciar","menu_item_unmute":"Anular el silencio","menu_item_delete_topic":"Eliminar","topic_delete_warning":"¿Estás seguro de que quieres eliminar esta conversación?","menu_item_unblock":"Desbloquear","menu_item_block":"Bloquear","topic_block_warning":"¿Estás seguro de que quieres bloquear esta conversación","menu_item_member_delete":"Eliminar","menu_item_archive_topic":"Archivar","action_cancel":"cancelar","upload_finishing":"terminando...","no_contacts":"No tienes contactos :-(","contacts_not_found_short":"Ningún contacto coincide con \'\'{query}\'\'","title_group_members":"Miembros del grupo","title_all_contacts":"Todos los contactos","button_ok":"OK","button_cancel":"Cancelar","more_online_members":"+{overflow} más","download_action":"descargar","label_file_name":"Nombre del archivo:","label_content_type":"Tipo de contenido:","label_size":"Tamaño:","chat_invitation":"Estás invitado a participar en un nuevo chat. ¿Qué te gustaría hacer?","chat_invitation_accept":"Aceptar","chat_invitation_ignore":"Ignorar","chat_invitation_block":"Bloquear","error_invalid_id":"ID inválido","group_user_id_prompt":"ID del grupo o usuario","button_subscribe":"Suscribirse","topic_name_editing_placeholder":"Nombre del grupo","button_create":"Crear","permission_join":"Unirse ({val})","permission_read":"Leer ({val})","permission_write":"Escribir ({val})","permission_pres":"Ser notificado ({val})","permission_admin":"Approbar ({val})","permission_share":"Compartir ({val})","permission_delete":"Eliminar ({val})","permission_owner":"Propietario ({val})","title_permissions":"Permisos","message_sending":"enviando...","message_sending_failed":"no se pudo enviar el mensaje","search_placeholder":"Ej. email:alice@example.com, tel:17025550003...","messaging_disabled_prompt":"El envío de mensajes está deshabilitado","new_message_prompt":"Nuevo mensaje","image_caption_prompt":"Añade un comentario","file_attachment_too_large":"El tamaño del archivo {size} excede el límite de {limit}.","cannot_initiate_file_upload":"No se pudo iniciar la carga del archivo.","tags_not_found":"No hay etiquetas definidas. Añade unas.","tags_editor_no_tags":"Añadir etiquetas","title_manage_tags":"Gestionar","channel_prompt":"Este es un canal","channel":"canal"},"ko":{"validate_credential_action":"확인","title_tag_manager":"태그(사용자검색)","label_user_contacts":"연락처: ","button_add_another":"다른항목추가","label_message_sound":"메시지소리: ","label_push_notifications":"통지경보: ","label_push_notifications_disabled":"통지경보(HTTPS필요): ","label_incognito_mode":"시크릿모드: ","delete_account":"계정삭제","delete_account_arning":"계정을삭제하시겠습니까?실행취소할수없습니다.","label_password":"비밀번호","password_unchanged_prompt":"변경되지않음","button_logout":"로그아웃","button_delete_account":"계정삭제","label_default_access_mode":"기본액세스모드: ","blocked_contacts_link":"차단된연락처({수})","link_contact_us":"문의처","link_terms_of_service":"서비스약관","link_privacy_policy":"개인정보보호정책","label_sdk":"SDK:","label_server_address":"서버주소: ","archived_contacts":"보관된연락처({수})","contacts_not_found":"채팅이없습니다
¯∖_(ツ)_/¯","full_name_prompt":"전체이름(예:홍길동)","email_prompt":"이메일(예:hong@example.com)","button_sign_up":"가입","label_your_name":"이름","label_user_id":"ID:","button_edit":"편집","requested_permissions":"요청","menu_item_edit_permissions":"편집권한","label_other_user":"기타","action_clear_messages":"메시지지우기","clear_messages_warning":"모든메시지를지우시겠습니까?실행취소할수없습니다.","action_delete_messages":"모든메시지지우기","delete_messages_warning":"모든사람의모든메시지를삭제하시겠습니까?실행취소할수없습니다.","action_leave_chat":"대화나누기","leave_chat_warning":"이대화를나가시겠습니까?","action_block_contact":"연락차단","block_contact_warning":"이연락처를차단하시겠습니까?","action_report_chat":"대화기록","report_chat_warning":"이대화를차단하고기록하시겠습니까?","title_info":"정보","label_topic_name":"이름","label_private":"개인코멘트","private_editing_placeholder":"나만볼수있습니다","label_muting_topic":"음소거: ","action_more":"더보기","label_your_permissions":"권한: ","label_permissions":"권한: ","label_you":"당신: ","label_default_access":"기본액세스모드: ","label_group_members":"그룹회원: ","button_add_members":"회원추가","group_has_no_members":"회원없음","login_prompt":"로그인","password_prompt":"비밀번호","stay_logged_in":"로그인상태유지","forgot_password_link":"비밀번호를잊으셨습니까?","button_sign_in":"로그인","label_client":"클라이언트: ","label_server":"서버: ","online_now":"현재접속중","last_seen_timestamp":"마지막으로본","title_not_found":"찾을수없음","unnamed_topic":"이름없는","peers_messaging_disabled":"동료의메시지가비활성화되었습니다.","enable_peers_messaging":"활성화","search_for_contacts":"검색을사용하여연락처찾기","search_no_results":"검색결과가없습니다","tabtitle_find_user":"찾기","tabtitle_new_group":"새그룹","tabtitle_group_by_id":"id로","new_password_placeholder":"새비밀번호입력","label_reset_password":"비밀번호재설정이메일보내기: ","credential_email_prompt":"등록이메일","button_reset":"재설정","button_send_request":"요청보내기","label_server_to_use":"사용할서버:","label_wire_transport":"와이어수송:","button_update":"업데이트","sidepanel_title_login":"로그인","sidepanel_title_register":"계정만들기","sidepanel_title_settings":"설정","sidepanel_title_account_settings":"계정설정","sidepanel_title_acc_general":"일반","sidepanel_title_acc_security":"보안","sidepanel_title_acc_notifications":"알림","sidepanel_title_acc_support":"지원","sidepanel_title_newtpk":"새채팅시작","sidepanel_title_cred":"자격증명확인","sidepanel_title_reset":"비밀번호재설정","sidepanel_title_archive":"보관된채팅","sidepanel_title_blocked":"차단된채팅","update_available":"업데이트가능.","reload_update":"재로드","reconnect_countdown":"연결이끊어졌습니다.다시연결하는중{초}…","reconnect_now":"지금시도","push_init_failed":"푸시알림을초기화하지못했습니다","invalid_security_token":"유효하지않은보안토큰","no_connection":"연결없음","code_doesnot_match":"코드가일치하지않습니다","phone_dative":"전화","email_dative":"이메일","enter_confirmation_code_prompt":"{방법}으로보낸확인코드를입력하십시오:","numeric_confirmation_code_prompt":"숫자만","button_confirm":"확인","save_attachment":"저장","invalid_content":"잘못된내용","user_not_found":"찾을수없음","badge_you":"당신","badge_owner":"소유자","menu_item_info":"정보","menu_item_clear_messages":"메시지지우기","menu_item_clear_messages_for_all":"모두지우기","menu_item_delete":"삭제","menu_item_delete_for_all":"모두삭제","menu_item_send_retry":"다시시도","menu_item_mute":"음소거","menu_item_unmute":"음소거해제","menu_item_delete_topic":"삭제","topic_delete_warning":"이대화를삭제하시겠습니까?","menu_item_unblock":"차단해제","menu_item_block":"차단","topic_block_warning":"이대화를차단하시겠습니까?","menu_item_member_delete":"제거","menu_item_archive_topic":"보관","action_cancel":"취소","upload_finishing":"마무리...","no_contacts":"연락처가없습니다 (._.)","contacts_not_found_short":"\'{문의}\'와일치하는연락처가없습니다.","title_group_members":"그룹구성원","title_all_contacts":"모든연락처","button_ok":"OK","button_cancel":"취소","more_online_members":"+{넘침}더보기","download_action":"다운로드","label_file_name":"파일이름: ","label_content_type":"컨텐츠유형: ","label_size":"크기: ","chat_invitation":"새로운대화를시작하도록초대되었습니다.무엇을하시겠습니까?","chat_invitation_accept":"수락","chat_invitation_ignore":"무시","chat_invitation_block":"차단","error_invalid_id":"잘못된ID","group_user_id_prompt":"그룹또는사용자ID","button_subscribe":"구독","topic_name_editing_placeholder":"그룹의자유형이름","button_create":"작성","permission_join":"참여({val})","permission_read":"읽기({val})","permission_write":"쓰기({val})","permission_pres":"알림받기({val})","permission_admin":"승인({val})","permission_share":"공유({val})","permission_delete":"삭제({val})","permission_owner":"소유자({val})","title_permissions":"권한","message_sending":"보내기...","message_sending_failed":"실패","search_placeholder":"email:alice@example.com,tel:17025550003...와같은목록","messaging_disabled_prompt":"메시지비활성화","new_message_prompt":"새메시지","image_caption_prompt":"이미지설명","file_attachment_too_large":"파일크기{크기}이(가){제한}제한을초과합니다.","cannot_initiate_file_upload":"파일업로드를시작할수없습니다.","tags_not_found":"태그가정의되지않았습니다.일부를추가하십시오.","tags_editor_no_tags":"일부태그추가","title_manage_tags":"관리","granted_permissions":"승낙하다","messages_not_readable":"메시지에 액세스 할 수 없습니다","deleted_content":"내용이 삭제되었습니다","channel_prompt":"이 채널입니다","channel":"채널"},"ro":{"validate_credential_action":"confirmă","title_tag_manager":"Tag-uri (user discovery)","label_user_contacts":"Contacte:","button_add_another":"Adaugă","label_message_sound":"Sunet de mesaj:","label_push_notifications":"Alerte de notificare:","label_push_notifications_disabled":"Alerte de notificare (necesită HTTPS):","label_incognito_mode":"Mod incognito:","delete_account":"Șterge contul","delete_account_arning":"Ești sigur că dorești să ștergi contul? Acesta nu va putea fi recuperat.","label_password":"Parola","password_unchanged_prompt":"Neschimbată","button_logout":"Deconectare","button_delete_account":"Șterge cont","label_default_access_mode":"Default access mode:","blocked_contacts_link":"Contact blocate ({count})","link_contact_us":"Contactează-ne","link_terms_of_service":"Termenii Serviciului","link_privacy_policy":"Politica de Confidențialitate","label_sdk":"SDK:","label_server_address":"Adresa serverului:","archived_contacts":"Contacte arhivate ({count})","contacts_not_found":"Nu ai contacte salvate
¯∖_(ツ)_/¯","full_name_prompt":"Numele tău","email_prompt":"Adresa de e-mail","button_sign_up":"Creează cont","label_your_name":"Numele tău","label_user_id":"ID:","button_edit":"Editează","requested_permissions":"Necesare","granted_permissions":"Oferite","menu_item_edit_permissions":"Editează permisiuni","label_other_user":"Altele","action_clear_messages":"Șterge mesajele","clear_messages_warning":"Ești sigur că dorești să ștergi mesajele? Acestea nu pot fi recuperate.","action_delete_messages":"Șterge toate mesajele","delete_messages_warning":"Ești sigur că dorești să șterge mesajele din toate conversațiile? Acestea nu pot fi recuperate.","action_leave_chat":"Ieși din conversație","leave_chat_warning":"Ești sigur că dorești să ieși din conersație?","action_block_contact":"Blochează contact","block_contact_warning":"Ești sigur că dorești să blochezi acest contact?","action_report_chat":"Raportează conversația","report_chat_warning":"Ești sigur că dorești să blochezi și să raportezi această conversație?","title_info":"Info","label_topic_name":"Nume","label_private":"Comentariu privat","private_editing_placeholder":"Vizibil doar ție","label_muting_topic":"Mod silențios (muted):","action_more":"Mai multe","label_your_permissions":"Permisiuniile tale:","label_permissions":"Permisiuni:","label_you":"Tu:","label_default_access":"Modul default:","label_group_members":"Membrii grupului:","button_add_members":"Adaugă persoane","group_has_no_members":"În acest grup nu se află persoane","login_prompt":"Conectează-te","password_prompt":"Parola","stay_logged_in":"Rămâi conectat","forgot_password_link":"Ți-ai uitat parola?","button_sign_in":"Conectează-te","label_client":"Client:","label_server":"Server:","online_now":"online acum","last_seen_timestamp":"Văzut ultima dată","title_not_found":"Nu a fost găsit","channel":"canal","unnamed_topic":"Nedenumit","messages_not_readable":"Mesajele nu pot fi citite","peers_messaging_disabled":"Mesageria de tip Peer este dezactivată.","enable_peers_messaging":"Activează","search_for_contacts":"Caută în contacte","search_no_results":"Nu s-au găsit rezultate","tabtitle_find_user":"caută","tabtitle_new_group":"grup nou","tabtitle_group_by_id":"după id","new_password_placeholder":"Introdu parolă","label_reset_password":"Resetează parola:","credential_email_prompt":"Adresa de e-mail","button_reset":"Resetează","button_send_request":"Trimite cerere","label_server_to_use":"Server de utilizat:","label_wire_transport":"Transportul legat:","button_update":"Actualizează","sidepanel_title_login":"Conectează-te","sidepanel_title_register":"Creează Cont","sidepanel_title_settings":"Setări","sidepanel_title_account_settings":"Setările Contului","sidepanel_title_acc_general":"Generale","sidepanel_title_acc_security":"Securitate","sidepanel_title_acc_notifications":"Notificări","sidepanel_title_acc_support":"Ajutor","sidepanel_title_newtpk":"Creeză un nou Chat","sidepanel_title_cred":"Confirmă credențiale","sidepanel_title_reset":"Resetează Parola","sidepanel_title_archive":"Conversații Arhivate","sidepanel_title_blocked":"Conversații Blocate","reconnect_countdown":"Deconectat. Se încearcă conectarea în {seconds}…","reconnect_now":"Încearcă din nou","push_init_failed":"Nu s-a reușit inițializarea tip push notifications","invalid_security_token":"Codul de securitate este invalid","no_connection":"Nu există conexiune","code_doesnot_match":"Codul furnizat nu este valid","update_available":"Actualizare disponibilă.","reload_update":"Reîncarcă","phone_dative":"telefon","email_dative":"email","enter_confirmation_code_prompt":"Introu codul de confirmare trimis pe {method}:","numeric_confirmation_code_prompt":"Doar cifre","button_confirm":"Confirmă","save_attachment":"salvează","deleted_content":"conținut șters","invalid_content":"conținut invalid","user_not_found":"Utilizatorul nu a fost găsit","badge_you":"tu","badge_owner":"owner","menu_item_info":"Info","menu_item_clear_messages":"Șterge mesajele","menu_item_clear_messages_for_all":"Ștergele pe toate","menu_item_delete":"Șterge","menu_item_delete_for_all":"Ștergele pe toate","menu_item_send_retry":"Reîncearcă","menu_item_mute":"Mute","menu_item_unmute":"Unmute","menu_item_delete_topic":"Șterge","topic_delete_warning":"Ești sigur că dorești să șterge această conversație?","menu_item_unblock":"Deblochează","menu_item_block":"Blochează","topic_block_warning":"Ești sigur că dorești să blochezi această conversație?","menu_item_member_delete":"Șterge persoană","menu_item_archive_topic":"Arhivează","action_cancel":"anulează","upload_finishing":"se încarcă...","no_contacts":"Nu ai contacte adăugate :-(","contacts_not_found_short":"Niciun contact găsit după criteriile \'\'{query}\'\'","title_group_members":"Persoanele din grup","title_all_contacts":"Toate Contactele","button_ok":"OK","button_cancel":"Anulează","more_online_members":"+{overflow} mai mult","download_action":"download","label_file_name":"Nume fișier:","label_content_type":"Tip conținut:","label_size":"Size:","chat_invitation":"Ai primit invitație într-o conversație. Accepți?","chat_invitation_accept":"Da, accept","chat_invitation_ignore":"Ignoră","chat_invitation_block":"Blochează","error_invalid_id":"ID Invalid","group_user_id_prompt":"Grup sau user ID","button_subscribe":"Subscribe","topic_name_editing_placeholder":"Numele grupului","channel_prompt":"Acesta este un canal","button_create":"Creează","permission_join":"Participare ({val})","permission_read":"Citire ({val})","permission_write":"Scriere ({val})","permission_pres":"Notificare ({val})","permission_admin":"Aprobare ({val})","permission_share":"Distribuire ({val})","permission_delete":"Ștergere ({val})","permission_owner":"Deținător ({val})","title_permissions":"Permisiuni","message_sending":"se trimite...","message_sending_failed":"eroare","search_placeholder":"Caută după e-mail sau număr telefon...","messaging_disabled_prompt":"Mesageria este dezactivată","new_message_prompt":"Mesaj nou","image_caption_prompt":"Titlul imaginii","file_attachment_too_large":"Dimensiunea fișiterului {size} depășește limita de {limit}.","cannot_initiate_file_upload":"Nu se poate face încărcarea.","tags_not_found":"Niciun tag definit. Adaugă.","tags_editor_no_tags":"Adaugă tag-uri","title_manage_tags":"Administrează"},"ru":{"contacts_not_found":"Чатов нет
¯∖_(ツ)_/¯","full_name_prompt":"Полное имя, напр. Иван Петров","email_prompt":"Email, напр. ivan@example.com","button_sign_up":"Создать аккаунт","label_your_name":"Ваше имя","label_password":"Пароль","password_unchanged_prompt":"Не изменен","label_user_id":"ID:","label_default_access_mode":"Доступ по умолчанию:","label_message_sound":"Звук нового сообщения:","label_push_notifications":"Уведомления:","label_push_notifications_disabled":"Уведомления (требуют HTTPS):","title_tag_manager":"Теги для поиска","button_logout":"Выйти","login_prompt":"Логин","password_prompt":"Пароль","stay_logged_in":"Запомнить","forgot_password_link":"Напомнить пароль","button_sign_in":"Войти","label_client":"Клиент:","label_server":"Сервер:","online_now":"онлайн","last_seen_timestamp":"Был активен","title_not_found":"Не найден","unnamed_topic":"Без названия","messages_not_readable":"нет доступа к сообщениям","tabtitle_find_user":"найти","tabtitle_new_group":"создать","tabtitle_group_by_id":"по id","label_server_to_use":"Использовать сервер:","label_wire_transport":"Соединение:","button_update":"Применить","sidepanel_title_login":"Авторизация","sidepanel_title_register":"Зарегистрироваться","sidepanel_title_settings":"Настройки","sidepanel_title_account_settings":"Настройки аккаунта","sidepanel_title_newtpk":"Новый чат","sidepanel_title_cred":"Подтвердить","sidepanel_title_reset":"Сменить пароль","tags_not_found":"Тегов нет. Добавьте","tags_editor_no_tags":"Добавьте теги","title_manage_tags":"Редактировать","message_sending":"в пути...","message_sending_failed":"ошибка","search_placeholder":"Список, напр. email:alice@example.com, tel:+17025550003...","messaging_disabled_prompt":"Отправка недоступна","new_message_prompt":"Новое сообщение","file_attachment_too_large":"Размер файла {size} превышает {limit} лимит.","cannot_initiate_file_upload":"Ошибка загрузки файла.","search_for_contacts":"Поиск контактов","enter_confirmation_code_prompt":"Код подтверждения, полученный по {method}:","numeric_confirmation_code_prompt":"Только цифры","button_confirm":"Подтвердить","button_ok":"OK","button_cancel":"Отменить","invalid_content":"сообщение не читается","label_file_name":"Имя файла:","label_content_type":"Тип:","label_size":"Размер:","phone_dative":"телефону","email_dative":"емейлу","title_group_members":"Участники","download_action":"скачать","permission_join":"Подписываться ({val})","permission_read":"Читать ({val})","permission_write":"Писать ({val})","permission_pres":"Уведомлять ({val})","permission_admin":"Подтверждать ({val})","permission_share":"Приглашать ({val})","permission_delete":"Удалять ({val})","permission_owner":"Владелец ({val})","title_permissions":"Права доступа","requested_permissions":"Требуются","granted_permissions":"Получены","menu_item_edit_permissions":"Права доступа","label_other_user":"Второй","label_topic_name":"Название","label_private":"Комментарий","private_editing_placeholder":"Виден только вам","label_muting_topic":"Без уведомлений","action_more":"Ещё","label_your_permissions":"Ваши права доступа:","label_permissions":"Права доступа:","label_you":"Вы:","label_default_access":"Права по умолчанию:","label_group_members":"Участники чата:","button_add_members":"Добавить","group_has_no_members":"Нет участников","action_leave_chat":"Уйти из чата","menu_item_info":"Информация","menu_item_clear_messages":"Удалить сообщения","menu_item_clear_messages_for_all":"Удалить для всех","menu_item_delete":"Удалить","menu_item_delete_for_all":"Удалить для всех","menu_item_send_retry":"Отправить заново","menu_item_mute":"Не уведомлять","menu_item_unmute":"Уведомлять","menu_item_delete_topic":"Удалить чат","menu_item_unblock":"Разблокировать","menu_item_block":"Заблокировать","menu_item_member_delete":"Отписать","title_info":"Подробности","new_password_placeholder":"Введите новый пароль","label_reset_password":"Отправить емейл для смены пароля:","credential_email_prompt":"Регистрационный емейл","button_reset":"Изменить","button_send_request":"Отправить","action_cancel":"отменить","upload_finishing":"завершение...","no_contacts":"Ничего нет :-(","contacts_not_found_short":"Нет контактов для запроса \'\'{query}\'\'","title_all_contacts":"Все контакты","error_invalid_id":"Неверный ID","group_user_id_prompt":"ID чата или пользователя","button_subscribe":"Подписаться","topic_name_editing_placeholder":"Название чата","button_create":"Создать","badge_you":"вы","badge_owner":"влад.","update_available":"Есть новая версия приложения.","reload_update":"Обновить","user_not_found":"Не найден","reconnect_countdown":"Нет связи. Подключение через {seconds}…","reconnect_now":"Подключить сейчас.","save_attachment":"сохранить","menu_item_archive_topic":"В архив","archived_contacts":"Чаты в архиве ({count})","sidepanel_title_archive":"Архив чатов","chat_invitation":"Вас пригласили начать новый чат. Как вы хотите поступить?","chat_invitation_accept":"Принять","chat_invitation_ignore":"Игнорировать","chat_invitation_block":"Заблокировать","peers_messaging_disabled":"Чат заблокирован у корреспондента.","enable_peers_messaging":"Разблокировать.","more_online_members":"+еще {overflow}","label_user_contacts":"Конакты:","validate_credential_action":"подтвердить","link_contact_us":"Связаться с нами","link_terms_of_service":"Условия сервиса","link_privacy_policy":"Политика конфиденциальности","action_delete_messages":"Удалить сообщения","action_block_contact":"Заблокировать контакт","action_report_chat":"Сообщить о нарушении","delete_messages_warning":"Вы действительно хотите удалить все сообщения?","leave_chat_warning":"Вы действительно хотите покинуть этот чат?","block_contact_warning":"Вы действительно заблокировать этот контакт?","report_chat_warning":"Вы действительно хотите сообщить о нарушении и заблокировать этот чат?","action_clear_messages":"Удалить сообщения","clear_messages_warning":"Вы действительно хотите удалить все сообщения в чате? Их будет невозможно восстановить.","topic_delete_warning":"Вы действительно хотите удалить этот чат?","topic_block_warning":"Вы действительно хотите заблокировать этот чат?","search_no_results":"Ничего не найдено","deleted_content":"удалено","image_caption_prompt":"Подпись к фото","label_incognito_mode":"Режим инкогнито:","delete_account":"Удалить аккаунт","delete_account_arning":"Вы уверены, что ходите удалить свой аккаунт? Его невозможно будет восстановить.","button_delete_account":"Удалить аккаунт","sidepanel_title_acc_security":"Безопасность","sidepanel_title_acc_notifications":"Уведомления","sidepanel_title_acc_support":"Поддержка","label_sdk":"SDK:","label_server_address":"Адрес сервера:","button_edit":"Редактировать","button_add_another":"Добавить","sidepanel_title_acc_general":"Общие настройки","blocked_contacts_link":"Заблокированные ({count})","sidepanel_title_blocked":"Заблокированные чаты","push_init_failed":"Ошибка инициализации пуш уведомлений","invalid_security_token":"Токен некорректен","no_connection":"Нет связи","code_doesnot_match":"Код не совпадает","channel_prompt":"Создать канал","channel":"канал"},"zh":{"archived_contacts":"已归档联系人 ({count})","contacts_not_found":"你尚无会话
¯∖_(ツ)_/¯","full_name_prompt":"全名,例如张伟","email_prompt":"电子邮件,例如 zhang@example.com","button_sign_up":"注册","label_your_name":"你的姓名","label_password":"密码","password_unchanged_prompt":"未改变","label_user_id":"地址:","label_default_access_mode":"蓦然访问模式:","label_message_sound":"消息提示音:","label_push_notifications":"通知提醒:","label_push_notifications_disabled":"通知提醒(需要 HTTPS):","title_tag_manager":"标签(用户发现)","button_logout":"登出","requested_permissions":"已请求","granted_permissions":"已授予","menu_item_edit_permissions":"编辑权限","label_other_user":"其他","title_info":"信息","label_topic_name":"名称","label_private":"私人评论","private_editing_placeholder":"仅自己可见","label_muting_topic":"已静音:","action_more":"更多","label_your_permissions":"你的权限:","label_permissions":"权限:","label_you":"你:","label_default_access":"默认权限模式:","label_group_members":"群组成员:","button_add_members":"添加成员","group_has_no_members":"无成员","action_leave_chat":"离开","login_prompt":"登录","password_prompt":"密码","stay_logged_in":"保持登录","forgot_password_link":"忘记密码?","button_sign_in":"登录","label_client":"客户端:","label_server":"服务器:","online_now":"在线","last_seen_timestamp":"最后可见","title_not_found":"无法找到","unnamed_topic":"未命名","messages_not_readable":"无消息访问权限","peers_messaging_disabled":"成员间消息已禁用。","enable_peers_messaging":"启用","tabtitle_find_user":"搜索","tabtitle_new_group":"新群组","tabtitle_group_by_id":"通过 id","search_for_contacts":"使用搜索寻找联系人","new_password_placeholder":"输入新密码","label_reset_password":"发送密码重置邮件:","credential_email_prompt":"你的注册邮箱","button_reset":"重置","button_send_request":"发送请求","label_server_to_use":"使用的服务器:","label_wire_transport":"线路传输:","button_update":"更新","sidepanel_title_login":"登录","sidepanel_title_register":"创建账户","sidepanel_title_settings":"设置","sidepanel_title_account_settings":"帐号设定","sidepanel_title_newtpk":"开始新会话","sidepanel_title_cred":"确认凭据","sidepanel_title_reset":"重置密码","sidepanel_title_archive":"已存档会话","update_available":"更新可用。","reload_update":"重新载入","reconnect_countdown":"连接已断开。{seconds} 秒后重新连接…","reconnect_now":"立即尝试","phone_dative":"电话","email_dative":"电子邮件","enter_confirmation_code_prompt":"输入通过{method}发送的验证码:","numeric_confirmation_code_prompt":"仅数字","button_confirm":"确认","save_attachment":"保存","invalid_content":"无效内容","user_not_found":"未找到","badge_you":"你","badge_owner":"所有者","menu_item_info":"信息","menu_item_clear_messages":"清空消息","menu_item_clear_messages_for_all":"全部清除","menu_item_delete":"删除","menu_item_delete_for_all":"全部删除","menu_item_mute":"静音","menu_item_unmute":"取消静音","menu_item_delete_topic":"删除","menu_item_unblock":"取消屏蔽","menu_item_block":"屏蔽","menu_item_member_delete":"移除","menu_item_archive_topic":"归档","action_cancel":"取消","upload_finishing":"正在结束...","no_contacts":"你尚无联系人 (._.)","contacts_not_found_short":"无联系人匹配\'\'{query}\'\'","title_group_members":"群组成员","title_all_contacts":"全部联系人","button_ok":"好","button_cancel":"取消","download_action":"下载","label_file_name":"文件名:","label_content_type":"内容类型:","label_size":"大小:","chat_invitation":"你受邀开始新会话。你想怎么做?","chat_invitation_accept":"接受","chat_invitation_ignore":"忽略","chat_invitation_block":"屏蔽","error_invalid_id":"无效 ID","group_user_id_prompt":"群组或用户 ID","button_subscribe":"订阅","topic_name_editing_placeholder":"群组自由格式名称","button_create":"创建","permission_join":"加入 ({val})","permission_read":"读取 ({val})","permission_write":"写入 ({val})","permission_pres":"获取通知 ({val})","permission_admin":"批准 ({val})","permission_share":"分享 ({val})","permission_delete":"删除 ({val})","permission_owner":"所有者 ({val})","title_permissions":"权限","message_sending":"正在发送...","message_sending_failed":"发送失败","search_placeholder":"列表如 email:alice@example.com, tel:+17025550003...","messaging_disabled_prompt":"消息已禁用","new_message_prompt":"新消息","file_attachment_too_large":"文件大小 {size} 超过 {limit} 限制。","cannot_initiate_file_upload":"无法初始化文件上传。","tags_not_found":"尚未定义标签。添加一些。","tags_editor_no_tags":"添加一些标签","title_manage_tags":"管理标签","more_online_members":"还有{overflow}个","label_user_contacts":"往来:","validate_credential_action":"确认","link_contact_us":"联系我们","link_terms_of_service":"条款和条件","link_privacy_policy":"隐私政策","action_delete_messages":"删除所有帖子","action_block_contact":"屏蔽联系人","delete_messages_warning":"您确定要删除所有消息吗?无法撤消。","leave_chat_warning":"您确定要退出此对话吗?","block_contact_warning":"您确定要阻止此联系人吗?","action_report_chat":"检举垃圾邮件","report_chat_warning":"您确定要停止并报告此对话吗?","action_clear_messages":"删除讯息","clear_messages_warning":"您确定要清除所有消息吗?无法撤消。","topic_delete_warning":"您确定要删除此对话吗?","topic_block_warning":"您确定要阻止此对话吗?","search_no_results":"搜索返回任何结果","deleted_content":"内容已删除","image_caption_prompt":"图片标题","menu_item_send_retry":"重试","label_incognito_mode":"无痕模式:","delete_account":"删除帐户","delete_account_arning":"您确定要删除您的帐户吗?无法撤消。","button_delete_account":"删除帐户","sidepanel_title_acc_security":"安全","sidepanel_title_acc_notifications":"通知","sidepanel_title_acc_support":"支持","label_sdk":"开发包:","label_server_address":"服务器地址:","button_edit":"编辑","button_add_another":"加上另一个","sidepanel_title_acc_general":"常用设定","blocked_contacts_link":"封锁的联络人 ({count})","sidepanel_title_blocked":"被阻止的聊天","push_init_failed":"初始化推送通知失败","invalid_security_token":"无效的安全令牌","no_connection":"无连接","code_doesnot_match":"代码不匹配","channel_prompt":"这是一个频道","channel":"频道"}}'),r=firebase,l=(firebase.messaging,Tinode),c=e.n(l);class d extends s().PureComponent{render(){return this.props.visible?s().createElement("div",{className:"alert-container"},s().createElement("div",{className:"alert"},s().createElement("div",{className:"title"},this.props.title),s().createElement("div",{className:"content"},this.props.content),s().createElement("div",{className:"dialog-buttons"},this.props.onReject?s().createElement("button",{className:"outline",onClick:this.props.onReject},this.props.reject||s().createElement(n.FormattedMessage,{id:"button_cancel"})):null,s().createElement("button",{className:"blue",onClick:this.props.onConfirm},this.props.confirm||s().createElement(n.FormattedMessage,{id:"button_ok"}))))):null}}const h="TinodeWeb/0.16.10",p={hosted:"web.tinode.co",local:"localhost:6060"},m=p.hosted,u=3e3,_="JRWPS",g=13,b=128,v=262144,f=1<<23,E=1024,w=60,C=(0,n.defineMessages)({info:{id:"menu_item_info",defaultMessage:"Info",description:"Show extended topic information"},clear_messages:{id:"menu_item_clear_messages",defaultMessage:"Clear messages",description:"Delete all messages"},clear_for_all:{id:"menu_item_clear_messages_for_all",defaultMessage:"Clear for All",description:"Delete all message(s) for all members"},delete:{id:"menu_item_delete",defaultMessage:"Delete",description:"Delete selected messages"},delete_for_all:{id:"menu_item_delete_for_all",defaultMessage:"Delete for All",description:"Delete selected message(s) for all members"},send_retry:{id:"menu_item_send_retry",defaultMessage:"Retry",description:"Retry sending message"},mute:{id:"menu_item_mute",defaultMessage:"Mute",description:"Turn off notifications"},unmute:{id:"menu_item_unmute",defaultMessage:"Unmute",description:"Turn notifications on"},topic_delete:{id:"menu_item_delete_topic",defaultMessage:"Delete",description:"Delete entire topic"},topic_delete_warning:{id:"topic_delete_warning",defaultMessage:"Are you sure you want to delete this conversation?",description:"Alert warning when deleting entire topic"},unblock:{id:"menu_item_unblock",defaultMessage:"Unblock",description:"Unblock topic or user"},block:{id:"menu_item_block",defaultMessage:"Block",description:"Block topic or user"},topic_block_warning:{id:"topic_block_warning",defaultMessage:"Are you sure you want to block this conversation?",description:"Alert warning when blocking a topic."},member_delete:{id:"menu_item_member_delete",defaultMessage:"Remove",description:"Remove user from topic"},archive:{id:"menu_item_archive_topic",defaultMessage:"Archive",description:"Move topic from the list of active chats to archive"}});class S extends s().Component{constructor(e){super(e);const{formatMessage:t}=e.intl;this.handlePageClick=this.handlePageClick.bind(this),this.handleEscapeKey=this.handleEscapeKey.bind(this),this.handleClick=this.handleClick.bind(this),this.MenuItems={topic_info:{id:"topic_info",title:t(C.info),handler:null},messages_clear:{id:"messages_clear",title:t(C.clear_messages),handler:(s,a)=>e.onShowAlert(t({id:"menu_item_clear_messages"}),t({id:"clear_messages_warning"}),(()=>{this.deleteMessages(!0,!1,s,a)}),null,!0,null)},messages_clear_hard:{id:"messages_clear_hard",title:t(C.clear_for_all),handler:(s,a)=>e.onShowAlert(t({id:"menu_item_clear_messages_for_all"}),t({id:"delete_messages_warning"}),(()=>this.deleteMessages(!0,!0,s,a)),null,!0,null)},message_delete:{id:"message_delete",title:t(C.delete),handler:(e,t)=>this.deleteMessages(!1,!1,e,t)},message_delete_hard:{id:"message_delete_hard",title:t(C.delete_for_all),handler:(e,t)=>this.deleteMessages(!1,!0,e,t)},menu_item_send_retry:{id:"menu_item_send_retry",title:t(C.send_retry),handler:(e,t)=>this.retryMessage(e,t)},topic_unmute:{id:"topic_unmute",title:t(C.unmute),handler:this.topicPermissionSetter.bind(this,"+P")},topic_mute:{id:"topic_mute",title:t(C.mute),handler:this.topicPermissionSetter.bind(this,"-P")},topic_unblock:{id:"topic_unblock",title:t(C.unblock),handler:this.topicPermissionSetter.bind(this,"+JP")},topic_block:{id:"topic_block",title:t(C.block),handler:(s,a)=>e.onShowAlert(t({id:"menu_item_block"}),t(C.topic_block_warning),(()=>this.topicPermissionSetter("-JP",s,a).then((e=>(this.props.onTopicRemoved(s.topicName),e)))),null,!0,null)},topic_delete:{id:"topic_delete",title:t(C.topic_delete),handler:(s,a)=>e.onShowAlert(t({id:"menu_item_delete_topic"}),t(C.topic_delete_warning),(()=>{const e=this.props.tinode.getTopic(s.topicName);if(e)return e.delTopic(!0).catch((e=>{a&&a(e.message,"err")}));console.log("Topic not found: ",s.topicName)}),null,!0,null)},topic_archive:{id:"topic_archive",title:t(C.archive),handler:(e,t)=>{const s=this.props.tinode.getTopic(e.topicName);if(s)return s.archive(!0).catch((e=>{t&&t(e.message,"err")}));console.log("Topic not found: ",e.topicName)}},permissions:{id:"permissions",title:t({id:"menu_item_edit_permissions"}),handler:null},member_delete:{id:"member_delete",title:t(C.member_delete),handler:(e,t)=>{const s=this.props.tinode.getTopic(e.topicName);if(s&&e.user)return s.delSubscription(e.user).catch((e=>{t&&t(e.message,"err")}));console.log("Topic or user not found: '"+e.topicName+"', '"+e.user+"'")}},member_mute:{id:"member_mute",title:t(C.mute),handler:this.topicPermissionSetter.bind(this,"-P")},member_unmute:{id:"member_unmute",title:t(C.unmute),handler:this.topicPermissionSetter.bind(this,"+P")},member_block:{id:"member_block",title:t(C.block),handler:this.topicPermissionSetter.bind(this,"-JP")},member_unblock:{id:"member_unblock",title:t(C.unblock),handler:this.topicPermissionSetter.bind(this,"+JP")}}}componentDidMount(){document.addEventListener("mousedown",this.handlePageClick,!1),document.addEventListener("keyup",this.handleEscapeKey,!1)}componentWillUnmount(){document.removeEventListener("mousedown",this.handlePageClick,!1),document.removeEventListener("keyup",this.handleEscapeKey,!1)}handlePageClick(e){i().findDOMNode(this).contains(e.target)||(e.preventDefault(),e.stopPropagation(),this.props.hide())}handleEscapeKey(e){27===e.keyCode&&this.props.hide()}handleClick(e){e.preventDefault(),e.stopPropagation(),this.props.hide();let t=this.props.items[e.currentTarget.dataset.id];"string"==typeof t&&(t=this.MenuItems[t]),t?this.props.onAction(t.id,t.handler(this.props.params,this.props.onError),this.props.params):console.log("Invalid menu item ID",e.currentTarget.dataset.id)}deleteMessages(e,t,s,a){const i=this.props.tinode.getTopic(s.topicName);if(!i)return void console.log("Topic not found: ",s.topicName);if(!e&&i.cancelSend(s.seq))return;return(e?i.delMessagesAll(t):i.delMessagesList([s.seq],t)).catch((e=>{a&&a(e.message,"err")}))}retryMessage(e,t){const s=this.props.tinode.getTopic(e.topicName);if(!s||!s.flushMessage(e.seq))return;const a=s.createMessage(e.content,!1);return s.publishDraft(a).catch((e=>{t&&t(e.message,"err")}))}topicPermissionSetter(e,t,s){const a=this.props.tinode.getTopic(t.topicName);if(!a)return void console.log("Topic not found",t.topicName);let i=a.updateMode(t.user,e);return s&&(i=i.catch((e=>{s(e.message,"err")}))),i}render(){let e=0,t=[];this.props.items.map((a=>{"string"==typeof a&&(a=this.MenuItems[a]),a&&a.title&&t.push("-"==a.title?s().createElement("li",{className:"separator",key:e}):s().createElement("li",{onClick:this.handleClick,"data-id":e,key:e},a.title)),e++}));const a=g*(.7+2.5*t.length),i={left:(this.props.bounds.right-this.props.clickAt.x<156?this.props.clickAt.x-this.props.bounds.left-156:this.props.clickAt.x-this.props.bounds.left)+"px",top:(this.props.bounds.bottom-this.props.clickAt.y0?a<3?2:a<30?1:0:0;return a.toFixed(i)+" "+t[s]}class y extends s().PureComponent{render(){let e;if(!0===this.props.avatar){const t="grp"==c().topicType(this.props.topic),a=(t?"light-color":"dark-color")+Math.abs(function(e){let t=0;e=""+e;for(let s=0;s
¯∖_(ツ)_/¯",description:"HTML message shown in ContactList when no contacts are found"},(e=>s().createElement(K,{connected:this.props.connected,contacts:this.state.contactList,emptyListMessage:e,topicSelected:this.props.topicSelected,myUserId:this.props.myUserId,showOnline:!0,showUnread:!0,onTopicSelected:this.props.onTopicSelected,showContextMenu:this.props.showContextMenu,onAction:this.handleAction})))}}class He{static setObject(e,t){localStorage.setItem(e,JSON.stringify(t))}static getObject(e){const t=localStorage.getItem(e);return t&&JSON.parse(t)}static updateObject(e,t){const s=this.getObject(e);this.setObject(e,Object.assign(s||{},t))}static removeItem(e){localStorage.removeItem(e)}}class Ve extends s().PureComponent{constructor(e){super(e),this.state={login:"",password:"",email:"",fn:"",imageDataUrl:null,errorCleared:!1,saveToken:He.getObject("keep-logged-in")},this.handleLoginChange=this.handleLoginChange.bind(this),this.handlePasswordChange=this.handlePasswordChange.bind(this),this.handleEmailChange=this.handleEmailChange.bind(this),this.handleFnChange=this.handleFnChange.bind(this),this.handleImageChanged=this.handleImageChanged.bind(this),this.handleToggleSaveToken=this.handleToggleSaveToken.bind(this),this.handleSubmit=this.handleSubmit.bind(this)}handleLoginChange(e){this.setState({login:e.target.value})}handlePasswordChange(e){this.setState({password:e})}handleEmailChange(e){this.setState({email:e.target.value})}handleFnChange(e){this.setState({fn:e.target.value})}handleImageChanged(e){this.setState({imageDataUrl:e})}handleToggleSaveToken(){He.setObject("keep-logged-in",!this.state.saveToken),this.setState({saveToken:!this.state.saveToken})}handleSubmit(e){e.preventDefault(),this.setState({errorCleared:!1}),this.props.onCreateAccount(this.state.login.trim(),this.state.password.trim(),oe(this.state.fn.trim().substring(0,w),this.state.imageDataUrl),{meth:"email",val:this.state.email})}render(){let e="blue";return this.props.disabled&&(e+=" disabled"),s().createElement("form",{className:"panel-form-column",onSubmit:this.handleSubmit},s().createElement("div",{className:"panel-form-row"},s().createElement("div",{className:"panel-form-column"},s().createElement(n.FormattedMessage,{id:"login_prompt"},(e=>s().createElement("input",{type:"text",placeholder:e,autoComplete:"user-name",value:this.state.login,onChange:this.handleLoginChange,required:!0,autoFocus:!0}))),s().createElement(n.FormattedMessage,{id:"password_prompt"},(e=>s().createElement($,{placeholder:e,autoComplete:"new-password",value:this.state.password,onFinished:this.handlePasswordChange,required:!0})))),s().createElement(x,{onImageChanged:this.handleImageChanged,onError:this.props.onError})),s().createElement("div",{className:"panel-form-row"},s().createElement(n.FormattedMessage,{id:"full_name_prompt",defaultMessage:"Full name, e.g. John Doe",description:"Input placeholder for person's full name"},(e=>s().createElement("input",{type:"text",placeholder:e,autoComplete:"name",value:this.state.fn,onChange:this.handleFnChange,required:!0})))),s().createElement("div",{className:"panel-form-row"},s().createElement(n.FormattedMessage,{id:"email_prompt",defaultMessage:"Email, e.g. jdoe@example.com",description:"Input placeholder for email entry"},(e=>s().createElement("input",{type:"email",placeholder:e,autoComplete:"email",value:this.state.email,onChange:this.handleEmailChange,required:!0})))),s().createElement("div",{className:"panel-form-row"},s().createElement(R,{id:"save-token",name:"save-token",checked:this.state.saveToken,onChange:this.handleToggleSaveToken}),s().createElement(n.FormattedMessage,{id:"stay_logged_in"},(e=>s().createElement("label",{htmlFor:"save-token"}," ",e)))),s().createElement("div",{className:"dialog-buttons"},s().createElement("button",{className:e,type:"submit"},s().createElement(n.FormattedMessage,{id:"button_sign_up",defaultMessage:"Sign up",description:"Create account button [Sign Up]"}))))}}class Ke extends s().Component{constructor(e){super(e);const t=this.props.tinode.getMeTopic();this.state={fullName:t.public?t.public.fn:void 0,avatar:P(t.public?t.public.photo:null)}}render(){return s().createElement("div",{className:"scrollable-panel"},s().createElement("div",{className:"panel-form-row"},s().createElement("div",{className:"panel-form-column"},s().createElement("label",{className:"small"},s().createElement(n.FormattedMessage,{id:"label_your_name",defaultMessage:"Your name",description:"Label for full name editing"})),s().createElement("div",{className:"large"},this.state.fullName),s().createElement("div",null,s().createElement("label",{className:"small"},s().createElement(n.FormattedMessage,{id:"label_user_id",defaultMessage:"ID:",description:"Label for user address (ID)"}))," ",s().createElement("tt",null,this.props.myUserId))),s().createElement(x,{avatar:this.state.avatar,readOnly:!this.state.owner,uid:this.props.myUserId,title:this.state.fullName})),s().createElement("div",{className:"panel-form-row"},s().createElement("a",{href:"#",className:"flat-button",onClick:e=>{e.preventDefault(),this.props.onBasicNavigate("general")}},s().createElement("i",{className:"material-icons"},"edit")," ",s().createElement(n.FormattedMessage,{id:"button_edit",defaultMessage:"Edit",description:"Call to action [Edit]"}))),s().createElement("div",{className:"hr"}),s().createElement("div",{className:"panel-form-column"},s().createElement("a",{href:"#",className:"flat-button",onClick:e=>{e.preventDefault(),this.props.onBasicNavigate("notif")}},s().createElement("i",{className:"material-icons"},"notifications")," ",s().createElement(n.FormattedMessage,{id:"sidepanel_title_acc_notifications"})),s().createElement("a",{href:"#",className:"flat-button",onClick:e=>{e.preventDefault(),this.props.onBasicNavigate("security")}},s().createElement("i",{className:"material-icons"},"security")," ",s().createElement(n.FormattedMessage,{id:"sidepanel_title_acc_security"})),s().createElement("a",{href:"#",className:"flat-button",onClick:e=>{e.preventDefault(),this.props.onBasicNavigate("support")}},s().createElement("i",{className:"material-icons"},"contact_support")," ",s().createElement(n.FormattedMessage,{id:"sidepanel_title_acc_support"}))))}}class We extends s().Component{constructor(e){super(e);const t=this.props.tinode.getMeTopic();this.state={fullName:t.public?t.public.fn:void 0,avatar:P(t.public?t.public.photo:null),tags:t.tags(),credentials:t.getCredentials()||[],addCredActive:!1,addCredInvalid:!1,newCred:"",previousOnTags:t.onTagsUpdated},this.tnNewTags=this.tnNewTags.bind(this),this.tnCredsUpdated=this.tnCredsUpdated.bind(this),this.handleFullNameUpdate=this.handleFullNameUpdate.bind(this),this.handleImageChanged=this.handleImageChanged.bind(this),this.handleCredChange=this.handleCredChange.bind(this),this.handleCredKeyDown=this.handleCredKeyDown.bind(this),this.handleCredEntered=this.handleCredEntered.bind(this),this.handleTagsUpdated=this.handleTagsUpdated.bind(this)}componentDidMount(){const e=this.props.tinode.getMeTopic();e.onCredsUpdated=this.tnCredsUpdated,e.onTagsUpdated=this.tnNewTags}componentWillUnmount(){const e=this.props.tinode.getMeTopic();e.onTagsUpdated=this.state.previousOnTags,e.onCredsUpdated=void 0}tnNewTags(e){this.setState({tags:e})}tnCredsUpdated(e){this.setState({credentials:e||[]})}handleFullNameUpdate(e){(e=e.trim().substring(0,w))&&(this.setState({fullName:e}),this.props.onUpdateAccount(void 0,oe(e,null)))}handleImageChanged(e){this.setState({avatar:e}),this.props.onUpdateAccount(void 0,oe(null,e||c().DEL_CHAR))}handleCredChange(e){this.setState({newCred:e.target.value,addCredInvalid:!1})}handleCredKeyDown(e){27===e.keyCode?this.setState({newCred:"",addCredActive:!1}):13===e.keyCode&&this.handleCredEntered(e)}handleCredEntered(e){let t=this.state.newCred.trim();if(!t)return void this.setState({addCredActive:!1,addCredInvalid:!1});let s,a=function(e){return e=e.trim(),/^(?:\+?(\d{1,3}))?[- (.]*(\d{3})[- ).]*(\d{3})[- .]*(\d{2})[- .]*(\d{2})?$/.test(e)?e.replace(/[- ().]*/,""):null}(t);a?s="tel":(a=function(e){return e=e.trim(),/^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+$/.test(e)?e:null}(t),a&&(s="email")),s?(this.props.onCredAdd(s,a),this.setState({addCredActive:!1,newCred:""})):this.setState({addCredInvalid:!0})}handleTagsUpdated(e){re(this.state.tags.slice(0),e.slice(0))||this.props.onUpdateTags(e)}render(){const e=[];return this.state.credentials.map((t=>{e.push(s().createElement("div",{key:t.meth+":"+t.val+":"+t.done},t.meth,": ",s().createElement("tt",null,t.val),s().createElement("span",null," ",t.done?null:s().createElement("a",{href:"#",onClick:e=>{e.preventDefault(),this.props.onCredConfirm(t.meth,t.val)}},s().createElement(n.FormattedMessage,{id:"validate_credential_action",defaultMessage:"confirm",description:"Validate credentail call to action"}))," ",s().createElement("a",{href:"#",onClick:e=>{e.preventDefault(),this.props.onCredDelete(t.meth,t.val)}},s().createElement("i",{className:"material-icons gray"},"delete_outline")))))})),s().createElement("div",{className:"scrollable-panel"},s().createElement("div",{className:"panel-form-row"},s().createElement("div",{className:"panel-form-column"},s().createElement("label",{className:"small"},s().createElement(n.FormattedMessage,{id:"label_your_name"})),s().createElement("div",null,s().createElement(n.FormattedMessage,{id:"full_name_prompt"},(e=>s().createElement(ee,{placeholder:e,value:this.state.fullName,onFinished:this.handleFullNameUpdate}))))),s().createElement(x,{avatar:this.state.avatar,uid:this.props.myUserId,title:this.state.fullName,onImageChanged:this.handleImageChanged,onError:this.props.onError})),s().createElement("div",{className:"hr"}),s().createElement(n.FormattedMessage,{id:"title_tag_manager",defaultMessage:"Tags (user discovery)",description:"Section title for TagManager"},(e=>s().createElement(ce,{title:e,activated:!1,tags:this.state.tags,tinode:this.props.tinode,onSubmit:this.handleTagsUpdated}))),s().createElement("div",{className:"hr"}),s().createElement("div",{className:"panel-form-column"},s().createElement("label",{className:"small"},s().createElement(n.FormattedMessage,{id:"label_user_contacts",defaultMessage:"Contacts:",description:"Label for user contacts"})),s().createElement("div",{className:"quoted"},e,this.state.addCredActive?s().createElement("input",{type:"text",value:this.state.value,className:this.state.addCredInvalid?"invalid":null,placeholder:"Phone number or email",required:"required",autoFocus:!0,onChange:this.handleCredChange,onKeyDown:this.handleCredKeyDown,onBlur:this.handleCredEntered}):null,s().createElement("div",null,s().createElement("a",{href:"#",onClick:e=>{e.preventDefault(),this.setState({addCredActive:!0})}},s().createElement("i",{className:"material-icons"},"add"),s().createElement(n.FormattedMessage,{id:"button_add_another",defaultMessage:"Add another",description:"Call to action [+ add another]"}))))))}}class Ge extends s().PureComponent{constructor(e){super(e),this.handleCheckboxClick=this.handleCheckboxClick.bind(this)}handleCheckboxClick(e,t){"sound"==e?this.props.onToggleMessageSounds(t):"alert"==e?this.props.onTogglePushNotifications(t):"incognito"==e&&this.props.onToggleIncognitoMode(t)}render(){return s().createElement("div",{className:"scrollable-panel"},s().createElement("div",{className:"panel-form-row"},s().createElement("label",{htmlFor:"message-sound"},s().createElement(n.FormattedMessage,{id:"label_message_sound",defaultMessage:"Message sound:",description:"Label for message sounds toggle"})),s().createElement(R,{name:"sound",id:"message-sound",checked:this.props.messageSounds,onChange:this.handleCheckboxClick})),s().createElement("div",{className:"panel-form-row"},s().createElement("label",{htmlFor:"desktop-alerts"},this.props.desktopAlertsEnabled?s().createElement(n.FormattedMessage,{id:"label_push_notifications",defaultMessage:"Notification alerts:",description:"Label for push notifications switch"}):s().createElement(n.FormattedMessage,{id:"label_push_notifications_disabled",defaultMessage:"Notification alerts (requires HTTPS):",description:"Label for push notifications switch"})),s().createElement(R,{name:"alert",id:"desktop-alerts",checked:this.props.desktopAlerts,onChange:this.props.desktopAlertsEnabled?this.handleCheckboxClick:null})),s().createElement("div",{className:"panel-form-row"},s().createElement("label",{htmlFor:"incognito-mode"},s().createElement(n.FormattedMessage,{id:"label_incognito_mode",defaultMessage:"Incognito mode:",description:"Label for incognito mode toggle"})),s().createElement(R,{name:"incognito",id:"incognito-mode",checked:this.props.incognitoMode,onChange:this.handleCheckboxClick})))}}const Je=(0,n.defineMessages)({delete_account:{id:"delete_account",defaultMessage:"Delete account",description:"Title for delete account warning"},delete_account_warning:{id:"delete_account_arning",defaultMessage:"Are you sure you want to delete your account? It cannot be undone.",description:"Warning message when deleting an account"}});class Qe extends s().Component{constructor(e){super(e);const t=this.props.tinode.getMeTopic();let s=0;t.contacts((e=>{e.acs&&!e.acs.isJoiner()&&s++}));const a=t.getDefaultAccess();this.state={auth:a?a.auth:null,anon:a?a.anon:null,showPermissionEditorFor:void 0,blockedCount:s},this.handlePasswordUpdate=this.handlePasswordUpdate.bind(this),this.handleLaunchPermissionsEditor=this.handleLaunchPermissionsEditor.bind(this),this.handleHidePermissionsEditor=this.handleHidePermissionsEditor.bind(this),this.handlePermissionsChanged=this.handlePermissionsChanged.bind(this),this.handleDeleteAccount=this.handleDeleteAccount.bind(this)}handlePasswordUpdate(e){this.setState({password:e}),this.props.onUpdateAccount(e)}handleLaunchPermissionsEditor(e){this.setState({showPermissionEditorFor:e,editedPermissions:this.state[e]})}handleHidePermissionsEditor(){this.setState({showPermissionEditorFor:void 0})}handlePermissionsChanged(e){let t={};t[this.state.showPermissionEditorFor]=e,this.props.onUpdateAccount(void 0,void 0,t);let s={showPermissionEditorFor:void 0};s[this.state.showPermissionEditorFor]=e,this.setState(s)}handleDeleteAccount(e){e.preventDefault();const{formatMessage:t}=this.props.intl;this.props.onShowAlert(t(Je.delete_account),t(Je.delete_account_warning),(()=>{this.props.onDeleteAccount()}),null,!0,null)}render(){return s().createElement(s().Fragment,null,this.state.showPermissionEditorFor?s().createElement(ie,{mode:this.state.editedPermissions,skip:"O",onSubmit:this.handlePermissionsChanged,onCancel:this.handleHidePermissionsEditor}):s().createElement("div",{className:"scrollable-panel"},s().createElement("div",{className:"panel-form-column"},s().createElement("label",{className:"small"},s().createElement(n.FormattedMessage,{id:"label_password",defaultMessage:"Password",description:"Label for password editing"})),s().createElement("div",null,s().createElement(n.FormattedMessage,{id:"password_unchanged_prompt",defaultMessage:"Unchanged",description:"Message in editor while password is unchanged"},(e=>s().createElement(ee,{placeholder:e,type:"password",onFinished:this.handlePasswordUpdate}))))),s().createElement("div",{className:"hr"}),s().createElement("div",{className:"panel-form-column"},s().createElement("a",{href:"#",className:"red flat-button",onClick:e=>{e.preventDefault(),this.props.onLogout()}},s().createElement("i",{className:"material-icons"},"exit_to_app")," ",s().createElement(n.FormattedMessage,{id:"button_logout",defaultMessage:"Logout",description:"Button [Logout]"})),s().createElement("a",{href:"#",className:"red flat-button",onClick:e=>{this.handleDeleteAccount(e)}},s().createElement("i",{className:"material-icons"},"delete")," ",s().createElement(n.FormattedMessage,{id:"button_delete_account",defaultMessage:"Delete account",description:"Button [Delete account]"}))),s().createElement("div",{className:"hr"}),s().createElement("div",{className:"panel-form-column"},s().createElement("div",null,s().createElement("label",{className:"small"},s().createElement(n.FormattedMessage,{id:"label_default_access_mode",defaultMessage:"Default access mode:",description:"Label for default access mode"}))),s().createElement("div",{className:"quoted"},s().createElement("div",null,"Auth: ",s().createElement("tt",{className:"clickable",onClick:this.handleLaunchPermissionsEditor.bind(this,"auth")},this.state.auth)),s().createElement("div",null,"Anon: ",s().createElement("tt",{className:"clickable",onClick:this.handleLaunchPermissionsEditor.bind(this,"anon")},this.state.anon)))),this.state.blockedCount>0?s().createElement(s().Fragment,null,s().createElement("div",{className:"hr"}),s().createElement("div",{className:"panel-form-row"},s().createElement("i",{className:"material-icons"},"block")," ",s().createElement("a",{href:"#",className:"gray",onClick:e=>{e.preventDefault(),this.props.onShowBlocked()}},s().createElement(n.FormattedMessage,{id:"blocked_contacts_link",defaultMessage:"Blocked contacts ({count})",values:{count:this.state.blockedCount},description:"Blocked contacts link"})))):null))}}var Ye=(0,n.injectIntl)(Qe);class Ze extends s().PureComponent{render(){return s().createElement("div",{className:"scrollable-panel"},s().createElement("div",{className:"panel-form-column"},s().createElement("a",{href:"email:info@tinode.co",className:"flat-button",target:"_blank"},s().createElement("i",{className:"material-icons"},"email")," ",s().createElement(n.FormattedMessage,{id:"link_contact_us",defaultMessage:"Contact Us",description:"Ancor text for contacting us by email"})),s().createElement("a",{href:"https://tinode.co/terms.html",className:"flat-button",target:"_blank"},s().createElement("i",{className:"material-icons"},"description")," ",s().createElement(n.FormattedMessage,{id:"link_terms_of_service",defaultMessage:"Terms of Service",description:"Ancor text for terms of service link"})),s().createElement("a",{href:"https://tinode.co/privacy.html",className:"flat-button",target:"_blank"},s().createElement("i",{className:"material-icons"},"policy")," ",s().createElement(n.FormattedMessage,{id:"link_privacy_policy",defaultMessage:"Privacy Policy",description:"Ancor text for privacy policy link"}))),s().createElement("div",{className:"hr"}),s().createElement("div",{className:"panel-form-column"},s().createElement("div",{className:"panel-form-row"},s().createElement("label",{className:"small"},s().createElement(n.FormattedMessage,{id:"label_client"})),h),s().createElement("div",{className:"panel-form-row"},s().createElement("label",{className:"small"},s().createElement(n.FormattedMessage,{id:"label_sdk",defaultMessage:"SDK:"})),c().getLibrary()),s().createElement("div",{className:"panel-form-row"},s().createElement("label",{className:"small"},s().createElement(n.FormattedMessage,{id:"label_server"})),this.props.serverVersion),s().createElement("div",{className:"panel-form-row"},s().createElement("label",{className:"small"},s().createElement(n.FormattedMessage,{id:"label_server_address",defaultMessage:"Server address:"})),this.props.serverAddress)))}}class Xe extends s().Component{constructor(e){super(e),this.state={login:e.login,password:"",hostName:e.serverAddress,saveToken:He.getObject("keep-logged-in")},this.handleLoginChange=this.handleLoginChange.bind(this),this.handlePasswordChange=this.handlePasswordChange.bind(this),this.handleToggleSaveToken=this.handleToggleSaveToken.bind(this),this.handleSubmit=this.handleSubmit.bind(this)}handleLoginChange(e){this.setState({login:e.target.value})}handlePasswordChange(e){this.setState({password:e.target.value})}handleToggleSaveToken(){He.setObject("keep-logged-in",!this.state.saveToken),this.setState({saveToken:!this.state.saveToken})}handleSubmit(e){e.preventDefault(),this.props.onLogin(this.state.login.trim(),this.state.password.trim())}render(){var e="blue";return this.props.disabled&&(e+=" disabled"),s().createElement("form",{id:"login-form",onSubmit:this.handleSubmit},s().createElement(n.FormattedMessage,{id:"login_prompt",defaultMessage:"Login",description:"Login placeholder in LoginView"},(e=>s().createElement("input",{type:"text",id:"inputLogin",placeholder:e,autoComplete:"username",autoCorrect:"off",autoCapitalize:"none",value:this.state.login,onChange:this.handleLoginChange,required:!0,autoFocus:!0}))),s().createElement(n.FormattedMessage,{id:"password_prompt",defaultMessage:"Password",description:"Password placeholder in LoginView"},(e=>s().createElement($,{type:"password",id:"inputPassword",placeholder:e,autoComplete:"current-password",value:this.state.password,onChange:this.handlePasswordChange,required:!0}))),s().createElement("div",{className:"panel-form-row"},s().createElement(R,{id:"save-token",name:"save-token",checked:this.state.saveToken,onChange:this.handleToggleSaveToken}),s().createElement("label",{htmlFor:"save-token"}," ",s().createElement(n.FormattedMessage,{id:"stay_logged_in",defaultMessage:"Stay logged in",description:"Label for a checkbox"})),s().createElement("a",{href:"#reset"},s().createElement(n.FormattedMessage,{id:"forgot_password_link",defaultMessage:"Forgot password?",description:"Link to Reset password form"}))),s().createElement("div",{className:"dialog-buttons"},s().createElement("button",{className:e,type:"submit"},s().createElement(n.FormattedMessage,{id:"button_sign_in",defaultMessage:"Sign in",description:"Button [Sign In]"}))))}}const $e=(0,n.defineMessages)({invalid_id:{id:"error_invalid_id",defaultMessage:"Invalid ID",description:"Error message"}});class et extends s().PureComponent{constructor(e){super(e),this.state={groupId:""},this.handleChange=this.handleChange.bind(this),this.handleKeyPress=this.handleKeyPress.bind(this),this.handleSubmit=this.handleSubmit.bind(this)}handleChange(e){this.setState({groupId:e.target.value})}handleKeyPress(e){"Enter"===e.key&&this.handleSubmit(e)}handleSubmit(e){if(e.preventDefault(),this.state.groupId){var t=this.state.groupId.trim();t.length>3&&("usr"==t.substr(0,3)||"grp"==t.substr(0,3))?this.props.onSubmit(t):this.props.onError(this.props.intl.formatMessage($e.invalid_id),"err")}}render(){return s().createElement("div",{className:"panel-form"},s().createElement("div",{className:"panel-form-row"},s().createElement(n.FormattedMessage,{id:"group_user_id_prompt",defaultMessage:"Group or User ID",description:"Prompt for entering user or group ID"},(e=>s().createElement("input",{type:"text",placeholder:e,value:this.state.groupId,onChange:this.handleChange,onKeyPress:this.handleKeyPress,required:!0,autoFocus:!0})))),s().createElement("div",{className:"dialog-buttons"},s().createElement("button",{className:"blue",onClick:this.handleSubmit},s().createElement(n.FormattedMessage,{id:"button_subscribe",defaultMessage:"Subscribe",description:"Button [Subscribe]"}))))}}var tt=(0,n.injectIntl)(et);class st extends s().PureComponent{constructor(e){super(e),this.state={fn:"",private:"",imageDataUrl:null,tags:[],isChannel:!1},this.handleFnChange=this.handleFnChange.bind(this),this.handlePrivateChange=this.handlePrivateChange.bind(this),this.handleImageChanged=this.handleImageChanged.bind(this),this.handleTagsChanged=this.handleTagsChanged.bind(this),this.handleChannelToggle=this.handleChannelToggle.bind(this),this.handleSubmit=this.handleSubmit.bind(this)}handleFnChange(e){this.setState({fn:e.target.value})}handlePrivateChange(e){this.setState({private:e.target.value})}handleImageChanged(e){this.setState({imageDataUrl:e})}handleTagsChanged(e){this.setState({tags:e})}handleChannelToggle(){this.setState({isChannel:!this.state.isChannel})}handleSubmit(e){e.preventDefault();const t=this.state.fn.trim().substring(0,w),s=this.state.private.trim().substring(0,w);t&&this.props.onSubmit(t,this.state.imageDataUrl,s,this.state.tags,this.state.isChannel)}render(){var e="blue";return this.props.disabled&&(e+=" disabled"),s().createElement("form",{className:"panel-form",onSubmit:this.handleSubmit},s().createElement("div",{className:"panel-form-row"},s().createElement("div",{className:"panel-form-column"},s().createElement("label",{className:"small",htmlFor:"new-topic-fn"},s().createElement(n.FormattedMessage,{id:"label_topic_name"})),s().createElement(n.FormattedMessage,{id:"topic_name_editing_placeholder",defaultMessage:"Freeform name of the group",description:"Prompt for entering topic name"},(e=>s().createElement("input",{type:"text",id:"new-topic-fn",placeholder:e,value:this.state.fn,onChange:this.handleFnChange,autoFocus:!0,required:!0}))),s().createElement("br",null),s().createElement("label",{className:"small",htmlFor:"new-topic-priv"},s().createElement(n.FormattedMessage,{id:"label_private"})),s().createElement(n.FormattedMessage,{id:"private_editing_placeholder"},(e=>s().createElement("input",{type:"text",id:"new-topic-priv",placeholder:e,value:this.state.private,onChange:this.handlePrivateChange})))),s().createElement(x,{onError:this.props.onError,onImageChanged:this.handleImageChanged})),s().createElement("div",{className:"panel-form-row"},s().createElement(R,{checked:this.state.isChannel,onChange:this.handleChannelToggle})," ",s().createElement("label",{onClick:this.handleChannelToggle},s().createElement(n.FormattedMessage,{id:"channel_prompt",defaultMessage:"This is a channel",description:"Checkbox label when creating a channel"}))),s().createElement(n.FormattedMessage,{id:"title_tag_manager"},(e=>s().createElement(ce,{tags:this.state.tags,activated:!0,onTagsChanged:this.handleTagsChanged,tinode:this.props.tinode,title:e}))),s().createElement("div",{className:"dialog-buttons"},s().createElement("button",{className:e},s().createElement(n.FormattedMessage,{id:"button_create",defaultMessage:"Create",description:"Button [Create]"}))))}}class at extends s().PureComponent{constructor(e){super(e),this.state={edited:!1,search:""},this.handleSearchChange=this.handleSearchChange.bind(this),this.handleSearch=this.handleSearch.bind(this),this.handleClear=this.handleClear.bind(this),this.handleKeyDown=this.handleKeyDown.bind(this)}componentWillUnmount(){this.state.edited&&(this.setState({search:"",edited:!1}),this.props.onSearchContacts(c().DEL_CHAR))}handleSearchChange(e){this.setState({search:e.target.value})}handleSearch(e){e.preventDefault();var t=this.state.search.trim();this.setState({edited:t.length>0}),this.props.onSearchContacts(t.length>0?t:c().DEL_CHAR)}handleClear(e){e.preventDefault(),this.state.edited&&this.props.onSearchContacts(c().DEL_CHAR),this.setState({search:"",edited:!1})}handleKeyDown(e){"Enter"===e.key?this.handleSearch(e):"Escape"===e.key&&this.handleClear()}render(){return s().createElement("div",{className:"panel-form"},s().createElement("div",{className:"panel-form-row"},s().createElement("i",{className:"material-icons search"},"search"),s().createElement(n.FormattedMessage,{id:"search_placeholder",defaultMessage:"List like email:alice@example.com, tel:17025550003...",description:"Placeholder in contacts search field"},(e=>s().createElement("input",{className:"search",type:"text",placeholder:e,value:this.state.search,onChange:this.handleSearchChange,onKeyDown:this.handleKeyDown,required:!0,autoFocus:!0}))),s().createElement("a",{href:"#",onClick:this.handleClear},s().createElement("i",{className:"material-icons"},"close"))))}}const it=(0,n.defineMessages)({search_for_contacts:{id:"search_for_contacts",defaultMessage:"Use search to find contacts",description:"Text shown in contacts view when user entered no search query."},search_no_results:{id:"search_no_results",defaultMessage:"Search returned no results",description:"Text shown in contacts view when query returned no results."}});class nt extends s().Component{constructor(e){super(e),this.state={tabSelected:"p2p",searchQuery:null},this.handleTabClick=this.handleTabClick.bind(this),this.handleSearchContacts=this.handleSearchContacts.bind(this),this.handleContactSelected=this.handleContactSelected.bind(this),this.handleNewGroupSubmit=this.handleNewGroupSubmit.bind(this),this.handleGroupByID=this.handleGroupByID.bind(this)}componentDidMount(){this.props.onInitFind()}handleTabClick(e){e.preventDefault(),Pe.navigateTo(Pe.addUrlParam(window.location.hash,"tab",e.currentTarget.dataset.id)),this.setState({tabSelected:e.currentTarget.dataset.id})}handleSearchContacts(e){this.props.onSearchContacts(e),this.setState({searchQuery:c().isNullValue(e)?null:e})}handleContactSelected(e){"p2p"===this.state.tabSelected&&(Pe.navigateTo(Pe.removeUrlParam(window.location.hash,"tab")),this.props.onCreateTopic(e))}handleNewGroupSubmit(e,t,s,a,i){Pe.navigateTo(Pe.removeUrlParam(window.location.hash,"tab")),this.props.onCreateTopic(void 0,oe(e,t),s,a,i)}handleGroupByID(e){Pe.navigateTo(Pe.removeUrlParam(window.location.hash,"tab")),this.props.onCreateTopic(e)}render(){const{formatMessage:e}=this.props.intl,t=e(this.state.searchQuery?it.search_no_results:it.search_for_contacts);return s().createElement("div",{className:"flex-column"},s().createElement("ul",{className:"tabbar"},s().createElement("li",{className:"p2p"===this.state.tabSelected?"active":null},s().createElement("a",{href:"#","data-id":"p2p",onClick:this.handleTabClick},s().createElement(n.FormattedMessage,{id:"tabtitle_find_user",defaultMessage:"find",description:"Tab title Find"}))),s().createElement("li",{className:"grp"===this.state.tabSelected?"active":null},s().createElement("a",{href:"#","data-id":"grp",onClick:this.handleTabClick},s().createElement(n.FormattedMessage,{id:"tabtitle_new_group",defaultMessage:"new group",description:"Tab title New Group"}))),s().createElement("li",{className:"byid"===this.state.tabSelected?"active":null},s().createElement("a",{href:"#","data-id":"byid",onClick:this.handleTabClick},s().createElement(n.FormattedMessage,{id:"tabtitle_group_by_id",defaultMessage:"by id",description:"Tab title Find topic by ID"})))),"grp"===this.state.tabSelected?s().createElement(st,{tinode:this.props.tinode,onSubmit:this.handleNewGroupSubmit}):"byid"===this.state.tabSelected?s().createElement(tt,{onSubmit:this.handleGroupByID,onError:this.props.onError}):s().createElement("div",{className:"flex-column"},s().createElement(at,{type:"p2p",onSearchContacts:this.handleSearchContacts}),s().createElement(K,{contacts:this.props.searchResults,myUserId:this.props.myUserId,emptyListMessage:t,showOnline:!1,showUnread:!1,showContextMenu:!1,onTopicSelected:this.handleContactSelected})))}}var ot=(0,n.injectIntl)(nt);class rt extends s().PureComponent{constructor(e){super(e),this.state={email:"",password:""},this.handleSubmit=this.handleSubmit.bind(this),this.handleEmailChange=this.handleEmailChange.bind(this),this.handlePasswordChange=this.handlePasswordChange.bind(this)}componentDidMount(){let e=Pe.parseUrlHash(window.location.hash);this.setState({token:e.params.token,scheme:e.params.scheme})}handleSubmit(e){e.preventDefault(),this.state.token?this.props.onReset(this.state.scheme,this.state.password.trim(),this.state.token):this.props.onRequest("email",this.state.email.trim())}handleEmailChange(e){this.setState({email:e.target.value})}handlePasswordChange(e){this.setState({password:e.target.value})}render(){let e=this.state.token&&this.state.scheme;return s().createElement("form",{id:"password-reset-form",onSubmit:this.handleSubmit},e?s().createElement(n.FormattedMessage,{id:"new_password_placeholder",defaultMessage:"Enter new password",description:"Placeholder for entering new password"},(e=>s().createElement($,{placeholder:e,autoComplete:"new-password",value:this.state.password,required:!0,autoFocus:!0,onChange:this.handlePasswordChange}))):s().createElement(s().Fragment,null,s().createElement("label",{htmlFor:"inputEmail"},s().createElement(n.FormattedMessage,{id:"label_reset_password",defaultMessage:"Send a password reset email:",description:"Label for password reset field"})),s().createElement(n.FormattedMessage,{id:"credential_email_prompt",defaultMessage:"Your registration email",description:"Placeholder for entering email"},(e=>s().createElement("input",{type:"email",id:"inputEmail",placeholder:e,autoComplete:"email",value:this.state.email,onChange:this.handleEmailChange,required:!0,autoFocus:!0})))),s().createElement("div",{className:"dialog-buttons"},s().createElement("button",{className:"blue",type:"submit"},e?s().createElement(n.FormattedMessage,{id:"button_reset",defaultMessage:"Reset",description:"Button [Reset]"}):s().createElement(n.FormattedMessage,{id:"button_send_request",defaultMessage:"Send request",description:"Button [Send request]"}))))}}class lt extends s().PureComponent{constructor(e){super(e),this.state={hostName:e.serverAddress,changed:!1},this.handleHostNameChange=this.handleHostNameChange.bind(this),this.handleEditingFinished=this.handleEditingFinished.bind(this)}handleHostNameChange(e){this.setState({hostName:e.target.value,changed:!0})}handleEditingFinished(){this.state.changed&&(this.setState({changed:!1}),this.props.onServerAddressChange(this.state.hostName.trim()))}render(){var e=[];for(let t in p){let a=p[t];e.push(s().createElement("option",{key:a,value:a}))}return s().createElement("div",{className:"panel-form-row"},s().createElement("input",{type:"search",id:"host-name",placeholder:this.props.hostName,list:"known-hosts",className:"quoted",value:this.state.hostName,onChange:this.handleHostNameChange,onBlur:this.handleEditingFinished,required:!0}),s().createElement("datalist",{id:"known-hosts"},e))}}class ct extends s().PureComponent{constructor(e){super(e),this.state={transport:e.transport||"def",serverAddress:e.serverAddress},this.handleSubmit=this.handleSubmit.bind(this),this.handleTransportSelected=this.handleTransportSelected.bind(this),this.handleServerAddressChange=this.handleServerAddressChange.bind(this)}handleSubmit(e){e.preventDefault(),this.props.onUpdate({transport:this.state.transport,serverAddress:this.state.serverAddress})}handleTransportSelected(e){this.setState({transport:e.currentTarget.value})}handleServerAddressChange(e){this.setState({serverAddress:e})}render(){const e={def:"default",ws:"websocket",lp:"long polling"};var t=[],a=this;return["def","ws","lp"].map((function(i){var n="transport-"+i,o=e[i];t.push(s().createElement("li",{key:i},s().createElement("input",{type:"radio",id:n,name:"transport-select",value:i,checked:a.state.transport===i,onChange:a.handleTransportSelected}),s().createElement("label",{htmlFor:n},o)))})),s().createElement("form",{id:"settings-form",className:"panel-form",onSubmit:this.handleSubmit},s().createElement("div",{className:"panel-form-row"},s().createElement("label",{className:"small"},s().createElement(n.FormattedMessage,{id:"label_server_to_use",defaultMessage:"Server to use:",description:"Label for server selector in SettingsView"}))),s().createElement(lt,{serverAddress:this.state.serverAddress,onServerAddressChange:this.handleServerAddressChange}),s().createElement("div",{className:"panel-form-row"},s().createElement("label",{className:"small"},s().createElement(n.FormattedMessage,{id:"label_wire_transport",defaultMessage:"Wire transport:",description:"Label for wire transport selection in SettingsView"}))),s().createElement("div",{className:"panel-form-row"},s().createElement("ul",{className:"quoted"},t)),s().createElement("div",{className:"dialog-buttons"},s().createElement("button",{type:"submit",className:"blue"},s().createElement(n.FormattedMessage,{id:"button_update",defaultMessage:"Update",description:"Button [Update]"}))))}}const dt=(0,n.defineMessages)({phone:{id:"phone_dative",defaultMessage:"phone",description:"Dative case of 'phone', i.e. 'phone' in 'by phone'"},email:{id:"email_dative",defaultMessage:"email",description:"Dative case of 'email', i.e. 'email' in 'by email'"}});class ht extends s().PureComponent{constructor(e){super(e),this.state={code:e.credCode||""},this.handleChange=this.handleChange.bind(this),this.handleKeyPress=this.handleKeyPress.bind(this),this.handleSubmit=this.handleSubmit.bind(this),this.handleCancel=this.handleCancel.bind(this)}handleChange(e){this.setState({code:e.target.value})}handleKeyPress(e){"Enter"===e.key?this.handleSubmit(e):"Escape"==e.key&&this.handleCancel(e)}handleSubmit(e){e.preventDefault(),this.state.code&&this.state.code.trim()&&this.props.onSubmit(this.props.credMethod,this.state.code.trim())}handleCancel(e){e.preventDefault(),this.props.onCancel()}render(){const{formatMessage:e}=this.props.intl;let t={email:e(dt.email),tel:e(dt.phone)}[this.props.credMethod]||this.props.credMethod;return s().createElement("div",{className:"panel-form"},s().createElement("div",{className:"panel-form-row"},s().createElement("label",{className:"small",htmlFor:"enter-confirmation-code"},s().createElement(n.FormattedMessage,{id:"enter_confirmation_code_prompt",defaultMessage:"Enter confirmation code sent to you by {method}:",description:"Request to enter confirmation code",values:{method:t}}))),s().createElement("div",{className:"panel-form-row"},s().createElement(n.FormattedMessage,{id:"numeric_confirmation_code_prompt",defaultMessage:"Numbers only",description:"Prompt for numeric conformation code"},(e=>s().createElement("input",{type:"text",id:"enter-confirmation-code",placeholder:e,value:this.state.code,onChange:this.handleChange,onKeyPress:this.handleKeyPress,required:!0})))),s().createElement("div",{className:"dialog-buttons"},s().createElement("button",{className:"blue",onClick:this.handleSubmit},s().createElement(n.FormattedMessage,{id:"button_confirm",defaultMessage:"Confirm",description:"Button [Confirm]"})),s().createElement("button",{className:"white",onClick:this.handleCancel},s().createElement(n.FormattedMessage,{id:"button_cancel"}))))}}var pt=(0,n.injectIntl)(ht);const mt=(0,n.defineMessages)({login:{id:"sidepanel_title_login",description:"Sidepanel title for LoginView.",defaultMessage:"Sign In"},register:{id:"sidepanel_title_register",description:"Sidepanel title for CreateAccountView.",defaultMessage:"Create Account"},settings:{id:"sidepanel_title_settings",description:"Sidepanel title for SettingsView.",defaultMessage:"Settings"},edit:{id:"sidepanel_title_account_settings",description:"Sidepanel title for EditAccountView.",defaultMessage:"Account Settings"},general:{id:"sidepanel_title_acc_general",description:"Sidepanel title for AccGeneralView.",defaultMessage:"General"},security:{id:"sidepanel_title_acc_security",description:"Sidepanel title for AccSecurityView.",defaultMessage:"Security"},notif:{id:"sidepanel_title_acc_notifications",description:"Sidepanel title for AccNotificationsView.",defaultMessage:"Notifications"},support:{id:"sidepanel_title_acc_support",description:"Sidepanel title for AccSupportView.",defaultMessage:"Support"},newtpk:{id:"sidepanel_title_newtpk",description:"Sidepanel title for NewTopicView.",defaultMessage:"Start New Chat"},cred:{id:"sidepanel_title_cred",description:"Sidepanel title for ValidationView.",defaultMessage:"Confirm Credentials"},reset:{id:"sidepanel_title_reset",description:"Sidepanel title for PasswordResetView.",defaultMessage:"Reset Password"},archive:{id:"sidepanel_title_archive",description:"Sidepanel title for ContactsView-Archive.",defaultMessage:"Archived Chats"},blocked:{id:"sidepanel_title_blocked",description:"Sidepanel title for ContactsView-Blocked.",defaultMessage:"Blocked Chats"}});class ut extends s().Component{constructor(e){super(e),this.handleLoginRequested=this.handleLoginRequested.bind(this),this.handleNewTopic=this.handleNewTopic.bind(this)}handleLoginRequested(e,t){this.props.onLoginRequest(e,t)}handleNewTopic(){this.props.onBasicNavigate("newtpk")}render(){const{formatMessage:e}=this.props.intl,t=this.props.state||(this.props.myUserId?"contacts":"login");let a,i,n;return"contacts"==t?(a=this.props.title,i=!this.props.avatar||this.props.avatar):(a=e(mt[t]),i=!1),-1==["login","contacts"].indexOf(t)&&(n=this.props.onCancel),s().createElement("div",{id:"sidepanel",className:this.props.hideSelf?"nodisplay":null},s().createElement(ze,{state:t,title:a,avatar:i,myUserId:this.props.myUserId,onSignUp:this.props.onSignUp,onSettings:this.props.onSettings,onNewTopic:this.handleNewTopic,onCancel:n}),s().createElement(G,{level:this.props.errorLevel,text:this.props.errorText,action:this.props.errorAction,actionText:this.props.errorActionText,onClearError:this.props.onError}),s().createElement(Te,{show:this.props.loadSpinnerVisible}),"login"===t?s().createElement(Xe,{login:this.props.login,disabled:this.props.loginDisabled,onLogin:this.handleLoginRequested}):"register"===t?s().createElement(Ve,{onCreateAccount:this.props.onCreateAccount,onCancel:this.props.onCancel,onError:this.props.onError}):"settings"===t?s().createElement(ct,{transport:this.props.transport,serverAddress:this.props.serverAddress,onCancel:this.props.onCancel,onUpdate:this.props.onGlobalSettings}):"edit"===t?s().createElement(Ke,{tinode:this.props.tinode,myUserId:this.props.myUserId,onBasicNavigate:this.props.onBasicNavigate}):"general"===t?s().createElement(We,{tinode:this.props.tinode,myUserId:this.props.myUserId,onUpdateAccount:this.props.onUpdateAccount,onUpdateTags:this.props.onUpdateAccountTags,onCredAdd:this.props.onCredAdd,onCredDelete:this.props.onCredDelete,onCredConfirm:this.props.onCredConfirm,onBasicNavigate:this.props.onBasicNavigate,onError:this.props.onError}):"notif"===t?s().createElement(Ge,{messageSounds:this.props.messageSounds,desktopAlerts:this.props.desktopAlerts,desktopAlertsEnabled:this.props.desktopAlertsEnabled,incognitoMode:this.props.incognitoMode,onTogglePushNotifications:this.props.onTogglePushNotifications,onToggleMessageSounds:this.props.onToggleMessageSounds,onToggleIncognitoMode:this.props.onToggleIncognitoMode}):"security"===t?s().createElement(Ye,{tinode:this.props.tinode,onUpdateAccount:this.props.onUpdateAccount,onLogout:this.props.onLogout,onDeleteAccount:this.props.onDeleteAccount,onShowAlert:this.props.onShowAlert,onShowBlocked:this.props.onShowBlocked}):"support"===t?s().createElement(Ze,{serverAddress:this.props.serverAddress,serverVersion:this.props.serverVersion}):"contacts"===t||"archive"==t||"blocked"==t?s().createElement(je,{tinode:this.props.tinode,myUserId:this.props.myUserId,connected:this.props.connected,topicSelected:this.props.topicSelected,archive:"archive"==t,blocked:"blocked"==t,chatList:this.props.chatList,showContextMenu:this.props.showContextMenu,onTopicSelected:this.props.onTopicSelected,onShowArchive:this.props.onShowArchive}):"newtpk"===t?s().createElement(ot,{tinode:this.props.tinode,searchResults:this.props.searchResults,onInitFind:this.props.onInitFind,onSearchContacts:this.props.onSearchContacts,onCreateTopic:this.props.onCreateTopic,onError:this.props.onError}):"cred"===t?s().createElement(pt,{credCode:this.props.credCode,credMethod:this.props.credMethod,onSubmit:this.props.onValidateCredentials,onCancel:this.props.onCancel,onError:this.props.onError}):"reset"===t?s().createElement(rt,{onRequest:this.props.onPasswordResetRequest,onReset:this.props.onResetPassword}):null)}}var _t=(0,n.injectIntl)(ut);function gt(){let e=m;return"object"==typeof window.location&&("file:"==window.location.protocol||"localhost"==window.location.hostname?e=p.local:window.location.hostname&&(e=window.location.hostname+(window.location.port?":"+window.location.port:""))),e}function bt(){return"object"==typeof window.location&&"https:"==window.location.protocol}const vt=new Audio("audio/msg.mp3"),ft=(0,n.defineMessages)({reconnect_countdown:{id:"reconnect_countdown",defaultMessage:"Disconnected. Reconnecting in {seconds}…",description:"Message shown when an app update is available."},reconnect_now:{id:"reconnect_now",defaultMessage:"Try now",description:"Prompt for reconnecting now"},push_init_failed:{id:"push_init_failed",defaultMessage:"Failed to initialize push notifications",description:"Error message when push notifications have failed to initialize."},invalid_security_token:{id:"invalid_security_token",defaultMessage:"Invalid security token",description:"Error message when resetting password."},no_connection:{id:"no_connection",defaultMessage:"No connection",description:"Warning that the user is offline."},code_doesnot_match:{id:"code_doesnot_match",defaultMessage:"Code does not match",description:"Error message when the credential validation code is incorrect."}});class Et extends s().Component{constructor(e){super(e),this.state=this.getBlankState(),this.handleResize=this.handleResize.bind(this),this.handleHashRoute=this.handleHashRoute.bind(this),this.handleOnline=this.handleOnline.bind(this),this.checkForAppUpdate=this.checkForAppUpdate.bind(this),this.handleVisibilityEvent=this.handleVisibilityEvent.bind(this),this.handleError=this.handleError.bind(this),this.handleLoginRequest=this.handleLoginRequest.bind(this),this.handleConnected=this.handleConnected.bind(this),this.handleAutoreconnectIteration=this.handleAutoreconnectIteration.bind(this),this.doLogin=this.doLogin.bind(this),this.handleCredentialsRequest=this.handleCredentialsRequest.bind(this),this.handleLoginSuccessful=this.handleLoginSuccessful.bind(this),this.handleDisconnect=this.handleDisconnect.bind(this),this.tnMeMetaDesc=this.tnMeMetaDesc.bind(this),this.tnMeContactUpdate=this.tnMeContactUpdate.bind(this),this.tnMeSubsUpdated=this.tnMeSubsUpdated.bind(this),this.resetContactList=this.resetContactList.bind(this),this.tnData=this.tnData.bind(this),this.tnInitFind=this.tnInitFind.bind(this),this.tnFndSubsUpdated=this.tnFndSubsUpdated.bind(this),this.handleSearchContacts=this.handleSearchContacts.bind(this),this.handleTopicSelected=this.handleTopicSelected.bind(this),this.handleHideMessagesView=this.handleHideMessagesView.bind(this),this.handleSendMessage=this.handleSendMessage.bind(this),this.handleNewChatInvitation=this.handleNewChatInvitation.bind(this),this.handleNewAccount=this.handleNewAccount.bind(this),this.handleNewAccountRequest=this.handleNewAccountRequest.bind(this),this.handleUpdateAccountRequest=this.handleUpdateAccountRequest.bind(this),this.handleUpdateAccountTagsRequest=this.handleUpdateAccountTagsRequest.bind(this),this.handleToggleIncognitoMode=this.handleToggleIncognitoMode.bind(this),this.handleSettings=this.handleSettings.bind(this),this.handleGlobalSettings=this.handleGlobalSettings.bind(this),this.handleShowArchive=this.handleShowArchive.bind(this),this.handleShowBlocked=this.handleShowBlocked.bind(this),this.handleToggleMessageSounds=this.handleToggleMessageSounds.bind(this),this.handleCredAdd=this.handleCredAdd.bind(this),this.handleCredDelete=this.handleCredDelete.bind(this),this.handleCredConfirm=this.handleCredConfirm.bind(this),this.initDesktopAlerts=this.initDesktopAlerts.bind(this),this.togglePushToken=this.togglePushToken.bind(this),this.requestPushToken=this.requestPushToken.bind(this),this.handleSidepanelCancel=this.handleSidepanelCancel.bind(this),this.handleStartTopicRequest=this.handleStartTopicRequest.bind(this),this.handleNewTopicCreated=this.handleNewTopicCreated.bind(this),this.handleTopicUpdateRequest=this.handleTopicUpdateRequest.bind(this),this.handleChangePermissions=this.handleChangePermissions.bind(this),this.handleTagsUpdated=this.handleTagsUpdated.bind(this),this.handleLogout=this.handleLogout.bind(this),this.handleDeleteAccount=this.handleDeleteAccount.bind(this),this.handleDeleteMessagesRequest=this.handleDeleteMessagesRequest.bind(this),this.handleLeaveUnsubRequest=this.handleLeaveUnsubRequest.bind(this),this.handleBlockTopicRequest=this.handleBlockTopicRequest.bind(this),this.handleReportTopic=this.handleReportTopic.bind(this),this.handleShowContextMenu=this.handleShowContextMenu.bind(this),this.defaultTopicContextMenu=this.defaultTopicContextMenu.bind(this),this.handleHideContextMenu=this.handleHideContextMenu.bind(this),this.handleShowAlert=this.handleShowAlert.bind(this),this.handleShowInfoView=this.handleShowInfoView.bind(this),this.handleHideInfoView=this.handleHideInfoView.bind(this),this.handleMemberUpdateRequest=this.handleMemberUpdateRequest.bind(this),this.handleValidateCredentialsRequest=this.handleValidateCredentialsRequest.bind(this),this.handlePasswordResetRequest=this.handlePasswordResetRequest.bind(this),this.handleResetPassword=this.handleResetPassword.bind(this),this.handleContextMenuAction=this.handleContextMenuAction.bind(this)}getBlankState(){const e=He.getObject("settings")||{};return{connected:!1,ready:!1,autoLogin:!1,transport:e.transport||null,serverAddress:e.serverAddress||gt(),serverVersion:"no connection",messageSounds:!e.messageSoundsOff,incognitoMode:!1,desktopAlerts:e.desktopAlerts,desktopAlertsEnabled:(bt()||"object"==typeof window.location&&"localhost"==window.location.hostname)&&void 0!==r&&"undefined"!=typeof navigator&&"undefined"!=typeof FIREBASE_INIT,firebaseToken:He.getObject("firebase-token"),applicationVisible:!document.hidden,errorText:"",errorLevel:null,errorAction:void 0,errorActionText:null,sidePanelSelected:"login",sidePanelTitle:null,sidePanelAvatar:null,loadSpinnerVisible:!1,login:"",password:"",myUserId:null,liveConnection:navigator.onLine,topicSelected:"",topicSelectedOnline:!1,topicSelectedAcs:null,newTopicParams:null,loginDisabled:!1,displayMobile:window.innerWidth<=640,showInfoPanel:!1,mobilePanel:"sidepanel",contextMenuVisible:!1,contextMenuBounds:null,contextMenuClickAt:null,contextMenuParams:null,contextMenuItems:[],alertVisible:!1,alertParams:{},chatList:[],searchResults:[],searchableContacts:[],credMethod:void 0,credCode:void 0}}componentDidMount(){window.addEventListener("resize",this.handleResize),window.addEventListener("online",(e=>{this.handleOnline(!0)})),window.addEventListener("offline",(e=>{this.handleOnline(!1)})),window.addEventListener("hashchange",this.handleHashRoute),document.addEventListener("visibilitychange",this.handleVisibilityEvent),this.setState({viewportWidth:document.documentElement.clientWidth,viewportHeight:document.documentElement.clientHeight});const{formatMessage:e,locale:t}=this.props.intl;if(this.tinode=Et.tnSetup(this.state.serverAddress,this.state.transport,t),this.tinode.onConnect=this.handleConnected,this.tinode.onDisconnect=this.handleDisconnect,this.tinode.onAutoreconnectIteration=this.handleAutoreconnectIteration,this.state.desktopAlertsEnabled)try{this.fbPush=r.initializeApp(FIREBASE_INIT,h).messaging(),this.fbPush.usePublicVapidKey(FIREBASE_INIT.messagingVapidKey),navigator.serviceWorker.register("/service-worker.js").then((e=>{this.checkForAppUpdate(e),this.fbPush.useServiceWorker(e),e.active.postMessage(JSON.stringify({locale:t})),this.initDesktopAlerts(),this.state.desktopAlerts&&(this.state.firebaseToken?this.tinode.setDeviceToken(this.state.firebaseToken,!0):this.togglePushToken(!0))})).catch((e=>{console.log("Failed to register service worker:",e)}))}catch(t){this.handleError(e({id:"push_init_failed"}),"err"),console.log("Failed to initialize push notifications",t),this.setState({desktopAlertsEnabled:!1})}const s=He.getObject("keep-logged-in")?He.getObject("auth-token"):void 0,a=Pe.parseUrlHash(window.location.hash);s?(this.setState({autoLogin:!0}),s.expires=new Date(s.expires),this.tinode.setAuthToken(s),this.tinode.connect().catch((e=>{this.handleError(e.message,"err")})),delete a.params.info,delete a.params.tab,a.path[0]="",Pe.navigateTo(Pe.composeUrlHash(a.path,a.params))):a.params.token||Pe.navigateTo(""),this.readTimer=null,this.readTimerCallback=null,this.handleHashRoute()}componentWillUnmount(){window.removeEventListener("resize",this.handleResize),window.removeEventListener("hashchange",this.handleHashRoute),document.removeEventListener("visibilitychange",this.handleVisibilityEvent)}static tnSetup(e,t,s){const a=new(c())(h,e,"AQEAAAABAAD_rAp4DJh05a1HAwFT3A6K",t,bt());return a.setHumanLanguage(s),a.enableLogging(true,!0),a}handleResize(){const e=document.documentElement.clientWidth<=640;this.setState({viewportWidth:document.documentElement.clientWidth,viewportHeight:document.documentElement.clientHeight}),this.state.displayMobile!=e&&this.setState({displayMobile:e})}checkForAppUpdate(e){e.onupdatefound=()=>{const t=e.installing;t.onstatechange=()=>{if("installed"==t.state&&navigator.serviceWorker.controller){const e=s().createElement(s().Fragment,null,s().createElement(n.FormattedMessage,{id:"update_available",defaultMessage:"Update available.",description:"Message shown when an app update is available."})," ",s().createElement("a",{href:""},s().createElement(n.FormattedMessage,{id:"reload_update",defaultMessage:"Reload",description:"Call to action to reload application when update is available."})),".");this.handleError(e,"info")}}}}handleHashRoute(){const e=Pe.parseUrlHash(window.location.hash);e.path&&e.path.length>0?(["register","settings","edit","notif","security","support","general","cred","reset","newtpk","archive","blocked","contacts",""].includes(e.path[0])?this.setState({sidePanelSelected:e.path[0]}):console.log("Unknown sidepanel view",e.path[0]),e.path.length>1&&e.path[1]!=this.state.topicSelected&&this.setState({topicSelected:c().topicType(e.path[1])?e.path[1]:null})):this.setState({sidePanelSelected:""}),e.params.method&&this.setState({credMethod:e.params.method}),e.params.code&&this.setState({credCode:e.params.code}),this.setState({showInfoPanel:e.params.info,newTopicTabSelected:e.params.tab})}handleOnline(e){e?this.handleError():this.handleError(this.props.intl.formatMessage({id:"no_connection"}),"warn"),this.setState({liveConnection:e})}handleVisibilityEvent(){this.setState({applicationVisible:!document.hidden})}handleError(e,t,s,a){this.setState({errorText:e,errorLevel:t,errorAction:s,errorActionText:a})}handleLoginRequest(e,t){this.setState({loginDisabled:!0,login:e,password:t,loadSpinnerVisible:!0,autoLogin:!0}),this.handleError("",null),this.tinode.isConnected()?this.doLogin(e,t,{meth:this.state.credMethod,resp:this.state.credCode}):this.tinode.connect().catch((e=>{this.setState({loginDisabled:!1,autoLogin:!1,loadSpinnerVisible:!1}),this.handleError(e.message,"err")}))}handleConnected(){const e=this.tinode.getServerInfo();this.setState({serverVersion:e.ver+" "+(e.build?e.build:"none")}),this.state.autoLogin&&this.doLogin(this.state.login,this.state.password,{meth:this.state.credMethod,resp:this.state.credCode})}handleAutoreconnectIteration(e,t){if(clearInterval(this.reconnectCountdown),e<0)return void this.handleError();if(t)return void t.then((()=>{this.handleError()})).catch((e=>{this.handleError(e.message,"err")}));const{formatMessage:s}=this.props.intl;let a=e/1e3;a|=a,this.reconnectCountdown=setInterval((()=>{const e=a>99?function(e){const t=Math.floor(e/60);let s=e%60;return s=s<10?"0".concat(s):s,"".concat(t,":").concat(s)}(a):a;this.handleError(s(ft.reconnect_countdown,{seconds:e}),"warn",(()=>{clearInterval(this.reconnectCountdown),this.tinode.reconnect()}),s(ft.reconnect_now)),a-=1}),1e3)}handleDisconnect(e){this.setState({connected:!1,ready:!1,topicSelectedOnline:!1,errorText:e&&e.message?e.message:"Disconnected",errorLevel:e&&e.message?"err":"warn",loginDisabled:!1,contextMenuVisible:!1,serverVersion:"no connection"})}doLogin(e,t,s){if(this.tinode.isAuthenticated())return void Pe.navigateTo("");s=c().credential(s);let a=null;const i=this.tinode.getAuthToken();e&&t?(this.setState({password:null}),a=this.tinode.loginBasic(e,t,s)):i&&(a=this.tinode.loginToken(i.token,s)),a?a.then((e=>{e.code>=300&&"validate credentials"===e.text?(this.setState({loadSpinnerVisible:!1}),s&&this.handleError(this.props.intl.formatMessage({id:"code_doesnot_match"}),"warn"),this.handleCredentialsRequest(e.params)):this.handleLoginSuccessful()})).catch((e=>{this.setState({loginDisabled:!1,credMethod:void 0,credCode:void 0,loadSpinnerVisible:!1,autoLogin:!1}),this.handleError(e.message,"err"),localStorage.removeItem("auth-token"),Pe.navigateTo("")})):(Pe.navigateTo(""),this.setState({loginDisabled:!1}))}handleCredentialsRequest(e){const t=Pe.parseUrlHash(window.location.hash);t.path[0]="cred",t.params.method=e.cred[0],Pe.navigateTo(Pe.composeUrlHash(t.path,t.params))}handleLoginSuccessful(){this.handleError(),He.getObject("keep-logged-in")&&He.setObject("auth-token",this.tinode.getAuthToken());const e=this.tinode.getMeTopic();e.onMetaDesc=this.tnMeMetaDesc,e.onContactUpdate=this.tnMeContactUpdate,e.onSubsUpdated=this.tnMeSubsUpdated,this.setState({connected:!0,credMethod:void 0,credCode:void 0,myUserId:this.tinode.getCurrentUserID(),autoLogin:!0}),e.subscribe(e.startMetaQuery().withLaterSub().withDesc().withTags().withCred().build()).catch((e=>{this.tinode.disconnect(),localStorage.removeItem("auth-token"),this.handleError(e.message,"err"),Pe.navigateTo("")})).finally((()=>{this.setState({loadSpinnerVisible:!1})})),Pe.navigateTo(Pe.setUrlSidePanel(window.location.hash,"contacts"))}tnMeMetaDesc(e){e&&(e.public&&this.setState({sidePanelTitle:e.public.fn,sidePanelAvatar:P(e.public.photo)}),e.acs&&this.setState({incognitoMode:!e.acs.isPresencer()}))}tnMeContactUpdate(e,t){if("on"==e||"off"==e)this.resetContactList(),this.state.topicSelected==t.topic&&this.setState({topicSelectedOnline:"on"==e});else if("read"==e)this.resetContactList();else if("msg"==e){const e=this.tinode.getTopic(t.topic),s=e&&e.isArchived();t.unread>0&&this.state.messageSounds&&!s&&(document.hidden||this.state.topicSelected!=t.topic)&&vt.play(),this.resetContactList()}else"recv"==e||("gone"==e||"unsub"==e?(this.state.topicSelected==t.topic&&this.handleTopicSelected(null),this.resetContactList()):"acs"==e?this.state.topicSelected==t.topic&&this.setState({topicSelectedAcs:t.acs}):"del"==e||"upd"==e||console.log("Unsupported (yet) presence update:"+e+" in: "+t.topic))}tnMeSubsUpdated(e){this.resetContactList()}static prepareSearchableContacts(e,t){const s={};for(const t of e)c().isP2PTopicName(t.topic)&&(s[t.topic]={user:t.topic,updated:t.updated,public:t.public,private:t.private,acs:t.acs});for(const e of t)s[e.user]||(s[e.user]=e);return Object.values(s)}resetContactList(){const e={chatList:[]};this.state.ready||(e.ready=!0),this.tinode.getMeTopic().contacts((t=>{e.chatList.push(t),this.state.topicSelected==t.topic&&(e.topicSelectedOnline=t.online,e.topicSelectedAcs=t.acs)})),e.searchableContacts=Et.prepareSearchableContacts(e.chatList,this.state.searchResults),this.setState(e)}tnData(e){const t=this.tinode.getTopic(e.topic);t.msgStatus(e)>=c().MESSAGE_STATUS_SENT&&e.from!=this.state.myUserId&&(clearTimeout(this.receivedTimer),this.receivedTimer=setTimeout((()=>{this.receivedTimer=void 0,t.noteRecv(e.seq)}),500))}tnInitFind(){const e=this.tinode.getFndTopic();e.onSubsUpdated=this.tnFndSubsUpdated,e.isSubscribed()?this.tnFndSubsUpdated():e.subscribe(e.startMetaQuery().withSub().build()).catch((e=>{this.handleError(e.message,"err")}))}tnFndSubsUpdated(){const e=[];this.tinode.getFndTopic().contacts((t=>{e.push(t)})),this.setState({searchResults:e,searchableContacts:Et.prepareSearchableContacts(this.state.chatList,e)})}handleSearchContacts(e){const t=this.tinode.getFndTopic();t.setMeta({desc:{public:e}}).then((e=>t.getMeta(t.startMetaQuery().withSub().build()))).catch((e=>{this.handleError(e.message,"err")}))}handleTopicSelected(e){this.state.newTopicParams&&this.state.newTopicParams._topicName!=e&&this.setState({newTopicParams:null}),e?(this.setState({errorText:"",errorLevel:null,mobilePanel:"topic-view",showInfoPanel:!1}),this.state.topicSelected!=e&&(this.setState({topicSelectedOnline:this.tinode.isTopicOnline(e),topicSelectedAcs:this.tinode.getTopicAccessMode(e)}),Pe.navigateTo(Pe.setUrlTopic("",e)))):(this.setState({errorText:"",errorLevel:null,mobilePanel:"sidepanel",topicSelectedOnline:!1,topicSelectedAcs:null,showInfoPanel:!1}),Pe.navigateTo(Pe.setUrlTopic("",null)))}handleHideMessagesView(){this.setState({mobilePanel:"sidepanel"}),Pe.navigateTo(Pe.setUrlTopic(window.location.hash,null))}handleSendMessage(e,t,s){const a=this.tinode.getTopic(this.state.topicSelected);(e=a.createMessage(e,!1))._uploader=s,a.isSubscribed()||(t||(t=Promise.resolve()),t=t.then((()=>a.subscribe()))),t&&(t=t.catch((e=>{this.handleError(e.message,"err")}))),a.publishDraft(e,t).then((e=>{if(a.isArchived())return a.archive(!1)})).catch((e=>{this.handleError(e.message,"err")}))}handleNewChatInvitation(e,t){const s=this.tinode.getTopic(e);let a=null;switch(t){case"accept":const i=s.getAccessMode().getGiven();a=s.setMeta({sub:{mode:i}}),s.isP2P()&&(a=a.then((t=>{s.setMeta({sub:{user:e,mode:i}})})));break;case"delete":a=s.delTopic(!0);break;case"block":const n=s.getAccessMode().updateWant("-JP").getWant();a=s.setMeta({sub:{mode:n}}).then((e=>this.handleTopicSelected(null)));break;default:console.log("Unknown invitation action",'"'+t+'""')}null!=a&&a.catch((e=>{this.handleError(e.message,"err")}))}handleNewAccount(){this.handleError(),Pe.navigateTo(Pe.setUrlSidePanel(window.location.hash,"register"))}handleNewAccountRequest(e,t,s,a,i){this.handleError(),this.tinode.connect(this.state.serverAddress).then((()=>this.tinode.createAccountBasic(e,t,{public:s,tags:i,cred:c().credential(a)}))).then((e=>{e.code>=300&&"validate credentials"==e.text?this.handleCredentialsRequest(e.params):this.handleLoginSuccessful(this)})).catch((e=>{this.handleError(e.message,"err")}))}handleUpdateAccountRequest(e,t,s){if(this.handleError(),t||s){const e={};t&&(e.public=t),s&&(e.defacs=s),this.tinode.getMeTopic().setMeta({desc:e}).catch((e=>{this.handleError(e.message,"err")}))}e&&this.tinode.updateAccountBasic(null,this.tinode.getCurrentLogin(),e).catch((e=>{this.handleError(e.message,"err")}))}handleToggleIncognitoMode(e){const t=this.tinode.getMeTopic(),s=t.getAccessMode().updateWant(e?"-P":"+P").getWant();t.setMeta({sub:{mode:s}}).catch((e=>{this.handleError(e.message,"err")}))}handleUpdateAccountTagsRequest(e){this.tinode.getMeTopic().setMeta({tags:e}).catch((e=>{this.handleError(e.message,"err")}))}handleSettings(){this.handleError(),Pe.navigateTo(Pe.setUrlSidePanel(window.location.hash,this.state.myUserId?"edit":"settings"))}handleGlobalSettings(e){const t=e.serverAddress||this.state.serverAddress,s=e.transport||this.state.transport;this.tinode&&(this.tinode.onDisconnect=void 0,this.tinode.disconnect()),this.tinode=Et.tnSetup(t,s,this.props.intl.locale),this.tinode.onConnect=this.handleConnected,this.tinode.onDisconnect=this.handleDisconnect,this.setState({serverAddress:t,transport:s}),He.setObject("settings",{serverAddress:t,transport:s}),Pe.navigateTo(Pe.setUrlSidePanel(window.location.hash,""))}handleShowArchive(){Pe.navigateTo(Pe.setUrlSidePanel(window.location.hash,this.state.myUserId?"archive":""))}handleShowBlocked(){Pe.navigateTo(Pe.setUrlSidePanel(window.location.hash,this.state.myUserId?"blocked":""))}initDesktopAlerts(){this.fbPush.onTokenRefresh((()=>{this.requestPushToken()})),this.fbPush.onMessage((e=>{}))}togglePushToken(e){e?this.state.firebaseToken?(this.setState({desktopAlerts:!0}),He.updateObject("settings",{desktopAlerts:!0})):this.fbPush.requestPermission().then((()=>{this.requestPushToken()})).catch((e=>{this.handleError(e.message,"err"),this.setState({desktopAlerts:!1,firebaseToken:null}),He.updateObject("settings",{desktopAlerts:!1}),console.log("Failed to get permission to notify.",e)})):this.state.firebaseToken?this.fbPush.deleteToken(this.state.firebaseToken).catch((e=>{console.log("Unable to delete token.",e)})).finally((()=>{He.updateObject("settings",{desktopAlerts:!1}),localStorage.removeItem("firebase-token"),this.setState({desktopAlerts:!1,firebaseToken:null})})):(this.setState({desktopAlerts:!1,firebaseToken:null}),He.updateObject("settings",{desktopAlerts:!1}))}requestPushToken(){this.fbPush.getToken().then((e=>{e!=this.state.firebaseToken&&(this.tinode.setDeviceToken(e,!0),He.setObject("firebase-token",e)),this.setState({firebaseToken:e,desktopAlerts:!0}),He.updateObject("settings",{desktopAlerts:!0})})).catch((e=>{this.handleError(e.message,"err"),console.log("Failed to retrieve firebase token",e)}))}handleToggleMessageSounds(e){this.setState({messageSounds:e}),He.updateObject("settings",{messageSoundsOff:!e})}handleCredAdd(e,t){this.tinode.getMeTopic().setMeta({cred:{meth:e,val:t}}).catch((e=>{this.handleError(e.message,"err")}))}handleCredDelete(e,t){this.tinode.getMeTopic().delCredential(e,t).catch((e=>{this.handleError(e.message,"err")}))}handleCredConfirm(e,t){this.handleCredentialsRequest({cred:[e]})}handleSidepanelCancel(){const e=Pe.parseUrlHash(window.location.hash);let t="";["security","support","general","notif"].includes(e.path[0])?t="edit":"blocked"==e.path[0]?t="security":this.state.myUserId&&(t="contacts"),e.path[0]=t,e.params&&(delete e.params.code,delete e.params.method,delete e.params.tab),Pe.navigateTo(Pe.composeUrlHash(e.path,e.params)),this.setState({errorText:"",errorLevel:null})}basicNavigator(e){Pe.navigateTo(Pe.setUrlSidePanel(window.location.hash,e))}handleStartTopicRequest(e,t,s,a,i){if(e&&this.tinode.isTopicCached(e))return void this.handleTopicSelected(e);const n={};c().isP2PTopicName(e)?(n.sub={mode:_},n.desc={defacs:{auth:_}}):(e=e||this.tinode.newGroupTopicName(i),n.desc={public:t,private:{comment:s}},n.tags=a),n._topicName=e,this.setState({newTopicParams:n},(()=>{this.handleTopicSelected(e)}))}handleNewTopicCreated(e,t){this.state.topicSelected==e&&e!=t&&this.setState({topicSelected:t},(()=>{Pe.navigateTo(Pe.setUrlTopic("",t))}))}handleTopicUpdateRequest(e,t,s,a){const i=this.tinode.getTopic(e);if(i){const e={};t&&(e.public=t),s&&(e.private=s===c().DEL_CHAR?c().DEL_CHAR:{comment:s}),a&&(e.defacs=a),i.setMeta({desc:e}).catch((e=>{this.handleError(e.message,"err")}))}}handleChangePermissions(e,t,s){const a=this.tinode.getTopic(e);if(a){const e=a.getAccessMode();s?(e.updateGiven(t),t=e.getGiven()):(e.updateWant(t),t=e.getWant()),a.setMeta({sub:{user:s,mode:t}}).catch((e=>{this.handleError(e.message,"err")}))}}handleTagsUpdated(e,t){const s=this.tinode.getTopic(e);s&&s.setMeta({tags:t}).catch((e=>{this.handleError(e.message,"err")}))}handleLogout(){ne(0),localStorage.removeItem("auth-token"),localStorage.removeItem("firebase-token"),localStorage.removeItem("settings"),this.state.firebaseToken&&this.fbPush.deleteToken(this.state.firebaseToken),this.tinode&&(this.tinode.onDisconnect=void 0,this.tinode.disconnect()),this.setState(this.getBlankState()),this.tinode=Et.tnSetup(this.state.serverAddress,this.state.transport,this.props.intl.locale),this.tinode.onConnect=this.handleConnected,this.tinode.onDisconnect=this.handleDisconnect,Pe.navigateTo("")}handleDeleteAccount(){this.tinode.delCurrentUser(!0).then((e=>{this.handleLogout()}))}handleDeleteMessagesRequest(e){const t=this.tinode.getTopic(e);t&&t.delMessagesAll(!0).catch((e=>{this.handleError(e.message,"err")}))}handleLeaveUnsubRequest(e){const t=this.tinode.getTopic(e);t&&t.leave(!0).then((e=>{Pe.navigateTo(Pe.setUrlTopic(window.location.hash,""))})).catch((e=>{this.handleError(e.message,"err")}))}handleBlockTopicRequest(e){const t=this.tinode.getTopic(e);t&&t.updateMode(null,"-JP").then((e=>{Pe.navigateTo(Pe.setUrlTopic(window.location.hash,""))})).catch((e=>{this.handleError(e.message,"err")}))}handleReportTopic(e){const t=this.tinode.getTopic(e);t&&(this.tinode.publish(c().TOPIC_SYS,c().Drafty.attachJSON(null,{action:"report",target:e})),t.updateMode(null,"-JP").then((e=>{Pe.navigateTo(Pe.setUrlTopic(window.location.hash,""))})).catch((e=>{this.handleError(e.message,"err")})))}handleShowContextMenu(e,t){this.setState({contextMenuVisible:!0,contextMenuClickAt:{x:e.x,y:e.y},contextMenuParams:e,contextMenuItems:t||this.defaultTopicContextMenu(e.topicName),contextMenuBounds:i().findDOMNode(this).getBoundingClientRect()})}defaultTopicContextMenu(e){const t=this.tinode.getTopic(e);let s=!1,a=!1,i=!1,n=!1,o=!1,r=!1;if(t){n=t.isSubscribed(),r=t.isArchived();const e=t.getAccessMode();e&&(s=e.isMuted(),a=!e.isJoiner(),i=!e.isJoiner("want"),o=e.isDeleter())}return[n?{title:this.props.intl.formatMessage({id:"menu_item_info"}),handler:this.handleShowInfoView}:null,n?"messages_clear":null,n&&o?"messages_clear_hard":null,s?a?null:"topic_unmute":"topic_mute",i?"topic_unblock":"topic_block",r?null:"topic_archive","topic_delete"]}handleHideContextMenu(){this.setState({contextMenuVisible:!1,contextMenuClickAt:null,contextMenuParams:null,contextMenuBounds:null})}handleContextMenuAction(e,t,s){"topic_archive"==e&&t&&s.topicName&&s.topicName==this.state.topicSelected&&t.then((()=>{this.handleTopicSelected(null)}))}handleShowAlert(e,t,s,a,i,n){this.setState({alertVisible:!0,alertParams:{title:e,content:t,onConfirm:s,confirm:a,onReject:i,reject:n}})}handleShowInfoView(){Pe.navigateTo(Pe.addUrlParam(window.location.hash,"info",!0)),this.setState({showInfoPanel:!0})}handleHideInfoView(){Pe.navigateTo(Pe.removeUrlParam(window.location.hash,"info")),this.setState({showInfoPanel:!1})}handleMemberUpdateRequest(e,t,s){if(!e)return;const a=this.tinode.getTopic(e);a&&(t&&t.length>0&&t.map((e=>{a.invite(e,null).catch((e=>{this.handleError(e.message,"err")}))})),s&&s.length>0&&s.map((e=>{a.delSubscription(e).catch((e=>{this.handleError(e.message,"err")}))})))}handleValidateCredentialsRequest(e,t){if(this.tinode.isAuthenticated()){this.tinode.getMeTopic().setMeta({cred:{meth:e,resp:t}}).then((()=>{Pe.navigateTo("")})).catch((e=>{this.handleError(e.message,"err")}))}else this.setState({credMethod:e,credCode:t}),this.doLogin(null,null,{meth:e,resp:t})}handlePasswordResetRequest(e,t){this.tinode.connect().then((()=>this.tinode.requestResetAuthSecret("basic",e,t))).catch((e=>{this.handleError(e.message,"err")}))}handleResetPassword(e,t,s){(s=function(e){if(e){e=e.replace(/-/g,"+").replace(/_/g,"/");try{e=btoa(atob(e))}catch(t){console.log("Failed to base64 re-encode string.",t),e=null}}return e}(s))?this.tinode.connect().then((()=>this.tinode.updateAccountBasic(null,null,t,{token:s}))).catch((e=>{this.handleError(e.message,"err")})):this.handleError(this.props.intl.formatMessage({id:"invalid_security_token"}),"err")}render(){return s().createElement("div",{id:"app-container"},this.state.contextMenuVisible?s().createElement(M,{tinode:this.tinode,bounds:this.state.contextMenuBounds,clickAt:this.state.contextMenuClickAt,params:this.state.contextMenuParams,items:this.state.contextMenuItems,hide:this.handleHideContextMenu,onShowAlert:this.handleShowAlert,onAction:this.handleContextMenuAction,onTopicRemoved:e=>{e==this.state.topicSelected&&this.handleTopicSelected(null)},onError:this.handleError}):null,s().createElement(d,{visible:this.state.alertVisible,title:this.state.alertParams.title,content:this.state.alertParams.content,onReject:this.state.alertParams.onReject?()=>{this.setState({alertVisible:!1})}:null,reject:this.state.alertParams.reject,onConfirm:()=>{this.setState({alertVisible:!1}),this.state.alertParams.onConfirm()},confirm:this.state.alertParams.confirm}),s().createElement(_t,{tinode:this.tinode,connected:this.state.connected,displayMobile:this.state.displayMobile,hideSelf:this.state.displayMobile&&"sidepanel"!==this.state.mobilePanel,state:this.state.sidePanelSelected,title:this.state.sidePanelTitle,avatar:this.state.sidePanelAvatar,login:this.state.login,myUserId:this.state.myUserId,loginDisabled:this.state.loginDisabled,loadSpinnerVisible:this.state.loadSpinnerVisible,errorText:this.state.errorText,errorLevel:this.state.errorLevel,errorAction:this.state.errorAction,errorActionText:this.state.errorActionText,topicSelected:this.state.topicSelected,chatList:this.state.chatList,credMethod:this.state.credMethod,credCode:this.state.credCode,transport:this.state.transport,messageSounds:this.state.messageSounds,desktopAlerts:this.state.desktopAlerts,desktopAlertsEnabled:this.state.desktopAlertsEnabled,incognitoMode:this.state.incognitoMode,serverAddress:this.state.serverAddress,serverVersion:this.state.serverVersion,onGlobalSettings:this.handleGlobalSettings,onSignUp:this.handleNewAccount,onSettings:this.handleSettings,onBasicNavigate:this.basicNavigator,onLoginRequest:this.handleLoginRequest,onCreateAccount:this.handleNewAccountRequest,onUpdateAccount:this.handleUpdateAccountRequest,onUpdateAccountTags:this.handleUpdateAccountTagsRequest,onTogglePushNotifications:this.togglePushToken,onToggleMessageSounds:this.handleToggleMessageSounds,onToggleIncognitoMode:this.handleToggleIncognitoMode,onCredAdd:this.handleCredAdd,onCredDelete:this.handleCredDelete,onCredConfirm:this.handleCredConfirm,onTopicSelected:this.handleTopicSelected,onCreateTopic:this.handleStartTopicRequest,onLogout:this.handleLogout,onDeleteAccount:this.handleDeleteAccount,onShowAlert:this.handleShowAlert,onCancel:this.handleSidepanelCancel,onError:this.handleError,onValidateCredentials:this.handleValidateCredentialsRequest,onPasswordResetRequest:this.handlePasswordResetRequest,onResetPassword:this.handleResetPassword,onShowArchive:this.handleShowArchive,onShowBlocked:this.handleShowBlocked,onInitFind:this.tnInitFind,searchResults:this.state.searchResults,onSearchContacts:this.handleSearchContacts,showContextMenu:this.handleShowContextMenu}),s().createElement(Re,{tinode:this.tinode,connected:this.state.connected,ready:this.state.ready,online:this.state.topicSelectedOnline,acs:this.state.topicSelectedAcs,displayMobile:this.state.displayMobile,viewportWidth:this.state.viewportWidth,viewportHeight:this.state.viewportHeight,hideSelf:this.state.displayMobile&&("topic-view"!==this.state.mobilePanel||this.state.showInfoPanel),topic:this.state.topicSelected,myUserId:this.state.myUserId,serverVersion:this.state.serverVersion,serverAddress:this.state.serverAddress,applicationVisible:this.state.applicationVisible,errorText:this.state.errorText,errorLevel:this.state.errorLevel,errorAction:this.state.errorAction,errorActionText:this.state.errorActionText,newTopicParams:this.state.newTopicParams,onHideMessagesView:this.handleHideMessagesView,onData:this.tnData,onError:this.handleError,onNewTopicCreated:this.handleNewTopicCreated,showContextMenu:this.handleShowContextMenu,onChangePermissions:this.handleChangePermissions,onNewChat:this.handleNewChatInvitation,sendMessage:this.handleSendMessage}),this.state.showInfoPanel?s().createElement(pe,{tinode:this.tinode,connected:this.state.connected,displayMobile:this.state.displayMobile,topic:this.state.topicSelected,searchableContacts:this.state.searchableContacts,myUserId:this.state.myUserId,errorText:this.state.errorText,errorLevel:this.state.errorLevel,errorAction:this.state.errorAction,errorActionText:this.state.errorActionText,onTopicDescUpdate:this.handleTopicUpdateRequest,onCancel:this.handleHideInfoView,onShowAlert:this.handleShowAlert,onChangePermissions:this.handleChangePermissions,onMemberUpdateRequest:this.handleMemberUpdateRequest,onDeleteMessages:this.handleDeleteMessagesRequest,onLeaveTopic:this.handleLeaveUnsubRequest,onBlockTopic:this.handleBlockTopicRequest,onReportTopic:this.handleReportTopic,onAddMember:this.handleManageGroupMembers,onTopicTagsUpdate:this.handleTagsUpdated,onInitFind:this.tnInitFind,onError:this.handleError,showContextMenu:this.handleShowContextMenu}):null)}}var wt=(0,n.injectIntl)(Et);const{params:Ct}=Pe.parseUrlHash(window.location.hash),St=Ct&&Ct.hl||navigator.languages&&navigator.languages[0]||navigator.language||navigator.userLanguage||"en",Mt=St.toLowerCase().split(/[-_]/)[0],kt=o[St]||o[Mt]||o.en;i().render(s().createElement(n.IntlProvider,{locale:St,messages:kt,textComponent:s().Fragment},s().createElement(wt,null)),document.getElementById("mountPoint"))}();
//# sourceMappingURL=index.prod.js.map
\ No newline at end of file
diff --git a/umd/index.prod.js.map b/umd/index.prod.js.map
index e8862333..e9b8406a 100644
--- a/umd/index.prod.js.map
+++ b/umd/index.prod.js.map
@@ -1 +1 @@
-{"version":3,"sources":["webpack://tinode-webapp/webpack/bootstrap","webpack://tinode-webapp/webpack/runtime/compat get default export","webpack://tinode-webapp/webpack/runtime/define property getters","webpack://tinode-webapp/webpack/runtime/hasOwnProperty shorthand","webpack://tinode-webapp/external \"React\"","webpack://tinode-webapp/external \"ReactDOM\"","webpack://tinode-webapp/external \"ReactIntl\"","webpack://tinode-webapp/external \"firebase\"","webpack://tinode-webapp/external \"Tinode\"","webpack://tinode-webapp/external [\"firebase\",\"messaging\"]","webpack://tinode-webapp/./src/widgets/alert.jsx","webpack://tinode-webapp/./src/version.js","webpack://tinode-webapp/./src/config.js","webpack://tinode-webapp/./src/widgets/context-menu.jsx","webpack://tinode-webapp/./src/lib/strformat.js","webpack://tinode-webapp/./src/widgets/letter-tile.jsx","webpack://tinode-webapp/./src/lib/blob-helpers.js","webpack://tinode-webapp/./src/widgets/avatar-upload.jsx","webpack://tinode-webapp/./src/widgets/checkbox.jsx","webpack://tinode-webapp/./src/widgets/contact-badges.jsx","webpack://tinode-webapp/./src/widgets/unread-badge.jsx","webpack://tinode-webapp/./src/widgets/contact.jsx","webpack://tinode-webapp/./src/widgets/contact-action.jsx","webpack://tinode-webapp/./src/widgets/contact-list.jsx","webpack://tinode-webapp/./src/widgets/menu-cancel.jsx","webpack://tinode-webapp/./src/widgets/error-panel.jsx","webpack://tinode-webapp/./src/widgets/chip.jsx","webpack://tinode-webapp/./src/widgets/chip-input.jsx","webpack://tinode-webapp/./src/widgets/group-manager.jsx","webpack://tinode-webapp/./src/widgets/visible-password.jsx","webpack://tinode-webapp/./src/widgets/in-place-edit.jsx","webpack://tinode-webapp/./src/widgets/more-button.jsx","webpack://tinode-webapp/./src/widgets/permissions-editor.jsx","webpack://tinode-webapp/./src/lib/utils.js","webpack://tinode-webapp/./src/widgets/tag-manager.jsx","webpack://tinode-webapp/./src/views/info-view.jsx","webpack://tinode-webapp/./src/widgets/file-progress.jsx","webpack://tinode-webapp/./src/widgets/attachment.jsx","webpack://tinode-webapp/./src/widgets/received-marker.jsx","webpack://tinode-webapp/./src/widgets/uploading-image.jsx","webpack://tinode-webapp/./src/widgets/chat-message.jsx","webpack://tinode-webapp/./src/widgets/send-message.jsx","webpack://tinode-webapp/./src/widgets/doc-preview.jsx","webpack://tinode-webapp/./src/widgets/group-subs.jsx","webpack://tinode-webapp/./src/widgets/image-preview.jsx","webpack://tinode-webapp/./src/widgets/invitation.jsx","webpack://tinode-webapp/./src/widgets/load-spinner.jsx","webpack://tinode-webapp/./src/views/logo-view.jsx","webpack://tinode-webapp/./src/lib/navigation.js","webpack://tinode-webapp/./src/views/messages-view.jsx","webpack://tinode-webapp/./src/widgets/button-back.jsx","webpack://tinode-webapp/./src/widgets/menu-contacts.jsx","webpack://tinode-webapp/./src/widgets/menu-start.jsx","webpack://tinode-webapp/./src/widgets/side-navbar.jsx","webpack://tinode-webapp/./src/views/contacts-view.jsx","webpack://tinode-webapp/./src/lib/local-storage.js","webpack://tinode-webapp/./src/views/create-account-view.jsx","webpack://tinode-webapp/./src/views/edit-account-view.jsx","webpack://tinode-webapp/./src/views/acc-general-view.jsx","webpack://tinode-webapp/./src/views/acc-notifications-view.jsx","webpack://tinode-webapp/./src/views/acc-security-view.jsx","webpack://tinode-webapp/./src/views/acc-support-view.jsx","webpack://tinode-webapp/./src/views/login-view.jsx","webpack://tinode-webapp/./src/widgets/new-topic-by-id.jsx","webpack://tinode-webapp/./src/widgets/new-topic-group.jsx","webpack://tinode-webapp/./src/widgets/search-contacts.jsx","webpack://tinode-webapp/./src/views/new-topic-view.jsx","webpack://tinode-webapp/./src/views/password-reset-view.jsx","webpack://tinode-webapp/./src/widgets/host-selector.jsx","webpack://tinode-webapp/./src/views/settings-view.jsx","webpack://tinode-webapp/./src/views/validation-view.jsx","webpack://tinode-webapp/./src/views/sidepanel-view.jsx","webpack://tinode-webapp/./src/lib/host-name.js","webpack://tinode-webapp/./src/views/tinode-web.jsx","webpack://tinode-webapp/./src/index.js"],"names":["__webpack_require__","module","getter","__esModule","d","a","exports","definition","key","o","Object","defineProperty","enumerable","get","obj","prop","prototype","hasOwnProperty","call","React","ReactDOM","ReactIntl","firebase","messaging","Tinode","Alert","render","this","props","visible","className","title","content","onReject","onClick","reject","FormattedMessage","id","onConfirm","confirm","APP_NAME","KNOWN_HOSTS","hosted","local","DEFAULT_HOST","KEYPRESS_DELAY","DEFAULT_P2P_ACCESS_MODE","REM_SIZE","AVATAR_SIZE","MAX_INBAND_ATTACHMENT_SIZE","MAX_EXTERN_ATTACHMENT_SIZE","MAX_IMAGE_DIM","MAX_TITLE_LENGTH","messages","defineMessages","info","defaultMessage","description","clear_messages","clear_for_all","delete_for_all","send_retry","mute","unmute","topic_delete","topic_delete_warning","unblock","block","topic_block_warning","member_delete","archive","ContextMenu","constructor","super","formatMessage","intl","handlePageClick","bind","handleEscapeKey","handleClick","MenuItems","handler","params","errorHandler","onShowAlert","deleteMessages","delete","retryMessage","topicPermissionSetter","then","ctrl","onTopicRemoved","topicName","topic","tinode","getTopic","delTopic","catch","err","message","console","log","user","delSubscription","componentDidMount","document","addEventListener","componentWillUnmount","removeEventListener","e","contains","target","preventDefault","stopPropagation","hide","keyCode","item","items","currentTarget","dataset","onAction","onError","all","hard","cancelSend","seq","delMessagesAll","delMessagesList","flushMessage","msg","createMessage","publishDraft","mode","result","updateMode","count","menu","map","push","data-id","vSize","length","position","left","bounds","right","clickAt","x","top","bottom","y","style","injectIntl","shortDateFormat","locale","window","navigator","userLanguage","language","now","Date","getFullYear","getMonth","getDate","toLocaleTimeString","hour12","hour","minute","toLocaleDateString","month","day","year","bytesToHumanSize","bytes","sizes","bucket","Math","min","floor","log2","pow","round","toFixed","LetterTile","avatar","isGroup","iconColor","abs","value","hash","i","charCodeAt","stringHash","trim","letter","charAt","alt","src","onerror","SUPPORTED_IMAGE_FORMATS","MIME_EXTENSIONS","makeImageUrl","photo","type","data","fitImageSize","width","height","maxWidth","maxHeight","forceSquare","scale","size","dstWidth","dstHeight","srcWidth","srcHeight","xoffset","yoffset","imageScaled","fileOrBlob","maxSize","onSuccess","img","Image","crossOrigin","onload","async","URL","revokeObjectURL","dim","canvas","createElement","ctx","getContext","imageSmoothingEnabled","drawImage","mime","indexOf","blob","Promise","resolve","toBlob","clearRect","fname","idx","ext","at","lastIndexOf","substring","fileNameForMime","name","createObjectURL","fileToBase64","file","reader","FileReader","split","readAsDataURL","blobToBase64","AvatarUpload","state","dataUrl","handleFileUpload","componentDidUpdate","prevProps","setState","files","unused","base64bits","du","onImageChanged","randId","random","substr","readOnly","href","uid","accept","onChange","htmlFor","CheckBox","handleChange","checked","icon_mapping","ContactBadges","badges","b","icon","color","UnreadBadge","Contact","handleContextClick","onSelected","index","showContextMenu","pageY","pageX","online","slice","icon_badges","acs","showMode","getMode","isMuted","isJoiner","showCheckmark","selected","showOnline","isChannel","unread","comment","ContactAction","action","values","badge_you","badge_owner","ContactList","Array","isArray","topicSelected","contactNodes","contactsCount","contacts","c","filterFunc","filter","private","toLowerCase","public","fn","myUserId","isOwner","join","showUnread","connected","onTopicSelected","noScroll","dangerouslySetInnerHTML","__html","emptyListMessage","MenuCancel","onCancel","ErrorPanel","show","level","onClearError","warn","text","whiteSpace","actionText","Chip","handleCancel","invalid","noAvatar","required","ChipInput","deriveStateFromProps","input","focused","handleTextInput","removeChipAt","handleChipCancel","handleFocusGained","handleFocusLost","handleKeyDown","placeholder","chips","prompt","sortedChips","sortChips","staticMembers","chipIndex","indexChips","prevState","keep","normal","includes","concat","removed","onChipRemoved","onFocusLost","onEnter","undefined","avatarDisabled","onFocus","onBlur","onKeyDown","autoFocus","no_contacts","contacts_not_found_short","GroupManager","members","indexMembers","keepInitialMembers","requiredMember","contactFilter","noContactsMessage","selectedContacts","handleContactSelected","handleMemberRemoved","handleContactFilter","handleSubmit","m","delta","present","keepInitial","stat","sel","userId","status","splice","val","query","instance","added","keys","k","onSubmit","doContactFiltering","VisiblePassword","handleVisibility","handeTextChange","handleEditingFinished","onFinished","setTimeout","activeElement","tabIndex","autoComplete","InPlaceEdit","active","initialValue","handleStartEditing","handlePasswordFinished","newValue","focus","event","checkValidity","fieldType","spanText","spanClass","MoreButton","open","handleToggle","onToggle","PermissionsEditor","replace","sort","names","joiner","writer","preser","approver","sharer","deleter","owner","skip","compare","userTitle","userAvatar","modeTitle","compareTitle","updateFavicon","oldIcon","getElementById","head","getElementsByTagName","newIcon","rel","removeChild","appendChild","vcard","imageDataUrl","card","dataStart","arrayEqual","l","sanitizeUrl","url","allowedSchemes","test","schemes","RegExp","TagManager","tags","tagInput","activated","handleTagInput","handleAddTag","handleRemoveTag","nextProps","last","tag","maxTagCount","getServerLimit","onTagsChanged","minTagLength","maxTagLength","add_tags_prompt","defautMessage","requested","granted","edit_permissions","other_user","clear_messages_warning","delete_messages","delete_messages_warning","leave_chat","leave_chat_warning","block_contact","block_contact_warning","report_chat","report_chat_warning","InfoView","admin","muted","address","groupTopic","channel","fullName","selectedContact","access","modeGiven","modeWant","modeGiven2","modeWant2","auth","anon","contactList","showMemberPanel","showPermissionEditorFor","moreInfoExpanded","previousMetaDesc","previousSubsUpdated","previousTagsUpdated","resetSubs","resetDesc","onMetaDesc","onSubsUpdated","onTagsUpdated","handleFullNameUpdate","handlePrivateUpdate","handleImageChanged","handleMuted","handlePermissionsChanged","handleLaunchPermissionsEditor","handleHidePermissionsEditor","handleShowAddMembers","handleHideAddMembers","handleMemberUpdateRequest","handleDeleteMessages","handleLeave","handleBlock","handleReport","handleMemberSelected","handleMoreInfo","handleTagsUpdated","handleContextMenu","getType","newState","user2","subscriber","getGiven","getWant","subscribers","sub","defacs","getDefaultAccess","getAccessMode","isAdmin","isSharer","isDeleter","getMeta","startMetaQuery","withTags","build","desc","subs","onTopicDescUpdate","ignored","onChangePermissions","perm","userPermissionsEdited","which","toEdit","toCompare","toSkip","titleEdit","titleCompare","userPermissionsTitle","userPermissionsAvatar","editedPermissions","immutablePermissions","editedPermissionsTitle","immutablePermissionsTitle","editedPermissionsSkipped","onInitFind","onMemberUpdateRequest","onDeleteMessages","onLeaveTopic","onBlockTopic","onReportTopic","onTopicTagsUpdate","menuItems","displayMobile","errorLevel","errorText","searchableContacts","private_placeholder","more","no_members","FileProgress","progress","Attachment","downloader","downloadFile","filename","mimetype","getLargeFileHelper","download","loaded","uploading","onCancelUpload","cancel","helperFunc","isUrlRelative","downloadUrl","downloadWidget","ReceivedMarker","timestamp","received","sending","failed","marker","UploadingImage","ChatMessage","uploader","onProgress","handleProgress","handleImagePreview","handleFormButtonClick","handleCancelUpload","onImagePreview","resp","act","ref","onFormResponse","MESSAGE_STATUS_FAILED","ratio","sideClass","deleted","sequence","response","bubbleClass","fullDisplay","userFrom","attachments","mimeType","Drafty","att","draftyFormatter","userName","notFound","el","attr","viewportWidth","authorizeURL","sanitizeImageUrl","inner","child","SendMessage","keypressTimestamp","getTime","handlePasteEvent","handleAttachImage","handleAttachFile","handleSend","handleKeyPress","handleMessageTyping","messageEditArea","disabled","onImageSuccess","onAttachmentSuccess","clipboardData","originalEvent","kind","getAsFile","imageFileScaledToBase64","imageFileToBase64","filePasted","bits","onAttachImage","onAttachFile","acceptBlank","noInput","onSendMessage","shiftKey","onKeyPress","messaging_disabled","messagePrompt","type_new_message","attachImage","click","attachFile","display","DocPreview","handleSendDoc","caption","onClose","mimeToIcon","default","image","video","iconFromMime","GroupSubs","usersOnline","totalCount","countToShow","some","overflow","ImagePreview","handleSendImage","assignWidth","node","getBoundingClientRect","maxlength","max","Invitation","handleButtonAction","evt","LoadSpinner","LogoView","version","serverVersion","serverAddress","HashNavigation","parts","path","forEach","part","decodeURIComponent","location","args","parsed","parseUrlHash","composeUrlHash","sidepanel","isUnconfirmed","ex","getExcessive","isPeerRestricted","ms","getMissing","MessagesView","getDerivedStateFromProps","leave","sendImageAttachment","sendFileAttachment","sendKeyPress","handleScrollReference","handleScrollEvent","handleDescChange","handleSubsUpdated","handleNewMessage","handleAllMessagesReceived","handleInfoReceipt","handleImagePostview","handleClosePreview","handleFormResponse","handleShowContextMenuMessage","handleNewChatAcceptance","handleEnablePeer","postReadNotification","clearNotificationQueue","readNotificationQueue","readNotificationTimer","messagesScroller","scrollTop","scrollHeight","scrollPosition","viewportHeight","onData","onAllMessagesReceived","onInfo","onPres","applicationVisible","isSubscribed","ready","newTopic","newTopicParams","_topicName","getQuery","withLaterDesc","withLaterSub","isReader","withLaterData","withLaterDel","fetchingMessages","setQuery","subscribe","code","onNewTopicCreated","queuedMessages","pub","_sending","publishMessage","setUrlTopic","blankState","not_found","nextState","docPreview","imagePreview","imagePostview","typingIndicator","msgs","assign","onlineSubs","peer","p2pPeerDesc","peerMessagingDisabled","isWriter","readingBlocked","unconformed","unconfirmed","oldTopicName","oldTopic","finally","msgHasMoreMessages","getMessagesPage","setInterval","clearInterval","n","shift","sendAt","noteRead","setMilliseconds","getMilliseconds","isNewMessage","msgStatus","from","what","clearTimeout","keyPressTimer","forceUpdate","sendMessage","attachJSON","parse","searchParams","set","search","messageSpecificMenuItems","onNewChat","noteKeyPress","maxInbandAttachmentSize","cannot_initiate_upload","uploadCompletionPromise","upload","urlPromise","maxExternAttachmentSize","limit","tinyBlob","blobMime","tinyBits64","insertImage","_tempPreview","appendLineBreak","append","init","bits64","preview","found","find","_cancelled","component","hideSelf","component2","messageNodes","previousFrom","chatBoxClass","nextFrom","thisFrom","isReply","deliveryStatus","userDesc","hi","ts","_uploader","lastSeen","cont","getMeTopic","getContact","online_now","seen","last_seen","when","onHideMessagesView","ButtonBack","onBack","MenuContacts","onNewTopic","onSettings","MenuStart","onSignUp","SideNavbar","archived_contacts_title","ContactsView","handleAction","unreadThreads","archivedCount","chatList","blocked","arch","touched","action_ignored","onShowArchive","LocalStorageUtil","localStorage","setItem","JSON","stringify","getItem","oldVal","getObject","setObject","removeItem","CreateAccountView","login","password","email","errorCleared","saveToken","handleLoginChange","handlePasswordChange","handleEmailChange","handleFnChange","handleToggleSaveToken","onCreateAccount","submitClasses","login_prompt","password_prompt","full_name_prompt","email_prompt","stay_logged_in","EditAccountView","me","onBasicNavigate","AccGeneralView","credentials","getCredentials","addCredActive","addCredInvalid","newCred","previousOnTags","tnNewTags","tnCredsUpdated","handleCredChange","handleCredKeyDown","handleCredEntered","onCredsUpdated","creds","onUpdateAccount","method","asPhone","asEmail","onCredAdd","onUpdateTags","cred","meth","done","onCredConfirm","onCredDelete","full_name_placeholder","title_tag_manager","handleCheckboxClick","onToggleMessageSounds","onTogglePushNotifications","onToggleIncognitoMode","messageSounds","desktopAlertsEnabled","desktopAlerts","incognitoMode","delete_account","delete_account_warning","AccSecurityView","blockedCount","handlePasswordUpdate","handleDeleteAccount","pwd","onDeleteAccount","password_unchanged","onLogout","onShowBlocked","AccSupportView","LoginView","hostName","onLogin","autoCorrect","autoCapitalize","invalid_id","NewTopicById","groupId","NewTopicGroup","handlePrivateChange","handleTagsChanged","handleChannelToggle","SearchContacts","edited","handleSearchChange","handleSearch","handleClear","onSearchContacts","search_placeholder","search_for_contacts","search_no_results","NewTopicView","tabSelected","searchQuery","handleTabClick","handleSearchContacts","handleNewGroupSubmit","handleGroupByID","addUrlParam","removeUrlParam","onCreateTopic","priv","no_contacts_placeholder","searchResults","PasswordResetView","token","scheme","onReset","onRequest","reset","HostSelector","changed","handleHostNameChange","onServerAddressChange","hostOptions","list","SettingsView","transport","handleTransportSelected","handleServerAddressChange","onUpdate","def","ws","lp","transportOptions","phone","ValidationView","credCode","credMethod","numbers_only","SidepanelView","handleLoginRequested","handleNewTopic","onLoginRequest","view","errorAction","errorActionText","loadSpinnerVisible","loginDisabled","onGlobalSettings","onUpdateAccountTags","onValidateCredentials","onPasswordResetRequest","onResetPassword","detectServerAddress","host","protocol","hostname","port","isSecureConnection","POP_SOUND","Audio","reconnect_countdown","reconnect_now","push_init_failed","invalid_security_token","no_connection","code_doesnot_match","TinodeWeb","getBlankState","handleResize","handleHashRoute","handleOnline","checkForAppUpdate","handleVisibilityEvent","handleError","handleLoginRequest","handleConnected","handleAutoreconnectIteration","doLogin","handleCredentialsRequest","handleLoginSuccessful","handleDisconnect","tnMeMetaDesc","tnMeContactUpdate","tnMeSubsUpdated","resetContactList","tnData","tnInitFind","tnFndSubsUpdated","handleTopicSelected","handleHideMessagesView","handleSendMessage","handleNewChatInvitation","handleNewAccount","handleNewAccountRequest","handleUpdateAccountRequest","handleUpdateAccountTagsRequest","handleToggleIncognitoMode","handleSettings","handleGlobalSettings","handleShowArchive","handleShowBlocked","handleToggleMessageSounds","handleCredAdd","handleCredDelete","handleCredConfirm","initDesktopAlerts","togglePushToken","requestPushToken","handleSidepanelCancel","handleStartTopicRequest","handleNewTopicCreated","handleTopicUpdateRequest","handleChangePermissions","handleLogout","handleDeleteMessagesRequest","handleLeaveUnsubRequest","handleBlockTopicRequest","handleReportTopic","handleShowContextMenu","defaultTopicContextMenu","handleHideContextMenu","handleShowAlert","handleShowInfoView","handleHideInfoView","handleValidateCredentialsRequest","handlePasswordResetRequest","handleResetPassword","handleContextMenuAction","settings","autoLogin","messageSoundsOff","FIREBASE_INIT","firebaseToken","hidden","sidePanelSelected","sidePanelTitle","sidePanelAvatar","liveConnection","onLine","topicSelectedOnline","topicSelectedAcs","innerWidth","showInfoPanel","mobilePanel","contextMenuVisible","contextMenuBounds","contextMenuClickAt","contextMenuParams","contextMenuItems","alertVisible","alertParams","documentElement","clientWidth","clientHeight","tnSetup","onConnect","onDisconnect","onAutoreconnectIteration","fbPush","usePublicVapidKey","messagingVapidKey","serviceWorker","register","reg","useServiceWorker","postMessage","setDeviceToken","parsedNav","expires","setAuthToken","connect","tab","readTimer","readTimerCallback","setHumanLanguage","enableLogging","mobile","onupdatefound","installingWorker","installing","onstatechange","controller","newTopicTabSelected","isConnected","getServerInfo","ver","sec","prom","reconnectCountdown","timeLeft","seconds","secondsToTime","reconnect","isAuthenticated","promise","getAuthToken","loginBasic","loginToken","onContactUpdate","getCurrentUserID","withDesc","withCred","disconnect","setUrlSidePanel","isPresencer","archived","isArchived","play","foundContacts","merged","updated","prepareSearchableContacts","receivedTimer","noteRecv","fnd","getFndTopic","withSub","s","setMeta","isTopicOnline","getTopicAccessMode","isP2P","am","updateWant","login_","password_","public_","cred_","tags_","createAccountBasic","updateAccountBasic","getCurrentLogin","on","onTokenRefresh","onMessage","payload","enabled","requestPermission","deleteToken","getToken","refreshedToken","delCredential","basicNavigator","isTopicCached","newGroupTopicName","oldName","newName","permissions","updateGiven","delCurrentUser","publish","self_blocked","subscribed","confirmText","rejectText","invite","requestResetAuthSecret","newPassword","str","btoa","atob","base64ReEncode","onAddMember","handleManageGroupMembers","hl","languages","baseLanguage","allMessages","IntlProvider","textComponent"],"mappings":"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","file":"index.prod.js","sourcesContent":["// The require scope\nvar __webpack_require__ = {};\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = function(module) {\n\tvar getter = module && module.__esModule ?\n\t\tfunction() { return module['default']; } :\n\t\tfunction() { return module; };\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = function(exports, definition) {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.o = function(obj, prop) { return Object.prototype.hasOwnProperty.call(obj, prop); }","var __WEBPACK_NAMESPACE_OBJECT__ = React;","var __WEBPACK_NAMESPACE_OBJECT__ = ReactDOM;","var __WEBPACK_NAMESPACE_OBJECT__ = ReactIntl;","var __WEBPACK_NAMESPACE_OBJECT__ = firebase;","var __WEBPACK_NAMESPACE_OBJECT__ = Tinode;","var __WEBPACK_NAMESPACE_OBJECT__ = firebase.messaging;","import React from 'react';\nimport { FormattedMessage } from 'react-intl';\n\nexport default class Alert extends React.PureComponent {\n render() {\n return this.props.visible ?\n \n {menu}\n
\n );\n }\n}\n\nexport default injectIntl(ContextMenu);\n","// Short representation of time in the past.\nexport function shortDateFormat(then, locale) {\n locale = locale || window.navigator.userLanguage || window.navigator.language;\n const now = new Date();\n if (then.getFullYear() == now.getFullYear()) {\n if (then.getMonth() == now.getMonth() && then.getDate() == now.getDate()) {\n\t return then.toLocaleTimeString(locale, {hour12: false, hour: '2-digit', minute: '2-digit'});\n } else {\n\t return then.toLocaleDateString(locale,\n {hour12: false, month: 'short', day: 'numeric', hour: '2-digit', minute: '2-digit'});\n }\n }\n return then.toLocaleDateString(locale,\n {hour12: false, year: 'numeric', month: 'short', day: 'numeric', hour: '2-digit', minute: '2-digit'});\n}\n\n// Convert seconds to minutes:seconds, i.e. 156 sec -> 2:36.\nexport function secondsToTime(seconds) {\n const min = Math.floor(seconds / 60);\n let sec = seconds % 60;\n sec = sec < 10 ? `0${sec}` : sec;\n return `${min}:${sec}`;\n}\n\n// Convert a number of bytes to human-readable format.\nexport function bytesToHumanSize(bytes) {\n if (!bytes || bytes == 0) {\n return '0 Bytes';\n }\n\n const sizes = ['Bytes', 'KB', 'MB', 'GB', 'TB', 'PB'];\n const bucket = Math.min(Math.floor(Math.log2(bytes) / 10) | 0, sizes.length-1);\n const count = bytes / Math.pow(1024, bucket);\n const round = bucket > 0 ? (count < 3 ? 2 : (count < 30 ? 1 : 0)) : 0;\n return count.toFixed(round) + ' ' + sizes[bucket];\n}\n\n// Get 32 bit integer hash value for a string. Ideally it should produce the same value\n// as Java's String#hash().\nexport function stringHash(value) {\n let hash = 0;\n value = '' + value;\n for (let i = 0; i < value.length; i++) {\n hash = ((hash << 5) - hash) + value.charCodeAt(i);\n hash = hash & hash; // Convert to 32bit integer\n }\n return hash;\n}\n","import React from 'react';\n\nimport Tinode from 'tinode-sdk';\n\nimport { stringHash } from '../lib/strformat.js';\n\nexport default class LetterTile extends React.PureComponent {\n render() {\n let avatar;\n if (this.props.avatar === true) {\n const isGroup = (Tinode.topicType(this.props.topic) == 'grp');\n const iconColor = (isGroup ? 'light-color' : 'dark-color')\n + (Math.abs(stringHash(this.props.topic)) % 16);\n if (this.props.topic && this.props.title && this.props.title.trim()) {\n const letter = this.props.title.trim().charAt(0);\n const className = 'lettertile ' + iconColor;\n avatar = ({e.target.onerror = null; e.target.src=\"/img/broken_image.png\"}} />;\n } else {\n avatar = null;\n }\n return avatar;\n }\n}\n","// File and image helper functions.\nimport { MAX_INBAND_ATTACHMENT_SIZE, MAX_IMAGE_DIM } from '../config.js';\nimport { bytesToHumanSize } from './strformat.js'\n\n// Supported image MIME types and corresponding file extensions.\nexport const SUPPORTED_IMAGE_FORMATS = ['image/jpeg', 'image/gif', 'image/png', 'image/svg', 'image/svg+xml'];\nexport const MIME_EXTENSIONS = ['jpg', 'gif', 'png', 'svg', 'svg'];\n\n// Make a data URL from public.photo\nexport function makeImageUrl(photo) {\n return (photo && photo.type && photo.data) ?\n 'data:image/' + photo.type + ';base64,' + photo.data : null;\n}\n\n// Calculate linear dimensions for scaling image down to fit under a certain size.\n// Returns an object which contains destination sizes, source sizes, and offsets\n// into source (when making square images).\nexport function fitImageSize(width, height, maxWidth, maxHeight, forceSquare) {\n // Sanitize input\n width = width | 0;\n height = height | 0;\n maxWidth = maxWidth | 0;\n maxHeight = maxHeight | 0;\n\n if (width <= 0 || height <= 0 || maxWidth <= 0 || maxHeight <= 0) {\n return null;\n }\n\n if (forceSquare) {\n maxWidth = maxHeight = Math.min(maxWidth, maxHeight);\n }\n\n let scale = Math.min(\n Math.min(width, maxWidth) / width,\n Math.min(height, maxHeight) / height\n );\n\n let size = {\n dstWidth: (width * scale) | 0,\n dstHeight: (height * scale) | 0,\n };\n\n if (forceSquare) {\n // Also calculate parameters for making the image square.\n size.dstWidth = size.dstHeight = Math.min(size.dstWidth, size.dstHeight);\n size.srcWidth = size.srcHeight = Math.min(width, height);\n size.xoffset = ((width - size.srcWidth) / 2) | 0;\n size.yoffset = ((height - size.srcWidth) / 2) | 0;\n } else {\n size.xoffset = size.yoffset = 0;\n size.srcWidth = width;\n size.srcHeight = height;\n }\n return size;\n}\n\n// Ensure file's extension matches mime content type\nexport function fileNameForMime(fname, mime) {\n const idx = SUPPORTED_IMAGE_FORMATS.indexOf(mime);\n if (idx < 0 || !fname) {\n // Unknown mime or empty name.\n return fname;\n }\n const ext = MIME_EXTENSIONS[idx];\n\n const at = fname.lastIndexOf('.');\n if (at >= 0) {\n fname = fname.substring(0, at);\n }\n return fname + '.' + ext;\n}\n\n// Scale uploaded image to fit under certain dimensions and byte size, optionally constraining to a square.\n// On success calls onSuccess callback with the scaled image as Blob.\nexport function imageScaled(fileOrBlob, maxWidth, maxHeight, maxSize, forceSquare, onSuccess, onError) {\n const img = new Image();\n img.crossOrigin = 'Anonymous';\n img.onerror = function(err) {\n onError(\"Image format unrecognized\");\n }\n img.onload = async function() {\n // Once the image is loaded, the URL is no longer needed.\n URL.revokeObjectURL(img.src);\n\n // Calculate the desired image dimensions.\n const dim = fitImageSize(this.width, this.height, maxWidth, maxHeight, forceSquare);\n if (!dim) {\n onError(\"Invalid image\");\n return;\n }\n let canvas = document.createElement('canvas');\n canvas.width = dim.dstWidth;\n canvas.height = dim.dstHeight;\n let ctx = canvas.getContext('2d');\n ctx.imageSmoothingEnabled = true;\n ctx.drawImage(this, dim.xoffset, dim.yoffset, dim.srcWidth, dim.srcHeight,\n 0, 0, dim.dstWidth, dim.dstHeight);\n\n const mime = SUPPORTED_IMAGE_FORMATS.indexOf(fileOrBlob.type) < 0 ? 'image/jpeg' : fileOrBlob.type;\n // Generate blob to check size of the image.\n let blob = await new Promise(resolve => canvas.toBlob(resolve, mime));\n if (!blob) {\n onError(\"Unsupported image format\");\n return;\n }\n\n // Ensure the image is not too large. Shrink the image keeping the aspect ratio.\n // Do nothing if maxsize is <= 0.\n while (maxSize > 0 && blob.length > maxSize) {\n dim.dstWidth = (dim.dstWidth * 0.70710678118) | 0;\n dim.dstHeight = (dim.dstHeight * 0.70710678118) | 0;\n canvas.width = dim.dstWidth;\n canvas.height = dim.dstHeight;\n ctx = canvas.getContext('2d');\n ctx.clearRect(0, 0, canvas.width, canvas.height);\n ctx.drawImage(this, dim.xoffset, dim.yoffset, dim.srcWidth, dim.srcHeight,\n 0, 0, dim.dstWidth, dim.dstHeight);\n blob = await new Promise(resolve => canvas.toBlob(resolve, mime));\n }\n\n canvas = null;\n onSuccess(blob, mime, dim.dstWidth, dim.dstHeight, fileNameForMime(fileOrBlob.name, mime));\n };\n img.src = URL.createObjectURL(fileOrBlob);\n}\n\n// Convert File to base64 string.\nexport function fileToBase64(file, onSuccess) {\n const reader = new FileReader();\n reader.addEventListener('load', function() {\n onSuccess(file.type, reader.result.split(',')[1], file.name);\n });\n reader.readAsDataURL(file);\n}\n\n// Convert Blob to base64 string.\nexport function blobToBase64(blob, onSuccess) {\n const reader = new FileReader();\n reader.addEventListener('load', function() {\n onSuccess(blob.type, reader.result.split(',')[1]);\n });\n reader.readAsDataURL(blob);\n}\n\n// File pasted from the clipboard. It's either an inline image or a file attachment.\n// FIXME: handle large files out of band.\nexport function filePasted(event, onImageSuccess, onAttachmentSuccess, onError) {\n var items = (event.clipboardData || event.originalEvent.clipboardData || {}).items;\n for (var i in items) {\n var item = items[i];\n if (item.kind === 'file') {\n var file = item.getAsFile();\n if (!file) {\n console.log(\"Failed to get file object from pasted file item\", item.kind, item.type);\n continue;\n }\n if (file.type && file.type.split('/')[0] == 'image') {\n // Handle inline image\n if (file.size > MAX_INBAND_ATTACHMENT_SIZE || SUPPORTED_IMAGE_FORMATS.indexOf(file.type) < 0) {\n imageFileScaledToBase64(file, MAX_IMAGE_DIM, MAX_IMAGE_DIM, false, onImageSuccess, onError);\n } else {\n imageFileToBase64(file, onImageSuccess, onError);\n }\n } else {\n // Handle file attachment\n fileToBase64(file, onAttachmentSuccess, onError)\n }\n // Indicate that the pasted data contains a file.\n return true;\n }\n }\n // No file found.\n return false;\n}\n\n// Get mime type from data URL header.\nexport function getMimeType(header) {\n var mime = /^data:(image\\/[-+a-z0-9.]+);base64/.exec(header);\n return (mime && mime.length > 1) ? mime[1] : null;\n}\n\n// Given length of a binary object in bytes, calculate the length after\n// base64 encoding.\nexport function base64EncodedLen(n) {\n return Math.floor((n + 2) / 3) * 4;\n}\n\n// Given length of a base64-encoded object, calculate decoded size of the\n// pbject in bytes.\nexport function base64DecodedLen(n) {\n return Math.floor(n / 4) * 3;\n}\n\n// Re-encode string to standard base64 encoding with padding.\n// The string may be base64-URL encoded without the padding.\nexport function base64ReEncode(str) {\n if (str) {\n str = str.replace(/-/g, '+').replace(/_/g, '/');\n try {\n str = btoa(atob(str));\n } catch(err) {\n console.log(\"Failed to base64 re-encode string.\", err);\n str = null;\n }\n }\n return str;\n}\n","import React from 'react';\n\nimport LetterTile from './letter-tile.jsx';\n\nimport { AVATAR_SIZE, MAX_EXTERN_ATTACHMENT_SIZE } from '../config.js';\nimport { imageScaled, blobToBase64, makeImageUrl } from '../lib/blob-helpers.js';\n\nexport default class AvatarUpload extends React.Component {\n constructor(props) {\n super(props);\n\n this.state = {\n dataUrl: props.avatar\n };\n\n this.handleFileUpload = this.handleFileUpload.bind(this);\n }\n\n componentDidUpdate(prevProps) {\n if (this.props.avatar != prevProps.avatar) {\n this.setState({dataUrl: this.props.avatar})\n }\n }\n\n handleFileUpload(e) {\n imageScaled(e.target.files[0], AVATAR_SIZE, AVATAR_SIZE, MAX_EXTERN_ATTACHMENT_SIZE, true,\n // Image successfully scaled and converted.\n (mime, blob) => {\n // Convert blob to base64-encoded bits.\n blobToBase64(blob, (unused, base64bits) => {\n const du = makeImageUrl({data: base64bits, type: mime});\n this.setState({dataUrl: du});\n this.props.onImageChanged(du);\n });\n },\n // Failure\n (err) => {\n this.props.onError(err, 'err');\n });\n // Clear the value so the same file can be uploaded again.\n e.target.value = '';\n }\n\n render() {\n // Randomize id value in case more than one AvatarUpload is shown\n // at the same time.\n const randId = 'file-input-avatar-' + (Math.random() + '').substr(2);\n const className = 'avatar-upload' + (this.props.readOnly ? ' read-only' : '');\n return (\n
:\n this.props.readOnly && this.props.uid ?\n
: null}\n \n {contactNodes}\n
\n :\n null\n }\n \n \n );\n }\n\n return (\n {names[c]} \n {skip.indexOf(c) < 0 ?\n {this.props.compare ? \n : null}\n
: null}\n \n \n {this.props.compare ?\n
\n \n :\n null}\n \n {items}\n {this.props.modeTitle} \n {this.props.compareTitle} \n
\n field: the URL must be a relative URL or\n// have http:, https:, blob: or data: scheme.\n// The relative URL is appended with the API key and/or auth token.\n// In case of data: scheme, the URL must start with a 'data:image/XXXX;base64,'.\nexport function sanitizeImageUrl(url) {\n if (!url) {\n return null;\n }\n\n const sanitizedUrl = sanitizeUrl(url);\n if (sanitizedUrl) {\n return sanitizedUrl;\n }\n\n // Is this a data: URL of an image?\n if (/data:image\\/[a-z0-9.-]+;base64,/i.test(url.trim())) {\n return url;\n }\n\n return null;\n}\n","// TagManager: edit topic or user tags.\nimport React from 'react';\nimport { FormattedMessage } from 'react-intl';\n\nimport ChipInput from './chip-input.jsx';\n\nimport { MAX_TAG_COUNT, MAX_TAG_LENGTH, MIN_TAG_LENGTH } from '../config.js';\nimport { arrayEqual } from '../lib/utils.js';\n\nexport default class TagManager extends React.Component {\n constructor(props) {\n super(props);\n\n this.state = {\n tags: this.props.tags,\n tagInput: '',\n activated: this.props.activated\n };\n\n this.handleTagInput = this.handleTagInput.bind(this);\n this.handleAddTag = this.handleAddTag.bind(this);\n this.handleRemoveTag = this.handleRemoveTag.bind(this);\n this.handleSubmit = this.handleSubmit.bind(this);\n this.handleCancel = this.handleCancel.bind(this);\n }\n\n static getDerivedStateFromProps(nextProps, prevState) {\n if (!arrayEqual(nextProps.tags, prevState.tags) && !prevState.activated) {\n return {tags: nextProps.tags};\n }\n return null;\n }\n\n handleTagInput(text) {\n this.setState({tagInput: text});\n if (text.length > 0) {\n const last = text[text.length-1];\n if (text[0] == '\"') {\n // This is a quoted string.\n if (text.length > 1 && last == '\"') {\n this.handleAddTag(text.substring(1, text.length-1));\n }\n } else if (last == ',' || last == ' ' || last == ';' || last == '\"') {\n // User entered ',', ' ' or ';'\n this.handleAddTag(text.substring(0, text.length-1).trim());\n }\n }\n }\n\n handleAddTag(tag) {\n const maxTagCount = this.props.tinode.getServerLimit('maxTagCount', MAX_TAG_COUNT);\n\n if (tag.length > 0 && this.state.tags.length < maxTagCount) {\n const tags = this.state.tags.slice(0);\n tags.push(tag);\n\n this.setState({tags: tags, tagInput: ''});\n if (this.props.onTagsChanged) {\n this.props.onTagsChanged(tags);\n }\n return tags;\n }\n return this.state.tags;\n }\n\n handleRemoveTag(tag, index) {\n const tags = this.state.tags.slice(0);\n tags.splice(index, 1);\n this.setState({tags: tags});\n if (this.props.onTagsChanged) {\n this.props.onTagsChanged(tags);\n }\n }\n\n handleSubmit() {\n // Add unprocessed input to tags, submit the list.\n this.props.onSubmit(this.handleAddTag(this.state.tagInput.trim()));\n this.setState({activated: false, tags: this.props.tags});\n }\n\n handleCancel() {\n this.setState({activated: false, tagInput: '', tags: this.props.tags});\n if (this.props.onCancel) {\n this.props.onCancel();\n }\n }\n\n render() {\n const minTagLength = this.props.tinode.getServerLimit('minTagLength', MIN_TAG_LENGTH);\n const maxTagLength = this.props.tinode.getServerLimit('maxTagLength', MAX_TAG_LENGTH);\n\n let tags = [];\n if (this.state.activated) {\n this.state.tags.map((tag) => {\n tags.push({user: tag, invalid: (tag.length < minTagLength || tag.length > maxTagLength)});\n });\n } else {\n this.state.tags.map((tag) => {\n tags.push({tag});\n });\n if (tags.length == 0) {\n tags = (\n \n
.\n el = UploadingImage;\n }\n }\n break;\n case 'BN':\n // Button\n attr.onClick = this.handleFormButtonClick;\n let inner = React.Children.map(values, (child) => {\n return typeof child == 'string' ? child : undefined;\n });\n if (!inner || inner.length == 0) {\n inner = [attr.name]\n }\n // Get text which will be sent back when the button is clicked.\n attr['data-title'] = inner.join('');\n break;\n case 'FM':\n // Form\n attr.className = 'bot-form';\n break;\n case 'FE':\n // Form element formatting is dependent on element content.\n break;\n }\n return React.createElement(el, attr, values);\n } else {\n return values;\n }\n};\n","// Send message form.\nimport React from 'react';\nimport { defineMessages, injectIntl } from 'react-intl';\nimport { Drafty } from 'tinode-sdk';\n\nimport { KEYPRESS_DELAY } from '../config.js';\nimport { filePasted } from '../lib/blob-helpers.js';\n\nconst messages = defineMessages({\n 'messaging_disabled': {\n id: 'messaging_disabled_prompt',\n defaultMessage: 'Messaging disabled',\n description: 'Prompt in SendMessage in read-only topic'\n },\n 'type_new_message': {\n id: 'new_message_prompt',\n defaultMessage: 'New message',\n description: 'Prompt in send message field'\n },\n 'add_image_caption': {\n id: 'image_caption_prompt',\n defaultMessage: 'Image caption',\n description: 'Prompt in SendMessage for attached image'\n },\n 'file_attachment_too_large': {\n id: 'file_attachment_too_large',\n defaultMessage: 'The file size {size} exceeds the {limit} limit.',\n description: 'Error message when attachment is too large'\n },\n 'cannot_initiate_upload': {\n id: 'cannot_initiate_file_upload',\n defaultMessage: 'Cannot initiate file upload.',\n description: 'Generic error messagewhen attachment fails'\n },\n});\n\nclass SendMessage extends React.PureComponent {\n constructor(props) {\n super(props);\n\n this.state = {\n message: '',\n // Make initial keypress time as if it happened 5001 milliseconds in the past.\n keypressTimestamp: new Date().getTime() - KEYPRESS_DELAY - 1\n };\n\n this.handlePasteEvent = this.handlePasteEvent.bind(this);\n this.handleAttachImage = this.handleAttachImage.bind(this);\n this.handleAttachFile = this.handleAttachFile.bind(this);\n this.handleSend = this.handleSend.bind(this);\n this.handleKeyPress = this.handleKeyPress.bind(this);\n this.handleMessageTyping = this.handleMessageTyping.bind(this);\n }\n\n componentDidMount() {\n if (this.messageEditArea) {\n this.messageEditArea.addEventListener('paste', this.handlePasteEvent, false);\n }\n }\n\n componentWillUnmount() {\n if (this.messageEditArea) {\n this.messageEditArea.removeEventListener('paste', this.handlePasteEvent, false);\n }\n }\n\n componentDidUpdate() {\n if (this.messageEditArea) {\n this.messageEditArea.focus();\n }\n }\n\n handlePasteEvent(e) {\n if (this.props.disabled) {\n return;\n }\n // FIXME: handle large files too.\n if (filePasted(e,\n (bits, mime, width, height, fname) => {\n this.props.onAttachImage(mime, bits, width, height, fname);\n },\n (mime, bits, fname) => {\n this.props.onAttachFile(mime, bits, fname);\n },\n this.props.onError)) {\n\n // If a file was pasted, don't paste base64 data into input field.\n e.preventDefault();\n }\n }\n\n handleAttachImage(e) {\n if (e.target.files && e.target.files.length > 0) {\n this.props.onAttachImage(e.target.files[0]);\n }\n // Clear the value so the same file can be uploaded again.\n e.target.value = '';\n }\n\n handleAttachFile(e) {\n const {formatMessage} = this.props.intl;\n if (e.target.files && e.target.files.length > 0) {\n this.props.onAttachFile(e.target.files[0]);\n }\n // Clear the value so the same file can be uploaded again.\n e.target.value = '';\n }\n\n handleSend(e) {\n e.preventDefault();\n const message = this.state.message.trim();\n if (message || this.props.acceptBlank || this.props.noInput) {\n this.props.onSendMessage(message);\n this.setState({message: ''});\n }\n }\n\n /* Send on Enter key */\n handleKeyPress(e) {\n // Remove this if you don't want Enter to trigger send\n if (e.key === 'Enter') {\n // Have Shift-Enter insert a line break instead\n if (!e.shiftKey) {\n e.preventDefault();\n e.stopPropagation();\n\n this.handleSend(e);\n }\n }\n }\n\n handleMessageTyping(e) {\n const newState = {message: e.target.value};\n if (this.props.onKeyPress) {\n const now = new Date().getTime();\n if (now - this.state.keypressTimestamp > KEYPRESS_DELAY) {\n this.props.onKeyPress();\n newState.keypressTimestamp = now;\n }\n }\n this.setState(newState);\n }\n\n render() {\n const {formatMessage} = this.props.intl;\n const prompt = this.props.disabled ?\n formatMessage(messages.messaging_disabled) :\n (this.props.messagePrompt ?\n formatMessage(messages[this.props.messagePrompt]) :\n formatMessage(messages.type_new_message));\n return (\n
\n
\n {messageNodes}\n
\n \n {menu}\n
\n );\n }\n}\n\nexport default injectIntl(ContextMenu);\n","// Short representation of time in the past.\nexport function shortDateFormat(then, locale) {\n locale = locale || window.navigator.userLanguage || window.navigator.language;\n const now = new Date();\n if (then.getFullYear() == now.getFullYear()) {\n if (then.getMonth() == now.getMonth() && then.getDate() == now.getDate()) {\n\t return then.toLocaleTimeString(locale, {hour12: false, hour: '2-digit', minute: '2-digit'});\n } else {\n\t return then.toLocaleDateString(locale,\n {hour12: false, month: 'short', day: 'numeric', hour: '2-digit', minute: '2-digit'});\n }\n }\n return then.toLocaleDateString(locale,\n {hour12: false, year: 'numeric', month: 'short', day: 'numeric', hour: '2-digit', minute: '2-digit'});\n}\n\n// Convert seconds to minutes:seconds, i.e. 156 sec -> 2:36.\nexport function secondsToTime(seconds) {\n const min = Math.floor(seconds / 60);\n let sec = seconds % 60;\n sec = sec < 10 ? `0${sec}` : sec;\n return `${min}:${sec}`;\n}\n\n// Convert a number of bytes to human-readable format.\nexport function bytesToHumanSize(bytes) {\n if (!bytes || bytes == 0) {\n return '0 Bytes';\n }\n\n const sizes = ['Bytes', 'KB', 'MB', 'GB', 'TB', 'PB'];\n const bucket = Math.min(Math.floor(Math.log2(bytes) / 10) | 0, sizes.length-1);\n const count = bytes / Math.pow(1024, bucket);\n const round = bucket > 0 ? (count < 3 ? 2 : (count < 30 ? 1 : 0)) : 0;\n return count.toFixed(round) + ' ' + sizes[bucket];\n}\n\n// Get 32 bit integer hash value for a string. Ideally it should produce the same value\n// as Java's String#hash().\nexport function stringHash(value) {\n let hash = 0;\n value = '' + value;\n for (let i = 0; i < value.length; i++) {\n hash = ((hash << 5) - hash) + value.charCodeAt(i);\n hash = hash & hash; // Convert to 32bit integer\n }\n return hash;\n}\n","import React from 'react';\n\nimport Tinode from 'tinode-sdk';\n\nimport { stringHash } from '../lib/strformat.js';\n\nexport default class LetterTile extends React.PureComponent {\n render() {\n let avatar;\n if (this.props.avatar === true) {\n const isGroup = (Tinode.topicType(this.props.topic) == 'grp');\n const iconColor = (isGroup ? 'light-color' : 'dark-color')\n + (Math.abs(stringHash(this.props.topic)) % 16);\n if (this.props.topic && this.props.title && this.props.title.trim()) {\n const letter = this.props.title.trim().charAt(0);\n const className = 'lettertile ' + iconColor;\n avatar = ({e.target.onerror = null; e.target.src=\"/img/broken_image.png\"}} />;\n } else {\n avatar = null;\n }\n return avatar;\n }\n}\n","// File and image helper functions.\nimport { MAX_INBAND_ATTACHMENT_SIZE, MAX_IMAGE_DIM } from '../config.js';\nimport { bytesToHumanSize } from './strformat.js'\n\n// Supported image MIME types and corresponding file extensions.\nexport const SUPPORTED_IMAGE_FORMATS = ['image/jpeg', 'image/gif', 'image/png', 'image/svg', 'image/svg+xml'];\nexport const MIME_EXTENSIONS = ['jpg', 'gif', 'png', 'svg', 'svg'];\n\n// Make a data URL from public.photo\nexport function makeImageUrl(photo) {\n return (photo && photo.type && photo.data) ?\n 'data:image/' + photo.type + ';base64,' + photo.data : null;\n}\n\n// Calculate linear dimensions for scaling image down to fit under a certain size.\n// Returns an object which contains destination sizes, source sizes, and offsets\n// into source (when making square images).\nexport function fitImageSize(width, height, maxWidth, maxHeight, forceSquare) {\n // Sanitize input\n width = width | 0;\n height = height | 0;\n maxWidth = maxWidth | 0;\n maxHeight = maxHeight | 0;\n\n if (width <= 0 || height <= 0 || maxWidth <= 0 || maxHeight <= 0) {\n return null;\n }\n\n if (forceSquare) {\n maxWidth = maxHeight = Math.min(maxWidth, maxHeight);\n }\n\n let scale = Math.min(\n Math.min(width, maxWidth) / width,\n Math.min(height, maxHeight) / height\n );\n\n let size = {\n dstWidth: (width * scale) | 0,\n dstHeight: (height * scale) | 0,\n };\n\n if (forceSquare) {\n // Also calculate parameters for making the image square.\n size.dstWidth = size.dstHeight = Math.min(size.dstWidth, size.dstHeight);\n size.srcWidth = size.srcHeight = Math.min(width, height);\n size.xoffset = ((width - size.srcWidth) / 2) | 0;\n size.yoffset = ((height - size.srcWidth) / 2) | 0;\n } else {\n size.xoffset = size.yoffset = 0;\n size.srcWidth = width;\n size.srcHeight = height;\n }\n return size;\n}\n\n// Ensure file's extension matches mime content type\nexport function fileNameForMime(fname, mime) {\n const idx = SUPPORTED_IMAGE_FORMATS.indexOf(mime);\n if (idx < 0 || !fname) {\n // Unknown mime or empty name.\n return fname;\n }\n const ext = MIME_EXTENSIONS[idx];\n\n const at = fname.lastIndexOf('.');\n if (at >= 0) {\n fname = fname.substring(0, at);\n }\n return fname + '.' + ext;\n}\n\n// Scale uploaded image to fit under certain dimensions and byte size, optionally constraining to a square.\n// On success calls onSuccess callback with the scaled image as Blob.\nexport function imageScaled(fileOrBlob, maxWidth, maxHeight, maxSize, forceSquare, onSuccess, onError) {\n const img = new Image();\n img.crossOrigin = 'Anonymous';\n img.onerror = function(err) {\n onError(\"Image format unrecognized\");\n }\n img.onload = async function() {\n // Once the image is loaded, the URL is no longer needed.\n URL.revokeObjectURL(img.src);\n\n // Calculate the desired image dimensions.\n const dim = fitImageSize(this.width, this.height, maxWidth, maxHeight, forceSquare);\n if (!dim) {\n onError(\"Invalid image\");\n return;\n }\n let canvas = document.createElement('canvas');\n canvas.width = dim.dstWidth;\n canvas.height = dim.dstHeight;\n let ctx = canvas.getContext('2d');\n ctx.imageSmoothingEnabled = true;\n ctx.drawImage(this, dim.xoffset, dim.yoffset, dim.srcWidth, dim.srcHeight,\n 0, 0, dim.dstWidth, dim.dstHeight);\n\n const mime = SUPPORTED_IMAGE_FORMATS.indexOf(fileOrBlob.type) < 0 ? 'image/jpeg' : fileOrBlob.type;\n // Generate blob to check size of the image.\n let blob = await new Promise(resolve => canvas.toBlob(resolve, mime));\n if (!blob) {\n onError(\"Unsupported image format\");\n return;\n }\n\n // Ensure the image is not too large. Shrink the image keeping the aspect ratio.\n // Do nothing if maxsize is <= 0.\n while (maxSize > 0 && blob.length > maxSize) {\n dim.dstWidth = (dim.dstWidth * 0.70710678118) | 0;\n dim.dstHeight = (dim.dstHeight * 0.70710678118) | 0;\n canvas.width = dim.dstWidth;\n canvas.height = dim.dstHeight;\n ctx = canvas.getContext('2d');\n ctx.clearRect(0, 0, canvas.width, canvas.height);\n ctx.drawImage(this, dim.xoffset, dim.yoffset, dim.srcWidth, dim.srcHeight,\n 0, 0, dim.dstWidth, dim.dstHeight);\n blob = await new Promise(resolve => canvas.toBlob(resolve, mime));\n }\n\n canvas = null;\n onSuccess(blob, mime, dim.dstWidth, dim.dstHeight, fileNameForMime(fileOrBlob.name, mime));\n };\n img.src = URL.createObjectURL(fileOrBlob);\n}\n\n// Convert File to base64 string.\nexport function fileToBase64(file, onSuccess) {\n const reader = new FileReader();\n reader.addEventListener('load', function() {\n onSuccess(file.type, reader.result.split(',')[1], file.name);\n });\n reader.readAsDataURL(file);\n}\n\n// Convert Blob to base64 string.\nexport function blobToBase64(blob, onSuccess) {\n const reader = new FileReader();\n reader.addEventListener('load', function() {\n onSuccess(blob.type, reader.result.split(',')[1]);\n });\n reader.readAsDataURL(blob);\n}\n\n// File pasted from the clipboard. It's either an inline image or a file attachment.\n// FIXME: handle large files out of band.\nexport function filePasted(event, onImageSuccess, onAttachmentSuccess, onError) {\n var items = (event.clipboardData || event.originalEvent.clipboardData || {}).items;\n for (var i in items) {\n var item = items[i];\n if (item.kind === 'file') {\n var file = item.getAsFile();\n if (!file) {\n console.log(\"Failed to get file object from pasted file item\", item.kind, item.type);\n continue;\n }\n if (file.type && file.type.split('/')[0] == 'image') {\n // Handle inline image\n if (file.size > MAX_INBAND_ATTACHMENT_SIZE || SUPPORTED_IMAGE_FORMATS.indexOf(file.type) < 0) {\n imageFileScaledToBase64(file, MAX_IMAGE_DIM, MAX_IMAGE_DIM, false, onImageSuccess, onError);\n } else {\n imageFileToBase64(file, onImageSuccess, onError);\n }\n } else {\n // Handle file attachment\n fileToBase64(file, onAttachmentSuccess, onError)\n }\n // Indicate that the pasted data contains a file.\n return true;\n }\n }\n // No file found.\n return false;\n}\n\n// Get mime type from data URL header.\nexport function getMimeType(header) {\n var mime = /^data:(image\\/[-+a-z0-9.]+);base64/.exec(header);\n return (mime && mime.length > 1) ? mime[1] : null;\n}\n\n// Given length of a binary object in bytes, calculate the length after\n// base64 encoding.\nexport function base64EncodedLen(n) {\n return Math.floor((n + 2) / 3) * 4;\n}\n\n// Given length of a base64-encoded object, calculate decoded size of the\n// pbject in bytes.\nexport function base64DecodedLen(n) {\n return Math.floor(n / 4) * 3;\n}\n\n// Re-encode string to standard base64 encoding with padding.\n// The string may be base64-URL encoded without the padding.\nexport function base64ReEncode(str) {\n if (str) {\n str = str.replace(/-/g, '+').replace(/_/g, '/');\n try {\n str = btoa(atob(str));\n } catch(err) {\n console.log(\"Failed to base64 re-encode string.\", err);\n str = null;\n }\n }\n return str;\n}\n","import React from 'react';\n\nimport LetterTile from './letter-tile.jsx';\n\nimport { AVATAR_SIZE, MAX_EXTERN_ATTACHMENT_SIZE } from '../config.js';\nimport { imageScaled, blobToBase64, makeImageUrl } from '../lib/blob-helpers.js';\n\nexport default class AvatarUpload extends React.Component {\n constructor(props) {\n super(props);\n\n this.state = {\n dataUrl: props.avatar\n };\n\n this.handleFileUpload = this.handleFileUpload.bind(this);\n }\n\n componentDidUpdate(prevProps) {\n if (this.props.avatar != prevProps.avatar) {\n this.setState({dataUrl: this.props.avatar})\n }\n }\n\n handleFileUpload(e) {\n imageScaled(e.target.files[0], AVATAR_SIZE, AVATAR_SIZE, MAX_EXTERN_ATTACHMENT_SIZE, true,\n // Image successfully scaled and converted.\n (mime, blob) => {\n // Convert blob to base64-encoded bits.\n blobToBase64(blob, (unused, base64bits) => {\n const du = makeImageUrl({data: base64bits, type: mime});\n this.setState({dataUrl: du});\n this.props.onImageChanged(du);\n });\n },\n // Failure\n (err) => {\n this.props.onError(err, 'err');\n });\n // Clear the value so the same file can be uploaded again.\n e.target.value = '';\n }\n\n render() {\n // Randomize id value in case more than one AvatarUpload is shown\n // at the same time.\n const randId = 'file-input-avatar-' + (Math.random() + '').substr(2);\n const className = 'avatar-upload' + (this.props.readOnly ? ' read-only' : '');\n return (\n
:\n this.props.readOnly && this.props.uid ?\n
: null}\n \n {contactNodes}\n
\n :\n null\n }\n \n \n );\n }\n\n return (\n {names[c]} \n {skip.indexOf(c) < 0 ?\n {this.props.compare ? \n : null}\n
: null}\n \n \n {this.props.compare ?\n
\n \n :\n null}\n \n {items}\n {this.props.modeTitle} \n {this.props.compareTitle} \n
\n field: the URL must be a relative URL or\n// have http:, https:, blob: or data: scheme.\n// The relative URL is appended with the API key and/or auth token.\n// In case of data: scheme, the URL must start with a 'data:image/XXXX;base64,'.\nexport function sanitizeImageUrl(url) {\n if (!url) {\n return null;\n }\n\n const sanitizedUrl = sanitizeUrl(url);\n if (sanitizedUrl) {\n return sanitizedUrl;\n }\n\n // Is this a data: URL of an image?\n if (/data:image\\/[a-z0-9.-]+;base64,/i.test(url.trim())) {\n return url;\n }\n\n return null;\n}\n","// TagManager: edit topic or user tags.\nimport React from 'react';\nimport { FormattedMessage } from 'react-intl';\n\nimport ChipInput from './chip-input.jsx';\n\nimport { MAX_TAG_COUNT, MAX_TAG_LENGTH, MIN_TAG_LENGTH } from '../config.js';\nimport { arrayEqual } from '../lib/utils.js';\n\nexport default class TagManager extends React.Component {\n constructor(props) {\n super(props);\n\n this.state = {\n tags: this.props.tags,\n tagInput: '',\n activated: this.props.activated\n };\n\n this.handleTagInput = this.handleTagInput.bind(this);\n this.handleAddTag = this.handleAddTag.bind(this);\n this.handleRemoveTag = this.handleRemoveTag.bind(this);\n this.handleSubmit = this.handleSubmit.bind(this);\n this.handleCancel = this.handleCancel.bind(this);\n }\n\n static getDerivedStateFromProps(nextProps, prevState) {\n if (!arrayEqual(nextProps.tags, prevState.tags) && !prevState.activated) {\n return {tags: nextProps.tags};\n }\n return null;\n }\n\n handleTagInput(text) {\n this.setState({tagInput: text});\n if (text.length > 0) {\n const last = text[text.length-1];\n if (text[0] == '\"') {\n // This is a quoted string.\n if (text.length > 1 && last == '\"') {\n this.handleAddTag(text.substring(1, text.length-1));\n }\n } else if (last == ',' || last == ' ' || last == ';' || last == '\"') {\n // User entered ',', ' ' or ';'\n this.handleAddTag(text.substring(0, text.length-1).trim());\n }\n }\n }\n\n handleAddTag(tag) {\n const maxTagCount = this.props.tinode.getServerLimit('maxTagCount', MAX_TAG_COUNT);\n\n if (tag.length > 0 && this.state.tags.length < maxTagCount) {\n const tags = this.state.tags.slice(0);\n tags.push(tag);\n\n this.setState({tags: tags, tagInput: ''});\n if (this.props.onTagsChanged) {\n this.props.onTagsChanged(tags);\n }\n return tags;\n }\n return this.state.tags;\n }\n\n handleRemoveTag(tag, index) {\n const tags = this.state.tags.slice(0);\n tags.splice(index, 1);\n this.setState({tags: tags});\n if (this.props.onTagsChanged) {\n this.props.onTagsChanged(tags);\n }\n }\n\n handleSubmit() {\n // Add unprocessed input to tags, submit the list.\n this.props.onSubmit(this.handleAddTag(this.state.tagInput.trim()));\n this.setState({activated: false, tags: this.props.tags});\n }\n\n handleCancel() {\n this.setState({activated: false, tagInput: '', tags: this.props.tags});\n if (this.props.onCancel) {\n this.props.onCancel();\n }\n }\n\n render() {\n const minTagLength = this.props.tinode.getServerLimit('minTagLength', MIN_TAG_LENGTH);\n const maxTagLength = this.props.tinode.getServerLimit('maxTagLength', MAX_TAG_LENGTH);\n\n let tags = [];\n if (this.state.activated) {\n this.state.tags.map((tag) => {\n tags.push({user: tag, invalid: (tag.length < minTagLength || tag.length > maxTagLength)});\n });\n } else {\n this.state.tags.map((tag) => {\n tags.push({tag});\n });\n if (tags.length == 0) {\n tags = (\n \n
.\n el = UploadingImage;\n }\n }\n break;\n case 'BN':\n // Button\n attr.onClick = this.handleFormButtonClick;\n let inner = React.Children.map(values, (child) => {\n return typeof child == 'string' ? child : undefined;\n });\n if (!inner || inner.length == 0) {\n inner = [attr.name]\n }\n // Get text which will be sent back when the button is clicked.\n attr['data-title'] = inner.join('');\n break;\n case 'FM':\n // Form\n attr.className = 'bot-form';\n break;\n case 'RW':\n // Form element formatting is dependent on element content.\n break;\n default:\n if (el == '_UNKN') {\n // Unknown element.\n // TODO: make it prettier.\n el = <>extension>;\n }\n break;\n }\n return React.createElement(el, attr, values);\n } else {\n return values;\n }\n};\n","// Send message form.\nimport React from 'react';\nimport { defineMessages, injectIntl } from 'react-intl';\nimport { Drafty } from 'tinode-sdk';\n\nimport { KEYPRESS_DELAY } from '../config.js';\nimport { filePasted } from '../lib/blob-helpers.js';\n\nconst messages = defineMessages({\n 'messaging_disabled': {\n id: 'messaging_disabled_prompt',\n defaultMessage: 'Messaging disabled',\n description: 'Prompt in SendMessage in read-only topic'\n },\n 'type_new_message': {\n id: 'new_message_prompt',\n defaultMessage: 'New message',\n description: 'Prompt in send message field'\n },\n 'add_image_caption': {\n id: 'image_caption_prompt',\n defaultMessage: 'Image caption',\n description: 'Prompt in SendMessage for attached image'\n },\n 'file_attachment_too_large': {\n id: 'file_attachment_too_large',\n defaultMessage: 'The file size {size} exceeds the {limit} limit.',\n description: 'Error message when attachment is too large'\n },\n 'cannot_initiate_upload': {\n id: 'cannot_initiate_file_upload',\n defaultMessage: 'Cannot initiate file upload.',\n description: 'Generic error messagewhen attachment fails'\n },\n});\n\nclass SendMessage extends React.PureComponent {\n constructor(props) {\n super(props);\n\n this.state = {\n message: '',\n // Make initial keypress time as if it happened 5001 milliseconds in the past.\n keypressTimestamp: new Date().getTime() - KEYPRESS_DELAY - 1\n };\n\n this.handlePasteEvent = this.handlePasteEvent.bind(this);\n this.handleAttachImage = this.handleAttachImage.bind(this);\n this.handleAttachFile = this.handleAttachFile.bind(this);\n this.handleSend = this.handleSend.bind(this);\n this.handleKeyPress = this.handleKeyPress.bind(this);\n this.handleMessageTyping = this.handleMessageTyping.bind(this);\n }\n\n componentDidMount() {\n if (this.messageEditArea) {\n this.messageEditArea.addEventListener('paste', this.handlePasteEvent, false);\n }\n }\n\n componentWillUnmount() {\n if (this.messageEditArea) {\n this.messageEditArea.removeEventListener('paste', this.handlePasteEvent, false);\n }\n }\n\n componentDidUpdate() {\n if (this.messageEditArea) {\n this.messageEditArea.focus();\n }\n }\n\n handlePasteEvent(e) {\n if (this.props.disabled) {\n return;\n }\n // FIXME: handle large files too.\n if (filePasted(e,\n (bits, mime, width, height, fname) => {\n this.props.onAttachImage(mime, bits, width, height, fname);\n },\n (mime, bits, fname) => {\n this.props.onAttachFile(mime, bits, fname);\n },\n this.props.onError)) {\n\n // If a file was pasted, don't paste base64 data into input field.\n e.preventDefault();\n }\n }\n\n handleAttachImage(e) {\n if (e.target.files && e.target.files.length > 0) {\n this.props.onAttachImage(e.target.files[0]);\n }\n // Clear the value so the same file can be uploaded again.\n e.target.value = '';\n }\n\n handleAttachFile(e) {\n const {formatMessage} = this.props.intl;\n if (e.target.files && e.target.files.length > 0) {\n this.props.onAttachFile(e.target.files[0]);\n }\n // Clear the value so the same file can be uploaded again.\n e.target.value = '';\n }\n\n handleSend(e) {\n e.preventDefault();\n const message = this.state.message.trim();\n if (message || this.props.acceptBlank || this.props.noInput) {\n this.props.onSendMessage(message);\n this.setState({message: ''});\n }\n }\n\n /* Send on Enter key */\n handleKeyPress(e) {\n // Remove this if you don't want Enter to trigger send\n if (e.key === 'Enter') {\n // Have Shift-Enter insert a line break instead\n if (!e.shiftKey) {\n e.preventDefault();\n e.stopPropagation();\n\n this.handleSend(e);\n }\n }\n }\n\n handleMessageTyping(e) {\n const newState = {message: e.target.value};\n if (this.props.onKeyPress) {\n const now = new Date().getTime();\n if (now - this.state.keypressTimestamp > KEYPRESS_DELAY) {\n this.props.onKeyPress();\n newState.keypressTimestamp = now;\n }\n }\n this.setState(newState);\n }\n\n render() {\n const {formatMessage} = this.props.intl;\n const prompt = this.props.disabled ?\n formatMessage(messages.messaging_disabled) :\n (this.props.messagePrompt ?\n formatMessage(messages[this.props.messagePrompt]) :\n formatMessage(messages.type_new_message));\n return (\n
\n
\n {messageNodes}\n
\n "},close:function(){return""}},CO:{open:function(){return""},close:function(){return""}},BR:{open:function(){return"
"},close:function(){return""}},HD:{open:function(){return""},close:function(){return""}},LN:{open:function(e){return''},close:function(e){return""},props:function(e){return e?{href:e.url,target:"_blank"}:null}},MN:{open:function(e){return''},close:function(e){return""},props:function(e){return e?{name:e.val}:null}},HT:{open:function(e){return''},close:function(e){return""},props:function(e){return e?{name:e.val}:null}},BN:{open:function(e){return""},props:function(e){return e?{"data-act":e.act,"data-val":e.val,"data-name":e.name,"data-ref":e.ref}:null}},IM:{open:function(e){const t=c(e._tempPreview,e.mime),n=a(e.val,e.mime),s=e.ref||n;return(e.name?'':"")+''},close:function(e){return e.name?"":""},props:function(e){return e?{src:c(e._tempPreview,e.mime)||e.ref||a(e.val,e.mime),title:e.name,"data-width":e.width,"data-height":e.height,"data-name":e.name,"data-size":e.val?.75*e.val.length|0:0|e.size,"data-mime":e.mime}:null}},FM:{open:function(e){return"
{if(e.code>=300)return e;if(this._subscribed=!0,this.acs=e.params&&e.params.acs?e.params.acs:this.acs,this._new){if(this._new=!1,this.name=e.topic,this.created=e.ts,this.updated=e.ts,this._cachePutSelf(),this.name!=l&&this.name!=d){const t=this._tinode.getMeTopic();t&&t._processMetaSub([{_noForwarding:!0,topic:this.name,created:e.ts,updated:e.ts,acs:this.acs}])}t&&t.desc&&(t.desc._noForwarding=!0,this._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(e){if(!this._subscribed)return Promise.reject(new Error("Cannot publish on inactive topic"));if(s.hasAttachments(e.content)&&!e.head.attachments){let t=[];s.attachments(e.content,(e=>{t.push(e.ref)})),e.head.attachments=t}return e._sending=!0,e._failed=!1,this._tinode.publishMessage(e).then((t=>(e._sending=!1,e.ts=t.ts,this.swapMessageId(e,t.params.seq),this._routeData(e),t))).catch((t=>{this._tinode.logger("WARNING: Message rejected by the server",t),e._sending=!1,e._failed=!0,this.onData&&this.onData()}))},publishDraft:function(e,t){if(!t&&!this._subscribed)return Promise.reject(new Error("Cannot publish on inactive topic"));const n=e.seq||this._getQueuedSeqId();return e._noForwarding||(e._noForwarding=!0,e.seq=n,e.ts=new Date,e.from=this._tinode.getCurrentUserID(),e.noecho=!0,this._messages.put(e),this.onData&&this.onData(e)),t=(t||Promise.resolve()).then((()=>e._cancelled?{code:300,text:"cancelled"}:this.publishMessage(e)),(t=>{this._tinode.logger("WARNING: Message draft rejected",t),e._sending=!1,e._failed=!0,this._messages.delAt(this._messages.find(e)),this.onData&&this.onData()}))},leave:function(e){return this._subscribed||e?this._tinode.leave(this.name,e).then((t=>(this._resetSub(),e&&(this._tinode.cacheDel("topic",this.name),this._gone()),t))):Promise.reject(new Error("Cannot leave inactive topic"))},getMeta:function(e){return this._tinode.getMeta(this.name,e)},getMessagesPage:function(e,t){const n=this.startMetaQuery();t?n.withLaterData(e):n.withEarlierData(e);let s=this.getMeta(n.build());return t||(s=s.then((e=>{e&&e.params&&!e.params.count&&(this._noEarlierMsgs=!0)}))),s},setMeta:function(e){return e.tags&&(e.tags=function(e){let t=[];if(Array.isArray(e)){for(let n=0,s=e.length;n1&&t.push(s))}t.sort().filter((function(e,t,n){return!t||e!=n[t-1]}))}return 0==t.length&&t.push(D.DEL_CHAR),t}(e.tags)),this._tinode.setMeta(this.name,e).then((t=>(t&&t.code>=300||(e.sub&&(e.sub.topic=this.name,t.params&&t.params.acs&&(e.sub.acs=t.params.acs,e.sub.updated=t.ts),e.sub.user||(e.sub.user=this._tinode.getCurrentUserID(),e.desc||(e.desc={})),e.sub._noForwarding=!0,this._processMetaSub([e.sub])),e.desc&&(t.params&&t.params.acs&&(e.desc.acs=t.params.acs,e.desc.updated=t.ts),this._processMetaDesc(e.desc)),e.tags&&this._processMetaTags(e.tags),e.cred&&this._processMetaCreds([e.cred],!0)),t)))},updateMode:function(e,t){const n=e?this.subscriber(e):null,s=n?n.acs.updateGiven(t).getGiven():this.getAccessMode().updateWant(t).getWant();return this.setMeta({sub:{user:e,mode:s}})},invite:function(e,t){return this.setMeta({sub:{user:e,mode:t}})},archive:function(e){return this.private&&this.private.arch==e?Promise.resolve(e):this.setMeta({desc:{private:{arch:!!e||D.DEL_CHAR}}})},delMessages:function(e,t){if(!this._subscribed)return Promise.reject(new Error("Cannot delete messages in inactive topic"));e.sort(((e,t)=>e.low0&&this._messages.getAt(n-1).seq>=t||n+1=0?this._messages.delRange(n,this._messages.find({seq:t},!0)):[]},cancelSend:function(e){const t=this._messages.find({seq:e});if(t>=0){const e=this._messages.getAt(t),n=this.msgStatus(e);if(1==n||3==n)return e._cancelled=!0,this._messages.delAt(t),this.onData&&this.onData(),!0}return!1},getType:function(){return D.topicType(this.name)},getAccessMode:function(){return this.acs},getDefaultAccess:function(){return this.defacs},startMetaQuery:function(){return new R(this)},isArchived:function(){return!(!this.private||!this.private.arch)},isChannel:function(){return D.isChannelTopicName(this.name)},isGroup:function(){return D.isGroupTopicName(this.name)},isP2P:function(){return D.isP2PTopicName(this.name)},msgStatus:function(e){let t=0;return this._tinode.isMe(e.from)?e._sending?t=2:e._failed||e._cancelled?t=3:e.seq>=f?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.touched0&&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){const 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){const n=e||this.onMetaSub;if(n)for(let e in this._contacts)n.call(t,this._contacts[e],e,this._contacts)},enumerable:!0,configurable:!0,writable:!0}}),k.prototype.constructor=k;var q=function(e){this._tinode=e,this._apiKey=e._apiKey,this._authToken=e.getAuthToken(),this._msgId=e.getNextUniqueId(),this.xhr=new XMLHttpRequest,this.toResolve=null,this.toReject=null,this.onProgress=null,this.onSuccess=null,this.onFailure=null};q.prototype={uploadWithBaseUrl:function(e,t,n,s,i){if(!this._authToken)throw new Error("Must authenticate first");const o=this;let r="/v0/file/u/";if(e){if(0!=e.indexOf("http://")&&0!=e.indexOf("https://"))throw new Error("Invalid base URL '"+e+"'");r=e+r}this.xhr.open("POST",r,!0),this.xhr.setRequestHeader("X-Tinode-APIKey",this._apiKey),this.xhr.setRequestHeader("X-Tinode-Auth","Token "+this._authToken.token);const a=new Promise(((e,t)=>{this.toResolve=e,this.toReject=t}));this.onProgress=n,this.onSuccess=s,this.onFailure=i,this.xhr.upload.onprogress=e=>{e.lengthComputable&&o.onProgress&&o.onProgress(e.loaded/e.total)},this.xhr.onload=function(){let e;try{e=JSON.parse(this.response,S)}catch(t){o._tinode.logger("ERROR: Invalid server response in LargeFileHelper",this.response),e={ctrl:{code:this.status,text:this.statusText}}}this.status>=200&&this.status<300?(o.toResolve&&o.toResolve(e.ctrl.params.url),o.onSuccess&&o.onSuccess(e.ctrl)):this.status>=400?(o.toReject&&o.toReject(new Error(e.ctrl.text+" ("+e.ctrl.code+")")),o.onFailure&&o.onFailure(e.ctrl)):o._tinode.logger("ERROR: Unexpected server response status",this.status,this.response)},this.xhr.onerror=function(e){o.toReject&&o.toReject(new Error("failed")),o.onFailure&&o.onFailure(null)},this.xhr.onabort=function(e){o.toReject&&o.toReject(new Error("upload cancelled by user")),o.onFailure&&o.onFailure(null)};try{const e=new FormData;e.append("file",t),e.set("id",this._msgId),this.xhr.send(e)}catch(e){this.toReject&&this.toReject(e),this.onFailure&&this.onFailure(null)}return a},upload:function(e,t,n,s){return this.uploadWithBaseUrl(void 0,e,t,n,s)},download:function(e,t,n,s,i){if(!D.isRelativeURL(e))return void(i&&i("The URL '"+e+"' must be relative, not absolute"));if(!this._authToken)return void(i&&i("Must authenticate first"));const o=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=s,this.xhr.onprogress=function(e){o.onProgress&&o.onProgress(e.loaded)};const r=new Promise(((e,t)=>{this.toResolve=e,this.toReject=t}));this.xhr.onload=function(){if(200==this.status){const 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),o.toResolve&&o.toResolve()}else if(this.status>=400&&o.toReject){const e=new FileReader;e.onload=function(){try{const e=JSON.parse(this.result,S);o.toReject(new Error(e.ctrl.text+" ("+e.ctrl.code+")"))}catch(e){o._tinode.logger("ERROR: Invalid server response in LargeFileHelper",this.result),o.toReject(e)}},e.readAsText(this.response)}},this.xhr.onerror=function(e){o.toReject&&o.toReject(new Error("failed"))},this.xhr.onabort=function(){o.toReject&&o.toReject(null)};try{this.xhr.send()}catch(e){this.toReject&&this.toReject(e)}return r},cancel:function(){this.xhr&&this.xhr.readyState<4&&this.xhr.abort()},getId:function(){return this._msgId}};var U=function(e,t){this.status=U.STATUS_NONE,this.topic=e,this.content=t};U.STATUS_NONE=0,U.STATUS_QUEUED=1,U.STATUS_SENDING=2,U.STATUS_FAILED=3,U.STATUS_SENT=4,U.STATUS_RECEIVED=5,U.STATUS_READ=6,U.STATUS_TO_ME=7,U.prototype={toJSON:function(){},fromJSON:function(e){}},U.prototype.constructor=U,void 0!==t&&(t.exports=D,t.exports.Drafty=s,t.exports.AccessMode=A)}).call(this)}).call(this,"undefined"!=typeof global?global:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{"../version.json":3,"./drafty.js":1}],3:[function(e,t,n){t.exports={version:"0.16.10"}},{}]},{},[2])(2)}));
\ No newline at end of file
+(function(f){if(typeof exports==="object"&&typeof module!=="undefined"){module.exports=f()}else if(typeof define==="function"&&define.amd){define([],f)}else{var g;if(typeof window!=="undefined"){g=window}else if(typeof global!=="undefined"){g=global}else if(typeof self!=="undefined"){g=self}else{g=this}g.Tinode = f()}})(function(){var define,module,exports;return (function(){function r(e,n,t){function o(i,f){if(!n[i]){if(!e[i]){var c="function"==typeof require&&require;if(!f&&c)return c(i,!0);if(u)return u(i,!0);var a=new Error("Cannot find module '"+i+"'");throw a.code="MODULE_NOT_FOUND",a}var p=n[i]={exports:{}};e[i][0].call(p.exports,function(r){var n=e[i][1][r];return o(n||r)},p,p.exports,r,e,n,t)}return n[i].exports}for(var u="function"==typeof require&&require,i=0;i
+ * this is *bold*, `code` and _italic_, ~strike~ + * combined *bold and _italic_* + * an url: https://www.example.com/abc#fragment and another _www.tinode.co_ + * this is a @mention and a #hashtag in a string + * second #hashtag + *+ * + * Sample JSON representation of the text above: + * { + * "txt": "this is bold, code and italic, strike combined bold and italic an url: https://www.example.com/abc#fragment " + + * "and another www.tinode.co this is a @mention and a #hashtag in a string second #hashtag", + * "fmt": [ + * { "at":8, "len":4,"tp":"ST" },{ "at":14, "len":4, "tp":"CO" },{ "at":23, "len":6, "tp":"EM"}, + * { "at":31, "len":6, "tp":"DL" },{ "tp":"BR", "len":1, "at":37 },{ "at":56, "len":6, "tp":"EM" }, + * { "at":47, "len":15, "tp":"ST" },{ "tp":"BR", "len":1, "at":62 },{ "at":120, "len":13, "tp":"EM" }, + * { "at":71, "len":36, "key":0 },{ "at":120, "len":13, "key":1 },{ "tp":"BR", "len":1, "at":133 }, + * { "at":144, "len":8, "key":2 },{ "at":159, "len":8, "key":3 },{ "tp":"BR", "len":1, "at":179 }, + * { "at":187, "len":8, "key":3 },{ "tp":"BR", "len":1, "at":195 } + * ], + * "ent": [ + * { "tp":"LN", "data":{ "url":"https://www.example.com/abc#fragment" } }, + * { "tp":"LN", "data":{ "url":"http://www.tinode.co" } }, + * { "tp":"MN", "data":{ "val":"mention" } }, + * { "tp":"HT", "data":{ "val":"hashtag" } } + * ] + * } + */ + +'use strict'; + +const MAX_FORM_ELEMENTS = 8; +const JSON_MIME_TYPE = 'application/json'; + +// Regular expressions for parsing inline formats. Javascript does not support lookbehind, +// so it's a bit messy. +const INLINE_STYLES = [ + // Strong = bold, *bold text* + { + name: 'ST', + start: /(?:^|[\W_])(\*)[^\s*]/, + end: /[^\s*](\*)(?=$|[\W_])/ + }, + // Emphesized = italic, _italic text_ + { + name: 'EM', + start: /(?:^|\W)(_)[^\s_]/, + end: /[^\s_](_)(?=$|\W)/ + }, + // Deleted, ~strike this though~ + { + name: 'DL', + start: /(?:^|[\W_])(~)[^\s~]/, + end: /[^\s~](~)(?=$|[\W_])/ + }, + // Code block `this is monospace` + { + name: 'CO', + start: /(?:^|\W)(`)[^`]/, + end: /[^`](`)(?=$|\W)/ + } +]; + +// RegExps for entity extraction (RF = reference) +const ENTITY_TYPES = [ + // URLs + { + name: 'LN', + dataName: 'url', + pack: function(val) { + // Check if the protocol is specified, if not use http + if (!/^[a-z]+:\/\//i.test(val)) { + val = 'http://' + val; + } + return { + url: val + }; + }, + re: /(?:(?:https?|ftp):\/\/|www\.|ftp\.)[-A-Z0-9+&@#\/%=~_|$?!:,.]*[A-Z0-9+&@#\/%=~_|$]/ig + }, + // Mentions @user (must be 2 or more characters) + { + name: 'MN', + dataName: 'val', + pack: function(val) { + return { + val: val.slice(1) + }; + }, + re: /\B@(\w\w+)/g + }, + // Hashtags #hashtag, like metion 2 or more characters. + { + name: 'HT', + dataName: 'val', + pack: function(val) { + return { + val: val.slice(1) + }; + }, + re: /\B#(\w\w+)/g + } +]; + +// HTML tag name suggestions +const HTML_TAGS = { + ST: { + name: 'b', + isVoid: false + }, + EM: { + name: 'i', + isVoid: false + }, + DL: { + name: 'del', + isVoid: false + }, + CO: { + name: 'tt', + isVoid: false + }, + BR: { + name: 'br', + isVoid: true + }, + LN: { + name: 'a', + isVoid: false + }, + MN: { + name: 'a', + isVoid: false + }, + HT: { + name: 'a', + isVoid: false + }, + IM: { + name: 'img', + isVoid: true + }, + FM: { + name: 'div', + isVoid: false + }, + RW: { + name: 'div', + isVoid: false, + }, + BN: { + name: 'button', + isVoid: false + }, + HD: { + name: '', + isVoid: false + }, + HL: { + name: 'span', + isVoid: false + } +}; + +// Convert base64-encoded string into Blob. +function base64toObjectUrl(b64, contentType) { + if (!b64) { + return null; + } + + try { + const bin = atob(b64); + const length = bin.length; + const buf = new ArrayBuffer(length); + const arr = new Uint8Array(buf); + for (let i = 0; i < length; i++) { + arr[i] = bin.charCodeAt(i); + } + + return URL.createObjectURL(new Blob([buf], { + type: contentType + })); + } catch (err) { + console.log("Drafty: failed to convert object.", err.message); + } + + return null; +} + +function base64toDataUrl(b64, contentType) { + if (!b64) { + return null; + } + contentType = contentType || 'image/jpeg'; + return 'data:' + contentType + ';base64,' + b64; +} + +// Helpers for converting Drafty to HTML. +const DECORATORS = { + // Visial styles + ST: { + open: function() { + return ''; + }, + close: function() { + return ''; + } + }, + EM: { + open: function() { + return ''; + }, + close: function() { + return '' + } + }, + DL: { + open: function() { + return '