diff --git a/src/app.tsx b/src/app.tsx index 040818b8..c47709f8 100644 --- a/src/app.tsx +++ b/src/app.tsx @@ -24,9 +24,7 @@ export const Providers = (props: { children?: JSX.Element }) => { - }> - {props.children} - + }>{props.children} diff --git a/src/components/Topic/TopicBadge/TopicBadge.tsx b/src/components/Topic/TopicBadge/TopicBadge.tsx index 2f8c4072..6ee8f572 100644 --- a/src/components/Topic/TopicBadge/TopicBadge.tsx +++ b/src/components/Topic/TopicBadge/TopicBadge.tsx @@ -87,7 +87,7 @@ export const TopicBadge = (props: Props) => { diff --git a/src/context/topics.tsx b/src/context/topics.tsx index 0a75f610..796238d3 100644 --- a/src/context/topics.tsx +++ b/src/context/topics.tsx @@ -6,9 +6,9 @@ import { createContext, createEffect, createMemo, + createReaction, createSignal, on, - onMount, useContext } from 'solid-js' import { loadTopics } from '~/lib/api' @@ -45,13 +45,28 @@ const STORE_NAME = 'topics' const CACHE_LIFETIME = 24 * 60 * 60 * 1000 // один день в миллисекундах const setupIndexedDB = async () => { - return await openDB(DB_NAME, DB_VERSION, { - upgrade(db) { - if (!db.objectStoreNames.contains(STORE_NAME)) { - db.createObjectStore(STORE_NAME, { keyPath: 'id' }) + if (!('indexedDB' in window)) { + console.error("This browser doesn't support IndexedDB") + return + } + + try { + const db = await openDB(DB_NAME, DB_VERSION, { + upgrade(db, oldVersion, newVersion, _transaction) { + console.log(`Upgrading database from version ${oldVersion} to ${newVersion}`) + if (db.objectStoreNames.contains(STORE_NAME)) { + console.log(`Object store ${STORE_NAME} already exists`) + } else { + console.log(`Creating object store: ${STORE_NAME}`) + db.createObjectStore(STORE_NAME, { keyPath: 'id' }) + } } - } - }) + }) + console.log('Database opened successfully:', db) + return db + } catch (e) { + console.error('Failed to open IndexedDB:', e) + } } const getTopicsFromIndexedDB = async (db: IDBDatabase) => { @@ -157,7 +172,7 @@ export const TopicsProvider = (props: { children: JSX.Element }) => { return ttt || [] } - onMount(async () => { + createReaction(async () => { setDb(await setupIndexedDB()) console.info('[context.topics] idb loaded') }) diff --git a/src/routes/(home).tsx b/src/routes/(home).tsx index 2639e817..7e71ad44 100644 --- a/src/routes/(home).tsx +++ b/src/routes/(home).tsx @@ -1,5 +1,5 @@ import { type RouteDefinition, type RouteSectionProps, createAsync } from '@solidjs/router' -import { Show, Suspense, createEffect, createSignal, on, onMount } from 'solid-js' +import { Show, Suspense, createSignal, onMount } from 'solid-js' import { LoadShoutsOptions } from '~/graphql/schema/core.gen' import { loadShouts } from '~/lib/api' import { restoreScrollPosition, saveScrollPosition } from '~/utils/scroll' @@ -87,29 +87,19 @@ export default function HomePage(props: RouteSectionProps) { return result }) - const [canLoadMoreFeatured, setCanLoadMoreFeatured] = createSignal(false) + const [canLoadMoreFeatured, setCanLoadMoreFeatured] = createSignal(true) const loadMoreFeatured = async () => { saveScrollPosition() const before = data()?.featuredShouts.length || 0 featuredLoader(featuredOffset()) - const after = data()?.featuredShouts.length || 0 - setCanLoadMoreFeatured((_) => before !== after) setFeaturedOffset((o: number) => o + limit) + const after = data()?.featuredShouts.length || 0 + setTimeout(() => setCanLoadMoreFeatured((_) => before !== after), 1) restoreScrollPosition() } - onMount(loadMoreFeatured) + onMount(async () => await loadMoreFeatured()) - // Re-run the loader whenever the featured offset changes - createEffect( - on( - featuredOffset, - (o: number) => { - featuredLoader(o) // using fresh offset by itself - }, - { defer: true } - ) - ) return (