Skip to content

Commit

Permalink
Merge branch 'develop' into mod-filter-view
Browse files Browse the repository at this point in the history
# Conflicts:
#	app/src/main/java/com/sopt/geonppang/presentation/filterSetting/FilterSettingViewModel.kt
  • Loading branch information
jihyunniiii committed Feb 14, 2024
2 parents 7ce74e0 + 895ddb7 commit 6336c2b
Show file tree
Hide file tree
Showing 12 changed files with 151 additions and 45 deletions.
2 changes: 1 addition & 1 deletion app/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
Expand Up @@ -115,7 +115,7 @@

<data
android:host="oauth"
android:scheme="kakao${KAKAO_APP_KEY}" />
android:scheme="kakao698fe2d5716b72acfef2760ff5ccd46e" />
</intent-filter>
</activity>
</application>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,13 @@ class GPDataSource @Inject constructor(@ApplicationContext context: Context) {
set(value) = dataStore.edit { putBoolean(IS_LOGIN, value) }
get() = dataStore.getBoolean(IS_LOGIN, false)

var userRoleType: String
set(value) = dataStore.edit { putString(USER_ROLE_TYPE, value) }
get() = dataStore.getString(
USER_ROLE_TYPE,
""
) ?: ""

fun clear() {
dataStore.edit {
clear()
Expand All @@ -64,5 +71,6 @@ class GPDataSource @Inject constructor(@ApplicationContext context: Context) {
const val ACCESS_TOKEN = "AccessToken"
const val REFRESH_TOKEN = "RefreshToken"
const val IS_LOGIN = "IsLogin"
const val USER_ROLE_TYPE = "UserRoleType"
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -17,21 +17,27 @@ class AuthInterceptor @Inject constructor(
private val context: Application,
) : Interceptor {

// TODO dana 경우에 따른 분기 처리 필요
override fun intercept(chain: Interceptor.Chain): Response {
val originalRequest = chain.request()
val authRequest =
originalRequest.newBuilder().addHeader("Authorization", gpDataSource.accessToken)
.build()
val response = chain.proceed(authRequest)
val response = chain.proceed(
if (gpDataSource.accessToken.isNotBlank()) {
authRequest
} else {
originalRequest
}
)

when (response.code) {
401 -> {
response.close()
val refreshTokenRequest = originalRequest.newBuilder().get()
.url("${BuildConfig.GP_BASE_URL}auth/refresh")
.addHeader(ACCESS_TOKEN, gpDataSource.accessToken)
.addHeader(REFRESH_TOKEN, gpDataSource.refreshToken)
.build()
val refreshTokenRequest =
originalRequest.newBuilder().get().url("${BuildConfig.GP_BASE_URL}auth/refresh")
.addHeader(ACCESS_TOKEN, gpDataSource.accessToken)
.addHeader(REFRESH_TOKEN, gpDataSource.refreshToken).build()
val refreshTokenResponse = chain.proceed(refreshTokenRequest)

if (refreshTokenResponse.isSuccessful) {
Expand All @@ -46,15 +52,16 @@ class AuthInterceptor @Inject constructor(

refreshTokenResponse.close()
val newRequest = originalRequest.newBuilder()
.addHeader(ACCESS_TOKEN, gpDataSource.accessToken)
.build()
.addHeader(ACCESS_TOKEN, gpDataSource.accessToken).build()
return chain.proceed(newRequest)
} else {
with(context) {
CoroutineScope(Dispatchers.Main).launch {
startActivity(
Intent(this@with, SignActivity::class.java)
.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
Intent(
this@with,
SignActivity::class.java
).addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
)
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ import com.sopt.geonppang.domain.repository.AuthRepository
import com.sopt.geonppang.domain.repository.ValidationRepository
import com.sopt.geonppang.presentation.type.AuthRoleType
import com.sopt.geonppang.presentation.type.PlatformType
import com.sopt.geonppang.presentation.type.UserRoleType
import com.sopt.geonppang.util.UiState
import dagger.hilt.android.lifecycle.HiltViewModel
import kotlinx.coroutines.flow.MutableStateFlow
Expand Down Expand Up @@ -85,6 +86,9 @@ class AuthViewModel @Inject constructor(
isValidNickname && isNicknameUsable
}.stateIn(viewModelScope, SharingStarted.WhileSubscribed(), false)

val platformType = gpDataSource.platformType

// TODO: 초기화 부분 고민
fun initNickname() {
_isNicknameUsable.value = UiState.Empty
}
Expand Down Expand Up @@ -112,14 +116,11 @@ class AuthViewModel @Inject constructor(
.onSuccess {
if (it.code == 200) {
_isNicknameUsable.value = UiState.Success(true)
Timber.tag("isNicknameDuplicated")
.e("{" + it.message + " " + _isNicknameUsable.value + "}")
}
}
.onFailure { throwable ->
Timber.e(throwable.message)
_isNicknameUsable.value = UiState.Error("false")
Timber.tag("isNicknameNotDuplicate").e("{" + _isNicknameUsable.value + "}")
}
}
}
Expand All @@ -128,6 +129,8 @@ class AuthViewModel @Inject constructor(
gpDataSource.isLogin = true
}

// 카카오 로그인 이거나, 자체 회원 가입인 경우는 -> role이 USER
// 카카오 회원 가입인 경우만 -> role 이 GUEST -> 이 경우메만 닉네임 설정 뷰로 이동
fun signUp(
platformType: PlatformType,
platformToken: String,
Expand All @@ -151,13 +154,24 @@ class AuthViewModel @Inject constructor(
val responseHeader = signUpResponse.headers()
val accessToken = responseHeader[AUTHORIZATION].toString()
val refreshToken = responseHeader[AUTHORIZATION_REFRESH].toString()

_authRoleType.value =
if (responseBody?.role == AuthRoleType.GUEST.name) AuthRoleType.GUEST else AuthRoleType.USER
if (responseBody?.role == AuthRoleType.ROLE_GUEST.name) {
AuthRoleType.ROLE_GUEST
} else {
AuthRoleType.ROLE_MEMBER
}

gpDataSource.accessToken = BEARER_PREFIX + accessToken
if (_authRoleType.value == AuthRoleType.USER) {

// 카카오 로그인, 자체 회원 가입인 경우메만 리프래시 토큰을 저장하고 회원가입 상태를 success로 지정
if (_authRoleType.value == AuthRoleType.ROLE_MEMBER) {
gpDataSource.refreshToken = BEARER_PREFIX + refreshToken

_signUpState.value = UiState.Success(true)
}
_signUpState.value = UiState.Success(true)

// amplitude를 쏘기 위한 것
if (platformType == PlatformType.NONE) {
_memberId.value = responseBody?.memberId
}
Expand All @@ -168,22 +182,25 @@ class AuthViewModel @Inject constructor(
}
}

// 소셜 회원가입 후에만 사용하는 api
fun settingNickName() {
viewModelScope.launch {
nickname.value?.let { nickname ->
nickname.value.let { nickname ->
authRepository.settingNickname(RequestNicknameSetting(nickname))
.onSuccess { response ->
val responseHeader = response.headers()
val responseBody = response.body()

// 소셜 회원가입 시 여기서 다시 엑세스, 리프래시 토큰을 발급 받음
val accessToken = responseHeader[AUTHORIZATION].toString()
val refreshToken = responseHeader[AUTHORIZATION_REFRESH].toString()

gpDataSource.accessToken = BEARER_PREFIX + accessToken
gpDataSource.refreshToken = BEARER_PREFIX + refreshToken

_signUpState.value = UiState.Success(true)
// 소셜 회원가입 시 자동 로그인 설정
setAutoLogin()
_memberId.value = responseBody?.data?.memberId
gpDataSource.userRoleType = UserRoleType.FILTER_UNSELECTED_MEMBER.name
}
.onFailure { throwable ->
Timber.e(throwable.message)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,9 @@ import com.sopt.geonppang.presentation.MainActivity
import com.sopt.geonppang.presentation.login.LoginActivity
import com.sopt.geonppang.presentation.type.AuthRoleType
import com.sopt.geonppang.presentation.type.PlatformType
import com.sopt.geonppang.presentation.type.UserRoleType
import com.sopt.geonppang.util.AmplitudeUtils
import com.sopt.geonppang.util.UiState
import com.sopt.geonppang.util.binding.BindingActivity
import com.sopt.geonppang.util.extension.setOnSingleClickListener
import dagger.hilt.android.AndroidEntryPoint
Expand Down Expand Up @@ -45,24 +47,42 @@ class SignActivity :
moveToSignUp()
AmplitudeUtils.trackEventWithProperties(START_SIGNUP, SIGNUP_TYPE, EMAIL)
}

// TODO: dana 둘러보기 코드 작성 후 지우기
binding.ivLogoText.setOnSingleClickListener {
GPDataSource(this).userRoleType = UserRoleType.NONE_MEMBER.name
moveToMain()
}
}

private fun collectData() {
// 카카오 회원 가입, 로그인
authViewModel.authRoleType.flowWithLifecycle(lifecycle).onEach { role ->
when (role) {
AuthRoleType.GUEST -> {
// 카카오 회원가입인 경우 닉네임 페이지로 이동
AuthRoleType.ROLE_GUEST -> {
moveToNickNameSetting()
}

AuthRoleType.USER -> {
authViewModel.setAutoLogin()
// 카카오 로그인인 경우 홈으로 이동
AuthRoleType.ROLE_MEMBER -> {
AmplitudeUtils.trackEvent(LOGIN_APP)
moveToMain()
}

else -> {}
}
}.launchIn(lifecycleScope)

authViewModel.signUpState.flowWithLifecycle(lifecycle).onEach { signUpState ->
when (signUpState) {
is UiState.Success -> {
authViewModel.setAutoLogin()
}

else -> {}
}
}.launchIn(lifecycleScope)
}

private fun moveToSignUp() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,6 @@ import androidx.activity.viewModels
import androidx.lifecycle.flowWithLifecycle
import androidx.lifecycle.lifecycleScope
import com.sopt.geonppang.R
import com.sopt.geonppang.data.datasource.local.GPDataSource
import com.sopt.geonppang.databinding.ActivitySignupNicknameBinding
import com.sopt.geonppang.presentation.type.PlatformType
import com.sopt.geonppang.util.AmplitudeUtils
Expand Down Expand Up @@ -50,6 +49,7 @@ class SignUpNicknameActivity :
viewModel.signUpState.flowWithLifecycle(lifecycle).onEach {
when (it) {
is UiState.Success -> {
// 회원가입 성공시에만 자동 로그인 설정 (소셜 회원가입도 닉네임까지 설정이 완료된 시점에)
viewModel.setAutoLogin()
AmplitudeUtils.trackEventWithProperties(
COMPLETE_NICKNAME,
Expand Down Expand Up @@ -83,19 +83,21 @@ class SignUpNicknameActivity :
viewModel.initNickname()
}
}.launchIn(lifecycleScope)

viewModel.memberId.flowWithLifecycle(lifecycle).onEach { memberId ->
if (memberId != null)
AmplitudeUtils.setUserId(GUNBBANG + memberId)
}.launchIn(lifecycleScope)
}

private fun completeSignUp() {
val gpDataSource = GPDataSource(this)
when (gpDataSource.platformType) {
when (viewModel.platformType) {
// 카카오 회원가입
PlatformType.KAKAO.name -> {
viewModel.settingNickName()
}

// 자체 회원가입
PlatformType.NONE.name -> {
val email = intent.getStringExtra(EMAIL)
val password = intent.getStringExtra(PASSWORD)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ import com.sopt.geonppang.presentation.type.BreadFilterType
import com.sopt.geonppang.presentation.type.FilterInfoType
import com.sopt.geonppang.presentation.type.MainPurposeFilterType
import com.sopt.geonppang.presentation.type.NutrientFilterType
import com.sopt.geonppang.presentation.type.UserRoleType
import com.sopt.geonppang.util.UiState
import dagger.hilt.android.lifecycle.HiltViewModel
import kotlinx.coroutines.flow.MutableStateFlow
Expand All @@ -23,7 +24,7 @@ import javax.inject.Inject

@HiltViewModel
class FilterSettingViewModel @Inject constructor(
gpDataSource: GPDataSource,
private val gpDataSource: GPDataSource,
private val filterRepository: FilterSettingRepository
) : ViewModel() {
private val _selectedFilterState =
Expand Down Expand Up @@ -100,6 +101,10 @@ class FilterSettingViewModel @Inject constructor(
ingredientType = _nutrientFilterType.value,
)
)

// 필터를 설정할 때, userRoleType을 selectedMember로 설정 하기
// TODO: dana filter 설정할 때마다 재설정하는게 맞는가,,
gpDataSource.userRoleType = UserRoleType.FILTER_SELECTED_MEMBER.name
}
.onFailure { throwable ->
_selectedFilterState.value = UiState.Error(throwable.message)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ import com.sopt.geonppang.presentation.detail.DetailActivity.Companion.VIEW_DETA
import com.sopt.geonppang.presentation.filterSetting.FilterSettingActivity
import com.sopt.geonppang.presentation.search.SearchActivity
import com.sopt.geonppang.presentation.type.FilterInfoType
import com.sopt.geonppang.presentation.type.UserRoleType
import com.sopt.geonppang.util.AmplitudeUtils
import com.sopt.geonppang.util.UiState
import com.sopt.geonppang.util.binding.BindingFragment
Expand Down Expand Up @@ -84,13 +85,24 @@ class HomeFragment : BindingFragment<FragmentHomeBinding>(R.layout.fragment_home
}
}.launchIn(lifecycleScope)

viewModel.isFilterSelected.flowWithLifecycle(lifecycle).onEach { isFilterSelected ->
binding.tvHomeBestBakeryTitle1.setVisibility(isFilterSelected)
binding.tvHomeBestReviewTitle1.setVisibility(isFilterSelected)
binding.includeHomeSpeechBubble.root.setVisibility(!isFilterSelected)
// 유저 상태에 따른 ui 분기 처리
viewModel.userRoleType.flowWithLifecycle(lifecycle).onEach {
when (it) {
UserRoleType.NONE_MEMBER.name -> {
viewModel.setNickName("별사탕")
}

UserRoleType.FILTER_SELECTED_MEMBER.name -> {
binding.tvHomeBestBakeryTitle1.setVisibility(true)
binding.tvHomeBestReviewTitle1.setVisibility(true)
}

if (isFilterSelected != null)
viewModel.fetchBestBakeryList()
UserRoleType.FILTER_UNSELECTED_MEMBER.name -> {
binding.includeHomeSpeechBubble.root.setVisibility(true)
}

else -> {}
}
}.launchIn(lifecycleScope)
}

Expand Down
Loading

0 comments on commit 6336c2b

Please sign in to comment.