mirror of
https://github.com/nagisa77/OpenIsle.git
synced 2026-02-06 23:21:16 +08:00
refactor: migrate placeholders to IconPark
This commit is contained in:
@@ -1,6 +1,6 @@
|
||||
<template>
|
||||
<div class="base-placeholder">
|
||||
<i :class="['base-placeholder-icon', icon]" />
|
||||
<component :is="icon" class="base-placeholder-icon" theme="outline" size="48" />
|
||||
<div class="base-placeholder-text">
|
||||
<slot>{{ text }}</slot>
|
||||
</div>
|
||||
@@ -12,7 +12,7 @@ export default {
|
||||
name: 'BasePlaceholder',
|
||||
props: {
|
||||
text: { type: String, default: '' },
|
||||
icon: { type: String, default: 'fas fa-inbox' },
|
||||
icon: { type: String, default: 'Inbox' },
|
||||
},
|
||||
}
|
||||
</script>
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
<template>
|
||||
<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)">
|
||||
<BaseImage :src="u.avatar" alt="avatar" class="user-avatar" />
|
||||
<div class="user-info">
|
||||
|
||||
@@ -56,7 +56,7 @@
|
||||
<BasePlaceholder
|
||||
v-if="messages.length === 0"
|
||||
text="暂无会话,发送消息试试 🎉"
|
||||
icon="fas fa-inbox"
|
||||
icon="Inbox"
|
||||
/>
|
||||
</div>
|
||||
</template>
|
||||
@@ -351,9 +351,9 @@ onMounted(async () => {
|
||||
})
|
||||
|
||||
const subscribeToConversation = () => {
|
||||
if (!currentUser.value) return;
|
||||
if (!currentUser.value) return
|
||||
const destination = `/topic/conversation/${conversationId}`
|
||||
|
||||
|
||||
subscribe(destination, async (message) => {
|
||||
try {
|
||||
const parsedMessage = JSON.parse(message.body)
|
||||
@@ -370,12 +370,12 @@ const subscribeToConversation = () => {
|
||||
|
||||
await markConversationAsRead()
|
||||
await nextTick()
|
||||
|
||||
|
||||
if (isUserNearBottom.value) {
|
||||
scrollToBottomSmooth()
|
||||
}
|
||||
} 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()
|
||||
scrollToBottomSmooth()
|
||||
updateNearBottom()
|
||||
|
||||
|
||||
if (isConnected.value) {
|
||||
// 如果已连接,重新订阅
|
||||
subscribeToConversation()
|
||||
|
||||
@@ -22,7 +22,7 @@
|
||||
</div>
|
||||
|
||||
<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
|
||||
@@ -73,7 +73,7 @@
|
||||
</div>
|
||||
<div v-else>
|
||||
<div v-if="channels.length === 0" class="empty-container">
|
||||
<BasePlaceholder text="暂无频道" icon="fas fa-inbox" />
|
||||
<BasePlaceholder text="暂无频道" icon="Inbox" />
|
||||
</div>
|
||||
<div
|
||||
v-for="ch in channels"
|
||||
@@ -273,9 +273,9 @@ onActivated(async () => {
|
||||
})
|
||||
|
||||
const subscribeToUserMessages = () => {
|
||||
if (!currentUser.value) return;
|
||||
if (!currentUser.value) return
|
||||
const destination = `/topic/user/${currentUser.value.id}/messages`
|
||||
|
||||
|
||||
subscribe(destination, (message) => {
|
||||
if (activeTab.value === 'messages') {
|
||||
fetchConversations()
|
||||
|
||||
@@ -14,8 +14,12 @@
|
||||
<div class="message-control-container">
|
||||
<div class="message-control-title">通知设置</div>
|
||||
<div class="message-control-item-container">
|
||||
<template v-for="pref in notificationPrefs">
|
||||
<div v-if="canShowNotification(pref.type)" :key="pref.type" class="message-control-item">
|
||||
<template v-for="pref in notificationPrefs">
|
||||
<div
|
||||
v-if="canShowNotification(pref.type)"
|
||||
:key="pref.type"
|
||||
class="message-control-item"
|
||||
>
|
||||
<div class="message-control-item-label">{{ formatType(pref.type) }}</div>
|
||||
<BaseSwitch
|
||||
:model-value="pref.enabled"
|
||||
@@ -47,7 +51,7 @@
|
||||
<BasePlaceholder
|
||||
v-else-if="notifications.length === 0"
|
||||
text="暂时没有消息 :)"
|
||||
icon="fas fa-inbox"
|
||||
icon="Inbox"
|
||||
/>
|
||||
|
||||
<div class="timeline-container" v-if="notifications.length > 0">
|
||||
@@ -757,7 +761,12 @@ const formatType = (t) => {
|
||||
|
||||
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) => {
|
||||
return !needAdminSet.has(type) || isAdmin.value
|
||||
|
||||
@@ -63,11 +63,7 @@
|
||||
<div class="loading-points-container" v-if="historyLoading">
|
||||
<l-hatch size="28" stroke="4" speed="3.5" color="var(--primary-color)"></l-hatch>
|
||||
</div>
|
||||
<BasePlaceholder
|
||||
v-else-if="histories.length === 0"
|
||||
text="暂无积分记录"
|
||||
icon="fas fa-inbox"
|
||||
/>
|
||||
<BasePlaceholder v-else-if="histories.length === 0" text="暂无积分记录" icon="Inbox" />
|
||||
<div class="timeline-container" v-else>
|
||||
<BaseTimeline :items="histories">
|
||||
<template #item="{ item }">
|
||||
|
||||
@@ -207,7 +207,7 @@
|
||||
<BasePlaceholder
|
||||
v-if="filteredTimelineItems.length === 0"
|
||||
text="暂无时间线"
|
||||
icon="fas fa-inbox"
|
||||
icon="Inbox"
|
||||
/>
|
||||
<div class="timeline-list">
|
||||
<BaseTimeline :items="filteredTimelineItems">
|
||||
@@ -305,7 +305,7 @@
|
||||
</BaseTimeline>
|
||||
</div>
|
||||
<div v-else>
|
||||
<BasePlaceholder text="暂无收藏文章" icon="fas fa-inbox" />
|
||||
<BasePlaceholder text="暂无收藏文章" icon="Inbox" />
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
@@ -36,6 +36,7 @@ import {
|
||||
MessageOne,
|
||||
AlarmClock,
|
||||
Bookmark,
|
||||
Inbox,
|
||||
} from '@icon-park/vue-next'
|
||||
|
||||
export default defineNuxtPlugin((nuxtApp) => {
|
||||
@@ -75,4 +76,5 @@ export default defineNuxtPlugin((nuxtApp) => {
|
||||
nuxtApp.vueApp.component('MessageOne', MessageOne)
|
||||
nuxtApp.vueApp.component('AlarmClock', AlarmClock)
|
||||
nuxtApp.vueApp.component('Bookmark', Bookmark)
|
||||
nuxtApp.vueApp.component('Inbox', Inbox)
|
||||
})
|
||||
|
||||
Reference in New Issue
Block a user