bigbluebutton-Github/bigbluebutton-html5/imports/ui/components/video-preview/virtual-background/context.jsx
2022-06-01 12:31:56 -03:00

83 lines
1.9 KiB
JavaScript

import React, { useReducer } from 'react';
import _ from 'lodash';
import Service from './service';
export const CustomVirtualBackgroundsContext = React.createContext();
const reducer = (state, action) => {
const { save, del } = Service;
switch (action.type) {
case 'load': {
return {
...state,
loaded: true,
customBackgrounds: action.backgrounds,
newCustomBackgrounds: [],
};
}
case 'new': {
save(action.background);
return {
...state,
newCustomBackgrounds: [
...state.newCustomBackgrounds,
action.background,
],
};
}
case 'delete': {
const { customBackgrounds, newCustomBackgrounds } = state;
const filterFunc = ({ uniqueId }) => uniqueId !== action.uniqueId;
del(action.uniqueId);
return {
...state,
customBackgrounds: customBackgrounds.filter(filterFunc),
newCustomBackgrounds: newCustomBackgrounds.filter(filterFunc),
};
}
default: {
throw new Error('Unknown custom background action.');
}
}
}
export const CustomBackgroundsProvider = ({ children }) => {
const [state, dispatch] = useReducer(reducer, {
loaded: false,
customBackgrounds: [],
newCustomBackgrounds: [],
});
const { load } = Service;
const loadFromDB = () => {
const onError = () => dispatch({
type: 'load',
backgrounds: [],
});
const onSuccess = (backgrounds) => dispatch({
type: 'load',
backgrounds,
});
load(onError, onSuccess);
}
return (
<CustomVirtualBackgroundsContext.Provider
value={{
dispatch,
loaded: state.loaded,
customBackgrounds: state.customBackgrounds,
newCustomBackgrounds: state.newCustomBackgrounds,
loadFromDB: _.throttle(loadFromDB, 500, { leading: true, trailing: false }),
}}
>
{children}
</CustomVirtualBackgroundsContext.Provider>
);
}