-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request #124 from boostcampwm-2022/feature/FriendView
Feature/friend view
- Loading branch information
Showing
12 changed files
with
478 additions
and
18 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
92 changes: 92 additions & 0 deletions
92
DailyQuest/DailyQuest/Domain/UseCases/Common/DefaultFriendCalendarUseCase.swift
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,92 @@ | ||
// | ||
// DefaultFriendCalendarUseCase.swift | ||
// DailyQuest | ||
// | ||
// Created by jinwoong Kim on 2022/12/08. | ||
// | ||
|
||
import Foundation | ||
|
||
import RxSwift | ||
|
||
import RxSwift | ||
|
||
final class DefaultFriendCalendarUseCase: FriendCalendarUseCase { | ||
private let user: User | ||
private let questsRepository: QuestsRepository | ||
private let disposeBag = DisposeBag() | ||
|
||
let currentMonth = BehaviorSubject<Date?>(value: Date()) | ||
let completionOfMonths = BehaviorSubject<[[DailyQuestCompletion]]>(value: [[], [], []]) | ||
let selectedDate = BehaviorSubject<Date>(value: Date()) | ||
|
||
init(user: User, questsRepository: QuestsRepository) { | ||
self.user = user | ||
self.questsRepository = questsRepository | ||
} | ||
|
||
func setupMonths() { | ||
let currentMonth = try? currentMonth.value() | ||
let startDayOfCurrentMonth = currentMonth?.startDayOfCurrentMonth | ||
|
||
let months = startDayOfCurrentMonth | ||
|
||
Observable.just(months) | ||
.flatMap(fetchAMontlyCompletion(_:)) | ||
.map { [[], $0, []] } | ||
.bind(to: completionOfMonths) | ||
.disposed(by: disposeBag) | ||
} | ||
|
||
func selectDate(_ date: Date) { | ||
selectedDate.onNext(date) | ||
} | ||
} | ||
|
||
extension DefaultFriendCalendarUseCase { | ||
|
||
private func calculateDailyState(_ quests: [Quest]) -> DailyQuestCompletion.State { | ||
guard !quests.isEmpty else { | ||
return .normal | ||
} | ||
|
||
let filteredQuests = quests.filter { !$0.state } | ||
|
||
if filteredQuests.isEmpty { | ||
return .done | ||
} else { | ||
return .notDone(filteredQuests.count) | ||
} | ||
} | ||
|
||
private func fetchAMontlyCompletion(_ month: Date?) -> Observable<[DailyQuestCompletion]> { | ||
guard let month = month else { return .empty() } | ||
|
||
return Observable.from(month.rangeDaysOfMonth) | ||
.concatMap { [weak self] date -> Observable<DailyQuestCompletion> in | ||
guard let self else { return Observable.empty() } | ||
|
||
return self.questsRepository | ||
.fetch(by: self.user.uuid, date: date) | ||
.map { quests -> DailyQuestCompletion in | ||
let isSelected = (try? self.selectedDate.value().startOfDay == date) ?? false | ||
|
||
return DailyQuestCompletion( | ||
day: date, | ||
state: self.calculateDailyState(quests), | ||
isSelected: isSelected | ||
) | ||
} | ||
} | ||
.toArray() | ||
.map { states in | ||
let firstWeekStates = month.rangeFromStartWeekdayOfLastMonthToEndDayOfCurrentMonth | ||
.map { date -> DailyQuestCompletion in | ||
return DailyQuestCompletion(day: date, state: .hidden, isSelected: false) | ||
} | ||
|
||
return firstWeekStates + states | ||
} | ||
.asObservable() | ||
} | ||
} |
24 changes: 24 additions & 0 deletions
24
DailyQuest/DailyQuest/Domain/UseCases/Common/DefaultFriendQuestUseCase.swift
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,24 @@ | ||
// | ||
// DefaultFriendQuestUseCase.swift | ||
// DailyQuest | ||
// | ||
// Created by jinwoong Kim on 2022/12/08. | ||
// | ||
|
||
import Foundation | ||
|
||
import RxSwift | ||
|
||
final class DefaultFriendUseCase { | ||
private let questsRepository: QuestsRepository | ||
|
||
init(questsRepository: QuestsRepository) { | ||
self.questsRepository = questsRepository | ||
} | ||
} | ||
|
||
extension DefaultFriendUseCase: FriendQuestUseCase { | ||
func fetch(with uuid: String, by date: Date) -> Observable<[Quest]> { | ||
return questsRepository.fetch(by: uuid, date: date) | ||
} | ||
} |
19 changes: 19 additions & 0 deletions
19
DailyQuest/DailyQuest/Domain/UseCases/Common/Protocols/FriendCalendarUseCase.swift
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,19 @@ | ||
// | ||
// FriendCalendarUseCase.swift | ||
// DailyQuest | ||
// | ||
// Created by jinwoong Kim on 2022/12/08. | ||
// | ||
|
||
import Foundation | ||
|
||
import RxSwift | ||
|
||
protocol FriendCalendarUseCase { | ||
var currentMonth: BehaviorSubject<Date?> { get } | ||
var completionOfMonths: BehaviorSubject<[[DailyQuestCompletion]]> { get } | ||
var selectedDate: BehaviorSubject<Date> { get } | ||
|
||
func setupMonths() | ||
func selectDate(_ date: Date) | ||
} |
14 changes: 14 additions & 0 deletions
14
DailyQuest/DailyQuest/Domain/UseCases/Common/Protocols/FriendQuestUseCase.swift
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,14 @@ | ||
// | ||
// FriendQuestUseCase.swift | ||
// DailyQuest | ||
// | ||
// Created by jinwoong Kim on 2022/12/08. | ||
// | ||
|
||
import Foundation | ||
|
||
import RxSwift | ||
|
||
protocol FriendQuestUseCase { | ||
func fetch(with uuid: String, by date: Date) -> Observable<[Quest]> | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.