mirror of
https://github.com/metabolist/metatext.git
synced 2025-06-07 08:38:49 +00:00
Refactoring
This commit is contained in:
parent
09c518d712
commit
9dd67a6c69
4 changed files with 27 additions and 19 deletions
|
@ -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)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
Loading…
Reference in a new issue