102 lines
2.9 KiB
Dart
102 lines
2.9 KiB
Dart
import 'dart:async';
|
|
import 'package:flutter/material.dart';
|
|
import 'package:intl/intl.dart';
|
|
|
|
import '../models/subscription_model.dart';
|
|
import '../utils/test_utils.dart';
|
|
|
|
/// 구독 알림 서비스
|
|
class SubscriptionNotificationService extends ChangeNotifier {
|
|
// 구독 만료 임박 기준 (일)
|
|
static const int _expirationWarningDays = 7;
|
|
|
|
// 알림 상태
|
|
bool _hasExpirationWarning = false;
|
|
bool _hasExpired = false;
|
|
DateTime? _expirationDate;
|
|
Timer? _checkTimer;
|
|
|
|
// 게터
|
|
bool get hasExpirationWarning => _hasExpirationWarning;
|
|
bool get hasExpired => _hasExpired;
|
|
DateTime? get expirationDate => _expirationDate;
|
|
|
|
// 만료까지 남은 일수
|
|
int get daysUntilExpiration {
|
|
if (_expirationDate == null) return 0;
|
|
return _expirationDate!.difference(DateTime.now()).inDays;
|
|
}
|
|
|
|
// 만료일 포맷팅 (YYYY-MM-DD)
|
|
String get formattedExpirationDate {
|
|
if (_expirationDate == null) return '';
|
|
return DateFormat('yyyy-MM-dd').format(_expirationDate!);
|
|
}
|
|
|
|
SubscriptionNotificationService() {
|
|
// 테스트 환경에서는 Timer를 생성하지 않음
|
|
if (!TestUtils.isInTest) {
|
|
// 주기적으로 구독 상태 확인 (1시간마다)
|
|
_checkTimer = Timer.periodic(const Duration(hours: 1), (_) {
|
|
_checkExpirationStatus();
|
|
});
|
|
} else {
|
|
// 테스트 환경에서는 즉시 한 번만 체크
|
|
_checkExpirationStatus();
|
|
}
|
|
}
|
|
|
|
/// 구독 정보 업데이트
|
|
void updateSubscription(Subscription? subscription) {
|
|
if (subscription == null || !subscription.isActive) {
|
|
_hasExpired = true;
|
|
_hasExpirationWarning = false;
|
|
_expirationDate = null;
|
|
} else {
|
|
_expirationDate = subscription.endDate;
|
|
_checkExpirationStatus();
|
|
}
|
|
notifyListeners();
|
|
}
|
|
|
|
/// 만료 상태 확인
|
|
void _checkExpirationStatus() {
|
|
if (_expirationDate == null) {
|
|
_hasExpired = true;
|
|
_hasExpirationWarning = false;
|
|
return;
|
|
}
|
|
|
|
final now = DateTime.now();
|
|
final daysLeft = _expirationDate!.difference(now).inDays;
|
|
|
|
// 만료 여부 확인
|
|
_hasExpired = now.isAfter(_expirationDate!);
|
|
|
|
// 만료 임박 여부 확인 (7일 이내)
|
|
_hasExpirationWarning = !_hasExpired && daysLeft <= _expirationWarningDays;
|
|
|
|
notifyListeners();
|
|
}
|
|
|
|
/// 알림 메시지 생성
|
|
String? getNotificationMessage() {
|
|
if (_hasExpired) {
|
|
return '구독이 만료되었습니다. 서비스 이용을 위해 구독을 갱신해 주세요.';
|
|
} else if (_hasExpirationWarning && _expirationDate != null) {
|
|
return '구독이 $daysUntilExpiration일 후 만료됩니다. 서비스 이용을 위해 구독을 갱신해 주세요.';
|
|
}
|
|
return null;
|
|
}
|
|
|
|
@override
|
|
void dispose() {
|
|
// Timer가 있으면 취소
|
|
if (_checkTimer != null) {
|
|
_checkTimer!.cancel();
|
|
_checkTimer = null;
|
|
}
|
|
super.dispose();
|
|
}
|
|
}
|