seen-fix
This commit is contained in:
parent
1f3b52258d
commit
a03c26dd5a
|
@ -52,7 +52,7 @@
|
||||||
"@solid-primitives/memo": "1.2.4",
|
"@solid-primitives/memo": "1.2.4",
|
||||||
"@solid-primitives/pagination": "0.2.10",
|
"@solid-primitives/pagination": "0.2.10",
|
||||||
"@solid-primitives/share": "2.0.4",
|
"@solid-primitives/share": "2.0.4",
|
||||||
"@solid-primitives/storage": "1.3.9",
|
"@solid-primitives/storage": "^3.5.0",
|
||||||
"@solid-primitives/upload": "0.0.110",
|
"@solid-primitives/upload": "0.0.110",
|
||||||
"@solidjs/meta": "0.29.1",
|
"@solidjs/meta": "0.29.1",
|
||||||
"@thisbeyond/solid-select": "0.14.0",
|
"@thisbeyond/solid-select": "0.14.0",
|
||||||
|
|
|
@ -234,7 +234,12 @@ export const HeaderAuth = (props: Props) => {
|
||||||
}
|
}
|
||||||
>
|
>
|
||||||
<Show when={!isSaveButtonVisible()}>
|
<Show when={!isSaveButtonVisible()}>
|
||||||
<div class={clsx(styles.userControlItem, styles.userControlItemInbox)}>
|
<div
|
||||||
|
class={clsx(
|
||||||
|
styles.userControlItem,
|
||||||
|
// styles.userControlItemInbox
|
||||||
|
)}
|
||||||
|
>
|
||||||
<a href={getPagePath(router, 'inbox')}>
|
<a href={getPagePath(router, 'inbox')}>
|
||||||
<div classList={{ entered: page().path === '/inbox' }}>
|
<div classList={{ entered: page().path === '/inbox' }}>
|
||||||
<Icon name="inbox-white" class={styles.icon} />
|
<Icon name="inbox-white" class={styles.icon} />
|
||||||
|
|
|
@ -73,7 +73,7 @@
|
||||||
border: none;
|
border: none;
|
||||||
white-space: nowrap;
|
white-space: nowrap;
|
||||||
|
|
||||||
&:before {
|
&::before {
|
||||||
content: '';
|
content: '';
|
||||||
height: 100%;
|
height: 100%;
|
||||||
left: 0;
|
left: 0;
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
import { openDB } from 'idb'
|
import { makePersisted } from '@solid-primitives/storage'
|
||||||
import { Accessor, JSX, createContext, createSignal, onMount, useContext } from 'solid-js'
|
import { Accessor, JSX, createContext, createSignal, useContext } from 'solid-js'
|
||||||
|
|
||||||
type SeenContextType = {
|
type SeenContextType = {
|
||||||
seen: Accessor<{ [slug: string]: number }>
|
seen: Accessor<{ [slug: string]: number }>
|
||||||
|
@ -11,56 +11,18 @@ export function useSeen() {
|
||||||
return useContext(SeenContext)
|
return useContext(SeenContext)
|
||||||
}
|
}
|
||||||
|
|
||||||
const DB_NAME = 'discourseAppDB'
|
|
||||||
const DB_VERSION = 1
|
|
||||||
const STORE_NAME = 'seen'
|
|
||||||
const setupIndexedDB = async () => {
|
|
||||||
return await openDB(DB_NAME, DB_VERSION, {
|
|
||||||
upgrade(db) {
|
|
||||||
if (!db.objectStoreNames.contains(STORE_NAME)) {
|
|
||||||
db.createObjectStore(STORE_NAME, { keyPath: 'slug' })
|
|
||||||
}
|
|
||||||
},
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
const getSeenFromIndexedDB = async (db) => {
|
|
||||||
const tx = db.transaction(STORE_NAME, 'readonly')
|
|
||||||
const store = tx.objectStore(STORE_NAME)
|
|
||||||
const seen = await store.getAll()
|
|
||||||
return seen.reduce((acc, { slug, date }) => {
|
|
||||||
acc[slug] = date
|
|
||||||
return acc
|
|
||||||
}, {})
|
|
||||||
}
|
|
||||||
|
|
||||||
const saveSeenToIndexedDB = async (db, seen) => {
|
|
||||||
const tx = db.transaction(STORE_NAME, 'readwrite')
|
|
||||||
const store = tx.objectStore(STORE_NAME)
|
|
||||||
for (const [slug, date] of Object.entries(seen)) {
|
|
||||||
await store.put({ slug, date })
|
|
||||||
}
|
|
||||||
await tx.done
|
|
||||||
}
|
|
||||||
|
|
||||||
export const SeenProvider = (props: { children: JSX.Element }) => {
|
export const SeenProvider = (props: { children: JSX.Element }) => {
|
||||||
const [seen, setSeen] = createSignal<{ [slug: string]: number }>({})
|
const [seen, setSeen] = makePersisted(createSignal<{ [slug: string]: number }>({}), {
|
||||||
const [db, setDb] = createSignal()
|
name: 'discoursio-seen',
|
||||||
|
})
|
||||||
|
|
||||||
const addSeen = async (slug: string) => {
|
const addSeen = async (slug: string) => {
|
||||||
setSeen((prev) => {
|
setSeen((prev) => {
|
||||||
const newSeen = { ...prev, [slug]: Date.now() }
|
const newSeen = { ...prev, [slug]: Date.now() }
|
||||||
saveSeenToIndexedDB(db(), newSeen)
|
|
||||||
return newSeen
|
return newSeen
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
onMount(async () => {
|
|
||||||
const ndb = await setupIndexedDB()
|
|
||||||
setDb(ndb)
|
|
||||||
const seenFromDB = await getSeenFromIndexedDB(ndb)
|
|
||||||
setSeen(seenFromDB)
|
|
||||||
})
|
|
||||||
|
|
||||||
const value: SeenContextType = { seen, addSeen }
|
const value: SeenContextType = { seen, addSeen }
|
||||||
|
|
||||||
return <SeenContext.Provider value={value}>{props.children}</SeenContext.Provider>
|
return <SeenContext.Provider value={value}>{props.children}</SeenContext.Provider>
|
||||||
|
|
Loading…
Reference in New Issue
Block a user