Skip to content

Commit

Permalink
fix loading issue
Browse files Browse the repository at this point in the history
bump dependencies
  • Loading branch information
kid1412621 committed May 2, 2024
1 parent a08c796 commit dd2afd6
Show file tree
Hide file tree
Showing 6 changed files with 54 additions and 95 deletions.
12 changes: 11 additions & 1 deletion CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,12 +5,22 @@ All notable changes to this project will be documented in this file.
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).

## 0.2.0 - 2024-05-02

### Fixes

- Fixed [loading issue](https://github.com/kid1412621/subspace/issues/6)

### Updates

- Bump compose lib version to 2024.05.00

## 0.1.3 - 2024-04-30

### Fixes

- Fixed drawerSheet round corner issue
- Fixed edgeToEdge when no bottomBar;
- Fixed edgeToEdge when no bottomBar

## 0.1.2 - 2024-04-25

Expand Down
19 changes: 10 additions & 9 deletions app/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ android {
minSdk = 29
targetSdk = 34
versionCode = 8
versionName = "0.1.3"
versionName = "0.2.0"

testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
vectorDrawables {
Expand All @@ -34,6 +34,7 @@ android {
buildTypes {
debug {
isDebuggable = true
applicationIdSuffix = ".debug"
}
release {
isDebuggable = false
Expand Down Expand Up @@ -74,15 +75,15 @@ android {
}
composeOptions {
// https://developer.android.com/jetpack/androidx/releases/compose-kotlin#pre-release_kotlin_compatibility
kotlinCompilerExtensionVersion = "1.5.10"
kotlinCompilerExtensionVersion = "1.5.13"
}
}

dependencies {
implementation("androidx.core:core-ktx:1.13.0")
implementation("androidx.core:core-ktx:1.13.1")

// https://developer.android.com/jetpack/compose/bom/bom-mapping
val composeBom = platform("androidx.compose:compose-bom:2024.04.01")
val composeBom = platform("androidx.compose:compose-bom:2024.05.00")
implementation(composeBom)
implementation("androidx.activity:activity-ktx:1.9.0")
implementation("androidx.activity:activity-compose")
Expand All @@ -94,8 +95,8 @@ dependencies {
debugImplementation("androidx.compose.ui:ui-tooling")

// paging
implementation("androidx.paging:paging-compose:3.3.0-beta01")
implementation("androidx.paging:paging-runtime-ktx:3.3.0-beta01")
implementation("androidx.paging:paging-compose:3.3.0-rc01")
implementation("androidx.paging:paging-runtime-ktx:3.3.0-rc01")

// nav
implementation("androidx.navigation:navigation-compose")
Expand All @@ -105,17 +106,17 @@ dependencies {
// implementation("androidx.compose.material3:material3")
// wait for https://developer.android.com/reference/kotlin/androidx/compose/material3/package-summary#DismissibleDrawerSheet(androidx.compose.material3.DrawerState,androidx.compose.ui.Modifier,androidx.compose.ui.graphics.Shape,androidx.compose.ui.graphics.Color,androidx.compose.ui.graphics.Color,androidx.compose.ui.unit.Dp,androidx.compose.foundation.layout.WindowInsets,kotlin.Function1)
// see: https://developer.android.com/jetpack/androidx/releases/compose-material3#1.3.0-alpha04
implementation("androidx.compose.material3:material3:1.3.0-alpha05")
implementation("androidx.compose.material3:material3:1.3.0-alpha06")
// wait for MD3 implementation
implementation("androidx.compose.material:material-icons-extended")
implementation("androidx.compose.animation:animation:1.6.6")
implementation("androidx.compose.animation:animation:1.6.7")
implementation("androidx.compose.animation:animation-graphics")
// not ready yet
// implementation("androidx.compose.material3:material3-adaptive:1.0.0-alpha08")
// implementation("androidx.compose.material3:material3-adaptive-navigation-suite:1.0.0-alpha05")

// datastore
implementation("androidx.datastore:datastore-preferences:1.1.0")
implementation("androidx.datastore:datastore-preferences:1.1.1")

// hilt
implementation("com.google.dagger:hilt-android:2.51.1")
Expand Down
93 changes: 18 additions & 75 deletions app/src/main/kotlin/me/nanova/subspace/ui/component/TorrentList.kt
Original file line number Diff line number Diff line change
Expand Up @@ -2,59 +2,50 @@ package me.nanova.subspace.ui.component

import androidx.compose.foundation.ExperimentalFoundationApi
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.lazy.LazyColumn
import androidx.compose.foundation.lazy.items
import androidx.compose.foundation.lazy.rememberLazyListState
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.Downloading
import androidx.compose.material3.Button
import androidx.compose.material.icons.filled.Refresh
import androidx.compose.material3.ExperimentalMaterial3Api
import androidx.compose.material3.HorizontalDivider
import androidx.compose.material3.Icon
import androidx.compose.material3.IconButton
import androidx.compose.material3.LinearProgressIndicator
import androidx.compose.material3.ListItem
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Text
import androidx.compose.material3.pulltorefresh.PullToRefreshContainer
import androidx.compose.material3.pulltorefresh.rememberPullToRefreshState
import androidx.compose.material3.pulltorefresh.PullToRefreshBox
import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.collectAsState
import androidx.compose.runtime.getValue
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.input.nestedscroll.nestedScroll
import androidx.compose.ui.text.style.TextOverflow
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
import me.nanova.subspace.domain.model.Torrent
import me.nanova.subspace.ui.vm.CallState
import me.nanova.subspace.ui.vm.HomeUiState
import me.nanova.subspace.ui.vm.HomeViewModel

@Composable
@OptIn(ExperimentalMaterial3Api::class, ExperimentalFoundationApi::class)
fun TorrentList(
uiState: HomeUiState,
onRefresh: () -> Unit = {}
viewModel: HomeViewModel,
) {
val refreshState = rememberPullToRefreshState()
val lazyListState = rememberLazyListState()
val uiState by viewModel.homeUiState.collectAsState()

if (refreshState.isRefreshing) {
LaunchedEffect(true) {
onRefresh()
refreshState.endRefresh()
}
}

Box(
Modifier.nestedScroll(refreshState.nestedScrollConnection)
PullToRefreshBox(
isRefreshing = viewModel.isRefreshing,
onRefresh = { viewModel.refresh() },
) {
LazyColumn(
state = lazyListState,
verticalArrangement = Arrangement.spacedBy(4.dp),
) {
if (!refreshState.isRefreshing && uiState.state == CallState.Success) {
if (!viewModel.isRefreshing && uiState.state == CallState.Success) {
items(
uiState.data,
key = { it.hash }
Expand Down Expand Up @@ -94,65 +85,17 @@ fun TorrentList(

if (uiState.state == CallState.Error) {
Column(
modifier = Modifier
.fillMaxSize(),
modifier = Modifier.fillMaxSize(),
horizontalAlignment = Alignment.CenterHorizontally,
verticalArrangement = Arrangement.SpaceAround
) {
Text(text = "Error to fetch data")
Button(onClick = { onRefresh() }) {
Text(text = "Try Refresh")
Text(text = "Error to fetch data", color = MaterialTheme.colorScheme.onError)

IconButton(onClick = { viewModel.refresh() }) {
Icon(Icons.Filled.Refresh, "Try Refresh")
}
}
}

PullToRefreshContainer(
modifier = Modifier.align(Alignment.TopCenter),
state = refreshState,
)
}
}


@Composable
@Preview
fun LoadingTorrentListPrev() {
TorrentList(
HomeUiState(
state = CallState.Loading,
)
)
}

@Composable
@Preview
fun LoadErrorTorrentListPrev() {
TorrentList(
HomeUiState(
state = CallState.Error,
)
)
}

@Composable
@Preview
fun LoadedTorrentListPrev() {
TorrentList(
HomeUiState(
state = CallState.Success,
data = listOf(
Torrent(
"hash1",
"name1 longggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggg",
2412,
53251,
0.3f,
142,
"state",
"cat"
),
Torrent("hash2", "name2", 2413, 53251, 0.7f, 142, "state", "cat"),
)
)
)
}
12 changes: 4 additions & 8 deletions app/src/main/kotlin/me/nanova/subspace/ui/page/HomePage.kt
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.layout.consumeWindowInsets
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.heightIn
import androidx.compose.foundation.layout.padding
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.rounded.AccessTime
import androidx.compose.material.icons.rounded.Add
Expand Down Expand Up @@ -117,18 +118,13 @@ fun HomePage(
Surface(
modifier = Modifier
.consumeWindowInsets(innerPadding)
.padding(innerPadding)
.fillMaxSize(),
tonalElevation = 1.dp
) {
if (currentAccount == null) {
BlankAccount(onGoSetting = { navController.navigate(Routes.Settings.name) })
} else {
TorrentList(
uiState,
onRefresh = {
homeViewModel.refresh()
}
)
TorrentList(homeViewModel)
}
}
}
Expand Down Expand Up @@ -318,7 +314,7 @@ private fun BlankAccount(
) {
Column(
horizontalAlignment = Alignment.CenterHorizontally,
verticalArrangement = Arrangement.SpaceAround
verticalArrangement = Arrangement.SpaceAround,
) {
Text(
text = "No server account available yet",
Expand Down
9 changes: 9 additions & 0 deletions app/src/main/kotlin/me/nanova/subspace/ui/vm/HomeViewModel.kt
Original file line number Diff line number Diff line change
@@ -1,5 +1,8 @@
package me.nanova.subspace.ui.vm

import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.setValue
import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
import dagger.hilt.android.lifecycle.HiltViewModel
Expand Down Expand Up @@ -36,6 +39,9 @@ class HomeViewModel @Inject constructor(
private val accountRepo: AccountRepo
) : ViewModel() {

var isRefreshing by mutableStateOf(false)
private set

private val _homeUiState = MutableStateFlow(HomeUiState())
val homeUiState: StateFlow<HomeUiState> = _homeUiState.asStateFlow()

Expand Down Expand Up @@ -74,6 +80,7 @@ class HomeViewModel @Inject constructor(

private fun loadData() {
viewModelScope.launch {
isRefreshing = true
currentAccount.distinctUntilChanged().collect { id ->
id?.let {
_homeUiState.update {
Expand All @@ -85,6 +92,8 @@ class HomeViewModel @Inject constructor(
)
} catch (e: Exception) {
it.copy(state = CallState.Error)
} finally {
isRefreshing = false
}
}
}
Expand Down
4 changes: 2 additions & 2 deletions build.gradle.kts
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
// Top-level build file where you can add configuration options common to all sub-projects/modules.
plugins {
id("com.android.application") version "8.4.0" apply false
id("org.jetbrains.kotlin.android") version "1.9.22" apply false
id("com.google.devtools.ksp") version "1.9.22-1.0.18" apply false
id("org.jetbrains.kotlin.android") version "1.9.23" apply false
id("com.google.devtools.ksp") version "1.9.23-1.0.20" apply false
id("com.google.dagger.hilt.android") version "2.50" apply false
id("com.google.gms.google-services") version "4.4.1" apply false
id("com.google.firebase.crashlytics") version "2.9.9" apply false
Expand Down

0 comments on commit dd2afd6

Please sign in to comment.