main.dart 3.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  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/home_screen.dart';
  11. import 'package:veloe_kemono_party_flutter/pages/posts_screen.dart';
  12. import 'package:veloe_kemono_party_flutter/posts_notifier.dart';
  13. // Providers
  14. final searchQueryProvider = StateProvider<String>((ref) => '');
  15. final selectedCreatorProvider = StateProvider<Creator?>((ref) => null);
  16. final postsPageProvider = StateProvider<int>((ref) => 0);
  17. final kemonoClientProvider = Provider<KemonoClient>((ref) => KemonoClient());
  18. final creatorsProvider = FutureProvider<List<Creator>>((ref) async {
  19. final query = ref.watch(searchQueryProvider);
  20. final client = ref.read(kemonoClientProvider);
  21. final creators = await client.getCreators();
  22. return creators.where((creator) =>
  23. creator.name.toLowerCase().contains(query.toLowerCase()) ||
  24. creator.service.toLowerCase().contains(query.toLowerCase())
  25. ).toList();
  26. });
  27. final postsProvider = StateNotifierProvider.autoDispose
  28. .family<PostsNotifier, AsyncValue<List<Post>>, (String, String, String)>((ref, args) {
  29. final (creatorId, service, query) = args;
  30. return PostsNotifier(
  31. creatorId: creatorId,
  32. service: service,
  33. query: query,
  34. client: ref.read(kemonoClientProvider),
  35. );
  36. });
  37. // Image Caching
  38. final imageCacheManager = CacheManager(
  39. Config(
  40. 'kemono_images',
  41. stalePeriod: const Duration(days: 30),
  42. maxNrOfCacheObjects: 1024,
  43. fileService: HttpFileService(),
  44. ),
  45. );
  46. final videoCacheManager = CacheManager(
  47. Config(
  48. 'kemono_videos',
  49. stalePeriod: const Duration(days: 30),
  50. maxNrOfCacheObjects: 1024,
  51. fileService: HttpFileService(),
  52. ),
  53. );
  54. final iconsCacheManager = CacheManager(
  55. Config(
  56. 'kemono_icons',
  57. stalePeriod: const Duration(days: 30),
  58. maxNrOfCacheObjects: 1024,
  59. fileService: HttpFileService(),
  60. ),
  61. );
  62. // Main Application
  63. void main() {
  64. MediaKit.ensureInitialized();
  65. runApp(
  66. const ProviderScope(
  67. child: MaterialApp(
  68. home: AppLayout(
  69. navItems: [
  70. NavItem(
  71. label: 'Home',
  72. icon: Icons.home,
  73. page: HomeScreen(),
  74. ),
  75. NavItem(
  76. label: 'Global Feed (Rukis)',
  77. icon: Icons.public,
  78. page: PostsScreen( creatorId:'82522', service: 'patreon', withAppBar: false,),
  79. ),
  80. NavItem(
  81. label: 'Settings',
  82. icon: Icons.settings,
  83. page: Placeholder(), // Replace with actual SettingsScreen
  84. ),
  85. ],
  86. ),
  87. ),
  88. ),
  89. );
  90. }