blob: 418adbd0a11f9fae392fd5dcfe22a9163c418d31 [file] [log] [blame]
Milutin Kristofic086f7272020-11-18 15:31:08 +01001/**
2 * @license
3 * Copyright (C) 2020 The Android Open Source Project
4 *
5 * Licensed under the Apache License, Version 2.0 (the "License");
6 * you may not use this file except in compliance with the License.
7 * You may obtain a copy of the License at
8 *
9 * http://www.apache.org/licenses/LICENSE-2.0
10 *
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an "AS IS" BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
16 */
17
Ben Rohlfsea4cb7e2020-12-03 16:00:00 +010018import {FetchRequest} from '../types/types';
Ben Rohlfse7fbd802021-03-12 11:04:59 +010019import {
20 DialogChangeEventDetail,
Ben Rohlfs81c48cf2021-03-12 11:25:52 +010021 EventType,
Ben Rohlfse7fbd802021-03-12 11:04:59 +010022 SwitchTabEventDetail,
23 TabState,
Ben Rohlfse7fbd802021-03-12 11:04:59 +010024} from '../types/events';
Ben Rohlfsea4cb7e2020-12-03 16:00:00 +010025
Ben Rohlfse07f8182020-12-07 10:09:20 +010026export function fireEvent(target: EventTarget, type: string) {
27 target.dispatchEvent(
28 new CustomEvent(type, {
29 composed: true,
30 bubbles: true,
31 })
32 );
33}
34
Chris Poucetcaeea1b2021-08-19 22:12:56 +000035type HTMLElementEventDetailType<K extends keyof HTMLElementEventMap> =
36 HTMLElementEventMap[K] extends CustomEvent<infer DT>
37 ? unknown extends DT
38 ? never
39 : DT
40 : never;
Dmitrii Filippov131bf7a2021-04-01 18:02:27 +020041
Chris Poucetcaeea1b2021-08-19 22:12:56 +000042type DocumentEventDetailType<K extends keyof DocumentEventMap> =
43 DocumentEventMap[K] extends CustomEvent<infer DT>
44 ? unknown extends DT
45 ? never
46 : DT
47 : never;
Dmitrii Filippov131bf7a2021-04-01 18:02:27 +020048
49export function fire<K extends keyof DocumentEventMap>(
50 target: Document,
51 type: K,
52 detail: DocumentEventDetailType<K>
53): void;
54
55export function fire<K extends keyof HTMLElementEventMap>(
56 target: EventTarget,
57 type: K,
58 detail: HTMLElementEventDetailType<K>
59): void;
60
Ben Rohlfse7fbd802021-03-12 11:04:59 +010061export function fire<T>(target: EventTarget, type: string, detail: T) {
Milutin Kristofic086f7272020-11-18 15:31:08 +010062 target.dispatchEvent(
Ben Rohlfse7fbd802021-03-12 11:04:59 +010063 new CustomEvent<T>(type, {
64 detail,
Milutin Kristofic086f7272020-11-18 15:31:08 +010065 composed: true,
66 bubbles: true,
67 })
68 );
69}
Milutin Kristofic860fe4d2020-11-23 16:13:45 +010070
Ben Rohlfse7fbd802021-03-12 11:04:59 +010071export function fireAlert(target: EventTarget, message: string) {
Dhruv Srivastava02489cb2022-03-21 14:01:59 +053072 fire(target, EventType.SHOW_ALERT, {message, showDismiss: true});
Ben Rohlfse7fbd802021-03-12 11:04:59 +010073}
74
Ben Rohlfsa76c82f2021-01-22 22:22:32 +010075export function firePageError(response?: Response | null) {
Ben Rohlfse7fbd802021-03-12 11:04:59 +010076 if (response === null) response = undefined;
Dmitrii Filippov131bf7a2021-04-01 18:02:27 +020077 fire(document, EventType.PAGE_ERROR, {response});
Milutin Kristofic860fe4d2020-11-23 16:13:45 +010078}
Milutin Kristofic60150132020-11-23 20:15:23 +010079
Ben Rohlfsea4cb7e2020-12-03 16:00:00 +010080export function fireServerError(response: Response, request?: FetchRequest) {
Dmitrii Filippov131bf7a2021-04-01 18:02:27 +020081 fire(document, EventType.SERVER_ERROR, {
Ben Rohlfse7fbd802021-03-12 11:04:59 +010082 response,
83 request,
84 });
Ben Rohlfsea4cb7e2020-12-03 16:00:00 +010085}
86
Ben Rohlfs5ffb08b2020-12-03 22:48:27 +010087export function fireNetworkError(error: Error) {
Dmitrii Filippov131bf7a2021-04-01 18:02:27 +020088 fire(document, EventType.NETWORK_ERROR, {error});
Ben Rohlfs5ffb08b2020-12-03 22:48:27 +010089}
90
Milutin Kristofic60150132020-11-23 20:15:23 +010091export function fireTitleChange(target: EventTarget, title: string) {
Dmitrii Filippov131bf7a2021-04-01 18:02:27 +020092 fire(target, EventType.TITLE_CHANGE, {title});
Milutin Kristofic60150132020-11-23 20:15:23 +010093}
Dhruv Srivastava69951612020-12-07 21:37:03 +010094
Milutin Kristofic83f75162021-01-27 16:47:57 +010095// TODO(milutin) - remove once new gr-dialog will do it out of the box
96// This informs gr-app-element to remove footer, header from a11y tree
97export function fireDialogChange(
98 target: EventTarget,
99 detail: DialogChangeEventDetail
100) {
Dmitrii Filippov131bf7a2021-04-01 18:02:27 +0200101 fire(target, EventType.DIALOG_CHANGE, detail);
Milutin Kristofic83f75162021-01-27 16:47:57 +0100102}
103
Ben Rohlfs62278c82021-03-12 11:35:56 +0100104export function fireIronAnnounce(target: EventTarget, text: string) {
Dmitrii Filippov131bf7a2021-04-01 18:02:27 +0200105 fire(target, EventType.IRON_ANNOUNCE, {text});
Ben Rohlfs62278c82021-03-12 11:35:56 +0100106}
107
Milutin Kristoficbdddd742021-02-17 10:09:35 +0100108export function fireShowPrimaryTab(
109 target: EventTarget,
110 tab: string,
111 scrollIntoView?: boolean,
112 tabState?: TabState
113) {
Ben Rohlfse7fbd802021-03-12 11:04:59 +0100114 const detail: SwitchTabEventDetail = {tab, scrollIntoView, tabState};
Dmitrii Filippov131bf7a2021-04-01 18:02:27 +0200115 fire(target, EventType.SHOW_PRIMARY_TAB, detail);
116}
117
118export function fireCloseFixPreview(target: EventTarget, fixApplied: boolean) {
119 fire(target, EventType.CLOSE_FIX_PREVIEW, {fixApplied});
Ben Rohlfs4451cb22021-01-20 11:06:40 +0100120}
Dhruv Srivastava1cd2b892021-02-19 10:25:41 +0100121
Ben Rohlfs66367b62021-04-30 10:06:32 +0200122export function fireReload(target: EventTarget, clearPatchset?: boolean) {
123 fire(target, EventType.RELOAD, {clearPatchset: !!clearPatchset});
124}
125
Dhruv Srivastava1cd2b892021-02-19 10:25:41 +0100126export function waitForEventOnce<K extends keyof HTMLElementEventMap>(
127 el: EventTarget,
128 eventName: K
129): Promise<HTMLElementEventMap[K]> {
130 return new Promise<HTMLElementEventMap[K]>(resolve => {
131 const callback = (event: HTMLElementEventMap[K]) => {
132 resolve(event);
133 };
134 el.addEventListener(eventName, callback as EventListener, {once: true});
135 });
136}