@mathwiz/ui-components 0.1.4 → 0.1.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (39) hide show
  1. package/README.md +35 -1
  2. package/dist/components/MathWizHeader/MathWizHeader.d.ts.map +1 -1
  3. package/dist/components/MathWizHeader/MathWizHeader.types.d.ts +15 -0
  4. package/dist/components/MathWizHeader/MathWizHeader.types.d.ts.map +1 -1
  5. package/dist/config/index.d.ts +4 -0
  6. package/dist/config/index.d.ts.map +1 -0
  7. package/dist/config/types.d.ts +117 -0
  8. package/dist/config/types.d.ts.map +1 -0
  9. package/dist/config/utils.d.ts +72 -0
  10. package/dist/config/utils.d.ts.map +1 -0
  11. package/dist/data-sources/api-data-source.d.ts +35 -0
  12. package/dist/data-sources/api-data-source.d.ts.map +1 -0
  13. package/dist/data-sources/custom-data-source.d.ts +59 -0
  14. package/dist/data-sources/custom-data-source.d.ts.map +1 -0
  15. package/dist/data-sources/factory.d.ts +61 -0
  16. package/dist/data-sources/factory.d.ts.map +1 -0
  17. package/dist/data-sources/index.d.ts +7 -0
  18. package/dist/data-sources/index.d.ts.map +1 -0
  19. package/dist/data-sources/mock-data-source.d.ts +44 -0
  20. package/dist/data-sources/mock-data-source.d.ts.map +1 -0
  21. package/dist/data-sources/types.d.ts +119 -0
  22. package/dist/data-sources/types.d.ts.map +1 -0
  23. package/dist/demo/configurable-demo.d.ts +4 -0
  24. package/dist/demo/configurable-demo.d.ts.map +1 -0
  25. package/dist/index.cjs +22 -21
  26. package/dist/index.cjs.map +1 -1
  27. package/dist/index.d.ts +1 -0
  28. package/dist/index.d.ts.map +1 -1
  29. package/dist/index.mjs +2051 -1564
  30. package/dist/index.mjs.map +1 -1
  31. package/dist/mocks/handlers.d.ts.map +1 -1
  32. package/dist/pages/GradeUnitBrowserPage/GradeUnitBrowserContext.d.ts +2 -4
  33. package/dist/pages/GradeUnitBrowserPage/GradeUnitBrowserContext.d.ts.map +1 -1
  34. package/dist/pages/GradeUnitBrowserPage/GradeUnitBrowserPage.d.ts.map +1 -1
  35. package/dist/pages/GradeUnitBrowserPage/types.d.ts +10 -0
  36. package/dist/pages/GradeUnitBrowserPage/types.d.ts.map +1 -1
  37. package/dist/services/courseService.d.ts.map +1 -1
  38. package/package.json +2 -1
  39. package/dist/ui-components.css +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","sources":["../node_modules/react/cjs/react-jsx-runtime.production.min.js","../node_modules/react/cjs/react-jsx-runtime.development.js","../node_modules/react/jsx-runtime.js","../src/components/Button/Button.tsx","../node_modules/lucide-react/dist/esm/shared/src/utils.js","../node_modules/lucide-react/dist/esm/defaultAttributes.js","../node_modules/lucide-react/dist/esm/Icon.js","../node_modules/lucide-react/dist/esm/createLucideIcon.js","../node_modules/lucide-react/dist/esm/icons/arrow-right.js","../node_modules/lucide-react/dist/esm/icons/chevron-down.js","../node_modules/lucide-react/dist/esm/icons/chevron-right.js","../src/components/ContentAccordion/types.ts","../src/components/ContentAccordion/ContentAccordion.tsx","../src/components/Sidebar/types.ts","../src/components/Sidebar/Sidebar.tsx","../src/components/Submenu/Submenu.tsx","../node_modules/axios/lib/helpers/bind.js","../node_modules/axios/lib/utils.js","../node_modules/axios/lib/core/AxiosError.js","../node_modules/axios/lib/helpers/null.js","../node_modules/axios/lib/helpers/toFormData.js","../node_modules/axios/lib/helpers/AxiosURLSearchParams.js","../node_modules/axios/lib/helpers/buildURL.js","../node_modules/axios/lib/core/InterceptorManager.js","../node_modules/axios/lib/defaults/transitional.js","../node_modules/axios/lib/platform/browser/index.js","../node_modules/axios/lib/platform/browser/classes/URLSearchParams.js","../node_modules/axios/lib/platform/browser/classes/FormData.js","../node_modules/axios/lib/platform/browser/classes/Blob.js","../node_modules/axios/lib/platform/common/utils.js","../node_modules/axios/lib/platform/index.js","../node_modules/axios/lib/helpers/toURLEncodedForm.js","../node_modules/axios/lib/helpers/formDataToJSON.js","../node_modules/axios/lib/defaults/index.js","../node_modules/axios/lib/helpers/parseHeaders.js","../node_modules/axios/lib/core/AxiosHeaders.js","../node_modules/axios/lib/core/transformData.js","../node_modules/axios/lib/cancel/isCancel.js","../node_modules/axios/lib/cancel/CanceledError.js","../node_modules/axios/lib/core/settle.js","../node_modules/axios/lib/helpers/parseProtocol.js","../node_modules/axios/lib/helpers/speedometer.js","../node_modules/axios/lib/helpers/throttle.js","../node_modules/axios/lib/helpers/progressEventReducer.js","../node_modules/axios/lib/helpers/isURLSameOrigin.js","../node_modules/axios/lib/helpers/cookies.js","../node_modules/axios/lib/helpers/isAbsoluteURL.js","../node_modules/axios/lib/helpers/combineURLs.js","../node_modules/axios/lib/core/buildFullPath.js","../node_modules/axios/lib/core/mergeConfig.js","../node_modules/axios/lib/helpers/resolveConfig.js","../node_modules/axios/lib/adapters/xhr.js","../node_modules/axios/lib/helpers/composeSignals.js","../node_modules/axios/lib/helpers/trackStream.js","../node_modules/axios/lib/adapters/fetch.js","../node_modules/axios/lib/adapters/adapters.js","../node_modules/axios/lib/core/dispatchRequest.js","../node_modules/axios/lib/env/data.js","../node_modules/axios/lib/helpers/validator.js","../node_modules/axios/lib/core/Axios.js","../node_modules/axios/lib/cancel/CancelToken.js","../node_modules/axios/lib/helpers/spread.js","../node_modules/axios/lib/helpers/isAxiosError.js","../node_modules/axios/lib/helpers/HttpStatusCode.js","../node_modules/axios/lib/axios.js","../node_modules/axios/index.js","../src/components/UserProfile/UserProfile.tsx","../src/components/MathWizHeader/MathWizHeader.tsx","../src/components/radarAbility/RadarChart/RadarChart.tsx","../node_modules/zustand/esm/vanilla.mjs","../node_modules/zustand/esm/react.mjs","../src/services/radarAbilityService.ts","../src/store/radarAbilityStore.ts","../src/components/radarAbility/AbilityProgressBar/AbilityProgressBar.tsx","../src/components/radarAbility/PersonalizedAdvicePanel/PersonalizedAdvicePanel.tsx","../src/components/radarAbility/RecommendationCard/RecommendationCard.tsx","../src/components/radarAbility/AbilityAssessmentDashboard/AbilityAssessmentDashboard.tsx","../src/types/index.ts","../src/data/mockData.ts","../src/services/courseService.ts","../src/data/courseData.ts","../src/pages/GradeUnitBrowserPage/GradeUnitBrowserContext.tsx","../src/pages/GradeUnitBrowserPage/GradeUnitBrowserPage.tsx","../src/utils/geometryCore.js","../src/data/userCourseProgress.ts","../src/data/usergradeuintsnav.ts","../src/data/usergradeunitsProgressData.ts"],"sourcesContent":["/**\n * @license React\n * react-jsx-runtime.production.min.js\n *\n * Copyright (c) Facebook, Inc. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n'use strict';var f=require(\"react\"),k=Symbol.for(\"react.element\"),l=Symbol.for(\"react.fragment\"),m=Object.prototype.hasOwnProperty,n=f.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.ReactCurrentOwner,p={key:!0,ref:!0,__self:!0,__source:!0};\nfunction q(c,a,g){var b,d={},e=null,h=null;void 0!==g&&(e=\"\"+g);void 0!==a.key&&(e=\"\"+a.key);void 0!==a.ref&&(h=a.ref);for(b in a)m.call(a,b)&&!p.hasOwnProperty(b)&&(d[b]=a[b]);if(c&&c.defaultProps)for(b in a=c.defaultProps,a)void 0===d[b]&&(d[b]=a[b]);return{$$typeof:k,type:c,key:e,ref:h,props:d,_owner:n.current}}exports.Fragment=l;exports.jsx=q;exports.jsxs=q;\n","/**\n * @license React\n * react-jsx-runtime.development.js\n *\n * Copyright (c) Facebook, Inc. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n'use strict';\n\nif (process.env.NODE_ENV !== \"production\") {\n (function() {\n'use strict';\n\nvar React = require('react');\n\n// ATTENTION\n// When adding new symbols to this file,\n// Please consider also adding to 'react-devtools-shared/src/backend/ReactSymbols'\n// The Symbol used to tag the ReactElement-like types.\nvar REACT_ELEMENT_TYPE = Symbol.for('react.element');\nvar REACT_PORTAL_TYPE = Symbol.for('react.portal');\nvar REACT_FRAGMENT_TYPE = Symbol.for('react.fragment');\nvar REACT_STRICT_MODE_TYPE = Symbol.for('react.strict_mode');\nvar REACT_PROFILER_TYPE = Symbol.for('react.profiler');\nvar REACT_PROVIDER_TYPE = Symbol.for('react.provider');\nvar REACT_CONTEXT_TYPE = Symbol.for('react.context');\nvar REACT_FORWARD_REF_TYPE = Symbol.for('react.forward_ref');\nvar REACT_SUSPENSE_TYPE = Symbol.for('react.suspense');\nvar REACT_SUSPENSE_LIST_TYPE = Symbol.for('react.suspense_list');\nvar REACT_MEMO_TYPE = Symbol.for('react.memo');\nvar REACT_LAZY_TYPE = Symbol.for('react.lazy');\nvar REACT_OFFSCREEN_TYPE = Symbol.for('react.offscreen');\nvar MAYBE_ITERATOR_SYMBOL = Symbol.iterator;\nvar FAUX_ITERATOR_SYMBOL = '@@iterator';\nfunction getIteratorFn(maybeIterable) {\n if (maybeIterable === null || typeof maybeIterable !== 'object') {\n return null;\n }\n\n var maybeIterator = MAYBE_ITERATOR_SYMBOL && maybeIterable[MAYBE_ITERATOR_SYMBOL] || maybeIterable[FAUX_ITERATOR_SYMBOL];\n\n if (typeof maybeIterator === 'function') {\n return maybeIterator;\n }\n\n return null;\n}\n\nvar ReactSharedInternals = React.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED;\n\nfunction error(format) {\n {\n {\n for (var _len2 = arguments.length, args = new Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) {\n args[_key2 - 1] = arguments[_key2];\n }\n\n printWarning('error', format, args);\n }\n }\n}\n\nfunction printWarning(level, format, args) {\n // When changing this logic, you might want to also\n // update consoleWithStackDev.www.js as well.\n {\n var ReactDebugCurrentFrame = ReactSharedInternals.ReactDebugCurrentFrame;\n var stack = ReactDebugCurrentFrame.getStackAddendum();\n\n if (stack !== '') {\n format += '%s';\n args = args.concat([stack]);\n } // eslint-disable-next-line react-internal/safe-string-coercion\n\n\n var argsWithFormat = args.map(function (item) {\n return String(item);\n }); // Careful: RN currently depends on this prefix\n\n argsWithFormat.unshift('Warning: ' + format); // We intentionally don't use spread (or .apply) directly because it\n // breaks IE9: https://github.com/facebook/react/issues/13610\n // eslint-disable-next-line react-internal/no-production-logging\n\n Function.prototype.apply.call(console[level], console, argsWithFormat);\n }\n}\n\n// -----------------------------------------------------------------------------\n\nvar enableScopeAPI = false; // Experimental Create Event Handle API.\nvar enableCacheElement = false;\nvar enableTransitionTracing = false; // No known bugs, but needs performance testing\n\nvar enableLegacyHidden = false; // Enables unstable_avoidThisFallback feature in Fiber\n// stuff. Intended to enable React core members to more easily debug scheduling\n// issues in DEV builds.\n\nvar enableDebugTracing = false; // Track which Fiber(s) schedule render work.\n\nvar REACT_MODULE_REFERENCE;\n\n{\n REACT_MODULE_REFERENCE = Symbol.for('react.module.reference');\n}\n\nfunction isValidElementType(type) {\n if (typeof type === 'string' || typeof type === 'function') {\n return true;\n } // Note: typeof might be other than 'symbol' or 'number' (e.g. if it's a polyfill).\n\n\n if (type === REACT_FRAGMENT_TYPE || type === REACT_PROFILER_TYPE || enableDebugTracing || type === REACT_STRICT_MODE_TYPE || type === REACT_SUSPENSE_TYPE || type === REACT_SUSPENSE_LIST_TYPE || enableLegacyHidden || type === REACT_OFFSCREEN_TYPE || enableScopeAPI || enableCacheElement || enableTransitionTracing ) {\n return true;\n }\n\n if (typeof type === 'object' && type !== null) {\n if (type.$$typeof === REACT_LAZY_TYPE || type.$$typeof === REACT_MEMO_TYPE || type.$$typeof === REACT_PROVIDER_TYPE || type.$$typeof === REACT_CONTEXT_TYPE || type.$$typeof === REACT_FORWARD_REF_TYPE || // This needs to include all possible module reference object\n // types supported by any Flight configuration anywhere since\n // we don't know which Flight build this will end up being used\n // with.\n type.$$typeof === REACT_MODULE_REFERENCE || type.getModuleId !== undefined) {\n return true;\n }\n }\n\n return false;\n}\n\nfunction getWrappedName(outerType, innerType, wrapperName) {\n var displayName = outerType.displayName;\n\n if (displayName) {\n return displayName;\n }\n\n var functionName = innerType.displayName || innerType.name || '';\n return functionName !== '' ? wrapperName + \"(\" + functionName + \")\" : wrapperName;\n} // Keep in sync with react-reconciler/getComponentNameFromFiber\n\n\nfunction getContextName(type) {\n return type.displayName || 'Context';\n} // Note that the reconciler package should generally prefer to use getComponentNameFromFiber() instead.\n\n\nfunction getComponentNameFromType(type) {\n if (type == null) {\n // Host root, text node or just invalid type.\n return null;\n }\n\n {\n if (typeof type.tag === 'number') {\n error('Received an unexpected object in getComponentNameFromType(). ' + 'This is likely a bug in React. Please file an issue.');\n }\n }\n\n if (typeof type === 'function') {\n return type.displayName || type.name || null;\n }\n\n if (typeof type === 'string') {\n return type;\n }\n\n switch (type) {\n case REACT_FRAGMENT_TYPE:\n return 'Fragment';\n\n case REACT_PORTAL_TYPE:\n return 'Portal';\n\n case REACT_PROFILER_TYPE:\n return 'Profiler';\n\n case REACT_STRICT_MODE_TYPE:\n return 'StrictMode';\n\n case REACT_SUSPENSE_TYPE:\n return 'Suspense';\n\n case REACT_SUSPENSE_LIST_TYPE:\n return 'SuspenseList';\n\n }\n\n if (typeof type === 'object') {\n switch (type.$$typeof) {\n case REACT_CONTEXT_TYPE:\n var context = type;\n return getContextName(context) + '.Consumer';\n\n case REACT_PROVIDER_TYPE:\n var provider = type;\n return getContextName(provider._context) + '.Provider';\n\n case REACT_FORWARD_REF_TYPE:\n return getWrappedName(type, type.render, 'ForwardRef');\n\n case REACT_MEMO_TYPE:\n var outerName = type.displayName || null;\n\n if (outerName !== null) {\n return outerName;\n }\n\n return getComponentNameFromType(type.type) || 'Memo';\n\n case REACT_LAZY_TYPE:\n {\n var lazyComponent = type;\n var payload = lazyComponent._payload;\n var init = lazyComponent._init;\n\n try {\n return getComponentNameFromType(init(payload));\n } catch (x) {\n return null;\n }\n }\n\n // eslint-disable-next-line no-fallthrough\n }\n }\n\n return null;\n}\n\nvar assign = Object.assign;\n\n// Helpers to patch console.logs to avoid logging during side-effect free\n// replaying on render function. This currently only patches the object\n// lazily which won't cover if the log function was extracted eagerly.\n// We could also eagerly patch the method.\nvar disabledDepth = 0;\nvar prevLog;\nvar prevInfo;\nvar prevWarn;\nvar prevError;\nvar prevGroup;\nvar prevGroupCollapsed;\nvar prevGroupEnd;\n\nfunction disabledLog() {}\n\ndisabledLog.__reactDisabledLog = true;\nfunction disableLogs() {\n {\n if (disabledDepth === 0) {\n /* eslint-disable react-internal/no-production-logging */\n prevLog = console.log;\n prevInfo = console.info;\n prevWarn = console.warn;\n prevError = console.error;\n prevGroup = console.group;\n prevGroupCollapsed = console.groupCollapsed;\n prevGroupEnd = console.groupEnd; // https://github.com/facebook/react/issues/19099\n\n var props = {\n configurable: true,\n enumerable: true,\n value: disabledLog,\n writable: true\n }; // $FlowFixMe Flow thinks console is immutable.\n\n Object.defineProperties(console, {\n info: props,\n log: props,\n warn: props,\n error: props,\n group: props,\n groupCollapsed: props,\n groupEnd: props\n });\n /* eslint-enable react-internal/no-production-logging */\n }\n\n disabledDepth++;\n }\n}\nfunction reenableLogs() {\n {\n disabledDepth--;\n\n if (disabledDepth === 0) {\n /* eslint-disable react-internal/no-production-logging */\n var props = {\n configurable: true,\n enumerable: true,\n writable: true\n }; // $FlowFixMe Flow thinks console is immutable.\n\n Object.defineProperties(console, {\n log: assign({}, props, {\n value: prevLog\n }),\n info: assign({}, props, {\n value: prevInfo\n }),\n warn: assign({}, props, {\n value: prevWarn\n }),\n error: assign({}, props, {\n value: prevError\n }),\n group: assign({}, props, {\n value: prevGroup\n }),\n groupCollapsed: assign({}, props, {\n value: prevGroupCollapsed\n }),\n groupEnd: assign({}, props, {\n value: prevGroupEnd\n })\n });\n /* eslint-enable react-internal/no-production-logging */\n }\n\n if (disabledDepth < 0) {\n error('disabledDepth fell below zero. ' + 'This is a bug in React. Please file an issue.');\n }\n }\n}\n\nvar ReactCurrentDispatcher = ReactSharedInternals.ReactCurrentDispatcher;\nvar prefix;\nfunction describeBuiltInComponentFrame(name, source, ownerFn) {\n {\n if (prefix === undefined) {\n // Extract the VM specific prefix used by each line.\n try {\n throw Error();\n } catch (x) {\n var match = x.stack.trim().match(/\\n( *(at )?)/);\n prefix = match && match[1] || '';\n }\n } // We use the prefix to ensure our stacks line up with native stack frames.\n\n\n return '\\n' + prefix + name;\n }\n}\nvar reentry = false;\nvar componentFrameCache;\n\n{\n var PossiblyWeakMap = typeof WeakMap === 'function' ? WeakMap : Map;\n componentFrameCache = new PossiblyWeakMap();\n}\n\nfunction describeNativeComponentFrame(fn, construct) {\n // If something asked for a stack inside a fake render, it should get ignored.\n if ( !fn || reentry) {\n return '';\n }\n\n {\n var frame = componentFrameCache.get(fn);\n\n if (frame !== undefined) {\n return frame;\n }\n }\n\n var control;\n reentry = true;\n var previousPrepareStackTrace = Error.prepareStackTrace; // $FlowFixMe It does accept undefined.\n\n Error.prepareStackTrace = undefined;\n var previousDispatcher;\n\n {\n previousDispatcher = ReactCurrentDispatcher.current; // Set the dispatcher in DEV because this might be call in the render function\n // for warnings.\n\n ReactCurrentDispatcher.current = null;\n disableLogs();\n }\n\n try {\n // This should throw.\n if (construct) {\n // Something should be setting the props in the constructor.\n var Fake = function () {\n throw Error();\n }; // $FlowFixMe\n\n\n Object.defineProperty(Fake.prototype, 'props', {\n set: function () {\n // We use a throwing setter instead of frozen or non-writable props\n // because that won't throw in a non-strict mode function.\n throw Error();\n }\n });\n\n if (typeof Reflect === 'object' && Reflect.construct) {\n // We construct a different control for this case to include any extra\n // frames added by the construct call.\n try {\n Reflect.construct(Fake, []);\n } catch (x) {\n control = x;\n }\n\n Reflect.construct(fn, [], Fake);\n } else {\n try {\n Fake.call();\n } catch (x) {\n control = x;\n }\n\n fn.call(Fake.prototype);\n }\n } else {\n try {\n throw Error();\n } catch (x) {\n control = x;\n }\n\n fn();\n }\n } catch (sample) {\n // This is inlined manually because closure doesn't do it for us.\n if (sample && control && typeof sample.stack === 'string') {\n // This extracts the first frame from the sample that isn't also in the control.\n // Skipping one frame that we assume is the frame that calls the two.\n var sampleLines = sample.stack.split('\\n');\n var controlLines = control.stack.split('\\n');\n var s = sampleLines.length - 1;\n var c = controlLines.length - 1;\n\n while (s >= 1 && c >= 0 && sampleLines[s] !== controlLines[c]) {\n // We expect at least one stack frame to be shared.\n // Typically this will be the root most one. However, stack frames may be\n // cut off due to maximum stack limits. In this case, one maybe cut off\n // earlier than the other. We assume that the sample is longer or the same\n // and there for cut off earlier. So we should find the root most frame in\n // the sample somewhere in the control.\n c--;\n }\n\n for (; s >= 1 && c >= 0; s--, c--) {\n // Next we find the first one that isn't the same which should be the\n // frame that called our sample function and the control.\n if (sampleLines[s] !== controlLines[c]) {\n // In V8, the first line is describing the message but other VMs don't.\n // If we're about to return the first line, and the control is also on the same\n // line, that's a pretty good indicator that our sample threw at same line as\n // the control. I.e. before we entered the sample frame. So we ignore this result.\n // This can happen if you passed a class to function component, or non-function.\n if (s !== 1 || c !== 1) {\n do {\n s--;\n c--; // We may still have similar intermediate frames from the construct call.\n // The next one that isn't the same should be our match though.\n\n if (c < 0 || sampleLines[s] !== controlLines[c]) {\n // V8 adds a \"new\" prefix for native classes. Let's remove it to make it prettier.\n var _frame = '\\n' + sampleLines[s].replace(' at new ', ' at '); // If our component frame is labeled \"<anonymous>\"\n // but we have a user-provided \"displayName\"\n // splice it in to make the stack more readable.\n\n\n if (fn.displayName && _frame.includes('<anonymous>')) {\n _frame = _frame.replace('<anonymous>', fn.displayName);\n }\n\n {\n if (typeof fn === 'function') {\n componentFrameCache.set(fn, _frame);\n }\n } // Return the line we found.\n\n\n return _frame;\n }\n } while (s >= 1 && c >= 0);\n }\n\n break;\n }\n }\n }\n } finally {\n reentry = false;\n\n {\n ReactCurrentDispatcher.current = previousDispatcher;\n reenableLogs();\n }\n\n Error.prepareStackTrace = previousPrepareStackTrace;\n } // Fallback to just using the name if we couldn't make it throw.\n\n\n var name = fn ? fn.displayName || fn.name : '';\n var syntheticFrame = name ? describeBuiltInComponentFrame(name) : '';\n\n {\n if (typeof fn === 'function') {\n componentFrameCache.set(fn, syntheticFrame);\n }\n }\n\n return syntheticFrame;\n}\nfunction describeFunctionComponentFrame(fn, source, ownerFn) {\n {\n return describeNativeComponentFrame(fn, false);\n }\n}\n\nfunction shouldConstruct(Component) {\n var prototype = Component.prototype;\n return !!(prototype && prototype.isReactComponent);\n}\n\nfunction describeUnknownElementTypeFrameInDEV(type, source, ownerFn) {\n\n if (type == null) {\n return '';\n }\n\n if (typeof type === 'function') {\n {\n return describeNativeComponentFrame(type, shouldConstruct(type));\n }\n }\n\n if (typeof type === 'string') {\n return describeBuiltInComponentFrame(type);\n }\n\n switch (type) {\n case REACT_SUSPENSE_TYPE:\n return describeBuiltInComponentFrame('Suspense');\n\n case REACT_SUSPENSE_LIST_TYPE:\n return describeBuiltInComponentFrame('SuspenseList');\n }\n\n if (typeof type === 'object') {\n switch (type.$$typeof) {\n case REACT_FORWARD_REF_TYPE:\n return describeFunctionComponentFrame(type.render);\n\n case REACT_MEMO_TYPE:\n // Memo may contain any component type so we recursively resolve it.\n return describeUnknownElementTypeFrameInDEV(type.type, source, ownerFn);\n\n case REACT_LAZY_TYPE:\n {\n var lazyComponent = type;\n var payload = lazyComponent._payload;\n var init = lazyComponent._init;\n\n try {\n // Lazy may contain any component type so we recursively resolve it.\n return describeUnknownElementTypeFrameInDEV(init(payload), source, ownerFn);\n } catch (x) {}\n }\n }\n }\n\n return '';\n}\n\nvar hasOwnProperty = Object.prototype.hasOwnProperty;\n\nvar loggedTypeFailures = {};\nvar ReactDebugCurrentFrame = ReactSharedInternals.ReactDebugCurrentFrame;\n\nfunction setCurrentlyValidatingElement(element) {\n {\n if (element) {\n var owner = element._owner;\n var stack = describeUnknownElementTypeFrameInDEV(element.type, element._source, owner ? owner.type : null);\n ReactDebugCurrentFrame.setExtraStackFrame(stack);\n } else {\n ReactDebugCurrentFrame.setExtraStackFrame(null);\n }\n }\n}\n\nfunction checkPropTypes(typeSpecs, values, location, componentName, element) {\n {\n // $FlowFixMe This is okay but Flow doesn't know it.\n var has = Function.call.bind(hasOwnProperty);\n\n for (var typeSpecName in typeSpecs) {\n if (has(typeSpecs, typeSpecName)) {\n var error$1 = void 0; // Prop type validation may throw. In case they do, we don't want to\n // fail the render phase where it didn't fail before. So we log it.\n // After these have been cleaned up, we'll let them throw.\n\n try {\n // This is intentionally an invariant that gets caught. It's the same\n // behavior as without this statement except with a better message.\n if (typeof typeSpecs[typeSpecName] !== 'function') {\n // eslint-disable-next-line react-internal/prod-error-codes\n 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`.');\n err.name = 'Invariant Violation';\n throw err;\n }\n\n error$1 = typeSpecs[typeSpecName](values, typeSpecName, componentName, location, null, 'SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED');\n } catch (ex) {\n error$1 = ex;\n }\n\n if (error$1 && !(error$1 instanceof Error)) {\n setCurrentlyValidatingElement(element);\n\n 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);\n\n setCurrentlyValidatingElement(null);\n }\n\n if (error$1 instanceof Error && !(error$1.message in loggedTypeFailures)) {\n // Only monitor this failure once because there tends to be a lot of the\n // same error.\n loggedTypeFailures[error$1.message] = true;\n setCurrentlyValidatingElement(element);\n\n error('Failed %s type: %s', location, error$1.message);\n\n setCurrentlyValidatingElement(null);\n }\n }\n }\n }\n}\n\nvar isArrayImpl = Array.isArray; // eslint-disable-next-line no-redeclare\n\nfunction isArray(a) {\n return isArrayImpl(a);\n}\n\n/*\n * The `'' + value` pattern (used in in perf-sensitive code) throws for Symbol\n * and Temporal.* types. See https://github.com/facebook/react/pull/22064.\n *\n * The functions in this module will throw an easier-to-understand,\n * easier-to-debug exception with a clear errors message message explaining the\n * problem. (Instead of a confusing exception thrown inside the implementation\n * of the `value` object).\n */\n// $FlowFixMe only called in DEV, so void return is not possible.\nfunction typeName(value) {\n {\n // toStringTag is needed for namespaced types like Temporal.Instant\n var hasToStringTag = typeof Symbol === 'function' && Symbol.toStringTag;\n var type = hasToStringTag && value[Symbol.toStringTag] || value.constructor.name || 'Object';\n return type;\n }\n} // $FlowFixMe only called in DEV, so void return is not possible.\n\n\nfunction willCoercionThrow(value) {\n {\n try {\n testStringCoercion(value);\n return false;\n } catch (e) {\n return true;\n }\n }\n}\n\nfunction testStringCoercion(value) {\n // If you ended up here by following an exception call stack, here's what's\n // happened: you supplied an object or symbol value to React (as a prop, key,\n // DOM attribute, CSS property, string ref, etc.) and when React tried to\n // coerce it to a string using `'' + value`, an exception was thrown.\n //\n // The most common types that will cause this exception are `Symbol` instances\n // and Temporal objects like `Temporal.Instant`. But any object that has a\n // `valueOf` or `[Symbol.toPrimitive]` method that throws will also cause this\n // exception. (Library authors do this to prevent users from using built-in\n // numeric operators like `+` or comparison operators like `>=` because custom\n // methods are needed to perform accurate arithmetic or comparison.)\n //\n // To fix the problem, coerce this object or symbol value to a string before\n // passing it to React. The most reliable way is usually `String(value)`.\n //\n // To find which value is throwing, check the browser or debugger console.\n // Before this exception was thrown, there should be `console.error` output\n // that shows the type (Symbol, Temporal.PlainDate, etc.) that caused the\n // problem and how that type was used: key, atrribute, input value prop, etc.\n // In most cases, this console output also shows the component and its\n // ancestor components where the exception happened.\n //\n // eslint-disable-next-line react-internal/safe-string-coercion\n return '' + value;\n}\nfunction checkKeyStringCoercion(value) {\n {\n if (willCoercionThrow(value)) {\n error('The provided key is an unsupported type %s.' + ' This value must be coerced to a string before before using it here.', typeName(value));\n\n return testStringCoercion(value); // throw (to help callers find troubleshooting comments)\n }\n }\n}\n\nvar ReactCurrentOwner = ReactSharedInternals.ReactCurrentOwner;\nvar RESERVED_PROPS = {\n key: true,\n ref: true,\n __self: true,\n __source: true\n};\nvar specialPropKeyWarningShown;\nvar specialPropRefWarningShown;\nvar didWarnAboutStringRefs;\n\n{\n didWarnAboutStringRefs = {};\n}\n\nfunction hasValidRef(config) {\n {\n if (hasOwnProperty.call(config, 'ref')) {\n var getter = Object.getOwnPropertyDescriptor(config, 'ref').get;\n\n if (getter && getter.isReactWarning) {\n return false;\n }\n }\n }\n\n return config.ref !== undefined;\n}\n\nfunction hasValidKey(config) {\n {\n if (hasOwnProperty.call(config, 'key')) {\n var getter = Object.getOwnPropertyDescriptor(config, 'key').get;\n\n if (getter && getter.isReactWarning) {\n return false;\n }\n }\n }\n\n return config.key !== undefined;\n}\n\nfunction warnIfStringRefCannotBeAutoConverted(config, self) {\n {\n if (typeof config.ref === 'string' && ReactCurrentOwner.current && self && ReactCurrentOwner.current.stateNode !== self) {\n var componentName = getComponentNameFromType(ReactCurrentOwner.current.type);\n\n if (!didWarnAboutStringRefs[componentName]) {\n error('Component \"%s\" contains the string ref \"%s\". ' + 'Support for string refs will be removed in a future major release. ' + 'This case cannot be automatically converted to an arrow function. ' + 'We ask you to manually fix this case by using useRef() or createRef() instead. ' + 'Learn more about using refs safely here: ' + 'https://reactjs.org/link/strict-mode-string-ref', getComponentNameFromType(ReactCurrentOwner.current.type), config.ref);\n\n didWarnAboutStringRefs[componentName] = true;\n }\n }\n }\n}\n\nfunction defineKeyPropWarningGetter(props, displayName) {\n {\n var warnAboutAccessingKey = function () {\n if (!specialPropKeyWarningShown) {\n specialPropKeyWarningShown = true;\n\n error('%s: `key` is not a prop. Trying to access it will result ' + 'in `undefined` being returned. If you need to access the same ' + 'value within the child component, you should pass it as a different ' + 'prop. (https://reactjs.org/link/special-props)', displayName);\n }\n };\n\n warnAboutAccessingKey.isReactWarning = true;\n Object.defineProperty(props, 'key', {\n get: warnAboutAccessingKey,\n configurable: true\n });\n }\n}\n\nfunction defineRefPropWarningGetter(props, displayName) {\n {\n var warnAboutAccessingRef = function () {\n if (!specialPropRefWarningShown) {\n specialPropRefWarningShown = true;\n\n error('%s: `ref` is not a prop. Trying to access it will result ' + 'in `undefined` being returned. If you need to access the same ' + 'value within the child component, you should pass it as a different ' + 'prop. (https://reactjs.org/link/special-props)', displayName);\n }\n };\n\n warnAboutAccessingRef.isReactWarning = true;\n Object.defineProperty(props, 'ref', {\n get: warnAboutAccessingRef,\n configurable: true\n });\n }\n}\n/**\n * Factory method to create a new React element. This no longer adheres to\n * the class pattern, so do not use new to call it. Also, instanceof check\n * will not work. Instead test $$typeof field against Symbol.for('react.element') to check\n * if something is a React Element.\n *\n * @param {*} type\n * @param {*} props\n * @param {*} key\n * @param {string|object} ref\n * @param {*} owner\n * @param {*} self A *temporary* helper to detect places where `this` is\n * different from the `owner` when React.createElement is called, so that we\n * can warn. We want to get rid of owner and replace string `ref`s with arrow\n * functions, and as long as `this` and owner are the same, there will be no\n * change in behavior.\n * @param {*} source An annotation object (added by a transpiler or otherwise)\n * indicating filename, line number, and/or other information.\n * @internal\n */\n\n\nvar ReactElement = function (type, key, ref, self, source, owner, props) {\n var element = {\n // This tag allows us to uniquely identify this as a React Element\n $$typeof: REACT_ELEMENT_TYPE,\n // Built-in properties that belong on the element\n type: type,\n key: key,\n ref: ref,\n props: props,\n // Record the component responsible for creating this element.\n _owner: owner\n };\n\n {\n // The validation flag is currently mutative. We put it on\n // an external backing store so that we can freeze the whole object.\n // This can be replaced with a WeakMap once they are implemented in\n // commonly used development environments.\n element._store = {}; // To make comparing ReactElements easier for testing purposes, we make\n // the validation flag non-enumerable (where possible, which should\n // include every environment we run tests in), so the test framework\n // ignores it.\n\n Object.defineProperty(element._store, 'validated', {\n configurable: false,\n enumerable: false,\n writable: true,\n value: false\n }); // self and source are DEV only properties.\n\n Object.defineProperty(element, '_self', {\n configurable: false,\n enumerable: false,\n writable: false,\n value: self\n }); // Two elements created in two different places should be considered\n // equal for testing purposes and therefore we hide it from enumeration.\n\n Object.defineProperty(element, '_source', {\n configurable: false,\n enumerable: false,\n writable: false,\n value: source\n });\n\n if (Object.freeze) {\n Object.freeze(element.props);\n Object.freeze(element);\n }\n }\n\n return element;\n};\n/**\n * https://github.com/reactjs/rfcs/pull/107\n * @param {*} type\n * @param {object} props\n * @param {string} key\n */\n\nfunction jsxDEV(type, config, maybeKey, source, self) {\n {\n var propName; // Reserved names are extracted\n\n var props = {};\n var key = null;\n var ref = null; // Currently, key can be spread in as a prop. This causes a potential\n // issue if key is also explicitly declared (ie. <div {...props} key=\"Hi\" />\n // or <div key=\"Hi\" {...props} /> ). We want to deprecate key spread,\n // but as an intermediary step, we will use jsxDEV for everything except\n // <div {...props} key=\"Hi\" />, because we aren't currently able to tell if\n // key is explicitly declared to be undefined or not.\n\n if (maybeKey !== undefined) {\n {\n checkKeyStringCoercion(maybeKey);\n }\n\n key = '' + maybeKey;\n }\n\n if (hasValidKey(config)) {\n {\n checkKeyStringCoercion(config.key);\n }\n\n key = '' + config.key;\n }\n\n if (hasValidRef(config)) {\n ref = config.ref;\n warnIfStringRefCannotBeAutoConverted(config, self);\n } // Remaining properties are added to a new props object\n\n\n for (propName in config) {\n if (hasOwnProperty.call(config, propName) && !RESERVED_PROPS.hasOwnProperty(propName)) {\n props[propName] = config[propName];\n }\n } // Resolve default props\n\n\n if (type && type.defaultProps) {\n var defaultProps = type.defaultProps;\n\n for (propName in defaultProps) {\n if (props[propName] === undefined) {\n props[propName] = defaultProps[propName];\n }\n }\n }\n\n if (key || ref) {\n var displayName = typeof type === 'function' ? type.displayName || type.name || 'Unknown' : type;\n\n if (key) {\n defineKeyPropWarningGetter(props, displayName);\n }\n\n if (ref) {\n defineRefPropWarningGetter(props, displayName);\n }\n }\n\n return ReactElement(type, key, ref, self, source, ReactCurrentOwner.current, props);\n }\n}\n\nvar ReactCurrentOwner$1 = ReactSharedInternals.ReactCurrentOwner;\nvar ReactDebugCurrentFrame$1 = ReactSharedInternals.ReactDebugCurrentFrame;\n\nfunction setCurrentlyValidatingElement$1(element) {\n {\n if (element) {\n var owner = element._owner;\n var stack = describeUnknownElementTypeFrameInDEV(element.type, element._source, owner ? owner.type : null);\n ReactDebugCurrentFrame$1.setExtraStackFrame(stack);\n } else {\n ReactDebugCurrentFrame$1.setExtraStackFrame(null);\n }\n }\n}\n\nvar propTypesMisspellWarningShown;\n\n{\n propTypesMisspellWarningShown = false;\n}\n/**\n * Verifies the object is a ReactElement.\n * See https://reactjs.org/docs/react-api.html#isvalidelement\n * @param {?object} object\n * @return {boolean} True if `object` is a ReactElement.\n * @final\n */\n\n\nfunction isValidElement(object) {\n {\n return typeof object === 'object' && object !== null && object.$$typeof === REACT_ELEMENT_TYPE;\n }\n}\n\nfunction getDeclarationErrorAddendum() {\n {\n if (ReactCurrentOwner$1.current) {\n var name = getComponentNameFromType(ReactCurrentOwner$1.current.type);\n\n if (name) {\n return '\\n\\nCheck the render method of `' + name + '`.';\n }\n }\n\n return '';\n }\n}\n\nfunction getSourceInfoErrorAddendum(source) {\n {\n if (source !== undefined) {\n var fileName = source.fileName.replace(/^.*[\\\\\\/]/, '');\n var lineNumber = source.lineNumber;\n return '\\n\\nCheck your code at ' + fileName + ':' + lineNumber + '.';\n }\n\n return '';\n }\n}\n/**\n * Warn if there's no key explicitly set on dynamic arrays of children or\n * object keys are not valid. This allows us to keep track of children between\n * updates.\n */\n\n\nvar ownerHasKeyUseWarning = {};\n\nfunction getCurrentComponentErrorInfo(parentType) {\n {\n var info = getDeclarationErrorAddendum();\n\n if (!info) {\n var parentName = typeof parentType === 'string' ? parentType : parentType.displayName || parentType.name;\n\n if (parentName) {\n info = \"\\n\\nCheck the top-level render call using <\" + parentName + \">.\";\n }\n }\n\n return info;\n }\n}\n/**\n * Warn if the element doesn't have an explicit key assigned to it.\n * This element is in an array. The array could grow and shrink or be\n * reordered. All children that haven't already been validated are required to\n * have a \"key\" property assigned to it. Error statuses are cached so a warning\n * will only be shown once.\n *\n * @internal\n * @param {ReactElement} element Element that requires a key.\n * @param {*} parentType element's parent's type.\n */\n\n\nfunction validateExplicitKey(element, parentType) {\n {\n if (!element._store || element._store.validated || element.key != null) {\n return;\n }\n\n element._store.validated = true;\n var currentComponentErrorInfo = getCurrentComponentErrorInfo(parentType);\n\n if (ownerHasKeyUseWarning[currentComponentErrorInfo]) {\n return;\n }\n\n ownerHasKeyUseWarning[currentComponentErrorInfo] = true; // Usually the current owner is the offender, but if it accepts children as a\n // property, it may be the creator of the child that's responsible for\n // assigning it a key.\n\n var childOwner = '';\n\n if (element && element._owner && element._owner !== ReactCurrentOwner$1.current) {\n // Give the component that originally created this child.\n childOwner = \" It was passed a child from \" + getComponentNameFromType(element._owner.type) + \".\";\n }\n\n setCurrentlyValidatingElement$1(element);\n\n error('Each child in a list should have a unique \"key\" prop.' + '%s%s See https://reactjs.org/link/warning-keys for more information.', currentComponentErrorInfo, childOwner);\n\n setCurrentlyValidatingElement$1(null);\n }\n}\n/**\n * Ensure that every element either is passed in a static location, in an\n * array with an explicit keys property defined, or in an object literal\n * with valid key property.\n *\n * @internal\n * @param {ReactNode} node Statically passed child of any type.\n * @param {*} parentType node's parent's type.\n */\n\n\nfunction validateChildKeys(node, parentType) {\n {\n if (typeof node !== 'object') {\n return;\n }\n\n if (isArray(node)) {\n for (var i = 0; i < node.length; i++) {\n var child = node[i];\n\n if (isValidElement(child)) {\n validateExplicitKey(child, parentType);\n }\n }\n } else if (isValidElement(node)) {\n // This element was passed in a valid location.\n if (node._store) {\n node._store.validated = true;\n }\n } else if (node) {\n var iteratorFn = getIteratorFn(node);\n\n if (typeof iteratorFn === 'function') {\n // Entry iterators used to provide implicit keys,\n // but now we print a separate warning for them later.\n if (iteratorFn !== node.entries) {\n var iterator = iteratorFn.call(node);\n var step;\n\n while (!(step = iterator.next()).done) {\n if (isValidElement(step.value)) {\n validateExplicitKey(step.value, parentType);\n }\n }\n }\n }\n }\n }\n}\n/**\n * Given an element, validate that its props follow the propTypes definition,\n * provided by the type.\n *\n * @param {ReactElement} element\n */\n\n\nfunction validatePropTypes(element) {\n {\n var type = element.type;\n\n if (type === null || type === undefined || typeof type === 'string') {\n return;\n }\n\n var propTypes;\n\n if (typeof type === 'function') {\n propTypes = type.propTypes;\n } else if (typeof type === 'object' && (type.$$typeof === REACT_FORWARD_REF_TYPE || // Note: Memo only checks outer props here.\n // Inner props are checked in the reconciler.\n type.$$typeof === REACT_MEMO_TYPE)) {\n propTypes = type.propTypes;\n } else {\n return;\n }\n\n if (propTypes) {\n // Intentionally inside to avoid triggering lazy initializers:\n var name = getComponentNameFromType(type);\n checkPropTypes(propTypes, element.props, 'prop', name, element);\n } else if (type.PropTypes !== undefined && !propTypesMisspellWarningShown) {\n propTypesMisspellWarningShown = true; // Intentionally inside to avoid triggering lazy initializers:\n\n var _name = getComponentNameFromType(type);\n\n error('Component %s declared `PropTypes` instead of `propTypes`. Did you misspell the property assignment?', _name || 'Unknown');\n }\n\n if (typeof type.getDefaultProps === 'function' && !type.getDefaultProps.isReactClassApproved) {\n error('getDefaultProps is only used on classic React.createClass ' + 'definitions. Use a static property named `defaultProps` instead.');\n }\n }\n}\n/**\n * Given a fragment, validate that it can only be provided with fragment props\n * @param {ReactElement} fragment\n */\n\n\nfunction validateFragmentProps(fragment) {\n {\n var keys = Object.keys(fragment.props);\n\n for (var i = 0; i < keys.length; i++) {\n var key = keys[i];\n\n if (key !== 'children' && key !== 'key') {\n setCurrentlyValidatingElement$1(fragment);\n\n error('Invalid prop `%s` supplied to `React.Fragment`. ' + 'React.Fragment can only have `key` and `children` props.', key);\n\n setCurrentlyValidatingElement$1(null);\n break;\n }\n }\n\n if (fragment.ref !== null) {\n setCurrentlyValidatingElement$1(fragment);\n\n error('Invalid attribute `ref` supplied to `React.Fragment`.');\n\n setCurrentlyValidatingElement$1(null);\n }\n }\n}\n\nvar didWarnAboutKeySpread = {};\nfunction jsxWithValidation(type, props, key, isStaticChildren, source, self) {\n {\n var validType = isValidElementType(type); // We warn in this case but don't throw. We expect the element creation to\n // succeed and there will likely be errors in render.\n\n if (!validType) {\n var info = '';\n\n if (type === undefined || typeof type === 'object' && type !== null && Object.keys(type).length === 0) {\n 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.\";\n }\n\n var sourceInfo = getSourceInfoErrorAddendum(source);\n\n if (sourceInfo) {\n info += sourceInfo;\n } else {\n info += getDeclarationErrorAddendum();\n }\n\n var typeString;\n\n if (type === null) {\n typeString = 'null';\n } else if (isArray(type)) {\n typeString = 'array';\n } else if (type !== undefined && type.$$typeof === REACT_ELEMENT_TYPE) {\n typeString = \"<\" + (getComponentNameFromType(type.type) || 'Unknown') + \" />\";\n info = ' Did you accidentally export a JSX literal instead of a component?';\n } else {\n typeString = typeof type;\n }\n\n error('React.jsx: type is invalid -- expected a string (for ' + 'built-in components) or a class/function (for composite ' + 'components) but got: %s.%s', typeString, info);\n }\n\n var element = jsxDEV(type, props, key, source, self); // The result can be nullish if a mock or a custom function is used.\n // TODO: Drop this when these are no longer allowed as the type argument.\n\n if (element == null) {\n return element;\n } // Skip key warning if the type isn't valid since our key validation logic\n // doesn't expect a non-string/function type and can throw confusing errors.\n // We don't want exception behavior to differ between dev and prod.\n // (Rendering will throw with a helpful message and as soon as the type is\n // fixed, the key warnings will appear.)\n\n\n if (validType) {\n var children = props.children;\n\n if (children !== undefined) {\n if (isStaticChildren) {\n if (isArray(children)) {\n for (var i = 0; i < children.length; i++) {\n validateChildKeys(children[i], type);\n }\n\n if (Object.freeze) {\n Object.freeze(children);\n }\n } else {\n error('React.jsx: Static children should always be an array. ' + 'You are likely explicitly calling React.jsxs or React.jsxDEV. ' + 'Use the Babel transform instead.');\n }\n } else {\n validateChildKeys(children, type);\n }\n }\n }\n\n {\n if (hasOwnProperty.call(props, 'key')) {\n var componentName = getComponentNameFromType(type);\n var keys = Object.keys(props).filter(function (k) {\n return k !== 'key';\n });\n var beforeExample = keys.length > 0 ? '{key: someKey, ' + keys.join(': ..., ') + ': ...}' : '{key: someKey}';\n\n if (!didWarnAboutKeySpread[componentName + beforeExample]) {\n var afterExample = keys.length > 0 ? '{' + keys.join(': ..., ') + ': ...}' : '{}';\n\n error('A props object containing a \"key\" prop is being spread into JSX:\\n' + ' let props = %s;\\n' + ' <%s {...props} />\\n' + 'React keys must be passed directly to JSX without using spread:\\n' + ' let props = %s;\\n' + ' <%s key={someKey} {...props} />', beforeExample, componentName, afterExample, componentName);\n\n didWarnAboutKeySpread[componentName + beforeExample] = true;\n }\n }\n }\n\n if (type === REACT_FRAGMENT_TYPE) {\n validateFragmentProps(element);\n } else {\n validatePropTypes(element);\n }\n\n return element;\n }\n} // These two functions exist to still get child warnings in dev\n// even with the prod transform. This means that jsxDEV is purely\n// opt-in behavior for better messages but that we won't stop\n// giving you warnings if you use production apis.\n\nfunction jsxWithValidationStatic(type, props, key) {\n {\n return jsxWithValidation(type, props, key, true);\n }\n}\nfunction jsxWithValidationDynamic(type, props, key) {\n {\n return jsxWithValidation(type, props, key, false);\n }\n}\n\nvar jsx = jsxWithValidationDynamic ; // we may want to special case jsxs internally to take advantage of static children.\n// for now we can ship identical prod functions\n\nvar jsxs = jsxWithValidationStatic ;\n\nexports.Fragment = REACT_FRAGMENT_TYPE;\nexports.jsx = jsx;\nexports.jsxs = jsxs;\n })();\n}\n","'use strict';\n\nif (process.env.NODE_ENV === 'production') {\n module.exports = require('./cjs/react-jsx-runtime.production.min.js');\n} else {\n module.exports = require('./cjs/react-jsx-runtime.development.js');\n}\n","import React from 'react';\r\nimport './Button.css';\r\nimport type { ButtonProps } from './types';\r\n\r\nexport const Button: React.FC<ButtonProps> = ({\r\n progress,\r\n variant = 'solid',\r\n size = 'md',\r\n radius = 'md',\r\n children,\r\n className = '',\r\n loading,\r\n ...props\r\n}) => {\r\n // Determine color based on progress\r\n const getColorClass = (progress: number): string => {\r\n if (progress === 0) return 'button--primary';\r\n if (progress === 100) return 'button--success';\r\n return 'button--secondary';\r\n };\r\n\r\n const colorClass = progress !== undefined ? getColorClass(progress) : 'button--primary';\r\n\r\n const buttonClasses = [\r\n 'button',\r\n `button--${size}`,\r\n `button--${variant}`,\r\n `button--radius-${radius}`,\r\n colorClass,\r\n loading && 'button--loading',\r\n className\r\n ].filter(Boolean).join(' ');\r\n\r\n return (\r\n <button\r\n type=\"button\"\r\n className={buttonClasses}\r\n data-progress={progress}\r\n disabled={loading || props.disabled}\r\n {...props}\r\n >\r\n {loading ? '加载中...' : children}\r\n </button>\r\n );\r\n};","/**\n * @license lucide-react v0.541.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nconst toKebabCase = (string) => string.replace(/([a-z0-9])([A-Z])/g, \"$1-$2\").toLowerCase();\nconst toCamelCase = (string) => string.replace(\n /^([A-Z])|[\\s-_]+(\\w)/g,\n (match, p1, p2) => p2 ? p2.toUpperCase() : p1.toLowerCase()\n);\nconst toPascalCase = (string) => {\n const camelCase = toCamelCase(string);\n return camelCase.charAt(0).toUpperCase() + camelCase.slice(1);\n};\nconst mergeClasses = (...classes) => classes.filter((className, index, array) => {\n return Boolean(className) && className.trim() !== \"\" && array.indexOf(className) === index;\n}).join(\" \").trim();\nconst hasA11yProp = (props) => {\n for (const prop in props) {\n if (prop.startsWith(\"aria-\") || prop === \"role\" || prop === \"title\") {\n return true;\n }\n }\n};\n\nexport { hasA11yProp, mergeClasses, toCamelCase, toKebabCase, toPascalCase };\n//# sourceMappingURL=utils.js.map\n","/**\n * @license lucide-react v0.541.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nvar defaultAttributes = {\n xmlns: \"http://www.w3.org/2000/svg\",\n width: 24,\n height: 24,\n viewBox: \"0 0 24 24\",\n fill: \"none\",\n stroke: \"currentColor\",\n strokeWidth: 2,\n strokeLinecap: \"round\",\n strokeLinejoin: \"round\"\n};\n\nexport { defaultAttributes as default };\n//# sourceMappingURL=defaultAttributes.js.map\n","/**\n * @license lucide-react v0.541.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport { forwardRef, createElement } from 'react';\nimport defaultAttributes from './defaultAttributes.js';\nimport { mergeClasses, hasA11yProp } from './shared/src/utils.js';\n\nconst Icon = forwardRef(\n ({\n color = \"currentColor\",\n size = 24,\n strokeWidth = 2,\n absoluteStrokeWidth,\n className = \"\",\n children,\n iconNode,\n ...rest\n }, ref) => createElement(\n \"svg\",\n {\n ref,\n ...defaultAttributes,\n width: size,\n height: size,\n stroke: color,\n strokeWidth: absoluteStrokeWidth ? Number(strokeWidth) * 24 / Number(size) : strokeWidth,\n className: mergeClasses(\"lucide\", className),\n ...!children && !hasA11yProp(rest) && { \"aria-hidden\": \"true\" },\n ...rest\n },\n [\n ...iconNode.map(([tag, attrs]) => createElement(tag, attrs)),\n ...Array.isArray(children) ? children : [children]\n ]\n )\n);\n\nexport { Icon as default };\n//# sourceMappingURL=Icon.js.map\n","/**\n * @license lucide-react v0.541.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport { forwardRef, createElement } from 'react';\nimport { mergeClasses, toKebabCase, toPascalCase } from './shared/src/utils.js';\nimport Icon from './Icon.js';\n\nconst createLucideIcon = (iconName, iconNode) => {\n const Component = forwardRef(\n ({ className, ...props }, ref) => createElement(Icon, {\n ref,\n iconNode,\n className: mergeClasses(\n `lucide-${toKebabCase(toPascalCase(iconName))}`,\n `lucide-${iconName}`,\n className\n ),\n ...props\n })\n );\n Component.displayName = toPascalCase(iconName);\n return Component;\n};\n\nexport { createLucideIcon as default };\n//# sourceMappingURL=createLucideIcon.js.map\n","/**\n * @license lucide-react v0.541.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\"path\", { d: \"M5 12h14\", key: \"1ays0h\" }],\n [\"path\", { d: \"m12 5 7 7-7 7\", key: \"xquz4c\" }]\n];\nconst ArrowRight = createLucideIcon(\"arrow-right\", __iconNode);\n\nexport { __iconNode, ArrowRight as default };\n//# sourceMappingURL=arrow-right.js.map\n","/**\n * @license lucide-react v0.541.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [[\"path\", { d: \"m6 9 6 6 6-6\", key: \"qrunsl\" }]];\nconst ChevronDown = createLucideIcon(\"chevron-down\", __iconNode);\n\nexport { __iconNode, ChevronDown as default };\n//# sourceMappingURL=chevron-down.js.map\n","/**\n * @license lucide-react v0.541.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [[\"path\", { d: \"m9 18 6-6-6-6\", key: \"mthhwq\" }]];\nconst ChevronRight = createLucideIcon(\"chevron-right\", __iconNode);\n\nexport { __iconNode, ChevronRight as default };\n//# sourceMappingURL=chevron-right.js.map\n","// 内容手风琴组件类型定义\r\nimport type { KnowledgeItem, Lesson, Unit } from '../../types';\r\n\r\nexport interface ContentAccordionProps {\r\n /** 当前学习单元数据 */\r\n unit: Unit | null;\r\n /** 激活的课程ID列表 */\r\n activeLessonIds: string[];\r\n /** 切换课程激活状态的函数 */\r\n onToggleLesson: (lessonId: string) => void;\r\n /** 点击学习按钮的回调 */\r\n onLearnAction: (knowledgeItem: KnowledgeItem) => void;\r\n /** 加载状态 */\r\n loading?: boolean;\r\n /** 自定义类名 */\r\n className?: string;\r\n /** 空状态显示内容 */\r\n emptyState?: React.ReactNode;\r\n}\r\n\r\nexport interface ContentAccordionState {\r\n /** 内部展开状态管理 */\r\n expandedLessons: Set<string>;\r\n /** 动画状态 */\r\n isAnimating: boolean;\r\n}\r\n\r\nexport interface LessonItemProps {\r\n /** 课程数据 */\r\n lesson: Lesson;\r\n /** 是否展开状态 */\r\n isExpanded: boolean;\r\n /** 切换展开状态回调 */\r\n onToggle: (lessonId: string) => void;\r\n /** 学习按钮点击回调 */\r\n onLearnAction: (knowledgeItem: KnowledgeItem) => void;\r\n}\r\n\r\nexport interface KnowledgeCardProps {\r\n /** 知识点数据 */\r\n knowledgeItem: KnowledgeItem;\r\n /** 学习按钮点击回调 */\r\n onLearnAction: (knowledgeItem: KnowledgeItem) => void;\r\n}\r\n\r\n// 工具函数类型\r\nexport type GetButtonTextFn = (progress: number) => string;\r\nexport type CalculateLessonProgressFn = (knowledgeItems: KnowledgeItem[]) => number;\r\n\r\n// 进度按钮文本生成算法\r\nexport const getButtonText: GetButtonTextFn = (progress: number): string => {\r\n if (progress === 0) return '开始学习';\r\n if (progress === 100) return '复习';\r\n return '继续学习';\r\n};\r\n\r\n// 课程进度计算算法\r\nexport const calculateLessonProgress: CalculateLessonProgressFn = (knowledgeItems: KnowledgeItem[]): number => {\r\n if (knowledgeItems.length === 0) return 0;\r\n const totalProgress = knowledgeItems.reduce((sum, item) => sum + item.progress, 0);\r\n return Math.round(totalProgress / knowledgeItems.length);\r\n};","import React from 'react';\r\nimport { Progress } from '@heroui/progress';\r\nimport { Card, CardBody, CardFooter } from '@heroui/card';\r\nimport { Button } from '../Button';\r\nimport { ChevronDown, ChevronRight } from 'lucide-react';\r\nimport type { ContentAccordionProps, LessonItemProps, KnowledgeCardProps } from './types';\r\nimport { getButtonText, calculateLessonProgress } from './types';\r\nimport './ContentAccordion.css';\r\n\r\nconst KnowledgeCard: React.FC<KnowledgeCardProps> = ({ knowledgeItem, onLearnAction }) => {\r\n const handleLearnClick = () => {\r\n onLearnAction(knowledgeItem);\r\n };\r\n\r\n // 调试信息\r\n console.log('KnowledgeCard render:', {\r\n progress: knowledgeItem.progress,\r\n text: getButtonText(knowledgeItem.progress)\r\n });\r\n\r\n return (\r\n <Card className=\"content-accordion__knowledge-card\">\r\n <CardBody>\r\n <h3 className=\"content-accordion__knowledge-title\">{knowledgeItem.title}</h3>\r\n <p className=\"content-accordion__knowledge-description\">{knowledgeItem.description}</p>\r\n </CardBody>\r\n <CardFooter className=\"content-accordion__knowledge-actions\">\r\n <div className=\"content-accordion__progress-container\">\r\n <Progress\r\n value={knowledgeItem.progress}\r\n size=\"sm\"\r\n aria-label={`${knowledgeItem.title} 进度`}\r\n className=\"content-accordion__progress-bar\"\r\n />\r\n <span className=\"content-accordion__progress-text\">{knowledgeItem.progress}%</span>\r\n </div>\r\n <Button\r\n size=\"sm\"\r\n radius=\"md\"\r\n onClick={handleLearnClick}\r\n progress={knowledgeItem.progress}\r\n variant={knowledgeItem.progress === 100 ? 'light' : knowledgeItem.progress === 0 ? 'solid' : 'bordered'}\r\n className=\"content-accordion__learn-button\"\r\n >\r\n {getButtonText(knowledgeItem.progress)}\r\n </Button>\r\n </CardFooter>\r\n </Card>\r\n );\r\n};\r\n\r\nconst LessonItem: React.FC<LessonItemProps> = ({ lesson, isExpanded, onToggle, onLearnAction }) => {\r\n const handleToggle = () => {\r\n onToggle(lesson.id);\r\n };\r\n\r\n const lessonProgress = calculateLessonProgress(lesson.knowledgeItems);\r\n\r\n return (\r\n <div className={`content-accordion__lesson-item ${isExpanded ? 'content-accordion__lesson-item--expanded' : ''}`}>\r\n <div\r\n className=\"content-accordion__lesson-header\"\r\n onClick={handleToggle}\r\n role=\"button\"\r\n tabIndex={0}\r\n aria-expanded={isExpanded}\r\n aria-label={`${lesson.title},点击${isExpanded ? '收起' : '展开'}`}\r\n >\r\n <div className=\"content-accordion__lesson-header-content\">\r\n <h2 className=\"content-accordion__lesson-title\">{lesson.title}</h2>\r\n <span className=\"content-accordion__lesson-duration\">约 {lesson.duration} 分钟</span>\r\n </div>\r\n <div className=\"content-accordion__lesson-actions\">\r\n <span className=\"content-accordion__lesson-progress\">{lessonProgress}%</span>\r\n {isExpanded ? (\r\n <ChevronDown className=\"content-accordion__lesson-icon\" />\r\n ) : (\r\n <ChevronRight className=\"content-accordion__lesson-icon\" />\r\n )}\r\n </div>\r\n </div>\r\n\r\n {isExpanded && (\r\n <div className=\"content-accordion__knowledge-list\">\r\n {lesson.knowledgeItems.map((item) => (\r\n <KnowledgeCard\r\n key={item.id}\r\n knowledgeItem={item}\r\n onLearnAction={onLearnAction}\r\n />\r\n ))}\r\n </div>\r\n )}\r\n </div>\r\n );\r\n};\r\n\r\nexport const ContentAccordion: React.FC<ContentAccordionProps> = ({\r\n unit,\r\n activeLessonIds,\r\n onToggleLesson,\r\n onLearnAction,\r\n loading = false,\r\n className = '',\r\n emptyState\r\n}) => {\r\n if (loading) {\r\n return (\r\n <div className=\"content-accordion content-accordion--loading\">\r\n <div className=\"content-accordion__loading\">加载中...</div>\r\n </div>\r\n );\r\n }\r\n\r\n if (!unit) {\r\n return (\r\n <div className=\"content-accordion content-accordion--empty\">\r\n {emptyState || <div className=\"content-accordion__empty\">暂无学习内容</div>}\r\n </div>\r\n );\r\n }\r\n\r\n return (\r\n <div className={`content-accordion ${className}`}>\r\n {/* 单元头部信息 */}\r\n <header className=\"content-accordion__header\">\r\n <h1 className=\"content-accordion__unit-title\">{unit.title}</h1>\r\n <p className=\"content-accordion__unit-description\">{unit.description}</p>\r\n <div className=\"content-accordion__unit-meta\">\r\n <span>总共 {unit.totalLessons} 节课</span>\r\n <span>•</span>\r\n <span>预计学习 {unit.estimatedDuration}</span>\r\n </div>\r\n </header>\r\n\r\n {/* 课程列表 */}\r\n <div className=\"content-accordion__lessons\">\r\n {unit.lessons.map((lesson) => (\r\n <LessonItem\r\n key={lesson.id}\r\n lesson={lesson}\r\n isExpanded={activeLessonIds.includes(lesson.id)}\r\n onToggle={onToggleLesson}\r\n onLearnAction={onLearnAction}\r\n />\r\n ))}\r\n </div>\r\n </div>\r\n );\r\n};","// Sidebar 组件类型定义\r\n\r\nexport interface UnitProgressData {\r\n unitId: string;\r\n title: string;\r\n description: string;\r\n moduleCategory: string;\r\n estimatedDuration: string;\r\n totalLessons: number;\r\n completedLessons: number;\r\n progressPercentage: number;\r\n status: 'not-started' | 'in-progress' | 'completed';\r\n lastAccessed?: string;\r\n isActive: boolean;\r\n route: string;\r\n icon?: string;\r\n}\r\n\r\nexport interface UserGradeUnitsProgressData {\r\n userId: string;\r\n courseId: string;\r\n courseTitle: string;\r\n courseLevel: number;\r\n totalUnits: number;\r\n completedUnits: number;\r\n overallProgress: number;\r\n status: 'not-started' | 'in-progress' | 'completed';\r\n lastAccessed?: string;\r\n units: UnitProgressData[];\r\n}\r\n\r\nexport interface SidebarProps {\r\n // 核心数据 - 用户年级单元进度数据\r\n data: UserGradeUnitsProgressData | null;\r\n\r\n // 状态控制\r\n loading?: boolean;\r\n error?: Error | null;\r\n collapsed?: boolean;\r\n\r\n // 交互回调\r\n onToggleCollapse?: () => void;\r\n activeUnitId?: string | null;\r\n onUnitSelect?: (unitId: string) => void;\r\n\r\n // 自定义渲染\r\n renderUnitItem?: (unit: UnitProgressData, progress?: UnitProgressData) => React.ReactNode;\r\n\r\n // 样式配置\r\n className?: string;\r\n unitItemClassName?: string;\r\n style?: React.CSSProperties;\r\n unitItemStyle?: React.CSSProperties;\r\n}\r\n\r\n// 进度状态颜色映射\r\nexport const getProgressColor = (status: UnitProgressData['status']): 'success' | 'primary' | 'default' => {\r\n switch (status) {\r\n case 'completed':\r\n return 'success';\r\n case 'in-progress':\r\n return 'primary';\r\n case 'not-started':\r\n default:\r\n return 'default';\r\n }\r\n};","import React from 'react';\r\nimport { Progress } from '@heroui/react';\r\nimport type { SidebarProps, UnitProgressData } from './types';\r\nimport { getProgressColor } from './types';\r\nimport './Sidebar.css';\r\n\r\nexport const Sidebar: React.FC<SidebarProps> = ({\r\n data,\r\n loading = false,\r\n error = null,\r\n collapsed = false,\r\n onToggleCollapse,\r\n activeUnitId = null,\r\n onUnitSelect,\r\n renderUnitItem,\r\n className = '',\r\n unitItemClassName = '',\r\n style = {},\r\n unitItemStyle = {},\r\n}) => {\r\n const handleUnitSelect = (unitId: string, event: React.MouseEvent) => {\r\n event.preventDefault();\r\n onUnitSelect?.(unitId);\r\n };\r\n\r\n const handleToggleCollapse = () => {\r\n onToggleCollapse?.();\r\n };\r\n\r\n // 渲染默认单元项\r\n const renderDefaultUnitItem = (unit: UnitProgressData) => (\r\n <div\r\n key={unit.unitId}\r\n className={`sidebar__unit-item ${unitItemClassName} ${\r\n activeUnitId === unit.unitId ? 'sidebar__unit-item--active' : ''\r\n } ${unit.status ? `sidebar__unit-item--${unit.status}` : ''}`}\r\n style={unitItemStyle}\r\n onClick={(e) => handleUnitSelect(unit.unitId, e)}\r\n role=\"button\"\r\n tabIndex={0}\r\n aria-label={`${unit.title},进度 ${unit.progressPercentage}%`}\r\n >\r\n <div className=\"sidebar__unit-item__content\">\r\n {unit.icon && (\r\n <span className=\"sidebar__unit-item__icon\">{unit.icon}</span>\r\n )}\r\n {!collapsed && (\r\n <span className=\"sidebar__unit-item__title\">{unit.title}</span>\r\n )}\r\n </div>\r\n\r\n {!collapsed && unit.progressPercentage !== undefined && (\r\n <div className=\"sidebar__unit-item__progress\">\r\n <Progress\r\n value={unit.progressPercentage}\r\n size=\"sm\"\r\n color={getProgressColor(unit.status)}\r\n aria-label={`${unit.title} 进度`}\r\n />\r\n <span className=\"progress-percentage\">\r\n {unit.progressPercentage}%\r\n </span>\r\n </div>\r\n )}\r\n </div>\r\n );\r\n\r\n // 渲染状态内容\r\n const renderContent = () => {\r\n if (loading) {\r\n return (\r\n <div className=\"sidebar__loading\">\r\n 加载中...\r\n </div>\r\n );\r\n }\r\n\r\n if (error) {\r\n return (\r\n <div className=\"sidebar__error\">\r\n 加载失败: {error.message}\r\n </div>\r\n );\r\n }\r\n\r\n if (!data) {\r\n return (\r\n <div className=\"sidebar__empty\">\r\n 暂无课程数据\r\n </div>\r\n );\r\n }\r\n\r\n return (\r\n <>\r\n <div className=\"sidebar__header\">\r\n <button\r\n className=\"sidebar__toggle-btn\"\r\n onClick={handleToggleCollapse}\r\n aria-label=\"切换侧边栏折叠状态\"\r\n >\r\n {collapsed ? '→' : '←'}\r\n </button>\r\n {!collapsed && (\r\n <div className=\"sidebar__course-info\">\r\n <h3 className=\"sidebar__course-title\">{data.courseTitle}</h3>\r\n <span className=\"sidebar__course-level\">{data.courseLevel}年级</span>\r\n </div>\r\n )}\r\n </div>\r\n\r\n <nav className=\"sidebar__content\">\r\n <ul className=\"sidebar__unit-list\">\r\n {data.units && data.units.length > 0 ? (\r\n data.units.map((unit) => (\r\n <li key={unit.unitId}>\r\n {renderUnitItem\r\n ? renderUnitItem(unit, unit)\r\n : renderDefaultUnitItem(unit)}\r\n </li>\r\n ))\r\n ) : (\r\n <div className=\"sidebar__empty\">\r\n 暂无单元数据\r\n </div>\r\n )}\r\n </ul>\r\n </nav>\r\n </>\r\n );\r\n };\r\n\r\n return (\r\n <aside\r\n className={`sidebar ${className} ${collapsed ? 'sidebar--collapsed' : ''} ${\r\n loading ? 'sidebar--loading' : ''\r\n } ${error ? 'sidebar--error' : ''}`}\r\n style={style}\r\n aria-label=\"课程导航侧边栏\"\r\n role=\"complementary\"\r\n >\r\n {renderContent()}\r\n </aside>\r\n );\r\n};","import React from 'react'\r\nimport './Submenu.css'\r\n\r\nexport interface SubmenuItem {\r\n id: string | number\r\n label?: React.ReactNode\r\n value?: unknown\r\n icon?: React.ReactNode\r\n disabled?: boolean\r\n onClick?: (item: SubmenuItem) => void\r\n [key: string]: unknown\r\n}\r\n\r\nexport interface SubmenuProps {\r\n trigger: React.ReactNode\r\n items: SubmenuItem[]\r\n position?: 'top' | 'bottom' | 'left' | 'right' | 'auto'\r\n alignment?: 'start' | 'center' | 'end'\r\n openDelay?: number\r\n closeDelay?: number\r\n onOpen?: () => void\r\n onClose?: () => void\r\n renderItem?: (item: SubmenuItem, config: TItemConfig) => React.ReactNode\r\n itemConfig?: TItemConfig\r\n className?: string\r\n menuClassName?: string\r\n itemClassName?: string\r\n activeItemClassName?: string\r\n}\r\n\r\ntype TItemConfig = {\r\n currentUserRole?: 'guest' | 'student' | 'teacher' | 'admin'\r\n theme?: 'light' | 'dark'\r\n [key: string]: unknown\r\n}\r\n\r\nconst Submenu: React.FC<SubmenuProps> = ({\r\n trigger,\r\n items,\r\n position = 'bottom',\r\n alignment = 'start',\r\n openDelay = 300,\r\n closeDelay = 100,\r\n onOpen,\r\n onClose,\r\n renderItem,\r\n itemConfig = {},\r\n className,\r\n menuClassName,\r\n itemClassName,\r\n // activeItemClassName is available for custom styling but not used in default implementation\r\n}) => {\r\n const [isOpen, setIsOpen] = React.useState(false)\r\n const openTimeoutRef = React.useRef<NodeJS.Timeout | null>(null)\r\n const closeTimeoutRef = React.useRef<NodeJS.Timeout | null>(null)\r\n\r\n const clearTimeouts = () => {\r\n if (openTimeoutRef.current) {\r\n clearTimeout(openTimeoutRef.current)\r\n }\r\n if (closeTimeoutRef.current) {\r\n clearTimeout(closeTimeoutRef.current)\r\n }\r\n }\r\n\r\n const handleMouseEnter = () => {\r\n clearTimeouts()\r\n openTimeoutRef.current = setTimeout(() => {\r\n setIsOpen(true)\r\n onOpen?.()\r\n }, openDelay)\r\n }\r\n\r\n const handleMouseLeave = () => {\r\n clearTimeouts()\r\n closeTimeoutRef.current = setTimeout(() => {\r\n setIsOpen(false)\r\n onClose?.()\r\n }, closeDelay)\r\n }\r\n\r\n const handleItemClick = (item: SubmenuItem) => {\r\n if (!item.disabled && item.onClick) {\r\n item.onClick(item)\r\n }\r\n }\r\n\r\n React.useEffect(() => {\r\n return () => clearTimeouts()\r\n }, [])\r\n\r\n const defaultRenderItem = (item: SubmenuItem) => (\r\n <div\r\n key={item.id}\r\n className={`submenu-item ${item.disabled ? 'is-disabled' : ''} ${itemClassName || ''}`}\r\n onClick={() => handleItemClick(item)}\r\n >\r\n {item.icon && <span className=\"submenu-item-icon\">{item.icon}</span>}\r\n <span>{item.label}</span>\r\n </div>\r\n )\r\n\r\n const getPanelClasses = () => {\r\n const classes = ['submenu-panel']\r\n \r\n if (menuClassName) {\r\n classes.push(menuClassName)\r\n }\r\n \r\n // Add position class\r\n classes.push(`position-${position}`)\r\n \r\n // Add alignment class if not 'start' (default)\r\n if (alignment !== 'start') {\r\n classes.push(`alignment-${alignment}`)\r\n }\r\n \r\n // Add open state class\r\n if (isOpen) {\r\n classes.push('is-open')\r\n }\r\n \r\n return classes.join(' ')\r\n }\r\n\r\n return (\r\n <div \r\n className={`submenu-container ${className || ''}`}\r\n onMouseEnter={handleMouseEnter}\r\n onMouseLeave={handleMouseLeave}\r\n >\r\n <div className=\"submenu-trigger\">\r\n {trigger}\r\n </div>\r\n \r\n <div className={getPanelClasses()}>\r\n {items.map(item => \r\n renderItem \r\n ? renderItem(item, itemConfig)\r\n : defaultRenderItem(item)\r\n )}\r\n </div>\r\n </div>\r\n )\r\n}\r\n\r\nexport default Submenu","'use strict';\n\nexport default function bind(fn, thisArg) {\n return function wrap() {\n return fn.apply(thisArg, arguments);\n };\n}\n","'use strict';\n\nimport bind from './helpers/bind.js';\n\n// utils is a library of generic helper functions non-specific to axios\n\nconst {toString} = Object.prototype;\nconst {getPrototypeOf} = Object;\nconst {iterator, toStringTag} = Symbol;\n\nconst kindOf = (cache => thing => {\n const str = toString.call(thing);\n return cache[str] || (cache[str] = str.slice(8, -1).toLowerCase());\n})(Object.create(null));\n\nconst kindOfTest = (type) => {\n type = type.toLowerCase();\n return (thing) => kindOf(thing) === type\n}\n\nconst typeOfTest = type => thing => typeof thing === type;\n\n/**\n * Determine if a value is an Array\n *\n * @param {Object} val The value to test\n *\n * @returns {boolean} True if value is an Array, otherwise false\n */\nconst {isArray} = Array;\n\n/**\n * Determine if a value is undefined\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if the value is undefined, otherwise false\n */\nconst isUndefined = typeOfTest('undefined');\n\n/**\n * Determine if a value is a Buffer\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a Buffer, otherwise false\n */\nfunction isBuffer(val) {\n return val !== null && !isUndefined(val) && val.constructor !== null && !isUndefined(val.constructor)\n && isFunction(val.constructor.isBuffer) && val.constructor.isBuffer(val);\n}\n\n/**\n * Determine if a value is an ArrayBuffer\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is an ArrayBuffer, otherwise false\n */\nconst isArrayBuffer = kindOfTest('ArrayBuffer');\n\n\n/**\n * Determine if a value is a view on an ArrayBuffer\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a view on an ArrayBuffer, otherwise false\n */\nfunction isArrayBufferView(val) {\n let result;\n if ((typeof ArrayBuffer !== 'undefined') && (ArrayBuffer.isView)) {\n result = ArrayBuffer.isView(val);\n } else {\n result = (val) && (val.buffer) && (isArrayBuffer(val.buffer));\n }\n return result;\n}\n\n/**\n * Determine if a value is a String\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a String, otherwise false\n */\nconst isString = typeOfTest('string');\n\n/**\n * Determine if a value is a Function\n *\n * @param {*} val The value to test\n * @returns {boolean} True if value is a Function, otherwise false\n */\nconst isFunction = typeOfTest('function');\n\n/**\n * Determine if a value is a Number\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a Number, otherwise false\n */\nconst isNumber = typeOfTest('number');\n\n/**\n * Determine if a value is an Object\n *\n * @param {*} thing The value to test\n *\n * @returns {boolean} True if value is an Object, otherwise false\n */\nconst isObject = (thing) => thing !== null && typeof thing === 'object';\n\n/**\n * Determine if a value is a Boolean\n *\n * @param {*} thing The value to test\n * @returns {boolean} True if value is a Boolean, otherwise false\n */\nconst isBoolean = thing => thing === true || thing === false;\n\n/**\n * Determine if a value is a plain Object\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a plain Object, otherwise false\n */\nconst isPlainObject = (val) => {\n if (kindOf(val) !== 'object') {\n return false;\n }\n\n const prototype = getPrototypeOf(val);\n return (prototype === null || prototype === Object.prototype || Object.getPrototypeOf(prototype) === null) && !(toStringTag in val) && !(iterator in val);\n}\n\n/**\n * Determine if a value is an empty object (safely handles Buffers)\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is an empty object, otherwise false\n */\nconst isEmptyObject = (val) => {\n // Early return for non-objects or Buffers to prevent RangeError\n if (!isObject(val) || isBuffer(val)) {\n return false;\n }\n\n try {\n return Object.keys(val).length === 0 && Object.getPrototypeOf(val) === Object.prototype;\n } catch (e) {\n // Fallback for any other objects that might cause RangeError with Object.keys()\n return false;\n }\n}\n\n/**\n * Determine if a value is a Date\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a Date, otherwise false\n */\nconst isDate = kindOfTest('Date');\n\n/**\n * Determine if a value is a File\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a File, otherwise false\n */\nconst isFile = kindOfTest('File');\n\n/**\n * Determine if a value is a Blob\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a Blob, otherwise false\n */\nconst isBlob = kindOfTest('Blob');\n\n/**\n * Determine if a value is a FileList\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a File, otherwise false\n */\nconst isFileList = kindOfTest('FileList');\n\n/**\n * Determine if a value is a Stream\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a Stream, otherwise false\n */\nconst isStream = (val) => isObject(val) && isFunction(val.pipe);\n\n/**\n * Determine if a value is a FormData\n *\n * @param {*} thing The value to test\n *\n * @returns {boolean} True if value is an FormData, otherwise false\n */\nconst isFormData = (thing) => {\n let kind;\n return thing && (\n (typeof FormData === 'function' && thing instanceof FormData) || (\n isFunction(thing.append) && (\n (kind = kindOf(thing)) === 'formdata' ||\n // detect form-data instance\n (kind === 'object' && isFunction(thing.toString) && thing.toString() === '[object FormData]')\n )\n )\n )\n}\n\n/**\n * Determine if a value is a URLSearchParams object\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a URLSearchParams object, otherwise false\n */\nconst isURLSearchParams = kindOfTest('URLSearchParams');\n\nconst [isReadableStream, isRequest, isResponse, isHeaders] = ['ReadableStream', 'Request', 'Response', 'Headers'].map(kindOfTest);\n\n/**\n * Trim excess whitespace off the beginning and end of a string\n *\n * @param {String} str The String to trim\n *\n * @returns {String} The String freed of excess whitespace\n */\nconst trim = (str) => str.trim ?\n str.trim() : str.replace(/^[\\s\\uFEFF\\xA0]+|[\\s\\uFEFF\\xA0]+$/g, '');\n\n/**\n * Iterate over an Array or an Object invoking a function for each item.\n *\n * If `obj` is an Array callback will be called passing\n * the value, index, and complete array for each item.\n *\n * If 'obj' is an Object callback will be called passing\n * the value, key, and complete object for each property.\n *\n * @param {Object|Array} obj The object to iterate\n * @param {Function} fn The callback to invoke for each item\n *\n * @param {Boolean} [allOwnKeys = false]\n * @returns {any}\n */\nfunction forEach(obj, fn, {allOwnKeys = false} = {}) {\n // Don't bother if no value provided\n if (obj === null || typeof obj === 'undefined') {\n return;\n }\n\n let i;\n let l;\n\n // Force an array if not already something iterable\n if (typeof obj !== 'object') {\n /*eslint no-param-reassign:0*/\n obj = [obj];\n }\n\n if (isArray(obj)) {\n // Iterate over array values\n for (i = 0, l = obj.length; i < l; i++) {\n fn.call(null, obj[i], i, obj);\n }\n } else {\n // Buffer check\n if (isBuffer(obj)) {\n return;\n }\n\n // Iterate over object keys\n const keys = allOwnKeys ? Object.getOwnPropertyNames(obj) : Object.keys(obj);\n const len = keys.length;\n let key;\n\n for (i = 0; i < len; i++) {\n key = keys[i];\n fn.call(null, obj[key], key, obj);\n }\n }\n}\n\nfunction findKey(obj, key) {\n if (isBuffer(obj)){\n return null;\n }\n\n key = key.toLowerCase();\n const keys = Object.keys(obj);\n let i = keys.length;\n let _key;\n while (i-- > 0) {\n _key = keys[i];\n if (key === _key.toLowerCase()) {\n return _key;\n }\n }\n return null;\n}\n\nconst _global = (() => {\n /*eslint no-undef:0*/\n if (typeof globalThis !== \"undefined\") return globalThis;\n return typeof self !== \"undefined\" ? self : (typeof window !== 'undefined' ? window : global)\n})();\n\nconst isContextDefined = (context) => !isUndefined(context) && context !== _global;\n\n/**\n * Accepts varargs expecting each argument to be an object, then\n * immutably merges the properties of each object and returns result.\n *\n * When multiple objects contain the same key the later object in\n * the arguments list will take precedence.\n *\n * Example:\n *\n * ```js\n * var result = merge({foo: 123}, {foo: 456});\n * console.log(result.foo); // outputs 456\n * ```\n *\n * @param {Object} obj1 Object to merge\n *\n * @returns {Object} Result of all merge properties\n */\nfunction merge(/* obj1, obj2, obj3, ... */) {\n const {caseless, skipUndefined} = isContextDefined(this) && this || {};\n const result = {};\n const assignValue = (val, key) => {\n const targetKey = caseless && findKey(result, key) || key;\n if (isPlainObject(result[targetKey]) && isPlainObject(val)) {\n result[targetKey] = merge(result[targetKey], val);\n } else if (isPlainObject(val)) {\n result[targetKey] = merge({}, val);\n } else if (isArray(val)) {\n result[targetKey] = val.slice();\n } else if (!skipUndefined || !isUndefined(val)) {\n result[targetKey] = val;\n }\n }\n\n for (let i = 0, l = arguments.length; i < l; i++) {\n arguments[i] && forEach(arguments[i], assignValue);\n }\n return result;\n}\n\n/**\n * Extends object a by mutably adding to it the properties of object b.\n *\n * @param {Object} a The object to be extended\n * @param {Object} b The object to copy properties from\n * @param {Object} thisArg The object to bind function to\n *\n * @param {Boolean} [allOwnKeys]\n * @returns {Object} The resulting value of object a\n */\nconst extend = (a, b, thisArg, {allOwnKeys}= {}) => {\n forEach(b, (val, key) => {\n if (thisArg && isFunction(val)) {\n a[key] = bind(val, thisArg);\n } else {\n a[key] = val;\n }\n }, {allOwnKeys});\n return a;\n}\n\n/**\n * Remove byte order marker. This catches EF BB BF (the UTF-8 BOM)\n *\n * @param {string} content with BOM\n *\n * @returns {string} content value without BOM\n */\nconst stripBOM = (content) => {\n if (content.charCodeAt(0) === 0xFEFF) {\n content = content.slice(1);\n }\n return content;\n}\n\n/**\n * Inherit the prototype methods from one constructor into another\n * @param {function} constructor\n * @param {function} superConstructor\n * @param {object} [props]\n * @param {object} [descriptors]\n *\n * @returns {void}\n */\nconst inherits = (constructor, superConstructor, props, descriptors) => {\n constructor.prototype = Object.create(superConstructor.prototype, descriptors);\n constructor.prototype.constructor = constructor;\n Object.defineProperty(constructor, 'super', {\n value: superConstructor.prototype\n });\n props && Object.assign(constructor.prototype, props);\n}\n\n/**\n * Resolve object with deep prototype chain to a flat object\n * @param {Object} sourceObj source object\n * @param {Object} [destObj]\n * @param {Function|Boolean} [filter]\n * @param {Function} [propFilter]\n *\n * @returns {Object}\n */\nconst toFlatObject = (sourceObj, destObj, filter, propFilter) => {\n let props;\n let i;\n let prop;\n const merged = {};\n\n destObj = destObj || {};\n // eslint-disable-next-line no-eq-null,eqeqeq\n if (sourceObj == null) return destObj;\n\n do {\n props = Object.getOwnPropertyNames(sourceObj);\n i = props.length;\n while (i-- > 0) {\n prop = props[i];\n if ((!propFilter || propFilter(prop, sourceObj, destObj)) && !merged[prop]) {\n destObj[prop] = sourceObj[prop];\n merged[prop] = true;\n }\n }\n sourceObj = filter !== false && getPrototypeOf(sourceObj);\n } while (sourceObj && (!filter || filter(sourceObj, destObj)) && sourceObj !== Object.prototype);\n\n return destObj;\n}\n\n/**\n * Determines whether a string ends with the characters of a specified string\n *\n * @param {String} str\n * @param {String} searchString\n * @param {Number} [position= 0]\n *\n * @returns {boolean}\n */\nconst endsWith = (str, searchString, position) => {\n str = String(str);\n if (position === undefined || position > str.length) {\n position = str.length;\n }\n position -= searchString.length;\n const lastIndex = str.indexOf(searchString, position);\n return lastIndex !== -1 && lastIndex === position;\n}\n\n\n/**\n * Returns new array from array like object or null if failed\n *\n * @param {*} [thing]\n *\n * @returns {?Array}\n */\nconst toArray = (thing) => {\n if (!thing) return null;\n if (isArray(thing)) return thing;\n let i = thing.length;\n if (!isNumber(i)) return null;\n const arr = new Array(i);\n while (i-- > 0) {\n arr[i] = thing[i];\n }\n return arr;\n}\n\n/**\n * Checking if the Uint8Array exists and if it does, it returns a function that checks if the\n * thing passed in is an instance of Uint8Array\n *\n * @param {TypedArray}\n *\n * @returns {Array}\n */\n// eslint-disable-next-line func-names\nconst isTypedArray = (TypedArray => {\n // eslint-disable-next-line func-names\n return thing => {\n return TypedArray && thing instanceof TypedArray;\n };\n})(typeof Uint8Array !== 'undefined' && getPrototypeOf(Uint8Array));\n\n/**\n * For each entry in the object, call the function with the key and value.\n *\n * @param {Object<any, any>} obj - The object to iterate over.\n * @param {Function} fn - The function to call for each entry.\n *\n * @returns {void}\n */\nconst forEachEntry = (obj, fn) => {\n const generator = obj && obj[iterator];\n\n const _iterator = generator.call(obj);\n\n let result;\n\n while ((result = _iterator.next()) && !result.done) {\n const pair = result.value;\n fn.call(obj, pair[0], pair[1]);\n }\n}\n\n/**\n * It takes a regular expression and a string, and returns an array of all the matches\n *\n * @param {string} regExp - The regular expression to match against.\n * @param {string} str - The string to search.\n *\n * @returns {Array<boolean>}\n */\nconst matchAll = (regExp, str) => {\n let matches;\n const arr = [];\n\n while ((matches = regExp.exec(str)) !== null) {\n arr.push(matches);\n }\n\n return arr;\n}\n\n/* Checking if the kindOfTest function returns true when passed an HTMLFormElement. */\nconst isHTMLForm = kindOfTest('HTMLFormElement');\n\nconst toCamelCase = str => {\n return str.toLowerCase().replace(/[-_\\s]([a-z\\d])(\\w*)/g,\n function replacer(m, p1, p2) {\n return p1.toUpperCase() + p2;\n }\n );\n};\n\n/* Creating a function that will check if an object has a property. */\nconst hasOwnProperty = (({hasOwnProperty}) => (obj, prop) => hasOwnProperty.call(obj, prop))(Object.prototype);\n\n/**\n * Determine if a value is a RegExp object\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a RegExp object, otherwise false\n */\nconst isRegExp = kindOfTest('RegExp');\n\nconst reduceDescriptors = (obj, reducer) => {\n const descriptors = Object.getOwnPropertyDescriptors(obj);\n const reducedDescriptors = {};\n\n forEach(descriptors, (descriptor, name) => {\n let ret;\n if ((ret = reducer(descriptor, name, obj)) !== false) {\n reducedDescriptors[name] = ret || descriptor;\n }\n });\n\n Object.defineProperties(obj, reducedDescriptors);\n}\n\n/**\n * Makes all methods read-only\n * @param {Object} obj\n */\n\nconst freezeMethods = (obj) => {\n reduceDescriptors(obj, (descriptor, name) => {\n // skip restricted props in strict mode\n if (isFunction(obj) && ['arguments', 'caller', 'callee'].indexOf(name) !== -1) {\n return false;\n }\n\n const value = obj[name];\n\n if (!isFunction(value)) return;\n\n descriptor.enumerable = false;\n\n if ('writable' in descriptor) {\n descriptor.writable = false;\n return;\n }\n\n if (!descriptor.set) {\n descriptor.set = () => {\n throw Error('Can not rewrite read-only method \\'' + name + '\\'');\n };\n }\n });\n}\n\nconst toObjectSet = (arrayOrString, delimiter) => {\n const obj = {};\n\n const define = (arr) => {\n arr.forEach(value => {\n obj[value] = true;\n });\n }\n\n isArray(arrayOrString) ? define(arrayOrString) : define(String(arrayOrString).split(delimiter));\n\n return obj;\n}\n\nconst noop = () => {}\n\nconst toFiniteNumber = (value, defaultValue) => {\n return value != null && Number.isFinite(value = +value) ? value : defaultValue;\n}\n\n\n\n/**\n * If the thing is a FormData object, return true, otherwise return false.\n *\n * @param {unknown} thing - The thing to check.\n *\n * @returns {boolean}\n */\nfunction isSpecCompliantForm(thing) {\n return !!(thing && isFunction(thing.append) && thing[toStringTag] === 'FormData' && thing[iterator]);\n}\n\nconst toJSONObject = (obj) => {\n const stack = new Array(10);\n\n const visit = (source, i) => {\n\n if (isObject(source)) {\n if (stack.indexOf(source) >= 0) {\n return;\n }\n\n //Buffer check\n if (isBuffer(source)) {\n return source;\n }\n\n if(!('toJSON' in source)) {\n stack[i] = source;\n const target = isArray(source) ? [] : {};\n\n forEach(source, (value, key) => {\n const reducedValue = visit(value, i + 1);\n !isUndefined(reducedValue) && (target[key] = reducedValue);\n });\n\n stack[i] = undefined;\n\n return target;\n }\n }\n\n return source;\n }\n\n return visit(obj, 0);\n}\n\nconst isAsyncFn = kindOfTest('AsyncFunction');\n\nconst isThenable = (thing) =>\n thing && (isObject(thing) || isFunction(thing)) && isFunction(thing.then) && isFunction(thing.catch);\n\n// original code\n// https://github.com/DigitalBrainJS/AxiosPromise/blob/16deab13710ec09779922131f3fa5954320f83ab/lib/utils.js#L11-L34\n\nconst _setImmediate = ((setImmediateSupported, postMessageSupported) => {\n if (setImmediateSupported) {\n return setImmediate;\n }\n\n return postMessageSupported ? ((token, callbacks) => {\n _global.addEventListener(\"message\", ({source, data}) => {\n if (source === _global && data === token) {\n callbacks.length && callbacks.shift()();\n }\n }, false);\n\n return (cb) => {\n callbacks.push(cb);\n _global.postMessage(token, \"*\");\n }\n })(`axios@${Math.random()}`, []) : (cb) => setTimeout(cb);\n})(\n typeof setImmediate === 'function',\n isFunction(_global.postMessage)\n);\n\nconst asap = typeof queueMicrotask !== 'undefined' ?\n queueMicrotask.bind(_global) : ( typeof process !== 'undefined' && process.nextTick || _setImmediate);\n\n// *********************\n\n\nconst isIterable = (thing) => thing != null && isFunction(thing[iterator]);\n\n\nexport default {\n isArray,\n isArrayBuffer,\n isBuffer,\n isFormData,\n isArrayBufferView,\n isString,\n isNumber,\n isBoolean,\n isObject,\n isPlainObject,\n isEmptyObject,\n isReadableStream,\n isRequest,\n isResponse,\n isHeaders,\n isUndefined,\n isDate,\n isFile,\n isBlob,\n isRegExp,\n isFunction,\n isStream,\n isURLSearchParams,\n isTypedArray,\n isFileList,\n forEach,\n merge,\n extend,\n trim,\n stripBOM,\n inherits,\n toFlatObject,\n kindOf,\n kindOfTest,\n endsWith,\n toArray,\n forEachEntry,\n matchAll,\n isHTMLForm,\n hasOwnProperty,\n hasOwnProp: hasOwnProperty, // an alias to avoid ESLint no-prototype-builtins detection\n reduceDescriptors,\n freezeMethods,\n toObjectSet,\n toCamelCase,\n noop,\n toFiniteNumber,\n findKey,\n global: _global,\n isContextDefined,\n isSpecCompliantForm,\n toJSONObject,\n isAsyncFn,\n isThenable,\n setImmediate: _setImmediate,\n asap,\n isIterable\n};\n","'use strict';\n\nimport utils from '../utils.js';\n\n/**\n * Create an Error with the specified message, config, error code, request and response.\n *\n * @param {string} message The error message.\n * @param {string} [code] The error code (for example, 'ECONNABORTED').\n * @param {Object} [config] The config.\n * @param {Object} [request] The request.\n * @param {Object} [response] The response.\n *\n * @returns {Error} The created error.\n */\nfunction AxiosError(message, code, config, request, response) {\n Error.call(this);\n\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, this.constructor);\n } else {\n this.stack = (new Error()).stack;\n }\n\n this.message = message;\n this.name = 'AxiosError';\n code && (this.code = code);\n config && (this.config = config);\n request && (this.request = request);\n if (response) {\n this.response = response;\n this.status = response.status ? response.status : null;\n }\n}\n\nutils.inherits(AxiosError, Error, {\n toJSON: function toJSON() {\n return {\n // Standard\n message: this.message,\n name: this.name,\n // Microsoft\n description: this.description,\n number: this.number,\n // Mozilla\n fileName: this.fileName,\n lineNumber: this.lineNumber,\n columnNumber: this.columnNumber,\n stack: this.stack,\n // Axios\n config: utils.toJSONObject(this.config),\n code: this.code,\n status: this.status\n };\n }\n});\n\nconst prototype = AxiosError.prototype;\nconst descriptors = {};\n\n[\n 'ERR_BAD_OPTION_VALUE',\n 'ERR_BAD_OPTION',\n 'ECONNABORTED',\n 'ETIMEDOUT',\n 'ERR_NETWORK',\n 'ERR_FR_TOO_MANY_REDIRECTS',\n 'ERR_DEPRECATED',\n 'ERR_BAD_RESPONSE',\n 'ERR_BAD_REQUEST',\n 'ERR_CANCELED',\n 'ERR_NOT_SUPPORT',\n 'ERR_INVALID_URL'\n// eslint-disable-next-line func-names\n].forEach(code => {\n descriptors[code] = {value: code};\n});\n\nObject.defineProperties(AxiosError, descriptors);\nObject.defineProperty(prototype, 'isAxiosError', {value: true});\n\n// eslint-disable-next-line func-names\nAxiosError.from = (error, code, config, request, response, customProps) => {\n const axiosError = Object.create(prototype);\n\n utils.toFlatObject(error, axiosError, function filter(obj) {\n return obj !== Error.prototype;\n }, prop => {\n return prop !== 'isAxiosError';\n });\n\n const msg = error && error.message ? error.message : 'Error';\n\n // Prefer explicit code; otherwise copy the low-level error's code (e.g. ECONNREFUSED)\n const errCode = code == null && error ? error.code : code;\n AxiosError.call(axiosError, msg, errCode, config, request, response);\n\n // Chain the original error on the standard field; non-enumerable to avoid JSON noise\n if (error && axiosError.cause == null) {\n Object.defineProperty(axiosError, 'cause', { value: error, configurable: true });\n }\n\n axiosError.name = (error && error.name) || 'Error';\n\n customProps && Object.assign(axiosError, customProps);\n\n return axiosError;\n};\n\nexport default AxiosError;\n","// eslint-disable-next-line strict\nexport default null;\n","'use strict';\n\nimport utils from '../utils.js';\nimport AxiosError from '../core/AxiosError.js';\n// temporary hotfix to avoid circular references until AxiosURLSearchParams is refactored\nimport PlatformFormData from '../platform/node/classes/FormData.js';\n\n/**\n * Determines if the given thing is a array or js object.\n *\n * @param {string} thing - The object or array to be visited.\n *\n * @returns {boolean}\n */\nfunction isVisitable(thing) {\n return utils.isPlainObject(thing) || utils.isArray(thing);\n}\n\n/**\n * It removes the brackets from the end of a string\n *\n * @param {string} key - The key of the parameter.\n *\n * @returns {string} the key without the brackets.\n */\nfunction removeBrackets(key) {\n return utils.endsWith(key, '[]') ? key.slice(0, -2) : key;\n}\n\n/**\n * It takes a path, a key, and a boolean, and returns a string\n *\n * @param {string} path - The path to the current key.\n * @param {string} key - The key of the current object being iterated over.\n * @param {string} dots - If true, the key will be rendered with dots instead of brackets.\n *\n * @returns {string} The path to the current key.\n */\nfunction renderKey(path, key, dots) {\n if (!path) return key;\n return path.concat(key).map(function each(token, i) {\n // eslint-disable-next-line no-param-reassign\n token = removeBrackets(token);\n return !dots && i ? '[' + token + ']' : token;\n }).join(dots ? '.' : '');\n}\n\n/**\n * If the array is an array and none of its elements are visitable, then it's a flat array.\n *\n * @param {Array<any>} arr - The array to check\n *\n * @returns {boolean}\n */\nfunction isFlatArray(arr) {\n return utils.isArray(arr) && !arr.some(isVisitable);\n}\n\nconst predicates = utils.toFlatObject(utils, {}, null, function filter(prop) {\n return /^is[A-Z]/.test(prop);\n});\n\n/**\n * Convert a data object to FormData\n *\n * @param {Object} obj\n * @param {?Object} [formData]\n * @param {?Object} [options]\n * @param {Function} [options.visitor]\n * @param {Boolean} [options.metaTokens = true]\n * @param {Boolean} [options.dots = false]\n * @param {?Boolean} [options.indexes = false]\n *\n * @returns {Object}\n **/\n\n/**\n * It converts an object into a FormData object\n *\n * @param {Object<any, any>} obj - The object to convert to form data.\n * @param {string} formData - The FormData object to append to.\n * @param {Object<string, any>} options\n *\n * @returns\n */\nfunction toFormData(obj, formData, options) {\n if (!utils.isObject(obj)) {\n throw new TypeError('target must be an object');\n }\n\n // eslint-disable-next-line no-param-reassign\n formData = formData || new (PlatformFormData || FormData)();\n\n // eslint-disable-next-line no-param-reassign\n options = utils.toFlatObject(options, {\n metaTokens: true,\n dots: false,\n indexes: false\n }, false, function defined(option, source) {\n // eslint-disable-next-line no-eq-null,eqeqeq\n return !utils.isUndefined(source[option]);\n });\n\n const metaTokens = options.metaTokens;\n // eslint-disable-next-line no-use-before-define\n const visitor = options.visitor || defaultVisitor;\n const dots = options.dots;\n const indexes = options.indexes;\n const _Blob = options.Blob || typeof Blob !== 'undefined' && Blob;\n const useBlob = _Blob && utils.isSpecCompliantForm(formData);\n\n if (!utils.isFunction(visitor)) {\n throw new TypeError('visitor must be a function');\n }\n\n function convertValue(value) {\n if (value === null) return '';\n\n if (utils.isDate(value)) {\n return value.toISOString();\n }\n\n if (utils.isBoolean(value)) {\n return value.toString();\n }\n\n if (!useBlob && utils.isBlob(value)) {\n throw new AxiosError('Blob is not supported. Use a Buffer instead.');\n }\n\n if (utils.isArrayBuffer(value) || utils.isTypedArray(value)) {\n return useBlob && typeof Blob === 'function' ? new Blob([value]) : Buffer.from(value);\n }\n\n return value;\n }\n\n /**\n * Default visitor.\n *\n * @param {*} value\n * @param {String|Number} key\n * @param {Array<String|Number>} path\n * @this {FormData}\n *\n * @returns {boolean} return true to visit the each prop of the value recursively\n */\n function defaultVisitor(value, key, path) {\n let arr = value;\n\n if (value && !path && typeof value === 'object') {\n if (utils.endsWith(key, '{}')) {\n // eslint-disable-next-line no-param-reassign\n key = metaTokens ? key : key.slice(0, -2);\n // eslint-disable-next-line no-param-reassign\n value = JSON.stringify(value);\n } else if (\n (utils.isArray(value) && isFlatArray(value)) ||\n ((utils.isFileList(value) || utils.endsWith(key, '[]')) && (arr = utils.toArray(value))\n )) {\n // eslint-disable-next-line no-param-reassign\n key = removeBrackets(key);\n\n arr.forEach(function each(el, index) {\n !(utils.isUndefined(el) || el === null) && formData.append(\n // eslint-disable-next-line no-nested-ternary\n indexes === true ? renderKey([key], index, dots) : (indexes === null ? key : key + '[]'),\n convertValue(el)\n );\n });\n return false;\n }\n }\n\n if (isVisitable(value)) {\n return true;\n }\n\n formData.append(renderKey(path, key, dots), convertValue(value));\n\n return false;\n }\n\n const stack = [];\n\n const exposedHelpers = Object.assign(predicates, {\n defaultVisitor,\n convertValue,\n isVisitable\n });\n\n function build(value, path) {\n if (utils.isUndefined(value)) return;\n\n if (stack.indexOf(value) !== -1) {\n throw Error('Circular reference detected in ' + path.join('.'));\n }\n\n stack.push(value);\n\n utils.forEach(value, function each(el, key) {\n const result = !(utils.isUndefined(el) || el === null) && visitor.call(\n formData, el, utils.isString(key) ? key.trim() : key, path, exposedHelpers\n );\n\n if (result === true) {\n build(el, path ? path.concat(key) : [key]);\n }\n });\n\n stack.pop();\n }\n\n if (!utils.isObject(obj)) {\n throw new TypeError('data must be an object');\n }\n\n build(obj);\n\n return formData;\n}\n\nexport default toFormData;\n","'use strict';\n\nimport toFormData from './toFormData.js';\n\n/**\n * It encodes a string by replacing all characters that are not in the unreserved set with\n * their percent-encoded equivalents\n *\n * @param {string} str - The string to encode.\n *\n * @returns {string} The encoded string.\n */\nfunction encode(str) {\n const charMap = {\n '!': '%21',\n \"'\": '%27',\n '(': '%28',\n ')': '%29',\n '~': '%7E',\n '%20': '+',\n '%00': '\\x00'\n };\n return encodeURIComponent(str).replace(/[!'()~]|%20|%00/g, function replacer(match) {\n return charMap[match];\n });\n}\n\n/**\n * It takes a params object and converts it to a FormData object\n *\n * @param {Object<string, any>} params - The parameters to be converted to a FormData object.\n * @param {Object<string, any>} options - The options object passed to the Axios constructor.\n *\n * @returns {void}\n */\nfunction AxiosURLSearchParams(params, options) {\n this._pairs = [];\n\n params && toFormData(params, this, options);\n}\n\nconst prototype = AxiosURLSearchParams.prototype;\n\nprototype.append = function append(name, value) {\n this._pairs.push([name, value]);\n};\n\nprototype.toString = function toString(encoder) {\n const _encode = encoder ? function(value) {\n return encoder.call(this, value, encode);\n } : encode;\n\n return this._pairs.map(function each(pair) {\n return _encode(pair[0]) + '=' + _encode(pair[1]);\n }, '').join('&');\n};\n\nexport default AxiosURLSearchParams;\n","'use strict';\n\nimport utils from '../utils.js';\nimport AxiosURLSearchParams from '../helpers/AxiosURLSearchParams.js';\n\n/**\n * It replaces all instances of the characters `:`, `$`, `,`, `+`, `[`, and `]` with their\n * URI encoded counterparts\n *\n * @param {string} val The value to be encoded.\n *\n * @returns {string} The encoded value.\n */\nfunction encode(val) {\n return encodeURIComponent(val).\n replace(/%3A/gi, ':').\n replace(/%24/g, '$').\n replace(/%2C/gi, ',').\n replace(/%20/g, '+');\n}\n\n/**\n * Build a URL by appending params to the end\n *\n * @param {string} url The base of the url (e.g., http://www.google.com)\n * @param {object} [params] The params to be appended\n * @param {?(object|Function)} options\n *\n * @returns {string} The formatted url\n */\nexport default function buildURL(url, params, options) {\n /*eslint no-param-reassign:0*/\n if (!params) {\n return url;\n }\n \n const _encode = options && options.encode || encode;\n\n if (utils.isFunction(options)) {\n options = {\n serialize: options\n };\n } \n\n const serializeFn = options && options.serialize;\n\n let serializedParams;\n\n if (serializeFn) {\n serializedParams = serializeFn(params, options);\n } else {\n serializedParams = utils.isURLSearchParams(params) ?\n params.toString() :\n new AxiosURLSearchParams(params, options).toString(_encode);\n }\n\n if (serializedParams) {\n const hashmarkIndex = url.indexOf(\"#\");\n\n if (hashmarkIndex !== -1) {\n url = url.slice(0, hashmarkIndex);\n }\n url += (url.indexOf('?') === -1 ? '?' : '&') + serializedParams;\n }\n\n return url;\n}\n","'use strict';\n\nimport utils from './../utils.js';\n\nclass InterceptorManager {\n constructor() {\n this.handlers = [];\n }\n\n /**\n * Add a new interceptor to the stack\n *\n * @param {Function} fulfilled The function to handle `then` for a `Promise`\n * @param {Function} rejected The function to handle `reject` for a `Promise`\n *\n * @return {Number} An ID used to remove interceptor later\n */\n use(fulfilled, rejected, options) {\n this.handlers.push({\n fulfilled,\n rejected,\n synchronous: options ? options.synchronous : false,\n runWhen: options ? options.runWhen : null\n });\n return this.handlers.length - 1;\n }\n\n /**\n * Remove an interceptor from the stack\n *\n * @param {Number} id The ID that was returned by `use`\n *\n * @returns {Boolean} `true` if the interceptor was removed, `false` otherwise\n */\n eject(id) {\n if (this.handlers[id]) {\n this.handlers[id] = null;\n }\n }\n\n /**\n * Clear all interceptors from the stack\n *\n * @returns {void}\n */\n clear() {\n if (this.handlers) {\n this.handlers = [];\n }\n }\n\n /**\n * Iterate over all the registered interceptors\n *\n * This method is particularly useful for skipping over any\n * interceptors that may have become `null` calling `eject`.\n *\n * @param {Function} fn The function to call for each interceptor\n *\n * @returns {void}\n */\n forEach(fn) {\n utils.forEach(this.handlers, function forEachHandler(h) {\n if (h !== null) {\n fn(h);\n }\n });\n }\n}\n\nexport default InterceptorManager;\n","'use strict';\n\nexport default {\n silentJSONParsing: true,\n forcedJSONParsing: true,\n clarifyTimeoutError: false\n};\n","import URLSearchParams from './classes/URLSearchParams.js'\nimport FormData from './classes/FormData.js'\nimport Blob from './classes/Blob.js'\n\nexport default {\n isBrowser: true,\n classes: {\n URLSearchParams,\n FormData,\n Blob\n },\n protocols: ['http', 'https', 'file', 'blob', 'url', 'data']\n};\n","'use strict';\n\nimport AxiosURLSearchParams from '../../../helpers/AxiosURLSearchParams.js';\nexport default typeof URLSearchParams !== 'undefined' ? URLSearchParams : AxiosURLSearchParams;\n","'use strict';\n\nexport default typeof FormData !== 'undefined' ? FormData : null;\n","'use strict'\n\nexport default typeof Blob !== 'undefined' ? Blob : null\n","const hasBrowserEnv = typeof window !== 'undefined' && typeof document !== 'undefined';\n\nconst _navigator = typeof navigator === 'object' && navigator || undefined;\n\n/**\n * Determine if we're running in a standard browser environment\n *\n * This allows axios to run in a web worker, and react-native.\n * Both environments support XMLHttpRequest, but not fully standard globals.\n *\n * web workers:\n * typeof window -> undefined\n * typeof document -> undefined\n *\n * react-native:\n * navigator.product -> 'ReactNative'\n * nativescript\n * navigator.product -> 'NativeScript' or 'NS'\n *\n * @returns {boolean}\n */\nconst hasStandardBrowserEnv = hasBrowserEnv &&\n (!_navigator || ['ReactNative', 'NativeScript', 'NS'].indexOf(_navigator.product) < 0);\n\n/**\n * Determine if we're running in a standard browser webWorker environment\n *\n * Although the `isStandardBrowserEnv` method indicates that\n * `allows axios to run in a web worker`, the WebWorker will still be\n * filtered out due to its judgment standard\n * `typeof window !== 'undefined' && typeof document !== 'undefined'`.\n * This leads to a problem when axios post `FormData` in webWorker\n */\nconst hasStandardBrowserWebWorkerEnv = (() => {\n return (\n typeof WorkerGlobalScope !== 'undefined' &&\n // eslint-disable-next-line no-undef\n self instanceof WorkerGlobalScope &&\n typeof self.importScripts === 'function'\n );\n})();\n\nconst origin = hasBrowserEnv && window.location.href || 'http://localhost';\n\nexport {\n hasBrowserEnv,\n hasStandardBrowserWebWorkerEnv,\n hasStandardBrowserEnv,\n _navigator as navigator,\n origin\n}\n","import platform from './node/index.js';\nimport * as utils from './common/utils.js';\n\nexport default {\n ...utils,\n ...platform\n}\n","'use strict';\n\nimport utils from '../utils.js';\nimport toFormData from './toFormData.js';\nimport platform from '../platform/index.js';\n\nexport default function toURLEncodedForm(data, options) {\n return toFormData(data, new platform.classes.URLSearchParams(), {\n visitor: function(value, key, path, helpers) {\n if (platform.isNode && utils.isBuffer(value)) {\n this.append(key, value.toString('base64'));\n return false;\n }\n\n return helpers.defaultVisitor.apply(this, arguments);\n },\n ...options\n });\n}\n","'use strict';\n\nimport utils from '../utils.js';\n\n/**\n * It takes a string like `foo[x][y][z]` and returns an array like `['foo', 'x', 'y', 'z']\n *\n * @param {string} name - The name of the property to get.\n *\n * @returns An array of strings.\n */\nfunction parsePropPath(name) {\n // foo[x][y][z]\n // foo.x.y.z\n // foo-x-y-z\n // foo x y z\n return utils.matchAll(/\\w+|\\[(\\w*)]/g, name).map(match => {\n return match[0] === '[]' ? '' : match[1] || match[0];\n });\n}\n\n/**\n * Convert an array to an object.\n *\n * @param {Array<any>} arr - The array to convert to an object.\n *\n * @returns An object with the same keys and values as the array.\n */\nfunction arrayToObject(arr) {\n const obj = {};\n const keys = Object.keys(arr);\n let i;\n const len = keys.length;\n let key;\n for (i = 0; i < len; i++) {\n key = keys[i];\n obj[key] = arr[key];\n }\n return obj;\n}\n\n/**\n * It takes a FormData object and returns a JavaScript object\n *\n * @param {string} formData The FormData object to convert to JSON.\n *\n * @returns {Object<string, any> | null} The converted object.\n */\nfunction formDataToJSON(formData) {\n function buildPath(path, value, target, index) {\n let name = path[index++];\n\n if (name === '__proto__') return true;\n\n const isNumericKey = Number.isFinite(+name);\n const isLast = index >= path.length;\n name = !name && utils.isArray(target) ? target.length : name;\n\n if (isLast) {\n if (utils.hasOwnProp(target, name)) {\n target[name] = [target[name], value];\n } else {\n target[name] = value;\n }\n\n return !isNumericKey;\n }\n\n if (!target[name] || !utils.isObject(target[name])) {\n target[name] = [];\n }\n\n const result = buildPath(path, value, target[name], index);\n\n if (result && utils.isArray(target[name])) {\n target[name] = arrayToObject(target[name]);\n }\n\n return !isNumericKey;\n }\n\n if (utils.isFormData(formData) && utils.isFunction(formData.entries)) {\n const obj = {};\n\n utils.forEachEntry(formData, (name, value) => {\n buildPath(parsePropPath(name), value, obj, 0);\n });\n\n return obj;\n }\n\n return null;\n}\n\nexport default formDataToJSON;\n","'use strict';\n\nimport utils from '../utils.js';\nimport AxiosError from '../core/AxiosError.js';\nimport transitionalDefaults from './transitional.js';\nimport toFormData from '../helpers/toFormData.js';\nimport toURLEncodedForm from '../helpers/toURLEncodedForm.js';\nimport platform from '../platform/index.js';\nimport formDataToJSON from '../helpers/formDataToJSON.js';\n\n/**\n * It takes a string, tries to parse it, and if it fails, it returns the stringified version\n * of the input\n *\n * @param {any} rawValue - The value to be stringified.\n * @param {Function} parser - A function that parses a string into a JavaScript object.\n * @param {Function} encoder - A function that takes a value and returns a string.\n *\n * @returns {string} A stringified version of the rawValue.\n */\nfunction stringifySafely(rawValue, parser, encoder) {\n if (utils.isString(rawValue)) {\n try {\n (parser || JSON.parse)(rawValue);\n return utils.trim(rawValue);\n } catch (e) {\n if (e.name !== 'SyntaxError') {\n throw e;\n }\n }\n }\n\n return (encoder || JSON.stringify)(rawValue);\n}\n\nconst defaults = {\n\n transitional: transitionalDefaults,\n\n adapter: ['xhr', 'http', 'fetch'],\n\n transformRequest: [function transformRequest(data, headers) {\n const contentType = headers.getContentType() || '';\n const hasJSONContentType = contentType.indexOf('application/json') > -1;\n const isObjectPayload = utils.isObject(data);\n\n if (isObjectPayload && utils.isHTMLForm(data)) {\n data = new FormData(data);\n }\n\n const isFormData = utils.isFormData(data);\n\n if (isFormData) {\n return hasJSONContentType ? JSON.stringify(formDataToJSON(data)) : data;\n }\n\n if (utils.isArrayBuffer(data) ||\n utils.isBuffer(data) ||\n utils.isStream(data) ||\n utils.isFile(data) ||\n utils.isBlob(data) ||\n utils.isReadableStream(data)\n ) {\n return data;\n }\n if (utils.isArrayBufferView(data)) {\n return data.buffer;\n }\n if (utils.isURLSearchParams(data)) {\n headers.setContentType('application/x-www-form-urlencoded;charset=utf-8', false);\n return data.toString();\n }\n\n let isFileList;\n\n if (isObjectPayload) {\n if (contentType.indexOf('application/x-www-form-urlencoded') > -1) {\n return toURLEncodedForm(data, this.formSerializer).toString();\n }\n\n if ((isFileList = utils.isFileList(data)) || contentType.indexOf('multipart/form-data') > -1) {\n const _FormData = this.env && this.env.FormData;\n\n return toFormData(\n isFileList ? {'files[]': data} : data,\n _FormData && new _FormData(),\n this.formSerializer\n );\n }\n }\n\n if (isObjectPayload || hasJSONContentType ) {\n headers.setContentType('application/json', false);\n return stringifySafely(data);\n }\n\n return data;\n }],\n\n transformResponse: [function transformResponse(data) {\n const transitional = this.transitional || defaults.transitional;\n const forcedJSONParsing = transitional && transitional.forcedJSONParsing;\n const JSONRequested = this.responseType === 'json';\n\n if (utils.isResponse(data) || utils.isReadableStream(data)) {\n return data;\n }\n\n if (data && utils.isString(data) && ((forcedJSONParsing && !this.responseType) || JSONRequested)) {\n const silentJSONParsing = transitional && transitional.silentJSONParsing;\n const strictJSONParsing = !silentJSONParsing && JSONRequested;\n\n try {\n return JSON.parse(data, this.parseReviver);\n } catch (e) {\n if (strictJSONParsing) {\n if (e.name === 'SyntaxError') {\n throw AxiosError.from(e, AxiosError.ERR_BAD_RESPONSE, this, null, this.response);\n }\n throw e;\n }\n }\n }\n\n return data;\n }],\n\n /**\n * A timeout in milliseconds to abort a request. If set to 0 (default) a\n * timeout is not created.\n */\n timeout: 0,\n\n xsrfCookieName: 'XSRF-TOKEN',\n xsrfHeaderName: 'X-XSRF-TOKEN',\n\n maxContentLength: -1,\n maxBodyLength: -1,\n\n env: {\n FormData: platform.classes.FormData,\n Blob: platform.classes.Blob\n },\n\n validateStatus: function validateStatus(status) {\n return status >= 200 && status < 300;\n },\n\n headers: {\n common: {\n 'Accept': 'application/json, text/plain, */*',\n 'Content-Type': undefined\n }\n }\n};\n\nutils.forEach(['delete', 'get', 'head', 'post', 'put', 'patch'], (method) => {\n defaults.headers[method] = {};\n});\n\nexport default defaults;\n","'use strict';\n\nimport utils from './../utils.js';\n\n// RawAxiosHeaders whose duplicates are ignored by node\n// c.f. https://nodejs.org/api/http.html#http_message_headers\nconst ignoreDuplicateOf = utils.toObjectSet([\n 'age', 'authorization', 'content-length', 'content-type', 'etag',\n 'expires', 'from', 'host', 'if-modified-since', 'if-unmodified-since',\n 'last-modified', 'location', 'max-forwards', 'proxy-authorization',\n 'referer', 'retry-after', 'user-agent'\n]);\n\n/**\n * Parse headers into an object\n *\n * ```\n * Date: Wed, 27 Aug 2014 08:58:49 GMT\n * Content-Type: application/json\n * Connection: keep-alive\n * Transfer-Encoding: chunked\n * ```\n *\n * @param {String} rawHeaders Headers needing to be parsed\n *\n * @returns {Object} Headers parsed into an object\n */\nexport default rawHeaders => {\n const parsed = {};\n let key;\n let val;\n let i;\n\n rawHeaders && rawHeaders.split('\\n').forEach(function parser(line) {\n i = line.indexOf(':');\n key = line.substring(0, i).trim().toLowerCase();\n val = line.substring(i + 1).trim();\n\n if (!key || (parsed[key] && ignoreDuplicateOf[key])) {\n return;\n }\n\n if (key === 'set-cookie') {\n if (parsed[key]) {\n parsed[key].push(val);\n } else {\n parsed[key] = [val];\n }\n } else {\n parsed[key] = parsed[key] ? parsed[key] + ', ' + val : val;\n }\n });\n\n return parsed;\n};\n","'use strict';\n\nimport utils from '../utils.js';\nimport parseHeaders from '../helpers/parseHeaders.js';\n\nconst $internals = Symbol('internals');\n\nfunction normalizeHeader(header) {\n return header && String(header).trim().toLowerCase();\n}\n\nfunction normalizeValue(value) {\n if (value === false || value == null) {\n return value;\n }\n\n return utils.isArray(value) ? value.map(normalizeValue) : String(value);\n}\n\nfunction parseTokens(str) {\n const tokens = Object.create(null);\n const tokensRE = /([^\\s,;=]+)\\s*(?:=\\s*([^,;]+))?/g;\n let match;\n\n while ((match = tokensRE.exec(str))) {\n tokens[match[1]] = match[2];\n }\n\n return tokens;\n}\n\nconst isValidHeaderName = (str) => /^[-_a-zA-Z0-9^`|~,!#$%&'*+.]+$/.test(str.trim());\n\nfunction matchHeaderValue(context, value, header, filter, isHeaderNameFilter) {\n if (utils.isFunction(filter)) {\n return filter.call(this, value, header);\n }\n\n if (isHeaderNameFilter) {\n value = header;\n }\n\n if (!utils.isString(value)) return;\n\n if (utils.isString(filter)) {\n return value.indexOf(filter) !== -1;\n }\n\n if (utils.isRegExp(filter)) {\n return filter.test(value);\n }\n}\n\nfunction formatHeader(header) {\n return header.trim()\n .toLowerCase().replace(/([a-z\\d])(\\w*)/g, (w, char, str) => {\n return char.toUpperCase() + str;\n });\n}\n\nfunction buildAccessors(obj, header) {\n const accessorName = utils.toCamelCase(' ' + header);\n\n ['get', 'set', 'has'].forEach(methodName => {\n Object.defineProperty(obj, methodName + accessorName, {\n value: function(arg1, arg2, arg3) {\n return this[methodName].call(this, header, arg1, arg2, arg3);\n },\n configurable: true\n });\n });\n}\n\nclass AxiosHeaders {\n constructor(headers) {\n headers && this.set(headers);\n }\n\n set(header, valueOrRewrite, rewrite) {\n const self = this;\n\n function setHeader(_value, _header, _rewrite) {\n const lHeader = normalizeHeader(_header);\n\n if (!lHeader) {\n throw new Error('header name must be a non-empty string');\n }\n\n const key = utils.findKey(self, lHeader);\n\n if(!key || self[key] === undefined || _rewrite === true || (_rewrite === undefined && self[key] !== false)) {\n self[key || _header] = normalizeValue(_value);\n }\n }\n\n const setHeaders = (headers, _rewrite) =>\n utils.forEach(headers, (_value, _header) => setHeader(_value, _header, _rewrite));\n\n if (utils.isPlainObject(header) || header instanceof this.constructor) {\n setHeaders(header, valueOrRewrite)\n } else if(utils.isString(header) && (header = header.trim()) && !isValidHeaderName(header)) {\n setHeaders(parseHeaders(header), valueOrRewrite);\n } else if (utils.isObject(header) && utils.isIterable(header)) {\n let obj = {}, dest, key;\n for (const entry of header) {\n if (!utils.isArray(entry)) {\n throw TypeError('Object iterator must return a key-value pair');\n }\n\n obj[key = entry[0]] = (dest = obj[key]) ?\n (utils.isArray(dest) ? [...dest, entry[1]] : [dest, entry[1]]) : entry[1];\n }\n\n setHeaders(obj, valueOrRewrite)\n } else {\n header != null && setHeader(valueOrRewrite, header, rewrite);\n }\n\n return this;\n }\n\n get(header, parser) {\n header = normalizeHeader(header);\n\n if (header) {\n const key = utils.findKey(this, header);\n\n if (key) {\n const value = this[key];\n\n if (!parser) {\n return value;\n }\n\n if (parser === true) {\n return parseTokens(value);\n }\n\n if (utils.isFunction(parser)) {\n return parser.call(this, value, key);\n }\n\n if (utils.isRegExp(parser)) {\n return parser.exec(value);\n }\n\n throw new TypeError('parser must be boolean|regexp|function');\n }\n }\n }\n\n has(header, matcher) {\n header = normalizeHeader(header);\n\n if (header) {\n const key = utils.findKey(this, header);\n\n return !!(key && this[key] !== undefined && (!matcher || matchHeaderValue(this, this[key], key, matcher)));\n }\n\n return false;\n }\n\n delete(header, matcher) {\n const self = this;\n let deleted = false;\n\n function deleteHeader(_header) {\n _header = normalizeHeader(_header);\n\n if (_header) {\n const key = utils.findKey(self, _header);\n\n if (key && (!matcher || matchHeaderValue(self, self[key], key, matcher))) {\n delete self[key];\n\n deleted = true;\n }\n }\n }\n\n if (utils.isArray(header)) {\n header.forEach(deleteHeader);\n } else {\n deleteHeader(header);\n }\n\n return deleted;\n }\n\n clear(matcher) {\n const keys = Object.keys(this);\n let i = keys.length;\n let deleted = false;\n\n while (i--) {\n const key = keys[i];\n if(!matcher || matchHeaderValue(this, this[key], key, matcher, true)) {\n delete this[key];\n deleted = true;\n }\n }\n\n return deleted;\n }\n\n normalize(format) {\n const self = this;\n const headers = {};\n\n utils.forEach(this, (value, header) => {\n const key = utils.findKey(headers, header);\n\n if (key) {\n self[key] = normalizeValue(value);\n delete self[header];\n return;\n }\n\n const normalized = format ? formatHeader(header) : String(header).trim();\n\n if (normalized !== header) {\n delete self[header];\n }\n\n self[normalized] = normalizeValue(value);\n\n headers[normalized] = true;\n });\n\n return this;\n }\n\n concat(...targets) {\n return this.constructor.concat(this, ...targets);\n }\n\n toJSON(asStrings) {\n const obj = Object.create(null);\n\n utils.forEach(this, (value, header) => {\n value != null && value !== false && (obj[header] = asStrings && utils.isArray(value) ? value.join(', ') : value);\n });\n\n return obj;\n }\n\n [Symbol.iterator]() {\n return Object.entries(this.toJSON())[Symbol.iterator]();\n }\n\n toString() {\n return Object.entries(this.toJSON()).map(([header, value]) => header + ': ' + value).join('\\n');\n }\n\n getSetCookie() {\n return this.get(\"set-cookie\") || [];\n }\n\n get [Symbol.toStringTag]() {\n return 'AxiosHeaders';\n }\n\n static from(thing) {\n return thing instanceof this ? thing : new this(thing);\n }\n\n static concat(first, ...targets) {\n const computed = new this(first);\n\n targets.forEach((target) => computed.set(target));\n\n return computed;\n }\n\n static accessor(header) {\n const internals = this[$internals] = (this[$internals] = {\n accessors: {}\n });\n\n const accessors = internals.accessors;\n const prototype = this.prototype;\n\n function defineAccessor(_header) {\n const lHeader = normalizeHeader(_header);\n\n if (!accessors[lHeader]) {\n buildAccessors(prototype, _header);\n accessors[lHeader] = true;\n }\n }\n\n utils.isArray(header) ? header.forEach(defineAccessor) : defineAccessor(header);\n\n return this;\n }\n}\n\nAxiosHeaders.accessor(['Content-Type', 'Content-Length', 'Accept', 'Accept-Encoding', 'User-Agent', 'Authorization']);\n\n// reserved names hotfix\nutils.reduceDescriptors(AxiosHeaders.prototype, ({value}, key) => {\n let mapped = key[0].toUpperCase() + key.slice(1); // map `set` => `Set`\n return {\n get: () => value,\n set(headerValue) {\n this[mapped] = headerValue;\n }\n }\n});\n\nutils.freezeMethods(AxiosHeaders);\n\nexport default AxiosHeaders;\n","'use strict';\n\nimport utils from './../utils.js';\nimport defaults from '../defaults/index.js';\nimport AxiosHeaders from '../core/AxiosHeaders.js';\n\n/**\n * Transform the data for a request or a response\n *\n * @param {Array|Function} fns A single function or Array of functions\n * @param {?Object} response The response object\n *\n * @returns {*} The resulting transformed data\n */\nexport default function transformData(fns, response) {\n const config = this || defaults;\n const context = response || config;\n const headers = AxiosHeaders.from(context.headers);\n let data = context.data;\n\n utils.forEach(fns, function transform(fn) {\n data = fn.call(config, data, headers.normalize(), response ? response.status : undefined);\n });\n\n headers.normalize();\n\n return data;\n}\n","'use strict';\n\nexport default function isCancel(value) {\n return !!(value && value.__CANCEL__);\n}\n","'use strict';\n\nimport AxiosError from '../core/AxiosError.js';\nimport utils from '../utils.js';\n\n/**\n * A `CanceledError` is an object that is thrown when an operation is canceled.\n *\n * @param {string=} message The message.\n * @param {Object=} config The config.\n * @param {Object=} request The request.\n *\n * @returns {CanceledError} The created error.\n */\nfunction CanceledError(message, config, request) {\n // eslint-disable-next-line no-eq-null,eqeqeq\n AxiosError.call(this, message == null ? 'canceled' : message, AxiosError.ERR_CANCELED, config, request);\n this.name = 'CanceledError';\n}\n\nutils.inherits(CanceledError, AxiosError, {\n __CANCEL__: true\n});\n\nexport default CanceledError;\n","'use strict';\n\nimport AxiosError from './AxiosError.js';\n\n/**\n * Resolve or reject a Promise based on response status.\n *\n * @param {Function} resolve A function that resolves the promise.\n * @param {Function} reject A function that rejects the promise.\n * @param {object} response The response.\n *\n * @returns {object} The response.\n */\nexport default function settle(resolve, reject, response) {\n const validateStatus = response.config.validateStatus;\n if (!response.status || !validateStatus || validateStatus(response.status)) {\n resolve(response);\n } else {\n reject(new AxiosError(\n 'Request failed with status code ' + response.status,\n [AxiosError.ERR_BAD_REQUEST, AxiosError.ERR_BAD_RESPONSE][Math.floor(response.status / 100) - 4],\n response.config,\n response.request,\n response\n ));\n }\n}\n","'use strict';\n\nexport default function parseProtocol(url) {\n const match = /^([-+\\w]{1,25})(:?\\/\\/|:)/.exec(url);\n return match && match[1] || '';\n}\n","'use strict';\n\n/**\n * Calculate data maxRate\n * @param {Number} [samplesCount= 10]\n * @param {Number} [min= 1000]\n * @returns {Function}\n */\nfunction speedometer(samplesCount, min) {\n samplesCount = samplesCount || 10;\n const bytes = new Array(samplesCount);\n const timestamps = new Array(samplesCount);\n let head = 0;\n let tail = 0;\n let firstSampleTS;\n\n min = min !== undefined ? min : 1000;\n\n return function push(chunkLength) {\n const now = Date.now();\n\n const startedAt = timestamps[tail];\n\n if (!firstSampleTS) {\n firstSampleTS = now;\n }\n\n bytes[head] = chunkLength;\n timestamps[head] = now;\n\n let i = tail;\n let bytesCount = 0;\n\n while (i !== head) {\n bytesCount += bytes[i++];\n i = i % samplesCount;\n }\n\n head = (head + 1) % samplesCount;\n\n if (head === tail) {\n tail = (tail + 1) % samplesCount;\n }\n\n if (now - firstSampleTS < min) {\n return;\n }\n\n const passed = startedAt && now - startedAt;\n\n return passed ? Math.round(bytesCount * 1000 / passed) : undefined;\n };\n}\n\nexport default speedometer;\n","/**\n * Throttle decorator\n * @param {Function} fn\n * @param {Number} freq\n * @return {Function}\n */\nfunction throttle(fn, freq) {\n let timestamp = 0;\n let threshold = 1000 / freq;\n let lastArgs;\n let timer;\n\n const invoke = (args, now = Date.now()) => {\n timestamp = now;\n lastArgs = null;\n if (timer) {\n clearTimeout(timer);\n timer = null;\n }\n fn(...args);\n }\n\n const throttled = (...args) => {\n const now = Date.now();\n const passed = now - timestamp;\n if ( passed >= threshold) {\n invoke(args, now);\n } else {\n lastArgs = args;\n if (!timer) {\n timer = setTimeout(() => {\n timer = null;\n invoke(lastArgs)\n }, threshold - passed);\n }\n }\n }\n\n const flush = () => lastArgs && invoke(lastArgs);\n\n return [throttled, flush];\n}\n\nexport default throttle;\n","import speedometer from \"./speedometer.js\";\nimport throttle from \"./throttle.js\";\nimport utils from \"../utils.js\";\n\nexport const progressEventReducer = (listener, isDownloadStream, freq = 3) => {\n let bytesNotified = 0;\n const _speedometer = speedometer(50, 250);\n\n return throttle(e => {\n const loaded = e.loaded;\n const total = e.lengthComputable ? e.total : undefined;\n const progressBytes = loaded - bytesNotified;\n const rate = _speedometer(progressBytes);\n const inRange = loaded <= total;\n\n bytesNotified = loaded;\n\n const data = {\n loaded,\n total,\n progress: total ? (loaded / total) : undefined,\n bytes: progressBytes,\n rate: rate ? rate : undefined,\n estimated: rate && total && inRange ? (total - loaded) / rate : undefined,\n event: e,\n lengthComputable: total != null,\n [isDownloadStream ? 'download' : 'upload']: true\n };\n\n listener(data);\n }, freq);\n}\n\nexport const progressEventDecorator = (total, throttled) => {\n const lengthComputable = total != null;\n\n return [(loaded) => throttled[0]({\n lengthComputable,\n total,\n loaded\n }), throttled[1]];\n}\n\nexport const asyncDecorator = (fn) => (...args) => utils.asap(() => fn(...args));\n","import platform from '../platform/index.js';\n\nexport default platform.hasStandardBrowserEnv ? ((origin, isMSIE) => (url) => {\n url = new URL(url, platform.origin);\n\n return (\n origin.protocol === url.protocol &&\n origin.host === url.host &&\n (isMSIE || origin.port === url.port)\n );\n})(\n new URL(platform.origin),\n platform.navigator && /(msie|trident)/i.test(platform.navigator.userAgent)\n) : () => true;\n","import utils from './../utils.js';\nimport platform from '../platform/index.js';\n\nexport default platform.hasStandardBrowserEnv ?\n\n // Standard browser envs support document.cookie\n {\n write(name, value, expires, path, domain, secure) {\n const cookie = [name + '=' + encodeURIComponent(value)];\n\n utils.isNumber(expires) && cookie.push('expires=' + new Date(expires).toGMTString());\n\n utils.isString(path) && cookie.push('path=' + path);\n\n utils.isString(domain) && cookie.push('domain=' + domain);\n\n secure === true && cookie.push('secure');\n\n document.cookie = cookie.join('; ');\n },\n\n read(name) {\n const match = document.cookie.match(new RegExp('(^|;\\\\s*)(' + name + ')=([^;]*)'));\n return (match ? decodeURIComponent(match[3]) : null);\n },\n\n remove(name) {\n this.write(name, '', Date.now() - 86400000);\n }\n }\n\n :\n\n // Non-standard browser env (web workers, react-native) lack needed support.\n {\n write() {},\n read() {\n return null;\n },\n remove() {}\n };\n\n","'use strict';\n\n/**\n * Determines whether the specified URL is absolute\n *\n * @param {string} url The URL to test\n *\n * @returns {boolean} True if the specified URL is absolute, otherwise false\n */\nexport default function isAbsoluteURL(url) {\n // A URL is considered absolute if it begins with \"<scheme>://\" or \"//\" (protocol-relative URL).\n // RFC 3986 defines scheme name as a sequence of characters beginning with a letter and followed\n // by any combination of letters, digits, plus, period, or hyphen.\n return /^([a-z][a-z\\d+\\-.]*:)?\\/\\//i.test(url);\n}\n","'use strict';\n\n/**\n * Creates a new URL by combining the specified URLs\n *\n * @param {string} baseURL The base URL\n * @param {string} relativeURL The relative URL\n *\n * @returns {string} The combined URL\n */\nexport default function combineURLs(baseURL, relativeURL) {\n return relativeURL\n ? baseURL.replace(/\\/?\\/$/, '') + '/' + relativeURL.replace(/^\\/+/, '')\n : baseURL;\n}\n","'use strict';\n\nimport isAbsoluteURL from '../helpers/isAbsoluteURL.js';\nimport combineURLs from '../helpers/combineURLs.js';\n\n/**\n * Creates a new URL by combining the baseURL with the requestedURL,\n * only when the requestedURL is not already an absolute URL.\n * If the requestURL is absolute, this function returns the requestedURL untouched.\n *\n * @param {string} baseURL The base URL\n * @param {string} requestedURL Absolute or relative URL to combine\n *\n * @returns {string} The combined full path\n */\nexport default function buildFullPath(baseURL, requestedURL, allowAbsoluteUrls) {\n let isRelativeUrl = !isAbsoluteURL(requestedURL);\n if (baseURL && (isRelativeUrl || allowAbsoluteUrls == false)) {\n return combineURLs(baseURL, requestedURL);\n }\n return requestedURL;\n}\n","'use strict';\n\nimport utils from '../utils.js';\nimport AxiosHeaders from \"./AxiosHeaders.js\";\n\nconst headersToObject = (thing) => thing instanceof AxiosHeaders ? { ...thing } : thing;\n\n/**\n * Config-specific merge-function which creates a new config-object\n * by merging two configuration objects together.\n *\n * @param {Object} config1\n * @param {Object} config2\n *\n * @returns {Object} New object resulting from merging config2 to config1\n */\nexport default function mergeConfig(config1, config2) {\n // eslint-disable-next-line no-param-reassign\n config2 = config2 || {};\n const config = {};\n\n function getMergedValue(target, source, prop, caseless) {\n if (utils.isPlainObject(target) && utils.isPlainObject(source)) {\n return utils.merge.call({caseless}, target, source);\n } else if (utils.isPlainObject(source)) {\n return utils.merge({}, source);\n } else if (utils.isArray(source)) {\n return source.slice();\n }\n return source;\n }\n\n // eslint-disable-next-line consistent-return\n function mergeDeepProperties(a, b, prop , caseless) {\n if (!utils.isUndefined(b)) {\n return getMergedValue(a, b, prop , caseless);\n } else if (!utils.isUndefined(a)) {\n return getMergedValue(undefined, a, prop , caseless);\n }\n }\n\n // eslint-disable-next-line consistent-return\n function valueFromConfig2(a, b) {\n if (!utils.isUndefined(b)) {\n return getMergedValue(undefined, b);\n }\n }\n\n // eslint-disable-next-line consistent-return\n function defaultToConfig2(a, b) {\n if (!utils.isUndefined(b)) {\n return getMergedValue(undefined, b);\n } else if (!utils.isUndefined(a)) {\n return getMergedValue(undefined, a);\n }\n }\n\n // eslint-disable-next-line consistent-return\n function mergeDirectKeys(a, b, prop) {\n if (prop in config2) {\n return getMergedValue(a, b);\n } else if (prop in config1) {\n return getMergedValue(undefined, a);\n }\n }\n\n const mergeMap = {\n url: valueFromConfig2,\n method: valueFromConfig2,\n data: valueFromConfig2,\n baseURL: defaultToConfig2,\n transformRequest: defaultToConfig2,\n transformResponse: defaultToConfig2,\n paramsSerializer: defaultToConfig2,\n timeout: defaultToConfig2,\n timeoutMessage: defaultToConfig2,\n withCredentials: defaultToConfig2,\n withXSRFToken: defaultToConfig2,\n adapter: defaultToConfig2,\n responseType: defaultToConfig2,\n xsrfCookieName: defaultToConfig2,\n xsrfHeaderName: defaultToConfig2,\n onUploadProgress: defaultToConfig2,\n onDownloadProgress: defaultToConfig2,\n decompress: defaultToConfig2,\n maxContentLength: defaultToConfig2,\n maxBodyLength: defaultToConfig2,\n beforeRedirect: defaultToConfig2,\n transport: defaultToConfig2,\n httpAgent: defaultToConfig2,\n httpsAgent: defaultToConfig2,\n cancelToken: defaultToConfig2,\n socketPath: defaultToConfig2,\n responseEncoding: defaultToConfig2,\n validateStatus: mergeDirectKeys,\n headers: (a, b , prop) => mergeDeepProperties(headersToObject(a), headersToObject(b),prop, true)\n };\n\n utils.forEach(Object.keys({...config1, ...config2}), function computeConfigValue(prop) {\n const merge = mergeMap[prop] || mergeDeepProperties;\n const configValue = merge(config1[prop], config2[prop], prop);\n (utils.isUndefined(configValue) && merge !== mergeDirectKeys) || (config[prop] = configValue);\n });\n\n return config;\n}\n","import platform from \"../platform/index.js\";\nimport utils from \"../utils.js\";\nimport isURLSameOrigin from \"./isURLSameOrigin.js\";\nimport cookies from \"./cookies.js\";\nimport buildFullPath from \"../core/buildFullPath.js\";\nimport mergeConfig from \"../core/mergeConfig.js\";\nimport AxiosHeaders from \"../core/AxiosHeaders.js\";\nimport buildURL from \"./buildURL.js\";\n\nexport default (config) => {\n const newConfig = mergeConfig({}, config);\n\n let { data, withXSRFToken, xsrfHeaderName, xsrfCookieName, headers, auth } = newConfig;\n\n newConfig.headers = headers = AxiosHeaders.from(headers);\n\n newConfig.url = buildURL(buildFullPath(newConfig.baseURL, newConfig.url, newConfig.allowAbsoluteUrls), config.params, config.paramsSerializer);\n\n // HTTP basic authentication\n if (auth) {\n headers.set('Authorization', 'Basic ' +\n btoa((auth.username || '') + ':' + (auth.password ? unescape(encodeURIComponent(auth.password)) : ''))\n );\n }\n\n if (utils.isFormData(data)) {\n if (platform.hasStandardBrowserEnv || platform.hasStandardBrowserWebWorkerEnv) {\n headers.setContentType(undefined); // browser handles it\n } else if (utils.isFunction(data.getHeaders)) {\n // Node.js FormData (like form-data package)\n const formHeaders = data.getHeaders();\n // Only set safe headers to avoid overwriting security headers\n const allowedHeaders = ['content-type', 'content-length'];\n Object.entries(formHeaders).forEach(([key, val]) => {\n if (allowedHeaders.includes(key.toLowerCase())) {\n headers.set(key, val);\n }\n });\n }\n } \n\n // Add xsrf header\n // This is only done if running in a standard browser environment.\n // Specifically not if we're in a web worker, or react-native.\n\n if (platform.hasStandardBrowserEnv) {\n withXSRFToken && utils.isFunction(withXSRFToken) && (withXSRFToken = withXSRFToken(newConfig));\n\n if (withXSRFToken || (withXSRFToken !== false && isURLSameOrigin(newConfig.url))) {\n // Add xsrf header\n const xsrfValue = xsrfHeaderName && xsrfCookieName && cookies.read(xsrfCookieName);\n\n if (xsrfValue) {\n headers.set(xsrfHeaderName, xsrfValue);\n }\n }\n }\n\n return newConfig;\n}\n\n","import utils from './../utils.js';\nimport settle from './../core/settle.js';\nimport transitionalDefaults from '../defaults/transitional.js';\nimport AxiosError from '../core/AxiosError.js';\nimport CanceledError from '../cancel/CanceledError.js';\nimport parseProtocol from '../helpers/parseProtocol.js';\nimport platform from '../platform/index.js';\nimport AxiosHeaders from '../core/AxiosHeaders.js';\nimport {progressEventReducer} from '../helpers/progressEventReducer.js';\nimport resolveConfig from \"../helpers/resolveConfig.js\";\n\nconst isXHRAdapterSupported = typeof XMLHttpRequest !== 'undefined';\n\nexport default isXHRAdapterSupported && function (config) {\n return new Promise(function dispatchXhrRequest(resolve, reject) {\n const _config = resolveConfig(config);\n let requestData = _config.data;\n const requestHeaders = AxiosHeaders.from(_config.headers).normalize();\n let {responseType, onUploadProgress, onDownloadProgress} = _config;\n let onCanceled;\n let uploadThrottled, downloadThrottled;\n let flushUpload, flushDownload;\n\n function done() {\n flushUpload && flushUpload(); // flush events\n flushDownload && flushDownload(); // flush events\n\n _config.cancelToken && _config.cancelToken.unsubscribe(onCanceled);\n\n _config.signal && _config.signal.removeEventListener('abort', onCanceled);\n }\n\n let request = new XMLHttpRequest();\n\n request.open(_config.method.toUpperCase(), _config.url, true);\n\n // Set the request timeout in MS\n request.timeout = _config.timeout;\n\n function onloadend() {\n if (!request) {\n return;\n }\n // Prepare the response\n const responseHeaders = AxiosHeaders.from(\n 'getAllResponseHeaders' in request && request.getAllResponseHeaders()\n );\n const responseData = !responseType || responseType === 'text' || responseType === 'json' ?\n request.responseText : request.response;\n const response = {\n data: responseData,\n status: request.status,\n statusText: request.statusText,\n headers: responseHeaders,\n config,\n request\n };\n\n settle(function _resolve(value) {\n resolve(value);\n done();\n }, function _reject(err) {\n reject(err);\n done();\n }, response);\n\n // Clean up request\n request = null;\n }\n\n if ('onloadend' in request) {\n // Use onloadend if available\n request.onloadend = onloadend;\n } else {\n // Listen for ready state to emulate onloadend\n request.onreadystatechange = function handleLoad() {\n if (!request || request.readyState !== 4) {\n return;\n }\n\n // The request errored out and we didn't get a response, this will be\n // handled by onerror instead\n // With one exception: request that using file: protocol, most browsers\n // will return status as 0 even though it's a successful request\n if (request.status === 0 && !(request.responseURL && request.responseURL.indexOf('file:') === 0)) {\n return;\n }\n // readystate handler is calling before onerror or ontimeout handlers,\n // so we should call onloadend on the next 'tick'\n setTimeout(onloadend);\n };\n }\n\n // Handle browser request cancellation (as opposed to a manual cancellation)\n request.onabort = function handleAbort() {\n if (!request) {\n return;\n }\n\n reject(new AxiosError('Request aborted', AxiosError.ECONNABORTED, config, request));\n\n // Clean up request\n request = null;\n };\n\n // Handle low level network errors\n request.onerror = function handleError(event) {\n // Browsers deliver a ProgressEvent in XHR onerror\n // (message may be empty; when present, surface it)\n // See https://developer.mozilla.org/docs/Web/API/XMLHttpRequest/error_event\n const msg = event && event.message ? event.message : 'Network Error';\n const err = new AxiosError(msg, AxiosError.ERR_NETWORK, config, request);\n // attach the underlying event for consumers who want details\n err.event = event || null;\n reject(err);\n request = null;\n };\n \n // Handle timeout\n request.ontimeout = function handleTimeout() {\n let timeoutErrorMessage = _config.timeout ? 'timeout of ' + _config.timeout + 'ms exceeded' : 'timeout exceeded';\n const transitional = _config.transitional || transitionalDefaults;\n if (_config.timeoutErrorMessage) {\n timeoutErrorMessage = _config.timeoutErrorMessage;\n }\n reject(new AxiosError(\n timeoutErrorMessage,\n transitional.clarifyTimeoutError ? AxiosError.ETIMEDOUT : AxiosError.ECONNABORTED,\n config,\n request));\n\n // Clean up request\n request = null;\n };\n\n // Remove Content-Type if data is undefined\n requestData === undefined && requestHeaders.setContentType(null);\n\n // Add headers to the request\n if ('setRequestHeader' in request) {\n utils.forEach(requestHeaders.toJSON(), function setRequestHeader(val, key) {\n request.setRequestHeader(key, val);\n });\n }\n\n // Add withCredentials to request if needed\n if (!utils.isUndefined(_config.withCredentials)) {\n request.withCredentials = !!_config.withCredentials;\n }\n\n // Add responseType to request if needed\n if (responseType && responseType !== 'json') {\n request.responseType = _config.responseType;\n }\n\n // Handle progress if needed\n if (onDownloadProgress) {\n ([downloadThrottled, flushDownload] = progressEventReducer(onDownloadProgress, true));\n request.addEventListener('progress', downloadThrottled);\n }\n\n // Not all browsers support upload events\n if (onUploadProgress && request.upload) {\n ([uploadThrottled, flushUpload] = progressEventReducer(onUploadProgress));\n\n request.upload.addEventListener('progress', uploadThrottled);\n\n request.upload.addEventListener('loadend', flushUpload);\n }\n\n if (_config.cancelToken || _config.signal) {\n // Handle cancellation\n // eslint-disable-next-line func-names\n onCanceled = cancel => {\n if (!request) {\n return;\n }\n reject(!cancel || cancel.type ? new CanceledError(null, config, request) : cancel);\n request.abort();\n request = null;\n };\n\n _config.cancelToken && _config.cancelToken.subscribe(onCanceled);\n if (_config.signal) {\n _config.signal.aborted ? onCanceled() : _config.signal.addEventListener('abort', onCanceled);\n }\n }\n\n const protocol = parseProtocol(_config.url);\n\n if (protocol && platform.protocols.indexOf(protocol) === -1) {\n reject(new AxiosError('Unsupported protocol ' + protocol + ':', AxiosError.ERR_BAD_REQUEST, config));\n return;\n }\n\n\n // Send the request\n request.send(requestData || null);\n });\n}\n","import CanceledError from \"../cancel/CanceledError.js\";\nimport AxiosError from \"../core/AxiosError.js\";\nimport utils from '../utils.js';\n\nconst composeSignals = (signals, timeout) => {\n const {length} = (signals = signals ? signals.filter(Boolean) : []);\n\n if (timeout || length) {\n let controller = new AbortController();\n\n let aborted;\n\n const onabort = function (reason) {\n if (!aborted) {\n aborted = true;\n unsubscribe();\n const err = reason instanceof Error ? reason : this.reason;\n controller.abort(err instanceof AxiosError ? err : new CanceledError(err instanceof Error ? err.message : err));\n }\n }\n\n let timer = timeout && setTimeout(() => {\n timer = null;\n onabort(new AxiosError(`timeout ${timeout} of ms exceeded`, AxiosError.ETIMEDOUT))\n }, timeout)\n\n const unsubscribe = () => {\n if (signals) {\n timer && clearTimeout(timer);\n timer = null;\n signals.forEach(signal => {\n signal.unsubscribe ? signal.unsubscribe(onabort) : signal.removeEventListener('abort', onabort);\n });\n signals = null;\n }\n }\n\n signals.forEach((signal) => signal.addEventListener('abort', onabort));\n\n const {signal} = controller;\n\n signal.unsubscribe = () => utils.asap(unsubscribe);\n\n return signal;\n }\n}\n\nexport default composeSignals;\n","\nexport const streamChunk = function* (chunk, chunkSize) {\n let len = chunk.byteLength;\n\n if (!chunkSize || len < chunkSize) {\n yield chunk;\n return;\n }\n\n let pos = 0;\n let end;\n\n while (pos < len) {\n end = pos + chunkSize;\n yield chunk.slice(pos, end);\n pos = end;\n }\n}\n\nexport const readBytes = async function* (iterable, chunkSize) {\n for await (const chunk of readStream(iterable)) {\n yield* streamChunk(chunk, chunkSize);\n }\n}\n\nconst readStream = async function* (stream) {\n if (stream[Symbol.asyncIterator]) {\n yield* stream;\n return;\n }\n\n const reader = stream.getReader();\n try {\n for (;;) {\n const {done, value} = await reader.read();\n if (done) {\n break;\n }\n yield value;\n }\n } finally {\n await reader.cancel();\n }\n}\n\nexport const trackStream = (stream, chunkSize, onProgress, onFinish) => {\n const iterator = readBytes(stream, chunkSize);\n\n let bytes = 0;\n let done;\n let _onFinish = (e) => {\n if (!done) {\n done = true;\n onFinish && onFinish(e);\n }\n }\n\n return new ReadableStream({\n async pull(controller) {\n try {\n const {done, value} = await iterator.next();\n\n if (done) {\n _onFinish();\n controller.close();\n return;\n }\n\n let len = value.byteLength;\n if (onProgress) {\n let loadedBytes = bytes += len;\n onProgress(loadedBytes);\n }\n controller.enqueue(new Uint8Array(value));\n } catch (err) {\n _onFinish(err);\n throw err;\n }\n },\n cancel(reason) {\n _onFinish(reason);\n return iterator.return();\n }\n }, {\n highWaterMark: 2\n })\n}\n","import platform from \"../platform/index.js\";\nimport utils from \"../utils.js\";\nimport AxiosError from \"../core/AxiosError.js\";\nimport composeSignals from \"../helpers/composeSignals.js\";\nimport {trackStream} from \"../helpers/trackStream.js\";\nimport AxiosHeaders from \"../core/AxiosHeaders.js\";\nimport {progressEventReducer, progressEventDecorator, asyncDecorator} from \"../helpers/progressEventReducer.js\";\nimport resolveConfig from \"../helpers/resolveConfig.js\";\nimport settle from \"../core/settle.js\";\n\nconst DEFAULT_CHUNK_SIZE = 64 * 1024;\n\nconst {isFunction} = utils;\n\nconst globalFetchAPI = (({Request, Response}) => ({\n Request, Response\n}))(utils.global);\n\nconst {\n ReadableStream, TextEncoder\n} = utils.global;\n\n\nconst test = (fn, ...args) => {\n try {\n return !!fn(...args);\n } catch (e) {\n return false\n }\n}\n\nconst factory = (env) => {\n env = utils.merge.call({\n skipUndefined: true\n }, globalFetchAPI, env);\n\n const {fetch: envFetch, Request, Response} = env;\n const isFetchSupported = envFetch ? isFunction(envFetch) : typeof fetch === 'function';\n const isRequestSupported = isFunction(Request);\n const isResponseSupported = isFunction(Response);\n\n if (!isFetchSupported) {\n return false;\n }\n\n const isReadableStreamSupported = isFetchSupported && isFunction(ReadableStream);\n\n const encodeText = isFetchSupported && (typeof TextEncoder === 'function' ?\n ((encoder) => (str) => encoder.encode(str))(new TextEncoder()) :\n async (str) => new Uint8Array(await new Request(str).arrayBuffer())\n );\n\n const supportsRequestStream = isRequestSupported && isReadableStreamSupported && test(() => {\n let duplexAccessed = false;\n\n const hasContentType = new Request(platform.origin, {\n body: new ReadableStream(),\n method: 'POST',\n get duplex() {\n duplexAccessed = true;\n return 'half';\n },\n }).headers.has('Content-Type');\n\n return duplexAccessed && !hasContentType;\n });\n\n const supportsResponseStream = isResponseSupported && isReadableStreamSupported &&\n test(() => utils.isReadableStream(new Response('').body));\n\n const resolvers = {\n stream: supportsResponseStream && ((res) => res.body)\n };\n\n isFetchSupported && ((() => {\n ['text', 'arrayBuffer', 'blob', 'formData', 'stream'].forEach(type => {\n !resolvers[type] && (resolvers[type] = (res, config) => {\n let method = res && res[type];\n\n if (method) {\n return method.call(res);\n }\n\n throw new AxiosError(`Response type '${type}' is not supported`, AxiosError.ERR_NOT_SUPPORT, config);\n })\n });\n })());\n\n const getBodyLength = async (body) => {\n if (body == null) {\n return 0;\n }\n\n if (utils.isBlob(body)) {\n return body.size;\n }\n\n if (utils.isSpecCompliantForm(body)) {\n const _request = new Request(platform.origin, {\n method: 'POST',\n body,\n });\n return (await _request.arrayBuffer()).byteLength;\n }\n\n if (utils.isArrayBufferView(body) || utils.isArrayBuffer(body)) {\n return body.byteLength;\n }\n\n if (utils.isURLSearchParams(body)) {\n body = body + '';\n }\n\n if (utils.isString(body)) {\n return (await encodeText(body)).byteLength;\n }\n }\n\n const resolveBodyLength = async (headers, body) => {\n const length = utils.toFiniteNumber(headers.getContentLength());\n\n return length == null ? getBodyLength(body) : length;\n }\n\n return async (config) => {\n let {\n url,\n method,\n data,\n signal,\n cancelToken,\n timeout,\n onDownloadProgress,\n onUploadProgress,\n responseType,\n headers,\n withCredentials = 'same-origin',\n fetchOptions\n } = resolveConfig(config);\n\n let _fetch = envFetch || fetch;\n\n responseType = responseType ? (responseType + '').toLowerCase() : 'text';\n\n let composedSignal = composeSignals([signal, cancelToken && cancelToken.toAbortSignal()], timeout);\n\n let request = null;\n\n const unsubscribe = composedSignal && composedSignal.unsubscribe && (() => {\n composedSignal.unsubscribe();\n });\n\n let requestContentLength;\n\n try {\n if (\n onUploadProgress && supportsRequestStream && method !== 'get' && method !== 'head' &&\n (requestContentLength = await resolveBodyLength(headers, data)) !== 0\n ) {\n let _request = new Request(url, {\n method: 'POST',\n body: data,\n duplex: \"half\"\n });\n\n let contentTypeHeader;\n\n if (utils.isFormData(data) && (contentTypeHeader = _request.headers.get('content-type'))) {\n headers.setContentType(contentTypeHeader)\n }\n\n if (_request.body) {\n const [onProgress, flush] = progressEventDecorator(\n requestContentLength,\n progressEventReducer(asyncDecorator(onUploadProgress))\n );\n\n data = trackStream(_request.body, DEFAULT_CHUNK_SIZE, onProgress, flush);\n }\n }\n\n if (!utils.isString(withCredentials)) {\n withCredentials = withCredentials ? 'include' : 'omit';\n }\n\n // Cloudflare Workers throws when credentials are defined\n // see https://github.com/cloudflare/workerd/issues/902\n const isCredentialsSupported = isRequestSupported && \"credentials\" in Request.prototype;\n\n const resolvedOptions = {\n ...fetchOptions,\n signal: composedSignal,\n method: method.toUpperCase(),\n headers: headers.normalize().toJSON(),\n body: data,\n duplex: \"half\",\n credentials: isCredentialsSupported ? withCredentials : undefined\n };\n\n request = isRequestSupported && new Request(url, resolvedOptions);\n\n let response = await (isRequestSupported ? _fetch(request, fetchOptions) : _fetch(url, resolvedOptions));\n\n const isStreamResponse = supportsResponseStream && (responseType === 'stream' || responseType === 'response');\n\n if (supportsResponseStream && (onDownloadProgress || (isStreamResponse && unsubscribe))) {\n const options = {};\n\n ['status', 'statusText', 'headers'].forEach(prop => {\n options[prop] = response[prop];\n });\n\n const responseContentLength = utils.toFiniteNumber(response.headers.get('content-length'));\n\n const [onProgress, flush] = onDownloadProgress && progressEventDecorator(\n responseContentLength,\n progressEventReducer(asyncDecorator(onDownloadProgress), true)\n ) || [];\n\n response = new Response(\n trackStream(response.body, DEFAULT_CHUNK_SIZE, onProgress, () => {\n flush && flush();\n unsubscribe && unsubscribe();\n }),\n options\n );\n }\n\n responseType = responseType || 'text';\n\n let responseData = await resolvers[utils.findKey(resolvers, responseType) || 'text'](response, config);\n\n !isStreamResponse && unsubscribe && unsubscribe();\n\n return await new Promise((resolve, reject) => {\n settle(resolve, reject, {\n data: responseData,\n headers: AxiosHeaders.from(response.headers),\n status: response.status,\n statusText: response.statusText,\n config,\n request\n })\n })\n } catch (err) {\n unsubscribe && unsubscribe();\n\n if (err && err.name === 'TypeError' && /Load failed|fetch/i.test(err.message)) {\n throw Object.assign(\n new AxiosError('Network Error', AxiosError.ERR_NETWORK, config, request),\n {\n cause: err.cause || err\n }\n )\n }\n\n throw AxiosError.from(err, err && err.code, config, request);\n }\n }\n}\n\nconst seedCache = new Map();\n\nexport const getFetch = (config) => {\n let env = config ? config.env : {};\n const {fetch, Request, Response} = env;\n const seeds = [\n Request, Response, fetch\n ];\n\n let len = seeds.length, i = len,\n seed, target, map = seedCache;\n\n while (i--) {\n seed = seeds[i];\n target = map.get(seed);\n\n target === undefined && map.set(seed, target = (i ? new Map() : factory(env)))\n\n map = target;\n }\n\n return target;\n};\n\nconst adapter = getFetch();\n\nexport default adapter;\n","import utils from '../utils.js';\nimport httpAdapter from './http.js';\nimport xhrAdapter from './xhr.js';\nimport * as fetchAdapter from './fetch.js';\nimport AxiosError from \"../core/AxiosError.js\";\n\nconst knownAdapters = {\n http: httpAdapter,\n xhr: xhrAdapter,\n fetch: {\n get: fetchAdapter.getFetch,\n }\n}\n\nutils.forEach(knownAdapters, (fn, value) => {\n if (fn) {\n try {\n Object.defineProperty(fn, 'name', {value});\n } catch (e) {\n // eslint-disable-next-line no-empty\n }\n Object.defineProperty(fn, 'adapterName', {value});\n }\n});\n\nconst renderReason = (reason) => `- ${reason}`;\n\nconst isResolvedHandle = (adapter) => utils.isFunction(adapter) || adapter === null || adapter === false;\n\nexport default {\n getAdapter: (adapters, config) => {\n adapters = utils.isArray(adapters) ? adapters : [adapters];\n\n const {length} = adapters;\n let nameOrAdapter;\n let adapter;\n\n const rejectedReasons = {};\n\n for (let i = 0; i < length; i++) {\n nameOrAdapter = adapters[i];\n let id;\n\n adapter = nameOrAdapter;\n\n if (!isResolvedHandle(nameOrAdapter)) {\n adapter = knownAdapters[(id = String(nameOrAdapter)).toLowerCase()];\n\n if (adapter === undefined) {\n throw new AxiosError(`Unknown adapter '${id}'`);\n }\n }\n\n if (adapter && (utils.isFunction(adapter) || (adapter = adapter.get(config)))) {\n break;\n }\n\n rejectedReasons[id || '#' + i] = adapter;\n }\n\n if (!adapter) {\n\n const reasons = Object.entries(rejectedReasons)\n .map(([id, state]) => `adapter ${id} ` +\n (state === false ? 'is not supported by the environment' : 'is not available in the build')\n );\n\n let s = length ?\n (reasons.length > 1 ? 'since :\\n' + reasons.map(renderReason).join('\\n') : ' ' + renderReason(reasons[0])) :\n 'as no adapter specified';\n\n throw new AxiosError(\n `There is no suitable adapter to dispatch the request ` + s,\n 'ERR_NOT_SUPPORT'\n );\n }\n\n return adapter;\n },\n adapters: knownAdapters\n}\n","'use strict';\n\nimport transformData from './transformData.js';\nimport isCancel from '../cancel/isCancel.js';\nimport defaults from '../defaults/index.js';\nimport CanceledError from '../cancel/CanceledError.js';\nimport AxiosHeaders from '../core/AxiosHeaders.js';\nimport adapters from \"../adapters/adapters.js\";\n\n/**\n * Throws a `CanceledError` if cancellation has been requested.\n *\n * @param {Object} config The config that is to be used for the request\n *\n * @returns {void}\n */\nfunction throwIfCancellationRequested(config) {\n if (config.cancelToken) {\n config.cancelToken.throwIfRequested();\n }\n\n if (config.signal && config.signal.aborted) {\n throw new CanceledError(null, config);\n }\n}\n\n/**\n * Dispatch a request to the server using the configured adapter.\n *\n * @param {object} config The config that is to be used for the request\n *\n * @returns {Promise} The Promise to be fulfilled\n */\nexport default function dispatchRequest(config) {\n throwIfCancellationRequested(config);\n\n config.headers = AxiosHeaders.from(config.headers);\n\n // Transform request data\n config.data = transformData.call(\n config,\n config.transformRequest\n );\n\n if (['post', 'put', 'patch'].indexOf(config.method) !== -1) {\n config.headers.setContentType('application/x-www-form-urlencoded', false);\n }\n\n const adapter = adapters.getAdapter(config.adapter || defaults.adapter, config);\n\n return adapter(config).then(function onAdapterResolution(response) {\n throwIfCancellationRequested(config);\n\n // Transform response data\n response.data = transformData.call(\n config,\n config.transformResponse,\n response\n );\n\n response.headers = AxiosHeaders.from(response.headers);\n\n return response;\n }, function onAdapterRejection(reason) {\n if (!isCancel(reason)) {\n throwIfCancellationRequested(config);\n\n // Transform response data\n if (reason && reason.response) {\n reason.response.data = transformData.call(\n config,\n config.transformResponse,\n reason.response\n );\n reason.response.headers = AxiosHeaders.from(reason.response.headers);\n }\n }\n\n return Promise.reject(reason);\n });\n}\n","export const VERSION = \"1.12.2\";","'use strict';\n\nimport {VERSION} from '../env/data.js';\nimport AxiosError from '../core/AxiosError.js';\n\nconst validators = {};\n\n// eslint-disable-next-line func-names\n['object', 'boolean', 'number', 'function', 'string', 'symbol'].forEach((type, i) => {\n validators[type] = function validator(thing) {\n return typeof thing === type || 'a' + (i < 1 ? 'n ' : ' ') + type;\n };\n});\n\nconst deprecatedWarnings = {};\n\n/**\n * Transitional option validator\n *\n * @param {function|boolean?} validator - set to false if the transitional option has been removed\n * @param {string?} version - deprecated version / removed since version\n * @param {string?} message - some message with additional info\n *\n * @returns {function}\n */\nvalidators.transitional = function transitional(validator, version, message) {\n function formatMessage(opt, desc) {\n return '[Axios v' + VERSION + '] Transitional option \\'' + opt + '\\'' + desc + (message ? '. ' + message : '');\n }\n\n // eslint-disable-next-line func-names\n return (value, opt, opts) => {\n if (validator === false) {\n throw new AxiosError(\n formatMessage(opt, ' has been removed' + (version ? ' in ' + version : '')),\n AxiosError.ERR_DEPRECATED\n );\n }\n\n if (version && !deprecatedWarnings[opt]) {\n deprecatedWarnings[opt] = true;\n // eslint-disable-next-line no-console\n console.warn(\n formatMessage(\n opt,\n ' has been deprecated since v' + version + ' and will be removed in the near future'\n )\n );\n }\n\n return validator ? validator(value, opt, opts) : true;\n };\n};\n\nvalidators.spelling = function spelling(correctSpelling) {\n return (value, opt) => {\n // eslint-disable-next-line no-console\n console.warn(`${opt} is likely a misspelling of ${correctSpelling}`);\n return true;\n }\n};\n\n/**\n * Assert object's properties type\n *\n * @param {object} options\n * @param {object} schema\n * @param {boolean?} allowUnknown\n *\n * @returns {object}\n */\n\nfunction assertOptions(options, schema, allowUnknown) {\n if (typeof options !== 'object') {\n throw new AxiosError('options must be an object', AxiosError.ERR_BAD_OPTION_VALUE);\n }\n const keys = Object.keys(options);\n let i = keys.length;\n while (i-- > 0) {\n const opt = keys[i];\n const validator = schema[opt];\n if (validator) {\n const value = options[opt];\n const result = value === undefined || validator(value, opt, options);\n if (result !== true) {\n throw new AxiosError('option ' + opt + ' must be ' + result, AxiosError.ERR_BAD_OPTION_VALUE);\n }\n continue;\n }\n if (allowUnknown !== true) {\n throw new AxiosError('Unknown option ' + opt, AxiosError.ERR_BAD_OPTION);\n }\n }\n}\n\nexport default {\n assertOptions,\n validators\n};\n","'use strict';\n\nimport utils from './../utils.js';\nimport buildURL from '../helpers/buildURL.js';\nimport InterceptorManager from './InterceptorManager.js';\nimport dispatchRequest from './dispatchRequest.js';\nimport mergeConfig from './mergeConfig.js';\nimport buildFullPath from './buildFullPath.js';\nimport validator from '../helpers/validator.js';\nimport AxiosHeaders from './AxiosHeaders.js';\n\nconst validators = validator.validators;\n\n/**\n * Create a new instance of Axios\n *\n * @param {Object} instanceConfig The default config for the instance\n *\n * @return {Axios} A new instance of Axios\n */\nclass Axios {\n constructor(instanceConfig) {\n this.defaults = instanceConfig || {};\n this.interceptors = {\n request: new InterceptorManager(),\n response: new InterceptorManager()\n };\n }\n\n /**\n * Dispatch a request\n *\n * @param {String|Object} configOrUrl The config specific for this request (merged with this.defaults)\n * @param {?Object} config\n *\n * @returns {Promise} The Promise to be fulfilled\n */\n async request(configOrUrl, config) {\n try {\n return await this._request(configOrUrl, config);\n } catch (err) {\n if (err instanceof Error) {\n let dummy = {};\n\n Error.captureStackTrace ? Error.captureStackTrace(dummy) : (dummy = new Error());\n\n // slice off the Error: ... line\n const stack = dummy.stack ? dummy.stack.replace(/^.+\\n/, '') : '';\n try {\n if (!err.stack) {\n err.stack = stack;\n // match without the 2 top stack lines\n } else if (stack && !String(err.stack).endsWith(stack.replace(/^.+\\n.+\\n/, ''))) {\n err.stack += '\\n' + stack\n }\n } catch (e) {\n // ignore the case where \"stack\" is an un-writable property\n }\n }\n\n throw err;\n }\n }\n\n _request(configOrUrl, config) {\n /*eslint no-param-reassign:0*/\n // Allow for axios('example/url'[, config]) a la fetch API\n if (typeof configOrUrl === 'string') {\n config = config || {};\n config.url = configOrUrl;\n } else {\n config = configOrUrl || {};\n }\n\n config = mergeConfig(this.defaults, config);\n\n const {transitional, paramsSerializer, headers} = config;\n\n if (transitional !== undefined) {\n validator.assertOptions(transitional, {\n silentJSONParsing: validators.transitional(validators.boolean),\n forcedJSONParsing: validators.transitional(validators.boolean),\n clarifyTimeoutError: validators.transitional(validators.boolean)\n }, false);\n }\n\n if (paramsSerializer != null) {\n if (utils.isFunction(paramsSerializer)) {\n config.paramsSerializer = {\n serialize: paramsSerializer\n }\n } else {\n validator.assertOptions(paramsSerializer, {\n encode: validators.function,\n serialize: validators.function\n }, true);\n }\n }\n\n // Set config.allowAbsoluteUrls\n if (config.allowAbsoluteUrls !== undefined) {\n // do nothing\n } else if (this.defaults.allowAbsoluteUrls !== undefined) {\n config.allowAbsoluteUrls = this.defaults.allowAbsoluteUrls;\n } else {\n config.allowAbsoluteUrls = true;\n }\n\n validator.assertOptions(config, {\n baseUrl: validators.spelling('baseURL'),\n withXsrfToken: validators.spelling('withXSRFToken')\n }, true);\n\n // Set config.method\n config.method = (config.method || this.defaults.method || 'get').toLowerCase();\n\n // Flatten headers\n let contextHeaders = headers && utils.merge(\n headers.common,\n headers[config.method]\n );\n\n headers && utils.forEach(\n ['delete', 'get', 'head', 'post', 'put', 'patch', 'common'],\n (method) => {\n delete headers[method];\n }\n );\n\n config.headers = AxiosHeaders.concat(contextHeaders, headers);\n\n // filter out skipped interceptors\n const requestInterceptorChain = [];\n let synchronousRequestInterceptors = true;\n this.interceptors.request.forEach(function unshiftRequestInterceptors(interceptor) {\n if (typeof interceptor.runWhen === 'function' && interceptor.runWhen(config) === false) {\n return;\n }\n\n synchronousRequestInterceptors = synchronousRequestInterceptors && interceptor.synchronous;\n\n requestInterceptorChain.unshift(interceptor.fulfilled, interceptor.rejected);\n });\n\n const responseInterceptorChain = [];\n this.interceptors.response.forEach(function pushResponseInterceptors(interceptor) {\n responseInterceptorChain.push(interceptor.fulfilled, interceptor.rejected);\n });\n\n let promise;\n let i = 0;\n let len;\n\n if (!synchronousRequestInterceptors) {\n const chain = [dispatchRequest.bind(this), undefined];\n chain.unshift(...requestInterceptorChain);\n chain.push(...responseInterceptorChain);\n len = chain.length;\n\n promise = Promise.resolve(config);\n\n while (i < len) {\n promise = promise.then(chain[i++], chain[i++]);\n }\n\n return promise;\n }\n\n len = requestInterceptorChain.length;\n\n let newConfig = config;\n\n while (i < len) {\n const onFulfilled = requestInterceptorChain[i++];\n const onRejected = requestInterceptorChain[i++];\n try {\n newConfig = onFulfilled(newConfig);\n } catch (error) {\n onRejected.call(this, error);\n break;\n }\n }\n\n try {\n promise = dispatchRequest.call(this, newConfig);\n } catch (error) {\n return Promise.reject(error);\n }\n\n i = 0;\n len = responseInterceptorChain.length;\n\n while (i < len) {\n promise = promise.then(responseInterceptorChain[i++], responseInterceptorChain[i++]);\n }\n\n return promise;\n }\n\n getUri(config) {\n config = mergeConfig(this.defaults, config);\n const fullPath = buildFullPath(config.baseURL, config.url, config.allowAbsoluteUrls);\n return buildURL(fullPath, config.params, config.paramsSerializer);\n }\n}\n\n// Provide aliases for supported request methods\nutils.forEach(['delete', 'get', 'head', 'options'], function forEachMethodNoData(method) {\n /*eslint func-names:0*/\n Axios.prototype[method] = function(url, config) {\n return this.request(mergeConfig(config || {}, {\n method,\n url,\n data: (config || {}).data\n }));\n };\n});\n\nutils.forEach(['post', 'put', 'patch'], function forEachMethodWithData(method) {\n /*eslint func-names:0*/\n\n function generateHTTPMethod(isForm) {\n return function httpMethod(url, data, config) {\n return this.request(mergeConfig(config || {}, {\n method,\n headers: isForm ? {\n 'Content-Type': 'multipart/form-data'\n } : {},\n url,\n data\n }));\n };\n }\n\n Axios.prototype[method] = generateHTTPMethod();\n\n Axios.prototype[method + 'Form'] = generateHTTPMethod(true);\n});\n\nexport default Axios;\n","'use strict';\n\nimport CanceledError from './CanceledError.js';\n\n/**\n * A `CancelToken` is an object that can be used to request cancellation of an operation.\n *\n * @param {Function} executor The executor function.\n *\n * @returns {CancelToken}\n */\nclass CancelToken {\n constructor(executor) {\n if (typeof executor !== 'function') {\n throw new TypeError('executor must be a function.');\n }\n\n let resolvePromise;\n\n this.promise = new Promise(function promiseExecutor(resolve) {\n resolvePromise = resolve;\n });\n\n const token = this;\n\n // eslint-disable-next-line func-names\n this.promise.then(cancel => {\n if (!token._listeners) return;\n\n let i = token._listeners.length;\n\n while (i-- > 0) {\n token._listeners[i](cancel);\n }\n token._listeners = null;\n });\n\n // eslint-disable-next-line func-names\n this.promise.then = onfulfilled => {\n let _resolve;\n // eslint-disable-next-line func-names\n const promise = new Promise(resolve => {\n token.subscribe(resolve);\n _resolve = resolve;\n }).then(onfulfilled);\n\n promise.cancel = function reject() {\n token.unsubscribe(_resolve);\n };\n\n return promise;\n };\n\n executor(function cancel(message, config, request) {\n if (token.reason) {\n // Cancellation has already been requested\n return;\n }\n\n token.reason = new CanceledError(message, config, request);\n resolvePromise(token.reason);\n });\n }\n\n /**\n * Throws a `CanceledError` if cancellation has been requested.\n */\n throwIfRequested() {\n if (this.reason) {\n throw this.reason;\n }\n }\n\n /**\n * Subscribe to the cancel signal\n */\n\n subscribe(listener) {\n if (this.reason) {\n listener(this.reason);\n return;\n }\n\n if (this._listeners) {\n this._listeners.push(listener);\n } else {\n this._listeners = [listener];\n }\n }\n\n /**\n * Unsubscribe from the cancel signal\n */\n\n unsubscribe(listener) {\n if (!this._listeners) {\n return;\n }\n const index = this._listeners.indexOf(listener);\n if (index !== -1) {\n this._listeners.splice(index, 1);\n }\n }\n\n toAbortSignal() {\n const controller = new AbortController();\n\n const abort = (err) => {\n controller.abort(err);\n };\n\n this.subscribe(abort);\n\n controller.signal.unsubscribe = () => this.unsubscribe(abort);\n\n return controller.signal;\n }\n\n /**\n * Returns an object that contains a new `CancelToken` and a function that, when called,\n * cancels the `CancelToken`.\n */\n static source() {\n let cancel;\n const token = new CancelToken(function executor(c) {\n cancel = c;\n });\n return {\n token,\n cancel\n };\n }\n}\n\nexport default CancelToken;\n","'use strict';\n\n/**\n * Syntactic sugar for invoking a function and expanding an array for arguments.\n *\n * Common use case would be to use `Function.prototype.apply`.\n *\n * ```js\n * function f(x, y, z) {}\n * var args = [1, 2, 3];\n * f.apply(null, args);\n * ```\n *\n * With `spread` this example can be re-written.\n *\n * ```js\n * spread(function(x, y, z) {})([1, 2, 3]);\n * ```\n *\n * @param {Function} callback\n *\n * @returns {Function}\n */\nexport default function spread(callback) {\n return function wrap(arr) {\n return callback.apply(null, arr);\n };\n}\n","'use strict';\n\nimport utils from './../utils.js';\n\n/**\n * Determines whether the payload is an error thrown by Axios\n *\n * @param {*} payload The value to test\n *\n * @returns {boolean} True if the payload is an error thrown by Axios, otherwise false\n */\nexport default function isAxiosError(payload) {\n return utils.isObject(payload) && (payload.isAxiosError === true);\n}\n","const HttpStatusCode = {\n Continue: 100,\n SwitchingProtocols: 101,\n Processing: 102,\n EarlyHints: 103,\n Ok: 200,\n Created: 201,\n Accepted: 202,\n NonAuthoritativeInformation: 203,\n NoContent: 204,\n ResetContent: 205,\n PartialContent: 206,\n MultiStatus: 207,\n AlreadyReported: 208,\n ImUsed: 226,\n MultipleChoices: 300,\n MovedPermanently: 301,\n Found: 302,\n SeeOther: 303,\n NotModified: 304,\n UseProxy: 305,\n Unused: 306,\n TemporaryRedirect: 307,\n PermanentRedirect: 308,\n BadRequest: 400,\n Unauthorized: 401,\n PaymentRequired: 402,\n Forbidden: 403,\n NotFound: 404,\n MethodNotAllowed: 405,\n NotAcceptable: 406,\n ProxyAuthenticationRequired: 407,\n RequestTimeout: 408,\n Conflict: 409,\n Gone: 410,\n LengthRequired: 411,\n PreconditionFailed: 412,\n PayloadTooLarge: 413,\n UriTooLong: 414,\n UnsupportedMediaType: 415,\n RangeNotSatisfiable: 416,\n ExpectationFailed: 417,\n ImATeapot: 418,\n MisdirectedRequest: 421,\n UnprocessableEntity: 422,\n Locked: 423,\n FailedDependency: 424,\n TooEarly: 425,\n UpgradeRequired: 426,\n PreconditionRequired: 428,\n TooManyRequests: 429,\n RequestHeaderFieldsTooLarge: 431,\n UnavailableForLegalReasons: 451,\n InternalServerError: 500,\n NotImplemented: 501,\n BadGateway: 502,\n ServiceUnavailable: 503,\n GatewayTimeout: 504,\n HttpVersionNotSupported: 505,\n VariantAlsoNegotiates: 506,\n InsufficientStorage: 507,\n LoopDetected: 508,\n NotExtended: 510,\n NetworkAuthenticationRequired: 511,\n};\n\nObject.entries(HttpStatusCode).forEach(([key, value]) => {\n HttpStatusCode[value] = key;\n});\n\nexport default HttpStatusCode;\n","'use strict';\n\nimport utils from './utils.js';\nimport bind from './helpers/bind.js';\nimport Axios from './core/Axios.js';\nimport mergeConfig from './core/mergeConfig.js';\nimport defaults from './defaults/index.js';\nimport formDataToJSON from './helpers/formDataToJSON.js';\nimport CanceledError from './cancel/CanceledError.js';\nimport CancelToken from './cancel/CancelToken.js';\nimport isCancel from './cancel/isCancel.js';\nimport {VERSION} from './env/data.js';\nimport toFormData from './helpers/toFormData.js';\nimport AxiosError from './core/AxiosError.js';\nimport spread from './helpers/spread.js';\nimport isAxiosError from './helpers/isAxiosError.js';\nimport AxiosHeaders from \"./core/AxiosHeaders.js\";\nimport adapters from './adapters/adapters.js';\nimport HttpStatusCode from './helpers/HttpStatusCode.js';\n\n/**\n * Create an instance of Axios\n *\n * @param {Object} defaultConfig The default config for the instance\n *\n * @returns {Axios} A new instance of Axios\n */\nfunction createInstance(defaultConfig) {\n const context = new Axios(defaultConfig);\n const instance = bind(Axios.prototype.request, context);\n\n // Copy axios.prototype to instance\n utils.extend(instance, Axios.prototype, context, {allOwnKeys: true});\n\n // Copy context to instance\n utils.extend(instance, context, null, {allOwnKeys: true});\n\n // Factory for creating new instances\n instance.create = function create(instanceConfig) {\n return createInstance(mergeConfig(defaultConfig, instanceConfig));\n };\n\n return instance;\n}\n\n// Create the default instance to be exported\nconst axios = createInstance(defaults);\n\n// Expose Axios class to allow class inheritance\naxios.Axios = Axios;\n\n// Expose Cancel & CancelToken\naxios.CanceledError = CanceledError;\naxios.CancelToken = CancelToken;\naxios.isCancel = isCancel;\naxios.VERSION = VERSION;\naxios.toFormData = toFormData;\n\n// Expose AxiosError class\naxios.AxiosError = AxiosError;\n\n// alias for CanceledError for backward compatibility\naxios.Cancel = axios.CanceledError;\n\n// Expose all/spread\naxios.all = function all(promises) {\n return Promise.all(promises);\n};\n\naxios.spread = spread;\n\n// Expose isAxiosError\naxios.isAxiosError = isAxiosError;\n\n// Expose mergeConfig\naxios.mergeConfig = mergeConfig;\n\naxios.AxiosHeaders = AxiosHeaders;\n\naxios.formToJSON = thing => formDataToJSON(utils.isHTMLForm(thing) ? new FormData(thing) : thing);\n\naxios.getAdapter = adapters.getAdapter;\n\naxios.HttpStatusCode = HttpStatusCode;\n\naxios.default = axios;\n\n// this module should only have a default export\nexport default axios\n","import axios from './lib/axios.js';\n\n// This module is intended to unwrap Axios default export as named.\n// Keep top-level export same with static properties\n// so that it can keep same with es module or cjs\nconst {\n Axios,\n AxiosError,\n CanceledError,\n isCancel,\n CancelToken,\n VERSION,\n all,\n Cancel,\n isAxiosError,\n spread,\n toFormData,\n AxiosHeaders,\n HttpStatusCode,\n formToJSON,\n getAdapter,\n mergeConfig\n} = axios;\n\nexport {\n axios as default,\n Axios,\n AxiosError,\n CanceledError,\n isCancel,\n CancelToken,\n VERSION,\n all,\n Cancel,\n isAxiosError,\n spread,\n toFormData,\n AxiosHeaders,\n HttpStatusCode,\n formToJSON,\n getAdapter,\n mergeConfig\n}\n","import React from 'react';\r\nimport { Avatar } from \"@heroui/react\";\r\nimport Submenu from \"../Submenu/Submenu\";\r\nimport type { SubmenuItem } from \"../Submenu/Submenu\";\r\nimport axios from \"axios\";\r\nimport type { UserData } from '../../types';\r\nimport './UserProfile.css';\r\n\r\n// 图标组件定义\r\nconst UserIcon = () => <span style={{ marginRight: 8, fontSize: '1.2em' }}>👤</span>;\r\nconst SettingsIcon = () => <span style={{ marginRight: 8, fontSize: '1.2em' }}>⚙️</span>;\r\nconst HelpIcon = () => <span style={{ marginRight: 8, fontSize: '1.2em' }}>❓</span>;\r\nconst LogoutIcon = () => <span style={{ marginRight: 8, fontSize: '1.2em' }}>🚪</span>;\r\n\r\n// API 配置类型\r\nexport interface ApiConfig {\r\n baseURL: string;\r\n endpoints: {\r\n userProfile: string;\r\n };\r\n headers?: Record<string, string>;\r\n}\r\n\r\n\r\n// 默认菜单项配置\r\nconst DEFAULT_MENU_ITEMS: SubmenuItem[] = [\r\n { id: 'profile', label: '个人主页', icon: <UserIcon /> },\r\n { id: 'settings', label: '设置', icon: <SettingsIcon /> },\r\n { id: 'help', label: '帮助', icon: <HelpIcon /> },\r\n { id: 'logout', label: '退出', icon: <LogoutIcon /> }\r\n];\r\n\r\nexport interface UserProfileProps {\r\n // 用户数据配置\r\n userId?: string;\r\n userName?: string;\r\n userAvatar?: string;\r\n \r\n // API 配置\r\n apiConfig?: ApiConfig;\r\n \r\n // 菜单配置\r\n menuItems?: SubmenuItem[];\r\n \r\n // 样式配置\r\n avatarSize?: 'sm' | 'md' | 'lg';\r\n avatarClassName?: string;\r\n userNameClassName?: string;\r\n containerClassName?: string;\r\n \r\n // 状态控制\r\n isLoading?: boolean;\r\n error?: Error | null;\r\n \r\n // 事件回调\r\n onMenuOpen?: () => void;\r\n onMenuClose?: () => void;\r\n onMenuItemClick?: (itemId: string) => void;\r\n onLogout?: () => void;\r\n \r\n // 定制化渲染\r\n renderMenuItem?: (item: SubmenuItem, userData: UserData) => React.ReactNode;\r\n renderUserInfo?: (userData: UserData) => React.ReactNode;\r\n}\r\n\r\nconst UserProfile: React.FC<UserProfileProps> = ({\r\n userId,\r\n userName: initialUserName,\r\n userAvatar: initialUserAvatar,\r\n apiConfig,\r\n menuItems = DEFAULT_MENU_ITEMS,\r\n avatarSize = 'md',\r\n isLoading = false,\r\n error = null,\r\n avatarClassName,\r\n userNameClassName,\r\n containerClassName,\r\n onMenuOpen,\r\n onMenuClose,\r\n onMenuItemClick,\r\n onLogout,\r\n renderMenuItem,\r\n renderUserInfo\r\n}) => {\r\n const [userData, setUserData] = React.useState<UserData>({\r\n id: userId || '',\r\n name: initialUserName || '',\r\n avatar: initialUserAvatar || '',\r\n level: 0,\r\n badges: []\r\n });\r\n \r\n const [loading, setLoading] = React.useState(isLoading);\r\n const [errorState, setErrorState] = React.useState<Error | null>(error);\r\n\r\n // 数据获取逻辑\r\n React.useEffect(() => {\r\n if (userId && apiConfig && !initialUserName && !initialUserAvatar) {\r\n fetchUserData();\r\n }\r\n }, [userId, apiConfig, initialUserName, initialUserAvatar]);\r\n\r\n const fetchUserData = async () => {\r\n setLoading(true);\r\n setErrorState(null);\r\n \r\n try {\r\n const endpoint = apiConfig!.endpoints.userProfile.replace(':userId', userId!);\r\n const response = await axios.get(`${apiConfig!.baseURL}${endpoint}`, {\r\n headers: apiConfig!.headers\r\n });\r\n \r\n setUserData(response.data);\r\n } catch (err) {\r\n setErrorState(err as Error);\r\n } finally {\r\n setLoading(false);\r\n }\r\n };\r\n\r\n // 处理菜单项点击\r\n const handleMenuItemClick = (item: SubmenuItem) => {\r\n onMenuItemClick?.(item.id as string);\r\n \r\n if (item.id === 'logout') {\r\n onLogout?.();\r\n }\r\n };\r\n\r\n // 处理菜单打开\r\n const handleMenuOpen = () => {\r\n onMenuOpen?.();\r\n };\r\n\r\n // 处理菜单关闭\r\n const handleMenuClose = () => {\r\n onMenuClose?.();\r\n };\r\n\r\n // 渲染用户信息区域\r\n const renderDefaultUserInfo = () => (\r\n <div className=\"user-profile-trigger\">\r\n <Avatar\r\n src={userData.avatar}\r\n size={avatarSize}\r\n className={avatarClassName}\r\n alt=\"用户头像\"\r\n />\r\n <span className={`user-name ${userNameClassName || ''}`}>\r\n {userData.name}\r\n </span>\r\n </div>\r\n );\r\n\r\n // 渲染默认菜单项\r\n const renderDefaultMenuItem = (item: SubmenuItem) => (\r\n <div\r\n key={item.id}\r\n className=\"submenu-item\"\r\n onClick={() => handleMenuItemClick(item)}\r\n >\r\n {item.icon && <span className=\"submenu-item-icon\">{item.icon}</span>}\r\n <span>{item.label}</span>\r\n </div>\r\n );\r\n\r\n if (loading) {\r\n return (\r\n <div className={`user-profile-container ${containerClassName || ''} is-loading`}>\r\n <div className=\"user-profile-loading\">加载中...</div>\r\n </div>\r\n );\r\n }\r\n\r\n if (errorState) {\r\n return (\r\n <div className={`user-profile-container ${containerClassName || ''} has-error`}>\r\n <div className=\"user-profile-error\">\r\n 错误: {errorState.message}\r\n </div>\r\n </div>\r\n );\r\n }\r\n\r\n if (!userData.name) {\r\n return (\r\n <div className={`user-profile-container ${containerClassName || ''}`}>\r\n <div className=\"user-profile-loading\">未登录</div>\r\n </div>\r\n );\r\n }\r\n\r\n return (\r\n <div className={`user-profile-container ${containerClassName || ''}`}>\r\n <Submenu\r\n trigger={renderUserInfo ? renderUserInfo(userData) : renderDefaultUserInfo()}\r\n items={menuItems.map(item => ({\r\n ...item,\r\n onClick: () => handleMenuItemClick(item)\r\n }))}\r\n position=\"bottom\"\r\n alignment=\"end\"\r\n onOpen={handleMenuOpen}\r\n onClose={handleMenuClose}\r\n renderItem={renderMenuItem ? (item) => renderMenuItem(item, userData) : undefined}\r\n />\r\n </div>\r\n );\r\n};\r\n\r\nexport default UserProfile;","import React from 'react';\r\nimport Submenu from '../Submenu/Submenu';\r\nimport UserProfile from '../UserProfile/UserProfile';\r\nimport type { SubmenuItem } from '../Submenu/Submenu';\r\nimport type { MathWizHeaderProps, ExploreItem } from './MathWizHeader.types';\r\nimport './MathWizHeader.css';\r\n\r\n// 默认探索菜单项渲染函数\r\nconst defaultRenderExploreItem = (item: ExploreItem) => (\r\n <div\r\n key={item.id}\r\n className=\"explore-menu-item\"\r\n onClick={() => item.onClick?.(item)}\r\n >\r\n <span className=\"explore-item-label\">{item.label}</span>\r\n {item.status && (\r\n <span className={`explore-item-status status-${item.status.toLowerCase().replace('%', '').replace(' ', '-')}`}>\r\n {item.status}\r\n </span>\r\n )}\r\n </div>\r\n);\r\n\r\n// 默认探索菜单触发器\r\nconst ExploreTrigger = () => (\r\n <button className=\"explore-button\" aria-label=\"探索数学课程\">\r\n <span className=\"explore-icon\">🌍</span>\r\n <span className=\"explore-text\">探索</span>\r\n </button>\r\n);\r\n\r\nconst MathWizHeader: React.FC<MathWizHeaderProps> = ({\r\n // 通用Props\r\n className = '',\r\n style,\r\n logoHref = '/',\r\n logoText = 'MathWiz',\r\n onLogoClick,\r\n\r\n // 探索菜单Props\r\n exploreItems = [],\r\n exploreMenuOpen = false,\r\n onExploreMenuToggle,\r\n onExploreItemClick,\r\n renderExploreItem = defaultRenderExploreItem,\r\n\r\n // 用户资料Props\r\n userData,\r\n userMenuItems,\r\n onUserMenuItemClick,\r\n onLogout,\r\n\r\n // 状态控制Props\r\n isLoading = false,\r\n error = null,\r\n\r\n // 样式定制Props\r\n headerClassName = '',\r\n logoClassName = '',\r\n exploreClassName = '',\r\n userProfileClassName = '',\r\n\r\n // 无障碍访问Props\r\n 'aria-label': ariaLabel,\r\n 'aria-labelledby': ariaLabelledBy,\r\n\r\n ...restProps\r\n}) => {\r\n // 准备探索菜单项数据 - 纯数据转换,无业务逻辑\r\n const preparedExploreItems: SubmenuItem[] = exploreItems.map(item => ({\r\n id: item.id,\r\n label: renderExploreItem(item),\r\n onClick: () => onExploreItemClick?.(item)\r\n }));\r\n\r\n return (\r\n <header\r\n className={`mathwiz-header site-header ${headerClassName} ${className}`}\r\n style={style}\r\n aria-label={ariaLabel}\r\n aria-labelledby={ariaLabelledBy}\r\n role=\"banner\"\r\n {...restProps}\r\n >\r\n <div className=\"header-content\">\r\n {/* 左侧:探索菜单 */}\r\n <div className=\"header-section left\">\r\n <Submenu\r\n trigger={<ExploreTrigger />}\r\n items={preparedExploreItems}\r\n position=\"bottom\"\r\n alignment=\"start\"\r\n openDelay={300}\r\n closeDelay={100}\r\n onOpen={() => onExploreMenuToggle?.(true)}\r\n onClose={() => onExploreMenuToggle?.(false)}\r\n className={`explore-submenu ${exploreClassName}`}\r\n menuClassName=\"explore-panel\"\r\n />\r\n </div>\r\n\r\n {/* 中间:Logo */}\r\n <div className=\"header-section center\">\r\n <a\r\n href={logoHref}\r\n className={`logo ${logoClassName}`}\r\n onClick={onLogoClick}\r\n aria-label=\"MathWiz 首页\"\r\n >\r\n {logoText}\r\n </a>\r\n </div>\r\n\r\n {/* 右侧:用户资料 */}\r\n <div className=\"header-section right\">\r\n <UserProfile\r\n userName={userData?.name}\r\n userAvatar={userData?.avatar}\r\n menuItems={userMenuItems}\r\n onMenuItemClick={onUserMenuItemClick}\r\n onLogout={onLogout}\r\n containerClassName={userProfileClassName}\r\n isLoading={isLoading}\r\n error={error}\r\n />\r\n </div>\r\n </div>\r\n </header>\r\n );\r\n};\r\n\r\n// 使用 React.memo 优化性能,避免不必要的重渲染\r\nexport default React.memo(MathWizHeader, (prevProps, nextProps) => {\r\n // 自定义比较函数,只在相关props变化时重渲染\r\n return (\r\n prevProps.logoText === nextProps.logoText &&\r\n prevProps.logoHref === nextProps.logoHref &&\r\n prevProps.className === nextProps.className &&\r\n prevProps.headerClassName === nextProps.headerClassName &&\r\n prevProps.logoClassName === nextProps.logoClassName &&\r\n prevProps.exploreClassName === nextProps.exploreClassName &&\r\n prevProps.userProfileClassName === nextProps.userProfileClassName &&\r\n prevProps['aria-label'] === nextProps['aria-label'] &&\r\n prevProps['aria-labelledby'] === nextProps['aria-labelledby'] &&\r\n prevProps.isLoading === nextProps.isLoading &&\r\n prevProps.error === nextProps.error &&\r\n // 深度比较数组\r\n JSON.stringify(prevProps.exploreItems) === JSON.stringify(nextProps.exploreItems) &&\r\n // 深度比较对象\r\n JSON.stringify(prevProps.userData) === JSON.stringify(nextProps.userData) &&\r\n JSON.stringify(prevProps.userMenuItems) === JSON.stringify(nextProps.userMenuItems)\r\n );\r\n});","import React from 'react';\r\nimport type { RadarChartProps } from '../../../types/radarAbility';\r\n\r\nconst RadarChart: React.FC<RadarChartProps> = ({ \r\n abilities, \r\n width = 400, \r\n height = 400 \r\n}) => {\r\n // 计算雷达图的数据点\r\n const calculateRadarPoints = () => {\r\n if (abilities.length === 0) return '';\r\n \r\n return abilities\r\n .map(ability => {\r\n // 使用预定义的SVG坐标点,如果没有则动态计算\r\n if (ability.svgPoint) {\r\n return `${ability.svgPoint.x},${ability.svgPoint.y}`;\r\n }\r\n \r\n // 动态计算坐标(基于能力和分数)\r\n const angle = (Math.PI * 2 * abilities.indexOf(ability)) / abilities.length;\r\n const radius = (ability.score / ability.maxScore) * 40 + 10; // 10-50范围\r\n const x = 50 + radius * Math.sin(angle);\r\n const y = 50 - radius * Math.cos(angle);\r\n \r\n return `${x},${y}`;\r\n })\r\n .join(' ');\r\n };\r\n\r\n // 计算轴线端点\r\n const calculateAxisEndPoints = (index: number) => {\r\n const angle = (Math.PI * 2 * index) / Math.max(abilities.length, 1);\r\n const x2 = 50 + 40 * Math.sin(angle);\r\n const y2 = 50 - 40 * Math.cos(angle);\r\n return { x2, y2 };\r\n };\r\n\r\n // 计算标签位置\r\n const calculateLabelPosition = (index: number) => {\r\n const angle = (Math.PI * 2 * index) / Math.max(abilities.length, 1);\r\n const x = 50 + 45 * Math.sin(angle);\r\n const y = 50 - 45 * Math.cos(angle);\r\n \r\n // 根据角度调整文本锚点\r\n let textAnchor = 'middle';\r\n if (angle > Math.PI * 0.25 && angle < Math.PI * 0.75) textAnchor = 'start';\r\n if (angle > Math.PI * 1.25 && angle < Math.PI * 1.75) textAnchor = 'end';\r\n \r\n return { x, y, textAnchor };\r\n };\r\n\r\n return (\r\n <svg \r\n data-testid=\"radar-chart\"\r\n width={width} \r\n height={height} \r\n viewBox=\"0 0 100 100\" \r\n className=\"w-full h-full\"\r\n preserveAspectRatio=\"xMidYMid meet\"\r\n >\r\n {/* 中心点 */}\r\n <circle \r\n data-testid=\"center-point\"\r\n cx=\"50\" \r\n cy=\"50\" \r\n r=\"1\" \r\n fill=\"#4A90E2\" \r\n />\r\n\r\n {/* 轴线 */}\r\n {abilities.map((_, index) => {\r\n const { x2, y2 } = calculateAxisEndPoints(index);\r\n return (\r\n <line\r\n key={`axis-${index}`}\r\n data-testid=\"axis-line\"\r\n x1=\"50\"\r\n y1=\"50\"\r\n x2={x2}\r\n y2={y2}\r\n stroke=\"#E2E8F0\"\r\n strokeWidth=\"0.5\"\r\n />\r\n );\r\n })}\r\n\r\n {/* 雷达多边形 */}\r\n {abilities.length > 2 && (\r\n <polygon\r\n data-testid=\"radar-polygon\"\r\n points={calculateRadarPoints()}\r\n fill=\"rgba(74, 144, 226, 0.2)\"\r\n stroke=\"rgb(74, 144, 226)\"\r\n strokeWidth=\"1\"\r\n fillRule=\"evenodd\"\r\n />\r\n )}\r\n\r\n {/* 数据点 */}\r\n {abilities.map((ability, index) => {\r\n let x, y;\r\n \r\n if (ability.svgPoint) {\r\n x = ability.svgPoint.x;\r\n y = ability.svgPoint.y;\r\n } else {\r\n const angle = (Math.PI * 2 * index) / abilities.length;\r\n const radius = (ability.score / ability.maxScore) * 40 + 10;\r\n x = 50 + radius * Math.sin(angle);\r\n y = 50 - radius * Math.cos(angle);\r\n }\r\n \r\n return (\r\n <circle\r\n key={`point-${ability.name}`}\r\n data-testid=\"data-point\"\r\n cx={x}\r\n cy={y}\r\n r=\"2\"\r\n fill={ability.progressBarColor === 'bg-orange-400' ? '#FBBF24' : '#4A90E2'}\r\n />\r\n );\r\n })}\r\n\r\n {/* 能力标签 */}\r\n {abilities.map((ability, index) => {\r\n const { x, y, textAnchor } = calculateLabelPosition(index);\r\n \r\n return (\r\n <text\r\n key={`label-${ability.name}`}\r\n x={x}\r\n y={y}\r\n textAnchor={textAnchor as any}\r\n fontSize=\"5\"\r\n fill=\"#334155\"\r\n className=\"text-xs\"\r\n >\r\n {ability.name}\r\n </text>\r\n );\r\n })}\r\n </svg>\r\n );\r\n};\r\n\r\nexport default RadarChart;","const createStoreImpl = (createState) => {\n let state;\n const listeners = /* @__PURE__ */ new Set();\n const setState = (partial, replace) => {\n const nextState = typeof partial === \"function\" ? partial(state) : partial;\n if (!Object.is(nextState, state)) {\n const previousState = state;\n state = (replace != null ? replace : typeof nextState !== \"object\" || nextState === null) ? nextState : Object.assign({}, state, nextState);\n listeners.forEach((listener) => listener(state, previousState));\n }\n };\n const getState = () => state;\n const getInitialState = () => initialState;\n const subscribe = (listener) => {\n listeners.add(listener);\n return () => listeners.delete(listener);\n };\n const api = { setState, getState, getInitialState, subscribe };\n const initialState = state = createState(setState, getState, api);\n return api;\n};\nconst createStore = ((createState) => createState ? createStoreImpl(createState) : createStoreImpl);\n\nexport { createStore };\n","import React from 'react';\nimport { createStore } from 'zustand/vanilla';\n\nconst identity = (arg) => arg;\nfunction useStore(api, selector = identity) {\n const slice = React.useSyncExternalStore(\n api.subscribe,\n React.useCallback(() => selector(api.getState()), [api, selector]),\n React.useCallback(() => selector(api.getInitialState()), [api, selector])\n );\n React.useDebugValue(slice);\n return slice;\n}\nconst createImpl = (createState) => {\n const api = createStore(createState);\n const useBoundStore = (selector) => useStore(api, selector);\n Object.assign(useBoundStore, api);\n return useBoundStore;\n};\nconst create = ((createState) => createState ? createImpl(createState) : createImpl);\n\nexport { create, useStore };\n","import axios from 'axios';\r\nimport type { RadarAbilityData } from '../types/radarAbility';\r\n\r\n// 模拟数据 - 在实际应用中会从API获取\r\nexport const mockRadarAbilityData: RadarAbilityData = {\r\n overallRating: '优秀',\r\n generalRecommendation: '你的空间想象力和逻辑推理能力非常出色!若能进一步提升在复杂图形下的专注力,你将所向披靡。建议尝试我们‘专注力挑战’系列游戏。',\r\n abilities: [\r\n {\r\n name: '空间想象力',\r\n score: 7.5,\r\n maxScore: 10,\r\n progressBarColor: 'bg-blue-500',\r\n svgPoint: { x: 50, y: 17.5 },\r\n recommendation: '通过观察三维物体在不同角度的投影,或尝试构建复杂结构的游戏,能有效提升空间想象力。',\r\n recommendationLink: '#spatial-challenges'\r\n },\r\n {\r\n name: '逻辑推理',\r\n score: 8.0,\r\n maxScore: 10,\r\n progressBarColor: 'bg-blue-500',\r\n svgPoint: { x: 82, y: 35 },\r\n recommendation: '解决数独、迷宫或逻辑谜题,能够持续锻炼你的逻辑思维,尝试挑战更高难度的推理游戏。',\r\n recommendationLink: '#logic-puzzles'\r\n },\r\n {\r\n name: '图形辨识',\r\n score: 9.0,\r\n maxScore: 10,\r\n progressBarColor: 'bg-blue-500',\r\n svgPoint: { x: 85, y: 65 },\r\n recommendation: '你在这方面表现出色!可以尝试在更复杂、干扰因素更多的图形中进行辨识训练,保持敏锐。',\r\n recommendationLink: '#graphic-training'\r\n },\r\n {\r\n name: '专注力',\r\n score: 7.0,\r\n maxScore: 10,\r\n progressBarColor: 'bg-orange-400',\r\n svgPoint: { x: 50, y: 80 },\r\n recommendation: '在长时间的游戏中保持专注对你来说是一个挑战,建议尝试我们‘专注力挑战’系列游戏,逐渐延长专注时间。',\r\n recommendationLink: '#focus-challenges'\r\n },\r\n {\r\n name: '观察力',\r\n score: 8.5,\r\n maxScore: 10,\r\n progressBarColor: 'bg-blue-500',\r\n svgPoint: { x: 15, y: 65 },\r\n recommendation: '你的观察力非常敏锐,在细节发现上尤为突出。尝试在限时模式下进行观察力训练,提高反应速度。',\r\n recommendationLink: '#observation-drills'\r\n },\r\n {\r\n name: '抗压性',\r\n score: 7.8,\r\n maxScore: 10,\r\n progressBarColor: 'bg-blue-500',\r\n svgPoint: { x: 18, y: 35 },\r\n recommendation: '面对高压挑战时,保持冷静是关键。通过模拟竞赛或限时任务来提升抗压能力,逐步适应压力。',\r\n recommendationLink: '#stress-games'\r\n }\r\n ]\r\n};\r\n\r\nexport class RadarAbilityService {\r\n private static readonly API_BASE_URL = '/api/radar-ability';\r\n\r\n static async fetchRadarAbilityData(): Promise<RadarAbilityData> {\r\n try {\r\n // 在测试环境中使用mock数据,避免真实API调用\r\n if (process.env.NODE_ENV === 'test') {\r\n // 测试环境使用mock数据\r\n await new Promise(resolve => setTimeout(resolve, 100));\r\n return mockRadarAbilityData;\r\n } else {\r\n // 开发和生产环境调用真实API\r\n const response = await axios.get<RadarAbilityData>(`${this.API_BASE_URL}/assessment`);\r\n return response.data;\r\n }\r\n } catch (error) {\r\n console.error('Failed to fetch radar ability data:', error);\r\n // 在测试环境中抛出错误以便测试错误处理\r\n if (process.env.NODE_ENV === 'test') {\r\n throw new Error('获取能力评估数据失败');\r\n }\r\n // 开发和生产环境返回mock数据作为fallback\r\n return mockRadarAbilityData;\r\n }\r\n }\r\n\r\n static async submitFeedback(feedback: {\r\n abilityName: string;\r\n rating: number;\r\n comment: string;\r\n }): Promise<void> {\r\n try {\r\n // 模拟API调用\r\n await axios.post(`${this.API_BASE_URL}/feedback`, feedback);\r\n } catch (error) {\r\n console.error('Failed to submit feedback:', error);\r\n throw new Error('提交反馈失败');\r\n }\r\n }\r\n}","import { create } from 'zustand';\r\nimport type { RadarAbilityData } from '../types/radarAbility';\r\nimport { RadarAbilityService } from '../services/radarAbilityService';\r\n\r\ninterface RadarAbilityState {\r\n data: RadarAbilityData | null;\r\n loading: boolean;\r\n error: string | null;\r\n fetchData: () => Promise<void>;\r\n setData: (data: RadarAbilityData) => void;\r\n setError: (error: string) => void;\r\n reset: () => void;\r\n}\r\n\r\nexport const useRadarAbilityStore = create<RadarAbilityState>((set, get) => ({\r\n data: null,\r\n loading: false,\r\n error: null,\r\n\r\n fetchData: async () => {\r\n // Don't fetch if already loading\r\n if (get().loading) return;\r\n\r\n set({ loading: true, error: null });\r\n\r\n try {\r\n const radarData = await RadarAbilityService.fetchRadarAbilityData();\r\n set({ data: radarData, loading: false });\r\n } catch (error) {\r\n const errorMessage = error instanceof Error ? error.message : '获取数据失败';\r\n set({ error: errorMessage, loading: false });\r\n }\r\n },\r\n\r\n setData: (data: RadarAbilityData) => {\r\n set({ data, error: null, loading: false });\r\n },\r\n\r\n setError: (error: string) => {\r\n set({ error, loading: false });\r\n },\r\n\r\n reset: () => {\r\n set({ data: null, loading: false, error: null });\r\n }\r\n}));","import React from 'react';\r\nimport type { AbilityProgressBarProps } from '../../../types/radarAbility';\r\n\r\nconst AbilityProgressBar: React.FC<AbilityProgressBarProps> = ({ ability }) => {\r\n const percentage = (ability.score / ability.maxScore) * 100;\r\n \r\n return (\r\n <div \r\n className=\"ability-progress-bar-item\" \r\n data-ability={ability.name}\r\n data-testid=\"progress-bar-container\"\r\n >\r\n <div className=\"flex justify-between text-sm mb-1\">\r\n <span className=\"text-gray-700 font-medium\">{ability.name}</span>\r\n <span className=\"text-gray-600\">\r\n {ability.score}/{ability.maxScore}\r\n </span>\r\n </div>\r\n \r\n <div \r\n className=\"w-full bg-gray-200 rounded-full h-2.5\"\r\n data-testid=\"progress-bar-outer\"\r\n >\r\n <div \r\n className={`${ability.progressBarColor} h-2.5 rounded-full transition-all duration-300`}\r\n style={{ width: `${percentage}%` }}\r\n data-testid=\"progress-bar-inner\"\r\n role=\"progressbar\"\r\n aria-valuenow={ability.score}\r\n aria-valuemin={0}\r\n aria-valuemax={ability.maxScore}\r\n aria-label={`${ability.name} progress: ${ability.score} out of ${ability.maxScore}`}\r\n />\r\n </div>\r\n </div>\r\n );\r\n};\r\n\r\nexport default AbilityProgressBar;","import React from 'react';\r\nimport type { PersonalizedAdvicePanelProps } from '../../../types/radarAbility';\r\n\r\nconst PersonalizedAdvicePanel: React.FC<PersonalizedAdvicePanelProps> = ({ \r\n generalRecommendation \r\n}) => {\r\n return (\r\n <div \r\n className=\"bg-blue-50 border border-blue-200 rounded-lg p-4\"\r\n data-testid=\"advice-panel\"\r\n role=\"region\"\r\n aria-label=\"个性化建议\"\r\n >\r\n <div className=\"flex items-start\">\r\n <div className=\"flex-shrink-0\">\r\n <i \r\n className=\"material-icons text-blue-500\"\r\n data-testid=\"lightbulb-icon\"\r\n aria-hidden=\"true\"\r\n >\r\n lightbulb\r\n </i>\r\n </div>\r\n \r\n <div className=\"ml-3\">\r\n <h3 \r\n className=\"text-md font-semibold text-blue-800\"\r\n aria-level={3}\r\n >\r\n 个性化建议\r\n </h3>\r\n \r\n <p \r\n className=\"text-sm text-blue-700 mt-1\"\r\n data-testid=\"recommendation-text\"\r\n >\r\n {generalRecommendation}\r\n </p>\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n};\r\n\r\nexport default PersonalizedAdvicePanel;","import React from 'react';\r\nimport { Card, CardBody, Button } from '@heroui/react';\r\nimport { ArrowRight } from 'lucide-react';\r\nimport type { RecommendationCardProps } from '../../../types/radarAbility';\r\n\r\nconst RecommendationCard: React.FC<RecommendationCardProps> = ({ ability, customLinkTexts = {} }) => {\r\n // 根据能力名称生成对应的链接文本,支持自定义映射\r\n const getLinkText = (abilityName: string) => {\r\n const defaultLinkTexts: Record<string, string> = {\r\n '空间想象力': '探索空间挑战',\r\n '逻辑推理': '深入逻辑谜题',\r\n '图形辨识': '精进图形训练',\r\n '专注力': '挑战专注极限',\r\n '观察力': '提升观察速度',\r\n '抗压性': '磨砺抗压意志'\r\n };\r\n \r\n // 优先使用自定义链接文本,如果没有则使用默认值\r\n return customLinkTexts[abilityName] || defaultLinkTexts[abilityName] || '开始挑战';\r\n };\r\n\r\n return (\r\n <Card \r\n className=\"recommendation-card w-full max-w-sm hover:shadow-lg transition-all duration-300\"\r\n data-ability={ability.name}\r\n data-testid=\"recommendation-card\"\r\n isHoverable\r\n isPressable\r\n >\r\n <CardBody className=\"p-5\">\r\n <div className=\"flex flex-col gap-3\">\r\n <h4 \r\n className=\"text-lg font-semibold text-foreground\"\r\n aria-level={4}\r\n >\r\n {ability.name}: 专项提高\r\n </h4>\r\n \r\n <p \r\n className=\"text-sm text-default-600 leading-relaxed\"\r\n data-testid=\"recommendation-description\"\r\n >\r\n {ability.recommendation}\r\n </p>\r\n \r\n <Button\r\n as=\"a\"\r\n href={ability.recommendationLink}\r\n className=\"mt-2 w-fit\"\r\n size=\"sm\"\r\n variant=\"flat\"\r\n color=\"primary\"\r\n endContent={<ArrowRight className=\"w-4 h-4\" />}\r\n data-testid=\"recommendation-link\"\r\n aria-label={`前往${ability.name}专项提高页面`}\r\n >\r\n {getLinkText(ability.name)}\r\n </Button>\r\n </div>\r\n </CardBody>\r\n </Card>\r\n );\r\n};\r\n\r\nexport default RecommendationCard;","import React, { useEffect } from 'react';\r\nimport { useRadarAbilityStore } from '../../../store/radarAbilityStore';\r\nimport RadarChart from '../RadarChart/RadarChart';\r\nimport AbilityProgressBar from '../AbilityProgressBar/AbilityProgressBar';\r\nimport PersonalizedAdvicePanel from '../PersonalizedAdvicePanel/PersonalizedAdvicePanel';\r\nimport RecommendationCard from '../RecommendationCard/RecommendationCard';\r\nimport styles from './AbilityAssessmentDashboard.module.css';\r\n\r\nconst AbilityAssessmentDashboard: React.FC = () => {\r\n const { data, loading, error, fetchData } = useRadarAbilityStore();\r\n\r\n useEffect(() => {\r\n fetchData();\r\n }, [fetchData]);\r\n\r\n if (loading) {\r\n return (\r\n <div \r\n className=\"card max-w-4xl mx-auto p-6 md:p-8 flex items-center justify-center\"\r\n data-testid=\"loading-spinner\"\r\n >\r\n <div className=\"animate-spin rounded-full h-12 w-12 border-b-2 border-blue-500\"></div>\r\n <span className=\"ml-3 text-gray-600\">加载中...</span>\r\n </div>\r\n );\r\n }\r\n\r\n if (error) {\r\n return (\r\n <div \r\n className=\"card max-w-4xl mx-auto p-6 md:p-8 text-center\"\r\n role=\"alert\"\r\n aria-live=\"assertive\"\r\n >\r\n <div className=\"text-red-500 mb-4\">\r\n <i \r\n className=\"material-icons text-4xl\"\r\n aria-hidden=\"true\"\r\n >\r\n error_outline\r\n </i>\r\n </div>\r\n <h3 className=\"text-lg font-semibold text-gray-800 mb-2\">加载失败</h3>\r\n <p className=\"text-gray-600 mb-4\">{error}</p>\r\n <button\r\n onClick={fetchData}\r\n className=\"bg-blue-500 hover:bg-blue-600 text-white px-4 py-2 rounded-lg transition-colors focus:outline-none focus:ring-2 focus:ring-blue-500 focus:ring-offset-2\"\r\n aria-label=\"重试加载数据\"\r\n >\r\n 重试\r\n </button>\r\n </div>\r\n );\r\n }\r\n\r\n if (!data) {\r\n return (\r\n <div \r\n className=\"card max-w-4xl mx-auto p-6 md:p-8 text-center\"\r\n role=\"status\"\r\n aria-live=\"polite\"\r\n >\r\n <p className=\"text-gray-600\">暂无数据</p>\r\n </div>\r\n );\r\n }\r\n\r\n return (\r\n <div \r\n className=\"card max-w-4xl mx-auto p-6 md:p-8 animate-fade-in\"\r\n data-component=\"AbilityAssessmentDashboard\"\r\n role=\"main\"\r\n aria-label=\"能力评估雷达图展示\"\r\n >\r\n {/* 头部标题和评级 */}\r\n <div className=\"flex justify-between items-center mb-6\">\r\n <h2 className=\"text-xl font-bold text-gray-800\">能力评估雷达图</h2>\r\n <span \r\n className=\"bg-blue-100 text-blue-800 text-sm font-semibold px-2.5 py-0.5 rounded-full\"\r\n aria-label={`综合评级: ${data.overallRating}`}\r\n >\r\n 综合评级: {data.overallRating}\r\n </span>\r\n </div>\r\n\r\n {/* 主要内容区域 - 上下布局 3:2 */}\r\n <div className={styles.dashboardLayout}>\r\n {/* 上部容器: 能力雷达展示视图 (3/5 高度) */}\r\n <div className={styles.upperSection}>\r\n {/* 左边: 雷达图 */}\r\n <div className={styles.radarChartArea}>\r\n <RadarChart abilities={data.abilities} />\r\n </div>\r\n\r\n {/* 右边: 进度条列表 */}\r\n <div className=\"space-y-4 flex flex-col justify-around py-2\">\r\n {data.abilities.map(ability => (\r\n <AbilityProgressBar \r\n key={ability.name} \r\n ability={ability} \r\n />\r\n ))}\r\n </div>\r\n </div>\r\n\r\n {/* 下部容器: 个性化推荐视图 (2/5 高度) */}\r\n <div className={styles.lowerSection}>\r\n {/* 通用个性化建议面板 */}\r\n <PersonalizedAdvicePanel \r\n generalRecommendation={data.generalRecommendation} \r\n />\r\n\r\n {/* 专项提升建议 */}\r\n <h3 className=\"text-lg font-bold text-gray-800 mb-4 mt-6\">\r\n 专项提升建议\r\n </h3>\r\n\r\n <div className=\"grid grid-cols-1 md:grid-cols-2 gap-4\">\r\n {data.abilities.map(ability => (\r\n <RecommendationCard \r\n key={ability.name} \r\n ability={ability} \r\n />\r\n ))}\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n};\r\n\r\nexport default AbilityAssessmentDashboard;","// 课程数据类型定义\r\nexport interface KnowledgeItem {\r\n id: string;\r\n title: string;\r\n description: string;\r\n progress: number;\r\n contentUrl: string;\r\n status?: 'mastered' | 'proficient' | 'familiar' | 'attempted' | 'not-started';\r\n}\r\n\r\nexport interface Lesson {\r\n id: string;\r\n title: string;\r\n duration: number;\r\n knowledgeItems: KnowledgeItem[];\r\n}\r\n\r\nexport interface Unit {\r\n id: string;\r\n title: string;\r\n description: string;\r\n estimatedDuration: string;\r\n totalLessons: number;\r\n moduleCategory: string;\r\n lessons: Lesson[];\r\n}\r\n\r\nexport interface CourseData {\r\n id: string;\r\n title: string;\r\n level: number;\r\n subject: string;\r\n units: Unit[];\r\n}\r\n\r\n// 用户数据类型\r\nexport interface UserData {\r\n id: string;\r\n name: string;\r\n level: number;\r\n avatar: string;\r\n badges: string[];\r\n}\r\n\r\n// 探索菜单项\r\nexport interface ExploreItem {\r\n id: string;\r\n label: string;\r\n status: string;\r\n}\r\n\r\n// 单元进度类型\r\nexport interface UnitProgress {\r\n unitId: string;\r\n title: string;\r\n progressPercentage: number;\r\n status: 'not-started' | 'in-progress' | 'completed';\r\n totalLessons: number;\r\n completedLessons: number;\r\n lastAccessed?: string;\r\n}\r\n\r\n// 状态管理类型\r\nexport interface AppState {\r\n currentUnitId: string | null;\r\n currentLessonId: string | null;\r\n currentKnowledgeId: string | null;\r\n sidebarCollapsed: boolean;\r\n exploreMenuOpen: boolean;\r\n activeLessonIds: string[];\r\n \r\n // Actions\r\n setCurrentUnit: (unitId: string) => void;\r\n setCurrentLesson: (lessonId: string) => void;\r\n setCurrentKnowledge: (knowledgeId: string) => void;\r\n toggleSidebar: () => void;\r\n toggleExploreMenu: (open?: boolean) => void;\r\n toggleLessonActive: (lessonId: string) => void;\r\n}\r\n\r\n// 图标映射\r\nexport const categoryIcons: Record<string, string> = {\r\n \"Arithmetic and Algebra\": \"🔢\",\r\n \"Graphics and Geometry\": \"📐\",\r\n \"Probability and Statistics\": \"📊\",\r\n \"Default\": \"📚\"\r\n};\r\n\r\n// 状态映射\r\nexport const statusMapping: Record<string, string> = {\r\n 'mastered': '已掌握',\r\n 'proficient': '熟练',\r\n 'familiar': '熟悉',\r\n 'attempted': '已尝试',\r\n 'not-started': '未开始'\r\n};\r\n\r\nexport const statusColors: Record<string, string> = {\r\n 'mastered': '#10b981',\r\n 'proficient': '#3b82f6',\r\n 'familiar': '#f59e0b',\r\n 'attempted': '#8b5cf6',\r\n 'not-started': '#6b7280'\r\n};","// 单一数据源 - 所有模拟数据集中管理\r\n// 这是整个应用的唯一mock数据来源,确保数据一致性\r\n\r\nexport const MOCK_USER_DATA = {\r\n id: 'user-001',\r\n name: '小明',\r\n level: 5,\r\n avatar: 'https://i.pravatar.cc/40?u=student1',\r\n logIn: true,\r\n badges: ['🏆', '🏅', '🌟']\r\n};\r\n\r\nexport const MOCK_EXPLORE_ITEMS = [\r\n { id: 'g3', label: '三年级', status: 'new', onClick: () => console.log('三年级 clicked') },\r\n { id: 'g4', label: '四年级', status: '2%', onClick: () => console.log('四年级 clicked') },\r\n { id: 'g5', label: '五年级', status: '进行中', onClick: () => console.log('五年级 clicked') },\r\n { id: 'g6', label: '六年级', status: 'new', onClick: () => console.log('六年级 clicked') },\r\n { id: 'g7', label: '七年级', status: 'new', onClick: () => console.log('七年级 clicked') },\r\n { id: 'g8', label: '八年级', status: 'new', onClick: () => console.log('八年级 clicked') },\r\n { id: 'alg_topic', label: '代数专题', status: 'new', onClick: () => console.log('代数专题 clicked') },\r\n { id: 'calc_topic', label: '计算专题', status: 'new', onClick: () => console.log('计算专题 clicked') },\r\n { id: 'geo_topic', label: '几何专题', status: 'new', onClick: () => console.log('几何专题 clicked') },\r\n { id: 'olym_topic', label: '奥数专题', status: 'new', onClick: () => console.log('奥数专题 clicked') }\r\n];\r\n\r\n// JWT token (API专用)\r\nexport const MOCK_JWT_TOKEN = \"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOiJ1c2VyLTAwMSIsIm5hbWUiOiLlsI_mmI4iLCJsZXZlbCI6NSwiYXZhdGFyIjoiaHR0cHM6Ly9pLnByYXZhdGFyLmNjLzQwP3U9c3R1ZGVudDEiLCJiYWRnZXMiOlsi8J-SoiIsIvCfjZUiLCLwn5KbIl0sImlhdCI6MTY5MTYwMDAwMCwiZXhwIjoxNzIzMTM2MDAwfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c\";","import type { CourseData, UnitProgress } from '../types';\r\nimport { MOCK_JWT_TOKEN } from '../data/mockData';\r\n\r\nexport interface UserGradeUnitsNav {\r\n userId: string;\r\n courseId: string;\r\n courseTitle: string;\r\n courseLevel: number;\r\n totalUnits: number;\r\n completedUnits: number;\r\n overallProgress: number;\r\n status: 'not-started' | 'in-progress' | 'completed';\r\n lastAccessed?: string;\r\n units: Array<{\r\n unitId: string;\r\n title: string;\r\n description: string;\r\n moduleCategory: string;\r\n estimatedDuration: string;\r\n totalLessons: number;\r\n completedLessons: number;\r\n progressPercentage: number;\r\n status: 'not-started' | 'in-progress' | 'completed';\r\n lastAccessed?: string;\r\n isActive: boolean;\r\n route: string;\r\n }>;\r\n}\r\n\r\nexport interface BatchLessonProgressUpdate {\r\n lessonId: string;\r\n status: 'not-started' | 'in-progress' | 'completed';\r\n progress?: number;\r\n}\r\n\r\nclass CourseService {\r\n private baseURL: string;\r\n private token: string;\r\n\r\n constructor(baseURL: string = '/api', token: string = MOCK_JWT_TOKEN) {\r\n this.baseURL = baseURL;\r\n this.token = token;\r\n }\r\n\r\n private getAuthHeaders(): HeadersInit {\r\n return {\r\n 'Authorization': `Bearer ${this.token}`,\r\n 'Content-Type': 'application/json'\r\n };\r\n }\r\n\r\n private async fetchWithAuth(url: string, options: RequestInit = {}): Promise<Response> {\r\n const response = await fetch(url, {\r\n ...options,\r\n headers: {\r\n ...this.getAuthHeaders(),\r\n ...options.headers\r\n }\r\n });\r\n\r\n if (!response.ok) {\r\n throw new Error(`HTTP error! status: ${response.status}`);\r\n }\r\n\r\n return response;\r\n }\r\n\r\n // 获取课程数据\r\n async getCourseData(courseId: string): Promise<CourseData> {\r\n const response = await this.fetchWithAuth(`${this.baseURL}/courses/${courseId}`);\r\n return response.json();\r\n }\r\n\r\n // 获取用户年级单元导航数据(包含所有单元进度)\r\n async getUserGradeUnitsNav(gradeId?: string): Promise<UserGradeUnitsNav> {\r\n const url = gradeId\r\n ? `${this.baseURL}/user/grade/units/nav?gradeId=${encodeURIComponent(gradeId)}`\r\n : `${this.baseURL}/user/grade/units/nav`;\r\n\r\n const response = await this.fetchWithAuth(url);\r\n return response.json();\r\n }\r\n\r\n // 获取单元进度\r\n async getUnitProgress(courseId: string, unitId?: string): Promise<Record<string, UnitProgress>> {\r\n const url = unitId\r\n ? `${this.baseURL}/courses/${courseId}/units/${unitId}/progress`\r\n : `${this.baseURL}/courses/${courseId}/progress`;\r\n\r\n const response = await this.fetchWithAuth(url);\r\n return response.json();\r\n }\r\n\r\n // 批量更新单元课时进度\r\n async batchUpdateLessonProgress(\r\n unitId: string,\r\n progressUpdates: BatchLessonProgressUpdate[]\r\n ): Promise<{ success: boolean; results: Array<{ lessonId: string; success: boolean; status: string }> }> {\r\n const response = await this.fetchWithAuth(\r\n `${this.baseURL}/user/units/${unitId}/progress/batch`,\r\n {\r\n method: 'POST',\r\n body: JSON.stringify(progressUpdates)\r\n }\r\n );\r\n\r\n return response.json();\r\n }\r\n\r\n // 更新学习进度(单个课时)\r\n async updateLessonProgress(\r\n courseId: string,\r\n unitId: string,\r\n lessonId: string,\r\n status: 'completed' | 'in-progress' | 'not-started'\r\n ): Promise<void> {\r\n await this.fetchWithAuth(\r\n `${this.baseURL}/courses/${courseId}/units/${unitId}/lessons/${lessonId}/progress`,\r\n {\r\n method: 'POST',\r\n body: JSON.stringify({ status })\r\n }\r\n );\r\n }\r\n\r\n // 设置认证token\r\n setToken(token: string): void {\r\n this.token = token;\r\n }\r\n\r\n // 获取当前token\r\n getToken(): string {\r\n return this.token;\r\n }\r\n}\r\n\r\n// 单例模式导出\r\nexport const courseService = new CourseService();","import type { CourseData } from '../types';\r\n\r\nexport const courseData: CourseData = {\r\n \"id\": \"g5\",\r\n \"title\": \"小学数学五年级\",\r\n \"level\": 5,\r\n \"subject\": \"数学\",\r\n \"units\": [\r\n {\r\n \"id\": \"unit_1\",\r\n \"title\": \"小数乘法\",\r\n \"description\": \"学习小数乘法的计算方法及应用\",\r\n \"estimatedDuration\": \"3周\",\r\n \"totalLessons\": 10,\r\n \"moduleCategory\": \"Arithmetic and Algebra\",\r\n \"lessons\": [\r\n { \"id\": \"unit1_lesson1\", \"title\": \"小数乘整数\", \"duration\": 40, \"knowledgeItems\": [ { \"id\": \"unit1_lesson1_k1\", \"title\": \"小数乘整数的意义\", \"description\": \"理解小数乘整数的意义与整数乘法相同\", \"progress\": 0, \"contentUrl\": \"\" }, { \"id\": \"unit1_lesson1_k2\", \"title\": \"小数乘整数的计算方法\", \"description\": \"掌握小数乘整数的计算方法:先按整数乘法计算,再看因数中有几位小数,就从积的右边起数出几位点上小数点\", \"progress\": 0, \"contentUrl\": \"\" } ] },\r\n { \"id\": \"unit1_lesson2\", \"title\": \"小数乘小数\", \"duration\": 40, \"knowledgeItems\": [ { \"id\": \"unit1_lesson2_k1\", \"title\": \"小数乘小数的计算方法\", \"description\": \"掌握小数乘小数的计算方法:先按整数乘法算出积,再给积点上小数点\", \"progress\": 0, \"contentUrl\": \"\" }, { \"id\": \"unit1_lesson2_k2\", \"title\": \"积的小数位数确定\", \"description\": \"理解积的小数位数等于两个因数的小数位数之和\", \"progress\": 0, \"contentUrl\": \"\" } ] },\r\n { \"id\": \"unit1_lesson3\", \"title\": \"积的近似数\", \"duration\": 40, \"knowledgeItems\": [ { \"id\": \"unit1_lesson3_k1\", \"title\": \"用\\\"四舍五入\\\"法求积的近似数\", \"description\": \"掌握用\\\"四舍五入\\\"法求积的近似数的方法\", \"progress\": 0, \"contentUrl\": \"\" } ] },\r\n { \"id\": \"unit1_lesson4\", \"title\": \"整数乘法运算定律推广到小数\", \"duration\": 40, \"knowledgeItems\": [ { \"id\": \"unit1_lesson4_k1\", \"title\": \"乘法运算定律在小数中的适用性\", \"description\": \"理解整数乘法运算定律对于小数乘法同样适用\", \"progress\": 0, \"contentUrl\": \"\" }, { \"id\": \"unit1_lesson4_k2\", \"title\": \"运用运算定律进行简便计算\", \"description\": \"能运用乘法运算定律进行小数乘法的简便计算\", \"progress\": 0, \"contentUrl\": \"\" } ] },\r\n { \"id\": \"unit1_lesson5\", \"title\": \"解决问题\", \"duration\": 40, \"knowledgeItems\": [ { \"id\": \"unit1_lesson5_k1\", \"title\": \"用小数乘法解决实际问题\", \"description\": \"能运用小数乘法解决购物、面积计算等实际问题\", \"progress\": 0, \"contentUrl\": \"\" } ] }\r\n ]\r\n },\r\n {\r\n \"id\": \"unit_2\", \"title\": \"小数除法\", \"description\": \"学习小数除法的计算方法及应用\", \"estimatedDuration\": \"3周\", \"totalLessons\": 12, \"moduleCategory\": \"Arithmetic and Algebra\",\r\n \"lessons\": [\r\n { \"id\": \"unit2_lesson1\", \"title\": \"小数除以整数\", \"duration\": 40, \"knowledgeItems\": [ { \"id\": \"unit2_lesson1_k1\", \"title\": \"小数除以整数的计算方法\", \"description\": \"掌握小数除以整数的计算方法:按照整数除法的方法计算,商的小数点要与被除数的小数点对齐\", \"progress\": 0, \"contentUrl\": \"\" } ] },\r\n { \"id\": \"unit2_lesson2\", \"title\": \"一个数除以小数\", \"duration\": 40, \"knowledgeItems\": [ { \"id\": \"unit2_lesson2_k1\", \"title\": \"除数是小数的除法计算方法\", \"description\": \"掌握除数是小数的除法计算方法:利用商不变的性质,将除数转化为整数\", \"progress\": 0, \"contentUrl\": \"\" } ] },\r\n { \"id\": \"unit2_lesson3\", \"title\": \"商的近似数\", \"duration\": 40, \"knowledgeItems\": [ { \"id\": \"unit2_lesson3_k1\", \"title\": \"用\\\"四舍五入\\\"法求商的近似数\", \"description\": \"掌握用\\\"四舍五入\\\"法求商的近似数的方法\", \"progress\": 0, \"contentUrl\": \"\" } ] },\r\n { \"id\": \"unit2_lesson4\", \"title\": \"循环小数\", \"duration\": 40, \"knowledgeItems\": [ { \"id\": \"unit2_lesson4_k1\", \"title\": \"循环小数的概念\", \"description\": \"理解循环小数的概念,认识循环节\", \"progress\": 0, \"contentUrl\": \"\" }, { \"id\": \"unit2_lesson4_k2\", \"title\": \"循环小数的表示方法\", \"description\": \"掌握循环小数的简便表示方法\", \"progress\": 0, \"contentUrl\": \"\" } ] },\r\n { \"id\": \"unit2_lesson5\", \"title\": \"用计算器探索规律\", \"duration\": 40, \"knowledgeItems\": [ { \"id\": \"unit2_lesson5_k1\", \"title\": \"用计算器计算小数除法\", \"description\": \"会用计算器计算较复杂的小数除法\", \"progress\": 0, \"contentUrl\": \"\" }, { \"id\": \"unit2_lesson5_k2\", \"title\": \"发现商的变化规律\", \"description\": \"能借助计算器发现商的变化规律\", \"progress\": 0, \"contentUrl\": \"\" } ] },\r\n { \"id\": \"unit2_lesson6\", \"title\": \"解决问题\", \"duration\": 40, \"knowledgeItems\": [ { \"id\": \"unit2_lesson6_k1\", \"title\": \"用小数除法解决实际问题\", \"description\": \"能运用小数除法解决购物、分配等实际问题\", \"progress\": 0, \"contentUrl\": \"\" } ] }\r\n ]\r\n },\r\n {\r\n \"id\": \"unit_3\", \"title\": \"简易方程\", \"description\": \"学习用字母表示数和解简易方程\", \"estimatedDuration\": \"4周\", \"totalLessons\": 14, \"moduleCategory\": \"Arithmetic and Algebra\",\r\n \"lessons\": [\r\n { \"id\": \"unit3_lesson1\", \"title\": \"用字母表示数\", \"duration\": 40, \"knowledgeItems\": [ { \"id\": \"unit3_lesson1_k1\", \"title\": \"用字母表示数\", \"description\": \"初步理解用字母表示数的意义和作用\", \"progress\": 0, \"contentUrl\": \"\" }, { \"id\": \"unit3_lesson1_k2\", \"title\": \"用字母表示运算定律和计算公式\", \"description\": \"会用字母表示运算定律和计算公式\", \"progress\": 0, \"contentUrl\": \"\" } ] },\r\n { \"id\": \"unit3_lesson2\", \"title\": \"方程的意义\", \"duration\": 40, \"knowledgeItems\": [ { \"id\": \"unit3_lesson2_k1\", \"title\": \"方程的概念\", \"description\": \"理解方程的意义,知道方程与等式的区别和联系\", \"progress\": 0, \"contentUrl\": \"\" } ] },\r\n { \"id\": \"unit3_lesson3\", \"title\": \"等式的性质\", \"duration\": 40, \"knowledgeItems\": [ { \"id\": \"unit3_lesson3_k1\", \"title\": \"等式的性质1\", \"description\": \"理解等式的性质1:等式两边加上或减去同一个数,左右两边仍然相等\", \"progress\": 0, \"contentUrl\": \"\" }, { \"id\": \"unit3_lesson3_k2\", \"title\": \"等式的性质2\", \"description\": \"理解等式的性质2:等式两边乘同一个数,或除以同一个不为0的数,左右两边仍然相等\", \"progress\": 0, \"contentUrl\": \"\" } ] },\r\n { \"id\": \"unit3_lesson4\", \"title\": \"解简易方程\", \"duration\": 40, \"knowledgeItems\": [ { \"id\": \"unit3_lesson4_k1\", \"title\": \"利用等式的性质解方程\", \"description\": \"会利用等式的性质解形如x±a=b、ax=b、x÷a=b、a-x=b、a÷x=b的方程\", \"progress\": 0, \"contentUrl\": \"\" } ] },\r\n { \"id\": \"unit3_lesson5\", \"title\": \"实际问题与方程\", \"duration\": 40, \"knowledgeItems\": [ { \"id\": \"unit3_lesson5_k1\", \"title\": \"列方程解决实际问题\", \"description\": \"初步学会列方程解决一些简单的实际问题\", \"progress\": 0, \"contentUrl\": \"\" } ] }\r\n ]\r\n },\r\n {\r\n \"id\": \"unit_4\", \"title\": \"多边形的面积\", \"description\": \"学习平行四边形、三角形、梯形和组合图形的面积计算\", \"estimatedDuration\": \"3周\", \"totalLessons\": 12, \"moduleCategory\": \"Graphics and Geometry\",\r\n \"lessons\": [\r\n { \"id\": \"unit4_lesson1\", \"title\": \"平行四边形的面积\", \"duration\": 40, \"knowledgeItems\": [ { \"id\": \"unit4_lesson1_k1\", \"title\": \"平行四边形面积公式的推导\", \"description\": \"通过割补法理解平行四边形面积公式的推导过程\", \"progress\": 0, \"contentUrl\": \"\" }, { \"id\": \"unit4_lesson1_k2\", \"title\": \"平行四边形面积的计算\", \"description\": \"掌握平行四边形面积计算公式:S=ah,并能正确运用\", \"progress\": 0, \"contentUrl\": \"\" } ] },\r\n { \"id\": \"unit4_lesson2\", \"title\": \"三角形的面积\", \"duration\": 40, \"knowledgeItems\": [ { \"id\": \"unit4_lesson2_k1\", \"title\": \"三角形面积公式的推导\", \"description\": \"通过拼摆法理解三角形面积公式的推导过程\", \"progress\": 0, \"contentUrl\": \"\" }, { \"id\": \"unit4_lesson2_k2\", \"title\": \"三角形面积的计算\", \"description\": \"掌握三角形面积计算公式:S=ah÷2,并能正确运用\", \"progress\": 0, \"contentUrl\": \"\" } ] },\r\n { \"id\": \"unit4_lesson3\", \"title\": \"梯形的面积\", \"duration\": 40, \"knowledgeItems\": [ { \"id\": \"unit4_lesson3_k1\", \"title\": \"梯形面积公式的推导\", \"description\": \"通过拼摆法理解梯形面积公式的推导过程\", \"progress\": 0, \"contentUrl\": \"\" }, { \"id\": \"unit4_lesson3_k2\", \"title\": \"梯形面积的计算\", \"description\": \"掌握梯形面积计算公式:S=(a+b)h÷2,并能正确运用\", \"progress\": 0, \"contentUrl\": \"\" } ] },\r\n { \"id\": \"unit4_lesson4\", \"title\": \"组合图形的面积\", \"duration\": 40, \"knowledgeItems\": [ { \"id\": \"unit4_lesson4_k1\", \"title\": \"认识组合图形\", \"description\": \"认识组合图形,会把组合图形分解成已学过的平面图形\", \"progress\": 0, \"contentUrl\": \"\" }, { \"id\": \"unit4_lesson4_k2\", \"title\": \"计算组合图形的面积\", \"description\": \"掌握计算组合图形面积的多种方法\", \"progress\": 0, \"contentUrl\": \"\" } ] }\r\n ]\r\n },\r\n {\r\n \"id\": \"unit_5\", \"title\": \"因数与倍数\", \"description\": \"学习因数、倍数、质数、合数等概念\", \"estimatedDuration\": \"3周\", \"totalLessons\": 10, \"moduleCategory\": \"Arithmetic and Algebra\",\r\n \"lessons\": [\r\n { \"id\": \"unit5_lesson1\", \"title\": \"因数和倍数\", \"duration\": 40, \"knowledgeItems\": [ { \"id\": \"unit5_lesson1_k1\", \"title\": \"因数和倍数的意义\", \"description\": \"理解因数和倍数的意义,掌握找一个数的因数和倍数的方法\", \"progress\": 0, \"contentUrl\": \"\" }, { \"id\": \"unit5_lesson1_k2\", \"title\": \"因数和倍数的特征\", \"description\": \"了解一个数的因数的个数是有限的,倍数的个数是无限的\", \"progress\": 0, \"contentUrl\": \"\" } ] },\r\n { \"id\": \"unit5_lesson2\", \"title\": \"2、5、3的倍数的特征\", \"duration\": 40, \"knowledgeItems\": [ { \"id\": \"unit5_lesson2_k1\", \"title\": \"2、5的倍数的特征\", \"description\": \"掌握2、5的倍数的特征,理解奇数和偶数的意义\", \"progress\": 0, \"contentUrl\": \"\" }, { \"id\": \"unit5_lesson2_k2\", \"title\": \"3的倍数的特征\", \"description\": \"掌握3的倍数的特征,能判断一个数是不是3的倍数\", \"progress\": 0, \"contentUrl\": \"\" } ] },\r\n { \"id\": \"unit5_lesson3\", \"title\": \"质数和合数\", \"duration\": 40, \"knowledgeItems\": [ { \"id\": \"unit5_lesson3_k1\", \"title\": \"质数和合数的意义\", \"description\": \"理解质数和合数的意义,能判断一个数是质数还是合数\", \"progress\": 0, \"contentUrl\": \"\" }, { \"id\": \"unit5_lesson3_k2\", \"title\": \"制作100以内的质数表\", \"description\": \"会制作100以内的质数表,熟记20以内的质数\", \"progress\": 0, \"contentUrl\": \"\" } ] }\r\n ]\r\n },\r\n {\r\n \"id\": \"unit_6\", \"title\": \"长方体和正方体\", \"description\": \"学习长方体和正方体的特征、表面积和体积计算\", \"estimatedDuration\": \"4周\", \"totalLessons\": 14, \"moduleCategory\": \"Graphics and Geometry\",\r\n \"lessons\": [\r\n { \"id\": \"unit6_lesson1\", \"title\": \"长方体和正方体的认识\", \"duration\": 40, \"knowledgeItems\": [ { \"id\": \"unit6_lesson1_k1\", \"title\": \"长方体的特征\", \"description\": \"认识长方体的特征,了解长方体的长、宽、高\", \"progress\": 0, \"contentUrl\": \"\" }, { \"id\": \"unit6_lesson1_k2\", \"title\": \"正方体的特征\", \"description\": \"认识正方体的特征,理解正方体是特殊的长方体\", \"progress\": 0, \"contentUrl\": \"\" } ] },\r\n { \"id\": \"unit6_lesson2\", \"title\": \"长方体和正方体的表面积\", \"duration\": 40, \"knowledgeItems\": [ { \"id\": \"unit6_lesson2_k1\", \"title\": \"表面积的意义\", \"description\": \"理解表面积的意义,掌握长方体和正方体表面积的计算方法\", \"progress\": 0, \"contentUrl\": \"\" }, { \"id\": \"unit6_lesson2_k2\", \"title\": \"表面积的实际应用\", \"description\": \"能运用表面积知识解决一些实际问题\", \"progress\": 0, \"contentUrl\": \"\" } ] },\r\n { \"id\": \"unit6_lesson3\", \"title\": \"长方体和正方体的体积\", \"duration\": 40, \"knowledgeItems\": [ { \"id\": \"unit6_lesson3_k1\", \"title\": \"体积和体积单位\", \"description\": \"理解体积的意义,认识常用的体积单位\", \"progress\": 0, \"contentUrl\": \"\" }, { \"id\": \"unit6_lesson3_k2\", \"title\": \"长方体和正方体体积的计算\", \"description\": \"掌握长方体和正方体体积的计算公式\", \"progress\": 0, \"contentUrl\": \"\" }, { \"id\": \"unit6_lesson3_k3\", \"title\": \"体积单位间的进率\", \"description\": \"掌握体积单位之间的进率和换算\", \"progress\": 0, \"contentUrl\": \"\" } ] },\r\n { \"id\": \"unit6_lesson4\", \"title\": \"容积和容积单位\", \"duration\": 40, \"knowledgeItems\": [ { \"id\": \"unit6_lesson4_k1\", \"title\": \"容积和容积单位\", \"description\": \"理解容积的意义,认识常用的容积单位\", \"progress\": 0, \"contentUrl\": \"\" }, { \"id\": \"unit6_lesson4_k2\", \"title\": \"容积和体积的关系\", \"description\": \"掌握容积和体积之间的关系\", \"progress\": 0, \"contentUrl\": \"\" } ] }\r\n ]\r\n },\r\n {\r\n \"id\": \"unit_7\", \"title\": \"分数的意义和性质\", \"description\": \"学习分数的意义、性质和约分、通分等方法\", \"estimatedDuration\": \"4周\", \"totalLessons\": 16, \"moduleCategory\": \"Arithmetic and Algebra\",\r\n \"lessons\": [\r\n { \"id\": \"unit7_lesson1\", \"title\": \"分数的意义\", \"duration\": 40, \"knowledgeItems\": [ { \"id\": \"unit7_lesson1_k1\", \"title\": \"分数的产生和意义\", \"description\": \"理解分数的产生和意义,明确分数与除法的关系\", \"progress\": 0, \"contentUrl\": \"\" }, { \"id\": \"unit7_lesson1_k2\", \"title\": \"分数单位\", \"description\": \"认识分数单位,能说出一个分数中有几个这样的分数单位\", \"progress\": 0, \"contentUrl\": \"\" } ] },\r\n { \"id\": \"unit7_lesson2\", \"title\": \"分数与除法\", \"duration\": 40, \"knowledgeItems\": [ { \"id\": \"unit7_lesson2_k1\", \"title\": \"分数与除法的关系\", \"description\": \"理解分数与除法的关系,会用分数表示两个数相除的商\", \"progress\": 0, \"contentUrl\": \"\" } ] },\r\n { \"id\": \"unit7_lesson3\", \"title\": \"真分数和假分数\", \"duration\": 40, \"knowledgeItems\": [ { \"id\": \"unit7_lesson3_k1\", \"title\": \"真分数和假分数的意义\", \"description\": \"理解真分数和假分数的意义和特征\", \"progress\": 0, \"contentUrl\": \"\" }, { \"id\": \"unit7_lesson3_k2\", \"title\": \"带分数\", \"description\": \"认识带分数,会进行假分数与整数、带分数的互化\", \"progress\": 0, \"contentUrl\": \"\" } ] },\r\n { \"id\": \"unit7_lesson4\", \"title\": \"分数的基本性质\", \"duration\": 40, \"knowledgeItems\": [ { \"id\": \"unit7_lesson4_k1\", \"title\": \"分数的基本性质\", \"description\": \"理解分数的基本性质,能运用分数的基本性质进行分数的变形\", \"progress\": 0, \"contentUrl\": \"\" } ] },\r\n { \"id\": \"unit7_lesson5\", \"title\": \"约分\", \"duration\": 40, \"knowledgeItems\": [ { \"id\": \"unit7_lesson5_k1\", \"title\": \"最大公因数\", \"description\": \"理解公因数和最大公因数的意义,掌握求两个数的最大公因数的方法\", \"progress\": 0, \"contentUrl\": \"\" }, { \"id\": \"unit7_lesson5_k2\", \"title\": \"约分的方法\", \"description\": \"掌握约分的方法,能正确地进行约分\", \"progress\": 0, \"contentUrl\": \"\" } ] },\r\n { \"id\": \"unit7_lesson6\", \"title\": \"通分\", \"duration\": 40, \"knowledgeItems\": [ { \"id\": \"unit7_lesson6_k1\", \"title\": \"最小公倍数\", \"description\": \"理解公倍数和最小公倍数的意义,掌握求两个数的最小公倍数的方法\", \"progress\": 0, \"contentUrl\": \"\" }, { \"id\": \"unit7_lesson6_k2\", \"title\": \"通分的方法\", \"description\": \"掌握通分的方法,能正确地进行通分\", \"progress\": 0, \"contentUrl\": \"\" } ] },\r\n { \"id\": \"unit7_lesson7\", \"title\": \"分数和小数的互化\", \"duration\": 40, \"knowledgeItems\": [ { \"id\": \"unit7_lesson7_k1\", \"title\": \"分数化成小数\", \"description\": \"掌握分数化成小数的方法\", \"progress\": 0, \"contentUrl\": \"\" }, { \"id\": \"unit7_lesson7_k2\", \"title\": \"小数化成分数\", \"description\": \"掌握小数化成分数的方法\", \"progress\": 0, \"contentUrl\": \"\" } ] }\r\n ]\r\n },\r\n {\r\n \"id\": \"unit_8\", \"title\": \"分数的加法和减法\", \"description\": \"学习同分母分数、异分母分数的加法和减法\", \"estimatedDuration\": \"3周\", \"totalLessons\": 12, \"moduleCategory\": \"Arithmetic and Algebra\",\r\n \"lessons\": [\r\n { \"id\": \"unit8_lesson1\", \"title\": \"同分母分数加、减法\", \"duration\": 40, \"knowledgeItems\": [ { \"id\": \"unit8_lesson1_k1\", \"title\": \"同分母分数加法的计算方法\", \"description\": \"掌握同分母分数加法的计算方法\", \"progress\": 0, \"contentUrl\": \"\" }, { \"id\": \"unit8_lesson1_k2\", \"title\": \"同分母分数减法的计算方法\", \"description\": \"掌握同分母分数减法的计算方法\", \"progress\": 0, \"contentUrl\": \"\" } ] },\r\n { \"id\": \"unit8_lesson2\", \"title\": \"异分母分数加、减法\", \"duration\": 40, \"knowledgeItems\": [ { \"id\": \"unit8_lesson2_k1\", \"title\": \"异分母分数加法的计算方法\", \"description\": \"掌握异分母分数加法的计算方法:先通分,然后按照同分母分数加法进行计算\", \"progress\": 0, \"contentUrl\": \"\" }, { \"id\": \"unit8_lesson2_k2\", \"title\": \"异分母分数减法的计算方法\", \"description\": \"掌握异分母分数减法的计算方法:先通分,然后按照同分母分数减法进行计算\", \"progress\": 0, \"contentUrl\": \"\" } ] },\r\n { \"id\": \"unit8_lesson3\", \"title\": \"分数加减混合运算\", \"duration\": 40, \"knowledgeItems\": [ { \"id\": \"unit8_lesson3_k1\", \"title\": \"分数加减混合运算的顺序\", \"description\": \"掌握分数加减混合运算的运算顺序\", \"progress\": 0, \"contentUrl\": \"\" }, { \"id\": \"unit8_lesson3_k2\", \"title\": \"整数加法运算定律推广到分数加法\", \"description\": \"理解整数加法运算定律对于分数加法同样适用,能运用运算定律进行简便计算\", \"progress\": 0, \"contentUrl\": \"\" } ] }\r\n ]\r\n },\r\n {\r\n \"id\": \"unit_9\", \"title\": \"折线统计图\", \"description\": \"学习单式折线统计图和复式折线统计图的认识和制作\", \"estimatedDuration\": \"2周\", \"totalLessons\": 6, \"moduleCategory\": \"Probability and Statistics\",\r\n \"lessons\": [\r\n { \"id\": \"unit9_lesson1\", \"title\": \"单式折线统计图\", \"duration\": 40, \"knowledgeItems\": [ { \"id\": \"unit9_lesson1_k1\", \"title\": \"单式折线统计图的特点\", \"description\": \"认识单式折线统计图,了解其特点和作用\", \"progress\": 0, \"contentUrl\": \"\" }, { \"id\": \"unit9_lesson1_k2\", \"title\": \"绘制单式折线统计图\", \"description\": \"能根据数据绘制单式折线统计图\", \"progress\": 0, \"contentUrl\": \"\" } ] },\r\n { \"id\": \"unit9_lesson2\", \"title\": \"复式折线统计图\", \"duration\": 40, \"knowledgeItems\": [ { \"id\": \"unit9_lesson2_k1\", \"title\": \"复式折线统计图的特点\", \"description\": \"认识复式折线统计图,了解其特点和作用\", \"progress\": 0, \"contentUrl\": \"\" }, { \"id\": \"unit9_lesson2_k2\", \"title\": \"绘制复式折线统计图\", \"description\": \"能根据数据绘制复式折线统计图\", \"progress\": 0, \"contentUrl\": \"\" } ] },\r\n { \"id\": \"unit9_lesson3\", \"title\": \"数据分析\", \"duration\": 40, \"knowledgeItems\": [ { \"id\": \"unit9_lesson3_k1\", \"title\": \"根据统计图进行数据分析\", \"description\": \"能根据折线统计图进行简单的数据分析,作出合理的判断和预测\", \"progress\": 0, \"contentUrl\": \"\" } ] }\r\n ]\r\n }\r\n ]\r\n};\r\n\r\nimport { MOCK_USER_DATA, MOCK_EXPLORE_ITEMS } from './mockData';\r\n\r\n// 从单一数据源导入,确保数据一致性\r\nexport const exploreItems = MOCK_EXPLORE_ITEMS;\r\nexport const userData = MOCK_USER_DATA;","import React, { createContext, useContext, useState, useCallback, useEffect } from 'react';\r\nimport type { UserData, Lesson } from '../../types';\r\nimport { categoryIcons } from '../../types';\r\nimport type { ExploreItem } from '../../components/MathWizHeader/MathWizHeader.types';\r\nimport type { UserGradeUnitsProgressData } from '../../components/Sidebar/types';\r\nimport type { GradeUnitBrowserContextType } from './types';\r\nimport { courseService } from '../../services/courseService';\r\nimport { courseData } from '../../data/courseData';\r\n\r\n// 创建 Context\r\nexport const GradeUnitBrowserContext = createContext<GradeUnitBrowserContextType | null>(null);\r\n\r\nexport const useGradeUnitBrowser = () => {\r\n const context = useContext(GradeUnitBrowserContext);\r\n if (!context) {\r\n throw new Error('useGradeUnitBrowser must be used within GradeUnitBrowserProvider');\r\n }\r\n return context;\r\n};\r\n\r\n// Context Provider 组件\r\nexport const GradeUnitBrowserProvider: React.FC<{ children: React.ReactNode }> = ({ children }) => {\r\n const [userInfo, setUserInfo] = useState<UserData | null>(null);\r\n const [exploreMenu, setExploreMenu] = useState<ExploreItem[]>([]);\r\n const [unitsData, setUnitsData] = useState<UserGradeUnitsProgressData | null>(null);\r\n const [lessons, setLessons] = useState<Record<string, Lesson[]>>({});\r\n const [loading, setLoading] = useState<boolean>(false);\r\n const [error, setError] = useState<string | null>(null);\r\n const [activeUnitId, setActiveUnitId] = useState<string | null>(null);\r\n const [activeLessonIds, setActiveLessonIds] = useState<string[]>([]);\r\n\r\n const loadPageData = useCallback(async (gradeId: string, userId: string) => {\r\n setLoading(true);\r\n setError(null);\r\n\r\n try {\r\n // 添加短暂延迟确保MSW已初始化\r\n await new Promise(resolve => setTimeout(resolve, 100));\r\n\r\n try {\r\n // 调用API获取数据\r\n console.log('Attempting to fetch units data from API...');\r\n console.log('API URL will be:', `/api/user/grade/units/nav?gradeId=${gradeId}`);\r\n console.log('Using token:', courseService.getToken());\r\n const unitsData = await courseService.getUserGradeUnitsNav(gradeId);\r\n console.log('API call successful, units data:', unitsData);\r\n setUnitsData(unitsData);\r\n console.log('unitsData:', unitsData);\r\n } catch (error) {\r\n const err = error as Error;\r\n console.error('🚨 MSW API 请求失败 - 详细调试信息:');\r\n console.error('📡 请求 URL:', `/api/user/grade/units/nav?gradeId=${gradeId}`);\r\n console.error('🔑 使用 Token:', courseService.getToken());\r\n console.error('❌ 错误信息:', err.message);\r\n console.error('📝 错误类型:', err.name);\r\n console.error('🔍 错误堆栈:', err.stack);\r\n\r\n // 设置详细的错误信息用于显示\r\n setError(`MSW API 请求失败: ${err.message} - 请检查浏览器控制台获取详细信息`);\r\n // 如果API调用失败,使用courseData.ts中的完整数据作为fallback\r\n const mockUnitsData = {\r\n userId: userId,\r\n courseId: 'g5',\r\n courseTitle: '小学数学五年级',\r\n courseLevel: 5,\r\n totalUnits: courseData.units.length,\r\n completedUnits: 2,\r\n overallProgress: 22,\r\n status: 'in-progress' as const,\r\n lastAccessed: new Date().toISOString(),\r\n units: courseData.units.map((unit, index) => ({\r\n unitId: unit.id,\r\n title: unit.title,\r\n description: unit.description,\r\n moduleCategory: unit.moduleCategory,\r\n estimatedDuration: unit.estimatedDuration,\r\n totalLessons: unit.lessons.length,\r\n completedLessons: index < 2 ? Math.floor(unit.lessons.length * 0.5) : 0,\r\n progressPercentage: index < 2 ? 50 : 0,\r\n status: index < 2 ? 'in-progress' as const : 'not-started' as const,\r\n lastAccessed: index < 2 ? new Date().toISOString() : undefined,\r\n isActive: index === 0,\r\n route: `/math/grade-5/unit/${unit.id}`,\r\n icon: categoryIcons[unit.moduleCategory] || categoryIcons.Default\r\n }))\r\n };\r\n setUnitsData(mockUnitsData);\r\n console.log('Using courseData.ts as fallback:', mockUnitsData);\r\n }\r\n\r\n // 设置课程数据(从本地课程数据中获取)\r\n const lessonsData: Record<string, Lesson[]> = {};\r\n courseData.units.forEach(unit => {\r\n lessonsData[unit.id] = unit.lessons.map(lesson => ({\r\n id: lesson.id,\r\n title: lesson.title,\r\n duration: lesson.duration,\r\n knowledgeItems: lesson.knowledgeItems.map(item => ({\r\n ...item,\r\n progress: 0 // 添加默认进度值\r\n }))\r\n }));\r\n });\r\n console.log('Lessons data loaded:', lessonsData);\r\n setLessons(lessonsData);\r\n\r\n // 默认单元选择将在状态更新后执行(在 useEffect 中)\r\n\r\n // 调试日志\r\n console.log('unitsData:', unitsData);\r\n console.log('unitsData.units:', unitsData?.units);\r\n console.log('First unit isActive:', unitsData?.units?.[0]?.isActive);\r\n console.log('First unit unitId:', unitsData?.units?.[0]?.unitId);\r\n console.log('Lessons data keys:', Object.keys(lessonsData));\r\n console.log('Lessons for unit_1:', lessonsData['unit_1']);\r\n\r\n // 设置用户信息(这里应该从API获取,暂时使用模拟数据)\r\n setUserInfo({\r\n id: userId,\r\n name: '学生用户',\r\n level: 5,\r\n avatar: 'https://i.pravatar.cc/40',\r\n badges: ['🏆']\r\n });\r\n\r\n // 设置探索菜单(这里应该从API获取,暂时使用模拟数据)\r\n setExploreMenu([\r\n { id: 'g5', label: '五年级', status: '进行中' },\r\n { id: 'g6', label: '六年级', status: 'new' }\r\n ]);\r\n\r\n } catch (err) {\r\n setError(err instanceof Error ? err.message : '数据加载失败');\r\n console.error('数据加载错误:', err);\r\n console.error('API call error details:', err);\r\n console.log('gradeId parameter:', gradeId);\r\n } finally {\r\n setLoading(false);\r\n }\r\n }, []);\r\n\r\n const toggleLesson = useCallback((lessonId: string) => {\r\n setActiveLessonIds(prev =>\r\n prev.includes(lessonId)\r\n ? prev.filter(id => id !== lessonId)\r\n : [...prev, lessonId]\r\n );\r\n }, []);\r\n\r\n // 包装setActiveUnit函数,接受unitId参数(可为null)\r\n const setActiveUnit = useCallback((unitId: string | null) => {\r\n setActiveUnitId(unitId);\r\n }, []);\r\n\r\n // 状态更新后执行默认单元选择\r\n useEffect(() => {\r\n console.log('unitsData state updated:', unitsData);\r\n\r\n if (unitsData && unitsData.units.length > 0) {\r\n const defaultActiveUnit = unitsData.units.find(unit => unit.isActive)?.unitId ||\r\n unitsData.units[0].unitId;\r\n setActiveUnitId(defaultActiveUnit);\r\n console.log('Default active unit set after state update:', defaultActiveUnit);\r\n }\r\n }, [unitsData]);\r\n\r\n const contextValue: GradeUnitBrowserContextType = {\r\n // 数据状态\r\n userInfo,\r\n exploreMenu,\r\n unitsData,\r\n lessons,\r\n\r\n // UI状态\r\n loading,\r\n error,\r\n activeUnitId,\r\n activeLessonIds,\r\n\r\n // Actions\r\n setLoading,\r\n setError,\r\n setActiveUnit,\r\n toggleLesson,\r\n loadPageData\r\n };\r\n\r\n return (\r\n <GradeUnitBrowserContext.Provider value={contextValue}>\r\n {children}\r\n </GradeUnitBrowserContext.Provider>\r\n );\r\n};","import React, { useEffect } from 'react';\r\nimport MathWizHeader from '../../components/MathWizHeader/MathWizHeader';\r\nimport { Sidebar } from '../../components/Sidebar/Sidebar';\r\nimport { ContentAccordion } from '../../components/ContentAccordion/ContentAccordion';\r\nimport { useGradeUnitBrowser } from './GradeUnitBrowserContext';\r\nimport type { GradeUnitBrowserPageProps } from './types';\r\nimport './GradeUnitBrowserPage.css';\r\n\r\n// 主页面组件\r\nexport const GradeUnitBrowserPage: React.FC<GradeUnitBrowserPageProps> = ({\r\n gradeId,\r\n userId,\r\n onLearnAction,\r\n className,\r\n userInfo: propUserInfo,\r\n exploreMenu: propExploreMenu\r\n}) => {\r\n const {\r\n userInfo: contextUserInfo,\r\n exploreMenu: contextExploreMenu,\r\n unitsData,\r\n lessons,\r\n loading,\r\n error,\r\n activeUnitId,\r\n activeLessonIds,\r\n setActiveUnit,\r\n toggleLesson,\r\n loadPageData\r\n } = useGradeUnitBrowser();\r\n\r\n // 使用props中的值或context中的值\r\n const userInfo = propUserInfo ?? contextUserInfo;\r\n const exploreMenu = propExploreMenu ?? contextExploreMenu;\r\n\r\n useEffect(() => {\r\n loadPageData(gradeId, userId);\r\n }, [gradeId, userId, loadPageData]);\r\n\r\n // 调试日志\r\n useEffect(() => {\r\n console.log('activeUnitId from context:', activeUnitId);\r\n console.log('lessons from context:', lessons);\r\n\r\n // 重新计算 activeUnit 用于调试\r\n const activeUnitNav = unitsData?.units?.find(unit => unit.unitId === activeUnitId) || null;\r\n const debugActiveUnit = activeUnitNav && activeUnitId && lessons[activeUnitId] ? {\r\n id: activeUnitNav.unitId,\r\n title: activeUnitNav.title,\r\n description: activeUnitNav.description,\r\n estimatedDuration: activeUnitNav.estimatedDuration,\r\n totalLessons: activeUnitNav.totalLessons,\r\n moduleCategory: activeUnitNav.moduleCategory,\r\n lessons: lessons[activeUnitId]\r\n } : null;\r\n\r\n console.log('activeUnit computed:', debugActiveUnit);\r\n }, [activeUnitId, lessons, unitsData]);\r\n\r\n // 获取当前激活的单元\r\n const activeUnitNav = unitsData?.units?.find(unit => unit.unitId === activeUnitId) || null;\r\n\r\n // 获取完整的单元数据(包含课程和知识点)\r\n const activeUnit = activeUnitNav && activeUnitId && lessons[activeUnitId] ? {\r\n id: activeUnitNav.unitId,\r\n title: activeUnitNav.title,\r\n description: activeUnitNav.description,\r\n estimatedDuration: activeUnitNav.estimatedDuration,\r\n totalLessons: activeUnitNav.totalLessons,\r\n moduleCategory: activeUnitNav.moduleCategory,\r\n lessons: lessons[activeUnitId]\r\n } : null;\r\n\r\n if (loading) {\r\n return (\r\n <div className=\"grade-unit-browser-page loading\" data-testid=\"grade-unit-browser-page\">\r\n <div className=\"loading-spinner\" data-testid=\"loading-spinner\">\r\n 加载中...\r\n </div>\r\n </div>\r\n );\r\n }\r\n\r\n if (error) {\r\n return (\r\n <div className=\"grade-unit-browser-page error\" data-testid=\"grade-unit-browser-page\">\r\n <div className=\"error-message\" data-testid=\"error-message\">\r\n {error}\r\n </div>\r\n <button\r\n onClick={() => loadPageData(gradeId, userId)}\r\n className=\"retry-button\"\r\n >\r\n 重试\r\n </button>\r\n </div>\r\n );\r\n }\r\n\r\n return (\r\n <div\r\n className={`grade-unit-browser-page ${className || ''}`}\r\n data-testid=\"grade-unit-browser-page\"\r\n >\r\n {/* Header 区域 */}\r\n <div className=\"header-area\">\r\n <MathWizHeader\r\n userData={userInfo || undefined}\r\n exploreItems={exploreMenu}\r\n />\r\n </div>\r\n\r\n {/* Sidebar 区域 */}\r\n <div className=\"sidebar-area\">\r\n <Sidebar\r\n data={unitsData}\r\n activeUnitId={activeUnitId}\r\n onUnitSelect={setActiveUnit}\r\n loading={loading}\r\n />\r\n </div>\r\n\r\n {/* 主内容区域 */}\r\n <div className=\"content-area\">\r\n <ContentAccordion\r\n unit={activeUnit}\r\n activeLessonIds={activeLessonIds}\r\n onToggleLesson={toggleLesson}\r\n onLearnAction={onLearnAction || (() => { })}\r\n loading={loading}\r\n />\r\n </div>\r\n </div>\r\n );\r\n};","/**\r\n * 几何核心工具函数 \r\n * 专注于三角形寻宝游戏的几何计算、坐标处理和三角形验证\r\n */\r\n\r\n// ==================== 基础几何计算 ====================\r\n\r\n/**\r\n * 计算线段上指定比例的点\r\n * @param {Object} p1 - 起点 {x, y}\r\n * @param {Object} p2 - 终点 {x, y}\r\n * @param {number} ratio - 比例 (0-1)\r\n * @returns {Object} 计算出的点 {x, y}\r\n */\r\nexport const pointOnLine = (p1, p2, ratio) => ({\r\n x: p1.x + (p2.x - p1.x) * ratio,\r\n y: p1.y + (p2.y - p1.y) * ratio\r\n});\r\n\r\n\r\n// ==================== 几何数据导入 ====================\r\n\r\n/**\r\n * 🔧 架构修复:从单一数据源导入几何数据\r\n * \r\n * ✅ 职责:提供纯工具函数 (符合utils层职责)\r\n * \r\n * 数据源:\r\n * - 统一从 data/geometryDefinitions.js 获取\r\n * - 实现真正的单一数据源架构\r\n * - 支持依赖注入和数据源切换\r\n */\r\n\r\n/**\r\n * 计算标准化的三角形分割点坐标 - 重构版本\r\n */\r\nexport const calculateGamePoints = () => {\r\n\r\n // 基础三角形顶点(归一化坐标)\r\n const A = { x: 0.5, y: 0.1, name: 'A' };\r\n const B = { x: 0.1, y: 0.75, name: 'B' };\r\n const C = { x: 0.9, y: 0.75, name: 'C' };\r\n\r\n // 第一层分割线(距离顶点A的1/3处)\r\n const D = { ...pointOnLine(A, B, 1 / 3), name: 'D' };\r\n const E = { ...pointOnLine(A, C, 1 / 3), name: 'E' };\r\n\r\n // 第二层分割线(距离顶点A的2/3处)\r\n const M = { ...pointOnLine(A, B, 2 / 3), name: 'M' };\r\n const N = { ...pointOnLine(A, C, 2 / 3), name: 'N' };\r\n\r\n // 底边BC上的分割点\r\n const P = { ...pointOnLine(B, C, 1 / 3), name: 'P' };\r\n const Q = { ...pointOnLine(B, C, 2 / 3), name: 'Q' };\r\n\r\n // DE线上的分割点\r\n const U = { ...pointOnLine(D, E, 1 / 3), name: 'U' };\r\n const S = { ...pointOnLine(D, E, 2 / 3), name: 'S' };\r\n\r\n // MN线上的分割点\r\n const K = { ...pointOnLine(M, N, 1 / 3), name: 'K' };\r\n const L = { ...pointOnLine(M, N, 2 / 3), name: 'L' };\r\n\r\n return { A, B, C, D, E, M, N, P, Q, U, S, K, L };\r\n};\r\n\r\n/**\r\n * 将归一化坐标转换为绝对像素坐标\r\n * @param {Object} normalizedPoints - 归一化坐标点集\r\n * @param {number} width - 画布宽度\r\n * @param {number} height - 画布高度\r\n * @returns {Object} 绝对坐标点集\r\n */\r\nexport const toPixelCoordinates = (normalizedPoints, width, height) => {\r\n const pixelPoints = {};\r\n\r\n for (const [name, point] of Object.entries(normalizedPoints)) {\r\n pixelPoints[name] = {\r\n ...point,\r\n x: point.x * width,\r\n y: point.y * height\r\n };\r\n }\r\n\r\n return pixelPoints;\r\n};\r\n\r\n\r\n\r\n/**\r\n * 使用重心坐标判断点是否在三角形内 - 来自 gameUtils.js\r\n * @param {Object} point - 待检测的点 {x, y}\r\n * @param {Array} triangle - 三角形的三个顶点\r\n * @returns {boolean} 点是否在三角形内\r\n */\r\nexport const isPointInTriangle = (point, triangle) => {\r\n const [p1, p2, p3] = triangle;\r\n const { x, y } = point;\r\n\r\n // 使用重心坐标系\r\n const denominator = ((p2.y - p3.y) * (p1.x - p3.x) + (p3.x - p2.x) * (p1.y - p3.y));\r\n\r\n if (Math.abs(denominator) < 0.0001) return false; // 退化三角形\r\n\r\n const a = ((p2.y - p3.y) * (x - p3.x) + (p3.x - p2.x) * (y - p3.y)) / denominator;\r\n const b = ((p3.y - p1.y) * (x - p3.x) + (p1.x - p3.x) * (y - p3.y)) / denominator;\r\n const c = 1 - a - b;\r\n\r\n // 点在三角形内当且仅当所有重心坐标都非负\r\n return a >= -0.001 && b >= -0.001 && c >= -0.001;\r\n};\r\n\r\n/**\r\n * 检查两个三角形是否匹配 (顶点相同,顺序可能不同) - 来自 gameUtils.js\r\n * @param {Array} triangle1 - 第一个三角形的顶点数组\r\n * @param {Array} triangle2 - 第二个三角形的顶点数组\r\n * @returns {boolean} 是否匹配\r\n */\r\nexport const trianglesMatch = (triangle1, triangle2) => {\r\n if (!triangle1 || !triangle2) return false;\r\n if (triangle1.length !== 3 || triangle2.length !== 3) return false;\r\n\r\n const names1 = triangle1.map(p => p.name).sort();\r\n const names2 = triangle2.map(p => p.name).sort();\r\n\r\n return names1.every((name, index) => name === names2[index]);\r\n};\r\n\r\n/**\r\n * 比较两个点数组是否包含相同的点(忽略顺序)\r\n * @param {Array} points1 - 第一组点\r\n * @param {Array} points2 - 第二组点\r\n * @returns {boolean} 是否匹配\r\n */\r\nexport const comparePointArrays = (points1, points2) => {\r\n if (!points1 || !points2 || points1.length !== points2.length) {\r\n return false;\r\n }\r\n\r\n const names1 = points1.map(p => p.name).sort();\r\n const names2 = points2.map(p => p.name).sort();\r\n\r\n return names1.join('') === names2.join('');\r\n};\r\n\r\n\r\n\r\n/**\r\n * 获取标准化的三角形连线定义\r\n * @returns {Array} 连线数组\r\n */\r\nexport const getBasicLineDefinitions = () => [\r\n // 大三角形边\r\n { from: 'A', to: 'B' },\r\n { from: 'A', to: 'C' },\r\n { from: 'B', to: 'C' },\r\n \r\n // 第一层分割线\r\n { from: 'D', to: 'E' },\r\n \r\n // 第二层分割线\r\n { from: 'M', to: 'N' },\r\n \r\n // 底边分割线\r\n { from: 'P', to: 'Q' },\r\n \r\n // 连接到顶点的线段\r\n { from: 'A', to: 'D' },\r\n { from: 'A', to: 'E' },\r\n { from: 'A', to: 'M' },\r\n { from: 'A', to: 'N' },\r\n { from: 'A', to: 'P' },\r\n { from: 'A', to: 'Q' },\r\n \r\n // 内部连接线段\r\n { from: 'D', to: 'U' },\r\n { from: 'U', to: 'S' },\r\n { from: 'S', to: 'E' },\r\n { from: 'M', to: 'K' },\r\n { from: 'K', to: 'L' },\r\n { from: 'L', to: 'N' },\r\n \r\n // 到底边的连接\r\n { from: 'B', to: 'P' },\r\n { from: 'P', to: 'Q' },\r\n { from: 'Q', to: 'C' }\r\n];\r\n\r\n/**\r\n * 获取18个宝石的基础定义 - MVP版本\r\n * @returns {Array} 宝石数组\r\n */\r\nexport const getBasicGemDefinitions = () => [\r\n // 大三角形系列(3个)\r\n { id: 'gem_1', vertices: ['A', 'B', 'P'], points: 10, category: 'basic' },\r\n { id: 'gem_2', vertices: ['A', 'P', 'Q'], points: 10, category: 'basic' },\r\n { id: 'gem_3', vertices: ['A', 'Q', 'C'], points: 10, category: 'basic' },\r\n\r\n // 中等三角形系列(3个)\r\n { id: 'gem_4', vertices: ['A', 'B', 'Q'], points: 15, category: 'medium' },\r\n { id: 'gem_5', vertices: ['A', 'P', 'C'], points: 15, category: 'medium' },\r\n { id: 'gem_6', vertices: ['A', 'B', 'C'], points: 20, category: 'large' },\r\n\r\n // ADE区域系列(6个)\r\n { id: 'gem_7', vertices: ['A', 'D', 'U'], points: 12, category: 'ade_small' },\r\n { id: 'gem_8', vertices: ['A', 'U', 'S'], points: 12, category: 'ade_small' },\r\n { id: 'gem_9', vertices: ['A', 'S', 'E'], points: 12, category: 'ade_small' },\r\n { id: 'gem_10', vertices: ['A', 'D', 'S'], points: 18, category: 'ade_medium' },\r\n { id: 'gem_11', vertices: ['A', 'U', 'E'], points: 18, category: 'ade_medium' },\r\n { id: 'gem_12', vertices: ['A', 'D', 'E'], points: 25, category: 'ade_large' },\r\n\r\n // AMN区域系列(6个)\r\n { id: 'gem_13', vertices: ['A', 'M', 'K'], points: 14, category: 'amn_small' },\r\n { id: 'gem_14', vertices: ['A', 'K', 'L'], points: 14, category: 'amn_small' },\r\n { id: 'gem_15', vertices: ['A', 'L', 'N'], points: 14, category: 'amn_small' },\r\n { id: 'gem_16', vertices: ['A', 'M', 'L'], points: 20, category: 'amn_medium' },\r\n { id: 'gem_17', vertices: ['A', 'K', 'N'], points: 20, category: 'amn_medium' },\r\n { id: 'gem_18', vertices: ['A', 'M', 'N'], points: 30, category: 'amn_large' }\r\n];\r\n\r\n// ==================== 几何配置和默认导出 ====================\r\n\r\n/**\r\n * 几何配置常量 - 整合版本\r\n */\r\nexport const GEOMETRY_CONFIG = {\r\n TOTAL_GEMS: 18,\r\n CANVAS_RATIO: 4 / 3,\r\n DEFAULT_VIEWBOX: { width: 700, height: 600 },\r\n POINT_RADIUS: { default: 6, selected: 9 },\r\n TOLERANCE: 0.001,\r\n\r\n // 新增:几何计算相关常量\r\n MIN_TRIANGLE_AREA: 0.001,\r\n COORDINATE_PRECISION: 0.0001,\r\n BARYCENTRIC_TOLERANCE: -0.001\r\n};\r\n\r\n/**\r\n * 默认导出 - 包含所有几何工具函数\r\n */\r\nexport default {\r\n // 基础几何计算\r\n pointOnLine,\r\n calculateGamePoints,\r\n toPixelCoordinates,\r\n\r\n // 三角形验证和分析\r\n isPointInTriangle,\r\n trianglesMatch,\r\n comparePointArrays,\r\n\r\n // 数据和配置 (重新导出数据层接口)\r\n getBasicGemDefinitions,\r\n getBasicLineDefinitions,\r\n GEOMETRY_CONFIG,\r\n\r\n // 🔧 新增:单一数据源访问接口\r\n // getStandardGeometryPoints: calculateGamePoints // 暂时注释掉,需要时再实现\r\n}; ","import { MOCK_USER_DATA, MOCK_JWT_TOKEN } from './mockData';\r\nimport { courseData } from './courseData';\r\n\r\nexport interface UserLessonProgress {\r\n lessonId: string;\r\n status: 'not-started' | 'in-progress' | 'completed';\r\n progressPercentage: number;\r\n lastAccessed?: string;\r\n timeSpent?: number; // 分钟\r\n score?: number; // 分数 0-100\r\n attempts?: number; // 尝试次数\r\n}\r\n\r\nexport interface UserUnitProgress {\r\n unitId: string;\r\n userId: string;\r\n totalLessons: number;\r\n completedLessons: number;\r\n progressPercentage: number;\r\n status: 'not-started' | 'in-progress' | 'completed';\r\n lastAccessed?: string;\r\n lessons: UserLessonProgress[];\r\n}\r\n\r\nexport interface UserCourseProgress {\r\n courseId: string;\r\n userId: string;\r\n totalUnits: number;\r\n completedUnits: number;\r\n progressPercentage: number;\r\n status: 'not-started' | 'in-progress' | 'completed';\r\n lastAccessed?: string;\r\n units: UserUnitProgress[];\r\n}\r\n\r\n// 生成模拟的用户课程进度数据\r\nexport const generateMockUserCourseProgress = (userId: string = MOCK_USER_DATA.id): UserCourseProgress => {\r\n const unitsProgress: UserUnitProgress[] = courseData.units.map((unit, index) => {\r\n // 模拟进度数据 - 根据单元索引设置不同的进度\r\n const baseProgress = Math.min(100, Math.max(0, index * 15 + Math.random() * 20));\r\n const completedLessons = Math.floor((unit.lessons.length * baseProgress) / 100);\r\n\r\n const lessonsProgress: UserLessonProgress[] = unit.lessons.map((lesson, lessonIndex) => {\r\n const lessonProgress = Math.min(100, Math.max(0, baseProgress - (lessonIndex * 10) + Math.random() * 30));\r\n\r\n return {\r\n lessonId: lesson.id,\r\n status: lessonProgress >= 100 ? 'completed' : lessonProgress > 0 ? 'in-progress' : 'not-started',\r\n progressPercentage: Math.round(lessonProgress),\r\n lastAccessed: lessonProgress > 0 ? new Date(Date.now() - Math.random() * 7 * 24 * 60 * 60 * 1000).toISOString() : undefined,\r\n timeSpent: lessonProgress > 0 ? Math.floor(Math.random() * 120 + 10) : undefined,\r\n score: lessonProgress >= 100 ? Math.floor(Math.random() * 21 + 80) : undefined,\r\n attempts: lessonProgress > 0 ? Math.floor(Math.random() * 3 + 1) : undefined\r\n };\r\n });\r\n\r\n return {\r\n unitId: unit.id,\r\n userId,\r\n totalLessons: unit.lessons.length,\r\n completedLessons,\r\n progressPercentage: Math.round(baseProgress),\r\n status: baseProgress >= 100 ? 'completed' : baseProgress > 0 ? 'in-progress' : 'not-started',\r\n lastAccessed: baseProgress > 0 ? new Date(Date.now() - Math.random() * 14 * 24 * 60 * 60 * 1000).toISOString() : undefined,\r\n lessons: lessonsProgress\r\n };\r\n });\r\n\r\n const totalProgress = unitsProgress.reduce((sum, unit) => sum + unit.progressPercentage, 0) / unitsProgress.length;\r\n const completedUnits = unitsProgress.filter(unit => unit.status === 'completed').length;\r\n\r\n return {\r\n courseId: courseData.id,\r\n userId,\r\n totalUnits: unitsProgress.length,\r\n completedUnits,\r\n progressPercentage: Math.round(totalProgress),\r\n status: totalProgress >= 100 ? 'completed' : totalProgress > 0 ? 'in-progress' : 'not-started',\r\n lastAccessed: new Date(Date.now() - Math.random() * 3 * 24 * 60 * 60 * 1000).toISOString(),\r\n units: unitsProgress\r\n };\r\n};\r\n\r\n// 模拟用户课程进度数据\r\nexport const MOCK_USER_COURSE_PROGRESS: UserCourseProgress = generateMockUserCourseProgress();\r\n\r\n// 获取用户课程进度\r\nexport const getUserCourseProgress = (userId: string, courseId: string): UserCourseProgress | null => {\r\n if (userId === MOCK_USER_DATA.id && courseId === courseData.id) {\r\n return MOCK_USER_COURSE_PROGRESS;\r\n }\r\n return null;\r\n};\r\n\r\n// 获取特定单元的进度\r\nexport const getUserUnitProgress = (userId: string, courseId: string, unitId: string): UserUnitProgress | null => {\r\n const courseProgress = getUserCourseProgress(userId, courseId);\r\n if (!courseProgress) return null;\r\n\r\n return courseProgress.units.find(unit => unit.unitId === unitId) || null;\r\n};\r\n\r\n// 获取特定课时的进度\r\nexport const getUserLessonProgress = (userId: string, courseId: string, unitId: string, lessonId: string): UserLessonProgress | null => {\r\n const unitProgress = getUserUnitProgress(userId, courseId, unitId);\r\n if (!unitProgress) return null;\r\n\r\n return unitProgress.lessons.find(lesson => lesson.lessonId === lessonId) || null;\r\n};\r\n\r\n// 更新课时进度\r\nexport const updateUserLessonProgress = (\r\n userId: string,\r\n courseId: string,\r\n unitId: string,\r\n lessonId: string,\r\n progress: Partial<UserLessonProgress>\r\n): boolean => {\r\n // 在实际应用中,这里会调用API更新数据库\r\n // 这里只是模拟更新操作\r\n console.log('Updating lesson progress:', { userId, courseId, unitId, lessonId, progress });\r\n return true;\r\n};","import { MOCK_USER_DATA, MOCK_JWT_TOKEN } from './mockData';\r\nimport { courseData } from './courseData';\r\nimport { getUserCourseProgress } from './userCourseProgress';\r\nimport type { UserUnitProgress } from './userCourseProgress';\r\n\r\nexport interface UserGradeUnitNavItem {\r\n unitId: string;\r\n title: string;\r\n description: string;\r\n moduleCategory: string;\r\n estimatedDuration: string;\r\n totalLessons: number;\r\n completedLessons: number;\r\n progressPercentage: number;\r\n status: 'not-started' | 'in-progress' | 'completed';\r\n lastAccessed?: string;\r\n isActive: boolean;\r\n route: string;\r\n icon?: string;\r\n}\r\n\r\nexport interface UserGradeUnitsNav {\r\n userId: string;\r\n courseId: string;\r\n courseTitle: string;\r\n courseLevel: number;\r\n totalUnits: number;\r\n completedUnits: number;\r\n overallProgress: number;\r\n status: 'not-started' | 'in-progress' | 'completed';\r\n lastAccessed?: string;\r\n units: UserGradeUnitNavItem[];\r\n}\r\n\r\n// 获取用户年级单元导航数据\r\nexport const getUserGradeUnitsNav = (userId: string, courseId: string): UserGradeUnitsNav | null => {\r\n const userProgress = getUserCourseProgress(userId, courseId);\r\n if (!userProgress) return null;\r\n\r\n const unitsNav: UserGradeUnitNavItem[] = courseData.units.map((unit, index) => {\r\n const unitProgress = userProgress.units.find(up => up.unitId === unit.id);\r\n\r\n return {\r\n unitId: unit.id,\r\n title: unit.title,\r\n description: unit.description,\r\n moduleCategory: unit.moduleCategory,\r\n estimatedDuration: unit.estimatedDuration,\r\n totalLessons: unit.lessons.length,\r\n completedLessons: unitProgress?.completedLessons || 0,\r\n progressPercentage: unitProgress?.progressPercentage || 0,\r\n status: unitProgress?.status || 'not-started',\r\n lastAccessed: unitProgress?.lastAccessed,\r\n isActive: index === 0, // 默认第一个单元为活跃状态\r\n route: `/math/grade-${courseData.level}/unit/${unit.id}`\r\n };\r\n });\r\n\r\n return {\r\n userId,\r\n courseId: courseData.id,\r\n courseTitle: courseData.title,\r\n courseLevel: courseData.level,\r\n totalUnits: unitsNav.length,\r\n completedUnits: unitsNav.filter(unit => unit.status === 'completed').length,\r\n overallProgress: userProgress.progressPercentage,\r\n status: userProgress.status,\r\n lastAccessed: userProgress.lastAccessed,\r\n units: unitsNav\r\n };\r\n};\r\n\r\n// 获取特定单元的导航项\r\nexport const getUnitNavItem = (userId: string, courseId: string, unitId: string): UserGradeUnitNavItem | null => {\r\n const navData = getUserGradeUnitsNav(userId, courseId);\r\n if (!navData) return null;\r\n\r\n return navData.units.find(unit => unit.unitId === unitId) || null;\r\n};\r\n\r\n// 更新单元活跃状态\r\nexport const updateUnitActiveStatus = (userId: string, courseId: string, unitId: string, isActive: boolean): boolean => {\r\n // 在实际应用中,这里会更新用户的学习状态\r\n // 这里只是模拟操作\r\n console.log('Updating unit active status:', { userId, courseId, unitId, isActive });\r\n return true;\r\n};\r\n\r\n// 模拟用户年级单元导航数据\r\nexport const MOCK_USER_GRADE_UNITS_NAV: UserGradeUnitsNav = getUserGradeUnitsNav(MOCK_USER_DATA.id, courseData.id)!;","// 用户年级单元进度数据 - 用于 Sidebar 展示组件\r\nimport { MOCK_USER_DATA } from './mockData';\r\nimport { courseData } from './courseData';\r\n\r\nexport interface UnitProgressData {\r\n unitId: string;\r\n title: string;\r\n description: string;\r\n moduleCategory: string;\r\n estimatedDuration: string;\r\n totalLessons: number;\r\n completedLessons: number;\r\n progressPercentage: number;\r\n status: 'not-started' | 'in-progress' | 'completed';\r\n lastAccessed?: string;\r\n isActive: boolean;\r\n route: string;\r\n icon?: string;\r\n}\r\n\r\nexport interface UserGradeUnitsProgressData {\r\n userId: string;\r\n courseId: string;\r\n courseTitle: string;\r\n courseLevel: number;\r\n totalUnits: number;\r\n completedUnits: number;\r\n overallProgress: number;\r\n status: 'not-started' | 'in-progress' | 'completed';\r\n lastAccessed?: string;\r\n units: UnitProgressData[];\r\n}\r\n\r\n// 模拟用户年级单元进度数据 - 用于 Sidebar 展示组件\r\n// 此数据仅用于展示,不包含任何业务逻辑或API调用\r\n\r\nexport const MOCK_USER_GRADE_UNITS_PROGRESS: UserGradeUnitsProgressData = {\r\n userId: MOCK_USER_DATA.id,\r\n courseId: courseData.id,\r\n courseTitle: courseData.title,\r\n courseLevel: courseData.level,\r\n totalUnits: courseData.units.length,\r\n completedUnits: 3,\r\n overallProgress: 45,\r\n status: 'in-progress',\r\n lastAccessed: '2024-01-15T10:30:00Z',\r\n units: [\r\n {\r\n unitId: 'unit_1',\r\n title: '小数乘法',\r\n description: '学习小数乘法的计算方法及应用',\r\n moduleCategory: 'Arithmetic and Algebra',\r\n estimatedDuration: '3周',\r\n totalLessons: 10,\r\n completedLessons: 8,\r\n progressPercentage: 80,\r\n status: 'completed',\r\n lastAccessed: '2024-01-10T14:20:00Z',\r\n isActive: false,\r\n route: '/math/grade-5/unit/unit_1',\r\n icon: '🔢'\r\n },\r\n {\r\n unitId: 'unit_2',\r\n title: '小数除法',\r\n description: '学习小数除法的计算方法及应用',\r\n moduleCategory: 'Arithmetic and Algebra',\r\n estimatedDuration: '3周',\r\n totalLessons: 12,\r\n completedLessons: 6,\r\n progressPercentage: 50,\r\n status: 'in-progress',\r\n lastAccessed: '2024-01-15T10:30:00Z',\r\n isActive: true,\r\n route: '/math/grade-5/unit/unit_2',\r\n icon: '➗'\r\n },\r\n {\r\n unitId: 'unit_3',\r\n title: '简易方程',\r\n description: '学习用字母表示数和解简易方程',\r\n moduleCategory: 'Arithmetic and Algebra',\r\n estimatedDuration: '4周',\r\n totalLessons: 14,\r\n completedLessons: 2,\r\n progressPercentage: 14,\r\n status: 'in-progress',\r\n lastAccessed: '2024-01-12T16:45:00Z',\r\n isActive: false,\r\n route: '/math/grade-5/unit/unit_3',\r\n icon: '📝'\r\n },\r\n {\r\n unitId: 'unit_4',\r\n title: '多边形的面积',\r\n description: '学习平行四边形、三角形、梯形和组合图形的面积计算',\r\n moduleCategory: 'Graphics and Geometry',\r\n estimatedDuration: '3周',\r\n totalLessons: 12,\r\n completedLessons: 0,\r\n progressPercentage: 0,\r\n status: 'not-started',\r\n isActive: false,\r\n route: '/math/grade-5/unit/unit_4',\r\n icon: '📐'\r\n },\r\n {\r\n unitId: 'unit_5',\r\n title: '因数与倍数',\r\n description: '学习因数、倍数、质数、合数等概念',\r\n moduleCategory: 'Arithmetic and Algebra',\r\n estimatedDuration: '3周',\r\n totalLessons: 10,\r\n completedLessons: 0,\r\n progressPercentage: 0,\r\n status: 'not-started',\r\n isActive: false,\r\n route: '/math/grade-5/unit/unit_5',\r\n icon: '🔢'\r\n },\r\n {\r\n unitId: 'unit_6',\r\n title: '长方体和正方体',\r\n description: '学习长方体和正方体的特征、表面积和体积计算',\r\n moduleCategory: 'Graphics and Geometry',\r\n estimatedDuration: '4周',\r\n totalLessons: 14,\r\n completedLessons: 0,\r\n progressPercentage: 0,\r\n status: 'not-started',\r\n isActive: false,\r\n route: '/math/grade-5/unit/unit_6',\r\n icon: '📦'\r\n },\r\n {\r\n unitId: 'unit_7',\r\n title: '分数的意义和性质',\r\n description: '学习分数的意义、性质和约分、通分等方法',\r\n moduleCategory: 'Arithmetic and Algebra',\r\n estimatedDuration: '4周',\r\n totalLessons: 16,\r\n completedLessons: 0,\r\n progressPercentage: 0,\r\n status: 'not-started',\r\n isActive: false,\r\n route: '/math/grade-5/unit/unit_7',\r\n icon: '½'\r\n },\r\n {\r\n unitId: 'unit_8',\r\n title: '分数的加法和减法',\r\n description: '学习同分母分数、异分母分数的加法和减法',\r\n moduleCategory: 'Arithmetic and Algebra',\r\n estimatedDuration: '3周',\r\n totalLessons: 12,\r\n completedLessons: 0,\r\n progressPercentage: 0,\r\n status: 'not-started',\r\n isActive: false,\r\n route: '/math/grade-5/unit/unit_8',\r\n icon: '➕'\r\n },\r\n {\r\n unitId: 'unit_9',\r\n title: '折线统计图',\r\n description: '学习单式折线统计图和复式折线统计图的认识和制作',\r\n moduleCategory: 'Probability and Statistics',\r\n estimatedDuration: '2周',\r\n totalLessons: 6,\r\n completedLessons: 0,\r\n progressPercentage: 0,\r\n status: 'not-started',\r\n isActive: false,\r\n route: '/math/grade-5/unit/unit_9',\r\n icon: '📊'\r\n }\r\n ]\r\n};"],"names":["f","require$$0","k","l","m","n","p","q","c","a","g","b","d","e","h","reactJsxRuntime_production_min","React","REACT_ELEMENT_TYPE","REACT_PORTAL_TYPE","REACT_FRAGMENT_TYPE","REACT_STRICT_MODE_TYPE","REACT_PROFILER_TYPE","REACT_PROVIDER_TYPE","REACT_CONTEXT_TYPE","REACT_FORWARD_REF_TYPE","REACT_SUSPENSE_TYPE","REACT_SUSPENSE_LIST_TYPE","REACT_MEMO_TYPE","REACT_LAZY_TYPE","REACT_OFFSCREEN_TYPE","MAYBE_ITERATOR_SYMBOL","FAUX_ITERATOR_SYMBOL","getIteratorFn","maybeIterable","maybeIterator","ReactSharedInternals","error","format","_len2","args","_key2","printWarning","level","ReactDebugCurrentFrame","stack","argsWithFormat","item","enableScopeAPI","enableCacheElement","enableTransitionTracing","enableLegacyHidden","enableDebugTracing","REACT_MODULE_REFERENCE","isValidElementType","type","getWrappedName","outerType","innerType","wrapperName","displayName","functionName","getContextName","getComponentNameFromType","context","provider","outerName","lazyComponent","payload","init","assign","disabledDepth","prevLog","prevInfo","prevWarn","prevError","prevGroup","prevGroupCollapsed","prevGroupEnd","disabledLog","disableLogs","props","reenableLogs","ReactCurrentDispatcher","prefix","describeBuiltInComponentFrame","name","source","ownerFn","x","match","reentry","componentFrameCache","PossiblyWeakMap","describeNativeComponentFrame","fn","construct","frame","control","previousPrepareStackTrace","previousDispatcher","Fake","sample","sampleLines","controlLines","s","_frame","syntheticFrame","describeFunctionComponentFrame","shouldConstruct","Component","prototype","describeUnknownElementTypeFrameInDEV","hasOwnProperty","loggedTypeFailures","setCurrentlyValidatingElement","element","owner","checkPropTypes","typeSpecs","values","location","componentName","has","typeSpecName","error$1","err","ex","isArrayImpl","isArray","typeName","value","hasToStringTag","willCoercionThrow","testStringCoercion","checkKeyStringCoercion","ReactCurrentOwner","RESERVED_PROPS","specialPropKeyWarningShown","specialPropRefWarningShown","hasValidRef","config","getter","hasValidKey","warnIfStringRefCannotBeAutoConverted","self","defineKeyPropWarningGetter","warnAboutAccessingKey","defineRefPropWarningGetter","warnAboutAccessingRef","ReactElement","key","ref","jsxDEV","maybeKey","propName","defaultProps","ReactCurrentOwner$1","ReactDebugCurrentFrame$1","setCurrentlyValidatingElement$1","propTypesMisspellWarningShown","isValidElement","object","getDeclarationErrorAddendum","getSourceInfoErrorAddendum","ownerHasKeyUseWarning","getCurrentComponentErrorInfo","parentType","info","parentName","validateExplicitKey","currentComponentErrorInfo","childOwner","validateChildKeys","node","i","child","iteratorFn","iterator","step","validatePropTypes","propTypes","_name","validateFragmentProps","fragment","keys","didWarnAboutKeySpread","jsxWithValidation","isStaticChildren","validType","sourceInfo","typeString","children","beforeExample","afterExample","jsxWithValidationStatic","jsxWithValidationDynamic","jsx","jsxs","reactJsxRuntime_development","jsxRuntimeModule","require$$1","Button","progress","variant","size","radius","className","loading","colorClass","buttonClasses","toKebabCase","string","toCamelCase","p1","p2","toPascalCase","camelCase","mergeClasses","classes","index","array","hasA11yProp","prop","defaultAttributes","Icon","forwardRef","color","strokeWidth","absoluteStrokeWidth","iconNode","rest","createElement","tag","attrs","createLucideIcon","iconName","ArrowRight","ChevronDown","ChevronRight","getButtonText","calculateLessonProgress","knowledgeItems","totalProgress","sum","KnowledgeCard","knowledgeItem","onLearnAction","handleLearnClick","Card","CardBody","CardFooter","Progress","LessonItem","lesson","isExpanded","onToggle","handleToggle","lessonProgress","ContentAccordion","unit","activeLessonIds","onToggleLesson","emptyState","getProgressColor","status","Sidebar","data","collapsed","onToggleCollapse","activeUnitId","onUnitSelect","renderUnitItem","unitItemClassName","style","unitItemStyle","handleUnitSelect","unitId","event","handleToggleCollapse","renderDefaultUnitItem","renderContent","Fragment","Submenu","trigger","items","position","alignment","openDelay","closeDelay","onOpen","onClose","renderItem","itemConfig","menuClassName","itemClassName","isOpen","setIsOpen","openTimeoutRef","closeTimeoutRef","clearTimeouts","handleMouseEnter","handleMouseLeave","handleItemClick","defaultRenderItem","getPanelClasses","bind","thisArg","toString","getPrototypeOf","toStringTag","kindOf","cache","thing","str","kindOfTest","typeOfTest","isUndefined","isBuffer","val","isFunction","isArrayBuffer","isArrayBufferView","result","isString","isNumber","isObject","isBoolean","isPlainObject","isEmptyObject","isDate","isFile","isBlob","isFileList","isStream","isFormData","kind","isURLSearchParams","isReadableStream","isRequest","isResponse","isHeaders","trim","forEach","obj","allOwnKeys","len","findKey","_key","_global","isContextDefined","merge","caseless","skipUndefined","assignValue","targetKey","extend","stripBOM","content","inherits","constructor","superConstructor","descriptors","toFlatObject","sourceObj","destObj","filter","propFilter","merged","endsWith","searchString","lastIndex","toArray","arr","isTypedArray","TypedArray","forEachEntry","_iterator","pair","matchAll","regExp","matches","isHTMLForm","isRegExp","reduceDescriptors","reducer","reducedDescriptors","descriptor","ret","freezeMethods","toObjectSet","arrayOrString","delimiter","define","noop","toFiniteNumber","defaultValue","isSpecCompliantForm","toJSONObject","visit","target","reducedValue","isAsyncFn","isThenable","_setImmediate","setImmediateSupported","postMessageSupported","token","callbacks","cb","asap","utils$1","AxiosError","message","code","request","response","utils","customProps","axiosError","msg","errCode","httpAdapter","isVisitable","removeBrackets","renderKey","path","dots","isFlatArray","predicates","toFormData","formData","options","option","metaTokens","visitor","defaultVisitor","indexes","useBlob","convertValue","el","exposedHelpers","build","encode","charMap","AxiosURLSearchParams","params","encoder","_encode","buildURL","url","serializeFn","serializedParams","hashmarkIndex","InterceptorManager","fulfilled","rejected","id","transitionalDefaults","platform$1","hasBrowserEnv","_navigator","hasStandardBrowserEnv","hasStandardBrowserWebWorkerEnv","origin","platform","toURLEncodedForm","helpers","parsePropPath","arrayToObject","formDataToJSON","buildPath","isNumericKey","isLast","stringifySafely","rawValue","parser","defaults","headers","contentType","hasJSONContentType","isObjectPayload","_FormData","transitional","forcedJSONParsing","JSONRequested","strictJSONParsing","method","ignoreDuplicateOf","parseHeaders","rawHeaders","parsed","line","$internals","normalizeHeader","header","normalizeValue","parseTokens","tokens","tokensRE","isValidHeaderName","matchHeaderValue","isHeaderNameFilter","formatHeader","w","char","buildAccessors","accessorName","methodName","arg1","arg2","arg3","AxiosHeaders$1","valueOrRewrite","rewrite","setHeader","_value","_header","_rewrite","lHeader","setHeaders","dest","entry","matcher","deleted","deleteHeader","normalized","targets","asStrings","first","computed","accessors","defineAccessor","AxiosHeaders","mapped","headerValue","transformData","fns","isCancel","CanceledError","settle","resolve","reject","validateStatus","parseProtocol","speedometer","samplesCount","min","bytes","timestamps","head","tail","firstSampleTS","chunkLength","now","startedAt","bytesCount","passed","throttle","freq","timestamp","threshold","lastArgs","timer","invoke","progressEventReducer","listener","isDownloadStream","bytesNotified","_speedometer","loaded","total","progressBytes","rate","inRange","progressEventDecorator","throttled","lengthComputable","asyncDecorator","isURLSameOrigin","isMSIE","cookies","expires","domain","secure","cookie","isAbsoluteURL","combineURLs","baseURL","relativeURL","buildFullPath","requestedURL","allowAbsoluteUrls","isRelativeUrl","headersToObject","mergeConfig","config1","config2","getMergedValue","mergeDeepProperties","valueFromConfig2","defaultToConfig2","mergeDirectKeys","mergeMap","configValue","resolveConfig","newConfig","withXSRFToken","xsrfHeaderName","xsrfCookieName","auth","formHeaders","allowedHeaders","xsrfValue","xhrAdapter","_config","requestData","requestHeaders","responseType","onUploadProgress","onDownloadProgress","onCanceled","uploadThrottled","downloadThrottled","flushUpload","flushDownload","done","onloadend","responseHeaders","timeoutErrorMessage","cancel","protocol","composeSignals","signals","timeout","length","controller","aborted","onabort","reason","unsubscribe","signal","streamChunk","chunk","chunkSize","pos","end","readBytes","iterable","readStream","stream","reader","trackStream","onProgress","onFinish","_onFinish","loadedBytes","DEFAULT_CHUNK_SIZE","globalFetchAPI","Request","Response","ReadableStream","TextEncoder","test","factory","env","envFetch","isFetchSupported","isRequestSupported","isResponseSupported","isReadableStreamSupported","encodeText","supportsRequestStream","duplexAccessed","hasContentType","supportsResponseStream","resolvers","res","getBodyLength","body","resolveBodyLength","cancelToken","withCredentials","fetchOptions","_fetch","composedSignal","requestContentLength","_request","contentTypeHeader","flush","isCredentialsSupported","resolvedOptions","isStreamResponse","responseContentLength","responseData","seedCache","getFetch","fetch","seeds","seed","map","knownAdapters","fetchAdapter.getFetch","renderReason","isResolvedHandle","adapter","adapters","nameOrAdapter","rejectedReasons","reasons","state","throwIfCancellationRequested","dispatchRequest","VERSION","validators","deprecatedWarnings","validator","version","formatMessage","opt","desc","opts","correctSpelling","assertOptions","schema","allowUnknown","Axios$1","instanceConfig","configOrUrl","dummy","paramsSerializer","contextHeaders","requestInterceptorChain","synchronousRequestInterceptors","interceptor","responseInterceptorChain","promise","chain","onFulfilled","onRejected","fullPath","Axios","generateHTTPMethod","isForm","CancelToken$1","CancelToken","executor","resolvePromise","onfulfilled","_resolve","abort","spread","callback","isAxiosError","HttpStatusCode","createInstance","defaultConfig","instance","axios","promises","all","Cancel","formToJSON","getAdapter","UserIcon","SettingsIcon","HelpIcon","LogoutIcon","DEFAULT_MENU_ITEMS","UserProfile","userId","initialUserName","initialUserAvatar","apiConfig","menuItems","avatarSize","isLoading","avatarClassName","userNameClassName","containerClassName","onMenuOpen","onMenuClose","onMenuItemClick","onLogout","renderMenuItem","renderUserInfo","userData","setUserData","setLoading","errorState","setErrorState","fetchUserData","endpoint","handleMenuItemClick","handleMenuOpen","handleMenuClose","renderDefaultUserInfo","Avatar","defaultRenderExploreItem","ExploreTrigger","MathWizHeader","logoHref","logoText","onLogoClick","exploreItems","exploreMenuOpen","onExploreMenuToggle","onExploreItemClick","renderExploreItem","userMenuItems","onUserMenuItemClick","headerClassName","logoClassName","exploreClassName","userProfileClassName","ariaLabel","ariaLabelledBy","restProps","preparedExploreItems","MathWizHeader$1","prevProps","nextProps","RadarChart","abilities","width","height","calculateRadarPoints","ability","angle","y","calculateAxisEndPoints","x2","y2","calculateLabelPosition","textAnchor","_","createStoreImpl","createState","listeners","setState","partial","replace","nextState","previousState","getState","api","initialState","createStore","identity","arg","useStore","selector","slice","createImpl","useBoundStore","create","mockRadarAbilityData","RadarAbilityService","feedback","useRadarAbilityStore","set","get","radarData","errorMessage","AbilityProgressBar","percentage","PersonalizedAdvicePanel","generalRecommendation","RecommendationCard","customLinkTexts","getLinkText","abilityName","defaultLinkTexts","AbilityAssessmentDashboard","fetchData","useEffect","styles","categoryIcons","statusMapping","statusColors","MOCK_USER_DATA","MOCK_EXPLORE_ITEMS","MOCK_JWT_TOKEN","CourseService","courseId","gradeId","progressUpdates","lessonId","courseService","courseData","GradeUnitBrowserContext","createContext","useGradeUnitBrowser","useContext","GradeUnitBrowserProvider","userInfo","setUserInfo","useState","exploreMenu","setExploreMenu","unitsData","setUnitsData","lessons","setLessons","setError","setActiveUnitId","setActiveLessonIds","loadPageData","useCallback","mockUnitsData","lessonsData","toggleLesson","prev","setActiveUnit","defaultActiveUnit","contextValue","GradeUnitBrowserPage","propUserInfo","propExploreMenu","contextUserInfo","contextExploreMenu","activeUnitNav","debugActiveUnit","activeUnit","pointOnLine","ratio","calculateGamePoints","A","B","C","D","E","M","N","P","Q","U","S","K","L","toPixelCoordinates","normalizedPoints","pixelPoints","point","isPointInTriangle","triangle","p3","denominator","trianglesMatch","triangle1","triangle2","names1","names2","comparePointArrays","points1","points2","getBasicLineDefinitions","getBasicGemDefinitions","GEOMETRY_CONFIG","generateMockUserCourseProgress","unitsProgress","baseProgress","completedLessons","lessonsProgress","lessonIndex","completedUnits","MOCK_USER_COURSE_PROGRESS","getUserCourseProgress","getUserUnitProgress","courseProgress","getUserLessonProgress","unitProgress","updateUserLessonProgress","getUserGradeUnitsNav","userProgress","unitsNav","up","getUnitNavItem","navData","updateUnitActiveStatus","isActive","MOCK_USER_GRADE_UNITS_NAV","MOCK_USER_GRADE_UNITS_PROGRESS"],"mappings":"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","x_google_ignoreList":[0,1,2,4,5,6,7,8,9,10,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,69,70]}
1
+ {"version":3,"file":"index.cjs","sources":["../node_modules/react/cjs/react-jsx-runtime.production.min.js","../node_modules/react/cjs/react-jsx-runtime.development.js","../node_modules/react/jsx-runtime.js","../src/components/Button/Button.tsx","../node_modules/lucide-react/dist/esm/shared/src/utils.js","../node_modules/lucide-react/dist/esm/defaultAttributes.js","../node_modules/lucide-react/dist/esm/Icon.js","../node_modules/lucide-react/dist/esm/createLucideIcon.js","../node_modules/lucide-react/dist/esm/icons/arrow-right.js","../node_modules/lucide-react/dist/esm/icons/chevron-down.js","../node_modules/lucide-react/dist/esm/icons/chevron-right.js","../src/components/ContentAccordion/types.ts","../src/components/ContentAccordion/ContentAccordion.tsx","../src/components/Sidebar/types.ts","../src/components/Sidebar/Sidebar.tsx","../src/components/Submenu/Submenu.tsx","../node_modules/axios/lib/helpers/bind.js","../node_modules/axios/lib/utils.js","../node_modules/axios/lib/core/AxiosError.js","../node_modules/axios/lib/helpers/null.js","../node_modules/axios/lib/helpers/toFormData.js","../node_modules/axios/lib/helpers/AxiosURLSearchParams.js","../node_modules/axios/lib/helpers/buildURL.js","../node_modules/axios/lib/core/InterceptorManager.js","../node_modules/axios/lib/defaults/transitional.js","../node_modules/axios/lib/platform/browser/index.js","../node_modules/axios/lib/platform/browser/classes/URLSearchParams.js","../node_modules/axios/lib/platform/browser/classes/FormData.js","../node_modules/axios/lib/platform/browser/classes/Blob.js","../node_modules/axios/lib/platform/common/utils.js","../node_modules/axios/lib/platform/index.js","../node_modules/axios/lib/helpers/toURLEncodedForm.js","../node_modules/axios/lib/helpers/formDataToJSON.js","../node_modules/axios/lib/defaults/index.js","../node_modules/axios/lib/helpers/parseHeaders.js","../node_modules/axios/lib/core/AxiosHeaders.js","../node_modules/axios/lib/core/transformData.js","../node_modules/axios/lib/cancel/isCancel.js","../node_modules/axios/lib/cancel/CanceledError.js","../node_modules/axios/lib/core/settle.js","../node_modules/axios/lib/helpers/parseProtocol.js","../node_modules/axios/lib/helpers/speedometer.js","../node_modules/axios/lib/helpers/throttle.js","../node_modules/axios/lib/helpers/progressEventReducer.js","../node_modules/axios/lib/helpers/isURLSameOrigin.js","../node_modules/axios/lib/helpers/cookies.js","../node_modules/axios/lib/helpers/isAbsoluteURL.js","../node_modules/axios/lib/helpers/combineURLs.js","../node_modules/axios/lib/core/buildFullPath.js","../node_modules/axios/lib/core/mergeConfig.js","../node_modules/axios/lib/helpers/resolveConfig.js","../node_modules/axios/lib/adapters/xhr.js","../node_modules/axios/lib/helpers/composeSignals.js","../node_modules/axios/lib/helpers/trackStream.js","../node_modules/axios/lib/adapters/fetch.js","../node_modules/axios/lib/adapters/adapters.js","../node_modules/axios/lib/core/dispatchRequest.js","../node_modules/axios/lib/env/data.js","../node_modules/axios/lib/helpers/validator.js","../node_modules/axios/lib/core/Axios.js","../node_modules/axios/lib/cancel/CancelToken.js","../node_modules/axios/lib/helpers/spread.js","../node_modules/axios/lib/helpers/isAxiosError.js","../node_modules/axios/lib/helpers/HttpStatusCode.js","../node_modules/axios/lib/axios.js","../node_modules/axios/index.js","../src/components/UserProfile/UserProfile.tsx","../src/components/MathWizHeader/MathWizHeader.tsx","../src/components/radarAbility/RadarChart/RadarChart.tsx","../node_modules/zustand/esm/vanilla.mjs","../node_modules/zustand/esm/react.mjs","../src/services/radarAbilityService.ts","../src/store/radarAbilityStore.ts","../src/components/radarAbility/AbilityProgressBar/AbilityProgressBar.tsx","../src/components/radarAbility/PersonalizedAdvicePanel/PersonalizedAdvicePanel.tsx","../src/components/radarAbility/RecommendationCard/RecommendationCard.tsx","../src/components/radarAbility/AbilityAssessmentDashboard/AbilityAssessmentDashboard.tsx","../src/types/index.ts","../src/data/mockData.ts","../src/data/courseData.ts","../src/services/courseService.ts","../src/data-sources/api-data-source.ts","../src/data-sources/mock-data-source.ts","../src/data-sources/factory.ts","../src/config/utils.ts","../src/pages/GradeUnitBrowserPage/GradeUnitBrowserContext.tsx","../src/pages/GradeUnitBrowserPage/GradeUnitBrowserPage.tsx","../src/utils/geometryCore.js","../src/data/userCourseProgress.ts","../src/data/usergradeuintsnav.ts","../src/data/usergradeunitsProgressData.ts"],"sourcesContent":["/**\n * @license React\n * react-jsx-runtime.production.min.js\n *\n * Copyright (c) Facebook, Inc. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n'use strict';var f=require(\"react\"),k=Symbol.for(\"react.element\"),l=Symbol.for(\"react.fragment\"),m=Object.prototype.hasOwnProperty,n=f.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.ReactCurrentOwner,p={key:!0,ref:!0,__self:!0,__source:!0};\nfunction q(c,a,g){var b,d={},e=null,h=null;void 0!==g&&(e=\"\"+g);void 0!==a.key&&(e=\"\"+a.key);void 0!==a.ref&&(h=a.ref);for(b in a)m.call(a,b)&&!p.hasOwnProperty(b)&&(d[b]=a[b]);if(c&&c.defaultProps)for(b in a=c.defaultProps,a)void 0===d[b]&&(d[b]=a[b]);return{$$typeof:k,type:c,key:e,ref:h,props:d,_owner:n.current}}exports.Fragment=l;exports.jsx=q;exports.jsxs=q;\n","/**\n * @license React\n * react-jsx-runtime.development.js\n *\n * Copyright (c) Facebook, Inc. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n'use strict';\n\nif (process.env.NODE_ENV !== \"production\") {\n (function() {\n'use strict';\n\nvar React = require('react');\n\n// ATTENTION\n// When adding new symbols to this file,\n// Please consider also adding to 'react-devtools-shared/src/backend/ReactSymbols'\n// The Symbol used to tag the ReactElement-like types.\nvar REACT_ELEMENT_TYPE = Symbol.for('react.element');\nvar REACT_PORTAL_TYPE = Symbol.for('react.portal');\nvar REACT_FRAGMENT_TYPE = Symbol.for('react.fragment');\nvar REACT_STRICT_MODE_TYPE = Symbol.for('react.strict_mode');\nvar REACT_PROFILER_TYPE = Symbol.for('react.profiler');\nvar REACT_PROVIDER_TYPE = Symbol.for('react.provider');\nvar REACT_CONTEXT_TYPE = Symbol.for('react.context');\nvar REACT_FORWARD_REF_TYPE = Symbol.for('react.forward_ref');\nvar REACT_SUSPENSE_TYPE = Symbol.for('react.suspense');\nvar REACT_SUSPENSE_LIST_TYPE = Symbol.for('react.suspense_list');\nvar REACT_MEMO_TYPE = Symbol.for('react.memo');\nvar REACT_LAZY_TYPE = Symbol.for('react.lazy');\nvar REACT_OFFSCREEN_TYPE = Symbol.for('react.offscreen');\nvar MAYBE_ITERATOR_SYMBOL = Symbol.iterator;\nvar FAUX_ITERATOR_SYMBOL = '@@iterator';\nfunction getIteratorFn(maybeIterable) {\n if (maybeIterable === null || typeof maybeIterable !== 'object') {\n return null;\n }\n\n var maybeIterator = MAYBE_ITERATOR_SYMBOL && maybeIterable[MAYBE_ITERATOR_SYMBOL] || maybeIterable[FAUX_ITERATOR_SYMBOL];\n\n if (typeof maybeIterator === 'function') {\n return maybeIterator;\n }\n\n return null;\n}\n\nvar ReactSharedInternals = React.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED;\n\nfunction error(format) {\n {\n {\n for (var _len2 = arguments.length, args = new Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) {\n args[_key2 - 1] = arguments[_key2];\n }\n\n printWarning('error', format, args);\n }\n }\n}\n\nfunction printWarning(level, format, args) {\n // When changing this logic, you might want to also\n // update consoleWithStackDev.www.js as well.\n {\n var ReactDebugCurrentFrame = ReactSharedInternals.ReactDebugCurrentFrame;\n var stack = ReactDebugCurrentFrame.getStackAddendum();\n\n if (stack !== '') {\n format += '%s';\n args = args.concat([stack]);\n } // eslint-disable-next-line react-internal/safe-string-coercion\n\n\n var argsWithFormat = args.map(function (item) {\n return String(item);\n }); // Careful: RN currently depends on this prefix\n\n argsWithFormat.unshift('Warning: ' + format); // We intentionally don't use spread (or .apply) directly because it\n // breaks IE9: https://github.com/facebook/react/issues/13610\n // eslint-disable-next-line react-internal/no-production-logging\n\n Function.prototype.apply.call(console[level], console, argsWithFormat);\n }\n}\n\n// -----------------------------------------------------------------------------\n\nvar enableScopeAPI = false; // Experimental Create Event Handle API.\nvar enableCacheElement = false;\nvar enableTransitionTracing = false; // No known bugs, but needs performance testing\n\nvar enableLegacyHidden = false; // Enables unstable_avoidThisFallback feature in Fiber\n// stuff. Intended to enable React core members to more easily debug scheduling\n// issues in DEV builds.\n\nvar enableDebugTracing = false; // Track which Fiber(s) schedule render work.\n\nvar REACT_MODULE_REFERENCE;\n\n{\n REACT_MODULE_REFERENCE = Symbol.for('react.module.reference');\n}\n\nfunction isValidElementType(type) {\n if (typeof type === 'string' || typeof type === 'function') {\n return true;\n } // Note: typeof might be other than 'symbol' or 'number' (e.g. if it's a polyfill).\n\n\n if (type === REACT_FRAGMENT_TYPE || type === REACT_PROFILER_TYPE || enableDebugTracing || type === REACT_STRICT_MODE_TYPE || type === REACT_SUSPENSE_TYPE || type === REACT_SUSPENSE_LIST_TYPE || enableLegacyHidden || type === REACT_OFFSCREEN_TYPE || enableScopeAPI || enableCacheElement || enableTransitionTracing ) {\n return true;\n }\n\n if (typeof type === 'object' && type !== null) {\n if (type.$$typeof === REACT_LAZY_TYPE || type.$$typeof === REACT_MEMO_TYPE || type.$$typeof === REACT_PROVIDER_TYPE || type.$$typeof === REACT_CONTEXT_TYPE || type.$$typeof === REACT_FORWARD_REF_TYPE || // This needs to include all possible module reference object\n // types supported by any Flight configuration anywhere since\n // we don't know which Flight build this will end up being used\n // with.\n type.$$typeof === REACT_MODULE_REFERENCE || type.getModuleId !== undefined) {\n return true;\n }\n }\n\n return false;\n}\n\nfunction getWrappedName(outerType, innerType, wrapperName) {\n var displayName = outerType.displayName;\n\n if (displayName) {\n return displayName;\n }\n\n var functionName = innerType.displayName || innerType.name || '';\n return functionName !== '' ? wrapperName + \"(\" + functionName + \")\" : wrapperName;\n} // Keep in sync with react-reconciler/getComponentNameFromFiber\n\n\nfunction getContextName(type) {\n return type.displayName || 'Context';\n} // Note that the reconciler package should generally prefer to use getComponentNameFromFiber() instead.\n\n\nfunction getComponentNameFromType(type) {\n if (type == null) {\n // Host root, text node or just invalid type.\n return null;\n }\n\n {\n if (typeof type.tag === 'number') {\n error('Received an unexpected object in getComponentNameFromType(). ' + 'This is likely a bug in React. Please file an issue.');\n }\n }\n\n if (typeof type === 'function') {\n return type.displayName || type.name || null;\n }\n\n if (typeof type === 'string') {\n return type;\n }\n\n switch (type) {\n case REACT_FRAGMENT_TYPE:\n return 'Fragment';\n\n case REACT_PORTAL_TYPE:\n return 'Portal';\n\n case REACT_PROFILER_TYPE:\n return 'Profiler';\n\n case REACT_STRICT_MODE_TYPE:\n return 'StrictMode';\n\n case REACT_SUSPENSE_TYPE:\n return 'Suspense';\n\n case REACT_SUSPENSE_LIST_TYPE:\n return 'SuspenseList';\n\n }\n\n if (typeof type === 'object') {\n switch (type.$$typeof) {\n case REACT_CONTEXT_TYPE:\n var context = type;\n return getContextName(context) + '.Consumer';\n\n case REACT_PROVIDER_TYPE:\n var provider = type;\n return getContextName(provider._context) + '.Provider';\n\n case REACT_FORWARD_REF_TYPE:\n return getWrappedName(type, type.render, 'ForwardRef');\n\n case REACT_MEMO_TYPE:\n var outerName = type.displayName || null;\n\n if (outerName !== null) {\n return outerName;\n }\n\n return getComponentNameFromType(type.type) || 'Memo';\n\n case REACT_LAZY_TYPE:\n {\n var lazyComponent = type;\n var payload = lazyComponent._payload;\n var init = lazyComponent._init;\n\n try {\n return getComponentNameFromType(init(payload));\n } catch (x) {\n return null;\n }\n }\n\n // eslint-disable-next-line no-fallthrough\n }\n }\n\n return null;\n}\n\nvar assign = Object.assign;\n\n// Helpers to patch console.logs to avoid logging during side-effect free\n// replaying on render function. This currently only patches the object\n// lazily which won't cover if the log function was extracted eagerly.\n// We could also eagerly patch the method.\nvar disabledDepth = 0;\nvar prevLog;\nvar prevInfo;\nvar prevWarn;\nvar prevError;\nvar prevGroup;\nvar prevGroupCollapsed;\nvar prevGroupEnd;\n\nfunction disabledLog() {}\n\ndisabledLog.__reactDisabledLog = true;\nfunction disableLogs() {\n {\n if (disabledDepth === 0) {\n /* eslint-disable react-internal/no-production-logging */\n prevLog = console.log;\n prevInfo = console.info;\n prevWarn = console.warn;\n prevError = console.error;\n prevGroup = console.group;\n prevGroupCollapsed = console.groupCollapsed;\n prevGroupEnd = console.groupEnd; // https://github.com/facebook/react/issues/19099\n\n var props = {\n configurable: true,\n enumerable: true,\n value: disabledLog,\n writable: true\n }; // $FlowFixMe Flow thinks console is immutable.\n\n Object.defineProperties(console, {\n info: props,\n log: props,\n warn: props,\n error: props,\n group: props,\n groupCollapsed: props,\n groupEnd: props\n });\n /* eslint-enable react-internal/no-production-logging */\n }\n\n disabledDepth++;\n }\n}\nfunction reenableLogs() {\n {\n disabledDepth--;\n\n if (disabledDepth === 0) {\n /* eslint-disable react-internal/no-production-logging */\n var props = {\n configurable: true,\n enumerable: true,\n writable: true\n }; // $FlowFixMe Flow thinks console is immutable.\n\n Object.defineProperties(console, {\n log: assign({}, props, {\n value: prevLog\n }),\n info: assign({}, props, {\n value: prevInfo\n }),\n warn: assign({}, props, {\n value: prevWarn\n }),\n error: assign({}, props, {\n value: prevError\n }),\n group: assign({}, props, {\n value: prevGroup\n }),\n groupCollapsed: assign({}, props, {\n value: prevGroupCollapsed\n }),\n groupEnd: assign({}, props, {\n value: prevGroupEnd\n })\n });\n /* eslint-enable react-internal/no-production-logging */\n }\n\n if (disabledDepth < 0) {\n error('disabledDepth fell below zero. ' + 'This is a bug in React. Please file an issue.');\n }\n }\n}\n\nvar ReactCurrentDispatcher = ReactSharedInternals.ReactCurrentDispatcher;\nvar prefix;\nfunction describeBuiltInComponentFrame(name, source, ownerFn) {\n {\n if (prefix === undefined) {\n // Extract the VM specific prefix used by each line.\n try {\n throw Error();\n } catch (x) {\n var match = x.stack.trim().match(/\\n( *(at )?)/);\n prefix = match && match[1] || '';\n }\n } // We use the prefix to ensure our stacks line up with native stack frames.\n\n\n return '\\n' + prefix + name;\n }\n}\nvar reentry = false;\nvar componentFrameCache;\n\n{\n var PossiblyWeakMap = typeof WeakMap === 'function' ? WeakMap : Map;\n componentFrameCache = new PossiblyWeakMap();\n}\n\nfunction describeNativeComponentFrame(fn, construct) {\n // If something asked for a stack inside a fake render, it should get ignored.\n if ( !fn || reentry) {\n return '';\n }\n\n {\n var frame = componentFrameCache.get(fn);\n\n if (frame !== undefined) {\n return frame;\n }\n }\n\n var control;\n reentry = true;\n var previousPrepareStackTrace = Error.prepareStackTrace; // $FlowFixMe It does accept undefined.\n\n Error.prepareStackTrace = undefined;\n var previousDispatcher;\n\n {\n previousDispatcher = ReactCurrentDispatcher.current; // Set the dispatcher in DEV because this might be call in the render function\n // for warnings.\n\n ReactCurrentDispatcher.current = null;\n disableLogs();\n }\n\n try {\n // This should throw.\n if (construct) {\n // Something should be setting the props in the constructor.\n var Fake = function () {\n throw Error();\n }; // $FlowFixMe\n\n\n Object.defineProperty(Fake.prototype, 'props', {\n set: function () {\n // We use a throwing setter instead of frozen or non-writable props\n // because that won't throw in a non-strict mode function.\n throw Error();\n }\n });\n\n if (typeof Reflect === 'object' && Reflect.construct) {\n // We construct a different control for this case to include any extra\n // frames added by the construct call.\n try {\n Reflect.construct(Fake, []);\n } catch (x) {\n control = x;\n }\n\n Reflect.construct(fn, [], Fake);\n } else {\n try {\n Fake.call();\n } catch (x) {\n control = x;\n }\n\n fn.call(Fake.prototype);\n }\n } else {\n try {\n throw Error();\n } catch (x) {\n control = x;\n }\n\n fn();\n }\n } catch (sample) {\n // This is inlined manually because closure doesn't do it for us.\n if (sample && control && typeof sample.stack === 'string') {\n // This extracts the first frame from the sample that isn't also in the control.\n // Skipping one frame that we assume is the frame that calls the two.\n var sampleLines = sample.stack.split('\\n');\n var controlLines = control.stack.split('\\n');\n var s = sampleLines.length - 1;\n var c = controlLines.length - 1;\n\n while (s >= 1 && c >= 0 && sampleLines[s] !== controlLines[c]) {\n // We expect at least one stack frame to be shared.\n // Typically this will be the root most one. However, stack frames may be\n // cut off due to maximum stack limits. In this case, one maybe cut off\n // earlier than the other. We assume that the sample is longer or the same\n // and there for cut off earlier. So we should find the root most frame in\n // the sample somewhere in the control.\n c--;\n }\n\n for (; s >= 1 && c >= 0; s--, c--) {\n // Next we find the first one that isn't the same which should be the\n // frame that called our sample function and the control.\n if (sampleLines[s] !== controlLines[c]) {\n // In V8, the first line is describing the message but other VMs don't.\n // If we're about to return the first line, and the control is also on the same\n // line, that's a pretty good indicator that our sample threw at same line as\n // the control. I.e. before we entered the sample frame. So we ignore this result.\n // This can happen if you passed a class to function component, or non-function.\n if (s !== 1 || c !== 1) {\n do {\n s--;\n c--; // We may still have similar intermediate frames from the construct call.\n // The next one that isn't the same should be our match though.\n\n if (c < 0 || sampleLines[s] !== controlLines[c]) {\n // V8 adds a \"new\" prefix for native classes. Let's remove it to make it prettier.\n var _frame = '\\n' + sampleLines[s].replace(' at new ', ' at '); // If our component frame is labeled \"<anonymous>\"\n // but we have a user-provided \"displayName\"\n // splice it in to make the stack more readable.\n\n\n if (fn.displayName && _frame.includes('<anonymous>')) {\n _frame = _frame.replace('<anonymous>', fn.displayName);\n }\n\n {\n if (typeof fn === 'function') {\n componentFrameCache.set(fn, _frame);\n }\n } // Return the line we found.\n\n\n return _frame;\n }\n } while (s >= 1 && c >= 0);\n }\n\n break;\n }\n }\n }\n } finally {\n reentry = false;\n\n {\n ReactCurrentDispatcher.current = previousDispatcher;\n reenableLogs();\n }\n\n Error.prepareStackTrace = previousPrepareStackTrace;\n } // Fallback to just using the name if we couldn't make it throw.\n\n\n var name = fn ? fn.displayName || fn.name : '';\n var syntheticFrame = name ? describeBuiltInComponentFrame(name) : '';\n\n {\n if (typeof fn === 'function') {\n componentFrameCache.set(fn, syntheticFrame);\n }\n }\n\n return syntheticFrame;\n}\nfunction describeFunctionComponentFrame(fn, source, ownerFn) {\n {\n return describeNativeComponentFrame(fn, false);\n }\n}\n\nfunction shouldConstruct(Component) {\n var prototype = Component.prototype;\n return !!(prototype && prototype.isReactComponent);\n}\n\nfunction describeUnknownElementTypeFrameInDEV(type, source, ownerFn) {\n\n if (type == null) {\n return '';\n }\n\n if (typeof type === 'function') {\n {\n return describeNativeComponentFrame(type, shouldConstruct(type));\n }\n }\n\n if (typeof type === 'string') {\n return describeBuiltInComponentFrame(type);\n }\n\n switch (type) {\n case REACT_SUSPENSE_TYPE:\n return describeBuiltInComponentFrame('Suspense');\n\n case REACT_SUSPENSE_LIST_TYPE:\n return describeBuiltInComponentFrame('SuspenseList');\n }\n\n if (typeof type === 'object') {\n switch (type.$$typeof) {\n case REACT_FORWARD_REF_TYPE:\n return describeFunctionComponentFrame(type.render);\n\n case REACT_MEMO_TYPE:\n // Memo may contain any component type so we recursively resolve it.\n return describeUnknownElementTypeFrameInDEV(type.type, source, ownerFn);\n\n case REACT_LAZY_TYPE:\n {\n var lazyComponent = type;\n var payload = lazyComponent._payload;\n var init = lazyComponent._init;\n\n try {\n // Lazy may contain any component type so we recursively resolve it.\n return describeUnknownElementTypeFrameInDEV(init(payload), source, ownerFn);\n } catch (x) {}\n }\n }\n }\n\n return '';\n}\n\nvar hasOwnProperty = Object.prototype.hasOwnProperty;\n\nvar loggedTypeFailures = {};\nvar ReactDebugCurrentFrame = ReactSharedInternals.ReactDebugCurrentFrame;\n\nfunction setCurrentlyValidatingElement(element) {\n {\n if (element) {\n var owner = element._owner;\n var stack = describeUnknownElementTypeFrameInDEV(element.type, element._source, owner ? owner.type : null);\n ReactDebugCurrentFrame.setExtraStackFrame(stack);\n } else {\n ReactDebugCurrentFrame.setExtraStackFrame(null);\n }\n }\n}\n\nfunction checkPropTypes(typeSpecs, values, location, componentName, element) {\n {\n // $FlowFixMe This is okay but Flow doesn't know it.\n var has = Function.call.bind(hasOwnProperty);\n\n for (var typeSpecName in typeSpecs) {\n if (has(typeSpecs, typeSpecName)) {\n var error$1 = void 0; // Prop type validation may throw. In case they do, we don't want to\n // fail the render phase where it didn't fail before. So we log it.\n // After these have been cleaned up, we'll let them throw.\n\n try {\n // This is intentionally an invariant that gets caught. It's the same\n // behavior as without this statement except with a better message.\n if (typeof typeSpecs[typeSpecName] !== 'function') {\n // eslint-disable-next-line react-internal/prod-error-codes\n 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`.');\n err.name = 'Invariant Violation';\n throw err;\n }\n\n error$1 = typeSpecs[typeSpecName](values, typeSpecName, componentName, location, null, 'SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED');\n } catch (ex) {\n error$1 = ex;\n }\n\n if (error$1 && !(error$1 instanceof Error)) {\n setCurrentlyValidatingElement(element);\n\n 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);\n\n setCurrentlyValidatingElement(null);\n }\n\n if (error$1 instanceof Error && !(error$1.message in loggedTypeFailures)) {\n // Only monitor this failure once because there tends to be a lot of the\n // same error.\n loggedTypeFailures[error$1.message] = true;\n setCurrentlyValidatingElement(element);\n\n error('Failed %s type: %s', location, error$1.message);\n\n setCurrentlyValidatingElement(null);\n }\n }\n }\n }\n}\n\nvar isArrayImpl = Array.isArray; // eslint-disable-next-line no-redeclare\n\nfunction isArray(a) {\n return isArrayImpl(a);\n}\n\n/*\n * The `'' + value` pattern (used in in perf-sensitive code) throws for Symbol\n * and Temporal.* types. See https://github.com/facebook/react/pull/22064.\n *\n * The functions in this module will throw an easier-to-understand,\n * easier-to-debug exception with a clear errors message message explaining the\n * problem. (Instead of a confusing exception thrown inside the implementation\n * of the `value` object).\n */\n// $FlowFixMe only called in DEV, so void return is not possible.\nfunction typeName(value) {\n {\n // toStringTag is needed for namespaced types like Temporal.Instant\n var hasToStringTag = typeof Symbol === 'function' && Symbol.toStringTag;\n var type = hasToStringTag && value[Symbol.toStringTag] || value.constructor.name || 'Object';\n return type;\n }\n} // $FlowFixMe only called in DEV, so void return is not possible.\n\n\nfunction willCoercionThrow(value) {\n {\n try {\n testStringCoercion(value);\n return false;\n } catch (e) {\n return true;\n }\n }\n}\n\nfunction testStringCoercion(value) {\n // If you ended up here by following an exception call stack, here's what's\n // happened: you supplied an object or symbol value to React (as a prop, key,\n // DOM attribute, CSS property, string ref, etc.) and when React tried to\n // coerce it to a string using `'' + value`, an exception was thrown.\n //\n // The most common types that will cause this exception are `Symbol` instances\n // and Temporal objects like `Temporal.Instant`. But any object that has a\n // `valueOf` or `[Symbol.toPrimitive]` method that throws will also cause this\n // exception. (Library authors do this to prevent users from using built-in\n // numeric operators like `+` or comparison operators like `>=` because custom\n // methods are needed to perform accurate arithmetic or comparison.)\n //\n // To fix the problem, coerce this object or symbol value to a string before\n // passing it to React. The most reliable way is usually `String(value)`.\n //\n // To find which value is throwing, check the browser or debugger console.\n // Before this exception was thrown, there should be `console.error` output\n // that shows the type (Symbol, Temporal.PlainDate, etc.) that caused the\n // problem and how that type was used: key, atrribute, input value prop, etc.\n // In most cases, this console output also shows the component and its\n // ancestor components where the exception happened.\n //\n // eslint-disable-next-line react-internal/safe-string-coercion\n return '' + value;\n}\nfunction checkKeyStringCoercion(value) {\n {\n if (willCoercionThrow(value)) {\n error('The provided key is an unsupported type %s.' + ' This value must be coerced to a string before before using it here.', typeName(value));\n\n return testStringCoercion(value); // throw (to help callers find troubleshooting comments)\n }\n }\n}\n\nvar ReactCurrentOwner = ReactSharedInternals.ReactCurrentOwner;\nvar RESERVED_PROPS = {\n key: true,\n ref: true,\n __self: true,\n __source: true\n};\nvar specialPropKeyWarningShown;\nvar specialPropRefWarningShown;\nvar didWarnAboutStringRefs;\n\n{\n didWarnAboutStringRefs = {};\n}\n\nfunction hasValidRef(config) {\n {\n if (hasOwnProperty.call(config, 'ref')) {\n var getter = Object.getOwnPropertyDescriptor(config, 'ref').get;\n\n if (getter && getter.isReactWarning) {\n return false;\n }\n }\n }\n\n return config.ref !== undefined;\n}\n\nfunction hasValidKey(config) {\n {\n if (hasOwnProperty.call(config, 'key')) {\n var getter = Object.getOwnPropertyDescriptor(config, 'key').get;\n\n if (getter && getter.isReactWarning) {\n return false;\n }\n }\n }\n\n return config.key !== undefined;\n}\n\nfunction warnIfStringRefCannotBeAutoConverted(config, self) {\n {\n if (typeof config.ref === 'string' && ReactCurrentOwner.current && self && ReactCurrentOwner.current.stateNode !== self) {\n var componentName = getComponentNameFromType(ReactCurrentOwner.current.type);\n\n if (!didWarnAboutStringRefs[componentName]) {\n error('Component \"%s\" contains the string ref \"%s\". ' + 'Support for string refs will be removed in a future major release. ' + 'This case cannot be automatically converted to an arrow function. ' + 'We ask you to manually fix this case by using useRef() or createRef() instead. ' + 'Learn more about using refs safely here: ' + 'https://reactjs.org/link/strict-mode-string-ref', getComponentNameFromType(ReactCurrentOwner.current.type), config.ref);\n\n didWarnAboutStringRefs[componentName] = true;\n }\n }\n }\n}\n\nfunction defineKeyPropWarningGetter(props, displayName) {\n {\n var warnAboutAccessingKey = function () {\n if (!specialPropKeyWarningShown) {\n specialPropKeyWarningShown = true;\n\n error('%s: `key` is not a prop. Trying to access it will result ' + 'in `undefined` being returned. If you need to access the same ' + 'value within the child component, you should pass it as a different ' + 'prop. (https://reactjs.org/link/special-props)', displayName);\n }\n };\n\n warnAboutAccessingKey.isReactWarning = true;\n Object.defineProperty(props, 'key', {\n get: warnAboutAccessingKey,\n configurable: true\n });\n }\n}\n\nfunction defineRefPropWarningGetter(props, displayName) {\n {\n var warnAboutAccessingRef = function () {\n if (!specialPropRefWarningShown) {\n specialPropRefWarningShown = true;\n\n error('%s: `ref` is not a prop. Trying to access it will result ' + 'in `undefined` being returned. If you need to access the same ' + 'value within the child component, you should pass it as a different ' + 'prop. (https://reactjs.org/link/special-props)', displayName);\n }\n };\n\n warnAboutAccessingRef.isReactWarning = true;\n Object.defineProperty(props, 'ref', {\n get: warnAboutAccessingRef,\n configurable: true\n });\n }\n}\n/**\n * Factory method to create a new React element. This no longer adheres to\n * the class pattern, so do not use new to call it. Also, instanceof check\n * will not work. Instead test $$typeof field against Symbol.for('react.element') to check\n * if something is a React Element.\n *\n * @param {*} type\n * @param {*} props\n * @param {*} key\n * @param {string|object} ref\n * @param {*} owner\n * @param {*} self A *temporary* helper to detect places where `this` is\n * different from the `owner` when React.createElement is called, so that we\n * can warn. We want to get rid of owner and replace string `ref`s with arrow\n * functions, and as long as `this` and owner are the same, there will be no\n * change in behavior.\n * @param {*} source An annotation object (added by a transpiler or otherwise)\n * indicating filename, line number, and/or other information.\n * @internal\n */\n\n\nvar ReactElement = function (type, key, ref, self, source, owner, props) {\n var element = {\n // This tag allows us to uniquely identify this as a React Element\n $$typeof: REACT_ELEMENT_TYPE,\n // Built-in properties that belong on the element\n type: type,\n key: key,\n ref: ref,\n props: props,\n // Record the component responsible for creating this element.\n _owner: owner\n };\n\n {\n // The validation flag is currently mutative. We put it on\n // an external backing store so that we can freeze the whole object.\n // This can be replaced with a WeakMap once they are implemented in\n // commonly used development environments.\n element._store = {}; // To make comparing ReactElements easier for testing purposes, we make\n // the validation flag non-enumerable (where possible, which should\n // include every environment we run tests in), so the test framework\n // ignores it.\n\n Object.defineProperty(element._store, 'validated', {\n configurable: false,\n enumerable: false,\n writable: true,\n value: false\n }); // self and source are DEV only properties.\n\n Object.defineProperty(element, '_self', {\n configurable: false,\n enumerable: false,\n writable: false,\n value: self\n }); // Two elements created in two different places should be considered\n // equal for testing purposes and therefore we hide it from enumeration.\n\n Object.defineProperty(element, '_source', {\n configurable: false,\n enumerable: false,\n writable: false,\n value: source\n });\n\n if (Object.freeze) {\n Object.freeze(element.props);\n Object.freeze(element);\n }\n }\n\n return element;\n};\n/**\n * https://github.com/reactjs/rfcs/pull/107\n * @param {*} type\n * @param {object} props\n * @param {string} key\n */\n\nfunction jsxDEV(type, config, maybeKey, source, self) {\n {\n var propName; // Reserved names are extracted\n\n var props = {};\n var key = null;\n var ref = null; // Currently, key can be spread in as a prop. This causes a potential\n // issue if key is also explicitly declared (ie. <div {...props} key=\"Hi\" />\n // or <div key=\"Hi\" {...props} /> ). We want to deprecate key spread,\n // but as an intermediary step, we will use jsxDEV for everything except\n // <div {...props} key=\"Hi\" />, because we aren't currently able to tell if\n // key is explicitly declared to be undefined or not.\n\n if (maybeKey !== undefined) {\n {\n checkKeyStringCoercion(maybeKey);\n }\n\n key = '' + maybeKey;\n }\n\n if (hasValidKey(config)) {\n {\n checkKeyStringCoercion(config.key);\n }\n\n key = '' + config.key;\n }\n\n if (hasValidRef(config)) {\n ref = config.ref;\n warnIfStringRefCannotBeAutoConverted(config, self);\n } // Remaining properties are added to a new props object\n\n\n for (propName in config) {\n if (hasOwnProperty.call(config, propName) && !RESERVED_PROPS.hasOwnProperty(propName)) {\n props[propName] = config[propName];\n }\n } // Resolve default props\n\n\n if (type && type.defaultProps) {\n var defaultProps = type.defaultProps;\n\n for (propName in defaultProps) {\n if (props[propName] === undefined) {\n props[propName] = defaultProps[propName];\n }\n }\n }\n\n if (key || ref) {\n var displayName = typeof type === 'function' ? type.displayName || type.name || 'Unknown' : type;\n\n if (key) {\n defineKeyPropWarningGetter(props, displayName);\n }\n\n if (ref) {\n defineRefPropWarningGetter(props, displayName);\n }\n }\n\n return ReactElement(type, key, ref, self, source, ReactCurrentOwner.current, props);\n }\n}\n\nvar ReactCurrentOwner$1 = ReactSharedInternals.ReactCurrentOwner;\nvar ReactDebugCurrentFrame$1 = ReactSharedInternals.ReactDebugCurrentFrame;\n\nfunction setCurrentlyValidatingElement$1(element) {\n {\n if (element) {\n var owner = element._owner;\n var stack = describeUnknownElementTypeFrameInDEV(element.type, element._source, owner ? owner.type : null);\n ReactDebugCurrentFrame$1.setExtraStackFrame(stack);\n } else {\n ReactDebugCurrentFrame$1.setExtraStackFrame(null);\n }\n }\n}\n\nvar propTypesMisspellWarningShown;\n\n{\n propTypesMisspellWarningShown = false;\n}\n/**\n * Verifies the object is a ReactElement.\n * See https://reactjs.org/docs/react-api.html#isvalidelement\n * @param {?object} object\n * @return {boolean} True if `object` is a ReactElement.\n * @final\n */\n\n\nfunction isValidElement(object) {\n {\n return typeof object === 'object' && object !== null && object.$$typeof === REACT_ELEMENT_TYPE;\n }\n}\n\nfunction getDeclarationErrorAddendum() {\n {\n if (ReactCurrentOwner$1.current) {\n var name = getComponentNameFromType(ReactCurrentOwner$1.current.type);\n\n if (name) {\n return '\\n\\nCheck the render method of `' + name + '`.';\n }\n }\n\n return '';\n }\n}\n\nfunction getSourceInfoErrorAddendum(source) {\n {\n if (source !== undefined) {\n var fileName = source.fileName.replace(/^.*[\\\\\\/]/, '');\n var lineNumber = source.lineNumber;\n return '\\n\\nCheck your code at ' + fileName + ':' + lineNumber + '.';\n }\n\n return '';\n }\n}\n/**\n * Warn if there's no key explicitly set on dynamic arrays of children or\n * object keys are not valid. This allows us to keep track of children between\n * updates.\n */\n\n\nvar ownerHasKeyUseWarning = {};\n\nfunction getCurrentComponentErrorInfo(parentType) {\n {\n var info = getDeclarationErrorAddendum();\n\n if (!info) {\n var parentName = typeof parentType === 'string' ? parentType : parentType.displayName || parentType.name;\n\n if (parentName) {\n info = \"\\n\\nCheck the top-level render call using <\" + parentName + \">.\";\n }\n }\n\n return info;\n }\n}\n/**\n * Warn if the element doesn't have an explicit key assigned to it.\n * This element is in an array. The array could grow and shrink or be\n * reordered. All children that haven't already been validated are required to\n * have a \"key\" property assigned to it. Error statuses are cached so a warning\n * will only be shown once.\n *\n * @internal\n * @param {ReactElement} element Element that requires a key.\n * @param {*} parentType element's parent's type.\n */\n\n\nfunction validateExplicitKey(element, parentType) {\n {\n if (!element._store || element._store.validated || element.key != null) {\n return;\n }\n\n element._store.validated = true;\n var currentComponentErrorInfo = getCurrentComponentErrorInfo(parentType);\n\n if (ownerHasKeyUseWarning[currentComponentErrorInfo]) {\n return;\n }\n\n ownerHasKeyUseWarning[currentComponentErrorInfo] = true; // Usually the current owner is the offender, but if it accepts children as a\n // property, it may be the creator of the child that's responsible for\n // assigning it a key.\n\n var childOwner = '';\n\n if (element && element._owner && element._owner !== ReactCurrentOwner$1.current) {\n // Give the component that originally created this child.\n childOwner = \" It was passed a child from \" + getComponentNameFromType(element._owner.type) + \".\";\n }\n\n setCurrentlyValidatingElement$1(element);\n\n error('Each child in a list should have a unique \"key\" prop.' + '%s%s See https://reactjs.org/link/warning-keys for more information.', currentComponentErrorInfo, childOwner);\n\n setCurrentlyValidatingElement$1(null);\n }\n}\n/**\n * Ensure that every element either is passed in a static location, in an\n * array with an explicit keys property defined, or in an object literal\n * with valid key property.\n *\n * @internal\n * @param {ReactNode} node Statically passed child of any type.\n * @param {*} parentType node's parent's type.\n */\n\n\nfunction validateChildKeys(node, parentType) {\n {\n if (typeof node !== 'object') {\n return;\n }\n\n if (isArray(node)) {\n for (var i = 0; i < node.length; i++) {\n var child = node[i];\n\n if (isValidElement(child)) {\n validateExplicitKey(child, parentType);\n }\n }\n } else if (isValidElement(node)) {\n // This element was passed in a valid location.\n if (node._store) {\n node._store.validated = true;\n }\n } else if (node) {\n var iteratorFn = getIteratorFn(node);\n\n if (typeof iteratorFn === 'function') {\n // Entry iterators used to provide implicit keys,\n // but now we print a separate warning for them later.\n if (iteratorFn !== node.entries) {\n var iterator = iteratorFn.call(node);\n var step;\n\n while (!(step = iterator.next()).done) {\n if (isValidElement(step.value)) {\n validateExplicitKey(step.value, parentType);\n }\n }\n }\n }\n }\n }\n}\n/**\n * Given an element, validate that its props follow the propTypes definition,\n * provided by the type.\n *\n * @param {ReactElement} element\n */\n\n\nfunction validatePropTypes(element) {\n {\n var type = element.type;\n\n if (type === null || type === undefined || typeof type === 'string') {\n return;\n }\n\n var propTypes;\n\n if (typeof type === 'function') {\n propTypes = type.propTypes;\n } else if (typeof type === 'object' && (type.$$typeof === REACT_FORWARD_REF_TYPE || // Note: Memo only checks outer props here.\n // Inner props are checked in the reconciler.\n type.$$typeof === REACT_MEMO_TYPE)) {\n propTypes = type.propTypes;\n } else {\n return;\n }\n\n if (propTypes) {\n // Intentionally inside to avoid triggering lazy initializers:\n var name = getComponentNameFromType(type);\n checkPropTypes(propTypes, element.props, 'prop', name, element);\n } else if (type.PropTypes !== undefined && !propTypesMisspellWarningShown) {\n propTypesMisspellWarningShown = true; // Intentionally inside to avoid triggering lazy initializers:\n\n var _name = getComponentNameFromType(type);\n\n error('Component %s declared `PropTypes` instead of `propTypes`. Did you misspell the property assignment?', _name || 'Unknown');\n }\n\n if (typeof type.getDefaultProps === 'function' && !type.getDefaultProps.isReactClassApproved) {\n error('getDefaultProps is only used on classic React.createClass ' + 'definitions. Use a static property named `defaultProps` instead.');\n }\n }\n}\n/**\n * Given a fragment, validate that it can only be provided with fragment props\n * @param {ReactElement} fragment\n */\n\n\nfunction validateFragmentProps(fragment) {\n {\n var keys = Object.keys(fragment.props);\n\n for (var i = 0; i < keys.length; i++) {\n var key = keys[i];\n\n if (key !== 'children' && key !== 'key') {\n setCurrentlyValidatingElement$1(fragment);\n\n error('Invalid prop `%s` supplied to `React.Fragment`. ' + 'React.Fragment can only have `key` and `children` props.', key);\n\n setCurrentlyValidatingElement$1(null);\n break;\n }\n }\n\n if (fragment.ref !== null) {\n setCurrentlyValidatingElement$1(fragment);\n\n error('Invalid attribute `ref` supplied to `React.Fragment`.');\n\n setCurrentlyValidatingElement$1(null);\n }\n }\n}\n\nvar didWarnAboutKeySpread = {};\nfunction jsxWithValidation(type, props, key, isStaticChildren, source, self) {\n {\n var validType = isValidElementType(type); // We warn in this case but don't throw. We expect the element creation to\n // succeed and there will likely be errors in render.\n\n if (!validType) {\n var info = '';\n\n if (type === undefined || typeof type === 'object' && type !== null && Object.keys(type).length === 0) {\n 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.\";\n }\n\n var sourceInfo = getSourceInfoErrorAddendum(source);\n\n if (sourceInfo) {\n info += sourceInfo;\n } else {\n info += getDeclarationErrorAddendum();\n }\n\n var typeString;\n\n if (type === null) {\n typeString = 'null';\n } else if (isArray(type)) {\n typeString = 'array';\n } else if (type !== undefined && type.$$typeof === REACT_ELEMENT_TYPE) {\n typeString = \"<\" + (getComponentNameFromType(type.type) || 'Unknown') + \" />\";\n info = ' Did you accidentally export a JSX literal instead of a component?';\n } else {\n typeString = typeof type;\n }\n\n error('React.jsx: type is invalid -- expected a string (for ' + 'built-in components) or a class/function (for composite ' + 'components) but got: %s.%s', typeString, info);\n }\n\n var element = jsxDEV(type, props, key, source, self); // The result can be nullish if a mock or a custom function is used.\n // TODO: Drop this when these are no longer allowed as the type argument.\n\n if (element == null) {\n return element;\n } // Skip key warning if the type isn't valid since our key validation logic\n // doesn't expect a non-string/function type and can throw confusing errors.\n // We don't want exception behavior to differ between dev and prod.\n // (Rendering will throw with a helpful message and as soon as the type is\n // fixed, the key warnings will appear.)\n\n\n if (validType) {\n var children = props.children;\n\n if (children !== undefined) {\n if (isStaticChildren) {\n if (isArray(children)) {\n for (var i = 0; i < children.length; i++) {\n validateChildKeys(children[i], type);\n }\n\n if (Object.freeze) {\n Object.freeze(children);\n }\n } else {\n error('React.jsx: Static children should always be an array. ' + 'You are likely explicitly calling React.jsxs or React.jsxDEV. ' + 'Use the Babel transform instead.');\n }\n } else {\n validateChildKeys(children, type);\n }\n }\n }\n\n {\n if (hasOwnProperty.call(props, 'key')) {\n var componentName = getComponentNameFromType(type);\n var keys = Object.keys(props).filter(function (k) {\n return k !== 'key';\n });\n var beforeExample = keys.length > 0 ? '{key: someKey, ' + keys.join(': ..., ') + ': ...}' : '{key: someKey}';\n\n if (!didWarnAboutKeySpread[componentName + beforeExample]) {\n var afterExample = keys.length > 0 ? '{' + keys.join(': ..., ') + ': ...}' : '{}';\n\n error('A props object containing a \"key\" prop is being spread into JSX:\\n' + ' let props = %s;\\n' + ' <%s {...props} />\\n' + 'React keys must be passed directly to JSX without using spread:\\n' + ' let props = %s;\\n' + ' <%s key={someKey} {...props} />', beforeExample, componentName, afterExample, componentName);\n\n didWarnAboutKeySpread[componentName + beforeExample] = true;\n }\n }\n }\n\n if (type === REACT_FRAGMENT_TYPE) {\n validateFragmentProps(element);\n } else {\n validatePropTypes(element);\n }\n\n return element;\n }\n} // These two functions exist to still get child warnings in dev\n// even with the prod transform. This means that jsxDEV is purely\n// opt-in behavior for better messages but that we won't stop\n// giving you warnings if you use production apis.\n\nfunction jsxWithValidationStatic(type, props, key) {\n {\n return jsxWithValidation(type, props, key, true);\n }\n}\nfunction jsxWithValidationDynamic(type, props, key) {\n {\n return jsxWithValidation(type, props, key, false);\n }\n}\n\nvar jsx = jsxWithValidationDynamic ; // we may want to special case jsxs internally to take advantage of static children.\n// for now we can ship identical prod functions\n\nvar jsxs = jsxWithValidationStatic ;\n\nexports.Fragment = REACT_FRAGMENT_TYPE;\nexports.jsx = jsx;\nexports.jsxs = jsxs;\n })();\n}\n","'use strict';\n\nif (process.env.NODE_ENV === 'production') {\n module.exports = require('./cjs/react-jsx-runtime.production.min.js');\n} else {\n module.exports = require('./cjs/react-jsx-runtime.development.js');\n}\n","import React from 'react';\r\nimport './Button.css';\r\nimport type { ButtonProps } from './types';\r\n\r\nexport const Button: React.FC<ButtonProps> = ({\r\n progress,\r\n variant = 'solid',\r\n size = 'md',\r\n radius = 'md',\r\n children,\r\n className = '',\r\n loading,\r\n ...props\r\n}) => {\r\n // Determine color based on progress\r\n const getColorClass = (progress: number): string => {\r\n if (progress === 0) return 'button--primary';\r\n if (progress === 100) return 'button--success';\r\n return 'button--secondary';\r\n };\r\n\r\n const colorClass = progress !== undefined ? getColorClass(progress) : 'button--primary';\r\n\r\n const buttonClasses = [\r\n 'button',\r\n `button--${size}`,\r\n `button--${variant}`,\r\n `button--radius-${radius}`,\r\n colorClass,\r\n loading && 'button--loading',\r\n className\r\n ].filter(Boolean).join(' ');\r\n\r\n return (\r\n <button\r\n type=\"button\"\r\n className={buttonClasses}\r\n data-progress={progress}\r\n disabled={loading || props.disabled}\r\n {...props}\r\n >\r\n {loading ? '加载中...' : children}\r\n </button>\r\n );\r\n};","/**\n * @license lucide-react v0.541.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nconst toKebabCase = (string) => string.replace(/([a-z0-9])([A-Z])/g, \"$1-$2\").toLowerCase();\nconst toCamelCase = (string) => string.replace(\n /^([A-Z])|[\\s-_]+(\\w)/g,\n (match, p1, p2) => p2 ? p2.toUpperCase() : p1.toLowerCase()\n);\nconst toPascalCase = (string) => {\n const camelCase = toCamelCase(string);\n return camelCase.charAt(0).toUpperCase() + camelCase.slice(1);\n};\nconst mergeClasses = (...classes) => classes.filter((className, index, array) => {\n return Boolean(className) && className.trim() !== \"\" && array.indexOf(className) === index;\n}).join(\" \").trim();\nconst hasA11yProp = (props) => {\n for (const prop in props) {\n if (prop.startsWith(\"aria-\") || prop === \"role\" || prop === \"title\") {\n return true;\n }\n }\n};\n\nexport { hasA11yProp, mergeClasses, toCamelCase, toKebabCase, toPascalCase };\n//# sourceMappingURL=utils.js.map\n","/**\n * @license lucide-react v0.541.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nvar defaultAttributes = {\n xmlns: \"http://www.w3.org/2000/svg\",\n width: 24,\n height: 24,\n viewBox: \"0 0 24 24\",\n fill: \"none\",\n stroke: \"currentColor\",\n strokeWidth: 2,\n strokeLinecap: \"round\",\n strokeLinejoin: \"round\"\n};\n\nexport { defaultAttributes as default };\n//# sourceMappingURL=defaultAttributes.js.map\n","/**\n * @license lucide-react v0.541.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport { forwardRef, createElement } from 'react';\nimport defaultAttributes from './defaultAttributes.js';\nimport { mergeClasses, hasA11yProp } from './shared/src/utils.js';\n\nconst Icon = forwardRef(\n ({\n color = \"currentColor\",\n size = 24,\n strokeWidth = 2,\n absoluteStrokeWidth,\n className = \"\",\n children,\n iconNode,\n ...rest\n }, ref) => createElement(\n \"svg\",\n {\n ref,\n ...defaultAttributes,\n width: size,\n height: size,\n stroke: color,\n strokeWidth: absoluteStrokeWidth ? Number(strokeWidth) * 24 / Number(size) : strokeWidth,\n className: mergeClasses(\"lucide\", className),\n ...!children && !hasA11yProp(rest) && { \"aria-hidden\": \"true\" },\n ...rest\n },\n [\n ...iconNode.map(([tag, attrs]) => createElement(tag, attrs)),\n ...Array.isArray(children) ? children : [children]\n ]\n )\n);\n\nexport { Icon as default };\n//# sourceMappingURL=Icon.js.map\n","/**\n * @license lucide-react v0.541.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport { forwardRef, createElement } from 'react';\nimport { mergeClasses, toKebabCase, toPascalCase } from './shared/src/utils.js';\nimport Icon from './Icon.js';\n\nconst createLucideIcon = (iconName, iconNode) => {\n const Component = forwardRef(\n ({ className, ...props }, ref) => createElement(Icon, {\n ref,\n iconNode,\n className: mergeClasses(\n `lucide-${toKebabCase(toPascalCase(iconName))}`,\n `lucide-${iconName}`,\n className\n ),\n ...props\n })\n );\n Component.displayName = toPascalCase(iconName);\n return Component;\n};\n\nexport { createLucideIcon as default };\n//# sourceMappingURL=createLucideIcon.js.map\n","/**\n * @license lucide-react v0.541.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\"path\", { d: \"M5 12h14\", key: \"1ays0h\" }],\n [\"path\", { d: \"m12 5 7 7-7 7\", key: \"xquz4c\" }]\n];\nconst ArrowRight = createLucideIcon(\"arrow-right\", __iconNode);\n\nexport { __iconNode, ArrowRight as default };\n//# sourceMappingURL=arrow-right.js.map\n","/**\n * @license lucide-react v0.541.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [[\"path\", { d: \"m6 9 6 6 6-6\", key: \"qrunsl\" }]];\nconst ChevronDown = createLucideIcon(\"chevron-down\", __iconNode);\n\nexport { __iconNode, ChevronDown as default };\n//# sourceMappingURL=chevron-down.js.map\n","/**\n * @license lucide-react v0.541.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [[\"path\", { d: \"m9 18 6-6-6-6\", key: \"mthhwq\" }]];\nconst ChevronRight = createLucideIcon(\"chevron-right\", __iconNode);\n\nexport { __iconNode, ChevronRight as default };\n//# sourceMappingURL=chevron-right.js.map\n","// 内容手风琴组件类型定义\r\nimport type { KnowledgeItem, Lesson, Unit } from '../../types';\r\n\r\nexport interface ContentAccordionProps {\r\n /** 当前学习单元数据 */\r\n unit: Unit | null;\r\n /** 激活的课程ID列表 */\r\n activeLessonIds: string[];\r\n /** 切换课程激活状态的函数 */\r\n onToggleLesson: (lessonId: string) => void;\r\n /** 点击学习按钮的回调 */\r\n onLearnAction: (knowledgeItem: KnowledgeItem) => void;\r\n /** 加载状态 */\r\n loading?: boolean;\r\n /** 自定义类名 */\r\n className?: string;\r\n /** 空状态显示内容 */\r\n emptyState?: React.ReactNode;\r\n}\r\n\r\nexport interface ContentAccordionState {\r\n /** 内部展开状态管理 */\r\n expandedLessons: Set<string>;\r\n /** 动画状态 */\r\n isAnimating: boolean;\r\n}\r\n\r\nexport interface LessonItemProps {\r\n /** 课程数据 */\r\n lesson: Lesson;\r\n /** 是否展开状态 */\r\n isExpanded: boolean;\r\n /** 切换展开状态回调 */\r\n onToggle: (lessonId: string) => void;\r\n /** 学习按钮点击回调 */\r\n onLearnAction: (knowledgeItem: KnowledgeItem) => void;\r\n}\r\n\r\nexport interface KnowledgeCardProps {\r\n /** 知识点数据 */\r\n knowledgeItem: KnowledgeItem;\r\n /** 学习按钮点击回调 */\r\n onLearnAction: (knowledgeItem: KnowledgeItem) => void;\r\n}\r\n\r\n// 工具函数类型\r\nexport type GetButtonTextFn = (progress: number) => string;\r\nexport type CalculateLessonProgressFn = (knowledgeItems: KnowledgeItem[]) => number;\r\n\r\n// 进度按钮文本生成算法\r\nexport const getButtonText: GetButtonTextFn = (progress: number): string => {\r\n if (progress === 0) return '开始学习';\r\n if (progress === 100) return '复习';\r\n return '继续学习';\r\n};\r\n\r\n// 课程进度计算算法\r\nexport const calculateLessonProgress: CalculateLessonProgressFn = (knowledgeItems: KnowledgeItem[]): number => {\r\n if (knowledgeItems.length === 0) return 0;\r\n const totalProgress = knowledgeItems.reduce((sum, item) => sum + item.progress, 0);\r\n return Math.round(totalProgress / knowledgeItems.length);\r\n};","import React from 'react';\r\nimport { Progress } from '@heroui/progress';\r\nimport { Card, CardBody, CardFooter } from '@heroui/card';\r\nimport { Button } from '../Button';\r\nimport { ChevronDown, ChevronRight } from 'lucide-react';\r\nimport type { ContentAccordionProps, LessonItemProps, KnowledgeCardProps } from './types';\r\nimport { getButtonText, calculateLessonProgress } from './types';\r\nimport './ContentAccordion.css';\r\n\r\nconst KnowledgeCard: React.FC<KnowledgeCardProps> = ({ knowledgeItem, onLearnAction }) => {\r\n const handleLearnClick = () => {\r\n onLearnAction(knowledgeItem);\r\n };\r\n\r\n // 调试信息\r\n console.log('KnowledgeCard render:', {\r\n progress: knowledgeItem.progress,\r\n text: getButtonText(knowledgeItem.progress)\r\n });\r\n\r\n return (\r\n <Card className=\"content-accordion__knowledge-card\">\r\n <CardBody>\r\n <h3 className=\"content-accordion__knowledge-title\">{knowledgeItem.title}</h3>\r\n <p className=\"content-accordion__knowledge-description\">{knowledgeItem.description}</p>\r\n </CardBody>\r\n <CardFooter className=\"content-accordion__knowledge-actions\">\r\n <div className=\"content-accordion__progress-container\">\r\n <Progress\r\n value={knowledgeItem.progress}\r\n size=\"sm\"\r\n aria-label={`${knowledgeItem.title} 进度`}\r\n className=\"content-accordion__progress-bar\"\r\n />\r\n <span className=\"content-accordion__progress-text\">{knowledgeItem.progress}%</span>\r\n </div>\r\n <Button\r\n size=\"sm\"\r\n radius=\"md\"\r\n onClick={handleLearnClick}\r\n progress={knowledgeItem.progress}\r\n variant={knowledgeItem.progress === 100 ? 'light' : knowledgeItem.progress === 0 ? 'solid' : 'bordered'}\r\n className=\"content-accordion__learn-button\"\r\n >\r\n {getButtonText(knowledgeItem.progress)}\r\n </Button>\r\n </CardFooter>\r\n </Card>\r\n );\r\n};\r\n\r\nconst LessonItem: React.FC<LessonItemProps> = ({ lesson, isExpanded, onToggle, onLearnAction }) => {\r\n const handleToggle = () => {\r\n onToggle(lesson.id);\r\n };\r\n\r\n const lessonProgress = calculateLessonProgress(lesson.knowledgeItems);\r\n\r\n return (\r\n <div className={`content-accordion__lesson-item ${isExpanded ? 'content-accordion__lesson-item--expanded' : ''}`}>\r\n <div\r\n className=\"content-accordion__lesson-header\"\r\n onClick={handleToggle}\r\n role=\"button\"\r\n tabIndex={0}\r\n aria-expanded={isExpanded}\r\n aria-label={`${lesson.title},点击${isExpanded ? '收起' : '展开'}`}\r\n >\r\n <div className=\"content-accordion__lesson-header-content\">\r\n <h2 className=\"content-accordion__lesson-title\">{lesson.title}</h2>\r\n <span className=\"content-accordion__lesson-duration\">约 {lesson.duration} 分钟</span>\r\n </div>\r\n <div className=\"content-accordion__lesson-actions\">\r\n <span className=\"content-accordion__lesson-progress\">{lessonProgress}%</span>\r\n {isExpanded ? (\r\n <ChevronDown className=\"content-accordion__lesson-icon\" />\r\n ) : (\r\n <ChevronRight className=\"content-accordion__lesson-icon\" />\r\n )}\r\n </div>\r\n </div>\r\n\r\n {isExpanded && (\r\n <div className=\"content-accordion__knowledge-list\">\r\n {lesson.knowledgeItems.map((item) => (\r\n <KnowledgeCard\r\n key={item.id}\r\n knowledgeItem={item}\r\n onLearnAction={onLearnAction}\r\n />\r\n ))}\r\n </div>\r\n )}\r\n </div>\r\n );\r\n};\r\n\r\nexport const ContentAccordion: React.FC<ContentAccordionProps> = ({\r\n unit,\r\n activeLessonIds,\r\n onToggleLesson,\r\n onLearnAction,\r\n loading = false,\r\n className = '',\r\n emptyState\r\n}) => {\r\n if (loading) {\r\n return (\r\n <div className=\"content-accordion content-accordion--loading\">\r\n <div className=\"content-accordion__loading\">加载中...</div>\r\n </div>\r\n );\r\n }\r\n\r\n if (!unit) {\r\n return (\r\n <div className=\"content-accordion content-accordion--empty\">\r\n {emptyState || <div className=\"content-accordion__empty\">暂无学习内容</div>}\r\n </div>\r\n );\r\n }\r\n\r\n return (\r\n <div className={`content-accordion ${className}`}>\r\n {/* 单元头部信息 */}\r\n <header className=\"content-accordion__header\">\r\n <h1 className=\"content-accordion__unit-title\">{unit.title}</h1>\r\n <p className=\"content-accordion__unit-description\">{unit.description}</p>\r\n <div className=\"content-accordion__unit-meta\">\r\n <span>总共 {unit.totalLessons} 节课</span>\r\n <span>•</span>\r\n <span>预计学习 {unit.estimatedDuration}</span>\r\n </div>\r\n </header>\r\n\r\n {/* 课程列表 */}\r\n <div className=\"content-accordion__lessons\">\r\n {unit.lessons.map((lesson) => (\r\n <LessonItem\r\n key={lesson.id}\r\n lesson={lesson}\r\n isExpanded={activeLessonIds.includes(lesson.id)}\r\n onToggle={onToggleLesson}\r\n onLearnAction={onLearnAction}\r\n />\r\n ))}\r\n </div>\r\n </div>\r\n );\r\n};","// Sidebar 组件类型定义\r\n\r\nexport interface UnitProgressData {\r\n unitId: string;\r\n title: string;\r\n description: string;\r\n moduleCategory: string;\r\n estimatedDuration: string;\r\n totalLessons: number;\r\n completedLessons: number;\r\n progressPercentage: number;\r\n status: 'not-started' | 'in-progress' | 'completed';\r\n lastAccessed?: string;\r\n isActive: boolean;\r\n route: string;\r\n icon?: string;\r\n}\r\n\r\nexport interface UserGradeUnitsProgressData {\r\n userId: string;\r\n courseId: string;\r\n courseTitle: string;\r\n courseLevel: number;\r\n totalUnits: number;\r\n completedUnits: number;\r\n overallProgress: number;\r\n status: 'not-started' | 'in-progress' | 'completed';\r\n lastAccessed?: string;\r\n units: UnitProgressData[];\r\n}\r\n\r\nexport interface SidebarProps {\r\n // 核心数据 - 用户年级单元进度数据\r\n data: UserGradeUnitsProgressData | null;\r\n\r\n // 状态控制\r\n loading?: boolean;\r\n error?: Error | null;\r\n collapsed?: boolean;\r\n\r\n // 交互回调\r\n onToggleCollapse?: () => void;\r\n activeUnitId?: string | null;\r\n onUnitSelect?: (unitId: string) => void;\r\n\r\n // 自定义渲染\r\n renderUnitItem?: (unit: UnitProgressData, progress?: UnitProgressData) => React.ReactNode;\r\n\r\n // 样式配置\r\n className?: string;\r\n unitItemClassName?: string;\r\n style?: React.CSSProperties;\r\n unitItemStyle?: React.CSSProperties;\r\n}\r\n\r\n// 进度状态颜色映射\r\nexport const getProgressColor = (status: UnitProgressData['status']): 'success' | 'primary' | 'default' => {\r\n switch (status) {\r\n case 'completed':\r\n return 'success';\r\n case 'in-progress':\r\n return 'primary';\r\n case 'not-started':\r\n default:\r\n return 'default';\r\n }\r\n};","import React from 'react';\r\nimport { Progress } from '@heroui/react';\r\nimport type { SidebarProps, UnitProgressData } from './types';\r\nimport { getProgressColor } from './types';\r\nimport './Sidebar.css';\r\n\r\nexport const Sidebar: React.FC<SidebarProps> = ({\r\n data,\r\n loading = false,\r\n error = null,\r\n collapsed = false,\r\n onToggleCollapse,\r\n activeUnitId = null,\r\n onUnitSelect,\r\n renderUnitItem,\r\n className = '',\r\n unitItemClassName = '',\r\n style = {},\r\n unitItemStyle = {},\r\n}) => {\r\n const handleUnitSelect = (unitId: string, event: React.MouseEvent) => {\r\n event.preventDefault();\r\n onUnitSelect?.(unitId);\r\n };\r\n\r\n const handleToggleCollapse = () => {\r\n onToggleCollapse?.();\r\n };\r\n\r\n // 渲染默认单元项\r\n const renderDefaultUnitItem = (unit: UnitProgressData) => (\r\n <div\r\n key={unit.unitId}\r\n className={`sidebar__unit-item ${unitItemClassName} ${\r\n activeUnitId === unit.unitId ? 'sidebar__unit-item--active' : ''\r\n } ${unit.status ? `sidebar__unit-item--${unit.status}` : ''}`}\r\n style={unitItemStyle}\r\n onClick={(e) => handleUnitSelect(unit.unitId, e)}\r\n role=\"button\"\r\n tabIndex={0}\r\n aria-label={`${unit.title},进度 ${unit.progressPercentage}%`}\r\n >\r\n <div className=\"sidebar__unit-item__content\">\r\n {unit.icon && (\r\n <span className=\"sidebar__unit-item__icon\">{unit.icon}</span>\r\n )}\r\n {!collapsed && (\r\n <span className=\"sidebar__unit-item__title\">{unit.title}</span>\r\n )}\r\n </div>\r\n\r\n {!collapsed && unit.progressPercentage !== undefined && (\r\n <div className=\"sidebar__unit-item__progress\">\r\n <Progress\r\n value={unit.progressPercentage}\r\n size=\"sm\"\r\n color={getProgressColor(unit.status)}\r\n aria-label={`${unit.title} 进度`}\r\n />\r\n <span className=\"progress-percentage\">\r\n {unit.progressPercentage}%\r\n </span>\r\n </div>\r\n )}\r\n </div>\r\n );\r\n\r\n // 渲染状态内容\r\n const renderContent = () => {\r\n if (loading) {\r\n return (\r\n <div className=\"sidebar__loading\">\r\n 加载中...\r\n </div>\r\n );\r\n }\r\n\r\n if (error) {\r\n return (\r\n <div className=\"sidebar__error\">\r\n 加载失败: {error.message}\r\n </div>\r\n );\r\n }\r\n\r\n if (!data) {\r\n return (\r\n <div className=\"sidebar__empty\">\r\n 暂无课程数据\r\n </div>\r\n );\r\n }\r\n\r\n return (\r\n <>\r\n <div className=\"sidebar__header\">\r\n <button\r\n className=\"sidebar__toggle-btn\"\r\n onClick={handleToggleCollapse}\r\n aria-label=\"切换侧边栏折叠状态\"\r\n >\r\n {collapsed ? '→' : '←'}\r\n </button>\r\n {!collapsed && (\r\n <div className=\"sidebar__course-info\">\r\n <h3 className=\"sidebar__course-title\">{data.courseTitle}</h3>\r\n <span className=\"sidebar__course-level\">{data.courseLevel}年级</span>\r\n </div>\r\n )}\r\n </div>\r\n\r\n <nav className=\"sidebar__content\">\r\n <ul className=\"sidebar__unit-list\">\r\n {data.units && data.units.length > 0 ? (\r\n data.units.map((unit) => (\r\n <li key={unit.unitId}>\r\n {renderUnitItem\r\n ? renderUnitItem(unit, unit)\r\n : renderDefaultUnitItem(unit)}\r\n </li>\r\n ))\r\n ) : (\r\n <div className=\"sidebar__empty\">\r\n 暂无单元数据\r\n </div>\r\n )}\r\n </ul>\r\n </nav>\r\n </>\r\n );\r\n };\r\n\r\n return (\r\n <aside\r\n className={`sidebar ${className} ${collapsed ? 'sidebar--collapsed' : ''} ${\r\n loading ? 'sidebar--loading' : ''\r\n } ${error ? 'sidebar--error' : ''}`}\r\n style={style}\r\n aria-label=\"课程导航侧边栏\"\r\n role=\"complementary\"\r\n >\r\n {renderContent()}\r\n </aside>\r\n );\r\n};","import React from 'react'\r\nimport './Submenu.css'\r\n\r\nexport interface SubmenuItem {\r\n id: string | number\r\n label?: React.ReactNode\r\n value?: unknown\r\n icon?: React.ReactNode\r\n disabled?: boolean\r\n onClick?: (item: SubmenuItem) => void\r\n [key: string]: unknown\r\n}\r\n\r\nexport interface SubmenuProps {\r\n trigger: React.ReactNode\r\n items: SubmenuItem[]\r\n position?: 'top' | 'bottom' | 'left' | 'right' | 'auto'\r\n alignment?: 'start' | 'center' | 'end'\r\n openDelay?: number\r\n closeDelay?: number\r\n onOpen?: () => void\r\n onClose?: () => void\r\n renderItem?: (item: SubmenuItem, config: TItemConfig) => React.ReactNode\r\n itemConfig?: TItemConfig\r\n className?: string\r\n menuClassName?: string\r\n itemClassName?: string\r\n activeItemClassName?: string\r\n}\r\n\r\ntype TItemConfig = {\r\n currentUserRole?: 'guest' | 'student' | 'teacher' | 'admin'\r\n theme?: 'light' | 'dark'\r\n [key: string]: unknown\r\n}\r\n\r\nconst Submenu: React.FC<SubmenuProps> = ({\r\n trigger,\r\n items,\r\n position = 'bottom',\r\n alignment = 'start',\r\n openDelay = 300,\r\n closeDelay = 100,\r\n onOpen,\r\n onClose,\r\n renderItem,\r\n itemConfig = {},\r\n className,\r\n menuClassName,\r\n itemClassName,\r\n // activeItemClassName is available for custom styling but not used in default implementation\r\n}) => {\r\n const [isOpen, setIsOpen] = React.useState(false)\r\n const openTimeoutRef = React.useRef<NodeJS.Timeout | null>(null)\r\n const closeTimeoutRef = React.useRef<NodeJS.Timeout | null>(null)\r\n\r\n const clearTimeouts = () => {\r\n if (openTimeoutRef.current) {\r\n clearTimeout(openTimeoutRef.current)\r\n }\r\n if (closeTimeoutRef.current) {\r\n clearTimeout(closeTimeoutRef.current)\r\n }\r\n }\r\n\r\n const handleMouseEnter = () => {\r\n clearTimeouts()\r\n openTimeoutRef.current = setTimeout(() => {\r\n setIsOpen(true)\r\n onOpen?.()\r\n }, openDelay)\r\n }\r\n\r\n const handleMouseLeave = () => {\r\n clearTimeouts()\r\n closeTimeoutRef.current = setTimeout(() => {\r\n setIsOpen(false)\r\n onClose?.()\r\n }, closeDelay)\r\n }\r\n\r\n const handleItemClick = (item: SubmenuItem) => {\r\n if (!item.disabled && item.onClick) {\r\n item.onClick(item)\r\n }\r\n }\r\n\r\n React.useEffect(() => {\r\n return () => clearTimeouts()\r\n }, [])\r\n\r\n const defaultRenderItem = (item: SubmenuItem) => (\r\n <div\r\n key={item.id}\r\n className={`submenu-item ${item.disabled ? 'is-disabled' : ''} ${itemClassName || ''}`}\r\n onClick={() => handleItemClick(item)}\r\n >\r\n {item.icon && <span className=\"submenu-item-icon\">{item.icon}</span>}\r\n <span>{item.label}</span>\r\n </div>\r\n )\r\n\r\n const getPanelClasses = () => {\r\n const classes = ['submenu-panel']\r\n \r\n if (menuClassName) {\r\n classes.push(menuClassName)\r\n }\r\n \r\n // Add position class\r\n classes.push(`position-${position}`)\r\n \r\n // Add alignment class if not 'start' (default)\r\n if (alignment !== 'start') {\r\n classes.push(`alignment-${alignment}`)\r\n }\r\n \r\n // Add open state class\r\n if (isOpen) {\r\n classes.push('is-open')\r\n }\r\n \r\n return classes.join(' ')\r\n }\r\n\r\n return (\r\n <div \r\n className={`submenu-container ${className || ''}`}\r\n onMouseEnter={handleMouseEnter}\r\n onMouseLeave={handleMouseLeave}\r\n >\r\n <div className=\"submenu-trigger\">\r\n {trigger}\r\n </div>\r\n \r\n <div className={getPanelClasses()}>\r\n {items.map(item => \r\n renderItem \r\n ? renderItem(item, itemConfig)\r\n : defaultRenderItem(item)\r\n )}\r\n </div>\r\n </div>\r\n )\r\n}\r\n\r\nexport default Submenu","'use strict';\n\nexport default function bind(fn, thisArg) {\n return function wrap() {\n return fn.apply(thisArg, arguments);\n };\n}\n","'use strict';\n\nimport bind from './helpers/bind.js';\n\n// utils is a library of generic helper functions non-specific to axios\n\nconst {toString} = Object.prototype;\nconst {getPrototypeOf} = Object;\nconst {iterator, toStringTag} = Symbol;\n\nconst kindOf = (cache => thing => {\n const str = toString.call(thing);\n return cache[str] || (cache[str] = str.slice(8, -1).toLowerCase());\n})(Object.create(null));\n\nconst kindOfTest = (type) => {\n type = type.toLowerCase();\n return (thing) => kindOf(thing) === type\n}\n\nconst typeOfTest = type => thing => typeof thing === type;\n\n/**\n * Determine if a value is an Array\n *\n * @param {Object} val The value to test\n *\n * @returns {boolean} True if value is an Array, otherwise false\n */\nconst {isArray} = Array;\n\n/**\n * Determine if a value is undefined\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if the value is undefined, otherwise false\n */\nconst isUndefined = typeOfTest('undefined');\n\n/**\n * Determine if a value is a Buffer\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a Buffer, otherwise false\n */\nfunction isBuffer(val) {\n return val !== null && !isUndefined(val) && val.constructor !== null && !isUndefined(val.constructor)\n && isFunction(val.constructor.isBuffer) && val.constructor.isBuffer(val);\n}\n\n/**\n * Determine if a value is an ArrayBuffer\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is an ArrayBuffer, otherwise false\n */\nconst isArrayBuffer = kindOfTest('ArrayBuffer');\n\n\n/**\n * Determine if a value is a view on an ArrayBuffer\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a view on an ArrayBuffer, otherwise false\n */\nfunction isArrayBufferView(val) {\n let result;\n if ((typeof ArrayBuffer !== 'undefined') && (ArrayBuffer.isView)) {\n result = ArrayBuffer.isView(val);\n } else {\n result = (val) && (val.buffer) && (isArrayBuffer(val.buffer));\n }\n return result;\n}\n\n/**\n * Determine if a value is a String\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a String, otherwise false\n */\nconst isString = typeOfTest('string');\n\n/**\n * Determine if a value is a Function\n *\n * @param {*} val The value to test\n * @returns {boolean} True if value is a Function, otherwise false\n */\nconst isFunction = typeOfTest('function');\n\n/**\n * Determine if a value is a Number\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a Number, otherwise false\n */\nconst isNumber = typeOfTest('number');\n\n/**\n * Determine if a value is an Object\n *\n * @param {*} thing The value to test\n *\n * @returns {boolean} True if value is an Object, otherwise false\n */\nconst isObject = (thing) => thing !== null && typeof thing === 'object';\n\n/**\n * Determine if a value is a Boolean\n *\n * @param {*} thing The value to test\n * @returns {boolean} True if value is a Boolean, otherwise false\n */\nconst isBoolean = thing => thing === true || thing === false;\n\n/**\n * Determine if a value is a plain Object\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a plain Object, otherwise false\n */\nconst isPlainObject = (val) => {\n if (kindOf(val) !== 'object') {\n return false;\n }\n\n const prototype = getPrototypeOf(val);\n return (prototype === null || prototype === Object.prototype || Object.getPrototypeOf(prototype) === null) && !(toStringTag in val) && !(iterator in val);\n}\n\n/**\n * Determine if a value is an empty object (safely handles Buffers)\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is an empty object, otherwise false\n */\nconst isEmptyObject = (val) => {\n // Early return for non-objects or Buffers to prevent RangeError\n if (!isObject(val) || isBuffer(val)) {\n return false;\n }\n\n try {\n return Object.keys(val).length === 0 && Object.getPrototypeOf(val) === Object.prototype;\n } catch (e) {\n // Fallback for any other objects that might cause RangeError with Object.keys()\n return false;\n }\n}\n\n/**\n * Determine if a value is a Date\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a Date, otherwise false\n */\nconst isDate = kindOfTest('Date');\n\n/**\n * Determine if a value is a File\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a File, otherwise false\n */\nconst isFile = kindOfTest('File');\n\n/**\n * Determine if a value is a Blob\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a Blob, otherwise false\n */\nconst isBlob = kindOfTest('Blob');\n\n/**\n * Determine if a value is a FileList\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a File, otherwise false\n */\nconst isFileList = kindOfTest('FileList');\n\n/**\n * Determine if a value is a Stream\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a Stream, otherwise false\n */\nconst isStream = (val) => isObject(val) && isFunction(val.pipe);\n\n/**\n * Determine if a value is a FormData\n *\n * @param {*} thing The value to test\n *\n * @returns {boolean} True if value is an FormData, otherwise false\n */\nconst isFormData = (thing) => {\n let kind;\n return thing && (\n (typeof FormData === 'function' && thing instanceof FormData) || (\n isFunction(thing.append) && (\n (kind = kindOf(thing)) === 'formdata' ||\n // detect form-data instance\n (kind === 'object' && isFunction(thing.toString) && thing.toString() === '[object FormData]')\n )\n )\n )\n}\n\n/**\n * Determine if a value is a URLSearchParams object\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a URLSearchParams object, otherwise false\n */\nconst isURLSearchParams = kindOfTest('URLSearchParams');\n\nconst [isReadableStream, isRequest, isResponse, isHeaders] = ['ReadableStream', 'Request', 'Response', 'Headers'].map(kindOfTest);\n\n/**\n * Trim excess whitespace off the beginning and end of a string\n *\n * @param {String} str The String to trim\n *\n * @returns {String} The String freed of excess whitespace\n */\nconst trim = (str) => str.trim ?\n str.trim() : str.replace(/^[\\s\\uFEFF\\xA0]+|[\\s\\uFEFF\\xA0]+$/g, '');\n\n/**\n * Iterate over an Array or an Object invoking a function for each item.\n *\n * If `obj` is an Array callback will be called passing\n * the value, index, and complete array for each item.\n *\n * If 'obj' is an Object callback will be called passing\n * the value, key, and complete object for each property.\n *\n * @param {Object|Array} obj The object to iterate\n * @param {Function} fn The callback to invoke for each item\n *\n * @param {Boolean} [allOwnKeys = false]\n * @returns {any}\n */\nfunction forEach(obj, fn, {allOwnKeys = false} = {}) {\n // Don't bother if no value provided\n if (obj === null || typeof obj === 'undefined') {\n return;\n }\n\n let i;\n let l;\n\n // Force an array if not already something iterable\n if (typeof obj !== 'object') {\n /*eslint no-param-reassign:0*/\n obj = [obj];\n }\n\n if (isArray(obj)) {\n // Iterate over array values\n for (i = 0, l = obj.length; i < l; i++) {\n fn.call(null, obj[i], i, obj);\n }\n } else {\n // Buffer check\n if (isBuffer(obj)) {\n return;\n }\n\n // Iterate over object keys\n const keys = allOwnKeys ? Object.getOwnPropertyNames(obj) : Object.keys(obj);\n const len = keys.length;\n let key;\n\n for (i = 0; i < len; i++) {\n key = keys[i];\n fn.call(null, obj[key], key, obj);\n }\n }\n}\n\nfunction findKey(obj, key) {\n if (isBuffer(obj)){\n return null;\n }\n\n key = key.toLowerCase();\n const keys = Object.keys(obj);\n let i = keys.length;\n let _key;\n while (i-- > 0) {\n _key = keys[i];\n if (key === _key.toLowerCase()) {\n return _key;\n }\n }\n return null;\n}\n\nconst _global = (() => {\n /*eslint no-undef:0*/\n if (typeof globalThis !== \"undefined\") return globalThis;\n return typeof self !== \"undefined\" ? self : (typeof window !== 'undefined' ? window : global)\n})();\n\nconst isContextDefined = (context) => !isUndefined(context) && context !== _global;\n\n/**\n * Accepts varargs expecting each argument to be an object, then\n * immutably merges the properties of each object and returns result.\n *\n * When multiple objects contain the same key the later object in\n * the arguments list will take precedence.\n *\n * Example:\n *\n * ```js\n * var result = merge({foo: 123}, {foo: 456});\n * console.log(result.foo); // outputs 456\n * ```\n *\n * @param {Object} obj1 Object to merge\n *\n * @returns {Object} Result of all merge properties\n */\nfunction merge(/* obj1, obj2, obj3, ... */) {\n const {caseless, skipUndefined} = isContextDefined(this) && this || {};\n const result = {};\n const assignValue = (val, key) => {\n const targetKey = caseless && findKey(result, key) || key;\n if (isPlainObject(result[targetKey]) && isPlainObject(val)) {\n result[targetKey] = merge(result[targetKey], val);\n } else if (isPlainObject(val)) {\n result[targetKey] = merge({}, val);\n } else if (isArray(val)) {\n result[targetKey] = val.slice();\n } else if (!skipUndefined || !isUndefined(val)) {\n result[targetKey] = val;\n }\n }\n\n for (let i = 0, l = arguments.length; i < l; i++) {\n arguments[i] && forEach(arguments[i], assignValue);\n }\n return result;\n}\n\n/**\n * Extends object a by mutably adding to it the properties of object b.\n *\n * @param {Object} a The object to be extended\n * @param {Object} b The object to copy properties from\n * @param {Object} thisArg The object to bind function to\n *\n * @param {Boolean} [allOwnKeys]\n * @returns {Object} The resulting value of object a\n */\nconst extend = (a, b, thisArg, {allOwnKeys}= {}) => {\n forEach(b, (val, key) => {\n if (thisArg && isFunction(val)) {\n a[key] = bind(val, thisArg);\n } else {\n a[key] = val;\n }\n }, {allOwnKeys});\n return a;\n}\n\n/**\n * Remove byte order marker. This catches EF BB BF (the UTF-8 BOM)\n *\n * @param {string} content with BOM\n *\n * @returns {string} content value without BOM\n */\nconst stripBOM = (content) => {\n if (content.charCodeAt(0) === 0xFEFF) {\n content = content.slice(1);\n }\n return content;\n}\n\n/**\n * Inherit the prototype methods from one constructor into another\n * @param {function} constructor\n * @param {function} superConstructor\n * @param {object} [props]\n * @param {object} [descriptors]\n *\n * @returns {void}\n */\nconst inherits = (constructor, superConstructor, props, descriptors) => {\n constructor.prototype = Object.create(superConstructor.prototype, descriptors);\n constructor.prototype.constructor = constructor;\n Object.defineProperty(constructor, 'super', {\n value: superConstructor.prototype\n });\n props && Object.assign(constructor.prototype, props);\n}\n\n/**\n * Resolve object with deep prototype chain to a flat object\n * @param {Object} sourceObj source object\n * @param {Object} [destObj]\n * @param {Function|Boolean} [filter]\n * @param {Function} [propFilter]\n *\n * @returns {Object}\n */\nconst toFlatObject = (sourceObj, destObj, filter, propFilter) => {\n let props;\n let i;\n let prop;\n const merged = {};\n\n destObj = destObj || {};\n // eslint-disable-next-line no-eq-null,eqeqeq\n if (sourceObj == null) return destObj;\n\n do {\n props = Object.getOwnPropertyNames(sourceObj);\n i = props.length;\n while (i-- > 0) {\n prop = props[i];\n if ((!propFilter || propFilter(prop, sourceObj, destObj)) && !merged[prop]) {\n destObj[prop] = sourceObj[prop];\n merged[prop] = true;\n }\n }\n sourceObj = filter !== false && getPrototypeOf(sourceObj);\n } while (sourceObj && (!filter || filter(sourceObj, destObj)) && sourceObj !== Object.prototype);\n\n return destObj;\n}\n\n/**\n * Determines whether a string ends with the characters of a specified string\n *\n * @param {String} str\n * @param {String} searchString\n * @param {Number} [position= 0]\n *\n * @returns {boolean}\n */\nconst endsWith = (str, searchString, position) => {\n str = String(str);\n if (position === undefined || position > str.length) {\n position = str.length;\n }\n position -= searchString.length;\n const lastIndex = str.indexOf(searchString, position);\n return lastIndex !== -1 && lastIndex === position;\n}\n\n\n/**\n * Returns new array from array like object or null if failed\n *\n * @param {*} [thing]\n *\n * @returns {?Array}\n */\nconst toArray = (thing) => {\n if (!thing) return null;\n if (isArray(thing)) return thing;\n let i = thing.length;\n if (!isNumber(i)) return null;\n const arr = new Array(i);\n while (i-- > 0) {\n arr[i] = thing[i];\n }\n return arr;\n}\n\n/**\n * Checking if the Uint8Array exists and if it does, it returns a function that checks if the\n * thing passed in is an instance of Uint8Array\n *\n * @param {TypedArray}\n *\n * @returns {Array}\n */\n// eslint-disable-next-line func-names\nconst isTypedArray = (TypedArray => {\n // eslint-disable-next-line func-names\n return thing => {\n return TypedArray && thing instanceof TypedArray;\n };\n})(typeof Uint8Array !== 'undefined' && getPrototypeOf(Uint8Array));\n\n/**\n * For each entry in the object, call the function with the key and value.\n *\n * @param {Object<any, any>} obj - The object to iterate over.\n * @param {Function} fn - The function to call for each entry.\n *\n * @returns {void}\n */\nconst forEachEntry = (obj, fn) => {\n const generator = obj && obj[iterator];\n\n const _iterator = generator.call(obj);\n\n let result;\n\n while ((result = _iterator.next()) && !result.done) {\n const pair = result.value;\n fn.call(obj, pair[0], pair[1]);\n }\n}\n\n/**\n * It takes a regular expression and a string, and returns an array of all the matches\n *\n * @param {string} regExp - The regular expression to match against.\n * @param {string} str - The string to search.\n *\n * @returns {Array<boolean>}\n */\nconst matchAll = (regExp, str) => {\n let matches;\n const arr = [];\n\n while ((matches = regExp.exec(str)) !== null) {\n arr.push(matches);\n }\n\n return arr;\n}\n\n/* Checking if the kindOfTest function returns true when passed an HTMLFormElement. */\nconst isHTMLForm = kindOfTest('HTMLFormElement');\n\nconst toCamelCase = str => {\n return str.toLowerCase().replace(/[-_\\s]([a-z\\d])(\\w*)/g,\n function replacer(m, p1, p2) {\n return p1.toUpperCase() + p2;\n }\n );\n};\n\n/* Creating a function that will check if an object has a property. */\nconst hasOwnProperty = (({hasOwnProperty}) => (obj, prop) => hasOwnProperty.call(obj, prop))(Object.prototype);\n\n/**\n * Determine if a value is a RegExp object\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a RegExp object, otherwise false\n */\nconst isRegExp = kindOfTest('RegExp');\n\nconst reduceDescriptors = (obj, reducer) => {\n const descriptors = Object.getOwnPropertyDescriptors(obj);\n const reducedDescriptors = {};\n\n forEach(descriptors, (descriptor, name) => {\n let ret;\n if ((ret = reducer(descriptor, name, obj)) !== false) {\n reducedDescriptors[name] = ret || descriptor;\n }\n });\n\n Object.defineProperties(obj, reducedDescriptors);\n}\n\n/**\n * Makes all methods read-only\n * @param {Object} obj\n */\n\nconst freezeMethods = (obj) => {\n reduceDescriptors(obj, (descriptor, name) => {\n // skip restricted props in strict mode\n if (isFunction(obj) && ['arguments', 'caller', 'callee'].indexOf(name) !== -1) {\n return false;\n }\n\n const value = obj[name];\n\n if (!isFunction(value)) return;\n\n descriptor.enumerable = false;\n\n if ('writable' in descriptor) {\n descriptor.writable = false;\n return;\n }\n\n if (!descriptor.set) {\n descriptor.set = () => {\n throw Error('Can not rewrite read-only method \\'' + name + '\\'');\n };\n }\n });\n}\n\nconst toObjectSet = (arrayOrString, delimiter) => {\n const obj = {};\n\n const define = (arr) => {\n arr.forEach(value => {\n obj[value] = true;\n });\n }\n\n isArray(arrayOrString) ? define(arrayOrString) : define(String(arrayOrString).split(delimiter));\n\n return obj;\n}\n\nconst noop = () => {}\n\nconst toFiniteNumber = (value, defaultValue) => {\n return value != null && Number.isFinite(value = +value) ? value : defaultValue;\n}\n\n\n\n/**\n * If the thing is a FormData object, return true, otherwise return false.\n *\n * @param {unknown} thing - The thing to check.\n *\n * @returns {boolean}\n */\nfunction isSpecCompliantForm(thing) {\n return !!(thing && isFunction(thing.append) && thing[toStringTag] === 'FormData' && thing[iterator]);\n}\n\nconst toJSONObject = (obj) => {\n const stack = new Array(10);\n\n const visit = (source, i) => {\n\n if (isObject(source)) {\n if (stack.indexOf(source) >= 0) {\n return;\n }\n\n //Buffer check\n if (isBuffer(source)) {\n return source;\n }\n\n if(!('toJSON' in source)) {\n stack[i] = source;\n const target = isArray(source) ? [] : {};\n\n forEach(source, (value, key) => {\n const reducedValue = visit(value, i + 1);\n !isUndefined(reducedValue) && (target[key] = reducedValue);\n });\n\n stack[i] = undefined;\n\n return target;\n }\n }\n\n return source;\n }\n\n return visit(obj, 0);\n}\n\nconst isAsyncFn = kindOfTest('AsyncFunction');\n\nconst isThenable = (thing) =>\n thing && (isObject(thing) || isFunction(thing)) && isFunction(thing.then) && isFunction(thing.catch);\n\n// original code\n// https://github.com/DigitalBrainJS/AxiosPromise/blob/16deab13710ec09779922131f3fa5954320f83ab/lib/utils.js#L11-L34\n\nconst _setImmediate = ((setImmediateSupported, postMessageSupported) => {\n if (setImmediateSupported) {\n return setImmediate;\n }\n\n return postMessageSupported ? ((token, callbacks) => {\n _global.addEventListener(\"message\", ({source, data}) => {\n if (source === _global && data === token) {\n callbacks.length && callbacks.shift()();\n }\n }, false);\n\n return (cb) => {\n callbacks.push(cb);\n _global.postMessage(token, \"*\");\n }\n })(`axios@${Math.random()}`, []) : (cb) => setTimeout(cb);\n})(\n typeof setImmediate === 'function',\n isFunction(_global.postMessage)\n);\n\nconst asap = typeof queueMicrotask !== 'undefined' ?\n queueMicrotask.bind(_global) : ( typeof process !== 'undefined' && process.nextTick || _setImmediate);\n\n// *********************\n\n\nconst isIterable = (thing) => thing != null && isFunction(thing[iterator]);\n\n\nexport default {\n isArray,\n isArrayBuffer,\n isBuffer,\n isFormData,\n isArrayBufferView,\n isString,\n isNumber,\n isBoolean,\n isObject,\n isPlainObject,\n isEmptyObject,\n isReadableStream,\n isRequest,\n isResponse,\n isHeaders,\n isUndefined,\n isDate,\n isFile,\n isBlob,\n isRegExp,\n isFunction,\n isStream,\n isURLSearchParams,\n isTypedArray,\n isFileList,\n forEach,\n merge,\n extend,\n trim,\n stripBOM,\n inherits,\n toFlatObject,\n kindOf,\n kindOfTest,\n endsWith,\n toArray,\n forEachEntry,\n matchAll,\n isHTMLForm,\n hasOwnProperty,\n hasOwnProp: hasOwnProperty, // an alias to avoid ESLint no-prototype-builtins detection\n reduceDescriptors,\n freezeMethods,\n toObjectSet,\n toCamelCase,\n noop,\n toFiniteNumber,\n findKey,\n global: _global,\n isContextDefined,\n isSpecCompliantForm,\n toJSONObject,\n isAsyncFn,\n isThenable,\n setImmediate: _setImmediate,\n asap,\n isIterable\n};\n","'use strict';\n\nimport utils from '../utils.js';\n\n/**\n * Create an Error with the specified message, config, error code, request and response.\n *\n * @param {string} message The error message.\n * @param {string} [code] The error code (for example, 'ECONNABORTED').\n * @param {Object} [config] The config.\n * @param {Object} [request] The request.\n * @param {Object} [response] The response.\n *\n * @returns {Error} The created error.\n */\nfunction AxiosError(message, code, config, request, response) {\n Error.call(this);\n\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, this.constructor);\n } else {\n this.stack = (new Error()).stack;\n }\n\n this.message = message;\n this.name = 'AxiosError';\n code && (this.code = code);\n config && (this.config = config);\n request && (this.request = request);\n if (response) {\n this.response = response;\n this.status = response.status ? response.status : null;\n }\n}\n\nutils.inherits(AxiosError, Error, {\n toJSON: function toJSON() {\n return {\n // Standard\n message: this.message,\n name: this.name,\n // Microsoft\n description: this.description,\n number: this.number,\n // Mozilla\n fileName: this.fileName,\n lineNumber: this.lineNumber,\n columnNumber: this.columnNumber,\n stack: this.stack,\n // Axios\n config: utils.toJSONObject(this.config),\n code: this.code,\n status: this.status\n };\n }\n});\n\nconst prototype = AxiosError.prototype;\nconst descriptors = {};\n\n[\n 'ERR_BAD_OPTION_VALUE',\n 'ERR_BAD_OPTION',\n 'ECONNABORTED',\n 'ETIMEDOUT',\n 'ERR_NETWORK',\n 'ERR_FR_TOO_MANY_REDIRECTS',\n 'ERR_DEPRECATED',\n 'ERR_BAD_RESPONSE',\n 'ERR_BAD_REQUEST',\n 'ERR_CANCELED',\n 'ERR_NOT_SUPPORT',\n 'ERR_INVALID_URL'\n// eslint-disable-next-line func-names\n].forEach(code => {\n descriptors[code] = {value: code};\n});\n\nObject.defineProperties(AxiosError, descriptors);\nObject.defineProperty(prototype, 'isAxiosError', {value: true});\n\n// eslint-disable-next-line func-names\nAxiosError.from = (error, code, config, request, response, customProps) => {\n const axiosError = Object.create(prototype);\n\n utils.toFlatObject(error, axiosError, function filter(obj) {\n return obj !== Error.prototype;\n }, prop => {\n return prop !== 'isAxiosError';\n });\n\n const msg = error && error.message ? error.message : 'Error';\n\n // Prefer explicit code; otherwise copy the low-level error's code (e.g. ECONNREFUSED)\n const errCode = code == null && error ? error.code : code;\n AxiosError.call(axiosError, msg, errCode, config, request, response);\n\n // Chain the original error on the standard field; non-enumerable to avoid JSON noise\n if (error && axiosError.cause == null) {\n Object.defineProperty(axiosError, 'cause', { value: error, configurable: true });\n }\n\n axiosError.name = (error && error.name) || 'Error';\n\n customProps && Object.assign(axiosError, customProps);\n\n return axiosError;\n};\n\nexport default AxiosError;\n","// eslint-disable-next-line strict\nexport default null;\n","'use strict';\n\nimport utils from '../utils.js';\nimport AxiosError from '../core/AxiosError.js';\n// temporary hotfix to avoid circular references until AxiosURLSearchParams is refactored\nimport PlatformFormData from '../platform/node/classes/FormData.js';\n\n/**\n * Determines if the given thing is a array or js object.\n *\n * @param {string} thing - The object or array to be visited.\n *\n * @returns {boolean}\n */\nfunction isVisitable(thing) {\n return utils.isPlainObject(thing) || utils.isArray(thing);\n}\n\n/**\n * It removes the brackets from the end of a string\n *\n * @param {string} key - The key of the parameter.\n *\n * @returns {string} the key without the brackets.\n */\nfunction removeBrackets(key) {\n return utils.endsWith(key, '[]') ? key.slice(0, -2) : key;\n}\n\n/**\n * It takes a path, a key, and a boolean, and returns a string\n *\n * @param {string} path - The path to the current key.\n * @param {string} key - The key of the current object being iterated over.\n * @param {string} dots - If true, the key will be rendered with dots instead of brackets.\n *\n * @returns {string} The path to the current key.\n */\nfunction renderKey(path, key, dots) {\n if (!path) return key;\n return path.concat(key).map(function each(token, i) {\n // eslint-disable-next-line no-param-reassign\n token = removeBrackets(token);\n return !dots && i ? '[' + token + ']' : token;\n }).join(dots ? '.' : '');\n}\n\n/**\n * If the array is an array and none of its elements are visitable, then it's a flat array.\n *\n * @param {Array<any>} arr - The array to check\n *\n * @returns {boolean}\n */\nfunction isFlatArray(arr) {\n return utils.isArray(arr) && !arr.some(isVisitable);\n}\n\nconst predicates = utils.toFlatObject(utils, {}, null, function filter(prop) {\n return /^is[A-Z]/.test(prop);\n});\n\n/**\n * Convert a data object to FormData\n *\n * @param {Object} obj\n * @param {?Object} [formData]\n * @param {?Object} [options]\n * @param {Function} [options.visitor]\n * @param {Boolean} [options.metaTokens = true]\n * @param {Boolean} [options.dots = false]\n * @param {?Boolean} [options.indexes = false]\n *\n * @returns {Object}\n **/\n\n/**\n * It converts an object into a FormData object\n *\n * @param {Object<any, any>} obj - The object to convert to form data.\n * @param {string} formData - The FormData object to append to.\n * @param {Object<string, any>} options\n *\n * @returns\n */\nfunction toFormData(obj, formData, options) {\n if (!utils.isObject(obj)) {\n throw new TypeError('target must be an object');\n }\n\n // eslint-disable-next-line no-param-reassign\n formData = formData || new (PlatformFormData || FormData)();\n\n // eslint-disable-next-line no-param-reassign\n options = utils.toFlatObject(options, {\n metaTokens: true,\n dots: false,\n indexes: false\n }, false, function defined(option, source) {\n // eslint-disable-next-line no-eq-null,eqeqeq\n return !utils.isUndefined(source[option]);\n });\n\n const metaTokens = options.metaTokens;\n // eslint-disable-next-line no-use-before-define\n const visitor = options.visitor || defaultVisitor;\n const dots = options.dots;\n const indexes = options.indexes;\n const _Blob = options.Blob || typeof Blob !== 'undefined' && Blob;\n const useBlob = _Blob && utils.isSpecCompliantForm(formData);\n\n if (!utils.isFunction(visitor)) {\n throw new TypeError('visitor must be a function');\n }\n\n function convertValue(value) {\n if (value === null) return '';\n\n if (utils.isDate(value)) {\n return value.toISOString();\n }\n\n if (utils.isBoolean(value)) {\n return value.toString();\n }\n\n if (!useBlob && utils.isBlob(value)) {\n throw new AxiosError('Blob is not supported. Use a Buffer instead.');\n }\n\n if (utils.isArrayBuffer(value) || utils.isTypedArray(value)) {\n return useBlob && typeof Blob === 'function' ? new Blob([value]) : Buffer.from(value);\n }\n\n return value;\n }\n\n /**\n * Default visitor.\n *\n * @param {*} value\n * @param {String|Number} key\n * @param {Array<String|Number>} path\n * @this {FormData}\n *\n * @returns {boolean} return true to visit the each prop of the value recursively\n */\n function defaultVisitor(value, key, path) {\n let arr = value;\n\n if (value && !path && typeof value === 'object') {\n if (utils.endsWith(key, '{}')) {\n // eslint-disable-next-line no-param-reassign\n key = metaTokens ? key : key.slice(0, -2);\n // eslint-disable-next-line no-param-reassign\n value = JSON.stringify(value);\n } else if (\n (utils.isArray(value) && isFlatArray(value)) ||\n ((utils.isFileList(value) || utils.endsWith(key, '[]')) && (arr = utils.toArray(value))\n )) {\n // eslint-disable-next-line no-param-reassign\n key = removeBrackets(key);\n\n arr.forEach(function each(el, index) {\n !(utils.isUndefined(el) || el === null) && formData.append(\n // eslint-disable-next-line no-nested-ternary\n indexes === true ? renderKey([key], index, dots) : (indexes === null ? key : key + '[]'),\n convertValue(el)\n );\n });\n return false;\n }\n }\n\n if (isVisitable(value)) {\n return true;\n }\n\n formData.append(renderKey(path, key, dots), convertValue(value));\n\n return false;\n }\n\n const stack = [];\n\n const exposedHelpers = Object.assign(predicates, {\n defaultVisitor,\n convertValue,\n isVisitable\n });\n\n function build(value, path) {\n if (utils.isUndefined(value)) return;\n\n if (stack.indexOf(value) !== -1) {\n throw Error('Circular reference detected in ' + path.join('.'));\n }\n\n stack.push(value);\n\n utils.forEach(value, function each(el, key) {\n const result = !(utils.isUndefined(el) || el === null) && visitor.call(\n formData, el, utils.isString(key) ? key.trim() : key, path, exposedHelpers\n );\n\n if (result === true) {\n build(el, path ? path.concat(key) : [key]);\n }\n });\n\n stack.pop();\n }\n\n if (!utils.isObject(obj)) {\n throw new TypeError('data must be an object');\n }\n\n build(obj);\n\n return formData;\n}\n\nexport default toFormData;\n","'use strict';\n\nimport toFormData from './toFormData.js';\n\n/**\n * It encodes a string by replacing all characters that are not in the unreserved set with\n * their percent-encoded equivalents\n *\n * @param {string} str - The string to encode.\n *\n * @returns {string} The encoded string.\n */\nfunction encode(str) {\n const charMap = {\n '!': '%21',\n \"'\": '%27',\n '(': '%28',\n ')': '%29',\n '~': '%7E',\n '%20': '+',\n '%00': '\\x00'\n };\n return encodeURIComponent(str).replace(/[!'()~]|%20|%00/g, function replacer(match) {\n return charMap[match];\n });\n}\n\n/**\n * It takes a params object and converts it to a FormData object\n *\n * @param {Object<string, any>} params - The parameters to be converted to a FormData object.\n * @param {Object<string, any>} options - The options object passed to the Axios constructor.\n *\n * @returns {void}\n */\nfunction AxiosURLSearchParams(params, options) {\n this._pairs = [];\n\n params && toFormData(params, this, options);\n}\n\nconst prototype = AxiosURLSearchParams.prototype;\n\nprototype.append = function append(name, value) {\n this._pairs.push([name, value]);\n};\n\nprototype.toString = function toString(encoder) {\n const _encode = encoder ? function(value) {\n return encoder.call(this, value, encode);\n } : encode;\n\n return this._pairs.map(function each(pair) {\n return _encode(pair[0]) + '=' + _encode(pair[1]);\n }, '').join('&');\n};\n\nexport default AxiosURLSearchParams;\n","'use strict';\n\nimport utils from '../utils.js';\nimport AxiosURLSearchParams from '../helpers/AxiosURLSearchParams.js';\n\n/**\n * It replaces all instances of the characters `:`, `$`, `,`, `+`, `[`, and `]` with their\n * URI encoded counterparts\n *\n * @param {string} val The value to be encoded.\n *\n * @returns {string} The encoded value.\n */\nfunction encode(val) {\n return encodeURIComponent(val).\n replace(/%3A/gi, ':').\n replace(/%24/g, '$').\n replace(/%2C/gi, ',').\n replace(/%20/g, '+');\n}\n\n/**\n * Build a URL by appending params to the end\n *\n * @param {string} url The base of the url (e.g., http://www.google.com)\n * @param {object} [params] The params to be appended\n * @param {?(object|Function)} options\n *\n * @returns {string} The formatted url\n */\nexport default function buildURL(url, params, options) {\n /*eslint no-param-reassign:0*/\n if (!params) {\n return url;\n }\n \n const _encode = options && options.encode || encode;\n\n if (utils.isFunction(options)) {\n options = {\n serialize: options\n };\n } \n\n const serializeFn = options && options.serialize;\n\n let serializedParams;\n\n if (serializeFn) {\n serializedParams = serializeFn(params, options);\n } else {\n serializedParams = utils.isURLSearchParams(params) ?\n params.toString() :\n new AxiosURLSearchParams(params, options).toString(_encode);\n }\n\n if (serializedParams) {\n const hashmarkIndex = url.indexOf(\"#\");\n\n if (hashmarkIndex !== -1) {\n url = url.slice(0, hashmarkIndex);\n }\n url += (url.indexOf('?') === -1 ? '?' : '&') + serializedParams;\n }\n\n return url;\n}\n","'use strict';\n\nimport utils from './../utils.js';\n\nclass InterceptorManager {\n constructor() {\n this.handlers = [];\n }\n\n /**\n * Add a new interceptor to the stack\n *\n * @param {Function} fulfilled The function to handle `then` for a `Promise`\n * @param {Function} rejected The function to handle `reject` for a `Promise`\n *\n * @return {Number} An ID used to remove interceptor later\n */\n use(fulfilled, rejected, options) {\n this.handlers.push({\n fulfilled,\n rejected,\n synchronous: options ? options.synchronous : false,\n runWhen: options ? options.runWhen : null\n });\n return this.handlers.length - 1;\n }\n\n /**\n * Remove an interceptor from the stack\n *\n * @param {Number} id The ID that was returned by `use`\n *\n * @returns {Boolean} `true` if the interceptor was removed, `false` otherwise\n */\n eject(id) {\n if (this.handlers[id]) {\n this.handlers[id] = null;\n }\n }\n\n /**\n * Clear all interceptors from the stack\n *\n * @returns {void}\n */\n clear() {\n if (this.handlers) {\n this.handlers = [];\n }\n }\n\n /**\n * Iterate over all the registered interceptors\n *\n * This method is particularly useful for skipping over any\n * interceptors that may have become `null` calling `eject`.\n *\n * @param {Function} fn The function to call for each interceptor\n *\n * @returns {void}\n */\n forEach(fn) {\n utils.forEach(this.handlers, function forEachHandler(h) {\n if (h !== null) {\n fn(h);\n }\n });\n }\n}\n\nexport default InterceptorManager;\n","'use strict';\n\nexport default {\n silentJSONParsing: true,\n forcedJSONParsing: true,\n clarifyTimeoutError: false\n};\n","import URLSearchParams from './classes/URLSearchParams.js'\nimport FormData from './classes/FormData.js'\nimport Blob from './classes/Blob.js'\n\nexport default {\n isBrowser: true,\n classes: {\n URLSearchParams,\n FormData,\n Blob\n },\n protocols: ['http', 'https', 'file', 'blob', 'url', 'data']\n};\n","'use strict';\n\nimport AxiosURLSearchParams from '../../../helpers/AxiosURLSearchParams.js';\nexport default typeof URLSearchParams !== 'undefined' ? URLSearchParams : AxiosURLSearchParams;\n","'use strict';\n\nexport default typeof FormData !== 'undefined' ? FormData : null;\n","'use strict'\n\nexport default typeof Blob !== 'undefined' ? Blob : null\n","const hasBrowserEnv = typeof window !== 'undefined' && typeof document !== 'undefined';\n\nconst _navigator = typeof navigator === 'object' && navigator || undefined;\n\n/**\n * Determine if we're running in a standard browser environment\n *\n * This allows axios to run in a web worker, and react-native.\n * Both environments support XMLHttpRequest, but not fully standard globals.\n *\n * web workers:\n * typeof window -> undefined\n * typeof document -> undefined\n *\n * react-native:\n * navigator.product -> 'ReactNative'\n * nativescript\n * navigator.product -> 'NativeScript' or 'NS'\n *\n * @returns {boolean}\n */\nconst hasStandardBrowserEnv = hasBrowserEnv &&\n (!_navigator || ['ReactNative', 'NativeScript', 'NS'].indexOf(_navigator.product) < 0);\n\n/**\n * Determine if we're running in a standard browser webWorker environment\n *\n * Although the `isStandardBrowserEnv` method indicates that\n * `allows axios to run in a web worker`, the WebWorker will still be\n * filtered out due to its judgment standard\n * `typeof window !== 'undefined' && typeof document !== 'undefined'`.\n * This leads to a problem when axios post `FormData` in webWorker\n */\nconst hasStandardBrowserWebWorkerEnv = (() => {\n return (\n typeof WorkerGlobalScope !== 'undefined' &&\n // eslint-disable-next-line no-undef\n self instanceof WorkerGlobalScope &&\n typeof self.importScripts === 'function'\n );\n})();\n\nconst origin = hasBrowserEnv && window.location.href || 'http://localhost';\n\nexport {\n hasBrowserEnv,\n hasStandardBrowserWebWorkerEnv,\n hasStandardBrowserEnv,\n _navigator as navigator,\n origin\n}\n","import platform from './node/index.js';\nimport * as utils from './common/utils.js';\n\nexport default {\n ...utils,\n ...platform\n}\n","'use strict';\n\nimport utils from '../utils.js';\nimport toFormData from './toFormData.js';\nimport platform from '../platform/index.js';\n\nexport default function toURLEncodedForm(data, options) {\n return toFormData(data, new platform.classes.URLSearchParams(), {\n visitor: function(value, key, path, helpers) {\n if (platform.isNode && utils.isBuffer(value)) {\n this.append(key, value.toString('base64'));\n return false;\n }\n\n return helpers.defaultVisitor.apply(this, arguments);\n },\n ...options\n });\n}\n","'use strict';\n\nimport utils from '../utils.js';\n\n/**\n * It takes a string like `foo[x][y][z]` and returns an array like `['foo', 'x', 'y', 'z']\n *\n * @param {string} name - The name of the property to get.\n *\n * @returns An array of strings.\n */\nfunction parsePropPath(name) {\n // foo[x][y][z]\n // foo.x.y.z\n // foo-x-y-z\n // foo x y z\n return utils.matchAll(/\\w+|\\[(\\w*)]/g, name).map(match => {\n return match[0] === '[]' ? '' : match[1] || match[0];\n });\n}\n\n/**\n * Convert an array to an object.\n *\n * @param {Array<any>} arr - The array to convert to an object.\n *\n * @returns An object with the same keys and values as the array.\n */\nfunction arrayToObject(arr) {\n const obj = {};\n const keys = Object.keys(arr);\n let i;\n const len = keys.length;\n let key;\n for (i = 0; i < len; i++) {\n key = keys[i];\n obj[key] = arr[key];\n }\n return obj;\n}\n\n/**\n * It takes a FormData object and returns a JavaScript object\n *\n * @param {string} formData The FormData object to convert to JSON.\n *\n * @returns {Object<string, any> | null} The converted object.\n */\nfunction formDataToJSON(formData) {\n function buildPath(path, value, target, index) {\n let name = path[index++];\n\n if (name === '__proto__') return true;\n\n const isNumericKey = Number.isFinite(+name);\n const isLast = index >= path.length;\n name = !name && utils.isArray(target) ? target.length : name;\n\n if (isLast) {\n if (utils.hasOwnProp(target, name)) {\n target[name] = [target[name], value];\n } else {\n target[name] = value;\n }\n\n return !isNumericKey;\n }\n\n if (!target[name] || !utils.isObject(target[name])) {\n target[name] = [];\n }\n\n const result = buildPath(path, value, target[name], index);\n\n if (result && utils.isArray(target[name])) {\n target[name] = arrayToObject(target[name]);\n }\n\n return !isNumericKey;\n }\n\n if (utils.isFormData(formData) && utils.isFunction(formData.entries)) {\n const obj = {};\n\n utils.forEachEntry(formData, (name, value) => {\n buildPath(parsePropPath(name), value, obj, 0);\n });\n\n return obj;\n }\n\n return null;\n}\n\nexport default formDataToJSON;\n","'use strict';\n\nimport utils from '../utils.js';\nimport AxiosError from '../core/AxiosError.js';\nimport transitionalDefaults from './transitional.js';\nimport toFormData from '../helpers/toFormData.js';\nimport toURLEncodedForm from '../helpers/toURLEncodedForm.js';\nimport platform from '../platform/index.js';\nimport formDataToJSON from '../helpers/formDataToJSON.js';\n\n/**\n * It takes a string, tries to parse it, and if it fails, it returns the stringified version\n * of the input\n *\n * @param {any} rawValue - The value to be stringified.\n * @param {Function} parser - A function that parses a string into a JavaScript object.\n * @param {Function} encoder - A function that takes a value and returns a string.\n *\n * @returns {string} A stringified version of the rawValue.\n */\nfunction stringifySafely(rawValue, parser, encoder) {\n if (utils.isString(rawValue)) {\n try {\n (parser || JSON.parse)(rawValue);\n return utils.trim(rawValue);\n } catch (e) {\n if (e.name !== 'SyntaxError') {\n throw e;\n }\n }\n }\n\n return (encoder || JSON.stringify)(rawValue);\n}\n\nconst defaults = {\n\n transitional: transitionalDefaults,\n\n adapter: ['xhr', 'http', 'fetch'],\n\n transformRequest: [function transformRequest(data, headers) {\n const contentType = headers.getContentType() || '';\n const hasJSONContentType = contentType.indexOf('application/json') > -1;\n const isObjectPayload = utils.isObject(data);\n\n if (isObjectPayload && utils.isHTMLForm(data)) {\n data = new FormData(data);\n }\n\n const isFormData = utils.isFormData(data);\n\n if (isFormData) {\n return hasJSONContentType ? JSON.stringify(formDataToJSON(data)) : data;\n }\n\n if (utils.isArrayBuffer(data) ||\n utils.isBuffer(data) ||\n utils.isStream(data) ||\n utils.isFile(data) ||\n utils.isBlob(data) ||\n utils.isReadableStream(data)\n ) {\n return data;\n }\n if (utils.isArrayBufferView(data)) {\n return data.buffer;\n }\n if (utils.isURLSearchParams(data)) {\n headers.setContentType('application/x-www-form-urlencoded;charset=utf-8', false);\n return data.toString();\n }\n\n let isFileList;\n\n if (isObjectPayload) {\n if (contentType.indexOf('application/x-www-form-urlencoded') > -1) {\n return toURLEncodedForm(data, this.formSerializer).toString();\n }\n\n if ((isFileList = utils.isFileList(data)) || contentType.indexOf('multipart/form-data') > -1) {\n const _FormData = this.env && this.env.FormData;\n\n return toFormData(\n isFileList ? {'files[]': data} : data,\n _FormData && new _FormData(),\n this.formSerializer\n );\n }\n }\n\n if (isObjectPayload || hasJSONContentType ) {\n headers.setContentType('application/json', false);\n return stringifySafely(data);\n }\n\n return data;\n }],\n\n transformResponse: [function transformResponse(data) {\n const transitional = this.transitional || defaults.transitional;\n const forcedJSONParsing = transitional && transitional.forcedJSONParsing;\n const JSONRequested = this.responseType === 'json';\n\n if (utils.isResponse(data) || utils.isReadableStream(data)) {\n return data;\n }\n\n if (data && utils.isString(data) && ((forcedJSONParsing && !this.responseType) || JSONRequested)) {\n const silentJSONParsing = transitional && transitional.silentJSONParsing;\n const strictJSONParsing = !silentJSONParsing && JSONRequested;\n\n try {\n return JSON.parse(data, this.parseReviver);\n } catch (e) {\n if (strictJSONParsing) {\n if (e.name === 'SyntaxError') {\n throw AxiosError.from(e, AxiosError.ERR_BAD_RESPONSE, this, null, this.response);\n }\n throw e;\n }\n }\n }\n\n return data;\n }],\n\n /**\n * A timeout in milliseconds to abort a request. If set to 0 (default) a\n * timeout is not created.\n */\n timeout: 0,\n\n xsrfCookieName: 'XSRF-TOKEN',\n xsrfHeaderName: 'X-XSRF-TOKEN',\n\n maxContentLength: -1,\n maxBodyLength: -1,\n\n env: {\n FormData: platform.classes.FormData,\n Blob: platform.classes.Blob\n },\n\n validateStatus: function validateStatus(status) {\n return status >= 200 && status < 300;\n },\n\n headers: {\n common: {\n 'Accept': 'application/json, text/plain, */*',\n 'Content-Type': undefined\n }\n }\n};\n\nutils.forEach(['delete', 'get', 'head', 'post', 'put', 'patch'], (method) => {\n defaults.headers[method] = {};\n});\n\nexport default defaults;\n","'use strict';\n\nimport utils from './../utils.js';\n\n// RawAxiosHeaders whose duplicates are ignored by node\n// c.f. https://nodejs.org/api/http.html#http_message_headers\nconst ignoreDuplicateOf = utils.toObjectSet([\n 'age', 'authorization', 'content-length', 'content-type', 'etag',\n 'expires', 'from', 'host', 'if-modified-since', 'if-unmodified-since',\n 'last-modified', 'location', 'max-forwards', 'proxy-authorization',\n 'referer', 'retry-after', 'user-agent'\n]);\n\n/**\n * Parse headers into an object\n *\n * ```\n * Date: Wed, 27 Aug 2014 08:58:49 GMT\n * Content-Type: application/json\n * Connection: keep-alive\n * Transfer-Encoding: chunked\n * ```\n *\n * @param {String} rawHeaders Headers needing to be parsed\n *\n * @returns {Object} Headers parsed into an object\n */\nexport default rawHeaders => {\n const parsed = {};\n let key;\n let val;\n let i;\n\n rawHeaders && rawHeaders.split('\\n').forEach(function parser(line) {\n i = line.indexOf(':');\n key = line.substring(0, i).trim().toLowerCase();\n val = line.substring(i + 1).trim();\n\n if (!key || (parsed[key] && ignoreDuplicateOf[key])) {\n return;\n }\n\n if (key === 'set-cookie') {\n if (parsed[key]) {\n parsed[key].push(val);\n } else {\n parsed[key] = [val];\n }\n } else {\n parsed[key] = parsed[key] ? parsed[key] + ', ' + val : val;\n }\n });\n\n return parsed;\n};\n","'use strict';\n\nimport utils from '../utils.js';\nimport parseHeaders from '../helpers/parseHeaders.js';\n\nconst $internals = Symbol('internals');\n\nfunction normalizeHeader(header) {\n return header && String(header).trim().toLowerCase();\n}\n\nfunction normalizeValue(value) {\n if (value === false || value == null) {\n return value;\n }\n\n return utils.isArray(value) ? value.map(normalizeValue) : String(value);\n}\n\nfunction parseTokens(str) {\n const tokens = Object.create(null);\n const tokensRE = /([^\\s,;=]+)\\s*(?:=\\s*([^,;]+))?/g;\n let match;\n\n while ((match = tokensRE.exec(str))) {\n tokens[match[1]] = match[2];\n }\n\n return tokens;\n}\n\nconst isValidHeaderName = (str) => /^[-_a-zA-Z0-9^`|~,!#$%&'*+.]+$/.test(str.trim());\n\nfunction matchHeaderValue(context, value, header, filter, isHeaderNameFilter) {\n if (utils.isFunction(filter)) {\n return filter.call(this, value, header);\n }\n\n if (isHeaderNameFilter) {\n value = header;\n }\n\n if (!utils.isString(value)) return;\n\n if (utils.isString(filter)) {\n return value.indexOf(filter) !== -1;\n }\n\n if (utils.isRegExp(filter)) {\n return filter.test(value);\n }\n}\n\nfunction formatHeader(header) {\n return header.trim()\n .toLowerCase().replace(/([a-z\\d])(\\w*)/g, (w, char, str) => {\n return char.toUpperCase() + str;\n });\n}\n\nfunction buildAccessors(obj, header) {\n const accessorName = utils.toCamelCase(' ' + header);\n\n ['get', 'set', 'has'].forEach(methodName => {\n Object.defineProperty(obj, methodName + accessorName, {\n value: function(arg1, arg2, arg3) {\n return this[methodName].call(this, header, arg1, arg2, arg3);\n },\n configurable: true\n });\n });\n}\n\nclass AxiosHeaders {\n constructor(headers) {\n headers && this.set(headers);\n }\n\n set(header, valueOrRewrite, rewrite) {\n const self = this;\n\n function setHeader(_value, _header, _rewrite) {\n const lHeader = normalizeHeader(_header);\n\n if (!lHeader) {\n throw new Error('header name must be a non-empty string');\n }\n\n const key = utils.findKey(self, lHeader);\n\n if(!key || self[key] === undefined || _rewrite === true || (_rewrite === undefined && self[key] !== false)) {\n self[key || _header] = normalizeValue(_value);\n }\n }\n\n const setHeaders = (headers, _rewrite) =>\n utils.forEach(headers, (_value, _header) => setHeader(_value, _header, _rewrite));\n\n if (utils.isPlainObject(header) || header instanceof this.constructor) {\n setHeaders(header, valueOrRewrite)\n } else if(utils.isString(header) && (header = header.trim()) && !isValidHeaderName(header)) {\n setHeaders(parseHeaders(header), valueOrRewrite);\n } else if (utils.isObject(header) && utils.isIterable(header)) {\n let obj = {}, dest, key;\n for (const entry of header) {\n if (!utils.isArray(entry)) {\n throw TypeError('Object iterator must return a key-value pair');\n }\n\n obj[key = entry[0]] = (dest = obj[key]) ?\n (utils.isArray(dest) ? [...dest, entry[1]] : [dest, entry[1]]) : entry[1];\n }\n\n setHeaders(obj, valueOrRewrite)\n } else {\n header != null && setHeader(valueOrRewrite, header, rewrite);\n }\n\n return this;\n }\n\n get(header, parser) {\n header = normalizeHeader(header);\n\n if (header) {\n const key = utils.findKey(this, header);\n\n if (key) {\n const value = this[key];\n\n if (!parser) {\n return value;\n }\n\n if (parser === true) {\n return parseTokens(value);\n }\n\n if (utils.isFunction(parser)) {\n return parser.call(this, value, key);\n }\n\n if (utils.isRegExp(parser)) {\n return parser.exec(value);\n }\n\n throw new TypeError('parser must be boolean|regexp|function');\n }\n }\n }\n\n has(header, matcher) {\n header = normalizeHeader(header);\n\n if (header) {\n const key = utils.findKey(this, header);\n\n return !!(key && this[key] !== undefined && (!matcher || matchHeaderValue(this, this[key], key, matcher)));\n }\n\n return false;\n }\n\n delete(header, matcher) {\n const self = this;\n let deleted = false;\n\n function deleteHeader(_header) {\n _header = normalizeHeader(_header);\n\n if (_header) {\n const key = utils.findKey(self, _header);\n\n if (key && (!matcher || matchHeaderValue(self, self[key], key, matcher))) {\n delete self[key];\n\n deleted = true;\n }\n }\n }\n\n if (utils.isArray(header)) {\n header.forEach(deleteHeader);\n } else {\n deleteHeader(header);\n }\n\n return deleted;\n }\n\n clear(matcher) {\n const keys = Object.keys(this);\n let i = keys.length;\n let deleted = false;\n\n while (i--) {\n const key = keys[i];\n if(!matcher || matchHeaderValue(this, this[key], key, matcher, true)) {\n delete this[key];\n deleted = true;\n }\n }\n\n return deleted;\n }\n\n normalize(format) {\n const self = this;\n const headers = {};\n\n utils.forEach(this, (value, header) => {\n const key = utils.findKey(headers, header);\n\n if (key) {\n self[key] = normalizeValue(value);\n delete self[header];\n return;\n }\n\n const normalized = format ? formatHeader(header) : String(header).trim();\n\n if (normalized !== header) {\n delete self[header];\n }\n\n self[normalized] = normalizeValue(value);\n\n headers[normalized] = true;\n });\n\n return this;\n }\n\n concat(...targets) {\n return this.constructor.concat(this, ...targets);\n }\n\n toJSON(asStrings) {\n const obj = Object.create(null);\n\n utils.forEach(this, (value, header) => {\n value != null && value !== false && (obj[header] = asStrings && utils.isArray(value) ? value.join(', ') : value);\n });\n\n return obj;\n }\n\n [Symbol.iterator]() {\n return Object.entries(this.toJSON())[Symbol.iterator]();\n }\n\n toString() {\n return Object.entries(this.toJSON()).map(([header, value]) => header + ': ' + value).join('\\n');\n }\n\n getSetCookie() {\n return this.get(\"set-cookie\") || [];\n }\n\n get [Symbol.toStringTag]() {\n return 'AxiosHeaders';\n }\n\n static from(thing) {\n return thing instanceof this ? thing : new this(thing);\n }\n\n static concat(first, ...targets) {\n const computed = new this(first);\n\n targets.forEach((target) => computed.set(target));\n\n return computed;\n }\n\n static accessor(header) {\n const internals = this[$internals] = (this[$internals] = {\n accessors: {}\n });\n\n const accessors = internals.accessors;\n const prototype = this.prototype;\n\n function defineAccessor(_header) {\n const lHeader = normalizeHeader(_header);\n\n if (!accessors[lHeader]) {\n buildAccessors(prototype, _header);\n accessors[lHeader] = true;\n }\n }\n\n utils.isArray(header) ? header.forEach(defineAccessor) : defineAccessor(header);\n\n return this;\n }\n}\n\nAxiosHeaders.accessor(['Content-Type', 'Content-Length', 'Accept', 'Accept-Encoding', 'User-Agent', 'Authorization']);\n\n// reserved names hotfix\nutils.reduceDescriptors(AxiosHeaders.prototype, ({value}, key) => {\n let mapped = key[0].toUpperCase() + key.slice(1); // map `set` => `Set`\n return {\n get: () => value,\n set(headerValue) {\n this[mapped] = headerValue;\n }\n }\n});\n\nutils.freezeMethods(AxiosHeaders);\n\nexport default AxiosHeaders;\n","'use strict';\n\nimport utils from './../utils.js';\nimport defaults from '../defaults/index.js';\nimport AxiosHeaders from '../core/AxiosHeaders.js';\n\n/**\n * Transform the data for a request or a response\n *\n * @param {Array|Function} fns A single function or Array of functions\n * @param {?Object} response The response object\n *\n * @returns {*} The resulting transformed data\n */\nexport default function transformData(fns, response) {\n const config = this || defaults;\n const context = response || config;\n const headers = AxiosHeaders.from(context.headers);\n let data = context.data;\n\n utils.forEach(fns, function transform(fn) {\n data = fn.call(config, data, headers.normalize(), response ? response.status : undefined);\n });\n\n headers.normalize();\n\n return data;\n}\n","'use strict';\n\nexport default function isCancel(value) {\n return !!(value && value.__CANCEL__);\n}\n","'use strict';\n\nimport AxiosError from '../core/AxiosError.js';\nimport utils from '../utils.js';\n\n/**\n * A `CanceledError` is an object that is thrown when an operation is canceled.\n *\n * @param {string=} message The message.\n * @param {Object=} config The config.\n * @param {Object=} request The request.\n *\n * @returns {CanceledError} The created error.\n */\nfunction CanceledError(message, config, request) {\n // eslint-disable-next-line no-eq-null,eqeqeq\n AxiosError.call(this, message == null ? 'canceled' : message, AxiosError.ERR_CANCELED, config, request);\n this.name = 'CanceledError';\n}\n\nutils.inherits(CanceledError, AxiosError, {\n __CANCEL__: true\n});\n\nexport default CanceledError;\n","'use strict';\n\nimport AxiosError from './AxiosError.js';\n\n/**\n * Resolve or reject a Promise based on response status.\n *\n * @param {Function} resolve A function that resolves the promise.\n * @param {Function} reject A function that rejects the promise.\n * @param {object} response The response.\n *\n * @returns {object} The response.\n */\nexport default function settle(resolve, reject, response) {\n const validateStatus = response.config.validateStatus;\n if (!response.status || !validateStatus || validateStatus(response.status)) {\n resolve(response);\n } else {\n reject(new AxiosError(\n 'Request failed with status code ' + response.status,\n [AxiosError.ERR_BAD_REQUEST, AxiosError.ERR_BAD_RESPONSE][Math.floor(response.status / 100) - 4],\n response.config,\n response.request,\n response\n ));\n }\n}\n","'use strict';\n\nexport default function parseProtocol(url) {\n const match = /^([-+\\w]{1,25})(:?\\/\\/|:)/.exec(url);\n return match && match[1] || '';\n}\n","'use strict';\n\n/**\n * Calculate data maxRate\n * @param {Number} [samplesCount= 10]\n * @param {Number} [min= 1000]\n * @returns {Function}\n */\nfunction speedometer(samplesCount, min) {\n samplesCount = samplesCount || 10;\n const bytes = new Array(samplesCount);\n const timestamps = new Array(samplesCount);\n let head = 0;\n let tail = 0;\n let firstSampleTS;\n\n min = min !== undefined ? min : 1000;\n\n return function push(chunkLength) {\n const now = Date.now();\n\n const startedAt = timestamps[tail];\n\n if (!firstSampleTS) {\n firstSampleTS = now;\n }\n\n bytes[head] = chunkLength;\n timestamps[head] = now;\n\n let i = tail;\n let bytesCount = 0;\n\n while (i !== head) {\n bytesCount += bytes[i++];\n i = i % samplesCount;\n }\n\n head = (head + 1) % samplesCount;\n\n if (head === tail) {\n tail = (tail + 1) % samplesCount;\n }\n\n if (now - firstSampleTS < min) {\n return;\n }\n\n const passed = startedAt && now - startedAt;\n\n return passed ? Math.round(bytesCount * 1000 / passed) : undefined;\n };\n}\n\nexport default speedometer;\n","/**\n * Throttle decorator\n * @param {Function} fn\n * @param {Number} freq\n * @return {Function}\n */\nfunction throttle(fn, freq) {\n let timestamp = 0;\n let threshold = 1000 / freq;\n let lastArgs;\n let timer;\n\n const invoke = (args, now = Date.now()) => {\n timestamp = now;\n lastArgs = null;\n if (timer) {\n clearTimeout(timer);\n timer = null;\n }\n fn(...args);\n }\n\n const throttled = (...args) => {\n const now = Date.now();\n const passed = now - timestamp;\n if ( passed >= threshold) {\n invoke(args, now);\n } else {\n lastArgs = args;\n if (!timer) {\n timer = setTimeout(() => {\n timer = null;\n invoke(lastArgs)\n }, threshold - passed);\n }\n }\n }\n\n const flush = () => lastArgs && invoke(lastArgs);\n\n return [throttled, flush];\n}\n\nexport default throttle;\n","import speedometer from \"./speedometer.js\";\nimport throttle from \"./throttle.js\";\nimport utils from \"../utils.js\";\n\nexport const progressEventReducer = (listener, isDownloadStream, freq = 3) => {\n let bytesNotified = 0;\n const _speedometer = speedometer(50, 250);\n\n return throttle(e => {\n const loaded = e.loaded;\n const total = e.lengthComputable ? e.total : undefined;\n const progressBytes = loaded - bytesNotified;\n const rate = _speedometer(progressBytes);\n const inRange = loaded <= total;\n\n bytesNotified = loaded;\n\n const data = {\n loaded,\n total,\n progress: total ? (loaded / total) : undefined,\n bytes: progressBytes,\n rate: rate ? rate : undefined,\n estimated: rate && total && inRange ? (total - loaded) / rate : undefined,\n event: e,\n lengthComputable: total != null,\n [isDownloadStream ? 'download' : 'upload']: true\n };\n\n listener(data);\n }, freq);\n}\n\nexport const progressEventDecorator = (total, throttled) => {\n const lengthComputable = total != null;\n\n return [(loaded) => throttled[0]({\n lengthComputable,\n total,\n loaded\n }), throttled[1]];\n}\n\nexport const asyncDecorator = (fn) => (...args) => utils.asap(() => fn(...args));\n","import platform from '../platform/index.js';\n\nexport default platform.hasStandardBrowserEnv ? ((origin, isMSIE) => (url) => {\n url = new URL(url, platform.origin);\n\n return (\n origin.protocol === url.protocol &&\n origin.host === url.host &&\n (isMSIE || origin.port === url.port)\n );\n})(\n new URL(platform.origin),\n platform.navigator && /(msie|trident)/i.test(platform.navigator.userAgent)\n) : () => true;\n","import utils from './../utils.js';\nimport platform from '../platform/index.js';\n\nexport default platform.hasStandardBrowserEnv ?\n\n // Standard browser envs support document.cookie\n {\n write(name, value, expires, path, domain, secure) {\n const cookie = [name + '=' + encodeURIComponent(value)];\n\n utils.isNumber(expires) && cookie.push('expires=' + new Date(expires).toGMTString());\n\n utils.isString(path) && cookie.push('path=' + path);\n\n utils.isString(domain) && cookie.push('domain=' + domain);\n\n secure === true && cookie.push('secure');\n\n document.cookie = cookie.join('; ');\n },\n\n read(name) {\n const match = document.cookie.match(new RegExp('(^|;\\\\s*)(' + name + ')=([^;]*)'));\n return (match ? decodeURIComponent(match[3]) : null);\n },\n\n remove(name) {\n this.write(name, '', Date.now() - 86400000);\n }\n }\n\n :\n\n // Non-standard browser env (web workers, react-native) lack needed support.\n {\n write() {},\n read() {\n return null;\n },\n remove() {}\n };\n\n","'use strict';\n\n/**\n * Determines whether the specified URL is absolute\n *\n * @param {string} url The URL to test\n *\n * @returns {boolean} True if the specified URL is absolute, otherwise false\n */\nexport default function isAbsoluteURL(url) {\n // A URL is considered absolute if it begins with \"<scheme>://\" or \"//\" (protocol-relative URL).\n // RFC 3986 defines scheme name as a sequence of characters beginning with a letter and followed\n // by any combination of letters, digits, plus, period, or hyphen.\n return /^([a-z][a-z\\d+\\-.]*:)?\\/\\//i.test(url);\n}\n","'use strict';\n\n/**\n * Creates a new URL by combining the specified URLs\n *\n * @param {string} baseURL The base URL\n * @param {string} relativeURL The relative URL\n *\n * @returns {string} The combined URL\n */\nexport default function combineURLs(baseURL, relativeURL) {\n return relativeURL\n ? baseURL.replace(/\\/?\\/$/, '') + '/' + relativeURL.replace(/^\\/+/, '')\n : baseURL;\n}\n","'use strict';\n\nimport isAbsoluteURL from '../helpers/isAbsoluteURL.js';\nimport combineURLs from '../helpers/combineURLs.js';\n\n/**\n * Creates a new URL by combining the baseURL with the requestedURL,\n * only when the requestedURL is not already an absolute URL.\n * If the requestURL is absolute, this function returns the requestedURL untouched.\n *\n * @param {string} baseURL The base URL\n * @param {string} requestedURL Absolute or relative URL to combine\n *\n * @returns {string} The combined full path\n */\nexport default function buildFullPath(baseURL, requestedURL, allowAbsoluteUrls) {\n let isRelativeUrl = !isAbsoluteURL(requestedURL);\n if (baseURL && (isRelativeUrl || allowAbsoluteUrls == false)) {\n return combineURLs(baseURL, requestedURL);\n }\n return requestedURL;\n}\n","'use strict';\n\nimport utils from '../utils.js';\nimport AxiosHeaders from \"./AxiosHeaders.js\";\n\nconst headersToObject = (thing) => thing instanceof AxiosHeaders ? { ...thing } : thing;\n\n/**\n * Config-specific merge-function which creates a new config-object\n * by merging two configuration objects together.\n *\n * @param {Object} config1\n * @param {Object} config2\n *\n * @returns {Object} New object resulting from merging config2 to config1\n */\nexport default function mergeConfig(config1, config2) {\n // eslint-disable-next-line no-param-reassign\n config2 = config2 || {};\n const config = {};\n\n function getMergedValue(target, source, prop, caseless) {\n if (utils.isPlainObject(target) && utils.isPlainObject(source)) {\n return utils.merge.call({caseless}, target, source);\n } else if (utils.isPlainObject(source)) {\n return utils.merge({}, source);\n } else if (utils.isArray(source)) {\n return source.slice();\n }\n return source;\n }\n\n // eslint-disable-next-line consistent-return\n function mergeDeepProperties(a, b, prop , caseless) {\n if (!utils.isUndefined(b)) {\n return getMergedValue(a, b, prop , caseless);\n } else if (!utils.isUndefined(a)) {\n return getMergedValue(undefined, a, prop , caseless);\n }\n }\n\n // eslint-disable-next-line consistent-return\n function valueFromConfig2(a, b) {\n if (!utils.isUndefined(b)) {\n return getMergedValue(undefined, b);\n }\n }\n\n // eslint-disable-next-line consistent-return\n function defaultToConfig2(a, b) {\n if (!utils.isUndefined(b)) {\n return getMergedValue(undefined, b);\n } else if (!utils.isUndefined(a)) {\n return getMergedValue(undefined, a);\n }\n }\n\n // eslint-disable-next-line consistent-return\n function mergeDirectKeys(a, b, prop) {\n if (prop in config2) {\n return getMergedValue(a, b);\n } else if (prop in config1) {\n return getMergedValue(undefined, a);\n }\n }\n\n const mergeMap = {\n url: valueFromConfig2,\n method: valueFromConfig2,\n data: valueFromConfig2,\n baseURL: defaultToConfig2,\n transformRequest: defaultToConfig2,\n transformResponse: defaultToConfig2,\n paramsSerializer: defaultToConfig2,\n timeout: defaultToConfig2,\n timeoutMessage: defaultToConfig2,\n withCredentials: defaultToConfig2,\n withXSRFToken: defaultToConfig2,\n adapter: defaultToConfig2,\n responseType: defaultToConfig2,\n xsrfCookieName: defaultToConfig2,\n xsrfHeaderName: defaultToConfig2,\n onUploadProgress: defaultToConfig2,\n onDownloadProgress: defaultToConfig2,\n decompress: defaultToConfig2,\n maxContentLength: defaultToConfig2,\n maxBodyLength: defaultToConfig2,\n beforeRedirect: defaultToConfig2,\n transport: defaultToConfig2,\n httpAgent: defaultToConfig2,\n httpsAgent: defaultToConfig2,\n cancelToken: defaultToConfig2,\n socketPath: defaultToConfig2,\n responseEncoding: defaultToConfig2,\n validateStatus: mergeDirectKeys,\n headers: (a, b , prop) => mergeDeepProperties(headersToObject(a), headersToObject(b),prop, true)\n };\n\n utils.forEach(Object.keys({...config1, ...config2}), function computeConfigValue(prop) {\n const merge = mergeMap[prop] || mergeDeepProperties;\n const configValue = merge(config1[prop], config2[prop], prop);\n (utils.isUndefined(configValue) && merge !== mergeDirectKeys) || (config[prop] = configValue);\n });\n\n return config;\n}\n","import platform from \"../platform/index.js\";\nimport utils from \"../utils.js\";\nimport isURLSameOrigin from \"./isURLSameOrigin.js\";\nimport cookies from \"./cookies.js\";\nimport buildFullPath from \"../core/buildFullPath.js\";\nimport mergeConfig from \"../core/mergeConfig.js\";\nimport AxiosHeaders from \"../core/AxiosHeaders.js\";\nimport buildURL from \"./buildURL.js\";\n\nexport default (config) => {\n const newConfig = mergeConfig({}, config);\n\n let { data, withXSRFToken, xsrfHeaderName, xsrfCookieName, headers, auth } = newConfig;\n\n newConfig.headers = headers = AxiosHeaders.from(headers);\n\n newConfig.url = buildURL(buildFullPath(newConfig.baseURL, newConfig.url, newConfig.allowAbsoluteUrls), config.params, config.paramsSerializer);\n\n // HTTP basic authentication\n if (auth) {\n headers.set('Authorization', 'Basic ' +\n btoa((auth.username || '') + ':' + (auth.password ? unescape(encodeURIComponent(auth.password)) : ''))\n );\n }\n\n if (utils.isFormData(data)) {\n if (platform.hasStandardBrowserEnv || platform.hasStandardBrowserWebWorkerEnv) {\n headers.setContentType(undefined); // browser handles it\n } else if (utils.isFunction(data.getHeaders)) {\n // Node.js FormData (like form-data package)\n const formHeaders = data.getHeaders();\n // Only set safe headers to avoid overwriting security headers\n const allowedHeaders = ['content-type', 'content-length'];\n Object.entries(formHeaders).forEach(([key, val]) => {\n if (allowedHeaders.includes(key.toLowerCase())) {\n headers.set(key, val);\n }\n });\n }\n } \n\n // Add xsrf header\n // This is only done if running in a standard browser environment.\n // Specifically not if we're in a web worker, or react-native.\n\n if (platform.hasStandardBrowserEnv) {\n withXSRFToken && utils.isFunction(withXSRFToken) && (withXSRFToken = withXSRFToken(newConfig));\n\n if (withXSRFToken || (withXSRFToken !== false && isURLSameOrigin(newConfig.url))) {\n // Add xsrf header\n const xsrfValue = xsrfHeaderName && xsrfCookieName && cookies.read(xsrfCookieName);\n\n if (xsrfValue) {\n headers.set(xsrfHeaderName, xsrfValue);\n }\n }\n }\n\n return newConfig;\n}\n\n","import utils from './../utils.js';\nimport settle from './../core/settle.js';\nimport transitionalDefaults from '../defaults/transitional.js';\nimport AxiosError from '../core/AxiosError.js';\nimport CanceledError from '../cancel/CanceledError.js';\nimport parseProtocol from '../helpers/parseProtocol.js';\nimport platform from '../platform/index.js';\nimport AxiosHeaders from '../core/AxiosHeaders.js';\nimport {progressEventReducer} from '../helpers/progressEventReducer.js';\nimport resolveConfig from \"../helpers/resolveConfig.js\";\n\nconst isXHRAdapterSupported = typeof XMLHttpRequest !== 'undefined';\n\nexport default isXHRAdapterSupported && function (config) {\n return new Promise(function dispatchXhrRequest(resolve, reject) {\n const _config = resolveConfig(config);\n let requestData = _config.data;\n const requestHeaders = AxiosHeaders.from(_config.headers).normalize();\n let {responseType, onUploadProgress, onDownloadProgress} = _config;\n let onCanceled;\n let uploadThrottled, downloadThrottled;\n let flushUpload, flushDownload;\n\n function done() {\n flushUpload && flushUpload(); // flush events\n flushDownload && flushDownload(); // flush events\n\n _config.cancelToken && _config.cancelToken.unsubscribe(onCanceled);\n\n _config.signal && _config.signal.removeEventListener('abort', onCanceled);\n }\n\n let request = new XMLHttpRequest();\n\n request.open(_config.method.toUpperCase(), _config.url, true);\n\n // Set the request timeout in MS\n request.timeout = _config.timeout;\n\n function onloadend() {\n if (!request) {\n return;\n }\n // Prepare the response\n const responseHeaders = AxiosHeaders.from(\n 'getAllResponseHeaders' in request && request.getAllResponseHeaders()\n );\n const responseData = !responseType || responseType === 'text' || responseType === 'json' ?\n request.responseText : request.response;\n const response = {\n data: responseData,\n status: request.status,\n statusText: request.statusText,\n headers: responseHeaders,\n config,\n request\n };\n\n settle(function _resolve(value) {\n resolve(value);\n done();\n }, function _reject(err) {\n reject(err);\n done();\n }, response);\n\n // Clean up request\n request = null;\n }\n\n if ('onloadend' in request) {\n // Use onloadend if available\n request.onloadend = onloadend;\n } else {\n // Listen for ready state to emulate onloadend\n request.onreadystatechange = function handleLoad() {\n if (!request || request.readyState !== 4) {\n return;\n }\n\n // The request errored out and we didn't get a response, this will be\n // handled by onerror instead\n // With one exception: request that using file: protocol, most browsers\n // will return status as 0 even though it's a successful request\n if (request.status === 0 && !(request.responseURL && request.responseURL.indexOf('file:') === 0)) {\n return;\n }\n // readystate handler is calling before onerror or ontimeout handlers,\n // so we should call onloadend on the next 'tick'\n setTimeout(onloadend);\n };\n }\n\n // Handle browser request cancellation (as opposed to a manual cancellation)\n request.onabort = function handleAbort() {\n if (!request) {\n return;\n }\n\n reject(new AxiosError('Request aborted', AxiosError.ECONNABORTED, config, request));\n\n // Clean up request\n request = null;\n };\n\n // Handle low level network errors\n request.onerror = function handleError(event) {\n // Browsers deliver a ProgressEvent in XHR onerror\n // (message may be empty; when present, surface it)\n // See https://developer.mozilla.org/docs/Web/API/XMLHttpRequest/error_event\n const msg = event && event.message ? event.message : 'Network Error';\n const err = new AxiosError(msg, AxiosError.ERR_NETWORK, config, request);\n // attach the underlying event for consumers who want details\n err.event = event || null;\n reject(err);\n request = null;\n };\n \n // Handle timeout\n request.ontimeout = function handleTimeout() {\n let timeoutErrorMessage = _config.timeout ? 'timeout of ' + _config.timeout + 'ms exceeded' : 'timeout exceeded';\n const transitional = _config.transitional || transitionalDefaults;\n if (_config.timeoutErrorMessage) {\n timeoutErrorMessage = _config.timeoutErrorMessage;\n }\n reject(new AxiosError(\n timeoutErrorMessage,\n transitional.clarifyTimeoutError ? AxiosError.ETIMEDOUT : AxiosError.ECONNABORTED,\n config,\n request));\n\n // Clean up request\n request = null;\n };\n\n // Remove Content-Type if data is undefined\n requestData === undefined && requestHeaders.setContentType(null);\n\n // Add headers to the request\n if ('setRequestHeader' in request) {\n utils.forEach(requestHeaders.toJSON(), function setRequestHeader(val, key) {\n request.setRequestHeader(key, val);\n });\n }\n\n // Add withCredentials to request if needed\n if (!utils.isUndefined(_config.withCredentials)) {\n request.withCredentials = !!_config.withCredentials;\n }\n\n // Add responseType to request if needed\n if (responseType && responseType !== 'json') {\n request.responseType = _config.responseType;\n }\n\n // Handle progress if needed\n if (onDownloadProgress) {\n ([downloadThrottled, flushDownload] = progressEventReducer(onDownloadProgress, true));\n request.addEventListener('progress', downloadThrottled);\n }\n\n // Not all browsers support upload events\n if (onUploadProgress && request.upload) {\n ([uploadThrottled, flushUpload] = progressEventReducer(onUploadProgress));\n\n request.upload.addEventListener('progress', uploadThrottled);\n\n request.upload.addEventListener('loadend', flushUpload);\n }\n\n if (_config.cancelToken || _config.signal) {\n // Handle cancellation\n // eslint-disable-next-line func-names\n onCanceled = cancel => {\n if (!request) {\n return;\n }\n reject(!cancel || cancel.type ? new CanceledError(null, config, request) : cancel);\n request.abort();\n request = null;\n };\n\n _config.cancelToken && _config.cancelToken.subscribe(onCanceled);\n if (_config.signal) {\n _config.signal.aborted ? onCanceled() : _config.signal.addEventListener('abort', onCanceled);\n }\n }\n\n const protocol = parseProtocol(_config.url);\n\n if (protocol && platform.protocols.indexOf(protocol) === -1) {\n reject(new AxiosError('Unsupported protocol ' + protocol + ':', AxiosError.ERR_BAD_REQUEST, config));\n return;\n }\n\n\n // Send the request\n request.send(requestData || null);\n });\n}\n","import CanceledError from \"../cancel/CanceledError.js\";\nimport AxiosError from \"../core/AxiosError.js\";\nimport utils from '../utils.js';\n\nconst composeSignals = (signals, timeout) => {\n const {length} = (signals = signals ? signals.filter(Boolean) : []);\n\n if (timeout || length) {\n let controller = new AbortController();\n\n let aborted;\n\n const onabort = function (reason) {\n if (!aborted) {\n aborted = true;\n unsubscribe();\n const err = reason instanceof Error ? reason : this.reason;\n controller.abort(err instanceof AxiosError ? err : new CanceledError(err instanceof Error ? err.message : err));\n }\n }\n\n let timer = timeout && setTimeout(() => {\n timer = null;\n onabort(new AxiosError(`timeout ${timeout} of ms exceeded`, AxiosError.ETIMEDOUT))\n }, timeout)\n\n const unsubscribe = () => {\n if (signals) {\n timer && clearTimeout(timer);\n timer = null;\n signals.forEach(signal => {\n signal.unsubscribe ? signal.unsubscribe(onabort) : signal.removeEventListener('abort', onabort);\n });\n signals = null;\n }\n }\n\n signals.forEach((signal) => signal.addEventListener('abort', onabort));\n\n const {signal} = controller;\n\n signal.unsubscribe = () => utils.asap(unsubscribe);\n\n return signal;\n }\n}\n\nexport default composeSignals;\n","\nexport const streamChunk = function* (chunk, chunkSize) {\n let len = chunk.byteLength;\n\n if (!chunkSize || len < chunkSize) {\n yield chunk;\n return;\n }\n\n let pos = 0;\n let end;\n\n while (pos < len) {\n end = pos + chunkSize;\n yield chunk.slice(pos, end);\n pos = end;\n }\n}\n\nexport const readBytes = async function* (iterable, chunkSize) {\n for await (const chunk of readStream(iterable)) {\n yield* streamChunk(chunk, chunkSize);\n }\n}\n\nconst readStream = async function* (stream) {\n if (stream[Symbol.asyncIterator]) {\n yield* stream;\n return;\n }\n\n const reader = stream.getReader();\n try {\n for (;;) {\n const {done, value} = await reader.read();\n if (done) {\n break;\n }\n yield value;\n }\n } finally {\n await reader.cancel();\n }\n}\n\nexport const trackStream = (stream, chunkSize, onProgress, onFinish) => {\n const iterator = readBytes(stream, chunkSize);\n\n let bytes = 0;\n let done;\n let _onFinish = (e) => {\n if (!done) {\n done = true;\n onFinish && onFinish(e);\n }\n }\n\n return new ReadableStream({\n async pull(controller) {\n try {\n const {done, value} = await iterator.next();\n\n if (done) {\n _onFinish();\n controller.close();\n return;\n }\n\n let len = value.byteLength;\n if (onProgress) {\n let loadedBytes = bytes += len;\n onProgress(loadedBytes);\n }\n controller.enqueue(new Uint8Array(value));\n } catch (err) {\n _onFinish(err);\n throw err;\n }\n },\n cancel(reason) {\n _onFinish(reason);\n return iterator.return();\n }\n }, {\n highWaterMark: 2\n })\n}\n","import platform from \"../platform/index.js\";\nimport utils from \"../utils.js\";\nimport AxiosError from \"../core/AxiosError.js\";\nimport composeSignals from \"../helpers/composeSignals.js\";\nimport {trackStream} from \"../helpers/trackStream.js\";\nimport AxiosHeaders from \"../core/AxiosHeaders.js\";\nimport {progressEventReducer, progressEventDecorator, asyncDecorator} from \"../helpers/progressEventReducer.js\";\nimport resolveConfig from \"../helpers/resolveConfig.js\";\nimport settle from \"../core/settle.js\";\n\nconst DEFAULT_CHUNK_SIZE = 64 * 1024;\n\nconst {isFunction} = utils;\n\nconst globalFetchAPI = (({Request, Response}) => ({\n Request, Response\n}))(utils.global);\n\nconst {\n ReadableStream, TextEncoder\n} = utils.global;\n\n\nconst test = (fn, ...args) => {\n try {\n return !!fn(...args);\n } catch (e) {\n return false\n }\n}\n\nconst factory = (env) => {\n env = utils.merge.call({\n skipUndefined: true\n }, globalFetchAPI, env);\n\n const {fetch: envFetch, Request, Response} = env;\n const isFetchSupported = envFetch ? isFunction(envFetch) : typeof fetch === 'function';\n const isRequestSupported = isFunction(Request);\n const isResponseSupported = isFunction(Response);\n\n if (!isFetchSupported) {\n return false;\n }\n\n const isReadableStreamSupported = isFetchSupported && isFunction(ReadableStream);\n\n const encodeText = isFetchSupported && (typeof TextEncoder === 'function' ?\n ((encoder) => (str) => encoder.encode(str))(new TextEncoder()) :\n async (str) => new Uint8Array(await new Request(str).arrayBuffer())\n );\n\n const supportsRequestStream = isRequestSupported && isReadableStreamSupported && test(() => {\n let duplexAccessed = false;\n\n const hasContentType = new Request(platform.origin, {\n body: new ReadableStream(),\n method: 'POST',\n get duplex() {\n duplexAccessed = true;\n return 'half';\n },\n }).headers.has('Content-Type');\n\n return duplexAccessed && !hasContentType;\n });\n\n const supportsResponseStream = isResponseSupported && isReadableStreamSupported &&\n test(() => utils.isReadableStream(new Response('').body));\n\n const resolvers = {\n stream: supportsResponseStream && ((res) => res.body)\n };\n\n isFetchSupported && ((() => {\n ['text', 'arrayBuffer', 'blob', 'formData', 'stream'].forEach(type => {\n !resolvers[type] && (resolvers[type] = (res, config) => {\n let method = res && res[type];\n\n if (method) {\n return method.call(res);\n }\n\n throw new AxiosError(`Response type '${type}' is not supported`, AxiosError.ERR_NOT_SUPPORT, config);\n })\n });\n })());\n\n const getBodyLength = async (body) => {\n if (body == null) {\n return 0;\n }\n\n if (utils.isBlob(body)) {\n return body.size;\n }\n\n if (utils.isSpecCompliantForm(body)) {\n const _request = new Request(platform.origin, {\n method: 'POST',\n body,\n });\n return (await _request.arrayBuffer()).byteLength;\n }\n\n if (utils.isArrayBufferView(body) || utils.isArrayBuffer(body)) {\n return body.byteLength;\n }\n\n if (utils.isURLSearchParams(body)) {\n body = body + '';\n }\n\n if (utils.isString(body)) {\n return (await encodeText(body)).byteLength;\n }\n }\n\n const resolveBodyLength = async (headers, body) => {\n const length = utils.toFiniteNumber(headers.getContentLength());\n\n return length == null ? getBodyLength(body) : length;\n }\n\n return async (config) => {\n let {\n url,\n method,\n data,\n signal,\n cancelToken,\n timeout,\n onDownloadProgress,\n onUploadProgress,\n responseType,\n headers,\n withCredentials = 'same-origin',\n fetchOptions\n } = resolveConfig(config);\n\n let _fetch = envFetch || fetch;\n\n responseType = responseType ? (responseType + '').toLowerCase() : 'text';\n\n let composedSignal = composeSignals([signal, cancelToken && cancelToken.toAbortSignal()], timeout);\n\n let request = null;\n\n const unsubscribe = composedSignal && composedSignal.unsubscribe && (() => {\n composedSignal.unsubscribe();\n });\n\n let requestContentLength;\n\n try {\n if (\n onUploadProgress && supportsRequestStream && method !== 'get' && method !== 'head' &&\n (requestContentLength = await resolveBodyLength(headers, data)) !== 0\n ) {\n let _request = new Request(url, {\n method: 'POST',\n body: data,\n duplex: \"half\"\n });\n\n let contentTypeHeader;\n\n if (utils.isFormData(data) && (contentTypeHeader = _request.headers.get('content-type'))) {\n headers.setContentType(contentTypeHeader)\n }\n\n if (_request.body) {\n const [onProgress, flush] = progressEventDecorator(\n requestContentLength,\n progressEventReducer(asyncDecorator(onUploadProgress))\n );\n\n data = trackStream(_request.body, DEFAULT_CHUNK_SIZE, onProgress, flush);\n }\n }\n\n if (!utils.isString(withCredentials)) {\n withCredentials = withCredentials ? 'include' : 'omit';\n }\n\n // Cloudflare Workers throws when credentials are defined\n // see https://github.com/cloudflare/workerd/issues/902\n const isCredentialsSupported = isRequestSupported && \"credentials\" in Request.prototype;\n\n const resolvedOptions = {\n ...fetchOptions,\n signal: composedSignal,\n method: method.toUpperCase(),\n headers: headers.normalize().toJSON(),\n body: data,\n duplex: \"half\",\n credentials: isCredentialsSupported ? withCredentials : undefined\n };\n\n request = isRequestSupported && new Request(url, resolvedOptions);\n\n let response = await (isRequestSupported ? _fetch(request, fetchOptions) : _fetch(url, resolvedOptions));\n\n const isStreamResponse = supportsResponseStream && (responseType === 'stream' || responseType === 'response');\n\n if (supportsResponseStream && (onDownloadProgress || (isStreamResponse && unsubscribe))) {\n const options = {};\n\n ['status', 'statusText', 'headers'].forEach(prop => {\n options[prop] = response[prop];\n });\n\n const responseContentLength = utils.toFiniteNumber(response.headers.get('content-length'));\n\n const [onProgress, flush] = onDownloadProgress && progressEventDecorator(\n responseContentLength,\n progressEventReducer(asyncDecorator(onDownloadProgress), true)\n ) || [];\n\n response = new Response(\n trackStream(response.body, DEFAULT_CHUNK_SIZE, onProgress, () => {\n flush && flush();\n unsubscribe && unsubscribe();\n }),\n options\n );\n }\n\n responseType = responseType || 'text';\n\n let responseData = await resolvers[utils.findKey(resolvers, responseType) || 'text'](response, config);\n\n !isStreamResponse && unsubscribe && unsubscribe();\n\n return await new Promise((resolve, reject) => {\n settle(resolve, reject, {\n data: responseData,\n headers: AxiosHeaders.from(response.headers),\n status: response.status,\n statusText: response.statusText,\n config,\n request\n })\n })\n } catch (err) {\n unsubscribe && unsubscribe();\n\n if (err && err.name === 'TypeError' && /Load failed|fetch/i.test(err.message)) {\n throw Object.assign(\n new AxiosError('Network Error', AxiosError.ERR_NETWORK, config, request),\n {\n cause: err.cause || err\n }\n )\n }\n\n throw AxiosError.from(err, err && err.code, config, request);\n }\n }\n}\n\nconst seedCache = new Map();\n\nexport const getFetch = (config) => {\n let env = config ? config.env : {};\n const {fetch, Request, Response} = env;\n const seeds = [\n Request, Response, fetch\n ];\n\n let len = seeds.length, i = len,\n seed, target, map = seedCache;\n\n while (i--) {\n seed = seeds[i];\n target = map.get(seed);\n\n target === undefined && map.set(seed, target = (i ? new Map() : factory(env)))\n\n map = target;\n }\n\n return target;\n};\n\nconst adapter = getFetch();\n\nexport default adapter;\n","import utils from '../utils.js';\nimport httpAdapter from './http.js';\nimport xhrAdapter from './xhr.js';\nimport * as fetchAdapter from './fetch.js';\nimport AxiosError from \"../core/AxiosError.js\";\n\nconst knownAdapters = {\n http: httpAdapter,\n xhr: xhrAdapter,\n fetch: {\n get: fetchAdapter.getFetch,\n }\n}\n\nutils.forEach(knownAdapters, (fn, value) => {\n if (fn) {\n try {\n Object.defineProperty(fn, 'name', {value});\n } catch (e) {\n // eslint-disable-next-line no-empty\n }\n Object.defineProperty(fn, 'adapterName', {value});\n }\n});\n\nconst renderReason = (reason) => `- ${reason}`;\n\nconst isResolvedHandle = (adapter) => utils.isFunction(adapter) || adapter === null || adapter === false;\n\nexport default {\n getAdapter: (adapters, config) => {\n adapters = utils.isArray(adapters) ? adapters : [adapters];\n\n const {length} = adapters;\n let nameOrAdapter;\n let adapter;\n\n const rejectedReasons = {};\n\n for (let i = 0; i < length; i++) {\n nameOrAdapter = adapters[i];\n let id;\n\n adapter = nameOrAdapter;\n\n if (!isResolvedHandle(nameOrAdapter)) {\n adapter = knownAdapters[(id = String(nameOrAdapter)).toLowerCase()];\n\n if (adapter === undefined) {\n throw new AxiosError(`Unknown adapter '${id}'`);\n }\n }\n\n if (adapter && (utils.isFunction(adapter) || (adapter = adapter.get(config)))) {\n break;\n }\n\n rejectedReasons[id || '#' + i] = adapter;\n }\n\n if (!adapter) {\n\n const reasons = Object.entries(rejectedReasons)\n .map(([id, state]) => `adapter ${id} ` +\n (state === false ? 'is not supported by the environment' : 'is not available in the build')\n );\n\n let s = length ?\n (reasons.length > 1 ? 'since :\\n' + reasons.map(renderReason).join('\\n') : ' ' + renderReason(reasons[0])) :\n 'as no adapter specified';\n\n throw new AxiosError(\n `There is no suitable adapter to dispatch the request ` + s,\n 'ERR_NOT_SUPPORT'\n );\n }\n\n return adapter;\n },\n adapters: knownAdapters\n}\n","'use strict';\n\nimport transformData from './transformData.js';\nimport isCancel from '../cancel/isCancel.js';\nimport defaults from '../defaults/index.js';\nimport CanceledError from '../cancel/CanceledError.js';\nimport AxiosHeaders from '../core/AxiosHeaders.js';\nimport adapters from \"../adapters/adapters.js\";\n\n/**\n * Throws a `CanceledError` if cancellation has been requested.\n *\n * @param {Object} config The config that is to be used for the request\n *\n * @returns {void}\n */\nfunction throwIfCancellationRequested(config) {\n if (config.cancelToken) {\n config.cancelToken.throwIfRequested();\n }\n\n if (config.signal && config.signal.aborted) {\n throw new CanceledError(null, config);\n }\n}\n\n/**\n * Dispatch a request to the server using the configured adapter.\n *\n * @param {object} config The config that is to be used for the request\n *\n * @returns {Promise} The Promise to be fulfilled\n */\nexport default function dispatchRequest(config) {\n throwIfCancellationRequested(config);\n\n config.headers = AxiosHeaders.from(config.headers);\n\n // Transform request data\n config.data = transformData.call(\n config,\n config.transformRequest\n );\n\n if (['post', 'put', 'patch'].indexOf(config.method) !== -1) {\n config.headers.setContentType('application/x-www-form-urlencoded', false);\n }\n\n const adapter = adapters.getAdapter(config.adapter || defaults.adapter, config);\n\n return adapter(config).then(function onAdapterResolution(response) {\n throwIfCancellationRequested(config);\n\n // Transform response data\n response.data = transformData.call(\n config,\n config.transformResponse,\n response\n );\n\n response.headers = AxiosHeaders.from(response.headers);\n\n return response;\n }, function onAdapterRejection(reason) {\n if (!isCancel(reason)) {\n throwIfCancellationRequested(config);\n\n // Transform response data\n if (reason && reason.response) {\n reason.response.data = transformData.call(\n config,\n config.transformResponse,\n reason.response\n );\n reason.response.headers = AxiosHeaders.from(reason.response.headers);\n }\n }\n\n return Promise.reject(reason);\n });\n}\n","export const VERSION = \"1.12.2\";","'use strict';\n\nimport {VERSION} from '../env/data.js';\nimport AxiosError from '../core/AxiosError.js';\n\nconst validators = {};\n\n// eslint-disable-next-line func-names\n['object', 'boolean', 'number', 'function', 'string', 'symbol'].forEach((type, i) => {\n validators[type] = function validator(thing) {\n return typeof thing === type || 'a' + (i < 1 ? 'n ' : ' ') + type;\n };\n});\n\nconst deprecatedWarnings = {};\n\n/**\n * Transitional option validator\n *\n * @param {function|boolean?} validator - set to false if the transitional option has been removed\n * @param {string?} version - deprecated version / removed since version\n * @param {string?} message - some message with additional info\n *\n * @returns {function}\n */\nvalidators.transitional = function transitional(validator, version, message) {\n function formatMessage(opt, desc) {\n return '[Axios v' + VERSION + '] Transitional option \\'' + opt + '\\'' + desc + (message ? '. ' + message : '');\n }\n\n // eslint-disable-next-line func-names\n return (value, opt, opts) => {\n if (validator === false) {\n throw new AxiosError(\n formatMessage(opt, ' has been removed' + (version ? ' in ' + version : '')),\n AxiosError.ERR_DEPRECATED\n );\n }\n\n if (version && !deprecatedWarnings[opt]) {\n deprecatedWarnings[opt] = true;\n // eslint-disable-next-line no-console\n console.warn(\n formatMessage(\n opt,\n ' has been deprecated since v' + version + ' and will be removed in the near future'\n )\n );\n }\n\n return validator ? validator(value, opt, opts) : true;\n };\n};\n\nvalidators.spelling = function spelling(correctSpelling) {\n return (value, opt) => {\n // eslint-disable-next-line no-console\n console.warn(`${opt} is likely a misspelling of ${correctSpelling}`);\n return true;\n }\n};\n\n/**\n * Assert object's properties type\n *\n * @param {object} options\n * @param {object} schema\n * @param {boolean?} allowUnknown\n *\n * @returns {object}\n */\n\nfunction assertOptions(options, schema, allowUnknown) {\n if (typeof options !== 'object') {\n throw new AxiosError('options must be an object', AxiosError.ERR_BAD_OPTION_VALUE);\n }\n const keys = Object.keys(options);\n let i = keys.length;\n while (i-- > 0) {\n const opt = keys[i];\n const validator = schema[opt];\n if (validator) {\n const value = options[opt];\n const result = value === undefined || validator(value, opt, options);\n if (result !== true) {\n throw new AxiosError('option ' + opt + ' must be ' + result, AxiosError.ERR_BAD_OPTION_VALUE);\n }\n continue;\n }\n if (allowUnknown !== true) {\n throw new AxiosError('Unknown option ' + opt, AxiosError.ERR_BAD_OPTION);\n }\n }\n}\n\nexport default {\n assertOptions,\n validators\n};\n","'use strict';\n\nimport utils from './../utils.js';\nimport buildURL from '../helpers/buildURL.js';\nimport InterceptorManager from './InterceptorManager.js';\nimport dispatchRequest from './dispatchRequest.js';\nimport mergeConfig from './mergeConfig.js';\nimport buildFullPath from './buildFullPath.js';\nimport validator from '../helpers/validator.js';\nimport AxiosHeaders from './AxiosHeaders.js';\n\nconst validators = validator.validators;\n\n/**\n * Create a new instance of Axios\n *\n * @param {Object} instanceConfig The default config for the instance\n *\n * @return {Axios} A new instance of Axios\n */\nclass Axios {\n constructor(instanceConfig) {\n this.defaults = instanceConfig || {};\n this.interceptors = {\n request: new InterceptorManager(),\n response: new InterceptorManager()\n };\n }\n\n /**\n * Dispatch a request\n *\n * @param {String|Object} configOrUrl The config specific for this request (merged with this.defaults)\n * @param {?Object} config\n *\n * @returns {Promise} The Promise to be fulfilled\n */\n async request(configOrUrl, config) {\n try {\n return await this._request(configOrUrl, config);\n } catch (err) {\n if (err instanceof Error) {\n let dummy = {};\n\n Error.captureStackTrace ? Error.captureStackTrace(dummy) : (dummy = new Error());\n\n // slice off the Error: ... line\n const stack = dummy.stack ? dummy.stack.replace(/^.+\\n/, '') : '';\n try {\n if (!err.stack) {\n err.stack = stack;\n // match without the 2 top stack lines\n } else if (stack && !String(err.stack).endsWith(stack.replace(/^.+\\n.+\\n/, ''))) {\n err.stack += '\\n' + stack\n }\n } catch (e) {\n // ignore the case where \"stack\" is an un-writable property\n }\n }\n\n throw err;\n }\n }\n\n _request(configOrUrl, config) {\n /*eslint no-param-reassign:0*/\n // Allow for axios('example/url'[, config]) a la fetch API\n if (typeof configOrUrl === 'string') {\n config = config || {};\n config.url = configOrUrl;\n } else {\n config = configOrUrl || {};\n }\n\n config = mergeConfig(this.defaults, config);\n\n const {transitional, paramsSerializer, headers} = config;\n\n if (transitional !== undefined) {\n validator.assertOptions(transitional, {\n silentJSONParsing: validators.transitional(validators.boolean),\n forcedJSONParsing: validators.transitional(validators.boolean),\n clarifyTimeoutError: validators.transitional(validators.boolean)\n }, false);\n }\n\n if (paramsSerializer != null) {\n if (utils.isFunction(paramsSerializer)) {\n config.paramsSerializer = {\n serialize: paramsSerializer\n }\n } else {\n validator.assertOptions(paramsSerializer, {\n encode: validators.function,\n serialize: validators.function\n }, true);\n }\n }\n\n // Set config.allowAbsoluteUrls\n if (config.allowAbsoluteUrls !== undefined) {\n // do nothing\n } else if (this.defaults.allowAbsoluteUrls !== undefined) {\n config.allowAbsoluteUrls = this.defaults.allowAbsoluteUrls;\n } else {\n config.allowAbsoluteUrls = true;\n }\n\n validator.assertOptions(config, {\n baseUrl: validators.spelling('baseURL'),\n withXsrfToken: validators.spelling('withXSRFToken')\n }, true);\n\n // Set config.method\n config.method = (config.method || this.defaults.method || 'get').toLowerCase();\n\n // Flatten headers\n let contextHeaders = headers && utils.merge(\n headers.common,\n headers[config.method]\n );\n\n headers && utils.forEach(\n ['delete', 'get', 'head', 'post', 'put', 'patch', 'common'],\n (method) => {\n delete headers[method];\n }\n );\n\n config.headers = AxiosHeaders.concat(contextHeaders, headers);\n\n // filter out skipped interceptors\n const requestInterceptorChain = [];\n let synchronousRequestInterceptors = true;\n this.interceptors.request.forEach(function unshiftRequestInterceptors(interceptor) {\n if (typeof interceptor.runWhen === 'function' && interceptor.runWhen(config) === false) {\n return;\n }\n\n synchronousRequestInterceptors = synchronousRequestInterceptors && interceptor.synchronous;\n\n requestInterceptorChain.unshift(interceptor.fulfilled, interceptor.rejected);\n });\n\n const responseInterceptorChain = [];\n this.interceptors.response.forEach(function pushResponseInterceptors(interceptor) {\n responseInterceptorChain.push(interceptor.fulfilled, interceptor.rejected);\n });\n\n let promise;\n let i = 0;\n let len;\n\n if (!synchronousRequestInterceptors) {\n const chain = [dispatchRequest.bind(this), undefined];\n chain.unshift(...requestInterceptorChain);\n chain.push(...responseInterceptorChain);\n len = chain.length;\n\n promise = Promise.resolve(config);\n\n while (i < len) {\n promise = promise.then(chain[i++], chain[i++]);\n }\n\n return promise;\n }\n\n len = requestInterceptorChain.length;\n\n let newConfig = config;\n\n while (i < len) {\n const onFulfilled = requestInterceptorChain[i++];\n const onRejected = requestInterceptorChain[i++];\n try {\n newConfig = onFulfilled(newConfig);\n } catch (error) {\n onRejected.call(this, error);\n break;\n }\n }\n\n try {\n promise = dispatchRequest.call(this, newConfig);\n } catch (error) {\n return Promise.reject(error);\n }\n\n i = 0;\n len = responseInterceptorChain.length;\n\n while (i < len) {\n promise = promise.then(responseInterceptorChain[i++], responseInterceptorChain[i++]);\n }\n\n return promise;\n }\n\n getUri(config) {\n config = mergeConfig(this.defaults, config);\n const fullPath = buildFullPath(config.baseURL, config.url, config.allowAbsoluteUrls);\n return buildURL(fullPath, config.params, config.paramsSerializer);\n }\n}\n\n// Provide aliases for supported request methods\nutils.forEach(['delete', 'get', 'head', 'options'], function forEachMethodNoData(method) {\n /*eslint func-names:0*/\n Axios.prototype[method] = function(url, config) {\n return this.request(mergeConfig(config || {}, {\n method,\n url,\n data: (config || {}).data\n }));\n };\n});\n\nutils.forEach(['post', 'put', 'patch'], function forEachMethodWithData(method) {\n /*eslint func-names:0*/\n\n function generateHTTPMethod(isForm) {\n return function httpMethod(url, data, config) {\n return this.request(mergeConfig(config || {}, {\n method,\n headers: isForm ? {\n 'Content-Type': 'multipart/form-data'\n } : {},\n url,\n data\n }));\n };\n }\n\n Axios.prototype[method] = generateHTTPMethod();\n\n Axios.prototype[method + 'Form'] = generateHTTPMethod(true);\n});\n\nexport default Axios;\n","'use strict';\n\nimport CanceledError from './CanceledError.js';\n\n/**\n * A `CancelToken` is an object that can be used to request cancellation of an operation.\n *\n * @param {Function} executor The executor function.\n *\n * @returns {CancelToken}\n */\nclass CancelToken {\n constructor(executor) {\n if (typeof executor !== 'function') {\n throw new TypeError('executor must be a function.');\n }\n\n let resolvePromise;\n\n this.promise = new Promise(function promiseExecutor(resolve) {\n resolvePromise = resolve;\n });\n\n const token = this;\n\n // eslint-disable-next-line func-names\n this.promise.then(cancel => {\n if (!token._listeners) return;\n\n let i = token._listeners.length;\n\n while (i-- > 0) {\n token._listeners[i](cancel);\n }\n token._listeners = null;\n });\n\n // eslint-disable-next-line func-names\n this.promise.then = onfulfilled => {\n let _resolve;\n // eslint-disable-next-line func-names\n const promise = new Promise(resolve => {\n token.subscribe(resolve);\n _resolve = resolve;\n }).then(onfulfilled);\n\n promise.cancel = function reject() {\n token.unsubscribe(_resolve);\n };\n\n return promise;\n };\n\n executor(function cancel(message, config, request) {\n if (token.reason) {\n // Cancellation has already been requested\n return;\n }\n\n token.reason = new CanceledError(message, config, request);\n resolvePromise(token.reason);\n });\n }\n\n /**\n * Throws a `CanceledError` if cancellation has been requested.\n */\n throwIfRequested() {\n if (this.reason) {\n throw this.reason;\n }\n }\n\n /**\n * Subscribe to the cancel signal\n */\n\n subscribe(listener) {\n if (this.reason) {\n listener(this.reason);\n return;\n }\n\n if (this._listeners) {\n this._listeners.push(listener);\n } else {\n this._listeners = [listener];\n }\n }\n\n /**\n * Unsubscribe from the cancel signal\n */\n\n unsubscribe(listener) {\n if (!this._listeners) {\n return;\n }\n const index = this._listeners.indexOf(listener);\n if (index !== -1) {\n this._listeners.splice(index, 1);\n }\n }\n\n toAbortSignal() {\n const controller = new AbortController();\n\n const abort = (err) => {\n controller.abort(err);\n };\n\n this.subscribe(abort);\n\n controller.signal.unsubscribe = () => this.unsubscribe(abort);\n\n return controller.signal;\n }\n\n /**\n * Returns an object that contains a new `CancelToken` and a function that, when called,\n * cancels the `CancelToken`.\n */\n static source() {\n let cancel;\n const token = new CancelToken(function executor(c) {\n cancel = c;\n });\n return {\n token,\n cancel\n };\n }\n}\n\nexport default CancelToken;\n","'use strict';\n\n/**\n * Syntactic sugar for invoking a function and expanding an array for arguments.\n *\n * Common use case would be to use `Function.prototype.apply`.\n *\n * ```js\n * function f(x, y, z) {}\n * var args = [1, 2, 3];\n * f.apply(null, args);\n * ```\n *\n * With `spread` this example can be re-written.\n *\n * ```js\n * spread(function(x, y, z) {})([1, 2, 3]);\n * ```\n *\n * @param {Function} callback\n *\n * @returns {Function}\n */\nexport default function spread(callback) {\n return function wrap(arr) {\n return callback.apply(null, arr);\n };\n}\n","'use strict';\n\nimport utils from './../utils.js';\n\n/**\n * Determines whether the payload is an error thrown by Axios\n *\n * @param {*} payload The value to test\n *\n * @returns {boolean} True if the payload is an error thrown by Axios, otherwise false\n */\nexport default function isAxiosError(payload) {\n return utils.isObject(payload) && (payload.isAxiosError === true);\n}\n","const HttpStatusCode = {\n Continue: 100,\n SwitchingProtocols: 101,\n Processing: 102,\n EarlyHints: 103,\n Ok: 200,\n Created: 201,\n Accepted: 202,\n NonAuthoritativeInformation: 203,\n NoContent: 204,\n ResetContent: 205,\n PartialContent: 206,\n MultiStatus: 207,\n AlreadyReported: 208,\n ImUsed: 226,\n MultipleChoices: 300,\n MovedPermanently: 301,\n Found: 302,\n SeeOther: 303,\n NotModified: 304,\n UseProxy: 305,\n Unused: 306,\n TemporaryRedirect: 307,\n PermanentRedirect: 308,\n BadRequest: 400,\n Unauthorized: 401,\n PaymentRequired: 402,\n Forbidden: 403,\n NotFound: 404,\n MethodNotAllowed: 405,\n NotAcceptable: 406,\n ProxyAuthenticationRequired: 407,\n RequestTimeout: 408,\n Conflict: 409,\n Gone: 410,\n LengthRequired: 411,\n PreconditionFailed: 412,\n PayloadTooLarge: 413,\n UriTooLong: 414,\n UnsupportedMediaType: 415,\n RangeNotSatisfiable: 416,\n ExpectationFailed: 417,\n ImATeapot: 418,\n MisdirectedRequest: 421,\n UnprocessableEntity: 422,\n Locked: 423,\n FailedDependency: 424,\n TooEarly: 425,\n UpgradeRequired: 426,\n PreconditionRequired: 428,\n TooManyRequests: 429,\n RequestHeaderFieldsTooLarge: 431,\n UnavailableForLegalReasons: 451,\n InternalServerError: 500,\n NotImplemented: 501,\n BadGateway: 502,\n ServiceUnavailable: 503,\n GatewayTimeout: 504,\n HttpVersionNotSupported: 505,\n VariantAlsoNegotiates: 506,\n InsufficientStorage: 507,\n LoopDetected: 508,\n NotExtended: 510,\n NetworkAuthenticationRequired: 511,\n};\n\nObject.entries(HttpStatusCode).forEach(([key, value]) => {\n HttpStatusCode[value] = key;\n});\n\nexport default HttpStatusCode;\n","'use strict';\n\nimport utils from './utils.js';\nimport bind from './helpers/bind.js';\nimport Axios from './core/Axios.js';\nimport mergeConfig from './core/mergeConfig.js';\nimport defaults from './defaults/index.js';\nimport formDataToJSON from './helpers/formDataToJSON.js';\nimport CanceledError from './cancel/CanceledError.js';\nimport CancelToken from './cancel/CancelToken.js';\nimport isCancel from './cancel/isCancel.js';\nimport {VERSION} from './env/data.js';\nimport toFormData from './helpers/toFormData.js';\nimport AxiosError from './core/AxiosError.js';\nimport spread from './helpers/spread.js';\nimport isAxiosError from './helpers/isAxiosError.js';\nimport AxiosHeaders from \"./core/AxiosHeaders.js\";\nimport adapters from './adapters/adapters.js';\nimport HttpStatusCode from './helpers/HttpStatusCode.js';\n\n/**\n * Create an instance of Axios\n *\n * @param {Object} defaultConfig The default config for the instance\n *\n * @returns {Axios} A new instance of Axios\n */\nfunction createInstance(defaultConfig) {\n const context = new Axios(defaultConfig);\n const instance = bind(Axios.prototype.request, context);\n\n // Copy axios.prototype to instance\n utils.extend(instance, Axios.prototype, context, {allOwnKeys: true});\n\n // Copy context to instance\n utils.extend(instance, context, null, {allOwnKeys: true});\n\n // Factory for creating new instances\n instance.create = function create(instanceConfig) {\n return createInstance(mergeConfig(defaultConfig, instanceConfig));\n };\n\n return instance;\n}\n\n// Create the default instance to be exported\nconst axios = createInstance(defaults);\n\n// Expose Axios class to allow class inheritance\naxios.Axios = Axios;\n\n// Expose Cancel & CancelToken\naxios.CanceledError = CanceledError;\naxios.CancelToken = CancelToken;\naxios.isCancel = isCancel;\naxios.VERSION = VERSION;\naxios.toFormData = toFormData;\n\n// Expose AxiosError class\naxios.AxiosError = AxiosError;\n\n// alias for CanceledError for backward compatibility\naxios.Cancel = axios.CanceledError;\n\n// Expose all/spread\naxios.all = function all(promises) {\n return Promise.all(promises);\n};\n\naxios.spread = spread;\n\n// Expose isAxiosError\naxios.isAxiosError = isAxiosError;\n\n// Expose mergeConfig\naxios.mergeConfig = mergeConfig;\n\naxios.AxiosHeaders = AxiosHeaders;\n\naxios.formToJSON = thing => formDataToJSON(utils.isHTMLForm(thing) ? new FormData(thing) : thing);\n\naxios.getAdapter = adapters.getAdapter;\n\naxios.HttpStatusCode = HttpStatusCode;\n\naxios.default = axios;\n\n// this module should only have a default export\nexport default axios\n","import axios from './lib/axios.js';\n\n// This module is intended to unwrap Axios default export as named.\n// Keep top-level export same with static properties\n// so that it can keep same with es module or cjs\nconst {\n Axios,\n AxiosError,\n CanceledError,\n isCancel,\n CancelToken,\n VERSION,\n all,\n Cancel,\n isAxiosError,\n spread,\n toFormData,\n AxiosHeaders,\n HttpStatusCode,\n formToJSON,\n getAdapter,\n mergeConfig\n} = axios;\n\nexport {\n axios as default,\n Axios,\n AxiosError,\n CanceledError,\n isCancel,\n CancelToken,\n VERSION,\n all,\n Cancel,\n isAxiosError,\n spread,\n toFormData,\n AxiosHeaders,\n HttpStatusCode,\n formToJSON,\n getAdapter,\n mergeConfig\n}\n","import React from 'react';\r\nimport { Avatar } from \"@heroui/react\";\r\nimport Submenu from \"../Submenu/Submenu\";\r\nimport type { SubmenuItem } from \"../Submenu/Submenu\";\r\nimport axios from \"axios\";\r\nimport type { UserData } from '../../types';\r\nimport './UserProfile.css';\r\n\r\n// 图标组件定义\r\nconst UserIcon = () => <span style={{ marginRight: 8, fontSize: '1.2em' }}>👤</span>;\r\nconst SettingsIcon = () => <span style={{ marginRight: 8, fontSize: '1.2em' }}>⚙️</span>;\r\nconst HelpIcon = () => <span style={{ marginRight: 8, fontSize: '1.2em' }}>❓</span>;\r\nconst LogoutIcon = () => <span style={{ marginRight: 8, fontSize: '1.2em' }}>🚪</span>;\r\n\r\n// API 配置类型\r\nexport interface ApiConfig {\r\n baseURL: string;\r\n endpoints: {\r\n userProfile: string;\r\n };\r\n headers?: Record<string, string>;\r\n}\r\n\r\n\r\n// 默认菜单项配置\r\nconst DEFAULT_MENU_ITEMS: SubmenuItem[] = [\r\n { id: 'profile', label: '个人主页', icon: <UserIcon /> },\r\n { id: 'settings', label: '设置', icon: <SettingsIcon /> },\r\n { id: 'help', label: '帮助', icon: <HelpIcon /> },\r\n { id: 'logout', label: '退出', icon: <LogoutIcon /> }\r\n];\r\n\r\nexport interface UserProfileProps {\r\n // 用户数据配置\r\n userId?: string;\r\n userName?: string;\r\n userAvatar?: string;\r\n \r\n // API 配置\r\n apiConfig?: ApiConfig;\r\n \r\n // 菜单配置\r\n menuItems?: SubmenuItem[];\r\n \r\n // 样式配置\r\n avatarSize?: 'sm' | 'md' | 'lg';\r\n avatarClassName?: string;\r\n userNameClassName?: string;\r\n containerClassName?: string;\r\n \r\n // 状态控制\r\n isLoading?: boolean;\r\n error?: Error | null;\r\n \r\n // 事件回调\r\n onMenuOpen?: () => void;\r\n onMenuClose?: () => void;\r\n onMenuItemClick?: (itemId: string) => void;\r\n onLogout?: () => void;\r\n \r\n // 定制化渲染\r\n renderMenuItem?: (item: SubmenuItem, userData: UserData) => React.ReactNode;\r\n renderUserInfo?: (userData: UserData) => React.ReactNode;\r\n}\r\n\r\nconst UserProfile: React.FC<UserProfileProps> = ({\r\n userId,\r\n userName: initialUserName,\r\n userAvatar: initialUserAvatar,\r\n apiConfig,\r\n menuItems = DEFAULT_MENU_ITEMS,\r\n avatarSize = 'md',\r\n isLoading = false,\r\n error = null,\r\n avatarClassName,\r\n userNameClassName,\r\n containerClassName,\r\n onMenuOpen,\r\n onMenuClose,\r\n onMenuItemClick,\r\n onLogout,\r\n renderMenuItem,\r\n renderUserInfo\r\n}) => {\r\n const [userData, setUserData] = React.useState<UserData>({\r\n id: userId || '',\r\n name: initialUserName || '',\r\n avatar: initialUserAvatar || '',\r\n level: 0,\r\n badges: []\r\n });\r\n \r\n const [loading, setLoading] = React.useState(isLoading);\r\n const [errorState, setErrorState] = React.useState<Error | null>(error);\r\n\r\n // 数据获取逻辑\r\n React.useEffect(() => {\r\n if (userId && apiConfig && !initialUserName && !initialUserAvatar) {\r\n fetchUserData();\r\n }\r\n }, [userId, apiConfig, initialUserName, initialUserAvatar]);\r\n\r\n const fetchUserData = async () => {\r\n setLoading(true);\r\n setErrorState(null);\r\n \r\n try {\r\n const endpoint = apiConfig!.endpoints.userProfile.replace(':userId', userId!);\r\n const response = await axios.get(`${apiConfig!.baseURL}${endpoint}`, {\r\n headers: apiConfig!.headers\r\n });\r\n \r\n setUserData(response.data);\r\n } catch (err) {\r\n setErrorState(err as Error);\r\n } finally {\r\n setLoading(false);\r\n }\r\n };\r\n\r\n // 处理菜单项点击\r\n const handleMenuItemClick = (item: SubmenuItem) => {\r\n onMenuItemClick?.(item.id as string);\r\n \r\n if (item.id === 'logout') {\r\n onLogout?.();\r\n }\r\n };\r\n\r\n // 处理菜单打开\r\n const handleMenuOpen = () => {\r\n onMenuOpen?.();\r\n };\r\n\r\n // 处理菜单关闭\r\n const handleMenuClose = () => {\r\n onMenuClose?.();\r\n };\r\n\r\n // 渲染用户信息区域\r\n const renderDefaultUserInfo = () => (\r\n <div className=\"user-profile-trigger\">\r\n <Avatar\r\n src={userData.avatar}\r\n size={avatarSize}\r\n className={avatarClassName}\r\n alt=\"用户头像\"\r\n />\r\n <span className={`user-name ${userNameClassName || ''}`}>\r\n {userData.name}\r\n </span>\r\n </div>\r\n );\r\n\r\n // 渲染默认菜单项\r\n const renderDefaultMenuItem = (item: SubmenuItem) => (\r\n <div\r\n key={item.id}\r\n className=\"submenu-item\"\r\n onClick={() => handleMenuItemClick(item)}\r\n >\r\n {item.icon && <span className=\"submenu-item-icon\">{item.icon}</span>}\r\n <span>{item.label}</span>\r\n </div>\r\n );\r\n\r\n if (loading) {\r\n return (\r\n <div className={`user-profile-container ${containerClassName || ''} is-loading`}>\r\n <div className=\"user-profile-loading\">加载中...</div>\r\n </div>\r\n );\r\n }\r\n\r\n if (errorState) {\r\n return (\r\n <div className={`user-profile-container ${containerClassName || ''} has-error`}>\r\n <div className=\"user-profile-error\">\r\n 错误: {errorState.message}\r\n </div>\r\n </div>\r\n );\r\n }\r\n\r\n if (!userData.name) {\r\n return (\r\n <div className={`user-profile-container ${containerClassName || ''}`}>\r\n <div className=\"user-profile-loading\">未登录</div>\r\n </div>\r\n );\r\n }\r\n\r\n return (\r\n <div className={`user-profile-container ${containerClassName || ''}`}>\r\n <Submenu\r\n trigger={renderUserInfo ? renderUserInfo(userData) : renderDefaultUserInfo()}\r\n items={menuItems.map(item => ({\r\n ...item,\r\n onClick: () => handleMenuItemClick(item)\r\n }))}\r\n position=\"bottom\"\r\n alignment=\"end\"\r\n onOpen={handleMenuOpen}\r\n onClose={handleMenuClose}\r\n renderItem={renderMenuItem ? (item) => renderMenuItem(item, userData) : undefined}\r\n />\r\n </div>\r\n );\r\n};\r\n\r\nexport default UserProfile;","import React from 'react';\r\nimport Submenu from '../Submenu/Submenu';\r\nimport UserProfile from '../UserProfile/UserProfile';\r\nimport type { SubmenuItem } from '../Submenu/Submenu';\r\nimport type { MathWizHeaderProps, ExploreItem } from './MathWizHeader.types';\r\nimport './MathWizHeader.css';\r\n\r\n// 默认探索菜单项渲染函数\r\nconst defaultRenderExploreItem = (item: ExploreItem) => (\r\n <div\r\n key={item.id}\r\n className=\"explore-menu-item\"\r\n onClick={() => item.onClick?.(item)}\r\n >\r\n <span className=\"explore-item-label\">{item.label}</span>\r\n {item.status && (\r\n <span className={`explore-item-status status-${item.status.toLowerCase().replace('%', '').replace(' ', '-')}`}>\r\n {item.status}\r\n </span>\r\n )}\r\n </div>\r\n);\r\n\r\n// 默认探索菜单触发器\r\nconst ExploreTrigger = () => (\r\n <button className=\"explore-button\" aria-label=\"探索数学课程\">\r\n <span className=\"explore-icon\">🌍</span>\r\n <span className=\"explore-text\">探索</span>\r\n </button>\r\n);\r\n\r\nconst MathWizHeader: React.FC<MathWizHeaderProps> = ({\r\n // 通用Props\r\n className = '',\r\n style,\r\n logoHref = '/',\r\n logoText = 'MathWiz',\r\n onLogoClick,\r\n\r\n // 探索菜单Props\r\n exploreItems = [],\r\n exploreMenuOpen = false,\r\n onExploreMenuToggle,\r\n onExploreItemClick,\r\n renderExploreItem = defaultRenderExploreItem,\r\n\r\n // 用户资料Props\r\n userData,\r\n userMenuItems,\r\n onUserMenuItemClick,\r\n onLogout,\r\n\r\n // 状态控制Props\r\n isLoading = false,\r\n error = null,\r\n\r\n // 样式定制Props\r\n headerClassName = '',\r\n logoClassName = '',\r\n exploreClassName = '',\r\n userProfileClassName = '',\r\n\r\n // 新增参数化样式Props\r\n variant = 'gradient',\r\n color,\r\n background,\r\n height,\r\n gradientFrom,\r\n gradientTo,\r\n gradientVia,\r\n logoColor,\r\n logoSize = 'md',\r\n exploreButtonVariant = 'flat',\r\n exploreButtonColor = 'primary',\r\n\r\n // 无障碍访问Props\r\n 'aria-label': ariaLabel,\r\n 'aria-labelledby': ariaLabelledBy,\r\n\r\n ...restProps\r\n}) => {\r\n // 准备探索菜单项数据 - 纯数据转换,无业务逻辑\r\n const preparedExploreItems: SubmenuItem[] = exploreItems.map(item => ({\r\n id: item.id,\r\n label: renderExploreItem(item),\r\n onClick: () => onExploreItemClick?.(item)\r\n }));\r\n\r\n // 构建动态类名\r\n const headerClassNames = [\r\n 'mathwiz-header',\r\n `mathwiz-header--${variant}`,\r\n color && `mathwiz-header--color-${color}`,\r\n headerClassName,\r\n className\r\n ].filter(Boolean).join(' ');\r\n\r\n const logoClassNames = [\r\n 'logo',\r\n `logo--${logoSize}`,\r\n logoClassName\r\n ].filter(Boolean).join(' ');\r\n\r\n const exploreButtonClassNames = [\r\n 'explore-button',\r\n `explore-button--${exploreButtonVariant}`,\r\n `explore-button--color-${exploreButtonColor}`,\r\n exploreClassName\r\n ].filter(Boolean).join(' ');\r\n\r\n // 构建内联样式\r\n const headerStyles: React.CSSProperties = {\r\n ...style,\r\n ...(height && { height: typeof height === 'number' ? `${height}px` : height }),\r\n ...(background && { '--custom-bg': background } as React.CSSProperties),\r\n ...(logoColor && { '--logo-color': logoColor } as React.CSSProperties),\r\n ...(gradientFrom && gradientTo && {\r\n '--header-bg': gradientVia\r\n ? `linear-gradient(to right, ${gradientFrom}, ${gradientVia}, ${gradientTo})`\r\n : `linear-gradient(to right, ${gradientFrom}, ${gradientTo})`\r\n } as React.CSSProperties)\r\n };\r\n\r\n return (\r\n <header\r\n className={headerClassNames}\r\n style={headerStyles}\r\n aria-label={ariaLabel}\r\n aria-labelledby={ariaLabelledBy}\r\n role=\"banner\"\r\n {...restProps}\r\n >\r\n <div className=\"header-content\">\r\n {/* 左侧:探索菜单 */}\r\n <div className=\"header-section left\">\r\n <Submenu\r\n trigger={<button className={exploreButtonClassNames} aria-label=\"探索数学课程\">\r\n <span className=\"explore-icon\">🌍</span>\r\n <span className=\"explore-text\">探索</span>\r\n </button>}\r\n items={preparedExploreItems}\r\n position=\"bottom\"\r\n alignment=\"start\"\r\n openDelay={300}\r\n closeDelay={100}\r\n onOpen={() => onExploreMenuToggle?.(true)}\r\n onClose={() => onExploreMenuToggle?.(false)}\r\n className=\"explore-submenu\"\r\n menuClassName=\"explore-panel\"\r\n />\r\n </div>\r\n\r\n {/* 中间:Logo */}\r\n <div className=\"header-section center\">\r\n <a\r\n href={logoHref}\r\n className={logoClassNames}\r\n onClick={onLogoClick}\r\n aria-label=\"MathWiz 首页\"\r\n >\r\n {logoText}\r\n </a>\r\n </div>\r\n\r\n {/* 右侧:用户资料 */}\r\n <div className=\"header-section right\">\r\n <UserProfile\r\n userName={userData?.name}\r\n userAvatar={userData?.avatar}\r\n menuItems={userMenuItems}\r\n onMenuItemClick={onUserMenuItemClick}\r\n onLogout={onLogout}\r\n containerClassName={userProfileClassName}\r\n isLoading={isLoading}\r\n error={error}\r\n />\r\n </div>\r\n </div>\r\n </header>\r\n );\r\n};\r\n\r\n// 使用 React.memo 优化性能,避免不必要的重渲染\r\nexport default React.memo(MathWizHeader, (prevProps, nextProps) => {\r\n // 自定义比较函数,只在相关props变化时重渲染\r\n return (\r\n prevProps.logoText === nextProps.logoText &&\r\n prevProps.logoHref === nextProps.logoHref &&\r\n prevProps.className === nextProps.className &&\r\n prevProps.headerClassName === nextProps.headerClassName &&\r\n prevProps.logoClassName === nextProps.logoClassName &&\r\n prevProps.exploreClassName === nextProps.exploreClassName &&\r\n prevProps.userProfileClassName === nextProps.userProfileClassName &&\r\n prevProps['aria-label'] === nextProps['aria-label'] &&\r\n prevProps['aria-labelledby'] === nextProps['aria-labelledby'] &&\r\n prevProps.isLoading === nextProps.isLoading &&\r\n prevProps.error === nextProps.error &&\r\n // 新增样式参数比较\r\n prevProps.variant === nextProps.variant &&\r\n prevProps.color === nextProps.color &&\r\n prevProps.background === nextProps.background &&\r\n prevProps.height === nextProps.height &&\r\n prevProps.gradientFrom === nextProps.gradientFrom &&\r\n prevProps.gradientTo === nextProps.gradientTo &&\r\n prevProps.gradientVia === nextProps.gradientVia &&\r\n prevProps.logoColor === nextProps.logoColor &&\r\n prevProps.logoSize === nextProps.logoSize &&\r\n prevProps.exploreButtonVariant === nextProps.exploreButtonVariant &&\r\n prevProps.exploreButtonColor === nextProps.exploreButtonColor &&\r\n // 深度比较数组\r\n JSON.stringify(prevProps.exploreItems) === JSON.stringify(nextProps.exploreItems) &&\r\n // 深度比较对象\r\n JSON.stringify(prevProps.userData) === JSON.stringify(nextProps.userData) &&\r\n JSON.stringify(prevProps.userMenuItems) === JSON.stringify(nextProps.userMenuItems)\r\n );\r\n});","import React from 'react';\r\nimport type { RadarChartProps } from '../../../types/radarAbility';\r\n\r\nconst RadarChart: React.FC<RadarChartProps> = ({ \r\n abilities, \r\n width = 400, \r\n height = 400 \r\n}) => {\r\n // 计算雷达图的数据点\r\n const calculateRadarPoints = () => {\r\n if (abilities.length === 0) return '';\r\n \r\n return abilities\r\n .map(ability => {\r\n // 使用预定义的SVG坐标点,如果没有则动态计算\r\n if (ability.svgPoint) {\r\n return `${ability.svgPoint.x},${ability.svgPoint.y}`;\r\n }\r\n \r\n // 动态计算坐标(基于能力和分数)\r\n const angle = (Math.PI * 2 * abilities.indexOf(ability)) / abilities.length;\r\n const radius = (ability.score / ability.maxScore) * 40 + 10; // 10-50范围\r\n const x = 50 + radius * Math.sin(angle);\r\n const y = 50 - radius * Math.cos(angle);\r\n \r\n return `${x},${y}`;\r\n })\r\n .join(' ');\r\n };\r\n\r\n // 计算轴线端点\r\n const calculateAxisEndPoints = (index: number) => {\r\n const angle = (Math.PI * 2 * index) / Math.max(abilities.length, 1);\r\n const x2 = 50 + 40 * Math.sin(angle);\r\n const y2 = 50 - 40 * Math.cos(angle);\r\n return { x2, y2 };\r\n };\r\n\r\n // 计算标签位置\r\n const calculateLabelPosition = (index: number) => {\r\n const angle = (Math.PI * 2 * index) / Math.max(abilities.length, 1);\r\n const x = 50 + 45 * Math.sin(angle);\r\n const y = 50 - 45 * Math.cos(angle);\r\n \r\n // 根据角度调整文本锚点\r\n let textAnchor = 'middle';\r\n if (angle > Math.PI * 0.25 && angle < Math.PI * 0.75) textAnchor = 'start';\r\n if (angle > Math.PI * 1.25 && angle < Math.PI * 1.75) textAnchor = 'end';\r\n \r\n return { x, y, textAnchor };\r\n };\r\n\r\n return (\r\n <svg \r\n data-testid=\"radar-chart\"\r\n width={width} \r\n height={height} \r\n viewBox=\"0 0 100 100\" \r\n className=\"w-full h-full\"\r\n preserveAspectRatio=\"xMidYMid meet\"\r\n >\r\n {/* 中心点 */}\r\n <circle \r\n data-testid=\"center-point\"\r\n cx=\"50\" \r\n cy=\"50\" \r\n r=\"1\" \r\n fill=\"#4A90E2\" \r\n />\r\n\r\n {/* 轴线 */}\r\n {abilities.map((_, index) => {\r\n const { x2, y2 } = calculateAxisEndPoints(index);\r\n return (\r\n <line\r\n key={`axis-${index}`}\r\n data-testid=\"axis-line\"\r\n x1=\"50\"\r\n y1=\"50\"\r\n x2={x2}\r\n y2={y2}\r\n stroke=\"#E2E8F0\"\r\n strokeWidth=\"0.5\"\r\n />\r\n );\r\n })}\r\n\r\n {/* 雷达多边形 */}\r\n {abilities.length > 2 && (\r\n <polygon\r\n data-testid=\"radar-polygon\"\r\n points={calculateRadarPoints()}\r\n fill=\"rgba(74, 144, 226, 0.2)\"\r\n stroke=\"rgb(74, 144, 226)\"\r\n strokeWidth=\"1\"\r\n fillRule=\"evenodd\"\r\n />\r\n )}\r\n\r\n {/* 数据点 */}\r\n {abilities.map((ability, index) => {\r\n let x, y;\r\n \r\n if (ability.svgPoint) {\r\n x = ability.svgPoint.x;\r\n y = ability.svgPoint.y;\r\n } else {\r\n const angle = (Math.PI * 2 * index) / abilities.length;\r\n const radius = (ability.score / ability.maxScore) * 40 + 10;\r\n x = 50 + radius * Math.sin(angle);\r\n y = 50 - radius * Math.cos(angle);\r\n }\r\n \r\n return (\r\n <circle\r\n key={`point-${ability.name}`}\r\n data-testid=\"data-point\"\r\n cx={x}\r\n cy={y}\r\n r=\"2\"\r\n fill={ability.progressBarColor === 'bg-orange-400' ? '#FBBF24' : '#4A90E2'}\r\n />\r\n );\r\n })}\r\n\r\n {/* 能力标签 */}\r\n {abilities.map((ability, index) => {\r\n const { x, y, textAnchor } = calculateLabelPosition(index);\r\n \r\n return (\r\n <text\r\n key={`label-${ability.name}`}\r\n x={x}\r\n y={y}\r\n textAnchor={textAnchor as any}\r\n fontSize=\"5\"\r\n fill=\"#334155\"\r\n className=\"text-xs\"\r\n >\r\n {ability.name}\r\n </text>\r\n );\r\n })}\r\n </svg>\r\n );\r\n};\r\n\r\nexport default RadarChart;","const createStoreImpl = (createState) => {\n let state;\n const listeners = /* @__PURE__ */ new Set();\n const setState = (partial, replace) => {\n const nextState = typeof partial === \"function\" ? partial(state) : partial;\n if (!Object.is(nextState, state)) {\n const previousState = state;\n state = (replace != null ? replace : typeof nextState !== \"object\" || nextState === null) ? nextState : Object.assign({}, state, nextState);\n listeners.forEach((listener) => listener(state, previousState));\n }\n };\n const getState = () => state;\n const getInitialState = () => initialState;\n const subscribe = (listener) => {\n listeners.add(listener);\n return () => listeners.delete(listener);\n };\n const api = { setState, getState, getInitialState, subscribe };\n const initialState = state = createState(setState, getState, api);\n return api;\n};\nconst createStore = ((createState) => createState ? createStoreImpl(createState) : createStoreImpl);\n\nexport { createStore };\n","import React from 'react';\nimport { createStore } from 'zustand/vanilla';\n\nconst identity = (arg) => arg;\nfunction useStore(api, selector = identity) {\n const slice = React.useSyncExternalStore(\n api.subscribe,\n React.useCallback(() => selector(api.getState()), [api, selector]),\n React.useCallback(() => selector(api.getInitialState()), [api, selector])\n );\n React.useDebugValue(slice);\n return slice;\n}\nconst createImpl = (createState) => {\n const api = createStore(createState);\n const useBoundStore = (selector) => useStore(api, selector);\n Object.assign(useBoundStore, api);\n return useBoundStore;\n};\nconst create = ((createState) => createState ? createImpl(createState) : createImpl);\n\nexport { create, useStore };\n","import axios from 'axios';\r\nimport type { RadarAbilityData } from '../types/radarAbility';\r\n\r\n// 模拟数据 - 在实际应用中会从API获取\r\nexport const mockRadarAbilityData: RadarAbilityData = {\r\n overallRating: '优秀',\r\n generalRecommendation: '你的空间想象力和逻辑推理能力非常出色!若能进一步提升在复杂图形下的专注力,你将所向披靡。建议尝试我们‘专注力挑战’系列游戏。',\r\n abilities: [\r\n {\r\n name: '空间想象力',\r\n score: 7.5,\r\n maxScore: 10,\r\n progressBarColor: 'bg-blue-500',\r\n svgPoint: { x: 50, y: 17.5 },\r\n recommendation: '通过观察三维物体在不同角度的投影,或尝试构建复杂结构的游戏,能有效提升空间想象力。',\r\n recommendationLink: '#spatial-challenges'\r\n },\r\n {\r\n name: '逻辑推理',\r\n score: 8.0,\r\n maxScore: 10,\r\n progressBarColor: 'bg-blue-500',\r\n svgPoint: { x: 82, y: 35 },\r\n recommendation: '解决数独、迷宫或逻辑谜题,能够持续锻炼你的逻辑思维,尝试挑战更高难度的推理游戏。',\r\n recommendationLink: '#logic-puzzles'\r\n },\r\n {\r\n name: '图形辨识',\r\n score: 9.0,\r\n maxScore: 10,\r\n progressBarColor: 'bg-blue-500',\r\n svgPoint: { x: 85, y: 65 },\r\n recommendation: '你在这方面表现出色!可以尝试在更复杂、干扰因素更多的图形中进行辨识训练,保持敏锐。',\r\n recommendationLink: '#graphic-training'\r\n },\r\n {\r\n name: '专注力',\r\n score: 7.0,\r\n maxScore: 10,\r\n progressBarColor: 'bg-orange-400',\r\n svgPoint: { x: 50, y: 80 },\r\n recommendation: '在长时间的游戏中保持专注对你来说是一个挑战,建议尝试我们‘专注力挑战’系列游戏,逐渐延长专注时间。',\r\n recommendationLink: '#focus-challenges'\r\n },\r\n {\r\n name: '观察力',\r\n score: 8.5,\r\n maxScore: 10,\r\n progressBarColor: 'bg-blue-500',\r\n svgPoint: { x: 15, y: 65 },\r\n recommendation: '你的观察力非常敏锐,在细节发现上尤为突出。尝试在限时模式下进行观察力训练,提高反应速度。',\r\n recommendationLink: '#observation-drills'\r\n },\r\n {\r\n name: '抗压性',\r\n score: 7.8,\r\n maxScore: 10,\r\n progressBarColor: 'bg-blue-500',\r\n svgPoint: { x: 18, y: 35 },\r\n recommendation: '面对高压挑战时,保持冷静是关键。通过模拟竞赛或限时任务来提升抗压能力,逐步适应压力。',\r\n recommendationLink: '#stress-games'\r\n }\r\n ]\r\n};\r\n\r\nexport class RadarAbilityService {\r\n private static readonly API_BASE_URL = '/api/radar-ability';\r\n\r\n static async fetchRadarAbilityData(): Promise<RadarAbilityData> {\r\n try {\r\n // 在测试环境中使用mock数据,避免真实API调用\r\n if (process.env.NODE_ENV === 'test') {\r\n // 测试环境使用mock数据\r\n await new Promise(resolve => setTimeout(resolve, 100));\r\n return mockRadarAbilityData;\r\n } else {\r\n // 开发和生产环境调用真实API\r\n const response = await axios.get<RadarAbilityData>(`${this.API_BASE_URL}/assessment`);\r\n return response.data;\r\n }\r\n } catch (error) {\r\n console.error('Failed to fetch radar ability data:', error);\r\n // 在测试环境中抛出错误以便测试错误处理\r\n if (process.env.NODE_ENV === 'test') {\r\n throw new Error('获取能力评估数据失败');\r\n }\r\n // 开发和生产环境返回mock数据作为fallback\r\n return mockRadarAbilityData;\r\n }\r\n }\r\n\r\n static async submitFeedback(feedback: {\r\n abilityName: string;\r\n rating: number;\r\n comment: string;\r\n }): Promise<void> {\r\n try {\r\n // 模拟API调用\r\n await axios.post(`${this.API_BASE_URL}/feedback`, feedback);\r\n } catch (error) {\r\n console.error('Failed to submit feedback:', error);\r\n throw new Error('提交反馈失败');\r\n }\r\n }\r\n}","import { create } from 'zustand';\r\nimport type { RadarAbilityData } from '../types/radarAbility';\r\nimport { RadarAbilityService } from '../services/radarAbilityService';\r\n\r\ninterface RadarAbilityState {\r\n data: RadarAbilityData | null;\r\n loading: boolean;\r\n error: string | null;\r\n fetchData: () => Promise<void>;\r\n setData: (data: RadarAbilityData) => void;\r\n setError: (error: string) => void;\r\n reset: () => void;\r\n}\r\n\r\nexport const useRadarAbilityStore = create<RadarAbilityState>((set, get) => ({\r\n data: null,\r\n loading: false,\r\n error: null,\r\n\r\n fetchData: async () => {\r\n // Don't fetch if already loading\r\n if (get().loading) return;\r\n\r\n set({ loading: true, error: null });\r\n\r\n try {\r\n const radarData = await RadarAbilityService.fetchRadarAbilityData();\r\n set({ data: radarData, loading: false });\r\n } catch (error) {\r\n const errorMessage = error instanceof Error ? error.message : '获取数据失败';\r\n set({ error: errorMessage, loading: false });\r\n }\r\n },\r\n\r\n setData: (data: RadarAbilityData) => {\r\n set({ data, error: null, loading: false });\r\n },\r\n\r\n setError: (error: string) => {\r\n set({ error, loading: false });\r\n },\r\n\r\n reset: () => {\r\n set({ data: null, loading: false, error: null });\r\n }\r\n}));","import React from 'react';\r\nimport type { AbilityProgressBarProps } from '../../../types/radarAbility';\r\n\r\nconst AbilityProgressBar: React.FC<AbilityProgressBarProps> = ({ ability }) => {\r\n const percentage = (ability.score / ability.maxScore) * 100;\r\n \r\n return (\r\n <div \r\n className=\"ability-progress-bar-item\" \r\n data-ability={ability.name}\r\n data-testid=\"progress-bar-container\"\r\n >\r\n <div className=\"flex justify-between text-sm mb-1\">\r\n <span className=\"text-gray-700 font-medium\">{ability.name}</span>\r\n <span className=\"text-gray-600\">\r\n {ability.score}/{ability.maxScore}\r\n </span>\r\n </div>\r\n \r\n <div \r\n className=\"w-full bg-gray-200 rounded-full h-2.5\"\r\n data-testid=\"progress-bar-outer\"\r\n >\r\n <div \r\n className={`${ability.progressBarColor} h-2.5 rounded-full transition-all duration-300`}\r\n style={{ width: `${percentage}%` }}\r\n data-testid=\"progress-bar-inner\"\r\n role=\"progressbar\"\r\n aria-valuenow={ability.score}\r\n aria-valuemin={0}\r\n aria-valuemax={ability.maxScore}\r\n aria-label={`${ability.name} progress: ${ability.score} out of ${ability.maxScore}`}\r\n />\r\n </div>\r\n </div>\r\n );\r\n};\r\n\r\nexport default AbilityProgressBar;","import React from 'react';\r\nimport type { PersonalizedAdvicePanelProps } from '../../../types/radarAbility';\r\n\r\nconst PersonalizedAdvicePanel: React.FC<PersonalizedAdvicePanelProps> = ({ \r\n generalRecommendation \r\n}) => {\r\n return (\r\n <div \r\n className=\"bg-blue-50 border border-blue-200 rounded-lg p-4\"\r\n data-testid=\"advice-panel\"\r\n role=\"region\"\r\n aria-label=\"个性化建议\"\r\n >\r\n <div className=\"flex items-start\">\r\n <div className=\"flex-shrink-0\">\r\n <i \r\n className=\"material-icons text-blue-500\"\r\n data-testid=\"lightbulb-icon\"\r\n aria-hidden=\"true\"\r\n >\r\n lightbulb\r\n </i>\r\n </div>\r\n \r\n <div className=\"ml-3\">\r\n <h3 \r\n className=\"text-md font-semibold text-blue-800\"\r\n aria-level={3}\r\n >\r\n 个性化建议\r\n </h3>\r\n \r\n <p \r\n className=\"text-sm text-blue-700 mt-1\"\r\n data-testid=\"recommendation-text\"\r\n >\r\n {generalRecommendation}\r\n </p>\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n};\r\n\r\nexport default PersonalizedAdvicePanel;","import React from 'react';\r\nimport { Card, CardBody, Button } from '@heroui/react';\r\nimport { ArrowRight } from 'lucide-react';\r\nimport type { RecommendationCardProps } from '../../../types/radarAbility';\r\n\r\nconst RecommendationCard: React.FC<RecommendationCardProps> = ({ ability, customLinkTexts = {} }) => {\r\n // 根据能力名称生成对应的链接文本,支持自定义映射\r\n const getLinkText = (abilityName: string) => {\r\n const defaultLinkTexts: Record<string, string> = {\r\n '空间想象力': '探索空间挑战',\r\n '逻辑推理': '深入逻辑谜题',\r\n '图形辨识': '精进图形训练',\r\n '专注力': '挑战专注极限',\r\n '观察力': '提升观察速度',\r\n '抗压性': '磨砺抗压意志'\r\n };\r\n \r\n // 优先使用自定义链接文本,如果没有则使用默认值\r\n return customLinkTexts[abilityName] || defaultLinkTexts[abilityName] || '开始挑战';\r\n };\r\n\r\n return (\r\n <Card \r\n className=\"recommendation-card w-full max-w-sm hover:shadow-lg transition-all duration-300\"\r\n data-ability={ability.name}\r\n data-testid=\"recommendation-card\"\r\n isHoverable\r\n isPressable\r\n >\r\n <CardBody className=\"p-5\">\r\n <div className=\"flex flex-col gap-3\">\r\n <h4 \r\n className=\"text-lg font-semibold text-foreground\"\r\n aria-level={4}\r\n >\r\n {ability.name}: 专项提高\r\n </h4>\r\n \r\n <p \r\n className=\"text-sm text-default-600 leading-relaxed\"\r\n data-testid=\"recommendation-description\"\r\n >\r\n {ability.recommendation}\r\n </p>\r\n \r\n <Button\r\n as=\"a\"\r\n href={ability.recommendationLink}\r\n className=\"mt-2 w-fit\"\r\n size=\"sm\"\r\n variant=\"flat\"\r\n color=\"primary\"\r\n endContent={<ArrowRight className=\"w-4 h-4\" />}\r\n data-testid=\"recommendation-link\"\r\n aria-label={`前往${ability.name}专项提高页面`}\r\n >\r\n {getLinkText(ability.name)}\r\n </Button>\r\n </div>\r\n </CardBody>\r\n </Card>\r\n );\r\n};\r\n\r\nexport default RecommendationCard;","import React, { useEffect } from 'react';\r\nimport { useRadarAbilityStore } from '../../../store/radarAbilityStore';\r\nimport RadarChart from '../RadarChart/RadarChart';\r\nimport AbilityProgressBar from '../AbilityProgressBar/AbilityProgressBar';\r\nimport PersonalizedAdvicePanel from '../PersonalizedAdvicePanel/PersonalizedAdvicePanel';\r\nimport RecommendationCard from '../RecommendationCard/RecommendationCard';\r\nimport styles from './AbilityAssessmentDashboard.module.css';\r\n\r\nconst AbilityAssessmentDashboard: React.FC = () => {\r\n const { data, loading, error, fetchData } = useRadarAbilityStore();\r\n\r\n useEffect(() => {\r\n fetchData();\r\n }, [fetchData]);\r\n\r\n if (loading) {\r\n return (\r\n <div \r\n className=\"card max-w-4xl mx-auto p-6 md:p-8 flex items-center justify-center\"\r\n data-testid=\"loading-spinner\"\r\n >\r\n <div className=\"animate-spin rounded-full h-12 w-12 border-b-2 border-blue-500\"></div>\r\n <span className=\"ml-3 text-gray-600\">加载中...</span>\r\n </div>\r\n );\r\n }\r\n\r\n if (error) {\r\n return (\r\n <div \r\n className=\"card max-w-4xl mx-auto p-6 md:p-8 text-center\"\r\n role=\"alert\"\r\n aria-live=\"assertive\"\r\n >\r\n <div className=\"text-red-500 mb-4\">\r\n <i \r\n className=\"material-icons text-4xl\"\r\n aria-hidden=\"true\"\r\n >\r\n error_outline\r\n </i>\r\n </div>\r\n <h3 className=\"text-lg font-semibold text-gray-800 mb-2\">加载失败</h3>\r\n <p className=\"text-gray-600 mb-4\">{error}</p>\r\n <button\r\n onClick={fetchData}\r\n className=\"bg-blue-500 hover:bg-blue-600 text-white px-4 py-2 rounded-lg transition-colors focus:outline-none focus:ring-2 focus:ring-blue-500 focus:ring-offset-2\"\r\n aria-label=\"重试加载数据\"\r\n >\r\n 重试\r\n </button>\r\n </div>\r\n );\r\n }\r\n\r\n if (!data) {\r\n return (\r\n <div \r\n className=\"card max-w-4xl mx-auto p-6 md:p-8 text-center\"\r\n role=\"status\"\r\n aria-live=\"polite\"\r\n >\r\n <p className=\"text-gray-600\">暂无数据</p>\r\n </div>\r\n );\r\n }\r\n\r\n return (\r\n <div \r\n className=\"card max-w-4xl mx-auto p-6 md:p-8 animate-fade-in\"\r\n data-component=\"AbilityAssessmentDashboard\"\r\n role=\"main\"\r\n aria-label=\"能力评估雷达图展示\"\r\n >\r\n {/* 头部标题和评级 */}\r\n <div className=\"flex justify-between items-center mb-6\">\r\n <h2 className=\"text-xl font-bold text-gray-800\">能力评估雷达图</h2>\r\n <span \r\n className=\"bg-blue-100 text-blue-800 text-sm font-semibold px-2.5 py-0.5 rounded-full\"\r\n aria-label={`综合评级: ${data.overallRating}`}\r\n >\r\n 综合评级: {data.overallRating}\r\n </span>\r\n </div>\r\n\r\n {/* 主要内容区域 - 上下布局 3:2 */}\r\n <div className={styles.dashboardLayout}>\r\n {/* 上部容器: 能力雷达展示视图 (3/5 高度) */}\r\n <div className={styles.upperSection}>\r\n {/* 左边: 雷达图 */}\r\n <div className={styles.radarChartArea}>\r\n <RadarChart abilities={data.abilities} />\r\n </div>\r\n\r\n {/* 右边: 进度条列表 */}\r\n <div className=\"space-y-4 flex flex-col justify-around py-2\">\r\n {data.abilities.map(ability => (\r\n <AbilityProgressBar \r\n key={ability.name} \r\n ability={ability} \r\n />\r\n ))}\r\n </div>\r\n </div>\r\n\r\n {/* 下部容器: 个性化推荐视图 (2/5 高度) */}\r\n <div className={styles.lowerSection}>\r\n {/* 通用个性化建议面板 */}\r\n <PersonalizedAdvicePanel \r\n generalRecommendation={data.generalRecommendation} \r\n />\r\n\r\n {/* 专项提升建议 */}\r\n <h3 className=\"text-lg font-bold text-gray-800 mb-4 mt-6\">\r\n 专项提升建议\r\n </h3>\r\n\r\n <div className=\"grid grid-cols-1 md:grid-cols-2 gap-4\">\r\n {data.abilities.map(ability => (\r\n <RecommendationCard \r\n key={ability.name} \r\n ability={ability} \r\n />\r\n ))}\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n};\r\n\r\nexport default AbilityAssessmentDashboard;","// 课程数据类型定义\r\nexport interface KnowledgeItem {\r\n id: string;\r\n title: string;\r\n description: string;\r\n progress: number;\r\n contentUrl: string;\r\n status?: 'mastered' | 'proficient' | 'familiar' | 'attempted' | 'not-started';\r\n}\r\n\r\nexport interface Lesson {\r\n id: string;\r\n title: string;\r\n duration: number;\r\n knowledgeItems: KnowledgeItem[];\r\n}\r\n\r\nexport interface Unit {\r\n id: string;\r\n title: string;\r\n description: string;\r\n estimatedDuration: string;\r\n totalLessons: number;\r\n moduleCategory: string;\r\n lessons: Lesson[];\r\n}\r\n\r\nexport interface CourseData {\r\n id: string;\r\n title: string;\r\n level: number;\r\n subject: string;\r\n units: Unit[];\r\n}\r\n\r\n// 用户数据类型\r\nexport interface UserData {\r\n id: string;\r\n name: string;\r\n level: number;\r\n avatar: string;\r\n badges: string[];\r\n}\r\n\r\n// 探索菜单项\r\nexport interface ExploreItem {\r\n id: string;\r\n label: string;\r\n status: string;\r\n}\r\n\r\n// 单元进度类型\r\nexport interface UnitProgress {\r\n unitId: string;\r\n title: string;\r\n progressPercentage: number;\r\n status: 'not-started' | 'in-progress' | 'completed';\r\n totalLessons: number;\r\n completedLessons: number;\r\n lastAccessed?: string;\r\n}\r\n\r\n// 状态管理类型\r\nexport interface AppState {\r\n currentUnitId: string | null;\r\n currentLessonId: string | null;\r\n currentKnowledgeId: string | null;\r\n sidebarCollapsed: boolean;\r\n exploreMenuOpen: boolean;\r\n activeLessonIds: string[];\r\n \r\n // Actions\r\n setCurrentUnit: (unitId: string) => void;\r\n setCurrentLesson: (lessonId: string) => void;\r\n setCurrentKnowledge: (knowledgeId: string) => void;\r\n toggleSidebar: () => void;\r\n toggleExploreMenu: (open?: boolean) => void;\r\n toggleLessonActive: (lessonId: string) => void;\r\n}\r\n\r\n// 图标映射\r\nexport const categoryIcons: Record<string, string> = {\r\n \"Arithmetic and Algebra\": \"🔢\",\r\n \"Graphics and Geometry\": \"📐\",\r\n \"Probability and Statistics\": \"📊\",\r\n \"Default\": \"📚\"\r\n};\r\n\r\n// 状态映射\r\nexport const statusMapping: Record<string, string> = {\r\n 'mastered': '已掌握',\r\n 'proficient': '熟练',\r\n 'familiar': '熟悉',\r\n 'attempted': '已尝试',\r\n 'not-started': '未开始'\r\n};\r\n\r\nexport const statusColors: Record<string, string> = {\r\n 'mastered': '#10b981',\r\n 'proficient': '#3b82f6',\r\n 'familiar': '#f59e0b',\r\n 'attempted': '#8b5cf6',\r\n 'not-started': '#6b7280'\r\n};","// 单一数据源 - 所有模拟数据集中管理\r\n// 这是整个应用的唯一mock数据来源,确保数据一致性\r\n\r\nexport const MOCK_USER_DATA = {\r\n id: 'user-001',\r\n name: '小明',\r\n level: 5,\r\n avatar: 'https://i.pravatar.cc/40?u=student1',\r\n logIn: true,\r\n badges: ['🏆', '🏅', '🌟']\r\n};\r\n\r\nexport const MOCK_EXPLORE_ITEMS = [\r\n { id: 'g3', label: '三年级', status: 'new', onClick: () => console.log('三年级 clicked') },\r\n { id: 'g4', label: '四年级', status: '2%', onClick: () => console.log('四年级 clicked') },\r\n { id: 'g5', label: '五年级', status: '进行中', onClick: () => console.log('五年级 clicked') },\r\n { id: 'g6', label: '六年级', status: 'new', onClick: () => console.log('六年级 clicked') },\r\n { id: 'g7', label: '七年级', status: 'new', onClick: () => console.log('七年级 clicked') },\r\n { id: 'g8', label: '八年级', status: 'new', onClick: () => console.log('八年级 clicked') },\r\n { id: 'alg_topic', label: '代数专题', status: 'new', onClick: () => console.log('代数专题 clicked') },\r\n { id: 'calc_topic', label: '计算专题', status: 'new', onClick: () => console.log('计算专题 clicked') },\r\n { id: 'geo_topic', label: '几何专题', status: 'new', onClick: () => console.log('几何专题 clicked') },\r\n { id: 'olym_topic', label: '奥数专题', status: 'new', onClick: () => console.log('奥数专题 clicked') }\r\n];\r\n\r\n// JWT token (API专用)\r\nexport const MOCK_JWT_TOKEN = \"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOiJ1c2VyLTAwMSIsIm5hbWUiOiLlsI_mmI4iLCJsZXZlbCI6NSwiYXZhdGFyIjoiaHR0cHM6Ly9pLnByYXZhdGFyLmNjLzQwP3U9c3R1ZGVudDEiLCJiYWRnZXMiOlsi8J-SoiIsIvCfjZUiLCLwn5KbIl0sImlhdCI6MTY5MTYwMDAwMCwiZXhwIjoxNzIzMTM2MDAwfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c\";","import type { CourseData } from '../types';\r\n\r\nexport const courseData: CourseData = {\r\n \"id\": \"g5\",\r\n \"title\": \"小学数学五年级\",\r\n \"level\": 5,\r\n \"subject\": \"数学\",\r\n \"units\": [\r\n {\r\n \"id\": \"unit_1\",\r\n \"title\": \"小数乘法\",\r\n \"description\": \"学习小数乘法的计算方法及应用\",\r\n \"estimatedDuration\": \"3周\",\r\n \"totalLessons\": 10,\r\n \"moduleCategory\": \"Arithmetic and Algebra\",\r\n \"lessons\": [\r\n { \"id\": \"unit1_lesson1\", \"title\": \"小数乘整数\", \"duration\": 40, \"knowledgeItems\": [ { \"id\": \"unit1_lesson1_k1\", \"title\": \"小数乘整数的意义\", \"description\": \"理解小数乘整数的意义与整数乘法相同\", \"progress\": 0, \"contentUrl\": \"\" }, { \"id\": \"unit1_lesson1_k2\", \"title\": \"小数乘整数的计算方法\", \"description\": \"掌握小数乘整数的计算方法:先按整数乘法计算,再看因数中有几位小数,就从积的右边起数出几位点上小数点\", \"progress\": 0, \"contentUrl\": \"\" } ] },\r\n { \"id\": \"unit1_lesson2\", \"title\": \"小数乘小数\", \"duration\": 40, \"knowledgeItems\": [ { \"id\": \"unit1_lesson2_k1\", \"title\": \"小数乘小数的计算方法\", \"description\": \"掌握小数乘小数的计算方法:先按整数乘法算出积,再给积点上小数点\", \"progress\": 0, \"contentUrl\": \"\" }, { \"id\": \"unit1_lesson2_k2\", \"title\": \"积的小数位数确定\", \"description\": \"理解积的小数位数等于两个因数的小数位数之和\", \"progress\": 0, \"contentUrl\": \"\" } ] },\r\n { \"id\": \"unit1_lesson3\", \"title\": \"积的近似数\", \"duration\": 40, \"knowledgeItems\": [ { \"id\": \"unit1_lesson3_k1\", \"title\": \"用\\\"四舍五入\\\"法求积的近似数\", \"description\": \"掌握用\\\"四舍五入\\\"法求积的近似数的方法\", \"progress\": 0, \"contentUrl\": \"\" } ] },\r\n { \"id\": \"unit1_lesson4\", \"title\": \"整数乘法运算定律推广到小数\", \"duration\": 40, \"knowledgeItems\": [ { \"id\": \"unit1_lesson4_k1\", \"title\": \"乘法运算定律在小数中的适用性\", \"description\": \"理解整数乘法运算定律对于小数乘法同样适用\", \"progress\": 0, \"contentUrl\": \"\" }, { \"id\": \"unit1_lesson4_k2\", \"title\": \"运用运算定律进行简便计算\", \"description\": \"能运用乘法运算定律进行小数乘法的简便计算\", \"progress\": 0, \"contentUrl\": \"\" } ] },\r\n { \"id\": \"unit1_lesson5\", \"title\": \"解决问题\", \"duration\": 40, \"knowledgeItems\": [ { \"id\": \"unit1_lesson5_k1\", \"title\": \"用小数乘法解决实际问题\", \"description\": \"能运用小数乘法解决购物、面积计算等实际问题\", \"progress\": 0, \"contentUrl\": \"\" } ] }\r\n ]\r\n },\r\n {\r\n \"id\": \"unit_2\", \"title\": \"小数除法\", \"description\": \"学习小数除法的计算方法及应用\", \"estimatedDuration\": \"3周\", \"totalLessons\": 12, \"moduleCategory\": \"Arithmetic and Algebra\",\r\n \"lessons\": [\r\n { \"id\": \"unit2_lesson1\", \"title\": \"小数除以整数\", \"duration\": 40, \"knowledgeItems\": [ { \"id\": \"unit2_lesson1_k1\", \"title\": \"小数除以整数的计算方法\", \"description\": \"掌握小数除以整数的计算方法:按照整数除法的方法计算,商的小数点要与被除数的小数点对齐\", \"progress\": 0, \"contentUrl\": \"\" } ] },\r\n { \"id\": \"unit2_lesson2\", \"title\": \"一个数除以小数\", \"duration\": 40, \"knowledgeItems\": [ { \"id\": \"unit2_lesson2_k1\", \"title\": \"除数是小数的除法计算方法\", \"description\": \"掌握除数是小数的除法计算方法:利用商不变的性质,将除数转化为整数\", \"progress\": 0, \"contentUrl\": \"\" } ] },\r\n { \"id\": \"unit2_lesson3\", \"title\": \"商的近似数\", \"duration\": 40, \"knowledgeItems\": [ { \"id\": \"unit2_lesson3_k1\", \"title\": \"用\\\"四舍五入\\\"法求商的近似数\", \"description\": \"掌握用\\\"四舍五入\\\"法求商的近似数的方法\", \"progress\": 0, \"contentUrl\": \"\" } ] },\r\n { \"id\": \"unit2_lesson4\", \"title\": \"循环小数\", \"duration\": 40, \"knowledgeItems\": [ { \"id\": \"unit2_lesson4_k1\", \"title\": \"循环小数的概念\", \"description\": \"理解循环小数的概念,认识循环节\", \"progress\": 0, \"contentUrl\": \"\" }, { \"id\": \"unit2_lesson4_k2\", \"title\": \"循环小数的表示方法\", \"description\": \"掌握循环小数的简便表示方法\", \"progress\": 0, \"contentUrl\": \"\" } ] },\r\n { \"id\": \"unit2_lesson5\", \"title\": \"用计算器探索规律\", \"duration\": 40, \"knowledgeItems\": [ { \"id\": \"unit2_lesson5_k1\", \"title\": \"用计算器计算小数除法\", \"description\": \"会用计算器计算较复杂的小数除法\", \"progress\": 0, \"contentUrl\": \"\" }, { \"id\": \"unit2_lesson5_k2\", \"title\": \"发现商的变化规律\", \"description\": \"能借助计算器发现商的变化规律\", \"progress\": 0, \"contentUrl\": \"\" } ] },\r\n { \"id\": \"unit2_lesson6\", \"title\": \"解决问题\", \"duration\": 40, \"knowledgeItems\": [ { \"id\": \"unit2_lesson6_k1\", \"title\": \"用小数除法解决实际问题\", \"description\": \"能运用小数除法解决购物、分配等实际问题\", \"progress\": 0, \"contentUrl\": \"\" } ] }\r\n ]\r\n },\r\n {\r\n \"id\": \"unit_3\", \"title\": \"简易方程\", \"description\": \"学习用字母表示数和解简易方程\", \"estimatedDuration\": \"4周\", \"totalLessons\": 14, \"moduleCategory\": \"Arithmetic and Algebra\",\r\n \"lessons\": [\r\n { \"id\": \"unit3_lesson1\", \"title\": \"用字母表示数\", \"duration\": 40, \"knowledgeItems\": [ { \"id\": \"unit3_lesson1_k1\", \"title\": \"用字母表示数\", \"description\": \"初步理解用字母表示数的意义和作用\", \"progress\": 0, \"contentUrl\": \"\" }, { \"id\": \"unit3_lesson1_k2\", \"title\": \"用字母表示运算定律和计算公式\", \"description\": \"会用字母表示运算定律和计算公式\", \"progress\": 0, \"contentUrl\": \"\" } ] },\r\n { \"id\": \"unit3_lesson2\", \"title\": \"方程的意义\", \"duration\": 40, \"knowledgeItems\": [ { \"id\": \"unit3_lesson2_k1\", \"title\": \"方程的概念\", \"description\": \"理解方程的意义,知道方程与等式的区别和联系\", \"progress\": 0, \"contentUrl\": \"\" } ] },\r\n { \"id\": \"unit3_lesson3\", \"title\": \"等式的性质\", \"duration\": 40, \"knowledgeItems\": [ { \"id\": \"unit3_lesson3_k1\", \"title\": \"等式的性质1\", \"description\": \"理解等式的性质1:等式两边加上或减去同一个数,左右两边仍然相等\", \"progress\": 0, \"contentUrl\": \"\" }, { \"id\": \"unit3_lesson3_k2\", \"title\": \"等式的性质2\", \"description\": \"理解等式的性质2:等式两边乘同一个数,或除以同一个不为0的数,左右两边仍然相等\", \"progress\": 0, \"contentUrl\": \"\" } ] },\r\n { \"id\": \"unit3_lesson4\", \"title\": \"解简易方程\", \"duration\": 40, \"knowledgeItems\": [ { \"id\": \"unit3_lesson4_k1\", \"title\": \"利用等式的性质解方程\", \"description\": \"会利用等式的性质解形如x±a=b、ax=b、x÷a=b、a-x=b、a÷x=b的方程\", \"progress\": 0, \"contentUrl\": \"\" } ] },\r\n { \"id\": \"unit3_lesson5\", \"title\": \"实际问题与方程\", \"duration\": 40, \"knowledgeItems\": [ { \"id\": \"unit3_lesson5_k1\", \"title\": \"列方程解决实际问题\", \"description\": \"初步学会列方程解决一些简单的实际问题\", \"progress\": 0, \"contentUrl\": \"\" } ] }\r\n ]\r\n },\r\n {\r\n \"id\": \"unit_4\", \"title\": \"多边形的面积\", \"description\": \"学习平行四边形、三角形、梯形和组合图形的面积计算\", \"estimatedDuration\": \"3周\", \"totalLessons\": 12, \"moduleCategory\": \"Graphics and Geometry\",\r\n \"lessons\": [\r\n { \"id\": \"unit4_lesson1\", \"title\": \"平行四边形的面积\", \"duration\": 40, \"knowledgeItems\": [ { \"id\": \"unit4_lesson1_k1\", \"title\": \"平行四边形面积公式的推导\", \"description\": \"通过割补法理解平行四边形面积公式的推导过程\", \"progress\": 0, \"contentUrl\": \"\" }, { \"id\": \"unit4_lesson1_k2\", \"title\": \"平行四边形面积的计算\", \"description\": \"掌握平行四边形面积计算公式:S=ah,并能正确运用\", \"progress\": 0, \"contentUrl\": \"\" } ] },\r\n { \"id\": \"unit4_lesson2\", \"title\": \"三角形的面积\", \"duration\": 40, \"knowledgeItems\": [ { \"id\": \"unit4_lesson2_k1\", \"title\": \"三角形面积公式的推导\", \"description\": \"通过拼摆法理解三角形面积公式的推导过程\", \"progress\": 0, \"contentUrl\": \"\" }, { \"id\": \"unit4_lesson2_k2\", \"title\": \"三角形面积的计算\", \"description\": \"掌握三角形面积计算公式:S=ah÷2,并能正确运用\", \"progress\": 0, \"contentUrl\": \"\" } ] },\r\n { \"id\": \"unit4_lesson3\", \"title\": \"梯形的面积\", \"duration\": 40, \"knowledgeItems\": [ { \"id\": \"unit4_lesson3_k1\", \"title\": \"梯形面积公式的推导\", \"description\": \"通过拼摆法理解梯形面积公式的推导过程\", \"progress\": 0, \"contentUrl\": \"\" }, { \"id\": \"unit4_lesson3_k2\", \"title\": \"梯形面积的计算\", \"description\": \"掌握梯形面积计算公式:S=(a+b)h÷2,并能正确运用\", \"progress\": 0, \"contentUrl\": \"\" } ] },\r\n { \"id\": \"unit4_lesson4\", \"title\": \"组合图形的面积\", \"duration\": 40, \"knowledgeItems\": [ { \"id\": \"unit4_lesson4_k1\", \"title\": \"认识组合图形\", \"description\": \"认识组合图形,会把组合图形分解成已学过的平面图形\", \"progress\": 0, \"contentUrl\": \"\" }, { \"id\": \"unit4_lesson4_k2\", \"title\": \"计算组合图形的面积\", \"description\": \"掌握计算组合图形面积的多种方法\", \"progress\": 0, \"contentUrl\": \"\" } ] }\r\n ]\r\n },\r\n {\r\n \"id\": \"unit_5\", \"title\": \"因数与倍数\", \"description\": \"学习因数、倍数、质数、合数等概念\", \"estimatedDuration\": \"3周\", \"totalLessons\": 10, \"moduleCategory\": \"Arithmetic and Algebra\",\r\n \"lessons\": [\r\n { \"id\": \"unit5_lesson1\", \"title\": \"因数和倍数\", \"duration\": 40, \"knowledgeItems\": [ { \"id\": \"unit5_lesson1_k1\", \"title\": \"因数和倍数的意义\", \"description\": \"理解因数和倍数的意义,掌握找一个数的因数和倍数的方法\", \"progress\": 0, \"contentUrl\": \"\" }, { \"id\": \"unit5_lesson1_k2\", \"title\": \"因数和倍数的特征\", \"description\": \"了解一个数的因数的个数是有限的,倍数的个数是无限的\", \"progress\": 0, \"contentUrl\": \"\" } ] },\r\n { \"id\": \"unit5_lesson2\", \"title\": \"2、5、3的倍数的特征\", \"duration\": 40, \"knowledgeItems\": [ { \"id\": \"unit5_lesson2_k1\", \"title\": \"2、5的倍数的特征\", \"description\": \"掌握2、5的倍数的特征,理解奇数和偶数的意义\", \"progress\": 0, \"contentUrl\": \"\" }, { \"id\": \"unit5_lesson2_k2\", \"title\": \"3的倍数的特征\", \"description\": \"掌握3的倍数的特征,能判断一个数是不是3的倍数\", \"progress\": 0, \"contentUrl\": \"\" } ] },\r\n { \"id\": \"unit5_lesson3\", \"title\": \"质数和合数\", \"duration\": 40, \"knowledgeItems\": [ { \"id\": \"unit5_lesson3_k1\", \"title\": \"质数和合数的意义\", \"description\": \"理解质数和合数的意义,能判断一个数是质数还是合数\", \"progress\": 0, \"contentUrl\": \"\" }, { \"id\": \"unit5_lesson3_k2\", \"title\": \"制作100以内的质数表\", \"description\": \"会制作100以内的质数表,熟记20以内的质数\", \"progress\": 0, \"contentUrl\": \"\" } ] }\r\n ]\r\n },\r\n {\r\n \"id\": \"unit_6\", \"title\": \"长方体和正方体\", \"description\": \"学习长方体和正方体的特征、表面积和体积计算\", \"estimatedDuration\": \"4周\", \"totalLessons\": 14, \"moduleCategory\": \"Graphics and Geometry\",\r\n \"lessons\": [\r\n { \"id\": \"unit6_lesson1\", \"title\": \"长方体和正方体的认识\", \"duration\": 40, \"knowledgeItems\": [ { \"id\": \"unit6_lesson1_k1\", \"title\": \"长方体的特征\", \"description\": \"认识长方体的特征,了解长方体的长、宽、高\", \"progress\": 0, \"contentUrl\": \"\" }, { \"id\": \"unit6_lesson1_k2\", \"title\": \"正方体的特征\", \"description\": \"认识正方体的特征,理解正方体是特殊的长方体\", \"progress\": 0, \"contentUrl\": \"\" } ] },\r\n { \"id\": \"unit6_lesson2\", \"title\": \"长方体和正方体的表面积\", \"duration\": 40, \"knowledgeItems\": [ { \"id\": \"unit6_lesson2_k1\", \"title\": \"表面积的意义\", \"description\": \"理解表面积的意义,掌握长方体和正方体表面积的计算方法\", \"progress\": 0, \"contentUrl\": \"\" }, { \"id\": \"unit6_lesson2_k2\", \"title\": \"表面积的实际应用\", \"description\": \"能运用表面积知识解决一些实际问题\", \"progress\": 0, \"contentUrl\": \"\" } ] },\r\n { \"id\": \"unit6_lesson3\", \"title\": \"长方体和正方体的体积\", \"duration\": 40, \"knowledgeItems\": [ { \"id\": \"unit6_lesson3_k1\", \"title\": \"体积和体积单位\", \"description\": \"理解体积的意义,认识常用的体积单位\", \"progress\": 0, \"contentUrl\": \"\" }, { \"id\": \"unit6_lesson3_k2\", \"title\": \"长方体和正方体体积的计算\", \"description\": \"掌握长方体和正方体体积的计算公式\", \"progress\": 0, \"contentUrl\": \"\" }, { \"id\": \"unit6_lesson3_k3\", \"title\": \"体积单位间的进率\", \"description\": \"掌握体积单位之间的进率和换算\", \"progress\": 0, \"contentUrl\": \"\" } ] },\r\n { \"id\": \"unit6_lesson4\", \"title\": \"容积和容积单位\", \"duration\": 40, \"knowledgeItems\": [ { \"id\": \"unit6_lesson4_k1\", \"title\": \"容积和容积单位\", \"description\": \"理解容积的意义,认识常用的容积单位\", \"progress\": 0, \"contentUrl\": \"\" }, { \"id\": \"unit6_lesson4_k2\", \"title\": \"容积和体积的关系\", \"description\": \"掌握容积和体积之间的关系\", \"progress\": 0, \"contentUrl\": \"\" } ] }\r\n ]\r\n },\r\n {\r\n \"id\": \"unit_7\", \"title\": \"分数的意义和性质\", \"description\": \"学习分数的意义、性质和约分、通分等方法\", \"estimatedDuration\": \"4周\", \"totalLessons\": 16, \"moduleCategory\": \"Arithmetic and Algebra\",\r\n \"lessons\": [\r\n { \"id\": \"unit7_lesson1\", \"title\": \"分数的意义\", \"duration\": 40, \"knowledgeItems\": [ { \"id\": \"unit7_lesson1_k1\", \"title\": \"分数的产生和意义\", \"description\": \"理解分数的产生和意义,明确分数与除法的关系\", \"progress\": 0, \"contentUrl\": \"\" }, { \"id\": \"unit7_lesson1_k2\", \"title\": \"分数单位\", \"description\": \"认识分数单位,能说出一个分数中有几个这样的分数单位\", \"progress\": 0, \"contentUrl\": \"\" } ] },\r\n { \"id\": \"unit7_lesson2\", \"title\": \"分数与除法\", \"duration\": 40, \"knowledgeItems\": [ { \"id\": \"unit7_lesson2_k1\", \"title\": \"分数与除法的关系\", \"description\": \"理解分数与除法的关系,会用分数表示两个数相除的商\", \"progress\": 0, \"contentUrl\": \"\" } ] },\r\n { \"id\": \"unit7_lesson3\", \"title\": \"真分数和假分数\", \"duration\": 40, \"knowledgeItems\": [ { \"id\": \"unit7_lesson3_k1\", \"title\": \"真分数和假分数的意义\", \"description\": \"理解真分数和假分数的意义和特征\", \"progress\": 0, \"contentUrl\": \"\" }, { \"id\": \"unit7_lesson3_k2\", \"title\": \"带分数\", \"description\": \"认识带分数,会进行假分数与整数、带分数的互化\", \"progress\": 0, \"contentUrl\": \"\" } ] },\r\n { \"id\": \"unit7_lesson4\", \"title\": \"分数的基本性质\", \"duration\": 40, \"knowledgeItems\": [ { \"id\": \"unit7_lesson4_k1\", \"title\": \"分数的基本性质\", \"description\": \"理解分数的基本性质,能运用分数的基本性质进行分数的变形\", \"progress\": 0, \"contentUrl\": \"\" } ] },\r\n { \"id\": \"unit7_lesson5\", \"title\": \"约分\", \"duration\": 40, \"knowledgeItems\": [ { \"id\": \"unit7_lesson5_k1\", \"title\": \"最大公因数\", \"description\": \"理解公因数和最大公因数的意义,掌握求两个数的最大公因数的方法\", \"progress\": 0, \"contentUrl\": \"\" }, { \"id\": \"unit7_lesson5_k2\", \"title\": \"约分的方法\", \"description\": \"掌握约分的方法,能正确地进行约分\", \"progress\": 0, \"contentUrl\": \"\" } ] },\r\n { \"id\": \"unit7_lesson6\", \"title\": \"通分\", \"duration\": 40, \"knowledgeItems\": [ { \"id\": \"unit7_lesson6_k1\", \"title\": \"最小公倍数\", \"description\": \"理解公倍数和最小公倍数的意义,掌握求两个数的最小公倍数的方法\", \"progress\": 0, \"contentUrl\": \"\" }, { \"id\": \"unit7_lesson6_k2\", \"title\": \"通分的方法\", \"description\": \"掌握通分的方法,能正确地进行通分\", \"progress\": 0, \"contentUrl\": \"\" } ] },\r\n { \"id\": \"unit7_lesson7\", \"title\": \"分数和小数的互化\", \"duration\": 40, \"knowledgeItems\": [ { \"id\": \"unit7_lesson7_k1\", \"title\": \"分数化成小数\", \"description\": \"掌握分数化成小数的方法\", \"progress\": 0, \"contentUrl\": \"\" }, { \"id\": \"unit7_lesson7_k2\", \"title\": \"小数化成分数\", \"description\": \"掌握小数化成分数的方法\", \"progress\": 0, \"contentUrl\": \"\" } ] }\r\n ]\r\n },\r\n {\r\n \"id\": \"unit_8\", \"title\": \"分数的加法和减法\", \"description\": \"学习同分母分数、异分母分数的加法和减法\", \"estimatedDuration\": \"3周\", \"totalLessons\": 12, \"moduleCategory\": \"Arithmetic and Algebra\",\r\n \"lessons\": [\r\n { \"id\": \"unit8_lesson1\", \"title\": \"同分母分数加、减法\", \"duration\": 40, \"knowledgeItems\": [ { \"id\": \"unit8_lesson1_k1\", \"title\": \"同分母分数加法的计算方法\", \"description\": \"掌握同分母分数加法的计算方法\", \"progress\": 0, \"contentUrl\": \"\" }, { \"id\": \"unit8_lesson1_k2\", \"title\": \"同分母分数减法的计算方法\", \"description\": \"掌握同分母分数减法的计算方法\", \"progress\": 0, \"contentUrl\": \"\" } ] },\r\n { \"id\": \"unit8_lesson2\", \"title\": \"异分母分数加、减法\", \"duration\": 40, \"knowledgeItems\": [ { \"id\": \"unit8_lesson2_k1\", \"title\": \"异分母分数加法的计算方法\", \"description\": \"掌握异分母分数加法的计算方法:先通分,然后按照同分母分数加法进行计算\", \"progress\": 0, \"contentUrl\": \"\" }, { \"id\": \"unit8_lesson2_k2\", \"title\": \"异分母分数减法的计算方法\", \"description\": \"掌握异分母分数减法的计算方法:先通分,然后按照同分母分数减法进行计算\", \"progress\": 0, \"contentUrl\": \"\" } ] },\r\n { \"id\": \"unit8_lesson3\", \"title\": \"分数加减混合运算\", \"duration\": 40, \"knowledgeItems\": [ { \"id\": \"unit8_lesson3_k1\", \"title\": \"分数加减混合运算的顺序\", \"description\": \"掌握分数加减混合运算的运算顺序\", \"progress\": 0, \"contentUrl\": \"\" }, { \"id\": \"unit8_lesson3_k2\", \"title\": \"整数加法运算定律推广到分数加法\", \"description\": \"理解整数加法运算定律对于分数加法同样适用,能运用运算定律进行简便计算\", \"progress\": 0, \"contentUrl\": \"\" } ] }\r\n ]\r\n },\r\n {\r\n \"id\": \"unit_9\", \"title\": \"折线统计图\", \"description\": \"学习单式折线统计图和复式折线统计图的认识和制作\", \"estimatedDuration\": \"2周\", \"totalLessons\": 6, \"moduleCategory\": \"Probability and Statistics\",\r\n \"lessons\": [\r\n { \"id\": \"unit9_lesson1\", \"title\": \"单式折线统计图\", \"duration\": 40, \"knowledgeItems\": [ { \"id\": \"unit9_lesson1_k1\", \"title\": \"单式折线统计图的特点\", \"description\": \"认识单式折线统计图,了解其特点和作用\", \"progress\": 0, \"contentUrl\": \"\" }, { \"id\": \"unit9_lesson1_k2\", \"title\": \"绘制单式折线统计图\", \"description\": \"能根据数据绘制单式折线统计图\", \"progress\": 0, \"contentUrl\": \"\" } ] },\r\n { \"id\": \"unit9_lesson2\", \"title\": \"复式折线统计图\", \"duration\": 40, \"knowledgeItems\": [ { \"id\": \"unit9_lesson2_k1\", \"title\": \"复式折线统计图的特点\", \"description\": \"认识复式折线统计图,了解其特点和作用\", \"progress\": 0, \"contentUrl\": \"\" }, { \"id\": \"unit9_lesson2_k2\", \"title\": \"绘制复式折线统计图\", \"description\": \"能根据数据绘制复式折线统计图\", \"progress\": 0, \"contentUrl\": \"\" } ] },\r\n { \"id\": \"unit9_lesson3\", \"title\": \"数据分析\", \"duration\": 40, \"knowledgeItems\": [ { \"id\": \"unit9_lesson3_k1\", \"title\": \"根据统计图进行数据分析\", \"description\": \"能根据折线统计图进行简单的数据分析,作出合理的判断和预测\", \"progress\": 0, \"contentUrl\": \"\" } ] }\r\n ]\r\n }\r\n ]\r\n};\r\n\r\nimport { MOCK_USER_DATA, MOCK_EXPLORE_ITEMS } from './mockData';\r\n\r\n// 从单一数据源导入,确保数据一致性\r\nexport const exploreItems = MOCK_EXPLORE_ITEMS;\r\nexport const userData = MOCK_USER_DATA;","import type { CourseData, UnitProgress } from '../types';\r\nimport { MOCK_JWT_TOKEN } from '../data/mockData';\r\n\r\nexport interface UserGradeUnitsNav {\r\n userId: string;\r\n courseId: string;\r\n courseTitle: string;\r\n courseLevel: number;\r\n totalUnits: number;\r\n completedUnits: number;\r\n overallProgress: number;\r\n status: 'not-started' | 'in-progress' | 'completed';\r\n lastAccessed?: string;\r\n units: Array<{\r\n unitId: string;\r\n title: string;\r\n description: string;\r\n moduleCategory: string;\r\n estimatedDuration: string;\r\n totalLessons: number;\r\n completedLessons: number;\r\n progressPercentage: number;\r\n status: 'not-started' | 'in-progress' | 'completed';\r\n lastAccessed?: string;\r\n isActive: boolean;\r\n route: string;\r\n }>;\r\n}\r\n\r\nexport interface BatchLessonProgressUpdate {\r\n lessonId: string;\r\n status: 'not-started' | 'in-progress' | 'completed';\r\n progress?: number;\r\n}\r\n\r\nclass CourseService {\r\n private baseURL: string;\r\n private token: string;\r\n\r\n constructor(baseURL: string = '/api/v1', token: string = MOCK_JWT_TOKEN) {\r\n this.baseURL = baseURL;\r\n this.token = token;\r\n }\r\n\r\n private getAuthHeaders(): HeadersInit {\r\n return {\r\n 'Authorization': `Bearer ${this.token}`,\r\n 'Content-Type': 'application/json'\r\n };\r\n }\r\n\r\n private async fetchWithAuth(url: string, options: RequestInit = {}): Promise<Response> {\r\n const response = await fetch(url, {\r\n ...options,\r\n headers: {\r\n ...this.getAuthHeaders(),\r\n ...options.headers\r\n }\r\n });\r\n\r\n if (!response.ok) {\r\n throw new Error(`HTTP error! status: ${response.status}`);\r\n }\r\n\r\n return response;\r\n }\r\n\r\n // 获取课程数据\r\n async getCourseData(courseId: string): Promise<CourseData> {\r\n const response = await this.fetchWithAuth(`${this.baseURL}/content/courses/${courseId}`);\r\n return response.json();\r\n }\r\n\r\n // 获取用户年级单元导航数据(包含所有单元进度)\r\n async getUserGradeUnitsNav(gradeId?: string): Promise<UserGradeUnitsNav> {\r\n const url = gradeId\r\n ? `${this.baseURL}/content/grades/${encodeURIComponent(gradeId)}/units/nav`\r\n : `${this.baseURL}/content/grades/current/units/nav`;\r\n\r\n const response = await this.fetchWithAuth(url);\r\n return response.json();\r\n }\r\n\r\n // 获取单元进度\r\n async getUnitProgress(courseId: string, unitId?: string): Promise<Record<string, UnitProgress>> {\r\n const url = unitId\r\n ? `${this.baseURL}/content/courses/${courseId}/units/${unitId}/progress`\r\n : `${this.baseURL}/content/courses/${courseId}/progress`;\r\n\r\n const response = await this.fetchWithAuth(url);\r\n return response.json();\r\n }\r\n\r\n // 批量更新单元课时进度\r\n async batchUpdateLessonProgress(\r\n unitId: string,\r\n progressUpdates: BatchLessonProgressUpdate[]\r\n ): Promise<{ success: boolean; results: Array<{ lessonId: string; success: boolean; status: string }> }> {\r\n const response = await this.fetchWithAuth(\r\n `${this.baseURL}/content/units/${unitId}/progress/batch`,\r\n {\r\n method: 'POST',\r\n body: JSON.stringify(progressUpdates)\r\n }\r\n );\r\n\r\n return response.json();\r\n }\r\n\r\n // 更新学习进度(单个课时)\r\n async updateLessonProgress(\r\n courseId: string,\r\n unitId: string,\r\n lessonId: string,\r\n status: 'completed' | 'in-progress' | 'not-started'\r\n ): Promise<void> {\r\n await this.fetchWithAuth(\r\n `${this.baseURL}/content/courses/${courseId}/units/${unitId}/lessons/${lessonId}/progress`,\r\n {\r\n method: 'POST',\r\n body: JSON.stringify({ status })\r\n }\r\n );\r\n }\r\n\r\n // 设置认证token\r\n setToken(token: string): void {\r\n this.token = token;\r\n }\r\n\r\n // 获取当前token\r\n getToken(): string {\r\n return this.token;\r\n }\r\n}\r\n\r\n// 单例模式导出\r\nexport const courseService = new CourseService();","// API数据源实现\r\nimport { courseService } from '../services/courseService';\r\nimport type {\r\n IDataSource,\r\n ApiDataSourceConfig,\r\n DataSourceError,\r\n UpdateProgressParams,\r\n BatchLessonProgressUpdate\r\n} from './types';\r\nimport type {\r\n UserData,\r\n UserGradeUnitsProgressData\r\n} from '../types';\r\nimport type { ExploreItem } from '../components/MathWizHeader/MathWizHeader.types';\r\n\r\n/**\r\n * API数据源 - 基于现有courseService的实现\r\n */\r\nexport class ApiDataSource implements IDataSource {\r\n private config: ApiDataSourceConfig;\r\n\r\n constructor(config: ApiDataSourceConfig) {\r\n this.config = {\r\n name: 'ApiDataSource',\r\n enableCaching: false,\r\n cacheTTL: 300000, // 5分钟\r\n timeout: 15000, // 15秒\r\n retryCount: 3,\r\n retryDelay: 1000,\r\n ...config\r\n };\r\n\r\n // 配置courseService\r\n courseService.setToken(this.config.token);\r\n }\r\n\r\n async getUserGradeUnitsNav(gradeId: string, userId: string): Promise<UserGradeUnitsProgressData> {\r\n try {\r\n console.log(`[ApiDataSource] 获取年级单元导航数据: gradeId=${gradeId}, userId=${userId}`);\r\n\r\n const data = await this.withRetry(() =>\r\n courseService.getUserGradeUnitsNav(gradeId)\r\n );\r\n\r\n return data;\r\n } catch (error) {\r\n console.error('[ApiDataSource] 获取年级单元导航数据失败:', error);\r\n throw new DataSourceError(\r\n `获取年级单元导航数据失败: ${error instanceof Error ? error.message : '未知错误'}`,\r\n 'GET_USER_GRADE_UNITS_NAV_FAILED',\r\n error instanceof Error ? error : undefined\r\n );\r\n }\r\n }\r\n\r\n async getUserProfile(userId: string): Promise<UserData> {\r\n try {\r\n console.log(`[ApiDataSource] 获取用户个人信息: userId=${userId}`);\r\n\r\n // 这里应该调用实际的用户API\r\n // 目前使用模拟数据,实际项目中需要替换为真实的API调用\r\n const mockUserData: UserData = {\r\n id: userId,\r\n name: '学生用户',\r\n level: 5,\r\n avatar: 'https://i.pravatar.cc/40',\r\n badges: ['🏆']\r\n };\r\n\r\n return mockUserData;\r\n } catch (error) {\r\n console.error('[ApiDataSource] 获取用户个人信息失败:', error);\r\n throw new DataSourceError(\r\n `获取用户个人信息失败: ${error instanceof Error ? error.message : '未知错误'}`,\r\n 'GET_USER_PROFILE_FAILED',\r\n error instanceof Error ? error : undefined\r\n );\r\n }\r\n }\r\n\r\n async getExploreMenu(): Promise<ExploreItem[]> {\r\n try {\r\n console.log('[ApiDataSource] 获取探索菜单数据');\r\n\r\n // 这里应该调用实际的探索菜单API\r\n // 目前使用模拟数据,实际项目中需要替换为真实的API调用\r\n const mockExploreMenu: ExploreItem[] = [\r\n { id: 'g5', label: '五年级', status: '进行中' },\r\n { id: 'g6', label: '六年级', status: 'new' }\r\n ];\r\n\r\n return mockExploreMenu;\r\n } catch (error) {\r\n console.error('[ApiDataSource] 获取探索菜单数据失败:', error);\r\n throw new DataSourceError(\r\n `获取探索菜单数据失败: ${error instanceof Error ? error.message : '未知错误'}`,\r\n 'GET_EXPLORE_MENU_FAILED',\r\n error instanceof Error ? error : undefined\r\n );\r\n }\r\n }\r\n\r\n async updateLessonProgress(params: UpdateProgressParams): Promise<void> {\r\n try {\r\n console.log(`[ApiDataSource] 更新课时进度:`, params);\r\n\r\n await this.withRetry(() =>\r\n courseService.updateLessonProgress(\r\n params.courseId,\r\n params.unitId,\r\n params.lessonId,\r\n params.status\r\n )\r\n );\r\n } catch (error) {\r\n console.error('[ApiDataSource] 更新课时进度失败:', error);\r\n throw new DataSourceError(\r\n `更新课时进度失败: ${error instanceof Error ? error.message : '未知错误'}`,\r\n 'UPDATE_LESSON_PROGRESS_FAILED',\r\n error instanceof Error ? error : undefined\r\n );\r\n }\r\n }\r\n\r\n async batchUpdateLessonProgress(\r\n unitId: string,\r\n progressUpdates: BatchLessonProgressUpdate[]\r\n ): Promise<{ success: boolean; results: Array<{ lessonId: string; success: boolean; status: string }> }> {\r\n try {\r\n console.log(`[ApiDataSource] 批量更新课时进度: unitId=${unitId}`, progressUpdates);\r\n\r\n const result = await this.withRetry(() =>\r\n courseService.batchUpdateLessonProgress(unitId, progressUpdates)\r\n );\r\n\r\n return result;\r\n } catch (error) {\r\n console.error('[ApiDataSource] 批量更新课时进度失败:', error);\r\n throw new DataSourceError(\r\n `批量更新课时进度失败: ${error instanceof Error ? error.message : '未知错误'}`,\r\n 'BATCH_UPDATE_LESSON_PROGRESS_FAILED',\r\n error instanceof Error ? error : undefined\r\n );\r\n }\r\n }\r\n\r\n /**\r\n * 带重试机制的请求执行\r\n */\r\n private async withRetry<T>(operation: () => Promise<T>): Promise<T> {\r\n let lastError: Error;\r\n\r\n for (let attempt = 1; attempt <= this.config.retryCount!; attempt++) {\r\n try {\r\n return await operation();\r\n } catch (error) {\r\n lastError = error instanceof Error ? error : new Error(String(error));\r\n\r\n if (attempt < this.config.retryCount!) {\r\n console.warn(`[ApiDataSource] 请求失败,第${attempt}次重试...`, lastError.message);\r\n await this.delay(this.config.retryDelay!);\r\n }\r\n }\r\n }\r\n\r\n throw lastError!;\r\n }\r\n\r\n /**\r\n * 延迟函数\r\n */\r\n private delay(ms: number): Promise<void> {\r\n return new Promise(resolve => setTimeout(resolve, ms));\r\n }\r\n\r\n /**\r\n * 获取配置信息\r\n */\r\n getConfig(): ApiDataSourceConfig {\r\n return { ...this.config };\r\n }\r\n}","// 模拟数据源实现\r\nimport { courseData } from '../data/courseData';\r\nimport { categoryIcons } from '../types';\r\nimport type {\r\n IDataSource,\r\n MockDataSourceConfig,\r\n DataSourceError,\r\n UpdateProgressParams,\r\n BatchLessonProgressUpdate\r\n} from './types';\r\nimport type {\r\n UserData,\r\n UserGradeUnitsProgressData,\r\n Lesson\r\n} from '../types';\r\nimport type { ExploreItem } from '../components/MathWizHeader/MathWizHeader.types';\r\n\r\n/**\r\n * 模拟数据源 - 基于courseData.ts的实现\r\n */\r\nexport class MockDataSource implements IDataSource {\r\n private config: MockDataSourceConfig;\r\n\r\n constructor(config: MockDataSourceConfig) {\r\n this.config = {\r\n name: 'MockDataSource',\r\n delay: 500,\r\n simulateError: false,\r\n errorProbability: 0.1,\r\n ...config\r\n };\r\n }\r\n\r\n async getUserGradeUnitsNav(gradeId: string, userId: string): Promise<UserGradeUnitsProgressData> {\r\n console.log(`[MockDataSource] 开始获取年级单元导航数据: gradeId=${gradeId}, userId=${userId}`);\r\n await this.simulateDelay();\r\n\r\n if (this.shouldSimulateError()) {\r\n console.log(`[MockDataSource] 模拟错误: gradeId=${gradeId}, userId=${userId}`);\r\n throw new DataSourceError(\r\n '模拟数据源:获取年级单元导航数据失败',\r\n 'MOCK_GET_USER_GRADE_UNITS_NAV_FAILED'\r\n );\r\n }\r\n\r\n console.log(`[MockDataSource] 成功获取年级单元导航数据: gradeId=${gradeId}, userId=${userId}`);\r\n\r\n // 基于courseData.ts生成模拟进度数据\r\n const mockUnitsData: UserGradeUnitsProgressData = {\r\n userId: userId,\r\n courseId: gradeId,\r\n courseTitle: '小学数学五年级',\r\n courseLevel: 5,\r\n totalUnits: courseData.units.length,\r\n completedUnits: 2,\r\n overallProgress: 22,\r\n status: 'in-progress',\r\n lastAccessed: new Date().toISOString(),\r\n units: courseData.units.map((unit, index) => ({\r\n unitId: unit.id,\r\n title: unit.title,\r\n description: unit.description,\r\n moduleCategory: unit.moduleCategory,\r\n estimatedDuration: unit.estimatedDuration,\r\n totalLessons: unit.lessons.length,\r\n completedLessons: index < 2 ? Math.floor(unit.lessons.length * 0.5) : 0,\r\n progressPercentage: index < 2 ? 50 : 0,\r\n status: index < 2 ? 'in-progress' : 'not-started',\r\n lastAccessed: index < 2 ? new Date().toISOString() : undefined,\r\n isActive: index === 0,\r\n route: `/math/grade-5/unit/${unit.id}`,\r\n icon: categoryIcons[unit.moduleCategory] || categoryIcons.Default\r\n }))\r\n };\r\n\r\n return mockUnitsData;\r\n }\r\n\r\n async getUserProfile(userId: string): Promise<UserData> {\r\n await this.simulateDelay();\r\n\r\n if (this.shouldSimulateError()) {\r\n throw new DataSourceError(\r\n '模拟数据源:获取用户个人信息失败',\r\n 'MOCK_GET_USER_PROFILE_FAILED'\r\n );\r\n }\r\n\r\n console.log(`[MockDataSource] 获取用户个人信息: userId=${userId}`);\r\n\r\n const mockUserData: UserData = {\r\n id: userId,\r\n name: '学生用户',\r\n level: 5,\r\n avatar: 'https://i.pravatar.cc/40',\r\n badges: ['🏆']\r\n };\r\n\r\n return mockUserData;\r\n }\r\n\r\n async getExploreMenu(): Promise<ExploreItem[]> {\r\n await this.simulateDelay();\r\n\r\n if (this.shouldSimulateError()) {\r\n throw new DataSourceError(\r\n '模拟数据源:获取探索菜单数据失败',\r\n 'MOCK_GET_EXPLORE_MENU_FAILED'\r\n );\r\n }\r\n\r\n console.log('[MockDataSource] 获取探索菜单数据');\r\n\r\n const mockExploreMenu: ExploreItem[] = [\r\n { id: 'g5', label: '五年级', status: '进行中' },\r\n { id: 'g6', label: '六年级', status: 'new' }\r\n ];\r\n\r\n return mockExploreMenu;\r\n }\r\n\r\n async updateLessonProgress(params: UpdateProgressParams): Promise<void> {\r\n await this.simulateDelay();\r\n\r\n if (this.shouldSimulateError()) {\r\n throw new DataSourceError(\r\n '模拟数据源:更新课时进度失败',\r\n 'MOCK_UPDATE_LESSON_PROGRESS_FAILED'\r\n );\r\n }\r\n\r\n console.log(`[MockDataSource] 更新课时进度:`, params);\r\n\r\n // 模拟数据源中,进度更新只是记录日志\r\n console.log(`课时 ${params.lessonId} 状态更新为: ${params.status}`);\r\n }\r\n\r\n async batchUpdateLessonProgress(\r\n unitId: string,\r\n progressUpdates: BatchLessonProgressUpdate[]\r\n ): Promise<{ success: boolean; results: Array<{ lessonId: string; success: boolean; status: string }> }> {\r\n await this.simulateDelay();\r\n\r\n if (this.shouldSimulateError()) {\r\n throw new DataSourceError(\r\n '模拟数据源:批量更新课时进度失败',\r\n 'MOCK_BATCH_UPDATE_LESSON_PROGRESS_FAILED'\r\n );\r\n }\r\n\r\n console.log(`[MockDataSource] 批量更新课时进度: unitId=${unitId}`, progressUpdates);\r\n\r\n const results = progressUpdates.map(update => ({\r\n lessonId: update.lessonId,\r\n success: true,\r\n status: update.status\r\n }));\r\n\r\n return {\r\n success: true,\r\n results\r\n };\r\n }\r\n\r\n /**\r\n * 模拟网络延迟\r\n */\r\n private async simulateDelay(): Promise<void> {\r\n if (this.config.delay && this.config.delay > 0) {\r\n await new Promise(resolve => setTimeout(resolve, this.config.delay));\r\n }\r\n }\r\n\r\n /**\r\n * 判断是否应该模拟错误\r\n */\r\n private shouldSimulateError(): boolean {\r\n if (!this.config.simulateError) {\r\n return false;\r\n }\r\n\r\n return Math.random() < (this.config.errorProbability || 0.1);\r\n }\r\n\r\n /**\r\n * 获取配置信息\r\n */\r\n getConfig(): MockDataSourceConfig {\r\n return { ...this.config };\r\n }\r\n\r\n /**\r\n * 生成课程数据\r\n */\r\n getCourseData(): typeof courseData {\r\n return courseData;\r\n }\r\n\r\n /**\r\n * 生成课时数据\r\n */\r\n getLessonsData(): Record<string, Lesson[]> {\r\n const lessonsData: Record<string, Lesson[]> = {};\r\n courseData.units.forEach(unit => {\r\n lessonsData[unit.id] = unit.lessons.map(lesson => ({\r\n id: lesson.id,\r\n title: lesson.title,\r\n duration: lesson.duration,\r\n knowledgeItems: lesson.knowledgeItems.map(item => ({\r\n ...item,\r\n progress: 0 // 添加默认进度值\r\n }))\r\n }));\r\n });\r\n return lessonsData;\r\n }\r\n}","// 数据源工厂\r\nimport { ApiDataSource } from './api-data-source';\r\nimport { MockDataSource } from './mock-data-source';\r\nimport { CustomDataSource } from './custom-data-source';\r\nimport type {\r\n IDataSource,\r\n DataSourceFactoryOptions,\r\n DataSourceConfig,\r\n ApiDataSourceConfig,\r\n MockDataSourceConfig\r\n} from './types';\r\n\r\n/**\r\n * 数据源工厂 - 用于创建和管理数据源实例\r\n */\r\nexport class DataSourceFactory {\r\n private static instances: Map<string, IDataSource> = new Map();\r\n\r\n /**\r\n * 创建数据源实例\r\n * @param options 数据源选项\r\n * @returns 数据源实例\r\n */\r\n static createDataSource(options: DataSourceFactoryOptions): IDataSource {\r\n const { type, config, customDataSourceClass } = options;\r\n\r\n // 生成实例标识符\r\n const instanceKey = this.getInstanceKey(type, config);\r\n\r\n // 如果已存在相同配置的实例,则返回现有实例\r\n if (this.instances.has(instanceKey)) {\r\n return this.instances.get(instanceKey)!;\r\n }\r\n\r\n let dataSource: IDataSource;\r\n\r\n switch (type) {\r\n case 'api':\r\n dataSource = new ApiDataSource(config as ApiDataSourceConfig);\r\n break;\r\n\r\n case 'mock':\r\n dataSource = new MockDataSource(config as MockDataSourceConfig);\r\n break;\r\n\r\n case 'custom':\r\n if (!customDataSourceClass) {\r\n throw new Error('自定义数据源类型需要提供 customDataSourceClass 参数');\r\n }\r\n dataSource = new customDataSourceClass(config);\r\n break;\r\n\r\n default:\r\n throw new Error(`不支持的数据源类型: ${type}`);\r\n }\r\n\r\n // 缓存实例\r\n this.instances.set(instanceKey, dataSource);\r\n\r\n console.log(`[DataSourceFactory] 创建数据源: type=${type}, name=${config.name}`);\r\n\r\n return dataSource;\r\n }\r\n\r\n /**\r\n * 获取API数据源实例\r\n * @param config API数据源配置\r\n * @returns API数据源实例\r\n */\r\n static createApiDataSource(config: ApiDataSourceConfig): ApiDataSource {\r\n return this.createDataSource({\r\n type: 'api',\r\n config\r\n }) as ApiDataSource;\r\n }\r\n\r\n /**\r\n * 获取模拟数据源实例\r\n * @param config 模拟数据源配置\r\n * @returns 模拟数据源实例\r\n */\r\n static createMockDataSource(config: Partial<MockDataSourceConfig> = {}): MockDataSource {\r\n return this.createDataSource({\r\n type: 'mock',\r\n config: {\r\n name: 'MockDataSource',\r\n ...config\r\n }\r\n }) as MockDataSource;\r\n }\r\n\r\n /**\r\n * 获取默认数据源实例\r\n * 根据环境自动选择合适的数据源\r\n */\r\n static createDefaultDataSource(): IDataSource {\r\n // 浏览器环境检测\r\n const isBrowser = typeof window !== 'undefined';\r\n\r\n // 安全的环境检测,避免 process is not defined 错误\r\n let isDevelopment = false;\r\n let isTest = false;\r\n let useMock = false;\r\n\r\n try {\r\n // 尝试访问 process.env,如果不存在则使用默认值\r\n if (typeof process !== 'undefined' && process.env) {\r\n isDevelopment = process.env.NODE_ENV === 'development';\r\n isTest = process.env.NODE_ENV === 'test';\r\n useMock = process.env.REACT_APP_USE_MOCK === 'true';\r\n } else {\r\n // 在浏览器环境中,默认使用 mock 数据源\r\n isDevelopment = true;\r\n useMock = true;\r\n }\r\n } catch (error) {\r\n // 如果访问 process.env 失败,使用默认配置\r\n console.warn('无法检测环境变量,使用默认配置:', error);\r\n isDevelopment = true;\r\n useMock = true;\r\n }\r\n\r\n // 开发环境、测试环境或明确配置使用 mock 时使用模拟数据源\r\n if (isDevelopment || isTest || useMock) {\r\n return this.createMockDataSource({\r\n name: 'DefaultMockDataSource',\r\n delay: 300\r\n });\r\n }\r\n\r\n // 生产环境使用API数据源\r\n return this.createApiDataSource({\r\n name: 'DefaultApiDataSource',\r\n baseURL: '/api/v1',\r\n token: isBrowser ? localStorage.getItem('authToken') || '' : ''\r\n });\r\n }\r\n\r\n /**\r\n * 清除所有数据源实例缓存\r\n */\r\n static clearCache(): void {\r\n this.instances.clear();\r\n console.log('[DataSourceFactory] 已清除所有数据源实例缓存');\r\n }\r\n\r\n /**\r\n * 获取缓存的实例数量\r\n */\r\n static getCachedInstanceCount(): number {\r\n return this.instances.size;\r\n }\r\n\r\n /**\r\n * 生成实例标识符\r\n */\r\n private static getInstanceKey(type: string, config: DataSourceConfig): string {\r\n return `${type}:${config.name}:${JSON.stringify(config)}`;\r\n }\r\n}\r\n\r\n/**\r\n * 创建数据源的快捷函数\r\n */\r\nexport function createDataSource(options: DataSourceFactoryOptions): IDataSource {\r\n return DataSourceFactory.createDataSource(options);\r\n}\r\n\r\n/**\r\n * 创建API数据源的快捷函数\r\n */\r\nexport function createApiDataSource(config: ApiDataSourceConfig): ApiDataSource {\r\n return DataSourceFactory.createApiDataSource(config);\r\n}\r\n\r\n/**\r\n * 创建模拟数据源的快捷函数\r\n */\r\nexport function createMockDataSource(config: Partial<MockDataSourceConfig> = {}): MockDataSource {\r\n return DataSourceFactory.createMockDataSource(config);\r\n}\r\n\r\n/**\r\n * 创建默认数据源的快捷函数\r\n */\r\nexport function createDefaultDataSource(): IDataSource {\r\n return DataSourceFactory.createDefaultDataSource();\r\n}","// 配置系统工具函数\r\nimport type {\r\n GradeUnitBrowserConfig,\r\n CreateConfigOptions,\r\n ConfigValidationResult,\r\n ConfigPreset,\r\n ConfigChangeEvent\r\n} from './types';\r\nimport { createDefaultDataSource } from '../data-sources/factory';\r\n\r\n/**\r\n * 创建 GradeUnitBrowser 配置\r\n * @param options 配置选项\r\n * @returns 完整的配置对象\r\n */\r\nexport function createGradeUnitBrowserConfig(\r\n options: CreateConfigOptions = {}\r\n): GradeUnitBrowserConfig {\r\n const {\r\n dataSource = createDefaultDataSource(),\r\n fallbackStrategy = 'mock',\r\n errorHandling = {},\r\n performance = {},\r\n theme = {},\r\n debug = false,\r\n enableDevTools = false\r\n } = options;\r\n\r\n const config: GradeUnitBrowserConfig = {\r\n dataSource,\r\n fallbackStrategy,\r\n errorHandling: {\r\n showUserFriendlyErrors: true,\r\n logErrors: true,\r\n autoRetry: true,\r\n maxRetries: 3,\r\n retryDelay: 1000,\r\n ...errorHandling\r\n },\r\n performance: {\r\n enableVirtualization: true,\r\n lazyLoadImages: true,\r\n debounceSearch: 300,\r\n enableCaching: true,\r\n cacheTTL: 300000, // 5分钟\r\n ...performance\r\n },\r\n theme: {\r\n primaryColor: '#1865f2',\r\n borderRadius: '8px',\r\n spacing: '16px',\r\n fontSize: '14px',\r\n enableDarkMode: false,\r\n ...theme\r\n },\r\n debug,\r\n enableDevTools\r\n };\r\n\r\n return config;\r\n}\r\n\r\n/**\r\n * 验证配置的有效性\r\n * @param config 要验证的配置\r\n * @returns 验证结果\r\n */\r\nexport function validateConfig(config: GradeUnitBrowserConfig): ConfigValidationResult {\r\n const errors: string[] = [];\r\n const warnings: string[] = [];\r\n\r\n // 验证数据源\r\n if (!config.dataSource) {\r\n errors.push('数据源配置不能为空');\r\n } else {\r\n // 验证数据源接口方法\r\n const requiredMethods = [\r\n 'getUserGradeUnitsNav',\r\n 'getUserProfile',\r\n 'getExploreMenu',\r\n 'updateLessonProgress',\r\n 'batchUpdateLessonProgress'\r\n ];\r\n\r\n for (const method of requiredMethods) {\r\n if (typeof (config.dataSource as any)[method] !== 'function') {\r\n errors.push(`数据源缺少必需的方法: ${method}`);\r\n }\r\n }\r\n }\r\n\r\n // 验证fallback策略\r\n const validFallbackStrategies = ['error', 'mock', 'cached', 'none'];\r\n if (!validFallbackStrategies.includes(config.fallbackStrategy)) {\r\n errors.push(`无效的fallback策略: ${config.fallbackStrategy}`);\r\n }\r\n\r\n // 验证错误处理配置\r\n if (config.errorHandling.maxRetries < 0) {\r\n errors.push('最大重试次数不能为负数');\r\n }\r\n\r\n if (config.errorHandling.retryDelay < 0) {\r\n errors.push('重试延迟不能为负数');\r\n }\r\n\r\n // 验证性能配置\r\n if (config.performance.debounceSearch < 0) {\r\n errors.push('防抖时间不能为负数');\r\n }\r\n\r\n if (config.performance.cacheTTL < 0) {\r\n errors.push('缓存过期时间不能为负数');\r\n }\r\n\r\n // 验证主题配置\r\n if (!isValidColor(config.theme.primaryColor)) {\r\n warnings.push('主色调可能不是有效的颜色值');\r\n }\r\n\r\n // 开发环境警告\r\n if (config.debug && !config.enableDevTools) {\r\n warnings.push('调试模式已启用但开发工具未启用');\r\n }\r\n\r\n return {\r\n isValid: errors.length === 0,\r\n errors,\r\n warnings\r\n };\r\n}\r\n\r\n/**\r\n * 合并配置\r\n * @param baseConfig 基础配置\r\n * @param overrideConfig 覆盖配置\r\n * @returns 合并后的配置\r\n */\r\nexport function mergeConfigs(\r\n baseConfig: GradeUnitBrowserConfig,\r\n overrideConfig: Partial<GradeUnitBrowserConfig>\r\n): GradeUnitBrowserConfig {\r\n return {\r\n ...baseConfig,\r\n ...overrideConfig,\r\n errorHandling: {\r\n ...baseConfig.errorHandling,\r\n ...overrideConfig.errorHandling\r\n },\r\n performance: {\r\n ...baseConfig.performance,\r\n ...overrideConfig.performance\r\n },\r\n theme: {\r\n ...baseConfig.theme,\r\n ...overrideConfig.theme\r\n }\r\n };\r\n}\r\n\r\n/**\r\n * 获取预设配置\r\n * @param preset 预设类型\r\n * @returns 预设配置\r\n */\r\nexport function getPresetConfig(preset: ConfigPreset): GradeUnitBrowserConfig {\r\n switch (preset) {\r\n case 'development':\r\n return createGradeUnitBrowserConfig({\r\n debug: true,\r\n enableDevTools: true,\r\n fallbackStrategy: 'mock',\r\n errorHandling: {\r\n logErrors: true,\r\n autoRetry: true\r\n }\r\n });\r\n\r\n case 'production':\r\n return createGradeUnitBrowserConfig({\r\n debug: false,\r\n enableDevTools: false,\r\n fallbackStrategy: 'error',\r\n errorHandling: {\r\n showUserFriendlyErrors: true,\r\n logErrors: false,\r\n autoRetry: true,\r\n maxRetries: 2\r\n },\r\n performance: {\r\n enableVirtualization: true,\r\n lazyLoadImages: true,\r\n enableCaching: true\r\n }\r\n });\r\n\r\n case 'testing':\r\n return createGradeUnitBrowserConfig({\r\n debug: true,\r\n enableDevTools: false,\r\n fallbackStrategy: 'mock',\r\n errorHandling: {\r\n showUserFriendlyErrors: false,\r\n logErrors: true,\r\n autoRetry: false\r\n },\r\n performance: {\r\n enableVirtualization: false,\r\n lazyLoadImages: false,\r\n enableCaching: false\r\n }\r\n });\r\n\r\n case 'minimal':\r\n return createGradeUnitBrowserConfig({\r\n debug: false,\r\n enableDevTools: false,\r\n fallbackStrategy: 'none',\r\n errorHandling: {\r\n showUserFriendlyErrors: false,\r\n logErrors: false,\r\n autoRetry: false\r\n },\r\n performance: {\r\n enableVirtualization: false,\r\n lazyLoadImages: false,\r\n enableCaching: false\r\n },\r\n theme: {\r\n primaryColor: '#1865f2',\r\n borderRadius: '4px',\r\n spacing: '8px'\r\n }\r\n });\r\n\r\n default:\r\n return createGradeUnitBrowserConfig();\r\n }\r\n}\r\n\r\n/**\r\n * 克隆配置\r\n * @param config 要克隆的配置\r\n * @returns 克隆的配置\r\n */\r\nexport function cloneConfig(config: GradeUnitBrowserConfig): GradeUnitBrowserConfig {\r\n return JSON.parse(JSON.stringify(config));\r\n}\r\n\r\n/**\r\n * 检查颜色值是否有效\r\n * @param color 颜色值\r\n * @returns 是否有效\r\n */\r\nfunction isValidColor(color: string): boolean {\r\n const s = new Option().style;\r\n s.color = color;\r\n return s.color !== '';\r\n}\r\n\r\n/**\r\n * 配置变更监听器类型\r\n */\r\nexport type ConfigChangeListener = (event: ConfigChangeEvent) => void;\r\n\r\n/**\r\n * 配置管理器\r\n */\r\nexport class ConfigManager {\r\n private config: GradeUnitBrowserConfig;\r\n private listeners: ConfigChangeListener[] = [];\r\n\r\n constructor(initialConfig: GradeUnitBrowserConfig) {\r\n this.config = initialConfig;\r\n }\r\n\r\n /**\r\n * 获取当前配置\r\n */\r\n getConfig(): GradeUnitBrowserConfig {\r\n return { ...this.config };\r\n }\r\n\r\n /**\r\n * 更新配置\r\n * @param updates 配置更新\r\n */\r\n updateConfig(updates: Partial<GradeUnitBrowserConfig>): void {\r\n const oldConfig = { ...this.config };\r\n this.config = mergeConfigs(this.config, updates);\r\n\r\n // 触发变更事件\r\n this.triggerChangeEvents(oldConfig, this.config);\r\n }\r\n\r\n /**\r\n * 添加配置变更监听器\r\n * @param listener 监听器函数\r\n */\r\n addChangeListener(listener: ConfigChangeListener): void {\r\n this.listeners.push(listener);\r\n }\r\n\r\n /**\r\n * 移除配置变更监听器\r\n * @param listener 监听器函数\r\n */\r\n removeChangeListener(listener: ConfigChangeListener): void {\r\n const index = this.listeners.indexOf(listener);\r\n if (index > -1) {\r\n this.listeners.splice(index, 1);\r\n }\r\n }\r\n\r\n /**\r\n * 触发配置变更事件\r\n */\r\n private triggerChangeEvents(oldConfig: GradeUnitBrowserConfig, newConfig: GradeUnitBrowserConfig): void {\r\n const changedKeys = this.getChangedKeys(oldConfig, newConfig);\r\n\r\n for (const key of changedKeys) {\r\n const event: ConfigChangeEvent = {\r\n key,\r\n oldValue: (oldConfig as any)[key],\r\n newValue: (newConfig as any)[key],\r\n timestamp: Date.now()\r\n };\r\n\r\n this.listeners.forEach(listener => listener(event));\r\n }\r\n }\r\n\r\n /**\r\n * 获取变更的配置键\r\n */\r\n private getChangedKeys(oldConfig: any, newConfig: any): string[] {\r\n const keys = new Set([...Object.keys(oldConfig), ...Object.keys(newConfig)]);\r\n const changedKeys: string[] = [];\r\n\r\n for (const key of keys) {\r\n if (JSON.stringify(oldConfig[key]) !== JSON.stringify(newConfig[key])) {\r\n changedKeys.push(key);\r\n }\r\n }\r\n\r\n return changedKeys;\r\n }\r\n}","import React, { createContext, useContext, useState, useCallback, useEffect } from 'react';\r\nimport type { UserData, Lesson } from '../../types';\r\nimport { categoryIcons } from '../../types';\r\nimport type { ExploreItem } from '../../components/MathWizHeader/MathWizHeader.types';\r\nimport type { UserGradeUnitsProgressData } from '../../components/Sidebar/types';\r\nimport type { GradeUnitBrowserContextType, GradeUnitBrowserProviderProps } from './types';\r\nimport { courseData } from '../../data/courseData';\r\nimport { createGradeUnitBrowserConfig, mergeConfigs } from '../../config/utils';\r\n\r\n// 创建 Context\r\nexport const GradeUnitBrowserContext = createContext<GradeUnitBrowserContextType | null>(null);\r\n\r\nexport const useGradeUnitBrowser = () => {\r\n const context = useContext(GradeUnitBrowserContext);\r\n if (!context) {\r\n throw new Error('useGradeUnitBrowser must be used within GradeUnitBrowserProvider');\r\n }\r\n return context;\r\n};\r\n\r\n// Context Provider 组件\r\nexport const GradeUnitBrowserProvider: React.FC<GradeUnitBrowserProviderProps> = ({ children, config: providedConfig }) => {\r\n const [config, setConfig] = useState(() => createGradeUnitBrowserConfig(providedConfig));\r\n const [userInfo, setUserInfo] = useState<UserData | null>(null);\r\n const [exploreMenu, setExploreMenu] = useState<ExploreItem[]>([]);\r\n const [unitsData, setUnitsData] = useState<UserGradeUnitsProgressData | null>(null);\r\n const [lessons, setLessons] = useState<Record<string, Lesson[]>>({});\r\n const [loading, setLoading] = useState<boolean>(false);\r\n const [error, setError] = useState<string | null>(null);\r\n const [activeUnitId, setActiveUnitId] = useState<string | null>(null);\r\n const [activeLessonIds, setActiveLessonIds] = useState<string[]>([]);\r\n\r\n const loadPageData = useCallback(async (gradeId: string, userId: string) => {\r\n setLoading(true);\r\n setError(null);\r\n\r\n try {\r\n // 添加短暂延迟确保MSW已初始化\r\n // 在测试环境中移除延迟,避免异步问题\r\n if (process.env.NODE_ENV !== 'test') {\r\n await new Promise(resolve => setTimeout(resolve, 100));\r\n }\r\n\r\n // 使用配置的数据源获取数据\r\n const unitsData = await config.dataSource.getUserGradeUnitsNav(gradeId, userId);\r\n setUnitsData(unitsData);\r\n\r\n // 设置课程数据(从本地课程数据中获取)\r\n const lessonsData: Record<string, Lesson[]> = {};\r\n courseData.units.forEach(unit => {\r\n lessonsData[unit.id] = unit.lessons.map(lesson => ({\r\n id: lesson.id,\r\n title: lesson.title,\r\n duration: lesson.duration,\r\n knowledgeItems: lesson.knowledgeItems.map(item => ({\r\n ...item,\r\n progress: 0 // 添加默认进度值\r\n }))\r\n }));\r\n });\r\n console.log('Lessons data loaded:', lessonsData);\r\n setLessons(lessonsData);\r\n\r\n // 设置用户信息\r\n try {\r\n const userProfile = await config.dataSource.getUserProfile(userId);\r\n setUserInfo(userProfile);\r\n } catch (error) {\r\n console.warn('获取用户信息失败,使用默认数据:', error);\r\n setUserInfo({\r\n id: userId,\r\n name: '学生用户',\r\n level: 5,\r\n avatar: 'https://i.pravatar.cc/40',\r\n badges: ['🏆']\r\n });\r\n }\r\n\r\n // 设置探索菜单\r\n try {\r\n const exploreMenuData = await config.dataSource.getExploreMenu();\r\n setExploreMenu(exploreMenuData);\r\n } catch (error) {\r\n console.warn('获取探索菜单失败,使用默认数据:', error);\r\n setExploreMenu([\r\n { id: 'g5', label: '五年级', status: '进行中' },\r\n { id: 'g6', label: '六年级', status: 'new' }\r\n ]);\r\n }\r\n\r\n } catch (err) {\r\n console.error('数据加载错误:', err);\r\n\r\n // 根据fallback策略处理错误\r\n if (config.fallbackStrategy === 'mock') {\r\n console.log('使用mock数据作为fallback');\r\n // 使用courseData生成mock数据作为fallback\r\n const mockUnitsData = {\r\n userId: userId,\r\n courseId: gradeId,\r\n courseTitle: '小学数学五年级',\r\n courseLevel: 5,\r\n totalUnits: courseData.units.length,\r\n completedUnits: 2,\r\n overallProgress: 22,\r\n status: 'in-progress',\r\n lastAccessed: new Date().toISOString(),\r\n units: courseData.units.map((unit, index) => ({\r\n unitId: unit.id,\r\n title: unit.title,\r\n description: unit.description,\r\n moduleCategory: unit.moduleCategory,\r\n estimatedDuration: unit.estimatedDuration,\r\n totalLessons: unit.lessons.length,\r\n completedLessons: index < 2 ? Math.floor(unit.lessons.length * 0.5) : 0,\r\n progressPercentage: index < 2 ? 50 : 0,\r\n status: index < 2 ? 'in-progress' : 'not-started',\r\n lastAccessed: index < 2 ? new Date().toISOString() : undefined,\r\n isActive: index === 0,\r\n route: `/math/grade-5/unit/${unit.id}`,\r\n icon: categoryIcons[unit.moduleCategory] || categoryIcons.Default\r\n }))\r\n };\r\n setUnitsData(mockUnitsData);\r\n\r\n // 设置课程数据\r\n const lessonsData: Record<string, Lesson[]> = {};\r\n courseData.units.forEach(unit => {\r\n lessonsData[unit.id] = unit.lessons.map(lesson => ({\r\n id: lesson.id,\r\n title: lesson.title,\r\n duration: lesson.duration,\r\n knowledgeItems: lesson.knowledgeItems.map(item => ({\r\n ...item,\r\n progress: 0\r\n }))\r\n }));\r\n });\r\n setLessons(lessonsData);\r\n\r\n // 设置默认用户信息和探索菜单\r\n setUserInfo({\r\n id: userId,\r\n name: '学生用户',\r\n level: 5,\r\n avatar: 'https://i.pravatar.cc/40',\r\n badges: ['🏆']\r\n });\r\n setExploreMenu([\r\n { id: 'g5', label: '五年级', status: '进行中' },\r\n { id: 'g6', label: '六年级', status: 'new' }\r\n ]);\r\n } else {\r\n // 其他fallback策略:显示错误\r\n setError(err instanceof Error ? err.message : '数据加载失败');\r\n setUnitsData(null);\r\n }\r\n } finally {\r\n setLoading(false);\r\n }\r\n }, [config]);\r\n\r\n const toggleLesson = useCallback((lessonId: string) => {\r\n setActiveLessonIds(prev =>\r\n prev.includes(lessonId)\r\n ? prev.filter(id => id !== lessonId)\r\n : [...prev, lessonId]\r\n );\r\n }, []);\r\n\r\n // 包装setActiveUnit函数,接受unitId参数(可为null)\r\n const setActiveUnit = useCallback((unitId: string | null) => {\r\n setActiveUnitId(unitId);\r\n }, []);\r\n\r\n // 更新配置\r\n const updateConfig = useCallback((updates: Partial<GradeUnitBrowserConfig>) => {\r\n setConfig(prevConfig => mergeConfigs(prevConfig, updates));\r\n }, []);\r\n\r\n // 状态更新后执行默认单元选择\r\n useEffect(() => {\r\n console.log('unitsData state updated:', unitsData);\r\n console.log('unitsData?.units:', unitsData?.units);\r\n console.log('unitsData?.units?.length:', unitsData?.units?.length);\r\n\r\n if (unitsData && unitsData.units.length > 0) {\r\n console.log('Looking for active unit...');\r\n const activeUnit = unitsData.units.find(unit => unit.isActive);\r\n console.log('Found active unit:', activeUnit);\r\n const defaultActiveUnit = activeUnit?.unitId || unitsData.units[0].unitId;\r\n console.log('Setting default active unit:', defaultActiveUnit);\r\n setActiveUnitId(defaultActiveUnit);\r\n console.log('Default active unit set after state update:', defaultActiveUnit);\r\n } else {\r\n console.log('No units data available for setting default active unit');\r\n }\r\n }, [unitsData]);\r\n\r\n const contextValue: GradeUnitBrowserContextType = {\r\n // 数据状态\r\n userInfo,\r\n exploreMenu,\r\n unitsData,\r\n lessons,\r\n\r\n // UI状态\r\n loading,\r\n error,\r\n activeUnitId,\r\n activeLessonIds,\r\n\r\n // 配置状态\r\n config,\r\n theme: config.theme,\r\n enableVirtualization: config.performance?.enableVirtualization,\r\n\r\n // Actions\r\n setLoading,\r\n setError,\r\n setActiveUnit,\r\n toggleLesson,\r\n loadPageData,\r\n updateConfig\r\n };\r\n\r\n return (\r\n <GradeUnitBrowserContext.Provider value={contextValue}>\r\n {children}\r\n </GradeUnitBrowserContext.Provider>\r\n );\r\n};","import React, { useEffect } from 'react';\r\nimport MathWizHeader from '../../components/MathWizHeader/MathWizHeader';\r\nimport { Sidebar } from '../../components/Sidebar/Sidebar';\r\nimport { ContentAccordion } from '../../components/ContentAccordion/ContentAccordion';\r\nimport { GradeUnitBrowserProvider, useGradeUnitBrowser } from './GradeUnitBrowserContext';\r\nimport type { GradeUnitBrowserPageProps } from './types';\r\nimport './GradeUnitBrowserPage.css';\r\n\r\n// 内部页面组件(使用Context)\r\nconst GradeUnitBrowserPageContent: React.FC<GradeUnitBrowserPageProps> = ({\r\n gradeId,\r\n userId,\r\n onLearnAction,\r\n className,\r\n userInfo: propUserInfo,\r\n exploreMenu: propExploreMenu\r\n}) => {\r\n const {\r\n userInfo: contextUserInfo,\r\n exploreMenu: contextExploreMenu,\r\n unitsData,\r\n lessons,\r\n loading,\r\n error,\r\n activeUnitId,\r\n activeLessonIds,\r\n setActiveUnit,\r\n toggleLesson,\r\n loadPageData\r\n } = useGradeUnitBrowser();\r\n\r\n // 使用props中的值或context中的值\r\n const userInfo = propUserInfo ?? contextUserInfo;\r\n const exploreMenu = propExploreMenu ?? contextExploreMenu;\r\n\r\n useEffect(() => {\r\n console.log('GradeUnitBrowserPageContent: useEffect triggered, calling loadPageData');\r\n console.log('gradeId:', gradeId, 'userId:', userId);\r\n loadPageData(gradeId, userId);\r\n }, [gradeId, userId, loadPageData]);\r\n\r\n // 调试日志\r\n useEffect(() => {\r\n console.log('activeUnitId from context:', activeUnitId);\r\n console.log('lessons from context:', lessons);\r\n\r\n // 重新计算 activeUnit 用于调试\r\n const activeUnitNav = unitsData?.units?.find(unit => unit.unitId === activeUnitId) || null;\r\n const debugActiveUnit = activeUnitNav && activeUnitId && lessons[activeUnitId] ? {\r\n id: activeUnitNav.unitId,\r\n title: activeUnitNav.title,\r\n description: activeUnitNav.description,\r\n estimatedDuration: activeUnitNav.estimatedDuration,\r\n totalLessons: activeUnitNav.totalLessons,\r\n moduleCategory: activeUnitNav.moduleCategory,\r\n lessons: lessons[activeUnitId]\r\n } : null;\r\n\r\n console.log('activeUnit computed:', debugActiveUnit);\r\n }, [activeUnitId, lessons, unitsData]);\r\n\r\n // 获取当前激活的单元\r\n const activeUnitNav = unitsData?.units?.find(unit => unit.unitId === activeUnitId) || null;\r\n\r\n // 获取完整的单元数据(包含课程和知识点)\r\n const activeUnit = activeUnitNav && activeUnitId && lessons[activeUnitId] ? {\r\n id: activeUnitNav.unitId,\r\n title: activeUnitNav.title,\r\n description: activeUnitNav.description,\r\n estimatedDuration: activeUnitNav.estimatedDuration,\r\n totalLessons: activeUnitNav.totalLessons,\r\n moduleCategory: activeUnitNav.moduleCategory,\r\n lessons: lessons[activeUnitId]\r\n } : null;\r\n\r\n if (loading) {\r\n return (\r\n <div className={`grade-unit-browser-page loading ${className || ''}`} data-testid=\"grade-unit-browser-page\">\r\n <div className=\"loading-spinner\" data-testid=\"loading-spinner\">\r\n 加载中...\r\n </div>\r\n </div>\r\n );\r\n }\r\n\r\n if (error) {\r\n return (\r\n <div className={`grade-unit-browser-page error ${className || ''}`} data-testid=\"grade-unit-browser-page\">\r\n <div className=\"error-message\" data-testid=\"error-message\">\r\n {error}\r\n </div>\r\n <button\r\n onClick={() => loadPageData(gradeId, userId)}\r\n className=\"retry-button\"\r\n >\r\n 重试\r\n </button>\r\n </div>\r\n );\r\n }\r\n\r\n return (\r\n <div\r\n className={`grade-unit-browser-page ${className || ''}`}\r\n data-testid=\"grade-unit-browser-page\"\r\n >\r\n {/* Header 区域 */}\r\n <div className=\"header-area\">\r\n <MathWizHeader\r\n userData={userInfo || undefined}\r\n exploreItems={exploreMenu}\r\n />\r\n </div>\r\n\r\n {/* Sidebar 区域 */}\r\n <div className=\"sidebar-area\">\r\n <Sidebar\r\n data={unitsData}\r\n activeUnitId={activeUnitId}\r\n onUnitSelect={setActiveUnit}\r\n loading={loading}\r\n />\r\n </div>\r\n\r\n {/* 主内容区域 */}\r\n <div className=\"content-area\">\r\n <ContentAccordion\r\n unit={activeUnit}\r\n activeLessonIds={activeLessonIds}\r\n onToggleLesson={toggleLesson}\r\n onLearnAction={onLearnAction || (() => { })}\r\n loading={loading}\r\n />\r\n </div>\r\n </div>\r\n );\r\n};\r\n\r\n// 主页面组件(包装Provider)\r\nexport const GradeUnitBrowserPage: React.FC<GradeUnitBrowserPageProps> = (props) => {\r\n return (\r\n <GradeUnitBrowserProvider config={props.config}>\r\n <GradeUnitBrowserPageContent {...props} />\r\n </GradeUnitBrowserProvider>\r\n );\r\n};","/**\r\n * 几何核心工具函数 \r\n * 专注于三角形寻宝游戏的几何计算、坐标处理和三角形验证\r\n */\r\n\r\n// ==================== 基础几何计算 ====================\r\n\r\n/**\r\n * 计算线段上指定比例的点\r\n * @param {Object} p1 - 起点 {x, y}\r\n * @param {Object} p2 - 终点 {x, y}\r\n * @param {number} ratio - 比例 (0-1)\r\n * @returns {Object} 计算出的点 {x, y}\r\n */\r\nexport const pointOnLine = (p1, p2, ratio) => ({\r\n x: p1.x + (p2.x - p1.x) * ratio,\r\n y: p1.y + (p2.y - p1.y) * ratio\r\n});\r\n\r\n\r\n// ==================== 几何数据导入 ====================\r\n\r\n/**\r\n * 🔧 架构修复:从单一数据源导入几何数据\r\n * \r\n * ✅ 职责:提供纯工具函数 (符合utils层职责)\r\n * \r\n * 数据源:\r\n * - 统一从 data/geometryDefinitions.js 获取\r\n * - 实现真正的单一数据源架构\r\n * - 支持依赖注入和数据源切换\r\n */\r\n\r\n/**\r\n * 计算标准化的三角形分割点坐标 - 重构版本\r\n */\r\nexport const calculateGamePoints = () => {\r\n\r\n // 基础三角形顶点(归一化坐标)\r\n const A = { x: 0.5, y: 0.1, name: 'A' };\r\n const B = { x: 0.1, y: 0.75, name: 'B' };\r\n const C = { x: 0.9, y: 0.75, name: 'C' };\r\n\r\n // 第一层分割线(距离顶点A的1/3处)\r\n const D = { ...pointOnLine(A, B, 1 / 3), name: 'D' };\r\n const E = { ...pointOnLine(A, C, 1 / 3), name: 'E' };\r\n\r\n // 第二层分割线(距离顶点A的2/3处)\r\n const M = { ...pointOnLine(A, B, 2 / 3), name: 'M' };\r\n const N = { ...pointOnLine(A, C, 2 / 3), name: 'N' };\r\n\r\n // 底边BC上的分割点\r\n const P = { ...pointOnLine(B, C, 1 / 3), name: 'P' };\r\n const Q = { ...pointOnLine(B, C, 2 / 3), name: 'Q' };\r\n\r\n // DE线上的分割点\r\n const U = { ...pointOnLine(D, E, 1 / 3), name: 'U' };\r\n const S = { ...pointOnLine(D, E, 2 / 3), name: 'S' };\r\n\r\n // MN线上的分割点\r\n const K = { ...pointOnLine(M, N, 1 / 3), name: 'K' };\r\n const L = { ...pointOnLine(M, N, 2 / 3), name: 'L' };\r\n\r\n return { A, B, C, D, E, M, N, P, Q, U, S, K, L };\r\n};\r\n\r\n/**\r\n * 将归一化坐标转换为绝对像素坐标\r\n * @param {Object} normalizedPoints - 归一化坐标点集\r\n * @param {number} width - 画布宽度\r\n * @param {number} height - 画布高度\r\n * @returns {Object} 绝对坐标点集\r\n */\r\nexport const toPixelCoordinates = (normalizedPoints, width, height) => {\r\n const pixelPoints = {};\r\n\r\n for (const [name, point] of Object.entries(normalizedPoints)) {\r\n pixelPoints[name] = {\r\n ...point,\r\n x: point.x * width,\r\n y: point.y * height\r\n };\r\n }\r\n\r\n return pixelPoints;\r\n};\r\n\r\n\r\n\r\n/**\r\n * 使用重心坐标判断点是否在三角形内 - 来自 gameUtils.js\r\n * @param {Object} point - 待检测的点 {x, y}\r\n * @param {Array} triangle - 三角形的三个顶点\r\n * @returns {boolean} 点是否在三角形内\r\n */\r\nexport const isPointInTriangle = (point, triangle) => {\r\n const [p1, p2, p3] = triangle;\r\n const { x, y } = point;\r\n\r\n // 使用重心坐标系\r\n const denominator = ((p2.y - p3.y) * (p1.x - p3.x) + (p3.x - p2.x) * (p1.y - p3.y));\r\n\r\n if (Math.abs(denominator) < 0.0001) return false; // 退化三角形\r\n\r\n const a = ((p2.y - p3.y) * (x - p3.x) + (p3.x - p2.x) * (y - p3.y)) / denominator;\r\n const b = ((p3.y - p1.y) * (x - p3.x) + (p1.x - p3.x) * (y - p3.y)) / denominator;\r\n const c = 1 - a - b;\r\n\r\n // 点在三角形内当且仅当所有重心坐标都非负\r\n return a >= -0.001 && b >= -0.001 && c >= -0.001;\r\n};\r\n\r\n/**\r\n * 检查两个三角形是否匹配 (顶点相同,顺序可能不同) - 来自 gameUtils.js\r\n * @param {Array} triangle1 - 第一个三角形的顶点数组\r\n * @param {Array} triangle2 - 第二个三角形的顶点数组\r\n * @returns {boolean} 是否匹配\r\n */\r\nexport const trianglesMatch = (triangle1, triangle2) => {\r\n if (!triangle1 || !triangle2) return false;\r\n if (triangle1.length !== 3 || triangle2.length !== 3) return false;\r\n\r\n const names1 = triangle1.map(p => p.name).sort();\r\n const names2 = triangle2.map(p => p.name).sort();\r\n\r\n return names1.every((name, index) => name === names2[index]);\r\n};\r\n\r\n/**\r\n * 比较两个点数组是否包含相同的点(忽略顺序)\r\n * @param {Array} points1 - 第一组点\r\n * @param {Array} points2 - 第二组点\r\n * @returns {boolean} 是否匹配\r\n */\r\nexport const comparePointArrays = (points1, points2) => {\r\n if (!points1 || !points2 || points1.length !== points2.length) {\r\n return false;\r\n }\r\n\r\n const names1 = points1.map(p => p.name).sort();\r\n const names2 = points2.map(p => p.name).sort();\r\n\r\n return names1.join('') === names2.join('');\r\n};\r\n\r\n\r\n\r\n/**\r\n * 获取标准化的三角形连线定义\r\n * @returns {Array} 连线数组\r\n */\r\nexport const getBasicLineDefinitions = () => [\r\n // 大三角形边\r\n { from: 'A', to: 'B' },\r\n { from: 'A', to: 'C' },\r\n { from: 'B', to: 'C' },\r\n \r\n // 第一层分割线\r\n { from: 'D', to: 'E' },\r\n \r\n // 第二层分割线\r\n { from: 'M', to: 'N' },\r\n \r\n // 底边分割线\r\n { from: 'P', to: 'Q' },\r\n \r\n // 连接到顶点的线段\r\n { from: 'A', to: 'D' },\r\n { from: 'A', to: 'E' },\r\n { from: 'A', to: 'M' },\r\n { from: 'A', to: 'N' },\r\n { from: 'A', to: 'P' },\r\n { from: 'A', to: 'Q' },\r\n \r\n // 内部连接线段\r\n { from: 'D', to: 'U' },\r\n { from: 'U', to: 'S' },\r\n { from: 'S', to: 'E' },\r\n { from: 'M', to: 'K' },\r\n { from: 'K', to: 'L' },\r\n { from: 'L', to: 'N' },\r\n \r\n // 到底边的连接\r\n { from: 'B', to: 'P' },\r\n { from: 'P', to: 'Q' },\r\n { from: 'Q', to: 'C' }\r\n];\r\n\r\n/**\r\n * 获取18个宝石的基础定义 - MVP版本\r\n * @returns {Array} 宝石数组\r\n */\r\nexport const getBasicGemDefinitions = () => [\r\n // 大三角形系列(3个)\r\n { id: 'gem_1', vertices: ['A', 'B', 'P'], points: 10, category: 'basic' },\r\n { id: 'gem_2', vertices: ['A', 'P', 'Q'], points: 10, category: 'basic' },\r\n { id: 'gem_3', vertices: ['A', 'Q', 'C'], points: 10, category: 'basic' },\r\n\r\n // 中等三角形系列(3个)\r\n { id: 'gem_4', vertices: ['A', 'B', 'Q'], points: 15, category: 'medium' },\r\n { id: 'gem_5', vertices: ['A', 'P', 'C'], points: 15, category: 'medium' },\r\n { id: 'gem_6', vertices: ['A', 'B', 'C'], points: 20, category: 'large' },\r\n\r\n // ADE区域系列(6个)\r\n { id: 'gem_7', vertices: ['A', 'D', 'U'], points: 12, category: 'ade_small' },\r\n { id: 'gem_8', vertices: ['A', 'U', 'S'], points: 12, category: 'ade_small' },\r\n { id: 'gem_9', vertices: ['A', 'S', 'E'], points: 12, category: 'ade_small' },\r\n { id: 'gem_10', vertices: ['A', 'D', 'S'], points: 18, category: 'ade_medium' },\r\n { id: 'gem_11', vertices: ['A', 'U', 'E'], points: 18, category: 'ade_medium' },\r\n { id: 'gem_12', vertices: ['A', 'D', 'E'], points: 25, category: 'ade_large' },\r\n\r\n // AMN区域系列(6个)\r\n { id: 'gem_13', vertices: ['A', 'M', 'K'], points: 14, category: 'amn_small' },\r\n { id: 'gem_14', vertices: ['A', 'K', 'L'], points: 14, category: 'amn_small' },\r\n { id: 'gem_15', vertices: ['A', 'L', 'N'], points: 14, category: 'amn_small' },\r\n { id: 'gem_16', vertices: ['A', 'M', 'L'], points: 20, category: 'amn_medium' },\r\n { id: 'gem_17', vertices: ['A', 'K', 'N'], points: 20, category: 'amn_medium' },\r\n { id: 'gem_18', vertices: ['A', 'M', 'N'], points: 30, category: 'amn_large' }\r\n];\r\n\r\n// ==================== 几何配置和默认导出 ====================\r\n\r\n/**\r\n * 几何配置常量 - 整合版本\r\n */\r\nexport const GEOMETRY_CONFIG = {\r\n TOTAL_GEMS: 18,\r\n CANVAS_RATIO: 4 / 3,\r\n DEFAULT_VIEWBOX: { width: 700, height: 600 },\r\n POINT_RADIUS: { default: 6, selected: 9 },\r\n TOLERANCE: 0.001,\r\n\r\n // 新增:几何计算相关常量\r\n MIN_TRIANGLE_AREA: 0.001,\r\n COORDINATE_PRECISION: 0.0001,\r\n BARYCENTRIC_TOLERANCE: -0.001\r\n};\r\n\r\n/**\r\n * 默认导出 - 包含所有几何工具函数\r\n */\r\nexport default {\r\n // 基础几何计算\r\n pointOnLine,\r\n calculateGamePoints,\r\n toPixelCoordinates,\r\n\r\n // 三角形验证和分析\r\n isPointInTriangle,\r\n trianglesMatch,\r\n comparePointArrays,\r\n\r\n // 数据和配置 (重新导出数据层接口)\r\n getBasicGemDefinitions,\r\n getBasicLineDefinitions,\r\n GEOMETRY_CONFIG,\r\n\r\n // 🔧 新增:单一数据源访问接口\r\n // getStandardGeometryPoints: calculateGamePoints // 暂时注释掉,需要时再实现\r\n}; ","import { MOCK_USER_DATA, MOCK_JWT_TOKEN } from './mockData';\r\nimport { courseData } from './courseData';\r\n\r\nexport interface UserLessonProgress {\r\n lessonId: string;\r\n status: 'not-started' | 'in-progress' | 'completed';\r\n progressPercentage: number;\r\n lastAccessed?: string;\r\n timeSpent?: number; // 分钟\r\n score?: number; // 分数 0-100\r\n attempts?: number; // 尝试次数\r\n}\r\n\r\nexport interface UserUnitProgress {\r\n unitId: string;\r\n userId: string;\r\n totalLessons: number;\r\n completedLessons: number;\r\n progressPercentage: number;\r\n status: 'not-started' | 'in-progress' | 'completed';\r\n lastAccessed?: string;\r\n lessons: UserLessonProgress[];\r\n}\r\n\r\nexport interface UserCourseProgress {\r\n courseId: string;\r\n userId: string;\r\n totalUnits: number;\r\n completedUnits: number;\r\n progressPercentage: number;\r\n status: 'not-started' | 'in-progress' | 'completed';\r\n lastAccessed?: string;\r\n units: UserUnitProgress[];\r\n}\r\n\r\n// 生成模拟的用户课程进度数据\r\nexport const generateMockUserCourseProgress = (userId: string = MOCK_USER_DATA.id): UserCourseProgress => {\r\n const unitsProgress: UserUnitProgress[] = courseData.units.map((unit, index) => {\r\n // 模拟进度数据 - 根据单元索引设置不同的进度\r\n const baseProgress = Math.min(100, Math.max(0, index * 15 + Math.random() * 20));\r\n const completedLessons = Math.floor((unit.lessons.length * baseProgress) / 100);\r\n\r\n const lessonsProgress: UserLessonProgress[] = unit.lessons.map((lesson, lessonIndex) => {\r\n const lessonProgress = Math.min(100, Math.max(0, baseProgress - (lessonIndex * 10) + Math.random() * 30));\r\n\r\n return {\r\n lessonId: lesson.id,\r\n status: lessonProgress >= 100 ? 'completed' : lessonProgress > 0 ? 'in-progress' : 'not-started',\r\n progressPercentage: Math.round(lessonProgress),\r\n lastAccessed: lessonProgress > 0 ? new Date(Date.now() - Math.random() * 7 * 24 * 60 * 60 * 1000).toISOString() : undefined,\r\n timeSpent: lessonProgress > 0 ? Math.floor(Math.random() * 120 + 10) : undefined,\r\n score: lessonProgress >= 100 ? Math.floor(Math.random() * 21 + 80) : undefined,\r\n attempts: lessonProgress > 0 ? Math.floor(Math.random() * 3 + 1) : undefined\r\n };\r\n });\r\n\r\n return {\r\n unitId: unit.id,\r\n userId,\r\n totalLessons: unit.lessons.length,\r\n completedLessons,\r\n progressPercentage: Math.round(baseProgress),\r\n status: baseProgress >= 100 ? 'completed' : baseProgress > 0 ? 'in-progress' : 'not-started',\r\n lastAccessed: baseProgress > 0 ? new Date(Date.now() - Math.random() * 14 * 24 * 60 * 60 * 1000).toISOString() : undefined,\r\n lessons: lessonsProgress\r\n };\r\n });\r\n\r\n const totalProgress = unitsProgress.reduce((sum, unit) => sum + unit.progressPercentage, 0) / unitsProgress.length;\r\n const completedUnits = unitsProgress.filter(unit => unit.status === 'completed').length;\r\n\r\n return {\r\n courseId: courseData.id,\r\n userId,\r\n totalUnits: unitsProgress.length,\r\n completedUnits,\r\n progressPercentage: Math.round(totalProgress),\r\n status: totalProgress >= 100 ? 'completed' : totalProgress > 0 ? 'in-progress' : 'not-started',\r\n lastAccessed: new Date(Date.now() - Math.random() * 3 * 24 * 60 * 60 * 1000).toISOString(),\r\n units: unitsProgress\r\n };\r\n};\r\n\r\n// 模拟用户课程进度数据\r\nexport const MOCK_USER_COURSE_PROGRESS: UserCourseProgress = generateMockUserCourseProgress();\r\n\r\n// 获取用户课程进度\r\nexport const getUserCourseProgress = (userId: string, courseId: string): UserCourseProgress | null => {\r\n if (userId === MOCK_USER_DATA.id && courseId === courseData.id) {\r\n return MOCK_USER_COURSE_PROGRESS;\r\n }\r\n return null;\r\n};\r\n\r\n// 获取特定单元的进度\r\nexport const getUserUnitProgress = (userId: string, courseId: string, unitId: string): UserUnitProgress | null => {\r\n const courseProgress = getUserCourseProgress(userId, courseId);\r\n if (!courseProgress) return null;\r\n\r\n return courseProgress.units.find(unit => unit.unitId === unitId) || null;\r\n};\r\n\r\n// 获取特定课时的进度\r\nexport const getUserLessonProgress = (userId: string, courseId: string, unitId: string, lessonId: string): UserLessonProgress | null => {\r\n const unitProgress = getUserUnitProgress(userId, courseId, unitId);\r\n if (!unitProgress) return null;\r\n\r\n return unitProgress.lessons.find(lesson => lesson.lessonId === lessonId) || null;\r\n};\r\n\r\n// 更新课时进度\r\nexport const updateUserLessonProgress = (\r\n userId: string,\r\n courseId: string,\r\n unitId: string,\r\n lessonId: string,\r\n progress: Partial<UserLessonProgress>\r\n): boolean => {\r\n // 在实际应用中,这里会调用API更新数据库\r\n // 这里只是模拟更新操作\r\n console.log('Updating lesson progress:', { userId, courseId, unitId, lessonId, progress });\r\n return true;\r\n};","import { MOCK_USER_DATA, MOCK_JWT_TOKEN } from './mockData';\r\nimport { courseData } from './courseData';\r\nimport { getUserCourseProgress } from './userCourseProgress';\r\nimport type { UserUnitProgress } from './userCourseProgress';\r\n\r\nexport interface UserGradeUnitNavItem {\r\n unitId: string;\r\n title: string;\r\n description: string;\r\n moduleCategory: string;\r\n estimatedDuration: string;\r\n totalLessons: number;\r\n completedLessons: number;\r\n progressPercentage: number;\r\n status: 'not-started' | 'in-progress' | 'completed';\r\n lastAccessed?: string;\r\n isActive: boolean;\r\n route: string;\r\n icon?: string;\r\n}\r\n\r\nexport interface UserGradeUnitsNav {\r\n userId: string;\r\n courseId: string;\r\n courseTitle: string;\r\n courseLevel: number;\r\n totalUnits: number;\r\n completedUnits: number;\r\n overallProgress: number;\r\n status: 'not-started' | 'in-progress' | 'completed';\r\n lastAccessed?: string;\r\n units: UserGradeUnitNavItem[];\r\n}\r\n\r\n// 获取用户年级单元导航数据\r\nexport const getUserGradeUnitsNav = (userId: string, courseId: string): UserGradeUnitsNav | null => {\r\n const userProgress = getUserCourseProgress(userId, courseId);\r\n if (!userProgress) return null;\r\n\r\n const unitsNav: UserGradeUnitNavItem[] = courseData.units.map((unit, index) => {\r\n const unitProgress = userProgress.units.find(up => up.unitId === unit.id);\r\n\r\n return {\r\n unitId: unit.id,\r\n title: unit.title,\r\n description: unit.description,\r\n moduleCategory: unit.moduleCategory,\r\n estimatedDuration: unit.estimatedDuration,\r\n totalLessons: unit.lessons.length,\r\n completedLessons: unitProgress?.completedLessons || 0,\r\n progressPercentage: unitProgress?.progressPercentage || 0,\r\n status: unitProgress?.status || 'not-started',\r\n lastAccessed: unitProgress?.lastAccessed,\r\n isActive: index === 0, // 默认第一个单元为活跃状态\r\n route: `/math/grade-${courseData.level}/unit/${unit.id}`\r\n };\r\n });\r\n\r\n return {\r\n userId,\r\n courseId: courseData.id,\r\n courseTitle: courseData.title,\r\n courseLevel: courseData.level,\r\n totalUnits: unitsNav.length,\r\n completedUnits: unitsNav.filter(unit => unit.status === 'completed').length,\r\n overallProgress: userProgress.progressPercentage,\r\n status: userProgress.status,\r\n lastAccessed: userProgress.lastAccessed,\r\n units: unitsNav\r\n };\r\n};\r\n\r\n// 获取特定单元的导航项\r\nexport const getUnitNavItem = (userId: string, courseId: string, unitId: string): UserGradeUnitNavItem | null => {\r\n const navData = getUserGradeUnitsNav(userId, courseId);\r\n if (!navData) return null;\r\n\r\n return navData.units.find(unit => unit.unitId === unitId) || null;\r\n};\r\n\r\n// 更新单元活跃状态\r\nexport const updateUnitActiveStatus = (userId: string, courseId: string, unitId: string, isActive: boolean): boolean => {\r\n // 在实际应用中,这里会更新用户的学习状态\r\n // 这里只是模拟操作\r\n console.log('Updating unit active status:', { userId, courseId, unitId, isActive });\r\n return true;\r\n};\r\n\r\n// 模拟用户年级单元导航数据\r\nexport const MOCK_USER_GRADE_UNITS_NAV: UserGradeUnitsNav = getUserGradeUnitsNav(MOCK_USER_DATA.id, courseData.id)!;","// 用户年级单元进度数据 - 用于 Sidebar 展示组件\r\nimport { MOCK_USER_DATA } from './mockData';\r\nimport { courseData } from './courseData';\r\n\r\nexport interface UnitProgressData {\r\n unitId: string;\r\n title: string;\r\n description: string;\r\n moduleCategory: string;\r\n estimatedDuration: string;\r\n totalLessons: number;\r\n completedLessons: number;\r\n progressPercentage: number;\r\n status: 'not-started' | 'in-progress' | 'completed';\r\n lastAccessed?: string;\r\n isActive: boolean;\r\n route: string;\r\n icon?: string;\r\n}\r\n\r\nexport interface UserGradeUnitsProgressData {\r\n userId: string;\r\n courseId: string;\r\n courseTitle: string;\r\n courseLevel: number;\r\n totalUnits: number;\r\n completedUnits: number;\r\n overallProgress: number;\r\n status: 'not-started' | 'in-progress' | 'completed';\r\n lastAccessed?: string;\r\n units: UnitProgressData[];\r\n}\r\n\r\n// 模拟用户年级单元进度数据 - 用于 Sidebar 展示组件\r\n// 此数据仅用于展示,不包含任何业务逻辑或API调用\r\n\r\nexport const MOCK_USER_GRADE_UNITS_PROGRESS: UserGradeUnitsProgressData = {\r\n userId: MOCK_USER_DATA.id,\r\n courseId: courseData.id,\r\n courseTitle: courseData.title,\r\n courseLevel: courseData.level,\r\n totalUnits: courseData.units.length,\r\n completedUnits: 3,\r\n overallProgress: 45,\r\n status: 'in-progress',\r\n lastAccessed: '2024-01-15T10:30:00Z',\r\n units: [\r\n {\r\n unitId: 'unit_1',\r\n title: '小数乘法',\r\n description: '学习小数乘法的计算方法及应用',\r\n moduleCategory: 'Arithmetic and Algebra',\r\n estimatedDuration: '3周',\r\n totalLessons: 10,\r\n completedLessons: 8,\r\n progressPercentage: 80,\r\n status: 'completed',\r\n lastAccessed: '2024-01-10T14:20:00Z',\r\n isActive: false,\r\n route: '/math/grade-5/unit/unit_1',\r\n icon: '🔢'\r\n },\r\n {\r\n unitId: 'unit_2',\r\n title: '小数除法',\r\n description: '学习小数除法的计算方法及应用',\r\n moduleCategory: 'Arithmetic and Algebra',\r\n estimatedDuration: '3周',\r\n totalLessons: 12,\r\n completedLessons: 6,\r\n progressPercentage: 50,\r\n status: 'in-progress',\r\n lastAccessed: '2024-01-15T10:30:00Z',\r\n isActive: true,\r\n route: '/math/grade-5/unit/unit_2',\r\n icon: '➗'\r\n },\r\n {\r\n unitId: 'unit_3',\r\n title: '简易方程',\r\n description: '学习用字母表示数和解简易方程',\r\n moduleCategory: 'Arithmetic and Algebra',\r\n estimatedDuration: '4周',\r\n totalLessons: 14,\r\n completedLessons: 2,\r\n progressPercentage: 14,\r\n status: 'in-progress',\r\n lastAccessed: '2024-01-12T16:45:00Z',\r\n isActive: false,\r\n route: '/math/grade-5/unit/unit_3',\r\n icon: '📝'\r\n },\r\n {\r\n unitId: 'unit_4',\r\n title: '多边形的面积',\r\n description: '学习平行四边形、三角形、梯形和组合图形的面积计算',\r\n moduleCategory: 'Graphics and Geometry',\r\n estimatedDuration: '3周',\r\n totalLessons: 12,\r\n completedLessons: 0,\r\n progressPercentage: 0,\r\n status: 'not-started',\r\n isActive: false,\r\n route: '/math/grade-5/unit/unit_4',\r\n icon: '📐'\r\n },\r\n {\r\n unitId: 'unit_5',\r\n title: '因数与倍数',\r\n description: '学习因数、倍数、质数、合数等概念',\r\n moduleCategory: 'Arithmetic and Algebra',\r\n estimatedDuration: '3周',\r\n totalLessons: 10,\r\n completedLessons: 0,\r\n progressPercentage: 0,\r\n status: 'not-started',\r\n isActive: false,\r\n route: '/math/grade-5/unit/unit_5',\r\n icon: '🔢'\r\n },\r\n {\r\n unitId: 'unit_6',\r\n title: '长方体和正方体',\r\n description: '学习长方体和正方体的特征、表面积和体积计算',\r\n moduleCategory: 'Graphics and Geometry',\r\n estimatedDuration: '4周',\r\n totalLessons: 14,\r\n completedLessons: 0,\r\n progressPercentage: 0,\r\n status: 'not-started',\r\n isActive: false,\r\n route: '/math/grade-5/unit/unit_6',\r\n icon: '📦'\r\n },\r\n {\r\n unitId: 'unit_7',\r\n title: '分数的意义和性质',\r\n description: '学习分数的意义、性质和约分、通分等方法',\r\n moduleCategory: 'Arithmetic and Algebra',\r\n estimatedDuration: '4周',\r\n totalLessons: 16,\r\n completedLessons: 0,\r\n progressPercentage: 0,\r\n status: 'not-started',\r\n isActive: false,\r\n route: '/math/grade-5/unit/unit_7',\r\n icon: '½'\r\n },\r\n {\r\n unitId: 'unit_8',\r\n title: '分数的加法和减法',\r\n description: '学习同分母分数、异分母分数的加法和减法',\r\n moduleCategory: 'Arithmetic and Algebra',\r\n estimatedDuration: '3周',\r\n totalLessons: 12,\r\n completedLessons: 0,\r\n progressPercentage: 0,\r\n status: 'not-started',\r\n isActive: false,\r\n route: '/math/grade-5/unit/unit_8',\r\n icon: '➕'\r\n },\r\n {\r\n unitId: 'unit_9',\r\n title: '折线统计图',\r\n description: '学习单式折线统计图和复式折线统计图的认识和制作',\r\n moduleCategory: 'Probability and Statistics',\r\n estimatedDuration: '2周',\r\n totalLessons: 6,\r\n completedLessons: 0,\r\n progressPercentage: 0,\r\n status: 'not-started',\r\n isActive: false,\r\n route: '/math/grade-5/unit/unit_9',\r\n icon: '📊'\r\n }\r\n ]\r\n};"],"names":["f","require$$0","k","l","m","n","p","q","c","a","g","b","d","e","h","reactJsxRuntime_production_min","React","REACT_ELEMENT_TYPE","REACT_PORTAL_TYPE","REACT_FRAGMENT_TYPE","REACT_STRICT_MODE_TYPE","REACT_PROFILER_TYPE","REACT_PROVIDER_TYPE","REACT_CONTEXT_TYPE","REACT_FORWARD_REF_TYPE","REACT_SUSPENSE_TYPE","REACT_SUSPENSE_LIST_TYPE","REACT_MEMO_TYPE","REACT_LAZY_TYPE","REACT_OFFSCREEN_TYPE","MAYBE_ITERATOR_SYMBOL","FAUX_ITERATOR_SYMBOL","getIteratorFn","maybeIterable","maybeIterator","ReactSharedInternals","error","format","_len2","args","_key2","printWarning","level","ReactDebugCurrentFrame","stack","argsWithFormat","item","enableScopeAPI","enableCacheElement","enableTransitionTracing","enableLegacyHidden","enableDebugTracing","REACT_MODULE_REFERENCE","isValidElementType","type","getWrappedName","outerType","innerType","wrapperName","displayName","functionName","getContextName","getComponentNameFromType","context","provider","outerName","lazyComponent","payload","init","assign","disabledDepth","prevLog","prevInfo","prevWarn","prevError","prevGroup","prevGroupCollapsed","prevGroupEnd","disabledLog","disableLogs","props","reenableLogs","ReactCurrentDispatcher","prefix","describeBuiltInComponentFrame","name","source","ownerFn","x","match","reentry","componentFrameCache","PossiblyWeakMap","describeNativeComponentFrame","fn","construct","frame","control","previousPrepareStackTrace","previousDispatcher","Fake","sample","sampleLines","controlLines","s","_frame","syntheticFrame","describeFunctionComponentFrame","shouldConstruct","Component","prototype","describeUnknownElementTypeFrameInDEV","hasOwnProperty","loggedTypeFailures","setCurrentlyValidatingElement","element","owner","checkPropTypes","typeSpecs","values","location","componentName","has","typeSpecName","error$1","err","ex","isArrayImpl","isArray","typeName","value","hasToStringTag","willCoercionThrow","testStringCoercion","checkKeyStringCoercion","ReactCurrentOwner","RESERVED_PROPS","specialPropKeyWarningShown","specialPropRefWarningShown","hasValidRef","config","getter","hasValidKey","warnIfStringRefCannotBeAutoConverted","self","defineKeyPropWarningGetter","warnAboutAccessingKey","defineRefPropWarningGetter","warnAboutAccessingRef","ReactElement","key","ref","jsxDEV","maybeKey","propName","defaultProps","ReactCurrentOwner$1","ReactDebugCurrentFrame$1","setCurrentlyValidatingElement$1","propTypesMisspellWarningShown","isValidElement","object","getDeclarationErrorAddendum","getSourceInfoErrorAddendum","ownerHasKeyUseWarning","getCurrentComponentErrorInfo","parentType","info","parentName","validateExplicitKey","currentComponentErrorInfo","childOwner","validateChildKeys","node","i","child","iteratorFn","iterator","step","validatePropTypes","propTypes","_name","validateFragmentProps","fragment","keys","didWarnAboutKeySpread","jsxWithValidation","isStaticChildren","validType","sourceInfo","typeString","children","beforeExample","afterExample","jsxWithValidationStatic","jsxWithValidationDynamic","jsx","jsxs","reactJsxRuntime_development","jsxRuntimeModule","require$$1","Button","progress","variant","size","radius","className","loading","colorClass","buttonClasses","toKebabCase","string","toCamelCase","p1","p2","toPascalCase","camelCase","mergeClasses","classes","index","array","hasA11yProp","prop","defaultAttributes","Icon","forwardRef","color","strokeWidth","absoluteStrokeWidth","iconNode","rest","createElement","tag","attrs","createLucideIcon","iconName","ArrowRight","ChevronDown","ChevronRight","getButtonText","calculateLessonProgress","knowledgeItems","totalProgress","sum","KnowledgeCard","knowledgeItem","onLearnAction","handleLearnClick","Card","CardBody","CardFooter","Progress","LessonItem","lesson","isExpanded","onToggle","handleToggle","lessonProgress","ContentAccordion","unit","activeLessonIds","onToggleLesson","emptyState","getProgressColor","status","Sidebar","data","collapsed","onToggleCollapse","activeUnitId","onUnitSelect","renderUnitItem","unitItemClassName","style","unitItemStyle","handleUnitSelect","unitId","event","handleToggleCollapse","renderDefaultUnitItem","renderContent","Fragment","Submenu","trigger","items","position","alignment","openDelay","closeDelay","onOpen","onClose","renderItem","itemConfig","menuClassName","itemClassName","isOpen","setIsOpen","openTimeoutRef","closeTimeoutRef","clearTimeouts","handleMouseEnter","handleMouseLeave","handleItemClick","defaultRenderItem","getPanelClasses","bind","thisArg","toString","getPrototypeOf","toStringTag","kindOf","cache","thing","str","kindOfTest","typeOfTest","isUndefined","isBuffer","val","isFunction","isArrayBuffer","isArrayBufferView","result","isString","isNumber","isObject","isBoolean","isPlainObject","isEmptyObject","isDate","isFile","isBlob","isFileList","isStream","isFormData","kind","isURLSearchParams","isReadableStream","isRequest","isResponse","isHeaders","trim","forEach","obj","allOwnKeys","len","findKey","_key","_global","isContextDefined","merge","caseless","skipUndefined","assignValue","targetKey","extend","stripBOM","content","inherits","constructor","superConstructor","descriptors","toFlatObject","sourceObj","destObj","filter","propFilter","merged","endsWith","searchString","lastIndex","toArray","arr","isTypedArray","TypedArray","forEachEntry","_iterator","pair","matchAll","regExp","matches","isHTMLForm","isRegExp","reduceDescriptors","reducer","reducedDescriptors","descriptor","ret","freezeMethods","toObjectSet","arrayOrString","delimiter","define","noop","toFiniteNumber","defaultValue","isSpecCompliantForm","toJSONObject","visit","target","reducedValue","isAsyncFn","isThenable","_setImmediate","setImmediateSupported","postMessageSupported","token","callbacks","cb","asap","utils$1","AxiosError","message","code","request","response","utils","customProps","axiosError","msg","errCode","httpAdapter","isVisitable","removeBrackets","renderKey","path","dots","isFlatArray","predicates","toFormData","formData","options","option","metaTokens","visitor","defaultVisitor","indexes","useBlob","convertValue","el","exposedHelpers","build","encode","charMap","AxiosURLSearchParams","params","encoder","_encode","buildURL","url","serializeFn","serializedParams","hashmarkIndex","InterceptorManager","fulfilled","rejected","id","transitionalDefaults","platform$1","hasBrowserEnv","_navigator","hasStandardBrowserEnv","hasStandardBrowserWebWorkerEnv","origin","platform","toURLEncodedForm","helpers","parsePropPath","arrayToObject","formDataToJSON","buildPath","isNumericKey","isLast","stringifySafely","rawValue","parser","defaults","headers","contentType","hasJSONContentType","isObjectPayload","_FormData","transitional","forcedJSONParsing","JSONRequested","strictJSONParsing","method","ignoreDuplicateOf","parseHeaders","rawHeaders","parsed","line","$internals","normalizeHeader","header","normalizeValue","parseTokens","tokens","tokensRE","isValidHeaderName","matchHeaderValue","isHeaderNameFilter","formatHeader","w","char","buildAccessors","accessorName","methodName","arg1","arg2","arg3","AxiosHeaders$1","valueOrRewrite","rewrite","setHeader","_value","_header","_rewrite","lHeader","setHeaders","dest","entry","matcher","deleted","deleteHeader","normalized","targets","asStrings","first","computed","accessors","defineAccessor","AxiosHeaders","mapped","headerValue","transformData","fns","isCancel","CanceledError","settle","resolve","reject","validateStatus","parseProtocol","speedometer","samplesCount","min","bytes","timestamps","head","tail","firstSampleTS","chunkLength","now","startedAt","bytesCount","passed","throttle","freq","timestamp","threshold","lastArgs","timer","invoke","progressEventReducer","listener","isDownloadStream","bytesNotified","_speedometer","loaded","total","progressBytes","rate","inRange","progressEventDecorator","throttled","lengthComputable","asyncDecorator","isURLSameOrigin","isMSIE","cookies","expires","domain","secure","cookie","isAbsoluteURL","combineURLs","baseURL","relativeURL","buildFullPath","requestedURL","allowAbsoluteUrls","isRelativeUrl","headersToObject","mergeConfig","config1","config2","getMergedValue","mergeDeepProperties","valueFromConfig2","defaultToConfig2","mergeDirectKeys","mergeMap","configValue","resolveConfig","newConfig","withXSRFToken","xsrfHeaderName","xsrfCookieName","auth","formHeaders","allowedHeaders","xsrfValue","xhrAdapter","_config","requestData","requestHeaders","responseType","onUploadProgress","onDownloadProgress","onCanceled","uploadThrottled","downloadThrottled","flushUpload","flushDownload","done","onloadend","responseHeaders","timeoutErrorMessage","cancel","protocol","composeSignals","signals","timeout","length","controller","aborted","onabort","reason","unsubscribe","signal","streamChunk","chunk","chunkSize","pos","end","readBytes","iterable","readStream","stream","reader","trackStream","onProgress","onFinish","_onFinish","loadedBytes","DEFAULT_CHUNK_SIZE","globalFetchAPI","Request","Response","ReadableStream","TextEncoder","test","factory","env","envFetch","isFetchSupported","isRequestSupported","isResponseSupported","isReadableStreamSupported","encodeText","supportsRequestStream","duplexAccessed","hasContentType","supportsResponseStream","resolvers","res","getBodyLength","body","resolveBodyLength","cancelToken","withCredentials","fetchOptions","_fetch","composedSignal","requestContentLength","_request","contentTypeHeader","flush","isCredentialsSupported","resolvedOptions","isStreamResponse","responseContentLength","responseData","seedCache","getFetch","fetch","seeds","seed","map","knownAdapters","fetchAdapter.getFetch","renderReason","isResolvedHandle","adapter","adapters","nameOrAdapter","rejectedReasons","reasons","state","throwIfCancellationRequested","dispatchRequest","VERSION","validators","deprecatedWarnings","validator","version","formatMessage","opt","desc","opts","correctSpelling","assertOptions","schema","allowUnknown","Axios$1","instanceConfig","configOrUrl","dummy","paramsSerializer","contextHeaders","requestInterceptorChain","synchronousRequestInterceptors","interceptor","responseInterceptorChain","promise","chain","onFulfilled","onRejected","fullPath","Axios","generateHTTPMethod","isForm","CancelToken$1","CancelToken","executor","resolvePromise","onfulfilled","_resolve","abort","spread","callback","isAxiosError","HttpStatusCode","createInstance","defaultConfig","instance","axios","promises","all","Cancel","formToJSON","getAdapter","UserIcon","SettingsIcon","HelpIcon","LogoutIcon","DEFAULT_MENU_ITEMS","UserProfile","userId","initialUserName","initialUserAvatar","apiConfig","menuItems","avatarSize","isLoading","avatarClassName","userNameClassName","containerClassName","onMenuOpen","onMenuClose","onMenuItemClick","onLogout","renderMenuItem","renderUserInfo","userData","setUserData","setLoading","errorState","setErrorState","fetchUserData","endpoint","handleMenuItemClick","handleMenuOpen","handleMenuClose","renderDefaultUserInfo","Avatar","defaultRenderExploreItem","MathWizHeader","logoHref","logoText","onLogoClick","exploreItems","exploreMenuOpen","onExploreMenuToggle","onExploreItemClick","renderExploreItem","userMenuItems","onUserMenuItemClick","headerClassName","logoClassName","exploreClassName","userProfileClassName","background","height","gradientFrom","gradientTo","gradientVia","logoColor","logoSize","exploreButtonVariant","exploreButtonColor","ariaLabel","ariaLabelledBy","restProps","preparedExploreItems","headerClassNames","logoClassNames","exploreButtonClassNames","headerStyles","MathWizHeader$1","prevProps","nextProps","RadarChart","abilities","width","calculateRadarPoints","ability","angle","y","calculateAxisEndPoints","x2","y2","calculateLabelPosition","textAnchor","_","createStoreImpl","createState","listeners","setState","partial","replace","nextState","previousState","getState","api","initialState","createStore","identity","arg","useStore","selector","slice","createImpl","useBoundStore","create","mockRadarAbilityData","RadarAbilityService","feedback","useRadarAbilityStore","set","get","radarData","errorMessage","AbilityProgressBar","percentage","PersonalizedAdvicePanel","generalRecommendation","RecommendationCard","customLinkTexts","getLinkText","abilityName","defaultLinkTexts","AbilityAssessmentDashboard","fetchData","useEffect","styles","categoryIcons","statusMapping","statusColors","MOCK_USER_DATA","MOCK_EXPLORE_ITEMS","MOCK_JWT_TOKEN","courseData","CourseService","courseId","gradeId","progressUpdates","lessonId","courseService","ApiDataSource","operation","lastError","attempt","ms","MockDataSource","update","lessonsData","DataSourceFactory","customDataSourceClass","instanceKey","dataSource","isBrowser","isDevelopment","isTest","useMock","createDefaultDataSource","createGradeUnitBrowserConfig","fallbackStrategy","errorHandling","performance","theme","debug","enableDevTools","mergeConfigs","baseConfig","overrideConfig","GradeUnitBrowserContext","createContext","useGradeUnitBrowser","useContext","GradeUnitBrowserProvider","providedConfig","setConfig","useState","userInfo","setUserInfo","exploreMenu","setExploreMenu","unitsData","setUnitsData","lessons","setLessons","setError","setActiveUnitId","setActiveLessonIds","loadPageData","useCallback","userProfile","exploreMenuData","mockUnitsData","toggleLesson","prev","setActiveUnit","updateConfig","updates","prevConfig","activeUnit","defaultActiveUnit","contextValue","GradeUnitBrowserPageContent","propUserInfo","propExploreMenu","contextUserInfo","contextExploreMenu","activeUnitNav","debugActiveUnit","GradeUnitBrowserPage","pointOnLine","ratio","calculateGamePoints","A","B","C","D","E","M","N","P","Q","U","S","K","L","toPixelCoordinates","normalizedPoints","pixelPoints","point","isPointInTriangle","triangle","p3","denominator","trianglesMatch","triangle1","triangle2","names1","names2","comparePointArrays","points1","points2","getBasicLineDefinitions","getBasicGemDefinitions","GEOMETRY_CONFIG","generateMockUserCourseProgress","unitsProgress","baseProgress","completedLessons","lessonsProgress","lessonIndex","completedUnits","MOCK_USER_COURSE_PROGRESS","getUserCourseProgress","getUserUnitProgress","courseProgress","getUserLessonProgress","unitProgress","updateUserLessonProgress","getUserGradeUnitsNav","userProgress","unitsNav","up","getUnitNavItem","navData","updateUnitActiveStatus","isActive","MOCK_USER_GRADE_UNITS_NAV","MOCK_USER_GRADE_UNITS_PROGRESS"],"mappings":"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","x_google_ignoreList":[0,1,2,4,5,6,7,8,9,10,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,69,70]}