| <script lang="ts" setup> |
| import { computed, nextTick } from 'vue' |
| import { HoverButton, SvgIcon } from '@/components/common' |
| import { useAppStore, useChatStore } from '@/store' |
| |
| interface Props { |
| usingContext: boolean |
| } |
| |
| interface Emit { |
| (ev: 'export'): void |
| (ev: 'toggleUsingContext'): void |
| } |
| |
| defineProps<Props>() |
| |
| const emit = defineEmits<Emit>() |
| |
| const appStore = useAppStore() |
| const chatStore = useChatStore() |
| |
| const collapsed = computed(() => appStore.siderCollapsed) |
| const currentChatHistory = computed(() => chatStore.getChatHistoryByCurrentActive) |
| |
| function handleUpdateCollapsed() { |
| appStore.setSiderCollapsed(!collapsed.value) |
| } |
| |
| function onScrollToTop() { |
| const scrollRef = document.querySelector('#scrollRef') |
| if (scrollRef) |
| nextTick(() => scrollRef.scrollTop = 0) |
| } |
| |
| function handleExport() { |
| emit('export') |
| } |
| |
| function toggleUsingContext() { |
| emit('toggleUsingContext') |
| } |
| </script> |
| |
| <template> |
| <header |
| class="sticky top-0 left-0 right-0 z-30 border-b dark:border-neutral-800 bg-white/80 dark:bg-black/20 backdrop-blur" |
| > |
| <div class="relative flex items-center justify-between min-w-0 overflow-hidden h-14"> |
| <div class="flex items-center"> |
| <button |
| class="flex items-center justify-center w-11 h-11" |
| @click="handleUpdateCollapsed" |
| > |
| <SvgIcon v-if="collapsed" class="text-2xl" icon="ri:align-justify" /> |
| <SvgIcon v-else class="text-2xl" icon="ri:align-right" /> |
| </button> |
| </div> |
| <h1 |
| class="flex-1 px-4 pr-6 overflow-hidden cursor-pointer select-none text-ellipsis whitespace-nowrap" |
| @dblclick="onScrollToTop" |
| > |
| {{ currentChatHistory?.title ?? '' }} |
| </h1> |
| <div class="flex items-center space-x-2"> |
| <HoverButton @click="toggleUsingContext"> |
| <span class="text-xl" :class="{ 'text-[#4b9e5f]': usingContext, 'text-[#a8071a]': !usingContext }"> |
| <SvgIcon icon="ri:chat-history-line" /> |
| </span> |
| </HoverButton> |
| <HoverButton @click="handleExport"> |
| <span class="text-xl text-[#4f555e] dark:text-white"> |
| <SvgIcon icon="ri:download-2-line" /> |
| </span> |
| </HoverButton> |
| </div> |
| </div> |
| </header> |
| </template> |
| |