- {chatHistory.map((chatItem) => (
+ {chatHistory?.map((chatItem) => (
{
const { participants, localParticipant } = useParticipants();
- const { viewMode, setPreferredViewMode } = useUIState();
+ const { view, setView } = useView();
const onViewClick = () =>
- setPreferredViewMode(viewMode === VIEW_MODE_SPEAKER ? VIEW_MODE_GRID : VIEW_MODE_SPEAKER);
+ setView(view === VIEW_MODE_SPEAKER ? VIEW_MODE_GRID : VIEW_MODE_SPEAKER);
if (!localParticipant.isOwner) return null;
return (
- {viewMode === VIEW_MODE_SPEAKER ? : }
+ {view === VIEW_MODE_SPEAKER ? : }
);
};
diff --git a/custom/fitness-demo/contexts/ViewProvider.js b/custom/fitness-demo/contexts/ViewProvider.js
new file mode 100644
index 0000000..37fa225
--- /dev/null
+++ b/custom/fitness-demo/contexts/ViewProvider.js
@@ -0,0 +1,40 @@
+import React, {
+ createContext,
+ useContext,
+ useCallback,
+ useMemo,
+ useEffect,
+} from 'react';
+import { useUIState } from '@custom/shared/contexts/UIStateProvider';
+import { useSharedState } from '@custom/shared/hooks/useSharedState';
+import PropTypes from 'prop-types';
+
+export const ViewContext = createContext();
+
+export const ViewProvider = ({ children }) => {
+ const { viewMode, setPreferredViewMode } = useUIState();
+
+ const { sharedState, setSharedState } = useSharedState({
+ initialValues: { viewMode },
+ });
+
+ const view = useMemo(() => sharedState.viewMode, [sharedState.viewMode]);
+ const setView = useCallback((view) => setSharedState({ viewMode: view }), [setSharedState]);
+
+ useEffect(() => {
+ if (viewMode === sharedState.viewMode) return;
+ setPreferredViewMode(sharedState.viewMode);
+ }, [setPreferredViewMode, sharedState.viewMode, viewMode]);
+
+ return (
+
+ {children}
+
+ );
+};
+
+ViewProvider.propTypes = {
+ children: PropTypes.node,
+};
+
+export const useView = () => useContext(ViewContext);
\ No newline at end of file