didvan-app/lib/views/notification_time/notification_time_state.dart

135 lines
4.2 KiB
Dart

// lib/views/notification_time/notification_time_state.dart
//
// State مربوط به زمان دریافت اعلان‌ها.
//
// TODO(backend-migration): endpoint های `/user/notification/time` به سرور
// قدیمی `api.didvan.app` متصل‌اند که در دسترس نیست و notification-service
// جدید معادلی برای آن ندارد. وقتی backend جدید endpoint برای ذخیره‌ی
// silence time/preferences اضافه کرد، این state باید به آن متصل شود.
import 'dart:async';
import 'package:didvan/config/auth_config.dart';
import 'package:didvan/models/enums.dart';
import 'package:didvan/providers/core.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import '../../models/day_time.dart';
import '../../models/view/alert_data.dart';
import '../../services/network/request.dart';
import '../../services/network/request_helper.dart';
import '../../utils/action_sheet.dart';
import '../../utils/date_time.dart';
const _legacyTimeout = Duration(seconds: 6);
class NotificationTimeState extends CoreProvier {
/// زمان انتخاب‌شده‌ی پیش‌فرض: 12:00 ظهر تا state غیر-late نباشد.
DayTime selectedTime = DateTimeUtils.handleDayTime('12:00');
bool isAnytime = false;
bool fromFav = false;
late void Function() onTimeChanged = () {};
bool get _isBackendAvailable => AuthConfig.useLegacyApi;
Future<void> getTime() async {
if (!_isBackendAvailable) {
// مقدار پیش‌فرض را نگه می‌داریم تا UI بدون wait نمایش بدهد.
isAnytime = true;
selectedTime = DateTimeUtils.handleDayTime('12:00');
appState = AppState.idle;
update();
return;
}
appState = AppState.busy;
try {
final service = RequestService(RequestHelper.notificationTime());
await service.httpGet().timeout(_legacyTimeout);
if (service.isSuccess) {
var time = service.data('time');
if (time.toString().isEmpty) {
time = '12:00';
isAnytime = true;
}
selectedTime = DateTimeUtils.handleDayTime(time);
appState = AppState.idle;
} else {
debugPrint('⚠️ getTime legacy: status=${service.statusCode}');
_loadDefaultTime();
}
} on TimeoutException {
debugPrint('⏱️ getTime legacy timeout');
_loadDefaultTime();
} catch (e) {
debugPrint('❌ getTime legacy failed: $e');
_loadDefaultTime();
}
update();
}
void _loadDefaultTime() {
isAnytime = true;
selectedTime = DateTimeUtils.handleDayTime('12:00');
appState = AppState.idle;
}
Future<void> putTime(BuildContext context) async {
if (!_isBackendAvailable) {
ActionSheetUtils(context).showAlert(AlertData(
message: 'ذخیره‌ی زمان اعلان به‌زودی با سرور جدید فعال می‌شود.',
));
appState = AppState.idle;
update();
return;
}
appState = AppState.busy;
final favoritesRequest = {
'time': isAnytime ? '' : DateTimeUtils.handleDayTimeReverse(selectedTime),
};
final service = RequestService(
RequestHelper.notificationTime(),
body: favoritesRequest,
);
try {
await service.put().timeout(_legacyTimeout);
if (service.isSuccess) {
onTimeChanged();
Future.delayed(Duration.zero, () {
if (fromFav) {
Navigator.of(context).pop();
Navigator.of(context).pop();
} else {
Navigator.of(context).pop();
}
});
Future.delayed(
Duration.zero,
() => ActionSheetUtils(context).showAlert(AlertData(
message: 'تغییرات شما با موفقیت اعمال شد.',
aLertType: ALertType.success,
)),
);
appState = AppState.idle;
return;
}
ActionSheetUtils(context).showAlert(AlertData(
message: service.errorMessage,
));
} catch (e) {
debugPrint('❌ putTime failed: $e');
ActionSheetUtils(context).showAlert(AlertData(
message: 'ذخیره‌ی زمان اعلان با خطا مواجه شد.',
));
}
appState = AppState.failed;
}
}