diff options
| author | かっこかり <67428053+kakkokari-gtyih@users.noreply.github.com> | 2023-11-30 14:49:26 +0900 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2023-11-30 14:49:26 +0900 |
| commit | b05d71fabff55ac5653994a1188c6db88048e8ee (patch) | |
| tree | 1d2b60b73ac5c77ee37872f3d45f77144795afea /packages/frontend/src/widgets | |
| parent | enhance(dev): 開発モード時にlocaleと型定義が自動的に再生成... (diff) | |
| download | misskey-b05d71fabff55ac5653994a1188c6db88048e8ee.tar.gz misskey-b05d71fabff55ac5653994a1188c6db88048e8ee.tar.bz2 misskey-b05d71fabff55ac5653994a1188c6db88048e8ee.zip | |
feat(frontend): 今日誕生日のフォロー中のユーザーを一覧表示できるウィジェットを追加 (#12450)
* (add) 今日誕生日のフォロイー一覧表示
* Update Changelog
* Update Changelog
* 実装漏れ
* create index
* (fix) index
Diffstat (limited to 'packages/frontend/src/widgets')
| -rw-r--r-- | packages/frontend/src/widgets/WidgetBirthdayFollowings.vue | 127 | ||||
| -rw-r--r-- | packages/frontend/src/widgets/index.ts | 2 |
2 files changed, 129 insertions, 0 deletions
diff --git a/packages/frontend/src/widgets/WidgetBirthdayFollowings.vue b/packages/frontend/src/widgets/WidgetBirthdayFollowings.vue new file mode 100644 index 0000000000..7c4455516d --- /dev/null +++ b/packages/frontend/src/widgets/WidgetBirthdayFollowings.vue @@ -0,0 +1,127 @@ +<!-- +SPDX-FileCopyrightText: syuilo and other misskey contributors +SPDX-License-Identifier: AGPL-3.0-only +--> + +<template> +<MkContainer :showHeader="widgetProps.showHeader" class="mkw-bdayfollowings"> + <template #icon><i class="ti ti-cake"></i></template> + <template #header>{{ i18n.ts._widgets.birthdayFollowings }}</template> + + <div :class="$style.bdayFRoot"> + <MkLoading v-if="fetching"/> + <div v-else-if="users.length > 0" :class="$style.bdayFGrid"> + <MkAvatar v-for="user in users" :key="user.id" :user="user.followee" link preview></MkAvatar> + </div> + <div v-else :class="$style.bdayFFallback"> + <img :src="infoImageUrl" class="_ghost" :class="$style.bdayFFallbackImage"/> + <div>{{ i18n.ts.nothing }}</div> + </div> + </div> +</MkContainer> +</template> + +<script lang="ts" setup> +import { ref } from 'vue'; +import * as Misskey from 'misskey-js'; +import { useWidgetPropsManager, WidgetComponentEmits, WidgetComponentExpose, WidgetComponentProps } from './widget.js'; +import { GetFormResultType } from '@/scripts/form.js'; +import MkContainer from '@/components/MkContainer.vue'; +import * as os from '@/os.js'; +import { useInterval } from '@/scripts/use-interval.js'; +import { i18n } from '@/i18n.js'; +import { infoImageUrl } from '@/instance.js'; +import { $i } from '@/account.js'; + +const name = i18n.ts._widgets.birthdayFollowings; + +const widgetPropsDef = { + showHeader: { + type: 'boolean' as const, + default: true, + }, +}; + +type WidgetProps = GetFormResultType<typeof widgetPropsDef>; + +const props = defineProps<WidgetComponentProps<WidgetProps>>(); +const emit = defineEmits<WidgetComponentEmits<WidgetProps>>(); + +const { widgetProps, configure } = useWidgetPropsManager(name, + widgetPropsDef, + props, + emit, +); + +const users = ref<Misskey.entities.FollowingFolloweePopulated[]>([]); +const fetching = ref(true); +let lastFetchedAt = '1970-01-01'; + +const fetch = () => { + if (!$i) { + users.value = []; + fetching.value = false; + return; + } + + const lfAtD = new Date(lastFetchedAt); + lfAtD.setHours(0, 0, 0, 0); + const now = new Date(); + now.setHours(0, 0, 0, 0); + + if (now > lfAtD) { + os.api('users/following', { + limit: 18, + birthday: now.toISOString(), + userId: $i.id, + }).then(res => { + users.value = res; + fetching.value = false; + }); + + lastFetchedAt = now.toISOString(); + } +}; + +useInterval(fetch, 1000 * 60, { + immediate: true, + afterMounted: true, +}); + +defineExpose<WidgetComponentExpose>({ + name, + configure, + id: props.widget ? props.widget.id : null, +}); +</script> + +<style lang="scss" module> +.bdayFRoot { + overflow: hidden; + min-height: calc(calc(calc(50px * 3) - 8px) + calc(var(--margin) * 2)); +} +.bdayFGrid { + display: grid; + grid-template-columns: repeat(6, 42px); + grid-template-rows: repeat(3, 42px); + place-content: center; + gap: 8px; + margin: var(--margin) auto; +} + +.bdayFFallback { + height: 100%; + display: flex; + flex-direction: column; + justify-content: center; + align-items: center; +} + +.bdayFFallbackImage { + height: 96px; + width: auto; + max-width: 90%; + margin-bottom: 8px; + border-radius: var(--radius); +} +</style> diff --git a/packages/frontend/src/widgets/index.ts b/packages/frontend/src/widgets/index.ts index 405c49ab06..36925e1bd8 100644 --- a/packages/frontend/src/widgets/index.ts +++ b/packages/frontend/src/widgets/index.ts @@ -33,6 +33,7 @@ export default function(app: App) { app.component('WidgetAichan', defineAsyncComponent(() => import('./WidgetAichan.vue'))); app.component('WidgetUserList', defineAsyncComponent(() => import('./WidgetUserList.vue'))); app.component('WidgetClicker', defineAsyncComponent(() => import('./WidgetClicker.vue'))); + app.component('WidgetBirthdayFollowings', defineAsyncComponent(() => import('./WidgetBirthdayFollowings.vue'))); } export const widgets = [ @@ -63,4 +64,5 @@ export const widgets = [ 'aichan', 'userList', 'clicker', + 'birthdayFollowings', ]; |