summaryrefslogtreecommitdiff
path: root/packages/client/src/widgets/activity.vue
diff options
context:
space:
mode:
Diffstat (limited to 'packages/client/src/widgets/activity.vue')
-rw-r--r--packages/client/src/widgets/activity.vue125
1 files changed, 66 insertions, 59 deletions
diff --git a/packages/client/src/widgets/activity.vue b/packages/client/src/widgets/activity.vue
index d322f4758a..acbbb7a97a 100644
--- a/packages/client/src/widgets/activity.vue
+++ b/packages/client/src/widgets/activity.vue
@@ -1,82 +1,89 @@
<template>
-<MkContainer :show-header="props.showHeader" :naked="props.transparent">
+<MkContainer :show-header="widgetProps.showHeader" :naked="widgetProps.transparent">
<template #header><i class="fas fa-chart-bar"></i>{{ $ts._widgets.activity }}</template>
<template #func><button class="_button" @click="toggleView()"><i class="fas fa-sort"></i></button></template>
<div>
<MkLoading v-if="fetching"/>
<template v-else>
- <XCalendar v-show="props.view === 0" :data="[].concat(activity)"/>
- <XChart v-show="props.view === 1" :data="[].concat(activity)"/>
+ <XCalendar v-show="widgetProps.view === 0" :data="[].concat(activity)"/>
+ <XChart v-show="widgetProps.view === 1" :data="[].concat(activity)"/>
</template>
</div>
</MkContainer>
</template>
-<script lang="ts">
-import { defineComponent } from 'vue';
+<script lang="ts" setup>
+import { onMounted, onUnmounted, reactive, ref, watch } from 'vue';
+import { GetFormResultType } from '@/scripts/form';
+import { useWidgetPropsManager, Widget, WidgetComponentEmits, WidgetComponentExpose, WidgetComponentProps } from './widget';
+import * as os from '@/os';
import MkContainer from '@/components/ui/container.vue';
-import define from './define';
import XCalendar from './activity.calendar.vue';
import XChart from './activity.chart.vue';
-import * as os from '@/os';
+import { $i } from '@/account';
-const widget = define({
- name: 'activity',
- props: () => ({
- showHeader: {
- type: 'boolean',
- default: true,
- },
- transparent: {
- type: 'boolean',
- default: false,
- },
- view: {
- type: 'number',
- default: 0,
- hidden: true,
- },
- })
-});
+const name = 'activity';
-export default defineComponent({
- components: {
- MkContainer,
- XCalendar,
- XChart,
+const widgetPropsDef = {
+ showHeader: {
+ type: 'boolean' as const,
+ default: true,
},
- extends: widget,
- data() {
- return {
- fetching: true,
- activity: null,
- };
+ transparent: {
+ type: 'boolean' as const,
+ default: false,
},
- mounted() {
- os.api('charts/user/notes', {
- userId: this.$i.id,
- span: 'day',
- limit: 7 * 21
- }).then(activity => {
- this.activity = activity.diffs.normal.map((_, i) => ({
- total: activity.diffs.normal[i] + activity.diffs.reply[i] + activity.diffs.renote[i],
- notes: activity.diffs.normal[i],
- replies: activity.diffs.reply[i],
- renotes: activity.diffs.renote[i]
- }));
- this.fetching = false;
- });
+ view: {
+ type: 'number' as const,
+ default: 0,
+ hidden: true,
},
- methods: {
- toggleView() {
- if (this.props.view === 1) {
- this.props.view = 0;
- } else {
- this.props.view++;
- }
- this.save();
- }
+};
+
+type WidgetProps = GetFormResultType<typeof widgetPropsDef>;
+
+// 現時点ではvueの制限によりimportしたtypeをジェネリックに渡せない
+//const props = defineProps<WidgetComponentProps<WidgetProps>>();
+//const emit = defineEmits<WidgetComponentEmits<WidgetProps>>();
+const props = defineProps<{ widget?: Widget<WidgetProps>; }>();
+const emit = defineEmits<{ (e: 'updateProps', props: WidgetProps); }>();
+
+const { widgetProps, configure, save } = useWidgetPropsManager(name,
+ widgetPropsDef,
+ props,
+ emit,
+);
+
+const activity = ref(null);
+const fetching = ref(true);
+
+const toggleView = () => {
+ if (widgetProps.view === 1) {
+ widgetProps.view = 0;
+ } else {
+ widgetProps.view++;
}
+ save();
+};
+
+os.api('charts/user/notes', {
+ userId: $i.id,
+ span: 'day',
+ limit: 7 * 21,
+}).then(res => {
+ activity.value = res.diffs.normal.map((_, i) => ({
+ total: res.diffs.normal[i] + res.diffs.reply[i] + res.diffs.renote[i],
+ notes: res.diffs.normal[i],
+ replies: res.diffs.reply[i],
+ renotes: res.diffs.renote[i]
+ }));
+ fetching.value = false;
+});
+
+defineExpose<WidgetComponentExpose>({
+ name,
+ configure,
+ id: props.widget ? props.widget.id : null,
});
</script>