diff --git a/.idea/appInsightsSettings.xml b/.idea/appInsightsSettings.xml
new file mode 100644
index 0000000..371f2e2
--- /dev/null
+++ b/.idea/appInsightsSettings.xml
@@ -0,0 +1,26 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/studiobot.xml b/.idea/studiobot.xml
new file mode 100644
index 0000000..539e3b8
--- /dev/null
+++ b/.idea/studiobot.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/java/com/example/login_v3/data/api/Main_API_Service.kt b/app/src/main/java/com/example/login_v3/data/api/Main_API_Service.kt
index 2314c36..ad5cb82 100644
--- a/app/src/main/java/com/example/login_v3/data/api/Main_API_Service.kt
+++ b/app/src/main/java/com/example/login_v3/data/api/Main_API_Service.kt
@@ -108,8 +108,8 @@ interface TecnologiaApi {
@GET("api/dm/{room_id}/messages")
suspend fun getChatMessages(
@Path("room_id") roomId: String,
- @Query("cursor") cursor: String? = null, // 🎯 新增這個:載入歷史紀錄時帶入上一次的 nextCursor
- @Query("limit") limit: Int? = null // 💡 選填:如果後端有支援控制數量的話可以加上
+ @Query("before_id") cursor: String? = null, // 🎯 修正為與後端文件一致的 before_id
+ @Query("limit") limit: Int? = null
): Response
// 標記聊天室已讀
diff --git a/app/src/main/java/com/example/login_v3/data/di/NetworkModule.kt b/app/src/main/java/com/example/login_v3/data/di/NetworkModule.kt
index b8b7c9c..59911ab 100644
--- a/app/src/main/java/com/example/login_v3/data/di/NetworkModule.kt
+++ b/app/src/main/java/com/example/login_v3/data/di/NetworkModule.kt
@@ -73,9 +73,18 @@ object NetworkModule {
tokenInterceptor: Interceptor,
tokenAuthenticator: TokenAuthenticator // 👈 注入前面實作好的 Authenticator
): OkHttpClient {
+ val loggingInterceptor = Interceptor { chain ->
+ val request = chain.request()
+ android.util.Log.d("ChatDebug", "🚀 [Network] Request: ${request.method} ${request.url}")
+ val response = chain.proceed(request)
+ android.util.Log.d("ChatDebug", "📦 [Network] Response: ${response.code} for ${request.url}")
+ response
+ }
+
return OkHttpClient.Builder()
.connectTimeout(15, TimeUnit.SECONDS)
.readTimeout(15, TimeUnit.SECONDS)
+ .addInterceptor(loggingInterceptor) // 負責 Log 網路請求
.addInterceptor(tokenInterceptor) // 負責幫一般請求加上 Token
.authenticator(tokenAuthenticator) // 負責在 401 時自動刷新 Token
.build()
diff --git a/app/src/main/java/com/example/login_v3/data/repository/dm/DM_Basic_Repository.kt b/app/src/main/java/com/example/login_v3/data/repository/dm/DM_Basic_Repository.kt
index 5915571..fa85b84 100644
--- a/app/src/main/java/com/example/login_v3/data/repository/dm/DM_Basic_Repository.kt
+++ b/app/src/main/java/com/example/login_v3/data/repository/dm/DM_Basic_Repository.kt
@@ -180,13 +180,17 @@ class ChatRoomsRepository @Inject constructor(
cursor: String? = null,
limit: Int? = null
): Result {
+ Log.d("ChatDebug", "📡 [Repository] refreshChatMessages 觸發 | roomId: $roomId | cursor: $cursor | limit: $limit")
return try {
- // 1. 把 cursor 傳給 API
- val response = api.getChatMessages(roomId, cursor = cursor)
+ // 1. 把 cursor 與 limit 傳給 API
+ val response = api.getChatMessages(roomId, cursor = cursor, limit = limit)
if (response.isSuccessful) {
val body = response.body()
if (body != null) {
+ val firstId = body.messages.firstOrNull()?.id
+ val lastId = body.messages.lastOrNull()?.id
+ Log.d("ChatDebug", "✅ [Repository] API 成功 | 收到 ${body.messages.size} 條訊息 | 首條ID: $firstId | 末條ID: $lastId | nextCursor: ${body.nextCursor}")
// 2. 轉換成 Entity 列表
val entities = body.messages.map { networkMessage ->
diff --git a/app/src/main/java/com/example/login_v3/home/Message/UI/Detail/Message_Messaging.kt b/app/src/main/java/com/example/login_v3/home/Message/UI/Detail/Message_Messaging.kt
index 16dd6b1..5f3b4e6 100644
--- a/app/src/main/java/com/example/login_v3/home/Message/UI/Detail/Message_Messaging.kt
+++ b/app/src/main/java/com/example/login_v3/home/Message/UI/Detail/Message_Messaging.kt
@@ -165,6 +165,12 @@ fun MessageMessaging(
) { uri: Uri? ->
uri?.let { viewModel.uploadAttachment(roomId, it) }
}
+
+ //進入時重整
+ LaunchedEffect(roomId) {
+ viewModel.loadMessages(roomId)
+ }
+
//bottom bar on and off
DisposableEffect(Unit) {
bottomBarViewModel.setVisible(false)
diff --git a/app/src/main/java/com/example/login_v3/home/Message/ViewModel/Detail/Message_Messaging_ViewModel.kt b/app/src/main/java/com/example/login_v3/home/Message/ViewModel/Detail/Message_Messaging_ViewModel.kt
index 15b8e53..93d14ac 100644
--- a/app/src/main/java/com/example/login_v3/home/Message/ViewModel/Detail/Message_Messaging_ViewModel.kt
+++ b/app/src/main/java/com/example/login_v3/home/Message/ViewModel/Detail/Message_Messaging_ViewModel.kt
@@ -190,10 +190,21 @@ class ChatViewModel @Inject constructor(
// 💡 核心新增:往上滑載入更多老訊息 (補上 limit)
// =====================================================================
fun loadMoreMessages(roomId: String) {
- if (isLoadingMore || !hasMore || nextCursor.isNullOrBlank()) return
+ if (isLoadingMore) {
+ Log.d("ChatDebug", "⚠️ [ViewModel] loadMoreMessages 略過: 正在加載中...")
+ return
+ }
+ if (!hasMore) {
+ Log.d("ChatDebug", "⚠️ [ViewModel] loadMoreMessages 略過: 沒有更多訊息了 (hasMore=false)")
+ return
+ }
+ if (nextCursor.isNullOrBlank()) {
+ Log.d("ChatDebug", "⚠️ [ViewModel] loadMoreMessages 略過: nextCursor 為空")
+ return
+ }
isLoadingMore = true
- Log.d("ChatViewModel", "觸發載入更多,當前 cursor: $nextCursor")
+ Log.d("ChatDebug", "🚀 [ViewModel] 開始載入更多 | 當前 cursor: $nextCursor | roomId: $roomId")
viewModelScope.launch {
// 🎯 補上 limit = 20 傳遞給 Repository 與 API
@@ -201,10 +212,10 @@ class ChatViewModel @Inject constructor(
.onSuccess { response ->
this@ChatViewModel.nextCursor = response.nextCursor
this@ChatViewModel.hasMore = response.hasMore
- Log.d("ChatViewModel", "載入更多成功,新 cursor: $nextCursor, hasMore: $hasMore")
+ Log.d("ChatDebug", "✅ [ViewModel] 載入更多成功 | 新 cursor: $nextCursor | hasMore: $hasMore")
}
.onFailure { error ->
- Log.e("ChatViewModel", "載入更多老訊息失敗", error)
+ Log.e("ChatDebug", "❌ [ViewModel] 載入更多失敗", error)
}
isLoadingMore = false