summaryrefslogtreecommitdiff
path: root/packages/frontend/src
diff options
context:
space:
mode:
authorかっこかり <67428053+kakkokari-gtyih@users.noreply.github.com>2023-11-30 14:49:26 +0900
committerGitHub <noreply@github.com>2023-11-30 14:49:26 +0900
commitb05d71fabff55ac5653994a1188c6db88048e8ee (patch)
tree1d2b60b73ac5c77ee37872f3d45f77144795afea /packages/frontend/src
parentenhance(dev): 開発モード時にlocaleと型定義が自動的に再生成... (diff)
downloadmisskey-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')
-rw-r--r--packages/frontend/src/widgets/WidgetBirthdayFollowings.vue127
-rw-r--r--packages/frontend/src/widgets/index.ts2
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',
];