208 lines
5.0 KiB
Vue
208 lines
5.0 KiB
Vue
<template>
|
|
<div class="preview-in-page-buttons">
|
|
<ul>
|
|
<li class="before">
|
|
<icon-ellipsis></icon-ellipsis>
|
|
</li>
|
|
<li title="分享">
|
|
<a href="javascript:void(0)" @click="share"><icon-share></icon-share></a>
|
|
</li>
|
|
<li title="切换预览主题">
|
|
<dropdown-menu :selected="selectedTheme" :options="allThemes" :closeOnItemClick="false" @change="changeTheme">
|
|
<icon-select-theme></icon-select-theme>
|
|
</dropdown-menu>
|
|
</li>
|
|
<li title="Markdown语法帮助">
|
|
<a href="javascript:void(0)" @click="showHelp"><icon-help-circle></icon-help-circle></a>
|
|
</li>
|
|
</ul>
|
|
</div>
|
|
</template>
|
|
|
|
<script>
|
|
import { mapGetters, mapActions } from 'vuex';
|
|
// import juice from 'juice';
|
|
import store from '../store';
|
|
import DropdownMenu from './common/DropdownMenu';
|
|
import publishSvc from '../services/publishSvc';
|
|
import giteeGistProvider from '../services/providers/giteeGistProvider';
|
|
|
|
export default {
|
|
components: {
|
|
DropdownMenu,
|
|
},
|
|
data: () => ({
|
|
allThemes: [{
|
|
name: '默认主题',
|
|
value: 'default',
|
|
}, {
|
|
name: '凝夜紫',
|
|
value: 'ningyezi',
|
|
}, {
|
|
name: '草原绿',
|
|
value: 'caoyuangreen',
|
|
}, {
|
|
name: '雁栖湖',
|
|
value: 'yanqihu',
|
|
}, {
|
|
name: '灵动蓝',
|
|
value: 'activeblue',
|
|
}, {
|
|
name: '极客黑',
|
|
value: 'jikebrack',
|
|
}, {
|
|
name: '极简黑',
|
|
value: 'simplebrack',
|
|
}, {
|
|
name: '全栈蓝',
|
|
value: 'allblue',
|
|
}, {
|
|
name: '自定义',
|
|
value: 'custom',
|
|
}],
|
|
baseCss: '',
|
|
sharing: false,
|
|
}),
|
|
computed: {
|
|
...mapGetters('theme', [
|
|
'currPreviewTheme',
|
|
'customPreviewThemeStyle',
|
|
]),
|
|
...mapGetters('publishLocation', {
|
|
publishLocations: 'current',
|
|
}),
|
|
selectedTheme() {
|
|
return {
|
|
value: this.currPreviewTheme || 'default',
|
|
};
|
|
},
|
|
},
|
|
methods: {
|
|
...mapActions('data', [
|
|
'toggleSideBar',
|
|
]),
|
|
async changeTheme(item) {
|
|
await store.dispatch('theme/setPreviewTheme', item.value);
|
|
// 如果自定义主题没内容 则弹出编辑区域
|
|
if (item.value === 'custom' && !this.customPreviewThemeStyle) {
|
|
this.toggleSideBar(true);
|
|
store.dispatch('data/setSideBarPanel', 'previewTheme');
|
|
}
|
|
},
|
|
showHelp() {
|
|
this.toggleSideBar(true);
|
|
store.dispatch('data/setSideBarPanel', 'help');
|
|
},
|
|
async share() {
|
|
if (this.sharing) {
|
|
store.dispatch('notification/info', '分享链接创建中...请稍后再试');
|
|
return;
|
|
}
|
|
try {
|
|
const currentFile = store.getters['file/current'];
|
|
await store.dispatch('modal/open', { type: 'shareHtmlPre', name: currentFile.name });
|
|
this.sharing = true;
|
|
const mainToken = store.getters['workspace/mainWorkspaceToken'];
|
|
if (!mainToken) {
|
|
store.dispatch('notification/info', '登录主文档空间之后才可使用分享功能!');
|
|
return;
|
|
}
|
|
let giteeGistId = null;
|
|
const filterLocations = this.publishLocations.filter(it => it.providerId === 'giteegist' && it.url && it.gistId);
|
|
if (filterLocations.length > 0) {
|
|
giteeGistId = filterLocations[0].gistId;
|
|
}
|
|
const location = giteeGistProvider.makeLocation(
|
|
mainToken,
|
|
`分享-${currentFile.name}`,
|
|
true,
|
|
null,
|
|
);
|
|
location.templateId = 'styledHtmlWithTheme';
|
|
location.fileId = currentFile.id;
|
|
location.gistId = giteeGistId;
|
|
const { gistId } = await publishSvc.publishLocationAndStore(location);
|
|
const url = `${window.location.protocol}//${window.location.host}/share.html?id=${gistId}`;
|
|
await store.dispatch('modal/open', { type: 'shareHtml', name: currentFile.name, url });
|
|
} catch (err) {
|
|
if (err) {
|
|
store.dispatch('notification/error', err);
|
|
}
|
|
} finally {
|
|
this.sharing = false;
|
|
}
|
|
},
|
|
},
|
|
};
|
|
</script>
|
|
|
|
<style lang="scss">
|
|
@import '../styles/variables.scss';
|
|
|
|
.preview-in-page-buttons {
|
|
position: absolute;
|
|
bottom: 10px;
|
|
right: -98px;
|
|
height: 34px;
|
|
padding: 5px;
|
|
background-color: rgba(84, 96, 114, 0.4);
|
|
border-radius: $border-radius-base;
|
|
transition: 0.5s;
|
|
display: flex;
|
|
|
|
.dropdown-menu {
|
|
display: none;
|
|
}
|
|
|
|
&:active,
|
|
&:focus,
|
|
&:hover {
|
|
right: 0;
|
|
transition: 0.5s;
|
|
background-color: #546072;
|
|
|
|
.dropdown-menu {
|
|
display: block;
|
|
}
|
|
}
|
|
|
|
.dropdown-menu-items {
|
|
bottom: 100%;
|
|
top: unset;
|
|
}
|
|
|
|
ul {
|
|
padding: 0;
|
|
margin-left: 10px;
|
|
line-height: 20px;
|
|
|
|
li {
|
|
line-height: 16px;
|
|
width: 16px;
|
|
display: inline-block;
|
|
vertical-align: middle;
|
|
list-style: none;
|
|
cursor: pointer;
|
|
font-size: 14px;
|
|
margin-right: 10px;
|
|
|
|
.icon {
|
|
color: #fff;
|
|
opacity: 0.7;
|
|
|
|
&:active,
|
|
&:focus,
|
|
&:hover {
|
|
opacity: 1;
|
|
}
|
|
}
|
|
}
|
|
|
|
.before {
|
|
margin-left: -16px;
|
|
margin-right: 0;
|
|
}
|
|
}
|
|
}
|
|
</style>
|