Sharkey/packages/client/src/pages/clip.vue

129 lines
2.7 KiB
Vue
Raw Normal View History

2020-11-15 04:34:47 +01:00
<template>
<MkSpacer :content-max="800">
<div v-if="clip">
<div class="okzinsic _panel">
<div v-if="clip.description" class="description">
<Mfm :text="clip.description" :is-note="false" :i="$i"/>
</div>
<div class="user">
<MkAvatar :user="clip.user" class="avatar" :show-indicator="true"/> <MkUserName :user="clip.user" :nowrap="false"/>
</div>
2020-11-15 04:34:47 +01:00
</div>
<XNotes :pagination="pagination" :detail="true"/>
</div>
</MkSpacer>
2020-11-15 04:34:47 +01:00
</template>
<script lang="ts" setup>
import { computed, watch, provide } from 'vue';
import * as misskey from 'misskey-js';
2021-11-11 18:02:25 +01:00
import XNotes from '@/components/notes.vue';
import { $i } from '@/account';
import { i18n } from '@/i18n';
2021-11-11 18:02:25 +01:00
import * as os from '@/os';
import * as symbols from '@/symbols';
2020-11-15 04:34:47 +01:00
const props = defineProps<{
clipId: string,
}>();
let clip: misskey.entities.Clip = $ref<misskey.entities.Clip>();
const pagination = {
endpoint: 'clips/notes' as const,
limit: 10,
params: computed(() => ({
clipId: props.clipId,
})),
};
const isOwned: boolean | null = $computed<boolean | null>(() => $i && clip && ($i.id === clip.userId));
watch(() => props.clipId, async () => {
clip = await os.api('clips/show', {
clipId: props.clipId,
});
}, {
immediate: true,
});
provide('cullentClipPage', $$(clip));
defineExpose({
[symbols.PAGE_INFO]: computed(() => clip ? {
title: clip.name,
icon: 'fas fa-paperclip',
bg: 'var(--bg)',
actions: isOwned ? [{
icon: 'fas fa-pencil-alt',
text: i18n.ts.edit,
handler: async (): Promise<void> => {
const { canceled, result } = await os.form(clip.name, {
name: {
type: 'string',
label: i18n.ts.name,
default: clip.name,
},
description: {
type: 'string',
required: false,
multiline: true,
label: i18n.ts.description,
default: clip.description,
},
isPublic: {
type: 'boolean',
label: i18n.ts.public,
default: clip.isPublic,
},
});
if (canceled) return;
2020-11-15 04:34:47 +01:00
os.apiWithDialog('clips/update', {
clipId: clip.id,
...result,
});
2020-11-15 04:34:47 +01:00
},
}, {
icon: 'fas fa-trash-alt',
text: i18n.ts.delete,
danger: true,
handler: async (): Promise<void> => {
const { canceled } = await os.confirm({
type: 'warning',
text: i18n.t('deleteAreYouSure', { x: clip.name }),
});
if (canceled) return;
2020-11-15 04:34:47 +01:00
await os.apiWithDialog('clips/delete', {
clipId: clip.id,
2020-11-15 04:34:47 +01:00
});
},
}] : [],
} : null),
2020-11-15 04:34:47 +01:00
});
</script>
<style lang="scss" scoped>
.okzinsic {
position: relative;
margin-bottom: var(--margin);
2020-11-15 04:34:47 +01:00
> .description {
padding: 16px;
}
2020-11-15 04:47:54 +01:00
> .user {
$height: 32px;
padding: 16px;
border-top: solid 0.5px var(--divider);
2020-11-15 04:47:54 +01:00
line-height: $height;
> .avatar {
width: $height;
height: $height;
}
}
2020-11-15 04:34:47 +01:00
}
</style>