From e868b6a6cb8a17d17585668a0fb019efb1ced0dc Mon Sep 17 00:00:00 2001 From: Christopher Schindler Date: Fri, 14 Jun 2024 15:02:07 +0200 Subject: [PATCH] Account: configures the maximum image size for uploading avatar and header --- .../Account/Edit/EditAccountViewModel.swift | 52 +++++++++++++++---- 1 file changed, 43 insertions(+), 9 deletions(-) diff --git a/Packages/Account/Sources/Account/Edit/EditAccountViewModel.swift b/Packages/Account/Sources/Account/Edit/EditAccountViewModel.swift index 221b0b31..50f10491 100644 --- a/Packages/Account/Sources/Account/Edit/EditAccountViewModel.swift +++ b/Packages/Account/Sources/Account/Edit/EditAccountViewModel.swift @@ -51,17 +51,19 @@ import SwiftUI didSet { if let item = mediaPickers.first { Task { - if let data = await getItemImageData(item: item) { if isChangingAvatar { - _ = await uploadAvatar(data: data) + if let data = await getItemImageData(item: item, for: .avatar) { + _ = await uploadAvatar(data: data) + } + isChangingAvatar = false } else if isChangingHeader { - _ = await uploadHeader(data: data) + if let data = await getItemImageData(item: item, for: .header) { + _ = await uploadHeader(data: data) + } + isChangingHeader = false } await fetchAccount() - isChangingAvatar = false - isChangingHeader = false mediaPickers = [] - } } } } @@ -140,16 +142,48 @@ import SwiftUI } } - private func getItemImageData(item: PhotosPickerItem) async -> Data? { + private func getItemImageData(item: PhotosPickerItem, for type: ItemType) async -> Data? { guard let imageFile = try? await item.loadTransferable(type: StatusEditor.ImageFileTranseferable.self) else { return nil } let compressor = StatusEditor.Compressor() guard let compressedData = await compressor.compressImageFrom(url: imageFile.url), let image = UIImage(data: compressedData), - let uploadData = try? await compressor.compressImageForUpload(image) - else { return nil } + let uploadData = try? await compressor.compressImageForUpload( + image, + maxSize: 2 * 1024 * 1024, // 2MB + maxHeight: type.maxHeight, + maxWidth: type.maxWidth + ) + else { + return nil + } return uploadData } } + +extension EditAccountViewModel { + private enum ItemType { + case avatar + case header + + var maxHeight: CGFloat { + switch self { + case .avatar: + 400 + case .header: + 500 + } + } + + var maxWidth: CGFloat { + switch self { + case .avatar: + 400 + case .header: + 1500 + } + } + } +}