82 lines
3.1 KiB
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('이 기간을 별도 저장으로 나누기')),
|
|
),
|
|
]);
|
|
},
|
|
),
|
|
);
|
|
}
|
|
}
|