main.dart 3.5 KB

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