Files
im_webapp/umd/index.prod.js
T

2 lines
224 KiB
JavaScript
Raw Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
!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<br />¯∖_(ツ)_/¯","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<br />¯∖_(ツ)_/¯","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<br />¯∖_(ツ)_/¯","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":"채팅이없습니다<br/>¯∖_(ツ)_/¯","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<br />¯∖_(ツ)_/¯","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":"Чатов нет<br />¯∖_(ツ)_/¯","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":"你尚无会话<br />¯∖_(ツ)_/¯","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.17.0",p={hosted:"web.tinode.co",local:"localhost:6060"},m=p.hosted,u=3e3,g="JRWPS",_=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=_*(.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.y<a?this.props.clickAt.y-this.props.bounds.top-a:this.props.clickAt.y-this.props.bounds.top)+"px"};return s().createElement("ul",{className:"menu",style:i},t)}}var M=(0,n.injectIntl)(S);function k(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,{year:"numeric",month:"short",day:"numeric"})}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]}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<e.length;s++)t=(t<<5)-t+e.charCodeAt(s),t&=t;return t}(this.props.topic))%16;if(this.props.topic&&this.props.title&&this.props.title.trim()){const t=this.props.title.trim().charAt(0),i="lettertile "+a;e=s().createElement("div",{className:i},s().createElement("div",null,t))}else{const i="material-icons "+a;e=t?s().createElement("i",{className:i},"group"):s().createElement("i",{className:i},"person")}}else e=this.props.avatar?s().createElement("img",{className:"avatar",alt:"avatar",src:this.props.avatar,onError:e=>{e.target.onerror=null,e.target.src="/img/broken_image.png"}}):null;return e}}const T=["image/jpeg","image/gif","image/png","image/svg","image/svg+xml"],A=["jpg","gif","png","svg","svg"];function P(e){return e&&e.type&&e.data?"data:image/"+e.type+";base64,"+e.data:null}function D(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 F(e,t,s,a,i,n,o){const r=new Image;r.crossOrigin="Anonymous",r.onerror=function(e){o("Image format unrecognized")},r.onload=async function(){URL.revokeObjectURL(r.src);const l=D(this.width,this.height,t,s,i);if(!l)return void o("Invalid image");let c=document.createElement("canvas");c.width=l.dstWidth,c.height=l.dstHeight;let d=c.getContext("2d");d.imageSmoothingEnabled=!0,d.drawImage(this,l.xoffset,l.yoffset,l.srcWidth,l.srcHeight,0,0,l.dstWidth,l.dstHeight);const h=T.indexOf(e.type)<0?"image/jpeg":e.type;let p=await new Promise((e=>c.toBlob(e,h)));if(p){for(;a>0&&p.length>a;)l.dstWidth=.70710678118*l.dstWidth|0,l.dstHeight=.70710678118*l.dstHeight|0,c.width=l.dstWidth,c.height=l.dstHeight,d=c.getContext("2d"),d.clearRect(0,0,c.width,c.height),d.drawImage(this,l.xoffset,l.yoffset,l.srcWidth,l.srcHeight,0,0,l.dstWidth,l.dstHeight),p=await new Promise((e=>c.toBlob(e,h)));c=null,n(p,h,l.dstWidth,l.dstHeight,function(e,t){const s=T.indexOf(t);if(s<0||!e)return e;const a=A[s],i=e.lastIndexOf(".");return i>=0&&(e=e.substring(0,i)),e+"."+a}(e.name,h))}else o("Unsupported image format")},r.src=URL.createObjectURL(e)}function U(e,t){const s=new FileReader;s.addEventListener("load",(function(){t(e.type,s.result.split(",")[1],e.name)})),s.readAsDataURL(e)}function I(e,t){const s=new FileReader;s.addEventListener("load",(function(){t(e.type,s.result.split(",")[1])})),s.readAsDataURL(e)}class x extends s().Component{constructor(e){super(e),this.state={dataUrl:e.avatar},this.handleFileUpload=this.handleFileUpload.bind(this)}componentDidUpdate(e){this.props.avatar!=e.avatar&&this.setState({dataUrl:this.props.avatar})}handleFileUpload(e){F(e.target.files[0],b,b,f,!0,((e,t)=>{I(t,((t,s)=>{const a=P({data:s,type:e});this.setState({dataUrl:a}),this.props.onImageChanged(a)}))}),(e=>{this.props.onError(e,"err")})),e.target.value=""}render(){const e="file-input-avatar-"+(Math.random()+"").substr(2),t="avatar-upload"+(this.props.readOnly?" read-only":"");return s().createElement("div",{className:t},this.props.readOnly||!this.state.dataUrl?null:s().createElement("a",{href:"#",className:"clear-avatar",onClick:e=>{e.preventDefault(),this.props.onImageChanged(null)}},s().createElement("i",{className:"material-icons"},"clear")),this.state.dataUrl?s().createElement("img",{src:this.state.dataUrl,className:"preview"}):this.props.readOnly&&this.props.uid?s().createElement("div",{className:"avatar-box"},s().createElement(y,{avatar:!0,topic:this.props.uid,title:this.props.title})):s().createElement("div",{className:"blank"},b,"×",b),this.props.readOnly?null:s().createElement("input",{type:"file",id:e,className:"inputfile hidden",accept:"image/*",onChange:this.handleFileUpload}),this.props.readOnly?null:s().createElement("label",{htmlFor:e,className:"round"},s().createElement("i",{className:"material-icons"},"file_upload")))}}class R extends s().PureComponent{constructor(e){super(e),this.handleChange=this.handleChange.bind(this)}handleChange(){this.props.onChange(this.props.name,!this.props.checked)}render(){return this.props.onChange?this.props.checked?s().createElement("i",{className:"material-icons blue clickable",onClick:this.handleChange},"check_box"):s().createElement("i",{className:"material-icons blue clickable",onClick:this.handleChange},"check_box_outline_blank"):this.props.checked?s().createElement("i",{className:"material-icons"},"check_box"):s().createElement("i",{className:"material-icons"},"check_box_outline_blank")}}const L={muted:"notifications_off",banned:"block"};class q extends s().PureComponent{render(){let e=null;return this.props.badges&&this.props.badges.length>0?(e=[],this.props.badges.map((function(t){if(t.icon)e.push(s().createElement("i",{className:"material-icons as-badge",key:t.key||t.icon},L[t.icon]));else{const a="badge"+(t.color?" "+t.color:"");e.push(s().createElement("span",{className:a,key:t.key||t.name},t.name))}})),s().createElement(s().Fragment,null,e)):null}}function B(e){const t=document.getElementById("shortcut-icon"),s=document.head||document.getElementsByTagName("head")[0],a=document.createElement("link");a.type="image/png",a.id="shortcut-icon",a.rel="shortcut icon",a.href="img/logo32x32"+(e>0?"a":"")+".png",t&&s.removeChild(t),s.appendChild(a),document.title=(e>0?"("+e+") ":"")+"Tinode"}function z(e,t){let s=null;if((e&&e.trim()||t)&&(s={},e&&(s.fn=e.trim()),t)){const e=t.indexOf(",");s.photo=e>=0?{data:t.substring(e+1),type:"jpg"}:t}return s}function O(e,t){if(e===t)return!0;if(!Array.isArray(e)||!Array.isArray(t))return!1;if(e.length!=t.length)return!1;e.sort(),t.sort();for(let s=0,a=e.length;s<a;s++)if(e[s]!==t[s])return!1;return!0}function j(e,t){if(!e)return null;if(e=e.replace(/[^\x20-\x7E]/gim,"").trim(),!/^([a-z][a-z0-9+.-]*:|\/\/)/i.test(e))return e;if(/^blob:http/.test(e))return e;const s=Array.isArray(t)?t.join("|"):"http|https";return new RegExp("^(("+s+"):|//)","i").test(e)?e:null}function H(e){switch(e){case c().MESSAGE_STATUS_SENDING:return{name:"access_time"};case c().MESSAGE_STATUS_FAILED:return{name:"warning",color:"amber"};case c().MESSAGE_STATUS_SENT:return{name:"done"};case c().MESSAGE_STATUS_RECEIVED:return{name:"done_all"};case c().MESSAGE_STATUS_READ:return{name:"done_all",color:"blue"}}return null}const V=(0,n.defineMessages)({sending:{id:"message_sending",defaultMessage:"sending...",description:"Message being sent, in place of time stamp"},failed:{id:"message_sending_failed",defaultMessage:"failed",description:"Failed to send message, in place of time stamp"}});class K extends s().PureComponent{render(){const{formatMessage:e}=this.props.intl;let t;t=this.props.received<=c().MESSAGE_STATUS_SENDING?e(V.sending):this.props.received==c().MESSAGE_STATUS_FAILED?e(V.failed):k(this.props.timestamp,this.props.intl.locale);const a=H(this.props.received),i=a?s().createElement("i",{className:"material-icons small "+a.color},a.name):null;return s().createElement("span",{className:"timestamp"},t," ",i)}}var W=(0,n.injectIntl)(K);class G extends s().PureComponent{render(){return this.props.count>0?s().createElement("span",{className:"unread"},this.props.count>9?"9+":this.props.count):null}}class J extends s().Component{constructor(e){super(e),this.handleClick=this.handleClick.bind(this),this.handleContextClick=this.handleContextClick.bind(this)}handleClick(e){e.preventDefault(),e.stopPropagation(),this.props.onSelected&&this.props.onSelected(this.props.item,this.props.index)}handleContextClick(e){e.preventDefault(),e.stopPropagation(),this.props.showContextMenu({topicName:this.props.item,y:e.pageY,x:e.pageX})}render(){let e=this.props.title;e?e.length>30&&(e=e.substring(0,28)+"…"):e=s().createElement("i",null,s().createElement(n.FormattedMessage,{id:"unnamed_topic"}));const t=this.props.now?"online":"offline",a=!this.props.avatar||this.props.avatar,i=this.props.badges?this.props.badges.slice():[],o=[];this.props.acs&&(this.props.showMode&&i.push({name:this.props.acs.getMode(),key:"mode"}),this.props.acs.isMuted()&&o.push({icon:"muted"}),this.props.acs.isJoiner()||o.push({icon:"banned"}));const r=this.props.preview?"string"==typeof this.props.preview?this.props.preview:s().createElement(s().Fragment,null,l.Drafty.format(this.props.preview,Q,this)):this.props.comment,c=H(this.props.received),d=c?s().createElement("i",{className:"material-icons small space-right "+c.color},c.name):null;return s().createElement("li",{className:!this.props.showCheckmark&&this.props.selected?"selected":null,onClick:this.handleClick},s().createElement("div",{className:"avatar-box"},s().createElement(y,{avatar:a,title:this.props.title,topic:this.props.item}),this.props.showOnline?s().createElement("span",{className:t}):this.props.showCheckmark&&this.props.selected?s().createElement("i",{className:"checkmark material-icons"},"check_circle"):null),s().createElement("div",{className:"text-box"},s().createElement("div",null,s().createElement("span",{className:"contact-title"},e),this.props.isChannel?s().createElement("img",{src:"/img/channel.png",className:"channel",alt:"channel"}):null,s().createElement(G,{count:this.props.unread}),s().createElement(q,{badges:o})),s().createElement("div",{className:"contact-comment"},d,r||" "),s().createElement("span",null,s().createElement(q,{badges:i}))),this.props.showContextMenu?s().createElement("span",{className:"menuTrigger"},s().createElement("a",{href:"#",onClick:this.handleContextClick},s().createElement("i",{className:"material-icons"},"expand_more"))):null)}}function Q(e,t,a,i){let n=l.Drafty.tagName(e);const o={key:i};if(n){switch(e){case"HL":o.className="highlight preview";break;case"LN":n="span";break;case"IM":n=s().Fragment,a=[s().createElement("i",{className:"material-icons"},"photo"),"Picture"];break;case"BN":n="span",o.className="flat-button faux";break;case"FM":n=s().Fragment,a=[s().createElement("i",{className:"material-icons"},"dashboard"),"Form:"];break;case"RW":n=s().Fragment;break;case"EX":n=s().Fragment,a=[s().createElement("i",{className:"material-icons"},"attachment"),"Attachment"];break;default:"_UNKN"==n&&(n=s().Fragment,a=[s().createElement("i",{className:"material-icons"},"extension")])}return s().createElement(n,o,a)}return a}class Y extends s().PureComponent{constructor(e){super(e),this.handleClick=this.handleClick.bind(this)}handleClick(e){e.preventDefault(),e.stopPropagation(),this.props.onAction(this.props.action)}render(){const{formatMessage:e}=this.props.intl;return s().createElement("li",{onClick:this.handleClick,className:"action"},s().createElement("div",{className:"action-text"},e(this.props.title,this.props.values)))}}var Z=(0,n.injectIntl)(Y);const X=(0,n.defineMessages)({badge_you:{id:"badge_you",defaultMessage:"you",description:"Badge for indicating the current user"},badge_owner:{id:"badge_owner",defaultMessage:"owner",description:"Badge for indicating the owner"}});class $ extends s().Component{render(){const{formatMessage:e}=this.props.intl,t=Array.isArray(this.props.topicSelected),a=[];let i=0;return this.props.contacts&&this.props.contacts.length>0&&this.props.contacts.map((n=>{if(n.action)a.push(s().createElement(Z,{title:n.title,action:n.action,values:n.values,key:n.action,onAction:this.props.onAction}));else{const o=this.props.showMode?n.user:n.topic||n.user;if(this.props.filterFunc&&this.props.filter){let e=[o];if(n.private&&n.private.comment&&e.push((""+n.private.comment).toLowerCase()),n.public&&n.public.fn&&e.push((""+n.public.fn).toLowerCase()),!this.props.filterFunc(this.props.filter,e))return}const r=c().isChannelTopicName(o),d=t?this.props.topicSelected.indexOf(o)>-1:this.props.topicSelected===o,h=[];this.props.showMode&&(o==this.props.myUserId&&h.push({name:e(X.badge_you),color:"green"}),n.acs&&n.acs.isOwner()&&h.push({name:e(X.badge_owner),color:"blue"}));const p=Array.isArray(n.private)?n.private.join(","):n.private?n.private.comment:null;let m,u;if(!this.props.showMode){const e=n.latestMessage();e&&(u=n.msgStatus(e),m="string"==typeof e.content?e.content.substr(0,80):l.Drafty.preview(e.content,80))}a.push(s().createElement(J,{title:n.public?n.public.fn:null,avatar:P(n.public?n.public.photo:null),comment:p,preview:m,received:u,unread:this.props.showUnread?n.unread:0,now:n.online&&this.props.connected,acs:n.acs,showMode:this.props.showMode,badges:h,showCheckmark:t,selected:d,showOnline:this.props.showOnline&&!r,isChannel:r,onSelected:this.props.onTopicSelected,showContextMenu:this.props.showContextMenu,item:o,index:a.length,key:o})),i++}}),this),s().createElement("div",{className:this.props.noScroll?null:"scrollable-panel"},0==i?s().createElement("div",{className:"center-medium-text",dangerouslySetInnerHTML:{__html:this.props.emptyListMessage}}):null,a.length>0?s().createElement("ul",{className:"contact-box"},a):null)}}var ee=(0,n.injectIntl)($);class te extends s().PureComponent{render(){return s().createElement("a",{href:"#",onClick:e=>{e.preventDefault(),this.props.onCancel()}},s().createElement("i",{className:"material-icons"},"close"))}}class se extends s().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 s().createElement("div",{className:t},s().createElement("div",{className:"icon"},s().createElement("i",{className:"material-icons"},e)),s().createElement("span",null,this.props.text,this.props.action?s().createElement(s().Fragment,null,s().createElement("a",{href:"#",style:{whiteSpace:"nowrap"},onClick:e=>{e.preventDefault(),this.props.action()}},this.props.actionText)):null),s().createElement("div",{className:"cancel"},s().createElement(te,{onCancel:this.hide})))}}class ae extends s().PureComponent{constructor(e){super(e),this.handleCancel=this.handleCancel.bind(this)}handleCancel(e){e.preventDefault(),this.props.onCancel(this.props.topic,this.props.index)}render(){const e=this.props.title||this.props.topic,t=this.props.invalid?"chip invalid":"chip";return s().createElement("div",{className:t},this.props.noAvatar?s().createElement("span",{className:"spacer"}):s().createElement("div",{className:"avatar-box"},s().createElement(y,{avatar:this.props.avatar||!0,topic:this.props.topic,title:this.props.title})),s().createElement("span",null,e),this.props.onCancel&&!this.props.required?s().createElement("a",{href:"#",onClick:this.handleCancel},"×"):s().createElement("span",{className:"spacer"}))}}class ie extends s().Component{constructor(e){super(e),this.state=ie.deriveStateFromProps(e),this.state.input="",this.state.focused=!1,this.handleTextInput=this.handleTextInput.bind(this),this.removeChipAt=this.removeChipAt.bind(this),this.handleChipCancel=this.handleChipCancel.bind(this),this.handleFocusGained=this.handleFocusGained.bind(this),this.handleFocusLost=this.handleFocusLost.bind(this),this.handleKeyDown=this.handleKeyDown.bind(this)}static deriveStateFromProps(e){return{placeholder:e.chips?"":e.prompt,sortedChips:ie.sortChips(e.chips,e.staticMembers),chipIndex:ie.indexChips(e.chips)}}componentDidUpdate(e,t){e.chips==this.props.chips&&e.staticMembers==this.props.staticMembers&&e.prompt==this.props.prompt||this.setState(ie.deriveStateFromProps(this.props)),(!t||this.props.chips.length>t.sortedChips.length)&&this.setState({input:""})}static indexChips(e){const t={};let s=0;return e.map((e=>{t[e.user]=s,s++})),t}static sortChips(e,t){const s=[],a=[];return e.map((e=>{t&&t.includes(e.user)?s.push(e):a.push(e)})),s.concat(a)}handleTextInput(e){this.setState({input:e.target.value}),this.props.filterFunc&&this.props.filterFunc(e.target.value)}removeChipAt(e){const t=this.state.sortedChips[e];this.props.onChipRemoved(t.user,this.state.chipIndex[t.user])}handleChipCancel(e,t){this.removeChipAt(t)}handleFocusGained(){this.setState({focused:!0})}handleFocusLost(){this.setState({focused:!1}),this.props.onFocusLost&&this.props.onFocusLost(this.state.input)}handleKeyDown(e){if("Backspace"===e.key){if(0==this.state.input.length&&this.state.sortedChips.length>0){const e=this.state.sortedChips.length-1;this.state.sortedChips[e].user!==this.props.staticMembers&&this.removeChipAt(e)}}else"Enter"===e.key?this.props.onEnter&&this.props.onEnter(this.state.input):"Escape"===e.key&&this.props.onCancel&&this.props.onCancel()}render(){const e=[];let t=0;const a=this.props.staticMembers||[];this.state.sortedChips.map((i=>{e.push(s().createElement(ae,{onCancel:this.handleChipCancel,avatar:P(i.public?i.public.photo:null),title:i.public?i.public.fn:void 0,noAvatar:this.props.avatarDisabled,topic:i.user,required:a.includes(i.user),invalid:i.invalid,index:t,key:i.user})),t++}));const i="chip-input"+(this.state.focused?" focused":"");return s().createElement("div",{className:i},e,s().createElement("input",{type:"text",placeholder:this.state.placeholder,onChange:this.handleTextInput,onFocus:this.handleFocusGained,onBlur:this.handleFocusLost,onKeyDown:this.handleKeyDown,value:this.state.input,autoFocus:!0}))}}const ne=(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 oe extends s().Component{constructor(e){super(e),this.state={members:e.members,index:oe.indexMembers(e.members),staticMembers:oe.staticMembers(e.members,e.keepInitialMembers,e.requiredMember),contactFilter:"",noContactsMessage:e.intl.formatMessage(ne.no_contacts),selectedContacts:oe.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=oe.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=oe.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(ne.contacts_not_found_short,{query:e}):t(ne.no_contacts);this.setState({contactFilter:e,noContactsMessage:s})}static doContactFiltering(e,t){if(e){for(let s=0;s<t.length;s++)if(t[s].indexOf(e)>=0)return!0;return!1}return!0}handleSubmit(){var e=this,t=[],s=[],a=[];Object.keys(this.state.index).map((function(i){e.state.index[i].present&&t.push(i),e.state.index[i].delta>0?s.push(i):e.state.index[i].delta<0&&a.push(i)})),this.props.onSubmit(t,s,a)}handleCancel(){this.props.onCancel()}render(){const{formatMessage:e}=this.props.intl;return s().createElement("div",{id:"group-manager"},s().createElement("div",{className:"panel-form-row"},s().createElement("label",{className:"small"},s().createElement(n.FormattedMessage,{id:"title_group_members",defaultMessage:"Group Members",description:"Section title"}))),s().createElement("div",{className:"panel-form-row"},s().createElement(ie,{chips:this.state.members,staticMembers:this.state.staticMembers,prompt:"add members",filterFunc:this.handleContactFilter,onChipRemoved:this.handleMemberRemoved})),s().createElement("div",{className:"panel-form-row"},s().createElement("label",{className:"small"},s().createElement(n.FormattedMessage,{id:"title_all_contacts",defaultMessage:"All Contacts",description:"Section title [All Contacts]"}))),s().createElement(ee,{contacts:this.props.contacts,myUserId:this.props.myUserId,topicSelected:this.state.selectedContacts,filter:this.state.contactFilter,filterFunc:oe.doContactFiltering,emptyListMessage:this.state.noContactsMessage,showOnline:!1,showUnread:!1,onTopicSelected:this.handleContactSelected}),s().createElement("div",{id:"group-manager-buttons",className:"panel-form-row"},s().createElement("button",{className:"blue",onClick:this.handleSubmit},s().createElement(n.FormattedMessage,{id:"button_ok",defaultMessage:"OK",description:"Button [OK]"})),s().createElement("button",{className:"white",onClick:this.handleCancel},s().createElement(n.FormattedMessage,{id:"button_cancel",defaultMessage:"Cancel",description:"Button [Cancel]"}))))}}var re=(0,n.injectIntl)(oe);class le extends s().PureComponent{constructor(e){super(e),this.state={value:this.props.value,visible:!1},this.handleVisibility=this.handleVisibility.bind(this),this.handeTextChange=this.handeTextChange.bind(this),this.handleKeyDown=this.handleKeyDown.bind(this),this.handleEditingFinished=this.handleEditingFinished.bind(this)}handeTextChange(e){this.setState({value:e.target.value}),this.props.onChange&&this.props.onChange(e)}handleVisibility(e){e.preventDefault(),this.setState({visible:!this.state.visible})}handleKeyDown(e){27==e.keyCode?(this.setState({value:this.props.value,visible:!1}),this.props.onFinished&&this.props.onFinished()):13==e.keyCode&&this.handleEditingFinished()}handleEditingFinished(e){if(e){let t=e.currentTarget;setTimeout((()=>{t.contains(document.activeElement)||this.props.onFinished&&this.props.onFinished(this.state.value)}),0)}else this.props.onFinished&&this.props.onFinished(this.state.value.trim())}render(){return s().createElement("div",{tabIndex:"-1",className:"group-focus",onBlur:this.handleEditingFinished},s().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}),s().createElement("span",{onClick:this.handleVisibility},s().createElement("i",{className:"material-icons clickable light-gray"},this.state.visible?"visibility":"visibility_off")))}}class ce extends s().Component{constructor(e){super(e),this.state={active:e.active,initialValue:e.value||"",value:e.value||""},this.handeTextChange=this.handeTextChange.bind(this),this.handleKeyDown=this.handleKeyDown.bind(this),this.handleStartEditing=this.handleStartEditing.bind(this),this.handleEditingFinished=this.handleEditingFinished.bind(this),this.handlePasswordFinished=this.handlePasswordFinished.bind(this)}componentDidUpdate(e,t){const s=this.props.value||"";t.initialValue==s||t.active||this.setState({initialValue:s,value:s})}handeTextChange(e){this.setState({value:e.target.value})}handleKeyDown(e){27===e.keyCode?this.setState({value:this.props.value,active:!1}):13===e.keyCode&&this.handleEditingFinished(e)}handleStartEditing(){this.props.readOnly||(i().findDOMNode(this).focus(),this.setState({active:!0}))}handleEditingFinished(e){if(this.props.required&&!e.target.checkValidity())return void this.setState({value:this.props.value,active:!1});this.setState({active:!1});let t=this.state.value.trim();(t||this.props.value)&&t!==this.props.value&&this.props.onFinished(t)}handlePasswordFinished(e){this.setState({active:!1}),e&&e!==this.props.value&&this.props.onFinished(e)}render(){if(this.state.active)var e=this.props.type||"text";else{var t="password"==this.props.type?"••••••••":this.state.value,a="in-place-edit"+(this.props.readOnly?" disabled":"");t||(t=this.props.placeholder,a+=" placeholder"),t.length>20&&(t=t.substring(0,19)+"...")}return this.state.active?"password"==e?s().createElement(le,{value:this.state.value,placeholder:this.props.placeholder,required:this.props.required?"required":"",autoComplete:this.props.autoComplete,autoFocus:!0,onFinished:this.handlePasswordFinished}):s().createElement("input",{type:e,value:this.state.value,placeholder:this.props.placeholder,required:this.props.required?"required":"",autoComplete:this.props.autoComplete,autoFocus:!0,onChange:this.handeTextChange,onKeyDown:this.handleKeyDown,onBlur:this.handleEditingFinished}):s().createElement("span",{className:a,onClick:this.handleStartEditing},s().createElement("span",{className:"content"},t))}}class de extends s().PureComponent{constructor(e){super(e),this.state={open:e.open},this.handleToggle=this.handleToggle.bind(this)}handleToggle(){const e=!this.state.open;this.setState({open:e}),this.props.onToggle&&this.props.onToggle(e)}render(){return s().createElement("label",{className:"small clean-clickable",onClick:this.handleToggle},this.props.title,"...",this.state.open?s().createElement("i",{className:"material-icons"},"expand_more"):s().createElement("i",{className:"material-icons"},"chevron_right"))}}const he=(0,n.defineMessages)({joiner:{id:"permission_join",defaultMessage:"Join ({val})",description:"Name of J permission"},reader:{id:"permission_read",defaultMessage:"Read ({val})",description:"Name of R permission"},writer:{id:"permission_write",defaultMessage:"Write ({val})",description:"Name of W permission"},preser:{id:"permission_pres",defaultMessage:"Get notified ({val})",description:"Name of P permission"},approver:{id:"permission_admin",defaultMessage:"Approve ({val})",description:"Name of A permission"},sharer:{id:"permission_share",defaultMessage:"Share ({val})",description:"Name of S permission"},deleter:{id:"permission_delete",defaultMessage:"Delete ({val})",description:"Name of D permission"},owner:{id:"permission_owner",defaultMessage:"Owner ({val})",description:"Name of O permission"}});class pe extends s().Component{constructor(e){super(e),this.state={mode:(e.mode||"").replace("N","")},this.handleChange=this.handleChange.bind(this),this.handleSubmit=this.handleSubmit.bind(this),this.handleCancel=this.handleCancel.bind(this)}handleChange(e){let t=this.state.mode;-1==t.indexOf(e)?t+=e:t=t.replace(e,""),this.setState({mode:t})}handleSubmit(){var e=(this.state.mode||"N").split("").sort().join("");e!==(this.props.mode||"N").split("").sort().join("")?this.props.onSubmit(e):this.props.onCancel()}handleCancel(){this.props.onCancel()}render(){const{formatMessage:e}=this.props.intl,t="JRWPASDO",a={J:e(he.joiner,{val:"J"}),R:e(he.reader,{val:"R"}),W:e(he.writer,{val:"W"}),P:e(he.preser,{val:"P"}),A:e(he.approver,{val:"A"}),S:e(he.sharer,{val:"S"}),D:e(he.deleter,{val:"D"}),O:e(he.owner,{val:"O"})};let i=this.props.skip||"",o=this.state.mode,r=(this.props.compare||"").replace("N",""),l=[];for(let e=0;e<t.length;e++){let n=t.charAt(e);i.indexOf(n)>=0&&o.indexOf(n)<0||l.push(s().createElement("tr",{key:n},s().createElement("td",null,a[n]),s().createElement("td",{className:"checkbox"},i.indexOf(n)<0?s().createElement(R,{name:n,checked:o.indexOf(n)>=0,onChange:this.handleChange}):s().createElement(R,{name:n,checked:o.indexOf(n)>=0})),this.props.compare?s().createElement("td",{className:"checkbox"},s().createElement(R,{name:n,checked:r.indexOf(n)>=0})):null))}return s().createElement("div",{className:"panel-form-column"},this.props.userTitle?s().createElement("ul",{className:"contact-box"},s().createElement(J,{item:this.props.item,title:this.props.userTitle,avatar:P(this.props.userAvatar?this.props.userAvatar:null)})):null,s().createElement("label",{className:"small"},s().createElement(n.FormattedMessage,{id:"title_permissions",defaultMessage:"Permissions",description:"Section title"})),s().createElement("table",{className:"permission-editor"},this.props.compare?s().createElement("thead",null,s().createElement("tr",null,s().createElement("th",null),s().createElement("th",null,this.props.modeTitle),s().createElement("th",null,this.props.compareTitle))):null,s().createElement("tbody",null,l)),s().createElement("br",null),s().createElement("div",{className:"dialog-buttons"},s().createElement("button",{className:"outline",onClick:this.handleCancel},s().createElement(n.FormattedMessage,{id:"button_cancel"})),s().createElement("button",{className:"blue",onClick:this.handleSubmit},s().createElement(n.FormattedMessage,{id:"button_ok"}))))}}var me=(0,n.injectIntl)(pe);class ue extends s().Component{constructor(e){super(e),this.state={tags:this.props.tags,tagInput:"",activated:this.props.activated},this.handleTagInput=this.handleTagInput.bind(this),this.handleAddTag=this.handleAddTag.bind(this),this.handleRemoveTag=this.handleRemoveTag.bind(this),this.handleSubmit=this.handleSubmit.bind(this),this.handleCancel=this.handleCancel.bind(this)}static getDerivedStateFromProps(e,t){return O(e.tags,t.tags)||t.activated?null:{tags:e.tags}}handleTagInput(e){if(this.setState({tagInput:e}),e.length>0){const t=e[e.length-1];'"'==e[0]?e.length>1&&'"'==t&&this.handleAddTag(e.substring(1,e.length-1)):","!=t&&" "!=t&&";"!=t&&'"'!=t||this.handleAddTag(e.substring(0,e.length-1).trim())}}handleAddTag(e){const t=this.props.tinode.getServerLimit("maxTagCount",16);if(e.length>0&&this.state.tags.length<t){const t=this.state.tags.slice(0);return t.push(e),this.setState({tags:t,tagInput:""}),this.props.onTagsChanged&&this.props.onTagsChanged(t),t}return this.state.tags}handleRemoveTag(e,t){const s=this.state.tags.slice(0);s.splice(t,1),this.setState({tags:s}),this.props.onTagsChanged&&this.props.onTagsChanged(s)}handleSubmit(){this.props.onSubmit(this.handleAddTag(this.state.tagInput.trim())),this.setState({activated:!1,tags:this.props.tags})}handleCancel(){this.setState({activated:!1,tagInput:"",tags:this.props.tags}),this.props.onCancel&&this.props.onCancel()}render(){const e=this.props.tinode.getServerLimit("minTagLength",2),t=this.props.tinode.getServerLimit("maxTagLength",96);let a=[];return this.state.activated?this.state.tags.map((s=>{a.push({user:s,invalid:s.length<e||s.length>t})})):(this.state.tags.map((e=>{a.push(s().createElement("span",{className:"badge",key:a.length},e))})),0==a.length&&(a=s().createElement("i",null,s().createElement(n.FormattedMessage,{id:"tags_not_found",defaultMessage:"No tags defined. Add some.",description:""})))),s().createElement("div",{className:"panel-form-column"},s().createElement("div",{className:"panel-form-row"},s().createElement("label",{className:"small"},this.props.title)),this.state.activated?s().createElement("div",null,s().createElement(n.FormattedMessage,{id:"tags_editor_no_tags",defaultMessage:"Add some tags",description:"Tag editor prompt when no tags are found."},(e=>s().createElement(ie,{chips:a,avatarDisabled:!0,prompt:e,onEnter:this.handleAddTag,onFocusLost:this.handleAddTag,onCancel:this.handleCancel,onChipRemoved:this.handleRemoveTag,filterFunc:this.handleTagInput}))),this.props.onSubmit||this.props.onCancel?s().createElement("div",{id:"tag-manager-buttons",className:"dialog-buttons panel-form-row"},s().createElement("button",{className:"outline",onClick:this.handleCancel},s().createElement(n.FormattedMessage,{id:"button_cancel",defautMessage:"Cancel",description:"Rejection button [Cancel]"})),s().createElement("button",{className:"blue",onClick:this.handleSubmit},s().createElement(n.FormattedMessage,{id:"button_ok",defautMessage:"OK",description:"Confirmation button [OK]"}))):null):s().createElement("div",{className:"quoted"},s().createElement("a",{href:"#",className:"flat-button",onClick:e=>{e.preventDefault(),this.setState({activated:!0})}},s().createElement("i",{className:"material-icons"},"edit"),"  ",s().createElement(n.FormattedMessage,{id:"title_manage_tags",defaultMessage:"Manage",description:"Section title for the list of tags"})),s().createElement(s().Fragment,null,a)))}}const ge=(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 _e extends s().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="N",s.modeWant2="N")}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:P(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,w),this.state.fullName!==e&&(this.setState({fullName:e}),this.props.onTopicDescUpdate(this.props.topic,z(e,null),null))}handlePrivateUpdate(e){e=e.trim().substring(0,w),this.state.private!==e&&(this.setState({private:e}),this.props.onTopicDescUpdate(this.props.topic,null,e||c().DEL_CHAR))}handleImageChanged(e){this.setState({avatar:e}),this.props.onTopicDescUpdate(this.props.topic,z(null,e||c().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,r,l,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=c().AccessMode.encode(c().AccessMode.diff("ASDO",this.state.modeGiven)),this.state.channel&&(n+="W")),o=s(ge.requested),r=s(ge.granted);break;case"given":a=this.state.modeGiven2,i=this.state.modeWant2,n=this.state.groupTopic?this.state.owner?"":"O":"ASDO",o=s(ge.granted),r=s(ge.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 c=e.subscriber(t);if(!c||!c.acs)return;a=c.acs.getGiven(),i=c.acs.getWant(),n=this.state.owner?"":"O",o=s(ge.granted),r=s(ge.requested),c.public&&(l=c.public.fn,d=c.public.photo);break}default:console.log("Unknown permission editing mode '"+e+"'")}this.setState({showPermissionEditorFor:e,userPermissionsEdited:t,userPermissionsTitle:l,userPermissionsAvatar:d,editedPermissions:a,immutablePermissions:i,editedPermissionsTitle:o,immutablePermissionsTitle:r,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?ge.delete_messages:ge.clear_messages),t(this.state.deleter?ge.delete_messages_warning:ge.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(ge.leave_chat),t(ge.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(ge.block_contact),t(ge.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(ge.report_chat),t(ge.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){O(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(ge.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 s().createElement("div",{id:"info-view"},s().createElement("div",{className:"caption-panel",id:"info-caption-panel"},s().createElement("div",{className:"panel-title",id:"info-title"},s().createElement(n.FormattedMessage,{id:"title_info",defaultMessage:"Info",description:"Title for InfoView"})),s().createElement("div",null,s().createElement(te,{onCancel:this.props.onCancel}))),this.props.displayMobile?s().createElement(se,{level:this.props.errorLevel,text:this.props.errorText,onClearError:this.props.onError}):null,this.state.showMemberPanel?s().createElement(re,{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?s().createElement(me,{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}):s().createElement("div",{id:"info-view-content",className:"scrollable-panel"},s().createElement("div",{className:"panel-form-row"},s().createElement("div",{className:"panel-form-column"},s().createElement("div",null,s().createElement("label",{className:"small"},s().createElement(n.FormattedMessage,{id:"label_topic_name",defaultMessage:"Name",description:"Label for editing topic name"}))),s().createElement("div",null,s().createElement(ce,{placeholder:this.state.groupTopic?"Group name":s().createElement("i",null,"Unknown"),readOnly:!this.state.owner,value:this.state.fullName,required:!0,onFinished:this.handleFullNameUpdate})),s().createElement("div",null,s().createElement("label",{className:"small"},s().createElement(n.FormattedMessage,{id:"label_private",defaultMessage:"Private comment",description:"Label for editing 'private'"}))),s().createElement("div",null,s().createElement(n.FormattedMessage,{id:"private_editing_placeholder",defaultMessage:"Visible to you only",description:"Placeholder for editing 'private'"},(e=>s().createElement(ce,{placeholder:e,value:this.state.private,onFinished:this.handlePrivateUpdate}))))),s().createElement(x,{avatar:this.state.avatar,readOnly:!this.state.owner,uid:this.props.topic,title:this.state.fullName,onImageChanged:this.handleImageChanged,onError:this.props.onError})),s().createElement("div",{className:"hr"}),s().createElement("div",{className:"panel-form-column"},s().createElement("div",{className:"panel-form-row"},s().createElement("label",null,s().createElement(n.FormattedMessage,{id:"label_muting_topic",defaultMessage:"Muted:",description:"Label for Muting/unmuting the topic"})),s().createElement(R,{name:"P",checked:this.state.muted,onChange:this.handleMuted})),s().createElement(n.FormattedMessage,{id:"action_more",defaultMessage:"More",description:"Action for showing more content"},(e=>s().createElement(de,{title:e,open:this.state.moreInfoExpanded,onToggle:this.handleMoreInfo}))),this.state.moreInfoExpanded?s().createElement("div",{className:"panel-form-column"},s().createElement("div",{className:"panel-form-row"},s().createElement("label",null,s().createElement(n.FormattedMessage,{id:"label_user_id"})),s().createElement("tt",null,this.state.address)),this.state.groupTopic?s().createElement("div",{className:"panel-form-row"},s().createElement("label",null,s().createElement(n.FormattedMessage,{id:"label_your_permissions",defaultMessage:"Your permissions:",description:"Label for current user permissions"})),s().createElement("tt",{className:"clickable",onClick:this.handleLaunchPermissionsEditor.bind(this,"want")},this.state.access)):s().createElement("div",null,s().createElement("div",null,s().createElement("label",{className:"small"},s().createElement(n.FormattedMessage,{id:"label_permissions",defaultMessage:"Permissions:",description:"Section title"}))),s().createElement("div",{className:"quoted"},s().createElement("div",null,s().createElement(n.FormattedMessage,{id:"label_you",defaultMessage:"You:",description:"Label for the current user"}),"  ",s().createElement("tt",{className:"clickable",onClick:this.handleLaunchPermissionsEditor.bind(this,"want")},this.state.access)),s().createElement("div",null,this.state.fullName?this.state.fullName:e(ge.other_user),":  ",s().createElement("tt",{className:"clickable",onClick:this.handleLaunchPermissionsEditor.bind(this,"given")},this.state.modeGiven2)))),this.state.sharer&&(this.state.auth||this.state.anon)?s().createElement("div",null,s().createElement("div",null,s().createElement("label",{className:"small"},s().createElement(n.FormattedMessage,{id:"label_default_access",defaultMessage:"Default access mode:",description:"Section title"}))),s().createElement("div",{className:"quoted"},s().createElement("div",null,"Auth: ",this.state.admin?s().createElement("tt",{className:"clickable",onClick:this.handleLaunchPermissionsEditor.bind(this,"auth")},this.state.auth):s().createElement("tt",null,this.state.auth)),s().createElement("div",null,"Anon: ",this.state.admin?s().createElement("tt",{className:"clickable",onClick:this.handleLaunchPermissionsEditor.bind(this,"anon")},this.state.anon):s().createElement("tt",null,this.state.anon)))):null):null),s().createElement("div",{className:"hr"}),this.state.owner?s().createElement(s().Fragment,null,s().createElement(n.FormattedMessage,{id:"title_tag_manager"},(e=>s().createElement(ue,{title:e,tags:this.state.tags,activated:!1,tinode:this.props.tinode,onSubmit:this.handleTagsUpdated}))),s().createElement("div",{className:"hr"})):null,s().createElement("div",{className:"panel-form-column"},this.state.channel?null:s().createElement("a",{href:"#",className:"flat-button",onClick:this.handleDeleteMessages},s().createElement("i",{className:"material-icons"},"delete_outline"),"  ",e(this.state.deleter?ge.delete_messages:ge.clear_messages)),s().createElement("a",{href:"#",className:"red flat-button",onClick:this.handleLeave},s().createElement("i",{className:"material-icons"},"exit_to_app"),"  ",e(ge.leave_chat)),this.state.groupTopic?null:s().createElement("a",{href:"#",className:"red flat-button",onClick:this.handleBlock},s().createElement("i",{className:"material-icons"},"block"),"  ",e(ge.block_contact)),this.state.owner?null:s().createElement("a",{href:"#",className:"red flat-button",onClick:this.handleReport},s().createElement("i",{className:"material-icons"},"report"),"  ",e(ge.report_chat))),this.state.groupTopic&&this.state.sharer?s().createElement(s().Fragment,null,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_group_members",defaultMessage:"Group members:",description:"Section title or label"}))),s().createElement("div",{className:"panel-form-row"},s().createElement("a",{href:"#",className:"flat-button",onClick:this.handleShowAddMembers},s().createElement("i",{className:"material-icons"},"person_add"),"  ",s().createElement(n.FormattedMessage,{id:"button_add_members",defaultMessage:"Add members",description:"Flat button [Add members] (to topic)"}))),s().createElement(n.FormattedMessage,{id:"group_has_no_members",defaultMessage:"No members",description:"Shown in place of group members"},(e=>s().createElement(ee,{contacts:this.state.contactList,myUserId:this.props.myUserId,emptyListMessage:e,topicSelected:this.state.selectedContact,showOnline:!1,showUnread:!1,showMode:!0,noScroll:!0,onTopicSelected:this.handleMemberSelected,showContextMenu:!!this.state.admin&&this.handleContextMenu}))))):null))}}var be=(0,n.injectIntl)(_e);class ve extends s().PureComponent{render(){return s().createElement("div",{className:"uploader"},s().createElement("div",null,s().createElement("span",{style:{width:100*this.props.progress+"%"}})),this.props.progress<.999?s().createElement("a",{href:"#",onClick:e=>{e.preventDefault(),this.props.onCancel()}},s().createElement("i",{className:"material-icons"},"close")," ",s().createElement(n.FormattedMessage,{id:"action_cancel",defaultMessage:"cancel",description:"Call to action [cancel]"})):s().createElement(n.FormattedMessage,{id:"upload_finishing",defaultMessage:"finishing...",description:"Notification that upload is finishing"}))}}class fe extends s().Component{constructor(e){super(e),this.state={downloader:null,progress:0},this.downloadFile=this.downloadFile.bind(this),this.handleCancel=this.handleCancel.bind(this)}downloadFile(e,t,s){if(!e)return void this.props.onError("Invalid download URL '"+e+"'");const a=this.props.tinode.getLargeFileHelper();this.setState({downloader:a}),a.download(e,t,s,(e=>{this.setState({progress:e/this.props.size})}),(e=>{this.props.onError(e,"err")})).then((()=>{this.setState({downloader:null,progress:0})})).catch((e=>{e&&this.props.onError("Error downloading file: "+e.message,"err"),this.setState({downloader:null,progress:0})}))}handleCancel(){this.props.uploading?this.props.onCancelUpload():this.state.downloader&&this.state.downloader.cancel()}render(){let e=this.props.filename||"file_attachment";e.length>36&&(e=e.substr(0,16)+"..."+e.substr(-16));let t,a,i=this.props.size>0?s().createElement("span",{className:"small gray"},"(",N(this.props.size),")"):null;this.props.uploading||this.state.downloader||!function(e){return e&&!/^\s*([a-z][a-z0-9+.-]*:|\/\/)/im.test(e)}(this.props.downloadUrl)?(t=j(this.props.downloadUrl),a=null):(t="#",a=e=>{e.preventDefault(),this.downloadFile(this.props.downloadUrl,this.props.filename,this.props.mimetype)});const o=s().createElement(s().Fragment,null,s().createElement("i",{className:"material-icons"},"file_download")," ",s().createElement(n.FormattedMessage,{id:"save_attachment",defaultMessage:"save",description:"Call to save an attachment"}));return s().createElement("div",{className:"attachment"},s().createElement("div",null,s().createElement("i",{className:"material-icons big gray"},"insert_drive_file")),s().createElement("div",{className:"flex-column"},s().createElement("div",null,e," ",i),this.props.uploading||this.state.downloader?s().createElement(ve,{progress:this.props.uploading?this.props.progress:this.state.progress,onCancel:this.handleCancel}):s().createElement("div",null,t?s().createElement("a",{href:t,download:this.props.filename,onClick:a},o):s().createElement("span",{className:"light-gray"},o))))}}class Ee extends s().PureComponent{constructor(e){super(e)}render(){return s().createElement("div",{className:"inline-image"},s().createElement("img",this.props),s().createElement("div",{className:"rounded-container"},s().createElement(ve,{progress:this.props.progress,onCancel:this.props.onCancelUpload})))}}class we extends s().Component{constructor(e){super(e),this.state={progress:0},e.uploader&&(e.uploader.onProgress=this.handleProgress.bind(this)),this.handleImagePreview=this.handleImagePreview.bind(this),this.handleFormButtonClick=this.handleFormButtonClick.bind(this),this.handleContextClick=this.handleContextClick.bind(this),this.handleCancelUpload=this.handleCancelUpload.bind(this)}handleImagePreview(e){e.preventDefault(),this.props.onImagePreview({url:e.target.src,filename:e.target.title,width:e.target.dataset.width,height:e.target.dataset.height,size:e.target.dataset.size,type:e.target.dataset.mime})}handleFormButtonClick(e){e.preventDefault();const t={seq:this.props.seq,resp:{}};e.target.dataset.name&&(t.resp[e.target.dataset.name]=e.target.dataset.val?e.target.dataset.val:void 0===e.target.dataset.val?1:""+e.target.dataset.val),"url"==e.target.dataset.act&&(t.ref=j(e.target.dataset.ref)||"about:blank");const s=e.target.dataset.title||"unknown";this.props.onFormResponse(e.target.dataset.act,s,t)}handleContextClick(e){e.preventDefault(),e.stopPropagation();const t=this.props.received==Tinode.MESSAGE_STATUS_FAILED?["menu_item_send_retry"]:[];this.props.showContextMenu({seq:this.props.seq,content:this.props.content,y:e.pageY,x:e.pageX},t)}handleProgress(e){this.setState({progress:e})}handleCancelUpload(){this.props.onCancelUpload(this.props.seq,this.props.uploader)}render(){const e=this.props.deleted?"center":this.props.sequence+" "+(this.props.response?"left":"right"),t="single"==this.props.sequence||"last"==this.props.sequence?"bubble tip":"bubble",a=this.props.deleted?null:this.props.userAvatar||!0,i=this.props.userFrom&&this.props.response&&("single"==this.props.sequence||"last"==this.props.sequence);let o=this.props.content;const r=[];return this.props.mimeType==l.Drafty.getContentType()&&l.Drafty.isValid(o)?(l.Drafty.attachments(o,(function(e,t){"application/json"!=e.mime&&r.push(s().createElement(fe,{tinode:this.props.tinode,downloadUrl:l.Drafty.getDownloadUrl(e),filename:e.name,uploading:l.Drafty.isProcessing(e),mimetype:e.mime,size:l.Drafty.getEntitySize(e),progress:this.state.progress,onCancelUpload:this.handleCancelUpload,onError:this.props.onError,key:t}))}),this),o=s().createElement(s().Fragment,null,l.Drafty.format(o,Ce,this))):this.props.deleted?o=s().createElement(s().Fragment,null,s().createElement("i",{className:"material-icons gray"},"block")," ",s().createElement("i",{className:"gray"},s().createElement(n.FormattedMessage,{id:"deleted_content",defaultMessage:"content deleted",description:"Shown when messages are deleted"}))):"string"!=typeof o&&(o=s().createElement(s().Fragment,null,s().createElement("i",{className:"material-icons gray"},"error_outline")," ",s().createElement("i",{className:"gray"},s().createElement(n.FormattedMessage,{id:"invalid_content",defaultMessage:"invalid content",description:"Shown when message is unreadable"})))),s().createElement("li",{className:e},this.props.userFrom&&this.props.response?s().createElement("div",{className:"avatar-box"},i?s().createElement(y,{topic:this.props.userFrom,title:this.props.userName,avatar:a}):null):null,s().createElement("div",null,s().createElement("div",{className:t},s().createElement("div",{className:"message-content"},o,r,this.props.timestamp?s().createElement(W,{timestamp:this.props.timestamp,received:this.props.received}):null),this.props.deleted||!this.props.showContextMenu?null:s().createElement("span",{className:"menuTrigger"},s().createElement("a",{href:"#",onClick:this.handleContextClick},s().createElement("i",{className:"material-icons"},"expand_more")))),i?s().createElement("div",{className:"author"},s().createElement(n.FormattedMessage,{id:"user_not_found",defaultMessage:"Not found",description:"In place of a user's full name when the user is not found."},(e=>this.props.userName||s().createElement("i",null,e)))):null))}}function Ce(e,t,a,i){if("EX"==e)return null;let n=l.Drafty.tagName(e);if(n){const o=l.Drafty.attrValue(e,t)||{};switch(o.key=i,e){case"HL":o.className="highlight";break;case"IM":if(t){o.className="inline-image";const e=D(t.width,t.height,Math.min(this.props.viewportWidth-52,468),312,!1)||{dstWidth:32,dstHeight:32};o.style={width:e.dstWidth+"px",height:e.dstHeight+"px"},l.Drafty.isProcessing(t)?n=Ee:(o.src=this.props.tinode.authorizeURL(function(e){if(!e)return null;return j(e)||(/data:image\/[a-z0-9.-]+;base64,/i.test(e.trim())?e:null)}(o.src)),o.alt=t.name,o.src?(o.onClick=this.handleImagePreview,o.className+=" image-clickable"):o.src="img/broken_image.png")}break;case"BN":o.onClick=this.handleFormButtonClick;let e=s().Children.map(a,(e=>"string"==typeof e?e:void 0));e&&0!=e.length||(e=[o.name]),o["data-title"]=e.join("");break;case"FM":o.className="bot-form";break;case"RW":break;default:"_UNKN"==n&&(n=s().createElement(s().Fragment,null,s().createElement("span",{className:"material-icons"},"extension")))}return s().createElement(n,o,a)}return a}const Se=(0,n.defineMessages)({messaging_disabled:{id:"messaging_disabled_prompt",defaultMessage:"Messaging disabled",description:"Prompt in SendMessage in read-only topic"},type_new_message:{id:"new_message_prompt",defaultMessage:"New message",description:"Prompt in send message field"},add_image_caption:{id:"image_caption_prompt",defaultMessage:"Image caption",description:"Prompt in SendMessage for attached image"},file_attachment_too_large:{id:"file_attachment_too_large",defaultMessage:"The file size {size} exceeds the {limit} limit.",description:"Error message when attachment is too large"},cannot_initiate_upload:{id:"cannot_initiate_file_upload",defaultMessage:"Cannot initiate file upload.",description:"Generic error messagewhen attachment fails"}});class Me extends s().PureComponent{constructor(e){super(e),this.state={message:"",keypressTimestamp:(new Date).getTime()-u-1},this.handlePasteEvent=this.handlePasteEvent.bind(this),this.handleAttachImage=this.handleAttachImage.bind(this),this.handleAttachFile=this.handleAttachFile.bind(this),this.handleSend=this.handleSend.bind(this),this.handleKeyPress=this.handleKeyPress.bind(this),this.handleMessageTyping=this.handleMessageTyping.bind(this)}componentDidMount(){this.messageEditArea&&this.messageEditArea.addEventListener("paste",this.handlePasteEvent,!1)}componentWillUnmount(){this.messageEditArea&&this.messageEditArea.removeEventListener("paste",this.handlePasteEvent,!1)}componentDidUpdate(){this.messageEditArea&&this.messageEditArea.focus()}handlePasteEvent(e){this.props.disabled||function(e,t,s,a){var i=(e.clipboardData||e.originalEvent.clipboardData||{}).items;for(var n in i){var o=i[n];if("file"===o.kind){var r=o.getAsFile();if(!r){console.log("Failed to get file object from pasted file item",o.kind,o.type);continue}return r.type&&"image"==r.type.split("/")[0]?r.size>v||T.indexOf(r.type)<0?imageFileScaledToBase64(r,E,E,!1,t,a):imageFileToBase64(r,t,a):U(r,s),!0}}return!1}(e,((e,t,s,a,i)=>{this.props.onAttachImage(t,e,s,a,i)}),((e,t,s)=>{this.props.onAttachFile(e,t,s)}),this.props.onError)&&e.preventDefault()}handleAttachImage(e){e.target.files&&e.target.files.length>0&&this.props.onAttachImage(e.target.files[0]),e.target.value=""}handleAttachFile(e){const{formatMessage:t}=this.props.intl;e.target.files&&e.target.files.length>0&&this.props.onAttachFile(e.target.files[0]),e.target.value=""}handleSend(e){e.preventDefault();const t=this.state.message.trim();(t||this.props.acceptBlank||this.props.noInput)&&(this.props.onSendMessage(t),this.setState({message:""}))}handleKeyPress(e){"Enter"===e.key&&(e.shiftKey||(e.preventDefault(),e.stopPropagation(),this.handleSend(e)))}handleMessageTyping(e){const t={message:e.target.value};if(this.props.onKeyPress){const e=(new Date).getTime();e-this.state.keypressTimestamp>u&&(this.props.onKeyPress(),t.keypressTimestamp=e)}this.setState(t)}render(){const{formatMessage:e}=this.props.intl,t=this.props.disabled?e(Se.messaging_disabled):this.props.messagePrompt?e(Se[this.props.messagePrompt]):e(Se.type_new_message);return s().createElement("div",{id:"send-message-panel"},this.props.disabled?s().createElement("div",{id:"writing-disabled"},t):s().createElement(s().Fragment,null,this.props.onAttachFile?s().createElement(s().Fragment,null,s().createElement("a",{href:"#",onClick:e=>{e.preventDefault(),this.attachImage.click()},title:"Add image"},s().createElement("i",{className:"material-icons secondary"},"photo")),s().createElement("a",{href:"#",onClick:e=>{e.preventDefault(),this.attachFile.click()},title:"Attach file"},s().createElement("i",{className:"material-icons secondary"},"attach_file"))):null,this.props.noInput?s().createElement("div",{className:"hr thin"}):s().createElement("textarea",{id:"sendMessage",placeholder:t,value:this.state.message,onChange:this.handleMessageTyping,onKeyPress:this.handleKeyPress,ref:e=>{this.messageEditArea=e},autoFocus:!0}),s().createElement("a",{href:"#",onClick:this.handleSend,title:"Send"},s().createElement("i",{className:"material-icons"},"send")),s().createElement("input",{type:"file",ref:e=>{this.attachFile=e},onChange:this.handleAttachFile,style:{display:"none"}}),s().createElement("input",{type:"file",ref:e=>{this.attachImage=e},accept:"image/*",onChange:this.handleAttachImage,style:{display:"none"}})))}}var ke=(0,n.injectIntl)(Me);class Ne extends s().PureComponent{constructor(e){super(e),this.handleSendDoc=this.handleSendDoc.bind(this)}handleSendDoc(e){this.props.onClose(),this.props.onSendMessage(this.props.content.file)}render(){return this.props.content?s().createElement("div",{id:"image-preview"},s().createElement("div",{id:"image-preview-caption-panel"},s().createElement("span",null,this.props.content.filename),s().createElement("a",{href:"#",onClick:e=>{e.preventDefault(),this.props.onClose()}},s().createElement("i",{className:"material-icons gray"},"close"))),s().createElement("div",{id:"image-preview-container"},s().createElement("div",{className:"flex-column narrow"},s().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)),s().createElement("div",null,s().createElement("b",null,s().createElement(n.FormattedMessage,{id:"label_content_type"}))," ",this.props.content.type||"application/octet-stream"),s().createElement("div",null,s().createElement("b",null,s().createElement(n.FormattedMessage,{id:"label_size"}))," ",N(this.props.content.size)))),s().createElement(ke,{noInput:!0,onSendMessage:this.handleSendDoc,onError:this.props.onError})):null}}class ye extends s().Component{constructor(e){super(e)}render(){const e=[],t=(this.props.subscribers||[]).length,a=Math.min(4,t);return(this.props.subscribers||[]).some((t=>(e.push(s().createElement("div",{className:"avatar-box",key:t.user},s().createElement(y,{topic:t.user,avatar:P(t.public?t.public.photo:null)||!0,title:t.public?t.public.fn:null}))),e.length==a))),s().createElement("div",{id:"topic-users"},e," ",t>a?s().createElement("span",null,s().createElement(n.FormattedMessage,{id:"more_online_members",defaultMessage:"+{overflow} more",description:"Shown in MessagesView title bar when the number of online subscribers exceeds MAX_ONLINE_IN_TOPIC",values:{overflow:t-a}})):null)}}class Te extends s().PureComponent{constructor(e){super(e),this.state={width:0,height:0},this.handleSendImage=this.handleSendImage.bind(this)}assignWidth(e){if(e&&!this.state.width){const t=e.getBoundingClientRect();this.setState({width:0|t.width,height:0|t.height})}}handleSendImage(e){this.props.onClose(),this.props.onSendMessage(e,this.props.content.blob)}render(){if(!this.props.content)return null;const e=D(this.props.content.width,this.props.content.height,this.state.width,this.state.height,!1),t=e?{width:e.dstWidth+"px",height:e.dstHeight+"px"}:this.props.content.width>this.props.content.height?{width:"100%"}:{height:"100%"};t.maxWidth="100%",t.maxHeight="100%";let a=this.props.content.filename;const i=Math.max((this.state.width/_/1.5|0)-2,12);a.length>i&&(a=a.slice(0,i/2-1)+"…"+a.slice(1-i/2));const o=this.props.content.width||"-",r=this.props.content.height||"-";return s().createElement("div",{id:"image-preview"},s().createElement("div",{id:"image-preview-caption-panel"},this.props.onSendMessage?s().createElement("span",null,this.props.content.filename):s().createElement("a",{href:this.props.content.url,download:this.props.content.filename},s().createElement("i",{className:"material-icons"},"file_download")," ",s().createElement(n.FormattedMessage,{id:"download_action",defaultMessage:"download",description:"Call to action [download]"})),s().createElement("a",{href:"#",onClick:e=>{e.preventDefault(),this.props.onClose()}},s().createElement("i",{className:"material-icons gray"},"close"))),s().createElement("div",{id:"image-preview-container",ref:e=>this.assignWidth(e)},s().createElement("img",{src:this.props.content.url,style:t,className:"image-preview",alt:this.props.content.filename})),this.props.onSendMessage?s().createElement(ke,{messagePrompt:"add_image_caption",acceptBlank:!0,onSendMessage:this.handleSendImage,onError:this.props.onError}):s().createElement("div",{id:"image-preview-footer"},s().createElement("div",null,s().createElement("div",null,s().createElement("b",null,s().createElement(n.FormattedMessage,{id:"label_file_name",defaultMessage:"File name:",description:"Label for a file name"}))),s().createElement("div",null,s().createElement("span",{title:this.props.content.filename},a||"-"))),s().createElement("div",null,s().createElement("div",null,s().createElement("b",null,s().createElement(n.FormattedMessage,{id:"label_content_type",defaultMessage:"Content type:",description:"Label for file content type (mime)"}))),s().createElement("div",null,this.props.content.type)),s().createElement("div",null,s().createElement("div",null,s().createElement("b",null,s().createElement(n.FormattedMessage,{id:"label_size",defaultMessage:"Size:",description:"Label for file size"}))),s().createElement("div",null,o," × ",r," px; ",N(this.props.content.size)))))}}class Ae extends s().PureComponent{constructor(e){super(e),this.handleButtonAction=this.handleButtonAction.bind(this)}handleButtonAction(e,t){e.preventDefault(),this.props.onAction(t)}render(){return s().createElement("div",{className:"accept-invite-panel"},s().createElement("div",{className:"title"},s().createElement(n.FormattedMessage,{id:"chat_invitation",defaultMessage:"You are invited to start a new chat. What would you like to do?",description:"New chat invitation message: [Accept] [Ignore] [Block]."})),s().createElement("div",{className:"footer"},s().createElement("button",{className:"blue",onClick:e=>{this.handleButtonAction(e,"accept")}},s().createElement(n.FormattedMessage,{id:"chat_invitation_accept",defaultMessage:"Accept",description:"Action [Accept] for chat invitation."})),s().createElement("button",{className:"white",onClick:e=>{this.handleButtonAction(e,"delete")}},s().createElement(n.FormattedMessage,{id:"chat_invitation_ignore",defaultMessage:"Ignore",description:"Action [Ignore] for chat invitation."})),s().createElement("button",{className:"white",onClick:e=>{this.handleButtonAction(e,"block")}},s().createElement(n.FormattedMessage,{id:"chat_invitation_block",defaultMessage:"Block",description:"Action [Block] for chat invitation."}))))}}class Pe extends s().PureComponent{render(){return this.props.show?s().createElement("div",{className:"load-spinner-box"},s().createElement("div",{className:"loader-spinner"})):null}}class De extends s().PureComponent{render(){const e=h+" ("+c().getLibrary()+")";return s().createElement("div",{id:"dummy-view"},s().createElement("div",null,s().createElement("a",{href:"https://github.com/tinode/chat/"},s().createElement("img",{id:"logo",alt:"logo",src:"img/logo.svg"}),s().createElement("h2",null,"Tinode Web")),s().createElement("p",null,s().createElement(n.FormattedMessage,{id:"label_client",defaultMessage:"Client:"})," ",e),s().createElement("p",null,s().createElement(n.FormattedMessage,{id:"label_server",defaultMessage:"Server:"})," ",this.props.serverVersion," (",this.props.serverAddress,")")))}}class Fe{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)}}const Ue=c().Drafty,Ie=(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 xe(e){if(e){const t=e.getExcessive()||"";return e.isJoiner("given")&&(t.includes("R")||t.includes("W"))}return!1}function Re(e){if(e){const t=e.getMissing()||"";return e.isJoiner("want")&&(t.includes("R")||t.includes("W"))}return!1}class Le extends s().Component{constructor(e){super(e),this.state=Le.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&&!c().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().withLaterSub();(this.state.isReader||e)&&(t=t.withLaterData(24),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)}))):Fe.navigateTo(Fe.setUrlTopic("",e.params.topic))})).catch((e=>{console.log("Failed subscription to",this.state.topic),this.props.onError(e.message,"err");const t=Le.getDerivedStateFromProps({},{});t.title=this.props.intl.formatMessage(Ie.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:P(a.public.photo)}):Object.assign(s,{title:"",avatar:null});const o=a.p2pPeerDesc();o?Object.assign(s,{peerMessagingDisabled:Re(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)),xe(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(24).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:P(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:xe(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()+1e3)})}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:Re(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)>=c().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})}),4e3),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(Ue.attachJSON(Ue.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,g,this.state.topic)}sendKeyPress(){const e=this.props.tinode.getTopic(this.state.topic);e.isSubscribed()&&e.noteKeyPress()}sendFileAttachment(e){const t=.75*this.props.tinode.getServerLimit("maxMessageSize",v)-1024|0;if(e.size>t){const t=this.props.tinode.getLargeFileHelper();if(!t)return void this.props.onError(this.props.intl.formatMessage(Ie.cannot_initiate_upload));const s=t.upload(e),a=Ue.attachFile(null,{mime:e.type,filename:e.name,size:e.size,urlPromise:s});this.props.sendMessage(a,s,t)}else U(e,((e,t,s)=>{this.props.sendMessage(Ue.attachFile(null,{mime:e,data:t,filename:s}))}),this.props.onError)}handleAttachFile(e){const t=this.props.tinode.getServerLimit("maxFileUploadSize",f);e.size>t?this.props.onError(this.props.intl.formatMessage({id:"file_attachment_too_large"},{size:N(e.size),limit:N(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",v)-1024|0;if(t.size>o){const o=this.props.tinode.getLargeFileHelper();if(!o)return void this.props.onError(this.props.intl.formatMessage(Ie.cannot_initiate_upload));const r=o.upload(t);F(t,64,64,-1,!1,(l=>{I(l,((l,c)=>{let d=Ue.insertImage(null,0,{mime:s,_tempPreview:c,width:a,height:i,filename:n,size:t.size,urlPromise:r});e&&(d=Ue.appendLineBreak(d),d=Ue.append(d,Ue.init(e))),this.props.sendMessage(d,r,o)}))}),(e=>{this.props.onError(e,"err")}))}else I(t,((s,o)=>{let r=Ue.insertImage(null,0,{mime:s,preview:o,width:a,height:i,filename:n,size:t.size});e&&(r=Ue.appendLineBreak(r),r=Ue.append(r,Ue.init(e))),this.props.sendMessage(r)}))}handleAttachImage(e){const t=this.props.tinode.getServerLimit("maxFileUploadSize",f);F(e,E,E,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 a;if(this.state.imagePreview)a=s().createElement(Te,{content:this.state.imagePreview,onClose:this.handleClosePreview,onSendMessage:this.sendImageAttachment});else if(this.state.imagePostview)a=s().createElement(Te,{content:this.state.imagePostview,onClose:this.handleClosePreview});else if(this.state.docPreview)a=s().createElement(Ne,{content:this.state.docPreview,onClose:this.handleClosePreview,onSendMessage:this.sendFileAttachment});else{const t=this.props.tinode.getTopic(this.state.topic),i=t.isChannel(),o="grp"==t.getType()&&!i;let r=[],l=null,d=null;for(let e=0;e<this.state.messages.length;e++){let a=this.state.messages[e],i=null;e+1<this.state.messages.length&&(i=this.state.messages[e+1].from||"chan");let n="single",c=a.from||"chan";c==l?n=c==i?"middle":"last":c==i&&(n="first"),l=c;const h=!(c==this.props.myUserId),p=t.msgStatus(a);let m,u,g;if(o){const e=t.userDesc(c);e&&e.public&&(m=e.public.fn,u=P(e.public.photo)),g=c,d="chat-box group"}else d="chat-box";r.push(s().createElement(we,{tinode:this.props.tinode,content:a.content,deleted:a.hi,mimeType:a.head?a.head.mime:null,timestamp:a.ts,response:h,seq:a.seq,userFrom:g,userName:m,userAvatar:u,sequence:n,received:p,uploader:a._uploader,viewportWidth:this.props.viewportWidth,showContextMenu:!this.state.channel&&this.handleShowContextMenuMessage,onImagePreview:this.handleImagePostview,onFormResponse:this.handleFormResponse,onError:this.props.onError,onCancelUpload:this.handleCancelUpload,key:a.seq}))}let h=null;if(i)h=e(Ie.channel);else{const t=this.props.tinode.getMeTopic().getContact(this.state.topic);t&&c().isP2PTopicName(t.topic)&&(t.online?h=e(Ie.online_now):t.seen&&(h=e(Ie.last_seen)+": "+k(t.seen.when,this.props.intl.locale)))}const p=this.state.avatar||!0,m=this.props.online?"online"+(this.state.typingIndicator?" typing":""):"offline";a=s().createElement(s().Fragment,null,s().createElement("div",{id:"topic-caption-panel",className:"caption-panel"},this.props.displayMobile?s().createElement("a",{href:"#",id:"hide-message-view",onClick:e=>{e.preventDefault(),this.props.onHideMessagesView()}},s().createElement("i",{className:"material-icons"},"arrow_back")):null,s().createElement("div",{className:"avatar-box"},s().createElement(y,{avatar:p,topic:this.state.topic,title:this.state.title}),i?null:s().createElement("span",{className:m})),s().createElement("div",{id:"topic-title-group"},s().createElement("div",{id:"topic-title",className:"panel-title"},this.state.title||s().createElement("i",null,s().createElement(n.FormattedMessage,{id:"unnamed_topic",defaultMessage:"Unnamed",description:"Title shown when the topic has no name"}))),s().createElement("div",{id:"topic-last-seen"},h)),o?s().createElement(ye,{subscribers:this.state.onlineSubs}):s().createElement("div",{id:"topic-users"}),s().createElement("div",null,s().createElement("a",{href:"#",onClick:this.handleContextClick},s().createElement("i",{className:"material-icons"},"more_vert")))),this.props.displayMobile?s().createElement(se,{level:this.props.errorLevel,text:this.props.errorText,onClearError:this.props.onError}):null,s().createElement(Pe,{show:this.state.fetchingMessages}),s().createElement("div",{id:"messages-container"},s().createElement("div",{id:"messages-panel",ref:this.handleScrollReference},s().createElement("ul",{id:"scroller",className:d},r)),this.state.isReader?null:s().createElement("div",{id:"write-only-background"},this.state.readingBlocked?s().createElement("div",{id:"write-only-note"},s().createElement(n.FormattedMessage,{id:"messages_not_readable",defaultMessage:"no access to messages",description:"Message shown in topic without the read access"})):null)),this.state.peerMessagingDisabled&&!this.state.unconfirmed?s().createElement("div",{id:"peer-messaging-disabled-note"},s().createElement("i",{className:"material-icons secondary"},"block")," ",s().createElement(n.FormattedMessage,{id:"peers_messaging_disabled",defaultMessage:"Peer's messaging is disabled.",description:"Shown when the p2p peer's messaging is disabled"})," ",s().createElement("a",{href:"#",onClick:this.handleEnablePeer},s().createElement(n.FormattedMessage,{id:"enable_peers_messaging",defaultMessage:"Enable",description:"Call to action to enable peer's messaging"})),"."):null,this.state.unconfirmed?s().createElement(Ae,{onAction:this.handleNewChatAcceptance}):s().createElement(ke,{disabled:!this.state.isWriter,onSendMessage:this.props.sendMessage,onKeyPress:this.sendKeyPress,onAttachFile:this.handleAttachFile,onAttachImage:this.handleAttachImage,onError:this.props.onError}))}t=s().createElement("div",{id:"topic-view"},a)}else t=s().createElement(De,{serverVersion:this.props.serverVersion,serverAddress:this.props.serverAddress});return t}}var qe=(0,n.injectIntl)(Le);class Be extends s().PureComponent{render(){return s().createElement("a",{href:"#",onClick:e=>{e.preventDefault(),this.props.onBack()}},s().createElement("i",{className:"material-icons"},"arrow_back"))}}class ze extends s().PureComponent{render(){return s().createElement("div",null,s().createElement("a",{href:"#",onClick:e=>{e.preventDefault(),this.props.onNewTopic()}},s().createElement("i",{className:"material-icons"},"chat"))," ",s().createElement("a",{href:"#",onClick:e=>{e.preventDefault(),this.props.onSettings()}},s().createElement("i",{className:"material-icons"},"settings")))}}class Oe extends s().PureComponent{render(){return s().createElement("div",null,s().createElement("a",{href:"#",onClick:e=>{e.preventDefault(),this.props.onSignUp()}},s().createElement("i",{className:"material-icons"},"person_add"))," ",s().createElement("a",{href:"#",onClick:e=>{e.preventDefault(),this.props.onSettings()}},s().createElement("i",{className:"material-icons"},"settings")))}}class je extends s().PureComponent{render(){return s().createElement("div",{id:"side-caption-panel",className:"caption-panel"},this.props.onCancel?s().createElement(Be,{onBack:this.props.onCancel}):null,this.props.avatar?s().createElement("div",{id:"self-avatar",className:"avatar-box"},s().createElement(y,{avatar:this.props.avatar,topic:this.props.myUserId,title:this.props.title})):null,s().createElement("div",{id:"sidepanel-title",className:"panel-title"},this.props.title),"login"===this.props.state?s().createElement(Oe,{onSignUp:this.props.onSignUp,onSettings:this.props.onSettings}):"contacts"===this.props.state?s().createElement(ze,{onNewTopic:this.props.onNewTopic,onSettings:this.props.onSettings}):null)}}const He=(0,n.defineMessages)({archived_contacts_title:{id:"archived_contacts",defaultMessage:"Archived contacts ({count})",description:"Label for archived chats"}});class Ve extends s().Component{constructor(e){super(e),this.handleAction=this.handleAction.bind(this),this.state=Ve.deriveStateFromProps(e)}static deriveStateFromProps(e){const t=[];let s=0,a=0;return e.chatList.map((i=>{const n=i.acs&&!i.acs.isJoiner();n&&e.blocked&&t.push(i),n||e.blocked||(i.private&&i.private.arch?e.archive?t.push(i):a++:e.archive||(t.push(i),s+=i.unread>0?1:0))})),t.sort(((e,t)=>(t.touched||0)-(e.touched||0))),a>0&&t.push({action:"archive",title:He.archived_contacts_title,values:{count:a}}),{contactList:t,unreadThreads:s}}componentDidUpdate(e,t){if(e.chatList!=this.props.chatList||e.archive!=this.props.archive||e.blocked!=this.props.blocked){const e=Ve.deriveStateFromProps(this.props);this.setState(e),e.unreadThreads!=t.unreadThreads&&B(e.unreadThreads)}}handleAction(e){this.props.onShowArchive()}render(){return s().createElement(n.FormattedMessage,{id:"contacts_not_found",defaultMessage:"You have no chats<br />¯∖_(ツ)_/¯",description:"HTML message shown in ContactList when no contacts are found"},(e=>s().createElement(ee,{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 Ke{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 We extends s().PureComponent{constructor(e){super(e),this.state={login:"",password:"",email:"",fn:"",imageDataUrl:null,errorCleared:!1,saveToken:Ke.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(){Ke.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(),z(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(le,{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 Ge 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 Je 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,z(e,null)))}handleImageChanged(e){this.setState({avatar:e}),this.props.onUpdateAccount(void 0,z(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){O(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(ce,{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(ue,{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 Qe 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 Ye=(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 Ze 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(Ye.delete_account),t(Ye.delete_account_warning),(()=>{this.props.onDeleteAccount()}),null,!0,null)}render(){return s().createElement(s().Fragment,null,this.state.showPermissionEditorFor?s().createElement(me,{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(ce,{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 Xe=(0,n.injectIntl)(Ze);class $e 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 et extends s().Component{constructor(e){super(e),this.state={login:e.login,password:"",hostName:e.serverAddress,saveToken:Ke.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(){Ke.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(le,{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 tt=(0,n.defineMessages)({invalid_id:{id:"error_invalid_id",defaultMessage:"Invalid ID",description:"Error message"}});class st 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(tt.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 at=(0,n.injectIntl)(st);class it 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(ue,{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 nt 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 ot=(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 rt 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(),Fe.navigateTo(Fe.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&&(Fe.navigateTo(Fe.removeUrlParam(window.location.hash,"tab")),this.props.onCreateTopic(e))}handleNewGroupSubmit(e,t,s,a,i){Fe.navigateTo(Fe.removeUrlParam(window.location.hash,"tab")),this.props.onCreateTopic(void 0,z(e,t),s,a,i)}handleGroupByID(e){Fe.navigateTo(Fe.removeUrlParam(window.location.hash,"tab")),this.props.onCreateTopic(e)}render(){const{formatMessage:e}=this.props.intl,t=e(this.state.searchQuery?ot.search_no_results:ot.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(it,{tinode:this.props.tinode,onSubmit:this.handleNewGroupSubmit}):"byid"===this.state.tabSelected?s().createElement(at,{onSubmit:this.handleGroupByID,onError:this.props.onError}):s().createElement("div",{className:"flex-column"},s().createElement(nt,{type:"p2p",onSearchContacts:this.handleSearchContacts}),s().createElement(ee,{contacts:this.props.searchResults,myUserId:this.props.myUserId,emptyListMessage:t,showOnline:!1,showUnread:!1,showContextMenu:!1,onTopicSelected:this.handleContactSelected})))}}var lt=(0,n.injectIntl)(rt);class ct 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=Fe.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(le,{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 dt 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 ht 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(dt,{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 pt=(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 mt 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(pt.email),tel:e(pt.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 ut=(0,n.injectIntl)(mt);const gt=(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 _t 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(gt[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(je,{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(se,{level:this.props.errorLevel,text:this.props.errorText,action:this.props.errorAction,actionText:this.props.errorActionText,onClearError:this.props.onError}),s().createElement(Pe,{show:this.props.loadSpinnerVisible}),"login"===t?s().createElement(et,{login:this.props.login,disabled:this.props.loginDisabled,onLogin:this.handleLoginRequested}):"register"===t?s().createElement(We,{onCreateAccount:this.props.onCreateAccount,onCancel:this.props.onCancel,onError:this.props.onError}):"settings"===t?s().createElement(ht,{transport:this.props.transport,serverAddress:this.props.serverAddress,onCancel:this.props.onCancel,onUpdate:this.props.onGlobalSettings}):"edit"===t?s().createElement(Ge,{tinode:this.props.tinode,myUserId:this.props.myUserId,onBasicNavigate:this.props.onBasicNavigate}):"general"===t?s().createElement(Je,{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(Qe,{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(Xe,{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($e,{serverAddress:this.props.serverAddress,serverVersion:this.props.serverVersion}):"contacts"===t||"archive"==t||"blocked"==t?s().createElement(Ve,{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(lt,{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(ut,{credCode:this.props.credCode,credMethod:this.props.credMethod,onSubmit:this.props.onValidateCredentials,onCancel:this.props.onCancel,onError:this.props.onError}):"reset"===t?s().createElement(ct,{onRequest:this.props.onPasswordResetRequest,onReset:this.props.onResetPassword}):null)}}var bt=(0,n.injectIntl)(_t);function vt(){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 ft(){return"object"==typeof window.location&&"https:"==window.location.protocol}const Et=new Audio("audio/msg.mp3"),wt=(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 Ct 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=Ke.getObject("settings")||{};return{connected:!1,ready:!1,autoLogin:!1,transport:e.transport||null,serverAddress:e.serverAddress||vt(),serverVersion:"no connection",messageSounds:!e.messageSoundsOff,incognitoMode:!1,desktopAlerts:e.desktopAlerts,desktopAlertsEnabled:(ft()||"object"==typeof window.location&&"localhost"==window.location.hostname)&&void 0!==r&&"undefined"!=typeof navigator&&"undefined"!=typeof FIREBASE_INIT,firebaseToken:Ke.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 e=Ke.getObject("keep-logged-in"),{formatMessage:t,locale:s}=this.props.intl;if(this.tinode=Ct.tnSetup(this.state.serverAddress,this.state.transport,s,e),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:s})),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(e){this.handleError(t({id:"push_init_failed"}),"err"),console.log("Failed to initialize push notifications",e),this.setState({desktopAlertsEnabled:!1})}const a=e?Ke.getObject("auth-token"):void 0,i=Fe.parseUrlHash(window.location.hash);a?(this.setState({autoLogin:!0}),a.expires=new Date(a.expires),this.tinode.setAuthToken(a),this.tinode.connect().catch((e=>{this.handleError(e.message,"err")})),delete i.params.info,delete i.params.tab,i.path[0]="",Fe.navigateTo(Fe.composeUrlHash(i.path,i.params))):i.params.token||Fe.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,a){const i=new(c())({appName:h,host:e,apiKey:"AQEAAAABAAD_rAp4DJh05a1HAwFT3A6K",transport:t,secure:ft(),persist:a});return i.setHumanLanguage(s),i.enableLogging(true,!0),i}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=Fe.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(wt.reconnect_countdown,{seconds:e}),"warn",(()=>{clearInterval(this.reconnectCountdown),this.tinode.reconnect()}),s(wt.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 Fe.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"),Fe.navigateTo("")})):(Fe.navigateTo(""),this.setState({loginDisabled:!1}))}handleCredentialsRequest(e){const t=Fe.parseUrlHash(window.location.hash);t.path[0]="cred",t.params.method=e.cred[0],Fe.navigateTo(Fe.composeUrlHash(t.path,t.params))}handleLoginSuccessful(){this.handleError(),Ke.getObject("keep-logged-in")&&Ke.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"),Fe.navigateTo("")})).finally((()=>{this.setState({loadSpinnerVisible:!1})})),Fe.navigateTo(Fe.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)&&Et.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=Ct.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:Ct.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)}),Fe.navigateTo(Fe.setUrlTopic("",e)))):(this.setState({errorText:"",errorLevel:null,mobilePanel:"sidepanel",topicSelectedOnline:!1,topicSelectedAcs:null,showInfoPanel:!1}),Fe.navigateTo(Fe.setUrlTopic("",null)))}handleHideMessagesView(){this.setState({mobilePanel:"sidepanel"}),Fe.navigateTo(Fe.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(),Fe.navigateTo(Fe.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(),Fe.navigateTo(Fe.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=Ct.tnSetup(t,s,this.props.intl.locale),this.tinode.onConnect=this.handleConnected,this.tinode.onDisconnect=this.handleDisconnect,this.setState({serverAddress:t,transport:s}),Ke.setObject("settings",{serverAddress:t,transport:s}),Fe.navigateTo(Fe.setUrlSidePanel(window.location.hash,""))}handleShowArchive(){Fe.navigateTo(Fe.setUrlSidePanel(window.location.hash,this.state.myUserId?"archive":""))}handleShowBlocked(){Fe.navigateTo(Fe.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}),Ke.updateObject("settings",{desktopAlerts:!0})):this.fbPush.requestPermission().then((()=>{this.requestPushToken()})).catch((e=>{this.handleError(e.message,"err"),this.setState({desktopAlerts:!1,firebaseToken:null}),Ke.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((()=>{Ke.updateObject("settings",{desktopAlerts:!1}),localStorage.removeItem("firebase-token"),this.setState({desktopAlerts:!1,firebaseToken:null})})):(this.setState({desktopAlerts:!1,firebaseToken:null}),Ke.updateObject("settings",{desktopAlerts:!1}))}requestPushToken(){this.fbPush.getToken().then((e=>{e!=this.state.firebaseToken&&(this.tinode.setDeviceToken(e,!0),Ke.setObject("firebase-token",e)),this.setState({firebaseToken:e,desktopAlerts:!0}),Ke.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}),Ke.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=Fe.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),Fe.navigateTo(Fe.composeUrlHash(e.path,e.params)),this.setState({errorText:"",errorLevel:null})}basicNavigator(e){Fe.navigateTo(Fe.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:g},n.desc={defacs:{auth:g}}):(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},(()=>{Fe.navigateTo(Fe.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(){B(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.clearStorage(),this.tinode.onDisconnect=void 0,this.tinode.disconnect()),this.setState(this.getBlankState()),this.tinode=Ct.tnSetup(this.state.serverAddress,this.state.transport,this.props.intl.locale,Ke.getObject("keep-logged-in")),this.tinode.onConnect=this.handleConnected,this.tinode.onDisconnect=this.handleDisconnect,Fe.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=>{Fe.navigateTo(Fe.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=>{Fe.navigateTo(Fe.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=>{Fe.navigateTo(Fe.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(){Fe.navigateTo(Fe.addUrlParam(window.location.hash,"info",!0)),this.setState({showInfoPanel:!0})}handleHideInfoView(){Fe.navigateTo(Fe.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((()=>{Fe.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(bt,{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(qe,{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(be,{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 St=(0,n.injectIntl)(Ct);const{params:Mt}=Fe.parseUrlHash(window.location.hash),kt=Mt&&Mt.hl||navigator.languages&&navigator.languages[0]||navigator.language||navigator.userLanguage||"en",Nt=kt.toLowerCase().split(/[-_]/)[0],yt=o[kt]||o[Nt]||o.en;i().render(s().createElement(n.IntlProvider,{locale:kt,messages:yt,textComponent:s().Fragment},s().createElement(St,null)),document.getElementById("mountPoint"))}();
//# sourceMappingURL=index.prod.js.map