From 5d3fc3b362b2afa4122474c67dd0f81be0bef371 Mon Sep 17 00:00:00 2001 From: posite Date: Tue, 20 Feb 2024 01:12:13 +0900 Subject: [PATCH 1/3] =?UTF-8?q?feat:=20=EB=82=B4=EA=B0=80=20=EC=9E=91?= =?UTF-8?q?=EC=84=B1=ED=95=9C=20=EA=B8=80=20API=20=EC=97=B0=EB=8F=99=20?= =?UTF-8?q?=EC=99=84=EB=A3=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/umc/ttoklip/data/api/MyPostApi.kt | 9 +- .../ttoklip/data/model/mypage/Community.kt | 7 +- .../ttoklip/data/model/mypage/CommunityX.kt | 8 +- .../umc/ttoklip/data/model/mypage/HoneyTip.kt | 9 +- .../data/model/mypage/MyQuestionResponse.kt | 2 +- .../repository/mypage/MyPostRepository.kt | 8 +- .../repository/mypage/MyPostRepositoryImpl.kt | 16 +-- .../honeytip/adapter/HoneyTipListRVA.kt | 7 +- .../presentation/mypage/MyHoneyTipActivity.kt | 133 ++++++++++++++++-- .../mypage/vm/MyHoneyTipViewModel.kt | 116 +++++++++++++++ 10 files changed, 278 insertions(+), 37 deletions(-) create mode 100644 app/src/main/java/com/umc/ttoklip/presentation/mypage/vm/MyHoneyTipViewModel.kt diff --git a/app/src/main/java/com/umc/ttoklip/data/api/MyPostApi.kt b/app/src/main/java/com/umc/ttoklip/data/api/MyPostApi.kt index ea6106a7..594344a6 100644 --- a/app/src/main/java/com/umc/ttoklip/data/api/MyPostApi.kt +++ b/app/src/main/java/com/umc/ttoklip/data/api/MyPostApi.kt @@ -7,18 +7,19 @@ import com.umc.ttoklip.data.model.mypage.MyQuestionResponse import com.umc.ttoklip.data.model.mypage.MyTogetherResponse import retrofit2.Response import retrofit2.http.GET +import retrofit2.http.Query interface MyPostApi { @GET("/api/v1/my-page/question") - suspend fun getMyQuestions(): Response> + suspend fun getMyQuestions(@Query("page") page: Int): Response> @GET("/api/v1/my-page/participate-deals") - suspend fun getMyTogethers(): Response> + suspend fun getMyTogethers(@Query("page") page: Int): Response> @GET("/api/v1/my-page/honeytip") - suspend fun getMyHoneyTips(): Response> + suspend fun getMyHoneyTips(@Query("page") page: Int): Response> @GET("/api/v1/my-page/community") - suspend fun getMyCommunications(): Response> + suspend fun getMyCommunications(@Query("page") page: Int): Response> } \ No newline at end of file diff --git a/app/src/main/java/com/umc/ttoklip/data/model/mypage/Community.kt b/app/src/main/java/com/umc/ttoklip/data/model/mypage/Community.kt index 64fbf4bd..6668a46c 100644 --- a/app/src/main/java/com/umc/ttoklip/data/model/mypage/Community.kt +++ b/app/src/main/java/com/umc/ttoklip/data/model/mypage/Community.kt @@ -2,6 +2,9 @@ package com.umc.ttoklip.data.model.mypage data class Community( val content: String, - val questionId: Long, - val title: String + val id: Int, + val title: String, + val writer: String, + val category: String, + val commentCount: Int ) \ No newline at end of file diff --git a/app/src/main/java/com/umc/ttoklip/data/model/mypage/CommunityX.kt b/app/src/main/java/com/umc/ttoklip/data/model/mypage/CommunityX.kt index d8b2e1c3..239ce9fa 100644 --- a/app/src/main/java/com/umc/ttoklip/data/model/mypage/CommunityX.kt +++ b/app/src/main/java/com/umc/ttoklip/data/model/mypage/CommunityX.kt @@ -1,7 +1,11 @@ package com.umc.ttoklip.data.model.mypage data class CommunityX( - val communityId: Long, + val id: Int, val content: String, - val title: String + val title: String, + val writer: String, + val commentCount: Int, + val likeCount: Int, + val scrapCount: Int ) \ No newline at end of file diff --git a/app/src/main/java/com/umc/ttoklip/data/model/mypage/HoneyTip.kt b/app/src/main/java/com/umc/ttoklip/data/model/mypage/HoneyTip.kt index 4cfa63d7..02549c13 100644 --- a/app/src/main/java/com/umc/ttoklip/data/model/mypage/HoneyTip.kt +++ b/app/src/main/java/com/umc/ttoklip/data/model/mypage/HoneyTip.kt @@ -2,6 +2,11 @@ package com.umc.ttoklip.data.model.mypage data class HoneyTip( val content: String, - val honeyTipId: Long, - val title: String + val id: Int, + val title: String, + val category: String, + val writer: String, + val likeCount: Int, + val scrapCount: Int, + val commentCount: Int ) \ No newline at end of file diff --git a/app/src/main/java/com/umc/ttoklip/data/model/mypage/MyQuestionResponse.kt b/app/src/main/java/com/umc/ttoklip/data/model/mypage/MyQuestionResponse.kt index f1148b85..6ae59b5d 100644 --- a/app/src/main/java/com/umc/ttoklip/data/model/mypage/MyQuestionResponse.kt +++ b/app/src/main/java/com/umc/ttoklip/data/model/mypage/MyQuestionResponse.kt @@ -1,7 +1,7 @@ package com.umc.ttoklip.data.model.mypage data class MyQuestionResponse( - val communities: List, + val questions: List, val isFirst: Boolean, val isLast: Boolean, val totalElements: Int, diff --git a/app/src/main/java/com/umc/ttoklip/data/repository/mypage/MyPostRepository.kt b/app/src/main/java/com/umc/ttoklip/data/repository/mypage/MyPostRepository.kt index 3817e100..5f7b811a 100644 --- a/app/src/main/java/com/umc/ttoklip/data/repository/mypage/MyPostRepository.kt +++ b/app/src/main/java/com/umc/ttoklip/data/repository/mypage/MyPostRepository.kt @@ -7,8 +7,8 @@ import com.umc.ttoklip.data.model.mypage.MyTogetherResponse import com.umc.ttoklip.module.NetworkResult interface MyPostRepository { - suspend fun getBMyQuestions(): NetworkResult - suspend fun getMyTogethers(): NetworkResult - suspend fun getMyHoneyTips(): NetworkResult - suspend fun getMyCommunications(): NetworkResult + suspend fun getMyQuestions(page: Int): NetworkResult + suspend fun getMyTogethers(page: Int): NetworkResult + suspend fun getMyHoneyTips(page: Int): NetworkResult + suspend fun getMyCommunications(page: Int): NetworkResult } \ No newline at end of file diff --git a/app/src/main/java/com/umc/ttoklip/data/repository/mypage/MyPostRepositoryImpl.kt b/app/src/main/java/com/umc/ttoklip/data/repository/mypage/MyPostRepositoryImpl.kt index 4c19c078..96f71e73 100644 --- a/app/src/main/java/com/umc/ttoklip/data/repository/mypage/MyPostRepositoryImpl.kt +++ b/app/src/main/java/com/umc/ttoklip/data/repository/mypage/MyPostRepositoryImpl.kt @@ -11,19 +11,19 @@ import com.umc.ttoklip.module.handleApi import javax.inject.Inject class MyPostRepositoryImpl @Inject constructor(private val api: MyPostApi) : MyPostRepository { - override suspend fun getBMyQuestions(): NetworkResult { - return handleApi({ api.getMyQuestions() }) { response: ResponseBody -> response.result } + override suspend fun getMyQuestions(page: Int): NetworkResult { + return handleApi({ api.getMyQuestions(page) }) { response: ResponseBody -> response.result } } - override suspend fun getMyTogethers(): NetworkResult { - return handleApi({ api.getMyTogethers() }) { response: ResponseBody -> response.result } + override suspend fun getMyTogethers(page: Int): NetworkResult { + return handleApi({ api.getMyTogethers(page) }) { response: ResponseBody -> response.result } } - override suspend fun getMyHoneyTips(): NetworkResult { - return handleApi({ api.getMyHoneyTips() }) { response: ResponseBody -> response.result } + override suspend fun getMyHoneyTips(page: Int): NetworkResult { + return handleApi({ api.getMyHoneyTips(page) }) { response: ResponseBody -> response.result } } - override suspend fun getMyCommunications(): NetworkResult { - return handleApi({ api.getMyCommunications() }) { response: ResponseBody -> response.result } + override suspend fun getMyCommunications(page: Int): NetworkResult { + return handleApi({ api.getMyCommunications(page) }) { response: ResponseBody -> response.result } } } \ No newline at end of file diff --git a/app/src/main/java/com/umc/ttoklip/presentation/honeytip/adapter/HoneyTipListRVA.kt b/app/src/main/java/com/umc/ttoklip/presentation/honeytip/adapter/HoneyTipListRVA.kt index 369c2cf1..c788742e 100644 --- a/app/src/main/java/com/umc/ttoklip/presentation/honeytip/adapter/HoneyTipListRVA.kt +++ b/app/src/main/java/com/umc/ttoklip/presentation/honeytip/adapter/HoneyTipListRVA.kt @@ -11,7 +11,6 @@ import com.umc.ttoklip.databinding.ItemListHoneyTipBinding import java.io.Serializable import java.text.SimpleDateFormat import java.util.Date -import kotlin.String class HoneyTipListRVA(private var listener: OnItemClickListener) : ListAdapter(object : @@ -51,7 +50,11 @@ class HoneyTipListRVA(private var listener: OnItemClickListener) : fun bind(honeyTip: HoneyTipMain) { binding.titleTv.text = honeyTip.title binding.writerTv.text = honeyTip.writer - binding.dateTv.text = calculateDate(honeyTip.writtenTime) + binding.dateTv.text = if (honeyTip.writtenTime.isNotBlank()) { + calculateDate(honeyTip.writtenTime) + } else { + "" + } binding.bodyTv.text = honeyTip.content binding.commentCountTv.text = honeyTip.commentCount.toString() binding.likeCountTv.text = honeyTip.likeCount.toString() diff --git a/app/src/main/java/com/umc/ttoklip/presentation/mypage/MyHoneyTipActivity.kt b/app/src/main/java/com/umc/ttoklip/presentation/mypage/MyHoneyTipActivity.kt index d4c42a6c..2c2633aa 100644 --- a/app/src/main/java/com/umc/ttoklip/presentation/mypage/MyHoneyTipActivity.kt +++ b/app/src/main/java/com/umc/ttoklip/presentation/mypage/MyHoneyTipActivity.kt @@ -1,30 +1,36 @@ package com.umc.ttoklip.presentation.mypage +import android.content.Intent +import android.view.View +import android.widget.AdapterView import androidx.activity.viewModels +import androidx.lifecycle.lifecycleScope import androidx.recyclerview.widget.DividerItemDecoration import androidx.recyclerview.widget.LinearLayoutManager import com.umc.ttoklip.R import com.umc.ttoklip.data.model.honeytip.HoneyTipMain import com.umc.ttoklip.databinding.ActivityMyHoneyTipBinding import com.umc.ttoklip.presentation.base.BaseActivity +import com.umc.ttoklip.presentation.hometown.ReadCommunicationActivity import com.umc.ttoklip.presentation.honeytip.adapter.HoneyTipListRVA import com.umc.ttoklip.presentation.honeytip.adapter.OnItemClickListener -import com.umc.ttoklip.presentation.mypage.vm.ScrapViewModel -import com.umc.ttoklip.presentation.search.SearchViewModel -import com.umc.ttoklip.presentation.search.SearchViewModelImpl +import com.umc.ttoklip.presentation.mypage.vm.MyHoneyTipViewModel import dagger.hilt.android.AndroidEntryPoint +import kotlinx.coroutines.launch @AndroidEntryPoint class MyHoneyTipActivity : BaseActivity(R.layout.activity_my_honey_tip), OnItemClickListener { - private val viewModel: ScrapViewModel by viewModels() + private val viewModel: MyHoneyTipViewModel by viewModels() + private val adapter by lazy { + HoneyTipListRVA(this) + } override fun initView() { val sortFilters = listOf( - getString(R.string.sort_most_recent), - getString(R.string.sort_popularity), - getString(R.string.sort_most_comments), - getString(R.string.sort_most_scrap) + "꿀팁 공유", + "질문해요", + "소통해요" ) binding.honeyTipFilterSpinner.adapter = SortSpinnerAdapter(this, sortFilters) @@ -43,8 +49,7 @@ class MyHoneyTipActivity : BaseActivity(R.layout.acti HoneyTips("똑똑이", "음식물 쓰레기 냄새 방지!!", "집에 가끔씩이지만 나타나는 바퀴벌레, 잘못 처리하면 알깐다고도...", "1일전", 0), HoneyTips("똑똑이", "음식물 쓰레기 냄새 방지!!", "집에 가끔씩이지만 나타나는 바퀴벌레, 잘못 처리하면 알깐다고도...", "1일전", 0), )*/ - val honeyTipList = mutableListOf() - val adapter = HoneyTipListRVA(this) + binding.myHoneyTipRv.layoutManager = LinearLayoutManager(this) binding.myHoneyTipRv.adapter = adapter binding.myHoneyTipRv.addItemDecoration( @@ -53,14 +58,95 @@ class MyHoneyTipActivity : BaseActivity(R.layout.acti DividerItemDecoration.VERTICAL ) ) - adapter.submitList(honeyTipList) + + binding.honeyTipFilterSpinner.onItemSelectedListener = + object : AdapterView.OnItemSelectedListener { + override fun onItemSelected(p0: AdapterView<*>?, p1: View?, p2: Int, p3: Long) { + + viewModel.reset() + + when (binding.honeyTipFilterSpinner.selectedItem.toString()) { + "소통해요" -> { + viewModel.getMyComms() + } + + "꿀팁 공유" -> { + viewModel.getMyHoneyTips() + } + + "질문해요" -> { + viewModel.getMyQuestions() + } + + else -> {} + } + } + + override fun onNothingSelected(p0: AdapterView<*>?) { + + } + } binding.myHoneyTipBackBtn.setOnClickListener { onBackPressedDispatcher.onBackPressed() } } - override fun initObserver() = Unit + override fun initObserver() { + with(lifecycleScope) { + launch { + viewModel.honeyTipList.collect { + adapter.submitList(it.map { tips -> + HoneyTipMain( + tips.id, + tips.title, + tips.content, + tips.writer, + tips.likeCount, + tips.commentCount, + tips.scrapCount, + "" + ) + }) + } + } + + launch { + viewModel.commsList.collect { + adapter.submitList(it.map { comms -> + HoneyTipMain( + comms.id, + comms.title, + comms.content, + comms.writer, + comms.likeCount, + comms.commentCount, + comms.scrapCount, + "" + ) + }) + } + } + + launch { + viewModel.questionList.collect { + adapter.submitList(it.map { question -> + HoneyTipMain( + question.id, + question.title, + question.content, + question.writer, + 0, + question.commentCount, + 0, + "" + ) + }) + } + } + + } + } /*override fun onClick(honeyTips: HoneyTips) { @@ -69,6 +155,29 @@ class MyHoneyTipActivity : BaseActivity(R.layout.acti }*/ override fun onClick(honeyTip: HoneyTipMain) { + when (binding.honeyTipFilterSpinner.selectedItem.toString()) { + "소통해요" -> { + val intent = Intent(this, ReadCommunicationActivity::class.java) + intent.putExtra("postId", honeyTip.id) + startActivity(intent) + } + "꿀팁 공유" -> { +// val intent = Intent(this, HoneyTipActivity::class.java) +// intent.putExtra("postId", honeyTip.id) +// startActivity(intent) + } + + "질문해요" -> { + /* + val intent = Intent(this, HoneyTips::class.java) + intent.putExtra("postId", honeyTip.id) + startActivity(intent) + + */ + } + + else -> {} + } } } \ No newline at end of file diff --git a/app/src/main/java/com/umc/ttoklip/presentation/mypage/vm/MyHoneyTipViewModel.kt b/app/src/main/java/com/umc/ttoklip/presentation/mypage/vm/MyHoneyTipViewModel.kt new file mode 100644 index 00000000..7d9a5cd6 --- /dev/null +++ b/app/src/main/java/com/umc/ttoklip/presentation/mypage/vm/MyHoneyTipViewModel.kt @@ -0,0 +1,116 @@ +package com.umc.ttoklip.presentation.mypage.vm + +import android.util.Log +import androidx.lifecycle.ViewModel +import androidx.lifecycle.viewModelScope +import com.umc.ttoklip.data.model.mypage.Community +import com.umc.ttoklip.data.model.mypage.CommunityX +import com.umc.ttoklip.data.model.mypage.HoneyTip +import com.umc.ttoklip.data.repository.mypage.MyPostRepository +import com.umc.ttoklip.module.onException +import com.umc.ttoklip.module.onFail +import com.umc.ttoklip.module.onSuccess +import dagger.hilt.android.lifecycle.HiltViewModel +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.StateFlow +import kotlinx.coroutines.launch +import javax.inject.Inject + +@HiltViewModel +class MyHoneyTipViewModel @Inject constructor(private val repository: MyPostRepository) : + ViewModel() { + private val isEnd = MutableStateFlow(false) + private val page = MutableStateFlow(0) + + private val _questionList = MutableStateFlow(listOf()) + val questionList: StateFlow> + get() = _questionList + + private val _honeyTipList = MutableStateFlow(listOf()) + val honeyTipList: StateFlow> + get() = _honeyTipList + + private val _commsList = MutableStateFlow(listOf()) + val commsList: StateFlow> + get() = _commsList + + + fun getMyComms() { + if (!isEnd.value) { + viewModelScope.launch { + try { + repository.getMyCommunications( + page = page.value + ).onSuccess { + _commsList.emit(commsList.value + it.communities) + page.value = page.value + 1 + isEnd.value = it.isLast + }.onFail { + + }.onException { + throw it + } + } catch (e: Exception) { + e.printStackTrace() + Log.d("예외", "$e") + } + } + } + } + + fun getMyHoneyTips() { + if (!isEnd.value) { + viewModelScope.launch { + try { + repository.getMyHoneyTips( + page = page.value + ).onSuccess { + _honeyTipList.emit(honeyTipList.value + it.honeyTips) + page.value = page.value + 1 + isEnd.value = it.isLast + }.onFail { + + }.onException { + throw it + } + } catch (e: Exception) { + e.printStackTrace() + Log.d("예외", "$e") + } + } + } + } + + fun getMyQuestions() { + if (!isEnd.value) { + viewModelScope.launch { + try { + repository.getMyQuestions( + page = page.value + ).onSuccess { + _questionList.emit(questionList.value + it.questions) + page.value = page.value + 1 + isEnd.value = it.isLast + }.onFail { + + }.onException { + throw it + } + } catch (e: Exception) { + e.printStackTrace() + Log.d("예외", "$e") + } + } + } + } + + fun reset() { + viewModelScope.launch { + _honeyTipList.emit(listOf()) + _commsList.emit(listOf()) + _questionList.emit(listOf()) + isEnd.value = false + page.value = 0 + } + } +} \ No newline at end of file From 63a9add991186970d7c25fc48be23c5d85be0fd1 Mon Sep 17 00:00:00 2001 From: posite Date: Tue, 20 Feb 2024 01:25:50 +0900 Subject: [PATCH 2/3] =?UTF-8?q?feat:=20=EC=9E=91=EC=84=B1=ED=95=9C=20?= =?UTF-8?q?=EA=B8=80=EB=A1=9C=20=ED=99=94=EB=A9=B4=20=EC=A0=84=ED=99=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../presentation/mypage/MyHoneyTipActivity.kt | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/app/src/main/java/com/umc/ttoklip/presentation/mypage/MyHoneyTipActivity.kt b/app/src/main/java/com/umc/ttoklip/presentation/mypage/MyHoneyTipActivity.kt index 2c2633aa..c435f4e1 100644 --- a/app/src/main/java/com/umc/ttoklip/presentation/mypage/MyHoneyTipActivity.kt +++ b/app/src/main/java/com/umc/ttoklip/presentation/mypage/MyHoneyTipActivity.kt @@ -14,6 +14,8 @@ import com.umc.ttoklip.presentation.base.BaseActivity import com.umc.ttoklip.presentation.hometown.ReadCommunicationActivity import com.umc.ttoklip.presentation.honeytip.adapter.HoneyTipListRVA import com.umc.ttoklip.presentation.honeytip.adapter.OnItemClickListener +import com.umc.ttoklip.presentation.honeytip.read.ReadHoneyTipActivity +import com.umc.ttoklip.presentation.honeytip.read.ReadQuestionActivity import com.umc.ttoklip.presentation.mypage.vm.MyHoneyTipViewModel import dagger.hilt.android.AndroidEntryPoint import kotlinx.coroutines.launch @@ -163,18 +165,15 @@ class MyHoneyTipActivity : BaseActivity(R.layout.acti } "꿀팁 공유" -> { -// val intent = Intent(this, HoneyTipActivity::class.java) -// intent.putExtra("postId", honeyTip.id) -// startActivity(intent) + val intent = Intent(this, ReadHoneyTipActivity::class.java) + intent.putExtra("postId", honeyTip.id) + startActivity(intent) } "질문해요" -> { - /* - val intent = Intent(this, HoneyTips::class.java) + val intent = Intent(this, ReadQuestionActivity::class.java) intent.putExtra("postId", honeyTip.id) startActivity(intent) - - */ } else -> {} From 49f9123d46622bf6cc92bc57ae1d013e6e609638 Mon Sep 17 00:00:00 2001 From: posite Date: Tue, 20 Feb 2024 01:45:45 +0900 Subject: [PATCH 3/3] =?UTF-8?q?fix:=20postId=20=EC=98=A4=EB=A5=98=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/umc/ttoklip/presentation/mypage/MyHoneyTipActivity.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/com/umc/ttoklip/presentation/mypage/MyHoneyTipActivity.kt b/app/src/main/java/com/umc/ttoklip/presentation/mypage/MyHoneyTipActivity.kt index c435f4e1..af14fabd 100644 --- a/app/src/main/java/com/umc/ttoklip/presentation/mypage/MyHoneyTipActivity.kt +++ b/app/src/main/java/com/umc/ttoklip/presentation/mypage/MyHoneyTipActivity.kt @@ -160,7 +160,7 @@ class MyHoneyTipActivity : BaseActivity(R.layout.acti when (binding.honeyTipFilterSpinner.selectedItem.toString()) { "소통해요" -> { val intent = Intent(this, ReadCommunicationActivity::class.java) - intent.putExtra("postId", honeyTip.id) + intent.putExtra("postId", honeyTip.id.toLong()) startActivity(intent) }