Allow hiding the digest icon for users that have opted out

This commit is contained in:
Jackson Harper
2024-05-14 11:07:51 +08:00
parent 7ef643f549
commit 95633327f6
4 changed files with 55 additions and 22 deletions

View File

@ -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))
}

View File

@ -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 }

View File

@ -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 =

View File

@ -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)
}