Merge remote-tracking branch 'origin/issue-fix-channel-edit-delete-actions' into combined-prs

This commit is contained in:
just_stuff_tm 2026-02-24 12:45:51 -05:00
commit ea1d728d4f
33 changed files with 175 additions and 26 deletions

View file

@ -1,4 +1,6 @@
{
"channels_channelDeleteFailed": "Неуспешно изтриване на канала \"{name}\"",
"@channels_channelDeleteFailed": { "placeholders": { "name": { "type": "String" } } },
"@@locale": "bg",
"appTitle": "MeshCore Open",
"nav_contacts": "Контакти",

View file

@ -1,4 +1,6 @@
{
"channels_channelDeleteFailed": "Kanal {name} konnte nicht gelöscht werden",
"@channels_channelDeleteFailed": { "placeholders": { "name": { "type": "String" } } },
"@@locale": "de",
"appTitle": "MeshCore Open",
"nav_contacts": "Kontakte",

View file

@ -365,6 +365,14 @@
}
}
},
"channels_channelDeleteFailed": "Failed to delete channel \"{name}\"",
"@channels_channelDeleteFailed": {
"placeholders": {
"name": {
"type": "String"
}
}
},
"channels_channelDeleted": "Channel \"{name}\" deleted",
"@channels_channelDeleted": {
"placeholders": {

View file

@ -1,4 +1,6 @@
{
"channels_channelDeleteFailed": "No se pudo eliminar el canal \"{name}\"",
"@channels_channelDeleteFailed": { "placeholders": { "name": { "type": "String" } } },
"@@locale": "es",
"appTitle": "MeshCore Open",
"nav_contacts": "Contactos",

View file

@ -1,4 +1,6 @@
{
"channels_channelDeleteFailed": "Échec de la suppression de la chaîne \"{name}\"",
"@channels_channelDeleteFailed": { "placeholders": { "name": { "type": "String" } } },
"@@locale": "fr",
"appTitle": "MeshCore Open",
"nav_contacts": "Contacts",

View file

@ -1,4 +1,6 @@
{
"channels_channelDeleteFailed": "Impossibile eliminare il canale \"{name}\"",
"@channels_channelDeleteFailed": { "placeholders": { "name": { "type": "String" } } },
"@@locale": "it",
"appTitle": "MeshCore Open",
"nav_contacts": "Contatti",

View file

@ -1582,6 +1582,12 @@ abstract class AppLocalizations {
/// **'Delete \"{name}\"? This cannot be undone.'**
String channels_deleteChannelConfirm(String name);
/// No description provided for @channels_channelDeleteFailed.
///
/// In en, this message translates to:
/// **'Failed to delete channel \"{name}\"'**
String channels_channelDeleteFailed(String name);
/// No description provided for @channels_channelDeleted.
///
/// In en, this message translates to:

View file

@ -820,6 +820,11 @@ class AppLocalizationsBg extends AppLocalizations {
return 'Изтрий \"$name\"? Това не може да бъде отменено.';
}
@override
String channels_channelDeleteFailed(String name) {
return 'Неуспешно изтриване на канала \"$name\"';
}
@override
String channels_channelDeleted(String name) {
return 'Каналът \"$name\" е изтрит';

View file

@ -817,6 +817,11 @@ class AppLocalizationsDe extends AppLocalizations {
return 'Löschen von \"$name\"? Dies kann nicht rückgängig gemacht werden.';
}
@override
String channels_channelDeleteFailed(String name) {
return 'Kanal $name konnte nicht gelöscht werden';
}
@override
String channels_channelDeleted(String name) {
return 'Kanal \"$name\" gelöscht';

View file

@ -808,6 +808,11 @@ class AppLocalizationsEn extends AppLocalizations {
return 'Delete \"$name\"? This cannot be undone.';
}
@override
String channels_channelDeleteFailed(String name) {
return 'Failed to delete channel \"$name\"';
}
@override
String channels_channelDeleted(String name) {
return 'Channel \"$name\" deleted';

View file

@ -818,6 +818,11 @@ class AppLocalizationsEs extends AppLocalizations {
return 'Eliminar \"$name\"? Esto no se puede deshacer.';
}
@override
String channels_channelDeleteFailed(String name) {
return 'No se pudo eliminar el canal \"$name\"';
}
@override
String channels_channelDeleted(String name) {
return 'Canal \"$name\" eliminado';

View file

@ -820,6 +820,11 @@ class AppLocalizationsFr extends AppLocalizations {
return 'Supprimer $name? Cela ne peut pas être annulé.';
}
@override
String channels_channelDeleteFailed(String name) {
return 'Échec de la suppression de la chaîne \"$name\"';
}
@override
String channels_channelDeleted(String name) {
return 'Le canal \"$name\" a été supprimé';

View file

@ -816,6 +816,11 @@ class AppLocalizationsIt extends AppLocalizations {
return 'Eliminare \"$name\"? Non può essere annullato.';
}
@override
String channels_channelDeleteFailed(String name) {
return 'Impossibile eliminare il canale \"$name\"';
}
@override
String channels_channelDeleted(String name) {
return 'Canale \"$name\" eliminato';

View file

@ -813,6 +813,11 @@ class AppLocalizationsNl extends AppLocalizations {
return 'Verwijderen \"$name\"? Dit kan niet worden teruggedraaid.';
}
@override
String channels_channelDeleteFailed(String name) {
return 'Kan kanaal $name niet verwijderen';
}
@override
String channels_channelDeleted(String name) {
return 'Kanaal \"$name\" verwijderd';

View file

@ -818,6 +818,11 @@ class AppLocalizationsPl extends AppLocalizations {
return 'Usuń \"$name\"? Nie można tego cofnąć.';
}
@override
String channels_channelDeleteFailed(String name) {
return 'Nie udało się usunąć kanału \"$name\"';
}
@override
String channels_channelDeleted(String name) {
return 'Kanał \"$name\" usunięto';

View file

@ -819,6 +819,11 @@ class AppLocalizationsPt extends AppLocalizations {
return 'Excluir \"$name\"? Não pode ser desfeito.';
}
@override
String channels_channelDeleteFailed(String name) {
return 'Falha ao excluir o canal \"$name\"';
}
@override
String channels_channelDeleted(String name) {
return 'Canal \"$name\" excluído';

View file

@ -817,6 +817,11 @@ class AppLocalizationsRu extends AppLocalizations {
return 'Удалить \"$name\"? Это действие нельзя отменить.';
}
@override
String channels_channelDeleteFailed(String name) {
return 'Не удалось удалить канал $name.';
}
@override
String channels_channelDeleted(String name) {
return 'Канал \"$name\" удалён';

View file

@ -813,6 +813,11 @@ class AppLocalizationsSk extends AppLocalizations {
return 'Odstrániť \"$name\"? To sa nedá zrušiť.';
}
@override
String channels_channelDeleteFailed(String name) {
return 'Kanál \"$name\" sa nepodarilo odstrániť';
}
@override
String channels_channelDeleted(String name) {
return 'Kanál \"$name\" bol odstránený';

View file

@ -811,6 +811,11 @@ class AppLocalizationsSl extends AppLocalizations {
return 'Izbrišem \"$name\"? To se ne da povrniti.';
}
@override
String channels_channelDeleteFailed(String name) {
return 'Kanala $name ni bilo mogoče izbrisati';
}
@override
String channels_channelDeleted(String name) {
return 'Kanal \"$name\" izbrisan.';

View file

@ -807,6 +807,11 @@ class AppLocalizationsSv extends AppLocalizations {
return 'Radera \"$name\"? Detta kan inte ångras.';
}
@override
String channels_channelDeleteFailed(String name) {
return 'Det gick inte att ta bort kanalen \"$name\"';
}
@override
String channels_channelDeleted(String name) {
return 'Kanalen \"$name\" raderad';

View file

@ -815,6 +815,11 @@ class AppLocalizationsUk extends AppLocalizations {
return 'Видалити $name? Це не можна скасувати.';
}
@override
String channels_channelDeleteFailed(String name) {
return 'Не вдалося видалити канал \"$name\"';
}
@override
String channels_channelDeleted(String name) {
return 'Канал «$name» видалено';

View file

@ -775,6 +775,11 @@ class AppLocalizationsZh extends AppLocalizations {
return 'Delete \"$name\"? This cannot be undone.';
}
@override
String channels_channelDeleteFailed(String name) {
return '无法删除频道 \"$name\"';
}
@override
String channels_channelDeleted(String name) {
return '删除频道 \"$name\"';

View file

@ -1,4 +1,6 @@
{
"channels_channelDeleteFailed": "Kan kanaal {name} niet verwijderen",
"@channels_channelDeleteFailed": { "placeholders": { "name": { "type": "String" } } },
"@@locale": "nl",
"appTitle": "MeshCore Open",
"nav_contacts": "Contacten",

View file

@ -1,4 +1,6 @@
{
"channels_channelDeleteFailed": "Nie udało się usunąć kanału \"{name}\"",
"@channels_channelDeleteFailed": { "placeholders": { "name": { "type": "String" } } },
"@@locale": "pl",
"appTitle": "MeshCore Open",
"nav_contacts": "Kontakty",

View file

@ -1,4 +1,6 @@
{
"channels_channelDeleteFailed": "Falha ao excluir o canal \"{name}\"",
"@channels_channelDeleteFailed": { "placeholders": { "name": { "type": "String" } } },
"@@locale": "pt",
"appTitle": "MeshCore Open",
"nav_contacts": "Contactos",

View file

@ -1,4 +1,6 @@
{
"channels_channelDeleteFailed": "Не удалось удалить канал {name}.",
"@channels_channelDeleteFailed": { "placeholders": { "name": { "type": "String" } } },
"@@locale": "ru",
"appTitle": "MeshCore Open",
"nav_contacts": "Контакты",

View file

@ -1,4 +1,6 @@
{
"channels_channelDeleteFailed": "Kanál \"{name}\" sa nepodarilo odstrániť",
"@channels_channelDeleteFailed": { "placeholders": { "name": { "type": "String" } } },
"@@locale": "sk",
"appTitle": "MeshCore Open",
"nav_contacts": "Kontakty",

View file

@ -1,4 +1,6 @@
{
"channels_channelDeleteFailed": "Kanala {name} ni bilo mogoče izbrisati",
"@channels_channelDeleteFailed": { "placeholders": { "name": { "type": "String" } } },
"@@locale": "sl",
"appTitle": "MeshCore Open",
"nav_contacts": "Stiki",

View file

@ -1,4 +1,6 @@
{
"channels_channelDeleteFailed": "Det gick inte att ta bort kanalen \"{name}\"",
"@channels_channelDeleteFailed": { "placeholders": { "name": { "type": "String" } } },
"@@locale": "sv",
"appTitle": "MeshCore Open",
"nav_contacts": "Kontakter",

View file

@ -1,4 +1,6 @@
{
"channels_channelDeleteFailed": "Не вдалося видалити канал \"{name}\"",
"@channels_channelDeleteFailed": { "placeholders": { "name": { "type": "String" } } },
"@@locale": "uk",
"appTitle": "MeshCore Open",
"nav_contacts": "Контакти",

View file

@ -1,4 +1,6 @@
{
"channels_channelDeleteFailed": "无法删除频道 \"{name}\"",
"@channels_channelDeleteFailed": { "placeholders": { "name": { "type": "String" } } },
"@@locale": "zh",
"appTitle": "MeshCore Open",
"nav_contacts": "联系方式",

View file

@ -489,12 +489,13 @@ class _ChannelsScreenState extends State<ChannelsScreen>
ChannelMessageStore channelMessageStore,
Channel channel,
) {
final parentContext = context;
final settingsService = context.read<AppSettingsService>();
final isMuted = settingsService.isChannelMuted(channel.name);
showModalBottomSheet(
context: context,
builder: (context) => SafeArea(
context: parentContext,
builder: (sheetContext) => SafeArea(
child: Column(
mainAxisSize: MainAxisSize.min,
children: [
@ -502,10 +503,10 @@ class _ChannelsScreenState extends State<ChannelsScreen>
leading: const Icon(Icons.edit_outlined),
title: Text(context.l10n.channels_editChannel),
onTap: () async {
Navigator.pop(context);
Navigator.pop(sheetContext);
await Future.delayed(const Duration(milliseconds: 100));
if (context.mounted) {
_showEditChannelDialog(context, connector, channel);
if (parentContext.mounted) {
_showEditChannelDialog(parentContext, connector, channel);
}
},
),
@ -521,7 +522,7 @@ class _ChannelsScreenState extends State<ChannelsScreen>
: context.l10n.channels_muteChannel,
),
onTap: () async {
Navigator.pop(context);
Navigator.pop(sheetContext);
if (isMuted) {
await settingsService.unmuteChannel(channel.name);
} else {
@ -536,9 +537,9 @@ class _ChannelsScreenState extends State<ChannelsScreen>
style: const TextStyle(color: Colors.red),
),
onTap: () async {
Navigator.pop(context);
Navigator.pop(sheetContext);
await Future.delayed(const Duration(milliseconds: 100));
if (context.mounted) {
if (parentContext.mounted) {
_confirmDeleteChannel(
context,
connector,
@ -1454,7 +1455,7 @@ class _ChannelsScreenState extends State<ChannelsScreen>
child: Text(dialogContext.l10n.common_cancel),
),
FilledButton(
onPressed: () {
onPressed: () async {
final name = nameController.text.trim();
final pskHex = pskController.text.trim();
@ -1471,13 +1472,25 @@ class _ChannelsScreenState extends State<ChannelsScreen>
}
Navigator.pop(dialogContext);
connector.setChannel(channel.index, name, psk);
connector.setChannelSmazEnabled(channel.index, smazEnabled);
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(
content: Text(context.l10n.channels_channelUpdated(name)),
),
);
try {
await connector.setChannel(channel.index, name, psk);
await connector.setChannelSmazEnabled(
channel.index,
smazEnabled,
);
if (!context.mounted) return;
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(
content: Text(context.l10n.channels_channelUpdated(name)),
),
);
} catch (e, st) {
debugPrint(st.toString());
if (!context.mounted) return;
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(content: Text('Failed to update channel: $e')),
);
}
},
child: Text(dialogContext.l10n.common_save),
),
@ -1506,17 +1519,36 @@ class _ChannelsScreenState extends State<ChannelsScreen>
child: Text(dialogContext.l10n.common_cancel),
),
TextButton(
onPressed: () {
onPressed: () async {
Navigator.pop(dialogContext);
connector.deleteChannel(channel.index);
channelMessageStore.clearChannelMessages(channel.index);
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(
content: Text(
context.l10n.channels_channelDeleted(channel.name),
try {
await connector.deleteChannel(channel.index);
channelMessageStore.clearChannelMessages(channel.index);
if (!context.mounted) return;
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(
content: Text(
context.l10n.channels_channelDeleted(channel.name),
),
),
),
);
);
} catch (e, st) {
if (!context.mounted) return;
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(
content: Text(
context.l10n.channels_channelDeleteFailed(channel.name),
),
),
);
// Preserve existing logging (if it was there)
debugPrint('Failed to delete channel: $e\n$st');
}
},
child: Text(
dialogContext.l10n.common_delete,

View file

@ -1140,4 +1140,4 @@ packages:
version: "3.1.3"
sdks:
dart: ">=3.10.3 <4.0.0"
flutter: ">=3.38.4"
flutter: ">=3.38.4"