Skip to content

Commit d0d681d

Browse files
authored
Merge pull request #522 from sopt-makers/hotfix/#521-Third-QA
[Hotfix] #521 - 신규 홈 뷰, 솝트로그 3차 QA 반영
2 parents b6202f2 + 904dc05 commit d0d681d

File tree

23 files changed

+394
-52
lines changed

23 files changed

+394
-52
lines changed

SOPT-iOS/Projects/Core/Sources/Literals/StringLiterals.swift

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -261,6 +261,8 @@ public struct I18N {
261261
public static let attendance = "출석"
262262
public static let event = "행사"
263263
public static let seminar = "세미나"
264+
public static let jointSeminar = "합동 세미나"
265+
public static let `break` = "휴식"
264266
}
265267
}
266268

@@ -322,6 +324,11 @@ public struct I18N {
322324
public static let poke = "콕찌르기"
323325
public static let soptamp = "솝탬프"
324326
public static let withSopt = "솝트와"
327+
public static let toolTipTitle = "솝레벨이란?"
328+
public static let toolTip = """
329+
앱잼, 솝커톤, 솝텀, 모임 등 다양한
330+
솝트 활동에 참여한 횟수를 의미해요.
331+
"""
325332
}
326333

327334
public struct Attendance {

SOPT-iOS/Projects/Features/AttendanceFeature/Sources/ShowAttendanceScene/VC/ShowAttendanceVC.swift

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,6 @@ public final class ShowAttendanceVC: UIViewController, ShowAttendanceViewControl
6666

6767
private lazy var attendanceButtonStackView: UIStackView = {
6868
let stackView = UIStackView()
69-
// stackView.backgroundColor = DSKitAsset.Colors.gray900.color // 안쓰는거같음
7069
stackView.addArrangedSubview(attendanceButton)
7170
return stackView
7271
}()

SOPT-iOS/Projects/Features/HomeFeature/Sources/HomeScene/Components/TagTypes/CalenderCategoryTagType.swift

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,31 +14,41 @@ import DSKit
1414
enum CalenderCategoryTagType: String {
1515
case event = "EVENT"
1616
case seminar = "SEMINAR"
17+
case jointSeminar = "JOINT_SEMINAR"
18+
case `break` = "BREAK"
1719

1820
var text: String {
1921
switch self {
2022
case .event:
2123
return I18N.Home.DashBoard.Attendance.event
2224
case .seminar:
2325
return I18N.Home.DashBoard.Attendance.seminar
26+
case .jointSeminar:
27+
return I18N.Home.DashBoard.Attendance.jointSeminar
28+
case .break:
29+
return I18N.Home.DashBoard.Attendance.break
2430
}
2531
}
2632

2733
var textColor: UIColor {
2834
switch self {
2935
case .event:
3036
return DSKitAsset.Colors.success.color
31-
case .seminar:
37+
case .seminar, .jointSeminar:
3238
return DSKitAsset.Colors.secondary.color
39+
case .break:
40+
return DSKitAsset.Colors.information.color
3341
}
3442
}
3543

3644
var backgroundColor: UIColor {
3745
switch self {
3846
case .event:
3947
return DSKitAsset.Colors.success.color.withAlphaComponent(0.2)
40-
case .seminar:
48+
case .seminar, .jointSeminar:
4149
return DSKitAsset.Colors.secondary.color.withAlphaComponent(0.2)
50+
case .break:
51+
return DSKitAsset.Colors.information.color.withAlphaComponent(0.2)
4252
}
4353
}
4454
}

SOPT-iOS/Projects/Features/SoptlogFeature/Interface/Sources/SoptlogFeatureBuildable.swift

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,4 +10,5 @@ import Foundation
1010

1111
public protocol SoptlogFeatureBuildable {
1212
func makeSoptlog() -> SoptlogPresentable
13+
func makeSoptlogToolTip(_ toolTipFrame: CGRect) -> SoptlogTooltipPresentable
1314
}

SOPT-iOS/Projects/Features/SoptlogFeature/Interface/Sources/SoptlogPresentable.swift

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import Core
1414
public protocol SoptlogViewControllable: ViewControllable { }
1515
public protocol SoptlogCoordinatable {
1616
var onProfileEditTapped: (() -> Void)? { get set }
17+
var onToolTipTapped: ((CGRect) -> Void)? { get set }
1718
var onSoptuneTapped: (() -> Void)? { get set }
1819
var onNetworkError: (() -> Void)? { get set }
1920
var onNeedSignIn: (() -> Void)? { get set }
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
//
2+
// SoptlogToolTipPresentable.swift
3+
// SoptlogFeatureInterface
4+
//
5+
// Created by 강윤서 on 3/26/25.
6+
// Copyright © 2025 SOPT-iOS. All rights reserved.
7+
//
8+
9+
import Foundation
10+
11+
import BaseFeatureDependency
12+
import Core
13+
14+
public protocol SoptlogToolTipViewControllable: ViewControllable { }
15+
public protocol SoptlogToolTipCoordinatable {
16+
var onDismissButtonTap: (() -> Void)? { get set }
17+
}
18+
public typealias SoptlogToolTipViewModelType = ViewModelType & SoptlogToolTipCoordinatable
19+
public typealias SoptlogTooltipPresentable = (vc: SoptlogToolTipViewControllable, vm: any SoptlogToolTipViewModelType)

SOPT-iOS/Projects/Features/SoptlogFeature/Sources/SoptlogScene/Cell/SoptlogAppServiceCVC.swift

Lines changed: 30 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -7,12 +7,21 @@
77
//
88

99
import UIKit
10+
import Combine
1011

1112
import Core
1213
import DSKit
1314

1415
final class SoptlogAppServiceCVC: UICollectionViewCell {
1516

17+
// MARK: - Properties
18+
19+
lazy var toolTipButtonTapped = infoToolTipButton.publisher(for: .touchUpInside)
20+
.withUnretained(self)
21+
.map { owner, _ in
22+
owner.infoToolTipButton.convert(owner.infoToolTipButton.bounds, to: nil)
23+
}.asDriver()
24+
1625
// MARK: - UI Components
1726

1827
private let stackView = UIStackView(frame: .zero).then {
@@ -35,6 +44,16 @@ final class SoptlogAppServiceCVC: UICollectionViewCell {
3544
$0.font = DSKitFontFamily.Suit.bold.font(size: 16)
3645
}
3746

47+
private let serviceTitleStackView = UIStackView().then {
48+
$0.axis = .horizontal
49+
$0.spacing = 1
50+
}
51+
52+
private let infoToolTipButton = UIButton().then {
53+
$0.setImage(DSKitAsset.Assets.icInfo.image, for: .normal)
54+
$0.isHidden = true
55+
}
56+
3857
// MARK: - init
3958

4059
override init(frame: CGRect) {
@@ -46,11 +65,6 @@ final class SoptlogAppServiceCVC: UICollectionViewCell {
4665
required init?(coder: NSCoder) {
4766
fatalError("init(coder:) has not been implemented")
4867
}
49-
50-
override func prepareForReuse() {
51-
super.prepareForReuse()
52-
self.stackView.removeAllSubViews()
53-
}
5468
}
5569

5670
// MARK: - UI & Layout
@@ -61,18 +75,26 @@ extension SoptlogAppServiceCVC {
6175
}
6276

6377
private func setLayout() {
64-
stackView.addArrangedSubviews(serviceLabel, serviceImageView, serviceValue)
78+
setStackView()
79+
contentView.addSubviews(stackView)
6580

6681
serviceImageView.snp.makeConstraints { make in
6782
make.size.equalTo(39)
6883
}
6984

70-
contentView.addSubviews(stackView)
85+
infoToolTipButton.snp.makeConstraints { make in
86+
make.size.equalTo(16)
87+
}
7188

7289
stackView.snp.makeConstraints { make in
7390
make.center.equalToSuperview()
7491
}
7592
}
93+
94+
private func setStackView() {
95+
serviceTitleStackView.addArrangedSubviews(serviceLabel, infoToolTipButton)
96+
stackView.addArrangedSubviews(serviceTitleStackView, serviceImageView, serviceValue)
97+
}
7698
}
7799

78100
// MARK: - Methods
@@ -83,5 +105,6 @@ extension SoptlogAppServiceCVC {
83105
self.serviceLabel.text = model.serviceName
84106
self.serviceValue.text = model.serviceValue
85107
self.serviceImageView.setImage(with: model.serviceImageURL)
108+
self.infoToolTipButton.isHidden = model.serviceName != "솝레벨"
86109
}
87110
}

SOPT-iOS/Projects/Features/SoptlogFeature/Sources/SoptlogScene/Cell/SoptlogHeaderView.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ final class SoptlogHeaderView: UICollectionReusableView {
1515

1616
// MARK: - UI Components
1717

18-
private let profileImageView = CustomProfileImageView()
18+
private let profileImageView = CustomProfileImageView().hideBorder()
1919

2020
private let nameLabel = UILabel().then {
2121
$0.font = DSKitFontFamily.Suit.bold.font(size: 20)

SOPT-iOS/Projects/Features/SoptlogFeature/Sources/SoptlogScene/Coordinator/SoptlogBuilder.swift

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@
66
// Copyright © 2024 SOPT-iOS. All rights reserved.
77
//
88

9+
import Foundation
10+
911
import Core
1012
import Domain
1113
@_exported import SoptlogFeatureInterface
@@ -23,4 +25,10 @@ extension SoptlogBuilder: SoptlogFeatureBuildable {
2325
let soptlogVC = SoptlogVC(viewModel: viewModel)
2426
return (soptlogVC, viewModel)
2527
}
28+
29+
public func makeSoptlogToolTip(_ toolTipFrame: CGRect) -> SoptlogTooltipPresentable {
30+
let viewModel = SoptlogToolTipViewModel()
31+
let soptlogToolTipVC = SoptlogToolTipVC(viewModel: viewModel, toolTipFrame: toolTipFrame)
32+
return (soptlogToolTipVC, viewModel)
33+
}
2634
}

SOPT-iOS/Projects/Features/SoptlogFeature/Sources/SoptlogScene/Coordinator/SoptlogCoordinator.swift

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,10 @@ public final class SoptlogCoordinator: DefaultCoordinator {
5757
self?.requestCoordinating?(.webLink(url: url))
5858
}
5959

60+
soptlog.vm.onToolTipTapped = { [weak self] toolTipFrame in
61+
self?.showToolTip(toolTipFrame)
62+
}
63+
6064
soptlog.vm.onSoptuneTapped = { [weak self] in
6165
self?.requestCoordinating?(.dailySoptune)
6266
}
@@ -72,4 +76,16 @@ public final class SoptlogCoordinator: DefaultCoordinator {
7276
self.rootViewController = soptlog.vc.viewController
7377
self.router.push(soptlog.vc)
7478
}
79+
80+
private func showToolTip(_ frame: CGRect) {
81+
var soptlogToolTip = factory.makeSoptlogToolTip(frame)
82+
83+
soptlogToolTip.vm.onDismissButtonTap = { [weak self] in
84+
self?.rootViewController?.dismiss(animated: true )
85+
}
86+
87+
soptlogToolTip.vc.viewController.modalPresentationStyle = .overFullScreen
88+
soptlogToolTip.vc.viewController.modalTransitionStyle = .crossDissolve
89+
self.rootViewController?.present(soptlogToolTip.vc.viewController, animated: true)
90+
}
7591
}

0 commit comments

Comments
 (0)