Skip to content

Commit 663ad57

Browse files
authored
Merge pull request #133 from IIION/feature/sticker-logic
✨ 스티커 획득 로직과 프로필에서 뷰 할 수 있는 기능을 추가하였습니다.
2 parents 0c90671 + a25cbba commit 663ad57

File tree

6 files changed

+47
-60
lines changed

6 files changed

+47
-60
lines changed

Workade/Managers/FirestoreManager.swift

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -92,14 +92,13 @@ class FirestoreDAO {
9292
try await dto.getDocuments(collectionName: region.rawValue).count
9393
}
9494

95-
func getActiveUser(region: Region, uid: String) async throws -> ActiveUser {
95+
func getActiveUser(region: Region, uid: String) async throws {
9696
let document = try await dto.getDocument(collectionName: region.rawValue, documentName: uid)
9797
let data = document.data()
9898
let decoder = JSONDecoder()
9999
let jsonData = try JSONSerialization.data(withJSONObject: data)
100100
let activeUser = try decoder.decode(ActiveUser.self, from: jsonData)
101-
102-
return activeUser
101+
UserManager.shared.activeMyInfo = activeUser
103102
}
104103

105104
func getActiveUsers(region: Region) async throws -> [Job: [ActiveUser]]? {

Workade/SceneDelegate.swift

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -23,13 +23,12 @@ class SceneDelegate: UIResponder, UIWindowSceneDelegate {
2323
window?.rootViewController = UINavigationController(rootViewController: ExploreViewController())
2424
window?.makeKeyAndVisible()
2525
Task {
26-
// try Auth.auth().signOut()
26+
// try Auth.auth().signOut()
2727
guard let uid = Auth.auth().currentUser?.uid,
2828
let user = try await FirestoreDAO.shared.getUser(userID: uid),
2929
let region = user.activeRegion
3030
else { return }
31-
async let count = try? await FirestoreDAO.shared.getActiveUsersNumber(region: region)
32-
await window?.rootViewController?.navigationController?.pushViewController(WorkationViewController(region: region, peopleCount: count ?? 0), animated: false)
31+
try await FirestoreDAO.shared.getActiveUser(region: region, uid: uid)
3332
}
3433

3534
if let url = connectionOptions.urlContexts.first?.url {

Workade/Views&ViewModels/MyPage/StickerCollectionViewCell.swift

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ class StickerCollectionViewCell: UICollectionViewCell {
2222

2323
let stickerImage: UIImageView = {
2424
let image = UIImageView()
25+
image.contentMode = .scaleAspectFit
2526
image.translatesAutoresizingMaskIntoConstraints = false
2627

2728
return image
@@ -106,6 +107,6 @@ class StickerCollectionViewCell: UICollectionViewCell {
106107

107108
let labelsHeight = nameLabelHeight + dataLabelHeight + locationLabelHeight
108109

109-
return labelsHeight + 6 + stickerImageWidth
110+
return labelsHeight + 32 + stickerImageWidth
110111
}
111112
}

Workade/Views&ViewModels/Workation/StickerProgress/StickerProgressView.swift

Lines changed: 12 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,9 @@ import Combine
99
import UIKit
1010

1111
final class StickerProgressView: UIView {
12+
13+
var stickers: [StickerTitle]
14+
1215
var cancellable = Set<AnyCancellable>()
1316

1417
private let workationProgressView: UIProgressView = {
@@ -68,13 +71,13 @@ final class StickerProgressView: UIView {
6871
private lazy var lockStack: UIStackView = {
6972
let stackView = UIStackView(arrangedSubviews: [
7073
UIView(),
71-
weekStack(image: UIImage(named: "sampleSticker"), isUnlocked: true, week: 1),
74+
weekStack(image: UIImage(named: stickers[0].rawValue), isUnlocked: UserManager.shared.activeMyInfo?.progressDay ?? 0 >= 7, week: 1),
7275
UIView(),
73-
weekStack(image: UIImage(named: "sampleSticker"), isUnlocked: true, week: 2),
76+
weekStack(image: UIImage(named: stickers[1].rawValue), isUnlocked: UserManager.shared.activeMyInfo?.progressDay ?? 0 >= 14, week: 2),
7477
UIView(),
75-
weekStack(image: UIImage(named: "sampleSticker"), isUnlocked: false, week: 3),
78+
weekStack(image: UIImage(named: stickers[2].rawValue), isUnlocked: UserManager.shared.activeMyInfo?.progressDay ?? 0 >= 21, week: 3),
7679
UIView(),
77-
weekStack(image: UIImage(named: "sampleSticker"), isUnlocked: false, week: 4),
80+
weekStack(image: UIImage(named: stickers[3].rawValue), isUnlocked: UserManager.shared.activeMyInfo?.progressDay ?? 0 >= 28, week: 4),
7881
UIView()
7982
])
8083
stackView.axis = .horizontal
@@ -84,8 +87,9 @@ final class StickerProgressView: UIView {
8487
return stackView
8588
}()
8689

87-
override init(frame: CGRect) {
88-
super.init(frame: frame)
90+
init(stickers: [StickerTitle]) {
91+
self.stickers = stickers
92+
super.init(frame: .zero)
8993

9094
setupLayout()
9195
bind()
@@ -131,47 +135,10 @@ final class StickerProgressView: UIView {
131135
guard let self = self, var user = user else { return }
132136
DispatchQueue.main.async {
133137
let offsetDate = Date().timeIntervalSince(user.startDate)
134-
let day = Int(offsetDate/86400)
135-
self.workationProgressView.progress = Float(day > 0 ? day/35 : 0)
138+
let day = Float(offsetDate/86400)
139+
self.workationProgressView.setProgress(day > 0 ? day/35 : 0, animated: true)
136140
}
137141
}
138142
.store(in: &cancellable)
139143
}
140144
}
141-
142-
#if canImport(SwiftUI) && DEBUG
143-
import SwiftUI
144-
145-
struct StickerProgressViewPreview: PreviewProvider {
146-
static var previews: some View {
147-
UIViewPreview {
148-
let view = StickerProgressView(frame: .zero)
149-
return view
150-
}
151-
.frame(width: 310, height: 90)
152-
.previewLayout(.sizeThatFits)
153-
}
154-
}
155-
#endif
156-
157-
#if canImport(SwiftUI) && DEBUG
158-
import SwiftUI
159-
struct UIViewPreview<View: UIView>: UIViewRepresentable {
160-
let view: View
161-
162-
init(_ builder: @escaping () -> View) {
163-
view = builder()
164-
}
165-
166-
// MARK: - UIViewRepresentable
167-
168-
func makeUIView(context: Context) -> UIView {
169-
return view
170-
}
171-
172-
func updateUIView(_ view: UIView, context: Context) {
173-
view.setContentHuggingPriority(.defaultHigh, for: .horizontal)
174-
view.setContentHuggingPriority(.defaultHigh, for: .vertical)
175-
}
176-
}
177-
#endif

Workade/Views&ViewModels/Workation/StickerSheet/StickerSheetViewController.swift

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -66,9 +66,18 @@ class StickerSheetViewController: UIViewController {
6666
}()
6767

6868
@objc private func backgroundViewTapped(_ tapRecognizer: UITapGestureRecognizer) {
69-
if step < stickers.count {
69+
if step < stickers.count-1 {
7070
step += 1
7171
} else {
72+
Task {
73+
guard var user = UserManager.shared.user.value else { return }
74+
if user.stickers == nil {
75+
user.stickers = stickers
76+
} else {
77+
user.stickers?.append(contentsOf: stickers)
78+
}
79+
try await FirestoreDAO.shared.createUser(user: user)
80+
}
7281
presentingViewController?.dismiss(animated: true)
7382
self.viewDidDismiss?()
7483
}

Workade/Views&ViewModels/Workation/WorkationViewController.swift

Lines changed: 19 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ final class WorkationViewController: UIViewController {
1515
var dismissAction: (() -> Void)?
1616

1717
var cancellable = Set<AnyCancellable>()
18+
var activeUserCancellable: AnyCancellable? = nil
1819

1920
let canGetStickers: [StickerTitle] = [
2021
.halLaBong, .dolHaReuBang, .horse, .halLaSan
@@ -200,8 +201,9 @@ final class WorkationViewController: UIViewController {
200201
alert.addAction(UIAlertAction(title: "종료", style: .destructive, handler: { [weak self] _ in
201202
Task { [weak self] in
202203
guard let self = self, var user = UserManager.shared.user.value else { return }
203-
try await FirestoreDAO.shared.deleteActiveUser(userID: user.id, region: self.region)
204-
try await FirestoreDAO.shared.createUser(user: User(id: user.id, name: user.name, email: user.email, job: user.job, stickers: user.stickers, activeRegion: nil))
204+
self.activeUserCancellable?.cancel()
205+
try? await FirestoreDAO.shared.deleteActiveUser(userID: user.id, region: self.region)
206+
try? await FirestoreDAO.shared.createUser(user: User(id: user.id, name: user.name, email: user.email, job: user.job, stickers: user.stickers, activeRegion: nil))
205207
}
206208

207209
UIView.animate(withDuration: 0.3, delay: 0) { [weak self] in
@@ -295,7 +297,7 @@ final class WorkationViewController: UIViewController {
295297
label.textColor = .theme.primary
296298
label.text = "스티커"
297299

298-
let progressView = StickerProgressView()
300+
let progressView = StickerProgressView(stickers: canGetStickers)
299301

300302
let stackView = UIStackView(arrangedSubviews: [label, progressView])
301303
stackView.axis = .vertical
@@ -453,14 +455,17 @@ extension WorkationViewController {
453455
DispatchQueue.main.async {
454456
let offsetDate = Date().timeIntervalSince(user.startDate)
455457
let day = Int(ceil(offsetDate/86400))
458+
if let storedDay = user.progressDay {
459+
self.compareProgressDay(presentDay: day, storedDay: storedDay)
460+
}
456461
user.progressDay = day
457462
self.updateActiveUser(user: user)
458463
self.dayLabel.text = "\(day)일째"
459464
}
460465
}
461466
.store(in: &cancellable)
462467

463-
UserManager.shared.$activeMyInfo
468+
activeUserCancellable = UserManager.shared.$activeMyInfo
464469
.sink { [weak self] user in
465470
guard let self = self, var user = user else { return }
466471
DispatchQueue.main.async {
@@ -477,12 +482,11 @@ extension WorkationViewController {
477482
self.loginPaneView.isHidden = true
478483
}
479484
}
480-
.store(in: &cancellable)
481485
}
482486

483487
private func updateActiveUser(user: ActiveUser) {
484488
Task {
485-
try await FirestoreDAO.shared.updateActiveUser(user: user)
489+
try await FirestoreDAO.shared.createActiveUser(user: user)
486490
}
487491
}
488492

@@ -492,7 +496,15 @@ extension WorkationViewController {
492496
if storedStep < step {
493497
let getStickers = [StickerTitle](canGetStickers[storedStep..<step])
494498
let stickers = getStickers.map { StickerModel(date: Date(), title: $0, region: self.region) }
495-
self.present(StickerSheetViewController(stickers: stickers), animated: true)
499+
let stickerShetViewController = StickerSheetViewController(stickers: stickers)
500+
self.present(stickerShetViewController, animated: true)
501+
let dimView = UIView(frame: UIScreen.main.bounds)
502+
dimView.backgroundColor = .theme.primary.withAlphaComponent(0.8)
503+
view.addSubview(dimView)
504+
view.bringSubviewToFront(dimView)
505+
stickerShetViewController.viewDidDismiss = {
506+
dimView.removeFromSuperview()
507+
}
496508
}
497509
}
498510
}

0 commit comments

Comments
 (0)