2022-04-12 01:09:13 +08:00
|
|
|
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 {
|
2022-06-01 23:31:56 +08:00
|
|
|
...state,
|
2022-04-12 01:09:13 +08:00
|
|
|
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>
|
|
|
|
);
|
|
|
|
}
|