diff --git a/Climeet-iOS/Climeet-iOS.xcodeproj/project.pbxproj b/Climeet-iOS/Climeet-iOS.xcodeproj/project.pbxproj index 3a0de47..d4a8b18 100644 --- a/Climeet-iOS/Climeet-iOS.xcodeproj/project.pbxproj +++ b/Climeet-iOS/Climeet-iOS.xcodeproj/project.pbxproj @@ -19,6 +19,13 @@ B94EC22A2BD13CBD00DC3FDB /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = B94EC2292BD13CBD00DC3FDB /* Assets.xcassets */; }; B94EC22D2BD13CBD00DC3FDB /* Preview Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = B94EC22C2BD13CBD00DC3FDB /* Preview Assets.xcassets */; }; B94EC2422BD1473E00DC3FDB /* .swiftlint.yml in Resources */ = {isa = PBXBuildFile; fileRef = B94EC2412BD1473E00DC3FDB /* .swiftlint.yml */; }; + D42357402C1DD6BD0070DB70 /* TabView.swift in Sources */ = {isa = PBXBuildFile; fileRef = D423573F2C1DD6BD0070DB70 /* TabView.swift */; }; + D42357432C1DFD320070DB70 /* CustomTabView.swift in Sources */ = {isa = PBXBuildFile; fileRef = D42357422C1DFD320070DB70 /* CustomTabView.swift */; }; + D42357462C1DFFBF0070DB70 /* ActivityCalendarView.swift in Sources */ = {isa = PBXBuildFile; fileRef = D42357452C1DFFBF0070DB70 /* ActivityCalendarView.swift */; }; + D42357482C1DFFDF0070DB70 /* ActivityCalendarReducer.swift in Sources */ = {isa = PBXBuildFile; fileRef = D42357472C1DFFDF0070DB70 /* ActivityCalendarReducer.swift */; }; + D423574E2C1E21260070DB70 /* CalendarDate.swift in Sources */ = {isa = PBXBuildFile; fileRef = D423574D2C1E21260070DB70 /* CalendarDate.swift */; }; + D42357522C1E21DC0070DB70 /* CustomCalendar.swift in Sources */ = {isa = PBXBuildFile; fileRef = D42357512C1E21DC0070DB70 /* CustomCalendar.swift */; }; + D42357542C1FC8910070DB70 /* Date + datesOfMonth.swift in Sources */ = {isa = PBXBuildFile; fileRef = D42357532C1FC8910070DB70 /* Date + datesOfMonth.swift */; }; D442A3DE2BF9D36500A58F92 /* SearchAPI.swift in Sources */ = {isa = PBXBuildFile; fileRef = D442A3DD2BF9D36500A58F92 /* SearchAPI.swift */; }; D442A3E12BF9D3F400A58F92 /* SearchRequestModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = D442A3E02BF9D3F400A58F92 /* SearchRequestModel.swift */; }; D442A3E62BF9D6C800A58F92 /* SearchRepository.swift in Sources */ = {isa = PBXBuildFile; fileRef = D442A3E52BF9D6C800A58F92 /* SearchRepository.swift */; }; @@ -71,6 +78,13 @@ B94EC2292BD13CBD00DC3FDB /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; B94EC22C2BD13CBD00DC3FDB /* Preview Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = "Preview Assets.xcassets"; sourceTree = ""; }; B94EC2412BD1473E00DC3FDB /* .swiftlint.yml */ = {isa = PBXFileReference; lastKnownFileType = text.yaml; path = .swiftlint.yml; sourceTree = ""; }; + D423573F2C1DD6BD0070DB70 /* TabView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TabView.swift; sourceTree = ""; }; + D42357422C1DFD320070DB70 /* CustomTabView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CustomTabView.swift; sourceTree = ""; }; + D42357452C1DFFBF0070DB70 /* ActivityCalendarView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ActivityCalendarView.swift; sourceTree = ""; }; + D42357472C1DFFDF0070DB70 /* ActivityCalendarReducer.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ActivityCalendarReducer.swift; sourceTree = ""; }; + D423574D2C1E21260070DB70 /* CalendarDate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CalendarDate.swift; sourceTree = ""; }; + D42357512C1E21DC0070DB70 /* CustomCalendar.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CustomCalendar.swift; sourceTree = ""; }; + D42357532C1FC8910070DB70 /* Date + datesOfMonth.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Date + datesOfMonth.swift"; sourceTree = ""; }; D442A3DD2BF9D36500A58F92 /* SearchAPI.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SearchAPI.swift; sourceTree = ""; }; D442A3E02BF9D3F400A58F92 /* SearchRequestModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SearchRequestModel.swift; sourceTree = ""; }; D442A3E52BF9D6C800A58F92 /* SearchRepository.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SearchRepository.swift; sourceTree = ""; }; @@ -176,6 +190,50 @@ path = "Preview Content"; sourceTree = ""; }; + D423573E2C1DD6A50070DB70 /* Tab */ = { + isa = PBXGroup; + children = ( + D423573F2C1DD6BD0070DB70 /* TabView.swift */, + D42357412C1DFD230070DB70 /* View */, + ); + path = Tab; + sourceTree = ""; + }; + D42357412C1DFD230070DB70 /* View */ = { + isa = PBXGroup; + children = ( + D42357422C1DFD320070DB70 /* CustomTabView.swift */, + ); + path = View; + sourceTree = ""; + }; + D42357442C1DFF7E0070DB70 /* ActivityCalendar */ = { + isa = PBXGroup; + children = ( + D42357452C1DFFBF0070DB70 /* ActivityCalendarView.swift */, + D42357472C1DFFDF0070DB70 /* ActivityCalendarReducer.swift */, + D423574C2C1E21160070DB70 /* Model */, + D42357492C1E0A120070DB70 /* View */, + ); + path = ActivityCalendar; + sourceTree = ""; + }; + D42357492C1E0A120070DB70 /* View */ = { + isa = PBXGroup; + children = ( + D42357512C1E21DC0070DB70 /* CustomCalendar.swift */, + ); + path = View; + sourceTree = ""; + }; + D423574C2C1E21160070DB70 /* Model */ = { + isa = PBXGroup; + children = ( + D423574D2C1E21260070DB70 /* CalendarDate.swift */, + ); + path = Model; + sourceTree = ""; + }; D442A3DF2BF9D3D900A58F92 /* RequestModel */ = { isa = PBXGroup; children = ( @@ -233,8 +291,10 @@ D47A3AA82C0CAC1E0031DCAA /* Presentation */ = { isa = PBXGroup; children = ( - D44FF2242C183508005E9EB1 /* DateTimePicker */, + D423573E2C1DD6A50070DB70 /* Tab */, + D42357442C1DFF7E0070DB70 /* ActivityCalendar */, D44FF1F32C14585A005E9EB1 /* ActivityRecord */, + D44FF2242C183508005E9EB1 /* DateTimePicker */, D47A3AA92C0CAC2D0031DCAA /* Search */, ); path = Presentation; @@ -343,6 +403,7 @@ D4930E302C0F3EE2002E138B /* Text + init.swift */, D47392092C192D7F0059AE45 /* View + onReadSize.swift */, D47392112C198E250059AE45 /* DateFormatter + .swift */, + D42357532C1FC8910070DB70 /* Date + datesOfMonth.swift */, ); path = Extension; sourceTree = ""; @@ -491,12 +552,14 @@ D4EE0D032BD14BAB004C6688 /* Encodable + toDictionary.swift in Sources */, D4B75EEE2C0B3CAA0074870D /* AppError.swift in Sources */, D4F1617A2C1AFE1D00BF4392 /* ActivityRecordHeader.swift in Sources */, + D42357402C1DD6BD0070DB70 /* TabView.swift in Sources */, 04CFB9EE2C007F4900580395 /* test.swift in Sources */, D47A3AB02C0CAD810031DCAA /* GymSearchResult.swift in Sources */, D47A3AB52C0CAF750031DCAA /* ResponseDTO + mapping.swift in Sources */, D4B75EE92C0B36350074870D /* Logger +.swift in Sources */, D4EE0CFA2BD14AC6004C6688 /* NetworkProvider.swift in Sources */, D442A3E62BF9D6C800A58F92 /* SearchRepository.swift in Sources */, + D423574E2C1E21260070DB70 /* CalendarDate.swift in Sources */, D473920A2C192D800059AE45 /* View + onReadSize.swift in Sources */, D4930E312C0F3EE2002E138B /* Text + init.swift in Sources */, D47A3AAD2C0CAC4B0031DCAA /* SearchReducer.swift in Sources */, @@ -507,18 +570,23 @@ D44FF1F52C145872005E9EB1 /* ActivityRecordView.swift in Sources */, D4EE0CFD2BD14AFB004C6688 /* ResponseDTO.swift in Sources */, D4F1617E2C1B1F8B00BF4392 /* ClimbingSetupView.swift in Sources */, + D42357432C1DFD320070DB70 /* CustomTabView.swift in Sources */, B94EC2262BD13CBB00DC3FDB /* Climeet_iOSApp.swift in Sources */, D44FF2282C183574005E9EB1 /* DateTimePickerReducer.swift in Sources */, D442A3E12BF9D3F400A58F92 /* SearchRequestModel.swift in Sources */, D4EE0CFF2BD14B59004C6688 /* ExampleAPI.swift in Sources */, D4832BB72C0DD245007731FD /* UserUsecase.swift in Sources */, + D42357542C1FC8910070DB70 /* Date + datesOfMonth.swift in Sources */, D47392122C198E250059AE45 /* DateFormatter + .swift in Sources */, + D42357462C1DFFBF0070DB70 /* ActivityCalendarView.swift in Sources */, + D42357482C1DFFDF0070DB70 /* ActivityCalendarReducer.swift in Sources */, 04CFB9EC2C007F3100580395 /* Token.swift in Sources */, D44FF1F72C145E66005E9EB1 /* ActivityRecordReducer.swift in Sources */, D442A3DE2BF9D36500A58F92 /* SearchAPI.swift in Sources */, D4B75EF02C0B3D540074870D /* Error + toAppError.swift in Sources */, D4F161782C1AAB6300BF4392 /* RootSelectionView.swift in Sources */, D47A3AB32C0CAE2D0031DCAA /* SearchUsecase.swift in Sources */, + D42357522C1E21DC0070DB70 /* CustomCalendar.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/Climeet-iOS/Climeet-iOS.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved b/Climeet-iOS/Climeet-iOS.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved index be2db42..99f52c3 100644 --- a/Climeet-iOS/Climeet-iOS.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved +++ b/Climeet-iOS/Climeet-iOS.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved @@ -23,8 +23,8 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/onevcat/Kingfisher.git", "state" : { - "revision" : "5b92f029fab2cce44386d28588098b5be0824ef5", - "version" : "7.11.0" + "revision" : "2ef543ee21d63734e1c004ad6c870255e8716c50", + "version" : "7.12.0" } }, { diff --git a/Climeet-iOS/Climeet-iOS.xcodeproj/xcuserdata/kovihouseteam.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist b/Climeet-iOS/Climeet-iOS.xcodeproj/xcuserdata/kovihouseteam.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist index 2bc988e..d80867f 100644 --- a/Climeet-iOS/Climeet-iOS.xcodeproj/xcuserdata/kovihouseteam.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist +++ b/Climeet-iOS/Climeet-iOS.xcodeproj/xcuserdata/kovihouseteam.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist @@ -3,22 +3,4 @@ uuid = "ABF4A7BC-F0C2-461F-80DF-4C114271ECD4" type = "1" version = "2.0"> - - - - - - diff --git a/Climeet-iOS/Climeet-iOS/Assets.xcassets/Icons/Calendar/Contents.json b/Climeet-iOS/Climeet-iOS/Assets.xcassets/Icons/Calendar/Contents.json new file mode 100644 index 0000000..73c0059 --- /dev/null +++ b/Climeet-iOS/Climeet-iOS/Assets.xcassets/Icons/Calendar/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Climeet-iOS/Climeet-iOS/Assets.xcassets/Icons/Calendar/calendar_left.imageset/Contents.json b/Climeet-iOS/Climeet-iOS/Assets.xcassets/Icons/Calendar/calendar_left.imageset/Contents.json new file mode 100644 index 0000000..c6e93d6 --- /dev/null +++ b/Climeet-iOS/Climeet-iOS/Assets.xcassets/Icons/Calendar/calendar_left.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "filename" : "􀆊@1x-1.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "􀆊@2x-1.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "􀆊@3x-1.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git "a/Climeet-iOS/Climeet-iOS/Assets.xcassets/Icons/Calendar/calendar_left.imageset/\364\200\206\212@1x-1.png" "b/Climeet-iOS/Climeet-iOS/Assets.xcassets/Icons/Calendar/calendar_left.imageset/\364\200\206\212@1x-1.png" new file mode 100644 index 0000000..8b90c18 Binary files /dev/null and "b/Climeet-iOS/Climeet-iOS/Assets.xcassets/Icons/Calendar/calendar_left.imageset/\364\200\206\212@1x-1.png" differ diff --git "a/Climeet-iOS/Climeet-iOS/Assets.xcassets/Icons/Calendar/calendar_left.imageset/\364\200\206\212@2x-1.png" "b/Climeet-iOS/Climeet-iOS/Assets.xcassets/Icons/Calendar/calendar_left.imageset/\364\200\206\212@2x-1.png" new file mode 100644 index 0000000..724e5a0 Binary files /dev/null and "b/Climeet-iOS/Climeet-iOS/Assets.xcassets/Icons/Calendar/calendar_left.imageset/\364\200\206\212@2x-1.png" differ diff --git "a/Climeet-iOS/Climeet-iOS/Assets.xcassets/Icons/Calendar/calendar_left.imageset/\364\200\206\212@3x-1.png" "b/Climeet-iOS/Climeet-iOS/Assets.xcassets/Icons/Calendar/calendar_left.imageset/\364\200\206\212@3x-1.png" new file mode 100644 index 0000000..a4edce3 Binary files /dev/null and "b/Climeet-iOS/Climeet-iOS/Assets.xcassets/Icons/Calendar/calendar_left.imageset/\364\200\206\212@3x-1.png" differ diff --git a/Climeet-iOS/Climeet-iOS/Assets.xcassets/Icons/Calendar/calendar_right.imageset/Contents.json b/Climeet-iOS/Climeet-iOS/Assets.xcassets/Icons/Calendar/calendar_right.imageset/Contents.json new file mode 100644 index 0000000..fa02f44 --- /dev/null +++ b/Climeet-iOS/Climeet-iOS/Assets.xcassets/Icons/Calendar/calendar_right.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "filename" : "􀆊@1x.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "􀆊@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "􀆊@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git "a/Climeet-iOS/Climeet-iOS/Assets.xcassets/Icons/Calendar/calendar_right.imageset/\364\200\206\212@1x.png" "b/Climeet-iOS/Climeet-iOS/Assets.xcassets/Icons/Calendar/calendar_right.imageset/\364\200\206\212@1x.png" new file mode 100644 index 0000000..998c4e0 Binary files /dev/null and "b/Climeet-iOS/Climeet-iOS/Assets.xcassets/Icons/Calendar/calendar_right.imageset/\364\200\206\212@1x.png" differ diff --git "a/Climeet-iOS/Climeet-iOS/Assets.xcassets/Icons/Calendar/calendar_right.imageset/\364\200\206\212@2x.png" "b/Climeet-iOS/Climeet-iOS/Assets.xcassets/Icons/Calendar/calendar_right.imageset/\364\200\206\212@2x.png" new file mode 100644 index 0000000..173c869 Binary files /dev/null and "b/Climeet-iOS/Climeet-iOS/Assets.xcassets/Icons/Calendar/calendar_right.imageset/\364\200\206\212@2x.png" differ diff --git "a/Climeet-iOS/Climeet-iOS/Assets.xcassets/Icons/Calendar/calendar_right.imageset/\364\200\206\212@3x.png" "b/Climeet-iOS/Climeet-iOS/Assets.xcassets/Icons/Calendar/calendar_right.imageset/\364\200\206\212@3x.png" new file mode 100644 index 0000000..72d56d8 Binary files /dev/null and "b/Climeet-iOS/Climeet-iOS/Assets.xcassets/Icons/Calendar/calendar_right.imageset/\364\200\206\212@3x.png" differ diff --git a/Climeet-iOS/Climeet-iOS/Assets.xcassets/Icons/ContentTab/Contents.json b/Climeet-iOS/Climeet-iOS/Assets.xcassets/Icons/ContentTab/Contents.json new file mode 100644 index 0000000..73c0059 --- /dev/null +++ b/Climeet-iOS/Climeet-iOS/Assets.xcassets/Icons/ContentTab/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Climeet-iOS/Climeet-iOS/Assets.xcassets/Icons/ContentTab/content_activity.imageset/Contents.json b/Climeet-iOS/Climeet-iOS/Assets.xcassets/Icons/ContentTab/content_activity.imageset/Contents.json new file mode 100644 index 0000000..45e0343 --- /dev/null +++ b/Climeet-iOS/Climeet-iOS/Assets.xcassets/Icons/ContentTab/content_activity.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "filename" : "date_range@1x.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "date_range@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "date_range@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Climeet-iOS/Climeet-iOS/Assets.xcassets/Icons/ContentTab/content_activity.imageset/date_range@1x.png b/Climeet-iOS/Climeet-iOS/Assets.xcassets/Icons/ContentTab/content_activity.imageset/date_range@1x.png new file mode 100644 index 0000000..87008c8 Binary files /dev/null and b/Climeet-iOS/Climeet-iOS/Assets.xcassets/Icons/ContentTab/content_activity.imageset/date_range@1x.png differ diff --git a/Climeet-iOS/Climeet-iOS/Assets.xcassets/Icons/ContentTab/content_activity.imageset/date_range@2x.png b/Climeet-iOS/Climeet-iOS/Assets.xcassets/Icons/ContentTab/content_activity.imageset/date_range@2x.png new file mode 100644 index 0000000..e06c4e5 Binary files /dev/null and b/Climeet-iOS/Climeet-iOS/Assets.xcassets/Icons/ContentTab/content_activity.imageset/date_range@2x.png differ diff --git a/Climeet-iOS/Climeet-iOS/Assets.xcassets/Icons/ContentTab/content_activity.imageset/date_range@3x.png b/Climeet-iOS/Climeet-iOS/Assets.xcassets/Icons/ContentTab/content_activity.imageset/date_range@3x.png new file mode 100644 index 0000000..d5df83a Binary files /dev/null and b/Climeet-iOS/Climeet-iOS/Assets.xcassets/Icons/ContentTab/content_activity.imageset/date_range@3x.png differ diff --git a/Climeet-iOS/Climeet-iOS/Assets.xcassets/Icons/ContentTab/content_activity_notselect.imageset/Contents.json b/Climeet-iOS/Climeet-iOS/Assets.xcassets/Icons/ContentTab/content_activity_notselect.imageset/Contents.json new file mode 100644 index 0000000..45e0343 --- /dev/null +++ b/Climeet-iOS/Climeet-iOS/Assets.xcassets/Icons/ContentTab/content_activity_notselect.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "filename" : "date_range@1x.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "date_range@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "date_range@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Climeet-iOS/Climeet-iOS/Assets.xcassets/Icons/ContentTab/content_activity_notselect.imageset/date_range@1x.png b/Climeet-iOS/Climeet-iOS/Assets.xcassets/Icons/ContentTab/content_activity_notselect.imageset/date_range@1x.png new file mode 100644 index 0000000..466c46c Binary files /dev/null and b/Climeet-iOS/Climeet-iOS/Assets.xcassets/Icons/ContentTab/content_activity_notselect.imageset/date_range@1x.png differ diff --git a/Climeet-iOS/Climeet-iOS/Assets.xcassets/Icons/ContentTab/content_activity_notselect.imageset/date_range@2x.png b/Climeet-iOS/Climeet-iOS/Assets.xcassets/Icons/ContentTab/content_activity_notselect.imageset/date_range@2x.png new file mode 100644 index 0000000..a302210 Binary files /dev/null and b/Climeet-iOS/Climeet-iOS/Assets.xcassets/Icons/ContentTab/content_activity_notselect.imageset/date_range@2x.png differ diff --git a/Climeet-iOS/Climeet-iOS/Assets.xcassets/Icons/ContentTab/content_activity_notselect.imageset/date_range@3x.png b/Climeet-iOS/Climeet-iOS/Assets.xcassets/Icons/ContentTab/content_activity_notselect.imageset/date_range@3x.png new file mode 100644 index 0000000..f136c21 Binary files /dev/null and b/Climeet-iOS/Climeet-iOS/Assets.xcassets/Icons/ContentTab/content_activity_notselect.imageset/date_range@3x.png differ diff --git a/Climeet-iOS/Climeet-iOS/Assets.xcassets/Icons/ContentTab/content_home.imageset/Contents.json b/Climeet-iOS/Climeet-iOS/Assets.xcassets/Icons/ContentTab/content_home.imageset/Contents.json new file mode 100644 index 0000000..464ff3c --- /dev/null +++ b/Climeet-iOS/Climeet-iOS/Assets.xcassets/Icons/ContentTab/content_home.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "filename" : "home@1x.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "home@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "home@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Climeet-iOS/Climeet-iOS/Assets.xcassets/Icons/ContentTab/content_home.imageset/home@1x.png b/Climeet-iOS/Climeet-iOS/Assets.xcassets/Icons/ContentTab/content_home.imageset/home@1x.png new file mode 100644 index 0000000..e6ec5b4 Binary files /dev/null and b/Climeet-iOS/Climeet-iOS/Assets.xcassets/Icons/ContentTab/content_home.imageset/home@1x.png differ diff --git a/Climeet-iOS/Climeet-iOS/Assets.xcassets/Icons/ContentTab/content_home.imageset/home@2x.png b/Climeet-iOS/Climeet-iOS/Assets.xcassets/Icons/ContentTab/content_home.imageset/home@2x.png new file mode 100644 index 0000000..83d3bb9 Binary files /dev/null and b/Climeet-iOS/Climeet-iOS/Assets.xcassets/Icons/ContentTab/content_home.imageset/home@2x.png differ diff --git a/Climeet-iOS/Climeet-iOS/Assets.xcassets/Icons/ContentTab/content_home.imageset/home@3x.png b/Climeet-iOS/Climeet-iOS/Assets.xcassets/Icons/ContentTab/content_home.imageset/home@3x.png new file mode 100644 index 0000000..16066bd Binary files /dev/null and b/Climeet-iOS/Climeet-iOS/Assets.xcassets/Icons/ContentTab/content_home.imageset/home@3x.png differ diff --git a/Climeet-iOS/Climeet-iOS/Assets.xcassets/Icons/ContentTab/content_home_notselect.imageset/Contents.json b/Climeet-iOS/Climeet-iOS/Assets.xcassets/Icons/ContentTab/content_home_notselect.imageset/Contents.json new file mode 100644 index 0000000..464ff3c --- /dev/null +++ b/Climeet-iOS/Climeet-iOS/Assets.xcassets/Icons/ContentTab/content_home_notselect.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "filename" : "home@1x.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "home@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "home@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Climeet-iOS/Climeet-iOS/Assets.xcassets/Icons/ContentTab/content_home_notselect.imageset/home@1x.png b/Climeet-iOS/Climeet-iOS/Assets.xcassets/Icons/ContentTab/content_home_notselect.imageset/home@1x.png new file mode 100644 index 0000000..b7aa974 Binary files /dev/null and b/Climeet-iOS/Climeet-iOS/Assets.xcassets/Icons/ContentTab/content_home_notselect.imageset/home@1x.png differ diff --git a/Climeet-iOS/Climeet-iOS/Assets.xcassets/Icons/ContentTab/content_home_notselect.imageset/home@2x.png b/Climeet-iOS/Climeet-iOS/Assets.xcassets/Icons/ContentTab/content_home_notselect.imageset/home@2x.png new file mode 100644 index 0000000..f41d88a Binary files /dev/null and b/Climeet-iOS/Climeet-iOS/Assets.xcassets/Icons/ContentTab/content_home_notselect.imageset/home@2x.png differ diff --git a/Climeet-iOS/Climeet-iOS/Assets.xcassets/Icons/ContentTab/content_home_notselect.imageset/home@3x.png b/Climeet-iOS/Climeet-iOS/Assets.xcassets/Icons/ContentTab/content_home_notselect.imageset/home@3x.png new file mode 100644 index 0000000..70ad48a Binary files /dev/null and b/Climeet-iOS/Climeet-iOS/Assets.xcassets/Icons/ContentTab/content_home_notselect.imageset/home@3x.png differ diff --git a/Climeet-iOS/Climeet-iOS/Assets.xcassets/Icons/ContentTab/content_mypage.imageset/Contents.json b/Climeet-iOS/Climeet-iOS/Assets.xcassets/Icons/ContentTab/content_mypage.imageset/Contents.json new file mode 100644 index 0000000..41f9c53 --- /dev/null +++ b/Climeet-iOS/Climeet-iOS/Assets.xcassets/Icons/ContentTab/content_mypage.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "filename" : "person@1x.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "person@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "person@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Climeet-iOS/Climeet-iOS/Assets.xcassets/Icons/ContentTab/content_mypage.imageset/person@1x.png b/Climeet-iOS/Climeet-iOS/Assets.xcassets/Icons/ContentTab/content_mypage.imageset/person@1x.png new file mode 100644 index 0000000..cd94569 Binary files /dev/null and b/Climeet-iOS/Climeet-iOS/Assets.xcassets/Icons/ContentTab/content_mypage.imageset/person@1x.png differ diff --git a/Climeet-iOS/Climeet-iOS/Assets.xcassets/Icons/ContentTab/content_mypage.imageset/person@2x.png b/Climeet-iOS/Climeet-iOS/Assets.xcassets/Icons/ContentTab/content_mypage.imageset/person@2x.png new file mode 100644 index 0000000..0b5b16d Binary files /dev/null and b/Climeet-iOS/Climeet-iOS/Assets.xcassets/Icons/ContentTab/content_mypage.imageset/person@2x.png differ diff --git a/Climeet-iOS/Climeet-iOS/Assets.xcassets/Icons/ContentTab/content_mypage.imageset/person@3x.png b/Climeet-iOS/Climeet-iOS/Assets.xcassets/Icons/ContentTab/content_mypage.imageset/person@3x.png new file mode 100644 index 0000000..278acde Binary files /dev/null and b/Climeet-iOS/Climeet-iOS/Assets.xcassets/Icons/ContentTab/content_mypage.imageset/person@3x.png differ diff --git a/Climeet-iOS/Climeet-iOS/Assets.xcassets/Icons/ContentTab/content_mypage_notselect.imageset/Contents.json b/Climeet-iOS/Climeet-iOS/Assets.xcassets/Icons/ContentTab/content_mypage_notselect.imageset/Contents.json new file mode 100644 index 0000000..41f9c53 --- /dev/null +++ b/Climeet-iOS/Climeet-iOS/Assets.xcassets/Icons/ContentTab/content_mypage_notselect.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "filename" : "person@1x.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "person@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "person@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Climeet-iOS/Climeet-iOS/Assets.xcassets/Icons/ContentTab/content_mypage_notselect.imageset/person@1x.png b/Climeet-iOS/Climeet-iOS/Assets.xcassets/Icons/ContentTab/content_mypage_notselect.imageset/person@1x.png new file mode 100644 index 0000000..12b45f1 Binary files /dev/null and b/Climeet-iOS/Climeet-iOS/Assets.xcassets/Icons/ContentTab/content_mypage_notselect.imageset/person@1x.png differ diff --git a/Climeet-iOS/Climeet-iOS/Assets.xcassets/Icons/ContentTab/content_mypage_notselect.imageset/person@2x.png b/Climeet-iOS/Climeet-iOS/Assets.xcassets/Icons/ContentTab/content_mypage_notselect.imageset/person@2x.png new file mode 100644 index 0000000..c39a437 Binary files /dev/null and b/Climeet-iOS/Climeet-iOS/Assets.xcassets/Icons/ContentTab/content_mypage_notselect.imageset/person@2x.png differ diff --git a/Climeet-iOS/Climeet-iOS/Assets.xcassets/Icons/ContentTab/content_mypage_notselect.imageset/person@3x.png b/Climeet-iOS/Climeet-iOS/Assets.xcassets/Icons/ContentTab/content_mypage_notselect.imageset/person@3x.png new file mode 100644 index 0000000..0314dd3 Binary files /dev/null and b/Climeet-iOS/Climeet-iOS/Assets.xcassets/Icons/ContentTab/content_mypage_notselect.imageset/person@3x.png differ diff --git a/Climeet-iOS/Climeet-iOS/Assets.xcassets/Icons/ContentTab/content_shorts.imageset/Contents.json b/Climeet-iOS/Climeet-iOS/Assets.xcassets/Icons/ContentTab/content_shorts.imageset/Contents.json new file mode 100644 index 0000000..e657da1 --- /dev/null +++ b/Climeet-iOS/Climeet-iOS/Assets.xcassets/Icons/ContentTab/content_shorts.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "filename" : "play_circle@1x.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "play_circle@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "play_circle@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Climeet-iOS/Climeet-iOS/Assets.xcassets/Icons/ContentTab/content_shorts.imageset/play_circle@1x.png b/Climeet-iOS/Climeet-iOS/Assets.xcassets/Icons/ContentTab/content_shorts.imageset/play_circle@1x.png new file mode 100644 index 0000000..97da90b Binary files /dev/null and b/Climeet-iOS/Climeet-iOS/Assets.xcassets/Icons/ContentTab/content_shorts.imageset/play_circle@1x.png differ diff --git a/Climeet-iOS/Climeet-iOS/Assets.xcassets/Icons/ContentTab/content_shorts.imageset/play_circle@2x.png b/Climeet-iOS/Climeet-iOS/Assets.xcassets/Icons/ContentTab/content_shorts.imageset/play_circle@2x.png new file mode 100644 index 0000000..82f0222 Binary files /dev/null and b/Climeet-iOS/Climeet-iOS/Assets.xcassets/Icons/ContentTab/content_shorts.imageset/play_circle@2x.png differ diff --git a/Climeet-iOS/Climeet-iOS/Assets.xcassets/Icons/ContentTab/content_shorts.imageset/play_circle@3x.png b/Climeet-iOS/Climeet-iOS/Assets.xcassets/Icons/ContentTab/content_shorts.imageset/play_circle@3x.png new file mode 100644 index 0000000..ba5b1a7 Binary files /dev/null and b/Climeet-iOS/Climeet-iOS/Assets.xcassets/Icons/ContentTab/content_shorts.imageset/play_circle@3x.png differ diff --git a/Climeet-iOS/Climeet-iOS/Assets.xcassets/Icons/ContentTab/content_shorts_notselect.imageset/Contents.json b/Climeet-iOS/Climeet-iOS/Assets.xcassets/Icons/ContentTab/content_shorts_notselect.imageset/Contents.json new file mode 100644 index 0000000..e657da1 --- /dev/null +++ b/Climeet-iOS/Climeet-iOS/Assets.xcassets/Icons/ContentTab/content_shorts_notselect.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "filename" : "play_circle@1x.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "play_circle@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "play_circle@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Climeet-iOS/Climeet-iOS/Assets.xcassets/Icons/ContentTab/content_shorts_notselect.imageset/play_circle@1x.png b/Climeet-iOS/Climeet-iOS/Assets.xcassets/Icons/ContentTab/content_shorts_notselect.imageset/play_circle@1x.png new file mode 100644 index 0000000..c8fc628 Binary files /dev/null and b/Climeet-iOS/Climeet-iOS/Assets.xcassets/Icons/ContentTab/content_shorts_notselect.imageset/play_circle@1x.png differ diff --git a/Climeet-iOS/Climeet-iOS/Assets.xcassets/Icons/ContentTab/content_shorts_notselect.imageset/play_circle@2x.png b/Climeet-iOS/Climeet-iOS/Assets.xcassets/Icons/ContentTab/content_shorts_notselect.imageset/play_circle@2x.png new file mode 100644 index 0000000..f3e9145 Binary files /dev/null and b/Climeet-iOS/Climeet-iOS/Assets.xcassets/Icons/ContentTab/content_shorts_notselect.imageset/play_circle@2x.png differ diff --git a/Climeet-iOS/Climeet-iOS/Assets.xcassets/Icons/ContentTab/content_shorts_notselect.imageset/play_circle@3x.png b/Climeet-iOS/Climeet-iOS/Assets.xcassets/Icons/ContentTab/content_shorts_notselect.imageset/play_circle@3x.png new file mode 100644 index 0000000..e87fb02 Binary files /dev/null and b/Climeet-iOS/Climeet-iOS/Assets.xcassets/Icons/ContentTab/content_shorts_notselect.imageset/play_circle@3x.png differ diff --git a/Climeet-iOS/Climeet-iOS/Assets.xcassets/Icons/ContentTab/content_upload_notselect.imageset/Contents.json b/Climeet-iOS/Climeet-iOS/Assets.xcassets/Icons/ContentTab/content_upload_notselect.imageset/Contents.json new file mode 100644 index 0000000..7629d61 --- /dev/null +++ b/Climeet-iOS/Climeet-iOS/Assets.xcassets/Icons/ContentTab/content_upload_notselect.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "filename" : "control_point@1x.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "control_point@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "control_point@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Climeet-iOS/Climeet-iOS/Assets.xcassets/Icons/ContentTab/content_upload_notselect.imageset/control_point@1x.png b/Climeet-iOS/Climeet-iOS/Assets.xcassets/Icons/ContentTab/content_upload_notselect.imageset/control_point@1x.png new file mode 100644 index 0000000..0bdeb09 Binary files /dev/null and b/Climeet-iOS/Climeet-iOS/Assets.xcassets/Icons/ContentTab/content_upload_notselect.imageset/control_point@1x.png differ diff --git a/Climeet-iOS/Climeet-iOS/Assets.xcassets/Icons/ContentTab/content_upload_notselect.imageset/control_point@2x.png b/Climeet-iOS/Climeet-iOS/Assets.xcassets/Icons/ContentTab/content_upload_notselect.imageset/control_point@2x.png new file mode 100644 index 0000000..50bc966 Binary files /dev/null and b/Climeet-iOS/Climeet-iOS/Assets.xcassets/Icons/ContentTab/content_upload_notselect.imageset/control_point@2x.png differ diff --git a/Climeet-iOS/Climeet-iOS/Assets.xcassets/Icons/ContentTab/content_upload_notselect.imageset/control_point@3x.png b/Climeet-iOS/Climeet-iOS/Assets.xcassets/Icons/ContentTab/content_upload_notselect.imageset/control_point@3x.png new file mode 100644 index 0000000..d128d6b Binary files /dev/null and b/Climeet-iOS/Climeet-iOS/Assets.xcassets/Icons/ContentTab/content_upload_notselect.imageset/control_point@3x.png differ diff --git a/Climeet-iOS/Climeet-iOS/Assets.xcassets/UnNamedColor/Contents.json b/Climeet-iOS/Climeet-iOS/Assets.xcassets/UnNamedColor/Contents.json new file mode 100644 index 0000000..73c0059 --- /dev/null +++ b/Climeet-iOS/Climeet-iOS/Assets.xcassets/UnNamedColor/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Climeet-iOS/Climeet-iOS/Assets.xcassets/UnNamedColor/unnamed_gray_103.colorset/Contents.json b/Climeet-iOS/Climeet-iOS/Assets.xcassets/UnNamedColor/unnamed_gray_103.colorset/Contents.json new file mode 100644 index 0000000..f8c0cd7 --- /dev/null +++ b/Climeet-iOS/Climeet-iOS/Assets.xcassets/UnNamedColor/unnamed_gray_103.colorset/Contents.json @@ -0,0 +1,38 @@ +{ + "colors" : [ + { + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0x67", + "green" : "0x67", + "red" : "0x67" + } + }, + "idiom" : "universal" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0x67", + "green" : "0x67", + "red" : "0x67" + } + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Climeet-iOS/Climeet-iOS/Climeet_iOSApp.swift b/Climeet-iOS/Climeet-iOS/Climeet_iOSApp.swift index ef678a0..11f1682 100644 --- a/Climeet-iOS/Climeet-iOS/Climeet_iOSApp.swift +++ b/Climeet-iOS/Climeet-iOS/Climeet_iOSApp.swift @@ -6,12 +6,16 @@ // import SwiftUI +import ComposableArchitecture @main struct ClimeetiOSApp: App { var body: some Scene { WindowGroup { - ContentView() + TabView() +// ActivityRecordView(store: Store(initialState: ActivityRecordReducer.State(), reducer: { +// ActivityRecordReducer() +// })) } } } diff --git a/Climeet-iOS/Climeet-iOS/Common/Extension/Date + datesOfMonth.swift b/Climeet-iOS/Climeet-iOS/Common/Extension/Date + datesOfMonth.swift new file mode 100644 index 0000000..68ab7f3 --- /dev/null +++ b/Climeet-iOS/Climeet-iOS/Common/Extension/Date + datesOfMonth.swift @@ -0,0 +1,45 @@ +// +// Date + datesOfMonth.swift +// Climeet-iOS +// +// Created by KOVI on 6/17/24. +// + +import Foundation + +extension Date { + func datesOfMonth() -> [Date] { + let calendar = Calendar.current + let currentMonth = calendar.component (.month, from: self) + let currentYear = calendar.component(.year, from: self) + + var startDateComponents = DateComponents() + startDateComponents.year = currentYear + startDateComponents.month = currentMonth + startDateComponents.day = 1 + let startDate = calendar.date(from: startDateComponents)! + + var endDateComponents = DateComponents() + endDateComponents.month = 1 + endDateComponents.day = -1 + + let endDate = calendar.date(byAdding: endDateComponents, to: startDate)! + + var dates: [Date] = [] + var currentDate = startDate + + while currentDate <= endDate { + dates.append (currentDate) + currentDate = calendar.date(byAdding: .day, value: 1, to: currentDate)! + } + + return dates + } + + func string() -> String { + let formatter = DateFormatter() + formatter.dateFormat = "MM/dd/yyyy" + + return formatter.string(from: self) + } +} diff --git a/Climeet-iOS/Climeet-iOS/Common/Extension/DateFormatter + .swift b/Climeet-iOS/Climeet-iOS/Common/Extension/DateFormatter + .swift index 498fb62..1f20467 100644 --- a/Climeet-iOS/Climeet-iOS/Common/Extension/DateFormatter + .swift +++ b/Climeet-iOS/Climeet-iOS/Common/Extension/DateFormatter + .swift @@ -35,4 +35,13 @@ extension DateFormatter { formatter.locale = Locale(identifier: "en_US_POSIX") // AM/PM 표기를 위해 영어 로케일 사용 return formatter }() + + // MARK: 2023.12 + static let yearPointMonthFormatter: DateFormatter = { + let formatter = DateFormatter() + formatter.dateFormat = "yyyy.MM" + formatter.timeZone = TimeZone(identifier: "Asia/Seoul") + formatter.locale = Locale(identifier: "ko_KR") + return formatter + }() } diff --git a/Climeet-iOS/Climeet-iOS/Presentation/.DS_Store b/Climeet-iOS/Climeet-iOS/Presentation/.DS_Store new file mode 100644 index 0000000..f0fdd13 Binary files /dev/null and b/Climeet-iOS/Climeet-iOS/Presentation/.DS_Store differ diff --git a/Climeet-iOS/Climeet-iOS/Presentation/ActivityCalendar/ActivityCalendarReducer.swift b/Climeet-iOS/Climeet-iOS/Presentation/ActivityCalendar/ActivityCalendarReducer.swift new file mode 100644 index 0000000..e8c06d4 --- /dev/null +++ b/Climeet-iOS/Climeet-iOS/Presentation/ActivityCalendar/ActivityCalendarReducer.swift @@ -0,0 +1,132 @@ +// +// ActivityCalendarReducer.swift +// Climeet-iOS +// +// Created by KOVI on 6/16/24. +// + +import Foundation +import ComposableArchitecture + +@Reducer +struct ActivityCalendarReducer { + @Reducer + enum Destination { + case selectDate(DateTimePickerReducer) + } + + @ObservableState + struct State { + var screenSize = CGSize(width: 0, height: 0) + var bottomSheetHeight: CGFloat = 0.0 + var isSelectedRecordButton = true + var selectedMonth = 0 + var tappedCalendarDate = CalendarDate() + + @Presents var destination: Destination.State? + } + + enum Action { + case selectedMonthChanged(Int) + case tappedCalendarDateChanged(CalendarDate) + case readViewSize(CGSize) + case recordButtonTapped + case statisticButtonTapped + case calendarTitleButtonTapped + case destination(PresentationAction) + } + + // MARK: Internal + + var body: some ReducerOf { + Reduce { state, action in + switch action { + case .selectedMonthChanged(let selectedMonth): + state.selectedMonth = selectedMonth + state.tappedCalendarDate = CalendarDate() + + return .none + + case let .tappedCalendarDateChanged(calendarDate): + state.tappedCalendarDate = calendarDate + + return .none + + case .readViewSize(let size): + state.screenSize = size + + return .none + + case .calendarTitleButtonTapped: + state.bottomSheetHeight = state.screenSize.height * SheetType.datePicker.displaySizeRatio + + var reducer = DateTimePickerReducer.State( + sheetType: .datePicker + ) + // DatePicker의 초기값 설정로직 + var datePickerSelectedDate: Date? + if state.tappedCalendarDate.day != .zero { + datePickerSelectedDate = state.tappedCalendarDate.date + } else { + datePickerSelectedDate = firstDayOfOffsetMonth(selectedMonth: state.selectedMonth) + } + reducer.selectedDate = datePickerSelectedDate ?? Date() + + state.destination = .selectDate(reducer) + + return .none + + case .recordButtonTapped: + state.isSelectedRecordButton = true + + return .none + + case .statisticButtonTapped: + state.isSelectedRecordButton = false + + return .none + + case let .destination(.presented(.selectDate(.delegate(.selectDate(selectedDate))))): + let monthDifference = monthsBetweenNowDate(date: selectedDate) + state.selectedMonth = monthDifference + state.tappedCalendarDate = CalendarDate( + day: Calendar.current.component(.day, from: selectedDate), + date: selectedDate + ) + + return .none + + case .destination: + + return .none + } + } + .ifLet(\.$destination, action: \.destination) + } + + private func monthsBetweenNowDate(date: Date) -> Int { + let calendar = Calendar.current + + let startComponents = calendar.dateComponents([.year, .month], from: Date()) + let endComponents = calendar.dateComponents([.year, .month], from: date) + + if let startYear = startComponents.year, let startMonth = startComponents.month, + let endYear = endComponents.year, let endMonth = endComponents.month { + return (endYear - startYear) * 12 + (endMonth - startMonth) + } + + return 0 + } + + private func firstDayOfOffsetMonth(selectedMonth: Int) -> Date { + let calendar = Calendar.current + let currentMonthAdded = calendar.date(byAdding: .month, value: selectedMonth, to: Date())! + + var components = calendar.dateComponents([.year, .month], from: currentMonthAdded) + components.day = 1 + + let firstDayOfMonth = calendar.date(from: components)! + + return firstDayOfMonth + } +} diff --git a/Climeet-iOS/Climeet-iOS/Presentation/ActivityCalendar/ActivityCalendarView.swift b/Climeet-iOS/Climeet-iOS/Presentation/ActivityCalendar/ActivityCalendarView.swift new file mode 100644 index 0000000..d113f93 --- /dev/null +++ b/Climeet-iOS/Climeet-iOS/Presentation/ActivityCalendar/ActivityCalendarView.swift @@ -0,0 +1,73 @@ +// +// ActivityCalendarView.swift +// Climeet-iOS +// +// Created by KOVI on 6/16/24. +// + +import SwiftUI +import ComposableArchitecture + +struct ActivityCalendarView: View { + @Bindable var store: StoreOf + + var body: some View { + ScrollView(.vertical) { + VStack { + HStack(spacing: 15) { + Button { + store.send(.recordButtonTapped) + } label: { + Text("기록") + .font(.climeetFontTitle3()) + .foregroundColor( + store.isSelectedRecordButton ? .levelColorWhite : .unnamedGray103 + ) + } + + Button { + store.send(.statisticButtonTapped) + } label: { + Text("통계") + .font(.climeetFontTitle3()) + .foregroundColor( + !store.isSelectedRecordButton ? .levelColorWhite : .unnamedGray103 + ) + } + + Spacer() + } + .padding(.top, 43) + .padding(.leading, 26) + Spacer() + } + + CustomCalendar( + selectedMonth: $store.selectedMonth.sending(\.selectedMonthChanged), + tappedDate: $store.tappedCalendarDate.sending(\.tappedCalendarDateChanged), + calendarTitleTappedAction: { + store.send(.calendarTitleButtonTapped) + } + ) + } + .frame(maxWidth: .infinity, maxHeight: .infinity) + .background(.text09) + .onReadSize({ size in + store.send(.readViewSize(size)) + }) + .sheet( + item: $store.scope( + state: \.destination?.selectDate, + action: \.destination.selectDate) + ) { dateTimePickerStore in + DateTimePickerView(store: dateTimePickerStore) + .presentationDetents([.height(store.bottomSheetHeight)]) + } + } +} + +#Preview { + ActivityCalendarView(store: Store(initialState: ActivityCalendarReducer.State(), reducer: { + ActivityCalendarReducer() + })) +} diff --git a/Climeet-iOS/Climeet-iOS/Presentation/ActivityCalendar/Model/CalendarDate.swift b/Climeet-iOS/Climeet-iOS/Presentation/ActivityCalendar/Model/CalendarDate.swift new file mode 100644 index 0000000..10f9f25 --- /dev/null +++ b/Climeet-iOS/Climeet-iOS/Presentation/ActivityCalendar/Model/CalendarDate.swift @@ -0,0 +1,22 @@ +// +// CalendarDate.swift +// Climeet-iOS +// +// Created by KOVI on 6/16/24. +// + +import Foundation + +struct CalendarDate: Identifiable { + let id = UUID() + var day: Int + var date: Date + + init( + day: Int = .zero, + date: Date = Date() + ) { + self.day = day + self.date = date + } +} diff --git a/Climeet-iOS/Climeet-iOS/Presentation/ActivityCalendar/View/CustomCalendar.swift b/Climeet-iOS/Climeet-iOS/Presentation/ActivityCalendar/View/CustomCalendar.swift new file mode 100644 index 0000000..45341e9 --- /dev/null +++ b/Climeet-iOS/Climeet-iOS/Presentation/ActivityCalendar/View/CustomCalendar.swift @@ -0,0 +1,144 @@ +// +// CustomCalendar.swift +// Climeet-iOS +// +// Created by KOVI on 6/16/24. +// + +import SwiftUI + +struct CustomCalendar: View { + + @Binding var selectedMonth: Int + @Binding var tappedDate: CalendarDate + var calendarTitleTappedAction: () -> Void + + @State private var selectedDate = Date() + private let days = ["일", "월", "화", "수", "목", "금", "토"] + + var body: some View { + VStack { + HStack { + Button { + withAnimation { + selectedMonth -= 1 + } + } label: { + Image(uiImage: UIImage(named: "calendar_left")!) + } + + Spacer() + + Button { + calendarTitleTappedAction() + } label: { + Text("\(fetchYearAndMonth())") + .font(.climeetFontTitle3()) + .foregroundColor(.levelColorWhite) + } + + Spacer() + + Button { + withAnimation { + selectedMonth += 1 + } + } label: { + Image(uiImage: UIImage(named: "calendar_right")!) + } + } + .padding(.top, 29) + .padding(.horizontal, 27) + + HStack { + ForEach(days, id: \.self) { day in + Text(day) + .font(.climeetFontParagraph1()) + .foregroundColor(.levelColorWhite) + .frame(maxWidth: .infinity) + } + } + .padding(.top, 27) + .padding() + + LazyVGrid(columns: Array(repeating: GridItem(.flexible()), count: 7), spacing: 10) { + ForEach(fetchDates()) { value in + if value.day != -1 { + VStack { + Button(action: { + tappedDate = value + }, label: { + Rectangle() + .frame(width: 36, height: 36) + .cornerRadius(5) + .foregroundColor( + tappedDate.day == value.day ? .text05 : .text08 + ) + }) + + ZStack { + if value.date.string() == tappedDate.date.string() { + Rectangle() + .fill(Color.climeetMain) + .frame(width: 29, height: 15) + .cornerRadius(3) + + Text("\(value.day)") + .font(.climeetFontParagraph4()) + .foregroundColor(.levelColorBlack) + } else { + Text("\(value.day)") + .font(.climeetFontParagraph6()) + .foregroundColor( + value.date.string() == Date().string() ? .climeetMain : .text06 + ) + } + } + } + } else { + Text("") + } + } + } + .padding() + + } + .onAppear { + selectedDate = fetchSelectedMonth() + } + .onChange(of: selectedMonth, { _, _ in + selectedDate = fetchSelectedMonth() + }) + .frame(maxWidth: .infinity, maxHeight: .infinity) + .background(.text09) + } + + // MARK: Private + + private func fetchDates() -> [CalendarDate] { + let calendar = Calendar.current + let currentMonth = fetchSelectedMonth() + var dates = currentMonth.datesOfMonth().map { + CalendarDate(day: calendar.component(.day, from: $0), date: $0) + } + + let firstDayOfWeek = calendar.component(.weekday, from: dates.first?.date ?? Date()) + + for _ in 0.. Date { + let calendar = Calendar.current + let month = calendar.date(byAdding: .month, value: selectedMonth, to: Date()) + + return month! + } + + private func fetchYearAndMonth() -> String { + return DateFormatter.yearPointMonthFormatter.string(from: selectedDate) + } +} diff --git a/Climeet-iOS/Climeet-iOS/Presentation/ActivityRecord/ActivityRecordView.swift b/Climeet-iOS/Climeet-iOS/Presentation/ActivityRecord/ActivityRecordView.swift index bc3bde0..f6f05b4 100644 --- a/Climeet-iOS/Climeet-iOS/Presentation/ActivityRecord/ActivityRecordView.swift +++ b/Climeet-iOS/Climeet-iOS/Presentation/ActivityRecord/ActivityRecordView.swift @@ -50,7 +50,7 @@ struct ActivityRecordView: View { ) } .frame(maxWidth: .infinity, minHeight: 48) - .background(Color(red: 61/255, green: 61/255, blue: 61/255)) + .background(.text08) .cornerRadius(5) } .padding(.leading, 28) @@ -70,9 +70,10 @@ struct ActivityRecordView: View { ) } .frame(maxWidth: .infinity, minHeight: 48) - .background(Color(red: 61/255, green: 61/255, blue: 61/255)) + .background(.text08) .cornerRadius(5) } else { + // TODO: 캘린더 Text("안녕하세요") .foregroundColor(.red) } @@ -83,7 +84,7 @@ struct ActivityRecordView: View { } .frame(maxWidth: .infinity, maxHeight: .infinity) } - .background(Color(red: 51/255, green: 51/255, blue: 51/255)) + .background(.text09) .toolbar { ToolbarItem(placement: .topBarLeading) { Image("activity_close") @@ -91,7 +92,7 @@ struct ActivityRecordView: View { } } .toolbarBackground( - Color(red: 51/255, green: 51/255, blue: 51/255), + Color(.text09), for: .navigationBar ) } destination: { store in diff --git a/Climeet-iOS/Climeet-iOS/Presentation/ActivityRecord/View/ClimbingSetupButton.swift b/Climeet-iOS/Climeet-iOS/Presentation/ActivityRecord/View/ClimbingSetupButton.swift index 95006a7..e503cef 100644 --- a/Climeet-iOS/Climeet-iOS/Presentation/ActivityRecord/View/ClimbingSetupButton.swift +++ b/Climeet-iOS/Climeet-iOS/Presentation/ActivityRecord/View/ClimbingSetupButton.swift @@ -19,8 +19,7 @@ struct ClimbingSetupButton: View { Text(isEmpty ? placeholderText : text) .font(.climeetFontParagraph2()) .foregroundColor( - isEmpty ? Color(red: 198/255, green: 198/255, blue: 198/255) - : .levelColorWhite + isEmpty ? .starNotfilledEyes : .levelColorWhite ) .padding(.leading, 18) @@ -31,7 +30,7 @@ struct ClimbingSetupButton: View { } }) .frame(maxWidth: .infinity, minHeight: 48) - .background(Color(red: 61/255, green: 61/255, blue: 61/255)) + .background(.text08) .cornerRadius(5) } } diff --git a/Climeet-iOS/Climeet-iOS/Presentation/ActivityRecord/View/ClimbingSetupView.swift b/Climeet-iOS/Climeet-iOS/Presentation/ActivityRecord/View/ClimbingSetupView.swift index 80ffdd6..5c845a2 100644 --- a/Climeet-iOS/Climeet-iOS/Presentation/ActivityRecord/View/ClimbingSetupView.swift +++ b/Climeet-iOS/Climeet-iOS/Presentation/ActivityRecord/View/ClimbingSetupView.swift @@ -17,8 +17,7 @@ struct ClimbingSetupView: View { Text(isEmpty ? placeholderText : text) .font(.climeetFontParagraph2()) .foregroundColor( - isEmpty ? Color(red: 198/255, green: 198/255, blue: 198/255) - : .levelColorWhite + isEmpty ? .starNotfilledEyes : .levelColorWhite ) .padding(.leading, 18) Spacer() diff --git a/Climeet-iOS/Climeet-iOS/Presentation/DateTimePicker/DateTimePickerView.swift b/Climeet-iOS/Climeet-iOS/Presentation/DateTimePicker/DateTimePickerView.swift index 4fa4fc2..598fa14 100644 --- a/Climeet-iOS/Climeet-iOS/Presentation/DateTimePicker/DateTimePickerView.swift +++ b/Climeet-iOS/Climeet-iOS/Presentation/DateTimePicker/DateTimePickerView.swift @@ -11,6 +11,13 @@ import ComposableArchitecture struct DateTimePickerView: View { @Bindable var store: StoreOf + /// DateTimePickerView에서만 사용됨 + private let buttonAndDivideLineColor = Color( + red: 103 / 255, + green: 103 / 255, + blue: 103 / 255 + ) + var body: some View { if store.sheetType == .datePicker { VStack { @@ -34,37 +41,36 @@ struct DateTimePickerView: View { store.send(.todayButtonTapped) }, label: { Text("오늘") - .font(.climeetFontTitle3()) + .font(.climeetFontTitle4()) .foregroundColor( store.isSelectedDateToday ? - Color(.levelColorWhite) + Color(.starNotfilled) : Color(.levelColorBlack) ) }) .frame(height: 41) .frame(maxWidth: .infinity) .background( - store.isSelectedDateToday ? - Color(red: 103/255, green: 103/255, blue: 103/255) + store.isSelectedDateToday ? self.buttonAndDivideLineColor : Color(.climeetMain) ) .cornerRadius(5) Rectangle() .frame(height: 1) - .foregroundColor(Color(red: 103/255, green: 103/255, blue: 103/255)) + .foregroundColor(self.buttonAndDivideLineColor) .padding(.top, 10) DateTimePicker( selection: $store.selectedDate.sending(\.dateChanged), - textColor: UIColor(red: 198/255, green: 198/255, blue: 198/255, alpha: 1.0), + textColor: UIColor.starNotfilled, pickerMode: .date ) .frame(maxWidth: .infinity) Rectangle() .frame(height: 1) - .foregroundColor(Color(red: 103/255, green: 103/255, blue: 103/255)) + .foregroundColor(self.buttonAndDivideLineColor) .padding(.top, -10) Spacer() @@ -77,31 +83,31 @@ struct DateTimePickerView: View { store.send(.cancelButtonTapped) }, label: { Text("취소") - .font(.climeetFontTitle3()) + .font(.climeetFontTitle4_5()) .foregroundColor(.levelColorWhite) }) .frame(height: 48) .frame(maxWidth: .infinity) - .background(Color(red: 103/255, green: 103/255, blue: 103/255)) + .background(self.buttonAndDivideLineColor) .cornerRadius(5) Button(action: { store.send(.dateConfirmButtonTapped) }, label: { Text("확인") - .font(.climeetFontTitle3()) + .font(.climeetFontTitle4_5()) .foregroundColor(.levelColorBlack) }) .frame(height: 48) .frame(maxWidth: .infinity) - .background(Color(red: 190/255, green: 223/255, blue: 34/255)) + .background(.climeetMain) .cornerRadius(5) } Spacer() } .frame(maxWidth: .infinity, maxHeight: .infinity) .padding(.horizontal, 21.5) - .background(Color(red: 51/255, green: 51/255, blue: 51/255)) + .background(.text09) } else { VStack { @@ -125,16 +131,16 @@ struct DateTimePickerView: View { Button(action: { store.send(.startTimeButtonTapped) }, label: { - VStack { + VStack(spacing: 4) { Text("시작") - .font(.climeetFontTitle3()) + .font(.climeetFontTitle4()) .foregroundColor(.levelColorWhite) Text( DateFormatter.koreanHourMinuteFormatter.string( from: store.selectedStartTime ) ) - .font(.climeetFontTitle3()) + .font(.climeetFontParagraph2()) .foregroundColor( store.isStartPickerActive ? .climeetMain : .levelColorWhite @@ -143,22 +149,22 @@ struct DateTimePickerView: View { }) .frame(height: 75) .frame(maxWidth: .infinity) - .background(Color(red: 111/255, green: 111/255, blue: 111/255)) + .background(.text07) .cornerRadius(15) Button(action: { store.send(.endTimeButtonTapped) }, label: { - VStack { + VStack(spacing: 4) { Text("종료") - .font(.climeetFontTitle3()) + .font(.climeetFontTitle4()) .foregroundColor(.levelColorWhite) Text( DateFormatter.koreanHourMinuteFormatter.string( from: store.selectedEndTime ) ) - .font(.climeetFontTitle3()) + .font(.climeetFontParagraph2()) .foregroundColor( !store.isStartPickerActive ? .climeetMain : .levelColorWhite @@ -167,14 +173,14 @@ struct DateTimePickerView: View { }) .frame(height: 75) .frame(maxWidth: .infinity) - .background(Color(red: 111/255, green: 111/255, blue: 111/255)) + .background(.text07) .cornerRadius(15) } .padding(.horizontal, 13.5) Rectangle() .frame(height: 1) - .foregroundColor(Color(red: 103/255, green: 103/255, blue: 103/255)) + .foregroundColor(self.buttonAndDivideLineColor) .padding(.top, 10) DateTimePicker( @@ -182,14 +188,14 @@ struct DateTimePickerView: View { store.isStartPickerActive ? $store.selectedStartTime.sending(\.timeChanged) : $store.selectedEndTime.sending(\.timeChanged), - textColor: UIColor(red: 198/255, green: 198/255, blue: 198/255, alpha: 1.0), + textColor: UIColor.starNotfilled, pickerMode: .time ) .frame(maxWidth: .infinity) Rectangle() .frame(height: 1) - .foregroundColor(Color(red: 103/255, green: 103/255, blue: 103/255)) + .foregroundColor(self.buttonAndDivideLineColor) .padding(.top, 10) } @@ -198,24 +204,24 @@ struct DateTimePickerView: View { store.send(.cancelButtonTapped) }, label: { Text("취소") - .font(.climeetFontTitle3()) + .font(.climeetFontTitle4()) .foregroundColor(.levelColorWhite) }) .frame(height: 48) .frame(maxWidth: .infinity) - .background(Color(red: 103/255, green: 103/255, blue: 103/255)) + .background(.text07) .cornerRadius(5) Button(action: { store.send(.timeConfirmButtonTapped) }, label: { Text("확인") - .font(.climeetFontTitle3()) + .font(.climeetFontTitle4()) .foregroundColor(.levelColorBlack) }) .frame(height: 48) .frame(maxWidth: .infinity) - .background(Color(red: 190/255, green: 223/255, blue: 34/255)) + .background(.climeetMain) .cornerRadius(5) } @@ -223,7 +229,7 @@ struct DateTimePickerView: View { } .frame(maxWidth: .infinity, maxHeight: .infinity) .padding(.horizontal, 21.5) - .background(Color(red: 51/255, green: 51/255, blue: 51/255)) + .background(.text09) } } } diff --git a/Climeet-iOS/Climeet-iOS/Presentation/Search/SearchView.swift b/Climeet-iOS/Climeet-iOS/Presentation/Search/SearchView.swift index c1ebd93..fb94d68 100644 --- a/Climeet-iOS/Climeet-iOS/Presentation/Search/SearchView.swift +++ b/Climeet-iOS/Climeet-iOS/Presentation/Search/SearchView.swift @@ -28,7 +28,7 @@ struct SearchView: View { "", text: $store.keyword.sending(\.keywordChanged), prompt: Text("암장검색하기") - .foregroundColor(Color(red: 139/255, green: 139/255, blue: 139/255)) + .foregroundColor(.levelColorGray) ) .accentColor(.climeetMain) .foregroundColor(.white) @@ -37,7 +37,7 @@ struct SearchView: View { .frame(maxWidth: .infinity, minHeight: 36) .background( RoundedRectangle(cornerRadius: 8) - .fill(Color(red: 61/255, green: 61/255, blue: 61/255))) + .fill(Color.text08)) .overlay( HStack { Image(systemName: "magnifyingglass") @@ -61,7 +61,7 @@ struct SearchView: View { Text("검색 결과가 없어요.\n다른 검색어로 검색해 보세요!") .font(.climeetFontParagraph2()) - .foregroundColor(Color(red: 139/255, green: 139/255, blue: 139/255)) + .foregroundColor(.text06) .multilineTextAlignment(.center) Spacer() } @@ -73,7 +73,7 @@ struct SearchView: View { Section { Text("홈짐") .foregroundColor(.levelColorWhite) - .font(.climeetFontTitle4()) + .font(.climeetFontParagraph1()) .listRowBackground(Color.clear) ForEach(store.homeGyms) { gym in @@ -129,7 +129,7 @@ struct SearchView: View { .frame(width: 77, height: 24, alignment: .center) .font(.climeetFontCaptionText3()) .foregroundColor(.levelColorBlack) - .background(Color.climeetMain) + .background(.climeetMain) .cornerRadius(8) } .listRowInsets(EdgeInsets(top: 25, leading: 22, bottom: 25, trailing: 22)) @@ -144,7 +144,7 @@ struct SearchView: View { } } } - .background(Color.init(red: 51/255, green: 51/255, blue: 51/255)) + .background(.text09) .toolbar(.hidden, for: .automatic) } } diff --git a/Climeet-iOS/Climeet-iOS/Presentation/Tab/TabView.swift b/Climeet-iOS/Climeet-iOS/Presentation/Tab/TabView.swift new file mode 100644 index 0000000..9010298 --- /dev/null +++ b/Climeet-iOS/Climeet-iOS/Presentation/Tab/TabView.swift @@ -0,0 +1,63 @@ +// +// TabView.swift +// Climeet-iOS +// +// Created by KOVI on 6/15/24. +// +import SwiftUI +import ComposableArchitecture + +enum Tab { + case home + case shorts + case upload + case activity + case mypage +} + +struct TabView: View { + + @State private var selectedTab: Tab = .home + + var body: some View { + GeometryReader { geometry in + + VStack(spacing: 0) { + switch selectedTab { + case .home: + // 홈화면 + ActivityRecordView(store: Store(initialState: ActivityRecordReducer.State(), reducer: { + ActivityRecordReducer() + })) + case .shorts: + // 쇼츠화면 + SearchView(store: Store(initialState: SearchReducer.State(), reducer: { + SearchReducer() + })) + case .upload: + // 업로드화면 + ActivityRecordView(store: Store(initialState: ActivityRecordReducer.State(), reducer: { + ActivityRecordReducer() + })) + case .activity: + ActivityCalendarView(store: Store(initialState: ActivityCalendarReducer.State(), reducer: { + ActivityCalendarReducer() + })) + + case .mypage: + // 마이페이지화면 + SearchView(store: Store(initialState: SearchReducer.State(), reducer: { + SearchReducer() + })) + } + CustomTabView(selectedTab: $selectedTab) + .frame(height: geometry.size.height * 0.0874) + .background(.levelColorBlack) + } + } + } +} + +#Preview { + TabView() +} diff --git a/Climeet-iOS/Climeet-iOS/Presentation/Tab/View/CustomTabView.swift b/Climeet-iOS/Climeet-iOS/Presentation/Tab/View/CustomTabView.swift new file mode 100644 index 0000000..2345170 --- /dev/null +++ b/Climeet-iOS/Climeet-iOS/Presentation/Tab/View/CustomTabView.swift @@ -0,0 +1,126 @@ +// +// CustomTabView.swift +// Climeet-iOS +// +// Created by KOVI on 6/16/24. +// + +import SwiftUI + +struct CustomTabView: View { + @Binding var selectedTab: Tab + + var body: some View { + GeometryReader { geometry in + VStack { + HStack(spacing: 0) { + Button { + selectedTab = .home + } label: { + VStack { + Rectangle() + .frame(height: 4) + .foregroundColor( + selectedTab == .home ? .climeetMain : .levelColorBlack + ) + + Image(uiImage: UIImage(named: selectedTab == .home ? "content_home" : "content_home_notselect")!) + Text("홈") + .font(.climeetFontCaptionText3()) + .foregroundColor( + selectedTab == .home ? .levelColorWhite : .text05 + ) + Spacer() + } + } + .frame(width: geometry.size.width / 5) + + Button { + selectedTab = .shorts + } label: { + VStack { + Rectangle() + .frame(height: 4) + .foregroundColor( + selectedTab == .shorts ? .climeetMain : .levelColorBlack + ) + + Image( + uiImage: UIImage(named: selectedTab == .shorts ? "content_shorts" : "content_shorts_notselect")!) + Text("Shorts") + .font(.climeetFontCaptionText3()) + .foregroundColor( + selectedTab == .shorts ? .levelColorWhite : .text05 + ) + Spacer() + } + } + .frame(width: geometry.size.width / 5) + + Button { + selectedTab = .upload + } label: { + VStack { + Rectangle() + .frame(height: 4) + .foregroundColor( + selectedTab == .upload ? .climeetMain : .levelColorBlack + ) + + Image(uiImage: UIImage(named: "content_upload_notselect")!) + Text("업로드") + .font(.climeetFontCaptionText3()) + .foregroundColor( + selectedTab == .upload ? .levelColorWhite : .text05 + ) + Spacer() + } + } + .frame(width: geometry.size.width / 5) + + Button { + selectedTab = .activity + } label: { + VStack { + Rectangle() + .frame(height: 4) + .foregroundColor( + selectedTab == .activity ? .climeetMain : .levelColorBlack + ) + + Image(uiImage: UIImage(named: selectedTab == .activity ? "content_activity" : "content_activity_notselect")!) + Text("운동기록") + .font(.climeetFontCaptionText3()) + .foregroundColor( + selectedTab == .activity ? .levelColorWhite : .text05 + ) + Spacer() + } + } + .frame(width: geometry.size.width / 5) + + Button { + selectedTab = .mypage + } label: { + VStack { + Rectangle() + .frame(height: 4) + .foregroundColor( + selectedTab == .mypage ? .climeetMain : .levelColorBlack + ) + + Image(uiImage: UIImage(named: selectedTab == .mypage ? "content_mypage" : "content_mypage_notselect")!) + Text("마이페이지") + .font(.climeetFontCaptionText3()) + .foregroundColor( + selectedTab == .mypage ? .levelColorWhite : .text05 + ) + Spacer() + } + } + .frame(width: geometry.size.width / 5) + } + } + } + } +}