9
9
[status-im.ui.components.animation :as animation]
10
10
[status-im.utils.utils :as utils]
11
11
[status-im.utils.datetime :as datetime]
12
- [status-im.utils.platform :as platform]))
12
+ [status-im.utils.platform :as platform]
13
+ [taoensso.timbre :as log]))
13
14
14
15
(def connectivity-bar-height 36 )
15
16
(def neg-connectivity-bar-height (- connectivity-bar-height))
16
17
18
+ ; ; ui-connectivity-status delays
19
+ (def standard-delay 1000 )
20
+ (def long-delay 5000 )
21
+
22
+ ; ; millisec window from foreground\login within which use long delay
23
+ (def timewindow-for-long-delay 5000 )
24
+
17
25
(defn easing [direction n]
18
26
{:toValue n
19
27
:easing ((if (= :in direction)
@@ -175,50 +183,32 @@ all connectivity views (we have at least one view in home and one in chat)"
175
183
(defn propagate-status
176
184
" Smoothly propagate from :connectivity/status-properties subscription to
177
185
:ui-status-properties db. UI components will render based on :ui-status-properties"
178
- [{:keys [status-properties app-active-since ui-status-properties]}]
179
- (let [; ; enqueued or immediate?
180
- ; ; send immediately if we are transitioning to an offline state
181
- enqueue? (cond
182
- (and
183
- (or
184
- (nil? @enqueued-connectivity-status-properties)
185
- (:connected? @enqueued-connectivity-status-properties)
186
- (:connecting? @enqueued-connectivity-status-properties))
187
- (not
188
- (or (:connected? status-properties)
189
- (:connecting? status-properties))))
190
- false
191
-
192
- :else
193
- true )]
194
- (if enqueue?
195
- (when (or (and (nil? @enqueued-connectivity-status-properties)
196
- (not= status-properties ui-status-properties))
197
- (and (some? @enqueued-connectivity-status-properties)
198
- (not= status-properties @enqueued-connectivity-status-properties)))
199
- ; ; reset queued with new state and start a timer if not yet started
200
- (reset! enqueued-connectivity-status-properties status-properties)
201
- (when-not @timer
202
- (reset! timer (utils/set-timeout #(do
203
- (reset! timer nil )
204
- (when @enqueued-connectivity-status-properties
205
- (re-frame/dispatch [:set :connectivity/ui-status-properties @enqueued-connectivity-status-properties])
206
- (reset! enqueued-connectivity-status-properties nil )))
186
+ [{:keys [status-properties app-active-since logged-in-since ui-status-properties]}]
187
+ (when (or (and (nil? @enqueued-connectivity-status-properties)
188
+ (not= status-properties ui-status-properties))
189
+ (and (some? @enqueued-connectivity-status-properties)
190
+ (not= status-properties @enqueued-connectivity-status-properties)))
191
+ ; ; reset queued with new state and start a timer if not yet started
192
+ (reset! enqueued-connectivity-status-properties status-properties)
193
+ (when-not @timer
194
+ (reset! timer (utils/set-timeout #(do
195
+ (reset! timer nil )
196
+ (when @enqueued-connectivity-status-properties
197
+ (re-frame/dispatch [:set :connectivity/ui-status-properties @enqueued-connectivity-status-properties])
198
+ (reset! enqueued-connectivity-status-properties nil )))
207
199
208
- ; ; if the app is in foreground for less than 5s, postpone state changes for 5s otherwise 1s
209
- (if
210
- (and app-active-since
211
- (< (- (datetime/timestamp ) app-active-since)
212
- 5000 ))
213
- 5000
214
- 1000 )))))
215
- (when (not= status-properties ui-status-properties)
216
- ; ; send immediately
217
- (reset! enqueued-connectivity-status-properties nil )
218
- (re-frame/dispatch [:set :connectivity/ui-status-properties status-properties])
219
- (when @timer
220
- (utils/clear-timeout @timer)
221
- (reset! timer nil ))))))
200
+ ; ; timeout choice:
201
+ ; ; if the app is in foreground or logged-in for less than <timeframe>,
202
+ ; ; postpone state changes for <long> otherwise <short>
203
+ (let [ts (max
204
+ (or logged-in-since 0 )
205
+ (or app-active-since 0 ))
206
+ ts-diff (- (datetime/timestamp ) ts)
207
+ timeout (if (< ts-diff timewindow-for-long-delay)
208
+ long-delay
209
+ standard-delay)]
210
+ (log/debug " propagate-status set-timeout: " logged-in-since app-active-since ts-diff timeout)
211
+ timeout))))))
222
212
223
213
(defn status-propagator-dummy-view
224
214
" this empty view is needed to react propagate status-properties to ui-status-properties"
@@ -236,6 +226,7 @@ all connectivity views (we have at least one view in home and one in chat)"
236
226
(defview connectivity-view [anim-translate-y]
237
227
(letsubs [status-properties [:connectivity/status-properties ]
238
228
app-active-since [:app-active-since ]
229
+ logged-in-since [:logged-in-since ]
239
230
ui-status-properties [:connectivity/ui-status-properties ]
240
231
status-hidden (reagent/atom true )
241
232
view-id [:view-id ]
@@ -267,6 +258,7 @@ all connectivity views (we have at least one view in home and one in chat)"
267
258
status-hidden]
268
259
[status-propagator-dummy-view {:status-properties status-properties
269
260
:app-active-since app-active-since
261
+ :logged-in-since logged-in-since
270
262
:ui-status-properties ui-status-properties}]])))
271
263
272
264
; ; "push?" determines whether "content" gets pushed down when disconnected
0 commit comments