Skip to content

Commit

Permalink
Merge branch 'D83T-66' into main
Browse files Browse the repository at this point in the history
  • Loading branch information
YHKOO95 committed Mar 3, 2023
2 parents 227b53f + e9ad361 commit 72ee6af
Show file tree
Hide file tree
Showing 44 changed files with 561 additions and 74 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
package com.d83t.bpm.data.model.response

import com.d83t.bpm.data.base.BaseResponse
import com.d83t.bpm.data.mapper.DataMapper
import com.d83t.bpm.domain.model.UserSchedule
import com.google.gson.annotations.SerializedName
import kotlinx.parcelize.Parcelize

@Parcelize
data class UserScheduleResponse(
@SerializedName("studioName")
val studioName: String?,
@SerializedName("date")
val date: String?,
@SerializedName("time")
val time: String?,
@SerializedName("memo")
val memo: String?,
) : BaseResponse {
companion object : DataMapper<UserScheduleResponse, UserSchedule> {
override fun UserScheduleResponse.toDataModel(): UserSchedule {
return UserSchedule(
studioName = studioName,
date = date,
time = time,
memo = memo
)
}
}
}
13 changes: 4 additions & 9 deletions data/src/main/java/com/d83t/bpm/data/network/MainApi.kt
Original file line number Diff line number Diff line change
Expand Up @@ -7,18 +7,10 @@ import com.d83t.bpm.data.model.response.ScheduleResponse
import com.d83t.bpm.data.model.response.SignUpResponse
import com.d83t.bpm.data.model.response.StudioListResponse
import com.d83t.bpm.data.model.response.StudioResponse
import com.d83t.bpm.domain.model.StudioList
import com.d83t.bpm.data.model.response.UserScheduleResponse
import okhttp3.MultipartBody
import retrofit2.Response
import retrofit2.http.*
import retrofit2.http.Body
import retrofit2.http.GET
import retrofit2.http.Headers
import retrofit2.http.Multipart
import retrofit2.http.POST
import retrofit2.http.Part
import retrofit2.http.Path
import retrofit2.http.Query

interface MainApi {
@Headers("shouldBeAuthorized: false")
Expand Down Expand Up @@ -77,6 +69,9 @@ interface MainApi {
@Query("offset") offset: Int,
): Response<StudioListResponse>

@GET("api/users/schedule")
suspend fun getUserSchedule(): Response<UserScheduleResponse>

@GET("api/studio")
suspend fun searchStudio(
@Query("q") query: String
Expand Down
Original file line number Diff line number Diff line change
@@ -1,12 +1,14 @@
package com.d83t.bpm.data.repositoryImpl

import com.d83t.bpm.data.model.response.StudioListResponse.Companion.toDataModel
import com.d83t.bpm.data.model.response.UserScheduleResponse.Companion.toDataModel
import com.d83t.bpm.data.network.BPMResponse
import com.d83t.bpm.data.network.BPMResponseHandler
import com.d83t.bpm.data.network.ErrorResponse.Companion.toDataModel
import com.d83t.bpm.data.network.MainApi
import com.d83t.bpm.domain.model.ResponseState
import com.d83t.bpm.domain.model.StudioList
import com.d83t.bpm.domain.model.UserSchedule
import com.d83t.bpm.domain.repository.MainRepository
import javax.inject.Inject
import kotlinx.coroutines.flow.Flow
Expand All @@ -30,4 +32,17 @@ class MainRepositoryImpl @Inject constructor(
}.collect()
}
}

override suspend fun getUserSchedule(): Flow<ResponseState<UserSchedule>> {
return flow {
BPMResponseHandler().handle {
mainApi.getUserSchedule()
}.onEach { result ->
when (result) {
is BPMResponse.Success -> emit(ResponseState.Success(result.data.toDataModel()))
is BPMResponse.Error -> emit(ResponseState.Error(result.error.toDataModel()))
}
}.collect()
}
}
}
Original file line number Diff line number Diff line change
@@ -1,12 +1,14 @@
package com.d83t.bpm.data.repositoryImpl

import com.d83t.bpm.data.model.response.StudioListResponse.Companion.toDataModel
import com.d83t.bpm.data.model.response.StudioResponse.Companion.toDataModel
import com.d83t.bpm.data.network.BPMResponse
import com.d83t.bpm.data.network.BPMResponseHandler
import com.d83t.bpm.data.network.ErrorResponse.Companion.toDataModel
import com.d83t.bpm.data.network.MainApi
import com.d83t.bpm.domain.model.ResponseState
import com.d83t.bpm.domain.model.Studio
import com.d83t.bpm.domain.model.StudioList
import com.d83t.bpm.domain.repository.SearchStudioRepository
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.collect
Expand All @@ -19,13 +21,13 @@ class SearchStudioRepositoryImpl @Inject constructor(
) : SearchStudioRepository {
override suspend fun fetchSearchStudioResult(
query: String
): Flow<ResponseState<List<Studio>>> {
): Flow<ResponseState<StudioList>> {
return flow {
BPMResponseHandler().handle {
mainApi.searchStudio(query = query)
}.onEach { result ->
when (result) {
is BPMResponse.Success -> emit(ResponseState.Success(result.data.studios.map { it.toDataModel() }))
is BPMResponse.Success -> emit(ResponseState.Success(result.data.toDataModel()))
is BPMResponse.Error -> emit(ResponseState.Error(result.error.toDataModel()))
}
}.collect()
Expand Down
3 changes: 3 additions & 0 deletions domain/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -73,4 +73,7 @@ dependencies {
//timber log
implementation 'com.jakewharton.timber:timber:5.0.1'

// joda datetime
implementation "joda-time:joda-time:2.10.13"

}
7 changes: 6 additions & 1 deletion domain/src/main/java/com/d83t/bpm/domain/model/Studio.kt
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
package com.d83t.bpm.domain.model

import com.d83t.bpm.domain.base.BaseModel
import com.google.gson.annotations.SerializedName
import kotlin.math.round
import kotlinx.parcelize.IgnoredOnParcel
import kotlinx.parcelize.Parcelize

Expand All @@ -27,9 +27,14 @@ data class Studio(
val updatedAt: String?
) : BaseModel {

// TODO : 죄송합니다..

@IgnoredOnParcel
val tagList = listOf<String>(
"친절해요", "소통이 빨라요", "깨끗해요"
)

@IgnoredOnParcel
val ratingText: String = "${round((rating?.times(10) ?: 0) as Double) / 10}"

}
12 changes: 12 additions & 0 deletions domain/src/main/java/com/d83t/bpm/domain/model/UserSchedule.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
package com.d83t.bpm.domain.model

import com.d83t.bpm.domain.base.BaseModel
import kotlinx.parcelize.Parcelize

@Parcelize
data class UserSchedule(
val studioName: String? = "",
val date: String? = "",
val time: String? = "",
val memo: String? = "끝까지 화이팅!",
) : BaseModel
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,14 @@ package com.d83t.bpm.domain.repository

import com.d83t.bpm.domain.model.ResponseState
import com.d83t.bpm.domain.model.StudioList
import com.d83t.bpm.domain.model.UserSchedule
import kotlinx.coroutines.flow.Flow

interface MainRepository {

// TODO : Move to HomeRepository
suspend fun getStudioList(limit: Int, offset: Int): Flow<ResponseState<StudioList>>

suspend fun getUserSchedule(): Flow<ResponseState<UserSchedule>>

}
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,11 @@ package com.d83t.bpm.domain.repository

import com.d83t.bpm.domain.model.ResponseState
import com.d83t.bpm.domain.model.Studio
import com.d83t.bpm.domain.model.StudioList
import kotlinx.coroutines.flow.Flow

interface SearchStudioRepository {
suspend fun fetchSearchStudioResult(
query: String
) : Flow<ResponseState<List<Studio>>>
) : Flow<ResponseState<StudioList>>
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
package com.d83t.bpm.domain.usecase.main

import com.d83t.bpm.domain.model.ResponseState
import com.d83t.bpm.domain.model.UserSchedule
import com.d83t.bpm.domain.repository.MainRepository
import dagger.Reusable
import javax.inject.Inject
import kotlinx.coroutines.flow.Flow

@Reusable
class GetUserScheduleUseCase @Inject constructor(
private val mainRepository: MainRepository
) {
suspend operator fun invoke(): Flow<ResponseState<UserSchedule>> {
return mainRepository.getUserSchedule()
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ package com.d83t.bpm.domain.usecase.search_studio

import com.d83t.bpm.domain.model.ResponseState
import com.d83t.bpm.domain.model.Studio
import com.d83t.bpm.domain.model.StudioList
import com.d83t.bpm.domain.repository.SearchStudioRepository
import kotlinx.coroutines.flow.Flow
import javax.inject.Inject
Expand All @@ -11,7 +12,7 @@ class SearchStudioUseCase @Inject constructor(
) {
suspend operator fun invoke(
query: String
): Flow<ResponseState<List<Studio>>> {
): Flow<ResponseState<StudioList>> {
return searchStudioRepository.fetchSearchStudioResult(query = query)
}
}
3 changes: 3 additions & 0 deletions presentation/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -172,6 +172,9 @@ dependencies {
// 카카오 로그인
implementation "com.kakao.sdk:v2-user:2.12.1"

// joda datetime
implementation "joda-time:joda-time:2.10.13"

// Flipper
debugImplementation 'com.facebook.flipper:flipper:0.182.0'
debugImplementation 'com.facebook.soloader:soloader:0.10.4'
Expand Down
12 changes: 4 additions & 8 deletions presentation/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
Expand Up @@ -22,10 +22,10 @@
android:name=".ui.splash.SplashActivity"
android:exported="true"
android:theme="@style/Theme.Bpm.NoActionBar">
<!-- <intent-filter>-->
<!-- <action android:name="android.intent.action.MAIN" />-->
<!-- <category android:name="android.intent.category.LAUNCHER" />-->
<!-- </intent-filter>-->
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity
android:name=".ui.sign_up.SignUpActivity"
Expand All @@ -37,10 +37,6 @@
android:exported="true"
android:screenOrientation="portrait"
android:theme="@style/Theme.Bpm.NoActionBar" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity
android:name=".ui.studio_detail.StudioDetailActivity"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ import androidx.fragment.app.commitNow
import com.d83t.bpm.presentation.R
import com.d83t.bpm.presentation.base.BaseActivity
import com.d83t.bpm.presentation.databinding.ActivityMainBinding
import com.d83t.bpm.presentation.ui.main.add.MainAddBottomSheet
import com.d83t.bpm.presentation.ui.main.community.CommunityFragment
import com.d83t.bpm.presentation.ui.main.home.HomeFragment
import com.d83t.bpm.presentation.ui.main.mypage.MyPageFragment
Expand Down Expand Up @@ -55,7 +56,7 @@ class MainActivity : BaseActivity<ActivityMainBinding>(ActivityMainBinding::infl
viewModel.event.collect { event ->
when (event) {
MainViewEvent.Add -> {
showToast("Add Clicked")
showAddBottomSheet()
}
}
}
Expand All @@ -76,6 +77,10 @@ class MainActivity : BaseActivity<ActivityMainBinding>(ActivityMainBinding::infl
}
}

private fun showAddBottomSheet(){
MainAddBottomSheet().show(supportFragmentManager, MainAddBottomSheet::class.simpleName)
}

private fun changeFragment(fragmentId: Int? = null) {
val fragment = when (fragmentId) {
R.id.nav_noti -> {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
package com.d83t.bpm.presentation.ui.main.add

import androidx.fragment.app.viewModels
import com.d83t.bpm.presentation.R
import com.d83t.bpm.presentation.base.BaseBottomSheetFragment
import com.d83t.bpm.presentation.databinding.BottomsheetMainAddBinding
import com.d83t.bpm.presentation.util.repeatCallDefaultOnStarted
import com.d83t.bpm.presentation.util.showToast
import dagger.hilt.android.AndroidEntryPoint

@AndroidEntryPoint
class MainAddBottomSheet :
BaseBottomSheetFragment<BottomsheetMainAddBinding>(BottomsheetMainAddBinding::inflate) {

override fun getTheme(): Int = R.style.DdoreumBottomSheetDialog

override val viewModel: MainAddViewModel by viewModels()

override fun initLayout() {
bind {
vm = viewModel
lifecycleOwner = viewLifecycleOwner
}
}

override fun setupCollect() {
repeatCallDefaultOnStarted {
viewModel.event.collect { event ->
when (event) {
MainAddViewEvent.Click -> {
requireContext().showToast("오픈 예정입니다!")
}
}
}
}
}

companion object {

fun newInstance(): MainAddBottomSheet {
return MainAddBottomSheet()
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
package com.d83t.bpm.presentation.ui.main.add

sealed interface MainAddViewEvent {
object Click : MainAddViewEvent
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
package com.d83t.bpm.presentation.ui.main.add

import androidx.lifecycle.viewModelScope
import com.d83t.bpm.presentation.base.BaseViewModel
import dagger.hilt.android.lifecycle.HiltViewModel
import javax.inject.Inject
import kotlinx.coroutines.flow.MutableSharedFlow
import kotlinx.coroutines.flow.SharedFlow
import kotlinx.coroutines.launch

@HiltViewModel
class MainAddViewModel @Inject constructor() : BaseViewModel() {

private val _event = MutableSharedFlow<MainAddViewEvent>()
val event: SharedFlow<MainAddViewEvent>
get() = _event

fun clickDisable() {
viewModelScope.launch {
_event.emit(MainAddViewEvent.Click)
}
}

}
Loading

0 comments on commit 72ee6af

Please sign in to comment.