mirror of
https://github.com/mastodon/mastodon.git
synced 2025-12-06 06:14:16 +00:00
Some checks are pending
Check i18n / check-i18n (push) Waiting to run
Chromatic / Run Chromatic (push) Waiting to run
CodeQL / Analyze (javascript) (push) Waiting to run
CodeQL / Analyze (ruby) (push) Waiting to run
Check formatting / lint (push) Waiting to run
CSS Linting / lint (push) Waiting to run
JavaScript Linting / lint (push) Waiting to run
JavaScript Testing / test (push) Waiting to run
Ruby Testing / build (production) (push) Waiting to run
Ruby Testing / build (test) (push) Waiting to run
Ruby Testing / test (.ruby-version) (push) Blocked by required conditions
Ruby Testing / test (3.2) (push) Blocked by required conditions
Ruby Testing / test (3.3) (push) Blocked by required conditions
Ruby Testing / ImageMagick tests (.ruby-version) (push) Blocked by required conditions
Ruby Testing / ImageMagick tests (3.2) (push) Blocked by required conditions
Ruby Testing / ImageMagick tests (3.3) (push) Blocked by required conditions
Ruby Testing / End to End testing (.ruby-version) (push) Blocked by required conditions
Ruby Testing / End to End testing (3.2) (push) Blocked by required conditions
Ruby Testing / End to End testing (3.3) (push) Blocked by required conditions
Ruby Testing / Elastic Search integration testing (.ruby-version, docker.elastic.co/elasticsearch/elasticsearch:7.17.13) (push) Blocked by required conditions
Ruby Testing / Elastic Search integration testing (.ruby-version, docker.elastic.co/elasticsearch/elasticsearch:8.10.2) (push) Blocked by required conditions
Ruby Testing / Elastic Search integration testing (.ruby-version, opensearchproject/opensearch:2) (push) Blocked by required conditions
Ruby Testing / Elastic Search integration testing (3.2, docker.elastic.co/elasticsearch/elasticsearch:7.17.13) (push) Blocked by required conditions
Ruby Testing / Elastic Search integration testing (3.3, docker.elastic.co/elasticsearch/elasticsearch:7.17.13) (push) Blocked by required conditions
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;
|
|
};
|