waku-react/src/ContentPairProvider.tsx
Sasha e4d0106499
feat!: add new hooks and improvements (#3)
* use React global var

* use undefined instead on null

* use react as peer dependency

* make ephemeral default to false

* set default ephemeral to false, use node instead of waku naming

* implement useStoreMessages

* fix types

* export useStoreMessages

* make content pair set initially

* remove deps for useEffect for createWaku to prevent re rendering

* prevent setting of empty messages

* accept undefined node, handle empty message case

* accept undefined node, handle empty message case

* add TODOs

* rename to useCreateContentPair

* remove export of WakuContext, create ContetnPair provider

* remove export of WakuContext, create ContetnPair provider

* fix lint

* fix typo

* remove export

* fix prettier

* make decoded optional

* add jsdocs

* add useLightPush hook

* update types, add usePeers, add prettierignore

* remove full node hook, provider

* remove export

* remove FullNode stuff
2023-02-28 00:57:59 +01:00

54 lines
1.5 KiB
TypeScript

import React from "react";
import type { ContentPair, ReactChildrenProps } from "./types";
import { useCreateContentPair } from "./useCreatContentPair";
type ContentPairContextType = Partial<ContentPair>;
const ContentPairContext = React.createContext<ContentPairContextType>({
decoder: undefined,
encoder: undefined,
});
/**
* Hook to retrieve Encoder/Decoder pair from Context.
* @example
* const { encoder, decoder } = useContentPair();
* @returns {Object} { encoder, decoder }
*/
export const useContentPair = (): ContentPairContextType =>
React.useContext(ContentPairContext);
type ContentPairProviderProps = ReactChildrenProps & {
contentTopic: string;
ephemeral?: boolean;
};
/**
* Provider for creating Encoder/Decoder pair based on contentTopic
* @example
* const App = (props) => (
* <ContentPairProvider contentTopic="/toy-chat/2/huilong/proto">
* <Component />
* </ContentPairProvider>
* );
* const Component = (props) => {
* const { encoder, decoder } = useContentPair();
* ...
* };
* @param {string} contentTopic - content topic for configuring the pair
* @param {boolean} ephemeral - flag to set messages ephemeral according to RFC https://rfc.vac.dev/spec/14/
* @returns React ContentPair Provider component
*/
export const ContentPairProvider: React.FunctionComponent<
ContentPairProviderProps
> = (props) => {
const result = useCreateContentPair(props.contentTopic, props.ephemeral);
return (
<ContentPairContext.Provider value={result}>
{props.children}
</ContentPairContext.Provider>
);
};