Skip to content

Commit edd0ecb

Browse files
committed
Restore name/class after we're ready
1 parent 78bc539 commit edd0ecb

File tree

2 files changed

+24
-4
lines changed

2 files changed

+24
-4
lines changed

packages/react-dom-bindings/src/server/fizz-instruction-set/ReactDOMFizzInstructionSetInlineCodeStrings.js

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

packages/react-dom-bindings/src/server/fizz-instruction-set/ReactDOMFizzInstructionSetShared.js

Lines changed: 23 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -87,13 +87,21 @@ export function revealCompletedBoundariesWithViewTransitions(
8787
) {
8888
let shouldStartViewTransition = false;
8989
let autoNameIdx = 0;
90+
const restoreQueue = [];
9091
function applyViewTransitionName(element, classAttributeName) {
9192
const className = element.getAttribute(classAttributeName);
9293
if (!className || className === 'none') {
9394
return;
9495
}
96+
// Add any elements we apply a name to a queue to be reverted when we start.
97+
const elementStyle = element.style;
98+
restoreQueue.push(
99+
element,
100+
elementStyle['viewTransitionName'],
101+
elementStyle['viewTransitionClass'],
102+
);
95103
if (className !== 'auto') {
96-
element.style['viewTransitionClass'] = className;
104+
elementStyle['viewTransitionClass'] = className;
97105
}
98106
let name = element.getAttribute('vt-name');
99107
if (!name) {
@@ -103,7 +111,7 @@ export function revealCompletedBoundariesWithViewTransitions(
103111
const idPrefix = '';
104112
name = '\u00AB' + idPrefix + 'T' + autoNameIdx++ + '\u00BB';
105113
}
106-
element.style['viewTransitionName'] = name;
114+
elementStyle['viewTransitionName'] = name;
107115
shouldStartViewTransition = true;
108116
}
109117
try {
@@ -240,7 +248,19 @@ export function revealCompletedBoundariesWithViewTransitions(
240248
types: [], // TODO: Add a hard coded type for Suspense reveals.
241249
}));
242250
transition.ready.finally(() => {
243-
// TODO
251+
// Restore all the names/classes that we applied to what they were before.
252+
// We do it in reverse order in case there were duplicates so the first one wins.
253+
for (let i = restoreQueue.length - 3; i >= 0; i -= 3) {
254+
const element = restoreQueue[i];
255+
const elementStyle = element.style;
256+
const previousName = restoreQueue[i + 1];
257+
elementStyle['viewTransitionName'] = previousName;
258+
const previousClassName = restoreQueue[i + 1];
259+
elementStyle['viewTransitionClass'] = previousClassName;
260+
if (element.getAttribute('style') === '') {
261+
element.removeAttribute('style');
262+
}
263+
}
244264
});
245265
transition.finished.finally(() => {
246266
if (document['__reactViewTransition'] === transition) {

0 commit comments

Comments
 (0)