26 July 2023

How to integrate one signal push notification in website (Laravel)?

Integrate one signal push notification

    <script src="https://cdn.onesignal.com/sdks/OneSignalSDK.js" async=""></script>
    <script>
    var OneSignal = window.OneSignal || [];
        var initConfig = {
            appId: "{{ env('OneSignalApp_ID') }}",
            notifyButton: {
                enable: true
            },
        };
        OneSignal.push(function () {
            OneSignal.init(initConfig);
            console.log(OneSignal);
        });
        OneSignal.push(function() {
/*             OneSignal.isPushNotificationsEnabled(function(isEnabled) {
                if (isEnabled)
                console.log("Push notifications are enabled!");
                else
                console.log("Push notifications are not enabled yet.");    
            }); */

            OneSignal.isPushNotificationsEnabled(function(isEnabled) {
            if (isEnabled) {
                // user has subscribed
                OneSignal.getUserId( function(userId) {
                    console.log('player_id of the subscribed user is : ' + userId);
                    if($("#one_signal_player_id").length > 0){
                        $("#one_signal_player_id").val(userId);
                    }
                    // Make a POST call to your server with the user ID        
                });
            }
            });
        });
        </script>

How to integrate pubnub chat in website?

Integrate pubnub chat

 
<script src="https://code.jquery.com/jquery-3.7.0.min.js" integrity="sha256-2Pmvv0kuTBOenSvLm6bvfBSSHrUJ+3A7x6P5Ebd07/g=" crossorigin="anonymous"></script>

<script src="https://cdn.pubnub.com/sdk/javascript/pubnub.7.2.3.min.js"></script>

<style>

.user_pubnub_mgs {

    height: 450px;

    border: 1px solid #d0d0d0;

    padding: 10px 12px;

    overflow-y: auto;

}

.other_user_chat {

    background: #b4b4b4;

    margin-bottom: 10px;

    padding: 10px;

    width: fit-content;

    font-size: 14px;

    border-radius: 10px 0px 10px 10px;

    color: #fff;

    display: block;

    word-break: break-word;

}

.current_user_chat {

    background: #2695ee;

    margin-bottom: 10px;

    padding: 10px;

    width: fit-content;

    font-size: 14px;

    border-radius: 10px 0px 10px 10px;

    color: #fff;

    display: block;

    word-break: break-word;

    margin-left: auto;

}

#send_chat_bt {

    background: #2695ee;

}

#send_chat_bt[disabled] {

    background: #dadada !important;

}

</style>

<script>

const buttonClick = () => {

    var input = document.getElementById('message-input');

    publishMessage(input.value);

    input.value = '';

};


const delete_full_messages = () => {

    var channel_name = "hello_world";

    pubnub_delete_full_messages(channel_name);

};


const showMessage = (msg) => {

var message = '';

msg = msg;

if(msg !== null && msg !== ""){

    var currentUserId = {{ auth('customer')->user()->id }};

    console.log(msg);

    var user_class = '';

    if (currentUserId == msg.user_id) {

        user_class = "current_user_chat";

    }

    else{

        user_class = "other_user_chat";

    }

    console.log(user_class);

    message = "<div class='chat_messages " + user_class + "'>" + msg.chat_message     + "</div>"

    $('#messages').append(message);

    if(message){

         const divElement = $(".user_pubnub_mgs");

        const innerScrollHeight = divElement.prop("scrollHeight") - divElement.height();

        $(".user_pubnub_mgs").animate({

            scrollTop: $('.user_pubnub_mgs').offset().top + innerScrollHeight

        }, 0); 

    }  

}  

};



const appendMessageToWebPage = (message) => {

    myObj = message.entry.chat_message;

    if (myObj !== null && typeof myObj !== 'undefined') {

        showMessage(message.entry);

    }

}


let pubnub;

