Skip to content

Commit

Permalink
Merge pull request #115 from boostcampwm-2022/feature/HomeView
Browse files Browse the repository at this point in the history
Feature/home view
  • Loading branch information
jinwoong16 committed Dec 8, 2022
2 parents e09434c + abae2b6 commit 52a4e27
Show file tree
Hide file tree
Showing 12 changed files with 280 additions and 130 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -30,25 +30,26 @@ final class HomeSceneDIContainer {
func makeEnrollUseCase() -> EnrollUseCase {
return DefaultEnrollUseCase(questsRepository: makeQuestsRepository())
}

func makeCalendarUseCase() -> CalendarUseCase {
return HomeCalendarUseCase(questsRepository: makeQuestsRepository())
}

func makeUesrUseCase() -> UserUseCase {
return DefaultUserUseCase(userRepository: makeUserRepository())
}

// MARK: - View Models
func makeHomeViewModel() -> HomeViewModel {
return HomeViewModel(questUseCase: makeQuestUseCase(),
return HomeViewModel(userUseCase: makeUesrUseCase(),
questUseCase: makeQuestUseCase(),
calendarUseCase: makeCalendarUseCase())
}

func makeEnrollViewModel() -> EnrollViewModel {
return EnrollViewModel(enrollUseCase: makeEnrollUseCase())
}

func makeProfileViewModel() -> ProfileViewModel {
return ProfileViewModel(userUseCase: makeUesrUseCase())
}
Expand All @@ -61,7 +62,7 @@ final class HomeSceneDIContainer {
func makeEnrollViewController() -> EnrollViewController {
return EnrollViewController.create(with: makeEnrollViewModel())
}

func makeProfileViewController() -> ProfileViewController {
return ProfileViewController.create(with: makeProfileViewModel())
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -92,7 +92,7 @@ extension RealmQuestsStorage: QuestsStorage {
single(.success(quest))

} catch let error {
single(.failure(RealmStorageError.saveError(error)))
single(.failure(RealmStorageError.deleteError(error)))
}

return Disposables.create()
Expand All @@ -115,7 +115,7 @@ extension RealmQuestsStorage: QuestsStorage {
single(.success(quests))

} catch let error {
single(.failure(RealmStorageError.saveError(error)))
single(.failure(RealmStorageError.deleteError(error)))
}

return Disposables.create()
Expand All @@ -136,7 +136,7 @@ extension RealmQuestsStorage: QuestsStorage {
single(.success(quests))

} catch let error {
single(.failure(RealmStorageError.saveError(error)))
single(.failure(RealmStorageError.deleteError(error)))
}

return Disposables.create()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -77,7 +77,7 @@ extension RealmUserInfoStorage: UserInfoStorage {
single(.success(user))
} catch let error {
// update 성공하지 못했을 경우, failure(error)
single(.failure(RealmStorageError.saveError(error)))
single(.failure(RealmStorageError.deleteError(error)))
}

return Disposables.create()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,8 @@ extension DefaultAuthRepository: AuthRepository {
.do(onSuccess: { [weak self] result in
if let self = self, result {
self.persistentUserStorage.deleteUserInfo()
.map { _ in true }
.catchAndReturn(false)
.flatMap { _ in
self.persistentQuestsStorage.deleteAllQuests()
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,21 +29,26 @@ extension DefaultUserUseCase: UserUseCase {

func fetch() -> Observable<User> {
return userRepository.readUser()
.catchAndReturn(User())
.asObservable()

}

func save(with user: User) -> Observable<User> {
return userRepository.updateUser(by: user)
.catchAndReturn(User())
.asObservable()
}

func saveProfileImage(data: Data) -> Observable<Bool> {
return userRepository.saveProfileImage(data: data)
.catchAndReturn(false)
.asObservable()
}

func saveBackgroundImage(data: Data) -> Observable<Bool> {
return userRepository.saveBackgroundImage(data: data)
.catchAndReturn(false)
.asObservable()
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,9 +30,7 @@ extension DefaultAuthUseCase: AuthUseCase {
func signOut() -> Observable<Bool> {
return authRepository
.signOut()
.catch { _ in
return .just(false)
}
.catchAndReturn(false)
.asObservable()
}

Expand Down
48 changes: 29 additions & 19 deletions DailyQuest/DailyQuest/Presentation/Home/View/MessageBubble.swift
Original file line number Diff line number Diff line change
Expand Up @@ -12,39 +12,43 @@ final class MessageBubbleLabel: UILabel {
private var bottomInset: CGFloat = 10.0
private var leftInset: CGFloat = 15.0
private var rightInset: CGFloat = 10.0

override init(frame: CGRect) {
super.init(frame: frame)
text = "hello world!"
}

required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}


convenience init(text: String) {
self.init(frame: .zero)
self.text = text
}

override func drawText(in rect: CGRect) {
let insets = UIEdgeInsets(top: topInset, left: leftInset, bottom: bottomInset, right: rightInset)

let bezierPath = UIBezierPath()
let width = rect.width
let height = rect.height

bezierPath.move(to: CGPoint(x: 4, y: 25))
bezierPath.addLine(to: CGPoint(x: 4, y: 20))
bezierPath.addCurve(to: CGPoint(x: 20, y: 0),
controlPoint1: CGPoint(x: 4, y: 8),
controlPoint2: CGPoint(x: 12, y: 0))

bezierPath.addLine(to: CGPoint(x: width - 20, y: 0))
bezierPath.addCurve(to: CGPoint(x: width, y: 20),
controlPoint1: CGPoint(x: width - 8, y: 0),
controlPoint2: CGPoint(x: width, y: 8))

bezierPath.addLine(to: CGPoint(x: width, y: height - 20))
bezierPath.addCurve(to: CGPoint(x: width - 20, y: height),
controlPoint1: CGPoint(x: width, y: height - 8),
controlPoint2: CGPoint(x: width - 8, y: height))

bezierPath.addLine(to: CGPoint(x: 20, y: height))
bezierPath.addCurve(to: CGPoint(x: 4, y: height - 4),
controlPoint1: CGPoint(x: 7, y: height),
Expand All @@ -60,25 +64,31 @@ final class MessageBubbleLabel: UILabel {

super.drawText(in: rect.inset(by: insets))
}

override var intrinsicContentSize: CGSize {
let size = super.intrinsicContentSize
return CGSize(width: size.width + leftInset + rightInset,
height: size.height + topInset + bottomInset)
}
}

extension MessageBubbleLabel {
func setText(text: String) {
self.text = text
}
}

#if canImport(SwiftUI) && DEBUG
import SwiftUI

struct MessageBubblePreview: PreviewProvider{
static var previews: some View {
UIViewPreview {
let bubble = MessageBubbleLabel(frame: .zero)

return bubble
import SwiftUI

struct MessageBubblePreview: PreviewProvider {
static var previews: some View {
UIViewPreview {
let bubble = MessageBubbleLabel(frame: .zero)

return bubble
}
.previewLayout(.fixed(width: 350, height: 80))
}
.previewLayout(.fixed(width: 350, height: 80))
}
}
#endif
46 changes: 38 additions & 8 deletions DailyQuest/DailyQuest/Presentation/Home/View/StatusView.swift
Original file line number Diff line number Diff line change
Expand Up @@ -13,17 +13,21 @@ import SnapKit
final class StatusView: UIView {
private var disposableBag = DisposeBag()
var profileButtonDidClick = PublishSubject<Void>()
var userDataFetched = PublishSubject<User>()

// MARK: - Components
private lazy var iconContainer: UIImageView = {
let iconContainer = UIImageView()
iconContainer.image = UIImage(named: "StatusMax")
private let messages = ["화이팅", "잘 할 수 있어", "오늘은 공부를 해보자!", "Hello, World!", "🎹🎵🎶🎵🎶"]

// MARK: - Components
private lazy var iconContainer: UIButton = {
var config = UIButton.Configuration.plain()
config.image = UIImage(named: "StatusMax")
let iconContainer = UIButton(configuration: config)
iconContainer.imageView?.contentMode = .scaleToFill
return iconContainer
}()

private lazy var messageBubble: MessageBubbleLabel = {
return MessageBubbleLabel()
return MessageBubbleLabel(text: getRandomMessage())
}()

private lazy var statusLabel: UILabel = {
Expand All @@ -47,11 +51,11 @@ final class StatusView: UIView {
private lazy var profileButton: UIButton = {
let largeConfig = UIImage.SymbolConfiguration(pointSize: 40, weight: .bold, scale: .large)
var config = UIButton.Configuration.plain()
config.baseForegroundColor = .maxLightGrey
config.image = UIImage(systemName: "person.crop.circle",
withConfiguration: largeConfig)
config.baseForegroundColor = .maxLightGrey

return UIButton(configuration: config)
let button = UIButton(configuration: config)
return button
}()

// MARK: - Methods
Expand All @@ -74,6 +78,10 @@ final class StatusView: UIView {
make.top.leading.bottom.equalToSuperview()
}

iconContainer.imageView?.snp.makeConstraints { make in
make.width.height.equalToSuperview()
}

addSubview(messageBubble)
messageBubble.snp.makeConstraints { make in
make.leading.equalTo(iconContainer.snp.trailing)
Expand Down Expand Up @@ -102,10 +110,32 @@ final class StatusView: UIView {
}

private func bind() {
iconContainer.rx.tap
.subscribe(onNext: { [weak self] _ in
guard let self = self else { return }
self.messageBubble.setText(text: self.getRandomMessage())
})
.disposed(by: disposableBag)

profileButton.rx.tap
.subscribe(onNext: { [weak self] _ in
self?.profileButtonDidClick.onNext(())
})
.disposed(by: disposableBag)

userDataFetched
.asDriver(onErrorJustReturn: User())
.drive(onNext: { [weak self] user in
guard let self = self else { return }
self.profileButton.imageView?.setImage(with: user.profileURL)
}).disposed(by: disposableBag)


}
}

extension StatusView {
private func getRandomMessage() -> String {
return messages.randomElement() ?? "Hello,World!"
}
}
Loading

0 comments on commit 52a4e27

Please sign in to comment.