diff --git a/Yep/Extensions/String+Yep.swift b/Yep/Extensions/String+Yep.swift index d0623b6d..6d7d1ec5 100644 --- a/Yep/Extensions/String+Yep.swift +++ b/Yep/Extensions/String+Yep.swift @@ -20,6 +20,9 @@ extension String { return nil } } +} + +extension String { enum TrimmingType { case Whitespace @@ -34,4 +37,51 @@ extension String { return stringByTrimmingCharactersInSet(NSCharacterSet.whitespaceAndNewlineCharacterSet()) } } -} \ No newline at end of file +} + +extension String { + + func yep_mentionWordInIndex(index: Int) -> (wordString: String, mentionWordRange: Range)? { + + guard index > 0 else { + return nil + } + + let index = startIndex.advancedBy(index) + + var wordString: String? + var wordRange: Range? + + self.enumerateSubstringsInRange(Range(start: startIndex, end: endIndex), options: [.ByWords, .Reverse]) { (substring, substringRange, enclosingRange, stop) -> () in + + //println("substring: \(substring)") + //println("substringRange: \(substringRange)") + //println("enclosingRange: \(enclosingRange)") + + if substringRange.contains(index) { + wordString = substring + wordRange = substringRange + stop = true + } + } + + guard let _wordString = wordString, _wordRange = wordRange else { + return nil + } + + guard _wordRange.startIndex != startIndex else { + return nil + } + + let mentionWordRange = Range(start: _wordRange.startIndex.advancedBy(-1), end: _wordRange.endIndex) + + let mentionWord = substringWithRange(mentionWordRange) + + guard mentionWord.hasPrefix("@") else { + return nil + } + + return (_wordString, mentionWordRange) + } +} + diff --git a/Yep/Services/YepService.swift b/Yep/Services/YepService.swift index c3aa60d1..61e52588 100644 --- a/Yep/Services/YepService.swift +++ b/Yep/Services/YepService.swift @@ -3695,7 +3695,7 @@ struct UsernamePrefixMatchedUser { let userID: String let username: String let nickname: String - let avatarURLString: String + let avatarURLString: String? var mentionUsername: String { return "@" + username @@ -3709,7 +3709,7 @@ func usersMatchWithUsernamePrefix(usernamePrefix: String, failureHandler: ((Reas ] let parse: JSONDictionary -> [UsernamePrefixMatchedUser]? = { data in - //println("usersMatchWithUsernamePrefix: \(data)") + println("usersMatchWithUsernamePrefix: \(data)") if let usersData = data["users"] as? [JSONDictionary] { let users: [UsernamePrefixMatchedUser] = usersData.map({ userInfo in @@ -3717,12 +3717,14 @@ func usersMatchWithUsernamePrefix(usernamePrefix: String, failureHandler: ((Reas userID = userInfo["id"] as? String, username = userInfo["username"] as? String, nickname = userInfo["nickname"] as? String, - avatarInfo = userInfo["avatar"] as? JSONDictionary, - avatarURLString = avatarInfo["thumb_url"] as? String + avatarInfo = userInfo["avatar"] as? JSONDictionary + //avatarURLString = avatarInfo["thumb_url"] as? String else { return nil } + let avatarURLString = avatarInfo["thumb_url"] as? String + return UsernamePrefixMatchedUser(userID: userID, username: username, nickname: nickname, avatarURLString: avatarURLString) }).flatMap({ $0 }) diff --git a/Yep/Views/Mention/MentionView.swift b/Yep/Views/Mention/MentionView.swift index 3aca2d11..248fa3da 100644 --- a/Yep/Views/Mention/MentionView.swift +++ b/Yep/Views/Mention/MentionView.swift @@ -72,8 +72,12 @@ private class MentionUserCell: UITableViewCell { func configureWithUsernamePrefixMatchedUser(user: UsernamePrefixMatchedUser) { - let plainAvatar = PlainAvatar(avatarURLString: user.avatarURLString, avatarStyle: picoAvatarStyle) + if let avatarURLString = user.avatarURLString { + let plainAvatar = PlainAvatar(avatarURLString: avatarURLString, avatarStyle: picoAvatarStyle) avatarImageView.navi_setAvatar(plainAvatar, withFadeTransitionDuration: avatarFadeTransitionDuration) + } else { + avatarImageView.image = UIImage(named: "default_avatar_30") + } nicknameLabel.text = user.nickname mentionUsernameLabel.text = user.mentionUsername @@ -105,6 +109,7 @@ class MentionView: UIView { let tableView = UITableView() tableView.backgroundColor = UIColor.clearColor() + tableView.separatorInset = UIEdgeInsets(top: 0, left: 60, bottom: 0, right: 0) let effect = UIBlurEffect(style: .ExtraLight) diff --git a/Yep/Views/MessageToolbar/MessageToolbar.swift b/Yep/Views/MessageToolbar/MessageToolbar.swift index 7338be81..314af2e5 100644 --- a/Yep/Views/MessageToolbar/MessageToolbar.swift +++ b/Yep/Views/MessageToolbar/MessageToolbar.swift @@ -441,6 +441,8 @@ class MessageToolbar: UIToolbar { text.replaceRange(range, with: mentionUsernameWithSpaceSuffix) messageTextView.text = text + + updateHeightOfMessageTextView() } } @@ -490,19 +492,16 @@ extension MessageToolbar: UITextViewDelegate { state = text.isEmpty ? .BeginTextInput : .TextInputing if needDetectMention { - let parts = text.componentsSeparatedByCharactersInSet(NSCharacterSet.whitespaceAndNewlineCharacterSet()) - if let lastPart = parts.last { - if lastPart.hasPrefix("@") { - let usernamePrefix = lastPart.substringFromIndex(lastPart.startIndex.advancedBy(1)) + let currentLetterIndex = textView.selectedRange.location - 1 - if !usernamePrefix.isEmpty { - mentionUsernameRange = text.rangeOfString(lastPart) - tryMentionUserAction?(usernamePrefix: usernamePrefix) + if let (wordString, mentionWordRange) = text.yep_mentionWordInIndex(currentLetterIndex) { + //println("mentionWord: \(wordString), \(mentionWordRange)") - return - } - } + mentionUsernameRange = mentionWordRange + tryMentionUserAction?(usernamePrefix: wordString) + + return } giveUpMentionUserAction?()