Skip to content

Commit b6b8396

Browse files
committed
Fix: Suggestedな絵文字がでない問題
1 parent c9c49ed commit b6b8396

2 files changed

Lines changed: 58 additions & 9 deletions

File tree

packages/frontend/src/components/MkEmojiPicker.vue

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -164,7 +164,7 @@ import { isTouchUsing } from '@/utility/touch.js';
164164
import { deviceKind } from '@/utility/device-kind.js';
165165
import { i18n } from '@/i18n.js';
166166
import { store } from '@/store.js';
167-
import { customEmojiCategories, customEmojis, customEmojisMap } from '@/custom-emojis.js';
167+
import { customEmojiCategories, customEmojis, customEmojisMap, fetchCustomEmojis } from '@/custom-emojis.js';
168168
import { $i } from '@/i.js';
169169
import { checkReactionPermissions } from '@/utility/check-reaction-permissions.js';
170170
import { prefer } from '@/preferences.js';
@@ -539,6 +539,19 @@ function normalizeSuggestionItems(items: EmojiSuggestionItem[]): Misskey.entitie
539539
return emojis;
540540
}
541541
542+
async function normalizeSuggestionItemsWithRefresh(items: EmojiSuggestionItem[]): Promise<Misskey.entities.EmojiSimple[]> {
543+
const emojis = normalizeSuggestionItems(items);
544+
if (emojis.length > 0 || items.length === 0) return emojis;
545+
546+
try {
547+
await fetchCustomEmojis(true);
548+
} catch (_err) {
549+
return emojis;
550+
}
551+
552+
return normalizeSuggestionItems(items);
553+
}
554+
542555
function isRecord(value: unknown): value is Record<string, unknown> {
543556
return typeof value === 'object' && value !== null;
544557
}
@@ -575,7 +588,7 @@ async function loadSuggestedEmojis(): Promise<void> {
575588
if (!isEmojiSuggestionResponse(response)) throw new Error('invalid emoji suggestion response');
576589
577590
if (suggestionAbortController !== abortController) return;
578-
suggestedEmojis.value = normalizeSuggestionItems(response.items ?? []).filter(canReact);
591+
suggestedEmojis.value = (await normalizeSuggestionItemsWithRefresh(response.items ?? [])).filter(canReact);
579592
} catch {
580593
if (suggestionAbortController === abortController) {
581594
suggestedEmojis.value = [];

packages/frontend/test/emoji-picker-suggestions.test.ts

Lines changed: 43 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -246,13 +246,13 @@ afterEach(() => {
246246
describe('MkEmojiPicker emoji suggestions QA flows', () => {
247247
test('shows eligible public suggestions and emits the existing chosen reaction path', async () => {
248248
mockedMisskeyApi.mockResolvedValueOnce({
249-
items: [{
250-
name: suggestedEmoji.name,
251-
score: 0.98,
252-
aliases: suggestedEmoji.aliases,
253-
category: suggestedEmoji.category,
254-
}],
255-
reason: 'component-test',
249+
items: [{
250+
name: suggestedEmoji.name,
251+
score: 0.98,
252+
aliases: suggestedEmoji.aliases,
253+
category: suggestedEmoji.category,
254+
}],
255+
reason: 'component-test',
256256
});
257257

258258
const result = await renderPicker({
@@ -286,6 +286,42 @@ describe('MkEmojiPicker emoji suggestions QA flows', () => {
286286
expect(result.emitted('chosen')).toEqual([[':suggest_smile:']]);
287287
});
288288

289+
test('refreshes stale custom emoji cache before rendering suggestions', async () => {
290+
customEmojis.value = [fallbackEmoji];
291+
customEmojisMap.clear();
292+
customEmojisMap.set(fallbackEmoji.name, fallbackEmoji);
293+
294+
const uncachedSuggestedEmoji: Misskey.entities.EmojiSimple = {
295+
...suggestedEmoji,
296+
category: null,
297+
};
298+
299+
mockedMisskeyApi
300+
.mockResolvedValueOnce({
301+
items: [{
302+
name: uncachedSuggestedEmoji.name,
303+
score: 0.412465,
304+
aliases: [],
305+
category: null,
306+
}],
307+
reason: null,
308+
})
309+
.mockResolvedValueOnce({
310+
emojis: [fallbackEmoji, uncachedSuggestedEmoji],
311+
});
312+
313+
const result = await renderPicker({
314+
targetNote: createNote(),
315+
pinnedEmojis: [':fallback_ok:'],
316+
});
317+
318+
await waitFor(() => expect(result.getByText('Suggested')).not.toBeNull());
319+
await waitFor(() => expect(mockedMisskeyApi).toHaveBeenCalledTimes(2));
320+
expect(mockedMisskeyApi.mock.calls[0][0]).toBe('notes/reactions/suggestions');
321+
expect(mockedMisskeyApi.mock.calls[1][0]).toBe('emojis');
322+
expect(result.container.querySelector('[data-emoji=":suggest_smile:"]')).not.toBeNull();
323+
});
324+
289325
test('does not request suggestions when disabled and pinned picker behavior still works', async () => {
290326
setEmojiSuggestionPublicMeta({ enabled: false, maxSuggestions: 4 });
291327

0 commit comments

Comments
 (0)