@@ -10,98 +10,16 @@ import SwiftUI
10
10
struct HomeListView : View {
11
11
@EnvironmentObject private var homeViewModel : HomeViewModel
12
12
@Binding var createFolder : Bool
13
- @Binding var selectedFolderID : UUID ?
14
13
@State private var expandedFolders : Set < UUID > = [ ]
15
14
16
- @State private var isMainSelected : Bool = true
17
- @State private var isFavoriteSelected : Bool = false
18
- @State private var isTagSelected : Bool = false
15
+ @State private var selectedCategory : CategorySelection = . main
19
16
20
17
var body : some View {
21
18
VStack ( spacing: 0 ) {
22
19
VStack ( spacing: 0 ) {
23
- RoundedRectangle ( cornerRadius: 12 )
24
- . foregroundStyle ( isMainSelected ? Color ( hex: " EFEFF8 " ) : . clear)
25
- . frame ( height: 43 )
26
- . overlay {
27
- HStack ( spacing: 0 ) {
28
- Image ( systemName: isMainSelected ? " text.page.fill " : " text.page " )
29
- . font ( . system( size: 18 ) )
30
- . foregroundStyle ( isMainSelected ? . primary1 : . gray700)
31
- . padding ( . trailing, 11 )
32
-
33
- Text ( " 전체 " )
34
- . reazyFont ( isMainSelected ? . button1 : . text1)
35
- . foregroundStyle ( isMainSelected ? . primary1 : . gray700)
36
-
37
- Spacer ( )
38
- }
39
- . padding ( . leading, 20 )
40
- }
41
- . onTapGesture {
42
- self . isMainSelected = true
43
- self . isFavoriteSelected = false
44
- self . isTagSelected = false
45
- homeViewModel. isFavoriteSelected = false
46
- homeViewModel. isTagSelected = false
47
- }
48
- . padding ( . bottom, 3 )
49
-
50
- RoundedRectangle ( cornerRadius: 12 )
51
- . foregroundStyle ( isFavoriteSelected ? Color ( hex: " EFEFF8 " ) : . clear)
52
- . frame ( height: 43 )
53
- . overlay {
54
- HStack ( spacing: 0 ) {
55
- Image ( isFavoriteSelected ? " starfill " : " star " )
56
- . renderingMode ( . template)
57
- . resizable ( )
58
- . scaledToFit ( )
59
- . frame ( width: 18 , height: 18 )
60
- . foregroundStyle ( isFavoriteSelected ? . primary1 : . gray700)
61
- . padding ( . trailing, 11 )
62
-
63
- Text ( " 즐겨찾기 " )
64
- . reazyFont ( isFavoriteSelected ? . button1 : . text1)
65
- . foregroundStyle ( isFavoriteSelected ? . primary1 : . gray700)
66
-
67
- Spacer ( )
68
- }
69
- . padding ( . leading, 20 )
70
- }
71
- . onTapGesture {
72
- self . isMainSelected = false
73
- self . isFavoriteSelected = true
74
- self . isTagSelected = false
75
- homeViewModel. isFavoriteSelected = true
76
- homeViewModel. isTagSelected = false
77
- }
78
- . padding ( . bottom, 3 )
79
-
80
- RoundedRectangle ( cornerRadius: 12 )
81
- . foregroundStyle ( isTagSelected ? Color ( hex: " EFEFF8 " ) : . clear)
82
- . frame ( height: 43 )
83
- . overlay {
84
- HStack ( spacing: 0 ) {
85
- Image ( systemName: isTagSelected ? " tag.fill " : " tag " )
86
- . font ( . system( size: 14 ) )
87
- . foregroundStyle ( isTagSelected ? . primary1 : . gray700)
88
- . padding ( . trailing, 11 )
89
-
90
- Text ( " 태그 " )
91
- . reazyFont ( isTagSelected ? . button1 : . text1)
92
- . foregroundStyle ( isTagSelected ? . primary1 : . gray700)
93
-
94
- Spacer ( )
95
- }
96
- . padding ( . leading, 20 )
97
- }
98
- . onTapGesture {
99
- self . isMainSelected = false
100
- self . isFavoriteSelected = false
101
- self . isTagSelected = true
102
- homeViewModel. isFavoriteSelected = false
103
- homeViewModel. isTagSelected = true
104
- }
20
+ categoryButton ( icon: " text.page " , selectedIcon: " text.page.fill " , title: " 전체 " , category: . main)
21
+ categoryButton ( image: " star " , selectedImage: " starfill " , title: " 즐겨찾기 " , category: . favorite)
22
+ categoryButton ( icon: " tag " , selectedIcon: " tag.fill " , title: " 태그 " , category: . tag)
105
23
}
106
24
. padding ( . leading, 10 )
107
25
. padding ( . trailing, 12 )
@@ -134,6 +52,7 @@ struct HomeListView: View {
134
52
}
135
53
. padding ( . bottom, 14 )
136
54
. padding ( . leading, 20 )
55
+ . padding ( . trailing, 6 )
137
56
138
57
ScrollView {
139
58
VStack ( spacing: 0 ) {
@@ -145,22 +64,69 @@ struct HomeListView: View {
145
64
childFolders: childFolders ( of: ) ,
146
65
toggleExpansion: toggleExpansion,
147
66
hasChildren: hasChildren ( folder: ) ,
148
- selectedFolderID: $selectedFolderID
67
+ selectedFolderID: $homeViewModel. selectedFolderID,
68
+ didSelectFolder: { folderID in
69
+ selectedCategory = . folder( folderID)
70
+ homeViewModel. selectCategory ( . folder( folderID) )
71
+ }
149
72
)
150
73
. padding ( . top, 10 )
151
74
}
152
75
}
153
76
}
154
77
}
155
78
. padding ( . leading, 10 )
156
- . padding ( . trailing, 16 )
79
+ . padding ( . trailing, 10 )
157
80
158
81
Spacer ( )
159
82
}
160
83
. padding ( . top, 24 )
161
84
. background ( . primary2)
162
85
}
163
86
87
+ private func categoryButton(
88
+ icon: String ? = nil ,
89
+ selectedIcon: String ? = nil ,
90
+ image: String ? = nil ,
91
+ selectedImage: String ? = nil ,
92
+ title: String ,
93
+ category: CategorySelection
94
+ ) -> some View {
95
+ RoundedRectangle ( cornerRadius: 12 )
96
+ . foregroundStyle ( selectedCategory == category ? Color ( hex: " EFEFF8 " ) : . clear)
97
+ . frame ( height: 43 )
98
+ . overlay {
99
+ HStack ( spacing: 0 ) {
100
+ if let icon = icon, let selectedIcon = selectedIcon {
101
+ Image ( systemName: selectedCategory == category ? selectedIcon : icon)
102
+ . font ( . system( size: 18 ) )
103
+ . foregroundStyle ( selectedCategory == category ? . primary1 : . gray700)
104
+ . padding ( . trailing, 11 )
105
+ } else if let image = image, let selectedImage = selectedImage {
106
+ Image ( selectedCategory == category ? selectedImage : image)
107
+ . renderingMode ( . template)
108
+ . resizable ( )
109
+ . scaledToFit ( )
110
+ . frame ( width: 18 , height: 18 )
111
+ . foregroundStyle ( selectedCategory == category ? . primary1 : . gray700)
112
+ . padding ( . trailing, 11 )
113
+ }
114
+
115
+ Text ( title)
116
+ . reazyFont ( selectedCategory == category ? . button1 : . text1)
117
+ . foregroundStyle ( selectedCategory == category ? . primary1 : . gray700)
118
+
119
+ Spacer ( )
120
+ }
121
+ . padding ( . leading, 20 )
122
+ }
123
+ . onTapGesture {
124
+ selectedCategory = category
125
+ homeViewModel. selectCategory ( category)
126
+ }
127
+ . padding ( . bottom, 3 )
128
+ }
129
+
164
130
private var rootFolders : [ Folder ] {
165
131
homeViewModel. folders. filter { $0. parentFolderID == nil }
166
132
}
@@ -191,8 +157,8 @@ private struct FolderListCell: View {
191
157
let childFolders : ( UUID ) -> [ Folder ]
192
158
let toggleExpansion : ( Folder ) -> Void
193
159
let hasChildren : ( Folder ) -> Bool
194
-
195
160
@Binding var selectedFolderID : UUID ?
161
+ var didSelectFolder : ( UUID ) -> Void
196
162
197
163
var body : some View {
198
164
VStack ( spacing: 0 ) {
@@ -230,6 +196,7 @@ private struct FolderListCell: View {
230
196
. foregroundStyle ( . gray600)
231
197
. padding ( . trailing, 4 )
232
198
}
199
+ . padding ( . trailing, 10 )
233
200
}
234
201
}
235
202
@@ -241,7 +208,7 @@ private struct FolderListCell: View {
241
208
. clipShape ( RoundedRectangle ( cornerRadius: 12 ) )
242
209
. contentShape ( Rectangle ( ) )
243
210
. onTapGesture {
244
- onTap ( )
211
+ didSelectFolder ( folder . id )
245
212
}
246
213
247
214
if expandedFolders. contains ( folder. id) {
@@ -253,7 +220,8 @@ private struct FolderListCell: View {
253
220
childFolders: childFolders,
254
221
toggleExpansion: toggleExpansion,
255
222
hasChildren: hasChildren,
256
- selectedFolderID: $selectedFolderID
223
+ selectedFolderID: $selectedFolderID,
224
+ didSelectFolder: didSelectFolder
257
225
)
258
226
. transition ( . move( edge: . top) . combined ( with: . opacity) )
259
227
. padding ( . top, 10 )
@@ -263,18 +231,11 @@ private struct FolderListCell: View {
263
231
}
264
232
}
265
233
}
266
-
267
- private func onTap( ) {
268
- if selectedFolderID != folder. id {
269
- selectedFolderID = folder. id
270
- }
271
- }
272
234
}
273
235
274
236
275
237
#Preview {
276
238
HomeListView (
277
- createFolder: . constant( false ) ,
278
- selectedFolderID: . constant( nil )
239
+ createFolder: . constant( false )
279
240
)
280
241
}
0 commit comments