diff --git a/KkuMulKum.xcodeproj/project.pbxproj b/KkuMulKum.xcodeproj/project.pbxproj index 4538597e..cef5022b 100644 --- a/KkuMulKum.xcodeproj/project.pbxproj +++ b/KkuMulKum.xcodeproj/project.pbxproj @@ -61,6 +61,11 @@ 78B9286E2C29402C006D9942 /* SceneDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 78B9286D2C29402C006D9942 /* SceneDelegate.swift */; }; 78B928752C29402E006D9942 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 78B928742C29402E006D9942 /* Assets.xcassets */; }; 78B928782C29402E006D9942 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 78B928762C29402E006D9942 /* LaunchScreen.storyboard */; }; + A3DD9C3D2C41BAD000E58A13 /* MeetingTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = A3DD9C322C41BAD000E58A13 /* MeetingTableViewCell.swift */; }; + A3DD9C3E2C41BAD000E58A13 /* MeetingDummyModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = A3DD9C342C41BAD000E58A13 /* MeetingDummyModel.swift */; }; + A3DD9C3F2C41BAD000E58A13 /* MeetingListView.swift in Sources */ = {isa = PBXBuildFile; fileRef = A3DD9C362C41BAD000E58A13 /* MeetingListView.swift */; }; + A3DD9C402C41BAD000E58A13 /* MeetingListViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = A3DD9C382C41BAD000E58A13 /* MeetingListViewController.swift */; }; + A3DD9C412C41BAD000E58A13 /* MeetingListViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = A3DD9C3A2C41BAD000E58A13 /* MeetingListViewModel.swift */; }; A3FB184D2C3BF45F001483E5 /* MakeMeetingsRequestModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = A3FB184C2C3BF45F001483E5 /* MakeMeetingsRequestModel.swift */; }; A3FB184F2C3BF4BC001483E5 /* MakeMeetingsResponseModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = A3FB184E2C3BF4BB001483E5 /* MakeMeetingsResponseModel.swift */; }; A3FB18512C3BF531001483E5 /* RegisterMeetingsResponseModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = A3FB18502C3BF531001483E5 /* RegisterMeetingsResponseModel.swift */; }; @@ -96,7 +101,6 @@ DD931B762C3DC16100526452 /* PromiseInfoView.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD931B752C3DC16100526452 /* PromiseInfoView.swift */; }; DDA2EE732C385EB9007C6059 /* MainTabBarController.swift in Sources */ = {isa = PBXBuildFile; fileRef = DDA2EE722C385EB9007C6059 /* MainTabBarController.swift */; }; DDA2EE752C385FB1007C6059 /* HomeViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = DDA2EE742C385FB1007C6059 /* HomeViewController.swift */; }; - DDA2EE772C385FC3007C6059 /* GroupListViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = DDA2EE762C385FC3007C6059 /* GroupListViewController.swift */; }; DDAF1C7C2C3D5B86008A37D3 /* RxCocoa in Frameworks */ = {isa = PBXBuildFile; productRef = DDAF1C7B2C3D5B86008A37D3 /* RxCocoa */; }; DDAF1C7E2C3D5B86008A37D3 /* RxRelay in Frameworks */ = {isa = PBXBuildFile; productRef = DDAF1C7D2C3D5B86008A37D3 /* RxRelay */; }; DDAF1C812C3D5BD5008A37D3 /* Kingfisher in Frameworks */ = {isa = PBXBuildFile; productRef = DDAF1C802C3D5BD5008A37D3 /* Kingfisher */; }; @@ -184,6 +188,11 @@ 78B928742C29402E006D9942 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 78B928772C29402E006D9942 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; 78B928792C29402E006D9942 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + A3DD9C322C41BAD000E58A13 /* MeetingTableViewCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MeetingTableViewCell.swift; sourceTree = ""; }; + A3DD9C342C41BAD000E58A13 /* MeetingDummyModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MeetingDummyModel.swift; sourceTree = ""; }; + A3DD9C362C41BAD000E58A13 /* MeetingListView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MeetingListView.swift; sourceTree = ""; }; + A3DD9C382C41BAD000E58A13 /* MeetingListViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MeetingListViewController.swift; sourceTree = ""; }; + A3DD9C3A2C41BAD000E58A13 /* MeetingListViewModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MeetingListViewModel.swift; sourceTree = ""; }; A3FB184C2C3BF45F001483E5 /* MakeMeetingsRequestModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MakeMeetingsRequestModel.swift; sourceTree = ""; }; A3FB184E2C3BF4BB001483E5 /* MakeMeetingsResponseModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MakeMeetingsResponseModel.swift; sourceTree = ""; }; A3FB18502C3BF531001483E5 /* RegisterMeetingsResponseModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RegisterMeetingsResponseModel.swift; sourceTree = ""; }; @@ -219,7 +228,6 @@ DD931B752C3DC16100526452 /* PromiseInfoView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PromiseInfoView.swift; sourceTree = ""; }; DDA2EE722C385EB9007C6059 /* MainTabBarController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MainTabBarController.swift; sourceTree = ""; }; DDA2EE742C385FB1007C6059 /* HomeViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HomeViewController.swift; sourceTree = ""; }; - DDA2EE762C385FC3007C6059 /* GroupListViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GroupListViewController.swift; sourceTree = ""; }; DDAF1C832C3D5D19008A37D3 /* ViewModelType.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewModelType.swift; sourceTree = ""; }; DDAF1C882C3D6E3D008A37D3 /* ReadyStatusViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ReadyStatusViewController.swift; sourceTree = ""; }; DDAF1C892C3D6E3D008A37D3 /* PromiseSegmentedControl.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PromiseSegmentedControl.swift; sourceTree = ""; }; @@ -484,6 +492,58 @@ path = KkuMulKum; sourceTree = ""; }; + A3DD9C332C41BAD000E58A13 /* Cell */ = { + isa = PBXGroup; + children = ( + A3DD9C322C41BAD000E58A13 /* MeetingTableViewCell.swift */, + ); + path = Cell; + sourceTree = ""; + }; + A3DD9C352C41BAD000E58A13 /* Model */ = { + isa = PBXGroup; + children = ( + A3DD9C342C41BAD000E58A13 /* MeetingDummyModel.swift */, + ); + path = Model; + sourceTree = ""; + }; + A3DD9C372C41BAD000E58A13 /* View */ = { + isa = PBXGroup; + children = ( + A3DD9C362C41BAD000E58A13 /* MeetingListView.swift */, + ); + path = View; + sourceTree = ""; + }; + A3DD9C392C41BAD000E58A13 /* ViewController */ = { + isa = PBXGroup; + children = ( + A3DD9C382C41BAD000E58A13 /* MeetingListViewController.swift */, + ); + path = ViewController; + sourceTree = ""; + }; + A3DD9C3B2C41BAD000E58A13 /* ViewModel */ = { + isa = PBXGroup; + children = ( + A3DD9C3A2C41BAD000E58A13 /* MeetingListViewModel.swift */, + ); + path = ViewModel; + sourceTree = ""; + }; + A3DD9C3C2C41BAD000E58A13 /* MeetingList */ = { + isa = PBXGroup; + children = ( + A3DD9C332C41BAD000E58A13 /* Cell */, + A3DD9C352C41BAD000E58A13 /* Model */, + A3DD9C372C41BAD000E58A13 /* View */, + A3DD9C392C41BAD000E58A13 /* ViewController */, + A3DD9C3B2C41BAD000E58A13 /* ViewModel */, + ); + path = MeetingList; + sourceTree = ""; + }; DD3976692C41769900E2A4C4 /* ViewModel */ = { isa = PBXGroup; children = ( @@ -700,14 +760,6 @@ path = Home; sourceTree = ""; }; - DDA2EE7C2C38607F007C6059 /* GroupList */ = { - isa = PBXGroup; - children = ( - DDA2EE762C385FC3007C6059 /* GroupListViewController.swift */, - ); - path = GroupList; - sourceTree = ""; - }; DDA2EE7E2C3860B2007C6059 /* Core */ = { isa = PBXGroup; children = ( @@ -778,7 +830,7 @@ DDA2EE7E2C3860B2007C6059 /* Core */, DDA2EE7B2C386078007C6059 /* Home */, DD43936B2C412F4500EC1799 /* GroupCreate */, - DDA2EE7C2C38607F007C6059 /* GroupList */, + A3DD9C3C2C41BAD000E58A13 /* MeetingList */, DE159D312C406E1600425101 /* MyPage */, DE6D4D0E2C3F14D80005584B /* MeetingInfo */, DD865B652C3920F600C351A2 /* Onboarding */, @@ -1206,6 +1258,7 @@ DE254AAC2C31192400A4015E /* UILabel+.swift in Sources */, DE254AB72C3119D000A4015E /* ReuseIdentifiable.swift in Sources */, DDA2EE752C385FB1007C6059 /* HomeViewController.swift in Sources */, + A3DD9C412C41BAD000E58A13 /* MeetingListViewModel.swift in Sources */, DDAF1C922C3D6E3D008A37D3 /* PromiseInfoViewController.swift in Sources */, 78AED1342C3D951F000AD80A /* NicknameViewController.swift in Sources */, DE254AB42C31199B00A4015E /* UITextField+.swift in Sources */, @@ -1226,6 +1279,7 @@ DE254AAE2C31193600A4015E /* UIFont+.swift in Sources */, DE6D4D152C3F14D80005584B /* InvitationCodePopUpViewController.swift in Sources */, DD4393792C412F4500EC1799 /* JoinButtonView.swift in Sources */, + A3DD9C3E2C41BAD000E58A13 /* MeetingDummyModel.swift in Sources */, DE9E189A2C3BCCBE00DB76B4 /* UtilsTemp.swift in Sources */, 782B407B2C3E395A008B0CA7 /* WelcomeView.swift in Sources */, DD3072142C3BF87A00416D9F /* NearestPromiseResponseModel.swift in Sources */, @@ -1235,7 +1289,6 @@ DE254AB22C31197B00A4015E /* UIButton+.swift in Sources */, DE6D4D162C3F14D80005584B /* MeetingInfoViewController.swift in Sources */, DE159D322C406E1600425101 /* MyPageAlarmSettingView.swift in Sources */, - DDA2EE772C385FC3007C6059 /* GroupListViewController.swift in Sources */, 78B9286C2C29402C006D9942 /* AppDelegate.swift in Sources */, DEBA032F2C3C24F2002ED8F2 /* ModelType.swift in Sources */, 789AD4B52C3C0147002E2688 /* ResissueResponseModel.swift in Sources */, @@ -1254,6 +1307,7 @@ DE9E18892C3BC91000DB76B4 /* ResponseBodyDTO.swift in Sources */, DD931B6B2C3D9EBB00526452 /* ReadyStatusView.swift in Sources */, DD3976682C41769400E2A4C4 /* CreateGroupViewModel.swift in Sources */, + A3DD9C3D2C41BAD000E58A13 /* MeetingTableViewCell.swift in Sources */, DD39766B2C41995A00E2A4C4 /* FinishCreateNavigationView.swift in Sources */, DD3072202C3C0D4500416D9F /* MyReadyStatusResponseModel.swift in Sources */, DD3072282C3C104D00416D9F /* ArrivalCompletionResponseModel.swift in Sources */, @@ -1263,6 +1317,8 @@ 789873332C3D1A7B00435E96 /* LoginViewModel.swift in Sources */, 782B40752C3DBFBA008B0CA7 /* ProfileView.swift in Sources */, DED5DBEE2C34529A006ECE7E /* BaseView.swift in Sources */, + A3DD9C402C41BAD000E58A13 /* MeetingListViewController.swift in Sources */, + A3DD9C3F2C41BAD000E58A13 /* MeetingListView.swift in Sources */, DE9E18802C3BA4AA00DB76B4 /* CustomButton.swift in Sources */, DE254AB02C31195B00A4015E /* NSAttributedString+.swift in Sources */, DD43937B2C412F4500EC1799 /* CreateGroupViewController.swift in Sources */, diff --git a/KkuMulKum.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved b/KkuMulKum.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved index d4e8c523..53691825 100644 --- a/KkuMulKum.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved +++ b/KkuMulKum.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved @@ -1,4 +1,5 @@ { + "originHash" : "9a47217a5c175e3de895c155c13de64f1d563d13e297ec224a467854897a75be", "pins" : [ { "identity" : "abseil-cpp-binary", @@ -174,7 +175,7 @@ { "identity" : "rxswift", "kind" : "remoteSourceControl", - "location" : "https://github.com/ReactiveX/RxSwift", + "location" : "https://github.com/ReactiveX/RxSwift.git", "state" : { "revision" : "b06a8c8596e4c3e8e7788e08e720e3248563ce6a", "version" : "6.7.1" @@ -208,5 +209,5 @@ } } ], - "version" : 2 + "version" : 3 } diff --git a/KkuMulKum/Resource/Assets.xcassets/Icon/ic_groupPlus.imageset/Contents.json b/KkuMulKum/Resource/Assets.xcassets/Icon/ic_groupPlus.imageset/Contents.json new file mode 100644 index 00000000..25adfe64 --- /dev/null +++ b/KkuMulKum/Resource/Assets.xcassets/Icon/ic_groupPlus.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "filename" : "ic_grpplus.svg", + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/KkuMulKum/Resource/Assets.xcassets/Icon/ic_groupPlus.imageset/ic_grpplus.svg b/KkuMulKum/Resource/Assets.xcassets/Icon/ic_groupPlus.imageset/ic_grpplus.svg new file mode 100644 index 00000000..03ab7a65 --- /dev/null +++ b/KkuMulKum/Resource/Assets.xcassets/Icon/ic_groupPlus.imageset/ic_grpplus.svg @@ -0,0 +1,3 @@ + + + diff --git a/KkuMulKum/Resource/Assets.xcassets/Icon/icon_groupPlus.imageset/Contents.json b/KkuMulKum/Resource/Assets.xcassets/Icon/icon_groupPlus.imageset/Contents.json deleted file mode 100644 index fb9b4d62..00000000 --- a/KkuMulKum/Resource/Assets.xcassets/Icon/icon_groupPlus.imageset/Contents.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "images" : [ - { - "filename" : "groupPlus.svg", - "idiom" : "universal" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/KkuMulKum/Resource/Assets.xcassets/Icon/icon_groupPlus.imageset/groupPlus.svg b/KkuMulKum/Resource/Assets.xcassets/Icon/icon_groupPlus.imageset/groupPlus.svg deleted file mode 100644 index d31a2cb0..00000000 --- a/KkuMulKum/Resource/Assets.xcassets/Icon/icon_groupPlus.imageset/groupPlus.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/KkuMulKum/Source/Core/MainTabBarController.swift b/KkuMulKum/Source/Core/MainTabBarController.swift index beffd260..bd98daca 100644 --- a/KkuMulKum/Source/Core/MainTabBarController.swift +++ b/KkuMulKum/Source/Core/MainTabBarController.swift @@ -29,7 +29,7 @@ final class MainTabBarController: UITabBarController { $0.tabBarItem.image = .iconHome } - let groupListViewController: GroupListViewController = GroupListViewController().then { + let groupListViewController: MeetingListViewController = MeetingListViewController().then { $0.tabBarItem.title = "내 모임" $0.tabBarItem.image = .iconGroup } diff --git a/KkuMulKum/Source/GroupCreate/CreateGroup/ViewController/CreateGroupViewController.swift b/KkuMulKum/Source/GroupCreate/CreateGroup/ViewController/CreateGroupViewController.swift index 45e3fd07..a29571d3 100644 --- a/KkuMulKum/Source/GroupCreate/CreateGroup/ViewController/CreateGroupViewController.swift +++ b/KkuMulKum/Source/GroupCreate/CreateGroup/ViewController/CreateGroupViewController.swift @@ -8,7 +8,7 @@ import UIKit class CreateGroupViewController: BaseViewController { - private let createGroupViewModel: CreateGroupViewModel = CreateGroupViewModel() + private let createGroupViewModel: CreateGroupViewModel = CreateGroupViewModel(service: CreateGroupService()) private let createGroupView: CreateGroupView = CreateGroupView() diff --git a/KkuMulKum/Source/GroupCreate/InviteCode/ViewController/InviteCodeViewController.swift b/KkuMulKum/Source/GroupCreate/InviteCode/ViewController/InviteCodeViewController.swift index 3ad9a770..d06d55f9 100644 --- a/KkuMulKum/Source/GroupCreate/InviteCode/ViewController/InviteCodeViewController.swift +++ b/KkuMulKum/Source/GroupCreate/InviteCode/ViewController/InviteCodeViewController.swift @@ -8,7 +8,7 @@ import UIKit class InviteCodeViewController: BaseViewController { - private let inviteCodeViewModel: InviteCodeViewModel = InviteCodeViewModel() + private let inviteCodeViewModel: InviteCodeViewModel = InviteCodeViewModel(service: MockInviteCodeService()) private let inviteCodeView: InviteCodeView = InviteCodeView() diff --git a/KkuMulKum/Source/MeetingList/Cell/MeetingTableViewCell.swift b/KkuMulKum/Source/MeetingList/Cell/MeetingTableViewCell.swift new file mode 100644 index 00000000..afd769b3 --- /dev/null +++ b/KkuMulKum/Source/MeetingList/Cell/MeetingTableViewCell.swift @@ -0,0 +1,69 @@ +// +// GroupViewCell.swift +// KkuMulKum +// +// Created by 예삐 on 7/12/24. +// + +import UIKit + +import SnapKit +import Then + +final class MeetingTableViewCell: BaseTableViewCell { + + + // MARK: - Property + + private let cellView = UIView(backgroundColor: .white).then { + $0.layer.cornerRadius = 8 + } + + private let nameLabel = UILabel() + + private let countLabel = UILabel() + + private let rightIcon = UIImageView().then { + $0.image = .iconRight + } + + + // MARK: - UI Setting + + override func setupView() { + self.backgroundColor = .clear + addSubviews(cellView, nameLabel, countLabel, rightIcon) + } + + override func setupAutoLayout() { + cellView.snp.makeConstraints { + $0.top.leading.trailing.equalToSuperview() + $0.height.equalTo(76) + } + + nameLabel.snp.makeConstraints { + $0.top.equalToSuperview().offset(16) + $0.leading.equalToSuperview().offset(20) + } + + countLabel.snp.makeConstraints { + $0.bottom.equalTo(cellView.snp.bottom).offset(-16) + $0.leading.equalToSuperview().offset(20) + } + + rightIcon.snp.makeConstraints { + $0.centerY.equalTo(cellView.snp.centerY) + $0.trailing.equalToSuperview().offset(-16) + } + } +} + + +// MARK: - Data Bind + +extension MeetingTableViewCell { + func dataBind(_ contentData: MeetingDummyModel) { + nameLabel.setText(contentData.name, style: .body03, color: .gray8) + countLabel.setText("\(contentData.count)명 참여 중", style: .caption02, color: .gray5) + } +} diff --git a/KkuMulKum/Source/MeetingList/Model/MeetingDummyModel.swift b/KkuMulKum/Source/MeetingList/Model/MeetingDummyModel.swift new file mode 100644 index 00000000..ccf915a9 --- /dev/null +++ b/KkuMulKum/Source/MeetingList/Model/MeetingDummyModel.swift @@ -0,0 +1,29 @@ +// +// MeetingListModel.swift +// KkuMulKum +// +// Created by 예삐 on 7/12/24. +// + +import UIKit + +struct MeetingDummyModel { + let name: String + let count: Int +} + +extension MeetingDummyModel { + static func dummy() -> [MeetingDummyModel] { + return [ + MeetingDummyModel(name: "꾸물이들", count: 14), + MeetingDummyModel(name: "꾸물이들", count: 14), + MeetingDummyModel(name: "꾸물이들", count: 14), + MeetingDummyModel(name: "꾸물이들", count: 14), + MeetingDummyModel(name: "꾸물이들", count: 14), + MeetingDummyModel(name: "꾸물이들", count: 14), + MeetingDummyModel(name: "꾸물이들", count: 14), + MeetingDummyModel(name: "꾸물이들", count: 14), + MeetingDummyModel(name: "꾸물이들", count: 14) + ] + } +} diff --git a/KkuMulKum/Source/MeetingList/View/MeetingListView.swift b/KkuMulKum/Source/MeetingList/View/MeetingListView.swift new file mode 100644 index 00000000..f3e43f00 --- /dev/null +++ b/KkuMulKum/Source/MeetingList/View/MeetingListView.swift @@ -0,0 +1,89 @@ +// +// GroupListView.swift +// KkuMulKum +// +// Created by 예삐 on 7/12/24. +// + +import UIKit + +import SnapKit +import Then + +final class MeetingListView: BaseView { + + + // MARK: - Property + + private let header = UIView() + + private let infoLabel = UILabel().then { + $0.setText("꾸물리안이 가입한 모임은\n총 3개예요!", style: .head01, color: .gray8) + } + + private let addButton = UIButton().then { + $0.backgroundColor = .green2 + $0.layer.cornerRadius = 8 + } + + private let addInfoView = UIStackView().then { + $0.axis = .horizontal + $0.spacing = 8 + $0.alignment = .fill + $0.distribution = .fill + } + + private let addInfoLabel = UILabel().then { + $0.setText("모임 추가하기", style: .body05, color: .green3) + } + + private let addIconImageView = UIImageView().then { + $0.image = .icGroupPlus + } + + lazy var tableView = UITableView(frame: .zero, style: .plain).then { + $0.backgroundColor = .clear + $0.showsVerticalScrollIndicator = false + $0.separatorStyle = .none + $0.tableHeaderView = header + } + + + // MARK: - UI Setting + + override func setupView() { + self.backgroundColor = .gray0 + addSubview(tableView) + header.addSubviews(infoLabel, addButton, addInfoView) + addInfoView.addArrangedSubviews(addIconImageView, addInfoLabel) + } + + override func setupAutoLayout() { + infoLabel.snp.makeConstraints { + $0.top.equalToSuperview().offset(24) + $0.leading.equalToSuperview() + } + + addButton.snp.makeConstraints { + $0.top.equalTo(infoLabel.snp.bottom).offset(16) + $0.leading.trailing.equalToSuperview() + $0.height.equalTo(Screen.height(48)) + } + + addInfoView.snp.makeConstraints { + $0.centerY.equalTo(addButton.snp.centerY) + $0.centerX.equalTo(addButton.snp.centerX) + } + + tableView.snp.makeConstraints { + $0.leading.trailing.equalToSuperview().inset(20) + $0.top.bottom.equalToSuperview() + } + + header.snp.makeConstraints { + $0.top.equalToSuperview() + $0.width.equalTo(UIScreen.main.bounds.width) + $0.height.equalTo(Screen.height(170)) + } + } +} diff --git a/KkuMulKum/Source/MeetingList/ViewController/MeetingListViewController.swift b/KkuMulKum/Source/MeetingList/ViewController/MeetingListViewController.swift new file mode 100644 index 00000000..45ff9ece --- /dev/null +++ b/KkuMulKum/Source/MeetingList/ViewController/MeetingListViewController.swift @@ -0,0 +1,104 @@ +// +// GroupListViewController.swift +// KkuMulKum +// +// Created by YOUJIM on 7/6/24. +// + +import UIKit + +import SnapKit + +class MeetingListViewController: BaseViewController { + + + // MARK: - Property + + private let rootView = MeetingListView() + private let viewModel = MeetingListViewModel() + + + // MARK: - Initializer + + override func loadView() { + self.view = rootView + } + + override func viewDidLoad() { + super.viewDidLoad() + + view.backgroundColor = .gray0 + register() + + updateMeetingList() + viewModel.dummy() + } + + + // MARK: - Function + + override func setupView() { + setupNavigationBar() + } + + private func register() { + rootView.tableView.register( + MeetingTableViewCell.self, forCellReuseIdentifier: MeetingTableViewCell.reuseIdentifier + ) + } + + override func setupDelegate() { + rootView.tableView.delegate = self + rootView.tableView.dataSource = self + } + + private func updateMeetingList() { + viewModel.meetingListData.bind { [weak self] _ in + DispatchQueue.main.async { + self?.rootView.tableView.reloadData() + } + } + } + + + // MARK: - Function + + private func setupNavigationBar() { + title = "내 모임" + + navigationController?.navigationBar.titleTextAttributes = [ + .foregroundColor: UIColor.gray8, + .font: UIFont.pretendard(.body03) + ] + + let lineView = UIView(backgroundColor: .gray2) + navigationController?.navigationBar.addSubview(lineView) + + lineView.snp.makeConstraints { + $0.leading.trailing.equalToSuperview() + $0.bottom.equalTo(navigationController?.navigationBar.snp.bottom ?? 0) + $0.height.equalTo(Screen.height(1)) + } + } +} + +extension MeetingListViewController: UITableViewDelegate { + func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat { + return Screen.height(88) + } +} + +extension MeetingListViewController: UITableViewDataSource { + func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { + return viewModel.meetingListData.value.count + } + + func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { + guard let cell = rootView.tableView.dequeueReusableCell( + withIdentifier: MeetingTableViewCell.reuseIdentifier, for: indexPath + ) as? MeetingTableViewCell else { return UITableViewCell() } + cell.dataBind(viewModel.meetingListData.value[indexPath.item]) + cell.selectionStyle = .none + return cell + } +} diff --git a/KkuMulKum/Source/MeetingList/ViewModel/MeetingListViewModel.swift b/KkuMulKum/Source/MeetingList/ViewModel/MeetingListViewModel.swift new file mode 100644 index 00000000..fb2d90d3 --- /dev/null +++ b/KkuMulKum/Source/MeetingList/ViewModel/MeetingListViewModel.swift @@ -0,0 +1,23 @@ +// +// MeetingListViewModel.swift +// KkuMulKum +// +// Created by 예삐 on 7/13/24. +// + +import UIKit + +import Then + +final class MeetingListViewModel { + var meetingListData = ObservablePattern<[MeetingDummyModel]>([]) + + /// 더미 함수 이후에 삭제 + func dummy() { + meetingListData.value = MeetingDummyModel.dummy() + } + + func updateContentData(newData: [MeetingDummyModel]) { + meetingListData.value = newData + } +}