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] 그룹상세화면 구현 #33

Merged
merged 4 commits into from
Feb 8, 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
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] {
Comment on lines +97 to 98
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

NSTDateUtility는 모든 개발자들이 사용하는 유틸리티일거에요.
본 유틸리티에서 static func으로 추가하여 사용한다면, 불특정 다수의 개발자가 해당 함수를 사용할 수 있겠죠?

  1. 다른 영역에서도 넓게 쓰일 수 있도록 함수 이름과 사용 예시를 명확히 정해주세요
    or
  2. 사용하는 뷰 내부에서 private하게 자체적으로 만들어 써도 될 것 같아요

둘 중 하나로 골라서 진행해보시면 좋을 것 같아요!

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

오우 이거 수정한다는걸 깜먹고 올렸네요 수정하고 올리겠슴당

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