2022-06-27 08:30:49 -07:00
//
// U s e r . s w i f t
// M e s h t a s t i c A p p l e
//
// C o p y r i g h t ( c ) G a r t h V a n d e r H o u w e n 6 / 2 7 / 2 2 .
//
2023-02-09 22:59:39 -08:00
import CoreData
2024-06-07 22:09:20 -05:00
import MeshtasticProtobufs
import SwiftUI
2022-06-27 08:30:49 -07:00
struct UserConfig : View {
2025-10-05 17:51:18 -07:00
2022-06-27 08:30:49 -07:00
@ Environment ( \ . managedObjectContext ) var context
Transports Interface to Support TCP for all Platforms and Serial on Mac (#1341)
* Initial implementation of transports
* Initial LogRadio implementation
* Fixes for Settings view (caused by debug commenting)
* Refinement of the object and actor model
* Connect view text and tab updates
* Fix mac catalyst and tests
* Warning and logging clean-up
* In progress commit
* Serial Transport and Reconnect draft work
* Serial transport and reconnection draft work
* Quick fix for BLE - still more work to do
* interim commit
* More in progress changes
* Minor improvements
* Pretty good initial implementation
* Bump version beyond the app store
* Fix for disconnection swipeAction
* Tweaks to TCPConnection implementation
* Retry for NONCE_ONLY_DB
* Revert json string change
* Simplified some of the API + "Anti-discovery"
* Tweaks for devices leaving the discovery process
* Bump version
* iOS26 Tweaks
* Tweaks and bug fixes
* Add link with slash sf symbol
* update symbol image on connect view
* BLE disconnect handling
* Log privacy attributes
* Onboarding and minor fixes.
* change database to nodes, add emoji to tcp logs
* Error handling improvements
* More logging emojis
* Suppressed unnecessary errors on disconnect
* Heartbeat emoji
* Add bluetooth symbol
* add privacy attributes to [TCP] logs, add custom bluetooth logo
* Improve routing logs
* Emoji for connect logs
* Heartbeat emoji
* Add CBCentralManagerScanOptionAllowDuplicatesKey options to central for bluetooth
* fix nav errors by switching from observableobject to state
* Update connection indicator icon
* fix for BLE disconnects
* Connection process fixes
* More fixes/tweaks to connection process
* Strict concurrency
* Fix some warnings, remove wifi warning
* delete stale keys
* interim commit
* Update privacy for log, fix wrong space
* fix a couple of linting items
* Switch to targeted
* interim commit
* BLE Signal strenth on connect view
* Remove BLE RSSI from long press menu
* Modem lights
* minor spacing tweak
* Additional BLE logging and a scanning fix.
* Discovery and BLE RSSI improvements
* Background suspension
* Update isConnected to enable UI during db load
* update protobufs
* Replace config if statements with switches, Fix unknown module config logging, make dark mode modem circle stroke color white so they are visible
* Additional logging cleanup
* hast
* Set unmessagable to true if the longname has the unmessagable emoji
* Connect error handling improvements
* Admin popup list icon and activity lights updates
* Revert use of .toolbar back to .navigationBarItems
* More public logging
* Better BLE error handling
* Node DB progress meter
* minor tweak to activity light interaction timing
* Fix comment linting, remove stale keys
* Remove stale keys
* Easy linting fixes
* Two more simple linting fixes
* clean up meshtasticapp
* More public logging
* Replay config
* Logging
* Fix for unselected node on Settings
* Tweak to progress meter based on device idiom
* Update protos
* Session replay redaction of messages
* Serial fix for old devices, and a let statement
* Mask text too
* Fix typo
* BLE poweredOff is now an auto-reconnectable error
* Update logging
* Fix for peerRemovedPairingInformation
* Logging for BLE peripheral:didUpdateValueFor errors.
* Fix for inconsistent swipe disconnect behavior
* periperal:didUpdateValueFor error handling
* Fix for BLEConnection continuation guarding
* BLEConnection actor deadlock on disconnect
* Heartbeat nonce
* Fix for swipe disconnect and task cancellation
* Fix for swipe actions not honoring .disabled()
* Tell BLETransport when BLEConnection is cancelled
* Update navigation logging
* Logging updates
* Bump version to 2.7.0
* Organize into folders and heartbeat stuff
* Minor improvements to manual TCP connection
* Auto-connect toggle
* Possible BLE bug, still waiting to see in logs
* Concurrency tweaks
* Concurrency improvements
* requestDeviceMetadata fix. fixes remote admin
* Minor typo fixes
* "All" button for log filters: category and level
* More robust continuation handling for BLE
* @FetchRequest based ChannelMessageList
* Update info.plist and device hardware file
* Move auto connect toggle to app settings and debug mode, tint properly with the accent color
* Add label to auto connect toggle
* Update log for node info received from ourselves over the mesh
* Remove unused scrollViewProxy
* Update Meshtastic/Views/Onboarding/DeviceOnboarding.swift
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
* Update target for connect view
* Properly Set datadog environment
* Comment out ble manager
* Adjust cyclomatic complexity thresholds in .swiftlint.yml
* Linting fixes, delete ble manager
* Make session replay debug only
---------
Co-authored-by: jake-b <jake-b@users.noreply.github.com>
Co-authored-by: jake <jake@jakes-Mac-mini.local>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2025-08-27 08:09:02 -07:00
@ EnvironmentObject var accessoryManager : AccessoryManager
2022-12-09 18:19:00 -08:00
@ Environment ( \ . dismiss ) private var goBack
2025-10-05 17:51:18 -07:00
2022-07-07 00:29:52 -07:00
var node : NodeInfoEntity ?
2025-10-05 17:51:18 -07:00
2023-02-09 22:59:39 -08:00
enum Field : Hashable {
case frequencyOverride
}
2025-10-05 17:51:18 -07:00
2022-06-27 08:30:49 -07:00
@ State private var isPresentingFactoryResetConfirm : Bool = false
@ State private var isPresentingSaveConfirm : Bool = false
@ State var hasChanges = false
@ State var shortName = " "
2023-10-20 17:26:04 -07:00
@ State var longName : String = " "
2025-05-23 20:32:56 -07:00
@ State var isUnmessagable : Bool = false
2023-02-04 20:44:24 -08:00
@ State var isLicensed = false
2023-02-08 09:42:07 -08:00
@ State var overrideDutyCycle = false
2023-02-09 22:59:39 -08:00
@ State var overrideFrequency : Float = 0.0
2023-02-08 09:42:07 -08:00
@ State var txPower = 0
2023-02-09 22:59:39 -08:00
@ FocusState var focusedField : Field ?
2025-10-05 17:51:18 -07:00
2025-05-25 08:27:35 -07:00
public var minimumVersion = " 2.6.9 "
2023-02-09 22:59:39 -08:00
let floatFormatter : NumberFormatter = {
let formatter = NumberFormatter ( )
formatter . numberStyle = . decimal
return formatter
} ( )
2025-10-05 17:51:18 -07:00
2022-06-27 08:30:49 -07:00
var body : some View {
2025-10-05 17:51:18 -07:00
Form {
Section ( header : Text ( " User Details " ) ) {
VStack ( alignment : . leading ) {
HStack {
Label ( isLicensed ? " Call Sign " : " Long Name " , systemImage : " person.crop.rectangle.fill " )
TextField ( " Long Name " , text : $ longName )
. onChange ( of : longName ) {
var newValue = longName . withoutVariationSelectors
var totalBytes = newValue . utf8 . count
// O n l y m e s s w i t h t h e v a l u e i f i t i s t o o b i g
while totalBytes > ( isLicensed ? 6 : 36 ) {
newValue = String ( newValue . dropLast ( ) )
totalBytes = newValue . utf8 . count
2024-10-05 15:50:57 -07:00
}
2025-10-05 17:51:18 -07:00
longName = newValue
if longName . contains ( " 📵 " ) {
isUnmessagable = true
}
}
2024-02-21 20:41:27 -08:00
}
2025-10-05 17:51:18 -07:00
. keyboardType ( . default )
. disableAutocorrection ( true )
if longName . isEmpty && isLicensed {
Label ( " Call Sign must not be empty " , systemImage : " exclamationmark.square " )
. foregroundColor ( . red )
}
Text ( " \( String ( isLicensed ? " Call Sign " : " Long Name " ) ) can be up to \( isLicensed ? " 8 " : " 36 " ) bytes long. " )
. foregroundColor ( . gray )
. font ( . callout )
}
VStack ( alignment : . leading ) {
HStack {
Label ( " Short Name " , systemImage : " circlebadge.fill " )
TextField ( " Short Name " , text : $ shortName )
. foregroundColor ( . gray )
. onChange ( of : shortName ) {
let newValue = shortName . withoutVariationSelectors
let totalBytes = newValue . utf8 . count
// O n l y m e s s w i t h t h e v a l u e i f i t i s t o o b i g
if totalBytes > 4 {
// I f t o o l o n g , d r o p t h e l a s t t h i n g e n t e r e d
shortName = String ( shortName . dropLast ( ) )
} else if shortName != newValue {
// I f n o t t o o l o n g , m a k e s u r e t h e s t r i p p e d
// v a r i a n t i s p l a c e d b a c k i n t e x t f i e l d i f n e c e s s a r y
shortName = newValue
2024-10-05 15:50:57 -07:00
}
2025-10-05 17:51:18 -07:00
}
2022-06-27 08:30:49 -07:00
. foregroundColor ( . gray )
}
2025-10-05 17:51:18 -07:00
. keyboardType ( . default )
. disableAutocorrection ( true )
Text ( " The last 4 of the device MAC address will be appended to the short name to set the device's BLE Name. Short name can be up to 4 bytes long. " )
. foregroundColor ( . gray )
. font ( . callout )
let supportedVersion = accessoryManager . checkIsVersionSupported ( forVersion : minimumVersion )
Toggle ( isOn : $ isUnmessagable ) {
Label ( " Unmessagable " , systemImage : " iphone.slash " )
Text ( " Used to identify unmonitored or infrastructure nodes so that messaging is not avaliable to nodes that will never respond. " )
. font ( . caption2 )
}
. toggleStyle ( SwitchToggleStyle ( tint : . accentColor ) )
. disabled ( ! supportedVersion )
}
// O n l y m a n a g e h a m m o d e f o r t h e l o c a l l y c o n n e c t e d n o d e
if node ? . num ? ? 0 > 0 && node ? . num ? ? 0 = = accessoryManager . activeDeviceNum ? ? 0 {
Toggle ( isOn : $ isLicensed ) {
Label ( " Licensed Operator " , systemImage : " person.text.rectangle " )
}
. toggleStyle ( SwitchToggleStyle ( tint : . accentColor ) )
if isLicensed {
Text ( " Onboarding for licensed operators requires firmware 2.0.20 or greater. Make sure to refer to your local regulations and contact the local amateur frequency coordinators with questions. " )
. font ( . caption2 )
Text ( " What licensed operator mode does: \n * Sets the node name to your call sign \n * Broadcasts node info every 10 minutes \n * Overrides frequency, dutycycle and tx power \n * Disables encryption " )
. font ( . caption2 )
HStack {
Label ( " Frequency " , systemImage : " waveform.path.ecg " )
Spacer ( )
TextField ( " Frequency Override " , value : $ overrideFrequency , formatter : floatFormatter )
. toolbar {
ToolbarItemGroup ( placement : . keyboard ) {
Button ( " Dismiss " ) {
focusedField = nil
2023-02-09 22:59:39 -08:00
}
2025-10-05 17:51:18 -07:00
. font ( . subheadline )
2023-02-09 22:59:39 -08:00
}
2025-10-05 17:51:18 -07:00
}
. keyboardType ( . decimalPad )
. scrollDismissesKeyboard ( . immediately )
. focused ( $ focusedField , equals : . frequencyOverride )
}
HStack {
Image ( systemName : " antenna.radiowaves.left.and.right " )
. foregroundColor ( . accentColor )
Stepper ( " \( txPower ) db Transmit Power " , value : $ txPower , in : 1. . . 30 , step : 1 )
. padding ( 5 )
2023-02-09 22:59:39 -08:00
}
2023-02-04 20:44:24 -08:00
}
2022-06-27 08:30:49 -07:00
}
}
2025-10-05 17:51:18 -07:00
}
. disabled ( ! accessoryManager . isConnected )
. safeAreaInset ( edge : . bottom , alignment : . center ) {
HStack ( spacing : 0 ) {
if accessoryManager . isConnected && hasChanges {
Button {
isPresentingSaveConfirm = true
} label : {
Label ( " Save " , systemImage : " square.and.arrow.down " )
}
. padding ( . bottom )
. controlSize ( . large )
. buttonStyle ( . borderedProminent )
. buttonBorderShape ( . capsule )
. confirmationDialog (
" Are you sure? " ,
isPresented : $ isPresentingSaveConfirm ,
titleVisibility : . visible
) {
Button ( " Save User Config to \( node ? . user ? . longName ? ? " Unknown " ) ? " ) {
if longName . isEmpty && isLicensed {
return
}
let connectedUser = getUser ( id : accessoryManager . activeDeviceNum ? ? - 1 , context : context )
let connectedNode = getNodeInfo ( id : accessoryManager . activeDeviceNum ? ? - 1 , context : context )
if node != nil && connectedNode != nil {
if ! isLicensed {
var u = User ( )
u . shortName = shortName
u . longName = longName
u . isUnmessagable = isUnmessagable
Task {
_ = try await accessoryManager . saveUser ( config : u , fromUser : connectedUser , toUser : node ! . user ! )
Task { @ MainActor in
hasChanges = false
goBack ( )
}
Transports Interface to Support TCP for all Platforms and Serial on Mac (#1341)
* Initial implementation of transports
* Initial LogRadio implementation
* Fixes for Settings view (caused by debug commenting)
* Refinement of the object and actor model
* Connect view text and tab updates
* Fix mac catalyst and tests
* Warning and logging clean-up
* In progress commit
* Serial Transport and Reconnect draft work
* Serial transport and reconnection draft work
* Quick fix for BLE - still more work to do
* interim commit
* More in progress changes
* Minor improvements
* Pretty good initial implementation
* Bump version beyond the app store
* Fix for disconnection swipeAction
* Tweaks to TCPConnection implementation
* Retry for NONCE_ONLY_DB
* Revert json string change
* Simplified some of the API + "Anti-discovery"
* Tweaks for devices leaving the discovery process
* Bump version
* iOS26 Tweaks
* Tweaks and bug fixes
* Add link with slash sf symbol
* update symbol image on connect view
* BLE disconnect handling
* Log privacy attributes
* Onboarding and minor fixes.
* change database to nodes, add emoji to tcp logs
* Error handling improvements
* More logging emojis
* Suppressed unnecessary errors on disconnect
* Heartbeat emoji
* Add bluetooth symbol
* add privacy attributes to [TCP] logs, add custom bluetooth logo
* Improve routing logs
* Emoji for connect logs
* Heartbeat emoji
* Add CBCentralManagerScanOptionAllowDuplicatesKey options to central for bluetooth
* fix nav errors by switching from observableobject to state
* Update connection indicator icon
* fix for BLE disconnects
* Connection process fixes
* More fixes/tweaks to connection process
* Strict concurrency
* Fix some warnings, remove wifi warning
* delete stale keys
* interim commit
* Update privacy for log, fix wrong space
* fix a couple of linting items
* Switch to targeted
* interim commit
* BLE Signal strenth on connect view
* Remove BLE RSSI from long press menu
* Modem lights
* minor spacing tweak
* Additional BLE logging and a scanning fix.
* Discovery and BLE RSSI improvements
* Background suspension
* Update isConnected to enable UI during db load
* update protobufs
* Replace config if statements with switches, Fix unknown module config logging, make dark mode modem circle stroke color white so they are visible
* Additional logging cleanup
* hast
* Set unmessagable to true if the longname has the unmessagable emoji
* Connect error handling improvements
* Admin popup list icon and activity lights updates
* Revert use of .toolbar back to .navigationBarItems
* More public logging
* Better BLE error handling
* Node DB progress meter
* minor tweak to activity light interaction timing
* Fix comment linting, remove stale keys
* Remove stale keys
* Easy linting fixes
* Two more simple linting fixes
* clean up meshtasticapp
* More public logging
* Replay config
* Logging
* Fix for unselected node on Settings
* Tweak to progress meter based on device idiom
* Update protos
* Session replay redaction of messages
* Serial fix for old devices, and a let statement
* Mask text too
* Fix typo
* BLE poweredOff is now an auto-reconnectable error
* Update logging
* Fix for peerRemovedPairingInformation
* Logging for BLE peripheral:didUpdateValueFor errors.
* Fix for inconsistent swipe disconnect behavior
* periperal:didUpdateValueFor error handling
* Fix for BLEConnection continuation guarding
* BLEConnection actor deadlock on disconnect
* Heartbeat nonce
* Fix for swipe disconnect and task cancellation
* Fix for swipe actions not honoring .disabled()
* Tell BLETransport when BLEConnection is cancelled
* Update navigation logging
* Logging updates
* Bump version to 2.7.0
* Organize into folders and heartbeat stuff
* Minor improvements to manual TCP connection
* Auto-connect toggle
* Possible BLE bug, still waiting to see in logs
* Concurrency tweaks
* Concurrency improvements
* requestDeviceMetadata fix. fixes remote admin
* Minor typo fixes
* "All" button for log filters: category and level
* More robust continuation handling for BLE
* @FetchRequest based ChannelMessageList
* Update info.plist and device hardware file
* Move auto connect toggle to app settings and debug mode, tint properly with the accent color
* Add label to auto connect toggle
* Update log for node info received from ourselves over the mesh
* Remove unused scrollViewProxy
* Update Meshtastic/Views/Onboarding/DeviceOnboarding.swift
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
* Update target for connect view
* Properly Set datadog environment
* Comment out ble manager
* Adjust cyclomatic complexity thresholds in .swiftlint.yml
* Linting fixes, delete ble manager
* Make session replay debug only
---------
Co-authored-by: jake-b <jake-b@users.noreply.github.com>
Co-authored-by: jake <jake@jakes-Mac-mini.local>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2025-08-27 08:09:02 -07:00
}
2025-10-05 17:51:18 -07:00
} else {
var ham = HamParameters ( )
ham . shortName = shortName
// h a m . i s U n m e s s a g a b l e = i s U n m e s s a g a b l e
ham . callSign = longName
ham . txPower = Int32 ( txPower )
ham . frequency = overrideFrequency
Task {
_ = try await accessoryManager . saveLicensedUser ( ham : ham , fromUser : connectedUser , toUser : node ! . user ! )
Task { @ MainActor in
hasChanges = false
goBack ( )
}
Transports Interface to Support TCP for all Platforms and Serial on Mac (#1341)
* Initial implementation of transports
* Initial LogRadio implementation
* Fixes for Settings view (caused by debug commenting)
* Refinement of the object and actor model
* Connect view text and tab updates
* Fix mac catalyst and tests
* Warning and logging clean-up
* In progress commit
* Serial Transport and Reconnect draft work
* Serial transport and reconnection draft work
* Quick fix for BLE - still more work to do
* interim commit
* More in progress changes
* Minor improvements
* Pretty good initial implementation
* Bump version beyond the app store
* Fix for disconnection swipeAction
* Tweaks to TCPConnection implementation
* Retry for NONCE_ONLY_DB
* Revert json string change
* Simplified some of the API + "Anti-discovery"
* Tweaks for devices leaving the discovery process
* Bump version
* iOS26 Tweaks
* Tweaks and bug fixes
* Add link with slash sf symbol
* update symbol image on connect view
* BLE disconnect handling
* Log privacy attributes
* Onboarding and minor fixes.
* change database to nodes, add emoji to tcp logs
* Error handling improvements
* More logging emojis
* Suppressed unnecessary errors on disconnect
* Heartbeat emoji
* Add bluetooth symbol
* add privacy attributes to [TCP] logs, add custom bluetooth logo
* Improve routing logs
* Emoji for connect logs
* Heartbeat emoji
* Add CBCentralManagerScanOptionAllowDuplicatesKey options to central for bluetooth
* fix nav errors by switching from observableobject to state
* Update connection indicator icon
* fix for BLE disconnects
* Connection process fixes
* More fixes/tweaks to connection process
* Strict concurrency
* Fix some warnings, remove wifi warning
* delete stale keys
* interim commit
* Update privacy for log, fix wrong space
* fix a couple of linting items
* Switch to targeted
* interim commit
* BLE Signal strenth on connect view
* Remove BLE RSSI from long press menu
* Modem lights
* minor spacing tweak
* Additional BLE logging and a scanning fix.
* Discovery and BLE RSSI improvements
* Background suspension
* Update isConnected to enable UI during db load
* update protobufs
* Replace config if statements with switches, Fix unknown module config logging, make dark mode modem circle stroke color white so they are visible
* Additional logging cleanup
* hast
* Set unmessagable to true if the longname has the unmessagable emoji
* Connect error handling improvements
* Admin popup list icon and activity lights updates
* Revert use of .toolbar back to .navigationBarItems
* More public logging
* Better BLE error handling
* Node DB progress meter
* minor tweak to activity light interaction timing
* Fix comment linting, remove stale keys
* Remove stale keys
* Easy linting fixes
* Two more simple linting fixes
* clean up meshtasticapp
* More public logging
* Replay config
* Logging
* Fix for unselected node on Settings
* Tweak to progress meter based on device idiom
* Update protos
* Session replay redaction of messages
* Serial fix for old devices, and a let statement
* Mask text too
* Fix typo
* BLE poweredOff is now an auto-reconnectable error
* Update logging
* Fix for peerRemovedPairingInformation
* Logging for BLE peripheral:didUpdateValueFor errors.
* Fix for inconsistent swipe disconnect behavior
* periperal:didUpdateValueFor error handling
* Fix for BLEConnection continuation guarding
* BLEConnection actor deadlock on disconnect
* Heartbeat nonce
* Fix for swipe disconnect and task cancellation
* Fix for swipe actions not honoring .disabled()
* Tell BLETransport when BLEConnection is cancelled
* Update navigation logging
* Logging updates
* Bump version to 2.7.0
* Organize into folders and heartbeat stuff
* Minor improvements to manual TCP connection
* Auto-connect toggle
* Possible BLE bug, still waiting to see in logs
* Concurrency tweaks
* Concurrency improvements
* requestDeviceMetadata fix. fixes remote admin
* Minor typo fixes
* "All" button for log filters: category and level
* More robust continuation handling for BLE
* @FetchRequest based ChannelMessageList
* Update info.plist and device hardware file
* Move auto connect toggle to app settings and debug mode, tint properly with the accent color
* Add label to auto connect toggle
* Update log for node info received from ourselves over the mesh
* Remove unused scrollViewProxy
* Update Meshtastic/Views/Onboarding/DeviceOnboarding.swift
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
* Update target for connect view
* Properly Set datadog environment
* Comment out ble manager
* Adjust cyclomatic complexity thresholds in .swiftlint.yml
* Linting fixes, delete ble manager
* Make session replay debug only
---------
Co-authored-by: jake-b <jake-b@users.noreply.github.com>
Co-authored-by: jake <jake@jakes-Mac-mini.local>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2025-08-27 08:09:02 -07:00
}
2023-02-09 22:59:39 -08:00
}
2023-02-06 18:45:03 -08:00
}
2022-06-27 08:30:49 -07:00
}
2025-10-05 17:51:18 -07:00
} message : {
Text ( " After config values save the node will reboot. " )
2022-06-27 08:30:49 -07:00
}
}
}
}
. navigationTitle ( " User Config " )
. navigationBarItems ( trailing :
2023-02-09 22:59:39 -08:00
ZStack {
Transports Interface to Support TCP for all Platforms and Serial on Mac (#1341)
* Initial implementation of transports
* Initial LogRadio implementation
* Fixes for Settings view (caused by debug commenting)
* Refinement of the object and actor model
* Connect view text and tab updates
* Fix mac catalyst and tests
* Warning and logging clean-up
* In progress commit
* Serial Transport and Reconnect draft work
* Serial transport and reconnection draft work
* Quick fix for BLE - still more work to do
* interim commit
* More in progress changes
* Minor improvements
* Pretty good initial implementation
* Bump version beyond the app store
* Fix for disconnection swipeAction
* Tweaks to TCPConnection implementation
* Retry for NONCE_ONLY_DB
* Revert json string change
* Simplified some of the API + "Anti-discovery"
* Tweaks for devices leaving the discovery process
* Bump version
* iOS26 Tweaks
* Tweaks and bug fixes
* Add link with slash sf symbol
* update symbol image on connect view
* BLE disconnect handling
* Log privacy attributes
* Onboarding and minor fixes.
* change database to nodes, add emoji to tcp logs
* Error handling improvements
* More logging emojis
* Suppressed unnecessary errors on disconnect
* Heartbeat emoji
* Add bluetooth symbol
* add privacy attributes to [TCP] logs, add custom bluetooth logo
* Improve routing logs
* Emoji for connect logs
* Heartbeat emoji
* Add CBCentralManagerScanOptionAllowDuplicatesKey options to central for bluetooth
* fix nav errors by switching from observableobject to state
* Update connection indicator icon
* fix for BLE disconnects
* Connection process fixes
* More fixes/tweaks to connection process
* Strict concurrency
* Fix some warnings, remove wifi warning
* delete stale keys
* interim commit
* Update privacy for log, fix wrong space
* fix a couple of linting items
* Switch to targeted
* interim commit
* BLE Signal strenth on connect view
* Remove BLE RSSI from long press menu
* Modem lights
* minor spacing tweak
* Additional BLE logging and a scanning fix.
* Discovery and BLE RSSI improvements
* Background suspension
* Update isConnected to enable UI during db load
* update protobufs
* Replace config if statements with switches, Fix unknown module config logging, make dark mode modem circle stroke color white so they are visible
* Additional logging cleanup
* hast
* Set unmessagable to true if the longname has the unmessagable emoji
* Connect error handling improvements
* Admin popup list icon and activity lights updates
* Revert use of .toolbar back to .navigationBarItems
* More public logging
* Better BLE error handling
* Node DB progress meter
* minor tweak to activity light interaction timing
* Fix comment linting, remove stale keys
* Remove stale keys
* Easy linting fixes
* Two more simple linting fixes
* clean up meshtasticapp
* More public logging
* Replay config
* Logging
* Fix for unselected node on Settings
* Tweak to progress meter based on device idiom
* Update protos
* Session replay redaction of messages
* Serial fix for old devices, and a let statement
* Mask text too
* Fix typo
* BLE poweredOff is now an auto-reconnectable error
* Update logging
* Fix for peerRemovedPairingInformation
* Logging for BLE peripheral:didUpdateValueFor errors.
* Fix for inconsistent swipe disconnect behavior
* periperal:didUpdateValueFor error handling
* Fix for BLEConnection continuation guarding
* BLEConnection actor deadlock on disconnect
* Heartbeat nonce
* Fix for swipe disconnect and task cancellation
* Fix for swipe actions not honoring .disabled()
* Tell BLETransport when BLEConnection is cancelled
* Update navigation logging
* Logging updates
* Bump version to 2.7.0
* Organize into folders and heartbeat stuff
* Minor improvements to manual TCP connection
* Auto-connect toggle
* Possible BLE bug, still waiting to see in logs
* Concurrency tweaks
* Concurrency improvements
* requestDeviceMetadata fix. fixes remote admin
* Minor typo fixes
* "All" button for log filters: category and level
* More robust continuation handling for BLE
* @FetchRequest based ChannelMessageList
* Update info.plist and device hardware file
* Move auto connect toggle to app settings and debug mode, tint properly with the accent color
* Add label to auto connect toggle
* Update log for node info received from ourselves over the mesh
* Remove unused scrollViewProxy
* Update Meshtastic/Views/Onboarding/DeviceOnboarding.swift
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
* Update target for connect view
* Properly Set datadog environment
* Comment out ble manager
* Adjust cyclomatic complexity thresholds in .swiftlint.yml
* Linting fixes, delete ble manager
* Make session replay debug only
---------
Co-authored-by: jake-b <jake-b@users.noreply.github.com>
Co-authored-by: jake <jake@jakes-Mac-mini.local>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2025-08-27 08:09:02 -07:00
ConnectedDevice ( deviceConnected : accessoryManager . isConnected , name : accessoryManager . activeConnection ? . device . shortName ? ? " ? " )
2022-06-27 08:30:49 -07:00
} )
. onAppear {
2023-02-09 22:59:39 -08:00
self . shortName = node ? . user ? . shortName ? ? " "
self . longName = node ? . user ? . longName ? ? " "
2025-05-23 20:32:56 -07:00
self . isUnmessagable = node ? . user ? . unmessagable ? ? false
2023-02-09 22:59:39 -08:00
self . isLicensed = node ? . user ? . isLicensed ? ? false
self . txPower = Int ( node ? . loRaConfig ? . txPower ? ? 0 )
self . overrideFrequency = node ? . loRaConfig ? . overrideFrequency ? ? 0.00
2022-11-12 08:48:01 -08:00
self . hasChanges = false
2022-06-27 08:30:49 -07:00
}
2025-07-21 18:11:13 -07:00
. onChange ( of : shortName ) { oldShort , newShort in
if oldShort != newShort && newShort != node ? . user ? . shortName ? ? " Unknown " { hasChanges = true }
2022-06-27 08:30:49 -07:00
}
2025-07-21 18:11:13 -07:00
. onChange ( of : longName ) { oldLong , newLong in
if oldLong != newLong && newLong != node ? . user ? . longName ? ? " Unknown " { hasChanges = true }
2022-06-27 08:30:49 -07:00
}
2025-07-28 17:13:55 -07:00
. onChange ( of : isUnmessagable ) { oldIsUnmessagable , newIsUnmessagable in
if oldIsUnmessagable != newIsUnmessagable && newIsUnmessagable != node ? . user ? . unmessagable ? ? true { hasChanges = true }
}
2024-10-05 15:50:57 -07:00
. onChange ( of : isLicensed ) { _ , newIsLicensed in
2023-02-09 22:59:39 -08:00
if node != nil && node ! . user != nil {
2023-10-20 17:26:04 -07:00
if newIsLicensed != node ? . user ! . isLicensed {
hasChanges = true
if newIsLicensed {
if node ? . user ? . longName ? . count ? ? 0 > 8 {
longName = " "
}
}
}
2023-02-08 09:42:07 -08:00
}
}
2024-10-05 15:50:57 -07:00
. onChange ( of : overrideFrequency ) {
2025-07-21 18:11:13 -07:00
if isLicensed { hasChanges = true }
2023-02-09 22:59:39 -08:00
}
2024-10-05 15:50:57 -07:00
. onChange ( of : txPower ) {
2025-07-21 18:11:13 -07:00
if isLicensed { hasChanges = true }
2023-02-09 22:59:39 -08:00
}
2022-06-27 08:30:49 -07:00
}
}