Skip to content

ZCU-PUB/Backport: Fix home-page SSR->CSR flicker#1314

Open
jr-rk wants to merge 8 commits into
customer/zcu-pubfrom
zcu-pub/fe-fix-home-page-flicker
Open

ZCU-PUB/Backport: Fix home-page SSR->CSR flicker#1314
jr-rk wants to merge 8 commits into
customer/zcu-pubfrom
zcu-pub/fe-fix-home-page-flicker

Conversation

@jr-rk

@jr-rk jr-rk commented Jun 17, 2026

Copy link
Copy Markdown

Problem description

Backport from #1287

Analysis

(Write here, if there is needed describe some specific problem. Erase it, when it is not needed.)

Problems

(Write here, if some unexpected problems occur during solving issues. Erase it, when it is not needed.)

Sync verification

If en.json5 or cs.json5 translation files were updated:

  • Run yarn run sync-i18n -t src/assets/i18n/cs.json5 -i to synchronize messages, and changes are included in this PR.

Manual Testing (if applicable)

Copilot review

  • Requested review from Copilot

@jr-rk jr-rk self-assigned this Jun 17, 2026
@jr-rk jr-rk requested a review from Copilot June 17, 2026 13:16

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Backports an SSR→CSR anti-flicker mitigation by keeping the SSR-rendered DOM visible during Angular 15 client bootstrap, then removing the mask once the app becomes stable.

Changes:

  • Adds an inline “SSR overlay” script + styles in index.html to preserve SSR DOM and SSR-scoped styles during client bootstrap.
  • Hooks AppComponent into ApplicationRef.isStable to remove the overlay after first stable render (with a small paint pad).
  • Adds typings and unit tests for the injected window.__dspaceRemoveSsrOverlay global.

Reviewed changes

Copilot reviewed 3 out of 6 changed files in this pull request and generated 3 comments.

File Description
src/typings.d.ts Declares the Window.__dspaceRemoveSsrOverlay global injected by the bootstrap script.
src/index.html Adds overlay CSS + inline bootstrap script to preserve SSR DOM and styles until CSR is ready.
src/app/app.component.ts Removes the SSR overlay after ApplicationRef.isStable emits true.
src/app/app.component.spec.ts Tests overlay removal behavior and the no-op path when the global isn’t present.

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment thread src/app/app.component.spec.ts Outdated
Comment thread src/app/app.component.ts
Comment thread src/index.html Outdated
jr-rk and others added 2 commits June 18, 2026 11:09
The overlay remover bailed out via `if (!el) return;` before unhiding
<ds-app>, so if the overlay node went missing (browser extension, race,
external script) the app stayed visibility:hidden forever -> blank page,
plus the kept SSR styles leaked. Unhide the app and clean up the kept
styles unconditionally, before checking for the overlay node.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
_build.log and _spec.log are local deploy-tooling output that should
never have been tracked. Remove them and gitignore /_*.log.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@coderabbitai

coderabbitai Bot commented Jun 18, 2026

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on base/target branches other than the default branch.

Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: e4fc7e7d-3b81-48bf-9262-31b3e0458f18

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 3 out of 5 changed files in this pull request and generated 1 comment.

Comment thread src/app/app.component.spec.ts Outdated
jr-rk and others added 3 commits June 18, 2026 16:50
Make the ApplicationRef.isStable override in the removeSsrOverlayWhenStable
suite configurable and restore the original descriptor in afterEach, so the
patched observable can't leak onto the shared TestBed instance. Add a test
for the requestAnimationFrame-absent fallback branch of the remover.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Bind the custom eager theme to the CustomEagerThemeModule alias used by the
other customer backports so this file is byte-identical across instances.
The same ./custom/eager-theme.module is still imported eagerly - no runtime,
build, or bundle-size change; the custom theme stays eager (which also keeps
the untyped-item theming working, ref DSpace#1897).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
…ckports

Aligns ZCU-PUB's initial budget with the value the root fix (#1287) and the
other customer backports use, so the budget block is identical across
instances. The custom theme is already eager here, so this only widens the
headroom; the build already passes under the previous 5mb error ceiling.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Propagates VSB-TUO's fix #1317 to this instance. The overlay was removed when
ApplicationRef.isStable settled, but isStable can be delayed for seconds by
post-login admin zone activity (auth work, background polling, third-party
scripts) - during which the live app stays hidden under the SSR mask and the
page renders but is non-interactive (dataquest-dev/dspace-customers#725).

Switch removal to the same condition root.component.html uses to show real
content: !isAuthenticationBlocking && !isThemeLoading. Drop the now-unused
ApplicationRef injection and the 50ms pad; keep the 15s hard fallback as a
catastrophic safety net. Tests and the theme-service mock updated to match.

Ref: #1317

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@jr-rk

jr-rk commented Jun 20, 2026

Copy link
Copy Markdown
Author

Switched the SSR overlay-removal trigger from ApplicationRef.isStable to a content-visible signal (!isAuthenticationBlocking && !isThemeLoading), propagating VSB-TUO's fix #1317.

isStable can stay unsettled for seconds after login (esp. admin: background polling / zone tasks / third-party scripts), leaving the page rendered but non-interactive under the SSR mask — the bug VSB-TUO already hit (dataquest-dev/dspace-customers#725). Applied identically across TUL/SAV/ZCU-DATA/ZCU-PUB so the four stay unified.

@jr-rk jr-rk removed the request for review from milanmajchrak June 23, 2026 07:17
@jr-rk jr-rk closed this Jun 30, 2026
@jr-rk jr-rk reopened this Jun 30, 2026
Supersedes the #1317 content-visible trigger backported earlier. That gate
(!isAuthenticationBlocking && !isThemeLoading) still revealed a half-built page
on hard reload, so VSB-TUO's #1318/#1321 keep the snapshot until the routed
<ds-app> DOM has SETTLED (MutationObserver + quiet window, with a content
height / #main-content check and a 10s cap). The overlay is now a purely
visual mask, so the live app stays interactive underneath while it rebuilds
(closes dspace-customers#725 - "looks rendered but not clickable").

index.html, app.component.ts, spec and typings are synced to VSB-TUO's final
version; the VSB-only ngAfterViewInit delay(0) is omitted (these instances
don't carry it).

Ref: #1318, #1321

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@jr-rk

jr-rk commented Jun 30, 2026

Copy link
Copy Markdown
Author

Advanced the overlay code from the #1317 content-visible gate to VSB-TUO's final mechanism (#1318 + #1321).

The gate (!isAuthenticationBlocking && !isThemeLoading) still revealed a half-built page on hard reload. The final version keeps the SSR snapshot until the routed <ds-app> DOM has settled (MutationObserver + quiet window, content-height / #main-content check, 10s cap), and makes the overlay a purely visual mask so the live app stays interactive underneath (closes dspace-customers#725). Synced to VSB-TUO's final index.html / app.component.ts / spec / typings (the VSB-only delay(0) is omitted). Applied identically across TUL/SAV/ZCU-DATA/ZCU-PUB; tests green on 16.x + 18.x.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants