Skip to content

Commit

Permalink
Merge branch 'release/v1.3.0'
Browse files Browse the repository at this point in the history
  • Loading branch information
87kangsw committed Feb 29, 2020
2 parents ea61acb + 758ec72 commit 3a84b4f
Show file tree
Hide file tree
Showing 42 changed files with 1,288 additions and 234 deletions.
52 changes: 50 additions & 2 deletions GitTime.xcodeproj/project.pbxproj

Large diffs are not rendered by default.

6 changes: 6 additions & 0 deletions GitTime/Resources/Assets.xcassets/favorite/Contents.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
{
"info" : {
"version" : 1,
"author" : "xcode"
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
{
"images" : [
{
"idiom" : "universal",
"filename" : "favorite_empty.png",
"scale" : "1x"
},
{
"idiom" : "universal",
"filename" : "[email protected]",
"scale" : "2x"
},
{
"idiom" : "universal",
"filename" : "[email protected]",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
{
"images" : [
{
"idiom" : "universal",
"filename" : "favorite_fill.png",
"scale" : "1x"
},
{
"idiom" : "universal",
"filename" : "[email protected]",
"scale" : "2x"
},
{
"idiom" : "universal",
"filename" : "[email protected]",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
9 changes: 6 additions & 3 deletions GitTime/Sources/AppDependency.swift
Original file line number Diff line number Diff line change
Expand Up @@ -56,7 +56,7 @@ final class AppDependency {

// Toaster
let toastAppearance = ToastView.appearance()
toastAppearance.bottomOffsetPortrait = UIScreen.main.bounds.height / 2
toastAppearance.bottomOffsetPortrait = 30.0
toastAppearance.textColor = .invertTitle
toastAppearance.backgroundColor = .invertBackground
}
Expand All @@ -79,6 +79,8 @@ final class AppDependency {
let activityService = ActivityService(networking: GitTimeProvider<GitHubAPI>(plugins: [AuthPlugin(keychainService: keychainService)]))
let crawlerService = GitTimeCrawlerService(networking: GitTimeProvider<GitTimeCrawlerAPI>())
let searchService = SearchService(networking: GitTimeProvider<GitHubAPI>(plugins: [AuthPlugin(keychainService: keychainService)]))
let realmService = RealmService()
let languageService = LanguagesService()

let firstLaunch: Bool = userDefaultsService.value(forKey: UserDefaultsKey.firstLaunch) ?? true
if firstLaunch {
Expand Down Expand Up @@ -113,8 +115,9 @@ final class AppDependency {
followVC.tabBarItem.selectedImage = UIImage.assetImage(name: TabBarImages.followFilled)

let searchReactor = SearchViewReactor(searchService: searchService,
languageService: LanguagesService(),
realmService: RealmService())
languageService: languageService,
realmService: realmService,
userdefaultsService: userDefaultsService)

let searchVC = SearchViewController.instantiate(withReactor: searchReactor)
searchVC.title = "Search"
Expand Down
30 changes: 30 additions & 0 deletions GitTime/Sources/Models/FavoriteLanguage.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
//
// FavoriteLanguage.swift
// GitTime
//
// Created by Kanz on 2020/01/18.
// Copyright © 2020 KanzDevelop. All rights reserved.
//

import Realm
import RealmSwift

class FavoriteLanguage: Object {
@objc dynamic var id: Int = 0
@objc dynamic var name: String = ""
@objc dynamic var type: String = ""
@objc dynamic var color: String = ""

override class func primaryKey() -> String? {
return "id"
}
}

extension FavoriteLanguage {
func toLanguage() -> Language {
return Language(id: self.id,
name: self.name,
type: self.type,
color: self.color)
}
}
19 changes: 19 additions & 0 deletions GitTime/Sources/Models/Language.swift
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ struct Language: Codable {
let name: String
let type: LanguageTypes
let color: String
var isFavorite: Bool = false

init(from decoder: Decoder) throws {
let container = try decoder.container(keyedBy: CodingKeys.self)
Expand All @@ -37,6 +38,13 @@ struct Language: Codable {
self.color = ""
}

init(id: Int, name: String, type: String, color: String) {
self.id = id
self.name = name
self.type = LanguageTypes(rawValue: type) ?? .programming
self.color = color
}

enum CodingKeys: String, CodingKey {
case id
case name
Expand All @@ -48,3 +56,14 @@ struct Language: Codable {
return Language(name: "All Languages")
}
}

extension Language {
func toFavoriteLanguage() -> FavoriteLanguage {
let favorite = FavoriteLanguage()
favorite.id = self.id
favorite.name = self.name
favorite.color = self.color
favorite.type = self.type.rawValue
return favorite
}
}
19 changes: 16 additions & 3 deletions GitTime/Sources/Network/GitHubAPI.swift
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ enum GitHubAPI {
case followers(userName: String, page: Int)
case following(userName: String, page: Int)
case searchUser(query: String, page: Int)
case searchRepo(query: String, page: Int)
case searchRepo(query: String, page: Int, language: String?)
}

extension GitHubAPI: TargetType {
Expand Down Expand Up @@ -59,14 +59,27 @@ extension GitHubAPI: TargetType {
"page": page
]
return .requestParameters(parameters: params, encoding: URLEncoding.default)

case let .activityEvent(_, page):
let params: [String: Any] = [
"per_page": 30,
"page": page
]
return .requestParameters(parameters: params, encoding: URLEncoding.default)
case let .searchUser(query, page),
let .searchRepo(query, page):

case let .searchUser(query, page):
let params: [String: Any] = [
"q": query,
"page": page
]
return .requestParameters(parameters: params, encoding: URLEncoding.default)

case let .searchRepo(query, page, language):
var query = query
if let language = language {
query = "\(query)+\(language.lowercased())"
}

let params: [String: Any] = [
"q": query,
"page": page
Expand Down
33 changes: 33 additions & 0 deletions GitTime/Sources/Sections/FavoriteLanguageSection.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
//
// FavoriteLanguageSection.swift
// GitTime
//
// Created by Kanz on 2020/02/29.
// Copyright © 2020 KanzDevelop. All rights reserved.
//

import RxDataSources

enum FavoriteLanguageSection {
case favorite([FavoriteLanguageSectionItem])
}

extension FavoriteLanguageSection: SectionModelType {
var items: [FavoriteLanguageSectionItem] {
switch self {
case .favorite(let items):
return items
}
}

init(original: FavoriteLanguageSection, items: [FavoriteLanguageSectionItem]) {
switch original {
case .favorite:
self = .favorite(items)
}
}
}

enum FavoriteLanguageSectionItem {
case favorite(FavoriteLanguageTableViewCellReactor)
}
6 changes: 6 additions & 0 deletions GitTime/Sources/Sections/LanguageSection.swift
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ import RxDataSources
enum LanguageSection {
case allLanguage([LanguageSectionItem])
case languages([LanguageSectionItem])
case emptyFavorites([LanguageSectionItem])
}

extension LanguageSection: SectionModelType {
Expand All @@ -21,6 +22,8 @@ extension LanguageSection: SectionModelType {
return items
case .languages(let items):
return items
case .emptyFavorites(let items):
return items
}
}

Expand All @@ -30,11 +33,14 @@ extension LanguageSection: SectionModelType {
self = .allLanguage(items)
case .languages:
self = .languages(items)
case .emptyFavorites:
self = .emptyFavorites(items)
}
}
}

enum LanguageSectionItem {
case allLanguage(LanguageListCellReactor)
case languages(LanguageListCellReactor)
case emptyFavorites(FavoriteLanguageTableViewCellReactor)
}
52 changes: 51 additions & 1 deletion GitTime/Sources/Services/RealmService.swift
Original file line number Diff line number Diff line change
Expand Up @@ -10,15 +10,21 @@ import RealmSwift
import RxSwift

protocol RealmServiceType {
// Search History
func addSearchText(text: String)
func recentSearchTextList() -> Observable<[SearchHistory]>
func removeSearchText(text: String)

// Favorite Language
func addFavoriteLanguage(_ language: Language)
func removeFavoriteLanguage(_ language: FavoriteLanguage)
func loadFavoriteLanguages() -> Observable<[FavoriteLanguage]>
}

class RealmService: RealmServiceType {

// MARK: - Search History
func addSearchText(text: String) {

do {
let realm = try Realm()
try realm.write {
Expand Down Expand Up @@ -61,6 +67,50 @@ class RealmService: RealmServiceType {
log.error(error.localizedDescription)
}
}

// MARK: Favorite Lanuages
func addFavoriteLanguage(_ language: Language) {
do {
let realm = try Realm(configuration: Realm.Configuration.defaultConfiguration)
try realm.write {
realm.create(FavoriteLanguage.self,
value: [
"id": language.id,
"name": language.name,
"color": language.color,
"type": language.type.rawValue
], update: Realm.UpdatePolicy.all)
}
} catch {
log.error(error.localizedDescription)
}
}

func removeFavoriteLanguage(_ language: FavoriteLanguage) {
do {
let realm = try Realm(configuration: Realm.Configuration.defaultConfiguration)
let predicate = NSPredicate(format: "id == %d", language.id)
let results = realm.objects(FavoriteLanguage.self).filter(predicate)

try realm.write {
realm.delete(results)
}
} catch {
log.error(error.localizedDescription)
}
}

func loadFavoriteLanguages() -> Observable<[FavoriteLanguage]> {
do {
let realm = try Realm(configuration: Realm.Configuration.defaultConfiguration)
let result = realm.objects(FavoriteLanguage.self)
.toArray(ofType: FavoriteLanguage.self)
return Observable.just(result)
} catch {
log.error(error.localizedDescription)
return .empty()
}
}
}

extension Results {
Expand Down
26 changes: 3 additions & 23 deletions GitTime/Sources/Services/SearchService.swift
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ import RxSwift

protocol SearchServiceType {
func searchUser(query: String, page: Int) -> Observable<([User], Bool)>
func searchRepo(query: String, page: Int) -> Observable<([Repository], Bool)>
func searchRepo(query: String, page: Int, language: String?) -> Observable<([Repository], Bool)>
}

class SearchService: SearchServiceType {
Expand All @@ -31,32 +31,12 @@ class SearchService: SearchServiceType {
.asObservable()
}

func searchRepo(query: String, page: Int) -> Observable<([Repository], Bool)> {
return self.networking.request(.searchRepo(query: query, page: page))
func searchRepo(query: String, page: Int, language: String?) -> Observable<([Repository], Bool)> {
return self.networking.request(.searchRepo(query: query, page: page, language: language))
.map(SearchResults<Repository>.self)
.map { result -> ([Repository], Bool) in
let canLoadMore = result.totalCount > page * 30
return (result.items, canLoadMore)
}
}

// private trialSearchUser() -> Observable<([User], Bool)> {
// guard let searchedUsers: SearchResults<User> = Bundle.resource(name: "", extensionType: "json") else { return .empty() }
// let users = searchedUsers.map { result -> [User] in
//
// }
//// .map { result -> ([User], Bool) in
//// let canLoadMore = result.totalCount > page * 30
//// return (result.items, canLoadMore)
//// }
//// .asObservable()
//
// return .just(searchedUsers)
// }
//
// private func trialSearchRepo() -> Observable<([Repository], Bool)> {
// guard let searchedRepos: SearchResults<Repository> = Bundle.resource(name: "", extensionType: "json") else { return .empty() }
// return .just(searchedRepos)
// }

}
Original file line number Diff line number Diff line change
Expand Up @@ -28,11 +28,20 @@ extension UIViewController {

// MARK: - Pan Modal
extension UIViewController {
/*
func presentPanModalWeb(urlString: String) {
guard let url = URL(string: urlString) else { return }
let safariVC = SFSafariViewController(url: url)
let nav = PanModalNaivgationController(rootViewController: safariVC)
presentPanModal(nav)
}
*/
func presentModalWeb(urlString: String) {
guard let url = URL(string: urlString) else { return }

let safariVC = SFSafariViewController(url: url)
safariVC.modalPresentationStyle = .formSheet
self.present(safariVC, animated: true, completion: nil)
}
}
Loading

0 comments on commit 3a84b4f

Please sign in to comment.