Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,86 @@
//
// CommonQuestBottomSheetView.swift
// ByeBoo-iOS
//
// Created by 이나연 on 2/23/26.
//

import UIKit

import SnapKit

final class CommonQuestBottomSheetView: BaseView {
private let sheetType: CommonQuestArchiveType
private let contentStackView = UIStackView()
private(set) var dismissButton = ByeBooButton(titleText: "닫기", type: .disabled)
private(set) var itemList: [UIStackView] = []

init(sheetType: CommonQuestArchiveType) {
self.sheetType = sheetType
super.init(frame: .zero)
}

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

override func setUI() {
addSubviews(contentStackView, dismissButton)

sheetType.items.enumerated().forEach { index, item in
let rowView = makeItemRow(item: item)
itemList.append(rowView)
contentStackView.addArrangedSubview(rowView)

if index != sheetType.items.count - 1 {
let divider = SectionDividerView()
contentStackView.addArrangedSubview(divider)
}
}
}

override func setStyle() {
backgroundColor = .grayscale900

contentStackView.do {
$0.axis = .vertical
$0.spacing = 20
}

dismissButton.isEnabled = true
}

override func setLayout() {
contentStackView.snp.makeConstraints {
$0.top.equalToSuperview().inset(42.adjustedH)
$0.leading.trailing.equalToSuperview().inset(24.adjustedW)
}

dismissButton.snp.makeConstraints {
$0.bottom.equalToSuperview().inset(36.adjustedH)
$0.leading.trailing.equalToSuperview().inset(24.adjustedW)
}
}
}

