Skip to content

Commit

Permalink
Merge pull request #33 from Noostak/feat/NST-15/groupDetail
Browse files Browse the repository at this point in the history
[Feat/NST-13] 그룹상세화면 구현
  • Loading branch information
oyslucy authored Feb 8, 2025
2 parents d841f39 + 1fcba75 commit 36ff4f5
Show file tree
Hide file tree
Showing 17 changed files with 864 additions and 24 deletions.
28 changes: 19 additions & 9 deletions Noostak_iOS/Noostak_iOS/Domain/Entity/Schedule.swift
Original file line number Diff line number Diff line change
Expand Up @@ -22,30 +22,40 @@ struct Schedule {
///약속 카테고리
let category: ScheduleCategory
///약속 생성기간
let dates: [Date]
let selectionDates: [Date]
///약속생성 시작일
var startDate: Date? {
return dates.sorted().first
var selectionStartDate: Date? {
return selectionDates.sorted().first
}
///약속생성 종료일
var endDate: Date? {
return dates.sorted().last
var selectionEndDate: Date? {
return selectionDates.sorted().last
}
///약속 시작시각
let startTime: Date
///약속 종료시각
let endTime: Date
///약속생성 시작시각
let selectionStartTime: Date
///약속생성 종료시각
let selectionEndTime: Date
///소요시간
var duration: Int?
}

struct ExtendedSchedule {
///스케쥴
let schedule: Schedule
///약속 날짜(1순위, 확정)
let date: String
///약속 시작시각(1순위, 확정)
let startTime: String
///약속 종료시각(1순위, 확정)
let endTime: String
///가능한 친구
let availableMembers: [User]
///불가능한 친구
let unavailableMembers: [User]
///그룹 총인원
var groupMemberCount: Int
///가능한 인원
var availableMemberCount: Int
}

extension ScheduleCategory {
Expand Down
20 changes: 11 additions & 9 deletions Noostak_iOS/Noostak_iOS/Global/Extension/UIFont+.swift
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,7 @@ extension UIFont {
case h1_sb
case h2_b
case h3_sb
case h3_22_SB
case h4_b
case h4_sb
case h5_b
Expand All @@ -63,14 +64,15 @@ extension UIFont {
case c2_sb
case c3_r
case c4_r

var font: UIFont {
switch self {
case .h1_b: return UIFont.pretendard(.bold, size: 56)
case .h1_sb: return UIFont.pretendard(.semibold, size: 56)
case .h2_b: return UIFont.pretendard(.bold, size: 27)
case .h1_b: return UIFont.pretendard(.bold, size: 27)
case .h1_sb: return UIFont.pretendard(.semibold, size: 27)
case .h2_b: return UIFont.pretendard(.bold, size: 24)
case .h3_sb: return UIFont.pretendard(.semibold, size: 24)
case .h4_b: return UIFont.pretendard(.bold, size: 24)
case .h3_22_SB: return UIFont.pretendard(.semibold, size: 22)
case .h4_b: return UIFont.pretendard(.bold, size: 20)
case .h4_sb: return UIFont.pretendard(.semibold, size: 20)
case .h5_b: return UIFont.pretendard(.bold, size: 18)
case .t1_sb: return UIFont.pretendard(.semibold, size: 18)
Expand All @@ -89,13 +91,13 @@ extension UIFont {
case .c4_r: return UIFont.pretendard(.regular, size: 11)
}
}

// Line Height (LHLHUnit)
var lineHeightUnit: CGFloat {
switch self {
case .h1_b, .h1_sb, .h2_b, .h3_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:
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:
return 140
}
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
{
"images" : [
{
"filename" : "Vector.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.
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
{
"images" : [
{
"filename" : "Supervisor account.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.
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
{
"images" : [
{
"filename" : "icon_share.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.
30 changes: 27 additions & 3 deletions Noostak_iOS/Noostak_iOS/Global/Utils/NSTDateUtility.swift
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,8 @@ public extension NSTDateUtility {
case yyyyMM
case EE
case HH
case HHmm
case EEMMdd
case MMddEE

var format: String {
Expand All @@ -69,8 +71,12 @@ public extension NSTDateUtility {
return "EE"
case .HH:
return "HH"
case .MMddEE:
case .HHmm:
return "HH:mm"
case .EEMMdd:
return "EE\nMM/dd"
case .MMddEE:
return "M월 d일 (EE)"
}
}
}
Expand All @@ -88,9 +94,10 @@ public extension NSTDateUtility {
}

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

return dateStrings.compactMap { dateString in
switch formatter.date(from: dateString) {
Expand All @@ -102,7 +109,8 @@ extension NSTDateUtility {
}
}
}


///타임테이블 뷰 : "00시"
static func timeList(_ startTime: String, _ endTime: String) -> [String] {
let formatter = NSTDateUtility(format: .yyyyMMddTHHmmss) // ISO 8601 형식
var result: [String] = []
Expand All @@ -126,4 +134,20 @@ extension NSTDateUtility {
}
return result
}

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

let startDateResult = formatter.date(from: startTime)
let endDateResult = formatter.date(from: endTime)

guard case .success(let startDate) = startDateResult,
case .success(let endDate) = endDateResult else {
return "Invalid date format"
}
return "\(dateFormatter.string(from: startDate)) \(timeFormatter.string(from: startDate))~\(timeFormatter.string(from: endDate))"
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -7,11 +7,9 @@

import UIKit

class ViewController: UIViewController {

final class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
}

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

import ReactorKit
import RxSwift

final class ConfirmedCellReactor: Reactor {
typealias Action = NoAction
struct State {
let schedule: ExtendedSchedule
}

let initialState: State

init(schedule: ExtendedSchedule) {
self.initialState = State(schedule: schedule)
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,134 @@
//
// GroupDetailReactor.swift
// Noostak_iOS
//
// Created by 오연서 on 1/31/25.
//

import ReactorKit
import RxSwift
import UIKit

final class GroupDetailReactor: Reactor {
enum Action {
case selectSegment(Int) // 세그먼트 선택
case loadInProgressData
case loadConfirmedData
}
enum Mutation {
case setSelectedSegment(Int)
case setInProgressData([InProgressCellReactor])
case setConfirmedData([ConfirmedCellReactor])
}
struct State {
var selectedSegmentIndex: Int = 0
var inProgressCellReactors: [InProgressCellReactor] = []
var confirmedCellReactors: [ConfirmedCellReactor] = []
}

let initialState = State(
selectedSegmentIndex: 0,
inProgressCellReactors: mockInProgressData.map { InProgressCellReactor(schedule: $0) },
confirmedCellReactors: mockConfirmedData.map { ConfirmedCellReactor(schedule: $0) }
)

func mutate(action: Action) -> Observable<Mutation> {
switch action {
case .selectSegment(let index):
return Observable.just(.setSelectedSegment(index))

case .loadInProgressData:
let reactors = mockInProgressData.map { InProgressCellReactor(schedule: $0) }
return Observable.just(.setInProgressData(reactors))

case .loadConfirmedData:
let reactors = mockConfirmedData.map { ConfirmedCellReactor(schedule: $0) }
return Observable.just(.setConfirmedData(reactors))
}
}

func reduce(state: State, mutation: Mutation) -> State {
var newState = state
switch mutation {
case .setSelectedSegment(let index):
newState.selectedSegmentIndex = index

case .setInProgressData(let reactors):
newState.inProgressCellReactors = reactors

case .setConfirmedData(let reactors):
newState.confirmedCellReactors = reactors
}
return newState
}
}

let mockInProgressData: [ExtendedSchedule] = [
ExtendedSchedule(schedule: Schedule(id: 1,
name: "뉴스탹진행중",
category: .hobby,
selectionDates: [],
selectionStartTime: Date(),
selectionEndTime: Date()),
date: "2024-09-05T10:00:00",
startTime: "2024-09-05T10:00:00",
endTime: "2024-09-05T18:00:00",
availableMembers: [],
unavailableMembers: [],
groupMemberCount: 24,
availableMemberCount: 11),
ExtendedSchedule(schedule: Schedule(id: 2,
name: "뉴스탹2",
category: .important,
selectionDates: [],
selectionStartTime: Date(),
selectionEndTime: Date()),
date: "2024-09-05T10:00:00",
startTime: "2024-09-05T10:00:00",
endTime: "2024-09-05T18:00:00",
availableMembers: [],
unavailableMembers: [],
groupMemberCount: 23,
availableMemberCount: 12),
ExtendedSchedule(schedule: Schedule(id: 1,
name: "뉴스탹3",
category: .hobby,
selectionDates: [],
selectionStartTime: Date(),
selectionEndTime: Date()),
date: "2024-09-05T10:00:00",
startTime: "2024-09-05T10:00:00",
endTime: "2024-09-05T18:00:00",
availableMembers: [],
unavailableMembers: [],
groupMemberCount: 24,
availableMemberCount: 11)
]
let mockConfirmedData: [ExtendedSchedule] = [
ExtendedSchedule(schedule: Schedule(id: 1,
name: "뉴스탹유ㅏㄴ",
category: .hobby,
selectionDates: [],
selectionStartTime: Date(),
selectionEndTime: Date()),
date: "2024-09-05T10:00:00",
startTime: "2024-09-05T10:00:00",
endTime: "2024-09-05T18:00:00",
availableMembers: [],
unavailableMembers: [],
groupMemberCount: 24,
availableMemberCount: 11),
ExtendedSchedule(schedule: Schedule(id: 2,
name: "뉴스탹2",
category: .important,
selectionDates: [],
selectionStartTime: Date(),
selectionEndTime: Date()),
date: "2024-09-05T10:00:00",
startTime: "2024-09-05T10:00:00",
endTime: "2024-09-05T18:00:00",
availableMembers: [],
unavailableMembers: [],
groupMemberCount: 23,
availableMemberCount: 12)
]
Loading

0 comments on commit 36ff4f5

Please sign in to comment.