summaryrefslogtreecommitdiff
path: root/Juick/Views/MessageCell.m
blob: b82d0a1db7b7494607a9a20eb1bd1127d0782835 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
//
//  MessageCell.m
//  Juick
//
//  Created by Vitaly Takmazov on 03/12/2017.
//  Copyright © 2017 com.juick. All rights reserved.
//

#import "MessageCell.h"
#import "ColorScheme.h"
#import "APIClient.h"
#import "Entity.h"

@implementation MessageCell

- (void)awakeFromNib {
    [super awakeFromNib];
    self.text.textColor = [ColorScheme textColor];
    self.text.dataDetectorTypes = UIDataDetectorTypeAll;
    self.text.tintColor = [ColorScheme linkColor];
    self.title.textColor = [ColorScheme linkColor];
    self.timestamp.textColor = [UIColor grayColor];
    self.summary.textColor = [UIColor grayColor];
    self.tags.textFont = [UIFont preferredFontForTextStyle:UIFontTextStyleFootnote];
    UIGestureRecognizer *avatarTapRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(avatarClicked:)];
    [avatarTapRecognizer setEnabled:YES];
    [self.avatar addGestureRecognizer:avatarTapRecognizer];
    [self.avatar setUserInteractionEnabled:YES];
}

- (void) configureWithMessage:(Message *)msg {
    self.message = msg;
    self.avatar.image = nil;
    __weak UIImageView *weakAvatar = self.avatar;
    [self.avatar setImageWithURLRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:msg.user.avatar]] placeholderImage:nil success:^(NSURLRequest * _Nonnull request, NSHTTPURLResponse * _Nullable response, UIImage * _Nonnull image) {
        [UIView transitionWithView:weakAvatar
                          duration:0.3
                           options:UIViewAnimationOptionTransitionCrossDissolve
                        animations:^{
                            weakAvatar.image = image;
                        }
                        completion:nil];
    } failure:nil];
    if ([msg.attach length] > 0) {
        CGFloat imageHeight = [msg.attachment.small.height floatValue] / [[UIScreen mainScreen] scale];
        self.attachmentHeight.constant = imageHeight;
        __weak UIImageView *weakAttach = self.attach;
        [self.attach setImageWithURLRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:msg.attach]] placeholderImage:nil success:^(NSURLRequest * _Nonnull request, NSHTTPURLResponse * _Nullable response, UIImage * _Nonnull image) {
            [UIView transitionWithView:weakAttach
                              duration:0.3
                               options:UIViewAnimationOptionTransitionCrossDissolve
                            animations:^{
                                weakAttach.image = image;
                            }
                            completion:nil];
        } failure:nil];
    } else {
        self.attachmentHeight.constant = 0;
        self.attach.image = nil;
    }
    self.title.text = msg.user.uname;
    
    self.timestamp.text = [[[APIClient sharedClient].dateFormatter dateFromString:msg.timestamp] timeAgoSinceNow];
    NSUInteger count = [msg.repliesCount unsignedIntegerValue];
    if (count > 0) {
        if ([msg.repliesBy length] > 0) {
            self.summary.text = [NSString stringWithFormat:@"%@ replies by %@", msg.repliesCount, msg.repliesBy];
        } else {
            self.summary.text = [NSString stringWithFormat:@"%@ replies", msg.repliesCount];
        }
    } else {
        self.summary.text = nil;
    }
    self.text.attributedText = nil;
    if (msg.text) {
        NSMutableAttributedString *txt = [[NSMutableAttributedString alloc]
                                          initWithString:msg.text
                                          attributes:@{NSFontAttributeName:[UIFont preferredFontForTextStyle:UIFontTextStyleBody]}];
        [txt beginEditing];
        for (NSDictionary *entity in msg.entities) {
            NSUInteger start = [[entity objectForKey:@"start"] unsignedIntegerValue];
            NSUInteger end = [[entity objectForKey:@"end"] unsignedIntegerValue];
            NSRange currentRange = NSMakeRange(start, end - start);
            [txt addAttribute:@"displayText" value:[entity objectForKey:@"text"] range:currentRange];
            if ([[entity objectForKey:@"type"] isEqualToString:@"a"]) {
                [txt addAttribute:NSLinkAttributeName value:[entity objectForKey:@"url"] range:currentRange];
            }
            if ([[entity objectForKey:@"type"] isEqualToString:@"q"]) {
                [txt addAttribute:NSForegroundColorAttributeName value:[UIColor darkGrayColor] range:currentRange];
                NSMutableParagraphStyle *paragraphStyle = [[NSParagraphStyle defaultParagraphStyle] mutableCopy];
                paragraphStyle.firstLineHeadIndent = 12.0f;
                paragraphStyle.headIndent = 12.0f;
                paragraphStyle.paragraphSpacing = 12.0f;
                [txt addAttribute:NSParagraphStyleAttributeName value:paragraphStyle range:currentRange];
            }
            if ([[entity objectForKey:@"type"] isEqualToString:@"u"]) {
                [txt addAttribute:NSUnderlineStyleAttributeName value:@(NSUnderlineStyleSingle) range:currentRange];
            }
            UIFontDescriptor* fontDescriptor = [UIFontDescriptor
                                                preferredFontDescriptorWithTextStyle:UIFontTextStyleBody];
            if ([[entity objectForKey:@"type"] isEqualToString:@"b"]) {
                UIFontDescriptor* boldFontDescriptor = [fontDescriptor
                                                        fontDescriptorWithSymbolicTraits:UIFontDescriptorTraitBold];
                UIFont* boldFont =  [UIFont fontWithDescriptor:boldFontDescriptor size: 0.0];
                [txt addAttribute:NSFontAttributeName value:boldFont range:currentRange];
            }
            if ([[entity objectForKey:@"type"] isEqualToString:@"i"]) {
                UIFontDescriptor* italicFontDescriptor = [fontDescriptor
                                                        fontDescriptorWithSymbolicTraits:UIFontDescriptorTraitItalic];
                UIFont* italicFont =  [UIFont fontWithDescriptor:italicFontDescriptor size: 0.0];
                [txt addAttribute:NSFontAttributeName value:italicFont range:currentRange];
            }
        }
        [txt enumerateAttribute:@"displayText" inRange:NSMakeRange(0, [txt length]) options:0 usingBlock:^(id  _Nullable value, NSRange range, BOOL * _Nonnull stop) {
            if (value) {
                [txt replaceCharactersInRange:range withString:value];
            }
        }];
        [txt endEditing];
        self.text.attributedText = txt;
    }
    [self.tags removeAllTags];
    if ([msg.tags count] > 0) {
        [msg.tags enumerateObjectsUsingBlock:^(NSString * _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
            [self.tags addTag:obj];
        }];
    }
}

-(void) avatarClicked:(UIGestureRecognizer *)gestureRecognizer {
    [self.delegate avatarClicked:self.title.text];
}

@end