summaryrefslogtreecommitdiff
path: root/src/client/components/post-form-dialog.vue
diff options
context:
space:
mode:
Diffstat (limited to 'src/client/components/post-form-dialog.vue')
-rw-r--r--src/client/components/post-form-dialog.vue157
1 files changed, 157 insertions, 0 deletions
diff --git a/src/client/components/post-form-dialog.vue b/src/client/components/post-form-dialog.vue
new file mode 100644
index 0000000000..fe70b88218
--- /dev/null
+++ b/src/client/components/post-form-dialog.vue
@@ -0,0 +1,157 @@
+<template>
+<div class="ulveipglmagnxfgvitaxyszerjwiqmwl">
+ <transition name="form-fade" appear>
+ <div class="bg" ref="bg" v-if="show" @click="close()"></div>
+ </transition>
+ <div class="main" ref="main" @click.self="close()" @keydown="onKeydown">
+ <transition name="form" appear
+ @after-leave="destroyDom"
+ >
+ <x-post-form ref="form"
+ v-if="show"
+ :reply="reply"
+ :renote="renote"
+ :mention="mention"
+ :specified="specified"
+ :initial-text="initialText"
+ :initial-note="initialNote"
+ :instant="instant"
+ @posted="onPosted"
+ @cancel="onCanceled"/>
+ </transition>
+ </div>
+</div>
+</template>
+
+<script lang="ts">
+import Vue from 'vue';
+import XPostForm from './post-form.vue';
+
+export default Vue.extend({
+ components: {
+ XPostForm
+ },
+
+ props: {
+ reply: {
+ type: Object,
+ required: false
+ },
+ renote: {
+ type: Object,
+ required: false
+ },
+ mention: {
+ type: Object,
+ required: false
+ },
+ specified: {
+ type: Object,
+ required: false
+ },
+ initialText: {
+ type: String,
+ required: false
+ },
+ initialNote: {
+ type: Object,
+ required: false
+ },
+ instant: {
+ type: Boolean,
+ required: false,
+ default: false
+ }
+ },
+
+ data() {
+ return {
+ show: true
+ };
+ },
+
+ methods: {
+ focus() {
+ this.$refs.form.focus();
+ },
+
+ close() {
+ this.show = false;
+ (this.$refs.bg as any).style.pointerEvents = 'none';
+ (this.$refs.main as any).style.pointerEvents = 'none';
+ },
+
+ onPosted() {
+ this.$emit('posted');
+ this.close();
+ },
+
+ onCanceled() {
+ this.$emit('cancel');
+ this.close();
+ },
+
+ onKeydown(e) {
+ if (e.which === 27) { // Esc
+ e.preventDefault();
+ e.stopPropagation();
+ this.close();
+ }
+ },
+ }
+});
+</script>
+
+<style lang="scss" scoped>
+.form-enter-active, .form-leave-active {
+ transition: opacity 0.3s, transform 0.3s !important;
+}
+.form-enter, .form-leave-to {
+ opacity: 0;
+ transform: scale(0.9);
+}
+
+.form-fade-enter-active, .form-fade-leave-active {
+ transition: opacity 0.3s !important;
+}
+.form-fade-enter, .form-fade-leave-to {
+ opacity: 0;
+}
+
+.ulveipglmagnxfgvitaxyszerjwiqmwl {
+ > .bg {
+ display: block;
+ position: fixed;
+ z-index: 10000;
+ top: 0;
+ left: 0;
+ width: 100%;
+ height: 100%;
+ background: rgba(#000, 0.7);
+ }
+
+ > .main {
+ display: block;
+ position: fixed;
+ z-index: 10000;
+ top: 32px;
+ left: 0;
+ right: 0;
+ height: calc(100% - 64px);
+ width: 500px;
+ max-width: calc(100% - 16px);
+ overflow: auto;
+ margin: 0 auto 0 auto;
+
+ @media (max-width: 550px) {
+ top: 16px;
+ height: calc(100% - 32px);
+ }
+
+ @media (max-width: 520px) {
+ top: 8px;
+ height: calc(100% - 16px);
+ }
+ }
+}
+</style>