| import {waitFor} from 'poll-until-promise'; |
| |
| import {parseUrl} from '../../../common/commonUtils'; |
| import {getOptions} from '../../../common/options/optionsUtils'; |
| |
| const kOpenReplyEditorIntervalInMs = 500; |
| const kOpenReplyEditorTimeoutInMs = 10 * 1000; |
| |
| // @TODO: Handle observing when the hash is added after the page has loaded. |
| export default class FlattenThreadsReplyActionHandler { |
| /** |
| * @param {Object} options Options object which at least includes the |
| * |flattenthreads| and |flattenthreads_switch_enabled| options. |
| */ |
| constructor(options = null) { |
| this.options = options; |
| } |
| |
| async handleIfApplicable() { |
| if (await this.isFeatureEnabled()) this.handle(); |
| } |
| |
| async handle() { |
| const hash = window.location.hash; |
| if (hash === '#action=reply') await this.openReplyEditor(); |
| } |
| |
| async openReplyEditor() { |
| // We erase the hash so the Community Console doesn't open the reply |
| // editor, since we're going to do that instead. |
| window.location.hash = ''; |
| |
| const messageId = this.getCurrentMessageId(); |
| if (messageId === null) { |
| console.error( |
| '[FlattenThreadsReplyActionHandler] Could not parse current message id.'); |
| return; |
| } |
| |
| const replyButton = await waitFor(async () => { |
| const replyButton = document.querySelector( |
| '[data-twpt-message-id="' + messageId + |
| '"] twpt-flatten-thread-reply-button'); |
| if (replyButton === null) throw new Error('Reply button not found.'); |
| return replyButton; |
| }, { |
| interval: kOpenReplyEditorIntervalInMs, |
| timeout: kOpenReplyEditorTimeoutInMs, |
| }); |
| |
| const e = new Event('twpt-click'); |
| replyButton.dispatchEvent(e); |
| } |
| |
| async isFeatureEnabled() { |
| let options; |
| if (this.options !== null) { |
| options = this.options; |
| } else { |
| options = |
| await getOptions(['flattenthreads', 'flattenthreads_switch_enabled']); |
| } |
| return options['flattenthreads'] && |
| options['flattenthreads_switch_enabled']; |
| } |
| |
| getCurrentMessageId() { |
| const thread = parseUrl(window.location.href); |
| if (thread === false || thread.message === null) { |
| return null; |
| } |
| return thread.message; |
| } |
| } |