'defer', 'in_footer' => true ]; wp_register_script( 'jvb-login', JVB_URL.'assets/js/min/login.min.js', [ 'jvb-auth', 'jvb-form', ], $version ); wp_register_style( 'jvb-form', JVB_URL.'assets/css/forms.min.css', [], $version, ); wp_register_style( 'jvb-copy-hours', JVB_URL.'assets/css/copy-hours.min.css', [], $version, ); wp_register_style( 'jvb-dash', JVB_URL.'assets/css/dash.min.css', [], $version ); //Helper functions used by other classes wp_register_script( 'jvb-utility', JVB_URL.'assets/js/min/utility.min.js', ['jvb-auth'], $version, $strategy ); wp_register_script( 'jvb-auth', JVB_URL.'assets/js/min/auth.min.js', [], $version, $strategy ); wp_localize_script('jvb-auth', 'jvbBase', ['base' => BASE]); wp_localize_script('jvb-auth', 'jvbAuth', LoginRoutes::auth()); // wp_register_script( // 'jvb-interactions', // JVB_URL.'assets/js/min/interactions.min.js', // [ // 'jvb-queue', // 'jvb-data-store' // ], // $version, // $strategy // ); wp_register_script( 'jvb-favourites', JVB_URL.'assets/js/min/favourites.min.js', [ 'jvb-queue', 'jvb-data-store', ], $version, $strategy ); wp_register_script( 'jvb-votes', JVB_URL.'assets/js/min/votes.min.js', [ 'jvb-queue', 'jvb-data-store', ], $version, $strategy ); wp_register_script( 'jvb-settings', JVB_URL.'assets/js/min/settings.min.js', [ 'jvb-utility', 'jvb-data-store' ], $version, $strategy ); wp_register_script( 'jvb-popup', JVB_URL.'assets/js/min/popup.min.js', [ 'jvb-a11y' ], $version, $strategy ); //TODO remove? // wp_register_script( // 'jvb-media', // JVB_URL.'assets/js/min/media.min.js', // [], // $version, // $strategy // ); wp_register_script( 'jvb-copy-hours', JVB_URL.'assets/js/min/hours.min.js', [ 'jvb-form', 'jvb-utility', 'jvb-modal', 'jvb-a11y' ], $version, $strategy ); wp_register_script( 'jvb-gallery', JVB_URL.'assets/js/min/gallery.min.js', [ 'jvb-utility', 'jvb-modal', ], $version, $strategy ); wp_register_script( 'jvb-swiper', JVB_URL.'assets/js/min/swiper.min.js', [ 'jvb-utility', ], $version, $strategy ); wp_register_script( 'jvb-integrations', JVB_URL.'assets/js/min/integrations.min.js', ['jvb-auth'], $version, $strategy ); $integration_nonces = [ 'jvb_square_sync' => wp_create_nonce('jvb_square_sync'), 'jvb_gmb_sync_reviews' => wp_create_nonce('jvb_gmb_sync'), 'jvb_gmb_test_api' => wp_create_nonce('jvb_gmb_test'), 'jvb_bluesky_test_post' => wp_create_nonce('jvb_bluesky_test'), 'jvb_facebook_test_post' => wp_create_nonce('jvb_facebook_test'), 'jvb_instagram_test_post' => wp_create_nonce('jvb_instagram_test'), 'jvb_instagram_sync_media' => wp_create_nonce('jvb_instagram_sync'), 'jvb_umami_refresh_data' => wp_create_nonce('jvb_umami_refresh'), 'jvb_export_integration_settings' => wp_create_nonce('jvb_integration_export'), ]; wp_register_script( 'jvb-page-nav', JVB_URL.'assets/js/min/page-nav.min.js', [], $version, $strategy ); //A11y accessibility wp_register_script( 'jvb-a11y', JVB_URL.'assets/js/min/a11y.min.js', [], $version, $strategy ); //Central Error Management wp_register_script( 'jvb-error', JVB_URL.'assets/js/min/error.min.js', [ ], $version, $strategy ); //Simple Cache Management wp_register_script( 'jvb-cache', JVB_URL.'assets/js/min/cache.min.js', [], $version, $strategy ); //Data Store - IndexedDB utility wp_register_Script( 'jvb-data-store', JVB_URL.'assets/js/min/dataStore.min.js', [], $version, $strategy ); //SEO Admin wp_register_script( 'jvb-schema', JVB_URL.'assets/js/min/schema.min.js', ['jvb-a11y', 'jvb-form', 'jvb-tabs'], $version, $strategy ); //Tabs functionality wp_register_script( 'jvb-tabs', JVB_URL.'assets/js/min/tabs.min.js', [ 'jvb-a11y' ], $version, $strategy ); //Modal functionality wp_register_script( 'jvb-modal', JVB_URL.'assets/js/min/modal.min.js', [ 'jvb-a11y' ], $version, $strategy ); //Central Queue Management wp_register_script( 'jvb-queue', JVB_URL.'assets/js/min/queue.min.js', [ 'jvb-a11y', 'jvb-error', 'jvb-data-store', 'jvb-utility', 'jvb-popup' ], $version, $strategy ); //TaxonomySelector wp_register_script( 'jvb-selector', JVB_URL.'assets/js/min/selector.min.js', [ 'jvb-utility', 'jvb-a11y', 'jvb-error', 'jvb-data-store', 'jvb-modal', // 'jvb-loading' ], $version, $strategy ); // Taxonomy creator - only for dashboard/users with permission wp_register_script( 'jvb-creator', JVB_URL.'assets/js/min/creator.min.js', ['jvb-selector'], $version, $strategy ); //PostSelector.js wp_register_script( 'jvb-post-selector', JVB_URL.'assets/js/min/postSelector.min.js', [ 'jvb-selector' ], '1.0.1', [ 'strategy' => 'defer', 'in_footer' => true, ] ); //Upload Manager wp_register_script( 'jvb-handle-selection', JVB_URL.'assets/js/min/handleSelection.min.js', [ 'jvb-a11y', 'jvb-utility', ], $version, $strategy ); //TODO: Likely don't need. wp_register_script( 'jvb-drag-handler', JVB_URL.'assets/js/min/dragHandler.min.js', [ 'jvb-a11y', 'jvb-utility', ], $version, $strategy ); //Upload Manager wp_register_script( 'jvb-uploader', JVB_URL.'assets/js/min/uploader.min.js', [ 'sortable-multidrag', 'jvb-cache', 'jvb-a11y', 'jvb-utility', 'jvb-handle-selection', 'jvb-modal', // 'jvb-drag-handler', // 'jvb-loading', 'jvb-queue', // 'jvb-notifications' ], $version, $strategy ); //Notifications wp_register_script( 'jvb-notifications', JVB_URL.'assets/js/min/notifications.min.js', [ 'jvb-utility', ], $version, $strategy ); //Base Form Handler wp_register_script( 'jvb-form', JVB_URL.'assets/js/min/form.min.js', [ 'jvb-utility', 'jvb-tabs', 'jvb-selector', 'jvb-uploader', 'sortable-js', 'jvb-populate-form', 'jvb-quill', ], $version, $strategy ); wp_register_script( 'jvb-populate-form', JVB_URL.'assets/js/min/populate.min.js', [], $version, $strategy ); //CRUD Base Manager wp_register_script( 'jvb-crud', JVB_URL.'assets/js/min/crud.min.js', [ 'jvb-selector', 'jvb-settings', 'jvb-a11y', 'jvb-error', 'jvb-data-store', 'jvb-populate-form', 'jvb-queue', 'jvb-utility', 'jvb-quill', 'jvb-form', 'jvb-view', 'jvb-modal' ], $version, $strategy ); wp_register_script( 'jvb-view', JVB_URL.'assets/js/min/view.min.js', [ 'jvb-settings', 'jvb-a11y', 'jvb-utility', 'jvb-data-store', 'jvb-error', 'jvb-populate-form' ], $version, $strategy, ); //Bio Manager TODO: Replace with Form Handler wp_register_script( 'jvb-bio', JVB_URL.'assets/js/min/bioManager.min.js', [ 'jvb-tabs', 'jvb-form', 'jvb-queue' ], $version, $strategy ); //Shop Manager TODO: Replace with Form Handler wp_register_script( 'jvb-shop', JVB_URL.'assets/js/min/shopManager.min.js', [ 'jvb-tabs', 'jvb-form', 'jvb-queue' ], $version, $strategy ); //Content Manager TODO: Replace with CRUD.js wp_register_script( 'jvb-content', JVB_URL.'assets/js/min/ContentManager.min.js', [ 'jvb-queue', 'jvb-cache', 'jvb-error', 'jvb-uploader', 'jvb-utility', 'jvb-modal', 'jvb-selector', 'jvb-post-selector', ], $version, $strategy ); //Favourites Manager TODO: Replace with CRUD.js wp_register_script( 'jvb-favourites', JVB_URL.'assets/js/min/favouritesManager.min.js', [ 'jvb-a11y', 'jvb-queue', 'jvb-cache', 'jvb-error', 'jvb-utility', 'jvb-tabs', 'jvb-selector', 'jvb-notifications', ], $version, $strategy ); //News Manager TODO: Replace with CRUD.js wp_register_script( 'jvb-news', JVB_URL.'assets/js/min/news.min.js', [ 'jvb-a11y', 'jvb-queue', 'jvb-cache', 'jvb-error', 'jvb-utility', 'jvb-modal', 'jvb-selector', 'jvb-tabs', ], $version, $strategy ); //Notification Manager TODO: Replace with CRUD? Not quite... wp_register_script( 'jvb-notification-manager', JVB_URL.'assets/js/min/notificationManager.min.js', [ 'jvb-a11y', 'jvb-tabs', ], $version, $strategy ); wp_register_script( 'jvb-navigation', JVB_URL.'assets/js/min/navigation.min.js', [], $version, $strategy ); /***************************************** Libraries *****************************************/ wp_register_script( 'quill-js', 'https://cdn.jsdelivr.net/npm/quill@2.0.3/dist/quill.js', [], null, true ); wp_register_script( 'sortable-js', 'https://cdn.jsdelivr.net/npm/sortablejs@latest/Sortable.min.js', array(), null, true ); // Load MultiDrag plugin wp_register_script( 'sortable-multidrag', 'https://cdn.jsdelivr.net/npm/sortablejs@latest/plugins/MultiDrag.min.js', array('sortable-js'), null, true ); if (class_exists('WooCommerce')) { wp_register_script( 'jvb-checkout', JVB_URL.'assets/js/min/cartCheck.min.js', [], null, true ); wp_enqueue_script('jvb-checkout'); } /****************************************** Plugins ******************************************/ wp_register_script( 'jvb-quill', JVB_URL.'assets/js/min/quill.min.js', [ 'quill-js' ], $version, $strategy ); } /** * Scripts */ add_action('wp_enqueue_scripts', 'jvbScripts', 10); function jvbScripts():void { add_action('wp_head', 'jvbInlineNavStyles'); if (Site::has('dashboard')) { wp_enqueue_script('jvb-queue'); } wp_enqueue_script('jvb-auth'); wp_enqueue_script('jvb-settings'); wp_enqueue_script('jvb-navigation'); // wp_enqueue_script('jvb-ui'); // wp_enqueue_script('jvb-media'); wp_enqueue_script('jvb-gallery'); wp_enqueue_script('jvb-cache'); $interactions = []; if (Site::has('favourites')) { $interactions[] = 'favourites'; } if (!empty(Registrar::withFeature('karma'))) { $interactions[] = 'karma'; } if (Site::has('notifications')) { $interactions[] = 'notifications'; } if (!empty($interactions)) { foreach($interactions as $interaction) { wp_enqueue_script('jvb-'.$interaction); } } $queue = [ 'api' => rest_url('jvb/v1/'), 'redirect' => get_home_url(null, '/login/'), 'labels' => Registrar::getLabels(), ]; wp_localize_script('jvb-auth', 'jvbSettings', $queue); $initUserSettings = 'async function initUserItems() { if (!jvbSettings.currentUser) return; window.userFavourites = {}; window.userVotes = {}; '; if (Site::has('favourites')) { wp_enqueue_script('jvb-favourites'); $initUserSettings .= ' //Fetch user favourites try { const result = await window.jvbCache.fetchWithCache( `${jvbSettings.api}favourites?all=true`, { method: \'GET\', headers: {\'X-WP-Nonce\': jvbSettings.nonce} } ); if (result && result.favourites) { for (const key in result.favourites) { window.userFavourites[key] = new Set(); result.favourites[key].forEach(id => { window.userFavourites[key].add(parseInt(id)); }); } } } catch (error) { console.error(\'Failed to fetch user favourites:\', error); }'; } if (!empty(Registrar::withFeature('karma'))) { wp_enqueue_script('jvb-votes'); $initUserSettings .= '// Fetch user votes try { const result = await window.jvbCache.fetchWithCache( `${jvbSettings.api}vote?user=${jvbSettings.currentUser}`, { method: \'GET\', headers: {\'X-WP-Nonce\': jvbSettings.nonce} }, {forceRefresh: true} ); window.userVotes = {}; if (result) { for (const key in result) { window.userVotes[key] = new Map(); for (const [id, vote] of Object.entries(result[key])) { window.userVotes[key].set(parseInt(id), vote); } } } } catch (error) { console.error(\'Failed to fetch user votes:\', error); }'; } $initUserSettings .= '} initUserItems();'; // wp_add_inline_script('jvb-queue', $initUserSettings, 'after'); if (is_search() || is_tax(BASE.'shop') || is_singular(BASE.'artist') || jvbIsDirectory() ) { wp_enqueue_script('jvb-page-nav'); } if (has_block('jvb/summaryBlock')) { wp_enqueue_script('jvb-page-nav'); } // Only load on single shop pages or other relevant pages if (is_tax(BASE.'shop') || is_singular(BASE.'partner')) { $ID = get_queried_object_id(); if (is_tax()) { $check = get_term_meta($ID, BASE.'has_map', true); } else { $check = get_post_meta($ID, BASE.'has_map', true); } // if ($check && $check !== '') { //// wp_enqueue_script( //// 'google-maps-frontend', //// 'https://maps.googleapis.com/maps/api/js?key=' . GOOGLE_API . '&callback=googleMapsLoaded', //// [], //// null, //// ['strategy' => 'async', //// 'in_footer' => true] //// ); // // // Add the callback function // wp_add_inline_script('google-maps-frontend', ' // function googleMapsLoaded() { // if (window.googleMapsCallbacks && window.googleMapsCallbacks.length) { // window.googleMapsCallbacks.forEach(callback => callback()); // } // } // '); // } } if (is_user_logged_in() && Site::has('notifications')) { wp_enqueue_script('jvb-notifications'); wp_localize_script('jvb-notifications', 'notificationSettings', array( 'homeUrl' => home_url(), 'strings' => array( 'loading' => 'Loading...', 'error' => 'Failed to load notifications', 'noNotifications' => 'No new notifications', 'viewAll' => 'View All Notifications', 'markRead' => 'Mark as read', 'review' => 'Review' ) )); } // jvbAddScriptDependency('jvb-feed-view-script', 'jvb-queue'); jvbAddScriptDependency('jvb-feed-view-script', 'jvb-selector'); jvbAddScriptDependency('jvb-feed-view-script', 'jvb-data-store'); jvbAddScriptDependency('jvb-feed-view-script', 'jvb-cache'); jvbAddScriptDependency('jvb-feed-view-script', 'jvb-a11y'); jvbAddScriptDependency('jvb-feed-view-script', 'jvb-utility'); jvbAddScriptDependency('jvb-feed-view-script', 'jvb-gallery'); // jvbAddScriptDependency('jvb-feed-view-script', 'jvb-loading'); jvbAddScriptDependency('jvb-forms-view-script', 'jvb-queue'); jvbAddScriptDependency('jvb-forms-view-script', 'jvb-quill'); jvbAddScriptDependency('jvb-forms-view-script', 'jvb-form'); jvbAddScriptDependency('jvb-forms-view-script', 'jvb-tabs'); jvbAddScriptDependency('jvb-timeline-view-script', 'jvb-gallery'); } //add_action('init', 'jvb_add_script_dependencies'); //function jvb_add_script_dependencies():void //{ // //} function jvbAddScriptDependency(string $handle, string $dep):bool { global $wp_scripts; $script = $wp_scripts->query($handle); if (!$script) { return false; } if (!in_array($dep, $script->deps)) { $script->deps[] = $dep; } return true; }