lemmur-app-android/lib/hooks/debounce.dart

52 lines
1.0 KiB
Dart
Raw Normal View History

2020-09-20 20:00:48 +02:00
import 'dart:async';
import 'package:flutter/material.dart';
import 'package:flutter_hooks/flutter_hooks.dart';
import 'ref.dart';
class Debounce {
final bool loading;
2021-01-03 21:03:32 +01:00
final VoidCallback callback;
2020-09-20 20:00:48 +02:00
const Debounce({
@required this.loading,
2020-09-22 16:33:02 +02:00
@required this.callback,
2020-09-20 20:00:48 +02:00
});
2021-01-03 19:43:39 +01:00
void call() => callback();
2020-09-20 20:00:48 +02:00
}
2020-09-22 16:39:02 +02:00
/// will run `callback()` after debounce hook hasn't been called for the
/// specified `delayDuration`
2020-09-20 20:00:48 +02:00
Debounce useDebounce(
2021-01-03 21:03:32 +01:00
Future<void> Function() callback, [
Duration delayDuration = const Duration(seconds: 1),
2020-09-20 20:00:48 +02:00
]) {
final loading = useState(false);
final timerHandle = useRef<Timer>(null);
cancel() {
timerHandle.current?.cancel();
loading.value = false;
}
2020-09-24 16:26:24 +02:00
useEffect(() => () => timerHandle.current?.cancel(), []);
2020-09-20 20:00:48 +02:00
start() {
timerHandle.current = Timer(delayDuration, () async {
2020-09-20 20:00:48 +02:00
loading.value = true;
2020-09-22 13:50:54 +02:00
await callback();
cancel();
2020-09-20 20:00:48 +02:00
});
}
return Debounce(
loading: loading.value,
callback: () {
cancel();
start();
},
);
2020-09-20 20:00:48 +02:00
}