const setupPubNub = () => {

    // Update this block with your publish/subscribe keys

    pubnub = new PubNub({

        publishKey: "pub-c-52377dc0-a888-44a0-841f-825b319416b9",

        subscribeKey: "sub-c-c2a10f4c-394c-4b89-ba16-4de660c4f0b0",

        userId: "1"

    });


    // add listener

    const listener = {

        status: (statusEvent) => {

            if (statusEvent.category === "PNConnectedCategory") {

                console.log("Connected");

            }

        },

        message: (messageEvent) => {


            // handle message

            const channelName = messageEvent.channel;

            const channelGroup = messageEvent.subscription;

            const publishTimetoken = messageEvent.timetoken;

            const msg = messageEvent.message;

            const publisher = messageEvent.publisher;


            //show time

            const unixTimestamp = messageEvent.timetoken / 10000000;

            const gmtDate = new Date(unixTimestamp * 1000);

            const localeDateTime = gmtDate.toLocaleString();



            showMessage(messageEvent.message);


        },

        messageAction: function(ma) {

            // handle message actions

            console.log('messageAction');

        },

        presence: (presenceEvent) => {

            // handle presence

            console.log('working');

        }


    };

    pubnub.addListener(listener);


    // subscribe to a channel

    pubnub.subscribe({

        channels: ["hello_world"]

    });



    pubnub.history({

        channel: 'hello_world',


    }, function(status, response) {

/*         console.log(response.messages); */

        if (response.messages.length) {

            console.log(response.messages);

            response.messages.forEach(appendMessageToWebPage);

        }


    });


};


// run after page is loaded

window.onload = setupPubNub;

// publish message

const publishMessage = async (message) => {

    // With the right payload, you can publish a message, add a reaction to a message,

    // send a push notification, or send a small payload called a signal.

    var currentUserId = {{ auth('customer')->user()->id }};

    const publishPayload = {

        channel: "hello_world",

        message: {

            title: "User Chat",

            type: "user_chat",

            chat_message: message,

            user_id: currentUserId,

            read: 0,

        }

    };

    await pubnub.publish(publishPayload);

}

// Delete_messages message

const pubnub_delete_full_messages = async (channel_name) => {

    // With the right payload, you can publish a message, add a reaction to a message,

    // send a push notification, or send a small payload called a signal.

    try {

        const result = await pubnub.deleteMessages({

            channel: channel_name,

            //start: "15088506076921021",

            //end: "15088532035597390",

        });

    } catch (status) {

        console.log(status);

    }

}

</script>

<div class="ps-section__header">

    <h3>Messages</h3>


    <!-- <div class="float-right">

            <a class="add-address ps-btn ps-btn--sm ps-btn--small" href="{{ route('customer.address.create') }}">

                <span>{{ __('Add a new address') }}</span>

            </a>

        </div> -->

</div>

<div class="ps-section__content">

    <div>

<!--         <button onclick="delete_full_messages()">Delete messages</button> -->

        <div id="messages" class="user_pubnub_mgs"></div>

        <input id="message-input" type="text">

        <button onclick="buttonClick()" id="send_chat_bt">Send</button>

    </div>

</div>

<script>

$(document).ready(function(){

    $("body").on("click, keyup","#message-input", function(){

    var message_body =  $(this).val();

        if(message_body){

            $("#send_chat_bt").prop('disabled', false);

        }

        else{

            $("#send_chat_bt").prop('disabled', true);

        }

    });

    $(document).on('keyup','#message-input',function(e){

            if (e.code === "Enter") {  //checks whether the pressed key is "Enter"

                buttonClick();

            }

    });

});


</script>


How to create load more on scroll functionality in laravel?

Create load more on scroll functionality in laravel

Main listing file
<style>
.notifications_page_cover_ui {
    overflow: auto;
    max-height: 474px;
}
</style>
<div class="ps-section__right">
    <div class="section-header">
        <h3>Notifications</h3>
    </div>
    <div class="section-content">
       <div class="notifications_page_cover_ui" id="load-more-container">
        <?php echo $notification_list ?>
       </div>
    </div>
</div>

