Skip to content

Commit

Permalink
Optimizations and Minnor fix: Koin Impl
Browse files Browse the repository at this point in the history
  • Loading branch information
Debanshu Datta committed Jul 2, 2022
1 parent 940c696 commit a19c1be
Show file tree
Hide file tree
Showing 23 changed files with 49,957 additions and 72 deletions.
2 changes: 1 addition & 1 deletion .idea/deploymentTargetDropDown.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 @@ -8,11 +8,11 @@ import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.ViewModel
import androidx.lifecycle.asLiveData
import androidx.lifecycle.viewModelScope
import com.debanshu777.compose_github.ui.base.state.SearchState
import com.debanshu777.compose_github.ui.base.state.SearchWidgetState
import com.debanshu777.compose_github.ui.feature_profile.state.PinnedProjectState
import com.debanshu777.compose_github.ui.feature_profile.state.ProfileState
import com.debanshu777.compose_github.ui.feature_profile.state.ProfileStatsState
import com.debanshu777.compose_github.ui.feature_search.state.SearchState
import com.debanshu777.compose_github.ui.feature_search.state.SearchWidgetState
import com.debanshu777.compose_github.ui.feature_trending.state.DeveloperTrendingState
import com.debanshu777.compose_github.ui.feature_trending.state.RepositoryTrendingState
import com.debanshu777.compose_github.utils.DurationType
Expand Down Expand Up @@ -84,27 +84,30 @@ class GitHubViewModel constructor(private val mainRepository: MainRepository) :
_userDataState.value = ProfileState(data = result.data)
}
is Resource.Error -> {
_userDataState.value = ProfileState(error = result.message)
_userDataState.value = ProfileState(isLoading = false, error = result.message)
}
}
}

fun searchUser(searchText: String) = viewModelScope.launch {
when (val result = mainRepository.searchUser(searchText)) {
is Resource.Loading -> {
searchState.value = SearchState(isLoading = true)
searchState.value = SearchState(isLoading = true, data = emptyList())
}
is Resource.Success -> {
searchState.value =
SearchState(data = if (result.data == null) emptyList() else result.data.items)
SearchState(
isLoading = false,
data = if (result.data == null) emptyList() else result.data.items
)
}
is Resource.Error -> {
searchState.value = SearchState(error = result.message)
searchState.value = SearchState(isLoading = false, error = result.message)
}
}
}

