diff --git a/lib/ui/pages/backups/snapshot_id_list_tile.dart b/lib/ui/pages/backups/snapshot_id_list_tile.dart new file mode 100644 index 00000000..dc821264 --- /dev/null +++ b/lib/ui/pages/backups/snapshot_id_list_tile.dart @@ -0,0 +1,52 @@ +import 'dart:async'; + +import 'package:easy_localization/easy_localization.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; + +class SnapshotIdListTile extends StatefulWidget { + const SnapshotIdListTile({ + required this.snapshotId, + super.key, + }); + + final String snapshotId; + + @override + State createState() => _SnapshotIdListTileState(); +} + +class _SnapshotIdListTileState extends State { + bool copiedToClipboard = false; + + void handleTimeout() { + setState(() { + copiedToClipboard = false; + }); + } + + @override + Widget build(final BuildContext context) => ListTile( + onLongPress: () { + if (copiedToClipboard == false) { + Clipboard.setData(ClipboardData(text: widget.snapshotId)); + Timer(const Duration(seconds: 2), handleTimeout); + setState(() { + copiedToClipboard = true; + }); + } + }, + leading: Icon( + Icons.numbers_outlined, + color: Theme.of(context).colorScheme.onSurface, + ), + title: Text( + copiedToClipboard + ? 'basis.copied_to_clipboard'.tr() + : 'backup.snapshot_id_title'.tr(), + ), + subtitle: Text( + copiedToClipboard ? '' : widget.snapshotId, + ), + ); +} diff --git a/lib/ui/pages/backups/snapshot_modal.dart b/lib/ui/pages/backups/snapshot_modal.dart index 147fe72a..af9269e5 100644 --- a/lib/ui/pages/backups/snapshot_modal.dart +++ b/lib/ui/pages/backups/snapshot_modal.dart @@ -11,6 +11,7 @@ import 'package:selfprivacy/logic/models/service.dart'; import 'package:selfprivacy/ui/components/buttons/brand_button.dart'; import 'package:selfprivacy/ui/components/cards/outlined_card.dart'; import 'package:selfprivacy/ui/components/info_box/info_box.dart'; +import 'package:selfprivacy/ui/pages/backups/snapshot_id_list_tile.dart'; class SnapshotModal extends StatefulWidget { const SnapshotModal({ @@ -95,18 +96,7 @@ class _SnapshotModalState extends State { '${MaterialLocalizations.of(context).formatShortDate(widget.snapshot.time)} ${TimeOfDay.fromDateTime(widget.snapshot.time).format(context)}', ), ), - ListTile( - leading: Icon( - Icons.numbers_outlined, - color: Theme.of(context).colorScheme.onSurface, - ), - title: Text( - 'backup.snapshot_id_title'.tr(), - ), - subtitle: Text( - widget.snapshot.id, - ), - ), + SnapshotIdListTile(snapshotId: widget.snapshot.id), if (service != null) Column( children: [