frindlymap/lib/modules/ui/src/screens/archive_screen.dart

82 lines
3.1 KiB
Dart

import 'package:flutter/material.dart';
import 'package:friendly_map/modules/app/app.dart';
import 'package:friendly_map/modules/storage/storage.dart';
import '../app_scope.dart';
import '../theme.dart';
import '../widgets/async_view.dart';
import '../widgets/common.dart';
class _ArchiveData {
const _ArchiveData(this.span, this.advice);
final (int, int)? span;
final ArchiveAdvice advice;
}
/// 별도 저장: 지우지 않고 오래된 대화를 별도 저장으로 나눈다. 나눌 범위는 직접 고른다.
class ArchiveScreen extends StatefulWidget {
const ArchiveScreen({super.key, required this.roomId});
final String roomId;
@override
State<ArchiveScreen> createState() => _ArchiveScreenState();
}
class _ArchiveScreenState extends State<ArchiveScreen> {
RangeValues? _range;
Future<_ArchiveData> _load(FriendlyApp app) async =>
_ArchiveData(await app.settings.selectableSpan(widget.roomId), await app.settings.adviseRoom(widget.roomId));
Future<void> _archive(int from, int to) async {
final ok = await askConfirm(context, '별도 저장으로 나눌까요?',
'고른 기간의 대화가 별도 저장으로 옮겨져요. 지워지는 것은 아니고, 언제든 되돌릴 수 있어요.',
ok: '나누기');
if (!ok || !mounted) return;
final n = await AppScope.of(context).app.settings.archiveRange(widget.roomId, from, to);
if (!mounted) return;
showNote(context, '$n건을 별도 저장으로 나눴어요.');
setState(() => _range = null);
}
String _day(double v) {
final d = DateTime.fromMillisecondsSinceEpoch(v.round() * 10);
return '${d.year}.${d.month}.${d.day}';
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: const Text('별도 저장')),
body: AsyncView<_ArchiveData>(
load: _load,
builder: (context, d) {
final span = d.span;
if (span == null) return const EmptyNote('나눌 대화가 없어요.');
final lo = span.$1.toDouble(), hi = span.$2.toDouble();
final r = _range ?? RangeValues(lo, hi);
final kb = d.advice.textBytes ~/ 1024;
return ListView(padding: const EdgeInsets.all(16), children: [
Text('지금 이 방의 대화 크기: 약 $kb KB', style: const TextStyle(color: Pal.muted)),
const SizedBox(height: 16),
const Text('나눌 기간', style: TextStyle(fontWeight: FontWeight.w700)),
RangeSlider(
values: RangeValues(r.start.clamp(lo, hi), r.end.clamp(lo, hi)),
min: lo,
max: hi == lo ? lo + 1 : hi,
onChanged: (v) => setState(() => _range = v),
),
Row(mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [Text(_day(r.start)), Text(_day(r.end))]),
const SizedBox(height: 20),
SizedBox(
height: 52,
child: FilledButton(onPressed: () => _archive(r.start.round(), r.end.round()), child: const Text('이 기간을 별도 저장으로 나누기')),
),
]);
},
),
);
}
}