diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 06e8aafce..dd7193698 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -12,7 +12,7 @@ android:fullBackupContent="@xml/backup_rules" android:icon="@mipmap/ic_terning_launcher_foreground" android:label="@string/app_name" - android:roundIcon="@mipmap/ic_launcher_round" + android:roundIcon="@mipmap/ic_terning_launcher_round" android:supportsRtl="true" android:theme="@style/Theme.TerningAndroid" android:usesCleartextTraffic="true" diff --git a/core/src/main/java/com/terning/core/designsystem/component/datepicker/DatePicker.kt b/core/src/main/java/com/terning/core/designsystem/component/datepicker/DatePicker.kt index 3d572d9a8..511d2f3df 100644 --- a/core/src/main/java/com/terning/core/designsystem/component/datepicker/DatePicker.kt +++ b/core/src/main/java/com/terning/core/designsystem/component/datepicker/DatePicker.kt @@ -8,6 +8,7 @@ import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.fillMaxHeight import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.size import androidx.compose.foundation.layout.width import androidx.compose.foundation.lazy.LazyColumn @@ -93,7 +94,7 @@ fun DateItemsPicker( firstIndex: Int, onItemSelected: (String) -> Unit, modifier: Modifier = Modifier, - isYear: Boolean + isYear: Boolean, ) { val listState = rememberLazyListState(firstIndex) val currentValue = remember { mutableStateOf("") } @@ -133,7 +134,6 @@ fun DateItemsPicker( if (it == firstVisibleItemIndex + 1) { currentValue.value = items[index] } - Spacer(modifier = Modifier.height(6.dp)) Text( text = when (isYear) { @@ -142,9 +142,9 @@ fun DateItemsPicker( }, style = TerningTheme.typography.title3, color = if (it == firstVisibleItemIndex + 1) Grey500 else Grey300, - textAlign = TextAlign.Center + textAlign = TextAlign.Center, + modifier = modifier.padding(vertical = 8.dp) ) - Spacer(modifier = Modifier.height(6.dp)) } } } diff --git a/core/src/main/java/com/terning/core/designsystem/component/item/InternItem.kt b/core/src/main/java/com/terning/core/designsystem/component/item/InternItem.kt index 3c81ac61e..ef22f1c5b 100644 --- a/core/src/main/java/com/terning/core/designsystem/component/item/InternItem.kt +++ b/core/src/main/java/com/terning/core/designsystem/component/item/InternItem.kt @@ -61,12 +61,11 @@ fun InternItem( .data(imageUrl) .build(), contentDescription = title, - contentScale = ContentScale.Crop, + contentScale = ContentScale.Fit, modifier = Modifier .fillMaxHeight() .aspectRatio(1f) .clip(RoundedCornerShape(5.dp)) - .background(color = Grey300) ) Column( diff --git a/core/src/main/java/com/terning/core/designsystem/component/item/InternItemWithShadow.kt b/core/src/main/java/com/terning/core/designsystem/component/item/InternItemWithShadow.kt index b9f97aa1a..287e4076d 100644 --- a/core/src/main/java/com/terning/core/designsystem/component/item/InternItemWithShadow.kt +++ b/core/src/main/java/com/terning/core/designsystem/component/item/InternItemWithShadow.kt @@ -5,25 +5,30 @@ import androidx.compose.foundation.layout.Box import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier +import androidx.compose.ui.unit.Dp import androidx.compose.ui.unit.dp import com.terning.core.designsystem.theme.Grey200 import com.terning.core.designsystem.theme.White import com.terning.core.extension.customShadow +import com.terning.core.extension.noRippleClickable @Composable fun InternItemWithShadow( + modifier: Modifier, + shadowRadius: Dp, + shadowWidth: Dp, imageUrl: String, title: String, dateDeadline: String, workingPeriod: String, - scrapId: Long?, + isScrapped: Boolean, ) { Box( - modifier = Modifier + modifier = modifier .customShadow( color = Grey200, - shadowRadius = 10.dp, - shadowWidth = 2.dp, + shadowRadius = shadowRadius, + shadowWidth = shadowWidth, ) .background( color = White, @@ -35,7 +40,7 @@ fun InternItemWithShadow( title = title, dateDeadline = dateDeadline, workingPeriod = workingPeriod, - isScraped = scrapId != null + isScraped = isScrapped ) } } \ No newline at end of file diff --git a/core/src/main/java/com/terning/core/designsystem/component/textfield/SearchTextField.kt b/core/src/main/java/com/terning/core/designsystem/component/textfield/SearchTextField.kt index 21d181551..1c4039b2c 100644 --- a/core/src/main/java/com/terning/core/designsystem/component/textfield/SearchTextField.kt +++ b/core/src/main/java/com/terning/core/designsystem/component/textfield/SearchTextField.kt @@ -3,6 +3,7 @@ package com.terning.core.designsystem.component.textfield import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.SolidColor +import androidx.compose.ui.text.input.ImeAction import com.terning.core.designsystem.theme.Grey300 import com.terning.core.designsystem.theme.Grey400 import com.terning.core.designsystem.theme.TerningMain @@ -32,6 +33,11 @@ fun SearchTextField( hintColor = Grey300, leftIcon = leftIcon, leftIconColor = TerningMain, + imeAction = if (text.isNotBlank()) { + ImeAction.Search + } else { + ImeAction.Done + }, enabled = enabled, readOnly = readOnly, onDoneAction = onDoneAction, diff --git a/core/src/main/java/com/terning/core/designsystem/component/textfield/TerningBasicTextField.kt b/core/src/main/java/com/terning/core/designsystem/component/textfield/TerningBasicTextField.kt index bc4e09fab..49cb64610 100644 --- a/core/src/main/java/com/terning/core/designsystem/component/textfield/TerningBasicTextField.kt +++ b/core/src/main/java/com/terning/core/designsystem/component/textfield/TerningBasicTextField.kt @@ -46,6 +46,7 @@ fun TerningBasicTextField( strokeWidth: Float = 1f, leftIcon: Int? = null, leftIconColor: Color = TerningMain, + imeAction: ImeAction? = ImeAction.Done, maxTextLength: Int? = null, showTextLength: Boolean = false, hint: String = "", @@ -65,7 +66,9 @@ fun TerningBasicTextField( onValueChange = onValueChange, singleLine = true, maxLines = 1, - keyboardOptions = KeyboardOptions(imeAction = ImeAction.Done), + keyboardOptions = KeyboardOptions( + imeAction = imeAction ?: ImeAction.Done + ), keyboardActions = KeyboardActions( onDone = { if (value.isNotBlank()) { diff --git a/feature/src/main/java/com/terning/feature/calendar/calendar/component/CalendarDetailDialog.kt b/feature/src/main/java/com/terning/feature/calendar/calendar/component/CalendarDetailDialog.kt index 9c9ab4102..4b7336e62 100644 --- a/feature/src/main/java/com/terning/feature/calendar/calendar/component/CalendarDetailDialog.kt +++ b/feature/src/main/java/com/terning/feature/calendar/calendar/component/CalendarDetailDialog.kt @@ -116,7 +116,6 @@ private fun InternDialogContent( .width(80.dp) .aspectRatio(1f) .clip(RoundedCornerShape(5.dp)) - .background(color = Grey300) .border( width = 1.dp, color = TerningMain, diff --git a/feature/src/main/java/com/terning/feature/calendar/calendar/navigation/CalendarNavigation.kt b/feature/src/main/java/com/terning/feature/calendar/calendar/navigation/CalendarNavigation.kt index 83037a00c..dfa59c258 100644 --- a/feature/src/main/java/com/terning/feature/calendar/calendar/navigation/CalendarNavigation.kt +++ b/feature/src/main/java/com/terning/feature/calendar/calendar/navigation/CalendarNavigation.kt @@ -1,5 +1,7 @@ package com.terning.feature.calendar.calendar.navigation +import androidx.compose.animation.EnterTransition +import androidx.compose.animation.ExitTransition import androidx.navigation.NavController import androidx.navigation.NavGraphBuilder import androidx.navigation.NavOptions @@ -19,7 +21,20 @@ fun NavController.navigateCalendar(navOptions: NavOptions? = null) { fun NavGraphBuilder.calendarNavGraph( navHostController: NavController ) { - composable { + composable( + exitTransition = { + ExitTransition.None + }, + popEnterTransition = { + EnterTransition.None + }, + enterTransition = { + EnterTransition.None + }, + popExitTransition = { + ExitTransition.None + } + ) { CalendarRoute( navController = navHostController ) diff --git a/feature/src/main/java/com/terning/feature/filtering/startfiltering/navigation/StartFilteringNavigation.kt b/feature/src/main/java/com/terning/feature/filtering/startfiltering/navigation/StartFilteringNavigation.kt index 7cc79470b..4926c20d8 100644 --- a/feature/src/main/java/com/terning/feature/filtering/startfiltering/navigation/StartFilteringNavigation.kt +++ b/feature/src/main/java/com/terning/feature/filtering/startfiltering/navigation/StartFilteringNavigation.kt @@ -1,5 +1,7 @@ package com.terning.feature.filtering.startfiltering.navigation +import androidx.compose.animation.EnterTransition +import androidx.compose.animation.ExitTransition import androidx.navigation.NavController import androidx.navigation.NavGraphBuilder import androidx.navigation.NavHostController diff --git a/feature/src/main/java/com/terning/feature/filtering/starthome/navigation/StartHomeNavigation.kt b/feature/src/main/java/com/terning/feature/filtering/starthome/navigation/StartHomeNavigation.kt index 424406917..ba97193c7 100644 --- a/feature/src/main/java/com/terning/feature/filtering/starthome/navigation/StartHomeNavigation.kt +++ b/feature/src/main/java/com/terning/feature/filtering/starthome/navigation/StartHomeNavigation.kt @@ -1,5 +1,7 @@ package com.terning.feature.filtering.starthome.navigation +import androidx.compose.animation.EnterTransition +import androidx.compose.animation.ExitTransition import androidx.navigation.NavController import androidx.navigation.NavGraphBuilder import androidx.navigation.NavHostController @@ -19,7 +21,20 @@ fun NavController.navigateStartHome(navOptions: NavOptions? = null) { fun NavGraphBuilder.startHomeNavGraph( navHostController: NavHostController ) { - composable { + composable( + exitTransition = { + ExitTransition.None + }, + popEnterTransition = { + EnterTransition.None + }, + enterTransition = { + EnterTransition.None + }, + popExitTransition = { + ExitTransition.None + } + ) { StartHomeScreen(navController = navHostController) } } diff --git a/feature/src/main/java/com/terning/feature/home/changefilter/navigation/ChangeFilterNavigation.kt b/feature/src/main/java/com/terning/feature/home/changefilter/navigation/ChangeFilterNavigation.kt index 5c2cab77f..dbc6ce24a 100644 --- a/feature/src/main/java/com/terning/feature/home/changefilter/navigation/ChangeFilterNavigation.kt +++ b/feature/src/main/java/com/terning/feature/home/changefilter/navigation/ChangeFilterNavigation.kt @@ -1,5 +1,7 @@ package com.terning.feature.home.changefilter.navigation +import androidx.compose.animation.EnterTransition +import androidx.compose.animation.ExitTransition import androidx.navigation.NavController import androidx.navigation.NavGraphBuilder import androidx.navigation.NavHostController @@ -19,7 +21,20 @@ fun NavController.navigateChangeFilter(navOptions: NavOptions? = null) { fun NavGraphBuilder.changeFilterNavGraph( navHostController: NavHostController ) { - composable { + composable( + exitTransition = { + ExitTransition.None + }, + popEnterTransition = { + EnterTransition.None + }, + enterTransition = { + EnterTransition.None + }, + popExitTransition = { + ExitTransition.None + } + ) { ChangeFilterRoute( navController = navHostController ) diff --git a/feature/src/main/java/com/terning/feature/home/home/HomeRoute.kt b/feature/src/main/java/com/terning/feature/home/home/HomeRoute.kt index c698a4254..d9595218c 100644 --- a/feature/src/main/java/com/terning/feature/home/home/HomeRoute.kt +++ b/feature/src/main/java/com/terning/feature/home/home/HomeRoute.kt @@ -3,7 +3,6 @@ package com.terning.feature.home.home import androidx.compose.foundation.ExperimentalFoundationApi import androidx.compose.foundation.background import androidx.compose.foundation.layout.Arrangement -import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.PaddingValues import androidx.compose.foundation.layout.Row @@ -12,7 +11,6 @@ import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding import androidx.compose.foundation.lazy.LazyColumn -import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.material3.HorizontalDivider import androidx.compose.material3.Scaffold import androidx.compose.material3.Text @@ -37,14 +35,13 @@ import androidx.navigation.NavHostController import com.google.accompanist.systemuicontroller.rememberSystemUiController import com.terning.core.designsystem.component.bottomsheet.SortingBottomSheet import com.terning.core.designsystem.component.button.SortingButton -import com.terning.core.designsystem.component.item.InternItem +import com.terning.core.designsystem.component.item.InternItemWithShadow import com.terning.core.designsystem.component.topappbar.LogoTopAppBar import com.terning.core.designsystem.theme.Black import com.terning.core.designsystem.theme.Grey150 -import com.terning.core.designsystem.theme.Grey200 import com.terning.core.designsystem.theme.TerningTheme import com.terning.core.designsystem.theme.White -import com.terning.core.extension.customShadow +import com.terning.core.extension.noRippleClickable import com.terning.core.extension.toast import com.terning.core.state.UiState import com.terning.domain.entity.response.HomeFilteringInfoModel @@ -58,6 +55,7 @@ import com.terning.feature.home.home.component.HomeRecommendEmptyIntern import com.terning.feature.home.home.component.HomeTodayEmptyIntern import com.terning.feature.home.home.component.HomeTodayIntern import com.terning.feature.home.home.navigation.navigateHome +import com.terning.feature.intern.navigation.navigateIntern const val NAME_START_LENGTH = 7 const val NAME_END_LENGTH = 12 @@ -149,6 +147,7 @@ fun HomeRoute( homeTodayInternList = homeTodayInternList, recommendInternList = homeRecommendInternList, onChangeFilterClick = { navController.navigateChangeFilter() }, + navController = navController ) } @@ -161,6 +160,8 @@ fun HomeScreen( homeTodayInternList: List, recommendInternList: List, onChangeFilterClick: () -> Unit, + viewModel: HomeViewModel = hiltViewModel(), + navController: NavHostController, ) { var sheetState by remember { mutableStateOf(false) } @@ -227,14 +228,19 @@ fun HomeScreen( modifier = Modifier .padding(vertical = 4.dp) ) - Spacer(modifier = Modifier.padding(9.dp)) + Spacer( + modifier = Modifier.padding(9.dp) + ) } } } if (recommendInternList.isNotEmpty()) { items(recommendInternList.size) { index -> - ShowRecommendIntern(homeRecommendInternModel = recommendInternList[index]) + RecommendInternItem( + navController = navController, + intern = recommendInternList[index] + ) } } } @@ -252,6 +258,30 @@ fun HomeScreen( } } + +@Composable +private fun RecommendInternItem( + navController: NavHostController, + intern: HomeRecommendInternModel, +) { + InternItemWithShadow( + modifier = Modifier + .padding(horizontal = 24.dp) + .noRippleClickable { + navController.navigateIntern( + announcementId = intern.internshipAnnouncementId + ) + }, + imageUrl = intern.companyImage, + title = intern.title, + dateDeadline = intern.dDay, + workingPeriod = intern.workingPeriod, + isScrapped = intern.isScrapped, + shadowRadius = 5.dp, + shadowWidth = 1.dp + ) +} + @Composable private fun ShowMainTitleWithName(userName: String) { Text( @@ -301,7 +331,7 @@ private fun ShowRecommendTitle() { @Composable private fun ShowInternFilter( homeFilteringInfo: HomeFilteringInfoModel, - onChangeFilterClick: () -> Unit + onChangeFilterClick: () -> Unit, ) { if (homeFilteringInfo.grade == null) { HomeFilteringScreen( @@ -329,28 +359,3 @@ private fun ShowInternFilter( } } } - -@Composable -private fun ShowRecommendIntern(homeRecommendInternModel: HomeRecommendInternModel) { - Box( - modifier = Modifier - .padding(horizontal = 24.dp) - .customShadow( - color = Grey200, - shadowRadius = 5.dp, - shadowWidth = 1.dp - ) - .background( - color = White, - shape = RoundedCornerShape(10.dp) - ) - ) { - InternItem( - imageUrl = homeRecommendInternModel.companyImage, - title = homeRecommendInternModel.title, - dateDeadline = homeRecommendInternModel.dDay, - workingPeriod = homeRecommendInternModel.workingPeriod, - isScraped = homeRecommendInternModel.isScrapped, - ) - } -} \ No newline at end of file diff --git a/feature/src/main/java/com/terning/feature/home/home/navigation/HometNavigation.kt b/feature/src/main/java/com/terning/feature/home/home/navigation/HometNavigation.kt index 88ce969af..6343c1df4 100644 --- a/feature/src/main/java/com/terning/feature/home/home/navigation/HometNavigation.kt +++ b/feature/src/main/java/com/terning/feature/home/home/navigation/HometNavigation.kt @@ -1,5 +1,11 @@ package com.terning.feature.home.home.navigation +import androidx.compose.animation.EnterTransition +import androidx.compose.animation.ExitTransition +import androidx.compose.animation.core.LinearOutSlowInEasing +import androidx.compose.animation.core.tween +import androidx.compose.animation.slideIn +import androidx.compose.ui.unit.IntOffset import androidx.navigation.NavController import androidx.navigation.NavGraphBuilder import androidx.navigation.NavHostController @@ -17,7 +23,20 @@ fun NavController.navigateHome(navOptions: NavOptions? = null) { } fun NavGraphBuilder.homeNavGraph(navHostController: NavHostController) { - composable { + composable( + exitTransition = { + ExitTransition.None + }, + popEnterTransition = { + EnterTransition.None + }, + enterTransition = { + EnterTransition.None + }, + popExitTransition = { + ExitTransition.None + } + ) { HomeRoute(navController = navHostController) } } diff --git a/feature/src/main/java/com/terning/feature/intern/navigation/InternNavigation.kt b/feature/src/main/java/com/terning/feature/intern/navigation/InternNavigation.kt index d8e92fcc4..90c845b17 100644 --- a/feature/src/main/java/com/terning/feature/intern/navigation/InternNavigation.kt +++ b/feature/src/main/java/com/terning/feature/intern/navigation/InternNavigation.kt @@ -1,5 +1,7 @@ package com.terning.feature.intern.navigation +import androidx.compose.animation.EnterTransition +import androidx.compose.animation.ExitTransition import androidx.navigation.NavController import androidx.navigation.NavGraphBuilder import androidx.navigation.NavHostController @@ -23,7 +25,20 @@ fun NavController.navigateIntern( fun NavGraphBuilder.internNavGraph( navHostController: NavHostController, ) { - composable { + composable( + exitTransition = { + ExitTransition.None + }, + popEnterTransition = { + EnterTransition.None + }, + enterTransition = { + EnterTransition.None + }, + popExitTransition = { + ExitTransition.None + } + ) { val args = it.toRoute() InternRoute( navController = navHostController, diff --git a/feature/src/main/java/com/terning/feature/main/MainScreen.kt b/feature/src/main/java/com/terning/feature/main/MainScreen.kt index a330c3f1f..81bb56528 100644 --- a/feature/src/main/java/com/terning/feature/main/MainScreen.kt +++ b/feature/src/main/java/com/terning/feature/main/MainScreen.kt @@ -1,6 +1,14 @@ package com.terning.feature.main import androidx.compose.animation.AnimatedVisibility +import androidx.compose.animation.EnterTransition +import androidx.compose.animation.ExitTransition +import androidx.compose.animation.core.LinearOutSlowInEasing +import androidx.compose.animation.core.tween +import androidx.compose.animation.expandVertically +import androidx.compose.animation.fadeIn +import androidx.compose.animation.shrinkVertically +import androidx.compose.animation.slideIn import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.padding @@ -10,9 +18,11 @@ import androidx.compose.material3.NavigationBarItem import androidx.compose.material3.Scaffold import androidx.compose.material3.Text import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource +import androidx.compose.ui.unit.IntOffset import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import androidx.navigation.compose.NavHost @@ -88,6 +98,10 @@ private fun MainBottomBar( ) { AnimatedVisibility( visible = isVisible, + enter = expandVertically(expandFrom = Alignment.Top) { 20 }, + exit = shrinkVertically(animationSpec = tween()) { fullHeight -> + fullHeight / 2 + }, ) { NavigationBar(containerColor = White) { tabs.forEach { itemType -> diff --git a/feature/src/main/java/com/terning/feature/mypage/navigation/MyPageNavigation.kt b/feature/src/main/java/com/terning/feature/mypage/navigation/MyPageNavigation.kt index 05af733e3..a5997724f 100644 --- a/feature/src/main/java/com/terning/feature/mypage/navigation/MyPageNavigation.kt +++ b/feature/src/main/java/com/terning/feature/mypage/navigation/MyPageNavigation.kt @@ -1,5 +1,7 @@ package com.terning.feature.mypage.navigation +import androidx.compose.animation.EnterTransition +import androidx.compose.animation.ExitTransition import androidx.navigation.NavController import androidx.navigation.NavGraphBuilder import androidx.navigation.NavHostController @@ -17,12 +19,23 @@ fun NavController.navigateMyPage(navOptions: NavOptions? = null) { } fun NavGraphBuilder.myPageNavGraph( - navHostController: NavHostController + navHostController: NavHostController, ) { - composable { - MyPageRoute( - navController = navHostController - ) + composable( + exitTransition = { + ExitTransition.None + }, + popEnterTransition = { + EnterTransition.None + }, + enterTransition = { + EnterTransition.None + }, + popExitTransition = { + ExitTransition.None + } + ) { + MyPageRoute(navController = navHostController) } } diff --git a/feature/src/main/java/com/terning/feature/onboarding/signin/navigation/SignInNavigation.kt b/feature/src/main/java/com/terning/feature/onboarding/signin/navigation/SignInNavigation.kt index cba8bfc7c..ca63583ef 100644 --- a/feature/src/main/java/com/terning/feature/onboarding/signin/navigation/SignInNavigation.kt +++ b/feature/src/main/java/com/terning/feature/onboarding/signin/navigation/SignInNavigation.kt @@ -17,7 +17,7 @@ fun NavController.navigateSignIn(navOptions: NavOptions? = null) { } fun NavGraphBuilder.signInNavGraph( - navHostController: NavHostController + navHostController: NavHostController, ) { composable { SignInRoute( diff --git a/feature/src/main/java/com/terning/feature/onboarding/splash/navigation/SplashNavigation.kt b/feature/src/main/java/com/terning/feature/onboarding/splash/navigation/SplashNavigation.kt index db5c6759c..a24d639f5 100644 --- a/feature/src/main/java/com/terning/feature/onboarding/splash/navigation/SplashNavigation.kt +++ b/feature/src/main/java/com/terning/feature/onboarding/splash/navigation/SplashNavigation.kt @@ -1,13 +1,13 @@ package com.terning.feature.onboarding.splash.navigation +import androidx.compose.animation.EnterTransition +import androidx.compose.animation.ExitTransition import androidx.navigation.NavController import androidx.navigation.NavGraphBuilder import androidx.navigation.NavHostController import androidx.navigation.NavOptions import androidx.navigation.compose.composable -import androidx.navigation.toRoute import com.terning.core.navigation.Route -import com.terning.feature.onboarding.signup.SignUpRoute import com.terning.feature.onboarding.splash.SplashScreen import kotlinx.serialization.Serializable @@ -19,9 +19,22 @@ fun NavController.navigateSplash(navOptions: NavOptions? = null) { } fun NavGraphBuilder.splashNavGraph( - navHostController: NavHostController + navHostController: NavHostController, ) { - composable { + composable( + popExitTransition = { + ExitTransition.None + }, + exitTransition = { + ExitTransition.None + }, + enterTransition = { + EnterTransition.None + }, + popEnterTransition = { + EnterTransition.None + } + ) { SplashScreen( navController = navHostController, ) @@ -29,4 +42,4 @@ fun NavGraphBuilder.splashNavGraph( } @Serializable -data object Splash: Route \ No newline at end of file +data object Splash : Route \ No newline at end of file diff --git a/feature/src/main/java/com/terning/feature/search/search/SearchRoute.kt b/feature/src/main/java/com/terning/feature/search/search/SearchRoute.kt index 11b6b43ff..11a76b6d1 100644 --- a/feature/src/main/java/com/terning/feature/search/search/SearchRoute.kt +++ b/feature/src/main/java/com/terning/feature/search/search/SearchRoute.kt @@ -1,12 +1,12 @@ package com.terning.feature.search.search -import com.terning.domain.entity.response.InternshipAnnouncementModel import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.material3.HorizontalDivider import androidx.compose.material3.Scaffold import androidx.compose.material3.Text @@ -28,6 +28,7 @@ import com.terning.core.designsystem.theme.Grey100 import com.terning.core.designsystem.theme.TerningTheme import com.terning.core.extension.noRippleClickable import com.terning.core.state.UiState +import com.terning.domain.entity.response.InternshipAnnouncementModel import com.terning.feature.R import com.terning.feature.search.search.component.ImageSlider import com.terning.feature.search.search.component.InternListType @@ -85,9 +86,9 @@ fun SearchScreen( searchScrapsList: List, ) { val images = listOf( - R.drawable.ic_nav_search, - R.drawable.ic_check, - R.drawable.ic_nav_my_page, + R.drawable.img_ad_1, + R.drawable.img_ad_2, + R.drawable.img_ad_3, ) Scaffold( @@ -120,38 +121,38 @@ fun SearchScreen( ) } - ImageSlider( - images = images - ) + LazyColumn { + item { + ImageSlider(images = images) - Spacer( - modifier = Modifier.padding(8.dp) - ) + Spacer(modifier = Modifier.padding(8.dp)) - Text( - text = stringResource(id = R.string.search_today_popular), - modifier = Modifier.padding(horizontal = 24.dp, vertical = 4.dp), - style = TerningTheme.typography.title1, - color = Black - ) + Text( + text = stringResource(id = R.string.search_today_popular), + modifier = Modifier.padding(horizontal = 24.dp, vertical = 4.dp), + style = TerningTheme.typography.title1, + color = Black + ) - SearchInternList( - type = InternListType.VIEW, - searchViewsList = searchViewsList, - searchScrapsList = searchScrapsList, - navController = navController - ) - HorizontalDivider( - thickness = 4.dp, - modifier = Modifier.padding(vertical = 8.dp), - color = Grey100, - ) - SearchInternList( - type = InternListType.SCRAP, - searchViewsList = searchViewsList, - searchScrapsList = searchScrapsList, - navController = navController - ) + SearchInternList( + type = InternListType.VIEW, + searchViewsList = searchViewsList, + searchScrapsList = searchScrapsList, + navController = navController + ) + HorizontalDivider( + thickness = 4.dp, + modifier = Modifier.padding(vertical = 8.dp), + color = Grey100, + ) + SearchInternList( + type = InternListType.SCRAP, + searchViewsList = searchViewsList, + searchScrapsList = searchScrapsList, + navController = navController + ) + } + } } } } diff --git a/feature/src/main/java/com/terning/feature/search/search/component/ImageSlider.kt b/feature/src/main/java/com/terning/feature/search/search/component/ImageSlider.kt index 3eb84743b..b6384976a 100644 --- a/feature/src/main/java/com/terning/feature/search/search/component/ImageSlider.kt +++ b/feature/src/main/java/com/terning/feature/search/search/component/ImageSlider.kt @@ -7,14 +7,13 @@ import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding -import androidx.compose.foundation.layout.wrapContentSize import androidx.compose.foundation.pager.HorizontalPager import androidx.compose.foundation.pager.rememberPagerState -import androidx.compose.material3.Card import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier +import androidx.compose.ui.layout.ContentScale import androidx.compose.ui.res.painterResource import androidx.compose.ui.unit.dp import com.terning.core.designsystem.theme.Grey200 @@ -41,27 +40,21 @@ fun ImageSlider( horizontalAlignment = Alignment.CenterHorizontally ) { Box( - modifier = modifier - .wrapContentSize(), + modifier = modifier, contentAlignment = Alignment.BottomCenter ) { HorizontalPager( state = pagerState, - modifier = modifier.wrapContentSize() + modifier = modifier ) { currentPage -> - Card( - modifier - .wrapContentSize() - ) { - Image( - painter = painterResource(id = images[currentPage]), - contentDescription = null, - modifier = modifier - .fillMaxWidth() - .height(112.dp) - .padding(16.dp) - ) - } + Image( + painter = painterResource(id = images[currentPage]), + contentDescription = null, + modifier = modifier + .fillMaxWidth() + .height(112.dp), + contentScale = ContentScale.Crop + ) } DotsIndicator( pageCount = images.size, diff --git a/feature/src/main/java/com/terning/feature/search/search/navigation/SearchNavigation.kt b/feature/src/main/java/com/terning/feature/search/search/navigation/SearchNavigation.kt index 8daeea54b..fabf93899 100644 --- a/feature/src/main/java/com/terning/feature/search/search/navigation/SearchNavigation.kt +++ b/feature/src/main/java/com/terning/feature/search/search/navigation/SearchNavigation.kt @@ -1,5 +1,7 @@ package com.terning.feature.search.search.navigation +import androidx.compose.animation.EnterTransition +import androidx.compose.animation.ExitTransition import androidx.navigation.NavController import androidx.navigation.NavGraphBuilder import androidx.navigation.NavHostController @@ -19,7 +21,20 @@ fun NavController.navigateSearch(navOptions: NavOptions? = null) { fun NavGraphBuilder.searchNavGraph( navHostController: NavHostController, ) { - composable { + composable( + exitTransition = { + ExitTransition.None + }, + popEnterTransition = { + EnterTransition.None + }, + enterTransition = { + EnterTransition.None + }, + popExitTransition = { + ExitTransition.None + } + ) { SearchRoute( navController = navHostController ) diff --git a/feature/src/main/java/com/terning/feature/search/searchprocess/SearchProcessRoute.kt b/feature/src/main/java/com/terning/feature/search/searchprocess/SearchProcessRoute.kt index b142cd24a..7a5526ee2 100644 --- a/feature/src/main/java/com/terning/feature/search/searchprocess/SearchProcessRoute.kt +++ b/feature/src/main/java/com/terning/feature/search/searchprocess/SearchProcessRoute.kt @@ -2,7 +2,6 @@ package com.terning.feature.search.searchprocess import androidx.compose.foundation.Image import androidx.compose.foundation.layout.Arrangement -import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.PaddingValues import androidx.compose.foundation.layout.Row @@ -26,6 +25,7 @@ import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.focus.FocusRequester import androidx.compose.ui.focus.focusRequester +import androidx.compose.ui.layout.ContentScale import androidx.compose.ui.platform.LocalFocusManager import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource @@ -37,7 +37,6 @@ import androidx.lifecycle.compose.LocalLifecycleOwner import androidx.lifecycle.compose.collectAsStateWithLifecycle import androidx.lifecycle.flowWithLifecycle import androidx.navigation.NavHostController -import com.terning.core.designsystem.component.bottomsheet.SortingBottomSheet import com.terning.core.designsystem.component.button.SortingButton import com.terning.core.designsystem.component.item.InternItemWithShadow import com.terning.core.designsystem.component.textfield.SearchTextField @@ -47,7 +46,10 @@ import com.terning.core.designsystem.theme.TerningMain import com.terning.core.designsystem.theme.TerningPointTheme import com.terning.core.designsystem.theme.TerningTheme import com.terning.core.extension.addFocusCleaner +import com.terning.core.extension.noRippleClickable +import com.terning.domain.entity.response.SearchResultModel import com.terning.feature.R +import com.terning.feature.intern.navigation.navigateIntern private const val MAX_LINES = 1 @@ -61,7 +63,6 @@ fun SearchProcessRoute( val currentSortBy: MutableState = remember { mutableIntStateOf(0) } - val searchListState by viewModel.searchListState.collectAsStateWithLifecycle(lifecycleOwner = lifecycleOwner) LaunchedEffect(viewModel.sideEffect, lifecycleOwner) { viewModel.sideEffect.flowWithLifecycle(lifecycle = lifecycleOwner.lifecycle) @@ -92,16 +93,6 @@ fun SearchProcessScreen( var sheetState by remember { mutableStateOf(false) } val internSearchResultData by viewModel.internSearchResultData.collectAsStateWithLifecycle() - if (sheetState) { - SortingBottomSheet( - onDismiss = { - sheetState = false - }, - currentSortBy = currentSortBy.value, - newSortBy = currentSortBy - ) - } - val focusRequester = remember { FocusRequester() } val focusManager = LocalFocusManager.current @@ -127,130 +118,161 @@ fun SearchProcessScreen( modifier = Modifier .fillMaxSize() .padding(paddingValues) - .padding(horizontal = 24.dp) .addFocusCleaner(focusManager), ) { - if (!state.showSearchResults) { - Text( - text = stringResource(id = R.string.search_process_question_text), - style = TerningTheme.typography.heading2, - color = TerningMain, - modifier = Modifier.padding( - vertical = 16.dp - ) - ) - } - - SearchTextField( - text = state.text, - onValueChange = { newText -> - viewModel.updateText(newText) - }, - hint = stringResource(R.string.search_text_field_hint), - leftIcon = R.drawable.ic_nav_search, - modifier = Modifier - .padding(top = 8.dp) - .focusRequester(focusRequester) - .addFocusCleaner(focusManager), - onDoneAction = { - viewModel.getSearchList( - keyword = state.text, - sortBy = SORT_BY, - page = 0, - size = 10 + Column( + modifier = modifier + .padding(horizontal = 24.dp) + ) { + if (!state.showSearchResults) { + Text( + text = stringResource(id = R.string.search_process_question_text), + style = TerningTheme.typography.heading2, + color = TerningMain, + modifier = Modifier.padding( + vertical = 16.dp + ) ) - viewModel.updateQuery(state.text) - viewModel.updateShowSearchResults(true) - viewModel.updateExistSearchResults(state.text) } - ) - if (state.showSearchResults) { - Column( + SearchTextField( + text = state.text, + onValueChange = { newText -> + viewModel.updateText(newText) + }, + hint = stringResource(R.string.search_text_field_hint), + leftIcon = R.drawable.ic_nav_search, modifier = Modifier - .fillMaxWidth(), - horizontalAlignment = Alignment.CenterHorizontally, - verticalArrangement = Arrangement.Center - ) { - if (internSearchResultData.isNotEmpty()) { - Row( - modifier = Modifier - .fillMaxWidth(), - horizontalArrangement = Arrangement.End, - ) { - SortingButton( - sortBy = currentSortBy.value, - onCLick = { sheetState = true }, - ) - } - LazyColumn( - contentPadding = PaddingValues( - top = 12.dp, - bottom = 20.dp, - ), - verticalArrangement = Arrangement.spacedBy(12.dp) - ) { - items(viewModel.internSearchResultData.value.size) { index -> - InternItemWithShadow( - imageUrl = internSearchResultData[index].companyImage, - title = internSearchResultData[index].title, - dateDeadline = internSearchResultData[index].dDay, - workingPeriod = internSearchResultData[index].workingPeriod, - scrapId = internSearchResultData[index].scrapId + .padding(top = 8.dp) + .focusRequester(focusRequester) + .addFocusCleaner(focusManager), + onDoneAction = { + viewModel.getSearchList( + keyword = state.text, + sortBy = SORT_BY, + page = 0, + size = 10 + ) + viewModel.updateQuery(state.text) + viewModel.updateShowSearchResults(true) + viewModel.updateExistSearchResults(state.text) + } + ) + + if (state.showSearchResults) { + Column( + modifier = Modifier + .fillMaxWidth(), + horizontalAlignment = Alignment.CenterHorizontally, + verticalArrangement = Arrangement.Center + ) { + if (internSearchResultData.isNotEmpty()) { + Row( + modifier = Modifier + .fillMaxWidth(), + horizontalArrangement = Arrangement.End, + ) { + SortingButton( + sortBy = currentSortBy.value, + onCLick = { sheetState = true }, ) } - } - } else { - Spacer( - modifier = Modifier.padding(top = 87.dp) - ) - Image( - painter = painterResource( - id = R.drawable.ic_empty_logo - ), - contentDescription = stringResource( - id = R.string.search_process_no_result_icon + LazyColumn( + contentPadding = PaddingValues( + top = 12.dp, + bottom = 20.dp, + ), + verticalArrangement = Arrangement.spacedBy(12.dp) + ) { + items(viewModel.internSearchResultData.value.size) { index -> + SearchResultItem( + navController = navController, + intern = internSearchResultData[index] + ) + } + } + } else { + Spacer( + modifier = Modifier.padding(top = 87.dp) ) - ) - Row( - modifier = Modifier - .padding( - top = 16.dp, - bottom = 6.dp + Image( + painter = painterResource( + id = R.drawable.ic_empty_logo + ), + contentDescription = stringResource( + id = R.string.search_process_no_result_icon ) - .fillMaxWidth(), - verticalAlignment = Alignment.CenterVertically, - horizontalArrangement = Arrangement.Center - ) { - Text( - text = state.keyword, - style = TerningTheme.typography.body1, - color = TerningMain, - maxLines = MAX_LINES, - overflow = TextOverflow.Ellipsis, - modifier = Modifier.weight(1f, false) ) + Row( + modifier = Modifier + .padding( + top = 16.dp, + bottom = 6.dp + ) + .fillMaxWidth(), + verticalAlignment = Alignment.CenterVertically, + horizontalArrangement = Arrangement.Center + ) { + Text( + text = state.keyword, + style = TerningTheme.typography.body1, + color = TerningMain, + maxLines = MAX_LINES, + overflow = TextOverflow.Ellipsis, + modifier = Modifier.weight(1f, false) + ) + Text( + text = stringResource(id = R.string.search_process_no_result_text_sub), + style = TerningTheme.typography.body1, + color = Grey400, + modifier = Modifier.wrapContentWidth() + ) + } Text( - text = stringResource(id = R.string.search_process_no_result_text_sub), + text = stringResource( + id = R.string.search_process_no_result_text_main + ), style = TerningTheme.typography.body1, color = Grey400, - modifier = Modifier.wrapContentWidth() ) } - Text( - text = stringResource( - id = R.string.search_process_no_result_text_main - ), - style = TerningTheme.typography.body1, - color = Grey400, - ) } } } + if (!state.showSearchResults) { + Image( + painter = painterResource(id = R.drawable.ic_search_backgroud), + contentDescription = null, + contentScale = ContentScale.FillWidth, + modifier = modifier.fillMaxSize() + ) + } } } } +@Composable +private fun SearchResultItem( + navController: NavHostController, + intern: SearchResultModel, + modifier: Modifier = Modifier, +) { + InternItemWithShadow( + modifier = modifier.noRippleClickable { + navController.navigateIntern( + announcementId = intern.internshipAnnouncementId + ) + }, + imageUrl = intern.companyImage, + title = intern.title, + dateDeadline = intern.dDay, + workingPeriod = intern.workingPeriod, + isScrapped = intern.scrapId != null, + shadowWidth = 2.dp, + shadowRadius = 10.dp + ) +} + @Preview(showBackground = true) @Composable fun SearchProcessScreenPreview() { diff --git a/feature/src/main/java/com/terning/feature/search/searchprocess/navigation/SearchProcessNavigation.kt b/feature/src/main/java/com/terning/feature/search/searchprocess/navigation/SearchProcessNavigation.kt index fa6a4b7a2..c5355f915 100644 --- a/feature/src/main/java/com/terning/feature/search/searchprocess/navigation/SearchProcessNavigation.kt +++ b/feature/src/main/java/com/terning/feature/search/searchprocess/navigation/SearchProcessNavigation.kt @@ -1,5 +1,7 @@ package com.terning.feature.search.searchprocess.navigation +import androidx.compose.animation.EnterTransition +import androidx.compose.animation.ExitTransition import androidx.navigation.NavController import androidx.navigation.NavGraphBuilder import androidx.navigation.NavHostController @@ -19,7 +21,20 @@ fun NavController.navigateSearchProcess(navOptions: NavOptions? = null) { fun NavGraphBuilder.searchProcessNavGraph( navHostController: NavHostController, ) { - composable { + composable( + exitTransition = { + ExitTransition.None + }, + popEnterTransition = { + EnterTransition.None + }, + enterTransition = { + EnterTransition.None + }, + popExitTransition = { + ExitTransition.None + } + ) { SearchProcessRoute( navController = navHostController ) diff --git a/feature/src/main/res/drawable/ic_launcher_background.xml b/feature/src/main/res/drawable/ic_launcher_background.xml deleted file mode 100644 index 07d5da9cb..000000000 --- a/feature/src/main/res/drawable/ic_launcher_background.xml +++ /dev/null @@ -1,170 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/feature/src/main/res/drawable/ic_launcher_foreground.xml b/feature/src/main/res/drawable/ic_launcher_foreground.xml deleted file mode 100644 index 2b068d114..000000000 --- a/feature/src/main/res/drawable/ic_launcher_foreground.xml +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - - - \ No newline at end of file diff --git a/feature/src/main/res/drawable/ic_search_bg.xml b/feature/src/main/res/drawable/ic_search_bg.xml new file mode 100644 index 000000000..614b68a24 --- /dev/null +++ b/feature/src/main/res/drawable/ic_search_bg.xml @@ -0,0 +1,200 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/feature/src/main/res/drawable/img_ad_1.png b/feature/src/main/res/drawable/img_ad_1.png new file mode 100644 index 000000000..9d1a44b0b Binary files /dev/null and b/feature/src/main/res/drawable/img_ad_1.png differ diff --git a/feature/src/main/res/drawable/img_ad_2.png b/feature/src/main/res/drawable/img_ad_2.png new file mode 100644 index 000000000..489a1df67 Binary files /dev/null and b/feature/src/main/res/drawable/img_ad_2.png differ diff --git a/feature/src/main/res/drawable/img_ad_3.png b/feature/src/main/res/drawable/img_ad_3.png new file mode 100644 index 000000000..f263ac528 Binary files /dev/null and b/feature/src/main/res/drawable/img_ad_3.png differ diff --git a/feature/src/main/res/mipmap-anydpi/ic_launcher.xml b/feature/src/main/res/mipmap-anydpi/ic_launcher.xml deleted file mode 100644 index 6f3b755bf..000000000 --- a/feature/src/main/res/mipmap-anydpi/ic_launcher.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/feature/src/main/res/mipmap-anydpi/ic_launcher_round.xml b/feature/src/main/res/mipmap-anydpi/ic_launcher_round.xml deleted file mode 100644 index 6f3b755bf..000000000 --- a/feature/src/main/res/mipmap-anydpi/ic_launcher_round.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/feature/src/main/res/mipmap-hdpi/ic_launcher.webp b/feature/src/main/res/mipmap-hdpi/ic_launcher.webp deleted file mode 100644 index c209e78ec..000000000 Binary files a/feature/src/main/res/mipmap-hdpi/ic_launcher.webp and /dev/null differ diff --git a/feature/src/main/res/mipmap-hdpi/ic_launcher_round.webp b/feature/src/main/res/mipmap-hdpi/ic_launcher_round.webp deleted file mode 100644 index b2dfe3d1b..000000000 Binary files a/feature/src/main/res/mipmap-hdpi/ic_launcher_round.webp and /dev/null differ diff --git a/feature/src/main/res/mipmap-mdpi/ic_launcher.webp b/feature/src/main/res/mipmap-mdpi/ic_launcher.webp deleted file mode 100644 index 4f0f1d64e..000000000 Binary files a/feature/src/main/res/mipmap-mdpi/ic_launcher.webp and /dev/null differ diff --git a/feature/src/main/res/mipmap-mdpi/ic_launcher_round.webp b/feature/src/main/res/mipmap-mdpi/ic_launcher_round.webp deleted file mode 100644 index 62b611da0..000000000 Binary files a/feature/src/main/res/mipmap-mdpi/ic_launcher_round.webp and /dev/null differ diff --git a/feature/src/main/res/mipmap-xhdpi/ic_launcher.webp b/feature/src/main/res/mipmap-xhdpi/ic_launcher.webp deleted file mode 100644 index 948a3070f..000000000 Binary files a/feature/src/main/res/mipmap-xhdpi/ic_launcher.webp and /dev/null differ diff --git a/feature/src/main/res/mipmap-xhdpi/ic_launcher_round.webp b/feature/src/main/res/mipmap-xhdpi/ic_launcher_round.webp deleted file mode 100644 index 1b9a6956b..000000000 Binary files a/feature/src/main/res/mipmap-xhdpi/ic_launcher_round.webp and /dev/null differ diff --git a/feature/src/main/res/mipmap-xxhdpi/ic_launcher.webp b/feature/src/main/res/mipmap-xxhdpi/ic_launcher.webp deleted file mode 100644 index 28d4b77f9..000000000 Binary files a/feature/src/main/res/mipmap-xxhdpi/ic_launcher.webp and /dev/null differ diff --git a/feature/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp b/feature/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp deleted file mode 100644 index 9287f5083..000000000 Binary files a/feature/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp and /dev/null differ diff --git a/feature/src/main/res/mipmap-xxxhdpi/ic_launcher.webp b/feature/src/main/res/mipmap-xxxhdpi/ic_launcher.webp deleted file mode 100644 index aa7d6427e..000000000 Binary files a/feature/src/main/res/mipmap-xxxhdpi/ic_launcher.webp and /dev/null differ diff --git a/feature/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp b/feature/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp deleted file mode 100644 index 9126ae37c..000000000 Binary files a/feature/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp and /dev/null differ diff --git a/feature/src/main/res/values/themes.xml b/feature/src/main/res/values/themes.xml index 65770c519..9e25abbdf 100644 --- a/feature/src/main/res/values/themes.xml +++ b/feature/src/main/res/values/themes.xml @@ -1,4 +1,6 @@ - \ No newline at end of file