summaryrefslogtreecommitdiff
path: root/packages/frontend/src/scripts/use-interval.ts
blob: b50e78c3cccfa0a0dab0c2dd0ad57bb1c17ac46c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
/*
 * SPDX-FileCopyrightText: syuilo and misskey-project
 * SPDX-License-Identifier: AGPL-3.0-only
 */

import { onActivated, onDeactivated, onMounted, onUnmounted } from 'vue';

export function useInterval(fn: () => void, interval: number, options: {
	immediate: boolean;
	afterMounted: boolean;
}): (() => void) | undefined {
	if (Number.isNaN(interval)) return;

	let intervalId: number | null = null;

	if (options.afterMounted) {
		onMounted(() => {
			if (options.immediate) fn();
			intervalId = window.setInterval(fn, interval);
		});
	} else {
		if (options.immediate) fn();
		intervalId = window.setInterval(fn, interval);
	}

	const clear = () => {
		if (intervalId) window.clearInterval(intervalId);
		intervalId = null;
	};

	onActivated(() => {
		if (intervalId) return;
		if (options.immediate) fn();
		intervalId = window.setInterval(fn, interval);
	});

	onDeactivated(() => {
		clear();
	});

	onUnmounted(() => {
		clear();
	});

	return clear;
}