- {this.canRenderVideo(currentPhase) ? (
+ {this.canRenderVideo(eventPhase) ? (
)}
@@ -216,8 +210,6 @@ const EventPage = ({
eventTokens,
eventId,
user,
- eventsPhases,
- nowUtc,
getEventById,
getEventStreamingInfoById,
lastUpdate,
@@ -226,6 +218,12 @@ const EventPage = ({
const { getSettingByKey } = useMarketingSettings();
const activityCtaText = getSettingByKey(MARKETING_SETTINGS_KEYS.activityCtaText);
+ const eventPhase = useEventPhase(event);
+ const firstHalf = useClockSelector((nowUtc) =>
+ eventPhase === PHASES.DURING && event
+ ? nowUtc < ((event.start_date + event.end_date) / 2)
+ : false
+ );
return (
@@ -243,8 +241,8 @@ const EventPage = ({
eventId={eventId}
loading={loading}
user={user}
- eventsPhases={eventsPhases}
- nowUtc={nowUtc}
+ eventPhase={eventPhase}
+ firstHalf={firstHalf}
location={location}
getEventById={getEventById}
getEventStreamingInfoById={getEventStreamingInfoById}
@@ -263,7 +261,6 @@ EventPage.propTypes = {
lastUpdate: PropTypes.object,
eventId: PropTypes.string,
user: PropTypes.object,
- eventsPhases: PropTypes.array,
getEventById: PropTypes.func,
getEventStreamingInfoById: PropTypes.func,
};
@@ -275,7 +272,8 @@ EventPageTemplate.propTypes = {
loading: PropTypes.bool,
eventId: PropTypes.string,
user: PropTypes.object,
- eventsPhases: PropTypes.array,
+ eventPhase: PropTypes.number,
+ firstHalf: PropTypes.bool,
getEventById: PropTypes.func,
getEventStreamingInfoById: PropTypes.func,
activityCtaText: PropTypes.string,
@@ -285,7 +283,6 @@ const mapStateToProps = ({
eventState,
summitState,
userState,
- clockState,
settingState
}) => ({
loading: eventState.loading,
@@ -293,8 +290,6 @@ const mapStateToProps = ({
eventTokens: eventState.tokens,
user: userState,
summit: summitState.summit,
- eventsPhases: clockState.events_phases,
- nowUtc: clockState.nowUtc,
lastUpdate: eventState.lastUpdate,
lastDataSync: settingState.lastDataSync,
});
diff --git a/src/templates/marketing-page-template/MainColumn.js b/src/templates/marketing-page-template/MainColumn.js
index a3616331..1d8ca1d6 100644
--- a/src/templates/marketing-page-template/MainColumn.js
+++ b/src/templates/marketing-page-template/MainColumn.js
@@ -10,6 +10,7 @@ import ResponsiveImage from "../../components/ResponsiveImage";
import Link from "../../components/Link";
import { PHASES } from "@utils/phasesUtils";
+import { useSummitPhase } from "@utils/hooks/useSummitPhase";
import styles from "./styles.module.scss";
@@ -20,8 +21,9 @@ const shortcodes = {
const onEventClick = (ev) => navigate(`/a/event/${ev.id}`);
-const MainColumn = ({ widgets, summitPhase, isLoggedUser, onEventClick, lastDataSync, fullWidth, maxHeight }) => {
+const MainColumn = ({ widgets, isLoggedUser, onEventClick, lastDataSync, fullWidth, maxHeight }) => {
const { content, schedule, disqus, image } = widgets || {};
+ const summitPhase = useSummitPhase();
const scheduleProps = schedule && isLoggedUser && summitPhase !== PHASES.BEFORE ? { onEventClick } : {};
@@ -68,7 +70,6 @@ const MainColumn = ({ widgets, summitPhase, isLoggedUser, onEventClick, lastData
MainColumn.propTypes = {
widgets: PropTypes.object,
- summitPhase: PropTypes.number,
isLoggedUser: PropTypes.bool,
lastDataSync: PropTypes.number,
fullWidth: PropTypes.bool,
diff --git a/src/templates/marketing-page-template/index.js b/src/templates/marketing-page-template/index.js
index 9ccdfc96..070aa1c5 100644
--- a/src/templates/marketing-page-template/index.js
+++ b/src/templates/marketing-page-template/index.js
@@ -11,7 +11,7 @@ import { useResize } from "@utils/hooks";
import styles from "./styles.module.scss";
-const MarketingPageTemplate = ({ data, location, summit, summitPhase, isLoggedUser, lastDataSync }) => {
+const MarketingPageTemplate = ({ data, location, summit, isLoggedUser, lastDataSync }) => {
const masonryRef = useRef();
const [rightColumnHeight, setRightColumnHeight] = useState();
@@ -46,7 +46,6 @@ const MarketingPageTemplate = ({ data, location, summit, summitPhase, isLoggedUs
{
@@ -84,59 +84,14 @@ export const PosterDetailPage = ({
}).catch(e => console.log(e));
}, [presentationId]);
- useEffect(() => {
- if (!notifiedVotingPeriodsOnLoad &&
- posterTrackGroups.length &&
- posterTrackGroups.map(tg => votingPeriods[tg]).every(vp => vp !== undefined)) {
- posterTrackGroups.forEach(tg => {
- if (votingPeriods[tg].phase === PHASES.BEFORE) {
- const startDate = new Date(votingPeriods[tg].startDate * 1000).toLocaleDateString('en-US');
- const startTime = new Date(votingPeriods[tg].startDate * 1000).toLocaleTimeString('en-US');
- pushNotification(`Voting has not begun. ${votingPeriods[tg].name} will allow for votes starting on ${startDate} ${startTime}`);
- setNotifiedVotingPeriodsOnLoad(true);
- } else if (votingPeriods[tg].phase === PHASES.AFTER) {
- const endDate = new Date(votingPeriods[tg].endDate * 1000).toLocaleDateString('en-US');
- const endTime = new Date(votingPeriods[tg].endDate * 1000).toLocaleTimeString('en-US');
- pushNotification(`Voting has ended. ${votingPeriods[tg].name} does not allow for votes after ${endDate} ${endTime}`);
- setNotifiedVotingPeriodsOnLoad(true);
- }
- });
- }
- if (posterTrackGroups.length &&
- posterTrackGroups.map(tg => votingPeriods[tg]).every(vp => vp !== undefined) &&
- posterTrackGroups.map(tg => previousVotingPeriods[tg]).every(vp => vp !== undefined)) {
- posterTrackGroups.forEach(tg => {
- if (previousVotingPeriods[tg].phase === PHASES.BEFORE && votingPeriods[tg].phase === PHASES.DURING) {
- pushNotification(`Voting has now begun! You are allowed ${votingPeriods[tg].maxAttendeeVotes} votes in ${votingPeriods[tg].name}`);
- } else if (previousVotingPeriods[tg].phase === PHASES.DURING && votingPeriods[tg].phase === PHASES.AFTER) {
- const endDate = new Date(votingPeriods[tg].endDate * 1000).toLocaleDateString('en-US');
- const endTime = new Date(votingPeriods[tg].endDate * 1000).toLocaleTimeString('en-US');
- pushNotification(`Voting has ended. ${votingPeriods[tg].name} does not allow for votes after ${endDate} ${endTime}`);
- }
- });
- }
- if (!notifiedMaximunAllowedVotesOnLoad &&
- posterTrackGroups.length &&
- posterTrackGroups.map(tg => votingPeriods[tg]).every(vp => vp !== undefined)) {
- posterTrackGroups.forEach(tg => {
- if (votingPeriods[tg].phase === PHASES.DURING && votingPeriods[tg].remainingVotes === 0) {
- pushNotification(`You've reached your maximum votes. ${votingPeriods[tg].name} only allows for ${votingPeriods[tg].maxAttendeeVotes} votes per attendee`);
- setNotifiedMaximunAllowedVotesOnLoad(true);
- }
- });
- } else if (votedPosterTrackGroups &&
- votedPosterTrackGroups.length &&
- posterTrackGroups.length &&
- posterTrackGroups.map(tg => votingPeriods[tg]).every(vp => vp !== undefined)) {
- votedPosterTrackGroups.forEach(tg => {
- if (votingPeriods[tg].phase === PHASES.DURING && votingPeriods[tg].remainingVotes === 0) {
- pushNotification(`You've reached your maximum votes. ${votingPeriods[tg].name} only allows for ${votingPeriods[tg].maxAttendeeVotes} votes per attendee`);
- setVotedPosterTrackGroups([]);
- }
- });
- }
- setPreviousVotingPeriods(votingPeriods);
- }, [posterTrackGroups, votingPeriods]);
+ useVotingPeriodNotifications({
+ trackGroups: posterTrackGroups,
+ votingPeriods,
+ votingPeriodsPhases,
+ votedTrackGroups: votedPosterTrackGroups,
+ onVotedTrackGroupsHandled: () => setVotedPosterTrackGroups([]),
+ pushNotification,
+ });
const { getSettingByKey } = useMarketingSettings();
@@ -206,6 +161,7 @@ export const PosterDetailPage = ({
poster={poster}
votingAllowed={!!attendee}
votingPeriods={votingPeriods}
+ votingPeriodsPhases={votingPeriodsPhases}
votes={votes}
isVoted={!!votes.find(v => v.presentation_id === poster.id)}
toggleVote={toggleVote}
@@ -218,6 +174,7 @@ export const PosterDetailPage = ({
posters={recommendedPosters}
votingAllowed={!!attendee}
votingPeriods={votingPeriods}
+ votingPeriodsPhases={votingPeriodsPhases}
votes={votes}
toggleVote={toggleVote}
showDetailPage={(posterId) => navigate(`/a/poster/${posterId}`)}
diff --git a/src/templates/posters-page.js b/src/templates/posters-page.js
index 3e133a06..e1312636 100644
--- a/src/templates/posters-page.js
+++ b/src/templates/posters-page.js
@@ -23,7 +23,8 @@ import {
} from '../actions/user-actions';
import { filterByTrackGroup, randomSort } from '../utils/filterUtils';
-import { PHASES } from '../utils/phasesUtils';
+import { useVotingPeriodsPhasesMap } from '@utils/hooks/useVotingPeriodPhase';
+import { useVotingPeriodNotifications } from '@utils/hooks/useVotingPeriodNotifications';
import styles from '../styles/posters-page.module.scss';
@@ -53,11 +54,10 @@ const PostersPage = ({
const [appliedPageFilter, setAppliedPageFilter] = useState(null);
const [filteredPosters, setFilteredPosters] = useState(posters);
const [pageTrackGroups, setPageTrackGroups] = useState([]);
- const [notifiedMaximunAllowedVotesOnLoad, setNotifiedMaximunAllowedVotesOnLoad] = useState(false);
- const [notifiedVotingPeriodsOnLoad, setNotifiedVotingPeriodsOnLoad] = useState(false);
- const [previousVotingPeriods, setPreviousVotingPeriods] = useState(votingPeriods);
const [votedPosterTrackGroups, setVotedPosterTrackGroups] = useState([]);
+ const votingPeriodsPhases = useVotingPeriodsPhasesMap(votingPeriods);
+
const notificationRef = useRef(null);
const filtersWrapperRef = useRef(null);
@@ -123,59 +123,14 @@ const PostersPage = ({
setPageTrackGroups(pageTrackGroups);
}, [filteredPosters]);
- useEffect(() => {
- if (!notifiedVotingPeriodsOnLoad &&
- pageTrackGroups.length &&
- pageTrackGroups.map(tg => votingPeriods[tg]).every(vp => vp !== undefined)) {
- pageTrackGroups.forEach(tg => {
- if (votingPeriods[tg].phase === PHASES.BEFORE) {
- const startDate = new Date(votingPeriods[tg].startDate * 1000).toLocaleDateString('en-US');
- const startTime = new Date(votingPeriods[tg].startDate * 1000).toLocaleTimeString('en-US');
- pushNotification(`Voting has not begun. ${votingPeriods[tg].name} will allow for votes starting on ${startDate} ${startTime}`);
- setNotifiedVotingPeriodsOnLoad(true);
- } else if (votingPeriods[tg].phase === PHASES.AFTER) {
- const endDate = new Date(votingPeriods[tg].endDate * 1000).toLocaleDateString('en-US');
- const endTime = new Date(votingPeriods[tg].endDate * 1000).toLocaleTimeString('en-US');
- pushNotification(`Voting has ended. ${votingPeriods[tg].name} does not allow for votes after ${endDate} ${endTime}`);
- setNotifiedVotingPeriodsOnLoad(true);
- }
- });
- }
- if (pageTrackGroups.length &&
- pageTrackGroups.map(tg => votingPeriods[tg]).every(vp => vp !== undefined) &&
- pageTrackGroups.map(tg => previousVotingPeriods[tg]).every(vp => vp !== undefined)) {
- pageTrackGroups.forEach(tg => {
- if (previousVotingPeriods[tg].phase === PHASES.BEFORE && votingPeriods[tg].phase === PHASES.DURING) {
- pushNotification(`Voting has now begun! You are allowed ${votingPeriods[tg].maxAttendeeVotes} votes in ${votingPeriods[tg].name}`);
- } else if (previousVotingPeriods[tg].phase === PHASES.DURING && votingPeriods[tg].phase === PHASES.AFTER) {
- const endDate = new Date(votingPeriods[tg].endDate * 1000).toLocaleDateString('en-US');
- const endTime = new Date(votingPeriods[tg].endDate * 1000).toLocaleTimeString('en-US');
- pushNotification(`Voting has ended. ${votingPeriods[tg].name} does not allow for votes after ${endDate} ${endTime}`);
- }
- });
- }
- if (!notifiedMaximunAllowedVotesOnLoad &&
- pageTrackGroups.length &&
- pageTrackGroups.map(tg => votingPeriods[tg]).every(vp => vp !== undefined)) {
- pageTrackGroups.forEach(tg => {
- if (votingPeriods[tg].phase === PHASES.DURING && votingPeriods[tg].remainingVotes === 0) {
- pushNotification(`You've reached your maximum votes. ${votingPeriods[tg].name} only allows for ${votingPeriods[tg].maxAttendeeVotes} votes per attendee`);
- setNotifiedMaximunAllowedVotesOnLoad(true);
- }
- });
- } else if (votedPosterTrackGroups &&
- votedPosterTrackGroups.length &&
- pageTrackGroups.length &&
- pageTrackGroups.map(tg => votingPeriods[tg]).every(vp => vp !== undefined)) {
- votedPosterTrackGroups.forEach(tg => {
- if (votingPeriods[tg].phase === PHASES.DURING && votingPeriods[tg].remainingVotes === 0) {
- pushNotification(`You've reached your maximum votes. ${votingPeriods[tg].name} only allows for ${votingPeriods[tg].maxAttendeeVotes} votes per attendee`);
- setVotedPosterTrackGroups([]);
- }
- });
- }
- setPreviousVotingPeriods(votingPeriods);
- }, [pageTrackGroups, votingPeriods]);
+ useVotingPeriodNotifications({
+ trackGroups: pageTrackGroups,
+ votingPeriods,
+ votingPeriodsPhases,
+ votedTrackGroups: votedPosterTrackGroups,
+ onVotedTrackGroupsHandled: () => setVotedPosterTrackGroups([]),
+ pushNotification,
+ });
const filterProps = {
summit,
@@ -207,6 +162,7 @@ const PostersPage = ({
posters={filteredPosters}
showDetailPage={(posterId) => navigate(`/a/poster/${posterId}`)}
votingPeriods={votingPeriods}
+ votingPeriodsPhases={votingPeriodsPhases}
votingAllowed={!!attendee}
votes={votes}
toggleVote={toggleVote}
diff --git a/src/templates/schedule-page.js b/src/templates/schedule-page.js
index 46f5b582..7189dc06 100644
--- a/src/templates/schedule-page.js
+++ b/src/templates/schedule-page.js
@@ -10,13 +10,14 @@ import AttendanceTrackerComponent from "../components/AttendanceTrackerComponent
import AccessTracker from "../components/AttendeeToAttendeeWidgetComponent";
import { PageScrollInspector, SCROLL_DIRECTION } from '../components/PageScrollInspector';
import { PHASES } from "../utils/phasesUtils";
+import { useSummitPhase } from "../utils/hooks/useSummitPhase";
import FilterButton from "../components/FilterButton";
import NotFoundPage from "../pages/404";
import withScheduleData from '../utils/withScheduleData'
import styles from "../styles/full-schedule.module.scss";
-const SchedulePage = ({ summit, scheduleState, summitPhase, isLoggedUser, location, colorSettings, updateFilter, scheduleProps, schedKey, allowClick, lastDataSync, clearFilters, callAction }) => {
-
+const SchedulePage = ({ summit, scheduleState, isLoggedUser, location, colorSettings, updateFilter, scheduleProps, schedKey, allowClick, lastDataSync, clearFilters, callAction }) => {
+ const summitPhase = useSummitPhase();
const [showFilters, setShowfilters] = useState(false);
const filtersWrapperRef = useRef(null);
const { key, events, allEvents, filters, view, timezone, timeFormat, colorSource } = scheduleState || {};
@@ -109,7 +110,6 @@ const SchedulePage = ({ summit, scheduleState, summitPhase, isLoggedUser, locati
SchedulePage.propTypes = {
schedKey: PropTypes.string.isRequired,
- summitPhase: PropTypes.number,
isLoggedUser: PropTypes.bool,
};
diff --git a/src/utils/hooks/useClockMinute.js b/src/utils/hooks/useClockMinute.js
new file mode 100644
index 00000000..b2114a5a
--- /dev/null
+++ b/src/utils/hooks/useClockMinute.js
@@ -0,0 +1,4 @@
+import { useClockSelector } from "openstack-uicore-foundation/lib/components/clock-context";
+
+export const useClockMinute = () =>
+ useClockSelector((nowUtc) => Math.floor((nowUtc ?? 0) / 60) * 60);
diff --git a/src/utils/hooks/useEventPhase.js b/src/utils/hooks/useEventPhase.js
new file mode 100644
index 00000000..a06be553
--- /dev/null
+++ b/src/utils/hooks/useEventPhase.js
@@ -0,0 +1,5 @@
+import { useClockSelector } from "openstack-uicore-foundation/lib/components/clock-context";
+import { getEventPhase } from "../phasesUtils";
+
+export const useEventPhase = (event) =>
+ useClockSelector((nowUtc) => (event ? getEventPhase(event, nowUtc) : null));
diff --git a/src/utils/hooks/useSummitPhase.js b/src/utils/hooks/useSummitPhase.js
new file mode 100644
index 00000000..3938877b
--- /dev/null
+++ b/src/utils/hooks/useSummitPhase.js
@@ -0,0 +1,8 @@
+import { useSelector } from "react-redux";
+import { useClockSelector } from "openstack-uicore-foundation/lib/components/clock-context";
+import { getSummitPhase } from "../phasesUtils";
+
+export const useSummitPhase = () => {
+ const summit = useSelector((state) => state.summitState.summit);
+ return useClockSelector((nowUtc) => getSummitPhase(summit, nowUtc));
+};
diff --git a/src/utils/hooks/useVotingPeriodNotifications.js b/src/utils/hooks/useVotingPeriodNotifications.js
new file mode 100644
index 00000000..26ae9683
--- /dev/null
+++ b/src/utils/hooks/useVotingPeriodNotifications.js
@@ -0,0 +1,81 @@
+import { useEffect, useRef, useState } from "react";
+import { PHASES } from "../phasesUtils";
+
+const formatDate = (epochSeconds) => new Date(epochSeconds * 1000).toLocaleDateString("en-US");
+const formatTime = (epochSeconds) => new Date(epochSeconds * 1000).toLocaleTimeString("en-US");
+
+const votingEndedMessage = (vp) =>
+ `Voting has ended. ${vp.name} does not allow for votes after ${formatDate(vp.endDate)} ${formatTime(vp.endDate)}`;
+
+const maxVotesMessage = (vp) =>
+ `You've reached your maximum votes. ${vp.name} only allows for ${vp.maxAttendeeVotes} votes per attendee`;
+
+export const useVotingPeriodNotifications = ({
+ trackGroups,
+ votingPeriods,
+ votingPeriodsPhases,
+ votedTrackGroups,
+ onVotedTrackGroupsHandled,
+ pushNotification,
+}) => {
+ const [notifiedOnLoad, setNotifiedOnLoad] = useState(false);
+ const [notifiedMaxVotesOnLoad, setNotifiedMaxVotesOnLoad] = useState(false);
+ const previousPhasesRef = useRef(votingPeriodsPhases);
+
+ useEffect(() => {
+ const previousPhases = previousPhasesRef.current;
+ const allLoaded = trackGroups.length && trackGroups.every((tg) => votingPeriods[tg] !== undefined);
+ if (!allLoaded) return;
+
+ // Initial-load phase notification (BEFORE or AFTER on first observable load).
+ if (!notifiedOnLoad) {
+ trackGroups.forEach((tg) => {
+ const vp = votingPeriods[tg];
+ const phase = votingPeriodsPhases[tg];
+ if (phase === PHASES.BEFORE) {
+ pushNotification(`Voting has not begun. ${vp.name} will allow for votes starting on ${formatDate(vp.startDate)} ${formatTime(vp.startDate)}`);
+ setNotifiedOnLoad(true);
+ } else if (phase === PHASES.AFTER) {
+ pushNotification(votingEndedMessage(vp));
+ setNotifiedOnLoad(true);
+ }
+ });
+ }
+
+ // Phase transitions (BEFORE->DURING, DURING->AFTER).
+ const previousAllLoaded = trackGroups.every((tg) => previousPhases[tg] !== undefined);
+ if (previousAllLoaded) {
+ trackGroups.forEach((tg) => {
+ const vp = votingPeriods[tg];
+ const prev = previousPhases[tg];
+ const next = votingPeriodsPhases[tg];
+ if (prev === PHASES.BEFORE && next === PHASES.DURING) {
+ pushNotification(`Voting has now begun! You are allowed ${vp.maxAttendeeVotes} votes in ${vp.name}`);
+ } else if (prev === PHASES.DURING && next === PHASES.AFTER) {
+ pushNotification(votingEndedMessage(vp));
+ }
+ });
+ }
+
+ // Max-votes notification.
+ if (!notifiedMaxVotesOnLoad) {
+ trackGroups.forEach((tg) => {
+ const vp = votingPeriods[tg];
+ if (votingPeriodsPhases[tg] === PHASES.DURING && vp.remainingVotes === 0) {
+ pushNotification(maxVotesMessage(vp));
+ setNotifiedMaxVotesOnLoad(true);
+ }
+ });
+ } else if (votedTrackGroups?.length && votedTrackGroups.every((tg) => votingPeriods[tg] !== undefined)) {
+ votedTrackGroups.forEach((tg) => {
+ const vp = votingPeriods[tg];
+ if (votingPeriodsPhases[tg] === PHASES.DURING && vp.remainingVotes === 0) {
+ pushNotification(maxVotesMessage(vp));
+ onVotedTrackGroupsHandled?.();
+ }
+ });
+ }
+
+ previousPhasesRef.current = votingPeriodsPhases;
+ }, [trackGroups, votingPeriods, votingPeriodsPhases, votedTrackGroups]);
+};
diff --git a/src/utils/hooks/useVotingPeriodPhase.js b/src/utils/hooks/useVotingPeriodPhase.js
new file mode 100644
index 00000000..c7e2c404
--- /dev/null
+++ b/src/utils/hooks/useVotingPeriodPhase.js
@@ -0,0 +1,25 @@
+import { useClockSelector } from "openstack-uicore-foundation/lib/components/clock-context";
+import { getVotingPeriodPhase } from "../phasesUtils";
+
+export const useVotingPeriodPhase = (votingPeriod) =>
+ useClockSelector((nowUtc) => (votingPeriod ? getVotingPeriodPhase(votingPeriod, nowUtc) : null));
+
+const shallowEqualPhasesMap = (a, b) => {
+ const keysA = Object.keys(a);
+ if (keysA.length !== Object.keys(b).length) return false;
+ return keysA.every((k) => a[k] === b[k]);
+};
+
+export const useVotingPeriodsPhasesMap = (votingPeriods) =>
+ useClockSelector(
+ (nowUtc) => {
+ const result = {};
+ if (votingPeriods && nowUtc) {
+ Object.entries(votingPeriods).forEach(([id, vp]) => {
+ if (vp) result[id] = getVotingPeriodPhase(vp, nowUtc);
+ });
+ }
+ return result;
+ },
+ shallowEqualPhasesMap
+ );
diff --git a/src/utils/withScheduleData.js b/src/utils/withScheduleData.js
index 59e9d9ab..792f620c 100644
--- a/src/utils/withScheduleData.js
+++ b/src/utils/withScheduleData.js
@@ -30,13 +30,11 @@ const componentWrapper = (WrappedComponent) => ({schedules, ...props}) => {
const mapStateToProps = ({
summitState,
- clockState,
loggedUserState,
allSchedulesState,
settingState,
}) => ({
summit: summitState.summit,
- summitPhase: clockState.summit_phase,
isLoggedUser: loggedUserState.isLoggedUser,
schedules: allSchedulesState.schedules,
colorSettings: settingState.colorSettings,
diff --git a/yarn.lock b/yarn.lock
index 8a729a7e..745d11fd 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -15369,10 +15369,12 @@ open@^8.4.0:
is-docker "^2.1.1"
is-wsl "^2.2.0"
-openstack-uicore-foundation@4.2.30:
- version "4.2.30"
- resolved "https://registry.yarnpkg.com/openstack-uicore-foundation/-/openstack-uicore-foundation-4.2.30.tgz#a7671ae66bcb465d4be7cf763dd8321218725ae3"
- integrity sha512-GSH67s/XqviESUY/gSfQ0eRIDYSoy6MX5UYE0zhCFkg7tEFVBSBbuQwEGy2/Cida/uhcxhj58Txl9FStiWsK4Q==
+openstack-uicore-foundation@4.2.31:
+ version "4.2.31"
+ resolved "https://registry.yarnpkg.com/openstack-uicore-foundation/-/openstack-uicore-foundation-4.2.31.tgz#593b12ee1cd80cfa299f813b2470dcbde46cc580"
+ integrity sha512-DE44A0hr5mM9OCak8h4uEdNSjqBzeI+9yPf1/J+TgfzJPtZNrkW2+y43Z8jIHoByI6lBOCug31FuAo6ysDyaiw==
+ dependencies:
+ use-sync-external-store "^1.6.0"
opentracing@^0.14.7:
version "0.14.7"
@@ -20885,6 +20887,11 @@ use-ssr@^1.0.25:
resolved "https://registry.yarnpkg.com/use-ssr/-/use-ssr-1.0.25.tgz#c7f54b59d6e52db26749b1d4115a650101a190bd"
integrity sha512-VYF8kJKI+X7+U4XgGoUER2BUl0vIr+8OhlIhyldgSGE0KHMoDRXPvWeHUUeUktq7ACEOVLzXGq1+QRxcvtwvyQ==
+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==
+
utf8-byte-length@^1.0.1:
version "1.0.5"
resolved "https://registry.yarnpkg.com/utf8-byte-length/-/utf8-byte-length-1.0.5.tgz#f9f63910d15536ee2b2d5dd4665389715eac5c1e"