Live video on the AT Protocol
1import { useEffect } from "react";
2import { Platform } from "react-native";
3import {
4 useFavicon,
5 useSiteDescription,
6 useSiteTitle,
7} from "../streamplace-store";
8
9/**
10 * Hook to set the document title, description, and favicon on web based on branding.
11 * No-op on native platforms.
12 */
13export function useDocumentTitle() {
14 const siteTitle = useSiteTitle();
15 const siteDescription = useSiteDescription();
16 const favicon = useFavicon();
17
18 useEffect(() => {
19 if (Platform.OS === "web" && typeof document !== "undefined") {
20 // set title
21 document.title = siteTitle;
22
23 // set or update meta description
24 let metaDescription = document.querySelector('meta[name="description"]');
25 if (!metaDescription) {
26 metaDescription = document.createElement("meta");
27 metaDescription.setAttribute("name", "description");
28 document.head.appendChild(metaDescription);
29 }
30 metaDescription.setAttribute("content", siteDescription);
31
32 // set or update favicon
33 if (favicon) {
34 let link: HTMLLinkElement | null =
35 document.querySelector('link[rel="icon"]');
36 if (!link) {
37 link = document.createElement("link");
38 link.rel = "icon";
39 document.head.appendChild(link);
40 }
41 link.href = favicon;
42 }
43 }
44 }, [siteTitle, siteDescription, favicon]);
45}