feat(ui): viewmodel, repository, api 추가
This commit is contained in:
		@@ -0,0 +1,13 @@
 | 
			
		||||
package kr.co.vividnext.sodalive.chat.character
 | 
			
		||||
 | 
			
		||||
import io.reactivex.rxjava3.core.Single
 | 
			
		||||
import kr.co.vividnext.sodalive.common.ApiResponse
 | 
			
		||||
import retrofit2.http.GET
 | 
			
		||||
import retrofit2.http.Header
 | 
			
		||||
 | 
			
		||||
interface CharacterApi {
 | 
			
		||||
    @GET("/api/chat/character/main")
 | 
			
		||||
    fun getCharacterMain(
 | 
			
		||||
        @Header("Authorization") authHeader: String
 | 
			
		||||
    ): Single<ApiResponse<CharacterHomeResponse>>
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,5 @@
 | 
			
		||||
package kr.co.vividnext.sodalive.chat.character
 | 
			
		||||
 | 
			
		||||
data class CharacterHomeResponse(
 | 
			
		||||
    val id: Long
 | 
			
		||||
)
 | 
			
		||||
@@ -30,12 +30,15 @@ import kr.co.vividnext.sodalive.explorer.profile.UserProfileActivity
 | 
			
		||||
import kr.co.vividnext.sodalive.extensions.dpToPx
 | 
			
		||||
import kr.co.vividnext.sodalive.main.MainActivity
 | 
			
		||||
import kr.co.vividnext.sodalive.settings.event.EventDetailActivity
 | 
			
		||||
import org.koin.android.ext.android.inject
 | 
			
		||||
 | 
			
		||||
// 캐릭터 탭 프래그먼트
 | 
			
		||||
@OptIn(UnstableApi::class)
 | 
			
