diff options
| author | かっこかり <67428053+kakkokari-gtyih@users.noreply.github.com> | 2025-09-12 17:12:50 +0900 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2025-09-12 17:12:50 +0900 |
| commit | aebc3f781e32c40faf2ee7fa5a23042e6382ce2e (patch) | |
| tree | 6b92541ce8bedc69f824c8d119600b4c3ceba6b7 /packages/frontend/src/components | |
| parent | chore(gh): add frontend-builder to renovate (diff) | |
| download | misskey-aebc3f781e32c40faf2ee7fa5a23042e6382ce2e.tar.gz misskey-aebc3f781e32c40faf2ee7fa5a23042e6382ce2e.tar.bz2 misskey-aebc3f781e32c40faf2ee7fa5a23042e6382ce2e.zip | |
perf(frontend): 低精度な現在時刻を一か所で管理するように (#16479)
* perf(frontend): 低精度な現在時刻を一か所で管理するように
* lint
* fix
* remove unused imports
* fix
* Update Changelog
* [ci skip] typo
* enhance: カレンダーウィジェットの日付変更は時間通りに行うように
* [ci skip] fix
Diffstat (limited to 'packages/frontend/src/components')
| -rw-r--r-- | packages/frontend/src/components/MkPoll.vue | 37 | ||||
| -rw-r--r-- | packages/frontend/src/components/global/MkTime.vue | 30 |
2 files changed, 23 insertions, 44 deletions
diff --git a/packages/frontend/src/components/MkPoll.vue b/packages/frontend/src/components/MkPoll.vue index 359ee08812..76c65397ae 100644 --- a/packages/frontend/src/components/MkPoll.vue +++ b/packages/frontend/src/components/MkPoll.vue @@ -27,16 +27,16 @@ SPDX-License-Identifier: AGPL-3.0-only </template> <script lang="ts" setup> -import { computed, ref } from 'vue'; +import { computed, ref, watch } from 'vue'; import * as Misskey from 'misskey-js'; import { host } from '@@/js/config.js'; -import { useInterval } from '@@/js/use-interval.js'; import type { OpenOnRemoteOptions } from '@/utility/please-login.js'; import { sum } from '@/utility/array.js'; import { pleaseLogin } from '@/utility/please-login.js'; import * as os from '@/os.js'; import { misskeyApi } from '@/utility/misskey-api.js'; import { i18n } from '@/i18n.js'; +import { useLowresTime } from '@/composables/use-lowres-time.js'; const props = defineProps<{ noteId: string; @@ -48,7 +48,21 @@ const props = defineProps<{ author?: Misskey.entities.UserLite; }>(); -const remaining = ref(-1); +const now = useLowresTime(); + +const expiresAtTime = computed(() => props.expiresAt ? new Date(props.expiresAt).getTime() : null); + +const remaining = computed(() => { + if (expiresAtTime.value == null) return -1; + return Math.floor(Math.max(expiresAtTime.value - now.value, 0) / 1000); +}); + +const remainingWatchStop = watch(remaining, (to) => { + if (to <= 0) { + showResult.value = true; + remainingWatchStop(); + } +}, { immediate: true }); const total = computed(() => sum(props.choices.map(x => x.votes))); const closed = computed(() => remaining.value === 0); @@ -71,22 +85,7 @@ const pleaseLoginContext = computed<OpenOnRemoteOptions>(() => ({ url: `https://${host}/notes/${props.noteId}`, })); -// 期限付きアンケート -if (props.expiresAt) { - const tick = () => { - remaining.value = Math.floor(Math.max(new Date(props.expiresAt!).getTime() - Date.now(), 0) / 1000); - if (remaining.value === 0) { - showResult.value = true; - } - }; - - useInterval(tick, 3000, { - immediate: true, - afterMounted: false, - }); -} - -const vote = async (id) => { +const vote = async (id: number) => { if (props.readOnly || closed.value || isVoted.value) return; pleaseLogin({ openOnRemote: pleaseLoginContext.value }); diff --git a/packages/frontend/src/components/global/MkTime.vue b/packages/frontend/src/components/global/MkTime.vue index f600f7eed2..88cccb99a2 100644 --- a/packages/frontend/src/components/global/MkTime.vue +++ b/packages/frontend/src/components/global/MkTime.vue @@ -14,9 +14,10 @@ SPDX-License-Identifier: AGPL-3.0-only <script lang="ts" setup> import isChromatic from 'chromatic/isChromatic'; -import { onMounted, onUnmounted, ref, computed } from 'vue'; +import { computed } from 'vue'; import { i18n } from '@/i18n.js'; import { dateTimeFormat } from '@@/js/intl-const.js'; +import { useLowresTime } from '@/composables/use-lowres-time.js'; const props = withDefaults(defineProps<{ time: Date | string | number | null; @@ -46,8 +47,10 @@ const _time = props.time == null ? NaN : getDateSafe(props.time).getTime(); const invalid = Number.isNaN(_time); const absolute = !invalid ? dateTimeFormat.format(_time) : i18n.ts._ago.invalid; +const actualNow = useLowresTime(); +const now = computed(() => (props.origin ? props.origin.getTime() : actualNow.value)); + // eslint-disable-next-line vue/no-setup-props-reactivity-loss -const now = ref(props.origin?.getTime() ?? Date.now()); const ago = computed(() => (now.value - _time) / 1000/*ms*/); const relative = computed<string>(() => { @@ -72,29 +75,6 @@ const relative = computed<string>(() => { i18n.tsx._timeIn.seconds({ n: (~~(-ago.value % 60)).toString() }) ); }); - -let tickId: number; -let currentInterval: number; - -function tick() { - now.value = Date.now(); - const nextInterval = ago.value < 60 ? 10000 : ago.value < 3600 ? 60000 : 180000; - - if (currentInterval !== nextInterval) { - if (tickId) window.clearInterval(tickId); - currentInterval = nextInterval; - tickId = window.setInterval(tick, nextInterval); - } -} - -if (!invalid && props.origin === null && (props.mode === 'relative' || props.mode === 'detail')) { - onMounted(() => { - tick(); - }); - onUnmounted(() => { - if (tickId) window.clearInterval(tickId); - }); -} </script> <style lang="scss" module> |