diff --git a/app/build.gradle.kts b/app/build.gradle.kts index c34c44b..4fdc7b6 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -124,4 +124,7 @@ dependencies { implementation(platform("com.google.firebase:firebase-bom:33.13.0")) implementation("com.google.firebase:firebase-analytics") implementation("com.google.firebase:firebase-messaging-ktx") + + //Splash screen + implementation("androidx.core:core-splashscreen:1.0.0") } diff --git a/app/src/main/java/com/alya/ecommerce_serang/ui/auth/LoginActivity.kt b/app/src/main/java/com/alya/ecommerce_serang/ui/auth/LoginActivity.kt index 9d8184c..6013739 100644 --- a/app/src/main/java/com/alya/ecommerce_serang/ui/auth/LoginActivity.kt +++ b/app/src/main/java/com/alya/ecommerce_serang/ui/auth/LoginActivity.kt @@ -72,7 +72,7 @@ class LoginActivity : AppCompatActivity() { val password = binding.etLoginPassword.text.toString() 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 { loginViewModel.login(email, password) } @@ -100,14 +100,14 @@ class LoginActivity : AppCompatActivity() { retrieveFCMToken() // 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)) finish() } is com.alya.ecommerce_serang.data.repository.Result.Error -> { 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 -> { // Show loading state diff --git a/app/src/main/java/com/alya/ecommerce_serang/ui/auth/OtpBottomsheetDialog.kt b/app/src/main/java/com/alya/ecommerce_serang/ui/auth/OtpBottomsheetDialog.kt index c20b7f9..2bc3b4b 100644 --- a/app/src/main/java/com/alya/ecommerce_serang/ui/auth/OtpBottomsheetDialog.kt +++ b/app/src/main/java/com/alya/ecommerce_serang/ui/auth/OtpBottomsheetDialog.kt @@ -29,7 +29,7 @@ class OtpBottomSheetDialog( onRegister(updatedUserData) // Send full data to ViewModel dismiss() // Close dialog } else { - Toast.makeText(requireContext(), "Please enter OTP", Toast.LENGTH_SHORT).show() + Toast.makeText(requireContext(), "Silahkan masukkan kode OTP", Toast.LENGTH_SHORT).show() } } return view diff --git a/app/src/main/java/com/alya/ecommerce_serang/ui/auth/RegisterActivity.kt b/app/src/main/java/com/alya/ecommerce_serang/ui/auth/RegisterActivity.kt index 8a2c0a8..d040cf7 100644 --- a/app/src/main/java/com/alya/ecommerce_serang/ui/auth/RegisterActivity.kt +++ b/app/src/main/java/com/alya/ecommerce_serang/ui/auth/RegisterActivity.kt @@ -86,7 +86,6 @@ class RegisterActivity : AppCompatActivity() { } } - // navigate step register in fragment fun navigateToStep(step: Int, userData: RegisterRequest?) { val fragment = when (step) { 1 -> RegisterStep1Fragment.newInstance() diff --git a/app/src/main/java/com/alya/ecommerce_serang/ui/auth/ResetPassActivity.kt b/app/src/main/java/com/alya/ecommerce_serang/ui/auth/ResetPassActivity.kt index 70cc88d..81bd108 100644 --- a/app/src/main/java/com/alya/ecommerce_serang/ui/auth/ResetPassActivity.kt +++ b/app/src/main/java/com/alya/ecommerce_serang/ui/auth/ResetPassActivity.kt @@ -111,7 +111,7 @@ class ResetPassActivity : AppCompatActivity() { } private fun handleError(errorMessage: String) { - Toast.makeText(this, "Error: $errorMessage", Toast.LENGTH_LONG).show() + Log.e(TAG, "Error: $errorMessage") // Optionally show error dialog AlertDialog.Builder(this) diff --git a/app/src/main/java/com/alya/ecommerce_serang/ui/auth/fragments/RegisterStep1Fragment.kt b/app/src/main/java/com/alya/ecommerce_serang/ui/auth/fragments/RegisterStep1Fragment.kt index 814a366..944c8f2 100644 --- a/app/src/main/java/com/alya/ecommerce_serang/ui/auth/fragments/RegisterStep1Fragment.kt +++ b/app/src/main/java/com/alya/ecommerce_serang/ui/auth/fragments/RegisterStep1Fragment.kt @@ -155,19 +155,20 @@ class RegisterStep1Fragment : Fragment() { "email" -> { isEmailValid = 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" -> { isPhoneValid = 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 -> { - 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 -> { binding.progressBar.visibility = View.GONE 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 if (email.isEmpty() || password.isEmpty() || confirmPassword.isEmpty() || phone.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 } // Check if passwords match 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 } @@ -253,7 +255,7 @@ class RegisterStep1Fragment : Fragment() { if (isEmailValid && isPhoneValid) { requestOtp(email) } 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() } } diff --git a/app/src/main/java/com/alya/ecommerce_serang/ui/auth/fragments/RegisterStep2Fragment.kt b/app/src/main/java/com/alya/ecommerce_serang/ui/auth/fragments/RegisterStep2Fragment.kt index 15e3c22..0d60c7e 100644 --- a/app/src/main/java/com/alya/ecommerce_serang/ui/auth/fragments/RegisterStep2Fragment.kt +++ b/app/src/main/java/com/alya/ecommerce_serang/ui/auth/fragments/RegisterStep2Fragment.kt @@ -1,5 +1,6 @@ package com.alya.ecommerce_serang.ui.auth.fragments +import android.content.Context import android.os.Build import android.os.Bundle import android.os.CountDownTimer @@ -13,6 +14,7 @@ import androidx.core.content.ContextCompat import androidx.fragment.app.Fragment import androidx.fragment.app.activityViewModels 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.retrofit.ApiConfig 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.viewmodel.RegisterViewModel import com.google.android.material.progressindicator.LinearProgressIndicator +import com.google.firebase.messaging.FirebaseMessaging class RegisterStep2Fragment : Fragment() { private var _binding: FragmentRegisterStep2Binding? = null @@ -109,6 +112,10 @@ class RegisterStep2Fragment : Fragment() { } } + binding.btnBack.setOnClickListener { + parentFragmentManager.popBackStack() + } + observeRegistrationState() observeLoginState() 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") 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) } ?: Log.e(TAG, "userData is null, cannot proceed with verification") } @@ -250,6 +252,8 @@ class RegisterStep2Fragment : Fragment() { // Save the token in fragment val accessToken = result.data.accessToken sessionManager.saveToken(accessToken) + retrieveFCMToken() + Log.d(TAG, "Token saved to SessionManager: $accessToken") // 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() { super.onDestroyView() countDownTimer?.cancel() diff --git a/app/src/main/java/com/alya/ecommerce_serang/ui/auth/fragments/RegisterStep3Fragment.kt b/app/src/main/java/com/alya/ecommerce_serang/ui/auth/fragments/RegisterStep3Fragment.kt index 35585bc..d15acfb 100644 --- a/app/src/main/java/com/alya/ecommerce_serang/ui/auth/fragments/RegisterStep3Fragment.kt +++ b/app/src/main/java/com/alya/ecommerce_serang/ui/auth/fragments/RegisterStep3Fragment.kt @@ -104,11 +104,20 @@ class RegisterStep3Fragment : Fragment() { // Set up button listeners binding.btnPrevious.setOnClickListener { // 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 { submitAddress() + sessionManager.clearAll() } // If user skips address entry @@ -503,7 +512,7 @@ class RegisterStep3Fragment : Fragment() { private fun showRegistrationSuccess() { // 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 startActivity(Intent(requireContext(), LoginActivity::class.java)) @@ -521,4 +530,5 @@ class RegisterStep3Fragment : Fragment() { ViewCompat.setWindowInsetsAnimationCallback(binding.root, null) _binding = null } + } \ No newline at end of file diff --git a/app/src/main/java/com/alya/ecommerce_serang/ui/cart/CartActivity.kt b/app/src/main/java/com/alya/ecommerce_serang/ui/cart/CartActivity.kt index 3df50c8..58b4951 100644 --- a/app/src/main/java/com/alya/ecommerce_serang/ui/cart/CartActivity.kt +++ b/app/src/main/java/com/alya/ecommerce_serang/ui/cart/CartActivity.kt @@ -41,11 +41,16 @@ class CartActivity : AppCompatActivity() { } override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) + sessionManager = SessionManager(this) + apiService = ApiConfig.getApiService(sessionManager) + + binding = ActivityCartBinding.inflate(layoutInflater) setContentView(binding.root) - sessionManager = SessionManager(this) - apiService = ApiConfig.getApiService(sessionManager) + if (!sessionManager.isLoggedIn()){ + binding.emptyCart.text = "Silahkan masuk terlebih dahulu" + } WindowCompat.setDecorFitsSystemWindows(window, false) @@ -118,7 +123,7 @@ class CartActivity : AppCompatActivity() { // Start checkout with the prepared items startCheckoutWithWholesaleInfo(selectedItems) } 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 { diff --git a/app/src/main/java/com/alya/ecommerce_serang/ui/chat/ChatActivity.kt b/app/src/main/java/com/alya/ecommerce_serang/ui/chat/ChatActivity.kt index cf9fa48..507dbea 100644 --- a/app/src/main/java/com/alya/ecommerce_serang/ui/chat/ChatActivity.kt +++ b/app/src/main/java/com/alya/ecommerce_serang/ui/chat/ChatActivity.kt @@ -124,7 +124,7 @@ class ChatActivity : AppCompatActivity() { if (token.isEmpty()) { // 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)) finish() return @@ -506,7 +506,7 @@ class ChatActivity : AppCompatActivity() { } startActivity(intent) } 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) } } @@ -622,7 +622,7 @@ class ChatActivity : AppCompatActivity() { if (outputFile.exists() && outputFile.length() > 0) { if (outputFile.length() > 5 * 1024 * 1024) { 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 } diff --git a/app/src/main/java/com/alya/ecommerce_serang/ui/chat/ChatListFragment.kt b/app/src/main/java/com/alya/ecommerce_serang/ui/chat/ChatListFragment.kt index 923ad50..2abd8f4 100644 --- a/app/src/main/java/com/alya/ecommerce_serang/ui/chat/ChatListFragment.kt +++ b/app/src/main/java/com/alya/ecommerce_serang/ui/chat/ChatListFragment.kt @@ -5,7 +5,6 @@ import android.util.Log import android.view.LayoutInflater import android.view.View import android.view.ViewGroup -import android.widget.Toast import androidx.fragment.app.Fragment import androidx.fragment.app.viewModels import com.alya.ecommerce_serang.data.api.retrofit.ApiConfig @@ -80,8 +79,10 @@ class ChatListFragment : Fragment() { } } is Result.Error -> { - binding.tvEmptyChat.visibility = View.VISIBLE - Toast.makeText(requireContext(), "Failed to load chats", Toast.LENGTH_SHORT).show() +// binding.tvEmptyChat.visibility = View.VISIBLE + 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 -> { binding.progressBarChat.visibility = View.VISIBLE diff --git a/app/src/main/java/com/alya/ecommerce_serang/ui/notif/fcm/FCMService.kt b/app/src/main/java/com/alya/ecommerce_serang/ui/notif/fcm/FCMService.kt index 0ae5b2e..e30b2d2 100644 --- a/app/src/main/java/com/alya/ecommerce_serang/ui/notif/fcm/FCMService.kt +++ b/app/src/main/java/com/alya/ecommerce_serang/ui/notif/fcm/FCMService.kt @@ -78,4 +78,4 @@ import com.google.firebase.messaging.RemoteMessage val notificationId = System.currentTimeMillis().toInt() notificationManager.notify(notificationId, notificationBuilder.build()) } - } \ No newline at end of file + } diff --git a/app/src/main/java/com/alya/ecommerce_serang/ui/order/CheckoutActivity.kt b/app/src/main/java/com/alya/ecommerce_serang/ui/order/CheckoutActivity.kt index 127a1d6..1c23baf 100644 --- a/app/src/main/java/com/alya/ecommerce_serang/ui/order/CheckoutActivity.kt +++ b/app/src/main/java/com/alya/ecommerce_serang/ui/order/CheckoutActivity.kt @@ -196,7 +196,7 @@ class CheckoutActivity : AppCompatActivity() { // Observe order creation viewModel.orderCreated.observe(this) { 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) finish() } @@ -206,10 +206,12 @@ class CheckoutActivity : AppCompatActivity() { private fun setupPaymentMethodsRecyclerView(paymentMethods: List) { if (paymentMethods.isEmpty()) { 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 } + binding.tvEmptyPayment.visibility = View.GONE // Debug logging Log.d("CheckoutActivity", "Setting up payment methods: ${paymentMethods.size} methods available") @@ -313,7 +315,7 @@ class CheckoutActivity : AppCompatActivity() { binding.layoutShippingMethod.setOnClickListener { val addressId = viewModel.addressDetails.value?.id ?: 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 } @@ -363,7 +365,7 @@ class CheckoutActivity : AppCompatActivity() { viewModel.setSelectedAddress(addressId) // 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() } } } diff --git a/app/src/main/java/com/alya/ecommerce_serang/ui/order/ShippingActivity.kt b/app/src/main/java/com/alya/ecommerce_serang/ui/order/ShippingActivity.kt index 82bcde9..fb503ca 100644 --- a/app/src/main/java/com/alya/ecommerce_serang/ui/order/ShippingActivity.kt +++ b/app/src/main/java/com/alya/ecommerce_serang/ui/order/ShippingActivity.kt @@ -67,7 +67,7 @@ class ShippingActivity : AppCompatActivity() { // Validate required information if (addressId <= 0 || productId <= 0) { 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() return } diff --git a/app/src/main/java/com/alya/ecommerce_serang/ui/order/detail/AddEvidencePaymentActivity.kt b/app/src/main/java/com/alya/ecommerce_serang/ui/order/detail/AddEvidencePaymentActivity.kt index 24a940a..806c878 100644 --- a/app/src/main/java/com/alya/ecommerce_serang/ui/order/detail/AddEvidencePaymentActivity.kt +++ b/app/src/main/java/com/alya/ecommerce_serang/ui/order/detail/AddEvidencePaymentActivity.kt @@ -122,7 +122,6 @@ class AddEvidencePaymentActivity : AppCompatActivity() { } catch (e: Exception) { 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) { 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) } catch (e: Exception) { 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() } } } diff --git a/app/src/main/java/com/alya/ecommerce_serang/ui/order/detail/PaymentActivity.kt b/app/src/main/java/com/alya/ecommerce_serang/ui/order/detail/PaymentActivity.kt index c470b52..6d7d8b5 100644 --- a/app/src/main/java/com/alya/ecommerce_serang/ui/order/detail/PaymentActivity.kt +++ b/app/src/main/java/com/alya/ecommerce_serang/ui/order/detail/PaymentActivity.kt @@ -160,7 +160,8 @@ class PaymentActivity : AppCompatActivity() { viewModel.error.observe(this) { error -> 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") } } } diff --git a/app/src/main/java/com/alya/ecommerce_serang/ui/order/history/OrderHistoryAdapter.kt b/app/src/main/java/com/alya/ecommerce_serang/ui/order/history/OrderHistoryAdapter.kt index dad73a6..8db8d17 100644 --- a/app/src/main/java/com/alya/ecommerce_serang/ui/order/history/OrderHistoryAdapter.kt +++ b/app/src/main/java/com/alya/ecommerce_serang/ui/order/history/OrderHistoryAdapter.kt @@ -517,14 +517,14 @@ class OrderHistoryAdapter( } else { // 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") - Toast.makeText(context, "Cannot show cancel order dialog", Toast.LENGTH_SHORT).show() + Toast.makeText(context, "Terjadi kendala", Toast.LENGTH_SHORT).show() return } } else -> { // 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") - Toast.makeText(context, "Cannot show cancel order dialog", Toast.LENGTH_SHORT).show() + Toast.makeText(context, "Terjadi kendala", Toast.LENGTH_SHORT).show() return } } @@ -535,7 +535,7 @@ class OrderHistoryAdapter( onOrderCancelled = { callbacks.onOrderCancelled(orderId.toString(), true, "Order cancelled successfully") // Show a success message - Toast.makeText(context, "Order cancelled successfully", Toast.LENGTH_SHORT).show() + Toast.makeText(context, "Pesanan berhasil dibatalkan", Toast.LENGTH_SHORT).show() } ) diff --git a/app/src/main/java/com/alya/ecommerce_serang/ui/order/history/cancelorder/CancelOrderBottomSheet.kt b/app/src/main/java/com/alya/ecommerce_serang/ui/order/history/cancelorder/CancelOrderBottomSheet.kt index 8fd0376..81be667 100644 --- a/app/src/main/java/com/alya/ecommerce_serang/ui/order/history/cancelorder/CancelOrderBottomSheet.kt +++ b/app/src/main/java/com/alya/ecommerce_serang/ui/order/history/cancelorder/CancelOrderBottomSheet.kt @@ -67,7 +67,7 @@ class CancelOrderBottomSheet( btnConfirm.setOnClickListener { 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 } diff --git a/app/src/main/java/com/alya/ecommerce_serang/ui/order/review/CreateReviewActivity.kt b/app/src/main/java/com/alya/ecommerce_serang/ui/order/review/CreateReviewActivity.kt index 1fbbc93..02dd4fb 100644 --- a/app/src/main/java/com/alya/ecommerce_serang/ui/order/review/CreateReviewActivity.kt +++ b/app/src/main/java/com/alya/ecommerce_serang/ui/order/review/CreateReviewActivity.kt @@ -90,7 +90,7 @@ class CreateReviewActivity : AppCompatActivity() { ) }) } 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() } } else { @@ -110,7 +110,7 @@ class CreateReviewActivity : AppCompatActivity() { ) ) } 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() } } diff --git a/app/src/main/java/com/alya/ecommerce_serang/ui/profile/DetailProfileActivity.kt b/app/src/main/java/com/alya/ecommerce_serang/ui/profile/DetailProfileActivity.kt index 3a5f99e..42069e5 100644 --- a/app/src/main/java/com/alya/ecommerce_serang/ui/profile/DetailProfileActivity.kt +++ b/app/src/main/java/com/alya/ecommerce_serang/ui/profile/DetailProfileActivity.kt @@ -106,7 +106,8 @@ class DetailProfileActivity : AppCompatActivity() { } editProfileLauncher.launch(intent) } ?: 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") } } } diff --git a/app/src/main/java/com/alya/ecommerce_serang/ui/profile/ProfileFragment.kt b/app/src/main/java/com/alya/ecommerce_serang/ui/profile/ProfileFragment.kt index 27cc049..b515046 100644 --- a/app/src/main/java/com/alya/ecommerce_serang/ui/profile/ProfileFragment.kt +++ b/app/src/main/java/com/alya/ecommerce_serang/ui/profile/ProfileFragment.kt @@ -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.databinding.FragmentProfileBinding 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.history.HistoryActivity 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.StoreSuspendedActivity import com.alya.ecommerce_serang.utils.BaseViewModelFactory @@ -58,7 +58,6 @@ class ProfileFragment : Fragment() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - sessionManager = SessionManager(requireContext()) } override fun onCreateView( @@ -72,6 +71,30 @@ class ProfileFragment : Fragment() { override fun onViewCreated(view: View, savedInstanceState: Bundle?) { 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() observeStoreStatus() @@ -130,7 +153,8 @@ class ProfileFragment : Fragment() { user?.let { updateUI(it) } } 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() val intent = Intent(requireContext(), LoginActivity::class.java) startActivity(intent) + requireActivity().finish() + } catch (e: Exception) { Toast.makeText( requireContext(), diff --git a/app/src/main/java/com/alya/ecommerce_serang/ui/profile/mystore/RegisterStoreActivity.kt b/app/src/main/java/com/alya/ecommerce_serang/ui/profile/mystore/RegisterStoreActivity.kt index ac257d9..354f710 100644 --- a/app/src/main/java/com/alya/ecommerce_serang/ui/profile/mystore/RegisterStoreActivity.kt +++ b/app/src/main/java/com/alya/ecommerce_serang/ui/profile/mystore/RegisterStoreActivity.kt @@ -302,7 +302,7 @@ class RegisterStoreActivity : AppCompatActivity() { viewModel.errorMessage.observe(this) { errorMsg -> if (errorMsg.isNotEmpty()) { 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() } } diff --git a/app/src/main/java/com/alya/ecommerce_serang/utils/viewmodel/RegisterViewModel.kt b/app/src/main/java/com/alya/ecommerce_serang/utils/viewmodel/RegisterViewModel.kt index d112774..bba65e0 100644 --- a/app/src/main/java/com/alya/ecommerce_serang/utils/viewmodel/RegisterViewModel.kt +++ b/app/src/main/java/com/alya/ecommerce_serang/utils/viewmodel/RegisterViewModel.kt @@ -7,9 +7,11 @@ import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope 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.ResetPassReq 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.OtpResponse 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 { private const val TAG = "RegisterViewModel" } diff --git a/app/src/main/res/layout/activity_checkout.xml b/app/src/main/res/layout/activity_checkout.xml index 0e3b15c..10944b5 100644 --- a/app/src/main/res/layout/activity_checkout.xml +++ b/app/src/main/res/layout/activity_checkout.xml @@ -257,6 +257,15 @@ android:textSize="14sp" android:layout_marginBottom="8dp" /> + + @@ -61,9 +62,20 @@ android:id="@+id/btn_verify" android:layout_width="match_parent" android:layout_height="wrap_content" - android:text="Verify" + android:text="Kirim kode OTP" + style="@style/button.large.active.medium" app:cornerRadius="8dp" /> + + diff --git a/app/src/main/res/layout/fragment_register_step3.xml b/app/src/main/res/layout/fragment_register_step3.xml index 779f947..7c78223 100644 --- a/app/src/main/res/layout/fragment_register_step3.xml +++ b/app/src/main/res/layout/fragment_register_step3.xml @@ -233,6 +233,12 @@ android:padding="12dp" android:textSize="14sp" /> + +