Newer
Older
mobile.raikyakun.app / node / src / hooks / useIndexedDB.tsx
nutrition on 24 Jul 2024 2 KB first commit
import { useState, useEffect, useCallback } from 'react'
import type { Call } from '@/types'

const dbName = 'pwa-db'
const storeName = 'subscriptions'


export const useIndexedDB = () => {
	const [latestCall, setLatestCall] = useState<Call | null>(null)
	const [callList, setCallList] = useState<Call[]>([])

	const update = useCallback(() => {
		const openRequest = indexedDB.open(dbName, 1)

		openRequest.onupgradeneeded = () => {
			const db = openRequest.result;
			if (!db.objectStoreNames.contains(storeName)) {
				db.createObjectStore(storeName, { keyPath: 'callId' })
			}
		}

		openRequest.onsuccess = () => {
			const db = openRequest.result
			const transaction = db.transaction(storeName, 'readonly')
			const store = transaction.objectStore(storeName)
			const request = store.openCursor(null, 'prev')

			request.onsuccess = event => {
				const cursor = request.result
				if (cursor) {
					// 最初のレコードが最新のレコードになる
					setLatestCall(cursor.value)
				} else {
					setLatestCall(null)
				}
			}

			// 全てのレコードを降順で取得
			const callListTemp: Call[] = []
			const cursorRequest = store.openCursor(null, 'prev')
			cursorRequest.onsuccess = event => {
				const cursor = cursorRequest.result
				if (cursor) {
					callListTemp.push(cursor.value)
					cursor.continue()
				} else {
					setCallList(callListTemp)
				}
			}
		}

		openRequest.onerror = () => {
			console.error("Error opening IndexedDB:", openRequest.error)
		}
	}, [])

	const updateResponder = useCallback((callId: string, newResponder: string | null) => {
		const openRequest = indexedDB.open(dbName, 1)
	
		openRequest.onsuccess = () => {
			const db = openRequest.result
			const transaction = db.transaction(storeName, 'readwrite')
			const store = transaction.objectStore(storeName)
		
			const getRequest = store.get(callId)
		
			getRequest.onsuccess = () => {
				const record = getRequest.result
				if (record) {
					record.responder = newResponder
					const putRequest = store.put(record)
			
					putRequest.onsuccess = () => {
						console.log(`Call ID ${callId} updated successfully.`)
						update() // Update the state after successful update
					}
			
					putRequest.onerror = () => {
						console.error("Error updating record:", putRequest.error)
					}
				} else {
					console.error(`Record with Call ID ${callId} not found.`)
				}
			}
		
			getRequest.onerror = () => {
				console.error("Error retrieving record:", getRequest.error)
			}
		}
	
		openRequest.onerror = () => {
			console.error("Error opening IndexedDB:", openRequest.error)
		}
	}, [update])

	return {latestCall, callList, update, updateResponder}
}

export default useIndexedDB