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.
-->
## 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)
### Note
- Node.js 16.15.0 or later is required
### Improvements
- Supports Unicode Emoji 14.0 @mei23
- プッシュ通知を複数アカウント対応に #7667 @tamaina
@ -32,10 +43,8 @@ You should also include the user name that made the change.
### Bugfixes
- 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 internal in-memory caching @Johann150
- Server: use correct order of attachments on notes @Johann150
- Server: prevent crash when processing certain PNGs @syuilo
- Server: Fix unable to generate video thumbnails @mei23
- Server: Fix `Cannot find module` issue @mei23

View file

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

View file

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

View file

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

View file

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

View file

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

View file

@ -41,7 +41,7 @@ const defaultRoutes = [
{ path: '/gallery', component: page(() => import('./pages/gallery/index.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', 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/new', component: page('channel-editor') },
{ path: '/channels/:channelId/edit', component: page('channel-editor'), props: true },

View file

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

View file

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

View file

@ -37,12 +37,22 @@ class SwNotificationReadManager {
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待ってまとめて処理する
if (account.timeout) clearTimeout(account.timeout);
account.timeout = setTimeout(() => {
account.timeout = null;
api('notifications/read', data.userId, { notificationIds: account.queue });
const notificationIds = account.queue;
account.queue = [];
api('notifications/read', data.userId, { notificationIds });
}, 200);
}
}