diff --git a/src/components/Select.tsx b/src/components/Select.tsx index a5c4d20..cdf6d03 100644 --- a/src/components/Select.tsx +++ b/src/components/Select.tsx @@ -14,7 +14,7 @@ export const SearchableSelect = ({ setValue, options, }: { - value: T + value: T | null setValue: (val: T | null) => void options: { value: T; text: string }[] }) => { diff --git a/src/pages/Metadata/Lookup.tsx b/src/pages/Metadata/Lookup.tsx index d9036b8..13e08ef 100644 --- a/src/pages/Metadata/Lookup.tsx +++ b/src/pages/Metadata/Lookup.tsx @@ -10,7 +10,7 @@ import { } from "react" import { Link } from "react-router-dom" -export const Lookup: FC<{ lookup: V14Lookup }> = ({ lookup }) => { +export const Lookup: FC = () => { const [id, setId] = useState(0) return ( @@ -26,9 +26,7 @@ export const Lookup: FC<{ lookup: V14Lookup }> = ({ lookup }) => { />
- - - +
) @@ -42,7 +40,7 @@ type NodeProps = { value: V14SpecificDef } -const LookupContext = createContext(null as any) +export const LookupContext = createContext(null as any) const LookupNode: FC<{ id: number }> = ({ id }) => { const lookup = useContext(LookupContext) @@ -69,7 +67,7 @@ const LookupNode: FC<{ id: number }> = ({ id }) => { } } -const LookupLink: FC<{ id: number }> = ({ id }) => { +export const LookupLink: FC<{ id: number }> = ({ id }) => { const [expanded, setExpanded] = useState(false) return ( diff --git a/src/pages/Metadata/Metadata.tsx b/src/pages/Metadata/Metadata.tsx index 0f8e097..22e1aef 100644 --- a/src/pages/Metadata/Metadata.tsx +++ b/src/pages/Metadata/Metadata.tsx @@ -9,7 +9,8 @@ import { V14, V15 } from "@polkadot-api/substrate-bindings" import { useStateObservable } from "@react-rxjs/core" import { FC, useState } from "react" import { Route, Routes, useParams } from "react-router-dom" -import { Lookup } from "./Lookup" +import { Lookup, LookupContext } from "./Lookup" +import { Pallets } from "./Pallets" export const Metadata = withSubscribe( () => ( @@ -54,8 +55,11 @@ const MetadataExplorer = () => { const DecodedExplorer: FC<{ value: V14 | V15 }> = ({ value }) => { return ( -
- +
+ + + +
) } diff --git a/src/pages/Metadata/Pallets.tsx b/src/pages/Metadata/Pallets.tsx new file mode 100644 index 0000000..fd8d59f --- /dev/null +++ b/src/pages/Metadata/Pallets.tsx @@ -0,0 +1,164 @@ +import { SearchableSelect } from "@/components/Select" +import { V14, V15 } from "@polkadot-api/substrate-bindings" +import { FC, useEffect, useState } from "react" +import { LookupLink } from "./Lookup" +import { CopyText } from "@/components/Copy" + +type Pallet = (V14 | V15)["pallets"][number] +export const Pallets: FC<{ pallets: Array }> = ({ pallets }) => { + const [pallet, setPallet] = useState(null) + + return ( +
+

Pallets

+ + {pallet && ( + <> +

Index: {pallet.index}

+ {pallet.storage && ( +
+

Storage

+ +
+ )} + {pallet.constants.length && ( +
+

Constants

+ +
+ )} + {pallet.calls != null && ( +
+

Calls

+ +
+ )} + {pallet.events != null && ( +
+

Events

+ +
+ )} + {pallet.errors != null && ( +
+

Errors

+ +
+ )} + + )} +
+ ) +} + +type StorageEntry = Pallet["storage"] extends + | undefined + | { items: Array } + ? R + : never +const PalletStorage: FC<{ pallet: Pallet }> = ({ pallet }) => { + const [entry, setEntry] = useState(null) + + useEffect(() => { + setEntry(null) + }, [pallet]) + + if (!pallet.storage) return null + + const value = + entry && + (entry.type.tag === "map" ? entry.type.value.value : entry.type.value) + const key = entry && (entry.type.tag === "map" ? entry.type.value.key : null) + const acceptsPartialKey = + entry?.type.tag === "map" && entry.type.value.hashers.length > 1 + + return ( +
+ + {entry && ( + <> + {key != null && ( +
+

Key

+ {acceptsPartialKey &&

Accepts partial keys

} + +
+ )} +
+

Value

+ +
+
+

Fallback

+
+ + {entry.fallback} +
+
+ + )} +
+ ) +} + +type ConstantEntry = Pallet["constants"] extends Array ? R : never +const PalletConstants: FC<{ pallet: Pallet }> = ({ pallet }) => { + const [entry, setEntry] = useState(null) + + useEffect(() => { + setEntry(null) + }, [pallet]) + + if (!pallet.constants.length) return null + + return ( +
+ + {entry && ( + <> +
+

Type

+ +
+
+

Value

+
+ + {entry.value} +
+
+ + )} +
+ ) +}