Skip to content

Commit

Permalink
Add basic repository for storefront
Browse files Browse the repository at this point in the history
  • Loading branch information
andraantariksa committed Apr 9, 2022
1 parent 5e2f6be commit 8faabf3
Show file tree
Hide file tree
Showing 11 changed files with 127 additions and 3 deletions.
2 changes: 1 addition & 1 deletion .idea/misc.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Original file line number Diff line number Diff line change
Expand Up @@ -5,16 +5,18 @@ import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.fragment.app.Fragment
import dagger.hilt.EntryPoint
import androidx.fragment.app.viewModels
import dagger.hilt.android.AndroidEntryPoint
import id.shaderboi.koffie.databinding.FragmentHomeBinding
import id.shaderboi.koffie.databinding.FragmentMiscBinding
import id.shaderboi.koffie.ui.main.home.view_model.StoreFrontViewModel

@AndroidEntryPoint
class HomeFragment: Fragment() {
private var _binding: FragmentHomeBinding? = null
val binding get() = _binding!!

private val homeViewModel by viewModels<StoreFrontViewModel>()

override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
package id.shaderboi.koffie.ui.main.home.view_model

sealed class StoreFrontEvent {
object Load: StoreFrontEvent()
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
package id.shaderboi.koffie.ui.main.home.view_model

import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
import dagger.hilt.android.lifecycle.HiltViewModel
import id.shaderboi.koffie.core.domain.model.StoreFront
import id.shaderboi.koffie.core.domain.repository.VendorRepository
import id.shaderboi.koffie.core.util.Resource
import kotlinx.coroutines.flow.MutableSharedFlow
import kotlinx.coroutines.flow.asSharedFlow
import kotlinx.coroutines.flow.collectLatest
import kotlinx.coroutines.launch
import javax.inject.Inject

@HiltViewModel
class StoreFrontViewModel @Inject constructor(
private val vendorRepository: VendorRepository
) : ViewModel() {
private val _storeFront = MutableSharedFlow<Resource<StoreFront>>()
val storeFront = _storeFront.asSharedFlow()

init {
onEvent(StoreFrontEvent.Load)
}

fun onEvent(event: StoreFrontEvent) {
when (event) {
StoreFrontEvent.Load -> loadStoreFront()
}
}

private fun loadStoreFront() = viewModelScope.launch {
_storeFront.emit(Resource.Loading())
vendorRepository.loadStoreFront().collectLatest { resource ->
_storeFront.emit(resource)
}
}
}
Original file line number Diff line number Diff line change
@@ -1,4 +1,10 @@
package id.shaderboi.koffie.core.data.data_source.network

import id.shaderboi.koffie.core.domain.model.StoreFront
import kotlinx.coroutines.flow.Flow
import retrofit2.http.GET

interface KoffieAPIService {
@GET("/api/v1/blabla")
fun getStoreFront(): Flow<StoreFront>
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
package id.shaderboi.koffie.core.data.repository

import id.shaderboi.koffie.core.data.data_source.network.KoffieAPIService
import id.shaderboi.koffie.core.domain.model.StoreFront
import id.shaderboi.koffie.core.domain.repository.VendorRepository
import id.shaderboi.koffie.core.util.Resource
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.catch
import kotlinx.coroutines.flow.map

class VendorRepositoryImpl(
private val koffieAPIService: KoffieAPIService
) : VendorRepository {
override suspend fun loadStoreFront(): Flow<Resource<StoreFront>> =
koffieAPIService.getStoreFront()
.map { value -> Resource.Loaded(value) }
.catch { cause -> Resource.Error<StoreFront>(cause) }
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package id.shaderboi.koffie.core.domain.model

import com.squareup.moshi.Json
import com.squareup.moshi.JsonClass

@JsonClass(generateAdapter = true)
data class CategoryProducts(
@Json(name = "category_name")
val categoryName: String,
@Json(name = "category_id")
val categoryId: Int,
val products: List<Product>
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
package id.shaderboi.koffie.core.domain.model

import com.squareup.moshi.Json
import com.squareup.moshi.JsonClass

@JsonClass(generateAdapter = true)
data class Product(
val itemId: Int,
val name: String,
val description: String,
val price: Int,
@Json(name = "image_url")
val imageUrl: String,
@Json(name = "undiscounted_price")
val undiscountedPrice: Int?,
@Json(name = "created_at")
val createdAt: String
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package id.shaderboi.koffie.core.domain.model

import com.squareup.moshi.JsonClass

@JsonClass(generateAdapter = true)
data class StoreFront(
val categories: List<CategoryProducts>
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package id.shaderboi.koffie.core.domain.repository

import id.shaderboi.koffie.core.domain.model.StoreFront
import id.shaderboi.koffie.core.util.Resource
import kotlinx.coroutines.flow.Flow

interface VendorRepository {
suspend fun loadStoreFront(): Flow<Resource<StoreFront>>
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package id.shaderboi.koffie.core.util

sealed class Resource<T> {
class Loading<T> : Resource<T>()
data class Loaded<T>(val data: T) : Resource<T>()
data class Error<T>(val error: Throwable) : Resource<T>()
}

0 comments on commit 8faabf3

Please sign in to comment.