From 437fdc173fb99fa95c8daa9257a5eca1ee012258 Mon Sep 17 00:00:00 2001 From: ryoya ito Date: Sun, 3 Sep 2023 03:22:56 +0900 Subject: [PATCH] switch SwiftUIView/ComposeView, refactor di --- .../Sources/Contributor/ContributorView.swift | 60 ++++++++++++++++--- .../ContributorsRepositoryProvider.swift | 26 ++++++++ 2 files changed, 78 insertions(+), 8 deletions(-) create mode 100644 app-ios/Modules/Sources/KMPContainer/ContributorsRepositoryProvider.swift diff --git a/app-ios/Modules/Sources/Contributor/ContributorView.swift b/app-ios/Modules/Sources/Contributor/ContributorView.swift index c5f0432c6..dfe79b75d 100644 --- a/app-ios/Modules/Sources/Contributor/ContributorView.swift +++ b/app-ios/Modules/Sources/Contributor/ContributorView.swift @@ -1,18 +1,25 @@ import Component -import KMPContainer +import Dependencies import Model import shared import SwiftUI public struct ContributorView: View { @State var presentingURL: IdentifiableURL? - @ObservedObject var viewModel: ContributorViewModel = .init() public init() {} public var body: some View { + Group { +// ContributorSwiftUIView { url in +// presentingURL = .init(string: url) +// } + + ContributorComposeView { url in + presentingURL = .init(string: url) + } + } ContributorComposeView( - viewModel.getRepositoryForCompose(), onContributorItemClick: { contributorUrl in presentingURL = IdentifiableURL(string: contributorUrl) } @@ -31,21 +38,58 @@ public struct ContributorView: View { ContributorView() } +struct ContributorSwiftUIView: View { + @ObservedObject var viewModel: ContributorViewModel = .init() + let onContributorItemClick: (String) -> Void + + var body: some View { + Group { + switch viewModel.state.contributors { + case .initial, .loading: + ProgressView() + .task { + await viewModel.load() + } + case .failed: + EmptyView() + case .loaded(let contributors): + ScrollView { + LazyVStack(spacing: 20) { + ForEach(contributors, id: \.id) { contributor in + Button { + if let profileUrl = contributor.profileUrl { + onContributorItemClick(profileUrl) + } + } label: { + PersonLabel( + name: contributor.username, + iconUrlString: contributor.iconUrl + ) + } + } + } + .padding(16) + } + } + } + } +} + struct ContributorComposeView: UIViewControllerRepresentable { - let contributorsRepository: ContributorsRepository + @Dependency(\.contributorsRepositoryData) var contributorsRepositoryData + @Environment(\.colorScheme) var colorScheme let onContributorItemClick: (String) -> Void - init(_ contributorsRepository: ContributorsRepository, onContributorItemClick: @escaping (String) -> Void) { - self.contributorsRepository = contributorsRepository + init(onContributorItemClick: @escaping (String) -> Void) { self.onContributorItemClick = onContributorItemClick } func makeUIViewController(context: Context) -> UIViewController { let vc = DarwinContributorsKt.contributorViewController( - contributorsRepository: contributorsRepository, + contributorsRepository: contributorsRepositoryData.contributorsRepository, onContributorItemClick: onContributorItemClick ) - vc.overrideUserInterfaceStyle = .light + vc.overrideUserInterfaceStyle = .init(colorScheme) return vc } diff --git a/app-ios/Modules/Sources/KMPContainer/ContributorsRepositoryProvider.swift b/app-ios/Modules/Sources/KMPContainer/ContributorsRepositoryProvider.swift new file mode 100644 index 000000000..19088a7f8 --- /dev/null +++ b/app-ios/Modules/Sources/KMPContainer/ContributorsRepositoryProvider.swift @@ -0,0 +1,26 @@ +import Dependencies +import shared + +public struct ContributorsRepositoryProvider { + public let contributorsRepository: any ContributorsRepository +} + +extension ContributorsRepositoryProvider: DependencyKey { + @MainActor + public static var liveValue: ContributorsRepositoryProvider = ContributorsRepositoryProvider( + contributorsRepository: Container.shared.get(type: ContributorsRepository.self) as ContributorsRepository + ) + + public static var testValue: ContributorsRepositoryProvider = ContributorsRepositoryProvider( + contributorsRepository: DefaultContributorsRepository( + contributorsApi: FakeContributorsApiClient() + ) + ) +} + + public extension DependencyValues { + var contributorsRepositoryData: ContributorsRepositoryProvider { + get { self[ContributorsRepositoryProvider.self] } + set { self[ContributorsRepositoryProvider.self] = newValue } + } +}