mirror of
https://github.com/dz0ny/meshcore-sar.git
synced 2026-08-13 01:10:28 +00:00
feat: Add support for hash and private channels with corresponding UI updates
- Introduced new localization strings for channel types and their descriptions in Italian, German, Spanish, French, Croatian, Slovenian, and English. - Updated the `AppProvider` to handle channel info reception, including deletion of channels and updating the UI accordingly. - Enhanced `ChannelsProvider` to support channel removal and notify listeners. - Modified `ConnectionProvider` to include methods for checking empty channel slots and deleting channels. - Updated BLE service methods to handle channel deletion and verification. - Improved the `AddChannelDialog` to differentiate between hash and private channels, including dynamic UI elements based on channel type. - Added delete functionality for channels in the `ContactTile` widget with confirmation dialogs. - Adjusted permission request dialog behavior to allow dismissing by tapping outside.
This commit is contained in:
@@ -2768,6 +2768,8 @@
|
||||
"channelSecret": "Kanal-Passwort",
|
||||
"channelSecretHint": "Gemeinsames Passwort für diesen Kanal",
|
||||
"channelSecretHelp": "Dieses Passwort muss mit allen Teammitgliedern geteilt werden, die Zugriff auf diesen Kanal benötigen",
|
||||
"channelTypesInfo": "Hash-Kanäle (#team): Passwort automatisch aus dem Namen generiert. Gleicher Name = gleicher Kanal auf allen Geräten.\n\nPrivate Kanäle: Verwenden Sie ein explizites Passwort. Nur diejenigen mit dem Passwort können beitreten.",
|
||||
"hashChannelInfo": "Hash-Kanal: Das Passwort wird automatisch aus dem Kanalnamen generiert. Jeder, der denselben Namen verwendet, wird demselben Kanal beitreten.",
|
||||
"channelNameRequired": "Kanalname ist erforderlich",
|
||||
"channelNameTooLong": "Kanalname darf maximal 31 Zeichen lang sein",
|
||||
"channelSecretRequired": "Kanal-Passwort ist erforderlich",
|
||||
@@ -2775,6 +2777,10 @@
|
||||
"invalidAsciiCharacters": "Nur ASCII-Zeichen sind erlaubt",
|
||||
"channelCreatedSuccessfully": "Kanal erfolgreich erstellt",
|
||||
"channelCreationFailed": "Kanal konnte nicht erstellt werden: {error}",
|
||||
"deleteChannel": "Kanal löschen",
|
||||
"deleteChannelConfirmation": "Sind Sie sicher, dass Sie den Kanal \"{channelName}\" löschen möchten? Diese Aktion kann nicht rückgängig gemacht werden.",
|
||||
"channelDeletedSuccessfully": "Kanal erfolgreich gelöscht",
|
||||
"channelDeletionFailed": "Kanal konnte nicht gelöscht werden: {error}",
|
||||
"allChannelSlotsInUse": "Alle Kanalplätze sind belegt (maximal 39 benutzerdefinierte Kanäle)",
|
||||
"createChannel": "Kanal erstellen",
|
||||
|
||||
|
||||
@@ -3491,6 +3491,16 @@
|
||||
"description": "Help text explaining channel secret"
|
||||
},
|
||||
|
||||
"channelTypesInfo": "Hash channels (#team): Secret auto-generated from name. Same name = same channel across devices.\n\nPrivate channels: Use explicit secret. Only those with the secret can join.",
|
||||
"@channelTypesInfo": {
|
||||
"description": "Information banner explaining hash and private channel types"
|
||||
},
|
||||
|
||||
"hashChannelInfo": "Hash channel: Secret will be auto-generated from the channel name. Anyone using the same name will join the same channel.",
|
||||
"@hashChannelInfo": {
|
||||
"description": "Help text for hash channels (# prefix)"
|
||||
},
|
||||
|
||||
"channelNameRequired": "Channel name is required",
|
||||
"@channelNameRequired": {
|
||||
"description": "Validation error for empty channel name"
|
||||
@@ -3531,6 +3541,36 @@
|
||||
}
|
||||
},
|
||||
|
||||
"deleteChannel": "Delete Channel",
|
||||
"@deleteChannel": {
|
||||
"description": "Delete channel button/menu item"
|
||||
},
|
||||
|
||||
"deleteChannelConfirmation": "Are you sure you want to delete channel \"{channelName}\"? This action cannot be undone.",
|
||||
"@deleteChannelConfirmation": {
|
||||
"description": "Confirmation dialog when deleting a channel",
|
||||
"placeholders": {
|
||||
"channelName": {
|
||||
"type": "String"
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
"channelDeletedSuccessfully": "Channel deleted successfully",
|
||||
"@channelDeletedSuccessfully": {
|
||||
"description": "Success message after deleting channel"
|
||||
},
|
||||
|
||||
"channelDeletionFailed": "Failed to delete channel: {error}",
|
||||
"@channelDeletionFailed": {
|
||||
"description": "Error message when channel deletion fails",
|
||||
"placeholders": {
|
||||
"error": {
|
||||
"type": "String"
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
"allChannelSlotsInUse": "All channel slots are in use (maximum 39 custom channels)",
|
||||
"@allChannelSlotsInUse": {
|
||||
"description": "Error when no channel slots available"
|
||||
|
||||
@@ -2763,6 +2763,8 @@
|
||||
"channelSecret": "Contraseña del Canal",
|
||||
"channelSecretHint": "Contraseña compartida para este canal",
|
||||
"channelSecretHelp": "Esta contraseña debe compartirse con todos los miembros del equipo que necesiten acceso a este canal",
|
||||
"channelTypesInfo": "Canales hash (#equipo): Contraseña generada automáticamente del nombre. Mismo nombre = mismo canal en todos los dispositivos.\n\nCanales privados: Use contraseña explícita. Solo aquellos con la contraseña pueden unirse.",
|
||||
"hashChannelInfo": "Canal hash: La contraseña se generará automáticamente del nombre del canal. Cualquiera que use el mismo nombre se unirá al mismo canal.",
|
||||
"channelNameRequired": "El nombre del canal es obligatorio",
|
||||
"channelNameTooLong": "El nombre del canal debe tener 31 caracteres o menos",
|
||||
"channelSecretRequired": "La contraseña del canal es obligatoria",
|
||||
@@ -2770,6 +2772,10 @@
|
||||
"invalidAsciiCharacters": "Solo se permiten caracteres ASCII",
|
||||
"channelCreatedSuccessfully": "Canal creado exitosamente",
|
||||
"channelCreationFailed": "Error al crear el canal: {error}",
|
||||
"deleteChannel": "Eliminar Canal",
|
||||
"deleteChannelConfirmation": "¿Está seguro de que desea eliminar el canal \"{channelName}\"? Esta acción no se puede deshacer.",
|
||||
"channelDeletedSuccessfully": "Canal eliminado exitosamente",
|
||||
"channelDeletionFailed": "Error al eliminar el canal: {error}",
|
||||
"allChannelSlotsInUse": "Todos los espacios de canales están en uso (máximo 39 canales personalizados)",
|
||||
"createChannel": "Crear Canal",
|
||||
|
||||
|
||||
@@ -2771,6 +2771,8 @@
|
||||
"channelSecret": "Mot de Passe du Canal",
|
||||
"channelSecretHint": "Mot de passe partagé pour ce canal",
|
||||
"channelSecretHelp": "Ce mot de passe doit être partagé avec tous les membres de l'équipe qui ont besoin d'accéder à ce canal",
|
||||
"channelTypesInfo": "Canaux hash (#équipe) : Mot de passe généré automatiquement à partir du nom. Même nom = même canal sur tous les appareils.\n\nCanaux privés : Utilisez un mot de passe explicite. Seuls ceux qui ont le mot de passe peuvent rejoindre.",
|
||||
"hashChannelInfo": "Canal hash : Le mot de passe sera automatiquement généré à partir du nom du canal. Toute personne utilisant le même nom rejoindra le même canal.",
|
||||
"channelNameRequired": "Le nom du canal est requis",
|
||||
"channelNameTooLong": "Le nom du canal doit contenir 31 caractères ou moins",
|
||||
"channelSecretRequired": "Le mot de passe du canal est requis",
|
||||
|
||||
@@ -1045,6 +1045,8 @@
|
||||
"channelSecret": "Lozinka kanala",
|
||||
"channelSecretHint": "Zajednička lozinka za ovaj kanal",
|
||||
"channelSecretHelp": "Ova lozinka mora biti podijeljena sa svim članovima tima koji trebaju pristup ovom kanalu",
|
||||
"channelTypesInfo": "Hash kanali (#tim): Lozinka automatski generirana iz imena. Isto ime = isti kanal na svim uređajima.\n\nPrivatni kanali: Koristite eksplicitnu lozinku. Samo oni s lozinkom se mogu pridružiti.",
|
||||
"hashChannelInfo": "Hash kanal: Lozinka će biti automatski generirana iz imena kanala. Bilo tko tko koristi isto ime pridružit će se istom kanalu.",
|
||||
"channelNameRequired": "Ime kanala je obavezno",
|
||||
"channelNameTooLong": "Ime kanala mora imati najviše 31 znak",
|
||||
"channelSecretRequired": "Lozinka kanala je obavezna",
|
||||
@@ -1052,6 +1054,10 @@
|
||||
"invalidAsciiCharacters": "Samo ASCII znakovi su dozvoljeni",
|
||||
"channelCreatedSuccessfully": "Kanal uspješno kreiran",
|
||||
"channelCreationFailed": "Neuspješno kreiranje kanala: {error}",
|
||||
"deleteChannel": "Izbriši kanal",
|
||||
"deleteChannelConfirmation": "Jeste li sigurni da želite izbrisati kanal \"{channelName}\"? Ova radnja se ne može poništiti.",
|
||||
"channelDeletedSuccessfully": "Kanal uspješno izbrisan",
|
||||
"channelDeletionFailed": "Neuspješno brisanje kanala: {error}",
|
||||
"allChannelSlotsInUse": "Svi slotovi kanala su zauzeti (maksimalno 39 prilagođenih kanala)",
|
||||
"createChannel": "Kreiraj kanal",
|
||||
|
||||
|
||||
@@ -2771,6 +2771,8 @@
|
||||
"channelSecret": "Password del Canale",
|
||||
"channelSecretHint": "Password condivisa per questo canale",
|
||||
"channelSecretHelp": "Questa password deve essere condivisa con tutti i membri del team che necessitano di accesso a questo canale",
|
||||
"channelTypesInfo": "Canali hash (#squadra): Password generata automaticamente dal nome. Stesso nome = stesso canale su tutti i dispositivi.\n\nCanali privati: Usa una password esplicita. Solo chi ha la password può unirsi.",
|
||||
"hashChannelInfo": "Canale hash: La password verrà generata automaticamente dal nome del canale. Chiunque utilizzi lo stesso nome si unirà allo stesso canale.",
|
||||
"channelNameRequired": "Il nome del canale è obbligatorio",
|
||||
"channelNameTooLong": "Il nome del canale deve contenere al massimo 31 caratteri",
|
||||
"channelSecretRequired": "La password del canale è obbligatoria",
|
||||
|
||||
@@ -3723,6 +3723,18 @@ abstract class AppLocalizations {
|
||||
/// **'This secret must be shared with all team members who need access to this channel'**
|
||||
String get channelSecretHelp;
|
||||
|
||||
/// Information banner explaining hash and private channel types
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'Hash channels (#team): Secret auto-generated from name. Same name = same channel across devices.\n\nPrivate channels: Use explicit secret. Only those with the secret can join.'**
|
||||
String get channelTypesInfo;
|
||||
|
||||
/// Help text for hash channels (# prefix)
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'Hash channel: Secret will be auto-generated from the channel name. Anyone using the same name will join the same channel.'**
|
||||
String get hashChannelInfo;
|
||||
|
||||
/// Validation error for empty channel name
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
|
||||
@@ -2076,6 +2076,14 @@ class AppLocalizationsDe extends AppLocalizations {
|
||||
String get channelSecretHelp =>
|
||||
'Dieses Passwort muss mit allen Teammitgliedern geteilt werden, die Zugriff auf diesen Kanal benötigen';
|
||||
|
||||
@override
|
||||
String get channelTypesInfo =>
|
||||
'Hash-Kanäle (#team): Passwort automatisch aus dem Namen generiert. Gleicher Name = gleicher Kanal auf allen Geräten.\n\nPrivate Kanäle: Verwenden Sie ein explizites Passwort. Nur diejenigen mit dem Passwort können beitreten.';
|
||||
|
||||
@override
|
||||
String get hashChannelInfo =>
|
||||
'Hash-Kanal: Das Passwort wird automatisch aus dem Kanalnamen generiert. Jeder, der denselben Namen verwendet, wird demselben Kanal beitreten.';
|
||||
|
||||
@override
|
||||
String get channelNameRequired => 'Kanalname ist erforderlich';
|
||||
|
||||
|
||||
@@ -2056,6 +2056,14 @@ class AppLocalizationsEn extends AppLocalizations {
|
||||
String get channelSecretHelp =>
|
||||
'This secret must be shared with all team members who need access to this channel';
|
||||
|
||||
@override
|
||||
String get channelTypesInfo =>
|
||||
'Hash channels (#team): Secret auto-generated from name. Same name = same channel across devices.\n\nPrivate channels: Use explicit secret. Only those with the secret can join.';
|
||||
|
||||
@override
|
||||
String get hashChannelInfo =>
|
||||
'Hash channel: Secret will be auto-generated from the channel name. Anyone using the same name will join the same channel.';
|
||||
|
||||
@override
|
||||
String get channelNameRequired => 'Channel name is required';
|
||||
|
||||
|
||||
@@ -2081,6 +2081,14 @@ class AppLocalizationsEs extends AppLocalizations {
|
||||
String get channelSecretHelp =>
|
||||
'Esta contraseña debe compartirse con todos los miembros del equipo que necesiten acceso a este canal';
|
||||
|
||||
@override
|
||||
String get channelTypesInfo =>
|
||||
'Canales hash (#equipo): Contraseña generada automáticamente del nombre. Mismo nombre = mismo canal en todos los dispositivos.\n\nCanales privados: Use contraseña explícita. Solo aquellos con la contraseña pueden unirse.';
|
||||
|
||||
@override
|
||||
String get hashChannelInfo =>
|
||||
'Canal hash: La contraseña se generará automáticamente del nombre del canal. Cualquiera que use el mismo nombre se unirá al mismo canal.';
|
||||
|
||||
@override
|
||||
String get channelNameRequired => 'El nombre del canal es obligatorio';
|
||||
|
||||
|
||||
@@ -2085,6 +2085,14 @@ class AppLocalizationsFr extends AppLocalizations {
|
||||
String get channelSecretHelp =>
|
||||
'Ce mot de passe doit être partagé avec tous les membres de l\'équipe qui ont besoin d\'accéder à ce canal';
|
||||
|
||||
@override
|
||||
String get channelTypesInfo =>
|
||||
'Canaux hash (#équipe) : Mot de passe généré automatiquement à partir du nom. Même nom = même canal sur tous les appareils.\n\nCanaux privés : Utilisez un mot de passe explicite. Seuls ceux qui ont le mot de passe peuvent rejoindre.';
|
||||
|
||||
@override
|
||||
String get hashChannelInfo =>
|
||||
'Canal hash : Le mot de passe sera automatiquement généré à partir du nom du canal. Toute personne utilisant le même nom rejoindra le même canal.';
|
||||
|
||||
@override
|
||||
String get channelNameRequired => 'Le nom du canal est requis';
|
||||
|
||||
|
||||
@@ -2066,6 +2066,14 @@ class AppLocalizationsHr extends AppLocalizations {
|
||||
String get channelSecretHelp =>
|
||||
'Ova lozinka mora biti podijeljena sa svim članovima tima koji trebaju pristup ovom kanalu';
|
||||
|
||||
@override
|
||||
String get channelTypesInfo =>
|
||||
'Hash kanali (#tim): Lozinka automatski generirana iz imena. Isto ime = isti kanal na svim uređajima.\n\nPrivatni kanali: Koristite eksplicitnu lozinku. Samo oni s lozinkom se mogu pridružiti.';
|
||||
|
||||
@override
|
||||
String get hashChannelInfo =>
|
||||
'Hash kanal: Lozinka će biti automatski generirana iz imena kanala. Bilo tko tko koristi isto ime pridružit će se istom kanalu.';
|
||||
|
||||
@override
|
||||
String get channelNameRequired => 'Ime kanala je obavezno';
|
||||
|
||||
|
||||
@@ -2076,6 +2076,14 @@ class AppLocalizationsIt extends AppLocalizations {
|
||||
String get channelSecretHelp =>
|
||||
'Questa password deve essere condivisa con tutti i membri del team che necessitano di accesso a questo canale';
|
||||
|
||||
@override
|
||||
String get channelTypesInfo =>
|
||||
'Canali hash (#squadra): Password generata automaticamente dal nome. Stesso nome = stesso canale su tutti i dispositivi.\n\nCanali privati: Usa una password esplicita. Solo chi ha la password può unirsi.';
|
||||
|
||||
@override
|
||||
String get hashChannelInfo =>
|
||||
'Canale hash: La password verrà generata automaticamente dal nome del canale. Chiunque utilizzi lo stesso nome si unirà allo stesso canale.';
|
||||
|
||||
@override
|
||||
String get channelNameRequired => 'Il nome del canale è obbligatorio';
|
||||
|
||||
|
||||
@@ -2066,6 +2066,14 @@ class AppLocalizationsSl extends AppLocalizations {
|
||||
String get channelSecretHelp =>
|
||||
'To geslo mora biti deljeno z vsemi člani ekipe, ki potrebujejo dostop do tega kanala';
|
||||
|
||||
@override
|
||||
String get channelTypesInfo =>
|
||||
'Hash kanali (#ekipa): Geslo samodejno generirano iz imena. Enako ime = isti kanal na vseh napravah.\n\nZasebni kanali: Uporabite eksplicitno geslo. Samo tisti z geslom se lahko pridružijo.';
|
||||
|
||||
@override
|
||||
String get hashChannelInfo =>
|
||||
'Hash kanal: Geslo bo samodejno generirano iz imena kanala. Kdorkoli uporabi isto ime, se bo pridružil istemu kanalu.';
|
||||
|
||||
@override
|
||||
String get channelNameRequired => 'Ime kanala je obvezno';
|
||||
|
||||
|
||||
@@ -1049,6 +1049,8 @@
|
||||
"channelSecret": "Geslo kanala",
|
||||
"channelSecretHint": "Skupno geslo za ta kanal",
|
||||
"channelSecretHelp": "To geslo mora biti deljeno z vsemi člani ekipe, ki potrebujejo dostop do tega kanala",
|
||||
"channelTypesInfo": "Hash kanali (#ekipa): Geslo samodejno generirano iz imena. Enako ime = isti kanal na vseh napravah.\n\nZasebni kanali: Uporabite eksplicitno geslo. Samo tisti z geslom se lahko pridružijo.",
|
||||
"hashChannelInfo": "Hash kanal: Geslo bo samodejno generirano iz imena kanala. Kdorkoli uporabi isto ime, se bo pridružil istemu kanalu.",
|
||||
"channelNameRequired": "Ime kanala je obvezno",
|
||||
"channelNameTooLong": "Ime kanala mora imeti največ 31 znakov",
|
||||
"channelSecretRequired": "Geslo kanala je obvezno",
|
||||
@@ -1056,6 +1058,10 @@
|
||||
"invalidAsciiCharacters": "Dovoljeni so samo ASCII znaki",
|
||||
"channelCreatedSuccessfully": "Kanal uspešno ustvarjen",
|
||||
"channelCreationFailed": "Neuspešno ustvarjanje kanala: {error}",
|
||||
"deleteChannel": "Izbriši kanal",
|
||||
"deleteChannelConfirmation": "Ali ste prepričani, da želite izbrisati kanal \"{channelName}\"? Tega dejanja ni mogoče razveljaviti.",
|
||||
"channelDeletedSuccessfully": "Kanal uspešno izbrisan",
|
||||
"channelDeletionFailed": "Neuspešno brisanje kanala: {error}",
|
||||
"allChannelSlotsInUse": "Vsa mesta za kanale so zasedena (maksimalno 39 prilagojenih kanalov)",
|
||||
"createChannel": "Ustvari kanal",
|
||||
|
||||
|
||||
Reference in New Issue
Block a user