summaryrefslogtreecommitdiff
path: root/packages/frontend/src
diff options
context:
space:
mode:
authorsyuilo <Syuilotan@yahoo.co.jp>2023-01-06 13:25:49 +0900
committersyuilo <Syuilotan@yahoo.co.jp>2023-01-06 13:25:49 +0900
commitdc5b4a04026f88367e484933334028ac417c9d67 (patch)
tree5d11c6a314c1ada9f28842a49def823dbaec4d8d /packages/frontend/src
parentUpdate CHANGELOG.md (diff)
downloadmisskey-dc5b4a04026f88367e484933334028ac417c9d67.tar.gz
misskey-dc5b4a04026f88367e484933334028ac417c9d67.tar.bz2
misskey-dc5b4a04026f88367e484933334028ac417c9d67.zip
enhance(client): show fireworks when visit user who today is birthday
Resolve #9476
Diffstat (limited to 'packages/frontend/src')
-rw-r--r--packages/frontend/src/pages/user/home.vue34
1 files changed, 34 insertions, 0 deletions
diff --git a/packages/frontend/src/pages/user/home.vue b/packages/frontend/src/pages/user/home.vue
index 11a7ee3b8a..d9d7fc826c 100644
--- a/packages/frontend/src/pages/user/home.vue
+++ b/packages/frontend/src/pages/user/home.vue
@@ -110,6 +110,7 @@
<script lang="ts" setup>
import { defineAsyncComponent, computed, inject, onMounted, onUnmounted, watch } from 'vue';
import calcAge from 's-age';
+import confetti from 'canvas-confetti';
import * as misskey from 'misskey-js';
import XUserTimeline from './index.timeline.vue';
import XNote from '@/components/MkNote.vue';
@@ -155,6 +156,29 @@ const age = $computed(() => {
return calcAge(props.user.birthday);
});
+function birthdayEffect() {
+ const duration = 1000 * 5;
+ const animationEnd = Date.now() + duration;
+ const defaults = { startVelocity: 30, spread: 360, ticks: 60, zIndex: os.claimZIndex('high') };
+
+ function randomInRange(min, max) {
+ return Math.random() * (max - min) + min;
+ }
+
+ const interval = setInterval(() => {
+ const timeLeft = animationEnd - Date.now();
+
+ if (timeLeft <= 0) {
+ return clearInterval(interval);
+ }
+
+ const particleCount = 50 * (timeLeft / duration);
+ // since particles fall down, start a bit higher than random
+ confetti(Object.assign({}, defaults, { particleCount, origin: { x: randomInRange(0.1, 0.3), y: Math.random() - 0.2 } }));
+ confetti(Object.assign({}, defaults, { particleCount, origin: { x: randomInRange(0.7, 0.9), y: Math.random() - 0.2 } }));
+ }, 250);
+}
+
function menu(ev) {
os.popupMenu(getUserMenu(props.user, router), ev.currentTarget ?? ev.target);
}
@@ -180,6 +204,16 @@ function parallax() {
onMounted(() => {
window.requestAnimationFrame(parallaxLoop);
narrow = rootEl!.clientWidth < 1000;
+
+ if (props.user.birthday) {
+ const m = new Date().getMonth() + 1;
+ const d = new Date().getDate();
+ const bm = parseInt(props.user.birthday.split('-')[1]);
+ const bd = parseInt(props.user.birthday.split('-')[2]);
+ if (m === bm && d === bd) {
+ birthdayEffect();
+ }
+ }
});
onUnmounted(() => {