選択できるのは25トピックまでです。 トピックは、先頭が英数字で、英数字とダッシュ('-')を使用した35文字以内のものにしてください。

use-document-title.ts 1.4KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344
  1. 'use client'
  2. import { useGlobalPublicStore } from '@/context/global-public-context'
  3. import { useFavicon, useTitle } from 'ahooks'
  4. import { basePath } from '@/utils/var'
  5. import { useEffect } from 'react'
  6. export default function useDocumentTitle(title: string) {
  7. const isPending = useGlobalPublicStore(s => s.isGlobalPending)
  8. const systemFeatures = useGlobalPublicStore(s => s.systemFeatures)
  9. const prefix = title ? `${title} - ` : ''
  10. let titleStr = ''
  11. let favicon = ''
  12. if (isPending === false) {
  13. if (systemFeatures.branding.enabled) {
  14. titleStr = `${prefix}${systemFeatures.branding.application_title}`
  15. favicon = systemFeatures.branding.favicon
  16. }
  17. else {
  18. titleStr = `${prefix}Dify`
  19. favicon = `${basePath}/favicon.ico`
  20. }
  21. }
  22. useTitle(titleStr)
  23. useEffect(() => {
  24. let apple: HTMLLinkElement | null = null
  25. if (systemFeatures.branding.favicon) {
  26. document
  27. .querySelectorAll(
  28. 'link[rel=\'icon\'], link[rel=\'shortcut icon\'], link[rel=\'apple-touch-icon\'], link[rel=\'mask-icon\']',
  29. )
  30. .forEach(n => n.parentNode?.removeChild(n))
  31. apple = document.createElement('link')
  32. apple.rel = 'apple-touch-icon'
  33. apple.href = systemFeatures.branding.favicon
  34. document.head.appendChild(apple)
  35. }
  36. return () => {
  37. apple?.remove()
  38. }
  39. }, [systemFeatures.branding.favicon])
  40. useFavicon(favicon)
  41. }