Feature/wrap logging * feat: change all logging to go through our own logger function so that we can control log levels * move packages/trpc to using our own logger * merge Approved-by: Linus Flood
88 lines
2.3 KiB
TypeScript
88 lines
2.3 KiB
TypeScript
import { useCallback, useEffect, useState } from "react"
|
|
|
|
import { logger } from "@scandic-hotels/common/logger"
|
|
import {
|
|
type AutoCompleteLocation,
|
|
autoCompleteLocationSchema,
|
|
} from "@scandic-hotels/trpc/routers/autocomplete/schema"
|
|
|
|
import useLang from "@/hooks/useLang"
|
|
|
|
export function useSearchHistory() {
|
|
const MAX_HISTORY_LENGTH = 5
|
|
const KEY = useSearchHistoryKey()
|
|
|
|
const getHistoryFromLocalStorage = useCallback((): AutoCompleteLocation[] => {
|
|
const stringifiedHistory = localStorage.getItem(KEY)
|
|
|
|
try {
|
|
const parsedHistory = JSON.parse(stringifiedHistory ?? "[]")
|
|
if (!Array.isArray(parsedHistory)) {
|
|
throw new Error("Invalid search history format")
|
|
}
|
|
const existingHistory = parsedHistory.map((item) =>
|
|
autoCompleteLocationSchema.parse(item)
|
|
)
|
|
|
|
return existingHistory
|
|
} catch (error) {
|
|
logger.error("Failed to parse search history:", error)
|
|
localStorage.removeItem(KEY)
|
|
|
|
return []
|
|
}
|
|
}, [KEY])
|
|
|
|
function updateSearchHistory(newItem: AutoCompleteLocation) {
|
|
const existingHistory = getHistoryFromLocalStorage()
|
|
if (!autoCompleteLocationSchema.safeParse(newItem).success) {
|
|
return existingHistory
|
|
}
|
|
|
|
const oldSearchHistoryWithoutTheNew = existingHistory.filter(
|
|
(h) => h.type !== newItem.type || h.id !== newItem.id
|
|
)
|
|
|
|
const updatedSearchHistory = [
|
|
newItem,
|
|
...oldSearchHistoryWithoutTheNew.slice(0, MAX_HISTORY_LENGTH - 1),
|
|
]
|
|
localStorage.setItem(KEY, JSON.stringify(updatedSearchHistory))
|
|
|
|
return updatedSearchHistory
|
|
}
|
|
|
|
const [searchHistory, setSearchHistory] = useState<AutoCompleteLocation[]>([])
|
|
|
|
useEffect(() => {
|
|
setSearchHistory(getHistoryFromLocalStorage())
|
|
}, [KEY, getHistoryFromLocalStorage])
|
|
|
|
function clearHistory() {
|
|
localStorage.removeItem(KEY)
|
|
setSearchHistory([])
|
|
}
|
|
|
|
function insertSearchHistoryItem(
|
|
newItem: AutoCompleteLocation
|
|
): AutoCompleteLocation[] {
|
|
const updatedHistory = updateSearchHistory(newItem)
|
|
setSearchHistory(updatedHistory)
|
|
|
|
return updatedHistory
|
|
}
|
|
|
|
return {
|
|
searchHistory,
|
|
insertSearchHistoryItem,
|
|
clearHistory,
|
|
}
|
|
}
|
|
|
|
function useSearchHistoryKey() {
|
|
const SEARCH_HISTORY_LOCALSTORAGE_KEY = "searchHistory"
|
|
const lang = useLang()
|
|
|
|
return `${SEARCH_HISTORY_LOCALSTORAGE_KEY}-${lang}`.toLowerCase()
|
|
}
|