💄 Better abuse reports
This commit is contained in:
@ -7,6 +7,7 @@ import 'package:island/pods/network.dart';
|
||||
import 'package:island/services/notify.dart';
|
||||
import 'package:island/services/udid.native.dart';
|
||||
import 'package:island/widgets/alert.dart';
|
||||
import 'package:island/widgets/app_scaffold.dart';
|
||||
import 'package:material_symbols_icons/symbols.dart';
|
||||
import 'package:package_info_plus/package_info_plus.dart';
|
||||
import 'package:styled_widget/styled_widget.dart';
|
||||
@ -90,7 +91,7 @@ class _AboutScreenState extends ConsumerState<AboutScreen> {
|
||||
Widget build(BuildContext context) {
|
||||
final theme = Theme.of(context);
|
||||
|
||||
return Scaffold(
|
||||
return AppScaffold(
|
||||
appBar: AppBar(title: Text('about'.tr()), elevation: 0),
|
||||
body:
|
||||
_isLoading
|
||||
|
@ -6,6 +6,7 @@ import 'package:hooks_riverpod/hooks_riverpod.dart';
|
||||
import 'package:island/models/webfeed.dart';
|
||||
import 'package:island/pods/webfeed.dart';
|
||||
import 'package:island/widgets/alert.dart';
|
||||
import 'package:island/widgets/app_scaffold.dart';
|
||||
import 'package:material_symbols_icons/symbols.dart';
|
||||
import 'package:styled_widget/styled_widget.dart';
|
||||
|
||||
@ -183,7 +184,7 @@ class WebFeedEditScreen extends HookConsumerWidget {
|
||||
}
|
||||
}, [pubName, feedId, ref, context]);
|
||||
|
||||
return Scaffold(
|
||||
return AppScaffold(
|
||||
appBar: AppBar(
|
||||
title: Text(hasFeedId ? 'Edit Web Feed' : 'New Web Feed'),
|
||||
actions: [
|
||||
|
@ -2,6 +2,7 @@ import 'package:flutter/material.dart';
|
||||
import 'package:hooks_riverpod/hooks_riverpod.dart';
|
||||
import 'package:island/models/webfeed.dart';
|
||||
import 'package:island/pods/network.dart';
|
||||
import 'package:island/widgets/app_scaffold.dart';
|
||||
import 'package:island/widgets/web_article_card.dart';
|
||||
import 'package:riverpod_annotation/riverpod_annotation.dart';
|
||||
import 'package:riverpod_paging_utils/riverpod_paging_utils.dart';
|
||||
@ -124,7 +125,7 @@ class ArticlesScreen extends ConsumerWidget {
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context, WidgetRef ref) {
|
||||
return Scaffold(
|
||||
return AppScaffold(
|
||||
appBar: AppBar(title: Text(title ?? 'Articles')),
|
||||
body: Center(
|
||||
child: ConstrainedBox(
|
||||
|
@ -3,6 +3,7 @@ import 'package:flutter/material.dart';
|
||||
import 'package:hooks_riverpod/hooks_riverpod.dart';
|
||||
import 'package:island/models/post.dart';
|
||||
import 'package:island/pods/network.dart';
|
||||
import 'package:island/widgets/app_scaffold.dart';
|
||||
import 'package:island/widgets/post/post_item.dart';
|
||||
import 'package:riverpod_paging_utils/riverpod_paging_utils.dart';
|
||||
|
||||
@ -107,7 +108,7 @@ class _PostSearchScreenState extends ConsumerState<PostSearchScreen> {
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return Scaffold(
|
||||
return AppScaffold(
|
||||
appBar: AppBar(
|
||||
title: TextField(
|
||||
controller: _searchController,
|
||||
|
@ -1,7 +1,10 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:hooks_riverpod/hooks_riverpod.dart';
|
||||
import 'package:island/models/abuse_report.dart';
|
||||
import 'package:island/models/abuse_report_type.dart';
|
||||
import 'package:island/services/abuse_report_service.dart';
|
||||
import 'package:island/widgets/app_scaffold.dart';
|
||||
import 'package:styled_widget/styled_widget.dart';
|
||||
|
||||
class AbuseReportDetailScreen extends ConsumerStatefulWidget {
|
||||
final String reportId;
|
||||
@ -20,16 +23,15 @@ class _AbuseReportDetailScreenState
|
||||
@override
|
||||
void initState() {
|
||||
super.initState();
|
||||
_reportFuture =
|
||||
ref.read(abuseReportServiceProvider).getReport(widget.reportId);
|
||||
_reportFuture = ref
|
||||
.read(abuseReportServiceProvider)
|
||||
.getReport(widget.reportId);
|
||||
}
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return Scaffold(
|
||||
appBar: AppBar(
|
||||
title: const Text('Abuse Report Details'),
|
||||
),
|
||||
return AppScaffold(
|
||||
appBar: AppBar(title: const Text('Abuse Report Details')),
|
||||
body: FutureBuilder<SnAbuseReport>(
|
||||
future: _reportFuture,
|
||||
builder: (context, snapshot) {
|
||||
@ -44,15 +46,39 @@ class _AbuseReportDetailScreenState
|
||||
child: Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
children: [
|
||||
Text('Report ID: ${report.id}'),
|
||||
Text('Resource Identifier: ${report.resourceIdentifier}'),
|
||||
Text('Type: ${report.type}'),
|
||||
Text('Reason: ${report.reason}'),
|
||||
Text('Resolved At: ${report.resolvedAt}'),
|
||||
Text('Resolution: ${report.resolution}'),
|
||||
Text('Account ID: ${report.accountId}'),
|
||||
Text('Created At: ${report.createdAt}'),
|
||||
Text('Updated At: ${report.updatedAt}'),
|
||||
_buildDetailRow(context, 'Report ID', report.id),
|
||||
_buildDetailRow(
|
||||
context,
|
||||
'Resource Identifier',
|
||||
report.resourceIdentifier,
|
||||
),
|
||||
_buildDetailRow(
|
||||
context,
|
||||
'Type',
|
||||
AbuseReportType.fromValue(report.type).displayName,
|
||||
),
|
||||
_buildDetailRow(context, 'Reason', report.reason),
|
||||
_buildDetailRow(
|
||||
context,
|
||||
'Resolved At',
|
||||
report.resolvedAt?.toString() ?? 'N/A',
|
||||
),
|
||||
_buildDetailRow(
|
||||
context,
|
||||
'Resolution',
|
||||
report.resolution ?? 'N/A',
|
||||
),
|
||||
_buildDetailRow(context, 'Account ID', report.accountId),
|
||||
_buildDetailRow(
|
||||
context,
|
||||
'Created At',
|
||||
report.createdAt.toString(),
|
||||
),
|
||||
_buildDetailRow(
|
||||
context,
|
||||
'Updated At',
|
||||
report.updatedAt.toString(),
|
||||
),
|
||||
],
|
||||
),
|
||||
);
|
||||
@ -63,4 +89,17 @@ class _AbuseReportDetailScreenState
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
Widget _buildDetailRow(BuildContext context, String label, String value) {
|
||||
return Padding(
|
||||
padding: const EdgeInsets.symmetric(vertical: 8.0),
|
||||
child: Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
children: [
|
||||
Text(label, style: Theme.of(context).textTheme.titleMedium).bold(),
|
||||
Text(value, style: Theme.of(context).textTheme.bodyLarge),
|
||||
],
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
||||
|
@ -1,8 +1,13 @@
|
||||
import 'package:easy_localization/easy_localization.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:go_router/go_router.dart';
|
||||
import 'package:hooks_riverpod/hooks_riverpod.dart';
|
||||
import 'package:island/models/abuse_report.dart';
|
||||
import 'package:island/models/abuse_report_type.dart';
|
||||
import 'package:island/services/abuse_report_service.dart';
|
||||
import 'package:island/services/time.dart';
|
||||
import 'package:island/widgets/app_scaffold.dart';
|
||||
import 'package:island/widgets/safety/abuse_report_helper.dart';
|
||||
|
||||
class AbuseReportListScreen extends ConsumerStatefulWidget {
|
||||
const AbuseReportListScreen({super.key});
|
||||
@ -23,9 +28,13 @@ class _AbuseReportListScreenState extends ConsumerState<AbuseReportListScreen> {
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return Scaffold(
|
||||
appBar: AppBar(
|
||||
title: const Text('My Abuse Reports'),
|
||||
return AppScaffold(
|
||||
appBar: AppBar(title: Text('abuseReports').tr()),
|
||||
floatingActionButton: FloatingActionButton(
|
||||
child: const Icon(Icons.add),
|
||||
onPressed: () {
|
||||
showAbuseReportSheet(context, resourceIdentifier: 'unidentified');
|
||||
},
|
||||
),
|
||||
body: FutureBuilder<List<SnAbuseReport>>(
|
||||
future: _reportsFuture,
|
||||
@ -37,15 +46,100 @@ class _AbuseReportListScreenState extends ConsumerState<AbuseReportListScreen> {
|
||||
} else if (snapshot.hasData) {
|
||||
final reports = snapshot.data!;
|
||||
return ListView.builder(
|
||||
padding: EdgeInsets.zero,
|
||||
itemCount: reports.length,
|
||||
itemBuilder: (context, index) {
|
||||
final report = reports[index];
|
||||
return ListTile(
|
||||
title: Text(report.reason),
|
||||
subtitle: Text(report.id),
|
||||
onTap: () {
|
||||
context.push('/safety/reports/me/${report.id}');
|
||||
},
|
||||
return Card(
|
||||
elevation: 2,
|
||||
margin: const EdgeInsets.symmetric(
|
||||
horizontal: 16,
|
||||
vertical: 8,
|
||||
),
|
||||
child: InkWell(
|
||||
onTap: () {
|
||||
context.push('/safety/reports/me/${report.id}');
|
||||
},
|
||||
child: Padding(
|
||||
padding: const EdgeInsets.all(16.0),
|
||||
child: Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
children: [
|
||||
Text(
|
||||
report.reason,
|
||||
style: Theme.of(context).textTheme.titleMedium,
|
||||
),
|
||||
const SizedBox(height: 8),
|
||||
Row(
|
||||
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
||||
children: [
|
||||
Text(
|
||||
'ID',
|
||||
style: Theme.of(context).textTheme.bodySmall,
|
||||
),
|
||||
Text(
|
||||
report.id,
|
||||
style: Theme.of(context).textTheme.bodyMedium,
|
||||
),
|
||||
],
|
||||
),
|
||||
const SizedBox(height: 4),
|
||||
Row(
|
||||
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
||||
children: [
|
||||
Text(
|
||||
'Type',
|
||||
style: Theme.of(context).textTheme.bodySmall,
|
||||
),
|
||||
Text(
|
||||
AbuseReportType.fromValue(
|
||||
report.type,
|
||||
).displayName,
|
||||
style: Theme.of(context).textTheme.bodyMedium,
|
||||
),
|
||||
],
|
||||
),
|
||||
const SizedBox(height: 4),
|
||||
Row(
|
||||
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
||||
children: [
|
||||
Text(
|
||||
'Created at',
|
||||
style: Theme.of(context).textTheme.bodySmall,
|
||||
),
|
||||
Text(
|
||||
'${report.createdAt.formatRelative(context)} · ${report.createdAt.formatSystem()}',
|
||||
style: Theme.of(context).textTheme.bodyMedium,
|
||||
),
|
||||
],
|
||||
),
|
||||
const SizedBox(height: 4),
|
||||
Row(
|
||||
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
||||
children: [
|
||||
Text(
|
||||
'Status',
|
||||
style: Theme.of(context).textTheme.bodySmall,
|
||||
),
|
||||
Text(
|
||||
report.resolvedAt != null
|
||||
? 'Resolved'
|
||||
: 'Unresolved',
|
||||
style: Theme.of(
|
||||
context,
|
||||
).textTheme.bodyMedium?.copyWith(
|
||||
color:
|
||||
report.resolvedAt != null
|
||||
? Colors.green
|
||||
: Colors.orange,
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
),
|
||||
);
|
||||
},
|
||||
);
|
||||
|
Reference in New Issue
Block a user