feat: improve sms scan review and detail layouts
This commit is contained in:
@@ -19,6 +19,7 @@ import '../../l10n/app_localizations.dart';
|
||||
|
||||
class SubscriptionCardWidget extends StatefulWidget {
|
||||
final Subscription subscription;
|
||||
final TextEditingController serviceNameController;
|
||||
final TextEditingController websiteUrlController;
|
||||
final String? selectedCategoryId;
|
||||
final Function(String?) onCategoryChanged;
|
||||
@@ -32,10 +33,13 @@ class SubscriptionCardWidget extends StatefulWidget {
|
||||
final bool showDetectedCardShortcut;
|
||||
final Future<void> Function(PaymentCardSuggestion suggestion)?
|
||||
onAddDetectedCard;
|
||||
final bool enableServiceNameEditing;
|
||||
final ValueChanged<String>? onServiceNameChanged;
|
||||
|
||||
const SubscriptionCardWidget({
|
||||
super.key,
|
||||
required this.subscription,
|
||||
required this.serviceNameController,
|
||||
required this.websiteUrlController,
|
||||
this.selectedCategoryId,
|
||||
required this.onCategoryChanged,
|
||||
@@ -48,6 +52,8 @@ class SubscriptionCardWidget extends StatefulWidget {
|
||||
this.detectedCardSuggestion,
|
||||
this.showDetectedCardShortcut = false,
|
||||
this.onAddDetectedCard,
|
||||
this.enableServiceNameEditing = false,
|
||||
this.onServiceNameChanged,
|
||||
});
|
||||
|
||||
@override
|
||||
@@ -84,6 +90,12 @@ class _SubscriptionCardWidgetState extends State<SubscriptionCardWidget> {
|
||||
// 광고 위젯 추가
|
||||
const NativeAdWidget(key: ValueKey('sms_scan_result_ad')),
|
||||
const SizedBox(height: 16),
|
||||
if (_hasRawSmsMessage)
|
||||
Padding(
|
||||
padding: const EdgeInsets.symmetric(horizontal: 16.0),
|
||||
child: _buildSmsPreviewCard(context),
|
||||
),
|
||||
if (_hasRawSmsMessage) const SizedBox(height: 16),
|
||||
Padding(
|
||||
padding: const EdgeInsets.symmetric(horizontal: 16.0),
|
||||
child: Column(
|
||||
@@ -143,6 +155,75 @@ class _SubscriptionCardWidgetState extends State<SubscriptionCardWidget> {
|
||||
);
|
||||
}
|
||||
|
||||
bool get _hasRawSmsMessage {
|
||||
return widget.subscription.rawMessage != null &&
|
||||
widget.subscription.rawMessage!.trim().isNotEmpty;
|
||||
}
|
||||
|
||||
Widget _buildSmsPreviewCard(BuildContext context) {
|
||||
final theme = Theme.of(context);
|
||||
final loc = AppLocalizations.of(context);
|
||||
final rawMessage = widget.subscription.rawMessage?.trim() ?? '';
|
||||
final lastDate = widget.subscription.lastPaymentDate;
|
||||
|
||||
return Card(
|
||||
elevation: 0,
|
||||
color: theme.colorScheme.surfaceContainerHighest.withValues(alpha: 0.4),
|
||||
shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(16)),
|
||||
child: Padding(
|
||||
padding: const EdgeInsets.all(16.0),
|
||||
child: Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
children: [
|
||||
Row(
|
||||
children: [
|
||||
Icon(Icons.sms_outlined, color: theme.colorScheme.primary),
|
||||
const SizedBox(width: 8),
|
||||
Expanded(
|
||||
child: Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
children: [
|
||||
ThemedText(
|
||||
loc.latestSmsMessage,
|
||||
fontWeight: FontWeight.bold,
|
||||
),
|
||||
if (lastDate != null)
|
||||
ThemedText(
|
||||
loc.smsDetectedDate(loc.formatDate(lastDate)),
|
||||
opacity: 0.7,
|
||||
fontSize: 13,
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
const SizedBox(height: 12),
|
||||
Container(
|
||||
width: double.infinity,
|
||||
decoration: BoxDecoration(
|
||||
color: theme.colorScheme.surface,
|
||||
borderRadius: BorderRadius.circular(12),
|
||||
border: Border.all(
|
||||
color: theme.colorScheme.outline.withValues(alpha: 0.3),
|
||||
),
|
||||
),
|
||||
padding: const EdgeInsets.all(12),
|
||||
child: SelectableText(
|
||||
rawMessage,
|
||||
style: TextStyle(
|
||||
fontSize: 15,
|
||||
height: 1.4,
|
||||
color: theme.colorScheme.onSurface,
|
||||
),
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
// 정보 섹션 (클릭 가능)
|
||||
Widget _buildInfoSection(CategoryProvider categoryProvider) {
|
||||
return Column(
|
||||
@@ -162,11 +243,20 @@ class _SubscriptionCardWidgetState extends State<SubscriptionCardWidget> {
|
||||
opacity: 0.7,
|
||||
),
|
||||
const SizedBox(height: 4),
|
||||
ThemedText(
|
||||
widget.subscription.serviceName,
|
||||
fontSize: 22,
|
||||
fontWeight: FontWeight.bold,
|
||||
),
|
||||
if (widget.enableServiceNameEditing)
|
||||
BaseTextField(
|
||||
controller: widget.serviceNameController,
|
||||
hintText: AppLocalizations.of(context).serviceNameRequired,
|
||||
onChanged: widget.onServiceNameChanged,
|
||||
textInputAction: TextInputAction.done,
|
||||
maxLines: 1,
|
||||
)
|
||||
else
|
||||
ThemedText(
|
||||
widget.subscription.serviceName,
|
||||
fontSize: 22,
|
||||
fontWeight: FontWeight.bold,
|
||||
),
|
||||
const SizedBox(height: 16),
|
||||
|
||||
// 금액 및 결제 주기
|
||||
|
||||
Reference in New Issue
Block a user