1
0
mirror of https://github.com/immich-app/immich.git synced 2024-12-23 02:06:15 +02:00
immich/mobile/lib/utils/debounce.dart
shenlong e6c0f0e3aa
refactor(mobile): maplibre (#6087)
* chore: maplibre gl pubspec

* refactor(wip): maplibre for maps

* refactor(wip): dual pane + location button

* chore: remove flutter_map and deps

* refactor(wip): map zoom to location

* refactor: location picker

* open gallery_viewer on marker tap

* remove detectScaleGesture param

* test: debounce and throttle

* chore: rename get location method

* feat(mobile): Adds gps locator to map prompt for easy geolocation (#6282)

* Refactored get gps coords

* Use var for linter's sake, should handle errors better

* Cleanup

* Fix linter issues

* chore(dep): update maplibre to official lib

---------

Co-authored-by: shenlong-tanwen <139912620+shalong-tanwen@users.noreply.github.com>
Co-authored-by: Joshua Herrera <joshua.herrera227@gmail.com>
2024-01-15 09:26:13 -06:00

62 lines
1.5 KiB
Dart

import 'dart:async';
import 'package:flutter_hooks/flutter_hooks.dart';
/// Used to debounce function calls with the [interval] provided.
class Debouncer {
Debouncer({required this.interval});
final Duration interval;
Timer? _timer;
FutureOr<void> Function()? _lastAction;
void run(FutureOr<void> Function() action) {
_lastAction = action;
_timer?.cancel();
_timer = Timer(interval, _callAndRest);
}
void _callAndRest() {
_lastAction?.call();
_timer = null;
}
void dispose() {
_timer?.cancel();
_timer = null;
_lastAction = null;
}
}
/// Creates a [Debouncer] that will be disposed automatically. If no [interval] is provided, a
/// default interval of 300ms is used to debounce the function calls
Debouncer useDebouncer({
Duration interval = const Duration(milliseconds: 300),
List<Object?>? keys,
}) =>
use(_DebouncerHook(interval: interval, keys: keys));
class _DebouncerHook extends Hook<Debouncer> {
const _DebouncerHook({
required this.interval,
List<Object?>? keys,
}) : super(keys: keys);
final Duration interval;
@override
HookState<Debouncer, Hook<Debouncer>> createState() => _DebouncerHookState();
}
class _DebouncerHookState extends HookState<Debouncer, _DebouncerHook> {
late final debouncer = Debouncer(interval: hook.interval);
@override
Debouncer build(_) => debouncer;
@override
void dispose() => debouncer.dispose();
@override
String get debugLabel => 'useDebouncer';
}