From 157a28d3e7a574e0f8ac9ec5da231b3befe8b2f7 Mon Sep 17 00:00:00 2001 From: Sasha Date: Thu, 23 Feb 2023 13:39:24 +0100 Subject: [PATCH] remove export of WakuContext, create ContetnPair provider --- src/ContentPairProvider.tsx | 47 +++++++++++++++++++++++++++++++++++++ src/WakuProvider.tsx | 2 +- src/index.ts | 5 +++- src/types.ts | 6 ++++- src/useCreatContentPair.ts | 1 + 5 files changed, 58 insertions(+), 3 deletions(-) create mode 100644 src/ContentPairProvider.tsx diff --git a/src/ContentPairProvider.tsx b/src/ContentPairProvider.tsx new file mode 100644 index 0000000..df31ae2 --- /dev/null +++ b/src/ContentPairProvider.tsx @@ -0,0 +1,47 @@ +import React from "react"; +import type { ContentPair, ReactChildrenProps } from "./types"; +import { useCreateContentPair } from "./useCreatContentPair"; + +type ContentPairContextType = Partial; + +const ContentPairContext = React.createContext({ + 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) => ( + * + * + * + * ); + * 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 = (props) => { + const result = useCreateContentPair(props.contentPair, props.ephemeral); + + return ( + {props.children} + ) +}; diff --git a/src/WakuProvider.tsx b/src/WakuProvider.tsx index 863fd65..8a87cf2 100644 --- a/src/WakuProvider.tsx +++ b/src/WakuProvider.tsx @@ -16,7 +16,7 @@ import { type WakuContextType = CrateNodeResult; -export const WakuContext = React.createContext>({ +const WakuContext = React.createContext>({ node: undefined, isLoading: false, error: undefined, diff --git a/src/index.ts b/src/index.ts index 7219cfb..4d97471 100644 --- a/src/index.ts +++ b/src/index.ts @@ -12,5 +12,8 @@ export { LightNodeProvider, RelayNodeProvider, useWaku, - WakuContext, } from "./WakuProvider"; +export { + useContentPair, + ContentPairProvider, +} from "./ContentPairProvider"; diff --git a/src/types.ts b/src/types.ts index 26d80e4..d28e656 100644 --- a/src/types.ts +++ b/src/types.ts @@ -1,7 +1,7 @@ import { RelayCreateOptions, WakuOptions } from "@waku/core"; +import type { Decoder, Encoder } from "@waku/core/dist/lib/message/version_0"; import type { CreateOptions } from "@waku/create"; import type { Protocols, Waku } from "@waku/interfaces"; -import type { Decoder, Encoder } from "@waku/core/dist/lib/message/version_0"; export type HookState = { isLoading: boolean; @@ -29,3 +29,7 @@ export type ContentPair = { encoder: Encoder; decoder: Decoder; }; + +export type ReactChildrenProps = { + children?: React.ReactNode; +}; diff --git a/src/useCreatContentPair.ts b/src/useCreatContentPair.ts index 3787e58..eaaa9c9 100644 --- a/src/useCreatContentPair.ts +++ b/src/useCreatContentPair.ts @@ -1,6 +1,7 @@ import React from "react"; import { createDecoder, createEncoder } from "@waku/core"; import type { Decoder, Encoder } from "@waku/core/dist/lib/message/version_0"; + import type { ContentPair } from "./types"; /**