// Copyright 2023 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
import {RmadErrorCode, StateResult} from './shimless_rma.mojom-webui.js';
export const DISABLE_NEXT_BUTTON = 'disable-next-button';
export type DisableNextButtonEvent = CustomEvent<boolean>;
export const DISABLE_ALL_BUTTONS = 'disable-all-buttons';
export type DisableAllButtonsEvent =
CustomEvent<{showBusyStateOverlay: boolean}>;
export const ENABLE_ALL_BUTTONS = 'enable-all-buttons';
export type EnableAllButtonsEvent = CustomEvent;
export const TRANSITION_STATE = 'transition-state';
export type TransitionStateEvent = CustomEvent<
() => Promise<{stateResult: StateResult, error?: RmadErrorCode}>>;
export const CLICK_NEXT_BUTTON = 'click-next-button';
export type ClickNextButtonEvent = CustomEvent;
export const CLICK_EXIT_BUTTON = 'click-exit-button';
export type ClickExitButtonEvent = CustomEvent;
export const SET_NEXT_BUTTON_LABEL = 'set-next-button-label';
export type SetNextButtonLabelEvent = CustomEvent<string>;
export const CLICK_REPAIR_COMPONENT_BUTTON = 'click-repair-component-button';
export type ClickRepairComponentButtonEvent = CustomEvent<number>;
export type OnSelectedChangedEvent = CustomEvent<{value: string}>;
export const CLICK_CALIBRATION_COMPONENT_BUTTON =
'click-calibration-component-button';
export type ClickCalibrationComponentEvent = CustomEvent<number>;
export const FATAL_HARDWARE_ERROR = 'fatal-hardware-error';
export type FatalHardwareEvent = CustomEvent<{
rmadErrorCode: RmadErrorCode,
fatalErrorCode: number,
}>;
export const OPEN_LOGS_DIALOG = 'open-logs-dialog';
export type OpenLogsDialogEvent = CustomEvent;
type ExtractDetail<T> = T extends CustomEvent<infer U>? U : never;
/**
* Constructs a CustomEvent with the given event type and details.
* The event will bubble up through elements and components.
*/
export function createCustomEvent<T extends keyof HTMLElementEventMap>(
type: T,
detail: ExtractDetail<HTMLElementEventMap[T]>): CustomEvent<typeof detail> {
return new CustomEvent(type, {bubbles: true, composed: true, detail});
}