Refactoring

This commit is contained in:
Justin Mazzocchi 2020-08-03 17:48:22 -07:00
parent 09c518d712
commit 9dd67a6c69
No known key found for this signature in database
GPG key ID: E223E6937AAFB01C
4 changed files with 27 additions and 19 deletions

View file

@ -2,23 +2,23 @@
import Combine import Combine
// This publisher acts as a `@Published private var` inside ObservableObjects that doesn't trigger `objectWillChange`
class CurrentValuePublisher<Output> { class CurrentValuePublisher<Output> {
@Published private(set) var value: Output @Published private var wrappedValue: Output
private let internalPublisher: AnyPublisher<Output, Never>
init<P>(initial: Output, then: P) where P: Publisher, P.Output == Output, P.Failure == Never { init<P>(initial: Output, then: P) where P: Publisher, P.Output == Output, P.Failure == Never {
value = initial wrappedValue = initial
internalPublisher = then.eraseToAnyPublisher() then.assign(to: &$wrappedValue)
then.assign(to: &$value)
} }
} }
extension CurrentValuePublisher {
var value: Output { wrappedValue }
}
extension CurrentValuePublisher: Publisher { extension CurrentValuePublisher: Publisher {
typealias Failure = Never typealias Failure = Never
func receive<S>(subscriber: S) where S: Subscriber, Output == S.Input, S.Failure == Never { func receive<S>(subscriber: S) where S: Subscriber, S.Input == Output, S.Failure == Never {
internalPublisher.receive(subscriber: subscriber) $wrappedValue.receive(subscriber: subscriber)
} }
} }

View file

@ -19,10 +19,10 @@ struct RootView: View {
private extension RootView { private extension RootView {
private static func mainNavigation(viewModel: MainNavigationViewModel) -> some View { private static func mainNavigation(viewModel: MainNavigationViewModel) -> some View {
#if os(macOS) #if os(macOS)
return SidebarNavigation().environmentObject(viewModel) return SidebarNavigation(viewModel: viewModel)
.frame(minWidth: 900, maxWidth: .infinity, minHeight: 500, maxHeight: .infinity) .frame(minWidth: 900, maxWidth: .infinity, minHeight: 500, maxHeight: .infinity)
#else #else
return TabNavigation().environmentObject(viewModel) return TabNavigation(viewModel: viewModel)
#endif #endif
} }

View file

@ -5,7 +5,7 @@ import KingfisherSwiftUI
import struct Kingfisher.DownsamplingImageProcessor import struct Kingfisher.DownsamplingImageProcessor
struct TabNavigation: View { struct TabNavigation: View {
@EnvironmentObject var viewModel: MainNavigationViewModel @StateObject var viewModel: MainNavigationViewModel
var body: some View { var body: some View {
TabView(selection: $viewModel.selectedTab) { TabView(selection: $viewModel.selectedTab) {
@ -25,7 +25,11 @@ struct TabNavigation: View {
SettingsView(viewModel: viewModel.settingsViewModel()) SettingsView(viewModel: viewModel.settingsViewModel())
.environmentObject(viewModel) .environmentObject(viewModel)
} }
.onAppear { viewModel.refreshIdentity() } .onAppear(perform: viewModel.refreshIdentity)
.onReceive(NotificationCenter.default
.publisher(for: UIScene.willEnterForegroundNotification)
.map { _ in () },
perform: viewModel.refreshIdentity)
} }
} }
@ -61,8 +65,7 @@ private extension TabNavigation {
#if DEBUG #if DEBUG
struct TabNavigation_Previews: PreviewProvider { struct TabNavigation_Previews: PreviewProvider {
static var previews: some View { static var previews: some View {
TabNavigation() TabNavigation(viewModel: .development)
.environmentObject(MainNavigationViewModel.development)
} }
} }
#endif #endif

View file

@ -6,7 +6,7 @@ import struct Kingfisher.DownsamplingImageProcessor
import struct Kingfisher.RoundCornerImageProcessor import struct Kingfisher.RoundCornerImageProcessor
struct SidebarNavigation: View { struct SidebarNavigation: View {
@EnvironmentObject var viewModel: MainNavigationViewModel @StateObject var viewModel: MainNavigationViewModel
var sidebar: some View { var sidebar: some View {
List(selection: $viewModel.selectedTab) { List(selection: $viewModel.selectedTab) {
@ -18,8 +18,14 @@ struct SidebarNavigation: View {
.tag(tab) .tag(tab)
} }
} }
.overlay(Pocket(), alignment: .bottom) .overlay(Pocket().environmentObject(viewModel), alignment: .bottom)
.listStyle(SidebarListStyle()) .listStyle(SidebarListStyle())
.onAppear(perform: viewModel.refreshIdentity)
.onReceive(NotificationCenter.default
.publisher(for: NSWindow.didBecomeKeyNotification)
.dropFirst()
.map { _ in () },
perform: viewModel.refreshIdentity)
} }
var body: some View { var body: some View {
@ -82,8 +88,7 @@ private extension SidebarNavigation {
#if DEBUG #if DEBUG
struct SidebarNavigation_Previews: PreviewProvider { struct SidebarNavigation_Previews: PreviewProvider {
static var previews: some View { static var previews: some View {
SidebarNavigation() SidebarNavigation(viewModel: .development)
.environmentObject(MainNavigationViewModel.development)
} }
} }
#endif #endif