diff options
| author | syuilo <Syuilotan@yahoo.co.jp> | 2023-01-22 04:28:55 +0900 |
|---|---|---|
| committer | syuilo <Syuilotan@yahoo.co.jp> | 2023-01-22 04:28:55 +0900 |
| commit | 31dcf713ccefd858ecafc7982893bffb869b63de (patch) | |
| tree | 627b16ec4463c9a518da7ee92223cdf3dfb25cfe /packages/frontend | |
| parent | Merge branch 'develop' (diff) | |
| parent | 13.1.1 (diff) | |
| download | misskey-31dcf713ccefd858ecafc7982893bffb869b63de.tar.gz misskey-31dcf713ccefd858ecafc7982893bffb869b63de.tar.bz2 misskey-31dcf713ccefd858ecafc7982893bffb869b63de.zip | |
Merge branch 'develop'
Diffstat (limited to 'packages/frontend')
| -rw-r--r-- | packages/frontend/package.json | 20 | ||||
| -rw-r--r-- | packages/frontend/src/components/global/MkEmoji.vue | 6 | ||||
| -rw-r--r-- | packages/frontend/src/custom-emojis.ts | 11 | ||||
| -rw-r--r-- | packages/frontend/src/init.ts | 18 | ||||
| -rw-r--r-- | packages/frontend/src/local-storage.ts | 1 | ||||
| -rw-r--r-- | packages/frontend/src/scripts/achievements.ts | 14 |
6 files changed, 51 insertions, 19 deletions
diff --git a/packages/frontend/package.json b/packages/frontend/package.json index 730389a2e6..cdfa96ea82 100644 --- a/packages/frontend/package.json +++ b/packages/frontend/package.json @@ -8,7 +8,7 @@ }, "dependencies": { "@discordapp/twemoji": "14.0.2", - "@rollup/plugin-alias": "4.0.2", + "@rollup/plugin-alias": "4.0.3", "@rollup/plugin-json": "6.0.0", "@rollup/pluginutils": "5.0.2", "@syuilo/aiscript": "0.12.2", @@ -18,10 +18,10 @@ "autobind-decorator": "2.4.0", "autosize": "5.0.2", "blurhash": "2.0.4", - "broadcast-channel": "4.20.1", + "broadcast-channel": "4.20.2", "browser-image-resizer": "git+https://github.com/misskey-dev/browser-image-resizer#v2.2.1-misskey.3", "canvas-confetti": "^1.6.0", - "chart.js": "4.1.2", + "chart.js": "4.2.0", "chartjs-adapter-date-fns": "3.0.0", "chartjs-chart-matrix": "^1.3.0", "chartjs-plugin-gradient": "0.6.1", @@ -41,10 +41,10 @@ "misskey-js": "0.0.14", "photoswipe": "5.3.4", "prismjs": "1.29.0", - "punycode": "2.2.0", + "punycode": "2.3.0", "querystring": "0.2.1", "rndstr": "1.0.0", - "rollup": "3.10.0", + "rollup": "3.10.1", "s-age": "1.1.2", "sanitize-html": "^2.8.1", "sass": "1.57.1", @@ -69,7 +69,7 @@ }, "devDependencies": { "@types/escape-regexp": "0.0.1", - "@types/glob": "8.0.0", + "@types/glob": "8.0.1", "@types/gulp": "4.0.10", "@types/gulp-rename": "2.0.1", "@types/matter-js": "0.18.2", @@ -82,13 +82,13 @@ "@types/uuid": "9.0.0", "@types/websocket": "1.0.5", "@types/ws": "8.5.4", - "@typescript-eslint/eslint-plugin": "5.48.1", - "@typescript-eslint/parser": "5.48.1", + "@typescript-eslint/eslint-plugin": "5.48.2", + "@typescript-eslint/parser": "5.48.2", "@vue/runtime-core": "3.2.45", "cross-env": "7.0.3", "cypress": "12.3.0", - "eslint": "8.31.0", - "eslint-plugin-import": "2.27.4", + "eslint": "8.32.0", + "eslint-plugin-import": "2.27.5", "eslint-plugin-vue": "9.9.0", "start-server-and-test": "1.15.2", "vue-eslint-parser": "^9.1.0", diff --git a/packages/frontend/src/components/global/MkEmoji.vue b/packages/frontend/src/components/global/MkEmoji.vue index b7dd0296cd..aaad81c656 100644 --- a/packages/frontend/src/components/global/MkEmoji.vue +++ b/packages/frontend/src/components/global/MkEmoji.vue @@ -12,6 +12,7 @@ import { getStaticImageUrl } from '@/scripts/media-proxy'; import { char2twemojiFilePath, char2fluentEmojiFilePath } from '@/scripts/emoji-base'; import { defaultStore } from '@/store'; import { getEmojiName } from '@/scripts/emojilist'; +import { customEmojis } from '@/custom-emojis'; const props = defineProps<{ emoji: string; @@ -30,6 +31,9 @@ const useOsNativeEmojis = computed(() => defaultStore.state.emojiStyle === 'nati const url = computed(() => { if (char.value) { return char2path(char.value); + } else if (props.host == null) { + const found = customEmojis.find(x => x.name === customEmojiName); + return found ? found.url : null; } else { const rawUrl = props.host ? `/emoji/${customEmojiName}@${props.host}.webp` : `/emoji/${customEmojiName}.webp`; return defaultStore.state.disableShowingAnimatedImages @@ -38,7 +42,7 @@ const url = computed(() => { } }); const alt = computed(() => isCustom.value ? `:${customEmojiName}:` : char.value); -let errored = $ref(false); +let errored = $ref(isCustom.value && url.value == null); // Searching from an array with 2000 items for every emoji felt like too energy-consuming, so I decided to do it lazily on pointerenter function computeTitle(event: PointerEvent): void { diff --git a/packages/frontend/src/custom-emojis.ts b/packages/frontend/src/custom-emojis.ts index 19469999b6..a7ac4e03ca 100644 --- a/packages/frontend/src/custom-emojis.ts +++ b/packages/frontend/src/custom-emojis.ts @@ -2,14 +2,17 @@ import { api } from './os'; import { miLocalStorage } from './local-storage'; const storageCache = miLocalStorage.getItem('emojis'); -export let customEmojis = storageCache ? JSON.parse(storageCache) : []; - -fetchCustomEmojis(); +export let customEmojis: { + name: string; + aliases: string[]; + category: string; + url: string; +}[] = storageCache ? JSON.parse(storageCache) : []; export async function fetchCustomEmojis() { const now = Date.now(); const lastFetchedAt = miLocalStorage.getItem('lastEmojisFetchedAt'); - if (lastFetchedAt && (now - parseInt(lastFetchedAt)) < 1000 * 60 * 60) return; + if (lastFetchedAt && (now - parseInt(lastFetchedAt)) < 1000 * 60 * 60 * 24) return; const res = await api('emojis', {}); diff --git a/packages/frontend/src/init.ts b/packages/frontend/src/init.ts index 09fb7caf14..079003ee83 100644 --- a/packages/frontend/src/init.ts +++ b/packages/frontend/src/init.ts @@ -45,6 +45,7 @@ import { getUrlWithoutLoginId } from '@/scripts/login-id'; import { getAccountFromId } from '@/scripts/get-account-from-id'; import { miLocalStorage } from './local-storage'; import { claimAchievement, claimedAchievements } from './scripts/achievements'; +import { fetchCustomEmojis } from './custom-emojis'; (async () => { console.info(`Misskey v${version}`); @@ -80,6 +81,19 @@ import { claimAchievement, claimedAchievements } from './scripts/achievements'; }); } + //#region Detect language & fetch translations + const localeVersion = miLocalStorage.getItem('localeVersion'); + const localeOutdated = (localeVersion == null || localeVersion !== version); + if (localeOutdated) { + const res = await window.fetch(`/assets/locales/${lang}.${version}.json`); + if (res.status === 200) { + miLocalStorage.setItem('locale', await res.text()); + miLocalStorage.setItem('localeVersion', version); + location.reload(); + } + } + //#endregion + // タッチデバイスでCSSの:hoverを機能させる document.addEventListener('touchend', () => {}, { passive: true }); @@ -165,6 +179,10 @@ import { claimAchievement, claimedAchievements } from './scripts/achievements'; initializeSw(); }); + try { + await fetchCustomEmojis(); + } catch (err) {} + const app = createApp( window.location.search === '?zen' ? defineAsyncComponent(() => import('@/ui/zen.vue')) : !$i ? defineAsyncComponent(() => import('@/ui/visitor.vue')) : diff --git a/packages/frontend/src/local-storage.ts b/packages/frontend/src/local-storage.ts index bb8192e980..68dc9ebe41 100644 --- a/packages/frontend/src/local-storage.ts +++ b/packages/frontend/src/local-storage.ts @@ -19,6 +19,7 @@ type Keys = 'fontSize' | 'ui' | 'locale' | + 'localeVersion' | 'theme' | 'customCss' | 'message_drafts' | diff --git a/packages/frontend/src/scripts/achievements.ts b/packages/frontend/src/scripts/achievements.ts index 8f484f8925..c97358e880 100644 --- a/packages/frontend/src/scripts/achievements.ts +++ b/packages/frontend/src/scripts/achievements.ts @@ -433,16 +433,22 @@ export const ACHIEVEMENT_BADGES = { export const claimedAchievements = ($i && $i.achievements) ? $i.achievements.map(x => x.name) : []; -export function claimAchievement(type: typeof ACHIEVEMENT_TYPES[number]) { +const claimingQueue = new Set<string>(); + +export async function claimAchievement(type: typeof ACHIEVEMENT_TYPES[number]) { if (claimedAchievements.includes(type)) return; - os.api('i/claim-achievement', { name: type }); + claimingQueue.add(type); claimedAchievements.push(type); + await new Promise(resolve => setTimeout(resolve, (claimingQueue.size - 1) * 500)); + window.setTimeout(() => { + claimingQueue.delete(type); + }, 500); + os.api('i/claim-achievement', { name: type }); } if (_DEV_) { - (window as any).unlockAllAchievements = async () => { + (window as any).unlockAllAchievements = () => { for (const t of ACHIEVEMENT_TYPES) { - await new Promise(resolve => setTimeout(resolve, 100)); claimAchievement(t); } }; |