mirror of
https://github.com/PR0M3TH3AN/bitvid.git
synced 2026-10-27 16:02:26 +00:00
Merge pull request #1901 from PR0M3TH3AN/codex/move-background-tasks-to-after-login
Defer login hydration loads and show profile list loading placeholders
This commit is contained in:
2 files changed
+114
-44
No files matched your search
@@ -3272,17 +3272,25 @@ class Application {
|
||||
);
|
||||
}
|
||||
|
||||
try {
|
||||
await this.nostrService.loadDirectMessages({
|
||||
actorPubkey: activePubkey,
|
||||
limit: 50,
|
||||
initialLoad: true,
|
||||
});
|
||||
} catch (error) {
|
||||
devLogger.warn(
|
||||
"[Application] Failed to sync direct messages during login:",
|
||||
error,
|
||||
);
|
||||
const activePubkey =
|
||||
this.normalizeHexPubkey(getActiveProfilePubkey()) || this.pubkey;
|
||||
if (
|
||||
activePubkey &&
|
||||
this.nostrService &&
|
||||
typeof this.nostrService.loadDirectMessages === "function"
|
||||
) {
|
||||
this.nostrService
|
||||
.loadDirectMessages({
|
||||
actorPubkey: activePubkey,
|
||||
limit: 50,
|
||||
initialLoad: true,
|
||||
})
|
||||
.catch((error) => {
|
||||
devLogger.warn(
|
||||
"[Application] Failed to sync direct messages during login:",
|
||||
error,
|
||||
);
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
@@ -4263,13 +4271,6 @@ class Application {
|
||||
devLogger.error("Post-login hydration failed:", error);
|
||||
});
|
||||
|
||||
let postLoginResult = null;
|
||||
try {
|
||||
postLoginResult = await postLoginPromise;
|
||||
} catch (error) {
|
||||
devLogger.error("Post-login processing failed:", error);
|
||||
}
|
||||
|
||||
await nwcPromise;
|
||||
// We do not await hashtagPreferencesPromise here; it loads in the background.
|
||||
|
||||
@@ -4282,6 +4283,26 @@ class Application {
|
||||
);
|
||||
}
|
||||
|
||||
const scheduleLoginRefresh = (reason) => {
|
||||
try {
|
||||
this.lastIdentityRefreshPromise = this.refreshAllVideoGrids({
|
||||
reason,
|
||||
forceMainReload: true,
|
||||
});
|
||||
return this.lastIdentityRefreshPromise;
|
||||
} catch (error) {
|
||||
devLogger.error("Failed to refresh video grids after login:", error);
|
||||
this.lastIdentityRefreshPromise = null;
|
||||
return null;
|
||||
}
|
||||
};
|
||||
|
||||
try {
|
||||
this.reinitializeVideoListView({ reason: "login" });
|
||||
} catch (error) {
|
||||
devLogger.warn("Failed to reinitialize video list view after login:", error);
|
||||
}
|
||||
|
||||
if (activePubkey) {
|
||||
const aggregatedBlacklist = accessControl.getBlacklist();
|
||||
|
||||
@@ -4314,16 +4335,40 @@ class Application {
|
||||
// If it times out, the UI will refresh reactively when the data arrives.
|
||||
const blockLoadPromise = userBlocks.ensureLoaded(activePubkey);
|
||||
const blockLoadTimeout = new Promise((resolve) =>
|
||||
setTimeout(resolve, 2000)
|
||||
setTimeout(() => resolve({ timedOut: true }), 2000)
|
||||
);
|
||||
try {
|
||||
await Promise.race([blockLoadPromise, blockLoadTimeout]);
|
||||
} catch (error) {
|
||||
devLogger.warn(
|
||||
"[Application] Block list load timed out or failed:",
|
||||
error
|
||||
);
|
||||
}
|
||||
|
||||
Promise.race([
|
||||
blockLoadPromise
|
||||
.then(() => ({ timedOut: false }))
|
||||
.catch((error) => ({ error })),
|
||||
blockLoadTimeout,
|
||||
])
|
||||
.then((result) => {
|
||||
if (result?.error) {
|
||||
devLogger.warn(
|
||||
"[Application] Block list load timed out or failed:",
|
||||
result.error
|
||||
);
|
||||
} else if (result?.timedOut) {
|
||||
devLogger.warn(
|
||||
"[Application] Block list load timed out:",
|
||||
result
|
||||
);
|
||||
}
|
||||
const refreshPromise = scheduleLoginRefresh("auth-login");
|
||||
if (refreshPromise && typeof refreshPromise.finally === "function") {
|
||||
refreshPromise.finally(() => {
|
||||
this.lastIdentityRefreshPromise = null;
|
||||
});
|
||||
} else {
|
||||
this.lastIdentityRefreshPromise = null;
|
||||
}
|
||||
})
|
||||
.catch((error) => {
|
||||
devLogger.error("Failed to refresh video grids after login:", error);
|
||||
this.lastIdentityRefreshPromise = null;
|
||||
});
|
||||
|
||||
// Load subscriptions in the background to avoid blocking the main feed.
|
||||
subscriptions.ensureLoaded(activePubkey).catch((error) => {
|
||||
@@ -4332,24 +4377,33 @@ class Application {
|
||||
error
|
||||
);
|
||||
});
|
||||
}
|
||||
|
||||
try {
|
||||
this.reinitializeVideoListView({ reason: "login", postLoginResult });
|
||||
} catch (error) {
|
||||
devLogger.warn("Failed to reinitialize video list view after login:", error);
|
||||
}
|
||||
|
||||
try {
|
||||
this.lastIdentityRefreshPromise = this.refreshAllVideoGrids({
|
||||
reason: "auth-login",
|
||||
forceMainReload: true,
|
||||
});
|
||||
await this.lastIdentityRefreshPromise;
|
||||
} catch (error) {
|
||||
devLogger.error("Failed to refresh video grids after login:", error);
|
||||
} finally {
|
||||
this.lastIdentityRefreshPromise = null;
|
||||
if (
|
||||
this.nostrService &&
|
||||
typeof this.nostrService.loadDirectMessages === "function"
|
||||
) {
|
||||
this.nostrService
|
||||
.loadDirectMessages({
|
||||
actorPubkey: activePubkey,
|
||||
limit: 50,
|
||||
initialLoad: true,
|
||||
})
|
||||
.catch((error) => {
|
||||
devLogger.warn(
|
||||
"[Application] Failed to sync direct messages during login:",
|
||||
error
|
||||
);
|
||||
});
|
||||
}
|
||||
} else {
|
||||
const refreshPromise = scheduleLoginRefresh("auth-login");
|
||||
if (refreshPromise && typeof refreshPromise.finally === "function") {
|
||||
refreshPromise.finally(() => {
|
||||
this.lastIdentityRefreshPromise = null;
|
||||
});
|
||||
} else {
|
||||
this.lastIdentityRefreshPromise = null;
|
||||
}
|
||||
}
|
||||
|
||||
this.forceRefreshAllProfiles();
|
||||
|
||||
@@ -8111,7 +8111,13 @@ export class ProfileModalController {
|
||||
|
||||
this.blockList.innerHTML = "";
|
||||
|
||||
const blocksLoaded = this.services.userBlocks?.loaded === true;
|
||||
if (!deduped.length) {
|
||||
if (this.blockListLoadingState === "loading" && !blocksLoaded) {
|
||||
this.blockListEmpty.classList.add("hidden");
|
||||
this.blockList.classList.add("hidden");
|
||||
return;
|
||||
}
|
||||
this.blockListEmpty.classList.remove("hidden");
|
||||
this.blockList.classList.add("hidden");
|
||||
if (this.blockListLoadingState === "loading") {
|
||||
@@ -8319,7 +8325,13 @@ export class ProfileModalController {
|
||||
|
||||
this.subscriptionList.innerHTML = "";
|
||||
|
||||
const subscriptionsLoaded = service.loaded === true;
|
||||
if (!deduped.length) {
|
||||
if (this.subscriptionsLoadingState === "loading" && !subscriptionsLoaded) {
|
||||
this.subscriptionListEmpty.classList.add("hidden");
|
||||
this.subscriptionList.classList.add("hidden");
|
||||
return;
|
||||
}
|
||||
this.subscriptionListEmpty.classList.remove("hidden");
|
||||
this.subscriptionList.classList.add("hidden");
|
||||
if (this.subscriptionsLoadingState === "loading") {
|
||||
@@ -12939,6 +12951,8 @@ export class ProfileModalController {
|
||||
|
||||
// Trigger aggressive parallel fetches
|
||||
if (activePubkey) {
|
||||
this.setBlockListLoadingState("loading");
|
||||
this.setSubscriptionsLoadingState("loading");
|
||||
if (this.services.userBlocks) {
|
||||
this.services.userBlocks.loadBlocks(activePubkey).catch(noop);
|
||||
}
|
||||
@@ -13004,6 +13018,8 @@ export class ProfileModalController {
|
||||
|
||||
this.profileSwitcherSelectionPubkey = null;
|
||||
this.renderSavedProfiles();
|
||||
this.setBlockListLoadingState("idle");
|
||||
this.setSubscriptionsLoadingState("idle");
|
||||
|
||||
try {
|
||||
await this.refreshAdminPaneState();
|
||||
|
||||
Reference in new issue
Block a user