From 7205f2b9b5196ff381a0c08e8d77cf16c6d20400 Mon Sep 17 00:00:00 2001 From: ChoiJinWoo Date: Tue, 26 Aug 2025 00:58:46 +0900 Subject: [PATCH 01/13] =?UTF-8?q?feat:=20OPS-116=20=EB=8D=94=EC=B9=98?= =?UTF-8?q?=ED=8E=98=EC=9D=B4=20=EC=9A=94=EC=B2=AD=20=EC=88=98=EC=8B=A0=20?= =?UTF-8?q?=ED=99=94=EB=A9=B4=20=EA=B5=AC=ED=98=84=20-=20=EB=94=A5?= =?UTF-8?q?=EB=A7=81=ED=81=AC=EB=A1=9C=20=ED=91=B8=EC=8B=9C=20=EC=95=8C?= =?UTF-8?q?=EB=A6=BC=20=ED=81=B4=EB=A6=AD=20=EC=8B=9C=20=ED=95=B4=EB=8B=B9?= =?UTF-8?q?=20=ED=99=94=EB=A9=B4=EC=9C=BC=EB=A1=9C=20=EC=9D=B4=EB=8F=99?= =?UTF-8?q?=ED=95=98=EA=B2=8C=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/AndroidManifest.xml | 12 + .../java/com/ssafy/tiggle/MainActivity.kt | 33 +- .../tiggle/core/fcm/TiggleMessageService.kt | 5 + .../data/datasource/remote/AuthApiService.kt | 4 +- .../datasource/remote/DutchPayApiService.kt | 8 + .../datasource/remote/UniversityApiService.kt | 4 +- .../data/datasource/remote/UserApiService.kt | 2 +- .../{ => auth/request}/LoginRequestDto.kt | 4 +- .../{ => auth/request}/SignUpRequestDto.kt | 4 +- .../{ => auth/response}/DepartmentDto.kt | 4 +- .../{ => auth/response}/UniversityDto.kt | 4 +- .../data/model/{ => auth/response}/UserDto.kt | 6 +- .../dutchpay/request/DutchPayRequestDto.kt | 2 +- .../DutchPayRequestDetailResponseDto.kt | 16 + .../{ => dutchpay/response}/UserSummaryDto.kt | 6 +- .../data/repository/AuthRepositoryImpl.kt | 4 +- .../data/repository/DutchPayRepositoryImpl.kt | 38 +- .../entity/dutchpay/DutchPayRequestDetail.kt | 16 + .../domain/repository/DutchPayRepository.kt | 2 + .../GetDutchPayRequestDetailUseCase.kt | 13 + .../navigation/NavigationGraph.kt | 39 +- .../tiggle/presentation/navigation/Screen.kt | 3 + .../dutchpay/DutchPayRequestDetailUiState.kt | 9 + .../DutchPayRequestDetailViewModel.kt | 50 +++ .../ui/dutchpay/DutchpayRecieveScreen.kt | 365 ++++++++++++++++++ 25 files changed, 619 insertions(+), 34 deletions(-) rename app/src/main/java/com/ssafy/tiggle/data/model/{ => auth/request}/LoginRequestDto.kt (60%) rename app/src/main/java/com/ssafy/tiggle/data/model/{ => auth/request}/SignUpRequestDto.kt (83%) rename app/src/main/java/com/ssafy/tiggle/data/model/{ => auth/response}/DepartmentDto.kt (88%) rename app/src/main/java/com/ssafy/tiggle/data/model/{ => auth/response}/UniversityDto.kt (88%) rename app/src/main/java/com/ssafy/tiggle/data/model/{ => auth/response}/UserDto.kt (93%) create mode 100644 app/src/main/java/com/ssafy/tiggle/data/model/dutchpay/response/DutchPayRequestDetailResponseDto.kt rename app/src/main/java/com/ssafy/tiggle/data/model/{ => dutchpay/response}/UserSummaryDto.kt (82%) create mode 100644 app/src/main/java/com/ssafy/tiggle/domain/entity/dutchpay/DutchPayRequestDetail.kt create mode 100644 app/src/main/java/com/ssafy/tiggle/domain/usecase/dutchpay/GetDutchPayRequestDetailUseCase.kt create mode 100644 app/src/main/java/com/ssafy/tiggle/presentation/ui/dutchpay/DutchPayRequestDetailUiState.kt create mode 100644 app/src/main/java/com/ssafy/tiggle/presentation/ui/dutchpay/DutchPayRequestDetailViewModel.kt create mode 100644 app/src/main/java/com/ssafy/tiggle/presentation/ui/dutchpay/DutchpayRecieveScreen.kt diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 482163d..9392e74 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -31,12 +31,24 @@ android:name=".MainActivity" android:exported="true" android:label="@string/app_name" + android:launchMode="singleTop" android:theme="@style/Theme.Tiggle"> + + + + + + + + + diff --git a/app/src/main/java/com/ssafy/tiggle/MainActivity.kt b/app/src/main/java/com/ssafy/tiggle/MainActivity.kt index 9cf31dd..689bb38 100644 --- a/app/src/main/java/com/ssafy/tiggle/MainActivity.kt +++ b/app/src/main/java/com/ssafy/tiggle/MainActivity.kt @@ -14,14 +14,15 @@ import androidx.activity.enableEdgeToEdge import androidx.activity.result.contract.ActivityResultContracts import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect +import androidx.compose.runtime.getValue import androidx.compose.ui.platform.LocalContext import androidx.core.app.NotificationManagerCompat import androidx.core.content.ContextCompat -import com.google.firebase.messaging.FirebaseMessaging - +import androidx.lifecycle.compose.collectAsStateWithLifecycle import com.ssafy.tiggle.presentation.navigation.NavigationGraph import com.ssafy.tiggle.presentation.ui.theme.TiggleTheme import dagger.hilt.android.AndroidEntryPoint +import kotlinx.coroutines.flow.MutableStateFlow /** * 메인 액티비티 @@ -29,13 +30,17 @@ import dagger.hilt.android.AndroidEntryPoint */ @AndroidEntryPoint class MainActivity : ComponentActivity() { + // 1. 딥링크 Intent를 담을 StateFlow 생성 + private val deepLinkIntent = MutableStateFlow(null) + + override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) enableEdgeToEdge() - - // ✅ 디버그용: 현재 기기의 FCM 토큰 로그로 확인 - FirebaseMessaging.getInstance().token.addOnSuccessListener { - Log.d("TiggleFCM", "FCM token = $it") + + // 2. 앱 시작 시 초기 Intent가 딥링크를 포함하는지 확인 + if (intent?.data != null) { + deepLinkIntent.value = intent } setContent { @@ -43,10 +48,24 @@ class MainActivity : ComponentActivity() { // ✅ Android 13+ 알림 권한 1회 요청 RequestPostNotificationsPermissionOnce() // ⬇️ 기존 네비게이션 - NavigationGraph() + val intentState by deepLinkIntent.collectAsStateWithLifecycle() + NavigationGraph( + intent = intentState, + // 6. 딥링크 처리가 완료되면 StateFlow를 null로 비워주는 콜백 전달 + onDeepLinkHandled = { deepLinkIntent.value = null } + ) } } } + + // 4. 앱이 백그라운드에 있을 때 새 Intent를 받는 부분 + override fun onNewIntent(intent: Intent) { + super.onNewIntent(intent) + // 5. 새로 받은 Intent로 StateFlow를 업데이트 -> Compose에 변경 사항 알림 + if (intent.data != null) { + deepLinkIntent.value = intent + } + } } /** Android 13+에서 POST_NOTIFICATIONS 권한 1회 요청 */ diff --git a/app/src/main/java/com/ssafy/tiggle/core/fcm/TiggleMessageService.kt b/app/src/main/java/com/ssafy/tiggle/core/fcm/TiggleMessageService.kt index 0ad2d40..b10732c 100644 --- a/app/src/main/java/com/ssafy/tiggle/core/fcm/TiggleMessageService.kt +++ b/app/src/main/java/com/ssafy/tiggle/core/fcm/TiggleMessageService.kt @@ -97,6 +97,11 @@ class TiggleMessagingService : FirebaseMessagingService() { val intent = Intent(this, MainActivity::class.java).apply { flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TOP + // 딥링크 정보를 Intent에 추가 + if (deepLink != null) { + // URI 형태로 설정하여 NavigationGraph에서 처리할 수 있도록 함 + data = android.net.Uri.parse(deepLink) + } } val pending = PendingIntent.getActivity( this, 0, intent, diff --git a/app/src/main/java/com/ssafy/tiggle/data/datasource/remote/AuthApiService.kt b/app/src/main/java/com/ssafy/tiggle/data/datasource/remote/AuthApiService.kt index 3acdb69..20258ff 100644 --- a/app/src/main/java/com/ssafy/tiggle/data/datasource/remote/AuthApiService.kt +++ b/app/src/main/java/com/ssafy/tiggle/data/datasource/remote/AuthApiService.kt @@ -1,8 +1,8 @@ package com.ssafy.tiggle.data.datasource.remote import com.ssafy.tiggle.data.model.BaseResponse -import com.ssafy.tiggle.data.model.LoginRequestDto -import com.ssafy.tiggle.data.model.SignUpRequestDto +import com.ssafy.tiggle.data.model.auth.request.LoginRequestDto +import com.ssafy.tiggle.data.model.auth.request.SignUpRequestDto import retrofit2.Response import retrofit2.http.Body import retrofit2.http.POST diff --git a/app/src/main/java/com/ssafy/tiggle/data/datasource/remote/DutchPayApiService.kt b/app/src/main/java/com/ssafy/tiggle/data/datasource/remote/DutchPayApiService.kt index 55bc137..0b9dd40 100644 --- a/app/src/main/java/com/ssafy/tiggle/data/datasource/remote/DutchPayApiService.kt +++ b/app/src/main/java/com/ssafy/tiggle/data/datasource/remote/DutchPayApiService.kt @@ -3,13 +3,21 @@ package com.ssafy.tiggle.data.datasource.remote import com.ssafy.tiggle.data.model.BaseResponse import com.ssafy.tiggle.data.model.EmptyResponse import com.ssafy.tiggle.data.model.dutchpay.request.DutchPayRequestDto +import com.ssafy.tiggle.data.model.dutchpay.response.DutchPayRequestDetailResponseDto import retrofit2.Response import retrofit2.http.Body +import retrofit2.http.GET import retrofit2.http.POST +import retrofit2.http.Path interface DutchPayApiService { @POST("/api/dutchpay/requests") suspend fun createDutchPayRequest( @Body request: DutchPayRequestDto ): Response> + + @GET("/api/dutchpay/{id}/detail") + suspend fun getDutchPayRequestDetail( + @Path("id") dutchPayId: Long + ): Response> } diff --git a/app/src/main/java/com/ssafy/tiggle/data/datasource/remote/UniversityApiService.kt b/app/src/main/java/com/ssafy/tiggle/data/datasource/remote/UniversityApiService.kt index e571946..4e4dedf 100644 --- a/app/src/main/java/com/ssafy/tiggle/data/datasource/remote/UniversityApiService.kt +++ b/app/src/main/java/com/ssafy/tiggle/data/datasource/remote/UniversityApiService.kt @@ -1,8 +1,8 @@ package com.ssafy.tiggle.data.datasource.remote import com.ssafy.tiggle.data.model.BaseResponse -import com.ssafy.tiggle.data.model.DepartmentDto -import com.ssafy.tiggle.data.model.UniversityDto +import com.ssafy.tiggle.data.model.auth.response.DepartmentDto +import com.ssafy.tiggle.data.model.auth.response.UniversityDto import retrofit2.Response import retrofit2.http.GET import retrofit2.http.Path diff --git a/app/src/main/java/com/ssafy/tiggle/data/datasource/remote/UserApiService.kt b/app/src/main/java/com/ssafy/tiggle/data/datasource/remote/UserApiService.kt index ce74042..5765282 100644 --- a/app/src/main/java/com/ssafy/tiggle/data/datasource/remote/UserApiService.kt +++ b/app/src/main/java/com/ssafy/tiggle/data/datasource/remote/UserApiService.kt @@ -1,7 +1,7 @@ package com.ssafy.tiggle.data.datasource.remote import com.ssafy.tiggle.data.model.BaseResponse -import com.ssafy.tiggle.data.model.UserSummaryDto +import com.ssafy.tiggle.data.model.dutchpay.response.UserSummaryDto import retrofit2.Response import retrofit2.http.GET diff --git a/app/src/main/java/com/ssafy/tiggle/data/model/LoginRequestDto.kt b/app/src/main/java/com/ssafy/tiggle/data/model/auth/request/LoginRequestDto.kt similarity index 60% rename from app/src/main/java/com/ssafy/tiggle/data/model/LoginRequestDto.kt rename to app/src/main/java/com/ssafy/tiggle/data/model/auth/request/LoginRequestDto.kt index 19fba05..8454409 100644 --- a/app/src/main/java/com/ssafy/tiggle/data/model/LoginRequestDto.kt +++ b/app/src/main/java/com/ssafy/tiggle/data/model/auth/request/LoginRequestDto.kt @@ -1,6 +1,6 @@ -package com.ssafy.tiggle.data.model +package com.ssafy.tiggle.data.model.auth.request data class LoginRequestDto( val email: String, val password: String -) +) \ No newline at end of file diff --git a/app/src/main/java/com/ssafy/tiggle/data/model/SignUpRequestDto.kt b/app/src/main/java/com/ssafy/tiggle/data/model/auth/request/SignUpRequestDto.kt similarity index 83% rename from app/src/main/java/com/ssafy/tiggle/data/model/SignUpRequestDto.kt rename to app/src/main/java/com/ssafy/tiggle/data/model/auth/request/SignUpRequestDto.kt index b0c070d..ab48f0f 100644 --- a/app/src/main/java/com/ssafy/tiggle/data/model/SignUpRequestDto.kt +++ b/app/src/main/java/com/ssafy/tiggle/data/model/auth/request/SignUpRequestDto.kt @@ -1,4 +1,4 @@ -package com.ssafy.tiggle.data.model +package com.ssafy.tiggle.data.model.auth.request /** * 회원가입 요청 DTO @@ -11,4 +11,4 @@ data class SignUpRequestDto( val studentId: String, val password: String, val phone: String -) +) \ No newline at end of file diff --git a/app/src/main/java/com/ssafy/tiggle/data/model/DepartmentDto.kt b/app/src/main/java/com/ssafy/tiggle/data/model/auth/response/DepartmentDto.kt similarity index 88% rename from app/src/main/java/com/ssafy/tiggle/data/model/DepartmentDto.kt rename to app/src/main/java/com/ssafy/tiggle/data/model/auth/response/DepartmentDto.kt index 2b52ea2..f815f22 100644 --- a/app/src/main/java/com/ssafy/tiggle/data/model/DepartmentDto.kt +++ b/app/src/main/java/com/ssafy/tiggle/data/model/auth/response/DepartmentDto.kt @@ -1,4 +1,4 @@ -package com.ssafy.tiggle.data.model +package com.ssafy.tiggle.data.model.auth.response import com.ssafy.tiggle.domain.entity.auth.Department @@ -20,4 +20,4 @@ data class DepartmentDto( name = name ) } -} +} \ No newline at end of file diff --git a/app/src/main/java/com/ssafy/tiggle/data/model/UniversityDto.kt b/app/src/main/java/com/ssafy/tiggle/data/model/auth/response/UniversityDto.kt similarity index 88% rename from app/src/main/java/com/ssafy/tiggle/data/model/UniversityDto.kt rename to app/src/main/java/com/ssafy/tiggle/data/model/auth/response/UniversityDto.kt index f3ba932..c1c19b0 100644 --- a/app/src/main/java/com/ssafy/tiggle/data/model/UniversityDto.kt +++ b/app/src/main/java/com/ssafy/tiggle/data/model/auth/response/UniversityDto.kt @@ -1,4 +1,4 @@ -package com.ssafy.tiggle.data.model +package com.ssafy.tiggle.data.model.auth.response import com.ssafy.tiggle.domain.entity.auth.University @@ -20,4 +20,4 @@ data class UniversityDto( name = name ) } -} +} \ No newline at end of file diff --git a/app/src/main/java/com/ssafy/tiggle/data/model/UserDto.kt b/app/src/main/java/com/ssafy/tiggle/data/model/auth/response/UserDto.kt similarity index 93% rename from app/src/main/java/com/ssafy/tiggle/data/model/UserDto.kt rename to app/src/main/java/com/ssafy/tiggle/data/model/auth/response/UserDto.kt index ea83444..97c18b7 100644 --- a/app/src/main/java/com/ssafy/tiggle/data/model/UserDto.kt +++ b/app/src/main/java/com/ssafy/tiggle/data/model/auth/response/UserDto.kt @@ -1,4 +1,4 @@ -package com.ssafy.tiggle.data.model +package com.ssafy.tiggle.data.model.auth.response import com.ssafy.tiggle.domain.entity.auth.User @@ -32,6 +32,4 @@ data class UserDto( updatedAt = updatedAt ) } -} - - +} \ No newline at end of file diff --git a/app/src/main/java/com/ssafy/tiggle/data/model/dutchpay/request/DutchPayRequestDto.kt b/app/src/main/java/com/ssafy/tiggle/data/model/dutchpay/request/DutchPayRequestDto.kt index a2dbc15..217347b 100644 --- a/app/src/main/java/com/ssafy/tiggle/data/model/dutchpay/request/DutchPayRequestDto.kt +++ b/app/src/main/java/com/ssafy/tiggle/data/model/dutchpay/request/DutchPayRequestDto.kt @@ -6,4 +6,4 @@ data class DutchPayRequestDto( val title: String, val message: String, val payMore: Boolean -) +) \ No newline at end of file diff --git a/app/src/main/java/com/ssafy/tiggle/data/model/dutchpay/response/DutchPayRequestDetailResponseDto.kt b/app/src/main/java/com/ssafy/tiggle/data/model/dutchpay/response/DutchPayRequestDetailResponseDto.kt new file mode 100644 index 0000000..b9373e5 --- /dev/null +++ b/app/src/main/java/com/ssafy/tiggle/data/model/dutchpay/response/DutchPayRequestDetailResponseDto.kt @@ -0,0 +1,16 @@ +package com.ssafy.tiggle.data.model.dutchpay.response + +data class DutchPayRequestDetailResponseDto( + val dutchpayId: Long, + val title: String, + val message: String, + val requesterName: String, + val participantCount: Int, + val totalAmount: Long, + val requestedAt: String, + val myAmount: Long, + val originalAmount: Long, + val tiggleAmount: Long, + val payMoreDefault: Boolean, + val creator: Boolean +) \ No newline at end of file diff --git a/app/src/main/java/com/ssafy/tiggle/data/model/UserSummaryDto.kt b/app/src/main/java/com/ssafy/tiggle/data/model/dutchpay/response/UserSummaryDto.kt similarity index 82% rename from app/src/main/java/com/ssafy/tiggle/data/model/UserSummaryDto.kt rename to app/src/main/java/com/ssafy/tiggle/data/model/dutchpay/response/UserSummaryDto.kt index dd65087..1a63e8f 100644 --- a/app/src/main/java/com/ssafy/tiggle/data/model/UserSummaryDto.kt +++ b/app/src/main/java/com/ssafy/tiggle/data/model/dutchpay/response/UserSummaryDto.kt @@ -1,4 +1,4 @@ -package com.ssafy.tiggle.data.model +package com.ssafy.tiggle.data.model.dutchpay.response import com.ssafy.tiggle.domain.entity.dutchpay.UserSummary @@ -13,6 +13,4 @@ data class UserSummaryDto( id = id, name = name ) -} - - +} \ No newline at end of file diff --git a/app/src/main/java/com/ssafy/tiggle/data/repository/AuthRepositoryImpl.kt b/app/src/main/java/com/ssafy/tiggle/data/repository/AuthRepositoryImpl.kt index b482ee3..c28d6c8 100644 --- a/app/src/main/java/com/ssafy/tiggle/data/repository/AuthRepositoryImpl.kt +++ b/app/src/main/java/com/ssafy/tiggle/data/repository/AuthRepositoryImpl.kt @@ -5,8 +5,8 @@ import com.google.gson.Gson import com.ssafy.tiggle.data.datasource.local.AuthDataSource import com.ssafy.tiggle.data.datasource.remote.AuthApiService import com.ssafy.tiggle.data.model.BaseResponse -import com.ssafy.tiggle.data.model.LoginRequestDto -import com.ssafy.tiggle.data.model.SignUpRequestDto +import com.ssafy.tiggle.data.model.auth.request.LoginRequestDto +import com.ssafy.tiggle.data.model.auth.request.SignUpRequestDto import com.ssafy.tiggle.domain.entity.auth.UserSignUp import com.ssafy.tiggle.domain.repository.AuthRepository import javax.inject.Inject diff --git a/app/src/main/java/com/ssafy/tiggle/data/repository/DutchPayRepositoryImpl.kt b/app/src/main/java/com/ssafy/tiggle/data/repository/DutchPayRepositoryImpl.kt index 66d94b8..074f678 100644 --- a/app/src/main/java/com/ssafy/tiggle/data/repository/DutchPayRepositoryImpl.kt +++ b/app/src/main/java/com/ssafy/tiggle/data/repository/DutchPayRepositoryImpl.kt @@ -3,6 +3,7 @@ package com.ssafy.tiggle.data.repository import com.ssafy.tiggle.data.datasource.remote.DutchPayApiService import com.ssafy.tiggle.data.model.dutchpay.request.DutchPayRequestDto import com.ssafy.tiggle.domain.entity.dutchpay.DutchPayRequest +import com.ssafy.tiggle.domain.entity.dutchpay.DutchPayRequestDetail import com.ssafy.tiggle.domain.repository.DutchPayRepository import javax.inject.Inject import javax.inject.Singleton @@ -21,9 +22,9 @@ class DutchPayRepositoryImpl @Inject constructor( message = request.message, payMore = request.payMore ) - + val response = dutchPayApiService.createDutchPayRequest(requestDto) - + if (response.isSuccessful) { Result.success(Unit) } else { @@ -33,4 +34,37 @@ class DutchPayRepositoryImpl @Inject constructor( Result.failure(e) } } + + override suspend fun getDutchPayRequestDetail(dutchPayId: Long): Result { + return try { + val response = dutchPayApiService.getDutchPayRequestDetail(dutchPayId) + + if (response.isSuccessful) { + val responseData = response.body()?.data + if (responseData != null) { + val detail = DutchPayRequestDetail( + dutchPayId = responseData.dutchpayId, + title = responseData.title, + message = responseData.message, + requesterName = responseData.requesterName, + participantCount = responseData.participantCount, + totalAmount = responseData.totalAmount, + requestedAt = responseData.requestedAt, + myAmount = responseData.myAmount, + originalAmount = responseData.originalAmount, + tiggleAmount = responseData.tiggleAmount, + payMoreDefault = responseData.payMoreDefault, + isCreator = responseData.creator + ) + Result.success(detail) + } else { + Result.failure(Exception("응답 데이터가 없습니다")) + } + } else { + Result.failure(Exception("더치페이 상세 조회 실패: ${response.code()}")) + } + } catch (e: Exception) { + Result.failure(e) + } + } } diff --git a/app/src/main/java/com/ssafy/tiggle/domain/entity/dutchpay/DutchPayRequestDetail.kt b/app/src/main/java/com/ssafy/tiggle/domain/entity/dutchpay/DutchPayRequestDetail.kt new file mode 100644 index 0000000..38a0cd5 --- /dev/null +++ b/app/src/main/java/com/ssafy/tiggle/domain/entity/dutchpay/DutchPayRequestDetail.kt @@ -0,0 +1,16 @@ +package com.ssafy.tiggle.domain.entity.dutchpay + +data class DutchPayRequestDetail( + val dutchPayId: Long, + val title: String, + val message: String, + val requesterName: String, + val participantCount: Int, + val totalAmount: Long, + val requestedAt: String, + val myAmount: Long, + val originalAmount: Long, + val tiggleAmount: Long, + val payMoreDefault: Boolean, + val isCreator: Boolean +) diff --git a/app/src/main/java/com/ssafy/tiggle/domain/repository/DutchPayRepository.kt b/app/src/main/java/com/ssafy/tiggle/domain/repository/DutchPayRepository.kt index 8efe0a4..62a0987 100644 --- a/app/src/main/java/com/ssafy/tiggle/domain/repository/DutchPayRepository.kt +++ b/app/src/main/java/com/ssafy/tiggle/domain/repository/DutchPayRepository.kt @@ -1,7 +1,9 @@ package com.ssafy.tiggle.domain.repository +import com.ssafy.tiggle.domain.entity.dutchpay.DutchPayRequestDetail import com.ssafy.tiggle.domain.entity.dutchpay.DutchPayRequest interface DutchPayRepository { suspend fun createDutchPayRequest(request: DutchPayRequest): Result + suspend fun getDutchPayRequestDetail(dutchPayId: Long): Result } diff --git a/app/src/main/java/com/ssafy/tiggle/domain/usecase/dutchpay/GetDutchPayRequestDetailUseCase.kt b/app/src/main/java/com/ssafy/tiggle/domain/usecase/dutchpay/GetDutchPayRequestDetailUseCase.kt new file mode 100644 index 0000000..2ce8b47 --- /dev/null +++ b/app/src/main/java/com/ssafy/tiggle/domain/usecase/dutchpay/GetDutchPayRequestDetailUseCase.kt @@ -0,0 +1,13 @@ +package com.ssafy.tiggle.domain.usecase.dutchpay + +import com.ssafy.tiggle.domain.entity.dutchpay.DutchPayRequestDetail +import com.ssafy.tiggle.domain.repository.DutchPayRepository +import javax.inject.Inject + +class GetDutchPayRequestDetailUseCase @Inject constructor( + private val dutchPayRepository: DutchPayRepository +) { + suspend operator fun invoke(dutchPayId: Long): Result { + return dutchPayRepository.getDutchPayRequestDetail(dutchPayId) + } +} diff --git a/app/src/main/java/com/ssafy/tiggle/presentation/navigation/NavigationGraph.kt b/app/src/main/java/com/ssafy/tiggle/presentation/navigation/NavigationGraph.kt index be28ca5..fe4ae87 100644 --- a/app/src/main/java/com/ssafy/tiggle/presentation/navigation/NavigationGraph.kt +++ b/app/src/main/java/com/ssafy/tiggle/presentation/navigation/NavigationGraph.kt @@ -1,10 +1,13 @@ package com.ssafy.tiggle.presentation.navigation +import android.content.Intent +import android.net.Uri import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.padding import androidx.compose.material3.Scaffold import androidx.compose.material3.Text import androidx.compose.runtime.Composable +import androidx.compose.runtime.LaunchedEffect import androidx.compose.ui.Modifier import androidx.lifecycle.viewmodel.navigation3.rememberViewModelStoreNavEntryDecorator import androidx.navigation3.runtime.NavEntry @@ -15,6 +18,7 @@ import androidx.navigation3.ui.rememberSceneSetupNavEntryDecorator import com.ssafy.tiggle.presentation.ui.auth.login.LoginScreen import com.ssafy.tiggle.presentation.ui.auth.signup.SignUpScreen import com.ssafy.tiggle.presentation.ui.dutchpay.CreateDutchPayScreen +import com.ssafy.tiggle.presentation.ui.dutchpay.DutchpayRecieveScreen import com.ssafy.tiggle.presentation.ui.piggybank.OpenAccountScreen import com.ssafy.tiggle.presentation.ui.piggybank.PiggyBankScreen import com.ssafy.tiggle.presentation.ui.piggybank.RegisterAccountScreen @@ -23,10 +27,38 @@ import com.ssafy.tiggle.presentation.ui.piggybank.RegisterAccountScreen * 앱의 메인 네비게이션 */ @Composable -fun NavigationGraph() { +fun NavigationGraph( + intent: Intent?, // Nullable Intent를 받음 + onDeepLinkHandled: () -> Unit // 딥링크 처리 완료 콜백 함수 +) { val startDestination = Screen.Login val navBackStack = rememberNavBackStack(startDestination) + LaunchedEffect(intent) { + val data: Uri? = intent?.data + android.util.Log.d("NavigationGraph", "LaunchedEffect triggered - intent: $intent, data: $data") + + if (data != null && data.scheme == "tiggle" && data.host == "dutchpay") { + android.util.Log.d("NavigationGraph", "Deep link detected: $data") + val dutchPayId = data.lastPathSegment + android.util.Log.d("NavigationGraph", "Extracted dutchPayId: $dutchPayId") + + if (dutchPayId != null) { + try { + navBackStack.clear() + navBackStack.add(BottomScreen.PiggyBank) + navBackStack.add(Screen.DutchpayRecieve(dutchPayId.toLong())) + android.util.Log.d("NavigationGraph", "Navigation successful to DutchpayRecieve($dutchPayId)") + } catch (e: Exception) { + android.util.Log.e("NavigationGraph", "Error navigating to DutchpayRecieve", e) + } + } + } + onDeepLinkHandled() + } + + + Scaffold( bottomBar = { if (navBackStack.last() is BottomScreen) @@ -117,6 +149,11 @@ fun NavigationGraph() { ) } + is Screen.DutchpayRecieve -> NavEntry(key) { + // key에서 dutchPayId를 직접 꺼내서 화면에 전달합니다. + DutchpayRecieveScreen(dutchPayId = key.dutchPayId) + } + else -> throw IllegalArgumentException("Unknown route: $key") } diff --git a/app/src/main/java/com/ssafy/tiggle/presentation/navigation/Screen.kt b/app/src/main/java/com/ssafy/tiggle/presentation/navigation/Screen.kt index ab72fac..30f222c 100644 --- a/app/src/main/java/com/ssafy/tiggle/presentation/navigation/Screen.kt +++ b/app/src/main/java/com/ssafy/tiggle/presentation/navigation/Screen.kt @@ -35,4 +35,7 @@ sealed interface Screen : NavKey { @Serializable object CreateDutchPay : Screen + + @Serializable + data class DutchpayRecieve(val dutchPayId: Long) : Screen } diff --git a/app/src/main/java/com/ssafy/tiggle/presentation/ui/dutchpay/DutchPayRequestDetailUiState.kt b/app/src/main/java/com/ssafy/tiggle/presentation/ui/dutchpay/DutchPayRequestDetailUiState.kt new file mode 100644 index 0000000..4f40fc1 --- /dev/null +++ b/app/src/main/java/com/ssafy/tiggle/presentation/ui/dutchpay/DutchPayRequestDetailUiState.kt @@ -0,0 +1,9 @@ +package com.ssafy.tiggle.presentation.ui.dutchpay + +import com.ssafy.tiggle.domain.entity.dutchpay.DutchPayRequestDetail + +data class DutchPayRequestDetailUiState( + val isLoading: Boolean = false, + val dutchPayDetail: DutchPayRequestDetail? = null, + val errorMessage: String? = null +) diff --git a/app/src/main/java/com/ssafy/tiggle/presentation/ui/dutchpay/DutchPayRequestDetailViewModel.kt b/app/src/main/java/com/ssafy/tiggle/presentation/ui/dutchpay/DutchPayRequestDetailViewModel.kt new file mode 100644 index 0000000..caa97de --- /dev/null +++ b/app/src/main/java/com/ssafy/tiggle/presentation/ui/dutchpay/DutchPayRequestDetailViewModel.kt @@ -0,0 +1,50 @@ +package com.ssafy.tiggle.presentation.ui.dutchpay + +import androidx.lifecycle.ViewModel +import androidx.lifecycle.viewModelScope +import com.ssafy.tiggle.domain.usecase.dutchpay.GetDutchPayRequestDetailUseCase +import dagger.hilt.android.lifecycle.HiltViewModel +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.StateFlow +import kotlinx.coroutines.flow.asStateFlow +import kotlinx.coroutines.flow.update +import kotlinx.coroutines.launch +import javax.inject.Inject + +@HiltViewModel +class DutchPayRequestDetailViewModel @Inject constructor( + private val getDutchPayRequestDetailUseCase: GetDutchPayRequestDetailUseCase +) : ViewModel() { + + private val _uiState = MutableStateFlow(DutchPayRequestDetailUiState()) + val uiState: StateFlow = _uiState.asStateFlow() + + fun loadDutchPayDetail(dutchPayId: Long) { + _uiState.update { it.copy(isLoading = true, errorMessage = null) } + + viewModelScope.launch { + getDutchPayRequestDetailUseCase(dutchPayId) + .onSuccess { detail -> + _uiState.update { + it.copy( + isLoading = false, + dutchPayDetail = detail, + errorMessage = null + ) + } + } + .onFailure { exception -> + _uiState.update { + it.copy( + isLoading = false, + errorMessage = exception.message ?: "더치페이 정보를 불러오는데 실패했습니다." + ) + } + } + } + } + + fun clearErrorMessage() { + _uiState.update { it.copy(errorMessage = null) } + } +} diff --git a/app/src/main/java/com/ssafy/tiggle/presentation/ui/dutchpay/DutchpayRecieveScreen.kt b/app/src/main/java/com/ssafy/tiggle/presentation/ui/dutchpay/DutchpayRecieveScreen.kt new file mode 100644 index 0000000..d217a50 --- /dev/null +++ b/app/src/main/java/com/ssafy/tiggle/presentation/ui/dutchpay/DutchpayRecieveScreen.kt @@ -0,0 +1,365 @@ +package com.ssafy.tiggle.presentation.ui.dutchpay + +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Row +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.rememberScrollState +import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.foundation.verticalScroll +import androidx.compose.material3.AlertDialog +import androidx.compose.material3.Card +import androidx.compose.material3.CardDefaults +import androidx.compose.material3.CircularProgressIndicator +import androidx.compose.material3.HorizontalDivider +import androidx.compose.material3.Text +import androidx.compose.material3.TextButton +import androidx.compose.runtime.Composable +import androidx.compose.runtime.LaunchedEffect +import androidx.compose.runtime.collectAsState +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.setValue +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.text.font.FontWeight +import androidx.compose.ui.text.style.TextAlign +import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.unit.dp +import androidx.compose.ui.unit.sp +import androidx.hilt.navigation.compose.hiltViewModel +import com.ssafy.tiggle.core.utils.Formatter +import com.ssafy.tiggle.domain.entity.dutchpay.DutchPayRequestDetail +import com.ssafy.tiggle.presentation.ui.components.TiggleButton +import com.ssafy.tiggle.presentation.ui.components.TiggleButtonVariant +import com.ssafy.tiggle.presentation.ui.components.TiggleScreenLayout +import com.ssafy.tiggle.presentation.ui.components.TiggleSwitchRow +import com.ssafy.tiggle.presentation.ui.theme.AppTypography +import com.ssafy.tiggle.presentation.ui.theme.TiggleBlue + +@Composable +fun DutchpayRecieveScreen( + dutchPayId: Long, + onBackClick: () -> Unit = {}, + onPaymentClick: () -> Unit = {}, + viewModel: DutchPayRequestDetailViewModel = hiltViewModel() +) { + val uiState by viewModel.uiState.collectAsState() + + LaunchedEffect(dutchPayId) { + viewModel.loadDutchPayDetail(dutchPayId) + } + + TiggleScreenLayout( + onBackClick = onBackClick, + bottomButton = { + uiState.dutchPayDetail?.let { detail -> + if (!detail.isCreator) { + TiggleButton( + text = "t", + onClick = onPaymentClick, + enabled = !uiState.isLoading, + isLoading = false, + variant = TiggleButtonVariant.Primary + ) + } + } + } + ) { + when { + uiState.isLoading -> { + Box( + modifier = Modifier.fillMaxSize(), + contentAlignment = Alignment.Center + ) { + CircularProgressIndicator(color = TiggleBlue) + } + } + + else -> { + uiState.dutchPayDetail?.let { detail -> + DutchPayPaymentContent( + detail = detail + ) + } + } + } + } + + // 에러 다이얼로그 표시 + uiState.errorMessage?.let { errorMessage -> + AlertDialog( + onDismissRequest = { viewModel.clearErrorMessage() }, + title = { + Text("오류") + }, + text = { + Text(errorMessage) + }, + confirmButton = { + TextButton( + onClick = { viewModel.clearErrorMessage() } + ) { + Text("송금하기") + } + } + ) + } +} + +@Composable +private fun DutchPayPaymentContent( + detail: DutchPayRequestDetail +) { + var payMoreEnabled by remember { mutableStateOf(detail.payMoreDefault) } + + // 내가 낼 금액 계산 + val myPaymentAmount = if (payMoreEnabled) { + detail.originalAmount + detail.tiggleAmount + } else { + detail.originalAmount + } + + Column( + modifier = Modifier + .fillMaxSize() + .verticalScroll(rememberScrollState()) + .padding(16.dp), + horizontalAlignment = Alignment.CenterHorizontally + ) { + Spacer(modifier = Modifier.height(16.dp)) + + // 요청자 정보 + Text( + text = "${detail.requesterName}님이", + style = AppTypography.headlineSmall, + textAlign = TextAlign.Center + ) + Text( + text = "더치페이를 요청했습니다", + style = AppTypography.headlineSmall, + textAlign = TextAlign.Center + ) + + Spacer(modifier = Modifier.height(20.dp)) + + // 전달된 메시지 (있을 경우) + if (detail.message.isNotBlank()) { + Card( + modifier = Modifier.fillMaxWidth(), + colors = CardDefaults.cardColors(containerColor = Color.Gray.copy(alpha = 0.1f)), + elevation = CardDefaults.cardElevation(defaultElevation = 0.dp), + shape = RoundedCornerShape(8.dp) + ) { + Column( + modifier = Modifier.padding(16.dp) + ) { + Text( + text = "📤 전달된 메시지", + style = AppTypography.bodySmall, + color = Color.Gray + ) + Spacer(modifier = Modifier.height(4.dp)) + Text( + text = detail.message, + style = AppTypography.bodyMedium + ) + } + } + Spacer(modifier = Modifier.height(16.dp)) + } + + // 요청 정보 + Card( + modifier = Modifier.fillMaxWidth(), + colors = CardDefaults.cardColors(containerColor = Color.White), + elevation = CardDefaults.cardElevation(defaultElevation = 1.dp), + shape = RoundedCornerShape(12.dp) + ) { + Column( + modifier = Modifier.padding(16.dp) + ) { + Text( + text = "요청 정보", + style = AppTypography.bodyLarge.copy(fontWeight = FontWeight.Bold) + ) + + Spacer(modifier = Modifier.height(12.dp)) + + DetailRow(label = "요청자", value = detail.requesterName) + Spacer(modifier = Modifier.height(8.dp)) + DetailRow(label = "참여 인원", value = "${detail.participantCount}명") + Spacer(modifier = Modifier.height(8.dp)) + DetailRow(label = "총 금액", value = Formatter.formatCurrency(detail.totalAmount)) + Spacer(modifier = Modifier.height(8.dp)) + DetailRow(label = "요청 일시", value = detail.requestedAt) + } + } + + Spacer(modifier = Modifier.height(20.dp)) + + // 내가 내는 금액 + Card( + modifier = Modifier.fillMaxWidth(), + colors = CardDefaults.cardColors(containerColor = TiggleBlue.copy(alpha = 0.1f)), + elevation = CardDefaults.cardElevation(defaultElevation = 0.dp), + shape = RoundedCornerShape(12.dp) + ) { + Column( + modifier = Modifier.padding(20.dp), + horizontalAlignment = Alignment.CenterHorizontally + ) { + Text( + text = "내가 내는 금액", + style = AppTypography.bodyMedium, + color = Color.Gray + ) + + Spacer(modifier = Modifier.height(8.dp)) + + Text( + text = Formatter.formatCurrency(myPaymentAmount), + style = AppTypography.headlineLarge.copy( + fontSize = 32.sp, + fontWeight = FontWeight.Bold, + color = TiggleBlue + ) + ) + + Spacer(modifier = Modifier.height(16.dp)) + + HorizontalDivider(color = Color.Gray.copy(alpha = 0.2f)) + + Spacer(modifier = Modifier.height(12.dp)) + + DetailRow(label = "원래 금액", value = Formatter.formatCurrency(detail.originalAmount)) + + if (payMoreEnabled && detail.tiggleAmount > 0) { + Spacer(modifier = Modifier.height(8.dp)) + DetailRow( + label = "티끌", + value = "+${Formatter.formatCurrency(detail.tiggleAmount)}", + valueColor = TiggleBlue + ) + } + } + } + + Spacer(modifier = Modifier.height(20.dp)) + + // 돈 더내고 잔돈 기부하기 스위치 + TiggleSwitchRow( + title = "돈 더내고 잔돈 기부하기", + subtitle = "자투리 금액을 티끌 저금통에 적립", + checked = payMoreEnabled, + onCheckedChange = { payMoreEnabled = it } + ) + + Spacer(modifier = Modifier.height(40.dp)) + } +} + +@Composable +private fun DetailRow( + label: String, + value: String, + valueColor: Color = Color.Black +) { + Row( + modifier = Modifier.fillMaxWidth(), + horizontalArrangement = Arrangement.SpaceBetween, + verticalAlignment = Alignment.Top + ) { + Text( + text = label, + style = AppTypography.bodyMedium, + color = Color.Gray, + modifier = Modifier.weight(1f) + ) + Text( + text = value, + style = AppTypography.bodyMedium.copy( + fontWeight = FontWeight.Medium + ), + color = valueColor, + textAlign = TextAlign.End, + modifier = Modifier.weight(1f) + ) + } +} + +@Preview(showBackground = true) +@Composable +private fun PreviewDutchPayPayment() { + val sampleDetail = DutchPayRequestDetail( + dutchPayId = 9L, + title = "어제 먹은 치킨 정산", + message = "오늘 치킨 먹은 금액입니다!", + requesterName = "최지원", + participantCount = 3, + totalAmount = 50000L, + requestedAt = "2025.08.20 14:32", + myAmount = 17000L, + originalAmount = 16666L, + tiggleAmount = 334L, + payMoreDefault = true, + isCreator = false + ) + + TiggleScreenLayout( + onBackClick = {}, + bottomButton = { + TiggleButton( + text = "송금하기", + onClick = {}, + enabled = true, + isLoading = false, + variant = TiggleButtonVariant.Primary + ) + } + ) { + DutchPayPaymentContent(detail = sampleDetail) + } +} + + +@Preview(showBackground = true) +@Composable +private fun PreviewNoTiggleDutchPayPayment() { + val sampleDetail = DutchPayRequestDetail( + dutchPayId = 9L, + title = "어제 먹은 치킨 정산", + message = "오늘 치킨 먹은 금액입니다!", + requesterName = "최지원", + participantCount = 3, + totalAmount = 50000L, + requestedAt = "2025.08.20 14:32", + myAmount = 17000L, + originalAmount = 16666L, + tiggleAmount = 334L, + payMoreDefault = false, + isCreator = false + ) + + TiggleScreenLayout( + onBackClick = {}, + bottomButton = { + TiggleButton( + text = "송금하기", + onClick = {}, + enabled = true, + isLoading = false, + variant = TiggleButtonVariant.Primary + ) + } + ) { + DutchPayPaymentContent(detail = sampleDetail) + } +} From 61365b07ae51c252304d2f44faf4c78e534bd350 Mon Sep 17 00:00:00 2001 From: ChoiJinWoo Date: Tue, 26 Aug 2025 01:54:55 +0900 Subject: [PATCH 02/13] =?UTF-8?q?fix:=20=EC=86=A1=EA=B8=88=ED=95=98?= =?UTF-8?q?=EA=B8=B0=20=EB=B2=84=ED=8A=BC=20=EC=98=A4=ED=83=80=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../tiggle/presentation/ui/dutchpay/DutchpayRecieveScreen.kt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/com/ssafy/tiggle/presentation/ui/dutchpay/DutchpayRecieveScreen.kt b/app/src/main/java/com/ssafy/tiggle/presentation/ui/dutchpay/DutchpayRecieveScreen.kt index d217a50..9d31d1a 100644 --- a/app/src/main/java/com/ssafy/tiggle/presentation/ui/dutchpay/DutchpayRecieveScreen.kt +++ b/app/src/main/java/com/ssafy/tiggle/presentation/ui/dutchpay/DutchpayRecieveScreen.kt @@ -63,7 +63,7 @@ fun DutchpayRecieveScreen( uiState.dutchPayDetail?.let { detail -> if (!detail.isCreator) { TiggleButton( - text = "t", + text = "송금하기", onClick = onPaymentClick, enabled = !uiState.isLoading, isLoading = false, @@ -199,7 +199,7 @@ private fun DutchPayPaymentContent( Spacer(modifier = Modifier.height(8.dp)) DetailRow(label = "총 금액", value = Formatter.formatCurrency(detail.totalAmount)) Spacer(modifier = Modifier.height(8.dp)) - DetailRow(label = "요청 일시", value = detail.requestedAt) + DetailRow(label = "요청 일시", value = Formatter.formatDateTime(detail.requestedAt)) } } From c4fe866a319236c96e75b073ce8bd09de687336e Mon Sep 17 00:00:00 2001 From: ChoiJinWoo Date: Tue, 26 Aug 2025 01:55:47 +0900 Subject: [PATCH 03/13] =?UTF-8?q?feat:=20=EB=82=A0=EC=A7=9C=20=EC=8B=9C?= =?UTF-8?q?=EA=B0=81=20=EC=B6=9C=EB=A0=A5=20=ED=8F=AC=EB=A7=B7=20=EC=84=A4?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/ssafy/tiggle/core/utils/Formatter.kt | 58 +++++++++++++++++++ 1 file changed, 58 insertions(+) diff --git a/app/src/main/java/com/ssafy/tiggle/core/utils/Formatter.kt b/app/src/main/java/com/ssafy/tiggle/core/utils/Formatter.kt index fbf0c5d..e5a92db 100644 --- a/app/src/main/java/com/ssafy/tiggle/core/utils/Formatter.kt +++ b/app/src/main/java/com/ssafy/tiggle/core/utils/Formatter.kt @@ -1,5 +1,8 @@ package com.ssafy.tiggle.core.utils +import java.time.LocalDateTime +import java.time.format.DateTimeFormatter +import java.time.format.DateTimeParseException import java.util.Locale object Formatter { @@ -7,4 +10,59 @@ object Formatter { fun formatCurrency(amount: Long, locale: Locale = Locale.KOREA): String = String.format(locale, "%,d원", amount) + // ISO 8601 날짜/시간 포맷팅: "2025-08-26T01:25:21" -> "2025.08.26 01:25" + fun formatDateTime(isoDateTime: String): String { + return try { + val dateTime = LocalDateTime.parse(isoDateTime) + val formatter = DateTimeFormatter.ofPattern("yyyy.MM.dd HH:mm") + dateTime.format(formatter) + } catch (e: DateTimeParseException) { + // 파싱 실패 시 원본 문자열 반환 + isoDateTime + } + } + + // 간단한 날짜 포맷팅: "2025-08-26T01:25:21" -> "8월 26일" + fun formatDateOnly(isoDateTime: String): String { + return try { + val dateTime = LocalDateTime.parse(isoDateTime) + val formatter = DateTimeFormatter.ofPattern("M월 d일", Locale.KOREA) + dateTime.format(formatter) + } catch (e: DateTimeParseException) { + // 파싱 실패 시 원본 문자열 반환 + isoDateTime + } + } + + // 시간만 포맷팅: "2025-08-26T01:25:21" -> "오전 1:25" + fun formatTimeOnly(isoDateTime: String): String { + return try { + val dateTime = LocalDateTime.parse(isoDateTime) + val formatter = DateTimeFormatter.ofPattern("a h:mm", Locale.KOREA) + dateTime.format(formatter) + } catch (e: DateTimeParseException) { + // 파싱 실패 시 원본 문자열 반환 + isoDateTime + } + } + + // 상대적 시간 표시: "방금", "5분 전", "3시간 전", "2일 전" 등 + fun formatRelativeTime(isoDateTime: String): String { + return try { + val dateTime = LocalDateTime.parse(isoDateTime) + val now = LocalDateTime.now() + val duration = java.time.Duration.between(dateTime, now) + + when { + duration.toMinutes() < 1 -> "방금" + duration.toMinutes() < 60 -> "${duration.toMinutes()}분 전" + duration.toHours() < 24 -> "${duration.toHours()}시간 전" + duration.toDays() < 7 -> "${duration.toDays()}일 전" + else -> formatDateOnly(isoDateTime) + } + } catch (e: DateTimeParseException) { + // 파싱 실패 시 원본 문자열 반환 + isoDateTime + } + } } \ No newline at end of file From a32c01eb4eea2fb2377efbd90d57816d87f9c7e7 Mon Sep 17 00:00:00 2001 From: ChoiJinWoo Date: Wed, 27 Aug 2025 00:03:37 +0900 Subject: [PATCH 04/13] =?UTF-8?q?feat:=20=EB=A1=9C=EA=B7=B8=EC=9D=B8=20?= =?UTF-8?q?=ED=99=94=EB=A9=B4=EC=97=90=EC=84=9C=20=EB=B9=84=EB=B0=80?= =?UTF-8?q?=EB=B2=88=ED=98=B8=20=EC=9E=85=EB=A0=A5=20=EC=99=84=EB=A3=8C=20?= =?UTF-8?q?=EC=8B=9C=20=ED=82=A4=EB=B3=B4=EB=93=9C=20=EC=82=AC=EB=9D=BC?= =?UTF-8?q?=EC=A7=80=EA=B2=8C=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../presentation/ui/auth/login/LoginScreen.kt | 9 +++++---- .../ui/components/TiggleTextField.kt | 16 ++++++++-------- 2 files changed, 13 insertions(+), 12 deletions(-) diff --git a/app/src/main/java/com/ssafy/tiggle/presentation/ui/auth/login/LoginScreen.kt b/app/src/main/java/com/ssafy/tiggle/presentation/ui/auth/login/LoginScreen.kt index 302a9c1..5971f0e 100644 --- a/app/src/main/java/com/ssafy/tiggle/presentation/ui/auth/login/LoginScreen.kt +++ b/app/src/main/java/com/ssafy/tiggle/presentation/ui/auth/login/LoginScreen.kt @@ -1,6 +1,5 @@ package com.ssafy.tiggle.presentation.ui.auth.login -import android.annotation.SuppressLint import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Spacer @@ -17,6 +16,7 @@ import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.text.SpanStyle import androidx.compose.ui.text.buildAnnotatedString +import androidx.compose.ui.text.input.ImeAction import androidx.compose.ui.text.input.KeyboardType import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.text.withStyle @@ -64,9 +64,9 @@ fun LoginScreen( label = "이메일", placeholder = "이메일을 입력해주세요", keyboardType = KeyboardType.Email, + modifier = Modifier.fillMaxWidth(), isError = uiState.emailError != null, - errorMessage = uiState.emailError, - modifier = Modifier.fillMaxWidth() + errorMessage = uiState.emailError ) Spacer(modifier = Modifier.height(16.dp)) @@ -77,9 +77,10 @@ fun LoginScreen( label = "비밀번호", placeholder = "비밀번호를 입력해주세요", isPassword = true, + modifier = Modifier.fillMaxWidth(), isError = uiState.passwordError != null, errorMessage = uiState.passwordError, - modifier = Modifier.fillMaxWidth() + imeAction = ImeAction.Done ) // 비밀번호 찾기 diff --git a/app/src/main/java/com/ssafy/tiggle/presentation/ui/components/TiggleTextField.kt b/app/src/main/java/com/ssafy/tiggle/presentation/ui/components/TiggleTextField.kt index 92132f9..77f1550 100644 --- a/app/src/main/java/com/ssafy/tiggle/presentation/ui/components/TiggleTextField.kt +++ b/app/src/main/java/com/ssafy/tiggle/presentation/ui/components/TiggleTextField.kt @@ -8,7 +8,6 @@ import androidx.compose.foundation.text.KeyboardOptions import androidx.compose.material.icons.Icons import androidx.compose.material.icons.filled.Visibility import androidx.compose.material.icons.filled.VisibilityOff -import androidx.compose.ui.text.input.ImeAction import androidx.compose.material3.Icon import androidx.compose.material3.IconButton import androidx.compose.material3.MaterialTheme @@ -21,16 +20,16 @@ import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.setValue import androidx.compose.ui.Modifier +import androidx.compose.ui.focus.onFocusChanged import androidx.compose.ui.graphics.Color import androidx.compose.ui.text.font.FontWeight +import androidx.compose.ui.text.input.ImeAction import androidx.compose.ui.text.input.KeyboardType import androidx.compose.ui.text.input.PasswordVisualTransformation import androidx.compose.ui.text.input.VisualTransformation import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp -import androidx.compose.ui.focus.onFocusChanged -import androidx.compose.ui.platform.LocalFocusManager import com.ssafy.tiggle.presentation.ui.theme.TiggleBlue import com.ssafy.tiggle.presentation.ui.theme.TiggleGrayLight import com.ssafy.tiggle.presentation.ui.theme.TiggleGrayText @@ -46,10 +45,11 @@ fun TiggleTextField( placeholder: String = "", isPassword: Boolean = false, keyboardType: KeyboardType = KeyboardType.Text, + maxLines: Int = 1, modifier: Modifier = Modifier, isError: Boolean = false, errorMessage: String? = null, - maxLines: Int = 1, + imeAction: ImeAction = if (maxLines == 1) ImeAction.Next else ImeAction.Done, minLines: Int = 1 ) { var isPasswordVisible by remember { mutableStateOf(false) } @@ -106,7 +106,7 @@ fun TiggleTextField( } else null, keyboardOptions = KeyboardOptions( keyboardType = keyboardType, - imeAction = if (maxLines == 1) ImeAction.Next else ImeAction.Done + imeAction = imeAction ), singleLine = maxLines == 1, maxLines = maxLines, @@ -136,7 +136,7 @@ fun TiggleTextField( @Composable private fun TiggleTextFieldPreview() { var text by remember { mutableStateOf("") } - + TiggleTextField( value = text, onValueChange = { text = it }, @@ -150,7 +150,7 @@ private fun TiggleTextFieldPreview() { @Composable private fun TiggleTextFieldPasswordPreview() { var password by remember { mutableStateOf("") } - + TiggleTextField( value = password, onValueChange = { password = it }, @@ -164,7 +164,7 @@ private fun TiggleTextFieldPasswordPreview() { @Composable private fun TiggleTextFieldErrorPreview() { var text by remember { mutableStateOf("invalid@") } - + TiggleTextField( value = text, onValueChange = { text = it }, From 6e45e86ed8d90c561d72ad51a2e9b51ad0c87bbb Mon Sep 17 00:00:00 2001 From: ChoiJinWoo Date: Wed, 27 Aug 2025 00:06:31 +0900 Subject: [PATCH 05/13] =?UTF-8?q?chore:=20deep=20link=20=EA=B3=BC=EC=A0=95?= =?UTF-8?q?=20=EB=94=94=EB=B2=84=EA=B7=B8=20=EB=A1=9C=EA=B7=B8=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../navigation/NavigationGraph.kt | 21 +++++++++++++++---- 1 file changed, 17 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/com/ssafy/tiggle/presentation/navigation/NavigationGraph.kt b/app/src/main/java/com/ssafy/tiggle/presentation/navigation/NavigationGraph.kt index 33a2c00..e76f9df 100644 --- a/app/src/main/java/com/ssafy/tiggle/presentation/navigation/NavigationGraph.kt +++ b/app/src/main/java/com/ssafy/tiggle/presentation/navigation/NavigationGraph.kt @@ -1,10 +1,12 @@ package com.ssafy.tiggle.presentation.navigation +import android.content.Intent +import android.net.Uri import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.padding import androidx.compose.material3.Scaffold -import androidx.compose.material3.Text import androidx.compose.runtime.Composable +import androidx.compose.runtime.LaunchedEffect import androidx.compose.ui.Modifier import androidx.lifecycle.viewmodel.navigation3.rememberViewModelStoreNavEntryDecorator import androidx.navigation3.runtime.NavEntry @@ -14,10 +16,15 @@ import androidx.navigation3.ui.NavDisplay import androidx.navigation3.ui.rememberSceneSetupNavEntryDecorator import com.ssafy.tiggle.presentation.ui.auth.login.LoginScreen import com.ssafy.tiggle.presentation.ui.auth.signup.SignUpScreen +import com.ssafy.tiggle.presentation.ui.donation.DonationHistoryScreen +import com.ssafy.tiggle.presentation.ui.donation.DonationStatusScreen import com.ssafy.tiggle.presentation.ui.dutchpay.CreateDutchPayScreen +import com.ssafy.tiggle.presentation.ui.dutchpay.DutchpayRecieveScreen +import com.ssafy.tiggle.presentation.ui.growth.GrowthScreen import com.ssafy.tiggle.presentation.ui.piggybank.OpenAccountScreen import com.ssafy.tiggle.presentation.ui.piggybank.PiggyBankScreen import com.ssafy.tiggle.presentation.ui.piggybank.RegisterAccountScreen +import com.ssafy.tiggle.presentation.ui.shorts.ShortsScreen /** * 앱의 메인 네비게이션 @@ -27,12 +34,15 @@ fun NavigationGraph( intent: Intent?, // Nullable Intent를 받음 onDeepLinkHandled: () -> Unit // 딥링크 처리 완료 콜백 함수 ) { - val startDestination = Screen.Login + val startDestination = Screen.CreateDutchPay val navBackStack = rememberNavBackStack(startDestination) LaunchedEffect(intent) { val data: Uri? = intent?.data - android.util.Log.d("NavigationGraph", "LaunchedEffect triggered - intent: $intent, data: $data") + android.util.Log.d( + "NavigationGraph", + "LaunchedEffect triggered - intent: $intent, data: $data" + ) if (data != null && data.scheme == "tiggle" && data.host == "dutchpay") { android.util.Log.d("NavigationGraph", "Deep link detected: $data") @@ -44,7 +54,10 @@ fun NavigationGraph( navBackStack.clear() navBackStack.add(BottomScreen.PiggyBank) navBackStack.add(Screen.DutchpayRecieve(dutchPayId.toLong())) - android.util.Log.d("NavigationGraph", "Navigation successful to DutchpayRecieve($dutchPayId)") + android.util.Log.d( + "NavigationGraph", + "Navigation successful to DutchpayRecieve($dutchPayId)" + ) } catch (e: Exception) { android.util.Log.e("NavigationGraph", "Error navigating to DutchpayRecieve", e) } From 54a784702e45435c11805bf121bbbb90adef89ba Mon Sep 17 00:00:00 2001 From: ChoiJinWoo Date: Wed, 27 Aug 2025 00:07:35 +0900 Subject: [PATCH 06/13] =?UTF-8?q?fix:=20=EC=8B=9C=EC=9E=91=20=EA=B2=BD?= =?UTF-8?q?=EB=A1=9C=20Login=EC=9C=BC=EB=A1=9C=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/ssafy/tiggle/presentation/navigation/NavigationGraph.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/com/ssafy/tiggle/presentation/navigation/NavigationGraph.kt b/app/src/main/java/com/ssafy/tiggle/presentation/navigation/NavigationGraph.kt index e76f9df..453ecaa 100644 --- a/app/src/main/java/com/ssafy/tiggle/presentation/navigation/NavigationGraph.kt +++ b/app/src/main/java/com/ssafy/tiggle/presentation/navigation/NavigationGraph.kt @@ -34,7 +34,7 @@ fun NavigationGraph( intent: Intent?, // Nullable Intent를 받음 onDeepLinkHandled: () -> Unit // 딥링크 처리 완료 콜백 함수 ) { - val startDestination = Screen.CreateDutchPay + val startDestination = Screen.Login val navBackStack = rememberNavBackStack(startDestination) LaunchedEffect(intent) { From ce047f7ae806c8d08b1f72540ef332109430a874 Mon Sep 17 00:00:00 2001 From: ChoiJinWoo Date: Wed, 27 Aug 2025 00:11:08 +0900 Subject: [PATCH 07/13] =?UTF-8?q?fix:=20=EB=8D=94=EC=B9=98=ED=8E=98?= =?UTF-8?q?=EC=9D=B4=20=ED=95=98=EA=B8=B0=20=ED=99=94=EB=A9=B4=20verticalS?= =?UTF-8?q?croll=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ssafy/tiggle/presentation/ui/components/UserPicker.kt | 5 ++++- .../presentation/ui/dutchpay/CreateDutchPayScreen.kt | 8 +++++--- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/com/ssafy/tiggle/presentation/ui/components/UserPicker.kt b/app/src/main/java/com/ssafy/tiggle/presentation/ui/components/UserPicker.kt index 184eff3..e689e39 100644 --- a/app/src/main/java/com/ssafy/tiggle/presentation/ui/components/UserPicker.kt +++ b/app/src/main/java/com/ssafy/tiggle/presentation/ui/components/UserPicker.kt @@ -10,6 +10,7 @@ import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.heightIn import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.size import androidx.compose.foundation.lazy.LazyColumn @@ -101,7 +102,9 @@ fun UserPicker( colors = CardDefaults.cardColors(containerColor = Color.White), elevation = CardDefaults.cardElevation(defaultElevation = 0.dp) ) { - LazyColumn { + LazyColumn( + modifier = Modifier.heightIn(max = 400.dp) + ) { items(filteredUsers, key = { it.id }) { user -> UserRow( user = user, diff --git a/app/src/main/java/com/ssafy/tiggle/presentation/ui/dutchpay/CreateDutchPayScreen.kt b/app/src/main/java/com/ssafy/tiggle/presentation/ui/dutchpay/CreateDutchPayScreen.kt index 7c33d9c..253293e 100644 --- a/app/src/main/java/com/ssafy/tiggle/presentation/ui/dutchpay/CreateDutchPayScreen.kt +++ b/app/src/main/java/com/ssafy/tiggle/presentation/ui/dutchpay/CreateDutchPayScreen.kt @@ -17,7 +17,6 @@ import androidx.compose.foundation.rememberScrollState import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.foundation.text.BasicTextField import androidx.compose.foundation.text.KeyboardOptions -import androidx.compose.foundation.verticalScroll import androidx.compose.material3.AlertDialog import androidx.compose.material3.Card import androidx.compose.material3.CardDefaults @@ -76,6 +75,11 @@ fun CreateDutchPayScreen( onBackClick = { if (uiState.step == CreateDutchPayStep.PICK_USERS) onBackClick() else viewModel.goPrev() }, + enableScroll = when (uiState.step) { + CreateDutchPayStep.PICK_USERS -> false + CreateDutchPayStep.INPUT_AMOUNT -> true + CreateDutchPayStep.COMPLETE -> true + }, bottomButton = { TiggleButton( text = when (uiState.step) { @@ -192,7 +196,6 @@ fun DutchPayInputAmountContent( Column( modifier = Modifier .fillMaxSize() - .verticalScroll(rememberScrollState()) .padding(top = 12.dp) ) { // 선택한 친구 섹션 @@ -340,7 +343,6 @@ fun DutchPayCompleteContent( Column( modifier = Modifier .fillMaxSize() - .verticalScroll(rememberScrollState()) .padding(16.dp), horizontalAlignment = Alignment.CenterHorizontally ) { From ad892c0461a3bac6a2a28734a4d6acaebdeca4c0 Mon Sep 17 00:00:00 2001 From: ChoiJinWoo Date: Wed, 27 Aug 2025 01:06:33 +0900 Subject: [PATCH 08/13] =?UTF-8?q?fix:=20add=20RequiresApi=20=EC=96=B4?= =?UTF-8?q?=EB=85=B8=ED=85=8C=EC=9D=B4=EC=85=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/java/com/ssafy/tiggle/core/utils/Formatter.kt | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/app/src/main/java/com/ssafy/tiggle/core/utils/Formatter.kt b/app/src/main/java/com/ssafy/tiggle/core/utils/Formatter.kt index e5a92db..982431a 100644 --- a/app/src/main/java/com/ssafy/tiggle/core/utils/Formatter.kt +++ b/app/src/main/java/com/ssafy/tiggle/core/utils/Formatter.kt @@ -1,5 +1,7 @@ package com.ssafy.tiggle.core.utils +import android.os.Build +import androidx.annotation.RequiresApi import java.time.LocalDateTime import java.time.format.DateTimeFormatter import java.time.format.DateTimeParseException @@ -11,6 +13,7 @@ object Formatter { String.format(locale, "%,d원", amount) // ISO 8601 날짜/시간 포맷팅: "2025-08-26T01:25:21" -> "2025.08.26 01:25" + @RequiresApi(Build.VERSION_CODES.O) fun formatDateTime(isoDateTime: String): String { return try { val dateTime = LocalDateTime.parse(isoDateTime) @@ -23,6 +26,7 @@ object Formatter { } // 간단한 날짜 포맷팅: "2025-08-26T01:25:21" -> "8월 26일" + @RequiresApi(Build.VERSION_CODES.O) fun formatDateOnly(isoDateTime: String): String { return try { val dateTime = LocalDateTime.parse(isoDateTime) @@ -35,6 +39,7 @@ object Formatter { } // 시간만 포맷팅: "2025-08-26T01:25:21" -> "오전 1:25" + @RequiresApi(Build.VERSION_CODES.O) fun formatTimeOnly(isoDateTime: String): String { return try { val dateTime = LocalDateTime.parse(isoDateTime) @@ -47,6 +52,7 @@ object Formatter { } // 상대적 시간 표시: "방금", "5분 전", "3시간 전", "2일 전" 등 + @RequiresApi(Build.VERSION_CODES.O) fun formatRelativeTime(isoDateTime: String): String { return try { val dateTime = LocalDateTime.parse(isoDateTime) From fd4b9aad23fe029a020c9f553741b5cb86f0d11c Mon Sep 17 00:00:00 2001 From: ChoiJinWoo Date: Wed, 27 Aug 2025 01:10:33 +0900 Subject: [PATCH 09/13] fix: add SuppressLint --- .../java/com/ssafy/tiggle/core/utils/Formatter.kt | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/app/src/main/java/com/ssafy/tiggle/core/utils/Formatter.kt b/app/src/main/java/com/ssafy/tiggle/core/utils/Formatter.kt index 982431a..ed2a398 100644 --- a/app/src/main/java/com/ssafy/tiggle/core/utils/Formatter.kt +++ b/app/src/main/java/com/ssafy/tiggle/core/utils/Formatter.kt @@ -1,7 +1,6 @@ package com.ssafy.tiggle.core.utils -import android.os.Build -import androidx.annotation.RequiresApi +import android.annotation.SuppressLint import java.time.LocalDateTime import java.time.format.DateTimeFormatter import java.time.format.DateTimeParseException @@ -13,7 +12,7 @@ object Formatter { String.format(locale, "%,d원", amount) // ISO 8601 날짜/시간 포맷팅: "2025-08-26T01:25:21" -> "2025.08.26 01:25" - @RequiresApi(Build.VERSION_CODES.O) + @SuppressLint("NewApi") fun formatDateTime(isoDateTime: String): String { return try { val dateTime = LocalDateTime.parse(isoDateTime) @@ -26,7 +25,7 @@ object Formatter { } // 간단한 날짜 포맷팅: "2025-08-26T01:25:21" -> "8월 26일" - @RequiresApi(Build.VERSION_CODES.O) + @SuppressLint("NewApi") fun formatDateOnly(isoDateTime: String): String { return try { val dateTime = LocalDateTime.parse(isoDateTime) @@ -39,7 +38,7 @@ object Formatter { } // 시간만 포맷팅: "2025-08-26T01:25:21" -> "오전 1:25" - @RequiresApi(Build.VERSION_CODES.O) + @SuppressLint("NewApi") fun formatTimeOnly(isoDateTime: String): String { return try { val dateTime = LocalDateTime.parse(isoDateTime) @@ -52,7 +51,7 @@ object Formatter { } // 상대적 시간 표시: "방금", "5분 전", "3시간 전", "2일 전" 등 - @RequiresApi(Build.VERSION_CODES.O) + @SuppressLint("NewApi") fun formatRelativeTime(isoDateTime: String): String { return try { val dateTime = LocalDateTime.parse(isoDateTime) From 0f85ae02b370a5cb547ab36ac304d80949ce1783 Mon Sep 17 00:00:00 2001 From: ChoiJinWoo Date: Wed, 27 Aug 2025 01:11:14 +0900 Subject: [PATCH 10/13] =?UTF-8?q?refactor:=20Formatter=EB=A5=BC=20?= =?UTF-8?q?=EC=82=AC=EC=9A=A9=ED=95=B4=EC=84=9C=20=EB=82=A0=EC=A7=9C=20?= =?UTF-8?q?=EB=B3=80=ED=99=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../tiggle/presentation/ui/donation/DonationHistoryScreen.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/com/ssafy/tiggle/presentation/ui/donation/DonationHistoryScreen.kt b/app/src/main/java/com/ssafy/tiggle/presentation/ui/donation/DonationHistoryScreen.kt index 1a2fb54..b389d94 100644 --- a/app/src/main/java/com/ssafy/tiggle/presentation/ui/donation/DonationHistoryScreen.kt +++ b/app/src/main/java/com/ssafy/tiggle/presentation/ui/donation/DonationHistoryScreen.kt @@ -188,7 +188,7 @@ private fun DonationHistoryItem( ) Spacer(modifier = Modifier.height(4.dp)) Text( - text = donation.donatedAt, + text = Formatter.formatDateTime(donation.donatedAt), fontSize = 12.sp, color = TiggleGrayText, style = AppTypography.bodySmall From cad658d69152b7760909cebf4b1ab39dde488797 Mon Sep 17 00:00:00 2001 From: ChoiJinWoo Date: Wed, 27 Aug 2025 01:18:50 +0900 Subject: [PATCH 11/13] =?UTF-8?q?fix:=20=EB=8D=94=EC=B9=98=ED=8E=98?= =?UTF-8?q?=EC=9D=B4=20=EC=9A=94=EC=B2=AD=20=EC=88=98=EC=8B=A0=20api=20?= =?UTF-8?q?=EA=B2=BD=EB=A1=9C=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ssafy/tiggle/data/datasource/remote/DutchPayApiService.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/com/ssafy/tiggle/data/datasource/remote/DutchPayApiService.kt b/app/src/main/java/com/ssafy/tiggle/data/datasource/remote/DutchPayApiService.kt index 0b9dd40..c5099ba 100644 --- a/app/src/main/java/com/ssafy/tiggle/data/datasource/remote/DutchPayApiService.kt +++ b/app/src/main/java/com/ssafy/tiggle/data/datasource/remote/DutchPayApiService.kt @@ -16,7 +16,7 @@ interface DutchPayApiService { @Body request: DutchPayRequestDto ): Response> - @GET("/api/dutchpay/{id}/detail") + @GET("/api/dutchpay/requests/{id}") suspend fun getDutchPayRequestDetail( @Path("id") dutchPayId: Long ): Response> From 1b5fa15caab8a5be694dceaf82a29c756528e86b Mon Sep 17 00:00:00 2001 From: ChoiJinWoo Date: Wed, 27 Aug 2025 01:19:36 +0900 Subject: [PATCH 12/13] =?UTF-8?q?fix:=20=EC=8A=A4=ED=81=AC=EB=A1=A4=20?= =?UTF-8?q?=EC=A4=91=EC=B2=A9=20=EC=98=A4=EB=A5=98=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../tiggle/presentation/ui/dutchpay/DutchpayRecieveScreen.kt | 3 --- 1 file changed, 3 deletions(-) diff --git a/app/src/main/java/com/ssafy/tiggle/presentation/ui/dutchpay/DutchpayRecieveScreen.kt b/app/src/main/java/com/ssafy/tiggle/presentation/ui/dutchpay/DutchpayRecieveScreen.kt index 9d31d1a..034a903 100644 --- a/app/src/main/java/com/ssafy/tiggle/presentation/ui/dutchpay/DutchpayRecieveScreen.kt +++ b/app/src/main/java/com/ssafy/tiggle/presentation/ui/dutchpay/DutchpayRecieveScreen.kt @@ -9,9 +9,7 @@ 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.rememberScrollState import androidx.compose.foundation.shape.RoundedCornerShape -import androidx.compose.foundation.verticalScroll import androidx.compose.material3.AlertDialog import androidx.compose.material3.Card import androidx.compose.material3.CardDefaults @@ -130,7 +128,6 @@ private fun DutchPayPaymentContent( Column( modifier = Modifier .fillMaxSize() - .verticalScroll(rememberScrollState()) .padding(16.dp), horizontalAlignment = Alignment.CenterHorizontally ) { From 835d16b3ae943e3842cd169d9ff4baaf4c7d38d5 Mon Sep 17 00:00:00 2001 From: ChoiJinWoo Date: Wed, 27 Aug 2025 01:29:08 +0900 Subject: [PATCH 13/13] =?UTF-8?q?fix:=20=EB=A8=B8=EC=A7=80=20=EA=B3=BC?= =?UTF-8?q?=EC=A0=95=EC=97=90=EC=84=9C=20=EC=82=AC=EC=9A=A9=EB=90=98?= =?UTF-8?q?=EC=A7=80=EC=95=8A=EB=8A=94=20onClick=20=EC=9D=B4=EB=B2=A4?= =?UTF-8?q?=ED=8A=B8=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ssafy/tiggle/presentation/navigation/NavigationGraph.kt | 3 --- 1 file changed, 3 deletions(-) diff --git a/app/src/main/java/com/ssafy/tiggle/presentation/navigation/NavigationGraph.kt b/app/src/main/java/com/ssafy/tiggle/presentation/navigation/NavigationGraph.kt index c348173..e5f8b34 100644 --- a/app/src/main/java/com/ssafy/tiggle/presentation/navigation/NavigationGraph.kt +++ b/app/src/main/java/com/ssafy/tiggle/presentation/navigation/NavigationGraph.kt @@ -149,9 +149,6 @@ fun NavigationGraph( onEditLinkedAccountClick = { navBackStack.add(Screen.RegisterAccount(isEdit = true)) } - onBackClick = { - navBackStack.removeLastOrNull() - } ) }