(false);
-function addReaction(emoji) {
+function addReaction(emoji: string) {
onceReacted.value = true;
emit('reacted');
doNotification(emoji);
@@ -96,7 +96,7 @@ function doNotification(emoji: string): void {
globalEvents.emit('clientNotification', notification);
}
-function removeReaction(emoji) {
+function removeReaction(emoji: string) {
delete exampleNote.reactions[emoji];
exampleNote.myReaction = undefined;
}
diff --git a/packages/frontend/src/components/MkUploaderDialog.vue b/packages/frontend/src/components/MkUploaderDialog.vue
index 8849fa447d..69de56d45c 100644
--- a/packages/frontend/src/components/MkUploaderDialog.vue
+++ b/packages/frontend/src/components/MkUploaderDialog.vue
@@ -166,17 +166,17 @@ async function done() {
dialog.value?.close();
}
-async function chooseFile(ev: MouseEvent) {
+async function chooseFile(ev: PointerEvent) {
const newFiles = await os.chooseFileFromPc({ multiple: true });
uploader.addFiles(newFiles);
}
-function showPerItemMenu(item: UploaderItem, ev: MouseEvent) {
+function showPerItemMenu(item: UploaderItem, ev: PointerEvent) {
const menu = uploader.getMenu(item);
os.popupMenu(menu, ev.currentTarget ?? ev.target);
}
-function showPerItemMenuViaContextmenu(item: UploaderItem, ev: MouseEvent) {
+function showPerItemMenuViaContextmenu(item: UploaderItem, ev: PointerEvent) {
const menu = uploader.getMenu(item);
os.contextMenu(menu, ev);
}
diff --git a/packages/frontend/src/components/MkUploaderItems.vue b/packages/frontend/src/components/MkUploaderItems.vue
index f31c717ad5..51f7ac2d09 100644
--- a/packages/frontend/src/components/MkUploaderItems.vue
+++ b/packages/frontend/src/components/MkUploaderItems.vue
@@ -57,18 +57,18 @@ const props = defineProps<{
}>();
const emit = defineEmits<{
- (ev: 'showMenu', item: UploaderItem, event: MouseEvent): void;
- (ev: 'showMenuViaContextmenu', item: UploaderItem, event: MouseEvent): void;
+ (ev: 'showMenu', item: UploaderItem, event: PointerEvent): void;
+ (ev: 'showMenuViaContextmenu', item: UploaderItem, event: PointerEvent): void;
}>();
-function onContextmenu(item: UploaderItem, ev: MouseEvent) {
+function onContextmenu(item: UploaderItem, ev: PointerEvent) {
if (ev.target && isLink(ev.target as HTMLElement)) return;
if (window.getSelection()?.toString() !== '') return;
emit('showMenuViaContextmenu', item, ev);
}
-function onThumbnailClick(item: UploaderItem, ev: MouseEvent) {
+function onThumbnailClick(item: UploaderItem, ev: PointerEvent) {
// TODO: preview when item is image
}
diff --git a/packages/frontend/src/components/MkUserList.vue b/packages/frontend/src/components/MkUserList.vue
index f47d9b56dc..8ce929fff3 100644
--- a/packages/frontend/src/components/MkUserList.vue
+++ b/packages/frontend/src/components/MkUserList.vue
@@ -27,7 +27,7 @@ const props = withDefaults(defineProps<{
noGap?: boolean;
extractor?: ExtractorFunction;
}>(), {
- extractor: (item) => item,
+ extractor: (item: any) => item as Misskey.entities.UserDetailed,
});
diff --git a/packages/frontend/src/components/MkUserPopup.vue b/packages/frontend/src/components/MkUserPopup.vue
index f794899281..9f196ac2c1 100644
--- a/packages/frontend/src/components/MkUserPopup.vue
+++ b/packages/frontend/src/components/MkUserPopup.vue
@@ -90,7 +90,7 @@ const top = ref(0);
const left = ref(0);
const error = ref(false);
-function showMenu(ev: MouseEvent) {
+function showMenu(ev: PointerEvent) {
if (user.value == null) return;
const { menu, cleanup } = getUserMenu(user.value);
os.popupMenu(menu, ev.currentTarget ?? ev.target).finally(cleanup);
diff --git a/packages/frontend/src/components/MkUserSetupDialog.Profile.vue b/packages/frontend/src/components/MkUserSetupDialog.Profile.vue
index 4e96eff82e..95449dd0eb 100644
--- a/packages/frontend/src/components/MkUserSetupDialog.Profile.vue
+++ b/packages/frontend/src/components/MkUserSetupDialog.Profile.vue
@@ -66,7 +66,7 @@ watch(description, () => {
});
});
-async function setAvatar(ev) {
+async function setAvatar(ev: PointerEvent) {
const files = await os.chooseFileFromPc({ multiple: false });
const file = files[0];
diff --git a/packages/frontend/src/components/MkVisitorDashboard.ActiveUsersChart.vue b/packages/frontend/src/components/MkVisitorDashboard.ActiveUsersChart.vue
index 6aaee76565..6513ca385d 100644
--- a/packages/frontend/src/components/MkVisitorDashboard.ActiveUsersChart.vue
+++ b/packages/frontend/src/components/MkVisitorDashboard.ActiveUsersChart.vue
@@ -46,7 +46,7 @@ async function renderChart() {
return new Date(y, m, d - ago);
};
- const format = (arr) => {
+ const format = (arr: number[]) => {
return arr.map((v, i) => ({
x: getDate(i).getTime(),
y: v,
diff --git a/packages/frontend/src/components/MkVisitorDashboard.vue b/packages/frontend/src/components/MkVisitorDashboard.vue
index 8bef225de5..2ce1912b86 100644
--- a/packages/frontend/src/components/MkVisitorDashboard.vue
+++ b/packages/frontend/src/components/MkVisitorDashboard.vue
@@ -94,7 +94,7 @@ function signup() {
});
}
-function showMenu(ev: MouseEvent) {
+function showMenu(ev: PointerEvent) {
openInstanceMenu(ev);
}
diff --git a/packages/frontend/src/components/MkWaitingDialog.vue b/packages/frontend/src/components/MkWaitingDialog.vue
index 820cf05e1f..18f2b3e189 100644
--- a/packages/frontend/src/components/MkWaitingDialog.vue
+++ b/packages/frontend/src/components/MkWaitingDialog.vue
@@ -26,8 +26,8 @@ const props = defineProps<{
}>();
const emit = defineEmits<{
- (ev: 'done');
- (ev: 'closed');
+ (ev: 'done'): void;
+ (ev: 'closed'): void;
}>();
function done() {
diff --git a/packages/frontend/src/components/MkWatermarkEditorDialog.Layer.vue b/packages/frontend/src/components/MkWatermarkEditorDialog.Layer.vue
index 154b3ffc27..8e5bb6221d 100644
--- a/packages/frontend/src/components/MkWatermarkEditorDialog.Layer.vue
+++ b/packages/frontend/src/components/MkWatermarkEditorDialog.Layer.vue
@@ -387,7 +387,7 @@ onMounted(async () => {
}
});
-function chooseFile(ev: MouseEvent) {
+function chooseFile(ev: PointerEvent) {
selectFile({
anchorElement: ev.currentTarget ?? ev.target,
multiple: false,
diff --git a/packages/frontend/src/components/MkWatermarkEditorDialog.vue b/packages/frontend/src/components/MkWatermarkEditorDialog.vue
index 7fe497e455..cadf9ba522 100644
--- a/packages/frontend/src/components/MkWatermarkEditorDialog.vue
+++ b/packages/frontend/src/components/MkWatermarkEditorDialog.vue
@@ -350,7 +350,7 @@ async function save() {
}
}
-function addLayer(ev: MouseEvent) {
+function addLayer(ev: PointerEvent) {
os.popupMenu([{
text: i18n.ts._watermarkEditor.text,
action: () => {
diff --git a/packages/frontend/src/components/MkWidgetSettingsDialog.vue b/packages/frontend/src/components/MkWidgetSettingsDialog.vue
index 951ac88465..63f294770c 100644
--- a/packages/frontend/src/components/MkWidgetSettingsDialog.vue
+++ b/packages/frontend/src/components/MkWidgetSettingsDialog.vue
@@ -14,7 +14,7 @@ SPDX-License-Identifier: AGPL-3.0-only
@ok="save()"
@closed="emit('closed')"
>
- {{ i18n.ts._widgets[widgetName] ?? widgetName }}
+ {{ (i18n.ts._widgets as any)[widgetName] ?? widgetName }}
diff --git a/packages/frontend/src/components/MkWidgets.vue b/packages/frontend/src/components/MkWidgets.vue
index e7712e8aae..a27613c24c 100644
--- a/packages/frontend/src/components/MkWidgets.vue
+++ b/packages/frontend/src/components/MkWidgets.vue
@@ -24,12 +24,12 @@ SPDX-License-Identifier: AGPL-3.0-only
-
+
-
+
@@ -47,6 +47,7 @@ export type DefaultStoredWidget = {
diff --git a/packages/frontend/src/components/global/MkA.vue b/packages/frontend/src/components/global/MkA.vue
index 99693a4c00..7d2908d4be 100644
--- a/packages/frontend/src/components/global/MkA.vue
+++ b/packages/frontend/src/components/global/MkA.vue
@@ -48,7 +48,7 @@ const active = computed(() => {
return resolved.route.name === router.currentRoute.value.name;
});
-function onContextmenu(ev) {
+function onContextmenu(ev: PointerEvent) {
const selection = window.getSelection();
if (selection && selection.toString() !== '') return;
os.contextMenu([{
@@ -85,7 +85,7 @@ function openWindow() {
os.pageWindow(props.to);
}
-function nav(ev: MouseEvent) {
+function nav(ev: PointerEvent) {
// 制御キーとの組み合わせは無視(shiftを除く)
if (ev.metaKey || ev.altKey || ev.ctrlKey) return;
diff --git a/packages/frontend/src/components/global/MkAvatar.vue b/packages/frontend/src/components/global/MkAvatar.vue
index e7208ed574..fd1d0c2b63 100644
--- a/packages/frontend/src/components/global/MkAvatar.vue
+++ b/packages/frontend/src/components/global/MkAvatar.vue
@@ -77,7 +77,7 @@ const props = withDefaults(defineProps<{
});
const emit = defineEmits<{
- (ev: 'click', v: MouseEvent): void;
+ (ev: 'click', v: PointerEvent): void;
}>();
const showDecoration = props.forceShowDecoration || prefer.s.showAvatarDecorations;
@@ -91,7 +91,7 @@ const url = computed(() => {
return props.user.avatarUrl;
});
-function onClick(ev: MouseEvent): void {
+function onClick(ev: PointerEvent): void {
if (props.link) return;
emit('click', ev);
}
diff --git a/packages/frontend/src/components/global/MkCondensedLine.vue b/packages/frontend/src/components/global/MkCondensedLine.vue
index 473d444c16..e1fbec4b6f 100644
--- a/packages/frontend/src/components/global/MkCondensedLine.vue
+++ b/packages/frontend/src/components/global/MkCondensedLine.vue
@@ -23,8 +23,8 @@ const observer = new ResizeObserver((entries) => {
transform: string;
}[] = [];
for (const entry of entries) {
- const content = (entry.target[contentSymbol] ? entry.target : entry.target.firstElementChild) as HTMLSpanElement;
- const props: Required = content[contentSymbol];
+ const content = ((entry.target as any)[contentSymbol] ? entry.target : entry.target.firstElementChild) as HTMLSpanElement;
+ const props: Required = (content as any)[contentSymbol];
const container = content.parentElement as HTMLSpanElement;
const contentWidth = content.getBoundingClientRect().width;
const containerWidth = container.getBoundingClientRect().width;
@@ -46,15 +46,15 @@ const props = withDefaults(defineProps(), {
const content = ref();
watch(content, (value, oldValue) => {
- if (oldValue) {
- delete oldValue[contentSymbol];
+ if (oldValue != null) {
+ delete (oldValue as any)[contentSymbol];
observer.unobserve(oldValue);
if (oldValue.parentElement) {
observer.unobserve(oldValue.parentElement);
}
}
- if (value) {
- value[contentSymbol] = props;
+ if (value != null) {
+ (value as any)[contentSymbol] = props;
observer.observe(value);
if (value.parentElement) {
observer.observe(value.parentElement);
diff --git a/packages/frontend/src/components/global/MkCustomEmoji.vue b/packages/frontend/src/components/global/MkCustomEmoji.vue
index 31c358eee7..9a171876a0 100644
--- a/packages/frontend/src/components/global/MkCustomEmoji.vue
+++ b/packages/frontend/src/components/global/MkCustomEmoji.vue
@@ -102,7 +102,7 @@ const url = computed(() => {
const alt = computed(() => `:${customEmojiName.value}:`);
const errored = ref(url.value == null);
-function onClick(ev: MouseEvent) {
+function onClick(ev: PointerEvent) {
if (props.menu) {
const menuItems: MenuItem[] = [];
diff --git a/packages/frontend/src/components/global/MkEmoji.vue b/packages/frontend/src/components/global/MkEmoji.vue
index 792f9c7d6f..686720cec2 100644
--- a/packages/frontend/src/components/global/MkEmoji.vue
+++ b/packages/frontend/src/components/global/MkEmoji.vue
@@ -67,7 +67,7 @@ function unmute() {
});
}
-function onClick(ev: MouseEvent) {
+function onClick(ev: PointerEvent) {
if (props.menu) {
const menuItems: MenuItem[] = [];
diff --git a/packages/frontend/src/components/global/MkMfm.ts b/packages/frontend/src/components/global/MkMfm.ts
index 3ad2fda0ee..d270571d4a 100644
--- a/packages/frontend/src/components/global/MkMfm.ts
+++ b/packages/frontend/src/components/global/MkMfm.ts
@@ -319,7 +319,7 @@ export default function (props: MfmProps, { emit }: { emit: SetupContext
export type Tab = {
key: string;
- onClick?: (ev: MouseEvent) => void;
+ onClick?: (ev: PointerEvent) => void;
iconOnly?: boolean;
title: string;
icon?: string;
@@ -70,8 +70,8 @@ const props = withDefaults(defineProps<{
});
const emit = defineEmits<{
- (ev: 'update:tab', key: string);
- (ev: 'tabClick', key: string);
+ (ev: 'update:tab', key: string): void;
+ (ev: 'tabClick', key: string): void;
}>();
const el = useTemplateRef('el');
@@ -96,7 +96,7 @@ function onTabMousedown(tab: Tab, ev: MouseEvent): void {
}
}
-function onTabClick(t: Tab, ev: MouseEvent): void {
+function onTabClick(t: Tab, ev: PointerEvent): void {
emit('tabClick', t.key);
if (t.onClick) {
diff --git a/packages/frontend/src/components/global/MkPageHeader.vue b/packages/frontend/src/components/global/MkPageHeader.vue
index 2445f8e0ef..e8c93b7092 100644
--- a/packages/frontend/src/components/global/MkPageHeader.vue
+++ b/packages/frontend/src/components/global/MkPageHeader.vue
@@ -61,7 +61,6 @@ export type PageHeaderProps = {
import { onMounted, onUnmounted, ref, inject, useTemplateRef, computed } from 'vue';
import { scrollToTop } from '@@/js/scroll.js';
import XTabs from './MkPageHeader.tabs.vue';
-import { globalEvents } from '@/events.js';
import { getAccountMenu } from '@/accounts.js';
import { $i } from '@/i.js';
import { DI } from '@/di.js';
@@ -72,7 +71,7 @@ const props = withDefaults(defineProps(), {
});
const emit = defineEmits<{
- (ev: 'update:tab', key: string);
+ (ev: 'update:tab', key: string): void;
}>();
//const viewId = inject(DI.viewId);
@@ -100,7 +99,7 @@ const top = () => {
}
};
-async function openAccountMenu(ev: MouseEvent) {
+async function openAccountMenu(ev: PointerEvent) {
const menuItems = await getAccountMenu({
withExtraOperation: true,
});
diff --git a/packages/frontend/src/components/global/MkTip.vue b/packages/frontend/src/components/global/MkTip.vue
index 231957a232..1827c16c89 100644
--- a/packages/frontend/src/components/global/MkTip.vue
+++ b/packages/frontend/src/components/global/MkTip.vue
@@ -32,7 +32,7 @@ function _closeTip() {
closeTip(props.k);
}
-function showMenu(ev: MouseEvent) {
+function showMenu(ev: PointerEvent) {
os.popupMenu([{
icon: 'ti ti-bulb-off',
text: i18n.ts.hideAllTips,
diff --git a/packages/frontend/src/components/grid/MkDataCell.vue b/packages/frontend/src/components/grid/MkDataCell.vue
index 6f1dae8398..8745146ccf 100644
--- a/packages/frontend/src/components/grid/MkDataCell.vue
+++ b/packages/frontend/src/components/grid/MkDataCell.vue
@@ -188,7 +188,7 @@ function onCellKeyDown(ev: KeyboardEvent) {
}
}
-function onInputText(ev: Event) {
+function onInputText(ev: InputEvent) {
editingValue.value = (ev.target as HTMLInputElement).value;
}
diff --git a/packages/frontend/src/components/grid/MkGrid.vue b/packages/frontend/src/components/grid/MkGrid.vue
index 96d9e35773..097a91bad5 100644
--- a/packages/frontend/src/components/grid/MkGrid.vue
+++ b/packages/frontend/src/components/grid/MkGrid.vue
@@ -715,7 +715,7 @@ function onMouseUp(ev: MouseEvent) {
}
}
-function onContextMenu(ev: MouseEvent) {
+function onContextMenu(ev: PointerEvent) {
const cellAddress = getCellAddress(ev.target as HTMLElement);
if (_DEV_) {
console.log(`[grid][context-menu] button: ${ev.button}, cell: ${cellAddress.row}x${cellAddress.col}`);
diff --git a/packages/frontend/src/composables/use-chart-tooltip.ts b/packages/frontend/src/composables/use-chart-tooltip.ts
index a42f70ba02..9816de7c14 100644
--- a/packages/frontend/src/composables/use-chart-tooltip.ts
+++ b/packages/frontend/src/composables/use-chart-tooltip.ts
@@ -4,6 +4,7 @@
*/
import { onUnmounted, onDeactivated, ref } from 'vue';
+import type { Chart, ChartType, TooltipModel } from 'chart.js';
import * as os from '@/os.js';
import MkChartTooltip from '@/components/MkChartTooltip.vue';
@@ -40,7 +41,7 @@ export function useChartTooltip(opts: { position: 'top' | 'middle' } = { positio
tooltipShowing.value = false;
});
- function handler(context) {
+ function handler(context: { chart: Chart; tooltip: TooltipModel }) {
if (context.tooltip.opacity === 0) {
tooltipShowing.value = false;
return;
@@ -48,8 +49,8 @@ export function useChartTooltip(opts: { position: 'top' | 'middle' } = { positio
tooltipTitle.value = context.tooltip.title[0];
tooltipSeries.value = context.tooltip.body.map((b, i) => ({
- backgroundColor: context.tooltip.labelColors[i].backgroundColor,
- borderColor: context.tooltip.labelColors[i].borderColor,
+ backgroundColor: context.tooltip.labelColors[i].backgroundColor as string,
+ borderColor: context.tooltip.labelColors[i].borderColor as string,
text: b.lines[0],
}));
diff --git a/packages/frontend/src/composables/use-form.ts b/packages/frontend/src/composables/use-form.ts
index 38e9b40e20..812b66d1f0 100644
--- a/packages/frontend/src/composables/use-form.ts
+++ b/packages/frontend/src/composables/use-form.ts
@@ -31,7 +31,7 @@ export function useForm>(initialState: T, save: (n
watch([currentState, previousState], () => {
for (const key in modifiedStates) {
- modifiedStates[key] = !deepEqual(currentState[key], previousState[key]);
+ (modifiedStates as any)[key] = !deepEqual(currentState[key], previousState[key]);
}
}, { deep: true });
diff --git a/packages/frontend/src/composables/use-note-capture.ts b/packages/frontend/src/composables/use-note-capture.ts
index 2aeb9074e5..25a9383cd5 100644
--- a/packages/frontend/src/composables/use-note-capture.ts
+++ b/packages/frontend/src/composables/use-note-capture.ts
@@ -7,6 +7,7 @@ import { onUnmounted, reactive } from 'vue';
import * as Misskey from 'misskey-js';
import { EventEmitter } from 'eventemitter3';
import type { Reactive } from 'vue';
+import type { NoteUpdatedEvent } from 'misskey-js/streaming.types.js';
import { useStream } from '@/stream.js';
import { $i } from '@/i.js';
import { store } from '@/store.js';
@@ -15,9 +16,9 @@ import { prefer } from '@/preferences.js';
import { globalEvents } from '@/events.js';
export const noteEvents = new EventEmitter<{
- [ev: `reacted:${string}`]: (ctx: { userId: Misskey.entities.User['id']; reaction: string; emoji?: { name: string; url: string; }; }) => void;
- [ev: `unreacted:${string}`]: (ctx: { userId: Misskey.entities.User['id']; reaction: string; emoji?: { name: string; url: string; }; }) => void;
- [ev: `pollVoted:${string}`]: (ctx: { userId: Misskey.entities.User['id']; choice: string; }) => void;
+ [ev: `reacted:${string}`]: (ctx: { userId: Misskey.entities.User['id']; reaction: string; emoji?: { name: string; url: string; } | null; }) => void;
+ [ev: `unreacted:${string}`]: (ctx: { userId: Misskey.entities.User['id']; reaction: string; emoji?: { name: string; url: string; } | null; }) => void;
+ [ev: `pollVoted:${string}`]: (ctx: { userId: Misskey.entities.User['id']; choice: number; }) => void;
}>();
const fetchEvent = new EventEmitter<{
@@ -117,7 +118,7 @@ function realtimeSubscribe(props: {
const note = props.note;
const connection = useStream();
- function onStreamNoteUpdated(noteData): void {
+ function onStreamNoteUpdated(noteData: NoteUpdatedEvent): void {
const { type, id, body } = noteData;
if (id !== note.id) return;
@@ -136,7 +137,6 @@ function realtimeSubscribe(props: {
noteEvents.emit(`unreacted:${id}`, {
userId: body.userId,
reaction: body.reaction,
- emoji: body.emoji,
});
break;
}
@@ -194,9 +194,9 @@ export function useNoteCapture(props: {
parentNote: Misskey.entities.Note | null;
mock?: boolean;
}): {
- $note: Reactive;
- subscribe: () => void;
- } {
+ $note: Reactive;
+ subscribe: () => void;
+} {
const { note, parentNote, mock } = props;
const $note = reactive({
@@ -224,7 +224,7 @@ export function useNoteCapture(props: {
const reactionUserMap = new Map();
let latestPollVotedKey: string | null = null;
- function onReacted(ctx: { userId: Misskey.entities.User['id']; reaction: string; emoji?: { name: string; url: string; }; }): void {
+ function onReacted(ctx: { userId: Misskey.entities.User['id']; reaction: string; emoji?: { name: string; url: string; } | null; }): void {
let normalizedName = ctx.reaction.replace(/^:(\w+):$/, ':$1@.:');
normalizedName = normalizedName.match('\u200d') ? normalizedName : normalizedName.replace(/\ufe0f/g, '');
if (reactionUserMap.has(ctx.userId) && reactionUserMap.get(ctx.userId) === normalizedName) return;
@@ -244,7 +244,7 @@ export function useNoteCapture(props: {
}
}
- function onUnreacted(ctx: { userId: Misskey.entities.User['id']; reaction: string; emoji?: { name: string; url: string; }; }): void {
+ function onUnreacted(ctx: { userId: Misskey.entities.User['id']; reaction: string; emoji?: { name: string; url: string; } | null; }): void {
let normalizedName = ctx.reaction.replace(/^:(\w+):$/, ':$1@.:');
normalizedName = normalizedName.match('\u200d') ? normalizedName : normalizedName.replace(/\ufe0f/g, '');
@@ -263,7 +263,7 @@ export function useNoteCapture(props: {
}
}
- function onPollVoted(ctx: { userId: Misskey.entities.User['id']; choice: string; }): void {
+ function onPollVoted(ctx: { userId: Misskey.entities.User['id']; choice: number; }): void {
const newPollVotedKey = `${ctx.userId}:${ctx.choice}`;
if (newPollVotedKey === latestPollVotedKey) return;
latestPollVotedKey = newPollVotedKey;
diff --git a/packages/frontend/src/composables/use-tooltip.ts b/packages/frontend/src/composables/use-tooltip.ts
index af76a3a1e8..e369928208 100644
--- a/packages/frontend/src/composables/use-tooltip.ts
+++ b/packages/frontend/src/composables/use-tooltip.ts
@@ -22,7 +22,7 @@ export function useTooltip(
let changeShowingState: (() => void) | null;
- let autoHidingTimer;
+ let autoHidingTimer: number | null = null;
const open = () => {
close();
@@ -43,7 +43,7 @@ export function useTooltip(
isHovering = false;
window.clearTimeout(timeoutId);
close();
- window.clearInterval(autoHidingTimer);
+ if (autoHidingTimer != null) window.clearInterval(autoHidingTimer);
}
}, 1000);
};
@@ -66,7 +66,7 @@ export function useTooltip(
if (!isHovering) return;
isHovering = false;
window.clearTimeout(timeoutId);
- window.clearInterval(autoHidingTimer);
+ if (autoHidingTimer != null) window.clearInterval(autoHidingTimer);
close();
};
@@ -81,7 +81,7 @@ export function useTooltip(
if (!isHovering) return;
isHovering = false;
window.clearTimeout(timeoutId);
- window.clearInterval(autoHidingTimer);
+ if (autoHidingTimer != null) window.clearInterval(autoHidingTimer);
close();
};
diff --git a/packages/frontend/src/composables/use-uploader.ts b/packages/frontend/src/composables/use-uploader.ts
index 8ffb1e656b..fabc04895e 100644
--- a/packages/frontend/src/composables/use-uploader.ts
+++ b/packages/frontend/src/composables/use-uploader.ts
@@ -664,7 +664,7 @@ export function useUploader(options: {
if (needsCompress) {
const config = {
- mimeType: isWebpSupported() ? 'image/webp' : 'image/jpeg',
+ mimeType: (isWebpSupported() ? 'image/webp' : 'image/jpeg') as 'image/webp' | 'image/jpeg',
maxWidth: compressionSettings.maxWidth,
maxHeight: compressionSettings.maxHeight,
quality: isWebpSupported() ? 0.85 : 0.8,
diff --git a/packages/frontend/src/custom-emojis.ts b/packages/frontend/src/custom-emojis.ts
index 45d4b40fd7..e04d540c38 100644
--- a/packages/frontend/src/custom-emojis.ts
+++ b/packages/frontend/src/custom-emojis.ts
@@ -60,11 +60,11 @@ export async function fetchCustomEmojis(force = false) {
set('lastEmojisFetchedAt', now);
}
-let cachedTags;
+let cachedTags: string[] | null = null;
export function getCustomEmojiTags() {
if (cachedTags) return cachedTags;
- const tags = new Set();
+ const tags = new Set();
for (const emoji of customEmojis.value) {
for (const tag of emoji.aliases) {
tags.add(tag);
diff --git a/packages/frontend/src/deck.ts b/packages/frontend/src/deck.ts
index 208adae8fe..e85ca76ca1 100644
--- a/packages/frontend/src/deck.ts
+++ b/packages/frontend/src/deck.ts
@@ -316,14 +316,14 @@ export function updateColumn(id: Column['id'], column: Partial) {
const currentColumn = deepClone(columns.value[columnIndex]);
if (currentColumn == null) return;
for (const [k, v] of Object.entries(column)) {
- currentColumn[k] = v;
+ (currentColumn[k as keyof typeof column] as any) = v;
}
newColumns[columnIndex] = currentColumn;
columns.value = newColumns;
saveCurrentDeckProfile();
}
-export function switchProfileMenu(ev: MouseEvent) {
+export function switchProfileMenu(ev: PointerEvent) {
const items: MenuItem[] = prefer.s['deck.profile'] ? [{
text: prefer.s['deck.profile'],
active: true,
diff --git a/packages/frontend/src/filters/bytes.ts b/packages/frontend/src/filters/bytes.ts
index 49b44167d4..a5b6fad3b1 100644
--- a/packages/frontend/src/filters/bytes.ts
+++ b/packages/frontend/src/filters/bytes.ts
@@ -3,7 +3,7 @@
* SPDX-License-Identifier: AGPL-3.0-only
*/
-export default (v, digits = 0) => {
+export default (v: number | null, digits = 0) => {
if (v == null) return '?';
const sizes = ['B', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB', 'RB', 'QB'];
if (v === 0) return '0';
diff --git a/packages/frontend/src/filters/kmg.ts b/packages/frontend/src/filters/kmg.ts
index 9608e420f6..0aaa70d50d 100644
--- a/packages/frontend/src/filters/kmg.ts
+++ b/packages/frontend/src/filters/kmg.ts
@@ -3,7 +3,7 @@
* SPDX-License-Identifier: AGPL-3.0-only
*/
-export default (v, fractionDigits = 0) => {
+export default (v: number | null, fractionDigits = 0) => {
if (v == null) return 'N/A';
if (v === 0) return '0';
const sizes = ['', 'K', 'M', 'G', 'T', 'P', 'E', 'Z', 'Y', 'R', 'Q'];
diff --git a/packages/frontend/src/filters/note.ts b/packages/frontend/src/filters/note.ts
index ce31021469..3fcd50c5e3 100644
--- a/packages/frontend/src/filters/note.ts
+++ b/packages/frontend/src/filters/note.ts
@@ -3,6 +3,6 @@
* SPDX-License-Identifier: AGPL-3.0-only
*/
-export const notePage = note => {
+export const notePage = (note: { id: string }) => {
return `/notes/${note.id}`;
};
diff --git a/packages/frontend/src/instance.ts b/packages/frontend/src/instance.ts
index c9d83a4dbe..547db12e34 100644
--- a/packages/frontend/src/instance.ts
+++ b/packages/frontend/src/instance.ts
@@ -43,7 +43,7 @@ export async function fetchInstance(force = false): Promise
? GetPathQuery
: Record
- : never
+ : never
: never
: never
: Def['path'] extends Path
@@ -133,9 +133,9 @@ type GetSinglePathQuery
? UnwrapReadOnly<{ [Key in keyof Query]?: string; }>
: Record
+ : Record
: Record
- : Record
- >;
+>;
type GetPathQuery> = GetSinglePathQuery;
@@ -320,11 +320,11 @@ export class Nirax extends EventEmitter {
if (route.query != null && queryString != null) {
const queryObject = [...new URLSearchParams(queryString).entries()]
- .reduce((obj, entry) => ({ ...obj, [entry[0]]: entry[1] }), {});
+ .reduce((obj, entry) => ({ ...obj, [entry[0]]: entry[1] }), {}) as Record;
for (const q in route.query) {
const as = route.query[q];
- if (queryObject[q]) {
+ if (queryObject[q] != null) {
props.set(as, safeURIDecode(queryObject[q]));
}
}
diff --git a/packages/frontend/src/navbar.ts b/packages/frontend/src/navbar.ts
index a162b3aa9e..c5b77c498a 100644
--- a/packages/frontend/src/navbar.ts
+++ b/packages/frontend/src/navbar.ts
@@ -6,6 +6,7 @@
import { computed, reactive } from 'vue';
import { ui } from '@@/js/config.js';
import { clearCache } from './utility/clear-cache.js';
+import type { ComputedRef } from 'vue';
import { $i } from '@/i.js';
import { miLocalStorage } from '@/local-storage.js';
import { openInstanceMenu, openToolsMenu } from '@/ui/_common_/common.js';
@@ -14,7 +15,17 @@ import * as os from '@/os.js';
import { i18n } from '@/i18n.js';
import { unisonReload } from '@/utility/unison-reload.js';
-export const navbarItemDef = reactive({
+export const navbarItemDef = reactive<{
+ [key: string]: {
+ title: string;
+ icon: string;
+ show?: ComputedRef;
+ indicated?: ComputedRef;
+ indicateValue?: ComputedRef;
+ to?: string;
+ action?: (ev: PointerEvent) => void;
+ };
+}>({
notifications: {
title: i18n.ts.notifications,
icon: 'ti ti-bell',
@@ -137,7 +148,7 @@ export const navbarItemDef = reactive({
ui: {
title: i18n.ts.switchUi,
icon: 'ti ti-devices',
- action: (ev: MouseEvent) => {
+ action: (ev) => {
os.popupMenu([{
text: i18n.ts.default,
active: ui === 'default' || ui === null,
diff --git a/packages/frontend/src/os.ts b/packages/frontend/src/os.ts
index 73f18bc6b5..2e2d0a814e 100644
--- a/packages/frontend/src/os.ts
+++ b/packages/frontend/src/os.ts
@@ -666,7 +666,7 @@ export function popupMenu(items: (MenuItem | null)[], anchorElement?: HTMLElemen
}));
}
-export function contextMenu(items: MenuItem[], ev: MouseEvent): Promise {
+export function contextMenu(items: MenuItem[], ev: PointerEvent): Promise {
if (
prefer.s.contextMenu === 'native' ||
(prefer.s.contextMenu === 'appWithShift' && !ev.shiftKey)
diff --git a/packages/frontend/src/pages/about.federation.vue b/packages/frontend/src/pages/about.federation.vue
index bbfb9a3b7c..c109000108 100644
--- a/packages/frontend/src/pages/about.federation.vue
+++ b/packages/frontend/src/pages/about.federation.vue
@@ -97,7 +97,7 @@ const paginator = markRaw(new Paginator('federation/instances', {
})),
}));
-function getStatus(instance) {
+function getStatus(instance: Misskey.entities.FederationInstance) {
if (instance.isSuspended) return 'Suspended';
if (instance.isBlocked) return 'Blocked';
if (instance.isSilenced) return 'Silenced';
diff --git a/packages/frontend/src/pages/admin-user.vue b/packages/frontend/src/pages/admin-user.vue
index 22e377c75d..b084eb5ab2 100644
--- a/packages/frontend/src/pages/admin-user.vue
+++ b/packages/frontend/src/pages/admin-user.vue
@@ -105,7 +105,7 @@ SPDX-License-Identifier: AGPL-3.0-only
{{ i18n.ts._role.policies }}
- {{ policy }} ... {{ info.policies[policy] }}
+ {{ policy }} ... {{ info.policies[policy as keyof typeof info.policies] }}
@@ -209,6 +209,7 @@ SPDX-License-Identifier: AGPL-3.0-only
import { computed, defineAsyncComponent, watch, ref, markRaw } from 'vue';
import * as Misskey from 'misskey-js';
import { url } from '@@/js/config.js';
+import type { ChartSrc } from '@/components/MkChart.vue';
import MkChart from '@/components/MkChart.vue';
import MkObjectView from '@/components/MkObjectView.vue';
import MkTextarea from '@/components/MkTextarea.vue';
@@ -231,7 +232,6 @@ import { ensureSignin, iAmAdmin, iAmModerator } from '@/i.js';
import MkRolePreview from '@/components/MkRolePreview.vue';
import MkPagination from '@/components/MkPagination.vue';
import { Paginator } from '@/utility/paginator.js';
-import type { ChartSrc } from '@/components/MkChart.vue';
const $i = ensureSignin();
@@ -251,7 +251,7 @@ const {
} = useMkSelect({
items: [
{ label: i18n.ts.notes, value: 'per-user-notes' },
-],
+ ],
initialValue: 'per-user-notes',
});
const user = ref(result.user);
@@ -344,7 +344,7 @@ async function resetPassword() {
}
}
-async function toggleSuspend(v) {
+async function toggleSuspend(v: boolean) {
const confirm = await os.confirm({
type: 'warning',
text: v ? i18n.ts.suspendConfirm : i18n.ts.unsuspendConfirm,
@@ -475,7 +475,7 @@ async function assignRole() {
refreshUser();
}
-async function unassignRole(role: typeof info.value.roles[number], ev: MouseEvent) {
+async function unassignRole(role: typeof info.value.roles[number], ev: PointerEvent) {
os.popupMenu([{
text: i18n.ts.unassign,
icon: 'ti ti-x',
@@ -503,7 +503,7 @@ async function createAnnouncement() {
});
}
-async function editAnnouncement(announcement) {
+async function editAnnouncement(announcement: Misskey.entities.AdminAnnouncementsListResponse[number]) {
const { dispose } = await os.popupAsyncWithDialog(import('@/components/MkUserAnnouncementEditDialog.vue').then(x => x.default), {
user: user.value,
announcement,
diff --git a/packages/frontend/src/pages/admin/RolesEditorFormula.vue b/packages/frontend/src/pages/admin/RolesEditorFormula.vue
index 9eeedd5c1d..13f66662d0 100644
--- a/packages/frontend/src/pages/admin/RolesEditorFormula.vue
+++ b/packages/frontend/src/pages/admin/RolesEditorFormula.vue
@@ -6,7 +6,7 @@ SPDX-License-Identifier: AGPL-3.0-only
-
+
-
+
valuesItemUpdated(updated)"
- @remove="removeItem(item.id)"
+ @update:modelValue="updated => childValuesItemUpdated(updated)"
+ @remove="removeChildItem(item.id)"
/>
-
{{ i18n.ts.add }}
+
{{ i18n.ts.add }}
-