yattee/Shared/Settings/ServicesSettings.swift

153 lines
5.0 KiB
Swift
Raw Normal View History

2021-10-23 12:12:53 +00:00
import Defaults
2021-10-23 11:51:02 +00:00
import SwiftUI
struct ServicesSettings: View {
2021-10-23 16:49:45 +00:00
@Default(.sponsorBlockInstance) private var sponsorBlockInstance
@Default(.sponsorBlockCategories) private var sponsorBlockCategories
2021-12-04 19:35:41 +00:00
@Default(.commentsInstanceID) private var commentsInstanceID
2021-10-23 16:49:45 +00:00
#if !os(tvOS)
@Default(.commentsPlacement) private var commentsPlacement
#endif
2021-10-23 11:51:02 +00:00
var body: some View {
2021-12-04 19:35:41 +00:00
Section(header: SettingsHeader(text: "Comments")) {
commentsInstancePicker
#if !os(tvOS)
commentsPlacementPicker
.disabled(!CommentsModel.enabled)
#endif
2021-12-04 19:35:41 +00:00
}
2021-11-04 22:01:27 +00:00
Section(header: SettingsHeader(text: "SponsorBlock API")) {
2021-10-23 12:12:53 +00:00
TextField(
"SponsorBlock API Instance",
2021-11-28 14:37:55 +00:00
text: $sponsorBlockInstance
2021-10-23 12:12:53 +00:00
)
.labelsHidden()
#if !os(macOS)
.autocapitalization(.none)
.keyboardType(.URL)
#endif
2021-10-23 16:49:45 +00:00
}
2021-10-23 12:12:53 +00:00
2021-11-04 22:01:27 +00:00
Section(header: SettingsHeader(text: "Categories to Skip")) {
2021-10-23 12:12:53 +00:00
#if os(macOS)
2021-12-02 19:22:55 +00:00
let list = ForEach(SponsorBlockAPI.categories, id: \.self) { category in
2021-10-23 16:49:45 +00:00
SponsorBlockCategorySelectionRow(
title: SponsorBlockAPI.categoryDescription(category) ?? "Unknown",
selected: sponsorBlockCategories.contains(category)
) { value in
toggleCategory(category, value: value)
}
}
2021-11-28 14:37:55 +00:00
Group {
if #available(macOS 12.0, *) {
list
.listStyle(.inset(alternatesRowBackgrounds: true))
} else {
list
.listStyle(.inset)
}
}
2021-10-23 12:12:53 +00:00
Spacer()
2021-10-23 16:49:45 +00:00
#else
ForEach(SponsorBlockAPI.categories, id: \.self) { category in
SponsorBlockCategorySelectionRow(
title: SponsorBlockAPI.categoryDescription(category) ?? "Unknown",
selected: sponsorBlockCategories.contains(category)
) { value in
toggleCategory(category, value: value)
}
}
#endif
}
}
2021-12-04 19:35:41 +00:00
private var commentsInstancePicker: some View {
Picker("Source", selection: $commentsInstanceID) {
2021-12-05 17:10:33 +00:00
Text("Disabled").tag(Optional(""))
2021-12-04 19:35:41 +00:00
ForEach(InstancesModel.all.filter { $0.app.supportsComments }) { instance in
Text(instance.description).tag(Optional(instance.id))
}
}
.labelsHidden()
#if os(iOS)
.pickerStyle(.automatic)
#elseif os(tvOS)
.pickerStyle(.inline)
#endif
}
#if !os(tvOS)
private var commentsPlacementPicker: some View {
Picker("Placement", selection: $commentsPlacement) {
Text("Below video description").tag(CommentsPlacement.info)
Text("Separate tab").tag(CommentsPlacement.separate)
}
.labelsHidden()
#if os(iOS)
.pickerStyle(.automatic)
#endif
}
#endif
2021-10-23 16:49:45 +00:00
func toggleCategory(_ category: String, value: Bool) {
if let index = sponsorBlockCategories.firstIndex(where: { $0 == category }), !value {
sponsorBlockCategories.remove(at: index)
} else if value {
sponsorBlockCategories.insert(category)
}
}
struct SponsorBlockCategorySelectionRow: View {
let title: String
let selected: Bool
var action: (Bool) -> Void
@State private var toggleChecked = false
var body: some View {
Button(action: { action(!selected) }) {
HStack {
#if os(macOS)
Toggle(isOn: $toggleChecked) {
Text(self.title)
Spacer()
}
.onAppear {
toggleChecked = selected
}
.onChange(of: toggleChecked) { new in
action(new)
}
#else
Text(self.title)
Spacer()
if selected {
Image(systemName: "checkmark")
#if os(iOS)
.foregroundColor(.accentColor)
#endif
}
#endif
}
.contentShape(Rectangle())
}
#if !os(tvOS)
2021-11-08 16:29:35 +00:00
.buttonStyle(.plain)
2021-10-23 12:12:53 +00:00
#endif
}
2021-10-23 11:51:02 +00:00
}
}
struct ServicesSettings_Previews: PreviewProvider {
static var previews: some View {
2021-11-01 21:56:18 +00:00
VStack {
ServicesSettings()
}
2021-10-23 11:51:02 +00:00
}
}