95 lines
3.4 KiB
JavaScript
95 lines
3.4 KiB
JavaScript
import Gio from 'gi://Gio';
|
|
|
|
import * as Config from 'resource:///org/gnome/shell/misc/config.js';
|
|
import * as Main from 'resource:///org/gnome/shell/ui/main.js';
|
|
import * as MessageTray from 'resource:///org/gnome/shell/ui/messageTray.js';
|
|
|
|
import {gettext as _} from 'resource:///org/gnome/shell/extensions/extension.js';
|
|
|
|
const PROJECT_NAME = 'Desktop Widgets';
|
|
const PROJECT_ICON = '/media/azclock-logo.svg';
|
|
|
|
const [ShellVersion] = Config.PACKAGE_VERSION.split('.').map(s => Number(s));
|
|
|
|
/**
|
|
* A MessageTray notification, shown once per new release/version
|
|
*
|
|
* Shows users what's new and displays donation options.
|
|
*
|
|
* @param {*} extension
|
|
*/
|
|
export class UpdateNotification {
|
|
constructor(extension) {
|
|
const {metadata} = extension;
|
|
this._extension = extension;
|
|
this._settings = extension.settings;
|
|
|
|
this._version = metadata.version;
|
|
this._iconPath = `${extension.path}/${PROJECT_ICON}`;
|
|
|
|
this._maybeShowNotification();
|
|
}
|
|
|
|
destroy() {
|
|
this._settings = null;
|
|
this._extension = null;
|
|
this._version = null;
|
|
this._iconPath = null;
|
|
}
|
|
|
|
_maybeShowNotification() {
|
|
const shouldShowNotification = this._settings.get_boolean('update-notifier-enabled');
|
|
if (!shouldShowNotification)
|
|
return;
|
|
|
|
const previousNotificationVersion = this._settings.get_int('update-notifier-project-version');
|
|
const shouldNotifyNewVersion = previousNotificationVersion < this._version;
|
|
|
|
if (shouldNotifyNewVersion) {
|
|
this._settings.set_int('update-notifier-project-version', this._version);
|
|
this._showNotification();
|
|
}
|
|
}
|
|
|
|
_showNotification() {
|
|
/* TRANSLATORS: This will display as "ProjectName v21 Released!" as an example.*/
|
|
const title = _('%s v%s Released!').format(PROJECT_NAME, this._version);
|
|
const body = _('Thank you for using %s! If you enjoy it and would like to help support its continued development, please consider making a donation.').format(PROJECT_NAME);
|
|
const gicon = Gio.icon_new_for_string(this._iconPath);
|
|
|
|
const source = this._getSource(PROJECT_NAME, 'application-x-addon-symbolic');
|
|
Main.messageTray.add(source);
|
|
|
|
const notification = this._getNotification(source, title, body, gicon);
|
|
notification.urgency = MessageTray.Urgency.CRITICAL;
|
|
notification.resident = true;
|
|
notification.addAction(_('Donate'), () => this._openSettingsPage('DonatePage'));
|
|
notification.addAction(_("What's new?"), () => this._openSettingsPage('WhatsNewPage'));
|
|
notification.addAction(_('Dismiss'), () => notification.destroy());
|
|
|
|
if (ShellVersion >= 46)
|
|
source.addNotification(notification);
|
|
else
|
|
source.showNotification(notification);
|
|
}
|
|
|
|
_getSource(title, iconName) {
|
|
if (ShellVersion >= 46)
|
|
return new MessageTray.Source({title, iconName});
|
|
else
|
|
return new MessageTray.Source(title, iconName);
|
|
}
|
|
|
|
_getNotification(source, title, body, gicon) {
|
|
if (ShellVersion >= 46)
|
|
return new MessageTray.Notification({source, title, body, gicon});
|
|
else
|
|
return new MessageTray.Notification(source, title, body, {gicon});
|
|
}
|
|
|
|
_openSettingsPage(page) {
|
|
this._settings.set_string('prefs-visible-page', page);
|
|
this._extension.openPreferences();
|
|
}
|
|
}
|