diff --git a/app/src/main/java/com/alya/ecommerce_serang/data/api/dto/FcmReq.kt b/app/src/main/java/com/alya/ecommerce_serang/data/api/dto/FcmReq.kt new file mode 100644 index 0000000..0f64faf --- /dev/null +++ b/app/src/main/java/com/alya/ecommerce_serang/data/api/dto/FcmReq.kt @@ -0,0 +1,8 @@ +package com.alya.ecommerce_serang.data.api.dto + +import com.google.gson.annotations.SerializedName + +data class FcmReq ( + @SerializedName("fcm_req") + val fcmToken: String?= null +) \ No newline at end of file diff --git a/app/src/main/java/com/alya/ecommerce_serang/data/api/response/auth/FcmTokenResponse.kt b/app/src/main/java/com/alya/ecommerce_serang/data/api/response/auth/FcmTokenResponse.kt new file mode 100644 index 0000000..0790e8c --- /dev/null +++ b/app/src/main/java/com/alya/ecommerce_serang/data/api/response/auth/FcmTokenResponse.kt @@ -0,0 +1,9 @@ +package com.alya.ecommerce_serang.data.api.response.auth + +import com.google.gson.annotations.SerializedName + +data class FcmTokenResponse( + + @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 7a29fee..195ef18 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 @@ -9,6 +9,7 @@ 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.CourierCostRequest 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.LoginRequest import com.alya.ecommerce_serang.data.api.dto.OrderRequest import com.alya.ecommerce_serang.data.api.dto.OrderRequestBuy @@ -23,6 +24,7 @@ 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.CheckStoreResponse +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 import com.alya.ecommerce_serang.data.api.response.auth.LoginResponse @@ -129,6 +131,11 @@ interface ApiService { @Body otpRequest: OtpRequest ):OtpResponse + @PUT("updatefcm") + suspend fun updateFcm( + @Body fcmReq: FcmReq + ): FcmTokenResponse + @GET("checkstore") suspend fun checkStoreUser( ): HasStoreResponse 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 6bc9881..cdffe08 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,11 +3,13 @@ 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.FcmReq import com.alya.ecommerce_serang.data.api.dto.LoginRequest import com.alya.ecommerce_serang.data.api.dto.OtpRequest import com.alya.ecommerce_serang.data.api.dto.RegisterRequest 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.FcmTokenResponse import com.alya.ecommerce_serang.data.api.response.auth.HasStoreResponse import com.alya.ecommerce_serang.data.api.response.auth.ListStoreTypeResponse import com.alya.ecommerce_serang.data.api.response.auth.LoginResponse @@ -338,6 +340,10 @@ class UserRepository(private val apiService: ApiService) { return apiService.verifValue(request) } + suspend fun sendFcm(request: FcmReq): FcmTokenResponse{ + return apiService.updateFcm(request) + } + companion object{ private const val TAG = "UserRepository" } 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 e2c4839..2b2a48f 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 @@ -1,11 +1,14 @@ package com.alya.ecommerce_serang.ui.auth +import android.content.Context import android.content.Intent import android.os.Bundle +import android.util.Log import android.widget.Toast import androidx.activity.enableEdgeToEdge import androidx.activity.viewModels import androidx.appcompat.app.AppCompatActivity +import com.alya.ecommerce_serang.data.api.dto.FcmReq import com.alya.ecommerce_serang.data.api.retrofit.ApiConfig import com.alya.ecommerce_serang.data.repository.Result import com.alya.ecommerce_serang.data.repository.UserRepository @@ -14,9 +17,13 @@ import com.alya.ecommerce_serang.ui.MainActivity import com.alya.ecommerce_serang.utils.BaseViewModelFactory import com.alya.ecommerce_serang.utils.SessionManager import com.alya.ecommerce_serang.utils.viewmodel.LoginViewModel +import com.google.firebase.FirebaseApp +import com.google.firebase.messaging.FirebaseMessaging class LoginActivity : AppCompatActivity() { + private val TAG = "LoginActivity" + private lateinit var binding: ActivityLoginBinding private val loginViewModel: LoginViewModel by viewModels{ BaseViewModelFactory { @@ -35,6 +42,11 @@ class LoginActivity : AppCompatActivity() { setupListeners() observeLoginState() + + FirebaseApp.initializeApp(this) + + // Request FCM token at app startup + retrieveFCMToken() } private fun setupListeners() { @@ -74,4 +86,35 @@ class LoginActivity : AppCompatActivity() { } } } + + 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 = 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 + ) + loginViewModel.sendFcm(tokenFcm) + Log.d(TAG, "Sent token fcm: $token") + + } } \ No newline at end of file diff --git a/app/src/main/java/com/alya/ecommerce_serang/ui/auth/RegisterStoreActivity.kt b/app/src/main/java/com/alya/ecommerce_serang/ui/auth/RegisterStoreActivity.kt index c3c83bf..46a91b0 100644 --- a/app/src/main/java/com/alya/ecommerce_serang/ui/auth/RegisterStoreActivity.kt +++ b/app/src/main/java/com/alya/ecommerce_serang/ui/auth/RegisterStoreActivity.kt @@ -398,7 +398,7 @@ class RegisterStoreActivity : AppCompatActivity() { } binding.checkboxJnt.setOnCheckedChangeListener { _, isChecked -> - handleCourierSelection("jnt", isChecked) + handleCourierSelection("tiki", isChecked) } binding.checkboxPos.setOnCheckedChangeListener { _, isChecked -> diff --git a/app/src/main/java/com/alya/ecommerce_serang/utils/viewmodel/LoginViewModel.kt b/app/src/main/java/com/alya/ecommerce_serang/utils/viewmodel/LoginViewModel.kt index 3e1c172..0bc6014 100644 --- a/app/src/main/java/com/alya/ecommerce_serang/utils/viewmodel/LoginViewModel.kt +++ b/app/src/main/java/com/alya/ecommerce_serang/utils/viewmodel/LoginViewModel.kt @@ -1,9 +1,12 @@ package com.alya.ecommerce_serang.utils.viewmodel +import android.util.Log import androidx.lifecycle.LiveData import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope +import com.alya.ecommerce_serang.data.api.dto.FcmReq +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.repository.Result import com.alya.ecommerce_serang.data.repository.UserRepository @@ -13,6 +16,13 @@ class LoginViewModel(private val repository: UserRepository) : ViewModel() { private val _loginState = MutableLiveData>() val loginState: LiveData> get() = _loginState + private val _otpState = MutableLiveData>() + val otpState: LiveData> = _otpState + + // MutableLiveData to store messages from API responses + private val _message = MutableLiveData() + val message: LiveData = _message + fun login(email: String, password: String) { viewModelScope.launch { _loginState.value = Result.Loading @@ -20,4 +30,31 @@ class LoginViewModel(private val repository: UserRepository) : ViewModel() { _loginState.value = result } } + + fun sendFcm(token: FcmReq) { + viewModelScope.launch { + _otpState.value = Result.Loading // Indicating API call in progress + + try { + // Call the repository function to request OTP + val response: FcmTokenResponse = repository.sendFcm(token) + + // Log and store success message + Log.d("RegisterViewModel", "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("RegisterViewModel", "OTP request failed for: $token", exception) + } + } + } + } \ No newline at end of file