/* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this file, * You can obtain one at http://mozilla.org/MPL/2.0/. */ import { actionCreators as ac, actionTypes as at } from "common/Actions.mjs"; import { Base } from "content-src/components/Base/Base"; import { DetectUserSessionStart } from "content-src/lib/detect-user-session-start"; import { initStore } from "content-src/lib/init-store"; import { Provider } from "react-redux"; import React from "react"; import ReactDOM from "react-dom"; import { reducers } from "common/Reducers.sys.mjs"; export const NewTab = ({ store }) => ( ); function doRequestWhenReady() { // If this document has already gone into the background by the time we've reached // here, we can deprioritize the request until the event loop // frees up. If, however, the visibility changes, we then send the request. const doRequestPromise = new Promise(resolve => { let didRequest = false; let requestIdleCallbackId = 0; function doRequest() { if (!didRequest) { if (requestIdleCallbackId) { cancelIdleCallback(requestIdleCallbackId); } didRequest = true; resolve(); } } if (document.hidden) { requestIdleCallbackId = requestIdleCallback(doRequest); addEventListener("visibilitychange", doRequest, { once: true }); } else { resolve(); } }); return doRequestPromise; } export function renderWithoutState() { const store = initStore(reducers); new DetectUserSessionStart(store).sendEventOrAddListener(); doRequestWhenReady().then(() => { // If state events happened before we got here, we can request state again. store.dispatch(ac.AlsoToMain({ type: at.NEW_TAB_STATE_REQUEST })); // If we rendered without state, we don't need the startup cache. store.dispatch( ac.OnlyToMain({ type: at.NEW_TAB_STATE_REQUEST_WITHOUT_STARTUPCACHE }) ); }); ReactDOM.hydrate(, document.getElementById("root")); } export function renderCache(initialState) { const store = initStore(reducers, initialState); new DetectUserSessionStart(store).sendEventOrAddListener(); doRequestWhenReady().then(() => { // If state events happened before we got here, // we can notify main that we need updates. // The individual feeds know what state is not cached. store.dispatch( ac.OnlyToMain({ type: at.NEW_TAB_STATE_REQUEST_STARTUPCACHE }) ); }); ReactDOM.hydrate(, document.getElementById("root")); }