✨ Channel manage
This commit is contained in:
parent
012a02751c
commit
73b1e376a3
@ -1,7 +1,7 @@
|
||||
<template>
|
||||
<v-menu eager :close-on-content-click="false">
|
||||
<template #activator="{ props }">
|
||||
<v-btn v-bind="props" stacked rounded="circle" size="small" variant="text" :loading="loading">
|
||||
<v-btn v-bind="props" icon rounded="circle" size="small" variant="text" :loading="loading">
|
||||
<v-badge v-if="pagination.total > 0" color="error" :content="pagination.total">
|
||||
<v-icon icon="mdi-bell" />
|
||||
</v-badge>
|
||||
|
36
src/components/chat/channels/ChannelAction.vue
Normal file
36
src/components/chat/channels/ChannelAction.vue
Normal file
@ -0,0 +1,36 @@
|
||||
<template>
|
||||
<v-menu>
|
||||
<template #activator="{ props }">
|
||||
<v-btn v-bind="props" icon="mdi-cog" variant="text" />
|
||||
</template>
|
||||
|
||||
<v-list density="compact" lines="one">
|
||||
<v-list-item disabled append-icon="mdi-flag" title="Report" />
|
||||
<v-list-item v-if="isOwned" append-icon="mdi-pencil" title="Edit" @click="editChannel" />
|
||||
<v-list-item v-if="isOwned" append-icon="mdi-delete" title="Delete" @click="deleteChannel" />
|
||||
</v-list>
|
||||
</v-menu>
|
||||
</template>
|
||||
|
||||
<script setup lang="ts">
|
||||
import { useUserinfo } from "@/stores/userinfo"
|
||||
import { useChannels } from "@/stores/channels"
|
||||
import { computed } from "vue"
|
||||
|
||||
const id = useUserinfo()
|
||||
const channels = useChannels()
|
||||
|
||||
const props = defineProps<{ item: any }>()
|
||||
|
||||
const isOwned = computed(() => props.item?.account_id === id.userinfo.idSet?.messaging)
|
||||
|
||||
function editChannel() {
|
||||
channels.related.edit_to = props.item
|
||||
channels.show.editor = true
|
||||
}
|
||||
|
||||
function deleteChannel() {
|
||||
channels.related.delete_to = props.item
|
||||
channels.show.delete = true
|
||||
}
|
||||
</script>
|
@ -22,7 +22,7 @@ const realms = useRealms()
|
||||
|
||||
const props = defineProps<{ item: any }>()
|
||||
|
||||
const isOwned = computed(() => props.item?.account_id === id.userinfo.data.id)
|
||||
const isOwned = computed(() => props.item?.account_id === id.userinfo.idSet?.interactive)
|
||||
|
||||
function editRealm() {
|
||||
realms.related.edit_to = props.item
|
||||
|
@ -4,8 +4,13 @@
|
||||
<v-app-bar-nav-icon icon="mdi-chat" :loading="loading" />
|
||||
|
||||
<h2 class="ml-2 text-lg font-500">{{ channels.current?.name }}</h2>
|
||||
|
||||
<p class="ml-3 text-xs opacity-80">{{ channels.current?.description }}</p>
|
||||
|
||||
<v-spacer />
|
||||
|
||||
<div v-if="channels.current">
|
||||
<channel-action :item="channels.current" />
|
||||
</div>
|
||||
</div>
|
||||
</v-app-bar>
|
||||
|
||||
@ -20,6 +25,7 @@ import { request } from "@/scripts/request"
|
||||
import { useRoute } from "vue-router"
|
||||
import { ref, watch } from "vue"
|
||||
import { useChannels } from "@/stores/channels"
|
||||
import ChannelAction from "@/components/chat/channels/ChannelAction.vue"
|
||||
|
||||
const route = useRoute()
|
||||
const channels = useChannels()
|
||||
@ -47,4 +53,13 @@ watch(
|
||||
},
|
||||
{ immediate: true }
|
||||
)
|
||||
|
||||
watch(() => channels.done, (val) => {
|
||||
if (val) {
|
||||
readMetadata().then(() => {
|
||||
channels.messages = []
|
||||
channels.done = false
|
||||
})
|
||||
}
|
||||
}, { immediate: true })
|
||||
</script>
|
@ -9,6 +9,7 @@ export interface Userinfo {
|
||||
isReady: boolean
|
||||
isLoggedIn: boolean
|
||||
displayName: string
|
||||
idSet: { [id: string]: number }
|
||||
data: any
|
||||
}
|
||||
|
||||
@ -16,6 +17,7 @@ const defaultUserinfo: Userinfo = {
|
||||
isReady: false,
|
||||
isLoggedIn: false,
|
||||
displayName: "Citizen",
|
||||
idSet: {},
|
||||
data: null
|
||||
}
|
||||
|
||||
@ -47,17 +49,29 @@ export const useUserinfo = defineStore("userinfo", () => {
|
||||
const res = await request("identity", "/api/users/me", {
|
||||
headers: { Authorization: `Bearer ${await getAtk()}` }
|
||||
})
|
||||
|
||||
if (res.status !== 200) {
|
||||
return
|
||||
}
|
||||
|
||||
const data = await res.json()
|
||||
|
||||
const federationResp = await Promise.all([
|
||||
request("interactive", "/api/users/me", {
|
||||
headers: { Authorization: `Bearer ${await getAtk()}` }
|
||||
}),
|
||||
request("messaging", "/api/users/me", {
|
||||
headers: { Authorization: `Bearer ${await getAtk()}` }
|
||||
})
|
||||
])
|
||||
|
||||
userinfo.value = {
|
||||
isReady: true,
|
||||
isLoggedIn: true,
|
||||
displayName: data["nick"],
|
||||
idSet: {
|
||||
interactive: (await federationResp[0].json())["id"],
|
||||
messaging: (await federationResp[1].json())["id"]
|
||||
},
|
||||
data: data
|
||||
}
|
||||
|
||||
|
@ -74,9 +74,13 @@ async function readMore({ done }: any) {
|
||||
|
||||
watch(() => channels.current, (val) => {
|
||||
if (val) {
|
||||
pagination.page = 1
|
||||
pagination.total = 0
|
||||
readHistory()
|
||||
}
|
||||
}, { immediate: true })
|
||||
},
|
||||
{ immediate: true }
|
||||
)
|
||||
|
||||
function scrollTop() {
|
||||
window.scroll({ top: 0 })
|
||||
|
@ -105,6 +105,8 @@ watch(
|
||||
() => route.params.realmId,
|
||||
() => {
|
||||
posts.value = []
|
||||
pagination.page = 1
|
||||
pagination.total = 0
|
||||
readMetadata()
|
||||
readPosts()
|
||||
},
|
||||
|
Reference in New Issue
Block a user