// 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 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 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; } }