diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 6d99830..2077f8c 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -12,6 +12,16 @@
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
+
+
+
+
{
+ private List categories;
+
+ public CategoryAdapter(List categories) {
+ this.categories = categories;
+ }
+
+ @Override
+ public CategoryViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
+ return new CategoryViewHolder(parent.getContext(), LayoutInflater.from(parent.getContext()).inflate(R.layout.single_category_item, parent, false));
+ }
+
+ @Override
+ public void onBindViewHolder(CategoryViewHolder holder, int position) {
+ holder.renderView(categories.get(position));
+ }
+
+
+ @Override
+ public int getItemCount() {
+ return categories.size() == 0 ? 0 : categories.size();
+ }
+}
diff --git a/app/src/main/java/me/gilo/wc/adapter/viewholder/CategoryViewHolder.kt b/app/src/main/java/me/gilo/wc/adapter/viewholder/CategoryViewHolder.kt
new file mode 100644
index 0000000..5b68544
--- /dev/null
+++ b/app/src/main/java/me/gilo/wc/adapter/viewholder/CategoryViewHolder.kt
@@ -0,0 +1,30 @@
+package me.gilo.wc.adapter.viewholder
+
+import android.content.Context
+import android.support.v7.widget.RecyclerView
+import android.text.Html
+import android.view.View
+import android.widget.TextView
+import me.gilo.wc.R
+import me.gilo.woodroid.models.Category
+
+class CategoryViewHolder(val context: Context, itemView: View) :
+ RecyclerView.ViewHolder(itemView) {
+
+ fun renderView(category: Category) {
+ val tvTitle = itemView.findViewById(R.id.tvTitle)
+ val tvDescription = itemView.findViewById(R.id.tvDescription)
+
+ tvTitle.text = category.name
+ tvDescription.text = Html.fromHtml(category.description)
+
+// itemView.setOnClickListener{
+// val intent = Intent(context, CouponActivity::class.java)
+// intent.putExtra("couponId", coupon.id)
+//
+// context.startActivity(intent)
+// }
+ }
+
+
+}
\ No newline at end of file
diff --git a/app/src/main/java/me/gilo/wc/di/ActivitiesModule.java b/app/src/main/java/me/gilo/wc/di/ActivitiesModule.java
index 2f130e6..4ddf8c7 100644
--- a/app/src/main/java/me/gilo/wc/di/ActivitiesModule.java
+++ b/app/src/main/java/me/gilo/wc/di/ActivitiesModule.java
@@ -3,6 +3,7 @@ package me.gilo.wc.di;
import dagger.Module;
import dagger.android.ContributesAndroidInjector;
import me.gilo.wc.MainActivity;
+import me.gilo.wc.ui.home.HomeActivity;
import me.gilo.wc.ui.product.ProductActivity;
import me.gilo.wc.ui.product.ShopActivity;
@@ -18,4 +19,7 @@ abstract class ActivitiesModule {
@ContributesAndroidInjector
abstract ProductActivity contributesProductActivity();
+ @ContributesAndroidInjector
+ abstract HomeActivity contributesHomeActivity();
+
}
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 576364a..e5dca13 100644
--- a/app/src/main/java/me/gilo/wc/di/ViewModelModule.java
+++ b/app/src/main/java/me/gilo/wc/di/ViewModelModule.java
@@ -6,6 +6,7 @@ import dagger.Binds;
import dagger.Module;
import dagger.multibindings.IntoMap;
import me.gilo.wc.utils.ViewModelFactory;
+import me.gilo.wc.viewmodels.CategoryViewModel;
import me.gilo.wc.viewmodels.ProductViewModel;
@@ -16,7 +17,12 @@ public abstract class ViewModelModule {
@Binds
@IntoMap
@ViewModelKey(ProductViewModel.class)
- abstract ViewModel bindUserViewModel(ProductViewModel viewModel);
+ abstract ViewModel bindProductViewModel(ProductViewModel viewModel);
+
+ @Binds
+ @IntoMap
+ @ViewModelKey(CategoryViewModel.class)
+ abstract ViewModel bindCategoryViewModel(CategoryViewModel viewModel);
@Binds
abstract ViewModelProvider.Factory bindViewModelFactory(ViewModelFactory factory);
diff --git a/app/src/main/java/me/gilo/wc/repo/CategoryRepository.java b/app/src/main/java/me/gilo/wc/repo/CategoryRepository.java
new file mode 100644
index 0000000..b598cce
--- /dev/null
+++ b/app/src/main/java/me/gilo/wc/repo/CategoryRepository.java
@@ -0,0 +1,73 @@
+package me.gilo.wc.repo;
+
+
+import me.gilo.wc.common.WooLiveData;
+import me.gilo.woodroid.Woocommerce;
+import me.gilo.woodroid.models.Category;
+import me.gilo.woodroid.models.filters.ProductCategoryFilter;
+
+import javax.inject.Inject;
+import java.util.List;
+
+public class CategoryRepository {
+
+ @Inject
+ Woocommerce woocommerce;
+
+ @Inject
+ public CategoryRepository() {
+ }
+
+
+ public WooLiveData create(Category category) {
+ final WooLiveData callBack = new WooLiveData();
+
+ woocommerce.CategoryRepository().create(category).enqueue(callBack);
+ return callBack;
+ }
+
+
+ public WooLiveData category(int id) {
+ final WooLiveData callBack = new WooLiveData();
+
+ woocommerce.CategoryRepository().category(id).enqueue(callBack);
+ return callBack;
+ }
+
+ public WooLiveData> categories() {
+ final WooLiveData> callBack = new WooLiveData();
+
+ woocommerce.CategoryRepository().categories().enqueue(callBack);
+ return callBack;
+ }
+
+ public WooLiveData> categories(ProductCategoryFilter productCategoryFilter) {
+ final WooLiveData> callBack = new WooLiveData();
+
+ woocommerce.CategoryRepository().categories(productCategoryFilter).enqueue(callBack);
+ return callBack;
+ }
+
+ public WooLiveData update(int id, Category category) {
+ final WooLiveData callBack = new WooLiveData();
+
+ woocommerce.CategoryRepository().update(id, category).enqueue(callBack);
+ return callBack;
+ }
+
+ public WooLiveData delete(int id) {
+ final WooLiveData callBack = new WooLiveData();
+
+ woocommerce.CategoryRepository().delete(id).enqueue(callBack);
+ return callBack;
+ }
+
+ public WooLiveData delete(int id, boolean force) {
+ final WooLiveData callBack = new WooLiveData();
+
+ woocommerce.CategoryRepository().delete(id, force).enqueue(callBack);
+ return callBack;
+ }
+
+
+}
diff --git a/app/src/main/java/me/gilo/wc/ui/home/CategoryFragment.kt b/app/src/main/java/me/gilo/wc/ui/home/CategoryFragment.kt
new file mode 100644
index 0000000..ed7f5af
--- /dev/null
+++ b/app/src/main/java/me/gilo/wc/ui/home/CategoryFragment.kt
@@ -0,0 +1,103 @@
+package me.gilo.wc.ui.home
+
+import android.os.Bundle
+import android.support.v4.app.Fragment
+import android.support.v7.widget.LinearLayoutManager
+import android.view.LayoutInflater
+import android.view.View
+import android.view.ViewGroup
+import kotlinx.android.synthetic.main.fragment_category.*
+import me.gilo.wc.R
+import me.gilo.wc.adapter.CategoryAdapter
+import me.gilo.wc.common.Status
+import me.gilo.wc.viewmodels.CategoryViewModel
+import me.gilo.woodroid.models.Category
+import java.util.*
+
+
+class CategoryFragment : Fragment() {
+
+
+ lateinit var viewModel: CategoryViewModel
+ val TAG = "CategoryFragment"
+
+ lateinit var adapter: CategoryAdapter
+ lateinit var categories: ArrayList
+
+ override fun onCreate(savedInstanceState: Bundle?) {
+ super.onCreate(savedInstanceState)
+ arguments?.let {
+
+ }
+ }
+
+ override fun onCreateView(
+ inflater: LayoutInflater,
+ container: ViewGroup?,
+ savedInstanceState: Bundle?
+ ): View {
+
+ return inflater.inflate(R.layout.fragment_category, container, false)
+ }
+
+ override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
+ super.onViewCreated(view, savedInstanceState)
+
+ viewModel = (activity as HomeActivity).getViewModel(CategoryViewModel::class.java)
+
+ val layoutManager = LinearLayoutManager(activity, LinearLayoutManager.VERTICAL, false)
+ rvCategory.layoutManager = layoutManager
+ rvCategory.isNestedScrollingEnabled = false
+
+ categories = ArrayList()
+
+ adapter = CategoryAdapter(categories)
+ rvCategory.adapter = adapter
+
+ categories()
+
+ }
+
+ private fun categories() {
+ viewModel.categories().observe(this, android.arch.lifecycle.Observer { response ->
+ when (response!!.status()) {
+ Status.LOADING -> {
+ }
+
+ Status.SUCCESS -> {
+ categories.clear()
+
+ val categoriesResponse = response.data()
+ for (category in categoriesResponse) {
+ categories.add(category)
+ }
+
+ adapter.notifyDataSetChanged()
+
+ }
+
+ Status.ERROR -> {
+
+
+ }
+
+ Status.EMPTY -> {
+
+ }
+ }
+
+ })
+
+ }
+
+ companion object {
+ @JvmStatic
+ fun newInstance() =
+ CategoryFragment().apply {
+ arguments = Bundle().apply {
+
+ }
+ }
+ }
+
+}
diff --git a/app/src/main/java/me/gilo/wc/ui/home/HomeActivity.kt b/app/src/main/java/me/gilo/wc/ui/home/HomeActivity.kt
new file mode 100644
index 0000000..f564cad
--- /dev/null
+++ b/app/src/main/java/me/gilo/wc/ui/home/HomeActivity.kt
@@ -0,0 +1,52 @@
+package me.gilo.wc.ui.home
+
+import android.content.Context
+import android.os.Bundle
+import android.support.design.widget.BottomNavigationView
+import android.support.v4.app.Fragment
+import io.github.inflationx.viewpump.ViewPumpContextWrapper
+import kotlinx.android.synthetic.main.activity_home.*
+import me.gilo.wc.R
+import me.gilo.wc.common.BaseActivity
+
+class HomeActivity : BaseActivity() {
+
+ override fun attachBaseContext(newBase: Context) {
+ super.attachBaseContext(ViewPumpContextWrapper.wrap(newBase))
+ }
+
+ private val mOnNavigationItemSelectedListener = BottomNavigationView.OnNavigationItemSelectedListener { item ->
+
+ var selectedFragment: Fragment? = HomeFragment.newInstance()
+
+ when (item.itemId) {
+ R.id.navigation_home -> {
+ selectedFragment = HomeFragment.newInstance()
+
+ }
+ R.id.navigation_deals -> {
+ selectedFragment = CategoryFragment.newInstance()
+ }
+ R.id.navigation_account -> {
+ selectedFragment = ProfileFragment.newInstance()
+ }
+ }
+
+ val transaction = supportFragmentManager.beginTransaction()
+ transaction.replace(R.id.container, selectedFragment!!)
+ transaction.commit()
+ true
+ }
+
+ override fun onCreate(savedInstanceState: Bundle?) {
+ super.onCreate(savedInstanceState)
+ setContentView(R.layout.activity_home)
+
+ navigation.setOnNavigationItemSelectedListener(mOnNavigationItemSelectedListener)
+
+ val transaction = supportFragmentManager.beginTransaction()
+ transaction.replace(R.id.container, HomeFragment.newInstance())
+ transaction.commit()
+
+ }
+}
diff --git a/app/src/main/java/me/gilo/wc/ui/home/HomeFragment.kt b/app/src/main/java/me/gilo/wc/ui/home/HomeFragment.kt
new file mode 100644
index 0000000..6bdbd6b
--- /dev/null
+++ b/app/src/main/java/me/gilo/wc/ui/home/HomeFragment.kt
@@ -0,0 +1,48 @@
+package me.gilo.wc.ui.home
+
+import android.os.Bundle
+import android.support.v4.app.Fragment
+import android.view.LayoutInflater
+import android.view.View
+import android.view.ViewGroup
+import me.gilo.wc.R
+import me.gilo.wc.viewmodels.ProductViewModel
+
+
+class HomeFragment : Fragment() {
+
+
+ lateinit var viewModel: ProductViewModel
+ val TAG = "HomeFragment"
+
+ override fun onCreate(savedInstanceState: Bundle?) {
+ super.onCreate(savedInstanceState)
+ arguments?.let {
+
+ }
+ }
+
+ override fun onCreateView(inflater: LayoutInflater,
+ container: ViewGroup?,
+ savedInstanceState: Bundle?): View {
+
+ return inflater.inflate(R.layout.fragment_home, container, false)
+ }
+
+ override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
+ super.onViewCreated(view, savedInstanceState)
+
+
+ }
+
+ companion object {
+ @JvmStatic
+ fun newInstance() =
+ HomeFragment().apply {
+ arguments = Bundle().apply {
+
+ }
+ }
+ }
+
+}
diff --git a/app/src/main/java/me/gilo/wc/ui/home/ProfileFragment.kt b/app/src/main/java/me/gilo/wc/ui/home/ProfileFragment.kt
new file mode 100644
index 0000000..44c944b
--- /dev/null
+++ b/app/src/main/java/me/gilo/wc/ui/home/ProfileFragment.kt
@@ -0,0 +1,49 @@
+package me.gilo.wc.ui.home
+
+import android.os.Bundle
+import android.support.v4.app.Fragment
+import android.view.LayoutInflater
+import android.view.View
+import android.view.ViewGroup
+import me.gilo.wc.R
+import me.gilo.wc.viewmodels.ProductViewModel
+
+
+class ProfileFragment : Fragment() {
+
+
+ lateinit var viewModel: ProductViewModel
+ val TAG = "ProfileFragment"
+
+ override fun onCreate(savedInstanceState: Bundle?) {
+ super.onCreate(savedInstanceState)
+ arguments?.let {
+
+ }
+ }
+
+ override fun onCreateView(inflater: LayoutInflater,
+ container: ViewGroup?,
+ savedInstanceState: Bundle?): View {
+
+ return inflater.inflate(R.layout.fragment_profile, container, false)
+ }
+
+ override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
+ super.onViewCreated(view, savedInstanceState)
+
+
+
+ }
+
+ companion object {
+ @JvmStatic
+ fun newInstance() =
+ ProfileFragment().apply {
+ arguments = Bundle().apply {
+
+ }
+ }
+ }
+
+}
diff --git a/app/src/main/java/me/gilo/wc/viewmodels/CategoryViewModel.java b/app/src/main/java/me/gilo/wc/viewmodels/CategoryViewModel.java
new file mode 100644
index 0000000..ce14a5a
--- /dev/null
+++ b/app/src/main/java/me/gilo/wc/viewmodels/CategoryViewModel.java
@@ -0,0 +1,51 @@
+package me.gilo.wc.viewmodels;
+
+import android.arch.lifecycle.ViewModel;
+import me.gilo.wc.common.WooLiveData;
+import me.gilo.wc.repo.CategoryRepository;
+import me.gilo.woodroid.models.Category;
+import me.gilo.woodroid.models.filters.ProductCategoryFilter;
+
+import javax.inject.Inject;
+import java.util.List;
+
+
+public final class CategoryViewModel extends ViewModel {
+ private final CategoryRepository categoryRepository;
+
+ @Inject
+ CategoryViewModel(CategoryRepository categoryRepository) {
+ this.categoryRepository = categoryRepository;
+
+ }
+
+ public WooLiveData create(Category category) {
+ return categoryRepository.create(category);
+ }
+
+
+ public WooLiveData category(int id) {
+ return categoryRepository.category(id);
+ }
+
+ public WooLiveData> categories() {
+ return categoryRepository.categories();
+ }
+
+ public WooLiveData> categories(ProductCategoryFilter productCategoryFilter) {
+ return categoryRepository.categories();
+ }
+
+ public WooLiveData update(int id, Category category) {
+ return categoryRepository.update(id, category);
+ }
+
+ public WooLiveData delete(int id) {
+ return categoryRepository.delete(id);
+ }
+
+ public WooLiveData delete(int id, boolean force) {
+ return categoryRepository.delete(id, force);
+ }
+
+}
\ No newline at end of file
diff --git a/app/src/main/res/drawable-v24/ic_home.png b/app/src/main/res/drawable-v24/ic_home.png
new file mode 100644
index 0000000..dd46997
Binary files /dev/null and b/app/src/main/res/drawable-v24/ic_home.png differ
diff --git a/app/src/main/res/drawable-v24/ic_local_activity.png b/app/src/main/res/drawable-v24/ic_local_activity.png
new file mode 100644
index 0000000..986928b
Binary files /dev/null and b/app/src/main/res/drawable-v24/ic_local_activity.png differ
diff --git a/app/src/main/res/drawable-v24/ic_profile.xml b/app/src/main/res/drawable-v24/ic_profile.xml
new file mode 100644
index 0000000..650ddab
--- /dev/null
+++ b/app/src/main/res/drawable-v24/ic_profile.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/ic_home.png b/app/src/main/res/drawable/ic_home.png
new file mode 100644
index 0000000..dd46997
Binary files /dev/null and b/app/src/main/res/drawable/ic_home.png differ
diff --git a/app/src/main/res/drawable/ic_local_activity.png b/app/src/main/res/drawable/ic_local_activity.png
new file mode 100644
index 0000000..986928b
Binary files /dev/null and b/app/src/main/res/drawable/ic_local_activity.png differ
diff --git a/app/src/main/res/drawable/ic_profile.xml b/app/src/main/res/drawable/ic_profile.xml
new file mode 100644
index 0000000..650ddab
--- /dev/null
+++ b/app/src/main/res/drawable/ic_profile.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/activity_home.xml b/app/src/main/res/layout/activity_home.xml
new file mode 100644
index 0000000..3cf9b8f
--- /dev/null
+++ b/app/src/main/res/layout/activity_home.xml
@@ -0,0 +1,47 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/content_home.xml b/app/src/main/res/layout/content_home.xml
new file mode 100644
index 0000000..aba39d9
--- /dev/null
+++ b/app/src/main/res/layout/content_home.xml
@@ -0,0 +1,12 @@
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/fragment_category.xml b/app/src/main/res/layout/fragment_category.xml
new file mode 100644
index 0000000..103fd00
--- /dev/null
+++ b/app/src/main/res/layout/fragment_category.xml
@@ -0,0 +1,18 @@
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/fragment_home.xml b/app/src/main/res/layout/fragment_home.xml
new file mode 100644
index 0000000..4e6d0be
--- /dev/null
+++ b/app/src/main/res/layout/fragment_home.xml
@@ -0,0 +1,71 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/fragment_profile.xml b/app/src/main/res/layout/fragment_profile.xml
new file mode 100644
index 0000000..3fdc560
--- /dev/null
+++ b/app/src/main/res/layout/fragment_profile.xml
@@ -0,0 +1,12 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/single_category_item.xml b/app/src/main/res/layout/single_category_item.xml
new file mode 100644
index 0000000..6046a4b
--- /dev/null
+++ b/app/src/main/res/layout/single_category_item.xml
@@ -0,0 +1,45 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/menu/navigation.xml b/app/src/main/res/menu/navigation.xml
new file mode 100644
index 0000000..ec964c1
--- /dev/null
+++ b/app/src/main/res/menu/navigation.xml
@@ -0,0 +1,19 @@
+
+
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index 05d3309..2c62360 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -23,10 +23,13 @@
Settings
- - Popularity
- - Date added
- - Price lowest first
- - Price highest first
+ - Popularity
+ - Date added
+ - Price lowest first
+ - Price highest first
+ CategoryActivity
+ HomeActivity
+ Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry\'s standard dummy text ever since the 1500s
diff --git a/woodroid/src/main/java/me/gilo/woodroid/data/cookie/DemoCookieInterceptor.java b/woodroid/src/main/java/me/gilo/woodroid/data/cookie/DemoCookieInterceptor.java
new file mode 100644
index 0000000..98a1f6c
--- /dev/null
+++ b/woodroid/src/main/java/me/gilo/woodroid/data/cookie/DemoCookieInterceptor.java
@@ -0,0 +1,24 @@
+package me.gilo.woodroid.data.cookie;
+
+import okhttp3.Interceptor;
+import okhttp3.Request;
+import okhttp3.Response;
+
+import java.io.IOException;
+
+public class DemoCookieInterceptor implements Interceptor {
+
+
+ @Override
+ public Response intercept(Interceptor.Chain chain) throws IOException {
+ Request.Builder builder = chain.request().newBuilder();
+
+ builder.addHeader("Cookie", "wordpress_logged_in_9073cf57240df660c1e240d327cc46cb=gilo%7C1551794958%7CJx1NTnn0f6wuYlN5a0PmTJxYcPlr1sUUqpr659EKCcG%7C802c643a30a82bf7aa6350b5fb5dd005c019b2e1b1d59566ef0c426e33126eae");
+ builder.addHeader("Cookie", "woocommerce_cart_hash=d9ec6c9bf0d307629c2a981362735284");
+ builder.addHeader("Cookie", "wp_woocommerce_session_9073cf57240df660c1e240d327cc46cb=1%7C%7C1551796439%7C%7C1551792839%7C%7Ce6deec897575a9a84bb4a672abf2ed72");
+
+
+
+ return chain.proceed(builder.build());
+ }
+}
\ No newline at end of file
diff --git a/woodroid/src/main/java/me/gilo/woodroid/repo/CartRepository.java b/woodroid/src/main/java/me/gilo/woodroid/repo/CartRepository.java
index 008fb16..7c3ef39 100644
--- a/woodroid/src/main/java/me/gilo/woodroid/repo/CartRepository.java
+++ b/woodroid/src/main/java/me/gilo/woodroid/repo/CartRepository.java
@@ -2,8 +2,7 @@ package me.gilo.woodroid.repo;
import android.content.Context;
import me.gilo.woodroid.data.api.CartAPI;
-import me.gilo.woodroid.data.cookie.AddCookiesInterceptor;
-import me.gilo.woodroid.data.cookie.ReceivedCookiesInterceptor;
+import me.gilo.woodroid.data.cookie.DemoCookieInterceptor;
import me.gilo.woodroid.models.LineItem;
import me.gilo.woodroid.models.filters.CartFilter;
import okhttp3.OkHttpClient;
@@ -50,8 +49,9 @@ public class CartRepository{
loggingInterceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
OkHttpClient client = new OkHttpClient.Builder()
- .addInterceptor(new AddCookiesInterceptor(context))
- .addInterceptor(new ReceivedCookiesInterceptor(context))
+// .addInterceptor(new AddCookiesInterceptor(context))
+// .addInterceptor(new ReceivedCookiesInterceptor(context))
+ .addInterceptor(new DemoCookieInterceptor())
.addInterceptor(loggingInterceptor)
.readTimeout(30, TimeUnit.SECONDS)
.writeTimeout(30, TimeUnit.SECONDS)