Merge pull request #8821 from misskey-dev/develop

Release: 12.111.1
This commit is contained in:
syuilo 2022-06-13 00:41:09 +09:00 committed by GitHub
commit 1bc856c451
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
10 changed files with 49 additions and 21 deletions

View file

@ -9,7 +9,18 @@
You should also include the user name that made the change. You should also include the user name that made the change.
--> -->
## 12.111.1 (2022/06/13)
### Bugfixes
- some fixes of multiple notification read @tamaina
- some GenerateVideoThumbnail failed @Johann150
- Client: デッキでウィジェットの情報が保存されない問題を修正 @syuilo
- Client: ギャラリーの投稿を開こうとすると編集画面が表示される @futchitwo
## 12.111.0 (2022/06/11) ## 12.111.0 (2022/06/11)
### Note
- Node.js 16.15.0 or later is required
### Improvements ### Improvements
- Supports Unicode Emoji 14.0 @mei23 - Supports Unicode Emoji 14.0 @mei23
- プッシュ通知を複数アカウント対応に #7667 @tamaina - プッシュ通知を複数アカウント対応に #7667 @tamaina
@ -32,10 +43,8 @@ You should also include the user name that made the change.
### Bugfixes ### Bugfixes
- Server: keep file order of note attachement @Johann150 - Server: keep file order of note attachement @Johann150
- Server: fix caching @Johann150
- Server: fix missing foreign key for reports leading to reports page being unusable @Johann150 - Server: fix missing foreign key for reports leading to reports page being unusable @Johann150
- Server: fix internal in-memory caching @Johann150 - Server: fix internal in-memory caching @Johann150
- Server: use correct order of attachments on notes @Johann150
- Server: prevent crash when processing certain PNGs @syuilo - Server: prevent crash when processing certain PNGs @syuilo
- Server: Fix unable to generate video thumbnails @mei23 - Server: Fix unable to generate video thumbnails @mei23
- Server: Fix `Cannot find module` issue @mei23 - Server: Fix `Cannot find module` issue @mei23

View file

@ -842,6 +842,9 @@ oneDay: "1일"
oneWeek: "일주일" oneWeek: "일주일"
reflectMayTakeTime: "반영되기까지 시간이 걸릴 수 있습니다." reflectMayTakeTime: "반영되기까지 시간이 걸릴 수 있습니다."
failedToFetchAccountInformation: "계정 정보를 가져오지 못했습니다" failedToFetchAccountInformation: "계정 정보를 가져오지 못했습니다"
rateLimitExceeded: "요청 제한 횟수를 초과하였습니다"
cropImage: "이미지 자르기"
cropImageAsk: "이미지를 자르시겠습니까?"
_emailUnavailable: _emailUnavailable:
used: "이 메일 주소는 사용중입니다" used: "이 메일 주소는 사용중입니다"
format: "형식이 올바르지 않습니다" format: "형식이 올바르지 않습니다"

View file

