Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0

### Added

- iOS: alert when the active connection is deleted mid-session (for example via iCloud sync from another device), so a stale screen no longer fails silently on the next action
- iOS: Face ID, Touch ID, or Optic ID lock with cold-launch protection and idle timeout (1, 5, 15, or 60 minutes), opt-in from Settings
- iOS: Connection Info tab replaces the per-connection Settings tab, showing host, SSL, SSH tunnel, active database, and live connection status
- MCP Setup sheet adds Zed alongside Claude Desktop, Claude Code, and Cursor with a one-paste `context_servers` snippet
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ final class ConnectionCoordinator {
}
}
var pendingQuery: String?
var navigationPath = NavigationPath()
var tablesPath = NavigationPath()
var showingEditSheet = false

private(set) var queryHistory: [QueryHistoryItem] = []
Expand Down Expand Up @@ -281,7 +281,7 @@ final class ConnectionCoordinator {
appState.pendingTableName = nil
selectedTab = .tables
Task { @MainActor in
navigationPath.append(table)
tablesPath.append(table)
}
}

Expand Down
6 changes: 6 additions & 0 deletions TableProMobile/TableProMobile/Localizable.xcstrings
Original file line number Diff line number Diff line change
Expand Up @@ -831,6 +831,9 @@
}
}
}
},
"Connection Deleted" : {

},
"Connection Failed" : {
"localizations" : {
Expand Down Expand Up @@ -3825,6 +3828,9 @@
}
}
}
},
"This connection no longer exists. It may have been removed from another device." : {

},
"This database has no tables." : {
"localizations" : {
Expand Down
13 changes: 12 additions & 1 deletion TableProMobile/TableProMobile/Views/ConnectedView.swift
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ struct ConnectedView: View {
@State private var coordinator: ConnectionCoordinator?
@State private var hapticSuccess = false
@State private var hapticError = false
@State private var showDeletedAlert = false

var body: some View {
Group {
Expand All @@ -38,6 +39,16 @@ struct ConnectedView: View {
}
.navigationTitle(connection.name.isEmpty ? connection.host : connection.name)
.navigationBarTitleDisplayMode(.inline)
.onChange(of: appState.connections) { _, newConnections in
if !newConnections.contains(where: { $0.id == connection.id }) {
showDeletedAlert = true
}
}
.alert(String(localized: "Connection Deleted"), isPresented: $showDeletedAlert) {
Button("OK", role: .cancel) { dismiss() }
} message: {
Text("This connection no longer exists. It may have been removed from another device.")
}
.task {
if let cached = cachedCoordinator {
coordinator = cached
Expand Down Expand Up @@ -88,7 +99,7 @@ struct ConnectedView: View {

private func connectedContent(_ coordinator: ConnectionCoordinator) -> some View {
@Bindable var coordinator = coordinator
return NavigationStack(path: $coordinator.navigationPath) {
return NavigationStack(path: $coordinator.tablesPath) {
TabView(selection: $coordinator.selectedTab) {
Tab("Tables", systemImage: "tablecells", value: .tables) {
TableListView()
Expand Down
2 changes: 0 additions & 2 deletions TableProMobile/TableProMobile/Views/ConnectionInfoView.swift
Original file line number Diff line number Diff line change
Expand Up @@ -51,8 +51,6 @@ struct ConnectionInfoView: View {

statsSection
}
.navigationTitle("Info")
.navigationBarTitleDisplayMode(.inline)
.sheet(isPresented: Binding(
get: { coordinator.showingEditSheet },
set: { coordinator.showingEditSheet = $0 }
Expand Down
Loading