Reorganize locations settings

This commit is contained in:
Arkadiusz Fal
2022-11-11 19:55:18 +01:00
parent 611bcde238
commit 4c2d473caa
5 changed files with 110 additions and 159 deletions

View File

@@ -7,20 +7,30 @@ struct AdvancedSettings: View {
@Default(.mpvCacheSecs) private var mpvCacheSecs
@Default(.mpvCachePauseWait) private var mpvCachePauseWait
@Default(.mpvEnableLogging) private var mpvEnableLogging
@Default(.countryOfPublicInstances) private var countryOfPublicInstances
@Default(.instances) private var instances
@EnvironmentObject<AccountsModel> private var accounts
@EnvironmentObject<NavigationModel> private var navigation
@EnvironmentObject<PlayerModel> private var player
@EnvironmentObject<SettingsModel> private var settings
@State private var presentingShareSheet = false
@State private var countries = [String]()
@State private var filesToShare = [MPVClient.logFile]
@State private var presentingInstanceForm = false
@State private var presentingShareSheet = false
@State private var savedFormInstanceID: Instance.ID?
var body: some View {
VStack(alignment: .leading) {
#if os(macOS)
advancedSettings
locationsSettings
Spacer()
#else
List {
advancedSettings
locationsSettings
}
#if os(iOS)
.sheet(isPresented: $presentingShareSheet) {
@@ -31,6 +41,16 @@ struct AdvancedSettings: View {
#endif
#endif
}
.onAppear(perform: loadCountries)
.onChange(of: countryOfPublicInstances) { newCountry in
InstancesManifest.shared.setPublicAccount(newCountry, accounts: accounts, asCurrent: accounts.current?.isPublic ?? true)
}
.onChange(of: instancesManifest) { _ in
countries.removeAll()
}
.sheet(isPresented: $presentingInstanceForm) {
InstanceForm(savedInstanceID: $savedFormInstanceID)
}
#if os(tvOS)
.frame(maxWidth: 1000)
#endif
@@ -82,6 +102,8 @@ struct AdvancedSettings: View {
Section(header: manifestHeader) {
TextField("URL", text: $instancesManifest)
Button("Reload manifest", action: loadCountries)
.disabled(instancesManifest.isEmpty)
#if !os(macOS)
.keyboardType(.webSearch)
#endif
@@ -112,7 +134,7 @@ struct AdvancedSettings: View {
}
var manifestHeader: some View {
SettingsHeader(text: "Public Manifest".localized())
SettingsHeader(text: "Locations Manifest".localized())
}
var showMPVPlaybackStatsToggle: some View {
@@ -132,10 +154,85 @@ struct AdvancedSettings: View {
}
}
#endif
@ViewBuilder var locationsSettings: some View {
if !InstancesManifest.shared.manifestURL.isNil, !countries.isEmpty {
Section(header: SettingsHeader(text: "Public Locations".localized()), footer: countryFooter) {
Picker("Country", selection: $countryOfPublicInstances) {
Text("Don't use public locations").tag(String?.none)
ForEach(countries, id: \.self) { country in
Text(country).tag(Optional(country))
}
}
#if os(tvOS)
.pickerStyle(.inline)
#endif
.disabled(countries.isEmpty)
Button {
InstancesManifest.shared.changePublicAccount(accounts, settings: settings)
} label: {
if let account = accounts.current, account.isPublic {
Text("Switch to other public location")
} else {
Text("Switch to public locations")
}
}
.disabled(countryOfPublicInstances.isNil)
}
}
Section(header: SettingsHeader(text: "Custom Locations".localized())) {
#if os(macOS)
InstancesSettings()
.environmentObject(settings)
#else
ForEach(instances) { instance in
AccountsNavigationLink(instance: instance)
}
addInstanceButton
#endif
}
}
@ViewBuilder var countryFooter: some View {
if let account = accounts.current {
let locationType = account.isPublic ? (account.country ?? "Unknown") : "Custom".localized()
let description = account.isPublic ? account.url : account.instance?.description ?? "unknown".localized()
Text("Current: \(locationType)\n\(description)")
.foregroundColor(.secondary)
#if os(macOS)
.padding(.bottom, 10)
#endif
}
}
func loadCountries() {
InstancesManifest.shared.configure()
InstancesManifest.shared.instancesList?.load()
.onSuccess { response in
if let instances: [ManifestedInstance] = response.typedContent() {
self.countries = instances.map(\.country).unique().sorted()
}
}
.onFailure { _ in
settings.presentAlert(title: "Could not load locations manifest".localized())
}
}
private var addInstanceButton: some View {
Button {
presentingInstanceForm = true
} label: {
Label("Add Location...", systemImage: "plus")
}
}
}
struct AdvancedSettings_Previews: PreviewProvider {
static var previews: some View {
AdvancedSettings()
.injectFixtureEnvironmentObjects()
}
}