@ -1,6 +1,6 @@
{ {
"name": "misskey", "name": "misskey",
"version": "12.111.0", "version": "12.111.1",
"codename": "indigo", "codename": "indigo",
"repository": { "repository": {
"type": "git", "type": "git",

View file

@ -9,6 +9,8 @@ export async function readNotification(
userId: User['id'], userId: User['id'],
notificationIds: Notification['id'][] notificationIds: Notification['id'][]
) { ) {
if (notificationIds.length === 0) return;
// Update documents // Update documents
await Notifications.update({ await Notifications.update({
id: In(notificationIds), id: In(notificationIds),

View file

@ -34,7 +34,11 @@ export const paramDef = {
{ {
type: 'object', type: 'object',
properties: { properties: {
notificationIds: { type: 'array', items: { type: 'string', format: 'misskey:id' } }, notificationIds: {
type: 'array',
items: { type: 'string', format: 'misskey:id' },
maxItems: 100,
},
}, },
required: ['notificationIds'], required: ['notificationIds'],
}, },

View file

@ -24,7 +24,7 @@ export async function GenerateVideoThumbnail(source: string): Promise<IImage> {
}); });
// JPEGに変換 (Webpでもいいが、MastodonはWebpをサポートせず表示できなくなる) // JPEGに変換 (Webpでもいいが、MastodonはWebpをサポートせず表示できなくなる)
return await convertToJpeg(498, 280); return await convertToJpeg(file, 498, 280);
} finally { } finally {
cleanup(); cleanup();
} }

View file

@ -41,7 +41,7 @@ const defaultRoutes = [
{ path: '/gallery', component: page(() => import('./pages/gallery/index.vue')) }, { path: '/gallery', component: page(() => import('./pages/gallery/index.vue')) },
{ path: '/gallery/new', component: page(() => import('./pages/gallery/edit.vue')) }, { path: '/gallery/new', component: page(() => import('./pages/gallery/edit.vue')) },
{ path: '/gallery/:postId/edit', component: page(() => import('./pages/gallery/edit.vue')), props: route => ({ postId: route.params.postId }) }, { path: '/gallery/:postId/edit', component: page(() => import('./pages/gallery/edit.vue')), props: route => ({ postId: route.params.postId }) },
{ path: '/gallery/:postId', component: page(() => import('./pages/gallery/edit.vue')), props: route => ({ postId: route.params.postId }) }, { path: '/gallery/:postId', component: page(() => import('./pages/gallery/post.vue')), props: route => ({ postId: route.params.postId }) },
{ path: '/channels', component: page('channels') }, { path: '/channels', component: page('channels') },
{ path: '/channels/new', component: page('channel-editor') }, { path: '/channels/new', component: page('channel-editor') },
{ path: '/channels/:channelId/edit', component: page('channel-editor'), props: true }, { path: '/channels/:channelId/edit', component: page('channel-editor'), props: true },

View file

@ -1,9 +1,9 @@
import { throttle } from 'throttle-debounce'; import { throttle } from 'throttle-debounce';
import { markRaw } from 'vue';
import { notificationTypes } from 'misskey-js';
import { Storage } from '../../pizzax';
import { i18n } from '@/i18n'; import { i18n } from '@/i18n';
import { api } from '@/os'; import { api } from '@/os';
import { markRaw } from 'vue';
import { Storage } from '../../pizzax';
import { notificationTypes } from 'misskey-js';
type ColumnWidget = { type ColumnWidget = {
name: string; name: string;
@ -32,35 +32,35 @@ function copy<T>(x: T): T {
export const deckStore = markRaw(new Storage('deck', { export const deckStore = markRaw(new Storage('deck', {
profile: { profile: {
where: 'deviceAccount', where: 'deviceAccount',
default: 'default' default: 'default',
}, },
columns: { columns: {
where: 'deviceAccount', where: 'deviceAccount',
default: [] as Column[] default: [] as Column[],
}, },
layout: { layout: {
where: 'deviceAccount', where: 'deviceAccount',
default: [] as Column['id'][][] default: [] as Column['id'][][],
}, },
columnAlign: { columnAlign: {
where: 'deviceAccount', where: 'deviceAccount',
default: 'left' as 'left' | 'right' | 'center' default: 'left' as 'left' | 'right' | 'center',
}, },
alwaysShowMainColumn: { alwaysShowMainColumn: {
where: 'deviceAccount', where: 'deviceAccount',
default: true default: true,
}, },
navWindow: { navWindow: {
where: 'deviceAccount', where: 'deviceAccount',
default: true default: true,
}, },
columnMargin: { columnMargin: {
where: 'deviceAccount', where: 'deviceAccount',
default: 16 default: 16,
}, },
columnHeaderHeight: { columnHeaderHeight: {
where: 'deviceAccount', where: 'deviceAccount',
default: 42 default: 42,
}, },
})); }));
@ -109,7 +109,7 @@ export const saveDeck = throttle(1000, () => {
value: { value: {
columns: deckStore.reactiveState.columns.value, columns: deckStore.reactiveState.columns.value,
layout: deckStore.reactiveState.layout.value, layout: deckStore.reactiveState.layout.value,
} },
}); });
}); });
@ -276,7 +276,7 @@ export function setColumnWidgets(id: Column['id'], widgets: ColumnWidget[]) {
saveDeck(); saveDeck();
} }
export function updateColumnWidget(id: Column['id'], widgetId: string, WidgetData: any) { export function updateColumnWidget(id: Column['id'], widgetId: string, widgetData: any) {
const columns = copy(deckStore.state.columns); const columns = copy(deckStore.state.columns);
const columnIndex = deckStore.state.columns.findIndex(c => c.id === id); const columnIndex = deckStore.state.columns.findIndex(c => c.id === id);
const column = copy(deckStore.state.columns[columnIndex]); const column = copy(deckStore.state.columns[columnIndex]);

View file

@ -10,9 +10,9 @@
<script lang="ts" setup> <script lang="ts" setup>
import { } from 'vue'; import { } from 'vue';
import XWidgets from '@/components/widgets.vue';
import XColumn from './column.vue'; import XColumn from './column.vue';
import { addColumnWidget, Column, removeColumnWidget, setColumnWidgets, updateColumnWidget } from './deck-store'; import { addColumnWidget, Column, removeColumnWidget, setColumnWidgets, updateColumnWidget } from './deck-store';
import XWidgets from '@/components/widgets.vue';
const props = defineProps<{ const props = defineProps<{
column: Column; column: Column;

View file

@ -37,12 +37,22 @@ class SwNotificationReadManager {
account.queue.push(data.body.id as string); account.queue.push(data.body.id as string);
if (account.queue.length >= 20) {
if (account.timeout) clearTimeout(account.timeout);
const notificationIds = account.queue;
account.queue = [];
await api('notifications/read', data.userId, { notificationIds });
return;
}
// 最後の呼び出しから200ms待ってまとめて処理する // 最後の呼び出しから200ms待ってまとめて処理する
if (account.timeout) clearTimeout(account.timeout); if (account.timeout) clearTimeout(account.timeout);
account.timeout = setTimeout(() => { account.timeout = setTimeout(() => {
account.timeout = null; account.timeout = null;
api('notifications/read', data.userId, { notificationIds: account.queue }); const notificationIds = account.queue;
account.queue = [];
api('notifications/read', data.userId, { notificationIds });
}, 200); }, 200);
} }
} }