fix: prevent asset conflicts between React and Grid.js versions

Add coexistence checks to all enqueue methods to prevent loading
both React and Grid.js assets simultaneously.

Changes:
- ReactAdmin.php: Only enqueue React assets when ?react=1
- Init.php: Skip Grid.js when React active on admin pages
- Form.php, Coupon.php, Access.php: Restore classic assets when ?react=0
- Customer.php, Product.php, License.php: Add coexistence checks

Now the toggle between Classic and React versions works correctly.

Co-authored-by: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
dwindown
2026-04-18 17:02:14 +07:00
parent bd9cdac02e
commit e8fbfb14c1
74973 changed files with 6658406 additions and 71 deletions

View File

@@ -0,0 +1,24 @@
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.parseAudioUrl = void 0;
var _url = require("@wordpress/url");
/**
* WordPress dependencies
*/
const parseAudioUrl = src => {
const decodedURI = (0, _url.safeDecodeURI)(src);
const fileName = decodedURI.split('#').shift().split('?').shift().split('/').pop();
const parts = fileName.split('.');
const extension = parts.length === 2 ? parts.pop().toUpperCase() + ' ' : '';
const title = parts.join('.');
return {
title,
extension
};
};
exports.parseAudioUrl = parseAudioUrl;
//# sourceMappingURL=audio-url-parser.native.js.map

View File

@@ -0,0 +1 @@
{"version":3,"names":["_url","require","parseAudioUrl","src","decodedURI","safeDecodeURI","fileName","split","shift","pop","parts","extension","length","toUpperCase","title","join","exports"],"sources":["@wordpress/components/src/mobile/audio-player/audio-url-parser.native.js"],"sourcesContent":["/**\n * WordPress dependencies\n */\nimport { safeDecodeURI } from '@wordpress/url';\n\nexport const parseAudioUrl = ( src ) => {\n\tconst decodedURI = safeDecodeURI( src );\n\tconst fileName = decodedURI\n\t\t.split( '#' )\n\t\t.shift()\n\t\t.split( '?' )\n\t\t.shift()\n\t\t.split( '/' )\n\t\t.pop();\n\n\tconst parts = fileName.split( '.' );\n\tconst extension = parts.length === 2 ? parts.pop().toUpperCase() + ' ' : '';\n\tconst title = parts.join( '.' );\n\treturn { title, extension };\n};\n"],"mappings":";;;;;;AAGA,IAAAA,IAAA,GAAAC,OAAA;AAHA;AACA;AACA;;AAGO,MAAMC,aAAa,GAAKC,GAAG,IAAM;EACvC,MAAMC,UAAU,GAAG,IAAAC,kBAAa,EAAEF,GAAI,CAAC;EACvC,MAAMG,QAAQ,GAAGF,UAAU,CACzBG,KAAK,CAAE,GAAI,CAAC,CACZC,KAAK,CAAC,CAAC,CACPD,KAAK,CAAE,GAAI,CAAC,CACZC,KAAK,CAAC,CAAC,CACPD,KAAK,CAAE,GAAI,CAAC,CACZE,GAAG,CAAC,CAAC;EAEP,MAAMC,KAAK,GAAGJ,QAAQ,CAACC,KAAK,CAAE,GAAI,CAAC;EACnC,MAAMI,SAAS,GAAGD,KAAK,CAACE,MAAM,KAAK,CAAC,GAAGF,KAAK,CAACD,GAAG,CAAC,CAAC,CAACI,WAAW,CAAC,CAAC,GAAG,GAAG,GAAG,EAAE;EAC3E,MAAMC,KAAK,GAAGJ,KAAK,CAACK,IAAI,CAAE,GAAI,CAAC;EAC/B,OAAO;IAAED,KAAK;IAAEH;EAAU,CAAC;AAC5B,CAAC;AAACK,OAAA,CAAAd,aAAA,GAAAA,aAAA"}

View File

