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 createState() => _ArchiveScreenState(); } class _ArchiveScreenState extends State { RangeValues? _range; Future<_ArchiveData> _load(FriendlyApp app) async => _ArchiveData(await app.settings.selectableSpan(widget.roomId), await app.settings.adviseRoom(widget.roomId)); Future _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('이 기간을 별도 저장으로 나누기')), ), ]); }, ), ); } }