main.dart 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  1. import 'dart:io';
  2. import 'package:cached_network_image/cached_network_image.dart';
  3. import 'package:cached_video_player_plus/src/video_cache_manager.dart';
  4. import 'package:flutter/material.dart';
  5. import 'package:flutter_riverpod/flutter_riverpod.dart';
  6. import 'package:flutter_cache_manager/flutter_cache_manager.dart';
  7. import 'package:veloe_kemono_party_flutter/app_layout.dart';
  8. import 'package:veloe_kemono_party_flutter/kemono_client.dart';
  9. import 'package:veloe_kemono_party_flutter/models/creator.dart';
  10. import 'package:veloe_kemono_party_flutter/models/nav_item.dart';
  11. import 'package:veloe_kemono_party_flutter/models/post.dart';
  12. import 'package:veloe_kemono_party_flutter/pages/cache_settings_screen.dart';
  13. import 'package:veloe_kemono_party_flutter/pages/home_screen.dart';
  14. import 'package:veloe_kemono_party_flutter/pages/posts_screen.dart';
  15. import 'package:veloe_kemono_party_flutter/posts_notifier.dart';
  16. // Providers
  17. final searchQueryProvider = StateProvider<String>((ref) => '');
  18. final selectedCreatorProvider = StateProvider<Creator?>((ref) => null);
  19. final postsPageProvider = StateProvider<int>((ref) => 0);
  20. enum KemonoSource { kemono, coomer }
  21. final sourceProvider = StateProvider<KemonoSource>((ref) => KemonoSource.kemono);
  22. final kemonoClientProvider = Provider<KemonoClient>((ref) {
  23. final source = ref.watch(sourceProvider);
  24. final baseUrl = source == KemonoSource.kemono ? 'https://kemono.cr' : 'https://coomer.st';
  25. return KemonoClient(baseUrl);
  26. });
  27. final creatorsProvider = FutureProvider<List<Creator>>((ref) async {
  28. final query = ref.watch(searchQueryProvider);
  29. final client = ref.watch(kemonoClientProvider);
  30. final creators = await client.getCreators();
  31. return creators.where((creator) =>
  32. creator.name.toLowerCase().contains(query.toLowerCase()) ||
  33. creator.service.toLowerCase().contains(query.toLowerCase())
  34. ).toList();
  35. });
  36. final sourceChangeProvider = Provider<void>((ref) {
  37. // This will trigger rebuilds when source changes
  38. ref.watch(sourceProvider);
  39. });
  40. final postsProvider = StateNotifierProvider.autoDispose
  41. .family<PostsNotifier, AsyncValue<List<Post>>, (String, String, String)>((ref, args) {
  42. final (creatorId, service, query) = args;
  43. return PostsNotifier(
  44. creatorId: creatorId,
  45. service: service,
  46. query: query,
  47. client: ref.read(kemonoClientProvider),
  48. );
  49. });
  50. final httpFileService = HttpFileService();
  51. // Image Caching
  52. final imageCacheManager = CacheManager(
  53. Config(
  54. 'kemono_images',
  55. stalePeriod: const Duration(days: 30),
  56. maxNrOfCacheObjects: 1024,
  57. fileService: httpFileService,
  58. ),
  59. );
  60. final videoCacheManager = VideoCacheManager();
  61. final iconsCacheManager = CacheManager(
  62. Config(
  63. 'kemono_icons',
  64. stalePeriod: const Duration(days: 30),
  65. maxNrOfCacheObjects: 1024,
  66. fileService: HttpFileService(),
  67. ),
  68. );
  69. // Main Application
  70. void main() {
  71. httpFileService.concurrentFetches = 2;
  72. runApp(
  73. const ProviderScope(
  74. child: MaterialApp(
  75. home: AppLayout(
  76. navItems: [
  77. NavItem(
  78. label: 'Home',
  79. icon: Icons.home,
  80. page: HomeScreen(),
  81. ),
  82. NavItem(
  83. label: 'Global Feed (Rukis)',
  84. icon: Icons.public,
  85. page: PostsScreen( creatorId:'82522', service: 'patreon', withAppBar: false,),
  86. ),
  87. NavItem(
  88. label: 'Settings',
  89. icon: Icons.settings,
  90. page: CacheSettingsScreen(),
  91. ),
  92. ],
  93. ),
  94. ),
  95. ),
  96. );
  97. }