main.dart 3.5 KB

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