PluginProbe ʕ •ᴥ•ʔ
Presto Player / 4.5.0
Presto Player v4.5.0
4.5.0 4.4.1 4.4.0 4.3.3 4.3.2 4.3.1 4.3.0 4.2.4 4.2.3 4.2.2 4.2.0 4.2.1 trunk 1.10.0 1.10.1 1.10.2 1.11.0 1.12.0 1.13.0 1.14.0 1.14.1 1.5.10 1.5.11 1.5.12 1.5.13 1.5.14 1.5.15 1.5.5 1.5.6 1.5.7 1.5.8 1.5.9 1.6.0 1.6.1 1.6.10 1.6.11 1.6.12 1.6.13 1.6.2 1.6.3 1.6.4 1.6.5 1.6.6 1.6.7 1.6.8 1.6.9 1.7.0 1.7.1 1.7.2 1.8.0 1.8.1 1.8.2 1.8.3 1.8.4 1.8.5 1.8.6 1.9.0 1.9.1 1.9.10 1.9.11 1.9.12 1.9.13 1.9.14 1.9.2 1.9.3 1.9.4 1.9.5 1.9.6 1.9.7 1.9.8 1.9.9 2.0.0 2.0.1 2.0.10 2.0.11 2.0.12 2.0.13 2.0.14 2.0.15 2.0.16 2.0.2 2.0.3 2.0.4 2.0.5 2.0.6 2.0.7 2.0.8 2.0.9 2.1.0 2.2.0 2.2.1 2.2.2 2.2.3 2.2.3-beta1 2.3.0 2.3.1 2.3.2 2.3.3 3.0.0 3.0.0-beta1 3.0.1 3.0.2 3.0.3 3.0.4 3.0.5 3.0.6 3.0.7 3.0.8 3.1.0 3.1.1 3.1.2 3.1.3 4.0.0 4.0.1 4.0.2 4.0.3 4.0.4 4.0.5 4.0.6 4.0.7 4.0.8 4.1.0 4.1.1 4.1.2 4.1.3 4.1.4
presto-player / src / admin / dashboard / hooks / useSettingOption.js
presto-player / src / admin / dashboard / hooks Last commit date
test 2 months ago useAbilities.js 2 weeks ago useCompleteOnboarding.js 2 months ago useDateRangePicker.js 3 months ago useEmail.ts 3 months ago useEngagementChartData.js 3 months ago useLicenseSettings.js 3 months ago useLink.js 3 months ago useMcpAdapterInstall.js 2 weeks ago useMediaDetail.js 3 months ago useMediaLibrary.js 3 months ago useMediaList.ts 3 months ago usePerformanceSettings.js 3 months ago useRegisterActivePage.js 3 months ago useSettingOption.js 2 weeks ago useSimpleSettingsPage.js 2 weeks ago useTopPerforming.js 3 months ago useTopVideosPaginated.js 3 months ago useUpgradeCTA.js 3 months ago useUserDetail.js 3 months ago
useSettingOption.js
73 lines
1 import { useCallback, useMemo } from 'react';
2 import isEqual from 'lodash/isEqual';
3 import { useSettingsData } from '../pages/settings/shared/SettingsDataProvider';
4
5 const useSettingOption = ( optionKey, defaultValue ) => {
6 const {
7 settings,
8 lastSaved,
9 isLoading,
10 savingKeys,
11 updateLocal,
12 resetKey,
13 saveSlice,
14 } = useSettingsData();
15
16 // WP core's /wp/v2/settings returns `null` for any stored value that fails
17 // its registered schema (e.g. an empty string stored for a `boolean` option).
18 // Treat null the same as undefined so the UI falls back to the default and
19 // saves don't echo that null back — which WP rejects with
20 // `rest_invalid_stored_value`.
21 const rawData = settings?.[ optionKey ];
22 const data =
23 rawData === undefined || rawData === null ? defaultValue : rawData;
24
25 const savedValue = lastSaved?.[ optionKey ];
26 const effectiveSaved =
27 savedValue === undefined || savedValue === null ? defaultValue : savedValue;
28
29 const setData = useCallback(
30 ( next ) => updateLocal( optionKey, next ),
31 [ optionKey, updateLocal ]
32 );
33
34 const save = useCallback(
35 () => saveSlice( [ optionKey ] ),
36 [ saveSlice, optionKey ]
37 );
38 const reset = useCallback(
39 () => resetKey( optionKey ),
40 [ resetKey, optionKey ]
41 );
42
43 // Derived (not a flag): typing + reverting is cleanly not-dirty, and pasting
44 // identical content doesn't falsely mark the page dirty. Deep equality is
45 // required because most option values are objects (e.g. branding, bunny_stream).
46 const isDirty = useMemo(
47 () => ! isEqual( data, effectiveSaved ),
48 [ data, effectiveSaved ]
49 );
50
51 const isSaving = savingKeys.has( optionKey );
52
53 // savedData is what the server actually has. Anything that hands the user a
54 // live endpoint or fires a request has to gate on this, not on `data` —
55 // otherwise flipping a switch advertises a connector the backend hasn't
56 // enabled yet.
57 return useMemo(
58 () => ( {
59 data,
60 savedData: effectiveSaved,
61 setData,
62 save,
63 reset,
64 isDirty,
65 isSaving,
66 isLoading,
67 } ),
68 [ data, effectiveSaved, setData, save, reset, isDirty, isSaving, isLoading ]
69 );
70 };
71
72 export default useSettingOption;
73