Skip to content

Commit

Permalink
Update codebase (#409)
Browse files Browse the repository at this point in the history
* First pass for swift concurrency

* Update code base

* Adopt concurrency

* migrate to observation

* Targeted concurrency

* Remove comment

* Restore pasteboard
  • Loading branch information
bourvill authored Feb 8, 2024
1 parent 69031b4 commit e3aa72f
Show file tree
Hide file tree
Showing 63 changed files with 501 additions and 522 deletions.
1 change: 1 addition & 0 deletions App/Extension/AppDelegateExtension.swift
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,7 @@
}
}
}
// swiftlint:enable line_length
#endif

#endif
2 changes: 1 addition & 1 deletion App/Features/AI/Tag/TagSuggestionViewModel.swift
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ final class TagSuggestionViewModel: ObservableObject {
}
addingTags = true
for tag in tagSelections {
wallabagSession.add(tag: tag, for: entry)
try await wallabagSession.add(tag: tag, for: entry)
}
}
}
6 changes: 2 additions & 4 deletions App/Features/About/AboutView.swift
Original file line number Diff line number Diff line change
Expand Up @@ -20,8 +20,6 @@ struct AboutView: View {
}
}

struct AboutView_Previews: PreviewProvider {
static var previews: some View {
AboutView()
}
#Preview {
AboutView()
}
6 changes: 2 additions & 4 deletions App/Features/BugReport/BugReportView.swift
Original file line number Diff line number Diff line change
Expand Up @@ -17,8 +17,6 @@ struct BugReportView: View {
}
}

struct BugReportView_Previews: PreviewProvider {
static var previews: some View {
BugReportView()
}
#Preview {
BugReportView()
}
30 changes: 30 additions & 0 deletions App/Features/Entry/Add/AddEntryModel.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
import Factory
import Foundation
import Observation
import SwiftUI

@Observable
final class AddEntryModel {
@ObservationIgnored
@Injected(\.wallabagSession) private var session

var url: String = ""
var submitting: Bool = false
var succeeded: Bool = false

@MainActor
func addEntry() async {
defer {
submitting = false
succeeded = false
url = ""
}

submitting = true
do {
try await session.addEntry(url: url)
succeeded = true
try await Task.sleep(for: .seconds(3))
} catch {}
}
}
34 changes: 34 additions & 0 deletions App/Features/Entry/Add/AddEntryView.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
import SwiftUI

struct AddEntryView: View {
@State private var model = AddEntryModel()

var body: some View {
Form {
TextField("Url", text: $model.url)
#if os(iOS)
.autocapitalization(.none)
#endif
.disableAutocorrection(true)
HStack {
if model.succeeded {
Text("Great! Entry was added")
} else {
Button(model.submitting ? "Submitting..." : "Submit") {
Task {
await model.addEntry()
}
}.disabled(model.submitting)
}
}
.disabled(model.url.isEmpty)
}
.animation(.easeInOut, value: model.succeeded)
.animation(.easeInOut, value: model.submitting)
.navigationTitle("Add entry")
}
}

#Preview {
AddEntryView()
}
55 changes: 0 additions & 55 deletions App/Features/Entry/AddEntryView.swift

This file was deleted.

2 changes: 1 addition & 1 deletion App/Features/Entry/EntriesListView.swift
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ import SwiftUI

