diff --git a/packages/frontend/src/os.ts b/packages/frontend/src/os.ts index 15d725defb..e0d1beffd8 100644 --- a/packages/frontend/src/os.ts +++ b/packages/frontend/src/os.ts @@ -26,12 +26,12 @@ export const apiWithDialog = (( return promise; }) as typeof api; -export function promiseDialog>( +export const promiseDialog = >( promise: T, onSuccess?: ((res: any) => void) | null, onFailure?: ((err: Error) => void) | null, text?: string, -): T { +): T => { const showing = ref(true); const success = ref(false); @@ -80,12 +80,13 @@ const zIndexes = { middle: 2000000, high: 3000000, }; -export function claimZIndex(priority: keyof typeof zIndexes = 'low'): number { + +export const claimZIndex = (priority: keyof typeof zIndexes = 'low'): number => { zIndexes[priority] += 100; return zIndexes[priority]; } -export async function popup(component: Component, props: Record, events = {}, disposeEvent?: string) { +export const popup = async (component: Component, props: Record, events = {}, disposeEvent?: string) => { markRaw(component); const id = ++popupIdCount; @@ -112,29 +113,29 @@ export async function popup(component: Component, props: Record, ev }; } -export function pageWindow(path: string) { +export const pageWindow = (path: string) => { popup(defineAsyncComponent(() => import('@/components/MkPageWindow.vue')), { initialPath: path, }, {}, 'closed'); } -export function modalPageWindow(path: string) { +export const modalPageWindow = (path: string) => { popup(defineAsyncComponent(() => import('@/components/MkModalPageWindow.vue')), { initialPath: path, }, {}, 'closed'); } -export function toast(message: string) { +export const toast = (message: string) => { popup(defineAsyncComponent(() => import('@/components/MkToast.vue')), { message, }, {}, 'closed'); } -export function alert(props: { +export const alert = (props: { type?: 'error' | 'info' | 'success' | 'warning' | 'waiting' | 'question'; title?: string | null; text?: string | null; -}): Promise { +}): Promise => { return new Promise((resolve, reject) => { popup(defineAsyncComponent(() => import('@/components/MkDialog.vue')), props, { done: result => { @@ -144,11 +145,11 @@ export function alert(props: { }); } -export function confirm(props: { +export const confirm = (props: { type: 'error' | 'info' | 'success' | 'warning' | 'waiting' | 'question'; title?: string | null; text?: string | null; -}): Promise<{ canceled: boolean }> { +}): Promise<{ canceled: boolean }> => { return new Promise((resolve, reject) => { popup(defineAsyncComponent(() => import('@/components/MkDialog.vue')), { ...props, @@ -161,7 +162,7 @@ export function confirm(props: { }); } -export function inputText(props: { +export const inputText = (props: { type?: 'text' | 'email' | 'password' | 'url'; title?: string | null; text?: string | null; @@ -169,7 +170,7 @@ export function inputText(props: { default?: string | null; }): Promise<{ canceled: true; result: undefined; } | { canceled: false; result: string; -}> { +}> => { return new Promise((resolve, reject) => { popup(defineAsyncComponent(() => import('@/components/MkDialog.vue')), { title: props.title, @@ -187,14 +188,14 @@ export function inputText(props: { }); } -export function inputNumber(props: { +export const inputNumber = (props: { title?: string | null; text?: string | null; placeholder?: string | null; default?: number | null; }): Promise<{ canceled: true; result: undefined; } | { canceled: false; result: number; -}> { +}> => { return new Promise((resolve, reject) => { popup(defineAsyncComponent(() => import('@/components/MkDialog.vue')), { title: props.title, @@ -212,14 +213,14 @@ export function inputNumber(props: { }); } -export function inputDate(props: { +export const inputDate = (props: { title?: string | null; text?: string | null; placeholder?: string | null; default?: Date | null; }): Promise<{ canceled: true; result: undefined; } | { canceled: false; result: Date; -}> { +}> => { return new Promise((resolve, reject) => { popup(defineAsyncComponent(() => import('@/components/MkDialog.vue')), { title: props.title, @@ -237,7 +238,7 @@ export function inputDate(props: { }); } -export function select(props: { +export const select = (props: { title?: string | null; text?: string | null; default?: string | null; @@ -256,7 +257,7 @@ export function select(props: { }[]; })): Promise<{ canceled: true; result: undefined; } | { canceled: false; result: C; -}> { +}> => { return new Promise((resolve, reject) => { popup(defineAsyncComponent(() => import('@/components/MkDialog.vue')), { title: props.title, @@ -274,7 +275,7 @@ export function select(props: { }); } -export function success() { +export const success = () => { return new Promise((resolve, reject) => { const showing = ref(true); window.setTimeout(() => { @@ -289,7 +290,7 @@ export function success() { }); } -export function waiting() { +export const waiting = () => { return new Promise((resolve, reject) => { const showing = ref(true); popup(defineAsyncComponent(() => import('@/components/MkWaitingDialog.vue')), { @@ -301,7 +302,7 @@ export function waiting() { }); } -export function form(title, form) { +export const form = (title, form) => { return new Promise((resolve, reject) => { popup(defineAsyncComponent(() => import('@/components/MkFormDialog.vue')), { title, form }, { done: result => { @@ -311,7 +312,7 @@ export function form(title, form) { }); } -export async function selectUser() { +export const selectUser = () => { return new Promise((resolve, reject) => { popup(defineAsyncComponent(() => import('@/components/MkUserSelectDialog.vue')), {}, { ok: user => { @@ -321,7 +322,7 @@ export async function selectUser() { }); } -export async function selectDriveFile(multiple: boolean) { +export const selectDriveFile = (multiple: boolean) => { return new Promise((resolve, reject) => { popup(defineAsyncComponent(() => import('@/components/MkDriveSelectDialog.vue')), { type: 'file', @@ -336,7 +337,7 @@ export async function selectDriveFile(multiple: boolean) { }); } -export async function selectDriveFolder(multiple: boolean) { +export const selectDriveFolder = (multiple: boolean) => { return new Promise((resolve, reject) => { popup(defineAsyncComponent(() => import('@/components/MkDriveSelectDialog.vue')), { type: 'folder', @@ -351,7 +352,7 @@ export async function selectDriveFolder(multiple: boolean) { }); } -export async function pickEmoji(src: HTMLElement | null, opts) { +export const pickEmoji = (src: HTMLElement | null, opts) => { return new Promise((resolve, reject) => { popup(defineAsyncComponent(() => import('@/components/MkEmojiPickerDialog.vue')), { src, @@ -364,9 +365,9 @@ export async function pickEmoji(src: HTMLElement | null, opts) { }); } -export async function cropImage(image: Misskey.entities.DriveFile, options: { +export const cropImage = (image: Misskey.entities.DriveFile, options: { aspectRatio: number; -}): Promise { +}): Promise => { return new Promise((resolve, reject) => { popup(defineAsyncComponent(() => import('@/components/MkCropperDialog.vue')), { file: image, @@ -385,7 +386,7 @@ type AwaitType = T; let openingEmojiPicker: AwaitType> | null = null; let activeTextarea: HTMLTextAreaElement | HTMLInputElement | null = null; -export async function openEmojiPicker(src?: HTMLElement, opts, initialTextarea: typeof activeTextarea) { +export const openEmojiPicker = async (src?: HTMLElement, opts, initialTextarea: typeof activeTextarea) => { if (openingEmojiPicker) return; activeTextarea = initialTextarea; @@ -433,12 +434,12 @@ export async function openEmojiPicker(src?: HTMLElement, opts, initialTextarea: }); } -export function popupMenu(items: MenuItem[] | Ref, src?: HTMLElement, options?: { +export const popupMenu = (items: MenuItem[] | Ref, src?: HTMLElement, options?: { align?: string; width?: number; viaKeyboard?: boolean; onClosing?: () => void; -}) { +}) => { return new Promise((resolve, reject) => { let dispose; popup(defineAsyncComponent(() => import('@/components/MkPopupMenu.vue')), { @@ -461,7 +462,7 @@ export function popupMenu(items: MenuItem[] | Ref, src?: HTMLElement }); } -export function contextMenu(items: MenuItem[] | Ref, ev: MouseEvent) { +export const contextMenu = (items: MenuItem[] | Ref, ev: MouseEvent) => { ev.preventDefault(); return new Promise((resolve, reject) => { let dispose; @@ -479,7 +480,7 @@ export function contextMenu(items: MenuItem[] | Ref, ev: MouseEvent) }); } -export function post(props: Record = {}) { +export const post = (props: Record = {}) => { return new Promise((resolve, reject) => { // NOTE: MkPostFormDialogをdynamic importするとiOSでテキストエリアに自動フォーカスできない // NOTE: ただ、dynamic importしない場合、MkPostFormDialogインスタンスが使いまわされ、 @@ -501,7 +502,7 @@ export function post(props: Record = {}) { export const deckGlobalEvents = new EventEmitter(); /* -export function checkExistence(fileData: ArrayBuffer): Promise { +export const checkExistence = (fileData: ArrayBuffer): Promise => { return new Promise((resolve, reject) => { const data = new FormData(); data.append('md5', getMD5(fileData));