import { INSIGHTS_HOST } from '@constants'; import { selectInstalledPlugins, selectActivePlugins, selectAllRecommendations, } from '@recommendations/selectors/plugin-search'; import { usePluginSearchStore } from '@recommendations/state/plugin-search'; import { objectFromKeys } from '@recommendations/utils/object-from-keys'; const { extSharedData, extRecommendationsData } = window; const showPartnerBranding = !!( extRecommendationsData?.showPartnerBranding && extSharedData?.partnerLogo ); const stores = { 'plugin-search': usePluginSearchStore, }; const validSlots = Object.keys(stores); export const recordActivity = ({ slot, event, product }) => { if (!event || !validSlots.includes(slot)) { return; } const state = stores[slot].getState(); const installedPlugins = selectInstalledPlugins(state); const activePlugins = selectActivePlugins(state); const recommendations = selectAllRecommendations(state).map( (recommendation) => objectFromKeys(recommendation, [ 'slug', 'title', 'description', 'ctaContent', 'ctaType', 'triggerContent', 'triggerType', ]), ); const recommendation = recommendations.find( (recommendation) => recommendation.slug === product, )?.slug; const payload = { event: event, timestamp: new Date().toISOString(), slot, recommendation, recommendations, recommendationsLimit: state.recommendationsLimit, query: decodeURIComponent(state.query), searchResults: state.searchPlugins, searchResultsLimit: state.searchPluginsLimit, installedPlugins, activePlugins, partnerBrandingEnabled: showPartnerBranding, partnerId: extSharedData.partnerId, siteId: extSharedData.siteId, wpVersion: extSharedData.wpVersion, wpLocale: extSharedData.wpLanguage, extendifyVersion: extSharedData.version, devbuild: extSharedData.devbuild, }; const controller = new AbortController(); window.setTimeout(() => { controller.abort(); }, 900); fetch(`${INSIGHTS_HOST}/api/v1/recommendations/activity`, { method: 'POST', headers: { Accept: 'application/json', 'Content-Type': 'application/json', 'X-Extendify-Site-ID': extSharedData.siteId, }, signal: controller.signal, body: JSON.stringify(payload), }).catch(() => null); }; import { __ } from '@wordpress/i18n'; import { BaseControl } from '@wordpress/components'; import { MediaUpload } from '@wordpress/block-editor'; import React from 'react'; import UAGB_Block_Icons from '@Controls/block-icons'; const UAGImage = ( props ) => { const { onSelectImage, backgroundImage, onRemoveImage, showVideoInput, label, disableRemove = false, allow = [ 'image' ], } = props; // This is used to render an icon in place of the background image when needed. let placeholderIcon; // This is used to determine the way the icon is colored. let iconColorType = 'stroke'; // Need to refactor this code as per multi-image select for more diversity. let labelText = __( 'Image', 'ultimate-addons-for-gutenberg' ); let selectImageLabel = __( 'Select Image', 'ultimate-addons-for-gutenberg' ); let replaceImageLabel = __( 'Change Image', 'ultimate-addons-for-gutenberg' ); let allowedTypes = [ 'image' ]; if ( showVideoInput ) { labelText = __( 'Video', 'ultimate-addons-for-gutenberg' ); selectImageLabel = __( 'Select Video', 'ultimate-addons-for-gutenberg' ); replaceImageLabel = __( 'Change Video', 'ultimate-addons-for-gutenberg' ); allowedTypes = [ 'video' ]; placeholderIcon = UAGB_Block_Icons.video_placeholder; iconColorType = 'fill'; } labelText = label ? label : labelText; labelText = false === label ? label : labelText; // Newer Dynamic Code here ( Currently used in Lottie Block ) if ( label === 'Lottie Animation' ){ // No Template Literals due to @wordpress/i18n-no-variables selectImageLabel = __( 'Select Lottie Animation', 'ultimate-addons-for-gutenberg' ); replaceImageLabel = __( 'Change Lottie Animation', 'ultimate-addons-for-gutenberg' ); allowedTypes = allow; placeholderIcon = UAGB_Block_Icons.lottie; } const renderMediaUploader = ( open ) => { const uploadType = backgroundImage?.url ? 'replace' : 'add'; return( ) }; const renderButton = ( buttonType ) => (
{ props.help }
) }