<script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
<script>
$(document).ready(function() {
    let lastNotificationID = {!! $lastNotificationID !!}; // Pass the last item ID from your controller or view
    let loading = false;
    function loadMoreData() {
        if (loading) {
            return; // If a request is already in progress, do nothing
        }
        loading = true; // Set the flag to indicate that a request is in progress
        $.ajax({
            url:  "{{route('customer.loadMoreNotifications')}}",
            method: 'GET',
            data: { lastNotificationID: lastNotificationID },
            success: function(response) {
                loading = false; // Reset the flag when the request is complete
                if (response["notification_list"].length > 0) {
                    let notification_list = '';
                    /* console.log();  */
                    $('#load-more-container').append(response["notification_list"]);
                    lastNotificationID = response["lastNotificationID"];
                } else {
                    // No more data to load
                }
            },
            error: function() {
                loading = false; // Reset the flag in case of an error
            }
        });
    }

    $('#load-more-container').on('scroll', function() {
        let scrollableDiv = $(this);
        let scrollableHeight = scrollableDiv.prop('scrollHeight');
        let visibleHeight = scrollableDiv.height();
        let scrollPosition = scrollableDiv.scrollTop();
        if (scrollPosition + visibleHeight >= scrollableHeight - 100) {
            // Scroll has reached the end of the div
            loadMoreData();
        } else {
            // Scroll is not at the end of the div
        }
    });
});
</script>


Controller function file

    public function getNotifications(Request $request, BaseHttpResponse $response)
    {   
        $currentUser = auth('customer')->user();
        $notifications = Notification::where("sent_to",$currentUser->id)->with(["SentTo"])->orderBy("id","DESC")->paginate(10);
        $lastNotificationID = $notifications->last();
        $lastNotificationID = $lastNotificationID->id;
        $notification_list_view = Theme::getThemeNamespace() . '::views.ecommerce.customers.notifications.notification-list';
        $notification_list = view($notification_list_view,compact("notifications"))->render();
        return Theme::scope('ecommerce.customers.notifications.all-notifications',compact("lastNotificationID","notification_list"))->render();
    }

    public function loadMoreNotifications(Request $request)
    {
        $currentUser = auth('customer')->user();
        $lastNotificationID = $request->input('lastNotificationID');
        // Fetch more data from your model using the lastItemID as an offset
        $notifications = Notification::where('id', '<', $lastNotificationID)->where("sent_to",$currentUser->id)->with(["SentTo"])->orderBy("id","ASC")->paginate(10);
        if(!empty($notifications[0])){
            $lastNotificationID = $notifications->last();
            $lastNotificationID = $lastNotificationID->id;
        }
        $notification_list_view = Theme::getThemeNamespace() . '::views.ecommerce.customers.notifications.notification-list';
        $notification_list = view($notification_list_view,compact("notifications"))->render();
        $data = ["notification_list"=>$notification_list,"lastNotificationID"=>$lastNotificationID];
        return response()->json($data);
    }

Data listing file (notification-list.blade.php)

@if(!empty($notifications[0]))
    @foreach($notifications as $notification)
    <div class="notofication_card_ui {{ ($notification->is_read == '0')? 'project_assigned_ui' : ''}}">
        <div class="user_card_box">
            <span class="user_avatar"><img src="{{$notification->SentTo->avatar_url}}"></span>
            <div class="user_message_description"><h5 class="user_name">{{$notification->id}}{{$notification->SentTo->name}}</h5><span class="message__sent_time">{{$notification->created_time_ago}}</span></div>
        </div>
        <div class="user_comment_box">
        <p>{{$notification->message}}</p>
        </div>
        <div class="view_notification_btn"><a href="{{route('customer.readNotifications', $notification->id)}}" class="view_more_notification_btn">View</a></div>
    </div>
    @endforeach
@endif

How to add re-captcha v3 on all Elementor forms using coding?

 Add re-captcha v3 on all Elementor forms using coding add_action('wp_footer',function(){     ?> <script src="https://www...