// // Extensions.swift // Werkout_ios // // Created by Trey Tartt on 6/20/23. // import Foundation extension Dictionary { func percentEncoded() -> Data? { map { key, value in let escapedKey = "\(key)".addingPercentEncoding(withAllowedCharacters: .urlQueryValueAllowed) ?? "" let escapedValue = "\(value)".addingPercentEncoding(withAllowedCharacters: .urlQueryValueAllowed) ?? "" return escapedKey + "=" + escapedValue } .joined(separator: "&") .data(using: .utf8) } } extension CharacterSet { static let urlQueryValueAllowed: CharacterSet = { let generalDelimitersToEncode = ":#[]@" // does not include "?" or "/" due to RFC 3986 - Section 3.4 let subDelimitersToEncode = "!$&'()*+,;=" var allowed: CharacterSet = .urlQueryAllowed allowed.remove(charactersIn: "\(generalDelimitersToEncode)\(subDelimitersToEncode)") return allowed }() } extension Date { var timeFormatForUpload: String { let isoFormatter = DateFormatter() isoFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ssX" return isoFormatter.string(from: self) } } extension String { var dateFromServerDate: Date? { let df = DateFormatter() df.dateFormat = "yyyy-MM-dd'T'HH:mm:ssX" df.locale = Locale(identifier: "en_US_POSIX") return df.date(from: self) } var plannedDate: Date? { let df = DateFormatter() df.dateFormat = "yyyy-MM-dd" df.locale = Locale(identifier: "en_US_POSIX") return df.date(from: self) } } extension Date { func get(_ components: Calendar.Component..., calendar: Calendar = Calendar.current) -> DateComponents { return calendar.dateComponents(Set(components), from: self) } func get(_ component: Calendar.Component, calendar: Calendar = Calendar.current) -> Int { return calendar.component(component, from: self) } var formatForPlannedWorkout: String { let df = DateFormatter() df.dateFormat = "yyyy-MM-dd" df.locale = Locale(identifier: "en_US_POSIX") return df.string(from: self) } var weekDay: String { let dateFormatter = DateFormatter() dateFormatter.dateFormat = "EEE" let weekDay = dateFormatter.string(from: self) return weekDay } var monthString: String { let dateFormatter = DateFormatter() dateFormatter.dateFormat = "MMM" let weekDay = dateFormatter.string(from: self) return weekDay } var dateString: String { let dateFormatter = DateFormatter() dateFormatter.dateFormat = "d" let weekDay = dateFormatter.string(from: self) return weekDay } }