This PR contains all the work related to setting up this project as required to implement the [Assignment](https://repo.rock-n-code.com/rock-n-code/deep-linking-assignment/wiki/Assignment) on top, as intended. To summarise this work: - [x] created a new **Xcode** project; - [x] cloned the `Wikipedia` app and inserted it into the **Xcode** project; - [x] created the `Locations` app and also, its `Libraries` package; - [x] created the `Shared` package to share dependencies between the apps; - [x] added a `Makefile` file and implemented some **environment** and **help** commands. Co-authored-by: Javier Cicchelli <javier@rock-n-code.com> Reviewed-on: rock-n-code/deep-linking-assignment#1
107 lines
3.9 KiB
Swift
107 lines
3.9 KiB
Swift
public struct NavigationState: Codable {
|
|
static let libraryKey = "nav_state"
|
|
|
|
public var viewControllers: [ViewController]
|
|
public var shouldAttemptLogin: Bool
|
|
|
|
public init(viewControllers: [ViewController], shouldAttemptLogin: Bool) {
|
|
self.viewControllers = viewControllers
|
|
self.shouldAttemptLogin = shouldAttemptLogin
|
|
}
|
|
|
|
public struct ViewController: Codable {
|
|
public var kind: Kind
|
|
public var presentation: Presentation
|
|
public var info: Info?
|
|
public var children: [ViewController]
|
|
|
|
public mutating func updateChildren(_ children: [ViewController]) {
|
|
self.children = children
|
|
}
|
|
|
|
public init?(kind: Kind?, presentation: Presentation, info: Info? = nil, children: [ViewController] = []) {
|
|
guard let kind = kind else {
|
|
return nil
|
|
}
|
|
self.kind = kind
|
|
self.presentation = presentation
|
|
self.info = info
|
|
self.children = children
|
|
}
|
|
|
|
public enum Kind: Int, Codable {
|
|
case tab
|
|
|
|
case article
|
|
case random
|
|
case themeableNavigationController
|
|
case settings
|
|
|
|
case account
|
|
case talkPage
|
|
case talkPageReplyList
|
|
|
|
case singleWebPage
|
|
|
|
case readingListDetail
|
|
|
|
case detail
|
|
|
|
init?(from rawValue: Int?) {
|
|
guard let rawValue = rawValue else {
|
|
return nil
|
|
}
|
|
self.init(rawValue: rawValue)
|
|
}
|
|
}
|
|
|
|
public enum Presentation: Int, Codable {
|
|
case push
|
|
case modal
|
|
}
|
|
|
|
public struct Info: Codable {
|
|
public var selectedIndex: Int?
|
|
|
|
public var articleKey: String?
|
|
public var articleSectionAnchor: String?
|
|
|
|
public var talkPageSiteURLString: String?
|
|
public var talkPageTitle: String?
|
|
public var talkPageTypeRawValue: Int?
|
|
|
|
public var currentSavedViewRawValue: Int?
|
|
|
|
public var readingListURIString: String?
|
|
|
|
public var searchTerm: String?
|
|
|
|
public var shouldShowNavigationBar: Bool?
|
|
|
|
public var contentGroupIDURIString: String?
|
|
|
|
public var presentedContentGroupKey: String?
|
|
|
|
public var url: URL?
|
|
|
|
// TODO: Remove after moving to Swift 5.1 -
|
|
// https://github.com/apple/swift-evolution/blob/master/proposals/0242-default-values-memberwise.md
|
|
public init(url: URL? = nil, selectedIndex: Int? = nil, articleKey: String? = nil, articleSectionAnchor: String? = nil, talkPageSiteURLString: String? = nil, talkPageTitle: String? = nil, talkPageTypeRawValue: Int? = nil, currentSavedViewRawValue: Int? = nil, readingListURIString: String? = nil, searchTerm: String? = nil, shouldShowNavigationBar: Bool? = nil, contentGroupIDURIString: String? = nil, presentedContentGroupKey: String? = nil) {
|
|
self.url = url
|
|
self.selectedIndex = selectedIndex
|
|
self.articleKey = articleKey
|
|
self.articleSectionAnchor = articleSectionAnchor
|
|
self.talkPageSiteURLString = talkPageSiteURLString
|
|
self.talkPageTitle = talkPageTitle
|
|
self.talkPageTypeRawValue = talkPageTypeRawValue
|
|
self.currentSavedViewRawValue = currentSavedViewRawValue
|
|
self.readingListURIString = readingListURIString
|
|
self.searchTerm = searchTerm
|
|
self.shouldShowNavigationBar = shouldShowNavigationBar
|
|
self.contentGroupIDURIString = contentGroupIDURIString
|
|
self.presentedContentGroupKey = presentedContentGroupKey
|
|
}
|
|
}
|
|
}
|
|
}
|