Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
18 commits
Select commit Hold shift + click to select a range
4b9a4c0
[feat]: 내 피드 상단 api response, service, repository 구현 (#91)
rbqks529 Aug 17, 2025
f18380b
[feat]: 내 피드 상단 api ViewModel 구현 (#91)
rbqks529 Aug 17, 2025
d9f3b18
[feat]: 내 피드 상단 api 화면 연결 (#91)
rbqks529 Aug 17, 2025
1ac8550
[feat]: 피드에서 책 영역을 터치했을때 책 자세히 보기 화면으로 이동 (#91)
rbqks529 Aug 17, 2025
b2be491
[feat]: 피드 자세히 보기 화면에서 isWriter에 따른 메뉴 출력 분리 (#91)
rbqks529 Aug 17, 2025
f1383d9
[feat]: 피드 수정 네비게이션 임시 구현 (#91)
rbqks529 Aug 17, 2025
0dbb77a
[feat]: 특정 책으로 작성된 피드 조회 response, service, repository 구현 (#91)
rbqks529 Aug 17, 2025
bded9ae
[feat]: 특정 책으로 작성된 피드 조회 viewmodel 구현 (#91)
rbqks529 Aug 18, 2025
acb2a84
[feat]: 특정 책으로 작성된 피드 조회 Screen 구현 및 수정 (#91)
rbqks529 Aug 18, 2025
d1f78f2
[feat]: 특정 책으로 작성된 피드 조회 피드 자세히보기 화면 네비게이션 연결 (#91)
rbqks529 Aug 18, 2025
56e6a56
[ui]: 탑앱바 ripple 효과 수정(아이콘 버튼으로 변경) (#91)
rbqks529 Aug 18, 2025
8e00826
[feat]: 피드 수정 response, service, repository 구현 (#91)
rbqks529 Aug 18, 2025
ac048f8
[feat]: 피드 수정 ViewModel, UiState 구현 (#91)
rbqks529 Aug 18, 2025
bde3bbc
[feat]: 피드 수정 화면 연결 (#91)
rbqks529 Aug 18, 2025
8e0846d
[refactor]: 피드 팔로워 리스트 dto 수정 (#91)
rbqks529 Aug 18, 2025
5328585
[refactor]: 디바운싱 수정 (#91)
rbqks529 Aug 18, 2025
3718996
[refactor]: 안쓰는 함수 삭제 (#91)
rbqks529 Aug 18, 2025
df35eb5
[refactor]: pr 리뷰에 맞게 코드 수정 (#91)
rbqks529 Aug 18, 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
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
package com.texthip.thip.data.model.feed.request

import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable

@Serializable
data class UpdateFeedRequest(
@SerialName("contentBody") val contentBody: String? = null,
@SerialName("isPublic") val isPublic: Boolean? = null,
@SerialName("tagList") val tagList: List<String>? = null,
@SerialName("remainImageUrls") val remainImageUrls: List<String>? = null
)
Original file line number Diff line number Diff line change
Expand Up @@ -15,12 +15,14 @@ data class FeedDetailResponse(
@SerialName("bookTitle") val bookTitle: String,
@SerialName("isbn") val isbn: String,
@SerialName("bookAuthor") val bookAuthor: String,
@SerialName("bookImageUrl") val bookImageUrl: String? = null, // 책 이미지 URL 추가
@SerialName("contentBody") val contentBody: String,
@SerialName("contentUrls") val contentUrls: List<String>,
@SerialName("likeCount") val likeCount: Int,
@SerialName("commentCount") val commentCount: Int,
@SerialName("isSaved") val isSaved: Boolean,
@SerialName("isLiked") val isLiked: Boolean,
@SerialName("isWriter") val isWriter: Boolean,
@SerialName("isPublic") val isPublic: Boolean? = null, // 공개/비공개 설정 추가
@SerialName("tagList") val tagList: List<String>
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
package com.texthip.thip.data.model.feed.response

import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable

@Serializable
data class FeedMineInfoResponse(
@SerialName("creatorId") val creatorId: Int,
@SerialName("profileImageUrl") val profileImageUrl: String?,
@SerialName("nickname") val nickname: String,
@SerialName("aliasName") val aliasName: String,
@SerialName("aliasColor") val aliasColor: String,
@SerialName("followerCount") val followerCount: Int,
@SerialName("totalFeedCount") val totalFeedCount: Int,
@SerialName("isFollowing") val isFollowing: Boolean,
@SerialName("latestFollowerProfileImageUrls") val latestFollowerProfileImageUrls: List<String>
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
package com.texthip.thip.data.model.feed.response

import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable

@Serializable
data class RelatedBooksResponse(
@SerialName("feeds") val feeds: List<RelatedFeedItem>,
@SerialName("nextCursor") val nextCursor: String?,
@SerialName("isLast") val isLast: Boolean
)

@Serializable
data class RelatedFeedItem(
@SerialName("feedId") val feedId: Int,
@SerialName("creatorId") val creatorId: Int,
@SerialName("isWriter") val isWriter: Boolean,
@SerialName("creatorNickname") val creatorNickname: String,
@SerialName("creatorProfileImageUrl") val creatorProfileImageUrl: String?,
@SerialName("aliasName") val aliasName: String,
@SerialName("aliasColor") val aliasColor: String,
@SerialName("postDate") val postDate: String,
@SerialName("isbn") val isbn: String,
@SerialName("bookTitle") val bookTitle: String,
@SerialName("bookAuthor") val bookAuthor: String,
@SerialName("contentBody") val contentBody: String,
@SerialName("contentUrls") val contentUrls: List<String>,
@SerialName("likeCount") val likeCount: Int,
@SerialName("commentCount") val commentCount: Int,
@SerialName("isSaved") val isSaved: Boolean,
@SerialName("isLiked") val isLiked: Boolean
)
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ import kotlinx.serialization.Serializable

@Serializable
data class UsersMyFollowingsRecentFeedsResponse(
val recentWriters: List<RecentWriterList>
val myFollowingUsers: List<RecentWriterList>
)

@Serializable
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,12 @@ import android.content.Context
import android.net.Uri
import com.texthip.thip.data.model.base.handleBaseResponse
import com.texthip.thip.data.model.feed.request.CreateFeedRequest
import com.texthip.thip.data.model.feed.request.UpdateFeedRequest
import com.texthip.thip.data.model.feed.response.CreateFeedResponse
import com.texthip.thip.data.model.feed.response.FeedDetailResponse
import com.texthip.thip.data.model.feed.response.FeedWriteInfoResponse
import com.texthip.thip.data.model.feed.response.FeedMineInfoResponse
import com.texthip.thip.data.model.feed.response.RelatedBooksResponse
import com.texthip.thip.data.model.feed.response.AllFeedResponse
import com.texthip.thip.data.model.feed.response.MyFeedResponse
import com.texthip.thip.data.service.FeedService
Expand Down Expand Up @@ -147,13 +150,51 @@ class FeedRepository @Inject constructor(
.getOrThrow()
}

/** 내 피드 정보 조회 */
suspend fun getMyFeedInfo(): Result<FeedMineInfoResponse?> = runCatching {
feedService.getMyFeedInfo()
.handleBaseResponse()
.getOrThrow()
}

/** 특정 책과 관련된 피드 목록 조회 */
suspend fun getRelatedBookFeeds(
isbn: String,
sort: String? = null,
cursor: String? = null
): Result<RelatedBooksResponse?> = runCatching {
feedService.getRelatedBookFeeds(isbn, sort, cursor)
.handleBaseResponse()
.getOrThrow()
}

/** 피드 상세 조회 */
suspend fun getFeedDetail(feedId: Int): Result<FeedDetailResponse?> = runCatching {
feedService.getFeedDetail(feedId)
.handleBaseResponse()
.getOrThrow()
}

/** 피드 수정 */
suspend fun updateFeed(
feedId: Int,
contentBody: String? = null,
isPublic: Boolean? = null,
tagList: List<String>? = null,
remainImageUrls: List<String>? = null
): Result<CreateFeedResponse?> = runCatching {
val request = UpdateFeedRequest(
contentBody = contentBody,
isPublic = isPublic,
tagList = tagList,
remainImageUrls = remainImageUrls
)

feedService.updateFeed(feedId, request)
.handleBaseResponse()
.getOrThrow()
}

/** 임시 파일들을 정리하는 함수 */
private fun cleanupTempFiles(tempFiles: List<File>) {
tempFiles.forEach { file ->
Expand Down
24 changes: 24 additions & 0 deletions app/src/main/java/com/texthip/thip/data/service/FeedService.kt
Original file line number Diff line number Diff line change
Expand Up @@ -6,12 +6,17 @@ import com.texthip.thip.data.model.feed.response.FeedDetailResponse
import com.texthip.thip.data.model.feed.response.FeedUsersInfoResponse
import com.texthip.thip.data.model.feed.response.FeedUsersResponse
import com.texthip.thip.data.model.feed.response.FeedWriteInfoResponse
import com.texthip.thip.data.model.feed.response.FeedMineInfoResponse
import com.texthip.thip.data.model.feed.response.RelatedBooksResponse
import com.texthip.thip.data.model.feed.response.AllFeedResponse
import com.texthip.thip.data.model.feed.response.MyFeedResponse
import com.texthip.thip.data.model.feed.request.UpdateFeedRequest
import okhttp3.MultipartBody
import okhttp3.RequestBody
import retrofit2.http.Body
import retrofit2.http.GET
import retrofit2.http.Multipart
import retrofit2.http.PATCH
import retrofit2.http.POST
import retrofit2.http.Part
import retrofit2.http.Path
Expand Down Expand Up @@ -44,6 +49,18 @@ interface FeedService {
@Query("cursor") cursor: String? = null
): BaseResponse<MyFeedResponse>

/** 내 피드 정보 조회 */
@GET("feeds/mine/info")
suspend fun getMyFeedInfo(): BaseResponse<FeedMineInfoResponse>

/** 특정 책과 관련된 피드 목록 조회 */
@GET("feeds/related-books/{isbn}")
suspend fun getRelatedBookFeeds(
@Path("isbn") isbn: String,
@Query("sort") sort: String? = null,
@Query("cursor") cursor: String? = null
): BaseResponse<RelatedBooksResponse>

/** 피드 상세 조회 */
@GET("feeds/{feedId}")
suspend fun getFeedDetail(
Expand All @@ -59,4 +76,11 @@ interface FeedService {
suspend fun getFeedUsers(
@Path("userId") userId: Long
): BaseResponse<FeedUsersResponse>

/** 피드 수정 */
@PATCH("feeds/{feedId}")
suspend fun updateFeed(
@Path("feedId") feedId: Int,
@Body request: UpdateFeedRequest
): BaseResponse<CreateFeedResponse>
}
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
package com.texthip.thip.ui.common.topappbar

import androidx.compose.foundation.clickable
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.padding
import androidx.compose.material3.Icon
import androidx.compose.material3.IconButton
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.ui.Alignment
Expand Down Expand Up @@ -33,14 +33,16 @@ fun DefaultTopAppBar(
.fillMaxWidth()
.padding(horizontal = 20.dp, vertical = 16.dp)
) {
Icon(
painter = painterResource(R.drawable.ic_arrow_back),
contentDescription = "Back Button",
tint = Color.Unspecified,
modifier = Modifier
.align(Alignment.CenterStart)
.clickable { onLeftClick() }
)
IconButton(
onClick = onLeftClick,
modifier = Modifier.align(Alignment.CenterStart)
) {
Icon(
painter = painterResource(R.drawable.ic_arrow_back),
contentDescription = "Back Button",
tint = Color.Unspecified
)
}

if (isTitleVisible) {
Text(
Expand All @@ -52,14 +54,16 @@ fun DefaultTopAppBar(
}

if (isRightIconVisible) {
Icon(
painter = painterResource(R.drawable.ic_more),
contentDescription = "More Options",
tint = Color.Unspecified,
modifier = Modifier
.align(Alignment.CenterEnd)
.clickable { onRightClick() }
)
IconButton(
onClick = onRightClick,
modifier = Modifier.align(Alignment.CenterEnd)
) {
Icon(
painter = painterResource(R.drawable.ic_more),
contentDescription = "More Options",
tint = Color.Unspecified
)
}
}
}
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,13 +1,13 @@
package com.texthip.thip.ui.common.topappbar

import androidx.compose.foundation.background
import androidx.compose.foundation.clickable
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.padding
import androidx.compose.material3.Icon
import androidx.compose.material3.IconButton
import androidx.compose.runtime.Composable
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
Expand Down Expand Up @@ -43,14 +43,16 @@ fun GradationTopAppBar(
.height(56.dp),
contentAlignment = Alignment.Center,
) {
Icon(
painter = painterResource(R.drawable.ic_arrow_back),
contentDescription = "Back Button",
tint = Color.Unspecified,
modifier = Modifier
.align(Alignment.CenterStart)
.clickable { onLeftClick() }
)
IconButton(
onClick = onLeftClick,
modifier = Modifier.align(Alignment.CenterStart)
) {
Icon(
painter = painterResource(R.drawable.ic_arrow_back),
contentDescription = "Back Button",
tint = Color.Unspecified
)
}

if (isImageVisible) {
CountingBar(
Expand All @@ -60,14 +62,16 @@ fun GradationTopAppBar(
)
}

Icon(
painter = painterResource(R.drawable.ic_more),
contentDescription = "More Options",
tint = Color.Unspecified,
modifier = Modifier
.align(Alignment.CenterEnd)
.clickable { onRightClick() }
)
IconButton(
onClick = onRightClick,
modifier = Modifier.align(Alignment.CenterEnd)
) {
Icon(
painter = painterResource(R.drawable.ic_more),
contentDescription = "More Options",
tint = Color.Unspecified
)
}
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,8 @@ fun MyFeedCard(
modifier: Modifier = Modifier,
feedItem: FeedItem,
onLikeClick: () -> Unit = {},
onContentClick: () -> Unit = {}
onContentClick: () -> Unit = {},
onBookClick: () -> Unit = {}
) {
val hasImages = feedItem.imageUrls.isNotEmpty()
val maxLines = if (hasImages) 3 else 8
Expand All @@ -44,7 +45,7 @@ fun MyFeedCard(
ActionBookButton(
bookTitle = feedItem.bookTitle,
bookAuthor = feedItem.authName,
onClick = {}
onClick = onBookClick
)

Column(
Expand Down
Loading