1+ package com.cornellappdev.hustle.ui.components.home
2+
3+ import androidx.compose.animation.AnimatedVisibility
4+ import androidx.compose.animation.core.tween
5+ import androidx.compose.animation.fadeIn
6+ import androidx.compose.animation.fadeOut
7+ import androidx.compose.foundation.clickable
8+ import androidx.compose.foundation.layout.Arrangement
9+ import androidx.compose.foundation.layout.Column
10+ import androidx.compose.foundation.layout.Row
11+ import androidx.compose.foundation.layout.Spacer
12+ import androidx.compose.foundation.layout.fillMaxSize
13+ import androidx.compose.foundation.layout.height
14+ import androidx.compose.foundation.layout.padding
15+ import androidx.compose.foundation.rememberScrollState
16+ import androidx.compose.foundation.verticalScroll
17+ import androidx.compose.material3.HorizontalDivider
18+ import androidx.compose.material3.Icon
19+ import androidx.compose.material3.MaterialTheme
20+ import androidx.compose.material3.Text
21+ import androidx.compose.runtime.Composable
22+ import androidx.compose.ui.Alignment
23+ import androidx.compose.ui.Modifier
24+ import androidx.compose.ui.graphics.Color
25+ import androidx.compose.ui.res.painterResource
26+ import androidx.compose.ui.tooling.preview.Preview
27+ import androidx.compose.ui.unit.dp
28+ import com.cornellappdev.hustle.R
29+ import com.cornellappdev.hustle.data.model.services.Service
30+ import com.cornellappdev.hustle.ui.components.general.service.ServiceHorizontalCarouselSection
31+ import com.cornellappdev.hustle.ui.theme.HustleColors
32+ import com.cornellappdev.hustle.ui.theme.HustleSpacing
33+ import com.cornellappdev.hustle.ui.theme.HustleTheme
34+ import com.cornellappdev.hustle.util.constants.TEST_RECENT_SEARCHES
35+ import com.cornellappdev.hustle.util.constants.TEST_SERVICES
36+
37+ @Composable
38+ fun SearchContent (
39+ recentSearches : List <String >,
40+ recentlyViewedServices : List <Service >,
41+ onSearchSuggestionClick : (String ) -> Unit ,
42+ navigateToServiceDetail : (Int ) -> Unit ,
43+ onFavoriteClick : (Int ) -> Unit ,
44+ modifier : Modifier = Modifier
45+ ) {
46+ Column (
47+ modifier = modifier
48+ .fillMaxSize()
49+ .padding(top = 4 .dp)
50+ .verticalScroll(rememberScrollState()),
51+ ) {
52+ AnimatedVisibility (
53+ visible = recentSearches.isNotEmpty(),
54+ label = " Recent Searches Visibility" ,
55+ enter = fadeIn(animationSpec = tween(300 )),
56+ exit = fadeOut(animationSpec = tween(300 ))
57+ ) {
58+ RecentSearchesSection (recentSearches, onSearchSuggestionClick)
59+ }
60+
61+ Spacer (modifier = Modifier .height(44 .dp))
62+
63+ AnimatedVisibility (
64+ visible = recentlyViewedServices.isNotEmpty(),
65+ label = " Recently Viewed Services Visibility" ,
66+ enter = fadeIn(animationSpec = tween(300 )),
67+ exit = fadeOut(animationSpec = tween(300 ))
68+ ) {
69+ ServiceHorizontalCarouselSection (
70+ serviceListings = recentlyViewedServices,
71+ onServiceClick = navigateToServiceDetail,
72+ onFavoriteClick = onFavoriteClick,
73+ header = {
74+ Text (
75+ text = " Recently viewed" ,
76+ style = MaterialTheme .typography.headlineSmall,
77+ modifier = Modifier .padding(start = HustleSpacing .large)
78+ )
79+ }
80+ )
81+ }
82+ }
83+ }
84+
85+ @Composable
86+ private fun RecentSearchesSection (
87+ recentSearches : List <String >,
88+ onSearchSuggestionClick : (String ) -> Unit
89+ ) {
90+ Column (
91+ modifier = Modifier .padding(horizontal = HustleSpacing .large)
92+ ) {
93+ Text (
94+ text = " Recent" ,
95+ style = MaterialTheme .typography.headlineSmall
96+ )
97+
98+ recentSearches.forEach { recentSearch ->
99+ RecentSearchItem (
100+ recentSearch = recentSearch,
101+ onSearchSuggestionClick = onSearchSuggestionClick
102+ )
103+ }
104+ }
105+ }
106+
107+ @Composable
108+ private fun RecentSearchItem (
109+ recentSearch : String ,
110+ onSearchSuggestionClick : (String ) -> Unit
111+ ) {
112+ Column (
113+ verticalArrangement = Arrangement .spacedBy(HustleSpacing .small),
114+ modifier = Modifier
115+ .clickable(
116+ onClick = {
117+ onSearchSuggestionClick(recentSearch)
118+ }
119+ )
120+ .padding(top = HustleSpacing .medium)
121+ ) {
122+ Row (
123+ horizontalArrangement = Arrangement .spacedBy(6 .dp),
124+ verticalAlignment = Alignment .CenterVertically
125+
126+ ) {
127+ Icon (
128+ painter = painterResource(R .drawable.ic_history),
129+ contentDescription = " Recent Search Icon" ,
130+ tint = Color .Unspecified
131+ )
132+ Text (
133+ text = recentSearch,
134+ style = MaterialTheme .typography.labelLarge
135+ )
136+ }
137+ HorizontalDivider (color = HustleColors .iconInactive)
138+ }
139+ }
140+
141+ @Preview(showBackground = true )
142+ @Composable
143+ private fun SearchContentPreview () {
144+ HustleTheme {
145+ SearchContent (
146+ recentSearches = TEST_RECENT_SEARCHES ,
147+ recentlyViewedServices = TEST_SERVICES ,
148+ onSearchSuggestionClick = {},
149+ navigateToServiceDetail = {},
150+ onFavoriteClick = {}
151+ )
152+ }
153+ }
0 commit comments