private extension CommonQuestBottomSheetView {
func makeItemRow(item: CommonQuestArchiveType.Item) -> UIStackView {
let icon = UIImageView(image: item.icon)
let label = UILabel()

label.applyByeBooFont(style: .body3R16, text: item.title, color: item.color)

let stackView = UIStackView()

icon.snp.makeConstraints {
$0.size.equalTo(24)
}

stackView.do {
$0.axis = .horizontal
$0.spacing = 12.adjustedW
}
stackView.addArrangedSubviews(icon, label)
return stackView
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
//
// CommonQuestBottomSheetViewController.swift
// ByeBoo-iOS
//
// Created by 이나연 on 2/23/26.
//

import UIKit

final class CommonQuestBottomSheetViewController: BaseViewController {
private var rootView = CommonQuestBottomSheetView(sheetType: .other)
var sheetType: CommonQuestArchiveType?

override func loadView() {
view = rootView
}

override func setAddTarget() {
rootView.dismissButton.addTarget(self, action: #selector(dismissButtonDidTap), for: .touchUpInside)
rootView.itemList.enumerated().forEach { index, item in
let tapRecognizer = UITapGestureRecognizer(target: self, action: #selector(sheetItemDidTap(_:)))
item.tag = index
item.addGestureRecognizer(tapRecognizer)
item.isUserInteractionEnabled = true
}
}


func configure(sheeetTYpe: CommonQuestArchiveType) {
self.sheetType = sheeetTYpe
if let sheetType {
rootView = CommonQuestBottomSheetView(sheetType: sheetType)
}
}

@objc
private func sheetItemDidTap(_ tapRecognizer: UITapGestureRecognizer) {
guard let tappedView = tapRecognizer.view,
let sheetType = sheetType else { return }

let index = tappedView.tag
guard sheetType.items.indices.contains(index) else { return }

let action = sheetType.items[index].action

switch action {
case .edit:
// TODO: 수정하기
ByeBooLogger.debug("edit")
case .delete:
// TODO: 삭제하기
ByeBooLogger.debug("delete")
case .block:
// TODO: 차단하기
ByeBooLogger.debug("block")
case .report:
// TODO: 신고하기
ByeBooLogger.debug("report")
}
}

@objc
private func dismissButtonDidTap() {
presentingViewController?.dismiss(animated: true)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -85,7 +85,6 @@ final class EmotionBottomSheetView: BaseView {
titleLabel.snp.makeConstraints {
$0.top.equalToSuperview().offset(53.adjustedH)
$0.centerX.equalToSuperview()
// $0.height.equalTo(62.adjustedH)
}

warningStackView.snp.makeConstraints {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ final class SectionDividerView: BaseView {

override func setStyle() {
dividerView.do {
$0.backgroundColor = .white5
$0.backgroundColor = .grayscale800
}
}

Expand Down
21 changes: 14 additions & 7 deletions ByeBoo-iOS/ByeBoo-iOS/Presentation/Common/ToastMessageView.swift
Original file line number Diff line number Diff line change
Expand Up @@ -9,13 +9,15 @@ import UIKit

final class ToastMessageView: BaseView {

private let toastType: ToastMessageType
private let toastImageView = UIImageView()
private let textLabel = UILabel()

init(image: UIImage, text: String) {
init(type: ToastMessageType) {
self.toastType = type
super.init(frame: .zero)
self.toastImageView.image = image
self.textLabel.text = text
self.toastImageView.image = toastType.image
self.textLabel.text = toastType.text
}

required init?(coder: NSCoder) {
Expand All @@ -24,15 +26,19 @@ final class ToastMessageView: BaseView {

override func setStyle() {
self.do {
$0.backgroundColor = .black80
$0.backgroundColor = toastType.backgroundColor
$0.layer.cornerRadius = 12
$0.layer.shadowColor = UIColor(red: 0, green: 0, blue: 0, alpha: 0.25).cgColor
$0.layer.shadowOpacity = 1
$0.layer.shadowRadius = 4
$0.layer.shadowOffset = CGSize(width: 0, height: 4)
}

textLabel.applyByeBooFont(style: .body6R14, color: .grayscale50)
textLabel.applyByeBooFont(
style: .body6R14,
color: .grayscale50,
numberOfLines: 0
)
}

override func setUI() {
Expand All @@ -44,16 +50,17 @@ final class ToastMessageView: BaseView {

override func setLayout() {
self.snp.makeConstraints {
$0.height.equalTo(42.adjustedH)
$0.height.greaterThanOrEqualTo(46.adjustedH)
}

toastImageView.snp.makeConstraints {
$0.leading.equalToSuperview().inset(16.adjustedW)
$0.centerY.equalToSuperview()
}
textLabel.snp.makeConstraints {
$0.verticalEdges.equalToSuperview().inset(13.adjustedH)
$0.leading.equalTo(toastImageView.snp.trailing).offset(8.adjustedW)
$0.trailing.equalToSuperview().inset(16.adjustedW)
$0.centerY.equalToSuperview()
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
//
// CommonQuestArchiveType.swift
// ByeBoo-iOS
//
// Created by 이나연 on 2/23/26.
//

import Foundation
import UIKit

enum CommonQuestArchiveType {
case mine
case other

enum Action {
case edit, delete, report, block
}

struct Item {
let title: String
let icon: UIImage
let color: UIColor
let action: Action
}

var items: [Item] {
switch self {
case .mine:
return [
Item(title: "수정하기", icon: .edit, color: .white, action: .edit),
Item(title: "삭제하기", icon: .trash, color: .error300, action: .delete)
]
case .other:
return [
Item(title: "사용자 차단하기", icon: .block, color: .white, action: .block),
Item(title: "게시글 신고하기", icon: .report, color: .error300, action: .report)
]
}
}
}
26 changes: 25 additions & 1 deletion ByeBoo-iOS/ByeBoo-iOS/Presentation/Enum/ToastMessageType.swift
Original file line number Diff line number Diff line change
Expand Up @@ -10,18 +10,42 @@ import UIKit
enum ToastMessageType {

case connectServerError
case block
case report
case nicknameViolation
case questViolation

var image: UIImage {
switch self {
case .connectServerError:
case .connectServerError, .nicknameViolation, .questViolation:
return .errorToast
case .block, .report:
return .success
}
}

var backgroundColor: UIColor {
switch self {
case .block, .report, .questViolation:
return .black
case .connectServerError, .nicknameViolation:
return .black80
}
}

var text: String {
switch self {
case .connectServerError:
return "서버에 연결할 수 없습니다. 잠시 후 시도해 주세요."
case .block:
return "차단이 완료되었어요. 이에 해당 사용자의 글이 노출되지 않아요."
case .report:
return "신고가 접수되었어요. 처리 결과는 알림을 통해 알려드려요."
case .nicknameViolation:
return "비속어나 부적절한 단어가 포함된 닉네임은 등록할 수 없어요."
case .questViolation:
return "공통 퀘스트 답변은 모두에게 공개되기 때문에 부적절한 단어가 포함된 답변은 등록할 수 없어요."
}
}
}

Original file line number Diff line number Diff line change
Expand Up @@ -14,11 +14,7 @@ protocol ToastPresentable: AnyObject {
extension ToastPresentable where Self: BaseViewController {

func presentToastMessage(type: ToastMessageType) {
let toastMessageView = ToastMessageView(
image: type.image,
text: type.text
)

let toastMessageView = ToastMessageView(type: type)
setUI(toastMessageView)
setLayout(toastMessageView)

Expand All @@ -33,7 +29,7 @@ extension ToastPresentable where Self: BaseViewController {

private func setLayout(_ view: ToastMessageView) {
view.snp.makeConstraints {
$0.centerX.equalToSuperview()
$0.horizontalEdges.equalToSuperview().inset(24.adjustedW)
$0.bottom.equalToSuperview().inset(104.adjustedH)
}
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
{
"images" : [
{
"filename" : "success.svg",
"idiom" : "universal"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading