mirror of
https://github.com/nagisa77/OpenIsle.git
synced 2026-03-01 01:21:04 +08:00
Compare commits
18 Commits
codex/migr
...
codex/adap
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
4802c78156 | ||
|
|
05d56df44e | ||
|
|
5b0cbe8ce9 | ||
|
|
140d33d024 | ||
|
|
6ad7e951fe | ||
|
|
da47d37dc5 | ||
|
|
6293f572d8 | ||
|
|
94f4792a32 | ||
|
|
069f4bb8c1 | ||
|
|
7421ec8984 | ||
|
|
90b9d75da2 | ||
|
|
d69b094a7b | ||
|
|
67d80a4edd | ||
|
|
78498c0ac3 | ||
|
|
47c997ad22 | ||
|
|
2cd220e8eb | ||
|
|
8023fa1810 | ||
|
|
04b1b32b9c |
@@ -1,6 +1,6 @@
|
|||||||
<template>
|
<template>
|
||||||
<div class="base-placeholder">
|
<div class="base-placeholder">
|
||||||
<i :class="['base-placeholder-icon', icon]" />
|
<component :is="icon" class="base-placeholder-icon" theme="outline" />
|
||||||
<div class="base-placeholder-text">
|
<div class="base-placeholder-text">
|
||||||
<slot>{{ text }}</slot>
|
<slot>{{ text }}</slot>
|
||||||
</div>
|
</div>
|
||||||
@@ -12,7 +12,7 @@ export default {
|
|||||||
name: 'BasePlaceholder',
|
name: 'BasePlaceholder',
|
||||||
props: {
|
props: {
|
||||||
text: { type: String, default: '' },
|
text: { type: String, default: '' },
|
||||||
icon: { type: String, default: 'fas fa-inbox' },
|
icon: { type: String, default: 'inbox' },
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
@@ -27,6 +27,7 @@ export default {
|
|||||||
height: 300px;
|
height: 300px;
|
||||||
opacity: 0.5;
|
opacity: 0.5;
|
||||||
}
|
}
|
||||||
|
.base-placeholder-icon,
|
||||||
.base-placeholder-text {
|
.base-placeholder-text {
|
||||||
font-size: 16px;
|
font-size: 16px;
|
||||||
color: var(--text-color);
|
color: var(--text-color);
|
||||||
|
|||||||
@@ -13,7 +13,6 @@
|
|||||||
:is="tab.icon"
|
:is="tab.icon"
|
||||||
class="base-tabs-item-icon"
|
class="base-tabs-item-icon"
|
||||||
/>
|
/>
|
||||||
<i v-else-if="tab.icon" :class="tab.icon"></i>
|
|
||||||
<div class="base-tabs-item-label">{{ tab.label }}</div>
|
<div class="base-tabs-item-label">{{ tab.label }}</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -7,7 +7,11 @@
|
|||||||
@click="item.iconClick && item.iconClick()"
|
@click="item.iconClick && item.iconClick()"
|
||||||
>
|
>
|
||||||
<BaseImage v-if="item.src" :src="item.src" class="timeline-img" alt="timeline item" />
|
<BaseImage v-if="item.src" :src="item.src" class="timeline-img" alt="timeline item" />
|
||||||
<i v-else-if="item.icon" :class="item.icon"></i>
|
<component
|
||||||
|
v-else-if="item.icon && (typeof item.icon !== 'string' || !item.icon.includes(' '))"
|
||||||
|
:is="item.icon"
|
||||||
|
:size="20"
|
||||||
|
/>
|
||||||
<BaseImage v-else-if="item.emoji" :src="item.emoji" class="timeline-emoji" alt="emoji" />
|
<BaseImage v-else-if="item.emoji" :src="item.emoji" class="timeline-emoji" alt="emoji" />
|
||||||
</div>
|
</div>
|
||||||
<div class="timeline-content">
|
<div class="timeline-content">
|
||||||
|
|||||||
@@ -15,7 +15,7 @@
|
|||||||
class="option-icon"
|
class="option-icon"
|
||||||
:alt="option.name"
|
:alt="option.name"
|
||||||
/>
|
/>
|
||||||
<i v-else :class="['option-icon', option.icon]"></i>
|
<!-- <i v-else :class="['option-icon', option.icon]"></i> -->
|
||||||
</template>
|
</template>
|
||||||
<span>{{ option.name }}</span>
|
<span>{{ option.name }}</span>
|
||||||
<span class="option-count" v-if="option.count > 0"> x {{ option.count }}</span>
|
<span class="option-count" v-if="option.count > 0"> x {{ option.count }}</span>
|
||||||
|
|||||||
@@ -7,7 +7,7 @@
|
|||||||
<div class="comment-bottom-container">
|
<div class="comment-bottom-container">
|
||||||
<div class="comment-submit" :class="{ disabled: isDisabled }" @click="submit">
|
<div class="comment-submit" :class="{ disabled: isDisabled }" @click="submit">
|
||||||
<template v-if="!loading"> 发布评论 </template>
|
<template v-if="!loading"> 发布评论 </template>
|
||||||
<template v-else> <i class="fa-solid fa-spinner fa-spin"></i> 发布中... </template>
|
<template v-else> <loading-four /> 发布中... </template>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -71,8 +71,8 @@
|
|||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
<div v-if="replyCount && level < 2" class="reply-toggle" @click="toggleReplies">
|
<div v-if="replyCount && level < 2" class="reply-toggle" @click="toggleReplies">
|
||||||
<i v-if="showReplies" class="fas fa-chevron-up reply-toggle-icon"></i>
|
<up v-if="showReplies" class="reply-toggle-icon" />
|
||||||
<i v-else class="fas fa-chevron-down reply-toggle-icon"></i>
|
<down v-else class="reply-toggle-icon" />
|
||||||
{{ replyCount }}条回复
|
{{ replyCount }}条回复
|
||||||
</div>
|
</div>
|
||||||
<div v-if="showReplies && level < 2" class="reply-list">
|
<div v-if="showReplies && level < 2" class="reply-list">
|
||||||
@@ -375,7 +375,6 @@ const handleContentClick = (e) => {
|
|||||||
}
|
}
|
||||||
|
|
||||||
.reply-toggle-icon {
|
.reply-toggle-icon {
|
||||||
margin-right: 5px;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.common-info-content-header {
|
.common-info-content-header {
|
||||||
|
|||||||
@@ -19,7 +19,7 @@
|
|||||||
class="option-icon"
|
class="option-icon"
|
||||||
:alt="label.name"
|
:alt="label.name"
|
||||||
/>
|
/>
|
||||||
<i v-else :class="['option-icon', label.icon]"></i>
|
<component v-else :is="label.icon" class="option-icon" :size="16" />
|
||||||
</template>
|
</template>
|
||||||
<span>{{ label.name }}</span>
|
<span>{{ label.name }}</span>
|
||||||
</div>
|
</div>
|
||||||
@@ -38,14 +38,14 @@
|
|||||||
class="option-icon"
|
class="option-icon"
|
||||||
:alt="selectedLabels[0].name"
|
:alt="selectedLabels[0].name"
|
||||||
/>
|
/>
|
||||||
<i v-else :class="['option-icon', selectedLabels[0].icon]"></i>
|
<component v-else :is="selectedLabels[0].icon" class="option-icon" :size="16" />
|
||||||
</template>
|
</template>
|
||||||
<span>{{ selectedLabels[0].name }}</span>
|
<span>{{ selectedLabels[0].name }}</span>
|
||||||
</div>
|
</div>
|
||||||
</span>
|
</span>
|
||||||
<span v-else class="placeholder">{{ placeholder }}</span>
|
<span v-else class="placeholder">{{ placeholder }}</span>
|
||||||
</template>
|
</template>
|
||||||
<i class="fas fa-caret-down dropdown-caret"></i>
|
<down class="dropdown-caret" />
|
||||||
</slot>
|
</slot>
|
||||||
</div>
|
</div>
|
||||||
<div
|
<div
|
||||||
@@ -54,7 +54,7 @@
|
|||||||
v-click-outside="close"
|
v-click-outside="close"
|
||||||
>
|
>
|
||||||
<div v-if="showSearch" class="dropdown-search">
|
<div v-if="showSearch" class="dropdown-search">
|
||||||
<i class="fas fa-search search-icon"></i>
|
<search-icon class="search-icon" />
|
||||||
<input type="text" v-model="search" placeholder="搜索" />
|
<input type="text" v-model="search" placeholder="搜索" />
|
||||||
</div>
|
</div>
|
||||||
<div v-if="loading" class="dropdown-loading">
|
<div v-if="loading" class="dropdown-loading">
|
||||||
@@ -75,7 +75,7 @@
|
|||||||
class="option-icon"
|
class="option-icon"
|
||||||
:alt="o.name"
|
:alt="o.name"
|
||||||
/>
|
/>
|
||||||
<i v-else :class="['option-icon', o.icon]"></i>
|
<component v-else :is="o.icon" class="option-icon" :size="16" />
|
||||||
</template>
|
</template>
|
||||||
<span>{{ o.name }}</span>
|
<span>{{ o.name }}</span>
|
||||||
</slot>
|
</slot>
|
||||||
@@ -85,12 +85,12 @@
|
|||||||
<Teleport to="body">
|
<Teleport to="body">
|
||||||
<div v-if="open && isMobile" class="dropdown-mobile-page">
|
<div v-if="open && isMobile" class="dropdown-mobile-page">
|
||||||
<div class="dropdown-mobile-header">
|
<div class="dropdown-mobile-header">
|
||||||
<i class="fas fa-arrow-left" @click="close"></i>
|
<next class="back-icon" @click="close" />
|
||||||
<span class="mobile-title">{{ placeholder }}</span>
|
<span class="mobile-title">{{ placeholder }}</span>
|
||||||
</div>
|
</div>
|
||||||
<div class="dropdown-mobile-menu">
|
<div class="dropdown-mobile-menu">
|
||||||
<div v-if="showSearch" class="dropdown-search">
|
<div v-if="showSearch" class="dropdown-search">
|
||||||
<i class="fas fa-search search-icon"></i>
|
<search-icon class="search-icon" />
|
||||||
<input type="text" v-model="search" placeholder="搜索" />
|
<input type="text" v-model="search" placeholder="搜索" />
|
||||||
</div>
|
</div>
|
||||||
<div v-if="loading" class="dropdown-loading">
|
<div v-if="loading" class="dropdown-loading">
|
||||||
@@ -111,7 +111,7 @@
|
|||||||
class="option-icon"
|
class="option-icon"
|
||||||
:alt="o.name"
|
:alt="o.name"
|
||||||
/>
|
/>
|
||||||
<i v-else :class="['option-icon', o.icon]"></i>
|
<component v-else :is="o.icon" class="option-icon" :size="16" />
|
||||||
</template>
|
</template>
|
||||||
<span>{{ o.name }}</span>
|
<span>{{ o.name }}</span>
|
||||||
</slot>
|
</slot>
|
||||||
@@ -303,6 +303,10 @@ export default {
|
|||||||
overflow-y: auto;
|
overflow-y: auto;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.dropdown-caret {
|
||||||
|
margin-left: 5px;
|
||||||
|
}
|
||||||
|
|
||||||
.selected-label {
|
.selected-label {
|
||||||
display: inline-flex;
|
display: inline-flex;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
@@ -326,6 +330,10 @@ export default {
|
|||||||
color: var(--text-color);
|
color: var(--text-color);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.search-icon {
|
||||||
|
font-size: 14px;
|
||||||
|
}
|
||||||
|
|
||||||
.dropdown-option {
|
.dropdown-option {
|
||||||
display: flex;
|
display: flex;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
@@ -376,6 +384,11 @@ export default {
|
|||||||
border-bottom: 1px solid var(--normal-border-color);
|
border-bottom: 1px solid var(--normal-border-color);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.back-icon {
|
||||||
|
transform: rotate(180deg);
|
||||||
|
cursor: pointer;
|
||||||
|
}
|
||||||
|
|
||||||
.dropdown-mobile-menu {
|
.dropdown-mobile-menu {
|
||||||
flex: 1;
|
flex: 1;
|
||||||
overflow-y: auto;
|
overflow-y: auto;
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
<div class="invite-code-activity">
|
<div class="invite-code-activity">
|
||||||
<div class="invite-code-description">
|
<div class="invite-code-description">
|
||||||
<div class="invite-code-description-title">
|
<div class="invite-code-description-title">
|
||||||
<i class="fas fa-info-circle"></i>
|
<info-icon />
|
||||||
<span class="invite-code-description-title-text">邀请规则说明</span>
|
<span class="invite-code-description-title-text">邀请规则说明</span>
|
||||||
</div>
|
</div>
|
||||||
<div class="invite-code-description-content">
|
<div class="invite-code-description-content">
|
||||||
@@ -17,7 +17,7 @@
|
|||||||
<div v-if="inviteLink" class="invite-code-link-content">
|
<div v-if="inviteLink" class="invite-code-link-content">
|
||||||
<p class="invite-code-link-content-text">
|
<p class="invite-code-link-content-text">
|
||||||
邀请链接:{{ inviteLink }}
|
邀请链接:{{ inviteLink }}
|
||||||
<span @click="copyLink"><i class="fas fa-copy copy-icon"></i></span>
|
<span @click="copyLink"><copy class="copy-icon" /></span>
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
<div class="login-overlay">
|
<div class="login-overlay">
|
||||||
<div class="login-overlay-blur"></div>
|
<div class="login-overlay-blur"></div>
|
||||||
<div class="login-overlay-content">
|
<div class="login-overlay-content">
|
||||||
<i class="fa-solid fa-user login-overlay-icon"></i>
|
<user-icon class="login-overlay-icon" />
|
||||||
<div class="login-overlay-text">请先登录,点击跳转到登录页面</div>
|
<div class="login-overlay-text">请先登录,点击跳转到登录页面</div>
|
||||||
<div class="login-overlay-button" @click="goLogin">登录</div>
|
<div class="login-overlay-button" @click="goLogin">登录</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -10,7 +10,7 @@
|
|||||||
<span class="prize-row-title">奖品图片</span>
|
<span class="prize-row-title">奖品图片</span>
|
||||||
<label class="prize-container">
|
<label class="prize-container">
|
||||||
<BaseImage v-if="data.prizeIcon" :src="data.prizeIcon" class="prize-preview" alt="prize" />
|
<BaseImage v-if="data.prizeIcon" :src="data.prizeIcon" class="prize-preview" alt="prize" />
|
||||||
<i v-else class="fa-solid fa-image default-prize-icon"></i>
|
<image-files v-else class="default-prize-icon" />
|
||||||
<div class="prize-overlay">上传奖品图片</div>
|
<div class="prize-overlay">上传奖品图片</div>
|
||||||
<input type="file" class="prize-input" accept="image/*" @change="onPrizeIconChange" />
|
<input type="file" class="prize-input" accept="image/*" @change="onPrizeIconChange" />
|
||||||
</label>
|
</label>
|
||||||
|
|||||||
@@ -34,7 +34,7 @@
|
|||||||
to="/about"
|
to="/about"
|
||||||
@click="handleItemClick"
|
@click="handleItemClick"
|
||||||
>
|
>
|
||||||
<info class="menu-item-icon" />
|
<info-icon class="menu-item-icon" />
|
||||||
<span class="menu-item-text">关于</span>
|
<span class="menu-item-text">关于</span>
|
||||||
</NuxtLink>
|
</NuxtLink>
|
||||||
<NuxtLink
|
<NuxtLink
|
||||||
|
|||||||
@@ -6,7 +6,7 @@
|
|||||||
<div class="message-bottom-container">
|
<div class="message-bottom-container">
|
||||||
<div class="message-submit" :class="{ disabled: isDisabled }" @click="submit">
|
<div class="message-submit" :class="{ disabled: isDisabled }" @click="submit">
|
||||||
<template v-if="!loading"> 发送 </template>
|
<template v-if="!loading"> 发送 </template>
|
||||||
<template v-else> <i class="fa-solid fa-spinner fa-spin"></i> 发送中... </template>
|
<template v-else> <loading-four /> 发送中... </template>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -3,20 +3,10 @@
|
|||||||
<iframe :src="iframeSrc" frameborder="0" ref="iframeRef" @load="injectBaseTag"></iframe>
|
<iframe :src="iframeSrc" frameborder="0" ref="iframeRef" @load="injectBaseTag"></iframe>
|
||||||
|
|
||||||
<div class="float-actions">
|
<div class="float-actions">
|
||||||
<i
|
<down v-if="floatHeight !== MINI_HEIGHT" title="收起至 100px" @click="collapseToMini" />
|
||||||
class="fas fa-chevron-down"
|
<up v-if="floatHeight !== DEFAULT_HEIGHT" title="回弹至 60vh" @click="reboundToDefault" />
|
||||||
v-if="floatHeight !== MINI_HEIGHT"
|
<expand-up title="在页面中打开" @click="expand" />
|
||||||
title="收起至 100px"
|
<close-icon title="关闭" @click="close" />
|
||||||
@click="collapseToMini"
|
|
||||||
></i>
|
|
||||||
<i
|
|
||||||
class="fas fa-chevron-up"
|
|
||||||
v-if="floatHeight !== DEFAULT_HEIGHT"
|
|
||||||
title="回弹至 60vh"
|
|
||||||
@click="reboundToDefault"
|
|
||||||
></i>
|
|
||||||
<i class="fas fa-expand" title="在页面中打开" @click="expand"></i>
|
|
||||||
<i class="fas fa-times" title="关闭" @click="close"></i>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
<div class="milk-tea-activity">
|
<div class="milk-tea-activity">
|
||||||
<div class="milk-tea-description">
|
<div class="milk-tea-description">
|
||||||
<div class="milk-tea-description-title">
|
<div class="milk-tea-description-title">
|
||||||
<i class="fas fa-info-circle"></i>
|
<info-icon />
|
||||||
<span class="milk-tea-description-title-text">升级规则说明</span>
|
<span class="milk-tea-description-title-text">升级规则说明</span>
|
||||||
</div>
|
</div>
|
||||||
<div class="milk-tea-description-content">
|
<div class="milk-tea-description-content">
|
||||||
@@ -29,7 +29,7 @@
|
|||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
<div v-else class="user-level">
|
<div v-else class="user-level">
|
||||||
<div class="user-level-text"><i class="fas fa-user-circle"></i> 请登录查看自身等级</div>
|
<div class="user-level-text"><user-icon /> 请登录查看自身等级</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div
|
<div
|
||||||
|
|||||||
@@ -10,13 +10,13 @@
|
|||||||
:src="lottery.prizeIcon"
|
:src="lottery.prizeIcon"
|
||||||
alt="prize"
|
alt="prize"
|
||||||
/>
|
/>
|
||||||
<i v-else class="fa-solid fa-gift default-prize-icon"></i>
|
<gift v-else class="default-prize-icon" />
|
||||||
</div>
|
</div>
|
||||||
<div class="prize-name">{{ lottery.prizeDescription }}</div>
|
<div class="prize-name">{{ lottery.prizeDescription }}</div>
|
||||||
<div class="prize-count">x {{ lottery.prizeCount }}</div>
|
<div class="prize-count">x {{ lottery.prizeCount }}</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="prize-end-time prize-info-right">
|
<div class="prize-end-time prize-info-right">
|
||||||
<i v-if="!lotteryEnded" class="fas fa-stopwatch prize-end-time-icon"></i>
|
<stopwatch v-if="!lotteryEnded" class="prize-end-time-icon" />
|
||||||
<div v-if="!isMobile && !lotteryEnded" class="prize-end-time-title">离结束</div>
|
<div v-if="!isMobile && !lotteryEnded" class="prize-end-time-title">离结束</div>
|
||||||
<div class="prize-end-time-value">{{ countdown }}</div>
|
<div class="prize-end-time-value">{{ countdown }}</div>
|
||||||
<div v-if="!isMobile" class="join-prize-button-container-desktop">
|
<div v-if="!isMobile" class="join-prize-button-container-desktop">
|
||||||
@@ -26,7 +26,8 @@
|
|||||||
@click="joinLottery"
|
@click="joinLottery"
|
||||||
>
|
>
|
||||||
<div class="join-prize-button-text">
|
<div class="join-prize-button-text">
|
||||||
参与抽奖 <i class="fas fa-coins"></i> {{ lottery.pointCost }}
|
参与抽奖 <paper-money-two class="join-prize-button-text-icon" />
|
||||||
|
{{ lottery.pointCost }}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div v-else-if="hasJoined" class="join-prize-button-disabled">
|
<div v-else-if="hasJoined" class="join-prize-button-disabled">
|
||||||
@@ -43,7 +44,7 @@
|
|||||||
@click="joinLottery"
|
@click="joinLottery"
|
||||||
>
|
>
|
||||||
<div class="join-prize-button-text">
|
<div class="join-prize-button-text">
|
||||||
参与抽奖 <i class="fas fa-coins"></i> {{ lottery.pointCost }}
|
参与抽奖 <paper-money-two class="join-prize-button-text-icon" /> {{ lottery.pointCost }}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div v-else-if="hasJoined" class="join-prize-button-disabled">
|
<div v-else-if="hasJoined" class="join-prize-button-disabled">
|
||||||
@@ -61,7 +62,7 @@
|
|||||||
@click="gotoUser(p.id)"
|
@click="gotoUser(p.id)"
|
||||||
/>
|
/>
|
||||||
<div v-if="lotteryEnded && lotteryWinners.length" class="prize-member-winner">
|
<div v-if="lotteryEnded && lotteryWinners.length" class="prize-member-winner">
|
||||||
<i class="fas fa-medal medal-icon"></i>
|
<medal-one class="medal-icon"></medal-one>
|
||||||
<span class="prize-member-winner-name">获奖者: </span>
|
<span class="prize-member-winner-name">获奖者: </span>
|
||||||
<BaseImage
|
<BaseImage
|
||||||
v-for="w in lotteryWinners"
|
v-for="w in lotteryWinners"
|
||||||
|
|||||||
@@ -34,7 +34,7 @@
|
|||||||
<div class="poll-option-title" v-else>单选</div>
|
<div class="poll-option-title" v-else>单选</div>
|
||||||
|
|
||||||
<div class="poll-left-time">
|
<div class="poll-left-time">
|
||||||
<i class="fas fa-stopwatch poll-left-time-icon"></i>
|
<stopwatch class="poll-left-time-icon" />
|
||||||
<div class="poll-left-time-title">离结束</div>
|
<div class="poll-left-time-title">离结束</div>
|
||||||
<div class="poll-left-time-value">{{ countdown }}</div>
|
<div class="poll-left-time-value">{{ countdown }}</div>
|
||||||
</div>
|
</div>
|
||||||
@@ -55,9 +55,7 @@
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="multi-selection-container">
|
<div class="multi-selection-container">
|
||||||
<div class="join-poll-button" @click="submitMultiPoll">
|
<div class="join-poll-button" @click="submitMultiPoll"><check /> 确认投票</div>
|
||||||
<i class="fas fa-check"></i> 确认投票
|
|
||||||
</div>
|
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
<template v-else>
|
<template v-else>
|
||||||
@@ -77,9 +75,7 @@
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="single-selection-container">
|
<div class="single-selection-container">
|
||||||
<div class="join-poll-button" @click="submitSinglePoll">
|
<div class="join-poll-button" @click="submitSinglePoll"><check /> 确认投票</div>
|
||||||
<i class="fas fa-check"></i> 确认投票
|
|
||||||
</div>
|
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
</div>
|
</div>
|
||||||
@@ -95,22 +91,20 @@
|
|||||||
class="poll-option-button"
|
class="poll-option-button"
|
||||||
@click="showPollResult = false"
|
@click="showPollResult = false"
|
||||||
>
|
>
|
||||||
<i class="fas fa-chevron-left"></i> 投票
|
<arrow-left /> 投票
|
||||||
</div>
|
</div>
|
||||||
<div
|
<div
|
||||||
v-else-if="!pollEnded && !hasVoted"
|
v-else-if="!pollEnded && !hasVoted"
|
||||||
class="poll-option-button"
|
class="poll-option-button"
|
||||||
@click="showPollResult = true"
|
@click="showPollResult = true"
|
||||||
>
|
>
|
||||||
<i class="fas fa-chart-bar"></i> 结果
|
<chart-histogram /> 结果
|
||||||
</div>
|
|
||||||
<div v-else-if="pollEnded" class="poll-option-hint">
|
|
||||||
<i class="fas fa-stopwatch"></i> 投票已结束
|
|
||||||
</div>
|
</div>
|
||||||
|
<div v-else-if="pollEnded" class="poll-option-hint"><stopwatch /> 投票已结束</div>
|
||||||
<div v-else class="poll-option-hint">
|
<div v-else class="poll-option-hint">
|
||||||
<div>您已投票,等待结束查看结果</div>
|
<div>您已投票,等待结束查看结果</div>
|
||||||
<div class="poll-left-time">
|
<div class="poll-left-time">
|
||||||
<i class="fas fa-stopwatch poll-left-time-icon"></i>
|
<stopwatch class="poll-left-time-icon" />
|
||||||
<div class="poll-left-time-title">离结束</div>
|
<div class="poll-left-time-title">离结束</div>
|
||||||
<div class="poll-left-time-value">{{ countdown }}</div>
|
<div class="poll-left-time-value">{{ countdown }}</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -31,9 +31,9 @@ export default {
|
|||||||
|
|
||||||
const fetchTypes = async () => {
|
const fetchTypes = async () => {
|
||||||
return [
|
return [
|
||||||
{ id: 'NORMAL', name: '普通帖子', icon: 'fa-regular fa-file' },
|
{ id: 'NORMAL', name: '普通帖子', icon: 'file-text' },
|
||||||
{ id: 'LOTTERY', name: '抽奖帖子', icon: 'fa-solid fa-gift' },
|
{ id: 'LOTTERY', name: '抽奖帖子', icon: 'gift' },
|
||||||
{ id: 'POLL', name: '投票帖子', icon: 'fa-solid fa-square-poll-vertical' },
|
{ id: 'POLL', name: '投票帖子', icon: 'ranking-list' },
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -42,7 +42,7 @@
|
|||||||
@click="toggleReaction('LIKE')"
|
@click="toggleReaction('LIKE')"
|
||||||
>
|
>
|
||||||
<like v-if="!userReacted('LIKE')" />
|
<like v-if="!userReacted('LIKE')" />
|
||||||
<i v-else class="fas fa-heart"></i>
|
<like v-else theme="filled" />
|
||||||
<span class="reactions-count" v-if="likeCount">{{ likeCount }}</span>
|
<span class="reactions-count" v-if="likeCount">{{ likeCount }}</span>
|
||||||
</div>
|
</div>
|
||||||
<slot></slot>
|
<slot></slot>
|
||||||
|
|||||||
@@ -13,7 +13,7 @@
|
|||||||
>
|
>
|
||||||
<template #display="{ setSearch }">
|
<template #display="{ setSearch }">
|
||||||
<div class="search-input">
|
<div class="search-input">
|
||||||
<i class="search-input-icon fas fa-search"></i>
|
<search-icon class="search-input-icon" />
|
||||||
<input
|
<input
|
||||||
class="text-input"
|
class="text-input"
|
||||||
v-model="keyword"
|
v-model="keyword"
|
||||||
@@ -24,7 +24,7 @@
|
|||||||
</template>
|
</template>
|
||||||
<template #option="{ option }">
|
<template #option="{ option }">
|
||||||
<div class="search-option-item">
|
<div class="search-option-item">
|
||||||
<i :class="['result-icon', iconMap[option.type] || 'fas fa-question']"></i>
|
<i :class="['result-icon', iconMap[option.type]]"></i>
|
||||||
<div class="result-body">
|
<div class="result-body">
|
||||||
<div class="result-main" v-html="highlight(option.text)"></div>
|
<div class="result-main" v-html="highlight(option.text)"></div>
|
||||||
<div v-if="option.subText" class="result-sub" v-html="highlight(option.subText)"></div>
|
<div v-if="option.subText" class="result-sub" v-html="highlight(option.subText)"></div>
|
||||||
|
|||||||
@@ -13,7 +13,7 @@
|
|||||||
>
|
>
|
||||||
<template #display="{ setSearch }">
|
<template #display="{ setSearch }">
|
||||||
<div class="search-input">
|
<div class="search-input">
|
||||||
<i class="search-input-icon fas fa-search"></i>
|
<search-icon class="search-input-icon" />
|
||||||
<input
|
<input
|
||||||
class="text-input"
|
class="text-input"
|
||||||
v-model="keyword"
|
v-model="keyword"
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
<template>
|
<template>
|
||||||
<div class="user-list">
|
<div class="user-list">
|
||||||
<BasePlaceholder v-if="users.length === 0" text="暂无用户" icon="fas fa-inbox" />
|
<BasePlaceholder v-if="users.length === 0" text="暂无用户" icon="inbox" />
|
||||||
<div v-for="u in users" :key="u.id" class="user-item" @click="handleUserClick(u)">
|
<div v-for="u in users" :key="u.id" class="user-item" @click="handleUserClick(u)">
|
||||||
<BaseImage :src="u.avatar" alt="avatar" class="user-avatar" />
|
<BaseImage :src="u.avatar" alt="avatar" class="user-avatar" />
|
||||||
<div class="user-info">
|
<div class="user-info">
|
||||||
|
|||||||
@@ -18,7 +18,7 @@
|
|||||||
<div class="activity-list-page-card-content">{{ a.content }}</div>
|
<div class="activity-list-page-card-content">{{ a.content }}</div>
|
||||||
<div class="activity-list-page-card-footer">
|
<div class="activity-list-page-card-footer">
|
||||||
<div class="activity-list-page-card-footer-start-time">
|
<div class="activity-list-page-card-footer-start-time">
|
||||||
<i class="fas fa-clock"></i>
|
<stopwatch />
|
||||||
<span>开始于 {{ TimeManager.format(a.startTime) }}</span>
|
<span>开始于 {{ TimeManager.format(a.startTime) }}</span>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -4,24 +4,24 @@
|
|||||||
<div class="forgot-title">找回密码</div>
|
<div class="forgot-title">找回密码</div>
|
||||||
|
|
||||||
<div v-if="step === 0" class="step-content">
|
<div v-if="step === 0" class="step-content">
|
||||||
<BaseInput icon="Mail" v-model="email" placeholder="邮箱" />
|
<BaseInput icon="mail" v-model="email" placeholder="邮箱" />
|
||||||
<div v-if="emailError" class="error-message">{{ emailError }}</div>
|
<div v-if="emailError" class="error-message">{{ emailError }}</div>
|
||||||
<div class="primary-button" @click="sendCode" v-if="!isSending">发送验证码</div>
|
<div class="primary-button" @click="sendCode" v-if="!isSending">发送验证码</div>
|
||||||
<div class="primary-button disabled" v-else>发送中...</div>
|
<div class="primary-button disabled" v-else>发送中...</div>
|
||||||
</div>
|
</div>
|
||||||
<div v-else-if="step === 1" class="step-content">
|
<div v-else-if="step === 1" class="step-content">
|
||||||
<BaseInput icon="Mail" v-model="code" placeholder="邮箱验证码" />
|
<BaseInput icon="mail" v-model="code" placeholder="邮箱验证码" />
|
||||||
<div class="primary-button" @click="verifyCode" v-if="!isVerifying">验证</div>
|
<div class="primary-button" @click="verifyCode" v-if="!isVerifying">验证</div>
|
||||||
<div class="primary-button disabled" v-else>验证中...</div>
|
<div class="primary-button disabled" v-else>验证中...</div>
|
||||||
</div>
|
</div>
|
||||||
<div v-else class="step-content">
|
<div v-else class="step-content">
|
||||||
<BaseInput icon="Lock" v-model="password" type="password" placeholder="新密码" />
|
<BaseInput icon="lock" v-model="password" type="password" placeholder="新密码" />
|
||||||
<div v-if="passwordError" class="error-message">{{ passwordError }}</div>
|
<div v-if="passwordError" class="error-message">{{ passwordError }}</div>
|
||||||
<div class="primary-button" @click="resetPassword" v-if="!isResetting">重置密码</div>
|
<div class="primary-button" @click="resetPassword" v-if="!isResetting">重置密码</div>
|
||||||
<div class="primary-button disabled" v-else>提交中...</div>
|
<div class="primary-button disabled" v-else>提交中...</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="hint-message">
|
<div class="hint-message">
|
||||||
<i class="fas fa-info-circle"></i>
|
<info-icon />
|
||||||
使用 Google 注册的用户可使用对应的邮箱进行找回密码
|
使用 Google 注册的用户可使用对应的邮箱进行找回密码
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -6,9 +6,9 @@
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="email-login-page-content">
|
<div class="email-login-page-content">
|
||||||
<BaseInput icon="Mail" v-model="username" placeholder="邮箱/用户名" />
|
<BaseInput icon="mail" v-model="username" placeholder="邮箱/用户名" />
|
||||||
|
|
||||||
<BaseInput icon="Lock" v-model="password" type="password" placeholder="密码" />
|
<BaseInput icon="lock" v-model="password" type="password" placeholder="密码" />
|
||||||
|
|
||||||
<div v-if="!isWaitingForLogin" class="login-page-button-primary" @click="submitLogin">
|
<div v-if="!isWaitingForLogin" class="login-page-button-primary" @click="submitLogin">
|
||||||
<div class="login-page-button-text">登录</div>
|
<div class="login-page-button-text">登录</div>
|
||||||
@@ -16,7 +16,7 @@
|
|||||||
|
|
||||||
<div v-else class="login-page-button-primary disabled">
|
<div v-else class="login-page-button-primary disabled">
|
||||||
<div class="login-page-button-text">
|
<div class="login-page-button-text">
|
||||||
<i class="fas fa-spinner fa-spin"></i>
|
<loading-four />
|
||||||
登录中...
|
登录中...
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@@ -28,7 +28,7 @@
|
|||||||
>
|
>
|
||||||
</div>
|
</div>
|
||||||
<div class="hint-message">
|
<div class="hint-message">
|
||||||
<i class="fas fa-info-circle"></i>
|
<info-icon />
|
||||||
使用右侧第三方OAuth注册/登录的用户可使用对应的邮箱进行重设密码
|
使用右侧第三方OAuth注册/登录的用户可使用对应的邮箱进行重设密码
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -3,14 +3,14 @@
|
|||||||
<div v-if="!loading" class="chat-header">
|
<div v-if="!loading" class="chat-header">
|
||||||
<div class="header-main">
|
<div class="header-main">
|
||||||
<div class="back-button" @click="goBack">
|
<div class="back-button" @click="goBack">
|
||||||
<i class="fas fa-arrow-left"></i>
|
<arrow-left />
|
||||||
</div>
|
</div>
|
||||||
<h2 class="participant-name">
|
<h2 class="participant-name">
|
||||||
{{ isChannel ? conversationName : otherParticipant?.username }}
|
{{ isChannel ? conversationName : otherParticipant?.username }}
|
||||||
</h2>
|
</h2>
|
||||||
</div>
|
</div>
|
||||||
<div v-if="!isFloatMode" class="float-control">
|
<div v-if="!isFloatMode" class="float-control">
|
||||||
<i class="fas fa-compress" @click="minimize" title="最小化"></i>
|
<collapse-text-input class="float-control-icon" @click="minimize" title="最小化" />
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
@@ -48,7 +48,7 @@
|
|||||||
:content-id="item.id"
|
:content-id="item.id"
|
||||||
@update:modelValue="(v) => (item.reactions = v)"
|
@update:modelValue="(v) => (item.reactions = v)"
|
||||||
>
|
>
|
||||||
<i class="fas fa-reply reply-btn" @click="setReply(item)"> 写个回复...</i>
|
<div class="reply-btn"><next @click="setReply(item)" /> 写个回复...</div>
|
||||||
</ReactionsGroup>
|
</ReactionsGroup>
|
||||||
</template>
|
</template>
|
||||||
</BaseTimeline>
|
</BaseTimeline>
|
||||||
@@ -56,7 +56,7 @@
|
|||||||
<BasePlaceholder
|
<BasePlaceholder
|
||||||
v-if="messages.length === 0"
|
v-if="messages.length === 0"
|
||||||
text="暂无会话,发送消息试试 🎉"
|
text="暂无会话,发送消息试试 🎉"
|
||||||
icon="fas fa-inbox"
|
icon="inbox"
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
@@ -66,7 +66,7 @@
|
|||||||
<div v-if="replyTo" class="active-reply">
|
<div v-if="replyTo" class="active-reply">
|
||||||
正在回复 {{ replyTo.sender.username }}:
|
正在回复 {{ replyTo.sender.username }}:
|
||||||
{{ stripMarkdownLength(replyTo.content, 50) }}
|
{{ stripMarkdownLength(replyTo.content, 50) }}
|
||||||
<i class="fas fa-times close-reply" @click="replyTo = null"></i>
|
<close-icon class="close-reply" @click="replyTo = null" />
|
||||||
</div>
|
</div>
|
||||||
<MessageEditor :loading="sending" @submit="sendMessage" />
|
<MessageEditor :loading="sending" @submit="sendMessage" />
|
||||||
</div>
|
</div>
|
||||||
@@ -351,9 +351,9 @@ onMounted(async () => {
|
|||||||
})
|
})
|
||||||
|
|
||||||
const subscribeToConversation = () => {
|
const subscribeToConversation = () => {
|
||||||
if (!currentUser.value) return;
|
if (!currentUser.value) return
|
||||||
const destination = `/topic/conversation/${conversationId}`
|
const destination = `/topic/conversation/${conversationId}`
|
||||||
|
|
||||||
subscribe(destination, async (message) => {
|
subscribe(destination, async (message) => {
|
||||||
try {
|
try {
|
||||||
const parsedMessage = JSON.parse(message.body)
|
const parsedMessage = JSON.parse(message.body)
|
||||||
@@ -370,12 +370,12 @@ const subscribeToConversation = () => {
|
|||||||
|
|
||||||
await markConversationAsRead()
|
await markConversationAsRead()
|
||||||
await nextTick()
|
await nextTick()
|
||||||
|
|
||||||
if (isUserNearBottom.value) {
|
if (isUserNearBottom.value) {
|
||||||
scrollToBottomSmooth()
|
scrollToBottomSmooth()
|
||||||
}
|
}
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
console.error("Failed to parse websocket message", e)
|
console.error('Failed to parse websocket message', e)
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
@@ -394,7 +394,7 @@ onActivated(async () => {
|
|||||||
await nextTick()
|
await nextTick()
|
||||||
scrollToBottomSmooth()
|
scrollToBottomSmooth()
|
||||||
updateNearBottom()
|
updateNearBottom()
|
||||||
|
|
||||||
if (isConnected.value) {
|
if (isConnected.value) {
|
||||||
// 如果已连接,重新订阅
|
// 如果已连接,重新订阅
|
||||||
subscribeToConversation()
|
subscribeToConversation()
|
||||||
|
|||||||
@@ -1,11 +1,11 @@
|
|||||||
<template>
|
<template>
|
||||||
<div class="messages-container">
|
<div class="messages-container">
|
||||||
<div class="page-title">
|
<div class="page-title">
|
||||||
<i class="fas fa-comments"></i>
|
<message-emoji />
|
||||||
<span class="page-title-text">选择聊天</span>
|
<span class="page-title-text">选择聊天</span>
|
||||||
</div>
|
</div>
|
||||||
<div v-if="!isFloatMode" class="float-control">
|
<div v-if="!isFloatMode" class="float-control">
|
||||||
<i class="fas fa-compress" @click="minimize" title="最小化"></i>
|
<collapse-text-input class="float-control-icon" @click="minimize" title="最小化" />
|
||||||
</div>
|
</div>
|
||||||
<BaseTabs v-model="activeTab" :tabs="tabs">
|
<BaseTabs v-model="activeTab" :tabs="tabs">
|
||||||
<div v-if="activeTab === 'messages'">
|
<div v-if="activeTab === 'messages'">
|
||||||
@@ -22,7 +22,7 @@
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div v-if="!loading && conversations.length === 0" class="empty-container">
|
<div v-if="!loading && conversations.length === 0" class="empty-container">
|
||||||
<BasePlaceholder v-if="conversations.length === 0" text="暂无会话" icon="fas fa-inbox" />
|
<BasePlaceholder v-if="conversations.length === 0" text="暂无会话" icon="inbox" />
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div
|
<div
|
||||||
@@ -73,7 +73,7 @@
|
|||||||
</div>
|
</div>
|
||||||
<div v-else>
|
<div v-else>
|
||||||
<div v-if="channels.length === 0" class="empty-container">
|
<div v-if="channels.length === 0" class="empty-container">
|
||||||
<BasePlaceholder text="暂无频道" icon="fas fa-inbox" />
|
<BasePlaceholder text="暂无频道" icon="inbox" />
|
||||||
</div>
|
</div>
|
||||||
<div
|
<div
|
||||||
v-for="ch in channels"
|
v-for="ch in channels"
|
||||||
@@ -273,9 +273,9 @@ onActivated(async () => {
|
|||||||
})
|
})
|
||||||
|
|
||||||
const subscribeToUserMessages = () => {
|
const subscribeToUserMessages = () => {
|
||||||
if (!currentUser.value) return;
|
if (!currentUser.value) return
|
||||||
const destination = `/topic/user/${currentUser.value.id}/messages`
|
const destination = `/topic/user/${currentUser.value.id}/messages`
|
||||||
|
|
||||||
subscribe(destination, (message) => {
|
subscribe(destination, (message) => {
|
||||||
if (activeTab.value === 'messages') {
|
if (activeTab.value === 'messages') {
|
||||||
fetchConversations()
|
fetchConversations()
|
||||||
|
|||||||
@@ -4,7 +4,7 @@
|
|||||||
<template #right>
|
<template #right>
|
||||||
<div class="message-page-header-right">
|
<div class="message-page-header-right">
|
||||||
<div class="message-page-header-right-item" @click="markAllRead">
|
<div class="message-page-header-right-item" @click="markAllRead">
|
||||||
<i class="fas fa-bolt message-page-header-right-item-button-icon"></i>
|
<check-correct class="message-page-header-right-item-button-icon" />
|
||||||
<span class="message-page-header-right-item-button-text"> 已读所有消息 </span>
|
<span class="message-page-header-right-item-button-text"> 已读所有消息 </span>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@@ -14,8 +14,12 @@
|
|||||||
<div class="message-control-container">
|
<div class="message-control-container">
|
||||||
<div class="message-control-title">通知设置</div>
|
<div class="message-control-title">通知设置</div>
|
||||||
<div class="message-control-item-container">
|
<div class="message-control-item-container">
|
||||||
<template v-for="pref in notificationPrefs">
|
<template v-for="pref in notificationPrefs">
|
||||||
<div v-if="canShowNotification(pref.type)" :key="pref.type" class="message-control-item">
|
<div
|
||||||
|
v-if="canShowNotification(pref.type)"
|
||||||
|
:key="pref.type"
|
||||||
|
class="message-control-item"
|
||||||
|
>
|
||||||
<div class="message-control-item-label">{{ formatType(pref.type) }}</div>
|
<div class="message-control-item-label">{{ formatType(pref.type) }}</div>
|
||||||
<BaseSwitch
|
<BaseSwitch
|
||||||
:model-value="pref.enabled"
|
:model-value="pref.enabled"
|
||||||
@@ -47,7 +51,7 @@
|
|||||||
<BasePlaceholder
|
<BasePlaceholder
|
||||||
v-else-if="notifications.length === 0"
|
v-else-if="notifications.length === 0"
|
||||||
text="暂时没有消息 :)"
|
text="暂时没有消息 :)"
|
||||||
icon="fas fa-inbox"
|
icon="inbox"
|
||||||
/>
|
/>
|
||||||
|
|
||||||
<div class="timeline-container" v-if="notifications.length > 0">
|
<div class="timeline-container" v-if="notifications.length > 0">
|
||||||
@@ -757,7 +761,12 @@ const formatType = (t) => {
|
|||||||
|
|
||||||
const isAdmin = computed(() => authState.role === 'ADMIN')
|
const isAdmin = computed(() => authState.role === 'ADMIN')
|
||||||
|
|
||||||
const needAdminSet = new Set(['POST_REVIEW_REQUEST','REGISTER_REQUEST', 'POINT_REDEEM', 'ACTIVITY_REDEEM'])
|
const needAdminSet = new Set([
|
||||||
|
'POST_REVIEW_REQUEST',
|
||||||
|
'REGISTER_REQUEST',
|
||||||
|
'POINT_REDEEM',
|
||||||
|
'ACTIVITY_REDEEM',
|
||||||
|
])
|
||||||
|
|
||||||
const canShowNotification = (type) => {
|
const canShowNotification = (type) => {
|
||||||
return !needAdminSet.has(type) || isAdmin.value
|
return !needAdminSet.has(type) || isAdmin.value
|
||||||
|
|||||||
@@ -13,13 +13,13 @@
|
|||||||
<PostTypeSelect v-model="postType" />
|
<PostTypeSelect v-model="postType" />
|
||||||
</div>
|
</div>
|
||||||
<div class="post-options-right">
|
<div class="post-options-right">
|
||||||
<div class="post-clear" @click="clearPost"><i class="fa-solid fa-eraser"></i> 清空</div>
|
<div class="post-clear" @click="clearPost"><clear-icon /> 清空</div>
|
||||||
<div class="ai-generate" @click="aiGenerate">
|
<div class="ai-generate" @click="aiGenerate">
|
||||||
<i class="fa-solid fa-robot"></i>
|
<smart-optimization />
|
||||||
MD 格式优化
|
MD 格式优化
|
||||||
</div>
|
</div>
|
||||||
<div class="post-draft" @click="saveDraft">
|
<div class="post-draft" @click="saveDraft">
|
||||||
<i class="fa-solid fa-floppy-disk"></i>
|
<save-icon />
|
||||||
存草稿
|
存草稿
|
||||||
</div>
|
</div>
|
||||||
<div
|
<div
|
||||||
@@ -30,9 +30,7 @@
|
|||||||
>
|
>
|
||||||
发布
|
发布
|
||||||
</div>
|
</div>
|
||||||
<div v-else class="post-submit-loading">
|
<div v-else class="post-submit-loading"><loading-four /> 发布中...</div>
|
||||||
<i class="fa-solid fa-spinner fa-spin"></i> 发布中...
|
|
||||||
</div>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<LotteryForm v-if="postType === 'LOTTERY'" :data="lottery" />
|
<LotteryForm v-if="postType === 'LOTTERY'" :data="lottery" />
|
||||||
|
|||||||
@@ -25,7 +25,7 @@
|
|||||||
|
|
||||||
<div class="point-info">
|
<div class="point-info">
|
||||||
<p v-if="authState.loggedIn && point !== null">
|
<p v-if="authState.loggedIn && point !== null">
|
||||||
<span><i class="fas fa-coins coin-icon"></i></span>我的积分:<span
|
<span><paper-money-two class="coin-icon" /></span>我的积分:<span
|
||||||
class="point-value"
|
class="point-value"
|
||||||
>{{ point }}</span
|
>{{ point }}</span
|
||||||
>
|
>
|
||||||
@@ -37,7 +37,7 @@
|
|||||||
<BaseImage class="goods-item-image" :src="good.image" alt="good.name" />
|
<BaseImage class="goods-item-image" :src="good.image" alt="good.name" />
|
||||||
<div class="goods-item-name">{{ good.name }}</div>
|
<div class="goods-item-name">{{ good.name }}</div>
|
||||||
<div class="goods-item-cost">
|
<div class="goods-item-cost">
|
||||||
<i class="fas fa-coins"></i>
|
<paper-money-two />
|
||||||
{{ good.cost }} 积分
|
{{ good.cost }} 积分
|
||||||
</div>
|
</div>
|
||||||
<div
|
<div
|
||||||
@@ -63,11 +63,7 @@
|
|||||||
<div class="loading-points-container" v-if="historyLoading">
|
<div class="loading-points-container" v-if="historyLoading">
|
||||||
<l-hatch size="28" stroke="4" speed="3.5" color="var(--primary-color)"></l-hatch>
|
<l-hatch size="28" stroke="4" speed="3.5" color="var(--primary-color)"></l-hatch>
|
||||||
</div>
|
</div>
|
||||||
<BasePlaceholder
|
<BasePlaceholder v-else-if="histories.length === 0" text="暂无积分记录" icon="inbox" />
|
||||||
v-else-if="histories.length === 0"
|
|
||||||
text="暂无积分记录"
|
|
||||||
icon="fas fa-inbox"
|
|
||||||
/>
|
|
||||||
<div class="timeline-container" v-else>
|
<div class="timeline-container" v-else>
|
||||||
<BaseTimeline :items="histories">
|
<BaseTimeline :items="histories">
|
||||||
<template #item="{ item }">
|
<template #item="{ item }">
|
||||||
@@ -189,7 +185,7 @@
|
|||||||
参与,获得 {{ item.amount }} 积分
|
参与,获得 {{ item.amount }} 积分
|
||||||
</template>
|
</template>
|
||||||
<template v-else-if="item.type === 'SYSTEM_ONLINE'"> 积分历史系统上线 </template>
|
<template v-else-if="item.type === 'SYSTEM_ONLINE'"> 积分历史系统上线 </template>
|
||||||
<i class="fas fa-coins"></i> 你目前的积分是 {{ item.balance }}
|
<paper-money-two /> 你目前的积分是 {{ item.balance }}
|
||||||
</div>
|
</div>
|
||||||
<div class="history-time">{{ TimeManager.format(item.createdAt) }}</div>
|
<div class="history-time">{{ TimeManager.format(item.createdAt) }}</div>
|
||||||
</template>
|
</template>
|
||||||
|
|||||||
@@ -12,9 +12,9 @@
|
|||||||
<TagSelect v-model="selectedTags" creatable />
|
<TagSelect v-model="selectedTags" creatable />
|
||||||
</div>
|
</div>
|
||||||
<div class="post-options-right">
|
<div class="post-options-right">
|
||||||
<div class="post-clear" @click="clearPost"><i class="fa-solid fa-eraser"></i> 清空</div>
|
<div class="post-clear" @click="clearPost"><clear-icon /> 清空</div>
|
||||||
<div class="ai-generate" @click="aiGenerate">
|
<div class="ai-generate" @click="aiGenerate">
|
||||||
<i class="fa-solid fa-robot"></i>
|
<smart-optimization />
|
||||||
MD 格式优化
|
MD 格式优化
|
||||||
</div>
|
</div>
|
||||||
<div class="post-cancel" @click="cancelEdit">取消</div>
|
<div class="post-cancel" @click="cancelEdit">取消</div>
|
||||||
@@ -26,9 +26,7 @@
|
|||||||
>
|
>
|
||||||
更新
|
更新
|
||||||
</div>
|
</div>
|
||||||
<div v-else class="post-submit-loading">
|
<div v-else class="post-submit-loading"><loading-four /> 更新中...</div>
|
||||||
<i class="fa-solid fa-spinner fa-spin"></i> 更新中...
|
|
||||||
</div>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -22,7 +22,7 @@
|
|||||||
class="article-subscribe-button"
|
class="article-subscribe-button"
|
||||||
@click="subscribePost"
|
@click="subscribePost"
|
||||||
>
|
>
|
||||||
<i class="fas fa-user-plus"></i>
|
<people-plus />
|
||||||
<div class="article-subscribe-button-text">
|
<div class="article-subscribe-button-text">
|
||||||
{{ isMobile ? '订阅' : '订阅文章' }}
|
{{ isMobile ? '订阅' : '订阅文章' }}
|
||||||
</div>
|
</div>
|
||||||
@@ -32,14 +32,14 @@
|
|||||||
class="article-unsubscribe-button"
|
class="article-unsubscribe-button"
|
||||||
@click="unsubscribePost"
|
@click="unsubscribePost"
|
||||||
>
|
>
|
||||||
<i class="fas fa-user-minus"></i>
|
<people-minus-one />
|
||||||
<div class="article-unsubscribe-button-text">
|
<div class="article-unsubscribe-button-text">
|
||||||
{{ isMobile ? '退订' : '取消订阅' }}
|
{{ isMobile ? '退订' : '取消订阅' }}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<DropdownMenu v-if="articleMenuItems.length > 0" :items="articleMenuItems">
|
<DropdownMenu v-if="articleMenuItems.length > 0" :items="articleMenuItems">
|
||||||
<template #trigger>
|
<template #trigger>
|
||||||
<i class="fas fa-ellipsis-vertical action-menu-icon"></i>
|
<more-one class="action-menu-icon" />
|
||||||
</template>
|
</template>
|
||||||
</DropdownMenu>
|
</DropdownMenu>
|
||||||
</div>
|
</div>
|
||||||
@@ -53,7 +53,7 @@
|
|||||||
<div v-if="isMobile" class="info-content-header">
|
<div v-if="isMobile" class="info-content-header">
|
||||||
<div class="user-name">
|
<div class="user-name">
|
||||||
{{ author.username }}
|
{{ author.username }}
|
||||||
<i class="fas fa-medal medal-icon"></i>
|
<medal-one class="medal-icon" />
|
||||||
<NuxtLink
|
<NuxtLink
|
||||||
v-if="author.displayMedal"
|
v-if="author.displayMedal"
|
||||||
class="user-medal"
|
class="user-medal"
|
||||||
@@ -69,7 +69,7 @@
|
|||||||
<div v-if="!isMobile" class="info-content-header">
|
<div v-if="!isMobile" class="info-content-header">
|
||||||
<div class="user-name">
|
<div class="user-name">
|
||||||
{{ author.username }}
|
{{ author.username }}
|
||||||
<i class="fas fa-medal medal-icon"></i>
|
<medal-one class="medal-icon" />
|
||||||
<NuxtLink
|
<NuxtLink
|
||||||
v-if="author.displayMedal"
|
v-if="author.displayMedal"
|
||||||
class="user-medal"
|
class="user-medal"
|
||||||
@@ -88,7 +88,7 @@
|
|||||||
<div class="article-footer-container">
|
<div class="article-footer-container">
|
||||||
<ReactionsGroup v-model="postReactions" content-type="post" :content-id="postId">
|
<ReactionsGroup v-model="postReactions" content-type="post" :content-id="postId">
|
||||||
<div class="make-reaction-item copy-link" @click="copyPostLink">
|
<div class="make-reaction-item copy-link" @click="copyPostLink">
|
||||||
<i class="fas fa-link"></i>
|
<link-icon />
|
||||||
</div>
|
</div>
|
||||||
</ReactionsGroup>
|
</ReactionsGroup>
|
||||||
</div>
|
</div>
|
||||||
@@ -707,8 +707,8 @@ const unsubscribePost = async () => {
|
|||||||
|
|
||||||
const fetchCommentSorts = () => {
|
const fetchCommentSorts = () => {
|
||||||
return Promise.resolve([
|
return Promise.resolve([
|
||||||
{ id: 'NEWEST', name: '最新', icon: 'fas fa-clock' },
|
{ id: 'NEWEST', name: '最新', icon: 'lightning' },
|
||||||
{ id: 'OLDEST', name: '最旧', icon: 'fas fa-hourglass-start' },
|
{ id: 'OLDEST', name: '最旧', icon: 'history-icon' },
|
||||||
// { id: 'MOST_INTERACTIONS', name: '最多互动', icon: 'fas fa-fire' }
|
// { id: 'MOST_INTERACTIONS', name: '最多互动', icon: 'fas fa-fire' }
|
||||||
])
|
])
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -7,7 +7,7 @@
|
|||||||
@crop="onCropped"
|
@crop="onCropped"
|
||||||
/>
|
/>
|
||||||
<div v-if="isLoadingPage" class="loading-page">
|
<div v-if="isLoadingPage" class="loading-page">
|
||||||
<l-hatch size="20" stroke="4" speed="3.5" color="var(--primary-color)"></l-hatch>
|
<l-hatch size="28" stroke="4" speed="3.5" color="var(--primary-color)"></l-hatch>
|
||||||
</div>
|
</div>
|
||||||
<div v-else>
|
<div v-else>
|
||||||
<div class="settings-title">个人资料设置</div>
|
<div class="settings-title">个人资料设置</div>
|
||||||
@@ -23,7 +23,7 @@
|
|||||||
</div>
|
</div>
|
||||||
<div class="form-row username-row">
|
<div class="form-row username-row">
|
||||||
<BaseInput
|
<BaseInput
|
||||||
icon="User"
|
icon="user-icon"
|
||||||
v-model="username"
|
v-model="username"
|
||||||
@input="usernameError = ''"
|
@input="usernameError = ''"
|
||||||
placeholder="用户名"
|
placeholder="用户名"
|
||||||
@@ -133,15 +133,15 @@ const onCropped = ({ file, url }) => {
|
|||||||
}
|
}
|
||||||
const fetchPublishModes = () => {
|
const fetchPublishModes = () => {
|
||||||
return Promise.resolve([
|
return Promise.resolve([
|
||||||
{ id: 'DIRECT', name: '直接发布', icon: 'fas fa-bolt' },
|
{ id: 'DIRECT', name: '直接发布', icon: 'send-icon' },
|
||||||
{ id: 'REVIEW', name: '审核后发布', icon: 'fas fa-search' },
|
{ id: 'REVIEW', name: '审核后发布', icon: 'search-icon' },
|
||||||
])
|
])
|
||||||
}
|
}
|
||||||
const fetchPasswordStrengths = () => {
|
const fetchPasswordStrengths = () => {
|
||||||
return Promise.resolve([
|
return Promise.resolve([
|
||||||
{ id: 'LOW', name: '低', icon: 'fas fa-lock-open' },
|
{ id: 'LOW', name: '低', icon: 'unlock' },
|
||||||
{ id: 'MEDIUM', name: '中', icon: 'fas fa-lock' },
|
{ id: 'MEDIUM', name: '中', icon: 'lock-one' },
|
||||||
{ id: 'HIGH', name: '高', icon: 'fas fa-user-shield' },
|
{ id: 'HIGH', name: '高', icon: 'lock' },
|
||||||
])
|
])
|
||||||
}
|
}
|
||||||
const fetchAiLimits = () => {
|
const fetchAiLimits = () => {
|
||||||
@@ -154,8 +154,8 @@ const fetchAiLimits = () => {
|
|||||||
}
|
}
|
||||||
const fetchRegisterModes = () => {
|
const fetchRegisterModes = () => {
|
||||||
return Promise.resolve([
|
return Promise.resolve([
|
||||||
{ id: 'DIRECT', name: '直接注册', icon: 'fas fa-user-check' },
|
{ id: 'DIRECT', name: '直接注册', icon: 'send-icon' },
|
||||||
{ id: 'WHITELIST', name: '白名单邀请制', icon: 'fas fa-envelope' },
|
{ id: 'WHITELIST', name: '白名单邀请制', icon: 'search-icon' },
|
||||||
])
|
])
|
||||||
}
|
}
|
||||||
const loadAdminConfig = async () => {
|
const loadAdminConfig = async () => {
|
||||||
|
|||||||
@@ -6,11 +6,11 @@
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div v-if="emailStep === 0" class="email-signup-page-content">
|
<div v-if="emailStep === 0" class="email-signup-page-content">
|
||||||
<BaseInput icon="Mail" v-model="email" @input="emailError = ''" placeholder="邮箱" />
|
<BaseInput icon="mail" v-model="email" @input="emailError = ''" placeholder="邮箱" />
|
||||||
<div v-if="emailError" class="error-message">{{ emailError }}</div>
|
<div v-if="emailError" class="error-message">{{ emailError }}</div>
|
||||||
|
|
||||||
<BaseInput
|
<BaseInput
|
||||||
icon="User"
|
icon="user-icon"
|
||||||
v-model="username"
|
v-model="username"
|
||||||
@input="usernameError = ''"
|
@input="usernameError = ''"
|
||||||
placeholder="用户名"
|
placeholder="用户名"
|
||||||
@@ -18,7 +18,7 @@
|
|||||||
<div v-if="usernameError" class="error-message">{{ usernameError }}</div>
|
<div v-if="usernameError" class="error-message">{{ usernameError }}</div>
|
||||||
|
|
||||||
<BaseInput
|
<BaseInput
|
||||||
icon="Lock"
|
icon="lock"
|
||||||
v-model="password"
|
v-model="password"
|
||||||
@input="passwordError = ''"
|
@input="passwordError = ''"
|
||||||
type="password"
|
type="password"
|
||||||
@@ -35,7 +35,7 @@
|
|||||||
</div>
|
</div>
|
||||||
<div v-else class="signup-page-button-primary disabled">
|
<div v-else class="signup-page-button-primary disabled">
|
||||||
<div class="signup-page-button-text">
|
<div class="signup-page-button-text">
|
||||||
<i class="fas fa-spinner fa-spin"></i>
|
<loading-four />
|
||||||
发送中...
|
发送中...
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@@ -46,7 +46,7 @@
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div v-if="emailStep === 1" class="email-signup-page-content">
|
<div v-if="emailStep === 1" class="email-signup-page-content">
|
||||||
<BaseInput icon="Mail" v-model="code" placeholder="邮箱验证码" />
|
<BaseInput icon="mail" v-model="code" placeholder="邮箱验证码" />
|
||||||
<div
|
<div
|
||||||
v-if="!isWaitingForEmailVerified"
|
v-if="!isWaitingForEmailVerified"
|
||||||
class="signup-page-button-primary"
|
class="signup-page-button-primary"
|
||||||
@@ -56,7 +56,7 @@
|
|||||||
</div>
|
</div>
|
||||||
<div v-else class="signup-page-button-primary disabled">
|
<div v-else class="signup-page-button-primary disabled">
|
||||||
<div class="signup-page-button-text">
|
<div class="signup-page-button-text">
|
||||||
<i class="fas fa-spinner fa-spin"></i>
|
<loading-four />
|
||||||
验证中...
|
验证中...
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -45,7 +45,7 @@
|
|||||||
content="经验值可通过发帖、评论等操作获得,达到目标后即可提升等级,解锁更多功能。"
|
content="经验值可通过发帖、评论等操作获得,达到目标后即可提升等级,解锁更多功能。"
|
||||||
placement="bottom"
|
placement="bottom"
|
||||||
>
|
>
|
||||||
<info class="profile-exp-info" />
|
<info-icon class="profile-exp-info" />
|
||||||
</ToolTip>
|
</ToolTip>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@@ -207,7 +207,7 @@
|
|||||||
<BasePlaceholder
|
<BasePlaceholder
|
||||||
v-if="filteredTimelineItems.length === 0"
|
v-if="filteredTimelineItems.length === 0"
|
||||||
text="暂无时间线"
|
text="暂无时间线"
|
||||||
icon="fas fa-inbox"
|
icon="inbox"
|
||||||
/>
|
/>
|
||||||
<div class="timeline-list">
|
<div class="timeline-list">
|
||||||
<BaseTimeline :items="filteredTimelineItems">
|
<BaseTimeline :items="filteredTimelineItems">
|
||||||
@@ -305,7 +305,7 @@
|
|||||||
</BaseTimeline>
|
</BaseTimeline>
|
||||||
</div>
|
</div>
|
||||||
<div v-else>
|
<div v-else>
|
||||||
<BasePlaceholder text="暂无收藏文章" icon="fas fa-inbox" />
|
<BasePlaceholder text="暂无收藏文章" icon="inbox" />
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|||||||
@@ -36,9 +36,32 @@ import {
|
|||||||
MessageOne,
|
MessageOne,
|
||||||
AlarmClock,
|
AlarmClock,
|
||||||
Bookmark,
|
Bookmark,
|
||||||
|
Inbox,
|
||||||
|
LoadingFour,
|
||||||
Mail,
|
Mail,
|
||||||
Lock,
|
Lock,
|
||||||
User,
|
User,
|
||||||
|
Send,
|
||||||
|
Unlock,
|
||||||
|
LockOne,
|
||||||
|
ImageFiles,
|
||||||
|
ExpandUp,
|
||||||
|
Close,
|
||||||
|
ArrowLeft,
|
||||||
|
CollapseTextInput,
|
||||||
|
Stopwatch,
|
||||||
|
PaperMoneyTwo,
|
||||||
|
Check,
|
||||||
|
ChartHistogram,
|
||||||
|
CheckCorrect,
|
||||||
|
PeoplePlus,
|
||||||
|
PeopleMinusOne,
|
||||||
|
SmartOptimization,
|
||||||
|
Save,
|
||||||
|
Clear,
|
||||||
|
FileText,
|
||||||
|
History,
|
||||||
|
Lightning,
|
||||||
} from '@icon-park/vue-next'
|
} from '@icon-park/vue-next'
|
||||||
|
|
||||||
export default defineNuxtPlugin((nuxtApp) => {
|
export default defineNuxtPlugin((nuxtApp) => {
|
||||||
@@ -50,7 +73,7 @@ export default defineNuxtPlugin((nuxtApp) => {
|
|||||||
nuxtApp.vueApp.component('Edit', Edit)
|
nuxtApp.vueApp.component('Edit', Edit)
|
||||||
nuxtApp.vueApp.component('HashtagKey', HashtagKey)
|
nuxtApp.vueApp.component('HashtagKey', HashtagKey)
|
||||||
nuxtApp.vueApp.component('Remind', Remind)
|
nuxtApp.vueApp.component('Remind', Remind)
|
||||||
nuxtApp.vueApp.component('Info', Info)
|
nuxtApp.vueApp.component('InfoIcon', Info)
|
||||||
nuxtApp.vueApp.component('ChartLine', ChartLine)
|
nuxtApp.vueApp.component('ChartLine', ChartLine)
|
||||||
nuxtApp.vueApp.component('Finance', Finance)
|
nuxtApp.vueApp.component('Finance', Finance)
|
||||||
nuxtApp.vueApp.component('Up', Up)
|
nuxtApp.vueApp.component('Up', Up)
|
||||||
@@ -78,7 +101,30 @@ export default defineNuxtPlugin((nuxtApp) => {
|
|||||||
nuxtApp.vueApp.component('MessageOne', MessageOne)
|
nuxtApp.vueApp.component('MessageOne', MessageOne)
|
||||||
nuxtApp.vueApp.component('AlarmClock', AlarmClock)
|
nuxtApp.vueApp.component('AlarmClock', AlarmClock)
|
||||||
nuxtApp.vueApp.component('Bookmark', Bookmark)
|
nuxtApp.vueApp.component('Bookmark', Bookmark)
|
||||||
|
nuxtApp.vueApp.component('Inbox', Inbox)
|
||||||
|
nuxtApp.vueApp.component('LoadingFour', LoadingFour)
|
||||||
|
nuxtApp.vueApp.component('UserIcon', User)
|
||||||
nuxtApp.vueApp.component('Mail', Mail)
|
nuxtApp.vueApp.component('Mail', Mail)
|
||||||
nuxtApp.vueApp.component('Lock', Lock)
|
nuxtApp.vueApp.component('Lock', Lock)
|
||||||
nuxtApp.vueApp.component('User', User)
|
nuxtApp.vueApp.component('SendIcon', Send)
|
||||||
|
nuxtApp.vueApp.component('Unlock', Unlock)
|
||||||
|
nuxtApp.vueApp.component('LockOne', LockOne)
|
||||||
|
nuxtApp.vueApp.component('ImageFiles', ImageFiles)
|
||||||
|
nuxtApp.vueApp.component('ExpandUp', ExpandUp)
|
||||||
|
nuxtApp.vueApp.component('CloseIcon', Close)
|
||||||
|
nuxtApp.vueApp.component('ArrowLeft', ArrowLeft)
|
||||||
|
nuxtApp.vueApp.component('CollapseTextInput', CollapseTextInput)
|
||||||
|
nuxtApp.vueApp.component('Stopwatch', Stopwatch)
|
||||||
|
nuxtApp.vueApp.component('PaperMoneyTwo', PaperMoneyTwo)
|
||||||
|
nuxtApp.vueApp.component('Check', Check)
|
||||||
|
nuxtApp.vueApp.component('ChartHistogram', ChartHistogram)
|
||||||
|
nuxtApp.vueApp.component('CheckCorrect', CheckCorrect)
|
||||||
|
nuxtApp.vueApp.component('PeoplePlus', PeoplePlus)
|
||||||
|
nuxtApp.vueApp.component('PeopleMinusOne', PeopleMinusOne)
|
||||||
|
nuxtApp.vueApp.component('SmartOptimization', SmartOptimization)
|
||||||
|
nuxtApp.vueApp.component('SaveIcon', Save)
|
||||||
|
nuxtApp.vueApp.component('ClearIcon', Clear)
|
||||||
|
nuxtApp.vueApp.component('FileText', FileText)
|
||||||
|
nuxtApp.vueApp.component('HistoryIcon', History)
|
||||||
|
nuxtApp.vueApp.component('Lightning', Lightning)
|
||||||
})
|
})
|
||||||
|
|||||||
@@ -9,28 +9,28 @@ export const notificationState = reactive({
|
|||||||
})
|
})
|
||||||
|
|
||||||
const iconMap = {
|
const iconMap = {
|
||||||
POST_VIEWED: 'fas fa-eye',
|
POST_VIEWED: 'HistoryIcon',
|
||||||
COMMENT_REPLY: 'fas fa-reply',
|
COMMENT_REPLY: 'MessageOne',
|
||||||
POST_REVIEWED: 'fas fa-shield-alt',
|
POST_REVIEWED: 'CheckCorrect',
|
||||||
POST_REVIEW_REQUEST: 'fas fa-gavel',
|
POST_REVIEW_REQUEST: 'FileText',
|
||||||
POST_UPDATED: 'fas fa-comment-dots',
|
POST_UPDATED: 'Edit',
|
||||||
USER_ACTIVITY: 'fas fa-user',
|
USER_ACTIVITY: 'UserIcon',
|
||||||
FOLLOWED_POST: 'fas fa-feather-alt',
|
FOLLOWED_POST: 'Pin',
|
||||||
USER_FOLLOWED: 'fas fa-user-plus',
|
USER_FOLLOWED: 'AddUser',
|
||||||
USER_UNFOLLOWED: 'fas fa-user-minus',
|
USER_UNFOLLOWED: 'ReduceUser',
|
||||||
POST_SUBSCRIBED: 'fas fa-bookmark',
|
POST_SUBSCRIBED: 'Bookmark',
|
||||||
POST_UNSUBSCRIBED: 'fas fa-bookmark',
|
POST_UNSUBSCRIBED: 'Bookmark',
|
||||||
REGISTER_REQUEST: 'fas fa-user-clock',
|
REGISTER_REQUEST: 'AlarmClock',
|
||||||
ACTIVITY_REDEEM: 'fas fa-coffee',
|
ACTIVITY_REDEEM: 'PaperMoneyTwo',
|
||||||
POINT_REDEEM: 'fas fa-gift',
|
POINT_REDEEM: 'Gift',
|
||||||
LOTTERY_WIN: 'fas fa-trophy',
|
LOTTERY_WIN: 'MedalOne',
|
||||||
LOTTERY_DRAW: 'fas fa-bullhorn',
|
LOTTERY_DRAW: 'Fireworks',
|
||||||
POLL_VOTE: 'fas fa-square-poll-vertical',
|
POLL_VOTE: 'ChartHistogram',
|
||||||
POLL_RESULT_OWNER: 'fas fa-flag-checkered',
|
POLL_RESULT_OWNER: 'RankingList',
|
||||||
POLL_RESULT_PARTICIPANT: 'fas fa-flag-checkered',
|
POLL_RESULT_PARTICIPANT: 'ChartLine',
|
||||||
MENTION: 'fas fa-at',
|
MENTION: 'HashtagKey',
|
||||||
POST_DELETED: 'fas fa-trash',
|
POST_DELETED: 'ClearIcon',
|
||||||
POST_FEATURED: 'fas fa-star',
|
POST_FEATURED: 'Star',
|
||||||
}
|
}
|
||||||
|
|
||||||
export async function fetchUnreadCount() {
|
export async function fetchUnreadCount() {
|
||||||
|
|||||||
@@ -23,7 +23,7 @@ export default (apiBaseUrl, websiteBaseUrl) => {
|
|||||||
return (
|
return (
|
||||||
body.map((item) => ({
|
body.map((item) => ({
|
||||||
value: `[🔗${item.title}](${websiteBaseUrl}/posts/${item.id})`,
|
value: `[🔗${item.title}](${websiteBaseUrl}/posts/${item.id})`,
|
||||||
html: `<div><i class="fas fa-link"></i> ${item.title}</div>`,
|
html: `<div><link-icon /> ${item.title}</div>`,
|
||||||
})) ?? []
|
})) ?? []
|
||||||
)
|
)
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
Reference in New Issue
Block a user