<template>
    <div class="preview-theme side-bar__panel side-bar__panel--menu">
      <div class="side-bar__info">
        <div class="menu-entry menu-entry--info flex flex--row flex--align-center">
          <span v-if="currPreviewTheme==='custom'">
            下面的自定义主题样式可编辑,可参考其他主题样式填入自己喜欢的预览样式。<br>
            主题class为:preview-theme--custom
          </span>
          <span v-else>
            下面的主题样式不可编辑。
          </span>
        </div>
      </div>
      <div class="side-bar__content">
        <template v-if="currPreviewTheme === 'default'">
          默认主题无额外样式,请选择其他主题。
        </template>
        <template v-else>
          <code-editor v-for="(value, index) in styleEles" :key="index"
            v-if="value.id === `preview-theme-${currPreviewTheme}`" lang="css" :value="value.innerHTML"
            :disabled="value.id!=='preview-theme-custom'" @changed="changeText" scrollClass="side-bar__inner"></code-editor>
        </template>
      </div>
      <div class="flex flex--row flex--end" v-if="currPreviewTheme==='custom'">
        <button class="preview-theme__button button" @click="saveStyleText">保存</button>
      </div>
    </div>
  </template>
  
  <script>
  import { mapGetters } from 'vuex';
  import MenuEntry from './common/MenuEntry';
  import CodeEditor from '../CodeEditor';
  import store from '../../store';
  
  export default {
    components: {
      MenuEntry,
      CodeEditor,
    },
    data: () => ({
      themeStyleText: '',
      styleEles: [],
    }),
    computed: {
      ...mapGetters('theme', [
        'currPreviewTheme',
      ]),
    },
    methods: {
      saveStyleText() {
        const typeEle = this.findByTheme(this.currPreviewTheme);
        if (!typeEle || !this.themeStyleText) {
          return;
        }
        typeEle.innerHTML = this.themeStyleText;
        store.dispatch('theme/setCustomPreviewThemeStyle', this.themeStyleText);
        store.dispatch('notification/info', '保存自定义主题样式成功!');
      },
      findByTheme(theme) {
        const findEles = this.styleEles.filter(it => it.id === `preview-theme-${theme}`);
        return findEles.length ? findEles[0] : null;
      },
      changeText(text) {
        this.themeStyleText = text;
      },
      close() {
        store.dispatch('data/setSideBarPanel', 'menu');
      },
      initStyle(theme) {
        if (theme === 'default') {
          return;
        }
        const value = theme || this.currPreviewTheme;
        if (this.findByTheme(value)) {
          return;
        }
        const styleId = `preview-theme-${value}`;
        const styleEle = document.getElementById(styleId);
        if (!styleEle) {
          setTimeout(() => this.initStyle(value), 1000);
          return;
        }
        this.styleEles.push(styleEle);
      },
    },
    watch: {
      currPreviewTheme: {
        immediate: true,
        handler(val) {
          this.initStyle(val);
        },
      },
    },
    created() {
      this.initStyle();
    },
  };
  </script>
  
  <style lang="scss">
  .side-bar__panel--menu {
    .side-bar__content {
      .code-editor {
        min-height: 400px !important;
        max-height: 100%;
      }
    }

    .preview-theme__button {
      font-size: 14px;
      margin-top: 0.5em;
    }
  }
  </style>