HEX
Server: Apache/2.4.65 (Debian)
System: Linux localhost 6.9.12 #1 SMP Tue May 5 14:23:20 UTC 2026 x86_64
User: www-data (33)
PHP: 8.2.30
Disabled: NONE
Upload Files
File: /var/www/html/wp-content/plugins/bp-better-messages/addons/multi-vendor-x.php
<?php
defined( 'ABSPATH' ) || exit;

if ( ! class_exists( 'Better_Messages_MultiVendorX' ) ) {

    class Better_Messages_MultiVendorX
    {

        public static function instance()
        {

            static $instance = null;

            if (null === $instance) {
                $instance = new Better_Messages_MultiVendorX();
            }

            return $instance;
        }

        public function __construct(){
            if( Better_Messages()->settings['MultiVendorXIntegration'] !== '1' ) return;

            add_filter( 'mvx_vendor_dashboard_nav', array( $this, 'vendor_dashboard_nav' ), 20, 1 );
            add_filter( 'mvx_endpoints_query_vars', array( $this, 'endpoints_query_vars' ), 20, 1 );

            add_filter( 'better_messages_rest_thread_item', array( $this, 'thread_item' ), 10, 5 );
            add_filter( 'better_messages_rest_user_item', array( $this, 'vendor_user_meta' ), 20, 3 );
            add_filter( 'bp_better_messages_page', array( $this, 'vendor_messages_page' ), 20, 2 );

            add_action( 'mvx_vendor_add_store', array( $this, 'store_settings_output' ), 10, 1 );
            add_action( 'mvx_save_custom_store', array( $this, 'store_settings_save'), 10, 2 );

            add_action( 'mvx_vendor_dashboard_bm-messages_endpoint', array( $this, 'vendor_messages' ) );
            add_action( 'mvx_frontend_enqueue_scripts', array( $this, 'dashboard_scripts'), 20, 1 );

            add_action( 'woocommerce_single_product_summary',   array( &$this, 'product_page_contact_button' ), 35 );
            add_shortcode( 'better_messages_multivendorx_product_button',   array( &$this, 'product_page_contact_button_shortcode' ) );
            add_shortcode( 'better_messages_multivendorx_store_button',   array( &$this, 'store_page_contact_button_shortcode' ) );

            add_action( 'mvx_additional_button_at_banner', array( $this, 'display_store_button' ), 10, 1 );

        }

        public function vendor_messages_page( $url, $user_id ){

            if( is_user_mvx_vendor( $user_id ) ) {
                $livechat_enabled = $this->is_livechat_enabled($user_id);
                if( $livechat_enabled ){
                    return mvx_get_vendor_dashboard_endpoint_url('messages');
                }
            }
            return $url;
        }

        public function store_page_contact_button_shortcode(){
            return $this->display_store_button( true );
        }

        public function display_store_button( $return = false ){
            $user_id = mvx_find_shop_page_vendor();

            $livechat_enabled = $this->is_livechat_enabled( $user_id );

            if( $livechat_enabled ){
                $shortcode = do_shortcode('[better_messages_live_chat_button
                type="button"
                class="mvx-butn"
                text="' . Better_Messages()->shortcodes->esc_brackets( esc_attr_x( 'Live Chat', 'MultiVendorX Integration (Store page)', 'bp-better-messages' ) ) . '"
                user_id="' . $user_id . '"
                unique_tag="multivendorx_store_chat_' . $user_id . '"
                ]');

                if( $return ) {
                    return $shortcode;
                } else {
                    echo $shortcode;
                }

            }
        }

        public function is_livechat_enabled( $store_id ){
            if( is_user_mvx_vendor( $store_id ) ){
                $meta = get_user_meta($store_id, '_vendor_bm_livechat', true);
                if( $meta === 'disable' ) {
                    return false;
                } else {
                    return true;
                }
            } else {
                return apply_filters('better_messages_multivendorx_store_default', true, $store_id );
            }
        }

        public function store_settings_save( $user_id, $post ){
            if ( $post && isset( $post['vendor_bm_livechat'] ) && !empty( $post['vendor_bm_livechat'] )) {
                update_user_meta($user_id, '_vendor_bm_livechat', wc_clean($post['vendor_bm_livechat']));
            } else {
                update_user_meta($user_id, '_vendor_bm_livechat', 'disable');
            }
        }

        public function store_settings_output( $vendor ){
            $enable_livechat = $this->is_livechat_enabled( $vendor->id );
            ?>
            <div class="form-group">
                <label class="control-label col-sm-3 col-md-3"><?php _ex( 'Live Chats', 'Marketplace Integrations', 'bp-better-messages' ); ?></label>
                <div class="col-md-6 col-sm-9">
                    <ul class="select-store-details">
                        <li>
                            <label>
                                <input type="checkbox" name="vendor_bm_livechat" value="enable" <?php if ($enable_livechat) echo 'checked'; ?>><?php echo esc_html_x( 'Enable live chat in store', 'Marketplace Integrations', 'bp-better-messages'  ); ?>
                            </label>
                        </li>
                    </ul>
                </div>
            </div>
            <?php
        }

        function vendor_user_meta( $item, $user_id, $include_personal ){
            if( is_user_mvx_vendor( $user_id ) && $this->is_livechat_enabled( $user_id ) ){
                $vendor_data = get_mvx_vendor($user_id);

                if( $vendor_data ) {
                    $item['url'] = esc_url( $vendor_data->get_permalink() );
                    $item['avatar'] = esc_url( $vendor_data->get_image() );
                    $item['name'] = esc_attr( $vendor_data->get_page_title() );
                }
            }

            return $item;
        }

        public function thread_item( $thread_item, $thread_id, $thread_type, $include_personal, $user_id ){
            if( $thread_type !== 'thread'){
                return $thread_item;
            }

            $unique_tag = Better_Messages()->functions->get_thread_meta( $thread_id, 'unique_tag' );

            if( ! empty( $unique_tag ) ){
                if( str_starts_with( $unique_tag, 'multivendorx_product_chat_' ) ){
                    $parts = explode('|', $unique_tag);
                    if( isset( $parts[0] ) ){
                        $product_id = str_replace( 'multivendorx_product_chat_', '', $parts[0]);
                        $thread_info = '';
                        if( isset( $thread_item['threadInfo'] ) ) $thread_info = $thread_item['threadInfo'];
                        $thread_info .= $this->thread_info( $product_id );
                        $thread_item['threadInfo'] = $thread_info;
                    }
                }
            }

            return $thread_item;
        }

        public function thread_info( $product_id ){
            if( ! function_exists('wc_get_product') ) return '';

            $product = wc_get_product( $product_id );
            if( ! $product ) return '';

            $image_id = $product->get_image_id();
            $image_src = wp_get_attachment_image_src( $image_id, [100, 100] );

            $image         = false;
            $title         = $product->get_title();
            $url           = $product->get_permalink();
            $price         = $product->get_price_html();

            if( $image_src ){
                $image = $image_src[0];
            }


            $html = '<div class="bm-product-info">';

            if( $image ){
                $html .= '<div class="bm-product-image">';
                $html .= '<a href="' . $url . '" target="_blank"><img src="' . $image . '" alt="' . $title . '" /></a>';
                $html .= '</div>';
            }

            $html .= '<div class="bm-product-details">';
            $html .= '<div class="bm-product-title"><a href="' . $url . '" target="_blank">' . $title . '</a></div>';
            $html .= '<div class="bm-product-price">' . $price . '</div>';
            $html .= '</div>';

            $html .= '</div>';

            return $html;
        }

        public function product_page_contact_button_shortcode(){
            return $this->product_page_contact_button( true );
        }

        public function product_page_contact_button( $return = false )
        {
            global $post;

            if (is_product() && $post && is_object($post)) {
                $seller_id = (int) $post->post_author;

                if( is_user_mvx_vendor( $seller_id ) ){
                    $livechat_enabled = $this->is_livechat_enabled( $seller_id );

                    if( $livechat_enabled ){
                        $product = wc_get_product( get_the_ID() );

                        $subject = esc_attr(sprintf( _x('Question about your product %s', 'MultiVendorX Integration (Product page)', 'bp-better-messages'), $product->get_title() ) );

                        $shortcode = do_shortcode('[better_messages_live_chat_button
                        class="bm-style-btn"
                        text="' . Better_Messages()->shortcodes->esc_brackets(esc_attr_x('Live Chat', 'MultiVendorX Integration (Product page)', 'bp-better-messages') ) . '"
                        user_id="' . $seller_id . '"
                        subject="' . Better_Messages()->shortcodes->esc_brackets($subject ) . '"
                        unique_tag="multivendorx_product_chat_' . get_the_ID() . '"
                        ]');

                        if( $return ){
                            return $shortcode;
                        } else {
                            echo $shortcode;
                        }
                    }
                }
            }

        }

        public function dashboard_scripts( $is_vendor_dashboard ){
            if( $is_vendor_dashboard ){
                if( $this->is_livechat_enabled( get_current_user_id() ) ) {
                    Better_Messages()->enqueue_css(true);


                    wp_add_inline_script('better-messages', 'jQuery(document).ready(function($){
                        var link = jQuery(".mvx-venrod-dashboard-nav-link--bm-messages");
                        link.append( \'' . do_shortcode('[better_messages_unread_counter hide_when_no_messages="1" preserve_space="0"]') . '\' );
                    });' );
                }
            }
        }

        public function vendor_messages(){
            echo '<div class="col-md-12">';
            echo do_shortcode('[better_messages]');
            echo '</div>';
        }
        public function endpoints_query_vars( $endpoints ){
            $endpoints['bm-messages'] = [
                'label' => __('Messages', 'bp-better-messages'),
                'endpoint' => 'messages'
            ];

            return $endpoints;
        }

        public function vendor_dashboard_nav( $nav_items ){
            if( $this->is_livechat_enabled( get_current_user_id() ) ) {
                $nav_items['bm-messages'] = [
                    'label' => 'Messages',
                    'url' => mvx_get_vendor_dashboard_endpoint_url('messages'),
                    'capability' => true,
                    'position' => 29,
                    'submenu' => [],
                    'link_target' => '_self',
                    'nav_icon' => 'mvx-font ico-message'
                ];
            }

            return $nav_items;
        }
    }
}