mirror of
https://github.com/zjs81/meshcore-open.git
synced 2026-08-02 08:35:55 +10:00
feat: add contact UI helpers and path editor for routing management
- Implemented contactTypeIcon and contactTypeColor functions for better UI representation of contact types. - Created colorForName and firstCharacterOrEmoji functions to enhance contact display. - Developed PathEditorSheet widget for managing contact paths with a user-friendly interface. - Introduced RoutingSheet for managing contact routing modes and displaying path history. - Added a script for generating proof of concept (PoC) payloads for clipboard contact import validation.
This commit is contained in:
+177
-140
@@ -92,6 +92,24 @@ class AppLocalizationsRu extends AppLocalizations {
|
||||
@override
|
||||
String get common_disable => 'Выключить';
|
||||
|
||||
@override
|
||||
String get common_undo => 'Undo';
|
||||
|
||||
@override
|
||||
String get messageStatus_sent => 'Sent';
|
||||
|
||||
@override
|
||||
String get messageStatus_delivered => 'Delivered';
|
||||
|
||||
@override
|
||||
String get messageStatus_pending => 'Sending';
|
||||
|
||||
@override
|
||||
String get messageStatus_failed => 'Failed to send';
|
||||
|
||||
@override
|
||||
String get messageStatus_repeated => 'Heard repeated';
|
||||
|
||||
@override
|
||||
String get common_reboot => 'Перезагрузить';
|
||||
|
||||
@@ -795,11 +813,6 @@ class AppLocalizationsRu extends AppLocalizations {
|
||||
String get appSettings_maxMessageRetriesSubtitle =>
|
||||
'Количество попыток повторной отправки сообщения перед тем, как пометить его как неудачное.';
|
||||
|
||||
@override
|
||||
String path_routeWeight(String weight, String max) {
|
||||
return '$weight/$max';
|
||||
}
|
||||
|
||||
@override
|
||||
String get appSettings_battery => 'Батарея';
|
||||
|
||||
@@ -1000,6 +1013,15 @@ class AppLocalizationsRu extends AppLocalizations {
|
||||
@override
|
||||
String get contacts_newGroup => 'Новая группа';
|
||||
|
||||
@override
|
||||
String get contacts_moreOptions => 'More options';
|
||||
|
||||
@override
|
||||
String get contacts_searchOpen => 'Search contacts';
|
||||
|
||||
@override
|
||||
String get contacts_searchClose => 'Close search';
|
||||
|
||||
@override
|
||||
String get contacts_groupName => 'Имя группы';
|
||||
|
||||
@@ -1479,35 +1501,6 @@ class AppLocalizationsRu extends AppLocalizations {
|
||||
@override
|
||||
String get debugFrame_hexDump => 'Шестнадцатеричный дамп:';
|
||||
|
||||
@override
|
||||
String get chat_pathManagement => 'Управление маршрутами';
|
||||
|
||||
@override
|
||||
String get chat_ShowAllPaths => 'Показать все пути';
|
||||
|
||||
@override
|
||||
String get chat_routingMode => 'Режим маршрутизации';
|
||||
|
||||
@override
|
||||
String get chat_autoUseSavedPath => 'Авто (использовать сохранённый маршрут)';
|
||||
|
||||
@override
|
||||
String get chat_forceFloodMode => 'Принудительный режим рассылки';
|
||||
|
||||
@override
|
||||
String get chat_recentAckPaths =>
|
||||
'Недавние подтверждённые маршруты (нажмите, чтобы использовать):';
|
||||
|
||||
@override
|
||||
String get chat_pathHistoryFull =>
|
||||
'История маршрутов заполнена. Удалите записи, чтобы добавить новые.';
|
||||
|
||||
@override
|
||||
String get chat_hopSingular => 'хоп';
|
||||
|
||||
@override
|
||||
String get chat_hopPlural => 'хопов';
|
||||
|
||||
@override
|
||||
String chat_hopsCount(int count) {
|
||||
String _temp0 = intl.Intl.pluralLogic(
|
||||
@@ -1521,12 +1514,6 @@ class AppLocalizationsRu extends AppLocalizations {
|
||||
return '$count $_temp0';
|
||||
}
|
||||
|
||||
@override
|
||||
String get chat_successes => 'успешно';
|
||||
|
||||
@override
|
||||
String get chat_score => 'Оценка';
|
||||
|
||||
@override
|
||||
String get chat_removePath => 'Удалить маршрут';
|
||||
|
||||
@@ -1534,54 +1521,144 @@ class AppLocalizationsRu extends AppLocalizations {
|
||||
String get chat_noPathHistoryYet =>
|
||||
'История маршрутов пока пуста.\nОтправьте сообщение, чтобы обнаружить маршруты.';
|
||||
|
||||
@override
|
||||
String get chat_pathActions => 'Действия с маршрутом:';
|
||||
|
||||
@override
|
||||
String get chat_setCustomPath => 'Указать маршрут вручную';
|
||||
|
||||
@override
|
||||
String get chat_setCustomPathSubtitle => 'Вручную задать маршрут передачи';
|
||||
|
||||
@override
|
||||
String get chat_clearPath => 'Очистить маршрут';
|
||||
|
||||
@override
|
||||
String get chat_clearPathSubtitle =>
|
||||
'Принудительно обновить маршрут при следующей отправке';
|
||||
|
||||
@override
|
||||
String get chat_pathCleared =>
|
||||
'Маршрут очищен. Следующее сообщение обновит маршрут.';
|
||||
|
||||
@override
|
||||
String get chat_floodModeSubtitle =>
|
||||
'Используйте переключатель маршрутизации в панели приложения';
|
||||
|
||||
@override
|
||||
String get chat_floodModeEnabled =>
|
||||
'Режим рассылки включён. Отключите через значок маршрутизации в панели приложения.';
|
||||
|
||||
@override
|
||||
String get chat_fullPath => 'Полный маршрут';
|
||||
|
||||
@override
|
||||
String get chat_pathDetailsNotAvailable =>
|
||||
'Детали маршрута ещё недоступны. Попробуйте отправить сообщение для обновления.';
|
||||
String get routing_title => 'Routing';
|
||||
|
||||
@override
|
||||
String chat_pathSetHops(int hopCount, String status) {
|
||||
String _temp0 = intl.Intl.pluralLogic(
|
||||
hopCount,
|
||||
locale: localeName,
|
||||
other: 'хопов',
|
||||
many: 'хопов',
|
||||
few: 'хопа',
|
||||
one: 'хоп',
|
||||
);
|
||||
return 'Маршрут установлен: $hopCount $_temp0 — $status';
|
||||
String get routing_modeAuto => 'Auto';
|
||||
|
||||
@override
|
||||
String get routing_modeFlood => 'Flood';
|
||||
|
||||
@override
|
||||
String get routing_modeManual => 'Manual';
|
||||
|
||||
@override
|
||||
String get routing_modeAutoHint =>
|
||||
'Picks the best known path automatically, flooding when none is known.';
|
||||
|
||||
@override
|
||||
String get routing_modeFloodHint =>
|
||||
'Broadcasts through every repeater. Most reliable, but uses more airtime.';
|
||||
|
||||
@override
|
||||
String get routing_modeManualHint =>
|
||||
'Always sends along the exact path you set.';
|
||||
|
||||
@override
|
||||
String get routing_currentRoute => 'Current route';
|
||||
|
||||
@override
|
||||
String get routing_directNoHops => 'Direct — no repeater hops';
|
||||
|
||||
@override
|
||||
String get routing_noPathYet =>
|
||||
'No path yet. The next message floods until a route is discovered.';
|
||||
|
||||
@override
|
||||
String get routing_floodBroadcast => 'Broadcast through every repeater';
|
||||
|
||||
@override
|
||||
String get routing_editPath => 'Edit path';
|
||||
|
||||
@override
|
||||
String get routing_forgetPath => 'Forget path';
|
||||
|
||||
@override
|
||||
String get routing_knownPaths => 'Known paths';
|
||||
|
||||
@override
|
||||
String get routing_knownPathsHint => 'Tap a path to switch to it.';
|
||||
|
||||
@override
|
||||
String get routing_inUse => 'In use';
|
||||
|
||||
@override
|
||||
String get routing_qualityStrong => 'Strong first hop';
|
||||
|
||||
@override
|
||||
String get routing_qualityGood => 'Good first hop';
|
||||
|
||||
@override
|
||||
String get routing_qualityFair => 'Fair first hop';
|
||||
|
||||
@override
|
||||
String get routing_qualityWorked => 'Has delivered';
|
||||
|
||||
@override
|
||||
String get routing_qualityFlood => 'Heard via flood';
|
||||
|
||||
@override
|
||||
String get routing_qualityUntested => 'Untested';
|
||||
|
||||
@override
|
||||
String routing_lastWorked(String when) {
|
||||
return 'worked $when';
|
||||
}
|
||||
|
||||
@override
|
||||
String get routing_neverWorked => 'never confirmed';
|
||||
|
||||
@override
|
||||
String routing_deliveryCounts(int successes, int failures) {
|
||||
return '$successes delivered, $failures failed';
|
||||
}
|
||||
|
||||
@override
|
||||
String get routing_floodDelivery => 'Flood delivery';
|
||||
|
||||
@override
|
||||
String get pathEditor_title => 'Build Path';
|
||||
|
||||
@override
|
||||
String pathEditor_hopCounter(int count) {
|
||||
return '$count of 64 hops';
|
||||
}
|
||||
|
||||
@override
|
||||
String get pathEditor_noHops =>
|
||||
'No hops yet. Tap repeaters below to add them in order, or save with no hops to send direct.';
|
||||
|
||||
@override
|
||||
String get pathEditor_addHops => 'Add hops in order';
|
||||
|
||||
@override
|
||||
String get pathEditor_searchRepeaters => 'Search repeaters';
|
||||
|
||||
@override
|
||||
String get pathEditor_advancedHex => 'Advanced: raw hex path';
|
||||
|
||||
@override
|
||||
String get pathEditor_hexLabel => 'Hex prefixes';
|
||||
|
||||
@override
|
||||
String get pathEditor_hexHelper =>
|
||||
'Two hex characters per hop, separated by commas';
|
||||
|
||||
@override
|
||||
String pathEditor_invalidTokens(String tokens) {
|
||||
return 'Invalid: $tokens';
|
||||
}
|
||||
|
||||
@override
|
||||
String get pathEditor_tooManyHops => 'Maximum 64 hops';
|
||||
|
||||
@override
|
||||
String get pathEditor_usePath => 'Use this path';
|
||||
|
||||
@override
|
||||
String get pathEditor_removeHop => 'Remove hop';
|
||||
|
||||
@override
|
||||
String get pathEditor_unknownHop => 'Unknown repeater';
|
||||
|
||||
@override
|
||||
String get chat_pathSavedLocally =>
|
||||
'Сохранено локально. Подключитесь для синхронизации.';
|
||||
@@ -2049,66 +2126,12 @@ class AppLocalizationsRu extends AppLocalizations {
|
||||
@override
|
||||
String get common_clear => 'Очистить';
|
||||
|
||||
@override
|
||||
String path_currentPath(String path) {
|
||||
return 'Текущий маршрут: $path';
|
||||
}
|
||||
|
||||
@override
|
||||
String path_usingHopsPath(int count) {
|
||||
String _temp0 = intl.Intl.pluralLogic(
|
||||
count,
|
||||
locale: localeName,
|
||||
other: 'хопов',
|
||||
many: 'хопов',
|
||||
few: 'хопа',
|
||||
one: 'хоп',
|
||||
);
|
||||
return 'Используется маршрут из $count $_temp0';
|
||||
}
|
||||
|
||||
@override
|
||||
String get path_enterCustomPath => 'Введите маршрут вручную';
|
||||
|
||||
@override
|
||||
String get path_currentPathLabel => 'Текущий маршрут';
|
||||
|
||||
@override
|
||||
String get path_hexPrefixInstructions =>
|
||||
'Введите 2-символьные шестнадцатеричные префиксы для каждого хопа, разделённые запятыми.';
|
||||
|
||||
@override
|
||||
String get path_hexPrefixExample =>
|
||||
'Пример: A1,F2,3C (каждый узел использует первый байт своего публичного ключа)';
|
||||
|
||||
@override
|
||||
String get path_labelHexPrefixes => 'Маршрут (шестнадцатеричные префиксы)';
|
||||
|
||||
@override
|
||||
String get path_helperMaxHops =>
|
||||
'Максимум 64 хопа. Каждый префикс — 2 шестнадцатеричных символа (1 байт)';
|
||||
|
||||
@override
|
||||
String get path_selectFromContacts => 'Или выберите из контактов:';
|
||||
|
||||
@override
|
||||
String get path_noRepeatersFound => 'Репитеры или серверы комнат не найдены.';
|
||||
|
||||
@override
|
||||
String get path_customPathsRequire =>
|
||||
'Пользовательские маршруты требуют промежуточных узлов, способных ретранслировать сообщения.';
|
||||
|
||||
@override
|
||||
String path_invalidHexPrefixes(String prefixes) {
|
||||
return 'Недопустимые шестнадцатеричные префиксы: $prefixes';
|
||||
}
|
||||
|
||||
@override
|
||||
String get path_tooLong => 'Маршрут слишком длинный. Максимум 64 хопа.';
|
||||
|
||||
@override
|
||||
String get path_setPath => 'Установить маршрут';
|
||||
|
||||
@override
|
||||
String get repeater_management => 'Управление репитером';
|
||||
|
||||
@@ -2173,16 +2196,6 @@ class AppLocalizationsRu extends AppLocalizations {
|
||||
@override
|
||||
String get repeater_routingMode => 'Режим маршрутизации';
|
||||
|
||||
@override
|
||||
String get repeater_autoUseSavedPath =>
|
||||
'Авто (использовать сохранённый маршрут)';
|
||||
|
||||
@override
|
||||
String get repeater_forceFloodMode => 'Принудительный режим рассылки';
|
||||
|
||||
@override
|
||||
String get repeater_pathManagement => 'Управление маршрутами';
|
||||
|
||||
@override
|
||||
String get repeater_refresh => 'Обновить';
|
||||
|
||||
@@ -4453,4 +4466,28 @@ class AppLocalizationsRu extends AppLocalizations {
|
||||
|
||||
@override
|
||||
String get contact_typeUnknown => 'Неизвестно';
|
||||
|
||||
@override
|
||||
String get map_zoomIn => 'Zoom in';
|
||||
|
||||
@override
|
||||
String get map_zoomOut => 'Zoom out';
|
||||
|
||||
@override
|
||||
String get map_centerMap => 'Center map';
|
||||
|
||||
@override
|
||||
String get chrome_bluetoothRequiresChromium =>
|
||||
'Web Bluetooth requires a Chromium browser';
|
||||
|
||||
@override
|
||||
String channels_communityShortId(String id) {
|
||||
return 'ID: $id...';
|
||||
}
|
||||
|
||||
@override
|
||||
String get pathTrace_legendGpsConfirmed => 'GPS confirmed';
|
||||
|
||||
@override
|
||||
String get pathTrace_legendInferred => 'Inferred position';
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user