From 181106eaf511a95da56a195e6720837982b102e9 Mon Sep 17 00:00:00 2001 From: Gracia Date: Sat, 19 Apr 2025 20:49:38 +0700 Subject: [PATCH 1/3] update product --- app/src/main/AndroidManifest.xml | 2 +- .../data/api/dto/CheckoutData.kt | 2 +- .../ecommerce_serang/data/api/dto/Preorder.kt | 15 ++ .../ecommerce_serang/data/api/dto/Product.kt | 5 +- .../{ => customer}/cart/AddCartResponse.kt | 2 +- .../{ => customer}/cart/CartActivity.kt | 2 +- .../{ => customer}/cart/ListCartResponse.kt | 2 +- .../{ => customer}/cart/UpdateCartResponse.kt | 2 +- .../order/CourierCostResponse.kt | 2 +- .../order/CreateOrderResponse.kt | 2 +- .../{ => customer}/order/ListCityResponse.kt | 2 +- .../order/ListProvinceResponse.kt | 2 +- .../order/OrderDetailResponse.kt | 2 +- .../{ => customer}/order/OrderListResponse.kt | 2 +- .../product/AllProductResponse.kt | 2 +- .../product/AllStoreResponse.kt | 2 +- .../product/CategoryResponse.kt | 2 +- .../product/DetailStoreProductResponse.kt | 2 +- .../{ => customer}/product/ProductResponse.kt | 2 +- .../product/ReviewProductResponse.kt | 2 +- .../{ => customer}/product/StoreResponse.kt | 2 +- .../{ => customer}/profile/AddressResponse.kt | 2 +- .../profile/CreateAddressResponse.kt | 2 +- .../{ => customer}/profile/ProfileResponse.kt | 2 +- .../orders/AddShippingReceiptResponse.kt | 9 + .../store/orders/KonfirmasiTagihanResponse.kt | 48 +++++ .../store/orders/OrderListResponse.kt | 168 ++++++++++++++++ .../orders/PaymentConfirmationResponse.kt | 9 + .../store/orders/UpdateOrderItemResponse.kt | 75 +++++++ .../product/CreateProductResponse.kt | 16 +- .../store/product/DeleteProductResponse.kt | 9 + .../store/product/UpdateProductResponse.kt | 13 ++ .../product}/ViewStoreProductsResponse.kt | 4 +- .../data/api/retrofit/ApiService.kt | 54 ++++-- .../data/repository/MyStoreRepository.kt | 2 +- .../data/repository/OrderRepository.kt | 20 +- .../data/repository/ProductRepository.kt | 45 ++++- .../ui/order/CartCheckoutAdapter.kt | 2 +- .../ui/order/CheckoutActivity.kt | 2 +- .../ui/order/CheckoutViewModel.kt | 8 +- .../ui/order/PaymentMethodAdapter.kt | 2 +- .../ui/order/ShippingAdapter.kt | 4 +- .../ui/order/ShippingViewModel.kt | 2 +- .../ui/order/SingleItemCartAdapter.kt | 2 +- .../ui/order/address/AddAddressActivity.kt | 4 +- .../ui/order/address/AddAddressViewModel.kt | 4 +- .../ui/order/address/AddressAdapter.kt | 2 +- .../ui/order/address/AddressViewModel.kt | 2 +- .../ui/order/address/ProvinceAdapter.kt | 4 +- .../ui/product/DetailProductActivity.kt | 6 +- .../ui/product/ProductUserViewModel.kt | 8 +- .../ui/product/ReviewsAdapter.kt | 2 +- .../mystore/product/ProductActivity.kt | 7 +- .../ProductOptionsBottomSheetFragment.kt | 25 ++- .../product/StoreProductDetailActivity.kt | 183 +++++++++++++----- .../utils/viewmodel/ProductViewModel.kt | 43 +++- app/src/main/res/layout/activity_cart.xml | 2 +- .../layout/activity_store_product_detail.xml | 102 +++++----- 58 files changed, 731 insertions(+), 221 deletions(-) create mode 100644 app/src/main/java/com/alya/ecommerce_serang/data/api/dto/Preorder.kt rename app/src/main/java/com/alya/ecommerce_serang/data/api/response/{ => customer}/cart/AddCartResponse.kt (88%) rename app/src/main/java/com/alya/ecommerce_serang/data/api/response/{ => customer}/cart/CartActivity.kt (91%) rename app/src/main/java/com/alya/ecommerce_serang/data/api/response/{ => customer}/cart/ListCartResponse.kt (93%) rename app/src/main/java/com/alya/ecommerce_serang/data/api/response/{ => customer}/cart/UpdateCartResponse.kt (68%) rename app/src/main/java/com/alya/ecommerce_serang/data/api/response/{ => customer}/order/CourierCostResponse.kt (89%) rename app/src/main/java/com/alya/ecommerce_serang/data/api/response/{ => customer}/order/CreateOrderResponse.kt (96%) rename app/src/main/java/com/alya/ecommerce_serang/data/api/response/{ => customer}/order/ListCityResponse.kt (83%) rename app/src/main/java/com/alya/ecommerce_serang/data/api/response/{ => customer}/order/ListProvinceResponse.kt (84%) rename app/src/main/java/com/alya/ecommerce_serang/data/api/response/{ => customer}/order/OrderDetailResponse.kt (97%) rename app/src/main/java/com/alya/ecommerce_serang/data/api/response/{ => customer}/order/OrderListResponse.kt (96%) rename app/src/main/java/com/alya/ecommerce_serang/data/api/response/{ => customer}/product/AllProductResponse.kt (79%) rename app/src/main/java/com/alya/ecommerce_serang/data/api/response/{ => customer}/product/AllStoreResponse.kt (89%) rename app/src/main/java/com/alya/ecommerce_serang/data/api/response/{ => customer}/product/CategoryResponse.kt (79%) rename app/src/main/java/com/alya/ecommerce_serang/data/api/response/{ => customer}/product/DetailStoreProductResponse.kt (94%) rename app/src/main/java/com/alya/ecommerce_serang/data/api/response/{ => customer}/product/ProductResponse.kt (94%) rename app/src/main/java/com/alya/ecommerce_serang/data/api/response/{ => customer}/product/ReviewProductResponse.kt (91%) rename app/src/main/java/com/alya/ecommerce_serang/data/api/response/{ => customer}/product/StoreResponse.kt (97%) rename app/src/main/java/com/alya/ecommerce_serang/data/api/response/{ => customer}/profile/AddressResponse.kt (93%) rename app/src/main/java/com/alya/ecommerce_serang/data/api/response/{ => customer}/profile/CreateAddressResponse.kt (67%) rename app/src/main/java/com/alya/ecommerce_serang/data/api/response/{ => customer}/profile/ProfileResponse.kt (78%) create mode 100644 app/src/main/java/com/alya/ecommerce_serang/data/api/response/store/orders/AddShippingReceiptResponse.kt create mode 100644 app/src/main/java/com/alya/ecommerce_serang/data/api/response/store/orders/KonfirmasiTagihanResponse.kt create mode 100644 app/src/main/java/com/alya/ecommerce_serang/data/api/response/store/orders/OrderListResponse.kt create mode 100644 app/src/main/java/com/alya/ecommerce_serang/data/api/response/store/orders/PaymentConfirmationResponse.kt create mode 100644 app/src/main/java/com/alya/ecommerce_serang/data/api/response/store/orders/UpdateOrderItemResponse.kt rename app/src/main/java/com/alya/ecommerce_serang/data/api/response/{ => store}/product/CreateProductResponse.kt (51%) create mode 100644 app/src/main/java/com/alya/ecommerce_serang/data/api/response/store/product/DeleteProductResponse.kt create mode 100644 app/src/main/java/com/alya/ecommerce_serang/data/api/response/store/product/UpdateProductResponse.kt rename app/src/main/java/com/alya/ecommerce_serang/data/api/response/{ => store/product}/ViewStoreProductsResponse.kt (81%) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 4fb8fce..f53b801 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -22,7 +22,7 @@ android:usesCleartextTraffic="true" tools:targetApi="31"> ? = null +) + +data class UpdatedOrder( + + @field:SerializedName("payment_method_id") + val paymentMethodId: Int? = null, + + @field:SerializedName("updated_at") + val updatedAt: String? = null, + + @field:SerializedName("total_amount") + val totalAmount: String? = null, + + @field:SerializedName("user_id") + val userId: Int? = null, + + @field:SerializedName("address_id") + val addressId: Int? = null, + + @field:SerializedName("is_negotiable") + val isNegotiable: Boolean? = null, + + @field:SerializedName("created_at") + val createdAt: String? = null, + + @field:SerializedName("voucher_id") + val voucherId: Any? = null, + + @field:SerializedName("id") + val id: Int? = null, + + @field:SerializedName("status") + val status: String? = null +) diff --git a/app/src/main/java/com/alya/ecommerce_serang/data/api/response/store/orders/OrderListResponse.kt b/app/src/main/java/com/alya/ecommerce_serang/data/api/response/store/orders/OrderListResponse.kt new file mode 100644 index 0000000..ec5d048 --- /dev/null +++ b/app/src/main/java/com/alya/ecommerce_serang/data/api/response/store/orders/OrderListResponse.kt @@ -0,0 +1,168 @@ +package com.alya.ecommerce_serang.data.api.response.store.orders + +import com.google.gson.annotations.SerializedName + +data class OrderListResponse( + + @field:SerializedName("orders") + val orders: List? = null, + + @field:SerializedName("message") + val message: String? = null +) + +data class Voucher( + + @field:SerializedName("name") + val name: Any? = null, + + @field:SerializedName("voucher_id") + val voucherId: Any? = null, + + @field:SerializedName("voucher_code") + val voucherCode: Any? = null +) + +data class Shipment( + + @field:SerializedName("receipt_num") + val receiptNum: Any? = null, + + @field:SerializedName("courier") + val courier: Any? = null, + + @field:SerializedName("price") + val price: Any? = null, + + @field:SerializedName("service") + val service: Any? = null, + + @field:SerializedName("shipment_id") + val shipmentId: Any? = null, + + @field:SerializedName("status") + val status: Any? = null +) + +data class OrderItemsItem( + + @field:SerializedName("review_id") + val reviewId: Int? = null, + + @field:SerializedName("quantity") + val quantity: Int? = null, + + @field:SerializedName("price") + val price: Int? = null, + + @field:SerializedName("subtotal") + val subtotal: Int? = null, + + @field:SerializedName("product_image") + val productImage: String? = null, + + @field:SerializedName("store_name") + val storeName: String? = null, + + @field:SerializedName("product_price") + val productPrice: Int? = null, + + @field:SerializedName("product_name") + val productName: String? = null +) + +data class Address( + + @field:SerializedName("is_store_location") + val isStoreLocation: Boolean? = null, + + @field:SerializedName("province_id") + val provinceId: Int? = null, + + @field:SerializedName("street") + val street: String? = null, + + @field:SerializedName("subdistrict") + val subdistrict: String? = null, + + @field:SerializedName("latitude") + val latitude: Any? = null, + + @field:SerializedName("address_id") + val addressId: Int? = null, + + @field:SerializedName("detail") + val detail: String? = null, + + @field:SerializedName("postal_code") + val postalCode: String? = null, + + @field:SerializedName("longitude") + val longitude: Any? = null, + + @field:SerializedName("city_id") + val cityId: Int? = null +) + +data class Payment( + + @field:SerializedName("evidence") + val evidence: Any? = null, + + @field:SerializedName("uploaded_at") + val uploadedAt: Any? = null, + + @field:SerializedName("payment_id") + val paymentId: Any? = null +) + +data class OrdersItem( + + @field:SerializedName("address") + val address: Address? = null, + + @field:SerializedName("shipment") + val shipment: Shipment? = null, + + @field:SerializedName("voucher") + val voucher: Voucher? = null, + + @field:SerializedName("address_id") + val addressId: Int? = null, + + @field:SerializedName("is_negotiable") + val isNegotiable: Boolean? = null, + + @field:SerializedName("created_at") + val createdAt: String? = null, + + @field:SerializedName("payment_method_id") + val paymentMethodId: Int? = null, + + @field:SerializedName("updated_at") + val updatedAt: String? = null, + + @field:SerializedName("user_id") + val userId: Int? = null, + + @field:SerializedName("total_amount") + val totalAmount: String? = null, + + @field:SerializedName("voucher_id") + val voucherId: Any? = null, + + @field:SerializedName("payment") + val payment: Payment? = null, + + @field:SerializedName("order_id") + val orderId: Int? = null, + + @field:SerializedName("username") + val username: String? = null, + + @field:SerializedName("status") + val status: String? = null, + + @field:SerializedName("order_items") + val orderItems: List? = null +) diff --git a/app/src/main/java/com/alya/ecommerce_serang/data/api/response/store/orders/PaymentConfirmationResponse.kt b/app/src/main/java/com/alya/ecommerce_serang/data/api/response/store/orders/PaymentConfirmationResponse.kt new file mode 100644 index 0000000..498cb6f --- /dev/null +++ b/app/src/main/java/com/alya/ecommerce_serang/data/api/response/store/orders/PaymentConfirmationResponse.kt @@ -0,0 +1,9 @@ +package com.alya.ecommerce_serang.data.api.response.store.orders + +import com.google.gson.annotations.SerializedName + +data class PaymentConfirmationResponse( + + @field:SerializedName("message") + val message: String? = null +) diff --git a/app/src/main/java/com/alya/ecommerce_serang/data/api/response/store/orders/UpdateOrderItemResponse.kt b/app/src/main/java/com/alya/ecommerce_serang/data/api/response/store/orders/UpdateOrderItemResponse.kt new file mode 100644 index 0000000..9e6b08c --- /dev/null +++ b/app/src/main/java/com/alya/ecommerce_serang/data/api/response/store/orders/UpdateOrderItemResponse.kt @@ -0,0 +1,75 @@ +package com.alya.ecommerce_serang.data.api.response.store.orders + +import com.google.gson.annotations.SerializedName + +data class UpdateOrderItemResponse( + + @field:SerializedName("message") + val message: String? = null, + + @field:SerializedName("updatedOrder") + val updatedOrder: UpdatedOrder? = null, + + @field:SerializedName("updatedItems") + val updatedItems: List? = null +) + +data class UpdatedItemsItem( + + @field:SerializedName("quantity") + val quantity: Int? = null, + + @field:SerializedName("price") + val price: String? = null, + + @field:SerializedName("subtotal") + val subtotal: String? = null, + + @field:SerializedName("product_id") + val productId: Int? = null, + + @field:SerializedName("id") + val id: Int? = null, + + @field:SerializedName("order_id") + val orderId: Int? = null +) + +data class UpdatedOrder( + + @field:SerializedName("auto_canceled_at") + val autoCanceledAt: String? = null, + + @field:SerializedName("payment_method_id") + val paymentMethodId: Int? = null, + + @field:SerializedName("auto_completed_at") + val autoCompletedAt: String? = null, + + @field:SerializedName("updated_at") + val updatedAt: String? = null, + + @field:SerializedName("total_amount") + val totalAmount: String? = null, + + @field:SerializedName("user_id") + val userId: Int? = null, + + @field:SerializedName("address_id") + val addressId: Int? = null, + + @field:SerializedName("is_negotiable") + val isNegotiable: Boolean? = null, + + @field:SerializedName("created_at") + val createdAt: String? = null, + + @field:SerializedName("voucher_id") + val voucherId: Any? = null, + + @field:SerializedName("id") + val id: Int? = null, + + @field:SerializedName("status") + val status: String? = null +) diff --git a/app/src/main/java/com/alya/ecommerce_serang/data/api/response/product/CreateProductResponse.kt b/app/src/main/java/com/alya/ecommerce_serang/data/api/response/store/product/CreateProductResponse.kt similarity index 51% rename from app/src/main/java/com/alya/ecommerce_serang/data/api/response/product/CreateProductResponse.kt rename to app/src/main/java/com/alya/ecommerce_serang/data/api/response/store/product/CreateProductResponse.kt index fcd9aec..53d6bf6 100644 --- a/app/src/main/java/com/alya/ecommerce_serang/data/api/response/product/CreateProductResponse.kt +++ b/app/src/main/java/com/alya/ecommerce_serang/data/api/response/store/product/CreateProductResponse.kt @@ -1,5 +1,7 @@ -package com.alya.ecommerce_serang.data.api.response.product +package com.alya.ecommerce_serang.data.api.response.store.product +import com.alya.ecommerce_serang.data.api.dto.Preorder +import com.alya.ecommerce_serang.data.api.dto.Product import com.google.gson.annotations.SerializedName data class CreateProductResponse( @@ -13,15 +15,3 @@ data class CreateProductResponse( @field:SerializedName("preorder") val preorder: Preorder? = null ) - -data class Preorder( - - @field:SerializedName("duration") - val duration: Int? = null, - - @field:SerializedName("product_id") - val productId: Int? = null, - - @field:SerializedName("id") - val id: Int? = null -) diff --git a/app/src/main/java/com/alya/ecommerce_serang/data/api/response/store/product/DeleteProductResponse.kt b/app/src/main/java/com/alya/ecommerce_serang/data/api/response/store/product/DeleteProductResponse.kt new file mode 100644 index 0000000..2365d34 --- /dev/null +++ b/app/src/main/java/com/alya/ecommerce_serang/data/api/response/store/product/DeleteProductResponse.kt @@ -0,0 +1,9 @@ +package com.alya.ecommerce_serang.data.api.response.store.product + +import com.google.gson.annotations.SerializedName + +data class DeleteProductResponse( + + @field:SerializedName("message") + val message: String? = null +) diff --git a/app/src/main/java/com/alya/ecommerce_serang/data/api/response/store/product/UpdateProductResponse.kt b/app/src/main/java/com/alya/ecommerce_serang/data/api/response/store/product/UpdateProductResponse.kt new file mode 100644 index 0000000..b20fe20 --- /dev/null +++ b/app/src/main/java/com/alya/ecommerce_serang/data/api/response/store/product/UpdateProductResponse.kt @@ -0,0 +1,13 @@ +package com.alya.ecommerce_serang.data.api.response.store.product + +import com.alya.ecommerce_serang.data.api.dto.Product +import com.google.gson.annotations.SerializedName + +data class UpdateProductResponse( + + @field:SerializedName("product") + val product: Product? = null, + + @field:SerializedName("message") + val message: String? = null +) diff --git a/app/src/main/java/com/alya/ecommerce_serang/data/api/response/ViewStoreProductsResponse.kt b/app/src/main/java/com/alya/ecommerce_serang/data/api/response/store/product/ViewStoreProductsResponse.kt similarity index 81% rename from app/src/main/java/com/alya/ecommerce_serang/data/api/response/ViewStoreProductsResponse.kt rename to app/src/main/java/com/alya/ecommerce_serang/data/api/response/store/product/ViewStoreProductsResponse.kt index c933ac7..1566de1 100644 --- a/app/src/main/java/com/alya/ecommerce_serang/data/api/response/ViewStoreProductsResponse.kt +++ b/app/src/main/java/com/alya/ecommerce_serang/data/api/response/store/product/ViewStoreProductsResponse.kt @@ -1,4 +1,4 @@ -package com.alya.ecommerce_serang.data.api.response +package com.alya.ecommerce_serang.data.api.response.store.product import com.alya.ecommerce_serang.data.api.dto.ProductsItem import com.google.gson.annotations.SerializedName @@ -10,4 +10,4 @@ data class ViewStoreProductsResponse( @field:SerializedName("products") val products: List? = null -) +) \ No newline at end of file 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 50344b0..43528f2 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,40 +9,42 @@ import com.alya.ecommerce_serang.data.api.dto.OrderRequestBuy 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.UpdateCart -import com.alya.ecommerce_serang.data.api.response.product.CreateProductResponse -import com.alya.ecommerce_serang.data.api.response.ViewStoreProductsResponse +import com.alya.ecommerce_serang.data.api.response.store.product.CreateProductResponse +import com.alya.ecommerce_serang.data.api.response.store.product.ViewStoreProductsResponse import okhttp3.MultipartBody import okhttp3.RequestBody 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 -import com.alya.ecommerce_serang.data.api.response.cart.AddCartResponse -import com.alya.ecommerce_serang.data.api.response.cart.ListCartResponse -import com.alya.ecommerce_serang.data.api.response.cart.UpdateCartResponse -import com.alya.ecommerce_serang.data.api.response.order.CourierCostResponse -import com.alya.ecommerce_serang.data.api.response.order.CreateOrderResponse -import com.alya.ecommerce_serang.data.api.response.order.ListCityResponse -import com.alya.ecommerce_serang.data.api.response.order.ListProvinceResponse -import com.alya.ecommerce_serang.data.api.response.product.AllProductResponse -import com.alya.ecommerce_serang.data.api.response.product.CategoryResponse -import com.alya.ecommerce_serang.data.api.response.product.DetailStoreProductResponse -import com.alya.ecommerce_serang.data.api.response.product.ProductResponse -import com.alya.ecommerce_serang.data.api.response.product.ReviewProductResponse -import com.alya.ecommerce_serang.data.api.response.product.StoreResponse -import com.alya.ecommerce_serang.data.api.response.profile.AddressResponse -import com.alya.ecommerce_serang.data.api.response.profile.CreateAddressResponse -import com.alya.ecommerce_serang.data.api.response.profile.ProfileResponse +import com.alya.ecommerce_serang.data.api.response.customer.cart.AddCartResponse +import com.alya.ecommerce_serang.data.api.response.customer.cart.ListCartResponse +import com.alya.ecommerce_serang.data.api.response.customer.cart.UpdateCartResponse +import com.alya.ecommerce_serang.data.api.response.customer.order.CourierCostResponse +import com.alya.ecommerce_serang.data.api.response.customer.order.CreateOrderResponse +import com.alya.ecommerce_serang.data.api.response.customer.order.ListCityResponse +import com.alya.ecommerce_serang.data.api.response.customer.order.ListProvinceResponse +import com.alya.ecommerce_serang.data.api.response.customer.product.AllProductResponse +import com.alya.ecommerce_serang.data.api.response.customer.product.CategoryResponse +import com.alya.ecommerce_serang.data.api.response.customer.product.DetailStoreProductResponse +import com.alya.ecommerce_serang.data.api.response.customer.product.ProductResponse +import com.alya.ecommerce_serang.data.api.response.customer.product.ReviewProductResponse +import com.alya.ecommerce_serang.data.api.response.customer.product.StoreResponse +import com.alya.ecommerce_serang.data.api.response.customer.profile.AddressResponse +import com.alya.ecommerce_serang.data.api.response.customer.profile.CreateAddressResponse +import com.alya.ecommerce_serang.data.api.response.customer.profile.ProfileResponse +import com.alya.ecommerce_serang.data.api.response.store.product.DeleteProductResponse +import com.alya.ecommerce_serang.data.api.response.store.product.UpdateProductResponse import retrofit2.Call import retrofit2.Response import retrofit2.http.Body +import retrofit2.http.DELETE import retrofit2.http.GET -import retrofit2.http.Header -import retrofit2.http.HeaderMap import retrofit2.http.Multipart import retrofit2.http.POST import retrofit2.http.Part import retrofit2.http.PUT import retrofit2.http.Path +import retrofit2.http.Query interface ApiService { @POST("registeruser") @@ -126,11 +128,23 @@ interface ApiService { @Part("duration") duration: RequestBody, @Part("category_id") categoryId: RequestBody, @Part("status") status: RequestBody, + @Part("condition") condition: RequestBody, @Part image: MultipartBody.Part?, @Part sppirt: MultipartBody.Part?, @Part halal: MultipartBody.Part? ): Response + @PUT("store/editproduct/{id}") + suspend fun updateProduct( + @Path("id") productId: Int?, + @Body updatedProduct: Map + ): Response + + @DELETE("store/deleteproduct/{id}") + suspend fun deleteProduct( + @Path("id") productId: Int + ): Response + @GET("cart_item") suspend fun getCart (): Response 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 index 71dd35c..c14a0fd 100644 --- 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 @@ -2,7 +2,7 @@ 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.product.StoreResponse +import com.alya.ecommerce_serang.data.api.response.customer.product.StoreResponse import com.alya.ecommerce_serang.data.api.retrofit.ApiService import retrofit2.HttpException import java.io.IOException diff --git a/app/src/main/java/com/alya/ecommerce_serang/data/repository/OrderRepository.kt b/app/src/main/java/com/alya/ecommerce_serang/data/repository/OrderRepository.kt index d2aad68..f3b2bcf 100644 --- a/app/src/main/java/com/alya/ecommerce_serang/data/repository/OrderRepository.kt +++ b/app/src/main/java/com/alya/ecommerce_serang/data/repository/OrderRepository.kt @@ -5,16 +5,16 @@ 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.OrderRequest import com.alya.ecommerce_serang.data.api.dto.OrderRequestBuy -import com.alya.ecommerce_serang.data.api.response.cart.DataItem -import com.alya.ecommerce_serang.data.api.response.order.CourierCostResponse -import com.alya.ecommerce_serang.data.api.response.order.CreateOrderResponse -import com.alya.ecommerce_serang.data.api.response.order.ListCityResponse -import com.alya.ecommerce_serang.data.api.response.order.ListProvinceResponse -import com.alya.ecommerce_serang.data.api.response.product.ProductResponse -import com.alya.ecommerce_serang.data.api.response.product.StoreProduct -import com.alya.ecommerce_serang.data.api.response.product.StoreResponse -import com.alya.ecommerce_serang.data.api.response.profile.AddressResponse -import com.alya.ecommerce_serang.data.api.response.profile.CreateAddressResponse +import com.alya.ecommerce_serang.data.api.response.customer.cart.DataItem +import com.alya.ecommerce_serang.data.api.response.customer.order.CourierCostResponse +import com.alya.ecommerce_serang.data.api.response.customer.order.CreateOrderResponse +import com.alya.ecommerce_serang.data.api.response.customer.order.ListCityResponse +import com.alya.ecommerce_serang.data.api.response.customer.order.ListProvinceResponse +import com.alya.ecommerce_serang.data.api.response.customer.product.ProductResponse +import com.alya.ecommerce_serang.data.api.response.customer.product.StoreProduct +import com.alya.ecommerce_serang.data.api.response.customer.product.StoreResponse +import com.alya.ecommerce_serang.data.api.response.customer.profile.AddressResponse +import com.alya.ecommerce_serang.data.api.response.customer.profile.CreateAddressResponse import com.alya.ecommerce_serang.data.api.retrofit.ApiService import retrofit2.Response diff --git a/app/src/main/java/com/alya/ecommerce_serang/data/repository/ProductRepository.kt b/app/src/main/java/com/alya/ecommerce_serang/data/repository/ProductRepository.kt index 1a8781c..dbf61cc 100644 --- a/app/src/main/java/com/alya/ecommerce_serang/data/repository/ProductRepository.kt +++ b/app/src/main/java/com/alya/ecommerce_serang/data/repository/ProductRepository.kt @@ -3,20 +3,20 @@ package com.alya.ecommerce_serang.data.repository import android.util.Log import com.alya.ecommerce_serang.data.api.dto.CartItem import com.alya.ecommerce_serang.data.api.dto.CategoryItem +import com.alya.ecommerce_serang.data.api.dto.Preorder import com.alya.ecommerce_serang.data.api.dto.ProductsItem -import com.alya.ecommerce_serang.data.api.response.product.CreateProductResponse -import com.alya.ecommerce_serang.data.api.response.cart.AddCartResponse -import com.alya.ecommerce_serang.data.api.response.product.ProductResponse -import com.alya.ecommerce_serang.data.api.response.product.ReviewsItem -import com.alya.ecommerce_serang.data.api.response.product.StoreProduct +import com.alya.ecommerce_serang.data.api.response.store.product.CreateProductResponse +import com.alya.ecommerce_serang.data.api.response.customer.cart.AddCartResponse +import com.alya.ecommerce_serang.data.api.response.customer.product.ProductResponse +import com.alya.ecommerce_serang.data.api.response.customer.product.ReviewsItem +import com.alya.ecommerce_serang.data.api.response.customer.product.StoreProduct +import com.alya.ecommerce_serang.data.api.response.store.product.UpdateProductResponse import com.alya.ecommerce_serang.data.api.retrofit.ApiService -import com.alya.ecommerce_serang.utils.SessionManager import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.withContext import okhttp3.MediaType.Companion.toMediaTypeOrNull import okhttp3.MultipartBody import okhttp3.RequestBody -import java.io.File class ProductRepository(private val apiService: ApiService) { suspend fun getAllProducts(): Result> = @@ -158,9 +158,10 @@ class ProductRepository(private val apiService: ApiService) { minOrder: Int, weight: Int, isPreOrder: Boolean, - duration: Int, + preorder: Preorder, categoryId: Int, status: String, + condition: String, imagePart: MultipartBody.Part?, sppirtPart: MultipartBody.Part?, halalPart: MultipartBody.Part? @@ -174,9 +175,10 @@ class ProductRepository(private val apiService: ApiService) { minOrder = RequestBody.create("text/plain".toMediaTypeOrNull(), minOrder.toString()), weight = RequestBody.create("text/plain".toMediaTypeOrNull(), weight.toString()), isPreOrder = RequestBody.create("text/plain".toMediaTypeOrNull(), isPreOrder.toString()), - duration = RequestBody.create("text/plain".toMediaTypeOrNull(), duration.toString()), + duration = RequestBody.create("text/plain".toMediaTypeOrNull(), preorder.duration.toString()), categoryId = RequestBody.create("text/plain".toMediaTypeOrNull(), categoryId.toString()), status = RequestBody.create("text/plain".toMediaTypeOrNull(), status), + condition = RequestBody.create("text/plain".toMediaTypeOrNull(), condition), image = imagePart, sppirt = sppirtPart, halal = halalPart @@ -192,6 +194,31 @@ class ProductRepository(private val apiService: ApiService) { } } + suspend fun updateProduct(productId: Int?, updatedProduct: Map) : UpdateProductResponse { + // Build the request with the updated fields + val response = apiService.updateProduct(productId, updatedProduct) + if (response.isSuccessful) { + return response.body()!! + } else { + throw Exception("Gagal memperbarui produk: ${response.code()}") + } + } + + + suspend fun deleteProduct(productId: Int): Result { + return withContext(Dispatchers.IO) { + try { + val response = apiService.deleteProduct(productId) + if (response.isSuccessful) { + Result.Success(Unit) + } else { + Result.Error(Exception("Gagal menghapus produk: ${response.code()}")) + } + } catch (e: Exception) { + Result.Error(e) + } + } + } companion object { private const val TAG = "ProductRepository" diff --git a/app/src/main/java/com/alya/ecommerce_serang/ui/order/CartCheckoutAdapter.kt b/app/src/main/java/com/alya/ecommerce_serang/ui/order/CartCheckoutAdapter.kt index ee71da9..ca38224 100644 --- a/app/src/main/java/com/alya/ecommerce_serang/ui/order/CartCheckoutAdapter.kt +++ b/app/src/main/java/com/alya/ecommerce_serang/ui/order/CartCheckoutAdapter.kt @@ -6,7 +6,7 @@ import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.RecyclerView import com.alya.ecommerce_serang.R import com.alya.ecommerce_serang.data.api.dto.CheckoutData -import com.alya.ecommerce_serang.data.api.response.cart.CartItemsItem +import com.alya.ecommerce_serang.data.api.response.customer.cart.CartItemsItem import com.alya.ecommerce_serang.databinding.ItemOrderProductBinding import com.alya.ecommerce_serang.databinding.ItemOrderSellerBinding import com.bumptech.glide.Glide 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 19cc599..2afa448 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 @@ -11,7 +11,7 @@ import androidx.recyclerview.widget.LinearLayoutManager import com.alya.ecommerce_serang.data.api.dto.CheckoutData import com.alya.ecommerce_serang.data.api.dto.OrderRequest import com.alya.ecommerce_serang.data.api.dto.OrderRequestBuy -import com.alya.ecommerce_serang.data.api.response.product.PaymentInfoItem +import com.alya.ecommerce_serang.data.api.response.customer.product.PaymentInfoItem import com.alya.ecommerce_serang.data.api.retrofit.ApiConfig import com.alya.ecommerce_serang.data.repository.OrderRepository import com.alya.ecommerce_serang.databinding.ActivityCheckoutBinding diff --git a/app/src/main/java/com/alya/ecommerce_serang/ui/order/CheckoutViewModel.kt b/app/src/main/java/com/alya/ecommerce_serang/ui/order/CheckoutViewModel.kt index e470bcf..8a27c2d 100644 --- a/app/src/main/java/com/alya/ecommerce_serang/ui/order/CheckoutViewModel.kt +++ b/app/src/main/java/com/alya/ecommerce_serang/ui/order/CheckoutViewModel.kt @@ -8,10 +8,10 @@ import androidx.lifecycle.viewModelScope import com.alya.ecommerce_serang.data.api.dto.CheckoutData import com.alya.ecommerce_serang.data.api.dto.OrderRequest import com.alya.ecommerce_serang.data.api.dto.OrderRequestBuy -import com.alya.ecommerce_serang.data.api.response.cart.CartItemsItem -import com.alya.ecommerce_serang.data.api.response.cart.DataItem -import com.alya.ecommerce_serang.data.api.response.product.PaymentInfoItem -import com.alya.ecommerce_serang.data.api.response.profile.AddressesItem +import com.alya.ecommerce_serang.data.api.response.customer.cart.CartItemsItem +import com.alya.ecommerce_serang.data.api.response.customer.cart.DataItem +import com.alya.ecommerce_serang.data.api.response.customer.product.PaymentInfoItem +import com.alya.ecommerce_serang.data.api.response.customer.profile.AddressesItem import com.alya.ecommerce_serang.data.repository.OrderRepository import com.alya.ecommerce_serang.data.repository.Result import kotlinx.coroutines.launch diff --git a/app/src/main/java/com/alya/ecommerce_serang/ui/order/PaymentMethodAdapter.kt b/app/src/main/java/com/alya/ecommerce_serang/ui/order/PaymentMethodAdapter.kt index 8621f0e..5222e26 100644 --- a/app/src/main/java/com/alya/ecommerce_serang/ui/order/PaymentMethodAdapter.kt +++ b/app/src/main/java/com/alya/ecommerce_serang/ui/order/PaymentMethodAdapter.kt @@ -4,7 +4,7 @@ import android.view.LayoutInflater import android.view.ViewGroup import androidx.recyclerview.widget.RecyclerView import com.alya.ecommerce_serang.R -import com.alya.ecommerce_serang.data.api.response.product.PaymentInfoItem +import com.alya.ecommerce_serang.data.api.response.customer.product.PaymentInfoItem import com.alya.ecommerce_serang.databinding.ItemPaymentMethodBinding import com.bumptech.glide.Glide import com.bumptech.glide.request.RequestOptions diff --git a/app/src/main/java/com/alya/ecommerce_serang/ui/order/ShippingAdapter.kt b/app/src/main/java/com/alya/ecommerce_serang/ui/order/ShippingAdapter.kt index cfbf401..bea432b 100644 --- a/app/src/main/java/com/alya/ecommerce_serang/ui/order/ShippingAdapter.kt +++ b/app/src/main/java/com/alya/ecommerce_serang/ui/order/ShippingAdapter.kt @@ -3,8 +3,8 @@ package com.alya.ecommerce_serang.ui.order import android.view.LayoutInflater import android.view.ViewGroup import androidx.recyclerview.widget.RecyclerView -import com.alya.ecommerce_serang.data.api.response.order.CourierCostsItem -import com.alya.ecommerce_serang.data.api.response.order.ServicesItem +import com.alya.ecommerce_serang.data.api.response.customer.order.CourierCostsItem +import com.alya.ecommerce_serang.data.api.response.customer.order.ServicesItem import com.alya.ecommerce_serang.databinding.ItemShippingOrderBinding class ShippingAdapter( diff --git a/app/src/main/java/com/alya/ecommerce_serang/ui/order/ShippingViewModel.kt b/app/src/main/java/com/alya/ecommerce_serang/ui/order/ShippingViewModel.kt index 17696c7..572c087 100644 --- a/app/src/main/java/com/alya/ecommerce_serang/ui/order/ShippingViewModel.kt +++ b/app/src/main/java/com/alya/ecommerce_serang/ui/order/ShippingViewModel.kt @@ -6,7 +6,7 @@ import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import com.alya.ecommerce_serang.data.api.dto.CostProduct import com.alya.ecommerce_serang.data.api.dto.CourierCostRequest -import com.alya.ecommerce_serang.data.api.response.order.CourierCostsItem +import com.alya.ecommerce_serang.data.api.response.customer.order.CourierCostsItem import com.alya.ecommerce_serang.data.repository.OrderRepository import com.alya.ecommerce_serang.data.repository.Result import kotlinx.coroutines.launch diff --git a/app/src/main/java/com/alya/ecommerce_serang/ui/order/SingleItemCartAdapter.kt b/app/src/main/java/com/alya/ecommerce_serang/ui/order/SingleItemCartAdapter.kt index 7f4d17e..e5872a3 100644 --- a/app/src/main/java/com/alya/ecommerce_serang/ui/order/SingleItemCartAdapter.kt +++ b/app/src/main/java/com/alya/ecommerce_serang/ui/order/SingleItemCartAdapter.kt @@ -4,7 +4,7 @@ import android.view.LayoutInflater import android.view.ViewGroup import androidx.recyclerview.widget.RecyclerView import com.alya.ecommerce_serang.R -import com.alya.ecommerce_serang.data.api.response.cart.CartItemsItem +import com.alya.ecommerce_serang.data.api.response.customer.cart.CartItemsItem import com.alya.ecommerce_serang.databinding.ItemOrderProductBinding import com.bumptech.glide.Glide import java.text.NumberFormat diff --git a/app/src/main/java/com/alya/ecommerce_serang/ui/order/address/AddAddressActivity.kt b/app/src/main/java/com/alya/ecommerce_serang/ui/order/address/AddAddressActivity.kt index c4b3587..3c8f2dc 100644 --- a/app/src/main/java/com/alya/ecommerce_serang/ui/order/address/AddAddressActivity.kt +++ b/app/src/main/java/com/alya/ecommerce_serang/ui/order/address/AddAddressActivity.kt @@ -15,8 +15,8 @@ import androidx.lifecycle.lifecycleScope import androidx.lifecycle.repeatOnLifecycle import com.alya.ecommerce_serang.data.api.dto.CreateAddressRequest import com.alya.ecommerce_serang.data.api.dto.UserProfile -import com.alya.ecommerce_serang.data.api.response.order.CitiesItem -import com.alya.ecommerce_serang.data.api.response.order.ProvincesItem +import com.alya.ecommerce_serang.data.api.response.customer.order.CitiesItem +import com.alya.ecommerce_serang.data.api.response.customer.order.ProvincesItem 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.OrderRepository diff --git a/app/src/main/java/com/alya/ecommerce_serang/ui/order/address/AddAddressViewModel.kt b/app/src/main/java/com/alya/ecommerce_serang/ui/order/address/AddAddressViewModel.kt index fd462d2..a9839d8 100644 --- a/app/src/main/java/com/alya/ecommerce_serang/ui/order/address/AddAddressViewModel.kt +++ b/app/src/main/java/com/alya/ecommerce_serang/ui/order/address/AddAddressViewModel.kt @@ -5,8 +5,8 @@ import androidx.lifecycle.SavedStateHandle import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import com.alya.ecommerce_serang.data.api.dto.CreateAddressRequest -import com.alya.ecommerce_serang.data.api.response.order.CitiesItem -import com.alya.ecommerce_serang.data.api.response.order.ProvincesItem +import com.alya.ecommerce_serang.data.api.response.customer.order.CitiesItem +import com.alya.ecommerce_serang.data.api.response.customer.order.ProvincesItem import com.alya.ecommerce_serang.data.repository.OrderRepository import com.alya.ecommerce_serang.data.repository.Result import kotlinx.coroutines.flow.MutableStateFlow diff --git a/app/src/main/java/com/alya/ecommerce_serang/ui/order/address/AddressAdapter.kt b/app/src/main/java/com/alya/ecommerce_serang/ui/order/address/AddressAdapter.kt index 297a3e7..e319cc0 100644 --- a/app/src/main/java/com/alya/ecommerce_serang/ui/order/address/AddressAdapter.kt +++ b/app/src/main/java/com/alya/ecommerce_serang/ui/order/address/AddressAdapter.kt @@ -9,7 +9,7 @@ import androidx.recyclerview.widget.DiffUtil import androidx.recyclerview.widget.ListAdapter import androidx.recyclerview.widget.RecyclerView import com.alya.ecommerce_serang.R -import com.alya.ecommerce_serang.data.api.response.profile.AddressesItem +import com.alya.ecommerce_serang.data.api.response.customer.profile.AddressesItem import com.google.android.material.card.MaterialCardView class AddressAdapter( diff --git a/app/src/main/java/com/alya/ecommerce_serang/ui/order/address/AddressViewModel.kt b/app/src/main/java/com/alya/ecommerce_serang/ui/order/address/AddressViewModel.kt index 0898e2f..7aec2cc 100644 --- a/app/src/main/java/com/alya/ecommerce_serang/ui/order/address/AddressViewModel.kt +++ b/app/src/main/java/com/alya/ecommerce_serang/ui/order/address/AddressViewModel.kt @@ -4,7 +4,7 @@ import androidx.lifecycle.LiveData import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope -import com.alya.ecommerce_serang.data.api.response.profile.AddressesItem +import com.alya.ecommerce_serang.data.api.response.customer.profile.AddressesItem import com.alya.ecommerce_serang.data.repository.OrderRepository import kotlinx.coroutines.launch diff --git a/app/src/main/java/com/alya/ecommerce_serang/ui/order/address/ProvinceAdapter.kt b/app/src/main/java/com/alya/ecommerce_serang/ui/order/address/ProvinceAdapter.kt index 44f7c29..7ba4660 100644 --- a/app/src/main/java/com/alya/ecommerce_serang/ui/order/address/ProvinceAdapter.kt +++ b/app/src/main/java/com/alya/ecommerce_serang/ui/order/address/ProvinceAdapter.kt @@ -2,8 +2,8 @@ package com.alya.ecommerce_serang.ui.order.address import android.content.Context import android.widget.ArrayAdapter -import com.alya.ecommerce_serang.data.api.response.order.CitiesItem -import com.alya.ecommerce_serang.data.api.response.order.ProvincesItem +import com.alya.ecommerce_serang.data.api.response.customer.order.CitiesItem +import com.alya.ecommerce_serang.data.api.response.customer.order.ProvincesItem // UI adapters and helpers class ProvinceAdapter( diff --git a/app/src/main/java/com/alya/ecommerce_serang/ui/product/DetailProductActivity.kt b/app/src/main/java/com/alya/ecommerce_serang/ui/product/DetailProductActivity.kt index bb10bdb..257e479 100644 --- a/app/src/main/java/com/alya/ecommerce_serang/ui/product/DetailProductActivity.kt +++ b/app/src/main/java/com/alya/ecommerce_serang/ui/product/DetailProductActivity.kt @@ -16,9 +16,9 @@ import com.alya.ecommerce_serang.BuildConfig.BASE_URL import com.alya.ecommerce_serang.R import com.alya.ecommerce_serang.data.api.dto.CartItem import com.alya.ecommerce_serang.data.api.dto.ProductsItem -import com.alya.ecommerce_serang.data.api.response.product.Product -import com.alya.ecommerce_serang.data.api.response.product.ReviewsItem -import com.alya.ecommerce_serang.data.api.response.product.StoreProduct +import com.alya.ecommerce_serang.data.api.response.customer.product.Product +import com.alya.ecommerce_serang.data.api.response.customer.product.ReviewsItem +import com.alya.ecommerce_serang.data.api.response.customer.product.StoreProduct 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.ProductRepository diff --git a/app/src/main/java/com/alya/ecommerce_serang/ui/product/ProductUserViewModel.kt b/app/src/main/java/com/alya/ecommerce_serang/ui/product/ProductUserViewModel.kt index 9679488..5d5c27e 100644 --- a/app/src/main/java/com/alya/ecommerce_serang/ui/product/ProductUserViewModel.kt +++ b/app/src/main/java/com/alya/ecommerce_serang/ui/product/ProductUserViewModel.kt @@ -7,10 +7,10 @@ import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import com.alya.ecommerce_serang.data.api.dto.CartItem import com.alya.ecommerce_serang.data.api.dto.ProductsItem -import com.alya.ecommerce_serang.data.api.response.cart.AddCartResponse -import com.alya.ecommerce_serang.data.api.response.product.Product -import com.alya.ecommerce_serang.data.api.response.product.ReviewsItem -import com.alya.ecommerce_serang.data.api.response.product.StoreProduct +import com.alya.ecommerce_serang.data.api.response.customer.cart.AddCartResponse +import com.alya.ecommerce_serang.data.api.response.customer.product.Product +import com.alya.ecommerce_serang.data.api.response.customer.product.ReviewsItem +import com.alya.ecommerce_serang.data.api.response.customer.product.StoreProduct import com.alya.ecommerce_serang.data.repository.ProductRepository import com.alya.ecommerce_serang.data.repository.Result import kotlinx.coroutines.launch diff --git a/app/src/main/java/com/alya/ecommerce_serang/ui/product/ReviewsAdapter.kt b/app/src/main/java/com/alya/ecommerce_serang/ui/product/ReviewsAdapter.kt index 7e4554e..8b22a8f 100644 --- a/app/src/main/java/com/alya/ecommerce_serang/ui/product/ReviewsAdapter.kt +++ b/app/src/main/java/com/alya/ecommerce_serang/ui/product/ReviewsAdapter.kt @@ -6,7 +6,7 @@ import android.view.ViewGroup import android.widget.TextView import androidx.recyclerview.widget.RecyclerView import com.alya.ecommerce_serang.R -import com.alya.ecommerce_serang.data.api.response.product.ReviewsItem +import com.alya.ecommerce_serang.data.api.response.customer.product.ReviewsItem import java.text.SimpleDateFormat import java.util.Locale import java.util.TimeZone diff --git a/app/src/main/java/com/alya/ecommerce_serang/ui/profile/mystore/product/ProductActivity.kt b/app/src/main/java/com/alya/ecommerce_serang/ui/profile/mystore/product/ProductActivity.kt index 4239a9d..0eee6be 100644 --- a/app/src/main/java/com/alya/ecommerce_serang/ui/profile/mystore/product/ProductActivity.kt +++ b/app/src/main/java/com/alya/ecommerce_serang/ui/profile/mystore/product/ProductActivity.kt @@ -36,7 +36,6 @@ class ProductActivity : AppCompatActivity() { setupHeader() setupRecyclerView() - observeViewModel() binding.progressBar.visibility = View.VISIBLE @@ -59,7 +58,7 @@ class ProductActivity : AppCompatActivity() { } is Result.Error -> { binding.progressBar.visibility = View.GONE - Toast.makeText(this, "Failed to load products: ${result.exception.message}", Toast.LENGTH_SHORT).show() + Toast.makeText(this, "Gagal memuat produk: ${result.exception.message}", Toast.LENGTH_SHORT).show() } } } @@ -74,7 +73,9 @@ class ProductActivity : AppCompatActivity() { } binding.header.headerRightText.setOnClickListener { - startActivity(Intent(this, StoreProductDetailActivity::class.java)) + val intent = Intent(this, StoreProductDetailActivity::class.java) + intent.putExtra("is_editing", false) + startActivity(intent) } } diff --git a/app/src/main/java/com/alya/ecommerce_serang/ui/profile/mystore/product/ProductOptionsBottomSheetFragment.kt b/app/src/main/java/com/alya/ecommerce_serang/ui/profile/mystore/product/ProductOptionsBottomSheetFragment.kt index f2d348a..7e1cf10 100644 --- a/app/src/main/java/com/alya/ecommerce_serang/ui/profile/mystore/product/ProductOptionsBottomSheetFragment.kt +++ b/app/src/main/java/com/alya/ecommerce_serang/ui/profile/mystore/product/ProductOptionsBottomSheetFragment.kt @@ -1,13 +1,18 @@ package com.alya.ecommerce_serang.ui.profile.mystore.product +import android.app.AlertDialog +import android.content.Intent import android.os.Bundle import androidx.fragment.app.Fragment import android.view.LayoutInflater import android.view.View import android.view.ViewGroup +import android.widget.Toast +import androidx.lifecycle.ViewModelProvider import com.alya.ecommerce_serang.R import com.alya.ecommerce_serang.data.api.dto.ProductsItem import com.alya.ecommerce_serang.databinding.FragmentProductOptionsBottomSheetBinding +import com.alya.ecommerce_serang.utils.viewmodel.ProductViewModel import com.google.android.material.bottomsheet.BottomSheetDialogFragment class ProductOptionsBottomSheetFragment(private val product: ProductsItem) : BottomSheetDialogFragment() { @@ -27,15 +32,25 @@ class ProductOptionsBottomSheetFragment(private val product: ProductsItem) : Bot super.onViewCreated(view, savedInstanceState) binding.btnEditProduct.setOnClickListener { - // Handle editing product - // Example: Open the edit activity or fragment + val intent = Intent(requireContext(), StoreProductDetailActivity::class.java) + intent.putExtra("product_id", product.id) + intent.putExtra("is_editing", true) + startActivity(intent) dismiss() } binding.btnDeleteProduct.setOnClickListener { - // Handle deleting product - // Example: Show confirmation dialog - dismiss() + AlertDialog.Builder(requireContext()) + .setTitle("Hapus Produk?") + .setMessage("Produk yang dihapus tidak dapat dikembalikan.") + .setPositiveButton("Ya, Hapus") { _, _ -> + val viewModel = ViewModelProvider(this).get(ProductViewModel::class.java) + viewModel.deleteProduct(product.id) + Toast.makeText(context, "Produk berhasil dihapus", Toast.LENGTH_SHORT).show() + dismiss() + } + .setNegativeButton("Batalkan", null) + .show() } } diff --git a/app/src/main/java/com/alya/ecommerce_serang/ui/profile/mystore/product/StoreProductDetailActivity.kt b/app/src/main/java/com/alya/ecommerce_serang/ui/profile/mystore/product/StoreProductDetailActivity.kt index a22d850..41bef9a 100644 --- a/app/src/main/java/com/alya/ecommerce_serang/ui/profile/mystore/product/StoreProductDetailActivity.kt +++ b/app/src/main/java/com/alya/ecommerce_serang/ui/profile/mystore/product/StoreProductDetailActivity.kt @@ -15,6 +15,8 @@ import androidx.activity.viewModels import androidx.appcompat.app.AppCompatActivity import androidx.core.content.ContextCompat import com.alya.ecommerce_serang.data.api.dto.CategoryItem +import com.alya.ecommerce_serang.data.api.dto.Preorder +import com.alya.ecommerce_serang.data.api.dto.Product import com.alya.ecommerce_serang.data.api.retrofit.ApiConfig import com.alya.ecommerce_serang.data.repository.ProductRepository import com.alya.ecommerce_serang.data.repository.Result @@ -22,12 +24,14 @@ import com.alya.ecommerce_serang.databinding.ActivityStoreProductDetailBinding import com.alya.ecommerce_serang.utils.viewmodel.ProductViewModel import com.alya.ecommerce_serang.utils.BaseViewModelFactory import com.alya.ecommerce_serang.utils.SessionManager +import com.bumptech.glide.Glide import okhttp3.MediaType.Companion.toMediaTypeOrNull import okhttp3.MultipartBody import okhttp3.RequestBody import java.io.File import java.io.FileOutputStream import kotlin.getValue +import androidx.core.net.toUri class StoreProductDetailActivity : AppCompatActivity() { @@ -37,6 +41,7 @@ class StoreProductDetailActivity : AppCompatActivity() { private var imageUri: Uri? = null private var sppirtUri: Uri? = null private var halalUri: Uri? = null + private var productId: Int? = null private val viewModel: ProductViewModel by viewModels { BaseViewModelFactory { @@ -79,9 +84,50 @@ class StoreProductDetailActivity : AppCompatActivity() { binding = ActivityStoreProductDetailBinding.inflate(layoutInflater) setContentView(binding.root) - setupHeader() + val isEditing = intent.getBooleanExtra("is_editing", false) + productId = intent.getIntExtra("product_id", -1) - // Fetch categories + binding.header.headerTitle.text = if (isEditing) "Ubah Produk" else "Tambah Produk" + +// if (isEditing && productId != null) { +// viewModel.productDetail.observe(this) { product -> +// product?.let { +// populateForm(it) +// } +// } +// viewModel.loadProductDetail(productId!!) +// } + + setupCategorySpinner() + setupImagePickers() + + var conditionList = listOf("Baru", "Pernah Dipakai") + val adapterCondition = ArrayAdapter(this, android.R.layout.simple_spinner_item, conditionList) + adapterCondition.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item) + binding.spinnerKondisiProduk.adapter = adapterCondition + + // Setup Pre-Order visibility + binding.switchIsPreOrder.setOnCheckedChangeListener { _, isChecked -> + binding.layoutDurasi.visibility = if (isChecked) View.VISIBLE else View.GONE + validateForm() + } + + validateForm() + + binding.btnSaveProduct.setOnClickListener { + if (isEditing) { + updateProduct(productId) + } else { + addProduct() + } + } + + binding.header.headerLeftIcon.setOnClickListener { + onBackPressedDispatcher.onBackPressed() + } + } + + private fun setupCategorySpinner() { viewModel.loadCategories() viewModel.categoryList.observe(this) { result -> if (result is Result.Success) { @@ -91,13 +137,9 @@ class StoreProductDetailActivity : AppCompatActivity() { binding.spinnerKategoriProduk.adapter = adapter } } + } - // Setup Pre-Order visibility - binding.switchIsPreOrder.setOnCheckedChangeListener { _, isChecked -> - binding.layoutDurasi.visibility = if (isChecked) View.VISIBLE else View.GONE - validateForm() - } - + private fun setupImagePickers() { binding.tvTambahFoto.setOnClickListener { val intent = Intent(Intent.ACTION_PICK).apply { type = "image/*" } imagePickerLauncher.launch(intent) @@ -125,15 +167,37 @@ class StoreProductDetailActivity : AppCompatActivity() { halalUri = null binding.switcherHalal.showPrevious() } + } + + private fun populateForm(product: Product) { + binding.edtNamaProduk.setText(product.name) + binding.edtDeskripsiProduk.setText(product.description) + binding.edtHargaProduk.setText(product.price.toString()) + binding.edtStokProduk.setText(product.stock.toString()) + binding.edtMinOrder.setText(product.minOrder.toString()) + binding.edtBeratProduk.setText(product.weight.toString()) + binding.switchIsPreOrder.isChecked = product.isPreOrder ?: false + binding.switchIsActive.isChecked = product.status == "active" + binding.spinnerKondisiProduk.setSelection(if (product.condition == "Baru") 0 else 1) + + product.categoryId?.let { + binding.spinnerKategoriProduk.setSelection(categoryList.indexOfFirst { it.id == product.categoryId }) + } + + Glide.with(this).load(product.image).into(binding.ivPreviewFoto) + binding.switcherFotoProduk.showNext() + + product.sppirt?.let { + binding.tvSppirtName.text = getFileName(it.toUri()) + binding.switcherSppirt.showNext() + } + + product.halal?.let { + binding.tvHalalName.text = getFileName(it.toUri()) + binding.switcherHalal.showNext() + } validateForm() - - binding.btnSaveProduct.setOnClickListener { - if (!binding.btnSaveProduct.isEnabled) { - return@setOnClickListener - } - submitProduct() - } } private fun isValidFile(uri: Uri): Boolean { @@ -145,6 +209,36 @@ class StoreProductDetailActivity : AppCompatActivity() { return uri.lastPathSegment?.split("/")?.last() ?: "unknown_file" } + private fun uriToNamedFile(uri: Uri, context: Context, prefix: String): File { + val extension = context.contentResolver.getType(uri)?.substringAfter("/") ?: "jpg" + val filename = "$prefix-${System.currentTimeMillis()}.$extension" + val file = File(context.cacheDir, filename) + + context.contentResolver.openInputStream(uri)?.use { input -> + FileOutputStream(file).use { output -> input.copyTo(output) } + } + + return file + } + + fun getMimeType(file: File): String { + val extension = file.extension + return when (extension.lowercase()) { + "jpg", "jpeg" -> "image/jpeg" + "png" -> "image/png" + "pdf" -> "application/pdf" + else -> "application/octet-stream" + } + } + + fun createPartFromFile(field: String, file: File?): MultipartBody.Part? { + return file?.let { + val mimeType = getMimeType(it).toMediaTypeOrNull() + val requestBody = RequestBody.create(mimeType, it) + MultipartBody.Part.createFormData(field, it.name, requestBody) + } + } + private fun validateForm() { val valid = binding.edtNamaProduk.text.isNotBlank() && binding.edtDeskripsiProduk.text.isNotBlank() && @@ -164,19 +258,7 @@ class StoreProductDetailActivity : AppCompatActivity() { ) } - private fun uriToNamedFile(uri: Uri, context: Context, prefix: String): File { - val extension = context.contentResolver.getType(uri)?.substringAfter("/") ?: "jpg" - val filename = "$prefix-${System.currentTimeMillis()}.$extension" - val file = File(context.cacheDir, filename) - - context.contentResolver.openInputStream(uri)?.use { input -> - FileOutputStream(file).use { output -> input.copyTo(output) } - } - - return file - } - - private fun submitProduct() { + private fun addProduct() { val name = binding.edtNamaProduk.text.toString() val description = binding.edtDeskripsiProduk.text.toString() val price = binding.edtHargaProduk.text.toString().toInt() @@ -186,6 +268,7 @@ class StoreProductDetailActivity : AppCompatActivity() { val isPreOrder = binding.switchIsPreOrder.isChecked val duration = if (isPreOrder) binding.edtDurasi.text.toString().toInt() else 0 val status = if (binding.switchIsActive.isChecked) "active" else "inactive" + val condition = binding.spinnerKondisiProduk.selectedItem.toString() val categoryId = categoryList.getOrNull(binding.spinnerKategoriProduk.selectedItemPosition)?.id ?: 0 val imageFile = imageUri?.let { uriToNamedFile(it, this, "productimg") } @@ -199,8 +282,10 @@ class StoreProductDetailActivity : AppCompatActivity() { val sppirtPart = sppirtFile?.let { createPartFromFile("sppirt", it) } val halalPart = halalFile?.let { createPartFromFile("halal", it) } + val preorder = Preorder(productId = productId, duration = duration) + viewModel.addProduct( - name, description, price, stock, minOrder, weight, isPreOrder, duration, categoryId, status, imagePart, sppirtPart, halalPart + name, description, price, stock, minOrder, weight, isPreOrder, preorder, categoryId, status, condition, imagePart, sppirtPart, halalPart ) viewModel.productCreationResult.observe(this) { result -> @@ -208,7 +293,7 @@ class StoreProductDetailActivity : AppCompatActivity() { is Result.Loading -> binding.btnSaveProduct.isEnabled = false is Result.Success -> { val product = result.data.product - Toast.makeText(this, "Product Created: ${product?.productName}", Toast.LENGTH_SHORT).show() + Toast.makeText(this, "Product Created: ${product?.name}", Toast.LENGTH_SHORT).show() finish() } is Result.Error -> { @@ -219,26 +304,24 @@ class StoreProductDetailActivity : AppCompatActivity() { } } - fun getMimeType(file: File): String { - val extension = file.extension - return when (extension.lowercase()) { - "jpg", "jpeg" -> "image/jpeg" - "png" -> "image/png" - "pdf" -> "application/pdf" - else -> "application/octet-stream" - } - } + private fun updateProduct(productId: Int?) { + val updatedProduct = mapOf( + "name" to binding.edtNamaProduk.text.toString(), + "description" to binding.edtDeskripsiProduk.text.toString(), + "price" to binding.edtHargaProduk.text.toString(), + "stock" to binding.edtStokProduk.text.toString().toInt(), + "min_order" to binding.edtMinOrder.text.toString().toInt(), + "weight" to binding.edtBeratProduk.text.toString().toInt(), + "is_pre_order" to binding.switchIsPreOrder.isChecked, + "duration" to binding.edtDurasi.text.toString().toInt(), + "category_id" to categoryList[binding.spinnerKategoriProduk.selectedItemPosition].id, + "status" to if (binding.switchIsActive.isChecked) "active" else "inactive", + "condition" to binding.spinnerKondisiProduk.selectedItem.toString(), + "productimg" to imageUri?.path, + "sppirt" to sppirtUri?.path, + "halal" to halalUri?.path + ) - fun createPartFromFile(field: String, file: File?): MultipartBody.Part? { - return file?.let { - val mimeType = getMimeType(it).toMediaTypeOrNull() - val requestBody = RequestBody.create(mimeType, it) - MultipartBody.Part.createFormData(field, it.name, requestBody) - } - } - - private fun setupHeader() { - binding.header.headerTitle.text = "Tambah Produk" - binding.header.headerLeftIcon.setOnClickListener { onBackPressedDispatcher.onBackPressed() } + viewModel.updateProduct(productId, updatedProduct) } } \ No newline at end of file diff --git a/app/src/main/java/com/alya/ecommerce_serang/utils/viewmodel/ProductViewModel.kt b/app/src/main/java/com/alya/ecommerce_serang/utils/viewmodel/ProductViewModel.kt index f8f6d9c..703db21 100644 --- a/app/src/main/java/com/alya/ecommerce_serang/utils/viewmodel/ProductViewModel.kt +++ b/app/src/main/java/com/alya/ecommerce_serang/utils/viewmodel/ProductViewModel.kt @@ -5,11 +5,13 @@ import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import com.alya.ecommerce_serang.data.api.dto.CategoryItem +import com.alya.ecommerce_serang.data.api.dto.Preorder import com.alya.ecommerce_serang.data.api.dto.ProductsItem -import com.alya.ecommerce_serang.data.api.response.product.CreateProductResponse -import com.alya.ecommerce_serang.data.api.response.product.Product -import com.alya.ecommerce_serang.data.api.response.product.ReviewsItem -import com.alya.ecommerce_serang.data.api.response.product.StoreProduct +import com.alya.ecommerce_serang.data.api.response.store.product.CreateProductResponse +import com.alya.ecommerce_serang.data.api.response.customer.product.Product +import com.alya.ecommerce_serang.data.api.response.customer.product.ReviewsItem +import com.alya.ecommerce_serang.data.api.response.customer.product.StoreProduct +import com.alya.ecommerce_serang.data.api.response.store.product.UpdateProductResponse import com.alya.ecommerce_serang.data.repository.ProductRepository import com.alya.ecommerce_serang.data.repository.Result import kotlinx.coroutines.launch @@ -20,6 +22,9 @@ class ProductViewModel(private val repository: ProductRepository) : ViewModel() private val _productCreationResult = MutableLiveData>() val productCreationResult: LiveData> get() = _productCreationResult + private val _productUpdateResult = MutableLiveData>() + val productUpdateResult: LiveData> get() = _productUpdateResult + private val _productDetail = MutableLiveData() val productDetail: LiveData get() = _productDetail @@ -49,6 +54,12 @@ class ProductViewModel(private val repository: ProductRepository) : ViewModel() } } + fun loadPreorderProducts(productId: Int) { + viewModelScope.launch { + + } + } + fun loadMyStoreProducts() { viewModelScope.launch { _productList.value = Result.Loading @@ -76,9 +87,10 @@ class ProductViewModel(private val repository: ProductRepository) : ViewModel() minOrder: Int, weight: Int, isPreOrder: Boolean, - duration: Int, + preorder: Preorder, categoryId: Int, status: String, + condition: String, imagePart: MultipartBody.Part?, sppirtPart: MultipartBody.Part?, halalPart: MultipartBody.Part? @@ -86,12 +98,31 @@ class ProductViewModel(private val repository: ProductRepository) : ViewModel() _productCreationResult.value = Result.Loading viewModelScope.launch { val result = repository.addProduct( - name, description, price, stock, minOrder, weight, isPreOrder, duration, categoryId, status, imagePart, sppirtPart, halalPart + name, description, price, stock, minOrder, weight, isPreOrder, preorder, categoryId, status, condition, imagePart, sppirtPart, halalPart ) _productCreationResult.value = result } } + fun updateProduct(productId: Int?, updatedProduct: Map) { + _productUpdateResult.value = Result.Loading + viewModelScope.launch { + try { + val response = repository.updateProduct(productId, updatedProduct) + _productUpdateResult.value = Result.Success(response) + } catch (e: Exception) { + _productUpdateResult.value = Result.Error(e) + } + } + } + + fun deleteProduct(productId: Int) { + viewModelScope.launch { + val result = repository.deleteProduct(productId) + // handle the response (loading, success, or error) + } + } + // Optional: for store detail if you need it later // fun loadStoreDetail(storeId: Int) { // viewModelScope.launch { diff --git a/app/src/main/res/layout/activity_cart.xml b/app/src/main/res/layout/activity_cart.xml index 3735ec2..246f39a 100644 --- a/app/src/main/res/layout/activity_cart.xml +++ b/app/src/main/res/layout/activity_cart.xml @@ -5,6 +5,6 @@ android:id="@+id/main" android:layout_width="match_parent" android:layout_height="match_parent" - tools:context=".data.api.response.cart.CartActivity"> + tools:context=".data.api.response.customer.cart.CartActivity"> \ No newline at end of file diff --git a/app/src/main/res/layout/activity_store_product_detail.xml b/app/src/main/res/layout/activity_store_product_detail.xml index 4a1a522..7076979 100644 --- a/app/src/main/res/layout/activity_store_product_detail.xml +++ b/app/src/main/res/layout/activity_store_product_detail.xml @@ -481,66 +481,66 @@ - - - - - - + + - - - - - + + - - - - - - + - - - - - - - - + - + - - - - - - - - + + - - - - - - - - + - - - - - - - + + - + - + Date: Thu, 24 Apr 2025 01:21:37 +0700 Subject: [PATCH 2/3] update sells --- .../data/api/dto/OrdersItem.kt | 59 ++++++++++++++++++ .../data/api/dto/UpdatedOrder.kt | 36 +++++++++++ .../store/orders/KonfirmasiTagihanResponse.kt | 33 ---------- .../store/orders/OrderListResponse.kt | 52 +--------------- .../data/api/retrofit/ApiService.kt | 9 +++ .../data/repository/OrderRepository.kt | 31 ++++++++++ .../ui/profile/mystore/MyStoreActivity.kt | 4 +- .../product/StoreProductDetailActivity.kt | 28 ++++----- .../ui/profile/mystore/sells/SellsActivity.kt | 3 +- .../ui/profile/mystore/sells/SellsFragment.kt | 2 +- .../mystore/sells/SellsPagerAdapter.kt | 4 +- .../sells/all_sells/AllSellsFragment.kt | 27 +++++++- .../cancellation/CancellationFragment.kt | 27 +++++++- .../sells/completed/CompletedFragment.kt | 41 +++++++++++++ .../failed_payment/FailedPaymentFragment.kt | 27 +++++++- .../failed_shipment/FailedShipmentFragment.kt | 27 +++++++- .../sells/finished/FinishedFragment.kt | 18 ------ .../mystore/sells/order/OrderAdapter.kt | 60 ++++++++++++++++++ .../mystore/sells/order/OrderFragment.kt | 28 ++++++++- .../mystore/sells/payment/PaymentAdapter.kt | 61 +++++++++++++++++++ .../mystore/sells/payment/PaymentFragment.kt | 28 ++++++++- .../mystore/sells/shipment/ShipmentAdapter.kt | 56 +++++++++++++++++ .../sells/shipment/ShipmentFragment.kt | 27 +++++++- .../mystore/sells/shipped/ShippedFragment.kt | 27 +++++++- .../utils/viewmodel/SellsViewModel.kt | 23 ++++++- app/src/main/res/layout/activity_sells.xml | 12 +++- .../main/res/layout/fragment_all_sells.xml | 19 ++---- .../main/res/layout/fragment_cancellation.xml | 18 ++---- .../main/res/layout/fragment_completed.xml | 7 +++ .../res/layout/fragment_failed_payment.xml | 18 ++---- .../res/layout/fragment_failed_shipment.xml | 18 ++---- app/src/main/res/layout/fragment_finished.xml | 17 ------ app/src/main/res/layout/fragment_order.xml | 16 +---- app/src/main/res/layout/fragment_payment.xml | 17 ++---- app/src/main/res/layout/fragment_sells.xml | 14 +++-- app/src/main/res/layout/fragment_shipment.xml | 16 +---- app/src/main/res/layout/fragment_shipped.xml | 18 ++---- 37 files changed, 652 insertions(+), 276 deletions(-) create mode 100644 app/src/main/java/com/alya/ecommerce_serang/data/api/dto/OrdersItem.kt create mode 100644 app/src/main/java/com/alya/ecommerce_serang/data/api/dto/UpdatedOrder.kt create mode 100644 app/src/main/java/com/alya/ecommerce_serang/ui/profile/mystore/sells/completed/CompletedFragment.kt delete mode 100644 app/src/main/java/com/alya/ecommerce_serang/ui/profile/mystore/sells/finished/FinishedFragment.kt create mode 100644 app/src/main/java/com/alya/ecommerce_serang/ui/profile/mystore/sells/order/OrderAdapter.kt create mode 100644 app/src/main/java/com/alya/ecommerce_serang/ui/profile/mystore/sells/payment/PaymentAdapter.kt create mode 100644 app/src/main/java/com/alya/ecommerce_serang/ui/profile/mystore/sells/shipment/ShipmentAdapter.kt create mode 100644 app/src/main/res/layout/fragment_completed.xml delete mode 100644 app/src/main/res/layout/fragment_finished.xml diff --git a/app/src/main/java/com/alya/ecommerce_serang/data/api/dto/OrdersItem.kt b/app/src/main/java/com/alya/ecommerce_serang/data/api/dto/OrdersItem.kt new file mode 100644 index 0000000..53ad7fb --- /dev/null +++ b/app/src/main/java/com/alya/ecommerce_serang/data/api/dto/OrdersItem.kt @@ -0,0 +1,59 @@ +package com.alya.ecommerce_serang.data.api.dto + +import com.alya.ecommerce_serang.data.api.response.store.orders.Address +import com.alya.ecommerce_serang.data.api.response.store.orders.OrderItemsItem +import com.alya.ecommerce_serang.data.api.response.store.orders.Payment +import com.alya.ecommerce_serang.data.api.response.store.orders.Shipment +import com.alya.ecommerce_serang.data.api.response.store.orders.Voucher +import com.google.gson.annotations.SerializedName + +data class OrdersItem( + + @field:SerializedName("address") + val address: Address? = null, + + @field:SerializedName("shipment") + val shipment: Shipment? = null, + + @field:SerializedName("voucher") + val voucher: Voucher? = null, + + @field:SerializedName("address_id") + val addressId: Int? = null, + + @field:SerializedName("is_negotiable") + val isNegotiable: Boolean? = null, + + @field:SerializedName("created_at") + val createdAt: String? = null, + + @field:SerializedName("payment_method_id") + val paymentMethodId: Int? = null, + + @field:SerializedName("updated_at") + val updatedAt: String? = null, + + @field:SerializedName("user_id") + val userId: Int? = null, + + @field:SerializedName("total_amount") + val totalAmount: String? = null, + + @field:SerializedName("voucher_id") + val voucherId: Any? = null, + + @field:SerializedName("payment") + val payment: Payment? = null, + + @field:SerializedName("order_id") + val orderId: Int? = null, + + @field:SerializedName("username") + val username: String? = null, + + @field:SerializedName("status") + val status: String? = null, + + @field:SerializedName("order_items") + val orderItems: List? = null +) diff --git a/app/src/main/java/com/alya/ecommerce_serang/data/api/dto/UpdatedOrder.kt b/app/src/main/java/com/alya/ecommerce_serang/data/api/dto/UpdatedOrder.kt new file mode 100644 index 0000000..56b0102 --- /dev/null +++ b/app/src/main/java/com/alya/ecommerce_serang/data/api/dto/UpdatedOrder.kt @@ -0,0 +1,36 @@ +package com.alya.ecommerce_serang.data.api.dto + +import com.google.gson.annotations.SerializedName + +data class UpdatedOrder( + + @field:SerializedName("payment_method_id") + val paymentMethodId: Int? = null, + + @field:SerializedName("updated_at") + val updatedAt: String? = null, + + @field:SerializedName("total_amount") + val totalAmount: String? = null, + + @field:SerializedName("user_id") + val userId: Int? = null, + + @field:SerializedName("address_id") + val addressId: Int? = null, + + @field:SerializedName("is_negotiable") + val isNegotiable: Boolean? = null, + + @field:SerializedName("created_at") + val createdAt: String? = null, + + @field:SerializedName("voucher_id") + val voucherId: Any? = null, + + @field:SerializedName("id") + val id: Int? = null, + + @field:SerializedName("status") + val status: String? = null +) diff --git a/app/src/main/java/com/alya/ecommerce_serang/data/api/response/store/orders/KonfirmasiTagihanResponse.kt b/app/src/main/java/com/alya/ecommerce_serang/data/api/response/store/orders/KonfirmasiTagihanResponse.kt index a8608c6..af331d4 100644 --- a/app/src/main/java/com/alya/ecommerce_serang/data/api/response/store/orders/KonfirmasiTagihanResponse.kt +++ b/app/src/main/java/com/alya/ecommerce_serang/data/api/response/store/orders/KonfirmasiTagihanResponse.kt @@ -13,36 +13,3 @@ data class KonfirmasiTagihanResponse( @field:SerializedName("updatedItems") val updatedItems: List? = null ) - -data class UpdatedOrder( - - @field:SerializedName("payment_method_id") - val paymentMethodId: Int? = null, - - @field:SerializedName("updated_at") - val updatedAt: String? = null, - - @field:SerializedName("total_amount") - val totalAmount: String? = null, - - @field:SerializedName("user_id") - val userId: Int? = null, - - @field:SerializedName("address_id") - val addressId: Int? = null, - - @field:SerializedName("is_negotiable") - val isNegotiable: Boolean? = null, - - @field:SerializedName("created_at") - val createdAt: String? = null, - - @field:SerializedName("voucher_id") - val voucherId: Any? = null, - - @field:SerializedName("id") - val id: Int? = null, - - @field:SerializedName("status") - val status: String? = null -) diff --git a/app/src/main/java/com/alya/ecommerce_serang/data/api/response/store/orders/OrderListResponse.kt b/app/src/main/java/com/alya/ecommerce_serang/data/api/response/store/orders/OrderListResponse.kt index ec5d048..64725ae 100644 --- a/app/src/main/java/com/alya/ecommerce_serang/data/api/response/store/orders/OrderListResponse.kt +++ b/app/src/main/java/com/alya/ecommerce_serang/data/api/response/store/orders/OrderListResponse.kt @@ -1,5 +1,6 @@ package com.alya.ecommerce_serang.data.api.response.store.orders +import com.alya.ecommerce_serang.data.api.dto.OrdersItem import com.google.gson.annotations.SerializedName data class OrderListResponse( @@ -115,54 +116,3 @@ data class Payment( @field:SerializedName("payment_id") val paymentId: Any? = null ) - -data class OrdersItem( - - @field:SerializedName("address") - val address: Address? = null, - - @field:SerializedName("shipment") - val shipment: Shipment? = null, - - @field:SerializedName("voucher") - val voucher: Voucher? = null, - - @field:SerializedName("address_id") - val addressId: Int? = null, - - @field:SerializedName("is_negotiable") - val isNegotiable: Boolean? = null, - - @field:SerializedName("created_at") - val createdAt: String? = null, - - @field:SerializedName("payment_method_id") - val paymentMethodId: Int? = null, - - @field:SerializedName("updated_at") - val updatedAt: String? = null, - - @field:SerializedName("user_id") - val userId: Int? = null, - - @field:SerializedName("total_amount") - val totalAmount: String? = null, - - @field:SerializedName("voucher_id") - val voucherId: Any? = null, - - @field:SerializedName("payment") - val payment: Payment? = null, - - @field:SerializedName("order_id") - val orderId: Int? = null, - - @field:SerializedName("username") - val username: String? = null, - - @field:SerializedName("status") - val status: String? = null, - - @field:SerializedName("order_items") - val orderItems: List? = 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 43528f2..e4f3fc8 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 @@ -32,6 +32,7 @@ import com.alya.ecommerce_serang.data.api.response.customer.product.StoreRespons import com.alya.ecommerce_serang.data.api.response.customer.profile.AddressResponse import com.alya.ecommerce_serang.data.api.response.customer.profile.CreateAddressResponse import com.alya.ecommerce_serang.data.api.response.customer.profile.ProfileResponse +import com.alya.ecommerce_serang.data.api.response.store.orders.OrderListResponse import com.alya.ecommerce_serang.data.api.response.store.product.DeleteProductResponse import com.alya.ecommerce_serang.data.api.response.store.product.UpdateProductResponse import retrofit2.Call @@ -171,4 +172,12 @@ interface ApiService { @GET("provinces") suspend fun getListProv( ): Response + + @GET("mystore/orders") + suspend fun getAllOrders(): Response + + @GET("mystore/orders/{status}") + suspend fun getOrdersByStatus( + @Query("status") status: String + ): Response } \ No newline at end of file diff --git a/app/src/main/java/com/alya/ecommerce_serang/data/repository/OrderRepository.kt b/app/src/main/java/com/alya/ecommerce_serang/data/repository/OrderRepository.kt index f3b2bcf..4bff99b 100644 --- a/app/src/main/java/com/alya/ecommerce_serang/data/repository/OrderRepository.kt +++ b/app/src/main/java/com/alya/ecommerce_serang/data/repository/OrderRepository.kt @@ -5,6 +5,8 @@ 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.OrderRequest import com.alya.ecommerce_serang.data.api.dto.OrderRequestBuy +import com.alya.ecommerce_serang.data.api.dto.OrdersItem +import com.alya.ecommerce_serang.data.api.dto.ProductsItem import com.alya.ecommerce_serang.data.api.response.customer.cart.DataItem import com.alya.ecommerce_serang.data.api.response.customer.order.CourierCostResponse import com.alya.ecommerce_serang.data.api.response.customer.order.CreateOrderResponse @@ -207,4 +209,33 @@ class OrderRepository(private val apiService: ApiService) { return if (response.isSuccessful) response.body() else null } + suspend fun fetchSells(): List { + return try { + val response = apiService.getAllOrders() // Replace with the actual method from your ApiService + if (response.isSuccessful) { + response.body()?.orders ?: emptyList() // Assuming the response body has 'orders' + } else { + Log.e("OrderRepository", "Error fetching all sells. Code: ${response.code()}") + emptyList() + } + } catch (e: Exception) { + Log.e("OrderRepository", "Exception fetching sells", e) + emptyList() + } + } + + suspend fun fetchOrdersByStatus(status: String): List { + return try { + val response = apiService.getOrdersByStatus(status) // Replace with actual method for status-based fetch + if (response.isSuccessful) { + response.body()?.orders?.filterNotNull() ?: emptyList() // Assuming the response body has 'orders' + } else { + Log.e("OrderRepository", "Error fetching orders by status ($status). Code: ${response.code()}") + emptyList() + } + } catch (e: Exception) { + Log.e("OrderRepository", "Exception fetching orders by status", e) + emptyList() + } + } } \ No newline at end of file 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 index f39331b..08efbbe 100644 --- 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 @@ -64,8 +64,8 @@ class MyStoreActivity : AppCompatActivity() { private fun myStoreProfileOverview(store: Store){ - binding.tvStoreName.setText(store.storeName.toString()) - binding.tvStoreType.setText(store.storeType.toString()) + binding.tvStoreName.text = store.storeName + binding.tvStoreType.text = store.storeType store.storeImage.let { Glide.with(this) diff --git a/app/src/main/java/com/alya/ecommerce_serang/ui/profile/mystore/product/StoreProductDetailActivity.kt b/app/src/main/java/com/alya/ecommerce_serang/ui/profile/mystore/product/StoreProductDetailActivity.kt index 41bef9a..9d28bcf 100644 --- a/app/src/main/java/com/alya/ecommerce_serang/ui/profile/mystore/product/StoreProductDetailActivity.kt +++ b/app/src/main/java/com/alya/ecommerce_serang/ui/profile/mystore/product/StoreProductDetailActivity.kt @@ -169,30 +169,30 @@ class StoreProductDetailActivity : AppCompatActivity() { } } - private fun populateForm(product: Product) { - binding.edtNamaProduk.setText(product.name) - binding.edtDeskripsiProduk.setText(product.description) - binding.edtHargaProduk.setText(product.price.toString()) - binding.edtStokProduk.setText(product.stock.toString()) - binding.edtMinOrder.setText(product.minOrder.toString()) - binding.edtBeratProduk.setText(product.weight.toString()) - binding.switchIsPreOrder.isChecked = product.isPreOrder ?: false - binding.switchIsActive.isChecked = product.status == "active" - binding.spinnerKondisiProduk.setSelection(if (product.condition == "Baru") 0 else 1) + private fun populateForm(product: Product?) { + binding.edtNamaProduk.setText(product?.name) + binding.edtDeskripsiProduk.setText(product?.description) + binding.edtHargaProduk.setText(product?.price.toString()) + binding.edtStokProduk.setText(product?.stock.toString()) + binding.edtMinOrder.setText(product?.minOrder.toString()) + binding.edtBeratProduk.setText(product?.weight.toString()) + binding.switchIsPreOrder.isChecked = product?.isPreOrder ?: false + binding.switchIsActive.isChecked = product?.status == "active" + binding.spinnerKondisiProduk.setSelection(if (product?.condition == "Baru") 0 else 1) - product.categoryId?.let { + product?.categoryId?.let { binding.spinnerKategoriProduk.setSelection(categoryList.indexOfFirst { it.id == product.categoryId }) } - Glide.with(this).load(product.image).into(binding.ivPreviewFoto) + Glide.with(this).load(product?.image).into(binding.ivPreviewFoto) binding.switcherFotoProduk.showNext() - product.sppirt?.let { + product?.sppirt?.let { binding.tvSppirtName.text = getFileName(it.toUri()) binding.switcherSppirt.showNext() } - product.halal?.let { + product?.halal?.let { binding.tvHalalName.text = getFileName(it.toUri()) binding.switcherHalal.showNext() } diff --git a/app/src/main/java/com/alya/ecommerce_serang/ui/profile/mystore/sells/SellsActivity.kt b/app/src/main/java/com/alya/ecommerce_serang/ui/profile/mystore/sells/SellsActivity.kt index 6c9a570..ebe50a4 100644 --- a/app/src/main/java/com/alya/ecommerce_serang/ui/profile/mystore/sells/SellsActivity.kt +++ b/app/src/main/java/com/alya/ecommerce_serang/ui/profile/mystore/sells/SellsActivity.kt @@ -3,6 +3,7 @@ package com.alya.ecommerce_serang.ui.profile.mystore.sells import androidx.appcompat.app.AppCompatActivity import android.os.Bundle import com.alya.ecommerce_serang.R +import com.alya.ecommerce_serang.ui.profile.mystore.sells.all_sells.AllSellsFragment class SellsActivity : AppCompatActivity() { @@ -11,7 +12,7 @@ class SellsActivity : AppCompatActivity() { setContentView(R.layout.activity_sells) if (savedInstanceState == null) { supportFragmentManager.beginTransaction() - .replace(R.id.sells_fragment_container, SellsFragment()) + .replace(R.id.sells_fragment_container, AllSellsFragment()) .commit() } } diff --git a/app/src/main/java/com/alya/ecommerce_serang/ui/profile/mystore/sells/SellsFragment.kt b/app/src/main/java/com/alya/ecommerce_serang/ui/profile/mystore/sells/SellsFragment.kt index fdc05ae..91d202e 100644 --- a/app/src/main/java/com/alya/ecommerce_serang/ui/profile/mystore/sells/SellsFragment.kt +++ b/app/src/main/java/com/alya/ecommerce_serang/ui/profile/mystore/sells/SellsFragment.kt @@ -24,7 +24,7 @@ class SellsFragment : Fragment() { override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) - viewModel = ViewModelProvider(this).get(SellsViewModel::class.java) + viewModel = ViewModelProvider(this)[SellsViewModel::class.java] val tabs = listOf( "Semua Pesanan", "Perlu Tagihan", "Konfirmasi Pembayaran", diff --git a/app/src/main/java/com/alya/ecommerce_serang/ui/profile/mystore/sells/SellsPagerAdapter.kt b/app/src/main/java/com/alya/ecommerce_serang/ui/profile/mystore/sells/SellsPagerAdapter.kt index 737632f..d6fd44a 100644 --- a/app/src/main/java/com/alya/ecommerce_serang/ui/profile/mystore/sells/SellsPagerAdapter.kt +++ b/app/src/main/java/com/alya/ecommerce_serang/ui/profile/mystore/sells/SellsPagerAdapter.kt @@ -6,7 +6,7 @@ import com.alya.ecommerce_serang.ui.profile.mystore.sells.all_sells.AllSellsFrag import com.alya.ecommerce_serang.ui.profile.mystore.sells.cancellation.CancellationFragment import com.alya.ecommerce_serang.ui.profile.mystore.sells.failed_payment.FailedPaymentFragment import com.alya.ecommerce_serang.ui.profile.mystore.sells.failed_shipment.FailedShipmentFragment -import com.alya.ecommerce_serang.ui.profile.mystore.sells.finished.FinishedFragment +import com.alya.ecommerce_serang.ui.profile.mystore.sells.completed.CompletedFragment import com.alya.ecommerce_serang.ui.profile.mystore.sells.order.OrderFragment import com.alya.ecommerce_serang.ui.profile.mystore.sells.payment.PaymentFragment import com.alya.ecommerce_serang.ui.profile.mystore.sells.shipment.ShipmentFragment @@ -24,7 +24,7 @@ class SellsPagerAdapter(fragment: Fragment, private val itemCount: Int) : 2 -> PaymentFragment() 3 -> ShipmentFragment() 4 -> ShippedFragment() - 5 -> FinishedFragment() + 5 -> CompletedFragment() 6 -> CancellationFragment() 7 -> FailedPaymentFragment() 8 -> FailedShipmentFragment() diff --git a/app/src/main/java/com/alya/ecommerce_serang/ui/profile/mystore/sells/all_sells/AllSellsFragment.kt b/app/src/main/java/com/alya/ecommerce_serang/ui/profile/mystore/sells/all_sells/AllSellsFragment.kt index 7a060d5..0b45642 100644 --- a/app/src/main/java/com/alya/ecommerce_serang/ui/profile/mystore/sells/all_sells/AllSellsFragment.kt +++ b/app/src/main/java/com/alya/ecommerce_serang/ui/profile/mystore/sells/all_sells/AllSellsFragment.kt @@ -5,14 +5,37 @@ import androidx.fragment.app.Fragment import android.view.LayoutInflater import android.view.View import android.view.ViewGroup +import androidx.lifecycle.Observer +import androidx.lifecycle.ViewModelProvider +import androidx.recyclerview.widget.LinearLayoutManager import com.alya.ecommerce_serang.R +import com.alya.ecommerce_serang.databinding.FragmentAllSellsBinding +import com.alya.ecommerce_serang.utils.viewmodel.SellsViewModel class AllSellsFragment : Fragment() { + private lateinit var viewModel: SellsViewModel + private lateinit var binding: FragmentAllSellsBinding + override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? ): View? { - // Inflate the layout for this fragment - return inflater.inflate(R.layout.fragment_all_sells, container, false) + binding = FragmentAllSellsBinding.inflate(inflater, container, false) + return binding.root + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + + viewModel = ViewModelProvider(this).get(SellsViewModel::class.java) + +// val adapter = SellsAdapter() +// binding.rvAllSells.layoutManager = LinearLayoutManager(context) +// binding.rvAllSells.adapter = adapter +// +// viewModel.loadAllSells() +// viewModel.sellsList.observe(viewLifecycleOwner, Observer { sells -> +// adapter.submitList(sells) +// }) } } diff --git a/app/src/main/java/com/alya/ecommerce_serang/ui/profile/mystore/sells/cancellation/CancellationFragment.kt b/app/src/main/java/com/alya/ecommerce_serang/ui/profile/mystore/sells/cancellation/CancellationFragment.kt index 48b9d41..c8b93de 100644 --- a/app/src/main/java/com/alya/ecommerce_serang/ui/profile/mystore/sells/cancellation/CancellationFragment.kt +++ b/app/src/main/java/com/alya/ecommerce_serang/ui/profile/mystore/sells/cancellation/CancellationFragment.kt @@ -5,14 +5,37 @@ import androidx.fragment.app.Fragment import android.view.LayoutInflater import android.view.View import android.view.ViewGroup +import androidx.lifecycle.Observer +import androidx.lifecycle.ViewModelProvider +import androidx.recyclerview.widget.LinearLayoutManager import com.alya.ecommerce_serang.R +import com.alya.ecommerce_serang.databinding.FragmentCancellationBinding +import com.alya.ecommerce_serang.utils.viewmodel.SellsViewModel class CancellationFragment : Fragment() { + private lateinit var viewModel: SellsViewModel + private lateinit var binding: FragmentCancellationBinding + override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? ): View? { - // Inflate the layout for this fragment - return inflater.inflate(R.layout.fragment_cancellation, container, false) + binding = FragmentCancellationBinding.inflate(inflater, container, false) + return binding.root + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + + viewModel = ViewModelProvider(this).get(SellsViewModel::class.java) + +// val adapter = SellsAdapter() +// binding.rvCancellation.layoutManager = LinearLayoutManager(context) +// binding.rvCancellation.adapter = adapter +// +// viewModel.loadOrdersByStatus("cancelled") +// viewModel.sellsList.observe(viewLifecycleOwner, Observer { cancellations -> +// adapter.submitList(cancellations) +// }) } } \ No newline at end of file diff --git a/app/src/main/java/com/alya/ecommerce_serang/ui/profile/mystore/sells/completed/CompletedFragment.kt b/app/src/main/java/com/alya/ecommerce_serang/ui/profile/mystore/sells/completed/CompletedFragment.kt new file mode 100644 index 0000000..a5928b6 --- /dev/null +++ b/app/src/main/java/com/alya/ecommerce_serang/ui/profile/mystore/sells/completed/CompletedFragment.kt @@ -0,0 +1,41 @@ +package com.alya.ecommerce_serang.ui.profile.mystore.sells.completed + +import android.os.Bundle +import androidx.fragment.app.Fragment +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.lifecycle.Observer +import androidx.lifecycle.ViewModelProvider +import androidx.recyclerview.widget.LinearLayoutManager +import com.alya.ecommerce_serang.R +import com.alya.ecommerce_serang.databinding.FragmentCompletedBinding +import com.alya.ecommerce_serang.utils.viewmodel.SellsViewModel + +class CompletedFragment : Fragment() { + private lateinit var viewModel: SellsViewModel + private lateinit var binding: FragmentCompletedBinding + + override fun onCreateView( + inflater: LayoutInflater, container: ViewGroup?, + savedInstanceState: Bundle? + ): View? { + binding = FragmentCompletedBinding.inflate(inflater, container, false) + return binding.root + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + + viewModel = ViewModelProvider(this).get(SellsViewModel::class.java) + +// val adapter = SellsAdapter() +// binding.rvCompleted.layoutManager = LinearLayoutManager(context) +// binding.rvCompleted.adapter = adapter +// +// viewModel.loadOrdersByStatus("delivered") +// viewModel.sellsList.observe(viewLifecycleOwner, Observer { completed -> +// adapter.submitList(completed) +// }) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/alya/ecommerce_serang/ui/profile/mystore/sells/failed_payment/FailedPaymentFragment.kt b/app/src/main/java/com/alya/ecommerce_serang/ui/profile/mystore/sells/failed_payment/FailedPaymentFragment.kt index 2baaf3c..eb01dac 100644 --- a/app/src/main/java/com/alya/ecommerce_serang/ui/profile/mystore/sells/failed_payment/FailedPaymentFragment.kt +++ b/app/src/main/java/com/alya/ecommerce_serang/ui/profile/mystore/sells/failed_payment/FailedPaymentFragment.kt @@ -6,14 +6,37 @@ import androidx.fragment.app.Fragment import android.view.LayoutInflater import android.view.View import android.view.ViewGroup +import androidx.lifecycle.Observer +import androidx.lifecycle.ViewModelProvider +import androidx.recyclerview.widget.LinearLayoutManager import com.alya.ecommerce_serang.R +import com.alya.ecommerce_serang.databinding.FragmentFailedPaymentBinding +import com.alya.ecommerce_serang.utils.viewmodel.SellsViewModel class FailedPaymentFragment : Fragment() { + private lateinit var viewModel: SellsViewModel + private lateinit var binding: FragmentFailedPaymentBinding + override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? ): View? { - // Inflate the layout for this fragment - return inflater.inflate(R.layout.fragment_failed_payment, container, false) + binding = FragmentFailedPaymentBinding.inflate(inflater, container, false) + return binding.root + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + + viewModel = ViewModelProvider(this).get(SellsViewModel::class.java) + +// val adapter = SellsAdapter() +// binding.rvFailedPayment.layoutManager = LinearLayoutManager(context) +// binding.rvFailedPayment.adapter = adapter +// +// viewModel.loadOrdersByStatus("failedPayment") +// viewModel.sellsList.observe(viewLifecycleOwner, Observer { failedPayments -> +// adapter.submitList(failedPayments) +// }) } } \ No newline at end of file diff --git a/app/src/main/java/com/alya/ecommerce_serang/ui/profile/mystore/sells/failed_shipment/FailedShipmentFragment.kt b/app/src/main/java/com/alya/ecommerce_serang/ui/profile/mystore/sells/failed_shipment/FailedShipmentFragment.kt index d4d6530..1e67efa 100644 --- a/app/src/main/java/com/alya/ecommerce_serang/ui/profile/mystore/sells/failed_shipment/FailedShipmentFragment.kt +++ b/app/src/main/java/com/alya/ecommerce_serang/ui/profile/mystore/sells/failed_shipment/FailedShipmentFragment.kt @@ -5,14 +5,37 @@ import androidx.fragment.app.Fragment import android.view.LayoutInflater import android.view.View import android.view.ViewGroup +import androidx.lifecycle.Observer +import androidx.lifecycle.ViewModelProvider +import androidx.recyclerview.widget.LinearLayoutManager import com.alya.ecommerce_serang.R +import com.alya.ecommerce_serang.databinding.FragmentFailedShipmentBinding +import com.alya.ecommerce_serang.utils.viewmodel.SellsViewModel class FailedShipmentFragment : Fragment() { + private lateinit var viewModel: SellsViewModel + private lateinit var binding: FragmentFailedShipmentBinding + override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? ): View? { - // Inflate the layout for this fragment - return inflater.inflate(R.layout.fragment_failed_shipment, container, false) + binding = FragmentFailedShipmentBinding.inflate(inflater, container, false) + return binding.root + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + + viewModel = ViewModelProvider(this).get(SellsViewModel::class.java) + +// val adapter = SellsAdapter() +// binding.rvFailedShipment.layoutManager = LinearLayoutManager(context) +// binding.rvFailedShipment.adapter = adapter +// +// viewModel.loadOrdersByStatus("failedShipment") +// viewModel.sellsList.observe(viewLifecycleOwner, Observer { failedShipments -> +// adapter.submitList(failedShipments) +// }) } } \ No newline at end of file diff --git a/app/src/main/java/com/alya/ecommerce_serang/ui/profile/mystore/sells/finished/FinishedFragment.kt b/app/src/main/java/com/alya/ecommerce_serang/ui/profile/mystore/sells/finished/FinishedFragment.kt deleted file mode 100644 index 745974c..0000000 --- a/app/src/main/java/com/alya/ecommerce_serang/ui/profile/mystore/sells/finished/FinishedFragment.kt +++ /dev/null @@ -1,18 +0,0 @@ -package com.alya.ecommerce_serang.ui.profile.mystore.sells.finished - -import android.os.Bundle -import androidx.fragment.app.Fragment -import android.view.LayoutInflater -import android.view.View -import android.view.ViewGroup -import com.alya.ecommerce_serang.R - -class FinishedFragment : Fragment() { - override fun onCreateView( - inflater: LayoutInflater, container: ViewGroup?, - savedInstanceState: Bundle? - ): View? { - // Inflate the layout for this fragment - return inflater.inflate(R.layout.fragment_finished, container, false) - } -} \ No newline at end of file diff --git a/app/src/main/java/com/alya/ecommerce_serang/ui/profile/mystore/sells/order/OrderAdapter.kt b/app/src/main/java/com/alya/ecommerce_serang/ui/profile/mystore/sells/order/OrderAdapter.kt new file mode 100644 index 0000000..5683546 --- /dev/null +++ b/app/src/main/java/com/alya/ecommerce_serang/ui/profile/mystore/sells/order/OrderAdapter.kt @@ -0,0 +1,60 @@ +package com.alya.ecommerce_serang.ui.profile.mystore.sells.order + +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.Button +import android.widget.ImageView +import android.widget.TextView +import androidx.recyclerview.widget.RecyclerView +import com.alya.ecommerce_serang.R +import com.alya.ecommerce_serang.data.api.dto.OrdersItem + +class OrderAdapter : RecyclerView.Adapter() { + + private var orderList: List? = emptyList() + + fun submitList(orders: List?) { + orderList = orders + notifyDataSetChanged() + } + + override fun onCreateViewHolder( + parent: ViewGroup, + viewType: Int + ): OrderViewHolder { + val view = LayoutInflater.from(parent.context).inflate(R.layout.item_sells_order, parent, false) + return OrderViewHolder(view) + } + + override fun onBindViewHolder(holder: OrderViewHolder, position: Int) { + val order = orderList?.get(position) + holder.bind(order) + } + + override fun getItemCount(): Int = orderList?.size ?: 0 + + class OrderViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { + private val tvOrderNumber: TextView = itemView.findViewById(R.id.tv_order_number) + private val tvOrderCustomer: TextView = itemView.findViewById(R.id.tv_order_customer) + private val tvOrderDue: TextView = itemView.findViewById(R.id.tv_order_due) + private val ivOrderProduct: ImageView = itemView.findViewById(R.id.iv_order_product) + private val tvOrderProductName: TextView = itemView.findViewById(R.id.tv_order_product_name) + private val tvOrderProductVariant: TextView = itemView.findViewById(R.id.tv_order_product_variant) + private val tvOrderProductQty: TextView = itemView.findViewById(R.id.tv_order_product_qty) + private val tvOrderProductPrice: TextView = itemView.findViewById(R.id.tv_order_product_price) + private val tvOrderQty: TextView = itemView.findViewById(R.id.tv_order_qty) + private val tvOrderPrice: TextView = itemView.findViewById(R.id.tv_order_price) + private val tvSeeMore: TextView = itemView.findViewById(R.id.tv_see_more) + private val btnEditOrder: Button = itemView.findViewById(R.id.btn_edit_order) + private val btnConfirmOrder: Button = itemView.findViewById(R.id.btn_confirm_order) + + fun bind(order: OrdersItem?) { + tvOrderNumber.text = "No. Pesanan: ${order?.orderId}" + tvOrderCustomer.text = order?.username + tvOrderDue.text = order?.createdAt + 7 + tvOrderQty.text = "${order?.orderItems?.size} produk" + tvOrderPrice.text = "Rp${order?.totalAmount}" + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/alya/ecommerce_serang/ui/profile/mystore/sells/order/OrderFragment.kt b/app/src/main/java/com/alya/ecommerce_serang/ui/profile/mystore/sells/order/OrderFragment.kt index f1271b9..60c9de8 100644 --- a/app/src/main/java/com/alya/ecommerce_serang/ui/profile/mystore/sells/order/OrderFragment.kt +++ b/app/src/main/java/com/alya/ecommerce_serang/ui/profile/mystore/sells/order/OrderFragment.kt @@ -5,14 +5,36 @@ import androidx.fragment.app.Fragment import android.view.LayoutInflater import android.view.View import android.view.ViewGroup -import com.alya.ecommerce_serang.R +import androidx.lifecycle.Observer +import androidx.lifecycle.ViewModelProvider +import androidx.recyclerview.widget.LinearLayoutManager +import com.alya.ecommerce_serang.databinding.FragmentOrderBinding +import com.alya.ecommerce_serang.utils.viewmodel.SellsViewModel class OrderFragment : Fragment() { + private lateinit var viewModel: SellsViewModel + private lateinit var binding: FragmentOrderBinding + override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? ): View? { - // Inflate the layout for this fragment - return inflater.inflate(R.layout.fragment_order, container, false) + binding = FragmentOrderBinding.inflate(inflater, container, false) + return binding.root + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + + viewModel = ViewModelProvider(this).get(SellsViewModel::class.java) + val adapter = OrderAdapter() + + binding.rvOrder.layoutManager = LinearLayoutManager(context) + binding.rvOrder.adapter = adapter + + viewModel.loadOrdersByStatus("pending") + viewModel.sellsList.observe(viewLifecycleOwner, Observer { orders -> + adapter.submitList(orders) + }) } } \ No newline at end of file diff --git a/app/src/main/java/com/alya/ecommerce_serang/ui/profile/mystore/sells/payment/PaymentAdapter.kt b/app/src/main/java/com/alya/ecommerce_serang/ui/profile/mystore/sells/payment/PaymentAdapter.kt new file mode 100644 index 0000000..32ff37c --- /dev/null +++ b/app/src/main/java/com/alya/ecommerce_serang/ui/profile/mystore/sells/payment/PaymentAdapter.kt @@ -0,0 +1,61 @@ +package com.alya.ecommerce_serang.ui.profile.mystore.sells.payment + +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.Button +import android.widget.ImageView +import android.widget.TextView +import androidx.recyclerview.widget.RecyclerView +import com.alya.ecommerce_serang.R +import com.alya.ecommerce_serang.data.api.dto.OrdersItem + +class PaymentAdapter : RecyclerView.Adapter() { + + private var paymentList: List? = emptyList() + + fun submitList(orders: List?) { + paymentList = orders + notifyDataSetChanged() + } + + override fun onCreateViewHolder( + parent: ViewGroup, + viewType: Int + ): PaymentViewHolder { + val view = LayoutInflater.from(parent.context).inflate(R.layout.item_sells_payment, parent, false) + return PaymentViewHolder(view) + } + + override fun onBindViewHolder(holder: PaymentViewHolder, position: Int) { + val order = paymentList?.get(position) + holder.bind(order) + } + + override fun getItemCount(): Int = paymentList?.size ?: 0 + + class PaymentViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView){ + private val tvPaymentNumber: TextView = itemView.findViewById(R.id.tv_payment_number) + private val tvPaymentDue: TextView = itemView.findViewById(R.id.tv_payment_due) + private val ivPaymentProduct: ImageView = itemView.findViewById(R.id.iv_payment_product) + private val tvPaymentProductName: TextView = itemView.findViewById(R.id.tv_payment_product_name) + private val tvPaymentProductVariant: TextView = itemView.findViewById(R.id.tv_payment_product_variant) + private val tvPaymentProductQty: TextView = itemView.findViewById(R.id.tv_payment_product_qty) + private val tvPaymentProductPrice: TextView = itemView.findViewById(R.id.tv_payment_product_price) + private val tvPaymentQty: TextView = itemView.findViewById(R.id.tv_payment_qty) + private val tvPaymentPrice: TextView = itemView.findViewById(R.id.tv_payment_price) + private val tvPaymentCustomer: TextView = itemView.findViewById(R.id.tv_payment_customer) + private val tvPaymentLocation: TextView = itemView.findViewById(R.id.tv_payment_location) + private val tvSeeMore: TextView = itemView.findViewById(R.id.tv_see_more) + private val btnConfirmPayment: Button = itemView.findViewById(R.id.btn_confirm_payment) + + fun bind(order: OrdersItem?) { + tvPaymentNumber.text = "No. Pesanan: ${order?.orderId}" + tvPaymentDue.text = order?.createdAt + 7 + tvPaymentQty.text = "${order?.orderItems?.size} produk" + tvPaymentPrice.text = "Rp${order?.totalAmount}" + tvPaymentCustomer.text = order?.username + tvPaymentLocation.text = order?.address?.subdistrict + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/alya/ecommerce_serang/ui/profile/mystore/sells/payment/PaymentFragment.kt b/app/src/main/java/com/alya/ecommerce_serang/ui/profile/mystore/sells/payment/PaymentFragment.kt index fd00c11..7c5214c 100644 --- a/app/src/main/java/com/alya/ecommerce_serang/ui/profile/mystore/sells/payment/PaymentFragment.kt +++ b/app/src/main/java/com/alya/ecommerce_serang/ui/profile/mystore/sells/payment/PaymentFragment.kt @@ -5,14 +5,36 @@ import androidx.fragment.app.Fragment import android.view.LayoutInflater import android.view.View import android.view.ViewGroup -import com.alya.ecommerce_serang.R +import androidx.lifecycle.Observer +import androidx.lifecycle.ViewModelProvider +import androidx.recyclerview.widget.LinearLayoutManager +import com.alya.ecommerce_serang.databinding.FragmentPaymentBinding +import com.alya.ecommerce_serang.utils.viewmodel.SellsViewModel class PaymentFragment : Fragment() { + private lateinit var viewModel: SellsViewModel + private lateinit var binding: FragmentPaymentBinding + override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? ): View? { - // Inflate the layout for this fragment - return inflater.inflate(R.layout.fragment_payment, container, false) + binding = FragmentPaymentBinding.inflate(inflater, container, false) + return binding.root + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + + viewModel = ViewModelProvider(this).get(SellsViewModel::class.java) + val adapter = PaymentAdapter() + + binding.rvPayment.layoutManager = LinearLayoutManager(context) + binding.rvPayment.adapter = adapter + + viewModel.loadOrdersByStatus("paid") + viewModel.sellsList.observe(viewLifecycleOwner, Observer { payments -> + adapter.submitList(payments) + }) } } \ No newline at end of file diff --git a/app/src/main/java/com/alya/ecommerce_serang/ui/profile/mystore/sells/shipment/ShipmentAdapter.kt b/app/src/main/java/com/alya/ecommerce_serang/ui/profile/mystore/sells/shipment/ShipmentAdapter.kt new file mode 100644 index 0000000..faf911e --- /dev/null +++ b/app/src/main/java/com/alya/ecommerce_serang/ui/profile/mystore/sells/shipment/ShipmentAdapter.kt @@ -0,0 +1,56 @@ +package com.alya.ecommerce_serang.ui.profile.mystore.sells.shipment + +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.Button +import android.widget.ImageView +import android.widget.TextView +import androidx.recyclerview.widget.RecyclerView +import com.alya.ecommerce_serang.R +import com.alya.ecommerce_serang.data.api.dto.OrdersItem + +class ShipmentAdapter : RecyclerView.Adapter() { + + private var shipmentList: List = emptyList() + + fun submitList(orders: List) { + shipmentList = orders + notifyDataSetChanged() + } + + override fun onCreateViewHolder( + parent: ViewGroup, + viewType: Int + ): ShipmentAdapter.ShipmentViewHolder { + val view = LayoutInflater.from(parent.context).inflate(R.layout.item_sells_shipment, parent, false) + return ShipmentViewHolder(view) + } + + override fun onBindViewHolder(holder: ShipmentAdapter.ShipmentViewHolder, position: Int) { + val order = shipmentList[position] + holder.bind(order) + } + + override fun getItemCount(): Int = shipmentList.size + + class ShipmentViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { + private val tvShipmentNumber: TextView = itemView.findViewById(R.id.tv_shipment_number) + private val tvShipmentDue: TextView = itemView.findViewById(R.id.tv_shipment_due) + private val ivShipmentProduct: ImageView = itemView.findViewById(R.id.iv_shipment_product) + private val tvShipmentProductName: TextView = itemView.findViewById(R.id.tv_shipment_product_name) + private val tvShipmentProductVariant: TextView = itemView.findViewById(R.id.tv_shipment_product_variant) + private val tvShipmentProductQty: TextView = itemView.findViewById(R.id.tv_shipment_product_qty) + private val tvShipmentCustomer: TextView = itemView.findViewById(R.id.tv_shipment_customer) + private val tvShipmentLocation: TextView = itemView.findViewById(R.id.tv_shipment_location) + private val tvSeeMore: TextView = itemView.findViewById(R.id.tv_see_more) + private val btnConfirmPayment: Button = itemView.findViewById(R.id.btn_confirm_payment) + + fun bind(order: OrdersItem) { + tvShipmentNumber.text = "No. Pesanan: ${order.orderId}" + tvShipmentDue.text = order.createdAt + 7 + tvShipmentCustomer.text = order.username + tvShipmentLocation.text = order.address?.subdistrict + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/alya/ecommerce_serang/ui/profile/mystore/sells/shipment/ShipmentFragment.kt b/app/src/main/java/com/alya/ecommerce_serang/ui/profile/mystore/sells/shipment/ShipmentFragment.kt index a6012a1..4b0f1d8 100644 --- a/app/src/main/java/com/alya/ecommerce_serang/ui/profile/mystore/sells/shipment/ShipmentFragment.kt +++ b/app/src/main/java/com/alya/ecommerce_serang/ui/profile/mystore/sells/shipment/ShipmentFragment.kt @@ -5,14 +5,37 @@ import androidx.fragment.app.Fragment import android.view.LayoutInflater import android.view.View import android.view.ViewGroup +import androidx.lifecycle.Observer +import androidx.lifecycle.ViewModelProvider +import androidx.recyclerview.widget.LinearLayoutManager import com.alya.ecommerce_serang.R +import com.alya.ecommerce_serang.databinding.FragmentShipmentBinding +import com.alya.ecommerce_serang.utils.viewmodel.SellsViewModel class ShipmentFragment : Fragment() { + private lateinit var viewModel: SellsViewModel + private lateinit var binding: FragmentShipmentBinding + override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? ): View? { - // Inflate the layout for this fragment - return inflater.inflate(R.layout.fragment_shipment, container, false) + binding = FragmentShipmentBinding.inflate(inflater, container, false) + return binding.root + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + + viewModel = ViewModelProvider(this).get(SellsViewModel::class.java) + val adapter = ShipmentAdapter() + + binding.rvShipment.layoutManager = LinearLayoutManager(context) +// binding.rvShipment.adapter = adapter +// +// viewModel.loadOrdersByStatus("processed") +// viewModel.sellsList.observe(viewLifecycleOwner, Observer { shipments -> +// adapter.submitList(shipments) +// }) } } \ No newline at end of file diff --git a/app/src/main/java/com/alya/ecommerce_serang/ui/profile/mystore/sells/shipped/ShippedFragment.kt b/app/src/main/java/com/alya/ecommerce_serang/ui/profile/mystore/sells/shipped/ShippedFragment.kt index 0234b7c..379d9d9 100644 --- a/app/src/main/java/com/alya/ecommerce_serang/ui/profile/mystore/sells/shipped/ShippedFragment.kt +++ b/app/src/main/java/com/alya/ecommerce_serang/ui/profile/mystore/sells/shipped/ShippedFragment.kt @@ -5,14 +5,37 @@ import androidx.fragment.app.Fragment import android.view.LayoutInflater import android.view.View import android.view.ViewGroup +import androidx.lifecycle.Observer +import androidx.lifecycle.ViewModelProvider +import androidx.recyclerview.widget.LinearLayoutManager import com.alya.ecommerce_serang.R +import com.alya.ecommerce_serang.databinding.FragmentShippedBinding +import com.alya.ecommerce_serang.utils.viewmodel.SellsViewModel class ShippedFragment : Fragment() { + private lateinit var viewModel: SellsViewModel + private lateinit var binding: FragmentShippedBinding + override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? ): View? { - // Inflate the layout for this fragment - return inflater.inflate(R.layout.fragment_shipped, container, false) + binding = FragmentShippedBinding.inflate(inflater, container, false) + return binding.root + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + + viewModel = ViewModelProvider(this).get(SellsViewModel::class.java) + +// val adapter = SellsAdapter() +// binding.rvShipped.layoutManager = LinearLayoutManager(context) +// binding.rvShipped.adapter = adapter +// +// viewModel.loadOrdersByStatus("shipped") +// viewModel.sellsList.observe(viewLifecycleOwner, Observer { shipped -> +// adapter.submitList(shipped) +// }) } } \ No newline at end of file diff --git a/app/src/main/java/com/alya/ecommerce_serang/utils/viewmodel/SellsViewModel.kt b/app/src/main/java/com/alya/ecommerce_serang/utils/viewmodel/SellsViewModel.kt index 3cd2f00..a7d46bc 100644 --- a/app/src/main/java/com/alya/ecommerce_serang/utils/viewmodel/SellsViewModel.kt +++ b/app/src/main/java/com/alya/ecommerce_serang/utils/viewmodel/SellsViewModel.kt @@ -1,7 +1,26 @@ package com.alya.ecommerce_serang.utils.viewmodel +import androidx.lifecycle.LiveData +import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel +import androidx.lifecycle.liveData +import androidx.lifecycle.viewModelScope +import com.alya.ecommerce_serang.data.api.dto.OrdersItem +import com.alya.ecommerce_serang.data.repository.OrderRepository +import kotlinx.coroutines.launch -class SellsViewModel : ViewModel() { - // TODO: Implement the ViewModel +class SellsViewModel(private val repository: OrderRepository) : ViewModel() { + private val _sellsList = MutableLiveData>() + val sellsList: LiveData> get() = _sellsList + + fun loadOrdersByStatus(status: String) { + viewModelScope.launch { + val result = if (status == "all") { + repository.fetchSells() + } else { + repository.fetchOrdersByStatus(status) + } + _sellsList.value = result + } + } } \ No newline at end of file diff --git a/app/src/main/res/layout/activity_sells.xml b/app/src/main/res/layout/activity_sells.xml index 91a3c0c..8056d96 100644 --- a/app/src/main/res/layout/activity_sells.xml +++ b/app/src/main/res/layout/activity_sells.xml @@ -1,8 +1,14 @@ - \ No newline at end of file + tools:context=".ui.profile.mystore.sells.SellsActivity"> + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_all_sells.xml b/app/src/main/res/layout/fragment_all_sells.xml index bced9c7..dc03543 100644 --- a/app/src/main/res/layout/fragment_all_sells.xml +++ b/app/src/main/res/layout/fragment_all_sells.xml @@ -1,17 +1,6 @@ - - - - - \ No newline at end of file + android:layout_height="match_parent"/> \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_cancellation.xml b/app/src/main/res/layout/fragment_cancellation.xml index 2e4f3f0..86c48e5 100644 --- a/app/src/main/res/layout/fragment_cancellation.xml +++ b/app/src/main/res/layout/fragment_cancellation.xml @@ -1,17 +1,7 @@ - - - - - \ No newline at end of file + android:layout_height="match_parent"/> \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_completed.xml b/app/src/main/res/layout/fragment_completed.xml new file mode 100644 index 0000000..fc5c715 --- /dev/null +++ b/app/src/main/res/layout/fragment_completed.xml @@ -0,0 +1,7 @@ + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_failed_payment.xml b/app/src/main/res/layout/fragment_failed_payment.xml index be821b7..5587090 100644 --- a/app/src/main/res/layout/fragment_failed_payment.xml +++ b/app/src/main/res/layout/fragment_failed_payment.xml @@ -1,17 +1,7 @@ - - - - - \ No newline at end of file + android:layout_height="match_parent"/> \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_failed_shipment.xml b/app/src/main/res/layout/fragment_failed_shipment.xml index 740ee44..0707558 100644 --- a/app/src/main/res/layout/fragment_failed_shipment.xml +++ b/app/src/main/res/layout/fragment_failed_shipment.xml @@ -1,17 +1,7 @@ - - - - - \ No newline at end of file + android:layout_height="match_parent"/> \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_finished.xml b/app/src/main/res/layout/fragment_finished.xml deleted file mode 100644 index c9a4541..0000000 --- a/app/src/main/res/layout/fragment_finished.xml +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_order.xml b/app/src/main/res/layout/fragment_order.xml index 53552f9..6accc4e 100644 --- a/app/src/main/res/layout/fragment_order.xml +++ b/app/src/main/res/layout/fragment_order.xml @@ -1,17 +1,7 @@ - - - - - \ No newline at end of file + tools:listitem="@layout/item_sells_order" /> \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_payment.xml b/app/src/main/res/layout/fragment_payment.xml index b18b7d3..1131b57 100644 --- a/app/src/main/res/layout/fragment_payment.xml +++ b/app/src/main/res/layout/fragment_payment.xml @@ -1,17 +1,8 @@ - - - - - \ No newline at end of file + tools:listitem="@layout/item_sells_payment"/> \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_sells.xml b/app/src/main/res/layout/fragment_sells.xml index b70a73a..9992f7c 100644 --- a/app/src/main/res/layout/fragment_sells.xml +++ b/app/src/main/res/layout/fragment_sells.xml @@ -1,19 +1,25 @@ - + app:tabMode="scrollable" + app:tabTextAppearance="@style/label_medium_prominent" + app:tabSelectedTextAppearance="@style/label_medium_prominent" + app:tabIndicatorColor="@color/blue_500" + app:tabSelectedTextColor="@color/blue_500" + app:tabTextColor="@color/black_300" + app:tabBackground="@color/white" + app:tabPadding="13dp"/> - \ No newline at end of file + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_shipment.xml b/app/src/main/res/layout/fragment_shipment.xml index 6d6fd62..4b2902e 100644 --- a/app/src/main/res/layout/fragment_shipment.xml +++ b/app/src/main/res/layout/fragment_shipment.xml @@ -1,17 +1,7 @@ - - - - - \ No newline at end of file + tools:listitem="@layout/item_sells_shipment" /> \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_shipped.xml b/app/src/main/res/layout/fragment_shipped.xml index ab1cdd0..907ec43 100644 --- a/app/src/main/res/layout/fragment_shipped.xml +++ b/app/src/main/res/layout/fragment_shipped.xml @@ -1,17 +1,7 @@ - - - - - \ No newline at end of file + android:layout_height="match_parent"/> \ No newline at end of file From db70bce237373b643e26df43031fbce80bd1f465 Mon Sep 17 00:00:00 2001 From: Gracia Date: Fri, 25 Apr 2025 11:22:10 +0700 Subject: [PATCH 3/3] test --- app/build.gradle.kts | 2 + app/src/main/AndroidManifest.xml | 7 +- ...ivity.kt => DetailStoreProductActivity.kt} | 8 +- .../mystore/product/ProductActivity.kt | 2 +- .../ProductOptionsBottomSheetFragment.kt | 4 +- ...ivity.kt => DetailStoreAddressActivity.kt} | 4 +- .../ui/profile/mystore/sells/SellsAdapter.kt | 152 ++++++++++ .../ui/profile/mystore/sells/SellsFragment.kt | 2 + .../sells/all_sells/AllSellsFragment.kt | 18 +- .../layout/activity_detail_store_address.xml | 285 ++++++++++++++++++ ....xml => activity_detail_store_product.xml} | 2 +- .../layout/activity_detail_store_profile.xml | 56 ++-- .../res/layout/activity_store_address.xml | 11 - gradle/libs.versions.toml | 4 + 14 files changed, 498 insertions(+), 59 deletions(-) rename app/src/main/java/com/alya/ecommerce_serang/ui/profile/mystore/product/{StoreProductDetailActivity.kt => DetailStoreProductActivity.kt} (98%) rename app/src/main/java/com/alya/ecommerce_serang/ui/profile/mystore/profile/address/{StoreAddressActivity.kt => DetailStoreAddressActivity.kt} (85%) create mode 100644 app/src/main/java/com/alya/ecommerce_serang/ui/profile/mystore/sells/SellsAdapter.kt create mode 100644 app/src/main/res/layout/activity_detail_store_address.xml rename app/src/main/res/layout/{activity_store_product_detail.xml => activity_detail_store_product.xml} (99%) delete mode 100644 app/src/main/res/layout/activity_store_address.xml diff --git a/app/build.gradle.kts b/app/build.gradle.kts index d01aae7..aea446e 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -94,6 +94,8 @@ dependencies { implementation("androidx.swiperefreshlayout:swiperefreshlayout:1.1.0") implementation("de.hdodenhof:circleimageview:3.1.0") + //maps + implementation("org.osmdroid:osmdroid-android:6.0.3") // implementation(libs.hilt.android) // kapt("com.google.dagger:hilt-compiler:2.48") diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index f53b801..3263059 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -8,9 +8,12 @@ + + private var imageUri: Uri? = null @@ -81,7 +81,7 @@ class StoreProductDetailActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - binding = ActivityStoreProductDetailBinding.inflate(layoutInflater) + binding = ActivityDetailStoreProductBinding.inflate(layoutInflater) setContentView(binding.root) val isEditing = intent.getBooleanExtra("is_editing", false) diff --git a/app/src/main/java/com/alya/ecommerce_serang/ui/profile/mystore/product/ProductActivity.kt b/app/src/main/java/com/alya/ecommerce_serang/ui/profile/mystore/product/ProductActivity.kt index 0eee6be..3a40ba1 100644 --- a/app/src/main/java/com/alya/ecommerce_serang/ui/profile/mystore/product/ProductActivity.kt +++ b/app/src/main/java/com/alya/ecommerce_serang/ui/profile/mystore/product/ProductActivity.kt @@ -73,7 +73,7 @@ class ProductActivity : AppCompatActivity() { } binding.header.headerRightText.setOnClickListener { - val intent = Intent(this, StoreProductDetailActivity::class.java) + val intent = Intent(this, DetailStoreProductActivity::class.java) intent.putExtra("is_editing", false) startActivity(intent) } diff --git a/app/src/main/java/com/alya/ecommerce_serang/ui/profile/mystore/product/ProductOptionsBottomSheetFragment.kt b/app/src/main/java/com/alya/ecommerce_serang/ui/profile/mystore/product/ProductOptionsBottomSheetFragment.kt index 7e1cf10..7c990f1 100644 --- a/app/src/main/java/com/alya/ecommerce_serang/ui/profile/mystore/product/ProductOptionsBottomSheetFragment.kt +++ b/app/src/main/java/com/alya/ecommerce_serang/ui/profile/mystore/product/ProductOptionsBottomSheetFragment.kt @@ -3,13 +3,11 @@ package com.alya.ecommerce_serang.ui.profile.mystore.product import android.app.AlertDialog import android.content.Intent import android.os.Bundle -import androidx.fragment.app.Fragment import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import android.widget.Toast import androidx.lifecycle.ViewModelProvider -import com.alya.ecommerce_serang.R import com.alya.ecommerce_serang.data.api.dto.ProductsItem import com.alya.ecommerce_serang.databinding.FragmentProductOptionsBottomSheetBinding import com.alya.ecommerce_serang.utils.viewmodel.ProductViewModel @@ -32,7 +30,7 @@ class ProductOptionsBottomSheetFragment(private val product: ProductsItem) : Bot super.onViewCreated(view, savedInstanceState) binding.btnEditProduct.setOnClickListener { - val intent = Intent(requireContext(), StoreProductDetailActivity::class.java) + val intent = Intent(requireContext(), DetailStoreProductActivity::class.java) intent.putExtra("product_id", product.id) intent.putExtra("is_editing", true) startActivity(intent) diff --git a/app/src/main/java/com/alya/ecommerce_serang/ui/profile/mystore/profile/address/StoreAddressActivity.kt b/app/src/main/java/com/alya/ecommerce_serang/ui/profile/mystore/profile/address/DetailStoreAddressActivity.kt similarity index 85% rename from app/src/main/java/com/alya/ecommerce_serang/ui/profile/mystore/profile/address/StoreAddressActivity.kt rename to app/src/main/java/com/alya/ecommerce_serang/ui/profile/mystore/profile/address/DetailStoreAddressActivity.kt index eca05b1..94f258c 100644 --- a/app/src/main/java/com/alya/ecommerce_serang/ui/profile/mystore/profile/address/StoreAddressActivity.kt +++ b/app/src/main/java/com/alya/ecommerce_serang/ui/profile/mystore/profile/address/DetailStoreAddressActivity.kt @@ -7,11 +7,11 @@ import androidx.core.view.ViewCompat import androidx.core.view.WindowInsetsCompat import com.alya.ecommerce_serang.R -class StoreAddressActivity : AppCompatActivity() { +class DetailStoreAddressActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) enableEdgeToEdge() - setContentView(R.layout.activity_store_address) + setContentView(R.layout.activity_detail_store_address) 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) diff --git a/app/src/main/java/com/alya/ecommerce_serang/ui/profile/mystore/sells/SellsAdapter.kt b/app/src/main/java/com/alya/ecommerce_serang/ui/profile/mystore/sells/SellsAdapter.kt new file mode 100644 index 0000000..e61b286 --- /dev/null +++ b/app/src/main/java/com/alya/ecommerce_serang/ui/profile/mystore/sells/SellsAdapter.kt @@ -0,0 +1,152 @@ +package com.alya.ecommerce_serang.ui.profile.mystore.sells + +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.TextView +import androidx.recyclerview.widget.RecyclerView +import com.alya.ecommerce_serang.R +import com.alya.ecommerce_serang.data.api.dto.OrdersItem + +class SellsAdapter : RecyclerView.Adapter() { + private var orderList: List = emptyList() + + // View Types for different statuses + private val TYPE_PENDING = 0 + private val TYPE_PAYMENT = 1 + private val TYPE_SHIPMENT = 2 + private val TYPE_COMPLETED = 3 + private val TYPE_FAILED_PAYMENT = 4 + private val TYPE_FAILED_SHIPMENT = 5 + + // Method to submit list to the adapter + fun submitList(orders: List?) { + orderList = orders ?: emptyList() + notifyDataSetChanged() + } + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder { + return when (viewType) { + TYPE_PENDING -> { + val view = LayoutInflater.from(parent.context).inflate(R.layout.item_sells_order, parent, false) + OrderViewHolder(view) + } + TYPE_PAYMENT -> { + val view = LayoutInflater.from(parent.context).inflate(R.layout.item_sells_payment, parent, false) + PaymentViewHolder(view) + } + TYPE_SHIPMENT -> { + val view = LayoutInflater.from(parent.context).inflate(R.layout.item_sells_shipment, parent, false) + ShipmentViewHolder(view) + } +// TYPE_COMPLETED -> { +// val view = LayoutInflater.from(parent.context).inflate(R.layout.item_sells_completed, parent, false) +// CompletedViewHolder(view) +// } +// TYPE_FAILED_PAYMENT -> { +// val view = LayoutInflater.from(parent.context).inflate(R.layout.item_sells_failed_payment, parent, false) +// FailedPaymentViewHolder(view) +// } +// TYPE_FAILED_SHIPMENT -> { +// val view = LayoutInflater.from(parent.context).inflate(R.layout.item_sells_failed_shipment, parent, false) +// FailedShipmentViewHolder(view) +// } + else -> { + val view = LayoutInflater.from(parent.context).inflate(R.layout.item_sells_order, parent, false) + OrderViewHolder(view) + } + } + } + + // Determine the view type based on the order status + override fun getItemViewType(position: Int): Int { + val order = orderList[position] + return when (order?.status) { + "pending" -> TYPE_PENDING + "paid" -> TYPE_PAYMENT + "shipped" -> TYPE_SHIPMENT + "completed" -> TYPE_COMPLETED + "failedPayment" -> TYPE_FAILED_PAYMENT + "failedShipment" -> TYPE_FAILED_SHIPMENT + else -> TYPE_PENDING // Default to pending if no status is matched + } + } + + override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) { + val order = orderList[position] + when (holder) { + is OrderViewHolder -> holder.bind(order) + is PaymentViewHolder -> holder.bind(order) + is ShipmentViewHolder -> holder.bind(order) + is CompletedViewHolder -> holder.bind(order) + is FailedPaymentViewHolder -> holder.bind(order) + is FailedShipmentViewHolder -> holder.bind(order) + } + } + + override fun getItemCount(): Int = orderList.size + + // ViewHolder for 'pending' status (Order) + class OrderViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { + private val tvOrderNumber: TextView = itemView.findViewById(R.id.tv_order_number) + private val tvOrderCustomer: TextView = itemView.findViewById(R.id.tv_order_customer) + private val tvOrderPrice: TextView = itemView.findViewById(R.id.tv_order_price) + + fun bind(order: OrdersItem?) { + tvOrderNumber.text = "Order #${order?.orderId}" + tvOrderCustomer.text = order?.username + tvOrderPrice.text = "Total: ${order?.totalAmount}" + } + } + + // ViewHolder for 'paid' status (Payment) + class PaymentViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { + private val tvPaymentNumber: TextView = itemView.findViewById(R.id.tv_payment_number) + private val tvPaymentCustomer: TextView = itemView.findViewById(R.id.tv_payment_customer) + private val tvPaymentPrice: TextView = itemView.findViewById(R.id.tv_payment_price) + + fun bind(order: OrdersItem?) { + tvPaymentNumber.text = "Order #${order?.orderId}" + tvPaymentCustomer.text = order?.username + tvPaymentPrice.text = "Paid: ${order?.totalAmount}" + } + } + + // ViewHolder for 'shipped' status (Shipment) + class ShipmentViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { + private val tvShipmentNumber: TextView = itemView.findViewById(R.id.tv_shipment_number) + private val tvShipmentLocation: TextView = itemView.findViewById(R.id.tv_shipment_location) + + fun bind(order: OrdersItem?) { + tvShipmentNumber.text = "Shipment #${order?.orderId}" + tvShipmentLocation.text = "Location: ${order?.address?.subdistrict}" + } + } + + // ViewHolder for 'completed' status + class CompletedViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { + //private val tvCompletedNumber: TextView = itemView.findViewById(R.id.tv_completed_number) + + fun bind(order: OrdersItem?) { + // tvCompletedNumber.text = "Completed Order #${order?.orderId}" + } + } + + // ViewHolder for 'failedPayment' status + class FailedPaymentViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { + //private val tvFailedPaymentNumber: TextView = itemView.findViewById(R.id.tv_failed_payment_number) + + fun bind(order: OrdersItem?) { + //tvFailedPaymentNumber.text = "Failed Payment Order #${order?.orderId}" + } + } + + // ViewHolder for 'failedShipment' status + class FailedShipmentViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { + //private val tvFailedShipmentNumber: TextView = itemView.findViewById(R.id.tv_failed_shipment_number) + + fun bind(order: OrdersItem?) { + //tvFailedShipmentNumber.text = "Failed Shipment Order #${order?.orderId}" + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/alya/ecommerce_serang/ui/profile/mystore/sells/SellsFragment.kt b/app/src/main/java/com/alya/ecommerce_serang/ui/profile/mystore/sells/SellsFragment.kt index 91d202e..04a816a 100644 --- a/app/src/main/java/com/alya/ecommerce_serang/ui/profile/mystore/sells/SellsFragment.kt +++ b/app/src/main/java/com/alya/ecommerce_serang/ui/profile/mystore/sells/SellsFragment.kt @@ -24,6 +24,8 @@ class SellsFragment : Fragment() { override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) + +// val repository = OrderRepository(ApiService.create()) viewModel = ViewModelProvider(this)[SellsViewModel::class.java] val tabs = listOf( diff --git a/app/src/main/java/com/alya/ecommerce_serang/ui/profile/mystore/sells/all_sells/AllSellsFragment.kt b/app/src/main/java/com/alya/ecommerce_serang/ui/profile/mystore/sells/all_sells/AllSellsFragment.kt index 0b45642..bee4a1c 100644 --- a/app/src/main/java/com/alya/ecommerce_serang/ui/profile/mystore/sells/all_sells/AllSellsFragment.kt +++ b/app/src/main/java/com/alya/ecommerce_serang/ui/profile/mystore/sells/all_sells/AllSellsFragment.kt @@ -8,8 +8,8 @@ import android.view.ViewGroup import androidx.lifecycle.Observer import androidx.lifecycle.ViewModelProvider import androidx.recyclerview.widget.LinearLayoutManager -import com.alya.ecommerce_serang.R import com.alya.ecommerce_serang.databinding.FragmentAllSellsBinding +import com.alya.ecommerce_serang.ui.profile.mystore.sells.SellsAdapter import com.alya.ecommerce_serang.utils.viewmodel.SellsViewModel class AllSellsFragment : Fragment() { @@ -29,13 +29,13 @@ class AllSellsFragment : Fragment() { viewModel = ViewModelProvider(this).get(SellsViewModel::class.java) -// val adapter = SellsAdapter() -// binding.rvAllSells.layoutManager = LinearLayoutManager(context) -// binding.rvAllSells.adapter = adapter -// -// viewModel.loadAllSells() -// viewModel.sellsList.observe(viewLifecycleOwner, Observer { sells -> -// adapter.submitList(sells) -// }) + val adapter = SellsAdapter() + binding.rvAllSells.layoutManager = LinearLayoutManager(context) + binding.rvAllSells.adapter = adapter + + viewModel.loadOrdersByStatus("all") + viewModel.sellsList.observe(viewLifecycleOwner, Observer { sells -> + adapter.submitList(sells) + }) } } diff --git a/app/src/main/res/layout/activity_detail_store_address.xml b/app/src/main/res/layout/activity_detail_store_address.xml new file mode 100644 index 0000000..3efe392 --- /dev/null +++ b/app/src/main/res/layout/activity_detail_store_address.xml @@ -0,0 +1,285 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +