Merge branch 'dev'

This commit is contained in:
N-Pex 2022-12-06 16:35:48 +01:00
commit ceaf5ba08f
36 changed files with 384 additions and 151 deletions

4
package-lock.json generated
View file

@ -1,12 +1,12 @@
{
"name": "keanuapp-weblite",
"version": "0.1.25",
"version": "0.1.27",
"lockfileVersion": 2,
"requires": true,
"packages": {
"": {
"name": "keanuapp-weblite",
"version": "0.1.25",
"version": "0.1.27",
"dependencies": {
"@matrix-org/olm": "^3.2.12",
"aes-js": "^3.1.2",

View file

@ -15,7 +15,7 @@
"type": "ci",
"config": {
"server": "https://metrics.cleaninsights.org/cleaninsights.php",
"siteId": 14,
"siteId": 25,
"timeout": 5,
"persistEveryNTimes": 1,
"debug": true,
@ -36,7 +36,7 @@
"type": "matomo",
"config": {
"server": "https://metrics.cleaninsights.org/",
"siteId": "17"
"siteId": "25"
}
}
]

View file

@ -486,9 +486,17 @@ $admin-fg: white;
overflow-wrap: break-word;
word-wrap: break-word;
white-space: pre-wrap;
text-align: left;
.deleted-text {
cursor: not-allowed;
font-size: 14px;
}
.edit-marker {
font-size: 0.8rem;
color: #888888;
margin-left: 6px;
}
.from-admin & {
color: $admin-fg;
@ -601,8 +609,7 @@ $admin-fg: white;
.avatar-operations-strut {
position: relative;
height: 0px;
z-index: 1;
z-index: 10;
}
.message-operations {
@ -801,6 +808,10 @@ $admin-fg: white;
.topic {
font-family: "Inter", sans-serif;
font-size: 16px;
input {
text-align: center;
}
}
.created-by {

20
src/assets/icons/poll.vue Normal file
View file

@ -0,0 +1,20 @@
<template>
<svg width="17" height="19" viewBox="0 0 17 19" fill="none" xmlns="http://www.w3.org/2000/svg">
<path
d="M3.31462 16.4718C3.31462 16.9496 3.70026 17.3368 4.17609 17.3368L16.1385 17.3368C16.6144 17.3368 17 16.9496 17 16.4718L16.9998 13.6229C16.9998 13.1452 16.6142 12.7579 16.1383 12.7579L4.1764 12.7579C3.70056 12.7579 3.31492 13.1452 3.31492 13.6229L3.31512 16.4718L3.31462 16.4718Z"
fill="currentColor"
/>
<path
d="M3.31462 10.4557C3.31462 10.9335 3.70026 11.3208 4.17609 11.3208L11.3428 11.3208C11.8186 11.3208 12.2043 10.9335 12.2043 10.4557L12.2043 7.60711C12.2043 7.12931 11.8186 6.74208 11.3428 6.74208L4.17609 6.74208C3.70026 6.74208 3.31462 7.12932 3.31462 7.60711L3.31462 10.4557Z"
fill="currentColor"
/>
<path
d="M3.31451 1.59127L3.31451 4.44011C3.31451 4.91791 3.70016 5.30514 4.17598 5.30514L6.99509 5.30514C7.47093 5.30514 7.85657 4.91791 7.85657 4.44011L7.85637 1.59127C7.85637 1.11347 7.47073 0.726242 6.9949 0.726242L4.17599 0.726242C3.70035 0.726242 3.31452 1.11348 3.31452 1.59127L3.31451 1.59127Z"
fill="currentColor"
/>
<path
d="M-2.00529e-05 0.587841L-2.0791e-05 17.4747C-2.08052e-05 17.7995 0.262306 18.0625 0.585404 18.0625L1.38198 18.0625C1.70528 18.0625 1.96741 17.7995 1.96741 17.4747L1.96741 0.587841C1.96741 0.263208 1.70508 -1.14667e-08 1.38198 -2.55897e-08L0.585405 -6.04092e-08C0.261911 -7.45496e-08 -2.00387e-05 0.263213 -2.00529e-05 0.587841Z"
fill="currentColor"
/>
</svg>
</template>

View file

@ -3,6 +3,11 @@
"name": "འདུ་འཛོམས།",
"tag_line": "འབྲེལ་མཐུད་བྱོས།"
},
"global": {
"save": "",
"password_didnot_match": "",
"password_hint": ""
},
"fallbacks": {
"download_name": "ཕབ་ལེན།",
"original_text": "<མ་ཡིག>",
@ -70,7 +75,8 @@
"name_room": "ཁ་བརྡ་ཁང་ལ་མིང་ཐོགས།",
"room_topic": "གལ་ཏེ་འདོད་པ་ཡོད་ན། ཚོགས་པའི་སྐོར་གྱི་འགྲེལ་བཤད་ཐུང་ངུ་ཞིག་འབྲི་ཆོག",
"create": "བཟོས།",
"room_name_limit_error_msg": ""
"room_name_limit_error_msg": "",
"colon_not_allowed": ""
},
"menu": {
"logout": "ཕྱིར་ཐོན།",
@ -105,7 +111,8 @@
"set_language": "སྐད་ཡིག་བརྗེ་སྒྱུར།",
"language_description": "འདུ་འཛོམས་སྐད་ཡིག་མང་པོའི་ནང་དུ་ཡོད།",
"dont_see_yours": "ཁྱེད་ཀྱི་མིང་མཐོང་གི་མི་འདུག་གམ།",
"tell_us": "ང་ཚོར་ཤོོད།"
"tell_us": "ང་ཚོར་ཤོོད།",
"display_name_required": ""
},
"device_list": {
"not_verified": "ར་སྤྲོད་བྱས་མི་འདུག",
@ -133,7 +140,8 @@
"purge_removing_members": "ཚོགས་མི་ཁག་ཕྱིར་འདོན།",
"purge_redacting_events": "ཁ་བརྡ་གཙང་གསུབ།",
"purge_set_room_state": "ཁ་བརྡ་ཁང་གི་རྣམ་པ་སྒྲིག་འགོད།",
"room_name_required": ""
"room_name_required": "",
"room_topic_required": ""
},
"message": {
"users_are_typing": "{count} ཚོགས་མི་ཡིས་གཏགས་བཞིན་འདུག",
@ -174,7 +182,10 @@
"user_changed_guest_access_closed": "{user} མགྲོན་པོ་ཁ་བརྡ་ཁང་དུ་འཛུལ་བཅུག་མ་སོང་།",
"reply_image": "",
"reply_audio_message": "",
"reply_video": ""
"reply_video": "",
"reply_poll": "",
"outgoing_message_deleted_text": "",
"incoming_message_deleted_text": ""
},
"power_level": {
"moderator": "མདོ་འཛིན་པ།",

View file

@ -1,5 +1,10 @@
{
"language_display_name": "Deutsch",
"global": {
"save": "",
"password_didnot_match": "",
"password_hint": ""
},
"menu": {
"start_private_chat": "Private Diskussion mit diesem Benutzer",
"reply": "Antworten",
@ -54,7 +59,9 @@
"user_left": "{user} hat das Gespräch verlassen",
"user_joined": "{Benutzer} ist dem Gespräch beigetreten",
"download_progress": "{percentage} % heruntergeladen",
"user_changed_room_name": "{user} hat den Raumnamen in {name} geändert"
"user_changed_room_name": "{user} hat den Raumnamen in {name} geändert",
"outgoing_message_deleted_text": "",
"incoming_message_deleted_text": ""
},
"room": {
"leave": "Verlassen",
@ -65,7 +72,8 @@
"purge_removing_members": "Entfernen von Mitgliedern",
"purge_failed": "Fehler beim Bereinigen des Raums!",
"room_list_rooms": "Räume",
"room_name_required": ""
"room_name_required": "",
"room_topic_required": ""
},
"room_welcome": {
"info": "Herzlich willkommen! Hier sind ein paar Dinge, die du über deinen Raum wissen solltest:",
@ -96,7 +104,8 @@
"next": "Nächste",
"name_room": "Raum benennen",
"room_topic": "Füge eine Beschreibung hinzu, wenn du möchtest",
"room_name_limit_error_msg": ""
"room_name_limit_error_msg": "",
"colon_not_allowed": ""
},
"device_list": {
"title": "GERÄTE",
@ -125,7 +134,8 @@
"password_old": "Altes Passwort",
"password_new": "Neues Kennwort",
"password_repeat": "Wiederhole das neue Passwort",
"display_name": "Anzeigename"
"display_name": "Anzeigename",
"display_name_required": ""
},
"profile_info_popup": {
"you_are": "Du bist",

View file

@ -4,6 +4,11 @@
"name": "Convene",
"tag_line": "Simply connect"
},
"global": {
"save": "Save",
"password_didnot_match": "Password didn't match",
"password_hint": "Minimum 12 character containing atleast one numeric, one uppercase and one lowercase letter"
},
"menu": {
"start_private_chat": "Private chat with this user",
"reply": "Reply",
@ -63,7 +68,10 @@
"reply_image": "Image",
"reply_audio_message": "Audio message",
"reply_video": "Video",
"time_ago": "Today | Yesterday | {count} days ago"
"reply_poll": "Poll",
"time_ago": "Today | Yesterday | {count} days ago",
"outgoing_message_deleted_text": "You deleted this message.",
"incoming_message_deleted_text": "This message was deleted."
},
"room": {
"invitations": "You have no invitations | You have 1 invitation | You have {count} invitations",
@ -75,7 +83,8 @@
"purge_failed": "Failed to purge room!",
"room_list_invites": "Invites",
"room_list_rooms": "Rooms",
"room_name_required": "Room name is required"
"room_name_required": "Room name is required",
"room_topic_required": "Room description is required"
},
"room_welcome": {
"info": "Welcome! Here are a few things to know about your room:",
@ -106,7 +115,8 @@
"status_creating": "Creating room",
"status_avatar_total": "Uploading avatar: {count} of {total}",
"status_avatar": "Uploading avatar: {count}",
"room_name_limit_error_msg": "Maximum 50 characters allowed"
"room_name_limit_error_msg": "Maximum 50 characters allowed",
"colon_not_allowed": "Colon is not allowed"
},
"device_list": {
"title": "DEVICES",
@ -139,7 +149,8 @@
"password_old": "Old password",
"password_new": "New password",
"password_repeat": "Repeat new password",
"display_name": "Display name"
"display_name": "Display name",
"display_name_required": "Display name is required"
},
"profile_info_popup": {
"you_are": "You are",

View file

@ -4,6 +4,11 @@
"name": "Convene",
"tag_line": "Simplemente conectar"
},
"global": {
"save": "",
"password_didnot_match": "",
"password_hint": ""
},
"room_info": {
"identity": "Has iniciado sesión como {displayName}.",
"my_profile": "Mi perfil",
@ -83,7 +88,8 @@
"set_language": "Establece tu Idioma",
"language_description": "Convine esta disponible en varios Idiomas.",
"dont_see_yours": "¿No ves el tuyo?",
"tell_us": "Dinos."
"tell_us": "Dinos.",
"display_name_required": ""
},
"login": {
"login": "Iniciar sesión",
@ -122,7 +128,8 @@
"new_room": "Nueva Sala",
"create": "Crear",
"room_topic": "Añade una descripción si quieres",
"room_name_limit_error_msg": ""
"room_name_limit_error_msg": "",
"colon_not_allowed": ""
},
"room_welcome": {
"join_public": "Cualquiera puede unirse abriendo este vínculo: {link}",
@ -144,7 +151,8 @@
"purge_removing_members": "Eliminar miembros",
"purge_failed": "¡Fallo en la purga de la sala!",
"room_list_rooms": "Salas",
"room_name_required": ""
"room_name_required": "",
"room_topic_required": ""
},
"message": {
"user_powerlevel_change_from_to": "{user} de {powerOld} a {powerNew}",
@ -184,8 +192,11 @@
"reply_image": "Imagen",
"reply_audio_message": "Mensaje de audio",
"reply_video": "Vídeo",
"reply_poll": "",
"user_changed_guest_access_closed": "{user} no has permitido que los invitados se unan a la sala",
"user_changed_guest_access_open": "{user} has permitido que los invitados se unieran a la sala"
"user_changed_guest_access_open": "{user} has permitido que los invitados se unieran a la sala",
"outgoing_message_deleted_text": "",
"incoming_message_deleted_text": ""
},
"menu": {
"login": "Iniciar sesión",

View file

@ -1,4 +1,9 @@
{
"global": {
"save": "",
"password_didnot_match": "",
"password_hint": ""
},
"menu": {
"back": "TAKAISIN",
"start_private_chat": "Yksityinen keskustelu tämän käyttäjän kanssa",
@ -28,7 +33,8 @@
"add_people": "Lisää ihmisiä",
"link_copied": "Linkki kopioitu!",
"public_info": "Kuka tahansa, jolla on linkki",
"room_name_limit_error_msg": ""
"room_name_limit_error_msg": "",
"colon_not_allowed": ""
},
"purge_room": {
"n_seconds": "{seconds} sekuntia",
@ -100,12 +106,15 @@
"user_joined": "{user} liittyi keskusteluun",
"file_prefix": "Tiedosto: ",
"edited": "(muokattu)",
"users_are_typing": "{count} jäsentä kirjoitavat"
"users_are_typing": "{count} jäsentä kirjoitavat",
"outgoing_message_deleted_text": "",
"incoming_message_deleted_text": ""
},
"room": {
"leave": "Poistu",
"room_list_rooms": "Huoneet",
"room_name_required": ""
"room_name_required": "",
"room_topic_required": ""
},
"room_welcome": {
"room_history_is": "Huoneen historia on {type}.",
@ -124,7 +133,8 @@
"set_password": "Aseta salasana",
"select_language": "Kieli",
"password_old": "Vanha salasana",
"display_name": "Näyttönimi"
"display_name": "Näyttönimi",
"display_name_required": ""
},
"profile_info_popup": {
"want_more": "Haluatko lisää?",

View file

@ -1,4 +1,9 @@
{
"global": {
"save": "",
"password_didnot_match": "",
"password_hint": ""
},
"menu": {
"edit": "Modifier",
"start_private_chat": "Discussion privée avec cet utilisateur",
@ -54,7 +59,9 @@
"room_joinrule_public": "public",
"unread_messages": "Messages non lus",
"users_are_typing": "{count} membres écrivent",
"room_powerlevel_change": "{user} a changé le statut de {changes}"
"room_powerlevel_change": "{user} a changé le statut de {changes}",
"outgoing_message_deleted_text": "",
"incoming_message_deleted_text": ""
},
"room": {
"members": "aucun membre | 1 membre | {count} membres",
@ -65,7 +72,8 @@
"room_list_invites": "Invitations",
"room_list_rooms": "Salons",
"purge_redacting_events": "Rédaction des évènements",
"room_name_required": ""
"room_name_required": "",
"room_topic_required": ""
},
"room_welcome": {
"info": "Bienvenue ! Voici quelques informations à connaître sur votre salon :",
@ -96,7 +104,8 @@
"public_info": "Quiconque avec un lien",
"join_permissions_info": "Ces autorisations déterminent comment les personnes peuvent rejoindre le salon et avec quelle facilité dautres personnes peuvent être invitées. Elles peuvent être modifiées à tout moment.",
"status_creating": "Création du salon",
"room_name_limit_error_msg": ""
"room_name_limit_error_msg": "",
"colon_not_allowed": ""
},
"device_list": {
"title": "APPAREILS",
@ -125,7 +134,8 @@
"display_name": "Nom daffichage",
"title": "Mon profil",
"set_password": "Définir un mot de passe",
"password_new": "Nouveau mot de passe"
"password_new": "Nouveau mot de passe",
"display_name_required": ""
},
"profile_info_popup": {
"you_are": "Vous êtes",

View file

@ -1,4 +1,9 @@
{
"global": {
"save": "",
"password_didnot_match": "",
"password_hint": ""
},
"message": {
"file_prefix": "File: ",
"unread_messages": "Messaggi non letti",
@ -35,7 +40,9 @@
"room_history_world_readable": "leggibile da chiunque",
"room_history_shared": "leggibile da tutti i membri nella stanza",
"user_is_typing": "{user} sta scrivendo",
"users_are_typing": "{count} membri stanno scrivendo"
"users_are_typing": "{count} membri stanno scrivendo",
"outgoing_message_deleted_text": "",
"incoming_message_deleted_text": ""
},
"room": {
"purge_removing_members": "Rimozione di membri",
@ -46,7 +53,8 @@
"purge_failed": "Impossibile pulire la stanza!",
"room_list_invites": "Inviti",
"room_list_rooms": "Stanze",
"room_name_required": ""
"room_name_required": "",
"room_topic_required": ""
},
"menu": {
"reply": "Risposta",
@ -95,7 +103,8 @@
"invite_info": "Solo le persone aggiunte",
"join_permissions_info": "Questi permessi determinano come le persone possono entrare nella stanza e quanto facilmente gli altri possono essere invitati. Possono essere cambiati in qualsiasi momento.",
"public_info": "Chiunque abbia un collegamento",
"room_name_limit_error_msg": ""
"room_name_limit_error_msg": "",
"colon_not_allowed": ""
},
"device_list": {
"title": "DISPOSITIVI",
@ -124,7 +133,8 @@
"display_name": "Nome visualizzato",
"change_name": "Cambia il nome",
"change_password": "Cambia la password",
"password_new": "Nuova password"
"password_new": "Nuova password",
"display_name_required": ""
},
"profile_info_popup": {
"you_are": "Sei",

View file

@ -3,6 +3,11 @@
"name": "Convene",
"tag_line": ""
},
"global": {
"save": "",
"password_didnot_match": "",
"password_hint": ""
},
"message": {
"user_changed_guest_access_open": "{user} tillot gjester å ta del i rommet",
"user_powerlevel_change_from_to": "{user} fra {powerOld} til {powerNew}",
@ -31,7 +36,10 @@
"you": "Deg",
"reply_image": "",
"reply_audio_message": "",
"reply_video": ""
"reply_video": "",
"reply_poll": "",
"outgoing_message_deleted_text": "",
"incoming_message_deleted_text": ""
},
"device_list": {
"title": "Enheter",
@ -98,7 +106,8 @@
"set_password": "Sett passord",
"title": "Min profil",
"display_name": "Visningsnavn",
"password_repeat": "Gjenta nytt passord"
"password_repeat": "Gjenta nytt passord",
"display_name_required": ""
},
"login": {
"password_required": "Passord kreves",
@ -115,7 +124,8 @@
"next": "Neste",
"create": "Opprett",
"new_room": "Nytt rom",
"room_name_limit_error_msg": ""
"room_name_limit_error_msg": "",
"colon_not_allowed": ""
},
"room_welcome": {
"room_history_is": "Romhistorikken er {type}.",
@ -128,7 +138,8 @@
"room_list_invites": "Invitasjoner",
"purge_set_room_state": "Setter romtilstand",
"leave": "Forlat",
"room_name_required": ""
"room_name_required": "",
"room_topic_required": ""
},
"purge_room": {
"n_seconds": "{seconds} sekunder",

View file

@ -3,6 +3,11 @@
"name": "Convocar",
"tag_line": "Basta conectar"
},
"global": {
"save": "",
"password_didnot_match": "",
"password_hint": ""
},
"invite": {
"title": "Adiciona amigos",
"done": "Feito",
@ -76,7 +81,10 @@
"reply_image": "Imagem",
"reply_audio_message": "Mensagem de áudio",
"reply_video": "Vídeo",
"time_ago": "Hoje | Ontem | {count} dias atrás"
"reply_poll": "",
"time_ago": "Hoje | Ontem | {count} dias atrás",
"outgoing_message_deleted_text": "",
"incoming_message_deleted_text": ""
},
"room": {
"members": "sem membros | 1 membro | {count} membros",
@ -88,7 +96,8 @@
"room_list_invites": "Convites",
"room_list_rooms": "Salas",
"invitations": "Você não tem convites | Você tem 1 convite | Você tem {count} convites",
"room_name_required": ""
"room_name_required": "",
"room_topic_required": ""
},
"room_welcome": {
"info": "Bem-vindo! Aqui estão algumas coisas que você deve saber sobre a sua sala:",
@ -119,7 +128,8 @@
"status_creating": "Criando a sala",
"status_avatar_total": "Enviando o avatar: {count} de {total}",
"status_avatar": "Enviando avatar: {count}",
"room_name_limit_error_msg": "O máximo de 50 caracteres são permitidos"
"room_name_limit_error_msg": "O máximo de 50 caracteres são permitidos",
"colon_not_allowed": ""
},
"device_list": {
"title": "DISPOSITIVOS",
@ -152,7 +162,8 @@
"password_old": "Senha antiga",
"password_new": "Nova senha",
"password_repeat": "Repita a nova senha",
"display_name": "Nome de exibição"
"display_name": "Nome de exibição",
"display_name_required": ""
},
"profile_info_popup": {
"you_are": "Você é",

View file

@ -3,6 +3,11 @@
"name": "Convene",
"tag_line": "Conectați pur și simplu"
},
"global": {
"save": "",
"password_didnot_match": "",
"password_hint": ""
},
"menu": {
"ok": "OK",
"done": "Realizat",
@ -129,7 +134,8 @@
"change_name": "Schimbă numele",
"set_password": "Setați parola",
"temporary_identity": "Această identitate este temporară. Setați o parolă pentru a o utiliza din nou",
"title": "Profilul meu"
"title": "Profilul meu",
"display_name_required": ""
},
"login": {
"login": "Autentificare",
@ -167,7 +173,8 @@
"next": "Următorul",
"create": "Creați",
"new_room": "Cameră nouă",
"room_name_limit_error_msg": ""
"room_name_limit_error_msg": "",
"colon_not_allowed": ""
},
"room_welcome": {
"got_it": "L-am prins",
@ -188,7 +195,8 @@
"purge_set_room_state": "Setarea stării camerei",
"leave": "Lăsați",
"members": "fără membri | 1 membru | {count} membri",
"room_name_required": ""
"room_name_required": "",
"room_topic_required": ""
},
"message": {
"user_changed_guest_access_open": "{user} a permis oaspeților să intre în cameră",
@ -229,7 +237,10 @@
"you": "Tu",
"reply_image": "Imagine",
"reply_audio_message": "Mesaj audio",
"reply_video": "Videoclip"
"reply_video": "Videoclip",
"reply_poll": "",
"outgoing_message_deleted_text": "",
"incoming_message_deleted_text": ""
},
"language_display_name": "Engleză",
"fallbacks": {

View file

@ -25,7 +25,10 @@
"reply_image": "",
"reply_audio_message": "",
"reply_video": "",
"you": "ඔබ"
"reply_poll": "",
"you": "ඔබ",
"outgoing_message_deleted_text": "",
"incoming_message_deleted_text": ""
},
"login": {
"invalid_message": ""

View file

@ -3,6 +3,11 @@
"name": "Convene",
"tag_line": ""
},
"global": {
"save": "",
"password_didnot_match": "",
"password_hint": ""
},
"language_is_rtl": true,
"menu": {
"ok": "تامام",
@ -62,7 +67,10 @@
"user_changed_room_history": "قوللانغۇچى» مۇنازىرەخانىنىڭ تارىخىنى قۇردى»",
"reply_image": "",
"reply_audio_message": "",
"reply_video": ""
"reply_video": "",
"reply_poll": "",
"outgoing_message_deleted_text": "",
"incoming_message_deleted_text": ""
},
"language_display_name": "ئۇيغۇرچە",
"new_room": {
@ -84,7 +92,8 @@
"next": "كېيىنكى",
"create": "قۇرۇش",
"new_room": "يېڭى مۇنازىرەخانا",
"room_name_limit_error_msg": ""
"room_name_limit_error_msg": "",
"colon_not_allowed": ""
},
"room": {
"purge_failed": "مۇنازىرەخانىنى يۇيۇش مەغلۇب بولدى!",
@ -95,7 +104,8 @@
"purge_set_room_state": "مۇنازىرەخانىنىڭ شەرتىنى قۇرۇش",
"leave": "كېتىش",
"members": "ئەزالار يوق | بىر ئەزا | [نەپەر] ئەزا",
"room_name_required": ""
"room_name_required": "",
"room_topic_required": ""
},
"leave": {
"text_public_lastroom": "ئەگەر بۇ ئۆيگە يەنە قوشۇلماقچى بولسىڭىز ، يېڭى سالاھىيەت ئاستىدا قاتناشسىڭىز بولىدۇ. {ئىشلەتكۈچى} ، {ھەرىكەت} نى ساقلاش.",
@ -220,7 +230,8 @@
"change_name": "ئىسىم ئۆزگەرتىش",
"set_password": "پارول بەلگىلەڭ",
"temporary_identity": "بۇ كىملىك ۋاقىتلىق. قايتا ئىشلىتىش ئۈچۈن پارول بەلگىلەڭ",
"title": "مېنىڭ ئارخىپىم"
"title": "مېنىڭ ئارخىپىم",
"display_name_required": ""
},
"login": {
"login": "‎كىرىش",

View file

@ -3,6 +3,11 @@
"name": "Convene",
"tag_line": "只需连接"
},
"global": {
"save": "",
"password_didnot_match": "",
"password_hint": ""
},
"fallbacks": {
"download_name": "下载",
"original_text": "<原文>",
@ -71,7 +76,8 @@
"purge_removing_members": "移除成员",
"purge_redacting_events": "编辑事件",
"purge_set_room_state": "设置聊天室状态",
"room_name_required": ""
"room_name_required": "",
"room_topic_required": ""
},
"message": {
"you": "您",
@ -112,7 +118,10 @@
"user_changed_guest_access_closed": "{user} 不允许客人加入聊天室",
"reply_image": "",
"reply_audio_message": "",
"reply_video": ""
"reply_video": "",
"reply_poll": "",
"outgoing_message_deleted_text": "",
"incoming_message_deleted_text": ""
},
"menu": {
"login": "登录",
@ -195,7 +204,8 @@
"set_language": "设置您的语言",
"language_description": "Convene 提供多种语言.",
"dont_see_yours": "看不到你的?",
"tell_us": "告诉我们。"
"tell_us": "告诉我们。",
"display_name_required": ""
},
"new_room": {
"status_avatar": "正在上传头像:{count}",
@ -217,7 +227,8 @@
"new_room": "新的聊天室",
"room_topic": "如果您愿意,请添加说明",
"create": "创建",
"room_name_limit_error_msg": ""
"room_name_limit_error_msg": "",
"colon_not_allowed": ""
},
"room_welcome": {
"got_it": "知道了",

View file

@ -58,7 +58,7 @@
<!-- DAY Marker, shown for every new day in the timeline -->
<div v-if="showDayMarkerBeforeEvent(event)" class="day-marker" :title="dayForEvent(event)" />
<div v-if="!event.isRelation() && !event.isRedacted() && !event.isRedaction()" :ref="event.getId()">
<div v-if="!event.isRelation() && !event.isRedaction()" :ref="event.getId()">
<div
class="message-wrapper"
v-on:touchstart="
@ -114,18 +114,20 @@
<v-row class="ma-0 pa-0">
<div v-if="replyToEvent" class="row">
<div class="col">
<div class="font-weight-medium">{{ $t("message.replying_to", { user: replyToEvent.sender.name }) }}</div>
<div class="font-weight-medium">{{ $t("message.replying_to", { user: senderDisplayName }) }}</div>
<div v-if="replyToContentType === 'm.text'" class="reply-text" :title="replyToEvent.getContent().body">
{{ replyToEvent.getContent().body | latestReply }}
</div>
<div v-if="replyToContentType === 'm.image'">{{ $t("message.reply_image") }}</div>
<div v-if="replyToContentType === 'm.audio'">{{ $t("message.reply_audio_message") }}</div>
<div v-if="replyToContentType === 'm.video'">{{ $t("message.reply_video") }}</div>
<div v-if="replyToContentType === 'm.poll'">{{ $t("message.reply_poll") }}</div>
</div>
<div class="col col-auto" v-if="replyToContentType !== 'm.text'">
<img v-if="replyToContentType === 'm.image'" width="150px" :src="replyToImg" class="rounded" />
<img v-if="replyToContentType === 'm.image'" width="50px" height="50px" :src="replyToImg" class="rounded" />
<v-img v-if="replyToContentType === 'm.audio'" src="@/assets/icons/audio_message.svg" />
<v-img v-if="replyToContentType === 'm.video'" src="@/assets/icons/video_message.svg" />
<v-icon v-if="replyToContentType === 'm.poll'" light>$vuetify.icons.poll</v-icon>
</div>
<div class="col col-auto">
<v-btn fab x-small elevation="0" color="black" @click.stop="cancelEditReply">
@ -546,6 +548,9 @@ export default {
},
computed: {
senderDisplayName() {
return this.room.getMember(this.replyToEvent.sender.userId).name;
},
currentUser() {
return this.$store.state.auth.user;
},
@ -1227,7 +1232,7 @@ export default {
addReply(event) {
this.replyToEvent = event;
this.$refs.messageInput.focus();
this.replyToContentType = event.getContent().msgtype;
this.replyToContentType = event.getContent().msgtype || 'm.poll';
this.setReplyToImage(event);
},

View file

@ -52,6 +52,7 @@
:disabled="step > steps.INITIAL"
autofocus
solo
@update:error="updateErrorState"
></v-text-field>
<div class="text-left font-weight-light" v-show="roomName.length> 0">{{ $t("new_room.room_topic") }}</div>
<v-text-field
@ -63,13 +64,14 @@
:disabled="step > steps.INITIAL"
solo
></v-text-field>
<div class="error--text" v-if="roomCreationErrorMsg"> {{roomCreationErrorMsg}}</div>
<v-btn
id="btn-room-create"
color="black"
depressed
class="filled-button"
@click.stop="onCreate"
:disabled="status ? true : roomName.length === 0 || roomName.length > 50"
:disabled="isDisabled"
>
<div v-if="status && !enterRoomDialog" class="text-center">
{{ status }}
@ -298,7 +300,12 @@ export default {
name: ""
},
enterRoomDialog: false,
roomNamerules: [v => v.length <= 50 || this.$t("new_room.room_name_limit_error_msg")],
roomNamerules: [
v => v.length <= 50 || this.$t("new_room.room_name_limit_error_msg"),
v => !v.includes(':') || this.$t("new_room.colon_not_allowed")
],
roomNameHasError: false,
roomCreationErrorMsg: ""
};
},
@ -318,6 +325,9 @@ export default {
},
},
computed: {
isDisabled() {
return this.status ? true : this.roomName.length === 0 || this.roomName.length > 50 || this.roomNameHasError
},
roomAvatarLetter() {
if (!this.roomName) {
return null;
@ -337,6 +347,9 @@ export default {
},
methods: {
updateErrorState(errorState) {
this.roomNameHasError = errorState
},
goBack() {
if (this.step == steps.NAME_SET) {
this.step = steps.INITIAL;
@ -578,10 +591,8 @@ export default {
return roomId;
})
.catch((error) => {
this.status =
(error.data && error.data.error) ||
error.message ||
error.toString();
this.status = ""
this.roomCreationErrorMsg = (error.data && error.data.error) || error.message || error.toString();
this.step = steps.INITIAL; // revert
return null;
});

View file

@ -381,6 +381,7 @@ export default {
.then(
function (ignoreduser) {
console.log("Join: joining room");
this.$analytics.event("Invitations", "Room Joined");
this.loadingMessage = this.$t("join.status_joining");
return this.$matrix.matrixClient.joinRoom(this.roomId);
}.bind(this)
@ -422,6 +423,11 @@ export default {
Math.floor(Math.random() * this.availableAvatars.length)
]
);
// mounted() is called more than once, so multiple instances of this event
// do not necessarily indicate a user was shown the join page more than once.
// To analyze this data, segment users into those who have an "Invitations"
// action and set up conversion tracking triggered by Room Joined (once per visit).
this.$analytics.event("Invitations", "Join Page Shown");
},
destroyed() {
this.$matrix.off("Room.myMembership", this.onMyMembership);

View file

@ -103,13 +103,25 @@
/>
<v-text-field
v-model="newPassword1"
:append-icon="showPassword1 ? 'visibility' : 'visibility_off'"
:hint="$t('global.password_hint')"
:rules="[(v) => v ? !!v.match(passwordValidation) || $t('global.password_hint'):true]"
:label="$t('profile.password_new')"
type="password"
counter="20"
maxlength="20"
:type="showPassword1 ? 'text' : 'password'"
@click:append="showPassword1 = !showPassword1"
@update:error="updateErrorState"
/>
<v-text-field
v-model="newPassword2"
:append-icon="showPassword2 ? 'visibility' : 'visibility_off'"
:rules="[(v) => v===newPassword1 || $t('global.password_didnot_match')]"
:label="$t('profile.password_repeat')"
type="password"
counter="20"
maxlength="20"
:type="showPassword2 ? 'text' : 'password'"
@click:append="showPassword2 = !showPassword2"
/>
<div class="red--text" v-if="passwordErrorMessage">
{{ passwordErrorMessage }}
@ -134,7 +146,7 @@
newPassword1
)
"
>{{ $t("menu.ok") }}</v-btn
>{{ $t("global.save") }}</v-btn
>
</v-card-actions>
</v-card>
@ -149,7 +161,11 @@
<v-card>
<v-card-title>{{ $t("profile.display_name") }}</v-card-title>
<v-card-text>
<v-text-field v-model="editValue" />
<v-text-field
v-model="editValue"
:rules="[(v) => !!v || $t('profile.display_name_required')]"
required
/>
</v-card-text>
<v-divider></v-divider>
<v-card-actions>
@ -165,7 +181,8 @@
updateDisplayName(editValue);
showEditDisplaynameDialog = false;
"
>{{ $t("menu.ok") }}</v-btn
:disabled="!editValue"
>{{ $t("global.save") }}</v-btn
>
</v-card-actions>
</v-card>
@ -205,12 +222,16 @@ export default {
showLogoutPopup: false,
editValue: null,
password: null,
showPassword1: false,
showPassword2: false,
passwordValidation: /^(?=.*\d)(?=.*[a-z])(?=.*[A-Z]).{12,20}$/,
newPassword1: null,
newPassword2: null,
settingPassword: false,
passwordErrorMessage: null,
isAvatarLoaded: true,
loadValue: 0
loadValue: 0,
newPasswordHasError: false
};
},
@ -253,6 +274,7 @@ export default {
passwordsMatch() {
return (
!this.newPasswordHasError &&
this.newPassword1 &&
this.newPassword2 &&
this.newPassword1 == this.newPassword2
@ -261,6 +283,9 @@ export default {
},
methods: {
updateErrorState(errorState) {
this.newPasswordHasError = errorState
},
setPassword(oldPassword, newPassword) {
this.settingPassword = true;
this.passwordErrorMessage = null;

View file

@ -27,12 +27,13 @@
<room-avatar-picker />
<div :class="{'name':true,'cursor-default':!userCanPurgeRoom}">
<span
v-if="!isEditMode"
v-if="!isRoomNameEditMode"
@click="onRoomNameClicked()"
>
{{ roomName }}
</span>
<v-text-field
v-else
v-model="editedRoomName"
ref="editedRoomName"
:rules="[(v) => !!v || $t('room.room_name_required')]"
@ -43,14 +44,36 @@
counter="50"
background-color="white"
autofocus
v-if="isEditMode"
maxlength="50"
@blur="updateRoomName()"
@keyup.enter="updateRoomName()"
solo
></v-text-field>
</div>
<div class="topic">{{ roomTopic }}</div>
<div :class="{'topic':true,'cursor-default':!userCanPurgeRoom}">
<span
v-if="!isRoomTopicEditMode"
@click="onRoomTopicClicked()"
>
{{ roomTopic }}
</span>
<v-text-field
v-else
v-model="editedRoomTopic"
ref="editedRoomTopic"
:rules="[(v) => !!v || $t('room.room_topic_required')]"
:error="roomTopicErrorMessage != null"
:error-messages="roomTopicErrorMessage"
required
color="black"
background-color="white"
autofocus
@blur="updateRoomTopic()"
@keyup.enter="updateRoomTopic()"
solo
>
</v-text-field>
</div>
<div :class="{'created-by':true, 'cursor-default':!userCanPurgeRoom}">
{{ $t("room_info.created_by", { user: creator }) }}
</div>

View file

@ -10,7 +10,7 @@
<div class="h4">{{$t('room_info_sheet.this_room')}}</div>
<div
class="h2"
v-if="!isEditMode"
v-if="!isRoomNameEditMode"
@click="onRoomNameClicked()"
>
{{ roomName }}
@ -26,7 +26,7 @@
counter="50"
background-color="white"
autofocus
v-if="isEditMode"
v-if="isRoomNameEditMode"
maxlength="50"
@blur="updateRoomName()"
@keyup.enter="updateRoomName()"

View file

@ -111,7 +111,7 @@ export default {
dateForEvent(event) {
return util.formatDay(event.getTs());
},
componentForEvent(event, isForExport = false) {
switch (event.getType()) {
case "m.room.member":
@ -240,6 +240,9 @@ export default {
}
}
}
break;
case "m.room.encrypted":
return event.getSender() != this.$matrix.currentUserId ? MessageIncomingText : MessageOutgoingText
}
return this.debugging ? DebugEvent : null;
},

View file

@ -15,10 +15,10 @@
</v-avatar>
<!-- SLOT FOR CONTENT -->
<slot></slot>
<div class="op-button" ref="opbutton">
<v-btn id="btn-more" icon @click.stop="showContextMenu($refs.opbutton)"
><v-icon>more_vert</v-icon></v-btn
>
<div class="op-button" ref="opbutton" v-if="!event.isRedacted()">
<v-btn id="btn-more" icon @click.stop="showContextMenu($refs.opbutton)">
<v-icon>more_vert</v-icon>
</v-btn>
</div>
<QuickReactions :event="event" :timelineSet="timelineSet" />
</div>

View file

@ -2,24 +2,7 @@
<message-incoming v-bind="{ ...$props, ...$attrs }" v-on="$listeners">
<div class="bubble poll-bubble">
<div class="poll-icon">
<svg width="17" height="19" viewBox="0 0 17 19" fill="none" xmlns="http://www.w3.org/2000/svg">
<path
d="M3.31462 16.4718C3.31462 16.9496 3.70026 17.3368 4.17609 17.3368L16.1385 17.3368C16.6144 17.3368 17 16.9496 17 16.4718L16.9998 13.6229C16.9998 13.1452 16.6142 12.7579 16.1383 12.7579L4.1764 12.7579C3.70056 12.7579 3.31492 13.1452 3.31492 13.6229L3.31512 16.4718L3.31462 16.4718Z"
fill="currentColor"
/>
<path
d="M3.31462 10.4557C3.31462 10.9335 3.70026 11.3208 4.17609 11.3208L11.3428 11.3208C11.8186 11.3208 12.2043 10.9335 12.2043 10.4557L12.2043 7.60711C12.2043 7.12931 11.8186 6.74208 11.3428 6.74208L4.17609 6.74208C3.70026 6.74208 3.31462 7.12932 3.31462 7.60711L3.31462 10.4557Z"
fill="currentColor"
/>
<path
d="M3.31451 1.59127L3.31451 4.44011C3.31451 4.91791 3.70016 5.30514 4.17598 5.30514L6.99509 5.30514C7.47093 5.30514 7.85657 4.91791 7.85657 4.44011L7.85637 1.59127C7.85637 1.11347 7.47073 0.726242 6.9949 0.726242L4.17599 0.726242C3.70035 0.726242 3.31452 1.11348 3.31452 1.59127L3.31451 1.59127Z"
fill="currentColor"
/>
<path
d="M-2.00529e-05 0.587841L-2.0791e-05 17.4747C-2.08052e-05 17.7995 0.262306 18.0625 0.585404 18.0625L1.38198 18.0625C1.70528 18.0625 1.96741 17.7995 1.96741 17.4747L1.96741 0.587841C1.96741 0.263208 1.70508 -1.14667e-08 1.38198 -2.55897e-08L0.585405 -6.04092e-08C0.261911 -7.45496e-08 -2.00387e-05 0.263213 -2.00529e-05 0.587841Z"
fill="currentColor"
/>
</svg>
<v-icon dark>$vuetify.icons.poll</v-icon>
</div>
<div class="poll-question">{{ pollQuestion }}</div>

View file

@ -11,10 +11,14 @@
/>
</div>
<div class="message">
<span v-html="linkify($sanitize(messageText))" />
<span class="edit-marker" v-if="event.replacingEventId()"
>{{ $t('edited') }}</span
>
<i v-if="event.isRedacted()" class="deleted-text">
<v-icon :color="this.senderIsAdminOrModerator(this.event)?'white':''" size="small">block</v-icon>
{{ $t('message.incoming_message_deleted_text')}}
</i>
<span v-html="linkify($sanitize(messageText))" v-else/>
<span class="edit-marker" v-if="event.replacingEventId() && !event.isRedacted()">
{{ $t('message.edited') }}
</span>
</div>
<!-- <div>{{ JSON.stringify(event) }}</div> -->
</div>

View file

@ -9,10 +9,10 @@
</div>
<QuickReactions :event="event" :timelineSet="timelineSet" />
<div class="op-button" ref="opbutton">
<v-btn id="btn-show-menu" icon @click.stop="showContextMenu($refs.opbutton)"
><v-icon>more_vert</v-icon></v-btn
>
<div class="op-button" ref="opbutton" v-if="!event.isRedacted()">
<v-btn id="btn-show-menu" icon @click.stop="showContextMenu($refs.opbutton)">
<v-icon>more_vert</v-icon>
</v-btn>
</div>
<!-- SLOT FOR CONTENT -->
<slot></slot>

View file

@ -2,24 +2,7 @@
<message-outgoing v-bind="{ ...$props, ...$attrs }" v-on="$listeners">
<div class="bubble poll-bubble">
<div class="poll-icon">
<svg width="17" height="19" viewBox="0 0 17 19" fill="none" xmlns="http://www.w3.org/2000/svg">
<path
d="M3.31462 16.4718C3.31462 16.9496 3.70026 17.3368 4.17609 17.3368L16.1385 17.3368C16.6144 17.3368 17 16.9496 17 16.4718L16.9998 13.6229C16.9998 13.1452 16.6142 12.7579 16.1383 12.7579L4.1764 12.7579C3.70056 12.7579 3.31492 13.1452 3.31492 13.6229L3.31512 16.4718L3.31462 16.4718Z"
fill="currentColor"
/>
<path
d="M3.31462 10.4557C3.31462 10.9335 3.70026 11.3208 4.17609 11.3208L11.3428 11.3208C11.8186 11.3208 12.2043 10.9335 12.2043 10.4557L12.2043 7.60711C12.2043 7.12931 11.8186 6.74208 11.3428 6.74208L4.17609 6.74208C3.70026 6.74208 3.31462 7.12932 3.31462 7.60711L3.31462 10.4557Z"
fill="currentColor"
/>
<path
d="M3.31451 1.59127L3.31451 4.44011C3.31451 4.91791 3.70016 5.30514 4.17598 5.30514L6.99509 5.30514C7.47093 5.30514 7.85657 4.91791 7.85657 4.44011L7.85637 1.59127C7.85637 1.11347 7.47073 0.726242 6.9949 0.726242L4.17599 0.726242C3.70035 0.726242 3.31452 1.11348 3.31452 1.59127L3.31451 1.59127Z"
fill="currentColor"
/>
<path
d="M-2.00529e-05 0.587841L-2.0791e-05 17.4747C-2.08052e-05 17.7995 0.262306 18.0625 0.585404 18.0625L1.38198 18.0625C1.70528 18.0625 1.96741 17.7995 1.96741 17.4747L1.96741 0.587841C1.96741 0.263208 1.70508 -1.14667e-08 1.38198 -2.55897e-08L0.585405 -6.04092e-08C0.261911 -7.45496e-08 -2.00387e-05 0.263213 -2.00529e-05 0.587841Z"
fill="currentColor"
/>
</svg>
<v-icon light>$vuetify.icons.poll</v-icon>
</div>
<div class="poll-question">{{ pollQuestion }}</div>

View file

@ -12,10 +12,14 @@
</div>
<div class="message">
<span v-html="linkify($sanitize(messageText))" />
<span class="edit-marker" v-if="event.replacingEventId()"
>{{ $t('edited') }}</span
>
<i v-if="event.isRedacted()" class="deleted-text">
<v-icon size="small">block</v-icon>
{{ $t('message.outgoing_message_deleted_text')}}
</i>
<span v-html="linkify($sanitize(messageText))" v-else/>
<span class="edit-marker" v-if="event.replacingEventId() && !event.isRedacted()">
{{ $t('message.edited') }}
</span>
</div>
</div>
</message-outgoing>

View file

@ -29,7 +29,7 @@ export default {
}
},
mounted() {
this.reactions = this.timelineSet.getRelationsForEvent(this.event.getId(), 'm.annotation', 'm.reaction');
this.reactions = this.timelineSet.relations.getChildEventsForEvent(this.event.getId(), 'm.annotation', 'm.reaction');
this.event.on("Event.relationsCreated", this.onRelationsCreated);
},
beforeDestroy() {
@ -40,7 +40,7 @@ export default {
},
methods: {
onRelationsCreated() {
this.reactions = this.timelineSet.getRelationsForEvent(this.event.getId(), 'm.annotation', 'm.reaction');
this.reactions = this.timelineSet.relations.getChildEventsForEvent(this.event.getId(), 'm.annotation', 'm.reaction');
},
onClickEmoji(emoji) {
this.$bubble('send-quick-reaction', {reaction:emoji, event:this.event});
@ -75,7 +75,7 @@ export default {
oldValue.off('Relations.add', this.onAddRelation);
}
if (newValue) {
newValue.on('Relations.add', this.onAddRelation);
newValue.on('Relations.add', this.onAddRelation);
}
this.processReactions();
},

View file

@ -70,8 +70,8 @@ export default {
// Look for poll end
this.pollEndRelations =
this.timelineSet.getRelationsForEvent(this.event.getId(), "m.reference", "m.poll.end") ||
this.timelineSet.getRelationsForEvent(this.event.getId(), "m.reference", "org.matrix.msc3381.poll.end");
this.timelineSet.relations.getChildEventsForEvent(this.event.getId(), "m.reference", "m.poll.end") ||
this.timelineSet.relations.getChildEventsForEvent(this.event.getId(), "m.reference", "org.matrix.msc3381.poll.end");
if (this.pollEndRelations) {
const endMessages = this.pollEndRelations.getRelations() || [];
if (endMessages.length > 0) {
@ -81,8 +81,8 @@ export default {
// Process votes
this.pollResponseRelations =
this.timelineSet.getRelationsForEvent(this.event.getId(), "m.reference", "m.poll.response") ||
this.timelineSet.getRelationsForEvent(this.event.getId(), "m.reference", "org.matrix.msc3381.poll.response");
this.timelineSet.relations.getChildEventsForEvent(this.event.getId(), "m.reference", "m.poll.response") ||
this.timelineSet.relations.getChildEventsForEvent(this.event.getId(), "m.reference", "org.matrix.msc3381.poll.response");
var userVotes = {};
if (this.pollResponseRelations) {
const votes = this.pollResponseRelations.getRelations() || [];

View file

@ -5,8 +5,11 @@ export default {
userCanChangeJoinRule: false,
userCanPurgeRoom: false,
editedRoomName: "",
isEditMode: false,
roomNameErrorMessage: null
isRoomNameEditMode: false,
roomNameErrorMessage: null,
editedRoomTopic: "",
isRoomTopicEditMode: false,
roomTopicErrorMessage: null,
}
},
mounted() {
@ -93,18 +96,32 @@ export default {
methods: {
onRoomNameClicked() {
if(this.userCanPurgeRoom) {
this.isEditMode = !this.isEditMode;
this.isRoomNameEditMode = !this.isRoomNameEditMode;
this.editedRoomName = this.roomName;
}
},
updateRoomName() {
if(this.editedRoomName) {
this.$matrix.matrixClient.setRoomName(this.room.roomId, this.editedRoomName);
this.isEditMode = !this.isEditMode;
this.isRoomNameEditMode = !this.isRoomNameEditMode;
} else {
this.$refs.editedRoomName.focus();
}
},
onRoomTopicClicked() {
if(this.userCanPurgeRoom) {
this.isRoomTopicEditMode = !this.isRoomTopicEditMode;
this.editedRoomTopic = this.roomTopic;
}
},
updateRoomTopic() {
if(this.editedRoomTopic) {
this.$matrix.matrixClient.setRoomTopic(this.room.roomId, this.editedRoomTopic);
this.isRoomTopicEditMode = !this.isRoomTopicEditMode;
} else {
this.$refs.editedRoomTopic.focus();
}
},
setRoomJoinRule(ignoredJoinRule) {
// Do nothing in the general mixin, override in RoomInfo.vue
},

View file

@ -163,9 +163,11 @@ class Util {
event_id: replyToEvent.getId()
}
}
let senderContent = replyToEvent.getContent()
const senderContentBody = Object.getOwnPropertyDescriptor(senderContent,'body') ? senderContent.body : Object.values(senderContent)[0].question.body
// Prefix the content with reply info (seems to be a legacy thing)
const prefix = replyToEvent.getContent().body.split('\n').map((item, index) => {
const prefix = senderContentBody.split('\n').map((item, index) => {
return "> " + (index == 0 ? ("<" + replyToEvent.getSender() + "> ") : "") + item;
}).join('\n');
content.body = prefix + "\n\n" + content.body;

View file

@ -5,6 +5,7 @@ import icPassword from '@/assets/icons/password.vue';
import icEdit from '@/assets/icons/edit.vue';
import icGlobe from '@/assets/icons/globe.vue';
import icAddReaction from '@/assets/icons/addReaction.vue';
import icPoll from '@/assets/icons/poll.vue';
Vue.use(Vuetify);
@ -27,6 +28,9 @@ export default new Vuetify({
addReaction: {
component: icAddReaction
},
poll: {
component: icPoll
},
},
user: icUser
},

View file

@ -3,16 +3,17 @@ import Vuex from 'vuex'
import VuexPersist from 'vuex-persist'
Vue.use(Vuex)
const USER = `convene_${ window.location.hostname }_user`
const SETTINGS = `convene_${ window.location.hostname }_settings`
// A Vuex plugin to persist the user object to either session or local storage, based on flag in the store state.
//
const persistUserPlugin = store => {
var user;
if (store.state.useLocalStorage) {
user = JSON.parse(window.localStorage.getItem('user'));
user = JSON.parse(window.localStorage.getItem(USER));
} else {
user = JSON.parse(window.sessionStorage.getItem('user'));
user = JSON.parse(window.sessionStorage.getItem(USER));
}
const initialState = user ? { status: { loggedIn: true }, user } : { status: { loggedIn: false }, user: null };
store.state.auth = initialState;
@ -20,11 +21,11 @@ const persistUserPlugin = store => {
store.subscribe((mutation, state) => {
if (mutation.type == 'setUser' || mutation.type == 'setUseLocalStorage') {
if (state.useLocalStorage) {
window.localStorage.setItem('user', JSON.stringify(state.auth.user));
window.sessionStorage.removeItem('user');
window.localStorage.setItem(USER, JSON.stringify(state.auth.user));
window.sessionStorage.removeItem(USER);
} else {
window.sessionStorage.setItem('user', JSON.stringify(state.auth.user));
window.localStorage.removeItem('user');
window.sessionStorage.setItem(USER, JSON.stringify(state.auth.user));
window.localStorage.removeItem(USER);
}
}
})
@ -32,7 +33,7 @@ const persistUserPlugin = store => {
const vuexPersistLocalStorage = new VuexPersist({
key: 'settings',
key: SETTINGS,
storage: localStorage,
reducer: state => {
if (state.useLocalStorage) {
@ -47,7 +48,7 @@ const vuexPersistLocalStorage = new VuexPersist({
})
const vuexPersistSessionStorage = new VuexPersist({
key: 'settings',
key: SETTINGS,
storage: sessionStorage,
reducer: state => {
if (!state.useLocalStorage) {
@ -61,7 +62,7 @@ const vuexPersistSessionStorage = new VuexPersist({
}
})
const defaultUseSessionStorage = (sessionStorage.getItem('user') != null);
const defaultUseSessionStorage = (sessionStorage.getItem(USER) != null);
export default new Vuex.Store({
state: { language: null, currentRoomId: null, auth: null, tempuser: null, useLocalStorage: !defaultUseSessionStorage },