mirror of
https://github.com/shaulascr/ecommerce_serang.git
synced 2025-12-15 23:51:01 +00:00
fix fcm and update toast
This commit is contained in:
@ -124,4 +124,7 @@ dependencies {
|
|||||||
implementation(platform("com.google.firebase:firebase-bom:33.13.0"))
|
implementation(platform("com.google.firebase:firebase-bom:33.13.0"))
|
||||||
implementation("com.google.firebase:firebase-analytics")
|
implementation("com.google.firebase:firebase-analytics")
|
||||||
implementation("com.google.firebase:firebase-messaging-ktx")
|
implementation("com.google.firebase:firebase-messaging-ktx")
|
||||||
|
|
||||||
|
//Splash screen
|
||||||
|
implementation("androidx.core:core-splashscreen:1.0.0")
|
||||||
}
|
}
|
||||||
|
|||||||
@ -72,7 +72,7 @@ class LoginActivity : AppCompatActivity() {
|
|||||||
val password = binding.etLoginPassword.text.toString()
|
val password = binding.etLoginPassword.text.toString()
|
||||||
|
|
||||||
if (email.isEmpty() || password.isEmpty()) {
|
if (email.isEmpty() || password.isEmpty()) {
|
||||||
Toast.makeText(this, "Please fill in all fields", Toast.LENGTH_SHORT).show()
|
Toast.makeText(this, "Mohon masukkan email atau password dengan benar", Toast.LENGTH_SHORT).show()
|
||||||
} else {
|
} else {
|
||||||
loginViewModel.login(email, password)
|
loginViewModel.login(email, password)
|
||||||
}
|
}
|
||||||
@ -100,14 +100,14 @@ class LoginActivity : AppCompatActivity() {
|
|||||||
retrieveFCMToken()
|
retrieveFCMToken()
|
||||||
// sessionManager.saveUserId(response.userId)
|
// sessionManager.saveUserId(response.userId)
|
||||||
|
|
||||||
Toast.makeText(this, "Login Successful", Toast.LENGTH_SHORT).show()
|
Toast.makeText(this, "Berhasil masuk", Toast.LENGTH_SHORT).show()
|
||||||
|
|
||||||
startActivity(Intent(this, MainActivity::class.java))
|
startActivity(Intent(this, MainActivity::class.java))
|
||||||
finish()
|
finish()
|
||||||
}
|
}
|
||||||
is com.alya.ecommerce_serang.data.repository.Result.Error -> {
|
is com.alya.ecommerce_serang.data.repository.Result.Error -> {
|
||||||
Log.e("LoginActivity", "Login Failed: ${result.exception.message}")
|
Log.e("LoginActivity", "Login Failed: ${result.exception.message}")
|
||||||
Toast.makeText(this, "Login Failed: ${result.exception.message}", Toast.LENGTH_LONG).show()
|
Toast.makeText(this, "Gagal masuk", Toast.LENGTH_LONG).show()
|
||||||
}
|
}
|
||||||
is Result.Loading -> {
|
is Result.Loading -> {
|
||||||
// Show loading state
|
// Show loading state
|
||||||
|
|||||||
@ -29,7 +29,7 @@ class OtpBottomSheetDialog(
|
|||||||
onRegister(updatedUserData) // Send full data to ViewModel
|
onRegister(updatedUserData) // Send full data to ViewModel
|
||||||
dismiss() // Close dialog
|
dismiss() // Close dialog
|
||||||
} else {
|
} else {
|
||||||
Toast.makeText(requireContext(), "Please enter OTP", Toast.LENGTH_SHORT).show()
|
Toast.makeText(requireContext(), "Silahkan masukkan kode OTP", Toast.LENGTH_SHORT).show()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return view
|
return view
|
||||||
|
|||||||
@ -86,7 +86,6 @@ class RegisterActivity : AppCompatActivity() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// navigate step register in fragment
|
|
||||||
fun navigateToStep(step: Int, userData: RegisterRequest?) {
|
fun navigateToStep(step: Int, userData: RegisterRequest?) {
|
||||||
val fragment = when (step) {
|
val fragment = when (step) {
|
||||||
1 -> RegisterStep1Fragment.newInstance()
|
1 -> RegisterStep1Fragment.newInstance()
|
||||||
|
|||||||
@ -111,7 +111,7 @@ class ResetPassActivity : AppCompatActivity() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private fun handleError(errorMessage: String) {
|
private fun handleError(errorMessage: String) {
|
||||||
Toast.makeText(this, "Error: $errorMessage", Toast.LENGTH_LONG).show()
|
Log.e(TAG, "Error: $errorMessage")
|
||||||
|
|
||||||
// Optionally show error dialog
|
// Optionally show error dialog
|
||||||
AlertDialog.Builder(this)
|
AlertDialog.Builder(this)
|
||||||
|
|||||||
@ -155,19 +155,20 @@ class RegisterStep1Fragment : Fragment() {
|
|||||||
"email" -> {
|
"email" -> {
|
||||||
isEmailValid = isValid
|
isEmailValid = isValid
|
||||||
if (!isValid) {
|
if (!isValid) {
|
||||||
Toast.makeText(requireContext(), "Email is already registered", Toast.LENGTH_SHORT).show()
|
Toast.makeText(requireContext(), "Email sudah digunakan. Gunakan email lainnya.", Toast.LENGTH_SHORT).show()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
"phone" -> {
|
"phone" -> {
|
||||||
isPhoneValid = isValid
|
isPhoneValid = isValid
|
||||||
if (!isValid) {
|
if (!isValid) {
|
||||||
Toast.makeText(requireContext(), "Phone number is already registered", Toast.LENGTH_SHORT).show()
|
Toast.makeText(requireContext(), "Nomor handphone sudah digunakan. Gunakan nomor lainnya. ", Toast.LENGTH_SHORT).show()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
is com.alya.ecommerce_serang.data.repository.Result.Error -> {
|
is com.alya.ecommerce_serang.data.repository.Result.Error -> {
|
||||||
Toast.makeText(requireContext(), "Validation failed: ${result.exception.message}", Toast.LENGTH_SHORT).show()
|
Toast.makeText(requireContext(), "Gagal melakukan validasi", Toast.LENGTH_SHORT).show()
|
||||||
|
Log.e(TAG, "Validation failed: ${result.exception.message}")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -200,7 +201,8 @@ class RegisterStep1Fragment : Fragment() {
|
|||||||
is Result.Error -> {
|
is Result.Error -> {
|
||||||
binding.progressBar.visibility = View.GONE
|
binding.progressBar.visibility = View.GONE
|
||||||
binding.btnNext.isEnabled = true
|
binding.btnNext.isEnabled = true
|
||||||
Toast.makeText(requireContext(), "OTP Request Failed: ${result.exception.message}", Toast.LENGTH_SHORT).show()
|
Log.e(TAG, "OTP Request Failed: ${result.exception.message}")
|
||||||
|
Toast.makeText(requireContext(), "Gagal mendapatkan OTP. Kirim ulang OTP", Toast.LENGTH_SHORT).show()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -229,13 +231,13 @@ class RegisterStep1Fragment : Fragment() {
|
|||||||
// Check if all fields are filled
|
// Check if all fields are filled
|
||||||
if (email.isEmpty() || password.isEmpty() || confirmPassword.isEmpty() || phone.isEmpty() ||
|
if (email.isEmpty() || password.isEmpty() || confirmPassword.isEmpty() || phone.isEmpty() ||
|
||||||
username.isEmpty() || fullName.isEmpty() || birthDate.isEmpty()) {
|
username.isEmpty() || fullName.isEmpty() || birthDate.isEmpty()) {
|
||||||
Toast.makeText(requireContext(), "Please fill all required fields", Toast.LENGTH_SHORT).show()
|
Toast.makeText(requireContext(), "Silahkan lengkapi seluruh isian", Toast.LENGTH_SHORT).show()
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
// Check if passwords match
|
// Check if passwords match
|
||||||
if (password != confirmPassword) {
|
if (password != confirmPassword) {
|
||||||
Toast.makeText(requireContext(), "Passwords do not match", Toast.LENGTH_SHORT).show()
|
Toast.makeText(requireContext(), "Konfirmasi kata sandi tidak sesua. Periksa kembali", Toast.LENGTH_SHORT).show()
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -253,7 +255,7 @@ class RegisterStep1Fragment : Fragment() {
|
|||||||
if (isEmailValid && isPhoneValid) {
|
if (isEmailValid && isPhoneValid) {
|
||||||
requestOtp(email)
|
requestOtp(email)
|
||||||
} else {
|
} else {
|
||||||
Toast.makeText(requireContext(), "Please fix validation errors before proceeding", Toast.LENGTH_SHORT).show()
|
Toast.makeText(requireContext(), "Silahkan perbaiki data yang dimasukkan", Toast.LENGTH_SHORT).show()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -1,5 +1,6 @@
|
|||||||
package com.alya.ecommerce_serang.ui.auth.fragments
|
package com.alya.ecommerce_serang.ui.auth.fragments
|
||||||
|
|
||||||
|
import android.content.Context
|
||||||
import android.os.Build
|
import android.os.Build
|
||||||
import android.os.Bundle
|
import android.os.Bundle
|
||||||
import android.os.CountDownTimer
|
import android.os.CountDownTimer
|
||||||
@ -13,6 +14,7 @@ import androidx.core.content.ContextCompat
|
|||||||
import androidx.fragment.app.Fragment
|
import androidx.fragment.app.Fragment
|
||||||
import androidx.fragment.app.activityViewModels
|
import androidx.fragment.app.activityViewModels
|
||||||
import com.alya.ecommerce_serang.R
|
import com.alya.ecommerce_serang.R
|
||||||
|
import com.alya.ecommerce_serang.data.api.dto.FcmReq
|
||||||
import com.alya.ecommerce_serang.data.api.dto.RegisterRequest
|
import com.alya.ecommerce_serang.data.api.dto.RegisterRequest
|
||||||
import com.alya.ecommerce_serang.data.api.retrofit.ApiConfig
|
import com.alya.ecommerce_serang.data.api.retrofit.ApiConfig
|
||||||
import com.alya.ecommerce_serang.data.repository.OrderRepository
|
import com.alya.ecommerce_serang.data.repository.OrderRepository
|
||||||
@ -24,6 +26,7 @@ import com.alya.ecommerce_serang.utils.BaseViewModelFactory
|
|||||||
import com.alya.ecommerce_serang.utils.SessionManager
|
import com.alya.ecommerce_serang.utils.SessionManager
|
||||||
import com.alya.ecommerce_serang.utils.viewmodel.RegisterViewModel
|
import com.alya.ecommerce_serang.utils.viewmodel.RegisterViewModel
|
||||||
import com.google.android.material.progressindicator.LinearProgressIndicator
|
import com.google.android.material.progressindicator.LinearProgressIndicator
|
||||||
|
import com.google.firebase.messaging.FirebaseMessaging
|
||||||
|
|
||||||
class RegisterStep2Fragment : Fragment() {
|
class RegisterStep2Fragment : Fragment() {
|
||||||
private var _binding: FragmentRegisterStep2Binding? = null
|
private var _binding: FragmentRegisterStep2Binding? = null
|
||||||
@ -109,6 +112,10 @@ class RegisterStep2Fragment : Fragment() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
binding.btnBack.setOnClickListener {
|
||||||
|
parentFragmentManager.popBackStack()
|
||||||
|
}
|
||||||
|
|
||||||
observeRegistrationState()
|
observeRegistrationState()
|
||||||
observeLoginState()
|
observeLoginState()
|
||||||
Log.d(TAG, "Registration and login state observers set up")
|
Log.d(TAG, "Registration and login state observers set up")
|
||||||
@ -129,11 +136,6 @@ class RegisterStep2Fragment : Fragment() {
|
|||||||
Log.d(TAG, "Updating user data with OTP: $otp")
|
Log.d(TAG, "Updating user data with OTP: $otp")
|
||||||
registerViewModel.updateUserData(updatedUserData)
|
registerViewModel.updateUserData(updatedUserData)
|
||||||
|
|
||||||
// For demo purposes, we're just proceeding to Step 3
|
|
||||||
// In a real app, you would verify the OTP with the server first
|
|
||||||
// registerViewModel.setStep(3)
|
|
||||||
// (activity as? RegisterActivity)?.navigateToStep(3, updatedUserData)
|
|
||||||
|
|
||||||
registerViewModel.registerUser(updatedUserData)
|
registerViewModel.registerUser(updatedUserData)
|
||||||
} ?: Log.e(TAG, "userData is null, cannot proceed with verification")
|
} ?: Log.e(TAG, "userData is null, cannot proceed with verification")
|
||||||
}
|
}
|
||||||
@ -250,6 +252,8 @@ class RegisterStep2Fragment : Fragment() {
|
|||||||
// Save the token in fragment
|
// Save the token in fragment
|
||||||
val accessToken = result.data.accessToken
|
val accessToken = result.data.accessToken
|
||||||
sessionManager.saveToken(accessToken)
|
sessionManager.saveToken(accessToken)
|
||||||
|
retrieveFCMToken()
|
||||||
|
|
||||||
Log.d(TAG, "Token saved to SessionManager: $accessToken")
|
Log.d(TAG, "Token saved to SessionManager: $accessToken")
|
||||||
|
|
||||||
// Proceed to Step 3
|
// Proceed to Step 3
|
||||||
@ -279,6 +283,37 @@ class RegisterStep2Fragment : Fragment() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private fun retrieveFCMToken() {
|
||||||
|
FirebaseMessaging.getInstance().token
|
||||||
|
.addOnCompleteListener { task ->
|
||||||
|
if (!task.isSuccessful) {
|
||||||
|
Log.e(TAG, "Failed to get FCM token", task.exception)
|
||||||
|
return@addOnCompleteListener
|
||||||
|
}
|
||||||
|
|
||||||
|
val token = task.result
|
||||||
|
// tokenTes = token
|
||||||
|
Log.d(TAG, "FCM token retrieved: $token")
|
||||||
|
|
||||||
|
// Save token locally
|
||||||
|
val sharedPreferences = requireContext().getSharedPreferences("FCM_PREFS", Context.MODE_PRIVATE)
|
||||||
|
sharedPreferences.edit().putString("FCM_TOKEN", token).apply()
|
||||||
|
|
||||||
|
// Send to your server
|
||||||
|
sendTokenToServer(token)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun sendTokenToServer(token: String) {
|
||||||
|
Log.d(TAG, "Would send token to server: $token")
|
||||||
|
val tokenFcm=FcmReq(
|
||||||
|
fcmToken = token
|
||||||
|
)
|
||||||
|
registerViewModel.sendFcm(tokenFcm)
|
||||||
|
Log.d(TAG, "Sent token fcm: $token")
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
override fun onDestroyView() {
|
override fun onDestroyView() {
|
||||||
super.onDestroyView()
|
super.onDestroyView()
|
||||||
countDownTimer?.cancel()
|
countDownTimer?.cancel()
|
||||||
|
|||||||
@ -104,11 +104,20 @@ class RegisterStep3Fragment : Fragment() {
|
|||||||
// Set up button listeners
|
// Set up button listeners
|
||||||
binding.btnPrevious.setOnClickListener {
|
binding.btnPrevious.setOnClickListener {
|
||||||
// Go back to the previous step
|
// Go back to the previous step
|
||||||
parentFragmentManager.popBackStack()
|
// parentFragmentManager.popBackStack()
|
||||||
|
// (activity as? RegisterActivity)?.navigateToStep(2, null)
|
||||||
|
// (activity as? RegisterActivity)?.goBackToPreviousStep()
|
||||||
|
|
||||||
|
// Option 2: Direct navigation to step 1
|
||||||
|
val step2Fragment = RegisterStep2Fragment()
|
||||||
|
parentFragmentManager.beginTransaction()
|
||||||
|
.replace(R.id.fragment_container, step2Fragment)
|
||||||
|
.commit()
|
||||||
}
|
}
|
||||||
|
|
||||||
binding.btnRegister.setOnClickListener {
|
binding.btnRegister.setOnClickListener {
|
||||||
submitAddress()
|
submitAddress()
|
||||||
|
sessionManager.clearAll()
|
||||||
}
|
}
|
||||||
|
|
||||||
// If user skips address entry
|
// If user skips address entry
|
||||||
@ -503,7 +512,7 @@ class RegisterStep3Fragment : Fragment() {
|
|||||||
|
|
||||||
private fun showRegistrationSuccess() {
|
private fun showRegistrationSuccess() {
|
||||||
// Now we can show the success message for the overall registration process
|
// Now we can show the success message for the overall registration process
|
||||||
Toast.makeText(requireContext(), "Registration completed successfully!", Toast.LENGTH_LONG).show()
|
Toast.makeText(requireContext(), "Berhasil mendaftarkan akun", Toast.LENGTH_LONG).show()
|
||||||
|
|
||||||
// Navigate to login screen
|
// Navigate to login screen
|
||||||
startActivity(Intent(requireContext(), LoginActivity::class.java))
|
startActivity(Intent(requireContext(), LoginActivity::class.java))
|
||||||
@ -521,4 +530,5 @@ class RegisterStep3Fragment : Fragment() {
|
|||||||
ViewCompat.setWindowInsetsAnimationCallback(binding.root, null)
|
ViewCompat.setWindowInsetsAnimationCallback(binding.root, null)
|
||||||
_binding = null
|
_binding = null
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
@ -41,11 +41,16 @@ class CartActivity : AppCompatActivity() {
|
|||||||
}
|
}
|
||||||
override fun onCreate(savedInstanceState: Bundle?) {
|
override fun onCreate(savedInstanceState: Bundle?) {
|
||||||
super.onCreate(savedInstanceState)
|
super.onCreate(savedInstanceState)
|
||||||
|
sessionManager = SessionManager(this)
|
||||||
|
apiService = ApiConfig.getApiService(sessionManager)
|
||||||
|
|
||||||
|
|
||||||
binding = ActivityCartBinding.inflate(layoutInflater)
|
binding = ActivityCartBinding.inflate(layoutInflater)
|
||||||
setContentView(binding.root)
|
setContentView(binding.root)
|
||||||
|
|
||||||
sessionManager = SessionManager(this)
|
if (!sessionManager.isLoggedIn()){
|
||||||
apiService = ApiConfig.getApiService(sessionManager)
|
binding.emptyCart.text = "Silahkan masuk terlebih dahulu"
|
||||||
|
}
|
||||||
|
|
||||||
WindowCompat.setDecorFitsSystemWindows(window, false)
|
WindowCompat.setDecorFitsSystemWindows(window, false)
|
||||||
|
|
||||||
@ -118,7 +123,7 @@ class CartActivity : AppCompatActivity() {
|
|||||||
// Start checkout with the prepared items
|
// Start checkout with the prepared items
|
||||||
startCheckoutWithWholesaleInfo(selectedItems)
|
startCheckoutWithWholesaleInfo(selectedItems)
|
||||||
} else {
|
} else {
|
||||||
Toast.makeText(this, "Please select items from a single store only", Toast.LENGTH_SHORT).show()
|
Toast.makeText(this, "Pilih produk yang sama dengan toko", Toast.LENGTH_SHORT).show()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
@ -124,7 +124,7 @@ class ChatActivity : AppCompatActivity() {
|
|||||||
|
|
||||||
if (token.isEmpty()) {
|
if (token.isEmpty()) {
|
||||||
// User not logged in, redirect to login
|
// User not logged in, redirect to login
|
||||||
Toast.makeText(this, "Please login first", Toast.LENGTH_SHORT).show()
|
Toast.makeText(this, "Silahkan masuk terlebih dahulu", Toast.LENGTH_SHORT).show()
|
||||||
startActivity(Intent(this, LoginActivity::class.java))
|
startActivity(Intent(this, LoginActivity::class.java))
|
||||||
finish()
|
finish()
|
||||||
return
|
return
|
||||||
@ -506,7 +506,7 @@ class ChatActivity : AppCompatActivity() {
|
|||||||
}
|
}
|
||||||
startActivity(intent)
|
startActivity(intent)
|
||||||
} catch (e: Exception) {
|
} catch (e: Exception) {
|
||||||
Toast.makeText(this, "Cannot open product details", Toast.LENGTH_SHORT).show()
|
Toast.makeText(this, "Gagal memuat produk", Toast.LENGTH_SHORT).show()
|
||||||
Log.e(TAG, "Error navigating to product detail", e)
|
Log.e(TAG, "Error navigating to product detail", e)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -622,7 +622,7 @@ class ChatActivity : AppCompatActivity() {
|
|||||||
if (outputFile.exists() && outputFile.length() > 0) {
|
if (outputFile.exists() && outputFile.length() > 0) {
|
||||||
if (outputFile.length() > 5 * 1024 * 1024) {
|
if (outputFile.length() > 5 * 1024 * 1024) {
|
||||||
Log.e(TAG, "File too large: ${outputFile.length()} bytes")
|
Log.e(TAG, "File too large: ${outputFile.length()} bytes")
|
||||||
Toast.makeText(this, "Image too large (max 5MB)", Toast.LENGTH_SHORT).show()
|
Toast.makeText(this, "Gambar terlalu besar. Maksimal 1MB", Toast.LENGTH_SHORT).show()
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -5,7 +5,6 @@ import android.util.Log
|
|||||||
import android.view.LayoutInflater
|
import android.view.LayoutInflater
|
||||||
import android.view.View
|
import android.view.View
|
||||||
import android.view.ViewGroup
|
import android.view.ViewGroup
|
||||||
import android.widget.Toast
|
|
||||||
import androidx.fragment.app.Fragment
|
import androidx.fragment.app.Fragment
|
||||||
import androidx.fragment.app.viewModels
|
import androidx.fragment.app.viewModels
|
||||||
import com.alya.ecommerce_serang.data.api.retrofit.ApiConfig
|
import com.alya.ecommerce_serang.data.api.retrofit.ApiConfig
|
||||||
@ -80,8 +79,10 @@ class ChatListFragment : Fragment() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
is Result.Error -> {
|
is Result.Error -> {
|
||||||
binding.tvEmptyChat.visibility = View.VISIBLE
|
// binding.tvEmptyChat.visibility = View.VISIBLE
|
||||||
Toast.makeText(requireContext(), "Failed to load chats", Toast.LENGTH_SHORT).show()
|
binding.progressBarChat.visibility = View.VISIBLE
|
||||||
|
// Toast.makeText(requireContext(), "Failed to load chats", Toast.LENGTH_SHORT).show()
|
||||||
|
Log.e(TAG, "Failed to load chats")
|
||||||
}
|
}
|
||||||
Result.Loading -> {
|
Result.Loading -> {
|
||||||
binding.progressBarChat.visibility = View.VISIBLE
|
binding.progressBarChat.visibility = View.VISIBLE
|
||||||
|
|||||||
@ -78,4 +78,4 @@ import com.google.firebase.messaging.RemoteMessage
|
|||||||
val notificationId = System.currentTimeMillis().toInt()
|
val notificationId = System.currentTimeMillis().toInt()
|
||||||
notificationManager.notify(notificationId, notificationBuilder.build())
|
notificationManager.notify(notificationId, notificationBuilder.build())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -196,7 +196,7 @@ class CheckoutActivity : AppCompatActivity() {
|
|||||||
// Observe order creation
|
// Observe order creation
|
||||||
viewModel.orderCreated.observe(this) { created ->
|
viewModel.orderCreated.observe(this) { created ->
|
||||||
if (created) {
|
if (created) {
|
||||||
Toast.makeText(this, "Order successfully created!", Toast.LENGTH_SHORT).show()
|
Toast.makeText(this, "Berhasil membuat pesanan", Toast.LENGTH_SHORT).show()
|
||||||
setResult(RESULT_OK)
|
setResult(RESULT_OK)
|
||||||
finish()
|
finish()
|
||||||
}
|
}
|
||||||
@ -206,10 +206,12 @@ class CheckoutActivity : AppCompatActivity() {
|
|||||||
private fun setupPaymentMethodsRecyclerView(paymentMethods: List<DetailPaymentItem>) {
|
private fun setupPaymentMethodsRecyclerView(paymentMethods: List<DetailPaymentItem>) {
|
||||||
if (paymentMethods.isEmpty()) {
|
if (paymentMethods.isEmpty()) {
|
||||||
Log.e("CheckoutActivity", "Payment methods list is empty")
|
Log.e("CheckoutActivity", "Payment methods list is empty")
|
||||||
Toast.makeText(this, "No payment methods available", Toast.LENGTH_SHORT).show()
|
Toast.makeText(this, "Tidak ditemukan metode pembayaran", Toast.LENGTH_SHORT).show()
|
||||||
|
binding.tvEmptyPayment.visibility = View.VISIBLE
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
binding.tvEmptyPayment.visibility = View.GONE
|
||||||
// Debug logging
|
// Debug logging
|
||||||
Log.d("CheckoutActivity", "Setting up payment methods: ${paymentMethods.size} methods available")
|
Log.d("CheckoutActivity", "Setting up payment methods: ${paymentMethods.size} methods available")
|
||||||
|
|
||||||
@ -313,7 +315,7 @@ class CheckoutActivity : AppCompatActivity() {
|
|||||||
binding.layoutShippingMethod.setOnClickListener {
|
binding.layoutShippingMethod.setOnClickListener {
|
||||||
val addressId = viewModel.addressDetails.value?.id ?: 0
|
val addressId = viewModel.addressDetails.value?.id ?: 0
|
||||||
if (addressId <= 0) {
|
if (addressId <= 0) {
|
||||||
Toast.makeText(this, "Please select delivery address first", Toast.LENGTH_SHORT).show()
|
Toast.makeText(this, "Silahkan pilih metode pengiriman dahulu", Toast.LENGTH_SHORT).show()
|
||||||
return@setOnClickListener
|
return@setOnClickListener
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -363,7 +365,7 @@ class CheckoutActivity : AppCompatActivity() {
|
|||||||
viewModel.setSelectedAddress(addressId)
|
viewModel.setSelectedAddress(addressId)
|
||||||
|
|
||||||
// You might want to show a toast or some UI feedback
|
// You might want to show a toast or some UI feedback
|
||||||
Toast.makeText(this, "Address selected successfully", Toast.LENGTH_SHORT).show()
|
Toast.makeText(this, "Berhasil memilih alamat", Toast.LENGTH_SHORT).show()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -67,7 +67,7 @@ class ShippingActivity : AppCompatActivity() {
|
|||||||
// Validate required information
|
// Validate required information
|
||||||
if (addressId <= 0 || productId <= 0) {
|
if (addressId <= 0 || productId <= 0) {
|
||||||
Log.e(TAG, "Missing required shipping information: addressId=$addressId, productId=$productId")
|
Log.e(TAG, "Missing required shipping information: addressId=$addressId, productId=$productId")
|
||||||
Toast.makeText(this, "Missing required shipping information", Toast.LENGTH_SHORT).show()
|
Toast.makeText(this, "Gagal memuat pengiriman", Toast.LENGTH_SHORT).show()
|
||||||
finish()
|
finish()
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|||||||
@ -122,7 +122,6 @@ class AddEvidencePaymentActivity : AppCompatActivity() {
|
|||||||
|
|
||||||
} catch (e: Exception) {
|
} catch (e: Exception) {
|
||||||
Log.e(TAG, "ERROR in AddEvidencePaymentActivity onCreate: ${e.message}", e)
|
Log.e(TAG, "ERROR in AddEvidencePaymentActivity onCreate: ${e.message}", e)
|
||||||
Toast.makeText(this, "Error: ${e.message}", Toast.LENGTH_LONG).show()
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -288,7 +287,7 @@ class AddEvidencePaymentActivity : AppCompatActivity() {
|
|||||||
}
|
}
|
||||||
} catch (e: Exception) {
|
} catch (e: Exception) {
|
||||||
Log.e(TAG, "Error handling selected image", e)
|
Log.e(TAG, "Error handling selected image", e)
|
||||||
Toast.makeText(this, "Error: ${e.message}", Toast.LENGTH_SHORT).show()
|
Toast.makeText(this, "Terjadi kendala", Toast.LENGTH_SHORT).show()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -367,7 +366,7 @@ class AddEvidencePaymentActivity : AppCompatActivity() {
|
|||||||
viewModel.uploadPaymentProof(request)
|
viewModel.uploadPaymentProof(request)
|
||||||
} catch (e: Exception) {
|
} catch (e: Exception) {
|
||||||
Log.e(TAG, "Error creating upload request: ${e.message}", e)
|
Log.e(TAG, "Error creating upload request: ${e.message}", e)
|
||||||
Toast.makeText(this, "Error preparing upload: ${e.message}", Toast.LENGTH_SHORT).show()
|
Toast.makeText(this, "Gagal mengunggah foto", Toast.LENGTH_SHORT).show()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -160,7 +160,8 @@ class PaymentActivity : AppCompatActivity() {
|
|||||||
|
|
||||||
viewModel.error.observe(this) { error ->
|
viewModel.error.observe(this) { error ->
|
||||||
if (error.isNotEmpty()) {
|
if (error.isNotEmpty()) {
|
||||||
Toast.makeText(this, error, Toast.LENGTH_SHORT).show()
|
Toast.makeText(this, "Gagal melakukan pembayaran", Toast.LENGTH_SHORT).show()
|
||||||
|
Log.e(TAG, "Failed payment: $error")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -517,14 +517,14 @@ class OrderHistoryAdapter(
|
|||||||
} else {
|
} else {
|
||||||
// Log error and show a Toast instead if we can't get a FragmentManager
|
// Log error and show a Toast instead if we can't get a FragmentManager
|
||||||
Log.e("OrderHistoryAdapter", "Cannot show bottom sheet: Context is not a FragmentActivity")
|
Log.e("OrderHistoryAdapter", "Cannot show bottom sheet: Context is not a FragmentActivity")
|
||||||
Toast.makeText(context, "Cannot show cancel order dialog", Toast.LENGTH_SHORT).show()
|
Toast.makeText(context, "Terjadi kendala", Toast.LENGTH_SHORT).show()
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else -> {
|
else -> {
|
||||||
// Log error and show a Toast instead if we can't get a FragmentManager
|
// Log error and show a Toast instead if we can't get a FragmentManager
|
||||||
Log.e("OrderHistoryAdapter", "Cannot show bottom sheet: Context is not a FragmentActivity")
|
Log.e("OrderHistoryAdapter", "Cannot show bottom sheet: Context is not a FragmentActivity")
|
||||||
Toast.makeText(context, "Cannot show cancel order dialog", Toast.LENGTH_SHORT).show()
|
Toast.makeText(context, "Terjadi kendala", Toast.LENGTH_SHORT).show()
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -535,7 +535,7 @@ class OrderHistoryAdapter(
|
|||||||
onOrderCancelled = {
|
onOrderCancelled = {
|
||||||
callbacks.onOrderCancelled(orderId.toString(), true, "Order cancelled successfully")
|
callbacks.onOrderCancelled(orderId.toString(), true, "Order cancelled successfully")
|
||||||
// Show a success message
|
// Show a success message
|
||||||
Toast.makeText(context, "Order cancelled successfully", Toast.LENGTH_SHORT).show()
|
Toast.makeText(context, "Pesanan berhasil dibatalkan", Toast.LENGTH_SHORT).show()
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|||||||
@ -67,7 +67,7 @@ class CancelOrderBottomSheet(
|
|||||||
|
|
||||||
btnConfirm.setOnClickListener {
|
btnConfirm.setOnClickListener {
|
||||||
if (selectedReason == null) {
|
if (selectedReason == null) {
|
||||||
Toast.makeText(context, "Please select a reason", Toast.LENGTH_SHORT).show()
|
Toast.makeText(context, "Pilih alasan pembatalan", Toast.LENGTH_SHORT).show()
|
||||||
return@setOnClickListener
|
return@setOnClickListener
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -90,7 +90,7 @@ class CreateReviewActivity : AppCompatActivity() {
|
|||||||
)
|
)
|
||||||
})
|
})
|
||||||
} catch (e: Exception) {
|
} catch (e: Exception) {
|
||||||
Toast.makeText(this, "Error loading review items", Toast.LENGTH_SHORT).show()
|
Toast.makeText(this, "Gagal memuat ulasan", Toast.LENGTH_SHORT).show()
|
||||||
finish()
|
finish()
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
@ -110,7 +110,7 @@ class CreateReviewActivity : AppCompatActivity() {
|
|||||||
)
|
)
|
||||||
)
|
)
|
||||||
} else {
|
} else {
|
||||||
Toast.makeText(this, "No items to review", Toast.LENGTH_SHORT).show()
|
Toast.makeText(this, "Tidak ada produk untuk direview", Toast.LENGTH_SHORT).show()
|
||||||
finish()
|
finish()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -106,7 +106,8 @@ class DetailProfileActivity : AppCompatActivity() {
|
|||||||
}
|
}
|
||||||
editProfileLauncher.launch(intent)
|
editProfileLauncher.launch(intent)
|
||||||
} ?: run {
|
} ?: run {
|
||||||
Toast.makeText(this, "Profile data is not available", Toast.LENGTH_SHORT).show()
|
Toast.makeText(this, "Akun tidak ditemukan", Toast.LENGTH_SHORT).show()
|
||||||
|
Log.e("DetailProfileActivity", "Profile data is not available")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -20,10 +20,10 @@ import com.alya.ecommerce_serang.data.repository.MyStoreRepository
|
|||||||
import com.alya.ecommerce_serang.data.repository.UserRepository
|
import com.alya.ecommerce_serang.data.repository.UserRepository
|
||||||
import com.alya.ecommerce_serang.databinding.FragmentProfileBinding
|
import com.alya.ecommerce_serang.databinding.FragmentProfileBinding
|
||||||
import com.alya.ecommerce_serang.ui.auth.LoginActivity
|
import com.alya.ecommerce_serang.ui.auth.LoginActivity
|
||||||
import com.alya.ecommerce_serang.ui.profile.mystore.RegisterStoreActivity
|
|
||||||
import com.alya.ecommerce_serang.ui.order.address.AddressActivity
|
import com.alya.ecommerce_serang.ui.order.address.AddressActivity
|
||||||
import com.alya.ecommerce_serang.ui.order.history.HistoryActivity
|
import com.alya.ecommerce_serang.ui.order.history.HistoryActivity
|
||||||
import com.alya.ecommerce_serang.ui.profile.mystore.MyStoreActivity
|
import com.alya.ecommerce_serang.ui.profile.mystore.MyStoreActivity
|
||||||
|
import com.alya.ecommerce_serang.ui.profile.mystore.RegisterStoreActivity
|
||||||
import com.alya.ecommerce_serang.ui.profile.mystore.StoreOnReviewActivity
|
import com.alya.ecommerce_serang.ui.profile.mystore.StoreOnReviewActivity
|
||||||
import com.alya.ecommerce_serang.ui.profile.mystore.StoreSuspendedActivity
|
import com.alya.ecommerce_serang.ui.profile.mystore.StoreSuspendedActivity
|
||||||
import com.alya.ecommerce_serang.utils.BaseViewModelFactory
|
import com.alya.ecommerce_serang.utils.BaseViewModelFactory
|
||||||
@ -58,7 +58,6 @@ class ProfileFragment : Fragment() {
|
|||||||
|
|
||||||
override fun onCreate(savedInstanceState: Bundle?) {
|
override fun onCreate(savedInstanceState: Bundle?) {
|
||||||
super.onCreate(savedInstanceState)
|
super.onCreate(savedInstanceState)
|
||||||
sessionManager = SessionManager(requireContext())
|
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun onCreateView(
|
override fun onCreateView(
|
||||||
@ -72,6 +71,30 @@ class ProfileFragment : Fragment() {
|
|||||||
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
|
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
|
||||||
super.onViewCreated(view, savedInstanceState)
|
super.onViewCreated(view, savedInstanceState)
|
||||||
|
|
||||||
|
sessionManager = SessionManager(requireContext())
|
||||||
|
|
||||||
|
if (!sessionManager.isLoggedIn()) {
|
||||||
|
// Redirect to LoginActivity
|
||||||
|
binding.tvName.text = "Selamat Datang"
|
||||||
|
binding.tvUsername.text = "Silahkan masuk"
|
||||||
|
binding.btnDetailProfile.text = "Masuk"
|
||||||
|
binding.btnDetailProfile.setOnClickListener {
|
||||||
|
val intent = Intent(requireContext(), LoginActivity::class.java)
|
||||||
|
intent.flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK
|
||||||
|
startActivity(intent)
|
||||||
|
|
||||||
|
// ✅ Finish the host activity so user can’t go back
|
||||||
|
requireActivity().finish()
|
||||||
|
}
|
||||||
|
|
||||||
|
binding.containerBukaToko.visibility = View.GONE
|
||||||
|
binding.cardPesanan.visibility = View.GONE
|
||||||
|
binding.tvPengaturanAkun.visibility = View.GONE
|
||||||
|
binding.containerSettings.visibility = View.GONE
|
||||||
|
binding.cardAbout.visibility = View.GONE
|
||||||
|
binding.cardLogout.visibility = View.GONE
|
||||||
|
}
|
||||||
|
|
||||||
observeUserProfile()
|
observeUserProfile()
|
||||||
|
|
||||||
observeStoreStatus()
|
observeStoreStatus()
|
||||||
@ -130,7 +153,8 @@ class ProfileFragment : Fragment() {
|
|||||||
user?.let { updateUI(it) }
|
user?.let { updateUI(it) }
|
||||||
}
|
}
|
||||||
viewModel.errorMessage.observe(viewLifecycleOwner) { errorMessage ->
|
viewModel.errorMessage.observe(viewLifecycleOwner) { errorMessage ->
|
||||||
Toast.makeText(requireContext(), errorMessage, Toast.LENGTH_SHORT).show()
|
// Toast.makeText(requireContext(), errorMessage, Toast.LENGTH_SHORT).show()
|
||||||
|
Log.e("Profile Fragment", "Failed to load profile: $errorMessage")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -186,6 +210,8 @@ class ProfileFragment : Fragment() {
|
|||||||
sessionManager.clearAll()
|
sessionManager.clearAll()
|
||||||
val intent = Intent(requireContext(), LoginActivity::class.java)
|
val intent = Intent(requireContext(), LoginActivity::class.java)
|
||||||
startActivity(intent)
|
startActivity(intent)
|
||||||
|
requireActivity().finish()
|
||||||
|
|
||||||
} catch (e: Exception) {
|
} catch (e: Exception) {
|
||||||
Toast.makeText(
|
Toast.makeText(
|
||||||
requireContext(),
|
requireContext(),
|
||||||
|
|||||||
@ -302,7 +302,7 @@ class RegisterStoreActivity : AppCompatActivity() {
|
|||||||
viewModel.errorMessage.observe(this) { errorMsg ->
|
viewModel.errorMessage.observe(this) { errorMsg ->
|
||||||
if (errorMsg.isNotEmpty()) {
|
if (errorMsg.isNotEmpty()) {
|
||||||
Log.e(TAG, "setupStoreTypesObserver: Error loading store types: $errorMsg")
|
Log.e(TAG, "setupStoreTypesObserver: Error loading store types: $errorMsg")
|
||||||
Toast.makeText(this, "Error loading store types: $errorMsg", Toast.LENGTH_SHORT).show()
|
// Toast.makeText(this, "Error loading store types: $errorMsg", Toast.LENGTH_SHORT).show()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -7,9 +7,11 @@ import androidx.lifecycle.MutableLiveData
|
|||||||
import androidx.lifecycle.ViewModel
|
import androidx.lifecycle.ViewModel
|
||||||
import androidx.lifecycle.viewModelScope
|
import androidx.lifecycle.viewModelScope
|
||||||
import com.alya.ecommerce_serang.data.api.dto.CreateAddressRequest
|
import com.alya.ecommerce_serang.data.api.dto.CreateAddressRequest
|
||||||
|
import com.alya.ecommerce_serang.data.api.dto.FcmReq
|
||||||
import com.alya.ecommerce_serang.data.api.dto.RegisterRequest
|
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.ResetPassReq
|
||||||
import com.alya.ecommerce_serang.data.api.dto.VerifRegisReq
|
import com.alya.ecommerce_serang.data.api.dto.VerifRegisReq
|
||||||
|
import com.alya.ecommerce_serang.data.api.response.auth.FcmTokenResponse
|
||||||
import com.alya.ecommerce_serang.data.api.response.auth.LoginResponse
|
import com.alya.ecommerce_serang.data.api.response.auth.LoginResponse
|
||||||
import com.alya.ecommerce_serang.data.api.response.auth.OtpResponse
|
import com.alya.ecommerce_serang.data.api.response.auth.OtpResponse
|
||||||
import com.alya.ecommerce_serang.data.api.response.auth.RegisterResponse
|
import com.alya.ecommerce_serang.data.api.response.auth.RegisterResponse
|
||||||
@ -388,6 +390,34 @@ class RegisterViewModel(private val repository: UserRepository, private val orde
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fun sendFcm(token: FcmReq) {
|
||||||
|
viewModelScope.launch {
|
||||||
|
_otpState.value = Result.Loading // Indicating API call in progress
|
||||||
|
|
||||||
|
try {
|
||||||
|
// Call the repository function to request OTP
|
||||||
|
val authenticatedApiService = getAuthenticatedApiService()
|
||||||
|
val authenticatedOrderRepo = UserRepository(authenticatedApiService)
|
||||||
|
val response: FcmTokenResponse = authenticatedOrderRepo.sendFcm(token)
|
||||||
|
|
||||||
|
// Log and store success message
|
||||||
|
Log.d("LoginViewModel", "OTP Response: ${response.message}")
|
||||||
|
_message.value = response.message ?: "berhasil" // Store the message for UI feedback
|
||||||
|
|
||||||
|
// Update state to indicate success
|
||||||
|
_otpState.value = Result.Success(Unit)
|
||||||
|
|
||||||
|
} catch (exception: Exception) {
|
||||||
|
// Handle any errors and update state
|
||||||
|
_otpState.value = Result.Error(exception)
|
||||||
|
_message.value = exception.localizedMessage ?: "Failed to request OTP"
|
||||||
|
|
||||||
|
// Log the error for debugging
|
||||||
|
Log.e("LoginViewModel", "OTP request failed for: $token", exception)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
companion object {
|
companion object {
|
||||||
private const val TAG = "RegisterViewModel"
|
private const val TAG = "RegisterViewModel"
|
||||||
}
|
}
|
||||||
|
|||||||
@ -257,6 +257,15 @@
|
|||||||
android:textSize="14sp"
|
android:textSize="14sp"
|
||||||
android:layout_marginBottom="8dp" />
|
android:layout_marginBottom="8dp" />
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:id="@+id/tvEmptyPayment"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:visibility="gone"
|
||||||
|
android:textSize="12sp"
|
||||||
|
android:text="Pilih alamat terlebih dahulu"
|
||||||
|
android:layout_marginBottom="8dp"/>
|
||||||
|
|
||||||
<androidx.recyclerview.widget.RecyclerView
|
<androidx.recyclerview.widget.RecyclerView
|
||||||
android:id="@+id/rv_payment_info"
|
android:id="@+id/rv_payment_info"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
|
|||||||
@ -50,8 +50,9 @@
|
|||||||
android:id="@+id/et_otp"
|
android:id="@+id/et_otp"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:hint="Enter OTP"
|
android:hint="Masukkan OTP"
|
||||||
android:inputType="number"
|
android:inputType="number"
|
||||||
|
android:textSize="16dp"
|
||||||
android:textAlignment="center"
|
android:textAlignment="center"
|
||||||
android:maxLength="6" />
|
android:maxLength="6" />
|
||||||
</com.google.android.material.textfield.TextInputLayout>
|
</com.google.android.material.textfield.TextInputLayout>
|
||||||
@ -61,9 +62,20 @@
|
|||||||
android:id="@+id/btn_verify"
|
android:id="@+id/btn_verify"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:text="Verify"
|
android:text="Kirim kode OTP"
|
||||||
|
style="@style/button.large.active.medium"
|
||||||
app:cornerRadius="8dp" />
|
app:cornerRadius="8dp" />
|
||||||
|
|
||||||
|
<com.google.android.material.button.MaterialButton
|
||||||
|
android:id="@+id/btn_back"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_marginTop="4dp"
|
||||||
|
android:visibility="gone"
|
||||||
|
style="@style/Widget.Material3.Button.OutlinedButton.Icon"
|
||||||
|
android:text="Kembali"
|
||||||
|
app:cornerRadius="8dp"/>
|
||||||
|
|
||||||
<!-- Resend OTP -->
|
<!-- Resend OTP -->
|
||||||
<LinearLayout
|
<LinearLayout
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
@ -81,7 +93,7 @@
|
|||||||
android:id="@+id/tv_resend_otp"
|
android:id="@+id/tv_resend_otp"
|
||||||
android:layout_width="wrap_content"
|
android:layout_width="wrap_content"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:text="Resend"
|
android:text="Kirim Ulang"
|
||||||
android:textColor="@color/blue1"
|
android:textColor="@color/blue1"
|
||||||
android:textStyle="bold" />
|
android:textStyle="bold" />
|
||||||
</LinearLayout>
|
</LinearLayout>
|
||||||
|
|||||||
@ -233,6 +233,12 @@
|
|||||||
android:padding="12dp"
|
android:padding="12dp"
|
||||||
android:textSize="14sp" />
|
android:textSize="14sp" />
|
||||||
|
|
||||||
|
<CheckBox
|
||||||
|
android:id="@+id/checkbox_approve"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:text="Saya telah membaca dan menyetujui Syarat dan Ketentuan aplikasi" />
|
||||||
|
|
||||||
<!-- Navigation Button (Previous) -->
|
<!-- Navigation Button (Previous) -->
|
||||||
<Button
|
<Button
|
||||||
android:id="@+id/btn_previous"
|
android:id="@+id/btn_previous"
|
||||||
@ -240,24 +246,14 @@
|
|||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:layout_marginTop="24dp"
|
android:layout_marginTop="24dp"
|
||||||
android:background="@drawable/bg_button_outline"
|
android:background="@drawable/bg_button_outline"
|
||||||
|
android:visibility="gone"
|
||||||
android:text="Kembali"
|
android:text="Kembali"
|
||||||
android:textAllCaps="false"
|
android:textAllCaps="false"
|
||||||
android:textColor="@color/blue1"
|
android:textColor="@color/blue1"
|
||||||
style="@style/Widget.MaterialComponents.Button.OutlinedButton"/>
|
style="@style/Widget.Material3.Button.OutlinedButton.Icon"/>
|
||||||
</LinearLayout>
|
</LinearLayout>
|
||||||
|
|
||||||
<LinearLayout
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:orientation="horizontal">
|
|
||||||
|
|
||||||
<CheckBox
|
|
||||||
android:id="@+id/checkbox_approve"
|
|
||||||
android:layout_width="wrap_content"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:text="Saya telah membaca dan menyetujui Syarat dan Ketentuan aplikasi" />
|
|
||||||
|
|
||||||
</LinearLayout>
|
|
||||||
</ScrollView>
|
</ScrollView>
|
||||||
|
|
||||||
<!-- Register Button -->
|
<!-- Register Button -->
|
||||||
|
|||||||
Reference in New Issue
Block a user