From 0bc203c5dbdccb0e48719b1b1301bbc99ed87f0c Mon Sep 17 00:00:00 2001 From: Gilbert Kimutai Date: Mon, 25 Mar 2019 06:32:24 +0300 Subject: [PATCH] Add a review dialog and function --- .../java/me/gilo/wc/di/ViewModelModule.java | 7 + .../java/me/gilo/wc/events/ReviewEvent.java | 21 +++ .../me/gilo/wc/repo/ReviewRepository.java | 43 +++++ .../section/AddAReviewDialogFragment.kt | 78 +++++++++ .../product/section/ProductReviewsFragment.kt | 64 ++++++- .../gilo/wc/viewmodels/ReviewViewModel.java | 36 ++++ .../main/res/layout/section_add_a_review.xml | 161 ++++++++++++++++++ .../res/layout/section_product_reviews.xml | 40 ++++- 8 files changed, 439 insertions(+), 11 deletions(-) create mode 100644 app/src/main/java/me/gilo/wc/events/ReviewEvent.java create mode 100644 app/src/main/java/me/gilo/wc/repo/ReviewRepository.java create mode 100644 app/src/main/java/me/gilo/wc/ui/product/section/AddAReviewDialogFragment.kt create mode 100644 app/src/main/java/me/gilo/wc/viewmodels/ReviewViewModel.java create mode 100644 app/src/main/res/layout/section_add_a_review.xml diff --git a/app/src/main/java/me/gilo/wc/di/ViewModelModule.java b/app/src/main/java/me/gilo/wc/di/ViewModelModule.java index e5dca13..c7ad6eb 100644 --- a/app/src/main/java/me/gilo/wc/di/ViewModelModule.java +++ b/app/src/main/java/me/gilo/wc/di/ViewModelModule.java @@ -8,6 +8,7 @@ import dagger.multibindings.IntoMap; import me.gilo.wc.utils.ViewModelFactory; import me.gilo.wc.viewmodels.CategoryViewModel; import me.gilo.wc.viewmodels.ProductViewModel; +import me.gilo.wc.viewmodels.ReviewViewModel; @SuppressWarnings("WeakerAccess") @@ -24,6 +25,12 @@ public abstract class ViewModelModule { @ViewModelKey(CategoryViewModel.class) abstract ViewModel bindCategoryViewModel(CategoryViewModel viewModel); + + @Binds + @IntoMap + @ViewModelKey(ReviewViewModel.class) + abstract ViewModel bindRevuewViewModel(ReviewViewModel viewModel); + @Binds abstract ViewModelProvider.Factory bindViewModelFactory(ViewModelFactory factory); } diff --git a/app/src/main/java/me/gilo/wc/events/ReviewEvent.java b/app/src/main/java/me/gilo/wc/events/ReviewEvent.java new file mode 100644 index 0000000..bcff1de --- /dev/null +++ b/app/src/main/java/me/gilo/wc/events/ReviewEvent.java @@ -0,0 +1,21 @@ +package me.gilo.wc.events; + +import me.gilo.woodroid.models.Product; +import me.gilo.woodroid.models.ProductReview; + +public class ReviewEvent { + + ProductReview review; + + public ReviewEvent(ProductReview review) { + this.review = review; + } + + public ProductReview getReview() { + return review; + } + + public void setReview(ProductReview review) { + this.review = review; + } +} diff --git a/app/src/main/java/me/gilo/wc/repo/ReviewRepository.java b/app/src/main/java/me/gilo/wc/repo/ReviewRepository.java new file mode 100644 index 0000000..a1d3494 --- /dev/null +++ b/app/src/main/java/me/gilo/wc/repo/ReviewRepository.java @@ -0,0 +1,43 @@ +package me.gilo.wc.repo; + + +import me.gilo.wc.common.WooLiveData; +import me.gilo.woodroid.Woocommerce; +import me.gilo.woodroid.models.Product; +import me.gilo.woodroid.models.ProductReview; +import me.gilo.woodroid.models.filters.ProductFilter; +import me.gilo.woodroid.models.filters.ProductReviewFilter; + +import javax.inject.Inject; +import java.util.List; + +public class ReviewRepository { + + @Inject + Woocommerce woocommerce; + + @Inject + public ReviewRepository() { + } + + + public WooLiveData> reviews(int productId) { + final WooLiveData> callBack = new WooLiveData(); + + ProductReviewFilter filter = new ProductReviewFilter(); + int[] products = {productId}; + + filter.setProduct(products); + + woocommerce.ReviewRepository().reviews(filter).enqueue(callBack); + return callBack; + } + + public WooLiveData create(ProductReview review) { + final WooLiveData callBack = new WooLiveData(); + woocommerce.ReviewRepository().create(review).enqueue(callBack); + return callBack; + } + + +} diff --git a/app/src/main/java/me/gilo/wc/ui/product/section/AddAReviewDialogFragment.kt b/app/src/main/java/me/gilo/wc/ui/product/section/AddAReviewDialogFragment.kt new file mode 100644 index 0000000..444226c --- /dev/null +++ b/app/src/main/java/me/gilo/wc/ui/product/section/AddAReviewDialogFragment.kt @@ -0,0 +1,78 @@ +package me.gilo.wc.ui.product.section + +import android.os.Bundle +import android.support.v4.app.DialogFragment +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import kotlinx.android.synthetic.main.section_add_a_review.* +import me.gilo.wc.R +import me.gilo.wc.events.ReviewEvent +import me.gilo.woodroid.models.ProductReview +import org.greenrobot.eventbus.EventBus + + +class AddAReviewDialogFragment : DialogFragment() { + + var productId = 0 + + private val ARG_PRODUCT_ID = "productId" + + init { + val args = Bundle() + args.putInt(ARG_PRODUCT_ID, productId) + + arguments = args + } + + override fun onCreateView( + inflater: LayoutInflater, container: ViewGroup?, + savedInstanceState: Bundle? + ): View? { + + return inflater.inflate(R.layout.section_add_a_review, container) + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + + productId = arguments!!.getInt(ARG_PRODUCT_ID) + + llSave.setOnClickListener{save()} + + } + + private fun save() { + var productReview = ProductReview() + + var review = etReview.text.toString() + var rating = rbRating.rating + var email = etEmail.text.toString() + var name = etName.text.toString() + + productReview.product_id = productId + productReview.rating = rating.toInt() + productReview.review = review + productReview.reviewer = name + productReview.reviewer_email = email + productReview.isVerified = true + + + EventBus.getDefault().post(ReviewEvent(productReview)) + + dismiss() + + } + + companion object { + + fun newInstance(productId : Int): AddAReviewDialogFragment { + val fragment = AddAReviewDialogFragment() + val args = Bundle() + args.putInt("productId", productId) + + fragment.arguments = args + return fragment + } + } +} \ No newline at end of file diff --git a/app/src/main/java/me/gilo/wc/ui/product/section/ProductReviewsFragment.kt b/app/src/main/java/me/gilo/wc/ui/product/section/ProductReviewsFragment.kt index 2ea882d..1925230 100644 --- a/app/src/main/java/me/gilo/wc/ui/product/section/ProductReviewsFragment.kt +++ b/app/src/main/java/me/gilo/wc/ui/product/section/ProductReviewsFragment.kt @@ -12,18 +12,23 @@ import me.gilo.wc.R import me.gilo.wc.adapter.ProductReviewAdapter import me.gilo.wc.common.BaseActivity import me.gilo.wc.common.Status +import me.gilo.wc.events.ReviewEvent import me.gilo.wc.ui.product.ProductActivity import me.gilo.wc.viewmodels.ProductViewModel +import me.gilo.wc.viewmodels.ReviewViewModel import me.gilo.woodroid.models.ProductReview import org.greenrobot.eventbus.EventBus +import org.greenrobot.eventbus.Subscribe +import org.greenrobot.eventbus.ThreadMode import java.util.* class ProductReviewsFragment : Fragment() { - lateinit var viewModel: ProductViewModel + lateinit var viewModel: ReviewViewModel val TAG = "ProductReviewsFragment" + var productId = 0 override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) @@ -44,11 +49,13 @@ class ProductReviewsFragment : Fragment() { override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) - viewModel = (activity as BaseActivity).getViewModel(ProductViewModel::class.java) + viewModel = (activity as BaseActivity).getViewModel(ReviewViewModel::class.java) - var productId = (activity as ProductActivity).intent.getIntExtra("productId", 0) + productId = (activity as ProductActivity).intent.getIntExtra("productId", 0) reviews(productId) + + tvAddAReview.setOnClickListener{addAReviewDialog()} } private fun reviews(productId : Int) { @@ -104,4 +111,55 @@ class ProductReviewsFragment : Fragment() { } } + lateinit var addAReviewFragment: AddAReviewDialogFragment + + private fun addAReviewDialog() { + val manager = childFragmentManager + addAReviewFragment = AddAReviewDialogFragment.newInstance(productId) + addAReviewFragment.isCancelable = true + addAReviewFragment.show(manager, "add Review") + } + + override fun onStart() { + super.onStart() + EventBus.getDefault().register(this) + } + + override fun onStop() { + super.onStop() + EventBus.getDefault().unregister(this) + } + + @Subscribe(threadMode = ThreadMode.MAIN) + fun onMessageEvent(event: ReviewEvent) { + save(event.review) + } + + private fun save(review: ProductReview) { + viewModel.create(review).observe(this, android.arch.lifecycle.Observer { response -> + when (response!!.status()) { + Status.LOADING -> { + + } + + Status.SUCCESS -> { + val reviewsResponse = response.data() + reviews(productId) + + } + + Status.ERROR -> { + Log.d("Error", response.error().message) + } + + Status.EMPTY -> { + + } + } + + }) + + + } + } diff --git a/app/src/main/java/me/gilo/wc/viewmodels/ReviewViewModel.java b/app/src/main/java/me/gilo/wc/viewmodels/ReviewViewModel.java new file mode 100644 index 0000000..11cf6f4 --- /dev/null +++ b/app/src/main/java/me/gilo/wc/viewmodels/ReviewViewModel.java @@ -0,0 +1,36 @@ +package me.gilo.wc.viewmodels; + +import android.arch.lifecycle.ViewModel; +import android.content.Context; +import me.gilo.wc.common.WooLiveData; +import me.gilo.wc.repo.CartRepository; +import me.gilo.wc.repo.OrderRepository; +import me.gilo.wc.repo.ProductRepository; +import me.gilo.wc.repo.ReviewRepository; +import me.gilo.woodroid.models.LineItem; +import me.gilo.woodroid.models.Product; +import me.gilo.woodroid.models.ProductReview; +import me.gilo.woodroid.models.filters.ProductFilter; + +import javax.inject.Inject; +import java.util.List; +import java.util.Map; + + +public final class ReviewViewModel extends ViewModel { + private final ReviewRepository reviewRepository; + + @Inject + ReviewViewModel(ReviewRepository reviewRepository) { + this.reviewRepository = reviewRepository; + } + + public WooLiveData> reviews(int productId) { + return reviewRepository.reviews(productId); + } + + public WooLiveData create(ProductReview review) { + return reviewRepository.create(review); + } + +} \ No newline at end of file diff --git a/app/src/main/res/layout/section_add_a_review.xml b/app/src/main/res/layout/section_add_a_review.xml new file mode 100644 index 0000000..318d88b --- /dev/null +++ b/app/src/main/res/layout/section_add_a_review.xml @@ -0,0 +1,161 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/section_product_reviews.xml b/app/src/main/res/layout/section_product_reviews.xml index 9829c5e..5f673e2 100644 --- a/app/src/main/res/layout/section_product_reviews.xml +++ b/app/src/main/res/layout/section_product_reviews.xml @@ -8,17 +8,41 @@ tools:ignore="MissingPrefix" > - + android:orientation="horizontal" + android:gravity="bottom" + > + + + + + + + +