Skip to content
Open
Show file tree
Hide file tree
Changes from all 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
Expand Up @@ -6,13 +6,14 @@ import androidx.paging.PagingConfig
import androidx.paging.PagingData
import com.tripbook.libs.network.NetworkResult
import com.tripbook.libs.network.model.request.ArticleRequest
import com.tripbook.libs.network.model.request.ReportRequest
import com.tripbook.libs.network.safeApiCall
import com.tripbook.libs.network.service.TripArticlesService
import com.tripbook.tripbook.data.datasource.ArticlePagingSource
import com.tripbook.tripbook.data.mapper.toLocationResponse
import com.tripbook.tripbook.domain.model.ArticleDetail
import com.tripbook.tripbook.domain.model.Location
import com.tripbook.tripbook.domain.model.LikeArticle
import com.tripbook.tripbook.domain.model.Location
import com.tripbook.tripbook.domain.model.SortType
import com.tripbook.tripbook.domain.repository.ArticleRepository
import kotlinx.coroutines.Dispatchers
Expand Down Expand Up @@ -73,6 +74,25 @@ class ArticleRepositoryImpl @Inject constructor(
}
}

override fun reportArticle(articleId: Long, content: String): Flow<Boolean> = safeApiCall(Dispatchers.IO) {
val reportRequest = ReportRequest(
articleId,
content
)
tripArticlesService.reportArticle(reportRequest)
}.map { response ->
when (response) {
is NetworkResult.Success -> {
response.value
true
}

else -> {
false
}
}
}

