From 0887a7e8986179e45d5096941d8fc0bcbe4e4979 Mon Sep 17 00:00:00 2001 From: Gracia Hotmauli <95269134+hotmauligracia@users.noreply.github.com> Date: Fri, 22 Aug 2025 19:03:39 +0700 Subject: [PATCH] change password --- .../data/api/dto/ChangePasswordRequest.kt | 6 ++ .../api/response/auth/ChangePassResponse.kt | 9 +++ .../data/api/retrofit/ApiService.kt | 7 ++ .../data/repository/UserRepository.kt | 25 ++++++++ .../ui/profile/ChangePasswordActivity.kt | 64 +++++++++++++++++-- .../utils/viewmodel/ProfileViewModel.kt | 17 ++++- 6 files changed, 121 insertions(+), 7 deletions(-) create mode 100644 app/src/main/java/com/alya/ecommerce_serang/data/api/dto/ChangePasswordRequest.kt create mode 100644 app/src/main/java/com/alya/ecommerce_serang/data/api/response/auth/ChangePassResponse.kt diff --git a/app/src/main/java/com/alya/ecommerce_serang/data/api/dto/ChangePasswordRequest.kt b/app/src/main/java/com/alya/ecommerce_serang/data/api/dto/ChangePasswordRequest.kt new file mode 100644 index 0000000..ff8c646 --- /dev/null +++ b/app/src/main/java/com/alya/ecommerce_serang/data/api/dto/ChangePasswordRequest.kt @@ -0,0 +1,6 @@ +package com.alya.ecommerce_serang.data.api.dto + +data class ChangePasswordRequest( + val currentPassword: String, + val newPassword: String +) \ No newline at end of file diff --git a/app/src/main/java/com/alya/ecommerce_serang/data/api/response/auth/ChangePassResponse.kt b/app/src/main/java/com/alya/ecommerce_serang/data/api/response/auth/ChangePassResponse.kt new file mode 100644 index 0000000..7005ac6 --- /dev/null +++ b/app/src/main/java/com/alya/ecommerce_serang/data/api/response/auth/ChangePassResponse.kt @@ -0,0 +1,9 @@ +package com.alya.ecommerce_serang.data.api.response.auth + +import com.google.gson.annotations.SerializedName + +data class ChangePassResponse( + + @field:SerializedName("message") + val message: String? = null +) diff --git a/app/src/main/java/com/alya/ecommerce_serang/data/api/retrofit/ApiService.kt b/app/src/main/java/com/alya/ecommerce_serang/data/api/retrofit/ApiService.kt index cd4f41e..c2c83b6 100644 --- a/app/src/main/java/com/alya/ecommerce_serang/data/api/retrofit/ApiService.kt +++ b/app/src/main/java/com/alya/ecommerce_serang/data/api/retrofit/ApiService.kt @@ -5,6 +5,7 @@ import com.alya.ecommerce_serang.data.api.dto.AddEvidenceRequest import com.alya.ecommerce_serang.data.api.dto.AddPaymentInfoResponse import com.alya.ecommerce_serang.data.api.dto.CancelOrderReq import com.alya.ecommerce_serang.data.api.dto.CartItem +import com.alya.ecommerce_serang.data.api.dto.ChangePasswordRequest import com.alya.ecommerce_serang.data.api.dto.CityResponse import com.alya.ecommerce_serang.data.api.dto.CompletedOrderRequest import com.alya.ecommerce_serang.data.api.dto.ConfirmPaymentRequest @@ -27,6 +28,7 @@ import com.alya.ecommerce_serang.data.api.dto.StoreAddressResponse import com.alya.ecommerce_serang.data.api.dto.UpdateCart import com.alya.ecommerce_serang.data.api.dto.UpdateChatRequest import com.alya.ecommerce_serang.data.api.dto.VerifRegisReq +import com.alya.ecommerce_serang.data.api.response.auth.ChangePassResponse import com.alya.ecommerce_serang.data.api.response.auth.CheckStoreResponse import com.alya.ecommerce_serang.data.api.response.auth.FcmTokenResponse import com.alya.ecommerce_serang.data.api.response.auth.HasStoreResponse @@ -530,6 +532,11 @@ interface ApiService { @Body request: ResetPassReq ): Response + @POST("changepass") + suspend fun changePassword( + @Body request: ChangePasswordRequest + ): Response + @GET("profile/address/detail/{id}") suspend fun getDetailAddress( @Path("id") addressId: Int diff --git a/app/src/main/java/com/alya/ecommerce_serang/data/repository/UserRepository.kt b/app/src/main/java/com/alya/ecommerce_serang/data/repository/UserRepository.kt index bf7f317..9f233d0 100644 --- a/app/src/main/java/com/alya/ecommerce_serang/data/repository/UserRepository.kt +++ b/app/src/main/java/com/alya/ecommerce_serang/data/repository/UserRepository.kt @@ -3,6 +3,7 @@ package com.alya.ecommerce_serang.data.repository import android.content.Context import android.net.Uri import android.util.Log +import com.alya.ecommerce_serang.data.api.dto.ChangePasswordRequest import com.alya.ecommerce_serang.data.api.dto.FcmReq import com.alya.ecommerce_serang.data.api.dto.LoginRequest import com.alya.ecommerce_serang.data.api.dto.OtpRequest @@ -10,6 +11,7 @@ import com.alya.ecommerce_serang.data.api.dto.RegisterRequest import com.alya.ecommerce_serang.data.api.dto.ResetPassReq import com.alya.ecommerce_serang.data.api.dto.UserProfile import com.alya.ecommerce_serang.data.api.dto.VerifRegisReq +import com.alya.ecommerce_serang.data.api.response.auth.ChangePassResponse import com.alya.ecommerce_serang.data.api.response.auth.FcmTokenResponse import com.alya.ecommerce_serang.data.api.response.auth.HasStoreResponse import com.alya.ecommerce_serang.data.api.response.auth.ListStoreTypeResponse @@ -516,6 +518,29 @@ class UserRepository(private val apiService: ApiService) { Result.Error(e) } } + + suspend fun changePassword(currentPassword: String, newPassword: String): Result { + return try { + val request = ChangePasswordRequest(currentPassword, newPassword) + val response = apiService.changePassword(request) // Make the API call + + if (response.isSuccessful) { + val changePassResponse = response.body() + if (changePassResponse != null) { + Result.Success(changePassResponse) // Return success with the response message + } else { + Result.Error(Exception("Empty response from server")) + } + } else { + val errorBody = response.errorBody()?.string() ?: "Unknown error" + Log.e(TAG, "Error changing password: $errorBody") + Result.Error(Exception(errorBody)) + } + } catch (e: Exception) { + Result.Error(e) + } + } + companion object{ private const val TAG = "UserRepository" } diff --git a/app/src/main/java/com/alya/ecommerce_serang/ui/profile/ChangePasswordActivity.kt b/app/src/main/java/com/alya/ecommerce_serang/ui/profile/ChangePasswordActivity.kt index cd331f1..946b39e 100644 --- a/app/src/main/java/com/alya/ecommerce_serang/ui/profile/ChangePasswordActivity.kt +++ b/app/src/main/java/com/alya/ecommerce_serang/ui/profile/ChangePasswordActivity.kt @@ -1,21 +1,73 @@ package com.alya.ecommerce_serang.ui.profile import android.os.Bundle +import android.widget.Toast import androidx.activity.enableEdgeToEdge +import androidx.activity.viewModels import androidx.appcompat.app.AppCompatActivity import androidx.core.view.ViewCompat import androidx.core.view.WindowInsetsCompat +import androidx.lifecycle.Observer import com.alya.ecommerce_serang.R +import com.alya.ecommerce_serang.data.api.retrofit.ApiConfig +import com.alya.ecommerce_serang.data.api.retrofit.ApiService +import com.alya.ecommerce_serang.data.repository.Result +import com.alya.ecommerce_serang.data.repository.UserRepository +import com.alya.ecommerce_serang.databinding.ActivityChangePasswordBinding +import com.alya.ecommerce_serang.utils.BaseViewModelFactory +import com.alya.ecommerce_serang.utils.SessionManager +import com.alya.ecommerce_serang.utils.viewmodel.ProfileViewModel +import kotlin.getValue class ChangePasswordActivity : AppCompatActivity() { + private lateinit var binding: ActivityChangePasswordBinding + private lateinit var apiService: ApiService + private lateinit var sessionManager: SessionManager + + private val viewModel: ProfileViewModel by viewModels { + BaseViewModelFactory { + apiService = ApiConfig.getApiService(sessionManager) + val userRepository = UserRepository(apiService) + ProfileViewModel(userRepository) + } + } + override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - enableEdgeToEdge() - setContentView(R.layout.activity_change_password) - ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main)) { v, insets -> - val systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars()) - v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom) - insets + binding = ActivityChangePasswordBinding.inflate(layoutInflater) + setContentView(binding.root) + + sessionManager = SessionManager(this) + + // Listen for the result of the password change + viewModel.changePasswordResult.observe(this, Observer { result -> + when (result) { + is Result.Error -> { + Toast.makeText( + this, + "Gagal mengubah kata sandi: ${result.exception.message}", + Toast.LENGTH_SHORT + ).show() + } + is Result.Success -> { + Toast.makeText(this, "Berhasil mengubah kata sandi", Toast.LENGTH_SHORT).show() + finish() + } + is Result.Loading -> {} + } + }) + + // Button to trigger password change + binding.btnChangePass.setOnClickListener { + val currentPassword = binding.etLoginPassword.text.toString() + val newPassword = binding.etLoginNewPassword.text.toString() + + if (currentPassword.isNotEmpty() && newPassword.isNotEmpty()) { + // Call change password function from ViewModel + viewModel.changePassword(currentPassword, newPassword) + } else { + Toast.makeText(this, "Lengkapi data", Toast.LENGTH_SHORT).show() + } } } } \ No newline at end of file diff --git a/app/src/main/java/com/alya/ecommerce_serang/utils/viewmodel/ProfileViewModel.kt b/app/src/main/java/com/alya/ecommerce_serang/utils/viewmodel/ProfileViewModel.kt index 6e56947..c03cf94 100644 --- a/app/src/main/java/com/alya/ecommerce_serang/utils/viewmodel/ProfileViewModel.kt +++ b/app/src/main/java/com/alya/ecommerce_serang/utils/viewmodel/ProfileViewModel.kt @@ -8,6 +8,7 @@ import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import com.alya.ecommerce_serang.data.api.dto.UserProfile +import com.alya.ecommerce_serang.data.api.response.auth.ChangePassResponse import com.alya.ecommerce_serang.data.api.response.auth.HasStoreResponse import com.alya.ecommerce_serang.data.api.response.customer.profile.EditProfileResponse import com.alya.ecommerce_serang.data.repository.Result @@ -26,7 +27,7 @@ class ProfileViewModel(private val userRepository: UserRepository) : ViewModel() private val _checkStore = MutableLiveData() val checkStore: LiveData = _checkStore - + val changePasswordResult = MutableLiveData>() private val _logout = MutableLiveData() val logout : LiveData = _logout @@ -110,6 +111,20 @@ class ProfileViewModel(private val userRepository: UserRepository) : ViewModel() } } + fun changePassword(currentPassword: String, newPassword: String) { + viewModelScope.launch { + try { + // Call the repository to change the password + val result = userRepository.changePassword(currentPassword, newPassword) + + // Post the result (success or error) to LiveData + changePasswordResult.postValue(result) + } catch (e: Exception) { + // Handle any unexpected errors + changePasswordResult.postValue(Result.Error(e)) + } + } + } companion object { private const val TAG = "ProfileViewModel"