fun getUserStats(username: String) = viewModelScope.launch {
private fun getUserStats(username: String) = viewModelScope.launch {
when (val result = mainRepository.getUserStats(username)) {
is Resource.Loading -> {
_userStatsState.value = ProfileStatsState(isLoading = true)
Expand All @@ -113,55 +116,66 @@ class GitHubViewModel constructor(private val mainRepository: MainRepository) :
_userStatsState.value = ProfileStatsState(data = result.data)
}
is Resource.Error -> {
_userStatsState.value = ProfileStatsState(error = result.message)
_userStatsState.value = ProfileStatsState(isLoading = false, error = result.message)
}
}
}

fun getPinnedProject(username: String) = viewModelScope.launch {
private fun getPinnedProject(username: String) = viewModelScope.launch {
when (val result = mainRepository.getUserPinnedProject(username)) {
is Resource.Loading -> {
_userPinnedImage.value = PinnedProjectState(isLoading = true)
_userPinnedImage.value = PinnedProjectState(isLoading = true, data = emptyList())
}
is Resource.Success -> {
_userPinnedImage.value = PinnedProjectState(data = result.data)
_userPinnedImage.value = PinnedProjectState(isLoading = false, data = result.data)
}
is Resource.Error -> {
_userPinnedImage.value = PinnedProjectState(error = result.message)
_userPinnedImage.value =
PinnedProjectState(isLoading = false, error = result.message)
}
}
}

fun getTrendingRepository(timeline: String) = viewModelScope.launch {
private fun getTrendingRepository(timeline: String) = viewModelScope.launch {
when (val result = mainRepository.getTrendingRepository(timeline)) {
is Resource.Loading -> {
trendingRepositoryDataState.value = RepositoryTrendingState(isLoading = true)
trendingRepositoryDataState.value =
RepositoryTrendingState(isLoading = true, data = emptyList())
}
is Resource.Success -> {
trendingRepositoryDataState.value = RepositoryTrendingState(
isLoading = false,
data = result.data
?: emptyList()
)
}
is Resource.Error -> {
trendingRepositoryDataState.value = RepositoryTrendingState(error = result.message)
trendingRepositoryDataState.value =
RepositoryTrendingState(
isLoading = false,
data = emptyList(),
error = result.message
)
}
}
}

fun getTrendingDeveloper(timeline: String) = viewModelScope.launch {
private fun getTrendingDeveloper(timeline: String) = viewModelScope.launch {
when (val result = mainRepository.getTrendingDeveloper(timeline)) {
is Resource.Loading -> {
trendingDeveloperDataState.value = DeveloperTrendingState(isLoading = true)
trendingDeveloperDataState.value =
DeveloperTrendingState(isLoading = true, data = emptyList())
}
is Resource.Success -> {
trendingDeveloperDataState.value = DeveloperTrendingState(
isLoading = false,
data = result.data
?: emptyList()
)
}
is Resource.Error -> {
trendingDeveloperDataState.value = DeveloperTrendingState(error = result.message)
trendingDeveloperDataState.value =
DeveloperTrendingState(isLoading = false, error = result.message)
}
}
}
Expand Down Expand Up @@ -193,11 +207,11 @@ class GitHubViewModel constructor(private val mainRepository: MainRepository) :
)
}

fun deleteRepositoryById(id: Long)=viewModelScope.launch{
fun deleteRepositoryById(id: Long) = viewModelScope.launch {
mainRepository.deleteRepositoryById(id)
}

fun deleteDeveloperById(id:Long)=viewModelScope.launch {
fun deleteDeveloperById(id: Long) = viewModelScope.launch {
mainRepository.deleteDeveloperById(id)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,14 +3,19 @@ package com.debanshu777.compose_github.ui.base
import android.annotation.SuppressLint
import androidx.compose.material3.ExperimentalMaterial3Api
import androidx.compose.material3.Scaffold
import androidx.compose.material3.SnackbarHost
import androidx.compose.material3.SnackbarHostState
import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue
import androidx.compose.runtime.remember
import androidx.compose.runtime.rememberCoroutineScope
import androidx.navigation.compose.rememberNavController
import com.debanshu777.compose_github.network.dataSource.GitHubViewModel
import com.debanshu777.compose_github.ui.base.components.BottomBar
import com.debanshu777.compose_github.ui.base.components.MainAppBar
import com.debanshu777.compose_github.ui.feature_search.state.SearchState
import com.debanshu777.compose_github.ui.feature_search.state.SearchWidgetState
import com.debanshu777.compose_github.ui.base.state.SearchState
import com.debanshu777.compose_github.ui.base.state.SearchWidgetState
import kotlinx.coroutines.launch

@SuppressLint("UnusedMaterial3ScaffoldPaddingParameter")
@OptIn(ExperimentalMaterial3Api::class)
Expand All @@ -19,6 +24,15 @@ fun MainScreen(viewModel: GitHubViewModel) {
val navController = rememberNavController()
val searchWidgetState by viewModel.searchWidgetState
val searchTextState by viewModel.searchTextState
val coroutineScope = rememberCoroutineScope()
val snackbarHostState = remember { SnackbarHostState() }
val onShowSnackbar: (String) -> Unit = { task ->
coroutineScope.launch {
snackbarHostState.showSnackbar(
message = task
)
}
}
Scaffold(
topBar = {
MainAppBar(
Expand Down Expand Up @@ -46,7 +60,8 @@ fun MainScreen(viewModel: GitHubViewModel) {
)
},
bottomBar = { BottomBar(navController = navController) },
snackbarHost = { SnackbarHost(snackbarHostState) },
) {
Navigation(viewModel, navController)
Navigation(viewModel, navController, onShowSnackbar)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,11 @@ import com.debanshu777.compose_github.ui.feature_search.SearchScreen
import com.debanshu777.compose_github.ui.feature_trending.TrendingScreen

@Composable
fun Navigation(viewModel: GitHubViewModel, navController: NavHostController) {
fun Navigation(
viewModel: GitHubViewModel,
navController: NavHostController,
onShowSnackbar: (String) -> Unit
) {
NavHost(navController = navController, startDestination = Screen.TrendingScreen.route) {
composable(route = Screen.SearchScreen.route) {
SearchScreen(viewModel, navController)
Expand All @@ -20,10 +24,10 @@ fun Navigation(viewModel: GitHubViewModel, navController: NavHostController) {
ProfileScreen(viewModel)
}
composable(route = Screen.TrendingScreen.route) {
TrendingScreen(viewModel,navController)
TrendingScreen(viewModel, navController, onShowSnackbar)
}
composable(route = Screen.FollowScreen.route) {
FollowScreen(navController)
FollowScreen(navController, onShowSnackbar)
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ import androidx.compose.material3.IconButton
import androidx.compose.material3.SmallTopAppBar
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import com.debanshu777.compose_github.ui.feature_search.state.SearchWidgetState
import com.debanshu777.compose_github.ui.base.state.SearchWidgetState

@Composable
fun MainAppBar(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,11 +17,20 @@ fun TabHandler(
actionList: List<(String) -> Job>,
cardAction: List<(Long) -> Job>,
dataList: List<List<Any>>,
navController: NavController
navController: NavController,
onShowSnackbar: (String) -> Unit
) {
Column {
Tabs(pagerState = pagerState, tabNames)
TabsContent(pagerState = pagerState, pageCount, actionList, cardAction ,dataList, navController)
TabsContent(
pagerState = pagerState,
pageCount,
actionList,
cardAction,
dataList,
navController,
onShowSnackbar
)
}
}

Expand All @@ -33,12 +42,13 @@ fun TabsContent(
actionList: List<(String) -> Job>,
cardAction: List<(Long) -> Job>,
dataList: List<List<Any>>,
navController: NavController
navController: NavController,
onShowSnackbar: (String) -> Unit
) {
HorizontalPager(state = pagerState, count = pageCount, userScrollEnabled = false) { page ->
when (page) {
0 -> TabLayout(dataList[0], actionList, cardAction, navController)
1 -> TabLayout(dataList[1], actionList, cardAction, navController)
0 -> TabLayout(dataList[0], actionList, cardAction, navController, onShowSnackbar)
1 -> TabLayout(dataList[1], actionList, cardAction, navController, onShowSnackbar)
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -35,11 +35,12 @@ import kotlinx.coroutines.Job

@OptIn(ExperimentalUnitApi::class)
@Composable
fun <T> TabLayout(
data: List<T>,
fun TabLayout(
data: List<Any>,
actionList: List<(String) -> Job>,
cardAction: List<(Long) -> Job>,
navController: NavController
navController: NavController,
onShowSnackbar: (String) -> Unit
) {
Column(
modifier = Modifier.fillMaxSize(),
Expand Down Expand Up @@ -69,16 +70,22 @@ fun <T> TabLayout(
) {
items(data) { item ->
if (item is TrendingRepositoryItem) {
RepositoryCard(item)
RepositoryCard(item, onShowSnackbar)
}
if (item is DeveloperFollow) {
FollowDeveloperCard(item, navController, actionList[1], cardAction[1])
FollowDeveloperCard(
item,
navController,
actionList[1],
cardAction[1],
onShowSnackbar
)
}
if (item is RepositoryFollow) {
FollowRepositoryCard(item, cardAction[0])
FollowRepositoryCard(item, cardAction[0], onShowSnackbar)
}
if (item is TrendingDeveloperItem) {
DeveloperCard(item, navController, actionList[1])
DeveloperCard(item, navController, actionList[1], onShowSnackbar)
}
Spacer(modifier = Modifier.height(5.dp))
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
package com.debanshu777.compose_github.ui.feature_search.state
package com.debanshu777.compose_github.ui.base.state

import com.debanshu777.compose_github.network.model.GitHubSearchUserList

data class SearchState(
val isLoading: Boolean = false,
val data: List<GitHubSearchUserList> = emptyList(),
val error: String? = ""
val error: String? = null
)
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.debanshu777.compose_github.ui.feature_search.state
package com.debanshu777.compose_github.ui.base.state

enum class SearchWidgetState {
OPENED,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,11 @@ import org.koin.androidx.compose.getViewModel

@OptIn(ExperimentalPagerApi::class)
@Composable
fun FollowScreen(navController: NavController, viewModel: GitHubViewModel = getViewModel()) {
fun FollowScreen(
navController: NavController,
onShowSnackbar: (String) -> Unit,
viewModel: GitHubViewModel = getViewModel()
) {
val developerFollowList by viewModel.developerList.collectAsState(emptyList())
val repositoryFollowList by viewModel.repositoryList.collectAsState(emptyList())
val pagerState = rememberPagerState(0)
Expand All @@ -25,8 +29,18 @@ fun FollowScreen(navController: NavController, viewModel: GitHubViewModel = getV
val dataList = listOf(repositoryFollowList, developerFollowList)
val actionList =
listOf({ s: String -> viewModel.getUserData(s) }, { s: String -> viewModel.getUserData(s) })
val cardAction = listOf({i:Long -> viewModel.deleteRepositoryById(i)},{i:Long -> viewModel.deleteDeveloperById(i)})
val cardAction = listOf({ i: Long -> viewModel.deleteRepositoryById(i) },
{ i: Long -> viewModel.deleteDeveloperById(i) })
Column(modifier = Modifier.padding(top = 56.dp)) {
TabHandler(pagerState, pageCount, tabList, actionList, cardAction,dataList, navController)
TabHandler(
pagerState,
pageCount,
tabList,
actionList,
cardAction,
dataList,
navController,
onShowSnackbar
)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -37,10 +37,14 @@ fun FollowDeveloperCard(
item: DeveloperFollow,
navController: NavController,
action: (String) -> Job,
cardAction: (Long) -> Job
cardAction: (Long) -> Job,
onShowSnackbar: (String) -> Unit
) {
val deleteItem = SwipeAction(
onSwipe = { cardAction(item.id) },
onSwipe = {
cardAction(item.id)
onShowSnackbar("Removing ${item.username} from following")
},
icon = {
Icon(
modifier = Modifier.padding(16.dp),
Expand All @@ -54,7 +58,8 @@ fun FollowDeveloperCard(
SwipeableActionsBox(
modifier = Modifier.padding(vertical = 2.5.dp),
swipeThreshold = 150.dp,
endActions = listOf(deleteItem)
endActions = listOf(deleteItem),
backgroundUntilSwipeThreshold = MaterialTheme.colorScheme.surfaceVariant
) {
ElevatedCard(
modifier = Modifier
Expand Down
Loading

0 comments on commit a19c1be

Please sign in to comment.