회원목록
This commit is contained in:
@@ -0,0 +1,90 @@
|
||||
import 'dart:async';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:intl/intl.dart';
|
||||
|
||||
import '../models/subscription_model.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() {
|
||||
// 주기적으로 구독 상태 확인 (1시간마다)
|
||||
_checkTimer = Timer.periodic(const Duration(hours: 1), (_) {
|
||||
_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() {
|
||||
_checkTimer?.cancel();
|
||||
super.dispose();
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user