From 3af2689d9fb7837126960891d8b1e5cca976cd03 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=86=A1=ED=98=84=EC=84=9C?= Date: Thu, 1 Feb 2024 16:11:33 +0900 Subject: [PATCH 01/18] :sparkles: :: Add major toText --- core/model/src/main/java/com/goms/model/enum/Major.kt | 8 -------- core/ui/src/main/java/com/goms/ui/MajorText.kt | 11 +++++++++++ .../main/java/com/goms/main/component/MainLateCard.kt | 2 +- .../java/com/goms/main/component/MainOutingCard.kt | 2 +- .../java/com/goms/main/component/MainProfileCard.kt | 2 +- 5 files changed, 14 insertions(+), 11 deletions(-) create mode 100644 core/ui/src/main/java/com/goms/ui/MajorText.kt diff --git a/core/model/src/main/java/com/goms/model/enum/Major.kt b/core/model/src/main/java/com/goms/model/enum/Major.kt index 3bfdc6f7..ce1aa6b3 100644 --- a/core/model/src/main/java/com/goms/model/enum/Major.kt +++ b/core/model/src/main/java/com/goms/model/enum/Major.kt @@ -4,12 +4,4 @@ enum class Major(val value: String) { SW_DEVELOP("SW"), SMART_IOT("IoT"), AI("AI") -} - -fun Major.toText(): String { - return when (this) { - Major.SW_DEVELOP -> "SW개발" - Major.SMART_IOT -> "IoT" - Major.AI -> "AI" - } } \ No newline at end of file diff --git a/core/ui/src/main/java/com/goms/ui/MajorText.kt b/core/ui/src/main/java/com/goms/ui/MajorText.kt new file mode 100644 index 00000000..25492003 --- /dev/null +++ b/core/ui/src/main/java/com/goms/ui/MajorText.kt @@ -0,0 +1,11 @@ +package com.goms.ui + +import com.goms.model.enum.Major + +fun Major.toText(): String { + return when (this) { + Major.SW_DEVELOP -> "SW개발" + Major.SMART_IOT -> "IoT" + Major.AI -> "AI" + } +} \ No newline at end of file diff --git a/feature/main/src/main/java/com/goms/main/component/MainLateCard.kt b/feature/main/src/main/java/com/goms/main/component/MainLateCard.kt index 597dac42..dac61df8 100644 --- a/feature/main/src/main/java/com/goms/main/component/MainLateCard.kt +++ b/feature/main/src/main/java/com/goms/main/component/MainLateCard.kt @@ -35,8 +35,8 @@ import com.goms.design_system.component.modifier.gomsClickable import com.goms.design_system.theme.GomsTheme import com.goms.main.viewmodel.GetLateRankListUiState import com.goms.model.enum.Authority -import com.goms.model.enum.toText import com.goms.model.response.late.RankResponse +import com.goms.ui.toText @Composable fun MainLateCard( diff --git a/feature/main/src/main/java/com/goms/main/component/MainOutingCard.kt b/feature/main/src/main/java/com/goms/main/component/MainOutingCard.kt index d3b07c05..dad9fbca 100644 --- a/feature/main/src/main/java/com/goms/main/component/MainOutingCard.kt +++ b/feature/main/src/main/java/com/goms/main/component/MainOutingCard.kt @@ -29,8 +29,8 @@ import com.goms.design_system.theme.GomsTheme import com.goms.main.viewmodel.GetOutingCountUiState import com.goms.main.viewmodel.GetOutingListUiState import com.goms.model.enum.Authority -import com.goms.model.enum.toText import com.goms.model.response.outing.OutingResponse +import com.goms.ui.toText @Composable fun MainOutingCard( diff --git a/feature/main/src/main/java/com/goms/main/component/MainProfileCard.kt b/feature/main/src/main/java/com/goms/main/component/MainProfileCard.kt index a26ad163..8fb79ac2 100644 --- a/feature/main/src/main/java/com/goms/main/component/MainProfileCard.kt +++ b/feature/main/src/main/java/com/goms/main/component/MainProfileCard.kt @@ -26,7 +26,7 @@ import com.goms.design_system.theme.GomsTheme import com.goms.design_system.R import com.goms.main.viewmodel.GetProfileUiState import com.goms.model.enum.Authority -import com.goms.model.enum.toText +import com.goms.ui.toText @Composable fun MainProfileCard( From 8826b725600544820fdc8299136c54c18c3d0952 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=86=A1=ED=98=84=EC=84=9C?= Date: Thu, 1 Feb 2024 17:41:03 +0900 Subject: [PATCH 02/18] :lipstick: :: Add icon --- .../java/com/goms/design_system/icon/GomsIcon.kt | 13 +++++++++++++ .../src/main/res/drawable/ic_search.xml | 9 +++++++++ 2 files changed, 22 insertions(+) create mode 100644 core/design-system/src/main/res/drawable/ic_search.xml diff --git a/core/design-system/src/main/java/com/goms/design_system/icon/GomsIcon.kt b/core/design-system/src/main/java/com/goms/design_system/icon/GomsIcon.kt index d00b2b3f..9bb6c7a1 100644 --- a/core/design-system/src/main/java/com/goms/design_system/icon/GomsIcon.kt +++ b/core/design-system/src/main/java/com/goms/design_system/icon/GomsIcon.kt @@ -113,4 +113,17 @@ fun PersonIcon( modifier = modifier, colorFilter = if (tint != Color.Unspecified) ColorFilter.tint(tint) else null ) +} + +@Composable +fun SearchIcon( + modifier: Modifier = Modifier, + tint: Color = Color.Unspecified +) { + Image( + painter = painterResource(id = R.drawable.ic_search), + contentDescription = "Search Icon", + modifier = modifier, + colorFilter = if (tint != Color.Unspecified) ColorFilter.tint(tint) else null + ) } \ No newline at end of file diff --git a/core/design-system/src/main/res/drawable/ic_search.xml b/core/design-system/src/main/res/drawable/ic_search.xml new file mode 100644 index 00000000..2d703696 --- /dev/null +++ b/core/design-system/src/main/res/drawable/ic_search.xml @@ -0,0 +1,9 @@ + + + From b78da0356db5d9ccbc8ecd5689f8d8d2251a5690 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=86=A1=ED=98=84=EC=84=9C?= Date: Thu, 1 Feb 2024 17:41:34 +0900 Subject: [PATCH 03/18] :lipstick: :: Add LateListEmptyText --- .../goms/main/component/LateListEmptyText.kt | 37 +++++++++++++++++++ .../com/goms/main/component/MainLateCard.kt | 19 +--------- 2 files changed, 38 insertions(+), 18 deletions(-) create mode 100644 feature/main/src/main/java/com/goms/main/component/LateListEmptyText.kt diff --git a/feature/main/src/main/java/com/goms/main/component/LateListEmptyText.kt b/feature/main/src/main/java/com/goms/main/component/LateListEmptyText.kt new file mode 100644 index 00000000..2c22edca --- /dev/null +++ b/feature/main/src/main/java/com/goms/main/component/LateListEmptyText.kt @@ -0,0 +1,37 @@ +package com.goms.main.component + +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.text.font.FontWeight +import androidx.compose.ui.unit.dp +import androidx.compose.ui.unit.sp +import com.goms.design_system.theme.GomsTheme + +@Composable +fun LateListEmptyText() { + GomsTheme { colors, typography -> + Column( + modifier = Modifier.fillMaxWidth(), + horizontalAlignment = Alignment.CenterHorizontally, + verticalArrangement = Arrangement.spacedBy(12.dp) + ) { + Text( + text = "\uD83D\uDC4D", + fontSize = 80.sp, + fontWeight = FontWeight.Bold, + color = colors.WHITE + ) + Text( + text = "지각자가 없어요! 놀랍게도...", + style = typography.textMedium, + fontWeight = FontWeight.SemiBold, + color = colors.G4 + ) + } + } +} \ No newline at end of file diff --git a/feature/main/src/main/java/com/goms/main/component/MainLateCard.kt b/feature/main/src/main/java/com/goms/main/component/MainLateCard.kt index dac61df8..84d71712 100644 --- a/feature/main/src/main/java/com/goms/main/component/MainLateCard.kt +++ b/feature/main/src/main/java/com/goms/main/component/MainLateCard.kt @@ -94,24 +94,7 @@ fun MainLateCard( } Spacer(modifier = Modifier.height(16.dp)) if (list.isEmpty()) { - Column( - modifier = Modifier.fillMaxWidth(), - horizontalAlignment = Alignment.CenterHorizontally, - verticalArrangement = Arrangement.spacedBy(12.dp) - ) { - Text( - text = "\uD83D\uDC4D", - fontSize = 80.sp, - fontWeight = FontWeight.Bold, - color = colors.WHITE - ) - Text( - text = "지각자가 없어요! 놀랍게도...", - style = typography.textMedium, - fontWeight = FontWeight.SemiBold, - color = colors.G4 - ) - } + LateListEmptyText() } else { LazyRow(modifier = Modifier.fillMaxWidth()) { items(list.take(3).size) { From 8fb5569a2e45fa8e9053868a59a954504188563c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=86=A1=ED=98=84=EC=84=9C?= Date: Thu, 1 Feb 2024 17:41:44 +0900 Subject: [PATCH 04/18] :lipstick: :: Add OutingListEmptyText --- .../main/component/OutingListEmptyText.kt | 38 +++++++++++++++++++ 1 file changed, 38 insertions(+) create mode 100644 feature/main/src/main/java/com/goms/main/component/OutingListEmptyText.kt diff --git a/feature/main/src/main/java/com/goms/main/component/OutingListEmptyText.kt b/feature/main/src/main/java/com/goms/main/component/OutingListEmptyText.kt new file mode 100644 index 00000000..c0ea2b82 --- /dev/null +++ b/feature/main/src/main/java/com/goms/main/component/OutingListEmptyText.kt @@ -0,0 +1,38 @@ +package com.goms.main.component + +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.text.font.FontWeight +import androidx.compose.ui.unit.dp +import androidx.compose.ui.unit.sp +import com.goms.design_system.theme.GomsTheme + +@Composable +fun OutingListEmptyText() { + GomsTheme { colors, typography -> + Column( + modifier = Modifier.fillMaxWidth(), + horizontalAlignment = Alignment.CenterHorizontally, + verticalArrangement = Arrangement.spacedBy(12.dp) + ) { + Text( + text = "☕️", + fontSize = 80.sp, + fontWeight = FontWeight.Bold, + color = colors.WHITE + ) + Text( + text = "텅 비었습니다...\n" + + "아직 외출할 시간이 아닌가요?", + style = typography.textMedium, + fontWeight = FontWeight.SemiBold, + color = colors.G4 + ) + } + } +} \ No newline at end of file From edf7b5d90d74075464c4038b39f8289b066fa501 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=86=A1=ED=98=84=EC=84=9C?= Date: Thu, 1 Feb 2024 17:42:04 +0900 Subject: [PATCH 05/18] :lipstick: :: Add OutingStatusText --- .../goms/main/component/OutingStatusText.kt | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) create mode 100644 feature/main/src/main/java/com/goms/main/component/OutingStatusText.kt diff --git a/feature/main/src/main/java/com/goms/main/component/OutingStatusText.kt b/feature/main/src/main/java/com/goms/main/component/OutingStatusText.kt new file mode 100644 index 00000000..cc5190b0 --- /dev/null +++ b/feature/main/src/main/java/com/goms/main/component/OutingStatusText.kt @@ -0,0 +1,20 @@ +package com.goms.main.component + +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import androidx.compose.ui.text.font.FontWeight +import com.goms.design_system.theme.GomsTheme + +@Composable +fun OutingStatusText(modifier: Modifier) { + GomsTheme { colors, typography -> + Text( + modifier = modifier, + text = "외출 현황", + style = typography.titleLarge, + fontWeight = FontWeight.Bold, + color = colors.WHITE + ) + } +} \ No newline at end of file From 5ac89b3078acd1f3c437a4fbf9ad9f8dd8d48d83 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=86=A1=ED=98=84=EC=84=9C?= Date: Thu, 1 Feb 2024 17:42:11 +0900 Subject: [PATCH 06/18] :lipstick: :: Add SearchEmptyText --- .../goms/main/component/SearchEmptyText.kt | 38 +++++++++++++++++++ 1 file changed, 38 insertions(+) create mode 100644 feature/main/src/main/java/com/goms/main/component/SearchEmptyText.kt diff --git a/feature/main/src/main/java/com/goms/main/component/SearchEmptyText.kt b/feature/main/src/main/java/com/goms/main/component/SearchEmptyText.kt new file mode 100644 index 00000000..db460ebe --- /dev/null +++ b/feature/main/src/main/java/com/goms/main/component/SearchEmptyText.kt @@ -0,0 +1,38 @@ +package com.goms.main.component + +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.text.font.FontWeight +import androidx.compose.ui.unit.dp +import androidx.compose.ui.unit.sp +import com.goms.design_system.theme.GomsTheme + +@Composable +fun SearchEmptyText() { + GomsTheme { colors, typography -> + Column( + modifier = Modifier.fillMaxWidth(), + horizontalAlignment = Alignment.CenterHorizontally, + verticalArrangement = Arrangement.spacedBy(12.dp) + ) { + Text( + text = "\uD83E\uDD14", + fontSize = 80.sp, + fontWeight = FontWeight.Bold, + color = colors.WHITE + ) + Text( + text = "검색 결과가 없습니다\n" + + "검색 내용이 잘못되진 않았나요?", + style = typography.textMedium, + fontWeight = FontWeight.SemiBold, + color = colors.G4 + ) + } + } +} \ No newline at end of file From 9c0fe92154352233391bf0bf7a4241dcca498c04 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=86=A1=ED=98=84=EC=84=9C?= Date: Thu, 1 Feb 2024 17:42:17 +0900 Subject: [PATCH 07/18] :lipstick: :: Add SearchResultText --- .../goms/main/component/SearchResultText.kt | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) create mode 100644 feature/main/src/main/java/com/goms/main/component/SearchResultText.kt diff --git a/feature/main/src/main/java/com/goms/main/component/SearchResultText.kt b/feature/main/src/main/java/com/goms/main/component/SearchResultText.kt new file mode 100644 index 00000000..8851ea09 --- /dev/null +++ b/feature/main/src/main/java/com/goms/main/component/SearchResultText.kt @@ -0,0 +1,20 @@ +package com.goms.main.component + +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import androidx.compose.ui.text.font.FontWeight +import com.goms.design_system.theme.GomsTheme + +@Composable +fun SearchResultText(modifier: Modifier) { + GomsTheme { colors, typography -> + Text( + modifier = modifier, + text = "검색 결과", + style = typography.titleLarge, + fontWeight = FontWeight.Bold, + color = colors.WHITE + ) + } +} \ No newline at end of file From b88702d7c7fd798c205c9a142a304159d17047dd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=86=A1=ED=98=84=EC=84=9C?= Date: Thu, 1 Feb 2024 20:23:23 +0900 Subject: [PATCH 08/18] :truck: :: Rename provider --- .../{SharedViewModelProvider.kt => SignUpViewModelProvider.kt} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename feature/sign-up/src/main/java/com/goms/sign_up/viewmodel/{SharedViewModelProvider.kt => SignUpViewModelProvider.kt} (100%) diff --git a/feature/sign-up/src/main/java/com/goms/sign_up/viewmodel/SharedViewModelProvider.kt b/feature/sign-up/src/main/java/com/goms/sign_up/viewmodel/SignUpViewModelProvider.kt similarity index 100% rename from feature/sign-up/src/main/java/com/goms/sign_up/viewmodel/SharedViewModelProvider.kt rename to feature/sign-up/src/main/java/com/goms/sign_up/viewmodel/SignUpViewModelProvider.kt From f4a684bbfe590e816f425a75a3689d7c3c3ce3fd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=86=A1=ED=98=84=EC=84=9C?= Date: Thu, 1 Feb 2024 20:35:41 +0900 Subject: [PATCH 09/18] :sparkles: :: Add formatTime --- .../main/java/com/goms/design_system/util/formatTime.kt | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 core/design-system/src/main/java/com/goms/design_system/util/formatTime.kt diff --git a/core/design-system/src/main/java/com/goms/design_system/util/formatTime.kt b/core/design-system/src/main/java/com/goms/design_system/util/formatTime.kt new file mode 100644 index 00000000..2e9eacb4 --- /dev/null +++ b/core/design-system/src/main/java/com/goms/design_system/util/formatTime.kt @@ -0,0 +1,8 @@ +package com.goms.design_system.util + +fun String.formatTime(): String { + if (this.length >= 5) { + return this.substring(0, 5) + } + return this +} \ No newline at end of file From b5af217b44be04a21b0d51075e7e4c9927165142 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=86=A1=ED=98=84=EC=84=9C?= Date: Thu, 1 Feb 2024 20:36:05 +0900 Subject: [PATCH 10/18] :lipstick: :: Add delete icon --- .../main/java/com/goms/design_system/icon/GomsIcon.kt | 11 +++++++++++ .../design-system/src/main/res/drawable/ic_delete.xml | 9 +++++++++ 2 files changed, 20 insertions(+) create mode 100644 core/design-system/src/main/res/drawable/ic_delete.xml diff --git a/core/design-system/src/main/java/com/goms/design_system/icon/GomsIcon.kt b/core/design-system/src/main/java/com/goms/design_system/icon/GomsIcon.kt index 9bb6c7a1..13ff2353 100644 --- a/core/design-system/src/main/java/com/goms/design_system/icon/GomsIcon.kt +++ b/core/design-system/src/main/java/com/goms/design_system/icon/GomsIcon.kt @@ -126,4 +126,15 @@ fun SearchIcon( modifier = modifier, colorFilter = if (tint != Color.Unspecified) ColorFilter.tint(tint) else null ) +} + +@Composable +fun DeleteIcon( + modifier: Modifier = Modifier +) { + Image( + painter = painterResource(id = R.drawable.ic_delete), + contentDescription = "Delete Icon", + modifier = modifier + ) } \ No newline at end of file diff --git a/core/design-system/src/main/res/drawable/ic_delete.xml b/core/design-system/src/main/res/drawable/ic_delete.xml new file mode 100644 index 00000000..180ff8ac --- /dev/null +++ b/core/design-system/src/main/res/drawable/ic_delete.xml @@ -0,0 +1,9 @@ + + + From df1fe7b3668b0433c08149945ba5944e9ead5c31 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=86=A1=ED=98=84=EC=84=9C?= Date: Thu, 1 Feb 2024 20:46:43 +0900 Subject: [PATCH 11/18] :lipstick: :: Add GomsSearchTextField --- .../component/textfield/GomsTextField.kt | 76 +++++++++++++++++++ 1 file changed, 76 insertions(+) diff --git a/core/design-system/src/main/java/com/goms/design_system/component/textfield/GomsTextField.kt b/core/design-system/src/main/java/com/goms/design_system/component/textfield/GomsTextField.kt index aa83ef3e..584a48db 100644 --- a/core/design-system/src/main/java/com/goms/design_system/component/textfield/GomsTextField.kt +++ b/core/design-system/src/main/java/com/goms/design_system/component/textfield/GomsTextField.kt @@ -40,6 +40,7 @@ import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import com.goms.design_system.component.modifier.gomsClickable import com.goms.design_system.component.timer.CountdownTimer +import com.goms.design_system.icon.SearchIcon import com.goms.design_system.theme.GomsTheme @Composable @@ -434,6 +435,81 @@ fun GomsPasswordTextField( } } +@Composable +fun GomsSearchTextField( + modifier: Modifier = Modifier, + placeHolder: String = "", + readOnly: Boolean = false, + focusManager: FocusManager = LocalFocusManager.current, + focusRequester: FocusRequester = FocusRequester(), + setText: String, + keyboardOptions: KeyboardOptions = KeyboardOptions.Default, + keyboardActions: KeyboardActions = KeyboardActions.Default, + maxLines: Int = Int.MAX_VALUE, + singleLine: Boolean = false, + visualTransformation: VisualTransformation = VisualTransformation.None, + onValueChange: (String) -> Unit = {}, +) { + val isFocused = remember { mutableStateOf(false) } + + DisposableEffect(Unit) { + onDispose { + focusManager.clearFocus() + } + } + + GomsTheme { colors, typography -> + Column { + OutlinedTextField( + value = setText, + onValueChange = { + onValueChange(it) + }, + keyboardOptions = keyboardOptions, + keyboardActions = keyboardActions, + placeholder = { + Text( + text = placeHolder, + style = typography.textMedium, + fontWeight = FontWeight.Normal, + color = colors.G4 + ) + }, + modifier = modifier + .fillMaxWidth() + .focusRequester(focusRequester) + .clip(RoundedCornerShape(12.dp)) + .background(colors.G1) + .border( + width = 1.dp, + color = colors.WHITE.copy(0.15f), + shape = RoundedCornerShape(12.dp) + ) + .onFocusChanged { + isFocused.value = it.isFocused + }, + maxLines = maxLines, + singleLine = singleLine, + textStyle = typography.textMedium, + colors = OutlinedTextFieldDefaults.colors( + focusedTextColor = colors.WHITE, + unfocusedTextColor = colors.WHITE, + focusedPlaceholderColor = colors.G4, + unfocusedPlaceholderColor = colors.G4, + focusedBorderColor = Color.Transparent, + unfocusedBorderColor = Color.Transparent, + cursorColor = colors.I5 + ), + trailingIcon = { + SearchIcon(tint = colors.G4) + }, + readOnly = readOnly, + visualTransformation = visualTransformation + ) + } + } +} + @Composable @Preview(showBackground = true) fun GomsTextFieldPreview() { From a665c125154ea87723b75ba9ab9d4d792689f383 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=86=A1=ED=98=84=EC=84=9C?= Date: Thu, 1 Feb 2024 20:46:59 +0900 Subject: [PATCH 12/18] :lipstick: :: Modify SearchResultText --- .../src/main/java/com/goms/main/component/SearchResultText.kt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/feature/main/src/main/java/com/goms/main/component/SearchResultText.kt b/feature/main/src/main/java/com/goms/main/component/SearchResultText.kt index 8851ea09..33971460 100644 --- a/feature/main/src/main/java/com/goms/main/component/SearchResultText.kt +++ b/feature/main/src/main/java/com/goms/main/component/SearchResultText.kt @@ -12,8 +12,8 @@ fun SearchResultText(modifier: Modifier) { Text( modifier = modifier, text = "검색 결과", - style = typography.titleLarge, - fontWeight = FontWeight.Bold, + style = typography.textLarge, + fontWeight = FontWeight.SemiBold, color = colors.WHITE ) } From 4e84071371ad56107171cf4de21b82ced12f68bf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=86=A1=ED=98=84=EC=84=9C?= Date: Thu, 1 Feb 2024 20:47:12 +0900 Subject: [PATCH 13/18] :lipstick: :: Add OutingStatusList --- .../goms/main/component/OutingStatusList.kt | 151 ++++++++++++++++++ 1 file changed, 151 insertions(+) create mode 100644 feature/main/src/main/java/com/goms/main/component/OutingStatusList.kt diff --git a/feature/main/src/main/java/com/goms/main/component/OutingStatusList.kt b/feature/main/src/main/java/com/goms/main/component/OutingStatusList.kt new file mode 100644 index 00000000..bd820d6f --- /dev/null +++ b/feature/main/src/main/java/com/goms/main/component/OutingStatusList.kt @@ -0,0 +1,151 @@ +package com.goms.main.component + +import androidx.compose.foundation.Image +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.heightIn +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.size +import androidx.compose.foundation.lazy.LazyColumn +import androidx.compose.material3.Divider +import androidx.compose.material3.IconButton +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +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.text.font.FontWeight +import androidx.compose.ui.unit.dp +import coil.compose.AsyncImage +import com.goms.design_system.R +import com.goms.design_system.icon.DeleteIcon +import com.goms.design_system.theme.GomsTheme +import com.goms.design_system.util.formatTime +import com.goms.main.viewmodel.GetOutingCountUiState +import com.goms.main.viewmodel.GetOutingListUiState +import com.goms.model.enum.Authority +import com.goms.model.response.outing.OutingResponse +import com.goms.ui.toText + +@Composable +fun OutingStatusList( + modifier: Modifier = Modifier, + role: Authority, + getOutingListUiState: GetOutingListUiState, + getOutingCountUiState: GetOutingCountUiState, + onClick: () -> Unit +) { + when (getOutingCountUiState) { + GetOutingCountUiState.Loading -> Unit + is GetOutingCountUiState.Error -> Unit + GetOutingCountUiState.Empty -> { + OutingListEmptyText() + } + is GetOutingCountUiState.Success -> { + when (getOutingListUiState) { + GetOutingListUiState.Loading -> Unit + is GetOutingListUiState.Error -> Unit + is GetOutingListUiState.Success -> { + val list = getOutingListUiState.getOutingListResponse + + GomsTheme { colors, typography -> + Column( + modifier = modifier.fillMaxWidth(), + verticalArrangement = Arrangement.spacedBy(16.dp) + ) { + SearchResultText(modifier = Modifier.align(Alignment.Start)) + LazyColumn( + modifier = Modifier + .fillMaxWidth() + .heightIn(max = 10000.dp) + ) { + items(list.size) { + OutingStatusListItem( + modifier = Modifier.fillMaxWidth(), + role = role, + list = list[it], + onClick = { onClick() } + ) + Divider( + modifier = Modifier.fillMaxWidth(), + color = colors.WHITE.copy(0.15f) + ) + } + } + } + } + } + } + } + } +} + +@Composable +fun OutingStatusListItem( + modifier: Modifier = Modifier, + role: Authority, + list: OutingResponse, + onClick: () -> Unit +) { + GomsTheme { colors, typography -> + Row( + modifier = modifier.padding(horizontal = 16.dp, vertical = 12.dp), + horizontalArrangement = Arrangement.spacedBy(16.dp), + verticalAlignment = Alignment.CenterVertically, + ) { + if (list.profileUrl.isNullOrEmpty()) { + Image( + painter = painterResource(R.drawable.ic_profile), + contentDescription = "Default Profile Image", + modifier = Modifier.size(48.dp) + ) + } else { + AsyncImage( + model = list.profileUrl, + modifier = Modifier.size(48.dp), + contentScale = ContentScale.Crop, + contentDescription = "Profile Image", + ) + } + Column(verticalArrangement = Arrangement.spacedBy(4.dp)) { + Text( + text = list.name, + style = typography.textMedium, + fontWeight = FontWeight.SemiBold, + color = colors.G7 + ) + Row( + horizontalArrangement = Arrangement.spacedBy(4.dp), + verticalAlignment = Alignment.CenterVertically + ) { + Text( + text = "${list.grade}기 | ${list.major.toText()}", + style = typography.caption, + fontWeight = FontWeight.Normal, + color = colors.G4 + ) + Divider( + modifier = Modifier.size(1.dp, 8.dp), + color = colors.WHITE.copy(0.15f) + ) + Text( + text = "${list.createdTime.formatTime()}에 외출", + style = typography.caption, + fontWeight = FontWeight.Normal, + color = colors.G4 + ) + } + } + Spacer(modifier = Modifier.weight(1f)) + if (role == Authority.ROLE_STUDENT_COUNCIL) { + IconButton(onClick = { onClick() }) { + DeleteIcon() + } + } + } + } +} \ No newline at end of file From 1572a789b7f173330e26e9cb7e46a8365f274f7d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=86=A1=ED=98=84=EC=84=9C?= Date: Thu, 1 Feb 2024 20:47:20 +0900 Subject: [PATCH 14/18] :sparkles: :: Add MainViewModelProvider --- .../goms/main/viewmodel/MainViewModelProvider.kt | 14 ++++++++++++++ 1 file changed, 14 insertions(+) create mode 100644 feature/main/src/main/java/com/goms/main/viewmodel/MainViewModelProvider.kt diff --git a/feature/main/src/main/java/com/goms/main/viewmodel/MainViewModelProvider.kt b/feature/main/src/main/java/com/goms/main/viewmodel/MainViewModelProvider.kt new file mode 100644 index 00000000..a0b3d586 --- /dev/null +++ b/feature/main/src/main/java/com/goms/main/viewmodel/MainViewModelProvider.kt @@ -0,0 +1,14 @@ +package com.goms.main.viewmodel + +import androidx.compose.runtime.Composable +import androidx.hilt.navigation.compose.hiltViewModel +import androidx.lifecycle.ViewModelStoreOwner + +@Composable +fun MainViewModelProvider( + viewModelStoreOwner: ViewModelStoreOwner, + content: @Composable (viewModel: MainViewModel) -> Unit +) { + val viewModel: MainViewModel = hiltViewModel(viewModelStoreOwner) + content(viewModel) +} \ No newline at end of file From 429d2cf6b0c681a2e1c8ab1155af12ac4312225c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=86=A1=ED=98=84=EC=84=9C?= Date: Thu, 1 Feb 2024 20:47:51 +0900 Subject: [PATCH 15/18] :sparkles: :: Apply MainViewModelProvider --- .../src/main/java/com/goms/main/MainScreen.kt | 53 ++++++++++--------- 1 file changed, 29 insertions(+), 24 deletions(-) diff --git a/feature/main/src/main/java/com/goms/main/MainScreen.kt b/feature/main/src/main/java/com/goms/main/MainScreen.kt index 3f72c15e..c3132a07 100644 --- a/feature/main/src/main/java/com/goms/main/MainScreen.kt +++ b/feature/main/src/main/java/com/goms/main/MainScreen.kt @@ -1,6 +1,5 @@ package com.goms.main -import android.util.Log import androidx.compose.foundation.background import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Box @@ -13,12 +12,11 @@ import androidx.compose.foundation.rememberScrollState import androidx.compose.foundation.verticalScroll import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect -import androidx.compose.runtime.collectAsState import androidx.compose.runtime.getValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.unit.dp -import androidx.hilt.navigation.compose.hiltViewModel +import androidx.lifecycle.ViewModelStoreOwner import androidx.lifecycle.compose.collectAsStateWithLifecycle import com.goms.design_system.icon.SettingIcon import com.goms.design_system.theme.GomsTheme @@ -26,36 +24,40 @@ import com.goms.main.viewmodel.GetLateRankListUiState import com.goms.main.viewmodel.GetOutingCountUiState import com.goms.main.viewmodel.GetOutingListUiState import com.goms.main.viewmodel.GetProfileUiState -import com.goms.main.viewmodel.MainViewModel import com.goms.model.enum.Authority import com.goms.ui.GomsTopBar import com.goms.ui.GomsFloatingButton import com.goms.main.component.MainLateCard import com.goms.main.component.MainOutingCard import com.goms.main.component.MainProfileCard +import com.goms.main.viewmodel.MainViewModelProvider @Composable fun MainRoute( - viewModel: MainViewModel = hiltViewModel() + viewModelStoreOwner: ViewModelStoreOwner, + onOutingStatusClick: () -> Unit ) { - val role by viewModel.role.collectAsStateWithLifecycle(initialValue = "") - val getProfileUiState by viewModel.getProfileUiState.collectAsStateWithLifecycle() - val getLateRankListUiState by viewModel.getLateRankListUiState.collectAsStateWithLifecycle() - val getOutingListUiState by viewModel.getOutingListUiState.collectAsStateWithLifecycle() - val getOutingCountUiState by viewModel.getOutingCountUiState.collectAsStateWithLifecycle() + MainViewModelProvider(viewModelStoreOwner = viewModelStoreOwner) { viewModel -> + val role by viewModel.role.collectAsStateWithLifecycle(initialValue = "") + val getProfileUiState by viewModel.getProfileUiState.collectAsStateWithLifecycle() + val getLateRankListUiState by viewModel.getLateRankListUiState.collectAsStateWithLifecycle() + val getOutingListUiState by viewModel.getOutingListUiState.collectAsStateWithLifecycle() + val getOutingCountUiState by viewModel.getOutingCountUiState.collectAsStateWithLifecycle() - MainScreen( - role = if (role.isNotBlank()) Authority.valueOf(role) else Authority.ROLE_STUDENT, - getProfileUiState = getProfileUiState, - getLateRankListUiState = getLateRankListUiState, - getOutingListUiState = getOutingListUiState, - getOutingCountUiState = getOutingCountUiState, - getData = { - viewModel.getProfile() - viewModel.getLateRankList() - viewModel.getOutingCount() - } - ) + MainScreen( + role = if (role.isNotBlank()) Authority.valueOf(role) else Authority.ROLE_STUDENT, + getProfileUiState = getProfileUiState, + getLateRankListUiState = getLateRankListUiState, + getOutingListUiState = getOutingListUiState, + getOutingCountUiState = getOutingCountUiState, + getData = { + viewModel.getProfile() + viewModel.getLateRankList() + viewModel.getOutingCount() + }, + onOutingStatusClick = onOutingStatusClick + ) + } } @Composable @@ -65,7 +67,8 @@ fun MainScreen( getLateRankListUiState: GetLateRankListUiState, getOutingListUiState: GetOutingListUiState, getOutingCountUiState: GetOutingCountUiState, - getData: () -> Unit + getData: () -> Unit, + onOutingStatusClick: () -> Unit, ) { LaunchedEffect(true) { getData() @@ -107,7 +110,9 @@ fun MainScreen( role = role, getOutingListUiState = getOutingListUiState, getOutingCountUiState = getOutingCountUiState - ) {} + ) { + onOutingStatusClick() + } } } GomsFloatingButton( From 3167910642ba97cc88e2ee6ef933e23a19faef32 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=86=A1=ED=98=84=EC=84=9C?= Date: Thu, 1 Feb 2024 20:48:07 +0900 Subject: [PATCH 16/18] :sparkles: :: Save outing search --- .../java/com/goms/main/viewmodel/MainViewModel.kt | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/feature/main/src/main/java/com/goms/main/viewmodel/MainViewModel.kt b/feature/main/src/main/java/com/goms/main/viewmodel/MainViewModel.kt index 7f17cacb..6a93496c 100644 --- a/feature/main/src/main/java/com/goms/main/viewmodel/MainViewModel.kt +++ b/feature/main/src/main/java/com/goms/main/viewmodel/MainViewModel.kt @@ -1,5 +1,6 @@ package com.goms.main.viewmodel +import androidx.lifecycle.SavedStateHandle import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import com.goms.common.result.Result @@ -9,17 +10,16 @@ import com.goms.domain.account.GetProfileUseCase import com.goms.domain.late.GetLateRankListUseCase import com.goms.domain.outing.GetOutingCountUseCase import com.goms.domain.outing.GetOutingListUseCase -import com.goms.model.enum.Authority import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.asStateFlow import kotlinx.coroutines.flow.collectLatest -import kotlinx.coroutines.flow.map import kotlinx.coroutines.launch import javax.inject.Inject @HiltViewModel class MainViewModel @Inject constructor( + private val savedStateHandle: SavedStateHandle, private val getProfileUseCase: GetProfileUseCase, private val getLateRankListUseCase: GetLateRankListUseCase, private val getOutingListUseCase: GetOutingListUseCase, @@ -40,6 +40,8 @@ class MainViewModel @Inject constructor( private val _getOutingCountUiState = MutableStateFlow(GetOutingCountUiState.Loading) val getOutingCountUiState = _getOutingCountUiState.asStateFlow() + var outingSearch = savedStateHandle.getStateFlow(key = OUTING_SEARCH, initialValue = "") + fun getProfile() = viewModelScope.launch { getProfileUseCase() .asResult() @@ -94,4 +96,10 @@ class MainViewModel @Inject constructor( } } } -} \ No newline at end of file + + fun onOutingSearchChange(value: String) { + savedStateHandle[OUTING_SEARCH] = value + } +} + +private const val OUTING_SEARCH = "outing search" \ No newline at end of file From ff19c3d3ad48ec0556b002bc2a0018e1f225a7da Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=86=A1=ED=98=84=EC=84=9C?= Date: Thu, 1 Feb 2024 20:48:30 +0900 Subject: [PATCH 17/18] :lipstick: :: Add outing status screen --- .../java/com/goms/main/OutingStatusScreen.kt | 121 ++++++++++++++++++ 1 file changed, 121 insertions(+) create mode 100644 feature/main/src/main/java/com/goms/main/OutingStatusScreen.kt diff --git a/feature/main/src/main/java/com/goms/main/OutingStatusScreen.kt b/feature/main/src/main/java/com/goms/main/OutingStatusScreen.kt new file mode 100644 index 00000000..f463027f --- /dev/null +++ b/feature/main/src/main/java/com/goms/main/OutingStatusScreen.kt @@ -0,0 +1,121 @@ +package com.goms.main + +import androidx.compose.foundation.background +import androidx.compose.foundation.gestures.detectTapGestures +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.height +import androidx.compose.foundation.layout.navigationBarsPadding +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.statusBarsPadding +import androidx.compose.foundation.rememberScrollState +import androidx.compose.foundation.text.KeyboardOptions +import androidx.compose.foundation.verticalScroll +import androidx.compose.runtime.Composable +import androidx.compose.runtime.LaunchedEffect +import androidx.compose.runtime.getValue +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.input.pointer.pointerInput +import androidx.compose.ui.platform.LocalFocusManager +import androidx.compose.ui.text.input.KeyboardType +import androidx.compose.ui.unit.dp +import androidx.lifecycle.ViewModelStoreOwner +import androidx.lifecycle.compose.collectAsStateWithLifecycle +import com.goms.design_system.component.button.GomsBackButton +import com.goms.design_system.component.textfield.GomsSearchTextField +import com.goms.design_system.theme.GomsTheme +import com.goms.design_system.util.keyboardAsState +import com.goms.main.component.OutingStatusList +import com.goms.main.component.OutingStatusText +import com.goms.main.viewmodel.GetOutingCountUiState +import com.goms.main.viewmodel.GetOutingListUiState +import com.goms.main.viewmodel.MainViewModelProvider +import com.goms.model.enum.Authority + +@Composable +fun OutingStatusRoute( + viewModelStoreOwner: ViewModelStoreOwner, + onBackClick: () -> Unit +) { + MainViewModelProvider(viewModelStoreOwner = viewModelStoreOwner) { viewModel -> + val role by viewModel.role.collectAsStateWithLifecycle(initialValue = "") + val outingSearch by viewModel.outingSearch.collectAsStateWithLifecycle() + val getOutingListUiState by viewModel.getOutingListUiState.collectAsStateWithLifecycle() + val getOutingCountUiState by viewModel.getOutingCountUiState.collectAsStateWithLifecycle() + + OutingStatusScreen( + role = if (role.isNotBlank()) Authority.valueOf(role) else Authority.ROLE_STUDENT, + outingSearch = outingSearch, + onOutingSearchChange = viewModel::onOutingSearchChange, + getOutingListUiState = getOutingListUiState, + getOutingCountUiState = getOutingCountUiState, + onBackClick = onBackClick + ) + } +} + +@Composable +fun OutingStatusScreen( + role: Authority, + outingSearch: String, + onOutingSearchChange: (String) -> Unit, + getOutingListUiState: GetOutingListUiState, + getOutingCountUiState: GetOutingCountUiState, + onBackClick: () -> Unit +) { + val scrollState = rememberScrollState() + + val focusManager = LocalFocusManager.current + val isKeyboardOpen by keyboardAsState() + + LaunchedEffect(isKeyboardOpen) { + if (!isKeyboardOpen) { + focusManager.clearFocus() + } + } + + GomsTheme { colors, typography -> + Column( + modifier = Modifier + .fillMaxSize() + .background(colors.BLACK) + .statusBarsPadding() + .navigationBarsPadding() + .pointerInput(Unit) { + detectTapGestures { + focusManager.clearFocus() + } + } + ) { + GomsBackButton { + onBackClick() + } + Column( + modifier = Modifier + .verticalScroll(scrollState) + .padding(horizontal = 20.dp), + horizontalAlignment = Alignment.CenterHorizontally + ) { + OutingStatusText(modifier = Modifier.align(Alignment.Start)) + Spacer(modifier = Modifier.height(16.dp)) + GomsSearchTextField( + modifier = Modifier.fillMaxWidth(), + keyboardOptions = KeyboardOptions(keyboardType = KeyboardType.Text), + placeHolder = "학생 검색...", + setText = outingSearch, + onValueChange = onOutingSearchChange, + singleLine = true + ) + Spacer(modifier = Modifier.height(8.dp)) + OutingStatusList( + role = role, + getOutingListUiState = getOutingListUiState, + getOutingCountUiState = getOutingCountUiState + ) {} + } + } + } +} \ No newline at end of file From 4cc028d24e87b186612fd57a7d3db1f006af3d87 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=86=A1=ED=98=84=EC=84=9C?= Date: Thu, 1 Feb 2024 20:49:27 +0900 Subject: [PATCH 18/18] :sparkles: :: Connect outing status navigation --- .../goms_android_v2/navigation/GomsNavHost.kt | 11 ++++++- .../goms/main/navigation/MainNavigation.kt | 29 +++++++++++++++++-- 2 files changed, 37 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/com/goms/goms_android_v2/navigation/GomsNavHost.kt b/app/src/main/java/com/goms/goms_android_v2/navigation/GomsNavHost.kt index 9b816992..2d2f7f9c 100644 --- a/app/src/main/java/com/goms/goms_android_v2/navigation/GomsNavHost.kt +++ b/app/src/main/java/com/goms/goms_android_v2/navigation/GomsNavHost.kt @@ -12,6 +12,8 @@ import com.goms.login.navigation.navigateToInputLogin import com.goms.login.navigation.navigateToLogin import com.goms.main.navigation.mainScreen import com.goms.main.navigation.navigateToMain +import com.goms.main.navigation.navigateToOutingStatus +import com.goms.main.navigation.outingStatusScreen import com.goms.sign_up.navigation.navigateToNumber import com.goms.sign_up.navigation.navigateToPassword import com.goms.sign_up.navigation.navigateToSignUp @@ -55,6 +57,13 @@ fun GomsNavHost( onBackClick = navController::popBackStack, onLoginClick = { appState.navigateToTopLevelDestination(TopLevelDestination.LOGIN) } ) - mainScreen() + mainScreen( + viewModelStoreOwner = viewModelStoreOwner, + onOutingStatusClick = navController::navigateToOutingStatus + ) + outingStatusScreen( + viewModelStoreOwner = viewModelStoreOwner, + onBackClick = navController::popBackStack + ) } } \ No newline at end of file diff --git a/feature/main/src/main/java/com/goms/main/navigation/MainNavigation.kt b/feature/main/src/main/java/com/goms/main/navigation/MainNavigation.kt index 3fb805d0..ffe7e016 100644 --- a/feature/main/src/main/java/com/goms/main/navigation/MainNavigation.kt +++ b/feature/main/src/main/java/com/goms/main/navigation/MainNavigation.kt @@ -1,19 +1,44 @@ package com.goms.main.navigation +import androidx.lifecycle.ViewModelStoreOwner import androidx.navigation.NavController import androidx.navigation.NavGraphBuilder import androidx.navigation.NavOptions import androidx.navigation.compose.composable import com.goms.main.MainRoute +import com.goms.main.OutingStatusRoute const val mainRoute = "main_route" +const val outingStatusRoute = "outing_status_route" fun NavController.navigateToMain(navOptions: NavOptions? = null) { this.navigate(mainRoute, navOptions) } -fun NavGraphBuilder.mainScreen() { +fun NavGraphBuilder.mainScreen( + viewModelStoreOwner: ViewModelStoreOwner, + onOutingStatusClick: () -> Unit +) { composable(route = mainRoute) { - MainRoute() + MainRoute( + viewModelStoreOwner = viewModelStoreOwner, + onOutingStatusClick = onOutingStatusClick + ) + } +} + +fun NavController.navigateToOutingStatus(navOptions: NavOptions? = null) { + this.navigate(outingStatusRoute, navOptions) +} + +fun NavGraphBuilder.outingStatusScreen( + viewModelStoreOwner: ViewModelStoreOwner, + onBackClick: () -> Unit +) { + composable(route = outingStatusRoute) { + OutingStatusRoute( + viewModelStoreOwner = viewModelStoreOwner, + onBackClick = onBackClick + ) } } \ No newline at end of file