From 40c36c99cd34671854abd898f89decca49c5e1ef Mon Sep 17 00:00:00 2001 From: krawieck Date: Mon, 21 Sep 2020 01:00:38 +0200 Subject: [PATCH] rework debounce hook to be more friendly --- lib/hooks/debounce.dart | 29 ++++++++++----------------- lib/pages/add_instance.dart | 40 +++++++++++++------------------------ 2 files changed, 25 insertions(+), 44 deletions(-) diff --git a/lib/hooks/debounce.dart b/lib/hooks/debounce.dart index ce9065e..2be338b 100644 --- a/lib/hooks/debounce.dart +++ b/lib/hooks/debounce.dart @@ -6,18 +6,16 @@ import 'package:flutter_hooks/flutter_hooks.dart'; import 'ref.dart'; class Debounce { - final bool pending; final bool loading; - final void Function() start; - final void Function() cancel; - final void Function() reset; + final void Function() bounce; + + call() { + bounce(); + } const Debounce({ - @required this.pending, @required this.loading, - @required this.start, - @required this.cancel, - @required this.reset, + @required this.bounce, }); } @@ -25,33 +23,28 @@ class Debounce { /// and loading is triggered after [delayDuration]. /// Everything can be reset with [.cancel()] Debounce useDebounce( - Function(Function cancel) onDebounce, [ + Future Function() onDebounce, [ Duration delayDuration = const Duration(milliseconds: 500), ]) { final loading = useState(false); - final pending = useState(false); final timerHandle = useRef(null); cancel() { timerHandle.current?.cancel(); - pending.value = false; loading.value = false; } start() { - timerHandle.current = Timer(delayDuration, () { + timerHandle.current = Timer(delayDuration, () async { loading.value = true; - onDebounce(cancel); + await onDebounce(); + cancel(); }); - pending.value = true; } return Debounce( loading: loading.value, - pending: pending.value, - start: start, - cancel: cancel, - reset: () { + bounce: () { cancel(); start(); }); diff --git a/lib/pages/add_instance.dart b/lib/pages/add_instance.dart index 0f94b55..6776ee3 100644 --- a/lib/pages/add_instance.dart +++ b/lib/pages/add_instance.dart @@ -15,39 +15,27 @@ class AddInstancePage extends HookWidget { final instanceController = useTextEditingController(); useValueListenable(instanceController); final accountsStore = useAccountsStore(); - final delayedLoading = useDelayedLoading(Duration(milliseconds: 1000)); + final delayedLoading = useDelayedLoading(Duration(milliseconds: 500)); final isSite = useState(null); - final input = useState(''); final loading = useState(false); final icon = useState(null); - final debounce = useDebounce((cancel) async { - if (instanceController.text.isNotEmpty) { - try { - icon.value = - (await LemmyApi(instanceController.text).v1.getSite()).site.icon; - isSite.value = true; - } catch (e) { - isSite.value = false; - } - cancel(); + final debounce = useDebounce(() async { + if (instanceController.text.isEmpty) { + isSite.value = null; + return; + } + + try { + icon.value = + (await LemmyApi(instanceController.text).v1.getSite()).site.icon; + isSite.value = true; + } catch (e) { + isSite.value = false; } }); - onType() { - if (input.value != instanceController.text) { - isSite.value = null; - input.value = instanceController.text; - if (instanceController.text.isEmpty) { - debounce.reset(); - debounce.cancel(); - } else { - debounce.reset(); - } - } - } - - instanceController.addListener(onType); + instanceController.addListener(debounce); handleOnAdd() async { delayedLoading.start();