diff --git a/data/src/main/java/daily/dayo/data/datasource/remote/alarm/AlarmResponse.kt b/data/src/main/java/daily/dayo/data/datasource/remote/alarm/AlarmResponse.kt index dbf68607..b8e9fc2f 100644 --- a/data/src/main/java/daily/dayo/data/datasource/remote/alarm/AlarmResponse.kt +++ b/data/src/main/java/daily/dayo/data/datasource/remote/alarm/AlarmResponse.kt @@ -30,5 +30,5 @@ data class AlarmDto( @SerializedName("memberId") val memberId: String?, @SerializedName("postId") - val postId: Int? + val postId: Long? ) \ No newline at end of file diff --git a/data/src/main/java/daily/dayo/data/datasource/remote/bookmark/BookmarkApiService.kt b/data/src/main/java/daily/dayo/data/datasource/remote/bookmark/BookmarkApiService.kt index 05ed70ad..f9a48729 100644 --- a/data/src/main/java/daily/dayo/data/datasource/remote/bookmark/BookmarkApiService.kt +++ b/data/src/main/java/daily/dayo/data/datasource/remote/bookmark/BookmarkApiService.kt @@ -9,7 +9,7 @@ interface BookmarkApiService { suspend fun requestBookmarkPost(@Body body: CreateBookmarkRequest): NetworkResponse @POST("/api/v1/bookmark/delete/{postId}") - suspend fun requestDeleteBookmarkPost(@Path("postId") postId: Int): NetworkResponse + suspend fun requestDeleteBookmarkPost(@Path("postId") postId: Long): NetworkResponse @GET("/api/v1/bookmark/list") suspend fun requestAllMyBookmarkPostList(@Query("end") end: Int): NetworkResponse diff --git a/data/src/main/java/daily/dayo/data/datasource/remote/bookmark/BookmarkRequest.kt b/data/src/main/java/daily/dayo/data/datasource/remote/bookmark/BookmarkRequest.kt index 552a8b6a..54f583dc 100644 --- a/data/src/main/java/daily/dayo/data/datasource/remote/bookmark/BookmarkRequest.kt +++ b/data/src/main/java/daily/dayo/data/datasource/remote/bookmark/BookmarkRequest.kt @@ -4,5 +4,5 @@ import com.google.gson.annotations.SerializedName data class CreateBookmarkRequest( @SerializedName("postId") - val postId: Int + val postId: Long ) \ No newline at end of file diff --git a/data/src/main/java/daily/dayo/data/datasource/remote/bookmark/BookmarkResponse.kt b/data/src/main/java/daily/dayo/data/datasource/remote/bookmark/BookmarkResponse.kt index 2c773cca..ba597279 100644 --- a/data/src/main/java/daily/dayo/data/datasource/remote/bookmark/BookmarkResponse.kt +++ b/data/src/main/java/daily/dayo/data/datasource/remote/bookmark/BookmarkResponse.kt @@ -6,7 +6,7 @@ data class CreateBookmarkResponse( @SerializedName("memberId") val memberId: String, @SerializedName("postId") - val postId: Int + val postId: Long ) data class ListAllMyBookmarkPostResponse( @@ -20,7 +20,7 @@ data class ListAllMyBookmarkPostResponse( data class BookmarkPostDto( @SerializedName("postId") - val postId: Int, + val postId: Long, @SerializedName("thumbnailImage") val thumbnailImage: String ) diff --git a/data/src/main/java/daily/dayo/data/datasource/remote/comment/CommentApiService.kt b/data/src/main/java/daily/dayo/data/datasource/remote/comment/CommentApiService.kt index bbacbb8a..562756ed 100644 --- a/data/src/main/java/daily/dayo/data/datasource/remote/comment/CommentApiService.kt +++ b/data/src/main/java/daily/dayo/data/datasource/remote/comment/CommentApiService.kt @@ -10,7 +10,7 @@ interface CommentApiService { /*** v2 ***/ @GET("/api/v2/comments/{postId}") - suspend fun requestPostComment(@Path("postId") postId: Int): NetworkResponse + suspend fun requestPostComment(@Path("postId") postId: Long): NetworkResponse @POST("/api/v2/comments") suspend fun requestCreatePostComment(@Body body: CreateCommentRequest): NetworkResponse diff --git a/data/src/main/java/daily/dayo/data/datasource/remote/comment/CommentRequest.kt b/data/src/main/java/daily/dayo/data/datasource/remote/comment/CommentRequest.kt index f648b241..2ada924a 100644 --- a/data/src/main/java/daily/dayo/data/datasource/remote/comment/CommentRequest.kt +++ b/data/src/main/java/daily/dayo/data/datasource/remote/comment/CommentRequest.kt @@ -6,7 +6,7 @@ data class CreateCommentRequest( @SerializedName("contents") val contents: String, @SerializedName("postId") - val postId: Int, + val postId: Long, @SerializedName("mentionList") val mentionList: List ) @@ -17,7 +17,7 @@ data class CreateCommentReplyRequest( @SerializedName("contents") val contents: String, @SerializedName("postId") - val postId: Int, + val postId: Long, @SerializedName("mentionList") val mentionList: List ) \ No newline at end of file diff --git a/data/src/main/java/daily/dayo/data/datasource/remote/folder/FolderApiService.kt b/data/src/main/java/daily/dayo/data/datasource/remote/folder/FolderApiService.kt index 31e24a9f..6d2f5b4c 100644 --- a/data/src/main/java/daily/dayo/data/datasource/remote/folder/FolderApiService.kt +++ b/data/src/main/java/daily/dayo/data/datasource/remote/folder/FolderApiService.kt @@ -18,7 +18,7 @@ interface FolderApiService { @Multipart @POST("/api/v1/folders/patch") suspend fun requestEditFolder( - @Part("folderId") folderId: Int, + @Part("folderId") folderId: Long, @Part("name") name: String, @Part("privacy") privacy: String, @Part("subheading") subheading: String?, @@ -30,23 +30,27 @@ interface FolderApiService { suspend fun requestCreateFolderInPost(@Body body: CreateFolderInPostRequest): NetworkResponse @POST("/api/v1/folders/delete/{folderId}") - suspend fun requestDeleteFolder(@Path("folderId") folderId: Int): NetworkResponse + suspend fun requestDeleteFolder(@Path("folderId") folderId: Long): NetworkResponse - @POST("/api/v1/folders/order") - suspend fun requestOrderFolder(@Body body: List): NetworkResponse + @POST("/api/v2/folders/move") + suspend fun requestFolderMove(@Body body: FolderMoveRequest): NetworkResponse // 폴더 리스트 - @GET("/api/v1/folders/list/{memberId}") + @GET("/api/v2/folders/list/{memberId}") suspend fun requestAllFolderList(@Path("memberId") memberId: String): NetworkResponse - @GET("/api/v1/folders/my") + @GET("/api/v2/folders/my") suspend fun requestAllMyFolderList(): NetworkResponse // 폴더 정보 - @GET("/api/v1/folders/{folderId}/info") - suspend fun requestFolderInfo(@Path("folderId") folderId: Int): NetworkResponse + @GET("/api/v2/folders/{folderId}/info") + suspend fun requestFolderInfo(@Path("folderId") folderId: Long): NetworkResponse // 폴더 내 게시글 - @GET("/api/v1/folders/{folderId}") - suspend fun requestDetailListFolder(@Path("folderId") folderId: Int, @Query("end") end: Int): NetworkResponse + @GET("/api/v2/folders/{folderId}") + suspend fun requestDetailListFolder( + @Path("folderId") folderId: Long, + @Query("end") end: Int, + @Query("order") order: String + ): NetworkResponse } \ No newline at end of file diff --git a/data/src/main/java/daily/dayo/data/datasource/remote/folder/FolderPagingSource.kt b/data/src/main/java/daily/dayo/data/datasource/remote/folder/FolderPagingSource.kt index 0670582a..ef192587 100644 --- a/data/src/main/java/daily/dayo/data/datasource/remote/folder/FolderPagingSource.kt +++ b/data/src/main/java/daily/dayo/data/datasource/remote/folder/FolderPagingSource.kt @@ -3,20 +3,22 @@ package daily.dayo.data.datasource.remote.folder import androidx.paging.PagingSource import androidx.paging.PagingState import daily.dayo.data.mapper.toFolderPost +import daily.dayo.domain.model.FolderOrder import daily.dayo.domain.model.FolderPost import daily.dayo.domain.model.NetworkResponse class FolderPagingSource( private val apiService: FolderApiService, private val size: Int, - private val folderId: Int + private val folderId: Long, + private val folderOrder: FolderOrder ) : PagingSource() { override suspend fun load( params: LoadParams ): LoadResult { val nextPageNumber = params.key ?: 0 - apiService.requestDetailListFolder(folderId = folderId, end = nextPageNumber).let { ApiResponse -> + apiService.requestDetailListFolder(folderId = folderId, end = nextPageNumber, order = folderOrder.toString()).let { ApiResponse -> return try { when (ApiResponse) { is NetworkResponse.Success -> { diff --git a/data/src/main/java/daily/dayo/data/datasource/remote/folder/FolderRequest.kt b/data/src/main/java/daily/dayo/data/datasource/remote/folder/FolderRequest.kt index 477ff5f3..b1a57ac1 100644 --- a/data/src/main/java/daily/dayo/data/datasource/remote/folder/FolderRequest.kt +++ b/data/src/main/java/daily/dayo/data/datasource/remote/folder/FolderRequest.kt @@ -1,7 +1,7 @@ package daily.dayo.data.datasource.remote.folder -import daily.dayo.domain.model.Privacy import com.google.gson.annotations.SerializedName +import daily.dayo.domain.model.Privacy data class CreateFolderInPostRequest( @SerializedName("name") @@ -10,4 +10,11 @@ data class CreateFolderInPostRequest( val subheading: String, @SerializedName("privacy") val privacy: Privacy +) + +data class FolderMoveRequest( + @SerializedName("postIdList") + val postIdList: List, + @SerializedName("targetFolderId") + val targetFolderId: Long ) \ No newline at end of file diff --git a/data/src/main/java/daily/dayo/data/datasource/remote/folder/FolderResponse.kt b/data/src/main/java/daily/dayo/data/datasource/remote/folder/FolderResponse.kt index e32e07cb..52667052 100644 --- a/data/src/main/java/daily/dayo/data/datasource/remote/folder/FolderResponse.kt +++ b/data/src/main/java/daily/dayo/data/datasource/remote/folder/FolderResponse.kt @@ -5,7 +5,7 @@ import com.google.gson.annotations.SerializedName data class CreateFolderResponse( @SerializedName("folderId") - val id: Int + val id: Long ) data class ListAllFolderResponse( @@ -48,17 +48,17 @@ data class DetailFolderResponse( data class CreateFolderInPostResponse( @SerializedName("folderId") - val folderId: Int + val folderId: Long ) data class EditFolderResponse( @SerializedName("folderId") - val folderId: Int + val folderId: Long ) data class FolderDto( @SerializedName("folderId") - val folderId: Int, + val folderId: Long, @SerializedName("name") val name: String, @SerializedName("postCount") @@ -75,14 +75,14 @@ data class FolderPostDto( @SerializedName("createDate") val createDate: String, @SerializedName("postId") - val postId: Int, + val postId: Long, @SerializedName("thumbnailImage") val thumbnailImage: String ) data class EditOrderDto( @SerializedName("folderId") - var folderId: Int, + var folderId: Long, @SerializedName("orderIndex") var orderIndex: Int ) \ No newline at end of file diff --git a/data/src/main/java/daily/dayo/data/datasource/remote/heart/HeartApiService.kt b/data/src/main/java/daily/dayo/data/datasource/remote/heart/HeartApiService.kt index be20bcbd..e618e1a8 100644 --- a/data/src/main/java/daily/dayo/data/datasource/remote/heart/HeartApiService.kt +++ b/data/src/main/java/daily/dayo/data/datasource/remote/heart/HeartApiService.kt @@ -9,11 +9,11 @@ interface HeartApiService { suspend fun requestLikePost(@Body body: CreateHeartRequest): NetworkResponse @POST("/api/v1/heart/delete/{postId}") - suspend fun requestUnlikePost(@Path("postId") postId: Int): NetworkResponse + suspend fun requestUnlikePost(@Path("postId") postId: Long): NetworkResponse @GET("/api/v1/heart/list") suspend fun requestAllMyLikePostList(@Query("end") end: Int): NetworkResponse @GET("/api/v1/heart/post/{postId}/list") - suspend fun requestPostLikeUsers(@Path("postId") postId: Int, @Query("end") end: Int): NetworkResponse + suspend fun requestPostLikeUsers(@Path("postId") postId: Long, @Query("end") end: Int): NetworkResponse } \ No newline at end of file diff --git a/data/src/main/java/daily/dayo/data/datasource/remote/heart/HeartPostUsersPagingSource.kt b/data/src/main/java/daily/dayo/data/datasource/remote/heart/HeartPostUsersPagingSource.kt index d47dfe15..fce3c3af 100644 --- a/data/src/main/java/daily/dayo/data/datasource/remote/heart/HeartPostUsersPagingSource.kt +++ b/data/src/main/java/daily/dayo/data/datasource/remote/heart/HeartPostUsersPagingSource.kt @@ -9,7 +9,7 @@ import daily.dayo.domain.model.NetworkResponse class HeartPostUsersPagingSource( private val apiService: HeartApiService, private val size: Int, - private val postId: Int + private val postId: Long ) : PagingSource() { override suspend fun load( diff --git a/data/src/main/java/daily/dayo/data/datasource/remote/heart/HeartRequest.kt b/data/src/main/java/daily/dayo/data/datasource/remote/heart/HeartRequest.kt index d9010490..b8c43319 100644 --- a/data/src/main/java/daily/dayo/data/datasource/remote/heart/HeartRequest.kt +++ b/data/src/main/java/daily/dayo/data/datasource/remote/heart/HeartRequest.kt @@ -4,5 +4,5 @@ import com.google.gson.annotations.SerializedName data class CreateHeartRequest( @SerializedName("postId") - val postId: Int + val postId: Long ) \ No newline at end of file diff --git a/data/src/main/java/daily/dayo/data/datasource/remote/heart/HeartResponse.kt b/data/src/main/java/daily/dayo/data/datasource/remote/heart/HeartResponse.kt index 8bdd7b26..b2653e15 100644 --- a/data/src/main/java/daily/dayo/data/datasource/remote/heart/HeartResponse.kt +++ b/data/src/main/java/daily/dayo/data/datasource/remote/heart/HeartResponse.kt @@ -6,7 +6,7 @@ data class CreateHeartResponse( @SerializedName("memberId") val memberId: String, @SerializedName("postId") - val postId: Int, + val postId: Long, @SerializedName("allCount") val allCount: Int ) @@ -27,7 +27,7 @@ data class ListAllMyHeartPostResponse( data class MyHeartPostDto( @SerializedName("postId") - val postId: Int, + val postId: Long, @SerializedName("thumbnailImage") val thumbnailImage: String ) diff --git a/data/src/main/java/daily/dayo/data/datasource/remote/post/PostApiService.kt b/data/src/main/java/daily/dayo/data/datasource/remote/post/PostApiService.kt index ed1bfb5a..fab6bd10 100644 --- a/data/src/main/java/daily/dayo/data/datasource/remote/post/PostApiService.kt +++ b/data/src/main/java/daily/dayo/data/datasource/remote/post/PostApiService.kt @@ -19,13 +19,13 @@ interface PostApiService { @Part("category") category: String, @Part("contents") contents: String, @Part files: List, - @Part("folderId") folderId: Int, + @Part("folderId") folderId: Long, @Part("tags") tags: Array ): NetworkResponse @POST("/api/v1/posts/{postId}/edit") suspend fun requestEditPost( - @Path("postId") postId: Int, + @Path("postId") postId: Long, @Body body: EditPostRequest ): NetworkResponse @@ -42,10 +42,10 @@ interface PostApiService { suspend fun requestDayoPickPostListCategory(@Path("category") category: Category): NetworkResponse @GET("/api/v1/posts/{postId}") - suspend fun requestPostDetail(@Path("postId") postId: Int): NetworkResponse + suspend fun requestPostDetail(@Path("postId") postId: Long): NetworkResponse @POST("/api/v1/posts/delete/{postId}") - suspend fun requestDeletePost(@Path("postId") postId: Int): NetworkResponse + suspend fun requestDeletePost(@Path("postId") postId: Long): NetworkResponse @GET("/api/v1/posts/feed/list") suspend fun requestAllFeedList(@Query("end") end: Int): NetworkResponse diff --git a/data/src/main/java/daily/dayo/data/datasource/remote/post/PostRequest.kt b/data/src/main/java/daily/dayo/data/datasource/remote/post/PostRequest.kt index af4ac497..1aa9000b 100644 --- a/data/src/main/java/daily/dayo/data/datasource/remote/post/PostRequest.kt +++ b/data/src/main/java/daily/dayo/data/datasource/remote/post/PostRequest.kt @@ -9,7 +9,7 @@ data class EditPostRequest ( @SerializedName("contents") val contents : String, @SerializedName("folderId") - val folderId : Int, + val folderId : Long, @SerializedName("hashtags") val hashtags : List ) \ No newline at end of file diff --git a/data/src/main/java/daily/dayo/data/datasource/remote/post/PostResponse.kt b/data/src/main/java/daily/dayo/data/datasource/remote/post/PostResponse.kt index ae3e2fdd..58491e14 100644 --- a/data/src/main/java/daily/dayo/data/datasource/remote/post/PostResponse.kt +++ b/data/src/main/java/daily/dayo/data/datasource/remote/post/PostResponse.kt @@ -1,7 +1,7 @@ package daily.dayo.data.datasource.remote.post -import daily.dayo.domain.model.Category import com.google.gson.annotations.SerializedName +import daily.dayo.domain.model.Category data class ListFeedResponse( @SerializedName("count") @@ -14,12 +14,12 @@ data class ListFeedResponse( data class EditPostResponse( @SerializedName("postId") - val postId: Int + val postId: Long ) data class CreatePostResponse( @SerializedName("id") - val id: Int + val id: Long ) data class ListAllPostResponse( @@ -53,7 +53,7 @@ data class DetailPostResponse( @SerializedName("createDateTime") val createDateTime: String, @SerializedName("folderId") - val folderId: Int, + val folderId: Long, @SerializedName("folderName") val folderName: String, @SerializedName("hashtags") @@ -80,7 +80,7 @@ data class PostDto( @SerializedName("heartCount") val heartCount: Int, @SerializedName("id") - val postId: Int, + val postId: Long, @SerializedName("memberId") val memberId: String, @SerializedName("nickname") @@ -99,7 +99,7 @@ data class DayoPick( @SerializedName("heartCount") val heartCount: Int, @SerializedName("id") - val postId: Int, + val postId: Long, @SerializedName("memberId") val memberId: String, @SerializedName("nickname") @@ -128,7 +128,7 @@ data class FeedDto( @SerializedName("heartCount") val heartCount: Int, @SerializedName("id") - val postId: Int, + val postId: Long, @SerializedName("memberId") val memberId: String, @SerializedName("nickname") diff --git a/data/src/main/java/daily/dayo/data/datasource/remote/report/ReportRequest.kt b/data/src/main/java/daily/dayo/data/datasource/remote/report/ReportRequest.kt index a871c2ac..c747a6d8 100644 --- a/data/src/main/java/daily/dayo/data/datasource/remote/report/ReportRequest.kt +++ b/data/src/main/java/daily/dayo/data/datasource/remote/report/ReportRequest.kt @@ -13,7 +13,7 @@ data class CreateReportPostRequest( @SerializedName("comment") val comment: String, @SerializedName("postId") - val postId: Int + val postId: Long ) data class CreateReportCommentRequest( diff --git a/data/src/main/java/daily/dayo/data/datasource/remote/search/SearchResponse.kt b/data/src/main/java/daily/dayo/data/datasource/remote/search/SearchResponse.kt index 3cd0a425..a219f5de 100644 --- a/data/src/main/java/daily/dayo/data/datasource/remote/search/SearchResponse.kt +++ b/data/src/main/java/daily/dayo/data/datasource/remote/search/SearchResponse.kt @@ -15,7 +15,7 @@ data class SearchResultResponse( data class SearchDto( @SerializedName("postId") - val postId: Int, + val postId: Long, @SerializedName("thumbnailImage") val thumbnailImage: String, ) diff --git a/data/src/main/java/daily/dayo/data/mapper/FolderMapper.kt b/data/src/main/java/daily/dayo/data/mapper/FolderMapper.kt index 6f9c21b2..fc9217c9 100644 --- a/data/src/main/java/daily/dayo/data/mapper/FolderMapper.kt +++ b/data/src/main/java/daily/dayo/data/mapper/FolderMapper.kt @@ -81,16 +81,4 @@ fun FolderPostDto.toFolderPost(): FolderPost = createDate = createDate, postId = postId, thumbnailImage = thumbnailImage - ) - -fun FolderOrder.toEditOrderDto(): EditOrderDto = - EditOrderDto( - folderId = folderId, - orderIndex = orderIndex - ) - -fun EditOrderDto.toFolderOrder(): FolderOrder = - FolderOrder( - folderId = folderId, - orderIndex = orderIndex ) \ No newline at end of file diff --git a/data/src/main/java/daily/dayo/data/repository/BookmarkRepositoryImpl.kt b/data/src/main/java/daily/dayo/data/repository/BookmarkRepositoryImpl.kt index e3365681..dfd03f16 100644 --- a/data/src/main/java/daily/dayo/data/repository/BookmarkRepositoryImpl.kt +++ b/data/src/main/java/daily/dayo/data/repository/BookmarkRepositoryImpl.kt @@ -14,7 +14,7 @@ import javax.inject.Inject class BookmarkRepositoryImpl @Inject constructor( private val bookmarkApiService: BookmarkApiService ) : BookmarkRepository { - override suspend fun requestBookmarkPost(postId: Int): NetworkResponse { + override suspend fun requestBookmarkPost(postId: Long): NetworkResponse { return when (val response = bookmarkApiService.requestBookmarkPost(CreateBookmarkRequest(postId = postId))) { is NetworkResponse.Success -> NetworkResponse.Success(response.body?.toBookmarkPostResponse) is NetworkResponse.NetworkError -> response @@ -23,7 +23,7 @@ class BookmarkRepositoryImpl @Inject constructor( } } - override suspend fun requestDeleteBookmarkPost(postId: Int): NetworkResponse = + override suspend fun requestDeleteBookmarkPost(postId: Long): NetworkResponse = bookmarkApiService.requestDeleteBookmarkPost(postId) override suspend fun requestAllMyBookmarkPostList() = diff --git a/data/src/main/java/daily/dayo/data/repository/CommentRepositoryImpl.kt b/data/src/main/java/daily/dayo/data/repository/CommentRepositoryImpl.kt index 10539af2..69ffc834 100644 --- a/data/src/main/java/daily/dayo/data/repository/CommentRepositoryImpl.kt +++ b/data/src/main/java/daily/dayo/data/repository/CommentRepositoryImpl.kt @@ -15,7 +15,7 @@ class CommentRepositoryImpl @Inject constructor( private val commentApiService: CommentApiService ) : CommentRepository { - override suspend fun requestPostComment(postId: Int): NetworkResponse = + override suspend fun requestPostComment(postId: Long): NetworkResponse = when (val response = commentApiService.requestPostComment(postId)) { is NetworkResponse.Success -> NetworkResponse.Success(response.body?.toComments()) @@ -26,7 +26,7 @@ class CommentRepositoryImpl @Inject constructor( override suspend fun requestCreatePostComment( contents: String, - postId: Int, + postId: Long, mentionList: List ): NetworkResponse = when (val response = @@ -48,7 +48,7 @@ class CommentRepositoryImpl @Inject constructor( override suspend fun requestCreatePostCommentReply( commentId: Long, contents: String, - postId: Int, + postId: Long, mentionList: List ): NetworkResponse = when (val response = diff --git a/data/src/main/java/daily/dayo/data/repository/FolderRepositoryImpl.kt b/data/src/main/java/daily/dayo/data/repository/FolderRepositoryImpl.kt index a4a8b708..6cdb639d 100644 --- a/data/src/main/java/daily/dayo/data/repository/FolderRepositoryImpl.kt +++ b/data/src/main/java/daily/dayo/data/repository/FolderRepositoryImpl.kt @@ -3,7 +3,6 @@ package daily.dayo.data.repository import androidx.paging.Pager import androidx.paging.PagingConfig import daily.dayo.data.datasource.remote.folder.* -import daily.dayo.data.mapper.toEditOrderDto import daily.dayo.data.mapper.toFolderCreateInPostResponse import daily.dayo.data.mapper.toFolderCreateResponse import daily.dayo.data.mapper.toFolderEditResponse @@ -42,7 +41,7 @@ class FolderRepositoryImpl @Inject constructor( } override suspend fun requestEditFolder( - folderId: Int, + folderId: Long, name: String, privacy: Privacy, subheading: String?, @@ -82,11 +81,11 @@ class FolderRepositoryImpl @Inject constructor( is NetworkResponse.UnknownError -> response } - override suspend fun requestDeleteFolder(folderId: Int): NetworkResponse = + override suspend fun requestDeleteFolder(folderId: Long): NetworkResponse = folderApiService.requestDeleteFolder(folderId) - override suspend fun requestOrderFolder(folderOrders: List): NetworkResponse = - folderApiService.requestOrderFolder(folderOrders.map { it.toEditOrderDto() }) + override suspend fun requestFolderMove(postIdList: List, targetFolderId: Long): NetworkResponse = + folderApiService.requestFolderMove(FolderMoveRequest(postIdList, targetFolderId)) override suspend fun requestAllFolderList(memberId: String): NetworkResponse = when (val response = folderApiService.requestAllFolderList(memberId)) { @@ -104,7 +103,7 @@ class FolderRepositoryImpl @Inject constructor( is NetworkResponse.UnknownError -> response } - override suspend fun requestFolderInfo(folderId: Int): NetworkResponse = + override suspend fun requestFolderInfo(folderId: Long): NetworkResponse = when (val response = folderApiService.requestFolderInfo(folderId)) { is NetworkResponse.Success -> NetworkResponse.Success(response.body?.toFolderInfo()) is NetworkResponse.NetworkError -> response @@ -112,9 +111,9 @@ class FolderRepositoryImpl @Inject constructor( is NetworkResponse.UnknownError -> response } - override suspend fun requestDetailListFolder(folderId: Int) = + override suspend fun requestDetailListFolder(folderId: Long, folderOrder: FolderOrder) = Pager(PagingConfig(pageSize = FOLDER_POST_PAGE_SIZE)) { - FolderPagingSource(folderApiService, FOLDER_POST_PAGE_SIZE, folderId) + FolderPagingSource(folderApiService, FOLDER_POST_PAGE_SIZE, folderId, folderOrder) }.flow companion object { diff --git a/data/src/main/java/daily/dayo/data/repository/HeartRepositoryImpl.kt b/data/src/main/java/daily/dayo/data/repository/HeartRepositoryImpl.kt index dd4630f1..ad870fff 100644 --- a/data/src/main/java/daily/dayo/data/repository/HeartRepositoryImpl.kt +++ b/data/src/main/java/daily/dayo/data/repository/HeartRepositoryImpl.kt @@ -17,7 +17,7 @@ class HeartRepositoryImpl @Inject constructor( private val heartApiService: HeartApiService ) : HeartRepository { - override suspend fun requestLikePost(postId: Int): NetworkResponse = + override suspend fun requestLikePost(postId: Long): NetworkResponse = when (val response = heartApiService.requestLikePost(CreateHeartRequest(postId))) { is NetworkResponse.Success -> NetworkResponse.Success(response.body?.toLikePostResponse()) is NetworkResponse.NetworkError -> response @@ -25,7 +25,7 @@ class HeartRepositoryImpl @Inject constructor( is NetworkResponse.UnknownError -> response } - override suspend fun requestUnlikePost(postId: Int): NetworkResponse = + override suspend fun requestUnlikePost(postId: Long): NetworkResponse = when (val response = heartApiService.requestUnlikePost(postId)) { is NetworkResponse.Success -> NetworkResponse.Success(response.body?.toLikePostDeleteResponse()) is NetworkResponse.NetworkError -> response @@ -37,7 +37,7 @@ class HeartRepositoryImpl @Inject constructor( HeartPagingSource(heartApiService, HEART_PAGE_SIZE) }.flow - override suspend fun requestPostLikeUsers(postId: Int) = Pager(PagingConfig(pageSize = HEART_PAGE_SIZE)) { + override suspend fun requestPostLikeUsers(postId: Long) = Pager(PagingConfig(pageSize = HEART_PAGE_SIZE)) { HeartPostUsersPagingSource(heartApiService, HEART_PAGE_SIZE, postId) }.flow diff --git a/data/src/main/java/daily/dayo/data/repository/PostRepositoryImpl.kt b/data/src/main/java/daily/dayo/data/repository/PostRepositoryImpl.kt index f33719d8..bbef09c6 100644 --- a/data/src/main/java/daily/dayo/data/repository/PostRepositoryImpl.kt +++ b/data/src/main/java/daily/dayo/data/repository/PostRepositoryImpl.kt @@ -31,7 +31,7 @@ class PostRepositoryImpl @Inject constructor( category: Category, contents: String, files: List, - folderId: Int, + folderId: Long, tags: Array ): NetworkResponse = when (val response = @@ -43,10 +43,10 @@ class PostRepositoryImpl @Inject constructor( } override suspend fun requestEditPost( - postId: Int, + postId: Long, category: Category, contents: String, - folderId: Int, + folderId: Long, hashtags: List ): NetworkResponse = when ( @@ -93,7 +93,7 @@ class PostRepositoryImpl @Inject constructor( is NetworkResponse.UnknownError -> response } - override suspend fun requestPostDetail(postId: Int): NetworkResponse = + override suspend fun requestPostDetail(postId: Long): NetworkResponse = when (val response = postApiService.requestPostDetail(postId)) { is NetworkResponse.Success -> NetworkResponse.Success(response.body?.toPostDetail()) is NetworkResponse.NetworkError -> response @@ -101,7 +101,7 @@ class PostRepositoryImpl @Inject constructor( is NetworkResponse.UnknownError -> response } - override suspend fun requestDeletePost(postId: Int): NetworkResponse = + override suspend fun requestDeletePost(postId: Long): NetworkResponse = when (val response = postApiService.requestDeletePost(postId)) { is NetworkResponse.Success -> NetworkResponse.Success(response.body) is NetworkResponse.NetworkError -> response diff --git a/data/src/main/java/daily/dayo/data/repository/ReportRepositoryImpl.kt b/data/src/main/java/daily/dayo/data/repository/ReportRepositoryImpl.kt index 9b207517..c1b226da 100644 --- a/data/src/main/java/daily/dayo/data/repository/ReportRepositoryImpl.kt +++ b/data/src/main/java/daily/dayo/data/repository/ReportRepositoryImpl.kt @@ -24,7 +24,7 @@ class ReportRepositoryImpl @Inject constructor( override suspend fun requestSavePostReport( comment: String, - postId: Int + postId: Long ): NetworkResponse = reportApiService.requestSavePostReport( CreateReportPostRequest( diff --git a/domain/src/main/java/daily/dayo/domain/model/Bookmark.kt b/domain/src/main/java/daily/dayo/domain/model/Bookmark.kt index e1e6525e..cc5c8bdf 100644 --- a/domain/src/main/java/daily/dayo/domain/model/Bookmark.kt +++ b/domain/src/main/java/daily/dayo/domain/model/Bookmark.kt @@ -1,10 +1,10 @@ package daily.dayo.domain.model data class BookmarkPost( - val postId: Int, + val postId: Long, val thumbnailImage: String ) data class BookmarkPostResponse( val memberId: String, - val postId: Int + val postId: Long ) \ No newline at end of file diff --git a/domain/src/main/java/daily/dayo/domain/model/Folder.kt b/domain/src/main/java/daily/dayo/domain/model/Folder.kt index aa568b8e..e98330dc 100644 --- a/domain/src/main/java/daily/dayo/domain/model/Folder.kt +++ b/domain/src/main/java/daily/dayo/domain/model/Folder.kt @@ -1,7 +1,15 @@ package daily.dayo.domain.model +enum class FolderOrder { + NEW, OLD; + + override fun toString(): String { + return name.lowercase() + } +} + data class Folder( - val folderId: Int?, + val folderId: Long?, val title: String, val memberId: String?, val privacy: Privacy, @@ -14,6 +22,7 @@ data class Folders( val count: Int, val data: List ) + data class FoldersMine( val count: Int, val data: List @@ -21,25 +30,20 @@ data class FoldersMine( data class FolderPost( val createDate: String, - val postId: Int, + val postId: Long, val thumbnailImage: String ) -data class FolderOrder( - var folderId: Int, - var orderIndex: Int -) - data class FolderCreateResponse( - val folderId: Int + val folderId: Long ) data class FolderCreateInPostResponse( - val folderId: Int + val folderId: Long ) data class FolderEditResponse( - val folderId: Int + val folderId: Long ) data class FolderInfo( diff --git a/domain/src/main/java/daily/dayo/domain/model/Like.kt b/domain/src/main/java/daily/dayo/domain/model/Like.kt index 4f9b3e3c..767ea419 100644 --- a/domain/src/main/java/daily/dayo/domain/model/Like.kt +++ b/domain/src/main/java/daily/dayo/domain/model/Like.kt @@ -1,7 +1,7 @@ package daily.dayo.domain.model data class LikePost( - val postId: Int, + val postId: Long, val thumbnailImage: String ) diff --git a/domain/src/main/java/daily/dayo/domain/model/Notification.kt b/domain/src/main/java/daily/dayo/domain/model/Notification.kt index 4d519043..017d4353 100644 --- a/domain/src/main/java/daily/dayo/domain/model/Notification.kt +++ b/domain/src/main/java/daily/dayo/domain/model/Notification.kt @@ -9,5 +9,5 @@ data class Notification( val image: String?, val nickname: String?, val memberId: String?, - val postId: Int? + val postId: Long? ) \ No newline at end of file diff --git a/domain/src/main/java/daily/dayo/domain/model/Post.kt b/domain/src/main/java/daily/dayo/domain/model/Post.kt index fec1d746..73f7a0a5 100644 --- a/domain/src/main/java/daily/dayo/domain/model/Post.kt +++ b/domain/src/main/java/daily/dayo/domain/model/Post.kt @@ -1,7 +1,7 @@ package daily.dayo.domain.model data class Post( - val postId: Int?, + val postId: Long?, val memberId: String?, val nickname: String, val userProfileImage: String, @@ -16,7 +16,7 @@ data class Post( var bookmark: Boolean?, var heart: Boolean, var heartCount: Int, - val folderId: Int?, + val folderId: Long?, val folderName: String?, var preLoadThumbnail: ByteArray?=null, var preLoadUserImg: ByteArray?=null @@ -27,7 +27,7 @@ data class PostDetail( val category: Category, val contents: String, val createDateTime: String, - val folderId: Int, + val folderId: Long, val folderName: String, val hashtags: List, var heart: Boolean, @@ -39,11 +39,11 @@ data class PostDetail( ) data class PostCreateResponse( - val id: Int + val id: Long ) data class PostEditResponse( - val postId: Int + val postId: Long ) data class Posts( diff --git a/domain/src/main/java/daily/dayo/domain/model/Search.kt b/domain/src/main/java/daily/dayo/domain/model/Search.kt index 2e24238d..e0c2f799 100644 --- a/domain/src/main/java/daily/dayo/domain/model/Search.kt +++ b/domain/src/main/java/daily/dayo/domain/model/Search.kt @@ -1,7 +1,7 @@ package daily.dayo.domain.model data class Search( - val postId: Int, + val postId: Long, val thumbnailImage: String ) diff --git a/domain/src/main/java/daily/dayo/domain/repository/BookmarkRepository.kt b/domain/src/main/java/daily/dayo/domain/repository/BookmarkRepository.kt index 4efa6d7e..ad0fade0 100644 --- a/domain/src/main/java/daily/dayo/domain/repository/BookmarkRepository.kt +++ b/domain/src/main/java/daily/dayo/domain/repository/BookmarkRepository.kt @@ -8,8 +8,8 @@ import kotlinx.coroutines.flow.Flow interface BookmarkRepository { - suspend fun requestBookmarkPost(postId: Int): NetworkResponse - suspend fun requestDeleteBookmarkPost(postId: Int): NetworkResponse + suspend fun requestBookmarkPost(postId: Long): NetworkResponse + suspend fun requestDeleteBookmarkPost(postId: Long): NetworkResponse suspend fun requestAllMyBookmarkPostList(): Flow> suspend fun requestBookmarkCount(): Int } \ No newline at end of file diff --git a/domain/src/main/java/daily/dayo/domain/repository/CommentRepository.kt b/domain/src/main/java/daily/dayo/domain/repository/CommentRepository.kt index e9332e3e..6844a2ff 100644 --- a/domain/src/main/java/daily/dayo/domain/repository/CommentRepository.kt +++ b/domain/src/main/java/daily/dayo/domain/repository/CommentRepository.kt @@ -6,8 +6,8 @@ import daily.dayo.domain.model.NetworkResponse interface CommentRepository { - suspend fun requestCreatePostComment(contents: String, postId: Int, mentionList: List): NetworkResponse - suspend fun requestCreatePostCommentReply(commentId: Long, contents: String, postId: Int, mentionList: List): NetworkResponse - suspend fun requestPostComment(postId: Int): NetworkResponse + suspend fun requestCreatePostComment(contents: String, postId: Long, mentionList: List): NetworkResponse + suspend fun requestCreatePostCommentReply(commentId: Long, contents: String, postId: Long, mentionList: List): NetworkResponse + suspend fun requestPostComment(postId: Long): NetworkResponse suspend fun requestDeletePostComment(commentId: Long): NetworkResponse } \ No newline at end of file diff --git a/domain/src/main/java/daily/dayo/domain/repository/FolderRepository.kt b/domain/src/main/java/daily/dayo/domain/repository/FolderRepository.kt index 1390581f..2ee4ae09 100644 --- a/domain/src/main/java/daily/dayo/domain/repository/FolderRepository.kt +++ b/domain/src/main/java/daily/dayo/domain/repository/FolderRepository.kt @@ -24,7 +24,7 @@ interface FolderRepository { ): NetworkResponse suspend fun requestEditFolder( - folderId: Int, + folderId: Long, name: String, privacy: Privacy, subheading: String?, @@ -38,10 +38,10 @@ interface FolderRepository { privacy: Privacy ): NetworkResponse - suspend fun requestDeleteFolder(folderId: Int): NetworkResponse - suspend fun requestOrderFolder(folderOrders: List): NetworkResponse + suspend fun requestDeleteFolder(folderId: Long): NetworkResponse + suspend fun requestFolderMove(postIdList: List, targetFolderId: Long): NetworkResponse suspend fun requestAllFolderList(memberId: String): NetworkResponse suspend fun requestAllMyFolderList(): NetworkResponse - suspend fun requestFolderInfo(folderId: Int): NetworkResponse - suspend fun requestDetailListFolder(folderId: Int): Flow> + suspend fun requestFolderInfo(folderId: Long): NetworkResponse + suspend fun requestDetailListFolder(folderId: Long, folderOrder: FolderOrder): Flow> } \ No newline at end of file diff --git a/domain/src/main/java/daily/dayo/domain/repository/HeartRepository.kt b/domain/src/main/java/daily/dayo/domain/repository/HeartRepository.kt index 27d54872..21530a56 100644 --- a/domain/src/main/java/daily/dayo/domain/repository/HeartRepository.kt +++ b/domain/src/main/java/daily/dayo/domain/repository/HeartRepository.kt @@ -9,8 +9,8 @@ import kotlinx.coroutines.flow.Flow interface HeartRepository { - suspend fun requestLikePost(postId: Int): NetworkResponse - suspend fun requestUnlikePost(postId: Int): NetworkResponse + suspend fun requestLikePost(postId: Long): NetworkResponse + suspend fun requestUnlikePost(postId: Long): NetworkResponse suspend fun requestAllMyLikePostList(): Flow> - suspend fun requestPostLikeUsers(postId: Int): Flow> + suspend fun requestPostLikeUsers(postId: Long): Flow> } \ No newline at end of file diff --git a/domain/src/main/java/daily/dayo/domain/repository/PostRepository.kt b/domain/src/main/java/daily/dayo/domain/repository/PostRepository.kt index 25393d5b..727e5e95 100644 --- a/domain/src/main/java/daily/dayo/domain/repository/PostRepository.kt +++ b/domain/src/main/java/daily/dayo/domain/repository/PostRepository.kt @@ -19,7 +19,7 @@ interface PostRepository { category: Category, contents: String, files: List, - folderId: Int, + folderId: Long, tags: Array ): NetworkResponse @@ -27,13 +27,13 @@ interface PostRepository { suspend fun requestNewPostListCategory(category: Category): NetworkResponse suspend fun requestDayoPickPostList(): NetworkResponse suspend fun requestDayoPickPostListCategory(category: Category): NetworkResponse - suspend fun requestPostDetail(postId: Int): NetworkResponse - suspend fun requestDeletePost(postId: Int): NetworkResponse + suspend fun requestPostDetail(postId: Long): NetworkResponse + suspend fun requestDeletePost(postId: Long): NetworkResponse suspend fun requestEditPost( - postId: Int, + postId: Long, category: Category, contents: String, - folderId: Int, + folderId: Long, hashtags: List ): NetworkResponse diff --git a/domain/src/main/java/daily/dayo/domain/repository/ReportRepository.kt b/domain/src/main/java/daily/dayo/domain/repository/ReportRepository.kt index 079b8524..d0212638 100644 --- a/domain/src/main/java/daily/dayo/domain/repository/ReportRepository.kt +++ b/domain/src/main/java/daily/dayo/domain/repository/ReportRepository.kt @@ -5,6 +5,6 @@ import daily.dayo.domain.model.NetworkResponse interface ReportRepository { suspend fun requestSaveMemberReport(comment: String, memberId: String): NetworkResponse - suspend fun requestSavePostReport(comment: String, postId: Int): NetworkResponse + suspend fun requestSavePostReport(comment: String, postId: Long): NetworkResponse suspend fun requestSaveCommentReport(comment: String, commentId: Long): NetworkResponse } \ No newline at end of file diff --git a/domain/src/main/java/daily/dayo/domain/usecase/bookmark/RequestBookmarkPostUseCase.kt b/domain/src/main/java/daily/dayo/domain/usecase/bookmark/RequestBookmarkPostUseCase.kt index f80efab5..9e7c40fc 100644 --- a/domain/src/main/java/daily/dayo/domain/usecase/bookmark/RequestBookmarkPostUseCase.kt +++ b/domain/src/main/java/daily/dayo/domain/usecase/bookmark/RequestBookmarkPostUseCase.kt @@ -6,6 +6,6 @@ import javax.inject.Inject class RequestBookmarkPostUseCase @Inject constructor( private val bookmarkRepository: BookmarkRepository ) { - suspend operator fun invoke(postId: Int) = + suspend operator fun invoke(postId: Long) = bookmarkRepository.requestBookmarkPost(postId = postId) } \ No newline at end of file diff --git a/domain/src/main/java/daily/dayo/domain/usecase/bookmark/RequestDeleteBookmarkPostUseCase.kt b/domain/src/main/java/daily/dayo/domain/usecase/bookmark/RequestDeleteBookmarkPostUseCase.kt index 1c7eef00..b7ae8465 100644 --- a/domain/src/main/java/daily/dayo/domain/usecase/bookmark/RequestDeleteBookmarkPostUseCase.kt +++ b/domain/src/main/java/daily/dayo/domain/usecase/bookmark/RequestDeleteBookmarkPostUseCase.kt @@ -6,6 +6,6 @@ import javax.inject.Inject class RequestDeleteBookmarkPostUseCase @Inject constructor( private val bookmarkRepository: BookmarkRepository ) { - suspend operator fun invoke(postId: Int) = + suspend operator fun invoke(postId: Long) = bookmarkRepository.requestDeleteBookmarkPost(postId) } \ No newline at end of file diff --git a/domain/src/main/java/daily/dayo/domain/usecase/comment/RequestCreatePostCommentReplyUseCase.kt b/domain/src/main/java/daily/dayo/domain/usecase/comment/RequestCreatePostCommentReplyUseCase.kt index 0e37a0d9..9f24d805 100644 --- a/domain/src/main/java/daily/dayo/domain/usecase/comment/RequestCreatePostCommentReplyUseCase.kt +++ b/domain/src/main/java/daily/dayo/domain/usecase/comment/RequestCreatePostCommentReplyUseCase.kt @@ -7,6 +7,6 @@ import javax.inject.Inject class RequestCreatePostCommentReplyUseCase @Inject constructor( private val commentRepository: CommentRepository ) { - suspend operator fun invoke(commentId: Long, contents: String, postId: Int, mentionList: List) = + suspend operator fun invoke(commentId: Long, contents: String, postId: Long, mentionList: List) = commentRepository.requestCreatePostCommentReply(commentId = commentId, contents = contents, postId = postId, mentionList = mentionList) } \ No newline at end of file diff --git a/domain/src/main/java/daily/dayo/domain/usecase/comment/RequestCreatePostCommentUseCase.kt b/domain/src/main/java/daily/dayo/domain/usecase/comment/RequestCreatePostCommentUseCase.kt index eb2444eb..5f21a797 100644 --- a/domain/src/main/java/daily/dayo/domain/usecase/comment/RequestCreatePostCommentUseCase.kt +++ b/domain/src/main/java/daily/dayo/domain/usecase/comment/RequestCreatePostCommentUseCase.kt @@ -7,6 +7,6 @@ import javax.inject.Inject class RequestCreatePostCommentUseCase @Inject constructor( private val commentRepository: CommentRepository ) { - suspend operator fun invoke(contents: String, postId: Int, mentionList: List) = + suspend operator fun invoke(contents: String, postId: Long, mentionList: List) = commentRepository.requestCreatePostComment(contents = contents, postId = postId, mentionList = mentionList) } \ No newline at end of file diff --git a/domain/src/main/java/daily/dayo/domain/usecase/comment/RequestPostCommentUseCase.kt b/domain/src/main/java/daily/dayo/domain/usecase/comment/RequestPostCommentUseCase.kt index bed567bf..b3c7ec8c 100644 --- a/domain/src/main/java/daily/dayo/domain/usecase/comment/RequestPostCommentUseCase.kt +++ b/domain/src/main/java/daily/dayo/domain/usecase/comment/RequestPostCommentUseCase.kt @@ -6,6 +6,6 @@ import javax.inject.Inject class RequestPostCommentUseCase @Inject constructor( private val commentRepository: CommentRepository ) { - suspend operator fun invoke(postId: Int) = + suspend operator fun invoke(postId: Long) = commentRepository.requestPostComment(postId) } \ No newline at end of file diff --git a/domain/src/main/java/daily/dayo/domain/usecase/folder/RequestDeleteFolderUseCase.kt b/domain/src/main/java/daily/dayo/domain/usecase/folder/RequestDeleteFolderUseCase.kt index 22981697..cd0ac73b 100644 --- a/domain/src/main/java/daily/dayo/domain/usecase/folder/RequestDeleteFolderUseCase.kt +++ b/domain/src/main/java/daily/dayo/domain/usecase/folder/RequestDeleteFolderUseCase.kt @@ -6,6 +6,6 @@ import javax.inject.Inject class RequestDeleteFolderUseCase @Inject constructor( private val folderRepository: FolderRepository ) { - suspend operator fun invoke(folderId: Int) = + suspend operator fun invoke(folderId: Long) = folderRepository.requestDeleteFolder(folderId) } \ No newline at end of file diff --git a/domain/src/main/java/daily/dayo/domain/usecase/folder/RequestEditFolderUseCase.kt b/domain/src/main/java/daily/dayo/domain/usecase/folder/RequestEditFolderUseCase.kt index f3e83a5a..e4ff0f6f 100644 --- a/domain/src/main/java/daily/dayo/domain/usecase/folder/RequestEditFolderUseCase.kt +++ b/domain/src/main/java/daily/dayo/domain/usecase/folder/RequestEditFolderUseCase.kt @@ -14,7 +14,7 @@ class RequestEditFolderUseCase @Inject constructor( private val folderRepository: FolderRepository ) { suspend operator fun invoke( - folderId: Int, + folderId: Long, name: String, privacy: Privacy, subheading: String?, diff --git a/domain/src/main/java/daily/dayo/domain/usecase/folder/RequestFolderInfoUseCase.kt b/domain/src/main/java/daily/dayo/domain/usecase/folder/RequestFolderInfoUseCase.kt index a43934a6..657a22c4 100644 --- a/domain/src/main/java/daily/dayo/domain/usecase/folder/RequestFolderInfoUseCase.kt +++ b/domain/src/main/java/daily/dayo/domain/usecase/folder/RequestFolderInfoUseCase.kt @@ -6,6 +6,6 @@ import javax.inject.Inject class RequestFolderInfoUseCase @Inject constructor( private val folderRepository: FolderRepository ) { - suspend operator fun invoke(folderId: Int) = + suspend operator fun invoke(folderId: Long) = folderRepository.requestFolderInfo(folderId) } \ No newline at end of file diff --git a/domain/src/main/java/daily/dayo/domain/usecase/folder/RequestFolderMoveUseCase.kt b/domain/src/main/java/daily/dayo/domain/usecase/folder/RequestFolderMoveUseCase.kt new file mode 100644 index 00000000..04cf1f33 --- /dev/null +++ b/domain/src/main/java/daily/dayo/domain/usecase/folder/RequestFolderMoveUseCase.kt @@ -0,0 +1,11 @@ +package daily.dayo.domain.usecase.folder + +import daily.dayo.domain.repository.FolderRepository +import javax.inject.Inject + +class RequestFolderMoveUseCase @Inject constructor( + private val folderRepository: FolderRepository +) { + suspend operator fun invoke(postIdList: List, targetFolderId: Long) = + folderRepository.requestFolderMove(postIdList, targetFolderId) +} diff --git a/domain/src/main/java/daily/dayo/domain/usecase/folder/RequestFolderPostListUseCase.kt b/domain/src/main/java/daily/dayo/domain/usecase/folder/RequestFolderPostListUseCase.kt index b087f9bd..9572ecfb 100644 --- a/domain/src/main/java/daily/dayo/domain/usecase/folder/RequestFolderPostListUseCase.kt +++ b/domain/src/main/java/daily/dayo/domain/usecase/folder/RequestFolderPostListUseCase.kt @@ -1,11 +1,12 @@ package daily.dayo.domain.usecase.folder +import daily.dayo.domain.model.FolderOrder import daily.dayo.domain.repository.FolderRepository import javax.inject.Inject class RequestFolderPostListUseCase @Inject constructor( private val folderRepository: FolderRepository ) { - suspend operator fun invoke(folderId: Int) = - folderRepository.requestDetailListFolder(folderId) -} \ No newline at end of file + suspend operator fun invoke(folderId: Long, folderOrder: FolderOrder) = + folderRepository.requestDetailListFolder(folderId, folderOrder) +} diff --git a/domain/src/main/java/daily/dayo/domain/usecase/folder/RequestOrderFolderUseCase.kt b/domain/src/main/java/daily/dayo/domain/usecase/folder/RequestOrderFolderUseCase.kt deleted file mode 100644 index bc56eaf0..00000000 --- a/domain/src/main/java/daily/dayo/domain/usecase/folder/RequestOrderFolderUseCase.kt +++ /dev/null @@ -1,12 +0,0 @@ -package daily.dayo.domain.usecase.folder - -import daily.dayo.domain.model.FolderOrder -import daily.dayo.domain.repository.FolderRepository -import javax.inject.Inject - -class RequestOrderFolderUseCase @Inject constructor( - private val folderRepository: FolderRepository -) { - suspend operator fun invoke(folderOrder: List) = - folderRepository.requestOrderFolder(folderOrder) -} \ No newline at end of file diff --git a/domain/src/main/java/daily/dayo/domain/usecase/like/RequestLikePostUseCase.kt b/domain/src/main/java/daily/dayo/domain/usecase/like/RequestLikePostUseCase.kt index 70c63460..f02ea441 100644 --- a/domain/src/main/java/daily/dayo/domain/usecase/like/RequestLikePostUseCase.kt +++ b/domain/src/main/java/daily/dayo/domain/usecase/like/RequestLikePostUseCase.kt @@ -6,6 +6,6 @@ import javax.inject.Inject class RequestLikePostUseCase @Inject constructor( private val heartRepository: HeartRepository ) { - suspend operator fun invoke(postId: Int) = + suspend operator fun invoke(postId: Long) = heartRepository.requestLikePost(postId = postId) } \ No newline at end of file diff --git a/domain/src/main/java/daily/dayo/domain/usecase/like/RequestPostLikeUsersUseCase.kt b/domain/src/main/java/daily/dayo/domain/usecase/like/RequestPostLikeUsersUseCase.kt index a53bdd92..71383fbc 100644 --- a/domain/src/main/java/daily/dayo/domain/usecase/like/RequestPostLikeUsersUseCase.kt +++ b/domain/src/main/java/daily/dayo/domain/usecase/like/RequestPostLikeUsersUseCase.kt @@ -6,6 +6,6 @@ import javax.inject.Inject class RequestPostLikeUsersUseCase @Inject constructor( private val heartRepository: HeartRepository ) { - suspend operator fun invoke(postId: Int) = + suspend operator fun invoke(postId: Long) = heartRepository.requestPostLikeUsers(postId = postId) } \ No newline at end of file diff --git a/domain/src/main/java/daily/dayo/domain/usecase/like/RequestUnlikePostUseCase.kt b/domain/src/main/java/daily/dayo/domain/usecase/like/RequestUnlikePostUseCase.kt index 10bc4d13..48192e7f 100644 --- a/domain/src/main/java/daily/dayo/domain/usecase/like/RequestUnlikePostUseCase.kt +++ b/domain/src/main/java/daily/dayo/domain/usecase/like/RequestUnlikePostUseCase.kt @@ -6,6 +6,6 @@ import javax.inject.Inject class RequestUnlikePostUseCase @Inject constructor( private val heartRepository: HeartRepository ) { - suspend operator fun invoke(postId: Int) = + suspend operator fun invoke(postId: Long) = heartRepository.requestUnlikePost(postId) } \ No newline at end of file diff --git a/domain/src/main/java/daily/dayo/domain/usecase/post/RequestDeletePostUseCase.kt b/domain/src/main/java/daily/dayo/domain/usecase/post/RequestDeletePostUseCase.kt index 7eb80030..cef8011b 100644 --- a/domain/src/main/java/daily/dayo/domain/usecase/post/RequestDeletePostUseCase.kt +++ b/domain/src/main/java/daily/dayo/domain/usecase/post/RequestDeletePostUseCase.kt @@ -6,6 +6,6 @@ import javax.inject.Inject class RequestDeletePostUseCase @Inject constructor( private val postRepository: PostRepository ) { - suspend operator fun invoke(postId: Int) = + suspend operator fun invoke(postId: Long) = postRepository.requestDeletePost(postId) } \ No newline at end of file diff --git a/domain/src/main/java/daily/dayo/domain/usecase/post/RequestEditPostUseCase.kt b/domain/src/main/java/daily/dayo/domain/usecase/post/RequestEditPostUseCase.kt index 40f6caf5..4fd86d0b 100644 --- a/domain/src/main/java/daily/dayo/domain/usecase/post/RequestEditPostUseCase.kt +++ b/domain/src/main/java/daily/dayo/domain/usecase/post/RequestEditPostUseCase.kt @@ -8,10 +8,10 @@ class RequestEditPostUseCase @Inject constructor( private val postRepository: PostRepository ) { suspend operator fun invoke( - postId: Int, + postId: Long, category: Category, contents: String, - folderId: Int, + folderId: Long, hashtags: List ) = postRepository.requestEditPost(postId, category, contents, folderId, hashtags) diff --git a/domain/src/main/java/daily/dayo/domain/usecase/post/RequestPostDetailUseCase.kt b/domain/src/main/java/daily/dayo/domain/usecase/post/RequestPostDetailUseCase.kt index 8167d252..65c37ec6 100644 --- a/domain/src/main/java/daily/dayo/domain/usecase/post/RequestPostDetailUseCase.kt +++ b/domain/src/main/java/daily/dayo/domain/usecase/post/RequestPostDetailUseCase.kt @@ -6,6 +6,6 @@ import javax.inject.Inject class RequestPostDetailUseCase @Inject constructor( private val postRepository: PostRepository ) { - suspend operator fun invoke(postId: Int) = + suspend operator fun invoke(postId: Long) = postRepository.requestPostDetail(postId) } \ No newline at end of file diff --git a/domain/src/main/java/daily/dayo/domain/usecase/post/RequestUploadPostUseCase.kt b/domain/src/main/java/daily/dayo/domain/usecase/post/RequestUploadPostUseCase.kt index 9071aeb8..3c5b6457 100644 --- a/domain/src/main/java/daily/dayo/domain/usecase/post/RequestUploadPostUseCase.kt +++ b/domain/src/main/java/daily/dayo/domain/usecase/post/RequestUploadPostUseCase.kt @@ -17,7 +17,7 @@ class RequestUploadPostUseCase @Inject constructor( category: Category, contents: String, files: Array, - folderId: Int, + folderId: Long, tags: Array ): NetworkResponse { val uploadFiles: ArrayList = ArrayList() diff --git a/domain/src/main/java/daily/dayo/domain/usecase/report/RequestSavePostReportUseCase.kt b/domain/src/main/java/daily/dayo/domain/usecase/report/RequestSavePostReportUseCase.kt index 8a65b7f0..70f571ab 100644 --- a/domain/src/main/java/daily/dayo/domain/usecase/report/RequestSavePostReportUseCase.kt +++ b/domain/src/main/java/daily/dayo/domain/usecase/report/RequestSavePostReportUseCase.kt @@ -6,6 +6,6 @@ import javax.inject.Inject class RequestSavePostReportUseCase @Inject constructor( private val reportRepository: ReportRepository ) { - suspend operator fun invoke(comment: String, postId: Int) = + suspend operator fun invoke(comment: String, postId: Long) = reportRepository.requestSavePostReport(comment = comment, postId = postId) } \ No newline at end of file diff --git a/presentation/src/main/java/daily/dayo/presentation/activity/MainActivity.kt b/presentation/src/main/java/daily/dayo/presentation/activity/MainActivity.kt index fc02d81d..58969ae7 100644 --- a/presentation/src/main/java/daily/dayo/presentation/activity/MainActivity.kt +++ b/presentation/src/main/java/daily/dayo/presentation/activity/MainActivity.kt @@ -3,12 +3,9 @@ package daily.dayo.presentation.activity import android.Manifest import android.content.Intent import android.content.pm.PackageManager -import android.graphics.Rect import android.os.Build import android.os.Bundle import android.provider.Settings -import android.view.MotionEvent -import android.view.View import android.widget.Toast import androidx.activity.OnBackPressedCallback import androidx.activity.compose.setContent @@ -18,14 +15,8 @@ import androidx.appcompat.app.AppCompatActivity import androidx.core.app.ActivityCompat import androidx.core.app.NotificationManagerCompat import androidx.core.content.ContextCompat -import androidx.core.view.forEach -import androidx.navigation.NavController -import androidx.navigation.fragment.NavHostFragment -import androidx.navigation.ui.setupWithNavController import dagger.hilt.android.AndroidEntryPoint import daily.dayo.presentation.R -import daily.dayo.presentation.databinding.ActivityMainBinding -import daily.dayo.presentation.fragment.home.HomeFragmentDirections import daily.dayo.presentation.screen.main.MainScreen import daily.dayo.presentation.theme.DayoTheme import daily.dayo.presentation.viewmodel.AccountViewModel @@ -33,18 +24,12 @@ import daily.dayo.presentation.viewmodel.SettingNotificationViewModel @AndroidEntryPoint class MainActivity : AppCompatActivity() { - private lateinit var binding: ActivityMainBinding private val accountViewModel by viewModels() private val settingNotificationViewModel by viewModels() override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - binding = ActivityMainBinding.inflate(layoutInflater) - // setContentView(binding.root) setSystemBackClickListener() checkCurrentNotification() - initBottomNavigation() - setBottomNaviVisibility() - disableBottomNaviTooltip() getNotificationData() askNotificationPermission() setContent { @@ -66,8 +51,6 @@ class MainActivity : AppCompatActivity() { if (backStackEntryCount == 0) { this@MainActivity.finish() - } else { - findNavController().popBackStack() } } } @@ -89,16 +72,6 @@ class MainActivity : AppCompatActivity() { if (extraFragment != null && extraFragment == "Notification") { val postId = intent.getStringExtra("PostId")?.toInt() val memberId = intent.getStringExtra("MemberId") - if (postId != null) findNavController().navigate( - HomeFragmentDirections.actionHomeFragmentToPostFragment( - postId = postId - ) - ) - else if (memberId != null) findNavController().navigate( - HomeFragmentDirections.actionHomeFragmentToProfileFragment( - memberId = memberId - ) - ) } } @@ -177,84 +150,6 @@ class MainActivity : AppCompatActivity() { } } - private fun initBottomNavigation() { - binding.bottomNavigationMainBar.setupWithNavController(findNavController()) - } - - private fun findNavController(): NavController { - val navHostFragment = - supportFragmentManager.findFragmentById(R.id.nav_host_fragment) as NavHostFragment - return navHostFragment.navController - } - - private fun setBottomNaviVisibility() { - binding.bottomNavigationMainBar.itemIconTintList = null - findNavController().addOnDestinationChangedListener { _, destination, _ -> - binding.layoutBottomNavigationMain.visibility = when (destination.id) { - R.id.HomeFragment -> View.VISIBLE - R.id.FeedFragment -> View.VISIBLE - R.id.MyPageFragment -> View.VISIBLE - else -> View.GONE - } - } - // WriteFragment - binding.bottomNavigationMainBar.setItemOnTouchListener(R.id.WriteFragment, - object : View.OnTouchListener { - var rect = Rect() - var isInside = true - override fun onTouch(v: View?, event: MotionEvent?): Boolean { - when (event?.action) { - MotionEvent.ACTION_DOWN -> { - binding.bottomNavigationMainBar.menu.findItem(R.id.WriteFragment) - .setIcon(R.drawable.ic_write_filled) - rect = Rect(v!!.left, v.top, v.right, v.bottom) - isInside = true - return true - } - - MotionEvent.ACTION_MOVE -> { - isInside = - rect.contains(v!!.left + event.x.toInt(), v.top + event.y.toInt()) - binding.bottomNavigationMainBar.clearFocus() - return false - } - - MotionEvent.ACTION_UP -> { - binding.bottomNavigationMainBar.menu.findItem(R.id.WriteFragment) - .setIcon(R.drawable.ic_write) - if (isInside) { - when (findNavController().currentDestination!!.id) { - R.id.HomeFragment -> findNavController().navigate(R.id.action_homeFragment_to_writeFragment) - R.id.FeedFragment -> findNavController().navigate(R.id.action_feedFragment_to_writeFragment) - R.id.MyPageFragment -> findNavController().navigate(R.id.action_myPageFragment_to_writeFragment) - } - } - return true - } - - else -> return true - } - } - }) - } - - private fun disableBottomNaviTooltip() { - binding.bottomNavigationMainBar.menu.forEach { - val view = binding.bottomNavigationMainBar.findViewById(it.itemId) - view.setOnLongClickListener { - true - } - } - } - - fun setBottomNavigationIconClickListener(reselectedIconId: Int, reselectAction: () -> Unit) { - binding.bottomNavigationMainBar.setOnItemReselectedListener { - when (it.itemId) { - reselectedIconId -> reselectAction() - } - } - } - companion object { val notificationPermission = arrayOf(Manifest.permission.POST_NOTIFICATIONS) } diff --git a/presentation/src/main/java/daily/dayo/presentation/adapter/FeedListAdapter.kt b/presentation/src/main/java/daily/dayo/presentation/adapter/FeedListAdapter.kt deleted file mode 100644 index fc896f25..00000000 --- a/presentation/src/main/java/daily/dayo/presentation/adapter/FeedListAdapter.kt +++ /dev/null @@ -1,407 +0,0 @@ -package daily.dayo.presentation.adapter - -import android.content.res.ColorStateList -import android.util.TypedValue -import android.view.LayoutInflater -import android.view.View -import android.view.ViewGroup -import android.widget.ImageButton -import android.widget.ImageView -import android.widget.LinearLayout -import androidx.core.content.ContextCompat -import androidx.databinding.library.baseAdapters.BR -import androidx.navigation.Navigation -import androidx.paging.PagingDataAdapter -import androidx.recyclerview.widget.DiffUtil -import androidx.recyclerview.widget.RecyclerView -import androidx.viewpager2.widget.ViewPager2 -import com.airbnb.lottie.LottieAnimationView -import com.bumptech.glide.Glide -import com.bumptech.glide.RequestManager -import com.google.android.material.chip.Chip -import daily.dayo.domain.model.Post -import daily.dayo.domain.model.User -import daily.dayo.domain.model.categoryKR -import daily.dayo.presentation.R -import daily.dayo.presentation.common.GlideLoadUtil.loadImageView -import daily.dayo.presentation.common.ReplaceUnicode.trimBlankText -import daily.dayo.presentation.common.TimeChangerUtil.timeChange -import daily.dayo.presentation.common.extension.navigateSafe -import daily.dayo.presentation.common.setOnDebounceClickListener -import daily.dayo.presentation.databinding.ItemFeedPostBinding -import daily.dayo.presentation.fragment.feed.FeedFragmentDirections - -class FeedListAdapter(private val requestManager: RequestManager, private val currentUserInfo: User) : - PagingDataAdapter(diffCallback) { - - private var glideRequestManager: RequestManager? = null - private var postImageSliderAdapter: PostImageSliderAdapter? = null - private var indicators: Array? = null - - companion object { - private val diffCallback = object : DiffUtil.ItemCallback() { - override fun areItemsTheSame(oldItem: Post, newItem: Post) = - oldItem.postId == newItem.postId - - override fun areContentsTheSame(oldItem: Post, newItem: Post): Boolean = - oldItem.apply { - preLoadThumbnail = null - preLoadUserImg = null - } == newItem.apply { - preLoadThumbnail = null - preLoadUserImg = null - } - - // areItemTheSame()이 true, areContentsTheSame()이 false을 호출 하면 반환 - override fun getChangePayload(oldItem: Post, newItem: Post): Any? { - return if (oldItem.heart != newItem.heart - || oldItem.heartCount != newItem.heartCount - || oldItem.commentCount != newItem.commentCount - || oldItem.bookmark != newItem.bookmark - ) true else null - } - } - } - - interface OnItemClickListener { - fun likePostClick(button: ImageButton, post: Post, position: Int) - fun likeCountClick(postId: Int) - fun bookmarkPostClick(button: ImageButton, post: Post, position: Int) - fun tagPostClick(chip: Chip) - } - - private var listener: OnItemClickListener? = null - fun setOnItemClickListener(listener: OnItemClickListener) { - this.listener = listener - } - - fun updateItemAtPosition(position: Int, newPost: Post) { - getItem(position).run { newPost } - notifyItemChanged(position) - } - - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): FeedListViewHolder { - return FeedListViewHolder( - ItemFeedPostBinding.inflate(LayoutInflater.from(parent.context), parent, false) - ) - } - - override fun onBindViewHolder( - holder: FeedListViewHolder, - position: Int, - payloads: MutableList - ) { - if (payloads.isEmpty()) { - this.onBindViewHolder(holder, position) - } else { - if (payloads[0] == true) { - if (getItem(position) == null) { - this.onBindViewHolder(holder, position) - } else { - holder.bindReactionState(getItem(position)!!) - } - } - } - } - - override fun onBindViewHolder(holder: FeedListViewHolder, position: Int) { - holder.bind(getItem(position)) - } - - override fun onDetachedFromRecyclerView(recyclerView: RecyclerView) { - super.onDetachedFromRecyclerView(recyclerView) - glideRequestManager = null - postImageSliderAdapter = null - indicators = null - } - - inner class FeedListViewHolder(private val binding: ItemFeedPostBinding) : - RecyclerView.ViewHolder(binding.root) { - fun bind(post: Post?) { - with(binding) { - post?.let { - this.post = it - this.createDateTime = timeChange( - context = binding.tvFeedPostTime.context, - time = it.createDateTime ?: "" - ) - this.heart = it.heart - this.heartCountStr = it.heartCount.toString() - this.commentCountStr = it.commentCount?.toString() ?: "" - this.bookmark = it.bookmark - } - } - - binding.categoryKR = post?.category?.let { categoryKR(it) } - loadImageView( - requestManager = requestManager, - width = binding.imgFeedPostUserProfile.width, - height = binding.imgFeedPostUserProfile.height, - imgName = post?.userProfileImage ?: "", - imgView = binding.imgFeedPostUserProfile - ) - - // 이미지 - setImageSlider() - binding.viewFeedPostImageIndicators.removeAllViews() - post?.postImages?.let { - postImageSliderAdapter?.submitList(it) - if (it.size > 1) setUpIndicators(it.size) - } - - // 옵션 - val isMine = (post?.memberId == currentUserInfo.memberId) - setPostOptionClickListener( - isMine = isMine, - postId = post?.postId!!, - memberId = post.memberId!! - ) - post.memberId?.let { memberId -> - setOnUserProfileClickListener(postMemberId = memberId) - } - post.postId?.let { postId -> - setOnPostClickListener(postId = postId, nickname = post.nickname) - } - - // 해시태그 - if (post.hashtags?.isNotEmpty() == true) { - binding.layoutFeedPostTagList.visibility = View.VISIBLE - post.hashtags?.let { hashTags -> - setTagList(hashTags) - } - } else { - binding.layoutFeedPostTagList.visibility = View.GONE - } - - // 좋아요 - binding.btnFeedPostLike.setOnDebounceClickListener { - listener?.likePostClick( - button = binding.btnFeedPostLike, - post = post, - position = bindingAdapterPosition - ) - } - - binding.tvFeedPostLikeCount.setOnDebounceClickListener { - post.postId?.let { postId -> - if (post.heartCount > 0) listener?.likeCountClick(postId = postId) - } - } - - postImageSliderAdapter?.setOnItemClickListener(object : - PostImageSliderAdapter.OnItemClickListener { - override fun postImageDoubleTap(lottieAnimationView: LottieAnimationView) { - if (!post.heart) { - lottieAnimationView.visibility = View.VISIBLE - lottieAnimationView.playAnimation() - listener?.likePostClick( - button = binding.btnFeedPostLike, - post = post, - position = bindingAdapterPosition - ) - } - } - }) - - // 북마크 - binding.btnFeedPostBookmark.setOnDebounceClickListener { - listener?.bookmarkPostClick( - button = binding.btnFeedPostBookmark, - post = post, - position = bindingAdapterPosition - ) - } - } - - private fun setImageSlider() { - glideRequestManager = Glide.with(binding.root) - postImageSliderAdapter = glideRequestManager?.let { requestManager -> - PostImageSliderAdapter(requestManager = requestManager) - } - - with(binding.vpFeedPostImage) { - adapter = postImageSliderAdapter - overScrollMode = View.OVER_SCROLL_NEVER - offscreenPageLimit = 1 - registerOnPageChangeCallback(object : ViewPager2.OnPageChangeCallback() { - override fun onPageSelected(position: Int) { - super.onPageSelected(position) - setCurrentIndicator(position) - } - }) - } - } - - private fun setUpIndicators(count: Int) { - indicators = arrayOfNulls(count) - val params = LinearLayout.LayoutParams( - ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT - ) - params.setMargins(16, 8, 16, 8) - - indicators?.let { indicators -> - for (i in indicators.indices) { - indicators[i] = ImageView(binding.root.context) - indicators[i]!!.setImageDrawable( - ContextCompat.getDrawable(binding.root.context, R.drawable.ic_indicator_inactive) - ) - indicators[i]!!.layoutParams = params - binding.viewFeedPostImageIndicators.addView(indicators[i]) - } - } - setCurrentIndicator(0) - } - - private fun setCurrentIndicator(position: Int) { - val childCount: Int = binding.viewFeedPostImageIndicators.childCount - for (i in 0 until childCount) { - val imageView = binding.viewFeedPostImageIndicators.getChildAt(i) as ImageView - if (i == position) { - imageView.setImageDrawable( - ContextCompat.getDrawable(binding.root.context, R.drawable.ic_indicator_active) - ) - } else { - imageView.setImageDrawable( - ContextCompat.getDrawable(binding.root.context, R.drawable.ic_indicator_inactive) - ) - } - } - } - - private fun setTagList(tagList: List) { - binding.chipgroupFeedPostTagList.removeAllViews() - if (!tagList.isNullOrEmpty()) { - (tagList.indices).mapNotNull { index -> - val chip = LayoutInflater.from(binding.chipgroupFeedPostTagList.context) - .inflate(R.layout.item_post_tag, null) as Chip - val layoutParams = ViewGroup.MarginLayoutParams( - ViewGroup.MarginLayoutParams.WRAP_CONTENT, - ViewGroup.MarginLayoutParams.WRAP_CONTENT - ) - with(chip) { - chipBackgroundColor = - ColorStateList( - arrayOf( - intArrayOf(-android.R.attr.state_pressed), - intArrayOf(android.R.attr.state_pressed) - ), - intArrayOf( - resources.getColor(R.color.gray_6_F0F1F3, context?.theme), - resources.getColor( - R.color.primary_green_23C882, context?.theme - ) - ) - ) - - setTextColor( - ColorStateList( - arrayOf( - intArrayOf(-android.R.attr.state_pressed), - intArrayOf(android.R.attr.state_pressed) - ), - intArrayOf( - resources.getColor(R.color.gray_1_313131, context?.theme), - resources.getColor( - R.color.white_FFFFFF, context?.theme - ) - ) - ) - ) - setTextSize(TypedValue.COMPLEX_UNIT_DIP, 12F) - text = "# ${trimBlankText(tagList[index])}" - - setOnDebounceClickListener { - listener?.tagPostClick(chip = this) - } - } - binding.chipgroupFeedPostTagList.addView(chip, layoutParams) - } - } - } - - private fun setOnUserProfileClickListener(postMemberId: String) { - binding.imgFeedPostUserProfile.setOnDebounceClickListener { - Navigation.findNavController(it) - .navigateSafe( - currentDestinationId = R.id.FeedFragment, - action = R.id.action_feedFragment_to_profileFragment, - args = FeedFragmentDirections.actionFeedFragmentToProfileFragment(memberId = postMemberId).arguments - ) - } - binding.tvFeedPostUserNickname.setOnDebounceClickListener { - Navigation.findNavController(it) - .navigateSafe( - currentDestinationId = R.id.FeedFragment, - action = R.id.action_feedFragment_to_profileFragment, - args = FeedFragmentDirections.actionFeedFragmentToProfileFragment(memberId = postMemberId).arguments - ) - } - } - - private fun setOnPostClickListener(postId: Int, nickname: String) { - binding.tvFeedPostContent.setOnDebounceClickListener { - Navigation.findNavController(it) - .navigateSafe( - currentDestinationId = R.id.FeedFragment, - action = R.id.action_feedFragment_to_postFragment, - args = FeedFragmentDirections.actionFeedFragmentToPostFragment(postId = postId).arguments - ) - } - binding.btnFeedPostComment.setOnDebounceClickListener { - Navigation.findNavController(it) - .navigateSafe( - currentDestinationId = R.id.FeedFragment, - action = R.id.action_feedFragment_to_postFragment, - args = FeedFragmentDirections.actionFeedFragmentToPostFragment(postId = postId).arguments - ) - } - } - - private fun setPostOptionClickListener(isMine: Boolean, postId: Int, memberId: String) { - binding.btnFeedPostOption.setOnDebounceClickListener { - if (isMine) { - Navigation.findNavController(it) - .navigateSafe( - currentDestinationId = R.id.FeedFragment, - action = R.id.action_feedFragment_to_postOptionFragment, - args = FeedFragmentDirections.actionFeedFragmentToPostOptionMineFragment( - postId = postId - ).arguments - ) - } else { - Navigation.findNavController(it) - .navigateSafe( - currentDestinationId = R.id.FeedFragment, - action = R.id.action_feedFragment_to_postOptionFragment, - args = FeedFragmentDirections.actionFeedFragmentToPostOptionFragment( - postId = postId, memberId = memberId - ).arguments - ) - } - } - } - - fun bindReactionState(post: Post) { - setHeartState(post) - } - - private fun setHeartState(post: Post) { - binding.post?.let { - it.heart = post.heart - it.heartCount = post.heartCount - it.bookmark = post.bookmark - } - setBindingSetVariable(post) - } - - private fun setBindingSetVariable(post: Post) { - with(binding) { - setVariable(BR.heart, post.heart) - setVariable(BR.heartCountStr, post.heartCount.toString()) - setVariable(BR.commentCountStr, post.commentCount.toString()) - setVariable(BR.bookmark, post.bookmark) - executePendingBindings() - } - } - } -} \ No newline at end of file diff --git a/presentation/src/main/java/daily/dayo/presentation/adapter/FolderPostListAdapter.kt b/presentation/src/main/java/daily/dayo/presentation/adapter/FolderPostListAdapter.kt deleted file mode 100644 index 18c8080b..00000000 --- a/presentation/src/main/java/daily/dayo/presentation/adapter/FolderPostListAdapter.kt +++ /dev/null @@ -1,89 +0,0 @@ -package daily.dayo.presentation.adapter - -import android.util.Log -import android.view.LayoutInflater -import android.view.View -import android.view.ViewGroup -import androidx.navigation.Navigation -import androidx.paging.PagingDataAdapter -import androidx.recyclerview.widget.DiffUtil -import androidx.recyclerview.widget.RecyclerView -import com.bumptech.glide.RequestManager -import daily.dayo.domain.model.FolderPost -import daily.dayo.presentation.R -import daily.dayo.presentation.common.GlideLoadUtil.loadImageView -import daily.dayo.presentation.common.extension.navigateSafe -import daily.dayo.presentation.common.setOnDebounceClickListener -import daily.dayo.presentation.databinding.ItemFolderPostBinding -import daily.dayo.presentation.fragment.mypage.folder.FolderFragmentDirections -import kotlinx.coroutines.CancellationException -import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.Dispatchers -import kotlinx.coroutines.launch - -class FolderPostListAdapter(private val requestManager: RequestManager) : - PagingDataAdapter(diffCallback) { - - companion object { - private val diffCallback = object : DiffUtil.ItemCallback() { - override fun areItemsTheSame(oldItem: FolderPost, newItem: FolderPost) = - oldItem.postId == newItem.postId - - override fun areContentsTheSame(oldItem: FolderPost, newItem: FolderPost): Boolean = - oldItem == newItem - } - } - - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): FolderPostListViewHolder { - return FolderPostListViewHolder( - ItemFolderPostBinding.inflate(LayoutInflater.from(parent.context), parent, false) - ) - } - - override fun onBindViewHolder(holder: FolderPostListViewHolder, position: Int) { - holder.bind(getItem(position)) - } - - inner class FolderPostListViewHolder(private val binding: ItemFolderPostBinding) : - RecyclerView.ViewHolder(binding.root) { - - fun bind(folderPost: FolderPost?) { - val layoutParams = ViewGroup.MarginLayoutParams( - ViewGroup.MarginLayoutParams.MATCH_PARENT, - ViewGroup.MarginLayoutParams.MATCH_PARENT - ) - - binding.layoutFolderPostContentsShimmer.startShimmer() - binding.layoutFolderPostContentsShimmer.visibility = View.VISIBLE - binding.imgFolderPost.visibility = View.INVISIBLE - - CoroutineScope(Dispatchers.Main).launch { - loadImageView( - requestManager = requestManager, - width = layoutParams.width, - height = layoutParams.width, - imgName = folderPost?.thumbnailImage ?: "", - imgView = binding.imgFolderPost - ) - }.invokeOnCompletion { throwable -> - when (throwable) { - is CancellationException -> Log.e("Image Loading", "CANCELLED") - null -> { - binding.layoutFolderPostContentsShimmer.stopShimmer() - binding.layoutFolderPostContentsShimmer.visibility = View.GONE - binding.imgFolderPost.visibility = View.VISIBLE - } - } - } - - binding.root.setOnDebounceClickListener { - Navigation.findNavController(it) - .navigateSafe( - currentDestinationId = R.id.FolderFragment, - action = R.id.action_folderFragment_to_postFragment, - args = FolderFragmentDirections.actionFolderFragmentToPostFragment(folderPost!!.postId).arguments - ) - } - } - } -} \ No newline at end of file diff --git a/presentation/src/main/java/daily/dayo/presentation/adapter/FolderSettingAdapter.kt b/presentation/src/main/java/daily/dayo/presentation/adapter/FolderSettingAdapter.kt deleted file mode 100644 index 3b3143a4..00000000 --- a/presentation/src/main/java/daily/dayo/presentation/adapter/FolderSettingAdapter.kt +++ /dev/null @@ -1,78 +0,0 @@ -package daily.dayo.presentation.adapter - -import android.view.LayoutInflater -import android.view.MotionEvent -import android.view.ViewGroup -import androidx.recyclerview.widget.AsyncListDiffer -import androidx.recyclerview.widget.DiffUtil -import androidx.recyclerview.widget.RecyclerView -import daily.dayo.presentation.common.ItemTouchHelperCallback -import daily.dayo.presentation.databinding.ItemFolderListBinding -import daily.dayo.domain.model.Folder -import daily.dayo.domain.model.FolderOrder -import java.util.* - -class FolderSettingAdapter(private val isChange: Boolean) : - RecyclerView.Adapter(), - ItemTouchHelperCallback.OnItemMoveListener{ - - private lateinit var dragListener: OnStartDragListener - lateinit var folderOrderList: MutableList - - companion object { - private val diffCallback = object : DiffUtil.ItemCallback() { - override fun areItemsTheSame(oldItem: Folder, newItem: Folder) = - oldItem.folderId == newItem.folderId - - override fun areContentsTheSame(oldItem: Folder, newItem: Folder): Boolean = - oldItem == newItem - } - } - - private val differ = AsyncListDiffer(this, diffCallback) - fun submitList(list: List) = differ.submitList(list) - - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): FolderSettingViewHolder { - return FolderSettingViewHolder(ItemFolderListBinding.inflate(LayoutInflater.from(parent.context),parent, false)) - } - - override fun onBindViewHolder(holder: FolderSettingViewHolder, position: Int) { - val item = differ.currentList[position] - holder.isChange = isChange - if(isChange) { - holder.itemView.setOnTouchListener { view, event -> - if (event.action == MotionEvent.ACTION_DOWN) { - dragListener.onStartDrag(holder) - } - return@setOnTouchListener false - } - } - holder.bind(item) - } - - override fun getItemCount(): Int { - return differ.currentList.size - } - - interface OnStartDragListener { - fun onStartDrag(viewHolder: RecyclerView.ViewHolder) - } - - fun startDrag(listener: OnStartDragListener) { - this.dragListener = listener - } - - override fun onItemMoved(fromPosition: Int, toPosition: Int) { - Collections.swap(folderOrderList, fromPosition, toPosition) - folderOrderList[toPosition].orderIndex = folderOrderList[fromPosition].orderIndex.also { folderOrderList[fromPosition].orderIndex = folderOrderList[toPosition].orderIndex } - notifyItemMoved(fromPosition, toPosition) - } - - inner class FolderSettingViewHolder(private val binding: ItemFolderListBinding) : RecyclerView.ViewHolder(binding.root) { - var isChange = false - fun bind(folder: Folder) { - binding.folder = folder - binding.isChangeEnable = isChange - } - } -} diff --git a/presentation/src/main/java/daily/dayo/presentation/adapter/HomeDayoPickAdapter.kt b/presentation/src/main/java/daily/dayo/presentation/adapter/HomeDayoPickAdapter.kt deleted file mode 100644 index ab293620..00000000 --- a/presentation/src/main/java/daily/dayo/presentation/adapter/HomeDayoPickAdapter.kt +++ /dev/null @@ -1,332 +0,0 @@ -package daily.dayo.presentation.adapter - -import android.animation.Animator -import android.graphics.Bitmap -import android.util.Log -import android.view.LayoutInflater -import android.view.View -import android.view.ViewGroup -import androidx.core.view.isVisible -import androidx.databinding.library.baseAdapters.BR -import androidx.navigation.Navigation -import androidx.recyclerview.widget.DiffUtil -import androidx.recyclerview.widget.ListAdapter -import androidx.recyclerview.widget.RecyclerView -import com.bumptech.glide.RequestManager -import daily.dayo.domain.model.Post -import daily.dayo.presentation.R -import daily.dayo.presentation.common.GlideLoadUtil.HOME_POST_THUMBNAIL_SIZE -import daily.dayo.presentation.common.GlideLoadUtil.HOME_USER_THUMBNAIL_SIZE -import daily.dayo.presentation.common.GlideLoadUtil.loadImageBackground -import daily.dayo.presentation.common.GlideLoadUtil.loadImagePreload -import daily.dayo.presentation.common.GlideLoadUtil.loadImageView -import daily.dayo.presentation.common.GlideLoadUtil.loadImageViewProfile -import daily.dayo.presentation.common.extension.navigateSafe -import daily.dayo.presentation.common.setOnDebounceClickListener -import daily.dayo.presentation.common.toBitmap -import daily.dayo.presentation.databinding.ItemMainPostBinding -import daily.dayo.presentation.fragment.home.HomeFragmentDirections -import kotlinx.coroutines.CancellationException -import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.Dispatchers -import kotlinx.coroutines.launch -import kotlinx.coroutines.withContext - -class HomeDayoPickAdapter( - val rankingShowing: Boolean, - private val requestManager: RequestManager -) : ListAdapter(diffCallback) { - companion object { - private val diffCallback = object : DiffUtil.ItemCallback() { - override fun areItemsTheSame(oldItem: Post, newItem: Post) = - oldItem.postId == newItem.postId - - override fun areContentsTheSame(oldItem: Post, newItem: Post): Boolean = - oldItem.apply { - preLoadThumbnail = null - preLoadUserImg = null - } == newItem.apply { - preLoadThumbnail = null - preLoadUserImg = null - } - - override fun getChangePayload(oldItem: Post, newItem: Post): Any? { - return if (oldItem.heart != newItem.heart || oldItem.heartCount != newItem.heartCount) true else null - } - } - } - - interface OnItemClickListener { - fun likePostClick(post: Post) - } - - private var clickListener: OnItemClickListener? = null - fun setOnItemClickListener(listener: OnItemClickListener) { - this.clickListener = listener - } - - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): HomeDayoPickViewHolder { - return HomeDayoPickViewHolder( - ItemMainPostBinding.inflate( - LayoutInflater.from(parent.context), - parent, - false - ) - ) - } - - override fun onBindViewHolder( - holder: HomeDayoPickViewHolder, - position: Int, - payloads: MutableList - ) { - if (payloads.isEmpty()) { - this.onBindViewHolder(holder, position) - } else { - if (payloads[0] == true) { - holder.bindLikeState(getItem(position)) - } - } - } - - override fun onBindViewHolder(holder: HomeDayoPickViewHolder, position: Int) { - val item = getItem(position) - holder.bind(item, position) - preloadFutureLoadingImages(position) - } - - override fun getItemViewType(position: Int): Int { - // ViewHolder Pattern의 이점을 잃었지만, 카테고리 간 이동하면서 랭킹 숫자가 잘못 표시되는 점을 해결 - return position - } - - override fun submitList(list: MutableList?) { - super.submitList(list?.let { ArrayList(it) }) - } - - private fun preloadFutureLoadingImages(position: Int) { - if (position <= itemCount) { - val endPosition = if (position + 6 > itemCount) { - itemCount - } else { - position + 6 - } - for (i in position until endPosition) { - loadImagePreload( - requestManager = requestManager, - width = HOME_POST_THUMBNAIL_SIZE, - height = HOME_POST_THUMBNAIL_SIZE, - imgName = getItem(i).thumbnailImage ?: "" - ) - } - } - } - - inner class HomeDayoPickViewHolder( - private val binding: ItemMainPostBinding - ) : RecyclerView.ViewHolder(binding.root) { - lateinit var postContent: Post - - fun bind(postContent: Post, currentPosition: Int) { - this.postContent = postContent - loadImages() - setRanking(currentPosition) - - setBindingSetVariable( - postContent.apply { - binding.lottieMainPostLike.progress = if (heart) 1F else 0F - } - ) - postContent.postId?.let { setRootClickListener(it, postContent.nickname) } - postContent.memberId?.let { setNicknameClickListener(it) } - binding.lottieMainPostLike.setOnDebounceClickListener(300L) { - clickListener?.likePostClick(post = postContent) - } - } - - private fun setBindingSetVariable(post: Post) { - with(binding) { - setVariable(BR.post, post) - executePendingBindings() - } - } - - fun bindLikeState(post: Post) { - setLottieClickListener(post) - setHeartCount(post) - } - - private fun setLottieClickListener(post: Post) { - with(binding.lottieMainPostLike) { - setOnDebounceClickListener(300L) { - clickListener?.likePostClick(post = post) - } - - this.removeAllAnimatorListeners() - this.addAnimatorListener(object : Animator.AnimatorListener { - override fun onAnimationStart(animation: Animator) { - this@with.setOnDebounceClickListener(0L) {} - } - - override fun onAnimationEnd(animation: Animator) { - this@with.setOnDebounceClickListener(0L) { - clickListener?.likePostClick(post = post) - } - } - - override fun onAnimationCancel(animation: Animator) {} - override fun onAnimationRepeat(animation: Animator) {} - }) - - if (post.heart) this.playAnimation() - else this.progress = 0F - } - } - - private fun setHeartCount(post: Post) { - binding.post = post - setBindingSetVariable(post) - } - - private fun setRootClickListener(postId: Int, nickname: String) { - binding.root.setOnDebounceClickListener { - Navigation.findNavController(it).navigateSafe( - currentDestinationId = R.id.HomeFragment, - action = R.id.action_homeFragment_to_postFragment, - args = HomeFragmentDirections.actionHomeFragmentToPostFragment(postId).arguments - ) - } - } - - private fun setNicknameClickListener(memberId: String) { - binding.tvMainPostUserNickname.setOnDebounceClickListener { - Navigation.findNavController(it) - .navigateSafe( - currentDestinationId = R.id.HomeFragment, - action = R.id.action_homeFragment_to_profileFragment, - args = HomeFragmentDirections.actionHomeFragmentToProfileFragment(memberId = memberId).arguments - ) - } - } - - private fun startShimmer() { - with(binding.layoutContentsShimmer) { - startShimmer() - visibility = View.VISIBLE - setShimmerDisplay() - } - } - - private fun stopShimmer() { - with(binding.layoutContentsShimmer) { - stopShimmer() - visibility = View.GONE - setShimmerDisplay() - } - } - - private fun setShimmerDisplay() { - binding.layoutContents.isVisible = !binding.layoutContentsShimmer.isVisible - } - - private fun setRanking(currentPosition: Int) { - with(binding) { - layoutPostRankingNumber.isVisible = !(currentPosition > 3 || !rankingShowing) - tvPostRankingNumber.text = (currentPosition + 1).toString() - } - } - - private fun loadImages() { - startShimmer() - - val postImg = binding.imgMainPost - val userThumbnailImg = binding.imgMainPostUserProfile - - CoroutineScope(Dispatchers.Main).launch { - val postImgBitmap: Bitmap? - val userThumbnailImgBitmap: Bitmap? - if (postContent.preLoadThumbnail == null) { - postImgBitmap = withContext(Dispatchers.IO) { - loadImageBackground( - requestManager = requestManager, - width = HOME_POST_THUMBNAIL_SIZE, - height = HOME_POST_THUMBNAIL_SIZE, - imgName = postContent.thumbnailImage ?: "" - ) - } - userThumbnailImgBitmap = withContext(Dispatchers.IO) { - loadImageBackground( - requestManager = requestManager, - width = HOME_USER_THUMBNAIL_SIZE, - height = HOME_USER_THUMBNAIL_SIZE, - imgName = postContent.userProfileImage ?: "" - ) - } - } else { - postImgBitmap = postContent.preLoadThumbnail?.toBitmap - userThumbnailImgBitmap = postContent.preLoadUserImg?.toBitmap - postContent.preLoadThumbnail = null - postContent.preLoadUserImg = null - } - - try { - loadImageView( - requestManager = requestManager, - width = HOME_POST_THUMBNAIL_SIZE, - height = HOME_POST_THUMBNAIL_SIZE, - img = postImgBitmap!!, - imgView = postImg - ) - } catch (loadException: IllegalStateException) { - loadImageView( - requestManager = requestManager, - width = HOME_POST_THUMBNAIL_SIZE, - height = HOME_POST_THUMBNAIL_SIZE, - imgName = postContent.thumbnailImage ?: "", - imgView = postImg - ) - } catch (imgNullException: NullPointerException) { - loadImageView( - requestManager = requestManager, - width = HOME_POST_THUMBNAIL_SIZE, - height = HOME_POST_THUMBNAIL_SIZE, - imgName = postContent.thumbnailImage ?: "", - imgView = postImg - ) - } - try { - loadImageViewProfile( - requestManager = requestManager, - width = HOME_USER_THUMBNAIL_SIZE, - height = HOME_USER_THUMBNAIL_SIZE, - img = userThumbnailImgBitmap!!, - imgView = userThumbnailImg - ) - } catch (loadException: IllegalStateException) { - loadImageViewProfile( - requestManager = requestManager, - width = HOME_USER_THUMBNAIL_SIZE, - height = HOME_USER_THUMBNAIL_SIZE, - imgName = postContent.userProfileImage ?: "", - imgView = userThumbnailImg - ) - } catch (imgNullException: NullPointerException) { - loadImageViewProfile( - requestManager = requestManager, - width = HOME_USER_THUMBNAIL_SIZE, - height = HOME_USER_THUMBNAIL_SIZE, - imgName = postContent.userProfileImage ?: "", - imgView = userThumbnailImg - ) - } - }.invokeOnCompletion { throwable -> - when (throwable) { - is CancellationException -> Log.e("Image Loading", "CANCELLED") - null -> { - stopShimmer() - } - } - } - } - } -} \ No newline at end of file diff --git a/presentation/src/main/java/daily/dayo/presentation/adapter/HomeNewAdapter.kt b/presentation/src/main/java/daily/dayo/presentation/adapter/HomeNewAdapter.kt deleted file mode 100644 index 9ad33f70..00000000 --- a/presentation/src/main/java/daily/dayo/presentation/adapter/HomeNewAdapter.kt +++ /dev/null @@ -1,327 +0,0 @@ -package daily.dayo.presentation.adapter - -import android.animation.Animator -import android.graphics.Bitmap -import android.util.Log -import android.view.LayoutInflater -import android.view.View -import android.view.ViewGroup -import androidx.core.view.isVisible -import androidx.databinding.library.baseAdapters.BR -import androidx.navigation.Navigation -import androidx.recyclerview.widget.DiffUtil -import androidx.recyclerview.widget.ListAdapter -import androidx.recyclerview.widget.RecyclerView -import com.bumptech.glide.RequestManager -import daily.dayo.domain.model.Post -import daily.dayo.presentation.R -import daily.dayo.presentation.common.GlideLoadUtil.HOME_POST_THUMBNAIL_SIZE -import daily.dayo.presentation.common.GlideLoadUtil.HOME_USER_THUMBNAIL_SIZE -import daily.dayo.presentation.common.GlideLoadUtil.loadImageBackground -import daily.dayo.presentation.common.GlideLoadUtil.loadImageBackgroundProfile -import daily.dayo.presentation.common.GlideLoadUtil.loadImagePreload -import daily.dayo.presentation.common.GlideLoadUtil.loadImageView -import daily.dayo.presentation.common.GlideLoadUtil.loadImageViewProfile -import daily.dayo.presentation.common.extension.navigateSafe -import daily.dayo.presentation.common.setOnDebounceClickListener -import daily.dayo.presentation.common.toBitmap -import daily.dayo.presentation.databinding.ItemMainPostBinding -import daily.dayo.presentation.fragment.home.HomeFragmentDirections -import kotlinx.coroutines.CancellationException -import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.Dispatchers -import kotlinx.coroutines.launch -import kotlinx.coroutines.withContext - -class HomeNewAdapter(val rankingShowing: Boolean, private val requestManager: RequestManager) : - ListAdapter(diffCallback) { - companion object { - private val diffCallback = object : DiffUtil.ItemCallback() { - override fun areItemsTheSame(oldItem: Post, newItem: Post) = - oldItem.postId == newItem.postId - - override fun areContentsTheSame(oldItem: Post, newItem: Post): Boolean = - oldItem.apply { - preLoadThumbnail = null - preLoadUserImg = null - } == newItem.apply { - preLoadThumbnail = null - preLoadUserImg = null - } - - override fun getChangePayload(oldItem: Post, newItem: Post): Any? { - return if (oldItem.heart != newItem.heart || oldItem.heartCount != newItem.heartCount) true else null - } - } - } - - interface OnItemClickListener { - fun likePostClick(post: Post) - } - - private var clickListener: OnItemClickListener? = null - fun setOnItemClickListener(listener: OnItemClickListener) { - this.clickListener = listener - } - - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): HomeNewViewHolder { - return HomeNewViewHolder( - ItemMainPostBinding.inflate( - LayoutInflater.from(parent.context), - parent, - false - ) - ) - } - - override fun onBindViewHolder( - holder: HomeNewAdapter.HomeNewViewHolder, - position: Int, - payloads: MutableList - ) { - if (payloads.isEmpty()) { - this.onBindViewHolder(holder, position) - } else { - if (payloads[0] == true) { - holder.bindLikeState(getItem(position)) - } - } - } - - override fun onBindViewHolder(holder: HomeNewViewHolder, position: Int) { - val item = getItem(position) - holder.bind(item, position) - preloadFutureLoadingImages(position) - } - - override fun submitList(list: MutableList?) { - super.submitList(list?.let { ArrayList(it) }) - } - - private fun preloadFutureLoadingImages(position: Int) { - if (position <= itemCount) { - val endPosition = if (position + 6 > itemCount) { - itemCount - } else { - position + 6 - } - for (i in position until endPosition) { - loadImagePreload( - requestManager = requestManager, - width = HOME_POST_THUMBNAIL_SIZE, - height = HOME_POST_THUMBNAIL_SIZE, - imgName = getItem(i).thumbnailImage ?: "" - ) - } - } - } - - inner class HomeNewViewHolder( - private val binding: ItemMainPostBinding - ) : RecyclerView.ViewHolder(binding.root) { - lateinit var postContent: Post - - fun bind(postContent: Post, currentPosition: Int) { - this.postContent = postContent - loadImages() - setRanking(currentPosition) - - setBindingSetVariable( - postContent.apply { - binding.lottieMainPostLike.progress = if (heart) 1F else 0F - } - ) - postContent.postId?.let { setRootClickListener(it, postContent.nickname) } - postContent.memberId?.let { setNicknameClickListener(it) } - binding.lottieMainPostLike.setOnDebounceClickListener(300L) { - clickListener?.likePostClick(post = postContent) - } - } - - private fun setBindingSetVariable(post: Post) { - with(binding) { - setVariable(BR.post, post) - executePendingBindings() - } - } - - fun bindLikeState(post: Post) { - setLottieClickListener(post) - setHeartCount(post) - } - - private fun setLottieClickListener(post: Post) { - with(binding.lottieMainPostLike) { - setOnDebounceClickListener(300L) { - clickListener?.likePostClick(post = post) - } - - this.removeAllAnimatorListeners() - this.addAnimatorListener(object : Animator.AnimatorListener { - override fun onAnimationStart(animation: Animator) { - this@with.setOnDebounceClickListener(0L) {} - } - - override fun onAnimationEnd(animation: Animator) { - this@with.setOnDebounceClickListener(0L) { - clickListener?.likePostClick(post = post) - } - } - - override fun onAnimationCancel(animation: Animator) {} - override fun onAnimationRepeat(animation: Animator) {} - }) - - if (post.heart) this.playAnimation() - else this.progress = 0F - } - } - - private fun setHeartCount(post: Post) { - binding.post = post - setBindingSetVariable(post) - } - - private fun setRootClickListener(postId: Int, nickname: String) { - binding.root.setOnDebounceClickListener { - Navigation.findNavController(it).navigateSafe( - currentDestinationId = R.id.HomeFragment, - action = R.id.action_homeFragment_to_postFragment, - args = HomeFragmentDirections.actionHomeFragmentToPostFragment(postId).arguments - ) - } - } - - private fun setNicknameClickListener(memberId: String) { - binding.tvMainPostUserNickname.setOnDebounceClickListener { - Navigation.findNavController(it) - .navigateSafe( - currentDestinationId = R.id.HomeFragment, - action = R.id.action_homeFragment_to_profileFragment, - args = HomeFragmentDirections.actionHomeFragmentToProfileFragment(memberId = memberId).arguments - ) - } - } - - private fun startShimmer() { - with(binding.layoutContentsShimmer) { - startShimmer() - visibility = View.VISIBLE - setShimmerDisplay() - } - } - - private fun stopShimmer() { - with(binding.layoutContentsShimmer) { - stopShimmer() - visibility = View.GONE - setShimmerDisplay() - } - } - - private fun setShimmerDisplay() { - binding.layoutContents.isVisible = !binding.layoutContentsShimmer.isVisible - } - - private fun setRanking(currentPosition: Int) { - with(binding) { - layoutPostRankingNumber.isVisible = !(currentPosition > 3 || !rankingShowing) - tvPostRankingNumber.text = (currentPosition + 1).toString() - } - } - - private fun loadImages() { - startShimmer() - - val postImg = binding.imgMainPost - val userThumbnailImg = binding.imgMainPostUserProfile - - - CoroutineScope(Dispatchers.Main).launch { - val postImgBitmap: Bitmap? - val userThumbnailImgBitmap: Bitmap? - if (postContent.preLoadThumbnail == null) { - postImgBitmap = withContext(Dispatchers.IO) { - loadImageBackground( - requestManager = requestManager, - width = HOME_POST_THUMBNAIL_SIZE, - height = HOME_POST_THUMBNAIL_SIZE, - imgName = postContent.thumbnailImage ?: "" - ) - } - userThumbnailImgBitmap = withContext(Dispatchers.IO) { - loadImageBackgroundProfile( - requestManager = requestManager, - width = HOME_USER_THUMBNAIL_SIZE, - height = HOME_USER_THUMBNAIL_SIZE, - imgName = postContent.userProfileImage ?: "" - ) - } - } else { - postImgBitmap = postContent.preLoadThumbnail?.toBitmap - userThumbnailImgBitmap = postContent.preLoadUserImg?.toBitmap - postContent.preLoadThumbnail = null - postContent.preLoadUserImg = null - } - - try { - loadImageView( - requestManager = requestManager, - width = HOME_POST_THUMBNAIL_SIZE, - height = HOME_POST_THUMBNAIL_SIZE, - img = postImgBitmap!!, - imgView = postImg - ) - } catch (loadException: IllegalStateException) { - loadImageView( - requestManager = requestManager, - width = HOME_POST_THUMBNAIL_SIZE, - height = HOME_POST_THUMBNAIL_SIZE, - imgName = postContent.thumbnailImage ?: "", - imgView = postImg - ) - } catch (imgNullException: NullPointerException) { - loadImageView( - requestManager = requestManager, - width = HOME_POST_THUMBNAIL_SIZE, - height = HOME_POST_THUMBNAIL_SIZE, - imgName = postContent.thumbnailImage ?: "", - imgView = postImg - ) - } - try { - loadImageViewProfile( - requestManager = requestManager, - width = HOME_USER_THUMBNAIL_SIZE, - height = HOME_USER_THUMBNAIL_SIZE, - img = userThumbnailImgBitmap!!, - imgView = userThumbnailImg - ) - } catch (loadException: IllegalStateException) { - loadImageViewProfile( - requestManager = requestManager, - width = HOME_USER_THUMBNAIL_SIZE, - height = HOME_USER_THUMBNAIL_SIZE, - imgName = postContent.userProfileImage ?: "", - imgView = userThumbnailImg - ) - } catch (imgNullException: NullPointerException) { - loadImageViewProfile( - requestManager = requestManager, - width = HOME_USER_THUMBNAIL_SIZE, - height = HOME_USER_THUMBNAIL_SIZE, - imgName = postContent.userProfileImage ?: "", - imgView = userThumbnailImg - ) - } - }.invokeOnCompletion { throwable -> - when (throwable) { - is CancellationException -> Log.e("Image Loading", "CANCELLED") - null -> { - stopShimmer() - } - } - } - } - } -} \ No newline at end of file diff --git a/presentation/src/main/java/daily/dayo/presentation/adapter/WriteFolderAdapter.kt b/presentation/src/main/java/daily/dayo/presentation/adapter/WriteFolderAdapter.kt deleted file mode 100644 index acb1c8bf..00000000 --- a/presentation/src/main/java/daily/dayo/presentation/adapter/WriteFolderAdapter.kt +++ /dev/null @@ -1,59 +0,0 @@ -package daily.dayo.presentation.adapter - -import android.graphics.Typeface -import android.view.LayoutInflater -import android.view.ViewGroup -import androidx.recyclerview.widget.DiffUtil -import androidx.recyclerview.widget.ListAdapter -import androidx.recyclerview.widget.RecyclerView -import daily.dayo.presentation.common.setOnDebounceClickListener -import daily.dayo.presentation.databinding.ItemFolderListBinding -import daily.dayo.domain.model.Folder - -class WriteFolderAdapter( - private val onFolderClicked: (Folder) -> Unit, - private val selectedFolderId: String -) : ListAdapter(diffCallback) { - - companion object { - private val diffCallback = object : DiffUtil.ItemCallback() { - override fun areItemsTheSame(oldItem: Folder, newItem: Folder) = - oldItem.folderId == newItem.folderId - - override fun areContentsTheSame(oldItem: Folder, newItem: Folder): Boolean = - oldItem == newItem - } - } - - override fun submitList(list: List?) { - super.submitList(list) - } - - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): WriteFolderViewHolder { - return WriteFolderViewHolder( - ItemFolderListBinding.inflate(LayoutInflater.from(parent.context), parent, false), - onFolderClicked - ) - } - - override fun onBindViewHolder(holder: WriteFolderViewHolder, position: Int) { - holder.bind(getItem(position)) - } - - inner class WriteFolderViewHolder( - private val binding: ItemFolderListBinding, - val onFolderClicked: (Folder) -> Unit - ) : RecyclerView.ViewHolder(binding.root) { - fun bind(folder: Folder) { - binding.folder = folder - binding.isChangeEnable = false - if (selectedFolderId != "" && selectedFolderId.toInt() == folder.folderId) - binding.tvFolderName.setTypeface(null, Typeface.BOLD) - else binding.tvFolderName.setTypeface(null, Typeface.NORMAL) - - binding.root.setOnDebounceClickListener { - onFolderClicked(folder) - } - } - } -} diff --git a/presentation/src/main/java/daily/dayo/presentation/adapter/WriteUploadImageListAdapter.kt b/presentation/src/main/java/daily/dayo/presentation/adapter/WriteUploadImageListAdapter.kt deleted file mode 100644 index 96b1db6f..00000000 --- a/presentation/src/main/java/daily/dayo/presentation/adapter/WriteUploadImageListAdapter.kt +++ /dev/null @@ -1,115 +0,0 @@ -package daily.dayo.presentation.adapter - -import android.view.LayoutInflater -import android.view.View -import android.view.ViewGroup -import androidx.recyclerview.widget.DiffUtil -import androidx.recyclerview.widget.ListAdapter -import androidx.recyclerview.widget.RecyclerView -import com.bumptech.glide.RequestManager -import daily.dayo.presentation.common.setOnDebounceClickListener -import daily.dayo.presentation.databinding.ItemWritePostUploadImageBinding -import daily.dayo.presentation.databinding.ItemWritePostUploadImageMenuBinding - -class WriteUploadImageListAdapter( - private val requestManager: RequestManager, - private val postId: Int -) : ListAdapter(diffCallback) { - companion object { - private const val MENU_ITEM_VIEW_TYPE = 1 - private const val IMAGE_ITEM_VIEW_TYPE = 2 - - private val diffCallback = object : DiffUtil.ItemCallback() { - override fun areItemsTheSame(oldItem: String, newItem: String) = - oldItem == newItem - - override fun areContentsTheSame(oldItem: String, newItem: String): Boolean = - oldItem == newItem - } - } - - interface OnItemClickListener { - fun deleteUploadImageClick(pos: Int) - fun addUploadImageClick(pos: Int) - } - - private var listener: OnItemClickListener? = null - fun setOnItemClickListener(listener: OnItemClickListener) { - this.listener = listener - } - - override fun getItemViewType(position: Int): Int { - return if (position == 0 && getItem(position) == "") MENU_ITEM_VIEW_TYPE else IMAGE_ITEM_VIEW_TYPE - } - - override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) { - when (holder) { - is WriteUploadImageMenuViewHolder -> { - holder.bind() - } - is WriteUploadImageListViewHolder -> { - holder.bind(getItem(position)) - } - else -> {} - } - } - - override fun onCreateViewHolder( - parent: ViewGroup, - viewType: Int - ): RecyclerView.ViewHolder { - return when (viewType) { - MENU_ITEM_VIEW_TYPE -> { - WriteUploadImageMenuViewHolder( - ItemWritePostUploadImageMenuBinding.inflate( - LayoutInflater.from(parent.context), - parent, - false - ) - ) - } - else -> { - WriteUploadImageListViewHolder( - ItemWritePostUploadImageBinding.inflate( - LayoutInflater.from(parent.context), - parent, - false - ) - ) - } - } - } - - override fun submitList(list: List?) { - super.submitList(list?.let { ArrayList(it) }) - } - - inner class WriteUploadImageListViewHolder(private val binding: ItemWritePostUploadImageBinding) : - RecyclerView.ViewHolder(binding.root) { - fun bind(item: String) { - with(binding.imgUpload) { - clipToOutline = true - requestManager.load(item).centerCrop().into(this) - } - - with(binding.btnImgUploadDelete) { - isClickable = postId == 0 - visibility = if (postId == 0) View.VISIBLE else View.INVISIBLE - if (postId == 0) { - setOnDebounceClickListener { - listener?.deleteUploadImageClick(pos = bindingAdapterPosition) - } - } - } - } - } - - inner class WriteUploadImageMenuViewHolder(private val binding: ItemWritePostUploadImageMenuBinding) : - RecyclerView.ViewHolder(binding.root) { - fun bind() { - binding.root.setOnDebounceClickListener { - listener?.addUploadImageClick(pos = bindingAdapterPosition) - } - } - } -} \ No newline at end of file diff --git a/presentation/src/main/java/daily/dayo/presentation/fragment/home/HomeDayoPickPostListFragment.kt b/presentation/src/main/java/daily/dayo/presentation/fragment/home/HomeDayoPickPostListFragment.kt deleted file mode 100644 index 589c312c..00000000 --- a/presentation/src/main/java/daily/dayo/presentation/fragment/home/HomeDayoPickPostListFragment.kt +++ /dev/null @@ -1,293 +0,0 @@ -package daily.dayo.presentation.fragment.home - -import android.os.Bundle -import android.util.Log -import android.view.LayoutInflater -import android.view.View -import android.view.ViewGroup -import androidx.core.view.isVisible -import androidx.fragment.app.Fragment -import androidx.fragment.app.activityViewModels -import androidx.lifecycle.Lifecycle -import androidx.lifecycle.lifecycleScope -import androidx.recyclerview.widget.RecyclerView -import androidx.viewpager2.widget.ViewPager2 -import com.bumptech.glide.Glide -import com.bumptech.glide.RequestManager -import dagger.hilt.android.AndroidEntryPoint -import daily.dayo.domain.model.Category -import daily.dayo.domain.model.Post -import daily.dayo.presentation.R -import daily.dayo.presentation.activity.MainActivity -import daily.dayo.presentation.adapter.HomeDayoPickAdapter -import daily.dayo.presentation.common.GlideLoadUtil.loadImageBackground -import daily.dayo.presentation.common.Status -import daily.dayo.presentation.common.autoCleared -import daily.dayo.presentation.common.setOnDebounceClickListener -import daily.dayo.presentation.common.toByteArray -import daily.dayo.presentation.databinding.FragmentHomeDayoPickPostListBinding -import daily.dayo.presentation.viewmodel.HomeViewModel -import kotlinx.coroutines.CancellationException -import kotlinx.coroutines.Dispatchers -import kotlinx.coroutines.launch -import kotlinx.coroutines.withContext - -@AndroidEntryPoint -class HomeDayoPickPostListFragment : Fragment() { - private var binding by autoCleared() { onDestroyBindingView() } - private val homeViewModel by activityViewModels() - private var homeDayoPickAdapter: HomeDayoPickAdapter? = null - private var glideRequestManager: RequestManager? = null - - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - /* - if (savedInstanceState == null) - loadPosts(homeViewModel.currentDayoPickCategory) - */ - } - - override fun onCreateView( - inflater: LayoutInflater, container: ViewGroup?, - savedInstanceState: Bundle? - ): View? { - binding = FragmentHomeDayoPickPostListBinding.inflate(inflater, container, false) - glideRequestManager = Glide.with(this) - return binding.root - } - - override fun onViewCreated(view: View, savedInstanceState: Bundle?) { - super.onViewCreated(view, savedInstanceState) - startLoadingView() - setInitialCategory() - setRvDayoPickPostAdapter() - setDayoPickPostListCollect() - setPostLikeClickListener() - setEmptyViewActionClickListener() - setDayoPickPostListRefreshListener() - } - - override fun onResume() { - binding.swipeRefreshLayoutDayoPickPost.isEnabled = true - setBottomNavigationIconClickListener() - super.onResume() - } - - override fun onPause() { - super.onPause() - binding.swipeRefreshLayoutDayoPickPost.isEnabled = false - } - - private fun onDestroyBindingView() { - glideRequestManager = null - homeDayoPickAdapter = null - binding.rvDayopickPost.adapter = null - } - - private fun setDayoPickPostListRefreshListener() { - binding.swipeRefreshLayoutDayoPickPost.setOnRefreshListener { - // loadPosts(homeViewModel.currentDayoPickCategory) - } - } - - private fun setInitialCategory() { - /* - with(binding) { - radiogroupDayopickPostCategory.check( - when (homeViewModel.currentDayoPickCategory) { - Category.ALL -> radiobuttonDayopickPostCategoryAll.id - Category.SCHEDULER -> radiobuttonDayopickPostCategoryScheduler.id - Category.STUDY_PLANNER -> radiobuttonDayopickPostCategoryStudyplanner.id - Category.GOOD_NOTE -> radiobuttonDayopickPostCategoryDigital.id - Category.POCKET_BOOK -> radiobuttonDayopickPostCategoryPocketbook.id - Category.SIX_DIARY -> radiobuttonDayopickPostCategory6holediary.id - Category.ETC -> radiobuttonDayopickPostCategoryEtc.id - } - ) - } - */ - } - - private fun setRvDayoPickPostAdapter() { - homeDayoPickAdapter = glideRequestManager?.let { requestManager -> - HomeDayoPickAdapter( - rankingShowing = true, - requestManager = requestManager - ) - } - homeDayoPickAdapter?.stateRestorationPolicy = RecyclerView.Adapter.StateRestorationPolicy.PREVENT_WHEN_EMPTY - binding.rvDayopickPost.adapter = homeDayoPickAdapter - } - - private fun setDayoPickPostListCollect() { - viewLifecycleOwner.lifecycleScope.launch { - homeViewModel.dayoPickPostList.observe(viewLifecycleOwner) { - // TODO : 하단 BottomNavigation을 통해 Fragment를 이동하고 나서 돌아오고나서 카테고리를 선택하면 observe가 중복해서 생겨난다 - // 해당 LiveData 객체가 1개 더 생성되는듯 하다 - when (it.status) { - Status.SUCCESS -> { - it.data?.let { postList -> - binding.swipeRefreshLayoutDayoPickPost.isRefreshing = false - loadInitialPostThumbnail(postList) - binding.layoutDayopickPostEmpty.isVisible = postList.isEmpty() - } - } - - Status.LOADING -> { - } - - Status.ERROR -> { - - } - } - } - } - with(binding) { - radiobuttonDayopickPostCategoryAll.setOnDebounceClickListener { - loadPosts(Category.ALL) - } - radiobuttonDayopickPostCategoryScheduler.setOnDebounceClickListener { - loadPosts(Category.SCHEDULER) - } - radiobuttonDayopickPostCategoryStudyplanner.setOnDebounceClickListener { - loadPosts(Category.STUDY_PLANNER) - } - radiobuttonDayopickPostCategoryPocketbook.setOnDebounceClickListener { - loadPosts(Category.POCKET_BOOK) - } - radiobuttonDayopickPostCategory6holediary.setOnDebounceClickListener { - loadPosts(Category.SIX_DIARY) - } - radiobuttonDayopickPostCategoryDigital.setOnDebounceClickListener { - loadPosts(Category.GOOD_NOTE) - } - radiobuttonDayopickPostCategoryEtc.setOnDebounceClickListener { - loadPosts(Category.ETC) - } - } - } - - private fun loadPosts(selectCategory: Category, isSmoothScroll: Boolean = false) { - with(homeViewModel) { - // currentDayoPickCategory = selectCategory - requestDayoPickPostList() - } - - if (this.lifecycle.currentState.isAtLeast(Lifecycle.State.CREATED)) { - if (isSmoothScroll) binding.rvDayopickPost.smoothScrollToPosition(0) - else binding.rvDayopickPost.scrollToPosition(0) - } - } - - private fun setPostLikeClickListener() { - homeDayoPickAdapter?.setOnItemClickListener(object : - HomeDayoPickAdapter.OnItemClickListener { - override fun likePostClick(post: Post) { - with(post) { - try { - if (!heart) { - homeViewModel.requestLikePost(postId!!, isDayoPickLike = true) - } else { - homeViewModel.requestUnlikePost(postId!!, isDayoPickLike = true) - } - } catch (postIdNullException: NullPointerException) { - Log.e( - this@HomeDayoPickPostListFragment.tag, - "PostId Null Exception Occurred" - ) - // loadPosts(homeViewModel.currentDayoPickCategory) - } - } - } - }) - } - - private fun setEmptyViewActionClickListener() { - binding.btnDayopickPostEmptyAction.setOnDebounceClickListener { - val homeViewPager = - requireParentFragment().requireView().findViewById(R.id.pager_home_post) - val current = homeViewPager.currentItem - if (current == 0) { - homeViewPager.setCurrentItem(1, true) - } else { - homeViewPager.setCurrentItem(current - 1, true) - } - } - } - - private fun loadInitialPostThumbnail(postList: List) { - val thumbnailImgList = emptyList().toMutableList() - val userImgList = emptyList().toMutableList() - - viewLifecycleOwner.lifecycleScope.launch { - for (i in 0 until (if (postList.size >= 6) 6 else postList.size)) { - thumbnailImgList.add(withContext(Dispatchers.IO) { - loadImageBackground( - context = requireContext(), - height = 158, - width = 158, - imgName = postList[i].thumbnailImage ?: "" - ) - }.toByteArray) - userImgList.add(withContext(Dispatchers.IO) { - loadImageBackground( - context = requireContext(), - height = 17, - width = 17, - imgName = postList[i].userProfileImage ?: "" - ) - }.toByteArray) - } - }.invokeOnCompletion { throwable -> - when (throwable) { - is CancellationException -> Log.e("Image Loading", "CANCELLED") - null -> { - for (i in 0 until (if (postList.size >= 6) 6 else postList.size)) { - with(postList[i]) { - preLoadThumbnail = thumbnailImgList[i] - preLoadUserImg = userImgList[i] - } - } - homeDayoPickAdapter?.submitList(postList.toMutableList()) - stopLoadingView() - thumbnailImgList.clear() - userImgList.clear() - } - } - } - } - - private fun setBottomNavigationIconClickListener() { - val currentViewPagerPosition = - requireParentFragment().requireView() - .findViewById(R.id.pager_home_post) - .currentItem - - (requireActivity() as MainActivity).setBottomNavigationIconClickListener(reselectedIconId = R.id.HomeFragment) { - if (currentViewPagerPosition == HOME_DAYOPICK_PAGE_TAB_ID) { - binding.swipeRefreshLayoutDayoPickPost.isRefreshing = true - // loadPosts(homeViewModel.currentDayoPickCategory, isSmoothScroll = true) - } - } - } - - private fun startLoadingView() { - with(binding) { - with(layoutDayopickPostShimmer) { - startShimmer() - visibility = View.VISIBLE - } - rvDayopickPost.visibility = View.INVISIBLE - } - } - - private fun stopLoadingView() { - with(binding) { - with(layoutDayopickPostShimmer) { - stopShimmer() - visibility = View.GONE - } - rvDayopickPost.visibility = View.VISIBLE - } - } -} \ No newline at end of file diff --git a/presentation/src/main/java/daily/dayo/presentation/fragment/home/HomeFragment.kt b/presentation/src/main/java/daily/dayo/presentation/fragment/home/HomeFragment.kt deleted file mode 100644 index 8e3e3eb5..00000000 --- a/presentation/src/main/java/daily/dayo/presentation/fragment/home/HomeFragment.kt +++ /dev/null @@ -1,99 +0,0 @@ -package daily.dayo.presentation.fragment.home - -import android.os.Bundle -import android.view.LayoutInflater -import android.view.View -import android.view.ViewGroup -import androidx.fragment.app.Fragment -import androidx.navigation.fragment.findNavController -import androidx.viewpager2.widget.ViewPager2 -import com.google.android.material.tabs.TabLayoutMediator -import dagger.hilt.android.AndroidEntryPoint -import daily.dayo.presentation.R -import daily.dayo.presentation.adapter.HomeFragmentPagerStateAdapter -import daily.dayo.presentation.common.autoCleared -import daily.dayo.presentation.common.extension.navigateSafe -import daily.dayo.presentation.common.setOnDebounceClickListener -import daily.dayo.presentation.databinding.FragmentHomeBinding - -const val HOME_DAYOPICK_PAGE_TAB_ID = 0 -const val HOME_NEW_PAGE_TAB_ID = 1 - -@AndroidEntryPoint -class HomeFragment : Fragment() { - private var binding by autoCleared(onDestroy = { - onDestroyBindingView() - }) - private var mediator: TabLayoutMediator? = null - private var pagerAdapter: HomeFragmentPagerStateAdapter? = null - private val pageChangeCallBack = object : ViewPager2.OnPageChangeCallback() { - override fun onPageSelected(position: Int) { - super.onPageSelected(position) - pagerAdapter?.refreshFragment(position, pagerAdapter!!.fragments[position]) - } - } - - override fun onCreateView( - inflater: LayoutInflater, container: ViewGroup?, - savedInstanceState: Bundle? - ): View { - binding = FragmentHomeBinding.inflate(inflater, container, false) - return binding.root - } - - override fun onViewCreated(view: View, savedInstanceState: Bundle?) { - super.onViewCreated(view, savedInstanceState) - initViewPager() - setSearchClickListener() - } - - private fun onDestroyBindingView() { - mediator?.detach() - mediator = null - pagerAdapter = null - with(binding.pagerHomePost) { - unregisterOnPageChangeCallback(pageChangeCallBack) - adapter = null - } - } - - private fun setSearchClickListener() { - binding.btnPostSearch.setOnDebounceClickListener { - findNavController().navigateSafe( - currentDestinationId = R.id.HomeFragment, - action = R.id.action_homeFragment_to_searchFragment - ) - } - } - - private fun initViewPager() { - pagerAdapter = - HomeFragmentPagerStateAdapter(childFragmentManager, viewLifecycleOwner.lifecycle) - pagerAdapter?.addFragment(HomeDayoPickPostListFragment()) - pagerAdapter?.addFragment(HomeNewPostListFragment()) - for (i in 0 until pagerAdapter!!.itemCount) { - pagerAdapter?.refreshFragment(i, pagerAdapter!!.fragments[i]) - } - - with(binding.pagerHomePost) { - isUserInputEnabled = false // DISABLE SWIPE - adapter = pagerAdapter - registerOnPageChangeCallback(pageChangeCallBack) - } - - initTabLayout() - } - - private fun initTabLayout() { - mediator = TabLayoutMediator( - binding.tabsActionbarHomeCategory, - binding.pagerHomePost - ) { tab, position -> - when (position) { - HOME_DAYOPICK_PAGE_TAB_ID -> tab.text = "DAYO PICK" - HOME_NEW_PAGE_TAB_ID -> tab.text = "NEW" - } - } - mediator?.attach() - } -} \ No newline at end of file diff --git a/presentation/src/main/java/daily/dayo/presentation/fragment/home/HomeNewPostListFragment.kt b/presentation/src/main/java/daily/dayo/presentation/fragment/home/HomeNewPostListFragment.kt deleted file mode 100644 index dc93a018..00000000 --- a/presentation/src/main/java/daily/dayo/presentation/fragment/home/HomeNewPostListFragment.kt +++ /dev/null @@ -1,288 +0,0 @@ -package daily.dayo.presentation.fragment.home - -import android.os.Bundle -import android.util.Log -import android.view.LayoutInflater -import android.view.View -import android.view.ViewGroup -import androidx.core.view.isVisible -import androidx.fragment.app.Fragment -import androidx.fragment.app.activityViewModels -import androidx.lifecycle.Lifecycle -import androidx.lifecycle.lifecycleScope -import androidx.navigation.fragment.findNavController -import androidx.recyclerview.widget.RecyclerView -import androidx.viewpager2.widget.ViewPager2 -import com.bumptech.glide.Glide -import com.bumptech.glide.RequestManager -import daily.dayo.presentation.R -import daily.dayo.presentation.common.GlideLoadUtil -import daily.dayo.presentation.common.Status -import daily.dayo.presentation.common.autoCleared -import daily.dayo.presentation.common.extension.navigateSafe -import daily.dayo.presentation.common.setOnDebounceClickListener -import daily.dayo.presentation.common.toByteArray -import daily.dayo.presentation.databinding.FragmentHomeNewPostListBinding -import daily.dayo.domain.model.Category -import daily.dayo.domain.model.Post -import daily.dayo.presentation.adapter.HomeNewAdapter -import daily.dayo.presentation.viewmodel.HomeViewModel -import com.google.android.material.bottomnavigation.BottomNavigationView -import dagger.hilt.android.AndroidEntryPoint -import daily.dayo.presentation.activity.MainActivity -import daily.dayo.presentation.common.GlideLoadUtil.HOME_POST_THUMBNAIL_SIZE -import daily.dayo.presentation.common.GlideLoadUtil.HOME_USER_THUMBNAIL_SIZE -import kotlinx.coroutines.CancellationException -import kotlinx.coroutines.Dispatchers -import kotlinx.coroutines.launch -import kotlinx.coroutines.withContext - -@AndroidEntryPoint -class HomeNewPostListFragment : Fragment() { - private var binding by autoCleared { onDestroyBindingView() } - private val homeViewModel by activityViewModels() - private var homeNewAdapter: HomeNewAdapter? = null - private var glideRequestManager: RequestManager? = null - - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - /* - if (savedInstanceState == null) - loadPosts(homeViewModel.currentNewCategory) - */ - } - - override fun onCreateView( - inflater: LayoutInflater, container: ViewGroup?, - savedInstanceState: Bundle? - ): View? { - binding = FragmentHomeNewPostListBinding.inflate(inflater, container, false) - glideRequestManager = Glide.with(this) - return binding.root - } - - override fun onViewCreated(view: View, savedInstanceState: Bundle?) { - super.onViewCreated(view, savedInstanceState) - startLoadingView() - setInitialCategory() - setRvNewPostAdapter() - setNewPostListCollect() - setPostLikeClickListener() - setEmptyViewActionClickListener() - setNewPostListRefreshListener() - } - - override fun onResume() { - binding.swipeRefreshLayoutNewPost.isEnabled = true - setBottomNavigationIconClickListener() - super.onResume() - } - - override fun onPause() { - super.onPause() - binding.swipeRefreshLayoutNewPost.isEnabled = false - } - - private fun onDestroyBindingView() { - glideRequestManager = null - homeNewAdapter = null - binding.rvNewPost.adapter = null - } - - private fun setNewPostListRefreshListener() { - binding.swipeRefreshLayoutNewPost.setOnRefreshListener { - // loadPosts(homeViewModel.currentNewCategory) - } - } - - private fun setInitialCategory() { - /* - with(binding) { - radiogroupNewPostCategory.check( - when (homeViewModel.currentNewCategory) { - Category.ALL -> radiobuttonNewPostCategoryAll.id - Category.SCHEDULER -> radiobuttonNewPostCategoryScheduler.id - Category.STUDY_PLANNER -> radiobuttonNewPostCategoryStudyplanner.id - Category.GOOD_NOTE -> radiobuttonNewPostCategoryDigital.id - Category.POCKET_BOOK -> radiobuttonNewPostCategoryPocketbook.id - Category.SIX_DIARY -> radiobuttonNewPostCategory6holediary.id - Category.ETC -> radiobuttonNewPostCategoryEtc.id - } - ) - } - */ - } - - private fun setRvNewPostAdapter() { - homeNewAdapter = glideRequestManager?.let { requestManager -> - HomeNewAdapter( - rankingShowing = false, - requestManager = requestManager - ) - } - homeNewAdapter?.stateRestorationPolicy = RecyclerView.Adapter.StateRestorationPolicy.PREVENT_WHEN_EMPTY - binding.rvNewPost.adapter = homeNewAdapter - } - - private fun setNewPostListCollect() { - viewLifecycleOwner.lifecycleScope.launch { - homeViewModel.newPostList.observe(viewLifecycleOwner) { - when (it.status) { - Status.SUCCESS -> { - it.data?.let { postList -> - binding.swipeRefreshLayoutNewPost.isRefreshing = false - loadPostThumbnail(postList) - binding.layoutNewPostEmpty.isVisible = postList.isEmpty() - } - } - - Status.LOADING -> { - } - - Status.ERROR -> { - - } - } - } - } - with(binding) { - radiobuttonNewPostCategoryAll.setOnDebounceClickListener { - loadPosts(Category.ALL) - } - radiobuttonNewPostCategoryScheduler.setOnDebounceClickListener { - loadPosts(Category.SCHEDULER) - } - radiobuttonNewPostCategoryStudyplanner.setOnDebounceClickListener { - loadPosts(Category.STUDY_PLANNER) - } - radiobuttonNewPostCategoryPocketbook.setOnDebounceClickListener { - loadPosts(Category.POCKET_BOOK) - } - radiobuttonNewPostCategory6holediary.setOnDebounceClickListener { - loadPosts(Category.SIX_DIARY) - } - radiobuttonNewPostCategoryDigital.setOnDebounceClickListener { - loadPosts(Category.GOOD_NOTE) - } - radiobuttonNewPostCategoryEtc.setOnDebounceClickListener { - loadPosts(Category.ETC) - } - } - } - - private fun loadPosts(selectCategory: Category, isSmoothScroll: Boolean = false) { - with(homeViewModel) { - // currentNewCategory = selectCategory - requestNewPostList() - } - - if (this.lifecycle.currentState.isAtLeast(Lifecycle.State.CREATED)) { - if (isSmoothScroll) binding.rvNewPost.smoothScrollToPosition(0) - else binding.rvNewPost.scrollToPosition(0) - } - } - - private fun setPostLikeClickListener() { - homeNewAdapter?.setOnItemClickListener(object : - HomeNewAdapter.OnItemClickListener { - override fun likePostClick(post: Post) { - with(post) { - try { - if (!heart) { - homeViewModel.requestLikePost(postId!!, false) - } else { - homeViewModel.requestUnlikePost(post.postId!!, false) - } - } catch (postIdNullException: NullPointerException) { - Log.e(this@HomeNewPostListFragment.tag, "PostId Null Exception Occurred") - // loadPosts(homeViewModel.currentNewCategory) - } - } - } - }) - } - - private fun setEmptyViewActionClickListener() { - binding.btnNewPostEmptyAction.setOnDebounceClickListener { - findNavController().navigateSafe( - currentDestinationId = R.id.HomeFragment, - action = R.id.action_homeFragment_to_writeFragment - ) - } - } - - private fun loadPostThumbnail(postList: List) { - val thumbnailImgList = emptyList().toMutableList() - val userImgList = emptyList().toMutableList() - - viewLifecycleOwner.lifecycleScope.launch { - for (i in 0 until (if (postList.size >= 6) 6 else postList.size)) { - thumbnailImgList.add(withContext(Dispatchers.IO) { - GlideLoadUtil.loadImageBackground( - context = requireContext(), - height = HOME_POST_THUMBNAIL_SIZE, - width = HOME_POST_THUMBNAIL_SIZE, - imgName = postList[i].thumbnailImage ?: "" - ) - }.toByteArray) - userImgList.add(withContext(Dispatchers.IO) { - GlideLoadUtil.loadImageBackground( - context = requireContext(), - height = HOME_USER_THUMBNAIL_SIZE, - width = HOME_USER_THUMBNAIL_SIZE, - imgName = postList[i].userProfileImage ?: "" - ) - }.toByteArray) - } - }.invokeOnCompletion { throwable -> - when (throwable) { - is CancellationException -> Log.e("Image Loading", "CANCELLED") - null -> { - var loadedPostList = postList.toMutableList() - for (i in 0 until (if (postList.size >= 6) 6 else postList.size)) { - loadedPostList[i].preLoadThumbnail = thumbnailImgList[i] - loadedPostList[i].preLoadUserImg = userImgList[i] - } - homeNewAdapter?.submitList(postList.toMutableList()) - stopLoadingView() - thumbnailImgList.clear() - userImgList.clear() - } - } - } - } - - private fun setBottomNavigationIconClickListener() { - val currentViewPagerPosition = - requireParentFragment().requireView() - .findViewById(R.id.pager_home_post) - .currentItem - - (requireActivity() as MainActivity).setBottomNavigationIconClickListener(reselectedIconId = R.id.HomeFragment) { - if (currentViewPagerPosition == HOME_NEW_PAGE_TAB_ID) { - binding.swipeRefreshLayoutNewPost.isRefreshing = true - // loadPosts(homeViewModel.currentNewCategory, isSmoothScroll = true) - } - } - } - - private fun startLoadingView() { - with(binding) { - with(layoutNewPostShimmer) { - startShimmer() - visibility = View.VISIBLE - } - rvNewPost.visibility = View.INVISIBLE - } - } - - private fun stopLoadingView() { - with(binding) { - with(layoutNewPostShimmer) { - stopShimmer() - visibility = View.GONE - } - rvNewPost.visibility = View.VISIBLE - } - } -} \ No newline at end of file diff --git a/presentation/src/main/java/daily/dayo/presentation/fragment/post/PostLikeUsersFragment.kt b/presentation/src/main/java/daily/dayo/presentation/fragment/post/PostLikeUsersFragment.kt deleted file mode 100644 index c8971ae5..00000000 --- a/presentation/src/main/java/daily/dayo/presentation/fragment/post/PostLikeUsersFragment.kt +++ /dev/null @@ -1,342 +0,0 @@ -package daily.dayo.presentation.fragment.post - -import android.os.Bundle -import android.view.LayoutInflater -import android.view.View -import android.view.ViewGroup -import androidx.compose.foundation.background -import androidx.compose.foundation.border -import androidx.compose.foundation.indication -import androidx.compose.foundation.interaction.MutableInteractionSource -import androidx.compose.foundation.interaction.collectIsPressedAsState -import androidx.compose.foundation.layout.Box -import androidx.compose.foundation.layout.PaddingValues -import androidx.compose.foundation.layout.Row -import androidx.compose.foundation.layout.Spacer -import androidx.compose.foundation.layout.aspectRatio -import androidx.compose.foundation.layout.defaultMinSize -import androidx.compose.foundation.layout.fillMaxHeight -import androidx.compose.foundation.layout.fillMaxSize -import androidx.compose.foundation.layout.fillMaxWidth -import androidx.compose.foundation.layout.height -import androidx.compose.foundation.layout.padding -import androidx.compose.foundation.layout.width -import androidx.compose.foundation.lazy.LazyColumn -import androidx.compose.foundation.shape.CircleShape -import androidx.compose.foundation.shape.RoundedCornerShape -import androidx.compose.material3.ButtonDefaults -import androidx.compose.material3.CenterAlignedTopAppBar -import androidx.compose.material3.ExperimentalMaterial3Api -import androidx.compose.material3.Icon -import androidx.compose.material3.IconButton -import androidx.compose.material3.Scaffold -import androidx.compose.material3.Surface -import androidx.compose.material3.Text -import androidx.compose.material3.TextButton -import androidx.compose.material3.TopAppBarDefaults -import androidx.compose.runtime.Composable -import androidx.compose.runtime.getValue -import androidx.compose.runtime.livedata.observeAsState -import androidx.compose.runtime.mutableStateOf -import androidx.compose.runtime.remember -import androidx.compose.runtime.saveable.rememberSaveable -import androidx.compose.runtime.setValue -import androidx.compose.ui.Alignment -import androidx.compose.ui.Modifier -import androidx.compose.ui.draw.clip -import androidx.compose.ui.layout.ContentScale -import androidx.compose.ui.platform.ComposeView -import androidx.compose.ui.platform.ViewCompositionStrategy -import androidx.compose.ui.res.colorResource -import androidx.compose.ui.res.painterResource -import androidx.compose.ui.res.stringResource -import androidx.compose.ui.text.TextStyle -import androidx.compose.ui.text.font.FontWeight -import androidx.compose.ui.text.style.TextAlign -import androidx.compose.ui.tooling.preview.Preview -import androidx.compose.ui.unit.dp -import androidx.fragment.app.Fragment -import androidx.fragment.app.activityViewModels -import androidx.navigation.fragment.findNavController -import androidx.navigation.fragment.navArgs -import androidx.paging.LoadState -import androidx.paging.compose.LazyPagingItems -import androidx.paging.compose.collectAsLazyPagingItems -import com.skydoves.landscapist.ImageOptions -import com.skydoves.landscapist.glide.GlideImage -import dagger.hilt.android.AndroidEntryPoint -import daily.dayo.domain.model.LikeUser -import daily.dayo.presentation.BuildConfig -import daily.dayo.presentation.R -import daily.dayo.presentation.common.Event -import daily.dayo.presentation.common.extension.clickableSingle -import daily.dayo.presentation.common.extension.navigateSafe -import daily.dayo.presentation.common.toSp -import daily.dayo.presentation.theme.DayoTheme -import daily.dayo.presentation.viewmodel.AccountViewModel -import daily.dayo.presentation.viewmodel.FollowViewModel -import daily.dayo.presentation.viewmodel.PostViewModel - -@AndroidEntryPoint -class PostLikeUsersFragment : Fragment() { - private val args by navArgs() - private val accountViewModel by activityViewModels() - private val postViewModel by activityViewModels() - private val followViewModel by activityViewModels() - - override fun onCreateView( - inflater: LayoutInflater, container: ViewGroup?, - savedInstanceState: Bundle? - ): View { - requestPostLikeUsers() - return ComposeView(requireContext()).apply { - setViewCompositionStrategy(ViewCompositionStrategy.DisposeOnViewTreeLifecycleDestroyed) - setContent { - DayoTheme { - Scaffold(topBar = { SetPostLikeUsersActionbar() }) { contentPadding -> - Box(modifier = Modifier.padding(contentPadding)) { - SetPostLikeUsers() - } - } - } - } - } - } - - @OptIn(ExperimentalMaterial3Api::class) - @Composable - private fun SetPostLikeUsersActionbar() { - val interactionSource = remember { MutableInteractionSource() } - CenterAlignedTopAppBar( - colors = TopAppBarDefaults.centerAlignedTopAppBarColors( - containerColor = colorResource(id = R.color.white_FFFFFF) - ), - title = { - Text( - text = stringResource(id = R.string.post_like_users_title), - style = TextStyle( - fontSize = 16.dp.toSp(), - lineHeight = 24.dp.toSp(), -// TODO fontFamily = FontFamily(Font(R.font.pretendard)), - fontWeight = FontWeight(600), - color = colorResource(id = R.color.gray_1_313131), - textAlign = TextAlign.Center - ) - ) - }, - navigationIcon = { - IconButton( - onClick = { findNavController().navigateUp() }, - modifier = Modifier - .indication(interactionSource = interactionSource, indication = null) - ) { - Icon( - painter = painterResource(id = R.drawable.ic_back_sign), - contentDescription = "back sign", - ) - } - } - ) - } - - @Composable - private fun SetPostLikeUsers() { - val likeUsers = postViewModel.postLikeUsers.collectAsLazyPagingItems() - when (likeUsers.loadState.refresh) { - is LoadState.Loading -> {} - is LoadState.Error -> {} - is LoadState.NotLoading -> { - SetPostLikeUsersLayout(likeUsers = likeUsers) - } - } - } - - @Composable - private fun SetPostLikeUsersLayout(likeUsers: LazyPagingItems) { - LazyColumn( - modifier = Modifier - .fillMaxSize() - .background(DayoTheme.colorScheme.background) - ) { - items(likeUsers.itemCount) { index -> - val item = likeUsers[index] - LikeUserLayout(likeUser = item!!) - } - } - } - - @Composable - private fun LikeUserLayout(likeUser: LikeUser) { - Surface( - color = colorResource(id = R.color.white_FFFFFF), - modifier = Modifier.fillMaxWidth() - ) { - Row( - verticalAlignment = Alignment.CenterVertically, - modifier = Modifier - .fillMaxWidth() - .clickableSingle { navigateUserProfile(likeUser.memberId) } - .padding(horizontal = 18.dp, vertical = 8.dp) - ) { - LikeUserImageLayout(likeUser = likeUser) - LikeUserNicknameLayout(userNickname = likeUser.nickname) - Spacer(modifier = Modifier.weight(1f)) - if (likeUser.memberId != accountViewModel.getCurrentUserInfo().memberId) { - LikeUserFollowLayout(likeUser = likeUser) - } - } - } - } - - @Composable - private fun LikeUserImageLayout(likeUser: LikeUser) { - val imageInteractionSource = remember { MutableInteractionSource() } - - GlideImage( - imageModel = { "${BuildConfig.BASE_URL}/images/${likeUser.profileImg}" }, - imageOptions = ImageOptions( - contentDescription = "image description", - contentScale = ContentScale.Crop, - ), - modifier = Modifier - .padding(1.dp) - .height(USER_THUMBNAIL_SIZE.dp) - .aspectRatio(1f) - .clip(CircleShape) - .clickableSingle( - interactionSource = imageInteractionSource, - indication = null, - onClick = { navigateUserProfile(likeUser.memberId) } - ) - ) - } - - @Composable - private fun LikeUserNicknameLayout(userNickname: String) { - Text( - text = userNickname, - style = TextStyle( - fontSize = 13.dp.toSp(), -// TODO fontFamily = FontFamily(Font(R.font.sandoll gothicneo1)), - fontWeight = FontWeight(400), - color = colorResource(id = R.color.gray_1_313131), - ), - modifier = Modifier - .fillMaxHeight() - .padding(start = 11.dp) - ) - } - - @Composable - private fun LikeUserFollowLayout(likeUser: LikeUser) { - val followInteractionSource = remember { MutableInteractionSource() } - val followIsPressed by followInteractionSource.collectIsPressedAsState() - - var followState by rememberSaveable { mutableStateOf(likeUser.follow) } - val followSuccess by followViewModel.followingFollowSuccess.observeAsState(Event(true)) - val unFollowSuccess by followViewModel.followerUnfollowSuccess.observeAsState(Event(true)) - - TextButton( - onClick = { - if (followState) { - followViewModel.requestUnfollow( - followerId = likeUser.memberId, - isFollower = true - ) - if (unFollowSuccess.getContentIfNotHandled() == true) { - followState = false - } - } else { - followViewModel.requestFollow( - followerId = likeUser.memberId, - isFollower = false - ) - if (followSuccess.getContentIfNotHandled() == true) { - followState = true - } - } - }, - interactionSource = followInteractionSource, - colors = ButtonDefaults.buttonColors( - if (followState or (!followState and followIsPressed)) colorResource(id = R.color.white_FFFFFF) - else colorResource(id = R.color.primary_green_23C882) - ), - contentPadding = PaddingValues(0.dp), - modifier = Modifier - .defaultMinSize(1.dp) - .border( - width = 1.dp, - color = - if (followState or (!followState and followIsPressed)) colorResource(id = R.color.gray_3_9FA5AE) - else colorResource(id = R.color.primary_green_23C882), - shape = RoundedCornerShape(size = FOLLOW_BUTTON_RADIUS_SIZE.dp), - ) - .background( - color = - if (followState or (!followState and followIsPressed)) colorResource(id = R.color.white_FFFFFF) - else colorResource(id = R.color.primary_green_23C882), - shape = RoundedCornerShape(size = FOLLOW_BUTTON_RADIUS_SIZE.dp) - ) - .width(FOLLOW_BUTTON_WIDTH.dp) - .height(FOLLOW_BUTTON_HEIGHT.dp) - ) { - Text( - text = if (followState) stringResource(id = R.string.follow_already) - else stringResource(id = R.string.follow_yet), - style = TextStyle( - fontSize = 14.dp.toSp(), - lineHeight = 21.dp.toSp(), -// TODO fontFamily = FontFamily(Font(R.font.pretendard)), - fontWeight = FontWeight(600), - color = if (followState or (!followState and followIsPressed)) colorResource(id = R.color.gray_3_9FA5AE) - else colorResource(id = R.color.white_FFFFFF), - textAlign = TextAlign.Center, - ), - modifier = Modifier - ) - } - } - - @Composable - @Preview - private fun PreviewLikeUserLayout() { - DayoTheme { - LikeUserLayout( - likeUser = LikeUser( - false, - "sample-member-id", - "sample-Nickname", - "sampleImgUrl.jpg" - ), - ) - } - } - - @Composable - @Preview - private fun PreviewActionbarLayout() { - DayoTheme { - SetPostLikeUsersActionbar() - } - } - - private fun requestPostLikeUsers() { - postViewModel.requestPostLikeUsers(postId = args.postId) - } - - private fun navigateUserProfile(memberId: String) { - findNavController().navigateSafe( - currentDestinationId = R.id.PostLikeUsersFragment, - action = PostLikeUsersFragmentDirections.actionPostLikeUsersFragmentToProfileFragment( - memberId = memberId - ) - ) - } - - companion object { - const val USER_THUMBNAIL_SIZE = 45 - const val FOLLOW_BUTTON_HEIGHT = 30 - const val FOLLOW_BUTTON_WIDTH = 85 - const val FOLLOW_BUTTON_RADIUS_SIZE = 31 - } -} \ No newline at end of file diff --git a/presentation/src/main/java/daily/dayo/presentation/fragment/post/PostOptionMineFragment.kt b/presentation/src/main/java/daily/dayo/presentation/fragment/post/PostOptionMineFragment.kt deleted file mode 100644 index 13ceb771..00000000 --- a/presentation/src/main/java/daily/dayo/presentation/fragment/post/PostOptionMineFragment.kt +++ /dev/null @@ -1,108 +0,0 @@ -package daily.dayo.presentation.fragment.post - -import android.app.AlertDialog -import android.graphics.Color -import android.graphics.drawable.ColorDrawable -import android.os.Bundle -import android.view.Gravity -import android.view.LayoutInflater -import android.view.View -import android.view.ViewGroup -import android.view.Window -import android.view.WindowManager -import androidx.fragment.app.DialogFragment -import androidx.fragment.app.activityViewModels -import androidx.navigation.fragment.findNavController -import androidx.navigation.fragment.navArgs -import dagger.hilt.android.AndroidEntryPoint -import daily.dayo.presentation.R -import daily.dayo.presentation.common.autoCleared -import daily.dayo.presentation.common.dialog.DefaultDialogConfigure -import daily.dayo.presentation.common.dialog.DefaultDialogConfirm -import daily.dayo.presentation.common.dialog.LoadingAlertDialog -import daily.dayo.presentation.common.extension.navigateSafe -import daily.dayo.presentation.common.setOnDebounceClickListener -import daily.dayo.presentation.databinding.FragmentPostOptionMineBinding -import daily.dayo.presentation.viewmodel.PostViewModel - -@AndroidEntryPoint -class PostOptionMineFragment : DialogFragment() { - private var binding by autoCleared { - LoadingAlertDialog.hideLoadingDialog(loadingAlertDialog) - } - private val postViewModel by activityViewModels() - private val args by navArgs() - private lateinit var mAlertDialog: AlertDialog - private lateinit var loadingAlertDialog: AlertDialog - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - isCancelable = true - } - - override fun onCreateView( - inflater: LayoutInflater, container: ViewGroup?, - savedInstanceState: Bundle? - ): View? { - binding = FragmentPostOptionMineBinding.inflate(inflater, container, false) - loadingAlertDialog = LoadingAlertDialog.createLoadingDialog(requireContext()) - dialog?.window?.setBackgroundDrawable(ColorDrawable(Color.TRANSPARENT)) - dialog?.window?.requestFeature(Window.FEATURE_NO_TITLE) - dialog?.window?.setGravity(Gravity.BOTTOM) - return binding.root - } - - override fun onViewCreated(view: View, savedInstanceState: Bundle?) { - super.onViewCreated(view, savedInstanceState) - setDeletePostClickListener() - setModifyPostClickListener() - } - - override fun onResume() { - super.onResume() - resizePostOptionMineDialogFragment() - } - - private fun resizePostOptionMineDialogFragment() { - val params: ViewGroup.LayoutParams? = dialog?.window?.attributes - val deviceWidth = DefaultDialogConfigure.getDeviceWidthSize(requireContext()) - params?.width = (deviceWidth * 0.9).toInt() - dialog?.window?.attributes = params as WindowManager.LayoutParams - } - - private fun setDeletePostClickListener() { - val deletePost = { - LoadingAlertDialog.showLoadingDialog(loadingAlertDialog) - postViewModel.requestDeletePost(postId = args.postId) - findNavController().navigateSafe( - currentDestinationId = R.id.PostOptionMineFragment, - action = R.id.action_postOptionMineFragment_to_HomeFragment - ) - } - - mAlertDialog = DefaultDialogConfirm.createDialog( - requireContext(), - R.string.post_option_mine_delete_alert_message, - true, - true, - null, - null, - { deletePost() } - ) { - binding.layoutPostOptionMine.visibility = View.VISIBLE - this.mAlertDialog.dismiss() - } - mAlertDialog.window?.setBackgroundDrawable(ColorDrawable(Color.TRANSPARENT)) - - binding.layoutPostOptionMineDelete.setOnDebounceClickListener { - if (!mAlertDialog.isShowing) { - binding.layoutPostOptionMine.visibility = View.INVISIBLE - mAlertDialog.show() - DefaultDialogConfigure.dialogResize(requireContext(), mAlertDialog, 0.7f, 0.19f) - } - } - } - - private fun setModifyPostClickListener() { - // Post 수정 Compose으로 Migration 예정 - } -} \ No newline at end of file diff --git a/presentation/src/main/java/daily/dayo/presentation/fragment/search/SearchResultFragment.kt b/presentation/src/main/java/daily/dayo/presentation/fragment/search/SearchResultFragment.kt deleted file mode 100644 index 74fbbda7..00000000 --- a/presentation/src/main/java/daily/dayo/presentation/fragment/search/SearchResultFragment.kt +++ /dev/null @@ -1,192 +0,0 @@ -package daily.dayo.presentation.fragment.search - -import android.os.Bundle -import android.text.Editable -import android.text.TextWatcher -import android.view.LayoutInflater -import android.view.View -import android.view.ViewGroup -import android.view.inputmethod.EditorInfo -import androidx.fragment.app.Fragment -import androidx.fragment.app.activityViewModels -import androidx.navigation.fragment.findNavController -import androidx.paging.LoadState -import com.bumptech.glide.Glide -import com.bumptech.glide.RequestManager -import dagger.hilt.android.AndroidEntryPoint -import daily.dayo.domain.model.Search -import daily.dayo.presentation.R -import daily.dayo.presentation.adapter.SearchTagResultPostAdapter -import daily.dayo.presentation.common.HideKeyBoardUtil -import daily.dayo.presentation.common.ReplaceUnicode -import daily.dayo.presentation.common.autoCleared -import daily.dayo.presentation.common.extension.navigateSafe -import daily.dayo.presentation.common.setOnDebounceClickListener -import daily.dayo.presentation.databinding.FragmentSearchResultBinding -import daily.dayo.presentation.viewmodel.SearchViewModel - -@AndroidEntryPoint -class SearchResultFragment : Fragment() { - private var binding by autoCleared { onDestroyBindingView() } - private val searchViewModel by activityViewModels() - private var searchTagResultPostAdapter: SearchTagResultPostAdapter? = null - private var glideRequestManager: RequestManager? = null - - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - if (savedInstanceState == null) - getSearchTagList(searchViewModel.searchKeyword) - } - - override fun onCreateView( - inflater: LayoutInflater, container: ViewGroup?, - savedInstanceState: Bundle?, - ): View? { - binding = FragmentSearchResultBinding.inflate(inflater, container, false) - glideRequestManager = Glide.with(this) - return binding.root - } - - override fun onViewCreated(view: View, savedInstanceState: Bundle?) { - super.onViewCreated(view, savedInstanceState) - - setSearchResult() - observeSearchTagList() - observeSearchTagCount() - setBackButtonClickListener() - setSearchEditTextListener() - setSearchTagResultPostAdapter() - setAdapterLoadStateListener() - setSearchTagResultPostClickListener() - setSearchKeywordInputDone() - setSearchKeywordInputRemoveClickListener() - HideKeyBoardUtil.hideTouchDisplay(requireActivity(), view) - } - - private fun onDestroyBindingView() { - glideRequestManager = null - searchTagResultPostAdapter = null - binding.rvSearchResultContentsPostList.adapter = null - } - - private fun setBackButtonClickListener() { - binding.btnSearchResultBack.setOnDebounceClickListener { - findNavController().navigateUp() - } - } - - private fun setSearchResult() { - loadingPost() - binding.tvSearchResultKeywordInput.setText(searchViewModel.searchKeyword) - } - - private fun setSearchEditTextListener() { - binding.tvSearchResultKeywordInput.addTextChangedListener(object : TextWatcher { - override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) {} - override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) {} - override fun afterTextChanged(s: Editable?) { - with(binding.btnSearchResultRemoveEtInput) { - visibility = if (!s.isNullOrBlank()) { - View.VISIBLE - } else { - View.GONE - } - } - } - }) - } - - private fun setSearchTagResultPostAdapter() { - searchTagResultPostAdapter = - glideRequestManager?.let { SearchTagResultPostAdapter(requestManager = it) } - binding.rvSearchResultContentsPostList.adapter = searchTagResultPostAdapter - } - - private fun setSearchTagResultPostClickListener() { - searchTagResultPostAdapter?.setOnItemClickListener(object : - SearchTagResultPostAdapter.OnItemClickListener { - override fun onItemClick(v: View, search: Search, position: Int) { - findNavController().navigateSafe( - currentDestinationId = R.id.SearchResultFragment, - action = R.id.action_searchResultFragment_to_postFragment, - args = SearchResultFragmentDirections.actionSearchResultFragmentToPostFragment( - search.postId - ).arguments - ) - } - }) - } - - private fun setSearchKeywordInputDone() { - binding.tvSearchResultKeywordInput.setOnEditorActionListener { _, actionId, _ -> - when (actionId) { - EditorInfo.IME_ACTION_SEARCH -> { - HideKeyBoardUtil.hide(requireContext(), binding.tvSearchResultKeywordInput) - binding.tvSearchResultKeywordInput.setText(ReplaceUnicode.replaceBlankText(binding.tvSearchResultKeywordInput.text.toString())) - if (ReplaceUnicode.replaceBlankText(binding.tvSearchResultKeywordInput.text.toString()).isNotBlank()) { - searchViewModel.searchKeyword = ReplaceUnicode.replaceBlankText(binding.tvSearchResultKeywordInput.text.toString()) - getSearchTagList(searchViewModel.searchKeyword) - } - true - } - - else -> false - } - } - } - - private fun setSearchKeywordInputRemoveClickListener() { - binding.btnSearchResultRemoveEtInput.setOnDebounceClickListener { - binding.tvSearchResultKeywordInput.setText("") - } - } - - private fun getSearchTagList(keyword: String) { - searchViewModel.searchKeyword(keyword) - } - - private fun observeSearchTagList() { -// searchViewModel.searchTagList.observe(viewLifecycleOwner) { -// searchTagResultPostAdapter?.submitData(viewLifecycleOwner.lifecycle, it) -// } - } - - private fun observeSearchTagCount() { -// searchViewModel.searchTotalCount.observe(viewLifecycleOwner) { -// binding.resultCount = it -// } - } - - private fun setAdapterLoadStateListener() { - searchTagResultPostAdapter?.let { - it.addLoadStateListener { loadState -> - if (loadState.refresh is LoadState.NotLoading) { - val isListEmpty = it.itemCount == 0 - if (isListEmpty) { - binding.layoutSearchResultContents.visibility = View.INVISIBLE - binding.layoutSearchResultEmpty.visibility = View.VISIBLE - } else { - binding.layoutSearchResultContents.visibility = View.VISIBLE - binding.layoutSearchResultEmpty.visibility = View.INVISIBLE - } - - if (isListEmpty || loadState.append is LoadState.NotLoading) { - completeLoadPost() - } - } - } - } - } - - private fun loadingPost() { - binding.layoutSearchResultPostShimmer.startShimmer() - binding.layoutSearchResultPostShimmer.visibility = View.VISIBLE - binding.rvSearchResultContentsPostList.visibility = View.INVISIBLE - } - - private fun completeLoadPost() { - binding.layoutSearchResultPostShimmer.stopShimmer() - binding.layoutSearchResultPostShimmer.visibility = View.GONE - binding.rvSearchResultContentsPostList.visibility = View.VISIBLE - } -} \ No newline at end of file diff --git a/presentation/src/main/java/daily/dayo/presentation/screen/feed/FeedNavigation.kt b/presentation/src/main/java/daily/dayo/presentation/screen/feed/FeedNavigation.kt index 78d61303..c7d64ea3 100644 --- a/presentation/src/main/java/daily/dayo/presentation/screen/feed/FeedNavigation.kt +++ b/presentation/src/main/java/daily/dayo/presentation/screen/feed/FeedNavigation.kt @@ -11,9 +11,9 @@ import androidx.navigation.compose.composable fun NavGraphBuilder.feedNavGraph( snackBarHostState: SnackbarHostState, onEmptyViewClick: () -> Unit, - onPostClick: (String) -> Unit, + onPostClick: (Long) -> Unit, onProfileClick: (String) -> Unit, - onPostLikeUsersClick: (String) -> Unit, + onPostLikeUsersClick: (Long) -> Unit, onPostHashtagClick: (String) -> Unit, bottomSheetState: ModalBottomSheetState, bottomSheetContent: (@Composable () -> Unit) -> Unit, diff --git a/presentation/src/main/java/daily/dayo/presentation/screen/feed/FeedScreen.kt b/presentation/src/main/java/daily/dayo/presentation/screen/feed/FeedScreen.kt index e52e9d3f..8c8d72a9 100644 --- a/presentation/src/main/java/daily/dayo/presentation/screen/feed/FeedScreen.kt +++ b/presentation/src/main/java/daily/dayo/presentation/screen/feed/FeedScreen.kt @@ -52,9 +52,9 @@ import daily.dayo.presentation.viewmodel.FeedViewModel fun FeedScreen( snackBarHostState: SnackbarHostState, onEmptyViewClick: () -> Unit, - onPostClick: (String) -> Unit, + onPostClick: (Long) -> Unit, onProfileClick: (String) -> Unit, - onPostLikeUsersClick: (String) -> Unit, + onPostLikeUsersClick: (Long) -> Unit, onPostHashtagClick: (String) -> Unit, bottomSheetState: ModalBottomSheetState, bottomSheetContent: (@Composable () -> Unit) -> Unit, @@ -127,15 +127,9 @@ fun FeedScreen( post = post, snackBarHostState = snackBarHostState, onClickProfile = onProfileClick, - onClickPost = { - onPostClick(post.postId.toString()) - }, - onClickLikePost = { - feedViewModel.toggleLikePost(post = post) - }, - onClickBookmark = { - feedViewModel.toggleBookmarkPost(post = post) - }, + onClickPost = { post.postId?.let { onPostClick(it) } }, + onClickLikePost = { feedViewModel.toggleLikePost(post = post) }, + onClickBookmark = { feedViewModel.toggleBookmarkPost(post = post) }, onPostLikeUsersClick = onPostLikeUsersClick, onPostHashtagClick = onPostHashtagClick, bottomSheetState = bottomSheetState, diff --git a/presentation/src/main/java/daily/dayo/presentation/screen/folder/FolderEditScreen.kt b/presentation/src/main/java/daily/dayo/presentation/screen/folder/FolderEditScreen.kt index f859c17f..af5b908d 100644 --- a/presentation/src/main/java/daily/dayo/presentation/screen/folder/FolderEditScreen.kt +++ b/presentation/src/main/java/daily/dayo/presentation/screen/folder/FolderEditScreen.kt @@ -49,7 +49,7 @@ import daily.dayo.presentation.viewmodel.FolderViewModel @Composable fun FolderEditScreen( - folderId: String, + folderId: Long, onBackClick: () -> Unit, folderViewModel: FolderViewModel = hiltViewModel() ) { @@ -62,7 +62,7 @@ fun FolderEditScreen( val editSuccess by folderViewModel.editSuccess.collectAsStateWithLifecycle(false) LaunchedEffect(folderId) { - folderViewModel.requestFolderInfo(folderId.toInt()) + folderViewModel.requestFolderInfo(folderId) } LaunchedEffect(folderUiState) { @@ -85,7 +85,7 @@ fun FolderEditScreen( folderInfo.value?.run { folderViewModel.requestEditFolder( - folderId = folderId.toInt(), + folderId = folderId, name = name, subheading = subheading, privacy = privacy diff --git a/presentation/src/main/java/daily/dayo/presentation/screen/folder/FolderPostMoveScreen.kt b/presentation/src/main/java/daily/dayo/presentation/screen/folder/FolderPostMoveScreen.kt index 0592d76d..0d3f7b61 100644 --- a/presentation/src/main/java/daily/dayo/presentation/screen/folder/FolderPostMoveScreen.kt +++ b/presentation/src/main/java/daily/dayo/presentation/screen/folder/FolderPostMoveScreen.kt @@ -24,6 +24,7 @@ import androidx.lifecycle.flowWithLifecycle import daily.dayo.domain.model.Folder import daily.dayo.presentation.R import daily.dayo.presentation.common.Status +import daily.dayo.presentation.screen.write.MAX_FOLDER_COUNT import daily.dayo.presentation.screen.write.WriteFolderScreen import daily.dayo.presentation.theme.DayoTheme import daily.dayo.presentation.view.FilledRoundedCornerButton @@ -31,6 +32,7 @@ import daily.dayo.presentation.viewmodel.FolderViewModel @Composable internal fun FolderPostMoveScreen( + currentFolderId: Long, navigateToCreateNewFolder: () -> Unit, navigateBackToFolder: () -> Unit, onBackClick: () -> Unit, @@ -39,8 +41,12 @@ internal fun FolderPostMoveScreen( val context = LocalContext.current val lifecycleOwner = LocalLifecycleOwner.current - val folderList = folderViewModel.folderList.observeAsState() - var selectedFolder by remember { mutableStateOf(null) } + val folderListState = folderViewModel.folderList.observeAsState() + val folderList = when (folderListState.value?.status) { + Status.SUCCESS -> folderListState.value?.data ?: emptyList() + else -> emptyList() + } + var selectedFolder by remember { mutableStateOf(null) } LaunchedEffect(Unit) { folderViewModel.requestAllMyFolderList() @@ -59,16 +65,14 @@ internal fun FolderPostMoveScreen( } FolderPostMoveScreen( - folders = when (folderList.value?.status) { - Status.SUCCESS -> folderList.value?.data ?: emptyList() - else -> emptyList() - }, + currentFolderId = currentFolderId, + folders = folderList, selectedFolder = selectedFolder, onFolderClick = { folderId, _ -> selectedFolder = folderId }, onPostMoveClick = { - folderViewModel.moveSelectedPost() + selectedFolder?.let { folderViewModel.moveSelectedPost(it) } }, navigateToCreateNewFolder = navigateToCreateNewFolder, onBackClick = onBackClick @@ -77,33 +81,34 @@ internal fun FolderPostMoveScreen( @Composable private fun FolderPostMoveScreen( + currentFolderId: Long, folders: List, - selectedFolder: String?, - onFolderClick: (String, String) -> Unit, + selectedFolder: Long?, + onFolderClick: (Long, String) -> Unit, onPostMoveClick: () -> Unit, navigateToCreateNewFolder: () -> Unit, onBackClick: () -> Unit ) { Scaffold( bottomBar = { - if (selectedFolder != null) { - Box(modifier = Modifier.padding(20.dp)) { - FilledRoundedCornerButton( - label = stringResource(id = R.string.folder_post_move), - onClick = onPostMoveClick, - modifier = Modifier.height(44.dp), - textStyle = DayoTheme.typography.b5 - ) - } + Box(modifier = Modifier.padding(20.dp)) { + FilledRoundedCornerButton( + label = stringResource(id = R.string.folder_post_move), + onClick = onPostMoveClick, + modifier = Modifier.height(44.dp), + enabled = selectedFolder != null, + textStyle = DayoTheme.typography.b5 + ) } } ) { contentPadding -> Box(modifier = Modifier.padding(contentPadding)) { WriteFolderScreen( + showCreateFolder = folders.size < MAX_FOLDER_COUNT, onBackClick = onBackClick, onFolderClick = onFolderClick, navigateToCreateNewFolder = navigateToCreateNewFolder, - folders = folders, + folders = folders.filterNot { it.folderId == currentFolderId }, currentFolderId = selectedFolder ) } @@ -114,6 +119,7 @@ private fun FolderPostMoveScreen( @Composable private fun PreviewFolderPostMoveScreen() { FolderPostMoveScreen( + currentFolderId = 0, folders = emptyList(), selectedFolder = null, onFolderClick = { folderId, folderName -> }, diff --git a/presentation/src/main/java/daily/dayo/presentation/screen/folder/FolderScreen.kt b/presentation/src/main/java/daily/dayo/presentation/screen/folder/FolderScreen.kt index 88c9f844..e3b05ca3 100644 --- a/presentation/src/main/java/daily/dayo/presentation/screen/folder/FolderScreen.kt +++ b/presentation/src/main/java/daily/dayo/presentation/screen/folder/FolderScreen.kt @@ -55,6 +55,7 @@ import androidx.paging.PagingData import androidx.paging.compose.LazyPagingItems import androidx.paging.compose.collectAsLazyPagingItems import daily.dayo.domain.model.FolderInfo +import daily.dayo.domain.model.FolderOrder import daily.dayo.domain.model.FolderPost import daily.dayo.domain.model.Privacy import daily.dayo.presentation.BuildConfig @@ -85,8 +86,8 @@ import kotlinx.coroutines.flow.flowOf @Composable fun FolderScreen( - folderId: String, - onPostClick: (String) -> Unit, + folderId: Long, + onPostClick: (Long) -> Unit, onFolderEditClick: () -> Unit, onPostMoveClick: () -> Unit, onBackClick: () -> Unit, @@ -129,8 +130,8 @@ fun FolderScreen( ) LaunchedEffect(folderId) { - folderViewModel.requestFolderInfo(folderId.toInt()) - folderViewModel.requestFolderPostList(folderId.toInt()) + folderViewModel.requestFolderInfo(folderId) + folderViewModel.requestFolderPostList(folderId) } LaunchedEffect(folderDeleteSuccess) { @@ -148,7 +149,7 @@ fun FolderScreen( Toast.makeText(context, context.getString(R.string.error_message), Toast.LENGTH_SHORT).show() } folderViewModel.toggleEditMode() - folderViewModel.requestFolderPostList(folderId.toInt()) + folderViewModel.requestFolderPostList(folderId) } } @@ -157,9 +158,10 @@ fun FolderScreen( folderPosts = folderPosts, optionMenu = optionMenu, onPostClick = { postId -> onPostClick(postId) }, - onPostSelect = { postId -> folderViewModel.toggleSelection(postId.toInt()) }, + onPostSelect = { postId -> folderViewModel.toggleSelection(postId) }, onCancelClick = { folderViewModel.toggleEditMode() }, onPostDeleteClick = { showPostDeleteAlertDialog = true }, + onClickSort = { folderViewModel.toggleFolderOrder(folderId) }, onPostMoveClick = onPostMoveClick, onBackClick = onBackClick ) @@ -171,7 +173,7 @@ fun FolderScreen( showFolderDeleteAlertDialog = false showLoadingDialog(loadingAlertDialog.value) resizeDialogFragment(context, loadingAlertDialog.value, 0.8f) - folderViewModel.requestDeleteFolder(folderId.toInt()) + folderViewModel.requestDeleteFolder(folderId) }, onShowChange = { showFolderDeleteAlertDialog = it } ) @@ -184,7 +186,7 @@ fun FolderScreen( showPostDeleteAlertDialog = false // TODO Show Loading folderViewModel.deletePosts() - folderViewModel.requestDeleteFolder(folderId.toInt()) + folderViewModel.requestDeleteFolder(folderId) }, onShowChange = { showPostDeleteAlertDialog = it } ) @@ -196,109 +198,118 @@ private fun FolderScreen( folderUiState: FolderUiState, folderPosts: LazyPagingItems, optionMenu: List, - onPostClick: (String) -> Unit, - onPostSelect: (String) -> Unit, + onPostClick: (Long) -> Unit, + onPostSelect: (Long) -> Unit, onPostDeleteClick: () -> Unit, onPostMoveClick: () -> Unit, + onClickSort: () -> Unit, onCancelClick: () -> Unit, onBackClick: () -> Unit ) { val optionExpanded = remember { mutableStateOf(false) } - Scaffold( - topBar = { - if (folderUiState.isEditMode) { - TopNavigation( - leftIcon = { - androidx.compose.material.Text( - modifier = Modifier - .padding(vertical = 14.dp) - .padding(start = 18.dp, end = 27.dp) - .clickableSingle( - interactionSource = remember { MutableInteractionSource() }, - indication = null, - onClick = onCancelClick - ), - text = stringResource(id = R.string.cancel), - style = DayoTheme.typography.b6.copy(color = Gray1_50545B), - ) - } - ) - } else { - TopNavigation( - leftIcon = { - IconButton(onClick = onBackClick) { - Icon( - painter = painterResource(id = R.drawable.ic_back_sign), - contentDescription = stringResource(id = R.string.back_sign), - tint = Dark + with(folderUiState) { + Scaffold( + topBar = { + if (isEditMode) { + TopNavigation( + leftIcon = { + androidx.compose.material.Text( + modifier = Modifier + .padding(vertical = 14.dp) + .padding(start = 18.dp, end = 27.dp) + .clickableSingle( + interactionSource = remember { MutableInteractionSource() }, + indication = null, + onClick = onCancelClick + ), + text = stringResource(id = R.string.cancel), + style = DayoTheme.typography.b6.copy(color = Gray1_50545B), ) } - }, - rightIcon = { - IconButton( - onClick = { optionExpanded.value = optionExpanded.value.not() } - ) { - Icon( - painter = painterResource(id = R.drawable.ic_option_horizontal), - contentDescription = stringResource(id = R.string.folder_option), - tint = Dark + ) + } else { + TopNavigation( + leftIcon = { + IconButton(onClick = onBackClick) { + Icon( + painter = painterResource(id = R.drawable.ic_back_sign), + contentDescription = stringResource(id = R.string.back_sign), + tint = Dark + ) + } + }, + rightIcon = { + IconButton( + onClick = { optionExpanded.value = optionExpanded.value.not() } + ) { + Icon( + painter = painterResource(id = R.drawable.ic_option_horizontal), + contentDescription = stringResource(id = R.string.folder_option), + tint = Dark + ) + } + + FolderDropdownMenu( + menuItems = optionMenu, + expanded = optionExpanded ) } - - FolderDropdownMenu( - menuItems = optionMenu, - expanded = optionExpanded - ) - } - ) - } - }, - bottomBar = { - if (folderUiState.isEditMode) { - Row( - modifier = Modifier.padding(20.dp) - ) { - FilledRoundedCornerButton( - label = stringResource(R.string.delete), - onClick = onPostDeleteClick, - modifier = Modifier - .weight(1f) - .height(44.dp), - enabled = folderUiState.selectedPosts.isNotEmpty(), - color = ButtonDefaults.buttonColors( - containerColor = Gray5_E8EAEE, - contentColor = Gray2_767B83, - disabledContainerColor = Gray7_F6F6F7, - disabledContentColor = Gray4_C5CAD2 - ) ) + } + }, + bottomBar = { + if (isEditMode) { + Row( + modifier = Modifier.padding(20.dp) + ) { + FilledRoundedCornerButton( + label = stringResource(R.string.delete), + onClick = onPostDeleteClick, + modifier = Modifier + .weight(1f) + .height(44.dp), + enabled = selectedPosts.isNotEmpty(), + color = ButtonDefaults.buttonColors( + containerColor = Gray5_E8EAEE, + contentColor = Gray2_767B83, + disabledContainerColor = Gray7_F6F6F7, + disabledContentColor = Gray4_C5CAD2 + ) + ) - Spacer(modifier = Modifier.width(10.dp)) + Spacer(modifier = Modifier.width(10.dp)) - FilledRoundedCornerButton( - label = stringResource(R.string.move), - onClick = onPostMoveClick, - modifier = Modifier - .weight(1f) - .height(44.dp), - enabled = folderUiState.selectedPosts.isNotEmpty() - ) + FilledRoundedCornerButton( + label = stringResource(R.string.move), + onClick = onPostMoveClick, + modifier = Modifier + .weight(1f) + .height(44.dp), + enabled = selectedPosts.isNotEmpty() + ) + } } } - } - ) { innerPadding -> - Column(modifier = Modifier.padding(innerPadding)) { - if (!folderUiState.isEditMode) { - FolderInformation(folderUiState.folderInfo) + ) { innerPadding -> + Column(modifier = Modifier.padding(innerPadding)) { + if (!isEditMode) { + FolderInformation(folderInfo) + } + FolderHeader( + postCount = folderInfo.postCount, + selectedCount = selectedPosts.size, + isEditMode = isEditMode, + folderOrder = folderOrder, + onClickSort = onClickSort + ) + FolderContent( + folderUiState = folderUiState, + folderPosts = folderPosts, + onPostClick = onPostClick, + onPostSelect = onPostSelect + ) } - FolderHeader(folderUiState.folderInfo.postCount, folderUiState.selectedPosts.size, folderUiState.isEditMode) - FolderContent( - folderUiState = folderUiState, - folderPosts = folderPosts, - onPostClick = onPostClick, - onPostSelect = onPostSelect - ) } } } @@ -419,7 +430,9 @@ private fun FolderDropdownMenu( private fun FolderHeader( postCount: Int, selectedCount: Int, - isEditMode: Boolean + isEditMode: Boolean, + folderOrder: FolderOrder, + onClickSort: () -> Unit ) { Row( modifier = Modifier @@ -448,27 +461,41 @@ private fun FolderHeader( style = DayoTheme.typography.caption2 ) } else { - Icon( - painter = painterResource(id = R.drawable.ic_sort), - contentDescription = stringResource(id = R.string.folder_post_sort_oldest), - tint = Color.Unspecified - ) - - Text( - text = stringResource(id = R.string.folder_post_sort_oldest), - color = Gray2_767B83, - style = DayoTheme.typography.caption2 - ) + FolderSortSelector(folderOrder = folderOrder, onClickSort = onClickSort) } } } +@Composable +private fun FolderSortSelector(folderOrder: FolderOrder, onClickSort: () -> Unit) { + val sortResId = when (folderOrder) { + FolderOrder.NEW -> R.string.folder_post_sort_newest + FolderOrder.OLD -> R.string.folder_post_sort_oldest + } + + Row( + modifier = Modifier.clickableSingle { onClickSort() } + ) { + Icon( + painter = painterResource(id = R.drawable.ic_sort), + contentDescription = stringResource(id = sortResId), + tint = Color.Unspecified + ) + + Text( + text = stringResource(id = sortResId), + color = Gray2_767B83, + style = DayoTheme.typography.caption2 + ) + } +} + @Composable private fun FolderContent( folderUiState: FolderUiState, folderPosts: LazyPagingItems, - onPostClick: (String) -> Unit, - onPostSelect: (String) -> Unit + onPostClick: (Long) -> Unit, + onPostSelect: (Long) -> Unit ) { LazyVerticalGrid( columns = GridCells.Fixed(2), @@ -496,8 +523,8 @@ private fun FolderPostItem( post: FolderPost, isEditMode: Boolean, isSelected: Boolean, - onPostClick: (String) -> Unit, - onPostSelect: (String) -> Unit + onPostClick: (Long) -> Unit, + onPostSelect: (Long) -> Unit ) { val interactionSource: MutableInteractionSource = remember { MutableInteractionSource() } @@ -507,9 +534,9 @@ private fun FolderPostItem( indication = null, onClick = { if (isEditMode) { - onPostSelect(post.postId.toString()) + onPostSelect(post.postId) } else { - onPostClick(post.postId.toString()) + onPostClick(post.postId) } } ) @@ -526,7 +553,7 @@ private fun FolderPostItem( if (isEditMode) { DayoCheckbox( checked = isSelected, - onCheckedChange = { onPostSelect(post.postId.toString()) }, + onCheckedChange = { onPostSelect(post.postId) }, modifier = Modifier.align(Alignment.TopEnd), interactionSource = interactionSource ) @@ -588,6 +615,45 @@ private fun PreviewFolderScreen() { ) ) + val folderUiState = FolderUiState( + folderInfo = FolderInfo( + memberId = "", + name = "Folder Title", + postCount = 27, + privacy = Privacy.ALL, + subheading = "Description", + thumbnailImage = "" + ), + folderPosts = flowOf(folderPostPagingData), + isEditMode = false, + selectedPosts = emptySet() + ) + + DayoTheme { + FolderScreen( + folderUiState = folderUiState, + folderPosts = folderUiState.folderPosts.collectAsLazyPagingItems(), + optionMenu = listOf(), + onPostClick = { }, + onPostSelect = { }, + onPostDeleteClick = { }, + onPostMoveClick = { }, + onClickSort = { }, + onCancelClick = { }, + onBackClick = { } + ) + } +} + +@Preview +@Composable +private fun PreviewFolderScreenEditMode() { + val folderPostPagingData = PagingData.from( + listOf( + FolderPost("", 0, "") + ) + ) + val folderUiState = FolderUiState( folderInfo = FolderInfo( memberId = "", @@ -611,6 +677,7 @@ private fun PreviewFolderScreen() { onPostSelect = { }, onPostDeleteClick = { }, onPostMoveClick = { }, + onClickSort = { }, onCancelClick = { }, onBackClick = { } ) diff --git a/presentation/src/main/java/daily/dayo/presentation/screen/home/HomeDayoPickScreen.kt b/presentation/src/main/java/daily/dayo/presentation/screen/home/HomeDayoPickScreen.kt index 26e6999b..9c768b3b 100644 --- a/presentation/src/main/java/daily/dayo/presentation/screen/home/HomeDayoPickScreen.kt +++ b/presentation/src/main/java/daily/dayo/presentation/screen/home/HomeDayoPickScreen.kt @@ -62,7 +62,7 @@ import kotlinx.coroutines.launch @Composable fun HomeDayoPickScreen( selectedCategoryName: String, - onPostClick: (String) -> Unit, + onPostClick: (Long) -> Unit, onProfileClick: (String) -> Unit, coroutineScope: CoroutineScope, bottomSheetState: ModalBottomSheetState, @@ -124,12 +124,14 @@ fun HomeDayoPickScreen( post = post, isDayoPick = index in 0..4, modifier = Modifier.padding(bottom = 20.dp), - onClickPost = { onPostClick(post.postId.toString()) }, + onClickPost = { post.postId?.let { onPostClick(it) } }, onClickLikePost = { - if (!post.heart) { - homeViewModel.requestLikePost(post.postId!!, isDayoPickLike = true) - } else { - homeViewModel.requestUnlikePost(post.postId!!, isDayoPickLike = true) + post.postId?.let { postId -> + if (!post.heart) { + homeViewModel.requestLikePost(postId, isDayoPickLike = true) + } else { + homeViewModel.requestUnlikePost(postId, isDayoPickLike = true) + } } }, onClickProfile = { post.memberId?.let { onProfileClick(it) } } diff --git a/presentation/src/main/java/daily/dayo/presentation/screen/home/HomeNavigation.kt b/presentation/src/main/java/daily/dayo/presentation/screen/home/HomeNavigation.kt index 49676f2a..c3dbd892 100644 --- a/presentation/src/main/java/daily/dayo/presentation/screen/home/HomeNavigation.kt +++ b/presentation/src/main/java/daily/dayo/presentation/screen/home/HomeNavigation.kt @@ -14,7 +14,7 @@ fun NavController.navigateHome() { @OptIn(ExperimentalMaterialApi::class) fun NavGraphBuilder.homeNavGraph( - onPostClick: (String) -> Unit, + onPostClick: (Long) -> Unit, onProfileClick: (String) -> Unit, onSearchClick: () -> Unit, coroutineScope: CoroutineScope, diff --git a/presentation/src/main/java/daily/dayo/presentation/screen/home/HomeNewScreen.kt b/presentation/src/main/java/daily/dayo/presentation/screen/home/HomeNewScreen.kt index 3e61e623..9273c691 100644 --- a/presentation/src/main/java/daily/dayo/presentation/screen/home/HomeNewScreen.kt +++ b/presentation/src/main/java/daily/dayo/presentation/screen/home/HomeNewScreen.kt @@ -51,7 +51,7 @@ import kotlinx.coroutines.CoroutineScope @Composable fun HomeNewScreen( selectedCategoryName: String, - onPostClick: (String) -> Unit, + onPostClick: (Long) -> Unit, onProfileClick: (String) -> Unit, coroutineScope: CoroutineScope, bottomSheetState: ModalBottomSheetState, @@ -112,12 +112,14 @@ fun HomeNewScreen( HomePostView( post = post, modifier = Modifier.padding(bottom = 20.dp), - onClickPost = { onPostClick(post.postId.toString()) }, + onClickPost = { post.postId?.let { onPostClick(it) } }, onClickLikePost = { - if (!post.heart) { - homeViewModel.requestLikePost(post.postId!!, isDayoPickLike = false) - } else { - homeViewModel.requestUnlikePost(post.postId!!, isDayoPickLike = false) + post.postId?.let { postId -> + if (!post.heart) { + homeViewModel.requestLikePost(postId, isDayoPickLike = false) + } else { + homeViewModel.requestUnlikePost(postId, isDayoPickLike = false) + } } }, onClickProfile = { post.memberId?.let { onProfileClick(it) } } diff --git a/presentation/src/main/java/daily/dayo/presentation/screen/home/HomeScreen.kt b/presentation/src/main/java/daily/dayo/presentation/screen/home/HomeScreen.kt index 180d9bc7..6b167f95 100644 --- a/presentation/src/main/java/daily/dayo/presentation/screen/home/HomeScreen.kt +++ b/presentation/src/main/java/daily/dayo/presentation/screen/home/HomeScreen.kt @@ -48,7 +48,7 @@ const val HOME_NEW_PAGE_TAB_ID = 1 @OptIn(ExperimentalMaterialApi::class) @Composable fun HomeScreen( - onPostClick: (String) -> Unit, + onPostClick: (Long) -> Unit, onProfileClick: (String) -> Unit, onSearchClick: () -> Unit, coroutineScope: CoroutineScope, diff --git a/presentation/src/main/java/daily/dayo/presentation/screen/main/MainNavigator.kt b/presentation/src/main/java/daily/dayo/presentation/screen/main/MainNavigator.kt index 1ab64a46..10d5a9ba 100644 --- a/presentation/src/main/java/daily/dayo/presentation/screen/main/MainNavigator.kt +++ b/presentation/src/main/java/daily/dayo/presentation/screen/main/MainNavigator.kt @@ -42,7 +42,7 @@ class MainNavigator( navController.navigateHome() } - fun navigatePost(postId: String) { + fun navigatePost(postId: Long) { navController.navigatePost(postId = postId) } @@ -92,11 +92,11 @@ class MainNavigator( navController.navigateFolderCreate() } - fun navigateFolderEdit(folderId: String) { + fun navigateFolderEdit(folderId: Long) { navController.navigateFolderEdit(folderId) } - fun navigateFolderPostMove(folderId: String) { + fun navigateFolderPostMove(folderId: Long) { navController.navigateFolderPostMove(folderId) } @@ -104,11 +104,11 @@ class MainNavigator( navController.navigateFollowMenu(memberId, tabNum) } - fun navigateFolder(folderId: String) { + fun navigateFolder(folderId: Long) { navController.navigateFolder(folderId) } - fun navigateBackToFolder(folderId: String) { + fun navigateBackToFolder(folderId: Long) { navController.navigateBackToFolder(folderId) } @@ -141,7 +141,7 @@ class MainNavigator( private fun isSameCurrentDestination(route: String) = navController.currentDestination?.route == route - fun navigatePostLikeUsers(postId: String) { + fun navigatePostLikeUsers(postId: Long) { navController.navigatePostLikeUsers(postId = postId) } diff --git a/presentation/src/main/java/daily/dayo/presentation/screen/main/MainScreen.kt b/presentation/src/main/java/daily/dayo/presentation/screen/main/MainScreen.kt index 4cbd6e18..50bd7ab7 100644 --- a/presentation/src/main/java/daily/dayo/presentation/screen/main/MainScreen.kt +++ b/presentation/src/main/java/daily/dayo/presentation/screen/main/MainScreen.kt @@ -128,6 +128,7 @@ internal fun MainScreen( bottomSheetContent, ) myPageNavGraph( + navController = navigator.navController, onBackClick = { navigator.popBackStack() }, onSettingsClick = { navigator.navigateSettings() }, onFollowButtonClick = { memberId, tabNum -> navigator.navigateFollowMenu(memberId, tabNum) }, diff --git a/presentation/src/main/java/daily/dayo/presentation/screen/mypage/MyPageScreen.kt b/presentation/src/main/java/daily/dayo/presentation/screen/mypage/MyPageScreen.kt index ec94a4ed..55d32ead 100644 --- a/presentation/src/main/java/daily/dayo/presentation/screen/mypage/MyPageScreen.kt +++ b/presentation/src/main/java/daily/dayo/presentation/screen/mypage/MyPageScreen.kt @@ -71,7 +71,7 @@ fun MyPageScreen( onFollowButtonClick: (String, Int) -> Unit, onProfileEditClick: () -> Unit, onBookmarkClick: () -> Unit, - onFolderClick: (String) -> Unit, + onFolderClick: (Long) -> Unit, onFolderCreateClick: () -> Unit, profileViewModel: ProfileViewModel = hiltViewModel(), folderViewModel: FolderViewModel = hiltViewModel() @@ -334,7 +334,7 @@ private fun MyPageDiaryHeader( } @Composable -private fun MyPageDiary(folder: Folder, onFolderClick: (String) -> Unit) { +private fun MyPageDiary(folder: Folder, onFolderClick: (Long) -> Unit) { FolderView( folder = folder, onClickFolder = onFolderClick, diff --git a/presentation/src/main/java/daily/dayo/presentation/screen/mypage/MypageNavigation.kt b/presentation/src/main/java/daily/dayo/presentation/screen/mypage/MypageNavigation.kt index 1e49859f..6c893bc4 100644 --- a/presentation/src/main/java/daily/dayo/presentation/screen/mypage/MypageNavigation.kt +++ b/presentation/src/main/java/daily/dayo/presentation/screen/mypage/MypageNavigation.kt @@ -1,5 +1,7 @@ package daily.dayo.presentation.screen.mypage +import androidx.compose.runtime.remember +import androidx.hilt.navigation.compose.hiltViewModel import androidx.navigation.NavController import androidx.navigation.NavGraphBuilder import androidx.navigation.NavType @@ -29,11 +31,11 @@ fun NavController.navigateFolderCreate() { navigate(MyPageRoute.folderCreate()) } -fun NavController.navigateFolderEdit(folderId: String) { +fun NavController.navigateFolderEdit(folderId: Long) { navigate(MyPageRoute.folderEdit(folderId)) } -fun NavController.navigateFolderPostMove(folderId: String) { +fun NavController.navigateFolderPostMove(folderId: Long) { navigate(MyPageRoute.folderPostMove(folderId)) } @@ -41,11 +43,11 @@ fun NavController.navigateFollowMenu(memberId: String, tabNum: Int) { navigate(MyPageRoute.follow(memberId, "$tabNum")) } -fun NavController.navigateFolder(folderId: String) { +fun NavController.navigateFolder(folderId: Long) { navigate(MyPageRoute.folder(folderId)) } -fun NavController.navigateBackToFolder(folderId: String) { +fun NavController.navigateBackToFolder(folderId: Long) { navigate(MyPageRoute.folder(folderId)) { popUpTo(MyPageRoute.folder(folderId)) { inclusive = true @@ -55,18 +57,19 @@ fun NavController.navigateBackToFolder(folderId: String) { } fun NavGraphBuilder.myPageNavGraph( + navController: NavController, onBackClick: () -> Unit, onSettingsClick: () -> Unit, onFollowButtonClick: (String, Int) -> Unit, onProfileClick: (String) -> Unit, onProfileEditClick: () -> Unit, onBookmarkClick: () -> Unit, - onFolderClick: (String) -> Unit, + onFolderClick: (Long) -> Unit, onFolderCreateClick: () -> Unit, - onFolderEditClick: (String) -> Unit, - onPostClick: (String) -> Unit, - onPostMoveClick: (String) -> Unit, - navigateBackToFolder: (String) -> Unit + onFolderEditClick: (Long) -> Unit, + onPostClick: (Long) -> Unit, + onPostMoveClick: (Long) -> Unit, + navigateBackToFolder: (Long) -> Unit ) { composable(MyPageRoute.route) { MyPageScreen( @@ -119,57 +122,70 @@ fun NavGraphBuilder.myPageNavGraph( } composable( - route = MyPageRoute.folder("{folderId}"), + route = MyPageRoute.folderRoute, arguments = listOf( navArgument("folderId") { - type = NavType.StringType + type = NavType.LongType } ) ) { navBackStackEntry -> - val folderId = navBackStackEntry.arguments?.getString("folderId") ?: "" - FolderScreen( - folderId = folderId, - onPostClick = onPostClick, - onFolderEditClick = { onFolderEditClick(folderId) }, - onPostMoveClick = { onPostMoveClick(folderId) }, - onBackClick = onBackClick - ) + navBackStackEntry.arguments?.getLong("folderId")?.let { folderId -> + FolderScreen( + folderId = folderId, + onPostClick = onPostClick, + onFolderEditClick = { onFolderEditClick(folderId) }, + onPostMoveClick = { onPostMoveClick(folderId) }, + onBackClick = onBackClick, + folderViewModel = hiltViewModel(navBackStackEntry) + ) + } } composable( - route = MyPageRoute.folderEdit("{folderId}"), + route = MyPageRoute.folderEditRoute, arguments = listOf( navArgument("folderId") { - type = NavType.StringType + type = NavType.LongType } ) ) { navBackStackEntry -> - val folderId = navBackStackEntry.arguments?.getString("folderId") ?: "" - FolderEditScreen( - folderId = folderId, - onBackClick = onBackClick - ) + navBackStackEntry.arguments?.getLong("folderId")?.let { folderId -> + FolderEditScreen( + folderId = folderId, + onBackClick = onBackClick + ) + } } composable( - route = MyPageRoute.folderPostMove("{folderId}"), + route = MyPageRoute.folderPostMoveRoute, arguments = listOf( navArgument("folderId") { - type = NavType.StringType + type = NavType.LongType } ) ) { navBackStackEntry -> - val folderId = navBackStackEntry.arguments?.getString("folderId") ?: "" - FolderPostMoveScreen( - navigateBackToFolder = { navigateBackToFolder(folderId) }, - navigateToCreateNewFolder = onFolderCreateClick, - onBackClick = onBackClick - ) + navBackStackEntry.arguments?.getLong("folderId")?.let { folderId -> + val parentStackEntry = remember(navBackStackEntry) { + navController.getBackStackEntry(MyPageRoute.folder(folderId)) + } + + FolderPostMoveScreen( + currentFolderId = folderId, + navigateToCreateNewFolder = onFolderCreateClick, + navigateBackToFolder = { navigateBackToFolder(folderId) }, + onBackClick = onBackClick, + folderViewModel = hiltViewModel(parentStackEntry) + ) + } } } object MyPageRoute { const val route = "myPage" + const val folderRoute = "$route/folder/{folderId}" + const val folderEditRoute = "$route/folder/edit/{folderId}" + const val folderPostMoveRoute = "$route/folder/move/{folderId}" // profile edit fun profileEdit() = "$route/edit" @@ -181,8 +197,8 @@ object MyPageRoute { fun bookmark() = "$route/bookmark" // folder - fun folder(folderId: String) = "$route/folder/$folderId" + fun folder(folderId: Long) = "$route/folder/$folderId" fun folderCreate() = "$route/folder/create" - fun folderEdit(folderId: String) = "$route/folder/edit/$folderId" - fun folderPostMove(folderId: String) = "$route/folder/move/$folderId" + fun folderEdit(folderId: Long) = "$route/folder/edit/$folderId" + fun folderPostMove(folderId: Long) = "$route/folder/move/$folderId" } diff --git a/presentation/src/main/java/daily/dayo/presentation/screen/notification/NotificationNavigation.kt b/presentation/src/main/java/daily/dayo/presentation/screen/notification/NotificationNavigation.kt index 9964ca92..bce0a827 100644 --- a/presentation/src/main/java/daily/dayo/presentation/screen/notification/NotificationNavigation.kt +++ b/presentation/src/main/java/daily/dayo/presentation/screen/notification/NotificationNavigation.kt @@ -4,7 +4,7 @@ import androidx.navigation.NavGraphBuilder import androidx.navigation.compose.composable fun NavGraphBuilder.notificationNavGraph( - onPostClick: (String) -> Unit, + onPostClick: (Long) -> Unit, onProfileClick: (String) -> Unit, onNoticeClick: (Long) -> Unit, ) { diff --git a/presentation/src/main/java/daily/dayo/presentation/screen/notification/NotificationScreen.kt b/presentation/src/main/java/daily/dayo/presentation/screen/notification/NotificationScreen.kt index bbe713c8..e946538f 100644 --- a/presentation/src/main/java/daily/dayo/presentation/screen/notification/NotificationScreen.kt +++ b/presentation/src/main/java/daily/dayo/presentation/screen/notification/NotificationScreen.kt @@ -76,7 +76,7 @@ import kotlinx.coroutines.flow.flowOf @Preview fun NotificationScreen( notificationViewModel: NotificationViewModel = hiltViewModel(), - onPostClick: (String) -> Unit = {}, + onPostClick: (Long) -> Unit = {}, onProfileClick: (String) -> Unit = {}, onNoticeClick: (Long) -> Unit = {}, ) { @@ -141,7 +141,7 @@ fun NotificationContent( ) ).collectAsLazyPagingItems(), markAlarmAsChecked: (Int) -> Unit = {}, - onPostClick: (String) -> Unit = {}, + onPostClick: (Long) -> Unit = {}, onProfileClick: (String) -> Unit = {}, onNoticeClick: (Long) -> Unit = {}, ) { @@ -440,7 +440,7 @@ fun NotificationView( fun performNotificationNavigation( notification: Notification, - onPostClick: (String) -> Unit, + onPostClick: (Long) -> Unit, onProfileClick: (String) -> Unit, onNoticeClick: (Long) -> Unit, ) { @@ -448,13 +448,13 @@ fun performNotificationNavigation( when (topic) { Topic.HEART -> { notification.postId?.let { id -> - onPostClick(id.toString()) + onPostClick(id) } } Topic.COMMENT -> { notification.postId?.let { id -> - onPostClick(id.toString()) + onPostClick(id) } } @@ -471,7 +471,7 @@ fun performNotificationNavigation( Topic.MENTION -> { notification.postId?.let { id -> - onPostClick(id.toString()) + onPostClick(id) } } diff --git a/presentation/src/main/java/daily/dayo/presentation/screen/post/PostLikeUsersScreen.kt b/presentation/src/main/java/daily/dayo/presentation/screen/post/PostLikeUsersScreen.kt index 8a20a4a2..3bb2baaa 100644 --- a/presentation/src/main/java/daily/dayo/presentation/screen/post/PostLikeUsersScreen.kt +++ b/presentation/src/main/java/daily/dayo/presentation/screen/post/PostLikeUsersScreen.kt @@ -62,7 +62,7 @@ import java.text.DecimalFormat @Composable fun PostLikeUsersScreen( - postId: String, + postId: Long, onBackClick: () -> Unit, onProfileClick: (String) -> Unit, postViewModel: PostViewModel = hiltViewModel(), @@ -75,8 +75,8 @@ fun PostLikeUsersScreen( val unFollowSuccess by followViewModel.followerUnfollowSuccess.observeAsState() LaunchedEffect(likeCount, followSuccess, unFollowSuccess) { - postViewModel.requestPostDetail(postId = postId.toInt()) - postViewModel.requestPostLikeUsers(postId = postId.toInt()) + postViewModel.requestPostDetail(postId = postId) + postViewModel.requestPostLikeUsers(postId = postId) } Scaffold( diff --git a/presentation/src/main/java/daily/dayo/presentation/screen/post/PostNavigation.kt b/presentation/src/main/java/daily/dayo/presentation/screen/post/PostNavigation.kt index 634d56aa..e7c1353d 100644 --- a/presentation/src/main/java/daily/dayo/presentation/screen/post/PostNavigation.kt +++ b/presentation/src/main/java/daily/dayo/presentation/screen/post/PostNavigation.kt @@ -7,55 +7,60 @@ import androidx.navigation.NavType import androidx.navigation.compose.composable import androidx.navigation.navArgument -fun NavController.navigatePost(postId: String) { +fun NavController.navigatePost(postId: Long) { navigate(PostRoute.postDetail(postId)) } -fun NavController.navigatePostLikeUsers(postId: String) { +fun NavController.navigatePostLikeUsers(postId: Long) { navigate(PostRoute.postLikeUsers(postId)) } fun NavGraphBuilder.postNavGraph( snackBarHostState: SnackbarHostState, onProfileClick: (String) -> Unit, - onPostLikeUsersClick: (String) -> Unit, + onPostLikeUsersClick: (Long) -> Unit, onPostHashtagClick: (String) -> Unit, onBackClick: () -> Unit ) { composable( - route = PostRoute.postDetail("{postId}"), + route = PostRoute.postDetailRoute, arguments = listOf( navArgument("postId") { - type = NavType.StringType + type = NavType.LongType } ) ) { navBackStackEntry -> - val postId = navBackStackEntry.arguments?.getString("postId") ?: "" - PostScreen( - postId = postId, - snackBarHostState = snackBarHostState, - onProfileClick = onProfileClick, - onPostLikeUsersClick = onPostLikeUsersClick, - onPostHashtagClick = onPostHashtagClick, - onBackClick = onBackClick - ) + navBackStackEntry.arguments?.getLong("postId")?.let { postId -> + PostScreen( + postId = postId, + snackBarHostState = snackBarHostState, + onProfileClick = onProfileClick, + onPostLikeUsersClick = onPostLikeUsersClick, + onPostHashtagClick = onPostHashtagClick, + onBackClick = onBackClick + ) + } } composable( - route = PostRoute.postLikeUsers("{postId}"), + route = PostRoute.postLikeUsersRoute, arguments = listOf( navArgument("postId") { - type = NavType.StringType + type = NavType.LongType } ) ) { navBackStackEntry -> - val postId = navBackStackEntry.arguments?.getString("postId") ?: "" - PostLikeUsersScreen(postId = postId, onBackClick = { onBackClick() }, onProfileClick = onProfileClick) + navBackStackEntry.arguments?.getLong("postId")?.let { postId -> + PostLikeUsersScreen(postId = postId, onBackClick = { onBackClick() }, onProfileClick = onProfileClick) + } } } object PostRoute { private const val route: String = "post" - fun postDetail(postId: String): String = "$route/$postId" - fun postLikeUsers(postId: String): String = "$route/likeUsers/$postId" + const val postDetailRoute = "$route/{postId}" + const val postLikeUsersRoute = "$route/likeUsers/{postId}" + + fun postDetail(postId: Long) = "$route/$postId" + fun postLikeUsers(postId: Long) = "$route/likeUsers/$postId" } \ No newline at end of file diff --git a/presentation/src/main/java/daily/dayo/presentation/screen/post/PostScreen.kt b/presentation/src/main/java/daily/dayo/presentation/screen/post/PostScreen.kt index 72afbd1f..5f3aa7c8 100644 --- a/presentation/src/main/java/daily/dayo/presentation/screen/post/PostScreen.kt +++ b/presentation/src/main/java/daily/dayo/presentation/screen/post/PostScreen.kt @@ -69,10 +69,10 @@ import java.text.DecimalFormat @Composable fun PostScreen( - postId: String, + postId: Long, snackBarHostState: SnackbarHostState, onProfileClick: (String) -> Unit, - onPostLikeUsersClick: (String) -> Unit, + onPostLikeUsersClick: (Long) -> Unit, onPostHashtagClick: (String) -> Unit, onBackClick: () -> Unit, postViewModel: PostViewModel = hiltViewModel(), @@ -85,9 +85,9 @@ fun PostScreen( val coroutineScope = rememberCoroutineScope() // post option - val onPostModifyClick: (String) -> Unit = { postId -> /* TODO 게시글 수정 */ } - val onPostDeleteClick: (String) -> Unit = { - postViewModel.requestDeletePost(postId.toInt()) + val onPostModifyClick: (Long) -> Unit = { postId -> /* TODO 게시글 수정 */ } + val onPostDeleteClick: (Long) -> Unit = { + postViewModel.requestDeletePost(postId) } val postDeleteSuccess by postViewModel.postDeleteSuccess.collectAsStateWithLifecycle(false) @@ -103,7 +103,7 @@ fun PostScreen( } val postCommentDeleteSuccess by postViewModel.postCommentDeleteSuccess.observeAsState(Event(false)) if (postCommentDeleteSuccess.getContentIfNotHandled() == true) { - postViewModel.requestPostComment(postId.toInt()) + postViewModel.requestPostComment(postId) SideEffect { coroutineScope.launch { snackBarHostState.showSnackbar(context.getString(R.string.comment_delete_message)) @@ -143,8 +143,8 @@ fun PostScreen( // create comment val replyCommentState = remember { mutableStateOf?>(null) } // parent comment Id, reply comment val onClickPostComment: () -> Unit = { - if (replyCommentState.value == null) postViewModel.requestCreatePostComment(commentText.value.text, postId.toInt(), mentionedMemberIds) - else postViewModel.requestCreatePostCommentReply(replyCommentState.value!!, commentText.value.text, postId.toInt(), mentionedMemberIds) + if (replyCommentState.value == null) postViewModel.requestCreatePostComment(commentText.value.text, postId, mentionedMemberIds) + else postViewModel.requestCreatePostCommentReply(replyCommentState.value!!, commentText.value.text, postId, mentionedMemberIds) } val onClickCommentReply: (Pair?) -> Unit = { reply -> // set reply comment state @@ -168,12 +168,12 @@ fun PostScreen( val postCommentCreateSuccess by postViewModel.postCommentCreateSuccess.observeAsState(Event(false)) if (postCommentCreateSuccess.getContentIfNotHandled() == true) { clearComment() - postViewModel.requestPostComment(postId.toInt()) + postViewModel.requestPostComment(postId) } LaunchedEffect(Unit) { - postViewModel.requestPostDetail(postId.toInt()) - postViewModel.requestPostComment(postId.toInt()) + postViewModel.requestPostDetail(postId) + postViewModel.requestPostComment(postId) } LaunchedEffect(postState.value) { @@ -210,13 +210,13 @@ fun PostScreen( onPostModifyClick = onPostModifyClick, onPostDeleteClick = onPostDeleteClick, onClickLikePost = { - postViewModel.toggleLikePost(postId = postId.toInt(), currentHeart = post.heart) + postViewModel.toggleLikePost(postId = postId, currentHeart = post.heart) }, onClickBookmark = { - postViewModel.toggleBookmarkPostDetail(postId = postId.toInt(), currentBookmark = post.bookmark) + postViewModel.toggleBookmarkPostDetail(postId = postId, currentBookmark = post.bookmark) }, onClickReport = { reason -> - reportViewModel.requestSavePostReport(reason, postId.toInt()) + reportViewModel.requestSavePostReport(reason, postId) }, onPostLikeUsersClick = onPostLikeUsersClick, onPostHashtagClick = onPostHashtagClick, @@ -246,7 +246,7 @@ fun PostScreen( @Composable private fun PostScreen( - postId: String, + postId: Long, post: PostDetail, comments: Comments, currentMemberId: String?, @@ -260,12 +260,12 @@ private fun PostScreen( onClickPostComment: () -> Unit, onClickProfile: (String) -> Unit, onClickPost: () -> Unit, - onPostModifyClick: (String) -> Unit, - onPostDeleteClick: (String) -> Unit, + onPostModifyClick: (Long) -> Unit, + onPostDeleteClick: (Long) -> Unit, onClickLikePost: () -> Unit, onClickBookmark: () -> Unit, onClickReport: (String) -> Unit, - onPostLikeUsersClick: (String) -> Unit, + onPostLikeUsersClick: (Long) -> Unit, onPostHashtagClick: (String) -> Unit, onClickCommentReply: (Pair) -> Unit, onClickCommentDelete: (Long) -> Unit, @@ -369,7 +369,7 @@ private fun PreviewPostScreen() { DayoTheme { PostScreen( - postId = "0", + postId = 0L, post = DEFAULT_POST, comments = DEFAULT_COMMENTS, currentMemberId = "", diff --git a/presentation/src/main/java/daily/dayo/presentation/screen/profile/ProfileNavigation.kt b/presentation/src/main/java/daily/dayo/presentation/screen/profile/ProfileNavigation.kt index 48d557d3..b3dfa2e9 100644 --- a/presentation/src/main/java/daily/dayo/presentation/screen/profile/ProfileNavigation.kt +++ b/presentation/src/main/java/daily/dayo/presentation/screen/profile/ProfileNavigation.kt @@ -12,8 +12,8 @@ fun NavController.navigateProfile(memberId: String) { fun NavGraphBuilder.profileNavGraph( onFollowMenuClick: (String, Int) -> Unit, - onFolderClick: (String) -> Unit, - onPostClick: (String) -> Unit, + onFolderClick: (Long) -> Unit, + onPostClick: (Long) -> Unit, onBackClick: () -> Unit ) { composable( diff --git a/presentation/src/main/java/daily/dayo/presentation/screen/profile/ProfileScreen.kt b/presentation/src/main/java/daily/dayo/presentation/screen/profile/ProfileScreen.kt index e2cb7d33..5eeab49c 100644 --- a/presentation/src/main/java/daily/dayo/presentation/screen/profile/ProfileScreen.kt +++ b/presentation/src/main/java/daily/dayo/presentation/screen/profile/ProfileScreen.kt @@ -70,7 +70,7 @@ import kotlinx.coroutines.launch fun ProfileScreen( memberId: String, onFollowMenuClick: (String, Int) -> Unit, - onFolderClick: (String) -> Unit, + onFolderClick: (Long) -> Unit, onBackClick: () -> Unit, profileViewModel: ProfileViewModel = hiltViewModel(), folderViewModel: FolderViewModel = hiltViewModel(), @@ -128,7 +128,7 @@ private fun ProfileScreen( folderList: List, onFollowClick: () -> Unit, onFollowMenuClick: (String, Int) -> Unit, - onFolderClick: (String) -> Unit, + onFolderClick: (Long) -> Unit, onClickUserReport: (String) -> Unit, onBackClick: () -> Unit ) { @@ -342,7 +342,7 @@ private fun UserProfile( } @Composable -private fun UserDiary(folder: Folder, onFolderClick: (String) -> Unit) { +private fun UserDiary(folder: Folder, onFolderClick: (Long) -> Unit) { FolderView( folder = folder, onClickFolder = onFolderClick, diff --git a/presentation/src/main/java/daily/dayo/presentation/screen/search/SearchNavigation.kt b/presentation/src/main/java/daily/dayo/presentation/screen/search/SearchNavigation.kt index e7f8e0e9..d1cc5a5b 100644 --- a/presentation/src/main/java/daily/dayo/presentation/screen/search/SearchNavigation.kt +++ b/presentation/src/main/java/daily/dayo/presentation/screen/search/SearchNavigation.kt @@ -22,7 +22,7 @@ fun NavGraphBuilder.searchNavGraph( onBackClick: () -> Unit, onSearch: (String) -> Unit, onProfileClick: (String) -> Unit, - onPostClick: (String) -> Unit + onPostClick: (Long) -> Unit ) { composable(route = SearchRoute.route) { SearchRoute( diff --git a/presentation/src/main/java/daily/dayo/presentation/screen/search/SearchPostHashtagScreen.kt b/presentation/src/main/java/daily/dayo/presentation/screen/search/SearchPostHashtagScreen.kt index fac253c9..d6ab802a 100644 --- a/presentation/src/main/java/daily/dayo/presentation/screen/search/SearchPostHashtagScreen.kt +++ b/presentation/src/main/java/daily/dayo/presentation/screen/search/SearchPostHashtagScreen.kt @@ -39,7 +39,6 @@ import daily.dayo.presentation.theme.DayoTheme import daily.dayo.presentation.theme.Gray1_50545B import daily.dayo.presentation.theme.Gray2_767B83 import daily.dayo.presentation.theme.Primary_23C882 -import daily.dayo.presentation.theme.White_FFFFFF import daily.dayo.presentation.view.RoundImageView import daily.dayo.presentation.view.TopNavigation import daily.dayo.presentation.view.TopNavigationAlign @@ -49,7 +48,7 @@ import daily.dayo.presentation.viewmodel.SearchViewModel fun SearchPostHashtagScreen( hashtag: String, onBackClick: () -> Unit, - onPostClick: (String) -> Unit, + onPostClick: (Long) -> Unit, searchViewModel: SearchViewModel = hiltViewModel() ) { val isLatest by rememberSaveable { mutableStateOf(true) } // TODO api 수정 후 구현 @@ -115,7 +114,7 @@ fun SearchPostHashtagScreen( .clickableSingle( interactionSource = remember { MutableInteractionSource() }, indication = null, - onClick = { onPostClick(post?.postId.toString()) } + onClick = { post?.postId?.let { onPostClick(it) } } ) .padding(bottom = 4.dp) ) diff --git a/presentation/src/main/java/daily/dayo/presentation/screen/search/SearchResultScreen.kt b/presentation/src/main/java/daily/dayo/presentation/screen/search/SearchResultScreen.kt index 656bd23a..cf762965 100644 --- a/presentation/src/main/java/daily/dayo/presentation/screen/search/SearchResultScreen.kt +++ b/presentation/src/main/java/daily/dayo/presentation/screen/search/SearchResultScreen.kt @@ -99,7 +99,7 @@ import kotlinx.coroutines.launch internal fun SearchResultRoute( searchKeyword: String, onBackClick: () -> Unit, - onPostClick: (String) -> Unit, + onPostClick: (Long) -> Unit, onClickProfile: (String) -> Unit, searchViewModel: SearchViewModel = hiltViewModel(), followViewModel: FollowViewModel = hiltViewModel(), @@ -177,7 +177,7 @@ internal fun SearchResultRoutePreview() { fun SearchResultScreen( searchKeyword: String, onBackClick: () -> Unit, - onPostClick: (String) -> Unit, + onPostClick: (Long) -> Unit, searchKeywordResultsTag: LazyPagingItems?, searchKeywordResultsTagTotalCount: Int, searchKeywordResultsUser: LazyPagingItems?, @@ -377,7 +377,7 @@ fun SearchResultsCount(resultCount: Int = 0) { @Composable fun SearchResultTagView( searchKeywordResultsTag: LazyPagingItems?, - onPostClick: (String) -> Unit + onPostClick: (Long) -> Unit ) { val imageInteractionSource = remember { MutableInteractionSource() } Box( @@ -408,7 +408,7 @@ fun SearchResultTagView( .clickableSingle( interactionSource = imageInteractionSource, indication = null, - onClick = { onPostClick(post.postId.toString()) } + onClick = { onPostClick(post.postId) } ) ) } diff --git a/presentation/src/main/java/daily/dayo/presentation/screen/write/WriteFolderScreen.kt b/presentation/src/main/java/daily/dayo/presentation/screen/write/WriteFolderScreen.kt index af0f874f..9ef54bbf 100644 --- a/presentation/src/main/java/daily/dayo/presentation/screen/write/WriteFolderScreen.kt +++ b/presentation/src/main/java/daily/dayo/presentation/screen/write/WriteFolderScreen.kt @@ -42,6 +42,7 @@ import androidx.lifecycle.compose.collectAsStateWithLifecycle import coil.size.Size import daily.dayo.domain.model.Folder import daily.dayo.domain.model.Privacy +import daily.dayo.presentation.BuildConfig import daily.dayo.presentation.R import daily.dayo.presentation.common.extension.clickableSingle import daily.dayo.presentation.common.extension.limitTo @@ -83,6 +84,7 @@ fun WriteFolderRoute( } WriteFolderScreen( + showCreateFolder = (folders.data?.size ?: 0) < MAX_FOLDER_COUNT, onBackClick = onBackClick, onFolderClick = { folderId, folderName -> writeViewModel.setFolderId(folderId) @@ -98,11 +100,12 @@ fun WriteFolderRoute( @Composable fun WriteFolderScreen( + showCreateFolder: Boolean, onBackClick: () -> Unit, - onFolderClick: (String, String) -> Unit, + onFolderClick: (Long, String) -> Unit, navigateToCreateNewFolder: () -> Unit, folders: List, - currentFolderId: String?, + currentFolderId: Long?, ) { Surface( color = White_FFFFFF, @@ -115,6 +118,7 @@ fun WriteFolderScreen( onBackClick = onBackClick ) WriteFolderContent( + showCreateFolder = showCreateFolder, onFolderClick = onFolderClick, navigateToCreateNewFolder = navigateToCreateNewFolder, folders = folders, @@ -141,20 +145,20 @@ fun WriteFolderActionbarLayout(onBackClick: () -> Unit) { } } -@Preview @Composable fun WriteFolderContent( - onFolderClick: (String, String) -> Unit = { _, _ -> }, + showCreateFolder: Boolean, + onFolderClick: (Long, String) -> Unit = { _, _ -> }, navigateToCreateNewFolder: () -> Unit = {}, folders: List = emptyList(), - currentFolderId: String? = null, + currentFolderId: Long? = null, ) { Column( modifier = Modifier .fillMaxSize() .padding(horizontal = 18.dp) ) { - if (folders.size < MAX_FOLDER_COUNT) { + if (showCreateFolder) { WriteFolderNewLayout( navigateToCreateNewFolder = navigateToCreateNewFolder ) @@ -211,9 +215,9 @@ fun WriteFolderNewLayout( @Composable fun WriteFoldersLayout( - onFolderClick: (String, String) -> Unit, + onFolderClick: (Long, String) -> Unit, folders: List, - currentFolderId: String?, + currentFolderId: Long?, ) { LazyColumn( modifier = Modifier.fillMaxSize(), @@ -222,7 +226,7 @@ fun WriteFoldersLayout( itemsIndexed(folders) { _, folder -> WriteFolderItemLayout( folder = folder, - isSelected = folder.folderId?.toString() == currentFolderId, + isSelected = folder.folderId == currentFolderId, onFolderClick = onFolderClick ) } @@ -243,7 +247,7 @@ fun WriteFolderItemLayout( postCount = 1 ), isSelected: Boolean = true, - onFolderClick: (String, String) -> Unit = { _, _ -> }, + onFolderClick: (Long, String) -> Unit = { _, _ -> }, ) { Row( modifier = Modifier @@ -251,7 +255,7 @@ fun WriteFolderItemLayout( .height(FOLDER_THUMBNAIL_SIZE.dp) .clip(RoundedCornerShape(FOLDER_THUMBNAIL_RADIUS_SIZE.dp)) .background(White_FFFFFF) - .clickableSingle { onFolderClick(folder.folderId.toString(), folder.title) } + .clickableSingle { folder.folderId?.let { onFolderClick(it, folder.title) } } ) { Box( modifier = Modifier @@ -259,7 +263,7 @@ fun WriteFolderItemLayout( ) { RoundImageView( context = LocalContext.current, - imageUrl = folder.thumbnailImage, + imageUrl = "${BuildConfig.BASE_URL}/images/${folder.thumbnailImage}", modifier = Modifier.size(FOLDER_THUMBNAIL_SIZE.dp), imageSize = Size(FOLDER_THUMBNAIL_SIZE, FOLDER_THUMBNAIL_SIZE), roundSize = FOLDER_THUMBNAIL_RADIUS_SIZE.dp, diff --git a/presentation/src/main/java/daily/dayo/presentation/screen/write/WriteScreen.kt b/presentation/src/main/java/daily/dayo/presentation/screen/write/WriteScreen.kt index bf1c201a..3e9e7cd5 100644 --- a/presentation/src/main/java/daily/dayo/presentation/screen/write/WriteScreen.kt +++ b/presentation/src/main/java/daily/dayo/presentation/screen/write/WriteScreen.kt @@ -267,7 +267,7 @@ fun WriteScreen( navigateToTag: () -> Unit, tags: List = emptyList(), navigateToFolder: () -> Unit, - folderId: String? = null, + folderId: Long? = null, folderName: String? = null, uploadSuccess: Status? = null, ) { @@ -674,7 +674,7 @@ fun WriteTagLayout( @Preview @Composable fun WriteFolderLayout( - folderId: String? = null, + folderId: Long? = null, folderName: String? = null, navigateToFolder: () -> Unit = {} ) { diff --git a/presentation/src/main/java/daily/dayo/presentation/service/firebase/FirebaseMessagingService.kt b/presentation/src/main/java/daily/dayo/presentation/service/firebase/FirebaseMessagingService.kt index 9c33d6f5..707e7f33 100644 --- a/presentation/src/main/java/daily/dayo/presentation/service/firebase/FirebaseMessagingService.kt +++ b/presentation/src/main/java/daily/dayo/presentation/service/firebase/FirebaseMessagingService.kt @@ -30,7 +30,7 @@ class FirebaseMessagingService : FirebaseMessagingService() { super.onMessageReceived(remoteMessage) if (remoteMessage.data.isNotEmpty()) { val body = remoteMessage.data["body"] - val postId = remoteMessage.data["postId"] + val postId = remoteMessage.data["postId"]?.toLong() val memberId = remoteMessage.data["memberId"] sendNotification(body = body, postId = postId, memberId = memberId) } else if (remoteMessage.notification != null) { @@ -39,7 +39,7 @@ class FirebaseMessagingService : FirebaseMessagingService() { } } - private fun sendNotification(body: String?, postId: String?, memberId: String?) { + private fun sendNotification(body: String?, postId: Long?, memberId: String?) { val id = System.currentTimeMillis().toInt() // notification 클릭 시 이동하는 액티비티 diff --git a/presentation/src/main/java/daily/dayo/presentation/view/DetailPostView.kt b/presentation/src/main/java/daily/dayo/presentation/view/DetailPostView.kt index 7f34565e..826692cb 100644 --- a/presentation/src/main/java/daily/dayo/presentation/view/DetailPostView.kt +++ b/presentation/src/main/java/daily/dayo/presentation/view/DetailPostView.kt @@ -65,20 +65,20 @@ import java.time.format.DateTimeFormatter @Composable fun DetailPostView( - postId: String, + postId: Long, post: PostDetail, commentCount: Int, currentMemberId: String?, snackBarHostState: SnackbarHostState, onClickProfile: (String) -> Unit, onClickPost: () -> Unit, - onPostModifyClick: (String) -> Unit, - onPostDeleteClick: (String) -> Unit, + onPostModifyClick: (Long) -> Unit, + onPostDeleteClick: (Long) -> Unit, onClickLikePost: () -> Unit, onClickComment: () -> Unit, onClickBookmark: () -> Unit, onClickReport: (String) -> Unit, - onPostLikeUsersClick: (String) -> Unit, + onPostLikeUsersClick: (Long) -> Unit, onPostHashtagClick: (String) -> Unit, modifier: Modifier = Modifier ) { @@ -324,7 +324,7 @@ fun DetailPostView( private fun PreviewDetailPostView() { DayoTheme { DetailPostView( - postId = "0", + postId = 0L, post = DEFAULT_POST, commentCount = 0, currentMemberId = "", diff --git a/presentation/src/main/java/daily/dayo/presentation/view/DropdownMenu.kt b/presentation/src/main/java/daily/dayo/presentation/view/DropdownMenu.kt index 1b481df5..87fa20e0 100644 --- a/presentation/src/main/java/daily/dayo/presentation/view/DropdownMenu.kt +++ b/presentation/src/main/java/daily/dayo/presentation/view/DropdownMenu.kt @@ -22,7 +22,7 @@ import daily.dayo.presentation.theme.DayoTheme import daily.dayo.presentation.theme.Red_FF4545 @Composable -fun MyPostDropdownMenu(postId: String, expanded: Boolean, onDismissRequest: () -> Unit, onPostModifyClick: (String) -> Unit, onPostDeleteClick: (String) -> Unit) { +fun MyPostDropdownMenu(postId: Long, expanded: Boolean, onDismissRequest: () -> Unit, onPostModifyClick: (Long) -> Unit, onPostDeleteClick: (Long) -> Unit) { DayoTheme(shapes = DayoTheme.shapes.copy(extraSmall = RoundedCornerShape(16.dp))) { DropdownMenu( expanded = expanded, diff --git a/presentation/src/main/java/daily/dayo/presentation/view/FeedPostView.kt b/presentation/src/main/java/daily/dayo/presentation/view/FeedPostView.kt index f6a6091b..c8d21852 100644 --- a/presentation/src/main/java/daily/dayo/presentation/view/FeedPostView.kt +++ b/presentation/src/main/java/daily/dayo/presentation/view/FeedPostView.kt @@ -90,7 +90,7 @@ fun FeedPostView( onClickPost: () -> Unit, onClickLikePost: () -> Unit, onClickBookmark: () -> Unit, - onPostLikeUsersClick: (String) -> Unit, + onPostLikeUsersClick: (Long) -> Unit, onPostHashtagClick: (String) -> Unit, bottomSheetState: ModalBottomSheetState, bottomSheetContent: (@Composable () -> Unit) -> Unit, @@ -102,7 +102,7 @@ fun FeedPostView( val coroutineScope = rememberCoroutineScope() val context = LocalContext.current - val onClickComment: (Int) -> Unit = { postId -> + val onClickComment: (Long) -> Unit = { postId -> coroutineScope.launch { bottomSheetState.show() } bottomSheetContent { CommentBottomSheetDialog( @@ -269,7 +269,7 @@ fun FeedPostView( .clickableSingle( indication = rememberRipple(bounded = false), interactionSource = remember { MutableInteractionSource() }, - onClick = { onClickComment(post.postId!!) } + onClick = { post.postId?.let { onClickComment(it) } } ), contentDescription = "comment", ) @@ -304,7 +304,7 @@ fun FeedPostView( Text(text = stringResource(id = R.string.post_like_count_message_1), style = DayoTheme.typography.caption1.copy(Gray2_767B83)) Text(text = " ${dec.format(post.heartCount)} ", style = DayoTheme.typography.caption1, - modifier = if (post.heartCount != 0) Modifier.clickableSingle { onPostLikeUsersClick(post.postId.toString()) } else Modifier, + modifier = if (post.heartCount != 0) Modifier.clickableSingle { post.postId?.let { onPostLikeUsersClick(it) } } else Modifier, color = if (post.heartCount != 0) Primary_23C882 else Gray4_C5CAD2) Text(text = stringResource(id = R.string.post_like_count_message_2), style = DayoTheme.typography.caption1.copy(Gray2_767B83)) } @@ -341,10 +341,12 @@ fun FeedPostView( PostReportDialog( onClickCancel = { showDialog = !showDialog }, onClickConfirm = { reason -> - reportViewModel.requestSavePostReport(reason, post.postId!!) - showDialog = !showDialog - coroutineScope.launch { - snackBarHostState.showSnackbar(context.getString(R.string.report_comment_alert_message)) + post.postId?.let { postId -> + reportViewModel.requestSavePostReport(reason, postId) + showDialog = !showDialog + coroutineScope.launch { + snackBarHostState.showSnackbar(context.getString(R.string.report_comment_alert_message)) + } } } ) diff --git a/presentation/src/main/java/daily/dayo/presentation/view/FolderView.kt b/presentation/src/main/java/daily/dayo/presentation/view/FolderView.kt index c956f04b..d49cce7e 100644 --- a/presentation/src/main/java/daily/dayo/presentation/view/FolderView.kt +++ b/presentation/src/main/java/daily/dayo/presentation/view/FolderView.kt @@ -35,7 +35,7 @@ import java.text.DecimalFormat @Composable fun FolderView( folder: Folder, - onClickFolder: (String) -> Unit, + onClickFolder: (Long) -> Unit, modifier: Modifier = Modifier, ) { val imageInteractionSource = remember { MutableInteractionSource() } @@ -43,7 +43,7 @@ fun FolderView( .clickableSingle( interactionSource = imageInteractionSource, indication = null, - onClick = { onClickFolder("${folder.folderId}") } + onClick = { folder.folderId?.let { onClickFolder(it) } } ) ) { Box( diff --git a/presentation/src/main/java/daily/dayo/presentation/view/dialog/CommentBottomSheetDialog.kt b/presentation/src/main/java/daily/dayo/presentation/view/dialog/CommentBottomSheetDialog.kt index 62de135e..1460167e 100644 --- a/presentation/src/main/java/daily/dayo/presentation/view/dialog/CommentBottomSheetDialog.kt +++ b/presentation/src/main/java/daily/dayo/presentation/view/dialog/CommentBottomSheetDialog.kt @@ -62,7 +62,7 @@ import kotlinx.coroutines.launch @OptIn(ExperimentalMaterialApi::class) @Composable fun CommentBottomSheetDialog( - postId: Int, + postId: Long, sheetState: ModalBottomSheetState, snackBarHostState: SnackbarHostState, onClickProfile: (String) -> Unit, diff --git a/presentation/src/main/java/daily/dayo/presentation/viewmodel/BookmarkViewModel.kt b/presentation/src/main/java/daily/dayo/presentation/viewmodel/BookmarkViewModel.kt index 53639f07..0db8b2a2 100644 --- a/presentation/src/main/java/daily/dayo/presentation/viewmodel/BookmarkViewModel.kt +++ b/presentation/src/main/java/daily/dayo/presentation/viewmodel/BookmarkViewModel.kt @@ -38,7 +38,7 @@ class BookmarkViewModel @Inject constructor( _uiState.update { it.copy(isEditMode = !it.isEditMode, selectedBookmarks = emptySet()) } } - fun toggleSelection(postId: Int) { + fun toggleSelection(postId: Long) { _uiState.update { val currentSelection = it.selectedBookmarks val newSelection = if (currentSelection.contains(postId)) { @@ -88,5 +88,5 @@ data class BookmarkUiState( val count: Int = 0, val bookmarks: Flow> = flow { emit(PagingData.empty()) }, val isEditMode: Boolean = false, - val selectedBookmarks: Set = emptySet() + val selectedBookmarks: Set = emptySet() ) \ No newline at end of file diff --git a/presentation/src/main/java/daily/dayo/presentation/viewmodel/FolderViewModel.kt b/presentation/src/main/java/daily/dayo/presentation/viewmodel/FolderViewModel.kt index c83f5435..665bd561 100644 --- a/presentation/src/main/java/daily/dayo/presentation/viewmodel/FolderViewModel.kt +++ b/presentation/src/main/java/daily/dayo/presentation/viewmodel/FolderViewModel.kt @@ -10,6 +10,7 @@ import androidx.paging.cachedIn import dagger.hilt.android.lifecycle.HiltViewModel import daily.dayo.domain.model.Folder import daily.dayo.domain.model.FolderInfo +import daily.dayo.domain.model.FolderOrder import daily.dayo.domain.model.FolderPost import daily.dayo.domain.model.NetworkResponse import daily.dayo.domain.model.Privacy @@ -19,10 +20,9 @@ import daily.dayo.domain.usecase.folder.RequestCreateFolderUseCase import daily.dayo.domain.usecase.folder.RequestDeleteFolderUseCase import daily.dayo.domain.usecase.folder.RequestEditFolderUseCase import daily.dayo.domain.usecase.folder.RequestFolderInfoUseCase +import daily.dayo.domain.usecase.folder.RequestFolderMoveUseCase import daily.dayo.domain.usecase.folder.RequestFolderPostListUseCase -import daily.dayo.domain.usecase.folder.RequestOrderFolderUseCase import daily.dayo.domain.usecase.post.RequestDeletePostUseCase -import daily.dayo.presentation.common.Event import daily.dayo.presentation.common.Resource import kotlinx.coroutines.async import kotlinx.coroutines.awaitAll @@ -43,12 +43,12 @@ class FolderViewModel @Inject constructor( private val requestCreateFolderUseCase: RequestCreateFolderUseCase, private val requestEditFolderUseCase: RequestEditFolderUseCase, private val requestDeleteFolderUseCase: RequestDeleteFolderUseCase, - private val requestOrderFolderUseCase: RequestOrderFolderUseCase, private val requestAllMyFolderListUseCase: RequestAllMyFolderListUseCase, private val requestUserFolderListUseCase: RequestAllFolderListUseCase, private val requestFolderInfoUseCase: RequestFolderInfoUseCase, private val requestFolderPostListUseCase: RequestFolderPostListUseCase, - private val requestDeletePostUseCase: RequestDeletePostUseCase + private val requestDeletePostUseCase: RequestDeletePostUseCase, + private val requestFolderMoveUseCase: RequestFolderMoveUseCase ) : ViewModel() { private val _uiState = MutableStateFlow(FolderUiState()) @@ -72,14 +72,11 @@ class FolderViewModel @Inject constructor( private val _folderList = MutableLiveData>>() val folderList: LiveData>> get() = _folderList - private val _orderFolderSuccess = MutableLiveData>() - val orderFolderSuccess: LiveData> get() = _orderFolderSuccess - fun toggleEditMode() { _uiState.update { it.copy(isEditMode = !it.isEditMode, selectedPosts = emptySet()) } } - fun toggleSelection(postId: Int) { + fun toggleSelection(postId: Long) { _uiState.update { val currentSelection = it.selectedPosts val newSelection = if (currentSelection.contains(postId)) { @@ -91,6 +88,15 @@ class FolderViewModel @Inject constructor( } } + fun toggleFolderOrder(folderId: Long) { + val newOrder = when (_uiState.value.folderOrder) { + FolderOrder.NEW -> FolderOrder.OLD + FolderOrder.OLD -> FolderOrder.NEW + } + _uiState.update { it.copy(folderOrder = newOrder) } + requestFolderPostList(folderId) + } + fun deletePosts() { viewModelScope.launch { try { @@ -131,7 +137,7 @@ class FolderViewModel @Inject constructor( } } - fun requestEditFolder(folderId: Int, name: String, subheading: String, privacy: Privacy) { + fun requestEditFolder(folderId: Long, name: String, subheading: String, privacy: Privacy) { viewModelScope.launch { requestEditFolderUseCase( folderId = folderId, @@ -149,7 +155,7 @@ class FolderViewModel @Inject constructor( } } - fun requestDeleteFolder(folderId: Int) { + fun requestDeleteFolder(folderId: Long) { viewModelScope.launch { requestDeleteFolderUseCase(folderId = folderId).let { response -> when (response) { @@ -208,7 +214,7 @@ class FolderViewModel @Inject constructor( } } - fun requestFolderInfo(folderId: Int) { + fun requestFolderInfo(folderId: Long) { viewModelScope.launch { val result = when (val response = requestFolderInfoUseCase(folderId)) { is NetworkResponse.Success -> response.body ?: DEFAULT_FOLDER_INFO @@ -221,9 +227,9 @@ class FolderViewModel @Inject constructor( } } - fun requestFolderPostList(folderId: Int) { + fun requestFolderPostList(folderId: Long) { viewModelScope.launch { - val folderPosts = requestFolderPostListUseCase(folderId) + val folderPosts = requestFolderPostListUseCase(folderId, _uiState.value.folderOrder) .cachedIn(viewModelScope) _uiState.update { @@ -232,10 +238,17 @@ class FolderViewModel @Inject constructor( } } - fun moveSelectedPost() { + fun moveSelectedPost(targetFolderId: Long) { viewModelScope.launch { - // TODO API 필요 - _postMoveSuccess.emit(true) + requestFolderMoveUseCase( + postIdList = uiState.value.selectedPosts.map { it.toLong() }, + targetFolderId = targetFolderId + ).let { response -> + when (response) { + is NetworkResponse.Success -> _postMoveSuccess.emit(true) + else -> _postMoveSuccess.emit(false) + } + } } } } @@ -243,8 +256,9 @@ class FolderViewModel @Inject constructor( data class FolderUiState( val folderInfo: FolderInfo = DEFAULT_FOLDER_INFO, val folderPosts: Flow> = flow { emit(PagingData.empty()) }, + val folderOrder: FolderOrder = FolderOrder.NEW, val isEditMode: Boolean = false, - val selectedPosts: Set = emptySet() + val selectedPosts: Set = emptySet() ) val DEFAULT_FOLDER_INFO = FolderInfo( diff --git a/presentation/src/main/java/daily/dayo/presentation/viewmodel/HomeViewModel.kt b/presentation/src/main/java/daily/dayo/presentation/viewmodel/HomeViewModel.kt index 69dc2378..dd0ab3e9 100644 --- a/presentation/src/main/java/daily/dayo/presentation/viewmodel/HomeViewModel.kt +++ b/presentation/src/main/java/daily/dayo/presentation/viewmodel/HomeViewModel.kt @@ -191,7 +191,7 @@ class HomeViewModel @Inject constructor( } } - fun requestLikePost(postId: Int, isDayoPickLike: Boolean) = + fun requestLikePost(postId: Long, isDayoPickLike: Boolean) = viewModelScope.launch(Dispatchers.IO) { val editList = if (isDayoPickLike) _dayoPickPostList else _newPostList requestLikePostUseCase(postId = postId).let { ApiResponse -> @@ -220,7 +220,7 @@ class HomeViewModel @Inject constructor( } } - fun requestUnlikePost(postId: Int, isDayoPickLike: Boolean) = + fun requestUnlikePost(postId: Long, isDayoPickLike: Boolean) = viewModelScope.launch(Dispatchers.IO) { val editList = if (isDayoPickLike) _dayoPickPostList else _newPostList requestUnlikePostUseCase(postId = postId).let { ApiResponse -> @@ -250,7 +250,7 @@ class HomeViewModel @Inject constructor( } fun setPostStatus( - postId: Int, + postId: Long, isLike: Boolean? = null, heartCount: Int? = null, commentCount: Int? = null diff --git a/presentation/src/main/java/daily/dayo/presentation/viewmodel/PostViewModel.kt b/presentation/src/main/java/daily/dayo/presentation/viewmodel/PostViewModel.kt index dd64a2ca..107e7d8f 100644 --- a/presentation/src/main/java/daily/dayo/presentation/viewmodel/PostViewModel.kt +++ b/presentation/src/main/java/daily/dayo/presentation/viewmodel/PostViewModel.kt @@ -86,7 +86,7 @@ class PostViewModel @Inject constructor( _postComments.postValue(Resource.loading(null)) } - fun requestPostDetail(postId: Int) { + fun requestPostDetail(postId: Long) { viewModelScope.launch { _postDetail.postValue(Resource.loading(null)) requestPostDetailUseCase(postId).let { response -> @@ -112,7 +112,7 @@ class PostViewModel @Inject constructor( } } - fun requestDeletePost(postId: Int) { + fun requestDeletePost(postId: Long) { viewModelScope.launch { requestDeletePostUseCase(postId).let { response -> when (response) { @@ -123,7 +123,7 @@ class PostViewModel @Inject constructor( } } - fun toggleLikePost(postId: Int, currentHeart: Boolean) { + fun toggleLikePost(postId: Long, currentHeart: Boolean) { viewModelScope.launch { if (currentHeart) { requestUnlikePostUseCase(postId = postId) @@ -158,7 +158,7 @@ class PostViewModel @Inject constructor( } } - fun toggleBookmarkPostDetail(postId: Int, currentBookmark: Boolean?) { + fun toggleBookmarkPostDetail(postId: Long, currentBookmark: Boolean?) { viewModelScope.launch { currentBookmark?.let { bookmark -> if (bookmark) { @@ -194,7 +194,7 @@ class PostViewModel @Inject constructor( } } - fun requestPostComment(postId: Int) { + fun requestPostComment(postId: Long) { viewModelScope.launch { _postComments.postValue(Resource.loading(null)) requestPostCommentUseCase(postId).let { response -> @@ -238,7 +238,7 @@ class PostViewModel @Inject constructor( } } - fun requestCreatePostComment(contents: String, postId: Int, mentionedUser: List) { + fun requestCreatePostComment(contents: String, postId: Long, mentionedUser: List) { if (contents.isEmpty()) return viewModelScope.launch { val mentionList = getMentionList(contents, mentionedUser) @@ -256,7 +256,7 @@ class PostViewModel @Inject constructor( } } - fun requestCreatePostCommentReply(reply: Pair, contents: String, postId: Int, mentionedUser: List) { + fun requestCreatePostCommentReply(reply: Pair, contents: String, postId: Long, mentionedUser: List) { if (contents.isEmpty()) return viewModelScope.launch { val mentionList = getMentionList(contents, mentionedUser).toMutableList() @@ -304,7 +304,7 @@ class PostViewModel @Inject constructor( } } - fun requestPostLikeUsers(postId: Int) = viewModelScope.launch(Dispatchers.IO) { + fun requestPostLikeUsers(postId: Long) = viewModelScope.launch(Dispatchers.IO) { requestPostLikeUsersUseCase(postId = postId) .cachedIn(viewModelScope) .collectLatest { _postLikeUsers.emit(it) } diff --git a/presentation/src/main/java/daily/dayo/presentation/viewmodel/ReportViewModel.kt b/presentation/src/main/java/daily/dayo/presentation/viewmodel/ReportViewModel.kt index d4cbf8c9..db81cae6 100644 --- a/presentation/src/main/java/daily/dayo/presentation/viewmodel/ReportViewModel.kt +++ b/presentation/src/main/java/daily/dayo/presentation/viewmodel/ReportViewModel.kt @@ -37,7 +37,7 @@ class ReportViewModel @Inject constructor( } } - fun requestSavePostReport(comment: String, postId: Int) = viewModelScope.launch { + fun requestSavePostReport(comment: String, postId: Long) = viewModelScope.launch { requestSavePostReportUseCase(comment = comment, postId = postId)?.let { ApiResponse -> when (ApiResponse) { is NetworkResponse.Success -> { _reportPostSuccess.postValue(true) } diff --git a/presentation/src/main/java/daily/dayo/presentation/viewmodel/WriteViewModel.kt b/presentation/src/main/java/daily/dayo/presentation/viewmodel/WriteViewModel.kt index 4b4f6a5f..0114f119 100644 --- a/presentation/src/main/java/daily/dayo/presentation/viewmodel/WriteViewModel.kt +++ b/presentation/src/main/java/daily/dayo/presentation/viewmodel/WriteViewModel.kt @@ -10,12 +10,8 @@ import androidx.lifecycle.LiveData import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope -import daily.dayo.presentation.BuildConfig -import daily.dayo.presentation.common.Event -import daily.dayo.presentation.common.image.ImageResizeUtil.cropCenterBitmap -import daily.dayo.presentation.common.ListLiveData -import daily.dayo.presentation.common.Resource -import daily.dayo.presentation.common.toFile +import dagger.hilt.android.lifecycle.HiltViewModel +import dagger.hilt.android.qualifiers.ApplicationContext import daily.dayo.domain.model.Category import daily.dayo.domain.model.Folder import daily.dayo.domain.model.NetworkResponse @@ -26,10 +22,14 @@ import daily.dayo.domain.usecase.folder.RequestCreateFolderInPostUseCase import daily.dayo.domain.usecase.post.RequestEditPostUseCase import daily.dayo.domain.usecase.post.RequestPostDetailUseCase import daily.dayo.domain.usecase.post.RequestUploadPostUseCase -import dagger.hilt.android.lifecycle.HiltViewModel -import dagger.hilt.android.qualifiers.ApplicationContext +import daily.dayo.presentation.BuildConfig +import daily.dayo.presentation.common.Event +import daily.dayo.presentation.common.ListLiveData +import daily.dayo.presentation.common.Resource import daily.dayo.presentation.common.Status +import daily.dayo.presentation.common.image.ImageResizeUtil.cropCenterBitmap import daily.dayo.presentation.common.image.ImageResizeUtil.resizeBitmap +import daily.dayo.presentation.common.toFile import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.asStateFlow @@ -58,7 +58,7 @@ class WriteViewModel @Inject constructor( val showWriteOptionDialog = MutableLiveData>() // WriteInfo - private val _postId = MutableLiveData(0) + private val _postId = MutableLiveData(0L) val postId get() = _postId private val _postCategory = MutableLiveData(null) val postCategory get() = _postCategory @@ -68,11 +68,11 @@ class WriteViewModel @Inject constructor( val postContents get() = _postContents private val _writeText = MutableStateFlow("") val writeText get() = _writeText - private val _postFolderId = MutableLiveData("") + private val _postFolderId = MutableLiveData(0L) val postFolderId get() = _postFolderId private val _postFolderName = MutableLiveData("") val postFolderName get() = _postFolderName - private val _writeFolderId = MutableStateFlow(null as String?) + private val _writeFolderId = MutableStateFlow(null) val writeFolderId get() = _writeFolderId private val _writeFolderName = MutableStateFlow(null as String?) val writeFolderName get() = _writeFolderName @@ -88,8 +88,8 @@ class WriteViewModel @Inject constructor( val writeTags get() = _writeTags // WritePost - private val _writePostId = MutableLiveData>() - val writePostId: LiveData> get() = _writePostId + private val _writePostId = MutableLiveData>() + val writePostId: LiveData> get() = _writePostId private val _writeSuccess = MutableLiveData>() val writeSuccess: LiveData> get() = _writeSuccess private val _uploadSuccess: MutableStateFlow = MutableStateFlow(null) @@ -108,7 +108,7 @@ class WriteViewModel @Inject constructor( val writeFolderAddSuccess get() = _writeFolderAddSuccess fun requestUploadPost() { - if (this@WriteViewModel.postId.value != 0) { + if (this@WriteViewModel.postId.value != 0L) { requestUploadEditingPost() } else { requestUploadNewPost() @@ -134,7 +134,7 @@ class WriteViewModel @Inject constructor( category = writeCategory.value.first!!, contents = writeText.value, files = it.toTypedArray(), - folderId = writeFolderId.value?.toIntOrNull() ?: 0, + folderId = writeFolderId.value ?: 0L, tags = if (writeTags.value.isNotEmpty()) writeTags.value.toTypedArray() else emptyArray() ).let { ApiResponse -> when (ApiResponse) { @@ -158,7 +158,7 @@ class WriteViewModel @Inject constructor( postId = this@WriteViewModel.postId.value!!, category = if (writeCategory.value.first != null) writeCategory.value.first!! else this@WriteViewModel.postCategory.value!!, contents = this@WriteViewModel.postContents.value!!, - folderId = if (!writeFolderId.value.isNullOrEmpty()) writeFolderId.value!!.toInt() else this@WriteViewModel.postFolderId.value!!.toInt(), + folderId = if (writeFolderId.value != null) writeFolderId.value!! else this@WriteViewModel.postFolderId.value!!, hashtags = if (writeTags.value.isNotEmpty()) writeTags.value else this@WriteViewModel.postTagList.value!!.toList() ).let { ApiResponse -> _writeEditSuccess.postValue(Event(ApiResponse is NetworkResponse.Success)) @@ -168,7 +168,7 @@ class WriteViewModel @Inject constructor( } } - fun requestPostDetail(postId: Int) = viewModelScope.launch(Dispatchers.IO) { + fun requestPostDetail(postId: Long) = viewModelScope.launch(Dispatchers.IO) { withContext(Dispatchers.Main) { resetWriteInfoValue() requestPostDetailUseCase(postId = postId) @@ -197,9 +197,9 @@ class WriteViewModel @Inject constructor( postDetail.hashtags.let { _postTagList.addAll(it, false) } postDetail.hashtags.let { _writeTags.emit(it) } - _postFolderId.postValue(postDetail.folderId.toString()) + _postFolderId.postValue(postDetail.folderId) _postFolderName.postValue(postDetail.folderName) - _writeFolderId.emit(postDetail.folderId.toString()) + _writeFolderId.emit(postDetail.folderId) _writeFolderName.emit(postDetail.folderName) } @@ -247,9 +247,9 @@ class WriteViewModel @Inject constructor( fun resetWriteInfoValue() = viewModelScope.launch { _postId.postValue(0) _postContents.postValue("") - _postFolderId.postValue("") + _postFolderId.postValue(0) _postFolderName.postValue("") - _writeFolderId.emit("") + _writeFolderId.emit(0) _writeFolderName.emit("") _postImageUriList.postValue(arrayListOf()) _postTagList.clear(notify = false) @@ -259,7 +259,7 @@ class WriteViewModel @Inject constructor( } } - fun setPostId(id: Int) { + fun setPostId(id: Long) { _postId.value = id } @@ -276,7 +276,7 @@ class WriteViewModel @Inject constructor( _writeCategory.emit(category) } - fun setFolderId(id: String) = viewModelScope.launch { + fun setFolderId(id: Long) = viewModelScope.launch { _postFolderId.value = id _writeFolderId.emit(id) }