mirror of
https://git.joinsharkey.org/Sharkey/Sharkey.git
synced 2024-11-10 07:13:09 +02:00
refactor(client): refactor components
This commit is contained in:
parent
bd8db402e6
commit
92f9392bcf
3 changed files with 93 additions and 119 deletions
|
@ -1,5 +1,6 @@
|
||||||
<template>
|
<template>
|
||||||
<button v-if="canRenote"
|
<button
|
||||||
|
v-if="canRenote"
|
||||||
ref="buttonRef"
|
ref="buttonRef"
|
||||||
class="eddddedb _button canRenote"
|
class="eddddedb _button canRenote"
|
||||||
@click="renote()"
|
@click="renote()"
|
||||||
|
@ -12,8 +13,9 @@
|
||||||
</button>
|
</button>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script lang="ts">
|
<script lang="ts" setup>
|
||||||
import { computed, defineComponent, ref } from 'vue';
|
import { computed, ref } from 'vue';
|
||||||
|
import * as misskey from 'misskey-js';
|
||||||
import XDetails from '@/components/users-tooltip.vue';
|
import XDetails from '@/components/users-tooltip.vue';
|
||||||
import { pleaseLogin } from '@/scripts/please-login';
|
import { pleaseLogin } from '@/scripts/please-login';
|
||||||
import * as os from '@/os';
|
import * as os from '@/os';
|
||||||
|
@ -21,71 +23,55 @@ import { $i } from '@/account';
|
||||||
import { useTooltip } from '@/scripts/use-tooltip';
|
import { useTooltip } from '@/scripts/use-tooltip';
|
||||||
import { i18n } from '@/i18n';
|
import { i18n } from '@/i18n';
|
||||||
|
|
||||||
export default defineComponent({
|
const props = defineProps<{
|
||||||
props: {
|
note: misskey.entities.Note;
|
||||||
count: {
|
count: number;
|
||||||
type: Number,
|
}>();
|
||||||
required: true,
|
|
||||||
},
|
|
||||||
note: {
|
|
||||||
type: Object,
|
|
||||||
required: true,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
|
|
||||||
setup(props) {
|
const buttonRef = ref<HTMLElement>();
|
||||||
const buttonRef = ref<HTMLElement>();
|
|
||||||
|
|
||||||
const canRenote = computed(() => ['public', 'home'].includes(props.note.visibility) || props.note.userId === $i.id);
|
const canRenote = computed(() => ['public', 'home'].includes(props.note.visibility) || props.note.userId === $i.id);
|
||||||
|
|
||||||
useTooltip(buttonRef, async (showing) => {
|
useTooltip(buttonRef, async (showing) => {
|
||||||
const renotes = await os.api('notes/renotes', {
|
const renotes = await os.api('notes/renotes', {
|
||||||
noteId: props.note.id,
|
noteId: props.note.id,
|
||||||
limit: 11
|
limit: 11,
|
||||||
});
|
});
|
||||||
|
|
||||||
const users = renotes.map(x => x.user);
|
const users = renotes.map(x => x.user);
|
||||||
|
|
||||||
if (users.length < 1) return;
|
if (users.length < 1) return;
|
||||||
|
|
||||||
os.popup(XDetails, {
|
os.popup(XDetails, {
|
||||||
showing,
|
showing,
|
||||||
users,
|
users,
|
||||||
count: props.count,
|
count: props.count,
|
||||||
targetElement: buttonRef.value
|
targetElement: buttonRef.value,
|
||||||
}, {}, 'closed');
|
}, {}, 'closed');
|
||||||
});
|
|
||||||
|
|
||||||
const renote = (viaKeyboard = false) => {
|
|
||||||
pleaseLogin();
|
|
||||||
os.popupMenu([{
|
|
||||||
text: i18n.ts.renote,
|
|
||||||
icon: 'fas fa-retweet',
|
|
||||||
action: () => {
|
|
||||||
os.api('notes/create', {
|
|
||||||
renoteId: props.note.id
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}, {
|
|
||||||
text: i18n.ts.quote,
|
|
||||||
icon: 'fas fa-quote-right',
|
|
||||||
action: () => {
|
|
||||||
os.post({
|
|
||||||
renote: props.note,
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}], buttonRef.value, {
|
|
||||||
viaKeyboard
|
|
||||||
});
|
|
||||||
};
|
|
||||||
|
|
||||||
return {
|
|
||||||
buttonRef,
|
|
||||||
canRenote,
|
|
||||||
renote,
|
|
||||||
};
|
|
||||||
},
|
|
||||||
});
|
});
|
||||||
|
|
||||||
|
const renote = (viaKeyboard = false) => {
|
||||||
|
pleaseLogin();
|
||||||
|
os.popupMenu([{
|
||||||
|
text: i18n.ts.renote,
|
||||||
|
icon: 'fas fa-retweet',
|
||||||
|
action: () => {
|
||||||
|
os.api('notes/create', {
|
||||||
|
renoteId: props.note.id,
|
||||||
|
});
|
||||||
|
},
|
||||||
|
}, {
|
||||||
|
text: i18n.ts.quote,
|
||||||
|
icon: 'fas fa-quote-right',
|
||||||
|
action: () => {
|
||||||
|
os.post({
|
||||||
|
renote: props.note,
|
||||||
|
});
|
||||||
|
},
|
||||||
|
}], buttonRef.value, {
|
||||||
|
viaKeyboard,
|
||||||
|
});
|
||||||
|
};
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style lang="scss" scoped>
|
<style lang="scss" scoped>
|
||||||
|
|
|
@ -63,63 +63,51 @@
|
||||||
</span>
|
</span>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script lang="ts">
|
<script lang="ts" setup>
|
||||||
import { defineComponent, onMounted, onUnmounted, ref } from 'vue';
|
import { onMounted, onUnmounted, ref } from 'vue';
|
||||||
import * as os from '@/os';
|
|
||||||
|
|
||||||
export default defineComponent({
|
const particles = ref([]);
|
||||||
setup() {
|
const el = ref<HTMLElement>();
|
||||||
const particles = ref([]);
|
const width = ref(0);
|
||||||
const el = ref<HTMLElement>();
|
const height = ref(0);
|
||||||
const width = ref(0);
|
const colors = ['#FF1493', '#00FFFF', '#FFE202', '#FFE202', '#FFE202'];
|
||||||
const height = ref(0);
|
let stop = false;
|
||||||
const colors = ['#FF1493', '#00FFFF', '#FFE202', '#FFE202', '#FFE202'];
|
let ro: ResizeObserver | undefined;
|
||||||
let stop = false;
|
|
||||||
let ro: ResizeObserver | undefined;
|
|
||||||
|
|
||||||
onMounted(() => {
|
onMounted(() => {
|
||||||
ro = new ResizeObserver((entries, observer) => {
|
ro = new ResizeObserver((entries, observer) => {
|
||||||
width.value = el.value?.offsetWidth + 64;
|
width.value = el.value?.offsetWidth + 64;
|
||||||
height.value = el.value?.offsetHeight + 64;
|
height.value = el.value?.offsetHeight + 64;
|
||||||
});
|
});
|
||||||
ro.observe(el.value);
|
ro.observe(el.value);
|
||||||
const add = () => {
|
const add = () => {
|
||||||
if (stop) return;
|
if (stop) return;
|
||||||
const x = (Math.random() * (width.value - 64));
|
const x = (Math.random() * (width.value - 64));
|
||||||
const y = (Math.random() * (height.value - 64));
|
const y = (Math.random() * (height.value - 64));
|
||||||
const sizeFactor = Math.random();
|
const sizeFactor = Math.random();
|
||||||
const particle = {
|
const particle = {
|
||||||
id: Math.random().toString(),
|
id: Math.random().toString(),
|
||||||
x,
|
x,
|
||||||
y,
|
y,
|
||||||
size: 0.2 + ((sizeFactor / 10) * 3),
|
size: 0.2 + ((sizeFactor / 10) * 3),
|
||||||
dur: 1000 + (sizeFactor * 1000),
|
dur: 1000 + (sizeFactor * 1000),
|
||||||
color: colors[Math.floor(Math.random() * colors.length)],
|
color: colors[Math.floor(Math.random() * colors.length)],
|
||||||
};
|
|
||||||
particles.value.push(particle);
|
|
||||||
window.setTimeout(() => {
|
|
||||||
particles.value = particles.value.filter(x => x.id !== particle.id);
|
|
||||||
}, particle.dur - 100);
|
|
||||||
|
|
||||||
window.setTimeout(() => {
|
|
||||||
add();
|
|
||||||
}, 500 + (Math.random() * 500));
|
|
||||||
};
|
|
||||||
add();
|
|
||||||
});
|
|
||||||
|
|
||||||
onUnmounted(() => {
|
|
||||||
if (ro) ro.disconnect();
|
|
||||||
stop = true;
|
|
||||||
});
|
|
||||||
|
|
||||||
return {
|
|
||||||
el,
|
|
||||||
width,
|
|
||||||
height,
|
|
||||||
particles,
|
|
||||||
};
|
};
|
||||||
},
|
particles.value.push(particle);
|
||||||
|
window.setTimeout(() => {
|
||||||
|
particles.value = particles.value.filter(x => x.id !== particle.id);
|
||||||
|
}, particle.dur - 100);
|
||||||
|
|
||||||
|
window.setTimeout(() => {
|
||||||
|
add();
|
||||||
|
}, 500 + (Math.random() * 500));
|
||||||
|
};
|
||||||
|
add();
|
||||||
|
});
|
||||||
|
|
||||||
|
onUnmounted(() => {
|
||||||
|
if (ro) ro.disconnect();
|
||||||
|
stop = true;
|
||||||
});
|
});
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
|
|
|
@ -18,13 +18,13 @@ export default defineComponent({
|
||||||
disabled: this.modelValue === option.props.value,
|
disabled: this.modelValue === option.props.value,
|
||||||
onClick: () => {
|
onClick: () => {
|
||||||
this.$emit('update:modelValue', option.props.value);
|
this.$emit('update:modelValue', option.props.value);
|
||||||
}
|
},
|
||||||
}, option.children), [
|
}, option.children), [
|
||||||
[resolveDirective('click-anime')]
|
[resolveDirective('click-anime')],
|
||||||
]))), [
|
]))), [
|
||||||
[resolveDirective('size'), { max: [500] }]
|
[resolveDirective('size'), { max: [500] }],
|
||||||
]);
|
]);
|
||||||
}
|
},
|
||||||
});
|
});
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue