Skip to content

Commit

Permalink
Merge pull request #36 from Noostak/feat/NST-15/groupMember
Browse files Browse the repository at this point in the history
[Feat/NST-13] group member 화면 구현완료
  • Loading branch information
oyslucy authored Feb 11, 2025
2 parents 36ff4f5 + 9acad2f commit 924c136
Show file tree
Hide file tree
Showing 11 changed files with 444 additions and 50 deletions.
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

0 comments on commit 924c136

Please sign in to comment.