diff --git a/package.json b/package.json index 6e868ca..619d582 100644 --- a/package.json +++ b/package.json @@ -21,6 +21,7 @@ "@emotion/styled": "^11.14.1", "@mui/icons-material": "^9.0.0", "@mui/material": "^9.0.0", + "@mui/x-date-pickers": "^9.0.2", "@react-pdf/renderer": "^3.1.11", "@sentry/react": "^8.32.0", "@sentry/webpack-plugin": "^2.22.4", @@ -43,6 +44,7 @@ "file-saver": "^2.0.2", "final-form": "^4.20.7", "font-awesome": "^4.7.0", + "formik": "^2.4.9", "history": "^4.7.2", "html-webpack-plugin": "^5.5.0", "i18n-react": "^0.6.4", @@ -58,7 +60,7 @@ "mini-css-extract-plugin": "^2.6.0", "moment": "^2.22.2", "moment-timezone": "^0.5.21", - "openstack-uicore-foundation": "4.2.27", + "openstack-uicore-foundation": "5.0.9", "path-browserify": "^1.0.1", "process": "^0.11.10", "prop-types": "^15.7.2", diff --git a/src/app.js b/src/app.js index efd66a2..a200874 100644 --- a/src/app.js +++ b/src/app.js @@ -23,7 +23,7 @@ import LogInCallbackRoute from './routes/login-callback-route' import DefaultRoute from "./routes/default-route"; import SummitLayout from './layouts/summit-layout'; import LandingLayout from './layouts/landing-layout'; -import {AjaxLoader} from "openstack-uicore-foundation/lib/components"; +import AjaxLoader from "openstack-uicore-foundation/lib/components/ajaxloader"; import {resetLoading} from "openstack-uicore-foundation/lib/utils/actions"; import {doLogout, onUserAuth, getUserInfo} from 'openstack-uicore-foundation/lib/security/actions'; import {initLogOut, doLoginBasicLogin, getIdToken} from 'openstack-uicore-foundation/lib/security/methods'; @@ -41,8 +41,7 @@ import URI from "urijs"; import { putOnLocalStorage } from "openstack-uicore-foundation/lib/utils/methods"; import {BACK_URL} from "./utils/constants"; -import * as Sentry from "@sentry/react"; -import {SentryFallbackFunction} from './components/SentryErrorComponent'; +import SentryErrorBoundary from "./components/SentryErrorBoundary"; // here is set by default user lang as en let language = localStorage.getItem("PREFERRED_LANGUAGE"); @@ -144,29 +143,8 @@ const App = ({isLoggedUser, onUserAuth, doLogout, getUserInfo, loading, ...props profile_pic = jwt.payload.picture; } - if (window.SENTRY_DSN && window.SENTRY_DSN !== "" && sentryInitialized === false) { - console.log("app init sentry ...") - // Initialize Sentry - Sentry.init({ - dsn: window.SENTRY_DSN, - integrations: [ - Sentry.browserTracingIntegration(), - Sentry.replayIntegration(), - ], - // Set tracesSampleRate to 1.0 to capture 100% - // of transactions for performance monitoring. - tracesSampleRate: window.SENTRY_TRACE_SAMPLE_RATE, - // Set 'tracePropagationTargets' to control for which URLs distributed tracing should be enabled - tracePropagationTargets: ["localhost"], - // Session Replay - replaysSessionSampleRate: 0.1, // This sets the sample rate at 10%. You may want to change it to 100% while in development and then sample at a lower rate in production. - replaysOnErrorSampleRate: 1.0, // If you're not already sampling the entire session, change the sample rate to 100% when sampling sessions where errors occur. - }); - setSentryInitialized(true); - } - return ( - + @@ -209,7 +187,7 @@ const App = ({isLoggedUser, onUserAuth, doLogout, getUserInfo, loading, ...props - + ); } diff --git a/src/components/SentryErrorBoundary.js b/src/components/SentryErrorBoundary.js new file mode 100644 index 0000000..60d7f59 --- /dev/null +++ b/src/components/SentryErrorBoundary.js @@ -0,0 +1,37 @@ +import React, { Component } from "react"; +import { SentryFallbackFunction } from "./SentryErrorComponent"; + +class SentryErrorBoundary extends Component { + constructor(props) { + super(props); + this.state = { ErrorBoundary: null }; + } + + componentDidMount() { + if (window.SENTRY_DSN && window.SENTRY_DSN !== "") { + import("../sentry-init").then(({ initSentry }) => { + const Sentry = initSentry(); + this.setState({ ErrorBoundary: Sentry.ErrorBoundary }); + }); + } + } + + render() { + const { ErrorBoundary } = this.state; + const { children, componentName } = this.props; + + if (ErrorBoundary) { + return ( + + {children} + + ); + } + + return children; + } +} + +export default SentryErrorBoundary; \ No newline at end of file diff --git a/src/components/affiliationstable/AffiliationsTable.js b/src/components/affiliationstable/AffiliationsTable.js index f30454e..d5a6153 100644 --- a/src/components/affiliationstable/AffiliationsTable.js +++ b/src/components/affiliationstable/AffiliationsTable.js @@ -1,7 +1,8 @@ import React from 'react'; import { connect } from 'react-redux'; import AffiliationsActionsTableCell from './AffiliationsActionsTableCell'; -import { OrganizationInput, DateTimePicker } from 'openstack-uicore-foundation/lib/components' +import DateTimePicker from 'openstack-uicore-foundation/lib/components/inputs/datetimepicker'; +import OrganizationInput from 'openstack-uicore-foundation/lib/components/inputs/organization-input'; import { epochToMoment, formatEpoch } from 'openstack-uicore-foundation/lib//utils/methods' import { addAffiliation, saveAffiliation, deleteAffiliation } from "../../actions/member-actions" import T from "i18n-react/dist/i18n-react"; diff --git a/src/components/clock.js b/src/components/clock.js index 48ab5bb..4fe6251 100644 --- a/src/components/clock.js +++ b/src/components/clock.js @@ -12,7 +12,7 @@ **/ import React from 'react'; -import { Clock } from "openstack-uicore-foundation/lib/components"; +import Clock from "openstack-uicore-foundation/lib/components/clock"; import { updateClock } from '../actions/clock-actions'; import { connect } from 'react-redux'; diff --git a/src/components/inputs/questions-input.js b/src/components/inputs/questions-input.js index 2e334d0..6222516 100644 --- a/src/components/inputs/questions-input.js +++ b/src/components/inputs/questions-input.js @@ -13,7 +13,11 @@ import React from 'react'; import 'awesome-bootstrap-checkbox/awesome-bootstrap-checkbox.css' -import {Input, Dropdown, RadioList, CheckboxList, RawHTML} from 'openstack-uicore-foundation/lib/components' +import Input from 'openstack-uicore-foundation/lib/components/inputs/text-input'; +import Dropdown from 'openstack-uicore-foundation/lib/components/inputs/dropdown'; +import RadioList from 'openstack-uicore-foundation/lib/components/inputs/radio-list'; +import CheckboxList from 'openstack-uicore-foundation/lib/components/inputs/checkbox-list'; +import RawHTML from 'openstack-uicore-foundation/lib/components/raw-html'; import {EXTRA_QUESTION_MAX_LENGTH} from "../../utils/constants"; export default class QuestionsInput extends React.Component { diff --git a/src/components/presentation-review-form.js b/src/components/presentation-review-form.js index 213f0f9..f8c3d15 100644 --- a/src/components/presentation-review-form.js +++ b/src/components/presentation-review-form.js @@ -14,7 +14,7 @@ import React from 'react' import 'awesome-bootstrap-checkbox/awesome-bootstrap-checkbox.css' import SubmitButtons from "./presentation-submit-buttons"; -import { RawHTML } from 'openstack-uicore-foundation/lib/components' +import RawHTML from 'openstack-uicore-foundation/lib/components/raw-html' import T from "i18n-react/dist/i18n-react"; import {getMarketingValue} from "./marketing-setting"; diff --git a/src/components/presentation-speakers-form.js b/src/components/presentation-speakers-form.js index cbbacec..ec6507a 100644 --- a/src/components/presentation-speakers-form.js +++ b/src/components/presentation-speakers-form.js @@ -14,7 +14,8 @@ import React from 'react' import 'awesome-bootstrap-checkbox/awesome-bootstrap-checkbox.css' import SubmitButtons from "./presentation-submit-buttons"; -import { Exclusive, Dropdown } from 'openstack-uicore-foundation/lib/components' +import Exclusive from 'openstack-uicore-foundation/lib/components/exclusive-wrapper'; +import Dropdown from 'openstack-uicore-foundation/lib/components/inputs/dropdown'; import T from "i18n-react/dist/i18n-react"; import CPFSpeakerInput from './inputs/speaker-input' import Swal from "sweetalert2"; diff --git a/src/components/presentation-summary-form.js b/src/components/presentation-summary-form.js index b01193d..3b5a40d 100644 --- a/src/components/presentation-summary-form.js +++ b/src/components/presentation-summary-form.js @@ -14,7 +14,13 @@ import React, {useState, useEffect} from 'react' import T from 'i18n-react/dist/i18n-react' import 'awesome-bootstrap-checkbox/awesome-bootstrap-checkbox.css' -import {Dropdown, Input, RadioList, RawHTML, TextArea, TextEditor, Exclusive} from 'openstack-uicore-foundation/lib/components' +import Dropdown from 'openstack-uicore-foundation/lib/components/inputs/dropdown'; +import Input from 'openstack-uicore-foundation/lib/components/inputs/text-input'; +import RadioList from 'openstack-uicore-foundation/lib/components/inputs/radio-list'; +import RawHTML from 'openstack-uicore-foundation/lib/components/raw-html'; +import TextArea from 'openstack-uicore-foundation/lib/components/inputs/textarea-input'; +import TextEditor from 'openstack-uicore-foundation/lib/components/inputs/editor-input'; +import Exclusive from 'openstack-uicore-foundation/lib/components/exclusive-wrapper'; import SubmitButtons from './presentation-submit-buttons' import {scrollToError, validate} from '../utils/methods' import QuestionsInput from '../components/inputs/questions-input' diff --git a/src/components/presentation-uploads-form.js b/src/components/presentation-uploads-form.js index 56a1f6a..a9ac66a 100644 --- a/src/components/presentation-uploads-form.js +++ b/src/components/presentation-uploads-form.js @@ -13,7 +13,8 @@ import React from 'react' import 'awesome-bootstrap-checkbox/awesome-bootstrap-checkbox.css' -import {RawHTML, UploadInputV2} from 'openstack-uicore-foundation/lib/components' +import RawHTML from 'openstack-uicore-foundation/lib/components/raw-html'; +import UploadInputV2 from 'openstack-uicore-foundation/lib/components/inputs/upload-input-v2'; import {findElementPos} from 'openstack-uicore-foundation/lib/utils/methods' import SubmitButtons from './presentation-submit-buttons' import {scrollToError} from '../utils/methods' diff --git a/src/components/speaker-form.js b/src/components/speaker-form.js index 4a69794..a54ecd1 100644 --- a/src/components/speaker-form.js +++ b/src/components/speaker-form.js @@ -17,7 +17,15 @@ import 'awesome-bootstrap-checkbox/awesome-bootstrap-checkbox.css' import {findElementPos} from 'openstack-uicore-foundation/lib/utils/methods' import AffiliationsTable from './affiliationstable' import PresentationLinks from "./inputs/presentation-links"; -import { Input, TextEditor, UploadInput, Exclusive, CountryInput, LanguageInput, CheckboxList, FreeMultiTextInput, RegistrationCompanyInput } from 'openstack-uicore-foundation/lib/components' +import Input from 'openstack-uicore-foundation/lib/components/inputs/text-input'; +import TextEditor from 'openstack-uicore-foundation/lib/components/inputs/editor-input'; +import UploadInput from 'openstack-uicore-foundation/lib/components/inputs/upload-input'; +import Exclusive from 'openstack-uicore-foundation/lib/components/exclusive-wrapper'; +import CountryInput from 'openstack-uicore-foundation/lib/components/inputs/country-input'; +import LanguageInput from 'openstack-uicore-foundation/lib/components/inputs/language-input'; +import CheckboxList from 'openstack-uicore-foundation/lib/components/inputs/checkbox-list'; +import FreeMultiTextInput from 'openstack-uicore-foundation/lib/components/inputs/free-multi-text-input'; +import RegistrationCompanyInput from 'openstack-uicore-foundation/lib/components/inputs/registration-company-input'; import {validate, scrollToError} from "../utils/methods"; diff --git a/src/layouts/all-plans-layout.js b/src/layouts/all-plans-layout.js index 97aa78b..e4dcf16 100644 --- a/src/layouts/all-plans-layout.js +++ b/src/layouts/all-plans-layout.js @@ -11,18 +11,29 @@ * limitations under the License. **/ -import React from 'react' -import {connect} from 'react-redux'; -import {Switch, Route, Redirect} from 'react-router-dom'; -import {getAllFromSummit} from '../actions/base-actions'; -import AllSelectionPlansPage from "../pages/all-selection-plans-page"; +import React, { Suspense } from 'react' +import { connect } from 'react-redux'; +import { Switch, Route, Redirect } from 'react-router-dom'; +import AjaxLoader from "openstack-uicore-foundation/lib/components/ajaxloader"; +import { getAllFromSummit } from '../actions/base-actions'; import NavMenu from "../components/nav-menu"; -import SelectionPlanLayout from "./selection-plan-layout"; -import ProfilePage from "../pages/profile-page"; -import SelectionProcessPage from "../pages/selection-process-page"; -import TracksGuidePage from "../pages/tracks-guide-page"; -const AllPlansLayout = ({summit, location, match, speaker, member}) => { +const SelectionPlanLayout = React.lazy(() => import("./selection-plan-layout")); + +const AllSelectionPlansPage = React.lazy(() => + import("../pages/all-selection-plans-page") +); +const ProfilePage = React.lazy(() => + import("../pages/profile-page") +); +const SelectionProcessPage = React.lazy(() => + import("../pages/selection-process-page") +); +const TracksGuidePage = React.lazy(() => + import("../pages/tracks-guide-page") +); + +const AllPlansLayout = ({ summit, location, match, speaker, member }) => { const loggedUser = (speaker && speaker.id) ? speaker : member; const getActiveMenu = () => { if (location.pathname.includes('presentations')) { @@ -40,18 +51,20 @@ const AllPlansLayout = ({summit, location, match, speaker, member}) => {
- +
- - - - - } /> - } /> - ()}/> - + }> + + + + + } /> + } /> + ()} /> + +
@@ -60,11 +73,11 @@ const AllPlansLayout = ({summit, location, match, speaker, member}) => { } -const mapStateToProps = ({baseState, loggedUserState}) => ({ +const mapStateToProps = ({ baseState, loggedUserState }) => ({ member: loggedUserState.member, speaker: baseState.speaker, summit: baseState.summit, loading: baseState.loading }) -export default connect(mapStateToProps, {getAllFromSummit})(AllPlansLayout); +export default connect(mapStateToProps, { getAllFromSummit })(AllPlansLayout); diff --git a/src/layouts/landing-layout.js b/src/layouts/landing-layout.js index 21711e1..f9b8f97 100644 --- a/src/layouts/landing-layout.js +++ b/src/layouts/landing-layout.js @@ -11,29 +11,33 @@ * limitations under the License. **/ -import React from 'react' -import {Switch, Route, Redirect} from 'react-router-dom'; -import LandingPage from "../pages/landing-page"; +import React, { Suspense } from 'react' +import { Switch, Route, Redirect } from 'react-router-dom'; import URI from "urijs"; -import {BACK_URL} from "../utils/constants"; +import AjaxLoader from "openstack-uicore-foundation/lib/components/ajaxloader"; +import { BACK_URL } from "../utils/constants"; -const LandingLayout = ({match, ...parentProps}) => { +const LandingPage = React.lazy(() => + import("../pages/landing-page") +); + +const LandingLayout = ({ match, ...parentProps }) => { const summitSlug = match.params.summit_slug; let url = URI(window.location.href); let currentBackUrl = null - if(url.hasQuery(BACK_URL)) - currentBackUrl = url.query(true)[BACK_URL]; + if (url.hasQuery(BACK_URL)) + currentBackUrl = url.query(true)[BACK_URL]; - if(currentBackUrl){ - return ( - { - return - }} /> - ) + if (currentBackUrl) { + return ( + { + return + }} /> + ) } return ( - <> + }> { render={props => ()} /> - + ); } diff --git a/src/layouts/presentation-layout.js b/src/layouts/presentation-layout.js index 5973b40..c53d01e 100644 --- a/src/layouts/presentation-layout.js +++ b/src/layouts/presentation-layout.js @@ -11,98 +11,110 @@ * limitations under the License. **/ -import React from 'react' +import React, { Suspense } from "react"; import { connect } from 'react-redux'; import { Switch, Route, Redirect } from 'react-router-dom'; +import AjaxLoader from "openstack-uicore-foundation/lib/components/ajaxloader"; import { getPresentation, resetPresentation } from '../actions/presentation-actions' -import EditPresentationPage from '../pages/edit-presentation-page' -import PreviewPresentationPage from '../pages/preview-presentation-page' -import ThankYouPresentationPage from '../pages/thankyou-presentation-page' -import EditSpeakerPage from '../pages/edit-speaker-page' import Presentation from '../model/presentation' +const EditPresentationPage = React.lazy(() => + import("../pages/edit-presentation-page") +); +const PreviewPresentationPage = React.lazy(() => + import("../pages/preview-presentation-page") +); +const ThankYouPresentationPage = React.lazy(() => + import("../pages/thankyou-presentation-page") +); +const EditSpeakerPage = React.lazy(() => + import("../pages/edit-speaker-page") +); + class PresentationLayout extends React.Component { - constructor(props){ - super(props); - this.presentation = new Presentation( - props.entity, - props.summit, - props.selectionPlan, - props.loggedSpeaker, - props.tagGroups - ); + constructor(props) { + super(props); + this.presentation = new Presentation( + props.entity, + props.summit, + props.selectionPlan, + props.loggedSpeaker, + props.tagGroups + ); + } + + componentDidMount() { + let { presentation_id } = this.props.match.params; + if (!presentation_id) { + this.props.resetPresentation(); + return; } + this.props.getPresentation(presentation_id); + } + + componentWillReceiveProps(newProps) { + let oldId = this.props.match.params.presentation_id; + let newId = newProps.match.params.presentation_id; - componentDidMount() { - let {presentation_id} = this.props.match.params; - if (!presentation_id) { - this.props.resetPresentation(); - return; - } - this.props.getPresentation(presentation_id); + if (newId && oldId !== newId) { + this.props.getPresentation(newId); } - componentWillReceiveProps(newProps) { - let oldId = this.props.match.params.presentation_id; - let newId = newProps.match.params.presentation_id; + this.presentation.updatePresentation(newProps.entity, newProps.track); + } + + render() { + let { match, entity, speaker, history, loading, location, selectionPlan, selectionPlansSettings } = this.props; + let isNew = !match.params.presentation_id; - if (newId && oldId !== newId) { - this.props.getPresentation(newId); - } + if (loading || (!isNew && !entity.id)) return null; - this.presentation.updatePresentation(newProps.entity, newProps.track); + if (!isNew && match.params.presentation_id == entity.id && !this.presentation.canEdit() && !location.pathname.endsWith('preview')) { + return (); } - render(){ - let { match, entity, speaker, history, loading, location, selectionPlan, selectionPlansSettings } = this.props; - let isNew = !match.params.presentation_id; - - if (loading || (!isNew && !entity.id)) return null; - - if (!isNew && match.params.presentation_id == entity.id && !this.presentation.canEdit() && !location.pathname.endsWith('preview') ) { - return(); - } - - if (!speaker) { - history.push(`/app/${summit.slug}/all-plans/profile`); - } - - const selectionPlanSettings = selectionPlansSettings && selectionPlansSettings.hasOwnProperty(selectionPlan?.id) ? (selectionPlansSettings[selectionPlan?.id] || {}): {}; - const defaultStep = selectionPlanSettings?.CFP_PRESENTATION_EDITION_DEFAULT_TAB ? selectionPlanSettings?.CFP_PRESENTATION_EDITION_DEFAULT_TAB : 'summary'; - - return( - - }/> - }/> - }/> - }/> - () - }/> - ()}/> - - ); + if (!speaker) { + history.push(`/app/${summit.slug}/all-plans/profile`); } + const selectionPlanSettings = selectionPlansSettings && selectionPlansSettings.hasOwnProperty(selectionPlan?.id) ? (selectionPlansSettings[selectionPlan?.id] || {}) : {}; + const defaultStep = selectionPlanSettings?.CFP_PRESENTATION_EDITION_DEFAULT_TAB ? selectionPlanSettings?.CFP_PRESENTATION_EDITION_DEFAULT_TAB : 'summary'; + + return ( + }> + + } /> + } /> + } /> + } /> + () + } /> + ()} /> + + + ); + } + } const mapStateToProps = ({ baseState, presentationState }) => ({ - speaker: baseState.speaker, - summit: baseState.summit, - loading: baseState.loading, - tagGroups: baseState.tagGroups, - selectionPlansSettings: baseState.selectionPlansSettings, - loggedSpeaker: baseState.speaker, - ...presentationState + speaker: baseState.speaker, + summit: baseState.summit, + loading: baseState.loading, + tagGroups: baseState.tagGroups, + selectionPlansSettings: baseState.selectionPlansSettings, + loggedSpeaker: baseState.speaker, + ...presentationState }) export default connect( - mapStateToProps, - { - getPresentation, - resetPresentation - } + mapStateToProps, + { + getPresentation, + resetPresentation + } )(PresentationLayout) diff --git a/src/layouts/primary-layout.js b/src/layouts/primary-layout.js index 1cb083a..4ec8a74 100644 --- a/src/layouts/primary-layout.js +++ b/src/layouts/primary-layout.js @@ -11,36 +11,38 @@ * limitations under the License. **/ -import React from 'react' -import {connect} from 'react-redux'; -import {Switch, Route, Redirect} from 'react-router-dom'; -import PresentationLayout from './presentation-layout' +import React, { Suspense } from "react"; +import { connect } from 'react-redux'; +import { Switch, Route, Redirect } from 'react-router-dom'; +import AjaxLoader from "openstack-uicore-foundation/lib/components/ajaxloader"; -const PrimaryLayout = ({summit, speaker, member, selectionPlanId, match}) => { +const PresentationLayout = React.lazy(() => import("./presentation-layout")); + +const PrimaryLayout = ({ summit, speaker, member, selectionPlanId, match }) => { const loggedUser = (speaker && speaker.id) ? speaker : member; const selectionPlan = summit.selection_plans.find(sp => sp.id === selectionPlanId); if (!loggedUser || !selectionPlanId || !selectionPlan) return null; return ( - <> + }> } + render={(props) => } /> } + render={(props) => } /> - ()}/> + ()} /> - + ); } -const mapStateToProps = ({loggedUserState, baseState}) => ({ +const mapStateToProps = ({ loggedUserState, baseState }) => ({ member: loggedUserState.member, speaker: baseState.speaker, summit: baseState.summit, diff --git a/src/layouts/selection-plan-layout.js b/src/layouts/selection-plan-layout.js index f3ebb2c..da37d51 100644 --- a/src/layouts/selection-plan-layout.js +++ b/src/layouts/selection-plan-layout.js @@ -11,18 +11,24 @@ * limitations under the License. **/ -import React, {useEffect} from 'react' -import {connect} from 'react-redux'; -import {Switch, Route, Redirect} from 'react-router-dom'; -import {getAllowedSelectionPlan, getSelectionPlanSettings} from '../actions/base-actions'; -import PrimaryLayout from "./primary-layout"; -import AllSelectionPlansPage from "../pages/all-selection-plans-page"; -import ProfilePage from "../pages/profile-page"; -import SelectionProcessPage from "../pages/selection-process-page"; -import TracksGuidePage from "../pages/tracks-guide-page"; +import React, { useEffect, Suspense } from 'react' +import { connect } from 'react-redux'; +import { Switch, Route, Redirect } from 'react-router-dom'; +import AjaxLoader from "openstack-uicore-foundation/lib/components/ajaxloader"; +import { getAllowedSelectionPlan, getSelectionPlanSettings } from '../actions/base-actions'; import history from '../history' -const SelectionPlanLayout = ({summit, match, ...props}) => { +const EditPresentationPage = React.lazy(() => + import("../pages/edit-presentation-page") +); + +const PrimaryLayout = React.lazy(() => import("./primary-layout")); +const AllSelectionPlansPage = React.lazy(() => import("../pages/all-selection-plans-page")); +const ProfilePage = React.lazy(() => import("../pages/profile-page")); +const SelectionProcessPage = React.lazy(() => import("../pages/selection-process-page")); +const TracksGuidePage = React.lazy(() => import("../pages/tracks-guide-page")); + +const SelectionPlanLayout = ({ summit, match, ...props }) => { const selectionPlanId = parseInt(match.params?.selection_plan_id); useEffect(() => { @@ -38,19 +44,21 @@ const SelectionPlanLayout = ({summit, match, ...props}) => { }, [selectionPlanId]); return ( - - } /> - } /> - } /> - } /> - } /> - ()} /> - + }> + + } /> + } /> + } /> + } /> + } /> + ()} /> + + ); } -const mapStateToProps = ({baseState}) => ({ +const mapStateToProps = ({ baseState }) => ({ summit: baseState.summit }) -export default connect(mapStateToProps, {getAllowedSelectionPlan, getSelectionPlanSettings})(SelectionPlanLayout); \ No newline at end of file +export default connect(mapStateToProps, { getAllowedSelectionPlan, getSelectionPlanSettings })(SelectionPlanLayout); \ No newline at end of file diff --git a/src/layouts/summit-layout.js b/src/layouts/summit-layout.js index f665623..b6b2987 100644 --- a/src/layouts/summit-layout.js +++ b/src/layouts/summit-layout.js @@ -11,17 +11,19 @@ * limitations under the License. **/ -import React, {useEffect, useState} from 'react' -import {connect} from 'react-redux'; -import {Switch, Route, Redirect} from 'react-router-dom'; -import {getAllFromSummit, getTagGroups, getAllowedSelectionPlans} from '../actions/base-actions'; -import AllPlansLayout from "./all-plans-layout"; -import PlanSelectionPage from "../pages/plan-selection-page"; -import ProfilePage from "../pages/profile-page"; +import React, { useEffect, useState, Suspense } from 'react' +import { connect } from 'react-redux'; +import { Switch, Route, Redirect } from 'react-router-dom'; +import AjaxLoader from "openstack-uicore-foundation/lib/components/ajaxloader"; +import { getAllFromSummit, getTagGroups, getAllowedSelectionPlans } from '../actions/base-actions'; import ClockComponent from '../components/clock'; -import {getLandingSelectionPlanId} from "../utils/methods"; +import { getLandingSelectionPlanId } from "../utils/methods"; -const SummitLayout = ({summit, loading, match, speaker, location, baseLoaded, ...props}) => { +const AllPlansLayout = React.lazy(() => import("./all-plans-layout")); +const PlanSelectionPage = React.lazy(() => import("../pages/plan-selection-page")); +const ProfilePage = React.lazy(() => import("../pages/profile-page")); + +const SummitLayout = ({ summit, loading, match, speaker, location, baseLoaded, ...props }) => { const urlSummitSlug = match.params.summit_slug; const summitSlug = summit?.slug; const [dataLoaded, setDataLoaded] = useState(false); @@ -42,32 +44,34 @@ const SummitLayout = ({summit, loading, match, speaker, location, baseLoaded, .. const spLanding = getLandingSelectionPlanId(); return ( - + ); } return ( <> - - - - - + }> + + + + ()} - /> - ()} - /> - ()}/> - + render={props => ()} + /> + ()} + /> + ()} /> + + ); } -const mapStateToProps = ({baseState}) => ({ +const mapStateToProps = ({ baseState }) => ({ speaker: baseState.speaker, summit: baseState.summit, loading: baseState.loading, diff --git a/src/pages/landing-page.js b/src/pages/landing-page.js index 13cb5a1..991a8d4 100644 --- a/src/pages/landing-page.js +++ b/src/pages/landing-page.js @@ -16,7 +16,7 @@ import '../styles/landing-page.less'; import T from "i18n-react/dist/i18n-react"; import SelectionProcessPage from "./selection-process-page"; import TracksGuidePage from "./tracks-guide-page"; -import { Exclusive } from 'openstack-uicore-foundation/lib/components' +import Exclusive from 'openstack-uicore-foundation/lib/components/exclusive-wrapper'; import { getAllFromSummit, getSelectionPlanSettings } from '../actions/base-actions'; import { connect } from 'react-redux' import {getCurrentSelectionPlanId} from "../utils/methods"; diff --git a/src/pages/plan-selection-page.js b/src/pages/plan-selection-page.js index b139bac..2d8a9ad 100644 --- a/src/pages/plan-selection-page.js +++ b/src/pages/plan-selection-page.js @@ -12,7 +12,7 @@ **/ import React from "react"; -import {Dropdown} from 'openstack-uicore-foundation/lib/components' +import Dropdown from 'openstack-uicore-foundation/lib/components/inputs/dropdown'; import history from "../history"; import {connect} from "react-redux"; import T from "i18n-react"; diff --git a/src/pages/preview-presentation-page.js b/src/pages/preview-presentation-page.js index 0925000..d9df753 100644 --- a/src/pages/preview-presentation-page.js +++ b/src/pages/preview-presentation-page.js @@ -14,7 +14,7 @@ import React from 'react'; import { connect } from 'react-redux'; import T from 'i18n-react/dist/i18n-react'; -import { RawHTML } from 'openstack-uicore-foundation/lib/components' +import RawHTML from 'openstack-uicore-foundation/lib/components/raw-html'; import { loadEventCategory } from "../actions/base-actions"; import {getSubmissionsPath} from "../utils/methods"; diff --git a/src/pages/selection-process-page.js b/src/pages/selection-process-page.js index aa3cf98..174eaec 100644 --- a/src/pages/selection-process-page.js +++ b/src/pages/selection-process-page.js @@ -13,7 +13,7 @@ import React from 'react'; import T from 'i18n-react/dist/i18n-react'; -import { RawHTML } from 'openstack-uicore-foundation/lib/components' +import RawHTML from 'openstack-uicore-foundation/lib/components/raw-html'; export default class SelectionProcessPage extends React.Component { diff --git a/src/pages/summit-selection-page.js b/src/pages/summit-selection-page.js index ce5ae03..a5a8c15 100644 --- a/src/pages/summit-selection-page.js +++ b/src/pages/summit-selection-page.js @@ -12,7 +12,7 @@ **/ import React from "react"; -import {Dropdown} from 'openstack-uicore-foundation/lib/components' +import Dropdown from 'openstack-uicore-foundation/lib/components/inputs/dropdown'; import history from "../history"; import {connect} from "react-redux"; import { diff --git a/src/pages/thankyou-presentation-page.js b/src/pages/thankyou-presentation-page.js index e502130..340d4a9 100644 --- a/src/pages/thankyou-presentation-page.js +++ b/src/pages/thankyou-presentation-page.js @@ -14,7 +14,7 @@ import React from 'react'; import { connect } from 'react-redux'; import T from 'i18n-react/dist/i18n-react'; -import { Exclusive } from 'openstack-uicore-foundation/lib/components' +import Exclusive from 'openstack-uicore-foundation/lib/components/exclusive-wrapper'; import {getSubmissionsPath} from "../utils/methods"; import '../styles/thankyou-presentation-page.less'; diff --git a/src/pages/tracks-guide-page.js b/src/pages/tracks-guide-page.js index 1fa04b8..e450a73 100644 --- a/src/pages/tracks-guide-page.js +++ b/src/pages/tracks-guide-page.js @@ -13,7 +13,7 @@ import React from 'react'; import T from 'i18n-react/dist/i18n-react'; -import {RawHTML} from 'openstack-uicore-foundation/lib/components' +import RawHTML from 'openstack-uicore-foundation/lib/components/raw-html'; import {connect} from "react-redux"; const TracksGuidePage = ({summit}) => { diff --git a/src/sentry-init.js b/src/sentry-init.js new file mode 100644 index 0000000..311bc60 --- /dev/null +++ b/src/sentry-init.js @@ -0,0 +1,18 @@ +import * as Sentry from "@sentry/react"; + +export const initSentry = () => { + Sentry.init({ + dsn: window.SENTRY_DSN, + integrations: [ + Sentry.browserTracingIntegration(), + Sentry.browserProfilingIntegration(), + Sentry.replayIntegration() + ], + tracesSampleRate: window.SENTRY_TRACE_SAMPLE_RATE, + tracePropagationTargets: [window.SENTRY_TRACE_PROPAGATION_TARGETS], + profilesSampleRate: 1.0, + replaysSessionSampleRate: 0.1, + replaysOnErrorSampleRate: 1.0 + }); + return Sentry; +}; \ No newline at end of file diff --git a/webpack.prod.js b/webpack.prod.js index 94088c5..33bd63d 100644 --- a/webpack.prod.js +++ b/webpack.prod.js @@ -1,31 +1,40 @@ -const TerserJSPlugin = require('terser-webpack-plugin'); -const MiniCssExtractPlugin = require("mini-css-extract-plugin"); -const CssMinimizerPlugin = require('css-minimizer-webpack-plugin'); -const {merge} = require('webpack-merge'); -const common = require('./webpack.common.js'); -const path = require('path'); +const TerserJSPlugin = require("terser-webpack-plugin"); +const MiniCssExtractPlugin = require("mini-css-extract-plugin"); +const CssMinimizerPlugin = require("css-minimizer-webpack-plugin"); +const { merge } = require("webpack-merge"); +const common = require("./webpack.common.js"); +const path = require("path"); module.exports = merge(common, { - mode: 'production', - devtool: 'source-map', - output: { - filename: '[name]_[contenthash].js', - path: path.resolve(__dirname, 'dist'), - publicPath: '/', - pathinfo: false - }, - optimization: { - minimizer: [ - new TerserJSPlugin({terserOptions: {compress: {inline: false}}}), - new CssMinimizerPlugin() - ], - splitChunks: { - chunks: 'all' + mode: "production", + output: { + filename: "[name]_[contenthash].js", + chunkFilename: "[name]_[contenthash].js", + path: path.resolve(__dirname, "dist"), + publicPath: "/", + pathinfo: false + }, + optimization: { + minimize: true, + minimizer: [ + new TerserJSPlugin({ + parallel: true, + terserOptions: { + mangle: { + reserved: ["Lock", "SuperTokensLock", "GET_TOKEN_SILENTLY_LOCK_KEY"] + }, + compress: { inline: false } } - }, - plugins: [ - new MiniCssExtractPlugin({ - filename: '[name].[contenthash].css', - }), - ] + }), + new CssMinimizerPlugin() + ], + splitChunks: { + chunks: "all" + } + }, + plugins: [ + new MiniCssExtractPlugin({ + filename: "[name].[contenthash].css", + }), + ] }); diff --git a/yarn.lock b/yarn.lock index 8890da2..73e8ec6 100644 --- a/yarn.lock +++ b/yarn.lock @@ -830,7 +830,7 @@ "@babel/plugin-transform-react-jsx-development" "^7.27.1" "@babel/plugin-transform-react-pure-annotations" "^7.27.1" -"@babel/runtime@^7.1.2", "@babel/runtime@^7.10.0", "@babel/runtime@^7.11.2", "@babel/runtime@^7.12.5", "@babel/runtime@^7.15.4", "@babel/runtime@^7.17.8", "@babel/runtime@^7.18.3", "@babel/runtime@^7.20.13", "@babel/runtime@^7.29.2", "@babel/runtime@^7.5.5", "@babel/runtime@^7.7.2", "@babel/runtime@^7.8.7", "@babel/runtime@^7.9.2": +"@babel/runtime@^7.1.2", "@babel/runtime@^7.10.0", "@babel/runtime@^7.11.2", "@babel/runtime@^7.12.5", "@babel/runtime@^7.15.4", "@babel/runtime@^7.17.8", "@babel/runtime@^7.18.3", "@babel/runtime@^7.20.13", "@babel/runtime@^7.28.6", "@babel/runtime@^7.29.2", "@babel/runtime@^7.5.5", "@babel/runtime@^7.7.2", "@babel/runtime@^7.8.7", "@babel/runtime@^7.9.2": version "7.29.2" resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.29.2.tgz#9a6e2d05f4b6692e1801cd4fb176ad823930ed5e" integrity sha512-JiDShH45zKHWyGe4ZNVRrCjBz8Nh9TMmZG1kh4QTK8hCBTWBi8Da+i7s1fJw7/lYpM4ccepSNfqzZ/QvABBi5g== @@ -1176,7 +1176,7 @@ dependencies: "@babel/runtime" "^7.29.2" -"@mui/utils@^9.0.0": +"@mui/utils@9.0.0", "@mui/utils@^9.0.0": version "9.0.0" resolved "https://registry.npmjs.org/@mui/utils/-/utils-9.0.0.tgz#25b563ccbf537feba5f89c37a00cb8e6eea45ad0" integrity sha512-bQcqyg/gjULUqTuyUjSAFr6LQGLvtkNtDbJerAtoUn9kGZ0hg5QJiN1PLHMLbeFpe3te1831uq7GFl2ITokGdg== @@ -1188,6 +1188,29 @@ prop-types "^15.8.1" react-is "^19.2.4" +"@mui/x-date-pickers@^9.0.2": + version "9.0.2" + resolved "https://registry.yarnpkg.com/@mui/x-date-pickers/-/x-date-pickers-9.0.2.tgz#ac601e4655ce3017185d652f9f91a2914bb6e63a" + integrity sha512-rnyc2wFPnprTS5i8Lq9aX2Rlx+ZRvNZERTd7sPMErf/8HnMCYzxwErITbd+TuImlvo2vaLF1gNynqT8AJMusYw== + dependencies: + "@babel/runtime" "^7.28.6" + "@mui/utils" "9.0.0" + "@mui/x-internals" "^9.0.0" + "@types/react-transition-group" "^4.4.12" + clsx "^2.1.1" + prop-types "^15.8.1" + react-transition-group "^4.4.5" + +"@mui/x-internals@^9.0.0": + version "9.0.0" + resolved "https://registry.yarnpkg.com/@mui/x-internals/-/x-internals-9.0.0.tgz#8851a058e09b719690b4f398319805239e923855" + integrity sha512-E/4rdg69JjhyybpPGypCjAKSKLLnSdCFM+O6P/nkUg47+qt3uftxQEhjQO53rcn6ahHl6du/uNZ9BLgeY6kYxQ== + dependencies: + "@babel/runtime" "^7.28.6" + "@mui/utils" "9.0.0" + reselect "^5.1.1" + use-sync-external-store "^1.6.0" + "@parcel/watcher-android-arm64@2.5.6": version "2.5.6" resolved "https://registry.yarnpkg.com/@parcel/watcher-android-arm64/-/watcher-android-arm64-2.5.6.tgz#5f32e0dba356f4ac9a11068d2a5c134ca3ba6564" @@ -1747,6 +1770,13 @@ resolved "https://registry.yarnpkg.com/@types/googlemaps/-/googlemaps-3.43.3.tgz#70cf962154a160fe78bcd69d6ccc296dd9175b1f" integrity sha512-ZWNoz/O8MPEpiajvj7QiqCY8tTLFNqNZ/a+s+zTV58wFVNAvvqV4bdGfnsjTb5Cs4V6wEsLrX8XRhmnyYJ2Tdg== +"@types/hoist-non-react-statics@^3.3.1": + version "3.3.7" + resolved "https://registry.yarnpkg.com/@types/hoist-non-react-statics/-/hoist-non-react-statics-3.3.7.tgz#306e3a3a73828522efa1341159da4846e7573a6c" + integrity sha512-PQTyIulDkIDro8P+IHbKCsw7U2xxBYflVzW/FgWdCAePD9xGSidgA76/GeJ6lBKoblyhf9pBY763gbrN+1dI8g== + dependencies: + hoist-non-react-statics "^3.3.0" + "@types/html-minifier-terser@^6.0.0": version "6.1.0" resolved "https://registry.yarnpkg.com/@types/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz#4fc33a00c1d0c16987b1a20cf92d20614c55ac35" @@ -2106,9 +2136,9 @@ integrity sha512-oxnCNGj88fL+xzV+dacXs44HcDwf1ovs3AuEzvP7mqXw7fQntqIhQ1BRmynh4qEKQSSSRSWVyXRjmTbZIX9V2Q== "@xmldom/xmldom@^0.8.3": - version "0.8.12" - resolved "https://registry.yarnpkg.com/@xmldom/xmldom/-/xmldom-0.8.12.tgz#cf488a5435fa06c7374ad1449c69cea0f823624b" - integrity sha512-9k/gHF6n/pAi/9tqr3m3aqkuiNosYTurLLUtc7xQ9sxB/wm7WPygCv8GYa6mS0fLJEHhqMC1ATYhz++U/lRHqg== + version "0.8.13" + resolved "https://registry.yarnpkg.com/@xmldom/xmldom/-/xmldom-0.8.13.tgz#00d1dd940b218dff2e49309d410d8bb212159225" + integrity sha512-KRYzxepc14G/CEpEGc3Yn+JKaAeT63smlDr+vjB8jRfgTBBI9wRj/nkQEO+ucV8p8I9bfKLWp37uHgFrbntPvw== "@xtuc/ieee754@^1.2.0": version "1.2.0" @@ -3237,6 +3267,11 @@ debug@4, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.4.3: dependencies: ms "^2.1.3" +deepmerge@^2.1.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-2.2.1.tgz#5d3ff22a01c00f645405a2fbc17d0778a1801170" + integrity sha512-R9hc1Xa/NOBi9WRVUWg19rl1UB7Tt4kuPd+thNJgFZoxXsTz7ncaPaeIm+40oSGuP33DfMb4sZt1QIGiJzC4EA== + default-gateway@^6.0.3: version "6.0.3" resolved "https://registry.yarnpkg.com/default-gateway/-/default-gateway-6.0.3.tgz#819494c888053bdb743edbf343d6cdf7f2943a71" @@ -4000,6 +4035,20 @@ formidable@^1.2.2: resolved "https://registry.yarnpkg.com/formidable/-/formidable-1.2.6.tgz#d2a51d60162bbc9b4a055d8457a7c75315d1a168" integrity sha512-KcpbcpuLNOwrEjnbpMC0gS+X8ciDoZE1kkqzat4a8vrprf+s9pKNQ/QIwWfbfs4ltgmFl3MD177SNTkve3BwGQ== +formik@^2.4.9: + version "2.4.9" + resolved "https://registry.yarnpkg.com/formik/-/formik-2.4.9.tgz#7e5b81e9c9e215d0ce2ac8fed808cf7fba0cd204" + integrity sha512-5nI94BMnlFDdQRBY4Sz39WkhxajZJ57Fzs8wVbtsQlm5ScKIR1QLYqv/ultBnobObtlUyxpxoLodpixrsf36Og== + dependencies: + "@types/hoist-non-react-statics" "^3.3.1" + deepmerge "^2.1.1" + hoist-non-react-statics "^3.3.0" + lodash "^4.17.21" + lodash-es "^4.17.21" + react-fast-compare "^2.0.1" + tiny-warning "^1.0.2" + tslib "^2.0.0" + forwarded@0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.2.0.tgz#2269936428aad4c15c7ebe9779a84bf0b2a81811" @@ -4869,6 +4918,11 @@ locate-path@^6.0.0: dependencies: p-locate "^5.0.0" +lodash-es@^4.17.21: + version "4.18.1" + resolved "https://registry.yarnpkg.com/lodash-es/-/lodash-es-4.18.1.tgz#b962eeb80d9d983a900bf342961fb7418ca10b1d" + integrity sha512-J8xewKD/Gk22OZbhpOVSwcs60zhd95ESDwezOFuA3/099925PdHJ7OFHNTGtajL3AlZkykD32HykiMo+BIBI8A== + lodash-es@^4.2.1: version "4.17.23" resolved "https://registry.yarnpkg.com/lodash-es/-/lodash-es-4.17.23.tgz#58c4360fd1b5d33afc6c0bbd3d1149349b1138e0" @@ -5355,10 +5409,10 @@ open@^8.0.9: is-docker "^2.1.1" is-wsl "^2.2.0" -openstack-uicore-foundation@4.2.27: - version "4.2.27" - resolved "https://registry.npmjs.org/openstack-uicore-foundation/-/openstack-uicore-foundation-4.2.27.tgz#2a4ef839a643c09217dcf7280d9b32298edd7f2c" - integrity sha512-KAuCi+zXtwauazt/f/Azxs/RX+YWpe9DmKx01e/Nn5TYa0/c3F7xNq2gOMS2NvvSTAVLUQ6MTknN/98jDlqB7g== +openstack-uicore-foundation@5.0.9: + version "5.0.9" + resolved "https://registry.yarnpkg.com/openstack-uicore-foundation/-/openstack-uicore-foundation-5.0.9.tgz#07adad71dae95383e3e707cb63f1b30837f48608" + integrity sha512-Gk6QkQaY76a/u5Pzx1cPetX/NJ73AAda5n0YEVRX78sb4y1GknAKZNY8IdlF6QERR6yKAs4GNuuEzAEs/DcZfw== p-limit@^2.2.0: version "2.3.0" @@ -6079,6 +6133,11 @@ react-dropzone@^4.2.13: attr-accept "^1.1.3" prop-types "^15.5.7" +react-fast-compare@^2.0.1: + version "2.0.4" + resolved "https://registry.yarnpkg.com/react-fast-compare/-/react-fast-compare-2.0.4.tgz#e84b4d455b0fec113e0402c329352715196f81f9" + integrity sha512-suNP+J1VU1MWFKcyt7RtjiSWUjvidmQSlqu+eHslq+342xCbGTYmC0mEhPCOHxlW0CywylOC1u2DFAT+bv4dBw== + react-final-form@^6.5.9: version "6.5.9" resolved "https://registry.yarnpkg.com/react-final-form/-/react-final-form-6.5.9.tgz#644797d4c122801b37b58a76c87761547411190b" @@ -6433,6 +6492,11 @@ requires-port@^1.0.0: resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff" integrity sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ== +reselect@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/reselect/-/reselect-5.1.1.tgz#c766b1eb5d558291e5e550298adb0becc24bb72e" + integrity sha512-K/BG6eIky/SBpzfHZv/dd+9JBFiS4SWV7FIujVyJRux6e45+73RaUHXLmIR1f7WOMaQ0U1km6qwklRQxpJJY0w== + resolve-cwd@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-3.0.0.tgz#0f0075f1bb2544766cf73ba6a6e2adfebcb13f2d" @@ -7090,7 +7154,7 @@ tiny-invariant@^1.0.2: resolved "https://registry.yarnpkg.com/tiny-invariant/-/tiny-invariant-1.3.3.tgz#46680b7a873a0d5d10005995eb90a70d74d60127" integrity sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg== -tiny-warning@^1.0.0: +tiny-warning@^1.0.0, tiny-warning@^1.0.2: version "1.0.3" resolved "https://registry.yarnpkg.com/tiny-warning/-/tiny-warning-1.0.3.tgz#94a30db453df4c643d0fd566060d60a875d84754" integrity sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA== @@ -7128,7 +7192,7 @@ tr46@~0.0.3: resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" integrity sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw== -tslib@^2.0.3, tslib@^2.8.0: +tslib@^2.0.0, tslib@^2.0.3, tslib@^2.8.0: version "2.8.1" resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.8.1.tgz#612efe4ed235d567e8aba5f2a5fab70280ade83f" integrity sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w== @@ -7270,6 +7334,11 @@ url-toolkit@^2.2.1: resolved "https://registry.yarnpkg.com/url-toolkit/-/url-toolkit-2.2.5.tgz#58406b18e12c58803e14624df5e374f638b0f607" integrity sha512-mtN6xk+Nac+oyJ/PrI7tzfmomRVNFIWKUbG8jdYFt52hxbiReFAXIjYskvu64/dvuW71IcB7lV8l0HvZMac6Jg== +use-sync-external-store@^1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/use-sync-external-store/-/use-sync-external-store-1.6.0.tgz#b174bfa65cb2b526732d9f2ac0a408027876f32d" + integrity sha512-Pp6GSwGP/NrPIrxVFAIkOQeyw8lFenOHijQWkUTrDvrF4ALqylP2C/KCkeS9dpUM3KvYRQhna5vt7IL95+ZQ9w== + util-deprecate@^1.0.1, util-deprecate@^1.0.2, util-deprecate@~1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf"