import debounce from 'lodash-es/debounce' import { toast } from '../../_utils/toast' const OFFLINE_DELAY = 5000 const NOTIFY_OFFLINE_LIMIT = 1 let notifyCount = 0 let offlineStyle = process.browser && document.getElementById('theOfflineStyle') // debounce to avoid notifying for a short connection issue const notifyOffline = debounce(() => { if (process.browser && !navigator.onLine && ++notifyCount <= NOTIFY_OFFLINE_LIMIT) { toast.say('You seem to be offline. You can still read toots while offline.') } }, OFFLINE_DELAY) export function onlineObservers (store) { if (!process.browser) { return } let meta = document.getElementById('theThemeColor') let oldTheme = meta.content store.observe('online', online => { // "only x" ensures the <style> tag does not have any effect offlineStyle.setAttribute('media', online ? 'only x' : 'all') if (online) { meta.content = oldTheme } else { let offlineThemeColor = window.__themeColors.offline if (meta.content !== offlineThemeColor) { oldTheme = meta.content } meta.content = offlineThemeColor notifyOffline() } }) window.addEventListener('offline', () => store.set({ online: false })) window.addEventListener('online', () => store.set({ online: true })) }