Skip to content

Commit

Permalink
Merge pull request #107 from team-winey/feature/feat-nickname-duplica…
Browse files Browse the repository at this point in the history
…te-check

[feat] 온보딩 / 닉네임 뷰 구현, 서버통신
  • Loading branch information
leeeha authored Aug 12, 2023
2 parents 6bbdf96 + 46051a1 commit 0db454c
Show file tree
Hide file tree
Showing 30 changed files with 599 additions and 46 deletions.
17 changes: 12 additions & 5 deletions app/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
Expand Up @@ -31,28 +31,34 @@
</activity>

<activity
android:name=".presentation.main.MainActivity"
android:name=".presentation.onboarding.login.LoginActivity"
android:exported="false"
android:screenOrientation="portrait" />

<activity
android:name=".presentation.main.feed.upload.UploadActivity"
android:name=".presentation.onboarding.nickname.NicknameActivity"
android:exported="true"
android:screenOrientation="portrait"
android:windowSoftInputMode="adjustResize" />

<activity
android:name=".presentation.main.feed.upload.loading.LoadingActivity"
android:name=".presentation.main.MainActivity"
android:exported="false"
android:screenOrientation="portrait" />

<activity
android:name=".presentation.main.mypage.MypageHelpActivity"
android:name=".presentation.main.feed.upload.UploadActivity"
android:exported="true"
android:screenOrientation="portrait"
android:windowSoftInputMode="adjustResize" />

<activity
android:name=".presentation.main.feed.upload.loading.LoadingActivity"
android:exported="false"
android:screenOrientation="portrait" />

<activity
android:name=".presentation.onboarding.LoginActivity"
android:name=".presentation.main.mypage.MypageHelpActivity"
android:exported="false"
android:screenOrientation="portrait" />

Expand All @@ -61,6 +67,7 @@
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.VIEW" />

<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
package com.android.go.sopt.winey.data.model.remote.response

import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable

@Serializable
data class ResponseGetNicknameDuplicateCheckDto(
@SerialName("isDuplicated")
val isDuplicated: Boolean
)
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ package com.android.go.sopt.winey.data.repository
import com.android.go.sopt.winey.data.model.remote.request.RequestCreateGoalDto
import com.android.go.sopt.winey.data.model.remote.request.RequestLoginDto
import com.android.go.sopt.winey.data.model.remote.request.RequestPostLikeDto
import com.android.go.sopt.winey.data.model.remote.response.ResponseGetNicknameDuplicateCheckDto
import com.android.go.sopt.winey.data.model.remote.response.ResponseLoginDto
import com.android.go.sopt.winey.data.model.remote.response.ResponsePostWineyFeedDto
import com.android.go.sopt.winey.data.model.remote.response.ResponseReIssueTokenDto
Expand Down Expand Up @@ -79,4 +80,9 @@ class AuthRepositoryImpl @Inject constructor(
runCatching {
authDataSource.postReIssueToken(refreshToken).data
}

override suspend fun getNicknameDuplicateCheck(nickname: String): Result<ResponseGetNicknameDuplicateCheckDto?> =
runCatching {
authDataSource.getNicknameDuplicateCheck(nickname).data
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import com.android.go.sopt.winey.data.model.remote.request.RequestCreateGoalDto
import com.android.go.sopt.winey.data.model.remote.request.RequestLoginDto
import com.android.go.sopt.winey.data.model.remote.request.RequestPostLikeDto
import com.android.go.sopt.winey.data.model.remote.response.ResponseCreateGoalDto
import com.android.go.sopt.winey.data.model.remote.response.ResponseGetNicknameDuplicateCheckDto
import com.android.go.sopt.winey.data.model.remote.response.ResponseGetRecommendListDto
import com.android.go.sopt.winey.data.model.remote.response.ResponseGetUserDto
import com.android.go.sopt.winey.data.model.remote.response.ResponseGetWineyFeedListDto
Expand All @@ -26,6 +27,10 @@ import retrofit2.http.Path
import retrofit2.http.Query

interface AuthService {
/**
*
*/

@GET("user")
suspend fun getUser(): BaseResponse<ResponseGetUserDto?>

Expand Down Expand Up @@ -77,4 +82,9 @@ interface AuthService {
suspend fun postReIssueToken(
@Header("refreshToken") refreshToken: String
): BaseResponse<ResponseReIssueTokenDto>

@GET("user/nickname/is-exist")
suspend fun getNicknameDuplicateCheck(
@Query("nickname") nickname: String
): BaseResponse<ResponseGetNicknameDuplicateCheckDto>
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import com.android.go.sopt.winey.data.model.remote.request.RequestCreateGoalDto
import com.android.go.sopt.winey.data.model.remote.request.RequestLoginDto
import com.android.go.sopt.winey.data.model.remote.request.RequestPostLikeDto
import com.android.go.sopt.winey.data.model.remote.response.ResponseCreateGoalDto
import com.android.go.sopt.winey.data.model.remote.response.ResponseGetNicknameDuplicateCheckDto
import com.android.go.sopt.winey.data.model.remote.response.ResponseGetRecommendListDto
import com.android.go.sopt.winey.data.model.remote.response.ResponseGetUserDto
import com.android.go.sopt.winey.data.model.remote.response.ResponseGetWineyFeedListDto
Expand Down Expand Up @@ -59,4 +60,7 @@ class AuthDataSource @Inject constructor(
refreshToken: String
): BaseResponse<ResponseReIssueTokenDto> =
authService.postReIssueToken(refreshToken)

suspend fun getNicknameDuplicateCheck(nickname: String): BaseResponse<ResponseGetNicknameDuplicateCheckDto> =
authService.getNicknameDuplicateCheck(nickname)
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ package com.android.go.sopt.winey.domain.repository
import com.android.go.sopt.winey.data.model.remote.request.RequestCreateGoalDto
import com.android.go.sopt.winey.data.model.remote.request.RequestLoginDto
import com.android.go.sopt.winey.data.model.remote.request.RequestPostLikeDto
import com.android.go.sopt.winey.data.model.remote.response.ResponseGetNicknameDuplicateCheckDto
import com.android.go.sopt.winey.data.model.remote.response.ResponseLoginDto
import com.android.go.sopt.winey.data.model.remote.response.ResponsePostWineyFeedDto
import com.android.go.sopt.winey.data.model.remote.response.ResponseReIssueTokenDto
Expand Down Expand Up @@ -39,4 +40,6 @@ interface AuthRepository {
): Result<ResponseLoginDto?>

suspend fun postReIssueToken(refreshToken: String): Result<ResponseReIssueTokenDto?>

suspend fun getNicknameDuplicateCheck(nickname: String): Result<ResponseGetNicknameDuplicateCheckDto?>
}
Original file line number Diff line number Diff line change
Expand Up @@ -36,23 +36,22 @@ class MainActivity : BindingActivity<ActivityMainBinding>(R.layout.activity_main
}
}

fun syncBottomNavigationSelection() {
private fun syncBottomNavigationSelection() {
supportFragmentManager.addOnBackStackChangedListener {
syncBottomNavigation()
}
}

fun syncBottomNavigation() {
private fun syncBottomNavigation() {
val currentFragment = supportFragmentManager.findFragmentById(R.id.fcv_main)
when (currentFragment) {
is WineyFeedFragment -> binding.bnvMain.selectedItemId = R.id.menu_feed
is RecommendFragment -> binding.bnvMain.selectedItemId = R.id.menu_recommend
is MyPageFragment -> binding.bnvMain.selectedItemId = R.id.menu_mypage
// 다른 프래그먼트도 추가가능
}
}

inline fun <reified T : Fragment> navigateTo() {
private inline fun <reified T : Fragment> navigateTo() {
supportFragmentManager.commit {
replace<T>(R.id.fcv_main, T::class.simpleName)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,12 +11,12 @@ import androidx.lifecycle.flowWithLifecycle
import com.android.go.sopt.winey.R
import com.android.go.sopt.winey.databinding.FragmentAmountBinding
import com.android.go.sopt.winey.presentation.main.feed.upload.loading.LoadingActivity
import com.android.go.sopt.winey.util.multipart.UriToRequestBody
import com.android.go.sopt.winey.util.binding.BindingFragment
import com.android.go.sopt.winey.util.context.hideKeyboard
import com.android.go.sopt.winey.util.fragment.snackBar
import com.android.go.sopt.winey.util.fragment.viewLifeCycle
import com.android.go.sopt.winey.util.fragment.viewLifeCycleScope
import com.android.go.sopt.winey.util.multipart.UriToRequestBody
import com.android.go.sopt.winey.util.view.UiState
import com.android.go.sopt.winey.util.view.setOnSingleClickListener
import dagger.hilt.android.AndroidEntryPoint
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.android.go.sopt.winey.presentation.onboarding
package com.android.go.sopt.winey.presentation.onboarding.login

import com.kakao.sdk.auth.model.OAuthToken
import com.kakao.sdk.common.model.AuthErrorCause
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package com.android.go.sopt.winey.presentation.onboarding
package com.android.go.sopt.winey.presentation.onboarding.login

import android.app.Activity
import android.content.Intent
import android.os.Bundle
import androidx.activity.viewModels
Expand All @@ -8,12 +9,14 @@ import androidx.lifecycle.lifecycleScope
import com.android.go.sopt.winey.R
import com.android.go.sopt.winey.databinding.ActivityLoginBinding
import com.android.go.sopt.winey.presentation.main.MainActivity
import com.android.go.sopt.winey.presentation.onboarding.nickname.NicknameActivity
import com.android.go.sopt.winey.util.binding.BindingActivity
import com.android.go.sopt.winey.util.context.snackBar
import com.android.go.sopt.winey.util.view.UiState
import dagger.hilt.android.AndroidEntryPoint
import kotlinx.coroutines.flow.launchIn
import kotlinx.coroutines.flow.onEach
import timber.log.Timber

@AndroidEntryPoint
class LoginActivity :
Expand All @@ -40,15 +43,15 @@ class LoginActivity :
}

is UiState.Success -> {
Timber.e("${state.data?.userId}")
Timber.e("${state.data?.accessToken}")
Timber.e("${state.data?.refreshToken}")
Timber.e("${state.data?.isRegistered}")

if (state.data?.isRegistered == true) {
val intent = Intent(this@LoginActivity, MainActivity::class.java)
startActivity(intent)
finish()
navigateTo<MainActivity>()
} else {
//TODO : isRegistered false일경우 닉네임 설정화면으로
val intent = Intent(this@LoginActivity, MainActivity::class.java)
startActivity(intent)
finish()
navigateTo<NicknameActivity>()
}
}

Expand All @@ -61,4 +64,11 @@ class LoginActivity :
}
}.launchIn(lifecycleScope)
}

private inline fun <reified T : Activity> navigateTo() {
Intent(this@LoginActivity, T::class.java).apply {
addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK or Intent.FLAG_ACTIVITY_NEW_TASK)
startActivity(this)
}
}
}
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.android.go.sopt.winey.presentation.onboarding
package com.android.go.sopt.winey.presentation.onboarding.login

import android.content.Context
import androidx.lifecycle.ViewModel
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,74 @@
package com.android.go.sopt.winey.presentation.onboarding.nickname

import android.app.Activity
import android.content.Intent
import android.os.Bundle
import android.text.Editable
import android.text.TextWatcher
import androidx.activity.viewModels
import com.android.go.sopt.winey.R
import com.android.go.sopt.winey.databinding.ActivityNicknameBinding
import com.android.go.sopt.winey.presentation.main.MainActivity
import com.android.go.sopt.winey.util.binding.BindingActivity
import com.android.go.sopt.winey.util.context.hideKeyboard
import dagger.hilt.android.AndroidEntryPoint

@AndroidEntryPoint
class NicknameActivity : BindingActivity<ActivityNicknameBinding>(R.layout.activity_nickname) {
private val viewModel by viewModels<NicknameViewModel>()

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding.vm = viewModel

initRootLayoutClickListener()
initEditTextWatcher()
initDuplicateCheckButtonClickListener()
initCompleteButtonClickListener()
}

private fun initEditTextWatcher() {
var prevText = ""
binding.etNickname.addTextChangedListener(object : TextWatcher {
override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) {}
override fun afterTextChanged(s: Editable?) {}
override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) {
val inputText = s.toString()
viewModel.updateTextChangedState(inputText.isNotBlank() && inputText != prevText)
prevText = inputText
}
})
}

private fun initDuplicateCheckButtonClickListener() {
binding.btnNicknameDuplicateCheck.setOnClickListener {
if (viewModel.isTextChanged.value) {
viewModel.apply {
updateDuplicateCheckButtonState(true)
getNicknameDuplicateCheck()
}
}
}
}

private fun initCompleteButtonClickListener() {
binding.btnNicknameComplete.setOnClickListener {
// todo: 서버에 닉네임 PATCH
navigateTo<MainActivity>()
}
}

private fun initRootLayoutClickListener() {
binding.root.setOnClickListener {
hideKeyboard(binding.root)
binding.etNickname.clearFocus()
}
}

private inline fun <reified T : Activity> navigateTo() {
Intent(this@NicknameActivity, T::class.java).apply {
addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK or Intent.FLAG_ACTIVITY_NEW_TASK)
startActivity(this)
}
}
}
Loading

0 comments on commit 0db454c

Please sign in to comment.