diff --git a/app/assets/javascripts/application.js b/app/assets/javascripts/application.js index 8a60c2a61..646c5aba4 100644 --- a/app/assets/javascripts/application.js +++ b/app/assets/javascripts/application.js @@ -12,4 +12,4 @@ // //= require jquery //= require jquery_ujs -//= require_tree . \ No newline at end of file +//= require_tree . diff --git a/app/assets/javascripts/initializers/initializeAllTagEditButtons.js b/app/assets/javascripts/initializers/initializeAllTagEditButtons.js index c2da1d20f..e454e7204 100644 --- a/app/assets/javascripts/initializers/initializeAllTagEditButtons.js +++ b/app/assets/javascripts/initializers/initializeAllTagEditButtons.js @@ -11,7 +11,8 @@ function initializeAllTagEditButtons() { if ( user && tagEditButton && - (user.moderator_for_tags.indexOf(tagEditButton.dataset.tag) > -1 || user.admin) + (user.moderator_for_tags.indexOf(tagEditButton.dataset.tag) > -1 || + user.admin) ) { tagEditButton.style.display = 'inline-block'; document.getElementById('tag-mod-button').style.display = 'inline-block'; diff --git a/app/assets/javascripts/initializers/initializeArticleDate.js b/app/assets/javascripts/initializers/initializeArticleDate.js index a11ff1c81..33216554d 100644 --- a/app/assets/javascripts/initializers/initializeArticleDate.js +++ b/app/assets/javascripts/initializers/initializeArticleDate.js @@ -1,5 +1,3 @@ - - /* Show article date/time according to user's locale */ /* global addLocalizedDateTimeToElementsTitles */ diff --git a/app/assets/javascripts/initializers/initializeBodyData.js b/app/assets/javascripts/initializers/initializeBodyData.js index a1d947e39..d5d0b96e7 100644 --- a/app/assets/javascripts/initializers/initializeBodyData.js +++ b/app/assets/javascripts/initializers/initializeBodyData.js @@ -1,4 +1,3 @@ - /* global checkUserLoggedIn */ function removeExistingCSRF() { diff --git a/app/assets/javascripts/initializers/initializeEllipsisMenu.js b/app/assets/javascripts/initializers/initializeEllipsisMenu.js index 4b9680e2b..980399c0d 100644 --- a/app/assets/javascripts/initializers/initializeEllipsisMenu.js +++ b/app/assets/javascripts/initializers/initializeEllipsisMenu.js @@ -47,9 +47,7 @@ function onXhrSuccess(form, article, values) { toggleNotifications(submit, submitValue); } - article - .getElementsByClassName('js-ellipsis-menu')[0] - .classList.add('hidden'); + article.getElementsByClassName('js-ellipsis-menu')[0].classList.add('hidden'); } function handleFormSubmit(e) { diff --git a/app/assets/javascripts/initializers/initializePWAFunctionality.js b/app/assets/javascripts/initializers/initializePWAFunctionality.js index e52f3c816..e22d571ec 100644 --- a/app/assets/javascripts/initializers/initializePWAFunctionality.js +++ b/app/assets/javascripts/initializers/initializePWAFunctionality.js @@ -1,19 +1,22 @@ 'use strict'; function initializePWAFunctionality() { - if (window.matchMedia('(display-mode: standalone)').matches || window.frameElement) { + if ( + window.matchMedia('(display-mode: standalone)').matches || + window.frameElement + ) { document .getElementById('pwa-nav-buttons') .classList.add('pwa-nav-buttons--showing'); - document.getElementById('app-back-button').onclick = e => { + document.getElementById('app-back-button').onclick = (e) => { e.preventDefault(); window.history.back(); }; - document.getElementById('app-forward-button').onclick = e => { + document.getElementById('app-forward-button').onclick = (e) => { e.preventDefault(); window.history.forward(); }; - document.getElementById('app-refresh-button').onclick = e => { + document.getElementById('app-refresh-button').onclick = (e) => { e.preventDefault(); window.location.reload(); }; diff --git a/app/assets/javascripts/initializers/initializeTimeFixer.js b/app/assets/javascripts/initializers/initializeTimeFixer.js index 487f44218..d34b7b319 100644 --- a/app/assets/javascripts/initializers/initializeTimeFixer.js +++ b/app/assets/javascripts/initializers/initializeTimeFixer.js @@ -57,12 +57,12 @@ function initializeTimeFixer() { updateLocalDateTime( utcTime, convertUtcTime, - element => element.dataset.datetime, + (element) => element.dataset.datetime, ); updateLocalDateTime( utcDate, convertUtcDate, - element => element.dataset.datetime, + (element) => element.dataset.datetime, ); - updateLocalDateTime(utc, convertCalEvent, element => element.innerHTML); + updateLocalDateTime(utc, convertCalEvent, (element) => element.innerHTML); } diff --git a/app/assets/javascripts/jquery_s3_upload.js b/app/assets/javascripts/jquery_s3_upload.js index 0830775ca..1a2e8a97b 100644 --- a/app/assets/javascripts/jquery_s3_upload.js +++ b/app/assets/javascripts/jquery_s3_upload.js @@ -1 +1 @@ -//= require s3_direct_upload \ No newline at end of file +//= require s3_direct_upload diff --git a/app/assets/javascripts/serviceworker-companion.js b/app/assets/javascripts/serviceworker-companion.js index d3adf4d7d..1df77b414 100644 --- a/app/assets/javascripts/serviceworker-companion.js +++ b/app/assets/javascripts/serviceworker-companion.js @@ -6,16 +6,16 @@ if ('serviceWorker' in navigator) { .then(function swStart(registration) { // registered! }) - .catch(error => { + .catch((error) => { // eslint-disable-next-line no-console console.log('ServiceWorker registration failed: ', error); }); } -window.addEventListener('beforeinstallprompt', e => { +window.addEventListener('beforeinstallprompt', (e) => { // beforeinstallprompt Event fired // e.userChoice will return a Promise. - e.userChoice.then(choiceResult => { + e.userChoice.then((choiceResult) => { ga('send', 'event', 'PWA-install', choiceResult.outcome); }); }); diff --git a/app/assets/javascripts/utilities/dynamicallyLoadScript.js b/app/assets/javascripts/utilities/dynamicallyLoadScript.js index 5dcbc5fc2..bbff003d7 100644 --- a/app/assets/javascripts/utilities/dynamicallyLoadScript.js +++ b/app/assets/javascripts/utilities/dynamicallyLoadScript.js @@ -1,5 +1,3 @@ - - function dynamicallyLoadScript(url) { if (document.querySelector(`script[src='${url}']`)) return; diff --git a/app/assets/javascripts/utilities/sendFetch.js b/app/assets/javascripts/utilities/sendFetch.js index 540694abb..bcb7c0b05 100644 --- a/app/assets/javascripts/utilities/sendFetch.js +++ b/app/assets/javascripts/utilities/sendFetch.js @@ -1,7 +1,7 @@ 'use strict'; const fetchCallback = ({ url, headers = {}, addTokenToBody = false, body }) => { - return csrfToken => { + return (csrfToken) => { if (addTokenToBody) { body.append('authenticity_token', csrfToken); } diff --git a/app/assets/javascripts/utilities/timeAgo.js b/app/assets/javascripts/utilities/timeAgo.js index 4755dfe99..b0871353b 100644 --- a/app/assets/javascripts/utilities/timeAgo.js +++ b/app/assets/javascripts/utilities/timeAgo.js @@ -38,7 +38,7 @@ function secondsToHumanUnitAgo(seconds) { */ function timeAgo({ oldTimeInSeconds, - formatter = humanTime => + formatter = (humanTime) => `(${humanTime})`, maxDisplayedAge = 60 * 60 * 24 - 1, }) { diff --git a/app/javascript/analytics/dashboard.js b/app/javascript/analytics/dashboard.js index 8f5b5b61a..53647ea41 100644 --- a/app/javascript/analytics/dashboard.js +++ b/app/javascript/analytics/dashboard.js @@ -60,7 +60,7 @@ function drawChart({ canvas, title, labels, datasets }) { }, }; - import("chart.js").then(({ Chart }) => { + import('chart.js').then(({ Chart }) => { // eslint-disable-next-line no-new new Chart(canvas, { type: 'line', @@ -75,14 +75,14 @@ function drawChart({ canvas, title, labels, datasets }) { function drawCharts(data, timeRangeLabel) { const labels = Object.keys(data); - const parsedData = Object.entries(data).map(date => date[1]); - const comments = parsedData.map(date => date.comments.total); - const reactions = parsedData.map(date => date.reactions.total); - const likes = parsedData.map(date => date.reactions.like); - const readingList = parsedData.map(date => date.reactions.readinglist); - const unicorns = parsedData.map(date => date.reactions.unicorn); - const followers = parsedData.map(date => date.follows.total); - const readers = parsedData.map(date => date.page_views.total); + const parsedData = Object.entries(data).map((date) => date[1]); + const comments = parsedData.map((date) => date.comments.total); + const reactions = parsedData.map((date) => date.reactions.total); + const likes = parsedData.map((date) => date.reactions.like); + const readingList = parsedData.map((date) => date.reactions.readinglist); + const unicorns = parsedData.map((date) => date.reactions.unicorn); + const followers = parsedData.map((date) => date.follows.total); + const readers = parsedData.map((date) => date.page_views.total); drawChart({ canvas: document.getElementById('reactions-chart'), @@ -169,8 +169,8 @@ function drawCharts(data, timeRangeLabel) { function renderReferrers(data) { const container = document.getElementById('referrers-container'); const tableBody = data.domains - .filter(referrer => referrer.domain) - .map(referrer => { + .filter((referrer) => referrer.domain) + .map((referrer) => { return ` ${referrer.domain} @@ -181,7 +181,7 @@ function renderReferrers(data) { // add referrers with empty domains if present const emptyDomainReferrer = data.domains.filter( - referrer => !referrer.domain, + (referrer) => !referrer.domain, )[0]; if (emptyDomainReferrer) { tableBody.push(` @@ -196,12 +196,12 @@ function renderReferrers(data) { } function callAnalyticsAPI(date, timeRangeLabel, { organizationId, articleId }) { - callHistoricalAPI(date, { organizationId, articleId }, data => { + callHistoricalAPI(date, { organizationId, articleId }, (data) => { writeCards(data, timeRangeLabel); drawCharts(data, timeRangeLabel); }); - callReferrersAPI(date, { organizationId, articleId }, data => { + callReferrersAPI(date, { organizationId, articleId }, (data) => { renderReferrers(data); }); } diff --git a/app/javascript/article-form/articleForm.jsx b/app/javascript/article-form/articleForm.jsx index 2a473be59..f405e86ec 100644 --- a/app/javascript/article-form/articleForm.jsx +++ b/app/javascript/article-form/articleForm.jsx @@ -7,13 +7,7 @@ import { submitArticle, previewArticle } from './actions'; /* global activateRunkitTags */ -import { - EditorActions, - Form, - Header, - Help, - Preview, -} from './components'; +import { EditorActions, Form, Header, Help, Preview } from './components'; /* Although the state fields: id, description, canonicalUrl, series, allSeries and @@ -361,9 +355,11 @@ export default class ArticleForm extends Component { submitting={submitting} /> - + ); } diff --git a/app/javascript/article-form/components/ErrorList.jsx b/app/javascript/article-form/components/ErrorList.jsx index b5e1233b5..79b4d6e85 100644 --- a/app/javascript/article-form/components/ErrorList.jsx +++ b/app/javascript/article-form/components/ErrorList.jsx @@ -3,7 +3,10 @@ import PropTypes from 'prop-types'; export const ErrorList = ({ errors }) => { return ( -
+

