From 2cc6652f75d021b4d2380e95bccfd5e9b456779e Mon Sep 17 00:00:00 2001 From: LittleSheep Date: Sat, 2 Aug 2025 15:35:18 +0800 Subject: [PATCH] :sparkles: Add audio from existing file --- assets/i18n/en-US.json | 2 +- lib/widgets/post/compose_recorder.dart | 25 +++++++++++++++++++++++++ lib/widgets/post/compose_toolbar.dart | 6 +++--- 3 files changed, 29 insertions(+), 4 deletions(-) diff --git a/assets/i18n/en-US.json b/assets/i18n/en-US.json index 80467f7..b68baf7 100644 --- a/assets/i18n/en-US.json +++ b/assets/i18n/en-US.json @@ -146,7 +146,7 @@ "edited": "Edited", "addVideo": "Add video", "addPhoto": "Add photo", - "addVoice": "Add your voice", + "addAudio": "Add audio", "addFile": "Add file", "recordAudio": "Record Audio", "linkAttachment": "Link Attachment", diff --git a/lib/widgets/post/compose_recorder.dart b/lib/widgets/post/compose_recorder.dart index 98c2d75..83727d7 100644 --- a/lib/widgets/post/compose_recorder.dart +++ b/lib/widgets/post/compose_recorder.dart @@ -2,12 +2,14 @@ import 'dart:async'; import 'dart:developer'; import 'package:easy_localization/easy_localization.dart'; +import 'package:file_picker/file_picker.dart'; import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:flutter_hooks/flutter_hooks.dart'; import 'package:gap/gap.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:island/services/time.dart'; +import 'package:island/widgets/alert.dart'; import 'package:island/widgets/content/sheet.dart'; import 'package:material_symbols_icons/symbols.dart'; import 'package:path_provider/path_provider.dart'; @@ -81,8 +83,31 @@ class ComposeRecorder extends HookConsumerWidget { if (context.mounted) Navigator.of(context).pop(resultPath.value); } + Future addExistingAudio() async { + var result = await FilePicker.platform.pickFiles( + type: FileType.custom, + allowedExtensions: ['mp3', 'm4a', 'wav', 'aac', 'flac', 'ogg', 'opus'], + onFileLoading: (status) { + if (!context.mounted) return; + if (status == FilePickerStatus.picking) { + showLoadingModal(context); + } else { + hideLoadingModal(context); + } + }, + ); + if (result == null || result.count == 0) return; + if (context.mounted) Navigator.of(context).pop(result.files.first.path); + } + return SheetScaffold( titleText: "recordAudio".tr(), + actions: [ + IconButton( + onPressed: addExistingAudio, + icon: const Icon(Symbols.upload), + ), + ], child: Column( crossAxisAlignment: CrossAxisAlignment.center, children: [ diff --git a/lib/widgets/post/compose_toolbar.dart b/lib/widgets/post/compose_toolbar.dart index 599c666..f433fab 100644 --- a/lib/widgets/post/compose_toolbar.dart +++ b/lib/widgets/post/compose_toolbar.dart @@ -24,7 +24,7 @@ class ComposeToolbar extends HookConsumerWidget { ComposeLogic.pickVideoMedia(ref, state); } - void addYourVoice() { + void addAudio() { ComposeLogic.recordAudioMedia(ref, state, context); } @@ -77,8 +77,8 @@ class ComposeToolbar extends HookConsumerWidget { color: colorScheme.primary, ), IconButton( - onPressed: addYourVoice, - tooltip: 'addYourVoice'.tr(), + onPressed: addAudio, + tooltip: 'addAudio'.tr(), icon: const Icon(Symbols.mic), color: colorScheme.primary, ),