Files
lume/src/utils/hooks/useChannelMetadata.tsx
2023-04-24 09:37:54 +07:00

57 lines
1.2 KiB
TypeScript

import { RelayContext } from '@components/relaysProvider';
import { DEFAULT_RELAYS } from '@stores/constants';
import { updateChannelMetadata } from '@utils/storage';
import { useCallback, useContext, useEffect, useState } from 'react';
export const useChannelMetadata = (id: string, fallback: string) => {
const pool: any = useContext(RelayContext);
const [metadata, setMetadata] = useState(fallback);
const fetchMetadata = useCallback(() => {
const unsubscribe = pool.subscribe(
[
{
kinds: [41],
'#e': [id],
},
],
DEFAULT_RELAYS,
(event: { content: string }) => {
const json = JSON.parse(event.content);
// update state
setMetadata(json);
// update metadata in database
updateChannelMetadata(id, event.content);
},
undefined,
undefined,
{
unsubscribeOnEose: true,
logAllEvents: false,
}
);
return () => {
unsubscribe();
};
}, [id, pool]);
useEffect(() => {
let ignore = false;
if (!ignore) {
// fetch kind 41
fetchMetadata();
}
return () => {
ignore = true;
};
}, [fetchMetadata, fallback]);
return metadata;
};