From f3e2940e00cf29b5dd6d47681b1bb712b88cf2cb Mon Sep 17 00:00:00 2001 From: desp0o Date: Fri, 18 Apr 2025 20:04:16 +0400 Subject: [PATCH] create toast stack --- .../contents.xcworkspacedata | 7 +++ .../UserInterfaceState.xcuserstate | Bin 0 -> 27115 bytes .../xcschemes/xcschememanagement.plist | 14 ++++++ Sources/ToastKit/ToastKit.swift | 8 +-- .../ToastStack/ToastStackManager.swift | 47 ++++++++++++++++++ .../ToastKit/ToastStack/ToastStackView.swift | 41 +++++++++++++++ 6 files changed, 114 insertions(+), 3 deletions(-) create mode 100644 .swiftpm/xcode/package.xcworkspace/contents.xcworkspacedata create mode 100644 .swiftpm/xcode/package.xcworkspace/xcuserdata/macintoshi.xcuserdatad/UserInterfaceState.xcuserstate create mode 100644 .swiftpm/xcode/xcuserdata/macintoshi.xcuserdatad/xcschemes/xcschememanagement.plist create mode 100644 Sources/ToastKit/ToastStack/ToastStackManager.swift create mode 100644 Sources/ToastKit/ToastStack/ToastStackView.swift diff --git a/.swiftpm/xcode/package.xcworkspace/contents.xcworkspacedata b/.swiftpm/xcode/package.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..919434a --- /dev/null +++ b/.swiftpm/xcode/package.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/.swiftpm/xcode/package.xcworkspace/xcuserdata/macintoshi.xcuserdatad/UserInterfaceState.xcuserstate b/.swiftpm/xcode/package.xcworkspace/xcuserdata/macintoshi.xcuserdatad/UserInterfaceState.xcuserstate new file mode 100644 index 0000000000000000000000000000000000000000..21acd0eba87e2399345e5f8e7d57b3f6849d4c5e GIT binary patch literal 27115 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 a8Rj-@(6G)I_hKyNTgdd%r}g)+fd2(N4Wjq} literal 0 HcmV?d00001 diff --git a/.swiftpm/xcode/xcuserdata/macintoshi.xcuserdatad/xcschemes/xcschememanagement.plist b/.swiftpm/xcode/xcuserdata/macintoshi.xcuserdatad/xcschemes/xcschememanagement.plist new file mode 100644 index 0000000..5e8c333 --- /dev/null +++ b/.swiftpm/xcode/xcuserdata/macintoshi.xcuserdatad/xcschemes/xcschememanagement.plist @@ -0,0 +1,14 @@ + + + + + SchemeUserState + + ToastKit.xcscheme_^#shared#^_ + + orderHint + 0 + + + + diff --git a/Sources/ToastKit/ToastKit.swift b/Sources/ToastKit/ToastKit.swift index d79d9c5..444d962 100644 --- a/Sources/ToastKit/ToastKit.swift +++ b/Sources/ToastKit/ToastKit.swift @@ -32,6 +32,7 @@ public struct CustomToast: View { let innerVpadding: CGFloat let outterHpadding: CGFloat let stackAligment: Alignment + let isStackMaxHeight: Bool let cornerRadius: CGFloat @@ -83,6 +84,7 @@ public struct CustomToast: View { innerVpadding: CGFloat = 10, outterHpadding: CGFloat = 20, stackAligment: Alignment = .top, + isStackMaxHeight: Bool = true, cornerRadius: CGFloat = 12, @@ -132,6 +134,7 @@ public struct CustomToast: View { self.innerVpadding = innerVpadding self.outterHpadding = outterHpadding self.stackAligment = stackAligment + self.isStackMaxHeight = isStackMaxHeight self.cornerRadius = cornerRadius @@ -232,7 +235,8 @@ public struct CustomToast: View { .padding(.horizontal, outterHpadding) } } - .frame(maxWidth: .infinity, maxHeight: .infinity, alignment: stackAligment) + .frame(maxWidth: .infinity, alignment: stackAligment) + .if(isStackMaxHeight) { $0.frame(maxWidth: .infinity, maxHeight: .infinity, alignment: stackAligment)} .onChange(of: isVisible) { _, newValue in if newValue { if autoDisappear { @@ -261,5 +265,3 @@ public struct CustomToast: View { } } } - - diff --git a/Sources/ToastKit/ToastStack/ToastStackManager.swift b/Sources/ToastKit/ToastStack/ToastStackManager.swift new file mode 100644 index 0000000..0065f58 --- /dev/null +++ b/Sources/ToastKit/ToastStack/ToastStackManager.swift @@ -0,0 +1,47 @@ +// +// ToastStackManager.swift +// ToastKit +// +// Created by Despo on 18.04.25. +// +import SwiftUI + +@available(macOS 14.0, *) +@available(iOS 17, *) +struct ToastItemModel: Identifiable, Equatable { + let id = UUID() + let title: String + let toastColor: ToastColorTypes + let autoDisappearDuration: TimeInterval + let isStackMaxHeight: Bool = false + + static func == (lhs: ToastItemModel, rhs: ToastItemModel) -> Bool { + return lhs.id == rhs.id + } +} + +@available(macOS 14.0, *) +@available(iOS 17, *) + +@MainActor +class ToastStackManager: ObservableObject { + @Published var toasts: [ToastItemModel] = [] + + func show(title: String, toastColor: ToastColorTypes, autoDisappearDuration: TimeInterval = 2.0) { + let toast = ToastItemModel( + title: title, + toastColor: toastColor, + autoDisappearDuration: autoDisappearDuration + ) + + toasts.insert(toast, at: 0) + + DispatchQueue.main.asyncAfter(deadline: .now() + autoDisappearDuration) { [weak self] in + self?.removeToast(toast) + } + } + + private func removeToast(_ toast: ToastItemModel) { + toasts.removeAll { $0.id == toast.id } + } +} diff --git a/Sources/ToastKit/ToastStack/ToastStackView.swift b/Sources/ToastKit/ToastStack/ToastStackView.swift new file mode 100644 index 0000000..cb24063 --- /dev/null +++ b/Sources/ToastKit/ToastStack/ToastStackView.swift @@ -0,0 +1,41 @@ +// +// ToastStackView.swift +// ToastKit +// +// Created by Despo on 18.04.25. +// + +import SwiftUI + +@available(macOS 14.0, *) +@available(iOS 17, *) +struct ToastStackView: View { + @StateObject var vm: ToastStackManager + let transitionType: AnyTransition + + init( + vm: ToastStackManager, + transitionType: AnyTransition = .move(edge: .top).combined(with: .opacity) + ) { + _vm = StateObject(wrappedValue: vm) + self.transitionType = transitionType + } + + var body: some View { + VStack { + ForEach(vm.toasts, id: \.id) { toast in + ZStack { + CustomToast( + isVisible: .constant(true), + title: toast.title, + toastColor: toast.toastColor, + isStackMaxHeight: toast.isStackMaxHeight + ) + } + .transition(transitionType) + } + } + .frame(maxWidth: .infinity, maxHeight: .infinity,alignment: .top) + .animation(.bouncy, value: vm.toasts) + } +}