
ADAMANTヘッダーにローディングスピナーが表示されないことは、ユーザーが最新のチャットおよびメッセージ一覧を閲覧していることを保証します。スピナーは、インターネット接続がない場合、アクティブなADMノードがない場合、または有効化されたADMノードがない場合に表示されるべきです。
接続とアクティブなノードが存在する場合、システムはさらに確認を行います。新しいメッセージを受信したとき——つまり、それ以降に新しいメッセージが存在しない状態——chatActualUntilというタイムスタンプがストアに保存されます。
const chatsActualUntil = adamant.toTimestamp(nodeTimestamp) + INTERVAL + CHAT_ACTUALITY_BUFFER_MS
INTERVALは、RESTを通じて新しいチャットをポーリングする間隔を表しており、ソケット接続が利用可能かどうかに応じて変化します。
INTERVAL: (state, getters, rootState) => {
return rootState.options.useSocketConnection ? SOCKET_ENABLED_TIMEOUT : SOCKET_DISABLED_TIMEOUT
},
チャット画面およびチャット一覧画面では、chatActualUntilを監視し、フックchatActual = chatActualUntil > currentTimeを購読します。このフックは500ミリ秒ごとに実行され、新しいメッセージがなくてもchatActualUntilの値が変わっていなくてもスピナーを起動します。最終的に、インターネット接続がない、ノードがオンラインでない、または!chatActualがtrueと評価される場合にスピナーが表示されます。
アプリがバックグラウンドから復帰した場合でも、chatActualUntilに引き続き依存しているため、特別な調整は必要ありません。デバイスの時刻がチャット有効期間のタイムスタンプを超えると、ユーザーはスピナーを確認できます。最悪の場合、接続が失われたとき、ユーザーはスピナーを見ることができず、最大でINTERVAL + CHAT_ACTUALITY_BUFFER_MS秒の間、すべてが最新であると誤って判断する可能性があります。