Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[Feat/NST-13] group member 화면 구현완료 #36

Merged
merged 6 commits into from
Feb 11, 2025
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
4 changes: 3 additions & 1 deletion Noostak_iOS/Noostak_iOS/Domain/Entity/Group.swift
Original file line number Diff line number Diff line change
Expand Up @@ -14,8 +14,10 @@ struct Group {
let code: String
///그룹 멤버수
let membersCount: Int
///그룹 이미지
let groupImage: String
///방장
let leader: User
let host: User
///멤버
let members: [User]
}
2 changes: 1 addition & 1 deletion Noostak_iOS/Noostak_iOS/Domain/Entity/User.swift
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ struct User {
///유저 이름
let name: String
///유저 프로필사진
let image: String?
let userImage: String?
}

struct UserToken {
Expand Down
2 changes: 1 addition & 1 deletion Noostak_iOS/Noostak_iOS/Global/Components/LikeButton.swift
Original file line number Diff line number Diff line change
Expand Up @@ -61,7 +61,7 @@ final class LikeButton: UIButton {
}

countLabel.do {
$0.font = .PretendardStyle.c2_sb.font
$0.font = .PretendardStyle.c3_sb.font
}

self.do {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,7 @@ final class ScheduleCategoryButton: UIButton {
self.backgroundColor = category.displayColor
self.setTitleColor(category == .other ? .appGray800 : .appWhite, for: .normal)
self.layer.borderColor = UIColor.appWhite.cgColor
self.titleLabel?.font = .PretendardStyle.c2_sb.font
self.titleLabel?.font = .PretendardStyle.c3_sb.font
self.layer.borderWidth = 1
self.layer.cornerRadius = 15
}
Expand Down
8 changes: 5 additions & 3 deletions Noostak_iOS/Noostak_iOS/Global/Extension/UIFont+.swift
Original file line number Diff line number Diff line change
Expand Up @@ -61,9 +61,10 @@ extension UIFont {
case b4_r
case b5_r
case c1_b
case c2_sb
case c3_sb
case c3_r
case c4_r
case c5_r

var font: UIFont {
switch self {
Expand All @@ -86,9 +87,10 @@ extension UIFont {
case .b4_r: return UIFont.pretendard(.regular, size: 15)
case .b5_r: return UIFont.pretendard(.regular, size: 14)
case .c1_b: return UIFont.pretendard(.bold, size: 13)
case .c2_sb: return UIFont.pretendard(.semibold, size: 13)
case .c3_sb: return UIFont.pretendard(.semibold, size: 13)
case .c3_r: return UIFont.pretendard(.regular, size: 13)
case .c4_r: return UIFont.pretendard(.regular, size: 11)
case .c5_r: return UIFont.pretendard(.regular, size: 10)
}
}

Expand All @@ -97,7 +99,7 @@ extension UIFont {
switch self {
case .h1_b, .h1_sb, .h2_b, .h3_sb, .h3_22_SB, .h4_b, .h4_sb, .h5_b,
.t1_sb, .t2_r, .t3_b, .t4_b, .b1_sb, .b2_r, .b4_sb,
.b4_sb_1percent, .b4_r, .b5_r, .c1_b, .c2_sb, .c3_r, .c4_r:
.b4_sb_1percent, .b4_r, .b5_r, .c1_b, .c3_sb, .c3_r, .c4_r, .c5_r:
return 140
}
}
Expand Down
44 changes: 1 addition & 43 deletions Noostak_iOS/Noostak_iOS/Global/Utils/NSTDateUtility.swift
Original file line number Diff line number Diff line change
Expand Up @@ -94,49 +94,8 @@ public extension NSTDateUtility {
}

extension NSTDateUtility {
///타임테이블 뷰 : "요일 월/일"
static func dateList(_ dateStrings: [String]) -> [String] {
let formatter = NSTDateUtility(format: .yyyyMMddTHHmmss) // ISO 8601 형식
let displayFormatter = NSTDateUtility(format: .EEMMdd) // 출력 형식

return dateStrings.compactMap { dateString in
switch formatter.date(from: dateString) {
case .success(let date):
return displayFormatter.string(from: date)
case .failure(let error):
print("Failed to parse date \(dateString): \(error.localizedDescription)")
return nil
}
}
}

///타임테이블 뷰 : "00시"
static func timeList(_ startTime: String, _ endTime: String) -> [String] {
let formatter = NSTDateUtility(format: .yyyyMMddTHHmmss) // ISO 8601 형식
var result: [String] = []

switch (formatter.date(from: startTime), formatter.date(from: endTime)) {
case (.success(let start), .success(let end)):
let calendar = Calendar.current
var current = start

while current <= end {
result.append(NSTDateUtility(format: .HH).string(from: current)) // 출력 형식
if let nextHour = calendar.date(byAdding: .hour, value: 1, to: current) {
current = nextHour
} else {
break
}
}
default:
print("Failed to parse start or end time.")
return []
}
return result
}

static func durationList(_ startTime: String, _ endTime: String) -> String {
let formatter = NSTDateUtility(format: .yyyyMMddTHHmmss) // ISO 8601 형식
let formatter = NSTDateUtility(format: .yyyyMMddTHHmmss)
let dateFormatter = NSTDateUtility(format: .MMddEE) // "9월 7일 (일)"
let timeFormatter = NSTDateUtility(format: .HHmm) // "10:00"

Expand All @@ -149,5 +108,4 @@ extension NSTDateUtility {
}
return "\(dateFormatter.string(from: startDate)) \(timeFormatter.string(from: startDate))~\(timeFormatter.string(from: endDate))"
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
//
// GroupMemberCellReactor.swift
// Noostak_iOS
//
// Created by 오연서 on 2/9/25.
//

import ReactorKit
import RxSwift

final class GroupMemberCellReactor: Reactor {
typealias Action = NoAction
struct State {
let user: User
}

let initialState: State

init(user: User) {
self.initialState = State(user: user)
}
}

let mockMemberData = Group(id: 1,
name: "누트탁",
code: "AKFJS",
membersCount: 10,
groupImage: "df",
host: User(name: "오연서", userImage: "1"),
members: [
User(name: "오연서", userImage: "1"),
User(name: "오옹서", userImage: "1"),
User(name: "오앵서", userImage: "1"),
User(name: "오용서", userImage: "1"),
User(name: "오잉서", userImage: "1"),
User(name: "오옹서", userImage: "1"),
User(name: "오앵서", userImage: "1"),
User(name: "오용아", userImage: "1"),
User(name: "오러서", userImage: "1"),
User(name: "오엉서", userImage: "1")]
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
//
// GroupMemberReactor.swift
// Noostak_iOS
//
// Created by 오연서 on 2/9/25.
//

import ReactorKit
import RxSwift
import RxDataSources

final class GroupMemberReactor: Reactor {
enum Action {
case loadGroupData
}

enum Mutation {
case setGroup(Group)
}

struct State {
var group: Group
}

let initialState: State

init() {
self.initialState = State(group: mockMemberData)
}

func mutate(action: Action) -> Observable<Mutation> {
switch action {
case .loadGroupData:
return Observable.just(.setGroup(currentState.group))
}
}

func reduce(state: State, mutation: Mutation) -> State {
var newState = state
switch mutation {
case .setGroup(let group):
newState.group = group
}
return newState
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,75 @@
//
// GroupMemberCVC.swift
// Noostak_iOS
//
// Created by 오연서 on 2/9/25.
//

import UIKit
import SnapKit
import Then
import ReactorKit

final class GroupMemberCVC: UICollectionViewCell, View {

// MARK: Properties
static let identifier = "GroupMemberCVC"
var disposeBag = DisposeBag()

// MARK: Views
private let memberProfile = UIImageView()
private let memberName = UILabel()

// MARK: Init
override init(frame: CGRect) {
super.init(frame: frame)
setUpHierarchy()
setUpUI()
setUpLayout()
}

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

// MARK: setUpHierarchy
private func setUpHierarchy() {
[memberProfile, memberName].forEach {
self.addSubview($0)
}
}

// MARK: setUpUI
private func setUpUI() {
memberProfile.do {
$0.image = .imgProfileFilled
$0.layer.cornerRadius = 30.5
}

memberName.do {
$0.font = .PretendardStyle.c3_sb.font
$0.textColor = .appGray900
}
}

// MARK: setUpLayout
private func setUpLayout() {
memberProfile.snp.makeConstraints {
$0.top.centerX.equalToSuperview()
$0.size.equalTo(61)
}

memberName.snp.makeConstraints {
$0.top.equalTo(memberProfile.snp.bottom).offset(4)
$0.centerX.equalTo(memberProfile)
}
}
}

extension GroupMemberCVC {
func bind(reactor: GroupMemberCellReactor) {
let user = reactor.currentState.user
memberProfile.image = .imgProfileFilled //api 연결시 변경
memberName.text = user.name
}
}
Loading