feat: 마이페이지

- 상단에 최신 공지사항 추가
This commit is contained in:
2025-07-25 22:18:22 +09:00
parent 7ed5e921bd
commit 9361610647
6 changed files with 67 additions and 6 deletions

View File

@@ -254,7 +254,7 @@ class AppDI(private val context: Context, isDebugMode: Boolean) {
viewModel { FindPasswordViewModel(get()) } viewModel { FindPasswordViewModel(get()) }
viewModel { MainViewModel(get(), get(), get(), get(), get()) } viewModel { MainViewModel(get(), get(), get(), get(), get()) }
viewModel { LiveViewModel(get(), get(), get(), get(), get()) } viewModel { LiveViewModel(get(), get(), get(), get(), get()) }
viewModel { MyPageViewModel(get(), get()) } viewModel { MyPageViewModel(get(), get(), get()) }
viewModel { CanStatusViewModel(get()) } viewModel { CanStatusViewModel(get()) }
viewModel { CanChargePgViewModel(get()) } viewModel { CanChargePgViewModel(get()) }
viewModel { CanPaymentViewModel(get()) } viewModel { CanPaymentViewModel(get()) }

View File

@@ -42,6 +42,7 @@ import kr.co.vividnext.sodalive.mypage.service_center.ServiceCenterActivity
import kr.co.vividnext.sodalive.settings.SettingsActivity import kr.co.vividnext.sodalive.settings.SettingsActivity
import kr.co.vividnext.sodalive.settings.event.EventActivity import kr.co.vividnext.sodalive.settings.event.EventActivity
import kr.co.vividnext.sodalive.settings.notice.NoticeActivity import kr.co.vividnext.sodalive.settings.notice.NoticeActivity
import kr.co.vividnext.sodalive.settings.notice.NoticeDetailActivity
import kr.co.vividnext.sodalive.splash.SplashActivity import kr.co.vividnext.sodalive.splash.SplashActivity
import org.koin.android.ext.android.inject import org.koin.android.ext.android.inject
@@ -60,6 +61,32 @@ class MyPageFragment : BaseFragment<FragmentMyBinding>(FragmentMyBinding::inflat
setupView() setupView()
bindData() bindData()
setupRecentContentSection() setupRecentContentSection()
setupLatestNotice()
}
private fun setupLatestNotice() {
// Observe the latest notice LiveData
viewModel.latestNoticeLiveData.observe(viewLifecycleOwner) { noticeItem ->
noticeItem?.let {
// Update the UI with the latest notice title
binding.tvLatestNoticeTitle.text = it.title
// Set click listener for the latest notice section
binding.llLatestNotice.setOnClickListener { _ ->
startActivity(
Intent(
requireActivity(),
NoticeDetailActivity::class.java
).apply {
putExtra(Constants.EXTRA_NOTICE, it)
}
)
}
}
}
// Fetch the latest notice using ViewModel
viewModel.getLatestNotice()
} }
private fun setupRecentContentSection() { private fun setupRecentContentSection() {

View File

@@ -6,15 +6,19 @@ import com.orhanobut.logger.Logger
import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers
import io.reactivex.rxjava3.schedulers.Schedulers import io.reactivex.rxjava3.schedulers.Schedulers
import kr.co.vividnext.sodalive.base.BaseViewModel import kr.co.vividnext.sodalive.base.BaseViewModel
import kr.co.vividnext.sodalive.common.ApiResponse
import kr.co.vividnext.sodalive.common.SharedPreferenceManager import kr.co.vividnext.sodalive.common.SharedPreferenceManager
import kr.co.vividnext.sodalive.mypage.auth.AuthRepository import kr.co.vividnext.sodalive.mypage.auth.AuthRepository
import kr.co.vividnext.sodalive.mypage.auth.AuthVerifyRequest import kr.co.vividnext.sodalive.mypage.auth.AuthVerifyRequest
import kr.co.vividnext.sodalive.settings.ContentType import kr.co.vividnext.sodalive.settings.ContentType
import kr.co.vividnext.sodalive.settings.notice.NoticeItem
import kr.co.vividnext.sodalive.settings.notice.NoticeRepository
import kr.co.vividnext.sodalive.user.UserRepository import kr.co.vividnext.sodalive.user.UserRepository
class MyPageViewModel( class MyPageViewModel(
private val userRepository: UserRepository, private val userRepository: UserRepository,
private val authRepository: AuthRepository private val authRepository: AuthRepository,
private val noticeRepository: NoticeRepository
) : BaseViewModel() { ) : BaseViewModel() {
private val _toastLiveData = MutableLiveData<String?>() private val _toastLiveData = MutableLiveData<String?>()
val toastLiveData: LiveData<String?> val toastLiveData: LiveData<String?>
@@ -28,6 +32,10 @@ class MyPageViewModel(
val myPageLiveData: LiveData<MyPageResponse> val myPageLiveData: LiveData<MyPageResponse>
get() = _myPageLiveData get() = _myPageLiveData
private val _latestNoticeLiveData = MutableLiveData<NoticeItem?>()
val latestNoticeLiveData: LiveData<NoticeItem?>
get() = _latestNoticeLiveData
fun getUserInfo() { fun getUserInfo() {
if (!_isLoading.value!!) { if (!_isLoading.value!!) {
_isLoading.value = true _isLoading.value = true
@@ -100,4 +108,25 @@ class MyPageViewModel(
) )
) )
} }
fun getLatestNotice() {
compositeDisposable.add(
noticeRepository.getLatestNotice()
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(
{ response ->
if (response.success && response.data != null) {
_latestNoticeLiveData.postValue(response.data)
} else {
Logger.e("Failed to get latest notice: ${response.message}")
}
},
{ error ->
error.printStackTrace()
Logger.e("Error getting latest notice: ${error.message}")
}
)
)
}
} }

View File

@@ -14,4 +14,7 @@ interface NoticeApi {
@Query("size") size: Int, @Query("size") size: Int,
@Header("Authorization") authHeader: String @Header("Authorization") authHeader: String
): Single<ApiResponse<GetNoticeResponse>> ): Single<ApiResponse<GetNoticeResponse>>
@GET("/notice/latest")
fun getLatestNotice(): Single<ApiResponse<NoticeItem>>
} }

