Merge pull request #8 from pawelorzech/fix/medium-priority-phase2

Fix safety issues, deprecated APIs, and code quality
This commit is contained in:
Paweł Orzech 2026-02-27 23:34:46 +01:00 committed by GitHub
commit 56037885d0
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
7 changed files with 17 additions and 19 deletions

View file

@ -14,7 +14,7 @@ struct MacTornApp: App {
.onAppear { .onAppear {
updateAppearance() updateAppearance()
} }
.onChange(of: appearanceModeRaw) { _ in .onChange(of: appearanceModeRaw) {
updateAppearance() updateAppearance()
} }
} label: { } label: {

View file

@ -1,6 +1,11 @@
import Foundation import Foundation
import SwiftUI import SwiftUI
// MARK: - Constants
enum TornConstants {
static let developerID = 2362436
}
// MARK: - Root Response // MARK: - Root Response
struct TornResponse: Codable { struct TornResponse: Codable {
let name: String? let name: String?

View file

@ -103,14 +103,8 @@ class NotificationManager: NSObject, UNUserNotificationCenterDelegate {
/// Cancel all travel-related notifications /// Cancel all travel-related notifications
func cancelTravelNotifications() { func cancelTravelNotifications() {
let identifiers = [ let identifiers = TravelNotificationSetting.defaults.map { "\($0.id)_alert" }
"travel_2min_alert",
"travel_1min_alert",
"travel_30sec_alert",
"travel_10sec_alert"
]
UNUserNotificationCenter.current().removePendingNotificationRequests(withIdentifiers: identifiers) UNUserNotificationCenter.current().removePendingNotificationRequests(withIdentifiers: identifiers)
print("Cancelled travel notifications")
} }
/// Cancel a specific notification by identifier /// Cancel a specific notification by identifier

View file

@ -584,9 +584,7 @@ class AppState: ObservableObject {
// Check if feedback prompt should be shown // Check if feedback prompt should be shown
self.checkFeedbackPrompt() self.checkFeedbackPrompt()
// Force UI update by triggering objectWillChange logger.info("Data updated, lastUpdated: \(self.lastUpdated?.description ?? "nil")")
self.objectWillChange.send()
logger.info("UI update triggered, lastUpdated: \(self.lastUpdated?.description ?? "nil")")
} }
} }

View file

@ -91,7 +91,7 @@ struct ContentView: View {
private var headerView: some View { private var headerView: some View {
HStack { HStack {
if let lastUpdated = appState.lastUpdated { if let lastUpdated = appState.lastUpdated {
Text("Updated: \(lastUpdated, formatter: timeFormatter)") Text("Updated: \(lastUpdated, formatter: Self.timeFormatter)")
.font(.caption2) .font(.caption2)
.foregroundColor(.secondary) .foregroundColor(.secondary)
} }
@ -177,9 +177,9 @@ struct ContentView: View {
.padding(.bottom, 8) .padding(.bottom, 8)
} }
private var timeFormatter: DateFormatter { private static let timeFormatter: DateFormatter = {
let formatter = DateFormatter() let formatter = DateFormatter()
formatter.timeStyle = .short formatter.timeStyle = .short
return formatter return formatter
} }()
} }

View file

@ -5,7 +5,7 @@ struct CreditsView: View {
@Binding var showCredits: Bool @Binding var showCredits: Bool
// MARK: - Developer // MARK: - Developer
private let developer = TornContributor(name: "bombel", tornID: 2362436) private let developer = TornContributor(name: "bombel", tornID: TornConstants.developerID)
// MARK: - Special Thanks // MARK: - Special Thanks
private let specialThanks: [TornContributor] = [ private let specialThanks: [TornContributor] = [
@ -92,7 +92,9 @@ struct CreditsView: View {
} }
Button { Button {
openTornProfile(developer.tornID!) if let tornID = developer.tornID {
openTornProfile(tornID)
}
} label: { } label: {
HStack { HStack {
Text(developer.name) Text(developer.name)

View file

@ -9,8 +9,7 @@ struct SettingsView: View {
@State private var showCredits: Bool = false @State private var showCredits: Bool = false
@State private var availableBrowsers: [PreferredBrowser] = PreferredBrowser.availableBrowsers() @State private var availableBrowsers: [PreferredBrowser] = PreferredBrowser.availableBrowsers()
// Developer ID for tip feature (bombel) private let developerID = TornConstants.developerID
private let developerID = 2362436
var body: some View { var body: some View {
if showCredits { if showCredits {
@ -74,7 +73,7 @@ struct SettingsView: View {
Text("2m").tag(120) Text("2m").tag(120)
} }
.pickerStyle(.segmented) .pickerStyle(.segmented)
.onChange(of: appState.refreshInterval) { _ in .onChange(of: appState.refreshInterval) {
Task { @MainActor in Task { @MainActor in
appState.startPolling() appState.startPolling()
} }