From ecb559f687f38f99e60226370b823be9103baa33 Mon Sep 17 00:00:00 2001 From: Salvatore Giordano Date: Mon, 1 Mar 2021 11:52:32 +0100 Subject: [PATCH] reduce calls to offlinestorage while uploading attachments using debounce --- packages/stream_chat/lib/src/api/channel.dart | 7 +++++- packages/stream_chat/lib/src/debounce.dart | 23 +++++++++++++++++++ packages/stream_chat_flutter/pubspec.yaml | 4 ++++ .../stream_chat_flutter_core/pubspec.yaml | 4 ++++ 4 files changed, 37 insertions(+), 1 deletion(-) create mode 100644 packages/stream_chat/lib/src/debounce.dart diff --git a/packages/stream_chat/lib/src/api/channel.dart b/packages/stream_chat/lib/src/api/channel.dart index 38f990b0..c45ec409 100644 --- a/packages/stream_chat/lib/src/api/channel.dart +++ b/packages/stream_chat/lib/src/api/channel.dart @@ -7,6 +7,7 @@ import 'package:dio/dio.dart'; import 'package:logging/logging.dart'; import 'package:rxdart/rxdart.dart'; import 'package:stream_chat/src/api/retry_queue.dart'; +import 'package:stream_chat/src/debounce.dart'; import 'package:stream_chat/src/event_type.dart'; import 'package:stream_chat/src/models/attachment_file.dart'; import 'package:stream_chat/src/models/channel_state.dart'; @@ -1685,7 +1686,11 @@ class ChannelClientState { set _channelState(ChannelState v) { _channelStateController.add(v); - _channel._client.chatPersistenceClient?.updateChannelState(v); + debounce( + timeout: Duration(milliseconds: 500), + target: _channel._client.chatPersistenceClient?.updateChannelState, + arguments: [v], + ); } /// The channel threads related to this channel diff --git a/packages/stream_chat/lib/src/debounce.dart b/packages/stream_chat/lib/src/debounce.dart new file mode 100644 index 00000000..c0375cf5 --- /dev/null +++ b/packages/stream_chat/lib/src/debounce.dart @@ -0,0 +1,23 @@ +import 'dart:async'; + +import 'package:meta/meta.dart'; + +/// Map of timeouts being debounced +Map timeouts = {}; + +/// Runs a function avoiding calling it too many times in a [timeoutMS] window +void debounce({ + @required Duration timeout, + @required Function target, + @required List arguments, +}) { + if (timeouts.containsKey(target)) { + timeouts[target].cancel(); + } + + final timer = Timer(timeout, () { + Function.apply(target, arguments); + }); + + timeouts[target] = timer; +} diff --git a/packages/stream_chat_flutter/pubspec.yaml b/packages/stream_chat_flutter/pubspec.yaml index 36b561da..8ad0cd12 100644 --- a/packages/stream_chat_flutter/pubspec.yaml +++ b/packages/stream_chat_flutter/pubspec.yaml @@ -48,6 +48,10 @@ dependencies: path_provider: ^1.6.27 video_thumbnail: ^0.2.5+1 +dependencies_override: + stream_chat_flutter_core: + path: ../stream_chat_flutter_core + flutter: assets: - images/ diff --git a/packages/stream_chat_flutter_core/pubspec.yaml b/packages/stream_chat_flutter_core/pubspec.yaml index 2896ece3..f9c9a650 100644 --- a/packages/stream_chat_flutter_core/pubspec.yaml +++ b/packages/stream_chat_flutter_core/pubspec.yaml @@ -15,6 +15,10 @@ dependencies: sdk: flutter rxdart: ^0.25.0 +dependencies_override: + stream_chat: + path: ../stream_chat + dev_dependencies: mockito: ^4.1.4 flutter_test: