summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorsyuilo <4439005+syuilo@users.noreply.github.com>2025-07-06 19:32:33 +0900
committersyuilo <4439005+syuilo@users.noreply.github.com>2025-07-06 19:32:33 +0900
commitc2a01551a7636730ab2b184191f6b1b509bb3bf3 (patch)
treed50d800ca1dcadf26855555caa5350e7812923ed
parentchore(frontend): tweak selector to improve rendering performance (diff)
parentrefactor(frontend): menuの型定義の可読性向上 (#16261) (diff)
downloadmisskey-c2a01551a7636730ab2b184191f6b1b509bb3bf3.tar.gz
misskey-c2a01551a7636730ab2b184191f6b1b509bb3bf3.tar.bz2
misskey-c2a01551a7636730ab2b184191f6b1b509bb3bf3.zip
Merge branch 'develop' of https://github.com/misskey-dev/misskey into develop
-rw-r--r--packages/frontend/src/types/menu.ts117
1 files changed, 101 insertions, 16 deletions
diff --git a/packages/frontend/src/types/menu.ts b/packages/frontend/src/types/menu.ts
index fae7370341..6f2f08cb6d 100644
--- a/packages/frontend/src/types/menu.ts
+++ b/packages/frontend/src/types/menu.ts
@@ -4,10 +4,10 @@
*/
import * as Misskey from 'misskey-js';
-import type { Component, ComputedRef, Ref } from 'vue';
+import type { Component, ComputedRef, Ref, MaybeRef } from 'vue';
import type { ComponentProps as CP } from 'vue-component-type-helpers';
-type ComponentProps<T extends Component> = { [K in keyof CP<T>]: CP<T>[K] | Ref<CP<T>[K]> };
+type ComponentProps<T extends Component> = { [K in keyof CP<T>]: MaybeRef<CP<T>[K]> };
type MenuRadioOptionsDef = Record<string, any>;
@@ -15,22 +15,107 @@ type Text = string | ComputedRef<string>;
export type MenuAction = (ev: MouseEvent) => void;
-export type MenuDivider = { type: 'divider' };
-export type MenuNull = undefined;
-export type MenuLabel = { type: 'label', text: Text, caption?: Text };
-export type MenuLink = { type: 'link', to: string, text: Text, caption?: Text, icon?: string, indicate?: boolean, avatar?: Misskey.entities.User };
-export type MenuA = { type: 'a', href: string, target?: string, download?: string, text: Text, caption?: Text, icon?: string, indicate?: boolean };
-export type MenuUser = { type: 'user', user: Misskey.entities.User, active?: boolean, indicate?: boolean, action: MenuAction };
-export type MenuSwitch = { type: 'switch', ref: Ref<boolean>, text: Text, caption?: Text, icon?: string, disabled?: boolean | Ref<boolean> };
-export type MenuButton = { type?: 'button', text: Text, caption?: Text, icon?: string, indicate?: boolean, danger?: boolean, active?: boolean | ComputedRef<boolean>, avatar?: Misskey.entities.User; action: MenuAction };
-export type MenuRadio = { type: 'radio', text: Text, caption?: Text, icon?: string, ref: Ref<MenuRadioOptionsDef[keyof MenuRadioOptionsDef]>, options: MenuRadioOptionsDef, disabled?: boolean | Ref<boolean> };
-export type MenuRadioOption = { type: 'radioOption', text: Text, caption?: Text, action: MenuAction; active?: boolean | ComputedRef<boolean> };
-export type MenuComponent<T extends Component = any> = { type: 'component', component: T, props?: ComponentProps<T> };
-export type MenuParent = { type: 'parent', text: Text, caption?: Text, icon?: string, children: MenuItem[] | (() => Promise<MenuItem[]> | MenuItem[]) };
+export interface MenuButton {
+ type?: 'button';
+ text: Text;
+ caption?: Text;
+ icon?: string;
+ indicate?: boolean;
+ danger?: boolean;
+ active?: boolean | ComputedRef<boolean>;
+ avatar?: Misskey.entities.User;
+ action: MenuAction;
+}
-export type MenuPending = { type: 'pending' };
+interface MenuBase {
+ type: string;
+}
-type OuterMenuItem = MenuDivider | MenuNull | MenuLabel | MenuLink | MenuA | MenuUser | MenuSwitch | MenuButton | MenuRadio | MenuRadioOption | MenuComponent | MenuParent;
+export interface MenuDivider extends MenuBase {
+ type: 'divider';
+}
+
+export interface MenuLabel extends MenuBase {
+ type: 'label';
+ text: Text;
+ caption?: Text;
+}
+
+export interface MenuLink extends MenuBase {
+ type: 'link';
+ to: string;
+ text: Text;
+ caption?: Text;
+ icon?: string;
+ indicate?: boolean;
+ avatar?: Misskey.entities.User;
+}
+
+export interface MenuA extends MenuBase {
+ type: 'a';
+ href: string;
+ target?: string;
+ download?: string;
+ text: Text;
+ caption?: Text;
+ icon?: string;
+ indicate?: boolean;
+}
+
+export interface MenuUser extends MenuBase {
+ type: 'user';
+ user: Misskey.entities.User;
+ active?: boolean;
+ indicate?: boolean;
+ action: MenuAction;
+}
+
+export interface MenuSwitch extends MenuBase {
+ type: 'switch';
+ ref: Ref<boolean>;
+ text: Text;
+ caption?: Text;
+ icon?: string;
+ disabled?: boolean | Ref<boolean>;
+}
+
+export interface MenuRadio extends MenuBase {
+ type: 'radio';
+ text: Text;
+ caption?: Text;
+ icon?: string;
+ ref: Ref<MenuRadioOptionsDef[keyof MenuRadioOptionsDef]>;
+ options: MenuRadioOptionsDef;
+ disabled?: boolean | Ref<boolean>;
+}
+
+export interface MenuRadioOption extends MenuBase {
+ type: 'radioOption';
+ text: Text;
+ caption?: Text;
+ action: MenuAction;
+ active?: boolean | ComputedRef<boolean>;
+}
+
+export interface MenuComponent<T extends Component = any> extends MenuBase {
+ type: 'component';
+ component: T;
+ props?: ComponentProps<T>;
+}
+
+export interface MenuParent extends MenuBase {
+ type: 'parent';
+ text: Text;
+ caption?: Text;
+ icon?: string;
+ children: MenuItem[] | (() => Promise<MenuItem[]> | MenuItem[]);
+}
+
+export interface MenuPending extends MenuBase {
+ type: 'pending';
+}
+
+type OuterMenuItem = MenuDivider | MenuLabel | MenuLink | MenuA | MenuUser | MenuSwitch | MenuButton | MenuRadio | MenuRadioOption | MenuComponent | MenuParent;
type OuterPromiseMenuItem = Promise<MenuLabel | MenuLink | MenuA | MenuUser | MenuSwitch | MenuButton | MenuComponent | MenuParent>;
export type MenuItem = OuterMenuItem | OuterPromiseMenuItem;
export type InnerMenuItem = MenuDivider | MenuPending | MenuLabel | MenuLink | MenuA | MenuUser | MenuSwitch | MenuButton | MenuRadio | MenuRadioOption | MenuComponent | MenuParent;