mirror of
https://github.com/philomena-dev/philomena.git
synced 2025-02-08 15:16:43 +01:00
Moved oncePersistedPageShown
to events, added tests
This commit is contained in:
parent
77352a3c77
commit
3ecc59896e
3 changed files with 72 additions and 22 deletions
|
@ -6,6 +6,7 @@ import { assertNotNull } from './utils/assert';
|
||||||
import { fetchJson, handleError } from './utils/requests';
|
import { fetchJson, handleError } from './utils/requests';
|
||||||
import { $, $$, clearEl, hideEl, makeEl, showEl } from './utils/dom';
|
import { $, $$, clearEl, hideEl, makeEl, showEl } from './utils/dom';
|
||||||
import { addTag } from './tagsinput';
|
import { addTag } from './tagsinput';
|
||||||
|
import { oncePersistedPageShown } from './utils/events';
|
||||||
|
|
||||||
const MATROSKA_MAGIC = 0x1a45dfa3;
|
const MATROSKA_MAGIC = 0x1a45dfa3;
|
||||||
|
|
||||||
|
@ -27,27 +28,6 @@ function elementForEmbeddedImage({ camo_url, type }) {
|
||||||
return makeEl(tagName, { className: 'scraper-preview--image', src: objectUrl });
|
return makeEl(tagName, { className: 'scraper-preview--image', src: objectUrl });
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Execute the code when page was shown from back-forward cache.
|
|
||||||
* @param {() => void} callback
|
|
||||||
*/
|
|
||||||
function oncePersistedPageShown(callback) {
|
|
||||||
/**
|
|
||||||
* @param {PageTransitionEvent} event
|
|
||||||
*/
|
|
||||||
function onPageShown(event) {
|
|
||||||
if (!event.persisted) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
window.removeEventListener('pageshow', onPageShown);
|
|
||||||
|
|
||||||
callback();
|
|
||||||
}
|
|
||||||
|
|
||||||
window.addEventListener('pageshow', onPageShown);
|
|
||||||
}
|
|
||||||
|
|
||||||
function setupImageUpload() {
|
function setupImageUpload() {
|
||||||
const imgPreviews = $('#js-image-upload-previews');
|
const imgPreviews = $('#js-image-upload-previews');
|
||||||
if (!imgPreviews) return;
|
if (!imgPreviews) return;
|
||||||
|
|
|
@ -1,4 +1,12 @@
|
||||||
import { delegate, fire, mouseMoveThenOver, leftClick, on, PhilomenaAvailableEventsMap } from '../events';
|
import {
|
||||||
|
delegate,
|
||||||
|
fire,
|
||||||
|
mouseMoveThenOver,
|
||||||
|
leftClick,
|
||||||
|
on,
|
||||||
|
PhilomenaAvailableEventsMap,
|
||||||
|
oncePersistedPageShown,
|
||||||
|
} from '../events';
|
||||||
import { getRandomArrayItem } from '../../../test/randomness';
|
import { getRandomArrayItem } from '../../../test/randomness';
|
||||||
import { fireEvent } from '@testing-library/dom';
|
import { fireEvent } from '@testing-library/dom';
|
||||||
|
|
||||||
|
@ -129,6 +137,51 @@ describe('Event utils', () => {
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
describe('oncePersistedPageShown', () => {
|
||||||
|
it('should NOT fire on usual page show', () => {
|
||||||
|
const mockHandler = vi.fn();
|
||||||
|
|
||||||
|
oncePersistedPageShown(mockHandler);
|
||||||
|
|
||||||
|
fireEvent.pageShow(window, { persisted: false });
|
||||||
|
|
||||||
|
expect(mockHandler).toHaveBeenCalledTimes(0);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should fire on persisted pageshow', () => {
|
||||||
|
const mockHandler = vi.fn();
|
||||||
|
|
||||||
|
oncePersistedPageShown(mockHandler);
|
||||||
|
|
||||||
|
fireEvent.pageShow(window, { persisted: true });
|
||||||
|
|
||||||
|
expect(mockHandler).toHaveBeenCalledTimes(1);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should keep waiting until the first persistent page shown fired', () => {
|
||||||
|
const mockHandler = vi.fn();
|
||||||
|
|
||||||
|
oncePersistedPageShown(mockHandler);
|
||||||
|
|
||||||
|
fireEvent.pageShow(window, { persisted: false });
|
||||||
|
fireEvent.pageShow(window, { persisted: false });
|
||||||
|
fireEvent.pageShow(window, { persisted: true });
|
||||||
|
|
||||||
|
expect(mockHandler).toHaveBeenCalledTimes(1);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should NOT fire more than once', () => {
|
||||||
|
const mockHandler = vi.fn();
|
||||||
|
|
||||||
|
oncePersistedPageShown(mockHandler);
|
||||||
|
|
||||||
|
fireEvent.pageShow(window, { persisted: true });
|
||||||
|
fireEvent.pageShow(window, { persisted: true });
|
||||||
|
|
||||||
|
expect(mockHandler).toHaveBeenCalledTimes(1);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
describe('delegate', () => {
|
describe('delegate', () => {
|
||||||
it('should call the native addEventListener method on the element', () => {
|
it('should call the native addEventListener method on the element', () => {
|
||||||
const mockElement = document.createElement('div');
|
const mockElement = document.createElement('div');
|
||||||
|
|
|
@ -54,6 +54,23 @@ export function mouseMoveThenOver<El extends HTMLElement>(element: El, func: (e:
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export function oncePersistedPageShown(func: (e: PageTransitionEvent) => void) {
|
||||||
|
const controller = new AbortController();
|
||||||
|
|
||||||
|
window.addEventListener(
|
||||||
|
'pageshow',
|
||||||
|
(e: PageTransitionEvent) => {
|
||||||
|
if (!e.persisted) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
controller.abort();
|
||||||
|
func(e);
|
||||||
|
},
|
||||||
|
{ signal: controller.signal },
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
export function delegate<K extends keyof PhilomenaAvailableEventsMap, Target extends Element>(
|
export function delegate<K extends keyof PhilomenaAvailableEventsMap, Target extends Element>(
|
||||||
node: PhilomenaEventElement,
|
node: PhilomenaEventElement,
|
||||||
event: K,
|
event: K,
|
||||||
|
|
Loading…
Reference in a new issue