Whoops, something went wrong:

    {Object.keys(errors).map((key) => { diff --git a/app/javascript/article-form/components/Help.jsx b/app/javascript/article-form/components/Help.jsx index 3a3d4f279..13d9392fe 100644 --- a/app/javascript/article-form/components/Help.jsx +++ b/app/javascript/article-form/components/Help.jsx @@ -75,8 +75,8 @@ export class Help extends Component { post.
  • - Add up to four comma-separated tags per post. Combine tags to reach the appropriate - subcommunities. + Add up to four comma-separated tags per post. Combine tags to reach + the appropriate subcommunities.
  • Use existing tags whenever possible.
  • diff --git a/app/javascript/article-form/components/PageTitle.jsx b/app/javascript/article-form/components/PageTitle.jsx index 2406c7eec..3cb35fe62 100644 --- a/app/javascript/article-form/components/PageTitle.jsx +++ b/app/javascript/article-form/components/PageTitle.jsx @@ -2,7 +2,7 @@ import { h } from 'preact'; import PropTypes from 'prop-types'; import { OrganizationPicker } from '../../organization/OrganizationPicker'; -export const PageTitle = ({organizations, organizationId, onToggle}) => { +export const PageTitle = ({ organizations, organizationId, onToggle }) => { return (
    diff --git a/app/javascript/article-form/components/Tabs.jsx b/app/javascript/article-form/components/Tabs.jsx index 3554c6f4d..8206c986d 100644 --- a/app/javascript/article-form/components/Tabs.jsx +++ b/app/javascript/article-form/components/Tabs.jsx @@ -26,7 +26,6 @@ export const Tabs = ({ onPreview, previewShowing }) => { ); }; - Tabs.propTypes = { previewShowing: PropTypes.bool.isRequired, onPreview: PropTypes.func.isRequired, diff --git a/app/javascript/article-form/components/dragAndDropHelpers.js b/app/javascript/article-form/components/dragAndDropHelpers.js index 9effacfcd..865f10a76 100644 --- a/app/javascript/article-form/components/dragAndDropHelpers.js +++ b/app/javascript/article-form/components/dragAndDropHelpers.js @@ -48,9 +48,7 @@ export function handleImageDrop(handleImageSuccess, handleImageFailure) { */ export function onDragOver(event) { event.preventDefault(); - event.currentTarget - .closest('.drop-area') - .classList.add('drop-area--active'); + event.currentTarget.closest('.drop-area').classList.add('drop-area--active'); } /** diff --git a/app/javascript/articles/Feed.jsx b/app/javascript/articles/Feed.jsx index ab72a5123..80a85a089 100644 --- a/app/javascript/articles/Feed.jsx +++ b/app/javascript/articles/Feed.jsx @@ -137,7 +137,7 @@ export const Feed = ({ timeFrame, renderFeed }) => { 'a.crayons-story__hidden-navigation-link', 'div.paged-stories', ); - + useKeyboardShortcuts({ b: (event) => { const article = event.target?.closest('article.crayons-story'); diff --git a/app/javascript/articles/__tests__/utilities/articleUtilities.js b/app/javascript/articles/__tests__/utilities/articleUtilities.js index 974a09bfe..16f8ece26 100644 --- a/app/javascript/articles/__tests__/utilities/articleUtilities.js +++ b/app/javascript/articles/__tests__/utilities/articleUtilities.js @@ -266,7 +266,7 @@ export const podcastArticle = { image_url: '/images/16.png', image_90: '/images/16.png', }, - slug: 'episode-slug' + slug: 'episode-slug', }; export const podcastEpisodeArticle = { diff --git a/app/javascript/articles/components/CommentsCount.jsx b/app/javascript/articles/components/CommentsCount.jsx index baf3f2ec1..967dc2003 100644 --- a/app/javascript/articles/components/CommentsCount.jsx +++ b/app/javascript/articles/components/CommentsCount.jsx @@ -25,7 +25,7 @@ export const CommentsCount = ({ count, articlePath }) => { tagName="a" > - {count} + {count}   {`${count > 1 ? 'comments' : 'comment'}`} diff --git a/app/javascript/chat/ChatChannelSettings/ChannelDescriptionSection.jsx b/app/javascript/chat/ChatChannelSettings/ChannelDescriptionSection.jsx index 92684c303..9232664ce 100644 --- a/app/javascript/chat/ChatChannelSettings/ChannelDescriptionSection.jsx +++ b/app/javascript/chat/ChatChannelSettings/ChannelDescriptionSection.jsx @@ -4,25 +4,21 @@ import PropTypes from 'prop-types'; const ChannelDescriptionSection = ({ channelName, channelDescription, - currentMembershipRole + currentMembershipRole, }) => { return (

    {channelName}

    {channelDescription}

    -

    - You are a channel - {' '} - {currentMembershipRole} -

    +

    You are a channel {currentMembershipRole}

    - ) -} + ); +}; ChannelDescriptionSection.propTypes = { - channelName: PropTypes.string.isRequired, - currentMembershipRole: PropTypes.string.isRequired, - channelDescription: PropTypes.string.isRequired -} + channelName: PropTypes.string.isRequired, + currentMembershipRole: PropTypes.string.isRequired, + channelDescription: PropTypes.string.isRequired, +}; export default ChannelDescriptionSection; diff --git a/app/javascript/chat/__tests__/chat.test.jsx b/app/javascript/chat/__tests__/chat.test.jsx index 1375350cc..3c3533dad 100644 --- a/app/javascript/chat/__tests__/chat.test.jsx +++ b/app/javascript/chat/__tests__/chat.test.jsx @@ -168,9 +168,7 @@ describe('', () => { it('should have no a11y violations', async () => { fetch.mockResponse(getMockResponse()); - const { container } = render( - , - ); + const { container } = render(); const results = await axe(container); expect(results).toHaveNoViolations(); @@ -211,9 +209,7 @@ describe('', () => { it('should collapse and expand chat channels properly', async () => { fetch.mockResponse(getMockResponse()); - const { queryByText } = render( - , - ); + const { queryByText } = render(); // // chat channels expect( diff --git a/app/javascript/chat/__tests__/chatChannelSettings.test.jsx b/app/javascript/chat/__tests__/chatChannelSettings.test.jsx index 027e6baff..b06825b74 100644 --- a/app/javascript/chat/__tests__/chatChannelSettings.test.jsx +++ b/app/javascript/chat/__tests__/chatChannelSettings.test.jsx @@ -9,9 +9,7 @@ import ChatChannelSettings from '../ChatChannelSettings/ChatChannelSettings'; describe('', () => { it('should have no a11y violations', async () => { const { container } = render( - , + , ); const results = await axe(container); @@ -20,9 +18,7 @@ describe('', () => { it('should render if there are no channels', () => { const { container } = render( - , + , ); expect(container.firstElementChild).toBeNull(); diff --git a/app/javascript/chat/__tests__/content.test.jsx b/app/javascript/chat/__tests__/content.test.jsx index 72aca9cfd..0780a28b1 100644 --- a/app/javascript/chat/__tests__/content.test.jsx +++ b/app/javascript/chat/__tests__/content.test.jsx @@ -37,9 +37,7 @@ describe('', () => { it('should have no a11y violations', async () => { const channelRequestResource = getChannelRequestData(); const { container } = render( - , + , ); const results = await axe(container); @@ -49,9 +47,7 @@ describe('', () => { it('should render', () => { const channelRequestResource = getChannelRequestData(); const { queryByText, queryByTitle } = render( - , + , ); // Ensure the two buttons render diff --git a/app/javascript/crayons/typography/__stories__/typographyAccented.stories.jsx b/app/javascript/crayons/typography/__stories__/typographyAccented.stories.jsx index 96598ab84..d1c66e897 100644 --- a/app/javascript/crayons/typography/__stories__/typographyAccented.stories.jsx +++ b/app/javascript/crayons/typography/__stories__/typographyAccented.stories.jsx @@ -23,7 +23,9 @@ export const SampleTexts = () => (

    Lorem ipsum dolor sit amet.

    Lorem ipsum dolor sit amet.

    -

    Lorem ipsum dolor sit amet.

    +

    + Lorem ipsum dolor sit amet. +

    Lorem ipsum dolor sit amet.

    diff --git a/app/javascript/listings/components/MessageModal.jsx b/app/javascript/listings/components/MessageModal.jsx index d2dee74ac..573b49935 100644 --- a/app/javascript/listings/components/MessageModal.jsx +++ b/app/javascript/listings/components/MessageModal.jsx @@ -36,9 +36,7 @@ const MessageModal = ({ className="crayons-textfield mb-0" placeholder="Enter your message here..." /> -

    +

    {isCurrentUserOnListing && 'Message must be relevant and on-topic with the listing.'} All private interactions must abide by the{' '} diff --git a/app/javascript/listings/components/SelectedTags.jsx b/app/javascript/listings/components/SelectedTags.jsx index 91a3e39c2..53a27de37 100644 --- a/app/javascript/listings/components/SelectedTags.jsx +++ b/app/javascript/listings/components/SelectedTags.jsx @@ -5,8 +5,16 @@ const SelectedTags = ({ tags, onRemoveTag, onKeyPress }) => { return (

    {tags.map((tag) => ( - - + + # {tag} diff --git a/app/javascript/listings/dashboard/rowElements/tags.jsx b/app/javascript/listings/dashboard/rowElements/tags.jsx index 1aa8655c7..48f8a2063 100644 --- a/app/javascript/listings/dashboard/rowElements/tags.jsx +++ b/app/javascript/listings/dashboard/rowElements/tags.jsx @@ -2,24 +2,17 @@ import PropTypes from 'prop-types'; import { h } from 'preact'; const Tags = ({ tagList }) => { - const tagLinks = tagList.map(tag => ( + const tagLinks = tagList.map((tag) => ( - # - {tag} - {' '} + #{tag}{' '} )); - return ( - - {tagLinks} - - ) -} - + return {tagLinks}; +}; Tags.propTypes = { tagList: PropTypes.arrayOf(PropTypes.string).isRequired, -} +}; -export default Tags; \ No newline at end of file +export default Tags; diff --git a/app/javascript/listings/listingDashboard.jsx b/app/javascript/listings/listingDashboard.jsx index 85ad8fd14..1c4f4072b 100644 --- a/app/javascript/listings/listingDashboard.jsx +++ b/app/javascript/listings/listingDashboard.jsx @@ -163,8 +163,7 @@ export class ListingDashboard extends Component { ) : (

    - Listings Made: - {' '} + Listings Made:{' '} { organizationListings.filter( (listing) => listing.organization_id === selected, @@ -182,8 +181,7 @@ export class ListingDashboard extends Component {

    ) : (

    - Credits Available: - {' '} + Credits Available:{' '} { organizations.find((org) => org.id === selected) .unspent_credits_count diff --git a/app/javascript/listings/singleListing/AuthorInfo.jsx b/app/javascript/listings/singleListing/AuthorInfo.jsx index abd9db647..e456bb161 100644 --- a/app/javascript/listings/singleListing/AuthorInfo.jsx +++ b/app/javascript/listings/singleListing/AuthorInfo.jsx @@ -42,12 +42,9 @@ const AuthorInfo = ({ listing, onCategoryClick }) => { className="crayons-avatar__image" /> - +
    - + {name}

    diff --git a/app/javascript/listings/singleListing/DropdownMenu.jsx b/app/javascript/listings/singleListing/DropdownMenu.jsx index 440610dd4..93af5df10 100644 --- a/app/javascript/listings/singleListing/DropdownMenu.jsx +++ b/app/javascript/listings/singleListing/DropdownMenu.jsx @@ -64,7 +64,10 @@ class DropdownMenu extends Component { const reportUrl = `/report-abuse?url=https://dev.to/listings/${category}/${slug}`; return ( -

    +
    +
    ); }; diff --git a/app/javascript/readingList/components/ItemListTags.jsx b/app/javascript/readingList/components/ItemListTags.jsx index 3ce70f63f..ca65e4ab6 100644 --- a/app/javascript/readingList/components/ItemListTags.jsx +++ b/app/javascript/readingList/components/ItemListTags.jsx @@ -15,7 +15,11 @@ export const ItemListTags = ({ availableTags, selectedTags, onClick }) => { {`#${tag}`} )); - return ; + return ( + + ); }; ItemListTags.propTypes = { diff --git a/app/javascript/shared/components/__tests__/useKeyboardShortcuts.test.jsx b/app/javascript/shared/components/__tests__/useKeyboardShortcuts.test.jsx index abd9f16f0..dd50e17d8 100644 --- a/app/javascript/shared/components/__tests__/useKeyboardShortcuts.test.jsx +++ b/app/javascript/shared/components/__tests__/useKeyboardShortcuts.test.jsx @@ -1,92 +1,84 @@ import { h } from 'preact'; import { renderHook } from '@testing-library/preact-hooks'; import { fireEvent, render } from '@testing-library/preact'; -import { KeyboardShortcuts, useKeyboardShortcuts } from '../useKeyboardShortcuts'; +import { + KeyboardShortcuts, + useKeyboardShortcuts, +} from '../useKeyboardShortcuts'; describe('Keyboard shortcuts for components', () => { describe('useKeyboardShortcuts', () => { it('should fire a function when keydown is detected', () => { const shortcut = { - KeyK: jest.fn() + KeyK: jest.fn(), }; - renderHook(() => - useKeyboardShortcuts(shortcut, document), - ); - fireEvent.keyDown(document, { code: "KeyK" }); + renderHook(() => useKeyboardShortcuts(shortcut, document)); + fireEvent.keyDown(document, { code: 'KeyK' }); expect(shortcut.KeyK).toHaveBeenCalledTimes(1); }); - + it('should fire a function when chained keydown is detected', () => { const shortcut = { - "KeyA~KeyB": jest.fn() + 'KeyA~KeyB': jest.fn(), }; - renderHook(() => - useKeyboardShortcuts(shortcut, document), - ); - fireEvent.keyDown(document, { code: "KeyA" }); - fireEvent.keyDown(document, { code: "KeyB" }); + renderHook(() => useKeyboardShortcuts(shortcut, document)); + fireEvent.keyDown(document, { code: 'KeyA' }); + fireEvent.keyDown(document, { code: 'KeyB' }); - expect(shortcut["KeyA~KeyB"]).toHaveBeenCalledTimes(1); + expect(shortcut['KeyA~KeyB']).toHaveBeenCalledTimes(1); }); - + it('should not fire a function when chained keydown is missed, timeout should only be 0ms', async () => { const shortcut = { - "KeyA~KeyB": jest.fn() + 'KeyA~KeyB': jest.fn(), }; - + const timeout = 0; - renderHook(() => - useKeyboardShortcuts(shortcut, document, { timeout }), - ); - fireEvent.keyDown(document, { code: "KeyA" }); - - await new Promise(resolve => setTimeout(() => { - fireEvent.keyDown(document, { code: "KeyB" }); - resolve(); - }, 25)); + renderHook(() => useKeyboardShortcuts(shortcut, document, { timeout })); + fireEvent.keyDown(document, { code: 'KeyA' }); - expect(shortcut["KeyA~KeyB"]).not.toHaveBeenCalled(); + await new Promise((resolve) => + setTimeout(() => { + fireEvent.keyDown(document, { code: 'KeyB' }); + resolve(); + }, 25), + ); + + expect(shortcut['KeyA~KeyB']).not.toHaveBeenCalled(); }); - + it('should not add event listener if shortcut object is empty', () => { HTMLDocument.prototype.addEventListener = jest.fn(); - renderHook(() => - useKeyboardShortcuts({}, document), - ); + renderHook(() => useKeyboardShortcuts({}, document)); expect(HTMLDocument.prototype.addEventListener).not.toHaveBeenCalled(); }); it('should add event listener to window', () => { HTMLDocument.prototype.addEventListener = jest.fn(); - - const shortcut = { - KeyK: null - } - renderHook(() => - useKeyboardShortcuts(shortcut, document), - ); + const shortcut = { + KeyK: null, + }; + + renderHook(() => useKeyboardShortcuts(shortcut, document)); expect(HTMLDocument.prototype.addEventListener).toHaveBeenCalledTimes(1); }); it('should not fire a function when keydown is detected in element', () => { const shortcut = { - KeyK: jest.fn() + KeyK: jest.fn(), }; - const eventTarget = document.createElement('textarea') // eventTarget set since the default is window + const eventTarget = document.createElement('textarea'); // eventTarget set since the default is window - renderHook(() => - useKeyboardShortcuts(shortcut, document), - eventTarget, - ); - fireEvent.keyDown(eventTarget, { code: "KeyK" }); + renderHook(() => useKeyboardShortcuts(shortcut, document), eventTarget); + fireEvent.keyDown(eventTarget, { code: 'KeyK' }); expect(shortcut.KeyK).not.toHaveBeenCalled(); }); @@ -94,10 +86,10 @@ describe('Keyboard shortcuts for components', () => { it('should remove event listener when the hook is unmounted', () => { HTMLDocument.prototype.addEventListener = jest.fn(); HTMLDocument.prototype.removeEventListener = jest.fn(); - + const shortcut = { - KeyK: null - } + KeyK: null, + }; const { unmount } = renderHook(() => useKeyboardShortcuts(shortcut, document), @@ -106,7 +98,9 @@ describe('Keyboard shortcuts for components', () => { unmount(); expect(HTMLDocument.prototype.addEventListener).toHaveBeenCalledTimes(1); - expect(HTMLDocument.prototype.removeEventListener).toHaveBeenCalledTimes(1); + expect(HTMLDocument.prototype.removeEventListener).toHaveBeenCalledTimes( + 1, + ); }); }); @@ -114,9 +108,7 @@ describe('Keyboard shortcuts for components', () => { it('should not add event listener if shortcut object is empty', async () => { HTMLDocument.prototype.addEventListener = jest.fn(); - render( - , - ); + render(); expect(HTMLDocument.prototype.addEventListener).not.toHaveBeenCalled(); }); @@ -141,7 +133,9 @@ describe('Keyboard shortcuts for components', () => { unmount(); expect(HTMLDocument.prototype.addEventListener).toHaveBeenCalledTimes(1); - expect(HTMLDocument.prototype.removeEventListener).toHaveBeenCalledTimes(1); + expect(HTMLDocument.prototype.removeEventListener).toHaveBeenCalledTimes( + 1, + ); }); }); }); diff --git a/app/javascript/sidebar-widget/sidebarUser.jsx b/app/javascript/sidebar-widget/sidebarUser.jsx index 54b4194bd..8e57bf180 100644 --- a/app/javascript/sidebar-widget/sidebarUser.jsx +++ b/app/javascript/sidebar-widget/sidebarUser.jsx @@ -17,7 +17,11 @@ class SidebarUser extends Component { const { user } = this.props; return (
    - + {user.name} { expect( timeAgo({ oldTimeInSeconds, - formatter: x => `[${x}]`, + formatter: (x) => `[${x}]`, }), ).toEqual('[just now]'); }); diff --git a/app/javascript/utilities/dragAndUpload.js b/app/javascript/utilities/dragAndUpload.js index 5c25b7213..7c2bd1788 100644 --- a/app/javascript/utilities/dragAndUpload.js +++ b/app/javascript/utilities/dragAndUpload.js @@ -1,7 +1,11 @@ import { generateMainImage } from '../article-form/actions'; import { validateFileInputs } from '../packs/validateFileInputs'; -export const dragAndUpload = (files, handleImageSuccess, handleImageFailure) => { +export const dragAndUpload = ( + files, + handleImageSuccess, + handleImageFailure, +) => { if (files.length > 0 && validateFileInputs()) { const payload = { image: files }; generateMainImage(payload, handleImageSuccess, handleImageFailure);