From d1d6f5a47428a5467c65075e7891cb6bbb7c6eff Mon Sep 17 00:00:00 2001 From: sunghyun Date: Tue, 15 Sep 2026 09:45:40 +0900 Subject: [PATCH 1/3] =?UTF-8?q?:bug:=20=EB=82=B4=20=ED=83=80=EC=9E=84?= =?UTF-8?q?=EC=BA=A1=EC=8A=90=20=EC=A1=B0=ED=9A=8C=20API=20=EB=B3=80?= =?UTF-8?q?=EA=B2=BD=20=EB=B0=98=EC=98=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../model/timecapsule/MyTimeCapsuleResponse.kt | 9 +++++++++ .../com/idiotfrogs/network/service/TimeCapsuleService.kt | 4 ++-- .../datasource/timecapsule/TimeCapsuleDataSourceImpl.kt | 2 +- 3 files changed, 12 insertions(+), 3 deletions(-) diff --git a/core/model/src/main/java/com/idiotfrogs/model/timecapsule/MyTimeCapsuleResponse.kt b/core/model/src/main/java/com/idiotfrogs/model/timecapsule/MyTimeCapsuleResponse.kt index 3bda5085..411e6dc7 100644 --- a/core/model/src/main/java/com/idiotfrogs/model/timecapsule/MyTimeCapsuleResponse.kt +++ b/core/model/src/main/java/com/idiotfrogs/model/timecapsule/MyTimeCapsuleResponse.kt @@ -3,6 +3,15 @@ package com.idiotfrogs.model.timecapsule import kotlinx.datetime.LocalDate import kotlinx.serialization.Serializable +@Serializable +data class MyTimeCapsuleListResponse( + val content: List, + val totalPages: Int, + val totalElements: Int, + val number: Int, + val last: Boolean, +) + @Serializable data class MyTimeCapsuleResponse( val timeCapsuleId: Long, diff --git a/core/network/src/main/java/com/idiotfrogs/network/service/TimeCapsuleService.kt b/core/network/src/main/java/com/idiotfrogs/network/service/TimeCapsuleService.kt index 026f1e8e..2a262cda 100644 --- a/core/network/src/main/java/com/idiotfrogs/network/service/TimeCapsuleService.kt +++ b/core/network/src/main/java/com/idiotfrogs/network/service/TimeCapsuleService.kt @@ -3,7 +3,7 @@ package com.idiotfrogs.network.service import com.idiotfrogs.model.timecapsule.BuryTimeCapsuleRequest import com.idiotfrogs.model.timecapsule.CapsuleContentsData import com.idiotfrogs.model.timecapsule.MyCapsuleContentsData -import com.idiotfrogs.model.timecapsule.MyTimeCapsuleResponse +import com.idiotfrogs.model.timecapsule.MyTimeCapsuleListResponse import com.idiotfrogs.model.timecapsule.PendingCollaboratorsRequest import com.idiotfrogs.model.timecapsule.TimeCapsuleCollaboratorsResponse import com.idiotfrogs.model.timecapsule.TimeCapsuleContentResponse @@ -34,7 +34,7 @@ interface TimeCapsuleService { ): TimeCapsuleCreateResponse @GET("time-capsules/my") - suspend fun getMyTimeCapsule(): List + suspend fun getMyTimeCapsule(@Query("size") size: Int): MyTimeCapsuleListResponse @DELETE("time-capsules/{capsuleId}") suspend fun deleteTimeCapsule(@Path("capsuleId") capsuleId: Long) diff --git a/data/src/main/java/com/idiotfrogs/data/datasource/timecapsule/TimeCapsuleDataSourceImpl.kt b/data/src/main/java/com/idiotfrogs/data/datasource/timecapsule/TimeCapsuleDataSourceImpl.kt index 2358ea92..de16ce0f 100644 --- a/data/src/main/java/com/idiotfrogs/data/datasource/timecapsule/TimeCapsuleDataSourceImpl.kt +++ b/data/src/main/java/com/idiotfrogs/data/datasource/timecapsule/TimeCapsuleDataSourceImpl.kt @@ -31,7 +31,7 @@ class TimeCapsuleDataSourceImpl @Inject constructor( } override suspend fun getMyTimeCapsule(): List { - return timeCapsuleService.getMyTimeCapsule() + return timeCapsuleService.getMyTimeCapsule(size = 6).content } override suspend fun deleteTimeCapsule(capsuleId: Long) { From f4e8619cce66e388cfeb0cdbffd27624c94fec4b Mon Sep 17 00:00:00 2001 From: sunghyun Date: Tue, 15 Sep 2026 09:45:58 +0900 Subject: [PATCH 2/3] =?UTF-8?q?:bug:=20=EC=B0=B8=EC=97=AC=20API=20?= =?UTF-8?q?=EC=9D=91=EB=8B=B5=20=EB=B0=98=EC=98=81=20=EB=B0=8F=20=EC=B0=B8?= =?UTF-8?q?=EC=97=AC=20=EC=99=84=EB=A3=8C=20=ED=9B=84=20=EC=83=81=EC=84=B8?= =?UTF-8?q?=20=EC=9D=B4=EB=8F=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../idiotfrogs/model/timecapsule/JoinRequestResponse.kt | 8 ++++++++ .../com/idiotfrogs/network/service/TimeCapsuleService.kt | 3 ++- .../data/datasource/timecapsule/TimeCapsuleDataSource.kt | 3 ++- .../datasource/timecapsule/TimeCapsuleDataSourceImpl.kt | 5 +++-- .../data/repository/timecapsule/TimeCapsuleRepository.kt | 3 ++- .../repository/timecapsule/TimeCapsuleRepositoryImpl.kt | 3 ++- .../usecase/timecapsule/RequestCollaboratorUseCase.kt | 3 ++- .../src/main/java/com/idiotfrogs/home/HomeViewModel.kt | 2 +- 8 files changed, 22 insertions(+), 8 deletions(-) create mode 100644 core/model/src/main/java/com/idiotfrogs/model/timecapsule/JoinRequestResponse.kt diff --git a/core/model/src/main/java/com/idiotfrogs/model/timecapsule/JoinRequestResponse.kt b/core/model/src/main/java/com/idiotfrogs/model/timecapsule/JoinRequestResponse.kt new file mode 100644 index 00000000..9135865d --- /dev/null +++ b/core/model/src/main/java/com/idiotfrogs/model/timecapsule/JoinRequestResponse.kt @@ -0,0 +1,8 @@ +package com.idiotfrogs.model.timecapsule + +import kotlinx.serialization.Serializable + +@Serializable +data class JoinRequestResponse( + val capsuleId: Long, +) diff --git a/core/network/src/main/java/com/idiotfrogs/network/service/TimeCapsuleService.kt b/core/network/src/main/java/com/idiotfrogs/network/service/TimeCapsuleService.kt index 2a262cda..64d68374 100644 --- a/core/network/src/main/java/com/idiotfrogs/network/service/TimeCapsuleService.kt +++ b/core/network/src/main/java/com/idiotfrogs/network/service/TimeCapsuleService.kt @@ -2,6 +2,7 @@ package com.idiotfrogs.network.service import com.idiotfrogs.model.timecapsule.BuryTimeCapsuleRequest import com.idiotfrogs.model.timecapsule.CapsuleContentsData +import com.idiotfrogs.model.timecapsule.JoinRequestResponse import com.idiotfrogs.model.timecapsule.MyCapsuleContentsData import com.idiotfrogs.model.timecapsule.MyTimeCapsuleListResponse import com.idiotfrogs.model.timecapsule.PendingCollaboratorsRequest @@ -56,7 +57,7 @@ interface TimeCapsuleService { suspend fun joinTimeCapsule(@Path("capsuleId") capsuleId: Long): TimeCapsuleResponse @POST("time-capsules/join-request") - suspend fun requestCollaborator(@Body body: PendingCollaboratorsRequest) + suspend fun requestCollaborator(@Body body: PendingCollaboratorsRequest): JoinRequestResponse @PUT("time-capsules/{capsuleId}/bury") suspend fun buryTimeCapsule( diff --git a/data/src/main/java/com/idiotfrogs/data/datasource/timecapsule/TimeCapsuleDataSource.kt b/data/src/main/java/com/idiotfrogs/data/datasource/timecapsule/TimeCapsuleDataSource.kt index 4b03700f..0172f61c 100644 --- a/data/src/main/java/com/idiotfrogs/data/datasource/timecapsule/TimeCapsuleDataSource.kt +++ b/data/src/main/java/com/idiotfrogs/data/datasource/timecapsule/TimeCapsuleDataSource.kt @@ -2,6 +2,7 @@ package com.idiotfrogs.data.datasource.timecapsule import com.idiotfrogs.model.timecapsule.BuryTimeCapsuleRequest import com.idiotfrogs.model.timecapsule.CapsuleContentsData +import com.idiotfrogs.model.timecapsule.JoinRequestResponse import com.idiotfrogs.model.timecapsule.MyCapsuleContentsData import com.idiotfrogs.model.timecapsule.MyTimeCapsuleResponse import com.idiotfrogs.model.timecapsule.PendingCollaboratorsRequest @@ -37,7 +38,7 @@ interface TimeCapsuleDataSource { suspend fun joinTimeCapsule(capsuleId: Long): TimeCapsuleResponse - suspend fun requestCollaborator(body: PendingCollaboratorsRequest) + suspend fun requestCollaborator(body: PendingCollaboratorsRequest): JoinRequestResponse suspend fun buryTimeCapsule( capsuleId: Long, diff --git a/data/src/main/java/com/idiotfrogs/data/datasource/timecapsule/TimeCapsuleDataSourceImpl.kt b/data/src/main/java/com/idiotfrogs/data/datasource/timecapsule/TimeCapsuleDataSourceImpl.kt index de16ce0f..21c61dbe 100644 --- a/data/src/main/java/com/idiotfrogs/data/datasource/timecapsule/TimeCapsuleDataSourceImpl.kt +++ b/data/src/main/java/com/idiotfrogs/data/datasource/timecapsule/TimeCapsuleDataSourceImpl.kt @@ -2,6 +2,7 @@ package com.idiotfrogs.data.datasource.timecapsule import com.idiotfrogs.model.timecapsule.BuryTimeCapsuleRequest import com.idiotfrogs.model.timecapsule.CapsuleContentsData +import com.idiotfrogs.model.timecapsule.JoinRequestResponse import com.idiotfrogs.model.timecapsule.MyCapsuleContentsData import com.idiotfrogs.model.timecapsule.MyTimeCapsuleResponse import com.idiotfrogs.model.timecapsule.PendingCollaboratorsRequest @@ -58,7 +59,7 @@ class TimeCapsuleDataSourceImpl @Inject constructor( return timeCapsuleService.joinTimeCapsule(capsuleId) } - override suspend fun requestCollaborator(body: PendingCollaboratorsRequest) { + override suspend fun requestCollaborator(body: PendingCollaboratorsRequest): JoinRequestResponse { return timeCapsuleService.requestCollaborator(body) } @@ -166,4 +167,4 @@ class TimeCapsuleDataSourceImpl @Inject constructor( override suspend fun watering(capsuleId: Long) { return timeCapsuleService.watering(capsuleId) } -} +} \ No newline at end of file diff --git a/data/src/main/java/com/idiotfrogs/data/repository/timecapsule/TimeCapsuleRepository.kt b/data/src/main/java/com/idiotfrogs/data/repository/timecapsule/TimeCapsuleRepository.kt index 129921d4..33b8e15c 100644 --- a/data/src/main/java/com/idiotfrogs/data/repository/timecapsule/TimeCapsuleRepository.kt +++ b/data/src/main/java/com/idiotfrogs/data/repository/timecapsule/TimeCapsuleRepository.kt @@ -2,6 +2,7 @@ package com.idiotfrogs.data.repository.timecapsule import com.idiotfrogs.model.timecapsule.BuryTimeCapsuleRequest import com.idiotfrogs.model.timecapsule.CapsuleContentsData +import com.idiotfrogs.model.timecapsule.JoinRequestResponse import com.idiotfrogs.model.timecapsule.MyTimeCapsuleResponse import com.idiotfrogs.model.timecapsule.MyCapsuleContentsData import com.idiotfrogs.model.timecapsule.PendingCollaboratorsRequest @@ -36,7 +37,7 @@ interface TimeCapsuleRepository { suspend fun joinTimeCapsule(capsuleId: Long): TimeCapsuleResponse - suspend fun requestCollaborator(body: PendingCollaboratorsRequest) + suspend fun requestCollaborator(body: PendingCollaboratorsRequest): JoinRequestResponse suspend fun buryTimeCapsule( capsuleId: Long, diff --git a/data/src/main/java/com/idiotfrogs/data/repository/timecapsule/TimeCapsuleRepositoryImpl.kt b/data/src/main/java/com/idiotfrogs/data/repository/timecapsule/TimeCapsuleRepositoryImpl.kt index 4594a8d5..6f7c0732 100644 --- a/data/src/main/java/com/idiotfrogs/data/repository/timecapsule/TimeCapsuleRepositoryImpl.kt +++ b/data/src/main/java/com/idiotfrogs/data/repository/timecapsule/TimeCapsuleRepositoryImpl.kt @@ -3,6 +3,7 @@ package com.idiotfrogs.data.repository.timecapsule import com.idiotfrogs.data.datasource.timecapsule.TimeCapsuleDataSource import com.idiotfrogs.model.timecapsule.BuryTimeCapsuleRequest import com.idiotfrogs.model.timecapsule.CapsuleContentsData +import com.idiotfrogs.model.timecapsule.JoinRequestResponse import com.idiotfrogs.model.timecapsule.MyTimeCapsuleResponse import com.idiotfrogs.model.timecapsule.MyCapsuleContentsData import com.idiotfrogs.model.timecapsule.PendingCollaboratorsRequest @@ -74,7 +75,7 @@ class TimeCapsuleRepositoryImpl @Inject constructor( } } - override suspend fun requestCollaborator(body: PendingCollaboratorsRequest) { + override suspend fun requestCollaborator(body: PendingCollaboratorsRequest): JoinRequestResponse { return timeCapsuleDataSource.requestCollaborator(body) } diff --git a/domain/src/main/java/com/idiotfrogs/domain/usecase/timecapsule/RequestCollaboratorUseCase.kt b/domain/src/main/java/com/idiotfrogs/domain/usecase/timecapsule/RequestCollaboratorUseCase.kt index 976109f6..01039864 100644 --- a/domain/src/main/java/com/idiotfrogs/domain/usecase/timecapsule/RequestCollaboratorUseCase.kt +++ b/domain/src/main/java/com/idiotfrogs/domain/usecase/timecapsule/RequestCollaboratorUseCase.kt @@ -1,6 +1,7 @@ package com.idiotfrogs.domain.usecase.timecapsule import com.idiotfrogs.data.repository.timecapsule.TimeCapsuleRepository +import com.idiotfrogs.model.timecapsule.JoinRequestResponse import com.idiotfrogs.model.timecapsule.PendingCollaboratorsRequest import com.idiotfrogs.util.safeCatching import javax.inject.Inject @@ -8,7 +9,7 @@ import javax.inject.Inject class RequestCollaboratorUseCase @Inject constructor( private val timeCapsuleRepository: TimeCapsuleRepository ) { - suspend operator fun invoke(body: PendingCollaboratorsRequest): Result = safeCatching { + suspend operator fun invoke(body: PendingCollaboratorsRequest): Result = safeCatching { timeCapsuleRepository.requestCollaborator(body) } } \ No newline at end of file diff --git a/feature/home/src/main/java/com/idiotfrogs/home/HomeViewModel.kt b/feature/home/src/main/java/com/idiotfrogs/home/HomeViewModel.kt index cd8975df..24f93755 100644 --- a/feature/home/src/main/java/com/idiotfrogs/home/HomeViewModel.kt +++ b/feature/home/src/main/java/com/idiotfrogs/home/HomeViewModel.kt @@ -86,7 +86,7 @@ class HomeViewModel @Inject constructor( requestCollaboratorUseCase(body).onSuccess { intent { reduce { state.copy(isLoading = false, errorMessage = null) } - postSideEffect(HomeSideEffect.ShowToast) + postSideEffect(HomeSideEffect.NavigateToDetail(it.capsuleId)) fetchHome() } }.onFailure { From d830c47381f4d34d95d0948fe5d44c855b6f30da Mon Sep 17 00:00:00 2001 From: sunghyun Date: Tue, 15 Sep 2026 09:46:25 +0900 Subject: [PATCH 3/3] =?UTF-8?q?:lipstick:=20=EC=83=81=EC=84=B8=20=EB=A9=A4?= =?UTF-8?q?=EB=B2=84=20=EB=AA=A9=EB=A1=9D=20=EB=84=88=EB=B9=84=EC=97=90=20?= =?UTF-8?q?=EB=94=B0=EB=A5=B8=206=EC=97=B4=20=EB=B0=B0=EC=B9=98=20?= =?UTF-8?q?=EC=A0=81=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/idiotfrogs/detail/DetailScreen.kt | 75 +++++++++---------- 1 file changed, 37 insertions(+), 38 deletions(-) diff --git a/feature/detail/src/main/java/com/idiotfrogs/detail/DetailScreen.kt b/feature/detail/src/main/java/com/idiotfrogs/detail/DetailScreen.kt index 4c68dfc2..6b9891d6 100644 --- a/feature/detail/src/main/java/com/idiotfrogs/detail/DetailScreen.kt +++ b/feature/detail/src/main/java/com/idiotfrogs/detail/DetailScreen.kt @@ -4,6 +4,7 @@ import androidx.compose.foundation.Image import androidx.compose.foundation.background import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.BoxWithConstraints import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.FlowRow import androidx.compose.foundation.layout.PaddingValues @@ -587,48 +588,46 @@ fun DetailScreen( Spacer(Modifier.height(20.dp)) - FlowRow( - horizontalArrangement = Arrangement.spacedBy(8.dp), - verticalArrangement = Arrangement.spacedBy(8.dp), - ) { - visibleCollaborators.forEach { collaborator -> - GlideImage( - modifier = Modifier - .size(48.dp) - .wavyStroke( - color = MSTheme.color.greyG5, - fillColor = MSTheme.color.white, - strokeWidth = 3.dp, - cornerRadius = 24.dp, - amplitude = 1.dp, - spacing = 2.dp, - clipContent = true, - ), - imageModel = { collaborator.profileImageUrl }, + BoxWithConstraints(modifier = Modifier.fillMaxWidth()) { + val columnCount = 6 + val gap = 8.dp + val cellSize = (maxWidth - gap * (columnCount - 1)) / columnCount + val avatarModifier = Modifier + .size(cellSize) + .wavyStroke( + color = MSTheme.color.greyG5, + fillColor = MSTheme.color.white, + strokeWidth = 3.dp, + cornerRadius = cellSize / 2, + amplitude = 1.dp, + spacing = 2.dp, + clipContent = true, ) - } - if (hiddenCollaboratorCount > 0) { - Box( - modifier = Modifier - .size(48.dp) - .wavyStroke( - color = MSTheme.color.greyG5, - fillColor = MSTheme.color.white, - strokeWidth = 3.dp, - cornerRadius = 24.dp, - amplitude = 1.dp, - spacing = 2.dp, - clipContent = true, - ), - contentAlignment = Alignment.Center, - ) { - MSText( - text = "+$hiddenCollaboratorCount", - fontWeight = FontWeight.Medium, - color = Color(0xFF0B0B0B), + FlowRow( + maxItemsInEachRow = columnCount, + horizontalArrangement = Arrangement.spacedBy(gap), + verticalArrangement = Arrangement.spacedBy(gap), + ) { + visibleCollaborators.forEach { collaborator -> + GlideImage( + modifier = avatarModifier, + imageModel = { collaborator.profileImageUrl }, ) } + + if (hiddenCollaboratorCount > 0) { + Box( + modifier = avatarModifier, + contentAlignment = Alignment.Center, + ) { + MSText( + text = "+$hiddenCollaboratorCount", + fontWeight = FontWeight.Medium, + color = Color(0xFF0B0B0B), + ) + } + } } } }