Skip to content
This repository was archived by the owner on Sep 20, 2023. It is now read-only.

Commit 27b83b6

Browse files
BrianLitwinrnystrom
authored andcommitted
update bookmark nav item state between viewDidLoad and Issue Load (#1791)
1 parent 125dfe4 commit 27b83b6

File tree

4 files changed

+88
-19
lines changed

4 files changed

+88
-19
lines changed

Classes/Bookmark/BookmarkNavigationController.swift

Lines changed: 30 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -22,12 +22,19 @@ final class BookmarkNavigationController {
2222
}
2323

2424
// MARK: Public API
25-
25+
2626
var navigationItem: UIBarButtonItem {
27+
let item = UIBarButtonItem()
28+
configureNavigationItem(item)
29+
return item
30+
}
31+
32+
func configureNavigationItem(_ item: UIBarButtonItem) {
33+
2734
let accessibilityLabel: String
2835
let imageName: String
2936
let selector: Selector
30-
37+
3138
if store.contains(model) {
3239
imageName = "nav-bookmark-selected"
3340
accessibilityLabel = Constants.Strings.removeBookmark
@@ -38,24 +45,34 @@ final class BookmarkNavigationController {
3845
selector = #selector(BookmarkNavigationController.add(sender:))
3946
}
4047

41-
let item = UIBarButtonItem(image: UIImage(named: imageName), target: self, action: selector)
4248
item.accessibilityLabel = accessibilityLabel
49+
item.image = UIImage(named: imageName)?.withRenderingMode(.alwaysTemplate)
50+
item.target = self
51+
item.action = selector
52+
item.isEnabled = true
53+
}
54+
55+
//for timeframe between viewDidLoad() and bookmark info is loaded
56+
static var disabledNavigationItem: UIBarButtonItem {
57+
let item = UIBarButtonItem()
58+
item.image = UIImage(named: "nav-bookmark")?.withRenderingMode(.alwaysTemplate)
59+
item.isEnabled = false
4360
return item
4461
}
45-
62+
4663
// MARK: Private API
47-
48-
@objc func add(sender: UIButton) {
64+
65+
@objc func add(sender: UIBarButtonItem) {
4966
Haptic.triggerSelection()
50-
sender.addTarget(self, action: #selector(BookmarkNavigationController.remove(sender:)), for: .touchUpInside)
51-
sender.setImage(UIImage(named: "nav-bookmark-selected")?.withRenderingMode(.alwaysTemplate), for: .normal)
67+
sender.action = #selector(BookmarkNavigationController.remove(sender:))
68+
sender.image = UIImage(named: "nav-bookmark-selected")?.withRenderingMode(.alwaysTemplate)
5269
store.add(model)
5370
}
54-
55-
@objc func remove(sender: UIButton) {
56-
sender.addTarget(self, action: #selector(BookmarkNavigationController.add(sender:)), for: .touchUpInside)
57-
sender.setImage(UIImage(named: "nav-bookmark")?.withRenderingMode(.alwaysTemplate), for: .normal)
71+
72+
@objc func remove(sender: UIBarButtonItem) {
73+
sender.action = #selector(BookmarkNavigationController.add(sender:))
74+
sender.image = UIImage(named: "nav-bookmark")?.withRenderingMode(.alwaysTemplate)
5875
store.remove(model)
5976
}
60-
77+
6178
}

Classes/Issues/IssuesViewController.swift

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -164,7 +164,9 @@ final class IssuesViewController:
164164
actions.frame = CGRect(x: 0, y: 0, width: 0, height: 40)
165165
messageView.add(contentView: actions)
166166

167-
navigationItem.rightBarButtonItem = moreOptionsItem
167+
168+
//show disabled bookmark button until issue has finished loading
169+
navigationItem.rightBarButtonItems = [ moreOptionsItem, BookmarkNavigationController.disabledNavigationItem ]
168170
}
169171

170172
override func viewDidAppear(_ animated: Bool) {
@@ -224,11 +226,9 @@ final class IssuesViewController:
224226
}
225227

226228
func configureNavigationItems() {
227-
var items = [moreOptionsItem]
228-
if let bookmarkItem = bookmarkNavController?.navigationItem {
229-
items.append(bookmarkItem)
230-
}
231-
navigationItem.rightBarButtonItems = items
229+
guard let rightbarButtonItems = navigationItem.rightBarButtonItems else { return }
230+
guard let bookmarkItem = rightbarButtonItems.last else { return }
231+
bookmarkNavController?.configureNavigationItem(bookmarkItem)
232232
}
233233

234234
func viewOwnerAction() -> UIAlertAction? {

Freetime.xcodeproj/project.pbxproj

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -418,6 +418,7 @@
418418
98F9F4001F9CCFFE005A0266 /* ImageUploadTableViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 98F9F3FD1F9CCFFE005A0266 /* ImageUploadTableViewController.swift */; };
419419
98F9F4011F9CCFFE005A0266 /* ImgurClient.swift in Sources */ = {isa = PBXBuildFile; fileRef = 98F9F3FE1F9CCFFE005A0266 /* ImgurClient.swift */; };
420420
98F9F4031F9CD006005A0266 /* Image+Base64.swift in Sources */ = {isa = PBXBuildFile; fileRef = 98F9F4021F9CD006005A0266 /* Image+Base64.swift */; };
421+
BD3761B0209E032500401DFB /* BookmarkNavigationItemTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = BD3761AF209E032500401DFB /* BookmarkNavigationItemTests.swift */; };
421422
D8BAD0601FDA0A1A00C41071 /* LabelListCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = D8BAD05F1FDA0A1A00C41071 /* LabelListCell.swift */; };
422423
D8BAD0641FDF221900C41071 /* LabelListView.swift in Sources */ = {isa = PBXBuildFile; fileRef = D8BAD0631FDF221900C41071 /* LabelListView.swift */; };
423424
D8BAD0661FDF224600C41071 /* WrappingStaticSpacingFlowLayout.swift in Sources */ = {isa = PBXBuildFile; fileRef = D8BAD0651FDF224600C41071 /* WrappingStaticSpacingFlowLayout.swift */; };
@@ -929,6 +930,7 @@
929930
A4D6EAEE85A1F4878338D48C /* Pods-FreetimeWatch Extension.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-FreetimeWatch Extension.debug.xcconfig"; path = "Pods/Target Support Files/Pods-FreetimeWatch Extension/Pods-FreetimeWatch Extension.debug.xcconfig"; sourceTree = "<group>"; };
930931
ACAE4A11E9671879046F0CE7 /* Pods-FreetimeWatch.testflight.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-FreetimeWatch.testflight.xcconfig"; path = "Pods/Target Support Files/Pods-FreetimeWatch/Pods-FreetimeWatch.testflight.xcconfig"; sourceTree = "<group>"; };
931932
B3C439BE890EECD7C0C692C5 /* Pods-Freetime.testflight.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Freetime.testflight.xcconfig"; path = "Pods/Target Support Files/Pods-Freetime/Pods-Freetime.testflight.xcconfig"; sourceTree = "<group>"; };
933+
BD3761AF209E032500401DFB /* BookmarkNavigationItemTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BookmarkNavigationItemTests.swift; sourceTree = "<group>"; };
932934
D396E0DA66FED629384A84BC /* Pods_FreetimeWatch.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_FreetimeWatch.framework; sourceTree = BUILT_PRODUCTS_DIR; };
933935
D8BAD05F1FDA0A1A00C41071 /* LabelListCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LabelListCell.swift; sourceTree = "<group>"; };
934936
D8BAD0631FDF221900C41071 /* LabelListView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = LabelListView.swift; sourceTree = "<group>"; };
@@ -2050,6 +2052,7 @@
20502052
isa = PBXGroup;
20512053
children = (
20522054
DCA5ED181FAEF32F0072F074 /* BookmarkViewModelTests.swift */,
2055+
BD3761AF209E032500401DFB /* BookmarkNavigationItemTests.swift */,
20532056
);
20542057
path = "Bookmark Tests";
20552058
sourceTree = "<group>";
@@ -3050,6 +3053,7 @@
30503053
DC60C6CE1F98346400241271 /* MockSearchEmptyViewDelegate.swift in Sources */,
30513054
DC60C6CB1F98341900241271 /* SearchEmptyViewTests.swift in Sources */,
30523055
293A45771F296B7E00DD1006 /* ListKitTestCase.swift in Sources */,
3056+
BD3761B0209E032500401DFB /* BookmarkNavigationItemTests.swift in Sources */,
30533057
DC5C02C51F9C6E3500E80B9F /* SearchQueryTests.swift in Sources */,
30543058
293A457E1F296BD500DD1006 /* API.swift in Sources */,
30553059
49AF91B1204B416500DFF325 /* MergeTests.swift in Sources */,
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
//
2+
// BookmarkNavigationItemTests.swift
3+
// FreetimeTests
4+
//
5+
// Created by B_Litwin on 5/5/18.
6+
// Copyright © 2018 Ryan Nystrom. All rights reserved.
7+
//
8+
9+
import XCTest
10+
@testable import Freetime
11+
12+
class BookmarkNavigationControllerTests: XCTestCase {
13+
14+
func test_bookmarkNavItemActionsWork() {
15+
16+
//setup
17+
18+
let issue = Bookmark(type: .issue, name: "issue 1", owner: "brian", title: "issue 1 tests")
19+
let other = Bookmark(type: .commit, name: "issue 2", owner: "litwin")
20+
let bookmarkStore = BookmarkStore(token: "")
21+
bookmarkStore.values = [other]
22+
23+
guard let bookmarkNavigationController = BookmarkNavigationController(store: bookmarkStore, model: issue) else {
24+
XCTFail("bookmarkNavigationController could not be initialized")
25+
return
26+
}
27+
28+
let navigationItem = BookmarkNavigationController.disabledNavigationItem
29+
bookmarkNavigationController.configureNavigationItem(navigationItem)
30+
31+
//test initial button and model state
32+
XCTAssertEqual(bookmarkStore.values, [other]) //models state
33+
XCTAssertEqual(navigationItem.action, #selector(bookmarkNavigationController.add(sender:))) //item's initial action
34+
35+
//test button tap updates model and button action
36+
bookmarkNavigationController.add(sender: navigationItem)
37+
XCTAssertEqual(navigationItem.action, #selector(bookmarkNavigationController.remove(sender:))) //item's action
38+
XCTAssertEqual(bookmarkStore.values, [issue, other]) //model updated
39+
40+
//test button tapped again updates model and button action
41+
bookmarkNavigationController.remove(sender: navigationItem)
42+
XCTAssertEqual(navigationItem.action, #selector(bookmarkNavigationController.add(sender:))) //item's action
43+
XCTAssertEqual(bookmarkStore.values, [other]) //model updated
44+
45+
}
46+
47+
}
48+

0 commit comments

Comments
 (0)