Skip to content

useIndexedDB

A React hook for interacting with IndexedDB in the browser.


✨ Overview

useIndexedDB provides a simple interface to open a database and perform basic operations
like adding, retrieving, and deleting data.


📦 Import

tsx
import { useIndexedDB } from 'react-hookstack';

🚀 Usage Example

tsx
import { useIndexedDB } from 'react-hookstack';

const { db, addItem, getItem } = useIndexedDB("myDatabase");
await addItem("users", { id: 1, name: "John" });
const user = await getItem("users", 1);

🧩 API Reference

useIndexedDB(dbName: string): IndexedDBHook | null

Parameters

ParameterTypeDescription
dbNamestringThe name of the IndexedDB database.

Returns

PropertyTypeDescription
dbIDBDatabase | nullThe database instance.
addItem(storeName: string, value: any) => Promise<IDBValidKey>Add item to store.
getItem(storeName: string, key: IDBValidKey) => Promise<any>Get item from store.
deleteItem(storeName: string, key: IDBValidKey) => Promise<void>Delete item from store.

⚙️ Implementation

tsx
import { useState, useEffect } from "react";

interface IndexedDBHook {
    db: IDBDatabase | null;
    addItem: (storeName: string, value: any) => Promise<IDBValidKey>;
    getItem: (storeName: string, key: IDBValidKey) => Promise<any>;
    deleteItem: (storeName: string, key: IDBValidKey) => Promise<void>;
}

export function useIndexedDB(dbName: string): IndexedDBHook | null {
    const [db, setDb] = useState<IDBDatabase | null>(null);

    useEffect(() => {
        if (!dbName) return;

        const request = indexedDB.open(dbName);

        request.onupgradeneeded = (event) => {
            const database = request.result;
            if (!database.objectStoreNames.contains("defaultStore")) {
                database.createObjectStore("defaultStore", {
                    keyPath: "id",
                    autoIncrement: true,
                });
            }
        };

        request.onsuccess = () => setDb(request.result);
        request.onerror = (event) =>
            console.error("IndexedDB error:", request.error);
    }, [dbName]);

    const addItem = (storeName: string, value: any) =>
        new Promise<IDBValidKey>((resolve, reject) => {
            if (!db) return reject("DB not initialized");
            const transaction = db.transaction(storeName, "readwrite");
            const store = transaction.objectStore(storeName);
            const request = store.add(value);
            request.onsuccess = () => resolve(request.result);
            request.onerror = () => reject(request.error);
        });

    const getItem = (storeName: string, key: IDBValidKey) =>
        new Promise<any>((resolve, reject) => {
            if (!db) return reject("DB not initialized");
            const transaction = db.transaction(storeName, "readonly");
            const store = transaction.objectStore(storeName);
            const request = store.get(key);
            request.onsuccess = () => resolve(request.result);
            request.onerror = () => reject(request.error);
        });

    const deleteItem = (storeName: string, key: IDBValidKey) =>
        new Promise<void>((resolve, reject) => {
            if (!db) return reject("DB not initialized");
            const transaction = db.transaction(storeName, "readwrite");
            const store = transaction.objectStore(storeName);
            const request = store.delete(key);
            request.onsuccess = () => resolve();
            request.onerror = () => reject(request.error);
        });

    if (!db) return null;

    return { db, addItem, getItem, deleteItem };
}

💡 Notes

  • Automatically creates a default store if needed.
  • Handles async operations with Promises.

🧾 Type Definition

tsx
interface IndexedDBHook {
  db: IDBDatabase | null;
  addItem: (storeName: string, value: any) => Promise<IDBValidKey>;
  getItem: (storeName: string, key: IDBValidKey) => Promise<any>;
  deleteItem: (storeName: string, key: IDBValidKey) => Promise<void>;
}

🧭 Summary

FeatureDescription
🧱 IndexedDBBrowser database support
⚡ LightweightNo dependencies
🧠 IntuitiveSimple API surface