{{ okText ?? ((showCancelButton || input || select) ? i18n.ts.ok : i18n.ts.gotIt) }}
@@ -74,7 +69,7 @@ import MkTextarea from '@/components/MkTextarea.vue';
import { i18n } from '@/i18n.js';
type Input = {
- type: 'text' | 'number' | 'password' | 'email' | 'url' | 'date' | 'time' | 'search' | 'datetime-local' | 'textarea';
+ type?: 'text' | 'number' | 'password' | 'email' | 'url' | 'date' | 'time' | 'search' | 'datetime-local' | 'textarea';
placeholder?: string | null;
autocomplete?: string;
default: string | number | null;
@@ -84,23 +79,18 @@ type Input = {
type Select = {
items: {
- value: string;
+ value: any;
text: string;
}[];
- groupedItems: {
- label: string;
- items: {
- value: string;
- text: string;
- }[];
- }[];
default: string | null;
};
+type Result = string | number | true | null;
+
const props = withDefaults(defineProps<{
type?: 'success' | 'error' | 'warning' | 'info' | 'question' | 'waiting';
- title: string;
- text?: string;
+ title?: string | null;
+ text?: string | null;
input?: Input;
select?: Select;
icon?: string;
@@ -117,13 +107,21 @@ const props = withDefaults(defineProps<{
cancelText?: string;
}>(), {
type: 'info',
+ title: undefined,
+ text: undefined,
+ input: undefined,
+ select: undefined,
+ icon: undefined,
+ actions: undefined,
showOkButton: true,
showCancelButton: false,
cancelableByBgClick: true,
+ okText: undefined,
+ cancelText: undefined,
});
const emit = defineEmits<{
- (ev: 'done', v: { canceled: boolean; result: any }): void;
+ (ev: 'done', v: { canceled: true } | { canceled: false, result: Result }): void;
(ev: 'closed'): void;
}>();
@@ -149,8 +147,11 @@ const okButtonDisabledReason = computed
();
const dialog = shallowRef>();
-const selected = ref([]);
+const selected = ref([]);
function ok() {
emit('done', selected.value);
@@ -57,7 +57,7 @@ function cancel() {
dialog.value?.close();
}
-function onChangeSelection(files: Misskey.entities.DriveFile[]) {
- selected.value = files;
+function onChangeSelection(v: Misskey.entities.DriveFile[] | Misskey.entities.DriveFolder[]) {
+ selected.value = v;
}
diff --git a/packages/frontend/src/components/MkEmojiPickerDialog.vue b/packages/frontend/src/components/MkEmojiPickerDialog.vue
index 90ecebb0e..90b37e390 100644
--- a/packages/frontend/src/components/MkEmojiPickerDialog.vue
+++ b/packages/frontend/src/components/MkEmojiPickerDialog.vue
@@ -56,7 +56,7 @@ const props = withDefaults(defineProps<{
});
const emit = defineEmits<{
- (ev: 'done', v: any): void;
+ (ev: 'done', v: string): void;
(ev: 'close'): void;
(ev: 'closed'): void;
}>();
@@ -64,7 +64,7 @@ const emit = defineEmits<{
const modal = shallowRef>();
const picker = shallowRef>();
-function chosen(emoji: any) {
+function chosen(emoji: string) {
emit('done', emoji);
if (props.choseAndClose) {
modal.value?.close();
diff --git a/packages/frontend/src/components/MkFormDialog.vue b/packages/frontend/src/components/MkFormDialog.vue
index 0d8734799..deedc5bad 100644
--- a/packages/frontend/src/components/MkFormDialog.vue
+++ b/packages/frontend/src/components/MkFormDialog.vue
@@ -21,37 +21,37 @@ SPDX-License-Identifier: AGPL-3.0-only
-
-
- ({{ i18n.ts.optional }})
- {{ form[item].description }}
+
+
+ ({{ i18n.ts.optional }})
+ {{ v.description }}
-
- ({{ i18n.ts.optional }})
- {{ form[item].description }}
+
+ ({{ i18n.ts.optional }})
+ {{ v.description }}
-
- ({{ i18n.ts.optional }})
- {{ form[item].description }}
+
+ ({{ i18n.ts.optional }})
+ {{ v.description }}
-
-
- {{ form[item].description }}
+
+
+ {{ v.description }}
-
- ({{ i18n.ts.optional }})
-
+
+ ({{ i18n.ts.optional }})
+
-
- ({{ i18n.ts.optional }})
-
+
+ ({{ i18n.ts.optional }})
+
-
- ({{ i18n.ts.optional }})
- {{ form[item].description }}
+
+ ({{ i18n.ts.optional }})
+ {{ v.description }}
-
-
+
+
@@ -72,19 +72,21 @@ import MkSelect from './MkSelect.vue';
import MkRange from './MkRange.vue';
import MkButton from './MkButton.vue';
import MkRadios from './MkRadios.vue';
+import type { Form } from '@/scripts/form.js';
import MkModalWindow from '@/components/MkModalWindow.vue';
import { i18n } from '@/i18n.js';
import { infoImageUrl } from '@/instance.js';
const props = defineProps<{
title: string;
- form: any;
+ form: Form;
}>();
const emit = defineEmits<{
(ev: 'done', v: {
- canceled?: boolean;
- result?: any;
+ canceled: true;
+ } | {
+ result: Record;
}): void;
(ev: 'closed'): void;
}>();
diff --git a/packages/frontend/src/components/MkNotifications.vue b/packages/frontend/src/components/MkNotifications.vue
index 37f47a31c..c87252e22 100644
--- a/packages/frontend/src/components/MkNotifications.vue
+++ b/packages/frontend/src/components/MkNotifications.vue
@@ -35,6 +35,7 @@ import { notificationTypes } from '@/const.js';
import { infoImageUrl } from '@/instance.js';
import { defaultStore } from '@/store.js';
import MkPullToRefresh from '@/components/MkPullToRefresh.vue';
+import * as Misskey from 'misskey-js';
const props = defineProps<{
excludeTypes?: typeof notificationTypes[number][];
@@ -75,15 +76,19 @@ function reload() {
});
}
-let connection;
+let connection: Misskey.ChannelConnection;
onMounted(() => {
connection = useStream().useChannel('main');
connection.on('notification', onNotification);
+ connection.on('notificationFlushed', reload);
});
onActivated(() => {
pagingComponent.value?.reload();
+ connection = useStream().useChannel('main');
+ connection.on('notification', onNotification);
+ connection.on('notificationFlushed', reload);
});
onUnmounted(() => {
diff --git a/packages/frontend/src/components/MkPostForm.vue b/packages/frontend/src/components/MkPostForm.vue
index f169069fd..578f38b3b 100644
--- a/packages/frontend/src/components/MkPostForm.vue
+++ b/packages/frontend/src/components/MkPostForm.vue
@@ -173,7 +173,7 @@ const emit = defineEmits<{
const textareaEl = shallowRef(null);
const cwInputEl = shallowRef(null);
const hashtagsInputEl = shallowRef(null);
-const visibilityButton = shallowRef(null);
+const visibilityButton = shallowRef();
const posting = ref(false);
const posted = ref(false);
@@ -466,6 +466,7 @@ function setVisibility() {
isSilenced: $i.isSilenced,
localOnly: localOnly.value,
src: visibilityButton.value,
+ ...(props.reply ? { isReplyVisibilitySpecified: props.reply.visibility === 'specified' } : {}),
}, {
changeVisibility: v => {
visibility.value = v;
diff --git a/packages/frontend/src/components/MkVisibilityPicker.vue b/packages/frontend/src/components/MkVisibilityPicker.vue
index 3439a751a..5ecd41bfd 100644
--- a/packages/frontend/src/components/MkVisibilityPicker.vue
+++ b/packages/frontend/src/components/MkVisibilityPicker.vue
@@ -9,21 +9,21 @@ SPDX-License-Identifier: AGPL-3.0-only
{{ i18n.ts.visibility }}
-
+