comment-placeholder.js 2.32 KB
import {createNamespacedHelpers} from 'vuex';
const {mapActions} = createNamespacedHelpers('comment');
const {mapActions: articleMapActions} = createNamespacedHelpers('article');

export default {
  name: 'CommentPlaceholder',
  props: {
    tag: String,
    destId: Number,
    addType: Number,
    columnType: {
      type: Number,
      default: 1001
    },
    user: {
      type: String,
      default: ''
    },
    share: Boolean
  },
  methods: {
    ...mapActions(['postComment']),
    ...articleMapActions(['fetchArticleUpdate']),
    async openComentInput() {
      if (this.share) {
        return this.$links.toDownloadApp();
      }
      const user = await this.$sdk.getUser();

      if (user && user.uid) {
        const hint = this.user ? `回复${this.user}:` : '评论:';

        if (this.$yoho.isYohoBuy) {
          this.$yoho.getInput({hint}, (content) => {
            this.comment(content);
          }, (e) => {
            console.error(e);
          });
        } else if (process.env.NODE_ENV !== 'production') {
          this.$createDialog({
            type: 'prompt',
            title: '测试-输入',
            prompt: {
              placeholder: hint
            },
            onConfirm: (e, promptValue) => {
              this.comment(promptValue);
            }
          }).show();
        }
      } else {
        this.$sdk.goLogin();
      }
    },
    async comment(content) {
      const result = await this.postComment({
        content: content,
        destId: this.addType === 0 ? this.destId : void 0,
        commentId: this.addType === 1 ? this.destId : void 0,
        addType: this.addType,
        columnType: this.columnType
      });

      if (result.code === 200) {
        const waitData = this.addType === 0 ? this.fetchArticleUpdate({articleId: this.destId}) : Promise.resolve();

        await waitData;
        this.$emit('on-comment', {
          destId: this.destId,
          addType: this.addType,
          columnType: this.columnType
        });
      } else {
        this.$createToast({
          txt: result.message || '服务器开小差了',
          type: 'warn',
          time: 1000
        }).show();
      }
    }
  },
  render(h) {
    return h(this.tag || 'div', {
      on: {
        click: () => {
          this.openComentInput();
        }
      }
    }, this.$slots.default);
  }
};