diff options
| author | かっこかり <67428053+kakkokari-gtyih@users.noreply.github.com> | 2025-12-31 22:33:26 +0900 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2025-12-31 22:33:26 +0900 |
| commit | 16ffd88ecc16c394fd8bc532c61e6be45b053ca5 (patch) | |
| tree | 0b02678fefb78eafa1fae85aaafeba078fc21870 /packages/frontend/src/widgets/WidgetBirthdayFollowings.user.vue | |
| parent | fix(frontend): ウィジェットの設定画面のプレビューが利用... (diff) | |
| download | misskey-16ffd88ecc16c394fd8bc532c61e6be45b053ca5.tar.gz misskey-16ffd88ecc16c394fd8bc532c61e6be45b053ca5.tar.bz2 misskey-16ffd88ecc16c394fd8bc532c61e6be45b053ca5.zip | |
enhance: 誕生日のユーザーウィジェットで、今日だけに限らず、直近の誕生日ユーザーを表示できるように (#13637)
* enhance(frontend): 「今日誕生日のフォロー中ユーザー」ウィジェットをリファクタリング
(cherry picked from commit 24652b9364fd7d898ac176e0da3bb6e957f72328)
* fix(backend): 年越しの時期で誕生日検索クエリーが誤動作する問題を修正 (MisskeyIO#577)
(cherry picked from commit 38581006be35b4725b235be9f178d2c0c9c5af33)
* fix
* spdx
* delete birthday param on users/following api
* 名称を一本化
* Update Changelog
* Update Changelog
* fix(frontend/WidgetBirthdayFollowings): ユーザーの名前が長いと投稿ボタンがはみ出てしまう問題を修正 (MisskeyIO#582)
(cherry picked from commit fa47a545b1b770e5f3e52bb2798d1104da5dd244)
* use module css
* default 3day
* Revert "delete birthday param on users/following api"
This reverts commit a47456c1c43410409ed3607ae1d6ebb69a82324b.
* Update Changelog
* 日付が1ヶ月ズレている問題を修正?
* fix: 日付関連のバグを修正
Co-authored-by: taiy <53635909+taiyme@users.noreply.github.com>
* build misskey-js types
* add comment
* Update CHANGELOG.md
* migrate
* change migration
* UPdate Changelog
* fix: revert unnecessary changes
* :art:
* i18n
* fix
* update changelog
* :art:
* fix lint
* refactor: remove unnecessary classes
* fix
* fix
---------
Co-authored-by: まっちゃとーにゅ <17376330+u1-liquid@users.noreply.github.com>
Co-authored-by: taiy <53635909+taiyme@users.noreply.github.com>
Diffstat (limited to 'packages/frontend/src/widgets/WidgetBirthdayFollowings.user.vue')
| -rw-r--r-- | packages/frontend/src/widgets/WidgetBirthdayFollowings.user.vue | 86 |
1 files changed, 86 insertions, 0 deletions
diff --git a/packages/frontend/src/widgets/WidgetBirthdayFollowings.user.vue b/packages/frontend/src/widgets/WidgetBirthdayFollowings.user.vue new file mode 100644 index 0000000000..dc8ffcc818 --- /dev/null +++ b/packages/frontend/src/widgets/WidgetBirthdayFollowings.user.vue @@ -0,0 +1,86 @@ +<!-- +SPDX-FileCopyrightText: syuilo and misskey-project +SPDX-License-Identifier: AGPL-3.0-only +--> + +<template> +<div :class="$style.root"> + <MkA :to="userPage(item.user)" style="overflow: clip;"> + <MkUserCardMini :user="item.user" :withChart="false" style="text-overflow: ellipsis; background: inherit; border-radius: unset;"> + <template #sub> + <span>{{ countdownDate }}</span> + <span> / </span> + <span class="_monospace">@{{ acct(item.user) }}</span> + </template> + </MkUserCardMini> + </MkA> + <button v-tooltip.noDelay="i18n.ts.note" class="_button" :class="$style.post" @click="os.post({initialText: `@${item.user.username}${item.user.host ? `@${item.user.host}` : ''} `})"> + <i class="ti-fw ti ti-confetti" :class="$style.postIcon"></i> + </button> +</div> +</template> + +<script setup lang="ts"> +import { computed } from 'vue'; +import * as Misskey from 'misskey-js'; +import MkUserCardMini from '@/components/MkUserCardMini.vue'; +import * as os from '@/os.js'; +import { i18n } from '@/i18n.js'; +import { useLowresTime } from '@/composables/use-lowres-time.js'; +import { userPage, acct } from '@/filters/user.js'; + +const props = defineProps<{ + item: Misskey.entities.UsersGetFollowingBirthdayUsersResponse[number]; +}>(); + +const now = useLowresTime(); +const nowDate = computed(() => { + const date = new Date(now.value); + date.setHours(0, 0, 0, 0); + return date; +}); +const birthdayDate = computed(() => { + const [year, month, day] = props.item.birthday.split('-').map((v) => parseInt(v, 10)); + return new Date(year, month - 1, day, 0, 0, 0, 0); +}); + +const countdownDate = computed(() => { + const days = Math.floor((birthdayDate.value.getTime() - nowDate.value.getTime()) / (1000 * 60 * 60 * 24)); + if (days === 0) { + return i18n.ts.today; + } else if (days > 0) { + return i18n.tsx._timeIn.days({ n: days }); + } else { + return i18n.tsx._ago.daysAgo({ n: Math.abs(days) }); + } +}); +</script> + +<style lang="scss" module> +.root { + box-sizing: border-box; + display: grid; + align-items: center; + grid-template-columns: auto 56px; +} + +.post { + display: flex; + justify-content: center; + align-items: center; + height: 40px; + width: 40px; + margin-right: 16px; + aspect-ratio: 1/1; + border-radius: 100%; + background: linear-gradient(90deg, var(--MI_THEME-buttonGradateA), var(--MI_THEME-buttonGradateB)); + + &:hover { + background: linear-gradient(90deg, hsl(from var(--MI_THEME-accent) h s calc(l + 5)), hsl(from var(--MI_THEME-accent) h s calc(l + 5))); + } +} + +.postIcon { + color: var(--MI_THEME-fgOnAccent); +} +</style> |