commit
1bc856c451
10 changed files with 49 additions and 21 deletions
13
CHANGELOG.md
13
CHANGELOG.md
|
@ -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
|
||||||
|
|
|
@ -842,6 +842,9 @@ oneDay: "1일"
|
||||||
oneWeek: "일주일"
|
oneWeek: "일주일"
|
||||||
reflectMayTakeTime: "반영되기까지 시간이 걸릴 수 있습니다."
|
reflectMayTakeTime: "반영되기까지 시간이 걸릴 수 있습니다."
|
||||||
failedToFetchAccountInformation: "계정 정보를 가져오지 못했습니다"
|
failedToFetchAccountInformation: "계정 정보를 가져오지 못했습니다"
|
||||||
|
rateLimitExceeded: "요청 제한 횟수를 초과하였습니다"
|
||||||
|
cropImage: "이미지 자르기"
|
||||||
|
cropImageAsk: "이미지를 자르시겠습니까?"
|
||||||
_emailUnavailable:
|
_emailUnavailable:
|
||||||
used: "이 메일 주소는 사용중입니다"
|
used: "이 메일 주소는 사용중입니다"
|
||||||
format: "형식이 올바르지 않습니다"
|
format: "형식이 올바르지 않습니다"
|
||||||
|
|
|
@ -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",
|
||||||
|
|
|
@ -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),
|
||||||
|
|
|
@ -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'],
|
||||||
},
|
},
|
||||||
|
|
|
@ -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();
|
||||||
}
|
}
|
||||||
|
|
|
@ -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 },
|
||||||
|
|
|
@ -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]);
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue