Diff: STRATO-apps/wordpress_03/app/wp-includes/js/dist/vendor/react-dom.js

Keine Baseline-Datei – Diff nur gegen leer.
Zur Liste
1 -
1 + /**
2 + * @license React
3 + * react-dom.development.js
4 + *
5 + * Copyright (c) Facebook, Inc. and its affiliates.
6 + *
7 + * This source code is licensed under the MIT license found in the
8 + * LICENSE file in the root directory of this source tree.
9 + */
10 + (function (global, factory) {
11 + typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('react')) :
12 + typeof define === 'function' && define.amd ? define(['exports', 'react'], factory) :
13 + (global = global || self, factory(global.ReactDOM = {}, global.React));
14 + }(this, (function (exports, React) { 'use strict';
15 +
16 + var ReactSharedInternals = React.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED;
17 +
18 + var suppressWarning = false;
19 + function setSuppressWarning(newSuppressWarning) {
20 + {
21 + suppressWarning = newSuppressWarning;
22 + }
23 + } // In DEV, calls to console.warn and console.error get replaced
24 + // by calls to these methods by a Babel plugin.
25 + //
26 + // In PROD (or in packages without access to React internals),
27 + // they are left as they are instead.
28 +
29 + function warn(format) {
30 + {
31 + if (!suppressWarning) {
32 + for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
33 + args[_key - 1] = arguments[_key];
34 + }
35 +
36 + printWarning('warn', format, args);
37 + }
38 + }
39 + }
40 + function error(format) {
41 + {
42 + if (!suppressWarning) {
43 + for (var _len2 = arguments.length, args = new Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) {
44 + args[_key2 - 1] = arguments[_key2];
45 + }
46 +
47 + printWarning('error', format, args);
48 + }
49 + }
50 + }
51 +
52 + function printWarning(level, format, args) {
53 + // When changing this logic, you might want to also
54 + // update consoleWithStackDev.www.js as well.
55 + {
56 + var ReactDebugCurrentFrame = ReactSharedInternals.ReactDebugCurrentFrame;
57 + var stack = ReactDebugCurrentFrame.getStackAddendum();
58 +
59 + if (stack !== '') {
60 + format += '%s';
61 + args = args.concat([stack]);
62 + } // eslint-disable-next-line react-internal/safe-string-coercion
63 +
64 +
65 + var argsWithFormat = args.map(function (item) {
66 + return String(item);
67 + }); // Careful: RN currently depends on this prefix
68 +
69 + argsWithFormat.unshift('Warning: ' + format); // We intentionally don't use spread (or .apply) directly because it
70 + // breaks IE9: https://github.com/facebook/react/issues/13610
71 + // eslint-disable-next-line react-internal/no-production-logging
72 +
73 + Function.prototype.apply.call(console[level], console, argsWithFormat);
74 + }
75 + }
76 +
77 + var FunctionComponent = 0;
78 + var ClassComponent = 1;
79 + var IndeterminateComponent = 2; // Before we know whether it is function or class
80 +
81 + var HostRoot = 3; // Root of a host tree. Could be nested inside another node.
82 +
83 + var HostPortal = 4; // A subtree. Could be an entry point to a different renderer.
84 +
85 + var HostComponent = 5;
86 + var HostText = 6;
87 + var Fragment = 7;
88 + var Mode = 8;
89 + var ContextConsumer = 9;
90 + var ContextProvider = 10;
91 + var ForwardRef = 11;
92 + var Profiler = 12;
93 + var SuspenseComponent = 13;
94 + var MemoComponent = 14;
95 + var SimpleMemoComponent = 15;
96 + var LazyComponent = 16;
97 + var IncompleteClassComponent = 17;
98 + var DehydratedFragment = 18;
99 + var SuspenseListComponent = 19;
100 + var ScopeComponent = 21;
101 + var OffscreenComponent = 22;
102 + var LegacyHiddenComponent = 23;
103 + var CacheComponent = 24;
104 + var TracingMarkerComponent = 25;
105 +
106 + // -----------------------------------------------------------------------------
107 +
108 + var enableClientRenderFallbackOnTextMismatch = true; // TODO: Need to review this code one more time before landing
109 + // the react-reconciler package.
110 +
111 + var enableNewReconciler = false; // Support legacy Primer support on internal FB www
112 +
113 + var enableLazyContextPropagation = false; // FB-only usage. The new API has different semantics.
114 +
115 + var enableLegacyHidden = false; // Enables unstable_avoidThisFallback feature in Fiber
116 +
117 + var enableSuspenseAvoidThisFallback = false; // Enables unstable_avoidThisFallback feature in Fizz
118 + // React DOM Chopping Block
119 + //
120 + // Similar to main Chopping Block but only flags related to React DOM. These are
121 + // grouped because we will likely batch all of them into a single major release.
122 + // -----------------------------------------------------------------------------
123 + // Disable support for comment nodes as React DOM containers. Already disabled
124 + // in open source, but www codebase still relies on it. Need to remove.
125 +
126 + var disableCommentsAsDOMContainers = true; // Disable javascript: URL strings in href for XSS protection.
127 + // and client rendering, mostly to allow JSX attributes to apply to the custom
128 + // element's object properties instead of only HTML attributes.
129 + // https://github.com/facebook/react/issues/11347
130 +
131 + var enableCustomElementPropertySupport = false; // Disables children for <textarea> elements
132 + var warnAboutStringRefs = true; // -----------------------------------------------------------------------------
133 + // Debugging and DevTools
134 + // -----------------------------------------------------------------------------
135 + // Adds user timing marks for e.g. state updates, suspense, and work loop stuff,
136 + // for an experimental timeline tool.
137 +
138 + var enableSchedulingProfiler = true; // Helps identify side effects in render-phase lifecycle hooks and setState
139 +
140 + var enableProfilerTimer = true; // Record durations for commit and passive effects phases.
141 +
142 + var enableProfilerCommitHooks = true; // Phase param passed to onRender callback differentiates between an "update" and a "cascading-update".
143 +
144 + var allNativeEvents = new Set();
145 + /**
146 + * Mapping from registration name to event name
147 + */
148 +
149 +
150 + var registrationNameDependencies = {};
151 + /**
152 + * Mapping from lowercase registration names to the properly cased version,
153 + * used to warn in the case of missing event handlers. Available
154 + * only in true.
155 + * @type {Object}
156 + */
157 +
158 + var possibleRegistrationNames = {} ; // Trust the developer to only use possibleRegistrationNames in true
159 +
160 + function registerTwoPhaseEvent(registrationName, dependencies) {
161 + registerDirectEvent(registrationName, dependencies);
162 + registerDirectEvent(registrationName + 'Capture', dependencies);
163 + }
164 + function registerDirectEvent(registrationName, dependencies) {
165 + {
166 + if (registrationNameDependencies[registrationName]) {
167 + error('EventRegistry: More than one plugin attempted to publish the same ' + 'registration name, `%s`.', registrationName);
168 + }
169 + }
170 +
171 + registrationNameDependencies[registrationName] = dependencies;
172 +
173 + {
174 + var lowerCasedName = registrationName.toLowerCase();
175 + possibleRegistrationNames[lowerCasedName] = registrationName;
176 +
177 + if (registrationName === 'onDoubleClick') {
178 + possibleRegistrationNames.ondblclick = registrationName;
179 + }
180 + }
181 +
182 + for (var i = 0; i < dependencies.length; i++) {
183 + allNativeEvents.add(dependencies[i]);
184 + }
185 + }
186 +
187 + var canUseDOM = !!(typeof window !== 'undefined' && typeof window.document !== 'undefined' && typeof window.document.createElement !== 'undefined');
188 +
189 + var hasOwnProperty = Object.prototype.hasOwnProperty;
190 +
191 + /*
192 + * The `'' + value` pattern (used in in perf-sensitive code) throws for Symbol
193 + * and Temporal.* types. See https://github.com/facebook/react/pull/22064.
194 + *
195 + * The functions in this module will throw an easier-to-understand,
196 + * easier-to-debug exception with a clear errors message message explaining the
197 + * problem. (Instead of a confusing exception thrown inside the implementation
198 + * of the `value` object).
199 + */
200 + // $FlowFixMe only called in DEV, so void return is not possible.
201 + function typeName(value) {
202 + {
203 + // toStringTag is needed for namespaced types like Temporal.Instant
204 + var hasToStringTag = typeof Symbol === 'function' && Symbol.toStringTag;
205 + var type = hasToStringTag && value[Symbol.toStringTag] || value.constructor.name || 'Object';
206 + return type;
207 + }
208 + } // $FlowFixMe only called in DEV, so void return is not possible.
209 +
210 +
211 + function willCoercionThrow(value) {
212 + {
213 + try {
214 + testStringCoercion(value);
215 + return false;
216 + } catch (e) {
217 + return true;
218 + }
219 + }
220 + }
221 +
222 + function testStringCoercion(value) {
223 + // If you ended up here by following an exception call stack, here's what's
224 + // happened: you supplied an object or symbol value to React (as a prop, key,
225 + // DOM attribute, CSS property, string ref, etc.) and when React tried to
226 + // coerce it to a string using `'' + value`, an exception was thrown.
227 + //
228 + // The most common types that will cause this exception are `Symbol` instances
229 + // and Temporal objects like `Temporal.Instant`. But any object that has a
230 + // `valueOf` or `[Symbol.toPrimitive]` method that throws will also cause this
231 + // exception. (Library authors do this to prevent users from using built-in
232 + // numeric operators like `+` or comparison operators like `>=` because custom
233 + // methods are needed to perform accurate arithmetic or comparison.)
234 + //
235 + // To fix the problem, coerce this object or symbol value to a string before
236 + // passing it to React. The most reliable way is usually `String(value)`.
237 + //
238 + // To find which value is throwing, check the browser or debugger console.
239 + // Before this exception was thrown, there should be `console.error` output
240 + // that shows the type (Symbol, Temporal.PlainDate, etc.) that caused the
241 + // problem and how that type was used: key, atrribute, input value prop, etc.
242 + // In most cases, this console output also shows the component and its
243 + // ancestor components where the exception happened.
244 + //
245 + // eslint-disable-next-line react-internal/safe-string-coercion
246 + return '' + value;
247 + }
248 +
249 + function checkAttributeStringCoercion(value, attributeName) {
250 + {
251 + if (willCoercionThrow(value)) {
252 + error('The provided `%s` attribute is an unsupported type %s.' + ' This value must be coerced to a string before before using it here.', attributeName, typeName(value));
253 +
254 + return testStringCoercion(value); // throw (to help callers find troubleshooting comments)
255 + }
256 + }
257 + }
258 + function checkKeyStringCoercion(value) {
259 + {
260 + if (willCoercionThrow(value)) {
261 + error('The provided key is an unsupported type %s.' + ' This value must be coerced to a string before before using it here.', typeName(value));
262 +
263 + return testStringCoercion(value); // throw (to help callers find troubleshooting comments)
264 + }
265 + }
266 + }
267 + function checkPropStringCoercion(value, propName) {
268 + {
269 + if (willCoercionThrow(value)) {
270 + error('The provided `%s` prop is an unsupported type %s.' + ' This value must be coerced to a string before before using it here.', propName, typeName(value));
271 +
272 + return testStringCoercion(value); // throw (to help callers find troubleshooting comments)
273 + }
274 + }
275 + }
276 + function checkCSSPropertyStringCoercion(value, propName) {
277 + {
278 + if (willCoercionThrow(value)) {
279 + error('The provided `%s` CSS property is an unsupported type %s.' + ' This value must be coerced to a string before before using it here.', propName, typeName(value));
280 +
281 + return testStringCoercion(value); // throw (to help callers find troubleshooting comments)
282 + }
283 + }
284 + }
285 + function checkHtmlStringCoercion(value) {
286 + {
287 + if (willCoercionThrow(value)) {
288 + error('The provided HTML markup uses a value of unsupported type %s.' + ' This value must be coerced to a string before before using it here.', typeName(value));
289 +
290 + return testStringCoercion(value); // throw (to help callers find troubleshooting comments)
291 + }
292 + }
293 + }
294 + function checkFormFieldValueStringCoercion(value) {
295 + {
296 + if (willCoercionThrow(value)) {
297 + error('Form field values (value, checked, defaultValue, or defaultChecked props)' + ' must be strings, not %s.' + ' This value must be coerced to a string before before using it here.', typeName(value));
298 +
299 + return testStringCoercion(value); // throw (to help callers find troubleshooting comments)
300 + }
301 + }
302 + }
303 +
304 + // A reserved attribute.
305 + // It is handled by React separately and shouldn't be written to the DOM.
306 + var RESERVED = 0; // A simple string attribute.
307 + // Attributes that aren't in the filter are presumed to have this type.
308 +
309 + var STRING = 1; // A string attribute that accepts booleans in React. In HTML, these are called
310 + // "enumerated" attributes with "true" and "false" as possible values.
311 + // When true, it should be set to a "true" string.
312 + // When false, it should be set to a "false" string.
313 +
314 + var BOOLEANISH_STRING = 2; // A real boolean attribute.
315 + // When true, it should be present (set either to an empty string or its name).
316 + // When false, it should be omitted.
317 +
318 + var BOOLEAN = 3; // An attribute that can be used as a flag as well as with a value.
319 + // When true, it should be present (set either to an empty string or its name).
320 + // When false, it should be omitted.
321 + // For any other value, should be present with that value.
322 +
323 + var OVERLOADED_BOOLEAN = 4; // An attribute that must be numeric or parse as a numeric.
324 + // When falsy, it should be removed.
325 +
326 + var NUMERIC = 5; // An attribute that must be positive numeric or parse as a positive numeric.
327 + // When falsy, it should be removed.
328 +
329 + var POSITIVE_NUMERIC = 6;
330 +
331 + /* eslint-disable max-len */
332 + var ATTRIBUTE_NAME_START_CHAR = ":A-Z_a-z\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u02FF\\u0370-\\u037D\\u037F-\\u1FFF\\u200C-\\u200D\\u2070-\\u218F\\u2C00-\\u2FEF\\u3001-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFFD";
333 + /* eslint-enable max-len */
334 +
335 + var ATTRIBUTE_NAME_CHAR = ATTRIBUTE_NAME_START_CHAR + "\\-.0-9\\u00B7\\u0300-\\u036F\\u203F-\\u2040";
336 + var VALID_ATTRIBUTE_NAME_REGEX = new RegExp('^[' + ATTRIBUTE_NAME_START_CHAR + '][' + ATTRIBUTE_NAME_CHAR + ']*$');
337 + var illegalAttributeNameCache = {};
338 + var validatedAttributeNameCache = {};
339 + function isAttributeNameSafe(attributeName) {
340 + if (hasOwnProperty.call(validatedAttributeNameCache, attributeName)) {
341 + return true;
342 + }
343 +
344 + if (hasOwnProperty.call(illegalAttributeNameCache, attributeName)) {
345 + return false;
346 + }
347 +
348 + if (VALID_ATTRIBUTE_NAME_REGEX.test(attributeName)) {
349 + validatedAttributeNameCache[attributeName] = true;
350 + return true;
351 + }
352 +
353 + illegalAttributeNameCache[attributeName] = true;
354 +
355 + {
356 + error('Invalid attribute name: `%s`', attributeName);
357 + }
358 +
359 + return false;
360 + }
361 + function shouldIgnoreAttribute(name, propertyInfo, isCustomComponentTag) {
362 + if (propertyInfo !== null) {
363 + return propertyInfo.type === RESERVED;
364 + }
365 +
366 + if (isCustomComponentTag) {
367 + return false;
368 + }
369 +
370 + if (name.length > 2 && (name[0] === 'o' || name[0] === 'O') && (name[1] === 'n' || name[1] === 'N')) {
371 + return true;
372 + }
373 +
374 + return false;
375 + }
376 + function shouldRemoveAttributeWithWarning(name, value, propertyInfo, isCustomComponentTag) {
377 + if (propertyInfo !== null && propertyInfo.type === RESERVED) {
378 + return false;
379 + }
380 +
381 + switch (typeof value) {
382 + case 'function': // $FlowIssue symbol is perfectly valid here
383 +
384 + case 'symbol':
385 + // eslint-disable-line
386 + return true;
387 +
388 + case 'boolean':
389 + {
390 + if (isCustomComponentTag) {
391 + return false;
392 + }
393 +
394 + if (propertyInfo !== null) {
395 + return !propertyInfo.acceptsBooleans;
396 + } else {
397 + var prefix = name.toLowerCase().slice(0, 5);
398 + return prefix !== 'data-' && prefix !== 'aria-';
399 + }
400 + }
401 +
402 + default:
403 + return false;
404 + }
405 + }
406 + function shouldRemoveAttribute(name, value, propertyInfo, isCustomComponentTag) {
407 + if (value === null || typeof value === 'undefined') {
408 + return true;
409 + }
410 +
411 + if (shouldRemoveAttributeWithWarning(name, value, propertyInfo, isCustomComponentTag)) {
412 + return true;
413 + }
414 +
415 + if (isCustomComponentTag) {
416 +
417 + return false;
418 + }
419 +
420 + if (propertyInfo !== null) {
421 +
422 + switch (propertyInfo.type) {
423 + case BOOLEAN:
424 + return !value;
425 +
426 + case OVERLOADED_BOOLEAN:
427 + return value === false;
428 +
429 + case NUMERIC:
430 + return isNaN(value);
431 +
432 + case POSITIVE_NUMERIC:
433 + return isNaN(value) || value < 1;
434 + }
435 + }
436 +
437 + return false;
438 + }
439 + function getPropertyInfo(name) {
440 + return properties.hasOwnProperty(name) ? properties[name] : null;
441 + }
442 +
443 + function PropertyInfoRecord(name, type, mustUseProperty, attributeName, attributeNamespace, sanitizeURL, removeEmptyString) {
444 + this.acceptsBooleans = type === BOOLEANISH_STRING || type === BOOLEAN || type === OVERLOADED_BOOLEAN;
445 + this.attributeName = attributeName;
446 + this.attributeNamespace = attributeNamespace;
447 + this.mustUseProperty = mustUseProperty;
448 + this.propertyName = name;
449 + this.type = type;
450 + this.sanitizeURL = sanitizeURL;
451 + this.removeEmptyString = removeEmptyString;
452 + } // When adding attributes to this list, be sure to also add them to
453 + // the `possibleStandardNames` module to ensure casing and incorrect
454 + // name warnings.
455 +
456 +
457 + var properties = {}; // These props are reserved by React. They shouldn't be written to the DOM.
458 +
459 + var reservedProps = ['children', 'dangerouslySetInnerHTML', // TODO: This prevents the assignment of defaultValue to regular
460 + // elements (not just inputs). Now that ReactDOMInput assigns to the
461 + // defaultValue property -- do we need this?
462 + 'defaultValue', 'defaultChecked', 'innerHTML', 'suppressContentEditableWarning', 'suppressHydrationWarning', 'style'];
463 +
464 + reservedProps.forEach(function (name) {
465 + properties[name] = new PropertyInfoRecord(name, RESERVED, false, // mustUseProperty
466 + name, // attributeName
467 + null, // attributeNamespace
468 + false, // sanitizeURL
469 + false);
470 + }); // A few React string attributes have a different name.
471 + // This is a mapping from React prop names to the attribute names.
472 +
473 + [['acceptCharset', 'accept-charset'], ['className', 'class'], ['htmlFor', 'for'], ['httpEquiv', 'http-equiv']].forEach(function (_ref) {
474 + var name = _ref[0],
475 + attributeName = _ref[1];
476 + properties[name] = new PropertyInfoRecord(name, STRING, false, // mustUseProperty
477 + attributeName, // attributeName
478 + null, // attributeNamespace
479 + false, // sanitizeURL
480 + false);
481 + }); // These are "enumerated" HTML attributes that accept "true" and "false".
482 + // In React, we let users pass `true` and `false` even though technically
483 + // these aren't boolean attributes (they are coerced to strings).
484 +
485 + ['contentEditable', 'draggable', 'spellCheck', 'value'].forEach(function (name) {
486 + properties[name] = new PropertyInfoRecord(name, BOOLEANISH_STRING, false, // mustUseProperty
487 + name.toLowerCase(), // attributeName
488 + null, // attributeNamespace
489 + false, // sanitizeURL
490 + false);
491 + }); // These are "enumerated" SVG attributes that accept "true" and "false".
492 + // In React, we let users pass `true` and `false` even though technically
493 + // these aren't boolean attributes (they are coerced to strings).
494 + // Since these are SVG attributes, their attribute names are case-sensitive.
495 +
496 + ['autoReverse', 'externalResourcesRequired', 'focusable', 'preserveAlpha'].forEach(function (name) {
497 + properties[name] = new PropertyInfoRecord(name, BOOLEANISH_STRING, false, // mustUseProperty
498 + name, // attributeName
499 + null, // attributeNamespace
500 + false, // sanitizeURL
501 + false);
502 + }); // These are HTML boolean attributes.
503 +
504 + ['allowFullScreen', 'async', // Note: there is a special case that prevents it from being written to the DOM
505 + // on the client side because the browsers are inconsistent. Instead we call focus().
506 + 'autoFocus', 'autoPlay', 'controls', 'default', 'defer', 'disabled', 'disablePictureInPicture', 'disableRemotePlayback', 'formNoValidate', 'hidden', 'loop', 'noModule', 'noValidate', 'open', 'playsInline', 'readOnly', 'required', 'reversed', 'scoped', 'seamless', // Microdata
507 + 'itemScope'].forEach(function (name) {
508 + properties[name] = new PropertyInfoRecord(name, BOOLEAN, false, // mustUseProperty
509 + name.toLowerCase(), // attributeName
510 + null, // attributeNamespace
511 + false, // sanitizeURL
512 + false);
513 + }); // These are the few React props that we set as DOM properties
514 + // rather than attributes. These are all booleans.
515 +
516 + ['checked', // Note: `option.selected` is not updated if `select.multiple` is
517 + // disabled with `removeAttribute`. We have special logic for handling this.
518 + 'multiple', 'muted', 'selected' // NOTE: if you add a camelCased prop to this list,
519 + // you'll need to set attributeName to name.toLowerCase()
520 + // instead in the assignment below.
521 + ].forEach(function (name) {
522 + properties[name] = new PropertyInfoRecord(name, BOOLEAN, true, // mustUseProperty
523 + name, // attributeName
524 + null, // attributeNamespace
525 + false, // sanitizeURL
526 + false);
527 + }); // These are HTML attributes that are "overloaded booleans": they behave like
528 + // booleans, but can also accept a string value.
529 +
530 + ['capture', 'download' // NOTE: if you add a camelCased prop to this list,
531 + // you'll need to set attributeName to name.toLowerCase()
532 + // instead in the assignment below.
533 + ].forEach(function (name) {
534 + properties[name] = new PropertyInfoRecord(name, OVERLOADED_BOOLEAN, false, // mustUseProperty
535 + name, // attributeName
536 + null, // attributeNamespace
537 + false, // sanitizeURL
538 + false);
539 + }); // These are HTML attributes that must be positive numbers.
540 +
541 + ['cols', 'rows', 'size', 'span' // NOTE: if you add a camelCased prop to this list,
542 + // you'll need to set attributeName to name.toLowerCase()
543 + // instead in the assignment below.
544 + ].forEach(function (name) {
545 + properties[name] = new PropertyInfoRecord(name, POSITIVE_NUMERIC, false, // mustUseProperty
546 + name, // attributeName
547 + null, // attributeNamespace
548 + false, // sanitizeURL
549 + false);
550 + }); // These are HTML attributes that must be numbers.
551 +
552 + ['rowSpan', 'start'].forEach(function (name) {
553 + properties[name] = new PropertyInfoRecord(name, NUMERIC, false, // mustUseProperty
554 + name.toLowerCase(), // attributeName
555 + null, // attributeNamespace
556 + false, // sanitizeURL
557 + false);
558 + });
559 + var CAMELIZE = /[\-\:]([a-z])/g;
560 +
561 + var capitalize = function (token) {
562 + return token[1].toUpperCase();
563 + }; // This is a list of all SVG attributes that need special casing, namespacing,
564 + // or boolean value assignment. Regular attributes that just accept strings
565 + // and have the same names are omitted, just like in the HTML attribute filter.
566 + // Some of these attributes can be hard to find. This list was created by
567 + // scraping the MDN documentation.
568 +
569 +
570 + ['accent-height', 'alignment-baseline', 'arabic-form', 'baseline-shift', 'cap-height', 'clip-path', 'clip-rule', 'color-interpolation', 'color-interpolation-filters', 'color-profile', 'color-rendering', 'dominant-baseline', 'enable-background', 'fill-opacity', 'fill-rule', 'flood-color', 'flood-opacity', 'font-family', 'font-size', 'font-size-adjust', 'font-stretch', 'font-style', 'font-variant', 'font-weight', 'glyph-name', 'glyph-orientation-horizontal', 'glyph-orientation-vertical', 'horiz-adv-x', 'horiz-origin-x', 'image-rendering', 'letter-spacing', 'lighting-color', 'marker-end', 'marker-mid', 'marker-start', 'overline-position', 'overline-thickness', 'paint-order', 'panose-1', 'pointer-events', 'rendering-intent', 'shape-rendering', 'stop-color', 'stop-opacity', 'strikethrough-position', 'strikethrough-thickness', 'stroke-dasharray', 'stroke-dashoffset', 'stroke-linecap', 'stroke-linejoin', 'stroke-miterlimit', 'stroke-opacity', 'stroke-width', 'text-anchor', 'text-decoration', 'text-rendering', 'underline-position', 'underline-thickness', 'unicode-bidi', 'unicode-range', 'units-per-em', 'v-alphabetic', 'v-hanging', 'v-ideographic', 'v-mathematical', 'vector-effect', 'vert-adv-y', 'vert-origin-x', 'vert-origin-y', 'word-spacing', 'writing-mode', 'xmlns:xlink', 'x-height' // NOTE: if you add a camelCased prop to this list,
571 + // you'll need to set attributeName to name.toLowerCase()
572 + // instead in the assignment below.
573 + ].forEach(function (attributeName) {
574 + var name = attributeName.replace(CAMELIZE, capitalize);
575 + properties[name] = new PropertyInfoRecord(name, STRING, false, // mustUseProperty
576 + attributeName, null, // attributeNamespace
577 + false, // sanitizeURL
578 + false);
579 + }); // String SVG attributes with the xlink namespace.
580 +
581 + ['xlink:actuate', 'xlink:arcrole', 'xlink:role', 'xlink:show', 'xlink:title', 'xlink:type' // NOTE: if you add a camelCased prop to this list,
582 + // you'll need to set attributeName to name.toLowerCase()
583 + // instead in the assignment below.
584 + ].forEach(function (attributeName) {
585 + var name = attributeName.replace(CAMELIZE, capitalize);
586 + properties[name] = new PropertyInfoRecord(name, STRING, false, // mustUseProperty
587 + attributeName, 'http://www.w3.org/1999/xlink', false, // sanitizeURL
588 + false);
589 + }); // String SVG attributes with the xml namespace.
590 +
591 + ['xml:base', 'xml:lang', 'xml:space' // NOTE: if you add a camelCased prop to this list,
592 + // you'll need to set attributeName to name.toLowerCase()
593 + // instead in the assignment below.
594 + ].forEach(function (attributeName) {
595 + var name = attributeName.replace(CAMELIZE, capitalize);
596 + properties[name] = new PropertyInfoRecord(name, STRING, false, // mustUseProperty
597 + attributeName, 'http://www.w3.org/XML/1998/namespace', false, // sanitizeURL
598 + false);
599 + }); // These attribute exists both in HTML and SVG.
600 + // The attribute name is case-sensitive in SVG so we can't just use
601 + // the React name like we do for attributes that exist only in HTML.
602 +
603 + ['tabIndex', 'crossOrigin'].forEach(function (attributeName) {
604 + properties[attributeName] = new PropertyInfoRecord(attributeName, STRING, false, // mustUseProperty
605 + attributeName.toLowerCase(), // attributeName
606 + null, // attributeNamespace
607 + false, // sanitizeURL
608 + false);
609 + }); // These attributes accept URLs. These must not allow javascript: URLS.
610 + // These will also need to accept Trusted Types object in the future.
611 +
612 + var xlinkHref = 'xlinkHref';
613 + properties[xlinkHref] = new PropertyInfoRecord('xlinkHref', STRING, false, // mustUseProperty
614 + 'xlink:href', 'http://www.w3.org/1999/xlink', true, // sanitizeURL
615 + false);
616 + ['src', 'href', 'action', 'formAction'].forEach(function (attributeName) {
617 + properties[attributeName] = new PropertyInfoRecord(attributeName, STRING, false, // mustUseProperty
618 + attributeName.toLowerCase(), // attributeName
619 + null, // attributeNamespace
620 + true, // sanitizeURL
621 + true);
622 + });
623 +
624 + // and any newline or tab are filtered out as if they're not part of the URL.
625 + // https://url.spec.whatwg.org/#url-parsing
626 + // Tab or newline are defined as \r\n\t:
627 + // https://infra.spec.whatwg.org/#ascii-tab-or-newline
628 + // A C0 control is a code point in the range \u0000 NULL to \u001F
629 + // INFORMATION SEPARATOR ONE, inclusive:
630 + // https://infra.spec.whatwg.org/#c0-control-or-space
631 +
632 + /* eslint-disable max-len */
633 +
634 + var isJavaScriptProtocol = /^[\u0000-\u001F ]*j[\r\n\t]*a[\r\n\t]*v[\r\n\t]*a[\r\n\t]*s[\r\n\t]*c[\r\n\t]*r[\r\n\t]*i[\r\n\t]*p[\r\n\t]*t[\r\n\t]*\:/i;
635 + var didWarn = false;
636 +
637 + function sanitizeURL(url) {
638 + {
639 + if (!didWarn && isJavaScriptProtocol.test(url)) {
640 + didWarn = true;
641 +
642 + error('A future version of React will block javascript: URLs as a security precaution. ' + 'Use event handlers instead if you can. If you need to generate unsafe HTML try ' + 'using dangerouslySetInnerHTML instead. React was passed %s.', JSON.stringify(url));
643 + }
644 + }
645 + }
646 +
647 + /**
648 + * Get the value for a property on a node. Only used in DEV for SSR validation.
649 + * The "expected" argument is used as a hint of what the expected value is.
650 + * Some properties have multiple equivalent values.
651 + */
652 + function getValueForProperty(node, name, expected, propertyInfo) {
653 + {
654 + if (propertyInfo.mustUseProperty) {
655 + var propertyName = propertyInfo.propertyName;
656 + return node[propertyName];
657 + } else {
658 + // This check protects multiple uses of `expected`, which is why the
659 + // react-internal/safe-string-coercion rule is disabled in several spots
660 + // below.
661 + {
662 + checkAttributeStringCoercion(expected, name);
663 + }
664 +
665 + if ( propertyInfo.sanitizeURL) {
666 + // If we haven't fully disabled javascript: URLs, and if
667 + // the hydration is successful of a javascript: URL, we
668 + // still want to warn on the client.
669 + // eslint-disable-next-line react-internal/safe-string-coercion
670 + sanitizeURL('' + expected);
671 + }
672 +
673 + var attributeName = propertyInfo.attributeName;
674 + var stringValue = null;
675 +
676 + if (propertyInfo.type === OVERLOADED_BOOLEAN) {
677 + if (node.hasAttribute(attributeName)) {
678 + var value = node.getAttribute(attributeName);
679 +
680 + if (value === '') {
681 + return true;
682 + }
683 +
684 + if (shouldRemoveAttribute(name, expected, propertyInfo, false)) {
685 + return value;
686 + } // eslint-disable-next-line react-internal/safe-string-coercion
687 +
688 +
689 + if (value === '' + expected) {
690 + return expected;
691 + }
692 +
693 + return value;
694 + }
695 + } else if (node.hasAttribute(attributeName)) {
696 + if (shouldRemoveAttribute(name, expected, propertyInfo, false)) {
697 + // We had an attribute but shouldn't have had one, so read it
698 + // for the error message.
699 + return node.getAttribute(attributeName);
700 + }
701 +
702 + if (propertyInfo.type === BOOLEAN) {
703 + // If this was a boolean, it doesn't matter what the value is
704 + // the fact that we have it is the same as the expected.
705 + return expected;
706 + } // Even if this property uses a namespace we use getAttribute
707 + // because we assume its namespaced name is the same as our config.
708 + // To use getAttributeNS we need the local name which we don't have
709 + // in our config atm.
710 +
711 +
712 + stringValue = node.getAttribute(attributeName);
713 + }
714 +
715 + if (shouldRemoveAttribute(name, expected, propertyInfo, false)) {
716 + return stringValue === null ? expected : stringValue; // eslint-disable-next-line react-internal/safe-string-coercion
717 + } else if (stringValue === '' + expected) {
718 + return expected;
719 + } else {
720 + return stringValue;
721 + }
722 + }
723 + }
724 + }
725 + /**
726 + * Get the value for a attribute on a node. Only used in DEV for SSR validation.
727 + * The third argument is used as a hint of what the expected value is. Some
728 + * attributes have multiple equivalent values.
729 + */
730 +
731 + function getValueForAttribute(node, name, expected, isCustomComponentTag) {
732 + {
733 + if (!isAttributeNameSafe(name)) {
734 + return;
735 + }
736 +
737 + if (!node.hasAttribute(name)) {
738 + return expected === undefined ? undefined : null;
739 + }
740 +
741 + var value = node.getAttribute(name);
742 +
743 + {
744 + checkAttributeStringCoercion(expected, name);
745 + }
746 +
747 + if (value === '' + expected) {
748 + return expected;
749 + }
750 +
751 + return value;
752 + }
753 + }
754 + /**
755 + * Sets the value for a property on a node.
756 + *
757 + * @param {DOMElement} node
758 + * @param {string} name
759 + * @param {*} value
760 + */
761 +
762 + function setValueForProperty(node, name, value, isCustomComponentTag) {
763 + var propertyInfo = getPropertyInfo(name);
764 +
765 + if (shouldIgnoreAttribute(name, propertyInfo, isCustomComponentTag)) {
766 + return;
767 + }
768 +
769 + if (shouldRemoveAttribute(name, value, propertyInfo, isCustomComponentTag)) {
770 + value = null;
771 + }
772 +
773 +
774 + if (isCustomComponentTag || propertyInfo === null) {
775 + if (isAttributeNameSafe(name)) {
776 + var _attributeName = name;
777 +
778 + if (value === null) {
779 + node.removeAttribute(_attributeName);
780 + } else {
781 + {
782 + checkAttributeStringCoercion(value, name);
783 + }
784 +
785 + node.setAttribute(_attributeName, '' + value);
786 + }
787 + }
788 +
789 + return;
790 + }
791 +
792 + var mustUseProperty = propertyInfo.mustUseProperty;
793 +
794 + if (mustUseProperty) {
795 + var propertyName = propertyInfo.propertyName;
796 +
797 + if (value === null) {
798 + var type = propertyInfo.type;
799 + node[propertyName] = type === BOOLEAN ? false : '';
800 + } else {
801 + // Contrary to `setAttribute`, object properties are properly
802 + // `toString`ed by IE8/9.
803 + node[propertyName] = value;
804 + }
805 +
806 + return;
807 + } // The rest are treated as attributes with special cases.
808 +
809 +
810 + var attributeName = propertyInfo.attributeName,
811 + attributeNamespace = propertyInfo.attributeNamespace;
812 +
813 + if (value === null) {
814 + node.removeAttribute(attributeName);
815 + } else {
816 + var _type = propertyInfo.type;
817 + var attributeValue;
818 +
819 + if (_type === BOOLEAN || _type === OVERLOADED_BOOLEAN && value === true) {
820 + // If attribute type is boolean, we know for sure it won't be an execution sink
821 + // and we won't require Trusted Type here.
822 + attributeValue = '';
823 + } else {
824 + // `setAttribute` with objects becomes only `[object]` in IE8/9,
825 + // ('' + value) makes it output the correct toString()-value.
826 + {
827 + {
828 + checkAttributeStringCoercion(value, attributeName);
829 + }
830 +
831 + attributeValue = '' + value;
832 + }
833 +
834 + if (propertyInfo.sanitizeURL) {
835 + sanitizeURL(attributeValue.toString());
836 + }
837 + }
838 +
839 + if (attributeNamespace) {
840 + node.setAttributeNS(attributeNamespace, attributeName, attributeValue);
841 + } else {
842 + node.setAttribute(attributeName, attributeValue);
843 + }
844 + }
845 + }
846 +
847 + // ATTENTION
848 + // When adding new symbols to this file,
849 + // Please consider also adding to 'react-devtools-shared/src/backend/ReactSymbols'
850 + // The Symbol used to tag the ReactElement-like types.
851 + var REACT_ELEMENT_TYPE = Symbol.for('react.element');
852 + var REACT_PORTAL_TYPE = Symbol.for('react.portal');
853 + var REACT_FRAGMENT_TYPE = Symbol.for('react.fragment');
854 + var REACT_STRICT_MODE_TYPE = Symbol.for('react.strict_mode');
855 + var REACT_PROFILER_TYPE = Symbol.for('react.profiler');
856 + var REACT_PROVIDER_TYPE = Symbol.for('react.provider');
857 + var REACT_CONTEXT_TYPE = Symbol.for('react.context');
858 + var REACT_FORWARD_REF_TYPE = Symbol.for('react.forward_ref');
859 + var REACT_SUSPENSE_TYPE = Symbol.for('react.suspense');
860 + var REACT_SUSPENSE_LIST_TYPE = Symbol.for('react.suspense_list');
861 + var REACT_MEMO_TYPE = Symbol.for('react.memo');
862 + var REACT_LAZY_TYPE = Symbol.for('react.lazy');
863 + var REACT_SCOPE_TYPE = Symbol.for('react.scope');
864 + var REACT_DEBUG_TRACING_MODE_TYPE = Symbol.for('react.debug_trace_mode');
865 + var REACT_OFFSCREEN_TYPE = Symbol.for('react.offscreen');
866 + var REACT_LEGACY_HIDDEN_TYPE = Symbol.for('react.legacy_hidden');
867 + var REACT_CACHE_TYPE = Symbol.for('react.cache');
868 + var REACT_TRACING_MARKER_TYPE = Symbol.for('react.tracing_marker');
869 + var MAYBE_ITERATOR_SYMBOL = Symbol.iterator;
870 + var FAUX_ITERATOR_SYMBOL = '@@iterator';
871 + function getIteratorFn(maybeIterable) {
872 + if (maybeIterable === null || typeof maybeIterable !== 'object') {
873 + return null;
874 + }
875 +
876 + var maybeIterator = MAYBE_ITERATOR_SYMBOL && maybeIterable[MAYBE_ITERATOR_SYMBOL] || maybeIterable[FAUX_ITERATOR_SYMBOL];
877 +
878 + if (typeof maybeIterator === 'function') {
879 + return maybeIterator;
880 + }
881 +
882 + return null;
883 + }
884 +
885 + var assign = Object.assign;
886 +
887 + // Helpers to patch console.logs to avoid logging during side-effect free
888 + // replaying on render function. This currently only patches the object
889 + // lazily which won't cover if the log function was extracted eagerly.
890 + // We could also eagerly patch the method.
891 + var disabledDepth = 0;
892 + var prevLog;
893 + var prevInfo;
894 + var prevWarn;
895 + var prevError;
896 + var prevGroup;
897 + var prevGroupCollapsed;
898 + var prevGroupEnd;
899 +
900 + function disabledLog() {}
901 +
902 + disabledLog.__reactDisabledLog = true;
903 + function disableLogs() {
904 + {
905 + if (disabledDepth === 0) {
906 + /* eslint-disable react-internal/no-production-logging */
907 + prevLog = console.log;
908 + prevInfo = console.info;
909 + prevWarn = console.warn;
910 + prevError = console.error;
911 + prevGroup = console.group;
912 + prevGroupCollapsed = console.groupCollapsed;
913 + prevGroupEnd = console.groupEnd; // https://github.com/facebook/react/issues/19099
914 +
915 + var props = {
916 + configurable: true,
917 + enumerable: true,
918 + value: disabledLog,
919 + writable: true
920 + }; // $FlowFixMe Flow thinks console is immutable.
921 +
922 + Object.defineProperties(console, {
923 + info: props,
924 + log: props,
925 + warn: props,
926 + error: props,
927 + group: props,
928 + groupCollapsed: props,
929 + groupEnd: props
930 + });
931 + /* eslint-enable react-internal/no-production-logging */
932 + }
933 +
934 + disabledDepth++;
935 + }
936 + }
937 + function reenableLogs() {
938 + {
939 + disabledDepth--;
940 +
941 + if (disabledDepth === 0) {
942 + /* eslint-disable react-internal/no-production-logging */
943 + var props = {
944 + configurable: true,
945 + enumerable: true,
946 + writable: true
947 + }; // $FlowFixMe Flow thinks console is immutable.
948 +
949 + Object.defineProperties(console, {
950 + log: assign({}, props, {
951 + value: prevLog
952 + }),
953 + info: assign({}, props, {
954 + value: prevInfo
955 + }),
956 + warn: assign({}, props, {
957 + value: prevWarn
958 + }),
959 + error: assign({}, props, {
960 + value: prevError
961 + }),
962 + group: assign({}, props, {
963 + value: prevGroup
964 + }),
965 + groupCollapsed: assign({}, props, {
966 + value: prevGroupCollapsed
967 + }),
968 + groupEnd: assign({}, props, {
969 + value: prevGroupEnd
970 + })
971 + });
972 + /* eslint-enable react-internal/no-production-logging */
973 + }
974 +
975 + if (disabledDepth < 0) {
976 + error('disabledDepth fell below zero. ' + 'This is a bug in React. Please file an issue.');
977 + }
978 + }
979 + }
980 +
981 + var ReactCurrentDispatcher = ReactSharedInternals.ReactCurrentDispatcher;
982 + var prefix;
983 + function describeBuiltInComponentFrame(name, source, ownerFn) {
984 + {
985 + if (prefix === undefined) {
986 + // Extract the VM specific prefix used by each line.
987 + try {
988 + throw Error();
989 + } catch (x) {
990 + var match = x.stack.trim().match(/\n( *(at )?)/);
991 + prefix = match && match[1] || '';
992 + }
993 + } // We use the prefix to ensure our stacks line up with native stack frames.
994 +
995 +
996 + return '\n' + prefix + name;
997 + }
998 + }
999 + var reentry = false;
1000 + var componentFrameCache;
1001 +
1002 + {
1003 + var PossiblyWeakMap = typeof WeakMap === 'function' ? WeakMap : Map;
1004 + componentFrameCache = new PossiblyWeakMap();
1005 + }
1006 +
1007 + function describeNativeComponentFrame(fn, construct) {
1008 + // If something asked for a stack inside a fake render, it should get ignored.
1009 + if ( !fn || reentry) {
1010 + return '';
1011 + }
1012 +
1013 + {
1014 + var frame = componentFrameCache.get(fn);
1015 +
1016 + if (frame !== undefined) {
1017 + return frame;
1018 + }
1019 + }
1020 +
1021 + var control;
1022 + reentry = true;
1023 + var previousPrepareStackTrace = Error.prepareStackTrace; // $FlowFixMe It does accept undefined.
1024 +
1025 + Error.prepareStackTrace = undefined;
1026 + var previousDispatcher;
1027 +
1028 + {
1029 + previousDispatcher = ReactCurrentDispatcher.current; // Set the dispatcher in DEV because this might be call in the render function
1030 + // for warnings.
1031 +
1032 + ReactCurrentDispatcher.current = null;
1033 + disableLogs();
1034 + }
1035 +
1036 + try {
1037 + // This should throw.
1038 + if (construct) {
1039 + // Something should be setting the props in the constructor.
1040 + var Fake = function () {
1041 + throw Error();
1042 + }; // $FlowFixMe
1043 +
1044 +
1045 + Object.defineProperty(Fake.prototype, 'props', {
1046 + set: function () {
1047 + // We use a throwing setter instead of frozen or non-writable props
1048 + // because that won't throw in a non-strict mode function.
1049 + throw Error();
1050 + }
1051 + });
1052 +
1053 + if (typeof Reflect === 'object' && Reflect.construct) {
1054 + // We construct a different control for this case to include any extra
1055 + // frames added by the construct call.
1056 + try {
1057 + Reflect.construct(Fake, []);
1058 + } catch (x) {
1059 + control = x;
1060 + }
1061 +
1062 + Reflect.construct(fn, [], Fake);
1063 + } else {
1064 + try {
1065 + Fake.call();
1066 + } catch (x) {
1067 + control = x;
1068 + }
1069 +
1070 + fn.call(Fake.prototype);
1071 + }
1072 + } else {
1073 + try {
1074 + throw Error();
1075 + } catch (x) {
1076 + control = x;
1077 + }
1078 +
1079 + fn();
1080 + }
1081 + } catch (sample) {
1082 + // This is inlined manually because closure doesn't do it for us.
1083 + if (sample && control && typeof sample.stack === 'string') {
1084 + // This extracts the first frame from the sample that isn't also in the control.
1085 + // Skipping one frame that we assume is the frame that calls the two.
1086 + var sampleLines = sample.stack.split('\n');
1087 + var controlLines = control.stack.split('\n');
1088 + var s = sampleLines.length - 1;
1089 + var c = controlLines.length - 1;
1090 +
1091 + while (s >= 1 && c >= 0 && sampleLines[s] !== controlLines[c]) {
1092 + // We expect at least one stack frame to be shared.
1093 + // Typically this will be the root most one. However, stack frames may be
1094 + // cut off due to maximum stack limits. In this case, one maybe cut off
1095 + // earlier than the other. We assume that the sample is longer or the same
1096 + // and there for cut off earlier. So we should find the root most frame in
1097 + // the sample somewhere in the control.
1098 + c--;
1099 + }
1100 +
1101 + for (; s >= 1 && c >= 0; s--, c--) {
1102 + // Next we find the first one that isn't the same which should be the
1103 + // frame that called our sample function and the control.
1104 + if (sampleLines[s] !== controlLines[c]) {
1105 + // In V8, the first line is describing the message but other VMs don't.
1106 + // If we're about to return the first line, and the control is also on the same
1107 + // line, that's a pretty good indicator that our sample threw at same line as
1108 + // the control. I.e. before we entered the sample frame. So we ignore this result.
1109 + // This can happen if you passed a class to function component, or non-function.
1110 + if (s !== 1 || c !== 1) {
1111 + do {
1112 + s--;
1113 + c--; // We may still have similar intermediate frames from the construct call.
1114 + // The next one that isn't the same should be our match though.
1115 +
1116 + if (c < 0 || sampleLines[s] !== controlLines[c]) {
1117 + // V8 adds a "new" prefix for native classes. Let's remove it to make it prettier.
1118 + var _frame = '\n' + sampleLines[s].replace(' at new ', ' at '); // If our component frame is labeled "<anonymous>"
1119 + // but we have a user-provided "displayName"
1120 + // splice it in to make the stack more readable.
1121 +
1122 +
1123 + if (fn.displayName && _frame.includes('<anonymous>')) {
1124 + _frame = _frame.replace('<anonymous>', fn.displayName);
1125 + }
1126 +
1127 + {
1128 + if (typeof fn === 'function') {
1129 + componentFrameCache.set(fn, _frame);
1130 + }
1131 + } // Return the line we found.
1132 +
1133 +
1134 + return _frame;
1135 + }
1136 + } while (s >= 1 && c >= 0);
1137 + }
1138 +
1139 + break;
1140 + }
1141 + }
1142 + }
1143 + } finally {
1144 + reentry = false;
1145 +
1146 + {
1147 + ReactCurrentDispatcher.current = previousDispatcher;
1148 + reenableLogs();
1149 + }
1150 +
1151 + Error.prepareStackTrace = previousPrepareStackTrace;
1152 + } // Fallback to just using the name if we couldn't make it throw.
1153 +
1154 +
1155 + var name = fn ? fn.displayName || fn.name : '';
1156 + var syntheticFrame = name ? describeBuiltInComponentFrame(name) : '';
1157 +
1158 + {
1159 + if (typeof fn === 'function') {
1160 + componentFrameCache.set(fn, syntheticFrame);
1161 + }
1162 + }
1163 +
1164 + return syntheticFrame;
1165 + }
1166 +
1167 + function describeClassComponentFrame(ctor, source, ownerFn) {
1168 + {
1169 + return describeNativeComponentFrame(ctor, true);
1170 + }
1171 + }
1172 + function describeFunctionComponentFrame(fn, source, ownerFn) {
1173 + {
1174 + return describeNativeComponentFrame(fn, false);
1175 + }
1176 + }
1177 +
1178 + function shouldConstruct(Component) {
1179 + var prototype = Component.prototype;
1180 + return !!(prototype && prototype.isReactComponent);
1181 + }
1182 +
1183 + function describeUnknownElementTypeFrameInDEV(type, source, ownerFn) {
1184 +
1185 + if (type == null) {
1186 + return '';
1187 + }
1188 +
1189 + if (typeof type === 'function') {
1190 + {
1191 + return describeNativeComponentFrame(type, shouldConstruct(type));
1192 + }
1193 + }
1194 +
1195 + if (typeof type === 'string') {
1196 + return describeBuiltInComponentFrame(type);
1197 + }
1198 +
1199 + switch (type) {
1200 + case REACT_SUSPENSE_TYPE:
1201 + return describeBuiltInComponentFrame('Suspense');
1202 +
1203 + case REACT_SUSPENSE_LIST_TYPE:
1204 + return describeBuiltInComponentFrame('SuspenseList');
1205 + }
1206 +
1207 + if (typeof type === 'object') {
1208 + switch (type.$$typeof) {
1209 + case REACT_FORWARD_REF_TYPE:
1210 + return describeFunctionComponentFrame(type.render);
1211 +
1212 + case REACT_MEMO_TYPE:
1213 + // Memo may contain any component type so we recursively resolve it.
1214 + return describeUnknownElementTypeFrameInDEV(type.type, source, ownerFn);
1215 +
1216 + case REACT_LAZY_TYPE:
1217 + {
1218 + var lazyComponent = type;
1219 + var payload = lazyComponent._payload;
1220 + var init = lazyComponent._init;
1221 +
1222 + try {
1223 + // Lazy may contain any component type so we recursively resolve it.
1224 + return describeUnknownElementTypeFrameInDEV(init(payload), source, ownerFn);
1225 + } catch (x) {}
1226 + }
1227 + }
1228 + }
1229 +
1230 + return '';
1231 + }
1232 +
1233 + function describeFiber(fiber) {
1234 + var owner = fiber._debugOwner ? fiber._debugOwner.type : null ;
1235 + var source = fiber._debugSource ;
1236 +
1237 + switch (fiber.tag) {
1238 + case HostComponent:
1239 + return describeBuiltInComponentFrame(fiber.type);
1240 +
1241 + case LazyComponent:
1242 + return describeBuiltInComponentFrame('Lazy');
1243 +
1244 + case SuspenseComponent:
1245 + return describeBuiltInComponentFrame('Suspense');
1246 +
1247 + case SuspenseListComponent:
1248 + return describeBuiltInComponentFrame('SuspenseList');
1249 +
1250 + case FunctionComponent:
1251 + case IndeterminateComponent:
1252 + case SimpleMemoComponent:
1253 + return describeFunctionComponentFrame(fiber.type);
1254 +
1255 + case ForwardRef:
1256 + return describeFunctionComponentFrame(fiber.type.render);
1257 +
1258 + case ClassComponent:
1259 + return describeClassComponentFrame(fiber.type);
1260 +
1261 + default:
1262 + return '';
1263 + }
1264 + }
1265 +
1266 + function getStackByFiberInDevAndProd(workInProgress) {
1267 + try {
1268 + var info = '';
1269 + var node = workInProgress;
1270 +
1271 + do {
1272 + info += describeFiber(node);
1273 + node = node.return;
1274 + } while (node);
1275 +
1276 + return info;
1277 + } catch (x) {
1278 + return '\nError generating stack: ' + x.message + '\n' + x.stack;
1279 + }
1280 + }
1281 +
1282 + function getWrappedName(outerType, innerType, wrapperName) {
1283 + var displayName = outerType.displayName;
1284 +
1285 + if (displayName) {
1286 + return displayName;
1287 + }
1288 +
1289 + var functionName = innerType.displayName || innerType.name || '';
1290 + return functionName !== '' ? wrapperName + "(" + functionName + ")" : wrapperName;
1291 + } // Keep in sync with react-reconciler/getComponentNameFromFiber
1292 +
1293 +
1294 + function getContextName(type) {
1295 + return type.displayName || 'Context';
1296 + } // Note that the reconciler package should generally prefer to use getComponentNameFromFiber() instead.
1297 +
1298 +
1299 + function getComponentNameFromType(type) {
1300 + if (type == null) {
1301 + // Host root, text node or just invalid type.
1302 + return null;
1303 + }
1304 +
1305 + {
1306 + if (typeof type.tag === 'number') {
1307 + error('Received an unexpected object in getComponentNameFromType(). ' + 'This is likely a bug in React. Please file an issue.');
1308 + }
1309 + }
1310 +
1311 + if (typeof type === 'function') {
1312 + return type.displayName || type.name || null;
1313 + }
1314 +
1315 + if (typeof type === 'string') {
1316 + return type;
1317 + }
1318 +
1319 + switch (type) {
1320 + case REACT_FRAGMENT_TYPE:
1321 + return 'Fragment';
1322 +
1323 + case REACT_PORTAL_TYPE:
1324 + return 'Portal';
1325 +
1326 + case REACT_PROFILER_TYPE:
1327 + return 'Profiler';
1328 +
1329 + case REACT_STRICT_MODE_TYPE:
1330 + return 'StrictMode';
1331 +
1332 + case REACT_SUSPENSE_TYPE:
1333 + return 'Suspense';
1334 +
1335 + case REACT_SUSPENSE_LIST_TYPE:
1336 + return 'SuspenseList';
1337 +
1338 + }
1339 +
1340 + if (typeof type === 'object') {
1341 + switch (type.$$typeof) {
1342 + case REACT_CONTEXT_TYPE:
1343 + var context = type;
1344 + return getContextName(context) + '.Consumer';
1345 +
1346 + case REACT_PROVIDER_TYPE:
1347 + var provider = type;
1348 + return getContextName(provider._context) + '.Provider';
1349 +
1350 + case REACT_FORWARD_REF_TYPE:
1351 + return getWrappedName(type, type.render, 'ForwardRef');
1352 +
1353 + case REACT_MEMO_TYPE:
1354 + var outerName = type.displayName || null;
1355 +
1356 + if (outerName !== null) {
1357 + return outerName;
1358 + }
1359 +
1360 + return getComponentNameFromType(type.type) || 'Memo';
1361 +
1362 + case REACT_LAZY_TYPE:
1363 + {
1364 + var lazyComponent = type;
1365 + var payload = lazyComponent._payload;
1366 + var init = lazyComponent._init;
1367 +
1368 + try {
1369 + return getComponentNameFromType(init(payload));
1370 + } catch (x) {
1371 + return null;
1372 + }
1373 + }
1374 +
1375 + // eslint-disable-next-line no-fallthrough
1376 + }
1377 + }
1378 +
1379 + return null;
1380 + }
1381 +
1382 + function getWrappedName$1(outerType, innerType, wrapperName) {
1383 + var functionName = innerType.displayName || innerType.name || '';
1384 + return outerType.displayName || (functionName !== '' ? wrapperName + "(" + functionName + ")" : wrapperName);
1385 + } // Keep in sync with shared/getComponentNameFromType
1386 +
1387 +
1388 + function getContextName$1(type) {
1389 + return type.displayName || 'Context';
1390 + }
1391 +
1392 + function getComponentNameFromFiber(fiber) {
1393 + var tag = fiber.tag,
1394 + type = fiber.type;
1395 +
1396 + switch (tag) {
1397 + case CacheComponent:
1398 + return 'Cache';
1399 +
1400 + case ContextConsumer:
1401 + var context = type;
1402 + return getContextName$1(context) + '.Consumer';
1403 +
1404 + case ContextProvider:
1405 + var provider = type;
1406 + return getContextName$1(provider._context) + '.Provider';
1407 +
1408 + case DehydratedFragment:
1409 + return 'DehydratedFragment';
1410 +
1411 + case ForwardRef:
1412 + return getWrappedName$1(type, type.render, 'ForwardRef');
1413 +
1414 + case Fragment:
1415 + return 'Fragment';
1416 +
1417 + case HostComponent:
1418 + // Host component type is the display name (e.g. "div", "View")
1419 + return type;
1420 +
1421 + case HostPortal:
1422 + return 'Portal';
1423 +
1424 + case HostRoot:
1425 + return 'Root';
1426 +
1427 + case HostText:
1428 + return 'Text';
1429 +
1430 + case LazyComponent:
1431 + // Name comes from the type in this case; we don't have a tag.
1432 + return getComponentNameFromType(type);
1433 +
1434 + case Mode:
1435 + if (type === REACT_STRICT_MODE_TYPE) {
1436 + // Don't be less specific than shared/getComponentNameFromType
1437 + return 'StrictMode';
1438 + }
1439 +
1440 + return 'Mode';
1441 +
1442 + case OffscreenComponent:
1443 + return 'Offscreen';
1444 +
1445 + case Profiler:
1446 + return 'Profiler';
1447 +
1448 + case ScopeComponent:
1449 + return 'Scope';
1450 +
1451 + case SuspenseComponent:
1452 + return 'Suspense';
1453 +
1454 + case SuspenseListComponent:
1455 + return 'SuspenseList';
1456 +
1457 + case TracingMarkerComponent:
1458 + return 'TracingMarker';
1459 + // The display name for this tags come from the user-provided type:
1460 +
1461 + case ClassComponent:
1462 + case FunctionComponent:
1463 + case IncompleteClassComponent:
1464 + case IndeterminateComponent:
1465 + case MemoComponent:
1466 + case SimpleMemoComponent:
1467 + if (typeof type === 'function') {
1468 + return type.displayName || type.name || null;
1469 + }
1470 +
1471 + if (typeof type === 'string') {
1472 + return type;
1473 + }
1474 +
1475 + break;
1476 +
1477 + }
1478 +
1479 + return null;
1480 + }
1481 +
1482 + var ReactDebugCurrentFrame = ReactSharedInternals.ReactDebugCurrentFrame;
1483 + var current = null;
1484 + var isRendering = false;
1485 + function getCurrentFiberOwnerNameInDevOrNull() {
1486 + {
1487 + if (current === null) {
1488 + return null;
1489 + }
1490 +
1491 + var owner = current._debugOwner;
1492 +
1493 + if (owner !== null && typeof owner !== 'undefined') {
1494 + return getComponentNameFromFiber(owner);
1495 + }
1496 + }
1497 +
1498 + return null;
1499 + }
1500 +
1501 + function getCurrentFiberStackInDev() {
1502 + {
1503 + if (current === null) {
1504 + return '';
1505 + } // Safe because if current fiber exists, we are reconciling,
1506 + // and it is guaranteed to be the work-in-progress version.
1507 +
1508 +
1509 + return getStackByFiberInDevAndProd(current);
1510 + }
1511 + }
1512 +
1513 + function resetCurrentFiber() {
1514 + {
1515 + ReactDebugCurrentFrame.getCurrentStack = null;
1516 + current = null;
1517 + isRendering = false;
1518 + }
1519 + }
1520 + function setCurrentFiber(fiber) {
1521 + {
1522 + ReactDebugCurrentFrame.getCurrentStack = fiber === null ? null : getCurrentFiberStackInDev;
1523 + current = fiber;
1524 + isRendering = false;
1525 + }
1526 + }
1527 + function getCurrentFiber() {
1528 + {
1529 + return current;
1530 + }
1531 + }
1532 + function setIsRendering(rendering) {
1533 + {
1534 + isRendering = rendering;
1535 + }
1536 + }
1537 +
1538 + // Flow does not allow string concatenation of most non-string types. To work
1539 + // around this limitation, we use an opaque type that can only be obtained by
1540 + // passing the value through getToStringValue first.
1541 + function toString(value) {
1542 + // The coercion safety check is performed in getToStringValue().
1543 + // eslint-disable-next-line react-internal/safe-string-coercion
1544 + return '' + value;
1545 + }
1546 + function getToStringValue(value) {
1547 + switch (typeof value) {
1548 + case 'boolean':
1549 + case 'number':
1550 + case 'string':
1551 + case 'undefined':
1552 + return value;
1553 +
1554 + case 'object':
1555 + {
1556 + checkFormFieldValueStringCoercion(value);
1557 + }
1558 +
1559 + return value;
1560 +
1561 + default:
1562 + // function, symbol are assigned as empty strings
1563 + return '';
1564 + }
1565 + }
1566 +
1567 + var hasReadOnlyValue = {
1568 + button: true,
1569 + checkbox: true,
1570 + image: true,
1571 + hidden: true,
1572 + radio: true,
1573 + reset: true,
1574 + submit: true
1575 + };
1576 + function checkControlledValueProps(tagName, props) {
1577 + {
1578 + if (!(hasReadOnlyValue[props.type] || props.onChange || props.onInput || props.readOnly || props.disabled || props.value == null)) {
1579 + error('You provided a `value` prop to a form field without an ' + '`onChange` handler. This will render a read-only field. If ' + 'the field should be mutable use `defaultValue`. Otherwise, ' + 'set either `onChange` or `readOnly`.');
1580 + }
1581 +
1582 + if (!(props.onChange || props.readOnly || props.disabled || props.checked == null)) {
1583 + error('You provided a `checked` prop to a form field without an ' + '`onChange` handler. This will render a read-only field. If ' + 'the field should be mutable use `defaultChecked`. Otherwise, ' + 'set either `onChange` or `readOnly`.');
1584 + }
1585 + }
1586 + }
1587 +
1588 + function isCheckable(elem) {
1589 + var type = elem.type;
1590 + var nodeName = elem.nodeName;
1591 + return nodeName && nodeName.toLowerCase() === 'input' && (type === 'checkbox' || type === 'radio');
1592 + }
1593 +
1594 + function getTracker(node) {
1595 + return node._valueTracker;
1596 + }
1597 +
1598 + function detachTracker(node) {
1599 + node._valueTracker = null;
1600 + }
1601 +
1602 + function getValueFromNode(node) {
1603 + var value = '';
1604 +
1605 + if (!node) {
1606 + return value;
1607 + }
1608 +
1609 + if (isCheckable(node)) {
1610 + value = node.checked ? 'true' : 'false';
1611 + } else {
1612 + value = node.value;
1613 + }
1614 +
1615 + return value;
1616 + }
1617 +
1618 + function trackValueOnNode(node) {
1619 + var valueField = isCheckable(node) ? 'checked' : 'value';
1620 + var descriptor = Object.getOwnPropertyDescriptor(node.constructor.prototype, valueField);
1621 +
1622 + {
1623 + checkFormFieldValueStringCoercion(node[valueField]);
1624 + }
1625 +
1626 + var currentValue = '' + node[valueField]; // if someone has already defined a value or Safari, then bail
1627 + // and don't track value will cause over reporting of changes,
1628 + // but it's better then a hard failure
1629 + // (needed for certain tests that spyOn input values and Safari)
1630 +
1631 + if (node.hasOwnProperty(valueField) || typeof descriptor === 'undefined' || typeof descriptor.get !== 'function' || typeof descriptor.set !== 'function') {
1632 + return;
1633 + }
1634 +
1635 + var get = descriptor.get,
1636 + set = descriptor.set;
1637 + Object.defineProperty(node, valueField, {
1638 + configurable: true,
1639 + get: function () {
1640 + return get.call(this);
1641 + },
1642 + set: function (value) {
1643 + {
1644 + checkFormFieldValueStringCoercion(value);
1645 + }
1646 +
1647 + currentValue = '' + value;
1648 + set.call(this, value);
1649 + }
1650 + }); // We could've passed this the first time
1651 + // but it triggers a bug in IE11 and Edge 14/15.
1652 + // Calling defineProperty() again should be equivalent.
1653 + // https://github.com/facebook/react/issues/11768
1654 +
1655 + Object.defineProperty(node, valueField, {
1656 + enumerable: descriptor.enumerable
1657 + });
1658 + var tracker = {
1659 + getValue: function () {
1660 + return currentValue;
1661 + },
1662 + setValue: function (value) {
1663 + {
1664 + checkFormFieldValueStringCoercion(value);
1665 + }
1666 +
1667 + currentValue = '' + value;
1668 + },
1669 + stopTracking: function () {
1670 + detachTracker(node);
1671 + delete node[valueField];
1672 + }
1673 + };
1674 + return tracker;
1675 + }
1676 +
1677 + function track(node) {
1678 + if (getTracker(node)) {
1679 + return;
1680 + } // TODO: Once it's just Fiber we can move this to node._wrapperState
1681 +
1682 +
1683 + node._valueTracker = trackValueOnNode(node);
1684 + }
1685 + function updateValueIfChanged(node) {
1686 + if (!node) {
1687 + return false;
1688 + }
1689 +
1690 + var tracker = getTracker(node); // if there is no tracker at this point it's unlikely
1691 + // that trying again will succeed
1692 +
1693 + if (!tracker) {
1694 + return true;
1695 + }
1696 +
1697 + var lastValue = tracker.getValue();
1698 + var nextValue = getValueFromNode(node);
1699 +
1700 + if (nextValue !== lastValue) {
1701 + tracker.setValue(nextValue);
1702 + return true;
1703 + }
1704 +
1705 + return false;
1706 + }
1707 +
1708 + function getActiveElement(doc) {
1709 + doc = doc || (typeof document !== 'undefined' ? document : undefined);
1710 +
1711 + if (typeof doc === 'undefined') {
1712 + return null;
1713 + }
1714 +
1715 + try {
1716 + return doc.activeElement || doc.body;
1717 + } catch (e) {
1718 + return doc.body;
1719 + }
1720 + }
1721 +
1722 + var didWarnValueDefaultValue = false;
1723 + var didWarnCheckedDefaultChecked = false;
1724 + var didWarnControlledToUncontrolled = false;
1725 + var didWarnUncontrolledToControlled = false;
1726 +
1727 + function isControlled(props) {
1728 + var usesChecked = props.type === 'checkbox' || props.type === 'radio';
1729 + return usesChecked ? props.checked != null : props.value != null;
1730 + }
1731 + /**
1732 + * Implements an <input> host component that allows setting these optional
1733 + * props: `checked`, `value`, `defaultChecked`, and `defaultValue`.
1734 + *
1735 + * If `checked` or `value` are not supplied (or null/undefined), user actions
1736 + * that affect the checked state or value will trigger updates to the element.
1737 + *
1738 + * If they are supplied (and not null/undefined), the rendered element will not
1739 + * trigger updates to the element. Instead, the props must change in order for
1740 + * the rendered element to be updated.
1741 + *
1742 + * The rendered element will be initialized as unchecked (or `defaultChecked`)
1743 + * with an empty value (or `defaultValue`).
1744 + *
1745 + * See http://www.w3.org/TR/2012/WD-html5-20121025/the-input-element.html
1746 + */
1747 +
1748 +
1749 + function getHostProps(element, props) {
1750 + var node = element;
1751 + var checked = props.checked;
1752 + var hostProps = assign({}, props, {
1753 + defaultChecked: undefined,
1754 + defaultValue: undefined,
1755 + value: undefined,
1756 + checked: checked != null ? checked : node._wrapperState.initialChecked
1757 + });
1758 + return hostProps;
1759 + }
1760 + function initWrapperState(element, props) {
1761 + {
1762 + checkControlledValueProps('input', props);
1763 +
1764 + if (props.checked !== undefined && props.defaultChecked !== undefined && !didWarnCheckedDefaultChecked) {
1765 + error('%s contains an input of type %s with both checked and defaultChecked props. ' + 'Input elements must be either controlled or uncontrolled ' + '(specify either the checked prop, or the defaultChecked prop, but not ' + 'both). Decide between using a controlled or uncontrolled input ' + 'element and remove one of these props. More info: ' + 'https://reactjs.org/link/controlled-components', getCurrentFiberOwnerNameInDevOrNull() || 'A component', props.type);
1766 +
1767 + didWarnCheckedDefaultChecked = true;
1768 + }
1769 +
1770 + if (props.value !== undefined && props.defaultValue !== undefined && !didWarnValueDefaultValue) {
1771 + error('%s contains an input of type %s with both value and defaultValue props. ' + 'Input elements must be either controlled or uncontrolled ' + '(specify either the value prop, or the defaultValue prop, but not ' + 'both). Decide between using a controlled or uncontrolled input ' + 'element and remove one of these props. More info: ' + 'https://reactjs.org/link/controlled-components', getCurrentFiberOwnerNameInDevOrNull() || 'A component', props.type);
1772 +
1773 + didWarnValueDefaultValue = true;
1774 + }
1775 + }
1776 +
1777 + var node = element;
1778 + var defaultValue = props.defaultValue == null ? '' : props.defaultValue;
1779 + node._wrapperState = {
1780 + initialChecked: props.checked != null ? props.checked : props.defaultChecked,
1781 + initialValue: getToStringValue(props.value != null ? props.value : defaultValue),
1782 + controlled: isControlled(props)
1783 + };
1784 + }
1785 + function updateChecked(element, props) {
1786 + var node = element;
1787 + var checked = props.checked;
1788 +
1789 + if (checked != null) {
1790 + setValueForProperty(node, 'checked', checked, false);
1791 + }
1792 + }
1793 + function updateWrapper(element, props) {
1794 + var node = element;
1795 +
1796 + {
1797 + var controlled = isControlled(props);
1798 +
1799 + if (!node._wrapperState.controlled && controlled && !didWarnUncontrolledToControlled) {
1800 + error('A component is changing an uncontrolled input to be controlled. ' + 'This is likely caused by the value changing from undefined to ' + 'a defined value, which should not happen. ' + 'Decide between using a controlled or uncontrolled input ' + 'element for the lifetime of the component. More info: https://reactjs.org/link/controlled-components');
1801 +
1802 + didWarnUncontrolledToControlled = true;
1803 + }
1804 +
1805 + if (node._wrapperState.controlled && !controlled && !didWarnControlledToUncontrolled) {
1806 + error('A component is changing a controlled input to be uncontrolled. ' + 'This is likely caused by the value changing from a defined to ' + 'undefined, which should not happen. ' + 'Decide between using a controlled or uncontrolled input ' + 'element for the lifetime of the component. More info: https://reactjs.org/link/controlled-components');
1807 +
1808 + didWarnControlledToUncontrolled = true;
1809 + }
1810 + }
1811 +
1812 + updateChecked(element, props);
1813 + var value = getToStringValue(props.value);
1814 + var type = props.type;
1815 +
1816 + if (value != null) {
1817 + if (type === 'number') {
1818 + if (value === 0 && node.value === '' || // We explicitly want to coerce to number here if possible.
1819 + // eslint-disable-next-line
1820 + node.value != value) {
1821 + node.value = toString(value);
1822 + }
1823 + } else if (node.value !== toString(value)) {
1824 + node.value = toString(value);
1825 + }
1826 + } else if (type === 'submit' || type === 'reset') {
1827 + // Submit/reset inputs need the attribute removed completely to avoid
1828 + // blank-text buttons.
1829 + node.removeAttribute('value');
1830 + return;
1831 + }
1832 +
1833 + {
1834 + // When syncing the value attribute, the value comes from a cascade of
1835 + // properties:
1836 + // 1. The value React property
1837 + // 2. The defaultValue React property
1838 + // 3. Otherwise there should be no change
1839 + if (props.hasOwnProperty('value')) {
1840 + setDefaultValue(node, props.type, value);
1841 + } else if (props.hasOwnProperty('defaultValue')) {
1842 + setDefaultValue(node, props.type, getToStringValue(props.defaultValue));
1843 + }
1844 + }
1845 +
1846 + {
1847 + // When syncing the checked attribute, it only changes when it needs
1848 + // to be removed, such as transitioning from a checkbox into a text input
1849 + if (props.checked == null && props.defaultChecked != null) {
1850 + node.defaultChecked = !!props.defaultChecked;
1851 + }
1852 + }
1853 + }
1854 + function postMountWrapper(element, props, isHydrating) {
1855 + var node = element; // Do not assign value if it is already set. This prevents user text input
1856 + // from being lost during SSR hydration.
1857 +
1858 + if (props.hasOwnProperty('value') || props.hasOwnProperty('defaultValue')) {
1859 + var type = props.type;
1860 + var isButton = type === 'submit' || type === 'reset'; // Avoid setting value attribute on submit/reset inputs as it overrides the
1861 + // default value provided by the browser. See: #12872
1862 +
1863 + if (isButton && (props.value === undefined || props.value === null)) {
1864 + return;
1865 + }
1866 +
1867 + var initialValue = toString(node._wrapperState.initialValue); // Do not assign value if it is already set. This prevents user text input
1868 + // from being lost during SSR hydration.
1869 +
1870 + if (!isHydrating) {
1871 + {
1872 + // When syncing the value attribute, the value property should use
1873 + // the wrapperState._initialValue property. This uses:
1874 + //
1875 + // 1. The value React property when present
1876 + // 2. The defaultValue React property when present
1877 + // 3. An empty string
1878 + if (initialValue !== node.value) {
1879 + node.value = initialValue;
1880 + }
1881 + }
1882 + }
1883 +
1884 + {
1885 + // Otherwise, the value attribute is synchronized to the property,
1886 + // so we assign defaultValue to the same thing as the value property
1887 + // assignment step above.
1888 + node.defaultValue = initialValue;
1889 + }
1890 + } // Normally, we'd just do `node.checked = node.checked` upon initial mount, less this bug
1891 + // this is needed to work around a chrome bug where setting defaultChecked
1892 + // will sometimes influence the value of checked (even after detachment).
1893 + // Reference: https://bugs.chromium.org/p/chromium/issues/detail?id=608416
1894 + // We need to temporarily unset name to avoid disrupting radio button groups.
1895 +
1896 +
1897 + var name = node.name;
1898 +
1899 + if (name !== '') {
1900 + node.name = '';
1901 + }
1902 +
1903 + {
1904 + // When syncing the checked attribute, both the checked property and
1905 + // attribute are assigned at the same time using defaultChecked. This uses:
1906 + //
1907 + // 1. The checked React property when present
1908 + // 2. The defaultChecked React property when present
1909 + // 3. Otherwise, false
1910 + node.defaultChecked = !node.defaultChecked;
1911 + node.defaultChecked = !!node._wrapperState.initialChecked;
1912 + }
1913 +
1914 + if (name !== '') {
1915 + node.name = name;
1916 + }
1917 + }
1918 + function restoreControlledState(element, props) {
1919 + var node = element;
1920 + updateWrapper(node, props);
1921 + updateNamedCousins(node, props);
1922 + }
1923 +
1924 + function updateNamedCousins(rootNode, props) {
1925 + var name = props.name;
1926 +
1927 + if (props.type === 'radio' && name != null) {
1928 + var queryRoot = rootNode;
1929 +
1930 + while (queryRoot.parentNode) {
1931 + queryRoot = queryRoot.parentNode;
1932 + } // If `rootNode.form` was non-null, then we could try `form.elements`,
1933 + // but that sometimes behaves strangely in IE8. We could also try using
1934 + // `form.getElementsByName`, but that will only return direct children
1935 + // and won't include inputs that use the HTML5 `form=` attribute. Since
1936 + // the input might not even be in a form. It might not even be in the
1937 + // document. Let's just use the local `querySelectorAll` to ensure we don't
1938 + // miss anything.
1939 +
1940 +
1941 + {
1942 + checkAttributeStringCoercion(name, 'name');
1943 + }
1944 +
1945 + var group = queryRoot.querySelectorAll('input[name=' + JSON.stringify('' + name) + '][type="radio"]');
1946 +
1947 + for (var i = 0; i < group.length; i++) {
1948 + var otherNode = group[i];
1949 +
1950 + if (otherNode === rootNode || otherNode.form !== rootNode.form) {
1951 + continue;
1952 + } // This will throw if radio buttons rendered by different copies of React
1953 + // and the same name are rendered into the same form (same as #1939).
1954 + // That's probably okay; we don't support it just as we don't support
1955 + // mixing React radio buttons with non-React ones.
1956 +
1957 +
1958 + var otherProps = getFiberCurrentPropsFromNode(otherNode);
1959 +
1960 + if (!otherProps) {
1961 + throw new Error('ReactDOMInput: Mixing React and non-React radio inputs with the ' + 'same `name` is not supported.');
1962 + } // We need update the tracked value on the named cousin since the value
1963 + // was changed but the input saw no event or value set
1964 +
1965 +
1966 + updateValueIfChanged(otherNode); // If this is a controlled radio button group, forcing the input that
1967 + // was previously checked to update will cause it to be come re-checked
1968 + // as appropriate.
1969 +
1970 + updateWrapper(otherNode, otherProps);
1971 + }
1972 + }
1973 + } // In Chrome, assigning defaultValue to certain input types triggers input validation.
1974 + // For number inputs, the display value loses trailing decimal points. For email inputs,
1975 + // Chrome raises "The specified value <x> is not a valid email address".
1976 + //
1977 + // Here we check to see if the defaultValue has actually changed, avoiding these problems
1978 + // when the user is inputting text
1979 + //
1980 + // https://github.com/facebook/react/issues/7253
1981 +
1982 +
1983 + function setDefaultValue(node, type, value) {
1984 + if ( // Focused number inputs synchronize on blur. See ChangeEventPlugin.js
1985 + type !== 'number' || getActiveElement(node.ownerDocument) !== node) {
1986 + if (value == null) {
1987 + node.defaultValue = toString(node._wrapperState.initialValue);
1988 + } else if (node.defaultValue !== toString(value)) {
1989 + node.defaultValue = toString(value);
1990 + }
1991 + }
1992 + }
1993 +
1994 + var didWarnSelectedSetOnOption = false;
1995 + var didWarnInvalidChild = false;
1996 + var didWarnInvalidInnerHTML = false;
1997 + /**
1998 + * Implements an <option> host component that warns when `selected` is set.
1999 + */
2000 +
2001 + function validateProps(element, props) {
2002 + {
2003 + // If a value is not provided, then the children must be simple.
2004 + if (props.value == null) {
2005 + if (typeof props.children === 'object' && props.children !== null) {
2006 + React.Children.forEach(props.children, function (child) {
2007 + if (child == null) {
2008 + return;
2009 + }
2010 +
2011 + if (typeof child === 'string' || typeof child === 'number') {
2012 + return;
2013 + }
2014 +
2015 + if (!didWarnInvalidChild) {
2016 + didWarnInvalidChild = true;
2017 +
2018 + error('Cannot infer the option value of complex children. ' + 'Pass a `value` prop or use a plain string as children to <option>.');
2019 + }
2020 + });
2021 + } else if (props.dangerouslySetInnerHTML != null) {
2022 + if (!didWarnInvalidInnerHTML) {
2023 + didWarnInvalidInnerHTML = true;
2024 +
2025 + error('Pass a `value` prop if you set dangerouslyInnerHTML so React knows ' + 'which value should be selected.');
2026 + }
2027 + }
2028 + } // TODO: Remove support for `selected` in <option>.
2029 +
2030 +
2031 + if (props.selected != null && !didWarnSelectedSetOnOption) {
2032 + error('Use the `defaultValue` or `value` props on <select> instead of ' + 'setting `selected` on <option>.');
2033 +
2034 + didWarnSelectedSetOnOption = true;
2035 + }
2036 + }
2037 + }
2038 + function postMountWrapper$1(element, props) {
2039 + // value="" should make a value attribute (#6219)
2040 + if (props.value != null) {
2041 + element.setAttribute('value', toString(getToStringValue(props.value)));
2042 + }
2043 + }
2044 +
2045 + var isArrayImpl = Array.isArray; // eslint-disable-next-line no-redeclare
2046 +
2047 + function isArray(a) {
2048 + return isArrayImpl(a);
2049 + }
2050 +
2051 + var didWarnValueDefaultValue$1;
2052 +
2053 + {
2054 + didWarnValueDefaultValue$1 = false;
2055 + }
2056 +
2057 + function getDeclarationErrorAddendum() {
2058 + var ownerName = getCurrentFiberOwnerNameInDevOrNull();
2059 +
2060 + if (ownerName) {
2061 + return '\n\nCheck the render method of `' + ownerName + '`.';
2062 + }
2063 +
2064 + return '';
2065 + }
2066 +
2067 + var valuePropNames = ['value', 'defaultValue'];
2068 + /**
2069 + * Validation function for `value` and `defaultValue`.
2070 + */
2071 +
2072 + function checkSelectPropTypes(props) {
2073 + {
2074 + checkControlledValueProps('select', props);
2075 +
2076 + for (var i = 0; i < valuePropNames.length; i++) {
2077 + var propName = valuePropNames[i];
2078 +
2079 + if (props[propName] == null) {
2080 + continue;
2081 + }
2082 +
2083 + var propNameIsArray = isArray(props[propName]);
2084 +
2085 + if (props.multiple && !propNameIsArray) {
2086 + error('The `%s` prop supplied to <select> must be an array if ' + '`multiple` is true.%s', propName, getDeclarationErrorAddendum());
2087 + } else if (!props.multiple && propNameIsArray) {
2088 + error('The `%s` prop supplied to <select> must be a scalar ' + 'value if `multiple` is false.%s', propName, getDeclarationErrorAddendum());
2089 + }
2090 + }
2091 + }
2092 + }
2093 +
2094 + function updateOptions(node, multiple, propValue, setDefaultSelected) {
2095 + var options = node.options;
2096 +
2097 + if (multiple) {
2098 + var selectedValues = propValue;
2099 + var selectedValue = {};
2100 +
2101 + for (var i = 0; i < selectedValues.length; i++) {
2102 + // Prefix to avoid chaos with special keys.
2103 + selectedValue['$' + selectedValues[i]] = true;
2104 + }
2105 +
2106 + for (var _i = 0; _i < options.length; _i++) {
2107 + var selected = selectedValue.hasOwnProperty('$' + options[_i].value);
2108 +
2109 + if (options[_i].selected !== selected) {
2110 + options[_i].selected = selected;
2111 + }
2112 +
2113 + if (selected && setDefaultSelected) {
2114 + options[_i].defaultSelected = true;
2115 + }
2116 + }
2117 + } else {
2118 + // Do not set `select.value` as exact behavior isn't consistent across all
2119 + // browsers for all cases.
2120 + var _selectedValue = toString(getToStringValue(propValue));
2121 +
2122 + var defaultSelected = null;
2123 +
2124 + for (var _i2 = 0; _i2 < options.length; _i2++) {
2125 + if (options[_i2].value === _selectedValue) {
2126 + options[_i2].selected = true;
2127 +
2128 + if (setDefaultSelected) {
2129 + options[_i2].defaultSelected = true;
2130 + }
2131 +
2132 + return;
2133 + }
2134 +
2135 + if (defaultSelected === null && !options[_i2].disabled) {
2136 + defaultSelected = options[_i2];
2137 + }
2138 + }
2139 +
2140 + if (defaultSelected !== null) {
2141 + defaultSelected.selected = true;
2142 + }
2143 + }
2144 + }
2145 + /**
2146 + * Implements a <select> host component that allows optionally setting the
2147 + * props `value` and `defaultValue`. If `multiple` is false, the prop must be a
2148 + * stringable. If `multiple` is true, the prop must be an array of stringables.
2149 + *
2150 + * If `value` is not supplied (or null/undefined), user actions that change the
2151 + * selected option will trigger updates to the rendered options.
2152 + *
2153 + * If it is supplied (and not null/undefined), the rendered options will not
2154 + * update in response to user actions. Instead, the `value` prop must change in
2155 + * order for the rendered options to update.
2156 + *
2157 + * If `defaultValue` is provided, any options with the supplied values will be
2158 + * selected.
2159 + */
2160 +
2161 +
2162 + function getHostProps$1(element, props) {
2163 + return assign({}, props, {
2164 + value: undefined
2165 + });
2166 + }
2167 + function initWrapperState$1(element, props) {
2168 + var node = element;
2169 +
2170 + {
2171 + checkSelectPropTypes(props);
2172 + }
2173 +
2174 + node._wrapperState = {
2175 + wasMultiple: !!props.multiple
2176 + };
2177 +
2178 + {
2179 + if (props.value !== undefined && props.defaultValue !== undefined && !didWarnValueDefaultValue$1) {
2180 + error('Select elements must be either controlled or uncontrolled ' + '(specify either the value prop, or the defaultValue prop, but not ' + 'both). Decide between using a controlled or uncontrolled select ' + 'element and remove one of these props. More info: ' + 'https://reactjs.org/link/controlled-components');
2181 +
2182 + didWarnValueDefaultValue$1 = true;
2183 + }
2184 + }
2185 + }
2186 + function postMountWrapper$2(element, props) {
2187 + var node = element;
2188 + node.multiple = !!props.multiple;
2189 + var value = props.value;
2190 +
2191 + if (value != null) {
2192 + updateOptions(node, !!props.multiple, value, false);
2193 + } else if (props.defaultValue != null) {
2194 + updateOptions(node, !!props.multiple, props.defaultValue, true);
2195 + }
2196 + }
2197 + function postUpdateWrapper(element, props) {
2198 + var node = element;
2199 + var wasMultiple = node._wrapperState.wasMultiple;
2200 + node._wrapperState.wasMultiple = !!props.multiple;
2201 + var value = props.value;
2202 +
2203 + if (value != null) {
2204 + updateOptions(node, !!props.multiple, value, false);
2205 + } else if (wasMultiple !== !!props.multiple) {
2206 + // For simplicity, reapply `defaultValue` if `multiple` is toggled.
2207 + if (props.defaultValue != null) {
2208 + updateOptions(node, !!props.multiple, props.defaultValue, true);
2209 + } else {
2210 + // Revert the select back to its default unselected state.
2211 + updateOptions(node, !!props.multiple, props.multiple ? [] : '', false);
2212 + }
2213 + }
2214 + }
2215 + function restoreControlledState$1(element, props) {
2216 + var node = element;
2217 + var value = props.value;
2218 +
2219 + if (value != null) {
2220 + updateOptions(node, !!props.multiple, value, false);
2221 + }
2222 + }
2223 +
2224 + var didWarnValDefaultVal = false;
2225 +
2226 + /**
2227 + * Implements a <textarea> host component that allows setting `value`, and
2228 + * `defaultValue`. This differs from the traditional DOM API because value is
2229 + * usually set as PCDATA children.
2230 + *
2231 + * If `value` is not supplied (or null/undefined), user actions that affect the
2232 + * value will trigger updates to the element.
2233 + *
2234 + * If `value` is supplied (and not null/undefined), the rendered element will
2235 + * not trigger updates to the element. Instead, the `value` prop must change in
2236 + * order for the rendered element to be updated.
2237 + *
2238 + * The rendered element will be initialized with an empty value, the prop
2239 + * `defaultValue` if specified, or the children content (deprecated).
2240 + */
2241 + function getHostProps$2(element, props) {
2242 + var node = element;
2243 +
2244 + if (props.dangerouslySetInnerHTML != null) {
2245 + throw new Error('`dangerouslySetInnerHTML` does not make sense on <textarea>.');
2246 + } // Always set children to the same thing. In IE9, the selection range will
2247 + // get reset if `textContent` is mutated. We could add a check in setTextContent
2248 + // to only set the value if/when the value differs from the node value (which would
2249 + // completely solve this IE9 bug), but Sebastian+Sophie seemed to like this
2250 + // solution. The value can be a boolean or object so that's why it's forced
2251 + // to be a string.
2252 +
2253 +
2254 + var hostProps = assign({}, props, {
2255 + value: undefined,
2256 + defaultValue: undefined,
2257 + children: toString(node._wrapperState.initialValue)
2258 + });
2259 +
2260 + return hostProps;
2261 + }
2262 + function initWrapperState$2(element, props) {
2263 + var node = element;
2264 +
2265 + {
2266 + checkControlledValueProps('textarea', props);
2267 +
2268 + if (props.value !== undefined && props.defaultValue !== undefined && !didWarnValDefaultVal) {
2269 + error('%s contains a textarea with both value and defaultValue props. ' + 'Textarea elements must be either controlled or uncontrolled ' + '(specify either the value prop, or the defaultValue prop, but not ' + 'both). Decide between using a controlled or uncontrolled textarea ' + 'and remove one of these props. More info: ' + 'https://reactjs.org/link/controlled-components', getCurrentFiberOwnerNameInDevOrNull() || 'A component');
2270 +
2271 + didWarnValDefaultVal = true;
2272 + }
2273 + }
2274 +
2275 + var initialValue = props.value; // Only bother fetching default value if we're going to use it
2276 +
2277 + if (initialValue == null) {
2278 + var children = props.children,
2279 + defaultValue = props.defaultValue;
2280 +
2281 + if (children != null) {
2282 + {
2283 + error('Use the `defaultValue` or `value` props instead of setting ' + 'children on <textarea>.');
2284 + }
2285 +
2286 + {
2287 + if (defaultValue != null) {
2288 + throw new Error('If you supply `defaultValue` on a <textarea>, do not pass children.');
2289 + }
2290 +
2291 + if (isArray(children)) {
2292 + if (children.length > 1) {
2293 + throw new Error('<textarea> can only have at most one child.');
2294 + }
2295 +
2296 + children = children[0];
2297 + }
2298 +
2299 + defaultValue = children;
2300 + }
2301 + }
2302 +
2303 + if (defaultValue == null) {
2304 + defaultValue = '';
2305 + }
2306 +
2307 + initialValue = defaultValue;
2308 + }
2309 +
2310 + node._wrapperState = {
2311 + initialValue: getToStringValue(initialValue)
2312 + };
2313 + }
2314 + function updateWrapper$1(element, props) {
2315 + var node = element;
2316 + var value = getToStringValue(props.value);
2317 + var defaultValue = getToStringValue(props.defaultValue);
2318 +
2319 + if (value != null) {
2320 + // Cast `value` to a string to ensure the value is set correctly. While
2321 + // browsers typically do this as necessary, jsdom doesn't.
2322 + var newValue = toString(value); // To avoid side effects (such as losing text selection), only set value if changed
2323 +
2324 + if (newValue !== node.value) {
2325 + node.value = newValue;
2326 + }
2327 +
2328 + if (props.defaultValue == null && node.defaultValue !== newValue) {
2329 + node.defaultValue = newValue;
2330 + }
2331 + }
2332 +
2333 + if (defaultValue != null) {
2334 + node.defaultValue = toString(defaultValue);
2335 + }
2336 + }
2337 + function postMountWrapper$3(element, props) {
2338 + var node = element; // This is in postMount because we need access to the DOM node, which is not
2339 + // available until after the component has mounted.
2340 +
2341 + var textContent = node.textContent; // Only set node.value if textContent is equal to the expected
2342 + // initial value. In IE10/IE11 there is a bug where the placeholder attribute
2343 + // will populate textContent as well.
2344 + // https://developer.microsoft.com/microsoft-edge/platform/issues/101525/
2345 +
2346 + if (textContent === node._wrapperState.initialValue) {
2347 + if (textContent !== '' && textContent !== null) {
2348 + node.value = textContent;
2349 + }
2350 + }
2351 + }
2352 + function restoreControlledState$2(element, props) {
2353 + // DOM component is still mounted; update
2354 + updateWrapper$1(element, props);
2355 + }
2356 +
2357 + var HTML_NAMESPACE = 'http://www.w3.org/1999/xhtml';
2358 + var MATH_NAMESPACE = 'http://www.w3.org/1998/Math/MathML';
2359 + var SVG_NAMESPACE = 'http://www.w3.org/2000/svg'; // Assumes there is no parent namespace.
2360 +
2361 + function getIntrinsicNamespace(type) {
2362 + switch (type) {
2363 + case 'svg':
2364 + return SVG_NAMESPACE;
2365 +
2366 + case 'math':
2367 + return MATH_NAMESPACE;
2368 +
2369 + default:
2370 + return HTML_NAMESPACE;
2371 + }
2372 + }
2373 + function getChildNamespace(parentNamespace, type) {
2374 + if (parentNamespace == null || parentNamespace === HTML_NAMESPACE) {
2375 + // No (or default) parent namespace: potential entry point.
2376 + return getIntrinsicNamespace(type);
2377 + }
2378 +
2379 + if (parentNamespace === SVG_NAMESPACE && type === 'foreignObject') {
2380 + // We're leaving SVG.
2381 + return HTML_NAMESPACE;
2382 + } // By default, pass namespace below.
2383 +
2384 +
2385 + return parentNamespace;
2386 + }
2387 +
2388 + /* globals MSApp */
2389 +
2390 + /**
2391 + * Create a function which has 'unsafe' privileges (required by windows8 apps)
2392 + */
2393 + var createMicrosoftUnsafeLocalFunction = function (func) {
2394 + if (typeof MSApp !== 'undefined' && MSApp.execUnsafeLocalFunction) {
2395 + return function (arg0, arg1, arg2, arg3) {
2396 + MSApp.execUnsafeLocalFunction(function () {
2397 + return func(arg0, arg1, arg2, arg3);
2398 + });
2399 + };
2400 + } else {
2401 + return func;
2402 + }
2403 + };
2404 +
2405 + var reusableSVGContainer;
2406 + /**
2407 + * Set the innerHTML property of a node
2408 + *
2409 + * @param {DOMElement} node
2410 + * @param {string} html
2411 + * @internal
2412 + */
2413 +
2414 + var setInnerHTML = createMicrosoftUnsafeLocalFunction(function (node, html) {
2415 + if (node.namespaceURI === SVG_NAMESPACE) {
2416 +
2417 + if (!('innerHTML' in node)) {
2418 + // IE does not have innerHTML for SVG nodes, so instead we inject the
2419 + // new markup in a temp node and then move the child nodes across into
2420 + // the target node
2421 + reusableSVGContainer = reusableSVGContainer || document.createElement('div');
2422 + reusableSVGContainer.innerHTML = '<svg>' + html.valueOf().toString() + '</svg>';
2423 + var svgNode = reusableSVGContainer.firstChild;
2424 +
2425 + while (node.firstChild) {
2426 + node.removeChild(node.firstChild);
2427 + }
2428 +
2429 + while (svgNode.firstChild) {
2430 + node.appendChild(svgNode.firstChild);
2431 + }
2432 +
2433 + return;
2434 + }
2435 + }
2436 +
2437 + node.innerHTML = html;
2438 + });
2439 +
2440 + /**
2441 + * HTML nodeType values that represent the type of the node
2442 + */
2443 + var ELEMENT_NODE = 1;
2444 + var TEXT_NODE = 3;
2445 + var COMMENT_NODE = 8;
2446 + var DOCUMENT_NODE = 9;
2447 + var DOCUMENT_FRAGMENT_NODE = 11;
2448 +
2449 + /**
2450 + * Set the textContent property of a node. For text updates, it's faster
2451 + * to set the `nodeValue` of the Text node directly instead of using
2452 + * `.textContent` which will remove the existing node and create a new one.
2453 + *
2454 + * @param {DOMElement} node
2455 + * @param {string} text
2456 + * @internal
2457 + */
2458 +
2459 + var setTextContent = function (node, text) {
2460 + if (text) {
2461 + var firstChild = node.firstChild;
2462 +
2463 + if (firstChild && firstChild === node.lastChild && firstChild.nodeType === TEXT_NODE) {
2464 + firstChild.nodeValue = text;
2465 + return;
2466 + }
2467 + }
2468 +
2469 + node.textContent = text;
2470 + };
2471 +
2472 + // List derived from Gecko source code:
2473 + // https://github.com/mozilla/gecko-dev/blob/4e638efc71/layout/style/test/property_database.js
2474 + var shorthandToLonghand = {
2475 + animation: ['animationDelay', 'animationDirection', 'animationDuration', 'animationFillMode', 'animationIterationCount', 'animationName', 'animationPlayState', 'animationTimingFunction'],
2476 + background: ['backgroundAttachment', 'backgroundClip', 'backgroundColor', 'backgroundImage', 'backgroundOrigin', 'backgroundPositionX', 'backgroundPositionY', 'backgroundRepeat', 'backgroundSize'],
2477 + backgroundPosition: ['backgroundPositionX', 'backgroundPositionY'],
2478 + border: ['borderBottomColor', 'borderBottomStyle', 'borderBottomWidth', 'borderImageOutset', 'borderImageRepeat', 'borderImageSlice', 'borderImageSource', 'borderImageWidth', 'borderLeftColor', 'borderLeftStyle', 'borderLeftWidth', 'borderRightColor', 'borderRightStyle', 'borderRightWidth', 'borderTopColor', 'borderTopStyle', 'borderTopWidth'],
2479 + borderBlockEnd: ['borderBlockEndColor', 'borderBlockEndStyle', 'borderBlockEndWidth'],
2480 + borderBlockStart: ['borderBlockStartColor', 'borderBlockStartStyle', 'borderBlockStartWidth'],
2481 + borderBottom: ['borderBottomColor', 'borderBottomStyle', 'borderBottomWidth'],
2482 + borderColor: ['borderBottomColor', 'borderLeftColor', 'borderRightColor', 'borderTopColor'],
2483 + borderImage: ['borderImageOutset', 'borderImageRepeat', 'borderImageSlice', 'borderImageSource', 'borderImageWidth'],
2484 + borderInlineEnd: ['borderInlineEndColor', 'borderInlineEndStyle', 'borderInlineEndWidth'],
2485 + borderInlineStart: ['borderInlineStartColor', 'borderInlineStartStyle', 'borderInlineStartWidth'],
2486 + borderLeft: ['borderLeftColor', 'borderLeftStyle', 'borderLeftWidth'],
2487 + borderRadius: ['borderBottomLeftRadius', 'borderBottomRightRadius', 'borderTopLeftRadius', 'borderTopRightRadius'],
2488 + borderRight: ['borderRightColor', 'borderRightStyle', 'borderRightWidth'],
2489 + borderStyle: ['borderBottomStyle', 'borderLeftStyle', 'borderRightStyle', 'borderTopStyle'],
2490 + borderTop: ['borderTopColor', 'borderTopStyle', 'borderTopWidth'],
2491 + borderWidth: ['borderBottomWidth', 'borderLeftWidth', 'borderRightWidth', 'borderTopWidth'],
2492 + columnRule: ['columnRuleColor', 'columnRuleStyle', 'columnRuleWidth'],
2493 + columns: ['columnCount', 'columnWidth'],
2494 + flex: ['flexBasis', 'flexGrow', 'flexShrink'],
2495 + flexFlow: ['flexDirection', 'flexWrap'],
2496 + font: ['fontFamily', 'fontFeatureSettings', 'fontKerning', 'fontLanguageOverride', 'fontSize', 'fontSizeAdjust', 'fontStretch', 'fontStyle', 'fontVariant', 'fontVariantAlternates', 'fontVariantCaps', 'fontVariantEastAsian', 'fontVariantLigatures', 'fontVariantNumeric', 'fontVariantPosition', 'fontWeight', 'lineHeight'],
2497 + fontVariant: ['fontVariantAlternates', 'fontVariantCaps', 'fontVariantEastAsian', 'fontVariantLigatures', 'fontVariantNumeric', 'fontVariantPosition'],
2498 + gap: ['columnGap', 'rowGap'],
2499 + grid: ['gridAutoColumns', 'gridAutoFlow', 'gridAutoRows', 'gridTemplateAreas', 'gridTemplateColumns', 'gridTemplateRows'],
2500 + gridArea: ['gridColumnEnd', 'gridColumnStart', 'gridRowEnd', 'gridRowStart'],
2501 + gridColumn: ['gridColumnEnd', 'gridColumnStart'],
2502 + gridColumnGap: ['columnGap'],
2503 + gridGap: ['columnGap', 'rowGap'],
2504 + gridRow: ['gridRowEnd', 'gridRowStart'],
2505 + gridRowGap: ['rowGap'],
2506 + gridTemplate: ['gridTemplateAreas', 'gridTemplateColumns', 'gridTemplateRows'],
2507 + listStyle: ['listStyleImage', 'listStylePosition', 'listStyleType'],
2508 + margin: ['marginBottom', 'marginLeft', 'marginRight', 'marginTop'],
2509 + marker: ['markerEnd', 'markerMid', 'markerStart'],
2510 + mask: ['maskClip', 'maskComposite', 'maskImage', 'maskMode', 'maskOrigin', 'maskPositionX', 'maskPositionY', 'maskRepeat', 'maskSize'],
2511 + maskPosition: ['maskPositionX', 'maskPositionY'],
2512 + outline: ['outlineColor', 'outlineStyle', 'outlineWidth'],
2513 + overflow: ['overflowX', 'overflowY'],
2514 + padding: ['paddingBottom', 'paddingLeft', 'paddingRight', 'paddingTop'],
2515 + placeContent: ['alignContent', 'justifyContent'],
2516 + placeItems: ['alignItems', 'justifyItems'],
2517 + placeSelf: ['alignSelf', 'justifySelf'],
2518 + textDecoration: ['textDecorationColor', 'textDecorationLine', 'textDecorationStyle'],
2519 + textEmphasis: ['textEmphasisColor', 'textEmphasisStyle'],
2520 + transition: ['transitionDelay', 'transitionDuration', 'transitionProperty', 'transitionTimingFunction'],
2521 + wordWrap: ['overflowWrap']
2522 + };
2523 +
2524 + /**
2525 + * CSS properties which accept numbers but are not in units of "px".
2526 + */
2527 + var isUnitlessNumber = {
2528 + animationIterationCount: true,
2529 + aspectRatio: true,
2530 + borderImageOutset: true,
2531 + borderImageSlice: true,
2532 + borderImageWidth: true,
2533 + boxFlex: true,
2534 + boxFlexGroup: true,
2535 + boxOrdinalGroup: true,
2536 + columnCount: true,
2537 + columns: true,
2538 + flex: true,
2539 + flexGrow: true,
2540 + flexPositive: true,
2541 + flexShrink: true,
2542 + flexNegative: true,
2543 + flexOrder: true,
2544 + gridArea: true,
2545 + gridRow: true,
2546 + gridRowEnd: true,
2547 + gridRowSpan: true,
2548 + gridRowStart: true,
2549 + gridColumn: true,
2550 + gridColumnEnd: true,
2551 + gridColumnSpan: true,
2552 + gridColumnStart: true,
2553 + fontWeight: true,
2554 + lineClamp: true,
2555 + lineHeight: true,
2556 + opacity: true,
2557 + order: true,
2558 + orphans: true,
2559 + tabSize: true,
2560 + widows: true,
2561 + zIndex: true,
2562 + zoom: true,
2563 + // SVG-related properties
2564 + fillOpacity: true,
2565 + floodOpacity: true,
2566 + stopOpacity: true,
2567 + strokeDasharray: true,
2568 + strokeDashoffset: true,
2569 + strokeMiterlimit: true,
2570 + strokeOpacity: true,
2571 + strokeWidth: true
2572 + };
2573 + /**
2574 + * @param {string} prefix vendor-specific prefix, eg: Webkit
2575 + * @param {string} key style name, eg: transitionDuration
2576 + * @return {string} style name prefixed with `prefix`, properly camelCased, eg:
2577 + * WebkitTransitionDuration
2578 + */
2579 +
2580 + function prefixKey(prefix, key) {
2581 + return prefix + key.charAt(0).toUpperCase() + key.substring(1);
2582 + }
2583 + /**
2584 + * Support style names that may come passed in prefixed by adding permutations
2585 + * of vendor prefixes.
2586 + */
2587 +
2588 +
2589 + var prefixes = ['Webkit', 'ms', 'Moz', 'O']; // Using Object.keys here, or else the vanilla for-in loop makes IE8 go into an
2590 + // infinite loop, because it iterates over the newly added props too.
2591 +
2592 + Object.keys(isUnitlessNumber).forEach(function (prop) {
2593 + prefixes.forEach(function (prefix) {
2594 + isUnitlessNumber[prefixKey(prefix, prop)] = isUnitlessNumber[prop];
2595 + });
2596 + });
2597 +
2598 + /**
2599 + * Convert a value into the proper css writable value. The style name `name`
2600 + * should be logical (no hyphens), as specified
2601 + * in `CSSProperty.isUnitlessNumber`.
2602 + *
2603 + * @param {string} name CSS property name such as `topMargin`.
2604 + * @param {*} value CSS property value such as `10px`.
2605 + * @return {string} Normalized style value with dimensions applied.
2606 + */
2607 +
2608 + function dangerousStyleValue(name, value, isCustomProperty) {
2609 + // Note that we've removed escapeTextForBrowser() calls here since the
2610 + // whole string will be escaped when the attribute is injected into
2611 + // the markup. If you provide unsafe user data here they can inject
2612 + // arbitrary CSS which may be problematic (I couldn't repro this):
2613 + // https://www.owasp.org/index.php/XSS_Filter_Evasion_Cheat_Sheet
2614 + // http://www.thespanner.co.uk/2007/11/26/ultimate-xss-css-injection/
2615 + // This is not an XSS hole but instead a potential CSS injection issue
2616 + // which has lead to a greater discussion about how we're going to
2617 + // trust URLs moving forward. See #2115901
2618 + var isEmpty = value == null || typeof value === 'boolean' || value === '';
2619 +
2620 + if (isEmpty) {
2621 + return '';
2622 + }
2623 +
2624 + if (!isCustomProperty && typeof value === 'number' && value !== 0 && !(isUnitlessNumber.hasOwnProperty(name) && isUnitlessNumber[name])) {
2625 + return value + 'px'; // Presumes implicit 'px' suffix for unitless numbers
2626 + }
2627 +
2628 + {
2629 + checkCSSPropertyStringCoercion(value, name);
2630 + }
2631 +
2632 + return ('' + value).trim();
2633 + }
2634 +
2635 + var uppercasePattern = /([A-Z])/g;
2636 + var msPattern = /^ms-/;
2637 + /**
2638 + * Hyphenates a camelcased CSS property name, for example:
2639 + *
2640 + * > hyphenateStyleName('backgroundColor')
2641 + * < "background-color"
2642 + * > hyphenateStyleName('MozTransition')
2643 + * < "-moz-transition"
2644 + * > hyphenateStyleName('msTransition')
2645 + * < "-ms-transition"
2646 + *
2647 + * As Modernizr suggests (http://modernizr.com/docs/#prefixed), an `ms` prefix
2648 + * is converted to `-ms-`.
2649 + */
2650 +
2651 + function hyphenateStyleName(name) {
2652 + return name.replace(uppercasePattern, '-$1').toLowerCase().replace(msPattern, '-ms-');
2653 + }
2654 +
2655 + var warnValidStyle = function () {};
2656 +
2657 + {
2658 + // 'msTransform' is correct, but the other prefixes should be capitalized
2659 + var badVendoredStyleNamePattern = /^(?:webkit|moz|o)[A-Z]/;
2660 + var msPattern$1 = /^-ms-/;
2661 + var hyphenPattern = /-(.)/g; // style values shouldn't contain a semicolon
2662 +
2663 + var badStyleValueWithSemicolonPattern = /;\s*$/;
2664 + var warnedStyleNames = {};
2665 + var warnedStyleValues = {};
2666 + var warnedForNaNValue = false;
2667 + var warnedForInfinityValue = false;
2668 +
2669 + var camelize = function (string) {
2670 + return string.replace(hyphenPattern, function (_, character) {
2671 + return character.toUpperCase();
2672 + });
2673 + };
2674 +
2675 + var warnHyphenatedStyleName = function (name) {
2676 + if (warnedStyleNames.hasOwnProperty(name) && warnedStyleNames[name]) {
2677 + return;
2678 + }
2679 +
2680 + warnedStyleNames[name] = true;
2681 +
2682 + error('Unsupported style property %s. Did you mean %s?', name, // As Andi Smith suggests
2683 + // (http://www.andismith.com/blog/2012/02/modernizr-prefixed/), an `-ms` prefix
2684 + // is converted to lowercase `ms`.
2685 + camelize(name.replace(msPattern$1, 'ms-')));
2686 + };
2687 +
2688 + var warnBadVendoredStyleName = function (name) {
2689 + if (warnedStyleNames.hasOwnProperty(name) && warnedStyleNames[name]) {
2690 + return;
2691 + }
2692 +
2693 + warnedStyleNames[name] = true;
2694 +
2695 + error('Unsupported vendor-prefixed style property %s. Did you mean %s?', name, name.charAt(0).toUpperCase() + name.slice(1));
2696 + };
2697 +
2698 + var warnStyleValueWithSemicolon = function (name, value) {
2699 + if (warnedStyleValues.hasOwnProperty(value) && warnedStyleValues[value]) {
2700 + return;
2701 + }
2702 +
2703 + warnedStyleValues[value] = true;
2704 +
2705 + error("Style property values shouldn't contain a semicolon. " + 'Try "%s: %s" instead.', name, value.replace(badStyleValueWithSemicolonPattern, ''));
2706 + };
2707 +
2708 + var warnStyleValueIsNaN = function (name, value) {
2709 + if (warnedForNaNValue) {
2710 + return;
2711 + }
2712 +
2713 + warnedForNaNValue = true;
2714 +
2715 + error('`NaN` is an invalid value for the `%s` css style property.', name);
2716 + };
2717 +
2718 + var warnStyleValueIsInfinity = function (name, value) {
2719 + if (warnedForInfinityValue) {
2720 + return;
2721 + }
2722 +
2723 + warnedForInfinityValue = true;
2724 +
2725 + error('`Infinity` is an invalid value for the `%s` css style property.', name);
2726 + };
2727 +
2728 + warnValidStyle = function (name, value) {
2729 + if (name.indexOf('-') > -1) {
2730 + warnHyphenatedStyleName(name);
2731 + } else if (badVendoredStyleNamePattern.test(name)) {
2732 + warnBadVendoredStyleName(name);
2733 + } else if (badStyleValueWithSemicolonPattern.test(value)) {
2734 + warnStyleValueWithSemicolon(name, value);
2735 + }
2736 +
2737 + if (typeof value === 'number') {
2738 + if (isNaN(value)) {
2739 + warnStyleValueIsNaN(name, value);
2740 + } else if (!isFinite(value)) {
2741 + warnStyleValueIsInfinity(name, value);
2742 + }
2743 + }
2744 + };
2745 + }
2746 +
2747 + var warnValidStyle$1 = warnValidStyle;
2748 +
2749 + /**
2750 + * Operations for dealing with CSS properties.
2751 + */
2752 +
2753 + /**
2754 + * This creates a string that is expected to be equivalent to the style
2755 + * attribute generated by server-side rendering. It by-passes warnings and
2756 + * security checks so it's not safe to use this value for anything other than
2757 + * comparison. It is only used in DEV for SSR validation.
2758 + */
2759 +
2760 + function createDangerousStringForStyles(styles) {
2761 + {
2762 + var serialized = '';
2763 + var delimiter = '';
2764 +
2765 + for (var styleName in styles) {
2766 + if (!styles.hasOwnProperty(styleName)) {
2767 + continue;
2768 + }
2769 +
2770 + var styleValue = styles[styleName];
2771 +
2772 + if (styleValue != null) {
2773 + var isCustomProperty = styleName.indexOf('--') === 0;
2774 + serialized += delimiter + (isCustomProperty ? styleName : hyphenateStyleName(styleName)) + ':';
2775 + serialized += dangerousStyleValue(styleName, styleValue, isCustomProperty);
2776 + delimiter = ';';
2777 + }
2778 + }
2779 +
2780 + return serialized || null;
2781 + }
2782 + }
2783 + /**
2784 + * Sets the value for multiple styles on a node. If a value is specified as
2785 + * '' (empty string), the corresponding style property will be unset.
2786 + *
2787 + * @param {DOMElement} node
2788 + * @param {object} styles
2789 + */
2790 +
2791 + function setValueForStyles(node, styles) {
2792 + var style = node.style;
2793 +
2794 + for (var styleName in styles) {
2795 + if (!styles.hasOwnProperty(styleName)) {
2796 + continue;
2797 + }
2798 +
2799 + var isCustomProperty = styleName.indexOf('--') === 0;
2800 +
2801 + {
2802 + if (!isCustomProperty) {
2803 + warnValidStyle$1(styleName, styles[styleName]);
2804 + }
2805 + }
2806 +
2807 + var styleValue = dangerousStyleValue(styleName, styles[styleName], isCustomProperty);
2808 +
2809 + if (styleName === 'float') {
2810 + styleName = 'cssFloat';
2811 + }
2812 +
2813 + if (isCustomProperty) {
2814 + style.setProperty(styleName, styleValue);
2815 + } else {
2816 + style[styleName] = styleValue;
2817 + }
2818 + }
2819 + }
2820 +
2821 + function isValueEmpty(value) {
2822 + return value == null || typeof value === 'boolean' || value === '';
2823 + }
2824 + /**
2825 + * Given {color: 'red', overflow: 'hidden'} returns {
2826 + * color: 'color',
2827 + * overflowX: 'overflow',
2828 + * overflowY: 'overflow',
2829 + * }. This can be read as "the overflowY property was set by the overflow
2830 + * shorthand". That is, the values are the property that each was derived from.
2831 + */
2832 +
2833 +
2834 + function expandShorthandMap(styles) {
2835 + var expanded = {};
2836 +
2837 + for (var key in styles) {
2838 + var longhands = shorthandToLonghand[key] || [key];
2839 +
2840 + for (var i = 0; i < longhands.length; i++) {
2841 + expanded[longhands[i]] = key;
2842 + }
2843 + }
2844 +
2845 + return expanded;
2846 + }
2847 + /**
2848 + * When mixing shorthand and longhand property names, we warn during updates if
2849 + * we expect an incorrect result to occur. In particular, we warn for:
2850 + *
2851 + * Updating a shorthand property (longhand gets overwritten):
2852 + * {font: 'foo', fontVariant: 'bar'} -> {font: 'baz', fontVariant: 'bar'}
2853 + * becomes .style.font = 'baz'
2854 + * Removing a shorthand property (longhand gets lost too):
2855 + * {font: 'foo', fontVariant: 'bar'} -> {fontVariant: 'bar'}
2856 + * becomes .style.font = ''
2857 + * Removing a longhand property (should revert to shorthand; doesn't):
2858 + * {font: 'foo', fontVariant: 'bar'} -> {font: 'foo'}
2859 + * becomes .style.fontVariant = ''
2860 + */
2861 +
2862 +
2863 + function validateShorthandPropertyCollisionInDev(styleUpdates, nextStyles) {
2864 + {
2865 + if (!nextStyles) {
2866 + return;
2867 + }
2868 +
2869 + var expandedUpdates = expandShorthandMap(styleUpdates);
2870 + var expandedStyles = expandShorthandMap(nextStyles);
2871 + var warnedAbout = {};
2872 +
2873 + for (var key in expandedUpdates) {
2874 + var originalKey = expandedUpdates[key];
2875 + var correctOriginalKey = expandedStyles[key];
2876 +
2877 + if (correctOriginalKey && originalKey !== correctOriginalKey) {
2878 + var warningKey = originalKey + ',' + correctOriginalKey;
2879 +
2880 + if (warnedAbout[warningKey]) {
2881 + continue;
2882 + }
2883 +
2884 + warnedAbout[warningKey] = true;
2885 +
2886 + error('%s a style property during rerender (%s) when a ' + 'conflicting property is set (%s) can lead to styling bugs. To ' + "avoid this, don't mix shorthand and non-shorthand properties " + 'for the same value; instead, replace the shorthand with ' + 'separate values.', isValueEmpty(styleUpdates[originalKey]) ? 'Removing' : 'Updating', originalKey, correctOriginalKey);
2887 + }
2888 + }
2889 + }
2890 + }
2891 +
2892 + // For HTML, certain tags should omit their close tag. We keep a list for
2893 + // those special-case tags.
2894 + var omittedCloseTags = {
2895 + area: true,
2896 + base: true,
2897 + br: true,
2898 + col: true,
2899 + embed: true,
2900 + hr: true,
2901 + img: true,
2902 + input: true,
2903 + keygen: true,
2904 + link: true,
2905 + meta: true,
2906 + param: true,
2907 + source: true,
2908 + track: true,
2909 + wbr: true // NOTE: menuitem's close tag should be omitted, but that causes problems.
2910 +
2911 + };
2912 +
2913 + // `omittedCloseTags` except that `menuitem` should still have its closing tag.
2914 +
2915 + var voidElementTags = assign({
2916 + menuitem: true
2917 + }, omittedCloseTags);
2918 +
2919 + var HTML = '__html';
2920 +
2921 + function assertValidProps(tag, props) {
2922 + if (!props) {
2923 + return;
2924 + } // Note the use of `==` which checks for null or undefined.
2925 +
2926 +
2927 + if (voidElementTags[tag]) {
2928 + if (props.children != null || props.dangerouslySetInnerHTML != null) {
2929 + throw new Error(tag + " is a void element tag and must neither have `children` nor " + 'use `dangerouslySetInnerHTML`.');
2930 + }
2931 + }
2932 +
2933 + if (props.dangerouslySetInnerHTML != null) {
2934 + if (props.children != null) {
2935 + throw new Error('Can only set one of `children` or `props.dangerouslySetInnerHTML`.');
2936 + }
2937 +
2938 + if (typeof props.dangerouslySetInnerHTML !== 'object' || !(HTML in props.dangerouslySetInnerHTML)) {
2939 + throw new Error('`props.dangerouslySetInnerHTML` must be in the form `{__html: ...}`. ' + 'Please visit https://reactjs.org/link/dangerously-set-inner-html ' + 'for more information.');
2940 + }
2941 + }
2942 +
2943 + {
2944 + if (!props.suppressContentEditableWarning && props.contentEditable && props.children != null) {
2945 + error('A component is `contentEditable` and contains `children` managed by ' + 'React. It is now your responsibility to guarantee that none of ' + 'those nodes are unexpectedly modified or duplicated. This is ' + 'probably not intentional.');
2946 + }
2947 + }
2948 +
2949 + if (props.style != null && typeof props.style !== 'object') {
2950 + throw new Error('The `style` prop expects a mapping from style properties to values, ' + "not a string. For example, style={{marginRight: spacing + 'em'}} when " + 'using JSX.');
2951 + }
2952 + }
2953 +
2954 + function isCustomComponent(tagName, props) {
2955 + if (tagName.indexOf('-') === -1) {
2956 + return typeof props.is === 'string';
2957 + }
2958 +
2959 + switch (tagName) {
2960 + // These are reserved SVG and MathML elements.
2961 + // We don't mind this list too much because we expect it to never grow.
2962 + // The alternative is to track the namespace in a few places which is convoluted.
2963 + // https://w3c.github.io/webcomponents/spec/custom/#custom-elements-core-concepts
2964 + case 'annotation-xml':
2965 + case 'color-profile':
2966 + case 'font-face':
2967 + case 'font-face-src':
2968 + case 'font-face-uri':
2969 + case 'font-face-format':
2970 + case 'font-face-name':
2971 + case 'missing-glyph':
2972 + return false;
2973 +
2974 + default:
2975 + return true;
2976 + }
2977 + }
2978 +
2979 + // When adding attributes to the HTML or SVG allowed attribute list, be sure to
2980 + // also add them to this module to ensure casing and incorrect name
2981 + // warnings.
2982 + var possibleStandardNames = {
2983 + // HTML
2984 + accept: 'accept',
2985 + acceptcharset: 'acceptCharset',
2986 + 'accept-charset': 'acceptCharset',
2987 + accesskey: 'accessKey',
2988 + action: 'action',
2989 + allowfullscreen: 'allowFullScreen',
2990 + alt: 'alt',
2991 + as: 'as',
2992 + async: 'async',
2993 + autocapitalize: 'autoCapitalize',
2994 + autocomplete: 'autoComplete',
2995 + autocorrect: 'autoCorrect',
2996 + autofocus: 'autoFocus',
2997 + autoplay: 'autoPlay',
2998 + autosave: 'autoSave',
2999 + capture: 'capture',
3000 + cellpadding: 'cellPadding',
3001 + cellspacing: 'cellSpacing',
3002 + challenge: 'challenge',
3003 + charset: 'charSet',
3004 + checked: 'checked',
3005 + children: 'children',
3006 + cite: 'cite',
3007 + class: 'className',
3008 + classid: 'classID',
3009 + classname: 'className',
3010 + cols: 'cols',
3011 + colspan: 'colSpan',
3012 + content: 'content',
3013 + contenteditable: 'contentEditable',
3014 + contextmenu: 'contextMenu',
3015 + controls: 'controls',
3016 + controlslist: 'controlsList',
3017 + coords: 'coords',
3018 + crossorigin: 'crossOrigin',
3019 + dangerouslysetinnerhtml: 'dangerouslySetInnerHTML',
3020 + data: 'data',
3021 + datetime: 'dateTime',
3022 + default: 'default',
3023 + defaultchecked: 'defaultChecked',
3024 + defaultvalue: 'defaultValue',
3025 + defer: 'defer',
3026 + dir: 'dir',
3027 + disabled: 'disabled',
3028 + disablepictureinpicture: 'disablePictureInPicture',
3029 + disableremoteplayback: 'disableRemotePlayback',
3030 + download: 'download',
3031 + draggable: 'draggable',
3032 + enctype: 'encType',
3033 + enterkeyhint: 'enterKeyHint',
3034 + for: 'htmlFor',
3035 + form: 'form',
3036 + formmethod: 'formMethod',
3037 + formaction: 'formAction',
3038 + formenctype: 'formEncType',
3039 + formnovalidate: 'formNoValidate',
3040 + formtarget: 'formTarget',
3041 + frameborder: 'frameBorder',
3042 + headers: 'headers',
3043 + height: 'height',
3044 + hidden: 'hidden',
3045 + high: 'high',
3046 + href: 'href',
3047 + hreflang: 'hrefLang',
3048 + htmlfor: 'htmlFor',
3049 + httpequiv: 'httpEquiv',
3050 + 'http-equiv': 'httpEquiv',
3051 + icon: 'icon',
3052 + id: 'id',
3053 + imagesizes: 'imageSizes',
3054 + imagesrcset: 'imageSrcSet',
3055 + innerhtml: 'innerHTML',
3056 + inputmode: 'inputMode',
3057 + integrity: 'integrity',
3058 + is: 'is',
3059 + itemid: 'itemID',
3060 + itemprop: 'itemProp',
3061 + itemref: 'itemRef',
3062 + itemscope: 'itemScope',
3063 + itemtype: 'itemType',
3064 + keyparams: 'keyParams',
3065 + keytype: 'keyType',
3066 + kind: 'kind',
3067 + label: 'label',
3068 + lang: 'lang',
3069 + list: 'list',
3070 + loop: 'loop',
3071 + low: 'low',
3072 + manifest: 'manifest',
3073 + marginwidth: 'marginWidth',
3074 + marginheight: 'marginHeight',
3075 + max: 'max',
3076 + maxlength: 'maxLength',
3077 + media: 'media',
3078 + mediagroup: 'mediaGroup',
3079 + method: 'method',
3080 + min: 'min',
3081 + minlength: 'minLength',
3082 + multiple: 'multiple',
3083 + muted: 'muted',
3084 + name: 'name',
3085 + nomodule: 'noModule',
3086 + nonce: 'nonce',
3087 + novalidate: 'noValidate',
3088 + open: 'open',
3089 + optimum: 'optimum',
3090 + pattern: 'pattern',
3091 + placeholder: 'placeholder',
3092 + playsinline: 'playsInline',
3093 + poster: 'poster',
3094 + preload: 'preload',
3095 + profile: 'profile',
3096 + radiogroup: 'radioGroup',
3097 + readonly: 'readOnly',
3098 + referrerpolicy: 'referrerPolicy',
3099 + rel: 'rel',
3100 + required: 'required',
3101 + reversed: 'reversed',
3102 + role: 'role',
3103 + rows: 'rows',
3104 + rowspan: 'rowSpan',
3105 + sandbox: 'sandbox',
3106 + scope: 'scope',
3107 + scoped: 'scoped',
3108 + scrolling: 'scrolling',
3109 + seamless: 'seamless',
3110 + selected: 'selected',
3111 + shape: 'shape',
3112 + size: 'size',
3113 + sizes: 'sizes',
3114 + span: 'span',
3115 + spellcheck: 'spellCheck',
3116 + src: 'src',
3117 + srcdoc: 'srcDoc',
3118 + srclang: 'srcLang',
3119 + srcset: 'srcSet',
3120 + start: 'start',
3121 + step: 'step',
3122 + style: 'style',
3123 + summary: 'summary',
3124 + tabindex: 'tabIndex',
3125 + target: 'target',
3126 + title: 'title',
3127 + type: 'type',
3128 + usemap: 'useMap',
3129 + value: 'value',
3130 + width: 'width',
3131 + wmode: 'wmode',
3132 + wrap: 'wrap',
3133 + // SVG
3134 + about: 'about',
3135 + accentheight: 'accentHeight',
3136 + 'accent-height': 'accentHeight',
3137 + accumulate: 'accumulate',
3138 + additive: 'additive',
3139 + alignmentbaseline: 'alignmentBaseline',
3140 + 'alignment-baseline': 'alignmentBaseline',
3141 + allowreorder: 'allowReorder',
3142 + alphabetic: 'alphabetic',
3143 + amplitude: 'amplitude',
3144 + arabicform: 'arabicForm',
3145 + 'arabic-form': 'arabicForm',
3146 + ascent: 'ascent',
3147 + attributename: 'attributeName',
3148 + attributetype: 'attributeType',
3149 + autoreverse: 'autoReverse',
3150 + azimuth: 'azimuth',
3151 + basefrequency: 'baseFrequency',
3152 + baselineshift: 'baselineShift',
3153 + 'baseline-shift': 'baselineShift',
3154 + baseprofile: 'baseProfile',
3155 + bbox: 'bbox',
3156 + begin: 'begin',
3157 + bias: 'bias',
3158 + by: 'by',
3159 + calcmode: 'calcMode',
3160 + capheight: 'capHeight',
3161 + 'cap-height': 'capHeight',
3162 + clip: 'clip',
3163 + clippath: 'clipPath',
3164 + 'clip-path': 'clipPath',
3165 + clippathunits: 'clipPathUnits',
3166 + cliprule: 'clipRule',
3167 + 'clip-rule': 'clipRule',
3168 + color: 'color',
3169 + colorinterpolation: 'colorInterpolation',
3170 + 'color-interpolation': 'colorInterpolation',
3171 + colorinterpolationfilters: 'colorInterpolationFilters',
3172 + 'color-interpolation-filters': 'colorInterpolationFilters',
3173 + colorprofile: 'colorProfile',
3174 + 'color-profile': 'colorProfile',
3175 + colorrendering: 'colorRendering',
3176 + 'color-rendering': 'colorRendering',
3177 + contentscripttype: 'contentScriptType',
3178 + contentstyletype: 'contentStyleType',
3179 + cursor: 'cursor',
3180 + cx: 'cx',
3181 + cy: 'cy',
3182 + d: 'd',
3183 + datatype: 'datatype',
3184 + decelerate: 'decelerate',
3185 + descent: 'descent',
3186 + diffuseconstant: 'diffuseConstant',
3187 + direction: 'direction',
3188 + display: 'display',
3189 + divisor: 'divisor',
3190 + dominantbaseline: 'dominantBaseline',
3191 + 'dominant-baseline': 'dominantBaseline',
3192 + dur: 'dur',
3193 + dx: 'dx',
3194 + dy: 'dy',
3195 + edgemode: 'edgeMode',
3196 + elevation: 'elevation',
3197 + enablebackground: 'enableBackground',
3198 + 'enable-background': 'enableBackground',
3199 + end: 'end',
3200 + exponent: 'exponent',
3201 + externalresourcesrequired: 'externalResourcesRequired',
3202 + fill: 'fill',
3203 + fillopacity: 'fillOpacity',
3204 + 'fill-opacity': 'fillOpacity',
3205 + fillrule: 'fillRule',
3206 + 'fill-rule': 'fillRule',
3207 + filter: 'filter',
3208 + filterres: 'filterRes',
3209 + filterunits: 'filterUnits',
3210 + floodopacity: 'floodOpacity',
3211 + 'flood-opacity': 'floodOpacity',
3212 + floodcolor: 'floodColor',
3213 + 'flood-color': 'floodColor',
3214 + focusable: 'focusable',
3215 + fontfamily: 'fontFamily',
3216 + 'font-family': 'fontFamily',
3217 + fontsize: 'fontSize',
3218 + 'font-size': 'fontSize',
3219 + fontsizeadjust: 'fontSizeAdjust',
3220 + 'font-size-adjust': 'fontSizeAdjust',
3221 + fontstretch: 'fontStretch',
3222 + 'font-stretch': 'fontStretch',
3223 + fontstyle: 'fontStyle',
3224 + 'font-style': 'fontStyle',
3225 + fontvariant: 'fontVariant',
3226 + 'font-variant': 'fontVariant',
3227 + fontweight: 'fontWeight',
3228 + 'font-weight': 'fontWeight',
3229 + format: 'format',
3230 + from: 'from',
3231 + fx: 'fx',
3232 + fy: 'fy',
3233 + g1: 'g1',
3234 + g2: 'g2',
3235 + glyphname: 'glyphName',
3236 + 'glyph-name': 'glyphName',
3237 + glyphorientationhorizontal: 'glyphOrientationHorizontal',
3238 + 'glyph-orientation-horizontal': 'glyphOrientationHorizontal',
3239 + glyphorientationvertical: 'glyphOrientationVertical',
3240 + 'glyph-orientation-vertical': 'glyphOrientationVertical',
3241 + glyphref: 'glyphRef',
3242 + gradienttransform: 'gradientTransform',
3243 + gradientunits: 'gradientUnits',
3244 + hanging: 'hanging',
3245 + horizadvx: 'horizAdvX',
3246 + 'horiz-adv-x': 'horizAdvX',
3247 + horizoriginx: 'horizOriginX',
3248 + 'horiz-origin-x': 'horizOriginX',
3249 + ideographic: 'ideographic',
3250 + imagerendering: 'imageRendering',
3251 + 'image-rendering': 'imageRendering',
3252 + in2: 'in2',
3253 + in: 'in',
3254 + inlist: 'inlist',
3255 + intercept: 'intercept',
3256 + k1: 'k1',
3257 + k2: 'k2',
3258 + k3: 'k3',
3259 + k4: 'k4',
3260 + k: 'k',
3261 + kernelmatrix: 'kernelMatrix',
3262 + kernelunitlength: 'kernelUnitLength',
3263 + kerning: 'kerning',
3264 + keypoints: 'keyPoints',
3265 + keysplines: 'keySplines',
3266 + keytimes: 'keyTimes',
3267 + lengthadjust: 'lengthAdjust',
3268 + letterspacing: 'letterSpacing',
3269 + 'letter-spacing': 'letterSpacing',
3270 + lightingcolor: 'lightingColor',
3271 + 'lighting-color': 'lightingColor',
3272 + limitingconeangle: 'limitingConeAngle',
3273 + local: 'local',
3274 + markerend: 'markerEnd',
3275 + 'marker-end': 'markerEnd',
3276 + markerheight: 'markerHeight',
3277 + markermid: 'markerMid',
3278 + 'marker-mid': 'markerMid',
3279 + markerstart: 'markerStart',
3280 + 'marker-start': 'markerStart',
3281 + markerunits: 'markerUnits',
3282 + markerwidth: 'markerWidth',
3283 + mask: 'mask',
3284 + maskcontentunits: 'maskContentUnits',
3285 + maskunits: 'maskUnits',
3286 + mathematical: 'mathematical',
3287 + mode: 'mode',
3288 + numoctaves: 'numOctaves',
3289 + offset: 'offset',
3290 + opacity: 'opacity',
3291 + operator: 'operator',
3292 + order: 'order',
3293 + orient: 'orient',
3294 + orientation: 'orientation',
3295 + origin: 'origin',
3296 + overflow: 'overflow',
3297 + overlineposition: 'overlinePosition',
3298 + 'overline-position': 'overlinePosition',
3299 + overlinethickness: 'overlineThickness',
3300 + 'overline-thickness': 'overlineThickness',
3301 + paintorder: 'paintOrder',
3302 + 'paint-order': 'paintOrder',
3303 + panose1: 'panose1',
3304 + 'panose-1': 'panose1',
3305 + pathlength: 'pathLength',
3306 + patterncontentunits: 'patternContentUnits',
3307 + patterntransform: 'patternTransform',
3308 + patternunits: 'patternUnits',
3309 + pointerevents: 'pointerEvents',
3310 + 'pointer-events': 'pointerEvents',
3311 + points: 'points',
3312 + pointsatx: 'pointsAtX',
3313 + pointsaty: 'pointsAtY',
3314 + pointsatz: 'pointsAtZ',
3315 + prefix: 'prefix',
3316 + preservealpha: 'preserveAlpha',
3317 + preserveaspectratio: 'preserveAspectRatio',
3318 + primitiveunits: 'primitiveUnits',
3319 + property: 'property',
3320 + r: 'r',
3321 + radius: 'radius',
3322 + refx: 'refX',
3323 + refy: 'refY',
3324 + renderingintent: 'renderingIntent',
3325 + 'rendering-intent': 'renderingIntent',
3326 + repeatcount: 'repeatCount',
3327 + repeatdur: 'repeatDur',
3328 + requiredextensions: 'requiredExtensions',
3329 + requiredfeatures: 'requiredFeatures',
3330 + resource: 'resource',
3331 + restart: 'restart',
3332 + result: 'result',
3333 + results: 'results',
3334 + rotate: 'rotate',
3335 + rx: 'rx',
3336 + ry: 'ry',
3337 + scale: 'scale',
3338 + security: 'security',
3339 + seed: 'seed',
3340 + shaperendering: 'shapeRendering',
3341 + 'shape-rendering': 'shapeRendering',
3342 + slope: 'slope',
3343 + spacing: 'spacing',
3344 + specularconstant: 'specularConstant',
3345 + specularexponent: 'specularExponent',
3346 + speed: 'speed',
3347 + spreadmethod: 'spreadMethod',
3348 + startoffset: 'startOffset',
3349 + stddeviation: 'stdDeviation',
3350 + stemh: 'stemh',
3351 + stemv: 'stemv',
3352 + stitchtiles: 'stitchTiles',
3353 + stopcolor: 'stopColor',
3354 + 'stop-color': 'stopColor',
3355 + stopopacity: 'stopOpacity',
3356 + 'stop-opacity': 'stopOpacity',
3357 + strikethroughposition: 'strikethroughPosition',
3358 + 'strikethrough-position': 'strikethroughPosition',
3359 + strikethroughthickness: 'strikethroughThickness',
3360 + 'strikethrough-thickness': 'strikethroughThickness',
3361 + string: 'string',
3362 + stroke: 'stroke',
3363 + strokedasharray: 'strokeDasharray',
3364 + 'stroke-dasharray': 'strokeDasharray',
3365 + strokedashoffset: 'strokeDashoffset',
3366 + 'stroke-dashoffset': 'strokeDashoffset',
3367 + strokelinecap: 'strokeLinecap',
3368 + 'stroke-linecap': 'strokeLinecap',
3369 + strokelinejoin: 'strokeLinejoin',
3370 + 'stroke-linejoin': 'strokeLinejoin',
3371 + strokemiterlimit: 'strokeMiterlimit',
3372 + 'stroke-miterlimit': 'strokeMiterlimit',
3373 + strokewidth: 'strokeWidth',
3374 + 'stroke-width': 'strokeWidth',
3375 + strokeopacity: 'strokeOpacity',
3376 + 'stroke-opacity': 'strokeOpacity',
3377 + suppresscontenteditablewarning: 'suppressContentEditableWarning',
3378 + suppresshydrationwarning: 'suppressHydrationWarning',
3379 + surfacescale: 'surfaceScale',
3380 + systemlanguage: 'systemLanguage',
3381 + tablevalues: 'tableValues',
3382 + targetx: 'targetX',
3383 + targety: 'targetY',
3384 + textanchor: 'textAnchor',
3385 + 'text-anchor': 'textAnchor',
3386 + textdecoration: 'textDecoration',
3387 + 'text-decoration': 'textDecoration',
3388 + textlength: 'textLength',
3389 + textrendering: 'textRendering',
3390 + 'text-rendering': 'textRendering',
3391 + to: 'to',
3392 + transform: 'transform',
3393 + typeof: 'typeof',
3394 + u1: 'u1',
3395 + u2: 'u2',
3396 + underlineposition: 'underlinePosition',
3397 + 'underline-position': 'underlinePosition',
3398 + underlinethickness: 'underlineThickness',
3399 + 'underline-thickness': 'underlineThickness',
3400 + unicode: 'unicode',
3401 + unicodebidi: 'unicodeBidi',
3402 + 'unicode-bidi': 'unicodeBidi',
3403 + unicoderange: 'unicodeRange',
3404 + 'unicode-range': 'unicodeRange',
3405 + unitsperem: 'unitsPerEm',
3406 + 'units-per-em': 'unitsPerEm',
3407 + unselectable: 'unselectable',
3408 + valphabetic: 'vAlphabetic',
3409 + 'v-alphabetic': 'vAlphabetic',
3410 + values: 'values',
3411 + vectoreffect: 'vectorEffect',
3412 + 'vector-effect': 'vectorEffect',
3413 + version: 'version',
3414 + vertadvy: 'vertAdvY',
3415 + 'vert-adv-y': 'vertAdvY',
3416 + vertoriginx: 'vertOriginX',
3417 + 'vert-origin-x': 'vertOriginX',
3418 + vertoriginy: 'vertOriginY',
3419 + 'vert-origin-y': 'vertOriginY',
3420 + vhanging: 'vHanging',
3421 + 'v-hanging': 'vHanging',
3422 + videographic: 'vIdeographic',
3423 + 'v-ideographic': 'vIdeographic',
3424 + viewbox: 'viewBox',
3425 + viewtarget: 'viewTarget',
3426 + visibility: 'visibility',
3427 + vmathematical: 'vMathematical',
3428 + 'v-mathematical': 'vMathematical',
3429 + vocab: 'vocab',
3430 + widths: 'widths',
3431 + wordspacing: 'wordSpacing',
3432 + 'word-spacing': 'wordSpacing',
3433 + writingmode: 'writingMode',
3434 + 'writing-mode': 'writingMode',
3435 + x1: 'x1',
3436 + x2: 'x2',
3437 + x: 'x',
3438 + xchannelselector: 'xChannelSelector',
3439 + xheight: 'xHeight',
3440 + 'x-height': 'xHeight',
3441 + xlinkactuate: 'xlinkActuate',
3442 + 'xlink:actuate': 'xlinkActuate',
3443 + xlinkarcrole: 'xlinkArcrole',
3444 + 'xlink:arcrole': 'xlinkArcrole',
3445 + xlinkhref: 'xlinkHref',
3446 + 'xlink:href': 'xlinkHref',
3447 + xlinkrole: 'xlinkRole',
3448 + 'xlink:role': 'xlinkRole',
3449 + xlinkshow: 'xlinkShow',
3450 + 'xlink:show': 'xlinkShow',
3451 + xlinktitle: 'xlinkTitle',
3452 + 'xlink:title': 'xlinkTitle',
3453 + xlinktype: 'xlinkType',
3454 + 'xlink:type': 'xlinkType',
3455 + xmlbase: 'xmlBase',
3456 + 'xml:base': 'xmlBase',
3457 + xmllang: 'xmlLang',
3458 + 'xml:lang': 'xmlLang',
3459 + xmlns: 'xmlns',
3460 + 'xml:space': 'xmlSpace',
3461 + xmlnsxlink: 'xmlnsXlink',
3462 + 'xmlns:xlink': 'xmlnsXlink',
3463 + xmlspace: 'xmlSpace',
3464 + y1: 'y1',
3465 + y2: 'y2',
3466 + y: 'y',
3467 + ychannelselector: 'yChannelSelector',
3468 + z: 'z',
3469 + zoomandpan: 'zoomAndPan'
3470 + };
3471 +
3472 + var ariaProperties = {
3473 + 'aria-current': 0,
3474 + // state
3475 + 'aria-description': 0,
3476 + 'aria-details': 0,
3477 + 'aria-disabled': 0,
3478 + // state
3479 + 'aria-hidden': 0,
3480 + // state
3481 + 'aria-invalid': 0,
3482 + // state
3483 + 'aria-keyshortcuts': 0,
3484 + 'aria-label': 0,
3485 + 'aria-roledescription': 0,
3486 + // Widget Attributes
3487 + 'aria-autocomplete': 0,
3488 + 'aria-checked': 0,
3489 + 'aria-expanded': 0,
3490 + 'aria-haspopup': 0,
3491 + 'aria-level': 0,
3492 + 'aria-modal': 0,
3493 + 'aria-multiline': 0,
3494 + 'aria-multiselectable': 0,
3495 + 'aria-orientation': 0,
3496 + 'aria-placeholder': 0,
3497 + 'aria-pressed': 0,
3498 + 'aria-readonly': 0,
3499 + 'aria-required': 0,
3500 + 'aria-selected': 0,
3501 + 'aria-sort': 0,
3502 + 'aria-valuemax': 0,
3503 + 'aria-valuemin': 0,
3504 + 'aria-valuenow': 0,
3505 + 'aria-valuetext': 0,
3506 + // Live Region Attributes
3507 + 'aria-atomic': 0,
3508 + 'aria-busy': 0,
3509 + 'aria-live': 0,
3510 + 'aria-relevant': 0,
3511 + // Drag-and-Drop Attributes
3512 + 'aria-dropeffect': 0,
3513 + 'aria-grabbed': 0,
3514 + // Relationship Attributes
3515 + 'aria-activedescendant': 0,
3516 + 'aria-colcount': 0,
3517 + 'aria-colindex': 0,
3518 + 'aria-colspan': 0,
3519 + 'aria-controls': 0,
3520 + 'aria-describedby': 0,
3521 + 'aria-errormessage': 0,
3522 + 'aria-flowto': 0,
3523 + 'aria-labelledby': 0,
3524 + 'aria-owns': 0,
3525 + 'aria-posinset': 0,
3526 + 'aria-rowcount': 0,
3527 + 'aria-rowindex': 0,
3528 + 'aria-rowspan': 0,
3529 + 'aria-setsize': 0
3530 + };
3531 +
3532 + var warnedProperties = {};
3533 + var rARIA = new RegExp('^(aria)-[' + ATTRIBUTE_NAME_CHAR + ']*$');
3534 + var rARIACamel = new RegExp('^(aria)[A-Z][' + ATTRIBUTE_NAME_CHAR + ']*$');
3535 +
3536 + function validateProperty(tagName, name) {
3537 + {
3538 + if (hasOwnProperty.call(warnedProperties, name) && warnedProperties[name]) {
3539 + return true;
3540 + }
3541 +
3542 + if (rARIACamel.test(name)) {
3543 + var ariaName = 'aria-' + name.slice(4).toLowerCase();
3544 + var correctName = ariaProperties.hasOwnProperty(ariaName) ? ariaName : null; // If this is an aria-* attribute, but is not listed in the known DOM
3545 + // DOM properties, then it is an invalid aria-* attribute.
3546 +
3547 + if (correctName == null) {
3548 + error('Invalid ARIA attribute `%s`. ARIA attributes follow the pattern aria-* and must be lowercase.', name);
3549 +
3550 + warnedProperties[name] = true;
3551 + return true;
3552 + } // aria-* attributes should be lowercase; suggest the lowercase version.
3553 +
3554 +
3555 + if (name !== correctName) {
3556 + error('Invalid ARIA attribute `%s`. Did you mean `%s`?', name, correctName);
3557 +
3558 + warnedProperties[name] = true;
3559 + return true;
3560 + }
3561 + }
3562 +
3563 + if (rARIA.test(name)) {
3564 + var lowerCasedName = name.toLowerCase();
3565 + var standardName = ariaProperties.hasOwnProperty(lowerCasedName) ? lowerCasedName : null; // If this is an aria-* attribute, but is not listed in the known DOM
3566 + // DOM properties, then it is an invalid aria-* attribute.
3567 +
3568 + if (standardName == null) {
3569 + warnedProperties[name] = true;
3570 + return false;
3571 + } // aria-* attributes should be lowercase; suggest the lowercase version.
3572 +
3573 +
3574 + if (name !== standardName) {
3575 + error('Unknown ARIA attribute `%s`. Did you mean `%s`?', name, standardName);
3576 +
3577 + warnedProperties[name] = true;
3578 + return true;
3579 + }
3580 + }
3581 + }
3582 +
3583 + return true;
3584 + }
3585 +
3586 + function warnInvalidARIAProps(type, props) {
3587 + {
3588 + var invalidProps = [];
3589 +
3590 + for (var key in props) {
3591 + var isValid = validateProperty(type, key);
3592 +
3593 + if (!isValid) {
3594 + invalidProps.push(key);
3595 + }
3596 + }
3597 +
3598 + var unknownPropString = invalidProps.map(function (prop) {
3599 + return '`' + prop + '`';
3600 + }).join(', ');
3601 +
3602 + if (invalidProps.length === 1) {
3603 + error('Invalid aria prop %s on <%s> tag. ' + 'For details, see https://reactjs.org/link/invalid-aria-props', unknownPropString, type);
3604 + } else if (invalidProps.length > 1) {
3605 + error('Invalid aria props %s on <%s> tag. ' + 'For details, see https://reactjs.org/link/invalid-aria-props', unknownPropString, type);
3606 + }
3607 + }
3608 + }
3609 +
3610 + function validateProperties(type, props) {
3611 + if (isCustomComponent(type, props)) {
3612 + return;
3613 + }
3614 +
3615 + warnInvalidARIAProps(type, props);
3616 + }
3617 +
3618 + var didWarnValueNull = false;
3619 + function validateProperties$1(type, props) {
3620 + {
3621 + if (type !== 'input' && type !== 'textarea' && type !== 'select') {
3622 + return;
3623 + }
3624 +
3625 + if (props != null && props.value === null && !didWarnValueNull) {
3626 + didWarnValueNull = true;
3627 +
3628 + if (type === 'select' && props.multiple) {
3629 + error('`value` prop on `%s` should not be null. ' + 'Consider using an empty array when `multiple` is set to `true` ' + 'to clear the component or `undefined` for uncontrolled components.', type);
3630 + } else {
3631 + error('`value` prop on `%s` should not be null. ' + 'Consider using an empty string to clear the component or `undefined` ' + 'for uncontrolled components.', type);
3632 + }
3633 + }
3634 + }
3635 + }
3636 +
3637 + var validateProperty$1 = function () {};
3638 +
3639 + {
3640 + var warnedProperties$1 = {};
3641 + var EVENT_NAME_REGEX = /^on./;
3642 + var INVALID_EVENT_NAME_REGEX = /^on[^A-Z]/;
3643 + var rARIA$1 = new RegExp('^(aria)-[' + ATTRIBUTE_NAME_CHAR + ']*$');
3644 + var rARIACamel$1 = new RegExp('^(aria)[A-Z][' + ATTRIBUTE_NAME_CHAR + ']*$');
3645 +
3646 + validateProperty$1 = function (tagName, name, value, eventRegistry) {
3647 + if (hasOwnProperty.call(warnedProperties$1, name) && warnedProperties$1[name]) {
3648 + return true;
3649 + }
3650 +
3651 + var lowerCasedName = name.toLowerCase();
3652 +
3653 + if (lowerCasedName === 'onfocusin' || lowerCasedName === 'onfocusout') {
3654 + error('React uses onFocus and onBlur instead of onFocusIn and onFocusOut. ' + 'All React events are normalized to bubble, so onFocusIn and onFocusOut ' + 'are not needed/supported by React.');
3655 +
3656 + warnedProperties$1[name] = true;
3657 + return true;
3658 + } // We can't rely on the event system being injected on the server.
3659 +
3660 +
3661 + if (eventRegistry != null) {
3662 + var registrationNameDependencies = eventRegistry.registrationNameDependencies,
3663 + possibleRegistrationNames = eventRegistry.possibleRegistrationNames;
3664 +
3665 + if (registrationNameDependencies.hasOwnProperty(name)) {
3666 + return true;
3667 + }
3668 +
3669 + var registrationName = possibleRegistrationNames.hasOwnProperty(lowerCasedName) ? possibleRegistrationNames[lowerCasedName] : null;
3670 +
3671 + if (registrationName != null) {
3672 + error('Invalid event handler property `%s`. Did you mean `%s`?', name, registrationName);
3673 +
3674 + warnedProperties$1[name] = true;
3675 + return true;
3676 + }
3677 +
3678 + if (EVENT_NAME_REGEX.test(name)) {
3679 + error('Unknown event handler property `%s`. It will be ignored.', name);
3680 +
3681 + warnedProperties$1[name] = true;
3682 + return true;
3683 + }
3684 + } else if (EVENT_NAME_REGEX.test(name)) {
3685 + // If no event plugins have been injected, we are in a server environment.
3686 + // So we can't tell if the event name is correct for sure, but we can filter
3687 + // out known bad ones like `onclick`. We can't suggest a specific replacement though.
3688 + if (INVALID_EVENT_NAME_REGEX.test(name)) {
3689 + error('Invalid event handler property `%s`. ' + 'React events use the camelCase naming convention, for example `onClick`.', name);
3690 + }
3691 +
3692 + warnedProperties$1[name] = true;
3693 + return true;
3694 + } // Let the ARIA attribute hook validate ARIA attributes
3695 +
3696 +
3697 + if (rARIA$1.test(name) || rARIACamel$1.test(name)) {
3698 + return true;
3699 + }
3700 +
3701 + if (lowerCasedName === 'innerhtml') {
3702 + error('Directly setting property `innerHTML` is not permitted. ' + 'For more information, lookup documentation on `dangerouslySetInnerHTML`.');
3703 +
3704 + warnedProperties$1[name] = true;
3705 + return true;
3706 + }
3707 +
3708 + if (lowerCasedName === 'aria') {
3709 + error('The `aria` attribute is reserved for future use in React. ' + 'Pass individual `aria-` attributes instead.');
3710 +
3711 + warnedProperties$1[name] = true;
3712 + return true;
3713 + }
3714 +
3715 + if (lowerCasedName === 'is' && value !== null && value !== undefined && typeof value !== 'string') {
3716 + error('Received a `%s` for a string attribute `is`. If this is expected, cast ' + 'the value to a string.', typeof value);
3717 +
3718 + warnedProperties$1[name] = true;
3719 + return true;
3720 + }
3721 +
3722 + if (typeof value === 'number' && isNaN(value)) {
3723 + error('Received NaN for the `%s` attribute. If this is expected, cast ' + 'the value to a string.', name);
3724 +
3725 + warnedProperties$1[name] = true;
3726 + return true;
3727 + }
3728 +
3729 + var propertyInfo = getPropertyInfo(name);
3730 + var isReserved = propertyInfo !== null && propertyInfo.type === RESERVED; // Known attributes should match the casing specified in the property config.
3731 +
3732 + if (possibleStandardNames.hasOwnProperty(lowerCasedName)) {
3733 + var standardName = possibleStandardNames[lowerCasedName];
3734 +
3735 + if (standardName !== name) {
3736 + error('Invalid DOM property `%s`. Did you mean `%s`?', name, standardName);
3737 +
3738 + warnedProperties$1[name] = true;
3739 + return true;
3740 + }
3741 + } else if (!isReserved && name !== lowerCasedName) {
3742 + // Unknown attributes should have lowercase casing since that's how they
3743 + // will be cased anyway with server rendering.
3744 + error('React does not recognize the `%s` prop on a DOM element. If you ' + 'intentionally want it to appear in the DOM as a custom ' + 'attribute, spell it as lowercase `%s` instead. ' + 'If you accidentally passed it from a parent component, remove ' + 'it from the DOM element.', name, lowerCasedName);
3745 +
3746 + warnedProperties$1[name] = true;
3747 + return true;
3748 + }
3749 +
3750 + if (typeof value === 'boolean' && shouldRemoveAttributeWithWarning(name, value, propertyInfo, false)) {
3751 + if (value) {
3752 + error('Received `%s` for a non-boolean attribute `%s`.\n\n' + 'If you want to write it to the DOM, pass a string instead: ' + '%s="%s" or %s={value.toString()}.', value, name, name, value, name);
3753 + } else {
3754 + error('Received `%s` for a non-boolean attribute `%s`.\n\n' + 'If you want to write it to the DOM, pass a string instead: ' + '%s="%s" or %s={value.toString()}.\n\n' + 'If you used to conditionally omit it with %s={condition && value}, ' + 'pass %s={condition ? value : undefined} instead.', value, name, name, value, name, name, name);
3755 + }
3756 +
3757 + warnedProperties$1[name] = true;
3758 + return true;
3759 + } // Now that we've validated casing, do not validate
3760 + // data types for reserved props
3761 +
3762 +
3763 + if (isReserved) {
3764 + return true;
3765 + } // Warn when a known attribute is a bad type
3766 +
3767 +
3768 + if (shouldRemoveAttributeWithWarning(name, value, propertyInfo, false)) {
3769 + warnedProperties$1[name] = true;
3770 + return false;
3771 + } // Warn when passing the strings 'false' or 'true' into a boolean prop
3772 +
3773 +
3774 + if ((value === 'false' || value === 'true') && propertyInfo !== null && propertyInfo.type === BOOLEAN) {
3775 + error('Received the string `%s` for the boolean attribute `%s`. ' + '%s ' + 'Did you mean %s={%s}?', value, name, value === 'false' ? 'The browser will interpret it as a truthy value.' : 'Although this works, it will not work as expected if you pass the string "false".', name, value);
3776 +
3777 + warnedProperties$1[name] = true;
3778 + return true;
3779 + }
3780 +
3781 + return true;
3782 + };
3783 + }
3784 +
3785 + var warnUnknownProperties = function (type, props, eventRegistry) {
3786 + {
3787 + var unknownProps = [];
3788 +
3789 + for (var key in props) {
3790 + var isValid = validateProperty$1(type, key, props[key], eventRegistry);
3791 +
3792 + if (!isValid) {
3793 + unknownProps.push(key);
3794 + }
3795 + }
3796 +
3797 + var unknownPropString = unknownProps.map(function (prop) {
3798 + return '`' + prop + '`';
3799 + }).join(', ');
3800 +
3801 + if (unknownProps.length === 1) {
3802 + error('Invalid value for prop %s on <%s> tag. Either remove it from the element, ' + 'or pass a string or number value to keep it in the DOM. ' + 'For details, see https://reactjs.org/link/attribute-behavior ', unknownPropString, type);
3803 + } else if (unknownProps.length > 1) {
3804 + error('Invalid values for props %s on <%s> tag. Either remove them from the element, ' + 'or pass a string or number value to keep them in the DOM. ' + 'For details, see https://reactjs.org/link/attribute-behavior ', unknownPropString, type);
3805 + }
3806 + }
3807 + };
3808 +
3809 + function validateProperties$2(type, props, eventRegistry) {
3810 + if (isCustomComponent(type, props)) {
3811 + return;
3812 + }
3813 +
3814 + warnUnknownProperties(type, props, eventRegistry);
3815 + }
3816 +
3817 + var IS_EVENT_HANDLE_NON_MANAGED_NODE = 1;
3818 + var IS_NON_DELEGATED = 1 << 1;
3819 + var IS_CAPTURE_PHASE = 1 << 2;
3820 + // set to LEGACY_FB_SUPPORT. LEGACY_FB_SUPPORT only gets set when
3821 + // we call willDeferLaterForLegacyFBSupport, thus not bailing out
3822 + // will result in endless cycles like an infinite loop.
3823 + // We also don't want to defer during event replaying.
3824 +
3825 + var SHOULD_NOT_PROCESS_POLYFILL_EVENT_PLUGINS = IS_EVENT_HANDLE_NON_MANAGED_NODE | IS_NON_DELEGATED | IS_CAPTURE_PHASE;
3826 +
3827 + // This exists to avoid circular dependency between ReactDOMEventReplaying
3828 + // and DOMPluginEventSystem.
3829 + var currentReplayingEvent = null;
3830 + function setReplayingEvent(event) {
3831 + {
3832 + if (currentReplayingEvent !== null) {
3833 + error('Expected currently replaying event to be null. This error ' + 'is likely caused by a bug in React. Please file an issue.');
3834 + }
3835 + }
3836 +
3837 + currentReplayingEvent = event;
3838 + }
3839 + function resetReplayingEvent() {
3840 + {
3841 + if (currentReplayingEvent === null) {
3842 + error('Expected currently replaying event to not be null. This error ' + 'is likely caused by a bug in React. Please file an issue.');
3843 + }
3844 + }
3845 +
3846 + currentReplayingEvent = null;
3847 + }
3848 + function isReplayingEvent(event) {
3849 + return event === currentReplayingEvent;
3850 + }
3851 +
3852 + /**
3853 + * Gets the target node from a native browser event by accounting for
3854 + * inconsistencies in browser DOM APIs.
3855 + *
3856 + * @param {object} nativeEvent Native browser event.
3857 + * @return {DOMEventTarget} Target node.
3858 + */
3859 +
3860 + function getEventTarget(nativeEvent) {
3861 + // Fallback to nativeEvent.srcElement for IE9
3862 + // https://github.com/facebook/react/issues/12506
3863 + var target = nativeEvent.target || nativeEvent.srcElement || window; // Normalize SVG <use> element events #4963
3864 +
3865 + if (target.correspondingUseElement) {
3866 + target = target.correspondingUseElement;
3867 + } // Safari may fire events on text nodes (Node.TEXT_NODE is 3).
3868 + // @see http://www.quirksmode.org/js/events_properties.html
3869 +
3870 +
3871 + return target.nodeType === TEXT_NODE ? target.parentNode : target;
3872 + }
3873 +
3874 + var restoreImpl = null;
3875 + var restoreTarget = null;
3876 + var restoreQueue = null;
3877 +
3878 + function restoreStateOfTarget(target) {
3879 + // We perform this translation at the end of the event loop so that we
3880 + // always receive the correct fiber here
3881 + var internalInstance = getInstanceFromNode(target);
3882 +
3883 + if (!internalInstance) {
3884 + // Unmounted
3885 + return;
3886 + }
3887 +
3888 + if (typeof restoreImpl !== 'function') {
3889 + throw new Error('setRestoreImplementation() needs to be called to handle a target for controlled ' + 'events. This error is likely caused by a bug in React. Please file an issue.');
3890 + }
3891 +
3892 + var stateNode = internalInstance.stateNode; // Guard against Fiber being unmounted.
3893 +
3894 + if (stateNode) {
3895 + var _props = getFiberCurrentPropsFromNode(stateNode);
3896 +
3897 + restoreImpl(internalInstance.stateNode, internalInstance.type, _props);
3898 + }
3899 + }
3900 +
3901 + function setRestoreImplementation(impl) {
3902 + restoreImpl = impl;
3903 + }
3904 + function enqueueStateRestore(target) {
3905 + if (restoreTarget) {
3906 + if (restoreQueue) {
3907 + restoreQueue.push(target);
3908 + } else {
3909 + restoreQueue = [target];
3910 + }
3911 + } else {
3912 + restoreTarget = target;
3913 + }
3914 + }
3915 + function needsStateRestore() {
3916 + return restoreTarget !== null || restoreQueue !== null;
3917 + }
3918 + function restoreStateIfNeeded() {
3919 + if (!restoreTarget) {
3920 + return;
3921 + }
3922 +
3923 + var target = restoreTarget;
3924 + var queuedTargets = restoreQueue;
3925 + restoreTarget = null;
3926 + restoreQueue = null;
3927 + restoreStateOfTarget(target);
3928 +
3929 + if (queuedTargets) {
3930 + for (var i = 0; i < queuedTargets.length; i++) {
3931 + restoreStateOfTarget(queuedTargets[i]);
3932 + }
3933 + }
3934 + }
3935 +
3936 + // the renderer. Such as when we're dispatching events or if third party
3937 + // libraries need to call batchedUpdates. Eventually, this API will go away when
3938 + // everything is batched by default. We'll then have a similar API to opt-out of
3939 + // scheduled work and instead do synchronous work.
3940 + // Defaults
3941 +
3942 + var batchedUpdatesImpl = function (fn, bookkeeping) {
3943 + return fn(bookkeeping);
3944 + };
3945 +
3946 + var flushSyncImpl = function () {};
3947 +
3948 + var isInsideEventHandler = false;
3949 +
3950 + function finishEventHandler() {
3951 + // Here we wait until all updates have propagated, which is important
3952 + // when using controlled components within layers:
3953 + // https://github.com/facebook/react/issues/1698
3954 + // Then we restore state of any controlled component.
3955 + var controlledComponentsHavePendingUpdates = needsStateRestore();
3956 +
3957 + if (controlledComponentsHavePendingUpdates) {
3958 + // If a controlled event was fired, we may need to restore the state of
3959 + // the DOM node back to the controlled value. This is necessary when React
3960 + // bails out of the update without touching the DOM.
3961 + // TODO: Restore state in the microtask, after the discrete updates flush,
3962 + // instead of early flushing them here.
3963 + flushSyncImpl();
3964 + restoreStateIfNeeded();
3965 + }
3966 + }
3967 +
3968 + function batchedUpdates(fn, a, b) {
3969 + if (isInsideEventHandler) {
3970 + // If we are currently inside another batch, we need to wait until it
3971 + // fully completes before restoring state.
3972 + return fn(a, b);
3973 + }
3974 +
3975 + isInsideEventHandler = true;
3976 +
3977 + try {
3978 + return batchedUpdatesImpl(fn, a, b);
3979 + } finally {
3980 + isInsideEventHandler = false;
3981 + finishEventHandler();
3982 + }
3983 + } // TODO: Replace with flushSync
3984 + function setBatchingImplementation(_batchedUpdatesImpl, _discreteUpdatesImpl, _flushSyncImpl) {
3985 + batchedUpdatesImpl = _batchedUpdatesImpl;
3986 + flushSyncImpl = _flushSyncImpl;
3987 + }
3988 +
3989 + function isInteractive(tag) {
3990 + return tag === 'button' || tag === 'input' || tag === 'select' || tag === 'textarea';
3991 + }
3992 +
3993 + function shouldPreventMouseEvent(name, type, props) {
3994 + switch (name) {
3995 + case 'onClick':
3996 + case 'onClickCapture':
3997 + case 'onDoubleClick':
3998 + case 'onDoubleClickCapture':
3999 + case 'onMouseDown':
4000 + case 'onMouseDownCapture':
4001 + case 'onMouseMove':
4002 + case 'onMouseMoveCapture':
4003 + case 'onMouseUp':
4004 + case 'onMouseUpCapture':
4005 + case 'onMouseEnter':
4006 + return !!(props.disabled && isInteractive(type));
4007 +
4008 + default:
4009 + return false;
4010 + }
4011 + }
4012 + /**
4013 + * @param {object} inst The instance, which is the source of events.
4014 + * @param {string} registrationName Name of listener (e.g. `onClick`).
4015 + * @return {?function} The stored callback.
4016 + */
4017 +
4018 +
4019 + function getListener(inst, registrationName) {
4020 + var stateNode = inst.stateNode;
4021 +
4022 + if (stateNode === null) {
4023 + // Work in progress (ex: onload events in incremental mode).
4024 + return null;
4025 + }
4026 +
4027 + var props = getFiberCurrentPropsFromNode(stateNode);
4028 +
4029 + if (props === null) {
4030 + // Work in progress.
4031 + return null;
4032 + }
4033 +
4034 + var listener = props[registrationName];
4035 +
4036 + if (shouldPreventMouseEvent(registrationName, inst.type, props)) {
4037 + return null;
4038 + }
4039 +
4040 + if (listener && typeof listener !== 'function') {
4041 + throw new Error("Expected `" + registrationName + "` listener to be a function, instead got a value of `" + typeof listener + "` type.");
4042 + }
4043 +
4044 + return listener;
4045 + }
4046 +
4047 + var passiveBrowserEventsSupported = false; // Check if browser support events with passive listeners
4048 + // https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/addEventListener#Safely_detecting_option_support
4049 +
4050 + if (canUseDOM) {
4051 + try {
4052 + var options = {}; // $FlowFixMe: Ignore Flow complaining about needing a value
4053 +
4054 + Object.defineProperty(options, 'passive', {
4055 + get: function () {
4056 + passiveBrowserEventsSupported = true;
4057 + }
4058 + });
4059 + window.addEventListener('test', options, options);
4060 + window.removeEventListener('test', options, options);
4061 + } catch (e) {
4062 + passiveBrowserEventsSupported = false;
4063 + }
4064 + }
4065 +
4066 + function invokeGuardedCallbackProd(name, func, context, a, b, c, d, e, f) {
4067 + var funcArgs = Array.prototype.slice.call(arguments, 3);
4068 +
4069 + try {
4070 + func.apply(context, funcArgs);
4071 + } catch (error) {
4072 + this.onError(error);
4073 + }
4074 + }
4075 +
4076 + var invokeGuardedCallbackImpl = invokeGuardedCallbackProd;
4077 +
4078 + {
4079 + // In DEV mode, we swap out invokeGuardedCallback for a special version
4080 + // that plays more nicely with the browser's DevTools. The idea is to preserve
4081 + // "Pause on exceptions" behavior. Because React wraps all user-provided
4082 + // functions in invokeGuardedCallback, and the production version of
4083 + // invokeGuardedCallback uses a try-catch, all user exceptions are treated
4084 + // like caught exceptions, and the DevTools won't pause unless the developer
4085 + // takes the extra step of enabling pause on caught exceptions. This is
4086 + // unintuitive, though, because even though React has caught the error, from
4087 + // the developer's perspective, the error is uncaught.
4088 + //
4089 + // To preserve the expected "Pause on exceptions" behavior, we don't use a
4090 + // try-catch in DEV. Instead, we synchronously dispatch a fake event to a fake
4091 + // DOM node, and call the user-provided callback from inside an event handler
4092 + // for that fake event. If the callback throws, the error is "captured" using
4093 + // a global event handler. But because the error happens in a different
4094 + // event loop context, it does not interrupt the normal program flow.
4095 + // Effectively, this gives us try-catch behavior without actually using
4096 + // try-catch. Neat!
4097 + // Check that the browser supports the APIs we need to implement our special
4098 + // DEV version of invokeGuardedCallback
4099 + if (typeof window !== 'undefined' && typeof window.dispatchEvent === 'function' && typeof document !== 'undefined' && typeof document.createEvent === 'function') {
4100 + var fakeNode = document.createElement('react');
4101 +
4102 + invokeGuardedCallbackImpl = function invokeGuardedCallbackDev(name, func, context, a, b, c, d, e, f) {
4103 + // If document doesn't exist we know for sure we will crash in this method
4104 + // when we call document.createEvent(). However this can cause confusing
4105 + // errors: https://github.com/facebook/create-react-app/issues/3482
4106 + // So we preemptively throw with a better message instead.
4107 + if (typeof document === 'undefined' || document === null) {
4108 + throw new Error('The `document` global was defined when React was initialized, but is not ' + 'defined anymore. This can happen in a test environment if a component ' + 'schedules an update from an asynchronous callback, but the test has already ' + 'finished running. To solve this, you can either unmount the component at ' + 'the end of your test (and ensure that any asynchronous operations get ' + 'canceled in `componentWillUnmount`), or you can change the test itself ' + 'to be asynchronous.');
4109 + }
4110 +
4111 + var evt = document.createEvent('Event');
4112 + var didCall = false; // Keeps track of whether the user-provided callback threw an error. We
4113 + // set this to true at the beginning, then set it to false right after
4114 + // calling the function. If the function errors, `didError` will never be
4115 + // set to false. This strategy works even if the browser is flaky and
4116 + // fails to call our global error handler, because it doesn't rely on
4117 + // the error event at all.
4118 +
4119 + var didError = true; // Keeps track of the value of window.event so that we can reset it
4120 + // during the callback to let user code access window.event in the
4121 + // browsers that support it.
4122 +
4123 + var windowEvent = window.event; // Keeps track of the descriptor of window.event to restore it after event
4124 + // dispatching: https://github.com/facebook/react/issues/13688
4125 +
4126 + var windowEventDescriptor = Object.getOwnPropertyDescriptor(window, 'event');
4127 +
4128 + function restoreAfterDispatch() {
4129 + // We immediately remove the callback from event listeners so that
4130 + // nested `invokeGuardedCallback` calls do not clash. Otherwise, a
4131 + // nested call would trigger the fake event handlers of any call higher
4132 + // in the stack.
4133 + fakeNode.removeEventListener(evtType, callCallback, false); // We check for window.hasOwnProperty('event') to prevent the
4134 + // window.event assignment in both IE <= 10 as they throw an error
4135 + // "Member not found" in strict mode, and in Firefox which does not
4136 + // support window.event.
4137 +
4138 + if (typeof window.event !== 'undefined' && window.hasOwnProperty('event')) {
4139 + window.event = windowEvent;
4140 + }
4141 + } // Create an event handler for our fake event. We will synchronously
4142 + // dispatch our fake event using `dispatchEvent`. Inside the handler, we
4143 + // call the user-provided callback.
4144 +
4145 +
4146 + var funcArgs = Array.prototype.slice.call(arguments, 3);
4147 +
4148 + function callCallback() {
4149 + didCall = true;
4150 + restoreAfterDispatch();
4151 + func.apply(context, funcArgs);
4152 + didError = false;
4153 + } // Create a global error event handler. We use this to capture the value
4154 + // that was thrown. It's possible that this error handler will fire more
4155 + // than once; for example, if non-React code also calls `dispatchEvent`
4156 + // and a handler for that event throws. We should be resilient to most of
4157 + // those cases. Even if our error event handler fires more than once, the
4158 + // last error event is always used. If the callback actually does error,
4159 + // we know that the last error event is the correct one, because it's not
4160 + // possible for anything else to have happened in between our callback
4161 + // erroring and the code that follows the `dispatchEvent` call below. If
4162 + // the callback doesn't error, but the error event was fired, we know to
4163 + // ignore it because `didError` will be false, as described above.
4164 +
4165 +
4166 + var error; // Use this to track whether the error event is ever called.
4167 +
4168 + var didSetError = false;
4169 + var isCrossOriginError = false;
4170 +
4171 + function handleWindowError(event) {
4172 + error = event.error;
4173 + didSetError = true;
4174 +
4175 + if (error === null && event.colno === 0 && event.lineno === 0) {
4176 + isCrossOriginError = true;
4177 + }
4178 +
4179 + if (event.defaultPrevented) {
4180 + // Some other error handler has prevented default.
4181 + // Browsers silence the error report if this happens.
4182 + // We'll remember this to later decide whether to log it or not.
4183 + if (error != null && typeof error === 'object') {
4184 + try {
4185 + error._suppressLogging = true;
4186 + } catch (inner) {// Ignore.
4187 + }
4188 + }
4189 + }
4190 + } // Create a fake event type.
4191 +
4192 +
4193 + var evtType = "react-" + (name ? name : 'invokeguardedcallback'); // Attach our event handlers
4194 +
4195 + window.addEventListener('error', handleWindowError);
4196 + fakeNode.addEventListener(evtType, callCallback, false); // Synchronously dispatch our fake event. If the user-provided function
4197 + // errors, it will trigger our global error handler.
4198 +
4199 + evt.initEvent(evtType, false, false);
4200 + fakeNode.dispatchEvent(evt);
4201 +
4202 + if (windowEventDescriptor) {
4203 + Object.defineProperty(window, 'event', windowEventDescriptor);
4204 + }
4205 +
4206 + if (didCall && didError) {
4207 + if (!didSetError) {
4208 + // The callback errored, but the error event never fired.
4209 + // eslint-disable-next-line react-internal/prod-error-codes
4210 + error = new Error('An error was thrown inside one of your components, but React ' + "doesn't know what it was. This is likely due to browser " + 'flakiness. React does its best to preserve the "Pause on ' + 'exceptions" behavior of the DevTools, which requires some ' + "DEV-mode only tricks. It's possible that these don't work in " + 'your browser. Try triggering the error in production mode, ' + 'or switching to a modern browser. If you suspect that this is ' + 'actually an issue with React, please file an issue.');
4211 + } else if (isCrossOriginError) {
4212 + // eslint-disable-next-line react-internal/prod-error-codes
4213 + error = new Error("A cross-origin error was thrown. React doesn't have access to " + 'the actual error object in development. ' + 'See https://reactjs.org/link/crossorigin-error for more information.');
4214 + }
4215 +
4216 + this.onError(error);
4217 + } // Remove our event listeners
4218 +
4219 +
4220 + window.removeEventListener('error', handleWindowError);
4221 +
4222 + if (!didCall) {
4223 + // Something went really wrong, and our event was not dispatched.
4224 + // https://github.com/facebook/react/issues/16734
4225 + // https://github.com/facebook/react/issues/16585
4226 + // Fall back to the production implementation.
4227 + restoreAfterDispatch();
4228 + return invokeGuardedCallbackProd.apply(this, arguments);
4229 + }
4230 + };
4231 + }
4232 + }
4233 +
4234 + var invokeGuardedCallbackImpl$1 = invokeGuardedCallbackImpl;
4235 +
4236 + var hasError = false;
4237 + var caughtError = null; // Used by event system to capture/rethrow the first error.
4238 +
4239 + var hasRethrowError = false;
4240 + var rethrowError = null;
4241 + var reporter = {
4242 + onError: function (error) {
4243 + hasError = true;
4244 + caughtError = error;
4245 + }
4246 + };
4247 + /**
4248 + * Call a function while guarding against errors that happens within it.
4249 + * Returns an error if it throws, otherwise null.
4250 + *
4251 + * In production, this is implemented using a try-catch. The reason we don't
4252 + * use a try-catch directly is so that we can swap out a different
4253 + * implementation in DEV mode.
4254 + *
4255 + * @param {String} name of the guard to use for logging or debugging
4256 + * @param {Function} func The function to invoke
4257 + * @param {*} context The context to use when calling the function
4258 + * @param {...*} args Arguments for function
4259 + */
4260 +
4261 + function invokeGuardedCallback(name, func, context, a, b, c, d, e, f) {
4262 + hasError = false;
4263 + caughtError = null;
4264 + invokeGuardedCallbackImpl$1.apply(reporter, arguments);
4265 + }
4266 + /**
4267 + * Same as invokeGuardedCallback, but instead of returning an error, it stores
4268 + * it in a global so it can be rethrown by `rethrowCaughtError` later.
4269 + * TODO: See if caughtError and rethrowError can be unified.
4270 + *
4271 + * @param {String} name of the guard to use for logging or debugging
4272 + * @param {Function} func The function to invoke
4273 + * @param {*} context The context to use when calling the function
4274 + * @param {...*} args Arguments for function
4275 + */
4276 +
4277 + function invokeGuardedCallbackAndCatchFirstError(name, func, context, a, b, c, d, e, f) {
4278 + invokeGuardedCallback.apply(this, arguments);
4279 +
4280 + if (hasError) {
4281 + var error = clearCaughtError();
4282 +
4283 + if (!hasRethrowError) {
4284 + hasRethrowError = true;
4285 + rethrowError = error;
4286 + }
4287 + }
4288 + }
4289 + /**
4290 + * During execution of guarded functions we will capture the first error which
4291 + * we will rethrow to be handled by the top level error handler.
4292 + */
4293 +
4294 + function rethrowCaughtError() {
4295 + if (hasRethrowError) {
4296 + var error = rethrowError;
4297 + hasRethrowError = false;
4298 + rethrowError = null;
4299 + throw error;
4300 + }
4301 + }
4302 + function hasCaughtError() {
4303 + return hasError;
4304 + }
4305 + function clearCaughtError() {
4306 + if (hasError) {
4307 + var error = caughtError;
4308 + hasError = false;
4309 + caughtError = null;
4310 + return error;
4311 + } else {
4312 + throw new Error('clearCaughtError was called but no error was captured. This error ' + 'is likely caused by a bug in React. Please file an issue.');
4313 + }
4314 + }
4315 +
4316 + var ReactInternals = React.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED;
4317 + var _ReactInternals$Sched = ReactInternals.Scheduler,
4318 + unstable_cancelCallback = _ReactInternals$Sched.unstable_cancelCallback,
4319 + unstable_now = _ReactInternals$Sched.unstable_now,
4320 + unstable_scheduleCallback = _ReactInternals$Sched.unstable_scheduleCallback,
4321 + unstable_shouldYield = _ReactInternals$Sched.unstable_shouldYield,
4322 + unstable_requestPaint = _ReactInternals$Sched.unstable_requestPaint,
4323 + unstable_getFirstCallbackNode = _ReactInternals$Sched.unstable_getFirstCallbackNode,
4324 + unstable_runWithPriority = _ReactInternals$Sched.unstable_runWithPriority,
4325 + unstable_next = _ReactInternals$Sched.unstable_next,
4326 + unstable_continueExecution = _ReactInternals$Sched.unstable_continueExecution,
4327 + unstable_pauseExecution = _ReactInternals$Sched.unstable_pauseExecution,
4328 + unstable_getCurrentPriorityLevel = _ReactInternals$Sched.unstable_getCurrentPriorityLevel,
4329 + unstable_ImmediatePriority = _ReactInternals$Sched.unstable_ImmediatePriority,
4330 + unstable_UserBlockingPriority = _ReactInternals$Sched.unstable_UserBlockingPriority,
4331 + unstable_NormalPriority = _ReactInternals$Sched.unstable_NormalPriority,
4332 + unstable_LowPriority = _ReactInternals$Sched.unstable_LowPriority,
4333 + unstable_IdlePriority = _ReactInternals$Sched.unstable_IdlePriority,
4334 + unstable_forceFrameRate = _ReactInternals$Sched.unstable_forceFrameRate,
4335 + unstable_flushAllWithoutAsserting = _ReactInternals$Sched.unstable_flushAllWithoutAsserting,
4336 + unstable_yieldValue = _ReactInternals$Sched.unstable_yieldValue,
4337 + unstable_setDisableYieldValue = _ReactInternals$Sched.unstable_setDisableYieldValue;
4338 +
4339 + /**
4340 + * `ReactInstanceMap` maintains a mapping from a public facing stateful
4341 + * instance (key) and the internal representation (value). This allows public
4342 + * methods to accept the user facing instance as an argument and map them back
4343 + * to internal methods.
4344 + *
4345 + * Note that this module is currently shared and assumed to be stateless.
4346 + * If this becomes an actual Map, that will break.
4347 + */
4348 + function get(key) {
4349 + return key._reactInternals;
4350 + }
4351 + function has(key) {
4352 + return key._reactInternals !== undefined;
4353 + }
4354 + function set(key, value) {
4355 + key._reactInternals = value;
4356 + }
4357 +
4358 + // Don't change these two values. They're used by React Dev Tools.
4359 + var NoFlags =
4360 + /* */
4361 + 0;
4362 + var PerformedWork =
4363 + /* */
4364 + 1; // You can change the rest (and add more).
4365 +
4366 + var Placement =
4367 + /* */
4368 + 2;
4369 + var Update =
4370 + /* */
4371 + 4;
4372 + var ChildDeletion =
4373 + /* */
4374 + 16;
4375 + var ContentReset =
4376 + /* */
4377 + 32;
4378 + var Callback =
4379 + /* */
4380 + 64;
4381 + var DidCapture =
4382 + /* */
4383 + 128;
4384 + var ForceClientRender =
4385 + /* */
4386 + 256;
4387 + var Ref =
4388 + /* */
4389 + 512;
4390 + var Snapshot =
4391 + /* */
4392 + 1024;
4393 + var Passive =
4394 + /* */
4395 + 2048;
4396 + var Hydrating =
4397 + /* */
4398 + 4096;
4399 + var Visibility =
4400 + /* */
4401 + 8192;
4402 + var StoreConsistency =
4403 + /* */
4404 + 16384;
4405 + var LifecycleEffectMask = Passive | Update | Callback | Ref | Snapshot | StoreConsistency; // Union of all commit flags (flags with the lifetime of a particular commit)
4406 +
4407 + var HostEffectMask =
4408 + /* */
4409 + 32767; // These are not really side effects, but we still reuse this field.
4410 +
4411 + var Incomplete =
4412 + /* */
4413 + 32768;
4414 + var ShouldCapture =
4415 + /* */
4416 + 65536;
4417 + var ForceUpdateForLegacySuspense =
4418 + /* */
4419 + 131072;
4420 + var Forked =
4421 + /* */
4422 + 1048576; // Static tags describe aspects of a fiber that are not specific to a render,
4423 + // e.g. a fiber uses a passive effect (even if there are no updates on this particular render).
4424 + // This enables us to defer more work in the unmount case,
4425 + // since we can defer traversing the tree during layout to look for Passive effects,
4426 + // and instead rely on the static flag as a signal that there may be cleanup work.
4427 +
4428 + var RefStatic =
4429 + /* */
4430 + 2097152;
4431 + var LayoutStatic =
4432 + /* */
4433 + 4194304;
4434 + var PassiveStatic =
4435 + /* */
4436 + 8388608; // These flags allow us to traverse to fibers that have effects on mount
4437 + // without traversing the entire tree after every commit for
4438 + // double invoking
4439 +
4440 + var MountLayoutDev =
4441 + /* */
4442 + 16777216;
4443 + var MountPassiveDev =
4444 + /* */
4445 + 33554432; // Groups of flags that are used in the commit phase to skip over trees that
4446 + // don't contain effects, by checking subtreeFlags.
4447 +
4448 + var BeforeMutationMask = // TODO: Remove Update flag from before mutation phase by re-landing Visibility
4449 + // flag logic (see #20043)
4450 + Update | Snapshot | ( 0);
4451 + var MutationMask = Placement | Update | ChildDeletion | ContentReset | Ref | Hydrating | Visibility;
4452 + var LayoutMask = Update | Callback | Ref | Visibility; // TODO: Split into PassiveMountMask and PassiveUnmountMask
4453 +
4454 + var PassiveMask = Passive | ChildDeletion; // Union of tags that don't get reset on clones.
4455 + // This allows certain concepts to persist without recalculating them,
4456 + // e.g. whether a subtree contains passive effects or portals.
4457 +
4458 + var StaticMask = LayoutStatic | PassiveStatic | RefStatic;
4459 +
4460 + var ReactCurrentOwner = ReactSharedInternals.ReactCurrentOwner;
4461 + function getNearestMountedFiber(fiber) {
4462 + var node = fiber;
4463 + var nearestMounted = fiber;
4464 +
4465 + if (!fiber.alternate) {
4466 + // If there is no alternate, this might be a new tree that isn't inserted
4467 + // yet. If it is, then it will have a pending insertion effect on it.
4468 + var nextNode = node;
4469 +
4470 + do {
4471 + node = nextNode;
4472 +
4473 + if ((node.flags & (Placement | Hydrating)) !== NoFlags) {
4474 + // This is an insertion or in-progress hydration. The nearest possible
4475 + // mounted fiber is the parent but we need to continue to figure out
4476 + // if that one is still mounted.
4477 + nearestMounted = node.return;
4478 + }
4479 +
4480 + nextNode = node.return;
4481 + } while (nextNode);
4482 + } else {
4483 + while (node.return) {
4484 + node = node.return;
4485 + }
4486 + }
4487 +
4488 + if (node.tag === HostRoot) {
4489 + // TODO: Check if this was a nested HostRoot when used with
4490 + // renderContainerIntoSubtree.
4491 + return nearestMounted;
4492 + } // If we didn't hit the root, that means that we're in an disconnected tree
4493 + // that has been unmounted.
4494 +
4495 +
4496 + return null;
4497 + }
4498 + function getSuspenseInstanceFromFiber(fiber) {
4499 + if (fiber.tag === SuspenseComponent) {
4500 + var suspenseState = fiber.memoizedState;
4501 +
4502 + if (suspenseState === null) {
4503 + var current = fiber.alternate;
4504 +
4505 + if (current !== null) {
4506 + suspenseState = current.memoizedState;
4507 + }
4508 + }
4509 +
4510 + if (suspenseState !== null) {
4511 + return suspenseState.dehydrated;
4512 + }
4513 + }
4514 +
4515 + return null;
4516 + }
4517 + function getContainerFromFiber(fiber) {
4518 + return fiber.tag === HostRoot ? fiber.stateNode.containerInfo : null;
4519 + }
4520 + function isFiberMounted(fiber) {
4521 + return getNearestMountedFiber(fiber) === fiber;
4522 + }
4523 + function isMounted(component) {
4524 + {
4525 + var owner = ReactCurrentOwner.current;
4526 +
4527 + if (owner !== null && owner.tag === ClassComponent) {
4528 + var ownerFiber = owner;
4529 + var instance = ownerFiber.stateNode;
4530 +
4531 + if (!instance._warnedAboutRefsInRender) {
4532 + error('%s is accessing isMounted inside its render() function. ' + 'render() should be a pure function of props and state. It should ' + 'never access something that requires stale data from the previous ' + 'render, such as refs. Move this logic to componentDidMount and ' + 'componentDidUpdate instead.', getComponentNameFromFiber(ownerFiber) || 'A component');
4533 + }
4534 +
4535 + instance._warnedAboutRefsInRender = true;
4536 + }
4537 + }
4538 +
4539 + var fiber = get(component);
4540 +
4541 + if (!fiber) {
4542 + return false;
4543 + }
4544 +
4545 + return getNearestMountedFiber(fiber) === fiber;
4546 + }
4547 +
4548 + function assertIsMounted(fiber) {
4549 + if (getNearestMountedFiber(fiber) !== fiber) {
4550 + throw new Error('Unable to find node on an unmounted component.');
4551 + }
4552 + }
4553 +
4554 + function findCurrentFiberUsingSlowPath(fiber) {
4555 + var alternate = fiber.alternate;
4556 +
4557 + if (!alternate) {
4558 + // If there is no alternate, then we only need to check if it is mounted.
4559 + var nearestMounted = getNearestMountedFiber(fiber);
4560 +
4561 + if (nearestMounted === null) {
4562 + throw new Error('Unable to find node on an unmounted component.');
4563 + }
4564 +
4565 + if (nearestMounted !== fiber) {
4566 + return null;
4567 + }
4568 +
4569 + return fiber;
4570 + } // If we have two possible branches, we'll walk backwards up to the root
4571 + // to see what path the root points to. On the way we may hit one of the
4572 + // special cases and we'll deal with them.
4573 +
4574 +
4575 + var a = fiber;
4576 + var b = alternate;
4577 +
4578 + while (true) {
4579 + var parentA = a.return;
4580 +
4581 + if (parentA === null) {
4582 + // We're at the root.
4583 + break;
4584 + }
4585 +
4586 + var parentB = parentA.alternate;
4587 +
4588 + if (parentB === null) {
4589 + // There is no alternate. This is an unusual case. Currently, it only
4590 + // happens when a Suspense component is hidden. An extra fragment fiber
4591 + // is inserted in between the Suspense fiber and its children. Skip
4592 + // over this extra fragment fiber and proceed to the next parent.
4593 + var nextParent = parentA.return;
4594 +
4595 + if (nextParent !== null) {
4596 + a = b = nextParent;
4597 + continue;
4598 + } // If there's no parent, we're at the root.
4599 +
4600 +
4601 + break;
4602 + } // If both copies of the parent fiber point to the same child, we can
4603 + // assume that the child is current. This happens when we bailout on low
4604 + // priority: the bailed out fiber's child reuses the current child.
4605 +
4606 +
4607 + if (parentA.child === parentB.child) {
4608 + var child = parentA.child;
4609 +
4610 + while (child) {
4611 + if (child === a) {
4612 + // We've determined that A is the current branch.
4613 + assertIsMounted(parentA);
4614 + return fiber;
4615 + }
4616 +
4617 + if (child === b) {
4618 + // We've determined that B is the current branch.
4619 + assertIsMounted(parentA);
4620 + return alternate;
4621 + }
4622 +
4623 + child = child.sibling;
4624 + } // We should never have an alternate for any mounting node. So the only
4625 + // way this could possibly happen is if this was unmounted, if at all.
4626 +
4627 +
4628 + throw new Error('Unable to find node on an unmounted component.');
4629 + }
4630 +
4631 + if (a.return !== b.return) {
4632 + // The return pointer of A and the return pointer of B point to different
4633 + // fibers. We assume that return pointers never criss-cross, so A must
4634 + // belong to the child set of A.return, and B must belong to the child
4635 + // set of B.return.
4636 + a = parentA;
4637 + b = parentB;
4638 + } else {
4639 + // The return pointers point to the same fiber. We'll have to use the
4640 + // default, slow path: scan the child sets of each parent alternate to see
4641 + // which child belongs to which set.
4642 + //
4643 + // Search parent A's child set
4644 + var didFindChild = false;
4645 + var _child = parentA.child;
4646 +
4647 + while (_child) {
4648 + if (_child === a) {
4649 + didFindChild = true;
4650 + a = parentA;
4651 + b = parentB;
4652 + break;
4653 + }
4654 +
4655 + if (_child === b) {
4656 + didFindChild = true;
4657 + b = parentA;
4658 + a = parentB;
4659 + break;
4660 + }
4661 +
4662 + _child = _child.sibling;
4663 + }
4664 +
4665 + if (!didFindChild) {
4666 + // Search parent B's child set
4667 + _child = parentB.child;
4668 +
4669 + while (_child) {
4670 + if (_child === a) {
4671 + didFindChild = true;
4672 + a = parentB;
4673 + b = parentA;
4674 + break;
4675 + }
4676 +
4677 + if (_child === b) {
4678 + didFindChild = true;
4679 + b = parentB;
4680 + a = parentA;
4681 + break;
4682 + }
4683 +
4684 + _child = _child.sibling;
4685 + }
4686 +
4687 + if (!didFindChild) {
4688 + throw new Error('Child was not found in either parent set. This indicates a bug ' + 'in React related to the return pointer. Please file an issue.');
4689 + }
4690 + }
4691 + }
4692 +
4693 + if (a.alternate !== b) {
4694 + throw new Error("Return fibers should always be each others' alternates. " + 'This error is likely caused by a bug in React. Please file an issue.');
4695 + }
4696 + } // If the root is not a host container, we're in a disconnected tree. I.e.
4697 + // unmounted.
4698 +
4699 +
4700 + if (a.tag !== HostRoot) {
4701 + throw new Error('Unable to find node on an unmounted component.');
4702 + }
4703 +
4704 + if (a.stateNode.current === a) {
4705 + // We've determined that A is the current branch.
4706 + return fiber;
4707 + } // Otherwise B has to be current branch.
4708 +
4709 +
4710 + return alternate;
4711 + }
4712 + function findCurrentHostFiber(parent) {
4713 + var currentParent = findCurrentFiberUsingSlowPath(parent);
4714 + return currentParent !== null ? findCurrentHostFiberImpl(currentParent) : null;
4715 + }
4716 +
4717 + function findCurrentHostFiberImpl(node) {
4718 + // Next we'll drill down this component to find the first HostComponent/Text.
4719 + if (node.tag === HostComponent || node.tag === HostText) {
4720 + return node;
4721 + }
4722 +
4723 + var child = node.child;
4724 +
4725 + while (child !== null) {
4726 + var match = findCurrentHostFiberImpl(child);
4727 +
4728 + if (match !== null) {
4729 + return match;
4730 + }
4731 +
4732 + child = child.sibling;
4733 + }
4734 +
4735 + return null;
4736 + }
4737 +
4738 + function findCurrentHostFiberWithNoPortals(parent) {
4739 + var currentParent = findCurrentFiberUsingSlowPath(parent);
4740 + return currentParent !== null ? findCurrentHostFiberWithNoPortalsImpl(currentParent) : null;
4741 + }
4742 +
4743 + function findCurrentHostFiberWithNoPortalsImpl(node) {
4744 + // Next we'll drill down this component to find the first HostComponent/Text.
4745 + if (node.tag === HostComponent || node.tag === HostText) {
4746 + return node;
4747 + }
4748 +
4749 + var child = node.child;
4750 +
4751 + while (child !== null) {
4752 + if (child.tag !== HostPortal) {
4753 + var match = findCurrentHostFiberWithNoPortalsImpl(child);
4754 +
4755 + if (match !== null) {
4756 + return match;
4757 + }
4758 + }
4759 +
4760 + child = child.sibling;
4761 + }
4762 +
4763 + return null;
4764 + }
4765 +
4766 + // This module only exists as an ESM wrapper around the external CommonJS
4767 + var scheduleCallback = unstable_scheduleCallback;
4768 + var cancelCallback = unstable_cancelCallback;
4769 + var shouldYield = unstable_shouldYield;
4770 + var requestPaint = unstable_requestPaint;
4771 + var now = unstable_now;
4772 + var getCurrentPriorityLevel = unstable_getCurrentPriorityLevel;
4773 + var ImmediatePriority = unstable_ImmediatePriority;
4774 + var UserBlockingPriority = unstable_UserBlockingPriority;
4775 + var NormalPriority = unstable_NormalPriority;
4776 + var LowPriority = unstable_LowPriority;
4777 + var IdlePriority = unstable_IdlePriority;
4778 + // this doesn't actually exist on the scheduler, but it *does*
4779 + // on scheduler/unstable_mock, which we'll need for internal testing
4780 + var unstable_yieldValue$1 = unstable_yieldValue;
4781 + var unstable_setDisableYieldValue$1 = unstable_setDisableYieldValue;
4782 +
4783 + var rendererID = null;
4784 + var injectedHook = null;
4785 + var injectedProfilingHooks = null;
4786 + var hasLoggedError = false;
4787 + var isDevToolsPresent = typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ !== 'undefined';
4788 + function injectInternals(internals) {
4789 + if (typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ === 'undefined') {
4790 + // No DevTools
4791 + return false;
4792 + }
4793 +
4794 + var hook = __REACT_DEVTOOLS_GLOBAL_HOOK__;
4795 +
4796 + if (hook.isDisabled) {
4797 + // This isn't a real property on the hook, but it can be set to opt out
4798 + // of DevTools integration and associated warnings and logs.
4799 + // https://github.com/facebook/react/issues/3877
4800 + return true;
4801 + }
4802 +
4803 + if (!hook.supportsFiber) {
4804 + {
4805 + error('The installed version of React DevTools is too old and will not work ' + 'with the current version of React. Please update React DevTools. ' + 'https://reactjs.org/link/react-devtools');
4806 + } // DevTools exists, even though it doesn't support Fiber.
4807 +
4808 +
4809 + return true;
4810 + }
4811 +
4812 + try {
4813 + if (enableSchedulingProfiler) {
4814 + // Conditionally inject these hooks only if Timeline profiler is supported by this build.
4815 + // This gives DevTools a way to feature detect that isn't tied to version number
4816 + // (since profiling and timeline are controlled by different feature flags).
4817 + internals = assign({}, internals, {
4818 + getLaneLabelMap: getLaneLabelMap,
4819 + injectProfilingHooks: injectProfilingHooks
4820 + });
4821 + }
4822 +
4823 + rendererID = hook.inject(internals); // We have successfully injected, so now it is safe to set up hooks.
4824 +
4825 + injectedHook = hook;
4826 + } catch (err) {
4827 + // Catch all errors because it is unsafe to throw during initialization.
4828 + {
4829 + error('React instrumentation encountered an error: %s.', err);
4830 + }
4831 + }
4832 +
4833 + if (hook.checkDCE) {
4834 + // This is the real DevTools.
4835 + return true;
4836 + } else {
4837 + // This is likely a hook installed by Fast Refresh runtime.
4838 + return false;
4839 + }
4840 + }
4841 + function onScheduleRoot(root, children) {
4842 + {
4843 + if (injectedHook && typeof injectedHook.onScheduleFiberRoot === 'function') {
4844 + try {
4845 + injectedHook.onScheduleFiberRoot(rendererID, root, children);
4846 + } catch (err) {
4847 + if ( !hasLoggedError) {
4848 + hasLoggedError = true;
4849 +
4850 + error('React instrumentation encountered an error: %s', err);
4851 + }
4852 + }
4853 + }
4854 + }
4855 + }
4856 + function onCommitRoot(root, eventPriority) {
4857 + if (injectedHook && typeof injectedHook.onCommitFiberRoot === 'function') {
4858 + try {
4859 + var didError = (root.current.flags & DidCapture) === DidCapture;
4860 +
4861 + if (enableProfilerTimer) {
4862 + var schedulerPriority;
4863 +
4864 + switch (eventPriority) {
4865 + case DiscreteEventPriority:
4866 + schedulerPriority = ImmediatePriority;
4867 + break;
4868 +
4869 + case ContinuousEventPriority:
4870 + schedulerPriority = UserBlockingPriority;
4871 + break;
4872 +
4873 + case DefaultEventPriority:
4874 + schedulerPriority = NormalPriority;
4875 + break;
4876 +
4877 + case IdleEventPriority:
4878 + schedulerPriority = IdlePriority;
4879 + break;
4880 +
4881 + default:
4882 + schedulerPriority = NormalPriority;
4883 + break;
4884 + }
4885 +
4886 + injectedHook.onCommitFiberRoot(rendererID, root, schedulerPriority, didError);
4887 + } else {
4888 + injectedHook.onCommitFiberRoot(rendererID, root, undefined, didError);
4889 + }
4890 + } catch (err) {
4891 + {
4892 + if (!hasLoggedError) {
4893 + hasLoggedError = true;
4894 +
4895 + error('React instrumentation encountered an error: %s', err);
4896 + }
4897 + }
4898 + }
4899 + }
4900 + }
4901 + function onPostCommitRoot(root) {
4902 + if (injectedHook && typeof injectedHook.onPostCommitFiberRoot === 'function') {
4903 + try {
4904 + injectedHook.onPostCommitFiberRoot(rendererID, root);
4905 + } catch (err) {
4906 + {
4907 + if (!hasLoggedError) {
4908 + hasLoggedError = true;
4909 +
4910 + error('React instrumentation encountered an error: %s', err);
4911 + }
4912 + }
4913 + }
4914 + }
4915 + }
4916 + function onCommitUnmount(fiber) {
4917 + if (injectedHook && typeof injectedHook.onCommitFiberUnmount === 'function') {
4918 + try {
4919 + injectedHook.onCommitFiberUnmount(rendererID, fiber);
4920 + } catch (err) {
4921 + {
4922 + if (!hasLoggedError) {
4923 + hasLoggedError = true;
4924 +
4925 + error('React instrumentation encountered an error: %s', err);
4926 + }
4927 + }
4928 + }
4929 + }
4930 + }
4931 + function setIsStrictModeForDevtools(newIsStrictMode) {
4932 + {
4933 + if (typeof unstable_yieldValue$1 === 'function') {
4934 + // We're in a test because Scheduler.unstable_yieldValue only exists
4935 + // in SchedulerMock. To reduce the noise in strict mode tests,
4936 + // suppress warnings and disable scheduler yielding during the double render
4937 + unstable_setDisableYieldValue$1(newIsStrictMode);
4938 + setSuppressWarning(newIsStrictMode);
4939 + }
4940 +
4941 + if (injectedHook && typeof injectedHook.setStrictMode === 'function') {
4942 + try {
4943 + injectedHook.setStrictMode(rendererID, newIsStrictMode);
4944 + } catch (err) {
4945 + {
4946 + if (!hasLoggedError) {
4947 + hasLoggedError = true;
4948 +
4949 + error('React instrumentation encountered an error: %s', err);
4950 + }
4951 + }
4952 + }
4953 + }
4954 + }
4955 + } // Profiler API hooks
4956 +
4957 + function injectProfilingHooks(profilingHooks) {
4958 + injectedProfilingHooks = profilingHooks;
4959 + }
4960 +
4961 + function getLaneLabelMap() {
4962 + {
4963 + var map = new Map();
4964 + var lane = 1;
4965 +
4966 + for (var index = 0; index < TotalLanes; index++) {
4967 + var label = getLabelForLane(lane);
4968 + map.set(lane, label);
4969 + lane *= 2;
4970 + }
4971 +
4972 + return map;
4973 + }
4974 + }
4975 +
4976 + function markCommitStarted(lanes) {
4977 + {
4978 + if (injectedProfilingHooks !== null && typeof injectedProfilingHooks.markCommitStarted === 'function') {
4979 + injectedProfilingHooks.markCommitStarted(lanes);
4980 + }
4981 + }
4982 + }
4983 + function markCommitStopped() {
4984 + {
4985 + if (injectedProfilingHooks !== null && typeof injectedProfilingHooks.markCommitStopped === 'function') {
4986 + injectedProfilingHooks.markCommitStopped();
4987 + }
4988 + }
4989 + }
4990 + function markComponentRenderStarted(fiber) {
4991 + {
4992 + if (injectedProfilingHooks !== null && typeof injectedProfilingHooks.markComponentRenderStarted === 'function') {
4993 + injectedProfilingHooks.markComponentRenderStarted(fiber);
4994 + }
4995 + }
4996 + }
4997 + function markComponentRenderStopped() {
4998 + {
4999 + if (injectedProfilingHooks !== null && typeof injectedProfilingHooks.markComponentRenderStopped === 'function') {
5000 + injectedProfilingHooks.markComponentRenderStopped();
5001 + }
5002 + }
5003 + }
5004 + function markComponentPassiveEffectMountStarted(fiber) {
5005 + {
5006 + if (injectedProfilingHooks !== null && typeof injectedProfilingHooks.markComponentPassiveEffectMountStarted === 'function') {
5007 + injectedProfilingHooks.markComponentPassiveEffectMountStarted(fiber);
5008 + }
5009 + }
5010 + }
5011 + function markComponentPassiveEffectMountStopped() {
5012 + {
5013 + if (injectedProfilingHooks !== null && typeof injectedProfilingHooks.markComponentPassiveEffectMountStopped === 'function') {
5014 + injectedProfilingHooks.markComponentPassiveEffectMountStopped();
5015 + }
5016 + }
5017 + }
5018 + function markComponentPassiveEffectUnmountStarted(fiber) {
5019 + {
5020 + if (injectedProfilingHooks !== null && typeof injectedProfilingHooks.markComponentPassiveEffectUnmountStarted === 'function') {
5021 + injectedProfilingHooks.markComponentPassiveEffectUnmountStarted(fiber);
5022 + }
5023 + }
5024 + }
5025 + function markComponentPassiveEffectUnmountStopped() {
5026 + {
5027 + if (injectedProfilingHooks !== null && typeof injectedProfilingHooks.markComponentPassiveEffectUnmountStopped === 'function') {
5028 + injectedProfilingHooks.markComponentPassiveEffectUnmountStopped();
5029 + }
5030 + }
5031 + }
5032 + function markComponentLayoutEffectMountStarted(fiber) {
5033 + {
5034 + if (injectedProfilingHooks !== null && typeof injectedProfilingHooks.markComponentLayoutEffectMountStarted === 'function') {
5035 + injectedProfilingHooks.markComponentLayoutEffectMountStarted(fiber);
5036 + }
5037 + }
5038 + }
5039 + function markComponentLayoutEffectMountStopped() {
5040 + {
5041 + if (injectedProfilingHooks !== null && typeof injectedProfilingHooks.markComponentLayoutEffectMountStopped === 'function') {
5042 + injectedProfilingHooks.markComponentLayoutEffectMountStopped();
5043 + }
5044 + }
5045 + }
5046 + function markComponentLayoutEffectUnmountStarted(fiber) {
5047 + {
5048 + if (injectedProfilingHooks !== null && typeof injectedProfilingHooks.markComponentLayoutEffectUnmountStarted === 'function') {
5049 + injectedProfilingHooks.markComponentLayoutEffectUnmountStarted(fiber);
5050 + }
5051 + }
5052 + }
5053 + function markComponentLayoutEffectUnmountStopped() {
5054 + {
5055 + if (injectedProfilingHooks !== null && typeof injectedProfilingHooks.markComponentLayoutEffectUnmountStopped === 'function') {
5056 + injectedProfilingHooks.markComponentLayoutEffectUnmountStopped();
5057 + }
5058 + }
5059 + }
5060 + function markComponentErrored(fiber, thrownValue, lanes) {
5061 + {
5062 + if (injectedProfilingHooks !== null && typeof injectedProfilingHooks.markComponentErrored === 'function') {
5063 + injectedProfilingHooks.markComponentErrored(fiber, thrownValue, lanes);
5064 + }
5065 + }
5066 + }
5067 + function markComponentSuspended(fiber, wakeable, lanes) {
5068 + {
5069 + if (injectedProfilingHooks !== null && typeof injectedProfilingHooks.markComponentSuspended === 'function') {
5070 + injectedProfilingHooks.markComponentSuspended(fiber, wakeable, lanes);
5071 + }
5072 + }
5073 + }
5074 + function markLayoutEffectsStarted(lanes) {
5075 + {
5076 + if (injectedProfilingHooks !== null && typeof injectedProfilingHooks.markLayoutEffectsStarted === 'function') {
5077 + injectedProfilingHooks.markLayoutEffectsStarted(lanes);
5078 + }
5079 + }
5080 + }
5081 + function markLayoutEffectsStopped() {
5082 + {
5083 + if (injectedProfilingHooks !== null && typeof injectedProfilingHooks.markLayoutEffectsStopped === 'function') {
5084 + injectedProfilingHooks.markLayoutEffectsStopped();
5085 + }
5086 + }
5087 + }
5088 + function markPassiveEffectsStarted(lanes) {
5089 + {
5090 + if (injectedProfilingHooks !== null && typeof injectedProfilingHooks.markPassiveEffectsStarted === 'function') {
5091 + injectedProfilingHooks.markPassiveEffectsStarted(lanes);
5092 + }
5093 + }
5094 + }
5095 + function markPassiveEffectsStopped() {
5096 + {
5097 + if (injectedProfilingHooks !== null && typeof injectedProfilingHooks.markPassiveEffectsStopped === 'function') {
5098 + injectedProfilingHooks.markPassiveEffectsStopped();
5099 + }
5100 + }
5101 + }
5102 + function markRenderStarted(lanes) {
5103 + {
5104 + if (injectedProfilingHooks !== null && typeof injectedProfilingHooks.markRenderStarted === 'function') {
5105 + injectedProfilingHooks.markRenderStarted(lanes);
5106 + }
5107 + }
5108 + }
5109 + function markRenderYielded() {
5110 + {
5111 + if (injectedProfilingHooks !== null && typeof injectedProfilingHooks.markRenderYielded === 'function') {
5112 + injectedProfilingHooks.markRenderYielded();
5113 + }
5114 + }
5115 + }
5116 + function markRenderStopped() {
5117 + {
5118 + if (injectedProfilingHooks !== null && typeof injectedProfilingHooks.markRenderStopped === 'function') {
5119 + injectedProfilingHooks.markRenderStopped();
5120 + }
5121 + }
5122 + }
5123 + function markRenderScheduled(lane) {
5124 + {
5125 + if (injectedProfilingHooks !== null && typeof injectedProfilingHooks.markRenderScheduled === 'function') {
5126 + injectedProfilingHooks.markRenderScheduled(lane);
5127 + }
5128 + }
5129 + }
5130 + function markForceUpdateScheduled(fiber, lane) {
5131 + {
5132 + if (injectedProfilingHooks !== null && typeof injectedProfilingHooks.markForceUpdateScheduled === 'function') {
5133 + injectedProfilingHooks.markForceUpdateScheduled(fiber, lane);
5134 + }
5135 + }
5136 + }
5137 + function markStateUpdateScheduled(fiber, lane) {
5138 + {
5139 + if (injectedProfilingHooks !== null && typeof injectedProfilingHooks.markStateUpdateScheduled === 'function') {
5140 + injectedProfilingHooks.markStateUpdateScheduled(fiber, lane);
5141 + }
5142 + }
5143 + }
5144 +
5145 + var NoMode =
5146 + /* */
5147 + 0; // TODO: Remove ConcurrentMode by reading from the root tag instead
5148 +
5149 + var ConcurrentMode =
5150 + /* */
5151 + 1;
5152 + var ProfileMode =
5153 + /* */
5154 + 2;
5155 + var StrictLegacyMode =
5156 + /* */
5157 + 8;
5158 + var StrictEffectsMode =
5159 + /* */
5160 + 16;
5161 +
5162 + // TODO: This is pretty well supported by browsers. Maybe we can drop it.
5163 + var clz32 = Math.clz32 ? Math.clz32 : clz32Fallback; // Count leading zeros.
5164 + // Based on:
5165 + // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/clz32
5166 +
5167 + var log = Math.log;
5168 + var LN2 = Math.LN2;
5169 +
5170 + function clz32Fallback(x) {
5171 + var asUint = x >>> 0;
5172 +
5173 + if (asUint === 0) {
5174 + return 32;
5175 + }
5176 +
5177 + return 31 - (log(asUint) / LN2 | 0) | 0;
5178 + }
5179 +
5180 + // If those values are changed that package should be rebuilt and redeployed.
5181 +
5182 + var TotalLanes = 31;
5183 + var NoLanes =
5184 + /* */
5185 + 0;
5186 + var NoLane =
5187 + /* */
5188 + 0;
5189 + var SyncLane =
5190 + /* */
5191 + 1;
5192 + var InputContinuousHydrationLane =
5193 + /* */
5194 + 2;
5195 + var InputContinuousLane =
5196 + /* */
5197 + 4;
5198 + var DefaultHydrationLane =
5199 + /* */
5200 + 8;
5201 + var DefaultLane =
5202 + /* */
5203 + 16;
5204 + var TransitionHydrationLane =
5205 + /* */
5206 + 32;
5207 + var TransitionLanes =
5208 + /* */
5209 + 4194240;
5210 + var TransitionLane1 =
5211 + /* */
5212 + 64;
5213 + var TransitionLane2 =
5214 + /* */
5215 + 128;
5216 + var TransitionLane3 =
5217 + /* */
5218 + 256;
5219 + var TransitionLane4 =
5220 + /* */
5221 + 512;
5222 + var TransitionLane5 =
5223 + /* */
5224 + 1024;
5225 + var TransitionLane6 =
5226 + /* */
5227 + 2048;
5228 + var TransitionLane7 =
5229 + /* */
5230 + 4096;
5231 + var TransitionLane8 =
5232 + /* */
5233 + 8192;
5234 + var TransitionLane9 =
5235 + /* */
5236 + 16384;
5237 + var TransitionLane10 =
5238 + /* */
5239 + 32768;
5240 + var TransitionLane11 =
5241 + /* */
5242 + 65536;
5243 + var TransitionLane12 =
5244 + /* */
5245 + 131072;
5246 + var TransitionLane13 =
5247 + /* */
5248 + 262144;
5249 + var TransitionLane14 =
5250 + /* */
5251 + 524288;
5252 + var TransitionLane15 =
5253 + /* */
5254 + 1048576;
5255 + var TransitionLane16 =
5256 + /* */
5257 + 2097152;
5258 + var RetryLanes =
5259 + /* */
5260 + 130023424;
5261 + var RetryLane1 =
5262 + /* */
5263 + 4194304;
5264 + var RetryLane2 =
5265 + /* */
5266 + 8388608;
5267 + var RetryLane3 =
5268 + /* */
5269 + 16777216;
5270 + var RetryLane4 =
5271 + /* */
5272 + 33554432;
5273 + var RetryLane5 =
5274 + /* */
5275 + 67108864;
5276 + var SomeRetryLane = RetryLane1;
5277 + var SelectiveHydrationLane =
5278 + /* */
5279 + 134217728;
5280 + var NonIdleLanes =
5281 + /* */
5282 + 268435455;
5283 + var IdleHydrationLane =
5284 + /* */
5285 + 268435456;
5286 + var IdleLane =
5287 + /* */
5288 + 536870912;
5289 + var OffscreenLane =
5290 + /* */
5291 + 1073741824; // This function is used for the experimental timeline (react-devtools-timeline)
5292 + // It should be kept in sync with the Lanes values above.
5293 +
5294 + function getLabelForLane(lane) {
5295 + {
5296 + if (lane & SyncLane) {
5297 + return 'Sync';
5298 + }
5299 +
5300 + if (lane & InputContinuousHydrationLane) {
5301 + return 'InputContinuousHydration';
5302 + }
5303 +
5304 + if (lane & InputContinuousLane) {
5305 + return 'InputContinuous';
5306 + }
5307 +
5308 + if (lane & DefaultHydrationLane) {
5309 + return 'DefaultHydration';
5310 + }
5311 +
5312 + if (lane & DefaultLane) {
5313 + return 'Default';
5314 + }
5315 +
5316 + if (lane & TransitionHydrationLane) {
5317 + return 'TransitionHydration';
5318 + }
5319 +
5320 + if (lane & TransitionLanes) {
5321 + return 'Transition';
5322 + }
5323 +
5324 + if (lane & RetryLanes) {
5325 + return 'Retry';
5326 + }
5327 +
5328 + if (lane & SelectiveHydrationLane) {
5329 + return 'SelectiveHydration';
5330 + }
5331 +
5332 + if (lane & IdleHydrationLane) {
5333 + return 'IdleHydration';
5334 + }
5335 +
5336 + if (lane & IdleLane) {
5337 + return 'Idle';
5338 + }
5339 +
5340 + if (lane & OffscreenLane) {
5341 + return 'Offscreen';
5342 + }
5343 + }
5344 + }
5345 + var NoTimestamp = -1;
5346 + var nextTransitionLane = TransitionLane1;
5347 + var nextRetryLane = RetryLane1;
5348 +
5349 + function getHighestPriorityLanes(lanes) {
5350 + switch (getHighestPriorityLane(lanes)) {
5351 + case SyncLane:
5352 + return SyncLane;
5353 +
5354 + case InputContinuousHydrationLane:
5355 + return InputContinuousHydrationLane;
5356 +
5357 + case InputContinuousLane:
5358 + return InputContinuousLane;
5359 +
5360 + case DefaultHydrationLane:
5361 + return DefaultHydrationLane;
5362 +
5363 + case DefaultLane:
5364 + return DefaultLane;
5365 +
5366 + case TransitionHydrationLane:
5367 + return TransitionHydrationLane;
5368 +
5369 + case TransitionLane1:
5370 + case TransitionLane2:
5371 + case TransitionLane3:
5372 + case TransitionLane4:
5373 + case TransitionLane5:
5374 + case TransitionLane6:
5375 + case TransitionLane7:
5376 + case TransitionLane8:
5377 + case TransitionLane9:
5378 + case TransitionLane10:
5379 + case TransitionLane11:
5380 + case TransitionLane12:
5381 + case TransitionLane13:
5382 + case TransitionLane14:
5383 + case TransitionLane15:
5384 + case TransitionLane16:
5385 + return lanes & TransitionLanes;
5386 +
5387 + case RetryLane1:
5388 + case RetryLane2:
5389 + case RetryLane3:
5390 + case RetryLane4:
5391 + case RetryLane5:
5392 + return lanes & RetryLanes;
5393 +
5394 + case SelectiveHydrationLane:
5395 + return SelectiveHydrationLane;
5396 +
5397 + case IdleHydrationLane:
5398 + return IdleHydrationLane;
5399 +
5400 + case IdleLane:
5401 + return IdleLane;
5402 +
5403 + case OffscreenLane:
5404 + return OffscreenLane;
5405 +
5406 + default:
5407 + {
5408 + error('Should have found matching lanes. This is a bug in React.');
5409 + } // This shouldn't be reachable, but as a fallback, return the entire bitmask.
5410 +
5411 +
5412 + return lanes;
5413 + }
5414 + }
5415 +
5416 + function getNextLanes(root, wipLanes) {
5417 + // Early bailout if there's no pending work left.
5418 + var pendingLanes = root.pendingLanes;
5419 +
5420 + if (pendingLanes === NoLanes) {
5421 + return NoLanes;
5422 + }
5423 +
5424 + var nextLanes = NoLanes;
5425 + var suspendedLanes = root.suspendedLanes;
5426 + var pingedLanes = root.pingedLanes; // Do not work on any idle work until all the non-idle work has finished,
5427 + // even if the work is suspended.
5428 +
5429 + var nonIdlePendingLanes = pendingLanes & NonIdleLanes;
5430 +
5431 + if (nonIdlePendingLanes !== NoLanes) {
5432 + var nonIdleUnblockedLanes = nonIdlePendingLanes & ~suspendedLanes;
5433 +
5434 + if (nonIdleUnblockedLanes !== NoLanes) {
5435 + nextLanes = getHighestPriorityLanes(nonIdleUnblockedLanes);
5436 + } else {
5437 + var nonIdlePingedLanes = nonIdlePendingLanes & pingedLanes;
5438 +
5439 + if (nonIdlePingedLanes !== NoLanes) {
5440 + nextLanes = getHighestPriorityLanes(nonIdlePingedLanes);
5441 + }
5442 + }
5443 + } else {
5444 + // The only remaining work is Idle.
5445 + var unblockedLanes = pendingLanes & ~suspendedLanes;
5446 +
5447 + if (unblockedLanes !== NoLanes) {
5448 + nextLanes = getHighestPriorityLanes(unblockedLanes);
5449 + } else {
5450 + if (pingedLanes !== NoLanes) {
5451 + nextLanes = getHighestPriorityLanes(pingedLanes);
5452 + }
5453 + }
5454 + }
5455 +
5456 + if (nextLanes === NoLanes) {
5457 + // This should only be reachable if we're suspended
5458 + // TODO: Consider warning in this path if a fallback timer is not scheduled.
5459 + return NoLanes;
5460 + } // If we're already in the middle of a render, switching lanes will interrupt
5461 + // it and we'll lose our progress. We should only do this if the new lanes are
5462 + // higher priority.
5463 +
5464 +
5465 + if (wipLanes !== NoLanes && wipLanes !== nextLanes && // If we already suspended with a delay, then interrupting is fine. Don't
5466 + // bother waiting until the root is complete.
5467 + (wipLanes & suspendedLanes) === NoLanes) {
5468 + var nextLane = getHighestPriorityLane(nextLanes);
5469 + var wipLane = getHighestPriorityLane(wipLanes);
5470 +
5471 + if ( // Tests whether the next lane is equal or lower priority than the wip
5472 + // one. This works because the bits decrease in priority as you go left.
5473 + nextLane >= wipLane || // Default priority updates should not interrupt transition updates. The
5474 + // only difference between default updates and transition updates is that
5475 + // default updates do not support refresh transitions.
5476 + nextLane === DefaultLane && (wipLane & TransitionLanes) !== NoLanes) {
5477 + // Keep working on the existing in-progress tree. Do not interrupt.
5478 + return wipLanes;
5479 + }
5480 + }
5481 +
5482 + if ((nextLanes & InputContinuousLane) !== NoLanes) {
5483 + // When updates are sync by default, we entangle continuous priority updates
5484 + // and default updates, so they render in the same batch. The only reason
5485 + // they use separate lanes is because continuous updates should interrupt
5486 + // transitions, but default updates should not.
5487 + nextLanes |= pendingLanes & DefaultLane;
5488 + } // Check for entangled lanes and add them to the batch.
5489 + //
5490 + // A lane is said to be entangled with another when it's not allowed to render
5491 + // in a batch that does not also include the other lane. Typically we do this
5492 + // when multiple updates have the same source, and we only want to respond to
5493 + // the most recent event from that source.
5494 + //
5495 + // Note that we apply entanglements *after* checking for partial work above.
5496 + // This means that if a lane is entangled during an interleaved event while
5497 + // it's already rendering, we won't interrupt it. This is intentional, since
5498 + // entanglement is usually "best effort": we'll try our best to render the
5499 + // lanes in the same batch, but it's not worth throwing out partially
5500 + // completed work in order to do it.
5501 + // TODO: Reconsider this. The counter-argument is that the partial work
5502 + // represents an intermediate state, which we don't want to show to the user.
5503 + // And by spending extra time finishing it, we're increasing the amount of
5504 + // time it takes to show the final state, which is what they are actually
5505 + // waiting for.
5506 + //
5507 + // For those exceptions where entanglement is semantically important, like
5508 + // useMutableSource, we should ensure that there is no partial work at the
5509 + // time we apply the entanglement.
5510 +
5511 +
5512 + var entangledLanes = root.entangledLanes;
5513 +
5514 + if (entangledLanes !== NoLanes) {
5515 + var entanglements = root.entanglements;
5516 + var lanes = nextLanes & entangledLanes;
5517 +
5518 + while (lanes > 0) {
5519 + var index = pickArbitraryLaneIndex(lanes);
5520 + var lane = 1 << index;
5521 + nextLanes |= entanglements[index];
5522 + lanes &= ~lane;
5523 + }
5524 + }
5525 +
5526 + return nextLanes;
5527 + }
5528 + function getMostRecentEventTime(root, lanes) {
5529 + var eventTimes = root.eventTimes;
5530 + var mostRecentEventTime = NoTimestamp;
5531 +
5532 + while (lanes > 0) {
5533 + var index = pickArbitraryLaneIndex(lanes);
5534 + var lane = 1 << index;
5535 + var eventTime = eventTimes[index];
5536 +
5537 + if (eventTime > mostRecentEventTime) {
5538 + mostRecentEventTime = eventTime;
5539 + }
5540 +
5541 + lanes &= ~lane;
5542 + }
5543 +
5544 + return mostRecentEventTime;
5545 + }
5546 +
5547 + function computeExpirationTime(lane, currentTime) {
5548 + switch (lane) {
5549 + case SyncLane:
5550 + case InputContinuousHydrationLane:
5551 + case InputContinuousLane:
5552 + // User interactions should expire slightly more quickly.
5553 + //
5554 + // NOTE: This is set to the corresponding constant as in Scheduler.js.
5555 + // When we made it larger, a product metric in www regressed, suggesting
5556 + // there's a user interaction that's being starved by a series of
5557 + // synchronous updates. If that theory is correct, the proper solution is
5558 + // to fix the starvation. However, this scenario supports the idea that
5559 + // expiration times are an important safeguard when starvation
5560 + // does happen.
5561 + return currentTime + 250;
5562 +
5563 + case DefaultHydrationLane:
5564 + case DefaultLane:
5565 + case TransitionHydrationLane:
5566 + case TransitionLane1:
5567 + case TransitionLane2:
5568 + case TransitionLane3:
5569 + case TransitionLane4:
5570 + case TransitionLane5:
5571 + case TransitionLane6:
5572 + case TransitionLane7:
5573 + case TransitionLane8:
5574 + case TransitionLane9:
5575 + case TransitionLane10:
5576 + case TransitionLane11:
5577 + case TransitionLane12:
5578 + case TransitionLane13:
5579 + case TransitionLane14:
5580 + case TransitionLane15:
5581 + case TransitionLane16:
5582 + return currentTime + 5000;
5583 +
5584 + case RetryLane1:
5585 + case RetryLane2:
5586 + case RetryLane3:
5587 + case RetryLane4:
5588 + case RetryLane5:
5589 + // TODO: Retries should be allowed to expire if they are CPU bound for
5590 + // too long, but when I made this change it caused a spike in browser
5591 + // crashes. There must be some other underlying bug; not super urgent but
5592 + // ideally should figure out why and fix it. Unfortunately we don't have
5593 + // a repro for the crashes, only detected via production metrics.
5594 + return NoTimestamp;
5595 +
5596 + case SelectiveHydrationLane:
5597 + case IdleHydrationLane:
5598 + case IdleLane:
5599 + case OffscreenLane:
5600 + // Anything idle priority or lower should never expire.
5601 + return NoTimestamp;
5602 +
5603 + default:
5604 + {
5605 + error('Should have found matching lanes. This is a bug in React.');
5606 + }
5607 +
5608 + return NoTimestamp;
5609 + }
5610 + }
5611 +
5612 + function markStarvedLanesAsExpired(root, currentTime) {
5613 + // TODO: This gets called every time we yield. We can optimize by storing
5614 + // the earliest expiration time on the root. Then use that to quickly bail out
5615 + // of this function.
5616 + var pendingLanes = root.pendingLanes;
5617 + var suspendedLanes = root.suspendedLanes;
5618 + var pingedLanes = root.pingedLanes;
5619 + var expirationTimes = root.expirationTimes; // Iterate through the pending lanes and check if we've reached their
5620 + // expiration time. If so, we'll assume the update is being starved and mark
5621 + // it as expired to force it to finish.
5622 +
5623 + var lanes = pendingLanes;
5624 +
5625 + while (lanes > 0) {
5626 + var index = pickArbitraryLaneIndex(lanes);
5627 + var lane = 1 << index;
5628 + var expirationTime = expirationTimes[index];
5629 +
5630 + if (expirationTime === NoTimestamp) {
5631 + // Found a pending lane with no expiration time. If it's not suspended, or
5632 + // if it's pinged, assume it's CPU-bound. Compute a new expiration time
5633 + // using the current time.
5634 + if ((lane & suspendedLanes) === NoLanes || (lane & pingedLanes) !== NoLanes) {
5635 + // Assumes timestamps are monotonically increasing.
5636 + expirationTimes[index] = computeExpirationTime(lane, currentTime);
5637 + }
5638 + } else if (expirationTime <= currentTime) {
5639 + // This lane expired
5640 + root.expiredLanes |= lane;
5641 + }
5642 +
5643 + lanes &= ~lane;
5644 + }
5645 + } // This returns the highest priority pending lanes regardless of whether they
5646 + // are suspended.
5647 +
5648 + function getHighestPriorityPendingLanes(root) {
5649 + return getHighestPriorityLanes(root.pendingLanes);
5650 + }
5651 + function getLanesToRetrySynchronouslyOnError(root) {
5652 + var everythingButOffscreen = root.pendingLanes & ~OffscreenLane;
5653 +
5654 + if (everythingButOffscreen !== NoLanes) {
5655 + return everythingButOffscreen;
5656 + }
5657 +
5658 + if (everythingButOffscreen & OffscreenLane) {
5659 + return OffscreenLane;
5660 + }
5661 +
5662 + return NoLanes;
5663 + }
5664 + function includesSyncLane(lanes) {
5665 + return (lanes & SyncLane) !== NoLanes;
5666 + }
5667 + function includesNonIdleWork(lanes) {
5668 + return (lanes & NonIdleLanes) !== NoLanes;
5669 + }
5670 + function includesOnlyRetries(lanes) {
5671 + return (lanes & RetryLanes) === lanes;
5672 + }
5673 + function includesOnlyNonUrgentLanes(lanes) {
5674 + var UrgentLanes = SyncLane | InputContinuousLane | DefaultLane;
5675 + return (lanes & UrgentLanes) === NoLanes;
5676 + }
5677 + function includesOnlyTransitions(lanes) {
5678 + return (lanes & TransitionLanes) === lanes;
5679 + }
5680 + function includesBlockingLane(root, lanes) {
5681 +
5682 + var SyncDefaultLanes = InputContinuousHydrationLane | InputContinuousLane | DefaultHydrationLane | DefaultLane;
5683 + return (lanes & SyncDefaultLanes) !== NoLanes;
5684 + }
5685 + function includesExpiredLane(root, lanes) {
5686 + // This is a separate check from includesBlockingLane because a lane can
5687 + // expire after a render has already started.
5688 + return (lanes & root.expiredLanes) !== NoLanes;
5689 + }
5690 + function isTransitionLane(lane) {
5691 + return (lane & TransitionLanes) !== NoLanes;
5692 + }
5693 + function claimNextTransitionLane() {
5694 + // Cycle through the lanes, assigning each new transition to the next lane.
5695 + // In most cases, this means every transition gets its own lane, until we
5696 + // run out of lanes and cycle back to the beginning.
5697 + var lane = nextTransitionLane;
5698 + nextTransitionLane <<= 1;
5699 +
5700 + if ((nextTransitionLane & TransitionLanes) === NoLanes) {
5701 + nextTransitionLane = TransitionLane1;
5702 + }
5703 +
5704 + return lane;
5705 + }
5706 + function claimNextRetryLane() {
5707 + var lane = nextRetryLane;
5708 + nextRetryLane <<= 1;
5709 +
5710 + if ((nextRetryLane & RetryLanes) === NoLanes) {
5711 + nextRetryLane = RetryLane1;
5712 + }
5713 +
5714 + return lane;
5715 + }
5716 + function getHighestPriorityLane(lanes) {
5717 + return lanes & -lanes;
5718 + }
5719 + function pickArbitraryLane(lanes) {
5720 + // This wrapper function gets inlined. Only exists so to communicate that it
5721 + // doesn't matter which bit is selected; you can pick any bit without
5722 + // affecting the algorithms where its used. Here I'm using
5723 + // getHighestPriorityLane because it requires the fewest operations.
5724 + return getHighestPriorityLane(lanes);
5725 + }
5726 +
5727 + function pickArbitraryLaneIndex(lanes) {
5728 + return 31 - clz32(lanes);
5729 + }
5730 +
5731 + function laneToIndex(lane) {
5732 + return pickArbitraryLaneIndex(lane);
5733 + }
5734 +
5735 + function includesSomeLane(a, b) {
5736 + return (a & b) !== NoLanes;
5737 + }
5738 + function isSubsetOfLanes(set, subset) {
5739 + return (set & subset) === subset;
5740 + }
5741 + function mergeLanes(a, b) {
5742 + return a | b;
5743 + }
5744 + function removeLanes(set, subset) {
5745 + return set & ~subset;
5746 + }
5747 + function intersectLanes(a, b) {
5748 + return a & b;
5749 + } // Seems redundant, but it changes the type from a single lane (used for
5750 + // updates) to a group of lanes (used for flushing work).
5751 +
5752 + function laneToLanes(lane) {
5753 + return lane;
5754 + }
5755 + function higherPriorityLane(a, b) {
5756 + // This works because the bit ranges decrease in priority as you go left.
5757 + return a !== NoLane && a < b ? a : b;
5758 + }
5759 + function createLaneMap(initial) {
5760 + // Intentionally pushing one by one.
5761 + // https://v8.dev/blog/elements-kinds#avoid-creating-holes
5762 + var laneMap = [];
5763 +
5764 + for (var i = 0; i < TotalLanes; i++) {
5765 + laneMap.push(initial);
5766 + }
5767 +
5768 + return laneMap;
5769 + }
5770 + function markRootUpdated(root, updateLane, eventTime) {
5771 + root.pendingLanes |= updateLane; // If there are any suspended transitions, it's possible this new update
5772 + // could unblock them. Clear the suspended lanes so that we can try rendering
5773 + // them again.
5774 + //
5775 + // TODO: We really only need to unsuspend only lanes that are in the
5776 + // `subtreeLanes` of the updated fiber, or the update lanes of the return
5777 + // path. This would exclude suspended updates in an unrelated sibling tree,
5778 + // since there's no way for this update to unblock it.
5779 + //
5780 + // We don't do this if the incoming update is idle, because we never process
5781 + // idle updates until after all the regular updates have finished; there's no
5782 + // way it could unblock a transition.
5783 +
5784 + if (updateLane !== IdleLane) {
5785 + root.suspendedLanes = NoLanes;
5786 + root.pingedLanes = NoLanes;
5787 + }
5788 +
5789 + var eventTimes = root.eventTimes;
5790 + var index = laneToIndex(updateLane); // We can always overwrite an existing timestamp because we prefer the most
5791 + // recent event, and we assume time is monotonically increasing.
5792 +
5793 + eventTimes[index] = eventTime;
5794 + }
5795 + function markRootSuspended(root, suspendedLanes) {
5796 + root.suspendedLanes |= suspendedLanes;
5797 + root.pingedLanes &= ~suspendedLanes; // The suspended lanes are no longer CPU-bound. Clear their expiration times.
5798 +
5799 + var expirationTimes = root.expirationTimes;
5800 + var lanes = suspendedLanes;
5801 +
5802 + while (lanes > 0) {
5803 + var index = pickArbitraryLaneIndex(lanes);
5804 + var lane = 1 << index;
5805 + expirationTimes[index] = NoTimestamp;
5806 + lanes &= ~lane;
5807 + }
5808 + }
5809 + function markRootPinged(root, pingedLanes, eventTime) {
5810 + root.pingedLanes |= root.suspendedLanes & pingedLanes;
5811 + }
5812 + function markRootFinished(root, remainingLanes) {
5813 + var noLongerPendingLanes = root.pendingLanes & ~remainingLanes;
5814 + root.pendingLanes = remainingLanes; // Let's try everything again
5815 +
5816 + root.suspendedLanes = NoLanes;
5817 + root.pingedLanes = NoLanes;
5818 + root.expiredLanes &= remainingLanes;
5819 + root.mutableReadLanes &= remainingLanes;
5820 + root.entangledLanes &= remainingLanes;
5821 + var entanglements = root.entanglements;
5822 + var eventTimes = root.eventTimes;
5823 + var expirationTimes = root.expirationTimes; // Clear the lanes that no longer have pending work
5824 +
5825 + var lanes = noLongerPendingLanes;
5826 +
5827 + while (lanes > 0) {
5828 + var index = pickArbitraryLaneIndex(lanes);
5829 + var lane = 1 << index;
5830 + entanglements[index] = NoLanes;
5831 + eventTimes[index] = NoTimestamp;
5832 + expirationTimes[index] = NoTimestamp;
5833 + lanes &= ~lane;
5834 + }
5835 + }
5836 + function markRootEntangled(root, entangledLanes) {
5837 + // In addition to entangling each of the given lanes with each other, we also
5838 + // have to consider _transitive_ entanglements. For each lane that is already
5839 + // entangled with *any* of the given lanes, that lane is now transitively
5840 + // entangled with *all* the given lanes.
5841 + //
5842 + // Translated: If C is entangled with A, then entangling A with B also
5843 + // entangles C with B.
5844 + //
5845 + // If this is hard to grasp, it might help to intentionally break this
5846 + // function and look at the tests that fail in ReactTransition-test.js. Try
5847 + // commenting out one of the conditions below.
5848 + var rootEntangledLanes = root.entangledLanes |= entangledLanes;
5849 + var entanglements = root.entanglements;
5850 + var lanes = rootEntangledLanes;
5851 +
5852 + while (lanes) {
5853 + var index = pickArbitraryLaneIndex(lanes);
5854 + var lane = 1 << index;
5855 +
5856 + if ( // Is this one of the newly entangled lanes?
5857 + lane & entangledLanes | // Is this lane transitively entangled with the newly entangled lanes?
5858 + entanglements[index] & entangledLanes) {
5859 + entanglements[index] |= entangledLanes;
5860 + }
5861 +
5862 + lanes &= ~lane;
5863 + }
5864 + }
5865 + function getBumpedLaneForHydration(root, renderLanes) {
5866 + var renderLane = getHighestPriorityLane(renderLanes);
5867 + var lane;
5868 +
5869 + switch (renderLane) {
5870 + case InputContinuousLane:
5871 + lane = InputContinuousHydrationLane;
5872 + break;
5873 +
5874 + case DefaultLane:
5875 + lane = DefaultHydrationLane;
5876 + break;
5877 +
5878 + case TransitionLane1:
5879 + case TransitionLane2:
5880 + case TransitionLane3:
5881 + case TransitionLane4:
5882 + case TransitionLane5:
5883 + case TransitionLane6:
5884 + case TransitionLane7:
5885 + case TransitionLane8:
5886 + case TransitionLane9:
5887 + case TransitionLane10:
5888 + case TransitionLane11:
5889 + case TransitionLane12:
5890 + case TransitionLane13:
5891 + case TransitionLane14:
5892 + case TransitionLane15:
5893 + case TransitionLane16:
5894 + case RetryLane1:
5895 + case RetryLane2:
5896 + case RetryLane3:
5897 + case RetryLane4:
5898 + case RetryLane5:
5899 + lane = TransitionHydrationLane;
5900 + break;
5901 +
5902 + case IdleLane:
5903 + lane = IdleHydrationLane;
5904 + break;
5905 +
5906 + default:
5907 + // Everything else is already either a hydration lane, or shouldn't
5908 + // be retried at a hydration lane.
5909 + lane = NoLane;
5910 + break;
5911 + } // Check if the lane we chose is suspended. If so, that indicates that we
5912 + // already attempted and failed to hydrate at that level. Also check if we're
5913 + // already rendering that lane, which is rare but could happen.
5914 +
5915 +
5916 + if ((lane & (root.suspendedLanes | renderLanes)) !== NoLane) {
5917 + // Give up trying to hydrate and fall back to client render.
5918 + return NoLane;
5919 + }
5920 +
5921 + return lane;
5922 + }
5923 + function addFiberToLanesMap(root, fiber, lanes) {
5924 +
5925 + if (!isDevToolsPresent) {
5926 + return;
5927 + }
5928 +
5929 + var pendingUpdatersLaneMap = root.pendingUpdatersLaneMap;
5930 +
5931 + while (lanes > 0) {
5932 + var index = laneToIndex(lanes);
5933 + var lane = 1 << index;
5934 + var updaters = pendingUpdatersLaneMap[index];
5935 + updaters.add(fiber);
5936 + lanes &= ~lane;
5937 + }
5938 + }
5939 + function movePendingFibersToMemoized(root, lanes) {
5940 +
5941 + if (!isDevToolsPresent) {
5942 + return;
5943 + }
5944 +
5945 + var pendingUpdatersLaneMap = root.pendingUpdatersLaneMap;
5946 + var memoizedUpdaters = root.memoizedUpdaters;
5947 +
5948 + while (lanes > 0) {
5949 + var index = laneToIndex(lanes);
5950 + var lane = 1 << index;
5951 + var updaters = pendingUpdatersLaneMap[index];
5952 +
5953 + if (updaters.size > 0) {
5954 + updaters.forEach(function (fiber) {
5955 + var alternate = fiber.alternate;
5956 +
5957 + if (alternate === null || !memoizedUpdaters.has(alternate)) {
5958 + memoizedUpdaters.add(fiber);
5959 + }
5960 + });
5961 + updaters.clear();
5962 + }
5963 +
5964 + lanes &= ~lane;
5965 + }
5966 + }
5967 + function getTransitionsForLanes(root, lanes) {
5968 + {
5969 + return null;
5970 + }
5971 + }
5972 +
5973 + var DiscreteEventPriority = SyncLane;
5974 + var ContinuousEventPriority = InputContinuousLane;
5975 + var DefaultEventPriority = DefaultLane;
5976 + var IdleEventPriority = IdleLane;
5977 + var currentUpdatePriority = NoLane;
5978 + function getCurrentUpdatePriority() {
5979 + return currentUpdatePriority;
5980 + }
5981 + function setCurrentUpdatePriority(newPriority) {
5982 + currentUpdatePriority = newPriority;
5983 + }
5984 + function runWithPriority(priority, fn) {
5985 + var previousPriority = currentUpdatePriority;
5986 +
5987 + try {
5988 + currentUpdatePriority = priority;
5989 + return fn();
5990 + } finally {
5991 + currentUpdatePriority = previousPriority;
5992 + }
5993 + }
5994 + function higherEventPriority(a, b) {
5995 + return a !== 0 && a < b ? a : b;
5996 + }
5997 + function lowerEventPriority(a, b) {
5998 + return a === 0 || a > b ? a : b;
5999 + }
6000 + function isHigherEventPriority(a, b) {
6001 + return a !== 0 && a < b;
6002 + }
6003 + function lanesToEventPriority(lanes) {
6004 + var lane = getHighestPriorityLane(lanes);
6005 +
6006 + if (!isHigherEventPriority(DiscreteEventPriority, lane)) {
6007 + return DiscreteEventPriority;
6008 + }
6009 +
6010 + if (!isHigherEventPriority(ContinuousEventPriority, lane)) {
6011 + return ContinuousEventPriority;
6012 + }
6013 +
6014 + if (includesNonIdleWork(lane)) {
6015 + return DefaultEventPriority;
6016 + }
6017 +
6018 + return IdleEventPriority;
6019 + }
6020 +
6021 + // This is imported by the event replaying implementation in React DOM. It's
6022 + // in a separate file to break a circular dependency between the renderer and
6023 + // the reconciler.
6024 + function isRootDehydrated(root) {
6025 + var currentState = root.current.memoizedState;
6026 + return currentState.isDehydrated;
6027 + }
6028 +
6029 + var _attemptSynchronousHydration;
6030 +
6031 + function setAttemptSynchronousHydration(fn) {
6032 + _attemptSynchronousHydration = fn;
6033 + }
6034 + function attemptSynchronousHydration(fiber) {
6035 + _attemptSynchronousHydration(fiber);
6036 + }
6037 + var attemptContinuousHydration;
6038 + function setAttemptContinuousHydration(fn) {
6039 + attemptContinuousHydration = fn;
6040 + }
6041 + var attemptHydrationAtCurrentPriority;
6042 + function setAttemptHydrationAtCurrentPriority(fn) {
6043 + attemptHydrationAtCurrentPriority = fn;
6044 + }
6045 + var getCurrentUpdatePriority$1;
6046 + function setGetCurrentUpdatePriority(fn) {
6047 + getCurrentUpdatePriority$1 = fn;
6048 + }
6049 + var attemptHydrationAtPriority;
6050 + function setAttemptHydrationAtPriority(fn) {
6051 + attemptHydrationAtPriority = fn;
6052 + } // TODO: Upgrade this definition once we're on a newer version of Flow that
6053 + // has this definition built-in.
6054 +
6055 + var hasScheduledReplayAttempt = false; // The queue of discrete events to be replayed.
6056 +
6057 + var queuedDiscreteEvents = []; // Indicates if any continuous event targets are non-null for early bailout.
6058 + // if the last target was dehydrated.
6059 +
6060 + var queuedFocus = null;
6061 + var queuedDrag = null;
6062 + var queuedMouse = null; // For pointer events there can be one latest event per pointerId.
6063 +
6064 + var queuedPointers = new Map();
6065 + var queuedPointerCaptures = new Map(); // We could consider replaying selectionchange and touchmoves too.
6066 +
6067 + var queuedExplicitHydrationTargets = [];
6068 + var discreteReplayableEvents = ['mousedown', 'mouseup', 'touchcancel', 'touchend', 'touchstart', 'auxclick', 'dblclick', 'pointercancel', 'pointerdown', 'pointerup', 'dragend', 'dragstart', 'drop', 'compositionend', 'compositionstart', 'keydown', 'keypress', 'keyup', 'input', 'textInput', // Intentionally camelCase
6069 + 'copy', 'cut', 'paste', 'click', 'change', 'contextmenu', 'reset', 'submit'];
6070 + function isDiscreteEventThatRequiresHydration(eventType) {
6071 + return discreteReplayableEvents.indexOf(eventType) > -1;
6072 + }
6073 +
6074 + function createQueuedReplayableEvent(blockedOn, domEventName, eventSystemFlags, targetContainer, nativeEvent) {
6075 + return {
6076 + blockedOn: blockedOn,
6077 + domEventName: domEventName,
6078 + eventSystemFlags: eventSystemFlags,
6079 + nativeEvent: nativeEvent,
6080 + targetContainers: [targetContainer]
6081 + };
6082 + }
6083 +
6084 + function clearIfContinuousEvent(domEventName, nativeEvent) {
6085 + switch (domEventName) {
6086 + case 'focusin':
6087 + case 'focusout':
6088 + queuedFocus = null;
6089 + break;
6090 +
6091 + case 'dragenter':
6092 + case 'dragleave':
6093 + queuedDrag = null;
6094 + break;
6095 +
6096 + case 'mouseover':
6097 + case 'mouseout':
6098 + queuedMouse = null;
6099 + break;
6100 +
6101 + case 'pointerover':
6102 + case 'pointerout':
6103 + {
6104 + var pointerId = nativeEvent.pointerId;
6105 + queuedPointers.delete(pointerId);
6106 + break;
6107 + }
6108 +
6109 + case 'gotpointercapture':
6110 + case 'lostpointercapture':
6111 + {
6112 + var _pointerId = nativeEvent.pointerId;
6113 + queuedPointerCaptures.delete(_pointerId);
6114 + break;
6115 + }
6116 + }
6117 + }
6118 +
6119 + function accumulateOrCreateContinuousQueuedReplayableEvent(existingQueuedEvent, blockedOn, domEventName, eventSystemFlags, targetContainer, nativeEvent) {
6120 + if (existingQueuedEvent === null || existingQueuedEvent.nativeEvent !== nativeEvent) {
6121 + var queuedEvent = createQueuedReplayableEvent(blockedOn, domEventName, eventSystemFlags, targetContainer, nativeEvent);
6122 +
6123 + if (blockedOn !== null) {
6124 + var _fiber2 = getInstanceFromNode(blockedOn);
6125 +
6126 + if (_fiber2 !== null) {
6127 + // Attempt to increase the priority of this target.
6128 + attemptContinuousHydration(_fiber2);
6129 + }
6130 + }
6131 +
6132 + return queuedEvent;
6133 + } // If we have already queued this exact event, then it's because
6134 + // the different event systems have different DOM event listeners.
6135 + // We can accumulate the flags, and the targetContainers, and
6136 + // store a single event to be replayed.
6137 +
6138 +
6139 + existingQueuedEvent.eventSystemFlags |= eventSystemFlags;
6140 + var targetContainers = existingQueuedEvent.targetContainers;
6141 +
6142 + if (targetContainer !== null && targetContainers.indexOf(targetContainer) === -1) {
6143 + targetContainers.push(targetContainer);
6144 + }
6145 +
6146 + return existingQueuedEvent;
6147 + }
6148 +
6149 + function queueIfContinuousEvent(blockedOn, domEventName, eventSystemFlags, targetContainer, nativeEvent) {
6150 + // These set relatedTarget to null because the replayed event will be treated as if we
6151 + // moved from outside the window (no target) onto the target once it hydrates.
6152 + // Instead of mutating we could clone the event.
6153 + switch (domEventName) {
6154 + case 'focusin':
6155 + {
6156 + var focusEvent = nativeEvent;
6157 + queuedFocus = accumulateOrCreateContinuousQueuedReplayableEvent(queuedFocus, blockedOn, domEventName, eventSystemFlags, targetContainer, focusEvent);
6158 + return true;
6159 + }
6160 +
6161 + case 'dragenter':
6162 + {
6163 + var dragEvent = nativeEvent;
6164 + queuedDrag = accumulateOrCreateContinuousQueuedReplayableEvent(queuedDrag, blockedOn, domEventName, eventSystemFlags, targetContainer, dragEvent);
6165 + return true;
6166 + }
6167 +
6168 + case 'mouseover':
6169 + {
6170 + var mouseEvent = nativeEvent;
6171 + queuedMouse = accumulateOrCreateContinuousQueuedReplayableEvent(queuedMouse, blockedOn, domEventName, eventSystemFlags, targetContainer, mouseEvent);
6172 + return true;
6173 + }
6174 +
6175 + case 'pointerover':
6176 + {
6177 + var pointerEvent = nativeEvent;
6178 + var pointerId = pointerEvent.pointerId;
6179 + queuedPointers.set(pointerId, accumulateOrCreateContinuousQueuedReplayableEvent(queuedPointers.get(pointerId) || null, blockedOn, domEventName, eventSystemFlags, targetContainer, pointerEvent));
6180 + return true;
6181 + }
6182 +
6183 + case 'gotpointercapture':
6184 + {
6185 + var _pointerEvent = nativeEvent;
6186 + var _pointerId2 = _pointerEvent.pointerId;
6187 + queuedPointerCaptures.set(_pointerId2, accumulateOrCreateContinuousQueuedReplayableEvent(queuedPointerCaptures.get(_pointerId2) || null, blockedOn, domEventName, eventSystemFlags, targetContainer, _pointerEvent));
6188 + return true;
6189 + }
6190 + }
6191 +
6192 + return false;
6193 + } // Check if this target is unblocked. Returns true if it's unblocked.
6194 +
6195 + function attemptExplicitHydrationTarget(queuedTarget) {
6196 + // TODO: This function shares a lot of logic with findInstanceBlockingEvent.
6197 + // Try to unify them. It's a bit tricky since it would require two return
6198 + // values.
6199 + var targetInst = getClosestInstanceFromNode(queuedTarget.target);
6200 +
6201 + if (targetInst !== null) {
6202 + var nearestMounted = getNearestMountedFiber(targetInst);
6203 +
6204 + if (nearestMounted !== null) {
6205 + var tag = nearestMounted.tag;
6206 +
6207 + if (tag === SuspenseComponent) {
6208 + var instance = getSuspenseInstanceFromFiber(nearestMounted);
6209 +
6210 + if (instance !== null) {
6211 + // We're blocked on hydrating this boundary.
6212 + // Increase its priority.
6213 + queuedTarget.blockedOn = instance;
6214 + attemptHydrationAtPriority(queuedTarget.priority, function () {
6215 + attemptHydrationAtCurrentPriority(nearestMounted);
6216 + });
6217 + return;
6218 + }
6219 + } else if (tag === HostRoot) {
6220 + var root = nearestMounted.stateNode;
6221 +
6222 + if (isRootDehydrated(root)) {
6223 + queuedTarget.blockedOn = getContainerFromFiber(nearestMounted); // We don't currently have a way to increase the priority of
6224 + // a root other than sync.
6225 +
6226 + return;
6227 + }
6228 + }
6229 + }
6230 + }
6231 +
6232 + queuedTarget.blockedOn = null;
6233 + }
6234 +
6235 + function queueExplicitHydrationTarget(target) {
6236 + // TODO: This will read the priority if it's dispatched by the React
6237 + // event system but not native events. Should read window.event.type, like
6238 + // we do for updates (getCurrentEventPriority).
6239 + var updatePriority = getCurrentUpdatePriority$1();
6240 + var queuedTarget = {
6241 + blockedOn: null,
6242 + target: target,
6243 + priority: updatePriority
6244 + };
6245 + var i = 0;
6246 +
6247 + for (; i < queuedExplicitHydrationTargets.length; i++) {
6248 + // Stop once we hit the first target with lower priority than
6249 + if (!isHigherEventPriority(updatePriority, queuedExplicitHydrationTargets[i].priority)) {
6250 + break;
6251 + }
6252 + }
6253 +
6254 + queuedExplicitHydrationTargets.splice(i, 0, queuedTarget);
6255 +
6256 + if (i === 0) {
6257 + attemptExplicitHydrationTarget(queuedTarget);
6258 + }
6259 + }
6260 +
6261 + function attemptReplayContinuousQueuedEvent(queuedEvent) {
6262 + if (queuedEvent.blockedOn !== null) {
6263 + return false;
6264 + }
6265 +
6266 + var targetContainers = queuedEvent.targetContainers;
6267 +
6268 + while (targetContainers.length > 0) {
6269 + var targetContainer = targetContainers[0];
6270 + var nextBlockedOn = findInstanceBlockingEvent(queuedEvent.domEventName, queuedEvent.eventSystemFlags, targetContainer, queuedEvent.nativeEvent);
6271 +
6272 + if (nextBlockedOn === null) {
6273 + {
6274 + var nativeEvent = queuedEvent.nativeEvent;
6275 + var nativeEventClone = new nativeEvent.constructor(nativeEvent.type, nativeEvent);
6276 + setReplayingEvent(nativeEventClone);
6277 + nativeEvent.target.dispatchEvent(nativeEventClone);
6278 + resetReplayingEvent();
6279 + }
6280 + } else {
6281 + // We're still blocked. Try again later.
6282 + var _fiber3 = getInstanceFromNode(nextBlockedOn);
6283 +
6284 + if (_fiber3 !== null) {
6285 + attemptContinuousHydration(_fiber3);
6286 + }
6287 +
6288 + queuedEvent.blockedOn = nextBlockedOn;
6289 + return false;
6290 + } // This target container was successfully dispatched. Try the next.
6291 +
6292 +
6293 + targetContainers.shift();
6294 + }
6295 +
6296 + return true;
6297 + }
6298 +
6299 + function attemptReplayContinuousQueuedEventInMap(queuedEvent, key, map) {
6300 + if (attemptReplayContinuousQueuedEvent(queuedEvent)) {
6301 + map.delete(key);
6302 + }
6303 + }
6304 +
6305 + function replayUnblockedEvents() {
6306 + hasScheduledReplayAttempt = false;
6307 +
6308 +
6309 + if (queuedFocus !== null && attemptReplayContinuousQueuedEvent(queuedFocus)) {
6310 + queuedFocus = null;
6311 + }
6312 +
6313 + if (queuedDrag !== null && attemptReplayContinuousQueuedEvent(queuedDrag)) {
6314 + queuedDrag = null;
6315 + }
6316 +
6317 + if (queuedMouse !== null && attemptReplayContinuousQueuedEvent(queuedMouse)) {
6318 + queuedMouse = null;
6319 + }
6320 +
6321 + queuedPointers.forEach(attemptReplayContinuousQueuedEventInMap);
6322 + queuedPointerCaptures.forEach(attemptReplayContinuousQueuedEventInMap);
6323 + }
6324 +
6325 + function scheduleCallbackIfUnblocked(queuedEvent, unblocked) {
6326 + if (queuedEvent.blockedOn === unblocked) {
6327 + queuedEvent.blockedOn = null;
6328 +
6329 + if (!hasScheduledReplayAttempt) {
6330 + hasScheduledReplayAttempt = true; // Schedule a callback to attempt replaying as many events as are
6331 + // now unblocked. This first might not actually be unblocked yet.
6332 + // We could check it early to avoid scheduling an unnecessary callback.
6333 +
6334 + unstable_scheduleCallback(unstable_NormalPriority, replayUnblockedEvents);
6335 + }
6336 + }
6337 + }
6338 +
6339 + function retryIfBlockedOn(unblocked) {
6340 + // Mark anything that was blocked on this as no longer blocked
6341 + // and eligible for a replay.
6342 + if (queuedDiscreteEvents.length > 0) {
6343 + scheduleCallbackIfUnblocked(queuedDiscreteEvents[0], unblocked); // This is a exponential search for each boundary that commits. I think it's
6344 + // worth it because we expect very few discrete events to queue up and once
6345 + // we are actually fully unblocked it will be fast to replay them.
6346 +
6347 + for (var i = 1; i < queuedDiscreteEvents.length; i++) {
6348 + var queuedEvent = queuedDiscreteEvents[i];
6349 +
6350 + if (queuedEvent.blockedOn === unblocked) {
6351 + queuedEvent.blockedOn = null;
6352 + }
6353 + }
6354 + }
6355 +
6356 + if (queuedFocus !== null) {
6357 + scheduleCallbackIfUnblocked(queuedFocus, unblocked);
6358 + }
6359 +
6360 + if (queuedDrag !== null) {
6361 + scheduleCallbackIfUnblocked(queuedDrag, unblocked);
6362 + }
6363 +
6364 + if (queuedMouse !== null) {
6365 + scheduleCallbackIfUnblocked(queuedMouse, unblocked);
6366 + }
6367 +
6368 + var unblock = function (queuedEvent) {
6369 + return scheduleCallbackIfUnblocked(queuedEvent, unblocked);
6370 + };
6371 +
6372 + queuedPointers.forEach(unblock);
6373 + queuedPointerCaptures.forEach(unblock);
6374 +
6375 + for (var _i = 0; _i < queuedExplicitHydrationTargets.length; _i++) {
6376 + var queuedTarget = queuedExplicitHydrationTargets[_i];
6377 +
6378 + if (queuedTarget.blockedOn === unblocked) {
6379 + queuedTarget.blockedOn = null;
6380 + }
6381 + }
6382 +
6383 + while (queuedExplicitHydrationTargets.length > 0) {
6384 + var nextExplicitTarget = queuedExplicitHydrationTargets[0];
6385 +
6386 + if (nextExplicitTarget.blockedOn !== null) {
6387 + // We're still blocked.
6388 + break;
6389 + } else {
6390 + attemptExplicitHydrationTarget(nextExplicitTarget);
6391 +
6392 + if (nextExplicitTarget.blockedOn === null) {
6393 + // We're unblocked.
6394 + queuedExplicitHydrationTargets.shift();
6395 + }
6396 + }
6397 + }
6398 + }
6399 +
6400 + var ReactCurrentBatchConfig = ReactSharedInternals.ReactCurrentBatchConfig; // TODO: can we stop exporting these?
6401 +
6402 + var _enabled = true; // This is exported in FB builds for use by legacy FB layer infra.
6403 + // We'd like to remove this but it's not clear if this is safe.
6404 +
6405 + function setEnabled(enabled) {
6406 + _enabled = !!enabled;
6407 + }
6408 + function isEnabled() {
6409 + return _enabled;
6410 + }
6411 + function createEventListenerWrapperWithPriority(targetContainer, domEventName, eventSystemFlags) {
6412 + var eventPriority = getEventPriority(domEventName);
6413 + var listenerWrapper;
6414 +
6415 + switch (eventPriority) {
6416 + case DiscreteEventPriority:
6417 + listenerWrapper = dispatchDiscreteEvent;
6418 + break;
6419 +
6420 + case ContinuousEventPriority:
6421 + listenerWrapper = dispatchContinuousEvent;
6422 + break;
6423 +
6424 + case DefaultEventPriority:
6425 + default:
6426 + listenerWrapper = dispatchEvent;
6427 + break;
6428 + }
6429 +
6430 + return listenerWrapper.bind(null, domEventName, eventSystemFlags, targetContainer);
6431 + }
6432 +
6433 + function dispatchDiscreteEvent(domEventName, eventSystemFlags, container, nativeEvent) {
6434 + var previousPriority = getCurrentUpdatePriority();
6435 + var prevTransition = ReactCurrentBatchConfig.transition;
6436 + ReactCurrentBatchConfig.transition = null;
6437 +
6438 + try {
6439 + setCurrentUpdatePriority(DiscreteEventPriority);
6440 + dispatchEvent(domEventName, eventSystemFlags, container, nativeEvent);
6441 + } finally {
6442 + setCurrentUpdatePriority(previousPriority);
6443 + ReactCurrentBatchConfig.transition = prevTransition;
6444 + }
6445 + }
6446 +
6447 + function dispatchContinuousEvent(domEventName, eventSystemFlags, container, nativeEvent) {
6448 + var previousPriority = getCurrentUpdatePriority();
6449 + var prevTransition = ReactCurrentBatchConfig.transition;
6450 + ReactCurrentBatchConfig.transition = null;
6451 +
6452 + try {
6453 + setCurrentUpdatePriority(ContinuousEventPriority);
6454 + dispatchEvent(domEventName, eventSystemFlags, container, nativeEvent);
6455 + } finally {
6456 + setCurrentUpdatePriority(previousPriority);
6457 + ReactCurrentBatchConfig.transition = prevTransition;
6458 + }
6459 + }
6460 +
6461 + function dispatchEvent(domEventName, eventSystemFlags, targetContainer, nativeEvent) {
6462 + if (!_enabled) {
6463 + return;
6464 + }
6465 +
6466 + {
6467 + dispatchEventWithEnableCapturePhaseSelectiveHydrationWithoutDiscreteEventReplay(domEventName, eventSystemFlags, targetContainer, nativeEvent);
6468 + }
6469 + }
6470 +
6471 + function dispatchEventWithEnableCapturePhaseSelectiveHydrationWithoutDiscreteEventReplay(domEventName, eventSystemFlags, targetContainer, nativeEvent) {
6472 + var blockedOn = findInstanceBlockingEvent(domEventName, eventSystemFlags, targetContainer, nativeEvent);
6473 +
6474 + if (blockedOn === null) {
6475 + dispatchEventForPluginEventSystem(domEventName, eventSystemFlags, nativeEvent, return_targetInst, targetContainer);
6476 + clearIfContinuousEvent(domEventName, nativeEvent);
6477 + return;
6478 + }
6479 +
6480 + if (queueIfContinuousEvent(blockedOn, domEventName, eventSystemFlags, targetContainer, nativeEvent)) {
6481 + nativeEvent.stopPropagation();
6482 + return;
6483 + } // We need to clear only if we didn't queue because
6484 + // queueing is accumulative.
6485 +
6486 +
6487 + clearIfContinuousEvent(domEventName, nativeEvent);
6488 +
6489 + if (eventSystemFlags & IS_CAPTURE_PHASE && isDiscreteEventThatRequiresHydration(domEventName)) {
6490 + while (blockedOn !== null) {
6491 + var fiber = getInstanceFromNode(blockedOn);
6492 +
6493 + if (fiber !== null) {
6494 + attemptSynchronousHydration(fiber);
6495 + }
6496 +
6497 + var nextBlockedOn = findInstanceBlockingEvent(domEventName, eventSystemFlags, targetContainer, nativeEvent);
6498 +
6499 + if (nextBlockedOn === null) {
6500 + dispatchEventForPluginEventSystem(domEventName, eventSystemFlags, nativeEvent, return_targetInst, targetContainer);
6501 + }
6502 +
6503 + if (nextBlockedOn === blockedOn) {
6504 + break;
6505 + }
6506 +
6507 + blockedOn = nextBlockedOn;
6508 + }
6509 +
6510 + if (blockedOn !== null) {
6511 + nativeEvent.stopPropagation();
6512 + }
6513 +
6514 + return;
6515 + } // This is not replayable so we'll invoke it but without a target,
6516 + // in case the event system needs to trace it.
6517 +
6518 +
6519 + dispatchEventForPluginEventSystem(domEventName, eventSystemFlags, nativeEvent, null, targetContainer);
6520 + }
6521 +
6522 + var return_targetInst = null; // Returns a SuspenseInstance or Container if it's blocked.
6523 + // The return_targetInst field above is conceptually part of the return value.
6524 +
6525 + function findInstanceBlockingEvent(domEventName, eventSystemFlags, targetContainer, nativeEvent) {
6526 + // TODO: Warn if _enabled is false.
6527 + return_targetInst = null;
6528 + var nativeEventTarget = getEventTarget(nativeEvent);
6529 + var targetInst = getClosestInstanceFromNode(nativeEventTarget);
6530 +
6531 + if (targetInst !== null) {
6532 + var nearestMounted = getNearestMountedFiber(targetInst);
6533 +
6534 + if (nearestMounted === null) {
6535 + // This tree has been unmounted already. Dispatch without a target.
6536 + targetInst = null;
6537 + } else {
6538 + var tag = nearestMounted.tag;
6539 +
6540 + if (tag === SuspenseComponent) {
6541 + var instance = getSuspenseInstanceFromFiber(nearestMounted);
6542 +
6543 + if (instance !== null) {
6544 + // Queue the event to be replayed later. Abort dispatching since we
6545 + // don't want this event dispatched twice through the event system.
6546 + // TODO: If this is the first discrete event in the queue. Schedule an increased
6547 + // priority for this boundary.
6548 + return instance;
6549 + } // This shouldn't happen, something went wrong but to avoid blocking
6550 + // the whole system, dispatch the event without a target.
6551 + // TODO: Warn.
6552 +
6553 +
6554 + targetInst = null;
6555 + } else if (tag === HostRoot) {
6556 + var root = nearestMounted.stateNode;
6557 +
6558 + if (isRootDehydrated(root)) {
6559 + // If this happens during a replay something went wrong and it might block
6560 + // the whole system.
6561 + return getContainerFromFiber(nearestMounted);
6562 + }
6563 +
6564 + targetInst = null;
6565 + } else if (nearestMounted !== targetInst) {
6566 + // If we get an event (ex: img onload) before committing that
6567 + // component's mount, ignore it for now (that is, treat it as if it was an
6568 + // event on a non-React tree). We might also consider queueing events and
6569 + // dispatching them after the mount.
6570 + targetInst = null;
6571 + }
6572 + }
6573 + }
6574 +
6575 + return_targetInst = targetInst; // We're not blocked on anything.
6576 +
6577 + return null;
6578 + }
6579 + function getEventPriority(domEventName) {
6580 + switch (domEventName) {
6581 + // Used by SimpleEventPlugin:
6582 + case 'cancel':
6583 + case 'click':
6584 + case 'close':
6585 + case 'contextmenu':
6586 + case 'copy':
6587 + case 'cut':
6588 + case 'auxclick':
6589 + case 'dblclick':
6590 + case 'dragend':
6591 + case 'dragstart':
6592 + case 'drop':
6593 + case 'focusin':
6594 + case 'focusout':
6595 + case 'input':
6596 + case 'invalid':
6597 + case 'keydown':
6598 + case 'keypress':
6599 + case 'keyup':
6600 + case 'mousedown':
6601 + case 'mouseup':
6602 + case 'paste':
6603 + case 'pause':
6604 + case 'play':
6605 + case 'pointercancel':
6606 + case 'pointerdown':
6607 + case 'pointerup':
6608 + case 'ratechange':
6609 + case 'reset':
6610 + case 'resize':
6611 + case 'seeked':
6612 + case 'submit':
6613 + case 'touchcancel':
6614 + case 'touchend':
6615 + case 'touchstart':
6616 + case 'volumechange': // Used by polyfills:
6617 + // eslint-disable-next-line no-fallthrough
6618 +
6619 + case 'change':
6620 + case 'selectionchange':
6621 + case 'textInput':
6622 + case 'compositionstart':
6623 + case 'compositionend':
6624 + case 'compositionupdate': // Only enableCreateEventHandleAPI:
6625 + // eslint-disable-next-line no-fallthrough
6626 +
6627 + case 'beforeblur':
6628 + case 'afterblur': // Not used by React but could be by user code:
6629 + // eslint-disable-next-line no-fallthrough
6630 +
6631 + case 'beforeinput':
6632 + case 'blur':
6633 + case 'fullscreenchange':
6634 + case 'focus':
6635 + case 'hashchange':
6636 + case 'popstate':
6637 + case 'select':
6638 + case 'selectstart':
6639 + return DiscreteEventPriority;
6640 +
6641 + case 'drag':
6642 + case 'dragenter':
6643 + case 'dragexit':
6644 + case 'dragleave':
6645 + case 'dragover':
6646 + case 'mousemove':
6647 + case 'mouseout':
6648 + case 'mouseover':
6649 + case 'pointermove':
6650 + case 'pointerout':
6651 + case 'pointerover':
6652 + case 'scroll':
6653 + case 'toggle':
6654 + case 'touchmove':
6655 + case 'wheel': // Not used by React but could be by user code:
6656 + // eslint-disable-next-line no-fallthrough
6657 +
6658 + case 'mouseenter':
6659 + case 'mouseleave':
6660 + case 'pointerenter':
6661 + case 'pointerleave':
6662 + return ContinuousEventPriority;
6663 +
6664 + case 'message':
6665 + {
6666 + // We might be in the Scheduler callback.
6667 + // Eventually this mechanism will be replaced by a check
6668 + // of the current priority on the native scheduler.
6669 + var schedulerPriority = getCurrentPriorityLevel();
6670 +
6671 + switch (schedulerPriority) {
6672 + case ImmediatePriority:
6673 + return DiscreteEventPriority;
6674 +
6675 + case UserBlockingPriority:
6676 + return ContinuousEventPriority;
6677 +
6678 + case NormalPriority:
6679 + case LowPriority:
6680 + // TODO: Handle LowSchedulerPriority, somehow. Maybe the same lane as hydration.
6681 + return DefaultEventPriority;
6682 +
6683 + case IdlePriority:
6684 + return IdleEventPriority;
6685 +
6686 + default:
6687 + return DefaultEventPriority;
6688 + }
6689 + }
6690 +
6691 + default:
6692 + return DefaultEventPriority;
6693 + }
6694 + }
6695 +
6696 + function addEventBubbleListener(target, eventType, listener) {
6697 + target.addEventListener(eventType, listener, false);
6698 + return listener;
6699 + }
6700 + function addEventCaptureListener(target, eventType, listener) {
6701 + target.addEventListener(eventType, listener, true);
6702 + return listener;
6703 + }
6704 + function addEventCaptureListenerWithPassiveFlag(target, eventType, listener, passive) {
6705 + target.addEventListener(eventType, listener, {
6706 + capture: true,
6707 + passive: passive
6708 + });
6709 + return listener;
6710 + }
6711 + function addEventBubbleListenerWithPassiveFlag(target, eventType, listener, passive) {
6712 + target.addEventListener(eventType, listener, {
6713 + passive: passive
6714 + });
6715 + return listener;
6716 + }
6717 +
6718 + /**
6719 + * These variables store information about text content of a target node,
6720 + * allowing comparison of content before and after a given event.
6721 + *
6722 + * Identify the node where selection currently begins, then observe
6723 + * both its text content and its current position in the DOM. Since the
6724 + * browser may natively replace the target node during composition, we can
6725 + * use its position to find its replacement.
6726 + *
6727 + *
6728 + */
6729 + var root = null;
6730 + var startText = null;
6731 + var fallbackText = null;
6732 + function initialize(nativeEventTarget) {
6733 + root = nativeEventTarget;
6734 + startText = getText();
6735 + return true;
6736 + }
6737 + function reset() {
6738 + root = null;
6739 + startText = null;
6740 + fallbackText = null;
6741 + }
6742 + function getData() {
6743 + if (fallbackText) {
6744 + return fallbackText;
6745 + }
6746 +
6747 + var start;
6748 + var startValue = startText;
6749 + var startLength = startValue.length;
6750 + var end;
6751 + var endValue = getText();
6752 + var endLength = endValue.length;
6753 +
6754 + for (start = 0; start < startLength; start++) {
6755 + if (startValue[start] !== endValue[start]) {
6756 + break;
6757 + }
6758 + }
6759 +
6760 + var minEnd = startLength - start;
6761 +
6762 + for (end = 1; end <= minEnd; end++) {
6763 + if (startValue[startLength - end] !== endValue[endLength - end]) {
6764 + break;
6765 + }
6766 + }
6767 +
6768 + var sliceTail = end > 1 ? 1 - end : undefined;
6769 + fallbackText = endValue.slice(start, sliceTail);
6770 + return fallbackText;
6771 + }
6772 + function getText() {
6773 + if ('value' in root) {
6774 + return root.value;
6775 + }
6776 +
6777 + return root.textContent;
6778 + }
6779 +
6780 + /**
6781 + * `charCode` represents the actual "character code" and is safe to use with
6782 + * `String.fromCharCode`. As such, only keys that correspond to printable
6783 + * characters produce a valid `charCode`, the only exception to this is Enter.
6784 + * The Tab-key is considered non-printable and does not have a `charCode`,
6785 + * presumably because it does not produce a tab-character in browsers.
6786 + *
6787 + * @param {object} nativeEvent Native browser event.
6788 + * @return {number} Normalized `charCode` property.
6789 + */
6790 + function getEventCharCode(nativeEvent) {
6791 + var charCode;
6792 + var keyCode = nativeEvent.keyCode;
6793 +
6794 + if ('charCode' in nativeEvent) {
6795 + charCode = nativeEvent.charCode; // FF does not set `charCode` for the Enter-key, check against `keyCode`.
6796 +
6797 + if (charCode === 0 && keyCode === 13) {
6798 + charCode = 13;
6799 + }
6800 + } else {
6801 + // IE8 does not implement `charCode`, but `keyCode` has the correct value.
6802 + charCode = keyCode;
6803 + } // IE and Edge (on Windows) and Chrome / Safari (on Windows and Linux)
6804 + // report Enter as charCode 10 when ctrl is pressed.
6805 +
6806 +
6807 + if (charCode === 10) {
6808 + charCode = 13;
6809 + } // Some non-printable keys are reported in `charCode`/`keyCode`, discard them.
6810 + // Must not discard the (non-)printable Enter-key.
6811 +
6812 +
6813 + if (charCode >= 32 || charCode === 13) {
6814 + return charCode;
6815 + }
6816 +
6817 + return 0;
6818 + }
6819 +
6820 + function functionThatReturnsTrue() {
6821 + return true;
6822 + }
6823 +
6824 + function functionThatReturnsFalse() {
6825 + return false;
6826 + } // This is intentionally a factory so that we have different returned constructors.
6827 + // If we had a single constructor, it would be megamorphic and engines would deopt.
6828 +
6829 +
6830 + function createSyntheticEvent(Interface) {
6831 + /**
6832 + * Synthetic events are dispatched by event plugins, typically in response to a
6833 + * top-level event delegation handler.
6834 + *
6835 + * These systems should generally use pooling to reduce the frequency of garbage
6836 + * collection. The system should check `isPersistent` to determine whether the
6837 + * event should be released into the pool after being dispatched. Users that
6838 + * need a persisted event should invoke `persist`.
6839 + *
6840 + * Synthetic events (and subclasses) implement the DOM Level 3 Events API by
6841 + * normalizing browser quirks. Subclasses do not necessarily have to implement a
6842 + * DOM interface; custom application-specific events can also subclass this.
6843 + */
6844 + function SyntheticBaseEvent(reactName, reactEventType, targetInst, nativeEvent, nativeEventTarget) {
6845 + this._reactName = reactName;
6846 + this._targetInst = targetInst;
6847 + this.type = reactEventType;
6848 + this.nativeEvent = nativeEvent;
6849 + this.target = nativeEventTarget;
6850 + this.currentTarget = null;
6851 +
6852 + for (var _propName in Interface) {
6853 + if (!Interface.hasOwnProperty(_propName)) {
6854 + continue;
6855 + }
6856 +
6857 + var normalize = Interface[_propName];
6858 +
6859 + if (normalize) {
6860 + this[_propName] = normalize(nativeEvent);
6861 + } else {
6862 + this[_propName] = nativeEvent[_propName];
6863 + }
6864 + }
6865 +
6866 + var defaultPrevented = nativeEvent.defaultPrevented != null ? nativeEvent.defaultPrevented : nativeEvent.returnValue === false;
6867 +
6868 + if (defaultPrevented) {
6869 + this.isDefaultPrevented = functionThatReturnsTrue;
6870 + } else {
6871 + this.isDefaultPrevented = functionThatReturnsFalse;
6872 + }
6873 +
6874 + this.isPropagationStopped = functionThatReturnsFalse;
6875 + return this;
6876 + }
6877 +
6878 + assign(SyntheticBaseEvent.prototype, {
6879 + preventDefault: function () {
6880 + this.defaultPrevented = true;
6881 + var event = this.nativeEvent;
6882 +
6883 + if (!event) {
6884 + return;
6885 + }
6886 +
6887 + if (event.preventDefault) {
6888 + event.preventDefault(); // $FlowFixMe - flow is not aware of `unknown` in IE
6889 + } else if (typeof event.returnValue !== 'unknown') {
6890 + event.returnValue = false;
6891 + }
6892 +
6893 + this.isDefaultPrevented = functionThatReturnsTrue;
6894 + },
6895 + stopPropagation: function () {
6896 + var event = this.nativeEvent;
6897 +
6898 + if (!event) {
6899 + return;
6900 + }
6901 +
6902 + if (event.stopPropagation) {
6903 + event.stopPropagation(); // $FlowFixMe - flow is not aware of `unknown` in IE
6904 + } else if (typeof event.cancelBubble !== 'unknown') {
6905 + // The ChangeEventPlugin registers a "propertychange" event for
6906 + // IE. This event does not support bubbling or cancelling, and
6907 + // any references to cancelBubble throw "Member not found". A
6908 + // typeof check of "unknown" circumvents this issue (and is also
6909 + // IE specific).
6910 + event.cancelBubble = true;
6911 + }
6912 +
6913 + this.isPropagationStopped = functionThatReturnsTrue;
6914 + },
6915 +
6916 + /**
6917 + * We release all dispatched `SyntheticEvent`s after each event loop, adding
6918 + * them back into the pool. This allows a way to hold onto a reference that
6919 + * won't be added back into the pool.
6920 + */
6921 + persist: function () {// Modern event system doesn't use pooling.
6922 + },
6923 +
6924 + /**
6925 + * Checks if this event should be released back into the pool.
6926 + *
6927 + * @return {boolean} True if this should not be released, false otherwise.
6928 + */
6929 + isPersistent: functionThatReturnsTrue
6930 + });
6931 + return SyntheticBaseEvent;
6932 + }
6933 + /**
6934 + * @interface Event
6935 + * @see http://www.w3.org/TR/DOM-Level-3-Events/
6936 + */
6937 +
6938 +
6939 + var EventInterface = {
6940 + eventPhase: 0,
6941 + bubbles: 0,
6942 + cancelable: 0,
6943 + timeStamp: function (event) {
6944 + return event.timeStamp || Date.now();
6945 + },
6946 + defaultPrevented: 0,
6947 + isTrusted: 0
6948 + };
6949 + var SyntheticEvent = createSyntheticEvent(EventInterface);
6950 +
6951 + var UIEventInterface = assign({}, EventInterface, {
6952 + view: 0,
6953 + detail: 0
6954 + });
6955 +
6956 + var SyntheticUIEvent = createSyntheticEvent(UIEventInterface);
6957 + var lastMovementX;
6958 + var lastMovementY;
6959 + var lastMouseEvent;
6960 +
6961 + function updateMouseMovementPolyfillState(event) {
6962 + if (event !== lastMouseEvent) {
6963 + if (lastMouseEvent && event.type === 'mousemove') {
6964 + lastMovementX = event.screenX - lastMouseEvent.screenX;
6965 + lastMovementY = event.screenY - lastMouseEvent.screenY;
6966 + } else {
6967 + lastMovementX = 0;
6968 + lastMovementY = 0;
6969 + }
6970 +
6971 + lastMouseEvent = event;
6972 + }
6973 + }
6974 + /**
6975 + * @interface MouseEvent
6976 + * @see http://www.w3.org/TR/DOM-Level-3-Events/
6977 + */
6978 +
6979 +
6980 + var MouseEventInterface = assign({}, UIEventInterface, {
6981 + screenX: 0,
6982 + screenY: 0,
6983 + clientX: 0,
6984 + clientY: 0,
6985 + pageX: 0,
6986 + pageY: 0,
6987 + ctrlKey: 0,
6988 + shiftKey: 0,
6989 + altKey: 0,
6990 + metaKey: 0,
6991 + getModifierState: getEventModifierState,
6992 + button: 0,
6993 + buttons: 0,
6994 + relatedTarget: function (event) {
6995 + if (event.relatedTarget === undefined) return event.fromElement === event.srcElement ? event.toElement : event.fromElement;
6996 + return event.relatedTarget;
6997 + },
6998 + movementX: function (event) {
6999 + if ('movementX' in event) {
7000 + return event.movementX;
7001 + }
7002 +
7003 + updateMouseMovementPolyfillState(event);
7004 + return lastMovementX;
7005 + },
7006 + movementY: function (event) {
7007 + if ('movementY' in event) {
7008 + return event.movementY;
7009 + } // Don't need to call updateMouseMovementPolyfillState() here
7010 + // because it's guaranteed to have already run when movementX
7011 + // was copied.
7012 +
7013 +
7014 + return lastMovementY;
7015 + }
7016 + });
7017 +
7018 + var SyntheticMouseEvent = createSyntheticEvent(MouseEventInterface);
7019 + /**
7020 + * @interface DragEvent
7021 + * @see http://www.w3.org/TR/DOM-Level-3-Events/
7022 + */
7023 +
7024 + var DragEventInterface = assign({}, MouseEventInterface, {
7025 + dataTransfer: 0
7026 + });
7027 +
7028 + var SyntheticDragEvent = createSyntheticEvent(DragEventInterface);
7029 + /**
7030 + * @interface FocusEvent
7031 + * @see http://www.w3.org/TR/DOM-Level-3-Events/
7032 + */
7033 +
7034 + var FocusEventInterface = assign({}, UIEventInterface, {
7035 + relatedTarget: 0
7036 + });
7037 +
7038 + var SyntheticFocusEvent = createSyntheticEvent(FocusEventInterface);
7039 + /**
7040 + * @interface Event
7041 + * @see http://www.w3.org/TR/css3-animations/#AnimationEvent-interface
7042 + * @see https://developer.mozilla.org/en-US/docs/Web/API/AnimationEvent
7043 + */
7044 +
7045 + var AnimationEventInterface = assign({}, EventInterface, {
7046 + animationName: 0,
7047 + elapsedTime: 0,
7048 + pseudoElement: 0
7049 + });
7050 +
7051 + var SyntheticAnimationEvent = createSyntheticEvent(AnimationEventInterface);
7052 + /**
7053 + * @interface Event
7054 + * @see http://www.w3.org/TR/clipboard-apis/
7055 + */
7056 +
7057 + var ClipboardEventInterface = assign({}, EventInterface, {
7058 + clipboardData: function (event) {
7059 + return 'clipboardData' in event ? event.clipboardData : window.clipboardData;
7060 + }
7061 + });
7062 +
7063 + var SyntheticClipboardEvent = createSyntheticEvent(ClipboardEventInterface);
7064 + /**
7065 + * @interface Event
7066 + * @see http://www.w3.org/TR/DOM-Level-3-Events/#events-compositionevents
7067 + */
7068 +
7069 + var CompositionEventInterface = assign({}, EventInterface, {
7070 + data: 0
7071 + });
7072 +
7073 + var SyntheticCompositionEvent = createSyntheticEvent(CompositionEventInterface);
7074 + /**
7075 + * @interface Event
7076 + * @see http://www.w3.org/TR/2013/WD-DOM-Level-3-Events-20131105
7077 + * /#events-inputevents
7078 + */
7079 + // Happens to share the same list for now.
7080 +
7081 + var SyntheticInputEvent = SyntheticCompositionEvent;
7082 + /**
7083 + * Normalization of deprecated HTML5 `key` values
7084 + * @see https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent#Key_names
7085 + */
7086 +
7087 + var normalizeKey = {
7088 + Esc: 'Escape',
7089 + Spacebar: ' ',
7090 + Left: 'ArrowLeft',
7091 + Up: 'ArrowUp',
7092 + Right: 'ArrowRight',
7093 + Down: 'ArrowDown',
7094 + Del: 'Delete',
7095 + Win: 'OS',
7096 + Menu: 'ContextMenu',
7097 + Apps: 'ContextMenu',
7098 + Scroll: 'ScrollLock',
7099 + MozPrintableKey: 'Unidentified'
7100 + };
7101 + /**
7102 + * Translation from legacy `keyCode` to HTML5 `key`
7103 + * Only special keys supported, all others depend on keyboard layout or browser
7104 + * @see https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent#Key_names
7105 + */
7106 +
7107 + var translateToKey = {
7108 + '8': 'Backspace',
7109 + '9': 'Tab',
7110 + '12': 'Clear',
7111 + '13': 'Enter',
7112 + '16': 'Shift',
7113 + '17': 'Control',
7114 + '18': 'Alt',
7115 + '19': 'Pause',
7116 + '20': 'CapsLock',
7117 + '27': 'Escape',
7118 + '32': ' ',
7119 + '33': 'PageUp',
7120 + '34': 'PageDown',
7121 + '35': 'End',
7122 + '36': 'Home',
7123 + '37': 'ArrowLeft',
7124 + '38': 'ArrowUp',
7125 + '39': 'ArrowRight',
7126 + '40': 'ArrowDown',
7127 + '45': 'Insert',
7128 + '46': 'Delete',
7129 + '112': 'F1',
7130 + '113': 'F2',
7131 + '114': 'F3',
7132 + '115': 'F4',
7133 + '116': 'F5',
7134 + '117': 'F6',
7135 + '118': 'F7',
7136 + '119': 'F8',
7137 + '120': 'F9',
7138 + '121': 'F10',
7139 + '122': 'F11',
7140 + '123': 'F12',
7141 + '144': 'NumLock',
7142 + '145': 'ScrollLock',
7143 + '224': 'Meta'
7144 + };
7145 + /**
7146 + * @param {object} nativeEvent Native browser event.
7147 + * @return {string} Normalized `key` property.
7148 + */
7149 +
7150 + function getEventKey(nativeEvent) {
7151 + if (nativeEvent.key) {
7152 + // Normalize inconsistent values reported by browsers due to
7153 + // implementations of a working draft specification.
7154 + // FireFox implements `key` but returns `MozPrintableKey` for all
7155 + // printable characters (normalized to `Unidentified`), ignore it.
7156 + var key = normalizeKey[nativeEvent.key] || nativeEvent.key;
7157 +
7158 + if (key !== 'Unidentified') {
7159 + return key;
7160 + }
7161 + } // Browser does not implement `key`, polyfill as much of it as we can.
7162 +
7163 +
7164 + if (nativeEvent.type === 'keypress') {
7165 + var charCode = getEventCharCode(nativeEvent); // The enter-key is technically both printable and non-printable and can
7166 + // thus be captured by `keypress`, no other non-printable key should.
7167 +
7168 + return charCode === 13 ? 'Enter' : String.fromCharCode(charCode);
7169 + }
7170 +
7171 + if (nativeEvent.type === 'keydown' || nativeEvent.type === 'keyup') {
7172 + // While user keyboard layout determines the actual meaning of each
7173 + // `keyCode` value, almost all function keys have a universal value.
7174 + return translateToKey[nativeEvent.keyCode] || 'Unidentified';
7175 + }
7176 +
7177 + return '';
7178 + }
7179 + /**
7180 + * Translation from modifier key to the associated property in the event.
7181 + * @see http://www.w3.org/TR/DOM-Level-3-Events/#keys-Modifiers
7182 + */
7183 +
7184 +
7185 + var modifierKeyToProp = {
7186 + Alt: 'altKey',
7187 + Control: 'ctrlKey',
7188 + Meta: 'metaKey',
7189 + Shift: 'shiftKey'
7190 + }; // Older browsers (Safari <= 10, iOS Safari <= 10.2) do not support
7191 + // getModifierState. If getModifierState is not supported, we map it to a set of
7192 + // modifier keys exposed by the event. In this case, Lock-keys are not supported.
7193 +
7194 + function modifierStateGetter(keyArg) {
7195 + var syntheticEvent = this;
7196 + var nativeEvent = syntheticEvent.nativeEvent;
7197 +
7198 + if (nativeEvent.getModifierState) {
7199 + return nativeEvent.getModifierState(keyArg);
7200 + }
7201 +
7202 + var keyProp = modifierKeyToProp[keyArg];
7203 + return keyProp ? !!nativeEvent[keyProp] : false;
7204 + }
7205 +
7206 + function getEventModifierState(nativeEvent) {
7207 + return modifierStateGetter;
7208 + }
7209 + /**
7210 + * @interface KeyboardEvent
7211 + * @see http://www.w3.org/TR/DOM-Level-3-Events/
7212 + */
7213 +
7214 +
7215 + var KeyboardEventInterface = assign({}, UIEventInterface, {
7216 + key: getEventKey,
7217 + code: 0,
7218 + location: 0,
7219 + ctrlKey: 0,
7220 + shiftKey: 0,
7221 + altKey: 0,
7222 + metaKey: 0,
7223 + repeat: 0,
7224 + locale: 0,
7225 + getModifierState: getEventModifierState,
7226 + // Legacy Interface
7227 + charCode: function (event) {
7228 + // `charCode` is the result of a KeyPress event and represents the value of
7229 + // the actual printable character.
7230 + // KeyPress is deprecated, but its replacement is not yet final and not
7231 + // implemented in any major browser. Only KeyPress has charCode.
7232 + if (event.type === 'keypress') {
7233 + return getEventCharCode(event);
7234 + }
7235 +
7236 + return 0;
7237 + },
7238 + keyCode: function (event) {
7239 + // `keyCode` is the result of a KeyDown/Up event and represents the value of
7240 + // physical keyboard key.
7241 + // The actual meaning of the value depends on the users' keyboard layout
7242 + // which cannot be detected. Assuming that it is a US keyboard layout
7243 + // provides a surprisingly accurate mapping for US and European users.
7244 + // Due to this, it is left to the user to implement at this time.
7245 + if (event.type === 'keydown' || event.type === 'keyup') {
7246 + return event.keyCode;
7247 + }
7248 +
7249 + return 0;
7250 + },
7251 + which: function (event) {
7252 + // `which` is an alias for either `keyCode` or `charCode` depending on the
7253 + // type of the event.
7254 + if (event.type === 'keypress') {
7255 + return getEventCharCode(event);
7256 + }
7257 +
7258 + if (event.type === 'keydown' || event.type === 'keyup') {
7259 + return event.keyCode;
7260 + }
7261 +
7262 + return 0;
7263 + }
7264 + });
7265 +
7266 + var SyntheticKeyboardEvent = createSyntheticEvent(KeyboardEventInterface);
7267 + /**
7268 + * @interface PointerEvent
7269 + * @see http://www.w3.org/TR/pointerevents/
7270 + */
7271 +
7272 + var PointerEventInterface = assign({}, MouseEventInterface, {
7273 + pointerId: 0,
7274 + width: 0,
7275 + height: 0,
7276 + pressure: 0,
7277 + tangentialPressure: 0,
7278 + tiltX: 0,
7279 + tiltY: 0,
7280 + twist: 0,
7281 + pointerType: 0,
7282 + isPrimary: 0
7283 + });
7284 +
7285 + var SyntheticPointerEvent = createSyntheticEvent(PointerEventInterface);
7286 + /**
7287 + * @interface TouchEvent
7288 + * @see http://www.w3.org/TR/touch-events/
7289 + */
7290 +
7291 + var TouchEventInterface = assign({}, UIEventInterface, {
7292 + touches: 0,
7293 + targetTouches: 0,
7294 + changedTouches: 0,
7295 + altKey: 0,
7296 + metaKey: 0,
7297 + ctrlKey: 0,
7298 + shiftKey: 0,
7299 + getModifierState: getEventModifierState
7300 + });
7301 +
7302 + var SyntheticTouchEvent = createSyntheticEvent(TouchEventInterface);
7303 + /**
7304 + * @interface Event
7305 + * @see http://www.w3.org/TR/2009/WD-css3-transitions-20090320/#transition-events-
7306 + * @see https://developer.mozilla.org/en-US/docs/Web/API/TransitionEvent
7307 + */
7308 +
7309 + var TransitionEventInterface = assign({}, EventInterface, {
7310 + propertyName: 0,
7311 + elapsedTime: 0,
7312 + pseudoElement: 0
7313 + });
7314 +
7315 + var SyntheticTransitionEvent = createSyntheticEvent(TransitionEventInterface);
7316 + /**
7317 + * @interface WheelEvent
7318 + * @see http://www.w3.org/TR/DOM-Level-3-Events/
7319 + */
7320 +
7321 + var WheelEventInterface = assign({}, MouseEventInterface, {
7322 + deltaX: function (event) {
7323 + return 'deltaX' in event ? event.deltaX : // Fallback to `wheelDeltaX` for Webkit and normalize (right is positive).
7324 + 'wheelDeltaX' in event ? -event.wheelDeltaX : 0;
7325 + },
7326 + deltaY: function (event) {
7327 + return 'deltaY' in event ? event.deltaY : // Fallback to `wheelDeltaY` for Webkit and normalize (down is positive).
7328 + 'wheelDeltaY' in event ? -event.wheelDeltaY : // Fallback to `wheelDelta` for IE<9 and normalize (down is positive).
7329 + 'wheelDelta' in event ? -event.wheelDelta : 0;
7330 + },
7331 + deltaZ: 0,
7332 + // Browsers without "deltaMode" is reporting in raw wheel delta where one
7333 + // notch on the scroll is always +/- 120, roughly equivalent to pixels.
7334 + // A good approximation of DOM_DELTA_LINE (1) is 5% of viewport size or
7335 + // ~40 pixels, for DOM_DELTA_SCREEN (2) it is 87.5% of viewport size.
7336 + deltaMode: 0
7337 + });
7338 +
7339 + var SyntheticWheelEvent = createSyntheticEvent(WheelEventInterface);
7340 +
7341 + var END_KEYCODES = [9, 13, 27, 32]; // Tab, Return, Esc, Space
7342 +
7343 + var START_KEYCODE = 229;
7344 + var canUseCompositionEvent = canUseDOM && 'CompositionEvent' in window;
7345 + var documentMode = null;
7346 +
7347 + if (canUseDOM && 'documentMode' in document) {
7348 + documentMode = document.documentMode;
7349 + } // Webkit offers a very useful `textInput` event that can be used to
7350 + // directly represent `beforeInput`. The IE `textinput` event is not as
7351 + // useful, so we don't use it.
7352 +
7353 +
7354 + var canUseTextInputEvent = canUseDOM && 'TextEvent' in window && !documentMode; // In IE9+, we have access to composition events, but the data supplied
7355 + // by the native compositionend event may be incorrect. Japanese ideographic
7356 + // spaces, for instance (\u3000) are not recorded correctly.
7357 +
7358 + var useFallbackCompositionData = canUseDOM && (!canUseCompositionEvent || documentMode && documentMode > 8 && documentMode <= 11);
7359 + var SPACEBAR_CODE = 32;
7360 + var SPACEBAR_CHAR = String.fromCharCode(SPACEBAR_CODE);
7361 +
7362 + function registerEvents() {
7363 + registerTwoPhaseEvent('onBeforeInput', ['compositionend', 'keypress', 'textInput', 'paste']);
7364 + registerTwoPhaseEvent('onCompositionEnd', ['compositionend', 'focusout', 'keydown', 'keypress', 'keyup', 'mousedown']);
7365 + registerTwoPhaseEvent('onCompositionStart', ['compositionstart', 'focusout', 'keydown', 'keypress', 'keyup', 'mousedown']);
7366 + registerTwoPhaseEvent('onCompositionUpdate', ['compositionupdate', 'focusout', 'keydown', 'keypress', 'keyup', 'mousedown']);
7367 + } // Track whether we've ever handled a keypress on the space key.
7368 +
7369 +
7370 + var hasSpaceKeypress = false;
7371 + /**
7372 + * Return whether a native keypress event is assumed to be a command.
7373 + * This is required because Firefox fires `keypress` events for key commands
7374 + * (cut, copy, select-all, etc.) even though no character is inserted.
7375 + */
7376 +
7377 + function isKeypressCommand(nativeEvent) {
7378 + return (nativeEvent.ctrlKey || nativeEvent.altKey || nativeEvent.metaKey) && // ctrlKey && altKey is equivalent to AltGr, and is not a command.
7379 + !(nativeEvent.ctrlKey && nativeEvent.altKey);
7380 + }
7381 + /**
7382 + * Translate native top level events into event types.
7383 + */
7384 +
7385 +
7386 + function getCompositionEventType(domEventName) {
7387 + switch (domEventName) {
7388 + case 'compositionstart':
7389 + return 'onCompositionStart';
7390 +
7391 + case 'compositionend':
7392 + return 'onCompositionEnd';
7393 +
7394 + case 'compositionupdate':
7395 + return 'onCompositionUpdate';
7396 + }
7397 + }
7398 + /**
7399 + * Does our fallback best-guess model think this event signifies that
7400 + * composition has begun?
7401 + */
7402 +
7403 +
7404 + function isFallbackCompositionStart(domEventName, nativeEvent) {
7405 + return domEventName === 'keydown' && nativeEvent.keyCode === START_KEYCODE;
7406 + }
7407 + /**
7408 + * Does our fallback mode think that this event is the end of composition?
7409 + */
7410 +
7411 +
7412 + function isFallbackCompositionEnd(domEventName, nativeEvent) {
7413 + switch (domEventName) {
7414 + case 'keyup':
7415 + // Command keys insert or clear IME input.
7416 + return END_KEYCODES.indexOf(nativeEvent.keyCode) !== -1;
7417 +
7418 + case 'keydown':
7419 + // Expect IME keyCode on each keydown. If we get any other
7420 + // code we must have exited earlier.
7421 + return nativeEvent.keyCode !== START_KEYCODE;
7422 +
7423 + case 'keypress':
7424 + case 'mousedown':
7425 + case 'focusout':
7426 + // Events are not possible without cancelling IME.
7427 + return true;
7428 +
7429 + default:
7430 + return false;
7431 + }
7432 + }
7433 + /**
7434 + * Google Input Tools provides composition data via a CustomEvent,
7435 + * with the `data` property populated in the `detail` object. If this
7436 + * is available on the event object, use it. If not, this is a plain
7437 + * composition event and we have nothing special to extract.
7438 + *
7439 + * @param {object} nativeEvent
7440 + * @return {?string}
7441 + */
7442 +
7443 +
7444 + function getDataFromCustomEvent(nativeEvent) {
7445 + var detail = nativeEvent.detail;
7446 +
7447 + if (typeof detail === 'object' && 'data' in detail) {
7448 + return detail.data;
7449 + }
7450 +
7451 + return null;
7452 + }
7453 + /**
7454 + * Check if a composition event was triggered by Korean IME.
7455 + * Our fallback mode does not work well with IE's Korean IME,
7456 + * so just use native composition events when Korean IME is used.
7457 + * Although CompositionEvent.locale property is deprecated,
7458 + * it is available in IE, where our fallback mode is enabled.
7459 + *
7460 + * @param {object} nativeEvent
7461 + * @return {boolean}
7462 + */
7463 +
7464 +
7465 + function isUsingKoreanIME(nativeEvent) {
7466 + return nativeEvent.locale === 'ko';
7467 + } // Track the current IME composition status, if any.
7468 +
7469 +
7470 + var isComposing = false;
7471 + /**
7472 + * @return {?object} A SyntheticCompositionEvent.
7473 + */
7474 +
7475 + function extractCompositionEvent(dispatchQueue, domEventName, targetInst, nativeEvent, nativeEventTarget) {
7476 + var eventType;
7477 + var fallbackData;
7478 +
7479 + if (canUseCompositionEvent) {
7480 + eventType = getCompositionEventType(domEventName);
7481 + } else if (!isComposing) {
7482 + if (isFallbackCompositionStart(domEventName, nativeEvent)) {
7483 + eventType = 'onCompositionStart';
7484 + }
7485 + } else if (isFallbackCompositionEnd(domEventName, nativeEvent)) {
7486 + eventType = 'onCompositionEnd';
7487 + }
7488 +
7489 + if (!eventType) {
7490 + return null;
7491 + }
7492 +
7493 + if (useFallbackCompositionData && !isUsingKoreanIME(nativeEvent)) {
7494 + // The current composition is stored statically and must not be
7495 + // overwritten while composition continues.
7496 + if (!isComposing && eventType === 'onCompositionStart') {
7497 + isComposing = initialize(nativeEventTarget);
7498 + } else if (eventType === 'onCompositionEnd') {
7499 + if (isComposing) {
7500 + fallbackData = getData();
7501 + }
7502 + }
7503 + }
7504 +
7505 + var listeners = accumulateTwoPhaseListeners(targetInst, eventType);
7506 +
7507 + if (listeners.length > 0) {
7508 + var event = new SyntheticCompositionEvent(eventType, domEventName, null, nativeEvent, nativeEventTarget);
7509 + dispatchQueue.push({
7510 + event: event,
7511 + listeners: listeners
7512 + });
7513 +
7514 + if (fallbackData) {
7515 + // Inject data generated from fallback path into the synthetic event.
7516 + // This matches the property of native CompositionEventInterface.
7517 + event.data = fallbackData;
7518 + } else {
7519 + var customData = getDataFromCustomEvent(nativeEvent);
7520 +
7521 + if (customData !== null) {
7522 + event.data = customData;
7523 + }
7524 + }
7525 + }
7526 + }
7527 +
7528 + function getNativeBeforeInputChars(domEventName, nativeEvent) {
7529 + switch (domEventName) {
7530 + case 'compositionend':
7531 + return getDataFromCustomEvent(nativeEvent);
7532 +
7533 + case 'keypress':
7534 + /**
7535 + * If native `textInput` events are available, our goal is to make
7536 + * use of them. However, there is a special case: the spacebar key.
7537 + * In Webkit, preventing default on a spacebar `textInput` event
7538 + * cancels character insertion, but it *also* causes the browser
7539 + * to fall back to its default spacebar behavior of scrolling the
7540 + * page.
7541 + *
7542 + * Tracking at:
7543 + * https://code.google.com/p/chromium/issues/detail?id=355103
7544 + *
7545 + * To avoid this issue, use the keypress event as if no `textInput`
7546 + * event is available.
7547 + */
7548 + var which = nativeEvent.which;
7549 +
7550 + if (which !== SPACEBAR_CODE) {
7551 + return null;
7552 + }
7553 +
7554 + hasSpaceKeypress = true;
7555 + return SPACEBAR_CHAR;
7556 +
7557 + case 'textInput':
7558 + // Record the characters to be added to the DOM.
7559 + var chars = nativeEvent.data; // If it's a spacebar character, assume that we have already handled
7560 + // it at the keypress level and bail immediately. Android Chrome
7561 + // doesn't give us keycodes, so we need to ignore it.
7562 +
7563 + if (chars === SPACEBAR_CHAR && hasSpaceKeypress) {
7564 + return null;
7565 + }
7566 +
7567 + return chars;
7568 +
7569 + default:
7570 + // For other native event types, do nothing.
7571 + return null;
7572 + }
7573 + }
7574 + /**
7575 + * For browsers that do not provide the `textInput` event, extract the
7576 + * appropriate string to use for SyntheticInputEvent.
7577 + */
7578 +
7579 +
7580 + function getFallbackBeforeInputChars(domEventName, nativeEvent) {
7581 + // If we are currently composing (IME) and using a fallback to do so,
7582 + // try to extract the composed characters from the fallback object.
7583 + // If composition event is available, we extract a string only at
7584 + // compositionevent, otherwise extract it at fallback events.
7585 + if (isComposing) {
7586 + if (domEventName === 'compositionend' || !canUseCompositionEvent && isFallbackCompositionEnd(domEventName, nativeEvent)) {
7587 + var chars = getData();
7588 + reset();
7589 + isComposing = false;
7590 + return chars;
7591 + }
7592 +
7593 + return null;
7594 + }
7595 +
7596 + switch (domEventName) {
7597 + case 'paste':
7598 + // If a paste event occurs after a keypress, throw out the input
7599 + // chars. Paste events should not lead to BeforeInput events.
7600 + return null;
7601 +
7602 + case 'keypress':
7603 + /**
7604 + * As of v27, Firefox may fire keypress events even when no character
7605 + * will be inserted. A few possibilities:
7606 + *
7607 + * - `which` is `0`. Arrow keys, Esc key, etc.
7608 + *
7609 + * - `which` is the pressed key code, but no char is available.
7610 + * Ex: 'AltGr + d` in Polish. There is no modified character for
7611 + * this key combination and no character is inserted into the
7612 + * document, but FF fires the keypress for char code `100` anyway.
7613 + * No `input` event will occur.
7614 + *
7615 + * - `which` is the pressed key code, but a command combination is
7616 + * being used. Ex: `Cmd+C`. No character is inserted, and no
7617 + * `input` event will occur.
7618 + */
7619 + if (!isKeypressCommand(nativeEvent)) {
7620 + // IE fires the `keypress` event when a user types an emoji via
7621 + // Touch keyboard of Windows. In such a case, the `char` property
7622 + // holds an emoji character like `\uD83D\uDE0A`. Because its length
7623 + // is 2, the property `which` does not represent an emoji correctly.
7624 + // In such a case, we directly return the `char` property instead of
7625 + // using `which`.
7626 + if (nativeEvent.char && nativeEvent.char.length > 1) {
7627 + return nativeEvent.char;
7628 + } else if (nativeEvent.which) {
7629 + return String.fromCharCode(nativeEvent.which);
7630 + }
7631 + }
7632 +
7633 + return null;
7634 +
7635 + case 'compositionend':
7636 + return useFallbackCompositionData && !isUsingKoreanIME(nativeEvent) ? null : nativeEvent.data;
7637 +
7638 + default:
7639 + return null;
7640 + }
7641 + }
7642 + /**
7643 + * Extract a SyntheticInputEvent for `beforeInput`, based on either native
7644 + * `textInput` or fallback behavior.
7645 + *
7646 + * @return {?object} A SyntheticInputEvent.
7647 + */
7648 +
7649 +
7650 + function extractBeforeInputEvent(dispatchQueue, domEventName, targetInst, nativeEvent, nativeEventTarget) {
7651 + var chars;
7652 +
7653 + if (canUseTextInputEvent) {
7654 + chars = getNativeBeforeInputChars(domEventName, nativeEvent);
7655 + } else {
7656 + chars = getFallbackBeforeInputChars(domEventName, nativeEvent);
7657 + } // If no characters are being inserted, no BeforeInput event should
7658 + // be fired.
7659 +
7660 +
7661 + if (!chars) {
7662 + return null;
7663 + }
7664 +
7665 + var listeners = accumulateTwoPhaseListeners(targetInst, 'onBeforeInput');
7666 +
7667 + if (listeners.length > 0) {
7668 + var event = new SyntheticInputEvent('onBeforeInput', 'beforeinput', null, nativeEvent, nativeEventTarget);
7669 + dispatchQueue.push({
7670 + event: event,
7671 + listeners: listeners
7672 + });
7673 + event.data = chars;
7674 + }
7675 + }
7676 + /**
7677 + * Create an `onBeforeInput` event to match
7678 + * http://www.w3.org/TR/2013/WD-DOM-Level-3-Events-20131105/#events-inputevents.
7679 + *
7680 + * This event plugin is based on the native `textInput` event
7681 + * available in Chrome, Safari, Opera, and IE. This event fires after
7682 + * `onKeyPress` and `onCompositionEnd`, but before `onInput`.
7683 + *
7684 + * `beforeInput` is spec'd but not implemented in any browsers, and
7685 + * the `input` event does not provide any useful information about what has
7686 + * actually been added, contrary to the spec. Thus, `textInput` is the best
7687 + * available event to identify the characters that have actually been inserted
7688 + * into the target node.
7689 + *
7690 + * This plugin is also responsible for emitting `composition` events, thus
7691 + * allowing us to share composition fallback code for both `beforeInput` and
7692 + * `composition` event types.
7693 + */
7694 +
7695 +
7696 + function extractEvents(dispatchQueue, domEventName, targetInst, nativeEvent, nativeEventTarget, eventSystemFlags, targetContainer) {
7697 + extractCompositionEvent(dispatchQueue, domEventName, targetInst, nativeEvent, nativeEventTarget);
7698 + extractBeforeInputEvent(dispatchQueue, domEventName, targetInst, nativeEvent, nativeEventTarget);
7699 + }
7700 +
7701 + /**
7702 + * @see http://www.whatwg.org/specs/web-apps/current-work/multipage/the-input-element.html#input-type-attr-summary
7703 + */
7704 + var supportedInputTypes = {
7705 + color: true,
7706 + date: true,
7707 + datetime: true,
7708 + 'datetime-local': true,
7709 + email: true,
7710 + month: true,
7711 + number: true,
7712 + password: true,
7713 + range: true,
7714 + search: true,
7715 + tel: true,
7716 + text: true,
7717 + time: true,
7718 + url: true,
7719 + week: true
7720 + };
7721 +
7722 + function isTextInputElement(elem) {
7723 + var nodeName = elem && elem.nodeName && elem.nodeName.toLowerCase();
7724 +
7725 + if (nodeName === 'input') {
7726 + return !!supportedInputTypes[elem.type];
7727 + }
7728 +
7729 + if (nodeName === 'textarea') {
7730 + return true;
7731 + }
7732 +
7733 + return false;
7734 + }
7735 +
7736 + /**
7737 + * Checks if an event is supported in the current execution environment.
7738 + *
7739 + * NOTE: This will not work correctly for non-generic events such as `change`,
7740 + * `reset`, `load`, `error`, and `select`.
7741 + *
7742 + * Borrows from Modernizr.
7743 + *
7744 + * @param {string} eventNameSuffix Event name, e.g. "click".
7745 + * @return {boolean} True if the event is supported.
7746 + * @internal
7747 + * @license Modernizr 3.0.0pre (Custom Build) | MIT
7748 + */
7749 +
7750 + function isEventSupported(eventNameSuffix) {
7751 + if (!canUseDOM) {
7752 + return false;
7753 + }
7754 +
7755 + var eventName = 'on' + eventNameSuffix;
7756 + var isSupported = (eventName in document);
7757 +
7758 + if (!isSupported) {
7759 + var element = document.createElement('div');
7760 + element.setAttribute(eventName, 'return;');
7761 + isSupported = typeof element[eventName] === 'function';
7762 + }
7763 +
7764 + return isSupported;
7765 + }
7766 +
7767 + function registerEvents$1() {
7768 + registerTwoPhaseEvent('onChange', ['change', 'click', 'focusin', 'focusout', 'input', 'keydown', 'keyup', 'selectionchange']);
7769 + }
7770 +
7771 + function createAndAccumulateChangeEvent(dispatchQueue, inst, nativeEvent, target) {
7772 + // Flag this event loop as needing state restore.
7773 + enqueueStateRestore(target);
7774 + var listeners = accumulateTwoPhaseListeners(inst, 'onChange');
7775 +
7776 + if (listeners.length > 0) {
7777 + var event = new SyntheticEvent('onChange', 'change', null, nativeEvent, target);
7778 + dispatchQueue.push({
7779 + event: event,
7780 + listeners: listeners
7781 + });
7782 + }
7783 + }
7784 + /**
7785 + * For IE shims
7786 + */
7787 +
7788 +
7789 + var activeElement = null;
7790 + var activeElementInst = null;
7791 + /**
7792 + * SECTION: handle `change` event
7793 + */
7794 +
7795 + function shouldUseChangeEvent(elem) {
7796 + var nodeName = elem.nodeName && elem.nodeName.toLowerCase();
7797 + return nodeName === 'select' || nodeName === 'input' && elem.type === 'file';
7798 + }
7799 +
7800 + function manualDispatchChangeEvent(nativeEvent) {
7801 + var dispatchQueue = [];
7802 + createAndAccumulateChangeEvent(dispatchQueue, activeElementInst, nativeEvent, getEventTarget(nativeEvent)); // If change and propertychange bubbled, we'd just bind to it like all the
7803 + // other events and have it go through ReactBrowserEventEmitter. Since it
7804 + // doesn't, we manually listen for the events and so we have to enqueue and
7805 + // process the abstract event manually.
7806 + //
7807 + // Batching is necessary here in order to ensure that all event handlers run
7808 + // before the next rerender (including event handlers attached to ancestor
7809 + // elements instead of directly on the input). Without this, controlled
7810 + // components don't work properly in conjunction with event bubbling because
7811 + // the component is rerendered and the value reverted before all the event
7812 + // handlers can run. See https://github.com/facebook/react/issues/708.
7813 +
7814 + batchedUpdates(runEventInBatch, dispatchQueue);
7815 + }
7816 +
7817 + function runEventInBatch(dispatchQueue) {
7818 + processDispatchQueue(dispatchQueue, 0);
7819 + }
7820 +
7821 + function getInstIfValueChanged(targetInst) {
7822 + var targetNode = getNodeFromInstance(targetInst);
7823 +
7824 + if (updateValueIfChanged(targetNode)) {
7825 + return targetInst;
7826 + }
7827 + }
7828 +
7829 + function getTargetInstForChangeEvent(domEventName, targetInst) {
7830 + if (domEventName === 'change') {
7831 + return targetInst;
7832 + }
7833 + }
7834 + /**
7835 + * SECTION: handle `input` event
7836 + */
7837 +
7838 +
7839 + var isInputEventSupported = false;
7840 +
7841 + if (canUseDOM) {
7842 + // IE9 claims to support the input event but fails to trigger it when
7843 + // deleting text, so we ignore its input events.
7844 + isInputEventSupported = isEventSupported('input') && (!document.documentMode || document.documentMode > 9);
7845 + }
7846 + /**
7847 + * (For IE <=9) Starts tracking propertychange events on the passed-in element
7848 + * and override the value property so that we can distinguish user events from
7849 + * value changes in JS.
7850 + */
7851 +
7852 +
7853 + function startWatchingForValueChange(target, targetInst) {
7854 + activeElement = target;
7855 + activeElementInst = targetInst;
7856 + activeElement.attachEvent('onpropertychange', handlePropertyChange);
7857 + }
7858 + /**
7859 + * (For IE <=9) Removes the event listeners from the currently-tracked element,
7860 + * if any exists.
7861 + */
7862 +
7863 +
7864 + function stopWatchingForValueChange() {
7865 + if (!activeElement) {
7866 + return;
7867 + }
7868 +
7869 + activeElement.detachEvent('onpropertychange', handlePropertyChange);
7870 + activeElement = null;
7871 + activeElementInst = null;
7872 + }
7873 + /**
7874 + * (For IE <=9) Handles a propertychange event, sending a `change` event if
7875 + * the value of the active element has changed.
7876 + */
7877 +
7878 +
7879 + function handlePropertyChange(nativeEvent) {
7880 + if (nativeEvent.propertyName !== 'value') {
7881 + return;
7882 + }
7883 +
7884 + if (getInstIfValueChanged(activeElementInst)) {
7885 + manualDispatchChangeEvent(nativeEvent);
7886 + }
7887 + }
7888 +
7889 + function handleEventsForInputEventPolyfill(domEventName, target, targetInst) {
7890 + if (domEventName === 'focusin') {
7891 + // In IE9, propertychange fires for most input events but is buggy and
7892 + // doesn't fire when text is deleted, but conveniently, selectionchange
7893 + // appears to fire in all of the remaining cases so we catch those and
7894 + // forward the event if the value has changed
7895 + // In either case, we don't want to call the event handler if the value
7896 + // is changed from JS so we redefine a setter for `.value` that updates
7897 + // our activeElementValue variable, allowing us to ignore those changes
7898 + //
7899 + // stopWatching() should be a noop here but we call it just in case we
7900 + // missed a blur event somehow.
7901 + stopWatchingForValueChange();
7902 + startWatchingForValueChange(target, targetInst);
7903 + } else if (domEventName === 'focusout') {
7904 + stopWatchingForValueChange();
7905 + }
7906 + } // For IE8 and IE9.
7907 +
7908 +
7909 + function getTargetInstForInputEventPolyfill(domEventName, targetInst) {
7910 + if (domEventName === 'selectionchange' || domEventName === 'keyup' || domEventName === 'keydown') {
7911 + // On the selectionchange event, the target is just document which isn't
7912 + // helpful for us so just check activeElement instead.
7913 + //
7914 + // 99% of the time, keydown and keyup aren't necessary. IE8 fails to fire
7915 + // propertychange on the first input event after setting `value` from a
7916 + // script and fires only keydown, keypress, keyup. Catching keyup usually
7917 + // gets it and catching keydown lets us fire an event for the first
7918 + // keystroke if user does a key repeat (it'll be a little delayed: right
7919 + // before the second keystroke). Other input methods (e.g., paste) seem to
7920 + // fire selectionchange normally.
7921 + return getInstIfValueChanged(activeElementInst);
7922 + }
7923 + }
7924 + /**
7925 + * SECTION: handle `click` event
7926 + */
7927 +
7928 +
7929 + function shouldUseClickEvent(elem) {
7930 + // Use the `click` event to detect changes to checkbox and radio inputs.
7931 + // This approach works across all browsers, whereas `change` does not fire
7932 + // until `blur` in IE8.
7933 + var nodeName = elem.nodeName;
7934 + return nodeName && nodeName.toLowerCase() === 'input' && (elem.type === 'checkbox' || elem.type === 'radio');
7935 + }
7936 +
7937 + function getTargetInstForClickEvent(domEventName, targetInst) {
7938 + if (domEventName === 'click') {
7939 + return getInstIfValueChanged(targetInst);
7940 + }
7941 + }
7942 +
7943 + function getTargetInstForInputOrChangeEvent(domEventName, targetInst) {
7944 + if (domEventName === 'input' || domEventName === 'change') {
7945 + return getInstIfValueChanged(targetInst);
7946 + }
7947 + }
7948 +
7949 + function handleControlledInputBlur(node) {
7950 + var state = node._wrapperState;
7951 +
7952 + if (!state || !state.controlled || node.type !== 'number') {
7953 + return;
7954 + }
7955 +
7956 + {
7957 + // If controlled, assign the value attribute to the current value on blur
7958 + setDefaultValue(node, 'number', node.value);
7959 + }
7960 + }
7961 + /**
7962 + * This plugin creates an `onChange` event that normalizes change events
7963 + * across form elements. This event fires at a time when it's possible to
7964 + * change the element's value without seeing a flicker.
7965 + *
7966 + * Supported elements are:
7967 + * - input (see `isTextInputElement`)
7968 + * - textarea
7969 + * - select
7970 + */
7971 +
7972 +
7973 + function extractEvents$1(dispatchQueue, domEventName, targetInst, nativeEvent, nativeEventTarget, eventSystemFlags, targetContainer) {
7974 + var targetNode = targetInst ? getNodeFromInstance(targetInst) : window;
7975 + var getTargetInstFunc, handleEventFunc;
7976 +
7977 + if (shouldUseChangeEvent(targetNode)) {
7978 + getTargetInstFunc = getTargetInstForChangeEvent;
7979 + } else if (isTextInputElement(targetNode)) {
7980 + if (isInputEventSupported) {
7981 + getTargetInstFunc = getTargetInstForInputOrChangeEvent;
7982 + } else {
7983 + getTargetInstFunc = getTargetInstForInputEventPolyfill;
7984 + handleEventFunc = handleEventsForInputEventPolyfill;
7985 + }
7986 + } else if (shouldUseClickEvent(targetNode)) {
7987 + getTargetInstFunc = getTargetInstForClickEvent;
7988 + }
7989 +
7990 + if (getTargetInstFunc) {
7991 + var inst = getTargetInstFunc(domEventName, targetInst);
7992 +
7993 + if (inst) {
7994 + createAndAccumulateChangeEvent(dispatchQueue, inst, nativeEvent, nativeEventTarget);
7995 + return;
7996 + }
7997 + }
7998 +
7999 + if (handleEventFunc) {
8000 + handleEventFunc(domEventName, targetNode, targetInst);
8001 + } // When blurring, set the value attribute for number inputs
8002 +
8003 +
8004 + if (domEventName === 'focusout') {
8005 + handleControlledInputBlur(targetNode);
8006 + }
8007 + }
8008 +
8009 + function registerEvents$2() {
8010 + registerDirectEvent('onMouseEnter', ['mouseout', 'mouseover']);
8011 + registerDirectEvent('onMouseLeave', ['mouseout', 'mouseover']);
8012 + registerDirectEvent('onPointerEnter', ['pointerout', 'pointerover']);
8013 + registerDirectEvent('onPointerLeave', ['pointerout', 'pointerover']);
8014 + }
8015 + /**
8016 + * For almost every interaction we care about, there will be both a top-level
8017 + * `mouseover` and `mouseout` event that occurs. Only use `mouseout` so that
8018 + * we do not extract duplicate events. However, moving the mouse into the
8019 + * browser from outside will not fire a `mouseout` event. In this case, we use
8020 + * the `mouseover` top-level event.
8021 + */
8022 +
8023 +
8024 + function extractEvents$2(dispatchQueue, domEventName, targetInst, nativeEvent, nativeEventTarget, eventSystemFlags, targetContainer) {
8025 + var isOverEvent = domEventName === 'mouseover' || domEventName === 'pointerover';
8026 + var isOutEvent = domEventName === 'mouseout' || domEventName === 'pointerout';
8027 +
8028 + if (isOverEvent && !isReplayingEvent(nativeEvent)) {
8029 + // If this is an over event with a target, we might have already dispatched
8030 + // the event in the out event of the other target. If this is replayed,
8031 + // then it's because we couldn't dispatch against this target previously
8032 + // so we have to do it now instead.
8033 + var related = nativeEvent.relatedTarget || nativeEvent.fromElement;
8034 +
8035 + if (related) {
8036 + // If the related node is managed by React, we can assume that we have
8037 + // already dispatched the corresponding events during its mouseout.
8038 + if (getClosestInstanceFromNode(related) || isContainerMarkedAsRoot(related)) {
8039 + return;
8040 + }
8041 + }
8042 + }
8043 +
8044 + if (!isOutEvent && !isOverEvent) {
8045 + // Must not be a mouse or pointer in or out - ignoring.
8046 + return;
8047 + }
8048 +
8049 + var win; // TODO: why is this nullable in the types but we read from it?
8050 +
8051 + if (nativeEventTarget.window === nativeEventTarget) {
8052 + // `nativeEventTarget` is probably a window object.
8053 + win = nativeEventTarget;
8054 + } else {
8055 + // TODO: Figure out why `ownerDocument` is sometimes undefined in IE8.
8056 + var doc = nativeEventTarget.ownerDocument;
8057 +
8058 + if (doc) {
8059 + win = doc.defaultView || doc.parentWindow;
8060 + } else {
8061 + win = window;
8062 + }
8063 + }
8064 +
8065 + var from;
8066 + var to;
8067 +
8068 + if (isOutEvent) {
8069 + var _related = nativeEvent.relatedTarget || nativeEvent.toElement;
8070 +
8071 + from = targetInst;
8072 + to = _related ? getClosestInstanceFromNode(_related) : null;
8073 +
8074 + if (to !== null) {
8075 + var nearestMounted = getNearestMountedFiber(to);
8076 +
8077 + if (to !== nearestMounted || to.tag !== HostComponent && to.tag !== HostText) {
8078 + to = null;
8079 + }
8080 + }
8081 + } else {
8082 + // Moving to a node from outside the window.
8083 + from = null;
8084 + to = targetInst;
8085 + }
8086 +
8087 + if (from === to) {
8088 + // Nothing pertains to our managed components.
8089 + return;
8090 + }
8091 +
8092 + var SyntheticEventCtor = SyntheticMouseEvent;
8093 + var leaveEventType = 'onMouseLeave';
8094 + var enterEventType = 'onMouseEnter';
8095 + var eventTypePrefix = 'mouse';
8096 +
8097 + if (domEventName === 'pointerout' || domEventName === 'pointerover') {
8098 + SyntheticEventCtor = SyntheticPointerEvent;
8099 + leaveEventType = 'onPointerLeave';
8100 + enterEventType = 'onPointerEnter';
8101 + eventTypePrefix = 'pointer';
8102 + }
8103 +
8104 + var fromNode = from == null ? win : getNodeFromInstance(from);
8105 + var toNode = to == null ? win : getNodeFromInstance(to);
8106 + var leave = new SyntheticEventCtor(leaveEventType, eventTypePrefix + 'leave', from, nativeEvent, nativeEventTarget);
8107 + leave.target = fromNode;
8108 + leave.relatedTarget = toNode;
8109 + var enter = null; // We should only process this nativeEvent if we are processing
8110 + // the first ancestor. Next time, we will ignore the event.
8111 +
8112 + var nativeTargetInst = getClosestInstanceFromNode(nativeEventTarget);
8113 +
8114 + if (nativeTargetInst === targetInst) {
8115 + var enterEvent = new SyntheticEventCtor(enterEventType, eventTypePrefix + 'enter', to, nativeEvent, nativeEventTarget);
8116 + enterEvent.target = toNode;
8117 + enterEvent.relatedTarget = fromNode;
8118 + enter = enterEvent;
8119 + }
8120 +
8121 + accumulateEnterLeaveTwoPhaseListeners(dispatchQueue, leave, enter, from, to);
8122 + }
8123 +
8124 + /**
8125 + * inlined Object.is polyfill to avoid requiring consumers ship their own
8126 + * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/is
8127 + */
8128 + function is(x, y) {
8129 + return x === y && (x !== 0 || 1 / x === 1 / y) || x !== x && y !== y // eslint-disable-line no-self-compare
8130 + ;
8131 + }
8132 +
8133 + var objectIs = typeof Object.is === 'function' ? Object.is : is;
8134 +
8135 + /**
8136 + * Performs equality by iterating through keys on an object and returning false
8137 + * when any key has values which are not strictly equal between the arguments.
8138 + * Returns true when the values of all keys are strictly equal.
8139 + */
8140 +
8141 + function shallowEqual(objA, objB) {
8142 + if (objectIs(objA, objB)) {
8143 + return true;
8144 + }
8145 +
8146 + if (typeof objA !== 'object' || objA === null || typeof objB !== 'object' || objB === null) {
8147 + return false;
8148 + }
8149 +
8150 + var keysA = Object.keys(objA);
8151 + var keysB = Object.keys(objB);
8152 +
8153 + if (keysA.length !== keysB.length) {
8154 + return false;
8155 + } // Test for A's keys different from B.
8156 +
8157 +
8158 + for (var i = 0; i < keysA.length; i++) {
8159 + var currentKey = keysA[i];
8160 +
8161 + if (!hasOwnProperty.call(objB, currentKey) || !objectIs(objA[currentKey], objB[currentKey])) {
8162 + return false;
8163 + }
8164 + }
8165 +
8166 + return true;
8167 + }
8168 +
8169 + /**
8170 + * Given any node return the first leaf node without children.
8171 + *
8172 + * @param {DOMElement|DOMTextNode} node
8173 + * @return {DOMElement|DOMTextNode}
8174 + */
8175 +
8176 + function getLeafNode(node) {
8177 + while (node && node.firstChild) {
8178 + node = node.firstChild;
8179 + }
8180 +
8181 + return node;
8182 + }
8183 + /**
8184 + * Get the next sibling within a container. This will walk up the
8185 + * DOM if a node's siblings have been exhausted.
8186 + *
8187 + * @param {DOMElement|DOMTextNode} node
8188 + * @return {?DOMElement|DOMTextNode}
8189 + */
8190 +
8191 +
8192 + function getSiblingNode(node) {
8193 + while (node) {
8194 + if (node.nextSibling) {
8195 + return node.nextSibling;
8196 + }
8197 +
8198 + node = node.parentNode;
8199 + }
8200 + }
8201 + /**
8202 + * Get object describing the nodes which contain characters at offset.
8203 + *
8204 + * @param {DOMElement|DOMTextNode} root
8205 + * @param {number} offset
8206 + * @return {?object}
8207 + */
8208 +
8209 +
8210 + function getNodeForCharacterOffset(root, offset) {
8211 + var node = getLeafNode(root);
8212 + var nodeStart = 0;
8213 + var nodeEnd = 0;
8214 +
8215 + while (node) {
8216 + if (node.nodeType === TEXT_NODE) {
8217 + nodeEnd = nodeStart + node.textContent.length;
8218 +
8219 + if (nodeStart <= offset && nodeEnd >= offset) {
8220 + return {
8221 + node: node,
8222 + offset: offset - nodeStart
8223 + };
8224 + }
8225 +
8226 + nodeStart = nodeEnd;
8227 + }
8228 +
8229 + node = getLeafNode(getSiblingNode(node));
8230 + }
8231 + }
8232 +
8233 + /**
8234 + * @param {DOMElement} outerNode
8235 + * @return {?object}
8236 + */
8237 +
8238 + function getOffsets(outerNode) {
8239 + var ownerDocument = outerNode.ownerDocument;
8240 + var win = ownerDocument && ownerDocument.defaultView || window;
8241 + var selection = win.getSelection && win.getSelection();
8242 +
8243 + if (!selection || selection.rangeCount === 0) {
8244 + return null;
8245 + }
8246 +
8247 + var anchorNode = selection.anchorNode,
8248 + anchorOffset = selection.anchorOffset,
8249 + focusNode = selection.focusNode,
8250 + focusOffset = selection.focusOffset; // In Firefox, anchorNode and focusNode can be "anonymous divs", e.g. the
8251 + // up/down buttons on an <input type="number">. Anonymous divs do not seem to
8252 + // expose properties, triggering a "Permission denied error" if any of its
8253 + // properties are accessed. The only seemingly possible way to avoid erroring
8254 + // is to access a property that typically works for non-anonymous divs and
8255 + // catch any error that may otherwise arise. See
8256 + // https://bugzilla.mozilla.org/show_bug.cgi?id=208427
8257 +
8258 + try {
8259 + /* eslint-disable no-unused-expressions */
8260 + anchorNode.nodeType;
8261 + focusNode.nodeType;
8262 + /* eslint-enable no-unused-expressions */
8263 + } catch (e) {
8264 + return null;
8265 + }
8266 +
8267 + return getModernOffsetsFromPoints(outerNode, anchorNode, anchorOffset, focusNode, focusOffset);
8268 + }
8269 + /**
8270 + * Returns {start, end} where `start` is the character/codepoint index of
8271 + * (anchorNode, anchorOffset) within the textContent of `outerNode`, and
8272 + * `end` is the index of (focusNode, focusOffset).
8273 + *
8274 + * Returns null if you pass in garbage input but we should probably just crash.
8275 + *
8276 + * Exported only for testing.
8277 + */
8278 +
8279 + function getModernOffsetsFromPoints(outerNode, anchorNode, anchorOffset, focusNode, focusOffset) {
8280 + var length = 0;
8281 + var start = -1;
8282 + var end = -1;
8283 + var indexWithinAnchor = 0;
8284 + var indexWithinFocus = 0;
8285 + var node = outerNode;
8286 + var parentNode = null;
8287 +
8288 + outer: while (true) {
8289 + var next = null;
8290 +
8291 + while (true) {
8292 + if (node === anchorNode && (anchorOffset === 0 || node.nodeType === TEXT_NODE)) {
8293 + start = length + anchorOffset;
8294 + }
8295 +
8296 + if (node === focusNode && (focusOffset === 0 || node.nodeType === TEXT_NODE)) {
8297 + end = length + focusOffset;
8298 + }
8299 +
8300 + if (node.nodeType === TEXT_NODE) {
8301 + length += node.nodeValue.length;
8302 + }
8303 +
8304 + if ((next = node.firstChild) === null) {
8305 + break;
8306 + } // Moving from `node` to its first child `next`.
8307 +
8308 +
8309 + parentNode = node;
8310 + node = next;
8311 + }
8312 +
8313 + while (true) {
8314 + if (node === outerNode) {
8315 + // If `outerNode` has children, this is always the second time visiting
8316 + // it. If it has no children, this is still the first loop, and the only
8317 + // valid selection is anchorNode and focusNode both equal to this node
8318 + // and both offsets 0, in which case we will have handled above.
8319 + break outer;
8320 + }
8321 +
8322 + if (parentNode === anchorNode && ++indexWithinAnchor === anchorOffset) {
8323 + start = length;
8324 + }
8325 +
8326 + if (parentNode === focusNode && ++indexWithinFocus === focusOffset) {
8327 + end = length;
8328 + }
8329 +
8330 + if ((next = node.nextSibling) !== null) {
8331 + break;
8332 + }
8333 +
8334 + node = parentNode;
8335 + parentNode = node.parentNode;
8336 + } // Moving from `node` to its next sibling `next`.
8337 +
8338 +
8339 + node = next;
8340 + }
8341 +
8342 + if (start === -1 || end === -1) {
8343 + // This should never happen. (Would happen if the anchor/focus nodes aren't
8344 + // actually inside the passed-in node.)
8345 + return null;
8346 + }
8347 +
8348 + return {
8349 + start: start,
8350 + end: end
8351 + };
8352 + }
8353 + /**
8354 + * In modern non-IE browsers, we can support both forward and backward
8355 + * selections.
8356 + *
8357 + * Note: IE10+ supports the Selection object, but it does not support
8358 + * the `extend` method, which means that even in modern IE, it's not possible
8359 + * to programmatically create a backward selection. Thus, for all IE
8360 + * versions, we use the old IE API to create our selections.
8361 + *
8362 + * @param {DOMElement|DOMTextNode} node
8363 + * @param {object} offsets
8364 + */
8365 +
8366 + function setOffsets(node, offsets) {
8367 + var doc = node.ownerDocument || document;
8368 + var win = doc && doc.defaultView || window; // Edge fails with "Object expected" in some scenarios.
8369 + // (For instance: TinyMCE editor used in a list component that supports pasting to add more,
8370 + // fails when pasting 100+ items)
8371 +
8372 + if (!win.getSelection) {
8373 + return;
8374 + }
8375 +
8376 + var selection = win.getSelection();
8377 + var length = node.textContent.length;
8378 + var start = Math.min(offsets.start, length);
8379 + var end = offsets.end === undefined ? start : Math.min(offsets.end, length); // IE 11 uses modern selection, but doesn't support the extend method.
8380 + // Flip backward selections, so we can set with a single range.
8381 +
8382 + if (!selection.extend && start > end) {
8383 + var temp = end;
8384 + end = start;
8385 + start = temp;
8386 + }
8387 +
8388 + var startMarker = getNodeForCharacterOffset(node, start);
8389 + var endMarker = getNodeForCharacterOffset(node, end);
8390 +
8391 + if (startMarker && endMarker) {
8392 + if (selection.rangeCount === 1 && selection.anchorNode === startMarker.node && selection.anchorOffset === startMarker.offset && selection.focusNode === endMarker.node && selection.focusOffset === endMarker.offset) {
8393 + return;
8394 + }
8395 +
8396 + var range = doc.createRange();
8397 + range.setStart(startMarker.node, startMarker.offset);
8398 + selection.removeAllRanges();
8399 +
8400 + if (start > end) {
8401 + selection.addRange(range);
8402 + selection.extend(endMarker.node, endMarker.offset);
8403 + } else {
8404 + range.setEnd(endMarker.node, endMarker.offset);
8405 + selection.addRange(range);
8406 + }
8407 + }
8408 + }
8409 +
8410 + function isTextNode(node) {
8411 + return node && node.nodeType === TEXT_NODE;
8412 + }
8413 +
8414 + function containsNode(outerNode, innerNode) {
8415 + if (!outerNode || !innerNode) {
8416 + return false;
8417 + } else if (outerNode === innerNode) {
8418 + return true;
8419 + } else if (isTextNode(outerNode)) {
8420 + return false;
8421 + } else if (isTextNode(innerNode)) {
8422 + return containsNode(outerNode, innerNode.parentNode);
8423 + } else if ('contains' in outerNode) {
8424 + return outerNode.contains(innerNode);
8425 + } else if (outerNode.compareDocumentPosition) {
8426 + return !!(outerNode.compareDocumentPosition(innerNode) & 16);
8427 + } else {
8428 + return false;
8429 + }
8430 + }
8431 +
8432 + function isInDocument(node) {
8433 + return node && node.ownerDocument && containsNode(node.ownerDocument.documentElement, node);
8434 + }
8435 +
8436 + function isSameOriginFrame(iframe) {
8437 + try {
8438 + // Accessing the contentDocument of a HTMLIframeElement can cause the browser
8439 + // to throw, e.g. if it has a cross-origin src attribute.
8440 + // Safari will show an error in the console when the access results in "Blocked a frame with origin". e.g:
8441 + // iframe.contentDocument.defaultView;
8442 + // A safety way is to access one of the cross origin properties: Window or Location
8443 + // Which might result in "SecurityError" DOM Exception and it is compatible to Safari.
8444 + // https://html.spec.whatwg.org/multipage/browsers.html#integration-with-idl
8445 + return typeof iframe.contentWindow.location.href === 'string';
8446 + } catch (err) {
8447 + return false;
8448 + }
8449 + }
8450 +
8451 + function getActiveElementDeep() {
8452 + var win = window;
8453 + var element = getActiveElement();
8454 +
8455 + while (element instanceof win.HTMLIFrameElement) {
8456 + if (isSameOriginFrame(element)) {
8457 + win = element.contentWindow;
8458 + } else {
8459 + return element;
8460 + }
8461 +
8462 + element = getActiveElement(win.document);
8463 + }
8464 +
8465 + return element;
8466 + }
8467 + /**
8468 + * @ReactInputSelection: React input selection module. Based on Selection.js,
8469 + * but modified to be suitable for react and has a couple of bug fixes (doesn't
8470 + * assume buttons have range selections allowed).
8471 + * Input selection module for React.
8472 + */
8473 +
8474 + /**
8475 + * @hasSelectionCapabilities: we get the element types that support selection
8476 + * from https://html.spec.whatwg.org/#do-not-apply, looking at `selectionStart`
8477 + * and `selectionEnd` rows.
8478 + */
8479 +
8480 +
8481 + function hasSelectionCapabilities(elem) {
8482 + var nodeName = elem && elem.nodeName && elem.nodeName.toLowerCase();
8483 + return nodeName && (nodeName === 'input' && (elem.type === 'text' || elem.type === 'search' || elem.type === 'tel' || elem.type === 'url' || elem.type === 'password') || nodeName === 'textarea' || elem.contentEditable === 'true');
8484 + }
8485 + function getSelectionInformation() {
8486 + var focusedElem = getActiveElementDeep();
8487 + return {
8488 + focusedElem: focusedElem,
8489 + selectionRange: hasSelectionCapabilities(focusedElem) ? getSelection(focusedElem) : null
8490 + };
8491 + }
8492 + /**
8493 + * @restoreSelection: If any selection information was potentially lost,
8494 + * restore it. This is useful when performing operations that could remove dom
8495 + * nodes and place them back in, resulting in focus being lost.
8496 + */
8497 +
8498 + function restoreSelection(priorSelectionInformation) {
8499 + var curFocusedElem = getActiveElementDeep();
8500 + var priorFocusedElem = priorSelectionInformation.focusedElem;
8501 + var priorSelectionRange = priorSelectionInformation.selectionRange;
8502 +
8503 + if (curFocusedElem !== priorFocusedElem && isInDocument(priorFocusedElem)) {
8504 + if (priorSelectionRange !== null && hasSelectionCapabilities(priorFocusedElem)) {
8505 + setSelection(priorFocusedElem, priorSelectionRange);
8506 + } // Focusing a node can change the scroll position, which is undesirable
8507 +
8508 +
8509 + var ancestors = [];
8510 + var ancestor = priorFocusedElem;
8511 +
8512 + while (ancestor = ancestor.parentNode) {
8513 + if (ancestor.nodeType === ELEMENT_NODE) {
8514 + ancestors.push({
8515 + element: ancestor,
8516 + left: ancestor.scrollLeft,
8517 + top: ancestor.scrollTop
8518 + });
8519 + }
8520 + }
8521 +
8522 + if (typeof priorFocusedElem.focus === 'function') {
8523 + priorFocusedElem.focus();
8524 + }
8525 +
8526 + for (var i = 0; i < ancestors.length; i++) {
8527 + var info = ancestors[i];
8528 + info.element.scrollLeft = info.left;
8529 + info.element.scrollTop = info.top;
8530 + }
8531 + }
8532 + }
8533 + /**
8534 + * @getSelection: Gets the selection bounds of a focused textarea, input or
8535 + * contentEditable node.
8536 + * -@input: Look up selection bounds of this input
8537 + * -@return {start: selectionStart, end: selectionEnd}
8538 + */
8539 +
8540 + function getSelection(input) {
8541 + var selection;
8542 +
8543 + if ('selectionStart' in input) {
8544 + // Modern browser with input or textarea.
8545 + selection = {
8546 + start: input.selectionStart,
8547 + end: input.selectionEnd
8548 + };
8549 + } else {
8550 + // Content editable or old IE textarea.
8551 + selection = getOffsets(input);
8552 + }
8553 +
8554 + return selection || {
8555 + start: 0,
8556 + end: 0
8557 + };
8558 + }
8559 + /**
8560 + * @setSelection: Sets the selection bounds of a textarea or input and focuses
8561 + * the input.
8562 + * -@input Set selection bounds of this input or textarea
8563 + * -@offsets Object of same form that is returned from get*
8564 + */
8565 +
8566 + function setSelection(input, offsets) {
8567 + var start = offsets.start;
8568 + var end = offsets.end;
8569 +
8570 + if (end === undefined) {
8571 + end = start;
8572 + }
8573 +
8574 + if ('selectionStart' in input) {
8575 + input.selectionStart = start;
8576 + input.selectionEnd = Math.min(end, input.value.length);
8577 + } else {
8578 + setOffsets(input, offsets);
8579 + }
8580 + }
8581 +
8582 + var skipSelectionChangeEvent = canUseDOM && 'documentMode' in document && document.documentMode <= 11;
8583 +
8584 + function registerEvents$3() {
8585 + registerTwoPhaseEvent('onSelect', ['focusout', 'contextmenu', 'dragend', 'focusin', 'keydown', 'keyup', 'mousedown', 'mouseup', 'selectionchange']);
8586 + }
8587 +
8588 + var activeElement$1 = null;
8589 + var activeElementInst$1 = null;
8590 + var lastSelection = null;
8591 + var mouseDown = false;
8592 + /**
8593 + * Get an object which is a unique representation of the current selection.
8594 + *
8595 + * The return value will not be consistent across nodes or browsers, but
8596 + * two identical selections on the same node will return identical objects.
8597 + */
8598 +
8599 + function getSelection$1(node) {
8600 + if ('selectionStart' in node && hasSelectionCapabilities(node)) {
8601 + return {
8602 + start: node.selectionStart,
8603 + end: node.selectionEnd
8604 + };
8605 + } else {
8606 + var win = node.ownerDocument && node.ownerDocument.defaultView || window;
8607 + var selection = win.getSelection();
8608 + return {
8609 + anchorNode: selection.anchorNode,
8610 + anchorOffset: selection.anchorOffset,
8611 + focusNode: selection.focusNode,
8612 + focusOffset: selection.focusOffset
8613 + };
8614 + }
8615 + }
8616 + /**
8617 + * Get document associated with the event target.
8618 + */
8619 +
8620 +
8621 + function getEventTargetDocument(eventTarget) {
8622 + return eventTarget.window === eventTarget ? eventTarget.document : eventTarget.nodeType === DOCUMENT_NODE ? eventTarget : eventTarget.ownerDocument;
8623 + }
8624 + /**
8625 + * Poll selection to see whether it's changed.
8626 + *
8627 + * @param {object} nativeEvent
8628 + * @param {object} nativeEventTarget
8629 + * @return {?SyntheticEvent}
8630 + */
8631 +
8632 +
8633 + function constructSelectEvent(dispatchQueue, nativeEvent, nativeEventTarget) {
8634 + // Ensure we have the right element, and that the user is not dragging a
8635 + // selection (this matches native `select` event behavior). In HTML5, select
8636 + // fires only on input and textarea thus if there's no focused element we
8637 + // won't dispatch.
8638 + var doc = getEventTargetDocument(nativeEventTarget);
8639 +
8640 + if (mouseDown || activeElement$1 == null || activeElement$1 !== getActiveElement(doc)) {
8641 + return;
8642 + } // Only fire when selection has actually changed.
8643 +
8644 +
8645 + var currentSelection = getSelection$1(activeElement$1);
8646 +
8647 + if (!lastSelection || !shallowEqual(lastSelection, currentSelection)) {
8648 + lastSelection = currentSelection;
8649 + var listeners = accumulateTwoPhaseListeners(activeElementInst$1, 'onSelect');
8650 +
8651 + if (listeners.length > 0) {
8652 + var event = new SyntheticEvent('onSelect', 'select', null, nativeEvent, nativeEventTarget);
8653 + dispatchQueue.push({
8654 + event: event,
8655 + listeners: listeners
8656 + });
8657 + event.target = activeElement$1;
8658 + }
8659 + }
8660 + }
8661 + /**
8662 + * This plugin creates an `onSelect` event that normalizes select events
8663 + * across form elements.
8664 + *
8665 + * Supported elements are:
8666 + * - input (see `isTextInputElement`)
8667 + * - textarea
8668 + * - contentEditable
8669 + *
8670 + * This differs from native browser implementations in the following ways:
8671 + * - Fires on contentEditable fields as well as inputs.
8672 + * - Fires for collapsed selection.
8673 + * - Fires after user input.
8674 + */
8675 +
8676 +
8677 + function extractEvents$3(dispatchQueue, domEventName, targetInst, nativeEvent, nativeEventTarget, eventSystemFlags, targetContainer) {
8678 + var targetNode = targetInst ? getNodeFromInstance(targetInst) : window;
8679 +
8680 + switch (domEventName) {
8681 + // Track the input node that has focus.
8682 + case 'focusin':
8683 + if (isTextInputElement(targetNode) || targetNode.contentEditable === 'true') {
8684 + activeElement$1 = targetNode;
8685 + activeElementInst$1 = targetInst;
8686 + lastSelection = null;
8687 + }
8688 +
8689 + break;
8690 +
8691 + case 'focusout':
8692 + activeElement$1 = null;
8693 + activeElementInst$1 = null;
8694 + lastSelection = null;
8695 + break;
8696 + // Don't fire the event while the user is dragging. This matches the
8697 + // semantics of the native select event.
8698 +
8699 + case 'mousedown':
8700 + mouseDown = true;
8701 + break;
8702 +
8703 + case 'contextmenu':
8704 + case 'mouseup':
8705 + case 'dragend':
8706 + mouseDown = false;
8707 + constructSelectEvent(dispatchQueue, nativeEvent, nativeEventTarget);
8708 + break;
8709 + // Chrome and IE fire non-standard event when selection is changed (and
8710 + // sometimes when it hasn't). IE's event fires out of order with respect
8711 + // to key and input events on deletion, so we discard it.
8712 + //
8713 + // Firefox doesn't support selectionchange, so check selection status
8714 + // after each key entry. The selection changes after keydown and before
8715 + // keyup, but we check on keydown as well in the case of holding down a
8716 + // key, when multiple keydown events are fired but only one keyup is.
8717 + // This is also our approach for IE handling, for the reason above.
8718 +
8719 + case 'selectionchange':
8720 + if (skipSelectionChangeEvent) {
8721 + break;
8722 + }
8723 +
8724 + // falls through
8725 +
8726 + case 'keydown':
8727 + case 'keyup':
8728 + constructSelectEvent(dispatchQueue, nativeEvent, nativeEventTarget);
8729 + }
8730 + }
8731 +
8732 + /**
8733 + * Generate a mapping of standard vendor prefixes using the defined style property and event name.
8734 + *
8735 + * @param {string} styleProp
8736 + * @param {string} eventName
8737 + * @returns {object}
8738 + */
8739 +
8740 + function makePrefixMap(styleProp, eventName) {
8741 + var prefixes = {};
8742 + prefixes[styleProp.toLowerCase()] = eventName.toLowerCase();
8743 + prefixes['Webkit' + styleProp] = 'webkit' + eventName;
8744 + prefixes['Moz' + styleProp] = 'moz' + eventName;
8745 + return prefixes;
8746 + }
8747 + /**
8748 + * A list of event names to a configurable list of vendor prefixes.
8749 + */
8750 +
8751 +
8752 + var vendorPrefixes = {
8753 + animationend: makePrefixMap('Animation', 'AnimationEnd'),
8754 + animationiteration: makePrefixMap('Animation', 'AnimationIteration'),
8755 + animationstart: makePrefixMap('Animation', 'AnimationStart'),
8756 + transitionend: makePrefixMap('Transition', 'TransitionEnd')
8757 + };
8758 + /**
8759 + * Event names that have already been detected and prefixed (if applicable).
8760 + */
8761 +
8762 + var prefixedEventNames = {};
8763 + /**
8764 + * Element to check for prefixes on.
8765 + */
8766 +
8767 + var style = {};
8768 + /**
8769 + * Bootstrap if a DOM exists.
8770 + */
8771 +
8772 + if (canUseDOM) {
8773 + style = document.createElement('div').style; // On some platforms, in particular some releases of Android 4.x,
8774 + // the un-prefixed "animation" and "transition" properties are defined on the
8775 + // style object but the events that fire will still be prefixed, so we need
8776 + // to check if the un-prefixed events are usable, and if not remove them from the map.
8777 +
8778 + if (!('AnimationEvent' in window)) {
8779 + delete vendorPrefixes.animationend.animation;
8780 + delete vendorPrefixes.animationiteration.animation;
8781 + delete vendorPrefixes.animationstart.animation;
8782 + } // Same as above
8783 +
8784 +
8785 + if (!('TransitionEvent' in window)) {
8786 + delete vendorPrefixes.transitionend.transition;
8787 + }
8788 + }
8789 + /**
8790 + * Attempts to determine the correct vendor prefixed event name.
8791 + *
8792 + * @param {string} eventName
8793 + * @returns {string}
8794 + */
8795 +
8796 +
8797 + function getVendorPrefixedEventName(eventName) {
8798 + if (prefixedEventNames[eventName]) {
8799 + return prefixedEventNames[eventName];
8800 + } else if (!vendorPrefixes[eventName]) {
8801 + return eventName;
8802 + }
8803 +
8804 + var prefixMap = vendorPrefixes[eventName];
8805 +
8806 + for (var styleProp in prefixMap) {
8807 + if (prefixMap.hasOwnProperty(styleProp) && styleProp in style) {
8808 + return prefixedEventNames[eventName] = prefixMap[styleProp];
8809 + }
8810 + }
8811 +
8812 + return eventName;
8813 + }
8814 +
8815 + var ANIMATION_END = getVendorPrefixedEventName('animationend');
8816 + var ANIMATION_ITERATION = getVendorPrefixedEventName('animationiteration');
8817 + var ANIMATION_START = getVendorPrefixedEventName('animationstart');
8818 + var TRANSITION_END = getVendorPrefixedEventName('transitionend');
8819 +
8820 + var topLevelEventsToReactNames = new Map(); // NOTE: Capitalization is important in this list!
8821 + //
8822 + // E.g. it needs "pointerDown", not "pointerdown".
8823 + // This is because we derive both React name ("onPointerDown")
8824 + // and DOM name ("pointerdown") from the same list.
8825 + //
8826 + // Exceptions that don't match this convention are listed separately.
8827 + //
8828 + // prettier-ignore
8829 +
8830 + var simpleEventPluginEvents = ['abort', 'auxClick', 'cancel', 'canPlay', 'canPlayThrough', 'click', 'close', 'contextMenu', 'copy', 'cut', 'drag', 'dragEnd', 'dragEnter', 'dragExit', 'dragLeave', 'dragOver', 'dragStart', 'drop', 'durationChange', 'emptied', 'encrypted', 'ended', 'error', 'gotPointerCapture', 'input', 'invalid', 'keyDown', 'keyPress', 'keyUp', 'load', 'loadedData', 'loadedMetadata', 'loadStart', 'lostPointerCapture', 'mouseDown', 'mouseMove', 'mouseOut', 'mouseOver', 'mouseUp', 'paste', 'pause', 'play', 'playing', 'pointerCancel', 'pointerDown', 'pointerMove', 'pointerOut', 'pointerOver', 'pointerUp', 'progress', 'rateChange', 'reset', 'resize', 'seeked', 'seeking', 'stalled', 'submit', 'suspend', 'timeUpdate', 'touchCancel', 'touchEnd', 'touchStart', 'volumeChange', 'scroll', 'toggle', 'touchMove', 'waiting', 'wheel'];
8831 +
8832 + function registerSimpleEvent(domEventName, reactName) {
8833 + topLevelEventsToReactNames.set(domEventName, reactName);
8834 + registerTwoPhaseEvent(reactName, [domEventName]);
8835 + }
8836 +
8837 + function registerSimpleEvents() {
8838 + for (var i = 0; i < simpleEventPluginEvents.length; i++) {
8839 + var eventName = simpleEventPluginEvents[i];
8840 + var domEventName = eventName.toLowerCase();
8841 + var capitalizedEvent = eventName[0].toUpperCase() + eventName.slice(1);
8842 + registerSimpleEvent(domEventName, 'on' + capitalizedEvent);
8843 + } // Special cases where event names don't match.
8844 +
8845 +
8846 + registerSimpleEvent(ANIMATION_END, 'onAnimationEnd');
8847 + registerSimpleEvent(ANIMATION_ITERATION, 'onAnimationIteration');
8848 + registerSimpleEvent(ANIMATION_START, 'onAnimationStart');
8849 + registerSimpleEvent('dblclick', 'onDoubleClick');
8850 + registerSimpleEvent('focusin', 'onFocus');
8851 + registerSimpleEvent('focusout', 'onBlur');
8852 + registerSimpleEvent(TRANSITION_END, 'onTransitionEnd');
8853 + }
8854 +
8855 + function extractEvents$4(dispatchQueue, domEventName, targetInst, nativeEvent, nativeEventTarget, eventSystemFlags, targetContainer) {
8856 + var reactName = topLevelEventsToReactNames.get(domEventName);
8857 +
8858 + if (reactName === undefined) {
8859 + return;
8860 + }
8861 +
8862 + var SyntheticEventCtor = SyntheticEvent;
8863 + var reactEventType = domEventName;
8864 +
8865 + switch (domEventName) {
8866 + case 'keypress':
8867 + // Firefox creates a keypress event for function keys too. This removes
8868 + // the unwanted keypress events. Enter is however both printable and
8869 + // non-printable. One would expect Tab to be as well (but it isn't).
8870 + if (getEventCharCode(nativeEvent) === 0) {
8871 + return;
8872 + }
8873 +
8874 + /* falls through */
8875 +
8876 + case 'keydown':
8877 + case 'keyup':
8878 + SyntheticEventCtor = SyntheticKeyboardEvent;
8879 + break;
8880 +
8881 + case 'focusin':
8882 + reactEventType = 'focus';
8883 + SyntheticEventCtor = SyntheticFocusEvent;
8884 + break;
8885 +
8886 + case 'focusout':
8887 + reactEventType = 'blur';
8888 + SyntheticEventCtor = SyntheticFocusEvent;
8889 + break;
8890 +
8891 + case 'beforeblur':
8892 + case 'afterblur':
8893 + SyntheticEventCtor = SyntheticFocusEvent;
8894 + break;
8895 +
8896 + case 'click':
8897 + // Firefox creates a click event on right mouse clicks. This removes the
8898 + // unwanted click events.
8899 + if (nativeEvent.button === 2) {
8900 + return;
8901 + }
8902 +
8903 + /* falls through */
8904 +
8905 + case 'auxclick':
8906 + case 'dblclick':
8907 + case 'mousedown':
8908 + case 'mousemove':
8909 + case 'mouseup': // TODO: Disabled elements should not respond to mouse events
8910 +
8911 + /* falls through */
8912 +
8913 + case 'mouseout':
8914 + case 'mouseover':
8915 + case 'contextmenu':
8916 + SyntheticEventCtor = SyntheticMouseEvent;
8917 + break;
8918 +
8919 + case 'drag':
8920 + case 'dragend':
8921 + case 'dragenter':
8922 + case 'dragexit':
8923 + case 'dragleave':
8924 + case 'dragover':
8925 + case 'dragstart':
8926 + case 'drop':
8927 + SyntheticEventCtor = SyntheticDragEvent;
8928 + break;
8929 +
8930 + case 'touchcancel':
8931 + case 'touchend':
8932 + case 'touchmove':
8933 + case 'touchstart':
8934 + SyntheticEventCtor = SyntheticTouchEvent;
8935 + break;
8936 +
8937 + case ANIMATION_END:
8938 + case ANIMATION_ITERATION:
8939 + case ANIMATION_START:
8940 + SyntheticEventCtor = SyntheticAnimationEvent;
8941 + break;
8942 +
8943 + case TRANSITION_END:
8944 + SyntheticEventCtor = SyntheticTransitionEvent;
8945 + break;
8946 +
8947 + case 'scroll':
8948 + SyntheticEventCtor = SyntheticUIEvent;
8949 + break;
8950 +
8951 + case 'wheel':
8952 + SyntheticEventCtor = SyntheticWheelEvent;
8953 + break;
8954 +
8955 + case 'copy':
8956 + case 'cut':
8957 + case 'paste':
8958 + SyntheticEventCtor = SyntheticClipboardEvent;
8959 + break;
8960 +
8961 + case 'gotpointercapture':
8962 + case 'lostpointercapture':
8963 + case 'pointercancel':
8964 + case 'pointerdown':
8965 + case 'pointermove':
8966 + case 'pointerout':
8967 + case 'pointerover':
8968 + case 'pointerup':
8969 + SyntheticEventCtor = SyntheticPointerEvent;
8970 + break;
8971 + }
8972 +
8973 + var inCapturePhase = (eventSystemFlags & IS_CAPTURE_PHASE) !== 0;
8974 +
8975 + {
8976 + // Some events don't bubble in the browser.
8977 + // In the past, React has always bubbled them, but this can be surprising.
8978 + // We're going to try aligning closer to the browser behavior by not bubbling
8979 + // them in React either. We'll start by not bubbling onScroll, and then expand.
8980 + var accumulateTargetOnly = !inCapturePhase && // TODO: ideally, we'd eventually add all events from
8981 + // nonDelegatedEvents list in DOMPluginEventSystem.
8982 + // Then we can remove this special list.
8983 + // This is a breaking change that can wait until React 18.
8984 + domEventName === 'scroll';
8985 +
8986 + var _listeners = accumulateSinglePhaseListeners(targetInst, reactName, nativeEvent.type, inCapturePhase, accumulateTargetOnly);
8987 +
8988 + if (_listeners.length > 0) {
8989 + // Intentionally create event lazily.
8990 + var _event = new SyntheticEventCtor(reactName, reactEventType, null, nativeEvent, nativeEventTarget);
8991 +
8992 + dispatchQueue.push({
8993 + event: _event,
8994 + listeners: _listeners
8995 + });
8996 + }
8997 + }
8998 + }
8999 +
9000 + // TODO: remove top-level side effect.
9001 + registerSimpleEvents();
9002 + registerEvents$2();
9003 + registerEvents$1();
9004 + registerEvents$3();
9005 + registerEvents();
9006 +
9007 + function extractEvents$5(dispatchQueue, domEventName, targetInst, nativeEvent, nativeEventTarget, eventSystemFlags, targetContainer) {
9008 + // TODO: we should remove the concept of a "SimpleEventPlugin".
9009 + // This is the basic functionality of the event system. All
9010 + // the other plugins are essentially polyfills. So the plugin
9011 + // should probably be inlined somewhere and have its logic
9012 + // be core the to event system. This would potentially allow
9013 + // us to ship builds of React without the polyfilled plugins below.
9014 + extractEvents$4(dispatchQueue, domEventName, targetInst, nativeEvent, nativeEventTarget, eventSystemFlags);
9015 + var shouldProcessPolyfillPlugins = (eventSystemFlags & SHOULD_NOT_PROCESS_POLYFILL_EVENT_PLUGINS) === 0; // We don't process these events unless we are in the
9016 + // event's native "bubble" phase, which means that we're
9017 + // not in the capture phase. That's because we emulate
9018 + // the capture phase here still. This is a trade-off,
9019 + // because in an ideal world we would not emulate and use
9020 + // the phases properly, like we do with the SimpleEvent
9021 + // plugin. However, the plugins below either expect
9022 + // emulation (EnterLeave) or use state localized to that
9023 + // plugin (BeforeInput, Change, Select). The state in
9024 + // these modules complicates things, as you'll essentially
9025 + // get the case where the capture phase event might change
9026 + // state, only for the following bubble event to come in
9027 + // later and not trigger anything as the state now
9028 + // invalidates the heuristics of the event plugin. We
9029 + // could alter all these plugins to work in such ways, but
9030 + // that might cause other unknown side-effects that we
9031 + // can't foresee right now.
9032 +
9033 + if (shouldProcessPolyfillPlugins) {
9034 + extractEvents$2(dispatchQueue, domEventName, targetInst, nativeEvent, nativeEventTarget);
9035 + extractEvents$1(dispatchQueue, domEventName, targetInst, nativeEvent, nativeEventTarget);
9036 + extractEvents$3(dispatchQueue, domEventName, targetInst, nativeEvent, nativeEventTarget);
9037 + extractEvents(dispatchQueue, domEventName, targetInst, nativeEvent, nativeEventTarget);
9038 + }
9039 + } // List of events that need to be individually attached to media elements.
9040 +
9041 +
9042 + var mediaEventTypes = ['abort', 'canplay', 'canplaythrough', 'durationchange', 'emptied', 'encrypted', 'ended', 'error', 'loadeddata', 'loadedmetadata', 'loadstart', 'pause', 'play', 'playing', 'progress', 'ratechange', 'resize', 'seeked', 'seeking', 'stalled', 'suspend', 'timeupdate', 'volumechange', 'waiting']; // We should not delegate these events to the container, but rather
9043 + // set them on the actual target element itself. This is primarily
9044 + // because these events do not consistently bubble in the DOM.
9045 +
9046 + var nonDelegatedEvents = new Set(['cancel', 'close', 'invalid', 'load', 'scroll', 'toggle'].concat(mediaEventTypes));
9047 +
9048 + function executeDispatch(event, listener, currentTarget) {
9049 + var type = event.type || 'unknown-event';
9050 + event.currentTarget = currentTarget;
9051 + invokeGuardedCallbackAndCatchFirstError(type, listener, undefined, event);
9052 + event.currentTarget = null;
9053 + }
9054 +
9055 + function processDispatchQueueItemsInOrder(event, dispatchListeners, inCapturePhase) {
9056 + var previousInstance;
9057 +
9058 + if (inCapturePhase) {
9059 + for (var i = dispatchListeners.length - 1; i >= 0; i--) {
9060 + var _dispatchListeners$i = dispatchListeners[i],
9061 + instance = _dispatchListeners$i.instance,
9062 + currentTarget = _dispatchListeners$i.currentTarget,
9063 + listener = _dispatchListeners$i.listener;
9064 +
9065 + if (instance !== previousInstance && event.isPropagationStopped()) {
9066 + return;
9067 + }
9068 +
9069 + executeDispatch(event, listener, currentTarget);
9070 + previousInstance = instance;
9071 + }
9072 + } else {
9073 + for (var _i = 0; _i < dispatchListeners.length; _i++) {
9074 + var _dispatchListeners$_i = dispatchListeners[_i],
9075 + _instance = _dispatchListeners$_i.instance,
9076 + _currentTarget = _dispatchListeners$_i.currentTarget,
9077 + _listener = _dispatchListeners$_i.listener;
9078 +
9079 + if (_instance !== previousInstance && event.isPropagationStopped()) {
9080 + return;
9081 + }
9082 +
9083 + executeDispatch(event, _listener, _currentTarget);
9084 + previousInstance = _instance;
9085 + }
9086 + }
9087 + }
9088 +
9089 + function processDispatchQueue(dispatchQueue, eventSystemFlags) {
9090 + var inCapturePhase = (eventSystemFlags & IS_CAPTURE_PHASE) !== 0;
9091 +
9092 + for (var i = 0; i < dispatchQueue.length; i++) {
9093 + var _dispatchQueue$i = dispatchQueue[i],
9094 + event = _dispatchQueue$i.event,
9095 + listeners = _dispatchQueue$i.listeners;
9096 + processDispatchQueueItemsInOrder(event, listeners, inCapturePhase); // event system doesn't use pooling.
9097 + } // This would be a good time to rethrow if any of the event handlers threw.
9098 +
9099 +
9100 + rethrowCaughtError();
9101 + }
9102 +
9103 + function dispatchEventsForPlugins(domEventName, eventSystemFlags, nativeEvent, targetInst, targetContainer) {
9104 + var nativeEventTarget = getEventTarget(nativeEvent);
9105 + var dispatchQueue = [];
9106 + extractEvents$5(dispatchQueue, domEventName, targetInst, nativeEvent, nativeEventTarget, eventSystemFlags);
9107 + processDispatchQueue(dispatchQueue, eventSystemFlags);
9108 + }
9109 +
9110 + function listenToNonDelegatedEvent(domEventName, targetElement) {
9111 + {
9112 + if (!nonDelegatedEvents.has(domEventName)) {
9113 + error('Did not expect a listenToNonDelegatedEvent() call for "%s". ' + 'This is a bug in React. Please file an issue.', domEventName);
9114 + }
9115 + }
9116 +
9117 + var isCapturePhaseListener = false;
9118 + var listenerSet = getEventListenerSet(targetElement);
9119 + var listenerSetKey = getListenerSetKey(domEventName, isCapturePhaseListener);
9120 +
9121 + if (!listenerSet.has(listenerSetKey)) {
9122 + addTrappedEventListener(targetElement, domEventName, IS_NON_DELEGATED, isCapturePhaseListener);
9123 + listenerSet.add(listenerSetKey);
9124 + }
9125 + }
9126 + function listenToNativeEvent(domEventName, isCapturePhaseListener, target) {
9127 + {
9128 + if (nonDelegatedEvents.has(domEventName) && !isCapturePhaseListener) {
9129 + error('Did not expect a listenToNativeEvent() call for "%s" in the bubble phase. ' + 'This is a bug in React. Please file an issue.', domEventName);
9130 + }
9131 + }
9132 +
9133 + var eventSystemFlags = 0;
9134 +
9135 + if (isCapturePhaseListener) {
9136 + eventSystemFlags |= IS_CAPTURE_PHASE;
9137 + }
9138 +
9139 + addTrappedEventListener(target, domEventName, eventSystemFlags, isCapturePhaseListener);
9140 + } // This is only used by createEventHandle when the
9141 + var listeningMarker = '_reactListening' + Math.random().toString(36).slice(2);
9142 + function listenToAllSupportedEvents(rootContainerElement) {
9143 + if (!rootContainerElement[listeningMarker]) {
9144 + rootContainerElement[listeningMarker] = true;
9145 + allNativeEvents.forEach(function (domEventName) {
9146 + // We handle selectionchange separately because it
9147 + // doesn't bubble and needs to be on the document.
9148 + if (domEventName !== 'selectionchange') {
9149 + if (!nonDelegatedEvents.has(domEventName)) {
9150 + listenToNativeEvent(domEventName, false, rootContainerElement);
9151 + }
9152 +
9153 + listenToNativeEvent(domEventName, true, rootContainerElement);
9154 + }
9155 + });
9156 + var ownerDocument = rootContainerElement.nodeType === DOCUMENT_NODE ? rootContainerElement : rootContainerElement.ownerDocument;
9157 +
9158 + if (ownerDocument !== null) {
9159 + // The selectionchange event also needs deduplication
9160 + // but it is attached to the document.
9161 + if (!ownerDocument[listeningMarker]) {
9162 + ownerDocument[listeningMarker] = true;
9163 + listenToNativeEvent('selectionchange', false, ownerDocument);
9164 + }
9165 + }
9166 + }
9167 + }
9168 +
9169 + function addTrappedEventListener(targetContainer, domEventName, eventSystemFlags, isCapturePhaseListener, isDeferredListenerForLegacyFBSupport) {
9170 + var listener = createEventListenerWrapperWithPriority(targetContainer, domEventName, eventSystemFlags); // If passive option is not supported, then the event will be
9171 + // active and not passive.
9172 +
9173 + var isPassiveListener = undefined;
9174 +
9175 + if (passiveBrowserEventsSupported) {
9176 + // Browsers introduced an intervention, making these events
9177 + // passive by default on document. React doesn't bind them
9178 + // to document anymore, but changing this now would undo
9179 + // the performance wins from the change. So we emulate
9180 + // the existing behavior manually on the roots now.
9181 + // https://github.com/facebook/react/issues/19651
9182 + if (domEventName === 'touchstart' || domEventName === 'touchmove' || domEventName === 'wheel') {
9183 + isPassiveListener = true;
9184 + }
9185 + }
9186 +
9187 + targetContainer = targetContainer;
9188 + var unsubscribeListener; // When legacyFBSupport is enabled, it's for when we
9189 +
9190 +
9191 + if (isCapturePhaseListener) {
9192 + if (isPassiveListener !== undefined) {
9193 + unsubscribeListener = addEventCaptureListenerWithPassiveFlag(targetContainer, domEventName, listener, isPassiveListener);
9194 + } else {
9195 + unsubscribeListener = addEventCaptureListener(targetContainer, domEventName, listener);
9196 + }
9197 + } else {
9198 + if (isPassiveListener !== undefined) {
9199 + unsubscribeListener = addEventBubbleListenerWithPassiveFlag(targetContainer, domEventName, listener, isPassiveListener);
9200 + } else {
9201 + unsubscribeListener = addEventBubbleListener(targetContainer, domEventName, listener);
9202 + }
9203 + }
9204 + }
9205 +
9206 + function isMatchingRootContainer(grandContainer, targetContainer) {
9207 + return grandContainer === targetContainer || grandContainer.nodeType === COMMENT_NODE && grandContainer.parentNode === targetContainer;
9208 + }
9209 +
9210 + function dispatchEventForPluginEventSystem(domEventName, eventSystemFlags, nativeEvent, targetInst, targetContainer) {
9211 + var ancestorInst = targetInst;
9212 +
9213 + if ((eventSystemFlags & IS_EVENT_HANDLE_NON_MANAGED_NODE) === 0 && (eventSystemFlags & IS_NON_DELEGATED) === 0) {
9214 + var targetContainerNode = targetContainer; // If we are using the legacy FB support flag, we
9215 +
9216 + if (targetInst !== null) {
9217 + // The below logic attempts to work out if we need to change
9218 + // the target fiber to a different ancestor. We had similar logic
9219 + // in the legacy event system, except the big difference between
9220 + // systems is that the modern event system now has an event listener
9221 + // attached to each React Root and React Portal Root. Together,
9222 + // the DOM nodes representing these roots are the "rootContainer".
9223 + // To figure out which ancestor instance we should use, we traverse
9224 + // up the fiber tree from the target instance and attempt to find
9225 + // root boundaries that match that of our current "rootContainer".
9226 + // If we find that "rootContainer", we find the parent fiber
9227 + // sub-tree for that root and make that our ancestor instance.
9228 + var node = targetInst;
9229 +
9230 + mainLoop: while (true) {
9231 + if (node === null) {
9232 + return;
9233 + }
9234 +
9235 + var nodeTag = node.tag;
9236 +
9237 + if (nodeTag === HostRoot || nodeTag === HostPortal) {
9238 + var container = node.stateNode.containerInfo;
9239 +
9240 + if (isMatchingRootContainer(container, targetContainerNode)) {
9241 + break;
9242 + }
9243 +
9244 + if (nodeTag === HostPortal) {
9245 + // The target is a portal, but it's not the rootContainer we're looking for.
9246 + // Normally portals handle their own events all the way down to the root.
9247 + // So we should be able to stop now. However, we don't know if this portal
9248 + // was part of *our* root.
9249 + var grandNode = node.return;
9250 +
9251 + while (grandNode !== null) {
9252 + var grandTag = grandNode.tag;
9253 +
9254 + if (grandTag === HostRoot || grandTag === HostPortal) {
9255 + var grandContainer = grandNode.stateNode.containerInfo;
9256 +
9257 + if (isMatchingRootContainer(grandContainer, targetContainerNode)) {
9258 + // This is the rootContainer we're looking for and we found it as
9259 + // a parent of the Portal. That means we can ignore it because the
9260 + // Portal will bubble through to us.
9261 + return;
9262 + }
9263 + }
9264 +
9265 + grandNode = grandNode.return;
9266 + }
9267 + } // Now we need to find it's corresponding host fiber in the other
9268 + // tree. To do this we can use getClosestInstanceFromNode, but we
9269 + // need to validate that the fiber is a host instance, otherwise
9270 + // we need to traverse up through the DOM till we find the correct
9271 + // node that is from the other tree.
9272 +
9273 +
9274 + while (container !== null) {
9275 + var parentNode = getClosestInstanceFromNode(container);
9276 +
9277 + if (parentNode === null) {
9278 + return;
9279 + }
9280 +
9281 + var parentTag = parentNode.tag;
9282 +
9283 + if (parentTag === HostComponent || parentTag === HostText) {
9284 + node = ancestorInst = parentNode;
9285 + continue mainLoop;
9286 + }
9287 +
9288 + container = container.parentNode;
9289 + }
9290 + }
9291 +
9292 + node = node.return;
9293 + }
9294 + }
9295 + }
9296 +
9297 + batchedUpdates(function () {
9298 + return dispatchEventsForPlugins(domEventName, eventSystemFlags, nativeEvent, ancestorInst);
9299 + });
9300 + }
9301 +
9302 + function createDispatchListener(instance, listener, currentTarget) {
9303 + return {
9304 + instance: instance,
9305 + listener: listener,
9306 + currentTarget: currentTarget
9307 + };
9308 + }
9309 +
9310 + function accumulateSinglePhaseListeners(targetFiber, reactName, nativeEventType, inCapturePhase, accumulateTargetOnly, nativeEvent) {
9311 + var captureName = reactName !== null ? reactName + 'Capture' : null;
9312 + var reactEventName = inCapturePhase ? captureName : reactName;
9313 + var listeners = [];
9314 + var instance = targetFiber;
9315 + var lastHostComponent = null; // Accumulate all instances and listeners via the target -> root path.
9316 +
9317 + while (instance !== null) {
9318 + var _instance2 = instance,
9319 + stateNode = _instance2.stateNode,
9320 + tag = _instance2.tag; // Handle listeners that are on HostComponents (i.e. <div>)
9321 +
9322 + if (tag === HostComponent && stateNode !== null) {
9323 + lastHostComponent = stateNode; // createEventHandle listeners
9324 +
9325 +
9326 + if (reactEventName !== null) {
9327 + var listener = getListener(instance, reactEventName);
9328 +
9329 + if (listener != null) {
9330 + listeners.push(createDispatchListener(instance, listener, lastHostComponent));
9331 + }
9332 + }
9333 + } // If we are only accumulating events for the target, then we don't
9334 + // continue to propagate through the React fiber tree to find other
9335 + // listeners.
9336 +
9337 +
9338 + if (accumulateTargetOnly) {
9339 + break;
9340 + } // If we are processing the onBeforeBlur event, then we need to take
9341 +
9342 + instance = instance.return;
9343 + }
9344 +
9345 + return listeners;
9346 + } // We should only use this function for:
9347 + // - BeforeInputEventPlugin
9348 + // - ChangeEventPlugin
9349 + // - SelectEventPlugin
9350 + // This is because we only process these plugins
9351 + // in the bubble phase, so we need to accumulate two
9352 + // phase event listeners (via emulation).
9353 +
9354 + function accumulateTwoPhaseListeners(targetFiber, reactName) {
9355 + var captureName = reactName + 'Capture';
9356 + var listeners = [];
9357 + var instance = targetFiber; // Accumulate all instances and listeners via the target -> root path.
9358 +
9359 + while (instance !== null) {
9360 + var _instance3 = instance,
9361 + stateNode = _instance3.stateNode,
9362 + tag = _instance3.tag; // Handle listeners that are on HostComponents (i.e. <div>)
9363 +
9364 + if (tag === HostComponent && stateNode !== null) {
9365 + var currentTarget = stateNode;
9366 + var captureListener = getListener(instance, captureName);
9367 +
9368 + if (captureListener != null) {
9369 + listeners.unshift(createDispatchListener(instance, captureListener, currentTarget));
9370 + }
9371 +
9372 + var bubbleListener = getListener(instance, reactName);
9373 +
9374 + if (bubbleListener != null) {
9375 + listeners.push(createDispatchListener(instance, bubbleListener, currentTarget));
9376 + }
9377 + }
9378 +
9379 + instance = instance.return;
9380 + }
9381 +
9382 + return listeners;
9383 + }
9384 +
9385 + function getParent(inst) {
9386 + if (inst === null) {
9387 + return null;
9388 + }
9389 +
9390 + do {
9391 + inst = inst.return; // TODO: If this is a HostRoot we might want to bail out.
9392 + // That is depending on if we want nested subtrees (layers) to bubble
9393 + // events to their parent. We could also go through parentNode on the
9394 + // host node but that wouldn't work for React Native and doesn't let us
9395 + // do the portal feature.
9396 + } while (inst && inst.tag !== HostComponent);
9397 +
9398 + if (inst) {
9399 + return inst;
9400 + }
9401 +
9402 + return null;
9403 + }
9404 + /**
9405 + * Return the lowest common ancestor of A and B, or null if they are in
9406 + * different trees.
9407 + */
9408 +
9409 +
9410 + function getLowestCommonAncestor(instA, instB) {
9411 + var nodeA = instA;
9412 + var nodeB = instB;
9413 + var depthA = 0;
9414 +
9415 + for (var tempA = nodeA; tempA; tempA = getParent(tempA)) {
9416 + depthA++;
9417 + }
9418 +
9419 + var depthB = 0;
9420 +
9421 + for (var tempB = nodeB; tempB; tempB = getParent(tempB)) {
9422 + depthB++;
9423 + } // If A is deeper, crawl up.
9424 +
9425 +
9426 + while (depthA - depthB > 0) {
9427 + nodeA = getParent(nodeA);
9428 + depthA--;
9429 + } // If B is deeper, crawl up.
9430 +
9431 +
9432 + while (depthB - depthA > 0) {
9433 + nodeB = getParent(nodeB);
9434 + depthB--;
9435 + } // Walk in lockstep until we find a match.
9436 +
9437 +
9438 + var depth = depthA;
9439 +
9440 + while (depth--) {
9441 + if (nodeA === nodeB || nodeB !== null && nodeA === nodeB.alternate) {
9442 + return nodeA;
9443 + }
9444 +
9445 + nodeA = getParent(nodeA);
9446 + nodeB = getParent(nodeB);
9447 + }
9448 +
9449 + return null;
9450 + }
9451 +
9452 + function accumulateEnterLeaveListenersForEvent(dispatchQueue, event, target, common, inCapturePhase) {
9453 + var registrationName = event._reactName;
9454 + var listeners = [];
9455 + var instance = target;
9456 +
9457 + while (instance !== null) {
9458 + if (instance === common) {
9459 + break;
9460 + }
9461 +
9462 + var _instance4 = instance,
9463 + alternate = _instance4.alternate,
9464 + stateNode = _instance4.stateNode,
9465 + tag = _instance4.tag;
9466 +
9467 + if (alternate !== null && alternate === common) {
9468 + break;
9469 + }
9470 +
9471 + if (tag === HostComponent && stateNode !== null) {
9472 + var currentTarget = stateNode;
9473 +
9474 + if (inCapturePhase) {
9475 + var captureListener = getListener(instance, registrationName);
9476 +
9477 + if (captureListener != null) {
9478 + listeners.unshift(createDispatchListener(instance, captureListener, currentTarget));
9479 + }
9480 + } else if (!inCapturePhase) {
9481 + var bubbleListener = getListener(instance, registrationName);
9482 +
9483 + if (bubbleListener != null) {
9484 + listeners.push(createDispatchListener(instance, bubbleListener, currentTarget));
9485 + }
9486 + }
9487 + }
9488 +
9489 + instance = instance.return;
9490 + }
9491 +
9492 + if (listeners.length !== 0) {
9493 + dispatchQueue.push({
9494 + event: event,
9495 + listeners: listeners
9496 + });
9497 + }
9498 + } // We should only use this function for:
9499 + // - EnterLeaveEventPlugin
9500 + // This is because we only process this plugin
9501 + // in the bubble phase, so we need to accumulate two
9502 + // phase event listeners.
9503 +
9504 +
9505 + function accumulateEnterLeaveTwoPhaseListeners(dispatchQueue, leaveEvent, enterEvent, from, to) {
9506 + var common = from && to ? getLowestCommonAncestor(from, to) : null;
9507 +
9508 + if (from !== null) {
9509 + accumulateEnterLeaveListenersForEvent(dispatchQueue, leaveEvent, from, common, false);
9510 + }
9511 +
9512 + if (to !== null && enterEvent !== null) {
9513 + accumulateEnterLeaveListenersForEvent(dispatchQueue, enterEvent, to, common, true);
9514 + }
9515 + }
9516 + function getListenerSetKey(domEventName, capture) {
9517 + return domEventName + "__" + (capture ? 'capture' : 'bubble');
9518 + }
9519 +
9520 + var didWarnInvalidHydration = false;
9521 + var DANGEROUSLY_SET_INNER_HTML = 'dangerouslySetInnerHTML';
9522 + var SUPPRESS_CONTENT_EDITABLE_WARNING = 'suppressContentEditableWarning';
9523 + var SUPPRESS_HYDRATION_WARNING = 'suppressHydrationWarning';
9524 + var AUTOFOCUS = 'autoFocus';
9525 + var CHILDREN = 'children';
9526 + var STYLE = 'style';
9527 + var HTML$1 = '__html';
9528 + var warnedUnknownTags;
9529 + var validatePropertiesInDevelopment;
9530 + var warnForPropDifference;
9531 + var warnForExtraAttributes;
9532 + var warnForInvalidEventListener;
9533 + var canDiffStyleForHydrationWarning;
9534 + var normalizeHTML;
9535 +
9536 + {
9537 + warnedUnknownTags = {
9538 + // There are working polyfills for <dialog>. Let people use it.
9539 + dialog: true,
9540 + // Electron ships a custom <webview> tag to display external web content in
9541 + // an isolated frame and process.
9542 + // This tag is not present in non Electron environments such as JSDom which
9543 + // is often used for testing purposes.
9544 + // @see https://electronjs.org/docs/api/webview-tag
9545 + webview: true
9546 + };
9547 +
9548 + validatePropertiesInDevelopment = function (type, props) {
9549 + validateProperties(type, props);
9550 + validateProperties$1(type, props);
9551 + validateProperties$2(type, props, {
9552 + registrationNameDependencies: registrationNameDependencies,
9553 + possibleRegistrationNames: possibleRegistrationNames
9554 + });
9555 + }; // IE 11 parses & normalizes the style attribute as opposed to other
9556 + // browsers. It adds spaces and sorts the properties in some
9557 + // non-alphabetical order. Handling that would require sorting CSS
9558 + // properties in the client & server versions or applying
9559 + // `expectedStyle` to a temporary DOM node to read its `style` attribute
9560 + // normalized. Since it only affects IE, we're skipping style warnings
9561 + // in that browser completely in favor of doing all that work.
9562 + // See https://github.com/facebook/react/issues/11807
9563 +
9564 +
9565 + canDiffStyleForHydrationWarning = canUseDOM && !document.documentMode;
9566 +
9567 + warnForPropDifference = function (propName, serverValue, clientValue) {
9568 + if (didWarnInvalidHydration) {
9569 + return;
9570 + }
9571 +
9572 + var normalizedClientValue = normalizeMarkupForTextOrAttribute(clientValue);
9573 + var normalizedServerValue = normalizeMarkupForTextOrAttribute(serverValue);
9574 +
9575 + if (normalizedServerValue === normalizedClientValue) {
9576 + return;
9577 + }
9578 +
9579 + didWarnInvalidHydration = true;
9580 +
9581 + error('Prop `%s` did not match. Server: %s Client: %s', propName, JSON.stringify(normalizedServerValue), JSON.stringify(normalizedClientValue));
9582 + };
9583 +
9584 + warnForExtraAttributes = function (attributeNames) {
9585 + if (didWarnInvalidHydration) {
9586 + return;
9587 + }
9588 +
9589 + didWarnInvalidHydration = true;
9590 + var names = [];
9591 + attributeNames.forEach(function (name) {
9592 + names.push(name);
9593 + });
9594 +
9595 + error('Extra attributes from the server: %s', names);
9596 + };
9597 +
9598 + warnForInvalidEventListener = function (registrationName, listener) {
9599 + if (listener === false) {
9600 + error('Expected `%s` listener to be a function, instead got `false`.\n\n' + 'If you used to conditionally omit it with %s={condition && value}, ' + 'pass %s={condition ? value : undefined} instead.', registrationName, registrationName, registrationName);
9601 + } else {
9602 + error('Expected `%s` listener to be a function, instead got a value of `%s` type.', registrationName, typeof listener);
9603 + }
9604 + }; // Parse the HTML and read it back to normalize the HTML string so that it
9605 + // can be used for comparison.
9606 +
9607 +
9608 + normalizeHTML = function (parent, html) {
9609 + // We could have created a separate document here to avoid
9610 + // re-initializing custom elements if they exist. But this breaks
9611 + // how <noscript> is being handled. So we use the same document.
9612 + // See the discussion in https://github.com/facebook/react/pull/11157.
9613 + var testElement = parent.namespaceURI === HTML_NAMESPACE ? parent.ownerDocument.createElement(parent.tagName) : parent.ownerDocument.createElementNS(parent.namespaceURI, parent.tagName);
9614 + testElement.innerHTML = html;
9615 + return testElement.innerHTML;
9616 + };
9617 + } // HTML parsing normalizes CR and CRLF to LF.
9618 + // It also can turn \u0000 into \uFFFD inside attributes.
9619 + // https://www.w3.org/TR/html5/single-page.html#preprocessing-the-input-stream
9620 + // If we have a mismatch, it might be caused by that.
9621 + // We will still patch up in this case but not fire the warning.
9622 +
9623 +
9624 + var NORMALIZE_NEWLINES_REGEX = /\r\n?/g;
9625 + var NORMALIZE_NULL_AND_REPLACEMENT_REGEX = /\u0000|\uFFFD/g;
9626 +
9627 + function normalizeMarkupForTextOrAttribute(markup) {
9628 + {
9629 + checkHtmlStringCoercion(markup);
9630 + }
9631 +
9632 + var markupString = typeof markup === 'string' ? markup : '' + markup;
9633 + return markupString.replace(NORMALIZE_NEWLINES_REGEX, '\n').replace(NORMALIZE_NULL_AND_REPLACEMENT_REGEX, '');
9634 + }
9635 +
9636 + function checkForUnmatchedText(serverText, clientText, isConcurrentMode, shouldWarnDev) {
9637 + var normalizedClientText = normalizeMarkupForTextOrAttribute(clientText);
9638 + var normalizedServerText = normalizeMarkupForTextOrAttribute(serverText);
9639 +
9640 + if (normalizedServerText === normalizedClientText) {
9641 + return;
9642 + }
9643 +
9644 + if (shouldWarnDev) {
9645 + {
9646 + if (!didWarnInvalidHydration) {
9647 + didWarnInvalidHydration = true;
9648 +
9649 + error('Text content did not match. Server: "%s" Client: "%s"', normalizedServerText, normalizedClientText);
9650 + }
9651 + }
9652 + }
9653 +
9654 + if (isConcurrentMode && enableClientRenderFallbackOnTextMismatch) {
9655 + // In concurrent roots, we throw when there's a text mismatch and revert to
9656 + // client rendering, up to the nearest Suspense boundary.
9657 + throw new Error('Text content does not match server-rendered HTML.');
9658 + }
9659 + }
9660 +
9661 + function getOwnerDocumentFromRootContainer(rootContainerElement) {
9662 + return rootContainerElement.nodeType === DOCUMENT_NODE ? rootContainerElement : rootContainerElement.ownerDocument;
9663 + }
9664 +
9665 + function noop() {}
9666 +
9667 + function trapClickOnNonInteractiveElement(node) {
9668 + // Mobile Safari does not fire properly bubble click events on
9669 + // non-interactive elements, which means delegated click listeners do not
9670 + // fire. The workaround for this bug involves attaching an empty click
9671 + // listener on the target node.
9672 + // https://www.quirksmode.org/blog/archives/2010/09/click_event_del.html
9673 + // Just set it using the onclick property so that we don't have to manage any
9674 + // bookkeeping for it. Not sure if we need to clear it when the listener is
9675 + // removed.
9676 + // TODO: Only do this for the relevant Safaris maybe?
9677 + node.onclick = noop;
9678 + }
9679 +
9680 + function setInitialDOMProperties(tag, domElement, rootContainerElement, nextProps, isCustomComponentTag) {
9681 + for (var propKey in nextProps) {
9682 + if (!nextProps.hasOwnProperty(propKey)) {
9683 + continue;
9684 + }
9685 +
9686 + var nextProp = nextProps[propKey];
9687 +
9688 + if (propKey === STYLE) {
9689 + {
9690 + if (nextProp) {
9691 + // Freeze the next style object so that we can assume it won't be
9692 + // mutated. We have already warned for this in the past.
9693 + Object.freeze(nextProp);
9694 + }
9695 + } // Relies on `updateStylesByID` not mutating `styleUpdates`.
9696 +
9697 +
9698 + setValueForStyles(domElement, nextProp);
9699 + } else if (propKey === DANGEROUSLY_SET_INNER_HTML) {
9700 + var nextHtml = nextProp ? nextProp[HTML$1] : undefined;
9701 +
9702 + if (nextHtml != null) {
9703 + setInnerHTML(domElement, nextHtml);
9704 + }
9705 + } else if (propKey === CHILDREN) {
9706 + if (typeof nextProp === 'string') {
9707 + // Avoid setting initial textContent when the text is empty. In IE11 setting
9708 + // textContent on a <textarea> will cause the placeholder to not
9709 + // show within the <textarea> until it has been focused and blurred again.
9710 + // https://github.com/facebook/react/issues/6731#issuecomment-254874553
9711 + var canSetTextContent = tag !== 'textarea' || nextProp !== '';
9712 +
9713 + if (canSetTextContent) {
9714 + setTextContent(domElement, nextProp);
9715 + }
9716 + } else if (typeof nextProp === 'number') {
9717 + setTextContent(domElement, '' + nextProp);
9718 + }
9719 + } else if (propKey === SUPPRESS_CONTENT_EDITABLE_WARNING || propKey === SUPPRESS_HYDRATION_WARNING) ; else if (propKey === AUTOFOCUS) ; else if (registrationNameDependencies.hasOwnProperty(propKey)) {
9720 + if (nextProp != null) {
9721 + if ( typeof nextProp !== 'function') {
9722 + warnForInvalidEventListener(propKey, nextProp);
9723 + }
9724 +
9725 + if (propKey === 'onScroll') {
9726 + listenToNonDelegatedEvent('scroll', domElement);
9727 + }
9728 + }
9729 + } else if (nextProp != null) {
9730 + setValueForProperty(domElement, propKey, nextProp, isCustomComponentTag);
9731 + }
9732 + }
9733 + }
9734 +
9735 + function updateDOMProperties(domElement, updatePayload, wasCustomComponentTag, isCustomComponentTag) {
9736 + // TODO: Handle wasCustomComponentTag
9737 + for (var i = 0; i < updatePayload.length; i += 2) {
9738 + var propKey = updatePayload[i];
9739 + var propValue = updatePayload[i + 1];
9740 +
9741 + if (propKey === STYLE) {
9742 + setValueForStyles(domElement, propValue);
9743 + } else if (propKey === DANGEROUSLY_SET_INNER_HTML) {
9744 + setInnerHTML(domElement, propValue);
9745 + } else if (propKey === CHILDREN) {
9746 + setTextContent(domElement, propValue);
9747 + } else {
9748 + setValueForProperty(domElement, propKey, propValue, isCustomComponentTag);
9749 + }
9750 + }
9751 + }
9752 +
9753 + function createElement(type, props, rootContainerElement, parentNamespace) {
9754 + var isCustomComponentTag; // We create tags in the namespace of their parent container, except HTML
9755 + // tags get no namespace.
9756 +
9757 + var ownerDocument = getOwnerDocumentFromRootContainer(rootContainerElement);
9758 + var domElement;
9759 + var namespaceURI = parentNamespace;
9760 +
9761 + if (namespaceURI === HTML_NAMESPACE) {
9762 + namespaceURI = getIntrinsicNamespace(type);
9763 + }
9764 +
9765 + if (namespaceURI === HTML_NAMESPACE) {
9766 + {
9767 + isCustomComponentTag = isCustomComponent(type, props); // Should this check be gated by parent namespace? Not sure we want to
9768 + // allow <SVG> or <mATH>.
9769 +
9770 + if (!isCustomComponentTag && type !== type.toLowerCase()) {
9771 + error('<%s /> is using incorrect casing. ' + 'Use PascalCase for React components, ' + 'or lowercase for HTML elements.', type);
9772 + }
9773 + }
9774 +
9775 + if (type === 'script') {
9776 + // Create the script via .innerHTML so its "parser-inserted" flag is
9777 + // set to true and it does not execute
9778 + var div = ownerDocument.createElement('div');
9779 +
9780 + div.innerHTML = '<script><' + '/script>'; // eslint-disable-line
9781 + // This is guaranteed to yield a script element.
9782 +
9783 + var firstChild = div.firstChild;
9784 + domElement = div.removeChild(firstChild);
9785 + } else if (typeof props.is === 'string') {
9786 + // $FlowIssue `createElement` should be updated for Web Components
9787 + domElement = ownerDocument.createElement(type, {
9788 + is: props.is
9789 + });
9790 + } else {
9791 + // Separate else branch instead of using `props.is || undefined` above because of a Firefox bug.
9792 + // See discussion in https://github.com/facebook/react/pull/6896
9793 + // and discussion in https://bugzilla.mozilla.org/show_bug.cgi?id=1276240
9794 + domElement = ownerDocument.createElement(type); // Normally attributes are assigned in `setInitialDOMProperties`, however the `multiple` and `size`
9795 + // attributes on `select`s needs to be added before `option`s are inserted.
9796 + // This prevents:
9797 + // - a bug where the `select` does not scroll to the correct option because singular
9798 + // `select` elements automatically pick the first item #13222
9799 + // - a bug where the `select` set the first item as selected despite the `size` attribute #14239
9800 + // See https://github.com/facebook/react/issues/13222
9801 + // and https://github.com/facebook/react/issues/14239
9802 +
9803 + if (type === 'select') {
9804 + var node = domElement;
9805 +
9806 + if (props.multiple) {
9807 + node.multiple = true;
9808 + } else if (props.size) {
9809 + // Setting a size greater than 1 causes a select to behave like `multiple=true`, where
9810 + // it is possible that no option is selected.
9811 + //
9812 + // This is only necessary when a select in "single selection mode".
9813 + node.size = props.size;
9814 + }
9815 + }
9816 + }
9817 + } else {
9818 + domElement = ownerDocument.createElementNS(namespaceURI, type);
9819 + }
9820 +
9821 + {
9822 + if (namespaceURI === HTML_NAMESPACE) {
9823 + if (!isCustomComponentTag && Object.prototype.toString.call(domElement) === '[object HTMLUnknownElement]' && !hasOwnProperty.call(warnedUnknownTags, type)) {
9824 + warnedUnknownTags[type] = true;
9825 +
9826 + error('The tag <%s> is unrecognized in this browser. ' + 'If you meant to render a React component, start its name with ' + 'an uppercase letter.', type);
9827 + }
9828 + }
9829 + }
9830 +
9831 + return domElement;
9832 + }
9833 + function createTextNode(text, rootContainerElement) {
9834 + return getOwnerDocumentFromRootContainer(rootContainerElement).createTextNode(text);
9835 + }
9836 + function setInitialProperties(domElement, tag, rawProps, rootContainerElement) {
9837 + var isCustomComponentTag = isCustomComponent(tag, rawProps);
9838 +
9839 + {
9840 + validatePropertiesInDevelopment(tag, rawProps);
9841 + } // TODO: Make sure that we check isMounted before firing any of these events.
9842 +
9843 +
9844 + var props;
9845 +
9846 + switch (tag) {
9847 + case 'dialog':
9848 + listenToNonDelegatedEvent('cancel', domElement);
9849 + listenToNonDelegatedEvent('close', domElement);
9850 + props = rawProps;
9851 + break;
9852 +
9853 + case 'iframe':
9854 + case 'object':
9855 + case 'embed':
9856 + // We listen to this event in case to ensure emulated bubble
9857 + // listeners still fire for the load event.
9858 + listenToNonDelegatedEvent('load', domElement);
9859 + props = rawProps;
9860 + break;
9861 +
9862 + case 'video':
9863 + case 'audio':
9864 + // We listen to these events in case to ensure emulated bubble
9865 + // listeners still fire for all the media events.
9866 + for (var i = 0; i < mediaEventTypes.length; i++) {
9867 + listenToNonDelegatedEvent(mediaEventTypes[i], domElement);
9868 + }
9869 +
9870 + props = rawProps;
9871 + break;
9872 +
9873 + case 'source':
9874 + // We listen to this event in case to ensure emulated bubble
9875 + // listeners still fire for the error event.
9876 + listenToNonDelegatedEvent('error', domElement);
9877 + props = rawProps;
9878 + break;
9879 +
9880 + case 'img':
9881 + case 'image':
9882 + case 'link':
9883 + // We listen to these events in case to ensure emulated bubble
9884 + // listeners still fire for error and load events.
9885 + listenToNonDelegatedEvent('error', domElement);
9886 + listenToNonDelegatedEvent('load', domElement);
9887 + props = rawProps;
9888 + break;
9889 +
9890 + case 'details':
9891 + // We listen to this event in case to ensure emulated bubble
9892 + // listeners still fire for the toggle event.
9893 + listenToNonDelegatedEvent('toggle', domElement);
9894 + props = rawProps;
9895 + break;
9896 +
9897 + case 'input':
9898 + initWrapperState(domElement, rawProps);
9899 + props = getHostProps(domElement, rawProps); // We listen to this event in case to ensure emulated bubble
9900 + // listeners still fire for the invalid event.
9901 +
9902 + listenToNonDelegatedEvent('invalid', domElement);
9903 + break;
9904 +
9905 + case 'option':
9906 + validateProps(domElement, rawProps);
9907 + props = rawProps;
9908 + break;
9909 +
9910 + case 'select':
9911 + initWrapperState$1(domElement, rawProps);
9912 + props = getHostProps$1(domElement, rawProps); // We listen to this event in case to ensure emulated bubble
9913 + // listeners still fire for the invalid event.
9914 +
9915 + listenToNonDelegatedEvent('invalid', domElement);
9916 + break;
9917 +
9918 + case 'textarea':
9919 + initWrapperState$2(domElement, rawProps);
9920 + props = getHostProps$2(domElement, rawProps); // We listen to this event in case to ensure emulated bubble
9921 + // listeners still fire for the invalid event.
9922 +
9923 + listenToNonDelegatedEvent('invalid', domElement);
9924 + break;
9925 +
9926 + default:
9927 + props = rawProps;
9928 + }
9929 +
9930 + assertValidProps(tag, props);
9931 + setInitialDOMProperties(tag, domElement, rootContainerElement, props, isCustomComponentTag);
9932 +
9933 + switch (tag) {
9934 + case 'input':
9935 + // TODO: Make sure we check if this is still unmounted or do any clean
9936 + // up necessary since we never stop tracking anymore.
9937 + track(domElement);
9938 + postMountWrapper(domElement, rawProps, false);
9939 + break;
9940 +
9941 + case 'textarea':
9942 + // TODO: Make sure we check if this is still unmounted or do any clean
9943 + // up necessary since we never stop tracking anymore.
9944 + track(domElement);
9945 + postMountWrapper$3(domElement);
9946 + break;
9947 +
9948 + case 'option':
9949 + postMountWrapper$1(domElement, rawProps);
9950 + break;
9951 +
9952 + case 'select':
9953 + postMountWrapper$2(domElement, rawProps);
9954 + break;
9955 +
9956 + default:
9957 + if (typeof props.onClick === 'function') {
9958 + // TODO: This cast may not be sound for SVG, MathML or custom elements.
9959 + trapClickOnNonInteractiveElement(domElement);
9960 + }
9961 +
9962 + break;
9963 + }
9964 + } // Calculate the diff between the two objects.
9965 +
9966 + function diffProperties(domElement, tag, lastRawProps, nextRawProps, rootContainerElement) {
9967 + {
9968 + validatePropertiesInDevelopment(tag, nextRawProps);
9969 + }
9970 +
9971 + var updatePayload = null;
9972 + var lastProps;
9973 + var nextProps;
9974 +
9975 + switch (tag) {
9976 + case 'input':
9977 + lastProps = getHostProps(domElement, lastRawProps);
9978 + nextProps = getHostProps(domElement, nextRawProps);
9979 + updatePayload = [];
9980 + break;
9981 +
9982 + case 'select':
9983 + lastProps = getHostProps$1(domElement, lastRawProps);
9984 + nextProps = getHostProps$1(domElement, nextRawProps);
9985 + updatePayload = [];
9986 + break;
9987 +
9988 + case 'textarea':
9989 + lastProps = getHostProps$2(domElement, lastRawProps);
9990 + nextProps = getHostProps$2(domElement, nextRawProps);
9991 + updatePayload = [];
9992 + break;
9993 +
9994 + default:
9995 + lastProps = lastRawProps;
9996 + nextProps = nextRawProps;
9997 +
9998 + if (typeof lastProps.onClick !== 'function' && typeof nextProps.onClick === 'function') {
9999 + // TODO: This cast may not be sound for SVG, MathML or custom elements.
10000 + trapClickOnNonInteractiveElement(domElement);
10001 + }
10002 +
10003 + break;
10004 + }
10005 +
10006 + assertValidProps(tag, nextProps);
10007 + var propKey;
10008 + var styleName;
10009 + var styleUpdates = null;
10010 +
10011 + for (propKey in lastProps) {
10012 + if (nextProps.hasOwnProperty(propKey) || !lastProps.hasOwnProperty(propKey) || lastProps[propKey] == null) {
10013 + continue;
10014 + }
10015 +
10016 + if (propKey === STYLE) {
10017 + var lastStyle = lastProps[propKey];
10018 +
10019 + for (styleName in lastStyle) {
10020 + if (lastStyle.hasOwnProperty(styleName)) {
10021 + if (!styleUpdates) {
10022 + styleUpdates = {};
10023 + }
10024 +
10025 + styleUpdates[styleName] = '';
10026 + }
10027 + }
10028 + } else if (propKey === DANGEROUSLY_SET_INNER_HTML || propKey === CHILDREN) ; else if (propKey === SUPPRESS_CONTENT_EDITABLE_WARNING || propKey === SUPPRESS_HYDRATION_WARNING) ; else if (propKey === AUTOFOCUS) ; else if (registrationNameDependencies.hasOwnProperty(propKey)) {
10029 + // This is a special case. If any listener updates we need to ensure
10030 + // that the "current" fiber pointer gets updated so we need a commit
10031 + // to update this element.
10032 + if (!updatePayload) {
10033 + updatePayload = [];
10034 + }
10035 + } else {
10036 + // For all other deleted properties we add it to the queue. We use
10037 + // the allowed property list in the commit phase instead.
10038 + (updatePayload = updatePayload || []).push(propKey, null);
10039 + }
10040 + }
10041 +
10042 + for (propKey in nextProps) {
10043 + var nextProp = nextProps[propKey];
10044 + var lastProp = lastProps != null ? lastProps[propKey] : undefined;
10045 +
10046 + if (!nextProps.hasOwnProperty(propKey) || nextProp === lastProp || nextProp == null && lastProp == null) {
10047 + continue;
10048 + }
10049 +
10050 + if (propKey === STYLE) {
10051 + {
10052 + if (nextProp) {
10053 + // Freeze the next style object so that we can assume it won't be
10054 + // mutated. We have already warned for this in the past.
10055 + Object.freeze(nextProp);
10056 + }
10057 + }
10058 +
10059 + if (lastProp) {
10060 + // Unset styles on `lastProp` but not on `nextProp`.
10061 + for (styleName in lastProp) {
10062 + if (lastProp.hasOwnProperty(styleName) && (!nextProp || !nextProp.hasOwnProperty(styleName))) {
10063 + if (!styleUpdates) {
10064 + styleUpdates = {};
10065 + }
10066 +
10067 + styleUpdates[styleName] = '';
10068 + }
10069 + } // Update styles that changed since `lastProp`.
10070 +
10071 +
10072 + for (styleName in nextProp) {
10073 + if (nextProp.hasOwnProperty(styleName) && lastProp[styleName] !== nextProp[styleName]) {
10074 + if (!styleUpdates) {
10075 + styleUpdates = {};
10076 + }
10077 +
10078 + styleUpdates[styleName] = nextProp[styleName];
10079 + }
10080 + }
10081 + } else {
10082 + // Relies on `updateStylesByID` not mutating `styleUpdates`.
10083 + if (!styleUpdates) {
10084 + if (!updatePayload) {
10085 + updatePayload = [];
10086 + }
10087 +
10088 + updatePayload.push(propKey, styleUpdates);
10089 + }
10090 +
10091 + styleUpdates = nextProp;
10092 + }
10093 + } else if (propKey === DANGEROUSLY_SET_INNER_HTML) {
10094 + var nextHtml = nextProp ? nextProp[HTML$1] : undefined;
10095 + var lastHtml = lastProp ? lastProp[HTML$1] : undefined;
10096 +
10097 + if (nextHtml != null) {
10098 + if (lastHtml !== nextHtml) {
10099 + (updatePayload = updatePayload || []).push(propKey, nextHtml);
10100 + }
10101 + }
10102 + } else if (propKey === CHILDREN) {
10103 + if (typeof nextProp === 'string' || typeof nextProp === 'number') {
10104 + (updatePayload = updatePayload || []).push(propKey, '' + nextProp);
10105 + }
10106 + } else if (propKey === SUPPRESS_CONTENT_EDITABLE_WARNING || propKey === SUPPRESS_HYDRATION_WARNING) ; else if (registrationNameDependencies.hasOwnProperty(propKey)) {
10107 + if (nextProp != null) {
10108 + // We eagerly listen to this even though we haven't committed yet.
10109 + if ( typeof nextProp !== 'function') {
10110 + warnForInvalidEventListener(propKey, nextProp);
10111 + }
10112 +
10113 + if (propKey === 'onScroll') {
10114 + listenToNonDelegatedEvent('scroll', domElement);
10115 + }
10116 + }
10117 +
10118 + if (!updatePayload && lastProp !== nextProp) {
10119 + // This is a special case. If any listener updates we need to ensure
10120 + // that the "current" props pointer gets updated so we need a commit
10121 + // to update this element.
10122 + updatePayload = [];
10123 + }
10124 + } else {
10125 + // For any other property we always add it to the queue and then we
10126 + // filter it out using the allowed property list during the commit.
10127 + (updatePayload = updatePayload || []).push(propKey, nextProp);
10128 + }
10129 + }
10130 +
10131 + if (styleUpdates) {
10132 + {
10133 + validateShorthandPropertyCollisionInDev(styleUpdates, nextProps[STYLE]);
10134 + }
10135 +
10136 + (updatePayload = updatePayload || []).push(STYLE, styleUpdates);
10137 + }
10138 +
10139 + return updatePayload;
10140 + } // Apply the diff.
10141 +
10142 + function updateProperties(domElement, updatePayload, tag, lastRawProps, nextRawProps) {
10143 + // Update checked *before* name.
10144 + // In the middle of an update, it is possible to have multiple checked.
10145 + // When a checked radio tries to change name, browser makes another radio's checked false.
10146 + if (tag === 'input' && nextRawProps.type === 'radio' && nextRawProps.name != null) {
10147 + updateChecked(domElement, nextRawProps);
10148 + }
10149 +
10150 + var wasCustomComponentTag = isCustomComponent(tag, lastRawProps);
10151 + var isCustomComponentTag = isCustomComponent(tag, nextRawProps); // Apply the diff.
10152 +
10153 + updateDOMProperties(domElement, updatePayload, wasCustomComponentTag, isCustomComponentTag); // TODO: Ensure that an update gets scheduled if any of the special props
10154 + // changed.
10155 +
10156 + switch (tag) {
10157 + case 'input':
10158 + // Update the wrapper around inputs *after* updating props. This has to
10159 + // happen after `updateDOMProperties`. Otherwise HTML5 input validations
10160 + // raise warnings and prevent the new value from being assigned.
10161 + updateWrapper(domElement, nextRawProps);
10162 + break;
10163 +
10164 + case 'textarea':
10165 + updateWrapper$1(domElement, nextRawProps);
10166 + break;
10167 +
10168 + case 'select':
10169 + // <select> value update needs to occur after <option> children
10170 + // reconciliation
10171 + postUpdateWrapper(domElement, nextRawProps);
10172 + break;
10173 + }
10174 + }
10175 +
10176 + function getPossibleStandardName(propName) {
10177 + {
10178 + var lowerCasedName = propName.toLowerCase();
10179 +
10180 + if (!possibleStandardNames.hasOwnProperty(lowerCasedName)) {
10181 + return null;
10182 + }
10183 +
10184 + return possibleStandardNames[lowerCasedName] || null;
10185 + }
10186 + }
10187 +
10188 + function diffHydratedProperties(domElement, tag, rawProps, parentNamespace, rootContainerElement, isConcurrentMode, shouldWarnDev) {
10189 + var isCustomComponentTag;
10190 + var extraAttributeNames;
10191 +
10192 + {
10193 + isCustomComponentTag = isCustomComponent(tag, rawProps);
10194 + validatePropertiesInDevelopment(tag, rawProps);
10195 + } // TODO: Make sure that we check isMounted before firing any of these events.
10196 +
10197 +
10198 + switch (tag) {
10199 + case 'dialog':
10200 + listenToNonDelegatedEvent('cancel', domElement);
10201 + listenToNonDelegatedEvent('close', domElement);
10202 + break;
10203 +
10204 + case 'iframe':
10205 + case 'object':
10206 + case 'embed':
10207 + // We listen to this event in case to ensure emulated bubble
10208 + // listeners still fire for the load event.
10209 + listenToNonDelegatedEvent('load', domElement);
10210 + break;
10211 +
10212 + case 'video':
10213 + case 'audio':
10214 + // We listen to these events in case to ensure emulated bubble
10215 + // listeners still fire for all the media events.
10216 + for (var i = 0; i < mediaEventTypes.length; i++) {
10217 + listenToNonDelegatedEvent(mediaEventTypes[i], domElement);
10218 + }
10219 +
10220 + break;
10221 +
10222 + case 'source':
10223 + // We listen to this event in case to ensure emulated bubble
10224 + // listeners still fire for the error event.
10225 + listenToNonDelegatedEvent('error', domElement);
10226 + break;
10227 +
10228 + case 'img':
10229 + case 'image':
10230 + case 'link':
10231 + // We listen to these events in case to ensure emulated bubble
10232 + // listeners still fire for error and load events.
10233 + listenToNonDelegatedEvent('error', domElement);
10234 + listenToNonDelegatedEvent('load', domElement);
10235 + break;
10236 +
10237 + case 'details':
10238 + // We listen to this event in case to ensure emulated bubble
10239 + // listeners still fire for the toggle event.
10240 + listenToNonDelegatedEvent('toggle', domElement);
10241 + break;
10242 +
10243 + case 'input':
10244 + initWrapperState(domElement, rawProps); // We listen to this event in case to ensure emulated bubble
10245 + // listeners still fire for the invalid event.
10246 +
10247 + listenToNonDelegatedEvent('invalid', domElement);
10248 + break;
10249 +
10250 + case 'option':
10251 + validateProps(domElement, rawProps);
10252 + break;
10253 +
10254 + case 'select':
10255 + initWrapperState$1(domElement, rawProps); // We listen to this event in case to ensure emulated bubble
10256 + // listeners still fire for the invalid event.
10257 +
10258 + listenToNonDelegatedEvent('invalid', domElement);
10259 + break;
10260 +
10261 + case 'textarea':
10262 + initWrapperState$2(domElement, rawProps); // We listen to this event in case to ensure emulated bubble
10263 + // listeners still fire for the invalid event.
10264 +
10265 + listenToNonDelegatedEvent('invalid', domElement);
10266 + break;
10267 + }
10268 +
10269 + assertValidProps(tag, rawProps);
10270 +
10271 + {
10272 + extraAttributeNames = new Set();
10273 + var attributes = domElement.attributes;
10274 +
10275 + for (var _i = 0; _i < attributes.length; _i++) {
10276 + var name = attributes[_i].name.toLowerCase();
10277 +
10278 + switch (name) {
10279 + // Controlled attributes are not validated
10280 + // TODO: Only ignore them on controlled tags.
10281 + case 'value':
10282 + break;
10283 +
10284 + case 'checked':
10285 + break;
10286 +
10287 + case 'selected':
10288 + break;
10289 +
10290 + default:
10291 + // Intentionally use the original name.
10292 + // See discussion in https://github.com/facebook/react/pull/10676.
10293 + extraAttributeNames.add(attributes[_i].name);
10294 + }
10295 + }
10296 + }
10297 +
10298 + var updatePayload = null;
10299 +
10300 + for (var propKey in rawProps) {
10301 + if (!rawProps.hasOwnProperty(propKey)) {
10302 + continue;
10303 + }
10304 +
10305 + var nextProp = rawProps[propKey];
10306 +
10307 + if (propKey === CHILDREN) {
10308 + // For text content children we compare against textContent. This
10309 + // might match additional HTML that is hidden when we read it using
10310 + // textContent. E.g. "foo" will match "f<span>oo</span>" but that still
10311 + // satisfies our requirement. Our requirement is not to produce perfect
10312 + // HTML and attributes. Ideally we should preserve structure but it's
10313 + // ok not to if the visible content is still enough to indicate what
10314 + // even listeners these nodes might be wired up to.
10315 + // TODO: Warn if there is more than a single textNode as a child.
10316 + // TODO: Should we use domElement.firstChild.nodeValue to compare?
10317 + if (typeof nextProp === 'string') {
10318 + if (domElement.textContent !== nextProp) {
10319 + if (rawProps[SUPPRESS_HYDRATION_WARNING] !== true) {
10320 + checkForUnmatchedText(domElement.textContent, nextProp, isConcurrentMode, shouldWarnDev);
10321 + }
10322 +
10323 + updatePayload = [CHILDREN, nextProp];
10324 + }
10325 + } else if (typeof nextProp === 'number') {
10326 + if (domElement.textContent !== '' + nextProp) {
10327 + if (rawProps[SUPPRESS_HYDRATION_WARNING] !== true) {
10328 + checkForUnmatchedText(domElement.textContent, nextProp, isConcurrentMode, shouldWarnDev);
10329 + }
10330 +
10331 + updatePayload = [CHILDREN, '' + nextProp];
10332 + }
10333 + }
10334 + } else if (registrationNameDependencies.hasOwnProperty(propKey)) {
10335 + if (nextProp != null) {
10336 + if ( typeof nextProp !== 'function') {
10337 + warnForInvalidEventListener(propKey, nextProp);
10338 + }
10339 +
10340 + if (propKey === 'onScroll') {
10341 + listenToNonDelegatedEvent('scroll', domElement);
10342 + }
10343 + }
10344 + } else if (shouldWarnDev && true && // Convince Flow we've calculated it (it's DEV-only in this method.)
10345 + typeof isCustomComponentTag === 'boolean') {
10346 + // Validate that the properties correspond to their expected values.
10347 + var serverValue = void 0;
10348 + var propertyInfo = isCustomComponentTag && enableCustomElementPropertySupport ? null : getPropertyInfo(propKey);
10349 +
10350 + if (rawProps[SUPPRESS_HYDRATION_WARNING] === true) ; else if (propKey === SUPPRESS_CONTENT_EDITABLE_WARNING || propKey === SUPPRESS_HYDRATION_WARNING || // Controlled attributes are not validated
10351 + // TODO: Only ignore them on controlled tags.
10352 + propKey === 'value' || propKey === 'checked' || propKey === 'selected') ; else if (propKey === DANGEROUSLY_SET_INNER_HTML) {
10353 + var serverHTML = domElement.innerHTML;
10354 + var nextHtml = nextProp ? nextProp[HTML$1] : undefined;
10355 +
10356 + if (nextHtml != null) {
10357 + var expectedHTML = normalizeHTML(domElement, nextHtml);
10358 +
10359 + if (expectedHTML !== serverHTML) {
10360 + warnForPropDifference(propKey, serverHTML, expectedHTML);
10361 + }
10362 + }
10363 + } else if (propKey === STYLE) {
10364 + // $FlowFixMe - Should be inferred as not undefined.
10365 + extraAttributeNames.delete(propKey);
10366 +
10367 + if (canDiffStyleForHydrationWarning) {
10368 + var expectedStyle = createDangerousStringForStyles(nextProp);
10369 + serverValue = domElement.getAttribute('style');
10370 +
10371 + if (expectedStyle !== serverValue) {
10372 + warnForPropDifference(propKey, serverValue, expectedStyle);
10373 + }
10374 + }
10375 + } else if (isCustomComponentTag && !enableCustomElementPropertySupport) {
10376 + // $FlowFixMe - Should be inferred as not undefined.
10377 + extraAttributeNames.delete(propKey.toLowerCase());
10378 + serverValue = getValueForAttribute(domElement, propKey, nextProp);
10379 +
10380 + if (nextProp !== serverValue) {
10381 + warnForPropDifference(propKey, serverValue, nextProp);
10382 + }
10383 + } else if (!shouldIgnoreAttribute(propKey, propertyInfo, isCustomComponentTag) && !shouldRemoveAttribute(propKey, nextProp, propertyInfo, isCustomComponentTag)) {
10384 + var isMismatchDueToBadCasing = false;
10385 +
10386 + if (propertyInfo !== null) {
10387 + // $FlowFixMe - Should be inferred as not undefined.
10388 + extraAttributeNames.delete(propertyInfo.attributeName);
10389 + serverValue = getValueForProperty(domElement, propKey, nextProp, propertyInfo);
10390 + } else {
10391 + var ownNamespace = parentNamespace;
10392 +
10393 + if (ownNamespace === HTML_NAMESPACE) {
10394 + ownNamespace = getIntrinsicNamespace(tag);
10395 + }
10396 +
10397 + if (ownNamespace === HTML_NAMESPACE) {
10398 + // $FlowFixMe - Should be inferred as not undefined.
10399 + extraAttributeNames.delete(propKey.toLowerCase());
10400 + } else {
10401 + var standardName = getPossibleStandardName(propKey);
10402 +
10403 + if (standardName !== null && standardName !== propKey) {
10404 + // If an SVG prop is supplied with bad casing, it will
10405 + // be successfully parsed from HTML, but will produce a mismatch
10406 + // (and would be incorrectly rendered on the client).
10407 + // However, we already warn about bad casing elsewhere.
10408 + // So we'll skip the misleading extra mismatch warning in this case.
10409 + isMismatchDueToBadCasing = true; // $FlowFixMe - Should be inferred as not undefined.
10410 +
10411 + extraAttributeNames.delete(standardName);
10412 + } // $FlowFixMe - Should be inferred as not undefined.
10413 +
10414 +
10415 + extraAttributeNames.delete(propKey);
10416 + }
10417 +
10418 + serverValue = getValueForAttribute(domElement, propKey, nextProp);
10419 + }
10420 +
10421 + var dontWarnCustomElement = enableCustomElementPropertySupport ;
10422 +
10423 + if (!dontWarnCustomElement && nextProp !== serverValue && !isMismatchDueToBadCasing) {
10424 + warnForPropDifference(propKey, serverValue, nextProp);
10425 + }
10426 + }
10427 + }
10428 + }
10429 +
10430 + {
10431 + if (shouldWarnDev) {
10432 + if ( // $FlowFixMe - Should be inferred as not undefined.
10433 + extraAttributeNames.size > 0 && rawProps[SUPPRESS_HYDRATION_WARNING] !== true) {
10434 + // $FlowFixMe - Should be inferred as not undefined.
10435 + warnForExtraAttributes(extraAttributeNames);
10436 + }
10437 + }
10438 + }
10439 +
10440 + switch (tag) {
10441 + case 'input':
10442 + // TODO: Make sure we check if this is still unmounted or do any clean
10443 + // up necessary since we never stop tracking anymore.
10444 + track(domElement);
10445 + postMountWrapper(domElement, rawProps, true);
10446 + break;
10447 +
10448 + case 'textarea':
10449 + // TODO: Make sure we check if this is still unmounted or do any clean
10450 + // up necessary since we never stop tracking anymore.
10451 + track(domElement);
10452 + postMountWrapper$3(domElement);
10453 + break;
10454 +
10455 + case 'select':
10456 + case 'option':
10457 + // For input and textarea we current always set the value property at
10458 + // post mount to force it to diverge from attributes. However, for
10459 + // option and select we don't quite do the same thing and select
10460 + // is not resilient to the DOM state changing so we don't do that here.
10461 + // TODO: Consider not doing this for input and textarea.
10462 + break;
10463 +
10464 + default:
10465 + if (typeof rawProps.onClick === 'function') {
10466 + // TODO: This cast may not be sound for SVG, MathML or custom elements.
10467 + trapClickOnNonInteractiveElement(domElement);
10468 + }
10469 +
10470 + break;
10471 + }
10472 +
10473 + return updatePayload;
10474 + }
10475 + function diffHydratedText(textNode, text, isConcurrentMode) {
10476 + var isDifferent = textNode.nodeValue !== text;
10477 + return isDifferent;
10478 + }
10479 + function warnForDeletedHydratableElement(parentNode, child) {
10480 + {
10481 + if (didWarnInvalidHydration) {
10482 + return;
10483 + }
10484 +
10485 + didWarnInvalidHydration = true;
10486 +
10487 + error('Did not expect server HTML to contain a <%s> in <%s>.', child.nodeName.toLowerCase(), parentNode.nodeName.toLowerCase());
10488 + }
10489 + }
10490 + function warnForDeletedHydratableText(parentNode, child) {
10491 + {
10492 + if (didWarnInvalidHydration) {
10493 + return;
10494 + }
10495 +
10496 + didWarnInvalidHydration = true;
10497 +
10498 + error('Did not expect server HTML to contain the text node "%s" in <%s>.', child.nodeValue, parentNode.nodeName.toLowerCase());
10499 + }
10500 + }
10501 + function warnForInsertedHydratedElement(parentNode, tag, props) {
10502 + {
10503 + if (didWarnInvalidHydration) {
10504 + return;
10505 + }
10506 +
10507 + didWarnInvalidHydration = true;
10508 +
10509 + error('Expected server HTML to contain a matching <%s> in <%s>.', tag, parentNode.nodeName.toLowerCase());
10510 + }
10511 + }
10512 + function warnForInsertedHydratedText(parentNode, text) {
10513 + {
10514 + if (text === '') {
10515 + // We expect to insert empty text nodes since they're not represented in
10516 + // the HTML.
10517 + // TODO: Remove this special case if we can just avoid inserting empty
10518 + // text nodes.
10519 + return;
10520 + }
10521 +
10522 + if (didWarnInvalidHydration) {
10523 + return;
10524 + }
10525 +
10526 + didWarnInvalidHydration = true;
10527 +
10528 + error('Expected server HTML to contain a matching text node for "%s" in <%s>.', text, parentNode.nodeName.toLowerCase());
10529 + }
10530 + }
10531 + function restoreControlledState$3(domElement, tag, props) {
10532 + switch (tag) {
10533 + case 'input':
10534 + restoreControlledState(domElement, props);
10535 + return;
10536 +
10537 + case 'textarea':
10538 + restoreControlledState$2(domElement, props);
10539 + return;
10540 +
10541 + case 'select':
10542 + restoreControlledState$1(domElement, props);
10543 + return;
10544 + }
10545 + }
10546 +
10547 + var validateDOMNesting = function () {};
10548 +
10549 + var updatedAncestorInfo = function () {};
10550 +
10551 + {
10552 + // This validation code was written based on the HTML5 parsing spec:
10553 + // https://html.spec.whatwg.org/multipage/syntax.html#has-an-element-in-scope
10554 + //
10555 + // Note: this does not catch all invalid nesting, nor does it try to (as it's
10556 + // not clear what practical benefit doing so provides); instead, we warn only
10557 + // for cases where the parser will give a parse tree differing from what React
10558 + // intended. For example, <b><div></div></b> is invalid but we don't warn
10559 + // because it still parses correctly; we do warn for other cases like nested
10560 + // <p> tags where the beginning of the second element implicitly closes the
10561 + // first, causing a confusing mess.
10562 + // https://html.spec.whatwg.org/multipage/syntax.html#special
10563 + var specialTags = ['address', 'applet', 'area', 'article', 'aside', 'base', 'basefont', 'bgsound', 'blockquote', 'body', 'br', 'button', 'caption', 'center', 'col', 'colgroup', 'dd', 'details', 'dir', 'div', 'dl', 'dt', 'embed', 'fieldset', 'figcaption', 'figure', 'footer', 'form', 'frame', 'frameset', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'head', 'header', 'hgroup', 'hr', 'html', 'iframe', 'img', 'input', 'isindex', 'li', 'link', 'listing', 'main', 'marquee', 'menu', 'menuitem', 'meta', 'nav', 'noembed', 'noframes', 'noscript', 'object', 'ol', 'p', 'param', 'plaintext', 'pre', 'script', 'section', 'select', 'source', 'style', 'summary', 'table', 'tbody', 'td', 'template', 'textarea', 'tfoot', 'th', 'thead', 'title', 'tr', 'track', 'ul', 'wbr', 'xmp']; // https://html.spec.whatwg.org/multipage/syntax.html#has-an-element-in-scope
10564 +
10565 + var inScopeTags = ['applet', 'caption', 'html', 'table', 'td', 'th', 'marquee', 'object', 'template', // https://html.spec.whatwg.org/multipage/syntax.html#html-integration-point
10566 + // TODO: Distinguish by namespace here -- for <title>, including it here
10567 + // errs on the side of fewer warnings
10568 + 'foreignObject', 'desc', 'title']; // https://html.spec.whatwg.org/multipage/syntax.html#has-an-element-in-button-scope
10569 +
10570 + var buttonScopeTags = inScopeTags.concat(['button']); // https://html.spec.whatwg.org/multipage/syntax.html#generate-implied-end-tags
10571 +
10572 + var impliedEndTags = ['dd', 'dt', 'li', 'option', 'optgroup', 'p', 'rp', 'rt'];
10573 + var emptyAncestorInfo = {
10574 + current: null,
10575 + formTag: null,
10576 + aTagInScope: null,
10577 + buttonTagInScope: null,
10578 + nobrTagInScope: null,
10579 + pTagInButtonScope: null,
10580 + listItemTagAutoclosing: null,
10581 + dlItemTagAutoclosing: null
10582 + };
10583 +
10584 + updatedAncestorInfo = function (oldInfo, tag) {
10585 + var ancestorInfo = assign({}, oldInfo || emptyAncestorInfo);
10586 +
10587 + var info = {
10588 + tag: tag
10589 + };
10590 +
10591 + if (inScopeTags.indexOf(tag) !== -1) {
10592 + ancestorInfo.aTagInScope = null;
10593 + ancestorInfo.buttonTagInScope = null;
10594 + ancestorInfo.nobrTagInScope = null;
10595 + }
10596 +
10597 + if (buttonScopeTags.indexOf(tag) !== -1) {
10598 + ancestorInfo.pTagInButtonScope = null;
10599 + } // See rules for 'li', 'dd', 'dt' start tags in
10600 + // https://html.spec.whatwg.org/multipage/syntax.html#parsing-main-inbody
10601 +
10602 +
10603 + if (specialTags.indexOf(tag) !== -1 && tag !== 'address' && tag !== 'div' && tag !== 'p') {
10604 + ancestorInfo.listItemTagAutoclosing = null;
10605 + ancestorInfo.dlItemTagAutoclosing = null;
10606 + }
10607 +
10608 + ancestorInfo.current = info;
10609 +
10610 + if (tag === 'form') {
10611 + ancestorInfo.formTag = info;
10612 + }
10613 +
10614 + if (tag === 'a') {
10615 + ancestorInfo.aTagInScope = info;
10616 + }
10617 +
10618 + if (tag === 'button') {
10619 + ancestorInfo.buttonTagInScope = info;
10620 + }
10621 +
10622 + if (tag === 'nobr') {
10623 + ancestorInfo.nobrTagInScope = info;
10624 + }
10625 +
10626 + if (tag === 'p') {
10627 + ancestorInfo.pTagInButtonScope = info;
10628 + }
10629 +
10630 + if (tag === 'li') {
10631 + ancestorInfo.listItemTagAutoclosing = info;
10632 + }
10633 +
10634 + if (tag === 'dd' || tag === 'dt') {
10635 + ancestorInfo.dlItemTagAutoclosing = info;
10636 + }
10637 +
10638 + return ancestorInfo;
10639 + };
10640 + /**
10641 + * Returns whether
10642 + */
10643 +
10644 +
10645 + var isTagValidWithParent = function (tag, parentTag) {
10646 + // First, let's check if we're in an unusual parsing mode...
10647 + switch (parentTag) {
10648 + // https://html.spec.whatwg.org/multipage/syntax.html#parsing-main-inselect
10649 + case 'select':
10650 + return tag === 'option' || tag === 'optgroup' || tag === '#text';
10651 +
10652 + case 'optgroup':
10653 + return tag === 'option' || tag === '#text';
10654 + // Strictly speaking, seeing an <option> doesn't mean we're in a <select>
10655 + // but
10656 +
10657 + case 'option':
10658 + return tag === '#text';
10659 + // https://html.spec.whatwg.org/multipage/syntax.html#parsing-main-intd
10660 + // https://html.spec.whatwg.org/multipage/syntax.html#parsing-main-incaption
10661 + // No special behavior since these rules fall back to "in body" mode for
10662 + // all except special table nodes which cause bad parsing behavior anyway.
10663 + // https://html.spec.whatwg.org/multipage/syntax.html#parsing-main-intr
10664 +
10665 + case 'tr':
10666 + return tag === 'th' || tag === 'td' || tag === 'style' || tag === 'script' || tag === 'template';
10667 + // https://html.spec.whatwg.org/multipage/syntax.html#parsing-main-intbody
10668 +
10669 + case 'tbody':
10670 + case 'thead':
10671 + case 'tfoot':
10672 + return tag === 'tr' || tag === 'style' || tag === 'script' || tag === 'template';
10673 + // https://html.spec.whatwg.org/multipage/syntax.html#parsing-main-incolgroup
10674 +
10675 + case 'colgroup':
10676 + return tag === 'col' || tag === 'template';
10677 + // https://html.spec.whatwg.org/multipage/syntax.html#parsing-main-intable
10678 +
10679 + case 'table':
10680 + return tag === 'caption' || tag === 'colgroup' || tag === 'tbody' || tag === 'tfoot' || tag === 'thead' || tag === 'style' || tag === 'script' || tag === 'template';
10681 + // https://html.spec.whatwg.org/multipage/syntax.html#parsing-main-inhead
10682 +
10683 + case 'head':
10684 + return tag === 'base' || tag === 'basefont' || tag === 'bgsound' || tag === 'link' || tag === 'meta' || tag === 'title' || tag === 'noscript' || tag === 'noframes' || tag === 'style' || tag === 'script' || tag === 'template';
10685 + // https://html.spec.whatwg.org/multipage/semantics.html#the-html-element
10686 +
10687 + case 'html':
10688 + return tag === 'head' || tag === 'body' || tag === 'frameset';
10689 +
10690 + case 'frameset':
10691 + return tag === 'frame';
10692 +
10693 + case '#document':
10694 + return tag === 'html';
10695 + } // Probably in the "in body" parsing mode, so we outlaw only tag combos
10696 + // where the parsing rules cause implicit opens or closes to be added.
10697 + // https://html.spec.whatwg.org/multipage/syntax.html#parsing-main-inbody
10698 +
10699 +
10700 + switch (tag) {
10701 + case 'h1':
10702 + case 'h2':
10703 + case 'h3':
10704 + case 'h4':
10705 + case 'h5':
10706 + case 'h6':
10707 + return parentTag !== 'h1' && parentTag !== 'h2' && parentTag !== 'h3' && parentTag !== 'h4' && parentTag !== 'h5' && parentTag !== 'h6';
10708 +
10709 + case 'rp':
10710 + case 'rt':
10711 + return impliedEndTags.indexOf(parentTag) === -1;
10712 +
10713 + case 'body':
10714 + case 'caption':
10715 + case 'col':
10716 + case 'colgroup':
10717 + case 'frameset':
10718 + case 'frame':
10719 + case 'head':
10720 + case 'html':
10721 + case 'tbody':
10722 + case 'td':
10723 + case 'tfoot':
10724 + case 'th':
10725 + case 'thead':
10726 + case 'tr':
10727 + // These tags are only valid with a few parents that have special child
10728 + // parsing rules -- if we're down here, then none of those matched and
10729 + // so we allow it only if we don't know what the parent is, as all other
10730 + // cases are invalid.
10731 + return parentTag == null;
10732 + }
10733 +
10734 + return true;
10735 + };
10736 + /**
10737 + * Returns whether
10738 + */
10739 +
10740 +
10741 + var findInvalidAncestorForTag = function (tag, ancestorInfo) {
10742 + switch (tag) {
10743 + case 'address':
10744 + case 'article':
10745 + case 'aside':
10746 + case 'blockquote':
10747 + case 'center':
10748 + case 'details':
10749 + case 'dialog':
10750 + case 'dir':
10751 + case 'div':
10752 + case 'dl':
10753 + case 'fieldset':
10754 + case 'figcaption':
10755 + case 'figure':
10756 + case 'footer':
10757 + case 'header':
10758 + case 'hgroup':
10759 + case 'main':
10760 + case 'menu':
10761 + case 'nav':
10762 + case 'ol':
10763 + case 'p':
10764 + case 'section':
10765 + case 'summary':
10766 + case 'ul':
10767 + case 'pre':
10768 + case 'listing':
10769 + case 'table':
10770 + case 'hr':
10771 + case 'xmp':
10772 + case 'h1':
10773 + case 'h2':
10774 + case 'h3':
10775 + case 'h4':
10776 + case 'h5':
10777 + case 'h6':
10778 + return ancestorInfo.pTagInButtonScope;
10779 +
10780 + case 'form':
10781 + return ancestorInfo.formTag || ancestorInfo.pTagInButtonScope;
10782 +
10783 + case 'li':
10784 + return ancestorInfo.listItemTagAutoclosing;
10785 +
10786 + case 'dd':
10787 + case 'dt':
10788 + return ancestorInfo.dlItemTagAutoclosing;
10789 +
10790 + case 'button':
10791 + return ancestorInfo.buttonTagInScope;
10792 +
10793 + case 'a':
10794 + // Spec says something about storing a list of markers, but it sounds
10795 + // equivalent to this check.
10796 + return ancestorInfo.aTagInScope;
10797 +
10798 + case 'nobr':
10799 + return ancestorInfo.nobrTagInScope;
10800 + }
10801 +
10802 + return null;
10803 + };
10804 +
10805 + var didWarn$1 = {};
10806 +
10807 + validateDOMNesting = function (childTag, childText, ancestorInfo) {
10808 + ancestorInfo = ancestorInfo || emptyAncestorInfo;
10809 + var parentInfo = ancestorInfo.current;
10810 + var parentTag = parentInfo && parentInfo.tag;
10811 +
10812 + if (childText != null) {
10813 + if (childTag != null) {
10814 + error('validateDOMNesting: when childText is passed, childTag should be null');
10815 + }
10816 +
10817 + childTag = '#text';
10818 + }
10819 +
10820 + var invalidParent = isTagValidWithParent(childTag, parentTag) ? null : parentInfo;
10821 + var invalidAncestor = invalidParent ? null : findInvalidAncestorForTag(childTag, ancestorInfo);
10822 + var invalidParentOrAncestor = invalidParent || invalidAncestor;
10823 +
10824 + if (!invalidParentOrAncestor) {
10825 + return;
10826 + }
10827 +
10828 + var ancestorTag = invalidParentOrAncestor.tag;
10829 + var warnKey = !!invalidParent + '|' + childTag + '|' + ancestorTag;
10830 +
10831 + if (didWarn$1[warnKey]) {
10832 + return;
10833 + }
10834 +
10835 + didWarn$1[warnKey] = true;
10836 + var tagDisplayName = childTag;
10837 + var whitespaceInfo = '';
10838 +
10839 + if (childTag === '#text') {
10840 + if (/\S/.test(childText)) {
10841 + tagDisplayName = 'Text nodes';
10842 + } else {
10843 + tagDisplayName = 'Whitespace text nodes';
10844 + whitespaceInfo = " Make sure you don't have any extra whitespace between tags on " + 'each line of your source code.';
10845 + }
10846 + } else {
10847 + tagDisplayName = '<' + childTag + '>';
10848 + }
10849 +
10850 + if (invalidParent) {
10851 + var info = '';
10852 +
10853 + if (ancestorTag === 'table' && childTag === 'tr') {
10854 + info += ' Add a <tbody>, <thead> or <tfoot> to your code to match the DOM tree generated by ' + 'the browser.';
10855 + }
10856 +
10857 + error('validateDOMNesting(...): %s cannot appear as a child of <%s>.%s%s', tagDisplayName, ancestorTag, whitespaceInfo, info);
10858 + } else {
10859 + error('validateDOMNesting(...): %s cannot appear as a descendant of ' + '<%s>.', tagDisplayName, ancestorTag);
10860 + }
10861 + };
10862 + }
10863 +
10864 + var SUPPRESS_HYDRATION_WARNING$1 = 'suppressHydrationWarning';
10865 + var SUSPENSE_START_DATA = '$';
10866 + var SUSPENSE_END_DATA = '/$';
10867 + var SUSPENSE_PENDING_START_DATA = '$?';
10868 + var SUSPENSE_FALLBACK_START_DATA = '$!';
10869 + var STYLE$1 = 'style';
10870 + var eventsEnabled = null;
10871 + var selectionInformation = null;
10872 + function getRootHostContext(rootContainerInstance) {
10873 + var type;
10874 + var namespace;
10875 + var nodeType = rootContainerInstance.nodeType;
10876 +
10877 + switch (nodeType) {
10878 + case DOCUMENT_NODE:
10879 + case DOCUMENT_FRAGMENT_NODE:
10880 + {
10881 + type = nodeType === DOCUMENT_NODE ? '#document' : '#fragment';
10882 + var root = rootContainerInstance.documentElement;
10883 + namespace = root ? root.namespaceURI : getChildNamespace(null, '');
10884 + break;
10885 + }
10886 +
10887 + default:
10888 + {
10889 + var container = nodeType === COMMENT_NODE ? rootContainerInstance.parentNode : rootContainerInstance;
10890 + var ownNamespace = container.namespaceURI || null;
10891 + type = container.tagName;
10892 + namespace = getChildNamespace(ownNamespace, type);
10893 + break;
10894 + }
10895 + }
10896 +
10897 + {
10898 + var validatedTag = type.toLowerCase();
10899 + var ancestorInfo = updatedAncestorInfo(null, validatedTag);
10900 + return {
10901 + namespace: namespace,
10902 + ancestorInfo: ancestorInfo
10903 + };
10904 + }
10905 + }
10906 + function getChildHostContext(parentHostContext, type, rootContainerInstance) {
10907 + {
10908 + var parentHostContextDev = parentHostContext;
10909 + var namespace = getChildNamespace(parentHostContextDev.namespace, type);
10910 + var ancestorInfo = updatedAncestorInfo(parentHostContextDev.ancestorInfo, type);
10911 + return {
10912 + namespace: namespace,
10913 + ancestorInfo: ancestorInfo
10914 + };
10915 + }
10916 + }
10917 + function getPublicInstance(instance) {
10918 + return instance;
10919 + }
10920 + function prepareForCommit(containerInfo) {
10921 + eventsEnabled = isEnabled();
10922 + selectionInformation = getSelectionInformation();
10923 + var activeInstance = null;
10924 +
10925 + setEnabled(false);
10926 + return activeInstance;
10927 + }
10928 + function resetAfterCommit(containerInfo) {
10929 + restoreSelection(selectionInformation);
10930 + setEnabled(eventsEnabled);
10931 + eventsEnabled = null;
10932 + selectionInformation = null;
10933 + }
10934 + function createInstance(type, props, rootContainerInstance, hostContext, internalInstanceHandle) {
10935 + var parentNamespace;
10936 +
10937 + {
10938 + // TODO: take namespace into account when validating.
10939 + var hostContextDev = hostContext;
10940 + validateDOMNesting(type, null, hostContextDev.ancestorInfo);
10941 +
10942 + if (typeof props.children === 'string' || typeof props.children === 'number') {
10943 + var string = '' + props.children;
10944 + var ownAncestorInfo = updatedAncestorInfo(hostContextDev.ancestorInfo, type);
10945 + validateDOMNesting(null, string, ownAncestorInfo);
10946 + }
10947 +
10948 + parentNamespace = hostContextDev.namespace;
10949 + }
10950 +
10951 + var domElement = createElement(type, props, rootContainerInstance, parentNamespace);
10952 + precacheFiberNode(internalInstanceHandle, domElement);
10953 + updateFiberProps(domElement, props);
10954 + return domElement;
10955 + }
10956 + function appendInitialChild(parentInstance, child) {
10957 + parentInstance.appendChild(child);
10958 + }
10959 + function finalizeInitialChildren(domElement, type, props, rootContainerInstance, hostContext) {
10960 + setInitialProperties(domElement, type, props, rootContainerInstance);
10961 +
10962 + switch (type) {
10963 + case 'button':
10964 + case 'input':
10965 + case 'select':
10966 + case 'textarea':
10967 + return !!props.autoFocus;
10968 +
10969 + case 'img':
10970 + return true;
10971 +
10972 + default:
10973 + return false;
10974 + }
10975 + }
10976 + function prepareUpdate(domElement, type, oldProps, newProps, rootContainerInstance, hostContext) {
10977 + {
10978 + var hostContextDev = hostContext;
10979 +
10980 + if (typeof newProps.children !== typeof oldProps.children && (typeof newProps.children === 'string' || typeof newProps.children === 'number')) {
10981 + var string = '' + newProps.children;
10982 + var ownAncestorInfo = updatedAncestorInfo(hostContextDev.ancestorInfo, type);
10983 + validateDOMNesting(null, string, ownAncestorInfo);
10984 + }
10985 + }
10986 +
10987 + return diffProperties(domElement, type, oldProps, newProps);
10988 + }
10989 + function shouldSetTextContent(type, props) {
10990 + return type === 'textarea' || type === 'noscript' || typeof props.children === 'string' || typeof props.children === 'number' || typeof props.dangerouslySetInnerHTML === 'object' && props.dangerouslySetInnerHTML !== null && props.dangerouslySetInnerHTML.__html != null;
10991 + }
10992 + function createTextInstance(text, rootContainerInstance, hostContext, internalInstanceHandle) {
10993 + {
10994 + var hostContextDev = hostContext;
10995 + validateDOMNesting(null, text, hostContextDev.ancestorInfo);
10996 + }
10997 +
10998 + var textNode = createTextNode(text, rootContainerInstance);
10999 + precacheFiberNode(internalInstanceHandle, textNode);
11000 + return textNode;
11001 + }
11002 + function getCurrentEventPriority() {
11003 + var currentEvent = window.event;
11004 +
11005 + if (currentEvent === undefined) {
11006 + return DefaultEventPriority;
11007 + }
11008 +
11009 + return getEventPriority(currentEvent.type);
11010 + }
11011 + // if a component just imports ReactDOM (e.g. for findDOMNode).
11012 + // Some environments might not have setTimeout or clearTimeout.
11013 +
11014 + var scheduleTimeout = typeof setTimeout === 'function' ? setTimeout : undefined;
11015 + var cancelTimeout = typeof clearTimeout === 'function' ? clearTimeout : undefined;
11016 + var noTimeout = -1;
11017 + var localPromise = typeof Promise === 'function' ? Promise : undefined; // -------------------
11018 + var scheduleMicrotask = typeof queueMicrotask === 'function' ? queueMicrotask : typeof localPromise !== 'undefined' ? function (callback) {
11019 + return localPromise.resolve(null).then(callback).catch(handleErrorInNextTick);
11020 + } : scheduleTimeout; // TODO: Determine the best fallback here.
11021 +
11022 + function handleErrorInNextTick(error) {
11023 + setTimeout(function () {
11024 + throw error;
11025 + });
11026 + } // -------------------
11027 + function commitMount(domElement, type, newProps, internalInstanceHandle) {
11028 + // Despite the naming that might imply otherwise, this method only
11029 + // fires if there is an `Update` effect scheduled during mounting.
11030 + // This happens if `finalizeInitialChildren` returns `true` (which it
11031 + // does to implement the `autoFocus` attribute on the client). But
11032 + // there are also other cases when this might happen (such as patching
11033 + // up text content during hydration mismatch). So we'll check this again.
11034 + switch (type) {
11035 + case 'button':
11036 + case 'input':
11037 + case 'select':
11038 + case 'textarea':
11039 + if (newProps.autoFocus) {
11040 + domElement.focus();
11041 + }
11042 +
11043 + return;
11044 +
11045 + case 'img':
11046 + {
11047 + if (newProps.src) {
11048 + domElement.src = newProps.src;
11049 + }
11050 +
11051 + return;
11052 + }
11053 + }
11054 + }
11055 + function commitUpdate(domElement, updatePayload, type, oldProps, newProps, internalInstanceHandle) {
11056 + // Apply the diff to the DOM node.
11057 + updateProperties(domElement, updatePayload, type, oldProps, newProps); // Update the props handle so that we know which props are the ones with
11058 + // with current event handlers.
11059 +
11060 + updateFiberProps(domElement, newProps);
11061 + }
11062 + function resetTextContent(domElement) {
11063 + setTextContent(domElement, '');
11064 + }
11065 + function commitTextUpdate(textInstance, oldText, newText) {
11066 + textInstance.nodeValue = newText;
11067 + }
11068 + function appendChild(parentInstance, child) {
11069 + parentInstance.appendChild(child);
11070 + }
11071 + function appendChildToContainer(container, child) {
11072 + var parentNode;
11073 +
11074 + if (container.nodeType === COMMENT_NODE) {
11075 + parentNode = container.parentNode;
11076 + parentNode.insertBefore(child, container);
11077 + } else {
11078 + parentNode = container;
11079 + parentNode.appendChild(child);
11080 + } // This container might be used for a portal.
11081 + // If something inside a portal is clicked, that click should bubble
11082 + // through the React tree. However, on Mobile Safari the click would
11083 + // never bubble through the *DOM* tree unless an ancestor with onclick
11084 + // event exists. So we wouldn't see it and dispatch it.
11085 + // This is why we ensure that non React root containers have inline onclick
11086 + // defined.
11087 + // https://github.com/facebook/react/issues/11918
11088 +
11089 +
11090 + var reactRootContainer = container._reactRootContainer;
11091 +
11092 + if ((reactRootContainer === null || reactRootContainer === undefined) && parentNode.onclick === null) {
11093 + // TODO: This cast may not be sound for SVG, MathML or custom elements.
11094 + trapClickOnNonInteractiveElement(parentNode);
11095 + }
11096 + }
11097 + function insertBefore(parentInstance, child, beforeChild) {
11098 + parentInstance.insertBefore(child, beforeChild);
11099 + }
11100 + function insertInContainerBefore(container, child, beforeChild) {
11101 + if (container.nodeType === COMMENT_NODE) {
11102 + container.parentNode.insertBefore(child, beforeChild);
11103 + } else {
11104 + container.insertBefore(child, beforeChild);
11105 + }
11106 + }
11107 +
11108 + function removeChild(parentInstance, child) {
11109 + parentInstance.removeChild(child);
11110 + }
11111 + function removeChildFromContainer(container, child) {
11112 + if (container.nodeType === COMMENT_NODE) {
11113 + container.parentNode.removeChild(child);
11114 + } else {
11115 + container.removeChild(child);
11116 + }
11117 + }
11118 + function clearSuspenseBoundary(parentInstance, suspenseInstance) {
11119 + var node = suspenseInstance; // Delete all nodes within this suspense boundary.
11120 + // There might be nested nodes so we need to keep track of how
11121 + // deep we are and only break out when we're back on top.
11122 +
11123 + var depth = 0;
11124 +
11125 + do {
11126 + var nextNode = node.nextSibling;
11127 + parentInstance.removeChild(node);
11128 +
11129 + if (nextNode && nextNode.nodeType === COMMENT_NODE) {
11130 + var data = nextNode.data;
11131 +
11132 + if (data === SUSPENSE_END_DATA) {
11133 + if (depth === 0) {
11134 + parentInstance.removeChild(nextNode); // Retry if any event replaying was blocked on this.
11135 +
11136 + retryIfBlockedOn(suspenseInstance);
11137 + return;
11138 + } else {
11139 + depth--;
11140 + }
11141 + } else if (data === SUSPENSE_START_DATA || data === SUSPENSE_PENDING_START_DATA || data === SUSPENSE_FALLBACK_START_DATA) {
11142 + depth++;
11143 + }
11144 + }
11145 +
11146 + node = nextNode;
11147 + } while (node); // TODO: Warn, we didn't find the end comment boundary.
11148 + // Retry if any event replaying was blocked on this.
11149 +
11150 +
11151 + retryIfBlockedOn(suspenseInstance);
11152 + }
11153 + function clearSuspenseBoundaryFromContainer(container, suspenseInstance) {
11154 + if (container.nodeType === COMMENT_NODE) {
11155 + clearSuspenseBoundary(container.parentNode, suspenseInstance);
11156 + } else if (container.nodeType === ELEMENT_NODE) {
11157 + clearSuspenseBoundary(container, suspenseInstance);
11158 + } // Retry if any event replaying was blocked on this.
11159 +
11160 +
11161 + retryIfBlockedOn(container);
11162 + }
11163 + function hideInstance(instance) {
11164 + // TODO: Does this work for all element types? What about MathML? Should we
11165 + // pass host context to this method?
11166 + instance = instance;
11167 + var style = instance.style;
11168 +
11169 + if (typeof style.setProperty === 'function') {
11170 + style.setProperty('display', 'none', 'important');
11171 + } else {
11172 + style.display = 'none';
11173 + }
11174 + }
11175 + function hideTextInstance(textInstance) {
11176 + textInstance.nodeValue = '';
11177 + }
11178 + function unhideInstance(instance, props) {
11179 + instance = instance;
11180 + var styleProp = props[STYLE$1];
11181 + var display = styleProp !== undefined && styleProp !== null && styleProp.hasOwnProperty('display') ? styleProp.display : null;
11182 + instance.style.display = dangerousStyleValue('display', display);
11183 + }
11184 + function unhideTextInstance(textInstance, text) {
11185 + textInstance.nodeValue = text;
11186 + }
11187 + function clearContainer(container) {
11188 + if (container.nodeType === ELEMENT_NODE) {
11189 + container.textContent = '';
11190 + } else if (container.nodeType === DOCUMENT_NODE) {
11191 + if (container.documentElement) {
11192 + container.removeChild(container.documentElement);
11193 + }
11194 + }
11195 + } // -------------------
11196 + function canHydrateInstance(instance, type, props) {
11197 + if (instance.nodeType !== ELEMENT_NODE || type.toLowerCase() !== instance.nodeName.toLowerCase()) {
11198 + return null;
11199 + } // This has now been refined to an element node.
11200 +
11201 +
11202 + return instance;
11203 + }
11204 + function canHydrateTextInstance(instance, text) {
11205 + if (text === '' || instance.nodeType !== TEXT_NODE) {
11206 + // Empty strings are not parsed by HTML so there won't be a correct match here.
11207 + return null;
11208 + } // This has now been refined to a text node.
11209 +
11210 +
11211 + return instance;
11212 + }
11213 + function canHydrateSuspenseInstance(instance) {
11214 + if (instance.nodeType !== COMMENT_NODE) {
11215 + // Empty strings are not parsed by HTML so there won't be a correct match here.
11216 + return null;
11217 + } // This has now been refined to a suspense node.
11218 +
11219 +
11220 + return instance;
11221 + }
11222 + function isSuspenseInstancePending(instance) {
11223 + return instance.data === SUSPENSE_PENDING_START_DATA;
11224 + }
11225 + function isSuspenseInstanceFallback(instance) {
11226 + return instance.data === SUSPENSE_FALLBACK_START_DATA;
11227 + }
11228 + function getSuspenseInstanceFallbackErrorDetails(instance) {
11229 + var dataset = instance.nextSibling && instance.nextSibling.dataset;
11230 + var digest, message, stack;
11231 +
11232 + if (dataset) {
11233 + digest = dataset.dgst;
11234 +
11235 + {
11236 + message = dataset.msg;
11237 + stack = dataset.stck;
11238 + }
11239 + }
11240 +
11241 + {
11242 + return {
11243 + message: message,
11244 + digest: digest,
11245 + stack: stack
11246 + };
11247 + } // let value = {message: undefined, hash: undefined};
11248 + // const nextSibling = instance.nextSibling;
11249 + // if (nextSibling) {
11250 + // const dataset = ((nextSibling: any): HTMLTemplateElement).dataset;
11251 + // value.message = dataset.msg;
11252 + // value.hash = dataset.hash;
11253 + // if (true) {
11254 + // value.stack = dataset.stack;
11255 + // }
11256 + // }
11257 + // return value;
11258 +
11259 + }
11260 + function registerSuspenseInstanceRetry(instance, callback) {
11261 + instance._reactRetry = callback;
11262 + }
11263 +
11264 + function getNextHydratable(node) {
11265 + // Skip non-hydratable nodes.
11266 + for (; node != null; node = node.nextSibling) {
11267 + var nodeType = node.nodeType;
11268 +
11269 + if (nodeType === ELEMENT_NODE || nodeType === TEXT_NODE) {
11270 + break;
11271 + }
11272 +
11273 + if (nodeType === COMMENT_NODE) {
11274 + var nodeData = node.data;
11275 +
11276 + if (nodeData === SUSPENSE_START_DATA || nodeData === SUSPENSE_FALLBACK_START_DATA || nodeData === SUSPENSE_PENDING_START_DATA) {
11277 + break;
11278 + }
11279 +
11280 + if (nodeData === SUSPENSE_END_DATA) {
11281 + return null;
11282 + }
11283 + }
11284 + }
11285 +
11286 + return node;
11287 + }
11288 +
11289 + function getNextHydratableSibling(instance) {
11290 + return getNextHydratable(instance.nextSibling);
11291 + }
11292 + function getFirstHydratableChild(parentInstance) {
11293 + return getNextHydratable(parentInstance.firstChild);
11294 + }
11295 + function getFirstHydratableChildWithinContainer(parentContainer) {
11296 + return getNextHydratable(parentContainer.firstChild);
11297 + }
11298 + function getFirstHydratableChildWithinSuspenseInstance(parentInstance) {
11299 + return getNextHydratable(parentInstance.nextSibling);
11300 + }
11301 + function hydrateInstance(instance, type, props, rootContainerInstance, hostContext, internalInstanceHandle, shouldWarnDev) {
11302 + precacheFiberNode(internalInstanceHandle, instance); // TODO: Possibly defer this until the commit phase where all the events
11303 + // get attached.
11304 +
11305 + updateFiberProps(instance, props);
11306 + var parentNamespace;
11307 +
11308 + {
11309 + var hostContextDev = hostContext;
11310 + parentNamespace = hostContextDev.namespace;
11311 + } // TODO: Temporary hack to check if we're in a concurrent root. We can delete
11312 + // when the legacy root API is removed.
11313 +
11314 +
11315 + var isConcurrentMode = (internalInstanceHandle.mode & ConcurrentMode) !== NoMode;
11316 + return diffHydratedProperties(instance, type, props, parentNamespace, rootContainerInstance, isConcurrentMode, shouldWarnDev);
11317 + }
11318 + function hydrateTextInstance(textInstance, text, internalInstanceHandle, shouldWarnDev) {
11319 + precacheFiberNode(internalInstanceHandle, textInstance); // TODO: Temporary hack to check if we're in a concurrent root. We can delete
11320 + // when the legacy root API is removed.
11321 +
11322 + var isConcurrentMode = (internalInstanceHandle.mode & ConcurrentMode) !== NoMode;
11323 + return diffHydratedText(textInstance, text);
11324 + }
11325 + function hydrateSuspenseInstance(suspenseInstance, internalInstanceHandle) {
11326 + precacheFiberNode(internalInstanceHandle, suspenseInstance);
11327 + }
11328 + function getNextHydratableInstanceAfterSuspenseInstance(suspenseInstance) {
11329 + var node = suspenseInstance.nextSibling; // Skip past all nodes within this suspense boundary.
11330 + // There might be nested nodes so we need to keep track of how
11331 + // deep we are and only break out when we're back on top.
11332 +
11333 + var depth = 0;
11334 +
11335 + while (node) {
11336 + if (node.nodeType === COMMENT_NODE) {
11337 + var data = node.data;
11338 +
11339 + if (data === SUSPENSE_END_DATA) {
11340 + if (depth === 0) {
11341 + return getNextHydratableSibling(node);
11342 + } else {
11343 + depth--;
11344 + }
11345 + } else if (data === SUSPENSE_START_DATA || data === SUSPENSE_FALLBACK_START_DATA || data === SUSPENSE_PENDING_START_DATA) {
11346 + depth++;
11347 + }
11348 + }
11349 +
11350 + node = node.nextSibling;
11351 + } // TODO: Warn, we didn't find the end comment boundary.
11352 +
11353 +
11354 + return null;
11355 + } // Returns the SuspenseInstance if this node is a direct child of a
11356 + // SuspenseInstance. I.e. if its previous sibling is a Comment with
11357 + // SUSPENSE_x_START_DATA. Otherwise, null.
11358 +
11359 + function getParentSuspenseInstance(targetInstance) {
11360 + var node = targetInstance.previousSibling; // Skip past all nodes within this suspense boundary.
11361 + // There might be nested nodes so we need to keep track of how
11362 + // deep we are and only break out when we're back on top.
11363 +
11364 + var depth = 0;
11365 +
11366 + while (node) {
11367 + if (node.nodeType === COMMENT_NODE) {
11368 + var data = node.data;
11369 +
11370 + if (data === SUSPENSE_START_DATA || data === SUSPENSE_FALLBACK_START_DATA || data === SUSPENSE_PENDING_START_DATA) {
11371 + if (depth === 0) {
11372 + return node;
11373 + } else {
11374 + depth--;
11375 + }
11376 + } else if (data === SUSPENSE_END_DATA) {
11377 + depth++;
11378 + }
11379 + }
11380 +
11381 + node = node.previousSibling;
11382 + }
11383 +
11384 + return null;
11385 + }
11386 + function commitHydratedContainer(container) {
11387 + // Retry if any event replaying was blocked on this.
11388 + retryIfBlockedOn(container);
11389 + }
11390 + function commitHydratedSuspenseInstance(suspenseInstance) {
11391 + // Retry if any event replaying was blocked on this.
11392 + retryIfBlockedOn(suspenseInstance);
11393 + }
11394 + function shouldDeleteUnhydratedTailInstances(parentType) {
11395 + return parentType !== 'head' && parentType !== 'body';
11396 + }
11397 + function didNotMatchHydratedContainerTextInstance(parentContainer, textInstance, text, isConcurrentMode) {
11398 + var shouldWarnDev = true;
11399 + checkForUnmatchedText(textInstance.nodeValue, text, isConcurrentMode, shouldWarnDev);
11400 + }
11401 + function didNotMatchHydratedTextInstance(parentType, parentProps, parentInstance, textInstance, text, isConcurrentMode) {
11402 + if (parentProps[SUPPRESS_HYDRATION_WARNING$1] !== true) {
11403 + var shouldWarnDev = true;
11404 + checkForUnmatchedText(textInstance.nodeValue, text, isConcurrentMode, shouldWarnDev);
11405 + }
11406 + }
11407 + function didNotHydrateInstanceWithinContainer(parentContainer, instance) {
11408 + {
11409 + if (instance.nodeType === ELEMENT_NODE) {
11410 + warnForDeletedHydratableElement(parentContainer, instance);
11411 + } else if (instance.nodeType === COMMENT_NODE) ; else {
11412 + warnForDeletedHydratableText(parentContainer, instance);
11413 + }
11414 + }
11415 + }
11416 + function didNotHydrateInstanceWithinSuspenseInstance(parentInstance, instance) {
11417 + {
11418 + // $FlowFixMe: Only Element or Document can be parent nodes.
11419 + var parentNode = parentInstance.parentNode;
11420 +
11421 + if (parentNode !== null) {
11422 + if (instance.nodeType === ELEMENT_NODE) {
11423 + warnForDeletedHydratableElement(parentNode, instance);
11424 + } else if (instance.nodeType === COMMENT_NODE) ; else {
11425 + warnForDeletedHydratableText(parentNode, instance);
11426 + }
11427 + }
11428 + }
11429 + }
11430 + function didNotHydrateInstance(parentType, parentProps, parentInstance, instance, isConcurrentMode) {
11431 + {
11432 + if (isConcurrentMode || parentProps[SUPPRESS_HYDRATION_WARNING$1] !== true) {
11433 + if (instance.nodeType === ELEMENT_NODE) {
11434 + warnForDeletedHydratableElement(parentInstance, instance);
11435 + } else if (instance.nodeType === COMMENT_NODE) ; else {
11436 + warnForDeletedHydratableText(parentInstance, instance);
11437 + }
11438 + }
11439 + }
11440 + }
11441 + function didNotFindHydratableInstanceWithinContainer(parentContainer, type, props) {
11442 + {
11443 + warnForInsertedHydratedElement(parentContainer, type);
11444 + }
11445 + }
11446 + function didNotFindHydratableTextInstanceWithinContainer(parentContainer, text) {
11447 + {
11448 + warnForInsertedHydratedText(parentContainer, text);
11449 + }
11450 + }
11451 + function didNotFindHydratableInstanceWithinSuspenseInstance(parentInstance, type, props) {
11452 + {
11453 + // $FlowFixMe: Only Element or Document can be parent nodes.
11454 + var parentNode = parentInstance.parentNode;
11455 + if (parentNode !== null) warnForInsertedHydratedElement(parentNode, type);
11456 + }
11457 + }
11458 + function didNotFindHydratableTextInstanceWithinSuspenseInstance(parentInstance, text) {
11459 + {
11460 + // $FlowFixMe: Only Element or Document can be parent nodes.
11461 + var parentNode = parentInstance.parentNode;
11462 + if (parentNode !== null) warnForInsertedHydratedText(parentNode, text);
11463 + }
11464 + }
11465 + function didNotFindHydratableInstance(parentType, parentProps, parentInstance, type, props, isConcurrentMode) {
11466 + {
11467 + if (isConcurrentMode || parentProps[SUPPRESS_HYDRATION_WARNING$1] !== true) {
11468 + warnForInsertedHydratedElement(parentInstance, type);
11469 + }
11470 + }
11471 + }
11472 + function didNotFindHydratableTextInstance(parentType, parentProps, parentInstance, text, isConcurrentMode) {
11473 + {
11474 + if (isConcurrentMode || parentProps[SUPPRESS_HYDRATION_WARNING$1] !== true) {
11475 + warnForInsertedHydratedText(parentInstance, text);
11476 + }
11477 + }
11478 + }
11479 + function errorHydratingContainer(parentContainer) {
11480 + {
11481 + // TODO: This gets logged by onRecoverableError, too, so we should be
11482 + // able to remove it.
11483 + error('An error occurred during hydration. The server HTML was replaced with client content in <%s>.', parentContainer.nodeName.toLowerCase());
11484 + }
11485 + }
11486 + function preparePortalMount(portalInstance) {
11487 + listenToAllSupportedEvents(portalInstance);
11488 + }
11489 +
11490 + var randomKey = Math.random().toString(36).slice(2);
11491 + var internalInstanceKey = '__reactFiber$' + randomKey;
11492 + var internalPropsKey = '__reactProps$' + randomKey;
11493 + var internalContainerInstanceKey = '__reactContainer$' + randomKey;
11494 + var internalEventHandlersKey = '__reactEvents$' + randomKey;
11495 + var internalEventHandlerListenersKey = '__reactListeners$' + randomKey;
11496 + var internalEventHandlesSetKey = '__reactHandles$' + randomKey;
11497 + function detachDeletedInstance(node) {
11498 + // TODO: This function is only called on host components. I don't think all of
11499 + // these fields are relevant.
11500 + delete node[internalInstanceKey];
11501 + delete node[internalPropsKey];
11502 + delete node[internalEventHandlersKey];
11503 + delete node[internalEventHandlerListenersKey];
11504 + delete node[internalEventHandlesSetKey];
11505 + }
11506 + function precacheFiberNode(hostInst, node) {
11507 + node[internalInstanceKey] = hostInst;
11508 + }
11509 + function markContainerAsRoot(hostRoot, node) {
11510 + node[internalContainerInstanceKey] = hostRoot;
11511 + }
11512 + function unmarkContainerAsRoot(node) {
11513 + node[internalContainerInstanceKey] = null;
11514 + }
11515 + function isContainerMarkedAsRoot(node) {
11516 + return !!node[internalContainerInstanceKey];
11517 + } // Given a DOM node, return the closest HostComponent or HostText fiber ancestor.
11518 + // If the target node is part of a hydrated or not yet rendered subtree, then
11519 + // this may also return a SuspenseComponent or HostRoot to indicate that.
11520 + // Conceptually the HostRoot fiber is a child of the Container node. So if you
11521 + // pass the Container node as the targetNode, you will not actually get the
11522 + // HostRoot back. To get to the HostRoot, you need to pass a child of it.
11523 + // The same thing applies to Suspense boundaries.
11524 +
11525 + function getClosestInstanceFromNode(targetNode) {
11526 + var targetInst = targetNode[internalInstanceKey];
11527 +
11528 + if (targetInst) {
11529 + // Don't return HostRoot or SuspenseComponent here.
11530 + return targetInst;
11531 + } // If the direct event target isn't a React owned DOM node, we need to look
11532 + // to see if one of its parents is a React owned DOM node.
11533 +
11534 +
11535 + var parentNode = targetNode.parentNode;
11536 +
11537 + while (parentNode) {
11538 + // We'll check if this is a container root that could include
11539 + // React nodes in the future. We need to check this first because
11540 + // if we're a child of a dehydrated container, we need to first
11541 + // find that inner container before moving on to finding the parent
11542 + // instance. Note that we don't check this field on the targetNode
11543 + // itself because the fibers are conceptually between the container
11544 + // node and the first child. It isn't surrounding the container node.
11545 + // If it's not a container, we check if it's an instance.
11546 + targetInst = parentNode[internalContainerInstanceKey] || parentNode[internalInstanceKey];
11547 +
11548 + if (targetInst) {
11549 + // Since this wasn't the direct target of the event, we might have
11550 + // stepped past dehydrated DOM nodes to get here. However they could
11551 + // also have been non-React nodes. We need to answer which one.
11552 + // If we the instance doesn't have any children, then there can't be
11553 + // a nested suspense boundary within it. So we can use this as a fast
11554 + // bailout. Most of the time, when people add non-React children to
11555 + // the tree, it is using a ref to a child-less DOM node.
11556 + // Normally we'd only need to check one of the fibers because if it
11557 + // has ever gone from having children to deleting them or vice versa
11558 + // it would have deleted the dehydrated boundary nested inside already.
11559 + // However, since the HostRoot starts out with an alternate it might
11560 + // have one on the alternate so we need to check in case this was a
11561 + // root.
11562 + var alternate = targetInst.alternate;
11563 +
11564 + if (targetInst.child !== null || alternate !== null && alternate.child !== null) {
11565 + // Next we need to figure out if the node that skipped past is
11566 + // nested within a dehydrated boundary and if so, which one.
11567 + var suspenseInstance = getParentSuspenseInstance(targetNode);
11568 +
11569 + while (suspenseInstance !== null) {
11570 + // We found a suspense instance. That means that we haven't
11571 + // hydrated it yet. Even though we leave the comments in the
11572 + // DOM after hydrating, and there are boundaries in the DOM
11573 + // that could already be hydrated, we wouldn't have found them
11574 + // through this pass since if the target is hydrated it would
11575 + // have had an internalInstanceKey on it.
11576 + // Let's get the fiber associated with the SuspenseComponent
11577 + // as the deepest instance.
11578 + var targetSuspenseInst = suspenseInstance[internalInstanceKey];
11579 +
11580 + if (targetSuspenseInst) {
11581 + return targetSuspenseInst;
11582 + } // If we don't find a Fiber on the comment, it might be because
11583 + // we haven't gotten to hydrate it yet. There might still be a
11584 + // parent boundary that hasn't above this one so we need to find
11585 + // the outer most that is known.
11586 +
11587 +
11588 + suspenseInstance = getParentSuspenseInstance(suspenseInstance); // If we don't find one, then that should mean that the parent
11589 + // host component also hasn't hydrated yet. We can return it
11590 + // below since it will bail out on the isMounted check later.
11591 + }
11592 + }
11593 +
11594 + return targetInst;
11595 + }
11596 +
11597 + targetNode = parentNode;
11598 + parentNode = targetNode.parentNode;
11599 + }
11600 +
11601 + return null;
11602 + }
11603 + /**
11604 + * Given a DOM node, return the ReactDOMComponent or ReactDOMTextComponent
11605 + * instance, or null if the node was not rendered by this React.
11606 + */
11607 +
11608 + function getInstanceFromNode(node) {
11609 + var inst = node[internalInstanceKey] || node[internalContainerInstanceKey];
11610 +
11611 + if (inst) {
11612 + if (inst.tag === HostComponent || inst.tag === HostText || inst.tag === SuspenseComponent || inst.tag === HostRoot) {
11613 + return inst;
11614 + } else {
11615 + return null;
11616 + }
11617 + }
11618 +
11619 + return null;
11620 + }
11621 + /**
11622 + * Given a ReactDOMComponent or ReactDOMTextComponent, return the corresponding
11623 + * DOM node.
11624 + */
11625 +
11626 + function getNodeFromInstance(inst) {
11627 + if (inst.tag === HostComponent || inst.tag === HostText) {
11628 + // In Fiber this, is just the state node right now. We assume it will be
11629 + // a host component or host text.
11630 + return inst.stateNode;
11631 + } // Without this first invariant, passing a non-DOM-component triggers the next
11632 + // invariant for a missing parent, which is super confusing.
11633 +
11634 +
11635 + throw new Error('getNodeFromInstance: Invalid argument.');
11636 + }
11637 + function getFiberCurrentPropsFromNode(node) {
11638 + return node[internalPropsKey] || null;
11639 + }
11640 + function updateFiberProps(node, props) {
11641 + node[internalPropsKey] = props;
11642 + }
11643 + function getEventListenerSet(node) {
11644 + var elementListenerSet = node[internalEventHandlersKey];
11645 +
11646 + if (elementListenerSet === undefined) {
11647 + elementListenerSet = node[internalEventHandlersKey] = new Set();
11648 + }
11649 +
11650 + return elementListenerSet;
11651 + }
11652 +
11653 + var loggedTypeFailures = {};
11654 + var ReactDebugCurrentFrame$1 = ReactSharedInternals.ReactDebugCurrentFrame;
11655 +
11656 + function setCurrentlyValidatingElement(element) {
11657 + {
11658 + if (element) {
11659 + var owner = element._owner;
11660 + var stack = describeUnknownElementTypeFrameInDEV(element.type, element._source, owner ? owner.type : null);
11661 + ReactDebugCurrentFrame$1.setExtraStackFrame(stack);
11662 + } else {
11663 + ReactDebugCurrentFrame$1.setExtraStackFrame(null);
11664 + }
11665 + }
11666 + }
11667 +
11668 + function checkPropTypes(typeSpecs, values, location, componentName, element) {
11669 + {
11670 + // $FlowFixMe This is okay but Flow doesn't know it.
11671 + var has = Function.call.bind(hasOwnProperty);
11672 +
11673 + for (var typeSpecName in typeSpecs) {
11674 + if (has(typeSpecs, typeSpecName)) {
11675 + var error$1 = void 0; // Prop type validation may throw. In case they do, we don't want to
11676 + // fail the render phase where it didn't fail before. So we log it.
11677 + // After these have been cleaned up, we'll let them throw.
11678 +
11679 + try {
11680 + // This is intentionally an invariant that gets caught. It's the same
11681 + // behavior as without this statement except with a better message.
11682 + if (typeof typeSpecs[typeSpecName] !== 'function') {
11683 + // eslint-disable-next-line react-internal/prod-error-codes
11684 + var err = Error((componentName || 'React class') + ': ' + location + ' type `' + typeSpecName + '` is invalid; ' + 'it must be a function, usually from the `prop-types` package, but received `' + typeof typeSpecs[typeSpecName] + '`.' + 'This often happens because of typos such as `PropTypes.function` instead of `PropTypes.func`.');
11685 + err.name = 'Invariant Violation';
11686 + throw err;
11687 + }
11688 +
11689 + error$1 = typeSpecs[typeSpecName](values, typeSpecName, componentName, location, null, 'SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED');
11690 + } catch (ex) {
11691 + error$1 = ex;
11692 + }
11693 +
11694 + if (error$1 && !(error$1 instanceof Error)) {
11695 + setCurrentlyValidatingElement(element);
11696 +
11697 + error('%s: type specification of %s' + ' `%s` is invalid; the type checker ' + 'function must return `null` or an `Error` but returned a %s. ' + 'You may have forgotten to pass an argument to the type checker ' + 'creator (arrayOf, instanceOf, objectOf, oneOf, oneOfType, and ' + 'shape all require an argument).', componentName || 'React class', location, typeSpecName, typeof error$1);
11698 +
11699 + setCurrentlyValidatingElement(null);
11700 + }
11701 +
11702 + if (error$1 instanceof Error && !(error$1.message in loggedTypeFailures)) {
11703 + // Only monitor this failure once because there tends to be a lot of the
11704 + // same error.
11705 + loggedTypeFailures[error$1.message] = true;
11706 + setCurrentlyValidatingElement(element);
11707 +
11708 + error('Failed %s type: %s', location, error$1.message);
11709 +
11710 + setCurrentlyValidatingElement(null);
11711 + }
11712 + }
11713 + }
11714 + }
11715 + }
11716 +
11717 + var valueStack = [];
11718 + var fiberStack;
11719 +
11720 + {
11721 + fiberStack = [];
11722 + }
11723 +
11724 + var index = -1;
11725 +
11726 + function createCursor(defaultValue) {
11727 + return {
11728 + current: defaultValue
11729 + };
11730 + }
11731 +
11732 + function pop(cursor, fiber) {
11733 + if (index < 0) {
11734 + {
11735 + error('Unexpected pop.');
11736 + }
11737 +
11738 + return;
11739 + }
11740 +
11741 + {
11742 + if (fiber !== fiberStack[index]) {
11743 + error('Unexpected Fiber popped.');
11744 + }
11745 + }
11746 +
11747 + cursor.current = valueStack[index];
11748 + valueStack[index] = null;
11749 +
11750 + {
11751 + fiberStack[index] = null;
11752 + }
11753 +
11754 + index--;
11755 + }
11756 +
11757 + function push(cursor, value, fiber) {
11758 + index++;
11759 + valueStack[index] = cursor.current;
11760 +
11761 + {
11762 + fiberStack[index] = fiber;
11763 + }
11764 +
11765 + cursor.current = value;
11766 + }
11767 +
11768 + var warnedAboutMissingGetChildContext;
11769 +
11770 + {
11771 + warnedAboutMissingGetChildContext = {};
11772 + }
11773 +
11774 + var emptyContextObject = {};
11775 +
11776 + {
11777 + Object.freeze(emptyContextObject);
11778 + } // A cursor to the current merged context object on the stack.
11779 +
11780 +
11781 + var contextStackCursor = createCursor(emptyContextObject); // A cursor to a boolean indicating whether the context has changed.
11782 +
11783 + var didPerformWorkStackCursor = createCursor(false); // Keep track of the previous context object that was on the stack.
11784 + // We use this to get access to the parent context after we have already
11785 + // pushed the next context provider, and now need to merge their contexts.
11786 +
11787 + var previousContext = emptyContextObject;
11788 +
11789 + function getUnmaskedContext(workInProgress, Component, didPushOwnContextIfProvider) {
11790 + {
11791 + if (didPushOwnContextIfProvider && isContextProvider(Component)) {
11792 + // If the fiber is a context provider itself, when we read its context
11793 + // we may have already pushed its own child context on the stack. A context
11794 + // provider should not "see" its own child context. Therefore we read the
11795 + // previous (parent) context instead for a context provider.
11796 + return previousContext;
11797 + }
11798 +
11799 + return contextStackCursor.current;
11800 + }
11801 + }
11802 +
11803 + function cacheContext(workInProgress, unmaskedContext, maskedContext) {
11804 + {
11805 + var instance = workInProgress.stateNode;
11806 + instance.__reactInternalMemoizedUnmaskedChildContext = unmaskedContext;
11807 + instance.__reactInternalMemoizedMaskedChildContext = maskedContext;
11808 + }
11809 + }
11810 +
11811 + function getMaskedContext(workInProgress, unmaskedContext) {
11812 + {
11813 + var type = workInProgress.type;
11814 + var contextTypes = type.contextTypes;
11815 +
11816 + if (!contextTypes) {
11817 + return emptyContextObject;
11818 + } // Avoid recreating masked context unless unmasked context has changed.
11819 + // Failing to do this will result in unnecessary calls to componentWillReceiveProps.
11820 + // This may trigger infinite loops if componentWillReceiveProps calls setState.
11821 +
11822 +
11823 + var instance = workInProgress.stateNode;
11824 +
11825 + if (instance && instance.__reactInternalMemoizedUnmaskedChildContext === unmaskedContext) {
11826 + return instance.__reactInternalMemoizedMaskedChildContext;
11827 + }
11828 +
11829 + var context = {};
11830 +
11831 + for (var key in contextTypes) {
11832 + context[key] = unmaskedContext[key];
11833 + }
11834 +
11835 + {
11836 + var name = getComponentNameFromFiber(workInProgress) || 'Unknown';
11837 + checkPropTypes(contextTypes, context, 'context', name);
11838 + } // Cache unmasked context so we can avoid recreating masked context unless necessary.
11839 + // Context is created before the class component is instantiated so check for instance.
11840 +
11841 +
11842 + if (instance) {
11843 + cacheContext(workInProgress, unmaskedContext, context);
11844 + }
11845 +
11846 + return context;
11847 + }
11848 + }
11849 +
11850 + function hasContextChanged() {
11851 + {
11852 + return didPerformWorkStackCursor.current;
11853 + }
11854 + }
11855 +
11856 + function isContextProvider(type) {
11857 + {
11858 + var childContextTypes = type.childContextTypes;
11859 + return childContextTypes !== null && childContextTypes !== undefined;
11860 + }
11861 + }
11862 +
11863 + function popContext(fiber) {
11864 + {
11865 + pop(didPerformWorkStackCursor, fiber);
11866 + pop(contextStackCursor, fiber);
11867 + }
11868 + }
11869 +
11870 + function popTopLevelContextObject(fiber) {
11871 + {
11872 + pop(didPerformWorkStackCursor, fiber);
11873 + pop(contextStackCursor, fiber);
11874 + }
11875 + }
11876 +
11877 + function pushTopLevelContextObject(fiber, context, didChange) {
11878 + {
11879 + if (contextStackCursor.current !== emptyContextObject) {
11880 + throw new Error('Unexpected context found on stack. ' + 'This error is likely caused by a bug in React. Please file an issue.');
11881 + }
11882 +
11883 + push(contextStackCursor, context, fiber);
11884 + push(didPerformWorkStackCursor, didChange, fiber);
11885 + }
11886 + }
11887 +
11888 + function processChildContext(fiber, type, parentContext) {
11889 + {
11890 + var instance = fiber.stateNode;
11891 + var childContextTypes = type.childContextTypes; // TODO (bvaughn) Replace this behavior with an invariant() in the future.
11892 + // It has only been added in Fiber to match the (unintentional) behavior in Stack.
11893 +
11894 + if (typeof instance.getChildContext !== 'function') {
11895 + {
11896 + var componentName = getComponentNameFromFiber(fiber) || 'Unknown';
11897 +
11898 + if (!warnedAboutMissingGetChildContext[componentName]) {
11899 + warnedAboutMissingGetChildContext[componentName] = true;
11900 +
11901 + error('%s.childContextTypes is specified but there is no getChildContext() method ' + 'on the instance. You can either define getChildContext() on %s or remove ' + 'childContextTypes from it.', componentName, componentName);
11902 + }
11903 + }
11904 +
11905 + return parentContext;
11906 + }
11907 +
11908 + var childContext = instance.getChildContext();
11909 +
11910 + for (var contextKey in childContext) {
11911 + if (!(contextKey in childContextTypes)) {
11912 + throw new Error((getComponentNameFromFiber(fiber) || 'Unknown') + ".getChildContext(): key \"" + contextKey + "\" is not defined in childContextTypes.");
11913 + }
11914 + }
11915 +
11916 + {
11917 + var name = getComponentNameFromFiber(fiber) || 'Unknown';
11918 + checkPropTypes(childContextTypes, childContext, 'child context', name);
11919 + }
11920 +
11921 + return assign({}, parentContext, childContext);
11922 + }
11923 + }
11924 +
11925 + function pushContextProvider(workInProgress) {
11926 + {
11927 + var instance = workInProgress.stateNode; // We push the context as early as possible to ensure stack integrity.
11928 + // If the instance does not exist yet, we will push null at first,
11929 + // and replace it on the stack later when invalidating the context.
11930 +
11931 + var memoizedMergedChildContext = instance && instance.__reactInternalMemoizedMergedChildContext || emptyContextObject; // Remember the parent context so we can merge with it later.
11932 + // Inherit the parent's did-perform-work value to avoid inadvertently blocking updates.
11933 +
11934 + previousContext = contextStackCursor.current;
11935 + push(contextStackCursor, memoizedMergedChildContext, workInProgress);
11936 + push(didPerformWorkStackCursor, didPerformWorkStackCursor.current, workInProgress);
11937 + return true;
11938 + }
11939 + }
11940 +
11941 + function invalidateContextProvider(workInProgress, type, didChange) {
11942 + {
11943 + var instance = workInProgress.stateNode;
11944 +
11945 + if (!instance) {
11946 + throw new Error('Expected to have an instance by this point. ' + 'This error is likely caused by a bug in React. Please file an issue.');
11947 + }
11948 +
11949 + if (didChange) {
11950 + // Merge parent and own context.
11951 + // Skip this if we're not updating due to sCU.
11952 + // This avoids unnecessarily recomputing memoized values.
11953 + var mergedContext = processChildContext(workInProgress, type, previousContext);
11954 + instance.__reactInternalMemoizedMergedChildContext = mergedContext; // Replace the old (or empty) context with the new one.
11955 + // It is important to unwind the context in the reverse order.
11956 +
11957 + pop(didPerformWorkStackCursor, workInProgress);
11958 + pop(contextStackCursor, workInProgress); // Now push the new context and mark that it has changed.
11959 +
11960 + push(contextStackCursor, mergedContext, workInProgress);
11961 + push(didPerformWorkStackCursor, didChange, workInProgress);
11962 + } else {
11963 + pop(didPerformWorkStackCursor, workInProgress);
11964 + push(didPerformWorkStackCursor, didChange, workInProgress);
11965 + }
11966 + }
11967 + }
11968 +
11969 + function findCurrentUnmaskedContext(fiber) {
11970 + {
11971 + // Currently this is only used with renderSubtreeIntoContainer; not sure if it
11972 + // makes sense elsewhere
11973 + if (!isFiberMounted(fiber) || fiber.tag !== ClassComponent) {
11974 + throw new Error('Expected subtree parent to be a mounted class component. ' + 'This error is likely caused by a bug in React. Please file an issue.');
11975 + }
11976 +
11977 + var node = fiber;
11978 +
11979 + do {
11980 + switch (node.tag) {
11981 + case HostRoot:
11982 + return node.stateNode.context;
11983 +
11984 + case ClassComponent:
11985 + {
11986 + var Component = node.type;
11987 +
11988 + if (isContextProvider(Component)) {
11989 + return node.stateNode.__reactInternalMemoizedMergedChildContext;
11990 + }
11991 +
11992 + break;
11993 + }
11994 + }
11995 +
11996 + node = node.return;
11997 + } while (node !== null);
11998 +
11999 + throw new Error('Found unexpected detached subtree parent. ' + 'This error is likely caused by a bug in React. Please file an issue.');
12000 + }
12001 + }
12002 +
12003 + var LegacyRoot = 0;
12004 + var ConcurrentRoot = 1;
12005 +
12006 + var syncQueue = null;
12007 + var includesLegacySyncCallbacks = false;
12008 + var isFlushingSyncQueue = false;
12009 + function scheduleSyncCallback(callback) {
12010 + // Push this callback into an internal queue. We'll flush these either in
12011 + // the next tick, or earlier if something calls `flushSyncCallbackQueue`.
12012 + if (syncQueue === null) {
12013 + syncQueue = [callback];
12014 + } else {
12015 + // Push onto existing queue. Don't need to schedule a callback because
12016 + // we already scheduled one when we created the queue.
12017 + syncQueue.push(callback);
12018 + }
12019 + }
12020 + function scheduleLegacySyncCallback(callback) {
12021 + includesLegacySyncCallbacks = true;
12022 + scheduleSyncCallback(callback);
12023 + }
12024 + function flushSyncCallbacksOnlyInLegacyMode() {
12025 + // Only flushes the queue if there's a legacy sync callback scheduled.
12026 + // TODO: There's only a single type of callback: performSyncOnWorkOnRoot. So
12027 + // it might make more sense for the queue to be a list of roots instead of a
12028 + // list of generic callbacks. Then we can have two: one for legacy roots, one
12029 + // for concurrent roots. And this method would only flush the legacy ones.
12030 + if (includesLegacySyncCallbacks) {
12031 + flushSyncCallbacks();
12032 + }
12033 + }
12034 + function flushSyncCallbacks() {
12035 + if (!isFlushingSyncQueue && syncQueue !== null) {
12036 + // Prevent re-entrance.
12037 + isFlushingSyncQueue = true;
12038 + var i = 0;
12039 + var previousUpdatePriority = getCurrentUpdatePriority();
12040 +
12041 + try {
12042 + var isSync = true;
12043 + var queue = syncQueue; // TODO: Is this necessary anymore? The only user code that runs in this
12044 + // queue is in the render or commit phases.
12045 +
12046 + setCurrentUpdatePriority(DiscreteEventPriority);
12047 +
12048 + for (; i < queue.length; i++) {
12049 + var callback = queue[i];
12050 +
12051 + do {
12052 + callback = callback(isSync);
12053 + } while (callback !== null);
12054 + }
12055 +
12056 + syncQueue = null;
12057 + includesLegacySyncCallbacks = false;
12058 + } catch (error) {
12059 + // If something throws, leave the remaining callbacks on the queue.
12060 + if (syncQueue !== null) {
12061 + syncQueue = syncQueue.slice(i + 1);
12062 + } // Resume flushing in the next tick
12063 +
12064 +
12065 + scheduleCallback(ImmediatePriority, flushSyncCallbacks);
12066 + throw error;
12067 + } finally {
12068 + setCurrentUpdatePriority(previousUpdatePriority);
12069 + isFlushingSyncQueue = false;
12070 + }
12071 + }
12072 +
12073 + return null;
12074 + }
12075 +
12076 + // TODO: Use the unified fiber stack module instead of this local one?
12077 + // Intentionally not using it yet to derisk the initial implementation, because
12078 + // the way we push/pop these values is a bit unusual. If there's a mistake, I'd
12079 + // rather the ids be wrong than crash the whole reconciler.
12080 + var forkStack = [];
12081 + var forkStackIndex = 0;
12082 + var treeForkProvider = null;
12083 + var treeForkCount = 0;
12084 + var idStack = [];
12085 + var idStackIndex = 0;
12086 + var treeContextProvider = null;
12087 + var treeContextId = 1;
12088 + var treeContextOverflow = '';
12089 + function isForkedChild(workInProgress) {
12090 + warnIfNotHydrating();
12091 + return (workInProgress.flags & Forked) !== NoFlags;
12092 + }
12093 + function getForksAtLevel(workInProgress) {
12094 + warnIfNotHydrating();
12095 + return treeForkCount;
12096 + }
12097 + function getTreeId() {
12098 + var overflow = treeContextOverflow;
12099 + var idWithLeadingBit = treeContextId;
12100 + var id = idWithLeadingBit & ~getLeadingBit(idWithLeadingBit);
12101 + return id.toString(32) + overflow;
12102 + }
12103 + function pushTreeFork(workInProgress, totalChildren) {
12104 + // This is called right after we reconcile an array (or iterator) of child
12105 + // fibers, because that's the only place where we know how many children in
12106 + // the whole set without doing extra work later, or storing addtional
12107 + // information on the fiber.
12108 + //
12109 + // That's why this function is separate from pushTreeId — it's called during
12110 + // the render phase of the fork parent, not the child, which is where we push
12111 + // the other context values.
12112 + //
12113 + // In the Fizz implementation this is much simpler because the child is
12114 + // rendered in the same callstack as the parent.
12115 + //
12116 + // It might be better to just add a `forks` field to the Fiber type. It would
12117 + // make this module simpler.
12118 + warnIfNotHydrating();
12119 + forkStack[forkStackIndex++] = treeForkCount;
12120 + forkStack[forkStackIndex++] = treeForkProvider;
12121 + treeForkProvider = workInProgress;
12122 + treeForkCount = totalChildren;
12123 + }
12124 + function pushTreeId(workInProgress, totalChildren, index) {
12125 + warnIfNotHydrating();
12126 + idStack[idStackIndex++] = treeContextId;
12127 + idStack[idStackIndex++] = treeContextOverflow;
12128 + idStack[idStackIndex++] = treeContextProvider;
12129 + treeContextProvider = workInProgress;
12130 + var baseIdWithLeadingBit = treeContextId;
12131 + var baseOverflow = treeContextOverflow; // The leftmost 1 marks the end of the sequence, non-inclusive. It's not part
12132 + // of the id; we use it to account for leading 0s.
12133 +
12134 + var baseLength = getBitLength(baseIdWithLeadingBit) - 1;
12135 + var baseId = baseIdWithLeadingBit & ~(1 << baseLength);
12136 + var slot = index + 1;
12137 + var length = getBitLength(totalChildren) + baseLength; // 30 is the max length we can store without overflowing, taking into
12138 + // consideration the leading 1 we use to mark the end of the sequence.
12139 +
12140 + if (length > 30) {
12141 + // We overflowed the bitwise-safe range. Fall back to slower algorithm.
12142 + // This branch assumes the length of the base id is greater than 5; it won't
12143 + // work for smaller ids, because you need 5 bits per character.
12144 + //
12145 + // We encode the id in multiple steps: first the base id, then the
12146 + // remaining digits.
12147 + //
12148 + // Each 5 bit sequence corresponds to a single base 32 character. So for
12149 + // example, if the current id is 23 bits long, we can convert 20 of those
12150 + // bits into a string of 4 characters, with 3 bits left over.
12151 + //
12152 + // First calculate how many bits in the base id represent a complete
12153 + // sequence of characters.
12154 + var numberOfOverflowBits = baseLength - baseLength % 5; // Then create a bitmask that selects only those bits.
12155 +
12156 + var newOverflowBits = (1 << numberOfOverflowBits) - 1; // Select the bits, and convert them to a base 32 string.
12157 +
12158 + var newOverflow = (baseId & newOverflowBits).toString(32); // Now we can remove those bits from the base id.
12159 +
12160 + var restOfBaseId = baseId >> numberOfOverflowBits;
12161 + var restOfBaseLength = baseLength - numberOfOverflowBits; // Finally, encode the rest of the bits using the normal algorithm. Because
12162 + // we made more room, this time it won't overflow.
12163 +
12164 + var restOfLength = getBitLength(totalChildren) + restOfBaseLength;
12165 + var restOfNewBits = slot << restOfBaseLength;
12166 + var id = restOfNewBits | restOfBaseId;
12167 + var overflow = newOverflow + baseOverflow;
12168 + treeContextId = 1 << restOfLength | id;
12169 + treeContextOverflow = overflow;
12170 + } else {
12171 + // Normal path
12172 + var newBits = slot << baseLength;
12173 +
12174 + var _id = newBits | baseId;
12175 +
12176 + var _overflow = baseOverflow;
12177 + treeContextId = 1 << length | _id;
12178 + treeContextOverflow = _overflow;
12179 + }
12180 + }
12181 + function pushMaterializedTreeId(workInProgress) {
12182 + warnIfNotHydrating(); // This component materialized an id. This will affect any ids that appear
12183 + // in its children.
12184 +
12185 + var returnFiber = workInProgress.return;
12186 +
12187 + if (returnFiber !== null) {
12188 + var numberOfForks = 1;
12189 + var slotIndex = 0;
12190 + pushTreeFork(workInProgress, numberOfForks);
12191 + pushTreeId(workInProgress, numberOfForks, slotIndex);
12192 + }
12193 + }
12194 +
12195 + function getBitLength(number) {
12196 + return 32 - clz32(number);
12197 + }
12198 +
12199 + function getLeadingBit(id) {
12200 + return 1 << getBitLength(id) - 1;
12201 + }
12202 +
12203 + function popTreeContext(workInProgress) {
12204 + // Restore the previous values.
12205 + // This is a bit more complicated than other context-like modules in Fiber
12206 + // because the same Fiber may appear on the stack multiple times and for
12207 + // different reasons. We have to keep popping until the work-in-progress is
12208 + // no longer at the top of the stack.
12209 + while (workInProgress === treeForkProvider) {
12210 + treeForkProvider = forkStack[--forkStackIndex];
12211 + forkStack[forkStackIndex] = null;
12212 + treeForkCount = forkStack[--forkStackIndex];
12213 + forkStack[forkStackIndex] = null;
12214 + }
12215 +
12216 + while (workInProgress === treeContextProvider) {
12217 + treeContextProvider = idStack[--idStackIndex];
12218 + idStack[idStackIndex] = null;
12219 + treeContextOverflow = idStack[--idStackIndex];
12220 + idStack[idStackIndex] = null;
12221 + treeContextId = idStack[--idStackIndex];
12222 + idStack[idStackIndex] = null;
12223 + }
12224 + }
12225 + function getSuspendedTreeContext() {
12226 + warnIfNotHydrating();
12227 +
12228 + if (treeContextProvider !== null) {
12229 + return {
12230 + id: treeContextId,
12231 + overflow: treeContextOverflow
12232 + };
12233 + } else {
12234 + return null;
12235 + }
12236 + }
12237 + function restoreSuspendedTreeContext(workInProgress, suspendedContext) {
12238 + warnIfNotHydrating();
12239 + idStack[idStackIndex++] = treeContextId;
12240 + idStack[idStackIndex++] = treeContextOverflow;
12241 + idStack[idStackIndex++] = treeContextProvider;
12242 + treeContextId = suspendedContext.id;
12243 + treeContextOverflow = suspendedContext.overflow;
12244 + treeContextProvider = workInProgress;
12245 + }
12246 +
12247 + function warnIfNotHydrating() {
12248 + {
12249 + if (!getIsHydrating()) {
12250 + error('Expected to be hydrating. This is a bug in React. Please file ' + 'an issue.');
12251 + }
12252 + }
12253 + }
12254 +
12255 + // This may have been an insertion or a hydration.
12256 +
12257 + var hydrationParentFiber = null;
12258 + var nextHydratableInstance = null;
12259 + var isHydrating = false; // This flag allows for warning supression when we expect there to be mismatches
12260 + // due to earlier mismatches or a suspended fiber.
12261 +
12262 + var didSuspendOrErrorDEV = false; // Hydration errors that were thrown inside this boundary
12263 +
12264 + var hydrationErrors = null;
12265 +
12266 + function warnIfHydrating() {
12267 + {
12268 + if (isHydrating) {
12269 + error('We should not be hydrating here. This is a bug in React. Please file a bug.');
12270 + }
12271 + }
12272 + }
12273 +
12274 + function markDidThrowWhileHydratingDEV() {
12275 + {
12276 + didSuspendOrErrorDEV = true;
12277 + }
12278 + }
12279 + function didSuspendOrErrorWhileHydratingDEV() {
12280 + {
12281 + return didSuspendOrErrorDEV;
12282 + }
12283 + }
12284 +
12285 + function enterHydrationState(fiber) {
12286 +
12287 + var parentInstance = fiber.stateNode.containerInfo;
12288 + nextHydratableInstance = getFirstHydratableChildWithinContainer(parentInstance);
12289 + hydrationParentFiber = fiber;
12290 + isHydrating = true;
12291 + hydrationErrors = null;
12292 + didSuspendOrErrorDEV = false;
12293 + return true;
12294 + }
12295 +
12296 + function reenterHydrationStateFromDehydratedSuspenseInstance(fiber, suspenseInstance, treeContext) {
12297 +
12298 + nextHydratableInstance = getFirstHydratableChildWithinSuspenseInstance(suspenseInstance);
12299 + hydrationParentFiber = fiber;
12300 + isHydrating = true;
12301 + hydrationErrors = null;
12302 + didSuspendOrErrorDEV = false;
12303 +
12304 + if (treeContext !== null) {
12305 + restoreSuspendedTreeContext(fiber, treeContext);
12306 + }
12307 +
12308 + return true;
12309 + }
12310 +
12311 + function warnUnhydratedInstance(returnFiber, instance) {
12312 + {
12313 + switch (returnFiber.tag) {
12314 + case HostRoot:
12315 + {
12316 + didNotHydrateInstanceWithinContainer(returnFiber.stateNode.containerInfo, instance);
12317 + break;
12318 + }
12319 +
12320 + case HostComponent:
12321 + {
12322 + var isConcurrentMode = (returnFiber.mode & ConcurrentMode) !== NoMode;
12323 + didNotHydrateInstance(returnFiber.type, returnFiber.memoizedProps, returnFiber.stateNode, instance, // TODO: Delete this argument when we remove the legacy root API.
12324 + isConcurrentMode);
12325 + break;
12326 + }
12327 +
12328 + case SuspenseComponent:
12329 + {
12330 + var suspenseState = returnFiber.memoizedState;
12331 + if (suspenseState.dehydrated !== null) didNotHydrateInstanceWithinSuspenseInstance(suspenseState.dehydrated, instance);
12332 + break;
12333 + }
12334 + }
12335 + }
12336 + }
12337 +
12338 + function deleteHydratableInstance(returnFiber, instance) {
12339 + warnUnhydratedInstance(returnFiber, instance);
12340 + var childToDelete = createFiberFromHostInstanceForDeletion();
12341 + childToDelete.stateNode = instance;
12342 + childToDelete.return = returnFiber;
12343 + var deletions = returnFiber.deletions;
12344 +
12345 + if (deletions === null) {
12346 + returnFiber.deletions = [childToDelete];
12347 + returnFiber.flags |= ChildDeletion;
12348 + } else {
12349 + deletions.push(childToDelete);
12350 + }
12351 + }
12352 +
12353 + function warnNonhydratedInstance(returnFiber, fiber) {
12354 + {
12355 + if (didSuspendOrErrorDEV) {
12356 + // Inside a boundary that already suspended. We're currently rendering the
12357 + // siblings of a suspended node. The mismatch may be due to the missing
12358 + // data, so it's probably a false positive.
12359 + return;
12360 + }
12361 +
12362 + switch (returnFiber.tag) {
12363 + case HostRoot:
12364 + {
12365 + var parentContainer = returnFiber.stateNode.containerInfo;
12366 +
12367 + switch (fiber.tag) {
12368 + case HostComponent:
12369 + var type = fiber.type;
12370 + var props = fiber.pendingProps;
12371 + didNotFindHydratableInstanceWithinContainer(parentContainer, type);
12372 + break;
12373 +
12374 + case HostText:
12375 + var text = fiber.pendingProps;
12376 + didNotFindHydratableTextInstanceWithinContainer(parentContainer, text);
12377 + break;
12378 + }
12379 +
12380 + break;
12381 + }
12382 +
12383 + case HostComponent:
12384 + {
12385 + var parentType = returnFiber.type;
12386 + var parentProps = returnFiber.memoizedProps;
12387 + var parentInstance = returnFiber.stateNode;
12388 +
12389 + switch (fiber.tag) {
12390 + case HostComponent:
12391 + {
12392 + var _type = fiber.type;
12393 + var _props = fiber.pendingProps;
12394 + var isConcurrentMode = (returnFiber.mode & ConcurrentMode) !== NoMode;
12395 + didNotFindHydratableInstance(parentType, parentProps, parentInstance, _type, _props, // TODO: Delete this argument when we remove the legacy root API.
12396 + isConcurrentMode);
12397 + break;
12398 + }
12399 +
12400 + case HostText:
12401 + {
12402 + var _text = fiber.pendingProps;
12403 +
12404 + var _isConcurrentMode = (returnFiber.mode & ConcurrentMode) !== NoMode;
12405 +
12406 + didNotFindHydratableTextInstance(parentType, parentProps, parentInstance, _text, // TODO: Delete this argument when we remove the legacy root API.
12407 + _isConcurrentMode);
12408 + break;
12409 + }
12410 + }
12411 +
12412 + break;
12413 + }
12414 +
12415 + case SuspenseComponent:
12416 + {
12417 + var suspenseState = returnFiber.memoizedState;
12418 + var _parentInstance = suspenseState.dehydrated;
12419 + if (_parentInstance !== null) switch (fiber.tag) {
12420 + case HostComponent:
12421 + var _type2 = fiber.type;
12422 + var _props2 = fiber.pendingProps;
12423 + didNotFindHydratableInstanceWithinSuspenseInstance(_parentInstance, _type2);
12424 + break;
12425 +
12426 + case HostText:
12427 + var _text2 = fiber.pendingProps;
12428 + didNotFindHydratableTextInstanceWithinSuspenseInstance(_parentInstance, _text2);
12429 + break;
12430 + }
12431 + break;
12432 + }
12433 +
12434 + default:
12435 + return;
12436 + }
12437 + }
12438 + }
12439 +
12440 + function insertNonHydratedInstance(returnFiber, fiber) {
12441 + fiber.flags = fiber.flags & ~Hydrating | Placement;
12442 + warnNonhydratedInstance(returnFiber, fiber);
12443 + }
12444 +
12445 + function tryHydrate(fiber, nextInstance) {
12446 + switch (fiber.tag) {
12447 + case HostComponent:
12448 + {
12449 + var type = fiber.type;
12450 + var props = fiber.pendingProps;
12451 + var instance = canHydrateInstance(nextInstance, type);
12452 +
12453 + if (instance !== null) {
12454 + fiber.stateNode = instance;
12455 + hydrationParentFiber = fiber;
12456 + nextHydratableInstance = getFirstHydratableChild(instance);
12457 + return true;
12458 + }
12459 +
12460 + return false;
12461 + }
12462 +
12463 + case HostText:
12464 + {
12465 + var text = fiber.pendingProps;
12466 + var textInstance = canHydrateTextInstance(nextInstance, text);
12467 +
12468 + if (textInstance !== null) {
12469 + fiber.stateNode = textInstance;
12470 + hydrationParentFiber = fiber; // Text Instances don't have children so there's nothing to hydrate.
12471 +
12472 + nextHydratableInstance = null;
12473 + return true;
12474 + }
12475 +
12476 + return false;
12477 + }
12478 +
12479 + case SuspenseComponent:
12480 + {
12481 + var suspenseInstance = canHydrateSuspenseInstance(nextInstance);
12482 +
12483 + if (suspenseInstance !== null) {
12484 + var suspenseState = {
12485 + dehydrated: suspenseInstance,
12486 + treeContext: getSuspendedTreeContext(),
12487 + retryLane: OffscreenLane
12488 + };
12489 + fiber.memoizedState = suspenseState; // Store the dehydrated fragment as a child fiber.
12490 + // This simplifies the code for getHostSibling and deleting nodes,
12491 + // since it doesn't have to consider all Suspense boundaries and
12492 + // check if they're dehydrated ones or not.
12493 +
12494 + var dehydratedFragment = createFiberFromDehydratedFragment(suspenseInstance);
12495 + dehydratedFragment.return = fiber;
12496 + fiber.child = dehydratedFragment;
12497 + hydrationParentFiber = fiber; // While a Suspense Instance does have children, we won't step into
12498 + // it during the first pass. Instead, we'll reenter it later.
12499 +
12500 + nextHydratableInstance = null;
12501 + return true;
12502 + }
12503 +
12504 + return false;
12505 + }
12506 +
12507 + default:
12508 + return false;
12509 + }
12510 + }
12511 +
12512 + function shouldClientRenderOnMismatch(fiber) {
12513 + return (fiber.mode & ConcurrentMode) !== NoMode && (fiber.flags & DidCapture) === NoFlags;
12514 + }
12515 +
12516 + function throwOnHydrationMismatch(fiber) {
12517 + throw new Error('Hydration failed because the initial UI does not match what was ' + 'rendered on the server.');
12518 + }
12519 +
12520 + function tryToClaimNextHydratableInstance(fiber) {
12521 + if (!isHydrating) {
12522 + return;
12523 + }
12524 +
12525 + var nextInstance = nextHydratableInstance;
12526 +
12527 + if (!nextInstance) {
12528 + if (shouldClientRenderOnMismatch(fiber)) {
12529 + warnNonhydratedInstance(hydrationParentFiber, fiber);
12530 + throwOnHydrationMismatch();
12531 + } // Nothing to hydrate. Make it an insertion.
12532 +
12533 +
12534 + insertNonHydratedInstance(hydrationParentFiber, fiber);
12535 + isHydrating = false;
12536 + hydrationParentFiber = fiber;
12537 + return;
12538 + }
12539 +
12540 + var firstAttemptedInstance = nextInstance;
12541 +
12542 + if (!tryHydrate(fiber, nextInstance)) {
12543 + if (shouldClientRenderOnMismatch(fiber)) {
12544 + warnNonhydratedInstance(hydrationParentFiber, fiber);
12545 + throwOnHydrationMismatch();
12546 + } // If we can't hydrate this instance let's try the next one.
12547 + // We use this as a heuristic. It's based on intuition and not data so it
12548 + // might be flawed or unnecessary.
12549 +
12550 +
12551 + nextInstance = getNextHydratableSibling(firstAttemptedInstance);
12552 + var prevHydrationParentFiber = hydrationParentFiber;
12553 +
12554 + if (!nextInstance || !tryHydrate(fiber, nextInstance)) {
12555 + // Nothing to hydrate. Make it an insertion.
12556 + insertNonHydratedInstance(hydrationParentFiber, fiber);
12557 + isHydrating = false;
12558 + hydrationParentFiber = fiber;
12559 + return;
12560 + } // We matched the next one, we'll now assume that the first one was
12561 + // superfluous and we'll delete it. Since we can't eagerly delete it
12562 + // we'll have to schedule a deletion. To do that, this node needs a dummy
12563 + // fiber associated with it.
12564 +
12565 +
12566 + deleteHydratableInstance(prevHydrationParentFiber, firstAttemptedInstance);
12567 + }
12568 + }
12569 +
12570 + function prepareToHydrateHostInstance(fiber, rootContainerInstance, hostContext) {
12571 +
12572 + var instance = fiber.stateNode;
12573 + var shouldWarnIfMismatchDev = !didSuspendOrErrorDEV;
12574 + var updatePayload = hydrateInstance(instance, fiber.type, fiber.memoizedProps, rootContainerInstance, hostContext, fiber, shouldWarnIfMismatchDev); // TODO: Type this specific to this type of component.
12575 +
12576 + fiber.updateQueue = updatePayload; // If the update payload indicates that there is a change or if there
12577 + // is a new ref we mark this as an update.
12578 +
12579 + if (updatePayload !== null) {
12580 + return true;
12581 + }
12582 +
12583 + return false;
12584 + }
12585 +
12586 + function prepareToHydrateHostTextInstance(fiber) {
12587 +
12588 + var textInstance = fiber.stateNode;
12589 + var textContent = fiber.memoizedProps;
12590 + var shouldUpdate = hydrateTextInstance(textInstance, textContent, fiber);
12591 +
12592 + if (shouldUpdate) {
12593 + // We assume that prepareToHydrateHostTextInstance is called in a context where the
12594 + // hydration parent is the parent host component of this host text.
12595 + var returnFiber = hydrationParentFiber;
12596 +
12597 + if (returnFiber !== null) {
12598 + switch (returnFiber.tag) {
12599 + case HostRoot:
12600 + {
12601 + var parentContainer = returnFiber.stateNode.containerInfo;
12602 + var isConcurrentMode = (returnFiber.mode & ConcurrentMode) !== NoMode;
12603 + didNotMatchHydratedContainerTextInstance(parentContainer, textInstance, textContent, // TODO: Delete this argument when we remove the legacy root API.
12604 + isConcurrentMode);
12605 + break;
12606 + }
12607 +
12608 + case HostComponent:
12609 + {
12610 + var parentType = returnFiber.type;
12611 + var parentProps = returnFiber.memoizedProps;
12612 + var parentInstance = returnFiber.stateNode;
12613 +
12614 + var _isConcurrentMode2 = (returnFiber.mode & ConcurrentMode) !== NoMode;
12615 +
12616 + didNotMatchHydratedTextInstance(parentType, parentProps, parentInstance, textInstance, textContent, // TODO: Delete this argument when we remove the legacy root API.
12617 + _isConcurrentMode2);
12618 + break;
12619 + }
12620 + }
12621 + }
12622 + }
12623 +
12624 + return shouldUpdate;
12625 + }
12626 +
12627 + function prepareToHydrateHostSuspenseInstance(fiber) {
12628 +
12629 + var suspenseState = fiber.memoizedState;
12630 + var suspenseInstance = suspenseState !== null ? suspenseState.dehydrated : null;
12631 +
12632 + if (!suspenseInstance) {
12633 + throw new Error('Expected to have a hydrated suspense instance. ' + 'This error is likely caused by a bug in React. Please file an issue.');
12634 + }
12635 +
12636 + hydrateSuspenseInstance(suspenseInstance, fiber);
12637 + }
12638 +
12639 + function skipPastDehydratedSuspenseInstance(fiber) {
12640 +
12641 + var suspenseState = fiber.memoizedState;
12642 + var suspenseInstance = suspenseState !== null ? suspenseState.dehydrated : null;
12643 +
12644 + if (!suspenseInstance) {
12645 + throw new Error('Expected to have a hydrated suspense instance. ' + 'This error is likely caused by a bug in React. Please file an issue.');
12646 + }
12647 +
12648 + return getNextHydratableInstanceAfterSuspenseInstance(suspenseInstance);
12649 + }
12650 +
12651 + function popToNextHostParent(fiber) {
12652 + var parent = fiber.return;
12653 +
12654 + while (parent !== null && parent.tag !== HostComponent && parent.tag !== HostRoot && parent.tag !== SuspenseComponent) {
12655 + parent = parent.return;
12656 + }
12657 +
12658 + hydrationParentFiber = parent;
12659 + }
12660 +
12661 + function popHydrationState(fiber) {
12662 +
12663 + if (fiber !== hydrationParentFiber) {
12664 + // We're deeper than the current hydration context, inside an inserted
12665 + // tree.
12666 + return false;
12667 + }
12668 +
12669 + if (!isHydrating) {
12670 + // If we're not currently hydrating but we're in a hydration context, then
12671 + // we were an insertion and now need to pop up reenter hydration of our
12672 + // siblings.
12673 + popToNextHostParent(fiber);
12674 + isHydrating = true;
12675 + return false;
12676 + } // If we have any remaining hydratable nodes, we need to delete them now.
12677 + // We only do this deeper than head and body since they tend to have random
12678 + // other nodes in them. We also ignore components with pure text content in
12679 + // side of them. We also don't delete anything inside the root container.
12680 +
12681 +
12682 + if (fiber.tag !== HostRoot && (fiber.tag !== HostComponent || shouldDeleteUnhydratedTailInstances(fiber.type) && !shouldSetTextContent(fiber.type, fiber.memoizedProps))) {
12683 + var nextInstance = nextHydratableInstance;
12684 +
12685 + if (nextInstance) {
12686 + if (shouldClientRenderOnMismatch(fiber)) {
12687 + warnIfUnhydratedTailNodes(fiber);
12688 + throwOnHydrationMismatch();
12689 + } else {
12690 + while (nextInstance) {
12691 + deleteHydratableInstance(fiber, nextInstance);
12692 + nextInstance = getNextHydratableSibling(nextInstance);
12693 + }
12694 + }
12695 + }
12696 + }
12697 +
12698 + popToNextHostParent(fiber);
12699 +
12700 + if (fiber.tag === SuspenseComponent) {
12701 + nextHydratableInstance = skipPastDehydratedSuspenseInstance(fiber);
12702 + } else {
12703 + nextHydratableInstance = hydrationParentFiber ? getNextHydratableSibling(fiber.stateNode) : null;
12704 + }
12705 +
12706 + return true;
12707 + }
12708 +
12709 + function hasUnhydratedTailNodes() {
12710 + return isHydrating && nextHydratableInstance !== null;
12711 + }
12712 +
12713 + function warnIfUnhydratedTailNodes(fiber) {
12714 + var nextInstance = nextHydratableInstance;
12715 +
12716 + while (nextInstance) {
12717 + warnUnhydratedInstance(fiber, nextInstance);
12718 + nextInstance = getNextHydratableSibling(nextInstance);
12719 + }
12720 + }
12721 +
12722 + function resetHydrationState() {
12723 +
12724 + hydrationParentFiber = null;
12725 + nextHydratableInstance = null;
12726 + isHydrating = false;
12727 + didSuspendOrErrorDEV = false;
12728 + }
12729 +
12730 + function upgradeHydrationErrorsToRecoverable() {
12731 + if (hydrationErrors !== null) {
12732 + // Successfully completed a forced client render. The errors that occurred
12733 + // during the hydration attempt are now recovered. We will log them in
12734 + // commit phase, once the entire tree has finished.
12735 + queueRecoverableErrors(hydrationErrors);
12736 + hydrationErrors = null;
12737 + }
12738 + }
12739 +
12740 + function getIsHydrating() {
12741 + return isHydrating;
12742 + }
12743 +
12744 + function queueHydrationError(error) {
12745 + if (hydrationErrors === null) {
12746 + hydrationErrors = [error];
12747 + } else {
12748 + hydrationErrors.push(error);
12749 + }
12750 + }
12751 +
12752 + var ReactCurrentBatchConfig$1 = ReactSharedInternals.ReactCurrentBatchConfig;
12753 + var NoTransition = null;
12754 + function requestCurrentTransition() {
12755 + return ReactCurrentBatchConfig$1.transition;
12756 + }
12757 +
12758 + var ReactStrictModeWarnings = {
12759 + recordUnsafeLifecycleWarnings: function (fiber, instance) {},
12760 + flushPendingUnsafeLifecycleWarnings: function () {},
12761 + recordLegacyContextWarning: function (fiber, instance) {},
12762 + flushLegacyContextWarning: function () {},
12763 + discardPendingWarnings: function () {}
12764 + };
12765 +
12766 + {
12767 + var findStrictRoot = function (fiber) {
12768 + var maybeStrictRoot = null;
12769 + var node = fiber;
12770 +
12771 + while (node !== null) {
12772 + if (node.mode & StrictLegacyMode) {
12773 + maybeStrictRoot = node;
12774 + }
12775 +
12776 + node = node.return;
12777 + }
12778 +
12779 + return maybeStrictRoot;
12780 + };
12781 +
12782 + var setToSortedString = function (set) {
12783 + var array = [];
12784 + set.forEach(function (value) {
12785 + array.push(value);
12786 + });
12787 + return array.sort().join(', ');
12788 + };
12789 +
12790 + var pendingComponentWillMountWarnings = [];
12791 + var pendingUNSAFE_ComponentWillMountWarnings = [];
12792 + var pendingComponentWillReceivePropsWarnings = [];
12793 + var pendingUNSAFE_ComponentWillReceivePropsWarnings = [];
12794 + var pendingComponentWillUpdateWarnings = [];
12795 + var pendingUNSAFE_ComponentWillUpdateWarnings = []; // Tracks components we have already warned about.
12796 +
12797 + var didWarnAboutUnsafeLifecycles = new Set();
12798 +
12799 + ReactStrictModeWarnings.recordUnsafeLifecycleWarnings = function (fiber, instance) {
12800 + // Dedupe strategy: Warn once per component.
12801 + if (didWarnAboutUnsafeLifecycles.has(fiber.type)) {
12802 + return;
12803 + }
12804 +
12805 + if (typeof instance.componentWillMount === 'function' && // Don't warn about react-lifecycles-compat polyfilled components.
12806 + instance.componentWillMount.__suppressDeprecationWarning !== true) {
12807 + pendingComponentWillMountWarnings.push(fiber);
12808 + }
12809 +
12810 + if (fiber.mode & StrictLegacyMode && typeof instance.UNSAFE_componentWillMount === 'function') {
12811 + pendingUNSAFE_ComponentWillMountWarnings.push(fiber);
12812 + }
12813 +
12814 + if (typeof instance.componentWillReceiveProps === 'function' && instance.componentWillReceiveProps.__suppressDeprecationWarning !== true) {
12815 + pendingComponentWillReceivePropsWarnings.push(fiber);
12816 + }
12817 +
12818 + if (fiber.mode & StrictLegacyMode && typeof instance.UNSAFE_componentWillReceiveProps === 'function') {
12819 + pendingUNSAFE_ComponentWillReceivePropsWarnings.push(fiber);
12820 + }
12821 +
12822 + if (typeof instance.componentWillUpdate === 'function' && instance.componentWillUpdate.__suppressDeprecationWarning !== true) {
12823 + pendingComponentWillUpdateWarnings.push(fiber);
12824 + }
12825 +
12826 + if (fiber.mode & StrictLegacyMode && typeof instance.UNSAFE_componentWillUpdate === 'function') {
12827 + pendingUNSAFE_ComponentWillUpdateWarnings.push(fiber);
12828 + }
12829 + };
12830 +
12831 + ReactStrictModeWarnings.flushPendingUnsafeLifecycleWarnings = function () {
12832 + // We do an initial pass to gather component names
12833 + var componentWillMountUniqueNames = new Set();
12834 +
12835 + if (pendingComponentWillMountWarnings.length > 0) {
12836 + pendingComponentWillMountWarnings.forEach(function (fiber) {
12837 + componentWillMountUniqueNames.add(getComponentNameFromFiber(fiber) || 'Component');
12838 + didWarnAboutUnsafeLifecycles.add(fiber.type);
12839 + });
12840 + pendingComponentWillMountWarnings = [];
12841 + }
12842 +
12843 + var UNSAFE_componentWillMountUniqueNames = new Set();
12844 +
12845 + if (pendingUNSAFE_ComponentWillMountWarnings.length > 0) {
12846 + pendingUNSAFE_ComponentWillMountWarnings.forEach(function (fiber) {
12847 + UNSAFE_componentWillMountUniqueNames.add(getComponentNameFromFiber(fiber) || 'Component');
12848 + didWarnAboutUnsafeLifecycles.add(fiber.type);
12849 + });
12850 + pendingUNSAFE_ComponentWillMountWarnings = [];
12851 + }
12852 +
12853 + var componentWillReceivePropsUniqueNames = new Set();
12854 +
12855 + if (pendingComponentWillReceivePropsWarnings.length > 0) {
12856 + pendingComponentWillReceivePropsWarnings.forEach(function (fiber) {
12857 + componentWillReceivePropsUniqueNames.add(getComponentNameFromFiber(fiber) || 'Component');
12858 + didWarnAboutUnsafeLifecycles.add(fiber.type);
12859 + });
12860 + pendingComponentWillReceivePropsWarnings = [];
12861 + }
12862 +
12863 + var UNSAFE_componentWillReceivePropsUniqueNames = new Set();
12864 +
12865 + if (pendingUNSAFE_ComponentWillReceivePropsWarnings.length > 0) {
12866 + pendingUNSAFE_ComponentWillReceivePropsWarnings.forEach(function (fiber) {
12867 + UNSAFE_componentWillReceivePropsUniqueNames.add(getComponentNameFromFiber(fiber) || 'Component');
12868 + didWarnAboutUnsafeLifecycles.add(fiber.type);
12869 + });
12870 + pendingUNSAFE_ComponentWillReceivePropsWarnings = [];
12871 + }
12872 +
12873 + var componentWillUpdateUniqueNames = new Set();
12874 +
12875 + if (pendingComponentWillUpdateWarnings.length > 0) {
12876 + pendingComponentWillUpdateWarnings.forEach(function (fiber) {
12877 + componentWillUpdateUniqueNames.add(getComponentNameFromFiber(fiber) || 'Component');
12878 + didWarnAboutUnsafeLifecycles.add(fiber.type);
12879 + });
12880 + pendingComponentWillUpdateWarnings = [];
12881 + }
12882 +
12883 + var UNSAFE_componentWillUpdateUniqueNames = new Set();
12884 +
12885 + if (pendingUNSAFE_ComponentWillUpdateWarnings.length > 0) {
12886 + pendingUNSAFE_ComponentWillUpdateWarnings.forEach(function (fiber) {
12887 + UNSAFE_componentWillUpdateUniqueNames.add(getComponentNameFromFiber(fiber) || 'Component');
12888 + didWarnAboutUnsafeLifecycles.add(fiber.type);
12889 + });
12890 + pendingUNSAFE_ComponentWillUpdateWarnings = [];
12891 + } // Finally, we flush all the warnings
12892 + // UNSAFE_ ones before the deprecated ones, since they'll be 'louder'
12893 +
12894 +
12895 + if (UNSAFE_componentWillMountUniqueNames.size > 0) {
12896 + var sortedNames = setToSortedString(UNSAFE_componentWillMountUniqueNames);
12897 +
12898 + error('Using UNSAFE_componentWillMount in strict mode is not recommended and may indicate bugs in your code. ' + 'See https://reactjs.org/link/unsafe-component-lifecycles for details.\n\n' + '* Move code with side effects to componentDidMount, and set initial state in the constructor.\n' + '\nPlease update the following components: %s', sortedNames);
12899 + }
12900 +
12901 + if (UNSAFE_componentWillReceivePropsUniqueNames.size > 0) {
12902 + var _sortedNames = setToSortedString(UNSAFE_componentWillReceivePropsUniqueNames);
12903 +
12904 + error('Using UNSAFE_componentWillReceiveProps in strict mode is not recommended ' + 'and may indicate bugs in your code. ' + 'See https://reactjs.org/link/unsafe-component-lifecycles for details.\n\n' + '* Move data fetching code or side effects to componentDidUpdate.\n' + "* If you're updating state whenever props change, " + 'refactor your code to use memoization techniques or move it to ' + 'static getDerivedStateFromProps. Learn more at: https://reactjs.org/link/derived-state\n' + '\nPlease update the following components: %s', _sortedNames);
12905 + }
12906 +
12907 + if (UNSAFE_componentWillUpdateUniqueNames.size > 0) {
12908 + var _sortedNames2 = setToSortedString(UNSAFE_componentWillUpdateUniqueNames);
12909 +
12910 + error('Using UNSAFE_componentWillUpdate in strict mode is not recommended ' + 'and may indicate bugs in your code. ' + 'See https://reactjs.org/link/unsafe-component-lifecycles for details.\n\n' + '* Move data fetching code or side effects to componentDidUpdate.\n' + '\nPlease update the following components: %s', _sortedNames2);
12911 + }
12912 +
12913 + if (componentWillMountUniqueNames.size > 0) {
12914 + var _sortedNames3 = setToSortedString(componentWillMountUniqueNames);
12915 +
12916 + warn('componentWillMount has been renamed, and is not recommended for use. ' + 'See https://reactjs.org/link/unsafe-component-lifecycles for details.\n\n' + '* Move code with side effects to componentDidMount, and set initial state in the constructor.\n' + '* Rename componentWillMount to UNSAFE_componentWillMount to suppress ' + 'this warning in non-strict mode. In React 18.x, only the UNSAFE_ name will work. ' + 'To rename all deprecated lifecycles to their new names, you can run ' + '`npx react-codemod rename-unsafe-lifecycles` in your project source folder.\n' + '\nPlease update the following components: %s', _sortedNames3);
12917 + }
12918 +
12919 + if (componentWillReceivePropsUniqueNames.size > 0) {
12920 + var _sortedNames4 = setToSortedString(componentWillReceivePropsUniqueNames);
12921 +
12922 + warn('componentWillReceiveProps has been renamed, and is not recommended for use. ' + 'See https://reactjs.org/link/unsafe-component-lifecycles for details.\n\n' + '* Move data fetching code or side effects to componentDidUpdate.\n' + "* If you're updating state whenever props change, refactor your " + 'code to use memoization techniques or move it to ' + 'static getDerivedStateFromProps. Learn more at: https://reactjs.org/link/derived-state\n' + '* Rename componentWillReceiveProps to UNSAFE_componentWillReceiveProps to suppress ' + 'this warning in non-strict mode. In React 18.x, only the UNSAFE_ name will work. ' + 'To rename all deprecated lifecycles to their new names, you can run ' + '`npx react-codemod rename-unsafe-lifecycles` in your project source folder.\n' + '\nPlease update the following components: %s', _sortedNames4);
12923 + }
12924 +
12925 + if (componentWillUpdateUniqueNames.size > 0) {
12926 + var _sortedNames5 = setToSortedString(componentWillUpdateUniqueNames);
12927 +
12928 + warn('componentWillUpdate has been renamed, and is not recommended for use. ' + 'See https://reactjs.org/link/unsafe-component-lifecycles for details.\n\n' + '* Move data fetching code or side effects to componentDidUpdate.\n' + '* Rename componentWillUpdate to UNSAFE_componentWillUpdate to suppress ' + 'this warning in non-strict mode. In React 18.x, only the UNSAFE_ name will work. ' + 'To rename all deprecated lifecycles to their new names, you can run ' + '`npx react-codemod rename-unsafe-lifecycles` in your project source folder.\n' + '\nPlease update the following components: %s', _sortedNames5);
12929 + }
12930 + };
12931 +
12932 + var pendingLegacyContextWarning = new Map(); // Tracks components we have already warned about.
12933 +
12934 + var didWarnAboutLegacyContext = new Set();
12935 +
12936 + ReactStrictModeWarnings.recordLegacyContextWarning = function (fiber, instance) {
12937 + var strictRoot = findStrictRoot(fiber);
12938 +
12939 + if (strictRoot === null) {
12940 + error('Expected to find a StrictMode component in a strict mode tree. ' + 'This error is likely caused by a bug in React. Please file an issue.');
12941 +
12942 + return;
12943 + } // Dedup strategy: Warn once per component.
12944 +
12945 +
12946 + if (didWarnAboutLegacyContext.has(fiber.type)) {
12947 + return;
12948 + }
12949 +
12950 + var warningsForRoot = pendingLegacyContextWarning.get(strictRoot);
12951 +
12952 + if (fiber.type.contextTypes != null || fiber.type.childContextTypes != null || instance !== null && typeof instance.getChildContext === 'function') {
12953 + if (warningsForRoot === undefined) {
12954 + warningsForRoot = [];
12955 + pendingLegacyContextWarning.set(strictRoot, warningsForRoot);
12956 + }
12957 +
12958 + warningsForRoot.push(fiber);
12959 + }
12960 + };
12961 +
12962 + ReactStrictModeWarnings.flushLegacyContextWarning = function () {
12963 + pendingLegacyContextWarning.forEach(function (fiberArray, strictRoot) {
12964 + if (fiberArray.length === 0) {
12965 + return;
12966 + }
12967 +
12968 + var firstFiber = fiberArray[0];
12969 + var uniqueNames = new Set();
12970 + fiberArray.forEach(function (fiber) {
12971 + uniqueNames.add(getComponentNameFromFiber(fiber) || 'Component');
12972 + didWarnAboutLegacyContext.add(fiber.type);
12973 + });
12974 + var sortedNames = setToSortedString(uniqueNames);
12975 +
12976 + try {
12977 + setCurrentFiber(firstFiber);
12978 +
12979 + error('Legacy context API has been detected within a strict-mode tree.' + '\n\nThe old API will be supported in all 16.x releases, but applications ' + 'using it should migrate to the new version.' + '\n\nPlease update the following components: %s' + '\n\nLearn more about this warning here: https://reactjs.org/link/legacy-context', sortedNames);
12980 + } finally {
12981 + resetCurrentFiber();
12982 + }
12983 + });
12984 + };
12985 +
12986 + ReactStrictModeWarnings.discardPendingWarnings = function () {
12987 + pendingComponentWillMountWarnings = [];
12988 + pendingUNSAFE_ComponentWillMountWarnings = [];
12989 + pendingComponentWillReceivePropsWarnings = [];
12990 + pendingUNSAFE_ComponentWillReceivePropsWarnings = [];
12991 + pendingComponentWillUpdateWarnings = [];
12992 + pendingUNSAFE_ComponentWillUpdateWarnings = [];
12993 + pendingLegacyContextWarning = new Map();
12994 + };
12995 + }
12996 +
12997 + var didWarnAboutMaps;
12998 + var didWarnAboutGenerators;
12999 + var didWarnAboutStringRefs;
13000 + var ownerHasKeyUseWarning;
13001 + var ownerHasFunctionTypeWarning;
13002 +
13003 + var warnForMissingKey = function (child, returnFiber) {};
13004 +
13005 + {
13006 + didWarnAboutMaps = false;
13007 + didWarnAboutGenerators = false;
13008 + didWarnAboutStringRefs = {};
13009 + /**
13010 + * Warn if there's no key explicitly set on dynamic arrays of children or
13011 + * object keys are not valid. This allows us to keep track of children between
13012 + * updates.
13013 + */
13014 +
13015 + ownerHasKeyUseWarning = {};
13016 + ownerHasFunctionTypeWarning = {};
13017 +
13018 + warnForMissingKey = function (child, returnFiber) {
13019 + if (child === null || typeof child !== 'object') {
13020 + return;
13021 + }
13022 +
13023 + if (!child._store || child._store.validated || child.key != null) {
13024 + return;
13025 + }
13026 +
13027 + if (typeof child._store !== 'object') {
13028 + throw new Error('React Component in warnForMissingKey should have a _store. ' + 'This error is likely caused by a bug in React. Please file an issue.');
13029 + }
13030 +
13031 + child._store.validated = true;
13032 + var componentName = getComponentNameFromFiber(returnFiber) || 'Component';
13033 +
13034 + if (ownerHasKeyUseWarning[componentName]) {
13035 + return;
13036 + }
13037 +
13038 + ownerHasKeyUseWarning[componentName] = true;
13039 +
13040 + error('Each child in a list should have a unique ' + '"key" prop. See https://reactjs.org/link/warning-keys for ' + 'more information.');
13041 + };
13042 + }
13043 +
13044 + function isReactClass(type) {
13045 + return type.prototype && type.prototype.isReactComponent;
13046 + }
13047 +
13048 + function coerceRef(returnFiber, current, element) {
13049 + var mixedRef = element.ref;
13050 +
13051 + if (mixedRef !== null && typeof mixedRef !== 'function' && typeof mixedRef !== 'object') {
13052 + {
13053 + // TODO: Clean this up once we turn on the string ref warning for
13054 + // everyone, because the strict mode case will no longer be relevant
13055 + if ((returnFiber.mode & StrictLegacyMode || warnAboutStringRefs) && // We warn in ReactElement.js if owner and self are equal for string refs
13056 + // because these cannot be automatically converted to an arrow function
13057 + // using a codemod. Therefore, we don't have to warn about string refs again.
13058 + !(element._owner && element._self && element._owner.stateNode !== element._self) && // Will already throw with "Function components cannot have string refs"
13059 + !(element._owner && element._owner.tag !== ClassComponent) && // Will already warn with "Function components cannot be given refs"
13060 + !(typeof element.type === 'function' && !isReactClass(element.type)) && // Will already throw with "Element ref was specified as a string (someStringRef) but no owner was set"
13061 + element._owner) {
13062 + var componentName = getComponentNameFromFiber(returnFiber) || 'Component';
13063 +
13064 + if (!didWarnAboutStringRefs[componentName]) {
13065 + {
13066 + error('Component "%s" contains the string ref "%s". Support for string refs ' + 'will be removed in a future major release. We recommend using ' + 'useRef() or createRef() instead. ' + 'Learn more about using refs safely here: ' + 'https://reactjs.org/link/strict-mode-string-ref', componentName, mixedRef);
13067 + }
13068 +
13069 + didWarnAboutStringRefs[componentName] = true;
13070 + }
13071 + }
13072 + }
13073 +
13074 + if (element._owner) {
13075 + var owner = element._owner;
13076 + var inst;
13077 +
13078 + if (owner) {
13079 + var ownerFiber = owner;
13080 +
13081 + if (ownerFiber.tag !== ClassComponent) {
13082 + throw new Error('Function components cannot have string refs. ' + 'We recommend using useRef() instead. ' + 'Learn more about using refs safely here: ' + 'https://reactjs.org/link/strict-mode-string-ref');
13083 + }
13084 +
13085 + inst = ownerFiber.stateNode;
13086 + }
13087 +
13088 + if (!inst) {
13089 + throw new Error("Missing owner for string ref " + mixedRef + ". This error is likely caused by a " + 'bug in React. Please file an issue.');
13090 + } // Assigning this to a const so Flow knows it won't change in the closure
13091 +
13092 +
13093 + var resolvedInst = inst;
13094 +
13095 + {
13096 + checkPropStringCoercion(mixedRef, 'ref');
13097 + }
13098 +
13099 + var stringRef = '' + mixedRef; // Check if previous string ref matches new string ref
13100 +
13101 + if (current !== null && current.ref !== null && typeof current.ref === 'function' && current.ref._stringRef === stringRef) {
13102 + return current.ref;
13103 + }
13104 +
13105 + var ref = function (value) {
13106 + var refs = resolvedInst.refs;
13107 +
13108 + if (value === null) {
13109 + delete refs[stringRef];
13110 + } else {
13111 + refs[stringRef] = value;
13112 + }
13113 + };
13114 +
13115 + ref._stringRef = stringRef;
13116 + return ref;
13117 + } else {
13118 + if (typeof mixedRef !== 'string') {
13119 + throw new Error('Expected ref to be a function, a string, an object returned by React.createRef(), or null.');
13120 + }
13121 +
13122 + if (!element._owner) {
13123 + throw new Error("Element ref was specified as a string (" + mixedRef + ") but no owner was set. This could happen for one of" + ' the following reasons:\n' + '1. You may be adding a ref to a function component\n' + "2. You may be adding a ref to a component that was not created inside a component's render method\n" + '3. You have multiple copies of React loaded\n' + 'See https://reactjs.org/link/refs-must-have-owner for more information.');
13124 + }
13125 + }
13126 + }
13127 +
13128 + return mixedRef;
13129 + }
13130 +
13131 + function throwOnInvalidObjectType(returnFiber, newChild) {
13132 + var childString = Object.prototype.toString.call(newChild);
13133 + throw new Error("Objects are not valid as a React child (found: " + (childString === '[object Object]' ? 'object with keys {' + Object.keys(newChild).join(', ') + '}' : childString) + "). " + 'If you meant to render a collection of children, use an array ' + 'instead.');
13134 + }
13135 +
13136 + function warnOnFunctionType(returnFiber) {
13137 + {
13138 + var componentName = getComponentNameFromFiber(returnFiber) || 'Component';
13139 +
13140 + if (ownerHasFunctionTypeWarning[componentName]) {
13141 + return;
13142 + }
13143 +
13144 + ownerHasFunctionTypeWarning[componentName] = true;
13145 +
13146 + error('Functions are not valid as a React child. This may happen if ' + 'you return a Component instead of <Component /> from render. ' + 'Or maybe you meant to call this function rather than return it.');
13147 + }
13148 + }
13149 +
13150 + function resolveLazy(lazyType) {
13151 + var payload = lazyType._payload;
13152 + var init = lazyType._init;
13153 + return init(payload);
13154 + } // This wrapper function exists because I expect to clone the code in each path
13155 + // to be able to optimize each path individually by branching early. This needs
13156 + // a compiler or we can do it manually. Helpers that don't need this branching
13157 + // live outside of this function.
13158 +
13159 +
13160 + function ChildReconciler(shouldTrackSideEffects) {
13161 + function deleteChild(returnFiber, childToDelete) {
13162 + if (!shouldTrackSideEffects) {
13163 + // Noop.
13164 + return;
13165 + }
13166 +
13167 + var deletions = returnFiber.deletions;
13168 +
13169 + if (deletions === null) {
13170 + returnFiber.deletions = [childToDelete];
13171 + returnFiber.flags |= ChildDeletion;
13172 + } else {
13173 + deletions.push(childToDelete);
13174 + }
13175 + }
13176 +
13177 + function deleteRemainingChildren(returnFiber, currentFirstChild) {
13178 + if (!shouldTrackSideEffects) {
13179 + // Noop.
13180 + return null;
13181 + } // TODO: For the shouldClone case, this could be micro-optimized a bit by
13182 + // assuming that after the first child we've already added everything.
13183 +
13184 +
13185 + var childToDelete = currentFirstChild;
13186 +
13187 + while (childToDelete !== null) {
13188 + deleteChild(returnFiber, childToDelete);
13189 + childToDelete = childToDelete.sibling;
13190 + }
13191 +
13192 + return null;
13193 + }
13194 +
13195 + function mapRemainingChildren(returnFiber, currentFirstChild) {
13196 + // Add the remaining children to a temporary map so that we can find them by
13197 + // keys quickly. Implicit (null) keys get added to this set with their index
13198 + // instead.
13199 + var existingChildren = new Map();
13200 + var existingChild = currentFirstChild;
13201 +
13202 + while (existingChild !== null) {
13203 + if (existingChild.key !== null) {
13204 + existingChildren.set(existingChild.key, existingChild);
13205 + } else {
13206 + existingChildren.set(existingChild.index, existingChild);
13207 + }
13208 +
13209 + existingChild = existingChild.sibling;
13210 + }
13211 +
13212 + return existingChildren;
13213 + }
13214 +
13215 + function useFiber(fiber, pendingProps) {
13216 + // We currently set sibling to null and index to 0 here because it is easy
13217 + // to forget to do before returning it. E.g. for the single child case.
13218 + var clone = createWorkInProgress(fiber, pendingProps);
13219 + clone.index = 0;
13220 + clone.sibling = null;
13221 + return clone;
13222 + }
13223 +
13224 + function placeChild(newFiber, lastPlacedIndex, newIndex) {
13225 + newFiber.index = newIndex;
13226 +
13227 + if (!shouldTrackSideEffects) {
13228 + // During hydration, the useId algorithm needs to know which fibers are
13229 + // part of a list of children (arrays, iterators).
13230 + newFiber.flags |= Forked;
13231 + return lastPlacedIndex;
13232 + }
13233 +
13234 + var current = newFiber.alternate;
13235 +
13236 + if (current !== null) {
13237 + var oldIndex = current.index;
13238 +
13239 + if (oldIndex < lastPlacedIndex) {
13240 + // This is a move.
13241 + newFiber.flags |= Placement;
13242 + return lastPlacedIndex;
13243 + } else {
13244 + // This item can stay in place.
13245 + return oldIndex;
13246 + }
13247 + } else {
13248 + // This is an insertion.
13249 + newFiber.flags |= Placement;
13250 + return lastPlacedIndex;
13251 + }
13252 + }
13253 +
13254 + function placeSingleChild(newFiber) {
13255 + // This is simpler for the single child case. We only need to do a
13256 + // placement for inserting new children.
13257 + if (shouldTrackSideEffects && newFiber.alternate === null) {
13258 + newFiber.flags |= Placement;
13259 + }
13260 +
13261 + return newFiber;
13262 + }
13263 +
13264 + function updateTextNode(returnFiber, current, textContent, lanes) {
13265 + if (current === null || current.tag !== HostText) {
13266 + // Insert
13267 + var created = createFiberFromText(textContent, returnFiber.mode, lanes);
13268 + created.return = returnFiber;
13269 + return created;
13270 + } else {
13271 + // Update
13272 + var existing = useFiber(current, textContent);
13273 + existing.return = returnFiber;
13274 + return existing;
13275 + }
13276 + }
13277 +
13278 + function updateElement(returnFiber, current, element, lanes) {
13279 + var elementType = element.type;
13280 +
13281 + if (elementType === REACT_FRAGMENT_TYPE) {
13282 + return updateFragment(returnFiber, current, element.props.children, lanes, element.key);
13283 + }
13284 +
13285 + if (current !== null) {
13286 + if (current.elementType === elementType || ( // Keep this check inline so it only runs on the false path:
13287 + isCompatibleFamilyForHotReloading(current, element) ) || // Lazy types should reconcile their resolved type.
13288 + // We need to do this after the Hot Reloading check above,
13289 + // because hot reloading has different semantics than prod because
13290 + // it doesn't resuspend. So we can't let the call below suspend.
13291 + typeof elementType === 'object' && elementType !== null && elementType.$$typeof === REACT_LAZY_TYPE && resolveLazy(elementType) === current.type) {
13292 + // Move based on index
13293 + var existing = useFiber(current, element.props);
13294 + existing.ref = coerceRef(returnFiber, current, element);
13295 + existing.return = returnFiber;
13296 +
13297 + {
13298 + existing._debugSource = element._source;
13299 + existing._debugOwner = element._owner;
13300 + }
13301 +
13302 + return existing;
13303 + }
13304 + } // Insert
13305 +
13306 +
13307 + var created = createFiberFromElement(element, returnFiber.mode, lanes);
13308 + created.ref = coerceRef(returnFiber, current, element);
13309 + created.return = returnFiber;
13310 + return created;
13311 + }
13312 +
13313 + function updatePortal(returnFiber, current, portal, lanes) {
13314 + if (current === null || current.tag !== HostPortal || current.stateNode.containerInfo !== portal.containerInfo || current.stateNode.implementation !== portal.implementation) {
13315 + // Insert
13316 + var created = createFiberFromPortal(portal, returnFiber.mode, lanes);
13317 + created.return = returnFiber;
13318 + return created;
13319 + } else {
13320 + // Update
13321 + var existing = useFiber(current, portal.children || []);
13322 + existing.return = returnFiber;
13323 + return existing;
13324 + }
13325 + }
13326 +
13327 + function updateFragment(returnFiber, current, fragment, lanes, key) {
13328 + if (current === null || current.tag !== Fragment) {
13329 + // Insert
13330 + var created = createFiberFromFragment(fragment, returnFiber.mode, lanes, key);
13331 + created.return = returnFiber;
13332 + return created;
13333 + } else {
13334 + // Update
13335 + var existing = useFiber(current, fragment);
13336 + existing.return = returnFiber;
13337 + return existing;
13338 + }
13339 + }
13340 +
13341 + function createChild(returnFiber, newChild, lanes) {
13342 + if (typeof newChild === 'string' && newChild !== '' || typeof newChild === 'number') {
13343 + // Text nodes don't have keys. If the previous node is implicitly keyed
13344 + // we can continue to replace it without aborting even if it is not a text
13345 + // node.
13346 + var created = createFiberFromText('' + newChild, returnFiber.mode, lanes);
13347 + created.return = returnFiber;
13348 + return created;
13349 + }
13350 +
13351 + if (typeof newChild === 'object' && newChild !== null) {
13352 + switch (newChild.$$typeof) {
13353 + case REACT_ELEMENT_TYPE:
13354 + {
13355 + var _created = createFiberFromElement(newChild, returnFiber.mode, lanes);
13356 +
13357 + _created.ref = coerceRef(returnFiber, null, newChild);
13358 + _created.return = returnFiber;
13359 + return _created;
13360 + }
13361 +
13362 + case REACT_PORTAL_TYPE:
13363 + {
13364 + var _created2 = createFiberFromPortal(newChild, returnFiber.mode, lanes);
13365 +
13366 + _created2.return = returnFiber;
13367 + return _created2;
13368 + }
13369 +
13370 + case REACT_LAZY_TYPE:
13371 + {
13372 + var payload = newChild._payload;
13373 + var init = newChild._init;
13374 + return createChild(returnFiber, init(payload), lanes);
13375 + }
13376 + }
13377 +
13378 + if (isArray(newChild) || getIteratorFn(newChild)) {
13379 + var _created3 = createFiberFromFragment(newChild, returnFiber.mode, lanes, null);
13380 +
13381 + _created3.return = returnFiber;
13382 + return _created3;
13383 + }
13384 +
13385 + throwOnInvalidObjectType(returnFiber, newChild);
13386 + }
13387 +
13388 + {
13389 + if (typeof newChild === 'function') {
13390 + warnOnFunctionType(returnFiber);
13391 + }
13392 + }
13393 +
13394 + return null;
13395 + }
13396 +
13397 + function updateSlot(returnFiber, oldFiber, newChild, lanes) {
13398 + // Update the fiber if the keys match, otherwise return null.
13399 + var key = oldFiber !== null ? oldFiber.key : null;
13400 +
13401 + if (typeof newChild === 'string' && newChild !== '' || typeof newChild === 'number') {
13402 + // Text nodes don't have keys. If the previous node is implicitly keyed
13403 + // we can continue to replace it without aborting even if it is not a text
13404 + // node.
13405 + if (key !== null) {
13406 + return null;
13407 + }
13408 +
13409 + return updateTextNode(returnFiber, oldFiber, '' + newChild, lanes);
13410 + }
13411 +
13412 + if (typeof newChild === 'object' && newChild !== null) {
13413 + switch (newChild.$$typeof) {
13414 + case REACT_ELEMENT_TYPE:
13415 + {
13416 + if (newChild.key === key) {
13417 + return updateElement(returnFiber, oldFiber, newChild, lanes);
13418 + } else {
13419 + return null;
13420 + }
13421 + }
13422 +
13423 + case REACT_PORTAL_TYPE:
13424 + {
13425 + if (newChild.key === key) {
13426 + return updatePortal(returnFiber, oldFiber, newChild, lanes);
13427 + } else {
13428 + return null;
13429 + }
13430 + }
13431 +
13432 + case REACT_LAZY_TYPE:
13433 + {
13434 + var payload = newChild._payload;
13435 + var init = newChild._init;
13436 + return updateSlot(returnFiber, oldFiber, init(payload), lanes);
13437 + }
13438 + }
13439 +
13440 + if (isArray(newChild) || getIteratorFn(newChild)) {
13441 + if (key !== null) {
13442 + return null;
13443 + }
13444 +
13445 + return updateFragment(returnFiber, oldFiber, newChild, lanes, null);
13446 + }
13447 +
13448 + throwOnInvalidObjectType(returnFiber, newChild);
13449 + }
13450 +
13451 + {
13452 + if (typeof newChild === 'function') {
13453 + warnOnFunctionType(returnFiber);
13454 + }
13455 + }
13456 +
13457 + return null;
13458 + }
13459 +
13460 + function updateFromMap(existingChildren, returnFiber, newIdx, newChild, lanes) {
13461 + if (typeof newChild === 'string' && newChild !== '' || typeof newChild === 'number') {
13462 + // Text nodes don't have keys, so we neither have to check the old nor
13463 + // new node for the key. If both are text nodes, they match.
13464 + var matchedFiber = existingChildren.get(newIdx) || null;
13465 + return updateTextNode(returnFiber, matchedFiber, '' + newChild, lanes);
13466 + }
13467 +
13468 + if (typeof newChild === 'object' && newChild !== null) {
13469 + switch (newChild.$$typeof) {
13470 + case REACT_ELEMENT_TYPE:
13471 + {
13472 + var _matchedFiber = existingChildren.get(newChild.key === null ? newIdx : newChild.key) || null;
13473 +
13474 + return updateElement(returnFiber, _matchedFiber, newChild, lanes);
13475 + }
13476 +
13477 + case REACT_PORTAL_TYPE:
13478 + {
13479 + var _matchedFiber2 = existingChildren.get(newChild.key === null ? newIdx : newChild.key) || null;
13480 +
13481 + return updatePortal(returnFiber, _matchedFiber2, newChild, lanes);
13482 + }
13483 +
13484 + case REACT_LAZY_TYPE:
13485 + var payload = newChild._payload;
13486 + var init = newChild._init;
13487 + return updateFromMap(existingChildren, returnFiber, newIdx, init(payload), lanes);
13488 + }
13489 +
13490 + if (isArray(newChild) || getIteratorFn(newChild)) {
13491 + var _matchedFiber3 = existingChildren.get(newIdx) || null;
13492 +
13493 + return updateFragment(returnFiber, _matchedFiber3, newChild, lanes, null);
13494 + }
13495 +
13496 + throwOnInvalidObjectType(returnFiber, newChild);
13497 + }
13498 +
13499 + {
13500 + if (typeof newChild === 'function') {
13501 + warnOnFunctionType(returnFiber);
13502 + }
13503 + }
13504 +
13505 + return null;
13506 + }
13507 + /**
13508 + * Warns if there is a duplicate or missing key
13509 + */
13510 +
13511 +
13512 + function warnOnInvalidKey(child, knownKeys, returnFiber) {
13513 + {
13514 + if (typeof child !== 'object' || child === null) {
13515 + return knownKeys;
13516 + }
13517 +
13518 + switch (child.$$typeof) {
13519 + case REACT_ELEMENT_TYPE:
13520 + case REACT_PORTAL_TYPE:
13521 + warnForMissingKey(child, returnFiber);
13522 + var key = child.key;
13523 +
13524 + if (typeof key !== 'string') {
13525 + break;
13526 + }
13527 +
13528 + if (knownKeys === null) {
13529 + knownKeys = new Set();
13530 + knownKeys.add(key);
13531 + break;
13532 + }
13533 +
13534 + if (!knownKeys.has(key)) {
13535 + knownKeys.add(key);
13536 + break;
13537 + }
13538 +
13539 + error('Encountered two children with the same key, `%s`. ' + 'Keys should be unique so that components maintain their identity ' + 'across updates. Non-unique keys may cause children to be ' + 'duplicated and/or omitted — the behavior is unsupported and ' + 'could change in a future version.', key);
13540 +
13541 + break;
13542 +
13543 + case REACT_LAZY_TYPE:
13544 + var payload = child._payload;
13545 + var init = child._init;
13546 + warnOnInvalidKey(init(payload), knownKeys, returnFiber);
13547 + break;
13548 + }
13549 + }
13550 +
13551 + return knownKeys;
13552 + }
13553 +
13554 + function reconcileChildrenArray(returnFiber, currentFirstChild, newChildren, lanes) {
13555 + // This algorithm can't optimize by searching from both ends since we
13556 + // don't have backpointers on fibers. I'm trying to see how far we can get
13557 + // with that model. If it ends up not being worth the tradeoffs, we can
13558 + // add it later.
13559 + // Even with a two ended optimization, we'd want to optimize for the case
13560 + // where there are few changes and brute force the comparison instead of
13561 + // going for the Map. It'd like to explore hitting that path first in
13562 + // forward-only mode and only go for the Map once we notice that we need
13563 + // lots of look ahead. This doesn't handle reversal as well as two ended
13564 + // search but that's unusual. Besides, for the two ended optimization to
13565 + // work on Iterables, we'd need to copy the whole set.
13566 + // In this first iteration, we'll just live with hitting the bad case
13567 + // (adding everything to a Map) in for every insert/move.
13568 + // If you change this code, also update reconcileChildrenIterator() which
13569 + // uses the same algorithm.
13570 + {
13571 + // First, validate keys.
13572 + var knownKeys = null;
13573 +
13574 + for (var i = 0; i < newChildren.length; i++) {
13575 + var child = newChildren[i];
13576 + knownKeys = warnOnInvalidKey(child, knownKeys, returnFiber);
13577 + }
13578 + }
13579 +
13580 + var resultingFirstChild = null;
13581 + var previousNewFiber = null;
13582 + var oldFiber = currentFirstChild;
13583 + var lastPlacedIndex = 0;
13584 + var newIdx = 0;
13585 + var nextOldFiber = null;
13586 +
13587 + for (; oldFiber !== null && newIdx < newChildren.length; newIdx++) {
13588 + if (oldFiber.index > newIdx) {
13589 + nextOldFiber = oldFiber;
13590 + oldFiber = null;
13591 + } else {
13592 + nextOldFiber = oldFiber.sibling;
13593 + }
13594 +
13595 + var newFiber = updateSlot(returnFiber, oldFiber, newChildren[newIdx], lanes);
13596 +
13597 + if (newFiber === null) {
13598 + // TODO: This breaks on empty slots like null children. That's
13599 + // unfortunate because it triggers the slow path all the time. We need
13600 + // a better way to communicate whether this was a miss or null,
13601 + // boolean, undefined, etc.
13602 + if (oldFiber === null) {
13603 + oldFiber = nextOldFiber;
13604 + }
13605 +
13606 + break;
13607 + }
13608 +
13609 + if (shouldTrackSideEffects) {
13610 + if (oldFiber && newFiber.alternate === null) {
13611 + // We matched the slot, but we didn't reuse the existing fiber, so we
13612 + // need to delete the existing child.
13613 + deleteChild(returnFiber, oldFiber);
13614 + }
13615 + }
13616 +
13617 + lastPlacedIndex = placeChild(newFiber, lastPlacedIndex, newIdx);
13618 +
13619 + if (previousNewFiber === null) {
13620 + // TODO: Move out of the loop. This only happens for the first run.
13621 + resultingFirstChild = newFiber;
13622 + } else {
13623 + // TODO: Defer siblings if we're not at the right index for this slot.
13624 + // I.e. if we had null values before, then we want to defer this
13625 + // for each null value. However, we also don't want to call updateSlot
13626 + // with the previous one.
13627 + previousNewFiber.sibling = newFiber;
13628 + }
13629 +
13630 + previousNewFiber = newFiber;
13631 + oldFiber = nextOldFiber;
13632 + }
13633 +
13634 + if (newIdx === newChildren.length) {
13635 + // We've reached the end of the new children. We can delete the rest.
13636 + deleteRemainingChildren(returnFiber, oldFiber);
13637 +
13638 + if (getIsHydrating()) {
13639 + var numberOfForks = newIdx;
13640 + pushTreeFork(returnFiber, numberOfForks);
13641 + }
13642 +
13643 + return resultingFirstChild;
13644 + }
13645 +
13646 + if (oldFiber === null) {
13647 + // If we don't have any more existing children we can choose a fast path
13648 + // since the rest will all be insertions.
13649 + for (; newIdx < newChildren.length; newIdx++) {
13650 + var _newFiber = createChild(returnFiber, newChildren[newIdx], lanes);
13651 +
13652 + if (_newFiber === null) {
13653 + continue;
13654 + }
13655 +
13656 + lastPlacedIndex = placeChild(_newFiber, lastPlacedIndex, newIdx);
13657 +
13658 + if (previousNewFiber === null) {
13659 + // TODO: Move out of the loop. This only happens for the first run.
13660 + resultingFirstChild = _newFiber;
13661 + } else {
13662 + previousNewFiber.sibling = _newFiber;
13663 + }
13664 +
13665 + previousNewFiber = _newFiber;
13666 + }
13667 +
13668 + if (getIsHydrating()) {
13669 + var _numberOfForks = newIdx;
13670 + pushTreeFork(returnFiber, _numberOfForks);
13671 + }
13672 +
13673 + return resultingFirstChild;
13674 + } // Add all children to a key map for quick lookups.
13675 +
13676 +
13677 + var existingChildren = mapRemainingChildren(returnFiber, oldFiber); // Keep scanning and use the map to restore deleted items as moves.
13678 +
13679 + for (; newIdx < newChildren.length; newIdx++) {
13680 + var _newFiber2 = updateFromMap(existingChildren, returnFiber, newIdx, newChildren[newIdx], lanes);
13681 +
13682 + if (_newFiber2 !== null) {
13683 + if (shouldTrackSideEffects) {
13684 + if (_newFiber2.alternate !== null) {
13685 + // The new fiber is a work in progress, but if there exists a
13686 + // current, that means that we reused the fiber. We need to delete
13687 + // it from the child list so that we don't add it to the deletion
13688 + // list.
13689 + existingChildren.delete(_newFiber2.key === null ? newIdx : _newFiber2.key);
13690 + }
13691 + }
13692 +
13693 + lastPlacedIndex = placeChild(_newFiber2, lastPlacedIndex, newIdx);
13694 +
13695 + if (previousNewFiber === null) {
13696 + resultingFirstChild = _newFiber2;
13697 + } else {
13698 + previousNewFiber.sibling = _newFiber2;
13699 + }
13700 +
13701 + previousNewFiber = _newFiber2;
13702 + }
13703 + }
13704 +
13705 + if (shouldTrackSideEffects) {
13706 + // Any existing children that weren't consumed above were deleted. We need
13707 + // to add them to the deletion list.
13708 + existingChildren.forEach(function (child) {
13709 + return deleteChild(returnFiber, child);
13710 + });
13711 + }
13712 +
13713 + if (getIsHydrating()) {
13714 + var _numberOfForks2 = newIdx;
13715 + pushTreeFork(returnFiber, _numberOfForks2);
13716 + }
13717 +
13718 + return resultingFirstChild;
13719 + }
13720 +
13721 + function reconcileChildrenIterator(returnFiber, currentFirstChild, newChildrenIterable, lanes) {
13722 + // This is the same implementation as reconcileChildrenArray(),
13723 + // but using the iterator instead.
13724 + var iteratorFn = getIteratorFn(newChildrenIterable);
13725 +
13726 + if (typeof iteratorFn !== 'function') {
13727 + throw new Error('An object is not an iterable. This error is likely caused by a bug in ' + 'React. Please file an issue.');
13728 + }
13729 +
13730 + {
13731 + // We don't support rendering Generators because it's a mutation.
13732 + // See https://github.com/facebook/react/issues/12995
13733 + if (typeof Symbol === 'function' && // $FlowFixMe Flow doesn't know about toStringTag
13734 + newChildrenIterable[Symbol.toStringTag] === 'Generator') {
13735 + if (!didWarnAboutGenerators) {
13736 + error('Using Generators as children is unsupported and will likely yield ' + 'unexpected results because enumerating a generator mutates it. ' + 'You may convert it to an array with `Array.from()` or the ' + '`[...spread]` operator before rendering. Keep in mind ' + 'you might need to polyfill these features for older browsers.');
13737 + }
13738 +
13739 + didWarnAboutGenerators = true;
13740 + } // Warn about using Maps as children
13741 +
13742 +
13743 + if (newChildrenIterable.entries === iteratorFn) {
13744 + if (!didWarnAboutMaps) {
13745 + error('Using Maps as children is not supported. ' + 'Use an array of keyed ReactElements instead.');
13746 + }
13747 +
13748 + didWarnAboutMaps = true;
13749 + } // First, validate keys.
13750 + // We'll get a different iterator later for the main pass.
13751 +
13752 +
13753 + var _newChildren = iteratorFn.call(newChildrenIterable);
13754 +
13755 + if (_newChildren) {
13756 + var knownKeys = null;
13757 +
13758 + var _step = _newChildren.next();
13759 +
13760 + for (; !_step.done; _step = _newChildren.next()) {
13761 + var child = _step.value;
13762 + knownKeys = warnOnInvalidKey(child, knownKeys, returnFiber);
13763 + }
13764 + }
13765 + }
13766 +
13767 + var newChildren = iteratorFn.call(newChildrenIterable);
13768 +
13769 + if (newChildren == null) {
13770 + throw new Error('An iterable object provided no iterator.');
13771 + }
13772 +
13773 + var resultingFirstChild = null;
13774 + var previousNewFiber = null;
13775 + var oldFiber = currentFirstChild;
13776 + var lastPlacedIndex = 0;
13777 + var newIdx = 0;
13778 + var nextOldFiber = null;
13779 + var step = newChildren.next();
13780 +
13781 + for (; oldFiber !== null && !step.done; newIdx++, step = newChildren.next()) {
13782 + if (oldFiber.index > newIdx) {
13783 + nextOldFiber = oldFiber;
13784 + oldFiber = null;
13785 + } else {
13786 + nextOldFiber = oldFiber.sibling;
13787 + }
13788 +
13789 + var newFiber = updateSlot(returnFiber, oldFiber, step.value, lanes);
13790 +
13791 + if (newFiber === null) {
13792 + // TODO: This breaks on empty slots like null children. That's
13793 + // unfortunate because it triggers the slow path all the time. We need
13794 + // a better way to communicate whether this was a miss or null,
13795 + // boolean, undefined, etc.
13796 + if (oldFiber === null) {
13797 + oldFiber = nextOldFiber;
13798 + }
13799 +
13800 + break;
13801 + }
13802 +
13803 + if (shouldTrackSideEffects) {
13804 + if (oldFiber && newFiber.alternate === null) {
13805 + // We matched the slot, but we didn't reuse the existing fiber, so we
13806 + // need to delete the existing child.
13807 + deleteChild(returnFiber, oldFiber);
13808 + }
13809 + }
13810 +
13811 + lastPlacedIndex = placeChild(newFiber, lastPlacedIndex, newIdx);
13812 +
13813 + if (previousNewFiber === null) {
13814 + // TODO: Move out of the loop. This only happens for the first run.
13815 + resultingFirstChild = newFiber;
13816 + } else {
13817 + // TODO: Defer siblings if we're not at the right index for this slot.
13818 + // I.e. if we had null values before, then we want to defer this
13819 + // for each null value. However, we also don't want to call updateSlot
13820 + // with the previous one.
13821 + previousNewFiber.sibling = newFiber;
13822 + }
13823 +
13824 + previousNewFiber = newFiber;
13825 + oldFiber = nextOldFiber;
13826 + }
13827 +
13828 + if (step.done) {
13829 + // We've reached the end of the new children. We can delete the rest.
13830 + deleteRemainingChildren(returnFiber, oldFiber);
13831 +
13832 + if (getIsHydrating()) {
13833 + var numberOfForks = newIdx;
13834 + pushTreeFork(returnFiber, numberOfForks);
13835 + }
13836 +
13837 + return resultingFirstChild;
13838 + }
13839 +
13840 + if (oldFiber === null) {
13841 + // If we don't have any more existing children we can choose a fast path
13842 + // since the rest will all be insertions.
13843 + for (; !step.done; newIdx++, step = newChildren.next()) {
13844 + var _newFiber3 = createChild(returnFiber, step.value, lanes);
13845 +
13846 + if (_newFiber3 === null) {
13847 + continue;
13848 + }
13849 +
13850 + lastPlacedIndex = placeChild(_newFiber3, lastPlacedIndex, newIdx);
13851 +
13852 + if (previousNewFiber === null) {
13853 + // TODO: Move out of the loop. This only happens for the first run.
13854 + resultingFirstChild = _newFiber3;
13855 + } else {
13856 + previousNewFiber.sibling = _newFiber3;
13857 + }
13858 +
13859 + previousNewFiber = _newFiber3;
13860 + }
13861 +
13862 + if (getIsHydrating()) {
13863 + var _numberOfForks3 = newIdx;
13864 + pushTreeFork(returnFiber, _numberOfForks3);
13865 + }
13866 +
13867 + return resultingFirstChild;
13868 + } // Add all children to a key map for quick lookups.
13869 +
13870 +
13871 + var existingChildren = mapRemainingChildren(returnFiber, oldFiber); // Keep scanning and use the map to restore deleted items as moves.
13872 +
13873 + for (; !step.done; newIdx++, step = newChildren.next()) {
13874 + var _newFiber4 = updateFromMap(existingChildren, returnFiber, newIdx, step.value, lanes);
13875 +
13876 + if (_newFiber4 !== null) {
13877 + if (shouldTrackSideEffects) {
13878 + if (_newFiber4.alternate !== null) {
13879 + // The new fiber is a work in progress, but if there exists a
13880 + // current, that means that we reused the fiber. We need to delete
13881 + // it from the child list so that we don't add it to the deletion
13882 + // list.
13883 + existingChildren.delete(_newFiber4.key === null ? newIdx : _newFiber4.key);
13884 + }
13885 + }
13886 +
13887 + lastPlacedIndex = placeChild(_newFiber4, lastPlacedIndex, newIdx);
13888 +
13889 + if (previousNewFiber === null) {
13890 + resultingFirstChild = _newFiber4;
13891 + } else {
13892 + previousNewFiber.sibling = _newFiber4;
13893 + }
13894 +
13895 + previousNewFiber = _newFiber4;
13896 + }
13897 + }
13898 +
13899 + if (shouldTrackSideEffects) {
13900 + // Any existing children that weren't consumed above were deleted. We need
13901 + // to add them to the deletion list.
13902 + existingChildren.forEach(function (child) {
13903 + return deleteChild(returnFiber, child);
13904 + });
13905 + }
13906 +
13907 + if (getIsHydrating()) {
13908 + var _numberOfForks4 = newIdx;
13909 + pushTreeFork(returnFiber, _numberOfForks4);
13910 + }
13911 +
13912 + return resultingFirstChild;
13913 + }
13914 +
13915 + function reconcileSingleTextNode(returnFiber, currentFirstChild, textContent, lanes) {
13916 + // There's no need to check for keys on text nodes since we don't have a
13917 + // way to define them.
13918 + if (currentFirstChild !== null && currentFirstChild.tag === HostText) {
13919 + // We already have an existing node so let's just update it and delete
13920 + // the rest.
13921 + deleteRemainingChildren(returnFiber, currentFirstChild.sibling);
13922 + var existing = useFiber(currentFirstChild, textContent);
13923 + existing.return = returnFiber;
13924 + return existing;
13925 + } // The existing first child is not a text node so we need to create one
13926 + // and delete the existing ones.
13927 +
13928 +
13929 + deleteRemainingChildren(returnFiber, currentFirstChild);
13930 + var created = createFiberFromText(textContent, returnFiber.mode, lanes);
13931 + created.return = returnFiber;
13932 + return created;
13933 + }
13934 +
13935 + function reconcileSingleElement(returnFiber, currentFirstChild, element, lanes) {
13936 + var key = element.key;
13937 + var child = currentFirstChild;
13938 +
13939 + while (child !== null) {
13940 + // TODO: If key === null and child.key === null, then this only applies to
13941 + // the first item in the list.
13942 + if (child.key === key) {
13943 + var elementType = element.type;
13944 +
13945 + if (elementType === REACT_FRAGMENT_TYPE) {
13946 + if (child.tag === Fragment) {
13947 + deleteRemainingChildren(returnFiber, child.sibling);
13948 + var existing = useFiber(child, element.props.children);
13949 + existing.return = returnFiber;
13950 +
13951 + {
13952 + existing._debugSource = element._source;
13953 + existing._debugOwner = element._owner;
13954 + }
13955 +
13956 + return existing;
13957 + }
13958 + } else {
13959 + if (child.elementType === elementType || ( // Keep this check inline so it only runs on the false path:
13960 + isCompatibleFamilyForHotReloading(child, element) ) || // Lazy types should reconcile their resolved type.
13961 + // We need to do this after the Hot Reloading check above,
13962 + // because hot reloading has different semantics than prod because
13963 + // it doesn't resuspend. So we can't let the call below suspend.
13964 + typeof elementType === 'object' && elementType !== null && elementType.$$typeof === REACT_LAZY_TYPE && resolveLazy(elementType) === child.type) {
13965 + deleteRemainingChildren(returnFiber, child.sibling);
13966 +
13967 + var _existing = useFiber(child, element.props);
13968 +
13969 + _existing.ref = coerceRef(returnFiber, child, element);
13970 + _existing.return = returnFiber;
13971 +
13972 + {
13973 + _existing._debugSource = element._source;
13974 + _existing._debugOwner = element._owner;
13975 + }
13976 +
13977 + return _existing;
13978 + }
13979 + } // Didn't match.
13980 +
13981 +
13982 + deleteRemainingChildren(returnFiber, child);
13983 + break;
13984 + } else {
13985 + deleteChild(returnFiber, child);
13986 + }
13987 +
13988 + child = child.sibling;
13989 + }
13990 +
13991 + if (element.type === REACT_FRAGMENT_TYPE) {
13992 + var created = createFiberFromFragment(element.props.children, returnFiber.mode, lanes, element.key);
13993 + created.return = returnFiber;
13994 + return created;
13995 + } else {
13996 + var _created4 = createFiberFromElement(element, returnFiber.mode, lanes);
13997 +
13998 + _created4.ref = coerceRef(returnFiber, currentFirstChild, element);
13999 + _created4.return = returnFiber;
14000 + return _created4;
14001 + }
14002 + }
14003 +
14004 + function reconcileSinglePortal(returnFiber, currentFirstChild, portal, lanes) {
14005 + var key = portal.key;
14006 + var child = currentFirstChild;
14007 +
14008 + while (child !== null) {
14009 + // TODO: If key === null and child.key === null, then this only applies to
14010 + // the first item in the list.
14011 + if (child.key === key) {
14012 + if (child.tag === HostPortal && child.stateNode.containerInfo === portal.containerInfo && child.stateNode.implementation === portal.implementation) {
14013 + deleteRemainingChildren(returnFiber, child.sibling);
14014 + var existing = useFiber(child, portal.children || []);
14015 + existing.return = returnFiber;
14016 + return existing;
14017 + } else {
14018 + deleteRemainingChildren(returnFiber, child);
14019 + break;
14020 + }
14021 + } else {
14022 + deleteChild(returnFiber, child);
14023 + }
14024 +
14025 + child = child.sibling;
14026 + }
14027 +
14028 + var created = createFiberFromPortal(portal, returnFiber.mode, lanes);
14029 + created.return = returnFiber;
14030 + return created;
14031 + } // This API will tag the children with the side-effect of the reconciliation
14032 + // itself. They will be added to the side-effect list as we pass through the
14033 + // children and the parent.
14034 +
14035 +
14036 + function reconcileChildFibers(returnFiber, currentFirstChild, newChild, lanes) {
14037 + // This function is not recursive.
14038 + // If the top level item is an array, we treat it as a set of children,
14039 + // not as a fragment. Nested arrays on the other hand will be treated as
14040 + // fragment nodes. Recursion happens at the normal flow.
14041 + // Handle top level unkeyed fragments as if they were arrays.
14042 + // This leads to an ambiguity between <>{[...]}</> and <>...</>.
14043 + // We treat the ambiguous cases above the same.
14044 + var isUnkeyedTopLevelFragment = typeof newChild === 'object' && newChild !== null && newChild.type === REACT_FRAGMENT_TYPE && newChild.key === null;
14045 +
14046 + if (isUnkeyedTopLevelFragment) {
14047 + newChild = newChild.props.children;
14048 + } // Handle object types
14049 +
14050 +
14051 + if (typeof newChild === 'object' && newChild !== null) {
14052 + switch (newChild.$$typeof) {
14053 + case REACT_ELEMENT_TYPE:
14054 + return placeSingleChild(reconcileSingleElement(returnFiber, currentFirstChild, newChild, lanes));
14055 +
14056 + case REACT_PORTAL_TYPE:
14057 + return placeSingleChild(reconcileSinglePortal(returnFiber, currentFirstChild, newChild, lanes));
14058 +
14059 + case REACT_LAZY_TYPE:
14060 + var payload = newChild._payload;
14061 + var init = newChild._init; // TODO: This function is supposed to be non-recursive.
14062 +
14063 + return reconcileChildFibers(returnFiber, currentFirstChild, init(payload), lanes);
14064 + }
14065 +
14066 + if (isArray(newChild)) {
14067 + return reconcileChildrenArray(returnFiber, currentFirstChild, newChild, lanes);
14068 + }
14069 +
14070 + if (getIteratorFn(newChild)) {
14071 + return reconcileChildrenIterator(returnFiber, currentFirstChild, newChild, lanes);
14072 + }
14073 +
14074 + throwOnInvalidObjectType(returnFiber, newChild);
14075 + }
14076 +
14077 + if (typeof newChild === 'string' && newChild !== '' || typeof newChild === 'number') {
14078 + return placeSingleChild(reconcileSingleTextNode(returnFiber, currentFirstChild, '' + newChild, lanes));
14079 + }
14080 +
14081 + {
14082 + if (typeof newChild === 'function') {
14083 + warnOnFunctionType(returnFiber);
14084 + }
14085 + } // Remaining cases are all treated as empty.
14086 +
14087 +
14088 + return deleteRemainingChildren(returnFiber, currentFirstChild);
14089 + }
14090 +
14091 + return reconcileChildFibers;
14092 + }
14093 +
14094 + var reconcileChildFibers = ChildReconciler(true);
14095 + var mountChildFibers = ChildReconciler(false);
14096 + function cloneChildFibers(current, workInProgress) {
14097 + if (current !== null && workInProgress.child !== current.child) {
14098 + throw new Error('Resuming work not yet implemented.');
14099 + }
14100 +
14101 + if (workInProgress.child === null) {
14102 + return;
14103 + }
14104 +
14105 + var currentChild = workInProgress.child;
14106 + var newChild = createWorkInProgress(currentChild, currentChild.pendingProps);
14107 + workInProgress.child = newChild;
14108 + newChild.return = workInProgress;
14109 +
14110 + while (currentChild.sibling !== null) {
14111 + currentChild = currentChild.sibling;
14112 + newChild = newChild.sibling = createWorkInProgress(currentChild, currentChild.pendingProps);
14113 + newChild.return = workInProgress;
14114 + }
14115 +
14116 + newChild.sibling = null;
14117 + } // Reset a workInProgress child set to prepare it for a second pass.
14118 +
14119 + function resetChildFibers(workInProgress, lanes) {
14120 + var child = workInProgress.child;
14121 +
14122 + while (child !== null) {
14123 + resetWorkInProgress(child, lanes);
14124 + child = child.sibling;
14125 + }
14126 + }
14127 +
14128 + var valueCursor = createCursor(null);
14129 + var rendererSigil;
14130 +
14131 + {
14132 + // Use this to detect multiple renderers using the same context
14133 + rendererSigil = {};
14134 + }
14135 +
14136 + var currentlyRenderingFiber = null;
14137 + var lastContextDependency = null;
14138 + var lastFullyObservedContext = null;
14139 + var isDisallowedContextReadInDEV = false;
14140 + function resetContextDependencies() {
14141 + // This is called right before React yields execution, to ensure `readContext`
14142 + // cannot be called outside the render phase.
14143 + currentlyRenderingFiber = null;
14144 + lastContextDependency = null;
14145 + lastFullyObservedContext = null;
14146 +
14147 + {
14148 + isDisallowedContextReadInDEV = false;
14149 + }
14150 + }
14151 + function enterDisallowedContextReadInDEV() {
14152 + {
14153 + isDisallowedContextReadInDEV = true;
14154 + }
14155 + }
14156 + function exitDisallowedContextReadInDEV() {
14157 + {
14158 + isDisallowedContextReadInDEV = false;
14159 + }
14160 + }
14161 + function pushProvider(providerFiber, context, nextValue) {
14162 + {
14163 + push(valueCursor, context._currentValue, providerFiber);
14164 + context._currentValue = nextValue;
14165 +
14166 + {
14167 + if (context._currentRenderer !== undefined && context._currentRenderer !== null && context._currentRenderer !== rendererSigil) {
14168 + error('Detected multiple renderers concurrently rendering the ' + 'same context provider. This is currently unsupported.');
14169 + }
14170 +
14171 + context._currentRenderer = rendererSigil;
14172 + }
14173 + }
14174 + }
14175 + function popProvider(context, providerFiber) {
14176 + var currentValue = valueCursor.current;
14177 + pop(valueCursor, providerFiber);
14178 +
14179 + {
14180 + {
14181 + context._currentValue = currentValue;
14182 + }
14183 + }
14184 + }
14185 + function scheduleContextWorkOnParentPath(parent, renderLanes, propagationRoot) {
14186 + // Update the child lanes of all the ancestors, including the alternates.
14187 + var node = parent;
14188 +
14189 + while (node !== null) {
14190 + var alternate = node.alternate;
14191 +
14192 + if (!isSubsetOfLanes(node.childLanes, renderLanes)) {
14193 + node.childLanes = mergeLanes(node.childLanes, renderLanes);
14194 +
14195 + if (alternate !== null) {
14196 + alternate.childLanes = mergeLanes(alternate.childLanes, renderLanes);
14197 + }
14198 + } else if (alternate !== null && !isSubsetOfLanes(alternate.childLanes, renderLanes)) {
14199 + alternate.childLanes = mergeLanes(alternate.childLanes, renderLanes);
14200 + }
14201 +
14202 + if (node === propagationRoot) {
14203 + break;
14204 + }
14205 +
14206 + node = node.return;
14207 + }
14208 +
14209 + {
14210 + if (node !== propagationRoot) {
14211 + error('Expected to find the propagation root when scheduling context work. ' + 'This error is likely caused by a bug in React. Please file an issue.');
14212 + }
14213 + }
14214 + }
14215 + function propagateContextChange(workInProgress, context, renderLanes) {
14216 + {
14217 + propagateContextChange_eager(workInProgress, context, renderLanes);
14218 + }
14219 + }
14220 +
14221 + function propagateContextChange_eager(workInProgress, context, renderLanes) {
14222 +
14223 + var fiber = workInProgress.child;
14224 +
14225 + if (fiber !== null) {
14226 + // Set the return pointer of the child to the work-in-progress fiber.
14227 + fiber.return = workInProgress;
14228 + }
14229 +
14230 + while (fiber !== null) {
14231 + var nextFiber = void 0; // Visit this fiber.
14232 +
14233 + var list = fiber.dependencies;
14234 +
14235 + if (list !== null) {
14236 + nextFiber = fiber.child;
14237 + var dependency = list.firstContext;
14238 +
14239 + while (dependency !== null) {
14240 + // Check if the context matches.
14241 + if (dependency.context === context) {
14242 + // Match! Schedule an update on this fiber.
14243 + if (fiber.tag === ClassComponent) {
14244 + // Schedule a force update on the work-in-progress.
14245 + var lane = pickArbitraryLane(renderLanes);
14246 + var update = createUpdate(NoTimestamp, lane);
14247 + update.tag = ForceUpdate; // TODO: Because we don't have a work-in-progress, this will add the
14248 + // update to the current fiber, too, which means it will persist even if
14249 + // this render is thrown away. Since it's a race condition, not sure it's
14250 + // worth fixing.
14251 + // Inlined `enqueueUpdate` to remove interleaved update check
14252 +
14253 + var updateQueue = fiber.updateQueue;
14254 +
14255 + if (updateQueue === null) ; else {
14256 + var sharedQueue = updateQueue.shared;
14257 + var pending = sharedQueue.pending;
14258 +
14259 + if (pending === null) {
14260 + // This is the first update. Create a circular list.
14261 + update.next = update;
14262 + } else {
14263 + update.next = pending.next;
14264 + pending.next = update;
14265 + }
14266 +
14267 + sharedQueue.pending = update;
14268 + }
14269 + }
14270 +
14271 + fiber.lanes = mergeLanes(fiber.lanes, renderLanes);
14272 + var alternate = fiber.alternate;
14273 +
14274 + if (alternate !== null) {
14275 + alternate.lanes = mergeLanes(alternate.lanes, renderLanes);
14276 + }
14277 +
14278 + scheduleContextWorkOnParentPath(fiber.return, renderLanes, workInProgress); // Mark the updated lanes on the list, too.
14279 +
14280 + list.lanes = mergeLanes(list.lanes, renderLanes); // Since we already found a match, we can stop traversing the
14281 + // dependency list.
14282 +
14283 + break;
14284 + }
14285 +
14286 + dependency = dependency.next;
14287 + }
14288 + } else if (fiber.tag === ContextProvider) {
14289 + // Don't scan deeper if this is a matching provider
14290 + nextFiber = fiber.type === workInProgress.type ? null : fiber.child;
14291 + } else if (fiber.tag === DehydratedFragment) {
14292 + // If a dehydrated suspense boundary is in this subtree, we don't know
14293 + // if it will have any context consumers in it. The best we can do is
14294 + // mark it as having updates.
14295 + var parentSuspense = fiber.return;
14296 +
14297 + if (parentSuspense === null) {
14298 + throw new Error('We just came from a parent so we must have had a parent. This is a bug in React.');
14299 + }
14300 +
14301 + parentSuspense.lanes = mergeLanes(parentSuspense.lanes, renderLanes);
14302 + var _alternate = parentSuspense.alternate;
14303 +
14304 + if (_alternate !== null) {
14305 + _alternate.lanes = mergeLanes(_alternate.lanes, renderLanes);
14306 + } // This is intentionally passing this fiber as the parent
14307 + // because we want to schedule this fiber as having work
14308 + // on its children. We'll use the childLanes on
14309 + // this fiber to indicate that a context has changed.
14310 +
14311 +
14312 + scheduleContextWorkOnParentPath(parentSuspense, renderLanes, workInProgress);
14313 + nextFiber = fiber.sibling;
14314 + } else {
14315 + // Traverse down.
14316 + nextFiber = fiber.child;
14317 + }
14318 +
14319 + if (nextFiber !== null) {
14320 + // Set the return pointer of the child to the work-in-progress fiber.
14321 + nextFiber.return = fiber;
14322 + } else {
14323 + // No child. Traverse to next sibling.
14324 + nextFiber = fiber;
14325 +
14326 + while (nextFiber !== null) {
14327 + if (nextFiber === workInProgress) {
14328 + // We're back to the root of this subtree. Exit.
14329 + nextFiber = null;
14330 + break;
14331 + }
14332 +
14333 + var sibling = nextFiber.sibling;
14334 +
14335 + if (sibling !== null) {
14336 + // Set the return pointer of the sibling to the work-in-progress fiber.
14337 + sibling.return = nextFiber.return;
14338 + nextFiber = sibling;
14339 + break;
14340 + } // No more siblings. Traverse up.
14341 +
14342 +
14343 + nextFiber = nextFiber.return;
14344 + }
14345 + }
14346 +
14347 + fiber = nextFiber;
14348 + }
14349 + }
14350 + function prepareToReadContext(workInProgress, renderLanes) {
14351 + currentlyRenderingFiber = workInProgress;
14352 + lastContextDependency = null;
14353 + lastFullyObservedContext = null;
14354 + var dependencies = workInProgress.dependencies;
14355 +
14356 + if (dependencies !== null) {
14357 + {
14358 + var firstContext = dependencies.firstContext;
14359 +
14360 + if (firstContext !== null) {
14361 + if (includesSomeLane(dependencies.lanes, renderLanes)) {
14362 + // Context list has a pending update. Mark that this fiber performed work.
14363 + markWorkInProgressReceivedUpdate();
14364 + } // Reset the work-in-progress list
14365 +
14366 +
14367 + dependencies.firstContext = null;
14368 + }
14369 + }
14370 + }
14371 + }
14372 + function readContext(context) {
14373 + {
14374 + // This warning would fire if you read context inside a Hook like useMemo.
14375 + // Unlike the class check below, it's not enforced in production for perf.
14376 + if (isDisallowedContextReadInDEV) {
14377 + error('Context can only be read while React is rendering. ' + 'In classes, you can read it in the render method or getDerivedStateFromProps. ' + 'In function components, you can read it directly in the function body, but not ' + 'inside Hooks like useReducer() or useMemo().');
14378 + }
14379 + }
14380 +
14381 + var value = context._currentValue ;
14382 +
14383 + if (lastFullyObservedContext === context) ; else {
14384 + var contextItem = {
14385 + context: context,
14386 + memoizedValue: value,
14387 + next: null
14388 + };
14389 +
14390 + if (lastContextDependency === null) {
14391 + if (currentlyRenderingFiber === null) {
14392 + throw new Error('Context can only be read while React is rendering. ' + 'In classes, you can read it in the render method or getDerivedStateFromProps. ' + 'In function components, you can read it directly in the function body, but not ' + 'inside Hooks like useReducer() or useMemo().');
14393 + } // This is the first dependency for this component. Create a new list.
14394 +
14395 +
14396 + lastContextDependency = contextItem;
14397 + currentlyRenderingFiber.dependencies = {
14398 + lanes: NoLanes,
14399 + firstContext: contextItem
14400 + };
14401 + } else {
14402 + // Append a new context item.
14403 + lastContextDependency = lastContextDependency.next = contextItem;
14404 + }
14405 + }
14406 +
14407 + return value;
14408 + }
14409 +
14410 + // render. When this render exits, either because it finishes or because it is
14411 + // interrupted, the interleaved updates will be transferred onto the main part
14412 + // of the queue.
14413 +
14414 + var concurrentQueues = null;
14415 + function pushConcurrentUpdateQueue(queue) {
14416 + if (concurrentQueues === null) {
14417 + concurrentQueues = [queue];
14418 + } else {
14419 + concurrentQueues.push(queue);
14420 + }
14421 + }
14422 + function finishQueueingConcurrentUpdates() {
14423 + // Transfer the interleaved updates onto the main queue. Each queue has a
14424 + // `pending` field and an `interleaved` field. When they are not null, they
14425 + // point to the last node in a circular linked list. We need to append the
14426 + // interleaved list to the end of the pending list by joining them into a
14427 + // single, circular list.
14428 + if (concurrentQueues !== null) {
14429 + for (var i = 0; i < concurrentQueues.length; i++) {
14430 + var queue = concurrentQueues[i];
14431 + var lastInterleavedUpdate = queue.interleaved;
14432 +
14433 + if (lastInterleavedUpdate !== null) {
14434 + queue.interleaved = null;
14435 + var firstInterleavedUpdate = lastInterleavedUpdate.next;
14436 + var lastPendingUpdate = queue.pending;
14437 +
14438 + if (lastPendingUpdate !== null) {
14439 + var firstPendingUpdate = lastPendingUpdate.next;
14440 + lastPendingUpdate.next = firstInterleavedUpdate;
14441 + lastInterleavedUpdate.next = firstPendingUpdate;
14442 + }
14443 +
14444 + queue.pending = lastInterleavedUpdate;
14445 + }
14446 + }
14447 +
14448 + concurrentQueues = null;
14449 + }
14450 + }
14451 + function enqueueConcurrentHookUpdate(fiber, queue, update, lane) {
14452 + var interleaved = queue.interleaved;
14453 +
14454 + if (interleaved === null) {
14455 + // This is the first update. Create a circular list.
14456 + update.next = update; // At the end of the current render, this queue's interleaved updates will
14457 + // be transferred to the pending queue.
14458 +
14459 + pushConcurrentUpdateQueue(queue);
14460 + } else {
14461 + update.next = interleaved.next;
14462 + interleaved.next = update;
14463 + }
14464 +
14465 + queue.interleaved = update;
14466 + return markUpdateLaneFromFiberToRoot(fiber, lane);
14467 + }
14468 + function enqueueConcurrentHookUpdateAndEagerlyBailout(fiber, queue, update, lane) {
14469 + var interleaved = queue.interleaved;
14470 +
14471 + if (interleaved === null) {
14472 + // This is the first update. Create a circular list.
14473 + update.next = update; // At the end of the current render, this queue's interleaved updates will
14474 + // be transferred to the pending queue.
14475 +
14476 + pushConcurrentUpdateQueue(queue);
14477 + } else {
14478 + update.next = interleaved.next;
14479 + interleaved.next = update;
14480 + }
14481 +
14482 + queue.interleaved = update;
14483 + }
14484 + function enqueueConcurrentClassUpdate(fiber, queue, update, lane) {
14485 + var interleaved = queue.interleaved;
14486 +
14487 + if (interleaved === null) {
14488 + // This is the first update. Create a circular list.
14489 + update.next = update; // At the end of the current render, this queue's interleaved updates will
14490 + // be transferred to the pending queue.
14491 +
14492 + pushConcurrentUpdateQueue(queue);
14493 + } else {
14494 + update.next = interleaved.next;
14495 + interleaved.next = update;
14496 + }
14497 +
14498 + queue.interleaved = update;
14499 + return markUpdateLaneFromFiberToRoot(fiber, lane);
14500 + }
14501 + function enqueueConcurrentRenderForLane(fiber, lane) {
14502 + return markUpdateLaneFromFiberToRoot(fiber, lane);
14503 + } // Calling this function outside this module should only be done for backwards
14504 + // compatibility and should always be accompanied by a warning.
14505 +
14506 + var unsafe_markUpdateLaneFromFiberToRoot = markUpdateLaneFromFiberToRoot;
14507 +
14508 + function markUpdateLaneFromFiberToRoot(sourceFiber, lane) {
14509 + // Update the source fiber's lanes
14510 + sourceFiber.lanes = mergeLanes(sourceFiber.lanes, lane);
14511 + var alternate = sourceFiber.alternate;
14512 +
14513 + if (alternate !== null) {
14514 + alternate.lanes = mergeLanes(alternate.lanes, lane);
14515 + }
14516 +
14517 + {
14518 + if (alternate === null && (sourceFiber.flags & (Placement | Hydrating)) !== NoFlags) {
14519 + warnAboutUpdateOnNotYetMountedFiberInDEV(sourceFiber);
14520 + }
14521 + } // Walk the parent path to the root and update the child lanes.
14522 +
14523 +
14524 + var node = sourceFiber;
14525 + var parent = sourceFiber.return;
14526 +
14527 + while (parent !== null) {
14528 + parent.childLanes = mergeLanes(parent.childLanes, lane);
14529 + alternate = parent.alternate;
14530 +
14531 + if (alternate !== null) {
14532 + alternate.childLanes = mergeLanes(alternate.childLanes, lane);
14533 + } else {
14534 + {
14535 + if ((parent.flags & (Placement | Hydrating)) !== NoFlags) {
14536 + warnAboutUpdateOnNotYetMountedFiberInDEV(sourceFiber);
14537 + }
14538 + }
14539 + }
14540 +
14541 + node = parent;
14542 + parent = parent.return;
14543 + }
14544 +
14545 + if (node.tag === HostRoot) {
14546 + var root = node.stateNode;
14547 + return root;
14548 + } else {
14549 + return null;
14550 + }
14551 + }
14552 +
14553 + var UpdateState = 0;
14554 + var ReplaceState = 1;
14555 + var ForceUpdate = 2;
14556 + var CaptureUpdate = 3; // Global state that is reset at the beginning of calling `processUpdateQueue`.
14557 + // It should only be read right after calling `processUpdateQueue`, via
14558 + // `checkHasForceUpdateAfterProcessing`.
14559 +
14560 + var hasForceUpdate = false;
14561 + var didWarnUpdateInsideUpdate;
14562 + var currentlyProcessingQueue;
14563 +
14564 + {
14565 + didWarnUpdateInsideUpdate = false;
14566 + currentlyProcessingQueue = null;
14567 + }
14568 +
14569 + function initializeUpdateQueue(fiber) {
14570 + var queue = {
14571 + baseState: fiber.memoizedState,
14572 + firstBaseUpdate: null,
14573 + lastBaseUpdate: null,
14574 + shared: {
14575 + pending: null,
14576 + interleaved: null,
14577 + lanes: NoLanes
14578 + },
14579 + effects: null
14580 + };
14581 + fiber.updateQueue = queue;
14582 + }
14583 + function cloneUpdateQueue(current, workInProgress) {
14584 + // Clone the update queue from current. Unless it's already a clone.
14585 + var queue = workInProgress.updateQueue;
14586 + var currentQueue = current.updateQueue;
14587 +
14588 + if (queue === currentQueue) {
14589 + var clone = {
14590 + baseState: currentQueue.baseState,
14591 + firstBaseUpdate: currentQueue.firstBaseUpdate,
14592 + lastBaseUpdate: currentQueue.lastBaseUpdate,
14593 + shared: currentQueue.shared,
14594 + effects: currentQueue.effects
14595 + };
14596 + workInProgress.updateQueue = clone;
14597 + }
14598 + }
14599 + function createUpdate(eventTime, lane) {
14600 + var update = {
14601 + eventTime: eventTime,
14602 + lane: lane,
14603 + tag: UpdateState,
14604 + payload: null,
14605 + callback: null,
14606 + next: null
14607 + };
14608 + return update;
14609 + }
14610 + function enqueueUpdate(fiber, update, lane) {
14611 + var updateQueue = fiber.updateQueue;
14612 +
14613 + if (updateQueue === null) {
14614 + // Only occurs if the fiber has been unmounted.
14615 + return null;
14616 + }
14617 +
14618 + var sharedQueue = updateQueue.shared;
14619 +
14620 + {
14621 + if (currentlyProcessingQueue === sharedQueue && !didWarnUpdateInsideUpdate) {
14622 + error('An update (setState, replaceState, or forceUpdate) was scheduled ' + 'from inside an update function. Update functions should be pure, ' + 'with zero side-effects. Consider using componentDidUpdate or a ' + 'callback.');
14623 +
14624 + didWarnUpdateInsideUpdate = true;
14625 + }
14626 + }
14627 +
14628 + if (isUnsafeClassRenderPhaseUpdate()) {
14629 + // This is an unsafe render phase update. Add directly to the update
14630 + // queue so we can process it immediately during the current render.
14631 + var pending = sharedQueue.pending;
14632 +
14633 + if (pending === null) {
14634 + // This is the first update. Create a circular list.
14635 + update.next = update;
14636 + } else {
14637 + update.next = pending.next;
14638 + pending.next = update;
14639 + }
14640 +
14641 + sharedQueue.pending = update; // Update the childLanes even though we're most likely already rendering
14642 + // this fiber. This is for backwards compatibility in the case where you
14643 + // update a different component during render phase than the one that is
14644 + // currently renderings (a pattern that is accompanied by a warning).
14645 +
14646 + return unsafe_markUpdateLaneFromFiberToRoot(fiber, lane);
14647 + } else {
14648 + return enqueueConcurrentClassUpdate(fiber, sharedQueue, update, lane);
14649 + }
14650 + }
14651 + function entangleTransitions(root, fiber, lane) {
14652 + var updateQueue = fiber.updateQueue;
14653 +
14654 + if (updateQueue === null) {
14655 + // Only occurs if the fiber has been unmounted.
14656 + return;
14657 + }
14658 +
14659 + var sharedQueue = updateQueue.shared;
14660 +
14661 + if (isTransitionLane(lane)) {
14662 + var queueLanes = sharedQueue.lanes; // If any entangled lanes are no longer pending on the root, then they must
14663 + // have finished. We can remove them from the shared queue, which represents
14664 + // a superset of the actually pending lanes. In some cases we may entangle
14665 + // more than we need to, but that's OK. In fact it's worse if we *don't*
14666 + // entangle when we should.
14667 +
14668 + queueLanes = intersectLanes(queueLanes, root.pendingLanes); // Entangle the new transition lane with the other transition lanes.
14669 +
14670 + var newQueueLanes = mergeLanes(queueLanes, lane);
14671 + sharedQueue.lanes = newQueueLanes; // Even if queue.lanes already include lane, we don't know for certain if
14672 + // the lane finished since the last time we entangled it. So we need to
14673 + // entangle it again, just to be sure.
14674 +
14675 + markRootEntangled(root, newQueueLanes);
14676 + }
14677 + }
14678 + function enqueueCapturedUpdate(workInProgress, capturedUpdate) {
14679 + // Captured updates are updates that are thrown by a child during the render
14680 + // phase. They should be discarded if the render is aborted. Therefore,
14681 + // we should only put them on the work-in-progress queue, not the current one.
14682 + var queue = workInProgress.updateQueue; // Check if the work-in-progress queue is a clone.
14683 +
14684 + var current = workInProgress.alternate;
14685 +
14686 + if (current !== null) {
14687 + var currentQueue = current.updateQueue;
14688 +
14689 + if (queue === currentQueue) {
14690 + // The work-in-progress queue is the same as current. This happens when
14691 + // we bail out on a parent fiber that then captures an error thrown by
14692 + // a child. Since we want to append the update only to the work-in
14693 + // -progress queue, we need to clone the updates. We usually clone during
14694 + // processUpdateQueue, but that didn't happen in this case because we
14695 + // skipped over the parent when we bailed out.
14696 + var newFirst = null;
14697 + var newLast = null;
14698 + var firstBaseUpdate = queue.firstBaseUpdate;
14699 +
14700 + if (firstBaseUpdate !== null) {
14701 + // Loop through the updates and clone them.
14702 + var update = firstBaseUpdate;
14703 +
14704 + do {
14705 + var clone = {
14706 + eventTime: update.eventTime,
14707 + lane: update.lane,
14708 + tag: update.tag,
14709 + payload: update.payload,
14710 + callback: update.callback,
14711 + next: null
14712 + };
14713 +
14714 + if (newLast === null) {
14715 + newFirst = newLast = clone;
14716 + } else {
14717 + newLast.next = clone;
14718 + newLast = clone;
14719 + }
14720 +
14721 + update = update.next;
14722 + } while (update !== null); // Append the captured update the end of the cloned list.
14723 +
14724 +
14725 + if (newLast === null) {
14726 + newFirst = newLast = capturedUpdate;
14727 + } else {
14728 + newLast.next = capturedUpdate;
14729 + newLast = capturedUpdate;
14730 + }
14731 + } else {
14732 + // There are no base updates.
14733 + newFirst = newLast = capturedUpdate;
14734 + }
14735 +
14736 + queue = {
14737 + baseState: currentQueue.baseState,
14738 + firstBaseUpdate: newFirst,
14739 + lastBaseUpdate: newLast,
14740 + shared: currentQueue.shared,
14741 + effects: currentQueue.effects
14742 + };
14743 + workInProgress.updateQueue = queue;
14744 + return;
14745 + }
14746 + } // Append the update to the end of the list.
14747 +
14748 +
14749 + var lastBaseUpdate = queue.lastBaseUpdate;
14750 +
14751 + if (lastBaseUpdate === null) {
14752 + queue.firstBaseUpdate = capturedUpdate;
14753 + } else {
14754 + lastBaseUpdate.next = capturedUpdate;
14755 + }
14756 +
14757 + queue.lastBaseUpdate = capturedUpdate;
14758 + }
14759 +
14760 + function getStateFromUpdate(workInProgress, queue, update, prevState, nextProps, instance) {
14761 + switch (update.tag) {
14762 + case ReplaceState:
14763 + {
14764 + var payload = update.payload;
14765 +
14766 + if (typeof payload === 'function') {
14767 + // Updater function
14768 + {
14769 + enterDisallowedContextReadInDEV();
14770 + }
14771 +
14772 + var nextState = payload.call(instance, prevState, nextProps);
14773 +
14774 + {
14775 + if ( workInProgress.mode & StrictLegacyMode) {
14776 + setIsStrictModeForDevtools(true);
14777 +
14778 + try {
14779 + payload.call(instance, prevState, nextProps);
14780 + } finally {
14781 + setIsStrictModeForDevtools(false);
14782 + }
14783 + }
14784 +
14785 + exitDisallowedContextReadInDEV();
14786 + }
14787 +
14788 + return nextState;
14789 + } // State object
14790 +
14791 +
14792 + return payload;
14793 + }
14794 +
14795 + case CaptureUpdate:
14796 + {
14797 + workInProgress.flags = workInProgress.flags & ~ShouldCapture | DidCapture;
14798 + }
14799 + // Intentional fallthrough
14800 +
14801 + case UpdateState:
14802 + {
14803 + var _payload = update.payload;
14804 + var partialState;
14805 +
14806 + if (typeof _payload === 'function') {
14807 + // Updater function
14808 + {
14809 + enterDisallowedContextReadInDEV();
14810 + }
14811 +
14812 + partialState = _payload.call(instance, prevState, nextProps);
14813 +
14814 + {
14815 + if ( workInProgress.mode & StrictLegacyMode) {
14816 + setIsStrictModeForDevtools(true);
14817 +
14818 + try {
14819 + _payload.call(instance, prevState, nextProps);
14820 + } finally {
14821 + setIsStrictModeForDevtools(false);
14822 + }
14823 + }
14824 +
14825 + exitDisallowedContextReadInDEV();
14826 + }
14827 + } else {
14828 + // Partial state object
14829 + partialState = _payload;
14830 + }
14831 +
14832 + if (partialState === null || partialState === undefined) {
14833 + // Null and undefined are treated as no-ops.
14834 + return prevState;
14835 + } // Merge the partial state and the previous state.
14836 +
14837 +
14838 + return assign({}, prevState, partialState);
14839 + }
14840 +
14841 + case ForceUpdate:
14842 + {
14843 + hasForceUpdate = true;
14844 + return prevState;
14845 + }
14846 + }
14847 +
14848 + return prevState;
14849 + }
14850 +
14851 + function processUpdateQueue(workInProgress, props, instance, renderLanes) {
14852 + // This is always non-null on a ClassComponent or HostRoot
14853 + var queue = workInProgress.updateQueue;
14854 + hasForceUpdate = false;
14855 +
14856 + {
14857 + currentlyProcessingQueue = queue.shared;
14858 + }
14859 +
14860 + var firstBaseUpdate = queue.firstBaseUpdate;
14861 + var lastBaseUpdate = queue.lastBaseUpdate; // Check if there are pending updates. If so, transfer them to the base queue.
14862 +
14863 + var pendingQueue = queue.shared.pending;
14864 +
14865 + if (pendingQueue !== null) {
14866 + queue.shared.pending = null; // The pending queue is circular. Disconnect the pointer between first
14867 + // and last so that it's non-circular.
14868 +
14869 + var lastPendingUpdate = pendingQueue;
14870 + var firstPendingUpdate = lastPendingUpdate.next;
14871 + lastPendingUpdate.next = null; // Append pending updates to base queue
14872 +
14873 + if (lastBaseUpdate === null) {
14874 + firstBaseUpdate = firstPendingUpdate;
14875 + } else {
14876 + lastBaseUpdate.next = firstPendingUpdate;
14877 + }
14878 +
14879 + lastBaseUpdate = lastPendingUpdate; // If there's a current queue, and it's different from the base queue, then
14880 + // we need to transfer the updates to that queue, too. Because the base
14881 + // queue is a singly-linked list with no cycles, we can append to both
14882 + // lists and take advantage of structural sharing.
14883 + // TODO: Pass `current` as argument
14884 +
14885 + var current = workInProgress.alternate;
14886 +
14887 + if (current !== null) {
14888 + // This is always non-null on a ClassComponent or HostRoot
14889 + var currentQueue = current.updateQueue;
14890 + var currentLastBaseUpdate = currentQueue.lastBaseUpdate;
14891 +
14892 + if (currentLastBaseUpdate !== lastBaseUpdate) {
14893 + if (currentLastBaseUpdate === null) {
14894 + currentQueue.firstBaseUpdate = firstPendingUpdate;
14895 + } else {
14896 + currentLastBaseUpdate.next = firstPendingUpdate;
14897 + }
14898 +
14899 + currentQueue.lastBaseUpdate = lastPendingUpdate;
14900 + }
14901 + }
14902 + } // These values may change as we process the queue.
14903 +
14904 +
14905 + if (firstBaseUpdate !== null) {
14906 + // Iterate through the list of updates to compute the result.
14907 + var newState = queue.baseState; // TODO: Don't need to accumulate this. Instead, we can remove renderLanes
14908 + // from the original lanes.
14909 +
14910 + var newLanes = NoLanes;
14911 + var newBaseState = null;
14912 + var newFirstBaseUpdate = null;
14913 + var newLastBaseUpdate = null;
14914 + var update = firstBaseUpdate;
14915 +
14916 + do {
14917 + var updateLane = update.lane;
14918 + var updateEventTime = update.eventTime;
14919 +
14920 + if (!isSubsetOfLanes(renderLanes, updateLane)) {
14921 + // Priority is insufficient. Skip this update. If this is the first
14922 + // skipped update, the previous update/state is the new base
14923 + // update/state.
14924 + var clone = {
14925 + eventTime: updateEventTime,
14926 + lane: updateLane,
14927 + tag: update.tag,
14928 + payload: update.payload,
14929 + callback: update.callback,
14930 + next: null
14931 + };
14932 +
14933 + if (newLastBaseUpdate === null) {
14934 + newFirstBaseUpdate = newLastBaseUpdate = clone;
14935 + newBaseState = newState;
14936 + } else {
14937 + newLastBaseUpdate = newLastBaseUpdate.next = clone;
14938 + } // Update the remaining priority in the queue.
14939 +
14940 +
14941 + newLanes = mergeLanes(newLanes, updateLane);
14942 + } else {
14943 + // This update does have sufficient priority.
14944 + if (newLastBaseUpdate !== null) {
14945 + var _clone = {
14946 + eventTime: updateEventTime,
14947 + // This update is going to be committed so we never want uncommit
14948 + // it. Using NoLane works because 0 is a subset of all bitmasks, so
14949 + // this will never be skipped by the check above.
14950 + lane: NoLane,
14951 + tag: update.tag,
14952 + payload: update.payload,
14953 + callback: update.callback,
14954 + next: null
14955 + };
14956 + newLastBaseUpdate = newLastBaseUpdate.next = _clone;
14957 + } // Process this update.
14958 +
14959 +
14960 + newState = getStateFromUpdate(workInProgress, queue, update, newState, props, instance);
14961 + var callback = update.callback;
14962 +
14963 + if (callback !== null && // If the update was already committed, we should not queue its
14964 + // callback again.
14965 + update.lane !== NoLane) {
14966 + workInProgress.flags |= Callback;
14967 + var effects = queue.effects;
14968 +
14969 + if (effects === null) {
14970 + queue.effects = [update];
14971 + } else {
14972 + effects.push(update);
14973 + }
14974 + }
14975 + }
14976 +
14977 + update = update.next;
14978 +
14979 + if (update === null) {
14980 + pendingQueue = queue.shared.pending;
14981 +
14982 + if (pendingQueue === null) {
14983 + break;
14984 + } else {
14985 + // An update was scheduled from inside a reducer. Add the new
14986 + // pending updates to the end of the list and keep processing.
14987 + var _lastPendingUpdate = pendingQueue; // Intentionally unsound. Pending updates form a circular list, but we
14988 + // unravel them when transferring them to the base queue.
14989 +
14990 + var _firstPendingUpdate = _lastPendingUpdate.next;
14991 + _lastPendingUpdate.next = null;
14992 + update = _firstPendingUpdate;
14993 + queue.lastBaseUpdate = _lastPendingUpdate;
14994 + queue.shared.pending = null;
14995 + }
14996 + }
14997 + } while (true);
14998 +
14999 + if (newLastBaseUpdate === null) {
15000 + newBaseState = newState;
15001 + }
15002 +
15003 + queue.baseState = newBaseState;
15004 + queue.firstBaseUpdate = newFirstBaseUpdate;
15005 + queue.lastBaseUpdate = newLastBaseUpdate; // Interleaved updates are stored on a separate queue. We aren't going to
15006 + // process them during this render, but we do need to track which lanes
15007 + // are remaining.
15008 +
15009 + var lastInterleaved = queue.shared.interleaved;
15010 +
15011 + if (lastInterleaved !== null) {
15012 + var interleaved = lastInterleaved;
15013 +
15014 + do {
15015 + newLanes = mergeLanes(newLanes, interleaved.lane);
15016 + interleaved = interleaved.next;
15017 + } while (interleaved !== lastInterleaved);
15018 + } else if (firstBaseUpdate === null) {
15019 + // `queue.lanes` is used for entangling transitions. We can set it back to
15020 + // zero once the queue is empty.
15021 + queue.shared.lanes = NoLanes;
15022 + } // Set the remaining expiration time to be whatever is remaining in the queue.
15023 + // This should be fine because the only two other things that contribute to
15024 + // expiration time are props and context. We're already in the middle of the
15025 + // begin phase by the time we start processing the queue, so we've already
15026 + // dealt with the props. Context in components that specify
15027 + // shouldComponentUpdate is tricky; but we'll have to account for
15028 + // that regardless.
15029 +
15030 +
15031 + markSkippedUpdateLanes(newLanes);
15032 + workInProgress.lanes = newLanes;
15033 + workInProgress.memoizedState = newState;
15034 + }
15035 +
15036 + {
15037 + currentlyProcessingQueue = null;
15038 + }
15039 + }
15040 +
15041 + function callCallback(callback, context) {
15042 + if (typeof callback !== 'function') {
15043 + throw new Error('Invalid argument passed as callback. Expected a function. Instead ' + ("received: " + callback));
15044 + }
15045 +
15046 + callback.call(context);
15047 + }
15048 +
15049 + function resetHasForceUpdateBeforeProcessing() {
15050 + hasForceUpdate = false;
15051 + }
15052 + function checkHasForceUpdateAfterProcessing() {
15053 + return hasForceUpdate;
15054 + }
15055 + function commitUpdateQueue(finishedWork, finishedQueue, instance) {
15056 + // Commit the effects
15057 + var effects = finishedQueue.effects;
15058 + finishedQueue.effects = null;
15059 +
15060 + if (effects !== null) {
15061 + for (var i = 0; i < effects.length; i++) {
15062 + var effect = effects[i];
15063 + var callback = effect.callback;
15064 +
15065 + if (callback !== null) {
15066 + effect.callback = null;
15067 + callCallback(callback, instance);
15068 + }
15069 + }
15070 + }
15071 + }
15072 +
15073 + var NO_CONTEXT = {};
15074 + var contextStackCursor$1 = createCursor(NO_CONTEXT);
15075 + var contextFiberStackCursor = createCursor(NO_CONTEXT);
15076 + var rootInstanceStackCursor = createCursor(NO_CONTEXT);
15077 +
15078 + function requiredContext(c) {
15079 + if (c === NO_CONTEXT) {
15080 + throw new Error('Expected host context to exist. This error is likely caused by a bug ' + 'in React. Please file an issue.');
15081 + }
15082 +
15083 + return c;
15084 + }
15085 +
15086 + function getRootHostContainer() {
15087 + var rootInstance = requiredContext(rootInstanceStackCursor.current);
15088 + return rootInstance;
15089 + }
15090 +
15091 + function pushHostContainer(fiber, nextRootInstance) {
15092 + // Push current root instance onto the stack;
15093 + // This allows us to reset root when portals are popped.
15094 + push(rootInstanceStackCursor, nextRootInstance, fiber); // Track the context and the Fiber that provided it.
15095 + // This enables us to pop only Fibers that provide unique contexts.
15096 +
15097 + push(contextFiberStackCursor, fiber, fiber); // Finally, we need to push the host context to the stack.
15098 + // However, we can't just call getRootHostContext() and push it because
15099 + // we'd have a different number of entries on the stack depending on
15100 + // whether getRootHostContext() throws somewhere in renderer code or not.
15101 + // So we push an empty value first. This lets us safely unwind on errors.
15102 +
15103 + push(contextStackCursor$1, NO_CONTEXT, fiber);
15104 + var nextRootContext = getRootHostContext(nextRootInstance); // Now that we know this function doesn't throw, replace it.
15105 +
15106 + pop(contextStackCursor$1, fiber);
15107 + push(contextStackCursor$1, nextRootContext, fiber);
15108 + }
15109 +
15110 + function popHostContainer(fiber) {
15111 + pop(contextStackCursor$1, fiber);
15112 + pop(contextFiberStackCursor, fiber);
15113 + pop(rootInstanceStackCursor, fiber);
15114 + }
15115 +
15116 + function getHostContext() {
15117 + var context = requiredContext(contextStackCursor$1.current);
15118 + return context;
15119 + }
15120 +
15121 + function pushHostContext(fiber) {
15122 + var rootInstance = requiredContext(rootInstanceStackCursor.current);
15123 + var context = requiredContext(contextStackCursor$1.current);
15124 + var nextContext = getChildHostContext(context, fiber.type); // Don't push this Fiber's context unless it's unique.
15125 +
15126 + if (context === nextContext) {
15127 + return;
15128 + } // Track the context and the Fiber that provided it.
15129 + // This enables us to pop only Fibers that provide unique contexts.
15130 +
15131 +
15132 + push(contextFiberStackCursor, fiber, fiber);
15133 + push(contextStackCursor$1, nextContext, fiber);
15134 + }
15135 +
15136 + function popHostContext(fiber) {
15137 + // Do not pop unless this Fiber provided the current context.
15138 + // pushHostContext() only pushes Fibers that provide unique contexts.
15139 + if (contextFiberStackCursor.current !== fiber) {
15140 + return;
15141 + }
15142 +
15143 + pop(contextStackCursor$1, fiber);
15144 + pop(contextFiberStackCursor, fiber);
15145 + }
15146 +
15147 + var DefaultSuspenseContext = 0; // The Suspense Context is split into two parts. The lower bits is
15148 + // inherited deeply down the subtree. The upper bits only affect
15149 + // this immediate suspense boundary and gets reset each new
15150 + // boundary or suspense list.
15151 +
15152 + var SubtreeSuspenseContextMask = 1; // Subtree Flags:
15153 + // InvisibleParentSuspenseContext indicates that one of our parent Suspense
15154 + // boundaries is not currently showing visible main content.
15155 + // Either because it is already showing a fallback or is not mounted at all.
15156 + // We can use this to determine if it is desirable to trigger a fallback at
15157 + // the parent. If not, then we might need to trigger undesirable boundaries
15158 + // and/or suspend the commit to avoid hiding the parent content.
15159 +
15160 + var InvisibleParentSuspenseContext = 1; // Shallow Flags:
15161 + // ForceSuspenseFallback can be used by SuspenseList to force newly added
15162 + // items into their fallback state during one of the render passes.
15163 +
15164 + var ForceSuspenseFallback = 2;
15165 + var suspenseStackCursor = createCursor(DefaultSuspenseContext);
15166 + function hasSuspenseContext(parentContext, flag) {
15167 + return (parentContext & flag) !== 0;
15168 + }
15169 + function setDefaultShallowSuspenseContext(parentContext) {
15170 + return parentContext & SubtreeSuspenseContextMask;
15171 + }
15172 + function setShallowSuspenseContext(parentContext, shallowContext) {
15173 + return parentContext & SubtreeSuspenseContextMask | shallowContext;
15174 + }
15175 + function addSubtreeSuspenseContext(parentContext, subtreeContext) {
15176 + return parentContext | subtreeContext;
15177 + }
15178 + function pushSuspenseContext(fiber, newContext) {
15179 + push(suspenseStackCursor, newContext, fiber);
15180 + }
15181 + function popSuspenseContext(fiber) {
15182 + pop(suspenseStackCursor, fiber);
15183 + }
15184 +
15185 + function shouldCaptureSuspense(workInProgress, hasInvisibleParent) {
15186 + // If it was the primary children that just suspended, capture and render the
15187 + // fallback. Otherwise, don't capture and bubble to the next boundary.
15188 + var nextState = workInProgress.memoizedState;
15189 +
15190 + if (nextState !== null) {
15191 + if (nextState.dehydrated !== null) {
15192 + // A dehydrated boundary always captures.
15193 + return true;
15194 + }
15195 +
15196 + return false;
15197 + }
15198 +
15199 + var props = workInProgress.memoizedProps; // Regular boundaries always capture.
15200 +
15201 + {
15202 + return true;
15203 + } // If it's a boundary we should avoid, then we prefer to bubble up to the
15204 + }
15205 + function findFirstSuspended(row) {
15206 + var node = row;
15207 +
15208 + while (node !== null) {
15209 + if (node.tag === SuspenseComponent) {
15210 + var state = node.memoizedState;
15211 +
15212 + if (state !== null) {
15213 + var dehydrated = state.dehydrated;
15214 +
15215 + if (dehydrated === null || isSuspenseInstancePending(dehydrated) || isSuspenseInstanceFallback(dehydrated)) {
15216 + return node;
15217 + }
15218 + }
15219 + } else if (node.tag === SuspenseListComponent && // revealOrder undefined can't be trusted because it don't
15220 + // keep track of whether it suspended or not.
15221 + node.memoizedProps.revealOrder !== undefined) {
15222 + var didSuspend = (node.flags & DidCapture) !== NoFlags;
15223 +
15224 + if (didSuspend) {
15225 + return node;
15226 + }
15227 + } else if (node.child !== null) {
15228 + node.child.return = node;
15229 + node = node.child;
15230 + continue;
15231 + }
15232 +
15233 + if (node === row) {
15234 + return null;
15235 + }
15236 +
15237 + while (node.sibling === null) {
15238 + if (node.return === null || node.return === row) {
15239 + return null;
15240 + }
15241 +
15242 + node = node.return;
15243 + }
15244 +
15245 + node.sibling.return = node.return;
15246 + node = node.sibling;
15247 + }
15248 +
15249 + return null;
15250 + }
15251 +
15252 + var NoFlags$1 =
15253 + /* */
15254 + 0; // Represents whether effect should fire.
15255 +
15256 + var HasEffect =
15257 + /* */
15258 + 1; // Represents the phase in which the effect (not the clean-up) fires.
15259 +
15260 + var Insertion =
15261 + /* */
15262 + 2;
15263 + var Layout =
15264 + /* */
15265 + 4;
15266 + var Passive$1 =
15267 + /* */
15268 + 8;
15269 +
15270 + // and should be reset before starting a new render.
15271 + // This tracks which mutable sources need to be reset after a render.
15272 +
15273 + var workInProgressSources = [];
15274 + function resetWorkInProgressVersions() {
15275 + for (var i = 0; i < workInProgressSources.length; i++) {
15276 + var mutableSource = workInProgressSources[i];
15277 +
15278 + {
15279 + mutableSource._workInProgressVersionPrimary = null;
15280 + }
15281 + }
15282 +
15283 + workInProgressSources.length = 0;
15284 + }
15285 + // This ensures that the version used for server rendering matches the one
15286 + // that is eventually read during hydration.
15287 + // If they don't match there's a potential tear and a full deopt render is required.
15288 +
15289 + function registerMutableSourceForHydration(root, mutableSource) {
15290 + var getVersion = mutableSource._getVersion;
15291 + var version = getVersion(mutableSource._source); // TODO Clear this data once all pending hydration work is finished.
15292 + // Retaining it forever may interfere with GC.
15293 +
15294 + if (root.mutableSourceEagerHydrationData == null) {
15295 + root.mutableSourceEagerHydrationData = [mutableSource, version];
15296 + } else {
15297 + root.mutableSourceEagerHydrationData.push(mutableSource, version);
15298 + }
15299 + }
15300 +
15301 + var ReactCurrentDispatcher$1 = ReactSharedInternals.ReactCurrentDispatcher,
15302 + ReactCurrentBatchConfig$2 = ReactSharedInternals.ReactCurrentBatchConfig;
15303 + var didWarnAboutMismatchedHooksForComponent;
15304 + var didWarnUncachedGetSnapshot;
15305 +
15306 + {
15307 + didWarnAboutMismatchedHooksForComponent = new Set();
15308 + }
15309 +
15310 + // These are set right before calling the component.
15311 + var renderLanes = NoLanes; // The work-in-progress fiber. I've named it differently to distinguish it from
15312 + // the work-in-progress hook.
15313 +
15314 + var currentlyRenderingFiber$1 = null; // Hooks are stored as a linked list on the fiber's memoizedState field. The
15315 + // current hook list is the list that belongs to the current fiber. The
15316 + // work-in-progress hook list is a new list that will be added to the
15317 + // work-in-progress fiber.
15318 +
15319 + var currentHook = null;
15320 + var workInProgressHook = null; // Whether an update was scheduled at any point during the render phase. This
15321 + // does not get reset if we do another render pass; only when we're completely
15322 + // finished evaluating this component. This is an optimization so we know
15323 + // whether we need to clear render phase updates after a throw.
15324 +
15325 + var didScheduleRenderPhaseUpdate = false; // Where an update was scheduled only during the current render pass. This
15326 + // gets reset after each attempt.
15327 + // TODO: Maybe there's some way to consolidate this with
15328 + // `didScheduleRenderPhaseUpdate`. Or with `numberOfReRenders`.
15329 +
15330 + var didScheduleRenderPhaseUpdateDuringThisPass = false; // Counts the number of useId hooks in this component.
15331 +
15332 + var localIdCounter = 0; // Used for ids that are generated completely client-side (i.e. not during
15333 + // hydration). This counter is global, so client ids are not stable across
15334 + // render attempts.
15335 +
15336 + var globalClientIdCounter = 0;
15337 + var RE_RENDER_LIMIT = 25; // In DEV, this is the name of the currently executing primitive hook
15338 +
15339 + var currentHookNameInDev = null; // In DEV, this list ensures that hooks are called in the same order between renders.
15340 + // The list stores the order of hooks used during the initial render (mount).
15341 + // Subsequent renders (updates) reference this list.
15342 +
15343 + var hookTypesDev = null;
15344 + var hookTypesUpdateIndexDev = -1; // In DEV, this tracks whether currently rendering component needs to ignore
15345 + // the dependencies for Hooks that need them (e.g. useEffect or useMemo).
15346 + // When true, such Hooks will always be "remounted". Only used during hot reload.
15347 +
15348 + var ignorePreviousDependencies = false;
15349 +
15350 + function mountHookTypesDev() {
15351 + {
15352 + var hookName = currentHookNameInDev;
15353 +
15354 + if (hookTypesDev === null) {
15355 + hookTypesDev = [hookName];
15356 + } else {
15357 + hookTypesDev.push(hookName);
15358 + }
15359 + }
15360 + }
15361 +
15362 + function updateHookTypesDev() {
15363 + {
15364 + var hookName = currentHookNameInDev;
15365 +
15366 + if (hookTypesDev !== null) {
15367 + hookTypesUpdateIndexDev++;
15368 +
15369 + if (hookTypesDev[hookTypesUpdateIndexDev] !== hookName) {
15370 + warnOnHookMismatchInDev(hookName);
15371 + }
15372 + }
15373 + }
15374 + }
15375 +
15376 + function checkDepsAreArrayDev(deps) {
15377 + {
15378 + if (deps !== undefined && deps !== null && !isArray(deps)) {
15379 + // Verify deps, but only on mount to avoid extra checks.
15380 + // It's unlikely their type would change as usually you define them inline.
15381 + error('%s received a final argument that is not an array (instead, received `%s`). When ' + 'specified, the final argument must be an array.', currentHookNameInDev, typeof deps);
15382 + }
15383 + }
15384 + }
15385 +
15386 + function warnOnHookMismatchInDev(currentHookName) {
15387 + {
15388 + var componentName = getComponentNameFromFiber(currentlyRenderingFiber$1);
15389 +
15390 + if (!didWarnAboutMismatchedHooksForComponent.has(componentName)) {
15391 + didWarnAboutMismatchedHooksForComponent.add(componentName);
15392 +
15393 + if (hookTypesDev !== null) {
15394 + var table = '';
15395 + var secondColumnStart = 30;
15396 +
15397 + for (var i = 0; i <= hookTypesUpdateIndexDev; i++) {
15398 + var oldHookName = hookTypesDev[i];
15399 + var newHookName = i === hookTypesUpdateIndexDev ? currentHookName : oldHookName;
15400 + var row = i + 1 + ". " + oldHookName; // Extra space so second column lines up
15401 + // lol @ IE not supporting String#repeat
15402 +
15403 + while (row.length < secondColumnStart) {
15404 + row += ' ';
15405 + }
15406 +
15407 + row += newHookName + '\n';
15408 + table += row;
15409 + }
15410 +
15411 + error('React has detected a change in the order of Hooks called by %s. ' + 'This will lead to bugs and errors if not fixed. ' + 'For more information, read the Rules of Hooks: https://reactjs.org/link/rules-of-hooks\n\n' + ' Previous render Next render\n' + ' ------------------------------------------------------\n' + '%s' + ' ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n', componentName, table);
15412 + }
15413 + }
15414 + }
15415 + }
15416 +
15417 + function throwInvalidHookError() {
15418 + throw new Error('Invalid hook call. Hooks can only be called inside of the body of a function component. This could happen for' + ' one of the following reasons:\n' + '1. You might have mismatching versions of React and the renderer (such as React DOM)\n' + '2. You might be breaking the Rules of Hooks\n' + '3. You might have more than one copy of React in the same app\n' + 'See https://reactjs.org/link/invalid-hook-call for tips about how to debug and fix this problem.');
15419 + }
15420 +
15421 + function areHookInputsEqual(nextDeps, prevDeps) {
15422 + {
15423 + if (ignorePreviousDependencies) {
15424 + // Only true when this component is being hot reloaded.
15425 + return false;
15426 + }
15427 + }
15428 +
15429 + if (prevDeps === null) {
15430 + {
15431 + error('%s received a final argument during this render, but not during ' + 'the previous render. Even though the final argument is optional, ' + 'its type cannot change between renders.', currentHookNameInDev);
15432 + }
15433 +
15434 + return false;
15435 + }
15436 +
15437 + {
15438 + // Don't bother comparing lengths in prod because these arrays should be
15439 + // passed inline.
15440 + if (nextDeps.length !== prevDeps.length) {
15441 + error('The final argument passed to %s changed size between renders. The ' + 'order and size of this array must remain constant.\n\n' + 'Previous: %s\n' + 'Incoming: %s', currentHookNameInDev, "[" + prevDeps.join(', ') + "]", "[" + nextDeps.join(', ') + "]");
15442 + }
15443 + }
15444 +
15445 + for (var i = 0; i < prevDeps.length && i < nextDeps.length; i++) {
15446 + if (objectIs(nextDeps[i], prevDeps[i])) {
15447 + continue;
15448 + }
15449 +
15450 + return false;
15451 + }
15452 +
15453 + return true;
15454 + }
15455 +
15456 + function renderWithHooks(current, workInProgress, Component, props, secondArg, nextRenderLanes) {
15457 + renderLanes = nextRenderLanes;
15458 + currentlyRenderingFiber$1 = workInProgress;
15459 +
15460 + {
15461 + hookTypesDev = current !== null ? current._debugHookTypes : null;
15462 + hookTypesUpdateIndexDev = -1; // Used for hot reloading:
15463 +
15464 + ignorePreviousDependencies = current !== null && current.type !== workInProgress.type;
15465 + }
15466 +
15467 + workInProgress.memoizedState = null;
15468 + workInProgress.updateQueue = null;
15469 + workInProgress.lanes = NoLanes; // The following should have already been reset
15470 + // currentHook = null;
15471 + // workInProgressHook = null;
15472 + // didScheduleRenderPhaseUpdate = false;
15473 + // localIdCounter = 0;
15474 + // TODO Warn if no hooks are used at all during mount, then some are used during update.
15475 + // Currently we will identify the update render as a mount because memoizedState === null.
15476 + // This is tricky because it's valid for certain types of components (e.g. React.lazy)
15477 + // Using memoizedState to differentiate between mount/update only works if at least one stateful hook is used.
15478 + // Non-stateful hooks (e.g. context) don't get added to memoizedState,
15479 + // so memoizedState would be null during updates and mounts.
15480 +
15481 + {
15482 + if (current !== null && current.memoizedState !== null) {
15483 + ReactCurrentDispatcher$1.current = HooksDispatcherOnUpdateInDEV;
15484 + } else if (hookTypesDev !== null) {
15485 + // This dispatcher handles an edge case where a component is updating,
15486 + // but no stateful hooks have been used.
15487 + // We want to match the production code behavior (which will use HooksDispatcherOnMount),
15488 + // but with the extra DEV validation to ensure hooks ordering hasn't changed.
15489 + // This dispatcher does that.
15490 + ReactCurrentDispatcher$1.current = HooksDispatcherOnMountWithHookTypesInDEV;
15491 + } else {
15492 + ReactCurrentDispatcher$1.current = HooksDispatcherOnMountInDEV;
15493 + }
15494 + }
15495 +
15496 + var children = Component(props, secondArg); // Check if there was a render phase update
15497 +
15498 + if (didScheduleRenderPhaseUpdateDuringThisPass) {
15499 + // Keep rendering in a loop for as long as render phase updates continue to
15500 + // be scheduled. Use a counter to prevent infinite loops.
15501 + var numberOfReRenders = 0;
15502 +
15503 + do {
15504 + didScheduleRenderPhaseUpdateDuringThisPass = false;
15505 + localIdCounter = 0;
15506 +
15507 + if (numberOfReRenders >= RE_RENDER_LIMIT) {
15508 + throw new Error('Too many re-renders. React limits the number of renders to prevent ' + 'an infinite loop.');
15509 + }
15510 +
15511 + numberOfReRenders += 1;
15512 +
15513 + {
15514 + // Even when hot reloading, allow dependencies to stabilize
15515 + // after first render to prevent infinite render phase updates.
15516 + ignorePreviousDependencies = false;
15517 + } // Start over from the beginning of the list
15518 +
15519 +
15520 + currentHook = null;
15521 + workInProgressHook = null;
15522 + workInProgress.updateQueue = null;
15523 +
15524 + {
15525 + // Also validate hook order for cascading updates.
15526 + hookTypesUpdateIndexDev = -1;
15527 + }
15528 +
15529 + ReactCurrentDispatcher$1.current = HooksDispatcherOnRerenderInDEV ;
15530 + children = Component(props, secondArg);
15531 + } while (didScheduleRenderPhaseUpdateDuringThisPass);
15532 + } // We can assume the previous dispatcher is always this one, since we set it
15533 + // at the beginning of the render phase and there's no re-entrance.
15534 +
15535 +
15536 + ReactCurrentDispatcher$1.current = ContextOnlyDispatcher;
15537 +
15538 + {
15539 + workInProgress._debugHookTypes = hookTypesDev;
15540 + } // This check uses currentHook so that it works the same in DEV and prod bundles.
15541 + // hookTypesDev could catch more cases (e.g. context) but only in DEV bundles.
15542 +
15543 +
15544 + var didRenderTooFewHooks = currentHook !== null && currentHook.next !== null;
15545 + renderLanes = NoLanes;
15546 + currentlyRenderingFiber$1 = null;
15547 + currentHook = null;
15548 + workInProgressHook = null;
15549 +
15550 + {
15551 + currentHookNameInDev = null;
15552 + hookTypesDev = null;
15553 + hookTypesUpdateIndexDev = -1; // Confirm that a static flag was not added or removed since the last
15554 + // render. If this fires, it suggests that we incorrectly reset the static
15555 + // flags in some other part of the codebase. This has happened before, for
15556 + // example, in the SuspenseList implementation.
15557 +
15558 + if (current !== null && (current.flags & StaticMask) !== (workInProgress.flags & StaticMask) && // Disable this warning in legacy mode, because legacy Suspense is weird
15559 + // and creates false positives. To make this work in legacy mode, we'd
15560 + // need to mark fibers that commit in an incomplete state, somehow. For
15561 + // now I'll disable the warning that most of the bugs that would trigger
15562 + // it are either exclusive to concurrent mode or exist in both.
15563 + (current.mode & ConcurrentMode) !== NoMode) {
15564 + error('Internal React error: Expected static flag was missing. Please ' + 'notify the React team.');
15565 + }
15566 + }
15567 +
15568 + didScheduleRenderPhaseUpdate = false; // This is reset by checkDidRenderIdHook
15569 + // localIdCounter = 0;
15570 +
15571 + if (didRenderTooFewHooks) {
15572 + throw new Error('Rendered fewer hooks than expected. This may be caused by an accidental ' + 'early return statement.');
15573 + }
15574 +
15575 + return children;
15576 + }
15577 + function checkDidRenderIdHook() {
15578 + // This should be called immediately after every renderWithHooks call.
15579 + // Conceptually, it's part of the return value of renderWithHooks; it's only a
15580 + // separate function to avoid using an array tuple.
15581 + var didRenderIdHook = localIdCounter !== 0;
15582 + localIdCounter = 0;
15583 + return didRenderIdHook;
15584 + }
15585 + function bailoutHooks(current, workInProgress, lanes) {
15586 + workInProgress.updateQueue = current.updateQueue; // TODO: Don't need to reset the flags here, because they're reset in the
15587 + // complete phase (bubbleProperties).
15588 +
15589 + if ( (workInProgress.mode & StrictEffectsMode) !== NoMode) {
15590 + workInProgress.flags &= ~(MountPassiveDev | MountLayoutDev | Passive | Update);
15591 + } else {
15592 + workInProgress.flags &= ~(Passive | Update);
15593 + }
15594 +
15595 + current.lanes = removeLanes(current.lanes, lanes);
15596 + }
15597 + function resetHooksAfterThrow() {
15598 + // We can assume the previous dispatcher is always this one, since we set it
15599 + // at the beginning of the render phase and there's no re-entrance.
15600 + ReactCurrentDispatcher$1.current = ContextOnlyDispatcher;
15601 +
15602 + if (didScheduleRenderPhaseUpdate) {
15603 + // There were render phase updates. These are only valid for this render
15604 + // phase, which we are now aborting. Remove the updates from the queues so
15605 + // they do not persist to the next render. Do not remove updates from hooks
15606 + // that weren't processed.
15607 + //
15608 + // Only reset the updates from the queue if it has a clone. If it does
15609 + // not have a clone, that means it wasn't processed, and the updates were
15610 + // scheduled before we entered the render phase.
15611 + var hook = currentlyRenderingFiber$1.memoizedState;
15612 +
15613 + while (hook !== null) {
15614 + var queue = hook.queue;
15615 +
15616 + if (queue !== null) {
15617 + queue.pending = null;
15618 + }
15619 +
15620 + hook = hook.next;
15621 + }
15622 +
15623 + didScheduleRenderPhaseUpdate = false;
15624 + }
15625 +
15626 + renderLanes = NoLanes;
15627 + currentlyRenderingFiber$1 = null;
15628 + currentHook = null;
15629 + workInProgressHook = null;
15630 +
15631 + {
15632 + hookTypesDev = null;
15633 + hookTypesUpdateIndexDev = -1;
15634 + currentHookNameInDev = null;
15635 + isUpdatingOpaqueValueInRenderPhase = false;
15636 + }
15637 +
15638 + didScheduleRenderPhaseUpdateDuringThisPass = false;
15639 + localIdCounter = 0;
15640 + }
15641 +
15642 + function mountWorkInProgressHook() {
15643 + var hook = {
15644 + memoizedState: null,
15645 + baseState: null,
15646 + baseQueue: null,
15647 + queue: null,
15648 + next: null
15649 + };
15650 +
15651 + if (workInProgressHook === null) {
15652 + // This is the first hook in the list
15653 + currentlyRenderingFiber$1.memoizedState = workInProgressHook = hook;
15654 + } else {
15655 + // Append to the end of the list
15656 + workInProgressHook = workInProgressHook.next = hook;
15657 + }
15658 +
15659 + return workInProgressHook;
15660 + }
15661 +
15662 + function updateWorkInProgressHook() {
15663 + // This function is used both for updates and for re-renders triggered by a
15664 + // render phase update. It assumes there is either a current hook we can
15665 + // clone, or a work-in-progress hook from a previous render pass that we can
15666 + // use as a base. When we reach the end of the base list, we must switch to
15667 + // the dispatcher used for mounts.
15668 + var nextCurrentHook;
15669 +
15670 + if (currentHook === null) {
15671 + var current = currentlyRenderingFiber$1.alternate;
15672 +
15673 + if (current !== null) {
15674 + nextCurrentHook = current.memoizedState;
15675 + } else {
15676 + nextCurrentHook = null;
15677 + }
15678 + } else {
15679 + nextCurrentHook = currentHook.next;
15680 + }
15681 +
15682 + var nextWorkInProgressHook;
15683 +
15684 + if (workInProgressHook === null) {
15685 + nextWorkInProgressHook = currentlyRenderingFiber$1.memoizedState;
15686 + } else {
15687 + nextWorkInProgressHook = workInProgressHook.next;
15688 + }
15689 +
15690 + if (nextWorkInProgressHook !== null) {
15691 + // There's already a work-in-progress. Reuse it.
15692 + workInProgressHook = nextWorkInProgressHook;
15693 + nextWorkInProgressHook = workInProgressHook.next;
15694 + currentHook = nextCurrentHook;
15695 + } else {
15696 + // Clone from the current hook.
15697 + if (nextCurrentHook === null) {
15698 + throw new Error('Rendered more hooks than during the previous render.');
15699 + }
15700 +
15701 + currentHook = nextCurrentHook;
15702 + var newHook = {
15703 + memoizedState: currentHook.memoizedState,
15704 + baseState: currentHook.baseState,
15705 + baseQueue: currentHook.baseQueue,
15706 + queue: currentHook.queue,
15707 + next: null
15708 + };
15709 +
15710 + if (workInProgressHook === null) {
15711 + // This is the first hook in the list.
15712 + currentlyRenderingFiber$1.memoizedState = workInProgressHook = newHook;
15713 + } else {
15714 + // Append to the end of the list.
15715 + workInProgressHook = workInProgressHook.next = newHook;
15716 + }
15717 + }
15718 +
15719 + return workInProgressHook;
15720 + }
15721 +
15722 + function createFunctionComponentUpdateQueue() {
15723 + return {
15724 + lastEffect: null,
15725 + stores: null
15726 + };
15727 + }
15728 +
15729 + function basicStateReducer(state, action) {
15730 + // $FlowFixMe: Flow doesn't like mixed types
15731 + return typeof action === 'function' ? action(state) : action;
15732 + }
15733 +
15734 + function mountReducer(reducer, initialArg, init) {
15735 + var hook = mountWorkInProgressHook();
15736 + var initialState;
15737 +
15738 + if (init !== undefined) {
15739 + initialState = init(initialArg);
15740 + } else {
15741 + initialState = initialArg;
15742 + }
15743 +
15744 + hook.memoizedState = hook.baseState = initialState;
15745 + var queue = {
15746 + pending: null,
15747 + interleaved: null,
15748 + lanes: NoLanes,
15749 + dispatch: null,
15750 + lastRenderedReducer: reducer,
15751 + lastRenderedState: initialState
15752 + };
15753 + hook.queue = queue;
15754 + var dispatch = queue.dispatch = dispatchReducerAction.bind(null, currentlyRenderingFiber$1, queue);
15755 + return [hook.memoizedState, dispatch];
15756 + }
15757 +
15758 + function updateReducer(reducer, initialArg, init) {
15759 + var hook = updateWorkInProgressHook();
15760 + var queue = hook.queue;
15761 +
15762 + if (queue === null) {
15763 + throw new Error('Should have a queue. This is likely a bug in React. Please file an issue.');
15764 + }
15765 +
15766 + queue.lastRenderedReducer = reducer;
15767 + var current = currentHook; // The last rebase update that is NOT part of the base state.
15768 +
15769 + var baseQueue = current.baseQueue; // The last pending update that hasn't been processed yet.
15770 +
15771 + var pendingQueue = queue.pending;
15772 +
15773 + if (pendingQueue !== null) {
15774 + // We have new updates that haven't been processed yet.
15775 + // We'll add them to the base queue.
15776 + if (baseQueue !== null) {
15777 + // Merge the pending queue and the base queue.
15778 + var baseFirst = baseQueue.next;
15779 + var pendingFirst = pendingQueue.next;
15780 + baseQueue.next = pendingFirst;
15781 + pendingQueue.next = baseFirst;
15782 + }
15783 +
15784 + {
15785 + if (current.baseQueue !== baseQueue) {
15786 + // Internal invariant that should never happen, but feasibly could in
15787 + // the future if we implement resuming, or some form of that.
15788 + error('Internal error: Expected work-in-progress queue to be a clone. ' + 'This is a bug in React.');
15789 + }
15790 + }
15791 +
15792 + current.baseQueue = baseQueue = pendingQueue;
15793 + queue.pending = null;
15794 + }
15795 +
15796 + if (baseQueue !== null) {
15797 + // We have a queue to process.
15798 + var first = baseQueue.next;
15799 + var newState = current.baseState;
15800 + var newBaseState = null;
15801 + var newBaseQueueFirst = null;
15802 + var newBaseQueueLast = null;
15803 + var update = first;
15804 +
15805 + do {
15806 + var updateLane = update.lane;
15807 +
15808 + if (!isSubsetOfLanes(renderLanes, updateLane)) {
15809 + // Priority is insufficient. Skip this update. If this is the first
15810 + // skipped update, the previous update/state is the new base
15811 + // update/state.
15812 + var clone = {
15813 + lane: updateLane,
15814 + action: update.action,
15815 + hasEagerState: update.hasEagerState,
15816 + eagerState: update.eagerState,
15817 + next: null
15818 + };
15819 +
15820 + if (newBaseQueueLast === null) {
15821 + newBaseQueueFirst = newBaseQueueLast = clone;
15822 + newBaseState = newState;
15823 + } else {
15824 + newBaseQueueLast = newBaseQueueLast.next = clone;
15825 + } // Update the remaining priority in the queue.
15826 + // TODO: Don't need to accumulate this. Instead, we can remove
15827 + // renderLanes from the original lanes.
15828 +
15829 +
15830 + currentlyRenderingFiber$1.lanes = mergeLanes(currentlyRenderingFiber$1.lanes, updateLane);
15831 + markSkippedUpdateLanes(updateLane);
15832 + } else {
15833 + // This update does have sufficient priority.
15834 + if (newBaseQueueLast !== null) {
15835 + var _clone = {
15836 + // This update is going to be committed so we never want uncommit
15837 + // it. Using NoLane works because 0 is a subset of all bitmasks, so
15838 + // this will never be skipped by the check above.
15839 + lane: NoLane,
15840 + action: update.action,
15841 + hasEagerState: update.hasEagerState,
15842 + eagerState: update.eagerState,
15843 + next: null
15844 + };
15845 + newBaseQueueLast = newBaseQueueLast.next = _clone;
15846 + } // Process this update.
15847 +
15848 +
15849 + if (update.hasEagerState) {
15850 + // If this update is a state update (not a reducer) and was processed eagerly,
15851 + // we can use the eagerly computed state
15852 + newState = update.eagerState;
15853 + } else {
15854 + var action = update.action;
15855 + newState = reducer(newState, action);
15856 + }
15857 + }
15858 +
15859 + update = update.next;
15860 + } while (update !== null && update !== first);
15861 +
15862 + if (newBaseQueueLast === null) {
15863 + newBaseState = newState;
15864 + } else {
15865 + newBaseQueueLast.next = newBaseQueueFirst;
15866 + } // Mark that the fiber performed work, but only if the new state is
15867 + // different from the current state.
15868 +
15869 +
15870 + if (!objectIs(newState, hook.memoizedState)) {
15871 + markWorkInProgressReceivedUpdate();
15872 + }
15873 +
15874 + hook.memoizedState = newState;
15875 + hook.baseState = newBaseState;
15876 + hook.baseQueue = newBaseQueueLast;
15877 + queue.lastRenderedState = newState;
15878 + } // Interleaved updates are stored on a separate queue. We aren't going to
15879 + // process them during this render, but we do need to track which lanes
15880 + // are remaining.
15881 +
15882 +
15883 + var lastInterleaved = queue.interleaved;
15884 +
15885 + if (lastInterleaved !== null) {
15886 + var interleaved = lastInterleaved;
15887 +
15888 + do {
15889 + var interleavedLane = interleaved.lane;
15890 + currentlyRenderingFiber$1.lanes = mergeLanes(currentlyRenderingFiber$1.lanes, interleavedLane);
15891 + markSkippedUpdateLanes(interleavedLane);
15892 + interleaved = interleaved.next;
15893 + } while (interleaved !== lastInterleaved);
15894 + } else if (baseQueue === null) {
15895 + // `queue.lanes` is used for entangling transitions. We can set it back to
15896 + // zero once the queue is empty.
15897 + queue.lanes = NoLanes;
15898 + }
15899 +
15900 + var dispatch = queue.dispatch;
15901 + return [hook.memoizedState, dispatch];
15902 + }
15903 +
15904 + function rerenderReducer(reducer, initialArg, init) {
15905 + var hook = updateWorkInProgressHook();
15906 + var queue = hook.queue;
15907 +
15908 + if (queue === null) {
15909 + throw new Error('Should have a queue. This is likely a bug in React. Please file an issue.');
15910 + }
15911 +
15912 + queue.lastRenderedReducer = reducer; // This is a re-render. Apply the new render phase updates to the previous
15913 + // work-in-progress hook.
15914 +
15915 + var dispatch = queue.dispatch;
15916 + var lastRenderPhaseUpdate = queue.pending;
15917 + var newState = hook.memoizedState;
15918 +
15919 + if (lastRenderPhaseUpdate !== null) {
15920 + // The queue doesn't persist past this render pass.
15921 + queue.pending = null;
15922 + var firstRenderPhaseUpdate = lastRenderPhaseUpdate.next;
15923 + var update = firstRenderPhaseUpdate;
15924 +
15925 + do {
15926 + // Process this render phase update. We don't have to check the
15927 + // priority because it will always be the same as the current
15928 + // render's.
15929 + var action = update.action;
15930 + newState = reducer(newState, action);
15931 + update = update.next;
15932 + } while (update !== firstRenderPhaseUpdate); // Mark that the fiber performed work, but only if the new state is
15933 + // different from the current state.
15934 +
15935 +
15936 + if (!objectIs(newState, hook.memoizedState)) {
15937 + markWorkInProgressReceivedUpdate();
15938 + }
15939 +
15940 + hook.memoizedState = newState; // Don't persist the state accumulated from the render phase updates to
15941 + // the base state unless the queue is empty.
15942 + // TODO: Not sure if this is the desired semantics, but it's what we
15943 + // do for gDSFP. I can't remember why.
15944 +
15945 + if (hook.baseQueue === null) {
15946 + hook.baseState = newState;
15947 + }
15948 +
15949 + queue.lastRenderedState = newState;
15950 + }
15951 +
15952 + return [newState, dispatch];
15953 + }
15954 +
15955 + function mountMutableSource(source, getSnapshot, subscribe) {
15956 + {
15957 + return undefined;
15958 + }
15959 + }
15960 +
15961 + function updateMutableSource(source, getSnapshot, subscribe) {
15962 + {
15963 + return undefined;
15964 + }
15965 + }
15966 +
15967 + function mountSyncExternalStore(subscribe, getSnapshot, getServerSnapshot) {
15968 + var fiber = currentlyRenderingFiber$1;
15969 + var hook = mountWorkInProgressHook();
15970 + var nextSnapshot;
15971 + var isHydrating = getIsHydrating();
15972 +
15973 + if (isHydrating) {
15974 + if (getServerSnapshot === undefined) {
15975 + throw new Error('Missing getServerSnapshot, which is required for ' + 'server-rendered content. Will revert to client rendering.');
15976 + }
15977 +
15978 + nextSnapshot = getServerSnapshot();
15979 +
15980 + {
15981 + if (!didWarnUncachedGetSnapshot) {
15982 + if (nextSnapshot !== getServerSnapshot()) {
15983 + error('The result of getServerSnapshot should be cached to avoid an infinite loop');
15984 +
15985 + didWarnUncachedGetSnapshot = true;
15986 + }
15987 + }
15988 + }
15989 + } else {
15990 + nextSnapshot = getSnapshot();
15991 +
15992 + {
15993 + if (!didWarnUncachedGetSnapshot) {
15994 + var cachedSnapshot = getSnapshot();
15995 +
15996 + if (!objectIs(nextSnapshot, cachedSnapshot)) {
15997 + error('The result of getSnapshot should be cached to avoid an infinite loop');
15998 +
15999 + didWarnUncachedGetSnapshot = true;
16000 + }
16001 + }
16002 + } // Unless we're rendering a blocking lane, schedule a consistency check.
16003 + // Right before committing, we will walk the tree and check if any of the
16004 + // stores were mutated.
16005 + //
16006 + // We won't do this if we're hydrating server-rendered content, because if
16007 + // the content is stale, it's already visible anyway. Instead we'll patch
16008 + // it up in a passive effect.
16009 +
16010 +
16011 + var root = getWorkInProgressRoot();
16012 +
16013 + if (root === null) {
16014 + throw new Error('Expected a work-in-progress root. This is a bug in React. Please file an issue.');
16015 + }
16016 +
16017 + if (!includesBlockingLane(root, renderLanes)) {
16018 + pushStoreConsistencyCheck(fiber, getSnapshot, nextSnapshot);
16019 + }
16020 + } // Read the current snapshot from the store on every render. This breaks the
16021 + // normal rules of React, and only works because store updates are
16022 + // always synchronous.
16023 +
16024 +
16025 + hook.memoizedState = nextSnapshot;
16026 + var inst = {
16027 + value: nextSnapshot,
16028 + getSnapshot: getSnapshot
16029 + };
16030 + hook.queue = inst; // Schedule an effect to subscribe to the store.
16031 +
16032 + mountEffect(subscribeToStore.bind(null, fiber, inst, subscribe), [subscribe]); // Schedule an effect to update the mutable instance fields. We will update
16033 + // this whenever subscribe, getSnapshot, or value changes. Because there's no
16034 + // clean-up function, and we track the deps correctly, we can call pushEffect
16035 + // directly, without storing any additional state. For the same reason, we
16036 + // don't need to set a static flag, either.
16037 + // TODO: We can move this to the passive phase once we add a pre-commit
16038 + // consistency check. See the next comment.
16039 +
16040 + fiber.flags |= Passive;
16041 + pushEffect(HasEffect | Passive$1, updateStoreInstance.bind(null, fiber, inst, nextSnapshot, getSnapshot), undefined, null);
16042 + return nextSnapshot;
16043 + }
16044 +
16045 + function updateSyncExternalStore(subscribe, getSnapshot, getServerSnapshot) {
16046 + var fiber = currentlyRenderingFiber$1;
16047 + var hook = updateWorkInProgressHook(); // Read the current snapshot from the store on every render. This breaks the
16048 + // normal rules of React, and only works because store updates are
16049 + // always synchronous.
16050 +
16051 + var nextSnapshot = getSnapshot();
16052 +
16053 + {
16054 + if (!didWarnUncachedGetSnapshot) {
16055 + var cachedSnapshot = getSnapshot();
16056 +
16057 + if (!objectIs(nextSnapshot, cachedSnapshot)) {
16058 + error('The result of getSnapshot should be cached to avoid an infinite loop');
16059 +
16060 + didWarnUncachedGetSnapshot = true;
16061 + }
16062 + }
16063 + }
16064 +
16065 + var prevSnapshot = hook.memoizedState;
16066 + var snapshotChanged = !objectIs(prevSnapshot, nextSnapshot);
16067 +
16068 + if (snapshotChanged) {
16069 + hook.memoizedState = nextSnapshot;
16070 + markWorkInProgressReceivedUpdate();
16071 + }
16072 +
16073 + var inst = hook.queue;
16074 + updateEffect(subscribeToStore.bind(null, fiber, inst, subscribe), [subscribe]); // Whenever getSnapshot or subscribe changes, we need to check in the
16075 + // commit phase if there was an interleaved mutation. In concurrent mode
16076 + // this can happen all the time, but even in synchronous mode, an earlier
16077 + // effect may have mutated the store.
16078 +
16079 + if (inst.getSnapshot !== getSnapshot || snapshotChanged || // Check if the susbcribe function changed. We can save some memory by
16080 + // checking whether we scheduled a subscription effect above.
16081 + workInProgressHook !== null && workInProgressHook.memoizedState.tag & HasEffect) {
16082 + fiber.flags |= Passive;
16083 + pushEffect(HasEffect | Passive$1, updateStoreInstance.bind(null, fiber, inst, nextSnapshot, getSnapshot), undefined, null); // Unless we're rendering a blocking lane, schedule a consistency check.
16084 + // Right before committing, we will walk the tree and check if any of the
16085 + // stores were mutated.
16086 +
16087 + var root = getWorkInProgressRoot();
16088 +
16089 + if (root === null) {
16090 + throw new Error('Expected a work-in-progress root. This is a bug in React. Please file an issue.');
16091 + }
16092 +
16093 + if (!includesBlockingLane(root, renderLanes)) {
16094 + pushStoreConsistencyCheck(fiber, getSnapshot, nextSnapshot);
16095 + }
16096 + }
16097 +
16098 + return nextSnapshot;
16099 + }
16100 +
16101 + function pushStoreConsistencyCheck(fiber, getSnapshot, renderedSnapshot) {
16102 + fiber.flags |= StoreConsistency;
16103 + var check = {
16104 + getSnapshot: getSnapshot,
16105 + value: renderedSnapshot
16106 + };
16107 + var componentUpdateQueue = currentlyRenderingFiber$1.updateQueue;
16108 +
16109 + if (componentUpdateQueue === null) {
16110 + componentUpdateQueue = createFunctionComponentUpdateQueue();
16111 + currentlyRenderingFiber$1.updateQueue = componentUpdateQueue;
16112 + componentUpdateQueue.stores = [check];
16113 + } else {
16114 + var stores = componentUpdateQueue.stores;
16115 +
16116 + if (stores === null) {
16117 + componentUpdateQueue.stores = [check];
16118 + } else {
16119 + stores.push(check);
16120 + }
16121 + }
16122 + }
16123 +
16124 + function updateStoreInstance(fiber, inst, nextSnapshot, getSnapshot) {
16125 + // These are updated in the passive phase
16126 + inst.value = nextSnapshot;
16127 + inst.getSnapshot = getSnapshot; // Something may have been mutated in between render and commit. This could
16128 + // have been in an event that fired before the passive effects, or it could
16129 + // have been in a layout effect. In that case, we would have used the old
16130 + // snapsho and getSnapshot values to bail out. We need to check one more time.
16131 +
16132 + if (checkIfSnapshotChanged(inst)) {
16133 + // Force a re-render.
16134 + forceStoreRerender(fiber);
16135 + }
16136 + }
16137 +
16138 + function subscribeToStore(fiber, inst, subscribe) {
16139 + var handleStoreChange = function () {
16140 + // The store changed. Check if the snapshot changed since the last time we
16141 + // read from the store.
16142 + if (checkIfSnapshotChanged(inst)) {
16143 + // Force a re-render.
16144 + forceStoreRerender(fiber);
16145 + }
16146 + }; // Subscribe to the store and return a clean-up function.
16147 +
16148 +
16149 + return subscribe(handleStoreChange);
16150 + }
16151 +
16152 + function checkIfSnapshotChanged(inst) {
16153 + var latestGetSnapshot = inst.getSnapshot;
16154 + var prevValue = inst.value;
16155 +
16156 + try {
16157 + var nextValue = latestGetSnapshot();
16158 + return !objectIs(prevValue, nextValue);
16159 + } catch (error) {
16160 + return true;
16161 + }
16162 + }
16163 +
16164 + function forceStoreRerender(fiber) {
16165 + var root = enqueueConcurrentRenderForLane(fiber, SyncLane);
16166 +
16167 + if (root !== null) {
16168 + scheduleUpdateOnFiber(root, fiber, SyncLane, NoTimestamp);
16169 + }
16170 + }
16171 +
16172 + function mountState(initialState) {
16173 + var hook = mountWorkInProgressHook();
16174 +
16175 + if (typeof initialState === 'function') {
16176 + // $FlowFixMe: Flow doesn't like mixed types
16177 + initialState = initialState();
16178 + }
16179 +
16180 + hook.memoizedState = hook.baseState = initialState;
16181 + var queue = {
16182 + pending: null,
16183 + interleaved: null,
16184 + lanes: NoLanes,
16185 + dispatch: null,
16186 + lastRenderedReducer: basicStateReducer,
16187 + lastRenderedState: initialState
16188 + };
16189 + hook.queue = queue;
16190 + var dispatch = queue.dispatch = dispatchSetState.bind(null, currentlyRenderingFiber$1, queue);
16191 + return [hook.memoizedState, dispatch];
16192 + }
16193 +
16194 + function updateState(initialState) {
16195 + return updateReducer(basicStateReducer);
16196 + }
16197 +
16198 + function rerenderState(initialState) {
16199 + return rerenderReducer(basicStateReducer);
16200 + }
16201 +
16202 + function pushEffect(tag, create, destroy, deps) {
16203 + var effect = {
16204 + tag: tag,
16205 + create: create,
16206 + destroy: destroy,
16207 + deps: deps,
16208 + // Circular
16209 + next: null
16210 + };
16211 + var componentUpdateQueue = currentlyRenderingFiber$1.updateQueue;
16212 +
16213 + if (componentUpdateQueue === null) {
16214 + componentUpdateQueue = createFunctionComponentUpdateQueue();
16215 + currentlyRenderingFiber$1.updateQueue = componentUpdateQueue;
16216 + componentUpdateQueue.lastEffect = effect.next = effect;
16217 + } else {
16218 + var lastEffect = componentUpdateQueue.lastEffect;
16219 +
16220 + if (lastEffect === null) {
16221 + componentUpdateQueue.lastEffect = effect.next = effect;
16222 + } else {
16223 + var firstEffect = lastEffect.next;
16224 + lastEffect.next = effect;
16225 + effect.next = firstEffect;
16226 + componentUpdateQueue.lastEffect = effect;
16227 + }
16228 + }
16229 +
16230 + return effect;
16231 + }
16232 +
16233 + function mountRef(initialValue) {
16234 + var hook = mountWorkInProgressHook();
16235 +
16236 + {
16237 + var _ref2 = {
16238 + current: initialValue
16239 + };
16240 + hook.memoizedState = _ref2;
16241 + return _ref2;
16242 + }
16243 + }
16244 +
16245 + function updateRef(initialValue) {
16246 + var hook = updateWorkInProgressHook();
16247 + return hook.memoizedState;
16248 + }
16249 +
16250 + function mountEffectImpl(fiberFlags, hookFlags, create, deps) {
16251 + var hook = mountWorkInProgressHook();
16252 + var nextDeps = deps === undefined ? null : deps;
16253 + currentlyRenderingFiber$1.flags |= fiberFlags;
16254 + hook.memoizedState = pushEffect(HasEffect | hookFlags, create, undefined, nextDeps);
16255 + }
16256 +
16257 + function updateEffectImpl(fiberFlags, hookFlags, create, deps) {
16258 + var hook = updateWorkInProgressHook();
16259 + var nextDeps = deps === undefined ? null : deps;
16260 + var destroy = undefined;
16261 +
16262 + if (currentHook !== null) {
16263 + var prevEffect = currentHook.memoizedState;
16264 + destroy = prevEffect.destroy;
16265 +
16266 + if (nextDeps !== null) {
16267 + var prevDeps = prevEffect.deps;
16268 +
16269 + if (areHookInputsEqual(nextDeps, prevDeps)) {
16270 + hook.memoizedState = pushEffect(hookFlags, create, destroy, nextDeps);
16271 + return;
16272 + }
16273 + }
16274 + }
16275 +
16276 + currentlyRenderingFiber$1.flags |= fiberFlags;
16277 + hook.memoizedState = pushEffect(HasEffect | hookFlags, create, destroy, nextDeps);
16278 + }
16279 +
16280 + function mountEffect(create, deps) {
16281 + if ( (currentlyRenderingFiber$1.mode & StrictEffectsMode) !== NoMode) {
16282 + return mountEffectImpl(MountPassiveDev | Passive | PassiveStatic, Passive$1, create, deps);
16283 + } else {
16284 + return mountEffectImpl(Passive | PassiveStatic, Passive$1, create, deps);
16285 + }
16286 + }
16287 +
16288 + function updateEffect(create, deps) {
16289 + return updateEffectImpl(Passive, Passive$1, create, deps);
16290 + }
16291 +
16292 + function mountInsertionEffect(create, deps) {
16293 + return mountEffectImpl(Update, Insertion, create, deps);
16294 + }
16295 +
16296 + function updateInsertionEffect(create, deps) {
16297 + return updateEffectImpl(Update, Insertion, create, deps);
16298 + }
16299 +
16300 + function mountLayoutEffect(create, deps) {
16301 + var fiberFlags = Update;
16302 +
16303 + {
16304 + fiberFlags |= LayoutStatic;
16305 + }
16306 +
16307 + if ( (currentlyRenderingFiber$1.mode & StrictEffectsMode) !== NoMode) {
16308 + fiberFlags |= MountLayoutDev;
16309 + }
16310 +
16311 + return mountEffectImpl(fiberFlags, Layout, create, deps);
16312 + }
16313 +
16314 + function updateLayoutEffect(create, deps) {
16315 + return updateEffectImpl(Update, Layout, create, deps);
16316 + }
16317 +
16318 + function imperativeHandleEffect(create, ref) {
16319 + if (typeof ref === 'function') {
16320 + var refCallback = ref;
16321 +
16322 + var _inst = create();
16323 +
16324 + refCallback(_inst);
16325 + return function () {
16326 + refCallback(null);
16327 + };
16328 + } else if (ref !== null && ref !== undefined) {
16329 + var refObject = ref;
16330 +
16331 + {
16332 + if (!refObject.hasOwnProperty('current')) {
16333 + error('Expected useImperativeHandle() first argument to either be a ' + 'ref callback or React.createRef() object. Instead received: %s.', 'an object with keys {' + Object.keys(refObject).join(', ') + '}');
16334 + }
16335 + }
16336 +
16337 + var _inst2 = create();
16338 +
16339 + refObject.current = _inst2;
16340 + return function () {
16341 + refObject.current = null;
16342 + };
16343 + }
16344 + }
16345 +
16346 + function mountImperativeHandle(ref, create, deps) {
16347 + {
16348 + if (typeof create !== 'function') {
16349 + error('Expected useImperativeHandle() second argument to be a function ' + 'that creates a handle. Instead received: %s.', create !== null ? typeof create : 'null');
16350 + }
16351 + } // TODO: If deps are provided, should we skip comparing the ref itself?
16352 +
16353 +
16354 + var effectDeps = deps !== null && deps !== undefined ? deps.concat([ref]) : null;
16355 + var fiberFlags = Update;
16356 +
16357 + {
16358 + fiberFlags |= LayoutStatic;
16359 + }
16360 +
16361 + if ( (currentlyRenderingFiber$1.mode & StrictEffectsMode) !== NoMode) {
16362 + fiberFlags |= MountLayoutDev;
16363 + }
16364 +
16365 + return mountEffectImpl(fiberFlags, Layout, imperativeHandleEffect.bind(null, create, ref), effectDeps);
16366 + }
16367 +
16368 + function updateImperativeHandle(ref, create, deps) {
16369 + {
16370 + if (typeof create !== 'function') {
16371 + error('Expected useImperativeHandle() second argument to be a function ' + 'that creates a handle. Instead received: %s.', create !== null ? typeof create : 'null');
16372 + }
16373 + } // TODO: If deps are provided, should we skip comparing the ref itself?
16374 +
16375 +
16376 + var effectDeps = deps !== null && deps !== undefined ? deps.concat([ref]) : null;
16377 + return updateEffectImpl(Update, Layout, imperativeHandleEffect.bind(null, create, ref), effectDeps);
16378 + }
16379 +
16380 + function mountDebugValue(value, formatterFn) {// This hook is normally a no-op.
16381 + // The react-debug-hooks package injects its own implementation
16382 + // so that e.g. DevTools can display custom hook values.
16383 + }
16384 +
16385 + var updateDebugValue = mountDebugValue;
16386 +
16387 + function mountCallback(callback, deps) {
16388 + var hook = mountWorkInProgressHook();
16389 + var nextDeps = deps === undefined ? null : deps;
16390 + hook.memoizedState = [callback, nextDeps];
16391 + return callback;
16392 + }
16393 +
16394 + function updateCallback(callback, deps) {
16395 + var hook = updateWorkInProgressHook();
16396 + var nextDeps = deps === undefined ? null : deps;
16397 + var prevState = hook.memoizedState;
16398 +
16399 + if (prevState !== null) {
16400 + if (nextDeps !== null) {
16401 + var prevDeps = prevState[1];
16402 +
16403 + if (areHookInputsEqual(nextDeps, prevDeps)) {
16404 + return prevState[0];
16405 + }
16406 + }
16407 + }
16408 +
16409 + hook.memoizedState = [callback, nextDeps];
16410 + return callback;
16411 + }
16412 +
16413 + function mountMemo(nextCreate, deps) {
16414 + var hook = mountWorkInProgressHook();
16415 + var nextDeps = deps === undefined ? null : deps;
16416 + var nextValue = nextCreate();
16417 + hook.memoizedState = [nextValue, nextDeps];
16418 + return nextValue;
16419 + }
16420 +
16421 + function updateMemo(nextCreate, deps) {
16422 + var hook = updateWorkInProgressHook();
16423 + var nextDeps = deps === undefined ? null : deps;
16424 + var prevState = hook.memoizedState;
16425 +
16426 + if (prevState !== null) {
16427 + // Assume these are defined. If they're not, areHookInputsEqual will warn.
16428 + if (nextDeps !== null) {
16429 + var prevDeps = prevState[1];
16430 +
16431 + if (areHookInputsEqual(nextDeps, prevDeps)) {
16432 + return prevState[0];
16433 + }
16434 + }
16435 + }
16436 +
16437 + var nextValue = nextCreate();
16438 + hook.memoizedState = [nextValue, nextDeps];
16439 + return nextValue;
16440 + }
16441 +
16442 + function mountDeferredValue(value) {
16443 + var hook = mountWorkInProgressHook();
16444 + hook.memoizedState = value;
16445 + return value;
16446 + }
16447 +
16448 + function updateDeferredValue(value) {
16449 + var hook = updateWorkInProgressHook();
16450 + var resolvedCurrentHook = currentHook;
16451 + var prevValue = resolvedCurrentHook.memoizedState;
16452 + return updateDeferredValueImpl(hook, prevValue, value);
16453 + }
16454 +
16455 + function rerenderDeferredValue(value) {
16456 + var hook = updateWorkInProgressHook();
16457 +
16458 + if (currentHook === null) {
16459 + // This is a rerender during a mount.
16460 + hook.memoizedState = value;
16461 + return value;
16462 + } else {
16463 + // This is a rerender during an update.
16464 + var prevValue = currentHook.memoizedState;
16465 + return updateDeferredValueImpl(hook, prevValue, value);
16466 + }
16467 + }
16468 +
16469 + function updateDeferredValueImpl(hook, prevValue, value) {
16470 + var shouldDeferValue = !includesOnlyNonUrgentLanes(renderLanes);
16471 +
16472 + if (shouldDeferValue) {
16473 + // This is an urgent update. If the value has changed, keep using the
16474 + // previous value and spawn a deferred render to update it later.
16475 + if (!objectIs(value, prevValue)) {
16476 + // Schedule a deferred render
16477 + var deferredLane = claimNextTransitionLane();
16478 + currentlyRenderingFiber$1.lanes = mergeLanes(currentlyRenderingFiber$1.lanes, deferredLane);
16479 + markSkippedUpdateLanes(deferredLane); // Set this to true to indicate that the rendered value is inconsistent
16480 + // from the latest value. The name "baseState" doesn't really match how we
16481 + // use it because we're reusing a state hook field instead of creating a
16482 + // new one.
16483 +
16484 + hook.baseState = true;
16485 + } // Reuse the previous value
16486 +
16487 +
16488 + return prevValue;
16489 + } else {
16490 + // This is not an urgent update, so we can use the latest value regardless
16491 + // of what it is. No need to defer it.
16492 + // However, if we're currently inside a spawned render, then we need to mark
16493 + // this as an update to prevent the fiber from bailing out.
16494 + //
16495 + // `baseState` is true when the current value is different from the rendered
16496 + // value. The name doesn't really match how we use it because we're reusing
16497 + // a state hook field instead of creating a new one.
16498 + if (hook.baseState) {
16499 + // Flip this back to false.
16500 + hook.baseState = false;
16501 + markWorkInProgressReceivedUpdate();
16502 + }
16503 +
16504 + hook.memoizedState = value;
16505 + return value;
16506 + }
16507 + }
16508 +
16509 + function startTransition(setPending, callback, options) {
16510 + var previousPriority = getCurrentUpdatePriority();
16511 + setCurrentUpdatePriority(higherEventPriority(previousPriority, ContinuousEventPriority));
16512 + setPending(true);
16513 + var prevTransition = ReactCurrentBatchConfig$2.transition;
16514 + ReactCurrentBatchConfig$2.transition = {};
16515 + var currentTransition = ReactCurrentBatchConfig$2.transition;
16516 +
16517 + {
16518 + ReactCurrentBatchConfig$2.transition._updatedFibers = new Set();
16519 + }
16520 +
16521 + try {
16522 + setPending(false);
16523 + callback();
16524 + } finally {
16525 + setCurrentUpdatePriority(previousPriority);
16526 + ReactCurrentBatchConfig$2.transition = prevTransition;
16527 +
16528 + {
16529 + if (prevTransition === null && currentTransition._updatedFibers) {
16530 + var updatedFibersCount = currentTransition._updatedFibers.size;
16531 +
16532 + if (updatedFibersCount > 10) {
16533 + warn('Detected a large number of updates inside startTransition. ' + 'If this is due to a subscription please re-write it to use React provided hooks. ' + 'Otherwise concurrent mode guarantees are off the table.');
16534 + }
16535 +
16536 + currentTransition._updatedFibers.clear();
16537 + }
16538 + }
16539 + }
16540 + }
16541 +
16542 + function mountTransition() {
16543 + var _mountState = mountState(false),
16544 + isPending = _mountState[0],
16545 + setPending = _mountState[1]; // The `start` method never changes.
16546 +
16547 +
16548 + var start = startTransition.bind(null, setPending);
16549 + var hook = mountWorkInProgressHook();
16550 + hook.memoizedState = start;
16551 + return [isPending, start];
16552 + }
16553 +
16554 + function updateTransition() {
16555 + var _updateState = updateState(),
16556 + isPending = _updateState[0];
16557 +
16558 + var hook = updateWorkInProgressHook();
16559 + var start = hook.memoizedState;
16560 + return [isPending, start];
16561 + }
16562 +
16563 + function rerenderTransition() {
16564 + var _rerenderState = rerenderState(),
16565 + isPending = _rerenderState[0];
16566 +
16567 + var hook = updateWorkInProgressHook();
16568 + var start = hook.memoizedState;
16569 + return [isPending, start];
16570 + }
16571 +
16572 + var isUpdatingOpaqueValueInRenderPhase = false;
16573 + function getIsUpdatingOpaqueValueInRenderPhaseInDEV() {
16574 + {
16575 + return isUpdatingOpaqueValueInRenderPhase;
16576 + }
16577 + }
16578 +
16579 + function mountId() {
16580 + var hook = mountWorkInProgressHook();
16581 + var root = getWorkInProgressRoot(); // TODO: In Fizz, id generation is specific to each server config. Maybe we
16582 + // should do this in Fiber, too? Deferring this decision for now because
16583 + // there's no other place to store the prefix except for an internal field on
16584 + // the public createRoot object, which the fiber tree does not currently have
16585 + // a reference to.
16586 +
16587 + var identifierPrefix = root.identifierPrefix;
16588 + var id;
16589 +
16590 + if (getIsHydrating()) {
16591 + var treeId = getTreeId(); // Use a captial R prefix for server-generated ids.
16592 +
16593 + id = ':' + identifierPrefix + 'R' + treeId; // Unless this is the first id at this level, append a number at the end
16594 + // that represents the position of this useId hook among all the useId
16595 + // hooks for this fiber.
16596 +
16597 + var localId = localIdCounter++;
16598 +
16599 + if (localId > 0) {
16600 + id += 'H' + localId.toString(32);
16601 + }
16602 +
16603 + id += ':';
16604 + } else {
16605 + // Use a lowercase r prefix for client-generated ids.
16606 + var globalClientId = globalClientIdCounter++;
16607 + id = ':' + identifierPrefix + 'r' + globalClientId.toString(32) + ':';
16608 + }
16609 +
16610 + hook.memoizedState = id;
16611 + return id;
16612 + }
16613 +
16614 + function updateId() {
16615 + var hook = updateWorkInProgressHook();
16616 + var id = hook.memoizedState;
16617 + return id;
16618 + }
16619 +
16620 + function dispatchReducerAction(fiber, queue, action) {
16621 + {
16622 + if (typeof arguments[3] === 'function') {
16623 + error("State updates from the useState() and useReducer() Hooks don't support the " + 'second callback argument. To execute a side effect after ' + 'rendering, declare it in the component body with useEffect().');
16624 + }
16625 + }
16626 +
16627 + var lane = requestUpdateLane(fiber);
16628 + var update = {
16629 + lane: lane,
16630 + action: action,
16631 + hasEagerState: false,
16632 + eagerState: null,
16633 + next: null
16634 + };
16635 +
16636 + if (isRenderPhaseUpdate(fiber)) {
16637 + enqueueRenderPhaseUpdate(queue, update);
16638 + } else {
16639 + var root = enqueueConcurrentHookUpdate(fiber, queue, update, lane);
16640 +
16641 + if (root !== null) {
16642 + var eventTime = requestEventTime();
16643 + scheduleUpdateOnFiber(root, fiber, lane, eventTime);
16644 + entangleTransitionUpdate(root, queue, lane);
16645 + }
16646 + }
16647 +
16648 + markUpdateInDevTools(fiber, lane);
16649 + }
16650 +
16651 + function dispatchSetState(fiber, queue, action) {
16652 + {
16653 + if (typeof arguments[3] === 'function') {
16654 + error("State updates from the useState() and useReducer() Hooks don't support the " + 'second callback argument. To execute a side effect after ' + 'rendering, declare it in the component body with useEffect().');
16655 + }
16656 + }
16657 +
16658 + var lane = requestUpdateLane(fiber);
16659 + var update = {
16660 + lane: lane,
16661 + action: action,
16662 + hasEagerState: false,
16663 + eagerState: null,
16664 + next: null
16665 + };
16666 +
16667 + if (isRenderPhaseUpdate(fiber)) {
16668 + enqueueRenderPhaseUpdate(queue, update);
16669 + } else {
16670 + var alternate = fiber.alternate;
16671 +
16672 + if (fiber.lanes === NoLanes && (alternate === null || alternate.lanes === NoLanes)) {
16673 + // The queue is currently empty, which means we can eagerly compute the
16674 + // next state before entering the render phase. If the new state is the
16675 + // same as the current state, we may be able to bail out entirely.
16676 + var lastRenderedReducer = queue.lastRenderedReducer;
16677 +
16678 + if (lastRenderedReducer !== null) {
16679 + var prevDispatcher;
16680 +
16681 + {
16682 + prevDispatcher = ReactCurrentDispatcher$1.current;
16683 + ReactCurrentDispatcher$1.current = InvalidNestedHooksDispatcherOnUpdateInDEV;
16684 + }
16685 +
16686 + try {
16687 + var currentState = queue.lastRenderedState;
16688 + var eagerState = lastRenderedReducer(currentState, action); // Stash the eagerly computed state, and the reducer used to compute
16689 + // it, on the update object. If the reducer hasn't changed by the
16690 + // time we enter the render phase, then the eager state can be used
16691 + // without calling the reducer again.
16692 +
16693 + update.hasEagerState = true;
16694 + update.eagerState = eagerState;
16695 +
16696 + if (objectIs(eagerState, currentState)) {
16697 + // Fast path. We can bail out without scheduling React to re-render.
16698 + // It's still possible that we'll need to rebase this update later,
16699 + // if the component re-renders for a different reason and by that
16700 + // time the reducer has changed.
16701 + // TODO: Do we still need to entangle transitions in this case?
16702 + enqueueConcurrentHookUpdateAndEagerlyBailout(fiber, queue, update, lane);
16703 + return;
16704 + }
16705 + } catch (error) {// Suppress the error. It will throw again in the render phase.
16706 + } finally {
16707 + {
16708 + ReactCurrentDispatcher$1.current = prevDispatcher;
16709 + }
16710 + }
16711 + }
16712 + }
16713 +
16714 + var root = enqueueConcurrentHookUpdate(fiber, queue, update, lane);
16715 +
16716 + if (root !== null) {
16717 + var eventTime = requestEventTime();
16718 + scheduleUpdateOnFiber(root, fiber, lane, eventTime);
16719 + entangleTransitionUpdate(root, queue, lane);
16720 + }
16721 + }
16722 +
16723 + markUpdateInDevTools(fiber, lane);
16724 + }
16725 +
16726 + function isRenderPhaseUpdate(fiber) {
16727 + var alternate = fiber.alternate;
16728 + return fiber === currentlyRenderingFiber$1 || alternate !== null && alternate === currentlyRenderingFiber$1;
16729 + }
16730 +
16731 + function enqueueRenderPhaseUpdate(queue, update) {
16732 + // This is a render phase update. Stash it in a lazily-created map of
16733 + // queue -> linked list of updates. After this render pass, we'll restart
16734 + // and apply the stashed updates on top of the work-in-progress hook.
16735 + didScheduleRenderPhaseUpdateDuringThisPass = didScheduleRenderPhaseUpdate = true;
16736 + var pending = queue.pending;
16737 +
16738 + if (pending === null) {
16739 + // This is the first update. Create a circular list.
16740 + update.next = update;
16741 + } else {
16742 + update.next = pending.next;
16743 + pending.next = update;
16744 + }
16745 +
16746 + queue.pending = update;
16747 + } // TODO: Move to ReactFiberConcurrentUpdates?
16748 +
16749 +
16750 + function entangleTransitionUpdate(root, queue, lane) {
16751 + if (isTransitionLane(lane)) {
16752 + var queueLanes = queue.lanes; // If any entangled lanes are no longer pending on the root, then they
16753 + // must have finished. We can remove them from the shared queue, which
16754 + // represents a superset of the actually pending lanes. In some cases we
16755 + // may entangle more than we need to, but that's OK. In fact it's worse if
16756 + // we *don't* entangle when we should.
16757 +
16758 + queueLanes = intersectLanes(queueLanes, root.pendingLanes); // Entangle the new transition lane with the other transition lanes.
16759 +
16760 + var newQueueLanes = mergeLanes(queueLanes, lane);
16761 + queue.lanes = newQueueLanes; // Even if queue.lanes already include lane, we don't know for certain if
16762 + // the lane finished since the last time we entangled it. So we need to
16763 + // entangle it again, just to be sure.
16764 +
16765 + markRootEntangled(root, newQueueLanes);
16766 + }
16767 + }
16768 +
16769 + function markUpdateInDevTools(fiber, lane, action) {
16770 +
16771 + {
16772 + markStateUpdateScheduled(fiber, lane);
16773 + }
16774 + }
16775 +
16776 + var ContextOnlyDispatcher = {
16777 + readContext: readContext,
16778 + useCallback: throwInvalidHookError,
16779 + useContext: throwInvalidHookError,
16780 + useEffect: throwInvalidHookError,
16781 + useImperativeHandle: throwInvalidHookError,
16782 + useInsertionEffect: throwInvalidHookError,
16783 + useLayoutEffect: throwInvalidHookError,
16784 + useMemo: throwInvalidHookError,
16785 + useReducer: throwInvalidHookError,
16786 + useRef: throwInvalidHookError,
16787 + useState: throwInvalidHookError,
16788 + useDebugValue: throwInvalidHookError,
16789 + useDeferredValue: throwInvalidHookError,
16790 + useTransition: throwInvalidHookError,
16791 + useMutableSource: throwInvalidHookError,
16792 + useSyncExternalStore: throwInvalidHookError,
16793 + useId: throwInvalidHookError,
16794 + unstable_isNewReconciler: enableNewReconciler
16795 + };
16796 +
16797 + var HooksDispatcherOnMountInDEV = null;
16798 + var HooksDispatcherOnMountWithHookTypesInDEV = null;
16799 + var HooksDispatcherOnUpdateInDEV = null;
16800 + var HooksDispatcherOnRerenderInDEV = null;
16801 + var InvalidNestedHooksDispatcherOnMountInDEV = null;
16802 + var InvalidNestedHooksDispatcherOnUpdateInDEV = null;
16803 + var InvalidNestedHooksDispatcherOnRerenderInDEV = null;
16804 +
16805 + {
16806 + var warnInvalidContextAccess = function () {
16807 + error('Context can only be read while React is rendering. ' + 'In classes, you can read it in the render method or getDerivedStateFromProps. ' + 'In function components, you can read it directly in the function body, but not ' + 'inside Hooks like useReducer() or useMemo().');
16808 + };
16809 +
16810 + var warnInvalidHookAccess = function () {
16811 + error('Do not call Hooks inside useEffect(...), useMemo(...), or other built-in Hooks. ' + 'You can only call Hooks at the top level of your React function. ' + 'For more information, see ' + 'https://reactjs.org/link/rules-of-hooks');
16812 + };
16813 +
16814 + HooksDispatcherOnMountInDEV = {
16815 + readContext: function (context) {
16816 + return readContext(context);
16817 + },
16818 + useCallback: function (callback, deps) {
16819 + currentHookNameInDev = 'useCallback';
16820 + mountHookTypesDev();
16821 + checkDepsAreArrayDev(deps);
16822 + return mountCallback(callback, deps);
16823 + },
16824 + useContext: function (context) {
16825 + currentHookNameInDev = 'useContext';
16826 + mountHookTypesDev();
16827 + return readContext(context);
16828 + },
16829 + useEffect: function (create, deps) {
16830 + currentHookNameInDev = 'useEffect';
16831 + mountHookTypesDev();
16832 + checkDepsAreArrayDev(deps);
16833 + return mountEffect(create, deps);
16834 + },
16835 + useImperativeHandle: function (ref, create, deps) {
16836 + currentHookNameInDev = 'useImperativeHandle';
16837 + mountHookTypesDev();
16838 + checkDepsAreArrayDev(deps);
16839 + return mountImperativeHandle(ref, create, deps);
16840 + },
16841 + useInsertionEffect: function (create, deps) {
16842 + currentHookNameInDev = 'useInsertionEffect';
16843 + mountHookTypesDev();
16844 + checkDepsAreArrayDev(deps);
16845 + return mountInsertionEffect(create, deps);
16846 + },
16847 + useLayoutEffect: function (create, deps) {
16848 + currentHookNameInDev = 'useLayoutEffect';
16849 + mountHookTypesDev();
16850 + checkDepsAreArrayDev(deps);
16851 + return mountLayoutEffect(create, deps);
16852 + },
16853 + useMemo: function (create, deps) {
16854 + currentHookNameInDev = 'useMemo';
16855 + mountHookTypesDev();
16856 + checkDepsAreArrayDev(deps);
16857 + var prevDispatcher = ReactCurrentDispatcher$1.current;
16858 + ReactCurrentDispatcher$1.current = InvalidNestedHooksDispatcherOnMountInDEV;
16859 +
16860 + try {
16861 + return mountMemo(create, deps);
16862 + } finally {
16863 + ReactCurrentDispatcher$1.current = prevDispatcher;
16864 + }
16865 + },
16866 + useReducer: function (reducer, initialArg, init) {
16867 + currentHookNameInDev = 'useReducer';
16868 + mountHookTypesDev();
16869 + var prevDispatcher = ReactCurrentDispatcher$1.current;
16870 + ReactCurrentDispatcher$1.current = InvalidNestedHooksDispatcherOnMountInDEV;
16871 +
16872 + try {
16873 + return mountReducer(reducer, initialArg, init);
16874 + } finally {
16875 + ReactCurrentDispatcher$1.current = prevDispatcher;
16876 + }
16877 + },
16878 + useRef: function (initialValue) {
16879 + currentHookNameInDev = 'useRef';
16880 + mountHookTypesDev();
16881 + return mountRef(initialValue);
16882 + },
16883 + useState: function (initialState) {
16884 + currentHookNameInDev = 'useState';
16885 + mountHookTypesDev();
16886 + var prevDispatcher = ReactCurrentDispatcher$1.current;
16887 + ReactCurrentDispatcher$1.current = InvalidNestedHooksDispatcherOnMountInDEV;
16888 +
16889 + try {
16890 + return mountState(initialState);
16891 + } finally {
16892 + ReactCurrentDispatcher$1.current = prevDispatcher;
16893 + }
16894 + },
16895 + useDebugValue: function (value, formatterFn) {
16896 + currentHookNameInDev = 'useDebugValue';
16897 + mountHookTypesDev();
16898 + return mountDebugValue();
16899 + },
16900 + useDeferredValue: function (value) {
16901 + currentHookNameInDev = 'useDeferredValue';
16902 + mountHookTypesDev();
16903 + return mountDeferredValue(value);
16904 + },
16905 + useTransition: function () {
16906 + currentHookNameInDev = 'useTransition';
16907 + mountHookTypesDev();
16908 + return mountTransition();
16909 + },
16910 + useMutableSource: function (source, getSnapshot, subscribe) {
16911 + currentHookNameInDev = 'useMutableSource';
16912 + mountHookTypesDev();
16913 + return mountMutableSource();
16914 + },
16915 + useSyncExternalStore: function (subscribe, getSnapshot, getServerSnapshot) {
16916 + currentHookNameInDev = 'useSyncExternalStore';
16917 + mountHookTypesDev();
16918 + return mountSyncExternalStore(subscribe, getSnapshot, getServerSnapshot);
16919 + },
16920 + useId: function () {
16921 + currentHookNameInDev = 'useId';
16922 + mountHookTypesDev();
16923 + return mountId();
16924 + },
16925 + unstable_isNewReconciler: enableNewReconciler
16926 + };
16927 +
16928 + HooksDispatcherOnMountWithHookTypesInDEV = {
16929 + readContext: function (context) {
16930 + return readContext(context);
16931 + },
16932 + useCallback: function (callback, deps) {
16933 + currentHookNameInDev = 'useCallback';
16934 + updateHookTypesDev();
16935 + return mountCallback(callback, deps);
16936 + },
16937 + useContext: function (context) {
16938 + currentHookNameInDev = 'useContext';
16939 + updateHookTypesDev();
16940 + return readContext(context);
16941 + },
16942 + useEffect: function (create, deps) {
16943 + currentHookNameInDev = 'useEffect';
16944 + updateHookTypesDev();
16945 + return mountEffect(create, deps);
16946 + },
16947 + useImperativeHandle: function (ref, create, deps) {
16948 + currentHookNameInDev = 'useImperativeHandle';
16949 + updateHookTypesDev();
16950 + return mountImperativeHandle(ref, create, deps);
16951 + },
16952 + useInsertionEffect: function (create, deps) {
16953 + currentHookNameInDev = 'useInsertionEffect';
16954 + updateHookTypesDev();
16955 + return mountInsertionEffect(create, deps);
16956 + },
16957 + useLayoutEffect: function (create, deps) {
16958 + currentHookNameInDev = 'useLayoutEffect';
16959 + updateHookTypesDev();
16960 + return mountLayoutEffect(create, deps);
16961 + },
16962 + useMemo: function (create, deps) {
16963 + currentHookNameInDev = 'useMemo';
16964 + updateHookTypesDev();
16965 + var prevDispatcher = ReactCurrentDispatcher$1.current;
16966 + ReactCurrentDispatcher$1.current = InvalidNestedHooksDispatcherOnMountInDEV;
16967 +
16968 + try {
16969 + return mountMemo(create, deps);
16970 + } finally {
16971 + ReactCurrentDispatcher$1.current = prevDispatcher;
16972 + }
16973 + },
16974 + useReducer: function (reducer, initialArg, init) {
16975 + currentHookNameInDev = 'useReducer';
16976 + updateHookTypesDev();
16977 + var prevDispatcher = ReactCurrentDispatcher$1.current;
16978 + ReactCurrentDispatcher$1.current = InvalidNestedHooksDispatcherOnMountInDEV;
16979 +
16980 + try {
16981 + return mountReducer(reducer, initialArg, init);
16982 + } finally {
16983 + ReactCurrentDispatcher$1.current = prevDispatcher;
16984 + }
16985 + },
16986 + useRef: function (initialValue) {
16987 + currentHookNameInDev = 'useRef';
16988 + updateHookTypesDev();
16989 + return mountRef(initialValue);
16990 + },
16991 + useState: function (initialState) {
16992 + currentHookNameInDev = 'useState';
16993 + updateHookTypesDev();
16994 + var prevDispatcher = ReactCurrentDispatcher$1.current;
16995 + ReactCurrentDispatcher$1.current = InvalidNestedHooksDispatcherOnMountInDEV;
16996 +
16997 + try {
16998 + return mountState(initialState);
16999 + } finally {
17000 + ReactCurrentDispatcher$1.current = prevDispatcher;
17001 + }
17002 + },
17003 + useDebugValue: function (value, formatterFn) {
17004 + currentHookNameInDev = 'useDebugValue';
17005 + updateHookTypesDev();
17006 + return mountDebugValue();
17007 + },
17008 + useDeferredValue: function (value) {
17009 + currentHookNameInDev = 'useDeferredValue';
17010 + updateHookTypesDev();
17011 + return mountDeferredValue(value);
17012 + },
17013 + useTransition: function () {
17014 + currentHookNameInDev = 'useTransition';
17015 + updateHookTypesDev();
17016 + return mountTransition();
17017 + },
17018 + useMutableSource: function (source, getSnapshot, subscribe) {
17019 + currentHookNameInDev = 'useMutableSource';
17020 + updateHookTypesDev();
17021 + return mountMutableSource();
17022 + },
17023 + useSyncExternalStore: function (subscribe, getSnapshot, getServerSnapshot) {
17024 + currentHookNameInDev = 'useSyncExternalStore';
17025 + updateHookTypesDev();
17026 + return mountSyncExternalStore(subscribe, getSnapshot, getServerSnapshot);
17027 + },
17028 + useId: function () {
17029 + currentHookNameInDev = 'useId';
17030 + updateHookTypesDev();
17031 + return mountId();
17032 + },
17033 + unstable_isNewReconciler: enableNewReconciler
17034 + };
17035 +
17036 + HooksDispatcherOnUpdateInDEV = {
17037 + readContext: function (context) {
17038 + return readContext(context);
17039 + },
17040 + useCallback: function (callback, deps) {
17041 + currentHookNameInDev = 'useCallback';
17042 + updateHookTypesDev();
17043 + return updateCallback(callback, deps);
17044 + },
17045 + useContext: function (context) {
17046 + currentHookNameInDev = 'useContext';
17047 + updateHookTypesDev();
17048 + return readContext(context);
17049 + },
17050 + useEffect: function (create, deps) {
17051 + currentHookNameInDev = 'useEffect';
17052 + updateHookTypesDev();
17053 + return updateEffect(create, deps);
17054 + },
17055 + useImperativeHandle: function (ref, create, deps) {
17056 + currentHookNameInDev = 'useImperativeHandle';
17057 + updateHookTypesDev();
17058 + return updateImperativeHandle(ref, create, deps);
17059 + },
17060 + useInsertionEffect: function (create, deps) {
17061 + currentHookNameInDev = 'useInsertionEffect';
17062 + updateHookTypesDev();
17063 + return updateInsertionEffect(create, deps);
17064 + },
17065 + useLayoutEffect: function (create, deps) {
17066 + currentHookNameInDev = 'useLayoutEffect';
17067 + updateHookTypesDev();
17068 + return updateLayoutEffect(create, deps);
17069 + },
17070 + useMemo: function (create, deps) {
17071 + currentHookNameInDev = 'useMemo';
17072 + updateHookTypesDev();
17073 + var prevDispatcher = ReactCurrentDispatcher$1.current;
17074 + ReactCurrentDispatcher$1.current = InvalidNestedHooksDispatcherOnUpdateInDEV;
17075 +
17076 + try {
17077 + return updateMemo(create, deps);
17078 + } finally {
17079 + ReactCurrentDispatcher$1.current = prevDispatcher;
17080 + }
17081 + },
17082 + useReducer: function (reducer, initialArg, init) {
17083 + currentHookNameInDev = 'useReducer';
17084 + updateHookTypesDev();
17085 + var prevDispatcher = ReactCurrentDispatcher$1.current;
17086 + ReactCurrentDispatcher$1.current = InvalidNestedHooksDispatcherOnUpdateInDEV;
17087 +
17088 + try {
17089 + return updateReducer(reducer, initialArg, init);
17090 + } finally {
17091 + ReactCurrentDispatcher$1.current = prevDispatcher;
17092 + }
17093 + },
17094 + useRef: function (initialValue) {
17095 + currentHookNameInDev = 'useRef';
17096 + updateHookTypesDev();
17097 + return updateRef();
17098 + },
17099 + useState: function (initialState) {
17100 + currentHookNameInDev = 'useState';
17101 + updateHookTypesDev();
17102 + var prevDispatcher = ReactCurrentDispatcher$1.current;
17103 + ReactCurrentDispatcher$1.current = InvalidNestedHooksDispatcherOnUpdateInDEV;
17104 +
17105 + try {
17106 + return updateState(initialState);
17107 + } finally {
17108 + ReactCurrentDispatcher$1.current = prevDispatcher;
17109 + }
17110 + },
17111 + useDebugValue: function (value, formatterFn) {
17112 + currentHookNameInDev = 'useDebugValue';
17113 + updateHookTypesDev();
17114 + return updateDebugValue();
17115 + },
17116 + useDeferredValue: function (value) {
17117 + currentHookNameInDev = 'useDeferredValue';
17118 + updateHookTypesDev();
17119 + return updateDeferredValue(value);
17120 + },
17121 + useTransition: function () {
17122 + currentHookNameInDev = 'useTransition';
17123 + updateHookTypesDev();
17124 + return updateTransition();
17125 + },
17126 + useMutableSource: function (source, getSnapshot, subscribe) {
17127 + currentHookNameInDev = 'useMutableSource';
17128 + updateHookTypesDev();
17129 + return updateMutableSource();
17130 + },
17131 + useSyncExternalStore: function (subscribe, getSnapshot, getServerSnapshot) {
17132 + currentHookNameInDev = 'useSyncExternalStore';
17133 + updateHookTypesDev();
17134 + return updateSyncExternalStore(subscribe, getSnapshot);
17135 + },
17136 + useId: function () {
17137 + currentHookNameInDev = 'useId';
17138 + updateHookTypesDev();
17139 + return updateId();
17140 + },
17141 + unstable_isNewReconciler: enableNewReconciler
17142 + };
17143 +
17144 + HooksDispatcherOnRerenderInDEV = {
17145 + readContext: function (context) {
17146 + return readContext(context);
17147 + },
17148 + useCallback: function (callback, deps) {
17149 + currentHookNameInDev = 'useCallback';
17150 + updateHookTypesDev();
17151 + return updateCallback(callback, deps);
17152 + },
17153 + useContext: function (context) {
17154 + currentHookNameInDev = 'useContext';
17155 + updateHookTypesDev();
17156 + return readContext(context);
17157 + },
17158 + useEffect: function (create, deps) {
17159 + currentHookNameInDev = 'useEffect';
17160 + updateHookTypesDev();
17161 + return updateEffect(create, deps);
17162 + },
17163 + useImperativeHandle: function (ref, create, deps) {
17164 + currentHookNameInDev = 'useImperativeHandle';
17165 + updateHookTypesDev();
17166 + return updateImperativeHandle(ref, create, deps);
17167 + },
17168 + useInsertionEffect: function (create, deps) {
17169 + currentHookNameInDev = 'useInsertionEffect';
17170 + updateHookTypesDev();
17171 + return updateInsertionEffect(create, deps);
17172 + },
17173 + useLayoutEffect: function (create, deps) {
17174 + currentHookNameInDev = 'useLayoutEffect';
17175 + updateHookTypesDev();
17176 + return updateLayoutEffect(create, deps);
17177 + },
17178 + useMemo: function (create, deps) {
17179 + currentHookNameInDev = 'useMemo';
17180 + updateHookTypesDev();
17181 + var prevDispatcher = ReactCurrentDispatcher$1.current;
17182 + ReactCurrentDispatcher$1.current = InvalidNestedHooksDispatcherOnRerenderInDEV;
17183 +
17184 + try {
17185 + return updateMemo(create, deps);
17186 + } finally {
17187 + ReactCurrentDispatcher$1.current = prevDispatcher;
17188 + }
17189 + },
17190 + useReducer: function (reducer, initialArg, init) {
17191 + currentHookNameInDev = 'useReducer';
17192 + updateHookTypesDev();
17193 + var prevDispatcher = ReactCurrentDispatcher$1.current;
17194 + ReactCurrentDispatcher$1.current = InvalidNestedHooksDispatcherOnRerenderInDEV;
17195 +
17196 + try {
17197 + return rerenderReducer(reducer, initialArg, init);
17198 + } finally {
17199 + ReactCurrentDispatcher$1.current = prevDispatcher;
17200 + }
17201 + },
17202 + useRef: function (initialValue) {
17203 + currentHookNameInDev = 'useRef';
17204 + updateHookTypesDev();
17205 + return updateRef();
17206 + },
17207 + useState: function (initialState) {
17208 + currentHookNameInDev = 'useState';
17209 + updateHookTypesDev();
17210 + var prevDispatcher = ReactCurrentDispatcher$1.current;
17211 + ReactCurrentDispatcher$1.current = InvalidNestedHooksDispatcherOnRerenderInDEV;
17212 +
17213 + try {
17214 + return rerenderState(initialState);
17215 + } finally {
17216 + ReactCurrentDispatcher$1.current = prevDispatcher;
17217 + }
17218 + },
17219 + useDebugValue: function (value, formatterFn) {
17220 + currentHookNameInDev = 'useDebugValue';
17221 + updateHookTypesDev();
17222 + return updateDebugValue();
17223 + },
17224 + useDeferredValue: function (value) {
17225 + currentHookNameInDev = 'useDeferredValue';
17226 + updateHookTypesDev();
17227 + return rerenderDeferredValue(value);
17228 + },
17229 + useTransition: function () {
17230 + currentHookNameInDev = 'useTransition';
17231 + updateHookTypesDev();
17232 + return rerenderTransition();
17233 + },
17234 + useMutableSource: function (source, getSnapshot, subscribe) {
17235 + currentHookNameInDev = 'useMutableSource';
17236 + updateHookTypesDev();
17237 + return updateMutableSource();
17238 + },
17239 + useSyncExternalStore: function (subscribe, getSnapshot, getServerSnapshot) {
17240 + currentHookNameInDev = 'useSyncExternalStore';
17241 + updateHookTypesDev();
17242 + return updateSyncExternalStore(subscribe, getSnapshot);
17243 + },
17244 + useId: function () {
17245 + currentHookNameInDev = 'useId';
17246 + updateHookTypesDev();
17247 + return updateId();
17248 + },
17249 + unstable_isNewReconciler: enableNewReconciler
17250 + };
17251 +
17252 + InvalidNestedHooksDispatcherOnMountInDEV = {
17253 + readContext: function (context) {
17254 + warnInvalidContextAccess();
17255 + return readContext(context);
17256 + },
17257 + useCallback: function (callback, deps) {
17258 + currentHookNameInDev = 'useCallback';
17259 + warnInvalidHookAccess();
17260 + mountHookTypesDev();
17261 + return mountCallback(callback, deps);
17262 + },
17263 + useContext: function (context) {
17264 + currentHookNameInDev = 'useContext';
17265 + warnInvalidHookAccess();
17266 + mountHookTypesDev();
17267 + return readContext(context);
17268 + },
17269 + useEffect: function (create, deps) {
17270 + currentHookNameInDev = 'useEffect';
17271 + warnInvalidHookAccess();
17272 + mountHookTypesDev();
17273 + return mountEffect(create, deps);
17274 + },
17275 + useImperativeHandle: function (ref, create, deps) {
17276 + currentHookNameInDev = 'useImperativeHandle';
17277 + warnInvalidHookAccess();
17278 + mountHookTypesDev();
17279 + return mountImperativeHandle(ref, create, deps);
17280 + },
17281 + useInsertionEffect: function (create, deps) {
17282 + currentHookNameInDev = 'useInsertionEffect';
17283 + warnInvalidHookAccess();
17284 + mountHookTypesDev();
17285 + return mountInsertionEffect(create, deps);
17286 + },
17287 + useLayoutEffect: function (create, deps) {
17288 + currentHookNameInDev = 'useLayoutEffect';
17289 + warnInvalidHookAccess();
17290 + mountHookTypesDev();
17291 + return mountLayoutEffect(create, deps);
17292 + },
17293 + useMemo: function (create, deps) {
17294 + currentHookNameInDev = 'useMemo';
17295 + warnInvalidHookAccess();
17296 + mountHookTypesDev();
17297 + var prevDispatcher = ReactCurrentDispatcher$1.current;
17298 + ReactCurrentDispatcher$1.current = InvalidNestedHooksDispatcherOnMountInDEV;
17299 +
17300 + try {
17301 + return mountMemo(create, deps);
17302 + } finally {
17303 + ReactCurrentDispatcher$1.current = prevDispatcher;
17304 + }
17305 + },
17306 + useReducer: function (reducer, initialArg, init) {
17307 + currentHookNameInDev = 'useReducer';
17308 + warnInvalidHookAccess();
17309 + mountHookTypesDev();
17310 + var prevDispatcher = ReactCurrentDispatcher$1.current;
17311 + ReactCurrentDispatcher$1.current = InvalidNestedHooksDispatcherOnMountInDEV;
17312 +
17313 + try {
17314 + return mountReducer(reducer, initialArg, init);
17315 + } finally {
17316 + ReactCurrentDispatcher$1.current = prevDispatcher;
17317 + }
17318 + },
17319 + useRef: function (initialValue) {
17320 + currentHookNameInDev = 'useRef';
17321 + warnInvalidHookAccess();
17322 + mountHookTypesDev();
17323 + return mountRef(initialValue);
17324 + },
17325 + useState: function (initialState) {
17326 + currentHookNameInDev = 'useState';
17327 + warnInvalidHookAccess();
17328 + mountHookTypesDev();
17329 + var prevDispatcher = ReactCurrentDispatcher$1.current;
17330 + ReactCurrentDispatcher$1.current = InvalidNestedHooksDispatcherOnMountInDEV;
17331 +
17332 + try {
17333 + return mountState(initialState);
17334 + } finally {
17335 + ReactCurrentDispatcher$1.current = prevDispatcher;
17336 + }
17337 + },
17338 + useDebugValue: function (value, formatterFn) {
17339 + currentHookNameInDev = 'useDebugValue';
17340 + warnInvalidHookAccess();
17341 + mountHookTypesDev();
17342 + return mountDebugValue();
17343 + },
17344 + useDeferredValue: function (value) {
17345 + currentHookNameInDev = 'useDeferredValue';
17346 + warnInvalidHookAccess();
17347 + mountHookTypesDev();
17348 + return mountDeferredValue(value);
17349 + },
17350 + useTransition: function () {
17351 + currentHookNameInDev = 'useTransition';
17352 + warnInvalidHookAccess();
17353 + mountHookTypesDev();
17354 + return mountTransition();
17355 + },
17356 + useMutableSource: function (source, getSnapshot, subscribe) {
17357 + currentHookNameInDev = 'useMutableSource';
17358 + warnInvalidHookAccess();
17359 + mountHookTypesDev();
17360 + return mountMutableSource();
17361 + },
17362 + useSyncExternalStore: function (subscribe, getSnapshot, getServerSnapshot) {
17363 + currentHookNameInDev = 'useSyncExternalStore';
17364 + warnInvalidHookAccess();
17365 + mountHookTypesDev();
17366 + return mountSyncExternalStore(subscribe, getSnapshot, getServerSnapshot);
17367 + },
17368 + useId: function () {
17369 + currentHookNameInDev = 'useId';
17370 + warnInvalidHookAccess();
17371 + mountHookTypesDev();
17372 + return mountId();
17373 + },
17374 + unstable_isNewReconciler: enableNewReconciler
17375 + };
17376 +
17377 + InvalidNestedHooksDispatcherOnUpdateInDEV = {
17378 + readContext: function (context) {
17379 + warnInvalidContextAccess();
17380 + return readContext(context);
17381 + },
17382 + useCallback: function (callback, deps) {
17383 + currentHookNameInDev = 'useCallback';
17384 + warnInvalidHookAccess();
17385 + updateHookTypesDev();
17386 + return updateCallback(callback, deps);
17387 + },
17388 + useContext: function (context) {
17389 + currentHookNameInDev = 'useContext';
17390 + warnInvalidHookAccess();
17391 + updateHookTypesDev();
17392 + return readContext(context);
17393 + },
17394 + useEffect: function (create, deps) {
17395 + currentHookNameInDev = 'useEffect';
17396 + warnInvalidHookAccess();
17397 + updateHookTypesDev();
17398 + return updateEffect(create, deps);
17399 + },
17400 + useImperativeHandle: function (ref, create, deps) {
17401 + currentHookNameInDev = 'useImperativeHandle';
17402 + warnInvalidHookAccess();
17403 + updateHookTypesDev();
17404 + return updateImperativeHandle(ref, create, deps);
17405 + },
17406 + useInsertionEffect: function (create, deps) {
17407 + currentHookNameInDev = 'useInsertionEffect';
17408 + warnInvalidHookAccess();
17409 + updateHookTypesDev();
17410 + return updateInsertionEffect(create, deps);
17411 + },
17412 + useLayoutEffect: function (create, deps) {
17413 + currentHookNameInDev = 'useLayoutEffect';
17414 + warnInvalidHookAccess();
17415 + updateHookTypesDev();
17416 + return updateLayoutEffect(create, deps);
17417 + },
17418 + useMemo: function (create, deps) {
17419 + currentHookNameInDev = 'useMemo';
17420 + warnInvalidHookAccess();
17421 + updateHookTypesDev();
17422 + var prevDispatcher = ReactCurrentDispatcher$1.current;
17423 + ReactCurrentDispatcher$1.current = InvalidNestedHooksDispatcherOnUpdateInDEV;
17424 +
17425 + try {
17426 + return updateMemo(create, deps);
17427 + } finally {
17428 + ReactCurrentDispatcher$1.current = prevDispatcher;
17429 + }
17430 + },
17431 + useReducer: function (reducer, initialArg, init) {
17432 + currentHookNameInDev = 'useReducer';
17433 + warnInvalidHookAccess();
17434 + updateHookTypesDev();
17435 + var prevDispatcher = ReactCurrentDispatcher$1.current;
17436 + ReactCurrentDispatcher$1.current = InvalidNestedHooksDispatcherOnUpdateInDEV;
17437 +
17438 + try {
17439 + return updateReducer(reducer, initialArg, init);
17440 + } finally {
17441 + ReactCurrentDispatcher$1.current = prevDispatcher;
17442 + }
17443 + },
17444 + useRef: function (initialValue) {
17445 + currentHookNameInDev = 'useRef';
17446 + warnInvalidHookAccess();
17447 + updateHookTypesDev();
17448 + return updateRef();
17449 + },
17450 + useState: function (initialState) {
17451 + currentHookNameInDev = 'useState';
17452 + warnInvalidHookAccess();
17453 + updateHookTypesDev();
17454 + var prevDispatcher = ReactCurrentDispatcher$1.current;
17455 + ReactCurrentDispatcher$1.current = InvalidNestedHooksDispatcherOnUpdateInDEV;
17456 +
17457 + try {
17458 + return updateState(initialState);
17459 + } finally {
17460 + ReactCurrentDispatcher$1.current = prevDispatcher;
17461 + }
17462 + },
17463 + useDebugValue: function (value, formatterFn) {
17464 + currentHookNameInDev = 'useDebugValue';
17465 + warnInvalidHookAccess();
17466 + updateHookTypesDev();
17467 + return updateDebugValue();
17468 + },
17469 + useDeferredValue: function (value) {
17470 + currentHookNameInDev = 'useDeferredValue';
17471 + warnInvalidHookAccess();
17472 + updateHookTypesDev();
17473 + return updateDeferredValue(value);
17474 + },
17475 + useTransition: function () {
17476 + currentHookNameInDev = 'useTransition';
17477 + warnInvalidHookAccess();
17478 + updateHookTypesDev();
17479 + return updateTransition();
17480 + },
17481 + useMutableSource: function (source, getSnapshot, subscribe) {
17482 + currentHookNameInDev = 'useMutableSource';
17483 + warnInvalidHookAccess();
17484 + updateHookTypesDev();
17485 + return updateMutableSource();
17486 + },
17487 + useSyncExternalStore: function (subscribe, getSnapshot, getServerSnapshot) {
17488 + currentHookNameInDev = 'useSyncExternalStore';
17489 + warnInvalidHookAccess();
17490 + updateHookTypesDev();
17491 + return updateSyncExternalStore(subscribe, getSnapshot);
17492 + },
17493 + useId: function () {
17494 + currentHookNameInDev = 'useId';
17495 + warnInvalidHookAccess();
17496 + updateHookTypesDev();
17497 + return updateId();
17498 + },
17499 + unstable_isNewReconciler: enableNewReconciler
17500 + };
17501 +
17502 + InvalidNestedHooksDispatcherOnRerenderInDEV = {
17503 + readContext: function (context) {
17504 + warnInvalidContextAccess();
17505 + return readContext(context);
17506 + },
17507 + useCallback: function (callback, deps) {
17508 + currentHookNameInDev = 'useCallback';
17509 + warnInvalidHookAccess();
17510 + updateHookTypesDev();
17511 + return updateCallback(callback, deps);
17512 + },
17513 + useContext: function (context) {
17514 + currentHookNameInDev = 'useContext';
17515 + warnInvalidHookAccess();
17516 + updateHookTypesDev();
17517 + return readContext(context);
17518 + },
17519 + useEffect: function (create, deps) {
17520 + currentHookNameInDev = 'useEffect';
17521 + warnInvalidHookAccess();
17522 + updateHookTypesDev();
17523 + return updateEffect(create, deps);
17524 + },
17525 + useImperativeHandle: function (ref, create, deps) {
17526 + currentHookNameInDev = 'useImperativeHandle';
17527 + warnInvalidHookAccess();
17528 + updateHookTypesDev();
17529 + return updateImperativeHandle(ref, create, deps);
17530 + },
17531 + useInsertionEffect: function (create, deps) {
17532 + currentHookNameInDev = 'useInsertionEffect';
17533 + warnInvalidHookAccess();
17534 + updateHookTypesDev();
17535 + return updateInsertionEffect(create, deps);
17536 + },
17537 + useLayoutEffect: function (create, deps) {
17538 + currentHookNameInDev = 'useLayoutEffect';
17539 + warnInvalidHookAccess();
17540 + updateHookTypesDev();
17541 + return updateLayoutEffect(create, deps);
17542 + },
17543 + useMemo: function (create, deps) {
17544 + currentHookNameInDev = 'useMemo';
17545 + warnInvalidHookAccess();
17546 + updateHookTypesDev();
17547 + var prevDispatcher = ReactCurrentDispatcher$1.current;
17548 + ReactCurrentDispatcher$1.current = InvalidNestedHooksDispatcherOnUpdateInDEV;
17549 +
17550 + try {
17551 + return updateMemo(create, deps);
17552 + } finally {
17553 + ReactCurrentDispatcher$1.current = prevDispatcher;
17554 + }
17555 + },
17556 + useReducer: function (reducer, initialArg, init) {
17557 + currentHookNameInDev = 'useReducer';
17558 + warnInvalidHookAccess();
17559 + updateHookTypesDev();
17560 + var prevDispatcher = ReactCurrentDispatcher$1.current;
17561 + ReactCurrentDispatcher$1.current = InvalidNestedHooksDispatcherOnUpdateInDEV;
17562 +
17563 + try {
17564 + return rerenderReducer(reducer, initialArg, init);
17565 + } finally {
17566 + ReactCurrentDispatcher$1.current = prevDispatcher;
17567 + }
17568 + },
17569 + useRef: function (initialValue) {
17570 + currentHookNameInDev = 'useRef';
17571 + warnInvalidHookAccess();
17572 + updateHookTypesDev();
17573 + return updateRef();
17574 + },
17575 + useState: function (initialState) {
17576 + currentHookNameInDev = 'useState';
17577 + warnInvalidHookAccess();
17578 + updateHookTypesDev();
17579 + var prevDispatcher = ReactCurrentDispatcher$1.current;
17580 + ReactCurrentDispatcher$1.current = InvalidNestedHooksDispatcherOnUpdateInDEV;
17581 +
17582 + try {
17583 + return rerenderState(initialState);
17584 + } finally {
17585 + ReactCurrentDispatcher$1.current = prevDispatcher;
17586 + }
17587 + },
17588 + useDebugValue: function (value, formatterFn) {
17589 + currentHookNameInDev = 'useDebugValue';
17590 + warnInvalidHookAccess();
17591 + updateHookTypesDev();
17592 + return updateDebugValue();
17593 + },
17594 + useDeferredValue: function (value) {
17595 + currentHookNameInDev = 'useDeferredValue';
17596 + warnInvalidHookAccess();
17597 + updateHookTypesDev();
17598 + return rerenderDeferredValue(value);
17599 + },
17600 + useTransition: function () {
17601 + currentHookNameInDev = 'useTransition';
17602 + warnInvalidHookAccess();
17603 + updateHookTypesDev();
17604 + return rerenderTransition();
17605 + },
17606 + useMutableSource: function (source, getSnapshot, subscribe) {
17607 + currentHookNameInDev = 'useMutableSource';
17608 + warnInvalidHookAccess();
17609 + updateHookTypesDev();
17610 + return updateMutableSource();
17611 + },
17612 + useSyncExternalStore: function (subscribe, getSnapshot, getServerSnapshot) {
17613 + currentHookNameInDev = 'useSyncExternalStore';
17614 + warnInvalidHookAccess();
17615 + updateHookTypesDev();
17616 + return updateSyncExternalStore(subscribe, getSnapshot);
17617 + },
17618 + useId: function () {
17619 + currentHookNameInDev = 'useId';
17620 + warnInvalidHookAccess();
17621 + updateHookTypesDev();
17622 + return updateId();
17623 + },
17624 + unstable_isNewReconciler: enableNewReconciler
17625 + };
17626 + }
17627 +
17628 + var now$1 = unstable_now;
17629 + var commitTime = 0;
17630 + var layoutEffectStartTime = -1;
17631 + var profilerStartTime = -1;
17632 + var passiveEffectStartTime = -1;
17633 + /**
17634 + * Tracks whether the current update was a nested/cascading update (scheduled from a layout effect).
17635 + *
17636 + * The overall sequence is:
17637 + * 1. render
17638 + * 2. commit (and call `onRender`, `onCommit`)
17639 + * 3. check for nested updates
17640 + * 4. flush passive effects (and call `onPostCommit`)
17641 + *
17642 + * Nested updates are identified in step 3 above,
17643 + * but step 4 still applies to the work that was just committed.
17644 + * We use two flags to track nested updates then:
17645 + * one tracks whether the upcoming update is a nested update,
17646 + * and the other tracks whether the current update was a nested update.
17647 + * The first value gets synced to the second at the start of the render phase.
17648 + */
17649 +
17650 + var currentUpdateIsNested = false;
17651 + var nestedUpdateScheduled = false;
17652 +
17653 + function isCurrentUpdateNested() {
17654 + return currentUpdateIsNested;
17655 + }
17656 +
17657 + function markNestedUpdateScheduled() {
17658 + {
17659 + nestedUpdateScheduled = true;
17660 + }
17661 + }
17662 +
17663 + function resetNestedUpdateFlag() {
17664 + {
17665 + currentUpdateIsNested = false;
17666 + nestedUpdateScheduled = false;
17667 + }
17668 + }
17669 +
17670 + function syncNestedUpdateFlag() {
17671 + {
17672 + currentUpdateIsNested = nestedUpdateScheduled;
17673 + nestedUpdateScheduled = false;
17674 + }
17675 + }
17676 +
17677 + function getCommitTime() {
17678 + return commitTime;
17679 + }
17680 +
17681 + function recordCommitTime() {
17682 +
17683 + commitTime = now$1();
17684 + }
17685 +
17686 + function startProfilerTimer(fiber) {
17687 +
17688 + profilerStartTime = now$1();
17689 +
17690 + if (fiber.actualStartTime < 0) {
17691 + fiber.actualStartTime = now$1();
17692 + }
17693 + }
17694 +
17695 + function stopProfilerTimerIfRunning(fiber) {
17696 +
17697 + profilerStartTime = -1;
17698 + }
17699 +
17700 + function stopProfilerTimerIfRunningAndRecordDelta(fiber, overrideBaseTime) {
17701 +
17702 + if (profilerStartTime >= 0) {
17703 + var elapsedTime = now$1() - profilerStartTime;
17704 + fiber.actualDuration += elapsedTime;
17705 +
17706 + if (overrideBaseTime) {
17707 + fiber.selfBaseDuration = elapsedTime;
17708 + }
17709 +
17710 + profilerStartTime = -1;
17711 + }
17712 + }
17713 +
17714 + function recordLayoutEffectDuration(fiber) {
17715 +
17716 + if (layoutEffectStartTime >= 0) {
17717 + var elapsedTime = now$1() - layoutEffectStartTime;
17718 + layoutEffectStartTime = -1; // Store duration on the next nearest Profiler ancestor
17719 + // Or the root (for the DevTools Profiler to read)
17720 +
17721 + var parentFiber = fiber.return;
17722 +
17723 + while (parentFiber !== null) {
17724 + switch (parentFiber.tag) {
17725 + case HostRoot:
17726 + var root = parentFiber.stateNode;
17727 + root.effectDuration += elapsedTime;
17728 + return;
17729 +
17730 + case Profiler:
17731 + var parentStateNode = parentFiber.stateNode;
17732 + parentStateNode.effectDuration += elapsedTime;
17733 + return;
17734 + }
17735 +
17736 + parentFiber = parentFiber.return;
17737 + }
17738 + }
17739 + }
17740 +
17741 + function recordPassiveEffectDuration(fiber) {
17742 +
17743 + if (passiveEffectStartTime >= 0) {
17744 + var elapsedTime = now$1() - passiveEffectStartTime;
17745 + passiveEffectStartTime = -1; // Store duration on the next nearest Profiler ancestor
17746 + // Or the root (for the DevTools Profiler to read)
17747 +
17748 + var parentFiber = fiber.return;
17749 +
17750 + while (parentFiber !== null) {
17751 + switch (parentFiber.tag) {
17752 + case HostRoot:
17753 + var root = parentFiber.stateNode;
17754 +
17755 + if (root !== null) {
17756 + root.passiveEffectDuration += elapsedTime;
17757 + }
17758 +
17759 + return;
17760 +
17761 + case Profiler:
17762 + var parentStateNode = parentFiber.stateNode;
17763 +
17764 + if (parentStateNode !== null) {
17765 + // Detached fibers have their state node cleared out.
17766 + // In this case, the return pointer is also cleared out,
17767 + // so we won't be able to report the time spent in this Profiler's subtree.
17768 + parentStateNode.passiveEffectDuration += elapsedTime;
17769 + }
17770 +
17771 + return;
17772 + }
17773 +
17774 + parentFiber = parentFiber.return;
17775 + }
17776 + }
17777 + }
17778 +
17779 + function startLayoutEffectTimer() {
17780 +
17781 + layoutEffectStartTime = now$1();
17782 + }
17783 +
17784 + function startPassiveEffectTimer() {
17785 +
17786 + passiveEffectStartTime = now$1();
17787 + }
17788 +
17789 + function transferActualDuration(fiber) {
17790 + // Transfer time spent rendering these children so we don't lose it
17791 + // after we rerender. This is used as a helper in special cases
17792 + // where we should count the work of multiple passes.
17793 + var child = fiber.child;
17794 +
17795 + while (child) {
17796 + fiber.actualDuration += child.actualDuration;
17797 + child = child.sibling;
17798 + }
17799 + }
17800 +
17801 + function resolveDefaultProps(Component, baseProps) {
17802 + if (Component && Component.defaultProps) {
17803 + // Resolve default props. Taken from ReactElement
17804 + var props = assign({}, baseProps);
17805 + var defaultProps = Component.defaultProps;
17806 +
17807 + for (var propName in defaultProps) {
17808 + if (props[propName] === undefined) {
17809 + props[propName] = defaultProps[propName];
17810 + }
17811 + }
17812 +
17813 + return props;
17814 + }
17815 +
17816 + return baseProps;
17817 + }
17818 +
17819 + var fakeInternalInstance = {};
17820 + var didWarnAboutStateAssignmentForComponent;
17821 + var didWarnAboutUninitializedState;
17822 + var didWarnAboutGetSnapshotBeforeUpdateWithoutDidUpdate;
17823 + var didWarnAboutLegacyLifecyclesAndDerivedState;
17824 + var didWarnAboutUndefinedDerivedState;
17825 + var warnOnUndefinedDerivedState;
17826 + var warnOnInvalidCallback;
17827 + var didWarnAboutDirectlyAssigningPropsToState;
17828 + var didWarnAboutContextTypeAndContextTypes;
17829 + var didWarnAboutInvalidateContextType;
17830 + var didWarnAboutLegacyContext$1;
17831 +
17832 + {
17833 + didWarnAboutStateAssignmentForComponent = new Set();
17834 + didWarnAboutUninitializedState = new Set();
17835 + didWarnAboutGetSnapshotBeforeUpdateWithoutDidUpdate = new Set();
17836 + didWarnAboutLegacyLifecyclesAndDerivedState = new Set();
17837 + didWarnAboutDirectlyAssigningPropsToState = new Set();
17838 + didWarnAboutUndefinedDerivedState = new Set();
17839 + didWarnAboutContextTypeAndContextTypes = new Set();
17840 + didWarnAboutInvalidateContextType = new Set();
17841 + didWarnAboutLegacyContext$1 = new Set();
17842 + var didWarnOnInvalidCallback = new Set();
17843 +
17844 + warnOnInvalidCallback = function (callback, callerName) {
17845 + if (callback === null || typeof callback === 'function') {
17846 + return;
17847 + }
17848 +
17849 + var key = callerName + '_' + callback;
17850 +
17851 + if (!didWarnOnInvalidCallback.has(key)) {
17852 + didWarnOnInvalidCallback.add(key);
17853 +
17854 + error('%s(...): Expected the last optional `callback` argument to be a ' + 'function. Instead received: %s.', callerName, callback);
17855 + }
17856 + };
17857 +
17858 + warnOnUndefinedDerivedState = function (type, partialState) {
17859 + if (partialState === undefined) {
17860 + var componentName = getComponentNameFromType(type) || 'Component';
17861 +
17862 + if (!didWarnAboutUndefinedDerivedState.has(componentName)) {
17863 + didWarnAboutUndefinedDerivedState.add(componentName);
17864 +
17865 + error('%s.getDerivedStateFromProps(): A valid state object (or null) must be returned. ' + 'You have returned undefined.', componentName);
17866 + }
17867 + }
17868 + }; // This is so gross but it's at least non-critical and can be removed if
17869 + // it causes problems. This is meant to give a nicer error message for
17870 + // ReactDOM15.unstable_renderSubtreeIntoContainer(reactDOM16Component,
17871 + // ...)) which otherwise throws a "_processChildContext is not a function"
17872 + // exception.
17873 +
17874 +
17875 + Object.defineProperty(fakeInternalInstance, '_processChildContext', {
17876 + enumerable: false,
17877 + value: function () {
17878 + throw new Error('_processChildContext is not available in React 16+. This likely ' + 'means you have multiple copies of React and are attempting to nest ' + 'a React 15 tree inside a React 16 tree using ' + "unstable_renderSubtreeIntoContainer, which isn't supported. Try " + 'to make sure you have only one copy of React (and ideally, switch ' + 'to ReactDOM.createPortal).');
17879 + }
17880 + });
17881 + Object.freeze(fakeInternalInstance);
17882 + }
17883 +
17884 + function applyDerivedStateFromProps(workInProgress, ctor, getDerivedStateFromProps, nextProps) {
17885 + var prevState = workInProgress.memoizedState;
17886 + var partialState = getDerivedStateFromProps(nextProps, prevState);
17887 +
17888 + {
17889 + if ( workInProgress.mode & StrictLegacyMode) {
17890 + setIsStrictModeForDevtools(true);
17891 +
17892 + try {
17893 + // Invoke the function an extra time to help detect side-effects.
17894 + partialState = getDerivedStateFromProps(nextProps, prevState);
17895 + } finally {
17896 + setIsStrictModeForDevtools(false);
17897 + }
17898 + }
17899 +
17900 + warnOnUndefinedDerivedState(ctor, partialState);
17901 + } // Merge the partial state and the previous state.
17902 +
17903 +
17904 + var memoizedState = partialState === null || partialState === undefined ? prevState : assign({}, prevState, partialState);
17905 + workInProgress.memoizedState = memoizedState; // Once the update queue is empty, persist the derived state onto the
17906 + // base state.
17907 +
17908 + if (workInProgress.lanes === NoLanes) {
17909 + // Queue is always non-null for classes
17910 + var updateQueue = workInProgress.updateQueue;
17911 + updateQueue.baseState = memoizedState;
17912 + }
17913 + }
17914 +
17915 + var classComponentUpdater = {
17916 + isMounted: isMounted,
17917 + enqueueSetState: function (inst, payload, callback) {
17918 + var fiber = get(inst);
17919 + var eventTime = requestEventTime();
17920 + var lane = requestUpdateLane(fiber);
17921 + var update = createUpdate(eventTime, lane);
17922 + update.payload = payload;
17923 +
17924 + if (callback !== undefined && callback !== null) {
17925 + {
17926 + warnOnInvalidCallback(callback, 'setState');
17927 + }
17928 +
17929 + update.callback = callback;
17930 + }
17931 +
17932 + var root = enqueueUpdate(fiber, update, lane);
17933 +
17934 + if (root !== null) {
17935 + scheduleUpdateOnFiber(root, fiber, lane, eventTime);
17936 + entangleTransitions(root, fiber, lane);
17937 + }
17938 +
17939 + {
17940 + markStateUpdateScheduled(fiber, lane);
17941 + }
17942 + },
17943 + enqueueReplaceState: function (inst, payload, callback) {
17944 + var fiber = get(inst);
17945 + var eventTime = requestEventTime();
17946 + var lane = requestUpdateLane(fiber);
17947 + var update = createUpdate(eventTime, lane);
17948 + update.tag = ReplaceState;
17949 + update.payload = payload;
17950 +
17951 + if (callback !== undefined && callback !== null) {
17952 + {
17953 + warnOnInvalidCallback(callback, 'replaceState');
17954 + }
17955 +
17956 + update.callback = callback;
17957 + }
17958 +
17959 + var root = enqueueUpdate(fiber, update, lane);
17960 +
17961 + if (root !== null) {
17962 + scheduleUpdateOnFiber(root, fiber, lane, eventTime);
17963 + entangleTransitions(root, fiber, lane);
17964 + }
17965 +
17966 + {
17967 + markStateUpdateScheduled(fiber, lane);
17968 + }
17969 + },
17970 + enqueueForceUpdate: function (inst, callback) {
17971 + var fiber = get(inst);
17972 + var eventTime = requestEventTime();
17973 + var lane = requestUpdateLane(fiber);
17974 + var update = createUpdate(eventTime, lane);
17975 + update.tag = ForceUpdate;
17976 +
17977 + if (callback !== undefined && callback !== null) {
17978 + {
17979 + warnOnInvalidCallback(callback, 'forceUpdate');
17980 + }
17981 +
17982 + update.callback = callback;
17983 + }
17984 +
17985 + var root = enqueueUpdate(fiber, update, lane);
17986 +
17987 + if (root !== null) {
17988 + scheduleUpdateOnFiber(root, fiber, lane, eventTime);
17989 + entangleTransitions(root, fiber, lane);
17990 + }
17991 +
17992 + {
17993 + markForceUpdateScheduled(fiber, lane);
17994 + }
17995 + }
17996 + };
17997 +
17998 + function checkShouldComponentUpdate(workInProgress, ctor, oldProps, newProps, oldState, newState, nextContext) {
17999 + var instance = workInProgress.stateNode;
18000 +
18001 + if (typeof instance.shouldComponentUpdate === 'function') {
18002 + var shouldUpdate = instance.shouldComponentUpdate(newProps, newState, nextContext);
18003 +
18004 + {
18005 + if ( workInProgress.mode & StrictLegacyMode) {
18006 + setIsStrictModeForDevtools(true);
18007 +
18008 + try {
18009 + // Invoke the function an extra time to help detect side-effects.
18010 + shouldUpdate = instance.shouldComponentUpdate(newProps, newState, nextContext);
18011 + } finally {
18012 + setIsStrictModeForDevtools(false);
18013 + }
18014 + }
18015 +
18016 + if (shouldUpdate === undefined) {
18017 + error('%s.shouldComponentUpdate(): Returned undefined instead of a ' + 'boolean value. Make sure to return true or false.', getComponentNameFromType(ctor) || 'Component');
18018 + }
18019 + }
18020 +
18021 + return shouldUpdate;
18022 + }
18023 +
18024 + if (ctor.prototype && ctor.prototype.isPureReactComponent) {
18025 + return !shallowEqual(oldProps, newProps) || !shallowEqual(oldState, newState);
18026 + }
18027 +
18028 + return true;
18029 + }
18030 +
18031 + function checkClassInstance(workInProgress, ctor, newProps) {
18032 + var instance = workInProgress.stateNode;
18033 +
18034 + {
18035 + var name = getComponentNameFromType(ctor) || 'Component';
18036 + var renderPresent = instance.render;
18037 +
18038 + if (!renderPresent) {
18039 + if (ctor.prototype && typeof ctor.prototype.render === 'function') {
18040 + error('%s(...): No `render` method found on the returned component ' + 'instance: did you accidentally return an object from the constructor?', name);
18041 + } else {
18042 + error('%s(...): No `render` method found on the returned component ' + 'instance: you may have forgotten to define `render`.', name);
18043 + }
18044 + }
18045 +
18046 + if (instance.getInitialState && !instance.getInitialState.isReactClassApproved && !instance.state) {
18047 + error('getInitialState was defined on %s, a plain JavaScript class. ' + 'This is only supported for classes created using React.createClass. ' + 'Did you mean to define a state property instead?', name);
18048 + }
18049 +
18050 + if (instance.getDefaultProps && !instance.getDefaultProps.isReactClassApproved) {
18051 + error('getDefaultProps was defined on %s, a plain JavaScript class. ' + 'This is only supported for classes created using React.createClass. ' + 'Use a static property to define defaultProps instead.', name);
18052 + }
18053 +
18054 + if (instance.propTypes) {
18055 + error('propTypes was defined as an instance property on %s. Use a static ' + 'property to define propTypes instead.', name);
18056 + }
18057 +
18058 + if (instance.contextType) {
18059 + error('contextType was defined as an instance property on %s. Use a static ' + 'property to define contextType instead.', name);
18060 + }
18061 +
18062 + {
18063 + if (ctor.childContextTypes && !didWarnAboutLegacyContext$1.has(ctor) && // Strict Mode has its own warning for legacy context, so we can skip
18064 + // this one.
18065 + (workInProgress.mode & StrictLegacyMode) === NoMode) {
18066 + didWarnAboutLegacyContext$1.add(ctor);
18067 +
18068 + error('%s uses the legacy childContextTypes API which is no longer ' + 'supported and will be removed in the next major release. Use ' + 'React.createContext() instead\n\n.' + 'Learn more about this warning here: https://reactjs.org/link/legacy-context', name);
18069 + }
18070 +
18071 + if (ctor.contextTypes && !didWarnAboutLegacyContext$1.has(ctor) && // Strict Mode has its own warning for legacy context, so we can skip
18072 + // this one.
18073 + (workInProgress.mode & StrictLegacyMode) === NoMode) {
18074 + didWarnAboutLegacyContext$1.add(ctor);
18075 +
18076 + error('%s uses the legacy contextTypes API which is no longer supported ' + 'and will be removed in the next major release. Use ' + 'React.createContext() with static contextType instead.\n\n' + 'Learn more about this warning here: https://reactjs.org/link/legacy-context', name);
18077 + }
18078 +
18079 + if (instance.contextTypes) {
18080 + error('contextTypes was defined as an instance property on %s. Use a static ' + 'property to define contextTypes instead.', name);
18081 + }
18082 +
18083 + if (ctor.contextType && ctor.contextTypes && !didWarnAboutContextTypeAndContextTypes.has(ctor)) {
18084 + didWarnAboutContextTypeAndContextTypes.add(ctor);
18085 +
18086 + error('%s declares both contextTypes and contextType static properties. ' + 'The legacy contextTypes property will be ignored.', name);
18087 + }
18088 + }
18089 +
18090 + if (typeof instance.componentShouldUpdate === 'function') {
18091 + error('%s has a method called ' + 'componentShouldUpdate(). Did you mean shouldComponentUpdate()? ' + 'The name is phrased as a question because the function is ' + 'expected to return a value.', name);
18092 + }
18093 +
18094 + if (ctor.prototype && ctor.prototype.isPureReactComponent && typeof instance.shouldComponentUpdate !== 'undefined') {
18095 + error('%s has a method called shouldComponentUpdate(). ' + 'shouldComponentUpdate should not be used when extending React.PureComponent. ' + 'Please extend React.Component if shouldComponentUpdate is used.', getComponentNameFromType(ctor) || 'A pure component');
18096 + }
18097 +
18098 + if (typeof instance.componentDidUnmount === 'function') {
18099 + error('%s has a method called ' + 'componentDidUnmount(). But there is no such lifecycle method. ' + 'Did you mean componentWillUnmount()?', name);
18100 + }
18101 +
18102 + if (typeof instance.componentDidReceiveProps === 'function') {
18103 + error('%s has a method called ' + 'componentDidReceiveProps(). But there is no such lifecycle method. ' + 'If you meant to update the state in response to changing props, ' + 'use componentWillReceiveProps(). If you meant to fetch data or ' + 'run side-effects or mutations after React has updated the UI, use componentDidUpdate().', name);
18104 + }
18105 +
18106 + if (typeof instance.componentWillRecieveProps === 'function') {
18107 + error('%s has a method called ' + 'componentWillRecieveProps(). Did you mean componentWillReceiveProps()?', name);
18108 + }
18109 +
18110 + if (typeof instance.UNSAFE_componentWillRecieveProps === 'function') {
18111 + error('%s has a method called ' + 'UNSAFE_componentWillRecieveProps(). Did you mean UNSAFE_componentWillReceiveProps()?', name);
18112 + }
18113 +
18114 + var hasMutatedProps = instance.props !== newProps;
18115 +
18116 + if (instance.props !== undefined && hasMutatedProps) {
18117 + error('%s(...): When calling super() in `%s`, make sure to pass ' + "up the same props that your component's constructor was passed.", name, name);
18118 + }
18119 +
18120 + if (instance.defaultProps) {
18121 + error('Setting defaultProps as an instance property on %s is not supported and will be ignored.' + ' Instead, define defaultProps as a static property on %s.', name, name);
18122 + }
18123 +
18124 + if (typeof instance.getSnapshotBeforeUpdate === 'function' && typeof instance.componentDidUpdate !== 'function' && !didWarnAboutGetSnapshotBeforeUpdateWithoutDidUpdate.has(ctor)) {
18125 + didWarnAboutGetSnapshotBeforeUpdateWithoutDidUpdate.add(ctor);
18126 +
18127 + error('%s: getSnapshotBeforeUpdate() should be used with componentDidUpdate(). ' + 'This component defines getSnapshotBeforeUpdate() only.', getComponentNameFromType(ctor));
18128 + }
18129 +
18130 + if (typeof instance.getDerivedStateFromProps === 'function') {
18131 + error('%s: getDerivedStateFromProps() is defined as an instance method ' + 'and will be ignored. Instead, declare it as a static method.', name);
18132 + }
18133 +
18134 + if (typeof instance.getDerivedStateFromError === 'function') {
18135 + error('%s: getDerivedStateFromError() is defined as an instance method ' + 'and will be ignored. Instead, declare it as a static method.', name);
18136 + }
18137 +
18138 + if (typeof ctor.getSnapshotBeforeUpdate === 'function') {
18139 + error('%s: getSnapshotBeforeUpdate() is defined as a static method ' + 'and will be ignored. Instead, declare it as an instance method.', name);
18140 + }
18141 +
18142 + var _state = instance.state;
18143 +
18144 + if (_state && (typeof _state !== 'object' || isArray(_state))) {
18145 + error('%s.state: must be set to an object or null', name);
18146 + }
18147 +
18148 + if (typeof instance.getChildContext === 'function' && typeof ctor.childContextTypes !== 'object') {
18149 + error('%s.getChildContext(): childContextTypes must be defined in order to ' + 'use getChildContext().', name);
18150 + }
18151 + }
18152 + }
18153 +
18154 + function adoptClassInstance(workInProgress, instance) {
18155 + instance.updater = classComponentUpdater;
18156 + workInProgress.stateNode = instance; // The instance needs access to the fiber so that it can schedule updates
18157 +
18158 + set(instance, workInProgress);
18159 +
18160 + {
18161 + instance._reactInternalInstance = fakeInternalInstance;
18162 + }
18163 + }
18164 +
18165 + function constructClassInstance(workInProgress, ctor, props) {
18166 + var isLegacyContextConsumer = false;
18167 + var unmaskedContext = emptyContextObject;
18168 + var context = emptyContextObject;
18169 + var contextType = ctor.contextType;
18170 +
18171 + {
18172 + if ('contextType' in ctor) {
18173 + var isValid = // Allow null for conditional declaration
18174 + contextType === null || contextType !== undefined && contextType.$$typeof === REACT_CONTEXT_TYPE && contextType._context === undefined; // Not a <Context.Consumer>
18175 +
18176 + if (!isValid && !didWarnAboutInvalidateContextType.has(ctor)) {
18177 + didWarnAboutInvalidateContextType.add(ctor);
18178 + var addendum = '';
18179 +
18180 + if (contextType === undefined) {
18181 + addendum = ' However, it is set to undefined. ' + 'This can be caused by a typo or by mixing up named and default imports. ' + 'This can also happen due to a circular dependency, so ' + 'try moving the createContext() call to a separate file.';
18182 + } else if (typeof contextType !== 'object') {
18183 + addendum = ' However, it is set to a ' + typeof contextType + '.';
18184 + } else if (contextType.$$typeof === REACT_PROVIDER_TYPE) {
18185 + addendum = ' Did you accidentally pass the Context.Provider instead?';
18186 + } else if (contextType._context !== undefined) {
18187 + // <Context.Consumer>
18188 + addendum = ' Did you accidentally pass the Context.Consumer instead?';
18189 + } else {
18190 + addendum = ' However, it is set to an object with keys {' + Object.keys(contextType).join(', ') + '}.';
18191 + }
18192 +
18193 + error('%s defines an invalid contextType. ' + 'contextType should point to the Context object returned by React.createContext().%s', getComponentNameFromType(ctor) || 'Component', addendum);
18194 + }
18195 + }
18196 + }
18197 +
18198 + if (typeof contextType === 'object' && contextType !== null) {
18199 + context = readContext(contextType);
18200 + } else {
18201 + unmaskedContext = getUnmaskedContext(workInProgress, ctor, true);
18202 + var contextTypes = ctor.contextTypes;
18203 + isLegacyContextConsumer = contextTypes !== null && contextTypes !== undefined;
18204 + context = isLegacyContextConsumer ? getMaskedContext(workInProgress, unmaskedContext) : emptyContextObject;
18205 + }
18206 +
18207 + var instance = new ctor(props, context); // Instantiate twice to help detect side-effects.
18208 +
18209 + {
18210 + if ( workInProgress.mode & StrictLegacyMode) {
18211 + setIsStrictModeForDevtools(true);
18212 +
18213 + try {
18214 + instance = new ctor(props, context); // eslint-disable-line no-new
18215 + } finally {
18216 + setIsStrictModeForDevtools(false);
18217 + }
18218 + }
18219 + }
18220 +
18221 + var state = workInProgress.memoizedState = instance.state !== null && instance.state !== undefined ? instance.state : null;
18222 + adoptClassInstance(workInProgress, instance);
18223 +
18224 + {
18225 + if (typeof ctor.getDerivedStateFromProps === 'function' && state === null) {
18226 + var componentName = getComponentNameFromType(ctor) || 'Component';
18227 +
18228 + if (!didWarnAboutUninitializedState.has(componentName)) {
18229 + didWarnAboutUninitializedState.add(componentName);
18230 +
18231 + error('`%s` uses `getDerivedStateFromProps` but its initial state is ' + '%s. This is not recommended. Instead, define the initial state by ' + 'assigning an object to `this.state` in the constructor of `%s`. ' + 'This ensures that `getDerivedStateFromProps` arguments have a consistent shape.', componentName, instance.state === null ? 'null' : 'undefined', componentName);
18232 + }
18233 + } // If new component APIs are defined, "unsafe" lifecycles won't be called.
18234 + // Warn about these lifecycles if they are present.
18235 + // Don't warn about react-lifecycles-compat polyfilled methods though.
18236 +
18237 +
18238 + if (typeof ctor.getDerivedStateFromProps === 'function' || typeof instance.getSnapshotBeforeUpdate === 'function') {
18239 + var foundWillMountName = null;
18240 + var foundWillReceivePropsName = null;
18241 + var foundWillUpdateName = null;
18242 +
18243 + if (typeof instance.componentWillMount === 'function' && instance.componentWillMount.__suppressDeprecationWarning !== true) {
18244 + foundWillMountName = 'componentWillMount';
18245 + } else if (typeof instance.UNSAFE_componentWillMount === 'function') {
18246 + foundWillMountName = 'UNSAFE_componentWillMount';
18247 + }
18248 +
18249 + if (typeof instance.componentWillReceiveProps === 'function' && instance.componentWillReceiveProps.__suppressDeprecationWarning !== true) {
18250 + foundWillReceivePropsName = 'componentWillReceiveProps';
18251 + } else if (typeof instance.UNSAFE_componentWillReceiveProps === 'function') {
18252 + foundWillReceivePropsName = 'UNSAFE_componentWillReceiveProps';
18253 + }
18254 +
18255 + if (typeof instance.componentWillUpdate === 'function' && instance.componentWillUpdate.__suppressDeprecationWarning !== true) {
18256 + foundWillUpdateName = 'componentWillUpdate';
18257 + } else if (typeof instance.UNSAFE_componentWillUpdate === 'function') {
18258 + foundWillUpdateName = 'UNSAFE_componentWillUpdate';
18259 + }
18260 +
18261 + if (foundWillMountName !== null || foundWillReceivePropsName !== null || foundWillUpdateName !== null) {
18262 + var _componentName = getComponentNameFromType(ctor) || 'Component';
18263 +
18264 + var newApiName = typeof ctor.getDerivedStateFromProps === 'function' ? 'getDerivedStateFromProps()' : 'getSnapshotBeforeUpdate()';
18265 +
18266 + if (!didWarnAboutLegacyLifecyclesAndDerivedState.has(_componentName)) {
18267 + didWarnAboutLegacyLifecyclesAndDerivedState.add(_componentName);
18268 +
18269 + error('Unsafe legacy lifecycles will not be called for components using new component APIs.\n\n' + '%s uses %s but also contains the following legacy lifecycles:%s%s%s\n\n' + 'The above lifecycles should be removed. Learn more about this warning here:\n' + 'https://reactjs.org/link/unsafe-component-lifecycles', _componentName, newApiName, foundWillMountName !== null ? "\n " + foundWillMountName : '', foundWillReceivePropsName !== null ? "\n " + foundWillReceivePropsName : '', foundWillUpdateName !== null ? "\n " + foundWillUpdateName : '');
18270 + }
18271 + }
18272 + }
18273 + } // Cache unmasked context so we can avoid recreating masked context unless necessary.
18274 + // ReactFiberContext usually updates this cache but can't for newly-created instances.
18275 +
18276 +
18277 + if (isLegacyContextConsumer) {
18278 + cacheContext(workInProgress, unmaskedContext, context);
18279 + }
18280 +
18281 + return instance;
18282 + }
18283 +
18284 + function callComponentWillMount(workInProgress, instance) {
18285 + var oldState = instance.state;
18286 +
18287 + if (typeof instance.componentWillMount === 'function') {
18288 + instance.componentWillMount();
18289 + }
18290 +
18291 + if (typeof instance.UNSAFE_componentWillMount === 'function') {
18292 + instance.UNSAFE_componentWillMount();
18293 + }
18294 +
18295 + if (oldState !== instance.state) {
18296 + {
18297 + error('%s.componentWillMount(): Assigning directly to this.state is ' + "deprecated (except inside a component's " + 'constructor). Use setState instead.', getComponentNameFromFiber(workInProgress) || 'Component');
18298 + }
18299 +
18300 + classComponentUpdater.enqueueReplaceState(instance, instance.state, null);
18301 + }
18302 + }
18303 +
18304 + function callComponentWillReceiveProps(workInProgress, instance, newProps, nextContext) {
18305 + var oldState = instance.state;
18306 +
18307 + if (typeof instance.componentWillReceiveProps === 'function') {
18308 + instance.componentWillReceiveProps(newProps, nextContext);
18309 + }
18310 +
18311 + if (typeof instance.UNSAFE_componentWillReceiveProps === 'function') {
18312 + instance.UNSAFE_componentWillReceiveProps(newProps, nextContext);
18313 + }
18314 +
18315 + if (instance.state !== oldState) {
18316 + {
18317 + var componentName = getComponentNameFromFiber(workInProgress) || 'Component';
18318 +
18319 + if (!didWarnAboutStateAssignmentForComponent.has(componentName)) {
18320 + didWarnAboutStateAssignmentForComponent.add(componentName);
18321 +
18322 + error('%s.componentWillReceiveProps(): Assigning directly to ' + "this.state is deprecated (except inside a component's " + 'constructor). Use setState instead.', componentName);
18323 + }
18324 + }
18325 +
18326 + classComponentUpdater.enqueueReplaceState(instance, instance.state, null);
18327 + }
18328 + } // Invokes the mount life-cycles on a previously never rendered instance.
18329 +
18330 +
18331 + function mountClassInstance(workInProgress, ctor, newProps, renderLanes) {
18332 + {
18333 + checkClassInstance(workInProgress, ctor, newProps);
18334 + }
18335 +
18336 + var instance = workInProgress.stateNode;
18337 + instance.props = newProps;
18338 + instance.state = workInProgress.memoizedState;
18339 + instance.refs = {};
18340 + initializeUpdateQueue(workInProgress);
18341 + var contextType = ctor.contextType;
18342 +
18343 + if (typeof contextType === 'object' && contextType !== null) {
18344 + instance.context = readContext(contextType);
18345 + } else {
18346 + var unmaskedContext = getUnmaskedContext(workInProgress, ctor, true);
18347 + instance.context = getMaskedContext(workInProgress, unmaskedContext);
18348 + }
18349 +
18350 + {
18351 + if (instance.state === newProps) {
18352 + var componentName = getComponentNameFromType(ctor) || 'Component';
18353 +
18354 + if (!didWarnAboutDirectlyAssigningPropsToState.has(componentName)) {
18355 + didWarnAboutDirectlyAssigningPropsToState.add(componentName);
18356 +
18357 + error('%s: It is not recommended to assign props directly to state ' + "because updates to props won't be reflected in state. " + 'In most cases, it is better to use props directly.', componentName);
18358 + }
18359 + }
18360 +
18361 + if (workInProgress.mode & StrictLegacyMode) {
18362 + ReactStrictModeWarnings.recordLegacyContextWarning(workInProgress, instance);
18363 + }
18364 +
18365 + {
18366 + ReactStrictModeWarnings.recordUnsafeLifecycleWarnings(workInProgress, instance);
18367 + }
18368 + }
18369 +
18370 + instance.state = workInProgress.memoizedState;
18371 + var getDerivedStateFromProps = ctor.getDerivedStateFromProps;
18372 +
18373 + if (typeof getDerivedStateFromProps === 'function') {
18374 + applyDerivedStateFromProps(workInProgress, ctor, getDerivedStateFromProps, newProps);
18375 + instance.state = workInProgress.memoizedState;
18376 + } // In order to support react-lifecycles-compat polyfilled components,
18377 + // Unsafe lifecycles should not be invoked for components using the new APIs.
18378 +
18379 +
18380 + if (typeof ctor.getDerivedStateFromProps !== 'function' && typeof instance.getSnapshotBeforeUpdate !== 'function' && (typeof instance.UNSAFE_componentWillMount === 'function' || typeof instance.componentWillMount === 'function')) {
18381 + callComponentWillMount(workInProgress, instance); // If we had additional state updates during this life-cycle, let's
18382 + // process them now.
18383 +
18384 + processUpdateQueue(workInProgress, newProps, instance, renderLanes);
18385 + instance.state = workInProgress.memoizedState;
18386 + }
18387 +
18388 + if (typeof instance.componentDidMount === 'function') {
18389 + var fiberFlags = Update;
18390 +
18391 + {
18392 + fiberFlags |= LayoutStatic;
18393 + }
18394 +
18395 + if ( (workInProgress.mode & StrictEffectsMode) !== NoMode) {
18396 + fiberFlags |= MountLayoutDev;
18397 + }
18398 +
18399 + workInProgress.flags |= fiberFlags;
18400 + }
18401 + }
18402 +
18403 + function resumeMountClassInstance(workInProgress, ctor, newProps, renderLanes) {
18404 + var instance = workInProgress.stateNode;
18405 + var oldProps = workInProgress.memoizedProps;
18406 + instance.props = oldProps;
18407 + var oldContext = instance.context;
18408 + var contextType = ctor.contextType;
18409 + var nextContext = emptyContextObject;
18410 +
18411 + if (typeof contextType === 'object' && contextType !== null) {
18412 + nextContext = readContext(contextType);
18413 + } else {
18414 + var nextLegacyUnmaskedContext = getUnmaskedContext(workInProgress, ctor, true);
18415 + nextContext = getMaskedContext(workInProgress, nextLegacyUnmaskedContext);
18416 + }
18417 +
18418 + var getDerivedStateFromProps = ctor.getDerivedStateFromProps;
18419 + var hasNewLifecycles = typeof getDerivedStateFromProps === 'function' || typeof instance.getSnapshotBeforeUpdate === 'function'; // Note: During these life-cycles, instance.props/instance.state are what
18420 + // ever the previously attempted to render - not the "current". However,
18421 + // during componentDidUpdate we pass the "current" props.
18422 + // In order to support react-lifecycles-compat polyfilled components,
18423 + // Unsafe lifecycles should not be invoked for components using the new APIs.
18424 +
18425 + if (!hasNewLifecycles && (typeof instance.UNSAFE_componentWillReceiveProps === 'function' || typeof instance.componentWillReceiveProps === 'function')) {
18426 + if (oldProps !== newProps || oldContext !== nextContext) {
18427 + callComponentWillReceiveProps(workInProgress, instance, newProps, nextContext);
18428 + }
18429 + }
18430 +
18431 + resetHasForceUpdateBeforeProcessing();
18432 + var oldState = workInProgress.memoizedState;
18433 + var newState = instance.state = oldState;
18434 + processUpdateQueue(workInProgress, newProps, instance, renderLanes);
18435 + newState = workInProgress.memoizedState;
18436 +
18437 + if (oldProps === newProps && oldState === newState && !hasContextChanged() && !checkHasForceUpdateAfterProcessing()) {
18438 + // If an update was already in progress, we should schedule an Update
18439 + // effect even though we're bailing out, so that cWU/cDU are called.
18440 + if (typeof instance.componentDidMount === 'function') {
18441 + var fiberFlags = Update;
18442 +
18443 + {
18444 + fiberFlags |= LayoutStatic;
18445 + }
18446 +
18447 + if ( (workInProgress.mode & StrictEffectsMode) !== NoMode) {
18448 + fiberFlags |= MountLayoutDev;
18449 + }
18450 +
18451 + workInProgress.flags |= fiberFlags;
18452 + }
18453 +
18454 + return false;
18455 + }
18456 +
18457 + if (typeof getDerivedStateFromProps === 'function') {
18458 + applyDerivedStateFromProps(workInProgress, ctor, getDerivedStateFromProps, newProps);
18459 + newState = workInProgress.memoizedState;
18460 + }
18461 +
18462 + var shouldUpdate = checkHasForceUpdateAfterProcessing() || checkShouldComponentUpdate(workInProgress, ctor, oldProps, newProps, oldState, newState, nextContext);
18463 +
18464 + if (shouldUpdate) {
18465 + // In order to support react-lifecycles-compat polyfilled components,
18466 + // Unsafe lifecycles should not be invoked for components using the new APIs.
18467 + if (!hasNewLifecycles && (typeof instance.UNSAFE_componentWillMount === 'function' || typeof instance.componentWillMount === 'function')) {
18468 + if (typeof instance.componentWillMount === 'function') {
18469 + instance.componentWillMount();
18470 + }
18471 +
18472 + if (typeof instance.UNSAFE_componentWillMount === 'function') {
18473 + instance.UNSAFE_componentWillMount();
18474 + }
18475 + }
18476 +
18477 + if (typeof instance.componentDidMount === 'function') {
18478 + var _fiberFlags = Update;
18479 +
18480 + {
18481 + _fiberFlags |= LayoutStatic;
18482 + }
18483 +
18484 + if ( (workInProgress.mode & StrictEffectsMode) !== NoMode) {
18485 + _fiberFlags |= MountLayoutDev;
18486 + }
18487 +
18488 + workInProgress.flags |= _fiberFlags;
18489 + }
18490 + } else {
18491 + // If an update was already in progress, we should schedule an Update
18492 + // effect even though we're bailing out, so that cWU/cDU are called.
18493 + if (typeof instance.componentDidMount === 'function') {
18494 + var _fiberFlags2 = Update;
18495 +
18496 + {
18497 + _fiberFlags2 |= LayoutStatic;
18498 + }
18499 +
18500 + if ( (workInProgress.mode & StrictEffectsMode) !== NoMode) {
18501 + _fiberFlags2 |= MountLayoutDev;
18502 + }
18503 +
18504 + workInProgress.flags |= _fiberFlags2;
18505 + } // If shouldComponentUpdate returned false, we should still update the
18506 + // memoized state to indicate that this work can be reused.
18507 +
18508 +
18509 + workInProgress.memoizedProps = newProps;
18510 + workInProgress.memoizedState = newState;
18511 + } // Update the existing instance's state, props, and context pointers even
18512 + // if shouldComponentUpdate returns false.
18513 +
18514 +
18515 + instance.props = newProps;
18516 + instance.state = newState;
18517 + instance.context = nextContext;
18518 + return shouldUpdate;
18519 + } // Invokes the update life-cycles and returns false if it shouldn't rerender.
18520 +
18521 +
18522 + function updateClassInstance(current, workInProgress, ctor, newProps, renderLanes) {
18523 + var instance = workInProgress.stateNode;
18524 + cloneUpdateQueue(current, workInProgress);
18525 + var unresolvedOldProps = workInProgress.memoizedProps;
18526 + var oldProps = workInProgress.type === workInProgress.elementType ? unresolvedOldProps : resolveDefaultProps(workInProgress.type, unresolvedOldProps);
18527 + instance.props = oldProps;
18528 + var unresolvedNewProps = workInProgress.pendingProps;
18529 + var oldContext = instance.context;
18530 + var contextType = ctor.contextType;
18531 + var nextContext = emptyContextObject;
18532 +
18533 + if (typeof contextType === 'object' && contextType !== null) {
18534 + nextContext = readContext(contextType);
18535 + } else {
18536 + var nextUnmaskedContext = getUnmaskedContext(workInProgress, ctor, true);
18537 + nextContext = getMaskedContext(workInProgress, nextUnmaskedContext);
18538 + }
18539 +
18540 + var getDerivedStateFromProps = ctor.getDerivedStateFromProps;
18541 + var hasNewLifecycles = typeof getDerivedStateFromProps === 'function' || typeof instance.getSnapshotBeforeUpdate === 'function'; // Note: During these life-cycles, instance.props/instance.state are what
18542 + // ever the previously attempted to render - not the "current". However,
18543 + // during componentDidUpdate we pass the "current" props.
18544 + // In order to support react-lifecycles-compat polyfilled components,
18545 + // Unsafe lifecycles should not be invoked for components using the new APIs.
18546 +
18547 + if (!hasNewLifecycles && (typeof instance.UNSAFE_componentWillReceiveProps === 'function' || typeof instance.componentWillReceiveProps === 'function')) {
18548 + if (unresolvedOldProps !== unresolvedNewProps || oldContext !== nextContext) {
18549 + callComponentWillReceiveProps(workInProgress, instance, newProps, nextContext);
18550 + }
18551 + }
18552 +
18553 + resetHasForceUpdateBeforeProcessing();
18554 + var oldState = workInProgress.memoizedState;
18555 + var newState = instance.state = oldState;
18556 + processUpdateQueue(workInProgress, newProps, instance, renderLanes);
18557 + newState = workInProgress.memoizedState;
18558 +
18559 + if (unresolvedOldProps === unresolvedNewProps && oldState === newState && !hasContextChanged() && !checkHasForceUpdateAfterProcessing() && !(enableLazyContextPropagation )) {
18560 + // If an update was already in progress, we should schedule an Update
18561 + // effect even though we're bailing out, so that cWU/cDU are called.
18562 + if (typeof instance.componentDidUpdate === 'function') {
18563 + if (unresolvedOldProps !== current.memoizedProps || oldState !== current.memoizedState) {
18564 + workInProgress.flags |= Update;
18565 + }
18566 + }
18567 +
18568 + if (typeof instance.getSnapshotBeforeUpdate === 'function') {
18569 + if (unresolvedOldProps !== current.memoizedProps || oldState !== current.memoizedState) {
18570 + workInProgress.flags |= Snapshot;
18571 + }
18572 + }
18573 +
18574 + return false;
18575 + }
18576 +
18577 + if (typeof getDerivedStateFromProps === 'function') {
18578 + applyDerivedStateFromProps(workInProgress, ctor, getDerivedStateFromProps, newProps);
18579 + newState = workInProgress.memoizedState;
18580 + }
18581 +
18582 + var shouldUpdate = checkHasForceUpdateAfterProcessing() || checkShouldComponentUpdate(workInProgress, ctor, oldProps, newProps, oldState, newState, nextContext) || // TODO: In some cases, we'll end up checking if context has changed twice,
18583 + // both before and after `shouldComponentUpdate` has been called. Not ideal,
18584 + // but I'm loath to refactor this function. This only happens for memoized
18585 + // components so it's not that common.
18586 + enableLazyContextPropagation ;
18587 +
18588 + if (shouldUpdate) {
18589 + // In order to support react-lifecycles-compat polyfilled components,
18590 + // Unsafe lifecycles should not be invoked for components using the new APIs.
18591 + if (!hasNewLifecycles && (typeof instance.UNSAFE_componentWillUpdate === 'function' || typeof instance.componentWillUpdate === 'function')) {
18592 + if (typeof instance.componentWillUpdate === 'function') {
18593 + instance.componentWillUpdate(newProps, newState, nextContext);
18594 + }
18595 +
18596 + if (typeof instance.UNSAFE_componentWillUpdate === 'function') {
18597 + instance.UNSAFE_componentWillUpdate(newProps, newState, nextContext);
18598 + }
18599 + }
18600 +
18601 + if (typeof instance.componentDidUpdate === 'function') {
18602 + workInProgress.flags |= Update;
18603 + }
18604 +
18605 + if (typeof instance.getSnapshotBeforeUpdate === 'function') {
18606 + workInProgress.flags |= Snapshot;
18607 + }
18608 + } else {
18609 + // If an update was already in progress, we should schedule an Update
18610 + // effect even though we're bailing out, so that cWU/cDU are called.
18611 + if (typeof instance.componentDidUpdate === 'function') {
18612 + if (unresolvedOldProps !== current.memoizedProps || oldState !== current.memoizedState) {
18613 + workInProgress.flags |= Update;
18614 + }
18615 + }
18616 +
18617 + if (typeof instance.getSnapshotBeforeUpdate === 'function') {
18618 + if (unresolvedOldProps !== current.memoizedProps || oldState !== current.memoizedState) {
18619 + workInProgress.flags |= Snapshot;
18620 + }
18621 + } // If shouldComponentUpdate returned false, we should still update the
18622 + // memoized props/state to indicate that this work can be reused.
18623 +
18624 +
18625 + workInProgress.memoizedProps = newProps;
18626 + workInProgress.memoizedState = newState;
18627 + } // Update the existing instance's state, props, and context pointers even
18628 + // if shouldComponentUpdate returns false.
18629 +
18630 +
18631 + instance.props = newProps;
18632 + instance.state = newState;
18633 + instance.context = nextContext;
18634 + return shouldUpdate;
18635 + }
18636 +
18637 + function createCapturedValueAtFiber(value, source) {
18638 + // If the value is an error, call this function immediately after it is thrown
18639 + // so the stack is accurate.
18640 + return {
18641 + value: value,
18642 + source: source,
18643 + stack: getStackByFiberInDevAndProd(source),
18644 + digest: null
18645 + };
18646 + }
18647 + function createCapturedValue(value, digest, stack) {
18648 + return {
18649 + value: value,
18650 + source: null,
18651 + stack: stack != null ? stack : null,
18652 + digest: digest != null ? digest : null
18653 + };
18654 + }
18655 +
18656 + // This module is forked in different environments.
18657 + // By default, return `true` to log errors to the console.
18658 + // Forks can return `false` if this isn't desirable.
18659 + function showErrorDialog(boundary, errorInfo) {
18660 + return true;
18661 + }
18662 +
18663 + function logCapturedError(boundary, errorInfo) {
18664 + try {
18665 + var logError = showErrorDialog(boundary, errorInfo); // Allow injected showErrorDialog() to prevent default console.error logging.
18666 + // This enables renderers like ReactNative to better manage redbox behavior.
18667 +
18668 + if (logError === false) {
18669 + return;
18670 + }
18671 +
18672 + var error = errorInfo.value;
18673 +
18674 + if (true) {
18675 + var source = errorInfo.source;
18676 + var stack = errorInfo.stack;
18677 + var componentStack = stack !== null ? stack : ''; // Browsers support silencing uncaught errors by calling
18678 + // `preventDefault()` in window `error` handler.
18679 + // We record this information as an expando on the error.
18680 +
18681 + if (error != null && error._suppressLogging) {
18682 + if (boundary.tag === ClassComponent) {
18683 + // The error is recoverable and was silenced.
18684 + // Ignore it and don't print the stack addendum.
18685 + // This is handy for testing error boundaries without noise.
18686 + return;
18687 + } // The error is fatal. Since the silencing might have
18688 + // been accidental, we'll surface it anyway.
18689 + // However, the browser would have silenced the original error
18690 + // so we'll print it first, and then print the stack addendum.
18691 +
18692 +
18693 + console['error'](error); // Don't transform to our wrapper
18694 + // For a more detailed description of this block, see:
18695 + // https://github.com/facebook/react/pull/13384
18696 + }
18697 +
18698 + var componentName = source ? getComponentNameFromFiber(source) : null;
18699 + var componentNameMessage = componentName ? "The above error occurred in the <" + componentName + "> component:" : 'The above error occurred in one of your React components:';
18700 + var errorBoundaryMessage;
18701 +
18702 + if (boundary.tag === HostRoot) {
18703 + errorBoundaryMessage = 'Consider adding an error boundary to your tree to customize error handling behavior.\n' + 'Visit https://reactjs.org/link/error-boundaries to learn more about error boundaries.';
18704 + } else {
18705 + var errorBoundaryName = getComponentNameFromFiber(boundary) || 'Anonymous';
18706 + errorBoundaryMessage = "React will try to recreate this component tree from scratch " + ("using the error boundary you provided, " + errorBoundaryName + ".");
18707 + }
18708 +
18709 + var combinedMessage = componentNameMessage + "\n" + componentStack + "\n\n" + ("" + errorBoundaryMessage); // In development, we provide our own message with just the component stack.
18710 + // We don't include the original error message and JS stack because the browser
18711 + // has already printed it. Even if the application swallows the error, it is still
18712 + // displayed by the browser thanks to the DEV-only fake event trick in ReactErrorUtils.
18713 +
18714 + console['error'](combinedMessage); // Don't transform to our wrapper
18715 + } else {
18716 + // In production, we print the error directly.
18717 + // This will include the message, the JS stack, and anything the browser wants to show.
18718 + // We pass the error object instead of custom message so that the browser displays the error natively.
18719 + console['error'](error); // Don't transform to our wrapper
18720 + }
18721 + } catch (e) {
18722 + // This method must not throw, or React internal state will get messed up.
18723 + // If console.error is overridden, or logCapturedError() shows a dialog that throws,
18724 + // we want to report this error outside of the normal stack as a last resort.
18725 + // https://github.com/facebook/react/issues/13188
18726 + setTimeout(function () {
18727 + throw e;
18728 + });
18729 + }
18730 + }
18731 +
18732 + var PossiblyWeakMap$1 = typeof WeakMap === 'function' ? WeakMap : Map;
18733 +
18734 + function createRootErrorUpdate(fiber, errorInfo, lane) {
18735 + var update = createUpdate(NoTimestamp, lane); // Unmount the root by rendering null.
18736 +
18737 + update.tag = CaptureUpdate; // Caution: React DevTools currently depends on this property
18738 + // being called "element".
18739 +
18740 + update.payload = {
18741 + element: null
18742 + };
18743 + var error = errorInfo.value;
18744 +
18745 + update.callback = function () {
18746 + onUncaughtError(error);
18747 + logCapturedError(fiber, errorInfo);
18748 + };
18749 +
18750 + return update;
18751 + }
18752 +
18753 + function createClassErrorUpdate(fiber, errorInfo, lane) {
18754 + var update = createUpdate(NoTimestamp, lane);
18755 + update.tag = CaptureUpdate;
18756 + var getDerivedStateFromError = fiber.type.getDerivedStateFromError;
18757 +
18758 + if (typeof getDerivedStateFromError === 'function') {
18759 + var error$1 = errorInfo.value;
18760 +
18761 + update.payload = function () {
18762 + return getDerivedStateFromError(error$1);
18763 + };
18764 +
18765 + update.callback = function () {
18766 + {
18767 + markFailedErrorBoundaryForHotReloading(fiber);
18768 + }
18769 +
18770 + logCapturedError(fiber, errorInfo);
18771 + };
18772 + }
18773 +
18774 + var inst = fiber.stateNode;
18775 +
18776 + if (inst !== null && typeof inst.componentDidCatch === 'function') {
18777 + update.callback = function callback() {
18778 + {
18779 + markFailedErrorBoundaryForHotReloading(fiber);
18780 + }
18781 +
18782 + logCapturedError(fiber, errorInfo);
18783 +
18784 + if (typeof getDerivedStateFromError !== 'function') {
18785 + // To preserve the preexisting retry behavior of error boundaries,
18786 + // we keep track of which ones already failed during this batch.
18787 + // This gets reset before we yield back to the browser.
18788 + // TODO: Warn in strict mode if getDerivedStateFromError is
18789 + // not defined.
18790 + markLegacyErrorBoundaryAsFailed(this);
18791 + }
18792 +
18793 + var error$1 = errorInfo.value;
18794 + var stack = errorInfo.stack;
18795 + this.componentDidCatch(error$1, {
18796 + componentStack: stack !== null ? stack : ''
18797 + });
18798 +
18799 + {
18800 + if (typeof getDerivedStateFromError !== 'function') {
18801 + // If componentDidCatch is the only error boundary method defined,
18802 + // then it needs to call setState to recover from errors.
18803 + // If no state update is scheduled then the boundary will swallow the error.
18804 + if (!includesSomeLane(fiber.lanes, SyncLane)) {
18805 + error('%s: Error boundaries should implement getDerivedStateFromError(). ' + 'In that method, return a state update to display an error message or fallback UI.', getComponentNameFromFiber(fiber) || 'Unknown');
18806 + }
18807 + }
18808 + }
18809 + };
18810 + }
18811 +
18812 + return update;
18813 + }
18814 +
18815 + function attachPingListener(root, wakeable, lanes) {
18816 + // Attach a ping listener
18817 + //
18818 + // The data might resolve before we have a chance to commit the fallback. Or,
18819 + // in the case of a refresh, we'll never commit a fallback. So we need to
18820 + // attach a listener now. When it resolves ("pings"), we can decide whether to
18821 + // try rendering the tree again.
18822 + //
18823 + // Only attach a listener if one does not already exist for the lanes
18824 + // we're currently rendering (which acts like a "thread ID" here).
18825 + //
18826 + // We only need to do this in concurrent mode. Legacy Suspense always
18827 + // commits fallbacks synchronously, so there are no pings.
18828 + var pingCache = root.pingCache;
18829 + var threadIDs;
18830 +
18831 + if (pingCache === null) {
18832 + pingCache = root.pingCache = new PossiblyWeakMap$1();
18833 + threadIDs = new Set();
18834 + pingCache.set(wakeable, threadIDs);
18835 + } else {
18836 + threadIDs = pingCache.get(wakeable);
18837 +
18838 + if (threadIDs === undefined) {
18839 + threadIDs = new Set();
18840 + pingCache.set(wakeable, threadIDs);
18841 + }
18842 + }
18843 +
18844 + if (!threadIDs.has(lanes)) {
18845 + // Memoize using the thread ID to prevent redundant listeners.
18846 + threadIDs.add(lanes);
18847 + var ping = pingSuspendedRoot.bind(null, root, wakeable, lanes);
18848 +
18849 + {
18850 + if (isDevToolsPresent) {
18851 + // If we have pending work still, restore the original updaters
18852 + restorePendingUpdaters(root, lanes);
18853 + }
18854 + }
18855 +
18856 + wakeable.then(ping, ping);
18857 + }
18858 + }
18859 +
18860 + function attachRetryListener(suspenseBoundary, root, wakeable, lanes) {
18861 + // Retry listener
18862 + //
18863 + // If the fallback does commit, we need to attach a different type of
18864 + // listener. This one schedules an update on the Suspense boundary to turn
18865 + // the fallback state off.
18866 + //
18867 + // Stash the wakeable on the boundary fiber so we can access it in the
18868 + // commit phase.
18869 + //
18870 + // When the wakeable resolves, we'll attempt to render the boundary
18871 + // again ("retry").
18872 + var wakeables = suspenseBoundary.updateQueue;
18873 +
18874 + if (wakeables === null) {
18875 + var updateQueue = new Set();
18876 + updateQueue.add(wakeable);
18877 + suspenseBoundary.updateQueue = updateQueue;
18878 + } else {
18879 + wakeables.add(wakeable);
18880 + }
18881 + }
18882 +
18883 + function resetSuspendedComponent(sourceFiber, rootRenderLanes) {
18884 + // A legacy mode Suspense quirk, only relevant to hook components.
18885 +
18886 +
18887 + var tag = sourceFiber.tag;
18888 +
18889 + if ((sourceFiber.mode & ConcurrentMode) === NoMode && (tag === FunctionComponent || tag === ForwardRef || tag === SimpleMemoComponent)) {
18890 + var currentSource = sourceFiber.alternate;
18891 +
18892 + if (currentSource) {
18893 + sourceFiber.updateQueue = currentSource.updateQueue;
18894 + sourceFiber.memoizedState = currentSource.memoizedState;
18895 + sourceFiber.lanes = currentSource.lanes;
18896 + } else {
18897 + sourceFiber.updateQueue = null;
18898 + sourceFiber.memoizedState = null;
18899 + }
18900 + }
18901 + }
18902 +
18903 + function getNearestSuspenseBoundaryToCapture(returnFiber) {
18904 + var node = returnFiber;
18905 +
18906 + do {
18907 + if (node.tag === SuspenseComponent && shouldCaptureSuspense(node)) {
18908 + return node;
18909 + } // This boundary already captured during this render. Continue to the next
18910 + // boundary.
18911 +
18912 +
18913 + node = node.return;
18914 + } while (node !== null);
18915 +
18916 + return null;
18917 + }
18918 +
18919 + function markSuspenseBoundaryShouldCapture(suspenseBoundary, returnFiber, sourceFiber, root, rootRenderLanes) {
18920 + // This marks a Suspense boundary so that when we're unwinding the stack,
18921 + // it captures the suspended "exception" and does a second (fallback) pass.
18922 + if ((suspenseBoundary.mode & ConcurrentMode) === NoMode) {
18923 + // Legacy Mode Suspense
18924 + //
18925 + // If the boundary is in legacy mode, we should *not*
18926 + // suspend the commit. Pretend as if the suspended component rendered
18927 + // null and keep rendering. When the Suspense boundary completes,
18928 + // we'll do a second pass to render the fallback.
18929 + if (suspenseBoundary === returnFiber) {
18930 + // Special case where we suspended while reconciling the children of
18931 + // a Suspense boundary's inner Offscreen wrapper fiber. This happens
18932 + // when a React.lazy component is a direct child of a
18933 + // Suspense boundary.
18934 + //
18935 + // Suspense boundaries are implemented as multiple fibers, but they
18936 + // are a single conceptual unit. The legacy mode behavior where we
18937 + // pretend the suspended fiber committed as `null` won't work,
18938 + // because in this case the "suspended" fiber is the inner
18939 + // Offscreen wrapper.
18940 + //
18941 + // Because the contents of the boundary haven't started rendering
18942 + // yet (i.e. nothing in the tree has partially rendered) we can
18943 + // switch to the regular, concurrent mode behavior: mark the
18944 + // boundary with ShouldCapture and enter the unwind phase.
18945 + suspenseBoundary.flags |= ShouldCapture;
18946 + } else {
18947 + suspenseBoundary.flags |= DidCapture;
18948 + sourceFiber.flags |= ForceUpdateForLegacySuspense; // We're going to commit this fiber even though it didn't complete.
18949 + // But we shouldn't call any lifecycle methods or callbacks. Remove
18950 + // all lifecycle effect tags.
18951 +
18952 + sourceFiber.flags &= ~(LifecycleEffectMask | Incomplete);
18953 +
18954 + if (sourceFiber.tag === ClassComponent) {
18955 + var currentSourceFiber = sourceFiber.alternate;
18956 +
18957 + if (currentSourceFiber === null) {
18958 + // This is a new mount. Change the tag so it's not mistaken for a
18959 + // completed class component. For example, we should not call
18960 + // componentWillUnmount if it is deleted.
18961 + sourceFiber.tag = IncompleteClassComponent;
18962 + } else {
18963 + // When we try rendering again, we should not reuse the current fiber,
18964 + // since it's known to be in an inconsistent state. Use a force update to
18965 + // prevent a bail out.
18966 + var update = createUpdate(NoTimestamp, SyncLane);
18967 + update.tag = ForceUpdate;
18968 + enqueueUpdate(sourceFiber, update, SyncLane);
18969 + }
18970 + } // The source fiber did not complete. Mark it with Sync priority to
18971 + // indicate that it still has pending work.
18972 +
18973 +
18974 + sourceFiber.lanes = mergeLanes(sourceFiber.lanes, SyncLane);
18975 + }
18976 +
18977 + return suspenseBoundary;
18978 + } // Confirmed that the boundary is in a concurrent mode tree. Continue
18979 + // with the normal suspend path.
18980 + //
18981 + // After this we'll use a set of heuristics to determine whether this
18982 + // render pass will run to completion or restart or "suspend" the commit.
18983 + // The actual logic for this is spread out in different places.
18984 + //
18985 + // This first principle is that if we're going to suspend when we complete
18986 + // a root, then we should also restart if we get an update or ping that
18987 + // might unsuspend it, and vice versa. The only reason to suspend is
18988 + // because you think you might want to restart before committing. However,
18989 + // it doesn't make sense to restart only while in the period we're suspended.
18990 + //
18991 + // Restarting too aggressively is also not good because it starves out any
18992 + // intermediate loading state. So we use heuristics to determine when.
18993 + // Suspense Heuristics
18994 + //
18995 + // If nothing threw a Promise or all the same fallbacks are already showing,
18996 + // then don't suspend/restart.
18997 + //
18998 + // If this is an initial render of a new tree of Suspense boundaries and
18999 + // those trigger a fallback, then don't suspend/restart. We want to ensure
19000 + // that we can show the initial loading state as quickly as possible.
19001 + //
19002 + // If we hit a "Delayed" case, such as when we'd switch from content back into
19003 + // a fallback, then we should always suspend/restart. Transitions apply
19004 + // to this case. If none is defined, JND is used instead.
19005 + //
19006 + // If we're already showing a fallback and it gets "retried", allowing us to show
19007 + // another level, but there's still an inner boundary that would show a fallback,
19008 + // then we suspend/restart for 500ms since the last time we showed a fallback
19009 + // anywhere in the tree. This effectively throttles progressive loading into a
19010 + // consistent train of commits. This also gives us an opportunity to restart to
19011 + // get to the completed state slightly earlier.
19012 + //
19013 + // If there's ambiguity due to batching it's resolved in preference of:
19014 + // 1) "delayed", 2) "initial render", 3) "retry".
19015 + //
19016 + // We want to ensure that a "busy" state doesn't get force committed. We want to
19017 + // ensure that new initial loading states can commit as soon as possible.
19018 +
19019 +
19020 + suspenseBoundary.flags |= ShouldCapture; // TODO: I think we can remove this, since we now use `DidCapture` in
19021 + // the begin phase to prevent an early bailout.
19022 +
19023 + suspenseBoundary.lanes = rootRenderLanes;
19024 + return suspenseBoundary;
19025 + }
19026 +
19027 + function throwException(root, returnFiber, sourceFiber, value, rootRenderLanes) {
19028 + // The source fiber did not complete.
19029 + sourceFiber.flags |= Incomplete;
19030 +
19031 + {
19032 + if (isDevToolsPresent) {
19033 + // If we have pending work still, restore the original updaters
19034 + restorePendingUpdaters(root, rootRenderLanes);
19035 + }
19036 + }
19037 +
19038 + if (value !== null && typeof value === 'object' && typeof value.then === 'function') {
19039 + // This is a wakeable. The component suspended.
19040 + var wakeable = value;
19041 + resetSuspendedComponent(sourceFiber);
19042 +
19043 + {
19044 + if (getIsHydrating() && sourceFiber.mode & ConcurrentMode) {
19045 + markDidThrowWhileHydratingDEV();
19046 + }
19047 + }
19048 +
19049 +
19050 + var suspenseBoundary = getNearestSuspenseBoundaryToCapture(returnFiber);
19051 +
19052 + if (suspenseBoundary !== null) {
19053 + suspenseBoundary.flags &= ~ForceClientRender;
19054 + markSuspenseBoundaryShouldCapture(suspenseBoundary, returnFiber, sourceFiber, root, rootRenderLanes); // We only attach ping listeners in concurrent mode. Legacy Suspense always
19055 + // commits fallbacks synchronously, so there are no pings.
19056 +
19057 + if (suspenseBoundary.mode & ConcurrentMode) {
19058 + attachPingListener(root, wakeable, rootRenderLanes);
19059 + }
19060 +
19061 + attachRetryListener(suspenseBoundary, root, wakeable);
19062 + return;
19063 + } else {
19064 + // No boundary was found. Unless this is a sync update, this is OK.
19065 + // We can suspend and wait for more data to arrive.
19066 + if (!includesSyncLane(rootRenderLanes)) {
19067 + // This is not a sync update. Suspend. Since we're not activating a
19068 + // Suspense boundary, this will unwind all the way to the root without
19069 + // performing a second pass to render a fallback. (This is arguably how
19070 + // refresh transitions should work, too, since we're not going to commit
19071 + // the fallbacks anyway.)
19072 + //
19073 + // This case also applies to initial hydration.
19074 + attachPingListener(root, wakeable, rootRenderLanes);
19075 + renderDidSuspendDelayIfPossible();
19076 + return;
19077 + } // This is a sync/discrete update. We treat this case like an error
19078 + // because discrete renders are expected to produce a complete tree
19079 + // synchronously to maintain consistency with external state.
19080 +
19081 +
19082 + var uncaughtSuspenseError = new Error('A component suspended while responding to synchronous input. This ' + 'will cause the UI to be replaced with a loading indicator. To ' + 'fix, updates that suspend should be wrapped ' + 'with startTransition.'); // If we're outside a transition, fall through to the regular error path.
19083 + // The error will be caught by the nearest suspense boundary.
19084 +
19085 + value = uncaughtSuspenseError;
19086 + }
19087 + } else {
19088 + // This is a regular error, not a Suspense wakeable.
19089 + if (getIsHydrating() && sourceFiber.mode & ConcurrentMode) {
19090 + markDidThrowWhileHydratingDEV();
19091 +
19092 + var _suspenseBoundary = getNearestSuspenseBoundaryToCapture(returnFiber); // If the error was thrown during hydration, we may be able to recover by
19093 + // discarding the dehydrated content and switching to a client render.
19094 + // Instead of surfacing the error, find the nearest Suspense boundary
19095 + // and render it again without hydration.
19096 +
19097 +
19098 + if (_suspenseBoundary !== null) {
19099 + if ((_suspenseBoundary.flags & ShouldCapture) === NoFlags) {
19100 + // Set a flag to indicate that we should try rendering the normal
19101 + // children again, not the fallback.
19102 + _suspenseBoundary.flags |= ForceClientRender;
19103 + }
19104 +
19105 + markSuspenseBoundaryShouldCapture(_suspenseBoundary, returnFiber, sourceFiber, root, rootRenderLanes); // Even though the user may not be affected by this error, we should
19106 + // still log it so it can be fixed.
19107 +
19108 + queueHydrationError(createCapturedValueAtFiber(value, sourceFiber));
19109 + return;
19110 + }
19111 + }
19112 + }
19113 +
19114 + value = createCapturedValueAtFiber(value, sourceFiber);
19115 + renderDidError(value); // We didn't find a boundary that could handle this type of exception. Start
19116 + // over and traverse parent path again, this time treating the exception
19117 + // as an error.
19118 +
19119 + var workInProgress = returnFiber;
19120 +
19121 + do {
19122 + switch (workInProgress.tag) {
19123 + case HostRoot:
19124 + {
19125 + var _errorInfo = value;
19126 + workInProgress.flags |= ShouldCapture;
19127 + var lane = pickArbitraryLane(rootRenderLanes);
19128 + workInProgress.lanes = mergeLanes(workInProgress.lanes, lane);
19129 + var update = createRootErrorUpdate(workInProgress, _errorInfo, lane);
19130 + enqueueCapturedUpdate(workInProgress, update);
19131 + return;
19132 + }
19133 +
19134 + case ClassComponent:
19135 + // Capture and retry
19136 + var errorInfo = value;
19137 + var ctor = workInProgress.type;
19138 + var instance = workInProgress.stateNode;
19139 +
19140 + if ((workInProgress.flags & DidCapture) === NoFlags && (typeof ctor.getDerivedStateFromError === 'function' || instance !== null && typeof instance.componentDidCatch === 'function' && !isAlreadyFailedLegacyErrorBoundary(instance))) {
19141 + workInProgress.flags |= ShouldCapture;
19142 +
19143 + var _lane = pickArbitraryLane(rootRenderLanes);
19144 +
19145 + workInProgress.lanes = mergeLanes(workInProgress.lanes, _lane); // Schedule the error boundary to re-render using updated state
19146 +
19147 + var _update = createClassErrorUpdate(workInProgress, errorInfo, _lane);
19148 +
19149 + enqueueCapturedUpdate(workInProgress, _update);
19150 + return;
19151 + }
19152 +
19153 + break;
19154 + }
19155 +
19156 + workInProgress = workInProgress.return;
19157 + } while (workInProgress !== null);
19158 + }
19159 +
19160 + function getSuspendedCache() {
19161 + {
19162 + return null;
19163 + } // This function is called when a Suspense boundary suspends. It returns the
19164 + }
19165 +
19166 + var ReactCurrentOwner$1 = ReactSharedInternals.ReactCurrentOwner;
19167 + var didReceiveUpdate = false;
19168 + var didWarnAboutBadClass;
19169 + var didWarnAboutModulePatternComponent;
19170 + var didWarnAboutContextTypeOnFunctionComponent;
19171 + var didWarnAboutGetDerivedStateOnFunctionComponent;
19172 + var didWarnAboutFunctionRefs;
19173 + var didWarnAboutReassigningProps;
19174 + var didWarnAboutRevealOrder;
19175 + var didWarnAboutTailOptions;
19176 + var didWarnAboutDefaultPropsOnFunctionComponent;
19177 +
19178 + {
19179 + didWarnAboutBadClass = {};
19180 + didWarnAboutModulePatternComponent = {};
19181 + didWarnAboutContextTypeOnFunctionComponent = {};
19182 + didWarnAboutGetDerivedStateOnFunctionComponent = {};
19183 + didWarnAboutFunctionRefs = {};
19184 + didWarnAboutReassigningProps = false;
19185 + didWarnAboutRevealOrder = {};
19186 + didWarnAboutTailOptions = {};
19187 + didWarnAboutDefaultPropsOnFunctionComponent = {};
19188 + }
19189 +
19190 + function reconcileChildren(current, workInProgress, nextChildren, renderLanes) {
19191 + if (current === null) {
19192 + // If this is a fresh new component that hasn't been rendered yet, we
19193 + // won't update its child set by applying minimal side-effects. Instead,
19194 + // we will add them all to the child before it gets rendered. That means
19195 + // we can optimize this reconciliation pass by not tracking side-effects.
19196 + workInProgress.child = mountChildFibers(workInProgress, null, nextChildren, renderLanes);
19197 + } else {
19198 + // If the current child is the same as the work in progress, it means that
19199 + // we haven't yet started any work on these children. Therefore, we use
19200 + // the clone algorithm to create a copy of all the current children.
19201 + // If we had any progressed work already, that is invalid at this point so
19202 + // let's throw it out.
19203 + workInProgress.child = reconcileChildFibers(workInProgress, current.child, nextChildren, renderLanes);
19204 + }
19205 + }
19206 +
19207 + function forceUnmountCurrentAndReconcile(current, workInProgress, nextChildren, renderLanes) {
19208 + // This function is fork of reconcileChildren. It's used in cases where we
19209 + // want to reconcile without matching against the existing set. This has the
19210 + // effect of all current children being unmounted; even if the type and key
19211 + // are the same, the old child is unmounted and a new child is created.
19212 + //
19213 + // To do this, we're going to go through the reconcile algorithm twice. In
19214 + // the first pass, we schedule a deletion for all the current children by
19215 + // passing null.
19216 + workInProgress.child = reconcileChildFibers(workInProgress, current.child, null, renderLanes); // In the second pass, we mount the new children. The trick here is that we
19217 + // pass null in place of where we usually pass the current child set. This has
19218 + // the effect of remounting all children regardless of whether their
19219 + // identities match.
19220 +
19221 + workInProgress.child = reconcileChildFibers(workInProgress, null, nextChildren, renderLanes);
19222 + }
19223 +
19224 + function updateForwardRef(current, workInProgress, Component, nextProps, renderLanes) {
19225 + // TODO: current can be non-null here even if the component
19226 + // hasn't yet mounted. This happens after the first render suspends.
19227 + // We'll need to figure out if this is fine or can cause issues.
19228 + {
19229 + if (workInProgress.type !== workInProgress.elementType) {
19230 + // Lazy component props can't be validated in createElement
19231 + // because they're only guaranteed to be resolved here.
19232 + var innerPropTypes = Component.propTypes;
19233 +
19234 + if (innerPropTypes) {
19235 + checkPropTypes(innerPropTypes, nextProps, // Resolved props
19236 + 'prop', getComponentNameFromType(Component));
19237 + }
19238 + }
19239 + }
19240 +
19241 + var render = Component.render;
19242 + var ref = workInProgress.ref; // The rest is a fork of updateFunctionComponent
19243 +
19244 + var nextChildren;
19245 + var hasId;
19246 + prepareToReadContext(workInProgress, renderLanes);
19247 +
19248 + {
19249 + markComponentRenderStarted(workInProgress);
19250 + }
19251 +
19252 + {
19253 + ReactCurrentOwner$1.current = workInProgress;
19254 + setIsRendering(true);
19255 + nextChildren = renderWithHooks(current, workInProgress, render, nextProps, ref, renderLanes);
19256 + hasId = checkDidRenderIdHook();
19257 +
19258 + if ( workInProgress.mode & StrictLegacyMode) {
19259 + setIsStrictModeForDevtools(true);
19260 +
19261 + try {
19262 + nextChildren = renderWithHooks(current, workInProgress, render, nextProps, ref, renderLanes);
19263 + hasId = checkDidRenderIdHook();
19264 + } finally {
19265 + setIsStrictModeForDevtools(false);
19266 + }
19267 + }
19268 +
19269 + setIsRendering(false);
19270 + }
19271 +
19272 + {
19273 + markComponentRenderStopped();
19274 + }
19275 +
19276 + if (current !== null && !didReceiveUpdate) {
19277 + bailoutHooks(current, workInProgress, renderLanes);
19278 + return bailoutOnAlreadyFinishedWork(current, workInProgress, renderLanes);
19279 + }
19280 +
19281 + if (getIsHydrating() && hasId) {
19282 + pushMaterializedTreeId(workInProgress);
19283 + } // React DevTools reads this flag.
19284 +
19285 +
19286 + workInProgress.flags |= PerformedWork;
19287 + reconcileChildren(current, workInProgress, nextChildren, renderLanes);
19288 + return workInProgress.child;
19289 + }
19290 +
19291 + function updateMemoComponent(current, workInProgress, Component, nextProps, renderLanes) {
19292 + if (current === null) {
19293 + var type = Component.type;
19294 +
19295 + if (isSimpleFunctionComponent(type) && Component.compare === null && // SimpleMemoComponent codepath doesn't resolve outer props either.
19296 + Component.defaultProps === undefined) {
19297 + var resolvedType = type;
19298 +
19299 + {
19300 + resolvedType = resolveFunctionForHotReloading(type);
19301 + } // If this is a plain function component without default props,
19302 + // and with only the default shallow comparison, we upgrade it
19303 + // to a SimpleMemoComponent to allow fast path updates.
19304 +
19305 +
19306 + workInProgress.tag = SimpleMemoComponent;
19307 + workInProgress.type = resolvedType;
19308 +
19309 + {
19310 + validateFunctionComponentInDev(workInProgress, type);
19311 + }
19312 +
19313 + return updateSimpleMemoComponent(current, workInProgress, resolvedType, nextProps, renderLanes);
19314 + }
19315 +
19316 + {
19317 + var innerPropTypes = type.propTypes;
19318 +
19319 + if (innerPropTypes) {
19320 + // Inner memo component props aren't currently validated in createElement.
19321 + // We could move it there, but we'd still need this for lazy code path.
19322 + checkPropTypes(innerPropTypes, nextProps, // Resolved props
19323 + 'prop', getComponentNameFromType(type));
19324 + }
19325 +
19326 + if ( Component.defaultProps !== undefined) {
19327 + var componentName = getComponentNameFromType(type) || 'Unknown';
19328 +
19329 + if (!didWarnAboutDefaultPropsOnFunctionComponent[componentName]) {
19330 + error('%s: Support for defaultProps will be removed from memo components ' + 'in a future major release. Use JavaScript default parameters instead.', componentName);
19331 +
19332 + didWarnAboutDefaultPropsOnFunctionComponent[componentName] = true;
19333 + }
19334 + }
19335 + }
19336 +
19337 + var child = createFiberFromTypeAndProps(Component.type, null, nextProps, workInProgress, workInProgress.mode, renderLanes);
19338 + child.ref = workInProgress.ref;
19339 + child.return = workInProgress;
19340 + workInProgress.child = child;
19341 + return child;
19342 + }
19343 +
19344 + {
19345 + var _type = Component.type;
19346 + var _innerPropTypes = _type.propTypes;
19347 +
19348 + if (_innerPropTypes) {
19349 + // Inner memo component props aren't currently validated in createElement.
19350 + // We could move it there, but we'd still need this for lazy code path.
19351 + checkPropTypes(_innerPropTypes, nextProps, // Resolved props
19352 + 'prop', getComponentNameFromType(_type));
19353 + }
19354 + }
19355 +
19356 + var currentChild = current.child; // This is always exactly one child
19357 +
19358 + var hasScheduledUpdateOrContext = checkScheduledUpdateOrContext(current, renderLanes);
19359 +
19360 + if (!hasScheduledUpdateOrContext) {
19361 + // This will be the props with resolved defaultProps,
19362 + // unlike current.memoizedProps which will be the unresolved ones.
19363 + var prevProps = currentChild.memoizedProps; // Default to shallow comparison
19364 +
19365 + var compare = Component.compare;
19366 + compare = compare !== null ? compare : shallowEqual;
19367 +
19368 + if (compare(prevProps, nextProps) && current.ref === workInProgress.ref) {
19369 + return bailoutOnAlreadyFinishedWork(current, workInProgress, renderLanes);
19370 + }
19371 + } // React DevTools reads this flag.
19372 +
19373 +
19374 + workInProgress.flags |= PerformedWork;
19375 + var newChild = createWorkInProgress(currentChild, nextProps);
19376 + newChild.ref = workInProgress.ref;
19377 + newChild.return = workInProgress;
19378 + workInProgress.child = newChild;
19379 + return newChild;
19380 + }
19381 +
19382 + function updateSimpleMemoComponent(current, workInProgress, Component, nextProps, renderLanes) {
19383 + // TODO: current can be non-null here even if the component
19384 + // hasn't yet mounted. This happens when the inner render suspends.
19385 + // We'll need to figure out if this is fine or can cause issues.
19386 + {
19387 + if (workInProgress.type !== workInProgress.elementType) {
19388 + // Lazy component props can't be validated in createElement
19389 + // because they're only guaranteed to be resolved here.
19390 + var outerMemoType = workInProgress.elementType;
19391 +
19392 + if (outerMemoType.$$typeof === REACT_LAZY_TYPE) {
19393 + // We warn when you define propTypes on lazy()
19394 + // so let's just skip over it to find memo() outer wrapper.
19395 + // Inner props for memo are validated later.
19396 + var lazyComponent = outerMemoType;
19397 + var payload = lazyComponent._payload;
19398 + var init = lazyComponent._init;
19399 +
19400 + try {
19401 + outerMemoType = init(payload);
19402 + } catch (x) {
19403 + outerMemoType = null;
19404 + } // Inner propTypes will be validated in the function component path.
19405 +
19406 +
19407 + var outerPropTypes = outerMemoType && outerMemoType.propTypes;
19408 +
19409 + if (outerPropTypes) {
19410 + checkPropTypes(outerPropTypes, nextProps, // Resolved (SimpleMemoComponent has no defaultProps)
19411 + 'prop', getComponentNameFromType(outerMemoType));
19412 + }
19413 + }
19414 + }
19415 + }
19416 +
19417 + if (current !== null) {
19418 + var prevProps = current.memoizedProps;
19419 +
19420 + if (shallowEqual(prevProps, nextProps) && current.ref === workInProgress.ref && ( // Prevent bailout if the implementation changed due to hot reload.
19421 + workInProgress.type === current.type )) {
19422 + didReceiveUpdate = false; // The props are shallowly equal. Reuse the previous props object, like we
19423 + // would during a normal fiber bailout.
19424 + //
19425 + // We don't have strong guarantees that the props object is referentially
19426 + // equal during updates where we can't bail out anyway — like if the props
19427 + // are shallowly equal, but there's a local state or context update in the
19428 + // same batch.
19429 + //
19430 + // However, as a principle, we should aim to make the behavior consistent
19431 + // across different ways of memoizing a component. For example, React.memo
19432 + // has a different internal Fiber layout if you pass a normal function
19433 + // component (SimpleMemoComponent) versus if you pass a different type
19434 + // like forwardRef (MemoComponent). But this is an implementation detail.
19435 + // Wrapping a component in forwardRef (or React.lazy, etc) shouldn't
19436 + // affect whether the props object is reused during a bailout.
19437 +
19438 + workInProgress.pendingProps = nextProps = prevProps;
19439 +
19440 + if (!checkScheduledUpdateOrContext(current, renderLanes)) {
19441 + // The pending lanes were cleared at the beginning of beginWork. We're
19442 + // about to bail out, but there might be other lanes that weren't
19443 + // included in the current render. Usually, the priority level of the
19444 + // remaining updates is accumulated during the evaluation of the
19445 + // component (i.e. when processing the update queue). But since since
19446 + // we're bailing out early *without* evaluating the component, we need
19447 + // to account for it here, too. Reset to the value of the current fiber.
19448 + // NOTE: This only applies to SimpleMemoComponent, not MemoComponent,
19449 + // because a MemoComponent fiber does not have hooks or an update queue;
19450 + // rather, it wraps around an inner component, which may or may not
19451 + // contains hooks.
19452 + // TODO: Move the reset at in beginWork out of the common path so that
19453 + // this is no longer necessary.
19454 + workInProgress.lanes = current.lanes;
19455 + return bailoutOnAlreadyFinishedWork(current, workInProgress, renderLanes);
19456 + } else if ((current.flags & ForceUpdateForLegacySuspense) !== NoFlags) {
19457 + // This is a special case that only exists for legacy mode.
19458 + // See https://github.com/facebook/react/pull/19216.
19459 + didReceiveUpdate = true;
19460 + }
19461 + }
19462 + }
19463 +
19464 + return updateFunctionComponent(current, workInProgress, Component, nextProps, renderLanes);
19465 + }
19466 +
19467 + function updateOffscreenComponent(current, workInProgress, renderLanes) {
19468 + var nextProps = workInProgress.pendingProps;
19469 + var nextChildren = nextProps.children;
19470 + var prevState = current !== null ? current.memoizedState : null;
19471 +
19472 + if (nextProps.mode === 'hidden' || enableLegacyHidden ) {
19473 + // Rendering a hidden tree.
19474 + if ((workInProgress.mode & ConcurrentMode) === NoMode) {
19475 + // In legacy sync mode, don't defer the subtree. Render it now.
19476 + // TODO: Consider how Offscreen should work with transitions in the future
19477 + var nextState = {
19478 + baseLanes: NoLanes,
19479 + cachePool: null,
19480 + transitions: null
19481 + };
19482 + workInProgress.memoizedState = nextState;
19483 +
19484 + pushRenderLanes(workInProgress, renderLanes);
19485 + } else if (!includesSomeLane(renderLanes, OffscreenLane)) {
19486 + var spawnedCachePool = null; // We're hidden, and we're not rendering at Offscreen. We will bail out
19487 + // and resume this tree later.
19488 +
19489 + var nextBaseLanes;
19490 +
19491 + if (prevState !== null) {
19492 + var prevBaseLanes = prevState.baseLanes;
19493 + nextBaseLanes = mergeLanes(prevBaseLanes, renderLanes);
19494 + } else {
19495 + nextBaseLanes = renderLanes;
19496 + } // Schedule this fiber to re-render at offscreen priority. Then bailout.
19497 +
19498 +
19499 + workInProgress.lanes = workInProgress.childLanes = laneToLanes(OffscreenLane);
19500 + var _nextState = {
19501 + baseLanes: nextBaseLanes,
19502 + cachePool: spawnedCachePool,
19503 + transitions: null
19504 + };
19505 + workInProgress.memoizedState = _nextState;
19506 + workInProgress.updateQueue = null;
19507 + // to avoid a push/pop misalignment.
19508 +
19509 +
19510 + pushRenderLanes(workInProgress, nextBaseLanes);
19511 +
19512 + return null;
19513 + } else {
19514 + // This is the second render. The surrounding visible content has already
19515 + // committed. Now we resume rendering the hidden tree.
19516 + // Rendering at offscreen, so we can clear the base lanes.
19517 + var _nextState2 = {
19518 + baseLanes: NoLanes,
19519 + cachePool: null,
19520 + transitions: null
19521 + };
19522 + workInProgress.memoizedState = _nextState2; // Push the lanes that were skipped when we bailed out.
19523 +
19524 + var subtreeRenderLanes = prevState !== null ? prevState.baseLanes : renderLanes;
19525 +
19526 + pushRenderLanes(workInProgress, subtreeRenderLanes);
19527 + }
19528 + } else {
19529 + // Rendering a visible tree.
19530 + var _subtreeRenderLanes;
19531 +
19532 + if (prevState !== null) {
19533 + // We're going from hidden -> visible.
19534 + _subtreeRenderLanes = mergeLanes(prevState.baseLanes, renderLanes);
19535 +
19536 + workInProgress.memoizedState = null;
19537 + } else {
19538 + // We weren't previously hidden, and we still aren't, so there's nothing
19539 + // special to do. Need to push to the stack regardless, though, to avoid
19540 + // a push/pop misalignment.
19541 + _subtreeRenderLanes = renderLanes;
19542 + }
19543 +
19544 + pushRenderLanes(workInProgress, _subtreeRenderLanes);
19545 + }
19546 +
19547 + reconcileChildren(current, workInProgress, nextChildren, renderLanes);
19548 + return workInProgress.child;
19549 + } // Note: These happen to have identical begin phases, for now. We shouldn't hold
19550 +
19551 + function updateFragment(current, workInProgress, renderLanes) {
19552 + var nextChildren = workInProgress.pendingProps;
19553 + reconcileChildren(current, workInProgress, nextChildren, renderLanes);
19554 + return workInProgress.child;
19555 + }
19556 +
19557 + function updateMode(current, workInProgress, renderLanes) {
19558 + var nextChildren = workInProgress.pendingProps.children;
19559 + reconcileChildren(current, workInProgress, nextChildren, renderLanes);
19560 + return workInProgress.child;
19561 + }
19562 +
19563 + function updateProfiler(current, workInProgress, renderLanes) {
19564 + {
19565 + workInProgress.flags |= Update;
19566 +
19567 + {
19568 + // Reset effect durations for the next eventual effect phase.
19569 + // These are reset during render to allow the DevTools commit hook a chance to read them,
19570 + var stateNode = workInProgress.stateNode;
19571 + stateNode.effectDuration = 0;
19572 + stateNode.passiveEffectDuration = 0;
19573 + }
19574 + }
19575 +
19576 + var nextProps = workInProgress.pendingProps;
19577 + var nextChildren = nextProps.children;
19578 + reconcileChildren(current, workInProgress, nextChildren, renderLanes);
19579 + return workInProgress.child;
19580 + }
19581 +
19582 + function markRef(current, workInProgress) {
19583 + var ref = workInProgress.ref;
19584 +
19585 + if (current === null && ref !== null || current !== null && current.ref !== ref) {
19586 + // Schedule a Ref effect
19587 + workInProgress.flags |= Ref;
19588 +
19589 + {
19590 + workInProgress.flags |= RefStatic;
19591 + }
19592 + }
19593 + }
19594 +
19595 + function updateFunctionComponent(current, workInProgress, Component, nextProps, renderLanes) {
19596 + {
19597 + if (workInProgress.type !== workInProgress.elementType) {
19598 + // Lazy component props can't be validated in createElement
19599 + // because they're only guaranteed to be resolved here.
19600 + var innerPropTypes = Component.propTypes;
19601 +
19602 + if (innerPropTypes) {
19603 + checkPropTypes(innerPropTypes, nextProps, // Resolved props
19604 + 'prop', getComponentNameFromType(Component));
19605 + }
19606 + }
19607 + }
19608 +
19609 + var context;
19610 +
19611 + {
19612 + var unmaskedContext = getUnmaskedContext(workInProgress, Component, true);
19613 + context = getMaskedContext(workInProgress, unmaskedContext);
19614 + }
19615 +
19616 + var nextChildren;
19617 + var hasId;
19618 + prepareToReadContext(workInProgress, renderLanes);
19619 +
19620 + {
19621 + markComponentRenderStarted(workInProgress);
19622 + }
19623 +
19624 + {
19625 + ReactCurrentOwner$1.current = workInProgress;
19626 + setIsRendering(true);
19627 + nextChildren = renderWithHooks(current, workInProgress, Component, nextProps, context, renderLanes);
19628 + hasId = checkDidRenderIdHook();
19629 +
19630 + if ( workInProgress.mode & StrictLegacyMode) {
19631 + setIsStrictModeForDevtools(true);
19632 +
19633 + try {
19634 + nextChildren = renderWithHooks(current, workInProgress, Component, nextProps, context, renderLanes);
19635 + hasId = checkDidRenderIdHook();
19636 + } finally {
19637 + setIsStrictModeForDevtools(false);
19638 + }
19639 + }
19640 +
19641 + setIsRendering(false);
19642 + }
19643 +
19644 + {
19645 + markComponentRenderStopped();
19646 + }
19647 +
19648 + if (current !== null && !didReceiveUpdate) {
19649 + bailoutHooks(current, workInProgress, renderLanes);
19650 + return bailoutOnAlreadyFinishedWork(current, workInProgress, renderLanes);
19651 + }
19652 +
19653 + if (getIsHydrating() && hasId) {
19654 + pushMaterializedTreeId(workInProgress);
19655 + } // React DevTools reads this flag.
19656 +
19657 +
19658 + workInProgress.flags |= PerformedWork;
19659 + reconcileChildren(current, workInProgress, nextChildren, renderLanes);
19660 + return workInProgress.child;
19661 + }
19662 +
19663 + function updateClassComponent(current, workInProgress, Component, nextProps, renderLanes) {
19664 + {
19665 + // This is used by DevTools to force a boundary to error.
19666 + switch (shouldError(workInProgress)) {
19667 + case false:
19668 + {
19669 + var _instance = workInProgress.stateNode;
19670 + var ctor = workInProgress.type; // TODO This way of resetting the error boundary state is a hack.
19671 + // Is there a better way to do this?
19672 +
19673 + var tempInstance = new ctor(workInProgress.memoizedProps, _instance.context);
19674 + var state = tempInstance.state;
19675 +
19676 + _instance.updater.enqueueSetState(_instance, state, null);
19677 +
19678 + break;
19679 + }
19680 +
19681 + case true:
19682 + {
19683 + workInProgress.flags |= DidCapture;
19684 + workInProgress.flags |= ShouldCapture; // eslint-disable-next-line react-internal/prod-error-codes
19685 +
19686 + var error$1 = new Error('Simulated error coming from DevTools');
19687 + var lane = pickArbitraryLane(renderLanes);
19688 + workInProgress.lanes = mergeLanes(workInProgress.lanes, lane); // Schedule the error boundary to re-render using updated state
19689 +
19690 + var update = createClassErrorUpdate(workInProgress, createCapturedValueAtFiber(error$1, workInProgress), lane);
19691 + enqueueCapturedUpdate(workInProgress, update);
19692 + break;
19693 + }
19694 + }
19695 +
19696 + if (workInProgress.type !== workInProgress.elementType) {
19697 + // Lazy component props can't be validated in createElement
19698 + // because they're only guaranteed to be resolved here.
19699 + var innerPropTypes = Component.propTypes;
19700 +
19701 + if (innerPropTypes) {
19702 + checkPropTypes(innerPropTypes, nextProps, // Resolved props
19703 + 'prop', getComponentNameFromType(Component));
19704 + }
19705 + }
19706 + } // Push context providers early to prevent context stack mismatches.
19707 + // During mounting we don't know the child context yet as the instance doesn't exist.
19708 + // We will invalidate the child context in finishClassComponent() right after rendering.
19709 +
19710 +
19711 + var hasContext;
19712 +
19713 + if (isContextProvider(Component)) {
19714 + hasContext = true;
19715 + pushContextProvider(workInProgress);
19716 + } else {
19717 + hasContext = false;
19718 + }
19719 +
19720 + prepareToReadContext(workInProgress, renderLanes);
19721 + var instance = workInProgress.stateNode;
19722 + var shouldUpdate;
19723 +
19724 + if (instance === null) {
19725 + resetSuspendedCurrentOnMountInLegacyMode(current, workInProgress); // In the initial pass we might need to construct the instance.
19726 +
19727 + constructClassInstance(workInProgress, Component, nextProps);
19728 + mountClassInstance(workInProgress, Component, nextProps, renderLanes);
19729 + shouldUpdate = true;
19730 + } else if (current === null) {
19731 + // In a resume, we'll already have an instance we can reuse.
19732 + shouldUpdate = resumeMountClassInstance(workInProgress, Component, nextProps, renderLanes);
19733 + } else {
19734 + shouldUpdate = updateClassInstance(current, workInProgress, Component, nextProps, renderLanes);
19735 + }
19736 +
19737 + var nextUnitOfWork = finishClassComponent(current, workInProgress, Component, shouldUpdate, hasContext, renderLanes);
19738 +
19739 + {
19740 + var inst = workInProgress.stateNode;
19741 +
19742 + if (shouldUpdate && inst.props !== nextProps) {
19743 + if (!didWarnAboutReassigningProps) {
19744 + error('It looks like %s is reassigning its own `this.props` while rendering. ' + 'This is not supported and can lead to confusing bugs.', getComponentNameFromFiber(workInProgress) || 'a component');
19745 + }
19746 +
19747 + didWarnAboutReassigningProps = true;
19748 + }
19749 + }
19750 +
19751 + return nextUnitOfWork;
19752 + }
19753 +
19754 + function finishClassComponent(current, workInProgress, Component, shouldUpdate, hasContext, renderLanes) {
19755 + // Refs should update even if shouldComponentUpdate returns false
19756 + markRef(current, workInProgress);
19757 + var didCaptureError = (workInProgress.flags & DidCapture) !== NoFlags;
19758 +
19759 + if (!shouldUpdate && !didCaptureError) {
19760 + // Context providers should defer to sCU for rendering
19761 + if (hasContext) {
19762 + invalidateContextProvider(workInProgress, Component, false);
19763 + }
19764 +
19765 + return bailoutOnAlreadyFinishedWork(current, workInProgress, renderLanes);
19766 + }
19767 +
19768 + var instance = workInProgress.stateNode; // Rerender
19769 +
19770 + ReactCurrentOwner$1.current = workInProgress;
19771 + var nextChildren;
19772 +
19773 + if (didCaptureError && typeof Component.getDerivedStateFromError !== 'function') {
19774 + // If we captured an error, but getDerivedStateFromError is not defined,
19775 + // unmount all the children. componentDidCatch will schedule an update to
19776 + // re-render a fallback. This is temporary until we migrate everyone to
19777 + // the new API.
19778 + // TODO: Warn in a future release.
19779 + nextChildren = null;
19780 +
19781 + {
19782 + stopProfilerTimerIfRunning();
19783 + }
19784 + } else {
19785 + {
19786 + markComponentRenderStarted(workInProgress);
19787 + }
19788 +
19789 + {
19790 + setIsRendering(true);
19791 + nextChildren = instance.render();
19792 +
19793 + if ( workInProgress.mode & StrictLegacyMode) {
19794 + setIsStrictModeForDevtools(true);
19795 +
19796 + try {
19797 + instance.render();
19798 + } finally {
19799 + setIsStrictModeForDevtools(false);
19800 + }
19801 + }
19802 +
19803 + setIsRendering(false);
19804 + }
19805 +
19806 + {
19807 + markComponentRenderStopped();
19808 + }
19809 + } // React DevTools reads this flag.
19810 +
19811 +
19812 + workInProgress.flags |= PerformedWork;
19813 +
19814 + if (current !== null && didCaptureError) {
19815 + // If we're recovering from an error, reconcile without reusing any of
19816 + // the existing children. Conceptually, the normal children and the children
19817 + // that are shown on error are two different sets, so we shouldn't reuse
19818 + // normal children even if their identities match.
19819 + forceUnmountCurrentAndReconcile(current, workInProgress, nextChildren, renderLanes);
19820 + } else {
19821 + reconcileChildren(current, workInProgress, nextChildren, renderLanes);
19822 + } // Memoize state using the values we just used to render.
19823 + // TODO: Restructure so we never read values from the instance.
19824 +
19825 +
19826 + workInProgress.memoizedState = instance.state; // The context might have changed so we need to recalculate it.
19827 +
19828 + if (hasContext) {
19829 + invalidateContextProvider(workInProgress, Component, true);
19830 + }
19831 +
19832 + return workInProgress.child;
19833 + }
19834 +
19835 + function pushHostRootContext(workInProgress) {
19836 + var root = workInProgress.stateNode;
19837 +
19838 + if (root.pendingContext) {
19839 + pushTopLevelContextObject(workInProgress, root.pendingContext, root.pendingContext !== root.context);
19840 + } else if (root.context) {
19841 + // Should always be set
19842 + pushTopLevelContextObject(workInProgress, root.context, false);
19843 + }
19844 +
19845 + pushHostContainer(workInProgress, root.containerInfo);
19846 + }
19847 +
19848 + function updateHostRoot(current, workInProgress, renderLanes) {
19849 + pushHostRootContext(workInProgress);
19850 +
19851 + if (current === null) {
19852 + throw new Error('Should have a current fiber. This is a bug in React.');
19853 + }
19854 +
19855 + var nextProps = workInProgress.pendingProps;
19856 + var prevState = workInProgress.memoizedState;
19857 + var prevChildren = prevState.element;
19858 + cloneUpdateQueue(current, workInProgress);
19859 + processUpdateQueue(workInProgress, nextProps, null, renderLanes);
19860 + var nextState = workInProgress.memoizedState;
19861 + var root = workInProgress.stateNode;
19862 + // being called "element".
19863 +
19864 +
19865 + var nextChildren = nextState.element;
19866 +
19867 + if ( prevState.isDehydrated) {
19868 + // This is a hydration root whose shell has not yet hydrated. We should
19869 + // attempt to hydrate.
19870 + // Flip isDehydrated to false to indicate that when this render
19871 + // finishes, the root will no longer be dehydrated.
19872 + var overrideState = {
19873 + element: nextChildren,
19874 + isDehydrated: false,
19875 + cache: nextState.cache,
19876 + pendingSuspenseBoundaries: nextState.pendingSuspenseBoundaries,
19877 + transitions: nextState.transitions
19878 + };
19879 + var updateQueue = workInProgress.updateQueue; // `baseState` can always be the last state because the root doesn't
19880 + // have reducer functions so it doesn't need rebasing.
19881 +
19882 + updateQueue.baseState = overrideState;
19883 + workInProgress.memoizedState = overrideState;
19884 +
19885 + if (workInProgress.flags & ForceClientRender) {
19886 + // Something errored during a previous attempt to hydrate the shell, so we
19887 + // forced a client render.
19888 + var recoverableError = createCapturedValueAtFiber(new Error('There was an error while hydrating. Because the error happened outside ' + 'of a Suspense boundary, the entire root will switch to ' + 'client rendering.'), workInProgress);
19889 + return mountHostRootWithoutHydrating(current, workInProgress, nextChildren, renderLanes, recoverableError);
19890 + } else if (nextChildren !== prevChildren) {
19891 + var _recoverableError = createCapturedValueAtFiber(new Error('This root received an early update, before anything was able ' + 'hydrate. Switched the entire root to client rendering.'), workInProgress);
19892 +
19893 + return mountHostRootWithoutHydrating(current, workInProgress, nextChildren, renderLanes, _recoverableError);
19894 + } else {
19895 + // The outermost shell has not hydrated yet. Start hydrating.
19896 + enterHydrationState(workInProgress);
19897 +
19898 + var child = mountChildFibers(workInProgress, null, nextChildren, renderLanes);
19899 + workInProgress.child = child;
19900 + var node = child;
19901 +
19902 + while (node) {
19903 + // Mark each child as hydrating. This is a fast path to know whether this
19904 + // tree is part of a hydrating tree. This is used to determine if a child
19905 + // node has fully mounted yet, and for scheduling event replaying.
19906 + // Conceptually this is similar to Placement in that a new subtree is
19907 + // inserted into the React tree here. It just happens to not need DOM
19908 + // mutations because it already exists.
19909 + node.flags = node.flags & ~Placement | Hydrating;
19910 + node = node.sibling;
19911 + }
19912 + }
19913 + } else {
19914 + // Root is not dehydrated. Either this is a client-only root, or it
19915 + // already hydrated.
19916 + resetHydrationState();
19917 +
19918 + if (nextChildren === prevChildren) {
19919 + return bailoutOnAlreadyFinishedWork(current, workInProgress, renderLanes);
19920 + }
19921 +
19922 + reconcileChildren(current, workInProgress, nextChildren, renderLanes);
19923 + }
19924 +
19925 + return workInProgress.child;
19926 + }
19927 +
19928 + function mountHostRootWithoutHydrating(current, workInProgress, nextChildren, renderLanes, recoverableError) {
19929 + // Revert to client rendering.
19930 + resetHydrationState();
19931 + queueHydrationError(recoverableError);
19932 + workInProgress.flags |= ForceClientRender;
19933 + reconcileChildren(current, workInProgress, nextChildren, renderLanes);
19934 + return workInProgress.child;
19935 + }
19936 +
19937 + function updateHostComponent(current, workInProgress, renderLanes) {
19938 + pushHostContext(workInProgress);
19939 +
19940 + if (current === null) {
19941 + tryToClaimNextHydratableInstance(workInProgress);
19942 + }
19943 +
19944 + var type = workInProgress.type;
19945 + var nextProps = workInProgress.pendingProps;
19946 + var prevProps = current !== null ? current.memoizedProps : null;
19947 + var nextChildren = nextProps.children;
19948 + var isDirectTextChild = shouldSetTextContent(type, nextProps);
19949 +
19950 + if (isDirectTextChild) {
19951 + // We special case a direct text child of a host node. This is a common
19952 + // case. We won't handle it as a reified child. We will instead handle
19953 + // this in the host environment that also has access to this prop. That
19954 + // avoids allocating another HostText fiber and traversing it.
19955 + nextChildren = null;
19956 + } else if (prevProps !== null && shouldSetTextContent(type, prevProps)) {
19957 + // If we're switching from a direct text child to a normal child, or to
19958 + // empty, we need to schedule the text content to be reset.
19959 + workInProgress.flags |= ContentReset;
19960 + }
19961 +
19962 + markRef(current, workInProgress);
19963 + reconcileChildren(current, workInProgress, nextChildren, renderLanes);
19964 + return workInProgress.child;
19965 + }
19966 +
19967 + function updateHostText(current, workInProgress) {
19968 + if (current === null) {
19969 + tryToClaimNextHydratableInstance(workInProgress);
19970 + } // Nothing to do here. This is terminal. We'll do the completion step
19971 + // immediately after.
19972 +
19973 +
19974 + return null;
19975 + }
19976 +
19977 + function mountLazyComponent(_current, workInProgress, elementType, renderLanes) {
19978 + resetSuspendedCurrentOnMountInLegacyMode(_current, workInProgress);
19979 + var props = workInProgress.pendingProps;
19980 + var lazyComponent = elementType;
19981 + var payload = lazyComponent._payload;
19982 + var init = lazyComponent._init;
19983 + var Component = init(payload); // Store the unwrapped component in the type.
19984 +
19985 + workInProgress.type = Component;
19986 + var resolvedTag = workInProgress.tag = resolveLazyComponentTag(Component);
19987 + var resolvedProps = resolveDefaultProps(Component, props);
19988 + var child;
19989 +
19990 + switch (resolvedTag) {
19991 + case FunctionComponent:
19992 + {
19993 + {
19994 + validateFunctionComponentInDev(workInProgress, Component);
19995 + workInProgress.type = Component = resolveFunctionForHotReloading(Component);
19996 + }
19997 +
19998 + child = updateFunctionComponent(null, workInProgress, Component, resolvedProps, renderLanes);
19999 + return child;
20000 + }
20001 +
20002 + case ClassComponent:
20003 + {
20004 + {
20005 + workInProgress.type = Component = resolveClassForHotReloading(Component);
20006 + }
20007 +
20008 + child = updateClassComponent(null, workInProgress, Component, resolvedProps, renderLanes);
20009 + return child;
20010 + }
20011 +
20012 + case ForwardRef:
20013 + {
20014 + {
20015 + workInProgress.type = Component = resolveForwardRefForHotReloading(Component);
20016 + }
20017 +
20018 + child = updateForwardRef(null, workInProgress, Component, resolvedProps, renderLanes);
20019 + return child;
20020 + }
20021 +
20022 + case MemoComponent:
20023 + {
20024 + {
20025 + if (workInProgress.type !== workInProgress.elementType) {
20026 + var outerPropTypes = Component.propTypes;
20027 +
20028 + if (outerPropTypes) {
20029 + checkPropTypes(outerPropTypes, resolvedProps, // Resolved for outer only
20030 + 'prop', getComponentNameFromType(Component));
20031 + }
20032 + }
20033 + }
20034 +
20035 + child = updateMemoComponent(null, workInProgress, Component, resolveDefaultProps(Component.type, resolvedProps), // The inner type can have defaults too
20036 + renderLanes);
20037 + return child;
20038 + }
20039 + }
20040 +
20041 + var hint = '';
20042 +
20043 + {
20044 + if (Component !== null && typeof Component === 'object' && Component.$$typeof === REACT_LAZY_TYPE) {
20045 + hint = ' Did you wrap a component in React.lazy() more than once?';
20046 + }
20047 + } // This message intentionally doesn't mention ForwardRef or MemoComponent
20048 + // because the fact that it's a separate type of work is an
20049 + // implementation detail.
20050 +
20051 +
20052 + throw new Error("Element type is invalid. Received a promise that resolves to: " + Component + ". " + ("Lazy element type must resolve to a class or function." + hint));
20053 + }
20054 +
20055 + function mountIncompleteClassComponent(_current, workInProgress, Component, nextProps, renderLanes) {
20056 + resetSuspendedCurrentOnMountInLegacyMode(_current, workInProgress); // Promote the fiber to a class and try rendering again.
20057 +
20058 + workInProgress.tag = ClassComponent; // The rest of this function is a fork of `updateClassComponent`
20059 + // Push context providers early to prevent context stack mismatches.
20060 + // During mounting we don't know the child context yet as the instance doesn't exist.
20061 + // We will invalidate the child context in finishClassComponent() right after rendering.
20062 +
20063 + var hasContext;
20064 +
20065 + if (isContextProvider(Component)) {
20066 + hasContext = true;
20067 + pushContextProvider(workInProgress);
20068 + } else {
20069 + hasContext = false;
20070 + }
20071 +
20072 + prepareToReadContext(workInProgress, renderLanes);
20073 + constructClassInstance(workInProgress, Component, nextProps);
20074 + mountClassInstance(workInProgress, Component, nextProps, renderLanes);
20075 + return finishClassComponent(null, workInProgress, Component, true, hasContext, renderLanes);
20076 + }
20077 +
20078 + function mountIndeterminateComponent(_current, workInProgress, Component, renderLanes) {
20079 + resetSuspendedCurrentOnMountInLegacyMode(_current, workInProgress);
20080 + var props = workInProgress.pendingProps;
20081 + var context;
20082 +
20083 + {
20084 + var unmaskedContext = getUnmaskedContext(workInProgress, Component, false);
20085 + context = getMaskedContext(workInProgress, unmaskedContext);
20086 + }
20087 +
20088 + prepareToReadContext(workInProgress, renderLanes);
20089 + var value;
20090 + var hasId;
20091 +
20092 + {
20093 + markComponentRenderStarted(workInProgress);
20094 + }
20095 +
20096 + {
20097 + if (Component.prototype && typeof Component.prototype.render === 'function') {
20098 + var componentName = getComponentNameFromType(Component) || 'Unknown';
20099 +
20100 + if (!didWarnAboutBadClass[componentName]) {
20101 + error("The <%s /> component appears to have a render method, but doesn't extend React.Component. " + 'This is likely to cause errors. Change %s to extend React.Component instead.', componentName, componentName);
20102 +
20103 + didWarnAboutBadClass[componentName] = true;
20104 + }
20105 + }
20106 +
20107 + if (workInProgress.mode & StrictLegacyMode) {
20108 + ReactStrictModeWarnings.recordLegacyContextWarning(workInProgress, null);
20109 + }
20110 +
20111 + setIsRendering(true);
20112 + ReactCurrentOwner$1.current = workInProgress;
20113 + value = renderWithHooks(null, workInProgress, Component, props, context, renderLanes);
20114 + hasId = checkDidRenderIdHook();
20115 + setIsRendering(false);
20116 + }
20117 +
20118 + {
20119 + markComponentRenderStopped();
20120 + } // React DevTools reads this flag.
20121 +
20122 +
20123 + workInProgress.flags |= PerformedWork;
20124 +
20125 + {
20126 + // Support for module components is deprecated and is removed behind a flag.
20127 + // Whether or not it would crash later, we want to show a good message in DEV first.
20128 + if (typeof value === 'object' && value !== null && typeof value.render === 'function' && value.$$typeof === undefined) {
20129 + var _componentName = getComponentNameFromType(Component) || 'Unknown';
20130 +
20131 + if (!didWarnAboutModulePatternComponent[_componentName]) {
20132 + error('The <%s /> component appears to be a function component that returns a class instance. ' + 'Change %s to a class that extends React.Component instead. ' + "If you can't use a class try assigning the prototype on the function as a workaround. " + "`%s.prototype = React.Component.prototype`. Don't use an arrow function since it " + 'cannot be called with `new` by React.', _componentName, _componentName, _componentName);
20133 +
20134 + didWarnAboutModulePatternComponent[_componentName] = true;
20135 + }
20136 + }
20137 + }
20138 +
20139 + if ( // Run these checks in production only if the flag is off.
20140 + // Eventually we'll delete this branch altogether.
20141 + typeof value === 'object' && value !== null && typeof value.render === 'function' && value.$$typeof === undefined) {
20142 + {
20143 + var _componentName2 = getComponentNameFromType(Component) || 'Unknown';
20144 +
20145 + if (!didWarnAboutModulePatternComponent[_componentName2]) {
20146 + error('The <%s /> component appears to be a function component that returns a class instance. ' + 'Change %s to a class that extends React.Component instead. ' + "If you can't use a class try assigning the prototype on the function as a workaround. " + "`%s.prototype = React.Component.prototype`. Don't use an arrow function since it " + 'cannot be called with `new` by React.', _componentName2, _componentName2, _componentName2);
20147 +
20148 + didWarnAboutModulePatternComponent[_componentName2] = true;
20149 + }
20150 + } // Proceed under the assumption that this is a class instance
20151 +
20152 +
20153 + workInProgress.tag = ClassComponent; // Throw out any hooks that were used.
20154 +
20155 + workInProgress.memoizedState = null;
20156 + workInProgress.updateQueue = null; // Push context providers early to prevent context stack mismatches.
20157 + // During mounting we don't know the child context yet as the instance doesn't exist.
20158 + // We will invalidate the child context in finishClassComponent() right after rendering.
20159 +
20160 + var hasContext = false;
20161 +
20162 + if (isContextProvider(Component)) {
20163 + hasContext = true;
20164 + pushContextProvider(workInProgress);
20165 + } else {
20166 + hasContext = false;
20167 + }
20168 +
20169 + workInProgress.memoizedState = value.state !== null && value.state !== undefined ? value.state : null;
20170 + initializeUpdateQueue(workInProgress);
20171 + adoptClassInstance(workInProgress, value);
20172 + mountClassInstance(workInProgress, Component, props, renderLanes);
20173 + return finishClassComponent(null, workInProgress, Component, true, hasContext, renderLanes);
20174 + } else {
20175 + // Proceed under the assumption that this is a function component
20176 + workInProgress.tag = FunctionComponent;
20177 +
20178 + {
20179 +
20180 + if ( workInProgress.mode & StrictLegacyMode) {
20181 + setIsStrictModeForDevtools(true);
20182 +
20183 + try {
20184 + value = renderWithHooks(null, workInProgress, Component, props, context, renderLanes);
20185 + hasId = checkDidRenderIdHook();
20186 + } finally {
20187 + setIsStrictModeForDevtools(false);
20188 + }
20189 + }
20190 + }
20191 +
20192 + if (getIsHydrating() && hasId) {
20193 + pushMaterializedTreeId(workInProgress);
20194 + }
20195 +
20196 + reconcileChildren(null, workInProgress, value, renderLanes);
20197 +
20198 + {
20199 + validateFunctionComponentInDev(workInProgress, Component);
20200 + }
20201 +
20202 + return workInProgress.child;
20203 + }
20204 + }
20205 +
20206 + function validateFunctionComponentInDev(workInProgress, Component) {
20207 + {
20208 + if (Component) {
20209 + if (Component.childContextTypes) {
20210 + error('%s(...): childContextTypes cannot be defined on a function component.', Component.displayName || Component.name || 'Component');
20211 + }
20212 + }
20213 +
20214 + if (workInProgress.ref !== null) {
20215 + var info = '';
20216 + var ownerName = getCurrentFiberOwnerNameInDevOrNull();
20217 +
20218 + if (ownerName) {
20219 + info += '\n\nCheck the render method of `' + ownerName + '`.';
20220 + }
20221 +
20222 + var warningKey = ownerName || '';
20223 + var debugSource = workInProgress._debugSource;
20224 +
20225 + if (debugSource) {
20226 + warningKey = debugSource.fileName + ':' + debugSource.lineNumber;
20227 + }
20228 +
20229 + if (!didWarnAboutFunctionRefs[warningKey]) {
20230 + didWarnAboutFunctionRefs[warningKey] = true;
20231 +
20232 + error('Function components cannot be given refs. ' + 'Attempts to access this ref will fail. ' + 'Did you mean to use React.forwardRef()?%s', info);
20233 + }
20234 + }
20235 +
20236 + if ( Component.defaultProps !== undefined) {
20237 + var componentName = getComponentNameFromType(Component) || 'Unknown';
20238 +
20239 + if (!didWarnAboutDefaultPropsOnFunctionComponent[componentName]) {
20240 + error('%s: Support for defaultProps will be removed from function components ' + 'in a future major release. Use JavaScript default parameters instead.', componentName);
20241 +
20242 + didWarnAboutDefaultPropsOnFunctionComponent[componentName] = true;
20243 + }
20244 + }
20245 +
20246 + if (typeof Component.getDerivedStateFromProps === 'function') {
20247 + var _componentName3 = getComponentNameFromType(Component) || 'Unknown';
20248 +
20249 + if (!didWarnAboutGetDerivedStateOnFunctionComponent[_componentName3]) {
20250 + error('%s: Function components do not support getDerivedStateFromProps.', _componentName3);
20251 +
20252 + didWarnAboutGetDerivedStateOnFunctionComponent[_componentName3] = true;
20253 + }
20254 + }
20255 +
20256 + if (typeof Component.contextType === 'object' && Component.contextType !== null) {
20257 + var _componentName4 = getComponentNameFromType(Component) || 'Unknown';
20258 +
20259 + if (!didWarnAboutContextTypeOnFunctionComponent[_componentName4]) {
20260 + error('%s: Function components do not support contextType.', _componentName4);
20261 +
20262 + didWarnAboutContextTypeOnFunctionComponent[_componentName4] = true;
20263 + }
20264 + }
20265 + }
20266 + }
20267 +
20268 + var SUSPENDED_MARKER = {
20269 + dehydrated: null,
20270 + treeContext: null,
20271 + retryLane: NoLane
20272 + };
20273 +
20274 + function mountSuspenseOffscreenState(renderLanes) {
20275 + return {
20276 + baseLanes: renderLanes,
20277 + cachePool: getSuspendedCache(),
20278 + transitions: null
20279 + };
20280 + }
20281 +
20282 + function updateSuspenseOffscreenState(prevOffscreenState, renderLanes) {
20283 + var cachePool = null;
20284 +
20285 + return {
20286 + baseLanes: mergeLanes(prevOffscreenState.baseLanes, renderLanes),
20287 + cachePool: cachePool,
20288 + transitions: prevOffscreenState.transitions
20289 + };
20290 + } // TODO: Probably should inline this back
20291 +
20292 +
20293 + function shouldRemainOnFallback(suspenseContext, current, workInProgress, renderLanes) {
20294 + // If we're already showing a fallback, there are cases where we need to
20295 + // remain on that fallback regardless of whether the content has resolved.
20296 + // For example, SuspenseList coordinates when nested content appears.
20297 + if (current !== null) {
20298 + var suspenseState = current.memoizedState;
20299 +
20300 + if (suspenseState === null) {
20301 + // Currently showing content. Don't hide it, even if ForceSuspenseFallback
20302 + // is true. More precise name might be "ForceRemainSuspenseFallback".
20303 + // Note: This is a factoring smell. Can't remain on a fallback if there's
20304 + // no fallback to remain on.
20305 + return false;
20306 + }
20307 + } // Not currently showing content. Consult the Suspense context.
20308 +
20309 +
20310 + return hasSuspenseContext(suspenseContext, ForceSuspenseFallback);
20311 + }
20312 +
20313 + function getRemainingWorkInPrimaryTree(current, renderLanes) {
20314 + // TODO: Should not remove render lanes that were pinged during this render
20315 + return removeLanes(current.childLanes, renderLanes);
20316 + }
20317 +
20318 + function updateSuspenseComponent(current, workInProgress, renderLanes) {
20319 + var nextProps = workInProgress.pendingProps; // This is used by DevTools to force a boundary to suspend.
20320 +
20321 + {
20322 + if (shouldSuspend(workInProgress)) {
20323 + workInProgress.flags |= DidCapture;
20324 + }
20325 + }
20326 +
20327 + var suspenseContext = suspenseStackCursor.current;
20328 + var showFallback = false;
20329 + var didSuspend = (workInProgress.flags & DidCapture) !== NoFlags;
20330 +
20331 + if (didSuspend || shouldRemainOnFallback(suspenseContext, current)) {
20332 + // Something in this boundary's subtree already suspended. Switch to
20333 + // rendering the fallback children.
20334 + showFallback = true;
20335 + workInProgress.flags &= ~DidCapture;
20336 + } else {
20337 + // Attempting the main content
20338 + if (current === null || current.memoizedState !== null) {
20339 + // This is a new mount or this boundary is already showing a fallback state.
20340 + // Mark this subtree context as having at least one invisible parent that could
20341 + // handle the fallback state.
20342 + // Avoided boundaries are not considered since they cannot handle preferred fallback states.
20343 + {
20344 + suspenseContext = addSubtreeSuspenseContext(suspenseContext, InvisibleParentSuspenseContext);
20345 + }
20346 + }
20347 + }
20348 +
20349 + suspenseContext = setDefaultShallowSuspenseContext(suspenseContext);
20350 + pushSuspenseContext(workInProgress, suspenseContext); // OK, the next part is confusing. We're about to reconcile the Suspense
20351 + // boundary's children. This involves some custom reconciliation logic. Two
20352 + // main reasons this is so complicated.
20353 + //
20354 + // First, Legacy Mode has different semantics for backwards compatibility. The
20355 + // primary tree will commit in an inconsistent state, so when we do the
20356 + // second pass to render the fallback, we do some exceedingly, uh, clever
20357 + // hacks to make that not totally break. Like transferring effects and
20358 + // deletions from hidden tree. In Concurrent Mode, it's much simpler,
20359 + // because we bailout on the primary tree completely and leave it in its old
20360 + // state, no effects. Same as what we do for Offscreen (except that
20361 + // Offscreen doesn't have the first render pass).
20362 + //
20363 + // Second is hydration. During hydration, the Suspense fiber has a slightly
20364 + // different layout, where the child points to a dehydrated fragment, which
20365 + // contains the DOM rendered by the server.
20366 + //
20367 + // Third, even if you set all that aside, Suspense is like error boundaries in
20368 + // that we first we try to render one tree, and if that fails, we render again
20369 + // and switch to a different tree. Like a try/catch block. So we have to track
20370 + // which branch we're currently rendering. Ideally we would model this using
20371 + // a stack.
20372 +
20373 + if (current === null) {
20374 + // Initial mount
20375 + // Special path for hydration
20376 + // If we're currently hydrating, try to hydrate this boundary.
20377 + tryToClaimNextHydratableInstance(workInProgress); // This could've been a dehydrated suspense component.
20378 +
20379 + var suspenseState = workInProgress.memoizedState;
20380 +
20381 + if (suspenseState !== null) {
20382 + var dehydrated = suspenseState.dehydrated;
20383 +
20384 + if (dehydrated !== null) {
20385 + return mountDehydratedSuspenseComponent(workInProgress, dehydrated);
20386 + }
20387 + }
20388 +
20389 + var nextPrimaryChildren = nextProps.children;
20390 + var nextFallbackChildren = nextProps.fallback;
20391 +
20392 + if (showFallback) {
20393 + var fallbackFragment = mountSuspenseFallbackChildren(workInProgress, nextPrimaryChildren, nextFallbackChildren, renderLanes);
20394 + var primaryChildFragment = workInProgress.child;
20395 + primaryChildFragment.memoizedState = mountSuspenseOffscreenState(renderLanes);
20396 + workInProgress.memoizedState = SUSPENDED_MARKER;
20397 +
20398 + return fallbackFragment;
20399 + } else {
20400 + return mountSuspensePrimaryChildren(workInProgress, nextPrimaryChildren);
20401 + }
20402 + } else {
20403 + // This is an update.
20404 + // Special path for hydration
20405 + var prevState = current.memoizedState;
20406 +
20407 + if (prevState !== null) {
20408 + var _dehydrated = prevState.dehydrated;
20409 +
20410 + if (_dehydrated !== null) {
20411 + return updateDehydratedSuspenseComponent(current, workInProgress, didSuspend, nextProps, _dehydrated, prevState, renderLanes);
20412 + }
20413 + }
20414 +
20415 + if (showFallback) {
20416 + var _nextFallbackChildren = nextProps.fallback;
20417 + var _nextPrimaryChildren = nextProps.children;
20418 + var fallbackChildFragment = updateSuspenseFallbackChildren(current, workInProgress, _nextPrimaryChildren, _nextFallbackChildren, renderLanes);
20419 + var _primaryChildFragment2 = workInProgress.child;
20420 + var prevOffscreenState = current.child.memoizedState;
20421 + _primaryChildFragment2.memoizedState = prevOffscreenState === null ? mountSuspenseOffscreenState(renderLanes) : updateSuspenseOffscreenState(prevOffscreenState, renderLanes);
20422 +
20423 + _primaryChildFragment2.childLanes = getRemainingWorkInPrimaryTree(current, renderLanes);
20424 + workInProgress.memoizedState = SUSPENDED_MARKER;
20425 + return fallbackChildFragment;
20426 + } else {
20427 + var _nextPrimaryChildren2 = nextProps.children;
20428 +
20429 + var _primaryChildFragment3 = updateSuspensePrimaryChildren(current, workInProgress, _nextPrimaryChildren2, renderLanes);
20430 +
20431 + workInProgress.memoizedState = null;
20432 + return _primaryChildFragment3;
20433 + }
20434 + }
20435 + }
20436 +
20437 + function mountSuspensePrimaryChildren(workInProgress, primaryChildren, renderLanes) {
20438 + var mode = workInProgress.mode;
20439 + var primaryChildProps = {
20440 + mode: 'visible',
20441 + children: primaryChildren
20442 + };
20443 + var primaryChildFragment = mountWorkInProgressOffscreenFiber(primaryChildProps, mode);
20444 + primaryChildFragment.return = workInProgress;
20445 + workInProgress.child = primaryChildFragment;
20446 + return primaryChildFragment;
20447 + }
20448 +
20449 + function mountSuspenseFallbackChildren(workInProgress, primaryChildren, fallbackChildren, renderLanes) {
20450 + var mode = workInProgress.mode;
20451 + var progressedPrimaryFragment = workInProgress.child;
20452 + var primaryChildProps = {
20453 + mode: 'hidden',
20454 + children: primaryChildren
20455 + };
20456 + var primaryChildFragment;
20457 + var fallbackChildFragment;
20458 +
20459 + if ((mode & ConcurrentMode) === NoMode && progressedPrimaryFragment !== null) {
20460 + // In legacy mode, we commit the primary tree as if it successfully
20461 + // completed, even though it's in an inconsistent state.
20462 + primaryChildFragment = progressedPrimaryFragment;
20463 + primaryChildFragment.childLanes = NoLanes;
20464 + primaryChildFragment.pendingProps = primaryChildProps;
20465 +
20466 + if ( workInProgress.mode & ProfileMode) {
20467 + // Reset the durations from the first pass so they aren't included in the
20468 + // final amounts. This seems counterintuitive, since we're intentionally
20469 + // not measuring part of the render phase, but this makes it match what we
20470 + // do in Concurrent Mode.
20471 + primaryChildFragment.actualDuration = 0;
20472 + primaryChildFragment.actualStartTime = -1;
20473 + primaryChildFragment.selfBaseDuration = 0;
20474 + primaryChildFragment.treeBaseDuration = 0;
20475 + }
20476 +
20477 + fallbackChildFragment = createFiberFromFragment(fallbackChildren, mode, renderLanes, null);
20478 + } else {
20479 + primaryChildFragment = mountWorkInProgressOffscreenFiber(primaryChildProps, mode);
20480 + fallbackChildFragment = createFiberFromFragment(fallbackChildren, mode, renderLanes, null);
20481 + }
20482 +
20483 + primaryChildFragment.return = workInProgress;
20484 + fallbackChildFragment.return = workInProgress;
20485 + primaryChildFragment.sibling = fallbackChildFragment;
20486 + workInProgress.child = primaryChildFragment;
20487 + return fallbackChildFragment;
20488 + }
20489 +
20490 + function mountWorkInProgressOffscreenFiber(offscreenProps, mode, renderLanes) {
20491 + // The props argument to `createFiberFromOffscreen` is `any` typed, so we use
20492 + // this wrapper function to constrain it.
20493 + return createFiberFromOffscreen(offscreenProps, mode, NoLanes, null);
20494 + }
20495 +
20496 + function updateWorkInProgressOffscreenFiber(current, offscreenProps) {
20497 + // The props argument to `createWorkInProgress` is `any` typed, so we use this
20498 + // wrapper function to constrain it.
20499 + return createWorkInProgress(current, offscreenProps);
20500 + }
20501 +
20502 + function updateSuspensePrimaryChildren(current, workInProgress, primaryChildren, renderLanes) {
20503 + var currentPrimaryChildFragment = current.child;
20504 + var currentFallbackChildFragment = currentPrimaryChildFragment.sibling;
20505 + var primaryChildFragment = updateWorkInProgressOffscreenFiber(currentPrimaryChildFragment, {
20506 + mode: 'visible',
20507 + children: primaryChildren
20508 + });
20509 +
20510 + if ((workInProgress.mode & ConcurrentMode) === NoMode) {
20511 + primaryChildFragment.lanes = renderLanes;
20512 + }
20513 +
20514 + primaryChildFragment.return = workInProgress;
20515 + primaryChildFragment.sibling = null;
20516 +
20517 + if (currentFallbackChildFragment !== null) {
20518 + // Delete the fallback child fragment
20519 + var deletions = workInProgress.deletions;
20520 +
20521 + if (deletions === null) {
20522 + workInProgress.deletions = [currentFallbackChildFragment];
20523 + workInProgress.flags |= ChildDeletion;
20524 + } else {
20525 + deletions.push(currentFallbackChildFragment);
20526 + }
20527 + }
20528 +
20529 + workInProgress.child = primaryChildFragment;
20530 + return primaryChildFragment;
20531 + }
20532 +
20533 + function updateSuspenseFallbackChildren(current, workInProgress, primaryChildren, fallbackChildren, renderLanes) {
20534 + var mode = workInProgress.mode;
20535 + var currentPrimaryChildFragment = current.child;
20536 + var currentFallbackChildFragment = currentPrimaryChildFragment.sibling;
20537 + var primaryChildProps = {
20538 + mode: 'hidden',
20539 + children: primaryChildren
20540 + };
20541 + var primaryChildFragment;
20542 +
20543 + if ( // In legacy mode, we commit the primary tree as if it successfully
20544 + // completed, even though it's in an inconsistent state.
20545 + (mode & ConcurrentMode) === NoMode && // Make sure we're on the second pass, i.e. the primary child fragment was
20546 + // already cloned. In legacy mode, the only case where this isn't true is
20547 + // when DevTools forces us to display a fallback; we skip the first render
20548 + // pass entirely and go straight to rendering the fallback. (In Concurrent
20549 + // Mode, SuspenseList can also trigger this scenario, but this is a legacy-
20550 + // only codepath.)
20551 + workInProgress.child !== currentPrimaryChildFragment) {
20552 + var progressedPrimaryFragment = workInProgress.child;
20553 + primaryChildFragment = progressedPrimaryFragment;
20554 + primaryChildFragment.childLanes = NoLanes;
20555 + primaryChildFragment.pendingProps = primaryChildProps;
20556 +
20557 + if ( workInProgress.mode & ProfileMode) {
20558 + // Reset the durations from the first pass so they aren't included in the
20559 + // final amounts. This seems counterintuitive, since we're intentionally
20560 + // not measuring part of the render phase, but this makes it match what we
20561 + // do in Concurrent Mode.
20562 + primaryChildFragment.actualDuration = 0;
20563 + primaryChildFragment.actualStartTime = -1;
20564 + primaryChildFragment.selfBaseDuration = currentPrimaryChildFragment.selfBaseDuration;
20565 + primaryChildFragment.treeBaseDuration = currentPrimaryChildFragment.treeBaseDuration;
20566 + } // The fallback fiber was added as a deletion during the first pass.
20567 + // However, since we're going to remain on the fallback, we no longer want
20568 + // to delete it.
20569 +
20570 +
20571 + workInProgress.deletions = null;
20572 + } else {
20573 + primaryChildFragment = updateWorkInProgressOffscreenFiber(currentPrimaryChildFragment, primaryChildProps); // Since we're reusing a current tree, we need to reuse the flags, too.
20574 + // (We don't do this in legacy mode, because in legacy mode we don't re-use
20575 + // the current tree; see previous branch.)
20576 +
20577 + primaryChildFragment.subtreeFlags = currentPrimaryChildFragment.subtreeFlags & StaticMask;
20578 + }
20579 +
20580 + var fallbackChildFragment;
20581 +
20582 + if (currentFallbackChildFragment !== null) {
20583 + fallbackChildFragment = createWorkInProgress(currentFallbackChildFragment, fallbackChildren);
20584 + } else {
20585 + fallbackChildFragment = createFiberFromFragment(fallbackChildren, mode, renderLanes, null); // Needs a placement effect because the parent (the Suspense boundary) already
20586 + // mounted but this is a new fiber.
20587 +
20588 + fallbackChildFragment.flags |= Placement;
20589 + }
20590 +
20591 + fallbackChildFragment.return = workInProgress;
20592 + primaryChildFragment.return = workInProgress;
20593 + primaryChildFragment.sibling = fallbackChildFragment;
20594 + workInProgress.child = primaryChildFragment;
20595 + return fallbackChildFragment;
20596 + }
20597 +
20598 + function retrySuspenseComponentWithoutHydrating(current, workInProgress, renderLanes, recoverableError) {
20599 + // Falling back to client rendering. Because this has performance
20600 + // implications, it's considered a recoverable error, even though the user
20601 + // likely won't observe anything wrong with the UI.
20602 + //
20603 + // The error is passed in as an argument to enforce that every caller provide
20604 + // a custom message, or explicitly opt out (currently the only path that opts
20605 + // out is legacy mode; every concurrent path provides an error).
20606 + if (recoverableError !== null) {
20607 + queueHydrationError(recoverableError);
20608 + } // This will add the old fiber to the deletion list
20609 +
20610 +
20611 + reconcileChildFibers(workInProgress, current.child, null, renderLanes); // We're now not suspended nor dehydrated.
20612 +
20613 + var nextProps = workInProgress.pendingProps;
20614 + var primaryChildren = nextProps.children;
20615 + var primaryChildFragment = mountSuspensePrimaryChildren(workInProgress, primaryChildren); // Needs a placement effect because the parent (the Suspense boundary) already
20616 + // mounted but this is a new fiber.
20617 +
20618 + primaryChildFragment.flags |= Placement;
20619 + workInProgress.memoizedState = null;
20620 + return primaryChildFragment;
20621 + }
20622 +
20623 + function mountSuspenseFallbackAfterRetryWithoutHydrating(current, workInProgress, primaryChildren, fallbackChildren, renderLanes) {
20624 + var fiberMode = workInProgress.mode;
20625 + var primaryChildProps = {
20626 + mode: 'visible',
20627 + children: primaryChildren
20628 + };
20629 + var primaryChildFragment = mountWorkInProgressOffscreenFiber(primaryChildProps, fiberMode);
20630 + var fallbackChildFragment = createFiberFromFragment(fallbackChildren, fiberMode, renderLanes, null); // Needs a placement effect because the parent (the Suspense
20631 + // boundary) already mounted but this is a new fiber.
20632 +
20633 + fallbackChildFragment.flags |= Placement;
20634 + primaryChildFragment.return = workInProgress;
20635 + fallbackChildFragment.return = workInProgress;
20636 + primaryChildFragment.sibling = fallbackChildFragment;
20637 + workInProgress.child = primaryChildFragment;
20638 +
20639 + if ((workInProgress.mode & ConcurrentMode) !== NoMode) {
20640 + // We will have dropped the effect list which contains the
20641 + // deletion. We need to reconcile to delete the current child.
20642 + reconcileChildFibers(workInProgress, current.child, null, renderLanes);
20643 + }
20644 +
20645 + return fallbackChildFragment;
20646 + }
20647 +
20648 + function mountDehydratedSuspenseComponent(workInProgress, suspenseInstance, renderLanes) {
20649 + // During the first pass, we'll bail out and not drill into the children.
20650 + // Instead, we'll leave the content in place and try to hydrate it later.
20651 + if ((workInProgress.mode & ConcurrentMode) === NoMode) {
20652 + {
20653 + error('Cannot hydrate Suspense in legacy mode. Switch from ' + 'ReactDOM.hydrate(element, container) to ' + 'ReactDOMClient.hydrateRoot(container, <App />)' + '.render(element) or remove the Suspense components from ' + 'the server rendered components.');
20654 + }
20655 +
20656 + workInProgress.lanes = laneToLanes(SyncLane);
20657 + } else if (isSuspenseInstanceFallback(suspenseInstance)) {
20658 + // This is a client-only boundary. Since we won't get any content from the server
20659 + // for this, we need to schedule that at a higher priority based on when it would
20660 + // have timed out. In theory we could render it in this pass but it would have the
20661 + // wrong priority associated with it and will prevent hydration of parent path.
20662 + // Instead, we'll leave work left on it to render it in a separate commit.
20663 + // TODO This time should be the time at which the server rendered response that is
20664 + // a parent to this boundary was displayed. However, since we currently don't have
20665 + // a protocol to transfer that time, we'll just estimate it by using the current
20666 + // time. This will mean that Suspense timeouts are slightly shifted to later than
20667 + // they should be.
20668 + // Schedule a normal pri update to render this content.
20669 + workInProgress.lanes = laneToLanes(DefaultHydrationLane);
20670 + } else {
20671 + // We'll continue hydrating the rest at offscreen priority since we'll already
20672 + // be showing the right content coming from the server, it is no rush.
20673 + workInProgress.lanes = laneToLanes(OffscreenLane);
20674 + }
20675 +
20676 + return null;
20677 + }
20678 +
20679 + function updateDehydratedSuspenseComponent(current, workInProgress, didSuspend, nextProps, suspenseInstance, suspenseState, renderLanes) {
20680 + if (!didSuspend) {
20681 + // This is the first render pass. Attempt to hydrate.
20682 + // We should never be hydrating at this point because it is the first pass,
20683 + // but after we've already committed once.
20684 + warnIfHydrating();
20685 +
20686 + if ((workInProgress.mode & ConcurrentMode) === NoMode) {
20687 + return retrySuspenseComponentWithoutHydrating(current, workInProgress, renderLanes, // TODO: When we delete legacy mode, we should make this error argument
20688 + // required — every concurrent mode path that causes hydration to
20689 + // de-opt to client rendering should have an error message.
20690 + null);
20691 + }
20692 +
20693 + if (isSuspenseInstanceFallback(suspenseInstance)) {
20694 + // This boundary is in a permanent fallback state. In this case, we'll never
20695 + // get an update and we'll never be able to hydrate the final content. Let's just try the
20696 + // client side render instead.
20697 + var digest, message, stack;
20698 +
20699 + {
20700 + var _getSuspenseInstanceF = getSuspenseInstanceFallbackErrorDetails(suspenseInstance);
20701 +
20702 + digest = _getSuspenseInstanceF.digest;
20703 + message = _getSuspenseInstanceF.message;
20704 + stack = _getSuspenseInstanceF.stack;
20705 + }
20706 +
20707 + var error;
20708 +
20709 + if (message) {
20710 + // eslint-disable-next-line react-internal/prod-error-codes
20711 + error = new Error(message);
20712 + } else {
20713 + error = new Error('The server could not finish this Suspense boundary, likely ' + 'due to an error during server rendering. Switched to ' + 'client rendering.');
20714 + }
20715 +
20716 + var capturedValue = createCapturedValue(error, digest, stack);
20717 + return retrySuspenseComponentWithoutHydrating(current, workInProgress, renderLanes, capturedValue);
20718 + }
20719 + // any context has changed, we need to treat is as if the input might have changed.
20720 +
20721 +
20722 + var hasContextChanged = includesSomeLane(renderLanes, current.childLanes);
20723 +
20724 + if (didReceiveUpdate || hasContextChanged) {
20725 + // This boundary has changed since the first render. This means that we are now unable to
20726 + // hydrate it. We might still be able to hydrate it using a higher priority lane.
20727 + var root = getWorkInProgressRoot();
20728 +
20729 + if (root !== null) {
20730 + var attemptHydrationAtLane = getBumpedLaneForHydration(root, renderLanes);
20731 +
20732 + if (attemptHydrationAtLane !== NoLane && attemptHydrationAtLane !== suspenseState.retryLane) {
20733 + // Intentionally mutating since this render will get interrupted. This
20734 + // is one of the very rare times where we mutate the current tree
20735 + // during the render phase.
20736 + suspenseState.retryLane = attemptHydrationAtLane; // TODO: Ideally this would inherit the event time of the current render
20737 +
20738 + var eventTime = NoTimestamp;
20739 + enqueueConcurrentRenderForLane(current, attemptHydrationAtLane);
20740 + scheduleUpdateOnFiber(root, current, attemptHydrationAtLane, eventTime);
20741 + }
20742 + } // If we have scheduled higher pri work above, this will probably just abort the render
20743 + // since we now have higher priority work, but in case it doesn't, we need to prepare to
20744 + // render something, if we time out. Even if that requires us to delete everything and
20745 + // skip hydration.
20746 + // Delay having to do this as long as the suspense timeout allows us.
20747 +
20748 +
20749 + renderDidSuspendDelayIfPossible();
20750 +
20751 + var _capturedValue = createCapturedValue(new Error('This Suspense boundary received an update before it finished ' + 'hydrating. This caused the boundary to switch to client rendering. ' + 'The usual way to fix this is to wrap the original update ' + 'in startTransition.'));
20752 +
20753 + return retrySuspenseComponentWithoutHydrating(current, workInProgress, renderLanes, _capturedValue);
20754 + } else if (isSuspenseInstancePending(suspenseInstance)) {
20755 + // This component is still pending more data from the server, so we can't hydrate its
20756 + // content. We treat it as if this component suspended itself. It might seem as if
20757 + // we could just try to render it client-side instead. However, this will perform a
20758 + // lot of unnecessary work and is unlikely to complete since it often will suspend
20759 + // on missing data anyway. Additionally, the server might be able to render more
20760 + // than we can on the client yet. In that case we'd end up with more fallback states
20761 + // on the client than if we just leave it alone. If the server times out or errors
20762 + // these should update this boundary to the permanent Fallback state instead.
20763 + // Mark it as having captured (i.e. suspended).
20764 + workInProgress.flags |= DidCapture; // Leave the child in place. I.e. the dehydrated fragment.
20765 +
20766 + workInProgress.child = current.child; // Register a callback to retry this boundary once the server has sent the result.
20767 +
20768 + var retry = retryDehydratedSuspenseBoundary.bind(null, current);
20769 + registerSuspenseInstanceRetry(suspenseInstance, retry);
20770 + return null;
20771 + } else {
20772 + // This is the first attempt.
20773 + reenterHydrationStateFromDehydratedSuspenseInstance(workInProgress, suspenseInstance, suspenseState.treeContext);
20774 + var primaryChildren = nextProps.children;
20775 + var primaryChildFragment = mountSuspensePrimaryChildren(workInProgress, primaryChildren); // Mark the children as hydrating. This is a fast path to know whether this
20776 + // tree is part of a hydrating tree. This is used to determine if a child
20777 + // node has fully mounted yet, and for scheduling event replaying.
20778 + // Conceptually this is similar to Placement in that a new subtree is
20779 + // inserted into the React tree here. It just happens to not need DOM
20780 + // mutations because it already exists.
20781 +
20782 + primaryChildFragment.flags |= Hydrating;
20783 + return primaryChildFragment;
20784 + }
20785 + } else {
20786 + // This is the second render pass. We already attempted to hydrated, but
20787 + // something either suspended or errored.
20788 + if (workInProgress.flags & ForceClientRender) {
20789 + // Something errored during hydration. Try again without hydrating.
20790 + workInProgress.flags &= ~ForceClientRender;
20791 +
20792 + var _capturedValue2 = createCapturedValue(new Error('There was an error while hydrating this Suspense boundary. ' + 'Switched to client rendering.'));
20793 +
20794 + return retrySuspenseComponentWithoutHydrating(current, workInProgress, renderLanes, _capturedValue2);
20795 + } else if (workInProgress.memoizedState !== null) {
20796 + // Something suspended and we should still be in dehydrated mode.
20797 + // Leave the existing child in place.
20798 + workInProgress.child = current.child; // The dehydrated completion pass expects this flag to be there
20799 + // but the normal suspense pass doesn't.
20800 +
20801 + workInProgress.flags |= DidCapture;
20802 + return null;
20803 + } else {
20804 + // Suspended but we should no longer be in dehydrated mode.
20805 + // Therefore we now have to render the fallback.
20806 + var nextPrimaryChildren = nextProps.children;
20807 + var nextFallbackChildren = nextProps.fallback;
20808 + var fallbackChildFragment = mountSuspenseFallbackAfterRetryWithoutHydrating(current, workInProgress, nextPrimaryChildren, nextFallbackChildren, renderLanes);
20809 + var _primaryChildFragment4 = workInProgress.child;
20810 + _primaryChildFragment4.memoizedState = mountSuspenseOffscreenState(renderLanes);
20811 + workInProgress.memoizedState = SUSPENDED_MARKER;
20812 + return fallbackChildFragment;
20813 + }
20814 + }
20815 + }
20816 +
20817 + function scheduleSuspenseWorkOnFiber(fiber, renderLanes, propagationRoot) {
20818 + fiber.lanes = mergeLanes(fiber.lanes, renderLanes);
20819 + var alternate = fiber.alternate;
20820 +
20821 + if (alternate !== null) {
20822 + alternate.lanes = mergeLanes(alternate.lanes, renderLanes);
20823 + }
20824 +
20825 + scheduleContextWorkOnParentPath(fiber.return, renderLanes, propagationRoot);
20826 + }
20827 +
20828 + function propagateSuspenseContextChange(workInProgress, firstChild, renderLanes) {
20829 + // Mark any Suspense boundaries with fallbacks as having work to do.
20830 + // If they were previously forced into fallbacks, they may now be able
20831 + // to unblock.
20832 + var node = firstChild;
20833 +
20834 + while (node !== null) {
20835 + if (node.tag === SuspenseComponent) {
20836 + var state = node.memoizedState;
20837 +
20838 + if (state !== null) {
20839 + scheduleSuspenseWorkOnFiber(node, renderLanes, workInProgress);
20840 + }
20841 + } else if (node.tag === SuspenseListComponent) {
20842 + // If the tail is hidden there might not be an Suspense boundaries
20843 + // to schedule work on. In this case we have to schedule it on the
20844 + // list itself.
20845 + // We don't have to traverse to the children of the list since
20846 + // the list will propagate the change when it rerenders.
20847 + scheduleSuspenseWorkOnFiber(node, renderLanes, workInProgress);
20848 + } else if (node.child !== null) {
20849 + node.child.return = node;
20850 + node = node.child;
20851 + continue;
20852 + }
20853 +
20854 + if (node === workInProgress) {
20855 + return;
20856 + }
20857 +
20858 + while (node.sibling === null) {
20859 + if (node.return === null || node.return === workInProgress) {
20860 + return;
20861 + }
20862 +
20863 + node = node.return;
20864 + }
20865 +
20866 + node.sibling.return = node.return;
20867 + node = node.sibling;
20868 + }
20869 + }
20870 +
20871 + function findLastContentRow(firstChild) {
20872 + // This is going to find the last row among these children that is already
20873 + // showing content on the screen, as opposed to being in fallback state or
20874 + // new. If a row has multiple Suspense boundaries, any of them being in the
20875 + // fallback state, counts as the whole row being in a fallback state.
20876 + // Note that the "rows" will be workInProgress, but any nested children
20877 + // will still be current since we haven't rendered them yet. The mounted
20878 + // order may not be the same as the new order. We use the new order.
20879 + var row = firstChild;
20880 + var lastContentRow = null;
20881 +
20882 + while (row !== null) {
20883 + var currentRow = row.alternate; // New rows can't be content rows.
20884 +
20885 + if (currentRow !== null && findFirstSuspended(currentRow) === null) {
20886 + lastContentRow = row;
20887 + }
20888 +
20889 + row = row.sibling;
20890 + }
20891 +
20892 + return lastContentRow;
20893 + }
20894 +
20895 + function validateRevealOrder(revealOrder) {
20896 + {
20897 + if (revealOrder !== undefined && revealOrder !== 'forwards' && revealOrder !== 'backwards' && revealOrder !== 'together' && !didWarnAboutRevealOrder[revealOrder]) {
20898 + didWarnAboutRevealOrder[revealOrder] = true;
20899 +
20900 + if (typeof revealOrder === 'string') {
20901 + switch (revealOrder.toLowerCase()) {
20902 + case 'together':
20903 + case 'forwards':
20904 + case 'backwards':
20905 + {
20906 + error('"%s" is not a valid value for revealOrder on <SuspenseList />. ' + 'Use lowercase "%s" instead.', revealOrder, revealOrder.toLowerCase());
20907 +
20908 + break;
20909 + }
20910 +
20911 + case 'forward':
20912 + case 'backward':
20913 + {
20914 + error('"%s" is not a valid value for revealOrder on <SuspenseList />. ' + 'React uses the -s suffix in the spelling. Use "%ss" instead.', revealOrder, revealOrder.toLowerCase());
20915 +
20916 + break;
20917 + }
20918 +
20919 + default:
20920 + error('"%s" is not a supported revealOrder on <SuspenseList />. ' + 'Did you mean "together", "forwards" or "backwards"?', revealOrder);
20921 +
20922 + break;
20923 + }
20924 + } else {
20925 + error('%s is not a supported value for revealOrder on <SuspenseList />. ' + 'Did you mean "together", "forwards" or "backwards"?', revealOrder);
20926 + }
20927 + }
20928 + }
20929 + }
20930 +
20931 + function validateTailOptions(tailMode, revealOrder) {
20932 + {
20933 + if (tailMode !== undefined && !didWarnAboutTailOptions[tailMode]) {
20934 + if (tailMode !== 'collapsed' && tailMode !== 'hidden') {
20935 + didWarnAboutTailOptions[tailMode] = true;
20936 +
20937 + error('"%s" is not a supported value for tail on <SuspenseList />. ' + 'Did you mean "collapsed" or "hidden"?', tailMode);
20938 + } else if (revealOrder !== 'forwards' && revealOrder !== 'backwards') {
20939 + didWarnAboutTailOptions[tailMode] = true;
20940 +
20941 + error('<SuspenseList tail="%s" /> is only valid if revealOrder is ' + '"forwards" or "backwards". ' + 'Did you mean to specify revealOrder="forwards"?', tailMode);
20942 + }
20943 + }
20944 + }
20945 + }
20946 +
20947 + function validateSuspenseListNestedChild(childSlot, index) {
20948 + {
20949 + var isAnArray = isArray(childSlot);
20950 + var isIterable = !isAnArray && typeof getIteratorFn(childSlot) === 'function';
20951 +
20952 + if (isAnArray || isIterable) {
20953 + var type = isAnArray ? 'array' : 'iterable';
20954 +
20955 + error('A nested %s was passed to row #%s in <SuspenseList />. Wrap it in ' + 'an additional SuspenseList to configure its revealOrder: ' + '<SuspenseList revealOrder=...> ... ' + '<SuspenseList revealOrder=...>{%s}</SuspenseList> ... ' + '</SuspenseList>', type, index, type);
20956 +
20957 + return false;
20958 + }
20959 + }
20960 +
20961 + return true;
20962 + }
20963 +
20964 + function validateSuspenseListChildren(children, revealOrder) {
20965 + {
20966 + if ((revealOrder === 'forwards' || revealOrder === 'backwards') && children !== undefined && children !== null && children !== false) {
20967 + if (isArray(children)) {
20968 + for (var i = 0; i < children.length; i++) {
20969 + if (!validateSuspenseListNestedChild(children[i], i)) {
20970 + return;
20971 + }
20972 + }
20973 + } else {
20974 + var iteratorFn = getIteratorFn(children);
20975 +
20976 + if (typeof iteratorFn === 'function') {
20977 + var childrenIterator = iteratorFn.call(children);
20978 +
20979 + if (childrenIterator) {
20980 + var step = childrenIterator.next();
20981 + var _i = 0;
20982 +
20983 + for (; !step.done; step = childrenIterator.next()) {
20984 + if (!validateSuspenseListNestedChild(step.value, _i)) {
20985 + return;
20986 + }
20987 +
20988 + _i++;
20989 + }
20990 + }
20991 + } else {
20992 + error('A single row was passed to a <SuspenseList revealOrder="%s" />. ' + 'This is not useful since it needs multiple rows. ' + 'Did you mean to pass multiple children or an array?', revealOrder);
20993 + }
20994 + }
20995 + }
20996 + }
20997 + }
20998 +
20999 + function initSuspenseListRenderState(workInProgress, isBackwards, tail, lastContentRow, tailMode) {
21000 + var renderState = workInProgress.memoizedState;
21001 +
21002 + if (renderState === null) {
21003 + workInProgress.memoizedState = {
21004 + isBackwards: isBackwards,
21005 + rendering: null,
21006 + renderingStartTime: 0,
21007 + last: lastContentRow,
21008 + tail: tail,
21009 + tailMode: tailMode
21010 + };
21011 + } else {
21012 + // We can reuse the existing object from previous renders.
21013 + renderState.isBackwards = isBackwards;
21014 + renderState.rendering = null;
21015 + renderState.renderingStartTime = 0;
21016 + renderState.last = lastContentRow;
21017 + renderState.tail = tail;
21018 + renderState.tailMode = tailMode;
21019 + }
21020 + } // This can end up rendering this component multiple passes.
21021 + // The first pass splits the children fibers into two sets. A head and tail.
21022 + // We first render the head. If anything is in fallback state, we do another
21023 + // pass through beginWork to rerender all children (including the tail) with
21024 + // the force suspend context. If the first render didn't have anything in
21025 + // in fallback state. Then we render each row in the tail one-by-one.
21026 + // That happens in the completeWork phase without going back to beginWork.
21027 +
21028 +
21029 + function updateSuspenseListComponent(current, workInProgress, renderLanes) {
21030 + var nextProps = workInProgress.pendingProps;
21031 + var revealOrder = nextProps.revealOrder;
21032 + var tailMode = nextProps.tail;
21033 + var newChildren = nextProps.children;
21034 + validateRevealOrder(revealOrder);
21035 + validateTailOptions(tailMode, revealOrder);
21036 + validateSuspenseListChildren(newChildren, revealOrder);
21037 + reconcileChildren(current, workInProgress, newChildren, renderLanes);
21038 + var suspenseContext = suspenseStackCursor.current;
21039 + var shouldForceFallback = hasSuspenseContext(suspenseContext, ForceSuspenseFallback);
21040 +
21041 + if (shouldForceFallback) {
21042 + suspenseContext = setShallowSuspenseContext(suspenseContext, ForceSuspenseFallback);
21043 + workInProgress.flags |= DidCapture;
21044 + } else {
21045 + var didSuspendBefore = current !== null && (current.flags & DidCapture) !== NoFlags;
21046 +
21047 + if (didSuspendBefore) {
21048 + // If we previously forced a fallback, we need to schedule work
21049 + // on any nested boundaries to let them know to try to render
21050 + // again. This is the same as context updating.
21051 + propagateSuspenseContextChange(workInProgress, workInProgress.child, renderLanes);
21052 + }
21053 +
21054 + suspenseContext = setDefaultShallowSuspenseContext(suspenseContext);
21055 + }
21056 +
21057 + pushSuspenseContext(workInProgress, suspenseContext);
21058 +
21059 + if ((workInProgress.mode & ConcurrentMode) === NoMode) {
21060 + // In legacy mode, SuspenseList doesn't work so we just
21061 + // use make it a noop by treating it as the default revealOrder.
21062 + workInProgress.memoizedState = null;
21063 + } else {
21064 + switch (revealOrder) {
21065 + case 'forwards':
21066 + {
21067 + var lastContentRow = findLastContentRow(workInProgress.child);
21068 + var tail;
21069 +
21070 + if (lastContentRow === null) {
21071 + // The whole list is part of the tail.
21072 + // TODO: We could fast path by just rendering the tail now.
21073 + tail = workInProgress.child;
21074 + workInProgress.child = null;
21075 + } else {
21076 + // Disconnect the tail rows after the content row.
21077 + // We're going to render them separately later.
21078 + tail = lastContentRow.sibling;
21079 + lastContentRow.sibling = null;
21080 + }
21081 +
21082 + initSuspenseListRenderState(workInProgress, false, // isBackwards
21083 + tail, lastContentRow, tailMode);
21084 + break;
21085 + }
21086 +
21087 + case 'backwards':
21088 + {
21089 + // We're going to find the first row that has existing content.
21090 + // At the same time we're going to reverse the list of everything
21091 + // we pass in the meantime. That's going to be our tail in reverse
21092 + // order.
21093 + var _tail = null;
21094 + var row = workInProgress.child;
21095 + workInProgress.child = null;
21096 +
21097 + while (row !== null) {
21098 + var currentRow = row.alternate; // New rows can't be content rows.
21099 +
21100 + if (currentRow !== null && findFirstSuspended(currentRow) === null) {
21101 + // This is the beginning of the main content.
21102 + workInProgress.child = row;
21103 + break;
21104 + }
21105 +
21106 + var nextRow = row.sibling;
21107 + row.sibling = _tail;
21108 + _tail = row;
21109 + row = nextRow;
21110 + } // TODO: If workInProgress.child is null, we can continue on the tail immediately.
21111 +
21112 +
21113 + initSuspenseListRenderState(workInProgress, true, // isBackwards
21114 + _tail, null, // last
21115 + tailMode);
21116 + break;
21117 + }
21118 +
21119 + case 'together':
21120 + {
21121 + initSuspenseListRenderState(workInProgress, false, // isBackwards
21122 + null, // tail
21123 + null, // last
21124 + undefined);
21125 + break;
21126 + }
21127 +
21128 + default:
21129 + {
21130 + // The default reveal order is the same as not having
21131 + // a boundary.
21132 + workInProgress.memoizedState = null;
21133 + }
21134 + }
21135 + }
21136 +
21137 + return workInProgress.child;
21138 + }
21139 +
21140 + function updatePortalComponent(current, workInProgress, renderLanes) {
21141 + pushHostContainer(workInProgress, workInProgress.stateNode.containerInfo);
21142 + var nextChildren = workInProgress.pendingProps;
21143 +
21144 + if (current === null) {
21145 + // Portals are special because we don't append the children during mount
21146 + // but at commit. Therefore we need to track insertions which the normal
21147 + // flow doesn't do during mount. This doesn't happen at the root because
21148 + // the root always starts with a "current" with a null child.
21149 + // TODO: Consider unifying this with how the root works.
21150 + workInProgress.child = reconcileChildFibers(workInProgress, null, nextChildren, renderLanes);
21151 + } else {
21152 + reconcileChildren(current, workInProgress, nextChildren, renderLanes);
21153 + }
21154 +
21155 + return workInProgress.child;
21156 + }
21157 +
21158 + var hasWarnedAboutUsingNoValuePropOnContextProvider = false;
21159 +
21160 + function updateContextProvider(current, workInProgress, renderLanes) {
21161 + var providerType = workInProgress.type;
21162 + var context = providerType._context;
21163 + var newProps = workInProgress.pendingProps;
21164 + var oldProps = workInProgress.memoizedProps;
21165 + var newValue = newProps.value;
21166 +
21167 + {
21168 + if (!('value' in newProps)) {
21169 + if (!hasWarnedAboutUsingNoValuePropOnContextProvider) {
21170 + hasWarnedAboutUsingNoValuePropOnContextProvider = true;
21171 +
21172 + error('The `value` prop is required for the `<Context.Provider>`. Did you misspell it or forget to pass it?');
21173 + }
21174 + }
21175 +
21176 + var providerPropTypes = workInProgress.type.propTypes;
21177 +
21178 + if (providerPropTypes) {
21179 + checkPropTypes(providerPropTypes, newProps, 'prop', 'Context.Provider');
21180 + }
21181 + }
21182 +
21183 + pushProvider(workInProgress, context, newValue);
21184 +
21185 + {
21186 + if (oldProps !== null) {
21187 + var oldValue = oldProps.value;
21188 +
21189 + if (objectIs(oldValue, newValue)) {
21190 + // No change. Bailout early if children are the same.
21191 + if (oldProps.children === newProps.children && !hasContextChanged()) {
21192 + return bailoutOnAlreadyFinishedWork(current, workInProgress, renderLanes);
21193 + }
21194 + } else {
21195 + // The context value changed. Search for matching consumers and schedule
21196 + // them to update.
21197 + propagateContextChange(workInProgress, context, renderLanes);
21198 + }
21199 + }
21200 + }
21201 +
21202 + var newChildren = newProps.children;
21203 + reconcileChildren(current, workInProgress, newChildren, renderLanes);
21204 + return workInProgress.child;
21205 + }
21206 +
21207 + var hasWarnedAboutUsingContextAsConsumer = false;
21208 +
21209 + function updateContextConsumer(current, workInProgress, renderLanes) {
21210 + var context = workInProgress.type; // The logic below for Context differs depending on PROD or DEV mode. In
21211 + // DEV mode, we create a separate object for Context.Consumer that acts
21212 + // like a proxy to Context. This proxy object adds unnecessary code in PROD
21213 + // so we use the old behaviour (Context.Consumer references Context) to
21214 + // reduce size and overhead. The separate object references context via
21215 + // a property called "_context", which also gives us the ability to check
21216 + // in DEV mode if this property exists or not and warn if it does not.
21217 +
21218 + {
21219 + if (context._context === undefined) {
21220 + // This may be because it's a Context (rather than a Consumer).
21221 + // Or it may be because it's older React where they're the same thing.
21222 + // We only want to warn if we're sure it's a new React.
21223 + if (context !== context.Consumer) {
21224 + if (!hasWarnedAboutUsingContextAsConsumer) {
21225 + hasWarnedAboutUsingContextAsConsumer = true;
21226 +
21227 + error('Rendering <Context> directly is not supported and will be removed in ' + 'a future major release. Did you mean to render <Context.Consumer> instead?');
21228 + }
21229 + }
21230 + } else {
21231 + context = context._context;
21232 + }
21233 + }
21234 +
21235 + var newProps = workInProgress.pendingProps;
21236 + var render = newProps.children;
21237 +
21238 + {
21239 + if (typeof render !== 'function') {
21240 + error('A context consumer was rendered with multiple children, or a child ' + "that isn't a function. A context consumer expects a single child " + 'that is a function. If you did pass a function, make sure there ' + 'is no trailing or leading whitespace around it.');
21241 + }
21242 + }
21243 +
21244 + prepareToReadContext(workInProgress, renderLanes);
21245 + var newValue = readContext(context);
21246 +
21247 + {
21248 + markComponentRenderStarted(workInProgress);
21249 + }
21250 +
21251 + var newChildren;
21252 +
21253 + {
21254 + ReactCurrentOwner$1.current = workInProgress;
21255 + setIsRendering(true);
21256 + newChildren = render(newValue);
21257 + setIsRendering(false);
21258 + }
21259 +
21260 + {
21261 + markComponentRenderStopped();
21262 + } // React DevTools reads this flag.
21263 +
21264 +
21265 + workInProgress.flags |= PerformedWork;
21266 + reconcileChildren(current, workInProgress, newChildren, renderLanes);
21267 + return workInProgress.child;
21268 + }
21269 +
21270 + function markWorkInProgressReceivedUpdate() {
21271 + didReceiveUpdate = true;
21272 + }
21273 +
21274 + function resetSuspendedCurrentOnMountInLegacyMode(current, workInProgress) {
21275 + if ((workInProgress.mode & ConcurrentMode) === NoMode) {
21276 + if (current !== null) {
21277 + // A lazy component only mounts if it suspended inside a non-
21278 + // concurrent tree, in an inconsistent state. We want to treat it like
21279 + // a new mount, even though an empty version of it already committed.
21280 + // Disconnect the alternate pointers.
21281 + current.alternate = null;
21282 + workInProgress.alternate = null; // Since this is conceptually a new fiber, schedule a Placement effect
21283 +
21284 + workInProgress.flags |= Placement;
21285 + }
21286 + }
21287 + }
21288 +
21289 + function bailoutOnAlreadyFinishedWork(current, workInProgress, renderLanes) {
21290 + if (current !== null) {
21291 + // Reuse previous dependencies
21292 + workInProgress.dependencies = current.dependencies;
21293 + }
21294 +
21295 + {
21296 + // Don't update "base" render times for bailouts.
21297 + stopProfilerTimerIfRunning();
21298 + }
21299 +
21300 + markSkippedUpdateLanes(workInProgress.lanes); // Check if the children have any pending work.
21301 +
21302 + if (!includesSomeLane(renderLanes, workInProgress.childLanes)) {
21303 + // The children don't have any work either. We can skip them.
21304 + // TODO: Once we add back resuming, we should check if the children are
21305 + // a work-in-progress set. If so, we need to transfer their effects.
21306 + {
21307 + return null;
21308 + }
21309 + } // This fiber doesn't have work, but its subtree does. Clone the child
21310 + // fibers and continue.
21311 +
21312 +
21313 + cloneChildFibers(current, workInProgress);
21314 + return workInProgress.child;
21315 + }
21316 +
21317 + function remountFiber(current, oldWorkInProgress, newWorkInProgress) {
21318 + {
21319 + var returnFiber = oldWorkInProgress.return;
21320 +
21321 + if (returnFiber === null) {
21322 + // eslint-disable-next-line react-internal/prod-error-codes
21323 + throw new Error('Cannot swap the root fiber.');
21324 + } // Disconnect from the old current.
21325 + // It will get deleted.
21326 +
21327 +
21328 + current.alternate = null;
21329 + oldWorkInProgress.alternate = null; // Connect to the new tree.
21330 +
21331 + newWorkInProgress.index = oldWorkInProgress.index;
21332 + newWorkInProgress.sibling = oldWorkInProgress.sibling;
21333 + newWorkInProgress.return = oldWorkInProgress.return;
21334 + newWorkInProgress.ref = oldWorkInProgress.ref; // Replace the child/sibling pointers above it.
21335 +
21336 + if (oldWorkInProgress === returnFiber.child) {
21337 + returnFiber.child = newWorkInProgress;
21338 + } else {
21339 + var prevSibling = returnFiber.child;
21340 +
21341 + if (prevSibling === null) {
21342 + // eslint-disable-next-line react-internal/prod-error-codes
21343 + throw new Error('Expected parent to have a child.');
21344 + }
21345 +
21346 + while (prevSibling.sibling !== oldWorkInProgress) {
21347 + prevSibling = prevSibling.sibling;
21348 +
21349 + if (prevSibling === null) {
21350 + // eslint-disable-next-line react-internal/prod-error-codes
21351 + throw new Error('Expected to find the previous sibling.');
21352 + }
21353 + }
21354 +
21355 + prevSibling.sibling = newWorkInProgress;
21356 + } // Delete the old fiber and place the new one.
21357 + // Since the old fiber is disconnected, we have to schedule it manually.
21358 +
21359 +
21360 + var deletions = returnFiber.deletions;
21361 +
21362 + if (deletions === null) {
21363 + returnFiber.deletions = [current];
21364 + returnFiber.flags |= ChildDeletion;
21365 + } else {
21366 + deletions.push(current);
21367 + }
21368 +
21369 + newWorkInProgress.flags |= Placement; // Restart work from the new fiber.
21370 +
21371 + return newWorkInProgress;
21372 + }
21373 + }
21374 +
21375 + function checkScheduledUpdateOrContext(current, renderLanes) {
21376 + // Before performing an early bailout, we must check if there are pending
21377 + // updates or context.
21378 + var updateLanes = current.lanes;
21379 +
21380 + if (includesSomeLane(updateLanes, renderLanes)) {
21381 + return true;
21382 + } // No pending update, but because context is propagated lazily, we need
21383 +
21384 + return false;
21385 + }
21386 +
21387 + function attemptEarlyBailoutIfNoScheduledUpdate(current, workInProgress, renderLanes) {
21388 + // This fiber does not have any pending work. Bailout without entering
21389 + // the begin phase. There's still some bookkeeping we that needs to be done
21390 + // in this optimized path, mostly pushing stuff onto the stack.
21391 + switch (workInProgress.tag) {
21392 + case HostRoot:
21393 + pushHostRootContext(workInProgress);
21394 + var root = workInProgress.stateNode;
21395 +
21396 + resetHydrationState();
21397 + break;
21398 +
21399 + case HostComponent:
21400 + pushHostContext(workInProgress);
21401 + break;
21402 +
21403 + case ClassComponent:
21404 + {
21405 + var Component = workInProgress.type;
21406 +
21407 + if (isContextProvider(Component)) {
21408 + pushContextProvider(workInProgress);
21409 + }
21410 +
21411 + break;
21412 + }
21413 +
21414 + case HostPortal:
21415 + pushHostContainer(workInProgress, workInProgress.stateNode.containerInfo);
21416 + break;
21417 +
21418 + case ContextProvider:
21419 + {
21420 + var newValue = workInProgress.memoizedProps.value;
21421 + var context = workInProgress.type._context;
21422 + pushProvider(workInProgress, context, newValue);
21423 + break;
21424 + }
21425 +
21426 + case Profiler:
21427 + {
21428 + // Profiler should only call onRender when one of its descendants actually rendered.
21429 + var hasChildWork = includesSomeLane(renderLanes, workInProgress.childLanes);
21430 +
21431 + if (hasChildWork) {
21432 + workInProgress.flags |= Update;
21433 + }
21434 +
21435 + {
21436 + // Reset effect durations for the next eventual effect phase.
21437 + // These are reset during render to allow the DevTools commit hook a chance to read them,
21438 + var stateNode = workInProgress.stateNode;
21439 + stateNode.effectDuration = 0;
21440 + stateNode.passiveEffectDuration = 0;
21441 + }
21442 + }
21443 +
21444 + break;
21445 +
21446 + case SuspenseComponent:
21447 + {
21448 + var state = workInProgress.memoizedState;
21449 +
21450 + if (state !== null) {
21451 + if (state.dehydrated !== null) {
21452 + pushSuspenseContext(workInProgress, setDefaultShallowSuspenseContext(suspenseStackCursor.current)); // We know that this component will suspend again because if it has
21453 + // been unsuspended it has committed as a resolved Suspense component.
21454 + // If it needs to be retried, it should have work scheduled on it.
21455 +
21456 + workInProgress.flags |= DidCapture; // We should never render the children of a dehydrated boundary until we
21457 + // upgrade it. We return null instead of bailoutOnAlreadyFinishedWork.
21458 +
21459 + return null;
21460 + } // If this boundary is currently timed out, we need to decide
21461 + // whether to retry the primary children, or to skip over it and
21462 + // go straight to the fallback. Check the priority of the primary
21463 + // child fragment.
21464 +
21465 +
21466 + var primaryChildFragment = workInProgress.child;
21467 + var primaryChildLanes = primaryChildFragment.childLanes;
21468 +
21469 + if (includesSomeLane(renderLanes, primaryChildLanes)) {
21470 + // The primary children have pending work. Use the normal path
21471 + // to attempt to render the primary children again.
21472 + return updateSuspenseComponent(current, workInProgress, renderLanes);
21473 + } else {
21474 + // The primary child fragment does not have pending work marked
21475 + // on it
21476 + pushSuspenseContext(workInProgress, setDefaultShallowSuspenseContext(suspenseStackCursor.current)); // The primary children do not have pending work with sufficient
21477 + // priority. Bailout.
21478 +
21479 + var child = bailoutOnAlreadyFinishedWork(current, workInProgress, renderLanes);
21480 +
21481 + if (child !== null) {
21482 + // The fallback children have pending work. Skip over the
21483 + // primary children and work on the fallback.
21484 + return child.sibling;
21485 + } else {
21486 + // Note: We can return `null` here because we already checked
21487 + // whether there were nested context consumers, via the call to
21488 + // `bailoutOnAlreadyFinishedWork` above.
21489 + return null;
21490 + }
21491 + }
21492 + } else {
21493 + pushSuspenseContext(workInProgress, setDefaultShallowSuspenseContext(suspenseStackCursor.current));
21494 + }
21495 +
21496 + break;
21497 + }
21498 +
21499 + case SuspenseListComponent:
21500 + {
21501 + var didSuspendBefore = (current.flags & DidCapture) !== NoFlags;
21502 +
21503 + var _hasChildWork = includesSomeLane(renderLanes, workInProgress.childLanes);
21504 +
21505 + if (didSuspendBefore) {
21506 + if (_hasChildWork) {
21507 + // If something was in fallback state last time, and we have all the
21508 + // same children then we're still in progressive loading state.
21509 + // Something might get unblocked by state updates or retries in the
21510 + // tree which will affect the tail. So we need to use the normal
21511 + // path to compute the correct tail.
21512 + return updateSuspenseListComponent(current, workInProgress, renderLanes);
21513 + } // If none of the children had any work, that means that none of
21514 + // them got retried so they'll still be blocked in the same way
21515 + // as before. We can fast bail out.
21516 +
21517 +
21518 + workInProgress.flags |= DidCapture;
21519 + } // If nothing suspended before and we're rendering the same children,
21520 + // then the tail doesn't matter. Anything new that suspends will work
21521 + // in the "together" mode, so we can continue from the state we had.
21522 +
21523 +
21524 + var renderState = workInProgress.memoizedState;
21525 +
21526 + if (renderState !== null) {
21527 + // Reset to the "together" mode in case we've started a different
21528 + // update in the past but didn't complete it.
21529 + renderState.rendering = null;
21530 + renderState.tail = null;
21531 + renderState.lastEffect = null;
21532 + }
21533 +
21534 + pushSuspenseContext(workInProgress, suspenseStackCursor.current);
21535 +
21536 + if (_hasChildWork) {
21537 + break;
21538 + } else {
21539 + // If none of the children had any work, that means that none of
21540 + // them got retried so they'll still be blocked in the same way
21541 + // as before. We can fast bail out.
21542 + return null;
21543 + }
21544 + }
21545 +
21546 + case OffscreenComponent:
21547 + case LegacyHiddenComponent:
21548 + {
21549 + // Need to check if the tree still needs to be deferred. This is
21550 + // almost identical to the logic used in the normal update path,
21551 + // so we'll just enter that. The only difference is we'll bail out
21552 + // at the next level instead of this one, because the child props
21553 + // have not changed. Which is fine.
21554 + // TODO: Probably should refactor `beginWork` to split the bailout
21555 + // path from the normal path. I'm tempted to do a labeled break here
21556 + // but I won't :)
21557 + workInProgress.lanes = NoLanes;
21558 + return updateOffscreenComponent(current, workInProgress, renderLanes);
21559 + }
21560 + }
21561 +
21562 + return bailoutOnAlreadyFinishedWork(current, workInProgress, renderLanes);
21563 + }
21564 +
21565 + function beginWork(current, workInProgress, renderLanes) {
21566 + {
21567 + if (workInProgress._debugNeedsRemount && current !== null) {
21568 + // This will restart the begin phase with a new fiber.
21569 + return remountFiber(current, workInProgress, createFiberFromTypeAndProps(workInProgress.type, workInProgress.key, workInProgress.pendingProps, workInProgress._debugOwner || null, workInProgress.mode, workInProgress.lanes));
21570 + }
21571 + }
21572 +
21573 + if (current !== null) {
21574 + var oldProps = current.memoizedProps;
21575 + var newProps = workInProgress.pendingProps;
21576 +
21577 + if (oldProps !== newProps || hasContextChanged() || ( // Force a re-render if the implementation changed due to hot reload:
21578 + workInProgress.type !== current.type )) {
21579 + // If props or context changed, mark the fiber as having performed work.
21580 + // This may be unset if the props are determined to be equal later (memo).
21581 + didReceiveUpdate = true;
21582 + } else {
21583 + // Neither props nor legacy context changes. Check if there's a pending
21584 + // update or context change.
21585 + var hasScheduledUpdateOrContext = checkScheduledUpdateOrContext(current, renderLanes);
21586 +
21587 + if (!hasScheduledUpdateOrContext && // If this is the second pass of an error or suspense boundary, there
21588 + // may not be work scheduled on `current`, so we check for this flag.
21589 + (workInProgress.flags & DidCapture) === NoFlags) {
21590 + // No pending updates or context. Bail out now.
21591 + didReceiveUpdate = false;
21592 + return attemptEarlyBailoutIfNoScheduledUpdate(current, workInProgress, renderLanes);
21593 + }
21594 +
21595 + if ((current.flags & ForceUpdateForLegacySuspense) !== NoFlags) {
21596 + // This is a special case that only exists for legacy mode.
21597 + // See https://github.com/facebook/react/pull/19216.
21598 + didReceiveUpdate = true;
21599 + } else {
21600 + // An update was scheduled on this fiber, but there are no new props
21601 + // nor legacy context. Set this to false. If an update queue or context
21602 + // consumer produces a changed value, it will set this to true. Otherwise,
21603 + // the component will assume the children have not changed and bail out.
21604 + didReceiveUpdate = false;
21605 + }
21606 + }
21607 + } else {
21608 + didReceiveUpdate = false;
21609 +
21610 + if (getIsHydrating() && isForkedChild(workInProgress)) {
21611 + // Check if this child belongs to a list of muliple children in
21612 + // its parent.
21613 + //
21614 + // In a true multi-threaded implementation, we would render children on
21615 + // parallel threads. This would represent the beginning of a new render
21616 + // thread for this subtree.
21617 + //
21618 + // We only use this for id generation during hydration, which is why the
21619 + // logic is located in this special branch.
21620 + var slotIndex = workInProgress.index;
21621 + var numberOfForks = getForksAtLevel();
21622 + pushTreeId(workInProgress, numberOfForks, slotIndex);
21623 + }
21624 + } // Before entering the begin phase, clear pending update priority.
21625 + // TODO: This assumes that we're about to evaluate the component and process
21626 + // the update queue. However, there's an exception: SimpleMemoComponent
21627 + // sometimes bails out later in the begin phase. This indicates that we should
21628 + // move this assignment out of the common path and into each branch.
21629 +
21630 +
21631 + workInProgress.lanes = NoLanes;
21632 +
21633 + switch (workInProgress.tag) {
21634 + case IndeterminateComponent:
21635 + {
21636 + return mountIndeterminateComponent(current, workInProgress, workInProgress.type, renderLanes);
21637 + }
21638 +
21639 + case LazyComponent:
21640 + {
21641 + var elementType = workInProgress.elementType;
21642 + return mountLazyComponent(current, workInProgress, elementType, renderLanes);
21643 + }
21644 +
21645 + case FunctionComponent:
21646 + {
21647 + var Component = workInProgress.type;
21648 + var unresolvedProps = workInProgress.pendingProps;
21649 + var resolvedProps = workInProgress.elementType === Component ? unresolvedProps : resolveDefaultProps(Component, unresolvedProps);
21650 + return updateFunctionComponent(current, workInProgress, Component, resolvedProps, renderLanes);
21651 + }
21652 +
21653 + case ClassComponent:
21654 + {
21655 + var _Component = workInProgress.type;
21656 + var _unresolvedProps = workInProgress.pendingProps;
21657 +
21658 + var _resolvedProps = workInProgress.elementType === _Component ? _unresolvedProps : resolveDefaultProps(_Component, _unresolvedProps);
21659 +
21660 + return updateClassComponent(current, workInProgress, _Component, _resolvedProps, renderLanes);
21661 + }
21662 +
21663 + case HostRoot:
21664 + return updateHostRoot(current, workInProgress, renderLanes);
21665 +
21666 + case HostComponent:
21667 + return updateHostComponent(current, workInProgress, renderLanes);
21668 +
21669 + case HostText:
21670 + return updateHostText(current, workInProgress);
21671 +
21672 + case SuspenseComponent:
21673 + return updateSuspenseComponent(current, workInProgress, renderLanes);
21674 +
21675 + case HostPortal:
21676 + return updatePortalComponent(current, workInProgress, renderLanes);
21677 +
21678 + case ForwardRef:
21679 + {
21680 + var type = workInProgress.type;
21681 + var _unresolvedProps2 = workInProgress.pendingProps;
21682 +
21683 + var _resolvedProps2 = workInProgress.elementType === type ? _unresolvedProps2 : resolveDefaultProps(type, _unresolvedProps2);
21684 +
21685 + return updateForwardRef(current, workInProgress, type, _resolvedProps2, renderLanes);
21686 + }
21687 +
21688 + case Fragment:
21689 + return updateFragment(current, workInProgress, renderLanes);
21690 +
21691 + case Mode:
21692 + return updateMode(current, workInProgress, renderLanes);
21693 +
21694 + case Profiler:
21695 + return updateProfiler(current, workInProgress, renderLanes);
21696 +
21697 + case ContextProvider:
21698 + return updateContextProvider(current, workInProgress, renderLanes);
21699 +
21700 + case ContextConsumer:
21701 + return updateContextConsumer(current, workInProgress, renderLanes);
21702 +
21703 + case MemoComponent:
21704 + {
21705 + var _type2 = workInProgress.type;
21706 + var _unresolvedProps3 = workInProgress.pendingProps; // Resolve outer props first, then resolve inner props.
21707 +
21708 + var _resolvedProps3 = resolveDefaultProps(_type2, _unresolvedProps3);
21709 +
21710 + {
21711 + if (workInProgress.type !== workInProgress.elementType) {
21712 + var outerPropTypes = _type2.propTypes;
21713 +
21714 + if (outerPropTypes) {
21715 + checkPropTypes(outerPropTypes, _resolvedProps3, // Resolved for outer only
21716 + 'prop', getComponentNameFromType(_type2));
21717 + }
21718 + }
21719 + }
21720 +
21721 + _resolvedProps3 = resolveDefaultProps(_type2.type, _resolvedProps3);
21722 + return updateMemoComponent(current, workInProgress, _type2, _resolvedProps3, renderLanes);
21723 + }
21724 +
21725 + case SimpleMemoComponent:
21726 + {
21727 + return updateSimpleMemoComponent(current, workInProgress, workInProgress.type, workInProgress.pendingProps, renderLanes);
21728 + }
21729 +
21730 + case IncompleteClassComponent:
21731 + {
21732 + var _Component2 = workInProgress.type;
21733 + var _unresolvedProps4 = workInProgress.pendingProps;
21734 +
21735 + var _resolvedProps4 = workInProgress.elementType === _Component2 ? _unresolvedProps4 : resolveDefaultProps(_Component2, _unresolvedProps4);
21736 +
21737 + return mountIncompleteClassComponent(current, workInProgress, _Component2, _resolvedProps4, renderLanes);
21738 + }
21739 +
21740 + case SuspenseListComponent:
21741 + {
21742 + return updateSuspenseListComponent(current, workInProgress, renderLanes);
21743 + }
21744 +
21745 + case ScopeComponent:
21746 + {
21747 +
21748 + break;
21749 + }
21750 +
21751 + case OffscreenComponent:
21752 + {
21753 + return updateOffscreenComponent(current, workInProgress, renderLanes);
21754 + }
21755 + }
21756 +
21757 + throw new Error("Unknown unit of work tag (" + workInProgress.tag + "). This error is likely caused by a bug in " + 'React. Please file an issue.');
21758 + }
21759 +
21760 + function markUpdate(workInProgress) {
21761 + // Tag the fiber with an update effect. This turns a Placement into
21762 + // a PlacementAndUpdate.
21763 + workInProgress.flags |= Update;
21764 + }
21765 +
21766 + function markRef$1(workInProgress) {
21767 + workInProgress.flags |= Ref;
21768 +
21769 + {
21770 + workInProgress.flags |= RefStatic;
21771 + }
21772 + }
21773 +
21774 + var appendAllChildren;
21775 + var updateHostContainer;
21776 + var updateHostComponent$1;
21777 + var updateHostText$1;
21778 +
21779 + {
21780 + // Mutation mode
21781 + appendAllChildren = function (parent, workInProgress, needsVisibilityToggle, isHidden) {
21782 + // We only have the top Fiber that was created but we need recurse down its
21783 + // children to find all the terminal nodes.
21784 + var node = workInProgress.child;
21785 +
21786 + while (node !== null) {
21787 + if (node.tag === HostComponent || node.tag === HostText) {
21788 + appendInitialChild(parent, node.stateNode);
21789 + } else if (node.tag === HostPortal) ; else if (node.child !== null) {
21790 + node.child.return = node;
21791 + node = node.child;
21792 + continue;
21793 + }
21794 +
21795 + if (node === workInProgress) {
21796 + return;
21797 + }
21798 +
21799 + while (node.sibling === null) {
21800 + if (node.return === null || node.return === workInProgress) {
21801 + return;
21802 + }
21803 +
21804 + node = node.return;
21805 + }
21806 +
21807 + node.sibling.return = node.return;
21808 + node = node.sibling;
21809 + }
21810 + };
21811 +
21812 + updateHostContainer = function (current, workInProgress) {// Noop
21813 + };
21814 +
21815 + updateHostComponent$1 = function (current, workInProgress, type, newProps, rootContainerInstance) {
21816 + // If we have an alternate, that means this is an update and we need to
21817 + // schedule a side-effect to do the updates.
21818 + var oldProps = current.memoizedProps;
21819 +
21820 + if (oldProps === newProps) {
21821 + // In mutation mode, this is sufficient for a bailout because
21822 + // we won't touch this node even if children changed.
21823 + return;
21824 + } // If we get updated because one of our children updated, we don't
21825 + // have newProps so we'll have to reuse them.
21826 + // TODO: Split the update API as separate for the props vs. children.
21827 + // Even better would be if children weren't special cased at all tho.
21828 +
21829 +
21830 + var instance = workInProgress.stateNode;
21831 + var currentHostContext = getHostContext(); // TODO: Experiencing an error where oldProps is null. Suggests a host
21832 + // component is hitting the resume path. Figure out why. Possibly
21833 + // related to `hidden`.
21834 +
21835 + var updatePayload = prepareUpdate(instance, type, oldProps, newProps, rootContainerInstance, currentHostContext); // TODO: Type this specific to this type of component.
21836 +
21837 + workInProgress.updateQueue = updatePayload; // If the update payload indicates that there is a change or if there
21838 + // is a new ref we mark this as an update. All the work is done in commitWork.
21839 +
21840 + if (updatePayload) {
21841 + markUpdate(workInProgress);
21842 + }
21843 + };
21844 +
21845 + updateHostText$1 = function (current, workInProgress, oldText, newText) {
21846 + // If the text differs, mark it as an update. All the work in done in commitWork.
21847 + if (oldText !== newText) {
21848 + markUpdate(workInProgress);
21849 + }
21850 + };
21851 + }
21852 +
21853 + function cutOffTailIfNeeded(renderState, hasRenderedATailFallback) {
21854 + if (getIsHydrating()) {
21855 + // If we're hydrating, we should consume as many items as we can
21856 + // so we don't leave any behind.
21857 + return;
21858 + }
21859 +
21860 + switch (renderState.tailMode) {
21861 + case 'hidden':
21862 + {
21863 + // Any insertions at the end of the tail list after this point
21864 + // should be invisible. If there are already mounted boundaries
21865 + // anything before them are not considered for collapsing.
21866 + // Therefore we need to go through the whole tail to find if
21867 + // there are any.
21868 + var tailNode = renderState.tail;
21869 + var lastTailNode = null;
21870 +
21871 + while (tailNode !== null) {
21872 + if (tailNode.alternate !== null) {
21873 + lastTailNode = tailNode;
21874 + }
21875 +
21876 + tailNode = tailNode.sibling;
21877 + } // Next we're simply going to delete all insertions after the
21878 + // last rendered item.
21879 +
21880 +
21881 + if (lastTailNode === null) {
21882 + // All remaining items in the tail are insertions.
21883 + renderState.tail = null;
21884 + } else {
21885 + // Detach the insertion after the last node that was already
21886 + // inserted.
21887 + lastTailNode.sibling = null;
21888 + }
21889 +
21890 + break;
21891 + }
21892 +
21893 + case 'collapsed':
21894 + {
21895 + // Any insertions at the end of the tail list after this point
21896 + // should be invisible. If there are already mounted boundaries
21897 + // anything before them are not considered for collapsing.
21898 + // Therefore we need to go through the whole tail to find if
21899 + // there are any.
21900 + var _tailNode = renderState.tail;
21901 + var _lastTailNode = null;
21902 +
21903 + while (_tailNode !== null) {
21904 + if (_tailNode.alternate !== null) {
21905 + _lastTailNode = _tailNode;
21906 + }
21907 +
21908 + _tailNode = _tailNode.sibling;
21909 + } // Next we're simply going to delete all insertions after the
21910 + // last rendered item.
21911 +
21912 +
21913 + if (_lastTailNode === null) {
21914 + // All remaining items in the tail are insertions.
21915 + if (!hasRenderedATailFallback && renderState.tail !== null) {
21916 + // We suspended during the head. We want to show at least one
21917 + // row at the tail. So we'll keep on and cut off the rest.
21918 + renderState.tail.sibling = null;
21919 + } else {
21920 + renderState.tail = null;
21921 + }
21922 + } else {
21923 + // Detach the insertion after the last node that was already
21924 + // inserted.
21925 + _lastTailNode.sibling = null;
21926 + }
21927 +
21928 + break;
21929 + }
21930 + }
21931 + }
21932 +
21933 + function bubbleProperties(completedWork) {
21934 + var didBailout = completedWork.alternate !== null && completedWork.alternate.child === completedWork.child;
21935 + var newChildLanes = NoLanes;
21936 + var subtreeFlags = NoFlags;
21937 +
21938 + if (!didBailout) {
21939 + // Bubble up the earliest expiration time.
21940 + if ( (completedWork.mode & ProfileMode) !== NoMode) {
21941 + // In profiling mode, resetChildExpirationTime is also used to reset
21942 + // profiler durations.
21943 + var actualDuration = completedWork.actualDuration;
21944 + var treeBaseDuration = completedWork.selfBaseDuration;
21945 + var child = completedWork.child;
21946 +
21947 + while (child !== null) {
21948 + newChildLanes = mergeLanes(newChildLanes, mergeLanes(child.lanes, child.childLanes));
21949 + subtreeFlags |= child.subtreeFlags;
21950 + subtreeFlags |= child.flags; // When a fiber is cloned, its actualDuration is reset to 0. This value will
21951 + // only be updated if work is done on the fiber (i.e. it doesn't bailout).
21952 + // When work is done, it should bubble to the parent's actualDuration. If
21953 + // the fiber has not been cloned though, (meaning no work was done), then
21954 + // this value will reflect the amount of time spent working on a previous
21955 + // render. In that case it should not bubble. We determine whether it was
21956 + // cloned by comparing the child pointer.
21957 +
21958 + actualDuration += child.actualDuration;
21959 + treeBaseDuration += child.treeBaseDuration;
21960 + child = child.sibling;
21961 + }
21962 +
21963 + completedWork.actualDuration = actualDuration;
21964 + completedWork.treeBaseDuration = treeBaseDuration;
21965 + } else {
21966 + var _child = completedWork.child;
21967 +
21968 + while (_child !== null) {
21969 + newChildLanes = mergeLanes(newChildLanes, mergeLanes(_child.lanes, _child.childLanes));
21970 + subtreeFlags |= _child.subtreeFlags;
21971 + subtreeFlags |= _child.flags; // Update the return pointer so the tree is consistent. This is a code
21972 + // smell because it assumes the commit phase is never concurrent with
21973 + // the render phase. Will address during refactor to alternate model.
21974 +
21975 + _child.return = completedWork;
21976 + _child = _child.sibling;
21977 + }
21978 + }
21979 +
21980 + completedWork.subtreeFlags |= subtreeFlags;
21981 + } else {
21982 + // Bubble up the earliest expiration time.
21983 + if ( (completedWork.mode & ProfileMode) !== NoMode) {
21984 + // In profiling mode, resetChildExpirationTime is also used to reset
21985 + // profiler durations.
21986 + var _treeBaseDuration = completedWork.selfBaseDuration;
21987 + var _child2 = completedWork.child;
21988 +
21989 + while (_child2 !== null) {
21990 + newChildLanes = mergeLanes(newChildLanes, mergeLanes(_child2.lanes, _child2.childLanes)); // "Static" flags share the lifetime of the fiber/hook they belong to,
21991 + // so we should bubble those up even during a bailout. All the other
21992 + // flags have a lifetime only of a single render + commit, so we should
21993 + // ignore them.
21994 +
21995 + subtreeFlags |= _child2.subtreeFlags & StaticMask;
21996 + subtreeFlags |= _child2.flags & StaticMask;
21997 + _treeBaseDuration += _child2.treeBaseDuration;
21998 + _child2 = _child2.sibling;
21999 + }
22000 +
22001 + completedWork.treeBaseDuration = _treeBaseDuration;
22002 + } else {
22003 + var _child3 = completedWork.child;
22004 +
22005 + while (_child3 !== null) {
22006 + newChildLanes = mergeLanes(newChildLanes, mergeLanes(_child3.lanes, _child3.childLanes)); // "Static" flags share the lifetime of the fiber/hook they belong to,
22007 + // so we should bubble those up even during a bailout. All the other
22008 + // flags have a lifetime only of a single render + commit, so we should
22009 + // ignore them.
22010 +
22011 + subtreeFlags |= _child3.subtreeFlags & StaticMask;
22012 + subtreeFlags |= _child3.flags & StaticMask; // Update the return pointer so the tree is consistent. This is a code
22013 + // smell because it assumes the commit phase is never concurrent with
22014 + // the render phase. Will address during refactor to alternate model.
22015 +
22016 + _child3.return = completedWork;
22017 + _child3 = _child3.sibling;
22018 + }
22019 + }
22020 +
22021 + completedWork.subtreeFlags |= subtreeFlags;
22022 + }
22023 +
22024 + completedWork.childLanes = newChildLanes;
22025 + return didBailout;
22026 + }
22027 +
22028 + function completeDehydratedSuspenseBoundary(current, workInProgress, nextState) {
22029 + if (hasUnhydratedTailNodes() && (workInProgress.mode & ConcurrentMode) !== NoMode && (workInProgress.flags & DidCapture) === NoFlags) {
22030 + warnIfUnhydratedTailNodes(workInProgress);
22031 + resetHydrationState();
22032 + workInProgress.flags |= ForceClientRender | Incomplete | ShouldCapture;
22033 + return false;
22034 + }
22035 +
22036 + var wasHydrated = popHydrationState(workInProgress);
22037 +
22038 + if (nextState !== null && nextState.dehydrated !== null) {
22039 + // We might be inside a hydration state the first time we're picking up this
22040 + // Suspense boundary, and also after we've reentered it for further hydration.
22041 + if (current === null) {
22042 + if (!wasHydrated) {
22043 + throw new Error('A dehydrated suspense component was completed without a hydrated node. ' + 'This is probably a bug in React.');
22044 + }
22045 +
22046 + prepareToHydrateHostSuspenseInstance(workInProgress);
22047 + bubbleProperties(workInProgress);
22048 +
22049 + {
22050 + if ((workInProgress.mode & ProfileMode) !== NoMode) {
22051 + var isTimedOutSuspense = nextState !== null;
22052 +
22053 + if (isTimedOutSuspense) {
22054 + // Don't count time spent in a timed out Suspense subtree as part of the base duration.
22055 + var primaryChildFragment = workInProgress.child;
22056 +
22057 + if (primaryChildFragment !== null) {
22058 + // $FlowFixMe Flow doesn't support type casting in combination with the -= operator
22059 + workInProgress.treeBaseDuration -= primaryChildFragment.treeBaseDuration;
22060 + }
22061 + }
22062 + }
22063 + }
22064 +
22065 + return false;
22066 + } else {
22067 + // We might have reentered this boundary to hydrate it. If so, we need to reset the hydration
22068 + // state since we're now exiting out of it. popHydrationState doesn't do that for us.
22069 + resetHydrationState();
22070 +
22071 + if ((workInProgress.flags & DidCapture) === NoFlags) {
22072 + // This boundary did not suspend so it's now hydrated and unsuspended.
22073 + workInProgress.memoizedState = null;
22074 + } // If nothing suspended, we need to schedule an effect to mark this boundary
22075 + // as having hydrated so events know that they're free to be invoked.
22076 + // It's also a signal to replay events and the suspense callback.
22077 + // If something suspended, schedule an effect to attach retry listeners.
22078 + // So we might as well always mark this.
22079 +
22080 +
22081 + workInProgress.flags |= Update;
22082 + bubbleProperties(workInProgress);
22083 +
22084 + {
22085 + if ((workInProgress.mode & ProfileMode) !== NoMode) {
22086 + var _isTimedOutSuspense = nextState !== null;
22087 +
22088 + if (_isTimedOutSuspense) {
22089 + // Don't count time spent in a timed out Suspense subtree as part of the base duration.
22090 + var _primaryChildFragment = workInProgress.child;
22091 +
22092 + if (_primaryChildFragment !== null) {
22093 + // $FlowFixMe Flow doesn't support type casting in combination with the -= operator
22094 + workInProgress.treeBaseDuration -= _primaryChildFragment.treeBaseDuration;
22095 + }
22096 + }
22097 + }
22098 + }
22099 +
22100 + return false;
22101 + }
22102 + } else {
22103 + // Successfully completed this tree. If this was a forced client render,
22104 + // there may have been recoverable errors during first hydration
22105 + // attempt. If so, add them to a queue so we can log them in the
22106 + // commit phase.
22107 + upgradeHydrationErrorsToRecoverable(); // Fall through to normal Suspense path
22108 +
22109 + return true;
22110 + }
22111 + }
22112 +
22113 + function completeWork(current, workInProgress, renderLanes) {
22114 + var newProps = workInProgress.pendingProps; // Note: This intentionally doesn't check if we're hydrating because comparing
22115 + // to the current tree provider fiber is just as fast and less error-prone.
22116 + // Ideally we would have a special version of the work loop only
22117 + // for hydration.
22118 +
22119 + popTreeContext(workInProgress);
22120 +
22121 + switch (workInProgress.tag) {
22122 + case IndeterminateComponent:
22123 + case LazyComponent:
22124 + case SimpleMemoComponent:
22125 + case FunctionComponent:
22126 + case ForwardRef:
22127 + case Fragment:
22128 + case Mode:
22129 + case Profiler:
22130 + case ContextConsumer:
22131 + case MemoComponent:
22132 + bubbleProperties(workInProgress);
22133 + return null;
22134 +
22135 + case ClassComponent:
22136 + {
22137 + var Component = workInProgress.type;
22138 +
22139 + if (isContextProvider(Component)) {
22140 + popContext(workInProgress);
22141 + }
22142 +
22143 + bubbleProperties(workInProgress);
22144 + return null;
22145 + }
22146 +
22147 + case HostRoot:
22148 + {
22149 + var fiberRoot = workInProgress.stateNode;
22150 + popHostContainer(workInProgress);
22151 + popTopLevelContextObject(workInProgress);
22152 + resetWorkInProgressVersions();
22153 +
22154 + if (fiberRoot.pendingContext) {
22155 + fiberRoot.context = fiberRoot.pendingContext;
22156 + fiberRoot.pendingContext = null;
22157 + }
22158 +
22159 + if (current === null || current.child === null) {
22160 + // If we hydrated, pop so that we can delete any remaining children
22161 + // that weren't hydrated.
22162 + var wasHydrated = popHydrationState(workInProgress);
22163 +
22164 + if (wasHydrated) {
22165 + // If we hydrated, then we'll need to schedule an update for
22166 + // the commit side-effects on the root.
22167 + markUpdate(workInProgress);
22168 + } else {
22169 + if (current !== null) {
22170 + var prevState = current.memoizedState;
22171 +
22172 + if ( // Check if this is a client root
22173 + !prevState.isDehydrated || // Check if we reverted to client rendering (e.g. due to an error)
22174 + (workInProgress.flags & ForceClientRender) !== NoFlags) {
22175 + // Schedule an effect to clear this container at the start of the
22176 + // next commit. This handles the case of React rendering into a
22177 + // container with previous children. It's also safe to do for
22178 + // updates too, because current.child would only be null if the
22179 + // previous render was null (so the container would already
22180 + // be empty).
22181 + workInProgress.flags |= Snapshot; // If this was a forced client render, there may have been
22182 + // recoverable errors during first hydration attempt. If so, add
22183 + // them to a queue so we can log them in the commit phase.
22184 +
22185 + upgradeHydrationErrorsToRecoverable();
22186 + }
22187 + }
22188 + }
22189 + }
22190 +
22191 + updateHostContainer(current, workInProgress);
22192 + bubbleProperties(workInProgress);
22193 +
22194 + return null;
22195 + }
22196 +
22197 + case HostComponent:
22198 + {
22199 + popHostContext(workInProgress);
22200 + var rootContainerInstance = getRootHostContainer();
22201 + var type = workInProgress.type;
22202 +
22203 + if (current !== null && workInProgress.stateNode != null) {
22204 + updateHostComponent$1(current, workInProgress, type, newProps, rootContainerInstance);
22205 +
22206 + if (current.ref !== workInProgress.ref) {
22207 + markRef$1(workInProgress);
22208 + }
22209 + } else {
22210 + if (!newProps) {
22211 + if (workInProgress.stateNode === null) {
22212 + throw new Error('We must have new props for new mounts. This error is likely ' + 'caused by a bug in React. Please file an issue.');
22213 + } // This can happen when we abort work.
22214 +
22215 +
22216 + bubbleProperties(workInProgress);
22217 + return null;
22218 + }
22219 +
22220 + var currentHostContext = getHostContext(); // TODO: Move createInstance to beginWork and keep it on a context
22221 + // "stack" as the parent. Then append children as we go in beginWork
22222 + // or completeWork depending on whether we want to add them top->down or
22223 + // bottom->up. Top->down is faster in IE11.
22224 +
22225 + var _wasHydrated = popHydrationState(workInProgress);
22226 +
22227 + if (_wasHydrated) {
22228 + // TODO: Move this and createInstance step into the beginPhase
22229 + // to consolidate.
22230 + if (prepareToHydrateHostInstance(workInProgress, rootContainerInstance, currentHostContext)) {
22231 + // If changes to the hydrated node need to be applied at the
22232 + // commit-phase we mark this as such.
22233 + markUpdate(workInProgress);
22234 + }
22235 + } else {
22236 + var instance = createInstance(type, newProps, rootContainerInstance, currentHostContext, workInProgress);
22237 + appendAllChildren(instance, workInProgress, false, false);
22238 + workInProgress.stateNode = instance; // Certain renderers require commit-time effects for initial mount.
22239 + // (eg DOM renderer supports auto-focus for certain elements).
22240 + // Make sure such renderers get scheduled for later work.
22241 +
22242 + if (finalizeInitialChildren(instance, type, newProps, rootContainerInstance)) {
22243 + markUpdate(workInProgress);
22244 + }
22245 + }
22246 +
22247 + if (workInProgress.ref !== null) {
22248 + // If there is a ref on a host node we need to schedule a callback
22249 + markRef$1(workInProgress);
22250 + }
22251 + }
22252 +
22253 + bubbleProperties(workInProgress);
22254 + return null;
22255 + }
22256 +
22257 + case HostText:
22258 + {
22259 + var newText = newProps;
22260 +
22261 + if (current && workInProgress.stateNode != null) {
22262 + var oldText = current.memoizedProps; // If we have an alternate, that means this is an update and we need
22263 + // to schedule a side-effect to do the updates.
22264 +
22265 + updateHostText$1(current, workInProgress, oldText, newText);
22266 + } else {
22267 + if (typeof newText !== 'string') {
22268 + if (workInProgress.stateNode === null) {
22269 + throw new Error('We must have new props for new mounts. This error is likely ' + 'caused by a bug in React. Please file an issue.');
22270 + } // This can happen when we abort work.
22271 +
22272 + }
22273 +
22274 + var _rootContainerInstance = getRootHostContainer();
22275 +
22276 + var _currentHostContext = getHostContext();
22277 +
22278 + var _wasHydrated2 = popHydrationState(workInProgress);
22279 +
22280 + if (_wasHydrated2) {
22281 + if (prepareToHydrateHostTextInstance(workInProgress)) {
22282 + markUpdate(workInProgress);
22283 + }
22284 + } else {
22285 + workInProgress.stateNode = createTextInstance(newText, _rootContainerInstance, _currentHostContext, workInProgress);
22286 + }
22287 + }
22288 +
22289 + bubbleProperties(workInProgress);
22290 + return null;
22291 + }
22292 +
22293 + case SuspenseComponent:
22294 + {
22295 + popSuspenseContext(workInProgress);
22296 + var nextState = workInProgress.memoizedState; // Special path for dehydrated boundaries. We may eventually move this
22297 + // to its own fiber type so that we can add other kinds of hydration
22298 + // boundaries that aren't associated with a Suspense tree. In anticipation
22299 + // of such a refactor, all the hydration logic is contained in
22300 + // this branch.
22301 +
22302 + if (current === null || current.memoizedState !== null && current.memoizedState.dehydrated !== null) {
22303 + var fallthroughToNormalSuspensePath = completeDehydratedSuspenseBoundary(current, workInProgress, nextState);
22304 +
22305 + if (!fallthroughToNormalSuspensePath) {
22306 + if (workInProgress.flags & ShouldCapture) {
22307 + // Special case. There were remaining unhydrated nodes. We treat
22308 + // this as a mismatch. Revert to client rendering.
22309 + return workInProgress;
22310 + } else {
22311 + // Did not finish hydrating, either because this is the initial
22312 + // render or because something suspended.
22313 + return null;
22314 + }
22315 + } // Continue with the normal Suspense path.
22316 +
22317 + }
22318 +
22319 + if ((workInProgress.flags & DidCapture) !== NoFlags) {
22320 + // Something suspended. Re-render with the fallback children.
22321 + workInProgress.lanes = renderLanes; // Do not reset the effect list.
22322 +
22323 + if ( (workInProgress.mode & ProfileMode) !== NoMode) {
22324 + transferActualDuration(workInProgress);
22325 + } // Don't bubble properties in this case.
22326 +
22327 +
22328 + return workInProgress;
22329 + }
22330 +
22331 + var nextDidTimeout = nextState !== null;
22332 + var prevDidTimeout = current !== null && current.memoizedState !== null;
22333 + // a passive effect, which is when we process the transitions
22334 +
22335 +
22336 + if (nextDidTimeout !== prevDidTimeout) {
22337 + // an effect to toggle the subtree's visibility. When we switch from
22338 + // fallback -> primary, the inner Offscreen fiber schedules this effect
22339 + // as part of its normal complete phase. But when we switch from
22340 + // primary -> fallback, the inner Offscreen fiber does not have a complete
22341 + // phase. So we need to schedule its effect here.
22342 + //
22343 + // We also use this flag to connect/disconnect the effects, but the same
22344 + // logic applies: when re-connecting, the Offscreen fiber's complete
22345 + // phase will handle scheduling the effect. It's only when the fallback
22346 + // is active that we have to do anything special.
22347 +
22348 +
22349 + if (nextDidTimeout) {
22350 + var _offscreenFiber2 = workInProgress.child;
22351 + _offscreenFiber2.flags |= Visibility; // TODO: This will still suspend a synchronous tree if anything
22352 + // in the concurrent tree already suspended during this render.
22353 + // This is a known bug.
22354 +
22355 + if ((workInProgress.mode & ConcurrentMode) !== NoMode) {
22356 + // TODO: Move this back to throwException because this is too late
22357 + // if this is a large tree which is common for initial loads. We
22358 + // don't know if we should restart a render or not until we get
22359 + // this marker, and this is too late.
22360 + // If this render already had a ping or lower pri updates,
22361 + // and this is the first time we know we're going to suspend we
22362 + // should be able to immediately restart from within throwException.
22363 + var hasInvisibleChildContext = current === null && (workInProgress.memoizedProps.unstable_avoidThisFallback !== true || !enableSuspenseAvoidThisFallback);
22364 +
22365 + if (hasInvisibleChildContext || hasSuspenseContext(suspenseStackCursor.current, InvisibleParentSuspenseContext)) {
22366 + // If this was in an invisible tree or a new render, then showing
22367 + // this boundary is ok.
22368 + renderDidSuspend();
22369 + } else {
22370 + // Otherwise, we're going to have to hide content so we should
22371 + // suspend for longer if possible.
22372 + renderDidSuspendDelayIfPossible();
22373 + }
22374 + }
22375 + }
22376 + }
22377 +
22378 + var wakeables = workInProgress.updateQueue;
22379 +
22380 + if (wakeables !== null) {
22381 + // Schedule an effect to attach a retry listener to the promise.
22382 + // TODO: Move to passive phase
22383 + workInProgress.flags |= Update;
22384 + }
22385 +
22386 + bubbleProperties(workInProgress);
22387 +
22388 + {
22389 + if ((workInProgress.mode & ProfileMode) !== NoMode) {
22390 + if (nextDidTimeout) {
22391 + // Don't count time spent in a timed out Suspense subtree as part of the base duration.
22392 + var primaryChildFragment = workInProgress.child;
22393 +
22394 + if (primaryChildFragment !== null) {
22395 + // $FlowFixMe Flow doesn't support type casting in combination with the -= operator
22396 + workInProgress.treeBaseDuration -= primaryChildFragment.treeBaseDuration;
22397 + }
22398 + }
22399 + }
22400 + }
22401 +
22402 + return null;
22403 + }
22404 +
22405 + case HostPortal:
22406 + popHostContainer(workInProgress);
22407 + updateHostContainer(current, workInProgress);
22408 +
22409 + if (current === null) {
22410 + preparePortalMount(workInProgress.stateNode.containerInfo);
22411 + }
22412 +
22413 + bubbleProperties(workInProgress);
22414 + return null;
22415 +
22416 + case ContextProvider:
22417 + // Pop provider fiber
22418 + var context = workInProgress.type._context;
22419 + popProvider(context, workInProgress);
22420 + bubbleProperties(workInProgress);
22421 + return null;
22422 +
22423 + case IncompleteClassComponent:
22424 + {
22425 + // Same as class component case. I put it down here so that the tags are
22426 + // sequential to ensure this switch is compiled to a jump table.
22427 + var _Component = workInProgress.type;
22428 +
22429 + if (isContextProvider(_Component)) {
22430 + popContext(workInProgress);
22431 + }
22432 +
22433 + bubbleProperties(workInProgress);
22434 + return null;
22435 + }
22436 +
22437 + case SuspenseListComponent:
22438 + {
22439 + popSuspenseContext(workInProgress);
22440 + var renderState = workInProgress.memoizedState;
22441 +
22442 + if (renderState === null) {
22443 + // We're running in the default, "independent" mode.
22444 + // We don't do anything in this mode.
22445 + bubbleProperties(workInProgress);
22446 + return null;
22447 + }
22448 +
22449 + var didSuspendAlready = (workInProgress.flags & DidCapture) !== NoFlags;
22450 + var renderedTail = renderState.rendering;
22451 +
22452 + if (renderedTail === null) {
22453 + // We just rendered the head.
22454 + if (!didSuspendAlready) {
22455 + // This is the first pass. We need to figure out if anything is still
22456 + // suspended in the rendered set.
22457 + // If new content unsuspended, but there's still some content that
22458 + // didn't. Then we need to do a second pass that forces everything
22459 + // to keep showing their fallbacks.
22460 + // We might be suspended if something in this render pass suspended, or
22461 + // something in the previous committed pass suspended. Otherwise,
22462 + // there's no chance so we can skip the expensive call to
22463 + // findFirstSuspended.
22464 + var cannotBeSuspended = renderHasNotSuspendedYet() && (current === null || (current.flags & DidCapture) === NoFlags);
22465 +
22466 + if (!cannotBeSuspended) {
22467 + var row = workInProgress.child;
22468 +
22469 + while (row !== null) {
22470 + var suspended = findFirstSuspended(row);
22471 +
22472 + if (suspended !== null) {
22473 + didSuspendAlready = true;
22474 + workInProgress.flags |= DidCapture;
22475 + cutOffTailIfNeeded(renderState, false); // If this is a newly suspended tree, it might not get committed as
22476 + // part of the second pass. In that case nothing will subscribe to
22477 + // its thenables. Instead, we'll transfer its thenables to the
22478 + // SuspenseList so that it can retry if they resolve.
22479 + // There might be multiple of these in the list but since we're
22480 + // going to wait for all of them anyway, it doesn't really matter
22481 + // which ones gets to ping. In theory we could get clever and keep
22482 + // track of how many dependencies remain but it gets tricky because
22483 + // in the meantime, we can add/remove/change items and dependencies.
22484 + // We might bail out of the loop before finding any but that
22485 + // doesn't matter since that means that the other boundaries that
22486 + // we did find already has their listeners attached.
22487 +
22488 + var newThenables = suspended.updateQueue;
22489 +
22490 + if (newThenables !== null) {
22491 + workInProgress.updateQueue = newThenables;
22492 + workInProgress.flags |= Update;
22493 + } // Rerender the whole list, but this time, we'll force fallbacks
22494 + // to stay in place.
22495 + // Reset the effect flags before doing the second pass since that's now invalid.
22496 + // Reset the child fibers to their original state.
22497 +
22498 +
22499 + workInProgress.subtreeFlags = NoFlags;
22500 + resetChildFibers(workInProgress, renderLanes); // Set up the Suspense Context to force suspense and immediately
22501 + // rerender the children.
22502 +
22503 + pushSuspenseContext(workInProgress, setShallowSuspenseContext(suspenseStackCursor.current, ForceSuspenseFallback)); // Don't bubble properties in this case.
22504 +
22505 + return workInProgress.child;
22506 + }
22507 +
22508 + row = row.sibling;
22509 + }
22510 + }
22511 +
22512 + if (renderState.tail !== null && now() > getRenderTargetTime()) {
22513 + // We have already passed our CPU deadline but we still have rows
22514 + // left in the tail. We'll just give up further attempts to render
22515 + // the main content and only render fallbacks.
22516 + workInProgress.flags |= DidCapture;
22517 + didSuspendAlready = true;
22518 + cutOffTailIfNeeded(renderState, false); // Since nothing actually suspended, there will nothing to ping this
22519 + // to get it started back up to attempt the next item. While in terms
22520 + // of priority this work has the same priority as this current render,
22521 + // it's not part of the same transition once the transition has
22522 + // committed. If it's sync, we still want to yield so that it can be
22523 + // painted. Conceptually, this is really the same as pinging.
22524 + // We can use any RetryLane even if it's the one currently rendering
22525 + // since we're leaving it behind on this node.
22526 +
22527 + workInProgress.lanes = SomeRetryLane;
22528 + }
22529 + } else {
22530 + cutOffTailIfNeeded(renderState, false);
22531 + } // Next we're going to render the tail.
22532 +
22533 + } else {
22534 + // Append the rendered row to the child list.
22535 + if (!didSuspendAlready) {
22536 + var _suspended = findFirstSuspended(renderedTail);
22537 +
22538 + if (_suspended !== null) {
22539 + workInProgress.flags |= DidCapture;
22540 + didSuspendAlready = true; // Ensure we transfer the update queue to the parent so that it doesn't
22541 + // get lost if this row ends up dropped during a second pass.
22542 +
22543 + var _newThenables = _suspended.updateQueue;
22544 +
22545 + if (_newThenables !== null) {
22546 + workInProgress.updateQueue = _newThenables;
22547 + workInProgress.flags |= Update;
22548 + }
22549 +
22550 + cutOffTailIfNeeded(renderState, true); // This might have been modified.
22551 +
22552 + if (renderState.tail === null && renderState.tailMode === 'hidden' && !renderedTail.alternate && !getIsHydrating() // We don't cut it if we're hydrating.
22553 + ) {
22554 + // We're done.
22555 + bubbleProperties(workInProgress);
22556 + return null;
22557 + }
22558 + } else if ( // The time it took to render last row is greater than the remaining
22559 + // time we have to render. So rendering one more row would likely
22560 + // exceed it.
22561 + now() * 2 - renderState.renderingStartTime > getRenderTargetTime() && renderLanes !== OffscreenLane) {
22562 + // We have now passed our CPU deadline and we'll just give up further
22563 + // attempts to render the main content and only render fallbacks.
22564 + // The assumption is that this is usually faster.
22565 + workInProgress.flags |= DidCapture;
22566 + didSuspendAlready = true;
22567 + cutOffTailIfNeeded(renderState, false); // Since nothing actually suspended, there will nothing to ping this
22568 + // to get it started back up to attempt the next item. While in terms
22569 + // of priority this work has the same priority as this current render,
22570 + // it's not part of the same transition once the transition has
22571 + // committed. If it's sync, we still want to yield so that it can be
22572 + // painted. Conceptually, this is really the same as pinging.
22573 + // We can use any RetryLane even if it's the one currently rendering
22574 + // since we're leaving it behind on this node.
22575 +
22576 + workInProgress.lanes = SomeRetryLane;
22577 + }
22578 + }
22579 +
22580 + if (renderState.isBackwards) {
22581 + // The effect list of the backwards tail will have been added
22582 + // to the end. This breaks the guarantee that life-cycles fire in
22583 + // sibling order but that isn't a strong guarantee promised by React.
22584 + // Especially since these might also just pop in during future commits.
22585 + // Append to the beginning of the list.
22586 + renderedTail.sibling = workInProgress.child;
22587 + workInProgress.child = renderedTail;
22588 + } else {
22589 + var previousSibling = renderState.last;
22590 +
22591 + if (previousSibling !== null) {
22592 + previousSibling.sibling = renderedTail;
22593 + } else {
22594 + workInProgress.child = renderedTail;
22595 + }
22596 +
22597 + renderState.last = renderedTail;
22598 + }
22599 + }
22600 +
22601 + if (renderState.tail !== null) {
22602 + // We still have tail rows to render.
22603 + // Pop a row.
22604 + var next = renderState.tail;
22605 + renderState.rendering = next;
22606 + renderState.tail = next.sibling;
22607 + renderState.renderingStartTime = now();
22608 + next.sibling = null; // Restore the context.
22609 + // TODO: We can probably just avoid popping it instead and only
22610 + // setting it the first time we go from not suspended to suspended.
22611 +
22612 + var suspenseContext = suspenseStackCursor.current;
22613 +
22614 + if (didSuspendAlready) {
22615 + suspenseContext = setShallowSuspenseContext(suspenseContext, ForceSuspenseFallback);
22616 + } else {
22617 + suspenseContext = setDefaultShallowSuspenseContext(suspenseContext);
22618 + }
22619 +
22620 + pushSuspenseContext(workInProgress, suspenseContext); // Do a pass over the next row.
22621 + // Don't bubble properties in this case.
22622 +
22623 + return next;
22624 + }
22625 +
22626 + bubbleProperties(workInProgress);
22627 + return null;
22628 + }
22629 +
22630 + case ScopeComponent:
22631 + {
22632 +
22633 + break;
22634 + }
22635 +
22636 + case OffscreenComponent:
22637 + case LegacyHiddenComponent:
22638 + {
22639 + popRenderLanes(workInProgress);
22640 + var _nextState = workInProgress.memoizedState;
22641 + var nextIsHidden = _nextState !== null;
22642 +
22643 + if (current !== null) {
22644 + var _prevState = current.memoizedState;
22645 + var prevIsHidden = _prevState !== null;
22646 +
22647 + if (prevIsHidden !== nextIsHidden && ( // LegacyHidden doesn't do any hiding — it only pre-renders.
22648 + !enableLegacyHidden )) {
22649 + workInProgress.flags |= Visibility;
22650 + }
22651 + }
22652 +
22653 + if (!nextIsHidden || (workInProgress.mode & ConcurrentMode) === NoMode) {
22654 + bubbleProperties(workInProgress);
22655 + } else {
22656 + // Don't bubble properties for hidden children unless we're rendering
22657 + // at offscreen priority.
22658 + if (includesSomeLane(subtreeRenderLanes, OffscreenLane)) {
22659 + bubbleProperties(workInProgress);
22660 +
22661 + {
22662 + // Check if there was an insertion or update in the hidden subtree.
22663 + // If so, we need to hide those nodes in the commit phase, so
22664 + // schedule a visibility effect.
22665 + if ( workInProgress.subtreeFlags & (Placement | Update)) {
22666 + workInProgress.flags |= Visibility;
22667 + }
22668 + }
22669 + }
22670 + }
22671 + return null;
22672 + }
22673 +
22674 + case CacheComponent:
22675 + {
22676 +
22677 + return null;
22678 + }
22679 +
22680 + case TracingMarkerComponent:
22681 + {
22682 +
22683 + return null;
22684 + }
22685 + }
22686 +
22687 + throw new Error("Unknown unit of work tag (" + workInProgress.tag + "). This error is likely caused by a bug in " + 'React. Please file an issue.');
22688 + }
22689 +
22690 + function unwindWork(current, workInProgress, renderLanes) {
22691 + // Note: This intentionally doesn't check if we're hydrating because comparing
22692 + // to the current tree provider fiber is just as fast and less error-prone.
22693 + // Ideally we would have a special version of the work loop only
22694 + // for hydration.
22695 + popTreeContext(workInProgress);
22696 +
22697 + switch (workInProgress.tag) {
22698 + case ClassComponent:
22699 + {
22700 + var Component = workInProgress.type;
22701 +
22702 + if (isContextProvider(Component)) {
22703 + popContext(workInProgress);
22704 + }
22705 +
22706 + var flags = workInProgress.flags;
22707 +
22708 + if (flags & ShouldCapture) {
22709 + workInProgress.flags = flags & ~ShouldCapture | DidCapture;
22710 +
22711 + if ( (workInProgress.mode & ProfileMode) !== NoMode) {
22712 + transferActualDuration(workInProgress);
22713 + }
22714 +
22715 + return workInProgress;
22716 + }
22717 +
22718 + return null;
22719 + }
22720 +
22721 + case HostRoot:
22722 + {
22723 + var root = workInProgress.stateNode;
22724 + popHostContainer(workInProgress);
22725 + popTopLevelContextObject(workInProgress);
22726 + resetWorkInProgressVersions();
22727 + var _flags = workInProgress.flags;
22728 +
22729 + if ((_flags & ShouldCapture) !== NoFlags && (_flags & DidCapture) === NoFlags) {
22730 + // There was an error during render that wasn't captured by a suspense
22731 + // boundary. Do a second pass on the root to unmount the children.
22732 + workInProgress.flags = _flags & ~ShouldCapture | DidCapture;
22733 + return workInProgress;
22734 + } // We unwound to the root without completing it. Exit.
22735 +
22736 +
22737 + return null;
22738 + }
22739 +
22740 + case HostComponent:
22741 + {
22742 + // TODO: popHydrationState
22743 + popHostContext(workInProgress);
22744 + return null;
22745 + }
22746 +
22747 + case SuspenseComponent:
22748 + {
22749 + popSuspenseContext(workInProgress);
22750 + var suspenseState = workInProgress.memoizedState;
22751 +
22752 + if (suspenseState !== null && suspenseState.dehydrated !== null) {
22753 + if (workInProgress.alternate === null) {
22754 + throw new Error('Threw in newly mounted dehydrated component. This is likely a bug in ' + 'React. Please file an issue.');
22755 + }
22756 +
22757 + resetHydrationState();
22758 + }
22759 +
22760 + var _flags2 = workInProgress.flags;
22761 +
22762 + if (_flags2 & ShouldCapture) {
22763 + workInProgress.flags = _flags2 & ~ShouldCapture | DidCapture; // Captured a suspense effect. Re-render the boundary.
22764 +
22765 + if ( (workInProgress.mode & ProfileMode) !== NoMode) {
22766 + transferActualDuration(workInProgress);
22767 + }
22768 +
22769 + return workInProgress;
22770 + }
22771 +
22772 + return null;
22773 + }
22774 +
22775 + case SuspenseListComponent:
22776 + {
22777 + popSuspenseContext(workInProgress); // SuspenseList doesn't actually catch anything. It should've been
22778 + // caught by a nested boundary. If not, it should bubble through.
22779 +
22780 + return null;
22781 + }
22782 +
22783 + case HostPortal:
22784 + popHostContainer(workInProgress);
22785 + return null;
22786 +
22787 + case ContextProvider:
22788 + var context = workInProgress.type._context;
22789 + popProvider(context, workInProgress);
22790 + return null;
22791 +
22792 + case OffscreenComponent:
22793 + case LegacyHiddenComponent:
22794 + popRenderLanes(workInProgress);
22795 + return null;
22796 +
22797 + case CacheComponent:
22798 +
22799 + return null;
22800 +
22801 + default:
22802 + return null;
22803 + }
22804 + }
22805 +
22806 + function unwindInterruptedWork(current, interruptedWork, renderLanes) {
22807 + // Note: This intentionally doesn't check if we're hydrating because comparing
22808 + // to the current tree provider fiber is just as fast and less error-prone.
22809 + // Ideally we would have a special version of the work loop only
22810 + // for hydration.
22811 + popTreeContext(interruptedWork);
22812 +
22813 + switch (interruptedWork.tag) {
22814 + case ClassComponent:
22815 + {
22816 + var childContextTypes = interruptedWork.type.childContextTypes;
22817 +
22818 + if (childContextTypes !== null && childContextTypes !== undefined) {
22819 + popContext(interruptedWork);
22820 + }
22821 +
22822 + break;
22823 + }
22824 +
22825 + case HostRoot:
22826 + {
22827 + var root = interruptedWork.stateNode;
22828 + popHostContainer(interruptedWork);
22829 + popTopLevelContextObject(interruptedWork);
22830 + resetWorkInProgressVersions();
22831 + break;
22832 + }
22833 +
22834 + case HostComponent:
22835 + {
22836 + popHostContext(interruptedWork);
22837 + break;
22838 + }
22839 +
22840 + case HostPortal:
22841 + popHostContainer(interruptedWork);
22842 + break;
22843 +
22844 + case SuspenseComponent:
22845 + popSuspenseContext(interruptedWork);
22846 + break;
22847 +
22848 + case SuspenseListComponent:
22849 + popSuspenseContext(interruptedWork);
22850 + break;
22851 +
22852 + case ContextProvider:
22853 + var context = interruptedWork.type._context;
22854 + popProvider(context, interruptedWork);
22855 + break;
22856 +
22857 + case OffscreenComponent:
22858 + case LegacyHiddenComponent:
22859 + popRenderLanes(interruptedWork);
22860 + break;
22861 + }
22862 + }
22863 +
22864 + var didWarnAboutUndefinedSnapshotBeforeUpdate = null;
22865 +
22866 + {
22867 + didWarnAboutUndefinedSnapshotBeforeUpdate = new Set();
22868 + } // Used during the commit phase to track the state of the Offscreen component stack.
22869 + // Allows us to avoid traversing the return path to find the nearest Offscreen ancestor.
22870 + // Only used when enableSuspenseLayoutEffectSemantics is enabled.
22871 +
22872 +
22873 + var offscreenSubtreeIsHidden = false;
22874 + var offscreenSubtreeWasHidden = false;
22875 + var PossiblyWeakSet = typeof WeakSet === 'function' ? WeakSet : Set;
22876 + var nextEffect = null; // Used for Profiling builds to track updaters.
22877 +
22878 + var inProgressLanes = null;
22879 + var inProgressRoot = null;
22880 + function reportUncaughtErrorInDEV(error) {
22881 + // Wrapping each small part of the commit phase into a guarded
22882 + // callback is a bit too slow (https://github.com/facebook/react/pull/21666).
22883 + // But we rely on it to surface errors to DEV tools like overlays
22884 + // (https://github.com/facebook/react/issues/21712).
22885 + // As a compromise, rethrow only caught errors in a guard.
22886 + {
22887 + invokeGuardedCallback(null, function () {
22888 + throw error;
22889 + });
22890 + clearCaughtError();
22891 + }
22892 + }
22893 +
22894 + var callComponentWillUnmountWithTimer = function (current, instance) {
22895 + instance.props = current.memoizedProps;
22896 + instance.state = current.memoizedState;
22897 +
22898 + if ( current.mode & ProfileMode) {
22899 + try {
22900 + startLayoutEffectTimer();
22901 + instance.componentWillUnmount();
22902 + } finally {
22903 + recordLayoutEffectDuration(current);
22904 + }
22905 + } else {
22906 + instance.componentWillUnmount();
22907 + }
22908 + }; // Capture errors so they don't interrupt mounting.
22909 +
22910 +
22911 + function safelyCallCommitHookLayoutEffectListMount(current, nearestMountedAncestor) {
22912 + try {
22913 + commitHookEffectListMount(Layout, current);
22914 + } catch (error) {
22915 + captureCommitPhaseError(current, nearestMountedAncestor, error);
22916 + }
22917 + } // Capture errors so they don't interrupt unmounting.
22918 +
22919 +
22920 + function safelyCallComponentWillUnmount(current, nearestMountedAncestor, instance) {
22921 + try {
22922 + callComponentWillUnmountWithTimer(current, instance);
22923 + } catch (error) {
22924 + captureCommitPhaseError(current, nearestMountedAncestor, error);
22925 + }
22926 + } // Capture errors so they don't interrupt mounting.
22927 +
22928 +
22929 + function safelyCallComponentDidMount(current, nearestMountedAncestor, instance) {
22930 + try {
22931 + instance.componentDidMount();
22932 + } catch (error) {
22933 + captureCommitPhaseError(current, nearestMountedAncestor, error);
22934 + }
22935 + } // Capture errors so they don't interrupt mounting.
22936 +
22937 +
22938 + function safelyAttachRef(current, nearestMountedAncestor) {
22939 + try {
22940 + commitAttachRef(current);
22941 + } catch (error) {
22942 + captureCommitPhaseError(current, nearestMountedAncestor, error);
22943 + }
22944 + }
22945 +
22946 + function safelyDetachRef(current, nearestMountedAncestor) {
22947 + var ref = current.ref;
22948 +
22949 + if (ref !== null) {
22950 + if (typeof ref === 'function') {
22951 + var retVal;
22952 +
22953 + try {
22954 + if (enableProfilerTimer && enableProfilerCommitHooks && current.mode & ProfileMode) {
22955 + try {
22956 + startLayoutEffectTimer();
22957 + retVal = ref(null);
22958 + } finally {
22959 + recordLayoutEffectDuration(current);
22960 + }
22961 + } else {
22962 + retVal = ref(null);
22963 + }
22964 + } catch (error) {
22965 + captureCommitPhaseError(current, nearestMountedAncestor, error);
22966 + }
22967 +
22968 + {
22969 + if (typeof retVal === 'function') {
22970 + error('Unexpected return value from a callback ref in %s. ' + 'A callback ref should not return a function.', getComponentNameFromFiber(current));
22971 + }
22972 + }
22973 + } else {
22974 + ref.current = null;
22975 + }
22976 + }
22977 + }
22978 +
22979 + function safelyCallDestroy(current, nearestMountedAncestor, destroy) {
22980 + try {
22981 + destroy();
22982 + } catch (error) {
22983 + captureCommitPhaseError(current, nearestMountedAncestor, error);
22984 + }
22985 + }
22986 +
22987 + var focusedInstanceHandle = null;
22988 + var shouldFireAfterActiveInstanceBlur = false;
22989 + function commitBeforeMutationEffects(root, firstChild) {
22990 + focusedInstanceHandle = prepareForCommit(root.containerInfo);
22991 + nextEffect = firstChild;
22992 + commitBeforeMutationEffects_begin(); // We no longer need to track the active instance fiber
22993 +
22994 + var shouldFire = shouldFireAfterActiveInstanceBlur;
22995 + shouldFireAfterActiveInstanceBlur = false;
22996 + focusedInstanceHandle = null;
22997 + return shouldFire;
22998 + }
22999 +
23000 + function commitBeforeMutationEffects_begin() {
23001 + while (nextEffect !== null) {
23002 + var fiber = nextEffect; // This phase is only used for beforeActiveInstanceBlur.
23003 +
23004 + var child = fiber.child;
23005 +
23006 + if ((fiber.subtreeFlags & BeforeMutationMask) !== NoFlags && child !== null) {
23007 + child.return = fiber;
23008 + nextEffect = child;
23009 + } else {
23010 + commitBeforeMutationEffects_complete();
23011 + }
23012 + }
23013 + }
23014 +
23015 + function commitBeforeMutationEffects_complete() {
23016 + while (nextEffect !== null) {
23017 + var fiber = nextEffect;
23018 + setCurrentFiber(fiber);
23019 +
23020 + try {
23021 + commitBeforeMutationEffectsOnFiber(fiber);
23022 + } catch (error) {
23023 + captureCommitPhaseError(fiber, fiber.return, error);
23024 + }
23025 +
23026 + resetCurrentFiber();
23027 + var sibling = fiber.sibling;
23028 +
23029 + if (sibling !== null) {
23030 + sibling.return = fiber.return;
23031 + nextEffect = sibling;
23032 + return;
23033 + }
23034 +
23035 + nextEffect = fiber.return;
23036 + }
23037 + }
23038 +
23039 + function commitBeforeMutationEffectsOnFiber(finishedWork) {
23040 + var current = finishedWork.alternate;
23041 + var flags = finishedWork.flags;
23042 +
23043 + if ((flags & Snapshot) !== NoFlags) {
23044 + setCurrentFiber(finishedWork);
23045 +
23046 + switch (finishedWork.tag) {
23047 + case FunctionComponent:
23048 + case ForwardRef:
23049 + case SimpleMemoComponent:
23050 + {
23051 + break;
23052 + }
23053 +
23054 + case ClassComponent:
23055 + {
23056 + if (current !== null) {
23057 + var prevProps = current.memoizedProps;
23058 + var prevState = current.memoizedState;
23059 + var instance = finishedWork.stateNode; // We could update instance props and state here,
23060 + // but instead we rely on them being set during last render.
23061 + // TODO: revisit this when we implement resuming.
23062 +
23063 + {
23064 + if (finishedWork.type === finishedWork.elementType && !didWarnAboutReassigningProps) {
23065 + if (instance.props !== finishedWork.memoizedProps) {
23066 + error('Expected %s props to match memoized props before ' + 'getSnapshotBeforeUpdate. ' + 'This might either be because of a bug in React, or because ' + 'a component reassigns its own `this.props`. ' + 'Please file an issue.', getComponentNameFromFiber(finishedWork) || 'instance');
23067 + }
23068 +
23069 + if (instance.state !== finishedWork.memoizedState) {
23070 + error('Expected %s state to match memoized state before ' + 'getSnapshotBeforeUpdate. ' + 'This might either be because of a bug in React, or because ' + 'a component reassigns its own `this.state`. ' + 'Please file an issue.', getComponentNameFromFiber(finishedWork) || 'instance');
23071 + }
23072 + }
23073 + }
23074 +
23075 + var snapshot = instance.getSnapshotBeforeUpdate(finishedWork.elementType === finishedWork.type ? prevProps : resolveDefaultProps(finishedWork.type, prevProps), prevState);
23076 +
23077 + {
23078 + var didWarnSet = didWarnAboutUndefinedSnapshotBeforeUpdate;
23079 +
23080 + if (snapshot === undefined && !didWarnSet.has(finishedWork.type)) {
23081 + didWarnSet.add(finishedWork.type);
23082 +
23083 + error('%s.getSnapshotBeforeUpdate(): A snapshot value (or null) ' + 'must be returned. You have returned undefined.', getComponentNameFromFiber(finishedWork));
23084 + }
23085 + }
23086 +
23087 + instance.__reactInternalSnapshotBeforeUpdate = snapshot;
23088 + }
23089 +
23090 + break;
23091 + }
23092 +
23093 + case HostRoot:
23094 + {
23095 + {
23096 + var root = finishedWork.stateNode;
23097 + clearContainer(root.containerInfo);
23098 + }
23099 +
23100 + break;
23101 + }
23102 +
23103 + case HostComponent:
23104 + case HostText:
23105 + case HostPortal:
23106 + case IncompleteClassComponent:
23107 + // Nothing to do for these component types
23108 + break;
23109 +
23110 + default:
23111 + {
23112 + throw new Error('This unit of work tag should not have side-effects. This error is ' + 'likely caused by a bug in React. Please file an issue.');
23113 + }
23114 + }
23115 +
23116 + resetCurrentFiber();
23117 + }
23118 + }
23119 +
23120 + function commitHookEffectListUnmount(flags, finishedWork, nearestMountedAncestor) {
23121 + var updateQueue = finishedWork.updateQueue;
23122 + var lastEffect = updateQueue !== null ? updateQueue.lastEffect : null;
23123 +
23124 + if (lastEffect !== null) {
23125 + var firstEffect = lastEffect.next;
23126 + var effect = firstEffect;
23127 +
23128 + do {
23129 + if ((effect.tag & flags) === flags) {
23130 + // Unmount
23131 + var destroy = effect.destroy;
23132 + effect.destroy = undefined;
23133 +
23134 + if (destroy !== undefined) {
23135 + {
23136 + if ((flags & Passive$1) !== NoFlags$1) {
23137 + markComponentPassiveEffectUnmountStarted(finishedWork);
23138 + } else if ((flags & Layout) !== NoFlags$1) {
23139 + markComponentLayoutEffectUnmountStarted(finishedWork);
23140 + }
23141 + }
23142 +
23143 + {
23144 + if ((flags & Insertion) !== NoFlags$1) {
23145 + setIsRunningInsertionEffect(true);
23146 + }
23147 + }
23148 +
23149 + safelyCallDestroy(finishedWork, nearestMountedAncestor, destroy);
23150 +
23151 + {
23152 + if ((flags & Insertion) !== NoFlags$1) {
23153 + setIsRunningInsertionEffect(false);
23154 + }
23155 + }
23156 +
23157 + {
23158 + if ((flags & Passive$1) !== NoFlags$1) {
23159 + markComponentPassiveEffectUnmountStopped();
23160 + } else if ((flags & Layout) !== NoFlags$1) {
23161 + markComponentLayoutEffectUnmountStopped();
23162 + }
23163 + }
23164 + }
23165 + }
23166 +
23167 + effect = effect.next;
23168 + } while (effect !== firstEffect);
23169 + }
23170 + }
23171 +
23172 + function commitHookEffectListMount(flags, finishedWork) {
23173 + var updateQueue = finishedWork.updateQueue;
23174 + var lastEffect = updateQueue !== null ? updateQueue.lastEffect : null;
23175 +
23176 + if (lastEffect !== null) {
23177 + var firstEffect = lastEffect.next;
23178 + var effect = firstEffect;
23179 +
23180 + do {
23181 + if ((effect.tag & flags) === flags) {
23182 + {
23183 + if ((flags & Passive$1) !== NoFlags$1) {
23184 + markComponentPassiveEffectMountStarted(finishedWork);
23185 + } else if ((flags & Layout) !== NoFlags$1) {
23186 + markComponentLayoutEffectMountStarted(finishedWork);
23187 + }
23188 + } // Mount
23189 +
23190 +
23191 + var create = effect.create;
23192 +
23193 + {
23194 + if ((flags & Insertion) !== NoFlags$1) {
23195 + setIsRunningInsertionEffect(true);
23196 + }
23197 + }
23198 +
23199 + effect.destroy = create();
23200 +
23201 + {
23202 + if ((flags & Insertion) !== NoFlags$1) {
23203 + setIsRunningInsertionEffect(false);
23204 + }
23205 + }
23206 +
23207 + {
23208 + if ((flags & Passive$1) !== NoFlags$1) {
23209 + markComponentPassiveEffectMountStopped();
23210 + } else if ((flags & Layout) !== NoFlags$1) {
23211 + markComponentLayoutEffectMountStopped();
23212 + }
23213 + }
23214 +
23215 + {
23216 + var destroy = effect.destroy;
23217 +
23218 + if (destroy !== undefined && typeof destroy !== 'function') {
23219 + var hookName = void 0;
23220 +
23221 + if ((effect.tag & Layout) !== NoFlags) {
23222 + hookName = 'useLayoutEffect';
23223 + } else if ((effect.tag & Insertion) !== NoFlags) {
23224 + hookName = 'useInsertionEffect';
23225 + } else {
23226 + hookName = 'useEffect';
23227 + }
23228 +
23229 + var addendum = void 0;
23230 +
23231 + if (destroy === null) {
23232 + addendum = ' You returned null. If your effect does not require clean ' + 'up, return undefined (or nothing).';
23233 + } else if (typeof destroy.then === 'function') {
23234 + addendum = '\n\nIt looks like you wrote ' + hookName + '(async () => ...) or returned a Promise. ' + 'Instead, write the async function inside your effect ' + 'and call it immediately:\n\n' + hookName + '(() => {\n' + ' async function fetchData() {\n' + ' // You can await here\n' + ' const response = await MyAPI.getData(someId);\n' + ' // ...\n' + ' }\n' + ' fetchData();\n' + "}, [someId]); // Or [] if effect doesn't need props or state\n\n" + 'Learn more about data fetching with Hooks: https://reactjs.org/link/hooks-data-fetching';
23235 + } else {
23236 + addendum = ' You returned: ' + destroy;
23237 + }
23238 +
23239 + error('%s must not return anything besides a function, ' + 'which is used for clean-up.%s', hookName, addendum);
23240 + }
23241 + }
23242 + }
23243 +
23244 + effect = effect.next;
23245 + } while (effect !== firstEffect);
23246 + }
23247 + }
23248 +
23249 + function commitPassiveEffectDurations(finishedRoot, finishedWork) {
23250 + {
23251 + // Only Profilers with work in their subtree will have an Update effect scheduled.
23252 + if ((finishedWork.flags & Update) !== NoFlags) {
23253 + switch (finishedWork.tag) {
23254 + case Profiler:
23255 + {
23256 + var passiveEffectDuration = finishedWork.stateNode.passiveEffectDuration;
23257 + var _finishedWork$memoize = finishedWork.memoizedProps,
23258 + id = _finishedWork$memoize.id,
23259 + onPostCommit = _finishedWork$memoize.onPostCommit; // This value will still reflect the previous commit phase.
23260 + // It does not get reset until the start of the next commit phase.
23261 +
23262 + var commitTime = getCommitTime();
23263 + var phase = finishedWork.alternate === null ? 'mount' : 'update';
23264 +
23265 + {
23266 + if (isCurrentUpdateNested()) {
23267 + phase = 'nested-update';
23268 + }
23269 + }
23270 +
23271 + if (typeof onPostCommit === 'function') {
23272 + onPostCommit(id, phase, passiveEffectDuration, commitTime);
23273 + } // Bubble times to the next nearest ancestor Profiler.
23274 + // After we process that Profiler, we'll bubble further up.
23275 +
23276 +
23277 + var parentFiber = finishedWork.return;
23278 +
23279 + outer: while (parentFiber !== null) {
23280 + switch (parentFiber.tag) {
23281 + case HostRoot:
23282 + var root = parentFiber.stateNode;
23283 + root.passiveEffectDuration += passiveEffectDuration;
23284 + break outer;
23285 +
23286 + case Profiler:
23287 + var parentStateNode = parentFiber.stateNode;
23288 + parentStateNode.passiveEffectDuration += passiveEffectDuration;
23289 + break outer;
23290 + }
23291 +
23292 + parentFiber = parentFiber.return;
23293 + }
23294 +
23295 + break;
23296 + }
23297 + }
23298 + }
23299 + }
23300 + }
23301 +
23302 + function commitLayoutEffectOnFiber(finishedRoot, current, finishedWork, committedLanes) {
23303 + if ((finishedWork.flags & LayoutMask) !== NoFlags) {
23304 + switch (finishedWork.tag) {
23305 + case FunctionComponent:
23306 + case ForwardRef:
23307 + case SimpleMemoComponent:
23308 + {
23309 + if ( !offscreenSubtreeWasHidden) {
23310 + // At this point layout effects have already been destroyed (during mutation phase).
23311 + // This is done to prevent sibling component effects from interfering with each other,
23312 + // e.g. a destroy function in one component should never override a ref set
23313 + // by a create function in another component during the same commit.
23314 + if ( finishedWork.mode & ProfileMode) {
23315 + try {
23316 + startLayoutEffectTimer();
23317 + commitHookEffectListMount(Layout | HasEffect, finishedWork);
23318 + } finally {
23319 + recordLayoutEffectDuration(finishedWork);
23320 + }
23321 + } else {
23322 + commitHookEffectListMount(Layout | HasEffect, finishedWork);
23323 + }
23324 + }
23325 +
23326 + break;
23327 + }
23328 +
23329 + case ClassComponent:
23330 + {
23331 + var instance = finishedWork.stateNode;
23332 +
23333 + if (finishedWork.flags & Update) {
23334 + if (!offscreenSubtreeWasHidden) {
23335 + if (current === null) {
23336 + // We could update instance props and state here,
23337 + // but instead we rely on them being set during last render.
23338 + // TODO: revisit this when we implement resuming.
23339 + {
23340 + if (finishedWork.type === finishedWork.elementType && !didWarnAboutReassigningProps) {
23341 + if (instance.props !== finishedWork.memoizedProps) {
23342 + error('Expected %s props to match memoized props before ' + 'componentDidMount. ' + 'This might either be because of a bug in React, or because ' + 'a component reassigns its own `this.props`. ' + 'Please file an issue.', getComponentNameFromFiber(finishedWork) || 'instance');
23343 + }
23344 +
23345 + if (instance.state !== finishedWork.memoizedState) {
23346 + error('Expected %s state to match memoized state before ' + 'componentDidMount. ' + 'This might either be because of a bug in React, or because ' + 'a component reassigns its own `this.state`. ' + 'Please file an issue.', getComponentNameFromFiber(finishedWork) || 'instance');
23347 + }
23348 + }
23349 + }
23350 +
23351 + if ( finishedWork.mode & ProfileMode) {
23352 + try {
23353 + startLayoutEffectTimer();
23354 + instance.componentDidMount();
23355 + } finally {
23356 + recordLayoutEffectDuration(finishedWork);
23357 + }
23358 + } else {
23359 + instance.componentDidMount();
23360 + }
23361 + } else {
23362 + var prevProps = finishedWork.elementType === finishedWork.type ? current.memoizedProps : resolveDefaultProps(finishedWork.type, current.memoizedProps);
23363 + var prevState = current.memoizedState; // We could update instance props and state here,
23364 + // but instead we rely on them being set during last render.
23365 + // TODO: revisit this when we implement resuming.
23366 +
23367 + {
23368 + if (finishedWork.type === finishedWork.elementType && !didWarnAboutReassigningProps) {
23369 + if (instance.props !== finishedWork.memoizedProps) {
23370 + error('Expected %s props to match memoized props before ' + 'componentDidUpdate. ' + 'This might either be because of a bug in React, or because ' + 'a component reassigns its own `this.props`. ' + 'Please file an issue.', getComponentNameFromFiber(finishedWork) || 'instance');
23371 + }
23372 +
23373 + if (instance.state !== finishedWork.memoizedState) {
23374 + error('Expected %s state to match memoized state before ' + 'componentDidUpdate. ' + 'This might either be because of a bug in React, or because ' + 'a component reassigns its own `this.state`. ' + 'Please file an issue.', getComponentNameFromFiber(finishedWork) || 'instance');
23375 + }
23376 + }
23377 + }
23378 +
23379 + if ( finishedWork.mode & ProfileMode) {
23380 + try {
23381 + startLayoutEffectTimer();
23382 + instance.componentDidUpdate(prevProps, prevState, instance.__reactInternalSnapshotBeforeUpdate);
23383 + } finally {
23384 + recordLayoutEffectDuration(finishedWork);
23385 + }
23386 + } else {
23387 + instance.componentDidUpdate(prevProps, prevState, instance.__reactInternalSnapshotBeforeUpdate);
23388 + }
23389 + }
23390 + }
23391 + } // TODO: I think this is now always non-null by the time it reaches the
23392 + // commit phase. Consider removing the type check.
23393 +
23394 +
23395 + var updateQueue = finishedWork.updateQueue;
23396 +
23397 + if (updateQueue !== null) {
23398 + {
23399 + if (finishedWork.type === finishedWork.elementType && !didWarnAboutReassigningProps) {
23400 + if (instance.props !== finishedWork.memoizedProps) {
23401 + error('Expected %s props to match memoized props before ' + 'processing the update queue. ' + 'This might either be because of a bug in React, or because ' + 'a component reassigns its own `this.props`. ' + 'Please file an issue.', getComponentNameFromFiber(finishedWork) || 'instance');
23402 + }
23403 +
23404 + if (instance.state !== finishedWork.memoizedState) {
23405 + error('Expected %s state to match memoized state before ' + 'processing the update queue. ' + 'This might either be because of a bug in React, or because ' + 'a component reassigns its own `this.state`. ' + 'Please file an issue.', getComponentNameFromFiber(finishedWork) || 'instance');
23406 + }
23407 + }
23408 + } // We could update instance props and state here,
23409 + // but instead we rely on them being set during last render.
23410 + // TODO: revisit this when we implement resuming.
23411 +
23412 +
23413 + commitUpdateQueue(finishedWork, updateQueue, instance);
23414 + }
23415 +
23416 + break;
23417 + }
23418 +
23419 + case HostRoot:
23420 + {
23421 + // TODO: I think this is now always non-null by the time it reaches the
23422 + // commit phase. Consider removing the type check.
23423 + var _updateQueue = finishedWork.updateQueue;
23424 +
23425 + if (_updateQueue !== null) {
23426 + var _instance = null;
23427 +
23428 + if (finishedWork.child !== null) {
23429 + switch (finishedWork.child.tag) {
23430 + case HostComponent:
23431 + _instance = getPublicInstance(finishedWork.child.stateNode);
23432 + break;
23433 +
23434 + case ClassComponent:
23435 + _instance = finishedWork.child.stateNode;
23436 + break;
23437 + }
23438 + }
23439 +
23440 + commitUpdateQueue(finishedWork, _updateQueue, _instance);
23441 + }
23442 +
23443 + break;
23444 + }
23445 +
23446 + case HostComponent:
23447 + {
23448 + var _instance2 = finishedWork.stateNode; // Renderers may schedule work to be done after host components are mounted
23449 + // (eg DOM renderer may schedule auto-focus for inputs and form controls).
23450 + // These effects should only be committed when components are first mounted,
23451 + // aka when there is no current/alternate.
23452 +
23453 + if (current === null && finishedWork.flags & Update) {
23454 + var type = finishedWork.type;
23455 + var props = finishedWork.memoizedProps;
23456 + commitMount(_instance2, type, props);
23457 + }
23458 +
23459 + break;
23460 + }
23461 +
23462 + case HostText:
23463 + {
23464 + // We have no life-cycles associated with text.
23465 + break;
23466 + }
23467 +
23468 + case HostPortal:
23469 + {
23470 + // We have no life-cycles associated with portals.
23471 + break;
23472 + }
23473 +
23474 + case Profiler:
23475 + {
23476 + {
23477 + var _finishedWork$memoize2 = finishedWork.memoizedProps,
23478 + onCommit = _finishedWork$memoize2.onCommit,
23479 + onRender = _finishedWork$memoize2.onRender;
23480 + var effectDuration = finishedWork.stateNode.effectDuration;
23481 + var commitTime = getCommitTime();
23482 + var phase = current === null ? 'mount' : 'update';
23483 +
23484 + {
23485 + if (isCurrentUpdateNested()) {
23486 + phase = 'nested-update';
23487 + }
23488 + }
23489 +
23490 + if (typeof onRender === 'function') {
23491 + onRender(finishedWork.memoizedProps.id, phase, finishedWork.actualDuration, finishedWork.treeBaseDuration, finishedWork.actualStartTime, commitTime);
23492 + }
23493 +
23494 + {
23495 + if (typeof onCommit === 'function') {
23496 + onCommit(finishedWork.memoizedProps.id, phase, effectDuration, commitTime);
23497 + } // Schedule a passive effect for this Profiler to call onPostCommit hooks.
23498 + // This effect should be scheduled even if there is no onPostCommit callback for this Profiler,
23499 + // because the effect is also where times bubble to parent Profilers.
23500 +
23501 +
23502 + enqueuePendingPassiveProfilerEffect(finishedWork); // Propagate layout effect durations to the next nearest Profiler ancestor.
23503 + // Do not reset these values until the next render so DevTools has a chance to read them first.
23504 +
23505 + var parentFiber = finishedWork.return;
23506 +
23507 + outer: while (parentFiber !== null) {
23508 + switch (parentFiber.tag) {
23509 + case HostRoot:
23510 + var root = parentFiber.stateNode;
23511 + root.effectDuration += effectDuration;
23512 + break outer;
23513 +
23514 + case Profiler:
23515 + var parentStateNode = parentFiber.stateNode;
23516 + parentStateNode.effectDuration += effectDuration;
23517 + break outer;
23518 + }
23519 +
23520 + parentFiber = parentFiber.return;
23521 + }
23522 + }
23523 + }
23524 +
23525 + break;
23526 + }
23527 +
23528 + case SuspenseComponent:
23529 + {
23530 + commitSuspenseHydrationCallbacks(finishedRoot, finishedWork);
23531 + break;
23532 + }
23533 +
23534 + case SuspenseListComponent:
23535 + case IncompleteClassComponent:
23536 + case ScopeComponent:
23537 + case OffscreenComponent:
23538 + case LegacyHiddenComponent:
23539 + case TracingMarkerComponent:
23540 + {
23541 + break;
23542 + }
23543 +
23544 + default:
23545 + throw new Error('This unit of work tag should not have side-effects. This error is ' + 'likely caused by a bug in React. Please file an issue.');
23546 + }
23547 + }
23548 +
23549 + if ( !offscreenSubtreeWasHidden) {
23550 + {
23551 + if (finishedWork.flags & Ref) {
23552 + commitAttachRef(finishedWork);
23553 + }
23554 + }
23555 + }
23556 + }
23557 +
23558 + function reappearLayoutEffectsOnFiber(node) {
23559 + // Turn on layout effects in a tree that previously disappeared.
23560 + // TODO (Offscreen) Check: flags & LayoutStatic
23561 + switch (node.tag) {
23562 + case FunctionComponent:
23563 + case ForwardRef:
23564 + case SimpleMemoComponent:
23565 + {
23566 + if ( node.mode & ProfileMode) {
23567 + try {
23568 + startLayoutEffectTimer();
23569 + safelyCallCommitHookLayoutEffectListMount(node, node.return);
23570 + } finally {
23571 + recordLayoutEffectDuration(node);
23572 + }
23573 + } else {
23574 + safelyCallCommitHookLayoutEffectListMount(node, node.return);
23575 + }
23576 +
23577 + break;
23578 + }
23579 +
23580 + case ClassComponent:
23581 + {
23582 + var instance = node.stateNode;
23583 +
23584 + if (typeof instance.componentDidMount === 'function') {
23585 + safelyCallComponentDidMount(node, node.return, instance);
23586 + }
23587 +
23588 + safelyAttachRef(node, node.return);
23589 + break;
23590 + }
23591 +
23592 + case HostComponent:
23593 + {
23594 + safelyAttachRef(node, node.return);
23595 + break;
23596 + }
23597 + }
23598 + }
23599 +
23600 + function hideOrUnhideAllChildren(finishedWork, isHidden) {
23601 + // Only hide or unhide the top-most host nodes.
23602 + var hostSubtreeRoot = null;
23603 +
23604 + {
23605 + // We only have the top Fiber that was inserted but we need to recurse down its
23606 + // children to find all the terminal nodes.
23607 + var node = finishedWork;
23608 +
23609 + while (true) {
23610 + if (node.tag === HostComponent) {
23611 + if (hostSubtreeRoot === null) {
23612 + hostSubtreeRoot = node;
23613 +
23614 + try {
23615 + var instance = node.stateNode;
23616 +
23617 + if (isHidden) {
23618 + hideInstance(instance);
23619 + } else {
23620 + unhideInstance(node.stateNode, node.memoizedProps);
23621 + }
23622 + } catch (error) {
23623 + captureCommitPhaseError(finishedWork, finishedWork.return, error);
23624 + }
23625 + }
23626 + } else if (node.tag === HostText) {
23627 + if (hostSubtreeRoot === null) {
23628 + try {
23629 + var _instance3 = node.stateNode;
23630 +
23631 + if (isHidden) {
23632 + hideTextInstance(_instance3);
23633 + } else {
23634 + unhideTextInstance(_instance3, node.memoizedProps);
23635 + }
23636 + } catch (error) {
23637 + captureCommitPhaseError(finishedWork, finishedWork.return, error);
23638 + }
23639 + }
23640 + } else if ((node.tag === OffscreenComponent || node.tag === LegacyHiddenComponent) && node.memoizedState !== null && node !== finishedWork) ; else if (node.child !== null) {
23641 + node.child.return = node;
23642 + node = node.child;
23643 + continue;
23644 + }
23645 +
23646 + if (node === finishedWork) {
23647 + return;
23648 + }
23649 +
23650 + while (node.sibling === null) {
23651 + if (node.return === null || node.return === finishedWork) {
23652 + return;
23653 + }
23654 +
23655 + if (hostSubtreeRoot === node) {
23656 + hostSubtreeRoot = null;
23657 + }
23658 +
23659 + node = node.return;
23660 + }
23661 +
23662 + if (hostSubtreeRoot === node) {
23663 + hostSubtreeRoot = null;
23664 + }
23665 +
23666 + node.sibling.return = node.return;
23667 + node = node.sibling;
23668 + }
23669 + }
23670 + }
23671 +
23672 + function commitAttachRef(finishedWork) {
23673 + var ref = finishedWork.ref;
23674 +
23675 + if (ref !== null) {
23676 + var instance = finishedWork.stateNode;
23677 + var instanceToUse;
23678 +
23679 + switch (finishedWork.tag) {
23680 + case HostComponent:
23681 + instanceToUse = getPublicInstance(instance);
23682 + break;
23683 +
23684 + default:
23685 + instanceToUse = instance;
23686 + } // Moved outside to ensure DCE works with this flag
23687 +
23688 + if (typeof ref === 'function') {
23689 + var retVal;
23690 +
23691 + if ( finishedWork.mode & ProfileMode) {
23692 + try {
23693 + startLayoutEffectTimer();
23694 + retVal = ref(instanceToUse);
23695 + } finally {
23696 + recordLayoutEffectDuration(finishedWork);
23697 + }
23698 + } else {
23699 + retVal = ref(instanceToUse);
23700 + }
23701 +
23702 + {
23703 + if (typeof retVal === 'function') {
23704 + error('Unexpected return value from a callback ref in %s. ' + 'A callback ref should not return a function.', getComponentNameFromFiber(finishedWork));
23705 + }
23706 + }
23707 + } else {
23708 + {
23709 + if (!ref.hasOwnProperty('current')) {
23710 + error('Unexpected ref object provided for %s. ' + 'Use either a ref-setter function or React.createRef().', getComponentNameFromFiber(finishedWork));
23711 + }
23712 + }
23713 +
23714 + ref.current = instanceToUse;
23715 + }
23716 + }
23717 + }
23718 +
23719 + function detachFiberMutation(fiber) {
23720 + // Cut off the return pointer to disconnect it from the tree.
23721 + // This enables us to detect and warn against state updates on an unmounted component.
23722 + // It also prevents events from bubbling from within disconnected components.
23723 + //
23724 + // Ideally, we should also clear the child pointer of the parent alternate to let this
23725 + // get GC:ed but we don't know which for sure which parent is the current
23726 + // one so we'll settle for GC:ing the subtree of this child.
23727 + // This child itself will be GC:ed when the parent updates the next time.
23728 + //
23729 + // Note that we can't clear child or sibling pointers yet.
23730 + // They're needed for passive effects and for findDOMNode.
23731 + // We defer those fields, and all other cleanup, to the passive phase (see detachFiberAfterEffects).
23732 + //
23733 + // Don't reset the alternate yet, either. We need that so we can detach the
23734 + // alternate's fields in the passive phase. Clearing the return pointer is
23735 + // sufficient for findDOMNode semantics.
23736 + var alternate = fiber.alternate;
23737 +
23738 + if (alternate !== null) {
23739 + alternate.return = null;
23740 + }
23741 +
23742 + fiber.return = null;
23743 + }
23744 +
23745 + function detachFiberAfterEffects(fiber) {
23746 + var alternate = fiber.alternate;
23747 +
23748 + if (alternate !== null) {
23749 + fiber.alternate = null;
23750 + detachFiberAfterEffects(alternate);
23751 + } // Note: Defensively using negation instead of < in case
23752 + // `deletedTreeCleanUpLevel` is undefined.
23753 +
23754 +
23755 + {
23756 + // Clear cyclical Fiber fields. This level alone is designed to roughly
23757 + // approximate the planned Fiber refactor. In that world, `setState` will be
23758 + // bound to a special "instance" object instead of a Fiber. The Instance
23759 + // object will not have any of these fields. It will only be connected to
23760 + // the fiber tree via a single link at the root. So if this level alone is
23761 + // sufficient to fix memory issues, that bodes well for our plans.
23762 + fiber.child = null;
23763 + fiber.deletions = null;
23764 + fiber.sibling = null; // The `stateNode` is cyclical because on host nodes it points to the host
23765 + // tree, which has its own pointers to children, parents, and siblings.
23766 + // The other host nodes also point back to fibers, so we should detach that
23767 + // one, too.
23768 +
23769 + if (fiber.tag === HostComponent) {
23770 + var hostInstance = fiber.stateNode;
23771 +
23772 + if (hostInstance !== null) {
23773 + detachDeletedInstance(hostInstance);
23774 + }
23775 + }
23776 +
23777 + fiber.stateNode = null; // I'm intentionally not clearing the `return` field in this level. We
23778 + // already disconnect the `return` pointer at the root of the deleted
23779 + // subtree (in `detachFiberMutation`). Besides, `return` by itself is not
23780 + // cyclical — it's only cyclical when combined with `child`, `sibling`, and
23781 + // `alternate`. But we'll clear it in the next level anyway, just in case.
23782 +
23783 + {
23784 + fiber._debugOwner = null;
23785 + }
23786 +
23787 + {
23788 + // Theoretically, nothing in here should be necessary, because we already
23789 + // disconnected the fiber from the tree. So even if something leaks this
23790 + // particular fiber, it won't leak anything else
23791 + //
23792 + // The purpose of this branch is to be super aggressive so we can measure
23793 + // if there's any difference in memory impact. If there is, that could
23794 + // indicate a React leak we don't know about.
23795 + fiber.return = null;
23796 + fiber.dependencies = null;
23797 + fiber.memoizedProps = null;
23798 + fiber.memoizedState = null;
23799 + fiber.pendingProps = null;
23800 + fiber.stateNode = null; // TODO: Move to `commitPassiveUnmountInsideDeletedTreeOnFiber` instead.
23801 +
23802 + fiber.updateQueue = null;
23803 + }
23804 + }
23805 + }
23806 +
23807 + function getHostParentFiber(fiber) {
23808 + var parent = fiber.return;
23809 +
23810 + while (parent !== null) {
23811 + if (isHostParent(parent)) {
23812 + return parent;
23813 + }
23814 +
23815 + parent = parent.return;
23816 + }
23817 +
23818 + throw new Error('Expected to find a host parent. This error is likely caused by a bug ' + 'in React. Please file an issue.');
23819 + }
23820 +
23821 + function isHostParent(fiber) {
23822 + return fiber.tag === HostComponent || fiber.tag === HostRoot || fiber.tag === HostPortal;
23823 + }
23824 +
23825 + function getHostSibling(fiber) {
23826 + // We're going to search forward into the tree until we find a sibling host
23827 + // node. Unfortunately, if multiple insertions are done in a row we have to
23828 + // search past them. This leads to exponential search for the next sibling.
23829 + // TODO: Find a more efficient way to do this.
23830 + var node = fiber;
23831 +
23832 + siblings: while (true) {
23833 + // If we didn't find anything, let's try the next sibling.
23834 + while (node.sibling === null) {
23835 + if (node.return === null || isHostParent(node.return)) {
23836 + // If we pop out of the root or hit the parent the fiber we are the
23837 + // last sibling.
23838 + return null;
23839 + }
23840 +
23841 + node = node.return;
23842 + }
23843 +
23844 + node.sibling.return = node.return;
23845 + node = node.sibling;
23846 +
23847 + while (node.tag !== HostComponent && node.tag !== HostText && node.tag !== DehydratedFragment) {
23848 + // If it is not host node and, we might have a host node inside it.
23849 + // Try to search down until we find one.
23850 + if (node.flags & Placement) {
23851 + // If we don't have a child, try the siblings instead.
23852 + continue siblings;
23853 + } // If we don't have a child, try the siblings instead.
23854 + // We also skip portals because they are not part of this host tree.
23855 +
23856 +
23857 + if (node.child === null || node.tag === HostPortal) {
23858 + continue siblings;
23859 + } else {
23860 + node.child.return = node;
23861 + node = node.child;
23862 + }
23863 + } // Check if this host node is stable or about to be placed.
23864 +
23865 +
23866 + if (!(node.flags & Placement)) {
23867 + // Found it!
23868 + return node.stateNode;
23869 + }
23870 + }
23871 + }
23872 +
23873 + function commitPlacement(finishedWork) {
23874 +
23875 +
23876 + var parentFiber = getHostParentFiber(finishedWork); // Note: these two variables *must* always be updated together.
23877 +
23878 + switch (parentFiber.tag) {
23879 + case HostComponent:
23880 + {
23881 + var parent = parentFiber.stateNode;
23882 +
23883 + if (parentFiber.flags & ContentReset) {
23884 + // Reset the text content of the parent before doing any insertions
23885 + resetTextContent(parent); // Clear ContentReset from the effect tag
23886 +
23887 + parentFiber.flags &= ~ContentReset;
23888 + }
23889 +
23890 + var before = getHostSibling(finishedWork); // We only have the top Fiber that was inserted but we need to recurse down its
23891 + // children to find all the terminal nodes.
23892 +
23893 + insertOrAppendPlacementNode(finishedWork, before, parent);
23894 + break;
23895 + }
23896 +
23897 + case HostRoot:
23898 + case HostPortal:
23899 + {
23900 + var _parent = parentFiber.stateNode.containerInfo;
23901 +
23902 + var _before = getHostSibling(finishedWork);
23903 +
23904 + insertOrAppendPlacementNodeIntoContainer(finishedWork, _before, _parent);
23905 + break;
23906 + }
23907 + // eslint-disable-next-line-no-fallthrough
23908 +
23909 + default:
23910 + throw new Error('Invalid host parent fiber. This error is likely caused by a bug ' + 'in React. Please file an issue.');
23911 + }
23912 + }
23913 +
23914 + function insertOrAppendPlacementNodeIntoContainer(node, before, parent) {
23915 + var tag = node.tag;
23916 + var isHost = tag === HostComponent || tag === HostText;
23917 +
23918 + if (isHost) {
23919 + var stateNode = node.stateNode;
23920 +
23921 + if (before) {
23922 + insertInContainerBefore(parent, stateNode, before);
23923 + } else {
23924 + appendChildToContainer(parent, stateNode);
23925 + }
23926 + } else if (tag === HostPortal) ; else {
23927 + var child = node.child;
23928 +
23929 + if (child !== null) {
23930 + insertOrAppendPlacementNodeIntoContainer(child, before, parent);
23931 + var sibling = child.sibling;
23932 +
23933 + while (sibling !== null) {
23934 + insertOrAppendPlacementNodeIntoContainer(sibling, before, parent);
23935 + sibling = sibling.sibling;
23936 + }
23937 + }
23938 + }
23939 + }
23940 +
23941 + function insertOrAppendPlacementNode(node, before, parent) {
23942 + var tag = node.tag;
23943 + var isHost = tag === HostComponent || tag === HostText;
23944 +
23945 + if (isHost) {
23946 + var stateNode = node.stateNode;
23947 +
23948 + if (before) {
23949 + insertBefore(parent, stateNode, before);
23950 + } else {
23951 + appendChild(parent, stateNode);
23952 + }
23953 + } else if (tag === HostPortal) ; else {
23954 + var child = node.child;
23955 +
23956 + if (child !== null) {
23957 + insertOrAppendPlacementNode(child, before, parent);
23958 + var sibling = child.sibling;
23959 +
23960 + while (sibling !== null) {
23961 + insertOrAppendPlacementNode(sibling, before, parent);
23962 + sibling = sibling.sibling;
23963 + }
23964 + }
23965 + }
23966 + } // These are tracked on the stack as we recursively traverse a
23967 + // deleted subtree.
23968 + // TODO: Update these during the whole mutation phase, not just during
23969 + // a deletion.
23970 +
23971 +
23972 + var hostParent = null;
23973 + var hostParentIsContainer = false;
23974 +
23975 + function commitDeletionEffects(root, returnFiber, deletedFiber) {
23976 + {
23977 + // We only have the top Fiber that was deleted but we need to recurse down its
23978 + // children to find all the terminal nodes.
23979 + // Recursively delete all host nodes from the parent, detach refs, clean
23980 + // up mounted layout effects, and call componentWillUnmount.
23981 + // We only need to remove the topmost host child in each branch. But then we
23982 + // still need to keep traversing to unmount effects, refs, and cWU. TODO: We
23983 + // could split this into two separate traversals functions, where the second
23984 + // one doesn't include any removeChild logic. This is maybe the same
23985 + // function as "disappearLayoutEffects" (or whatever that turns into after
23986 + // the layout phase is refactored to use recursion).
23987 + // Before starting, find the nearest host parent on the stack so we know
23988 + // which instance/container to remove the children from.
23989 + // TODO: Instead of searching up the fiber return path on every deletion, we
23990 + // can track the nearest host component on the JS stack as we traverse the
23991 + // tree during the commit phase. This would make insertions faster, too.
23992 + var parent = returnFiber;
23993 +
23994 + findParent: while (parent !== null) {
23995 + switch (parent.tag) {
23996 + case HostComponent:
23997 + {
23998 + hostParent = parent.stateNode;
23999 + hostParentIsContainer = false;
24000 + break findParent;
24001 + }
24002 +
24003 + case HostRoot:
24004 + {
24005 + hostParent = parent.stateNode.containerInfo;
24006 + hostParentIsContainer = true;
24007 + break findParent;
24008 + }
24009 +
24010 + case HostPortal:
24011 + {
24012 + hostParent = parent.stateNode.containerInfo;
24013 + hostParentIsContainer = true;
24014 + break findParent;
24015 + }
24016 + }
24017 +
24018 + parent = parent.return;
24019 + }
24020 +
24021 + if (hostParent === null) {
24022 + throw new Error('Expected to find a host parent. This error is likely caused by ' + 'a bug in React. Please file an issue.');
24023 + }
24024 +
24025 + commitDeletionEffectsOnFiber(root, returnFiber, deletedFiber);
24026 + hostParent = null;
24027 + hostParentIsContainer = false;
24028 + }
24029 +
24030 + detachFiberMutation(deletedFiber);
24031 + }
24032 +
24033 + function recursivelyTraverseDeletionEffects(finishedRoot, nearestMountedAncestor, parent) {
24034 + // TODO: Use a static flag to skip trees that don't have unmount effects
24035 + var child = parent.child;
24036 +
24037 + while (child !== null) {
24038 + commitDeletionEffectsOnFiber(finishedRoot, nearestMountedAncestor, child);
24039 + child = child.sibling;
24040 + }
24041 + }
24042 +
24043 + function commitDeletionEffectsOnFiber(finishedRoot, nearestMountedAncestor, deletedFiber) {
24044 + onCommitUnmount(deletedFiber); // The cases in this outer switch modify the stack before they traverse
24045 + // into their subtree. There are simpler cases in the inner switch
24046 + // that don't modify the stack.
24047 +
24048 + switch (deletedFiber.tag) {
24049 + case HostComponent:
24050 + {
24051 + if (!offscreenSubtreeWasHidden) {
24052 + safelyDetachRef(deletedFiber, nearestMountedAncestor);
24053 + } // Intentional fallthrough to next branch
24054 +
24055 + }
24056 + // eslint-disable-next-line-no-fallthrough
24057 +
24058 + case HostText:
24059 + {
24060 + // We only need to remove the nearest host child. Set the host parent
24061 + // to `null` on the stack to indicate that nested children don't
24062 + // need to be removed.
24063 + {
24064 + var prevHostParent = hostParent;
24065 + var prevHostParentIsContainer = hostParentIsContainer;
24066 + hostParent = null;
24067 + recursivelyTraverseDeletionEffects(finishedRoot, nearestMountedAncestor, deletedFiber);
24068 + hostParent = prevHostParent;
24069 + hostParentIsContainer = prevHostParentIsContainer;
24070 +
24071 + if (hostParent !== null) {
24072 + // Now that all the child effects have unmounted, we can remove the
24073 + // node from the tree.
24074 + if (hostParentIsContainer) {
24075 + removeChildFromContainer(hostParent, deletedFiber.stateNode);
24076 + } else {
24077 + removeChild(hostParent, deletedFiber.stateNode);
24078 + }
24079 + }
24080 + }
24081 +
24082 + return;
24083 + }
24084 +
24085 + case DehydratedFragment:
24086 + {
24087 + // Delete the dehydrated suspense boundary and all of its content.
24088 +
24089 +
24090 + {
24091 + if (hostParent !== null) {
24092 + if (hostParentIsContainer) {
24093 + clearSuspenseBoundaryFromContainer(hostParent, deletedFiber.stateNode);
24094 + } else {
24095 + clearSuspenseBoundary(hostParent, deletedFiber.stateNode);
24096 + }
24097 + }
24098 + }
24099 +
24100 + return;
24101 + }
24102 +
24103 + case HostPortal:
24104 + {
24105 + {
24106 + // When we go into a portal, it becomes the parent to remove from.
24107 + var _prevHostParent = hostParent;
24108 + var _prevHostParentIsContainer = hostParentIsContainer;
24109 + hostParent = deletedFiber.stateNode.containerInfo;
24110 + hostParentIsContainer = true;
24111 + recursivelyTraverseDeletionEffects(finishedRoot, nearestMountedAncestor, deletedFiber);
24112 + hostParent = _prevHostParent;
24113 + hostParentIsContainer = _prevHostParentIsContainer;
24114 + }
24115 +
24116 + return;
24117 + }
24118 +
24119 + case FunctionComponent:
24120 + case ForwardRef:
24121 + case MemoComponent:
24122 + case SimpleMemoComponent:
24123 + {
24124 + if (!offscreenSubtreeWasHidden) {
24125 + var updateQueue = deletedFiber.updateQueue;
24126 +
24127 + if (updateQueue !== null) {
24128 + var lastEffect = updateQueue.lastEffect;
24129 +
24130 + if (lastEffect !== null) {
24131 + var firstEffect = lastEffect.next;
24132 + var effect = firstEffect;
24133 +
24134 + do {
24135 + var _effect = effect,
24136 + destroy = _effect.destroy,
24137 + tag = _effect.tag;
24138 +
24139 + if (destroy !== undefined) {
24140 + if ((tag & Insertion) !== NoFlags$1) {
24141 + safelyCallDestroy(deletedFiber, nearestMountedAncestor, destroy);
24142 + } else if ((tag & Layout) !== NoFlags$1) {
24143 + {
24144 + markComponentLayoutEffectUnmountStarted(deletedFiber);
24145 + }
24146 +
24147 + if ( deletedFiber.mode & ProfileMode) {
24148 + startLayoutEffectTimer();
24149 + safelyCallDestroy(deletedFiber, nearestMountedAncestor, destroy);
24150 + recordLayoutEffectDuration(deletedFiber);
24151 + } else {
24152 + safelyCallDestroy(deletedFiber, nearestMountedAncestor, destroy);
24153 + }
24154 +
24155 + {
24156 + markComponentLayoutEffectUnmountStopped();
24157 + }
24158 + }
24159 + }
24160 +
24161 + effect = effect.next;
24162 + } while (effect !== firstEffect);
24163 + }
24164 + }
24165 + }
24166 +
24167 + recursivelyTraverseDeletionEffects(finishedRoot, nearestMountedAncestor, deletedFiber);
24168 + return;
24169 + }
24170 +
24171 + case ClassComponent:
24172 + {
24173 + if (!offscreenSubtreeWasHidden) {
24174 + safelyDetachRef(deletedFiber, nearestMountedAncestor);
24175 + var instance = deletedFiber.stateNode;
24176 +
24177 + if (typeof instance.componentWillUnmount === 'function') {
24178 + safelyCallComponentWillUnmount(deletedFiber, nearestMountedAncestor, instance);
24179 + }
24180 + }
24181 +
24182 + recursivelyTraverseDeletionEffects(finishedRoot, nearestMountedAncestor, deletedFiber);
24183 + return;
24184 + }
24185 +
24186 + case ScopeComponent:
24187 + {
24188 +
24189 + recursivelyTraverseDeletionEffects(finishedRoot, nearestMountedAncestor, deletedFiber);
24190 + return;
24191 + }
24192 +
24193 + case OffscreenComponent:
24194 + {
24195 + if ( // TODO: Remove this dead flag
24196 + deletedFiber.mode & ConcurrentMode) {
24197 + // If this offscreen component is hidden, we already unmounted it. Before
24198 + // deleting the children, track that it's already unmounted so that we
24199 + // don't attempt to unmount the effects again.
24200 + // TODO: If the tree is hidden, in most cases we should be able to skip
24201 + // over the nested children entirely. An exception is we haven't yet found
24202 + // the topmost host node to delete, which we already track on the stack.
24203 + // But the other case is portals, which need to be detached no matter how
24204 + // deeply they are nested. We should use a subtree flag to track whether a
24205 + // subtree includes a nested portal.
24206 + var prevOffscreenSubtreeWasHidden = offscreenSubtreeWasHidden;
24207 + offscreenSubtreeWasHidden = prevOffscreenSubtreeWasHidden || deletedFiber.memoizedState !== null;
24208 + recursivelyTraverseDeletionEffects(finishedRoot, nearestMountedAncestor, deletedFiber);
24209 + offscreenSubtreeWasHidden = prevOffscreenSubtreeWasHidden;
24210 + } else {
24211 + recursivelyTraverseDeletionEffects(finishedRoot, nearestMountedAncestor, deletedFiber);
24212 + }
24213 +
24214 + break;
24215 + }
24216 +
24217 + default:
24218 + {
24219 + recursivelyTraverseDeletionEffects(finishedRoot, nearestMountedAncestor, deletedFiber);
24220 + return;
24221 + }
24222 + }
24223 + }
24224 +
24225 + function commitSuspenseCallback(finishedWork) {
24226 + // TODO: Move this to passive phase
24227 + var newState = finishedWork.memoizedState;
24228 + }
24229 +
24230 + function commitSuspenseHydrationCallbacks(finishedRoot, finishedWork) {
24231 +
24232 + var newState = finishedWork.memoizedState;
24233 +
24234 + if (newState === null) {
24235 + var current = finishedWork.alternate;
24236 +
24237 + if (current !== null) {
24238 + var prevState = current.memoizedState;
24239 +
24240 + if (prevState !== null) {
24241 + var suspenseInstance = prevState.dehydrated;
24242 +
24243 + if (suspenseInstance !== null) {
24244 + commitHydratedSuspenseInstance(suspenseInstance);
24245 + }
24246 + }
24247 + }
24248 + }
24249 + }
24250 +
24251 + function attachSuspenseRetryListeners(finishedWork) {
24252 + // If this boundary just timed out, then it will have a set of wakeables.
24253 + // For each wakeable, attach a listener so that when it resolves, React
24254 + // attempts to re-render the boundary in the primary (pre-timeout) state.
24255 + var wakeables = finishedWork.updateQueue;
24256 +
24257 + if (wakeables !== null) {
24258 + finishedWork.updateQueue = null;
24259 + var retryCache = finishedWork.stateNode;
24260 +
24261 + if (retryCache === null) {
24262 + retryCache = finishedWork.stateNode = new PossiblyWeakSet();
24263 + }
24264 +
24265 + wakeables.forEach(function (wakeable) {
24266 + // Memoize using the boundary fiber to prevent redundant listeners.
24267 + var retry = resolveRetryWakeable.bind(null, finishedWork, wakeable);
24268 +
24269 + if (!retryCache.has(wakeable)) {
24270 + retryCache.add(wakeable);
24271 +
24272 + {
24273 + if (isDevToolsPresent) {
24274 + if (inProgressLanes !== null && inProgressRoot !== null) {
24275 + // If we have pending work still, associate the original updaters with it.
24276 + restorePendingUpdaters(inProgressRoot, inProgressLanes);
24277 + } else {
24278 + throw Error('Expected finished root and lanes to be set. This is a bug in React.');
24279 + }
24280 + }
24281 + }
24282 +
24283 + wakeable.then(retry, retry);
24284 + }
24285 + });
24286 + }
24287 + } // This function detects when a Suspense boundary goes from visible to hidden.
24288 + function commitMutationEffects(root, finishedWork, committedLanes) {
24289 + inProgressLanes = committedLanes;
24290 + inProgressRoot = root;
24291 + setCurrentFiber(finishedWork);
24292 + commitMutationEffectsOnFiber(finishedWork, root);
24293 + setCurrentFiber(finishedWork);
24294 + inProgressLanes = null;
24295 + inProgressRoot = null;
24296 + }
24297 +
24298 + function recursivelyTraverseMutationEffects(root, parentFiber, lanes) {
24299 + // Deletions effects can be scheduled on any fiber type. They need to happen
24300 + // before the children effects hae fired.
24301 + var deletions = parentFiber.deletions;
24302 +
24303 + if (deletions !== null) {
24304 + for (var i = 0; i < deletions.length; i++) {
24305 + var childToDelete = deletions[i];
24306 +
24307 + try {
24308 + commitDeletionEffects(root, parentFiber, childToDelete);
24309 + } catch (error) {
24310 + captureCommitPhaseError(childToDelete, parentFiber, error);
24311 + }
24312 + }
24313 + }
24314 +
24315 + var prevDebugFiber = getCurrentFiber();
24316 +
24317 + if (parentFiber.subtreeFlags & MutationMask) {
24318 + var child = parentFiber.child;
24319 +
24320 + while (child !== null) {
24321 + setCurrentFiber(child);
24322 + commitMutationEffectsOnFiber(child, root);
24323 + child = child.sibling;
24324 + }
24325 + }
24326 +
24327 + setCurrentFiber(prevDebugFiber);
24328 + }
24329 +
24330 + function commitMutationEffectsOnFiber(finishedWork, root, lanes) {
24331 + var current = finishedWork.alternate;
24332 + var flags = finishedWork.flags; // The effect flag should be checked *after* we refine the type of fiber,
24333 + // because the fiber tag is more specific. An exception is any flag related
24334 + // to reconcilation, because those can be set on all fiber types.
24335 +
24336 + switch (finishedWork.tag) {
24337 + case FunctionComponent:
24338 + case ForwardRef:
24339 + case MemoComponent:
24340 + case SimpleMemoComponent:
24341 + {
24342 + recursivelyTraverseMutationEffects(root, finishedWork);
24343 + commitReconciliationEffects(finishedWork);
24344 +
24345 + if (flags & Update) {
24346 + try {
24347 + commitHookEffectListUnmount(Insertion | HasEffect, finishedWork, finishedWork.return);
24348 + commitHookEffectListMount(Insertion | HasEffect, finishedWork);
24349 + } catch (error) {
24350 + captureCommitPhaseError(finishedWork, finishedWork.return, error);
24351 + } // Layout effects are destroyed during the mutation phase so that all
24352 + // destroy functions for all fibers are called before any create functions.
24353 + // This prevents sibling component effects from interfering with each other,
24354 + // e.g. a destroy function in one component should never override a ref set
24355 + // by a create function in another component during the same commit.
24356 +
24357 +
24358 + if ( finishedWork.mode & ProfileMode) {
24359 + try {
24360 + startLayoutEffectTimer();
24361 + commitHookEffectListUnmount(Layout | HasEffect, finishedWork, finishedWork.return);
24362 + } catch (error) {
24363 + captureCommitPhaseError(finishedWork, finishedWork.return, error);
24364 + }
24365 +
24366 + recordLayoutEffectDuration(finishedWork);
24367 + } else {
24368 + try {
24369 + commitHookEffectListUnmount(Layout | HasEffect, finishedWork, finishedWork.return);
24370 + } catch (error) {
24371 + captureCommitPhaseError(finishedWork, finishedWork.return, error);
24372 + }
24373 + }
24374 + }
24375 +
24376 + return;
24377 + }
24378 +
24379 + case ClassComponent:
24380 + {
24381 + recursivelyTraverseMutationEffects(root, finishedWork);
24382 + commitReconciliationEffects(finishedWork);
24383 +
24384 + if (flags & Ref) {
24385 + if (current !== null) {
24386 + safelyDetachRef(current, current.return);
24387 + }
24388 + }
24389 +
24390 + return;
24391 + }
24392 +
24393 + case HostComponent:
24394 + {
24395 + recursivelyTraverseMutationEffects(root, finishedWork);
24396 + commitReconciliationEffects(finishedWork);
24397 +
24398 + if (flags & Ref) {
24399 + if (current !== null) {
24400 + safelyDetachRef(current, current.return);
24401 + }
24402 + }
24403 +
24404 + {
24405 + // TODO: ContentReset gets cleared by the children during the commit
24406 + // phase. This is a refactor hazard because it means we must read
24407 + // flags the flags after `commitReconciliationEffects` has already run;
24408 + // the order matters. We should refactor so that ContentReset does not
24409 + // rely on mutating the flag during commit. Like by setting a flag
24410 + // during the render phase instead.
24411 + if (finishedWork.flags & ContentReset) {
24412 + var instance = finishedWork.stateNode;
24413 +
24414 + try {
24415 + resetTextContent(instance);
24416 + } catch (error) {
24417 + captureCommitPhaseError(finishedWork, finishedWork.return, error);
24418 + }
24419 + }
24420 +
24421 + if (flags & Update) {
24422 + var _instance4 = finishedWork.stateNode;
24423 +
24424 + if (_instance4 != null) {
24425 + // Commit the work prepared earlier.
24426 + var newProps = finishedWork.memoizedProps; // For hydration we reuse the update path but we treat the oldProps
24427 + // as the newProps. The updatePayload will contain the real change in
24428 + // this case.
24429 +
24430 + var oldProps = current !== null ? current.memoizedProps : newProps;
24431 + var type = finishedWork.type; // TODO: Type the updateQueue to be specific to host components.
24432 +
24433 + var updatePayload = finishedWork.updateQueue;
24434 + finishedWork.updateQueue = null;
24435 +
24436 + if (updatePayload !== null) {
24437 + try {
24438 + commitUpdate(_instance4, updatePayload, type, oldProps, newProps, finishedWork);
24439 + } catch (error) {
24440 + captureCommitPhaseError(finishedWork, finishedWork.return, error);
24441 + }
24442 + }
24443 + }
24444 + }
24445 + }
24446 +
24447 + return;
24448 + }
24449 +
24450 + case HostText:
24451 + {
24452 + recursivelyTraverseMutationEffects(root, finishedWork);
24453 + commitReconciliationEffects(finishedWork);
24454 +
24455 + if (flags & Update) {
24456 + {
24457 + if (finishedWork.stateNode === null) {
24458 + throw new Error('This should have a text node initialized. This error is likely ' + 'caused by a bug in React. Please file an issue.');
24459 + }
24460 +
24461 + var textInstance = finishedWork.stateNode;
24462 + var newText = finishedWork.memoizedProps; // For hydration we reuse the update path but we treat the oldProps
24463 + // as the newProps. The updatePayload will contain the real change in
24464 + // this case.
24465 +
24466 + var oldText = current !== null ? current.memoizedProps : newText;
24467 +
24468 + try {
24469 + commitTextUpdate(textInstance, oldText, newText);
24470 + } catch (error) {
24471 + captureCommitPhaseError(finishedWork, finishedWork.return, error);
24472 + }
24473 + }
24474 + }
24475 +
24476 + return;
24477 + }
24478 +
24479 + case HostRoot:
24480 + {
24481 + recursivelyTraverseMutationEffects(root, finishedWork);
24482 + commitReconciliationEffects(finishedWork);
24483 +
24484 + if (flags & Update) {
24485 + {
24486 + if (current !== null) {
24487 + var prevRootState = current.memoizedState;
24488 +
24489 + if (prevRootState.isDehydrated) {
24490 + try {
24491 + commitHydratedContainer(root.containerInfo);
24492 + } catch (error) {
24493 + captureCommitPhaseError(finishedWork, finishedWork.return, error);
24494 + }
24495 + }
24496 + }
24497 + }
24498 + }
24499 +
24500 + return;
24501 + }
24502 +
24503 + case HostPortal:
24504 + {
24505 + recursivelyTraverseMutationEffects(root, finishedWork);
24506 + commitReconciliationEffects(finishedWork);
24507 +
24508 + return;
24509 + }
24510 +
24511 + case SuspenseComponent:
24512 + {
24513 + recursivelyTraverseMutationEffects(root, finishedWork);
24514 + commitReconciliationEffects(finishedWork);
24515 + var offscreenFiber = finishedWork.child;
24516 +
24517 + if (offscreenFiber.flags & Visibility) {
24518 + var offscreenInstance = offscreenFiber.stateNode;
24519 + var newState = offscreenFiber.memoizedState;
24520 + var isHidden = newState !== null; // Track the current state on the Offscreen instance so we can
24521 + // read it during an event
24522 +
24523 + offscreenInstance.isHidden = isHidden;
24524 +
24525 + if (isHidden) {
24526 + var wasHidden = offscreenFiber.alternate !== null && offscreenFiber.alternate.memoizedState !== null;
24527 +
24528 + if (!wasHidden) {
24529 + // TODO: Move to passive phase
24530 + markCommitTimeOfFallback();
24531 + }
24532 + }
24533 + }
24534 +
24535 + if (flags & Update) {
24536 + try {
24537 + commitSuspenseCallback(finishedWork);
24538 + } catch (error) {
24539 + captureCommitPhaseError(finishedWork, finishedWork.return, error);
24540 + }
24541 +
24542 + attachSuspenseRetryListeners(finishedWork);
24543 + }
24544 +
24545 + return;
24546 + }
24547 +
24548 + case OffscreenComponent:
24549 + {
24550 + var _wasHidden = current !== null && current.memoizedState !== null;
24551 +
24552 + if ( // TODO: Remove this dead flag
24553 + finishedWork.mode & ConcurrentMode) {
24554 + // Before committing the children, track on the stack whether this
24555 + // offscreen subtree was already hidden, so that we don't unmount the
24556 + // effects again.
24557 + var prevOffscreenSubtreeWasHidden = offscreenSubtreeWasHidden;
24558 + offscreenSubtreeWasHidden = prevOffscreenSubtreeWasHidden || _wasHidden;
24559 + recursivelyTraverseMutationEffects(root, finishedWork);
24560 + offscreenSubtreeWasHidden = prevOffscreenSubtreeWasHidden;
24561 + } else {
24562 + recursivelyTraverseMutationEffects(root, finishedWork);
24563 + }
24564 +
24565 + commitReconciliationEffects(finishedWork);
24566 +
24567 + if (flags & Visibility) {
24568 + var _offscreenInstance = finishedWork.stateNode;
24569 + var _newState = finishedWork.memoizedState;
24570 +
24571 + var _isHidden = _newState !== null;
24572 +
24573 + var offscreenBoundary = finishedWork; // Track the current state on the Offscreen instance so we can
24574 + // read it during an event
24575 +
24576 + _offscreenInstance.isHidden = _isHidden;
24577 +
24578 + {
24579 + if (_isHidden) {
24580 + if (!_wasHidden) {
24581 + if ((offscreenBoundary.mode & ConcurrentMode) !== NoMode) {
24582 + nextEffect = offscreenBoundary;
24583 + var offscreenChild = offscreenBoundary.child;
24584 +
24585 + while (offscreenChild !== null) {
24586 + nextEffect = offscreenChild;
24587 + disappearLayoutEffects_begin(offscreenChild);
24588 + offscreenChild = offscreenChild.sibling;
24589 + }
24590 + }
24591 + }
24592 + }
24593 + }
24594 +
24595 + {
24596 + // TODO: This needs to run whenever there's an insertion or update
24597 + // inside a hidden Offscreen tree.
24598 + hideOrUnhideAllChildren(offscreenBoundary, _isHidden);
24599 + }
24600 + }
24601 +
24602 + return;
24603 + }
24604 +
24605 + case SuspenseListComponent:
24606 + {
24607 + recursivelyTraverseMutationEffects(root, finishedWork);
24608 + commitReconciliationEffects(finishedWork);
24609 +
24610 + if (flags & Update) {
24611 + attachSuspenseRetryListeners(finishedWork);
24612 + }
24613 +
24614 + return;
24615 + }
24616 +
24617 + case ScopeComponent:
24618 + {
24619 +
24620 + return;
24621 + }
24622 +
24623 + default:
24624 + {
24625 + recursivelyTraverseMutationEffects(root, finishedWork);
24626 + commitReconciliationEffects(finishedWork);
24627 + return;
24628 + }
24629 + }
24630 + }
24631 +
24632 + function commitReconciliationEffects(finishedWork) {
24633 + // Placement effects (insertions, reorders) can be scheduled on any fiber
24634 + // type. They needs to happen after the children effects have fired, but
24635 + // before the effects on this fiber have fired.
24636 + var flags = finishedWork.flags;
24637 +
24638 + if (flags & Placement) {
24639 + try {
24640 + commitPlacement(finishedWork);
24641 + } catch (error) {
24642 + captureCommitPhaseError(finishedWork, finishedWork.return, error);
24643 + } // Clear the "placement" from effect tag so that we know that this is
24644 + // inserted, before any life-cycles like componentDidMount gets called.
24645 + // TODO: findDOMNode doesn't rely on this any more but isMounted does
24646 + // and isMounted is deprecated anyway so we should be able to kill this.
24647 +
24648 +
24649 + finishedWork.flags &= ~Placement;
24650 + }
24651 +
24652 + if (flags & Hydrating) {
24653 + finishedWork.flags &= ~Hydrating;
24654 + }
24655 + }
24656 +
24657 + function commitLayoutEffects(finishedWork, root, committedLanes) {
24658 + inProgressLanes = committedLanes;
24659 + inProgressRoot = root;
24660 + nextEffect = finishedWork;
24661 + commitLayoutEffects_begin(finishedWork, root, committedLanes);
24662 + inProgressLanes = null;
24663 + inProgressRoot = null;
24664 + }
24665 +
24666 + function commitLayoutEffects_begin(subtreeRoot, root, committedLanes) {
24667 + // Suspense layout effects semantics don't change for legacy roots.
24668 + var isModernRoot = (subtreeRoot.mode & ConcurrentMode) !== NoMode;
24669 +
24670 + while (nextEffect !== null) {
24671 + var fiber = nextEffect;
24672 + var firstChild = fiber.child;
24673 +
24674 + if ( fiber.tag === OffscreenComponent && isModernRoot) {
24675 + // Keep track of the current Offscreen stack's state.
24676 + var isHidden = fiber.memoizedState !== null;
24677 + var newOffscreenSubtreeIsHidden = isHidden || offscreenSubtreeIsHidden;
24678 +
24679 + if (newOffscreenSubtreeIsHidden) {
24680 + // The Offscreen tree is hidden. Skip over its layout effects.
24681 + commitLayoutMountEffects_complete(subtreeRoot, root, committedLanes);
24682 + continue;
24683 + } else {
24684 + // TODO (Offscreen) Also check: subtreeFlags & LayoutMask
24685 + var current = fiber.alternate;
24686 + var wasHidden = current !== null && current.memoizedState !== null;
24687 + var newOffscreenSubtreeWasHidden = wasHidden || offscreenSubtreeWasHidden;
24688 + var prevOffscreenSubtreeIsHidden = offscreenSubtreeIsHidden;
24689 + var prevOffscreenSubtreeWasHidden = offscreenSubtreeWasHidden; // Traverse the Offscreen subtree with the current Offscreen as the root.
24690 +
24691 + offscreenSubtreeIsHidden = newOffscreenSubtreeIsHidden;
24692 + offscreenSubtreeWasHidden = newOffscreenSubtreeWasHidden;
24693 +
24694 + if (offscreenSubtreeWasHidden && !prevOffscreenSubtreeWasHidden) {
24695 + // This is the root of a reappearing boundary. Turn its layout effects
24696 + // back on.
24697 + nextEffect = fiber;
24698 + reappearLayoutEffects_begin(fiber);
24699 + }
24700 +
24701 + var child = firstChild;
24702 +
24703 + while (child !== null) {
24704 + nextEffect = child;
24705 + commitLayoutEffects_begin(child, // New root; bubble back up to here and stop.
24706 + root, committedLanes);
24707 + child = child.sibling;
24708 + } // Restore Offscreen state and resume in our-progress traversal.
24709 +
24710 +
24711 + nextEffect = fiber;
24712 + offscreenSubtreeIsHidden = prevOffscreenSubtreeIsHidden;
24713 + offscreenSubtreeWasHidden = prevOffscreenSubtreeWasHidden;
24714 + commitLayoutMountEffects_complete(subtreeRoot, root, committedLanes);
24715 + continue;
24716 + }
24717 + }
24718 +
24719 + if ((fiber.subtreeFlags & LayoutMask) !== NoFlags && firstChild !== null) {
24720 + firstChild.return = fiber;
24721 + nextEffect = firstChild;
24722 + } else {
24723 + commitLayoutMountEffects_complete(subtreeRoot, root, committedLanes);
24724 + }
24725 + }
24726 + }
24727 +
24728 + function commitLayoutMountEffects_complete(subtreeRoot, root, committedLanes) {
24729 + while (nextEffect !== null) {
24730 + var fiber = nextEffect;
24731 +
24732 + if ((fiber.flags & LayoutMask) !== NoFlags) {
24733 + var current = fiber.alternate;
24734 + setCurrentFiber(fiber);
24735 +
24736 + try {
24737 + commitLayoutEffectOnFiber(root, current, fiber, committedLanes);
24738 + } catch (error) {
24739 + captureCommitPhaseError(fiber, fiber.return, error);
24740 + }
24741 +
24742 + resetCurrentFiber();
24743 + }
24744 +
24745 + if (fiber === subtreeRoot) {
24746 + nextEffect = null;
24747 + return;
24748 + }
24749 +
24750 + var sibling = fiber.sibling;
24751 +
24752 + if (sibling !== null) {
24753 + sibling.return = fiber.return;
24754 + nextEffect = sibling;
24755 + return;
24756 + }
24757 +
24758 + nextEffect = fiber.return;
24759 + }
24760 + }
24761 +
24762 + function disappearLayoutEffects_begin(subtreeRoot) {
24763 + while (nextEffect !== null) {
24764 + var fiber = nextEffect;
24765 + var firstChild = fiber.child; // TODO (Offscreen) Check: flags & (RefStatic | LayoutStatic)
24766 +
24767 + switch (fiber.tag) {
24768 + case FunctionComponent:
24769 + case ForwardRef:
24770 + case MemoComponent:
24771 + case SimpleMemoComponent:
24772 + {
24773 + if ( fiber.mode & ProfileMode) {
24774 + try {
24775 + startLayoutEffectTimer();
24776 + commitHookEffectListUnmount(Layout, fiber, fiber.return);
24777 + } finally {
24778 + recordLayoutEffectDuration(fiber);
24779 + }
24780 + } else {
24781 + commitHookEffectListUnmount(Layout, fiber, fiber.return);
24782 + }
24783 +
24784 + break;
24785 + }
24786 +
24787 + case ClassComponent:
24788 + {
24789 + // TODO (Offscreen) Check: flags & RefStatic
24790 + safelyDetachRef(fiber, fiber.return);
24791 + var instance = fiber.stateNode;
24792 +
24793 + if (typeof instance.componentWillUnmount === 'function') {
24794 + safelyCallComponentWillUnmount(fiber, fiber.return, instance);
24795 + }
24796 +
24797 + break;
24798 + }
24799 +
24800 + case HostComponent:
24801 + {
24802 + safelyDetachRef(fiber, fiber.return);
24803 + break;
24804 + }
24805 +
24806 + case OffscreenComponent:
24807 + {
24808 + // Check if this is a
24809 + var isHidden = fiber.memoizedState !== null;
24810 +
24811 + if (isHidden) {
24812 + // Nested Offscreen tree is already hidden. Don't disappear
24813 + // its effects.
24814 + disappearLayoutEffects_complete(subtreeRoot);
24815 + continue;
24816 + }
24817 +
24818 + break;
24819 + }
24820 + } // TODO (Offscreen) Check: subtreeFlags & LayoutStatic
24821 +
24822 +
24823 + if (firstChild !== null) {
24824 + firstChild.return = fiber;
24825 + nextEffect = firstChild;
24826 + } else {
24827 + disappearLayoutEffects_complete(subtreeRoot);
24828 + }
24829 + }
24830 + }
24831 +
24832 + function disappearLayoutEffects_complete(subtreeRoot) {
24833 + while (nextEffect !== null) {
24834 + var fiber = nextEffect;
24835 +
24836 + if (fiber === subtreeRoot) {
24837 + nextEffect = null;
24838 + return;
24839 + }
24840 +
24841 + var sibling = fiber.sibling;
24842 +
24843 + if (sibling !== null) {
24844 + sibling.return = fiber.return;
24845 + nextEffect = sibling;
24846 + return;
24847 + }
24848 +
24849 + nextEffect = fiber.return;
24850 + }
24851 + }
24852 +
24853 + function reappearLayoutEffects_begin(subtreeRoot) {
24854 + while (nextEffect !== null) {
24855 + var fiber = nextEffect;
24856 + var firstChild = fiber.child;
24857 +
24858 + if (fiber.tag === OffscreenComponent) {
24859 + var isHidden = fiber.memoizedState !== null;
24860 +
24861 + if (isHidden) {
24862 + // Nested Offscreen tree is still hidden. Don't re-appear its effects.
24863 + reappearLayoutEffects_complete(subtreeRoot);
24864 + continue;
24865 + }
24866 + } // TODO (Offscreen) Check: subtreeFlags & LayoutStatic
24867 +
24868 +
24869 + if (firstChild !== null) {
24870 + // This node may have been reused from a previous render, so we can't
24871 + // assume its return pointer is correct.
24872 + firstChild.return = fiber;
24873 + nextEffect = firstChild;
24874 + } else {
24875 + reappearLayoutEffects_complete(subtreeRoot);
24876 + }
24877 + }
24878 + }
24879 +
24880 + function reappearLayoutEffects_complete(subtreeRoot) {
24881 + while (nextEffect !== null) {
24882 + var fiber = nextEffect; // TODO (Offscreen) Check: flags & LayoutStatic
24883 +
24884 + setCurrentFiber(fiber);
24885 +
24886 + try {
24887 + reappearLayoutEffectsOnFiber(fiber);
24888 + } catch (error) {
24889 + captureCommitPhaseError(fiber, fiber.return, error);
24890 + }
24891 +
24892 + resetCurrentFiber();
24893 +
24894 + if (fiber === subtreeRoot) {
24895 + nextEffect = null;
24896 + return;
24897 + }
24898 +
24899 + var sibling = fiber.sibling;
24900 +
24901 + if (sibling !== null) {
24902 + // This node may have been reused from a previous render, so we can't
24903 + // assume its return pointer is correct.
24904 + sibling.return = fiber.return;
24905 + nextEffect = sibling;
24906 + return;
24907 + }
24908 +
24909 + nextEffect = fiber.return;
24910 + }
24911 + }
24912 +
24913 + function commitPassiveMountEffects(root, finishedWork, committedLanes, committedTransitions) {
24914 + nextEffect = finishedWork;
24915 + commitPassiveMountEffects_begin(finishedWork, root, committedLanes, committedTransitions);
24916 + }
24917 +
24918 + function commitPassiveMountEffects_begin(subtreeRoot, root, committedLanes, committedTransitions) {
24919 + while (nextEffect !== null) {
24920 + var fiber = nextEffect;
24921 + var firstChild = fiber.child;
24922 +
24923 + if ((fiber.subtreeFlags & PassiveMask) !== NoFlags && firstChild !== null) {
24924 + firstChild.return = fiber;
24925 + nextEffect = firstChild;
24926 + } else {
24927 + commitPassiveMountEffects_complete(subtreeRoot, root, committedLanes, committedTransitions);
24928 + }
24929 + }
24930 + }
24931 +
24932 + function commitPassiveMountEffects_complete(subtreeRoot, root, committedLanes, committedTransitions) {
24933 + while (nextEffect !== null) {
24934 + var fiber = nextEffect;
24935 +
24936 + if ((fiber.flags & Passive) !== NoFlags) {
24937 + setCurrentFiber(fiber);
24938 +
24939 + try {
24940 + commitPassiveMountOnFiber(root, fiber, committedLanes, committedTransitions);
24941 + } catch (error) {
24942 + captureCommitPhaseError(fiber, fiber.return, error);
24943 + }
24944 +
24945 + resetCurrentFiber();
24946 + }
24947 +
24948 + if (fiber === subtreeRoot) {
24949 + nextEffect = null;
24950 + return;
24951 + }
24952 +
24953 + var sibling = fiber.sibling;
24954 +
24955 + if (sibling !== null) {
24956 + sibling.return = fiber.return;
24957 + nextEffect = sibling;
24958 + return;
24959 + }
24960 +
24961 + nextEffect = fiber.return;
24962 + }
24963 + }
24964 +
24965 + function commitPassiveMountOnFiber(finishedRoot, finishedWork, committedLanes, committedTransitions) {
24966 + switch (finishedWork.tag) {
24967 + case FunctionComponent:
24968 + case ForwardRef:
24969 + case SimpleMemoComponent:
24970 + {
24971 + if ( finishedWork.mode & ProfileMode) {
24972 + startPassiveEffectTimer();
24973 +
24974 + try {
24975 + commitHookEffectListMount(Passive$1 | HasEffect, finishedWork);
24976 + } finally {
24977 + recordPassiveEffectDuration(finishedWork);
24978 + }
24979 + } else {
24980 + commitHookEffectListMount(Passive$1 | HasEffect, finishedWork);
24981 + }
24982 +
24983 + break;
24984 + }
24985 + }
24986 + }
24987 +
24988 + function commitPassiveUnmountEffects(firstChild) {
24989 + nextEffect = firstChild;
24990 + commitPassiveUnmountEffects_begin();
24991 + }
24992 +
24993 + function commitPassiveUnmountEffects_begin() {
24994 + while (nextEffect !== null) {
24995 + var fiber = nextEffect;
24996 + var child = fiber.child;
24997 +
24998 + if ((nextEffect.flags & ChildDeletion) !== NoFlags) {
24999 + var deletions = fiber.deletions;
25000 +
25001 + if (deletions !== null) {
25002 + for (var i = 0; i < deletions.length; i++) {
25003 + var fiberToDelete = deletions[i];
25004 + nextEffect = fiberToDelete;
25005 + commitPassiveUnmountEffectsInsideOfDeletedTree_begin(fiberToDelete, fiber);
25006 + }
25007 +
25008 + {
25009 + // A fiber was deleted from this parent fiber, but it's still part of
25010 + // the previous (alternate) parent fiber's list of children. Because
25011 + // children are a linked list, an earlier sibling that's still alive
25012 + // will be connected to the deleted fiber via its `alternate`:
25013 + //
25014 + // live fiber
25015 + // --alternate--> previous live fiber
25016 + // --sibling--> deleted fiber
25017 + //
25018 + // We can't disconnect `alternate` on nodes that haven't been deleted
25019 + // yet, but we can disconnect the `sibling` and `child` pointers.
25020 + var previousFiber = fiber.alternate;
25021 +
25022 + if (previousFiber !== null) {
25023 + var detachedChild = previousFiber.child;
25024 +
25025 + if (detachedChild !== null) {
25026 + previousFiber.child = null;
25027 +
25028 + do {
25029 + var detachedSibling = detachedChild.sibling;
25030 + detachedChild.sibling = null;
25031 + detachedChild = detachedSibling;
25032 + } while (detachedChild !== null);
25033 + }
25034 + }
25035 + }
25036 +
25037 + nextEffect = fiber;
25038 + }
25039 + }
25040 +
25041 + if ((fiber.subtreeFlags & PassiveMask) !== NoFlags && child !== null) {
25042 + child.return = fiber;
25043 + nextEffect = child;
25044 + } else {
25045 + commitPassiveUnmountEffects_complete();
25046 + }
25047 + }
25048 + }
25049 +
25050 + function commitPassiveUnmountEffects_complete() {
25051 + while (nextEffect !== null) {
25052 + var fiber = nextEffect;
25053 +
25054 + if ((fiber.flags & Passive) !== NoFlags) {
25055 + setCurrentFiber(fiber);
25056 + commitPassiveUnmountOnFiber(fiber);
25057 + resetCurrentFiber();
25058 + }
25059 +
25060 + var sibling = fiber.sibling;
25061 +
25062 + if (sibling !== null) {
25063 + sibling.return = fiber.return;
25064 + nextEffect = sibling;
25065 + return;
25066 + }
25067 +
25068 + nextEffect = fiber.return;
25069 + }
25070 + }
25071 +
25072 + function commitPassiveUnmountOnFiber(finishedWork) {
25073 + switch (finishedWork.tag) {
25074 + case FunctionComponent:
25075 + case ForwardRef:
25076 + case SimpleMemoComponent:
25077 + {
25078 + if ( finishedWork.mode & ProfileMode) {
25079 + startPassiveEffectTimer();
25080 + commitHookEffectListUnmount(Passive$1 | HasEffect, finishedWork, finishedWork.return);
25081 + recordPassiveEffectDuration(finishedWork);
25082 + } else {
25083 + commitHookEffectListUnmount(Passive$1 | HasEffect, finishedWork, finishedWork.return);
25084 + }
25085 +
25086 + break;
25087 + }
25088 + }
25089 + }
25090 +
25091 + function commitPassiveUnmountEffectsInsideOfDeletedTree_begin(deletedSubtreeRoot, nearestMountedAncestor) {
25092 + while (nextEffect !== null) {
25093 + var fiber = nextEffect; // Deletion effects fire in parent -> child order
25094 + // TODO: Check if fiber has a PassiveStatic flag
25095 +
25096 + setCurrentFiber(fiber);
25097 + commitPassiveUnmountInsideDeletedTreeOnFiber(fiber, nearestMountedAncestor);
25098 + resetCurrentFiber();
25099 + var child = fiber.child; // TODO: Only traverse subtree if it has a PassiveStatic flag. (But, if we
25100 + // do this, still need to handle `deletedTreeCleanUpLevel` correctly.)
25101 +
25102 + if (child !== null) {
25103 + child.return = fiber;
25104 + nextEffect = child;
25105 + } else {
25106 + commitPassiveUnmountEffectsInsideOfDeletedTree_complete(deletedSubtreeRoot);
25107 + }
25108 + }
25109 + }
25110 +
25111 + function commitPassiveUnmountEffectsInsideOfDeletedTree_complete(deletedSubtreeRoot) {
25112 + while (nextEffect !== null) {
25113 + var fiber = nextEffect;
25114 + var sibling = fiber.sibling;
25115 + var returnFiber = fiber.return;
25116 +
25117 + {
25118 + // Recursively traverse the entire deleted tree and clean up fiber fields.
25119 + // This is more aggressive than ideal, and the long term goal is to only
25120 + // have to detach the deleted tree at the root.
25121 + detachFiberAfterEffects(fiber);
25122 +
25123 + if (fiber === deletedSubtreeRoot) {
25124 + nextEffect = null;
25125 + return;
25126 + }
25127 + }
25128 +
25129 + if (sibling !== null) {
25130 + sibling.return = returnFiber;
25131 + nextEffect = sibling;
25132 + return;
25133 + }
25134 +
25135 + nextEffect = returnFiber;
25136 + }
25137 + }
25138 +
25139 + function commitPassiveUnmountInsideDeletedTreeOnFiber(current, nearestMountedAncestor) {
25140 + switch (current.tag) {
25141 + case FunctionComponent:
25142 + case ForwardRef:
25143 + case SimpleMemoComponent:
25144 + {
25145 + if ( current.mode & ProfileMode) {
25146 + startPassiveEffectTimer();
25147 + commitHookEffectListUnmount(Passive$1, current, nearestMountedAncestor);
25148 + recordPassiveEffectDuration(current);
25149 + } else {
25150 + commitHookEffectListUnmount(Passive$1, current, nearestMountedAncestor);
25151 + }
25152 +
25153 + break;
25154 + }
25155 + }
25156 + } // TODO: Reuse reappearLayoutEffects traversal here?
25157 +
25158 +
25159 + function invokeLayoutEffectMountInDEV(fiber) {
25160 + {
25161 + // We don't need to re-check StrictEffectsMode here.
25162 + // This function is only called if that check has already passed.
25163 + switch (fiber.tag) {
25164 + case FunctionComponent:
25165 + case ForwardRef:
25166 + case SimpleMemoComponent:
25167 + {
25168 + try {
25169 + commitHookEffectListMount(Layout | HasEffect, fiber);
25170 + } catch (error) {
25171 + captureCommitPhaseError(fiber, fiber.return, error);
25172 + }
25173 +
25174 + break;
25175 + }
25176 +
25177 + case ClassComponent:
25178 + {
25179 + var instance = fiber.stateNode;
25180 +
25181 + try {
25182 + instance.componentDidMount();
25183 + } catch (error) {
25184 + captureCommitPhaseError(fiber, fiber.return, error);
25185 + }
25186 +
25187 + break;
25188 + }
25189 + }
25190 + }
25191 + }
25192 +
25193 + function invokePassiveEffectMountInDEV(fiber) {
25194 + {
25195 + // We don't need to re-check StrictEffectsMode here.
25196 + // This function is only called if that check has already passed.
25197 + switch (fiber.tag) {
25198 + case FunctionComponent:
25199 + case ForwardRef:
25200 + case SimpleMemoComponent:
25201 + {
25202 + try {
25203 + commitHookEffectListMount(Passive$1 | HasEffect, fiber);
25204 + } catch (error) {
25205 + captureCommitPhaseError(fiber, fiber.return, error);
25206 + }
25207 +
25208 + break;
25209 + }
25210 + }
25211 + }
25212 + }
25213 +
25214 + function invokeLayoutEffectUnmountInDEV(fiber) {
25215 + {
25216 + // We don't need to re-check StrictEffectsMode here.
25217 + // This function is only called if that check has already passed.
25218 + switch (fiber.tag) {
25219 + case FunctionComponent:
25220 + case ForwardRef:
25221 + case SimpleMemoComponent:
25222 + {
25223 + try {
25224 + commitHookEffectListUnmount(Layout | HasEffect, fiber, fiber.return);
25225 + } catch (error) {
25226 + captureCommitPhaseError(fiber, fiber.return, error);
25227 + }
25228 +
25229 + break;
25230 + }
25231 +
25232 + case ClassComponent:
25233 + {
25234 + var instance = fiber.stateNode;
25235 +
25236 + if (typeof instance.componentWillUnmount === 'function') {
25237 + safelyCallComponentWillUnmount(fiber, fiber.return, instance);
25238 + }
25239 +
25240 + break;
25241 + }
25242 + }
25243 + }
25244 + }
25245 +
25246 + function invokePassiveEffectUnmountInDEV(fiber) {
25247 + {
25248 + // We don't need to re-check StrictEffectsMode here.
25249 + // This function is only called if that check has already passed.
25250 + switch (fiber.tag) {
25251 + case FunctionComponent:
25252 + case ForwardRef:
25253 + case SimpleMemoComponent:
25254 + {
25255 + try {
25256 + commitHookEffectListUnmount(Passive$1 | HasEffect, fiber, fiber.return);
25257 + } catch (error) {
25258 + captureCommitPhaseError(fiber, fiber.return, error);
25259 + }
25260 + }
25261 + }
25262 + }
25263 + }
25264 +
25265 + var COMPONENT_TYPE = 0;
25266 + var HAS_PSEUDO_CLASS_TYPE = 1;
25267 + var ROLE_TYPE = 2;
25268 + var TEST_NAME_TYPE = 3;
25269 + var TEXT_TYPE = 4;
25270 +
25271 + if (typeof Symbol === 'function' && Symbol.for) {
25272 + var symbolFor = Symbol.for;
25273 + COMPONENT_TYPE = symbolFor('selector.component');
25274 + HAS_PSEUDO_CLASS_TYPE = symbolFor('selector.has_pseudo_class');
25275 + ROLE_TYPE = symbolFor('selector.role');
25276 + TEST_NAME_TYPE = symbolFor('selector.test_id');
25277 + TEXT_TYPE = symbolFor('selector.text');
25278 + }
25279 + var commitHooks = [];
25280 + function onCommitRoot$1() {
25281 + {
25282 + commitHooks.forEach(function (commitHook) {
25283 + return commitHook();
25284 + });
25285 + }
25286 + }
25287 +
25288 + var ReactCurrentActQueue = ReactSharedInternals.ReactCurrentActQueue;
25289 + function isLegacyActEnvironment(fiber) {
25290 + {
25291 + // Legacy mode. We preserve the behavior of React 17's act. It assumes an
25292 + // act environment whenever `jest` is defined, but you can still turn off
25293 + // spurious warnings by setting IS_REACT_ACT_ENVIRONMENT explicitly
25294 + // to false.
25295 + var isReactActEnvironmentGlobal = // $FlowExpectedError – Flow doesn't know about IS_REACT_ACT_ENVIRONMENT global
25296 + typeof IS_REACT_ACT_ENVIRONMENT !== 'undefined' ? IS_REACT_ACT_ENVIRONMENT : undefined; // $FlowExpectedError - Flow doesn't know about jest
25297 +
25298 + var jestIsDefined = typeof jest !== 'undefined';
25299 + return jestIsDefined && isReactActEnvironmentGlobal !== false;
25300 + }
25301 + }
25302 + function isConcurrentActEnvironment() {
25303 + {
25304 + var isReactActEnvironmentGlobal = // $FlowExpectedError – Flow doesn't know about IS_REACT_ACT_ENVIRONMENT global
25305 + typeof IS_REACT_ACT_ENVIRONMENT !== 'undefined' ? IS_REACT_ACT_ENVIRONMENT : undefined;
25306 +
25307 + if (!isReactActEnvironmentGlobal && ReactCurrentActQueue.current !== null) {
25308 + // TODO: Include link to relevant documentation page.
25309 + error('The current testing environment is not configured to support ' + 'act(...)');
25310 + }
25311 +
25312 + return isReactActEnvironmentGlobal;
25313 + }
25314 + }
25315 +
25316 + var ceil = Math.ceil;
25317 + var ReactCurrentDispatcher$2 = ReactSharedInternals.ReactCurrentDispatcher,
25318 + ReactCurrentOwner$2 = ReactSharedInternals.ReactCurrentOwner,
25319 + ReactCurrentBatchConfig$3 = ReactSharedInternals.ReactCurrentBatchConfig,
25320 + ReactCurrentActQueue$1 = ReactSharedInternals.ReactCurrentActQueue;
25321 + var NoContext =
25322 + /* */
25323 + 0;
25324 + var BatchedContext =
25325 + /* */
25326 + 1;
25327 + var RenderContext =
25328 + /* */
25329 + 2;
25330 + var CommitContext =
25331 + /* */
25332 + 4;
25333 + var RootInProgress = 0;
25334 + var RootFatalErrored = 1;
25335 + var RootErrored = 2;
25336 + var RootSuspended = 3;
25337 + var RootSuspendedWithDelay = 4;
25338 + var RootCompleted = 5;
25339 + var RootDidNotComplete = 6; // Describes where we are in the React execution stack
25340 +
25341 + var executionContext = NoContext; // The root we're working on
25342 +
25343 + var workInProgressRoot = null; // The fiber we're working on
25344 +
25345 + var workInProgress = null; // The lanes we're rendering
25346 +
25347 + var workInProgressRootRenderLanes = NoLanes; // Stack that allows components to change the render lanes for its subtree
25348 + // This is a superset of the lanes we started working on at the root. The only
25349 + // case where it's different from `workInProgressRootRenderLanes` is when we
25350 + // enter a subtree that is hidden and needs to be unhidden: Suspense and
25351 + // Offscreen component.
25352 + //
25353 + // Most things in the work loop should deal with workInProgressRootRenderLanes.
25354 + // Most things in begin/complete phases should deal with subtreeRenderLanes.
25355 +
25356 + var subtreeRenderLanes = NoLanes;
25357 + var subtreeRenderLanesCursor = createCursor(NoLanes); // Whether to root completed, errored, suspended, etc.
25358 +
25359 + var workInProgressRootExitStatus = RootInProgress; // A fatal error, if one is thrown
25360 +
25361 + var workInProgressRootFatalError = null; // "Included" lanes refer to lanes that were worked on during this render. It's
25362 + // slightly different than `renderLanes` because `renderLanes` can change as you
25363 + // enter and exit an Offscreen tree. This value is the combination of all render
25364 + // lanes for the entire render phase.
25365 +
25366 + var workInProgressRootIncludedLanes = NoLanes; // The work left over by components that were visited during this render. Only
25367 + // includes unprocessed updates, not work in bailed out children.
25368 +
25369 + var workInProgressRootSkippedLanes = NoLanes; // Lanes that were updated (in an interleaved event) during this render.
25370 +
25371 + var workInProgressRootInterleavedUpdatedLanes = NoLanes; // Lanes that were updated during the render phase (*not* an interleaved event).
25372 +
25373 + var workInProgressRootPingedLanes = NoLanes; // Errors that are thrown during the render phase.
25374 +
25375 + var workInProgressRootConcurrentErrors = null; // These are errors that we recovered from without surfacing them to the UI.
25376 + // We will log them once the tree commits.
25377 +
25378 + var workInProgressRootRecoverableErrors = null; // The most recent time we committed a fallback. This lets us ensure a train
25379 + // model where we don't commit new loading states in too quick succession.
25380 +
25381 + var globalMostRecentFallbackTime = 0;
25382 + var FALLBACK_THROTTLE_MS = 500; // The absolute time for when we should start giving up on rendering
25383 + // more and prefer CPU suspense heuristics instead.
25384 +
25385 + var workInProgressRootRenderTargetTime = Infinity; // How long a render is supposed to take before we start following CPU
25386 + // suspense heuristics and opt out of rendering more content.
25387 +
25388 + var RENDER_TIMEOUT_MS = 500;
25389 + var workInProgressTransitions = null;
25390 +
25391 + function resetRenderTimer() {
25392 + workInProgressRootRenderTargetTime = now() + RENDER_TIMEOUT_MS;
25393 + }
25394 +
25395 + function getRenderTargetTime() {
25396 + return workInProgressRootRenderTargetTime;
25397 + }
25398 + var hasUncaughtError = false;
25399 + var firstUncaughtError = null;
25400 + var legacyErrorBoundariesThatAlreadyFailed = null; // Only used when enableProfilerNestedUpdateScheduledHook is true;
25401 + var rootDoesHavePassiveEffects = false;
25402 + var rootWithPendingPassiveEffects = null;
25403 + var pendingPassiveEffectsLanes = NoLanes;
25404 + var pendingPassiveProfilerEffects = [];
25405 + var pendingPassiveTransitions = null; // Use these to prevent an infinite loop of nested updates
25406 +
25407 + var NESTED_UPDATE_LIMIT = 50;
25408 + var nestedUpdateCount = 0;
25409 + var rootWithNestedUpdates = null;
25410 + var isFlushingPassiveEffects = false;
25411 + var didScheduleUpdateDuringPassiveEffects = false;
25412 + var NESTED_PASSIVE_UPDATE_LIMIT = 50;
25413 + var nestedPassiveUpdateCount = 0;
25414 + var rootWithPassiveNestedUpdates = null; // If two updates are scheduled within the same event, we should treat their
25415 + // event times as simultaneous, even if the actual clock time has advanced
25416 + // between the first and second call.
25417 +
25418 + var currentEventTime = NoTimestamp;
25419 + var currentEventTransitionLane = NoLanes;
25420 + var isRunningInsertionEffect = false;
25421 + function getWorkInProgressRoot() {
25422 + return workInProgressRoot;
25423 + }
25424 + function requestEventTime() {
25425 + if ((executionContext & (RenderContext | CommitContext)) !== NoContext) {
25426 + // We're inside React, so it's fine to read the actual time.
25427 + return now();
25428 + } // We're not inside React, so we may be in the middle of a browser event.
25429 +
25430 +
25431 + if (currentEventTime !== NoTimestamp) {
25432 + // Use the same start time for all updates until we enter React again.
25433 + return currentEventTime;
25434 + } // This is the first update since React yielded. Compute a new start time.
25435 +
25436 +
25437 + currentEventTime = now();
25438 + return currentEventTime;
25439 + }
25440 + function requestUpdateLane(fiber) {
25441 + // Special cases
25442 + var mode = fiber.mode;
25443 +
25444 + if ((mode & ConcurrentMode) === NoMode) {
25445 + return SyncLane;
25446 + } else if ( (executionContext & RenderContext) !== NoContext && workInProgressRootRenderLanes !== NoLanes) {
25447 + // This is a render phase update. These are not officially supported. The
25448 + // old behavior is to give this the same "thread" (lanes) as
25449 + // whatever is currently rendering. So if you call `setState` on a component
25450 + // that happens later in the same render, it will flush. Ideally, we want to
25451 + // remove the special case and treat them as if they came from an
25452 + // interleaved event. Regardless, this pattern is not officially supported.
25453 + // This behavior is only a fallback. The flag only exists until we can roll
25454 + // out the setState warning, since existing code might accidentally rely on
25455 + // the current behavior.
25456 + return pickArbitraryLane(workInProgressRootRenderLanes);
25457 + }
25458 +
25459 + var isTransition = requestCurrentTransition() !== NoTransition;
25460 +
25461 + if (isTransition) {
25462 + if ( ReactCurrentBatchConfig$3.transition !== null) {
25463 + var transition = ReactCurrentBatchConfig$3.transition;
25464 +
25465 + if (!transition._updatedFibers) {
25466 + transition._updatedFibers = new Set();
25467 + }
25468 +
25469 + transition._updatedFibers.add(fiber);
25470 + } // The algorithm for assigning an update to a lane should be stable for all
25471 + // updates at the same priority within the same event. To do this, the
25472 + // inputs to the algorithm must be the same.
25473 + //
25474 + // The trick we use is to cache the first of each of these inputs within an
25475 + // event. Then reset the cached values once we can be sure the event is
25476 + // over. Our heuristic for that is whenever we enter a concurrent work loop.
25477 +
25478 +
25479 + if (currentEventTransitionLane === NoLane) {
25480 + // All transitions within the same event are assigned the same lane.
25481 + currentEventTransitionLane = claimNextTransitionLane();
25482 + }
25483 +
25484 + return currentEventTransitionLane;
25485 + } // Updates originating inside certain React methods, like flushSync, have
25486 + // their priority set by tracking it with a context variable.
25487 + //
25488 + // The opaque type returned by the host config is internally a lane, so we can
25489 + // use that directly.
25490 + // TODO: Move this type conversion to the event priority module.
25491 +
25492 +
25493 + var updateLane = getCurrentUpdatePriority();
25494 +
25495 + if (updateLane !== NoLane) {
25496 + return updateLane;
25497 + } // This update originated outside React. Ask the host environment for an
25498 + // appropriate priority, based on the type of event.
25499 + //
25500 + // The opaque type returned by the host config is internally a lane, so we can
25501 + // use that directly.
25502 + // TODO: Move this type conversion to the event priority module.
25503 +
25504 +
25505 + var eventLane = getCurrentEventPriority();
25506 + return eventLane;
25507 + }
25508 +
25509 + function requestRetryLane(fiber) {
25510 + // This is a fork of `requestUpdateLane` designed specifically for Suspense
25511 + // "retries" — a special update that attempts to flip a Suspense boundary
25512 + // from its placeholder state to its primary/resolved state.
25513 + // Special cases
25514 + var mode = fiber.mode;
25515 +
25516 + if ((mode & ConcurrentMode) === NoMode) {
25517 + return SyncLane;
25518 + }
25519 +
25520 + return claimNextRetryLane();
25521 + }
25522 +
25523 + function scheduleUpdateOnFiber(root, fiber, lane, eventTime) {
25524 + checkForNestedUpdates();
25525 +
25526 + {
25527 + if (isRunningInsertionEffect) {
25528 + error('useInsertionEffect must not schedule updates.');
25529 + }
25530 + }
25531 +
25532 + {
25533 + if (isFlushingPassiveEffects) {
25534 + didScheduleUpdateDuringPassiveEffects = true;
25535 + }
25536 + } // Mark that the root has a pending update.
25537 +
25538 +
25539 + markRootUpdated(root, lane, eventTime);
25540 +
25541 + if ((executionContext & RenderContext) !== NoLanes && root === workInProgressRoot) {
25542 + // This update was dispatched during the render phase. This is a mistake
25543 + // if the update originates from user space (with the exception of local
25544 + // hook updates, which are handled differently and don't reach this
25545 + // function), but there are some internal React features that use this as
25546 + // an implementation detail, like selective hydration.
25547 + warnAboutRenderPhaseUpdatesInDEV(fiber); // Track lanes that were updated during the render phase
25548 + } else {
25549 + // This is a normal update, scheduled from outside the render phase. For
25550 + // example, during an input event.
25551 + {
25552 + if (isDevToolsPresent) {
25553 + addFiberToLanesMap(root, fiber, lane);
25554 + }
25555 + }
25556 +
25557 + warnIfUpdatesNotWrappedWithActDEV(fiber);
25558 +
25559 + if (root === workInProgressRoot) {
25560 + // Received an update to a tree that's in the middle of rendering. Mark
25561 + // that there was an interleaved update work on this root. Unless the
25562 + // `deferRenderPhaseUpdateToNextBatch` flag is off and this is a render
25563 + // phase update. In that case, we don't treat render phase updates as if
25564 + // they were interleaved, for backwards compat reasons.
25565 + if ( (executionContext & RenderContext) === NoContext) {
25566 + workInProgressRootInterleavedUpdatedLanes = mergeLanes(workInProgressRootInterleavedUpdatedLanes, lane);
25567 + }
25568 +
25569 + if (workInProgressRootExitStatus === RootSuspendedWithDelay) {
25570 + // The root already suspended with a delay, which means this render
25571 + // definitely won't finish. Since we have a new update, let's mark it as
25572 + // suspended now, right before marking the incoming update. This has the
25573 + // effect of interrupting the current render and switching to the update.
25574 + // TODO: Make sure this doesn't override pings that happen while we've
25575 + // already started rendering.
25576 + markRootSuspended$1(root, workInProgressRootRenderLanes);
25577 + }
25578 + }
25579 +
25580 + ensureRootIsScheduled(root, eventTime);
25581 +
25582 + if (lane === SyncLane && executionContext === NoContext && (fiber.mode & ConcurrentMode) === NoMode && // Treat `act` as if it's inside `batchedUpdates`, even in legacy mode.
25583 + !( ReactCurrentActQueue$1.isBatchingLegacy)) {
25584 + // Flush the synchronous work now, unless we're already working or inside
25585 + // a batch. This is intentionally inside scheduleUpdateOnFiber instead of
25586 + // scheduleCallbackForFiber to preserve the ability to schedule a callback
25587 + // without immediately flushing it. We only do this for user-initiated
25588 + // updates, to preserve historical behavior of legacy mode.
25589 + resetRenderTimer();
25590 + flushSyncCallbacksOnlyInLegacyMode();
25591 + }
25592 + }
25593 + }
25594 + function scheduleInitialHydrationOnRoot(root, lane, eventTime) {
25595 + // This is a special fork of scheduleUpdateOnFiber that is only used to
25596 + // schedule the initial hydration of a root that has just been created. Most
25597 + // of the stuff in scheduleUpdateOnFiber can be skipped.
25598 + //
25599 + // The main reason for this separate path, though, is to distinguish the
25600 + // initial children from subsequent updates. In fully client-rendered roots
25601 + // (createRoot instead of hydrateRoot), all top-level renders are modeled as
25602 + // updates, but hydration roots are special because the initial render must
25603 + // match what was rendered on the server.
25604 + var current = root.current;
25605 + current.lanes = lane;
25606 + markRootUpdated(root, lane, eventTime);
25607 + ensureRootIsScheduled(root, eventTime);
25608 + }
25609 + function isUnsafeClassRenderPhaseUpdate(fiber) {
25610 + // Check if this is a render phase update. Only called by class components,
25611 + // which special (deprecated) behavior for UNSAFE_componentWillReceive props.
25612 + return (// TODO: Remove outdated deferRenderPhaseUpdateToNextBatch experiment. We
25613 + // decided not to enable it.
25614 + (executionContext & RenderContext) !== NoContext
25615 + );
25616 + } // Use this function to schedule a task for a root. There's only one task per
25617 + // root; if a task was already scheduled, we'll check to make sure the priority
25618 + // of the existing task is the same as the priority of the next level that the
25619 + // root has work on. This function is called on every update, and right before
25620 + // exiting a task.
25621 +
25622 + function ensureRootIsScheduled(root, currentTime) {
25623 + var existingCallbackNode = root.callbackNode; // Check if any lanes are being starved by other work. If so, mark them as
25624 + // expired so we know to work on those next.
25625 +
25626 + markStarvedLanesAsExpired(root, currentTime); // Determine the next lanes to work on, and their priority.
25627 +
25628 + var nextLanes = getNextLanes(root, root === workInProgressRoot ? workInProgressRootRenderLanes : NoLanes);
25629 +
25630 + if (nextLanes === NoLanes) {
25631 + // Special case: There's nothing to work on.
25632 + if (existingCallbackNode !== null) {
25633 + cancelCallback$1(existingCallbackNode);
25634 + }
25635 +
25636 + root.callbackNode = null;
25637 + root.callbackPriority = NoLane;
25638 + return;
25639 + } // We use the highest priority lane to represent the priority of the callback.
25640 +
25641 +
25642 + var newCallbackPriority = getHighestPriorityLane(nextLanes); // Check if there's an existing task. We may be able to reuse it.
25643 +
25644 + var existingCallbackPriority = root.callbackPriority;
25645 +
25646 + if (existingCallbackPriority === newCallbackPriority && // Special case related to `act`. If the currently scheduled task is a
25647 + // Scheduler task, rather than an `act` task, cancel it and re-scheduled
25648 + // on the `act` queue.
25649 + !( ReactCurrentActQueue$1.current !== null && existingCallbackNode !== fakeActCallbackNode)) {
25650 + {
25651 + // If we're going to re-use an existing task, it needs to exist.
25652 + // Assume that discrete update microtasks are non-cancellable and null.
25653 + // TODO: Temporary until we confirm this warning is not fired.
25654 + if (existingCallbackNode == null && existingCallbackPriority !== SyncLane) {
25655 + error('Expected scheduled callback to exist. This error is likely caused by a bug in React. Please file an issue.');
25656 + }
25657 + } // The priority hasn't changed. We can reuse the existing task. Exit.
25658 +
25659 +
25660 + return;
25661 + }
25662 +
25663 + if (existingCallbackNode != null) {
25664 + // Cancel the existing callback. We'll schedule a new one below.
25665 + cancelCallback$1(existingCallbackNode);
25666 + } // Schedule a new callback.
25667 +
25668 +
25669 + var newCallbackNode;
25670 +
25671 + if (newCallbackPriority === SyncLane) {
25672 + // Special case: Sync React callbacks are scheduled on a special
25673 + // internal queue
25674 + if (root.tag === LegacyRoot) {
25675 + if ( ReactCurrentActQueue$1.isBatchingLegacy !== null) {
25676 + ReactCurrentActQueue$1.didScheduleLegacyUpdate = true;
25677 + }
25678 +
25679 + scheduleLegacySyncCallback(performSyncWorkOnRoot.bind(null, root));
25680 + } else {
25681 + scheduleSyncCallback(performSyncWorkOnRoot.bind(null, root));
25682 + }
25683 +
25684 + {
25685 + // Flush the queue in a microtask.
25686 + if ( ReactCurrentActQueue$1.current !== null) {
25687 + // Inside `act`, use our internal `act` queue so that these get flushed
25688 + // at the end of the current scope even when using the sync version
25689 + // of `act`.
25690 + ReactCurrentActQueue$1.current.push(flushSyncCallbacks);
25691 + } else {
25692 + scheduleMicrotask(function () {
25693 + // In Safari, appending an iframe forces microtasks to run.
25694 + // https://github.com/facebook/react/issues/22459
25695 + // We don't support running callbacks in the middle of render
25696 + // or commit so we need to check against that.
25697 + if ((executionContext & (RenderContext | CommitContext)) === NoContext) {
25698 + // Note that this would still prematurely flush the callbacks
25699 + // if this happens outside render or commit phase (e.g. in an event).
25700 + flushSyncCallbacks();
25701 + }
25702 + });
25703 + }
25704 + }
25705 +
25706 + newCallbackNode = null;
25707 + } else {
25708 + var schedulerPriorityLevel;
25709 +
25710 + switch (lanesToEventPriority(nextLanes)) {
25711 + case DiscreteEventPriority:
25712 + schedulerPriorityLevel = ImmediatePriority;
25713 + break;
25714 +
25715 + case ContinuousEventPriority:
25716 + schedulerPriorityLevel = UserBlockingPriority;
25717 + break;
25718 +
25719 + case DefaultEventPriority:
25720 + schedulerPriorityLevel = NormalPriority;
25721 + break;
25722 +
25723 + case IdleEventPriority:
25724 + schedulerPriorityLevel = IdlePriority;
25725 + break;
25726 +
25727 + default:
25728 + schedulerPriorityLevel = NormalPriority;
25729 + break;
25730 + }
25731 +
25732 + newCallbackNode = scheduleCallback$1(schedulerPriorityLevel, performConcurrentWorkOnRoot.bind(null, root));
25733 + }
25734 +
25735 + root.callbackPriority = newCallbackPriority;
25736 + root.callbackNode = newCallbackNode;
25737 + } // This is the entry point for every concurrent task, i.e. anything that
25738 + // goes through Scheduler.
25739 +
25740 +
25741 + function performConcurrentWorkOnRoot(root, didTimeout) {
25742 + {
25743 + resetNestedUpdateFlag();
25744 + } // Since we know we're in a React event, we can clear the current
25745 + // event time. The next update will compute a new event time.
25746 +
25747 +
25748 + currentEventTime = NoTimestamp;
25749 + currentEventTransitionLane = NoLanes;
25750 +
25751 + if ((executionContext & (RenderContext | CommitContext)) !== NoContext) {
25752 + throw new Error('Should not already be working.');
25753 + } // Flush any pending passive effects before deciding which lanes to work on,
25754 + // in case they schedule additional work.
25755 +
25756 +
25757 + var originalCallbackNode = root.callbackNode;
25758 + var didFlushPassiveEffects = flushPassiveEffects();
25759 +
25760 + if (didFlushPassiveEffects) {
25761 + // Something in the passive effect phase may have canceled the current task.
25762 + // Check if the task node for this root was changed.
25763 + if (root.callbackNode !== originalCallbackNode) {
25764 + // The current task was canceled. Exit. We don't need to call
25765 + // `ensureRootIsScheduled` because the check above implies either that
25766 + // there's a new task, or that there's no remaining work on this root.
25767 + return null;
25768 + }
25769 + } // Determine the next lanes to work on, using the fields stored
25770 + // on the root.
25771 +
25772 +
25773 + var lanes = getNextLanes(root, root === workInProgressRoot ? workInProgressRootRenderLanes : NoLanes);
25774 +
25775 + if (lanes === NoLanes) {
25776 + // Defensive coding. This is never expected to happen.
25777 + return null;
25778 + } // We disable time-slicing in some cases: if the work has been CPU-bound
25779 + // for too long ("expired" work, to prevent starvation), or we're in
25780 + // sync-updates-by-default mode.
25781 + // TODO: We only check `didTimeout` defensively, to account for a Scheduler
25782 + // bug we're still investigating. Once the bug in Scheduler is fixed,
25783 + // we can remove this, since we track expiration ourselves.
25784 +
25785 +
25786 + var shouldTimeSlice = !includesBlockingLane(root, lanes) && !includesExpiredLane(root, lanes) && ( !didTimeout);
25787 + var exitStatus = shouldTimeSlice ? renderRootConcurrent(root, lanes) : renderRootSync(root, lanes);
25788 +
25789 + if (exitStatus !== RootInProgress) {
25790 + if (exitStatus === RootErrored) {
25791 + // If something threw an error, try rendering one more time. We'll
25792 + // render synchronously to block concurrent data mutations, and we'll
25793 + // includes all pending updates are included. If it still fails after
25794 + // the second attempt, we'll give up and commit the resulting tree.
25795 + var errorRetryLanes = getLanesToRetrySynchronouslyOnError(root);
25796 +
25797 + if (errorRetryLanes !== NoLanes) {
25798 + lanes = errorRetryLanes;
25799 + exitStatus = recoverFromConcurrentError(root, errorRetryLanes);
25800 + }
25801 + }
25802 +
25803 + if (exitStatus === RootFatalErrored) {
25804 + var fatalError = workInProgressRootFatalError;
25805 + prepareFreshStack(root, NoLanes);
25806 + markRootSuspended$1(root, lanes);
25807 + ensureRootIsScheduled(root, now());
25808 + throw fatalError;
25809 + }
25810 +
25811 + if (exitStatus === RootDidNotComplete) {
25812 + // The render unwound without completing the tree. This happens in special
25813 + // cases where need to exit the current render without producing a
25814 + // consistent tree or committing.
25815 + //
25816 + // This should only happen during a concurrent render, not a discrete or
25817 + // synchronous update. We should have already checked for this when we
25818 + // unwound the stack.
25819 + markRootSuspended$1(root, lanes);
25820 + } else {
25821 + // The render completed.
25822 + // Check if this render may have yielded to a concurrent event, and if so,
25823 + // confirm that any newly rendered stores are consistent.
25824 + // TODO: It's possible that even a concurrent render may never have yielded
25825 + // to the main thread, if it was fast enough, or if it expired. We could
25826 + // skip the consistency check in that case, too.
25827 + var renderWasConcurrent = !includesBlockingLane(root, lanes);
25828 + var finishedWork = root.current.alternate;
25829 +
25830 + if (renderWasConcurrent && !isRenderConsistentWithExternalStores(finishedWork)) {
25831 + // A store was mutated in an interleaved event. Render again,
25832 + // synchronously, to block further mutations.
25833 + exitStatus = renderRootSync(root, lanes); // We need to check again if something threw
25834 +
25835 + if (exitStatus === RootErrored) {
25836 + var _errorRetryLanes = getLanesToRetrySynchronouslyOnError(root);
25837 +
25838 + if (_errorRetryLanes !== NoLanes) {
25839 + lanes = _errorRetryLanes;
25840 + exitStatus = recoverFromConcurrentError(root, _errorRetryLanes); // We assume the tree is now consistent because we didn't yield to any
25841 + // concurrent events.
25842 + }
25843 + }
25844 +
25845 + if (exitStatus === RootFatalErrored) {
25846 + var _fatalError = workInProgressRootFatalError;
25847 + prepareFreshStack(root, NoLanes);
25848 + markRootSuspended$1(root, lanes);
25849 + ensureRootIsScheduled(root, now());
25850 + throw _fatalError;
25851 + }
25852 + } // We now have a consistent tree. The next step is either to commit it,
25853 + // or, if something suspended, wait to commit it after a timeout.
25854 +
25855 +
25856 + root.finishedWork = finishedWork;
25857 + root.finishedLanes = lanes;
25858 + finishConcurrentRender(root, exitStatus, lanes);
25859 + }
25860 + }
25861 +
25862 + ensureRootIsScheduled(root, now());
25863 +
25864 + if (root.callbackNode === originalCallbackNode) {
25865 + // The task node scheduled for this root is the same one that's
25866 + // currently executed. Need to return a continuation.
25867 + return performConcurrentWorkOnRoot.bind(null, root);
25868 + }
25869 +
25870 + return null;
25871 + }
25872 +
25873 + function recoverFromConcurrentError(root, errorRetryLanes) {
25874 + // If an error occurred during hydration, discard server response and fall
25875 + // back to client side render.
25876 + // Before rendering again, save the errors from the previous attempt.
25877 + var errorsFromFirstAttempt = workInProgressRootConcurrentErrors;
25878 +
25879 + if (isRootDehydrated(root)) {
25880 + // The shell failed to hydrate. Set a flag to force a client rendering
25881 + // during the next attempt. To do this, we call prepareFreshStack now
25882 + // to create the root work-in-progress fiber. This is a bit weird in terms
25883 + // of factoring, because it relies on renderRootSync not calling
25884 + // prepareFreshStack again in the call below, which happens because the
25885 + // root and lanes haven't changed.
25886 + //
25887 + // TODO: I think what we should do is set ForceClientRender inside
25888 + // throwException, like we do for nested Suspense boundaries. The reason
25889 + // it's here instead is so we can switch to the synchronous work loop, too.
25890 + // Something to consider for a future refactor.
25891 + var rootWorkInProgress = prepareFreshStack(root, errorRetryLanes);
25892 + rootWorkInProgress.flags |= ForceClientRender;
25893 +
25894 + {
25895 + errorHydratingContainer(root.containerInfo);
25896 + }
25897 + }
25898 +
25899 + var exitStatus = renderRootSync(root, errorRetryLanes);
25900 +
25901 + if (exitStatus !== RootErrored) {
25902 + // Successfully finished rendering on retry
25903 + // The errors from the failed first attempt have been recovered. Add
25904 + // them to the collection of recoverable errors. We'll log them in the
25905 + // commit phase.
25906 + var errorsFromSecondAttempt = workInProgressRootRecoverableErrors;
25907 + workInProgressRootRecoverableErrors = errorsFromFirstAttempt; // The errors from the second attempt should be queued after the errors
25908 + // from the first attempt, to preserve the causal sequence.
25909 +
25910 + if (errorsFromSecondAttempt !== null) {
25911 + queueRecoverableErrors(errorsFromSecondAttempt);
25912 + }
25913 + }
25914 +
25915 + return exitStatus;
25916 + }
25917 +
25918 + function queueRecoverableErrors(errors) {
25919 + if (workInProgressRootRecoverableErrors === null) {
25920 + workInProgressRootRecoverableErrors = errors;
25921 + } else {
25922 + workInProgressRootRecoverableErrors.push.apply(workInProgressRootRecoverableErrors, errors);
25923 + }
25924 + }
25925 +
25926 + function finishConcurrentRender(root, exitStatus, lanes) {
25927 + switch (exitStatus) {
25928 + case RootInProgress:
25929 + case RootFatalErrored:
25930 + {
25931 + throw new Error('Root did not complete. This is a bug in React.');
25932 + }
25933 + // Flow knows about invariant, so it complains if I add a break
25934 + // statement, but eslint doesn't know about invariant, so it complains
25935 + // if I do. eslint-disable-next-line no-fallthrough
25936 +
25937 + case RootErrored:
25938 + {
25939 + // We should have already attempted to retry this tree. If we reached
25940 + // this point, it errored again. Commit it.
25941 + commitRoot(root, workInProgressRootRecoverableErrors, workInProgressTransitions);
25942 + break;
25943 + }
25944 +
25945 + case RootSuspended:
25946 + {
25947 + markRootSuspended$1(root, lanes); // We have an acceptable loading state. We need to figure out if we
25948 + // should immediately commit it or wait a bit.
25949 +
25950 + if (includesOnlyRetries(lanes) && // do not delay if we're inside an act() scope
25951 + !shouldForceFlushFallbacksInDEV()) {
25952 + // This render only included retries, no updates. Throttle committing
25953 + // retries so that we don't show too many loading states too quickly.
25954 + var msUntilTimeout = globalMostRecentFallbackTime + FALLBACK_THROTTLE_MS - now(); // Don't bother with a very short suspense time.
25955 +
25956 + if (msUntilTimeout > 10) {
25957 + var nextLanes = getNextLanes(root, NoLanes);
25958 +
25959 + if (nextLanes !== NoLanes) {
25960 + // There's additional work on this root.
25961 + break;
25962 + }
25963 +
25964 + var suspendedLanes = root.suspendedLanes;
25965 +
25966 + if (!isSubsetOfLanes(suspendedLanes, lanes)) {
25967 + // We should prefer to render the fallback of at the last
25968 + // suspended level. Ping the last suspended level to try
25969 + // rendering it again.
25970 + // FIXME: What if the suspended lanes are Idle? Should not restart.
25971 + var eventTime = requestEventTime();
25972 + markRootPinged(root, suspendedLanes);
25973 + break;
25974 + } // The render is suspended, it hasn't timed out, and there's no
25975 + // lower priority work to do. Instead of committing the fallback
25976 + // immediately, wait for more data to arrive.
25977 +
25978 +
25979 + root.timeoutHandle = scheduleTimeout(commitRoot.bind(null, root, workInProgressRootRecoverableErrors, workInProgressTransitions), msUntilTimeout);
25980 + break;
25981 + }
25982 + } // The work expired. Commit immediately.
25983 +
25984 +
25985 + commitRoot(root, workInProgressRootRecoverableErrors, workInProgressTransitions);
25986 + break;
25987 + }
25988 +
25989 + case RootSuspendedWithDelay:
25990 + {
25991 + markRootSuspended$1(root, lanes);
25992 +
25993 + if (includesOnlyTransitions(lanes)) {
25994 + // This is a transition, so we should exit without committing a
25995 + // placeholder and without scheduling a timeout. Delay indefinitely
25996 + // until we receive more data.
25997 + break;
25998 + }
25999 +
26000 + if (!shouldForceFlushFallbacksInDEV()) {
26001 + // This is not a transition, but we did trigger an avoided state.
26002 + // Schedule a placeholder to display after a short delay, using the Just
26003 + // Noticeable Difference.
26004 + // TODO: Is the JND optimization worth the added complexity? If this is
26005 + // the only reason we track the event time, then probably not.
26006 + // Consider removing.
26007 + var mostRecentEventTime = getMostRecentEventTime(root, lanes);
26008 + var eventTimeMs = mostRecentEventTime;
26009 + var timeElapsedMs = now() - eventTimeMs;
26010 +
26011 + var _msUntilTimeout = jnd(timeElapsedMs) - timeElapsedMs; // Don't bother with a very short suspense time.
26012 +
26013 +
26014 + if (_msUntilTimeout > 10) {
26015 + // Instead of committing the fallback immediately, wait for more data
26016 + // to arrive.
26017 + root.timeoutHandle = scheduleTimeout(commitRoot.bind(null, root, workInProgressRootRecoverableErrors, workInProgressTransitions), _msUntilTimeout);
26018 + break;
26019 + }
26020 + } // Commit the placeholder.
26021 +
26022 +
26023 + commitRoot(root, workInProgressRootRecoverableErrors, workInProgressTransitions);
26024 + break;
26025 + }
26026 +
26027 + case RootCompleted:
26028 + {
26029 + // The work completed. Ready to commit.
26030 + commitRoot(root, workInProgressRootRecoverableErrors, workInProgressTransitions);
26031 + break;
26032 + }
26033 +
26034 + default:
26035 + {
26036 + throw new Error('Unknown root exit status.');
26037 + }
26038 + }
26039 + }
26040 +
26041 + function isRenderConsistentWithExternalStores(finishedWork) {
26042 + // Search the rendered tree for external store reads, and check whether the
26043 + // stores were mutated in a concurrent event. Intentionally using an iterative
26044 + // loop instead of recursion so we can exit early.
26045 + var node = finishedWork;
26046 +
26047 + while (true) {
26048 + if (node.flags & StoreConsistency) {
26049 + var updateQueue = node.updateQueue;
26050 +
26051 + if (updateQueue !== null) {
26052 + var checks = updateQueue.stores;
26053 +
26054 + if (checks !== null) {
26055 + for (var i = 0; i < checks.length; i++) {
26056 + var check = checks[i];
26057 + var getSnapshot = check.getSnapshot;
26058 + var renderedValue = check.value;
26059 +
26060 + try {
26061 + if (!objectIs(getSnapshot(), renderedValue)) {
26062 + // Found an inconsistent store.
26063 + return false;
26064 + }
26065 + } catch (error) {
26066 + // If `getSnapshot` throws, return `false`. This will schedule
26067 + // a re-render, and the error will be rethrown during render.
26068 + return false;
26069 + }
26070 + }
26071 + }
26072 + }
26073 + }
26074 +
26075 + var child = node.child;
26076 +
26077 + if (node.subtreeFlags & StoreConsistency && child !== null) {
26078 + child.return = node;
26079 + node = child;
26080 + continue;
26081 + }
26082 +
26083 + if (node === finishedWork) {
26084 + return true;
26085 + }
26086 +
26087 + while (node.sibling === null) {
26088 + if (node.return === null || node.return === finishedWork) {
26089 + return true;
26090 + }
26091 +
26092 + node = node.return;
26093 + }
26094 +
26095 + node.sibling.return = node.return;
26096 + node = node.sibling;
26097 + } // Flow doesn't know this is unreachable, but eslint does
26098 + // eslint-disable-next-line no-unreachable
26099 +
26100 +
26101 + return true;
26102 + }
26103 +
26104 + function markRootSuspended$1(root, suspendedLanes) {
26105 + // When suspending, we should always exclude lanes that were pinged or (more
26106 + // rarely, since we try to avoid it) updated during the render phase.
26107 + // TODO: Lol maybe there's a better way to factor this besides this
26108 + // obnoxiously named function :)
26109 + suspendedLanes = removeLanes(suspendedLanes, workInProgressRootPingedLanes);
26110 + suspendedLanes = removeLanes(suspendedLanes, workInProgressRootInterleavedUpdatedLanes);
26111 + markRootSuspended(root, suspendedLanes);
26112 + } // This is the entry point for synchronous tasks that don't go
26113 + // through Scheduler
26114 +
26115 +
26116 + function performSyncWorkOnRoot(root) {
26117 + {
26118 + syncNestedUpdateFlag();
26119 + }
26120 +
26121 + if ((executionContext & (RenderContext | CommitContext)) !== NoContext) {
26122 + throw new Error('Should not already be working.');
26123 + }
26124 +
26125 + flushPassiveEffects();
26126 + var lanes = getNextLanes(root, NoLanes);
26127 +
26128 + if (!includesSomeLane(lanes, SyncLane)) {
26129 + // There's no remaining sync work left.
26130 + ensureRootIsScheduled(root, now());
26131 + return null;
26132 + }
26133 +
26134 + var exitStatus = renderRootSync(root, lanes);
26135 +
26136 + if (root.tag !== LegacyRoot && exitStatus === RootErrored) {
26137 + // If something threw an error, try rendering one more time. We'll render
26138 + // synchronously to block concurrent data mutations, and we'll includes
26139 + // all pending updates are included. If it still fails after the second
26140 + // attempt, we'll give up and commit the resulting tree.
26141 + var errorRetryLanes = getLanesToRetrySynchronouslyOnError(root);
26142 +
26143 + if (errorRetryLanes !== NoLanes) {
26144 + lanes = errorRetryLanes;
26145 + exitStatus = recoverFromConcurrentError(root, errorRetryLanes);
26146 + }
26147 + }
26148 +
26149 + if (exitStatus === RootFatalErrored) {
26150 + var fatalError = workInProgressRootFatalError;
26151 + prepareFreshStack(root, NoLanes);
26152 + markRootSuspended$1(root, lanes);
26153 + ensureRootIsScheduled(root, now());
26154 + throw fatalError;
26155 + }
26156 +
26157 + if (exitStatus === RootDidNotComplete) {
26158 + throw new Error('Root did not complete. This is a bug in React.');
26159 + } // We now have a consistent tree. Because this is a sync render, we
26160 + // will commit it even if something suspended.
26161 +
26162 +
26163 + var finishedWork = root.current.alternate;
26164 + root.finishedWork = finishedWork;
26165 + root.finishedLanes = lanes;
26166 + commitRoot(root, workInProgressRootRecoverableErrors, workInProgressTransitions); // Before exiting, make sure there's a callback scheduled for the next
26167 + // pending level.
26168 +
26169 + ensureRootIsScheduled(root, now());
26170 + return null;
26171 + }
26172 +
26173 + function flushRoot(root, lanes) {
26174 + if (lanes !== NoLanes) {
26175 + markRootEntangled(root, mergeLanes(lanes, SyncLane));
26176 + ensureRootIsScheduled(root, now());
26177 +
26178 + if ((executionContext & (RenderContext | CommitContext)) === NoContext) {
26179 + resetRenderTimer();
26180 + flushSyncCallbacks();
26181 + }
26182 + }
26183 + }
26184 + function batchedUpdates$1(fn, a) {
26185 + var prevExecutionContext = executionContext;
26186 + executionContext |= BatchedContext;
26187 +
26188 + try {
26189 + return fn(a);
26190 + } finally {
26191 + executionContext = prevExecutionContext; // If there were legacy sync updates, flush them at the end of the outer
26192 + // most batchedUpdates-like method.
26193 +
26194 + if (executionContext === NoContext && // Treat `act` as if it's inside `batchedUpdates`, even in legacy mode.
26195 + !( ReactCurrentActQueue$1.isBatchingLegacy)) {
26196 + resetRenderTimer();
26197 + flushSyncCallbacksOnlyInLegacyMode();
26198 + }
26199 + }
26200 + }
26201 + function discreteUpdates(fn, a, b, c, d) {
26202 + var previousPriority = getCurrentUpdatePriority();
26203 + var prevTransition = ReactCurrentBatchConfig$3.transition;
26204 +
26205 + try {
26206 + ReactCurrentBatchConfig$3.transition = null;
26207 + setCurrentUpdatePriority(DiscreteEventPriority);
26208 + return fn(a, b, c, d);
26209 + } finally {
26210 + setCurrentUpdatePriority(previousPriority);
26211 + ReactCurrentBatchConfig$3.transition = prevTransition;
26212 +
26213 + if (executionContext === NoContext) {
26214 + resetRenderTimer();
26215 + }
26216 + }
26217 + } // Overload the definition to the two valid signatures.
26218 + // Warning, this opts-out of checking the function body.
26219 +
26220 + // eslint-disable-next-line no-redeclare
26221 + function flushSync(fn) {
26222 + // In legacy mode, we flush pending passive effects at the beginning of the
26223 + // next event, not at the end of the previous one.
26224 + if (rootWithPendingPassiveEffects !== null && rootWithPendingPassiveEffects.tag === LegacyRoot && (executionContext & (RenderContext | CommitContext)) === NoContext) {
26225 + flushPassiveEffects();
26226 + }
26227 +
26228 + var prevExecutionContext = executionContext;
26229 + executionContext |= BatchedContext;
26230 + var prevTransition = ReactCurrentBatchConfig$3.transition;
26231 + var previousPriority = getCurrentUpdatePriority();
26232 +
26233 + try {
26234 + ReactCurrentBatchConfig$3.transition = null;
26235 + setCurrentUpdatePriority(DiscreteEventPriority);
26236 +
26237 + if (fn) {
26238 + return fn();
26239 + } else {
26240 + return undefined;
26241 + }
26242 + } finally {
26243 + setCurrentUpdatePriority(previousPriority);
26244 + ReactCurrentBatchConfig$3.transition = prevTransition;
26245 + executionContext = prevExecutionContext; // Flush the immediate callbacks that were scheduled during this batch.
26246 + // Note that this will happen even if batchedUpdates is higher up
26247 + // the stack.
26248 +
26249 + if ((executionContext & (RenderContext | CommitContext)) === NoContext) {
26250 + flushSyncCallbacks();
26251 + }
26252 + }
26253 + }
26254 + function isAlreadyRendering() {
26255 + // Used by the renderer to print a warning if certain APIs are called from
26256 + // the wrong context.
26257 + return (executionContext & (RenderContext | CommitContext)) !== NoContext;
26258 + }
26259 + function pushRenderLanes(fiber, lanes) {
26260 + push(subtreeRenderLanesCursor, subtreeRenderLanes, fiber);
26261 + subtreeRenderLanes = mergeLanes(subtreeRenderLanes, lanes);
26262 + workInProgressRootIncludedLanes = mergeLanes(workInProgressRootIncludedLanes, lanes);
26263 + }
26264 + function popRenderLanes(fiber) {
26265 + subtreeRenderLanes = subtreeRenderLanesCursor.current;
26266 + pop(subtreeRenderLanesCursor, fiber);
26267 + }
26268 +
26269 + function prepareFreshStack(root, lanes) {
26270 + root.finishedWork = null;
26271 + root.finishedLanes = NoLanes;
26272 + var timeoutHandle = root.timeoutHandle;
26273 +
26274 + if (timeoutHandle !== noTimeout) {
26275 + // The root previous suspended and scheduled a timeout to commit a fallback
26276 + // state. Now that we have additional work, cancel the timeout.
26277 + root.timeoutHandle = noTimeout; // $FlowFixMe Complains noTimeout is not a TimeoutID, despite the check above
26278 +
26279 + cancelTimeout(timeoutHandle);
26280 + }
26281 +
26282 + if (workInProgress !== null) {
26283 + var interruptedWork = workInProgress.return;
26284 +
26285 + while (interruptedWork !== null) {
26286 + var current = interruptedWork.alternate;
26287 + unwindInterruptedWork(current, interruptedWork);
26288 + interruptedWork = interruptedWork.return;
26289 + }
26290 + }
26291 +
26292 + workInProgressRoot = root;
26293 + var rootWorkInProgress = createWorkInProgress(root.current, null);
26294 + workInProgress = rootWorkInProgress;
26295 + workInProgressRootRenderLanes = subtreeRenderLanes = workInProgressRootIncludedLanes = lanes;
26296 + workInProgressRootExitStatus = RootInProgress;
26297 + workInProgressRootFatalError = null;
26298 + workInProgressRootSkippedLanes = NoLanes;
26299 + workInProgressRootInterleavedUpdatedLanes = NoLanes;
26300 + workInProgressRootPingedLanes = NoLanes;
26301 + workInProgressRootConcurrentErrors = null;
26302 + workInProgressRootRecoverableErrors = null;
26303 + finishQueueingConcurrentUpdates();
26304 +
26305 + {
26306 + ReactStrictModeWarnings.discardPendingWarnings();
26307 + }
26308 +
26309 + return rootWorkInProgress;
26310 + }
26311 +
26312 + function handleError(root, thrownValue) {
26313 + do {
26314 + var erroredWork = workInProgress;
26315 +
26316 + try {
26317 + // Reset module-level state that was set during the render phase.
26318 + resetContextDependencies();
26319 + resetHooksAfterThrow();
26320 + resetCurrentFiber(); // TODO: I found and added this missing line while investigating a
26321 + // separate issue. Write a regression test using string refs.
26322 +
26323 + ReactCurrentOwner$2.current = null;
26324 +
26325 + if (erroredWork === null || erroredWork.return === null) {
26326 + // Expected to be working on a non-root fiber. This is a fatal error
26327 + // because there's no ancestor that can handle it; the root is
26328 + // supposed to capture all errors that weren't caught by an error
26329 + // boundary.
26330 + workInProgressRootExitStatus = RootFatalErrored;
26331 + workInProgressRootFatalError = thrownValue; // Set `workInProgress` to null. This represents advancing to the next
26332 + // sibling, or the parent if there are no siblings. But since the root
26333 + // has no siblings nor a parent, we set it to null. Usually this is
26334 + // handled by `completeUnitOfWork` or `unwindWork`, but since we're
26335 + // intentionally not calling those, we need set it here.
26336 + // TODO: Consider calling `unwindWork` to pop the contexts.
26337 +
26338 + workInProgress = null;
26339 + return;
26340 + }
26341 +
26342 + if (enableProfilerTimer && erroredWork.mode & ProfileMode) {
26343 + // Record the time spent rendering before an error was thrown. This
26344 + // avoids inaccurate Profiler durations in the case of a
26345 + // suspended render.
26346 + stopProfilerTimerIfRunningAndRecordDelta(erroredWork, true);
26347 + }
26348 +
26349 + if (enableSchedulingProfiler) {
26350 + markComponentRenderStopped();
26351 +
26352 + if (thrownValue !== null && typeof thrownValue === 'object' && typeof thrownValue.then === 'function') {
26353 + var wakeable = thrownValue;
26354 + markComponentSuspended(erroredWork, wakeable, workInProgressRootRenderLanes);
26355 + } else {
26356 + markComponentErrored(erroredWork, thrownValue, workInProgressRootRenderLanes);
26357 + }
26358 + }
26359 +
26360 + throwException(root, erroredWork.return, erroredWork, thrownValue, workInProgressRootRenderLanes);
26361 + completeUnitOfWork(erroredWork);
26362 + } catch (yetAnotherThrownValue) {
26363 + // Something in the return path also threw.
26364 + thrownValue = yetAnotherThrownValue;
26365 +
26366 + if (workInProgress === erroredWork && erroredWork !== null) {
26367 + // If this boundary has already errored, then we had trouble processing
26368 + // the error. Bubble it to the next boundary.
26369 + erroredWork = erroredWork.return;
26370 + workInProgress = erroredWork;
26371 + } else {
26372 + erroredWork = workInProgress;
26373 + }
26374 +
26375 + continue;
26376 + } // Return to the normal work loop.
26377 +
26378 +
26379 + return;
26380 + } while (true);
26381 + }
26382 +
26383 + function pushDispatcher() {
26384 + var prevDispatcher = ReactCurrentDispatcher$2.current;
26385 + ReactCurrentDispatcher$2.current = ContextOnlyDispatcher;
26386 +
26387 + if (prevDispatcher === null) {
26388 + // The React isomorphic package does not include a default dispatcher.
26389 + // Instead the first renderer will lazily attach one, in order to give
26390 + // nicer error messages.
26391 + return ContextOnlyDispatcher;
26392 + } else {
26393 + return prevDispatcher;
26394 + }
26395 + }
26396 +
26397 + function popDispatcher(prevDispatcher) {
26398 + ReactCurrentDispatcher$2.current = prevDispatcher;
26399 + }
26400 +
26401 + function markCommitTimeOfFallback() {
26402 + globalMostRecentFallbackTime = now();
26403 + }
26404 + function markSkippedUpdateLanes(lane) {
26405 + workInProgressRootSkippedLanes = mergeLanes(lane, workInProgressRootSkippedLanes);
26406 + }
26407 + function renderDidSuspend() {
26408 + if (workInProgressRootExitStatus === RootInProgress) {
26409 + workInProgressRootExitStatus = RootSuspended;
26410 + }
26411 + }
26412 + function renderDidSuspendDelayIfPossible() {
26413 + if (workInProgressRootExitStatus === RootInProgress || workInProgressRootExitStatus === RootSuspended || workInProgressRootExitStatus === RootErrored) {
26414 + workInProgressRootExitStatus = RootSuspendedWithDelay;
26415 + } // Check if there are updates that we skipped tree that might have unblocked
26416 + // this render.
26417 +
26418 +
26419 + if (workInProgressRoot !== null && (includesNonIdleWork(workInProgressRootSkippedLanes) || includesNonIdleWork(workInProgressRootInterleavedUpdatedLanes))) {
26420 + // Mark the current render as suspended so that we switch to working on
26421 + // the updates that were skipped. Usually we only suspend at the end of
26422 + // the render phase.
26423 + // TODO: We should probably always mark the root as suspended immediately
26424 + // (inside this function), since by suspending at the end of the render
26425 + // phase introduces a potential mistake where we suspend lanes that were
26426 + // pinged or updated while we were rendering.
26427 + markRootSuspended$1(workInProgressRoot, workInProgressRootRenderLanes);
26428 + }
26429 + }
26430 + function renderDidError(error) {
26431 + if (workInProgressRootExitStatus !== RootSuspendedWithDelay) {
26432 + workInProgressRootExitStatus = RootErrored;
26433 + }
26434 +
26435 + if (workInProgressRootConcurrentErrors === null) {
26436 + workInProgressRootConcurrentErrors = [error];
26437 + } else {
26438 + workInProgressRootConcurrentErrors.push(error);
26439 + }
26440 + } // Called during render to determine if anything has suspended.
26441 + // Returns false if we're not sure.
26442 +
26443 + function renderHasNotSuspendedYet() {
26444 + // If something errored or completed, we can't really be sure,
26445 + // so those are false.
26446 + return workInProgressRootExitStatus === RootInProgress;
26447 + }
26448 +
26449 + function renderRootSync(root, lanes) {
26450 + var prevExecutionContext = executionContext;
26451 + executionContext |= RenderContext;
26452 + var prevDispatcher = pushDispatcher(); // If the root or lanes have changed, throw out the existing stack
26453 + // and prepare a fresh one. Otherwise we'll continue where we left off.
26454 +
26455 + if (workInProgressRoot !== root || workInProgressRootRenderLanes !== lanes) {
26456 + {
26457 + if (isDevToolsPresent) {
26458 + var memoizedUpdaters = root.memoizedUpdaters;
26459 +
26460 + if (memoizedUpdaters.size > 0) {
26461 + restorePendingUpdaters(root, workInProgressRootRenderLanes);
26462 + memoizedUpdaters.clear();
26463 + } // At this point, move Fibers that scheduled the upcoming work from the Map to the Set.
26464 + // If we bailout on this work, we'll move them back (like above).
26465 + // It's important to move them now in case the work spawns more work at the same priority with different updaters.
26466 + // That way we can keep the current update and future updates separate.
26467 +
26468 +
26469 + movePendingFibersToMemoized(root, lanes);
26470 + }
26471 + }
26472 +
26473 + workInProgressTransitions = getTransitionsForLanes();
26474 + prepareFreshStack(root, lanes);
26475 + }
26476 +
26477 + {
26478 + markRenderStarted(lanes);
26479 + }
26480 +
26481 + do {
26482 + try {
26483 + workLoopSync();
26484 + break;
26485 + } catch (thrownValue) {
26486 + handleError(root, thrownValue);
26487 + }
26488 + } while (true);
26489 +
26490 + resetContextDependencies();
26491 + executionContext = prevExecutionContext;
26492 + popDispatcher(prevDispatcher);
26493 +
26494 + if (workInProgress !== null) {
26495 + // This is a sync render, so we should have finished the whole tree.
26496 + throw new Error('Cannot commit an incomplete root. This error is likely caused by a ' + 'bug in React. Please file an issue.');
26497 + }
26498 +
26499 + {
26500 + markRenderStopped();
26501 + } // Set this to null to indicate there's no in-progress render.
26502 +
26503 +
26504 + workInProgressRoot = null;
26505 + workInProgressRootRenderLanes = NoLanes;
26506 + return workInProgressRootExitStatus;
26507 + } // The work loop is an extremely hot path. Tell Closure not to inline it.
26508 +
26509 + /** @noinline */
26510 +
26511 +
26512 + function workLoopSync() {
26513 + // Already timed out, so perform work without checking if we need to yield.
26514 + while (workInProgress !== null) {
26515 + performUnitOfWork(workInProgress);
26516 + }
26517 + }
26518 +
26519 + function renderRootConcurrent(root, lanes) {
26520 + var prevExecutionContext = executionContext;
26521 + executionContext |= RenderContext;
26522 + var prevDispatcher = pushDispatcher(); // If the root or lanes have changed, throw out the existing stack
26523 + // and prepare a fresh one. Otherwise we'll continue where we left off.
26524 +
26525 + if (workInProgressRoot !== root || workInProgressRootRenderLanes !== lanes) {
26526 + {
26527 + if (isDevToolsPresent) {
26528 + var memoizedUpdaters = root.memoizedUpdaters;
26529 +
26530 + if (memoizedUpdaters.size > 0) {
26531 + restorePendingUpdaters(root, workInProgressRootRenderLanes);
26532 + memoizedUpdaters.clear();
26533 + } // At this point, move Fibers that scheduled the upcoming work from the Map to the Set.
26534 + // If we bailout on this work, we'll move them back (like above).
26535 + // It's important to move them now in case the work spawns more work at the same priority with different updaters.
26536 + // That way we can keep the current update and future updates separate.
26537 +
26538 +
26539 + movePendingFibersToMemoized(root, lanes);
26540 + }
26541 + }
26542 +
26543 + workInProgressTransitions = getTransitionsForLanes();
26544 + resetRenderTimer();
26545 + prepareFreshStack(root, lanes);
26546 + }
26547 +
26548 + {
26549 + markRenderStarted(lanes);
26550 + }
26551 +
26552 + do {
26553 + try {
26554 + workLoopConcurrent();
26555 + break;
26556 + } catch (thrownValue) {
26557 + handleError(root, thrownValue);
26558 + }
26559 + } while (true);
26560 +
26561 + resetContextDependencies();
26562 + popDispatcher(prevDispatcher);
26563 + executionContext = prevExecutionContext;
26564 +
26565 +
26566 + if (workInProgress !== null) {
26567 + // Still work remaining.
26568 + {
26569 + markRenderYielded();
26570 + }
26571 +
26572 + return RootInProgress;
26573 + } else {
26574 + // Completed the tree.
26575 + {
26576 + markRenderStopped();
26577 + } // Set this to null to indicate there's no in-progress render.
26578 +
26579 +
26580 + workInProgressRoot = null;
26581 + workInProgressRootRenderLanes = NoLanes; // Return the final exit status.
26582 +
26583 + return workInProgressRootExitStatus;
26584 + }
26585 + }
26586 + /** @noinline */
26587 +
26588 +
26589 + function workLoopConcurrent() {
26590 + // Perform work until Scheduler asks us to yield
26591 + while (workInProgress !== null && !shouldYield()) {
26592 + performUnitOfWork(workInProgress);
26593 + }
26594 + }
26595 +
26596 + function performUnitOfWork(unitOfWork) {
26597 + // The current, flushed, state of this fiber is the alternate. Ideally
26598 + // nothing should rely on this, but relying on it here means that we don't
26599 + // need an additional field on the work in progress.
26600 + var current = unitOfWork.alternate;
26601 + setCurrentFiber(unitOfWork);
26602 + var next;
26603 +
26604 + if ( (unitOfWork.mode & ProfileMode) !== NoMode) {
26605 + startProfilerTimer(unitOfWork);
26606 + next = beginWork$1(current, unitOfWork, subtreeRenderLanes);
26607 + stopProfilerTimerIfRunningAndRecordDelta(unitOfWork, true);
26608 + } else {
26609 + next = beginWork$1(current, unitOfWork, subtreeRenderLanes);
26610 + }
26611 +
26612 + resetCurrentFiber();
26613 + unitOfWork.memoizedProps = unitOfWork.pendingProps;
26614 +
26615 + if (next === null) {
26616 + // If this doesn't spawn new work, complete the current work.
26617 + completeUnitOfWork(unitOfWork);
26618 + } else {
26619 + workInProgress = next;
26620 + }
26621 +
26622 + ReactCurrentOwner$2.current = null;
26623 + }
26624 +
26625 + function completeUnitOfWork(unitOfWork) {
26626 + // Attempt to complete the current unit of work, then move to the next
26627 + // sibling. If there are no more siblings, return to the parent fiber.
26628 + var completedWork = unitOfWork;
26629 +
26630 + do {
26631 + // The current, flushed, state of this fiber is the alternate. Ideally
26632 + // nothing should rely on this, but relying on it here means that we don't
26633 + // need an additional field on the work in progress.
26634 + var current = completedWork.alternate;
26635 + var returnFiber = completedWork.return; // Check if the work completed or if something threw.
26636 +
26637 + if ((completedWork.flags & Incomplete) === NoFlags) {
26638 + setCurrentFiber(completedWork);
26639 + var next = void 0;
26640 +
26641 + if ( (completedWork.mode & ProfileMode) === NoMode) {
26642 + next = completeWork(current, completedWork, subtreeRenderLanes);
26643 + } else {
26644 + startProfilerTimer(completedWork);
26645 + next = completeWork(current, completedWork, subtreeRenderLanes); // Update render duration assuming we didn't error.
26646 +
26647 + stopProfilerTimerIfRunningAndRecordDelta(completedWork, false);
26648 + }
26649 +
26650 + resetCurrentFiber();
26651 +
26652 + if (next !== null) {
26653 + // Completing this fiber spawned new work. Work on that next.
26654 + workInProgress = next;
26655 + return;
26656 + }
26657 + } else {
26658 + // This fiber did not complete because something threw. Pop values off
26659 + // the stack without entering the complete phase. If this is a boundary,
26660 + // capture values if possible.
26661 + var _next = unwindWork(current, completedWork); // Because this fiber did not complete, don't reset its lanes.
26662 +
26663 +
26664 + if (_next !== null) {
26665 + // If completing this work spawned new work, do that next. We'll come
26666 + // back here again.
26667 + // Since we're restarting, remove anything that is not a host effect
26668 + // from the effect tag.
26669 + _next.flags &= HostEffectMask;
26670 + workInProgress = _next;
26671 + return;
26672 + }
26673 +
26674 + if ( (completedWork.mode & ProfileMode) !== NoMode) {
26675 + // Record the render duration for the fiber that errored.
26676 + stopProfilerTimerIfRunningAndRecordDelta(completedWork, false); // Include the time spent working on failed children before continuing.
26677 +
26678 + var actualDuration = completedWork.actualDuration;
26679 + var child = completedWork.child;
26680 +
26681 + while (child !== null) {
26682 + actualDuration += child.actualDuration;
26683 + child = child.sibling;
26684 + }
26685 +
26686 + completedWork.actualDuration = actualDuration;
26687 + }
26688 +
26689 + if (returnFiber !== null) {
26690 + // Mark the parent fiber as incomplete and clear its subtree flags.
26691 + returnFiber.flags |= Incomplete;
26692 + returnFiber.subtreeFlags = NoFlags;
26693 + returnFiber.deletions = null;
26694 + } else {
26695 + // We've unwound all the way to the root.
26696 + workInProgressRootExitStatus = RootDidNotComplete;
26697 + workInProgress = null;
26698 + return;
26699 + }
26700 + }
26701 +
26702 + var siblingFiber = completedWork.sibling;
26703 +
26704 + if (siblingFiber !== null) {
26705 + // If there is more work to do in this returnFiber, do that next.
26706 + workInProgress = siblingFiber;
26707 + return;
26708 + } // Otherwise, return to the parent
26709 +
26710 +
26711 + completedWork = returnFiber; // Update the next thing we're working on in case something throws.
26712 +
26713 + workInProgress = completedWork;
26714 + } while (completedWork !== null); // We've reached the root.
26715 +
26716 +
26717 + if (workInProgressRootExitStatus === RootInProgress) {
26718 + workInProgressRootExitStatus = RootCompleted;
26719 + }
26720 + }
26721 +
26722 + function commitRoot(root, recoverableErrors, transitions) {
26723 + // TODO: This no longer makes any sense. We already wrap the mutation and
26724 + // layout phases. Should be able to remove.
26725 + var previousUpdateLanePriority = getCurrentUpdatePriority();
26726 + var prevTransition = ReactCurrentBatchConfig$3.transition;
26727 +
26728 + try {
26729 + ReactCurrentBatchConfig$3.transition = null;
26730 + setCurrentUpdatePriority(DiscreteEventPriority);
26731 + commitRootImpl(root, recoverableErrors, transitions, previousUpdateLanePriority);
26732 + } finally {
26733 + ReactCurrentBatchConfig$3.transition = prevTransition;
26734 + setCurrentUpdatePriority(previousUpdateLanePriority);
26735 + }
26736 +
26737 + return null;
26738 + }
26739 +
26740 + function commitRootImpl(root, recoverableErrors, transitions, renderPriorityLevel) {
26741 + do {
26742 + // `flushPassiveEffects` will call `flushSyncUpdateQueue` at the end, which
26743 + // means `flushPassiveEffects` will sometimes result in additional
26744 + // passive effects. So we need to keep flushing in a loop until there are
26745 + // no more pending effects.
26746 + // TODO: Might be better if `flushPassiveEffects` did not automatically
26747 + // flush synchronous work at the end, to avoid factoring hazards like this.
26748 + flushPassiveEffects();
26749 + } while (rootWithPendingPassiveEffects !== null);
26750 +
26751 + flushRenderPhaseStrictModeWarningsInDEV();
26752 +
26753 + if ((executionContext & (RenderContext | CommitContext)) !== NoContext) {
26754 + throw new Error('Should not already be working.');
26755 + }
26756 +
26757 + var finishedWork = root.finishedWork;
26758 + var lanes = root.finishedLanes;
26759 +
26760 + {
26761 + markCommitStarted(lanes);
26762 + }
26763 +
26764 + if (finishedWork === null) {
26765 +
26766 + {
26767 + markCommitStopped();
26768 + }
26769 +
26770 + return null;
26771 + } else {
26772 + {
26773 + if (lanes === NoLanes) {
26774 + error('root.finishedLanes should not be empty during a commit. This is a ' + 'bug in React.');
26775 + }
26776 + }
26777 + }
26778 +
26779 + root.finishedWork = null;
26780 + root.finishedLanes = NoLanes;
26781 +
26782 + if (finishedWork === root.current) {
26783 + throw new Error('Cannot commit the same tree as before. This error is likely caused by ' + 'a bug in React. Please file an issue.');
26784 + } // commitRoot never returns a continuation; it always finishes synchronously.
26785 + // So we can clear these now to allow a new callback to be scheduled.
26786 +
26787 +
26788 + root.callbackNode = null;
26789 + root.callbackPriority = NoLane; // Update the first and last pending times on this root. The new first
26790 + // pending time is whatever is left on the root fiber.
26791 +
26792 + var remainingLanes = mergeLanes(finishedWork.lanes, finishedWork.childLanes);
26793 + markRootFinished(root, remainingLanes);
26794 +
26795 + if (root === workInProgressRoot) {
26796 + // We can reset these now that they are finished.
26797 + workInProgressRoot = null;
26798 + workInProgress = null;
26799 + workInProgressRootRenderLanes = NoLanes;
26800 + } // If there are pending passive effects, schedule a callback to process them.
26801 + // Do this as early as possible, so it is queued before anything else that
26802 + // might get scheduled in the commit phase. (See #16714.)
26803 + // TODO: Delete all other places that schedule the passive effect callback
26804 + // They're redundant.
26805 +
26806 +
26807 + if ((finishedWork.subtreeFlags & PassiveMask) !== NoFlags || (finishedWork.flags & PassiveMask) !== NoFlags) {
26808 + if (!rootDoesHavePassiveEffects) {
26809 + rootDoesHavePassiveEffects = true;
26810 + // to store it in pendingPassiveTransitions until they get processed
26811 + // We need to pass this through as an argument to commitRoot
26812 + // because workInProgressTransitions might have changed between
26813 + // the previous render and commit if we throttle the commit
26814 + // with setTimeout
26815 +
26816 + pendingPassiveTransitions = transitions;
26817 + scheduleCallback$1(NormalPriority, function () {
26818 + flushPassiveEffects(); // This render triggered passive effects: release the root cache pool
26819 + // *after* passive effects fire to avoid freeing a cache pool that may
26820 + // be referenced by a node in the tree (HostRoot, Cache boundary etc)
26821 +
26822 + return null;
26823 + });
26824 + }
26825 + } // Check if there are any effects in the whole tree.
26826 + // TODO: This is left over from the effect list implementation, where we had
26827 + // to check for the existence of `firstEffect` to satisfy Flow. I think the
26828 + // only other reason this optimization exists is because it affects profiling.
26829 + // Reconsider whether this is necessary.
26830 +
26831 +
26832 + var subtreeHasEffects = (finishedWork.subtreeFlags & (BeforeMutationMask | MutationMask | LayoutMask | PassiveMask)) !== NoFlags;
26833 + var rootHasEffect = (finishedWork.flags & (BeforeMutationMask | MutationMask | LayoutMask | PassiveMask)) !== NoFlags;
26834 +
26835 + if (subtreeHasEffects || rootHasEffect) {
26836 + var prevTransition = ReactCurrentBatchConfig$3.transition;
26837 + ReactCurrentBatchConfig$3.transition = null;
26838 + var previousPriority = getCurrentUpdatePriority();
26839 + setCurrentUpdatePriority(DiscreteEventPriority);
26840 + var prevExecutionContext = executionContext;
26841 + executionContext |= CommitContext; // Reset this to null before calling lifecycles
26842 +
26843 + ReactCurrentOwner$2.current = null; // The commit phase is broken into several sub-phases. We do a separate pass
26844 + // of the effect list for each phase: all mutation effects come before all
26845 + // layout effects, and so on.
26846 + // The first phase a "before mutation" phase. We use this phase to read the
26847 + // state of the host tree right before we mutate it. This is where
26848 + // getSnapshotBeforeUpdate is called.
26849 +
26850 + var shouldFireAfterActiveInstanceBlur = commitBeforeMutationEffects(root, finishedWork);
26851 +
26852 + {
26853 + // Mark the current commit time to be shared by all Profilers in this
26854 + // batch. This enables them to be grouped later.
26855 + recordCommitTime();
26856 + }
26857 +
26858 +
26859 + commitMutationEffects(root, finishedWork, lanes);
26860 +
26861 + resetAfterCommit(root.containerInfo); // The work-in-progress tree is now the current tree. This must come after
26862 + // the mutation phase, so that the previous tree is still current during
26863 + // componentWillUnmount, but before the layout phase, so that the finished
26864 + // work is current during componentDidMount/Update.
26865 +
26866 + root.current = finishedWork; // The next phase is the layout phase, where we call effects that read
26867 +
26868 + {
26869 + markLayoutEffectsStarted(lanes);
26870 + }
26871 +
26872 + commitLayoutEffects(finishedWork, root, lanes);
26873 +
26874 + {
26875 + markLayoutEffectsStopped();
26876 + }
26877 + // opportunity to paint.
26878 +
26879 +
26880 + requestPaint();
26881 + executionContext = prevExecutionContext; // Reset the priority to the previous non-sync value.
26882 +
26883 + setCurrentUpdatePriority(previousPriority);
26884 + ReactCurrentBatchConfig$3.transition = prevTransition;
26885 + } else {
26886 + // No effects.
26887 + root.current = finishedWork; // Measure these anyway so the flamegraph explicitly shows that there were
26888 + // no effects.
26889 + // TODO: Maybe there's a better way to report this.
26890 +
26891 + {
26892 + recordCommitTime();
26893 + }
26894 + }
26895 +
26896 + var rootDidHavePassiveEffects = rootDoesHavePassiveEffects;
26897 +
26898 + if (rootDoesHavePassiveEffects) {
26899 + // This commit has passive effects. Stash a reference to them. But don't
26900 + // schedule a callback until after flushing layout work.
26901 + rootDoesHavePassiveEffects = false;
26902 + rootWithPendingPassiveEffects = root;
26903 + pendingPassiveEffectsLanes = lanes;
26904 + } else {
26905 +
26906 + {
26907 + nestedPassiveUpdateCount = 0;
26908 + rootWithPassiveNestedUpdates = null;
26909 + }
26910 + } // Read this again, since an effect might have updated it
26911 +
26912 +
26913 + remainingLanes = root.pendingLanes; // Check if there's remaining work on this root
26914 + // TODO: This is part of the `componentDidCatch` implementation. Its purpose
26915 + // is to detect whether something might have called setState inside
26916 + // `componentDidCatch`. The mechanism is known to be flawed because `setState`
26917 + // inside `componentDidCatch` is itself flawed — that's why we recommend
26918 + // `getDerivedStateFromError` instead. However, it could be improved by
26919 + // checking if remainingLanes includes Sync work, instead of whether there's
26920 + // any work remaining at all (which would also include stuff like Suspense
26921 + // retries or transitions). It's been like this for a while, though, so fixing
26922 + // it probably isn't that urgent.
26923 +
26924 + if (remainingLanes === NoLanes) {
26925 + // If there's no remaining work, we can clear the set of already failed
26926 + // error boundaries.
26927 + legacyErrorBoundariesThatAlreadyFailed = null;
26928 + }
26929 +
26930 + {
26931 + if (!rootDidHavePassiveEffects) {
26932 + commitDoubleInvokeEffectsInDEV(root.current, false);
26933 + }
26934 + }
26935 +
26936 + onCommitRoot(finishedWork.stateNode, renderPriorityLevel);
26937 +
26938 + {
26939 + if (isDevToolsPresent) {
26940 + root.memoizedUpdaters.clear();
26941 + }
26942 + }
26943 +
26944 + {
26945 + onCommitRoot$1();
26946 + } // Always call this before exiting `commitRoot`, to ensure that any
26947 + // additional work on this root is scheduled.
26948 +
26949 +
26950 + ensureRootIsScheduled(root, now());
26951 +
26952 + if (recoverableErrors !== null) {
26953 + // There were errors during this render, but recovered from them without
26954 + // needing to surface it to the UI. We log them here.
26955 + var onRecoverableError = root.onRecoverableError;
26956 +
26957 + for (var i = 0; i < recoverableErrors.length; i++) {
26958 + var recoverableError = recoverableErrors[i];
26959 + var componentStack = recoverableError.stack;
26960 + var digest = recoverableError.digest;
26961 + onRecoverableError(recoverableError.value, {
26962 + componentStack: componentStack,
26963 + digest: digest
26964 + });
26965 + }
26966 + }
26967 +
26968 + if (hasUncaughtError) {
26969 + hasUncaughtError = false;
26970 + var error$1 = firstUncaughtError;
26971 + firstUncaughtError = null;
26972 + throw error$1;
26973 + } // If the passive effects are the result of a discrete render, flush them
26974 + // synchronously at the end of the current task so that the result is
26975 + // immediately observable. Otherwise, we assume that they are not
26976 + // order-dependent and do not need to be observed by external systems, so we
26977 + // can wait until after paint.
26978 + // TODO: We can optimize this by not scheduling the callback earlier. Since we
26979 + // currently schedule the callback in multiple places, will wait until those
26980 + // are consolidated.
26981 +
26982 +
26983 + if (includesSomeLane(pendingPassiveEffectsLanes, SyncLane) && root.tag !== LegacyRoot) {
26984 + flushPassiveEffects();
26985 + } // Read this again, since a passive effect might have updated it
26986 +
26987 +
26988 + remainingLanes = root.pendingLanes;
26989 +
26990 + if (includesSomeLane(remainingLanes, SyncLane)) {
26991 + {
26992 + markNestedUpdateScheduled();
26993 + } // Count the number of times the root synchronously re-renders without
26994 + // finishing. If there are too many, it indicates an infinite update loop.
26995 +
26996 +
26997 + if (root === rootWithNestedUpdates) {
26998 + nestedUpdateCount++;
26999 + } else {
27000 + nestedUpdateCount = 0;
27001 + rootWithNestedUpdates = root;
27002 + }
27003 + } else {
27004 + nestedUpdateCount = 0;
27005 + } // If layout work was scheduled, flush it now.
27006 +
27007 +
27008 + flushSyncCallbacks();
27009 +
27010 + {
27011 + markCommitStopped();
27012 + }
27013 +
27014 + return null;
27015 + }
27016 +
27017 + function flushPassiveEffects() {
27018 + // Returns whether passive effects were flushed.
27019 + // TODO: Combine this check with the one in flushPassiveEFfectsImpl. We should
27020 + // probably just combine the two functions. I believe they were only separate
27021 + // in the first place because we used to wrap it with
27022 + // `Scheduler.runWithPriority`, which accepts a function. But now we track the
27023 + // priority within React itself, so we can mutate the variable directly.
27024 + if (rootWithPendingPassiveEffects !== null) {
27025 + var renderPriority = lanesToEventPriority(pendingPassiveEffectsLanes);
27026 + var priority = lowerEventPriority(DefaultEventPriority, renderPriority);
27027 + var prevTransition = ReactCurrentBatchConfig$3.transition;
27028 + var previousPriority = getCurrentUpdatePriority();
27029 +
27030 + try {
27031 + ReactCurrentBatchConfig$3.transition = null;
27032 + setCurrentUpdatePriority(priority);
27033 + return flushPassiveEffectsImpl();
27034 + } finally {
27035 + setCurrentUpdatePriority(previousPriority);
27036 + ReactCurrentBatchConfig$3.transition = prevTransition; // Once passive effects have run for the tree - giving components a
27037 + }
27038 + }
27039 +
27040 + return false;
27041 + }
27042 + function enqueuePendingPassiveProfilerEffect(fiber) {
27043 + {
27044 + pendingPassiveProfilerEffects.push(fiber);
27045 +
27046 + if (!rootDoesHavePassiveEffects) {
27047 + rootDoesHavePassiveEffects = true;
27048 + scheduleCallback$1(NormalPriority, function () {
27049 + flushPassiveEffects();
27050 + return null;
27051 + });
27052 + }
27053 + }
27054 + }
27055 +
27056 + function flushPassiveEffectsImpl() {
27057 + if (rootWithPendingPassiveEffects === null) {
27058 + return false;
27059 + } // Cache and clear the transitions flag
27060 +
27061 +
27062 + var transitions = pendingPassiveTransitions;
27063 + pendingPassiveTransitions = null;
27064 + var root = rootWithPendingPassiveEffects;
27065 + var lanes = pendingPassiveEffectsLanes;
27066 + rootWithPendingPassiveEffects = null; // TODO: This is sometimes out of sync with rootWithPendingPassiveEffects.
27067 + // Figure out why and fix it. It's not causing any known issues (probably
27068 + // because it's only used for profiling), but it's a refactor hazard.
27069 +
27070 + pendingPassiveEffectsLanes = NoLanes;
27071 +
27072 + if ((executionContext & (RenderContext | CommitContext)) !== NoContext) {
27073 + throw new Error('Cannot flush passive effects while already rendering.');
27074 + }
27075 +
27076 + {
27077 + isFlushingPassiveEffects = true;
27078 + didScheduleUpdateDuringPassiveEffects = false;
27079 + }
27080 +
27081 + {
27082 + markPassiveEffectsStarted(lanes);
27083 + }
27084 +
27085 + var prevExecutionContext = executionContext;
27086 + executionContext |= CommitContext;
27087 + commitPassiveUnmountEffects(root.current);
27088 + commitPassiveMountEffects(root, root.current, lanes, transitions); // TODO: Move to commitPassiveMountEffects
27089 +
27090 + {
27091 + var profilerEffects = pendingPassiveProfilerEffects;
27092 + pendingPassiveProfilerEffects = [];
27093 +
27094 + for (var i = 0; i < profilerEffects.length; i++) {
27095 + var _fiber = profilerEffects[i];
27096 + commitPassiveEffectDurations(root, _fiber);
27097 + }
27098 + }
27099 +
27100 + {
27101 + markPassiveEffectsStopped();
27102 + }
27103 +
27104 + {
27105 + commitDoubleInvokeEffectsInDEV(root.current, true);
27106 + }
27107 +
27108 + executionContext = prevExecutionContext;
27109 + flushSyncCallbacks();
27110 +
27111 + {
27112 + // If additional passive effects were scheduled, increment a counter. If this
27113 + // exceeds the limit, we'll fire a warning.
27114 + if (didScheduleUpdateDuringPassiveEffects) {
27115 + if (root === rootWithPassiveNestedUpdates) {
27116 + nestedPassiveUpdateCount++;
27117 + } else {
27118 + nestedPassiveUpdateCount = 0;
27119 + rootWithPassiveNestedUpdates = root;
27120 + }
27121 + } else {
27122 + nestedPassiveUpdateCount = 0;
27123 + }
27124 +
27125 + isFlushingPassiveEffects = false;
27126 + didScheduleUpdateDuringPassiveEffects = false;
27127 + } // TODO: Move to commitPassiveMountEffects
27128 +
27129 +
27130 + onPostCommitRoot(root);
27131 +
27132 + {
27133 + var stateNode = root.current.stateNode;
27134 + stateNode.effectDuration = 0;
27135 + stateNode.passiveEffectDuration = 0;
27136 + }
27137 +
27138 + return true;
27139 + }
27140 +
27141 + function isAlreadyFailedLegacyErrorBoundary(instance) {
27142 + return legacyErrorBoundariesThatAlreadyFailed !== null && legacyErrorBoundariesThatAlreadyFailed.has(instance);
27143 + }
27144 + function markLegacyErrorBoundaryAsFailed(instance) {
27145 + if (legacyErrorBoundariesThatAlreadyFailed === null) {
27146 + legacyErrorBoundariesThatAlreadyFailed = new Set([instance]);
27147 + } else {
27148 + legacyErrorBoundariesThatAlreadyFailed.add(instance);
27149 + }
27150 + }
27151 +
27152 + function prepareToThrowUncaughtError(error) {
27153 + if (!hasUncaughtError) {
27154 + hasUncaughtError = true;
27155 + firstUncaughtError = error;
27156 + }
27157 + }
27158 +
27159 + var onUncaughtError = prepareToThrowUncaughtError;
27160 +
27161 + function captureCommitPhaseErrorOnRoot(rootFiber, sourceFiber, error) {
27162 + var errorInfo = createCapturedValueAtFiber(error, sourceFiber);
27163 + var update = createRootErrorUpdate(rootFiber, errorInfo, SyncLane);
27164 + var root = enqueueUpdate(rootFiber, update, SyncLane);
27165 + var eventTime = requestEventTime();
27166 +
27167 + if (root !== null) {
27168 + markRootUpdated(root, SyncLane, eventTime);
27169 + ensureRootIsScheduled(root, eventTime);
27170 + }
27171 + }
27172 +
27173 + function captureCommitPhaseError(sourceFiber, nearestMountedAncestor, error$1) {
27174 + {
27175 + reportUncaughtErrorInDEV(error$1);
27176 + setIsRunningInsertionEffect(false);
27177 + }
27178 +
27179 + if (sourceFiber.tag === HostRoot) {
27180 + // Error was thrown at the root. There is no parent, so the root
27181 + // itself should capture it.
27182 + captureCommitPhaseErrorOnRoot(sourceFiber, sourceFiber, error$1);
27183 + return;
27184 + }
27185 +
27186 + var fiber = null;
27187 +
27188 + {
27189 + fiber = nearestMountedAncestor;
27190 + }
27191 +
27192 + while (fiber !== null) {
27193 + if (fiber.tag === HostRoot) {
27194 + captureCommitPhaseErrorOnRoot(fiber, sourceFiber, error$1);
27195 + return;
27196 + } else if (fiber.tag === ClassComponent) {
27197 + var ctor = fiber.type;
27198 + var instance = fiber.stateNode;
27199 +
27200 + if (typeof ctor.getDerivedStateFromError === 'function' || typeof instance.componentDidCatch === 'function' && !isAlreadyFailedLegacyErrorBoundary(instance)) {
27201 + var errorInfo = createCapturedValueAtFiber(error$1, sourceFiber);
27202 + var update = createClassErrorUpdate(fiber, errorInfo, SyncLane);
27203 + var root = enqueueUpdate(fiber, update, SyncLane);
27204 + var eventTime = requestEventTime();
27205 +
27206 + if (root !== null) {
27207 + markRootUpdated(root, SyncLane, eventTime);
27208 + ensureRootIsScheduled(root, eventTime);
27209 + }
27210 +
27211 + return;
27212 + }
27213 + }
27214 +
27215 + fiber = fiber.return;
27216 + }
27217 +
27218 + {
27219 + // TODO: Until we re-land skipUnmountedBoundaries (see #20147), this warning
27220 + // will fire for errors that are thrown by destroy functions inside deleted
27221 + // trees. What it should instead do is propagate the error to the parent of
27222 + // the deleted tree. In the meantime, do not add this warning to the
27223 + // allowlist; this is only for our internal use.
27224 + error('Internal React error: Attempted to capture a commit phase error ' + 'inside a detached tree. This indicates a bug in React. Likely ' + 'causes include deleting the same fiber more than once, committing an ' + 'already-finished tree, or an inconsistent return pointer.\n\n' + 'Error message:\n\n%s', error$1);
27225 + }
27226 + }
27227 + function pingSuspendedRoot(root, wakeable, pingedLanes) {
27228 + var pingCache = root.pingCache;
27229 +
27230 + if (pingCache !== null) {
27231 + // The wakeable resolved, so we no longer need to memoize, because it will
27232 + // never be thrown again.
27233 + pingCache.delete(wakeable);
27234 + }
27235 +
27236 + var eventTime = requestEventTime();
27237 + markRootPinged(root, pingedLanes);
27238 + warnIfSuspenseResolutionNotWrappedWithActDEV(root);
27239 +
27240 + if (workInProgressRoot === root && isSubsetOfLanes(workInProgressRootRenderLanes, pingedLanes)) {
27241 + // Received a ping at the same priority level at which we're currently
27242 + // rendering. We might want to restart this render. This should mirror
27243 + // the logic of whether or not a root suspends once it completes.
27244 + // TODO: If we're rendering sync either due to Sync, Batched or expired,
27245 + // we should probably never restart.
27246 + // If we're suspended with delay, or if it's a retry, we'll always suspend
27247 + // so we can always restart.
27248 + if (workInProgressRootExitStatus === RootSuspendedWithDelay || workInProgressRootExitStatus === RootSuspended && includesOnlyRetries(workInProgressRootRenderLanes) && now() - globalMostRecentFallbackTime < FALLBACK_THROTTLE_MS) {
27249 + // Restart from the root.
27250 + prepareFreshStack(root, NoLanes);
27251 + } else {
27252 + // Even though we can't restart right now, we might get an
27253 + // opportunity later. So we mark this render as having a ping.
27254 + workInProgressRootPingedLanes = mergeLanes(workInProgressRootPingedLanes, pingedLanes);
27255 + }
27256 + }
27257 +
27258 + ensureRootIsScheduled(root, eventTime);
27259 + }
27260 +
27261 + function retryTimedOutBoundary(boundaryFiber, retryLane) {
27262 + // The boundary fiber (a Suspense component or SuspenseList component)
27263 + // previously was rendered in its fallback state. One of the promises that
27264 + // suspended it has resolved, which means at least part of the tree was
27265 + // likely unblocked. Try rendering again, at a new lanes.
27266 + if (retryLane === NoLane) {
27267 + // TODO: Assign this to `suspenseState.retryLane`? to avoid
27268 + // unnecessary entanglement?
27269 + retryLane = requestRetryLane(boundaryFiber);
27270 + } // TODO: Special case idle priority?
27271 +
27272 +
27273 + var eventTime = requestEventTime();
27274 + var root = enqueueConcurrentRenderForLane(boundaryFiber, retryLane);
27275 +
27276 + if (root !== null) {
27277 + markRootUpdated(root, retryLane, eventTime);
27278 + ensureRootIsScheduled(root, eventTime);
27279 + }
27280 + }
27281 +
27282 + function retryDehydratedSuspenseBoundary(boundaryFiber) {
27283 + var suspenseState = boundaryFiber.memoizedState;
27284 + var retryLane = NoLane;
27285 +
27286 + if (suspenseState !== null) {
27287 + retryLane = suspenseState.retryLane;
27288 + }
27289 +
27290 + retryTimedOutBoundary(boundaryFiber, retryLane);
27291 + }
27292 + function resolveRetryWakeable(boundaryFiber, wakeable) {
27293 + var retryLane = NoLane; // Default
27294 +
27295 + var retryCache;
27296 +
27297 + switch (boundaryFiber.tag) {
27298 + case SuspenseComponent:
27299 + retryCache = boundaryFiber.stateNode;
27300 + var suspenseState = boundaryFiber.memoizedState;
27301 +
27302 + if (suspenseState !== null) {
27303 + retryLane = suspenseState.retryLane;
27304 + }
27305 +
27306 + break;
27307 +
27308 + case SuspenseListComponent:
27309 + retryCache = boundaryFiber.stateNode;
27310 + break;
27311 +
27312 + default:
27313 + throw new Error('Pinged unknown suspense boundary type. ' + 'This is probably a bug in React.');
27314 + }
27315 +
27316 + if (retryCache !== null) {
27317 + // The wakeable resolved, so we no longer need to memoize, because it will
27318 + // never be thrown again.
27319 + retryCache.delete(wakeable);
27320 + }
27321 +
27322 + retryTimedOutBoundary(boundaryFiber, retryLane);
27323 + } // Computes the next Just Noticeable Difference (JND) boundary.
27324 + // The theory is that a person can't tell the difference between small differences in time.
27325 + // Therefore, if we wait a bit longer than necessary that won't translate to a noticeable
27326 + // difference in the experience. However, waiting for longer might mean that we can avoid
27327 + // showing an intermediate loading state. The longer we have already waited, the harder it
27328 + // is to tell small differences in time. Therefore, the longer we've already waited,
27329 + // the longer we can wait additionally. At some point we have to give up though.
27330 + // We pick a train model where the next boundary commits at a consistent schedule.
27331 + // These particular numbers are vague estimates. We expect to adjust them based on research.
27332 +
27333 + function jnd(timeElapsed) {
27334 + return timeElapsed < 120 ? 120 : timeElapsed < 480 ? 480 : timeElapsed < 1080 ? 1080 : timeElapsed < 1920 ? 1920 : timeElapsed < 3000 ? 3000 : timeElapsed < 4320 ? 4320 : ceil(timeElapsed / 1960) * 1960;
27335 + }
27336 +
27337 + function checkForNestedUpdates() {
27338 + if (nestedUpdateCount > NESTED_UPDATE_LIMIT) {
27339 + nestedUpdateCount = 0;
27340 + rootWithNestedUpdates = null;
27341 + throw new Error('Maximum update depth exceeded. This can happen when a component ' + 'repeatedly calls setState inside componentWillUpdate or ' + 'componentDidUpdate. React limits the number of nested updates to ' + 'prevent infinite loops.');
27342 + }
27343 +
27344 + {
27345 + if (nestedPassiveUpdateCount > NESTED_PASSIVE_UPDATE_LIMIT) {
27346 + nestedPassiveUpdateCount = 0;
27347 + rootWithPassiveNestedUpdates = null;
27348 +
27349 + error('Maximum update depth exceeded. This can happen when a component ' + "calls setState inside useEffect, but useEffect either doesn't " + 'have a dependency array, or one of the dependencies changes on ' + 'every render.');
27350 + }
27351 + }
27352 + }
27353 +
27354 + function flushRenderPhaseStrictModeWarningsInDEV() {
27355 + {
27356 + ReactStrictModeWarnings.flushLegacyContextWarning();
27357 +
27358 + {
27359 + ReactStrictModeWarnings.flushPendingUnsafeLifecycleWarnings();
27360 + }
27361 + }
27362 + }
27363 +
27364 + function commitDoubleInvokeEffectsInDEV(fiber, hasPassiveEffects) {
27365 + {
27366 + // TODO (StrictEffects) Should we set a marker on the root if it contains strict effects
27367 + // so we don't traverse unnecessarily? similar to subtreeFlags but just at the root level.
27368 + // Maybe not a big deal since this is DEV only behavior.
27369 + setCurrentFiber(fiber);
27370 + invokeEffectsInDev(fiber, MountLayoutDev, invokeLayoutEffectUnmountInDEV);
27371 +
27372 + if (hasPassiveEffects) {
27373 + invokeEffectsInDev(fiber, MountPassiveDev, invokePassiveEffectUnmountInDEV);
27374 + }
27375 +
27376 + invokeEffectsInDev(fiber, MountLayoutDev, invokeLayoutEffectMountInDEV);
27377 +
27378 + if (hasPassiveEffects) {
27379 + invokeEffectsInDev(fiber, MountPassiveDev, invokePassiveEffectMountInDEV);
27380 + }
27381 +
27382 + resetCurrentFiber();
27383 + }
27384 + }
27385 +
27386 + function invokeEffectsInDev(firstChild, fiberFlags, invokeEffectFn) {
27387 + {
27388 + // We don't need to re-check StrictEffectsMode here.
27389 + // This function is only called if that check has already passed.
27390 + var current = firstChild;
27391 + var subtreeRoot = null;
27392 +
27393 + while (current !== null) {
27394 + var primarySubtreeFlag = current.subtreeFlags & fiberFlags;
27395 +
27396 + if (current !== subtreeRoot && current.child !== null && primarySubtreeFlag !== NoFlags) {
27397 + current = current.child;
27398 + } else {
27399 + if ((current.flags & fiberFlags) !== NoFlags) {
27400 + invokeEffectFn(current);
27401 + }
27402 +
27403 + if (current.sibling !== null) {
27404 + current = current.sibling;
27405 + } else {
27406 + current = subtreeRoot = current.return;
27407 + }
27408 + }
27409 + }
27410 + }
27411 + }
27412 +
27413 + var didWarnStateUpdateForNotYetMountedComponent = null;
27414 + function warnAboutUpdateOnNotYetMountedFiberInDEV(fiber) {
27415 + {
27416 + if ((executionContext & RenderContext) !== NoContext) {
27417 + // We let the other warning about render phase updates deal with this one.
27418 + return;
27419 + }
27420 +
27421 + if (!(fiber.mode & ConcurrentMode)) {
27422 + return;
27423 + }
27424 +
27425 + var tag = fiber.tag;
27426 +
27427 + if (tag !== IndeterminateComponent && tag !== HostRoot && tag !== ClassComponent && tag !== FunctionComponent && tag !== ForwardRef && tag !== MemoComponent && tag !== SimpleMemoComponent) {
27428 + // Only warn for user-defined components, not internal ones like Suspense.
27429 + return;
27430 + } // We show the whole stack but dedupe on the top component's name because
27431 + // the problematic code almost always lies inside that component.
27432 +
27433 +
27434 + var componentName = getComponentNameFromFiber(fiber) || 'ReactComponent';
27435 +
27436 + if (didWarnStateUpdateForNotYetMountedComponent !== null) {
27437 + if (didWarnStateUpdateForNotYetMountedComponent.has(componentName)) {
27438 + return;
27439 + }
27440 +
27441 + didWarnStateUpdateForNotYetMountedComponent.add(componentName);
27442 + } else {
27443 + didWarnStateUpdateForNotYetMountedComponent = new Set([componentName]);
27444 + }
27445 +
27446 + var previousFiber = current;
27447 +
27448 + try {
27449 + setCurrentFiber(fiber);
27450 +
27451 + error("Can't perform a React state update on a component that hasn't mounted yet. " + 'This indicates that you have a side-effect in your render function that ' + 'asynchronously later calls tries to update the component. Move this work to ' + 'useEffect instead.');
27452 + } finally {
27453 + if (previousFiber) {
27454 + setCurrentFiber(fiber);
27455 + } else {
27456 + resetCurrentFiber();
27457 + }
27458 + }
27459 + }
27460 + }
27461 + var beginWork$1;
27462 +
27463 + {
27464 + var dummyFiber = null;
27465 +
27466 + beginWork$1 = function (current, unitOfWork, lanes) {
27467 + // If a component throws an error, we replay it again in a synchronously
27468 + // dispatched event, so that the debugger will treat it as an uncaught
27469 + // error See ReactErrorUtils for more information.
27470 + // Before entering the begin phase, copy the work-in-progress onto a dummy
27471 + // fiber. If beginWork throws, we'll use this to reset the state.
27472 + var originalWorkInProgressCopy = assignFiberPropertiesInDEV(dummyFiber, unitOfWork);
27473 +
27474 + try {
27475 + return beginWork(current, unitOfWork, lanes);
27476 + } catch (originalError) {
27477 + if (didSuspendOrErrorWhileHydratingDEV() || originalError !== null && typeof originalError === 'object' && typeof originalError.then === 'function') {
27478 + // Don't replay promises.
27479 + // Don't replay errors if we are hydrating and have already suspended or handled an error
27480 + throw originalError;
27481 + } // Keep this code in sync with handleError; any changes here must have
27482 + // corresponding changes there.
27483 +
27484 +
27485 + resetContextDependencies();
27486 + resetHooksAfterThrow(); // Don't reset current debug fiber, since we're about to work on the
27487 + // same fiber again.
27488 + // Unwind the failed stack frame
27489 +
27490 + unwindInterruptedWork(current, unitOfWork); // Restore the original properties of the fiber.
27491 +
27492 + assignFiberPropertiesInDEV(unitOfWork, originalWorkInProgressCopy);
27493 +
27494 + if ( unitOfWork.mode & ProfileMode) {
27495 + // Reset the profiler timer.
27496 + startProfilerTimer(unitOfWork);
27497 + } // Run beginWork again.
27498 +
27499 +
27500 + invokeGuardedCallback(null, beginWork, null, current, unitOfWork, lanes);
27501 +
27502 + if (hasCaughtError()) {
27503 + var replayError = clearCaughtError();
27504 +
27505 + if (typeof replayError === 'object' && replayError !== null && replayError._suppressLogging && typeof originalError === 'object' && originalError !== null && !originalError._suppressLogging) {
27506 + // If suppressed, let the flag carry over to the original error which is the one we'll rethrow.
27507 + originalError._suppressLogging = true;
27508 + }
27509 + } // We always throw the original error in case the second render pass is not idempotent.
27510 + // This can happen if a memoized function or CommonJS module doesn't throw after first invocation.
27511 +
27512 +
27513 + throw originalError;
27514 + }
27515 + };
27516 + }
27517 +
27518 + var didWarnAboutUpdateInRender = false;
27519 + var didWarnAboutUpdateInRenderForAnotherComponent;
27520 +
27521 + {
27522 + didWarnAboutUpdateInRenderForAnotherComponent = new Set();
27523 + }
27524 +
27525 + function warnAboutRenderPhaseUpdatesInDEV(fiber) {
27526 + {
27527 + if (isRendering && !getIsUpdatingOpaqueValueInRenderPhaseInDEV()) {
27528 + switch (fiber.tag) {
27529 + case FunctionComponent:
27530 + case ForwardRef:
27531 + case SimpleMemoComponent:
27532 + {
27533 + var renderingComponentName = workInProgress && getComponentNameFromFiber(workInProgress) || 'Unknown'; // Dedupe by the rendering component because it's the one that needs to be fixed.
27534 +
27535 + var dedupeKey = renderingComponentName;
27536 +
27537 + if (!didWarnAboutUpdateInRenderForAnotherComponent.has(dedupeKey)) {
27538 + didWarnAboutUpdateInRenderForAnotherComponent.add(dedupeKey);
27539 + var setStateComponentName = getComponentNameFromFiber(fiber) || 'Unknown';
27540 +
27541 + error('Cannot update a component (`%s`) while rendering a ' + 'different component (`%s`). To locate the bad setState() call inside `%s`, ' + 'follow the stack trace as described in https://reactjs.org/link/setstate-in-render', setStateComponentName, renderingComponentName, renderingComponentName);
27542 + }
27543 +
27544 + break;
27545 + }
27546 +
27547 + case ClassComponent:
27548 + {
27549 + if (!didWarnAboutUpdateInRender) {
27550 + error('Cannot update during an existing state transition (such as ' + 'within `render`). Render methods should be a pure ' + 'function of props and state.');
27551 +
27552 + didWarnAboutUpdateInRender = true;
27553 + }
27554 +
27555 + break;
27556 + }
27557 + }
27558 + }
27559 + }
27560 + }
27561 +
27562 + function restorePendingUpdaters(root, lanes) {
27563 + {
27564 + if (isDevToolsPresent) {
27565 + var memoizedUpdaters = root.memoizedUpdaters;
27566 + memoizedUpdaters.forEach(function (schedulingFiber) {
27567 + addFiberToLanesMap(root, schedulingFiber, lanes);
27568 + }); // This function intentionally does not clear memoized updaters.
27569 + // Those may still be relevant to the current commit
27570 + // and a future one (e.g. Suspense).
27571 + }
27572 + }
27573 + }
27574 + var fakeActCallbackNode = {};
27575 +
27576 + function scheduleCallback$1(priorityLevel, callback) {
27577 + {
27578 + // If we're currently inside an `act` scope, bypass Scheduler and push to
27579 + // the `act` queue instead.
27580 + var actQueue = ReactCurrentActQueue$1.current;
27581 +
27582 + if (actQueue !== null) {
27583 + actQueue.push(callback);
27584 + return fakeActCallbackNode;
27585 + } else {
27586 + return scheduleCallback(priorityLevel, callback);
27587 + }
27588 + }
27589 + }
27590 +
27591 + function cancelCallback$1(callbackNode) {
27592 + if ( callbackNode === fakeActCallbackNode) {
27593 + return;
27594 + } // In production, always call Scheduler. This function will be stripped out.
27595 +
27596 +
27597 + return cancelCallback(callbackNode);
27598 + }
27599 +
27600 + function shouldForceFlushFallbacksInDEV() {
27601 + // Never force flush in production. This function should get stripped out.
27602 + return ReactCurrentActQueue$1.current !== null;
27603 + }
27604 +
27605 + function warnIfUpdatesNotWrappedWithActDEV(fiber) {
27606 + {
27607 + if (fiber.mode & ConcurrentMode) {
27608 + if (!isConcurrentActEnvironment()) {
27609 + // Not in an act environment. No need to warn.
27610 + return;
27611 + }
27612 + } else {
27613 + // Legacy mode has additional cases where we suppress a warning.
27614 + if (!isLegacyActEnvironment()) {
27615 + // Not in an act environment. No need to warn.
27616 + return;
27617 + }
27618 +
27619 + if (executionContext !== NoContext) {
27620 + // Legacy mode doesn't warn if the update is batched, i.e.
27621 + // batchedUpdates or flushSync.
27622 + return;
27623 + }
27624 +
27625 + if (fiber.tag !== FunctionComponent && fiber.tag !== ForwardRef && fiber.tag !== SimpleMemoComponent) {
27626 + // For backwards compatibility with pre-hooks code, legacy mode only
27627 + // warns for updates that originate from a hook.
27628 + return;
27629 + }
27630 + }
27631 +
27632 + if (ReactCurrentActQueue$1.current === null) {
27633 + var previousFiber = current;
27634 +
27635 + try {
27636 + setCurrentFiber(fiber);
27637 +
27638 + error('An update to %s inside a test was not wrapped in act(...).\n\n' + 'When testing, code that causes React state updates should be ' + 'wrapped into act(...):\n\n' + 'act(() => {\n' + ' /* fire events that update state */\n' + '});\n' + '/* assert on the output */\n\n' + "This ensures that you're testing the behavior the user would see " + 'in the browser.' + ' Learn more at https://reactjs.org/link/wrap-tests-with-act', getComponentNameFromFiber(fiber));
27639 + } finally {
27640 + if (previousFiber) {
27641 + setCurrentFiber(fiber);
27642 + } else {
27643 + resetCurrentFiber();
27644 + }
27645 + }
27646 + }
27647 + }
27648 + }
27649 +
27650 + function warnIfSuspenseResolutionNotWrappedWithActDEV(root) {
27651 + {
27652 + if (root.tag !== LegacyRoot && isConcurrentActEnvironment() && ReactCurrentActQueue$1.current === null) {
27653 + error('A suspended resource finished loading inside a test, but the event ' + 'was not wrapped in act(...).\n\n' + 'When testing, code that resolves suspended data should be wrapped ' + 'into act(...):\n\n' + 'act(() => {\n' + ' /* finish loading suspended data */\n' + '});\n' + '/* assert on the output */\n\n' + "This ensures that you're testing the behavior the user would see " + 'in the browser.' + ' Learn more at https://reactjs.org/link/wrap-tests-with-act');
27654 + }
27655 + }
27656 + }
27657 +
27658 + function setIsRunningInsertionEffect(isRunning) {
27659 + {
27660 + isRunningInsertionEffect = isRunning;
27661 + }
27662 + }
27663 +
27664 + /* eslint-disable react-internal/prod-error-codes */
27665 + var resolveFamily = null; // $FlowFixMe Flow gets confused by a WeakSet feature check below.
27666 +
27667 + var failedBoundaries = null;
27668 + var setRefreshHandler = function (handler) {
27669 + {
27670 + resolveFamily = handler;
27671 + }
27672 + };
27673 + function resolveFunctionForHotReloading(type) {
27674 + {
27675 + if (resolveFamily === null) {
27676 + // Hot reloading is disabled.
27677 + return type;
27678 + }
27679 +
27680 + var family = resolveFamily(type);
27681 +
27682 + if (family === undefined) {
27683 + return type;
27684 + } // Use the latest known implementation.
27685 +
27686 +
27687 + return family.current;
27688 + }
27689 + }
27690 + function resolveClassForHotReloading(type) {
27691 + // No implementation differences.
27692 + return resolveFunctionForHotReloading(type);
27693 + }
27694 + function resolveForwardRefForHotReloading(type) {
27695 + {
27696 + if (resolveFamily === null) {
27697 + // Hot reloading is disabled.
27698 + return type;
27699 + }
27700 +
27701 + var family = resolveFamily(type);
27702 +
27703 + if (family === undefined) {
27704 + // Check if we're dealing with a real forwardRef. Don't want to crash early.
27705 + if (type !== null && type !== undefined && typeof type.render === 'function') {
27706 + // ForwardRef is special because its resolved .type is an object,
27707 + // but it's possible that we only have its inner render function in the map.
27708 + // If that inner render function is different, we'll build a new forwardRef type.
27709 + var currentRender = resolveFunctionForHotReloading(type.render);
27710 +
27711 + if (type.render !== currentRender) {
27712 + var syntheticType = {
27713 + $$typeof: REACT_FORWARD_REF_TYPE,
27714 + render: currentRender
27715 + };
27716 +
27717 + if (type.displayName !== undefined) {
27718 + syntheticType.displayName = type.displayName;
27719 + }
27720 +
27721 + return syntheticType;
27722 + }
27723 + }
27724 +
27725 + return type;
27726 + } // Use the latest known implementation.
27727 +
27728 +
27729 + return family.current;
27730 + }
27731 + }
27732 + function isCompatibleFamilyForHotReloading(fiber, element) {
27733 + {
27734 + if (resolveFamily === null) {
27735 + // Hot reloading is disabled.
27736 + return false;
27737 + }
27738 +
27739 + var prevType = fiber.elementType;
27740 + var nextType = element.type; // If we got here, we know types aren't === equal.
27741 +
27742 + var needsCompareFamilies = false;
27743 + var $$typeofNextType = typeof nextType === 'object' && nextType !== null ? nextType.$$typeof : null;
27744 +
27745 + switch (fiber.tag) {
27746 + case ClassComponent:
27747 + {
27748 + if (typeof nextType === 'function') {
27749 + needsCompareFamilies = true;
27750 + }
27751 +
27752 + break;
27753 + }
27754 +
27755 + case FunctionComponent:
27756 + {
27757 + if (typeof nextType === 'function') {
27758 + needsCompareFamilies = true;
27759 + } else if ($$typeofNextType === REACT_LAZY_TYPE) {
27760 + // We don't know the inner type yet.
27761 + // We're going to assume that the lazy inner type is stable,
27762 + // and so it is sufficient to avoid reconciling it away.
27763 + // We're not going to unwrap or actually use the new lazy type.
27764 + needsCompareFamilies = true;
27765 + }
27766 +
27767 + break;
27768 + }
27769 +
27770 + case ForwardRef:
27771 + {
27772 + if ($$typeofNextType === REACT_FORWARD_REF_TYPE) {
27773 + needsCompareFamilies = true;
27774 + } else if ($$typeofNextType === REACT_LAZY_TYPE) {
27775 + needsCompareFamilies = true;
27776 + }
27777 +
27778 + break;
27779 + }
27780 +
27781 + case MemoComponent:
27782 + case SimpleMemoComponent:
27783 + {
27784 + if ($$typeofNextType === REACT_MEMO_TYPE) {
27785 + // TODO: if it was but can no longer be simple,
27786 + // we shouldn't set this.
27787 + needsCompareFamilies = true;
27788 + } else if ($$typeofNextType === REACT_LAZY_TYPE) {
27789 + needsCompareFamilies = true;
27790 + }
27791 +
27792 + break;
27793 + }
27794 +
27795 + default:
27796 + return false;
27797 + } // Check if both types have a family and it's the same one.
27798 +
27799 +
27800 + if (needsCompareFamilies) {
27801 + // Note: memo() and forwardRef() we'll compare outer rather than inner type.
27802 + // This means both of them need to be registered to preserve state.
27803 + // If we unwrapped and compared the inner types for wrappers instead,
27804 + // then we would risk falsely saying two separate memo(Foo)
27805 + // calls are equivalent because they wrap the same Foo function.
27806 + var prevFamily = resolveFamily(prevType);
27807 +
27808 + if (prevFamily !== undefined && prevFamily === resolveFamily(nextType)) {
27809 + return true;
27810 + }
27811 + }
27812 +
27813 + return false;
27814 + }
27815 + }
27816 + function markFailedErrorBoundaryForHotReloading(fiber) {
27817 + {
27818 + if (resolveFamily === null) {
27819 + // Hot reloading is disabled.
27820 + return;
27821 + }
27822 +
27823 + if (typeof WeakSet !== 'function') {
27824 + return;
27825 + }
27826 +
27827 + if (failedBoundaries === null) {
27828 + failedBoundaries = new WeakSet();
27829 + }
27830 +
27831 + failedBoundaries.add(fiber);
27832 + }
27833 + }
27834 + var scheduleRefresh = function (root, update) {
27835 + {
27836 + if (resolveFamily === null) {
27837 + // Hot reloading is disabled.
27838 + return;
27839 + }
27840 +
27841 + var staleFamilies = update.staleFamilies,
27842 + updatedFamilies = update.updatedFamilies;
27843 + flushPassiveEffects();
27844 + flushSync(function () {
27845 + scheduleFibersWithFamiliesRecursively(root.current, updatedFamilies, staleFamilies);
27846 + });
27847 + }
27848 + };
27849 + var scheduleRoot = function (root, element) {
27850 + {
27851 + if (root.context !== emptyContextObject) {
27852 + // Super edge case: root has a legacy _renderSubtree context
27853 + // but we don't know the parentComponent so we can't pass it.
27854 + // Just ignore. We'll delete this with _renderSubtree code path later.
27855 + return;
27856 + }
27857 +
27858 + flushPassiveEffects();
27859 + flushSync(function () {
27860 + updateContainer(element, root, null, null);
27861 + });
27862 + }
27863 + };
27864 +
27865 + function scheduleFibersWithFamiliesRecursively(fiber, updatedFamilies, staleFamilies) {
27866 + {
27867 + var alternate = fiber.alternate,
27868 + child = fiber.child,
27869 + sibling = fiber.sibling,
27870 + tag = fiber.tag,
27871 + type = fiber.type;
27872 + var candidateType = null;
27873 +
27874 + switch (tag) {
27875 + case FunctionComponent:
27876 + case SimpleMemoComponent:
27877 + case ClassComponent:
27878 + candidateType = type;
27879 + break;
27880 +
27881 + case ForwardRef:
27882 + candidateType = type.render;
27883 + break;
27884 + }
27885 +
27886 + if (resolveFamily === null) {
27887 + throw new Error('Expected resolveFamily to be set during hot reload.');
27888 + }
27889 +
27890 + var needsRender = false;
27891 + var needsRemount = false;
27892 +
27893 + if (candidateType !== null) {
27894 + var family = resolveFamily(candidateType);
27895 +
27896 + if (family !== undefined) {
27897 + if (staleFamilies.has(family)) {
27898 + needsRemount = true;
27899 + } else if (updatedFamilies.has(family)) {
27900 + if (tag === ClassComponent) {
27901 + needsRemount = true;
27902 + } else {
27903 + needsRender = true;
27904 + }
27905 + }
27906 + }
27907 + }
27908 +
27909 + if (failedBoundaries !== null) {
27910 + if (failedBoundaries.has(fiber) || alternate !== null && failedBoundaries.has(alternate)) {
27911 + needsRemount = true;
27912 + }
27913 + }
27914 +
27915 + if (needsRemount) {
27916 + fiber._debugNeedsRemount = true;
27917 + }
27918 +
27919 + if (needsRemount || needsRender) {
27920 + var _root = enqueueConcurrentRenderForLane(fiber, SyncLane);
27921 +
27922 + if (_root !== null) {
27923 + scheduleUpdateOnFiber(_root, fiber, SyncLane, NoTimestamp);
27924 + }
27925 + }
27926 +
27927 + if (child !== null && !needsRemount) {
27928 + scheduleFibersWithFamiliesRecursively(child, updatedFamilies, staleFamilies);
27929 + }
27930 +
27931 + if (sibling !== null) {
27932 + scheduleFibersWithFamiliesRecursively(sibling, updatedFamilies, staleFamilies);
27933 + }
27934 + }
27935 + }
27936 +
27937 + var findHostInstancesForRefresh = function (root, families) {
27938 + {
27939 + var hostInstances = new Set();
27940 + var types = new Set(families.map(function (family) {
27941 + return family.current;
27942 + }));
27943 + findHostInstancesForMatchingFibersRecursively(root.current, types, hostInstances);
27944 + return hostInstances;
27945 + }
27946 + };
27947 +
27948 + function findHostInstancesForMatchingFibersRecursively(fiber, types, hostInstances) {
27949 + {
27950 + var child = fiber.child,
27951 + sibling = fiber.sibling,
27952 + tag = fiber.tag,
27953 + type = fiber.type;
27954 + var candidateType = null;
27955 +
27956 + switch (tag) {
27957 + case FunctionComponent:
27958 + case SimpleMemoComponent:
27959 + case ClassComponent:
27960 + candidateType = type;
27961 + break;
27962 +
27963 + case ForwardRef:
27964 + candidateType = type.render;
27965 + break;
27966 + }
27967 +
27968 + var didMatch = false;
27969 +
27970 + if (candidateType !== null) {
27971 + if (types.has(candidateType)) {
27972 + didMatch = true;
27973 + }
27974 + }
27975 +
27976 + if (didMatch) {
27977 + // We have a match. This only drills down to the closest host components.
27978 + // There's no need to search deeper because for the purpose of giving
27979 + // visual feedback, "flashing" outermost parent rectangles is sufficient.
27980 + findHostInstancesForFiberShallowly(fiber, hostInstances);
27981 + } else {
27982 + // If there's no match, maybe there will be one further down in the child tree.
27983 + if (child !== null) {
27984 + findHostInstancesForMatchingFibersRecursively(child, types, hostInstances);
27985 + }
27986 + }
27987 +
27988 + if (sibling !== null) {
27989 + findHostInstancesForMatchingFibersRecursively(sibling, types, hostInstances);
27990 + }
27991 + }
27992 + }
27993 +
27994 + function findHostInstancesForFiberShallowly(fiber, hostInstances) {
27995 + {
27996 + var foundHostInstances = findChildHostInstancesForFiberShallowly(fiber, hostInstances);
27997 +
27998 + if (foundHostInstances) {
27999 + return;
28000 + } // If we didn't find any host children, fallback to closest host parent.
28001 +
28002 +
28003 + var node = fiber;
28004 +
28005 + while (true) {
28006 + switch (node.tag) {
28007 + case HostComponent:
28008 + hostInstances.add(node.stateNode);
28009 + return;
28010 +
28011 + case HostPortal:
28012 + hostInstances.add(node.stateNode.containerInfo);
28013 + return;
28014 +
28015 + case HostRoot:
28016 + hostInstances.add(node.stateNode.containerInfo);
28017 + return;
28018 + }
28019 +
28020 + if (node.return === null) {
28021 + throw new Error('Expected to reach root first.');
28022 + }
28023 +
28024 + node = node.return;
28025 + }
28026 + }
28027 + }
28028 +
28029 + function findChildHostInstancesForFiberShallowly(fiber, hostInstances) {
28030 + {
28031 + var node = fiber;
28032 + var foundHostInstances = false;
28033 +
28034 + while (true) {
28035 + if (node.tag === HostComponent) {
28036 + // We got a match.
28037 + foundHostInstances = true;
28038 + hostInstances.add(node.stateNode); // There may still be more, so keep searching.
28039 + } else if (node.child !== null) {
28040 + node.child.return = node;
28041 + node = node.child;
28042 + continue;
28043 + }
28044 +
28045 + if (node === fiber) {
28046 + return foundHostInstances;
28047 + }
28048 +
28049 + while (node.sibling === null) {
28050 + if (node.return === null || node.return === fiber) {
28051 + return foundHostInstances;
28052 + }
28053 +
28054 + node = node.return;
28055 + }
28056 +
28057 + node.sibling.return = node.return;
28058 + node = node.sibling;
28059 + }
28060 + }
28061 +
28062 + return false;
28063 + }
28064 +
28065 + var hasBadMapPolyfill;
28066 +
28067 + {
28068 + hasBadMapPolyfill = false;
28069 +
28070 + try {
28071 + var nonExtensibleObject = Object.preventExtensions({});
28072 + /* eslint-disable no-new */
28073 +
28074 + new Map([[nonExtensibleObject, null]]);
28075 + new Set([nonExtensibleObject]);
28076 + /* eslint-enable no-new */
28077 + } catch (e) {
28078 + // TODO: Consider warning about bad polyfills
28079 + hasBadMapPolyfill = true;
28080 + }
28081 + }
28082 +
28083 + function FiberNode(tag, pendingProps, key, mode) {
28084 + // Instance
28085 + this.tag = tag;
28086 + this.key = key;
28087 + this.elementType = null;
28088 + this.type = null;
28089 + this.stateNode = null; // Fiber
28090 +
28091 + this.return = null;
28092 + this.child = null;
28093 + this.sibling = null;
28094 + this.index = 0;
28095 + this.ref = null;
28096 + this.pendingProps = pendingProps;
28097 + this.memoizedProps = null;
28098 + this.updateQueue = null;
28099 + this.memoizedState = null;
28100 + this.dependencies = null;
28101 + this.mode = mode; // Effects
28102 +
28103 + this.flags = NoFlags;
28104 + this.subtreeFlags = NoFlags;
28105 + this.deletions = null;
28106 + this.lanes = NoLanes;
28107 + this.childLanes = NoLanes;
28108 + this.alternate = null;
28109 +
28110 + {
28111 + // Note: The following is done to avoid a v8 performance cliff.
28112 + //
28113 + // Initializing the fields below to smis and later updating them with
28114 + // double values will cause Fibers to end up having separate shapes.
28115 + // This behavior/bug has something to do with Object.preventExtension().
28116 + // Fortunately this only impacts DEV builds.
28117 + // Unfortunately it makes React unusably slow for some applications.
28118 + // To work around this, initialize the fields below with doubles.
28119 + //
28120 + // Learn more about this here:
28121 + // https://github.com/facebook/react/issues/14365
28122 + // https://bugs.chromium.org/p/v8/issues/detail?id=8538
28123 + this.actualDuration = Number.NaN;
28124 + this.actualStartTime = Number.NaN;
28125 + this.selfBaseDuration = Number.NaN;
28126 + this.treeBaseDuration = Number.NaN; // It's okay to replace the initial doubles with smis after initialization.
28127 + // This won't trigger the performance cliff mentioned above,
28128 + // and it simplifies other profiler code (including DevTools).
28129 +
28130 + this.actualDuration = 0;
28131 + this.actualStartTime = -1;
28132 + this.selfBaseDuration = 0;
28133 + this.treeBaseDuration = 0;
28134 + }
28135 +
28136 + {
28137 + // This isn't directly used but is handy for debugging internals:
28138 + this._debugSource = null;
28139 + this._debugOwner = null;
28140 + this._debugNeedsRemount = false;
28141 + this._debugHookTypes = null;
28142 +
28143 + if (!hasBadMapPolyfill && typeof Object.preventExtensions === 'function') {
28144 + Object.preventExtensions(this);
28145 + }
28146 + }
28147 + } // This is a constructor function, rather than a POJO constructor, still
28148 + // please ensure we do the following:
28149 + // 1) Nobody should add any instance methods on this. Instance methods can be
28150 + // more difficult to predict when they get optimized and they are almost
28151 + // never inlined properly in static compilers.
28152 + // 2) Nobody should rely on `instanceof Fiber` for type testing. We should
28153 + // always know when it is a fiber.
28154 + // 3) We might want to experiment with using numeric keys since they are easier
28155 + // to optimize in a non-JIT environment.
28156 + // 4) We can easily go from a constructor to a createFiber object literal if that
28157 + // is faster.
28158 + // 5) It should be easy to port this to a C struct and keep a C implementation
28159 + // compatible.
28160 +
28161 +
28162 + var createFiber = function (tag, pendingProps, key, mode) {
28163 + // $FlowFixMe: the shapes are exact here but Flow doesn't like constructors
28164 + return new FiberNode(tag, pendingProps, key, mode);
28165 + };
28166 +
28167 + function shouldConstruct$1(Component) {
28168 + var prototype = Component.prototype;
28169 + return !!(prototype && prototype.isReactComponent);
28170 + }
28171 +
28172 + function isSimpleFunctionComponent(type) {
28173 + return typeof type === 'function' && !shouldConstruct$1(type) && type.defaultProps === undefined;
28174 + }
28175 + function resolveLazyComponentTag(Component) {
28176 + if (typeof Component === 'function') {
28177 + return shouldConstruct$1(Component) ? ClassComponent : FunctionComponent;
28178 + } else if (Component !== undefined && Component !== null) {
28179 + var $$typeof = Component.$$typeof;
28180 +
28181 + if ($$typeof === REACT_FORWARD_REF_TYPE) {
28182 + return ForwardRef;
28183 + }
28184 +
28185 + if ($$typeof === REACT_MEMO_TYPE) {
28186 + return MemoComponent;
28187 + }
28188 + }
28189 +
28190 + return IndeterminateComponent;
28191 + } // This is used to create an alternate fiber to do work on.
28192 +
28193 + function createWorkInProgress(current, pendingProps) {
28194 + var workInProgress = current.alternate;
28195 +
28196 + if (workInProgress === null) {
28197 + // We use a double buffering pooling technique because we know that we'll
28198 + // only ever need at most two versions of a tree. We pool the "other" unused
28199 + // node that we're free to reuse. This is lazily created to avoid allocating
28200 + // extra objects for things that are never updated. It also allow us to
28201 + // reclaim the extra memory if needed.
28202 + workInProgress = createFiber(current.tag, pendingProps, current.key, current.mode);
28203 + workInProgress.elementType = current.elementType;
28204 + workInProgress.type = current.type;
28205 + workInProgress.stateNode = current.stateNode;
28206 +
28207 + {
28208 + // DEV-only fields
28209 + workInProgress._debugSource = current._debugSource;
28210 + workInProgress._debugOwner = current._debugOwner;
28211 + workInProgress._debugHookTypes = current._debugHookTypes;
28212 + }
28213 +
28214 + workInProgress.alternate = current;
28215 + current.alternate = workInProgress;
28216 + } else {
28217 + workInProgress.pendingProps = pendingProps; // Needed because Blocks store data on type.
28218 +
28219 + workInProgress.type = current.type; // We already have an alternate.
28220 + // Reset the effect tag.
28221 +
28222 + workInProgress.flags = NoFlags; // The effects are no longer valid.
28223 +
28224 + workInProgress.subtreeFlags = NoFlags;
28225 + workInProgress.deletions = null;
28226 +
28227 + {
28228 + // We intentionally reset, rather than copy, actualDuration & actualStartTime.
28229 + // This prevents time from endlessly accumulating in new commits.
28230 + // This has the downside of resetting values for different priority renders,
28231 + // But works for yielding (the common case) and should support resuming.
28232 + workInProgress.actualDuration = 0;
28233 + workInProgress.actualStartTime = -1;
28234 + }
28235 + } // Reset all effects except static ones.
28236 + // Static effects are not specific to a render.
28237 +
28238 +
28239 + workInProgress.flags = current.flags & StaticMask;
28240 + workInProgress.childLanes = current.childLanes;
28241 + workInProgress.lanes = current.lanes;
28242 + workInProgress.child = current.child;
28243 + workInProgress.memoizedProps = current.memoizedProps;
28244 + workInProgress.memoizedState = current.memoizedState;
28245 + workInProgress.updateQueue = current.updateQueue; // Clone the dependencies object. This is mutated during the render phase, so
28246 + // it cannot be shared with the current fiber.
28247 +
28248 + var currentDependencies = current.dependencies;
28249 + workInProgress.dependencies = currentDependencies === null ? null : {
28250 + lanes: currentDependencies.lanes,
28251 + firstContext: currentDependencies.firstContext
28252 + }; // These will be overridden during the parent's reconciliation
28253 +
28254 + workInProgress.sibling = current.sibling;
28255 + workInProgress.index = current.index;
28256 + workInProgress.ref = current.ref;
28257 +
28258 + {
28259 + workInProgress.selfBaseDuration = current.selfBaseDuration;
28260 + workInProgress.treeBaseDuration = current.treeBaseDuration;
28261 + }
28262 +
28263 + {
28264 + workInProgress._debugNeedsRemount = current._debugNeedsRemount;
28265 +
28266 + switch (workInProgress.tag) {
28267 + case IndeterminateComponent:
28268 + case FunctionComponent:
28269 + case SimpleMemoComponent:
28270 + workInProgress.type = resolveFunctionForHotReloading(current.type);
28271 + break;
28272 +
28273 + case ClassComponent:
28274 + workInProgress.type = resolveClassForHotReloading(current.type);
28275 + break;
28276 +
28277 + case ForwardRef:
28278 + workInProgress.type = resolveForwardRefForHotReloading(current.type);
28279 + break;
28280 + }
28281 + }
28282 +
28283 + return workInProgress;
28284 + } // Used to reuse a Fiber for a second pass.
28285 +
28286 + function resetWorkInProgress(workInProgress, renderLanes) {
28287 + // This resets the Fiber to what createFiber or createWorkInProgress would
28288 + // have set the values to before during the first pass. Ideally this wouldn't
28289 + // be necessary but unfortunately many code paths reads from the workInProgress
28290 + // when they should be reading from current and writing to workInProgress.
28291 + // We assume pendingProps, index, key, ref, return are still untouched to
28292 + // avoid doing another reconciliation.
28293 + // Reset the effect flags but keep any Placement tags, since that's something
28294 + // that child fiber is setting, not the reconciliation.
28295 + workInProgress.flags &= StaticMask | Placement; // The effects are no longer valid.
28296 +
28297 + var current = workInProgress.alternate;
28298 +
28299 + if (current === null) {
28300 + // Reset to createFiber's initial values.
28301 + workInProgress.childLanes = NoLanes;
28302 + workInProgress.lanes = renderLanes;
28303 + workInProgress.child = null;
28304 + workInProgress.subtreeFlags = NoFlags;
28305 + workInProgress.memoizedProps = null;
28306 + workInProgress.memoizedState = null;
28307 + workInProgress.updateQueue = null;
28308 + workInProgress.dependencies = null;
28309 + workInProgress.stateNode = null;
28310 +
28311 + {
28312 + // Note: We don't reset the actualTime counts. It's useful to accumulate
28313 + // actual time across multiple render passes.
28314 + workInProgress.selfBaseDuration = 0;
28315 + workInProgress.treeBaseDuration = 0;
28316 + }
28317 + } else {
28318 + // Reset to the cloned values that createWorkInProgress would've.
28319 + workInProgress.childLanes = current.childLanes;
28320 + workInProgress.lanes = current.lanes;
28321 + workInProgress.child = current.child;
28322 + workInProgress.subtreeFlags = NoFlags;
28323 + workInProgress.deletions = null;
28324 + workInProgress.memoizedProps = current.memoizedProps;
28325 + workInProgress.memoizedState = current.memoizedState;
28326 + workInProgress.updateQueue = current.updateQueue; // Needed because Blocks store data on type.
28327 +
28328 + workInProgress.type = current.type; // Clone the dependencies object. This is mutated during the render phase, so
28329 + // it cannot be shared with the current fiber.
28330 +
28331 + var currentDependencies = current.dependencies;
28332 + workInProgress.dependencies = currentDependencies === null ? null : {
28333 + lanes: currentDependencies.lanes,
28334 + firstContext: currentDependencies.firstContext
28335 + };
28336 +
28337 + {
28338 + // Note: We don't reset the actualTime counts. It's useful to accumulate
28339 + // actual time across multiple render passes.
28340 + workInProgress.selfBaseDuration = current.selfBaseDuration;
28341 + workInProgress.treeBaseDuration = current.treeBaseDuration;
28342 + }
28343 + }
28344 +
28345 + return workInProgress;
28346 + }
28347 + function createHostRootFiber(tag, isStrictMode, concurrentUpdatesByDefaultOverride) {
28348 + var mode;
28349 +
28350 + if (tag === ConcurrentRoot) {
28351 + mode = ConcurrentMode;
28352 +
28353 + if (isStrictMode === true) {
28354 + mode |= StrictLegacyMode;
28355 +
28356 + {
28357 + mode |= StrictEffectsMode;
28358 + }
28359 + }
28360 + } else {
28361 + mode = NoMode;
28362 + }
28363 +
28364 + if ( isDevToolsPresent) {
28365 + // Always collect profile timings when DevTools are present.
28366 + // This enables DevTools to start capturing timing at any point–
28367 + // Without some nodes in the tree having empty base times.
28368 + mode |= ProfileMode;
28369 + }
28370 +
28371 + return createFiber(HostRoot, null, null, mode);
28372 + }
28373 + function createFiberFromTypeAndProps(type, // React$ElementType
28374 + key, pendingProps, owner, mode, lanes) {
28375 + var fiberTag = IndeterminateComponent; // The resolved type is set if we know what the final type will be. I.e. it's not lazy.
28376 +
28377 + var resolvedType = type;
28378 +
28379 + if (typeof type === 'function') {
28380 + if (shouldConstruct$1(type)) {
28381 + fiberTag = ClassComponent;
28382 +
28383 + {
28384 + resolvedType = resolveClassForHotReloading(resolvedType);
28385 + }
28386 + } else {
28387 + {
28388 + resolvedType = resolveFunctionForHotReloading(resolvedType);
28389 + }
28390 + }
28391 + } else if (typeof type === 'string') {
28392 + fiberTag = HostComponent;
28393 + } else {
28394 + getTag: switch (type) {
28395 + case REACT_FRAGMENT_TYPE:
28396 + return createFiberFromFragment(pendingProps.children, mode, lanes, key);
28397 +
28398 + case REACT_STRICT_MODE_TYPE:
28399 + fiberTag = Mode;
28400 + mode |= StrictLegacyMode;
28401 +
28402 + if ( (mode & ConcurrentMode) !== NoMode) {
28403 + // Strict effects should never run on legacy roots
28404 + mode |= StrictEffectsMode;
28405 + }
28406 +
28407 + break;
28408 +
28409 + case REACT_PROFILER_TYPE:
28410 + return createFiberFromProfiler(pendingProps, mode, lanes, key);
28411 +
28412 + case REACT_SUSPENSE_TYPE:
28413 + return createFiberFromSuspense(pendingProps, mode, lanes, key);
28414 +
28415 + case REACT_SUSPENSE_LIST_TYPE:
28416 + return createFiberFromSuspenseList(pendingProps, mode, lanes, key);
28417 +
28418 + case REACT_OFFSCREEN_TYPE:
28419 + return createFiberFromOffscreen(pendingProps, mode, lanes, key);
28420 +
28421 + case REACT_LEGACY_HIDDEN_TYPE:
28422 +
28423 + // eslint-disable-next-line no-fallthrough
28424 +
28425 + case REACT_SCOPE_TYPE:
28426 +
28427 + // eslint-disable-next-line no-fallthrough
28428 +
28429 + case REACT_CACHE_TYPE:
28430 +
28431 + // eslint-disable-next-line no-fallthrough
28432 +
28433 + case REACT_TRACING_MARKER_TYPE:
28434 +
28435 + // eslint-disable-next-line no-fallthrough
28436 +
28437 + case REACT_DEBUG_TRACING_MODE_TYPE:
28438 +
28439 + // eslint-disable-next-line no-fallthrough
28440 +
28441 + default:
28442 + {
28443 + if (typeof type === 'object' && type !== null) {
28444 + switch (type.$$typeof) {
28445 + case REACT_PROVIDER_TYPE:
28446 + fiberTag = ContextProvider;
28447 + break getTag;
28448 +
28449 + case REACT_CONTEXT_TYPE:
28450 + // This is a consumer
28451 + fiberTag = ContextConsumer;
28452 + break getTag;
28453 +
28454 + case REACT_FORWARD_REF_TYPE:
28455 + fiberTag = ForwardRef;
28456 +
28457 + {
28458 + resolvedType = resolveForwardRefForHotReloading(resolvedType);
28459 + }
28460 +
28461 + break getTag;
28462 +
28463 + case REACT_MEMO_TYPE:
28464 + fiberTag = MemoComponent;
28465 + break getTag;
28466 +
28467 + case REACT_LAZY_TYPE:
28468 + fiberTag = LazyComponent;
28469 + resolvedType = null;
28470 + break getTag;
28471 + }
28472 + }
28473 +
28474 + var info = '';
28475 +
28476 + {
28477 + if (type === undefined || typeof type === 'object' && type !== null && Object.keys(type).length === 0) {
28478 + info += ' You likely forgot to export your component from the file ' + "it's defined in, or you might have mixed up default and " + 'named imports.';
28479 + }
28480 +
28481 + var ownerName = owner ? getComponentNameFromFiber(owner) : null;
28482 +
28483 + if (ownerName) {
28484 + info += '\n\nCheck the render method of `' + ownerName + '`.';
28485 + }
28486 + }
28487 +
28488 + throw new Error('Element type is invalid: expected a string (for built-in ' + 'components) or a class/function (for composite components) ' + ("but got: " + (type == null ? type : typeof type) + "." + info));
28489 + }
28490 + }
28491 + }
28492 +
28493 + var fiber = createFiber(fiberTag, pendingProps, key, mode);
28494 + fiber.elementType = type;
28495 + fiber.type = resolvedType;
28496 + fiber.lanes = lanes;
28497 +
28498 + {
28499 + fiber._debugOwner = owner;
28500 + }
28501 +
28502 + return fiber;
28503 + }
28504 + function createFiberFromElement(element, mode, lanes) {
28505 + var owner = null;
28506 +
28507 + {
28508 + owner = element._owner;
28509 + }
28510 +
28511 + var type = element.type;
28512 + var key = element.key;
28513 + var pendingProps = element.props;
28514 + var fiber = createFiberFromTypeAndProps(type, key, pendingProps, owner, mode, lanes);
28515 +
28516 + {
28517 + fiber._debugSource = element._source;
28518 + fiber._debugOwner = element._owner;
28519 + }
28520 +
28521 + return fiber;
28522 + }
28523 + function createFiberFromFragment(elements, mode, lanes, key) {
28524 + var fiber = createFiber(Fragment, elements, key, mode);
28525 + fiber.lanes = lanes;
28526 + return fiber;
28527 + }
28528 +
28529 + function createFiberFromProfiler(pendingProps, mode, lanes, key) {
28530 + {
28531 + if (typeof pendingProps.id !== 'string') {
28532 + error('Profiler must specify an "id" of type `string` as a prop. Received the type `%s` instead.', typeof pendingProps.id);
28533 + }
28534 + }
28535 +
28536 + var fiber = createFiber(Profiler, pendingProps, key, mode | ProfileMode);
28537 + fiber.elementType = REACT_PROFILER_TYPE;
28538 + fiber.lanes = lanes;
28539 +
28540 + {
28541 + fiber.stateNode = {
28542 + effectDuration: 0,
28543 + passiveEffectDuration: 0
28544 + };
28545 + }
28546 +
28547 + return fiber;
28548 + }
28549 +
28550 + function createFiberFromSuspense(pendingProps, mode, lanes, key) {
28551 + var fiber = createFiber(SuspenseComponent, pendingProps, key, mode);
28552 + fiber.elementType = REACT_SUSPENSE_TYPE;
28553 + fiber.lanes = lanes;
28554 + return fiber;
28555 + }
28556 + function createFiberFromSuspenseList(pendingProps, mode, lanes, key) {
28557 + var fiber = createFiber(SuspenseListComponent, pendingProps, key, mode);
28558 + fiber.elementType = REACT_SUSPENSE_LIST_TYPE;
28559 + fiber.lanes = lanes;
28560 + return fiber;
28561 + }
28562 + function createFiberFromOffscreen(pendingProps, mode, lanes, key) {
28563 + var fiber = createFiber(OffscreenComponent, pendingProps, key, mode);
28564 + fiber.elementType = REACT_OFFSCREEN_TYPE;
28565 + fiber.lanes = lanes;
28566 + var primaryChildInstance = {
28567 + isHidden: false
28568 + };
28569 + fiber.stateNode = primaryChildInstance;
28570 + return fiber;
28571 + }
28572 + function createFiberFromText(content, mode, lanes) {
28573 + var fiber = createFiber(HostText, content, null, mode);
28574 + fiber.lanes = lanes;
28575 + return fiber;
28576 + }
28577 + function createFiberFromHostInstanceForDeletion() {
28578 + var fiber = createFiber(HostComponent, null, null, NoMode);
28579 + fiber.elementType = 'DELETED';
28580 + return fiber;
28581 + }
28582 + function createFiberFromDehydratedFragment(dehydratedNode) {
28583 + var fiber = createFiber(DehydratedFragment, null, null, NoMode);
28584 + fiber.stateNode = dehydratedNode;
28585 + return fiber;
28586 + }
28587 + function createFiberFromPortal(portal, mode, lanes) {
28588 + var pendingProps = portal.children !== null ? portal.children : [];
28589 + var fiber = createFiber(HostPortal, pendingProps, portal.key, mode);
28590 + fiber.lanes = lanes;
28591 + fiber.stateNode = {
28592 + containerInfo: portal.containerInfo,
28593 + pendingChildren: null,
28594 + // Used by persistent updates
28595 + implementation: portal.implementation
28596 + };
28597 + return fiber;
28598 + } // Used for stashing WIP properties to replay failed work in DEV.
28599 +
28600 + function assignFiberPropertiesInDEV(target, source) {
28601 + if (target === null) {
28602 + // This Fiber's initial properties will always be overwritten.
28603 + // We only use a Fiber to ensure the same hidden class so DEV isn't slow.
28604 + target = createFiber(IndeterminateComponent, null, null, NoMode);
28605 + } // This is intentionally written as a list of all properties.
28606 + // We tried to use Object.assign() instead but this is called in
28607 + // the hottest path, and Object.assign() was too slow:
28608 + // https://github.com/facebook/react/issues/12502
28609 + // This code is DEV-only so size is not a concern.
28610 +
28611 +
28612 + target.tag = source.tag;
28613 + target.key = source.key;
28614 + target.elementType = source.elementType;
28615 + target.type = source.type;
28616 + target.stateNode = source.stateNode;
28617 + target.return = source.return;
28618 + target.child = source.child;
28619 + target.sibling = source.sibling;
28620 + target.index = source.index;
28621 + target.ref = source.ref;
28622 + target.pendingProps = source.pendingProps;
28623 + target.memoizedProps = source.memoizedProps;
28624 + target.updateQueue = source.updateQueue;
28625 + target.memoizedState = source.memoizedState;
28626 + target.dependencies = source.dependencies;
28627 + target.mode = source.mode;
28628 + target.flags = source.flags;
28629 + target.subtreeFlags = source.subtreeFlags;
28630 + target.deletions = source.deletions;
28631 + target.lanes = source.lanes;
28632 + target.childLanes = source.childLanes;
28633 + target.alternate = source.alternate;
28634 +
28635 + {
28636 + target.actualDuration = source.actualDuration;
28637 + target.actualStartTime = source.actualStartTime;
28638 + target.selfBaseDuration = source.selfBaseDuration;
28639 + target.treeBaseDuration = source.treeBaseDuration;
28640 + }
28641 +
28642 + target._debugSource = source._debugSource;
28643 + target._debugOwner = source._debugOwner;
28644 + target._debugNeedsRemount = source._debugNeedsRemount;
28645 + target._debugHookTypes = source._debugHookTypes;
28646 + return target;
28647 + }
28648 +
28649 + function FiberRootNode(containerInfo, tag, hydrate, identifierPrefix, onRecoverableError) {
28650 + this.tag = tag;
28651 + this.containerInfo = containerInfo;
28652 + this.pendingChildren = null;
28653 + this.current = null;
28654 + this.pingCache = null;
28655 + this.finishedWork = null;
28656 + this.timeoutHandle = noTimeout;
28657 + this.context = null;
28658 + this.pendingContext = null;
28659 + this.callbackNode = null;
28660 + this.callbackPriority = NoLane;
28661 + this.eventTimes = createLaneMap(NoLanes);
28662 + this.expirationTimes = createLaneMap(NoTimestamp);
28663 + this.pendingLanes = NoLanes;
28664 + this.suspendedLanes = NoLanes;
28665 + this.pingedLanes = NoLanes;
28666 + this.expiredLanes = NoLanes;
28667 + this.mutableReadLanes = NoLanes;
28668 + this.finishedLanes = NoLanes;
28669 + this.entangledLanes = NoLanes;
28670 + this.entanglements = createLaneMap(NoLanes);
28671 + this.identifierPrefix = identifierPrefix;
28672 + this.onRecoverableError = onRecoverableError;
28673 +
28674 + {
28675 + this.mutableSourceEagerHydrationData = null;
28676 + }
28677 +
28678 + {
28679 + this.effectDuration = 0;
28680 + this.passiveEffectDuration = 0;
28681 + }
28682 +
28683 + {
28684 + this.memoizedUpdaters = new Set();
28685 + var pendingUpdatersLaneMap = this.pendingUpdatersLaneMap = [];
28686 +
28687 + for (var _i = 0; _i < TotalLanes; _i++) {
28688 + pendingUpdatersLaneMap.push(new Set());
28689 + }
28690 + }
28691 +
28692 + {
28693 + switch (tag) {
28694 + case ConcurrentRoot:
28695 + this._debugRootType = hydrate ? 'hydrateRoot()' : 'createRoot()';
28696 + break;
28697 +
28698 + case LegacyRoot:
28699 + this._debugRootType = hydrate ? 'hydrate()' : 'render()';
28700 + break;
28701 + }
28702 + }
28703 + }
28704 +
28705 + function createFiberRoot(containerInfo, tag, hydrate, initialChildren, hydrationCallbacks, isStrictMode, concurrentUpdatesByDefaultOverride, // TODO: We have several of these arguments that are conceptually part of the
28706 + // host config, but because they are passed in at runtime, we have to thread
28707 + // them through the root constructor. Perhaps we should put them all into a
28708 + // single type, like a DynamicHostConfig that is defined by the renderer.
28709 + identifierPrefix, onRecoverableError, transitionCallbacks) {
28710 + var root = new FiberRootNode(containerInfo, tag, hydrate, identifierPrefix, onRecoverableError);
28711 + // stateNode is any.
28712 +
28713 +
28714 + var uninitializedFiber = createHostRootFiber(tag, isStrictMode);
28715 + root.current = uninitializedFiber;
28716 + uninitializedFiber.stateNode = root;
28717 +
28718 + {
28719 + var _initialState = {
28720 + element: initialChildren,
28721 + isDehydrated: hydrate,
28722 + cache: null,
28723 + // not enabled yet
28724 + transitions: null,
28725 + pendingSuspenseBoundaries: null
28726 + };
28727 + uninitializedFiber.memoizedState = _initialState;
28728 + }
28729 +
28730 + initializeUpdateQueue(uninitializedFiber);
28731 + return root;
28732 + }
28733 +
28734 + var ReactVersion = '18.3.1';
28735 +
28736 + function createPortal(children, containerInfo, // TODO: figure out the API for cross-renderer implementation.
28737 + implementation) {
28738 + var key = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : null;
28739 +
28740 + {
28741 + checkKeyStringCoercion(key);
28742 + }
28743 +
28744 + return {
28745 + // This tag allow us to uniquely identify this as a React Portal
28746 + $$typeof: REACT_PORTAL_TYPE,
28747 + key: key == null ? null : '' + key,
28748 + children: children,
28749 + containerInfo: containerInfo,
28750 + implementation: implementation
28751 + };
28752 + }
28753 +
28754 + var didWarnAboutNestedUpdates;
28755 + var didWarnAboutFindNodeInStrictMode;
28756 +
28757 + {
28758 + didWarnAboutNestedUpdates = false;
28759 + didWarnAboutFindNodeInStrictMode = {};
28760 + }
28761 +
28762 + function getContextForSubtree(parentComponent) {
28763 + if (!parentComponent) {
28764 + return emptyContextObject;
28765 + }
28766 +
28767 + var fiber = get(parentComponent);
28768 + var parentContext = findCurrentUnmaskedContext(fiber);
28769 +
28770 + if (fiber.tag === ClassComponent) {
28771 + var Component = fiber.type;
28772 +
28773 + if (isContextProvider(Component)) {
28774 + return processChildContext(fiber, Component, parentContext);
28775 + }
28776 + }
28777 +
28778 + return parentContext;
28779 + }
28780 +
28781 + function findHostInstanceWithWarning(component, methodName) {
28782 + {
28783 + var fiber = get(component);
28784 +
28785 + if (fiber === undefined) {
28786 + if (typeof component.render === 'function') {
28787 + throw new Error('Unable to find node on an unmounted component.');
28788 + } else {
28789 + var keys = Object.keys(component).join(',');
28790 + throw new Error("Argument appears to not be a ReactComponent. Keys: " + keys);
28791 + }
28792 + }
28793 +
28794 + var hostFiber = findCurrentHostFiber(fiber);
28795 +
28796 + if (hostFiber === null) {
28797 + return null;
28798 + }
28799 +
28800 + if (hostFiber.mode & StrictLegacyMode) {
28801 + var componentName = getComponentNameFromFiber(fiber) || 'Component';
28802 +
28803 + if (!didWarnAboutFindNodeInStrictMode[componentName]) {
28804 + didWarnAboutFindNodeInStrictMode[componentName] = true;
28805 + var previousFiber = current;
28806 +
28807 + try {
28808 + setCurrentFiber(hostFiber);
28809 +
28810 + if (fiber.mode & StrictLegacyMode) {
28811 + error('%s is deprecated in StrictMode. ' + '%s was passed an instance of %s which is inside StrictMode. ' + 'Instead, add a ref directly to the element you want to reference. ' + 'Learn more about using refs safely here: ' + 'https://reactjs.org/link/strict-mode-find-node', methodName, methodName, componentName);
28812 + } else {
28813 + error('%s is deprecated in StrictMode. ' + '%s was passed an instance of %s which renders StrictMode children. ' + 'Instead, add a ref directly to the element you want to reference. ' + 'Learn more about using refs safely here: ' + 'https://reactjs.org/link/strict-mode-find-node', methodName, methodName, componentName);
28814 + }
28815 + } finally {
28816 + // Ideally this should reset to previous but this shouldn't be called in
28817 + // render and there's another warning for that anyway.
28818 + if (previousFiber) {
28819 + setCurrentFiber(previousFiber);
28820 + } else {
28821 + resetCurrentFiber();
28822 + }
28823 + }
28824 + }
28825 + }
28826 +
28827 + return hostFiber.stateNode;
28828 + }
28829 + }
28830 +
28831 + function createContainer(containerInfo, tag, hydrationCallbacks, isStrictMode, concurrentUpdatesByDefaultOverride, identifierPrefix, onRecoverableError, transitionCallbacks) {
28832 + var hydrate = false;
28833 + var initialChildren = null;
28834 + return createFiberRoot(containerInfo, tag, hydrate, initialChildren, hydrationCallbacks, isStrictMode, concurrentUpdatesByDefaultOverride, identifierPrefix, onRecoverableError);
28835 + }
28836 + function createHydrationContainer(initialChildren, // TODO: Remove `callback` when we delete legacy mode.
28837 + callback, containerInfo, tag, hydrationCallbacks, isStrictMode, concurrentUpdatesByDefaultOverride, identifierPrefix, onRecoverableError, transitionCallbacks) {
28838 + var hydrate = true;
28839 + var root = createFiberRoot(containerInfo, tag, hydrate, initialChildren, hydrationCallbacks, isStrictMode, concurrentUpdatesByDefaultOverride, identifierPrefix, onRecoverableError); // TODO: Move this to FiberRoot constructor
28840 +
28841 + root.context = getContextForSubtree(null); // Schedule the initial render. In a hydration root, this is different from
28842 + // a regular update because the initial render must match was was rendered
28843 + // on the server.
28844 + // NOTE: This update intentionally doesn't have a payload. We're only using
28845 + // the update to schedule work on the root fiber (and, for legacy roots, to
28846 + // enqueue the callback if one is provided).
28847 +
28848 + var current = root.current;
28849 + var eventTime = requestEventTime();
28850 + var lane = requestUpdateLane(current);
28851 + var update = createUpdate(eventTime, lane);
28852 + update.callback = callback !== undefined && callback !== null ? callback : null;
28853 + enqueueUpdate(current, update, lane);
28854 + scheduleInitialHydrationOnRoot(root, lane, eventTime);
28855 + return root;
28856 + }
28857 + function updateContainer(element, container, parentComponent, callback) {
28858 + {
28859 + onScheduleRoot(container, element);
28860 + }
28861 +
28862 + var current$1 = container.current;
28863 + var eventTime = requestEventTime();
28864 + var lane = requestUpdateLane(current$1);
28865 +
28866 + {
28867 + markRenderScheduled(lane);
28868 + }
28869 +
28870 + var context = getContextForSubtree(parentComponent);
28871 +
28872 + if (container.context === null) {
28873 + container.context = context;
28874 + } else {
28875 + container.pendingContext = context;
28876 + }
28877 +
28878 + {
28879 + if (isRendering && current !== null && !didWarnAboutNestedUpdates) {
28880 + didWarnAboutNestedUpdates = true;
28881 +
28882 + error('Render methods should be a pure function of props and state; ' + 'triggering nested component updates from render is not allowed. ' + 'If necessary, trigger nested updates in componentDidUpdate.\n\n' + 'Check the render method of %s.', getComponentNameFromFiber(current) || 'Unknown');
28883 + }
28884 + }
28885 +
28886 + var update = createUpdate(eventTime, lane); // Caution: React DevTools currently depends on this property
28887 + // being called "element".
28888 +
28889 + update.payload = {
28890 + element: element
28891 + };
28892 + callback = callback === undefined ? null : callback;
28893 +
28894 + if (callback !== null) {
28895 + {
28896 + if (typeof callback !== 'function') {
28897 + error('render(...): Expected the last optional `callback` argument to be a ' + 'function. Instead received: %s.', callback);
28898 + }
28899 + }
28900 +
28901 + update.callback = callback;
28902 + }
28903 +
28904 + var root = enqueueUpdate(current$1, update, lane);
28905 +
28906 + if (root !== null) {
28907 + scheduleUpdateOnFiber(root, current$1, lane, eventTime);
28908 + entangleTransitions(root, current$1, lane);
28909 + }
28910 +
28911 + return lane;
28912 + }
28913 + function getPublicRootInstance(container) {
28914 + var containerFiber = container.current;
28915 +
28916 + if (!containerFiber.child) {
28917 + return null;
28918 + }
28919 +
28920 + switch (containerFiber.child.tag) {
28921 + case HostComponent:
28922 + return getPublicInstance(containerFiber.child.stateNode);
28923 +
28924 + default:
28925 + return containerFiber.child.stateNode;
28926 + }
28927 + }
28928 + function attemptSynchronousHydration$1(fiber) {
28929 + switch (fiber.tag) {
28930 + case HostRoot:
28931 + {
28932 + var root = fiber.stateNode;
28933 +
28934 + if (isRootDehydrated(root)) {
28935 + // Flush the first scheduled "update".
28936 + var lanes = getHighestPriorityPendingLanes(root);
28937 + flushRoot(root, lanes);
28938 + }
28939 +
28940 + break;
28941 + }
28942 +
28943 + case SuspenseComponent:
28944 + {
28945 + flushSync(function () {
28946 + var root = enqueueConcurrentRenderForLane(fiber, SyncLane);
28947 +
28948 + if (root !== null) {
28949 + var eventTime = requestEventTime();
28950 + scheduleUpdateOnFiber(root, fiber, SyncLane, eventTime);
28951 + }
28952 + }); // If we're still blocked after this, we need to increase
28953 + // the priority of any promises resolving within this
28954 + // boundary so that they next attempt also has higher pri.
28955 +
28956 + var retryLane = SyncLane;
28957 + markRetryLaneIfNotHydrated(fiber, retryLane);
28958 + break;
28959 + }
28960 + }
28961 + }
28962 +
28963 + function markRetryLaneImpl(fiber, retryLane) {
28964 + var suspenseState = fiber.memoizedState;
28965 +
28966 + if (suspenseState !== null && suspenseState.dehydrated !== null) {
28967 + suspenseState.retryLane = higherPriorityLane(suspenseState.retryLane, retryLane);
28968 + }
28969 + } // Increases the priority of thenables when they resolve within this boundary.
28970 +
28971 +
28972 + function markRetryLaneIfNotHydrated(fiber, retryLane) {
28973 + markRetryLaneImpl(fiber, retryLane);
28974 + var alternate = fiber.alternate;
28975 +
28976 + if (alternate) {
28977 + markRetryLaneImpl(alternate, retryLane);
28978 + }
28979 + }
28980 + function attemptContinuousHydration$1(fiber) {
28981 + if (fiber.tag !== SuspenseComponent) {
28982 + // We ignore HostRoots here because we can't increase
28983 + // their priority and they should not suspend on I/O,
28984 + // since you have to wrap anything that might suspend in
28985 + // Suspense.
28986 + return;
28987 + }
28988 +
28989 + var lane = SelectiveHydrationLane;
28990 + var root = enqueueConcurrentRenderForLane(fiber, lane);
28991 +
28992 + if (root !== null) {
28993 + var eventTime = requestEventTime();
28994 + scheduleUpdateOnFiber(root, fiber, lane, eventTime);
28995 + }
28996 +
28997 + markRetryLaneIfNotHydrated(fiber, lane);
28998 + }
28999 + function attemptHydrationAtCurrentPriority$1(fiber) {
29000 + if (fiber.tag !== SuspenseComponent) {
29001 + // We ignore HostRoots here because we can't increase
29002 + // their priority other than synchronously flush it.
29003 + return;
29004 + }
29005 +
29006 + var lane = requestUpdateLane(fiber);
29007 + var root = enqueueConcurrentRenderForLane(fiber, lane);
29008 +
29009 + if (root !== null) {
29010 + var eventTime = requestEventTime();
29011 + scheduleUpdateOnFiber(root, fiber, lane, eventTime);
29012 + }
29013 +
29014 + markRetryLaneIfNotHydrated(fiber, lane);
29015 + }
29016 + function findHostInstanceWithNoPortals(fiber) {
29017 + var hostFiber = findCurrentHostFiberWithNoPortals(fiber);
29018 +
29019 + if (hostFiber === null) {
29020 + return null;
29021 + }
29022 +
29023 + return hostFiber.stateNode;
29024 + }
29025 +
29026 + var shouldErrorImpl = function (fiber) {
29027 + return null;
29028 + };
29029 +
29030 + function shouldError(fiber) {
29031 + return shouldErrorImpl(fiber);
29032 + }
29033 +
29034 + var shouldSuspendImpl = function (fiber) {
29035 + return false;
29036 + };
29037 +
29038 + function shouldSuspend(fiber) {
29039 + return shouldSuspendImpl(fiber);
29040 + }
29041 + var overrideHookState = null;
29042 + var overrideHookStateDeletePath = null;
29043 + var overrideHookStateRenamePath = null;
29044 + var overrideProps = null;
29045 + var overridePropsDeletePath = null;
29046 + var overridePropsRenamePath = null;
29047 + var scheduleUpdate = null;
29048 + var setErrorHandler = null;
29049 + var setSuspenseHandler = null;
29050 +
29051 + {
29052 + var copyWithDeleteImpl = function (obj, path, index) {
29053 + var key = path[index];
29054 + var updated = isArray(obj) ? obj.slice() : assign({}, obj);
29055 +
29056 + if (index + 1 === path.length) {
29057 + if (isArray(updated)) {
29058 + updated.splice(key, 1);
29059 + } else {
29060 + delete updated[key];
29061 + }
29062 +
29063 + return updated;
29064 + } // $FlowFixMe number or string is fine here
29065 +
29066 +
29067 + updated[key] = copyWithDeleteImpl(obj[key], path, index + 1);
29068 + return updated;
29069 + };
29070 +
29071 + var copyWithDelete = function (obj, path) {
29072 + return copyWithDeleteImpl(obj, path, 0);
29073 + };
29074 +
29075 + var copyWithRenameImpl = function (obj, oldPath, newPath, index) {
29076 + var oldKey = oldPath[index];
29077 + var updated = isArray(obj) ? obj.slice() : assign({}, obj);
29078 +
29079 + if (index + 1 === oldPath.length) {
29080 + var newKey = newPath[index]; // $FlowFixMe number or string is fine here
29081 +
29082 + updated[newKey] = updated[oldKey];
29083 +
29084 + if (isArray(updated)) {
29085 + updated.splice(oldKey, 1);
29086 + } else {
29087 + delete updated[oldKey];
29088 + }
29089 + } else {
29090 + // $FlowFixMe number or string is fine here
29091 + updated[oldKey] = copyWithRenameImpl( // $FlowFixMe number or string is fine here
29092 + obj[oldKey], oldPath, newPath, index + 1);
29093 + }
29094 +
29095 + return updated;
29096 + };
29097 +
29098 + var copyWithRename = function (obj, oldPath, newPath) {
29099 + if (oldPath.length !== newPath.length) {
29100 + warn('copyWithRename() expects paths of the same length');
29101 +
29102 + return;
29103 + } else {
29104 + for (var i = 0; i < newPath.length - 1; i++) {
29105 + if (oldPath[i] !== newPath[i]) {
29106 + warn('copyWithRename() expects paths to be the same except for the deepest key');
29107 +
29108 + return;
29109 + }
29110 + }
29111 + }
29112 +
29113 + return copyWithRenameImpl(obj, oldPath, newPath, 0);
29114 + };
29115 +
29116 + var copyWithSetImpl = function (obj, path, index, value) {
29117 + if (index >= path.length) {
29118 + return value;
29119 + }
29120 +
29121 + var key = path[index];
29122 + var updated = isArray(obj) ? obj.slice() : assign({}, obj); // $FlowFixMe number or string is fine here
29123 +
29124 + updated[key] = copyWithSetImpl(obj[key], path, index + 1, value);
29125 + return updated;
29126 + };
29127 +
29128 + var copyWithSet = function (obj, path, value) {
29129 + return copyWithSetImpl(obj, path, 0, value);
29130 + };
29131 +
29132 + var findHook = function (fiber, id) {
29133 + // For now, the "id" of stateful hooks is just the stateful hook index.
29134 + // This may change in the future with e.g. nested hooks.
29135 + var currentHook = fiber.memoizedState;
29136 +
29137 + while (currentHook !== null && id > 0) {
29138 + currentHook = currentHook.next;
29139 + id--;
29140 + }
29141 +
29142 + return currentHook;
29143 + }; // Support DevTools editable values for useState and useReducer.
29144 +
29145 +
29146 + overrideHookState = function (fiber, id, path, value) {
29147 + var hook = findHook(fiber, id);
29148 +
29149 + if (hook !== null) {
29150 + var newState = copyWithSet(hook.memoizedState, path, value);
29151 + hook.memoizedState = newState;
29152 + hook.baseState = newState; // We aren't actually adding an update to the queue,
29153 + // because there is no update we can add for useReducer hooks that won't trigger an error.
29154 + // (There's no appropriate action type for DevTools overrides.)
29155 + // As a result though, React will see the scheduled update as a noop and bailout.
29156 + // Shallow cloning props works as a workaround for now to bypass the bailout check.
29157 +
29158 + fiber.memoizedProps = assign({}, fiber.memoizedProps);
29159 + var root = enqueueConcurrentRenderForLane(fiber, SyncLane);
29160 +
29161 + if (root !== null) {
29162 + scheduleUpdateOnFiber(root, fiber, SyncLane, NoTimestamp);
29163 + }
29164 + }
29165 + };
29166 +
29167 + overrideHookStateDeletePath = function (fiber, id, path) {
29168 + var hook = findHook(fiber, id);
29169 +
29170 + if (hook !== null) {
29171 + var newState = copyWithDelete(hook.memoizedState, path);
29172 + hook.memoizedState = newState;
29173 + hook.baseState = newState; // We aren't actually adding an update to the queue,
29174 + // because there is no update we can add for useReducer hooks that won't trigger an error.
29175 + // (There's no appropriate action type for DevTools overrides.)
29176 + // As a result though, React will see the scheduled update as a noop and bailout.
29177 + // Shallow cloning props works as a workaround for now to bypass the bailout check.
29178 +
29179 + fiber.memoizedProps = assign({}, fiber.memoizedProps);
29180 + var root = enqueueConcurrentRenderForLane(fiber, SyncLane);
29181 +
29182 + if (root !== null) {
29183 + scheduleUpdateOnFiber(root, fiber, SyncLane, NoTimestamp);
29184 + }
29185 + }
29186 + };
29187 +
29188 + overrideHookStateRenamePath = function (fiber, id, oldPath, newPath) {
29189 + var hook = findHook(fiber, id);
29190 +
29191 + if (hook !== null) {
29192 + var newState = copyWithRename(hook.memoizedState, oldPath, newPath);
29193 + hook.memoizedState = newState;
29194 + hook.baseState = newState; // We aren't actually adding an update to the queue,
29195 + // because there is no update we can add for useReducer hooks that won't trigger an error.
29196 + // (There's no appropriate action type for DevTools overrides.)
29197 + // As a result though, React will see the scheduled update as a noop and bailout.
29198 + // Shallow cloning props works as a workaround for now to bypass the bailout check.
29199 +
29200 + fiber.memoizedProps = assign({}, fiber.memoizedProps);
29201 + var root = enqueueConcurrentRenderForLane(fiber, SyncLane);
29202 +
29203 + if (root !== null) {
29204 + scheduleUpdateOnFiber(root, fiber, SyncLane, NoTimestamp);
29205 + }
29206 + }
29207 + }; // Support DevTools props for function components, forwardRef, memo, host components, etc.
29208 +
29209 +
29210 + overrideProps = function (fiber, path, value) {
29211 + fiber.pendingProps = copyWithSet(fiber.memoizedProps, path, value);
29212 +
29213 + if (fiber.alternate) {
29214 + fiber.alternate.pendingProps = fiber.pendingProps;
29215 + }
29216 +
29217 + var root = enqueueConcurrentRenderForLane(fiber, SyncLane);
29218 +
29219 + if (root !== null) {
29220 + scheduleUpdateOnFiber(root, fiber, SyncLane, NoTimestamp);
29221 + }
29222 + };
29223 +
29224 + overridePropsDeletePath = function (fiber, path) {
29225 + fiber.pendingProps = copyWithDelete(fiber.memoizedProps, path);
29226 +
29227 + if (fiber.alternate) {
29228 + fiber.alternate.pendingProps = fiber.pendingProps;
29229 + }
29230 +
29231 + var root = enqueueConcurrentRenderForLane(fiber, SyncLane);
29232 +
29233 + if (root !== null) {
29234 + scheduleUpdateOnFiber(root, fiber, SyncLane, NoTimestamp);
29235 + }
29236 + };
29237 +
29238 + overridePropsRenamePath = function (fiber, oldPath, newPath) {
29239 + fiber.pendingProps = copyWithRename(fiber.memoizedProps, oldPath, newPath);
29240 +
29241 + if (fiber.alternate) {
29242 + fiber.alternate.pendingProps = fiber.pendingProps;
29243 + }
29244 +
29245 + var root = enqueueConcurrentRenderForLane(fiber, SyncLane);
29246 +
29247 + if (root !== null) {
29248 + scheduleUpdateOnFiber(root, fiber, SyncLane, NoTimestamp);
29249 + }
29250 + };
29251 +
29252 + scheduleUpdate = function (fiber) {
29253 + var root = enqueueConcurrentRenderForLane(fiber, SyncLane);
29254 +
29255 + if (root !== null) {
29256 + scheduleUpdateOnFiber(root, fiber, SyncLane, NoTimestamp);
29257 + }
29258 + };
29259 +
29260 + setErrorHandler = function (newShouldErrorImpl) {
29261 + shouldErrorImpl = newShouldErrorImpl;
29262 + };
29263 +
29264 + setSuspenseHandler = function (newShouldSuspendImpl) {
29265 + shouldSuspendImpl = newShouldSuspendImpl;
29266 + };
29267 + }
29268 +
29269 + function findHostInstanceByFiber(fiber) {
29270 + var hostFiber = findCurrentHostFiber(fiber);
29271 +
29272 + if (hostFiber === null) {
29273 + return null;
29274 + }
29275 +
29276 + return hostFiber.stateNode;
29277 + }
29278 +
29279 + function emptyFindFiberByHostInstance(instance) {
29280 + return null;
29281 + }
29282 +
29283 + function getCurrentFiberForDevTools() {
29284 + return current;
29285 + }
29286 +
29287 + function injectIntoDevTools(devToolsConfig) {
29288 + var findFiberByHostInstance = devToolsConfig.findFiberByHostInstance;
29289 + var ReactCurrentDispatcher = ReactSharedInternals.ReactCurrentDispatcher;
29290 + return injectInternals({
29291 + bundleType: devToolsConfig.bundleType,
29292 + version: devToolsConfig.version,
29293 + rendererPackageName: devToolsConfig.rendererPackageName,
29294 + rendererConfig: devToolsConfig.rendererConfig,
29295 + overrideHookState: overrideHookState,
29296 + overrideHookStateDeletePath: overrideHookStateDeletePath,
29297 + overrideHookStateRenamePath: overrideHookStateRenamePath,
29298 + overrideProps: overrideProps,
29299 + overridePropsDeletePath: overridePropsDeletePath,
29300 + overridePropsRenamePath: overridePropsRenamePath,
29301 + setErrorHandler: setErrorHandler,
29302 + setSuspenseHandler: setSuspenseHandler,
29303 + scheduleUpdate: scheduleUpdate,
29304 + currentDispatcherRef: ReactCurrentDispatcher,
29305 + findHostInstanceByFiber: findHostInstanceByFiber,
29306 + findFiberByHostInstance: findFiberByHostInstance || emptyFindFiberByHostInstance,
29307 + // React Refresh
29308 + findHostInstancesForRefresh: findHostInstancesForRefresh ,
29309 + scheduleRefresh: scheduleRefresh ,
29310 + scheduleRoot: scheduleRoot ,
29311 + setRefreshHandler: setRefreshHandler ,
29312 + // Enables DevTools to append owner stacks to error messages in DEV mode.
29313 + getCurrentFiber: getCurrentFiberForDevTools ,
29314 + // Enables DevTools to detect reconciler version rather than renderer version
29315 + // which may not match for third party renderers.
29316 + reconcilerVersion: ReactVersion
29317 + });
29318 + }
29319 +
29320 + /* global reportError */
29321 +
29322 + var defaultOnRecoverableError = typeof reportError === 'function' ? // In modern browsers, reportError will dispatch an error event,
29323 + // emulating an uncaught JavaScript error.
29324 + reportError : function (error) {
29325 + // In older browsers and test environments, fallback to console.error.
29326 + // eslint-disable-next-line react-internal/no-production-logging
29327 + console['error'](error);
29328 + };
29329 +
29330 + function ReactDOMRoot(internalRoot) {
29331 + this._internalRoot = internalRoot;
29332 + }
29333 +
29334 + ReactDOMHydrationRoot.prototype.render = ReactDOMRoot.prototype.render = function (children) {
29335 + var root = this._internalRoot;
29336 +
29337 + if (root === null) {
29338 + throw new Error('Cannot update an unmounted root.');
29339 + }
29340 +
29341 + {
29342 + if (typeof arguments[1] === 'function') {
29343 + error('render(...): does not support the second callback argument. ' + 'To execute a side effect after rendering, declare it in a component body with useEffect().');
29344 + } else if (isValidContainer(arguments[1])) {
29345 + error('You passed a container to the second argument of root.render(...). ' + "You don't need to pass it again since you already passed it to create the root.");
29346 + } else if (typeof arguments[1] !== 'undefined') {
29347 + error('You passed a second argument to root.render(...) but it only accepts ' + 'one argument.');
29348 + }
29349 +
29350 + var container = root.containerInfo;
29351 +
29352 + if (container.nodeType !== COMMENT_NODE) {
29353 + var hostInstance = findHostInstanceWithNoPortals(root.current);
29354 +
29355 + if (hostInstance) {
29356 + if (hostInstance.parentNode !== container) {
29357 + error('render(...): It looks like the React-rendered content of the ' + 'root container was removed without using React. This is not ' + 'supported and will cause errors. Instead, call ' + "root.unmount() to empty a root's container.");
29358 + }
29359 + }
29360 + }
29361 + }
29362 +
29363 + updateContainer(children, root, null, null);
29364 + };
29365 +
29366 + ReactDOMHydrationRoot.prototype.unmount = ReactDOMRoot.prototype.unmount = function () {
29367 + {
29368 + if (typeof arguments[0] === 'function') {
29369 + error('unmount(...): does not support a callback argument. ' + 'To execute a side effect after rendering, declare it in a component body with useEffect().');
29370 + }
29371 + }
29372 +
29373 + var root = this._internalRoot;
29374 +
29375 + if (root !== null) {
29376 + this._internalRoot = null;
29377 + var container = root.containerInfo;
29378 +
29379 + {
29380 + if (isAlreadyRendering()) {
29381 + error('Attempted to synchronously unmount a root while React was already ' + 'rendering. React cannot finish unmounting the root until the ' + 'current render has completed, which may lead to a race condition.');
29382 + }
29383 + }
29384 +
29385 + flushSync(function () {
29386 + updateContainer(null, root, null, null);
29387 + });
29388 + unmarkContainerAsRoot(container);
29389 + }
29390 + };
29391 +
29392 + function createRoot(container, options) {
29393 + if (!isValidContainer(container)) {
29394 + throw new Error('createRoot(...): Target container is not a DOM element.');
29395 + }
29396 +
29397 + warnIfReactDOMContainerInDEV(container);
29398 + var isStrictMode = false;
29399 + var concurrentUpdatesByDefaultOverride = false;
29400 + var identifierPrefix = '';
29401 + var onRecoverableError = defaultOnRecoverableError;
29402 + var transitionCallbacks = null;
29403 +
29404 + if (options !== null && options !== undefined) {
29405 + {
29406 + if (options.hydrate) {
29407 + warn('hydrate through createRoot is deprecated. Use ReactDOMClient.hydrateRoot(container, <App />) instead.');
29408 + } else {
29409 + if (typeof options === 'object' && options !== null && options.$$typeof === REACT_ELEMENT_TYPE) {
29410 + error('You passed a JSX element to createRoot. You probably meant to ' + 'call root.render instead. ' + 'Example usage:\n\n' + ' let root = createRoot(domContainer);\n' + ' root.render(<App />);');
29411 + }
29412 + }
29413 + }
29414 +
29415 + if (options.unstable_strictMode === true) {
29416 + isStrictMode = true;
29417 + }
29418 +
29419 + if (options.identifierPrefix !== undefined) {
29420 + identifierPrefix = options.identifierPrefix;
29421 + }
29422 +
29423 + if (options.onRecoverableError !== undefined) {
29424 + onRecoverableError = options.onRecoverableError;
29425 + }
29426 +
29427 + if (options.transitionCallbacks !== undefined) {
29428 + transitionCallbacks = options.transitionCallbacks;
29429 + }
29430 + }
29431 +
29432 + var root = createContainer(container, ConcurrentRoot, null, isStrictMode, concurrentUpdatesByDefaultOverride, identifierPrefix, onRecoverableError);
29433 + markContainerAsRoot(root.current, container);
29434 + var rootContainerElement = container.nodeType === COMMENT_NODE ? container.parentNode : container;
29435 + listenToAllSupportedEvents(rootContainerElement);
29436 + return new ReactDOMRoot(root);
29437 + }
29438 +
29439 + function ReactDOMHydrationRoot(internalRoot) {
29440 + this._internalRoot = internalRoot;
29441 + }
29442 +
29443 + function scheduleHydration(target) {
29444 + if (target) {
29445 + queueExplicitHydrationTarget(target);
29446 + }
29447 + }
29448 +
29449 + ReactDOMHydrationRoot.prototype.unstable_scheduleHydration = scheduleHydration;
29450 + function hydrateRoot(container, initialChildren, options) {
29451 + if (!isValidContainer(container)) {
29452 + throw new Error('hydrateRoot(...): Target container is not a DOM element.');
29453 + }
29454 +
29455 + warnIfReactDOMContainerInDEV(container);
29456 +
29457 + {
29458 + if (initialChildren === undefined) {
29459 + error('Must provide initial children as second argument to hydrateRoot. ' + 'Example usage: hydrateRoot(domContainer, <App />)');
29460 + }
29461 + } // For now we reuse the whole bag of options since they contain
29462 + // the hydration callbacks.
29463 +
29464 +
29465 + var hydrationCallbacks = options != null ? options : null; // TODO: Delete this option
29466 +
29467 + var mutableSources = options != null && options.hydratedSources || null;
29468 + var isStrictMode = false;
29469 + var concurrentUpdatesByDefaultOverride = false;
29470 + var identifierPrefix = '';
29471 + var onRecoverableError = defaultOnRecoverableError;
29472 +
29473 + if (options !== null && options !== undefined) {
29474 + if (options.unstable_strictMode === true) {
29475 + isStrictMode = true;
29476 + }
29477 +
29478 + if (options.identifierPrefix !== undefined) {
29479 + identifierPrefix = options.identifierPrefix;
29480 + }
29481 +
29482 + if (options.onRecoverableError !== undefined) {
29483 + onRecoverableError = options.onRecoverableError;
29484 + }
29485 + }
29486 +
29487 + var root = createHydrationContainer(initialChildren, null, container, ConcurrentRoot, hydrationCallbacks, isStrictMode, concurrentUpdatesByDefaultOverride, identifierPrefix, onRecoverableError);
29488 + markContainerAsRoot(root.current, container); // This can't be a comment node since hydration doesn't work on comment nodes anyway.
29489 +
29490 + listenToAllSupportedEvents(container);
29491 +
29492 + if (mutableSources) {
29493 + for (var i = 0; i < mutableSources.length; i++) {
29494 + var mutableSource = mutableSources[i];
29495 + registerMutableSourceForHydration(root, mutableSource);
29496 + }
29497 + }
29498 +
29499 + return new ReactDOMHydrationRoot(root);
29500 + }
29501 + function isValidContainer(node) {
29502 + return !!(node && (node.nodeType === ELEMENT_NODE || node.nodeType === DOCUMENT_NODE || node.nodeType === DOCUMENT_FRAGMENT_NODE || !disableCommentsAsDOMContainers ));
29503 + } // TODO: Remove this function which also includes comment nodes.
29504 + // We only use it in places that are currently more relaxed.
29505 +
29506 + function isValidContainerLegacy(node) {
29507 + return !!(node && (node.nodeType === ELEMENT_NODE || node.nodeType === DOCUMENT_NODE || node.nodeType === DOCUMENT_FRAGMENT_NODE || node.nodeType === COMMENT_NODE && node.nodeValue === ' react-mount-point-unstable '));
29508 + }
29509 +
29510 + function warnIfReactDOMContainerInDEV(container) {
29511 + {
29512 + if (container.nodeType === ELEMENT_NODE && container.tagName && container.tagName.toUpperCase() === 'BODY') {
29513 + error('createRoot(): Creating roots directly with document.body is ' + 'discouraged, since its children are often manipulated by third-party ' + 'scripts and browser extensions. This may lead to subtle ' + 'reconciliation issues. Try using a container element created ' + 'for your app.');
29514 + }
29515 +
29516 + if (isContainerMarkedAsRoot(container)) {
29517 + if (container._reactRootContainer) {
29518 + error('You are calling ReactDOMClient.createRoot() on a container that was previously ' + 'passed to ReactDOM.render(). This is not supported.');
29519 + } else {
29520 + error('You are calling ReactDOMClient.createRoot() on a container that ' + 'has already been passed to createRoot() before. Instead, call ' + 'root.render() on the existing root instead if you want to update it.');
29521 + }
29522 + }
29523 + }
29524 + }
29525 +
29526 + var ReactCurrentOwner$3 = ReactSharedInternals.ReactCurrentOwner;
29527 + var topLevelUpdateWarnings;
29528 +
29529 + {
29530 + topLevelUpdateWarnings = function (container) {
29531 + if (container._reactRootContainer && container.nodeType !== COMMENT_NODE) {
29532 + var hostInstance = findHostInstanceWithNoPortals(container._reactRootContainer.current);
29533 +
29534 + if (hostInstance) {
29535 + if (hostInstance.parentNode !== container) {
29536 + error('render(...): It looks like the React-rendered content of this ' + 'container was removed without using React. This is not ' + 'supported and will cause errors. Instead, call ' + 'ReactDOM.unmountComponentAtNode to empty a container.');
29537 + }
29538 + }
29539 + }
29540 +
29541 + var isRootRenderedBySomeReact = !!container._reactRootContainer;
29542 + var rootEl = getReactRootElementInContainer(container);
29543 + var hasNonRootReactChild = !!(rootEl && getInstanceFromNode(rootEl));
29544 +
29545 + if (hasNonRootReactChild && !isRootRenderedBySomeReact) {
29546 + error('render(...): Replacing React-rendered children with a new root ' + 'component. If you intended to update the children of this node, ' + 'you should instead have the existing children update their state ' + 'and render the new components instead of calling ReactDOM.render.');
29547 + }
29548 +
29549 + if (container.nodeType === ELEMENT_NODE && container.tagName && container.tagName.toUpperCase() === 'BODY') {
29550 + error('render(): Rendering components directly into document.body is ' + 'discouraged, since its children are often manipulated by third-party ' + 'scripts and browser extensions. This may lead to subtle ' + 'reconciliation issues. Try rendering into a container element created ' + 'for your app.');
29551 + }
29552 + };
29553 + }
29554 +
29555 + function getReactRootElementInContainer(container) {
29556 + if (!container) {
29557 + return null;
29558 + }
29559 +
29560 + if (container.nodeType === DOCUMENT_NODE) {
29561 + return container.documentElement;
29562 + } else {
29563 + return container.firstChild;
29564 + }
29565 + }
29566 +
29567 + function noopOnRecoverableError() {// This isn't reachable because onRecoverableError isn't called in the
29568 + // legacy API.
29569 + }
29570 +
29571 + function legacyCreateRootFromDOMContainer(container, initialChildren, parentComponent, callback, isHydrationContainer) {
29572 + if (isHydrationContainer) {
29573 + if (typeof callback === 'function') {
29574 + var originalCallback = callback;
29575 +
29576 + callback = function () {
29577 + var instance = getPublicRootInstance(root);
29578 + originalCallback.call(instance);
29579 + };
29580 + }
29581 +
29582 + var root = createHydrationContainer(initialChildren, callback, container, LegacyRoot, null, // hydrationCallbacks
29583 + false, // isStrictMode
29584 + false, // concurrentUpdatesByDefaultOverride,
29585 + '', // identifierPrefix
29586 + noopOnRecoverableError);
29587 + container._reactRootContainer = root;
29588 + markContainerAsRoot(root.current, container);
29589 + var rootContainerElement = container.nodeType === COMMENT_NODE ? container.parentNode : container;
29590 + listenToAllSupportedEvents(rootContainerElement);
29591 + flushSync();
29592 + return root;
29593 + } else {
29594 + // First clear any existing content.
29595 + var rootSibling;
29596 +
29597 + while (rootSibling = container.lastChild) {
29598 + container.removeChild(rootSibling);
29599 + }
29600 +
29601 + if (typeof callback === 'function') {
29602 + var _originalCallback = callback;
29603 +
29604 + callback = function () {
29605 + var instance = getPublicRootInstance(_root);
29606 +
29607 + _originalCallback.call(instance);
29608 + };
29609 + }
29610 +
29611 + var _root = createContainer(container, LegacyRoot, null, // hydrationCallbacks
29612 + false, // isStrictMode
29613 + false, // concurrentUpdatesByDefaultOverride,
29614 + '', // identifierPrefix
29615 + noopOnRecoverableError);
29616 +
29617 + container._reactRootContainer = _root;
29618 + markContainerAsRoot(_root.current, container);
29619 +
29620 + var _rootContainerElement = container.nodeType === COMMENT_NODE ? container.parentNode : container;
29621 +
29622 + listenToAllSupportedEvents(_rootContainerElement); // Initial mount should not be batched.
29623 +
29624 + flushSync(function () {
29625 + updateContainer(initialChildren, _root, parentComponent, callback);
29626 + });
29627 + return _root;
29628 + }
29629 + }
29630 +
29631 + function warnOnInvalidCallback$1(callback, callerName) {
29632 + {
29633 + if (callback !== null && typeof callback !== 'function') {
29634 + error('%s(...): Expected the last optional `callback` argument to be a ' + 'function. Instead received: %s.', callerName, callback);
29635 + }
29636 + }
29637 + }
29638 +
29639 + function legacyRenderSubtreeIntoContainer(parentComponent, children, container, forceHydrate, callback) {
29640 + {
29641 + topLevelUpdateWarnings(container);
29642 + warnOnInvalidCallback$1(callback === undefined ? null : callback, 'render');
29643 + }
29644 +
29645 + var maybeRoot = container._reactRootContainer;
29646 + var root;
29647 +
29648 + if (!maybeRoot) {
29649 + // Initial mount
29650 + root = legacyCreateRootFromDOMContainer(container, children, parentComponent, callback, forceHydrate);
29651 + } else {
29652 + root = maybeRoot;
29653 +
29654 + if (typeof callback === 'function') {
29655 + var originalCallback = callback;
29656 +
29657 + callback = function () {
29658 + var instance = getPublicRootInstance(root);
29659 + originalCallback.call(instance);
29660 + };
29661 + } // Update
29662 +
29663 +
29664 + updateContainer(children, root, parentComponent, callback);
29665 + }
29666 +
29667 + return getPublicRootInstance(root);
29668 + }
29669 +
29670 + var didWarnAboutFindDOMNode = false;
29671 + function findDOMNode(componentOrElement) {
29672 + {
29673 + if (!didWarnAboutFindDOMNode) {
29674 + didWarnAboutFindDOMNode = true;
29675 +
29676 + error('findDOMNode is deprecated and will be removed in the next major ' + 'release. Instead, add a ref directly to the element you want ' + 'to reference. Learn more about using refs safely here: ' + 'https://reactjs.org/link/strict-mode-find-node');
29677 + }
29678 +
29679 + var owner = ReactCurrentOwner$3.current;
29680 +
29681 + if (owner !== null && owner.stateNode !== null) {
29682 + var warnedAboutRefsInRender = owner.stateNode._warnedAboutRefsInRender;
29683 +
29684 + if (!warnedAboutRefsInRender) {
29685 + error('%s is accessing findDOMNode inside its render(). ' + 'render() should be a pure function of props and state. It should ' + 'never access something that requires stale data from the previous ' + 'render, such as refs. Move this logic to componentDidMount and ' + 'componentDidUpdate instead.', getComponentNameFromType(owner.type) || 'A component');
29686 + }
29687 +
29688 + owner.stateNode._warnedAboutRefsInRender = true;
29689 + }
29690 + }
29691 +
29692 + if (componentOrElement == null) {
29693 + return null;
29694 + }
29695 +
29696 + if (componentOrElement.nodeType === ELEMENT_NODE) {
29697 + return componentOrElement;
29698 + }
29699 +
29700 + {
29701 + return findHostInstanceWithWarning(componentOrElement, 'findDOMNode');
29702 + }
29703 + }
29704 + function hydrate(element, container, callback) {
29705 + {
29706 + error('ReactDOM.hydrate is no longer supported in React 18. Use hydrateRoot ' + 'instead. Until you switch to the new API, your app will behave as ' + "if it's running React 17. Learn " + 'more: https://reactjs.org/link/switch-to-createroot');
29707 + }
29708 +
29709 + if (!isValidContainerLegacy(container)) {
29710 + throw new Error('Target container is not a DOM element.');
29711 + }
29712 +
29713 + {
29714 + var isModernRoot = isContainerMarkedAsRoot(container) && container._reactRootContainer === undefined;
29715 +
29716 + if (isModernRoot) {
29717 + error('You are calling ReactDOM.hydrate() on a container that was previously ' + 'passed to ReactDOMClient.createRoot(). This is not supported. ' + 'Did you mean to call hydrateRoot(container, element)?');
29718 + }
29719 + } // TODO: throw or warn if we couldn't hydrate?
29720 +
29721 +
29722 + return legacyRenderSubtreeIntoContainer(null, element, container, true, callback);
29723 + }
29724 + function render(element, container, callback) {
29725 + {
29726 + error('ReactDOM.render is no longer supported in React 18. Use createRoot ' + 'instead. Until you switch to the new API, your app will behave as ' + "if it's running React 17. Learn " + 'more: https://reactjs.org/link/switch-to-createroot');
29727 + }
29728 +
29729 + if (!isValidContainerLegacy(container)) {
29730 + throw new Error('Target container is not a DOM element.');
29731 + }
29732 +
29733 + {
29734 + var isModernRoot = isContainerMarkedAsRoot(container) && container._reactRootContainer === undefined;
29735 +
29736 + if (isModernRoot) {
29737 + error('You are calling ReactDOM.render() on a container that was previously ' + 'passed to ReactDOMClient.createRoot(). This is not supported. ' + 'Did you mean to call root.render(element)?');
29738 + }
29739 + }
29740 +
29741 + return legacyRenderSubtreeIntoContainer(null, element, container, false, callback);
29742 + }
29743 + function unstable_renderSubtreeIntoContainer(parentComponent, element, containerNode, callback) {
29744 + {
29745 + error('ReactDOM.unstable_renderSubtreeIntoContainer() is no longer supported ' + 'in React 18. Consider using a portal instead. Until you switch to ' + "the createRoot API, your app will behave as if it's running React " + '17. Learn more: https://reactjs.org/link/switch-to-createroot');
29746 + }
29747 +
29748 + if (!isValidContainerLegacy(containerNode)) {
29749 + throw new Error('Target container is not a DOM element.');
29750 + }
29751 +
29752 + if (parentComponent == null || !has(parentComponent)) {
29753 + throw new Error('parentComponent must be a valid React Component');
29754 + }
29755 +
29756 + return legacyRenderSubtreeIntoContainer(parentComponent, element, containerNode, false, callback);
29757 + }
29758 + var didWarnAboutUnmountComponentAtNode = false;
29759 + function unmountComponentAtNode(container) {
29760 + {
29761 + if (!didWarnAboutUnmountComponentAtNode) {
29762 + didWarnAboutUnmountComponentAtNode = true;
29763 +
29764 + error('unmountComponentAtNode is deprecated and will be removed in the ' + 'next major release. Switch to the createRoot API. Learn ' + 'more: https://reactjs.org/link/switch-to-createroot');
29765 + }
29766 + }
29767 +
29768 + if (!isValidContainerLegacy(container)) {
29769 + throw new Error('unmountComponentAtNode(...): Target container is not a DOM element.');
29770 + }
29771 +
29772 + {
29773 + var isModernRoot = isContainerMarkedAsRoot(container) && container._reactRootContainer === undefined;
29774 +
29775 + if (isModernRoot) {
29776 + error('You are calling ReactDOM.unmountComponentAtNode() on a container that was previously ' + 'passed to ReactDOMClient.createRoot(). This is not supported. Did you mean to call root.unmount()?');
29777 + }
29778 + }
29779 +
29780 + if (container._reactRootContainer) {
29781 + {
29782 + var rootEl = getReactRootElementInContainer(container);
29783 + var renderedByDifferentReact = rootEl && !getInstanceFromNode(rootEl);
29784 +
29785 + if (renderedByDifferentReact) {
29786 + error("unmountComponentAtNode(): The node you're attempting to unmount " + 'was rendered by another copy of React.');
29787 + }
29788 + } // Unmount should not be batched.
29789 +
29790 +
29791 + flushSync(function () {
29792 + legacyRenderSubtreeIntoContainer(null, null, container, false, function () {
29793 + // $FlowFixMe This should probably use `delete container._reactRootContainer`
29794 + container._reactRootContainer = null;
29795 + unmarkContainerAsRoot(container);
29796 + });
29797 + }); // If you call unmountComponentAtNode twice in quick succession, you'll
29798 + // get `true` twice. That's probably fine?
29799 +
29800 + return true;
29801 + } else {
29802 + {
29803 + var _rootEl = getReactRootElementInContainer(container);
29804 +
29805 + var hasNonRootReactChild = !!(_rootEl && getInstanceFromNode(_rootEl)); // Check if the container itself is a React root node.
29806 +
29807 + var isContainerReactRoot = container.nodeType === ELEMENT_NODE && isValidContainerLegacy(container.parentNode) && !!container.parentNode._reactRootContainer;
29808 +
29809 + if (hasNonRootReactChild) {
29810 + error("unmountComponentAtNode(): The node you're attempting to unmount " + 'was rendered by React and is not a top-level container. %s', isContainerReactRoot ? 'You may have accidentally passed in a React root node instead ' + 'of its container.' : 'Instead, have the parent component update its state and ' + 'rerender in order to remove this component.');
29811 + }
29812 + }
29813 +
29814 + return false;
29815 + }
29816 + }
29817 +
29818 + setAttemptSynchronousHydration(attemptSynchronousHydration$1);
29819 + setAttemptContinuousHydration(attemptContinuousHydration$1);
29820 + setAttemptHydrationAtCurrentPriority(attemptHydrationAtCurrentPriority$1);
29821 + setGetCurrentUpdatePriority(getCurrentUpdatePriority);
29822 + setAttemptHydrationAtPriority(runWithPriority);
29823 +
29824 + {
29825 + if (typeof Map !== 'function' || // $FlowIssue Flow incorrectly thinks Map has no prototype
29826 + Map.prototype == null || typeof Map.prototype.forEach !== 'function' || typeof Set !== 'function' || // $FlowIssue Flow incorrectly thinks Set has no prototype
29827 + Set.prototype == null || typeof Set.prototype.clear !== 'function' || typeof Set.prototype.forEach !== 'function') {
29828 + error('React depends on Map and Set built-in types. Make sure that you load a ' + 'polyfill in older browsers. https://reactjs.org/link/react-polyfills');
29829 + }
29830 + }
29831 +
29832 + setRestoreImplementation(restoreControlledState$3);
29833 + setBatchingImplementation(batchedUpdates$1, discreteUpdates, flushSync);
29834 +
29835 + function createPortal$1(children, container) {
29836 + var key = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null;
29837 +
29838 + if (!isValidContainer(container)) {
29839 + throw new Error('Target container is not a DOM element.');
29840 + } // TODO: pass ReactDOM portal implementation as third argument
29841 + // $FlowFixMe The Flow type is opaque but there's no way to actually create it.
29842 +
29843 +
29844 + return createPortal(children, container, null, key);
29845 + }
29846 +
29847 + function renderSubtreeIntoContainer(parentComponent, element, containerNode, callback) {
29848 + return unstable_renderSubtreeIntoContainer(parentComponent, element, containerNode, callback);
29849 + }
29850 +
29851 + var Internals = {
29852 + usingClientEntryPoint: false,
29853 + // Keep in sync with ReactTestUtils.js.
29854 + // This is an array for better minification.
29855 + Events: [getInstanceFromNode, getNodeFromInstance, getFiberCurrentPropsFromNode, enqueueStateRestore, restoreStateIfNeeded, batchedUpdates$1]
29856 + };
29857 +
29858 + function createRoot$1(container, options) {
29859 + {
29860 + if (!Internals.usingClientEntryPoint && !true) {
29861 + error('You are importing createRoot from "react-dom" which is not supported. ' + 'You should instead import it from "react-dom/client".');
29862 + }
29863 + }
29864 +
29865 + return createRoot(container, options);
29866 + }
29867 +
29868 + function hydrateRoot$1(container, initialChildren, options) {
29869 + {
29870 + if (!Internals.usingClientEntryPoint && !true) {
29871 + error('You are importing hydrateRoot from "react-dom" which is not supported. ' + 'You should instead import it from "react-dom/client".');
29872 + }
29873 + }
29874 +
29875 + return hydrateRoot(container, initialChildren, options);
29876 + } // Overload the definition to the two valid signatures.
29877 + // Warning, this opts-out of checking the function body.
29878 +
29879 +
29880 + // eslint-disable-next-line no-redeclare
29881 + function flushSync$1(fn) {
29882 + {
29883 + if (isAlreadyRendering()) {
29884 + error('flushSync was called from inside a lifecycle method. React cannot ' + 'flush when React is already rendering. Consider moving this call to ' + 'a scheduler task or micro task.');
29885 + }
29886 + }
29887 +
29888 + return flushSync(fn);
29889 + }
29890 + var foundDevTools = injectIntoDevTools({
29891 + findFiberByHostInstance: getClosestInstanceFromNode,
29892 + bundleType: 1 ,
29893 + version: ReactVersion,
29894 + rendererPackageName: 'react-dom'
29895 + });
29896 +
29897 + {
29898 + if (!foundDevTools && canUseDOM && window.top === window.self) {
29899 + // If we're in Chrome or Firefox, provide a download link if not installed.
29900 + if (navigator.userAgent.indexOf('Chrome') > -1 && navigator.userAgent.indexOf('Edge') === -1 || navigator.userAgent.indexOf('Firefox') > -1) {
29901 + var protocol = window.location.protocol; // Don't warn in exotic cases like chrome-extension://.
29902 +
29903 + if (/^(https?|file):$/.test(protocol)) {
29904 + // eslint-disable-next-line react-internal/no-production-logging
29905 + console.info('%cDownload the React DevTools ' + 'for a better development experience: ' + 'https://reactjs.org/link/react-devtools' + (protocol === 'file:' ? '\nYou might need to use a local HTTP server (instead of file://): ' + 'https://reactjs.org/link/react-devtools-faq' : ''), 'font-weight:bold');
29906 + }
29907 + }
29908 + }
29909 + }
29910 +
29911 + exports.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED = Internals;
29912 + exports.createPortal = createPortal$1;
29913 + exports.createRoot = createRoot$1;
29914 + exports.findDOMNode = findDOMNode;
29915 + exports.flushSync = flushSync$1;
29916 + exports.hydrate = hydrate;
29917 + exports.hydrateRoot = hydrateRoot$1;
29918 + exports.render = render;
29919 + exports.unmountComponentAtNode = unmountComponentAtNode;
29920 + exports.unstable_batchedUpdates = batchedUpdates$1;
29921 + exports.unstable_renderSubtreeIntoContainer = renderSubtreeIntoContainer;
29922 + exports.version = ReactVersion;
29923 +
29924 + })));
29925 +