Skip to content

Commit

Permalink
[feat] #7 modify password
Browse files Browse the repository at this point in the history
  • Loading branch information
Sangwook123 committed May 3, 2024
1 parent 8b3d6d0 commit 3fc1651
Show file tree
Hide file tree
Showing 5 changed files with 244 additions and 1 deletion.
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
package org.sopt.mypage.modifypassword

data class ModifyPasswordState(
val previousPassword: String = "",
val newPassword: String = "",
val newPasswordVerification: String = "",
)

sealed interface ModifyPasswordSideEffect {
data class ShowSnackbar(val msg: String) : ModifyPasswordSideEffect
data object ModifySuccess : ModifyPasswordSideEffect
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,78 @@
package org.sopt.mypage.modifypassword

import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.core.widget.doAfterTextChanged
import androidx.fragment.app.Fragment
import androidx.fragment.app.viewModels
import androidx.navigation.fragment.findNavController
import dagger.hilt.android.AndroidEntryPoint
import org.orbitmvi.orbit.viewmodel.observe
import org.sopt.mypage.MypageSideEffect
import org.sopt.mypage.MypageState
import org.sopt.mypage.databinding.FragmentModifyPasswordBinding
import org.sopt.ui.fragment.snackBar

@AndroidEntryPoint
class ModifyPasswordFragment : Fragment() {
private var _binding: FragmentModifyPasswordBinding? = null
private val binding: FragmentModifyPasswordBinding
get() = requireNotNull(_binding)

private val viewModel by viewModels<ModifyPasswordViewModel>()

override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?,
): View? {
_binding = FragmentModifyPasswordBinding.inflate(inflater, container, false)
return binding.root
}

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
initValueChangedListener()
modifyPassword()
collectState()
}

private fun collectState() {
viewModel.observe(viewLifecycleOwner, sideEffect = ::handleSideEffect)
}

private fun handleSideEffect(sideEffect: ModifyPasswordSideEffect) {
when (sideEffect) {
ModifyPasswordSideEffect.ModifySuccess -> {
findNavController().navigateUp()
}
is ModifyPasswordSideEffect.ShowSnackbar -> {
snackBar(binding.root){ sideEffect.msg }
}
}
}
private fun modifyPassword() {
binding.btnModifyPassword.setOnClickListener {
viewModel.modifyPassword()
}
}

private fun initValueChangedListener() {
binding.etModifyPrevious.doAfterTextChanged {
viewModel.updatePreviousPassword(it.toString())
}
binding.etModifyNew.doAfterTextChanged {
viewModel.updateNewPassword(it.toString())
}
binding.etModifyVerification.doAfterTextChanged {
viewModel.updateNewPasswordVerification(it.toString())
}
}

override fun onDestroyView() {
_binding = null
super.onDestroyView()
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
package org.sopt.mypage.modifypassword

import android.util.Log
import androidx.lifecycle.ViewModel
import dagger.hilt.android.lifecycle.HiltViewModel
import org.orbitmvi.orbit.Container
import org.orbitmvi.orbit.ContainerHost
import org.orbitmvi.orbit.syntax.simple.intent
import org.orbitmvi.orbit.syntax.simple.postSideEffect
import org.orbitmvi.orbit.viewmodel.container
import org.sopt.domain.repo.AuthRepository
import org.sopt.ui.orbit.updateState
import javax.inject.Inject

@HiltViewModel
class ModifyPasswordViewModel @Inject constructor(
private val authRepository: AuthRepository,
) : ContainerHost<ModifyPasswordState, ModifyPasswordSideEffect>, ViewModel() {
override val container: Container<ModifyPasswordState, ModifyPasswordSideEffect> = container(
ModifyPasswordState()
)

fun modifyPassword() = intent {
authRepository.patchPassword(
state.previousPassword,
state.newPassword,
state.newPasswordVerification
)
.onSuccess {
if (it.code !in 200..299) {
postSideEffect(ModifyPasswordSideEffect.ShowSnackbar(it.message))
} else {
postSideEffect(ModifyPasswordSideEffect.ModifySuccess)
}
}
.onFailure {
Log.e("error", it.message.toString())
}
}

fun updatePreviousPassword(query: String) = updateState {
copy(previousPassword = query)
}

fun updateNewPassword(query: String) = updateState {
copy(newPassword = query)
}

fun updateNewPasswordVerification(query: String) = updateState {
copy(newPasswordVerification = query)
}

}
90 changes: 90 additions & 0 deletions feature/mypage/src/main/res/layout/fragment_modify_password.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,90 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/main"
android:layout_width="match_parent"
android:layout_height="match_parent">

<TextView
android:id="@+id/tv_modify_title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="30dp"
android:text="비번 변경"
android:textSize="30sp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />

<TextView
android:id="@+id/tv_modify_previous"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="20dp"
android:layout_marginTop="40dp"
android:text="옛날 비번"
android:textSize="20sp"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/tv_modify_title" />

<EditText
android:id="@+id/et_modify_previous"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginHorizontal="20dp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/tv_modify_previous" />

<TextView
android:id="@+id/tv_modify_new"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="20dp"
android:layout_marginTop="40dp"
android:text="바꿀 비번"
android:textSize="20sp"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/et_modify_previous" />

<EditText
android:id="@+id/et_modify_new"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginHorizontal="20dp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/tv_modify_new" />

<TextView
android:id="@+id/tv_modify_verification"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="20dp"
android:layout_marginTop="40dp"
android:text="비번 확인"
android:textSize="20sp"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/et_modify_new" />

<EditText
android:id="@+id/et_modify_verification"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginHorizontal="20dp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/tv_modify_verification" />

<Button
android:id="@+id/btn_modify_password"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_margin="20dp"
android:text="비번 변경"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintBottom_toBottomOf="parent" />

</androidx.constraintlayout.widget.ConstraintLayout>
Original file line number Diff line number Diff line change
Expand Up @@ -9,5 +9,15 @@
android:id="@+id/navigation_mypage"
android:name="org.sopt.mypage.MypageFragment"
android:label="fragment_mypage"
tools:layout="@layout/fragment_mypage" />
tools:layout="@layout/fragment_mypage" >
<action
android:id="@+id/action_navigation_mypage_to_navigation_modify_password"
app:destination="@id/navigation_modify_password" />
</fragment>

<fragment
android:id="@+id/navigation_modify_password"
android:name="org.sopt.mypage.modifypassword.ModifyPasswordFragment"
android:label="fragment_modify_password"
tools:layout="@layout/fragment_modify_password" />
</navigation>

0 comments on commit 3fc1651

Please sign in to comment.