blob: 8172b6203c0ea91e32251ab4e061bb1e77b7377a [file] [log] [blame]
import {waitFor} from 'poll-until-promise';
import {recursiveParentElement} from '../../../common/commonUtils.js';
import {injectStylesheet} from '../../../common/contentScriptsUtils.js';
import {isOptionEnabled} from '../../../common/optionsUtils.js';
const kListCannedResponsesResponse = 'TWPT_ListCannedResponsesResponse';
const kImportParam = 'TWPTImportToWorkflow';
const kSelectedIdParam = 'TWPTSelectedId';
// Class which is used to inject a "select" button in the CRs list when loading
// the canned response list for this purpose from the workflows manager.
export default class WorkflowsImport {
constructor() {
// Only set this class up if the Community Console was opened with the
// purpose of importing CRs to the workflow manager.
const searchParams = new URLSearchParams(document.location.search);
if (!searchParams.has(kImportParam)) return;
this.selectedId = searchParams.get(kSelectedIdParam);
this.lastCRsList = {
body: {},
id: -1,
duplicateNames: new Set(),
};
this.setUpHandler();
this.addCustomStyles();
}
setUpHandler() {
window.addEventListener(kListCannedResponsesResponse, e => {
if (e.detail.id < this.lastCRsList.id) return;
// Look if there are duplicate names
const crs = e.detail.body?.['1'] ?? [];
const names = crs.map(cr => cr?.['7']).slice().sort();
let duplicateNames = new Set();
for (let i = 1; i < names.length; i++)
if (names[i - 1] == names[i]) duplicateNames.add(names[i]);
this.lastCRsList = {
body: e.detail.body,
id: e.detail.id,
duplicateNames,
};
});
}
addCustomStyles() {
injectStylesheet(chrome.runtime.getURL('css/workflow_import.css'));
}
addButton(tags) {
const cr = recursiveParentElement(tags, 'EC-CANNED-RESPONSE-ROW');
if (!cr) return;
const name = cr.querySelector('.text .name').textContent;
if (!name) return;
const toolbar = cr.querySelector('.action .toolbar');
if (!toolbar) return console.error(`Can't find toolbar.`);
// If it has already been injected, exit.
if (toolbar.querySelector('twpt-cr-import-button')) return;
waitFor(() => {
if (this.lastCRsList.id != -1) return Promise.resolve(this.lastCRsList);
return Promise.reject(new Error('Didn\'t receive canned responses list'));
}, {
interval: 500,
timeout: 15 * 1000,
}).then(crs => {
// If another CR has the same name, there's no easy way to distinguish
// them, so don't inject the button.
if (crs.duplicateNames.has(name)) {
console.info(
'CR "' + name +
'" is duplicate, so skipping the injection of the button.');
return;
}
for (const cr of (crs.body?.[1] ?? [])) {
if (cr[7] == name) {
const id = cr?.[1]?.[1];
if (!id) {
console.error('Can\'t find ID for canned response', cr);
break;
}
const button = document.createElement('twpt-cr-import-button');
button.setAttribute('cannedResponseId', id);
if (this.selectedId == id) button.setAttribute('selected', '');
toolbar.prepend(button);
break;
}
}
});
}
addButtonIfEnabled(tags) {
isOptionEnabled('workflows').then(isEnabled => {
if (isEnabled) this.addButton(tags);
});
}
}