summaryrefslogtreecommitdiff
path: root/packages/frontend
diff options
context:
space:
mode:
authorsyuilo <Syuilotan@yahoo.co.jp>2023-01-22 04:28:55 +0900
committersyuilo <Syuilotan@yahoo.co.jp>2023-01-22 04:28:55 +0900
commit31dcf713ccefd858ecafc7982893bffb869b63de (patch)
tree627b16ec4463c9a518da7ee92223cdf3dfb25cfe /packages/frontend
parentMerge branch 'develop' (diff)
parent13.1.1 (diff)
downloadmisskey-31dcf713ccefd858ecafc7982893bffb869b63de.tar.gz
misskey-31dcf713ccefd858ecafc7982893bffb869b63de.tar.bz2
misskey-31dcf713ccefd858ecafc7982893bffb869b63de.zip
Merge branch 'develop'
Diffstat (limited to 'packages/frontend')
-rw-r--r--packages/frontend/package.json20
-rw-r--r--packages/frontend/src/components/global/MkEmoji.vue6
-rw-r--r--packages/frontend/src/custom-emojis.ts11
-rw-r--r--packages/frontend/src/init.ts18
-rw-r--r--packages/frontend/src/local-storage.ts1
-rw-r--r--packages/frontend/src/scripts/achievements.ts14
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);
}
};