From 763153afd8ab2ac2530fecad549f93475d7c074f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=84=8C=E1=85=A5=E1=86=BC=E1=84=89=E1=85=B3=E1=86=BC?= =?UTF-8?q?=E1=84=92=E1=85=AE=E1=86=AB?= Date: Tue, 14 Nov 2023 16:52:24 +0900 Subject: [PATCH 1/7] =?UTF-8?q?=E2=9A=A1=EF=B8=8F=20::=20=EB=8C=93?= =?UTF-8?q?=EA=B8=80=20=EC=9E=91=EC=84=B1=20=EB=8D=B0=EC=9D=B4=ED=84=B0=20?= =?UTF-8?q?=EB=AA=A8=EB=93=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- data/src/main/kotlin/com/signal/data/api/FeedApi.kt | 9 ++++++++- data/src/main/kotlin/com/signal/data/api/SignalUrl.kt | 3 ++- .../com/signal/data/datasource/feed/FeedDataSource.kt | 6 ++++++ .../signal/data/datasource/feed/FeedDataSourceImpl.kt | 11 +++++++++++ .../data/model/feed/request/CreatePostRequest.kt | 7 +++++++ .../com/signal/data/repository/FeedRepositoryImpl.kt | 11 +++++++++++ 6 files changed, 45 insertions(+), 2 deletions(-) create mode 100644 data/src/main/kotlin/com/signal/data/model/feed/request/CreatePostRequest.kt diff --git a/data/src/main/kotlin/com/signal/data/api/FeedApi.kt b/data/src/main/kotlin/com/signal/data/api/FeedApi.kt index 66450279..c2b8cdc4 100644 --- a/data/src/main/kotlin/com/signal/data/api/FeedApi.kt +++ b/data/src/main/kotlin/com/signal/data/api/FeedApi.kt @@ -1,5 +1,6 @@ package com.signal.data.api +import com.signal.data.model.feed.request.CreatePostRequest import com.signal.data.model.feed.request.PostRequest import com.signal.data.model.feed.response.FetchPostCommentsResponse import com.signal.data.model.feed.response.FetchPostDetailsResponse @@ -29,8 +30,14 @@ interface FeedApi { @Path("feed_id") feedId: Long, ): FetchPostDetailsResponse - @GET(SignalUrl.Feed.Comment) + @GET(SignalUrl.Feed.Comments) suspend fun fetchPostComments( @Path("feed_id") feedId: Long, ): FetchPostCommentsResponse + + @POST(SignalUrl.Feed.CreateComment) + suspend fun createComment( + @Path("feed_id") feedId: Long, + @Body createPostRequest: CreatePostRequest, + ) } diff --git a/data/src/main/kotlin/com/signal/data/api/SignalUrl.kt b/data/src/main/kotlin/com/signal/data/api/SignalUrl.kt index d6ecbda4..9216a436 100644 --- a/data/src/main/kotlin/com/signal/data/api/SignalUrl.kt +++ b/data/src/main/kotlin/com/signal/data/api/SignalUrl.kt @@ -16,7 +16,8 @@ object SignalUrl { const val CreatePost = "$feed/user" const val List = "$feed/list" const val Details = "$feed/{feed_id}" - const val Comment = "$feed/comment" + const val Comments = "$feed/comment" + const val CreateComment = "$feed/{feed_id}" } object Attachment { diff --git a/data/src/main/kotlin/com/signal/data/datasource/feed/FeedDataSource.kt b/data/src/main/kotlin/com/signal/data/datasource/feed/FeedDataSource.kt index 86cf89f7..2cfb0d11 100644 --- a/data/src/main/kotlin/com/signal/data/datasource/feed/FeedDataSource.kt +++ b/data/src/main/kotlin/com/signal/data/datasource/feed/FeedDataSource.kt @@ -1,5 +1,6 @@ package com.signal.data.datasource.feed +import com.signal.data.model.feed.request.CreatePostRequest import com.signal.data.model.feed.request.PostRequest import com.signal.data.model.feed.response.FetchPostCommentsResponse import com.signal.data.model.feed.response.FetchPostDetailsResponse @@ -18,4 +19,9 @@ interface FeedDataSource { suspend fun fetchPostDetails(feedId: Long): FetchPostDetailsResponse suspend fun fetchPostComments(feedId: Long): FetchPostCommentsResponse + + suspend fun createComment( + feedId: Long, + createPostRequest: CreatePostRequest, + ) } diff --git a/data/src/main/kotlin/com/signal/data/datasource/feed/FeedDataSourceImpl.kt b/data/src/main/kotlin/com/signal/data/datasource/feed/FeedDataSourceImpl.kt index 8b1c90ec..a7638b8d 100644 --- a/data/src/main/kotlin/com/signal/data/datasource/feed/FeedDataSourceImpl.kt +++ b/data/src/main/kotlin/com/signal/data/datasource/feed/FeedDataSourceImpl.kt @@ -1,6 +1,7 @@ package com.signal.data.datasource.feed import com.signal.data.api.FeedApi +import com.signal.data.model.feed.request.CreatePostRequest import com.signal.data.model.feed.request.PostRequest import com.signal.data.model.feed.response.FetchPostCommentsResponse import com.signal.data.model.feed.response.FetchPostDetailsResponse @@ -37,4 +38,14 @@ class FeedDataSourceImpl( ExceptionHandler().httpRequest { feedApi.fetchPostComments(feedId = feedId) }.sendRequest() + + override suspend fun createComment( + feedId: Long, + createPostRequest: CreatePostRequest, + ) = ExceptionHandler().httpRequest { + feedApi.createComment( + feedId = feedId, + createPostRequest = createPostRequest, + ) + }.sendRequest() } diff --git a/data/src/main/kotlin/com/signal/data/model/feed/request/CreatePostRequest.kt b/data/src/main/kotlin/com/signal/data/model/feed/request/CreatePostRequest.kt new file mode 100644 index 00000000..5ccaefdf --- /dev/null +++ b/data/src/main/kotlin/com/signal/data/model/feed/request/CreatePostRequest.kt @@ -0,0 +1,7 @@ +package com.signal.data.model.feed.request + +import com.google.gson.annotations.SerializedName + +data class CreatePostRequest( + @SerializedName("content") val content: String, +) diff --git a/data/src/main/kotlin/com/signal/data/repository/FeedRepositoryImpl.kt b/data/src/main/kotlin/com/signal/data/repository/FeedRepositoryImpl.kt index 946b6504..62dff0ff 100644 --- a/data/src/main/kotlin/com/signal/data/repository/FeedRepositoryImpl.kt +++ b/data/src/main/kotlin/com/signal/data/repository/FeedRepositoryImpl.kt @@ -1,6 +1,7 @@ package com.signal.data.repository import com.signal.data.datasource.feed.FeedDataSource +import com.signal.data.model.feed.request.CreatePostRequest import com.signal.data.model.feed.request.PostRequest import com.signal.data.model.feed.response.toEntity import com.signal.domain.PostsEntity @@ -43,4 +44,14 @@ class FeedRepositoryImpl( override suspend fun fetchPostComments(feedId: Long) = runCatching { feedDataSource.fetchPostComments(feedId = feedId).toEntity() } + + override suspend fun createComment( + feedId: Long, + content: String, + ) = kotlin.runCatching { + feedDataSource.createComment( + feedId = feedId, + createPostRequest = CreatePostRequest(content = content), + ) + } } From b8f3141f55ced3fb3fa8ac56e2447f4c6403d963 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=84=8C=E1=85=A5=E1=86=BC=E1=84=89=E1=85=B3=E1=86=BC?= =?UTF-8?q?=E1=84=92=E1=85=AE=E1=86=AB?= Date: Tue, 14 Nov 2023 16:54:15 +0900 Subject: [PATCH 2/7] =?UTF-8?q?=E2=9A=A1=EF=B8=8F=20::=20=EB=8C=93?= =?UTF-8?q?=EA=B8=80=20=EC=9E=91=EC=84=B1=20=EC=95=B1=20=EB=AA=A8=EB=93=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/repository/FeedRepository.kt | 5 +++++ .../feature/main/feed/CommentDialog.kt | 10 ++++++---- .../feature/main/feed/FeedDetails.kt | 2 ++ .../feature/main/feed/FeedState.kt | 2 ++ .../feature/main/feed/FeedViewModel.kt | 19 +++++++++++++++++++ 5 files changed, 34 insertions(+), 4 deletions(-) diff --git a/domain/src/main/kotlin/com/signal/domain/repository/FeedRepository.kt b/domain/src/main/kotlin/com/signal/domain/repository/FeedRepository.kt index 5733387f..f383832d 100644 --- a/domain/src/main/kotlin/com/signal/domain/repository/FeedRepository.kt +++ b/domain/src/main/kotlin/com/signal/domain/repository/FeedRepository.kt @@ -22,4 +22,9 @@ interface FeedRepository { suspend fun fetchPostDetails(feedId: Long): Result suspend fun fetchPostComments(feedId: Long): Result + + suspend fun createComment( + feedId: Long, + content: String, + ): Result } diff --git a/presentation/src/main/java/com/signal/signal_android/feature/main/feed/CommentDialog.kt b/presentation/src/main/java/com/signal/signal_android/feature/main/feed/CommentDialog.kt index 3793e100..ad42655c 100644 --- a/presentation/src/main/java/com/signal/signal_android/feature/main/feed/CommentDialog.kt +++ b/presentation/src/main/java/com/signal/signal_android/feature/main/feed/CommentDialog.kt @@ -40,6 +40,8 @@ import com.signal.signal_android.designsystem.textfield.SignalTextField internal fun CommentDialog( state: FeedState, fetchPostComments: suspend () -> Unit, + createComment: () -> Unit, + onCommentChange: (String) -> Unit, ) { LaunchedEffect(Unit) { fetchPostComments() @@ -81,9 +83,9 @@ internal fun CommentDialog( .imePadding(), ) { Input( - comment = { "comment" }, - onCommentChange = { }, - onClick = {}, + comment = { state.comment }, + onCommentChange = onCommentChange, + onClick = createComment, ) } } @@ -101,7 +103,7 @@ private fun Input( ) { SignalTextField( modifier = Modifier.fillMaxWidth(0.8f), - value = "", + value = comment(), onValueChange = onCommentChange, hint = stringResource(id = R.string.comment_dialog_input_comment), ) diff --git a/presentation/src/main/java/com/signal/signal_android/feature/main/feed/FeedDetails.kt b/presentation/src/main/java/com/signal/signal_android/feature/main/feed/FeedDetails.kt index 8965cd5a..358acc8c 100644 --- a/presentation/src/main/java/com/signal/signal_android/feature/main/feed/FeedDetails.kt +++ b/presentation/src/main/java/com/signal/signal_android/feature/main/feed/FeedDetails.kt @@ -94,6 +94,8 @@ internal fun FeedDetails( CommentDialog( state = state, fetchPostComments = feedViewModel::fetchPostComments, + createComment = feedViewModel::createComment, + onCommentChange = feedViewModel::setComment, ) }, sheetState = sheetState, diff --git a/presentation/src/main/java/com/signal/signal_android/feature/main/feed/FeedState.kt b/presentation/src/main/java/com/signal/signal_android/feature/main/feed/FeedState.kt index b23c8355..de8a92c7 100644 --- a/presentation/src/main/java/com/signal/signal_android/feature/main/feed/FeedState.kt +++ b/presentation/src/main/java/com/signal/signal_android/feature/main/feed/FeedState.kt @@ -17,6 +17,7 @@ data class FeedState( val feedId: Long, val image: String, val comments: List, + val comment: String, ) { companion object { fun getDefaultState() = FeedState( @@ -39,6 +40,7 @@ data class FeedState( feedId = 0L, image = "", comments = listOf(), + comment = "" ) } } diff --git a/presentation/src/main/java/com/signal/signal_android/feature/main/feed/FeedViewModel.kt b/presentation/src/main/java/com/signal/signal_android/feature/main/feed/FeedViewModel.kt index 187b0a03..5b4f5e22 100644 --- a/presentation/src/main/java/com/signal/signal_android/feature/main/feed/FeedViewModel.kt +++ b/presentation/src/main/java/com/signal/signal_android/feature/main/feed/FeedViewModel.kt @@ -88,6 +88,21 @@ internal class FeedViewModel( } } + internal fun createComment() { + with(state.value) { + viewModelScope.launch(Dispatchers.IO) { + feedRepository.createComment( + feedId = feedId, + content = comment, + ).onSuccess { + + }.onFailure { + + } + } + } + } + internal fun setTitle(title: String) { setState(state.value.copy(title = title)) } @@ -107,4 +122,8 @@ internal class FeedViewModel( fetchPosts() } } + + internal fun setComment(comment: String){ + setState(state.value.copy(comment = comment)) + } } From 26a1898ccdbed7c7fcfd15de08e8dadb0bee945f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=84=8C=E1=85=A5=E1=86=BC=E1=84=89=E1=85=B3=E1=86=BC?= =?UTF-8?q?=E1=84=92=E1=85=AE=E1=86=AB?= Date: Tue, 14 Nov 2023 18:50:28 +0900 Subject: [PATCH 3/7] =?UTF-8?q?=E2=9A=A1=EF=B8=8F=20::=20=EB=8C=93?= =?UTF-8?q?=EA=B8=80=20=EC=9C=A0=EC=A0=80=20=ED=94=84=EB=A1=9C=ED=95=84=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../kotlin/com/signal/data/api/FeedApi.kt | 4 ++-- .../data/datasource/feed/FeedDataSource.kt | 4 ++-- .../datasource/feed/FeedDataSourceImpl.kt | 4 ++-- ...tsResponse.kt => FetchCommentsResponse.kt} | 8 +++++--- .../domain/entity/PostCommentsEntity.kt | 1 + .../signal_android/feature/main/feed/Feed.kt | 20 ++++++++++++------- .../feature/main/feed/FeedState.kt | 2 +- .../feature/main/feed/FeedViewModel.kt | 5 +++-- 8 files changed, 29 insertions(+), 19 deletions(-) rename data/src/main/kotlin/com/signal/data/model/feed/response/{FetchPostCommentsResponse.kt => FetchCommentsResponse.kt} (72%) diff --git a/data/src/main/kotlin/com/signal/data/api/FeedApi.kt b/data/src/main/kotlin/com/signal/data/api/FeedApi.kt index c2b8cdc4..2f318b58 100644 --- a/data/src/main/kotlin/com/signal/data/api/FeedApi.kt +++ b/data/src/main/kotlin/com/signal/data/api/FeedApi.kt @@ -2,7 +2,7 @@ package com.signal.data.api import com.signal.data.model.feed.request.CreatePostRequest import com.signal.data.model.feed.request.PostRequest -import com.signal.data.model.feed.response.FetchPostCommentsResponse +import com.signal.data.model.feed.response.FetchCommentsResponse import com.signal.data.model.feed.response.FetchPostDetailsResponse import com.signal.data.model.feed.response.FetchPostsResponse import com.signal.domain.enums.Tag @@ -33,7 +33,7 @@ interface FeedApi { @GET(SignalUrl.Feed.Comments) suspend fun fetchPostComments( @Path("feed_id") feedId: Long, - ): FetchPostCommentsResponse + ): FetchCommentsResponse @POST(SignalUrl.Feed.CreateComment) suspend fun createComment( diff --git a/data/src/main/kotlin/com/signal/data/datasource/feed/FeedDataSource.kt b/data/src/main/kotlin/com/signal/data/datasource/feed/FeedDataSource.kt index 2cfb0d11..d036ac3e 100644 --- a/data/src/main/kotlin/com/signal/data/datasource/feed/FeedDataSource.kt +++ b/data/src/main/kotlin/com/signal/data/datasource/feed/FeedDataSource.kt @@ -2,7 +2,7 @@ package com.signal.data.datasource.feed import com.signal.data.model.feed.request.CreatePostRequest import com.signal.data.model.feed.request.PostRequest -import com.signal.data.model.feed.response.FetchPostCommentsResponse +import com.signal.data.model.feed.response.FetchCommentsResponse import com.signal.data.model.feed.response.FetchPostDetailsResponse import com.signal.data.model.feed.response.FetchPostsResponse import com.signal.domain.enums.Tag @@ -18,7 +18,7 @@ interface FeedDataSource { suspend fun fetchPostDetails(feedId: Long): FetchPostDetailsResponse - suspend fun fetchPostComments(feedId: Long): FetchPostCommentsResponse + suspend fun fetchPostComments(feedId: Long): FetchCommentsResponse suspend fun createComment( feedId: Long, diff --git a/data/src/main/kotlin/com/signal/data/datasource/feed/FeedDataSourceImpl.kt b/data/src/main/kotlin/com/signal/data/datasource/feed/FeedDataSourceImpl.kt index a7638b8d..fb1770a0 100644 --- a/data/src/main/kotlin/com/signal/data/datasource/feed/FeedDataSourceImpl.kt +++ b/data/src/main/kotlin/com/signal/data/datasource/feed/FeedDataSourceImpl.kt @@ -3,7 +3,7 @@ package com.signal.data.datasource.feed import com.signal.data.api.FeedApi import com.signal.data.model.feed.request.CreatePostRequest import com.signal.data.model.feed.request.PostRequest -import com.signal.data.model.feed.response.FetchPostCommentsResponse +import com.signal.data.model.feed.response.FetchCommentsResponse import com.signal.data.model.feed.response.FetchPostDetailsResponse import com.signal.data.model.feed.response.FetchPostsResponse import com.signal.data.util.ExceptionHandler @@ -35,7 +35,7 @@ class FeedDataSourceImpl( }.sendRequest() override suspend fun fetchPostComments(feedId: Long) = - ExceptionHandler().httpRequest { + ExceptionHandler().httpRequest { feedApi.fetchPostComments(feedId = feedId) }.sendRequest() diff --git a/data/src/main/kotlin/com/signal/data/model/feed/response/FetchPostCommentsResponse.kt b/data/src/main/kotlin/com/signal/data/model/feed/response/FetchCommentsResponse.kt similarity index 72% rename from data/src/main/kotlin/com/signal/data/model/feed/response/FetchPostCommentsResponse.kt rename to data/src/main/kotlin/com/signal/data/model/feed/response/FetchCommentsResponse.kt index ff3591a6..f0ebe747 100644 --- a/data/src/main/kotlin/com/signal/data/model/feed/response/FetchPostCommentsResponse.kt +++ b/data/src/main/kotlin/com/signal/data/model/feed/response/FetchCommentsResponse.kt @@ -4,7 +4,7 @@ import com.google.gson.annotations.SerializedName import com.signal.domain.entity.PostCommentsEntity import java.time.LocalDateTime -data class FetchPostCommentsResponse( +data class FetchCommentsResponse( @SerializedName("comment") val comments: List, ) { data class Comment( @@ -12,16 +12,18 @@ data class FetchPostCommentsResponse( @SerializedName("content") val content: String, @SerializedName("is_mine") val isMine: Boolean, @SerializedName("date_time") val dateTime: LocalDateTime, + @SerializedName("profile") val profile: String, ) } -fun FetchPostCommentsResponse.toEntity() = PostCommentsEntity( +fun FetchCommentsResponse.toEntity() = PostCommentsEntity( comments = this.comments.map { it.toEntity() }, ) -fun FetchPostCommentsResponse.Comment.toEntity() = PostCommentsEntity.CommentEntity( +fun FetchCommentsResponse.Comment.toEntity() = PostCommentsEntity.CommentEntity( writer = this.writer, content = this.content, isMine = this.isMine, dateTime = this.dateTime, + profile = this.profile, ) diff --git a/domain/src/main/kotlin/com/signal/domain/entity/PostCommentsEntity.kt b/domain/src/main/kotlin/com/signal/domain/entity/PostCommentsEntity.kt index 72ba9261..ee9334ec 100644 --- a/domain/src/main/kotlin/com/signal/domain/entity/PostCommentsEntity.kt +++ b/domain/src/main/kotlin/com/signal/domain/entity/PostCommentsEntity.kt @@ -10,5 +10,6 @@ data class PostCommentsEntity( val content: String, val isMine: Boolean, val dateTime: LocalDateTime, + val profile: String, ) } diff --git a/presentation/src/main/java/com/signal/signal_android/feature/main/feed/Feed.kt b/presentation/src/main/java/com/signal/signal_android/feature/main/feed/Feed.kt index af425f54..80982da2 100644 --- a/presentation/src/main/java/com/signal/signal_android/feature/main/feed/Feed.kt +++ b/presentation/src/main/java/com/signal/signal_android/feature/main/feed/Feed.kt @@ -36,6 +36,7 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.draw.alpha import androidx.compose.ui.draw.clip import androidx.compose.ui.draw.shadow +import androidx.compose.ui.layout.ContentScale import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource import androidx.compose.ui.unit.dp @@ -73,7 +74,7 @@ internal fun Feed( ) LaunchedEffect(Unit) { - if(state.isPostsEmpty) { + if (state.isPostsEmpty) { feedViewModel.fetchPosts() } } @@ -292,11 +293,16 @@ internal fun Post( .padding(12.dp), verticalAlignment = Alignment.CenterVertically, ) { - AsyncImage( - modifier = Modifier.size(48.dp), - model = imageUrl, - contentDescription = stringResource(id = R.string.feed_image), - ) + imageUrl?.run { + AsyncImage( + modifier = Modifier + .size(48.dp) + .clip(RoundedCornerShape(4.dp)), + model = this, + contentDescription = stringResource(id = R.string.feed_image), + contentScale = ContentScale.Crop, + ) + } Spacer(modifier = Modifier.width(8.dp)) Column(verticalArrangement = Arrangement.Center) { Row( @@ -316,7 +322,7 @@ internal fun Post( FeedDropDownMenu( expanded = expanded, onDismissRequest = onDismissRequest, - isMine = false, + isMine = true, onEdit = onEdit, onDelete = onDelete, onReport = onReport, diff --git a/presentation/src/main/java/com/signal/signal_android/feature/main/feed/FeedState.kt b/presentation/src/main/java/com/signal/signal_android/feature/main/feed/FeedState.kt index de8a92c7..dc600771 100644 --- a/presentation/src/main/java/com/signal/signal_android/feature/main/feed/FeedState.kt +++ b/presentation/src/main/java/com/signal/signal_android/feature/main/feed/FeedState.kt @@ -23,7 +23,7 @@ data class FeedState( fun getDefaultState() = FeedState( posts = listOf(), tag = Tag.GENERAL, - page = 1, + page = 0, size = 8, isPostsEmpty = true, title = "", diff --git a/presentation/src/main/java/com/signal/signal_android/feature/main/feed/FeedViewModel.kt b/presentation/src/main/java/com/signal/signal_android/feature/main/feed/FeedViewModel.kt index 5b4f5e22..06179dc8 100644 --- a/presentation/src/main/java/com/signal/signal_android/feature/main/feed/FeedViewModel.kt +++ b/presentation/src/main/java/com/signal/signal_android/feature/main/feed/FeedViewModel.kt @@ -81,6 +81,7 @@ internal class FeedViewModel( with(state.value) { viewModelScope.launch(Dispatchers.IO) { feedRepository.fetchPostComments(feedId).onSuccess { + _comments.clear() _comments.addAll(it.comments) setState(copy(comments = _comments)) } @@ -95,7 +96,7 @@ internal class FeedViewModel( feedId = feedId, content = comment, ).onSuccess { - + fetchPostComments() }.onFailure { } @@ -123,7 +124,7 @@ internal class FeedViewModel( } } - internal fun setComment(comment: String){ + internal fun setComment(comment: String) { setState(state.value.copy(comment = comment)) } } From fd37d8ae8cbb77b0e3b094d676723baaf6e46130 Mon Sep 17 00:00:00 2001 From: Tmdhoon2 Date: Tue, 14 Nov 2023 19:30:59 +0900 Subject: [PATCH 4/7] =?UTF-8?q?=E2=99=BB=EF=B8=8F=20::=20=EB=8C=93?= =?UTF-8?q?=EA=B8=80=20=EC=A1=B0=ED=9A=8C=20url=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- data/src/main/kotlin/com/signal/data/api/SignalUrl.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/data/src/main/kotlin/com/signal/data/api/SignalUrl.kt b/data/src/main/kotlin/com/signal/data/api/SignalUrl.kt index 9216a436..fd750249 100644 --- a/data/src/main/kotlin/com/signal/data/api/SignalUrl.kt +++ b/data/src/main/kotlin/com/signal/data/api/SignalUrl.kt @@ -16,7 +16,7 @@ object SignalUrl { const val CreatePost = "$feed/user" const val List = "$feed/list" const val Details = "$feed/{feed_id}" - const val Comments = "$feed/comment" + const val Comments = "$feed/comment/{feed_id}" const val CreateComment = "$feed/{feed_id}" } From 7acf63aeac6093d4669b77f7ed1184f9b7ab25ab Mon Sep 17 00:00:00 2001 From: Tmdhoon2 Date: Tue, 14 Nov 2023 19:42:58 +0900 Subject: [PATCH 5/7] =?UTF-8?q?=E2=9A=A1=EF=B8=8F=20::=20=EB=8C=93?= =?UTF-8?q?=EA=B8=80=20clear=20focus?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../feature/main/feed/CommentDialog.kt | 26 +++++++++++++------ .../signal_android/feature/main/feed/Feed.kt | 6 ++++- .../feature/main/feed/FeedDetails.kt | 8 ++---- .../feature/main/feed/FeedSideEffect.kt | 1 + .../feature/main/feed/FeedViewModel.kt | 1 + 5 files changed, 27 insertions(+), 15 deletions(-) diff --git a/presentation/src/main/java/com/signal/signal_android/feature/main/feed/CommentDialog.kt b/presentation/src/main/java/com/signal/signal_android/feature/main/feed/CommentDialog.kt index ad42655c..c04394d0 100644 --- a/presentation/src/main/java/com/signal/signal_android/feature/main/feed/CommentDialog.kt +++ b/presentation/src/main/java/com/signal/signal_android/feature/main/feed/CommentDialog.kt @@ -20,9 +20,12 @@ import androidx.compose.material.Icon import androidx.compose.material.IconButton import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect +import androidx.compose.runtime.collectAsState +import androidx.compose.runtime.getValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.draw.clip +import androidx.compose.ui.platform.LocalFocusManager import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource import androidx.compose.ui.unit.dp @@ -35,16 +38,23 @@ import com.signal.signal_android.designsystem.foundation.Body2 import com.signal.signal_android.designsystem.foundation.BodyLarge2 import com.signal.signal_android.designsystem.foundation.SignalColor import com.signal.signal_android.designsystem.textfield.SignalTextField +import kotlinx.coroutines.flow.SharedFlow @Composable internal fun CommentDialog( - state: FeedState, - fetchPostComments: suspend () -> Unit, - createComment: () -> Unit, - onCommentChange: (String) -> Unit, + feedViewModel: FeedViewModel, ) { + val state by feedViewModel.state.collectAsState() + + val focusManager = LocalFocusManager.current + LaunchedEffect(Unit) { - fetchPostComments() + feedViewModel.sideEffect.collect { + when (it) { + is FeedSideEffect.ClearFocus -> focusManager.clearFocus() + else -> {} + } + } } Box(contentAlignment = Alignment.BottomCenter) { @@ -84,8 +94,8 @@ internal fun CommentDialog( ) { Input( comment = { state.comment }, - onCommentChange = onCommentChange, - onClick = createComment, + onCommentChange = feedViewModel::setComment, + onClick = feedViewModel::createComment, ) } } @@ -127,7 +137,7 @@ private fun Comments( ) { items(commentEntities) { Comment( - profileImageUrl = "", + profileImageUrl = it.profile, writer = it.writer, time = it.dateTime.toString(), content = it.content, diff --git a/presentation/src/main/java/com/signal/signal_android/feature/main/feed/Feed.kt b/presentation/src/main/java/com/signal/signal_android/feature/main/feed/Feed.kt index 80982da2..a9711a6c 100644 --- a/presentation/src/main/java/com/signal/signal_android/feature/main/feed/Feed.kt +++ b/presentation/src/main/java/com/signal/signal_android/feature/main/feed/Feed.kt @@ -125,6 +125,7 @@ internal fun Feed( onDismissRequest = { expanded = -1 }, onDelete = { showDialog = true }, ) + Column( modifier = Modifier .fillMaxWidth() @@ -145,7 +146,10 @@ internal fun Feed( text = stringResource(id = R.string.feed_posts_is_empty), ) Body( - modifier = Modifier.signalClickable(onClick = moveToCreatePost), + modifier = Modifier.signalClickable( + onClick = moveToCreatePost, + enabled = state.isPostsEmpty + ), text = stringResource(id = R.string.feed_posts_add), color = SignalColor.Primary100, ) diff --git a/presentation/src/main/java/com/signal/signal_android/feature/main/feed/FeedDetails.kt b/presentation/src/main/java/com/signal/signal_android/feature/main/feed/FeedDetails.kt index 358acc8c..a2dc1cc5 100644 --- a/presentation/src/main/java/com/signal/signal_android/feature/main/feed/FeedDetails.kt +++ b/presentation/src/main/java/com/signal/signal_android/feature/main/feed/FeedDetails.kt @@ -91,12 +91,7 @@ internal fun FeedDetails( ModalBottomSheetLayout( sheetContent = { - CommentDialog( - state = state, - fetchPostComments = feedViewModel::fetchPostComments, - createComment = feedViewModel::createComment, - onCommentChange = feedViewModel::setComment, - ) + CommentDialog(feedViewModel = feedViewModel) }, sheetState = sheetState, sheetShape = RoundedCornerShape( @@ -148,6 +143,7 @@ internal fun FeedDetails( .signalClickable( onClick = { coroutineScope.launch { + feedViewModel.fetchPostComments() sheetState.show() } }, diff --git a/presentation/src/main/java/com/signal/signal_android/feature/main/feed/FeedSideEffect.kt b/presentation/src/main/java/com/signal/signal_android/feature/main/feed/FeedSideEffect.kt index af7fe8f6..777fea0b 100644 --- a/presentation/src/main/java/com/signal/signal_android/feature/main/feed/FeedSideEffect.kt +++ b/presentation/src/main/java/com/signal/signal_android/feature/main/feed/FeedSideEffect.kt @@ -2,4 +2,5 @@ package com.signal.signal_android.feature.main.feed sealed interface FeedSideEffect { object PostSuccess : FeedSideEffect + object ClearFocus: FeedSideEffect } diff --git a/presentation/src/main/java/com/signal/signal_android/feature/main/feed/FeedViewModel.kt b/presentation/src/main/java/com/signal/signal_android/feature/main/feed/FeedViewModel.kt index 06179dc8..de87b963 100644 --- a/presentation/src/main/java/com/signal/signal_android/feature/main/feed/FeedViewModel.kt +++ b/presentation/src/main/java/com/signal/signal_android/feature/main/feed/FeedViewModel.kt @@ -96,6 +96,7 @@ internal class FeedViewModel( feedId = feedId, content = comment, ).onSuccess { + postSideEffect(FeedSideEffect.ClearFocus) fetchPostComments() }.onFailure { From 5aabaf4792f1ca280d9943a4bba6c8ab609a9e37 Mon Sep 17 00:00:00 2001 From: Tmdhoon2 Date: Tue, 14 Nov 2023 19:46:40 +0900 Subject: [PATCH 6/7] =?UTF-8?q?=E2=9A=A1=EF=B8=8F=20::=20=EB=8C=93?= =?UTF-8?q?=EA=B8=80=20=EB=B2=84=ED=8A=BC=20=EB=B9=84=ED=99=9C=EC=84=B1?= =?UTF-8?q?=ED=99=94=20=EB=A1=9C=EC=A7=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/signal/signal_android/feature/main/feed/CommentDialog.kt | 1 + 1 file changed, 1 insertion(+) diff --git a/presentation/src/main/java/com/signal/signal_android/feature/main/feed/CommentDialog.kt b/presentation/src/main/java/com/signal/signal_android/feature/main/feed/CommentDialog.kt index c04394d0..b0bdfbb7 100644 --- a/presentation/src/main/java/com/signal/signal_android/feature/main/feed/CommentDialog.kt +++ b/presentation/src/main/java/com/signal/signal_android/feature/main/feed/CommentDialog.kt @@ -122,6 +122,7 @@ private fun Input( modifier = Modifier.weight(0.2f), text = stringResource(id = R.string.my_page_secession_check), onClick = onClick, + enabled = comment().isNotBlank(), ) } } From 6c6def7e4b0707aee348d6e11f90274737e8ddb7 Mon Sep 17 00:00:00 2001 From: Tmdhoon2 Date: Tue, 14 Nov 2023 21:40:33 +0900 Subject: [PATCH 7/7] =?UTF-8?q?=E2=99=BB=EF=B8=8F=20::=20=EB=8C=93?= =?UTF-8?q?=EA=B8=80=20=EC=9E=91=EC=84=B1=20request=20=EC=9D=B4=EB=A6=84?= =?UTF-8?q?=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- data/src/main/kotlin/com/signal/data/api/FeedApi.kt | 6 +++--- .../com/signal/data/datasource/feed/FeedDataSource.kt | 6 +++--- .../signal/data/datasource/feed/FeedDataSourceImpl.kt | 10 +++++----- .../data/model/feed/request/CreateCommentRequest.kt | 7 +++++++ .../data/model/feed/request/CreatePostRequest.kt | 4 ++++ .../com/signal/data/model/feed/request/PostRequest.kt | 11 ----------- .../com/signal/data/repository/FeedRepositoryImpl.kt | 6 +++--- 7 files changed, 25 insertions(+), 25 deletions(-) create mode 100644 data/src/main/kotlin/com/signal/data/model/feed/request/CreateCommentRequest.kt delete mode 100644 data/src/main/kotlin/com/signal/data/model/feed/request/PostRequest.kt diff --git a/data/src/main/kotlin/com/signal/data/api/FeedApi.kt b/data/src/main/kotlin/com/signal/data/api/FeedApi.kt index 2f318b58..5ae18f88 100644 --- a/data/src/main/kotlin/com/signal/data/api/FeedApi.kt +++ b/data/src/main/kotlin/com/signal/data/api/FeedApi.kt @@ -1,7 +1,7 @@ package com.signal.data.api +import com.signal.data.model.feed.request.CreateCommentRequest import com.signal.data.model.feed.request.CreatePostRequest -import com.signal.data.model.feed.request.PostRequest import com.signal.data.model.feed.response.FetchCommentsResponse import com.signal.data.model.feed.response.FetchPostDetailsResponse import com.signal.data.model.feed.response.FetchPostsResponse @@ -22,7 +22,7 @@ interface FeedApi { @POST(SignalUrl.Feed.CreatePost) suspend fun createPost( - @Body postRequest: PostRequest, + @Body createPostRequest: CreatePostRequest, ) @GET(SignalUrl.Feed.Details) @@ -38,6 +38,6 @@ interface FeedApi { @POST(SignalUrl.Feed.CreateComment) suspend fun createComment( @Path("feed_id") feedId: Long, - @Body createPostRequest: CreatePostRequest, + @Body createCommentRequest: CreateCommentRequest, ) } diff --git a/data/src/main/kotlin/com/signal/data/datasource/feed/FeedDataSource.kt b/data/src/main/kotlin/com/signal/data/datasource/feed/FeedDataSource.kt index d036ac3e..f755db8e 100644 --- a/data/src/main/kotlin/com/signal/data/datasource/feed/FeedDataSource.kt +++ b/data/src/main/kotlin/com/signal/data/datasource/feed/FeedDataSource.kt @@ -1,7 +1,7 @@ package com.signal.data.datasource.feed +import com.signal.data.model.feed.request.CreateCommentRequest import com.signal.data.model.feed.request.CreatePostRequest -import com.signal.data.model.feed.request.PostRequest import com.signal.data.model.feed.response.FetchCommentsResponse import com.signal.data.model.feed.response.FetchPostDetailsResponse import com.signal.data.model.feed.response.FetchPostsResponse @@ -14,7 +14,7 @@ interface FeedDataSource { size: Long, ): FetchPostsResponse - suspend fun createPost(postRequest: PostRequest) + suspend fun createPost(createPostRequest: CreatePostRequest) suspend fun fetchPostDetails(feedId: Long): FetchPostDetailsResponse @@ -22,6 +22,6 @@ interface FeedDataSource { suspend fun createComment( feedId: Long, - createPostRequest: CreatePostRequest, + createCommentRequest: CreateCommentRequest, ) } diff --git a/data/src/main/kotlin/com/signal/data/datasource/feed/FeedDataSourceImpl.kt b/data/src/main/kotlin/com/signal/data/datasource/feed/FeedDataSourceImpl.kt index fb1770a0..92f74241 100644 --- a/data/src/main/kotlin/com/signal/data/datasource/feed/FeedDataSourceImpl.kt +++ b/data/src/main/kotlin/com/signal/data/datasource/feed/FeedDataSourceImpl.kt @@ -1,8 +1,8 @@ package com.signal.data.datasource.feed import com.signal.data.api.FeedApi +import com.signal.data.model.feed.request.CreateCommentRequest import com.signal.data.model.feed.request.CreatePostRequest -import com.signal.data.model.feed.request.PostRequest import com.signal.data.model.feed.response.FetchCommentsResponse import com.signal.data.model.feed.response.FetchPostDetailsResponse import com.signal.data.model.feed.response.FetchPostsResponse @@ -24,9 +24,9 @@ class FeedDataSourceImpl( ) }.sendRequest() - override suspend fun createPost(postRequest: PostRequest) = + override suspend fun createPost(createPostRequest: CreatePostRequest) = ExceptionHandler().httpRequest { - feedApi.createPost(postRequest = postRequest) + feedApi.createPost(createPostRequest = createPostRequest) }.sendRequest() override suspend fun fetchPostDetails(feedId: Long) = @@ -41,11 +41,11 @@ class FeedDataSourceImpl( override suspend fun createComment( feedId: Long, - createPostRequest: CreatePostRequest, + createCommentRequest: CreateCommentRequest, ) = ExceptionHandler().httpRequest { feedApi.createComment( feedId = feedId, - createPostRequest = createPostRequest, + createCommentRequest = createCommentRequest, ) }.sendRequest() } diff --git a/data/src/main/kotlin/com/signal/data/model/feed/request/CreateCommentRequest.kt b/data/src/main/kotlin/com/signal/data/model/feed/request/CreateCommentRequest.kt new file mode 100644 index 00000000..546735ba --- /dev/null +++ b/data/src/main/kotlin/com/signal/data/model/feed/request/CreateCommentRequest.kt @@ -0,0 +1,7 @@ +package com.signal.data.model.feed.request + +import com.google.gson.annotations.SerializedName + +data class CreateCommentRequest( + @SerializedName("content") val content: String, +) diff --git a/data/src/main/kotlin/com/signal/data/model/feed/request/CreatePostRequest.kt b/data/src/main/kotlin/com/signal/data/model/feed/request/CreatePostRequest.kt index 5ccaefdf..a24dfebc 100644 --- a/data/src/main/kotlin/com/signal/data/model/feed/request/CreatePostRequest.kt +++ b/data/src/main/kotlin/com/signal/data/model/feed/request/CreatePostRequest.kt @@ -1,7 +1,11 @@ package com.signal.data.model.feed.request import com.google.gson.annotations.SerializedName +import com.signal.domain.enums.Tag data class CreatePostRequest( + @SerializedName("title") val title: String, @SerializedName("content") val content: String, + @SerializedName("image") val image: String?, + @SerializedName("tag") val tag: Tag, ) diff --git a/data/src/main/kotlin/com/signal/data/model/feed/request/PostRequest.kt b/data/src/main/kotlin/com/signal/data/model/feed/request/PostRequest.kt deleted file mode 100644 index 2c5c1d29..00000000 --- a/data/src/main/kotlin/com/signal/data/model/feed/request/PostRequest.kt +++ /dev/null @@ -1,11 +0,0 @@ -package com.signal.data.model.feed.request - -import com.google.gson.annotations.SerializedName -import com.signal.domain.enums.Tag - -data class PostRequest( - @SerializedName("title") val title: String, - @SerializedName("content") val content: String, - @SerializedName("image") val image: String?, - @SerializedName("tag") val tag: Tag, -) diff --git a/data/src/main/kotlin/com/signal/data/repository/FeedRepositoryImpl.kt b/data/src/main/kotlin/com/signal/data/repository/FeedRepositoryImpl.kt index 62dff0ff..e29ccc37 100644 --- a/data/src/main/kotlin/com/signal/data/repository/FeedRepositoryImpl.kt +++ b/data/src/main/kotlin/com/signal/data/repository/FeedRepositoryImpl.kt @@ -1,8 +1,8 @@ package com.signal.data.repository import com.signal.data.datasource.feed.FeedDataSource +import com.signal.data.model.feed.request.CreateCommentRequest import com.signal.data.model.feed.request.CreatePostRequest -import com.signal.data.model.feed.request.PostRequest import com.signal.data.model.feed.response.toEntity import com.signal.domain.PostsEntity import com.signal.domain.enums.Tag @@ -28,7 +28,7 @@ class FeedRepositoryImpl( tag: Tag, ) = runCatching { feedDataSource.createPost( - PostRequest( + CreatePostRequest( title = title, content = content, image = image, @@ -51,7 +51,7 @@ class FeedRepositoryImpl( ) = kotlin.runCatching { feedDataSource.createComment( feedId = feedId, - createPostRequest = CreatePostRequest(content = content), + createCommentRequest = CreateCommentRequest(content = content), ) } }