mirror of
https://github.com/Sped0n/bridget.git
synced 2026-04-14 10:09:31 -07:00
Extract image, desktop, mobile, and config state into separate context providers to improve modularity and reduce unnecessary re-renders. Signed-off-by: Sped0n <hi@sped0n.com>
69 lines
2.1 KiB
TypeScript
69 lines
2.1 KiB
TypeScript
import { createEffect, onCleanup, onMount } from 'solid-js'
|
|
|
|
import { useConfigState } from '../configState'
|
|
import { useImageState } from '../imageState'
|
|
import { expand } from '../utils'
|
|
|
|
import { useDesktopState } from './state'
|
|
|
|
export default function Nav(): null {
|
|
let thresholdNums: HTMLSpanElement[] = []
|
|
let indexNums: HTMLSpanElement[] = []
|
|
let decButton: HTMLButtonElement | undefined
|
|
let incButton: HTMLButtonElement | undefined
|
|
let controller: AbortController | undefined
|
|
|
|
const imageState = useImageState()
|
|
const [config, { incThreshold, decThreshold }] = useConfigState()
|
|
const [desktop] = useDesktopState()
|
|
|
|
const updateThresholdText = (thresholdValue: string): void => {
|
|
thresholdNums.forEach((element, i) => {
|
|
element.innerText = thresholdValue[i]
|
|
})
|
|
}
|
|
|
|
const updateIndexText = (indexValue: string, indexLength: string): void => {
|
|
indexNums.forEach((element, i) => {
|
|
if (i < 4) {
|
|
element.innerText = indexValue[i]
|
|
} else {
|
|
element.innerText = indexLength[i - 4]
|
|
}
|
|
})
|
|
}
|
|
|
|
onMount(() => {
|
|
const thresholdDiv = document.getElementsByClassName(
|
|
'threshold'
|
|
)[0] as HTMLDivElement
|
|
const indexDiv = document.getElementsByClassName('index').item(0) as HTMLDivElement
|
|
|
|
thresholdNums = Array.from(
|
|
thresholdDiv.getElementsByClassName('num')
|
|
) as HTMLSpanElement[]
|
|
indexNums = Array.from(indexDiv.getElementsByClassName('num')) as HTMLSpanElement[]
|
|
decButton = thresholdDiv.getElementsByClassName('dec').item(0) as HTMLButtonElement
|
|
incButton = thresholdDiv.getElementsByClassName('inc').item(0) as HTMLButtonElement
|
|
|
|
controller = new AbortController()
|
|
const signal = controller.signal
|
|
|
|
decButton.addEventListener('click', decThreshold, { signal })
|
|
incButton.addEventListener('click', incThreshold, { signal })
|
|
})
|
|
|
|
createEffect(() => {
|
|
if (thresholdNums.length === 0 || indexNums.length === 0) return
|
|
|
|
updateIndexText(expand(desktop.index() + 1), expand(imageState().length))
|
|
updateThresholdText(expand(config().threshold))
|
|
})
|
|
|
|
onCleanup(() => {
|
|
controller?.abort()
|
|
})
|
|
|
|
return null
|
|
}
|