Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
19 commits
Select commit Hold shift + click to select a range
f6a696d
[refactor]: roomId 제대로 반영 (#81)
Nico1eKim Aug 13, 2025
e55f373
[feat]: comment response 작성 (#81)
Nico1eKim Aug 13, 2025
b142d14
[feat]: comment service 작성 (#81)
Nico1eKim Aug 13, 2025
4633a2a
[feat]: comment repository 작성 (#81)
Nico1eKim Aug 13, 2025
3cfb103
[ui]: profile bar string으로 받도록 수정 (#81)
Nico1eKim Aug 13, 2025
95a9c00
[feat]: 댓글 조회 viewmodel 생성 및 screen에 연결 (#81)
Nico1eKim Aug 13, 2025
27fce20
Merge branch 'develop' of https://github.com/THIP-TextHip/THIP-Androi…
Nico1eKim Aug 13, 2025
86946bd
[refactor]: color util 최신버전으로 수정 (#81)
Nico1eKim Aug 13, 2025
26f2079
[refactor]: color 함수 수정 (#81)
Nico1eKim Aug 13, 2025
4529f43
[fix]: 댓글 bottom sheet 키보드 올라갔을 때 같이 올라가는 문제 해결 (#81)
Nico1eKim Aug 13, 2025
45822bf
[feat]: 댓글 좋아요 request, response 생성 (#81)
Nico1eKim Aug 13, 2025
763c4e4
[feat]: 댓글 좋아요 service 생성 (#81)
Nico1eKim Aug 13, 2025
768afc3
[feat]: 댓글 좋아요 repository 생성 (#81)
Nico1eKim Aug 13, 2025
bed9e29
[feat]: 댓글 좋아요 viewmodel 생성 및 화면에 연결 (#81)
Nico1eKim Aug 13, 2025
44ab3e0
[feat]: 댓글 작성 request, response 생성 (#81)
Nico1eKim Aug 13, 2025
387cdd0
[feat]: 댓글 작성 service 작성 (#81)
Nico1eKim Aug 13, 2025
219cc80
[feat]: 댓글 작성 repository 작성 (#81)
Nico1eKim Aug 13, 2025
e48a3f1
[feat]: 댓글 작성 viewmodel 생성 및 screen에 적용 (#81)
Nico1eKim Aug 13, 2025
e8cc4e4
[refactor]: alias color, category color 수정 (#81)
Nico1eKim Aug 13, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions app/src/main/AndroidManifest.xml

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

혹시 이거는 어떤 기능인가요?

Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@
<activity
android:name=".MainActivity"
android:exported="true"
android:windowSoftInputMode="adjustResize"
android:label="@string/app_name"
android:theme="@style/Theme.Thip">
<intent-filter>
Expand Down
6 changes: 6 additions & 0 deletions app/src/main/java/com/texthip/thip/data/di/ServiceModule.kt
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package com.texthip.thip.data.di

import com.texthip.thip.data.service.BookService
import com.texthip.thip.data.service.CommentsService
import com.texthip.thip.data.service.GroupService
import com.texthip.thip.data.service.RoomsService
import com.texthip.thip.data.service.UserService
Expand Down Expand Up @@ -36,4 +37,9 @@ object ServiceModule {
fun provideUserService(retrofit: Retrofit): UserService {
return retrofit.create(UserService::class.java)
}

@Provides
@Singleton
fun providesCommentsService(retrofit: Retrofit): CommentsService =
retrofit.create(CommentsService::class.java)
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package com.texthip.thip.data.model.comments.request

import kotlinx.serialization.Serializable

@Serializable
data class CommentsCreateRequest(
val content: String,
val isReplyRequest: Boolean,
val parentId: Int? = null,
val postType: String,
)
Comment on lines +7 to +11

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Verification agent

🧩 Analysis chain

타입 일관성 및 무결성 보강(빈 콘텐츠/답글 규칙 검증)

  • parentId는 댓글 ID이므로 Long?으로 일관화 권장
  • 잘못된 조합 전송 방지를 위해 기본 무결성 검증을 추가(빈 content 금지, isReplyRequest에 따른 parentId 존재성)

아래 변경 제안은 컴파일 타임에 깨지는 부분이 없는지 전체 빌드 확인이 필요합니다.

 @Serializable
 data class CommentsCreateRequest(
     val content: String,
     val isReplyRequest: Boolean,
-    val parentId: Int? = null,
+    val parentId: Long? = null,
     val postType: String,
-)
+) {
+    init {
+        require(content.isNotBlank()) { "content must not be blank" }
+        if (isReplyRequest) {
+            require(parentId != null) { "parentId is required when isReplyRequest = true" }
+        } else {
+            require(parentId == null) { "parentId must be null when isReplyRequest = false" }
+        }
+    }
+}

무결성 체크를 모델에 두는 것이 부담이라면 Repository 레이어에서 요청 생성 전에 동일한 검증을 수행하는 것도 괜찮습니다.


🏁 Script executed:

#!/bin/bash
set -e

echo "🔍 Searching for usages of CommentsCreateRequest in the codebase"
rg "CommentsCreateRequest" -n .

echo "🔍 Searching for all occurrences of parentId to see how it’s consumed"
rg "parentId" -n .

Length of output: 2313


🏁 Script executed:

#!/bin/bash
set -e

echo "🔍 CommentsService.kt 상단 확인"
sed -n '1,200p' app/src/main/java/com/texthip/thip/data/service/CommentsService.kt

echo
echo "🔍 CommentsRepository.kt 주요 메서드 시그니처 확인"
sed -n '1,200p' app/src/main/java/com/texthip/thip/data/repository/CommentsRepository.kt

Length of output: 3197


CommentsCreateRequest의 parentId 타입 일관화 및 무결성 검증 추가 필요
parentId가 댓글 ID이므로 Int→Long으로 변경 시, 요청 모델뿐 아니라 호출부 시그니처도 함께 수정해야 컴파일 오류를 방지할 수 있습니다. 또한 빈 content 전송과 isReplyRequest/parentId 조합을 런타임에 검증하도록 init 블록을 추가하세요.

수정이 필요한 위치:

  • app/src/main/java/com/texthip/thip/data/model/comments/request/CommentsCreateRequest.kt
  • app/src/main/java/com/texthip/thip/data/repository/CommentsRepository.kt (createComment 메서드의 parentId: Int? → Long?)
  • app/src/main/java/com/texthip/thip/ui/group/note/viewmodel/CommentsViewModel.kt (CreateComment 이벤트와 createComment 함수 파라미터)
  • app/src/main/java/com/texthip/thip/ui/group/note/screen/GroupNoteScreen.kt (onSendReply 콜백의 parentId 타입)

예시 변경안 (CommentsCreateRequest.kt):

 @Serializable
 data class CommentsCreateRequest(
     val content: String,
     val isReplyRequest: Boolean,
-    val parentId: Int? = null,
+    val parentId: Long? = null,
     val postType: String,
 ) {
     init {
         require(content.isNotBlank()) { "content must not be blank" }
         if (isReplyRequest) {
             require(parentId != null) { "parentId is required when isReplyRequest = true" }
         } else {
             require(parentId == null) { "parentId must be null when isReplyRequest = false" }
         }
     }
 }

변경 후 전체 빌드 및 테스트를 반드시 확인해주세요.

🤖 Prompt for AI Agents
In
app/src/main/java/com/texthip/thip/data/model/comments/request/CommentsCreateRequest.kt
around lines 7-11, change parentId type from Int? to Long?, add an init block
that validates content is not blank and enforces consistency between
isReplyRequest and parentId (if isReplyRequest==true then parentId must be
non-null, if false then parentId must be null) and throw
IllegalArgumentException on violation; then update all call sites' signatures to
use Long? — specifically update
app/src/main/java/com/texthip/thip/data/repository/CommentsRepository.kt
(createComment parentId: Int? → Long?),
app/src/main/java/com/texthip/thip/ui/group/note/viewmodel/CommentsViewModel.kt
(CreateComment event and createComment function parameter types), and
app/src/main/java/com/texthip/thip/ui/group/note/screen/GroupNoteScreen.kt
(onSendReply callback parentId type) so types match, rebuild and run tests to
ensure no compilation errors.

Comment on lines +6 to +11

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🛠️ Refactor suggestion

⚠️ Potential issue

ID 타입 불일치: parentId를 Long?으로 통일하세요

네트워크 계층(CommentsService)의 Path 파라미터들은 Long을 사용하고 있습니다. 여기에 매핑되는 parentId만 Int?인 것은 타입 불일치로, 장기적으로 오버플로 및 일관성 저하의 원인이 됩니다. 댓글/답글의 식별자는 전반적으로 Long을 사용하는 쪽으로 통일하는 것을 권장합니다.

적용 예시:

 data class CommentsCreateRequest(
     val content: String,
     val isReplyRequest: Boolean,
-    val parentId: Int? = null,
+    val parentId: Long? = null,
     val postType: String,
 )
🤖 Prompt for AI Agents
In
app/src/main/java/com/texthip/thip/data/model/comments/request/CommentsCreateRequest.kt
around lines 6 to 11, parentId is declared as Int? while network layer
(CommentsService) uses Long IDs; change parentId to Long? to align types, update
any constructors/usages and serialization/mapping code that create or consume
CommentsCreateRequest to accept/produce Long values, and run/build tests to
ensure no further Int usages remain.

Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package com.texthip.thip.data.model.comments.request

import kotlinx.serialization.Serializable

@Serializable
data class CommentsLikesRequest(
val type: Boolean
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package com.texthip.thip.data.model.comments.response

import kotlinx.serialization.Serializable

@Serializable
data class CommentsCreateResponse(
val commentId: Int,

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🛠️ Refactor suggestion

ID 타입 일관성: Int → Long으로 변경 권장

댓글·게시글 ID 전반을 Long으로 일관되게 사용하는 편이 안전합니다(특히 Service/Repository에서 Long 사용 중). 응답 commentId도 Long으로 맞추는 것을 제안드립니다.

 data class CommentsCreateResponse(
-    val commentId: Int,
+    val commentId: Long,
 )
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
val commentId: Int,
data class CommentsCreateResponse(
val commentId: Long,
)
🤖 Prompt for AI Agents
In
app/src/main/java/com/texthip/thip/data/model/comments/response/CommentsCreateResponse.kt
around line 7, the commentId is declared as Int but your codebase uses Long for
IDs; change the type to Long to keep ID type consistent, update any
constructor/serialization annotations if needed, and adjust mapping code that
builds CommentsCreateResponse so it assigns the Long id from the entity/service
rather than converting to Int; also update any unit tests or callers expecting
Int to use Long.

)
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package com.texthip.thip.data.model.comments.response

import kotlinx.serialization.Serializable

@Serializable
data class CommentsLikesResponse(
val commentId: Int,

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🛠️ Refactor suggestion

ID 타입 일관성: Int → Long으로 변경 권장

Service 레이어에서 path param이 Long(예: likeComment(commentId: Long))으로 사용되고 있어 응답 모델의 commentId도 Long으로 맞추는 편이 안전합니다. 타입 불일치가 있으면 매핑·캐스팅 비용과 잠재적 오버플로/트렁케이션 이슈가 생길 수 있습니다.

다음과 같이 변경을 제안합니다:

 data class CommentsLikesResponse(
-    val commentId: Int,
+    val commentId: Long,
     val isLiked: Boolean,
 )
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
val commentId: Int,
data class CommentsLikesResponse(
val commentId: Long,
val isLiked: Boolean,
)
🤖 Prompt for AI Agents
In
app/src/main/java/com/texthip/thip/data/model/comments/response/CommentsLikesResponse.kt
around line 7, the commentId field is declared as Int but the service layer
expects Long (e.g., likeComment(commentId: Long)); change the commentId type
from Int to Long to ensure type consistency. Update any related constructors,
data class properties, serialization/deserialization annotations,
equals/hashCode or copy usages, and adjust unit tests or mapping code that
reference this field to use Long so all layers align.

val isLiked: Boolean,
)
Comment on lines +5 to +9

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Verification agent

🧩 Analysis chain

ID 타입 일관성 검토 필요 — Int → Long로 통일 제안

Response의 commentId가 Int인데, Service 계층에서 commentId 매개변수를 Long으로 사용하는 경우가 많습니다. 도메인 전반에서 ID는 Long으로 통일하는 것을 권장합니다. 또한 서버 필드명이 snake_case(comment_id)라면 @SerialName 지정이 필요합니다.

제안 변경:

-import kotlinx.serialization.Serializable
+import kotlinx.serialization.Serializable
+import kotlinx.serialization.SerialName
 
 @Serializable
 data class CommentsLikesResponse(
-    val commentId: Int,
+    /* 서버가 snake_case를 사용한다면 다음과 같이 지정:
+    @SerialName("comment_id")
+    */
+    val commentId: Long,
     val isLiked: Boolean,
 )

검증 스크립트(서비스 시그니처와 다른 모델의 commentId 타입을 조사):


🏁 Script executed:

#!/bin/bash
# CommentsService의 likeComment 시그니처와 commentId 타입을 확인
echo "=== CommentsService likeComment signatures ==="
rg -n -A 3 -B 2 $'interface\\s+CommentsService|likeComment\\s*\\('

echo
echo "=== Response/Model 내 commentId 타입 현황 ==="
rg -n -A 1 -B 1 $'commentId\\s*:\\s*(Int|Long)'

echo
echo "=== Repository 계층에서 likeComment 사용부 ==="
rg -n -A 3 -B 2 $'likeComment\\s*\\('

Length of output: 11283


🏁 Script executed:

#!/bin/bash
# Search for JSON serializer configuration and naming strategies
echo "=== kotlinx.serialization.json.Json instantiations ==="
rg -n "kotlinx.serialization.json.Json" -A 3 -B 3

echo
echo "=== Any custom Json builders or module installs ==="
rg -n "Json\\s*\\{" -A 3 -B 3

echo
echo "=== SerialName usages across models ==="
rg -n "SerialName"

echo
echo "=== References to naming strategy or snake_case ==="
rg -n "snake" -A 2 -B 2

Length of output: 22080


CommentsLikesResponse.commentId → Long 및 @SerialName("comment_id") 적용 제안

CommentsService와 CommentsRepository 모두 commentId를 Long으로 사용하고, 프로젝트 전반에서 ID를 Long으로 통일하고 있습니다. 또한 NetWorkModule에서 snake_case 자동 변환 설정을 사용하지 않으므로, 서버가 comment_id를 반환할 경우 @SerialName을 붙여야 합니다.

• 대상 파일
• app/src/main/java/com/texthip/thip/data/model/comments/response/CommentsLikesResponse.kt

• 제안 변경사항

-import kotlinx.serialization.Serializable
+import kotlinx.serialization.Serializable
+import kotlinx.serialization.SerialName

 @Serializable
 data class CommentsLikesResponse(
-    val commentId: Int,
+    @SerialName("comment_id")
+    val commentId: Long,
     val isLiked: Boolean,
 )
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
@Serializable
data class CommentsLikesResponse(
val commentId: Int,
val isLiked: Boolean,
)
// app/src/main/java/com/texthip/thip/data/model/comments/response/CommentsLikesResponse.kt
import kotlinx.serialization.Serializable
import kotlinx.serialization.SerialName
@Serializable
data class CommentsLikesResponse(
@SerialName("comment_id")
val commentId: Long,
val isLiked: Boolean,
)
🤖 Prompt for AI Agents
In
app/src/main/java/com/texthip/thip/data/model/comments/response/CommentsLikesResponse.kt
around lines 5 to 9, change the commentId property from Int to Long and annotate
it with @SerialName("comment_id") so the model matches
CommentsService/CommentsRepository ID types and the server's snake_case key;
also add the kotlinx.serialization.SerialName import if missing.

Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
package com.texthip.thip.data.model.comments.response

import kotlinx.serialization.Serializable

@Serializable
data class CommentsResponse(
val commentList: List<CommentList>,
val nextCursor: String?,
val isLast: Boolean,
)
Comment on lines +6 to +10

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🛠️ Refactor suggestion

디코딩 탄탄함 확보: 기본값으로 방어적 직렬화

네트워크 응답에서 일부 필드가 누락될 수 있는 상황(서버 진화, 실험 플래그 등)을 고려해 commentList, nextCursor에 기본값을 두면 파싱 실패를 줄일 수 있습니다.

 @Serializable
 data class CommentsResponse(
-    val commentList: List<CommentList>,
-    val nextCursor: String?,
+    val commentList: List<CommentList> = emptyList(),
+    val nextCursor: String? = null,
     val isLast: Boolean,
 )
🤖 Prompt for AI Agents
In
app/src/main/java/com/texthip/thip/data/model/comments/response/CommentsResponse.kt
around lines 6 to 10, the data class lacks defensive defaults so missing fields
in network responses can cause parsing failures; update the primary constructor
to give commentList a default emptyList(), nextCursor a default null (even if
nullable), and isLast a sensible default (e.g., false) so deserialization
succeeds when those fields are absent.


@Serializable
data class CommentList(
val commentId: Int,
val creatorId: Int,
val creatorProfileImageUrl: String,
val creatorNickname: String,
val aliasName: String,
val aliasColor: String,
val postDate: String,
val content: String,
val likeCount: Int,
val isDeleted: Boolean,
val isLike: Boolean,
val replyList: List<ReplyList>,
)
Comment on lines +13 to +26

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🛠️ Refactor suggestion

replyList 기본값으로 파싱 안정성 강화

댓글에 대댓글이 없을 때 서버가 replyList를 생략하는 응답을 줄 경우를 대비하여 기본값을 지정하는 것을 권장합니다. 또한 UI 바인딩 시 널/빈 처리 분기가 단순해집니다.

 @Serializable
 data class CommentList(
@@
-    val replyList: List<ReplyList>,
+    val replyList: List<ReplyList> = emptyList(),
 )
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
data class CommentList(
val commentId: Int,
val creatorId: Int,
val creatorProfileImageUrl: String,
val creatorNickname: String,
val aliasName: String,
val aliasColor: String,
val postDate: String,
val content: String,
val likeCount: Int,
val isDeleted: Boolean,
val isLike: Boolean,
val replyList: List<ReplyList>,
)
@Serializable
data class CommentList(
val commentId: Int,
val creatorId: Int,
val creatorProfileImageUrl: String,
val creatorNickname: String,
val aliasName: String,
val aliasColor: String,
val postDate: String,
val content: String,
val likeCount: Int,
val isDeleted: Boolean,
val isLike: Boolean,
val replyList: List<ReplyList> = emptyList(),
)
🤖 Prompt for AI Agents
In
app/src/main/java/com/texthip/thip/data/model/comments/response/CommentsResponse.kt
around lines 13 to 26, the CommentList data class should provide a default for
replyList so deserialization is stable when the server omits that field; change
the property to have a default value (e.g., replyList: List<ReplyList> =
emptyList()) so callers and UI binding no longer need to handle missing/null
reply lists.


@Serializable
data class ReplyList(
val commentId: Int,
val parentCommentCreatorNickname: String,
val creatorId: Int,
val creatorProfileImageUrl: String,
val creatorNickname: String,
val aliasName: String,
val aliasColor: String,
val postDate: String,
val content: String,
val likeCount: Int,
val isLike: Boolean,
)
Comment on lines +12 to +41

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Verification agent

🧩 Analysis chain

서버 키 네이밍(camelCase/snake_case) 및 직렬화 설정 점검

프로퍼티들이 camelCase입니다. 서버가 snake_case로 응답한다면 @SerialName 매핑 또는 Retrofit의 Kotlinx Serialization 설정이 필요합니다.

다음 스크립트로 프로젝트 내 직렬화 설정과 @SerialName 사용 여부를 점검해 주세요. 예상:

  • Kotlinx Json 설정에서 ignoreUnknownKeys = true 등 옵션 확인
  • Retrofit에 asConverterFactory로 Kotlinx Serialization 연결 여부 확인
  • 기존 모델들에서 @SerialName 사용 패턴 확인

🏁 Script executed:

#!/bin/bash
# 직렬화 설정/사용 패턴 점검
echo "[Json 설정 탐색]"
rg -n "Json\\(" -A 5

echo
echo "[Retrofit + Kotlinx Serialization 연결(asConverterFactory) 탐색]"
rg -n "asConverterFactory|kotlinx.serialization" -A 3

echo
echo "[@SerialName 사용 사례 탐색]"
rg -n "@SerialName\\(" -A 1

echo
echo "[CommentsService/Response 사용처 탐색]"
rg -n "CommentsService|CommentsResponse|CommentList|ReplyList" -A 3

Length of output: 63158


서버 응답 필드 네이밍 일관성 검토 및 직렬화 설정 보완 필요

현재 NetworkModule.provideJson() 에는
• isLenient, prettyPrint, encodeDefaults, explicitNulls 만 설정되어 있으며
• ignoreUnknownKeys 및 snake_case ↔ camelCase 자동 변환(namingStrategy)이 빠져 있습니다.

또한 CommentsResponse.ktCommentList/ReplyList 에는 @SerialName 어노테이션이 없어,
서버가 snake_case 로 응답할 경우 필드 매핑 에러가 발생할 수 있습니다.

다음 중 한 가지 방법으로 수정해주세요.

  • NetworkModule.provideJson() 에 ignoreUnknownKeys = true
    json { …; namingStrategy = JsonNamingStrategy.SnakeCase } 추가
  • CommentList/ReplyList 각 프로퍼티에 @SerialName("snake_case_name") 어노테이션 부여

Retrofit-Kotlinx-Serialization 연결(asConverterFactory)은 정상 확인됐습니다.

🤖 Prompt for AI Agents
In
app/src/main/java/com/texthip/thip/data/model/comments/response/CommentsResponse.kt
around lines 12 to 41, the data classes lack explicit serialization mapping for
snake_case server responses; either enable snake_case handling globally or
annotate fields—Preferred fix: update NetworkModule.provideJson() to set
ignoreUnknownKeys = true and configure namingStrategy =
JsonNamingStrategy.SnakeCase so server snake_case names map to camelCase
properties automatically; alternative fix: add @SerialName("snake_case_name") to
each property in CommentList and ReplyList to match the server field names.

Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ data class RoomsPlayingResponse(
val progressStartDate: String,
val progressEndDate: String,
val category: String,
val categoryColor: String,

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Verification agent

🧩 Analysis chain

신규 비-선택적 필드 추가로 인한 역직렬화/구캐시 크래시 가능 — 기본값 추가 권장

서버가 아직 categoryColor를 안 주거나, 로컬에 구버전 응답 JSON이 캐시되어 있으면 크래시가 발생할 수 있습니다. 기본값을 추가해 방어적으로 처리해 주세요.

-    val categoryColor: String,
+    val categoryColor: String = "#A0F8E8",

또한, 프로젝트 전반에서 수동 생성하는 RoomsPlayingResponse 호출부(미리보기/샘플 데이터 등)가 있다면 인자 개수 불일치가 없는지 확인해 주세요. 아래 스크립트로 사용처를 점검할 수 있습니다.


🏁 Script executed:

#!/bin/bash
# RoomsPlayingResponse 생성자 사용처 점검
rg -n -A 2 $'RoomsPlayingResponse\\('

Length of output: 724


기본값 없는 categoryColor로 인한 역직렬화/캐시 크래시 방지 — 기본값 추가 권장

서버 응답에 categoryColor가 누락되거나 로컬에 구버전 JSON이 캐시된 경우 앱이 크래시할 수 있습니다. 아래와 같이 기본값을 지정해 방어적으로 처리해주세요.

  • 변경 위치:
    app/src/main/java/com/texthip/thip/data/model/rooms/response/RoomsPlayingResponse.kt
    -    val categoryColor: String,
    +    val categoryColor: String = "#A0F8E8",
  • 호출부 점검: RoomsPlayingResponse 수동 생성(GroupRoomScreen.kt 등)
    rg -n -A 2 'RoomsPlayingResponse\('
    확인된 호출 위치:
    app/src/main/java/com/texthip/thip/ui/group/room/screen/GroupRoomScreen.kt
    
    기본값 추가 후 인자 개수 불일치가 없는지 최종 확인 바랍니다.
🤖 Prompt for AI Agents
In
app/src/main/java/com/texthip/thip/data/model/rooms/response/RoomsPlayingResponse.kt
around line 15, the non-nullable property "categoryColor" has no default which
can crash deserialization or when reading cached older JSON; add a sensible
default (e.g., empty string or a defined fallback constant) to the property
declaration so it's optional during construction, then search for manual
instantiations (rg -n -A 2 'RoomsPlayingResponse\(') — notably
app/src/main/java/com/texthip/thip/ui/group/room/screen/GroupRoomScreen.kt — and
update those call sites to either rely on the new default or pass an explicit
value to resolve parameter count mismatches.

val roomDescription: String,
val memberCount: Int,
val recruitCount: Int,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ data class UserList(
val userId: Int,
val nickname: String,
val imageUrl: String,
val aliasColor: String,

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Verification agent

🧩 Analysis chain

서버 응답에 필드 누락 시 역직렬화 실패 위험 — 기본값 추가 권장

kotlinx.serialization에서 비-선택적(non-optional) 필드가 서버 응답에 없으면 MissingFieldException으로 크래시가 납니다. BE/앱 릴리스 타이밍 차이나 구캐시(JSON) 대응을 위해 기본값을 두는 편이 안전합니다.

서버에서 항상 aliasColor를 주는지 확인해 주세요. 주지 않는 경우 아래처럼 기본값을 추가하는 것을 권장합니다.

-    val aliasColor: String,
+    val aliasColor: String = "#A0F8E8",

아래 스크립트로 RoomsUsersResponse.kt 파일 내 aliasColor 정의와 직렬화 설정을 확인해 주세요.


🏁 Script executed:

#!/bin/bash
# RoomsUsersResponse.kt 위치 찾기
file=$(fd RoomsUsersResponse.kt)
echo "Found file: $file"

# 클래스 선언부와 aliasColor 필드 확인
rg -n "data class RoomsUsersResponse" -C5 "$file"
rg -n "aliasColor" -C3 "$file"

Length of output: 963


aliasColor 기본값 지정 권장 — 역직렬화 안정성 확보

kotlinx.serialization에서 non-optional 필드(aliasColor)가 서버 응답에 없을 경우 MissingFieldException이 발생할 수 있습니다. BE/앱 릴리스 타이밍 차이나 캐시된 JSON 대응을 위해 기본값을 추가하는 것을 권장합니다.

  • 파일: app/src/main/java/com/texthip/thip/data/model/rooms/response/RoomsUsersResponse.kt
    • 라인 15: val aliasColor: String
-    val aliasColor: String,
+    val aliasColor: String = "#A0F8E8",
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
val aliasColor: String,
val aliasColor: String = "#A0F8E8",
🤖 Prompt for AI Agents
In
app/src/main/java/com/texthip/thip/data/model/rooms/response/RoomsUsersResponse.kt
around line 15, the non-optional property `val aliasColor: String` can cause
kotlinx.serialization MissingFieldException when the server omits the field;
change the property to provide a safe default (for example `= ""` or a sensible
color like `= "#000000"`) so deserialization succeeds even if the field is
absent, and keep the type as String (no nullable) to minimize call-site changes.

val aliasName: String,
val followerCount: Int,
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
package com.texthip.thip.data.repository

import com.texthip.thip.data.model.base.handleBaseResponse
import com.texthip.thip.data.model.comments.request.CommentsCreateRequest
import com.texthip.thip.data.model.comments.request.CommentsLikesRequest
import com.texthip.thip.data.service.CommentsService
import javax.inject.Inject
import javax.inject.Singleton

@Singleton
class CommentsRepository @Inject constructor(
private val commentsService: CommentsService,
) {
suspend fun getComments(
postId: Long,
postType: String = "RECORD",
cursor: String? = null,
) = runCatching {
commentsService.getComments(
postId = postId,
postType = postType,
cursor = cursor
).handleBaseResponse().getOrThrow()
}
Comment on lines +14 to +24

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🛠️ Refactor suggestion

postType을 String 상수로 노출하지 말고 강타입으로 관리하세요

postType: String = "RECORD"는 오타/변경에 취약합니다. enum class(또는 sealed class)로 강타입화하고 직렬화 시 @SerializedName/@Json 어댑터로 문자열 매핑하는 방식을 권장합니다.

예시(요약):

  • enum class PostType { RECORD, NOTICE, ... }
  • Repository/Service는 postType: PostType을 받고, Retrofit/직렬화에서 문자열로 변환.
🤖 Prompt for AI Agents
In app/src/main/java/com/texthip/thip/data/repository/CommentsRepository.kt
around lines 14–24, the function currently exposes postType as a raw String
defaulting to "RECORD", which is error-prone; change the API to accept a
strong-typed PostType (enum or sealed class) instead of String, update the
repository signature to postType: PostType and convert to the wire string at the
serialization boundary (either annotate enum entries with @SerializedName /
@Json or add a Retrofit/Converter adapter) so Retrofit sends the correct string;
update the CommentsService interface and all callers to use PostType and ensure
serialization mapping is added so no runtime string literals remain.


suspend fun likeComment(
commentId: Long,
type: Boolean
) = runCatching {
commentsService.likeComment(
commentId = commentId,
response = CommentsLikesRequest(type)
).handleBaseResponse().getOrThrow()
}

suspend fun createComment(
postId: Long,
content: String,
isReplyRequest: Boolean,
parentId: Int? = null,
postType: String = "RECORD",
) = runCatching {
commentsService.createComment(
postId = postId,
request = CommentsCreateRequest(
content = content,
isReplyRequest = isReplyRequest,
parentId = parentId,
postType = postType
)
).handleBaseResponse().getOrThrow()
}
Comment on lines +36 to +52

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Verification agent

🧩 Analysis chain

ID 타입 일관성 검토: parentId(Int?) vs commentId(Long)

createCommentparentId: Int?likeCommentcommentId: Long이 혼재합니다. 서버가 Long ID를 사용한다면 전체 레이어(UI 모델/이벤트, ViewModel, Repository, Service, DTO)를 Long으로 통일하는 것이 안전합니다. 혼재 시 변환 과정에서 overflow/호환성 문제가 생길 수 있습니다.

원본 모델/서비스 시그니처의 타입을 점검한 뒤 통일을 제안드립니다. 검색 스크립트:


🏁 Script executed:

#!/bin/bash
# commentId/parentId 타입 선언을 전역 검색
rg -n -A 2 -B 2 $'commentId\\s*:\\s*(Int|Long)|parentId\\s*:\\s*(Int|Long)' app/src/main/java

Length of output: 8010


🏁 Script executed:

#!/bin/bash
# Search for createComment signature in CommentsService.kt
rg -n "createComment" app/src/main/java/com/texthip/thip/data/service/CommentsService.kt

Length of output: 122


🏁 Script executed:

#!/bin/bash
# Get the definition of createComment in CommentsService.kt with context
rg -n -A3 -B3 "suspend fun createComment" app/src/main/java/com/texthip/thip/data/service/CommentsService.kt

Length of output: 364


ID 타입 통일: 댓글 관련 ID를 모두 Long으로 변경 필요

Service(CommentsService)는 Long을 사용하지만, Request/Response DTO와 ViewModel/UI 이벤트는 Int를 사용하고 있어 변환 과정에서 오버플로우나 호환성 문제가 발생할 수 있습니다. 아래 파일들의 ID 타입을 IntLong(nullable 포함)으로 변경하세요.

• app/src/main/java/com/texthip/thip/data/model/comments/request/CommentsCreateRequest.kt

  • parentId: Int? → Long?
    • app/src/main/java/com/texthip/thip/data/model/comments/response/CommentsCreateResponse.kt
  • commentId: Int → Long
    • app/src/main/java/com/texthip/thip/data/model/comments/response/CommentsLikesResponse.kt
  • commentId: Int → Long
    • app/src/main/java/com/texthip/thip/data/model/comments/response/CommentsResponse.kt
  • CommentList.commentId, ReplyList.commentId 등 → Long
    • app/src/main/java/com/texthip/thip/data/repository/CommentsRepository.kt
  • createComment(parentId: Int?) → Long?
    • app/src/main/java/com/texthip/thip/ui/group/note/viewmodel/CommentsViewModel.kt
  • data class LikeComment(val commentId: Int) → Long
  • data class CreateComment(..., val parentId: Int?) → Long?
    • 앱 레이어(UI 컴포넌트)의 이벤트 핸들러(onReplyClick, onEvent 등) 파라미터 타입 수정

예시 diff:

--- CommentsCreateRequest.kt
-    val parentId: Int? = null,
+    val parentId: Long? = null,

--- CommentsCreateResponse.kt
-    val commentId: Int,
+    val commentId: Long,

위 파일들을 포함해 댓글 ID를 다루는 모든 레이어(UI 모델/이벤트, ViewModel, Repository, Service, DTO)에서 Long으로 일관되게 변경해주세요.

Committable suggestion skipped: line range outside the PR's diff.

🤖 Prompt for AI Agents
In app/src/main/java/com/texthip/thip/data/repository/CommentsRepository.kt
around lines 36-52, the createComment signature and internal use still treat
parentId as Int? while the service uses Long; change the repository method
signature to accept parentId: Long? and return Long? (or propagate the service
Long), update the CommentsCreateRequest construction to pass parentId as Long?
(no Int conversions), and ensure the function's return type matches the
DTO/service (Long). Also update all related DTOs, ViewModel event/data classes,
and UI handlers listed in the review to use Long (nullable where applicable) so
ID types are consistent across repository → service → DTO → ViewModel → UI
layers.

}
34 changes: 34 additions & 0 deletions app/src/main/java/com/texthip/thip/data/service/CommentsService.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
package com.texthip.thip.data.service

import com.texthip.thip.data.model.base.BaseResponse
import com.texthip.thip.data.model.comments.request.CommentsCreateRequest
import com.texthip.thip.data.model.comments.request.CommentsLikesRequest
import com.texthip.thip.data.model.comments.response.CommentsCreateResponse
import com.texthip.thip.data.model.comments.response.CommentsLikesResponse
import com.texthip.thip.data.model.comments.response.CommentsResponse
import retrofit2.http.Body
import retrofit2.http.GET
import retrofit2.http.POST
import retrofit2.http.Path
import retrofit2.http.Query

interface CommentsService {
@GET("comments/{postId}")
suspend fun getComments(
@Path("postId") postId: Long,
@Query("postType") postType: String = "RECORD",
@Query("cursor") cursor: String? = null,
): BaseResponse<CommentsResponse>

@POST("comments/{commentId}/likes")
suspend fun likeComment(
@Path("commentId") commentId: Long,
@Body response: CommentsLikesRequest
): BaseResponse<CommentsLikesResponse>

@POST("comments/{postId}")
suspend fun createComment(
@Path("postId") postId: Long,
@Body request: CommentsCreateRequest
): BaseResponse<CommentsCreateResponse>
Comment on lines +29 to +33

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Verification agent

🧩 Analysis chain

createComment의 타입 일관성 점검(IDs Long 통일)

createComment의 Path는 Long(postId)인데, 요청 바디의 parentId가 현재 Int?로 설계되어 있습니다. 상위 모델(CommentsCreateRequest)의 parentId를 Long?으로 정렬해야 합니다. 상단 파일 코멘트를 참고해 일괄 통일을 권장합니다.


🏁 Script executed:

#!/bin/bash
# Locate the CommentsCreateRequest definition to verify the type of parentId
rg "class CommentsCreateRequest" -n .

Length of output: 165


🏁 Script executed:

#!/bin/bash
# 확인: CommentsCreateRequest 내 parentId 타입 조회
rg "parentId" -n app/src/main/java/com/texthip/thip/data/model/comments/request/CommentsCreateRequest.kt

Length of output: 137


parentId 타입을 Long? 으로 통일해주세요

CommentsService.createComment API의 postId가 Long으로 정의되어 있으니, 요청 바디의 parentId도 Long? 으로 변경해 타입 일관성을 유지해야 합니다.

수정 대상:

  • 파일: app/src/main/java/com/texthip/thip/data/model/comments/request/CommentsCreateRequest.kt
  • 라인 9

제안된 변경:

-    val parentId: Int? = null,
+    val parentId: Long? = null,
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
@POST("comments/{postId}")
suspend fun createComment(
@Path("postId") postId: Long,
@Body request: CommentsCreateRequest
): BaseResponse<CommentsCreateResponse>
// app/src/main/java/com/texthip/thip/data/model/comments/request/CommentsCreateRequest.kt
data class CommentsCreateRequest(
val postId: Long,
val content: String,
val parentId: Long? = null
)
🤖 Prompt for AI Agents
In
app/src/main/java/com/texthip/thip/data/model/comments/request/CommentsCreateRequest.kt
around line 9, the parentId property is not nullable while the API's postId is
defined as Long; update the parentId type to Long? (make it nullable) so the
request model matches the service expectations; ensure any usages and
constructor/defaults accommodate the nullable type.

}
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ fun ProfileBar(
profileImage: String,
topText: String,
bottomText: String,
bottomTextColor: Color = colors.NeonGreen, // todo: 서버에서 색 보내주는걸로 받기?
bottomTextColor: Color = colors.NeonGreen,
showSubscriberInfo: Boolean,
subscriberCount: Int = 0,
hoursAgo: String = "",
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
package com.texthip.thip.ui.common.header

import androidx.compose.foundation.Image
import androidx.compose.foundation.background
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Box
Expand All @@ -18,16 +17,16 @@ 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.graphics.painter.Painter
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
import coil.compose.AsyncImage
import com.texthip.thip.ui.theme.ThipTheme
import com.texthip.thip.ui.theme.ThipTheme.colors
import com.texthip.thip.ui.theme.ThipTheme.typography

@Composable
fun ProfileBarFeed(
profileImage: Painter?,
profileImage: String?,
nickname: String,
genreName: String,
genreColor: Color = colors.NeonGreen,
Expand All @@ -41,8 +40,8 @@ fun ProfileBarFeed(
) {
Row {
if (profileImage != null) {
Image(
painter = profileImage,
AsyncImage(
model = profileImage,
contentDescription = "프로필 이미지",
modifier = Modifier
.size(24.dp)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -48,12 +48,8 @@ import com.texthip.thip.ui.common.forms.CommentTextField
import com.texthip.thip.ui.common.header.ProfileBar
import com.texthip.thip.ui.common.modal.DialogPopup
import com.texthip.thip.ui.common.topappbar.DefaultTopAppBar
import com.texthip.thip.ui.group.note.component.CommentItem
import com.texthip.thip.ui.group.note.component.ReplyItem
import com.texthip.thip.ui.feed.component.ImageViewerModal
import com.texthip.thip.ui.feed.mock.FeedItemType
import com.texthip.thip.ui.group.note.component.CommentItem
import com.texthip.thip.ui.group.note.component.ReplyItem
import com.texthip.thip.ui.group.note.mock.mockCommentList
import com.texthip.thip.ui.group.room.mock.MenuBottomSheetItem
import com.texthip.thip.ui.mypage.mock.FeedItem
Expand Down Expand Up @@ -241,10 +237,10 @@ fun FeedCommentScreen(
)
}
) {
CommentItem(
data = commentItem,
onReplyClick = { replyTo.value = it }
)
// CommentItem(
// data = commentItem,
// onReplyClick = { replyTo.value = it }
// )
}
Comment on lines +240 to 244

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue

댓글 UI가 비활성화되어 사용자에게 보이지 않습니다

핵심 렌더링인 CommentItem이 주석 처리되어 댓글이 표시되지 않습니다. PR 목적(댓글 API 연동)과 어긋날 수 있어, 최소한 기능 플래그로 제어하거나 즉시 복구를 권장합니다.

즉시 복구 예시(필요시 import com.texthip.thip.ui.group.note.component.CommentItem 추가):

-//                                CommentItem(
-//                                    data = commentItem,
-//                                    onReplyClick = { replyTo.value = it }
-//                                )
+                                CommentItem(
+                                    data = commentItem,
+                                    onReplyClick = { replyTo.value = it }
+                                )

의도적으로 임시 비활성화라면, 빌드 플래그/실험 플래그로 제어해 회귀를 방지해 주세요:

val showCommentsUi = true // or BuildConfig.FEATURE_FEED_COMMENTS
if (showCommentsUi) {
    CommentItem(...)
}
🤖 Prompt for AI Agents
In app/src/main/java/com/texthip/thip/ui/feed/screen/FeedCommentScreen.kt around
lines 240 to 244, the core CommentItem rendering is commented out so comments
are hidden; restore visibility by uncommenting the CommentItem call or
conditionally rendering it behind a feature/build flag (e.g., use a boolean or
BuildConfig.FEATURE_FEED_COMMENTS and wrap the CommentItem in an if), and add
the required import com.texthip.thip.ui.group.note.component.CommentItem if
missing; ensure the onReplyClick handler (replyTo.value = it) is preserved when
restoring the UI.

Comment on lines +240 to 244

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue

회귀 위험: 댓글 아이템 렌더링이 주석 처리되어 UI가 비어 보입니다

주석 처리로 인해 CommentList가 비어있지 않아도 실제 댓글 본문이 화면에 표시되지 않습니다. 최소한의 폴백 UI라도 렌더링하도록 복구하시길 권장합니다.

간단 폴백 렌더링(해당 블록 대체):

-//                                CommentItem(
-//                                    data = commentItem,
-//                                    onReplyClick = { replyTo.value = it }
-//                                )
+                                Column {
+                                    Text(
+                                        text = commentItem.nickName,
+                                        style = typography.view_m500_s14,
+                                        color = colors.White
+                                    )
+                                    Spacer(modifier = Modifier.height(4.dp))
+                                    Text(
+                                        text = commentItem.content,
+                                        style = typography.feedcopy_r400_s14_h20,
+                                        color = colors.White
+                                    )
+                                }

주의: 새로운 통합 코멘트 UI(뷰모델/상태 기반)로 대체 예정이라면, 해당 연결 전까지 임시 폴백을 유지해 사용자 경험 저하를 방지하세요.

🤖 Prompt for AI Agents
app/src/main/java/com/texthip/thip/ui/feed/screen/FeedCommentScreen.kt around
lines 240-244: the CommentItem rendering was commented out leaving the comment
area visually empty; restore rendering by uncommenting the CommentItem block so
each commentItem is shown (or, if you must keep the new integrated comment UI
pending, implement a minimal fallback render here that maps commentItem ->
simple Text/Row showing author and body when the comment list is non-empty), and
ensure reply click wiring (onReplyClick = { replyTo.value = it }) is preserved
until the new viewmodel/state-based UI is fully integrated.

if (selectedComment == commentItem) {
Row(
Expand Down Expand Up @@ -304,7 +300,7 @@ fun FeedCommentScreen(
)
}
) {
ReplyItem(data = reply, onReplyClick = { replyTo.value = it })
// ReplyItem(data = reply, onReplyClick = { replyTo.value = it })

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue

대댓글 UI도 비활성화되어 있습니다

ReplyItem 주석 처리로 대댓글이 표시되지 않습니다. 상위와 동일하게 복구 또는 플래그 제어를 권장합니다.

복구 예시(필요시 import com.texthip.thip.ui.group.note.component.ReplyItem 추가):

-//                                    ReplyItem(data = reply, onReplyClick = { replyTo.value = it })
+                                    ReplyItem(data = reply, onReplyClick = { replyTo.value = it })
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
// ReplyItem(data = reply, onReplyClick = { replyTo.value = it })
ReplyItem(data = reply, onReplyClick = { replyTo.value = it })
🤖 Prompt for AI Agents
In app/src/main/java/com/texthip/thip/ui/feed/screen/FeedCommentScreen.kt around
line 303, the ReplyItem call is commented out so nested replies (대댓글) are not
rendered; restore the ReplyItem invocation (uncomment the line) or reintroduce a
feature flag/parameter to control visibility, and if necessary add the import
com.texthip.thip.ui.group.note.component.ReplyItem; ensure the onReplyClick
handler wires replyTo.value as before.

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue

회귀 위험: 대댓글 아이템 렌더링도 주석 처리됨

ReplyItem 주석 처리로 대댓글도 표시되지 않습니다. 최소 폴백 UI를 표시해 기능 공백을 피하세요.

간단 폴백 렌더링(해당 라인 교체):

-//                                    ReplyItem(data = reply, onReplyClick = { replyTo.value = it })
+                                    Column {
+                                        Text(
+                                            text = "${reply.nickName} ↪ ${reply.parentNickname}",
+                                            style = typography.info_r400_s12,
+                                            color = colors.Grey01
+                                        )
+                                        Spacer(modifier = Modifier.height(2.dp))
+                                        Text(
+                                            text = reply.content,
+                                            style = typography.feedcopy_r400_s14_h20,
+                                            color = colors.White
+                                        )
+                                    }
🤖 Prompt for AI Agents
In app/src/main/java/com/texthip/thip/ui/feed/screen/FeedCommentScreen.kt around
line 303, the ReplyItem call is commented out which hides all child replies;
restore reply rendering but provide a simple fallback UI to avoid regression:
replace the commented line with logic that renders ReplyItem when available and
otherwise renders a minimal fallback (e.g., a small clickable "View replies
(N)"/count text or simple label) that preserves accessibility and click handling
to open replies; ensure the fallback shows the reply count and invokes the same
onReplyClick/navigation behavior as ReplyItem.

}

if (selectedReply == reply) {
Expand Down
Loading