metatext/Views/SwiftUI/PreferencesView.swift

213 lines
10 KiB
Swift
Raw Normal View History

2020-08-07 01:41:59 +00:00
// Copyright © 2020 Metabolist. All rights reserved.
2021-03-06 02:25:18 +00:00
import Combine
2021-01-29 05:45:15 +00:00
import Mastodon
2020-08-07 01:41:59 +00:00
import SwiftUI
2020-09-01 07:33:49 +00:00
import ViewModels
2020-08-07 01:41:59 +00:00
2020-08-07 10:59:48 +00:00
struct PreferencesView: View {
@StateObject var viewModel: PreferencesViewModel
2021-01-29 05:45:15 +00:00
@StateObject var identityContext: IdentityContext
2021-02-11 02:04:04 +00:00
@EnvironmentObject var rootViewModel: RootViewModel
2021-01-29 05:45:15 +00:00
@Environment(\.accessibilityReduceMotion) var accessibilityReduceMotion
init(viewModel: PreferencesViewModel) {
_viewModel = StateObject(wrappedValue: viewModel)
_identityContext = StateObject(wrappedValue: viewModel.identityContext)
}
2020-08-07 10:59:48 +00:00
2020-08-07 01:41:59 +00:00
var body: some View {
2020-08-07 10:14:14 +00:00
Form {
2021-01-29 05:45:15 +00:00
Section(header: Text(viewModel.identityContext.identity.handle)) {
if viewModel.identityContext.identity.authenticated
&& !viewModel.identityContext.identity.pending {
NavigationLink("preferences.filters",
destination: FiltersView(
viewModel: .init(identityContext: viewModel.identityContext)))
2021-01-29 05:45:15 +00:00
if viewModel.shouldShowNotificationTypePreferences {
NavigationLink("preferences.notification-types",
destination: NotificationTypesPreferencesView(
viewModel: .init(identityContext: viewModel.identityContext)))
}
2021-02-11 02:04:04 +00:00
Button("preferences.muted-users") {
rootViewModel.navigationViewModel?.navigateToMutedUsers()
}
.foregroundColor(.primary)
Button("preferences.blocked-users") {
rootViewModel.navigationViewModel?.navigateToBlockedUsers()
}
.foregroundColor(.primary)
2021-01-29 05:45:15 +00:00
NavigationLink("preferences.blocked-domains",
destination: DomainBlocksView(viewModel: viewModel.domainBlocksViewModel()))
Toggle("preferences.use-preferences-from-server",
isOn: $viewModel.preferences.useServerPostingReadingPreferences)
Group {
Picker("preferences.posting-default-visiblility",
selection: $viewModel.preferences.postingDefaultVisibility) {
Text("status.visibility.public").tag(Status.Visibility.public)
Text("status.visibility.unlisted").tag(Status.Visibility.unlisted)
Text("status.visibility.private").tag(Status.Visibility.private)
}
Toggle("preferences.posting-default-sensitive",
isOn: $viewModel.preferences.postingDefaultSensitive)
}
.disabled(viewModel.preferences.useServerPostingReadingPreferences)
}
Group {
Picker("preferences.reading-expand-media",
selection: $viewModel.preferences.readingExpandMedia) {
Text("preferences.expand-media.default").tag(Preferences.ExpandMedia.default)
Text("preferences.expand-media.show-all").tag(Preferences.ExpandMedia.showAll)
Text("preferences.expand-media.hide-all").tag(Preferences.ExpandMedia.hideAll)
}
Toggle("preferences.reading-expand-spoilers",
isOn: $viewModel.preferences.readingExpandSpoilers)
}
2021-01-31 16:10:34 +00:00
.disabled(viewModel.preferences.useServerPostingReadingPreferences
&& viewModel.identityContext.identity.authenticated)
2020-08-07 10:14:14 +00:00
}
2020-10-15 07:44:01 +00:00
Section(header: Text("preferences.app")) {
2021-03-04 07:22:32 +00:00
Group {
if UIApplication.shared.supportsAlternateIcons {
NavigationLink(destination: AppIconPreferencesView(viewModel: viewModel)) {
HStack {
Text("preferences.app-icon")
Spacer()
if let appIcon = AppIcon.current {
if let image = appIcon.image {
image
.resizable()
.frame(
width: UIFont.preferredFont(forTextStyle: .body).lineHeight,
height: UIFont.preferredFont(forTextStyle: .body).lineHeight)
.cornerRadius(.defaultCornerRadius / 2)
}
Text(appIcon.nameLocalizedStringKey)
.foregroundColor(.secondary)
}
}
}
}
NavigationLink("preferences.notifications",
destination: NotificationPreferencesView(viewModel: viewModel))
Picker("preferences.status-word",
selection: $identityContext.appPreferences.statusWord) {
ForEach(AppPreferences.StatusWord.allCases) { option in
Text(option.localizedStringKey).tag(option)
}
}
Toggle("preferences.show-reblog-and-favorite-counts",
isOn: $identityContext.appPreferences.showReblogAndFavoriteCounts)
Toggle("preferences.require-double-tap-to-reblog",
isOn: $identityContext.appPreferences.requireDoubleTapToReblog)
Toggle("preferences.require-double-tap-to-favorite",
isOn: $identityContext.appPreferences.requireDoubleTapToFavorite)
Toggle("preferences.links.open-in-default-browser",
isOn: $identityContext.appPreferences.openLinksInDefaultBrowser)
if !identityContext.appPreferences.openLinksInDefaultBrowser {
Toggle("preferences.links.use-universal-links",
isOn: $identityContext.appPreferences.useUniversalLinks)
}
2021-01-29 05:45:15 +00:00
}
Group {
Picker("preferences.media.autoplay.gifs",
2021-03-06 02:25:18 +00:00
selection: $identityContext.appPreferences.autoplayGIFs) {
2021-01-29 05:45:15 +00:00
ForEach(AppPreferences.Autoplay.allCases) { option in
Text(option.localizedStringKey).tag(option)
}
}
Picker("preferences.media.autoplay.videos",
2021-03-06 02:25:18 +00:00
selection: $identityContext.appPreferences.autoplayVideos) {
2021-01-29 05:45:15 +00:00
ForEach(AppPreferences.Autoplay.allCases) { option in
Text(option.localizedStringKey).tag(option)
}
}
Picker("preferences.media.avatars.animate",
2021-03-06 02:25:18 +00:00
selection: $identityContext.appPreferences.animateAvatars) {
2021-01-29 05:45:15 +00:00
ForEach(AppPreferences.AnimateAvatars.allCases) { option in
Text(option.localizedStringKey).tag(option)
}
}
2021-02-22 07:10:34 +00:00
Toggle("preferences.media.custom-emojis.animate",
2021-03-06 02:25:18 +00:00
isOn: $identityContext.appPreferences.animateCustomEmojis)
2021-02-23 04:43:08 +00:00
Toggle("preferences.media.headers.animate",
2021-03-06 02:25:18 +00:00
isOn: $identityContext.appPreferences.animateHeaders)
2021-01-29 05:45:15 +00:00
}
2021-01-31 16:10:34 +00:00
if viewModel.identityContext.identity.authenticated
&& !viewModel.identityContext.identity.pending {
Picker("preferences.home-timeline-position-on-startup",
selection: $identityContext.appPreferences.homeTimelineBehavior) {
ForEach(AppPreferences.PositionBehavior.allCases) { option in
Text(option.localizedStringKey).tag(option)
}
2021-01-29 05:45:15 +00:00
}
}
2020-10-15 07:44:01 +00:00
}
2020-08-07 10:14:14 +00:00
}
2020-08-07 10:59:48 +00:00
.navigationTitle("preferences")
2021-01-29 05:45:15 +00:00
.alertItem($viewModel.alertItem)
2021-03-06 02:25:18 +00:00
.onReceive(NotificationCenter.default.publisher(
for: UIAccessibility.videoAutoplayStatusDidChangeNotification)) { _ in
viewModel.objectWillChange.send()
}
2021-01-29 05:45:15 +00:00
}
}
2021-01-31 01:43:48 +00:00
extension AppPreferences.StatusWord {
var localizedStringKey: LocalizedStringKey {
switch self {
case .toot:
return "toot"
case .post:
return "post"
}
}
}
2021-01-29 05:45:15 +00:00
extension AppPreferences.AnimateAvatars {
var localizedStringKey: LocalizedStringKey {
switch self {
case .everywhere:
return "preferences.media.avatars.animate.everywhere"
case .profiles:
return "preferences.media.avatars.animate.profiles"
case .never:
return "preferences.media.avatars.animate.never"
}
}
}
extension AppPreferences.Autoplay {
var localizedStringKey: LocalizedStringKey {
switch self {
case .always:
return "preferences.media.autoplay.always"
case .wifi:
return "preferences.media.autoplay.wifi"
case .never:
return "preferences.media.autoplay.never"
}
}
}
extension AppPreferences.PositionBehavior {
var localizedStringKey: LocalizedStringKey {
switch self {
2021-02-08 20:33:51 +00:00
case .localRememberPosition:
2021-01-29 05:45:15 +00:00
return "preferences.position.remember-position"
case .newest:
return "preferences.position.newest"
}
2020-08-07 01:41:59 +00:00
}
}
2020-08-12 07:37:14 +00:00
#if DEBUG
2020-09-01 07:33:49 +00:00
import PreviewViewModels
2020-08-07 01:41:59 +00:00
struct PreferencesView_Previews: PreviewProvider {
static var previews: some View {
2021-01-26 00:06:35 +00:00
PreferencesView(viewModel: .init(identityContext: .preview))
2020-08-07 01:41:59 +00:00
}
}
2020-08-12 07:37:14 +00:00
#endif