Indicator as Clean Architecture
This commit is contained in:
parent
b130fd5268
commit
42d902982a
7 changed files with 77 additions and 2 deletions
11
src/background/controllers/addon-enabled.js
Normal file
11
src/background/controllers/addon-enabled.js
Normal file
|
@ -0,0 +1,11 @@
|
|||
import AddonEnabledInteractor from '../usecases/addon-enabled';
|
||||
|
||||
export default class AddonEnabledController {
|
||||
constructor() {
|
||||
this.addonEnabledInteractor = new AddonEnabledInteractor();
|
||||
}
|
||||
|
||||
indicate(enabled) {
|
||||
this.addonEnabledInteractor.indicate(enabled);
|
||||
}
|
||||
}
|
|
@ -1,7 +1,6 @@
|
|||
import BackgroundComponent from 'background/components/background';
|
||||
import OperationComponent from 'background/components/operation';
|
||||
import TabComponent from 'background/components/tab';
|
||||
import IndicatorComponent from 'background/components/indicator';
|
||||
import reducers from 'background/reducers';
|
||||
import { createStore, applyMiddleware } from 'redux';
|
||||
import promise from 'redux-promise';
|
||||
|
@ -19,7 +18,6 @@ const store = createStore(
|
|||
const backgroundComponent = new BackgroundComponent(store);
|
||||
const operationComponent = new OperationComponent(store);
|
||||
const tabComponent = new TabComponent(store);
|
||||
const indicatorComponent = new IndicatorComponent(store);
|
||||
/* eslint-enable no-unused-vars */
|
||||
|
||||
new SettingController().reload();
|
||||
|
|
|
@ -9,4 +9,17 @@ export default class ContentMessageClient {
|
|||
});
|
||||
}
|
||||
}
|
||||
|
||||
async getAddonEnabled(tabId) {
|
||||
let { enabled } = await browser.tabs.sendMessage(tabId, {
|
||||
type: messages.ADDON_ENABLED_QUERY,
|
||||
});
|
||||
return enabled;
|
||||
}
|
||||
|
||||
toggleAddonEnabled(tabId) {
|
||||
return browser.tabs.sendMessage(tabId, {
|
||||
type: messages.ADDON_TOGGLE_ENABLED,
|
||||
});
|
||||
}
|
||||
}
|
||||
|
|
|
@ -2,12 +2,14 @@ import messages from '../../shared/messages';
|
|||
import CompletionsController from '../controllers/completions';
|
||||
import SettingController from '../controllers/setting';
|
||||
import FindController from '../controllers/find';
|
||||
import AddonEnabledController from '../controllers/addon-enabled';
|
||||
|
||||
export default class ContentMessageListener {
|
||||
constructor() {
|
||||
this.settingController = new SettingController();
|
||||
this.completionsController = new CompletionsController();
|
||||
this.findController = new FindController();
|
||||
this.addonEnabledController = new AddonEnabledController();
|
||||
}
|
||||
|
||||
run() {
|
||||
|
@ -35,6 +37,8 @@ export default class ContentMessageListener {
|
|||
return this.onFindGetKeyword();
|
||||
case messages.FIND_SET_KEYWORD:
|
||||
return this.onFindSetKeyword(message.keyword);
|
||||
case messages.ADDON_ENABLED_RESPONSE:
|
||||
return this.onAddonEnabledResponse(message.enabled);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -58,4 +62,8 @@ export default class ContentMessageListener {
|
|||
onFindSetKeyword(keyword) {
|
||||
return this.findController.setKeyword(keyword);
|
||||
}
|
||||
|
||||
onAddonEnabledResponse(enabled) {
|
||||
return this.addonEnabledController.indicate(enabled);
|
||||
}
|
||||
}
|
||||
|
|
12
src/background/presenters/indicator.js
Normal file
12
src/background/presenters/indicator.js
Normal file
|
@ -0,0 +1,12 @@
|
|||
export default class IndicatorPresenter {
|
||||
indicate(enabled) {
|
||||
let path = enabled
|
||||
? 'resources/enabled_32x32.png'
|
||||
: 'resources/disabled_32x32.png';
|
||||
return browser.browserAction.setIcon({ path });
|
||||
}
|
||||
|
||||
onClick(listener) {
|
||||
browser.browserAction.onClicked.addListener(listener);
|
||||
}
|
||||
}
|
|
@ -2,4 +2,8 @@ export default class TabPresenter {
|
|||
create(url) {
|
||||
browser.tabs.create({ url, });
|
||||
}
|
||||
|
||||
onSelected(listener) {
|
||||
browser.tabs.onActivated.addListener(listener);
|
||||
}
|
||||
}
|
||||
|
|
29
src/background/usecases/addon-enabled.js
Normal file
29
src/background/usecases/addon-enabled.js
Normal file
|
@ -0,0 +1,29 @@
|
|||
import IndicatorPresenter from '../presenters/indicator';
|
||||
import TabPresenter from '../presenters/tab';
|
||||
import ContentMessageClient from '../infrastructures/content-message-client';
|
||||
|
||||
export default class AddonEnabledInteractor {
|
||||
constructor() {
|
||||
this.indicatorPresentor = new IndicatorPresenter();
|
||||
|
||||
this.indicatorPresentor.onClick(tab => this.onIndicatorClick(tab.id));
|
||||
|
||||
this.tabPresenter = new TabPresenter();
|
||||
this.tabPresenter.onSelected(info => this.onTabSelected(info.tabId));
|
||||
|
||||
this.contentMessageClient = new ContentMessageClient();
|
||||
}
|
||||
|
||||
indicate(enabled) {
|
||||
this.indicatorPresentor.indicate(enabled);
|
||||
}
|
||||
|
||||
onIndicatorClick(tabId) {
|
||||
return this.contentMessageClient.toggleAddonEnabled(tabId);
|
||||
}
|
||||
|
||||
async onTabSelected(tabId) {
|
||||
let enabled = await this.contentMessageClient.getAddonEnabled(tabId);
|
||||
return this.indicatorPresentor.indicate(enabled);
|
||||
}
|
||||
}
|
Reference in a new issue