hippofish/packages/client/src/components/page/page.post.vue

122 lines
2.4 KiB
Vue
Raw Normal View History

<template>
2023-04-08 02:01:42 +02:00
<div class="ngbfujlo">
<MkTextarea :model-value="text" readonly style="margin: 0"></MkTextarea>
<MkButton
class="button"
primary
:disabled="posting || posted"
@click="post()"
>
<i v-if="posted" class="ph-check ph-bold ph-lg"></i>
<i v-else class="ph-paper-plane-tilt ph-bold ph-lg"></i>
</MkButton>
</div>
</template>
<script lang="ts">
2023-04-08 02:01:42 +02:00
import { defineComponent, PropType } from "vue";
import MkTextarea from "../form/textarea.vue";
import MkButton from "../MkButton.vue";
import { apiUrl } from "@/config";
import * as os from "@/os";
import { PostBlock } from "@/scripts/hpml/block";
import { Hpml } from "@/scripts/hpml/evaluator";
Migrate to Vue3 (#6587) * Update reaction.vue * fix bug * wip * wip * wjio * wip * Revert "wip" This reverts commit e427f2160adf4e8a4147006e25a89854edab0033. * wip * wip * wip * Update init.ts * Update drive-window.vue * wip * wip * Use PascalCase for components * Use PascalCase for components * update dep * wip * wip * wip * Update init.ts * wip * Update paging.ts * Update test.vue * watch deep * wip * lint * wip * wip * wip * wip * wiop * wip * Update webpack.config.ts * alllow null poll * wip * wip * wip * wiop * UI redesign & refactor (#6714) * wip * wip * wip * wip * wip * Update drive.vue * Update word-mute.vue * wip * wip * wip * clean up * wip * Update default.vue * wip * Update notes.vue * Update mfm.ts * Update index.home.vue * Update post-form.vue * Update post-form-attaches.vue * wip * Update post-form.vue * Update sidebar.vue * wip * wip * Update index.vue * wip * Update default.vue * Update index.vue * Update index.vue * wip * Update post-form-attaches.vue * Update note.vue * wip * clean up * Update notes.vue * wip * wip * Update ja-JP.yml * wip * wip * Update index.vue * wip * wip * wip * wip * wip * wip * wip * wip * Update default.vue * wip * Update _dark.json5 * wip * wip * wip * clean up * wip * wip * Update index.vue * Update test.vue * wip * wip * fix * wip * wip * wip * wip * clena yop * wip * wip * Update store.ts * Update messaging-room.vue * Update default.widgets.vue * fix * wip * wip * Update modal.vue * wip * Update os.ts * Update os.ts * Update deck.vue * Update init.ts * wip * Update ja-JP.yml * v-sizeは単にwindowのresizeを監視するだけで良いかもしれない * Update modal.vue * wip * Update tooltip.ts * wip * wip * wip * wip * wip * Update image-viewer.vue * wip * wip * Update style.scss * Update style.scss * Update visitor.vue * wip * Update init.ts * Update init.ts * wip * wip * Update visitor.vue * Update visitor.vue * Update visitor.vue * Update visitor.vue * wip * wip * Update modal.vue * Update header.vue * Update menu.vue * Update about.vue * Update about-misskey.vue * wip * wip * Update visitor.vue * Update tooltip.ts * wip * Update drive.vue * wip * Update style.scss * Update header.vue * wip * wip * Update users.user.vue * Update announcements.vue * wip * wip * wip * Update emojis.vue * wip * Update emojis.vue * Update style.scss * Update users.vue * wip * Update style.scss * wip * Update welcome.entrance.vue * Update radio.vue * Update size.ts * Update emoji-edit-dialog.vue * wip * Update emojis.vue * wip * Update emojis.vue * Update emojis.vue * Update emojis.vue * wip * wip * wip * wip * Update file-dialog.vue * wip * wip * Update token-generate-window.vue * Update notification-setting-window.vue * wip * wip * Update _error_.vue * Update ja-JP.yml * wip * wip * Update store.ts * Update emojis.vue * Update emojis.vue * Update emojis.vue * Update announcements.vue * Update store.ts * wip * Update page-editor.vue * wip * wip * Update modal.vue * wip * Update select-file.ts * Update timeline.vue * Update emojis.vue * Update os.ts * wip * Update user-select.vue * Update mfm.ts * Update get-file-info.ts * Update drive.vue * Update init.ts * Update mfm.ts * wip * wip * Update window.vue * Update note.vue * wip * wip * Update user-info.vue * wip * wip * wip * wip * wip * Update header.vue * Update header.vue * wip * Update explore.vue * wip * wip * wip * Update webpack.config.ts * wip * wip * wip * wip * wip * wip * Update autocomplete.ts * wip * wip * wip * Update toast.vue * wip * Update post-form-dialog.vue * wip * wip * wip * wip * wip * Update users.vue * wip * Update explore.vue * wip * wip * wip * Update package.json * wip * Update icon-dialog.vue * wip * wip * Update user-preview.ts * wip * wip * wip * wip * wip * Update instance.vue * Update user-name.vue * Update federation.vue * Update instance.vue * wip * wip * Update tag.vue * wip * wip * wip * wip * wip * Update instance.vue * wip * Update os.ts * Update os.ts * wip * wip * wip * Update router.ts * wip * Update init.ts * Update note.vue * Update messages.vue * wip * wip * wip * wip * wip * google * wip * wip * wip * wip * Update theme-editor.vue * wip * wip * Update room.vue * Update channel-editor.vue * wip * Update window.vue * Update window.vue * wip * Update window.vue * Update window.vue * wip * Update menu.vue * wip * wip * wip * wip * Update messaging-room.vue * wip * Update post-form.vue * Update default.widgets.vue * Update window.vue * wip
2020-10-17 13:12:00 +02:00
export default defineComponent({
components: {
MkTextarea,
MkButton,
},
props: {
block: {
type: Object as PropType<PostBlock>,
2023-04-08 02:01:42 +02:00
required: true,
},
2020-04-20 14:35:27 +02:00
hpml: {
type: Object as PropType<Hpml>,
2023-04-08 02:01:42 +02:00
required: true,
},
},
data() {
return {
text: this.hpml.interpolate(this.block.text),
posted: false,
posting: false,
};
},
watch: {
2023-04-08 02:01:42 +02:00
"hpml.vars": {
handler() {
this.text = this.hpml.interpolate(this.block.text);
},
2023-04-08 02:01:42 +02:00
deep: true,
},
},
methods: {
2020-04-19 02:05:20 +02:00
upload() {
2020-10-18 03:11:34 +02:00
const promise = new Promise((ok) => {
const canvas = this.hpml.canvases[this.block.canvasId];
2023-04-08 02:01:42 +02:00
canvas.toBlob((blob) => {
const formData = new FormData();
2023-04-08 02:01:42 +02:00
formData.append("file", blob);
if (this.$store.state.uploadFolder) {
2023-04-08 02:01:42 +02:00
formData.append(
"folderId",
2023-07-06 03:28:27 +02:00
this.$store.state.uploadFolder,
2023-04-08 02:01:42 +02:00
);
}
2020-04-19 02:05:20 +02:00
2023-04-08 02:01:42 +02:00
fetch(apiUrl + "/drive/files/create", {
method: "POST",
body: formData,
2022-07-19 00:49:40 +02:00
headers: {
authorization: `Bearer ${this.$i.token}`,
},
2020-04-19 02:05:20 +02:00
})
2023-04-08 02:01:42 +02:00
.then((response) => response.json())
.then((f) => {
ok(f);
});
2020-04-19 02:05:20 +02:00
});
});
2020-10-18 03:11:34 +02:00
os.promiseDialog(promise);
return promise;
2020-04-19 02:05:20 +02:00
},
async post() {
this.posting = true;
2023-04-08 02:01:42 +02:00
const file = this.block.attachCanvasImage
? await this.upload()
: null;
os.apiWithDialog("notes/create", {
text: this.text === "" ? null : this.text,
2020-04-19 02:05:20 +02:00
fileIds: file ? [file.id] : undefined,
}).then(() => {
this.posted = true;
});
2023-04-08 02:01:42 +02:00
},
},
});
</script>
<style lang="scss" scoped>
.ngbfujlo {
2020-04-19 02:05:20 +02:00
position: relative;
2020-01-30 23:01:45 +01:00
padding: 32px;
border-radius: 6px;
2020-01-30 23:01:45 +01:00
box-shadow: 0 2px 8px var(--shadow);
2020-04-19 02:05:20 +02:00
z-index: 1;
2020-01-30 23:01:45 +01:00
> .button {
margin-top: 32px;
}
@media (max-width: 600px) {
2020-01-30 23:01:45 +01:00
padding: 16px;
2020-01-30 23:01:45 +01:00
> .button {
margin-top: 16px;
}
}
}
</style>