1
0
mirror of https://github.com/hotomoe/hotomoe synced 2024-11-25 15:46:17 +09:00

refactor(client): use setup syntax

This commit is contained in:
syuilo 2022-09-02 00:22:31 +09:00
parent d9ff2dd471
commit 25f4c8688a
3 changed files with 90 additions and 118 deletions

View File

@ -1,8 +1,9 @@
<template>
<div class="vswabwbm" :style="{ zIndex, top: `${y - 64}px`, left: `${x - 64}px` }" :class="{ active }">
<div class="vswabwbm" :style="{ zIndex, top: `${y - 64}px`, left: `${x - 64}px` }">
<svg width="128" height="128" viewBox="0 0 128 128" xmlns="http://www.w3.org/2000/svg">
<circle fill="none" cx="64" cy="64">
<animate attributeName="r"
<animate
attributeName="r"
begin="0s" dur="0.5s"
values="4; 32"
calcMode="spline"
@ -10,7 +11,8 @@
keySplines="0.165, 0.84, 0.44, 1"
repeatCount="1"
/>
<animate attributeName="stroke-width"
<animate
attributeName="stroke-width"
begin="0s" dur="0.5s"
values="16; 0"
calcMode="spline"
@ -21,7 +23,8 @@
</circle>
<g fill="none" fill-rule="evenodd">
<circle v-for="(particle, i) in particles" :key="i" :fill="particle.color">
<animate attributeName="r"
<animate
attributeName="r"
begin="0s" dur="0.8s"
:values="`${particle.size}; 0`"
calcMode="spline"
@ -29,7 +32,8 @@
keySplines="0.165, 0.84, 0.44, 1"
repeatCount="1"
/>
<animate attributeName="cx"
<animate
attributeName="cx"
begin="0s" dur="0.8s"
:values="`${particle.xA}; ${particle.xB}`"
calcMode="spline"
@ -37,7 +41,8 @@
keySplines="0.3, 0.61, 0.355, 1"
repeatCount="1"
/>
<animate attributeName="cy"
<animate
attributeName="cy"
begin="0s" dur="0.8s"
:values="`${particle.yA}; ${particle.yB}`"
calcMode="spline"
@ -51,31 +56,26 @@
</div>
</template>
<script lang="ts">
import { defineComponent, onMounted } from 'vue';
<script lang="ts" setup>
import { onMounted } from 'vue';
import * as os from '@/os';
export default defineComponent({
props: {
x: {
type: Number,
required: true
},
y: {
type: Number,
required: true
},
particle: {
type: Boolean,
required: false,
default: true,
}
},
emits: ['end'],
setup(props, context) {
const props = withDefaults(defineProps<{
x: number;
y: number;
particle?: boolean;
}>(), {
particle: true,
});
const emit = defineEmits<{
(ev: 'end'): void;
}>();
const particles = [];
const origin = 64;
const colors = ['#FF1493', '#00FFFF', '#FFE202'];
const zIndex = os.claimZIndex('high');
if (props.particle) {
for (let i = 0; i < 12; i++) {
@ -88,23 +88,16 @@ export default defineComponent({
yA: origin + (Math.cos(angle) * pos),
xB: origin + (Math.sin(angle) * (pos + velocity)),
yB: origin + (Math.cos(angle) * (pos + velocity)),
color: colors[Math.floor(Math.random() * colors.length)]
color: colors[Math.floor(Math.random() * colors.length)],
});
}
}
onMounted(() => {
window.setTimeout(() => {
context.emit('end');
emit('end');
}, 1100);
});
return {
particles,
zIndex: os.claimZIndex('high'),
};
},
});
</script>
<style lang="scss" scoped>

View File

@ -3,14 +3,29 @@
</div>
</template>
<script lang="ts">
import { defineComponent } from 'vue';
<script lang="ts" setup>
import { } from 'vue';
import * as Acct from 'misskey-js/built/acct';
import * as os from '@/os';
import { mainRouter } from '@/router';
import { i18n } from '@/i18n';
async function follow(user): Promise<void> {
const { canceled } = await os.confirm({
type: 'question',
text: i18n.t('followConfirm', { name: user.name || user.username }),
});
if (canceled) {
window.close();
return;
}
os.apiWithDialog('following/create', {
userId: user.id,
});
}
export default defineComponent({
created() {
const acct = new URL(location.href).searchParams.get('acct');
if (acct == null) return;
@ -22,7 +37,7 @@ export default defineComponent({
});
promise.then(res => {
if (res.type === 'User') {
this.follow(res.object);
follow(res.object);
} else if (res.type === 'Note') {
mainRouter.push(`/notes/${res.object.id}`);
} else {
@ -37,29 +52,9 @@ export default defineComponent({
} else {
promise = os.api('users/show', Acct.parse(acct));
promise.then(user => {
this.follow(user);
follow(user);
});
}
os.promiseDialog(promise, null, null, this.$ts.fetchingAsApObject);
},
methods: {
async follow(user) {
const { canceled } = await os.confirm({
type: 'question',
text: this.$t('followConfirm', { name: user.name || user.username }),
});
if (canceled) {
window.close();
return;
}
os.apiWithDialog('following/create', {
userId: user.id,
});
},
},
});
os.promiseDialog(promise, null, null, i18n.ts.fetchingAsApObject);
</script>

View File

@ -102,22 +102,6 @@ const menu = [{
text: i18n.ts.timeline,
action: setType,
}];
/*
export default defineComponent({
watch: {
mediaOnly() {
(this.$refs.timeline as any).reload();
}
},
methods: {
focus() {
(this.$refs.timeline as any).focus();
}
}
});
*/
</script>
<style lang="scss" scoped>