override fun saveTempArticle(
tempId: Long?,
title: String,
Expand All @@ -81,7 +101,7 @@ class ArticleRepositoryImpl @Inject constructor(
imageList: List<Int>?,
locationList: List<Location>?
): Flow<Long?> = safeApiCall(Dispatchers.IO) {
val articleResponse = ArticleRequest(
val articleRequest = ArticleRequest(
tempId,
title,
content,
Expand All @@ -91,7 +111,7 @@ class ArticleRepositoryImpl @Inject constructor(
)

tripArticlesService.tempSaveArticle(
articleResponse
articleRequest
)
}.map {
when (it) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,8 @@ package com.tripbook.tripbook.domain.repository

import androidx.paging.PagingData
import com.tripbook.tripbook.domain.model.ArticleDetail
import com.tripbook.tripbook.domain.model.Location
import com.tripbook.tripbook.domain.model.LikeArticle
import com.tripbook.tripbook.domain.model.Location
import com.tripbook.tripbook.domain.model.SortType
import kotlinx.coroutines.flow.Flow

Expand All @@ -16,6 +16,8 @@ interface ArticleRepository {
fun getArticles(word: String, sortType: SortType): Flow<PagingData<ArticleDetail>>
fun deleteArticle(articleId: Long): Flow<Boolean>

fun reportArticle(articleId: Long, content:String): Flow<Boolean>

fun saveTempArticle(
tempId: Long?,
title: String,
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
package com.tripbook.tripbook.domain.usecase

import com.tripbook.tripbook.domain.repository.ArticleRepository
import kotlinx.coroutines.flow.Flow
import javax.inject.Inject

class ArticleReportUseCase @Inject constructor(
private val repository: ArticleRepository
) {
operator fun invoke(articleId: Long, content: String): Flow<Boolean> = repository.reportArticle(articleId, content)

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
package com.tripbook.libs.network.model.request

data class ReportRequest (
val articleId: Long,
val content: String
)
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package com.tripbook.libs.network.service

import com.tripbook.libs.network.model.request.ArticleRequest
import com.tripbook.libs.network.model.request.ReportRequest
import com.tripbook.libs.network.model.response.ArticleDetailResponse
import com.tripbook.libs.network.model.response.ArticleResponse
import com.tripbook.libs.network.model.response.LikeArticleResponse
Expand Down Expand Up @@ -38,10 +39,14 @@ interface TripArticlesService {
@Path("articleId") articledId: Long
) : UnitResponse

@POST("articles/report")
suspend fun reportArticle(
@Body reportRequest: ReportRequest
) : UnitResponse

@POST("articles/temp")
suspend fun tempSaveArticle(
@Body articleResponse: ArticleRequest
@Body articleRequest: ArticleRequest
): TempArticleResponse

@POST("articles")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ package com.tripbook.tripbook.viewmodel
import androidx.lifecycle.viewModelScope
import com.tripbook.base.BaseViewModel
import com.tripbook.tripbook.domain.usecase.ArticleLikeUseCase
import com.tripbook.tripbook.domain.usecase.ArticleReportUseCase
import com.tripbook.tripbook.domain.usecase.MemberUseCase
import dagger.hilt.android.lifecycle.HiltViewModel
import kotlinx.coroutines.flow.MutableStateFlow
Expand All @@ -17,7 +18,8 @@ import javax.inject.Inject
@HiltViewModel
class ArticleViewModel @Inject constructor(
private val articleLikeUseCase : ArticleLikeUseCase,
private val memberUseCase: MemberUseCase
private val memberUseCase: MemberUseCase,
private val articleReportUseCase: ArticleReportUseCase
) : BaseViewModel() {

//좋아요 수
Expand All @@ -33,6 +35,18 @@ class ArticleViewModel @Inject constructor(
private var _author = MutableStateFlow(false)
val author: StateFlow<Boolean> get() = _author

private var _articleId = MutableStateFlow<Long>(0)

private var _reportComplete = MutableStateFlow(false)
val reportComplete: StateFlow<Boolean> get() = _reportComplete

fun setReportResult(result: Boolean){
_reportComplete.value = result
}
fun setArticleId(articleId: Long){
_articleId.value = articleId
}
fun reportArticle(content: String) = articleReportUseCase(_articleId.value, content)
fun likeArticle(articleId : Long) = articleLikeUseCase(articleId).onEach {

if (it != null) {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
package com.tripbook.tripbook.views.trip.detail

import android.widget.Toast
import androidx.fragment.app.activityViewModels
import androidx.lifecycle.lifecycleScope
import com.tripbook.base.BaseDialogFragment
import com.tripbook.tripbook.R
import com.tripbook.tripbook.databinding.FragmentReportDialogBinding
import com.tripbook.tripbook.viewmodel.ArticleViewModel
import kotlinx.coroutines.launch

class ReportFragmentDialog : BaseDialogFragment<FragmentReportDialogBinding, ArticleViewModel>(R.layout.fragment_report_dialog) {

override val viewModel: ArticleViewModel by activityViewModels()

override fun init() {
binding.viewModel = viewModel

binding.dialogClose.setOnClickListener {
dismiss()
viewModel.setReportResult(false)
}
binding.btnCancel.setOnClickListener {
dismiss()
viewModel.setReportResult(false)
}
binding.btnReport.setOnClickListener {
if (binding.reportContent.text.isEmpty()) {
Toast.makeText(requireContext(), "게시글 신고사유를 입력해주세요.", Toast.LENGTH_SHORT).show()
} else {
viewLifecycleOwner.lifecycleScope.launch {
viewModel.reportArticle(binding.reportContent.text.toString()).collect{
viewModel.setReportResult(it)
if(!it) Toast.makeText(requireContext(), "이미 신고된 게시글이거나 에러가 발생했습니다.", Toast.LENGTH_SHORT).show()
}
}
}
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ import com.tripbook.tripbook.viewmodel.TripDetailViewModel
import dagger.hilt.android.AndroidEntryPoint
import kotlinx.coroutines.launch
import javax.inject.Inject
import kotlin.math.abs

@AndroidEntryPoint
class TripDetailFragment : BaseFragment<FragmentTripDetailBinding, TripDetailViewModel>(R.layout.fragment_trip_detail) {
Expand All @@ -42,6 +43,7 @@ class TripDetailFragment : BaseFragment<FragmentTripDetailBinding, TripDetailVie
val webView = binding.mainEditor

viewModel.loadArticleDetailInfo(webView)
articleViewModel.setArticleId(args.articleId)
articleViewModel.getUserList()

viewModel.viewModelScope.launch {
Expand Down Expand Up @@ -87,6 +89,11 @@ class TripDetailFragment : BaseFragment<FragmentTripDetailBinding, TripDetailVie
findNavController().popBackStack()
}

binding.icnMainReport.setOnClickListener{
// 팝업 띄우기
ReportFragmentDialog().show(childFragmentManager, "ReportFragmentDialog")
}

with(binding) {

viewModel = this@TripDetailFragment.viewModel
Expand Down Expand Up @@ -131,7 +138,7 @@ class TripDetailFragment : BaseFragment<FragmentTripDetailBinding, TripDetailVie
icnBefore.colorFilter = null
icnDefault.colorFilter = null
icnMainReport.colorFilter = null
} else if (Math.abs(verticalOffset) >= appBarLayout.totalScrollRange) {
} else if (abs(verticalOffset) >= appBarLayout.totalScrollRange) {
toolBar.visibility = View.VISIBLE
icnBefore.setColorFilter(
ContextCompat.getColor(
Expand Down
7 changes: 7 additions & 0 deletions presentation/src/main/res/drawable/bg_edittext.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<solid android:color="@color/gray_G_1" />
<stroke android:width="1dp" android:color="@color/gray_G_10"/>
<corners android:radius="10dp" />
</shape>
7 changes: 7 additions & 0 deletions presentation/src/main/res/drawable/button_report.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle" >
<corners
android:radius="12dp" />
<solid
android:color="@color/gray_G_20"/>
</shape>
115 changes: 115 additions & 0 deletions presentation/src/main/res/layout/fragment_report_dialog.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,115 @@
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:app="http://schemas.android.com/apk/res-auto">

<data>

<import type="android.view.View" />

<variable
name="viewModel"
type="com.tripbook.tripbook.viewmodel.ArticleViewModel" />
</data>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@drawable/bg_temp_popup"
android:orientation="vertical">

<ImageView
android:id="@+id/dialog_close"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="end|center_vertical"
android:contentDescription="@null"
android:paddingHorizontal="10dp"
android:paddingTop="10dp"
android:src="@drawable/icn_cancel_24"
app:tint="@color/gray_G_30" />

<LinearLayout
android:id="@+id/report_layout"
android:layout_width="300dp"
android:layout_height="250dp"
android:layout_gravity="center"
android:orientation="vertical"
android:visibility="@{viewModel.reportComplete ? View.GONE : View.VISIBLE, default=visible}">

<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:paddingBottom="12dp"
android:text="@string/report_title"
android:textColor="@color/black"
android:textSize="14sp"
android:textStyle="bold" />

<EditText
android:id="@+id/report_content"
android:layout_width="match_parent"
android:layout_height="132dp"
android:layout_marginHorizontal="20dp"
android:background="@drawable/bg_edittext"
android:hint="@string/report_placeholder"
android:inputType="textMultiLine"
android:padding="12dp"
android:scrollHorizontally="false"
android:textSize="14sp" />

<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginHorizontal="@dimen/basic_margin"
android:layout_marginTop="10dp"
android:orientation="horizontal">

<androidx.appcompat.widget.AppCompatButton
android:id="@+id/btn_cancel"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginEnd="8dp"
android:layout_weight="1"
android:background="@drawable/button_outline_unable"
android:text="@string/report_cancel_button"
android:textColor="@color/gray_G_50"/>

<androidx.appcompat.widget.AppCompatButton
android:id="@+id/btn_report"
android:background="@drawable/button_report"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:textColor="@color/gray_G_50"
android:text="@string/report_button"
android:textSize="14sp" />
</LinearLayout>
</LinearLayout>

<LinearLayout
android:id="@+id/report_result_layout"
android:layout_width="300dp"
android:layout_height="250dp"
android:gravity="center"
android:orientation="vertical"
android:visibility="@{viewModel.reportComplete ? View.VISIBLE : View.GONE, default=gone}">

<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/report_result1"
android:textAlignment="center"
android:textColor="@color/black"
android:textStyle="bold" />

<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="10dp"
android:textColor="@color/black"
android:text="@string/report_result2"
android:textAlignment="center" />
</LinearLayout>

</LinearLayout>
</layout>
1 change: 0 additions & 1 deletion presentation/src/main/res/layout/fragment_trip_detail.xml
Original file line number Diff line number Diff line change
Expand Up @@ -78,7 +78,6 @@
app:layout_constraintStart_toEndOf="@id/icn_before"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintEnd_toEndOf="parent"
android:visibility="gone"
app:tint="@color/white" />

<ImageView
Expand Down
6 changes: 6 additions & 0 deletions presentation/src/main/res/values/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -88,4 +88,10 @@
<string name="created_asc">최신순</string>
<string name="created_desc">오래된순</string>
<string name="popularity">인기순</string>
<string name="report_title">게시글 신고사유를 입력해주세요.</string>
<string name="report_placeholder">게시글 신고사유를 입력하세요.</string>
<string name="report_cancel_button">신고 취소</string>
<string name="report_button">게시글 신고</string>
<string name="report_result1">게시글 신고 접수가\n정상적으로 처리되었습니다.</string>
<string name="report_result2">소중한 의견 감사드립니다.</string>
</resources>