diff --git a/lib/features/recording/view-model/view_model_recording.dart b/lib/features/recording/view-model/view_model_recording.dart index e610ef5..da739d9 100644 --- a/lib/features/recording/view-model/view_model_recording.dart +++ b/lib/features/recording/view-model/view_model_recording.dart @@ -7,7 +7,6 @@ import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:permission_handler/permission_handler.dart'; import 'package:recording_tool/core/logging/app_logger.dart'; import 'package:recording_tool/core/permission/permission_service.dart'; -import 'package:recording_tool/core/utils/rate_limiter.dart'; import 'package:recording_tool/features/recording/model/model_clipboard.dart'; import 'package:recording_tool/features/recording/model/model_recording.dart'; import 'package:recording_tool/features/recording/model/model_recording_session.dart'; @@ -32,24 +31,17 @@ enum ClipboardReadResult { } class RecordingViewModel extends Notifier { - static const Duration _recordingActionInterval = Duration(milliseconds: 300); - static const Object _startRecordingThrottleKey = 'recording.session.start'; - static const Object _stopRecordingThrottleKey = 'recording.session.stop'; - static final _defaultClipboard = ClipboardRecordingModel( title: '', address: '', ); StreamSubscription? _statusSubscription; - final _rateLimit = RateLimitHub(); @override RecordingModel build() { ref.onDispose(_dispose); - return RecordingModel( - clipboardRecordingModel: _defaultClipboard, - ); + return RecordingModel(clipboardRecordingModel: _defaultClipboard); } void _updateSession( @@ -214,7 +206,9 @@ class RecordingViewModel extends Notifier { return const []; } - bool _isGalleryPermissionGranted(Map permissions) { + bool _isGalleryPermissionGranted( + Map permissions, + ) { for (final permission in _galleryPermissions()) { if (permissions[permission]?.isGranted ?? false) { return true; @@ -223,21 +217,7 @@ class RecordingViewModel extends Notifier { return _galleryPermissions().isEmpty; } - bool _tryAcquireRecordingAction(Object key) { - var executed = false; - _rateLimit.throttle( - key: key, - value: null, - duration: _recordingActionInterval, - options: const ThrottleOptions(leading: true, trailing: false), - onCallback: (_) => executed = true, - ); - return executed; - } - Future startRecording({bool enableDoNotDisturb = true}) async { - if (!_tryAcquireRecordingAction(_startRecordingThrottleKey)) return; - final session = state.session; if (!session.isPreviewReady || session.isRecording || @@ -277,8 +257,6 @@ class RecordingViewModel extends Notifier { } Future stopRecording() async { - if (!_tryAcquireRecordingAction(_stopRecordingThrottleKey)) return; - if (!state.session.isRecording) return; try { @@ -346,7 +324,6 @@ class RecordingViewModel extends Notifier { } Future _dispose() async { - _rateLimit.clear(); await _statusSubscription?.cancel(); } } diff --git a/lib/features/recording/widgets/widget_recording_hud.dart b/lib/features/recording/widgets/widget_recording_hud.dart index 36064f5..188c502 100644 --- a/lib/features/recording/widgets/widget_recording_hud.dart +++ b/lib/features/recording/widgets/widget_recording_hud.dart @@ -1,6 +1,7 @@ import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:permission_handler/permission_handler.dart'; +import 'package:recording_tool/core/utils/rate_limiter.dart'; import 'package:recording_tool/features/recording/model/model_recording_session.dart'; import 'package:recording_tool/features/recording/widgets/widget_clipboard_address_clock_chip.dart'; import 'package:recording_tool/features/recording/widgets/widget_recording_setup_hints.dart'; @@ -116,9 +117,23 @@ class RecordingHudWidget extends StatelessWidget { ? null : () async { if (state.isRecording) { - await onStop(); + RateLimit.instance.debounce( + key: 'recording.session.stop', + value: null, + duration: Duration(milliseconds: 300), + onCallback: (_) async { + await onStop(); + }, + ); } else { - await onStart(); + RateLimit.instance.debounce( + key: 'recording.session.start', + value: null, + duration: Duration(milliseconds: 300), + onCallback: (_) async { + await onStart(); + }, + ); } }, child: Container( @@ -126,10 +141,7 @@ class RecordingHudWidget extends StatelessWidget { height: _recordButtonSize, decoration: BoxDecoration( shape: BoxShape.circle, - border: Border.all( - color: Colors.white, - width: 4.r, - ), + border: Border.all(color: Colors.white, width: 4.r), color: state.isRecording ? Colors.white : Colors.red, ), child: Icon(