feat(SW-2861): Move autocomplete router to trpc package * Apply lint rules * Use direct imports from trpc package * Add lint-staged config to trpc * Move lang enum to common * Restructure trpc package folder structure * WIP first step * update internal imports in trpc * Fix most errors in scandic-web Just 100 left... * Move Props type out of trpc * Fix CategorizedFilters types * Move more schemas in hotel router * Fix deps * fix getNonContentstackUrls * Fix import error * Fix entry error handling * Fix generateMetadata metrics * Fix alertType enum * Fix duplicated types * lint:fix * Merge branch 'master' into feat/sw-2863-move-contentstack-router-to-trpc-package * Fix broken imports * Move booking router to trpc package * Move partners router to trpc package * Move autocomplete router to trpc package * Merge branch 'master' into feat/sw-2861-move-autocomplete-router-to-trpc-package Approved-by: Linus Flood
87 lines
2.3 KiB
TypeScript
87 lines
2.3 KiB
TypeScript
import { useCallback, useEffect, useState } from "react"
|
|
|
|
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) {
|
|
console.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()
|
|
}
|