Commit 071c1424 by Dmitry Stepanets

Finished GraphQL integration

parent fa853f3c
...@@ -398,16 +398,16 @@ extension ShortsViewController: ViewModelDelegate { ...@@ -398,16 +398,16 @@ extension ShortsViewController: ViewModelDelegate {
//MARK:- ShortsItemCell Delegate //MARK:- ShortsItemCell Delegate
extension ShortsViewController: ShortsItemCellDelegate { extension ShortsViewController: ShortsItemCellDelegate {
private func bottomPart(of sourceImage: UIImage) -> UIImage? { private func bottomPart(of sourceImage: UIImage) -> UIImage? {
let dy: CGFloat = 10 //10pt from bottom let dy: CGFloat = 10 * sourceImage.scale //10pt from bottom
let area = CGRect(x: 0, let area = CGRect(x: 0,
y: sourceImage.size.height - dy, y: sourceImage.size.height * sourceImage.scale - dy,
width: sourceImage.size.width, width: sourceImage.size.width * sourceImage.scale,
height: dy) height: dy)
guard let crop = sourceImage.cgImage?.cropping(to: area) else { guard let crop = sourceImage.cgImage?.cropping(to: area) else {
return nil return nil
} }
return UIImage(cgImage: crop, scale: UIScreen.main.scale, orientation: .up) return UIImage(cgImage: crop)
} }
func averageColor(for short:ShortsItem, shortImage: UIImage, completion: @escaping (UIColor?, String?) -> Void) { func averageColor(for short:ShortsItem, shortImage: UIImage, completion: @escaping (UIColor?, String?) -> Void) {
......
...@@ -47,47 +47,40 @@ public class InMobiGraphQLSource: ShortSource { ...@@ -47,47 +47,40 @@ public class InMobiGraphQLSource: ShortSource {
{"query":"query { weatherCardObjectCollection(where: { AND: [ { expiredAt_gte: \\"\(dateString)\\" } ], }) { items { shortsCategories, sourceUrl, buttonText, publishedAt mediaArrayObjectCollection { items { ... on WImageObject { title, summary image } } } sys { id } } } }"} {"query":"query { weatherCardObjectCollection(where: { AND: [ { expiredAt_gte: \\"\(dateString)\\" } ], }) { items { shortsCategories, sourceUrl, buttonText, publishedAt mediaArrayObjectCollection { items { ... on WImageObject { title, summary image } } } sys { id } } } }"}
""" """
do {
// let jsonData = try JSONEncoder().encode(graphQLString) guard let bodyData = graphQLString.data(using: .utf8) else {
completion(nil, InMobiGraphQLSourceError.dataEncodingError("Invalid GraphQL body"))
return
}
request.httpBody = bodyData
let dataTask = URLSession.shared.dataTask(with: request) { data, response, error in
guard error == nil else {
self.log.debug("Network response: error \(String(describing: error))")
completion(nil, InMobiGraphQLSourceError.networkError(error))
return
}
guard let bodyData = graphQLString.data(using: .utf8) else { guard let data = data else {
completion(nil, InMobiGraphQLSourceError.dataEncodingError("Invalid GraphQL body")) self.log.debug("Network response: error Invalid data")
completion(nil, InMobiGraphQLSourceError.dataEncodingError("Invalid data"))
return return
} }
request.httpBody = bodyData
let dataTask = URLSession.shared.dataTask(with: request) { data, response, error in let decoder = JSONDecoder()
guard error == nil else { decoder.dateDecodingStrategy = .formatted(self.formatter)
self.log.debug("Network response: error \(String(describing: error))") decoder.keyDecodingStrategy = .useDefaultKeys
completion(nil, InMobiGraphQLSourceError.networkError(error)) do {
return let graphQLResponse = try decoder.decode(GrapQLResponse.self, from: data)
} let items = graphQLResponse.weatherItems.map{ self.toAppModel(item: $0) }
completion(items, nil)
guard let data = data else { }
self.log.debug("Network response: error Invalid data") catch {
completion(nil, InMobiGraphQLSourceError.dataEncodingError("Invalid data")) self.log.error("Parsing error: \(error)")
return completion(nil, InMobiGraphQLSourceError.dataEncodingError(error.localizedDescription))
}
let decoder = JSONDecoder()
decoder.dateDecodingStrategy = .formatted(self.formatter)
decoder.keyDecodingStrategy = .useDefaultKeys
do {
let graphQLResponse = try decoder.decode(GrapQLResponse.self, from: data)
let items = graphQLResponse.weatherItems.map{ self.toAppModel(item: $0) }
completion(items, nil)
}
catch {
self.log.error("Parsing error: \(error)")
completion(nil, InMobiGraphQLSourceError.dataEncodingError(error.localizedDescription))
}
} }
dataTask.resume()
}
catch {
self.log.error("Encoding error: \(error)")
completion(nil, InMobiGraphQLSourceError.dataEncodingError(error.localizedDescription))
} }
dataTask.resume()
} }
private func toAppModel(item: WeatherCardItem) -> ShortsItem { private func toAppModel(item: WeatherCardItem) -> ShortsItem {
...@@ -122,18 +115,12 @@ public class InMobiGraphQLSource: ShortSource { ...@@ -122,18 +115,12 @@ public class InMobiGraphQLSource: ShortSource {
return ShortsItem(id: item.id, return ShortsItem(id: item.id,
images: baseImages, images: baseImages,
overlayImages: overlayImages, overlayImages: overlayImages,
updatedAtInSecs: 0,
startsAtInSecs: 0,
endsAtInSecs: 0,
shareURL: item.sourceUrl, shareURL: item.sourceUrl,
title: item.mediaArrayObjectCollection.items.first?.title ?? "", title: item.mediaArrayObjectCollection.items.first?.title ?? "",
summaryText: item.mediaArrayObjectCollection.items.first?.summary ?? "", summaryText: item.mediaArrayObjectCollection.items.first?.summary ?? "",
sourceName: "", sourceName: "",
heartCount: 0,
shortURL: item.sourceUrl, shortURL: item.sourceUrl,
ctaText: item.buttonText, ctaText: item.buttonText,
ctaURL: item.sourceUrl, ctaURL: item.sourceUrl)
likeCount: 0,
shareCount: 0)
} }
} }
...@@ -128,18 +128,12 @@ public class InMobiShortSource: ShortSource { ...@@ -128,18 +128,12 @@ public class InMobiShortSource: ShortSource {
ShortsItem(id: glanceDetails.id, ShortsItem(id: glanceDetails.id,
images: glanceDetails.image.supportedImages.map{ .init(width: $0.width, height: $0.height, url: $0.url) }, images: glanceDetails.image.supportedImages.map{ .init(width: $0.width, height: $0.height, url: $0.url) },
overlayImages: glanceDetails.overlayImage.supportedImages.map{ .init(width: $0.width, height: $0.height, url: $0.url) }, overlayImages: glanceDetails.overlayImage.supportedImages.map{ .init(width: $0.width, height: $0.height, url: $0.url) },
updatedAtInSecs: glanceDetails.updatedAtInSecs,
startsAtInSecs: glanceDetails.startsAtInSecs,
endsAtInSecs: glanceDetails.endsAtInSecs,
shareURL: glanceDetails.encodedShareURL, shareURL: glanceDetails.encodedShareURL,
title: glanceDetails.peekData.title, title: glanceDetails.peekData.title,
summaryText: glanceDetails.peek.articlePeek.summary, summaryText: glanceDetails.peek.articlePeek.summary,
sourceName: glanceDetails.peekData.sourceName, sourceName: glanceDetails.peekData.sourceName,
heartCount: glanceDetails.peekData.heartCount,
shortURL: glanceDetails.peekData.encodedShortURL, shortURL: glanceDetails.peekData.encodedShortURL,
ctaText: glanceDetails.peekData.ctaText, ctaText: glanceDetails.peekData.ctaText,
ctaURL: glanceDetails.peek.articlePeek.cta.encodedUrl, ctaURL: glanceDetails.peek.articlePeek.cta.encodedUrl)
likeCount: glanceDetails.glanceInteractionDetails.likeCount,
shareCount: glanceDetails.glanceInteractionDetails.shareCount)
} }
} }
...@@ -23,42 +23,30 @@ public struct ShortsItem { ...@@ -23,42 +23,30 @@ public struct ShortsItem {
public let id: String public let id: String
public let images: [ShortsItemImage] public let images: [ShortsItemImage]
public let overlayImages: [ShortsItemImage] public let overlayImages: [ShortsItemImage]
public let updatedAtInSecs: TimeInterval
public let startsAtInSecs: TimeInterval
public let endsAtInSecs: TimeInterval
public let shareURL: URL? public let shareURL: URL?
public let title: String public let title: String
public let summaryText: String public let summaryText: String
public let sourceName: String public let sourceName: String
public let heartCount: Int
public let shortURL: URL? public let shortURL: URL?
public let ctaText: String public let ctaText: String
public let ctaURL: URL? public let ctaURL: URL?
public let likeCount: Int
public let shareCount: Int
public var isLiked: Bool = false public var isLiked: Bool = false
public var viewDate: Date? public var viewDate: Date?
public init(id: String, images: [ShortsItemImage], overlayImages: [ShortsItemImage], updatedAtInSecs: TimeInterval, startsAtInSecs: TimeInterval, endsAtInSecs: TimeInterval, shareURL: URL?, title: String, summaryText: String, sourceName: String, heartCount: Int, shortURL: URL?, ctaText: String, ctaURL: URL?, likeCount: Int, shareCount: Int) { public init(id: String, images: [ShortsItemImage], overlayImages: [ShortsItemImage], shareURL: URL?, title: String, summaryText: String, sourceName: String, shortURL: URL?, ctaText: String, ctaURL: URL?) {
self.id = id self.id = id
self.images = images self.images = images
self.overlayImages = overlayImages self.overlayImages = overlayImages
self.updatedAtInSecs = updatedAtInSecs
self.startsAtInSecs = startsAtInSecs
self.endsAtInSecs = endsAtInSecs
self.shareURL = shareURL self.shareURL = shareURL
self.title = title self.title = title
self.summaryText = summaryText self.summaryText = summaryText
self.sourceName = sourceName self.sourceName = sourceName
self.heartCount = heartCount
self.shortURL = shortURL self.shortURL = shortURL
self.ctaText = ctaText self.ctaText = ctaText
self.ctaURL = ctaURL self.ctaURL = ctaURL
self.likeCount = likeCount
self.shareCount = shareCount
} }
public func getImage(for width:CGFloat) -> ShortsItemImage? { public func getImage(for width: CGFloat) -> ShortsItemImage? {
guard !self.images.isEmpty && width > 0 else { guard !self.images.isEmpty && width > 0 else {
return nil return nil
} }
...@@ -73,7 +61,7 @@ public struct ShortsItem { ...@@ -73,7 +61,7 @@ public struct ShortsItem {
return image return image
} }
public func getOverlayImage(for width:CGFloat) -> ShortsItemImage? { public func getOverlayImage(for width: CGFloat) -> ShortsItemImage? {
guard !self.overlayImages.isEmpty && width > 0 else { guard !self.overlayImages.isEmpty && width > 0 else {
return nil return nil
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment