diff --git a/ByeBoo-iOS/ByeBoo-iOS.xcodeproj/project.pbxproj b/ByeBoo-iOS/ByeBoo-iOS.xcodeproj/project.pbxproj
index 23f8f4ef..4fcdf4cf 100644
--- a/ByeBoo-iOS/ByeBoo-iOS.xcodeproj/project.pbxproj
+++ b/ByeBoo-iOS/ByeBoo-iOS.xcodeproj/project.pbxproj
@@ -348,7 +348,8 @@
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
CODE_SIGN_ENTITLEMENTS = "ByeBoo-iOS/ByeBoo-Prod.entitlements";
- "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
+ CODE_SIGN_IDENTITY = "Apple Development";
+ "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution";
CODE_SIGN_STYLE = Manual;
CURRENT_PROJECT_VERSION = 6;
DEVELOPMENT_TEAM = "";
@@ -371,7 +372,7 @@
PRODUCT_BUNDLE_IDENTIFIER = "com.heartz.ByeBoo-iOS";
PRODUCT_NAME = "$(TARGET_NAME)";
PROVISIONING_PROFILE_SPECIFIER = "";
- "PROVISIONING_PROFILE_SPECIFIER[sdk=iphoneos*]" = "match Development com.heartz.ByeBoo-iOS";
+ "PROVISIONING_PROFILE_SPECIFIER[sdk=iphoneos*]" = "match AppStore com.heartz.ByeBoo-iOS";
SUPPORTED_PLATFORMS = "iphoneos iphonesimulator";
SUPPORTS_MACCATALYST = NO;
SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO;
diff --git a/ByeBoo-iOS/ByeBoo-iOS/Presentation/Common/Modal/ConfirmModalView.swift b/ByeBoo-iOS/ByeBoo-iOS/Presentation/Common/Modal/ConfirmModalView.swift
index 37528a85..b747f1c2 100644
--- a/ByeBoo-iOS/ByeBoo-iOS/Presentation/Common/Modal/ConfirmModalView.swift
+++ b/ByeBoo-iOS/ByeBoo-iOS/Presentation/Common/Modal/ConfirmModalView.swift
@@ -10,22 +10,25 @@ import UIKit
enum ConfirmModalType {
case logout
case withdraw
+ case block
var title: String {
switch self {
case .logout:
- return "로그아웃하시겠어요?"
+ "로그아웃하시겠어요?"
case .withdraw:
- return "정말 탈퇴하시겠어요?"
+ "정말 탈퇴하시겠어요?"
+ case .block:
+ "차단을 해제하시겠어요?"
}
}
var description: String? {
switch self {
- case .logout:
- return nil
+ case .logout, .block:
+ nil
case .withdraw:
- return "탈퇴 시 모든 데이터가 삭제됩니다."
+ "탈퇴 시 모든 데이터가 삭제됩니다."
}
}
}
diff --git a/ByeBoo-iOS/ByeBoo-iOS/Presentation/Enum/ExternalLink.swift b/ByeBoo-iOS/ByeBoo-iOS/Presentation/Enum/ExternalLink.swift
index 53d6a46f..ba51b345 100644
--- a/ByeBoo-iOS/ByeBoo-iOS/Presentation/Enum/ExternalLink.swift
+++ b/ByeBoo-iOS/ByeBoo-iOS/Presentation/Enum/ExternalLink.swift
@@ -14,6 +14,8 @@ enum ExternalLink: String {
case makeService = "https://forms.gle/BA77gAgZ1NCatart5"
case serviceTerm = "https://lively-mars-3b7.notion.site/24cab823e68d801aac95ec5d0389d192"
case privacyPolicy = "https://lively-mars-3b7.notion.site/24cab823e68d80a19ab1fbf87d6cfbc3"
+ case openChattingRoom = "https://open.kakao.com/o/p74inNhi"
+ case instagram = "https://www.instagram.com/byeboo.official"
func openURL(for rootViewController: UIViewController) {
guard let url = URL(string: self.rawValue) else {
diff --git a/ByeBoo-iOS/ByeBoo-iOS/Presentation/Enum/MyPageFeatureType.swift b/ByeBoo-iOS/ByeBoo-iOS/Presentation/Enum/MyPageFeatureType.swift
index df16ab97..5f8f7933 100644
--- a/ByeBoo-iOS/ByeBoo-iOS/Presentation/Enum/MyPageFeatureType.swift
+++ b/ByeBoo-iOS/ByeBoo-iOS/Presentation/Enum/MyPageFeatureType.swift
@@ -11,6 +11,8 @@ enum MyPageFeatureType: String {
case inquire = "문의하기"
case notice = "알림"
+ case participant = "참여하기"
+ case manage = "관리"
case termAndPolicy = "약관 및 정책"
case account = "계정"
@@ -20,6 +22,10 @@ enum MyPageFeatureType: String {
return [.inquireByeBoo, .makeService]
case .notice:
return [.questOpenNotice]
+ case .participant:
+ return [.chattingRoom, .instagram]
+ case .manage:
+ return [.blockUserList]
case .termAndPolicy:
return [.privacyPolicy, .serviceTerm]
case .account:
@@ -33,6 +39,9 @@ enum MyPageDetailFeatureType: String {
case inquireByeBoo = "바이부에 문의하기"
case makeService = "바이부와 함께 서비스 만들기"
case questOpenNotice = "퀘스트 오픈 알림"
+ case chattingRoom = "이별 극복 소통방"
+ case instagram = "공식 인스타그램"
+ case blockUserList = "차단 사용자 목록"
case privacyPolicy = "개인정보 처리 방침"
case serviceTerm = "서비스 이용 약관"
case logout = "로그아웃"
diff --git a/ByeBoo-iOS/ByeBoo-iOS/Presentation/Feature/MyPage/View/BlockedUserCell.swift b/ByeBoo-iOS/ByeBoo-iOS/Presentation/Feature/MyPage/View/BlockedUserCell.swift
new file mode 100644
index 00000000..7b5e0b8b
--- /dev/null
+++ b/ByeBoo-iOS/ByeBoo-iOS/Presentation/Feature/MyPage/View/BlockedUserCell.swift
@@ -0,0 +1,77 @@
+//
+// BlockUserListView.swift
+// ByeBoo-iOS
+//
+// Created by APPLE on 2/22/26.
+//
+
+import UIKit
+
+final class BlockedUserCell: UITableViewCell {
+
+ private let userNameLabel = UILabel()
+ private(set) var clearButton = UIButton()
+
+ override init(
+ style: UITableViewCell.CellStyle,
+ reuseIdentifier: String?
+ ) {
+ super.init(style: style, reuseIdentifier: reuseIdentifier)
+
+ setStyle()
+ setUI()
+ setLayout()
+ }
+
+ required init?(coder: NSCoder) {
+ fatalError("init(coder:) has not been implemented")
+ }
+
+ private func setStyle() {
+ self.do {
+ $0.backgroundColor = .grayscale900
+ $0.selectionStyle = .none
+ }
+ userNameLabel.applyByeBooFont(
+ style: .body2M16,
+ color: .grayscale100
+ )
+ clearButton.do {
+ $0.setTitle("해제", for: .normal)
+ $0.applyByeBooFont(style: .cap1M12, color: .grayscale100)
+ $0.backgroundColor = UIColor.white.withAlphaComponent(0.05)
+ $0.layer.borderWidth = 1
+ $0.layer.borderColor = UIColor.grayscale800.cgColor
+ $0.layer.cornerRadius = 12
+ }
+ }
+
+ private func setUI() {
+ contentView.addSubviews(
+ userNameLabel,
+ clearButton
+ )
+ }
+
+ private func setLayout() {
+ userNameLabel.snp.makeConstraints {
+ $0.leading.equalToSuperview().inset(24.adjustedW)
+ $0.verticalEdges.equalToSuperview()
+ $0.centerY.equalToSuperview()
+ }
+ clearButton.snp.makeConstraints {
+ $0.trailing.equalToSuperview().inset(24.adjustedW)
+ $0.verticalEdges.equalToSuperview()
+ $0.centerY.equalTo(userNameLabel.snp.centerY)
+ $0.width.equalTo(56.adjustedW)
+ $0.height.equalTo(24.adjustedH)
+ }
+ }
+}
+
+extension BlockedUserCell {
+
+ func bind(userName: String) {
+ userNameLabel.text = userName
+ }
+}
diff --git a/ByeBoo-iOS/ByeBoo-iOS/Presentation/Feature/MyPage/View/BlockedUserListView.swift b/ByeBoo-iOS/ByeBoo-iOS/Presentation/Feature/MyPage/View/BlockedUserListView.swift
new file mode 100644
index 00000000..b1a1f2f2
--- /dev/null
+++ b/ByeBoo-iOS/ByeBoo-iOS/Presentation/Feature/MyPage/View/BlockedUserListView.swift
@@ -0,0 +1,34 @@
+//
+// BlockUserListView.swift
+// ByeBoo-iOS
+//
+// Created by APPLE on 2/22/26.
+//
+
+import UIKit
+
+final class BlockedUserListView: BaseView {
+
+ private(set) var userTableView = UITableView()
+
+ override func setStyle() {
+ self.do {
+ $0.backgroundColor = .grayscale900
+ }
+ userTableView.do {
+ $0.backgroundColor = .grayscale900
+ }
+ }
+
+ override func setUI() {
+ addSubview(userTableView)
+ }
+
+ override func setLayout() {
+ userTableView.snp.makeConstraints {
+ $0.top.equalToSuperview().inset(12.adjustedH)
+ $0.horizontalEdges.equalToSuperview()
+ $0.bottom.equalToSuperview().inset(24.adjustedH)
+ }
+ }
+}
diff --git a/ByeBoo-iOS/ByeBoo-iOS/Presentation/Feature/MyPage/View/MyPageFeatureView.swift b/ByeBoo-iOS/ByeBoo-iOS/Presentation/Feature/MyPage/View/MyPageFeatureView.swift
index f1128399..6ccdab78 100644
--- a/ByeBoo-iOS/ByeBoo-iOS/Presentation/Feature/MyPage/View/MyPageFeatureView.swift
+++ b/ByeBoo-iOS/ByeBoo-iOS/Presentation/Feature/MyPage/View/MyPageFeatureView.swift
@@ -14,11 +14,11 @@ final class MyPageFeatureView: BaseView {
private(set) var featureButtons: [UIButton] = []
private(set) var noticeSwitch = UISwitch()
- init(title: String, features: [MyPageDetailFeatureType]) {
- titleLabel.text = title
+ init(type: MyPageFeatureType) {
+ titleLabel.text = type.rawValue
super.init(frame: .zero)
- setFeatures(features)
+ setFeatures(type.features)
}
required init?(coder: NSCoder) {
diff --git a/ByeBoo-iOS/ByeBoo-iOS/Presentation/Feature/MyPage/View/MyPageFeaturesView.swift b/ByeBoo-iOS/ByeBoo-iOS/Presentation/Feature/MyPage/View/MyPageFeaturesView.swift
new file mode 100644
index 00000000..c3620704
--- /dev/null
+++ b/ByeBoo-iOS/ByeBoo-iOS/Presentation/Feature/MyPage/View/MyPageFeaturesView.swift
@@ -0,0 +1,57 @@
+//
+// MyPageFeaturesView.swift
+// ByeBoo-iOS
+//
+// Created by APPLE on 2/25/26.
+//
+
+import UIKit
+
+final class MyPageFeaturesView: BaseView {
+
+ private(set) var inquireView = MyPageFeatureView(type: .inquire)
+ private(set) var noticeView = MyPageFeatureView(type: .notice)
+ private(set) var participantView = MyPageFeatureView(type: .participant)
+ private(set) var manageView = MyPageFeatureView(type: .manage)
+ private(set) var termAndPolicyView = MyPageFeatureView(type: .termAndPolicy)
+ private(set) var accountView = MyPageFeatureView(type: .account)
+
+ override func setUI() {
+ addSubviews(
+ inquireView,
+ noticeView,
+ participantView,
+ manageView,
+ termAndPolicyView,
+ accountView
+ )
+ }
+
+ override func setLayout() {
+ inquireView.snp.makeConstraints {
+ $0.top.equalToSuperview()
+ $0.horizontalEdges.equalToSuperview()
+ }
+ noticeView.snp.makeConstraints {
+ $0.top.equalTo(inquireView.snp.bottom)
+ $0.horizontalEdges.equalToSuperview()
+ }
+ participantView.snp.makeConstraints {
+ $0.top.equalTo(noticeView.snp.bottom)
+ $0.horizontalEdges.equalToSuperview()
+ }
+ manageView.snp.makeConstraints {
+ $0.top.equalTo(participantView.snp.bottom)
+ $0.horizontalEdges.equalToSuperview()
+ }
+ termAndPolicyView.snp.makeConstraints {
+ $0.top.equalTo(manageView.snp.bottom)
+ $0.horizontalEdges.equalToSuperview()
+ }
+ accountView.snp.makeConstraints {
+ $0.top.equalTo(termAndPolicyView.snp.bottom)
+ $0.horizontalEdges.equalToSuperview()
+ $0.bottom.equalToSuperview()
+ }
+ }
+}
diff --git a/ByeBoo-iOS/ByeBoo-iOS/Presentation/Feature/MyPage/View/MyPageView.swift b/ByeBoo-iOS/ByeBoo-iOS/Presentation/Feature/MyPage/View/MyPageView.swift
index 5dc586fd..b1906b31 100644
--- a/ByeBoo-iOS/ByeBoo-iOS/Presentation/Feature/MyPage/View/MyPageView.swift
+++ b/ByeBoo-iOS/ByeBoo-iOS/Presentation/Feature/MyPage/View/MyPageView.swift
@@ -20,22 +20,7 @@ final class MyPageView: BaseView {
private(set) var myRecordView = MyRecordView()
private(set) var worldView = ByeBooUniverseView()
private let divider2 = SectionDividerView()
- private(set) var inquireView = MyPageFeatureView(
- title: MyPageFeatureType.inquire.rawValue,
- features: MyPageFeatureType.inquire.features
- )
- private(set) var noticeView = MyPageFeatureView(
- title: MyPageFeatureType.notice.rawValue,
- features: MyPageFeatureType.notice.features
- )
- private(set) var termAndPolicyView = MyPageFeatureView(
- title: MyPageFeatureType.termAndPolicy.rawValue,
- features: MyPageFeatureType.termAndPolicy.features
- )
- private(set) var accountView = MyPageFeatureView(
- title: MyPageFeatureType.account.rawValue,
- features: MyPageFeatureType.account.features
- )
+ private(set) var featuresView = MyPageFeaturesView()
override func setStyle() {
backgroundColor = .grayscale900
@@ -53,10 +38,7 @@ final class MyPageView: BaseView {
myRecordView,
worldView,
divider2,
- inquireView,
- noticeView,
- termAndPolicyView,
- accountView
+ featuresView
)
nameView.addSubview(moveButton)
}
@@ -95,21 +77,9 @@ final class MyPageView: BaseView {
$0.top.equalTo(worldView.snp.bottom).offset(8.adjustedH)
$0.horizontalEdges.equalToSuperview().inset(24.adjustedW)
}
- inquireView.snp.makeConstraints {
+ featuresView.snp.makeConstraints {
$0.top.equalTo(divider2.snp.bottom).offset(8.adjustedH)
$0.horizontalEdges.equalToSuperview()
- }
- noticeView.snp.makeConstraints {
- $0.top.equalTo(inquireView.snp.bottom)
- $0.horizontalEdges.equalToSuperview()
- }
- termAndPolicyView.snp.makeConstraints {
- $0.top.equalTo(noticeView.snp.bottom)
- $0.horizontalEdges.equalToSuperview()
- }
- accountView.snp.makeConstraints {
- $0.top.equalTo(termAndPolicyView.snp.bottom)
- $0.horizontalEdges.equalToSuperview()
$0.bottom.equalToSuperview().inset(24.5.adjustedH)
}
}
diff --git a/ByeBoo-iOS/ByeBoo-iOS/Presentation/Feature/MyPage/ViewController/BlockedkUserListViewController.swift b/ByeBoo-iOS/ByeBoo-iOS/Presentation/Feature/MyPage/ViewController/BlockedkUserListViewController.swift
new file mode 100644
index 00000000..d4213698
--- /dev/null
+++ b/ByeBoo-iOS/ByeBoo-iOS/Presentation/Feature/MyPage/ViewController/BlockedkUserListViewController.swift
@@ -0,0 +1,139 @@
+//
+// BlockedkUserListViewController.swift
+// ByeBoo-iOS
+//
+// Created by APPLE on 2/22/26.
+//
+
+import UIKit
+
+final class BlockedkUserListViewController: BaseViewController {
+
+ private let rootView = BlockedUserListView()
+ private let viewModel: BlockedUserListViewModel
+
+ init(viewModel: BlockedUserListViewModel) {
+ self.viewModel = viewModel
+ super.init(nibName: nil, bundle: nil)
+ }
+
+ required init?(coder: NSCoder) {
+ fatalError("init(coder:) has not been implemented")
+ }
+
+ override func loadView() {
+ view = rootView
+ }
+
+ override func viewDidLoad() {
+ super.viewDidLoad()
+
+ viewModel.getBlockedUsers()
+ ByeBooNavigationBar.makeNavigationBar(
+ navigationItem: self.navigationItem,
+ navigationController: self.navigationController,
+ type: .titleAndBack("차단 사용자 목록", header: .black),
+ action: #selector(back)
+ )
+ }
+
+ override func setDelegate() {
+ rootView.userTableView.do {
+ $0.delegate = self
+ $0.dataSource = self
+ $0.register(
+ BlockedUserCell.self,
+ forCellReuseIdentifier: BlockedUserCell.identifier
+ )
+ }
+ }
+}
+
+extension BlockedkUserListViewController: BackNavigable {
+
+ func back() {
+ self.navigationController?.popViewController(animated: false)
+ }
+}
+
+extension BlockedkUserListViewController: UITableViewDelegate {
+
+ func tableView(
+ _ tableView: UITableView,
+ heightForHeaderInSection section: Int
+ ) -> CGFloat {
+ 0
+ }
+
+ func tableView(
+ _ tableView: UITableView,
+ viewForHeaderInSection section: Int
+ ) -> UIView? {
+ let headerView = UIView()
+ headerView.backgroundColor = .clear
+ return headerView
+ }
+}
+
+extension BlockedkUserListViewController: UITableViewDataSource {
+
+ func numberOfSections(in tableView: UITableView) -> Int {
+ viewModel.blockedUsersCount
+ }
+
+ func tableView(
+ _ tableView: UITableView,
+ numberOfRowsInSection section: Int
+ ) -> Int {
+ 1
+ }
+
+ func tableView(
+ _ tableView: UITableView,
+ cellForRowAt indexPath: IndexPath
+ ) -> UITableViewCell {
+ // TO-DO : extension 메서드로 수정
+ guard let cell = tableView.dequeueReusableCell(
+ withIdentifier: BlockedUserCell.identifier,
+ for: indexPath
+ ) as? BlockedUserCell else {
+ return UITableViewCell()
+ }
+
+ guard let userName = viewModel.getBlockedUserName(at: indexPath.section) else {
+ return UITableViewCell()
+ }
+
+ cell.bind(userName: userName)
+ cell.clearButton.addTarget(
+ self,
+ action: #selector(clearButtonDidTap),
+ for: .touchUpInside
+ )
+ return cell
+ }
+
+ @objc
+ private func clearButtonDidTap() {
+ let dismissButton = ByeBooButton(
+ titleText: "아니오",
+ type: .outline
+ )
+ let actionButton = ByeBooButton(
+ titleText: "예",
+ type: .enabled
+ )
+ let modal = ConfirmModalView(
+ modalType: .block,
+ dismissButton: dismissButton,
+ actionButton: actionButton
+ )
+ let action: (() -> Void) = {}
+
+ ModalBuilder(
+ modalView: modal,
+ action: action,
+ rootViewController: self
+ ).present()
+ }
+}
diff --git a/ByeBoo-iOS/ByeBoo-iOS/Presentation/Feature/MyPage/ViewController/MyPageViewController.swift b/ByeBoo-iOS/ByeBoo-iOS/Presentation/Feature/MyPage/ViewController/MyPageViewController.swift
index df69c7e5..e888088e 100644
--- a/ByeBoo-iOS/ByeBoo-iOS/Presentation/Feature/MyPage/ViewController/MyPageViewController.swift
+++ b/ByeBoo-iOS/ByeBoo-iOS/Presentation/Feature/MyPage/ViewController/MyPageViewController.swift
@@ -17,7 +17,7 @@ final class MyPageViewController: BaseViewController {
private var name: String?
private let rootView = MyPageView()
- private lazy var beforeNotificationStatus = rootView.noticeView.noticeSwitch.isOn
+ private lazy var beforeNotificationStatus = rootView.featuresView.noticeView.noticeSwitch.isOn
private var didOpenSetting = false
init(viewModel: MyPageViewModel) {
@@ -38,7 +38,6 @@ final class MyPageViewController: BaseViewController {
viewModel.action(.viewWillAppear)
viewModel.action(.checkHasEnterMyPage)
- rootView.scrollView.setContentOffset(CGPoint(x: 0, y: 0), animated: false)
}
override func viewDidLoad() {
@@ -67,12 +66,22 @@ final class MyPageViewController: BaseViewController {
action: #selector(moveButtonDidTap),
for: .touchUpInside
)
- [rootView.inquireView, rootView.termAndPolicyView, rootView.accountView].forEach {
+
+ let featuresView = rootView.featuresView
+
+ [
+ featuresView.inquireView,
+ featuresView.termAndPolicyView,
+ featuresView.accountView,
+ featuresView.participantView,
+ featuresView.manageView
+ ].forEach {
$0.featureButtons.forEach {
$0.addTarget(self, action: #selector(featureButtonDidTap(_:)), for: .touchUpInside)
}
}
- rootView.noticeView.noticeSwitch.addTarget(
+
+ featuresView.noticeView.noticeSwitch.addTarget(
self,
action: #selector(noticeSwitchValueChanged(_:)),
for: .valueChanged
@@ -161,7 +170,7 @@ extension MyPageViewController {
case .success(let alarmEnabled):
self?.beforeNotificationStatus = alarmEnabled
DispatchQueue.main.async {
- self?.rootView.noticeView.noticeSwitch.setOn(alarmEnabled, animated: false)
+ self?.rootView.featuresView.noticeView.noticeSwitch.setOn(alarmEnabled, animated: false)
}
case .failure(let error):
ByeBooLogger.error(error)
@@ -176,7 +185,7 @@ extension MyPageViewController {
switch result {
case .success(let hasEnter):
if !hasEnter {
- self?.rootView.noticeView.noticeSwitch.setOn(false, animated: false)
+ self?.rootView.featuresView.noticeView.noticeSwitch.setOn(false, animated: false)
return
}
self?.viewModel.action(.checkAlarmEnabled)
@@ -192,7 +201,7 @@ extension MyPageViewController {
.sink { [weak self] result in
switch result {
case .success(let alarmEnabled):
- self?.rootView.noticeView.noticeSwitch.setOn(alarmEnabled, animated: true)
+ self?.rootView.featuresView.noticeView.noticeSwitch.setOn(alarmEnabled, animated: true)
case .failure(let error) :
ByeBooLogger.error(error)
}
@@ -222,7 +231,7 @@ extension MyPageViewController {
viewModel.action(.notificationSwitchDidTap)
} else if !isAuthorized {
DispatchQueue.main.async {
- self.rootView.noticeView.noticeSwitch.setOn(false, animated: false)
+ self.rootView.featuresView.noticeView.noticeSwitch.setOn(false, animated: false)
}
}
@@ -298,6 +307,15 @@ extension MyPageViewController {
ExternalLink.makeService.openURL(for: self)
case .questOpenNotice:
break
+ case .chattingRoom:
+ ExternalLink.openChattingRoom.openURL(for: self)
+ case .instagram:
+ ExternalLink.instagram.openURL(for: self)
+ case .blockUserList:
+ let viewController = ViewControllerFactory.shared.makeBlockedUserListViewController()
+ viewController.navigationItem.hidesBackButton = true
+ viewController.hidesBottomBarWhenPushed = true
+ self.navigationController?.pushViewController(viewController, animated: false)
case .privacyPolicy:
ExternalLink.privacyPolicy.openURL(for: self)
case .serviceTerm:
@@ -346,6 +364,8 @@ extension MyPageViewController {
self.viewModel.action(.withdrawActionButtonDidTap)
Mixpanel.mainInstance().track(event: MyPageEvents.Name.withdrawConfirmClick)
+ case .block:
+ break
}
}
@@ -422,7 +442,7 @@ extension MyPageViewController {
style: .cancel
) { [weak self] _ in
DispatchQueue.main.async {
- self?.rootView.noticeView.noticeSwitch.setOn(false, animated: true)
+ self?.rootView.featuresView.noticeView.noticeSwitch.setOn(false, animated: true)
}
}
}
diff --git a/ByeBoo-iOS/ByeBoo-iOS/Presentation/Feature/MyPage/ViewModel/BlockedUserListViewModel.swift b/ByeBoo-iOS/ByeBoo-iOS/Presentation/Feature/MyPage/ViewModel/BlockedUserListViewModel.swift
new file mode 100644
index 00000000..c1c7dbaf
--- /dev/null
+++ b/ByeBoo-iOS/ByeBoo-iOS/Presentation/Feature/MyPage/ViewModel/BlockedUserListViewModel.swift
@@ -0,0 +1,35 @@
+//
+// BlockedUserListViewModel.swift
+// ByeBoo-iOS
+//
+// Created by APPLE on 2/23/26.
+//
+
+final class BlockedUserListViewModel {
+
+ struct BlockedUserEntity {
+ let blockID: Int
+ let name: String
+ }
+
+ private var blockedUsers: [BlockedUserEntity] = []
+
+ var blockedUsersCount: Int {
+ blockedUsers.count
+ }
+
+ func getBlockedUsers() {
+ blockedUsers = [
+ .init(blockID: 1, name: "승준"),
+ .init(blockID: 2, name: "주리"),
+ .init(blockID: 2, name: "나연")
+ ]
+ }
+
+ func getBlockedUserName(at index: Int) -> String? {
+ guard index >= 0 && index < blockedUsers.count else {
+ return nil
+ }
+ return blockedUsers[index].name
+ }
+}
diff --git a/ByeBoo-iOS/ByeBoo-iOS/Presentation/ViewControllerFactory.swift b/ByeBoo-iOS/ByeBoo-iOS/Presentation/ViewControllerFactory.swift
index d1e54e42..9eed1c97 100644
--- a/ByeBoo-iOS/ByeBoo-iOS/Presentation/ViewControllerFactory.swift
+++ b/ByeBoo-iOS/ByeBoo-iOS/Presentation/ViewControllerFactory.swift
@@ -202,6 +202,10 @@ final class ViewControllerFactory: ViewControllerFactoryProtocol {
return .init(viewModel: viewModel)
}
+
+ func makeBlockedUserListViewController() -> BlockedkUserListViewController {
+ .init(viewModel: BlockedUserListViewModel())
+ }
}
extension ViewControllerFactory {
diff --git a/ByeBoo-iOS/ByeBoo-iOS/Resource/Assets.xcassets/Card/overcoming_back.imageset/Contents.json b/ByeBoo-iOS/ByeBoo-iOS/Resource/Assets.xcassets/Card/overcoming_back.imageset/Contents.json
new file mode 100644
index 00000000..c77d4513
--- /dev/null
+++ b/ByeBoo-iOS/ByeBoo-iOS/Resource/Assets.xcassets/Card/overcoming_back.imageset/Contents.json
@@ -0,0 +1,21 @@
+{
+ "images" : [
+ {
+ "filename" : "overcoming_back.svg",
+ "idiom" : "universal",
+ "scale" : "1x"
+ },
+ {
+ "idiom" : "universal",
+ "scale" : "2x"
+ },
+ {
+ "idiom" : "universal",
+ "scale" : "3x"
+ }
+ ],
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ }
+}
diff --git a/ByeBoo-iOS/ByeBoo-iOS/Resource/Assets.xcassets/Card/overcoming_back.imageset/overcoming_back.svg b/ByeBoo-iOS/ByeBoo-iOS/Resource/Assets.xcassets/Card/overcoming_back.imageset/overcoming_back.svg
new file mode 100644
index 00000000..9c9cf97b
--- /dev/null
+++ b/ByeBoo-iOS/ByeBoo-iOS/Resource/Assets.xcassets/Card/overcoming_back.imageset/overcoming_back.svg
@@ -0,0 +1,26 @@
+
diff --git a/ByeBoo-iOS/ByeBoo-iOS/Resource/Assets.xcassets/Card/overcoming_front.imageset/Contents.json b/ByeBoo-iOS/ByeBoo-iOS/Resource/Assets.xcassets/Card/overcoming_front.imageset/Contents.json
new file mode 100644
index 00000000..3b8a4feb
--- /dev/null
+++ b/ByeBoo-iOS/ByeBoo-iOS/Resource/Assets.xcassets/Card/overcoming_front.imageset/Contents.json
@@ -0,0 +1,21 @@
+{
+ "images" : [
+ {
+ "filename" : "overcoming_front.svg",
+ "idiom" : "universal",
+ "scale" : "1x"
+ },
+ {
+ "idiom" : "universal",
+ "scale" : "2x"
+ },
+ {
+ "idiom" : "universal",
+ "scale" : "3x"
+ }
+ ],
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ }
+}
diff --git a/ByeBoo-iOS/ByeBoo-iOS/Resource/Assets.xcassets/Card/overcoming_front.imageset/overcoming_front.svg b/ByeBoo-iOS/ByeBoo-iOS/Resource/Assets.xcassets/Card/overcoming_front.imageset/overcoming_front.svg
new file mode 100644
index 00000000..6487c263
--- /dev/null
+++ b/ByeBoo-iOS/ByeBoo-iOS/Resource/Assets.xcassets/Card/overcoming_front.imageset/overcoming_front.svg
@@ -0,0 +1,34 @@
+
diff --git a/ByeBoo-iOS/ByeBoo-iOS/Resource/Assets.xcassets/Card/reunion_back.imageset/Contents.json b/ByeBoo-iOS/ByeBoo-iOS/Resource/Assets.xcassets/Card/reunion_back.imageset/Contents.json
new file mode 100644
index 00000000..32cc6309
--- /dev/null
+++ b/ByeBoo-iOS/ByeBoo-iOS/Resource/Assets.xcassets/Card/reunion_back.imageset/Contents.json
@@ -0,0 +1,21 @@
+{
+ "images" : [
+ {
+ "filename" : "reunion_back.svg",
+ "idiom" : "universal",
+ "scale" : "1x"
+ },
+ {
+ "idiom" : "universal",
+ "scale" : "2x"
+ },
+ {
+ "idiom" : "universal",
+ "scale" : "3x"
+ }
+ ],
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ }
+}
diff --git a/ByeBoo-iOS/ByeBoo-iOS/Resource/Assets.xcassets/Card/reunion_back.imageset/reunion_back.svg b/ByeBoo-iOS/ByeBoo-iOS/Resource/Assets.xcassets/Card/reunion_back.imageset/reunion_back.svg
new file mode 100644
index 00000000..009bc179
--- /dev/null
+++ b/ByeBoo-iOS/ByeBoo-iOS/Resource/Assets.xcassets/Card/reunion_back.imageset/reunion_back.svg
@@ -0,0 +1,26 @@
+
diff --git a/ByeBoo-iOS/ByeBoo-iOS/Resource/Assets.xcassets/Card/reunion_front.imageset/Contents.json b/ByeBoo-iOS/ByeBoo-iOS/Resource/Assets.xcassets/Card/reunion_front.imageset/Contents.json
new file mode 100644
index 00000000..f62255df
--- /dev/null
+++ b/ByeBoo-iOS/ByeBoo-iOS/Resource/Assets.xcassets/Card/reunion_front.imageset/Contents.json
@@ -0,0 +1,21 @@
+{
+ "images" : [
+ {
+ "filename" : "reunion_front.svg",
+ "idiom" : "universal",
+ "scale" : "1x"
+ },
+ {
+ "idiom" : "universal",
+ "scale" : "2x"
+ },
+ {
+ "idiom" : "universal",
+ "scale" : "3x"
+ }
+ ],
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ }
+}
diff --git a/ByeBoo-iOS/ByeBoo-iOS/Resource/Assets.xcassets/Card/reunion_front.imageset/reunion_front.svg b/ByeBoo-iOS/ByeBoo-iOS/Resource/Assets.xcassets/Card/reunion_front.imageset/reunion_front.svg
new file mode 100644
index 00000000..8b44c989
--- /dev/null
+++ b/ByeBoo-iOS/ByeBoo-iOS/Resource/Assets.xcassets/Card/reunion_front.imageset/reunion_front.svg
@@ -0,0 +1,32 @@
+