		||||
class CharacterTabFragment : BaseFragment<FragmentCharacterTabBinding>(
 | 
			
		||||
    FragmentCharacterTabBinding::inflate
 | 
			
		||||
) {
 | 
			
		||||
    private val viewModel: CharacterTabViewModel by inject()
 | 
			
		||||
 | 
			
		||||
    private lateinit var contentBannerAdapter: AudioContentMainBannerAdapter
 | 
			
		||||
    private lateinit var recentCharacterAdapter: RecentCharacterAdapter
 | 
			
		||||
    private lateinit var popularCharacterAdapter: CharacterAdapter
 | 
			
		||||
@@ -46,6 +49,8 @@ class CharacterTabFragment : BaseFragment<FragmentCharacterTabBinding>(
 | 
			
		||||
        super.onViewCreated(view, savedInstanceState)
 | 
			
		||||
        setupView()
 | 
			
		||||
        loadData()
 | 
			
		||||
 | 
			
		||||
        viewModel.fetchData()
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private fun setupView() {
 | 
			
		||||
 
 | 
			
		||||
@@ -0,0 +1,7 @@
 | 
			
		||||
package kr.co.vividnext.sodalive.chat.character
 | 
			
		||||
 | 
			
		||||
class CharacterTabRepository(private val api: CharacterApi) {
 | 
			
		||||
    fun getCharacterMain(
 | 
			
		||||
        token: String
 | 
			
		||||
    ) = api.getCharacterMain(authHeader = token)
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,45 @@
 | 
			
		||||
package kr.co.vividnext.sodalive.chat.character
 | 
			
		||||
 | 
			
		||||
import androidx.lifecycle.LiveData
 | 
			
		||||
import androidx.lifecycle.MutableLiveData
 | 
			
		||||
import com.orhanobut.logger.Logger
 | 
			
		||||
import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers
 | 
			
		||||
import io.reactivex.rxjava3.schedulers.Schedulers
 | 
			
		||||
import kr.co.vividnext.sodalive.base.BaseViewModel
 | 
			
		||||
import kr.co.vividnext.sodalive.common.SharedPreferenceManager
 | 
			
		||||
 | 
			
		||||
class CharacterTabViewModel(
 | 
			
		||||
    private val repository: CharacterTabRepository
 | 
			
		||||
) : BaseViewModel() {
 | 
			
		||||
    private var _isLoading = MutableLiveData(false)
 | 
			
		||||
    val isLoading: LiveData<Boolean>
 | 
			
		||||
        get() = _isLoading
 | 
			
		||||
 | 
			
		||||
    private val _toastLiveData = MutableLiveData<String?>()
 | 
			
		||||
    val toastLiveData: LiveData<String?>
 | 
			
		||||
        get() = _toastLiveData
 | 
			
		||||
 | 
			
		||||
    fun fetchData() {
 | 
			
		||||
        _isLoading.value = true
 | 
			
		||||
 | 
			
		||||
        compositeDisposable.add(
 | 
			
		||||
            repository.getCharacterMain(token = "Bearer ${SharedPreferenceManager.token}")
 | 
			
		||||
                .subscribeOn(Schedulers.io())
 | 
			
		||||
                .observeOn(AndroidSchedulers.mainThread())
 | 
			
		||||
                .subscribe(
 | 
			
		||||
                    {
 | 
			
		||||
                        _isLoading.value = false
 | 
			
		||||
                        val data = it.data
 | 
			
		||||
                        if (it.success && data != null) {
 | 
			
		||||
 | 
			
		||||
                        }
 | 
			
		||||
                    },
 | 
			
		||||
                    {
 | 
			
		||||
                        _isLoading.value = false
 | 
			
		||||
                        it.message?.let { message -> Logger.e(message) }
 | 
			
		||||
                        _toastLiveData.postValue("알 수 없는 오류가 발생했습니다. 다시 시도해 주세요.")
 | 
			
		||||
                    }
 | 
			
		||||
                )
 | 
			
		||||
        )
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -64,6 +64,9 @@ import kr.co.vividnext.sodalive.audition.AuditionRepository
 | 
			
		||||
import kr.co.vividnext.sodalive.audition.AuditionViewModel
 | 
			
		||||
import kr.co.vividnext.sodalive.audition.detail.AuditionDetailViewModel
 | 
			
		||||
import kr.co.vividnext.sodalive.audition.role.AuditionRoleDetailViewModel
 | 
			
		||||
import kr.co.vividnext.sodalive.chat.character.CharacterApi
 | 
			
		||||
import kr.co.vividnext.sodalive.chat.character.CharacterTabRepository
 | 
			
		||||
import kr.co.vividnext.sodalive.chat.character.CharacterTabViewModel
 | 
			
		||||
import kr.co.vividnext.sodalive.common.ApiBuilder
 | 
			
		||||
import kr.co.vividnext.sodalive.common.ObjectBox
 | 
			
		||||
import kr.co.vividnext.sodalive.explorer.ExplorerApi
 | 
			
		||||
@@ -245,6 +248,7 @@ class AppDI(private val context: Context, isDebugMode: Boolean) {
 | 
			
		||||
        single { ApiBuilder().build(get(), SearchApi::class.java) }
 | 
			
		||||
        single { ApiBuilder().build(get(), PointStatusApi::class.java) }
 | 
			
		||||
        single { ApiBuilder().build(get(), HomeApi::class.java) }
 | 
			
		||||
        single { ApiBuilder().build(get(), CharacterApi::class.java) }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private val viewModelModule = module {
 | 
			
		||||
@@ -342,6 +346,7 @@ class AppDI(private val context: Context, isDebugMode: Boolean) {
 | 
			
		||||
        viewModel { SearchViewModel(get()) }
 | 
			
		||||
        viewModel { PointStatusViewModel(get()) }
 | 
			
		||||
        viewModel { HomeViewModel(get(), get()) }
 | 
			
		||||
        viewModel { CharacterTabViewModel(get()) }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private val repositoryModule = module {
 | 
			
		||||
@@ -386,6 +391,7 @@ class AppDI(private val context: Context, isDebugMode: Boolean) {
 | 
			
		||||
        factory { UserEventRepository(get()) }
 | 
			
		||||
        factory { PointStatusRepository(get()) }
 | 
			
		||||
        factory { HomeRepository(get()) }
 | 
			
		||||
        factory { CharacterTabRepository(get()) }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user