mirror of
https://github.com/misskey-dev/misskey.git
synced 2024-12-23 00:29:22 +09:00
Compare commits
15 Commits
375a73d84b
...
163f43cd00
Author | SHA1 | Date | |
---|---|---|---|
|
163f43cd00 | ||
|
e8bf6285cb | ||
|
074b7b0bee | ||
|
020c191e2c | ||
|
dac3b1f405 | ||
|
fa271cf84e | ||
|
48232ca57b | ||
|
3564bf5c66 | ||
|
685fc2bd9d | ||
|
6cc0138d1e | ||
|
d3228d5570 | ||
|
4a8ffe20a7 | ||
|
5615675991 | ||
|
0c65b8058a | ||
|
82bec76cd4 |
@ -6,6 +6,9 @@
|
|||||||
### Client
|
### Client
|
||||||
- Fix: 画面サイズが変わった際にナビゲーションバーが自動で折りたたまれない問題を修正
|
- Fix: 画面サイズが変わった際にナビゲーションバーが自動で折りたたまれない問題を修正
|
||||||
- Fix: サーバー情報メニューに区切り線が不足していたのを修正
|
- Fix: サーバー情報メニューに区切り線が不足していたのを修正
|
||||||
|
- Fix: ノートがログインしているユーザーしか見れない場合にログインダイアログを閉じるとその後の動線がなくなる問題を修正
|
||||||
|
- Fix: 公開範囲がホームのノートの埋め込みウィジェットが読み込まれない問題を修正
|
||||||
|
(Cherry-picked from https://activitypub.software/TransFem-org/Sharkey/-/merge_requests/803)
|
||||||
|
|
||||||
### Server
|
### Server
|
||||||
- Fix: ユーザーのプロフィール画面をアドレス入力などで直接表示した際に概要タブの描画に失敗する問題の修正( #15032 )
|
- Fix: ユーザーのプロフィール画面をアドレス入力などで直接表示した際に概要タブの描画に失敗する問題の修正( #15032 )
|
||||||
@ -477,7 +480,7 @@
|
|||||||
- Fix: カスタム絵文字の画像読み込みに失敗した際はテキストではなくダミー画像を表示 #13487
|
- Fix: カスタム絵文字の画像読み込みに失敗した際はテキストではなくダミー画像を表示 #13487
|
||||||
|
|
||||||
### Server
|
### Server
|
||||||
-
|
- Fix: FTT有効かつDBフォールバック有効時、STLのようにタイムラインのソースが複数だとFTTとDBのフォールバック間で取得されないノートがある問題
|
||||||
|
|
||||||
## 2024.3.0
|
## 2024.3.0
|
||||||
|
|
||||||
|
@ -34,6 +34,7 @@ type TimelineOptions = {
|
|||||||
excludeReplies?: boolean;
|
excludeReplies?: boolean;
|
||||||
excludePureRenotes: boolean;
|
excludePureRenotes: boolean;
|
||||||
dbFallback: (untilId: string | null, sinceId: string | null, limit: number) => Promise<MiNote[]>,
|
dbFallback: (untilId: string | null, sinceId: string | null, limit: number) => Promise<MiNote[]>,
|
||||||
|
preventEmptyTimelineDbFallback?: boolean;
|
||||||
};
|
};
|
||||||
|
|
||||||
@Injectable()
|
@Injectable()
|
||||||
@ -63,12 +64,20 @@ export class FanoutTimelineEndpointService {
|
|||||||
|
|
||||||
const redisResult = await this.fanoutTimelineService.getMulti(ps.redisTimelines, ps.untilId, ps.sinceId);
|
const redisResult = await this.fanoutTimelineService.getMulti(ps.redisTimelines, ps.untilId, ps.sinceId);
|
||||||
|
|
||||||
// TODO: いい感じにgetMulti内でソート済だからuniqするときにredisResultが全てソート済なのを利用して再ソートを避けたい
|
// オプション無効時、取得したredisResultのうち、2つ以上ソースがあり、1つでも空であればDBにフォールバックする
|
||||||
const redisResultIds = Array.from(new Set(redisResult.flat(1))).sort(idCompare);
|
let shouldFallbackToDb = ps.useDbFallback &&
|
||||||
|
(ps.preventEmptyTimelineDbFallback !== true && redisResult.length > 1 && redisResult.some(ids => ids.length === 0));
|
||||||
|
|
||||||
|
// 取得したresultの中で最古のIDのうち、最も新しいものを取得
|
||||||
|
const fttThresholdId = redisResult.map(ids => ids[0]).sort()[0];
|
||||||
|
|
||||||
|
// TODO: いい感じにgetMulti内でソート済だからuniqするときにredisResultが全てソート済なのを利用して再ソートを避けたい
|
||||||
|
const redisResultIds = shouldFallbackToDb ? [] : Array.from(new Set(redisResult.flat(1))).sort(idCompare);
|
||||||
|
|
||||||
|
let noteIds = redisResultIds.filter(id => id >= fttThresholdId).slice(0, ps.limit);
|
||||||
|
|
||||||
let noteIds = redisResultIds.slice(0, ps.limit);
|
|
||||||
const oldestNoteId = ascending ? redisResultIds[0] : redisResultIds[redisResultIds.length - 1];
|
const oldestNoteId = ascending ? redisResultIds[0] : redisResultIds[redisResultIds.length - 1];
|
||||||
const shouldFallbackToDb = noteIds.length === 0 || ps.sinceId != null && ps.sinceId < oldestNoteId;
|
shouldFallbackToDb ||= ps.useDbFallback && (noteIds.length === 0 || ps.sinceId != null && ps.sinceId < oldestNoteId);
|
||||||
|
|
||||||
if (!shouldFallbackToDb) {
|
if (!shouldFallbackToDb) {
|
||||||
let filter = ps.noteFilter ?? (_note => true);
|
let filter = ps.noteFilter ?? (_note => true);
|
||||||
|
@ -148,6 +148,7 @@ export default class extends Endpoint<typeof meta, typeof paramDef> { // eslint-
|
|||||||
withFiles: ps.withFiles,
|
withFiles: ps.withFiles,
|
||||||
withRenotes: ps.withRenotes,
|
withRenotes: ps.withRenotes,
|
||||||
}, me),
|
}, me),
|
||||||
|
preventEmptyTimelineDbFallback: true,
|
||||||
});
|
});
|
||||||
|
|
||||||
return timeline;
|
return timeline;
|
||||||
|
@ -871,7 +871,7 @@ export class ClientServerService {
|
|||||||
});
|
});
|
||||||
|
|
||||||
if (note == null) return;
|
if (note == null) return;
|
||||||
if (note.visibility !== 'public') return;
|
if (['specified', 'followers'].includes(note.visibility)) return;
|
||||||
if (note.userHost != null) return;
|
if (note.userHost != null) return;
|
||||||
|
|
||||||
const _note = await this.noteEntityService.pack(note, null, { detail: true });
|
const _note = await this.noteEntityService.pack(note, null, { detail: true });
|
||||||
|
@ -384,6 +384,7 @@ const patrons = [
|
|||||||
'こまつぶり',
|
'こまつぶり',
|
||||||
'まゆつな空高',
|
'まゆつな空高',
|
||||||
'asata',
|
'asata',
|
||||||
|
'ruru',
|
||||||
];
|
];
|
||||||
|
|
||||||
const thereIsTreasure = ref($i && !claimedAchievements.includes('foundTreasure'));
|
const thereIsTreasure = ref($i && !claimedAchievements.includes('foundTreasure'));
|
||||||
|
@ -117,5 +117,6 @@ definePageMetadata(() => ({
|
|||||||
border-radius: var(--MI-radius);
|
border-radius: var(--MI-radius);
|
||||||
background-color: var(--MI_THEME-panel);
|
background-color: var(--MI_THEME-panel);
|
||||||
overflow-x: scroll;
|
overflow-x: scroll;
|
||||||
|
white-space: nowrap;
|
||||||
}
|
}
|
||||||
</style>
|
</style>
|
||||||
|
@ -50,6 +50,7 @@ SPDX-License-Identifier: AGPL-3.0-only
|
|||||||
<script lang="ts" setup>
|
<script lang="ts" setup>
|
||||||
import { computed, watch, ref } from 'vue';
|
import { computed, watch, ref } from 'vue';
|
||||||
import * as Misskey from 'misskey-js';
|
import * as Misskey from 'misskey-js';
|
||||||
|
import { host } from '@@/js/config.js';
|
||||||
import type { Paging } from '@/components/MkPagination.vue';
|
import type { Paging } from '@/components/MkPagination.vue';
|
||||||
import MkNoteDetailed from '@/components/MkNoteDetailed.vue';
|
import MkNoteDetailed from '@/components/MkNoteDetailed.vue';
|
||||||
import MkNotes from '@/components/MkNotes.vue';
|
import MkNotes from '@/components/MkNotes.vue';
|
||||||
@ -140,7 +141,12 @@ function fetchNote() {
|
|||||||
}).catch(err => {
|
}).catch(err => {
|
||||||
if (err.id === '8e75455b-738c-471d-9f80-62693f33372e') {
|
if (err.id === '8e75455b-738c-471d-9f80-62693f33372e') {
|
||||||
pleaseLogin({
|
pleaseLogin({
|
||||||
|
path: '/',
|
||||||
message: i18n.ts.thisContentsAreMarkedAsSigninRequiredByAuthor,
|
message: i18n.ts.thisContentsAreMarkedAsSigninRequiredByAuthor,
|
||||||
|
openOnRemote: {
|
||||||
|
type: 'lookup',
|
||||||
|
url: `https://${host}/notes/${props.noteId}`,
|
||||||
|
},
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
error.value = err;
|
error.value = err;
|
||||||
|
Loading…
Reference in New Issue
Block a user