Skip to content
This repository has been archived by the owner on Mar 8, 2024. It is now read-only.

Commit

Permalink
πŸ”€ :: (#78) λŒ“κΈ€ μž‘μ„± κ΅¬ν˜„
Browse files Browse the repository at this point in the history
πŸ”€ :: (#78) λŒ“κΈ€ μž‘μ„± κ΅¬ν˜„
  • Loading branch information
Tmdhoon2 authored Nov 14, 2023
2 parents 31f934c + 6c6def7 commit cfb930c
Show file tree
Hide file tree
Showing 16 changed files with 138 additions and 42 deletions.
17 changes: 12 additions & 5 deletions data/src/main/kotlin/com/signal/data/api/FeedApi.kt
Original file line number Diff line number Diff line change
@@ -1,7 +1,8 @@
package com.signal.data.api

import com.signal.data.model.feed.request.PostRequest
import com.signal.data.model.feed.response.FetchPostCommentsResponse
import com.signal.data.model.feed.request.CreateCommentRequest
import com.signal.data.model.feed.request.CreatePostRequest
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
Expand All @@ -21,16 +22,22 @@ interface FeedApi {

@POST(SignalUrl.Feed.CreatePost)
suspend fun createPost(
@Body postRequest: PostRequest,
@Body createPostRequest: CreatePostRequest,
)

@GET(SignalUrl.Feed.Details)
suspend fun fetchPostDetails(
@Path("feed_id") feedId: Long,
): FetchPostDetailsResponse

@GET(SignalUrl.Feed.Comment)
@GET(SignalUrl.Feed.Comments)
suspend fun fetchPostComments(
@Path("feed_id") feedId: Long,
): FetchPostCommentsResponse
): FetchCommentsResponse

@POST(SignalUrl.Feed.CreateComment)
suspend fun createComment(
@Path("feed_id") feedId: Long,
@Body createCommentRequest: CreateCommentRequest,
)
}
3 changes: 2 additions & 1 deletion data/src/main/kotlin/com/signal/data/api/SignalUrl.kt
Original file line number Diff line number Diff line change
Expand Up @@ -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/{feed_id}"
const val CreateComment = "$feed/{feed_id}"
}

object Attachment {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,8 @@
package com.signal.data.datasource.feed

import com.signal.data.model.feed.request.PostRequest
import com.signal.data.model.feed.response.FetchPostCommentsResponse
import com.signal.data.model.feed.request.CreateCommentRequest
import com.signal.data.model.feed.request.CreatePostRequest
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
Expand All @@ -13,9 +14,14 @@ interface FeedDataSource {
size: Long,
): FetchPostsResponse

suspend fun createPost(postRequest: PostRequest)
suspend fun createPost(createPostRequest: CreatePostRequest)

suspend fun fetchPostDetails(feedId: Long): FetchPostDetailsResponse

suspend fun fetchPostComments(feedId: Long): FetchPostCommentsResponse
suspend fun fetchPostComments(feedId: Long): FetchCommentsResponse

suspend fun createComment(
feedId: Long,
createCommentRequest: CreateCommentRequest,
)
}
Original file line number Diff line number Diff line change
@@ -1,8 +1,9 @@
package com.signal.data.datasource.feed

import com.signal.data.api.FeedApi
import com.signal.data.model.feed.request.PostRequest
import com.signal.data.model.feed.response.FetchPostCommentsResponse
import com.signal.data.model.feed.request.CreateCommentRequest
import com.signal.data.model.feed.request.CreatePostRequest
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
Expand All @@ -23,9 +24,9 @@ class FeedDataSourceImpl(
)
}.sendRequest()

override suspend fun createPost(postRequest: PostRequest) =
override suspend fun createPost(createPostRequest: CreatePostRequest) =
ExceptionHandler<Unit>().httpRequest {
feedApi.createPost(postRequest = postRequest)
feedApi.createPost(createPostRequest = createPostRequest)
}.sendRequest()

override suspend fun fetchPostDetails(feedId: Long) =
Expand All @@ -34,7 +35,17 @@ class FeedDataSourceImpl(
}.sendRequest()

override suspend fun fetchPostComments(feedId: Long) =
ExceptionHandler<FetchPostCommentsResponse>().httpRequest {
ExceptionHandler<FetchCommentsResponse>().httpRequest {
feedApi.fetchPostComments(feedId = feedId)
}.sendRequest()

override suspend fun createComment(
feedId: Long,
createCommentRequest: CreateCommentRequest,
) = ExceptionHandler<Unit>().httpRequest {
feedApi.createComment(
feedId = feedId,
createCommentRequest = createCommentRequest,
)
}.sendRequest()
}
Original file line number Diff line number Diff line change
@@ -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,
)
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ package com.signal.data.model.feed.request
import com.google.gson.annotations.SerializedName
import com.signal.domain.enums.Tag

data class PostRequest(
data class CreatePostRequest(
@SerializedName("title") val title: String,
@SerializedName("content") val content: String,
@SerializedName("image") val image: String?,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,24 +4,26 @@ 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<Comment>,
) {
data class Comment(
@SerializedName("writer") val writer: String,
@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,
)
Original file line number Diff line number Diff line change
@@ -1,7 +1,8 @@
package com.signal.data.repository

import com.signal.data.datasource.feed.FeedDataSource
import com.signal.data.model.feed.request.PostRequest
import com.signal.data.model.feed.request.CreateCommentRequest
import com.signal.data.model.feed.request.CreatePostRequest
import com.signal.data.model.feed.response.toEntity
import com.signal.domain.PostsEntity
import com.signal.domain.enums.Tag
Expand All @@ -27,7 +28,7 @@ class FeedRepositoryImpl(
tag: Tag,
) = runCatching {
feedDataSource.createPost(
PostRequest(
CreatePostRequest(
title = title,
content = content,
image = image,
Expand All @@ -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,
createCommentRequest = CreateCommentRequest(content = content),
)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -10,5 +10,6 @@ data class PostCommentsEntity(
val content: String,
val isMine: Boolean,
val dateTime: LocalDateTime,
val profile: String,
)
}
Original file line number Diff line number Diff line change
Expand Up @@ -22,4 +22,9 @@ interface FeedRepository {
suspend fun fetchPostDetails(feedId: Long): Result<PostDetailsEntity>

suspend fun fetchPostComments(feedId: Long): Result<PostCommentsEntity>

suspend fun createComment(
feedId: Long,
content: String,
): Result<Unit>
}
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -35,14 +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,
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) {
Expand Down Expand Up @@ -81,9 +93,9 @@ internal fun CommentDialog(
.imePadding(),
) {
Input(
comment = { "comment" },
onCommentChange = { },
onClick = {},
comment = { state.comment },
onCommentChange = feedViewModel::setComment,
onClick = feedViewModel::createComment,
)
}
}
Expand All @@ -101,7 +113,7 @@ private fun Input(
) {
SignalTextField(
modifier = Modifier.fillMaxWidth(0.8f),
value = "",
value = comment(),
onValueChange = onCommentChange,
hint = stringResource(id = R.string.comment_dialog_input_comment),
)
Expand All @@ -110,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(),
)
}
}
Expand All @@ -125,7 +138,7 @@ private fun Comments(
) {
items(commentEntities) {
Comment(
profileImageUrl = "",
profileImageUrl = it.profile,
writer = it.writer,
time = it.dateTime.toString(),
content = it.content,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -73,7 +74,7 @@ internal fun Feed(
)

LaunchedEffect(Unit) {
if(state.isPostsEmpty) {
if (state.isPostsEmpty) {
feedViewModel.fetchPosts()
}
}
Expand Down Expand Up @@ -124,6 +125,7 @@ internal fun Feed(
onDismissRequest = { expanded = -1 },
onDelete = { showDialog = true },
)

Column(
modifier = Modifier
.fillMaxWidth()
Expand All @@ -144,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,
)
Expand Down Expand Up @@ -292,11 +297,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(
Expand All @@ -316,7 +326,7 @@ internal fun Post(
FeedDropDownMenu(
expanded = expanded,
onDismissRequest = onDismissRequest,
isMine = false,
isMine = true,
onEdit = onEdit,
onDelete = onDelete,
onReport = onReport,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -91,10 +91,7 @@ internal fun FeedDetails(

ModalBottomSheetLayout(
sheetContent = {
CommentDialog(
state = state,
fetchPostComments = feedViewModel::fetchPostComments,
)
CommentDialog(feedViewModel = feedViewModel)
},
sheetState = sheetState,
sheetShape = RoundedCornerShape(
Expand Down Expand Up @@ -146,6 +143,7 @@ internal fun FeedDetails(
.signalClickable(
onClick = {
coroutineScope.launch {
feedViewModel.fetchPostComments()
sheetState.show()
}
},
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,4 +2,5 @@ package com.signal.signal_android.feature.main.feed

sealed interface FeedSideEffect {
object PostSuccess : FeedSideEffect
object ClearFocus: FeedSideEffect
}
Loading

0 comments on commit cfb930c

Please sign in to comment.