You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

63 lines
1.3 KiB
React

2 years ago
import { useEffect, useState } from 'preact/hooks'
import { createContext } from 'preact'
export const MetadataContext = createContext({})
export const useCurrentUser = onLoaded => {
const [user, setUser] = useState(null)
const logout = () => {
setUser(null)
}
2 years ago
useEffect(async () => {
const res = await fetch(`/api/current-user`, {
credentials: 'include',
})
const user = await res.json()
setUser(user)
console.log(`Current user is`, user)
onLoaded?.(user)
2 years ago
}, [])
useEffect(() => {
console.log(user)
}, [user])
return [user, logout]
2 years ago
}
export const useReadResource = (url, initialValue) => {
const [value, setValue] = useState(initialValue)
function refresh() {
const controller = new AbortController()
fetch(url, { signal: controller.signal })
.then(res => {
if (res.ok) {
return res.json()
} else {
return initialValue
}
})
.then(newValue => {
setValue(newValue)
})
return controller
}
useEffect(() => {
const controller = refresh()
return () => {
controller.abort()
}
}, [])
return [value, refresh]
}