@@ -0,0 +1,164 @@
"use strict";
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = void 0;
var _react = require("react");
var _reactNative = require("react-native");
var _reactNativeVideo = _interopRequireDefault(require("react-native-video"));
var _primitives = require("@wordpress/primitives");
var _components = require("@wordpress/components");
var _compose = require("@wordpress/compose");
var _i18n = require("@wordpress/i18n");
var _icons = require("@wordpress/icons");
var _reactNativeBridge = require("@wordpress/react-native-bridge");
var _url = require("@wordpress/url");
var _element = require("@wordpress/element");
var _styles = _interopRequireDefault(require("./styles.scss"));
var _audioUrlParser = require("./audio-url-parser.native");
/**
* External dependencies
*/
/**
* WordPress dependencies
*/
/**
* Internal dependencies
*/
const isIOS = _reactNative.Platform.OS === 'ios';
function Player({
isUploadInProgress,
isUploadFailed,
attributes,
isSelected
}) {
const {
id,
src
} = attributes;
const [paused, setPaused] = (0, _element.useState)(true);
const onPressListen = () => {
if (src) {
if (isIOS && this.player) {
this.player.presentFullscreenPlayer();
return;
}
_reactNative.Linking.canOpenURL(src).then(supported => {
if (!supported) {
_reactNative.Alert.alert((0, _i18n.__)('Problem opening the audio'), (0, _i18n.__)('No application can handle this request.'));
} else {
return _reactNative.Linking.openURL(src);
}
}).catch(() => {
_reactNative.Alert.alert((0, _i18n.__)('Problem opening the audio'), (0, _i18n.__)('An unknown error occurred. Please try again.'));
});
}
};
const containerStyle = (0, _components.useEditorColorScheme)(_styles.default.container, _styles.default.containerDark);
const iconStyle = (0, _components.useEditorColorScheme)(_styles.default.icon, _styles.default.iconDark);
const iconDisabledStyle = (0, _components.useEditorColorScheme)(_styles.default.iconDisabled, _styles.default.iconDisabledDark);
const isDisabled = isUploadFailed || isUploadInProgress;
const finalIconStyle = {
...iconStyle,
...(isDisabled && iconDisabledStyle)
};
const iconContainerStyle = (0, _components.useEditorColorScheme)(_styles.default.iconContainer, _styles.default.iconContainerDark);
const titleContainerStyle = {
..._styles.default.titleContainer,
...(isIOS ? _styles.default.titleContainerIOS : _styles.default.titleContainerAndroid)
};
const titleStyle = (0, _components.useEditorColorScheme)(_styles.default.title, _styles.default.titleDark);
const uploadFailedStyle = (0, _components.useEditorColorScheme)(_styles.default.uploadFailed, _styles.default.uploadFailedDark);
const subtitleStyle = (0, _components.useEditorColorScheme)(_styles.default.subtitle, _styles.default.subtitleDark);
const finalSubtitleStyle = {
...subtitleStyle,
...(isUploadFailed && uploadFailedStyle)
};
const buttonBackgroundStyle = (0, _components.useEditorColorScheme)(_styles.default.buttonBackground, _styles.default.buttonBackgroundDark);
let title = '';
let extension = '';
if (src) {
const result = (0, _audioUrlParser.parseAudioUrl)(src);
extension = result.extension;
title = result.title;
}
const getSubtitleValue = () => {
if (isUploadInProgress) {
return (0, _i18n.__)('Uploading…');
}
if (isUploadFailed) {
return (0, _i18n.__)('Failed to insert audio file. Please tap for options.');
}
return extension +
// translators: displays audio file extension. e.g. MP3 audio file
(0, _i18n.__)('audio file');
};
function onAudioUploadCancelDialog() {
if (isUploadInProgress) {
(0, _reactNativeBridge.requestImageUploadCancelDialog)(id);
} else if (id && (0, _url.getProtocol)(src) === 'file:') {
(0, _reactNativeBridge.requestImageFailedRetryDialog)(id);
}
}
return (0, _react.createElement)(_reactNative.TouchableWithoutFeedback, {
accessible: !isSelected,
disabled: !isSelected,
onPress: onAudioUploadCancelDialog
}, (0, _react.createElement)(_primitives.View, {
style: containerStyle
}, (0, _react.createElement)(_primitives.View, {
style: iconContainerStyle
}, (0, _react.createElement)(_components.Icon, {
icon: _icons.audio,
style: finalIconStyle,
size: 24
})), (0, _react.createElement)(_primitives.View, {
style: titleContainerStyle
}, (0, _react.createElement)(_reactNative.Text, {
style: titleStyle
}, title), (0, _react.createElement)(_primitives.View, {
style: _styles.default.subtitleContainer
}, isUploadFailed && (0, _react.createElement)(_components.Icon, {
icon: _icons.warning,
style: {
..._styles.default.errorIcon,
...uploadFailedStyle
},
size: 16
}), (0, _react.createElement)(_reactNative.Text, {
style: finalSubtitleStyle
}, getSubtitleValue()))), !isDisabled && (0, _react.createElement)(_reactNative.TouchableWithoutFeedback, {
accessibilityLabel: (0, _i18n.__)('Audio Player'),
accessibilityRole: 'button',
accessibilityHint: (0, _i18n.__)('Double tap to listen the audio file'),
onPress: onPressListen
}, (0, _react.createElement)(_primitives.View, {
style: buttonBackgroundStyle
}, (0, _react.createElement)(_reactNative.Text, {
style: _styles.default.buttonText
}, (0, _i18n.__)('OPEN')))), isIOS && (0, _react.createElement)(_reactNativeVideo.default, {
source: {
uri: src
},
paused: paused,
ref: ref => {
this.player = ref;
},
controls: false,
ignoreSilentSwitch: 'ignore',
onFullscreenPlayerWillPresent: () => {
setPaused(false);
},
onFullscreenPlayerDidDismiss: () => {
setPaused(true);
}
})));
}
var _default = (0, _compose.withPreferredColorScheme)(Player);
exports.default = _default;
//# sourceMappingURL=index.native.js.map

File diff suppressed because one or more lines are too long