mirror of
https://github.com/Foundry376/Mailspring.git
synced 2025-01-04 07:10:06 +08:00
240 lines
7.4 KiB
JavaScript
240 lines
7.4 KiB
JavaScript
import _ from 'underscore';
|
|
import Reflux from 'reflux';
|
|
import path from 'path';
|
|
import fs from 'fs-plus';
|
|
import { ipcRenderer, shell, remote } from 'electron';
|
|
|
|
import PluginsActions from './plugins-actions';
|
|
|
|
const dialog = remote.dialog;
|
|
|
|
const PackagesStore = Reflux.createStore({
|
|
init: function init() {
|
|
// this._globalSearch = "";
|
|
// this._installedSearch = "";
|
|
// this._installing = {};
|
|
// this._featured = {
|
|
// themes: [],
|
|
// packages: [],
|
|
// };
|
|
// this._newerVersions = [];
|
|
// this._searchResults = null;
|
|
// this._refreshFeatured();
|
|
// this.listenTo(PluginsActions.refreshFeaturedPackages, this._refreshFeatured);
|
|
// this.listenTo(PluginsActions.refreshInstalledPackages, this._refreshInstalled);
|
|
// this.listenTo(PluginsActions.installNewPackage, this._onInstallPackage);
|
|
// this.listenTo(PluginsActions.createPackage, this._onCreatePackage);
|
|
// this.listenTo(PluginsActions.updatePackage, this._onUpdatePackage);
|
|
// this.listenTo(PluginsActions.setGlobalSearchValue, this._onGlobalSearchChange);
|
|
// this.listenTo(PluginsActions.setInstalledSearchValue, this._onInstalledSearchChange);
|
|
// this.listenTo(PluginsActions.showPackage, (pkg) => {
|
|
// const dir = AppEnv.packages.resolvePackagePath(pkg.name);
|
|
// if (dir) shell.showItemInFolder(dir);
|
|
// });
|
|
// this.listenTo(PluginsActions.installPackage, (pkg) => {
|
|
// this._installing[pkg.name] = true;
|
|
// this.trigger(this);
|
|
// this._apm.install(pkg, (err) => {
|
|
// if (err) {
|
|
// delete this._installing[pkg.name];
|
|
// this._displayMessage("Sorry, an error occurred", err.toString());
|
|
// } else {
|
|
// if (AppEnv.packages.isPackageDisabled(pkg.name)) {
|
|
// AppEnv.packages.enablePackage(pkg.name);
|
|
// }
|
|
// }
|
|
// this._onPackagesChanged();
|
|
// });
|
|
// });
|
|
// this.listenTo(PluginsActions.uninstallPackage, (pkg) => {
|
|
// if (AppEnv.packages.isPackageLoaded(pkg.name)) {
|
|
// AppEnv.packages.disablePackage(pkg.name);
|
|
// AppEnv.packages.unloadPackage(pkg.name);
|
|
// }
|
|
// this._apm.uninstall(pkg, (err) => {
|
|
// if (err) this._displayMessage("Sorry, an error occurred", err.toString())
|
|
// this._onPackagesChanged();
|
|
// })
|
|
// });
|
|
// this.listenTo(PluginsActions.enablePackage, (pkg) => {
|
|
// if (AppEnv.packages.isPackageDisabled(pkg.name)) {
|
|
// AppEnv.packages.enablePackage(pkg.name);
|
|
// this._onPackagesChanged();
|
|
// }
|
|
// });
|
|
// this.listenTo(PluginsActions.disablePackage, (pkg) => {
|
|
// if (!AppEnv.packages.isPackageDisabled(pkg.name)) {
|
|
// AppEnv.packages.disablePackage(pkg.name);
|
|
// this._onPackagesChanged();
|
|
// }
|
|
// });
|
|
// this._hasPrepared = false;
|
|
},
|
|
|
|
// Getters
|
|
|
|
installed: function installed() {
|
|
this._prepareIfFresh();
|
|
return this._addPackageStates(this._filter(this._installed, this._installedSearch));
|
|
},
|
|
|
|
installedSearchValue: function installedSearchValue() {
|
|
return this._installedSearch;
|
|
},
|
|
|
|
featured: function featured() {
|
|
this._prepareIfFresh();
|
|
return this._addPackageStates(this._featured);
|
|
},
|
|
|
|
searchResults: function searchResults() {
|
|
return this._addPackageStates(this._searchResults);
|
|
},
|
|
|
|
globalSearchValue: function globalSearchValue() {
|
|
return this._globalSearch;
|
|
},
|
|
|
|
// Action Handlers
|
|
|
|
_prepareIfFresh: function _prepareIfFresh() {
|
|
if (this._hasPrepared) return;
|
|
AppEnv.packages.onDidActivatePackage(() => this._onPackagesChangedDebounced());
|
|
AppEnv.packages.onDidDeactivatePackage(() => this._onPackagesChangedDebounced());
|
|
AppEnv.packages.onDidLoadPackage(() => this._onPackagesChangedDebounced());
|
|
AppEnv.packages.onDidUnloadPackage(() => this._onPackagesChangedDebounced());
|
|
this._onPackagesChanged();
|
|
this._hasPrepared = true;
|
|
},
|
|
|
|
_filter: function _filter(hash, search) {
|
|
const result = {};
|
|
const query = search.toLowerCase();
|
|
if (hash) {
|
|
Object.keys(hash).forEach(key => {
|
|
result[key] = _.filter(
|
|
hash[key],
|
|
p => query.length === 0 || p.name.toLowerCase().indexOf(query) !== -1
|
|
);
|
|
});
|
|
}
|
|
return result;
|
|
},
|
|
|
|
_refreshFeatured: function _refreshFeatured() {
|
|
this._apm
|
|
.getFeatured({ themes: false })
|
|
.then(results => {
|
|
this._featured.packages = results;
|
|
this.trigger();
|
|
})
|
|
.catch(() => {
|
|
// We may be offline
|
|
});
|
|
this._apm
|
|
.getFeatured({ themes: true })
|
|
.then(results => {
|
|
this._featured.themes = results;
|
|
this.trigger();
|
|
})
|
|
.catch(() => {
|
|
// We may be offline
|
|
});
|
|
},
|
|
|
|
_refreshInstalled: function _refreshInstalled() {
|
|
this._onPackagesChanged();
|
|
},
|
|
|
|
_refreshSearch: function _refreshSearch() {
|
|
if (!this._globalSearch || this._globalSearch.length <= 0) return;
|
|
|
|
this._apm
|
|
.search(this._globalSearch)
|
|
.then(results => {
|
|
this._searchResults = {
|
|
packages: results.filter(({ theme }) => !theme),
|
|
themes: results.filter(({ theme }) => theme),
|
|
};
|
|
this.trigger();
|
|
})
|
|
.catch(() => {
|
|
// We may be offline
|
|
});
|
|
},
|
|
|
|
_refreshSearchThrottled: function _refreshSearchThrottled() {
|
|
_.debounce(this._refreshSearch, 400);
|
|
},
|
|
|
|
_onPackagesChanged: function _onPackagesChanged() {
|
|
this._apm.getInstalled().then(packages => {
|
|
for (const category of ['dev', 'user']) {
|
|
packages[category].forEach(pkg => {
|
|
pkg.category = category;
|
|
delete this._installing[pkg.name];
|
|
});
|
|
}
|
|
|
|
const available = AppEnv.packages.getAvailablePackageMetadata();
|
|
const examples = available.filter(
|
|
({ isOptional, isHiddenOnPluginsPage }) => isOptional && !isHiddenOnPluginsPage
|
|
);
|
|
packages.example = examples.map(pkg =>
|
|
Object.assign({}, pkg, { installed: true, category: 'example' })
|
|
);
|
|
this._installed = packages;
|
|
this.trigger();
|
|
});
|
|
},
|
|
|
|
_onPackagesChangedDebounced: function _onPackagesChangedDebounced() {
|
|
_.debounce(this._onPackagesChanged, 200);
|
|
},
|
|
|
|
_onInstalledSearchChange: function _onInstalledSearchChange(val) {
|
|
this._installedSearch = val;
|
|
this.trigger();
|
|
},
|
|
|
|
_onUpdatePackage: function _onUpdatePackage(pkg) {
|
|
this._apm.update(pkg, pkg.newerVersion);
|
|
},
|
|
|
|
_onGlobalSearchChange: function _onGlobalSearchChange(val) {
|
|
// Clear previous search results data if this is a new
|
|
// search beginning from "".
|
|
if (this._globalSearch.length === 0 && val.length > 0) {
|
|
this._searchResults = null;
|
|
}
|
|
|
|
this._globalSearch = val;
|
|
this._refreshSearchThrottled();
|
|
this.trigger();
|
|
},
|
|
|
|
_addPackageStates: function _addPackageStates(pkgs) {
|
|
const installedNames = _.flatten(Object.values(this._installed)).map(pkg => pkg.name);
|
|
|
|
_.flatten(Object.values(pkgs)).forEach(pkg => {
|
|
pkg.enabled = !AppEnv.packages.isPackageDisabled(pkg.name);
|
|
pkg.installed = installedNames.indexOf(pkg.name) !== -1;
|
|
pkg.installing = this._installing[pkg.name];
|
|
pkg.newerVersionAvailable = this._newerVersions[pkg.name];
|
|
pkg.newerVersion = this._newerVersions[pkg.name];
|
|
});
|
|
|
|
return pkgs;
|
|
},
|
|
|
|
_displayMessage: function _displayMessage(title, message) {
|
|
dialog.showMessageBox({
|
|
type: 'warning',
|
|
message: title,
|
|
detail: message,
|
|
buttons: ['OK'],
|
|
});
|
|
},
|
|
});
|
|
|
|
export default PackagesStore;
|