wake-ios/wake/View/Owner/UserInfo/AvatarPicker.swift
2025-08-22 09:41:01 +08:00

94 lines
3.7 KiB
Swift

import SwiftUI
public struct AvatarPicker: View {
@StateObject private var uploadManager = MediaUploadManager()
@State private var showMediaPicker = false
@State private var isUploading = false
@Binding var selectedImage: UIImage?
@Binding var showUsername: Bool
@Binding var isKeyboardVisible: Bool
public init(selectedImage: Binding<UIImage?>, showUsername: Binding<Bool>, isKeyboardVisible: Binding<Bool>) {
self._selectedImage = selectedImage
self._showUsername = showUsername
self._isKeyboardVisible = isKeyboardVisible
}
public var body: some View {
VStack(spacing: 20) {
// Avatar Image
Button(action: {
showMediaPicker = true
}) {
ZStack {
if let selectedImage = selectedImage {
Image(uiImage: selectedImage)
.resizable()
.scaledToFill()
.frame(width: isKeyboardVisible ? 125 : 225,
height: isKeyboardVisible ? 125 : 225)
.clipShape(RoundedRectangle(cornerRadius: 20))
.animation(.spring(response: 0.4, dampingFraction: 1), value: isKeyboardVisible)
} else {
// Default SVG avatar
SVGImage(svgName: "Avatar")
.frame(width: isKeyboardVisible ? 125 : 225,
height: isKeyboardVisible ? 125 : 225)
.contentShape(Rectangle())
.animation(.spring(response: 0.4, dampingFraction: 1), value: isKeyboardVisible)
}
if isUploading {
ProgressView()
.progressViewStyle(CircularProgressViewStyle())
.scaleEffect(1.5)
}
}
}
if !showUsername {
// Upload button
Button(action: {
showMediaPicker = true
}) {
Text("Upload from Gallery")
.font(Typography.font(for: .subtitle, family: .inter))
.fontWeight(.regular)
.frame(maxWidth: .infinity)
.padding()
.foregroundColor(.black)
.background(
RoundedRectangle(cornerRadius: 16)
.fill(Color.themePrimaryLight)
)
}
.frame(maxWidth: .infinity)
}
}
.sheet(isPresented: $showMediaPicker) {
MediaPicker(
selectedMedia: $uploadManager.selectedMedia,
imageSelectionLimit: 1,
videoSelectionLimit: 0,
allowedMediaTypes: .imagesOnly,
selectionMode: .single,
onDismiss: {
showMediaPicker = false
if !uploadManager.selectedMedia.isEmpty {
isUploading = true
uploadManager.startUpload()
}
}
)
}
.onChange(of: uploadManager.uploadStatus) { _ in
if let firstMedia = uploadManager.selectedMedia.first,
case .image(let image) = firstMedia,
uploadManager.isAllUploaded {
selectedImage = image
isUploading = false
uploadManager.clearAllMedia()
}
}
}
}