React Native Developer
React Native Developer

Reputation: 215

notifier.on click event is not fired in Windows Action Center

I am using the node-notifier package for notification but I have one problem. notifier.on click event is not fired in Windows Action Center

notifier.notify(
      {
        appId: "com.electron.demo", // Absolute path (doesn't work on balloons),
        title: "Alert Message",
        message: "Click to view",
        icon: path.join(__dirname, 'msicon.png'),
        wait: true,
        timeout: false,
        id: "demo app"
      },
      function(err, response) {
        // Response is response from notification
        if (err) {
          reject(err);
        } else {
          resolve(response);
        }
      }
    );

notifier.on("click",  function(notifierObject, options, event) {

      // Triggers if `wait: true` and user clicks notification
      var request = new sql.Request();
      let username = userName;
          request.query("update alerts.dbo.groupmessages set isRead = 1\
                            where pk = '"+ recordset.recordset[i].pk + "'\
                            and userFK = (select pk from alerts.dbo.users where username = '"+ username + "')\
                            and groupFK = (select groupFK from alerts.dbo.users where username = '"+ username + "')", function (err, recordset) {
            if (err) throw err
            console.log(err, recordset, 'User shit');
          });          

          function createWindow() {
            // Create the browser window.
            win = new BrowserWindow({
              width: 400,
              height: 400,
              frame: false,
              webPreferences: {
                nodeIntegration: true
              }
            });
            // and load the index.html of the app.
            ejse.data('message', recordset.recordset[i].message);
            win.loadFile('index.ejs')
          }
          createWindow();

        });
    });
  });

notifier.on click event is not fired in only Windows Action Center. please let me know the reason and solution as well. Thanks.

Upvotes: 2

Views: 1824

Answers (2)

norekhov
norekhov

Reputation: 4263

Notification doesn't get clicks because not all Action Center requirements are fulfilled.

In general Windows notifications have three types of activation: foreground, background and protocol.

In any case you will need to have the following:

  1. Have a shortcut in Start Menu with AppUserModelId property. Please consult your installer on how to do it or use shell.readShortcutLink and shell.writeShortcutLink Electron API. Specifically WiX allows you to specify appUserModelId and toastActivatorClsid in options.

  2. Specify AppUserModelId in the app.

     app.setAppUserModelId('AppUserModelId');
    
  3. Register a custom protocol and some reaction to it. For example like this:

     app.setAsDefaultProtocolClient('example');
    

To use foreground or background you need to:

  1. Have a shortcut in Start Menu with ToastActivatorCLSID property. See above on how to do it.

  2. Use a project like electron-windows-interactive-notifications to register a COM server with the specified earlier ToastActivatorCLSID and a custom protocol of your choice and call:

     registerComServer();
     registerActivator();
    

I won't get deep into details on how to react to custom protocol but you will need to parse command line args in search for example: and also expect it in the second-instance hook if the app is already launched.

To use protocol type no extra actions needed.

After that even standard Electron notifications will get clicks from Action Center.

But how to use these protocols and get feature rich notifications? Electron allows you to specify toastXml directly!

Let's say here's your notification. It will open https://google.com even if clicked from Action Center.

const notification = new Notification({
    toastXml: `
<toast launch="https://google.com" activationType="protocol">
  <visual>
    <binding template="ToastGeneric">
      <text>Wonderman meets Superwoman</text>
      <text>In the eve of the new millennium, Wonderman challenges Superwoman to a bliniking contest.</text>
      <text placement="attribution">Mars Press</text>
    </binding>
  </visual>
</toast>
    `,
});
notification.show();

This notification simply opens Google. You can get more ideas at Notification Visualizer App

Upvotes: 0

user120242
user120242

Reputation: 15268

Action Center requires separate implementation in native code, which node-notifier doesn't have.
You can try node-powertoast instead and use the onActivated callback: npm i node-powertoast

const toast = require('powertoast');

toast({
  title: "Hello",
  message: "world",
  callback: { 
    timeout: 5000, //keep-a-live in ms
    onActivated: ()=>{ console.log("activated") },
    onDismissed: (reason)=>{ console.log(reason) }
})
.then(()=> console.log("Notified")
.catch(err => console.error(err));

As for the reason:
You can see for other projects it's a significant undertaking and the following project, for example, seems to have Action Center support stuck in limbo for 2 years now: https://github.com/mohabouje/WinToast/issues/35 People trying to implement it themselves appear to have gotten stuck, and have had difficulty getting it implemented correctly.
It's just hard to do.

Upvotes: 1

Related Questions