????
Current Path : /proc/self/cwd/wp-content/plugins/presto-player/src/admin/blocks/store/player/ |
Current File : //proc/self/cwd/wp-content/plugins/presto-player/src/admin/blocks/store/player/reducer.js |
import { combineReducers, dispatch } from '@wordpress/data'; import apiFetch from '@wordpress/api-fetch'; import { pick } from 'lodash'; /** * Presets reducer * * @param {array} state * @param {object} action */ const presetReducer = (state = [], action) => { switch (action.type) { case "SET_PRESET": return action.value; case "ADD_PRESET": return [...state, ...[action.value]]; case "UPDATE_PRESET": return state.map((item, index) => { if (item.id !== action.value?.id) { return item; } return { ...item, ...action.value, }; }); case "REMOVE_PRESET": return state.filter((item) => { return item !== action.value; }); } return state; }; /** * Presets reducer * * @param {array} state * @param {object} action */ const audioPresetReducer = (state = [], action) => { switch (action.type) { case "SET_AUDIO_PRESET": return action.value; case "SET_AUDIO_PRESET": return action.value; case "ADD_AUDIO_PRESET": return [...state, ...[action.value]]; case "UPDATE_AUDIO_PRESET": return state.map((item, index) => { if (item.id !== action.value?.id) { return item; } return { ...item, ...action.value, }; }); case "REMOVE_AUDIO_PRESET": return state.filter((item) => { return item !== action.value; }); } return state; }; /** * For preset loading * * @param {boolean} state * @param {object} action */ const presetLoadingReducer = (state = true, action) => { switch (action.type) { case "SET_PRESET_LOADING": return action.value; } }; /** * For preset loading * * @param {boolean} state * @param {object} action */ const videosLoadingReducer = (state = true, action) => { switch (action.type) { case "SET_VIDEOS_LOADING": return action.value; } }; const proModalReducer = (state = false, action) => { switch (action.type) { case "SET_PRO_MODAL": return action.value; } }; const addVideo = (videos, video) => { // check for existing item const index = videos.find((e) => e.id === video.id); if (index) { return videos; } return [...videos, ...[video]]; }; const videosReducer = ( state = { total: 0, total_pages: 0, videos: [], hasResolved: false, isError: false, }, action ) => { switch (action.type) { case "SET_VIDEOS": return action.value; case "UPDATE_VIDEOS": return { ...state, ...action.value }; case "APPEND_VIDEOS": let draft = state; (action.value || []).forEach((video) => { draft.videos = addVideo(draft.videos, video); }); return draft; case "ADD_VIDEO": return { ...state, videos: addVideo(state.videos, action.value) }; case "UPDATE_VIDEO": return { ...state, videos: state.videos.map((item, index) => { if (item.id !== action.value?.id) { return item; } return { ...item, ...action.value, }; }), }; case "REMOVE_VIDEO": return { ...state, videos: state.videos.filter((item) => { return item !== action.value; }), }; } return state; }; /** * Branding options are global and stored in settings * @param {object} state * @param {object} action */ const brandingReducer = (state = {}, action) => { switch (action.type) { case "SET_BRANDING": return action.value; case "UPDATE_BRANDING": return { ...state, [action.name]: action.value, }; } return state; }; /** * Youtube are global and stored in settings * @param {object} state * @param {object} action */ const youtubeReducer = (state = {}, action) => { switch (action.type) { case "SET_YOUTUBE": return action.value; case "UPDATE_YOUTUBE": return { ...state, [action.name]: action.value, }; } return state; }; /** * General are global and stored in settings * @param {object} state * @param {object} action */ const presetSettingsReducer = (state = {}, action) => { switch (action.type) { case "SET_PRESET_SETTINGS": return action.value; } return state; }; const audioPresetSettingsReducer = (state = {}, action) => { switch (action.type) { case "SET_PRESET_AUDIO_SETTINGS": return action.value; } return state; }; /** * For fetching the options * * @param {object} state * @param {object} action */ const optionsApi = (state, action) => { switch (action.type) { /** * Fetch our options */ case "FETCH_OPTIONS": return apiFetch({ path: "/presto-player/v1/settings/", }).then((settings) => { dispatch("presto-player/player").setBranding( settings.presto_player_branding ); dispatch("presto-player/player").setYoutube( settings.presto_player_youtube ); dispatch("presto-player/player").setPresetSettings( settings.presto_player_presets ); dispatch("presto-player/player").setPresetAudioSettings( settings.presto_player_audio_presets ); }); /** * Persist options to db */ case "SAVE_OPTIONS": const data = { presto_player_branding: pick(action?.branding, [ "logo", "color", "logo_width", "player_css", ]), }; // remove blanks Object.keys(data).forEach( (key) => (data[key] == null || !Object.keys(data?.[key] || {}).length) && delete data[key] ); apiFetch({ path: "/presto-player/v1/settings", method: "POST", data, }); return data; } }; export default combineReducers({ presetReducer, audioPresetReducer, presetLoadingReducer, videosLoadingReducer, videosReducer, proModalReducer, brandingReducer, youtubeReducer, presetSettingsReducer, optionsApi, audioPresetSettingsReducer });