diff --git a/app/build.gradle.kts b/app/build.gradle.kts index df69c67..2a25f1f 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -23,7 +23,7 @@ android { buildTypes { release { - buildConfigField("String", "BASE_URL", "\"http://192.168.1.4:3000/\"") + buildConfigField("String", "BASE_URL", "\"http://192.168.100.156:3000/\"") isMinifyEnabled = false proguardFiles( getDefaultProguardFile("proguard-android-optimize.txt"), @@ -31,7 +31,7 @@ android { ) } debug { - buildConfigField("String", "BASE_URL", "\"http://192.168.1.4:3000/\"") + buildConfigField("String", "BASE_URL", "\"http://192.168.100.156:3000/\"") } } compileOptions { @@ -66,13 +66,14 @@ dependencies { androidTestImplementation(libs.androidx.espresso.core) //retrofit - implementation(libs.retrofit) - implementation(libs.converter.gson) - implementation(libs.logging.interceptor) + implementation("com.squareup.retrofit2:retrofit:2.9.0") + implementation("com.squareup.retrofit2:converter-gson:2.9.0") + implementation("com.squareup.okhttp3:logging-interceptor:4.11.0") - implementation(libs.glide) - implementation(libs.androidx.paging.runtime) - implementation(libs.androidx.swiperefreshlayout) + implementation("com.github.bumptech.glide:glide:4.16.0") + implementation("androidx.paging:paging-runtime:3.2.1") + implementation("androidx.swiperefreshlayout:swiperefreshlayout:1.1.0") + implementation("de.hdodenhof:circleimageview:3.1.0") // implementation(libs.hilt.android) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index c4e9461..286fe03 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -42,7 +42,7 @@ android:name=".ui.profile.mystore.profile.EditStoreProfileActivity" android:exported="false" /> + suspend fun getStore (): Response } \ No newline at end of file diff --git a/app/src/main/java/com/alya/ecommerce_serang/data/repository/MyStoreRepository.kt b/app/src/main/java/com/alya/ecommerce_serang/data/repository/MyStoreRepository.kt new file mode 100644 index 0000000..003f772 --- /dev/null +++ b/app/src/main/java/com/alya/ecommerce_serang/data/repository/MyStoreRepository.kt @@ -0,0 +1,31 @@ +package com.alya.ecommerce_serang.data.repository + +import android.util.Log +import com.alya.ecommerce_serang.data.api.dto.Store +import com.alya.ecommerce_serang.data.api.response.StoreResponse +import com.alya.ecommerce_serang.data.api.retrofit.ApiService +import retrofit2.HttpException +import java.io.IOException + +class MyStoreRepository(private val apiService: ApiService) { + suspend fun fetchMyStoreProfile(): Result { + return try { + val response = apiService.getStore() + + if (response.isSuccessful) { + val storeResponse: StoreResponse? = response.body() + Result.Success(storeResponse?.store) // ✅ Return Success with Store data + } else { + val errorMessage = response.errorBody()?.string() ?: "Unknown API error" + Log.e("MyStoreRepository", "Error: $errorMessage") + Result.Error(HttpException(response)) // ✅ Wrap API error in Result.Error + } + } catch (e: IOException) { + Log.e("MyStoreRepository", "Network error: ${e.message}") + Result.Error(e) // ✅ Handle network-related errors + } catch (e: Exception) { + Log.e("MyStoreRepository", "Unexpected error: ${e.message}") + Result.Error(e) // ✅ Handle unexpected errors + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/alya/ecommerce_serang/ui/product/ProductViewModel.kt b/app/src/main/java/com/alya/ecommerce_serang/ui/product/ProductViewModel.kt index 87bb380..e349bfa 100644 --- a/app/src/main/java/com/alya/ecommerce_serang/ui/product/ProductViewModel.kt +++ b/app/src/main/java/com/alya/ecommerce_serang/ui/product/ProductViewModel.kt @@ -4,9 +4,9 @@ import androidx.lifecycle.LiveData import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope +import com.alya.ecommerce_serang.data.api.dto.Store import com.alya.ecommerce_serang.data.api.response.Product import com.alya.ecommerce_serang.data.api.response.ReviewsItem -import com.alya.ecommerce_serang.data.api.response.Store import com.alya.ecommerce_serang.data.repository.ProductRepository import kotlinx.coroutines.launch 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 71329ba..893f568 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 @@ -15,7 +15,7 @@ import com.alya.ecommerce_serang.data.api.dto.UserProfile import com.alya.ecommerce_serang.data.api.retrofit.ApiConfig import com.alya.ecommerce_serang.data.repository.UserRepository import com.alya.ecommerce_serang.databinding.FragmentProfileBinding -import com.alya.ecommerce_serang.ui.profile.mystore.TokoSayaActivity +import com.alya.ecommerce_serang.ui.profile.mystore.MyStoreActivity import com.alya.ecommerce_serang.utils.BaseViewModelFactory import com.alya.ecommerce_serang.utils.SessionManager import com.bumptech.glide.Glide @@ -54,7 +54,7 @@ class ProfileFragment : Fragment() { viewModel.loadUserProfile() binding.cardBukaToko.setOnClickListener{ - val intentBuka = Intent(requireContext(), TokoSayaActivity::class.java) + val intentBuka = Intent(requireContext(), MyStoreActivity::class.java) startActivity(intentBuka) } diff --git a/app/src/main/java/com/alya/ecommerce_serang/ui/profile/mystore/MyStoreActivity.kt b/app/src/main/java/com/alya/ecommerce_serang/ui/profile/mystore/MyStoreActivity.kt new file mode 100644 index 0000000..1eddad1 --- /dev/null +++ b/app/src/main/java/com/alya/ecommerce_serang/ui/profile/mystore/MyStoreActivity.kt @@ -0,0 +1,67 @@ +package com.alya.ecommerce_serang.ui.profile.mystore + +import android.os.Bundle +import android.widget.Toast +import androidx.activity.enableEdgeToEdge +import androidx.activity.viewModels +import androidx.appcompat.app.AppCompatActivity +import androidx.fragment.app.viewModels +import com.alya.ecommerce_serang.data.api.dto.Store +import com.alya.ecommerce_serang.data.api.dto.UserProfile +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.MyStoreRepository +import com.alya.ecommerce_serang.data.repository.UserRepository +import com.alya.ecommerce_serang.databinding.ActivityMyStoreBinding +import com.alya.ecommerce_serang.ui.profile.ProfileViewModel +import com.alya.ecommerce_serang.utils.BaseViewModelFactory +import com.alya.ecommerce_serang.utils.SessionManager +import com.bumptech.glide.Glide +import kotlin.getValue + +class MyStoreActivity : AppCompatActivity() { + private lateinit var binding: ActivityMyStoreBinding + private lateinit var apiService: ApiService + private lateinit var sessionManager: SessionManager + + private val viewModel: MyStoreViewModel by viewModels { + BaseViewModelFactory { + val apiService = ApiConfig.getApiService(sessionManager) + val myStoreRepository = MyStoreRepository(apiService) + MyStoreViewModel(myStoreRepository) + } + } + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + binding = ActivityMyStoreBinding.inflate(layoutInflater) + setContentView(binding.root) + + sessionManager = SessionManager(this) + apiService = ApiConfig.getApiService(sessionManager) + + enableEdgeToEdge() + + viewModel.loadMyStore() + + viewModel.myStoreProfile.observe(this){ user -> + user?.let { myStoreProfileOverview(it) } + } + + viewModel.errorMessage.observe(this) { error -> + Toast.makeText(this, error, Toast.LENGTH_SHORT).show() + } + } + + private fun myStoreProfileOverview(store: Store){ + + binding.tvStoreName.setText(store.storeName.toString()) + binding.tvStoreType.setText(store.storeType.toString()) + +// if (store.storeImage != null && user.image is String) { +// Glide.with(this) +// .load(user.image) +// .into(binding.profileImage) +// } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/alya/ecommerce_serang/ui/profile/mystore/MyStoreViewModel.kt b/app/src/main/java/com/alya/ecommerce_serang/ui/profile/mystore/MyStoreViewModel.kt new file mode 100644 index 0000000..faff88c --- /dev/null +++ b/app/src/main/java/com/alya/ecommerce_serang/ui/profile/mystore/MyStoreViewModel.kt @@ -0,0 +1,28 @@ +package com.alya.ecommerce_serang.ui.profile.mystore + +import androidx.lifecycle.LiveData +import androidx.lifecycle.MutableLiveData +import androidx.lifecycle.ViewModel +import androidx.lifecycle.viewModelScope +import com.alya.ecommerce_serang.data.api.dto.Store +import com.alya.ecommerce_serang.data.repository.MyStoreRepository +import com.alya.ecommerce_serang.data.repository.Result +import kotlinx.coroutines.launch + +class MyStoreViewModel(private val myStoreRepository: MyStoreRepository): ViewModel() { + private val _myStoreProfile = MutableLiveData() + val myStoreProfile: LiveData = _myStoreProfile + + private val _errorMessage = MutableLiveData() + val errorMessage : LiveData = _errorMessage + + fun loadMyStore(){ + viewModelScope.launch { + when (val result = myStoreRepository.fetchMyStoreProfile()){ + is Result.Success -> _myStoreProfile.postValue(result.data) + is Result.Error -> _errorMessage.postValue(result.exception.message ?: "Unknown Error") + is Result.Loading -> null + } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/alya/ecommerce_serang/ui/profile/mystore/TokoSayaActivity.kt b/app/src/main/java/com/alya/ecommerce_serang/ui/profile/mystore/TokoSayaActivity.kt deleted file mode 100644 index 87f4748..0000000 --- a/app/src/main/java/com/alya/ecommerce_serang/ui/profile/mystore/TokoSayaActivity.kt +++ /dev/null @@ -1,21 +0,0 @@ -package com.alya.ecommerce_serang.ui.profile.mystore - -import android.os.Bundle -import androidx.activity.enableEdgeToEdge -import androidx.appcompat.app.AppCompatActivity -import androidx.core.view.ViewCompat -import androidx.core.view.WindowInsetsCompat -import com.alya.ecommerce_serang.R - -class TokoSayaActivity : AppCompatActivity() { - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - enableEdgeToEdge() - setContentView(R.layout.activity_toko_saya) - 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 - } - } -} \ No newline at end of file diff --git a/app/src/main/res/layout-v28/activity_toko_saya.xml b/app/src/main/res/layout-v28/activity_toko_saya.xml deleted file mode 100644 index 21b20a2..0000000 --- a/app/src/main/res/layout-v28/activity_toko_saya.xml +++ /dev/null @@ -1,50 +0,0 @@ - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/layout/activity_toko_saya.xml b/app/src/main/res/layout/activity_my_store.xml similarity index 99% rename from app/src/main/res/layout/activity_toko_saya.xml rename to app/src/main/res/layout/activity_my_store.xml index 8312727..4d1dff9 100644 --- a/app/src/main/res/layout/activity_toko_saya.xml +++ b/app/src/main/res/layout/activity_my_store.xml @@ -6,7 +6,7 @@ android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" - tools:context=".ui.profile.mystore.TokoSayaActivity"> + tools:context=".ui.profile.mystore.MyStoreActivity">