Enhancing overall functionality of solutions on tiddlywiki "arrive and leave" triggers

I asked ChatGPT the following question and the answer is below;

How can a website detect someone is leaving?

I asked this because I saw a “wait before you leave message”, I see this as allowing us to develop a set of system triggers we could use to help manage TiddlyWikis and websites, including local single file wikis.

Ideally one of our TiddlyWiki JavaScript gurus, could build a set of plugins that allow a designer to set up a set of triggers. The idea would be to typically trigger events such as a logout, save, check in etc… that requires no user intervention, although I think there is value remaining agnostic, to permit innovative solutions from the community.

  • One of the events may be to start a timer or delay the triggered actions before action.

The arrive event could be used to reload the wiki if there are no unsaved changes for example to see if the wiki has not being checked out by someone or something since last viewed.

  • Similarly test other conditions such as last saved date/time and more.

Websites can detect when a user is about to leave using several techniques. Here are some common methods:

1. Beforeunload Event

The [edit] beforeunload event [/edit] in JavaScript is triggered when a user is about to leave the webpage. It can be used to show a confirmation dialog, ask the user to save changes, or perform other actions.

window.addEventListener('beforeunload', function (event) {
    event.preventDefault();
    event.returnValue = '';
});

2. Unload Event

The [edit] deprecated unload event [/edit] is triggered when the document or a child resource is being unloaded.

window.addEventListener('unload', function (event) {
    // Perform actions like saving data, sending analytics, etc.
});

3. Page Visibility API

The Page Visibility API allows you to determine the visibility state of the page. You can use this to detect when a user switches to another tab or minimizes the browser.

[edit: fixed code and tested it]

document.addEventListener('visibilitychange', function() {
    if (document.hidden) {
        console.log('User has left the page.');
    }
});

4. Mouse Movement Detection

Detecting the user’s mouse movement can help identify when the cursor is about to leave the viewport, which often indicates that the user is about to close the tab or navigate away.

[edit: code is tested]

document.addEventListener('mouseout', function(event) {
    if (event.clientY <= 0 || event.clientX <= 0 || 
        event.clientX >= window.innerWidth || event.clientY >= window.innerHeight) {
        console.log('User is about to leave the page.');
    }
});

5. Session Timeout

Implementing session timeout can help detect inactivity. If the user has been inactive for a certain period, you can consider them as having left the site.

[edit: code is tested]

let timeout;

function resetTimer() {
    clearTimeout(timeout);
    timeout = setTimeout(function() {
        console.log('User has been inactive.');
    }, 300000); // 5 minutes
}

document.onmousemove = resetTimer;
document.onkeypress = resetTimer;

Considerations

  • User Experience: Be cautious with how you implement these detections to avoid annoying the user with too many prompts or alerts.
  • Browser Support: Ensure compatibility across different browsers, as some events and APIs might not be supported universally.
  • Privacy: Make sure to respect user privacy and comply with relevant data protection regulations.

These methods can help websites detect when a user is leaving or about to leave, allowing for appropriate actions such as saving state, prompting the user, or gathering analytics.

Then I asked;

How can a website detect someone has returned to it’s active tab?

A website can detect when a user returns to its active tab using the Page Visibility API. This API allows you to listen for changes in the visibility state of the document, such as when a user switches tabs, minimizes the browser, or comes back to the tab.

Here’s how you can use the Page Visibility API to detect when a user returns to your website’s tab:

Using the Page Visibility API

[edit: code is tested]

document.addEventListener('visibilitychange', function() {
    if (document.visibilityState === 'visible') {
        console.log('User has returned to the active tab.');
        // Perform any actions needed when the user returns
    }
});

Explanation

  • visibilitychange event: This event is fired when the visibility state of the document changes.
  • document.visibilityState: This property indicates the visibility state of the document. It can be 'visible', 'hidden', 'prerender', or 'unloaded'. When the document is visible, it means the user has returned to the active tab.

Example: Display a Welcome Back Message

Here’s a more practical example where you can display a message when the user returns to the active tab:

[edit: SCRIPT tag is tested]

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Page Visibility Example</title>
    <script>
        document.addEventListener('visibilitychange', function() {
            if (document.visibilityState === 'visible') {
                alert('Welcome back!');
            }
        });
    </script>
</head>
<body>
    <h1>Switch to another tab and then come back to see the alert.</h1>
</body>
</html>

Considerations

  • User Experience: Use this feature thoughtfully to avoid annoying the user. For instance, an alert may not be the best choice in a production environment. Instead, consider updating the UI or logging the event.
  • Browser Support: The Page Visibility API is well-supported in modern browsers, but always check for compatibility if targeting older browsers.

By leveraging the Page Visibility API, you can effectively detect when a user returns to your website’s active tab and take appropriate actions based on your application’s needs.

Hi, I did test the code and did add some [edit ...] comments. I did add some links to MDN documentation, where needed.

Especially: beforeunload. The code should work, since it is the same a the example at MDN, but MDN uses a different syntax. That code is hard to test, because it is called, when the page is closed. TW uses it at:

@Mario thanks for your effort. Am I correct in thinking we can use the following;

// Trigger a TiddlyWiki action here
        $tw.rootWidget.invokeActionString("<$action-sendmessage $message="tm-save-wiki"/>");

with or instead of;

console.log('Message');

Are there any other dependencies?