219 lines
5.4 KiB
Dart
219 lines
5.4 KiB
Dart
import 'package:flutter/material.dart';
|
|
import 'package:food_hub_app/apis/moment.dart';
|
|
import 'package:food_hub_app/apis/recipe.dart';
|
|
import 'package:food_hub_app/apis/stats.dart';
|
|
import 'package:food_hub_app/models/moment.dart';
|
|
import 'package:food_hub_app/models/recipe.dart';
|
|
import 'package:food_hub_app/models/stats.dart';
|
|
import 'package:food_hub_app/utils/date_util.dart';
|
|
import 'package:food_hub_app/utils/index.dart';
|
|
|
|
class FoodProvider with ChangeNotifier {
|
|
late FoodRecord recordFormItem;
|
|
late Moment momentFormItem;
|
|
|
|
late bool isEditing;
|
|
bool isLoading = false;
|
|
String? error;
|
|
|
|
String queryCategory = '全部菜系';
|
|
late List<String> categoryList = [];
|
|
late List<RecipeSummary> recipeSummaryList = [];
|
|
|
|
DateTime selectedDay = DateTime.now();
|
|
DateTime focusedDay = DateTime.now();
|
|
|
|
late List<FoodRecord> recordList = [];
|
|
late List<FoodRecord> selectRecordList = [];
|
|
|
|
late SummaryStats summaryStats = SummaryStats(
|
|
recipeCount: 0,
|
|
categoryCount: 0,
|
|
workCount: 0,
|
|
);
|
|
late double averageRecordCount = 0;
|
|
late List<ChartData> recordStats = [];
|
|
late List<ChartData> categoryStats = [];
|
|
late List<ChartData> rankStats = [];
|
|
|
|
List<Moment> momentList = [];
|
|
int currentPage = 1;
|
|
final int pageSize = 3;
|
|
bool hasMore = true;
|
|
|
|
void resetRecordForm() {
|
|
recordFormItem = FoodRecord.getEmpty();
|
|
notifyListeners();
|
|
}
|
|
|
|
void initRecordForm(FoodRecord record) {
|
|
recordFormItem = record;
|
|
notifyListeners();
|
|
}
|
|
|
|
void resetMomentForm() {
|
|
momentFormItem = Moment.getEmpty();
|
|
notifyListeners();
|
|
}
|
|
|
|
void initMomentForm(Moment moment) {
|
|
momentFormItem = moment;
|
|
notifyListeners();
|
|
}
|
|
|
|
Future<void> queryCategoryList() async {
|
|
try {
|
|
error = null;
|
|
notifyListeners();
|
|
|
|
final result = await queryCategoryApi();
|
|
categoryList.clear();
|
|
categoryList.add('全部菜系');
|
|
categoryList.addAll(result);
|
|
} catch (e) {
|
|
error = '加载数据失败: $e';
|
|
debugPrint('加载数据失败: $e');
|
|
} finally {
|
|
notifyListeners();
|
|
}
|
|
}
|
|
|
|
Future<void> refreshRecipeList() async {
|
|
if (isLoading) return;
|
|
|
|
try {
|
|
isLoading = true;
|
|
error = null;
|
|
notifyListeners();
|
|
|
|
final category = queryCategory == '全部菜系' ? '' : queryCategory;
|
|
final result = await queryRecipeApi(RecipeQuery(category: category));
|
|
recipeSummaryList = result;
|
|
} catch (e) {
|
|
error = '加载数据失败: $e';
|
|
debugPrint('加载数据失败: $e');
|
|
} finally {
|
|
isLoading = false;
|
|
notifyListeners();
|
|
}
|
|
}
|
|
|
|
Future<void> refreshRecordList(String? startDate, String? endDate) async {
|
|
if (isLoading) return;
|
|
|
|
try {
|
|
isLoading = true;
|
|
error = null;
|
|
notifyListeners();
|
|
|
|
startDate ??= getFirstDayOfMonth(focusedDay);
|
|
endDate ??= getLastDayOfMonth(focusedDay);
|
|
|
|
final result = await queryRecordApi(startDate, endDate);
|
|
|
|
recordList = result;
|
|
|
|
if (recordList.isNotEmpty) {
|
|
selectedDay = DateTime.parse(recordList.last.date);
|
|
} else {
|
|
selectedDay = focusedDay;
|
|
}
|
|
|
|
refreshSelectRecord();
|
|
} catch (e) {
|
|
error = '加载数据失败: $e';
|
|
debugPrint('加载数据失败: $e');
|
|
} finally {
|
|
isLoading = false;
|
|
notifyListeners();
|
|
}
|
|
}
|
|
|
|
void refreshSelectRecord() {
|
|
selectRecordList =
|
|
recordList
|
|
.where((record) => record.date == formatDateTime(selectedDay))
|
|
.toList();
|
|
}
|
|
|
|
Future<void> refreshBlogStats() async {
|
|
if (isLoading) return;
|
|
|
|
try {
|
|
isLoading = true;
|
|
error = null;
|
|
notifyListeners();
|
|
|
|
final statsResult = await queryStatsApi();
|
|
final recordStatsResult = await queryRecordStatsApi();
|
|
final categoryStatsResult = await queryCategoryStatsApi();
|
|
final rankStatsResult = await queryRankStatsApi();
|
|
|
|
summaryStats = statsResult;
|
|
recordStats = recordStatsResult;
|
|
categoryStats = categoryStatsResult;
|
|
rankStats = rankStatsResult;
|
|
|
|
if (recordStats.isNotEmpty) {
|
|
double sumValue = recordStats.fold(
|
|
0.0,
|
|
(sum, item) => sum + item.value,
|
|
);
|
|
averageRecordCount = sumValue / recordStats.length;
|
|
}
|
|
} catch (e) {
|
|
error = '加载数据失败: $e';
|
|
debugPrint('加载数据失败: $e');
|
|
} finally {
|
|
isLoading = false;
|
|
notifyListeners();
|
|
}
|
|
}
|
|
|
|
Future<void> queryMomentByPage({bool isRefresh = true}) async {
|
|
if (isLoading) return;
|
|
|
|
try {
|
|
isLoading = true;
|
|
error = null;
|
|
notifyListeners();
|
|
|
|
// 如果是刷新,重置页码
|
|
if (isRefresh) {
|
|
currentPage = 1;
|
|
}
|
|
|
|
final result = await queryMomentByPageApi(currentPage, pageSize);
|
|
|
|
// 更新数据
|
|
if (isRefresh) {
|
|
momentList = result.records;
|
|
} else {
|
|
momentList.addAll(result.records);
|
|
}
|
|
|
|
// 判断是否还有更多数据
|
|
hasMore = result.current < result.pages;
|
|
if (hasMore) {
|
|
currentPage++;
|
|
}
|
|
} catch (e) {
|
|
error = '加载数据失败: $e';
|
|
debugPrint('加载数据失败: $e');
|
|
} finally {
|
|
isLoading = false;
|
|
notifyListeners();
|
|
}
|
|
}
|
|
|
|
Future<void> loadMoreMomentList() async {
|
|
if (hasMore && !isLoading) {
|
|
await queryMomentByPage(isRefresh: false);
|
|
}
|
|
}
|
|
|
|
Future<void> refreshMomentList() async {
|
|
await queryMomentByPage(isRefresh: true);
|
|
}
|
|
}
|