@@ -20,7 +20,7 @@ import Control from './control';
2020export default ( { feature, settingsSchema } ) => {
2121 const { getFeature, settings, setSettings, syncedSettings } = useFeatureSettings ( ) ;
2222
23- const { isAvailable } = getFeature ( feature ) ;
23+ const { isAvailable, defaultSettings } = getFeature ( feature ) ;
2424
2525 /**
2626 * Change event handler.
@@ -38,6 +38,51 @@ export default ({ feature, settingsSchema }) => {
3838 } ) ;
3939 } ;
4040
41+ /**
42+ * Determines whether a control should be rendered based on its requirements.
43+ *
44+ * @param {object } requires_fields An object representing the required field values for rendering.
45+ * Can contain 'conditions' object with field requirements and 'relationship' key ('AND' or 'OR').
46+ * @returns {boolean } Returns `true` if the control should be rendered, otherwise `false`.
47+ */
48+ const shouldRenderControl = ( requires_fields ) => {
49+ if ( ! requires_fields || Object . keys ( requires_fields ) . length === 0 ) {
50+ return true ;
51+ }
52+
53+ // Get field requirements from 'conditions' key
54+ let fieldRequirements ;
55+
56+ if ( requires_fields . conditions ) {
57+ fieldRequirements = Object . entries ( requires_fields . conditions ) ;
58+ }
59+
60+ // If no actual field requirements, return true
61+ if ( fieldRequirements . length === 0 ) {
62+ return true ;
63+ }
64+
65+ // Define the condition check function
66+ const checkCondition = ( [ fieldKey , requiredValue ] ) => {
67+ const actualValue = settings [ feature ] ?. [ fieldKey ] ;
68+ const defaultValue = defaultSettings [ fieldKey ] ?? false ;
69+ return actualValue === requiredValue ?? actualValue === defaultValue ;
70+ } ;
71+
72+ // Extract relationship type, default to 'AND'
73+ const relationship = ( requires_fields . relationship || 'AND' ) . toUpperCase ( ) ;
74+
75+ // Apply the appropriate logic based on relationship type
76+ switch ( relationship ) {
77+ case 'OR' :
78+ return fieldRequirements . some ( checkCondition ) ;
79+ case 'AND' :
80+ default :
81+ // Default to AND for any unexpected values
82+ return fieldRequirements . every ( checkCondition ) ;
83+ }
84+ } ;
85+
4186 return settingsSchema . map ( ( s ) => {
4287 const {
4388 default : defaultValue ,
@@ -48,13 +93,17 @@ export default ({ feature, settingsSchema }) => {
4893 options,
4994 requires_feature,
5095 requires_sync,
96+ requires_fields,
5197 type,
5298 } = s ;
5399
54100 /**
55- * Current control value. If no setting value is set, use the
56- * setting's default value.
101+ * Skip rendering if the control should not be rendered based on requires_fields.
57102 */
103+ if ( ! shouldRenderControl ( requires_fields ) ) {
104+ return null ;
105+ }
106+
58107 let value =
59108 typeof settings [ feature ] ?. [ key ] !== 'undefined' ? settings [ feature ] [ key ] : defaultValue ;
60109
0 commit comments