struct EntriesListView: View {
@Environment(\.managedObjectContext) var context: NSManagedObjectContext
@EnvironmentObject var appSync: AppSync
@Environment(AppSync.self) var appSync: AppSync
@FetchRequest var entries: FetchedResults<Entry>

init(predicate: NSPredicate, entriesSortAscending: Bool) {
Expand Down
2 changes: 1 addition & 1 deletion App/Features/Entry/EntriesView.swift
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ import CoreData
import SwiftUI

struct EntriesView: View {
@EnvironmentObject var router: Router
@Environment(Router.self) var router: Router
@EnvironmentObject var appState: AppState
@StateObject var searchViewModel = SearchViewModel()
@State var entriesSortAscending = false
Expand Down
6 changes: 3 additions & 3 deletions App/Features/Entry/EntryView.swift
Original file line number Diff line number Diff line change
Expand Up @@ -7,9 +7,9 @@ struct EntryView: View {
@Environment(\.managedObjectContext) var context: NSManagedObjectContext
@Environment(\.openURL) var openURL
@Environment(\.dismiss) private var dismiss
@EnvironmentObject var appSync: AppSync
@Environment(AppSync.self) var appSync: AppSync
#if os(iOS)
@EnvironmentObject var player: PlayerPublisher
@Environment(PlayerPublisher.self) var player: PlayerPublisher
#endif
@ObservedObject var entry: Entry
@State var showTag: Bool = false
Expand Down Expand Up @@ -138,7 +138,7 @@ struct EntryView: View {
let coreData = Container.shared.coreData()
EntryView(entry: Entry(context: coreData.viewContext))
#if os(iOS)
.environmentObject(PlayerPublisher())
.environment(PlayerPublisher())
#endif
.environment(\.managedObjectContext, coreData.viewContext)
}
Expand Down
2 changes: 1 addition & 1 deletion App/Features/Entry/Picture/EntryPicture.swift
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ import SwiftUI
import UIKit

struct EntryPicture: View {
@StateObject var imagePublisher = ImageDownloaderPublisher()
@State var imagePublisher = ImageDownloaderPublisher()

var url: String?

Expand Down
2 changes: 1 addition & 1 deletion App/Features/Entry/Picture/ImageCache.swift
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ import Foundation
import UIKit

actor ImageCache {
static var shared = ImageCache()
static let shared = ImageCache()

private var memoryCache: NSCache<NSString, UIImage> = {
let cache = NSCache<NSString, UIImage>()
Expand Down
9 changes: 6 additions & 3 deletions App/Features/Entry/Picture/ImageDownloaderPublisher.swift
Original file line number Diff line number Diff line change
@@ -1,12 +1,15 @@
#if os(iOS)
import Combine
import Factory
import Foundation
import Observation
import SwiftUI
import UIKit

final class ImageDownloaderPublisher: ObservableObject {
@Observable
final class ImageDownloaderPublisher {
@ObservationIgnored
@Injected(\.imageDownloader) private var imageDownloader
@Published var image: UIImage?
var image: UIImage?

@MainActor
func loadImage(url: String?) async {
Expand Down
2 changes: 1 addition & 1 deletion App/Features/Error/ErrorView.swift
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import SwiftUI

struct ErrorView: View {
@EnvironmentObject var errorViewModel: ErrorViewModel
@Environment(ErrorViewModel.self) var errorViewModel: ErrorViewModel
var body: some View {
errorViewModel.lastError.map {
Text($0.localizedDescription)
Expand Down
13 changes: 8 additions & 5 deletions App/Features/Error/ErrorViewModel.swift
Original file line number Diff line number Diff line change
@@ -1,19 +1,22 @@
import Combine
import Foundation
import Observation

final class ErrorViewModel: ObservableObject {
@Observable
final class ErrorViewModel {
private var resetAfter: Double
private(set) var lastError: WallabagError?

init(_ resetAfter: Double = 10) {
self.resetAfter = resetAfter
}

@Published private(set) var lastError: WallabagError?

func setLast(_ error: WallabagError) {
lastError = error
DispatchQueue.main.asyncAfter(deadline: .now() + resetAfter) { [weak self] in
self?.lastError = nil
Task.detached { [weak self] in
guard let self else { return }
try? await Task.sleep(for: .seconds(resetAfter))
lastError = nil
}
}
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import SwiftUI

#if os(iOS)
@MainActor
struct HapticNotificationButtonStyle: ButtonStyle {
let feedbackType: UINotificationFeedbackGenerator.FeedbackType
func makeBody(configuration: Configuration) -> some View {
Expand Down
5 changes: 3 additions & 2 deletions App/Features/MainView.swift
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,8 @@ import SwiftUI

struct MainView: View {
@EnvironmentObject var appState: AppState
@EnvironmentObject var player: PlayerPublisher
@EnvironmentObject var router: Router
@Environment(PlayerPublisher.self) var player
@Environment(Router.self) var router: Router

var body: some View {
if appState.registred {
Expand All @@ -18,6 +18,7 @@ struct MainView: View {
var mainView: some View {
ZStack {
GeometryReader { geometry in
@Bindable var router = router
NavigationStack(path: $router.path) {
EntriesView()
.appRouting()
Expand Down
4 changes: 3 additions & 1 deletion App/Features/PasteBoard/PasteBoardView.swift
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,9 @@ import SwiftUI
.lineLimit(1)
HStack {
Button(action: {
pasteBoardViewModel.addUrl()
Task {
await pasteBoardViewModel.addUrl()
}
}, label: {
Text("Add")
})
Expand Down
6 changes: 4 additions & 2 deletions App/Features/PasteBoard/PasteBoardViewModel.swift
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
import SharedLib
import UIKit

@MainActor
class PasteBoardViewModel: ObservableObject {
@Published var showPasteBoardView: Bool = false {
willSet {
Expand Down Expand Up @@ -39,8 +40,9 @@
cancellableNotification?.cancel()
}

func addUrl() {
session.addEntry(url: pasteBoardUrl) {}
@MainActor
func addUrl() async {
try? await session.addEntry(url: pasteBoardUrl)
showPasteBoardView = false
}

Expand Down
11 changes: 6 additions & 5 deletions App/Features/Player/PlayerPublisher.swift
Original file line number Diff line number Diff line change
@@ -1,18 +1,19 @@
import AVFoundation
import Combine
import Foundation
import MediaPlayer
import Observation
import SwiftUI

#if os(iOS)
final class PlayerPublisher: ObservableObject {
@Observable
final class PlayerPublisher {
static var shared = PlayerPublisher()
private var speecher = AVSpeechSynthesizer()
private var utterance: AVSpeechUtterance?

@Published var podcast: Podcast?
@Published var showPlayer: Bool = false
@Published private(set) var isPlaying = false {
var podcast: Podcast?
var showPlayer: Bool = false
private(set) var isPlaying = false {
willSet {
if newValue {
play()
Expand Down
6 changes: 3 additions & 3 deletions App/Features/Player/PlayerView.swift
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ import SwiftUI

#if os(iOS)
struct PlayerView: View {
@EnvironmentObject var playerPublisher: PlayerPublisher
@Environment(PlayerPublisher.self) var playerPublisher: PlayerPublisher

var body: some View {
VStack {
Expand Down Expand Up @@ -65,11 +65,11 @@ import SwiftUI

static var previews: some View {
PlayerView()
.environmentObject(PlayerPublisher())
.environment(PlayerPublisher())
.previewLayout(.sizeThatFits)

PlayerView()
.environmentObject(player)
.environment(player)
.previewLayout(.sizeThatFits)
}
}
Expand Down
Loading

0 comments on commit e3aa72f

Please sign in to comment.