forked from shadowfacts/Tusker
Move AsyncToggle to TuskerComponents
This commit is contained in:
parent
bdd4a4d755
commit
f02afaac26
|
@ -1,6 +1,6 @@
|
|||
//
|
||||
// TriStateToggle.swift
|
||||
// Tusker
|
||||
// AsyncToggle.swift
|
||||
// TuskerComponents
|
||||
//
|
||||
// Created by Shadowfacts on 4/7/24.
|
||||
// Copyright © 2024 Shadowfacts. All rights reserved.
|
||||
|
@ -8,26 +8,21 @@
|
|||
|
||||
import SwiftUI
|
||||
|
||||
struct TriStateToggle: View {
|
||||
public struct AsyncToggle: View {
|
||||
let titleKey: LocalizedStringKey
|
||||
@available(iOS, obsoleted: 16.0, message: "Switch to LabeledContent")
|
||||
let labelHidden: Bool
|
||||
@Binding var mode: Mode
|
||||
let onChange: (Bool) async -> Void
|
||||
|
||||
init(_ titleKey: LocalizedStringKey, labelHidden: Bool = false, mode: Binding<Mode>, onChange: @escaping (Bool) async -> Void) {
|
||||
public init(_ titleKey: LocalizedStringKey, labelHidden: Bool = false, mode: Binding<Mode>, onChange: @escaping (Bool) async -> Void) {
|
||||
self.titleKey = titleKey
|
||||
self.labelHidden = labelHidden
|
||||
self._mode = mode
|
||||
self.onChange = onChange
|
||||
}
|
||||
|
||||
var body: some View {
|
||||
content
|
||||
}
|
||||
|
||||
@ViewBuilder
|
||||
private var content: some View {
|
||||
public var body: some View {
|
||||
if #available(iOS 16.0, *) {
|
||||
LabeledContent(titleKey) {
|
||||
toggleOrSpinner
|
||||
|
@ -64,7 +59,7 @@ struct TriStateToggle: View {
|
|||
}
|
||||
}
|
||||
|
||||
enum Mode {
|
||||
public enum Mode {
|
||||
case off
|
||||
case loading
|
||||
case on
|
||||
|
@ -72,8 +67,8 @@ struct TriStateToggle: View {
|
|||
}
|
||||
|
||||
#Preview {
|
||||
@State var mode = TriStateToggle.Mode.on
|
||||
return TriStateToggle("", mode: $mode) { _ in
|
||||
@State var mode = AsyncToggle.Mode.on
|
||||
return AsyncToggle("", mode: $mode) { _ in
|
||||
try! await Task.sleep(nanoseconds: NSEC_PER_SEC)
|
||||
}
|
||||
}
|
|
@ -133,7 +133,6 @@
|
|||
D6552367289870790048A653 /* ScreenCorners in Frameworks */ = {isa = PBXBuildFile; platformFilters = (ios, maccatalyst, ); productRef = D6552366289870790048A653 /* ScreenCorners */; };
|
||||
D659F35E2953A212002D944A /* TTTKit in Frameworks */ = {isa = PBXBuildFile; productRef = D659F35D2953A212002D944A /* TTTKit */; };
|
||||
D659F36229541065002D944A /* TTTView.swift in Sources */ = {isa = PBXBuildFile; fileRef = D659F36129541065002D944A /* TTTView.swift */; };
|
||||
D65A261B2BC3928A005EB5D8 /* TriStateToggle.swift in Sources */ = {isa = PBXBuildFile; fileRef = D65A261A2BC3928A005EB5D8 /* TriStateToggle.swift */; };
|
||||
D65A261D2BC39399005EB5D8 /* PushInstanceSettingsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = D65A261C2BC39399005EB5D8 /* PushInstanceSettingsView.swift */; };
|
||||
D65B4B542971F71D00DABDFB /* EditedReport.swift in Sources */ = {isa = PBXBuildFile; fileRef = D65B4B532971F71D00DABDFB /* EditedReport.swift */; };
|
||||
D65B4B562971F98300DABDFB /* ReportView.swift in Sources */ = {isa = PBXBuildFile; fileRef = D65B4B552971F98300DABDFB /* ReportView.swift */; };
|
||||
|
@ -536,7 +535,6 @@
|
|||
D6531DED246B81C9000F9538 /* GifvPlayerView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GifvPlayerView.swift; sourceTree = "<group>"; };
|
||||
D6538944214D6D7500E3CEFC /* TableViewSwipeActionProvider.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TableViewSwipeActionProvider.swift; sourceTree = "<group>"; };
|
||||
D659F36129541065002D944A /* TTTView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TTTView.swift; sourceTree = "<group>"; };
|
||||
D65A261A2BC3928A005EB5D8 /* TriStateToggle.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TriStateToggle.swift; sourceTree = "<group>"; };
|
||||
D65A261C2BC39399005EB5D8 /* PushInstanceSettingsView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PushInstanceSettingsView.swift; sourceTree = "<group>"; };
|
||||
D65A26242BC39A02005EB5D8 /* PushNotifications */ = {isa = PBXFileReference; lastKnownFileType = wrapper; path = PushNotifications; sourceTree = "<group>"; };
|
||||
D65B4B532971F71D00DABDFB /* EditedReport.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EditedReport.swift; sourceTree = "<group>"; };
|
||||
|
@ -1203,7 +1201,6 @@
|
|||
D64B967B2BC19C28002C8990 /* NotificationsPrefsView.swift */,
|
||||
D65A261C2BC39399005EB5D8 /* PushInstanceSettingsView.swift */,
|
||||
D64B96832BC3893C002C8990 /* PushSubscriptionView.swift */,
|
||||
D65A261A2BC3928A005EB5D8 /* TriStateToggle.swift */,
|
||||
);
|
||||
path = Notifications;
|
||||
sourceTree = "<group>";
|
||||
|
@ -2153,7 +2150,6 @@
|
|||
D6333B792139AEFD00CE884A /* Date+TimeAgo.swift in Sources */,
|
||||
D6D706A029466649000827ED /* ScrollingSegmentedControl.swift in Sources */,
|
||||
D686BBE324FBF8110068E6AA /* WrappedProgressView.swift in Sources */,
|
||||
D65A261B2BC3928A005EB5D8 /* TriStateToggle.swift in Sources */,
|
||||
D620483423D3801D008A63EF /* LinkTextView.swift in Sources */,
|
||||
D61F75882932DB6000C0B37F /* StatusSwipeActions.swift in Sources */,
|
||||
D68A76EA295285D0001DA1B3 /* AddHashtagPinnedTimelineView.swift in Sources */,
|
||||
|
|
|
@ -10,10 +10,11 @@ import SwiftUI
|
|||
import UserNotifications
|
||||
import UserAccounts
|
||||
import PushNotifications
|
||||
import TuskerComponents
|
||||
|
||||
struct NotificationsPrefsView: View {
|
||||
@State private var error: NotificationsSetupError?
|
||||
@State private var isSetup = TriStateToggle.Mode.off
|
||||
@State private var isSetup = AsyncToggle.Mode.off
|
||||
@State private var pushProxyRegistration: PushProxyRegistration?
|
||||
@ObservedObject private var userAccounts = UserAccountsManager.shared
|
||||
|
||||
|
@ -32,7 +33,7 @@ struct NotificationsPrefsView: View {
|
|||
|
||||
private var enableSection: some View {
|
||||
Section {
|
||||
TriStateToggle("Push Notifications", mode: $isSetup, onChange: isSetupChanged(newValue:))
|
||||
AsyncToggle("Push Notifications", mode: $isSetup, onChange: isSetupChanged(newValue:))
|
||||
}
|
||||
.appGroupedListRowBackground()
|
||||
.alertWithData("An Error Occurred", data: $error) { error in
|
||||
|
|
|
@ -10,11 +10,12 @@ import SwiftUI
|
|||
import UserAccounts
|
||||
import Pachyderm
|
||||
import PushNotifications
|
||||
import TuskerComponents
|
||||
|
||||
struct PushInstanceSettingsView: View {
|
||||
let account: UserAccountInfo
|
||||
let pushProxyRegistration: PushProxyRegistration
|
||||
@State private var mode: TriStateToggle.Mode
|
||||
@State private var mode: AsyncToggle.Mode
|
||||
@State private var error: Error?
|
||||
@State private var subscription: PushNotifications.PushSubscription?
|
||||
|
||||
|
@ -32,7 +33,7 @@ struct PushInstanceSettingsView: View {
|
|||
HStack {
|
||||
PrefsAccountView(account: account)
|
||||
Spacer()
|
||||
TriStateToggle("\(account.instanceURL.host!) notifications enabled", labelHidden: true, mode: $mode, onChange: updateNotificationsEnabled(enabled:))
|
||||
AsyncToggle("\(account.instanceURL.host!) notifications enabled", labelHidden: true, mode: $mode, onChange: updateNotificationsEnabled(enabled:))
|
||||
.labelsHidden()
|
||||
}
|
||||
PushSubscriptionView(account: account, subscription: subscription, updateSubscription: updateSubscription)
|
||||
|
|
|
@ -9,6 +9,7 @@
|
|||
import SwiftUI
|
||||
import UserAccounts
|
||||
import PushNotifications
|
||||
import TuskerComponents
|
||||
|
||||
struct PushSubscriptionView: View {
|
||||
let account: UserAccountInfo
|
||||
|
@ -39,7 +40,7 @@ private struct PushSubscriptionSettingsView: View {
|
|||
|
||||
var body: some View {
|
||||
VStack(alignment: .prefsAvatar) {
|
||||
TriStateToggle("Mentions", mode: alertsBinding(for: .mention)) {
|
||||
AsyncToggle("Mentions", mode: alertsBinding(for: .mention)) {
|
||||
await onChange(alert: .mention, value: $0)
|
||||
}
|
||||
}
|
||||
|
@ -51,7 +52,7 @@ private struct PushSubscriptionSettingsView: View {
|
|||
.padding(.leading, 38)
|
||||
}
|
||||
|
||||
private func alertsBinding(for alert: PushSubscription.Alerts) -> Binding<TriStateToggle.Mode> {
|
||||
private func alertsBinding(for alert: PushSubscription.Alerts) -> Binding<AsyncToggle.Mode> {
|
||||
return Binding {
|
||||
isLoading[alert] == true ? .loading : subscription.alerts.contains(alert) ? .on : .off
|
||||
} set: { newValue in
|
||||
|
|
Loading…
Reference in New Issue