mirror of
https://github.com/KRTirtho/spotube.git
synced 2025-09-13 16:05:18 +00:00
feat(mobile): pull to refresh support in all refreshable list views
This commit is contained in:
parent
025c1ae204
commit
9f959ce77c
@ -3,13 +3,15 @@ import 'package:flutter_dotenv/flutter_dotenv.dart';
|
||||
|
||||
abstract class Env {
|
||||
static final String pocketbaseUrl =
|
||||
dotenv.get('POCKETBASE_URL', fallback: 'http://localhost:8090');
|
||||
dotenv.get('POCKETBASE_URL', fallback: 'http://127.0.0.1:8090');
|
||||
static final String username = dotenv.get('USERNAME', fallback: 'root');
|
||||
static final String password = dotenv.get('PASSWORD', fallback: '12345678');
|
||||
|
||||
static configure() async {
|
||||
if (kReleaseMode) {
|
||||
await dotenv.load(fileName: ".env");
|
||||
} else {
|
||||
dotenv.testLoad();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -62,7 +62,12 @@ class UserAlbums extends HookConsumerWidget {
|
||||
return const Center(child: ShimmerPlaybuttonCard(count: 7));
|
||||
}
|
||||
|
||||
return SingleChildScrollView(
|
||||
return RefreshIndicator(
|
||||
onRefresh: () async {
|
||||
await albumsQuery.refetch();
|
||||
},
|
||||
child: SingleChildScrollView(
|
||||
physics: const AlwaysScrollableScrollPhysics(),
|
||||
child: Material(
|
||||
type: MaterialType.transparency,
|
||||
textStyle: PlatformTheme.of(context).textTheme!.body!,
|
||||
@ -92,6 +97,7 @@ class UserAlbums extends HookConsumerWidget {
|
||||
),
|
||||
),
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
||||
|
@ -83,8 +83,13 @@ class UserArtists extends HookConsumerWidget {
|
||||
],
|
||||
),
|
||||
)
|
||||
: GridView.builder(
|
||||
: RefreshIndicator(
|
||||
onRefresh: () async {
|
||||
await artistQuery.refetchPages();
|
||||
},
|
||||
child: GridView.builder(
|
||||
itemCount: filteredArtists.length,
|
||||
physics: const AlwaysScrollableScrollPhysics(),
|
||||
gridDelegate: const SliverGridDelegateWithMaxCrossAxisExtent(
|
||||
maxCrossAxisExtent: 200,
|
||||
mainAxisExtent: 250,
|
||||
@ -108,6 +113,7 @@ class UserArtists extends HookConsumerWidget {
|
||||
});
|
||||
},
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
||||
|
@ -20,7 +20,6 @@ import 'package:spotube/components/shared/shimmers/shimmer_track_tile.dart';
|
||||
import 'package:spotube/components/shared/sort_tracks_dropdown.dart';
|
||||
import 'package:spotube/components/shared/track_table/track_tile.dart';
|
||||
import 'package:spotube/hooks/use_async_effect.dart';
|
||||
import 'package:spotube/hooks/use_breakpoints.dart';
|
||||
import 'package:spotube/models/local_track.dart';
|
||||
import 'package:spotube/provider/playlist_queue_provider.dart';
|
||||
import 'package:spotube/provider/user_preferences_provider.dart';
|
||||
@ -162,7 +161,6 @@ class UserLocalTracks extends HookConsumerWidget {
|
||||
trackSnapshot.value ?? [],
|
||||
);
|
||||
final isMounted = useIsMounted();
|
||||
final breakpoint = useBreakpoints();
|
||||
|
||||
final searchText = useState<String>("");
|
||||
|
||||
@ -261,7 +259,12 @@ class UserLocalTracks extends HookConsumerWidget {
|
||||
}, [searchText.value, sortedTracks]);
|
||||
|
||||
return Expanded(
|
||||
child: RefreshIndicator(
|
||||
onRefresh: () async {
|
||||
ref.refresh(localTracksProvider);
|
||||
},
|
||||
child: ListView.builder(
|
||||
physics: const AlwaysScrollableScrollPhysics(),
|
||||
itemCount: filteredTracks.length,
|
||||
itemBuilder: (context, index) {
|
||||
final track = filteredTracks[index];
|
||||
@ -284,6 +287,7 @@ class UserLocalTracks extends HookConsumerWidget {
|
||||
);
|
||||
},
|
||||
),
|
||||
),
|
||||
);
|
||||
},
|
||||
loading: () =>
|
||||
|
@ -89,7 +89,10 @@ class UserPlaylists extends HookConsumerWidget {
|
||||
))
|
||||
.toList(),
|
||||
];
|
||||
return SingleChildScrollView(
|
||||
return RefreshIndicator(
|
||||
onRefresh: () => playlistsQuery.refetch(),
|
||||
child: SingleChildScrollView(
|
||||
physics: const AlwaysScrollableScrollPhysics(),
|
||||
child: Material(
|
||||
type: MaterialType.transparency,
|
||||
textStyle: PlatformTheme.of(context).textTheme!.body!,
|
||||
@ -120,6 +123,7 @@ class UserPlaylists extends HookConsumerWidget {
|
||||
),
|
||||
),
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
||||
|
@ -208,8 +208,13 @@ class TrackCollectionView<T> extends HookConsumerWidget {
|
||||
),
|
||||
)
|
||||
: null,
|
||||
body: CustomScrollView(
|
||||
body: RefreshIndicator(
|
||||
onRefresh: () async {
|
||||
await tracksSnapshot.refetch();
|
||||
},
|
||||
child: CustomScrollView(
|
||||
controller: controller,
|
||||
physics: const AlwaysScrollableScrollPhysics(),
|
||||
slivers: [
|
||||
SliverAppBar(
|
||||
actions: [
|
||||
@ -269,7 +274,8 @@ class TrackCollectionView<T> extends HookConsumerWidget {
|
||||
runAlignment: WrapAlignment.center,
|
||||
children: [
|
||||
Container(
|
||||
constraints: const BoxConstraints(maxHeight: 200),
|
||||
constraints:
|
||||
const BoxConstraints(maxHeight: 200),
|
||||
child: ClipRRect(
|
||||
borderRadius: BorderRadius.circular(10),
|
||||
child: UniversalImage(
|
||||
@ -282,7 +288,8 @@ class TrackCollectionView<T> extends HookConsumerWidget {
|
||||
),
|
||||
Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
||||
mainAxisAlignment:
|
||||
MainAxisAlignment.spaceBetween,
|
||||
children: [
|
||||
PlatformText.headline(
|
||||
title,
|
||||
@ -344,6 +351,7 @@ class TrackCollectionView<T> extends HookConsumerWidget {
|
||||
},
|
||||
)
|
||||
],
|
||||
),
|
||||
)),
|
||||
);
|
||||
}
|
||||
|
@ -39,11 +39,12 @@ void main(List<String> rawArgs) async {
|
||||
'verbose',
|
||||
abbr: 'v',
|
||||
help: 'Verbose mode',
|
||||
defaultsTo: !kReleaseMode,
|
||||
callback: (verbose) {
|
||||
if (verbose) {
|
||||
Platform.environment['VERBOSE'] = 'true';
|
||||
Platform.environment['DEBUG'] = 'true';
|
||||
Platform.environment['ERROR'] = 'true';
|
||||
logEnv['VERBOSE'] = 'true';
|
||||
logEnv['DEBUG'] = 'true';
|
||||
logEnv['ERROR'] = 'true';
|
||||
}
|
||||
},
|
||||
);
|
||||
@ -102,7 +103,7 @@ void main(List<String> rawArgs) async {
|
||||
}
|
||||
|
||||
Catcher(
|
||||
enableLogger: arguments["verbose"] ?? !kReleaseMode,
|
||||
enableLogger: arguments["verbose"],
|
||||
debugConfig: CatcherOptions(
|
||||
SilentReportMode(),
|
||||
[
|
||||
|
@ -7,6 +7,9 @@ import 'package:path/path.dart' as path;
|
||||
import 'package:spotube/utils/platform.dart';
|
||||
|
||||
final _loggerFactory = SpotubeLogger();
|
||||
final logEnv = {
|
||||
if (!kIsWeb) ...Platform.environment,
|
||||
};
|
||||
|
||||
SpotubeLogger getLogger<T>(T owner) {
|
||||
_loggerFactory.owner = owner is String ? owner : owner.toString();
|
||||
@ -60,10 +63,9 @@ class SpotubeLogger extends Logger {
|
||||
class _SpotubeLogFilter extends DevelopmentFilter {
|
||||
@override
|
||||
bool shouldLog(LogEvent event) {
|
||||
final env = kIsWeb ? {} : Platform.environment;
|
||||
if ((env["DEBUG"] == "true" && event.level == Level.debug) ||
|
||||
(env["VERBOSE"] == "true" && event.level == Level.verbose) ||
|
||||
(env["ERROR"] == "true" && event.level == Level.error)) {
|
||||
if ((logEnv["DEBUG"] == "true" && event.level == Level.debug) ||
|
||||
(logEnv["VERBOSE"] == "true" && event.level == Level.verbose) ||
|
||||
(logEnv["ERROR"] == "true" && event.level == Level.error)) {
|
||||
return true;
|
||||
}
|
||||
return super.shouldLog(event);
|
||||
|
@ -92,7 +92,11 @@ class GenrePage extends HookConsumerWidget {
|
||||
placeholder: "Filter categories or genres...",
|
||||
);
|
||||
|
||||
final list = Waypoint(
|
||||
final list = RefreshIndicator(
|
||||
onRefresh: () async {
|
||||
await categoriesQuery.refetchPages();
|
||||
},
|
||||
child: Waypoint(
|
||||
onTouchEdge: () async {
|
||||
if (categoriesQuery.hasNextPage && isMounted()) {
|
||||
await categoriesQuery.fetchNextPage();
|
||||
@ -100,6 +104,7 @@ class GenrePage extends HookConsumerWidget {
|
||||
},
|
||||
controller: scrollController,
|
||||
child: ListView.builder(
|
||||
physics: const AlwaysScrollableScrollPhysics(),
|
||||
controller: scrollController,
|
||||
itemCount: categories.length,
|
||||
itemBuilder: (context, index) {
|
||||
@ -110,6 +115,7 @@ class GenrePage extends HookConsumerWidget {
|
||||
return CategoryCard(category);
|
||||
},
|
||||
),
|
||||
),
|
||||
);
|
||||
return PlatformScaffold(
|
||||
appBar: kIsDesktop
|
||||
|
Loading…
Reference in New Issue
Block a user