// // PhotoModel.m // Texture // // Copyright (c) Facebook, Inc. and its affiliates. All rights reserved. // Changes after 4/13/2017 are: Copyright (c) Pinterest, Inc. All rights reserved. // Licensed under Apache 2.0: http://www.apache.org/licenses/LICENSE-2.0 // #import "PhotoModel.h" #import "Utilities.h" @implementation PhotoModel { NSDictionary *_dictionaryRepresentation; NSString *_uploadDateRaw; } #pragma mark - Lifecycle - (instancetype)initWithUnsplashPhoto:(NSDictionary *)photoDictionary { self = [super init]; if (self) { _dictionaryRepresentation = photoDictionary; _uploadDateRaw = [photoDictionary objectForKey:@"created_at"]; _photoID = [photoDictionary objectForKey:@"id"]; _descriptionText = [photoDictionary valueForKeyPath:@"description"]; _likesCount = [[photoDictionary objectForKey:@"likes"] integerValue]; _location = [photoDictionary objectForKey:@"location"]; NSString *urlString = [photoDictionary objectForKey:@"urls"][@"regular"]; _URL = urlString ? [NSURL URLWithString:urlString] : nil; _ownerUserProfile = [[UserModel alloc] initWithUnsplashPhoto:photoDictionary]; _uploadDateString = [NSString elapsedTimeStringSinceDate:_uploadDateRaw]; _height = [[photoDictionary objectForKey:@"height"] integerValue]; _width = [[photoDictionary objectForKey:@"width"] integerValue]; } return self; } #pragma mark - Instance Methods - (NSAttributedString *)descriptionAttributedStringWithFontSize:(CGFloat)size { if ((id)self.descriptionText == [NSNull null] || self.descriptionText.length == 0) { return [[NSAttributedString alloc] init]; } NSString *descriptionText = self.descriptionText; NSMutableAttributedString *attributedString = [[NSAttributedString attributedStringWithString:descriptionText fontSize:size color:[UIColor darkGrayColor] firstWordColor:nil] mutableCopy]; // Scan through description text for links static NSDataDetector *dataDector = nil; static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ dataDector = [NSDataDetector dataDetectorWithTypes:NSTextCheckingTypeLink error:nil]; }); [dataDector enumerateMatchesInString:descriptionText options:kNilOptions range:NSMakeRange(0, descriptionText.length) usingBlock:^(NSTextCheckingResult * _Nullable result, NSMatchingFlags flags, BOOL * _Nonnull stop) { NSRange range = result.range; [attributedString addAttribute:NSLinkAttributeName value:[descriptionText substringWithRange:range] range:range]; [attributedString addAttribute:NSForegroundColorAttributeName value:[UIColor darkBlueColor] range:range]; }]; return [attributedString copy]; } - (NSAttributedString *)uploadDateAttributedStringWithFontSize:(CGFloat)size { return [NSAttributedString attributedStringWithString:self.uploadDateString fontSize:size color:[UIColor lightGrayColor] firstWordColor:nil]; } - (NSAttributedString *)likesAttributedStringWithFontSize:(CGFloat)size { NSString *likesString = [NSString stringWithFormat:@"♥︎ %lu likes", (unsigned long)self.likesCount]; return [NSAttributedString attributedStringWithString:likesString fontSize:size color:[UIColor darkBlueColor] firstWordColor:nil]; } - (NSAttributedString *)locationAttributedStringWithFontSize:(CGFloat)size { return [NSAttributedString attributedStringWithString:self.location fontSize:size color:[UIColor lightBlueColor] firstWordColor:nil]; } - (NSString *)description { return [NSString stringWithFormat:@"%@ - %@", self.photoID, self.descriptionText]; } - (id)diffIdentifier { return self.photoID; } - (BOOL)isEqualToDiffableObject:(id)object { return [self isEqual:object]; } @end