Version 1.4 - Translations, Like toasts Queue redesign.

This commit is contained in:
2026-04-09 16:54:41 +02:00
parent ec1ffcb0b1
commit 5f3902cb54
30 changed files with 3472 additions and 654 deletions
@@ -0,0 +1,64 @@
//
// ViewsComponentsToastOverlay.swift
// Mobile Music Assistant
//
// Created by Sven Hanold on 09.04.26.
//
import SwiftUI
// MARK: - Toast Manager
@Observable
class MAToastManager {
private(set) var message: String = ""
private(set) var icon: String = "heart.fill"
private(set) var iconColor: Color = .red
private(set) var isVisible: Bool = false
private var hideTask: Task<Void, Never>?
func show(_ message: String, icon: String = "heart.fill", iconColor: Color = .red) {
self.message = message
self.icon = icon
self.iconColor = iconColor
withAnimation(.spring(duration: 0.3)) { isVisible = true }
hideTask?.cancel()
hideTask = Task { @MainActor in
try? await Task.sleep(for: .seconds(2))
guard !Task.isCancelled else { return }
withAnimation(.easeOut(duration: 0.4)) { isVisible = false }
}
}
}
// MARK: - Toast View Modifier
struct ToastOverlayModifier: ViewModifier {
@Environment(MAToastManager.self) private var toastManager
func body(content: Content) -> some View {
content.overlay(alignment: .top) {
if toastManager.isVisible {
HStack(spacing: 8) {
Image(systemName: toastManager.icon)
.foregroundStyle(toastManager.iconColor)
Text(toastManager.message)
.font(.subheadline.weight(.medium))
.lineLimit(1)
}
.padding(.horizontal, 18)
.padding(.vertical, 11)
.background(.ultraThinMaterial, in: Capsule())
.shadow(color: .black.opacity(0.15), radius: 8, y: 4)
.padding(.top, 12)
.transition(.move(edge: .top).combined(with: .opacity))
}
}
}
}
extension View {
func withToast() -> some View {
modifier(ToastOverlayModifier())
}
}