From beb28009590cb40f2920eaa5b4217ac1f0a10810 Mon Sep 17 00:00:00 2001 From: zhangted Date: Tue, 1 Aug 2023 08:09:50 -0400 Subject: [PATCH] move initializeSettings to webpack (#19737) * move initializeSettings to webpack + add tests * add initializeSettings to InstantClick change block * dont use classes, use modules --------- Co-authored-by: PJ --- app/assets/javascripts/initializePage.js | 3 +- .../initializers/initializeSettings.js | 51 ------------------- app/javascript/packs/baseInitializers.js | 3 ++ .../packs/initializers/initializeSettings.js | 9 ++++ .../settings/__tests__/copyOrgSecret.test.js | 45 ++++++++++++++++ .../settings/__tests__/mobilePageSel.test.js | 17 +++++++ .../settings/__tests__/rssFetchTime.test.js | 18 +++++++ app/javascript/settings/copyOrgSecret.js | 16 ++++++ app/javascript/settings/mobilePageSel.js | 11 ++++ app/javascript/settings/rssFetchTime.js | 22 ++++++++ 10 files changed, 142 insertions(+), 53 deletions(-) delete mode 100644 app/assets/javascripts/initializers/initializeSettings.js create mode 100644 app/javascript/packs/initializers/initializeSettings.js create mode 100644 app/javascript/settings/__tests__/copyOrgSecret.test.js create mode 100644 app/javascript/settings/__tests__/mobilePageSel.test.js create mode 100644 app/javascript/settings/__tests__/rssFetchTime.test.js create mode 100644 app/javascript/settings/copyOrgSecret.js create mode 100644 app/javascript/settings/mobilePageSel.js create mode 100644 app/javascript/settings/rssFetchTime.js diff --git a/app/assets/javascripts/initializePage.js b/app/assets/javascripts/initializePage.js index 8d69cd0db..c934e9368 100644 --- a/app/assets/javascripts/initializePage.js +++ b/app/assets/javascripts/initializePage.js @@ -2,7 +2,7 @@ global initializeLocalStorageRender, initializeBodyData, initializeAllTagEditButtons, initializeUserFollowButts, initializeCommentsPage, - initializeSettings, initializeRuntimeBanner, + initializeRuntimeBanner, initializeCreditsPage, initializeOnboardingTaskCard, initScrolling, nextPage:writable, @@ -13,7 +13,6 @@ function callInitializers() { initializePaymentPointers(); initializeCommentsPage(); - initializeSettings(); initializeCreditsPage(); initializeOnboardingTaskCard(); } diff --git a/app/assets/javascripts/initializers/initializeSettings.js b/app/assets/javascripts/initializers/initializeSettings.js deleted file mode 100644 index a11d6e7c6..000000000 --- a/app/assets/javascripts/initializers/initializeSettings.js +++ /dev/null @@ -1,51 +0,0 @@ -/* global timestampToLocalDateTime InstantClick */ - -function initializeSettings() { - // initialize org secret copy to clipboard functionality - const settingsOrgSecretInput = document.getElementById('settings-org-secret'); - const settingsOrgSecretButton = document.getElementById( - 'settings-org-secret-copy-btn', - ); - - if (settingsOrgSecretInput && settingsOrgSecretButton) { - settingsOrgSecretButton.addEventListener('click', () => { - const { value } = settingsOrgSecretInput; - window.Forem.Runtime.copyToClipboard(value).then(() => { - // Show the confirmation message - document - .getElementById('copy-text-announcer') - .classList.remove('hidden'); - }); - }); - } - - // shows RSS fetch time in local time - let timeNode = document.getElementById('rss-fetch-time'); - if (timeNode) { - var timeStamp = timeNode.getAttribute('datetime'); - var timeOptions = { - month: 'long', - day: 'numeric', - hour: 'numeric', - minute: 'numeric', - second: 'numeric', - }; - - timeNode.textContent = timestampToLocalDateTime( - timeStamp, - navigator.language, - timeOptions, - ); - } - - const mobilePageSelector = document.getElementById('mobile-page-selector'); - - if (mobilePageSelector) { - mobilePageSelector.addEventListener('change', (event) => { - const url = event.target.value; - - InstantClick.preload(url); - InstantClick.display(url); - }); - } -} diff --git a/app/javascript/packs/baseInitializers.js b/app/javascript/packs/baseInitializers.js index eff57ad3a..f854ad84d 100644 --- a/app/javascript/packs/baseInitializers.js +++ b/app/javascript/packs/baseInitializers.js @@ -3,6 +3,7 @@ import { initializeCommentPreview } from './initializers/initializeCommentPrevie import { initializeTimeFixer } from './initializers/initializeTimeFixer'; import { initializeNotifications } from './initializers/initializeNotifications'; import { initializeDateHelpers } from './initializers/initializeDateTimeHelpers'; +import { initializeSettings } from './initializers/initializeSettings'; import { showUserAlertModal, showModalAfterError, @@ -10,6 +11,7 @@ import { initializeCommentDate(); initializeCommentPreview(); +initializeSettings(); initializeNotifications(); initializeTimeFixer(); initializeDateHelpers(); @@ -17,6 +19,7 @@ initializeDateHelpers(); InstantClick.on('change', () => { initializeCommentDate(); initializeCommentPreview(); + initializeSettings(); initializeNotifications(); }); diff --git a/app/javascript/packs/initializers/initializeSettings.js b/app/javascript/packs/initializers/initializeSettings.js new file mode 100644 index 000000000..d776eedf6 --- /dev/null +++ b/app/javascript/packs/initializers/initializeSettings.js @@ -0,0 +1,9 @@ +import { setupCopyOrgSecret } from '../../settings/copyOrgSecret'; +import { setupRssFetchTime } from '../../settings/rssFetchTime'; +import { setupMobilePageSel } from '../../settings/mobilePageSel'; + +export function initializeSettings() { + setupCopyOrgSecret(); + setupRssFetchTime(); + setupMobilePageSel(); +} diff --git a/app/javascript/settings/__tests__/copyOrgSecret.test.js b/app/javascript/settings/__tests__/copyOrgSecret.test.js new file mode 100644 index 000000000..956393aed --- /dev/null +++ b/app/javascript/settings/__tests__/copyOrgSecret.test.js @@ -0,0 +1,45 @@ +import { setupCopyOrgSecret, copyToClipboardListener } from '../copyOrgSecret'; + +describe('OrgSecretCopy Tests', () => { + let copyToClipboardMock, valueToCopy; + + const getCopyBtn = () => + document.getElementById('settings-org-secret-copy-btn'); + + beforeAll(async () => { + valueToCopy = 'abc123'; + + document.body.innerHTML = ` + + + + `; + }); + + beforeEach(() => { + // Mock window.Forem.Runtime.copyToClipboard + copyToClipboardMock = jest.fn().mockResolvedValue({}); + global.window.Forem = { + Runtime: { + copyToClipboard: copyToClipboardMock, + }, + }; + }); + + it('attaches listener to button', () => { + const spyButton = jest.spyOn(getCopyBtn(), 'addEventListener'); + + setupCopyOrgSecret(); + expect(spyButton).toHaveBeenCalledWith('click', copyToClipboardListener); + }); + + it('after button is clicked, copyToClipboard called + announcer shown', async () => { + getCopyBtn().click(); + + expect(copyToClipboardMock).toHaveBeenCalledWith(valueToCopy); + + await Promise.resolve(); + const announcer = document.getElementById('copy-text-announcer'); + expect(announcer.classList.contains('hidden')).toBe(false); + }); +}); diff --git a/app/javascript/settings/__tests__/mobilePageSel.test.js b/app/javascript/settings/__tests__/mobilePageSel.test.js new file mode 100644 index 000000000..dcd8facc3 --- /dev/null +++ b/app/javascript/settings/__tests__/mobilePageSel.test.js @@ -0,0 +1,17 @@ +import { setupMobilePageSel, mobilePageSelListener } from '../mobilePageSel'; + +describe('MobilePageSel Tests', () => { + beforeAll(async () => { + document.body.innerHTML = '