Skip to content
Merged
Show file tree
Hide file tree
Changes from 10 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -1,8 +1,10 @@
package com.konkuk.arabyte_aos.data.dataremote.datasource

import com.konkuk.arabyte_aos.data.dataremote.model.request.PostNoticeBoardLikeRequestDto
import com.konkuk.arabyte_aos.data.dataremote.model.request.PostNoticeBoardWriteRequestDto
import com.konkuk.arabyte_aos.data.dataremote.model.response.GetNoticeBoardDetailResponseDto
import com.konkuk.arabyte_aos.data.dataremote.model.response.GetNoticeBoardListResponseDto
import com.konkuk.arabyte_aos.data.dataremote.model.response.PostNoticeBoardLikeResponseDto
import retrofit2.Response

interface NoticeBoardRemoteDataSource {
Expand All @@ -20,4 +22,8 @@ interface NoticeBoardRemoteDataSource {
suspend fun postNoticeBoardWrite(
postNoticeBoardWriteRequestDto: PostNoticeBoardWriteRequestDto,
): Response<Unit>

suspend fun postNoticeBoardLike(
postNoticeBoardLikeRequestDto: PostNoticeBoardLikeRequestDto,
): Response<PostNoticeBoardLikeResponseDto>
}
Original file line number Diff line number Diff line change
@@ -1,9 +1,11 @@
package com.konkuk.arabyte_aos.data.dataremote.datasourceimpl

import com.konkuk.arabyte_aos.data.dataremote.datasource.NoticeBoardRemoteDataSource
import com.konkuk.arabyte_aos.data.dataremote.model.request.PostNoticeBoardLikeRequestDto
import com.konkuk.arabyte_aos.data.dataremote.model.request.PostNoticeBoardWriteRequestDto
import com.konkuk.arabyte_aos.data.dataremote.model.response.GetNoticeBoardDetailResponseDto
import com.konkuk.arabyte_aos.data.dataremote.model.response.GetNoticeBoardListResponseDto
import com.konkuk.arabyte_aos.data.dataremote.model.response.PostNoticeBoardLikeResponseDto
import com.konkuk.arabyte_aos.data.dataremote.service.NoticeBoardService
import retrofit2.Response
import javax.inject.Inject
Expand Down Expand Up @@ -33,4 +35,7 @@ class NoticeBoardRemoteDataSourceImpl

override suspend fun postNoticeBoardWrite(postNoticeBoardWriteRequestDto: PostNoticeBoardWriteRequestDto): Response<Unit> =
service.postNoticeBoardWrite(postNoticeBoardWriteRequestDto = postNoticeBoardWriteRequestDto)

override suspend fun postNoticeBoardLike(postNoticeBoardLikeRequestDto: PostNoticeBoardLikeRequestDto): Response<PostNoticeBoardLikeResponseDto> =
service.postNoticeBoardLike(postNoticeBoardLikeRequestDto = postNoticeBoardLikeRequestDto)
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package com.konkuk.arabyte_aos.data.dataremote.model.request

import kotlinx.serialization.Serializable

@Serializable
data class PostNoticeBoardLikeRequestDto(
val articleId: Long,
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package com.konkuk.arabyte_aos.data.dataremote.model.response

import kotlinx.serialization.Serializable

@Serializable
data class PostNoticeBoardLikeResponseDto(
val liked: Boolean,
val likeCount: Int,
)
Original file line number Diff line number Diff line change
@@ -1,9 +1,12 @@
package com.konkuk.arabyte_aos.data.dataremote.service

import com.konkuk.arabyte_aos.data.dataremote.model.request.PostNoticeBoardLikeRequestDto
import com.konkuk.arabyte_aos.data.dataremote.model.request.PostNoticeBoardWriteRequestDto
import com.konkuk.arabyte_aos.data.dataremote.model.response.GetNoticeBoardDetailResponseDto
import com.konkuk.arabyte_aos.data.dataremote.model.response.GetNoticeBoardListResponseDto
import com.konkuk.arabyte_aos.data.dataremote.model.response.PostNoticeBoardLikeResponseDto
import com.konkuk.arabyte_aos.data.util.ApiConstraints.ARTICLES
import com.konkuk.arabyte_aos.data.util.ApiConstraints.LIKE
import retrofit2.Response
import retrofit2.http.Body
import retrofit2.http.GET
Expand All @@ -29,4 +32,9 @@ interface NoticeBoardService {
suspend fun postNoticeBoardWrite(
@Body postNoticeBoardWriteRequestDto: PostNoticeBoardWriteRequestDto,
): Response<Unit>

@POST("/$ARTICLES/$LIKE")
suspend fun postNoticeBoardLike(
@Body postNoticeBoardLikeRequestDto: PostNoticeBoardLikeRequestDto,
): Response<PostNoticeBoardLikeResponseDto>
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
package com.konkuk.arabyte_aos.data.mapper.todomain

import com.konkuk.arabyte_aos.data.dataremote.model.response.PostNoticeBoardLikeResponseDto
import com.konkuk.arabyte_aos.domain.model.NoticeBoardLike

fun PostNoticeBoardLikeResponseDto.toDomain(): NoticeBoardLike =
NoticeBoardLike(
liked = this.liked,
likeCount = this.likeCount,
)
Original file line number Diff line number Diff line change
@@ -1,9 +1,12 @@
package com.konkuk.arabyte_aos.data.repositoryimpl

import com.konkuk.arabyte_aos.data.dataremote.datasource.NoticeBoardRemoteDataSource
import com.konkuk.arabyte_aos.data.dataremote.model.request.PostNoticeBoardLikeRequestDto
import com.konkuk.arabyte_aos.data.mapper.todata.toRequestDto
import com.konkuk.arabyte_aos.data.mapper.todomain.toDomain
import com.konkuk.arabyte_aos.data.mapper.todomain.toDomainModel
import com.konkuk.arabyte_aos.domain.model.NoticeBoardDetail
import com.konkuk.arabyte_aos.domain.model.NoticeBoardLike
import com.konkuk.arabyte_aos.domain.model.NoticeBoardList
import com.konkuk.arabyte_aos.domain.model.PostNoticeBoardWrite
import com.konkuk.arabyte_aos.domain.repository.NoticeBoardRepository
Expand Down Expand Up @@ -44,4 +47,12 @@ class NoticeBoardRepositoryImpl
postNoticeBoardWriteRequestDto = postNoticeBoardWrite.toRequestDto(),
)
}

override suspend fun postNoticeBoardLike(articleId: Long): Result<NoticeBoardLike> =
runCatching {
val request = PostNoticeBoardLikeRequestDto(articleId = articleId)
noticeBoardListRemoteDataSource.postNoticeBoardLike(request)
.body()?.toDomain()
?: throw IllegalStateException("Response body is null")
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ object ApiConstraints {

// Notice Board
const val ARTICLES = "articles"
const val LIKE = "like"

// Comment
const val COMMENTS = "comments"
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
package com.konkuk.arabyte_aos.domain.model

data class NoticeBoardLike(
val liked: Boolean,
val likeCount: Int,
)
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package com.konkuk.arabyte_aos.domain.repository

import com.konkuk.arabyte_aos.domain.model.NoticeBoardDetail
import com.konkuk.arabyte_aos.domain.model.NoticeBoardLike
import com.konkuk.arabyte_aos.domain.model.NoticeBoardList
import com.konkuk.arabyte_aos.domain.model.PostNoticeBoardWrite

Expand All @@ -19,4 +20,8 @@ interface NoticeBoardRepository {
suspend fun postNoticeBoardWrite(
postNoticeBoardWrite: PostNoticeBoardWrite,
): Result<Unit>

suspend fun postNoticeBoardLike(
articleId: Long,
): Result<NoticeBoardLike>
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
package com.konkuk.arabyte_aos.domain.usecase.home

import com.konkuk.arabyte_aos.domain.repository.NoticeBoardRepository
import javax.inject.Inject
import javax.inject.Singleton

@Singleton
class GetHomeNoticeBoardsUseCase
@Inject
constructor(
private val noticeBoardRepository: NoticeBoardRepository,
) {
suspend operator fun invoke() =
noticeBoardRepository.getNoticeBoardList(
articleKind = null,
page = 0,
size = 3,
sort = "createdAt,desc",
)
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
package com.konkuk.arabyte_aos.domain.usecase.home

import com.konkuk.arabyte_aos.domain.repository.ReviewsRepository
import javax.inject.Inject
import javax.inject.Singleton

@Singleton
class GetHomeReviewsUseCase
@Inject
constructor(
private val reviewsRepository: ReviewsRepository,
) {
suspend operator fun invoke() =
reviewsRepository.getReviews(
page = 0,
size = 3,
)
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
package com.konkuk.arabyte_aos.domain.usecase.noticeboard

import com.konkuk.arabyte_aos.domain.model.NoticeBoardLike
import com.konkuk.arabyte_aos.domain.repository.NoticeBoardRepository
import javax.inject.Inject
import javax.inject.Singleton

@Singleton
class PostNoticeBoardLikeUseCase
@Inject
constructor(
private val noticeBoardRepository: NoticeBoardRepository,
) {
suspend operator fun invoke(
articleId: Long,
): Result<NoticeBoardLike> {
return noticeBoardRepository.postNoticeBoardLike(
articleId = articleId,
)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -39,9 +39,9 @@ fun ArabyteLikeButton(
Row(
modifier =
modifier
.noRippleClickable { buttonClicked() }
.border(width = 1.dp, color = borderColor, shape = RoundedCornerShape(30.dp))
.roundedBackgroundWithPadding(cornerRadius = 30.dp, backgroundColor = ArabyteTheme.colors.gray01, padding = PaddingValues(vertical = 5.dp, horizontal = 11.dp))
.noRippleClickable { buttonClicked() },
.roundedBackgroundWithPadding(cornerRadius = 30.dp, backgroundColor = ArabyteTheme.colors.gray01, padding = PaddingValues(vertical = 5.dp, horizontal = 11.dp)),
verticalAlignment = Alignment.CenterVertically,
horizontalArrangement = Arrangement.Center,
) {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
package com.konkuk.arabyte_aos.presentation.ui.home

import com.konkuk.arabyte_aos.domain.model.ArabyteJobCategory
import com.konkuk.arabyte_aos.domain.model.NoticeBoardContent
import com.konkuk.arabyte_aos.domain.model.ReviewItem
import com.konkuk.arabyte_aos.presentation.type.component.ArabyteCategoryType
Expand All @@ -14,12 +13,7 @@ class HomeContract {
val loadState: LoadState = LoadState.Idle,
val userName: String = "어쩔티비",
val region: String = "서울특별시 강남구 개포2동",
val reviewList: List<ReviewItem> =
listOf(
ReviewItem(1, "스타벅스", true, 4.5f, " 처음 카페 알바를 시작한 곳인데, 교육을 친절하게 해주셔서 금방 적응할 수 있었습니다. 기본적인 음료 제조부터 계산까지 배울 수 있어서 ...!", "서울 강남구", category = ArabyteJobCategory.FOOD_BEVERAGE),
ReviewItem(2, "이마트24", false, 3.8f, " 처음 카페 알바를 시작한 곳인데, 교육을 친절하게 해주셔서 금방 적응할 수 있었습니다. 기본적인 음료 제조부터 계산까지 배울 수 있어서 ...", "서울 송파구", category = ArabyteJobCategory.DESIGN),
ReviewItem(3, "배달의민족", true, 4.2f, " 처음 카페 알바를 시작한 곳인데, 교육을 친절하게 해주셔서 금방 적응할 수 있었습니다. 기본적인 음료 제조부터 계산까지 배울 수 있어서 ...", "경기 성남시", category = ArabyteJobCategory.DELIVERY),
),
val reviewList: List<ReviewItem> = emptyList(),
val noticeBoardItem: List<NoticeBoardContent> = emptyList(),
) : UiState

Expand Down
Original file line number Diff line number Diff line change
@@ -1,13 +1,24 @@
package com.konkuk.arabyte_aos.presentation.ui.home

import androidx.lifecycle.viewModelScope
import com.konkuk.arabyte_aos.domain.model.NoticeBoardList
import com.konkuk.arabyte_aos.domain.model.ReviewList
import com.konkuk.arabyte_aos.domain.usecase.home.GetHomeNoticeBoardsUseCase
import com.konkuk.arabyte_aos.domain.usecase.home.GetHomeReviewsUseCase
import com.konkuk.arabyte_aos.presentation.util.base.BaseViewModel
import com.konkuk.arabyte_aos.presentation.util.log.DebugLog
import com.konkuk.arabyte_aos.presentation.util.view.LoadState
import dagger.hilt.android.lifecycle.HiltViewModel
import kotlinx.coroutines.launch
import javax.inject.Inject

@HiltViewModel
class HomeViewModel
@Inject
constructor() : BaseViewModel<HomeContract.HomeUiState, HomeContract.HomeSideEffect, HomeContract.HomeEvent>() {
constructor(
private val getHomeReviewsUseCase: GetHomeReviewsUseCase,
private val getHomeNoticeBoardsUseCase: GetHomeNoticeBoardsUseCase,
) : BaseViewModel<HomeContract.HomeUiState, HomeContract.HomeSideEffect, HomeContract.HomeEvent>() {
override fun createInitialState(): HomeContract.HomeUiState = HomeContract.HomeUiState()

override suspend fun handleEvent(event: HomeContract.HomeEvent) {
Expand All @@ -20,15 +31,33 @@ class HomeViewModel
}

private fun loadNoticeBoardList() {
// Todo : 서버로 부터 리스트 받아서, size 3으로
viewModelScope.launch {
val result: Result<NoticeBoardList> = getHomeNoticeBoardsUseCase()
result.onSuccess { noticeBoard ->
setState { copy(noticeBoardItem = noticeBoard.content) }
}
.onFailure { throwable ->
DebugLog.e("HomeViewModel", "불러오기 실패: ${throwable.message}")
setState { copy(loadState = LoadState.Error) }
}
}
}

private fun loadRegion() {
// Todo : 서버로 부터 지역 받기
private fun loadReviewList() {
viewModelScope.launch {
val result: Result<ReviewList> = getHomeReviewsUseCase()
result.onSuccess { review ->
setState { copy(reviewList = review.content) }
}
.onFailure { throwable ->
DebugLog.e("HomeViewModel", "불러오기 실패: ${throwable.message}")
setState { copy(loadState = LoadState.Error) }
}
}
}

private fun loadReviewList() {
// Todo : 서버로 부터 리스트 받아서, size 3으로
private fun loadRegion() {
// Todo : 서버로 부터 지역 받기
}

private fun loadUserName() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -80,14 +80,16 @@ fun HomeScreenContent(
modifier = Modifier.padding(horizontal = 20.dp),
)
Spacer(Modifier.height(11.dp))
HorizontalPager(
state = pagerState,
modifier = Modifier.wrapContentWidth(Alignment.CenterHorizontally),
) { page ->
ArabyteReviewItem(
reviewItem = uiState.reviewList[page],
modifier = Modifier.padding(horizontal = 20.dp),
)
if (uiState.reviewList.isNotEmpty()) {
HorizontalPager(
state = pagerState,
modifier = Modifier.wrapContentWidth(Alignment.CenterHorizontally),
) { page ->
ArabyteReviewItem(
reviewItem = uiState.reviewList[page],
modifier = Modifier.padding(horizontal = 20.dp),
)
}
}
Spacer(Modifier.height(11.dp))
HomePagerIndicator(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ class NoticeBoardListViewModel
getNoticeBoardListUseCase(
articleKind = noticeBoardCategoryType.toApiValue(),
page = 0,
size = 3,
size = 10,
sort = "createdAt,desc",
)
result.onSuccess { articleList ->
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@ class NoticeBoardDetailContract {
),
val commentTree: List<NoticeBoardCommentNode> = emptyList(),
val flattenCommentTree: List<FlattenComment> = emptyList(),
val replyTargetCommentId: Long? = null,
) : UiState

sealed interface NoticeBoardDetailSideEffect : UiSideEffect {
Expand All @@ -50,5 +51,9 @@ class NoticeBoardDetailContract {
data class SubmitComment(val articleId: Long) : NoticeBoardDetailEvent()

data class SetReplyTarget(val parentId: Long) : NoticeBoardDetailEvent()

data class ClickReplyButton(val parentId: Long) : NoticeBoardDetailEvent()

data class ClickLikeButton(val articleId: Long) : NoticeBoardDetailEvent()
}
}
Loading