회원목록

This commit is contained in:
2025-08-01 16:45:26 +09:00
parent a996def67a
commit ed8c7eacba
191 changed files with 17491 additions and 0 deletions
@@ -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();
}
}