diff --git a/apple/OmnivoreKit/Sources/App/Views/AI/DigestConfigView.swift b/apple/OmnivoreKit/Sources/App/Views/AI/DigestConfigView.swift index a6b6519ce..26e6bcfd8 100644 --- a/apple/OmnivoreKit/Sources/App/Views/AI/DigestConfigView.swift +++ b/apple/OmnivoreKit/Sources/App/Views/AI/DigestConfigView.swift @@ -9,6 +9,10 @@ import Transmission @MainActor public class DigestConfigViewModel: ObservableObject { @Published var isLoading = false + @Published var alreadyGranted = false + + @Published var isIneligible = false + @Published var hasOptInError = false @Published var digest: DigestResult? @Published var chapterInfo: [(DigestChapter, DigestChapterData)]? @Published var presentedLibraryItem: String? @@ -16,14 +20,26 @@ public class DigestConfigViewModel: ObservableObject { @AppStorage(UserDefaultKey.lastVisitedDigestId.rawValue) var lastVisitedDigestId = "" + func checkAlreadyOptedIn(dataService: DataService) async { + isLoading = true + if let user = try? await dataService.fetchViewer() { + alreadyGranted = user.hasFeatureGranted("ai-digest") + } + isLoading = false + } + func enableDigest(dataService: DataService) async { isLoading = true - do { - try await dataService.optInFeature(name: "ai-digest") + if try await dataService.optInFeature(name: "ai-digest") == nil { + throw BasicError.message(messageText: "Could not opt into feature") + } + try await dataService.setupUserDigestConfig() } catch { - if let err as? IneligibleError { - + if error is IneligibleError { + isIneligible = true + } else { + hasOptInError = true } } @@ -35,12 +51,14 @@ public class DigestConfigViewModel: ObservableObject { @MainActor struct DigestConfigView: View { @StateObject var viewModel = DigestConfigViewModel() + let homeViewModel: HomeFeedViewModel let dataService: DataService @Environment(\.dismiss) private var dismiss - public init(dataService: DataService) { + public init(dataService: DataService, homeViewModel: HomeFeedViewModel) { self.dataService = dataService + self.homeViewModel = homeViewModel } var titleBlock: some View { @@ -59,12 +77,30 @@ struct DigestConfigView: View { VStack { titleBlock .padding(.top, 10) - itemBody - .padding(15) + + if viewModel.isLoading { + HStack { + Spacer() + ProgressView() + Spacer() + } + } else if viewModel.alreadyGranted { + Text("You've been added to the AI Digest demo. You first issue should be ready soon.") + .padding(15) + } else if viewModel.isIneligible { + Text("To enable digest you need to have saved at least ten library items and have two active subscriptions.") + .padding(15) + } else if viewModel.hasOptInError { + Text("There was an error setting up digest for your account.") + .padding(15) + } else { + itemBody + .padding(15) + } Spacer() }.task { - await viewModel.load(dataService: dataService) + await viewModel.checkAlreadyOptedIn(dataService: dataService) } } @@ -117,11 +153,14 @@ struct DigestConfigView: View { HStack { Spacer() - Button(action: {}, label: { Text("Hide digest") }) + Button(action: { + homeViewModel.hideDigestIcon = true + dismiss() + }, label: { Text("Hide digest") }) .buttonStyle(RoundedRectButtonStyle()) Button(action: { - viewModel.en + // viewModel.en }, label: { Text("Enable digest") }) .buttonStyle(RoundedRectButtonStyle(color: Color.blue, textColor: Color.white)) } diff --git a/apple/OmnivoreKit/Sources/App/Views/Home/HomeFeedViewIOS.swift b/apple/OmnivoreKit/Sources/App/Views/Home/HomeFeedViewIOS.swift index c31e08a5b..b0a724ab0 100644 --- a/apple/OmnivoreKit/Sources/App/Views/Home/HomeFeedViewIOS.swift +++ b/apple/OmnivoreKit/Sources/App/Views/Home/HomeFeedViewIOS.swift @@ -335,7 +335,7 @@ struct AnimatingCellHeight: AnimatableModifier { .sheet(isPresented: $showDigestConfig) { if #available(iOS 17.0, *) { NavigationView { - DigestConfigView(dataService: dataService) + DigestConfigView(dataService: dataService, homeViewModel: viewModel) } } else { Text("Sorry digest is only available on iOS 17 and above") @@ -416,16 +416,7 @@ struct AnimatingCellHeight: AnimatableModifier { ) .buttonStyle(.plain) .padding(.trailing, 4) - } else if #available(iOS 17.0, *), !dataService.featureFlags.digestEnabled, !viewModel.digestHidden { - Button( - action: { showDigestConfig = true }, - label: { Image.tabDigestSelected } - ) - .buttonStyle(.plain) - .padding(.trailing, 4) - } - if #available(iOS 17.0, *), !dataService.featureFlags.digestEnabled, !viewModel.digestHidden { - // Give the user an opportunity to enable digest + } else if #available(iOS 17.0, *), !dataService.featureFlags.digestEnabled, !viewModel.hideDigestIcon { Button( action: { showDigestConfig = true }, label: { Image.tabDigestSelected } diff --git a/apple/OmnivoreKit/Sources/App/Views/Home/HomeFeedViewModel.swift b/apple/OmnivoreKit/Sources/App/Views/Home/HomeFeedViewModel.swift index d451bcd2e..29ec1c998 100644 --- a/apple/OmnivoreKit/Sources/App/Views/Home/HomeFeedViewModel.swift +++ b/apple/OmnivoreKit/Sources/App/Views/Home/HomeFeedViewModel.swift @@ -49,7 +49,7 @@ enum LoadingBarStyle { @AppStorage(UserDefaultKey.hideFeatureSection.rawValue) var hideFeatureSection = false @AppStorage(UserDefaultKey.stopUsingFollowingPrimer.rawValue) var stopUsingFollowingPrimer = false @AppStorage("LibraryTabView::hideFollowingTab") var hideFollowingTab = false - @AppStorage("LibraryTabView::digestHidden") var digestHidden = false + @AppStorage("LibraryTabView::hideDigestIcon") var hideDigestIcon = false @AppStorage(UserDefaultKey.lastVisitedDigestId.rawValue) var lastVisitedDigestId = "" @AppStorage(UserDefaultKey.lastSelectedFeaturedItemFilter.rawValue) var featureFilter = diff --git a/apple/OmnivoreKit/Sources/App/Views/Profile/FiltersView.swift b/apple/OmnivoreKit/Sources/App/Views/Profile/FiltersView.swift index 9ee16acdc..d34de8cfa 100644 --- a/apple/OmnivoreKit/Sources/App/Views/Profile/FiltersView.swift +++ b/apple/OmnivoreKit/Sources/App/Views/Profile/FiltersView.swift @@ -19,6 +19,8 @@ import Views } @AppStorage("LibraryTabView::hideFollowingTab") var hideFollowingTab = false + @AppStorage("LibraryTabView::hideDigestIcon") var hideDigestIcon = false + @AppStorage(UserDefaultKey.hideFeatureSection.rawValue) var hideFeatureSection = false func loadFilters(dataService: DataService) async { @@ -95,6 +97,7 @@ struct FiltersView: View { List { Section(header: Text("User Interface")) { Toggle("Hide following tab", isOn: $viewModel.hideFollowingTab) + Toggle("Hide digest icon", isOn: $viewModel.hideDigestIcon) Toggle("Hide feature section", isOn: $viewModel.hideFeatureSection) }