59 lines
1.2 KiB
TypeScript
59 lines
1.2 KiB
TypeScript
import type { KeyboardEvent, MouseEvent, TouchEvent } from 'react';
|
|
|
|
import type { IconProp } from '../components/icon';
|
|
|
|
interface BaseMenuItem {
|
|
text: string;
|
|
description?: string;
|
|
icon?: IconProp;
|
|
highlighted?: boolean;
|
|
disabled?: boolean;
|
|
dangerous?: boolean;
|
|
}
|
|
|
|
export interface ActionMenuItem extends BaseMenuItem {
|
|
action: (event: MouseEvent | KeyboardEvent | TouchEvent) => void;
|
|
}
|
|
|
|
export interface LinkMenuItem extends BaseMenuItem {
|
|
to: string;
|
|
}
|
|
|
|
export interface ExternalLinkMenuItem extends BaseMenuItem {
|
|
href: string;
|
|
target?: string;
|
|
method?: 'post' | 'put' | 'delete';
|
|
}
|
|
|
|
export type MenuItem =
|
|
| ActionMenuItem
|
|
| LinkMenuItem
|
|
| ExternalLinkMenuItem
|
|
| null;
|
|
|
|
export const isMenuItem = (item: unknown): item is MenuItem => {
|
|
if (item === null) {
|
|
return true;
|
|
}
|
|
|
|
return typeof item === 'object' && 'text' in item;
|
|
};
|
|
|
|
export const isActionItem = (item: unknown): item is ActionMenuItem => {
|
|
if (!item || !isMenuItem(item)) {
|
|
return false;
|
|
}
|
|
|
|
return 'action' in item;
|
|
};
|
|
|
|
export const isExternalLinkItem = (
|
|
item: unknown,
|
|
): item is ExternalLinkMenuItem => {
|
|
if (!item || !isMenuItem(item)) {
|
|
return false;
|
|
}
|
|
|
|
return 'href' in item;
|
|
};
|