feat: improve sms scan review and detail layouts

This commit is contained in:
JiWoong Sul
2025-11-14 19:33:32 +09:00
parent a9f42f6f01
commit 2cd46a303e
13 changed files with 455 additions and 115 deletions

View File

@@ -39,14 +39,18 @@ class SmsScanController extends ChangeNotifier {
String? get selectedPaymentCardId => _selectedPaymentCardId;
final TextEditingController websiteUrlController = TextEditingController();
final TextEditingController serviceNameController = TextEditingController();
// 의존성
final SmsScanner _smsScanner = SmsScanner();
final SubscriptionConverter _converter = SubscriptionConverter();
final SubscriptionFilter _filter = SubscriptionFilter();
bool _forceServiceNameEditing = false;
bool get isServiceNameEditable => _forceServiceNameEditing;
@override
void dispose() {
serviceNameController.dispose();
websiteUrlController.dispose();
super.dispose();
}
@@ -66,6 +70,16 @@ class SmsScanController extends ChangeNotifier {
void resetWebsiteUrl() {
websiteUrlController.text = '';
serviceNameController.text = '';
}
void updateCurrentServiceName(String value) {
if (_currentIndex >= _scannedSubscriptions.length) return;
final trimmed = value.trim();
final updated = _scannedSubscriptions[_currentIndex]
.copyWith(serviceName: trimmed.isEmpty ? '알 수 없는 서비스' : trimmed);
_scannedSubscriptions[_currentIndex] = updated;
notifyListeners();
}
Future<void> scanSms(BuildContext context) async {
@@ -215,6 +229,9 @@ class SmsScanController extends ChangeNotifier {
if (_currentIndex >= _scannedSubscriptions.length) return;
final subscription = _scannedSubscriptions[_currentIndex];
final inputName = serviceNameController.text.trim();
final resolvedServiceName =
inputName.isNotEmpty ? inputName : subscription.serviceName;
try {
final provider =
@@ -240,7 +257,7 @@ class SmsScanController extends ChangeNotifier {
// addSubscription 호출
await provider.addSubscription(
serviceName: subscription.serviceName,
serviceName: resolvedServiceName,
monthlyCost: subscription.monthlyCost,
billingCycle: subscription.billingCycle,
nextBillingDate: subscription.nextBillingDate,
@@ -273,7 +290,9 @@ class SmsScanController extends ChangeNotifier {
void moveToNextSubscription(BuildContext context) {
_currentIndex++;
websiteUrlController.text = '';
serviceNameController.text = '';
_selectedCategoryId = null;
_forceServiceNameEditing = false;
_prepareCurrentSelection(context);
// 모든 구독을 처리했으면 홈 화면으로 이동
@@ -298,6 +317,8 @@ class SmsScanController extends ChangeNotifier {
_selectedPaymentCardId = null;
_currentSuggestion = null;
_shouldSuggestCardCreation = false;
serviceNameController.clear();
_forceServiceNameEditing = false;
notifyListeners();
}
@@ -316,6 +337,13 @@ class SmsScanController extends ChangeNotifier {
if (websiteUrlController.text.isEmpty && currentSub.websiteUrl != null) {
websiteUrlController.text = currentSub.websiteUrl!;
}
if (_shouldEnableServiceNameEditing(currentSub)) {
if (serviceNameController.text != currentSub.serviceName) {
serviceNameController.clear();
}
} else {
serviceNameController.text = currentSub.serviceName;
}
}
}
@@ -332,10 +360,18 @@ class SmsScanController extends ChangeNotifier {
if (_currentIndex >= _scannedSubscriptions.length) {
_selectedPaymentCardId = null;
_currentSuggestion = null;
_forceServiceNameEditing = false;
serviceNameController.clear();
return;
}
final current = _scannedSubscriptions[_currentIndex];
_forceServiceNameEditing = _shouldEnableServiceNameEditing(current);
if (_forceServiceNameEditing && current.serviceName == '알 수 없는 서비스') {
serviceNameController.clear();
} else {
serviceNameController.text = current.serviceName;
}
// URL 기본값
if (current.websiteUrl != null && current.websiteUrl!.isNotEmpty) {
@@ -392,4 +428,9 @@ class SmsScanController extends ChangeNotifier {
}
return null;
}
bool _shouldEnableServiceNameEditing(Subscription subscription) {
final name = subscription.serviceName.trim();
return name.isEmpty || name == '알 수 없는 서비스';
}
}