View File

@@ -12,4 +12,6 @@ class NoticeRepository(private val api: NoticeApi) {
): Single<ApiResponse<GetNoticeResponse>> { ): Single<ApiResponse<GetNoticeResponse>> {
return api.getNotices(TimeZone.getDefault().id, page, size, authHeader = token) return api.getNotices(TimeZone.getDefault().id, page, size, authHeader = token)
} }
fun getLatestNotice() = api.getLatestNotice()
} }

View File

@@ -42,9 +42,9 @@
android:src="@drawable/ic_settings" /> android:src="@drawable/ic_settings" />
</LinearLayout> </LinearLayout>
<!-- Update Banner --> <!-- Latest Notice -->
<LinearLayout <LinearLayout
android:id="@+id/ll_update_banner" android:id="@+id/ll_latest_notice"
android:layout_width="0dp" android:layout_width="0dp"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:background="#000000" android:background="#000000"
@@ -57,7 +57,7 @@
app:layout_constraintTop_toBottomOf="@id/ll_header"> app:layout_constraintTop_toBottomOf="@id/ll_header">
<TextView <TextView
android:id="@+id/tv_update_title" android:id="@+id/tv_latest_notice_title"
android:layout_width="0dp" android:layout_width="0dp"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_weight="1" android:layout_weight="1"
@@ -83,7 +83,7 @@
app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent" app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent" app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/ll_update_banner"> app:layout_constraintTop_toBottomOf="@id/ll_latest_notice">
<LinearLayout <LinearLayout
android:layout_width="match_parent" android:layout_width="match_parent"