Add to cart function

This commit is contained in:
Gilbert Kimutai 2019-04-22 06:57:55 +03:00
parent 6b94ee730d
commit e8fc0899ca
12 changed files with 283 additions and 36 deletions

View File

@ -0,0 +1,10 @@
package me.gilo.wc;
public class Config {
public static String currencySymbol = "Ksh.";
public static String siteUrl = "http://192.168.100.61/shop/index.php";
public static String consumerKey = "ck_da34628a4a69128001876492b842be4cd3c76bf8";
public static String consumerSecret = "cs_c3c70248288a60bc21a0cddc81acdc018df1632d";
}

View File

@ -2,6 +2,7 @@ package me.gilo.wc.di;
import dagger.Module;
import dagger.Provides;
import me.gilo.wc.Config;
import me.gilo.wc.WcApp;
import me.gilo.woodroid.Woocommerce;
@ -26,10 +27,10 @@ public class AppModule {
@Singleton
Woocommerce providesWoocommerce() {
Woocommerce woocommerce = Woocommerce.Builder()
.setSiteUrl("http://157.230.131.179")
.setSiteUrl(Config.siteUrl)
.setApiVersion(Woocommerce.API_V3)
.setConsumerKey("ck_26c61abd7eeff238d87dc56585bf26cb2d1a1ec3")
.setConsumerSecret("cs_062e8e3a7ae0ce08fdebc0c39f8f834d5e87598e")
.setConsumerKey(Config.consumerKey)
.setConsumerSecret(Config.consumerSecret)
.build();
return woocommerce;

View File

@ -38,6 +38,11 @@ public class FirebaseUserRepository extends FirebaseRepository {
}
public void logout() {
FirebaseAuth auth = FirebaseAuth.getInstance();
auth.signOut();
}
public CompletionGenericLiveData<AuthResult> anonymousSignIn() {
final CompletionGenericLiveData<AuthResult> completion = new CompletionGenericLiveData();

View File

@ -14,10 +14,6 @@ class CheckoutActivity : AppCompatActivity() {
setContentView(R.layout.activity_checkout)
setSupportActionBar(toolbar)
fab.setOnClickListener { view ->
Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)
.setAction("Action", null).show()
}
}
}

View File

@ -22,11 +22,13 @@ import java.util.regex.Pattern
class BasicCustomerDetailsActivity : WooDroidActivity<CustomerViewModel>() {
override lateinit var viewModel : CustomerViewModel
override lateinit var viewModel: CustomerViewModel
private val pattern = Pattern.compile(EMAIL_PATTERN)
private var matcher: Matcher? = null
lateinit var customer: Customer
var newCustomer = false
override fun attachBaseContext(newBase: Context) {
super.attachBaseContext(ViewPumpContextWrapper.wrap(newBase))
}
@ -38,22 +40,27 @@ class BasicCustomerDetailsActivity : WooDroidActivity<CustomerViewModel>() {
viewModel = getViewModel(CustomerViewModel::class.java)
title = "Basic Details"
customer()
customer()
flSave.setOnClickListener{save()}
flSave.setOnClickListener {
if (newCustomer) {
create()
} else {
save()
}
}
}
private fun customer() {
viewModel.currentCustomer().observe(this, Observer {
response->
when (response!!.status()){
Status.LOADING ->{
viewModel.currentCustomer().observe(this, Observer { response ->
when (response!!.status()) {
Status.LOADING -> {
showLoading("Retrieve customer details", "This will only take a short while")
}
Status.SUCCESS ->{
Status.SUCCESS -> {
stopShowingLoading()
customer = response.data()[0]
@ -62,15 +69,18 @@ class BasicCustomerDetailsActivity : WooDroidActivity<CustomerViewModel>() {
etLastName.setText(customer.lastName)
etUsername.setText(customer.username)
newCustomer = false
}
Status.ERROR ->{
Status.ERROR -> {
stopShowingLoading()
Toast.makeText(baseContext, response.error().message.toString(), Toast.LENGTH_LONG).show()
}
Status.EMPTY ->{
Status.EMPTY -> {
stopShowingLoading()
newCustomer = true
}
}
@ -81,7 +91,7 @@ class BasicCustomerDetailsActivity : WooDroidActivity<CustomerViewModel>() {
private fun save() {
if (validates()) {
val email = etEmail.text.toString()
val firstName = etFirstName.text.toString()
val firstName = etFirstName.text.toString()
val lastName = etLastName.text.toString()
val username = etUsername.text.toString()
@ -90,24 +100,23 @@ class BasicCustomerDetailsActivity : WooDroidActivity<CustomerViewModel>() {
customer.lastName = lastName
customer.username = username
viewModel.update(customer.id, customer).observe(this, Observer {
response->
when (response!!.status()){
Status.LOADING ->{
viewModel.update(customer.id, customer).observe(this, Observer { response ->
when (response!!.status()) {
Status.LOADING -> {
showLoading("Uploading account details", "This will only take a short while")
}
Status.SUCCESS ->{
Status.SUCCESS -> {
stopShowingLoading()
finish()
}
Status.ERROR ->{
Status.ERROR -> {
stopShowingLoading()
Toast.makeText(baseContext, response.error().message.toString(), Toast.LENGTH_LONG).show()
}
Status.EMPTY ->{
Status.EMPTY -> {
}
@ -115,6 +124,47 @@ class BasicCustomerDetailsActivity : WooDroidActivity<CustomerViewModel>() {
})
} else {
Toast.makeText(this, "Please correct the information entered", Toast.LENGTH_SHORT).show()
}
}
private fun create() {
if (validates()) {
val email = etEmail.text.toString()
val firstName = etFirstName.text.toString()
val lastName = etLastName.text.toString()
val username = etUsername.text.toString()
var customer = Customer()
customer.email = email
customer.firstName = firstName
customer.lastName = lastName
customer.username = username
viewModel.create(customer).observe(this, Observer { response ->
when (response!!.status()) {
Status.LOADING -> {
showLoading("Uploading account details", "This will only take a short while")
}
Status.SUCCESS -> {
stopShowingLoading()
finish()
}
Status.ERROR -> {
stopShowingLoading()
Toast.makeText(baseContext, response.error().message.toString(), Toast.LENGTH_LONG).show()
}
Status.EMPTY -> {
}
}
})
} else {
Toast.makeText(this, "Please correct the information entered", Toast.LENGTH_SHORT).show()
@ -130,9 +180,9 @@ class BasicCustomerDetailsActivity : WooDroidActivity<CustomerViewModel>() {
var validation = true
val email = tilEmail.editText!!.text.toString()
val firstName = etFirstName.text.toString()
val firstName = etFirstName.text.toString()
val lastName = etLastName.text.toString()
val username = etUsername.text.toString()
val username = etUsername.text.toString()
@ -160,7 +210,8 @@ class BasicCustomerDetailsActivity : WooDroidActivity<CustomerViewModel>() {
}
companion object {
private const val EMAIL_PATTERN = "^[a-zA-Z0-9#_~!$&'()*+,;=:.\"(),:;<>@\\[\\]\\\\]+@[a-zA-Z0-9-]+(\\.[a-zA-Z0-9-]+)*$"
private const val EMAIL_PATTERN =
"^[a-zA-Z0-9#_~!$&'()*+,;=:.\"(),:;<>@\\[\\]\\\\]+@[a-zA-Z0-9-]+(\\.[a-zA-Z0-9-]+)*$"
}
}

View File

@ -12,12 +12,13 @@ import me.gilo.raison.ui.user.onboarding.SignUpActivity
import me.gilo.wc.R
import me.gilo.wc.ui.customer.ProfileActivity
import me.gilo.wc.viewmodels.ProductViewModel
import me.gilo.wc.viewmodels.UserViewModel
class ProfileFragment : Fragment() {
lateinit var viewModel: ProductViewModel
lateinit var viewModel: UserViewModel
val TAG = "ProfileFragment"
override fun onCreate(savedInstanceState: Bundle?) {
@ -37,6 +38,8 @@ class ProfileFragment : Fragment() {
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
viewModel = (activity as HomeActivity).getViewModel(UserViewModel::class.java)
llMyProfile.setOnClickListener{
if (FirebaseAuth.getInstance().currentUser != null) {
startActivity(Intent(activity, ProfileActivity::class.java))
@ -45,6 +48,11 @@ class ProfileFragment : Fragment() {
}
}
llLogout.setOnClickListener{
viewModel.logout()
startActivity(Intent(activity, SignUpActivity::class.java))
}
}

View File

@ -1,16 +1,21 @@
package me.gilo.wc.ui.product
import android.arch.lifecycle.Observer
import android.content.Context
import android.content.Intent
import android.os.Bundle
import android.support.v7.widget.LinearLayoutManager
import android.text.SpannableString
import android.view.View
import android.widget.Toast
import com.google.common.primitives.UnsignedBytes.toInt
import io.github.inflationx.viewpump.ViewPumpContextWrapper
import kotlinx.android.synthetic.main.activity_cart.*
import kotlinx.android.synthetic.main.content_cart.*
import kotlinx.android.synthetic.main.content_profile.*
import kotlinx.android.synthetic.main.single_cart_item.*
import kotlinx.android.synthetic.main.state_empty.*
import me.gilo.raison.ui.user.onboarding.SignUpActivity
import me.gilo.wc.R
import me.gilo.wc.adapter.CartAdapter
import me.gilo.wc.common.Status
@ -20,6 +25,9 @@ import me.gilo.wc.events.ProductEvent
import me.gilo.wc.models.CartLineItem
import me.gilo.wc.ui.WooDroidActivity
import me.gilo.wc.viewmodels.CartViewModel
import me.gilo.woodroid.models.Customer
import me.gilo.woodroid.models.LineItem
import me.gilo.woodroid.models.Order
import org.greenrobot.eventbus.EventBus
import org.greenrobot.eventbus.Subscribe
import org.greenrobot.eventbus.ThreadMode
@ -31,6 +39,7 @@ class CartActivity : WooDroidActivity<CartViewModel>() {
var cartItems: ArrayList<CartLineItem> = ArrayList()
lateinit var adapter: CartAdapter
lateinit var customer: Customer
override fun attachBaseContext(newBase: Context) {
super.attachBaseContext(ViewPumpContextWrapper.wrap(newBase))
@ -55,10 +64,13 @@ class CartActivity : WooDroidActivity<CartViewModel>() {
rvCart.adapter = adapter
cart()
customer()
llEmptyState_layout.visibility = View.GONE
}
private fun cart() {
@ -97,6 +109,33 @@ class CartActivity : WooDroidActivity<CartViewModel>() {
}
private fun createOrder(order : Order) {
viewModel.createOrder(order).observe(this, android.arch.lifecycle.Observer { response ->
when (response!!.status()) {
Status.LOADING -> {
showLoading()
}
Status.SUCCESS -> {
finish()
}
Status.ERROR -> {
stopShowingLoading()
toast("Something went wrong!")
}
Status.EMPTY -> {
stopShowingLoading()
}
}
})
}
private fun setUpPage() {
var itemCount = cartItems.size
var total = 0
@ -120,8 +159,34 @@ class CartActivity : WooDroidActivity<CartViewModel>() {
tvTotalItemCountTitle.text = "Items ($itemCount)"
}
tvTotalItemCost.text = "$$total"
tvTotal.text = "$$total"
tvTotalItemCost.text = "Ksh$total"
tvTotal.text = "Ksh$total"
flSave.setOnClickListener{
prepOrder()
}
}
private fun prepOrder() {
var order = Order()
var lineitems = ArrayList<LineItem>()
for (cartitem in cartItems){
var lineItem = LineItem()
lineItem.price = cartitem.getPrice().toString()
lineItem.productId = cartitem.productId
lineItem.quantity = cartitem.quantity
lineitems.add(lineItem);
}
order.setLineItems(lineitems);
order.setBillingAddress(customer.billingAddress)
order.setShippingAddress(customer.shippingAddress)
order.setCustomer(customer)
createOrder(order)
}
@ -205,5 +270,32 @@ class CartActivity : WooDroidActivity<CartViewModel>() {
}
private fun customer() {
viewModel.currentCustomer().observe(this, Observer {
response->
when (response!!.status()){
Status.LOADING ->{
}
Status.SUCCESS ->{
customer = response.data()[0]
}
Status.ERROR ->{
Toast.makeText(baseContext, response.error().message.toString(), Toast.LENGTH_LONG).show()
}
Status.EMPTY ->{
startActivity(Intent(baseContext, SignUpActivity::class.java))
finish()
}
}
})
}
}

View File

@ -8,11 +8,10 @@ import me.gilo.wc.common.QueryLiveData;
import me.gilo.wc.common.WooLiveData;
import me.gilo.wc.models.CartLineItem;
import me.gilo.wc.repo.CartRepository;
import me.gilo.wc.repo.CustomerRepository;
import me.gilo.wc.repo.OrderRepository;
import me.gilo.wc.repo.ProductRepository;
import me.gilo.woodroid.models.LineItem;
import me.gilo.woodroid.models.Product;
import me.gilo.woodroid.models.ProductReview;
import me.gilo.woodroid.models.*;
import me.gilo.woodroid.models.filters.ProductFilter;
import javax.inject.Inject;
@ -23,10 +22,14 @@ import java.util.Map;
public final class CartViewModel extends ViewModel {
private final CartRepository cartRepository;
private final OrderRepository orderRepository;
private final CustomerRepository customerRepository;
@Inject
CartViewModel(CartRepository cartRepository) {
CartViewModel(CartRepository cartRepository, OrderRepository orderRepository, CustomerRepository customerRepository) {
this.cartRepository = cartRepository;
this.orderRepository = orderRepository;
this.customerRepository = customerRepository;
}
public CompletionGenericLiveData<DocumentReference> addToCart(Product product) {
@ -53,4 +56,12 @@ public final class CartViewModel extends ViewModel {
return cartRepository.cart(context);
}
public WooLiveData<Order> createOrder(Order order) {
return orderRepository.create(order);
}
public WooLiveData<List<Customer>> currentCustomer() {
return customerRepository.currentCustomer();
}
}

View File

@ -29,6 +29,10 @@ public final class UserViewModel extends ViewModel {
return firebaseUserRepository.login(username, password);
}
public void logout() {
firebaseUserRepository.logout();
}
public CompletionGenericLiveData<AuthResult> anonymousSignIn() {
return firebaseUserRepository.anonymousSignIn();
}

View File

@ -0,0 +1,10 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24.0"
android:viewportHeight="24.0"
android:tint="?attr/colorControlNormal">
<path
android:fillColor="#ffffff"
android:pathData="M12,2C6.47,2 2,6.47 2,12s4.47,10 10,10 10,-4.47 10,-10S17.53,2 12,2zM17,15.59L15.59,17 12,13.41 8.41,17 7,15.59 10.59,12 7,8.41 8.41,7 12,10.59 15.59,7 17,8.41 13.41,12 17,15.59z"/>
</vector>

View File

@ -47,7 +47,7 @@
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:background="@color/colorPrimary"
android:text="Proceed to checkout"
android:text="Place Order"
android:padding="12dp"
android:gravity="center"
android:textAllCaps="false"

View File

@ -320,6 +320,65 @@
/>
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="16dp"
android:elevation="2dp"
android:background="@drawable/rect_white"
android:orientation="vertical"
>
<LinearLayout
android:id="@+id/llLogout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:padding="16dp"
android:gravity="center_vertical"
>
<ImageView
android:layout_width="24dp"
android:layout_height="24dp"
android:src="@drawable/baseline_cancel_24"
android:tint="@color/text_black_5"
/>
<TextView
fontPath="@string/font_regular"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="left"
android:text="Logout"
android:layout_marginRight="18dp"
android:layout_marginLeft="16dp"
android:layout_gravity="center_vertical"
android:textColor="@color/text_black_5"
android:textSize="18sp"/>
</LinearLayout>
<View
android:layout_width="match_parent"
android:layout_height="1dp"
android:background="@color/bg"
/>
<View
android:layout_width="match_parent"
android:layout_height="1dp"
android:background="@color/bg"
/>
<View
android:layout_width="match_parent"
android:layout_height="1dp"
android:background="@color/bg"
/>
</LinearLayout>
</LinearLayout>
</android.support.v4.widget.NestedScrollView>