Skip to content

How to show the notification count in the page title

This example demonstrates how to show the notification count in the page title using the useTitle hook.

Watch the live preview.

tsx
import {useEffect, useState} from "react";
import {useTitle} from "./useTitle";

interface Notification {
    id: number;
    title: string;
}

const appNotifications: Notification[] = [
    {id: 1, title: "Notification 1"},
    {id: 2, title: "Notification 2"},
    {id: 3, title: "Notification 3"},
    {id: 4, title: "Notification 4"},
    {id: 5, title: "Notification 5"},
];

export default function App() {
    const [notifications, setNotifications] =
        useState<Notification[]>(appNotifications);
    const {title, changeTitle} = useTitle();

    useEffect(() => {
        changeTitle(`${title} (${notifications.length})`);
    }, []);

    // Delete notification
    const deleteNotification = (id: number) => {
        const updatedNotifications = notifications.filter(
            (notification) => notification.id !== id
        );
        setNotifications(updatedNotifications);

        // Set the title depending on the number of notifications left
        const newTitle =
            updatedNotifications.length > 0
                ? `${title.split(" (")[0]} (${updatedNotifications.length})`
                : title.split(" (")[0];
        changeTitle(newTitle);
    };

    return (
        <>
            <h1>Notifications</h1>
            <ul>
                {notifications.map((notification) => (
                    <li key={notification.id}>
                        {notification.title}
                        <button onClick={() => deleteNotification(notification.id)}>
                            Delete
                        </button>
                    </li>
                ))}
            </ul>
        </>
    );
}
typescript
import {useState} from "react";

export const useTitle = () => {
    const [title, setTitle] = useState<string>(document.title);

    const changeTitle = (newTitle: string) => {
        document.title = newTitle;
        setTitle(newTitle);
    };

    return {title, changeTitle};
};