mirror of
https://github.com/Foundry376/Mailspring.git
synced 2025-01-04 07:10:06 +08:00
181 lines
4.2 KiB
JavaScript
181 lines
4.2 KiB
JavaScript
/* eslint global-require: 0*/
|
|
import _ from 'underscore';
|
|
import {
|
|
Thread,
|
|
Actions,
|
|
Message,
|
|
TaskFactory,
|
|
DatabaseStore,
|
|
FocusedPerspectiveStore,
|
|
} from 'mailspring-exports';
|
|
|
|
export default class ThreadListContextMenu {
|
|
constructor({ threadIds = [], accountIds = [] }) {
|
|
this.threadIds = threadIds;
|
|
this.accountIds = accountIds;
|
|
}
|
|
|
|
menuItemTemplate() {
|
|
return DatabaseStore.modelify(Thread, this.threadIds)
|
|
.then(threads => {
|
|
this.threads = threads;
|
|
|
|
return Promise.all([
|
|
this.replyItem(),
|
|
this.replyAllItem(),
|
|
this.forwardItem(),
|
|
{ type: 'separator' },
|
|
this.archiveItem(),
|
|
this.trashItem(),
|
|
this.markAsReadItem(),
|
|
this.starItem(),
|
|
]);
|
|
})
|
|
.then(menuItems => {
|
|
return _.filter(_.compact(menuItems), (item, index) => {
|
|
if ((index === 0 || index === menuItems.length - 1) && item.type === 'separator') {
|
|
return false;
|
|
}
|
|
return true;
|
|
});
|
|
});
|
|
}
|
|
|
|
replyItem() {
|
|
if (this.threadIds.length !== 1) {
|
|
return null;
|
|
}
|
|
return {
|
|
label: 'Reply',
|
|
click: () => {
|
|
Actions.composeReply({
|
|
threadId: this.threadIds[0],
|
|
popout: true,
|
|
type: 'reply',
|
|
behavior: 'prefer-existing-if-pristine',
|
|
});
|
|
},
|
|
};
|
|
}
|
|
|
|
replyAllItem() {
|
|
if (this.threadIds.length !== 1) {
|
|
return null;
|
|
}
|
|
|
|
return DatabaseStore.findBy(Message, { threadId: this.threadIds[0] })
|
|
.order(Message.attributes.date.descending())
|
|
.limit(1)
|
|
.then(message => {
|
|
if (message && message.canReplyAll()) {
|
|
return {
|
|
label: 'Reply All',
|
|
click: () => {
|
|
Actions.composeReply({
|
|
threadId: this.threadIds[0],
|
|
popout: true,
|
|
type: 'reply-all',
|
|
behavior: 'prefer-existing-if-pristine',
|
|
});
|
|
},
|
|
};
|
|
}
|
|
return null;
|
|
});
|
|
}
|
|
|
|
forwardItem() {
|
|
if (this.threadIds.length !== 1) {
|
|
return null;
|
|
}
|
|
return {
|
|
label: 'Forward',
|
|
click: () => {
|
|
Actions.composeForward({ threadId: this.threadIds[0], popout: true });
|
|
},
|
|
};
|
|
}
|
|
|
|
archiveItem() {
|
|
const perspective = FocusedPerspectiveStore.current();
|
|
const allowed = perspective.canArchiveThreads(this.threads);
|
|
if (!allowed) {
|
|
return null;
|
|
}
|
|
return {
|
|
label: 'Archive',
|
|
click: () => {
|
|
const tasks = TaskFactory.tasksForArchiving({
|
|
source: 'Context Menu: Thread List',
|
|
threads: this.threads,
|
|
});
|
|
Actions.queueTasks(tasks);
|
|
},
|
|
};
|
|
}
|
|
|
|
trashItem() {
|
|
const perspective = FocusedPerspectiveStore.current();
|
|
const allowed = perspective.canMoveThreadsTo(this.threads, 'trash');
|
|
if (!allowed) {
|
|
return null;
|
|
}
|
|
return {
|
|
label: 'Trash',
|
|
click: () => {
|
|
const tasks = TaskFactory.tasksForMovingToTrash({
|
|
source: 'Context Menu: Thread List',
|
|
threads: this.threads,
|
|
});
|
|
Actions.queueTasks(tasks);
|
|
},
|
|
};
|
|
}
|
|
|
|
markAsReadItem() {
|
|
const unread = this.threads.every(t => t.unread === false);
|
|
const dir = unread ? 'Unread' : 'Read';
|
|
|
|
return {
|
|
label: `Mark as ${dir}`,
|
|
click: () => {
|
|
Actions.queueTask(
|
|
TaskFactory.taskForInvertingUnread({
|
|
source: 'Context Menu: Thread List',
|
|
threads: this.threads,
|
|
})
|
|
);
|
|
},
|
|
};
|
|
}
|
|
|
|
starItem() {
|
|
const starred = this.threads.every(t => t.starred === false);
|
|
|
|
let dir = '';
|
|
let star = 'Star';
|
|
if (!starred) {
|
|
dir = 'Remove ';
|
|
star = this.threadIds.length > 1 ? 'Stars' : 'Star';
|
|
}
|
|
|
|
return {
|
|
label: `${dir}${star}`,
|
|
click: () => {
|
|
Actions.queueTask(
|
|
TaskFactory.taskForInvertingStarred({
|
|
source: 'Context Menu: Thread List',
|
|
threads: this.threads,
|
|
})
|
|
);
|
|
},
|
|
};
|
|
}
|
|
|
|
displayMenu() {
|
|
const { remote } = require('electron');
|
|
this.menuItemTemplate().then(template => {
|
|
remote.Menu.buildFromTemplate(template).popup(remote.getCurrentWindow());
|
|
});
|
|
}
|
|
}
|