topics-context-fix
This commit is contained in:
parent
ed145ad447
commit
a616f97fe4
|
@ -24,9 +24,7 @@ export const Providers = (props: { children?: JSX.Element }) => {
|
||||||
<Meta name="viewport" content="width=device-width, initial-scale=1" />
|
<Meta name="viewport" content="width=device-width, initial-scale=1" />
|
||||||
<UIProvider>
|
<UIProvider>
|
||||||
<EditorProvider>
|
<EditorProvider>
|
||||||
<Suspense fallback={<Loading />}>
|
<Suspense fallback={<Loading />}>{props.children}</Suspense>
|
||||||
{props.children}
|
|
||||||
</Suspense>
|
|
||||||
</EditorProvider>
|
</EditorProvider>
|
||||||
</UIProvider>
|
</UIProvider>
|
||||||
</MetaProvider>
|
</MetaProvider>
|
||||||
|
|
|
@ -87,7 +87,7 @@ export const TopicBadge = (props: Props) => {
|
||||||
<FollowingButton
|
<FollowingButton
|
||||||
isFollowed={Boolean(isFollowed())}
|
isFollowed={Boolean(isFollowed())}
|
||||||
action={handleFollowClick}
|
action={handleFollowClick}
|
||||||
actionMessageType={following()?.slug === props.topic.slug ? following()?.type : undefined}
|
actionMessageType={following?.()?.slug === props.topic.slug ? following()?.type : undefined}
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
@ -6,9 +6,9 @@ import {
|
||||||
createContext,
|
createContext,
|
||||||
createEffect,
|
createEffect,
|
||||||
createMemo,
|
createMemo,
|
||||||
|
createReaction,
|
||||||
createSignal,
|
createSignal,
|
||||||
on,
|
on,
|
||||||
onMount,
|
|
||||||
useContext
|
useContext
|
||||||
} from 'solid-js'
|
} from 'solid-js'
|
||||||
import { loadTopics } from '~/lib/api'
|
import { loadTopics } from '~/lib/api'
|
||||||
|
@ -45,13 +45,28 @@ const STORE_NAME = 'topics'
|
||||||
const CACHE_LIFETIME = 24 * 60 * 60 * 1000 // один день в миллисекундах
|
const CACHE_LIFETIME = 24 * 60 * 60 * 1000 // один день в миллисекундах
|
||||||
|
|
||||||
const setupIndexedDB = async () => {
|
const setupIndexedDB = async () => {
|
||||||
return await openDB(DB_NAME, DB_VERSION, {
|
if (!('indexedDB' in window)) {
|
||||||
upgrade(db) {
|
console.error("This browser doesn't support IndexedDB")
|
||||||
if (!db.objectStoreNames.contains(STORE_NAME)) {
|
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' })
|
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) => {
|
const getTopicsFromIndexedDB = async (db: IDBDatabase) => {
|
||||||
|
@ -157,7 +172,7 @@ export const TopicsProvider = (props: { children: JSX.Element }) => {
|
||||||
return ttt || []
|
return ttt || []
|
||||||
}
|
}
|
||||||
|
|
||||||
onMount(async () => {
|
createReaction(async () => {
|
||||||
setDb(await setupIndexedDB())
|
setDb(await setupIndexedDB())
|
||||||
console.info('[context.topics] idb loaded')
|
console.info('[context.topics] idb loaded')
|
||||||
})
|
})
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
import { type RouteDefinition, type RouteSectionProps, createAsync } from '@solidjs/router'
|
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 { LoadShoutsOptions } from '~/graphql/schema/core.gen'
|
||||||
import { loadShouts } from '~/lib/api'
|
import { loadShouts } from '~/lib/api'
|
||||||
import { restoreScrollPosition, saveScrollPosition } from '~/utils/scroll'
|
import { restoreScrollPosition, saveScrollPosition } from '~/utils/scroll'
|
||||||
|
@ -87,29 +87,19 @@ export default function HomePage(props: RouteSectionProps<HomeViewProps>) {
|
||||||
return result
|
return result
|
||||||
})
|
})
|
||||||
|
|
||||||
const [canLoadMoreFeatured, setCanLoadMoreFeatured] = createSignal(false)
|
const [canLoadMoreFeatured, setCanLoadMoreFeatured] = createSignal(true)
|
||||||
const loadMoreFeatured = async () => {
|
const loadMoreFeatured = async () => {
|
||||||
saveScrollPosition()
|
saveScrollPosition()
|
||||||
const before = data()?.featuredShouts.length || 0
|
const before = data()?.featuredShouts.length || 0
|
||||||
featuredLoader(featuredOffset())
|
featuredLoader(featuredOffset())
|
||||||
const after = data()?.featuredShouts.length || 0
|
|
||||||
setCanLoadMoreFeatured((_) => before !== after)
|
|
||||||
setFeaturedOffset((o: number) => o + limit)
|
setFeaturedOffset((o: number) => o + limit)
|
||||||
|
const after = data()?.featuredShouts.length || 0
|
||||||
|
setTimeout(() => setCanLoadMoreFeatured((_) => before !== after), 1)
|
||||||
restoreScrollPosition()
|
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 (
|
return (
|
||||||
<PageLayout withPadding={true} title={t('Discours')}>
|
<PageLayout withPadding={true} title={t('Discours')}>
|
||||||
<ReactionsProvider>
|
<ReactionsProvider>
|
||||||
|
|
Loading…
Reference in New Issue
Block a user