Skip to content

Commit

Permalink
Merge pull request #1654 from planetary-social/bdm/1458-perf-observable
Browse files Browse the repository at this point in the history
migrate ObservableObject to @observable where possible #1458
  • Loading branch information
joshuatbrown authored Oct 17, 2024
2 parents aebbcb7 + cd03c5a commit 0f47887
Show file tree
Hide file tree
Showing 9 changed files with 40 additions and 48 deletions.
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
- Removed integration with Universal Name Space [#1636](https://github.com/planetary-social/nos/issues/1636)

### Internal Changes
- Migrate ObservableObject to @Observable where possible [#1458](https://github.com/planetary-social/nos/issues/1458)

## [0.2.2] - 2024-10-11Z

Expand Down
43 changes: 19 additions & 24 deletions Nos/Controller/RawEventController.swift
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ import Foundation
import Logger

/// A view model for the RawEventView
@MainActor protocol RawEventViewModel: ObservableObject {
protocol RawEventViewModel {

/// The raw message to display in screen
var rawMessage: String? { get }
Expand All @@ -21,17 +21,14 @@ import Logger
}

/// A controller for the `RawEventView`
@MainActor class RawEventController: RawEventViewModel {
@Observable final class RawEventController: RawEventViewModel {

private var note: Event
private let note: Event
private let dismissHandler: () -> Void

@Published var rawMessage: String?

@Published var loadingMessage: String?

@Published var errorMessage: String?

private var dismissHandler: () -> Void
private(set) var rawMessage: String?
private(set) var loadingMessage: String?
private(set) var errorMessage: String?

init(note: Event, dismissHandler: @escaping () -> Void) {
self.note = note
Expand All @@ -52,22 +49,20 @@ import Logger
self.rawMessage = rawMessage
self.loadingMessage = nil
}

private func loadRawMessage() {
loadingMessage = String(localized: .localizable.loading)
Task { [note, weak self] in
var rawMessage: String
let errorMessage = note.content ?? "error"
do {
let data = try JSONSerialization.data(
withJSONObject: note.jsonRepresentation ?? [:],
options: [.prettyPrinted]
)
rawMessage = String(decoding: data, as: UTF8.self)
} catch {
rawMessage = errorMessage
}
self?.updateRawMessage(rawMessage)

let rawMessage: String
do {
let data = try JSONSerialization.data(
withJSONObject: note.jsonRepresentation ?? [:],
options: [.prettyPrinted]
)
rawMessage = String(decoding: data, as: UTF8.self)
} catch {
rawMessage = note.content ?? "error"
}
updateRawMessage(rawMessage)
}
}
4 changes: 2 additions & 2 deletions Nos/Models/NotificationViewModel.swift
Original file line number Diff line number Diff line change
Expand Up @@ -8,11 +8,11 @@ import UIKit
/// in the .init method of a View. Because of this you must call the async function
/// `loadContent()` to populate the `content` variable because it relies on some
/// database queries.
class NotificationViewModel: ObservableObject, Identifiable {
@Observable final class NotificationViewModel: Identifiable {
let noteID: RawEventID
let authorProfilePhotoURL: URL?
let actionText: AttributedString
@Published var content: AttributedString?
private(set) var content: AttributedString?
let date: Date

var id: RawEventID {
Expand Down
8 changes: 4 additions & 4 deletions Nos/Views/Components/Event/RawEventView.swift
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import SwiftUI

struct RawEventView<ViewModel>: View where ViewModel: RawEventViewModel {
@ObservedObject var viewModel: ViewModel
let viewModel: ViewModel

/// A loading overlay that displays the `loadingMessage` from the view model.
private var loadingIndicator: some View {
Expand Down Expand Up @@ -84,11 +84,11 @@ struct RawEventView<ViewModel>: View where ViewModel: RawEventViewModel {

fileprivate class PreviewViewModel: RawEventViewModel {

@Published var rawMessage: String?
var rawMessage: String?

@Published var loadingMessage: String? = "Loading..."
var loadingMessage: String? = "Loading..."

@Published var errorMessage: String?
var errorMessage: String?

init(_ rawMessage: String) {
self.rawMessage = rawMessage
Expand Down
6 changes: 1 addition & 5 deletions Nos/Views/Notifications/NotificationCard.swift
Original file line number Diff line number Diff line change
Expand Up @@ -9,14 +9,10 @@ struct NotificationCard: View {
@EnvironmentObject private var relayService: RelayService
@Dependency(\.persistenceController) private var persistenceController

@ObservedObject private var viewModel: NotificationViewModel
let viewModel: NotificationViewModel
@State private var relaySubscriptions = SubscriptionCancellables()
@State private var content: AttributedString?

init(viewModel: NotificationViewModel) {
self.viewModel = viewModel
}

func showNote() {
guard let note = Event.find(by: viewModel.noteID, context: viewContext) else {
return
Expand Down
2 changes: 1 addition & 1 deletion Nos/Views/Onboarding/OnboardingAgeVerificationView.swift
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ import SwiftUI

/// The Age Verification view in the onboarding.
struct OnboardingAgeVerificationView: View {
@EnvironmentObject var state: OnboardingState
@Environment(OnboardingState.self) private var state

@Dependency(\.crashReporting) private var crashReporting
@Dependency(\.currentUser) private var currentUser
Expand Down
2 changes: 1 addition & 1 deletion Nos/Views/Onboarding/OnboardingNotOldEnoughView.swift
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import SwiftUI

struct OnboardingNotOldEnoughView: View {
@EnvironmentObject var state: OnboardingState
@Environment(OnboardingState.self) private var state

var body: some View {
VStack {
Expand Down
4 changes: 2 additions & 2 deletions Nos/Views/Onboarding/OnboardingStartView.swift
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ import SwiftUI

/// The beginning of the Onboarding views which contains buttons to start creating a new account or log in.
struct OnboardingStartView: View {
@EnvironmentObject var state: OnboardingState
@Environment(OnboardingState.self) private var state

@Dependency(\.analytics) private var analytics

Expand Down Expand Up @@ -54,6 +54,6 @@ struct OnboardingStartView: View {

#Preview {
OnboardingStartView()
.environmentObject(OnboardingState())
.environment(OnboardingState())
.inject(previewData: PreviewData())
}
18 changes: 9 additions & 9 deletions Nos/Views/Onboarding/OnboardingView.swift
Original file line number Diff line number Diff line change
@@ -1,13 +1,13 @@
import SwiftUI

class OnboardingState: ObservableObject {
@Published var flow: OnboardingFlow = .createAccount
@Published var step: OnboardingStep = .onboardingStart {
@Observable final class OnboardingState {
var flow: OnboardingFlow = .createAccount
var step: OnboardingStep = .onboardingStart {
didSet {
path.append(step)
}
}
@Published var path = NavigationPath()
var path = NavigationPath()
}

enum OnboardingFlow {
Expand All @@ -25,26 +25,26 @@ enum OnboardingStep {

/// The view that initializes the onboarding navigation stack and shows the first view.
struct OnboardingView: View {
@StateObject var state = OnboardingState()
@State var state = OnboardingState()

/// Completion to be called when all onboarding steps are complete
let completion: @MainActor () -> Void

var body: some View {
NavigationStack(path: $state.path) {
OnboardingStartView()
.environmentObject(state)
.environment(state)
.navigationDestination(for: OnboardingStep.self) { step in
switch step {
case .onboardingStart:
OnboardingStartView()
.environmentObject(state)
.environment(state)
case .ageVerification:
OnboardingAgeVerificationView()
.environmentObject(state)
.environment(state)
case .notOldEnough:
OnboardingNotOldEnoughView()
.environmentObject(state)
.environment(state)
case .login:
OnboardingLoginView(completion: completion)
case .buildYourNetwork:
Expand Down

0 comments on commit 0f47887

Please sign in to comment.