summaryrefslogtreecommitdiff
path: root/packages/frontend/src/boot/main-boot.ts
diff options
context:
space:
mode:
Diffstat (limited to 'packages/frontend/src/boot/main-boot.ts')
-rw-r--r--packages/frontend/src/boot/main-boot.ts58
1 files changed, 44 insertions, 14 deletions
diff --git a/packages/frontend/src/boot/main-boot.ts b/packages/frontend/src/boot/main-boot.ts
index 395d7d9ad1..eb8a4d30d2 100644
--- a/packages/frontend/src/boot/main-boot.ts
+++ b/packages/frontend/src/boot/main-boot.ts
@@ -4,14 +4,14 @@
*/
import { createApp, defineAsyncComponent, markRaw } from 'vue';
+import { ui } from '@@/js/config.js';
import { common } from './common.js';
import type * as Misskey from 'misskey-js';
-import { ui } from '@@/js/config.js';
import { i18n } from '@/i18n.js';
import { alert, confirm, popup, post, toast } from '@/os.js';
import { useStream } from '@/stream.js';
import * as sound from '@/scripts/sound.js';
-import { $i, signout, updateAccount } from '@/account.js';
+import { $i, signout, updateAccountPartial } from '@/account.js';
import { instance } from '@/instance.js';
import { ColdDeviceStorage, defaultStore } from '@/store.js';
import { reactionPicker } from '@/scripts/reaction-picker.js';
@@ -230,11 +230,41 @@ export async function mainBoot() {
}
if (!claimedAchievements.includes('justPlainLucky')) {
- window.setInterval(() => {
+ let justPlainLuckyTimer: number | null = null;
+ let lastVisibilityChangedAt = Date.now();
+
+ function claimPlainLucky() {
+ if (document.visibilityState !== 'visible') {
+ if (justPlainLuckyTimer != null) window.clearTimeout(justPlainLuckyTimer);
+ return;
+ }
+
if (Math.floor(Math.random() * 20000) === 0) {
claimAchievement('justPlainLucky');
+ } else {
+ justPlainLuckyTimer = window.setTimeout(claimPlainLucky, 1000 * 10);
}
- }, 1000 * 10);
+ }
+
+ window.addEventListener('visibilitychange', () => {
+ const now = Date.now();
+
+ if (document.visibilityState === 'visible') {
+ // タブを高速で切り替えたら取得処理が何度も走るのを防ぐ
+ if ((now - lastVisibilityChangedAt) < 1000 * 10) {
+ justPlainLuckyTimer = window.setTimeout(claimPlainLucky, 1000 * 10);
+ } else {
+ claimPlainLucky();
+ }
+ } else if (justPlainLuckyTimer != null) {
+ window.clearTimeout(justPlainLuckyTimer);
+ justPlainLuckyTimer = null;
+ }
+
+ lastVisibilityChangedAt = now;
+ }, { passive: true });
+
+ claimPlainLucky();
}
if (!claimedAchievements.includes('client30min')) {
@@ -298,13 +328,13 @@ export async function mainBoot() {
// 自分の情報が更新されたとき
main.on('meUpdated', i => {
- updateAccount(i);
+ updateAccountPartial(i);
});
main.on('readAllNotifications', () => {
setFavIconDot(false);
- updateAccount({
+ updateAccountPartial({
hasUnreadNotification: false,
unreadNotificationsCount: 0,
});
@@ -314,39 +344,39 @@ export async function mainBoot() {
attemptShowNotificationDot();
const unreadNotificationsCount = ($i?.unreadNotificationsCount ?? 0) + 1;
- updateAccount({
+ updateAccountPartial({
hasUnreadNotification: true,
unreadNotificationsCount,
});
});
main.on('unreadMention', () => {
- updateAccount({ hasUnreadMentions: true });
+ updateAccountPartial({ hasUnreadMentions: true });
});
main.on('readAllUnreadMentions', () => {
- updateAccount({ hasUnreadMentions: false });
+ updateAccountPartial({ hasUnreadMentions: false });
});
main.on('unreadSpecifiedNote', () => {
- updateAccount({ hasUnreadSpecifiedNotes: true });
+ updateAccountPartial({ hasUnreadSpecifiedNotes: true });
});
main.on('readAllUnreadSpecifiedNotes', () => {
- updateAccount({ hasUnreadSpecifiedNotes: false });
+ updateAccountPartial({ hasUnreadSpecifiedNotes: false });
});
main.on('readAllAntennas', () => {
- updateAccount({ hasUnreadAntenna: false });
+ updateAccountPartial({ hasUnreadAntenna: false });
});
main.on('unreadAntenna', () => {
- updateAccount({ hasUnreadAntenna: true });
+ updateAccountPartial({ hasUnreadAntenna: true });
sound.playMisskeySfx('antenna');
});
main.on('readAllAnnouncements', () => {
- updateAccount({ hasUnreadAnnouncement: false });
+ updateAccountPartial({ hasUnreadAnnouncement: false });
});
// 個人宛てお知らせが発行されたとき