diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 15367bed..57256478 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -17,7 +17,7 @@ android { minSdk = 26 targetSdk = 33 versionCode = 1 - versionName = "1.0.16" + versionName = "1.0.17" testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" } diff --git a/app/src/main/ic_launcher-playstore.png b/app/src/main/ic_launcher-playstore.png new file mode 100644 index 00000000..bba8c4ac Binary files /dev/null and b/app/src/main/ic_launcher-playstore.png differ diff --git a/app/src/main/java/com/whyranoid/walkie/KoinModules.kt b/app/src/main/java/com/whyranoid/walkie/KoinModules.kt index 4b9fdaf7..2bdefa5f 100644 --- a/app/src/main/java/com/whyranoid/walkie/KoinModules.kt +++ b/app/src/main/java/com/whyranoid/walkie/KoinModules.kt @@ -144,7 +144,7 @@ val viewModelModule = viewModel { AddPostViewModel(get()) } viewModel { SearchFriendViewModel(get(), get(), get()) } viewModel { DialogViewModel(get(), get(), get(), get(), get(), get()) } - viewModel { CommunityScreenViewModel(get(), get(), get(), get(), get()) } + viewModel { CommunityScreenViewModel(get(), get(), get(), get(), get(), get(), get()) } viewModel { FollowingViewModel(get(), get(), get(), get(), get(), get()) } viewModel { SettingViewModel(get(), get()) } viewModel { TotalBadgeViewModel(get(), get()) } @@ -171,7 +171,7 @@ val dataSourceModule = single { ChallengeDataSourceImpl(get()) } single { PostDataSourceImpl(get()) } single { UserDataSourceImpl(get()) } - single { AccountDataSourceImpl(get()) } + single { AccountDataSourceImpl(get(),get()) } single { FollowDataSourceImpl(get()) } single { RunningControlDataSourceImpl(get()) } single { CommunityDataSourceImpl(get()) } diff --git a/app/src/main/res/drawable/ic_launcher_background.xml b/app/src/main/res/drawable/ic_launcher_background.xml new file mode 100644 index 00000000..ca3826a4 --- /dev/null +++ b/app/src/main/res/drawable/ic_launcher_background.xml @@ -0,0 +1,74 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml b/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml index eca70cfe..c4a603d4 100644 --- a/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml +++ b/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml @@ -1,5 +1,5 @@ - - + + \ No newline at end of file diff --git a/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml b/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml index eca70cfe..c4a603d4 100644 --- a/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml +++ b/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml @@ -1,5 +1,5 @@ - - + + \ No newline at end of file diff --git a/app/src/main/res/mipmap-anydpi-v33/ic_launcher.xml b/app/src/main/res/mipmap-anydpi-v33/ic_launcher.xml deleted file mode 100644 index 6f3b755b..00000000 --- a/app/src/main/res/mipmap-anydpi-v33/ic_launcher.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher.webp b/app/src/main/res/mipmap-hdpi/ic_launcher.webp index c209e78e..620a9459 100644 Binary files a/app/src/main/res/mipmap-hdpi/ic_launcher.webp and b/app/src/main/res/mipmap-hdpi/ic_launcher.webp differ diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.webp b/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.webp new file mode 100644 index 00000000..5c46412f Binary files /dev/null and b/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.webp differ diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher_round.webp b/app/src/main/res/mipmap-hdpi/ic_launcher_round.webp index b2dfe3d1..3b3c6e20 100644 Binary files a/app/src/main/res/mipmap-hdpi/ic_launcher_round.webp and b/app/src/main/res/mipmap-hdpi/ic_launcher_round.webp differ diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher.webp b/app/src/main/res/mipmap-mdpi/ic_launcher.webp index 4f0f1d64..38849482 100644 Binary files a/app/src/main/res/mipmap-mdpi/ic_launcher.webp and b/app/src/main/res/mipmap-mdpi/ic_launcher.webp differ diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.webp b/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.webp new file mode 100644 index 00000000..583fcd9c Binary files /dev/null and b/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.webp differ diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher_round.webp b/app/src/main/res/mipmap-mdpi/ic_launcher_round.webp index 62b611da..c46905e7 100644 Binary files a/app/src/main/res/mipmap-mdpi/ic_launcher_round.webp and b/app/src/main/res/mipmap-mdpi/ic_launcher_round.webp differ diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher.webp b/app/src/main/res/mipmap-xhdpi/ic_launcher.webp index 948a3070..91dcb2c8 100644 Binary files a/app/src/main/res/mipmap-xhdpi/ic_launcher.webp and b/app/src/main/res/mipmap-xhdpi/ic_launcher.webp differ diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.webp b/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.webp new file mode 100644 index 00000000..2bd275a9 Binary files /dev/null and b/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.webp differ diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp b/app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp index 1b9a6956..fe17b821 100644 Binary files a/app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp and b/app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_launcher.webp b/app/src/main/res/mipmap-xxhdpi/ic_launcher.webp index 28d4b77f..fc3d305c 100644 Binary files a/app/src/main/res/mipmap-xxhdpi/ic_launcher.webp and b/app/src/main/res/mipmap-xxhdpi/ic_launcher.webp differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.webp b/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.webp new file mode 100644 index 00000000..76604107 Binary files /dev/null and b/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.webp differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp b/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp index 9287f508..ae56d839 100644 Binary files a/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp and b/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp differ diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp b/app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp index aa7d6427..1ac66d71 100644 Binary files a/app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp and b/app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp differ diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.webp b/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.webp new file mode 100644 index 00000000..5803a13c Binary files /dev/null and b/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.webp differ diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp b/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp index 9126ae37..cc4a76d7 100644 Binary files a/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp and b/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp differ diff --git a/data/src/main/java/com/whyranoid/data/datasource/account/AccountDataSourceImpl.kt b/data/src/main/java/com/whyranoid/data/datasource/account/AccountDataSourceImpl.kt index 8d444385..b31564c4 100644 --- a/data/src/main/java/com/whyranoid/data/datasource/account/AccountDataSourceImpl.kt +++ b/data/src/main/java/com/whyranoid/data/datasource/account/AccountDataSourceImpl.kt @@ -1,18 +1,30 @@ package com.whyranoid.data.datasource.account +import android.content.Context +import android.graphics.Bitmap +import android.graphics.BitmapFactory +import androidx.annotation.DrawableRes +import com.whyranoid.data.R import com.whyranoid.data.getResult -import com.whyranoid.data.model.account.SignUpRequest import com.whyranoid.data.model.account.toLoginData import com.whyranoid.data.model.account.toUserInfo import com.whyranoid.domain.datasource.AccountDataSource import com.whyranoid.domain.model.account.LoginData import com.whyranoid.domain.model.account.UserInfo +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.withContext import okhttp3.MediaType import okhttp3.MultipartBody import okhttp3.RequestBody import java.io.File +import java.io.FileOutputStream +import java.net.URL +import java.util.Locale -class AccountDataSourceImpl(private val accountService: AccountService) : AccountDataSource { +class AccountDataSourceImpl( + private val accountService: AccountService, + private val context: Context, +) : AccountDataSource { override suspend fun signUp( name: String, nickName: String, @@ -21,22 +33,35 @@ class AccountDataSourceImpl(private val accountService: AccountService) : Accoun agreeGps: Boolean, agreeMarketing: Boolean, ): Result { + val userNameBody = RequestBody.create(MediaType.parse("text/plain"), nickName) + val nameBody = RequestBody.create(MediaType.parse("text/plain"), name) + val authIdBody = RequestBody.create(MediaType.parse("text/plain"), authId) + val agreeGpsBody = RequestBody.create( + MediaType.parse("text/plain"), + agreeGps.toString().lowercase(Locale.ROOT) + ) + val agreeSubscriptionBody = RequestBody.create( + MediaType.parse("text/plain"), + agreeMarketing.toString().lowercase(Locale.ROOT) + ) + val profileImageBody = uploadImageFromUrl(profileUrl, "profileImg") + return kotlin.runCatching { - val request = SignUpRequest( - userName = nickName, - name = name, - profileImg = profileUrl ?: "", - authId = authId, - agreeGps = agreeGps, - agreeSubscription = agreeMarketing, + val response = accountService.signUp( + userNameBody, + nameBody, + profileImageBody, + authIdBody, + agreeGpsBody, + agreeSubscriptionBody ) - val response = accountService.signUp(request) - if (response.isSuccessful.not()) { throw Exception(response.errorBody().toString()) } else if (response.body() == null) throw Exception(response.message()) requireNotNull(response.body()?.walkieId?.toLong() ?: throw Exception("empty response")) + }.onFailure { + it.printStackTrace() } } @@ -59,7 +84,11 @@ class AccountDataSourceImpl(private val accountService: AccountService) : Accoun } } - override suspend fun changeMyInfo(walkieId: Long, nickName: String, profileUrl: String?): Result { + override suspend fun changeMyInfo( + walkieId: Long, + nickName: String, + profileUrl: String? + ): Result { return kotlin.runCatching { var imagePart: MultipartBody.Part? = null @@ -90,7 +119,77 @@ class AccountDataSourceImpl(private val accountService: AccountService) : Accoun override suspend fun leave(walkieId: Long): Result { return kotlin.runCatching { - accountService.leave(walkieId).getResult{ } + accountService.leave(walkieId).getResult { } } } + + private suspend fun uploadImageFromUrl( + imageUrl: String?, + partName: String + ): MultipartBody.Part { + return withContext(Dispatchers.IO) { + imageUrl?.let { url -> + makePartFromUrl(url, partName) + } ?: kotlin.run { + makePartFromRes(R.drawable.ic_walkie_logo, partName) + } + } + } + + private fun makePartFromRes( + @DrawableRes resId: Int, + partName: String + ): MultipartBody.Part { + val bitmap = BitmapFactory.decodeResource(context.resources, resId) + + // 임시 파일 생성 + val tempFile = File.createTempFile("drawable", ".png", context.cacheDir) + tempFile.deleteOnExit() + + // 비트맵을 PNG 파일로 저장 + val outputStream = FileOutputStream(tempFile) + bitmap.compress(Bitmap.CompressFormat.PNG, 100, outputStream) + outputStream.close() + + // MultipartBody.Part 생성 + val requestBody = RequestBody.create( + MediaType.parse("image/png"), + tempFile + ) + + return MultipartBody.Part.createFormData( + partName, // 서버에서 받을 파라미터 이름 + tempFile.name, + requestBody + ) + } + + private fun makePartFromUrl(url: String, partName: String): MultipartBody.Part { + // URL로부터 이미지 다운로드 + val connection = URL(url).openConnection() + val inputStream = connection.getInputStream() + + // 임시 파일 생성 + val tempFile = File.createTempFile("downloaded_image", ".jpg") + tempFile.deleteOnExit() + + // 입력 스트림을 파일로 저장 + inputStream.use { input -> + tempFile.outputStream().use { output -> + input.copyTo(output) + } + } + + // MultipartBody.Part 생성 + val requestBody = RequestBody.create( + MediaType.parse("image/jpg"), + tempFile + ) + + return MultipartBody.Part.createFormData( + partName, // 서버에서 받을 파라미터 이름 + tempFile.name, + requestBody + ) + } } diff --git a/data/src/main/java/com/whyranoid/data/datasource/account/AccountService.kt b/data/src/main/java/com/whyranoid/data/datasource/account/AccountService.kt index d8a21ec1..6262f3f2 100644 --- a/data/src/main/java/com/whyranoid/data/datasource/account/AccountService.kt +++ b/data/src/main/java/com/whyranoid/data/datasource/account/AccountService.kt @@ -5,14 +5,14 @@ import com.whyranoid.data.model.account.ChangeMyInfoResponse import com.whyranoid.data.model.account.LeaveResponse import com.whyranoid.data.model.account.LoginDataResponse import com.whyranoid.data.model.account.NickCheckResponse -import com.whyranoid.data.model.account.SignUpRequest import com.whyranoid.data.model.account.SignUpResponse import com.whyranoid.data.model.account.UserInfoResponse import okhttp3.MultipartBody +import okhttp3.RequestBody import retrofit2.Response -import retrofit2.http.Body import retrofit2.http.DELETE import retrofit2.http.GET +import retrofit2.http.Multipart import retrofit2.http.POST import retrofit2.http.Part import retrofit2.http.Query @@ -23,9 +23,15 @@ interface AccountService { @Query("userName") nickName: String, ): Response + @Multipart @POST(API.SIGN_UP) suspend fun signUp( - @Body signUpRequest: SignUpRequest, + @Part("userName") userName: RequestBody, + @Part("name") name: RequestBody, + @Part profileImg: MultipartBody.Part, + @Part("authId") authId: RequestBody, + @Part("agreeGps") agreeGps: RequestBody, + @Part("agreeSubscription") agreeSubscription: RequestBody, ): Response @GET(API.LOGIN) diff --git a/data/src/main/java/com/whyranoid/data/datasource/post/PostDataSourceImpl.kt b/data/src/main/java/com/whyranoid/data/datasource/post/PostDataSourceImpl.kt index 70af74b9..f52bdb67 100644 --- a/data/src/main/java/com/whyranoid/data/datasource/post/PostDataSourceImpl.kt +++ b/data/src/main/java/com/whyranoid/data/datasource/post/PostDataSourceImpl.kt @@ -109,7 +109,7 @@ class PostDataSourceImpl(private val postService: PostService) : PostDataSource override suspend fun getEveryPost(uid: Long): Result> { return kotlin.runCatching { - val posts = requireNotNull(postService.getPosts(uid).body()) + val posts = requireNotNull(postService.getEveryPosts(uid).body()) posts.map { it.toPost(uid) } } } diff --git a/data/src/main/java/com/whyranoid/data/repository/PostRepositoryImpl.kt b/data/src/main/java/com/whyranoid/data/repository/PostRepositoryImpl.kt index 213f2a64..ffe85e0b 100644 --- a/data/src/main/java/com/whyranoid/data/repository/PostRepositoryImpl.kt +++ b/data/src/main/java/com/whyranoid/data/repository/PostRepositoryImpl.kt @@ -58,7 +58,7 @@ class PostRepositoryImpl( } override suspend fun getEveryPost(uid: Long): Result> { - return postDataSource.getMyFollowingsPost(uid) + return postDataSource.getEveryPost(uid) } override suspend fun getComments(postId: Long): Result> { diff --git a/data/src/main/res/drawable/ic_walkie_logo.png b/data/src/main/res/drawable/ic_walkie_logo.png new file mode 100644 index 00000000..c26ba9d2 Binary files /dev/null and b/data/src/main/res/drawable/ic_walkie_logo.png differ diff --git a/presentation/src/main/java/com/whyranoid/presentation/screens/CommunityScreen.kt b/presentation/src/main/java/com/whyranoid/presentation/screens/CommunityScreen.kt index 41f8311c..06d6ee4c 100644 --- a/presentation/src/main/java/com/whyranoid/presentation/screens/CommunityScreen.kt +++ b/presentation/src/main/java/com/whyranoid/presentation/screens/CommunityScreen.kt @@ -36,6 +36,7 @@ import androidx.compose.ui.unit.sp import androidx.navigation.NavController import com.whyranoid.presentation.component.bar.WalkieTopBar import com.whyranoid.presentation.component.community.PostItem +import com.whyranoid.presentation.component.community.RunningFollowerItem import com.whyranoid.presentation.component.running.RunningFollowerItemWithLikable import com.whyranoid.presentation.theme.WalkieColor import com.whyranoid.presentation.theme.WalkieTypography @@ -119,6 +120,16 @@ fun CommunityScreen(navController: NavController) { modifier = Modifier.padding(it) ) { LazyRow { + state.myThumbnailState.getDataOrNull()?.let { myInfo -> + item { + RunningFollowerItem( + user = myInfo, + onClickProfile = { + navController.navigate(Screen.MyPage.route) + }, + ) + } + } state.runningFollowerState.getDataOrNull()?.let { (running, notRunning) -> items(running.size) { RunningFollowerItemWithLikable( diff --git a/presentation/src/main/java/com/whyranoid/presentation/screens/running/RunningScreen.kt b/presentation/src/main/java/com/whyranoid/presentation/screens/running/RunningScreen.kt index 1e8bb9fa..56f30c70 100644 --- a/presentation/src/main/java/com/whyranoid/presentation/screens/running/RunningScreen.kt +++ b/presentation/src/main/java/com/whyranoid/presentation/screens/running/RunningScreen.kt @@ -15,8 +15,8 @@ import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.PaddingValues import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.fillMaxHeight -import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding @@ -42,15 +42,17 @@ import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableFloatStateOf import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember -import androidx.compose.runtime.rememberCoroutineScope import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.draw.clip import androidx.compose.ui.graphics.Color +import androidx.compose.ui.layout.onSizeChanged import androidx.compose.ui.platform.LocalContext +import androidx.compose.ui.platform.LocalDensity import androidx.compose.ui.platform.LocalLifecycleOwner import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.unit.dp @@ -91,7 +93,6 @@ import com.whyranoid.presentation.viewmodel.RunningViewModel.Companion.MAP_MAX_Z import com.whyranoid.presentation.viewmodel.RunningViewModel.Companion.MAP_MIN_ZOOM import com.whyranoid.runningdata.model.RunningFinishData import com.whyranoid.runningdata.model.RunningState -import kotlinx.coroutines.CoroutineScope import org.koin.androidx.compose.koinViewModel import org.orbitmvi.orbit.compose.collectAsState @@ -665,13 +666,15 @@ fun RunningInfoScreen( style = WalkieTypography.Body2, ) Text( - text = state.runningResultInfoState.getDataOrNull()?.steps?.let { it.toString() } - ?: state.runningInfoState.getDataOrNull()?.steps?.let { it.toString() } + text = state.runningResultInfoState.getDataOrNull()?.steps?.toString() + ?: state.runningInfoState.getDataOrNull()?.steps?.toString() ?: "0", style = WalkieTypography.Title, ) } } + + } } @@ -688,7 +691,8 @@ fun RunningBottomButton( ) { Box( modifier = Modifier - .fillMaxSize() + .fillMaxHeight() + .fillMaxWidth() .padding(bottom = 20.dp), contentAlignment = Alignment.BottomCenter, ) { @@ -739,32 +743,56 @@ fun RunningBottomButton( } is RunningState.Paused -> { - Row( - Modifier - .height(44.dp) - .wrapContentWidth() - .border( - width = 1.dp, - color = WalkieColor.GrayDefault, - shape = CircleShape, - ) - .clip(CircleShape) - .background(Color.White), - ) { - IconButton(modifier = modifier, onClick = { onResumeRunning() }) { - Icon( - Icons.Default.PlayArrow, - contentDescription = "", - modifier = Modifier.size(20.dp), + var buttonsWidth by remember { mutableFloatStateOf(0f) } + + Column { + Row( + Modifier + .height(32.dp) + .width(with(LocalDensity.current) { buttonsWidth.toDp() }) + .clip(RoundedCornerShape(12.dp)) + .background(WalkieColor.GrayBlack), + verticalAlignment = Alignment.CenterVertically, + horizontalArrangement = Arrangement.Center + ) { + Text( + text = "잠시 런닝을 중단합니다", + style = WalkieTypography.Body2.copy(color = WalkieColor.PrimarySurface) ) } - IconButton(modifier = modifier, onClick = { onFinishRunning() }) { - Icon( - Icons.Default.Stop, - contentDescription = "", - tint = WalkieColor.Primary, - modifier = Modifier.size(20.dp), - ) + + Spacer(modifier = Modifier.height(6.dp)) + + Row( + Modifier + .height(44.dp) + .wrapContentWidth() + .border( + width = 1.dp, + color = WalkieColor.GrayDefault, + shape = CircleShape, + ) + .clip(CircleShape) + .background(Color.White) + .onSizeChanged { + buttonsWidth = it.width.toFloat() + }, + ) { + IconButton(modifier = modifier, onClick = { onResumeRunning() }) { + Icon( + Icons.Default.PlayArrow, + contentDescription = "", + modifier = Modifier.size(20.dp), + ) + } + IconButton(modifier = modifier, onClick = { onFinishRunning() }) { + Icon( + Icons.Default.Stop, + contentDescription = "", + tint = WalkieColor.Primary, + modifier = Modifier.size(20.dp), + ) + } } } } diff --git a/presentation/src/main/java/com/whyranoid/presentation/screens/signin/SignInDoneScreen.kt b/presentation/src/main/java/com/whyranoid/presentation/screens/signin/SignInDoneScreen.kt index 6c15716c..8090d59c 100644 --- a/presentation/src/main/java/com/whyranoid/presentation/screens/signin/SignInDoneScreen.kt +++ b/presentation/src/main/java/com/whyranoid/presentation/screens/signin/SignInDoneScreen.kt @@ -7,6 +7,7 @@ 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.layout.systemBarsPadding import androidx.compose.foundation.layout.wrapContentHeight import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.material.Button @@ -33,7 +34,10 @@ fun SignInDoneScreen(onSuccess: () -> Unit) { Surface(modifier = Modifier.background(Color.White)) { Column( - Modifier.fillMaxSize().padding(20.dp), + Modifier + .fillMaxSize() + .systemBarsPadding() + .padding(20.dp), horizontalAlignment = Alignment.Start, ) { Text( @@ -44,7 +48,9 @@ fun SignInDoneScreen(onSuccess: () -> Unit) { Text("워키와 건강한 라이프 함께해요!", style = WalkieTypography.Body1_Normal) Spacer(modifier = Modifier.weight(1f)) Button( - modifier = Modifier.fillMaxWidth().wrapContentHeight(), + modifier = Modifier + .fillMaxWidth() + .wrapContentHeight(), onClick = { onSuccess() }, diff --git a/presentation/src/main/java/com/whyranoid/presentation/theme/Color.kt b/presentation/src/main/java/com/whyranoid/presentation/theme/Color.kt index ceb15821..7a4a1a54 100644 --- a/presentation/src/main/java/com/whyranoid/presentation/theme/Color.kt +++ b/presentation/src/main/java/com/whyranoid/presentation/theme/Color.kt @@ -14,6 +14,7 @@ object WalkieColor { val GrayDefault = Color(0xFFD9D9D9) val GrayBorder = Color(0xFFB9BBB8) val GrayStatusBar = Color(0xFFB4B4B4) + val GrayBlack = Color(0xFF333333) } object SystemColor { diff --git a/presentation/src/main/java/com/whyranoid/presentation/viewmodel/CommunityScreenViewModel.kt b/presentation/src/main/java/com/whyranoid/presentation/viewmodel/CommunityScreenViewModel.kt index daf2a353..0da34af4 100644 --- a/presentation/src/main/java/com/whyranoid/presentation/viewmodel/CommunityScreenViewModel.kt +++ b/presentation/src/main/java/com/whyranoid/presentation/viewmodel/CommunityScreenViewModel.kt @@ -6,6 +6,8 @@ import com.whyranoid.domain.model.post.Post import com.whyranoid.domain.model.user.User import com.whyranoid.domain.usecase.GetFollowingsPostsUseCase import com.whyranoid.domain.usecase.GetMyFollowingUseCase +import com.whyranoid.domain.usecase.GetMyUidUseCase +import com.whyranoid.domain.usecase.GetUserUseCase import com.whyranoid.domain.usecase.LikePostUseCase import com.whyranoid.domain.usecase.running.GetRunningFollowerUseCase import com.whyranoid.domain.usecase.running.SendLikeUseCase @@ -25,6 +27,7 @@ data class CommunityScreenState( val following: UiState> = UiState.Idle, val isEveryPost: UiState = UiState.Success(true), val runningFollowerState: UiState, List>> = UiState.Idle, + val myThumbnailState: UiState = UiState.Idle, ) class CommunityScreenViewModel( @@ -33,6 +36,8 @@ class CommunityScreenViewModel( private val likePostUseCase: LikePostUseCase, private val sendLikeUseCase: SendLikeUseCase, private val getRunningFollowerUseCase: GetRunningFollowerUseCase, + private val getMyUidUseCase: GetMyUidUseCase, + private val getUserUseCase: GetUserUseCase, ) : ViewModel(), ContainerHost { override val container = @@ -49,6 +54,15 @@ class CommunityScreenViewModel( } } } + intent { + val myUid = getMyUidUseCase().getOrThrow() + val user = getUserUseCase(myUid).getOrThrow() + reduce { + state.copy( + myThumbnailState = UiState.Success(user) + ) + } + } getPosts() }