Skip to content

Commit

Permalink
🛠️ 감정 분석 재요청 버튼 추가, 일기 작성 수정 (#81)
Browse files Browse the repository at this point in the history
* [feat] 홈 화면 뒤로가기 막기

* [refactoring] 일기 감정 텍스트 응답 수정

* [refactoring] accessToken usecase임시 삭제

* [feat] accessToken usecase 추가

* [feat] 초기 달력화면 먼저 그리기

* [feat] 일기 작성 후 달력 갱신

* Squashed commit of the following:

commit eae536e
Author: MunJangHun <[email protected]>
Date:   Tue Aug 13 05:43:55 2024 +0900

    🛠️ 일기 보기 | 일기 선택 캘린더 디자인 수정 (#80)

    * [feat] Add Assets | 표정 없는 고양이

    * [feat] 감정에 따른 Title 수정

    * [fix] 캘린더 Week Text 안보이는 문제 수정

    * [feat] 안내 텍스트 추가

    * [feat] Update Constants | DateFormat

    * [feat] Update SelectDiary | 갱신 기능

commit 82823d0
Author: MunJangHun <[email protected]>
Date:   Tue Aug 13 01:28:09 2024 +0900

    💬 대화하기 | 기본 프로필 이미지 추가 (#78)

    * [feat] 챗봇 기본 프로필 이미지 추가

    * [fix] isLoading 초기화 픽스
  • Loading branch information
HamBeomJoon authored Aug 12, 2024
1 parent eae536e commit a117758
Show file tree
Hide file tree
Showing 12 changed files with 143 additions and 78 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -181,23 +181,27 @@ class DiaryRepositoryImpl @Inject constructor(
}

override suspend fun deleteDiary(accessToken: String, id: Int): Result<DeleteDiaryMsg> {
val result = diaryRemoteDataSource.deleteDiary(accessToken, id)
return try {
val result = diaryRemoteDataSource.deleteDiary(accessToken, id)

return if (result.isSuccess) {
val res = result.getOrNull()
if (res != null) {
val data = res.data
if (data != null) {
val msg = DeleteDiaryMsg(data.message)
Result.success(msg)
if (result.isSuccess) {
val res = result.getOrNull()
if (res != null) {
val data = res.data
if (data != null) {
val msg = DeleteDiaryMsg(data.message)
Result.success(msg)
} else {
Result.failure(Exception("Delete Diary Failed: data is null"))
}
} else {
Result.failure(Exception("Delete Diary Failed: data is null"))
Result.failure(Exception("Delete Diary Failed: response body is null"))
}
} else {
Result.failure(Exception("Delete Diary Failed: response body is null"))
Result.failure(result.exceptionOrNull() ?: Exception("Unknown error"))
}
} else {
Result.failure(result.exceptionOrNull() ?: Exception("Unknown error"))
} catch (e: Exception) {
Result.failure(e)
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package com.nabi.domain.extension

fun String.parseEmotionState(): String {
// ' ' 사이의 감정 텍스트만 뽑아서 return
val regex = """'([^']*)'""".toRegex()
val matchResult = regex.find(this)
return matchResult?.groups?.get(1)?.value ?: ""
}

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -7,28 +7,12 @@ import com.nabi.domain.model.diary.DiarySelectInfo
import java.util.Calendar

class AddDiaryMonthCalendarStateAdapter(fa: FragmentActivity) : FragmentStateAdapter(fa) {
private lateinit var onDateSelectedListener: OnDateSelectedListener
override fun getItemCount(): Int = Int.MAX_VALUE

override fun createFragment(position: Int): Fragment {
val calendar = Calendar.getInstance().apply {
add(Calendar.MONTH, position - (Int.MAX_VALUE / 2))
}
val fragment = AddDiaryMonthFragment.newInstance(calendar.time).apply {
setOnDateSelectedListener(object : AddDiaryMonthFragment.OnDateSelectedListener {
override fun onDateSelected(item: DiarySelectInfo) {
onDateSelectedListener.onDateSelected(item)
}
})
}
return fragment
}

fun setOnDateSelectedListener(onDateSelectedListener: OnDateSelectedListener) {
this.onDateSelectedListener = onDateSelectedListener
}

interface OnDateSelectedListener {
fun onDateSelected(item: DiarySelectInfo)
return AddDiaryMonthFragment.newInstance(calendar.time)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,18 +2,23 @@ package com.nabi.nabi.views.diary.add

import android.os.Bundle
import androidx.fragment.app.activityViewModels
import androidx.fragment.app.setFragmentResultListener
import androidx.fragment.app.viewModels
import androidx.lifecycle.lifecycleScope
import androidx.recyclerview.widget.GridLayoutManager
import com.nabi.domain.model.diary.DiarySelectInfo
import com.nabi.nabi.R
import com.nabi.nabi.base.BaseFragment
import com.nabi.nabi.databinding.FragmentAddDiaryMonthBinding
import com.nabi.nabi.utils.Constants.dateEnglishOnlyYearFormat
import com.nabi.nabi.utils.Constants.dateKoreanFormat
import com.nabi.nabi.utils.Constants.dateNumberOnlyMonthFormat
import com.nabi.nabi.utils.LoggerUtils
import com.nabi.nabi.utils.UiState
import com.nabi.nabi.views.OnRvItemClickListener
import dagger.hilt.android.AndroidEntryPoint
import kotlinx.coroutines.delay
import kotlinx.coroutines.launch
import java.text.SimpleDateFormat
import java.util.Calendar
import java.util.Date
Expand All @@ -28,8 +33,6 @@ class AddDiaryMonthFragment :
private lateinit var dayAdapter: AddDiaryCalendarAdapter

private lateinit var date: Date

private var onDateSelectedListener: OnDateSelectedListener? = null
private var diaryDates: Set<String> = emptySet()
private var isClickable = true

Expand All @@ -53,12 +56,14 @@ class AddDiaryMonthFragment :
}

private fun setupRecyclerView() {
val diaryDays = getDaysInMonth(date)

dayAdapter = AddDiaryCalendarAdapter().apply {
setRvItemClickListener( object : OnRvItemClickListener<DiarySelectInfo>{
setRvItemClickListener(object : OnRvItemClickListener<DiarySelectInfo> {
override fun onClick(item: DiarySelectInfo) {
sharedDateViewModel.changeSelectedDate(item.diaryEntryDate)
isClickable = !diaryDates.contains(item.diaryEntryDate)
onDateSelectedListener?.onDateSelected(item)
sharedDateViewModel.changeDateInfo(item)
}
})
}
Expand All @@ -68,6 +73,14 @@ class AddDiaryMonthFragment :
adapter = dayAdapter
itemAnimator = null
}
dayAdapter.setList(
matchDiaryEntriesWithDays(
List<DiarySelectInfo?>(diaryDays.size) { null },
diaryDays,
year = dateEnglishOnlyYearFormat.format(date.time).toInt(),
month = dateNumberOnlyMonthFormat.format(date.time).toInt()
)
)
}

private fun loadDiaryData() {
Expand Down Expand Up @@ -124,10 +137,15 @@ class AddDiaryMonthFragment :
val dateFormat = SimpleDateFormat("yyyy-MM-dd", Locale.ENGLISH)
val todayDate = dateFormat.format(Calendar.getInstance().time)

if (todayDate == dateString) {
matchedDiaryInfo.isSelected = true
if (sharedDateViewModel.date.value != null) {
if (sharedDateViewModel.date.value!!.diaryEntryDate == dateString) {
matchedDiaryInfo.isSelected = true
}
} else {
if (todayDate == dateString) {
matchedDiaryInfo.isSelected = true
}
}

result.add(dateString to matchedDiaryInfo)
}
}
Expand Down Expand Up @@ -170,12 +188,4 @@ class AddDiaryMonthFragment :
updatedList.find { it.first == selectedDate }?.second?.isSelected = true
dayAdapter.setList(updatedList)
}

fun setOnDateSelectedListener(listener: OnDateSelectedListener) {
this.onDateSelectedListener = listener
}

interface OnDateSelectedListener {
fun onDateSelected(item: DiarySelectInfo)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@ class AddDiarySelectDateFragment :

private lateinit var calendarAdapter: AddDiaryMonthCalendarStateAdapter

private var lastVisibleDate: Calendar? = null
private var diaryDates: Set<String> = emptySet()
private lateinit var selectedDate: DiarySelectInfo
private var tempDiary: DiaryDbEntity? = null
Expand All @@ -43,6 +44,19 @@ class AddDiarySelectDateFragment :
override fun onResume() {
super.onResume()
updateDisplayedDate()

lastVisibleDate = getCurrentVisibleDate()
lastVisibleDate?.let { date ->
val position = calculatePositionFromDate(date)
calendarAdapter = AddDiaryMonthCalendarStateAdapter(requireActivity())
binding.vpCalendarMonth.adapter = calendarAdapter
binding.vpCalendarMonth.setCurrentItem(position, false)
updateCurrentMonthText(position)
} ?: run {
updateCurrentMonthText(binding.vpCalendarMonth.currentItem)
}

updateSelectedDate(selectedDate.diaryEntryDate)
}

override fun initView() {
Expand All @@ -55,18 +69,7 @@ class AddDiarySelectDateFragment :
}

selectedDate = DiarySelectInfo(false, sharedViewModel.selectedDate.value!!, true)
LoggerUtils.d(selectedDate.toString())

calendarAdapter = AddDiaryMonthCalendarStateAdapter(requireActivity()).apply {
setOnDateSelectedListener(object :
AddDiaryMonthCalendarStateAdapter.OnDateSelectedListener {
override fun onDateSelected(item: DiarySelectInfo) {
selectedDate = item
updateSelectedDate(item.diaryEntryDate)
}
})
}

calendarAdapter = AddDiaryMonthCalendarStateAdapter(requireActivity())
binding.apply {
vpCalendarMonth.adapter = calendarAdapter
vpCalendarMonth.setCurrentItem(Int.MAX_VALUE / 2, false)
Expand Down Expand Up @@ -99,6 +102,13 @@ class AddDiarySelectDateFragment :
else -> Unit
}
}

sharedViewModel.date.observe(viewLifecycleOwner) {
if (it != null) {
selectedDate = it
updateSelectedDate(it.diaryEntryDate)
}
}
}

private fun updateDisplayedDate() {
Expand Down Expand Up @@ -237,4 +247,19 @@ class AddDiarySelectDateFragment :
binding.tvSelectYear.text = calendar.get(Calendar.YEAR).toString()
binding.tvSelectMonth.text = dateEnglishOnlyMonthFormat.format(calendar.time)
}

private fun getCurrentVisibleDate(): Calendar {
val calendar = Calendar.getInstance().apply {
add(Calendar.MONTH, binding.vpCalendarMonth.currentItem - (Int.MAX_VALUE / 2))
}
return calendar
}

private fun calculatePositionFromDate(date: Calendar): Int {
val today = Calendar.getInstance()
val currentMonthPosition = Int.MAX_VALUE / 2
val differenceInMonths = (date.get(Calendar.YEAR) - today.get(Calendar.YEAR)) * 12 +
(date.get(Calendar.MONTH) - today.get(Calendar.MONTH))
return currentMonthPosition + differenceInMonths
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ import androidx.fragment.app.DialogFragment
import androidx.fragment.app.viewModels
import com.nabi.nabi.R
import com.nabi.nabi.databinding.DialogAddDiaryDoneBinding
import com.nabi.nabi.utils.LoggerUtils
import com.nabi.nabi.utils.UiState
import com.nabi.nabi.views.MainActivity
import com.nabi.nabi.views.diary.detail.DetailDiaryFragment
Expand Down Expand Up @@ -46,6 +47,10 @@ class EmotionLoadingDialog(private val isEdit: Boolean, private val diaryId: Int
is UiState.Loading -> {}
is UiState.Failure -> {
showToast("일기 감정분석 실패")
(requireActivity() as MainActivity).replaceFragment(
DetailDiaryFragment(diaryId),
false
)
}

is UiState.Success -> {
Expand All @@ -64,7 +69,6 @@ class EmotionLoadingDialog(private val isEdit: Boolean, private val diaryId: Int
}

is UiState.Success -> {
// emotionLoadingDialog.dismiss()
if (isEdit) {
requireActivity().supportFragmentManager.popBackStack()
} else {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package com.nabi.nabi.views.diary.add

import android.util.Log
import androidx.lifecycle.LiveData
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.ViewModel
Expand All @@ -9,7 +10,8 @@ import com.nabi.domain.repository.DataStoreRepository
import com.nabi.domain.usecase.datastore.GetAccessTokenUseCase
import com.nabi.domain.usecase.emotion.AddDiaryEmotionUseCase
import com.nabi.domain.usecase.emotion.GetDiaryEmotionUseCase
import com.nabi.domain.utils.EmotionStateUtils
import com.nabi.domain.extension.parseEmotionState
import com.nabi.nabi.utils.LoggerUtils
import com.nabi.nabi.utils.UiState
import dagger.hilt.android.lifecycle.HiltViewModel
import kotlinx.coroutines.launch
Expand All @@ -19,7 +21,8 @@ import javax.inject.Inject
class EmotionLoadingViewModel @Inject constructor(
private val getDiaryEmotionUseCase: GetDiaryEmotionUseCase,
private val addDiaryEmotionUseCase: AddDiaryEmotionUseCase,
private val getAccessTokenUseCase: GetAccessTokenUseCase
private val getAccessTokenUseCase: GetAccessTokenUseCase,
private val dataStoreRepository: DataStoreRepository
) : ViewModel() {

private val _getEmotionState = MutableLiveData<UiState<String>>(UiState.Loading)
Expand Down Expand Up @@ -47,10 +50,9 @@ class EmotionLoadingViewModel @Inject constructor(
_addEmotionState.value = UiState.Loading

viewModelScope.launch {
val accessToken = getAccessTokenUseCase.invoke().getOrNull().orEmpty()
val emotion = EmotionStateUtils.parseEmotionState(emotionState)
val accessToken = dataStoreRepository.getAccessToken().getOrNull().orEmpty()

addDiaryEmotionUseCase(accessToken, diaryId, emotion)
addDiaryEmotionUseCase(accessToken, diaryId, emotionState)
.onSuccess {
_addEmotionState.value = UiState.Success(it)
}.onFailure { e ->
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,16 +3,24 @@ package com.nabi.nabi.views.diary.add
import androidx.lifecycle.LiveData
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.ViewModel
import com.nabi.domain.model.diary.DiarySelectInfo

class SharedDateViewModel : ViewModel() {

private val _selectedDate = MutableLiveData("")
val selectedDate: LiveData<String> get() = _selectedDate

private val _date = MutableLiveData<DiarySelectInfo>()
val date: LiveData<DiarySelectInfo> get() = _date

fun changeSelectedDate(date: String) {
_selectedDate.value = date
}

fun changeDateInfo(newInfo: DiarySelectInfo){
_date.value = newInfo
}

fun clearData() {
_selectedDate.value = ""
}
Expand Down
Loading

0 comments on commit a117758

Please sign in to comment.