diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 1b42db4..9239c31 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -25,13 +25,19 @@ android { } dependencies { - implementation(projects.core.designsystem) implementation(projects.feature.mypage) implementation(projects.feature.home) implementation(projects.feature.viewmore) implementation(projects.feature.map) implementation(projects.feature.signin) implementation(projects.feature.splash) + + implementation(projects.core.repo.signin.impl) + + implementation(projects.core.http) + + implementation(projects.core.designsystem) + implementation(libs.androidx.appcompat) implementation(libs.kotlinx.immutable) } diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 4c5c2e8..3dc05e1 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -2,7 +2,6 @@ - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + diff --git a/feature/home/src/main/kotlin/org/cazait/cazaitandroid/feature/home/HomeNav.kt b/feature/home/src/main/kotlin/org/cazait/cazaitandroid/feature/home/HomeNav.kt index 72ba0b3..d952102 100644 --- a/feature/home/src/main/kotlin/org/cazait/cazaitandroid/feature/home/HomeNav.kt +++ b/feature/home/src/main/kotlin/org/cazait/cazaitandroid/feature/home/HomeNav.kt @@ -1,6 +1,5 @@ package org.cazait.cazaitandroid.feature.home -import androidx.compose.foundation.layout.PaddingValues import androidx.navigation.NavController import androidx.navigation.NavGraphBuilder import androidx.navigation.NavOptions @@ -17,10 +16,9 @@ fun NavController.navigateHome(navOptions: NavOptions) { } fun NavGraphBuilder.homeNavGraph( - padding: PaddingValues, - onCafeClick: () -> Unit, - onShowErrorSnackbar: (throwable: Throwable?) -> Unit, +// padding: PaddingValues, +// onCafeClick: () -> Unit, +// onShowErrorSnackbar: (throwable: Throwable?) -> Unit, ) { - composable(route = HomeNav.route) { - } + composable(route = HomeNav.route) {} } diff --git a/feature/home/src/main/res/drawable/ic_home.xml b/feature/home/src/main/res/drawable/ic_home.xml index 1a108dd..d7fbaee 100644 --- a/feature/home/src/main/res/drawable/ic_home.xml +++ b/feature/home/src/main/res/drawable/ic_home.xml @@ -3,14 +3,13 @@ android:height="50dp" android:viewportWidth="50" android:viewportHeight="50"> - - - - + android:pathData="M25,25m-25,0a25,25 0,1 1,50 0a25,25 0,1 1,-50 0" + android:fillColor="#000000" /> + + + + diff --git a/feature/home/src/main/res/drawable/ic_home_selected.xml b/feature/home/src/main/res/drawable/ic_home_selected.xml index 3f8767b..e769cd0 100644 --- a/feature/home/src/main/res/drawable/ic_home_selected.xml +++ b/feature/home/src/main/res/drawable/ic_home_selected.xml @@ -3,14 +3,13 @@ android:height="50dp" android:viewportWidth="50" android:viewportHeight="50"> - - - - + android:pathData="M25,25m-25,0a25,25 0,1 1,50 0a25,25 0,1 1,-50 0" + android:fillColor="#FF735B" /> + + + + diff --git a/feature/map/src/main/kotlin/org/cazait/cazaitandroid/feature/map/MapNav.kt b/feature/map/src/main/kotlin/org/cazait/cazaitandroid/feature/map/MapNav.kt index b77d97e..ff275e8 100644 --- a/feature/map/src/main/kotlin/org/cazait/cazaitandroid/feature/map/MapNav.kt +++ b/feature/map/src/main/kotlin/org/cazait/cazaitandroid/feature/map/MapNav.kt @@ -1,6 +1,5 @@ package org.cazait.cazaitandroid.feature.map -import androidx.compose.foundation.layout.PaddingValues import androidx.navigation.NavController import androidx.navigation.NavGraphBuilder import androidx.navigation.NavOptions @@ -9,7 +8,7 @@ import androidx.navigation.compose.composable object MapNav { val iconResId = R.drawable.ic_map val iconResIdSelected = R.drawable.ic_map_selected - val route: String = "map" + const val route: String = "map" } fun NavController.navigateMap(navOptions: NavOptions) { @@ -17,9 +16,9 @@ fun NavController.navigateMap(navOptions: NavOptions) { } fun NavGraphBuilder.mapNavGraph( - padding: PaddingValues, - onCafeClick: () -> Unit, - onShowErrorSnackbar: (throwable: Throwable?) -> Unit, +// padding: PaddingValues, +// onCafeClick: () -> Unit, +// onShowErrorSnackbar: (throwable: Throwable?) -> Unit, ) { composable(route = MapNav.route) { } diff --git a/feature/map/src/main/res/drawable/ic_map.xml b/feature/map/src/main/res/drawable/ic_map.xml index ae8f535..f1a5608 100644 --- a/feature/map/src/main/res/drawable/ic_map.xml +++ b/feature/map/src/main/res/drawable/ic_map.xml @@ -3,14 +3,13 @@ android:height="50dp" android:viewportWidth="50" android:viewportHeight="50"> - - - - + android:pathData="M25,25m-25,0a25,25 0,1 1,50 0a25,25 0,1 1,-50 0" + android:fillColor="#000000" /> + + + + diff --git a/feature/map/src/main/res/drawable/ic_map_selected.xml b/feature/map/src/main/res/drawable/ic_map_selected.xml index 2c2a151..64e9503 100644 --- a/feature/map/src/main/res/drawable/ic_map_selected.xml +++ b/feature/map/src/main/res/drawable/ic_map_selected.xml @@ -3,14 +3,13 @@ android:height="50dp" android:viewportWidth="50" android:viewportHeight="50"> - - - - + android:pathData="M25,25m-25,0a25,25 0,1 1,50 0a25,25 0,1 1,-50 0" + android:fillColor="#FF735B" /> + + + + diff --git a/feature/mypage/src/main/kotlin/org/cazait/cazaitandroid/feature/mypage/MyPageNav.kt b/feature/mypage/src/main/kotlin/org/cazait/cazaitandroid/feature/mypage/MyPageNav.kt index ec2ebfd..a27977d 100644 --- a/feature/mypage/src/main/kotlin/org/cazait/cazaitandroid/feature/mypage/MyPageNav.kt +++ b/feature/mypage/src/main/kotlin/org/cazait/cazaitandroid/feature/mypage/MyPageNav.kt @@ -1,6 +1,5 @@ package org.cazait.cazaitandroid.feature.mypage -import androidx.compose.foundation.layout.PaddingValues import androidx.navigation.NavController import androidx.navigation.NavGraphBuilder import androidx.navigation.NavOptions @@ -9,7 +8,7 @@ import androidx.navigation.compose.composable object MyPageNav { val iconResId = R.drawable.ic_my_page val iconResIdSelected = R.drawable.ic_my_page_selected - val route: String = "my_page" + const val route: String = "my_page" } fun NavController.navigateMyPage(navOptions: NavOptions) { @@ -17,10 +16,9 @@ fun NavController.navigateMyPage(navOptions: NavOptions) { } fun NavGraphBuilder.myPageNavGraph( - padding: PaddingValues, - onCafeClick: () -> Unit, - onShowErrorSnackbar: (throwable: Throwable?) -> Unit, +// padding: PaddingValues, +// onCafeClick: () -> Unit, +// onShowErrorSnackbar: (throwable: Throwable?) -> Unit, ) { - composable(route = MyPageNav.route) { - } + composable(route = MyPageNav.route) {} } diff --git a/feature/mypage/src/main/res/drawable/ic_my_page.xml b/feature/mypage/src/main/res/drawable/ic_my_page.xml index 7238566..0fdf0e3 100644 --- a/feature/mypage/src/main/res/drawable/ic_my_page.xml +++ b/feature/mypage/src/main/res/drawable/ic_my_page.xml @@ -3,14 +3,13 @@ android:height="50dp" android:viewportWidth="50" android:viewportHeight="50"> - - - - + android:pathData="M25,25m-25,0a25,25 0,1 1,50 0a25,25 0,1 1,-50 0" + android:fillColor="#000000" /> + + + + diff --git a/feature/mypage/src/main/res/drawable/ic_my_page_selected.xml b/feature/mypage/src/main/res/drawable/ic_my_page_selected.xml index 8588dbb..9f00288 100644 --- a/feature/mypage/src/main/res/drawable/ic_my_page_selected.xml +++ b/feature/mypage/src/main/res/drawable/ic_my_page_selected.xml @@ -3,14 +3,13 @@ android:height="50dp" android:viewportWidth="50" android:viewportHeight="50"> - - - - + android:pathData="M25,25m-25,0a25,25 0,1 1,50 0a25,25 0,1 1,-50 0" + android:fillColor="#FF735B" /> + + + + diff --git a/feature/signin/build.gradle.kts b/feature/signin/build.gradle.kts index 80ba08b..8732def 100644 --- a/feature/signin/build.gradle.kts +++ b/feature/signin/build.gradle.kts @@ -7,5 +7,6 @@ android { } dependencies { + implementation(projects.core.repo.signin.api) implementation(libs.kotlinx.immutable) } diff --git a/feature/signin/src/main/AndroidManifest.xml b/feature/signin/src/main/AndroidManifest.xml index a5918e6..44008a4 100644 --- a/feature/signin/src/main/AndroidManifest.xml +++ b/feature/signin/src/main/AndroidManifest.xml @@ -1,4 +1,4 @@ - + \ No newline at end of file diff --git a/feature/signin/src/main/kotlin/org/cazait/cazaitandroid/feature/signin/SignInNav.kt b/feature/signin/src/main/kotlin/org/cazait/cazaitandroid/feature/signin/SignInNav.kt index e72e52e..f0e8011 100644 --- a/feature/signin/src/main/kotlin/org/cazait/cazaitandroid/feature/signin/SignInNav.kt +++ b/feature/signin/src/main/kotlin/org/cazait/cazaitandroid/feature/signin/SignInNav.kt @@ -1,24 +1,21 @@ package org.cazait.cazaitandroid.feature.signin -import androidx.compose.foundation.layout.PaddingValues import androidx.navigation.NavController import androidx.navigation.NavGraphBuilder -import androidx.navigation.NavOptions import androidx.navigation.compose.composable -object SignInNav { - val route: String = "sign_in" +internal object SignInNav { + const val route: String = "signIn" } -fun NavController.navigateSignIn(navOptions: NavOptions) { - navigate(SignInNav.route, navOptions) +fun NavController.navigateSignIn() { + navigate(SignInNav.route) } -fun NavGraphBuilder.SignInNavGraph( - padding: PaddingValues, - onCafeClick: () -> Unit, +fun NavGraphBuilder.signInNavGraph( + onShowErrorSnackbar: (throwable: Throwable?) -> Unit, ) { composable(route = SignInNav.route) { - + SignInRoute(onShowErrorSnackbar) } -} \ No newline at end of file +} diff --git a/feature/signin/src/main/kotlin/org/cazait/cazaitandroid/feature/signin/SignInRoute.kt b/feature/signin/src/main/kotlin/org/cazait/cazaitandroid/feature/signin/SignInRoute.kt new file mode 100644 index 0000000..6f319a0 --- /dev/null +++ b/feature/signin/src/main/kotlin/org/cazait/cazaitandroid/feature/signin/SignInRoute.kt @@ -0,0 +1,29 @@ +package org.cazait.cazaitandroid.feature.signin + +import androidx.compose.runtime.Composable +import androidx.compose.runtime.LaunchedEffect +import androidx.compose.runtime.getValue +import androidx.hilt.navigation.compose.hiltViewModel +import androidx.lifecycle.compose.collectAsStateWithLifecycle +import kotlinx.coroutines.flow.collectLatest + +@Composable +internal fun SignInRoute( + onShowErrorSnackBar: (throwable: Throwable) -> Unit, + signInViewModel: SignInViewModel = hiltViewModel(), +) { + val signInUiState by signInViewModel.signInUiState.collectAsStateWithLifecycle() + + LaunchedEffect(true) { + signInViewModel.errorFlow.collectLatest { throwable -> onShowErrorSnackBar(throwable) } + } + + SignInScreen( + accountName = signInUiState.accountNameInput, + password = signInUiState.password, + onAccountNameChange = signInViewModel::updateAccountName, + onPasswordChange = signInViewModel::updatePassword, + onClickSignIn = signInViewModel::signIn, + onClickSignUp = {}, + ) +} diff --git a/feature/signin/src/main/kotlin/org/cazait/cazaitandroid/feature/signin/SignInScreen.kt b/feature/signin/src/main/kotlin/org/cazait/cazaitandroid/feature/signin/SignInScreen.kt new file mode 100644 index 0000000..ea6c9ff --- /dev/null +++ b/feature/signin/src/main/kotlin/org/cazait/cazaitandroid/feature/signin/SignInScreen.kt @@ -0,0 +1,105 @@ +package org.cazait.cazaitandroid.feature.signin + +import android.content.res.Configuration +import androidx.compose.foundation.Image +import androidx.compose.foundation.background +import androidx.compose.foundation.clickable +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.padding +import androidx.compose.foundation.layout.size +import androidx.compose.material3.Button +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.vector.ImageVector +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.res.vectorResource +import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.unit.dp +import org.cazait.cazaitandroid.core.designsystem.theme.CazaitTheme +import org.cazait.cazaitandroid.feature.session.R +import org.cazait.cazaitandroid.feature.signin.component.SignInTextField + +@Composable +internal fun SignInScreen( + accountName: String, + password: String, + onAccountNameChange: (String) -> Unit, + onPasswordChange: (String) -> Unit, + onClickSignIn: () -> Unit, + onClickSignUp: () -> Unit, +) { + Column( + modifier = Modifier + .fillMaxSize() + .background(MaterialTheme.colorScheme.background) + .padding(horizontal = 36.dp), + horizontalAlignment = Alignment.CenterHorizontally, + ) { + Spacer(modifier = Modifier.height(168.dp)) + Image( + imageVector = ImageVector.vectorResource(id = org.cazait.cazaitandroid.core.ui.R.drawable.logo_cazait_main), + contentDescription = "Logo", + modifier = Modifier.size(144.dp), + ) + Spacer(modifier = Modifier.height(74.dp)) + Text( + modifier = Modifier.padding(start = 16.dp).align(Alignment.Start), + text = "LOGIN", + style = CazaitTheme.typography.bodyLargeR, + ) + Spacer(modifier = Modifier.height(8.dp)) + SignInTextField( + modifier = Modifier.fillMaxWidth(), + value = accountName, + placeholder = { Text(text = "Username") }, + onValueChange = onAccountNameChange, + ) + Spacer(modifier = Modifier.height(6.dp)) + SignInTextField( + modifier = Modifier.fillMaxWidth(), + value = password, + placeholder = { Text(text = "Password") }, + onValueChange = onPasswordChange, + ) + Spacer(modifier = Modifier.height(27.dp)) + Button( + modifier = Modifier + .fillMaxWidth(), + onClick = onClickSignIn, + ) { + Text( + modifier = Modifier.padding(vertical = 8.dp), + text = stringResource(id = R.string.do_login), + style = CazaitTheme.typography.titleMediumB, + ) + } + Spacer(modifier = Modifier.height(9.dp)) + Text( + modifier = Modifier.clickable { onClickSignUp() }, + text = stringResource(id = R.string.do_sign_up), + ) + } +} + +@Preview(uiMode = Configuration.UI_MODE_NIGHT_YES) +@Preview(uiMode = Configuration.UI_MODE_NIGHT_NO) +@Composable +private fun PreviewSignInScreen() { + CazaitTheme { + SignInScreen( + accountName = "", + password = "", + onAccountNameChange = {}, + onPasswordChange = {}, + onClickSignIn = {}, + onClickSignUp = {}, + ) + } +} diff --git a/feature/signin/src/main/kotlin/org/cazait/cazaitandroid/feature/signin/SignInUiState.kt b/feature/signin/src/main/kotlin/org/cazait/cazaitandroid/feature/signin/SignInUiState.kt new file mode 100644 index 0000000..b1ad5c1 --- /dev/null +++ b/feature/signin/src/main/kotlin/org/cazait/cazaitandroid/feature/signin/SignInUiState.kt @@ -0,0 +1,30 @@ +package org.cazait.cazaitandroid.feature.signin + +import org.cazait.cazaitandroid.core.repo.signin.api.model.UserInformation + +internal sealed interface SignInUiState { + val accountNameInput: String + val password: String + + data class None( + override val accountNameInput: String = "", + override val password: String = "", + ) : SignInUiState + + data class Loading( + override val accountNameInput: String, + override val password: String, + ) : SignInUiState + + data class Failed( + override val accountNameInput: String, + override val password: String, + ) : SignInUiState + + data class Success( + val userInformation: UserInformation, + ) : SignInUiState { + override val accountNameInput: String = "" + override val password: String = "" + } +} diff --git a/feature/signin/src/main/kotlin/org/cazait/cazaitandroid/feature/signin/SignInViewModel.kt b/feature/signin/src/main/kotlin/org/cazait/cazaitandroid/feature/signin/SignInViewModel.kt new file mode 100644 index 0000000..04066df --- /dev/null +++ b/feature/signin/src/main/kotlin/org/cazait/cazaitandroid/feature/signin/SignInViewModel.kt @@ -0,0 +1,64 @@ +package org.cazait.cazaitandroid.feature.signin + +import androidx.lifecycle.ViewModel +import androidx.lifecycle.viewModelScope +import dagger.hilt.android.lifecycle.HiltViewModel +import kotlinx.coroutines.flow.MutableSharedFlow +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.asSharedFlow +import kotlinx.coroutines.flow.asStateFlow +import kotlinx.coroutines.flow.catch +import kotlinx.coroutines.flow.flow +import kotlinx.coroutines.flow.map +import kotlinx.coroutines.flow.update +import kotlinx.coroutines.launch +import org.cazait.cazaitandroid.core.repo.signin.api.model.AccountName +import org.cazait.cazaitandroid.core.repo.signin.api.model.Password +import org.cazait.cazaitandroid.feature.signin.usecase.PostSignInUseCase +import javax.inject.Inject + +@HiltViewModel +internal class SignInViewModel @Inject constructor( + private val postSignInUseCase: PostSignInUseCase, +) : ViewModel() { + private val _errorFlow = MutableSharedFlow() + val errorFlow = _errorFlow.asSharedFlow() + + private val _signInUiState = MutableStateFlow(SignInUiState.None()) + val signInUiState = _signInUiState.asStateFlow() + + fun updateAccountName(accountName: String) { + val state = _signInUiState.value + if (state !is SignInUiState.None) return + + _signInUiState.update { state.copy(accountNameInput = accountName) } + } + + fun updatePassword(password: String) { + val state = _signInUiState.value + if (state !is SignInUiState.None) return + + _signInUiState.update { state.copy(password = password) } + } + + fun signIn() { + val state = _signInUiState.value + if (state !is SignInUiState.None) return + + viewModelScope.launch { + flow { + emit( + postSignInUseCase( + AccountName(state.accountNameInput), + Password(state.password), + ), + ) + }.map(SignInUiState::Success).catch { throwable -> + throwable.printStackTrace() + _errorFlow.emit(throwable) + }.collect { success -> + _signInUiState.update { success } + } + } + } +} diff --git a/feature/signin/src/main/kotlin/org/cazait/cazaitandroid/feature/signin/component/SignInTextField.kt b/feature/signin/src/main/kotlin/org/cazait/cazaitandroid/feature/signin/component/SignInTextField.kt new file mode 100644 index 0000000..ea9b048 --- /dev/null +++ b/feature/signin/src/main/kotlin/org/cazait/cazaitandroid/feature/signin/component/SignInTextField.kt @@ -0,0 +1,49 @@ +package org.cazait.cazaitandroid.feature.signin.component + +import android.content.res.Configuration +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.material3.TextField +import androidx.compose.material3.TextFieldDefaults +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.unit.dp +import org.cazait.cazaitandroid.core.designsystem.theme.CazaitTheme + +@Composable +internal fun SignInTextField( + onValueChange: (String) -> Unit, + modifier: Modifier = Modifier, + value: String = "", + placeholder: @Composable () -> Unit, +) { + TextField( + modifier = modifier, + value = value, + onValueChange = onValueChange, + placeholder = placeholder, + shape = RoundedCornerShape(50.dp), + colors = TextFieldDefaults.colors( + focusedIndicatorColor = Color.Transparent, + unfocusedIndicatorColor = Color.Transparent, + disabledIndicatorColor = Color.Transparent, + ), + singleLine = true, + ) +} + +@Preview(uiMode = Configuration.UI_MODE_NIGHT_YES) +@Preview(uiMode = Configuration.UI_MODE_NIGHT_NO) +@Composable +private fun Preview() { + CazaitTheme { + SignInTextField( + onValueChange = {}, + modifier = Modifier.fillMaxWidth(), + value = "Username", + placeholder = {}, + ) + } +} diff --git a/feature/signin/src/main/kotlin/org/cazait/cazaitandroid/feature/signin/di/UseCaseBindModule.kt b/feature/signin/src/main/kotlin/org/cazait/cazaitandroid/feature/signin/di/UseCaseBindModule.kt new file mode 100644 index 0000000..6bbe9d4 --- /dev/null +++ b/feature/signin/src/main/kotlin/org/cazait/cazaitandroid/feature/signin/di/UseCaseBindModule.kt @@ -0,0 +1,19 @@ +package org.cazait.cazaitandroid.feature.signin.di + +import dagger.Binds +import dagger.Module +import dagger.hilt.InstallIn +import dagger.hilt.android.components.ViewModelComponent +import dagger.hilt.android.scopes.ViewModelScoped +import org.cazait.cazaitandroid.feature.signin.usecase.PostSignInUseCase +import org.cazait.cazaitandroid.feature.signin.usecase.PostSignInUseCaseImpl + +@Module +@InstallIn(ViewModelComponent::class) +internal abstract class UseCaseBindModule { + @Binds + @ViewModelScoped + abstract fun postSignInUseCase( + dataSource: PostSignInUseCaseImpl, + ): PostSignInUseCase +} diff --git a/feature/signin/src/main/kotlin/org/cazait/cazaitandroid/feature/signin/usecase/PostSignInUseCaseImpl.kt b/feature/signin/src/main/kotlin/org/cazait/cazaitandroid/feature/signin/usecase/PostSignInUseCaseImpl.kt new file mode 100644 index 0000000..11e3732 --- /dev/null +++ b/feature/signin/src/main/kotlin/org/cazait/cazaitandroid/feature/signin/usecase/PostSignInUseCaseImpl.kt @@ -0,0 +1,22 @@ +package org.cazait.cazaitandroid.feature.signin.usecase + +import org.cazait.cazaitandroid.core.repo.signin.api.SignInRepository +import org.cazait.cazaitandroid.core.repo.signin.api.model.AccountName +import org.cazait.cazaitandroid.core.repo.signin.api.model.Password +import org.cazait.cazaitandroid.core.repo.signin.api.model.UserInformation +import javax.inject.Inject + +internal interface PostSignInUseCase { + suspend operator fun invoke(accountName: AccountName, password: Password): UserInformation +} + +internal class PostSignInUseCaseImpl @Inject constructor( + private val repository: SignInRepository, +) : PostSignInUseCase { + override suspend fun invoke(accountName: AccountName, password: Password): UserInformation { + return repository.postSignIn( + accountName = accountName, + password = password, + ) + } +} diff --git a/feature/signin/src/main/res/values/strings.xml b/feature/signin/src/main/res/values/strings.xml new file mode 100644 index 0000000..6dfb4d3 --- /dev/null +++ b/feature/signin/src/main/res/values/strings.xml @@ -0,0 +1,5 @@ + + + 로그인 하기 + 회원가입 + \ No newline at end of file diff --git a/feature/splash/src/main/AndroidManifest.xml b/feature/splash/src/main/AndroidManifest.xml index a5918e6..44008a4 100644 --- a/feature/splash/src/main/AndroidManifest.xml +++ b/feature/splash/src/main/AndroidManifest.xml @@ -1,4 +1,4 @@ - + \ No newline at end of file diff --git a/feature/splash/src/main/kotlin/org/cazait/cazaitandroid/feature/splash/SplashNav.kt b/feature/splash/src/main/kotlin/org/cazait/cazaitandroid/feature/splash/SplashNav.kt index df19ecb..181b7ba 100644 --- a/feature/splash/src/main/kotlin/org/cazait/cazaitandroid/feature/splash/SplashNav.kt +++ b/feature/splash/src/main/kotlin/org/cazait/cazaitandroid/feature/splash/SplashNav.kt @@ -1,6 +1,5 @@ package org.cazait.cazaitandroid.feature.splash -import androidx.compose.foundation.layout.PaddingValues import androidx.navigation.NavGraphBuilder import androidx.navigation.compose.composable @@ -9,12 +8,10 @@ object SplashNav { } fun NavGraphBuilder.splashNavGraph( - padding: PaddingValues, onClickStart: () -> Unit, ) { composable(route = SplashNav.route) { SplashRoute( - padding = padding, onClickStart = onClickStart, ) } diff --git a/feature/splash/src/main/kotlin/org/cazait/cazaitandroid/feature/splash/SplashRoute.kt b/feature/splash/src/main/kotlin/org/cazait/cazaitandroid/feature/splash/SplashRoute.kt index 6dcc560..819d7ef 100644 --- a/feature/splash/src/main/kotlin/org/cazait/cazaitandroid/feature/splash/SplashRoute.kt +++ b/feature/splash/src/main/kotlin/org/cazait/cazaitandroid/feature/splash/SplashRoute.kt @@ -1,15 +1,12 @@ package org.cazait.cazaitandroid.feature.splash -import androidx.compose.foundation.layout.PaddingValues import androidx.compose.runtime.Composable @Composable fun SplashRoute( - padding: PaddingValues, onClickStart: () -> Unit, ) { SplashScreen( - padding = padding, onClickStart = onClickStart, ) } diff --git a/feature/splash/src/main/kotlin/org/cazait/cazaitandroid/feature/splash/SplashScreen.kt b/feature/splash/src/main/kotlin/org/cazait/cazaitandroid/feature/splash/SplashScreen.kt index 4c2daa9..e5f0c38 100644 --- a/feature/splash/src/main/kotlin/org/cazait/cazaitandroid/feature/splash/SplashScreen.kt +++ b/feature/splash/src/main/kotlin/org/cazait/cazaitandroid/feature/splash/SplashScreen.kt @@ -3,13 +3,15 @@ package org.cazait.cazaitandroid.feature.splash import android.content.res.Configuration import androidx.compose.animation.AnimatedVisibility import androidx.compose.animation.fadeIn +import androidx.compose.animation.slideIn import androidx.compose.foundation.Image +import androidx.compose.foundation.background import androidx.compose.foundation.layout.Box -import androidx.compose.foundation.layout.PaddingValues import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.size +import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Scaffold import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect @@ -22,6 +24,7 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.vector.ImageVector import androidx.compose.ui.res.vectorResource import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.unit.IntOffset import androidx.compose.ui.unit.dp import kotlinx.coroutines.delay import org.cazait.cazaitandroid.core.designsystem.theme.CazaitTheme @@ -29,7 +32,6 @@ import org.cazait.cazaitandroid.feature.splash.components.AppDescriptionCard @Composable fun SplashScreen( - padding: PaddingValues, onClickStart: () -> Unit, ) { var showBottomBar by remember { mutableStateOf(false) } @@ -39,28 +41,30 @@ fun SplashScreen( } Scaffold( - modifier = Modifier.padding(padding), + modifier = Modifier.background(MaterialTheme.colorScheme.background), content = { paddingValues -> Box( - modifier = Modifier - .padding(paddingValues) - .fillMaxSize(), + modifier = Modifier.padding(paddingValues).fillMaxSize(), ) { - Image( - imageVector = ImageVector.vectorResource( - id = org.cazait.cazaitandroid.core.ui.R.drawable.logo_cazait_main, - ), - contentDescription = "logo", - modifier = Modifier - .align(Alignment.Center) - .size(142.dp), - ) + AnimatedVisibility( + modifier = Modifier.align(Alignment.Center), + visible = true, + enter = fadeIn(), + ) { + Image( + imageVector = ImageVector.vectorResource( + id = org.cazait.cazaitandroid.core.ui.R.drawable.logo_cazait_main, + ), + contentDescription = "logo", + modifier = Modifier.align(Alignment.Center).size(142.dp), + ) + } } }, bottomBar = { AnimatedVisibility( visible = showBottomBar, - enter = fadeIn(), + enter = slideIn { IntOffset(0, 0) }, ) { AppDescriptionCard(modifier = Modifier.fillMaxWidth(), onClickStart = onClickStart) } @@ -74,7 +78,6 @@ fun SplashScreen( private fun SplashScreenPreview() { CazaitTheme { SplashScreen( - padding = PaddingValues(0.dp), onClickStart = {}, ) } diff --git a/feature/viewmore/src/main/kotlin/org/cazait/cazaitandroid/feature/viewmore/ViewMoreNav.kt b/feature/viewmore/src/main/kotlin/org/cazait/cazaitandroid/feature/viewmore/ViewMoreNav.kt index 6dfc170..9bc93f5 100644 --- a/feature/viewmore/src/main/kotlin/org/cazait/cazaitandroid/feature/viewmore/ViewMoreNav.kt +++ b/feature/viewmore/src/main/kotlin/org/cazait/cazaitandroid/feature/viewmore/ViewMoreNav.kt @@ -1,6 +1,5 @@ package org.cazait.cazaitandroid.feature.viewmore -import androidx.compose.foundation.layout.PaddingValues import androidx.navigation.NavController import androidx.navigation.NavGraphBuilder import androidx.navigation.NavOptions @@ -9,7 +8,7 @@ import androidx.navigation.compose.composable object ViewMoreNav { val iconResId = R.drawable.ic_view_more val iconResIdSelected = R.drawable.ic_view_more_selected - val route: String = "view_more" + const val route: String = "view_more" } fun NavController.navigateViewMore(navOptions: NavOptions) { @@ -17,9 +16,8 @@ fun NavController.navigateViewMore(navOptions: NavOptions) { } fun NavGraphBuilder.viewMoreNavGraph( - padding: PaddingValues, - onShowErrorSnackbar: (throwable: Throwable?) -> Unit, +// padding: PaddingValues, +// onShowErrorSnackbar: (throwable: Throwable?) -> Unit, ) { - composable(route = ViewMoreNav.route) { - } + composable(route = ViewMoreNav.route) {} } diff --git a/feature/viewmore/src/main/res/drawable/ic_view_more.xml b/feature/viewmore/src/main/res/drawable/ic_view_more.xml index c867912..5506e56 100644 --- a/feature/viewmore/src/main/res/drawable/ic_view_more.xml +++ b/feature/viewmore/src/main/res/drawable/ic_view_more.xml @@ -3,14 +3,13 @@ android:height="50dp" android:viewportWidth="50" android:viewportHeight="50"> - - - - + android:pathData="M25,25m-25,0a25,25 0,1 1,50 0a25,25 0,1 1,-50 0" + android:fillColor="#000000" /> + + + + diff --git a/feature/viewmore/src/main/res/drawable/ic_view_more_selected.xml b/feature/viewmore/src/main/res/drawable/ic_view_more_selected.xml index fc43995..582f469 100644 --- a/feature/viewmore/src/main/res/drawable/ic_view_more_selected.xml +++ b/feature/viewmore/src/main/res/drawable/ic_view_more_selected.xml @@ -3,14 +3,13 @@ android:height="50dp" android:viewportWidth="50" android:viewportHeight="50"> - - - - + android:pathData="M25,25m-25,0a25,25 0,1 1,50 0a25,25 0,1 1,-50 0" + android:fillColor="#FF735B" /> + + + + diff --git a/settings.gradle.kts b/settings.gradle.kts index 5f7904c..b732790 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -17,10 +17,16 @@ dependencyResolutionManagement { rootProject.name = "CazaitAndroid" include( ":app", + + ":core:repo:signin:api", + ":core:repo:signin:impl", + ":core:domain", ":core:data", ":core:designsystem", ":core:ui", + ":core:http", + ":feature:signin", ":feature:splash", ":feature:home",