@@ -11,7 +11,27 @@ struct ImageUploadService: ImageUploader {
1111 self . client = URLSessionHTTPClient ( urlSession: urlSession)
1212 }
1313
14+ func uploadImage(
15+ _ image: UIImage ,
16+ accessToken: String ,
17+ avatarSelectionPolicy selectionPolicy: AvatarUploadSelectionPolicy ,
18+ additionalHTTPHeaders: [ HTTPHeaderField ] ?
19+ ) async throws -> ( data: Data , response: HTTPURLResponse ) {
20+ guard let data: Data = {
21+ if #available( iOS 17 . 0 , * ) {
22+ image. heicData ( )
23+ } else {
24+ image. jpegData ( compressionQuality: 0.8 )
25+ }
26+ } ( ) else {
27+ throw ImageUploadError . cannotConvertImageIntoData
28+ }
29+
30+ return try await uploadImage ( data: data, accessToken: accessToken, selectionPolicy: selectionPolicy, additionalHTTPHeaders: additionalHTTPHeaders)
31+ }
32+
1433 @discardableResult
34+ @available ( * , deprecated, message: " Use `uploadImage(_:accessToken:avatarSelectionPolicy:additionalHTTPHeaders:)` instead. " )
1535 func uploadImage(
1636 _ image: UIImage ,
1737 accessToken: String ,
@@ -28,20 +48,25 @@ struct ImageUploadService: ImageUploader {
2848 throw ImageUploadError . cannotConvertImageIntoData
2949 }
3050
31- return try await uploadImage ( data: data, accessToken: accessToken, avatarSelection: avatarSelection, additionalHTTPHeaders: additionalHTTPHeaders)
51+ return try await uploadImage (
52+ data: data,
53+ accessToken: accessToken,
54+ selectionPolicy: avatarSelection. map ( ) ,
55+ additionalHTTPHeaders: additionalHTTPHeaders
56+ )
3257 }
3358
3459 private func uploadImage(
3560 data: Data ,
3661 accessToken: String ,
37- avatarSelection : AvatarSelection ,
62+ selectionPolicy : AvatarUploadSelectionPolicy ,
3863 additionalHTTPHeaders: [ HTTPHeaderField ] ?
3964 ) async throws -> ( Data , HTTPURLResponse ) {
4065 let boundary = " \( UUID ( ) . uuidString) "
4166 let request = URLRequest . imageUploadRequest (
4267 with: boundary,
4368 additionalHTTPHeaders: additionalHTTPHeaders,
44- selectionBehavior : avatarSelection
69+ selectionPolicy : selectionPolicy
4570 ) . settingAuthorizationHeaderField ( with: accessToken)
4671
4772 let body = imageUploadBody ( with: data, boundary: boundary)
@@ -89,9 +114,9 @@ extension URLRequest {
89114 fileprivate static func imageUploadRequest(
90115 with boundary: String ,
91116 additionalHTTPHeaders: [ HTTPHeaderField ] ? ,
92- selectionBehavior : AvatarSelection
117+ selectionPolicy : AvatarUploadSelectionPolicy
93118 ) -> URLRequest {
94- var request = URLRequest ( url: . avatarsURL. appendingQueryItems ( for: selectionBehavior ) )
119+ var request = URLRequest ( url: . avatarsURL. appendingQueryItems ( for: selectionPolicy ) )
95120 request. addValue ( " multipart/form-data; boundary= \( boundary) " , forHTTPHeaderField: " Content-Type " )
96121 request. httpMethod = " POST "
97122 additionalHTTPHeaders? . forEach { headerTuple in
@@ -101,18 +126,18 @@ extension URLRequest {
101126 }
102127}
103128
104- extension AvatarSelection {
129+ extension AvatarUploadSelectionPolicy {
105130 var queryItems : [ URLQueryItem ] {
106- switch self {
107- case . selectUploadedImage( let email ) :
131+ switch policy {
132+ case . selectUploadedImage( let profileID ) :
108133 [
109134 . init( name: " select_avatar " , value: " true " ) ,
110- . init( name: " selected_email_hash " , value: email . id) ,
135+ . init( name: " selected_email_hash " , value: profileID . id) ,
111136 ]
112137 case . preserveSelection:
113138 [ . init( name: " select_avatar " , value: " false " ) ]
114- case . selectUploadedImageIfNoneSelected( let email ) :
115- [ . init( name: " selected_email_hash " , value: email . id) ]
139+ case . selectUploadedImageIfNoneSelected( let profileID ) :
140+ [ . init( name: " selected_email_hash " , value: profileID . id) ]
116141 }
117142 }
118143}
0 commit comments