polkahub 0.2.1 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -3,7 +3,7 @@ import { useAvailableAccounts, AddressIdentity } from '@polkahub/context';
3
3
  import { AddressInput as AddressInput$1 } from '@polkahub/ui-components';
4
4
  import { useMemo } from 'react';
5
5
 
6
- const AddressInput = ({ maxAddrLength, ...props }) => {
6
+ const AddressInput = (props) => {
7
7
  const availableAccounts = useAvailableAccounts();
8
8
  const hints = useMemo(() => {
9
9
  const addressToAccounts = {};
@@ -22,19 +22,11 @@ const AddressInput = ({ maxAddrLength, ...props }) => {
22
22
  AddressInput$1,
23
23
  {
24
24
  hinted: Object.values(hints).flat(),
25
- renderAddress: (account) => typeof account === "string" ? /* @__PURE__ */ jsx(
26
- AddressIdentity,
27
- {
28
- addr: account,
29
- maxAddrLength,
30
- copyable: false
31
- }
32
- ) : /* @__PURE__ */ jsx(
25
+ renderAddress: (account) => typeof account === "string" ? /* @__PURE__ */ jsx(AddressIdentity, { addr: account, copyable: false }) : /* @__PURE__ */ jsx(
33
26
  AddressIdentity,
34
27
  {
35
28
  addr: account.address,
36
29
  name: account?.name,
37
- maxAddrLength,
38
30
  copyable: false
39
31
  }
40
32
  ),
@@ -1 +1 @@
1
- {"version":3,"file":"AddressInput.js","sources":["../src/AddressInput.tsx"],"sourcesContent":["import { AddressIdentity, useAvailableAccounts } from \"@polkahub/context\";\nimport { Account, AccountAddress } from \"@polkahub/plugin\";\nimport { AddressInput as AddressInputComponent } from \"@polkahub/ui-components\";\nimport { FC, useMemo } from \"react\";\n\nexport const AddressInput: FC<{\n value?: AccountAddress | null;\n onChange?: (value: AccountAddress | null) => void;\n disableClear?: boolean;\n className?: string;\n triggerClassName?: string;\n maxAddrLength?: number;\n}> = ({ maxAddrLength, ...props }) => {\n const availableAccounts = useAvailableAccounts();\n\n const hints = useMemo(() => {\n const addressToAccounts: Record<AccountAddress, Account[]> = {};\n Object.values(availableAccounts)\n .flat()\n .forEach((acc) => {\n addressToAccounts[acc.address] ??= [];\n addressToAccounts[acc.address].push(acc);\n });\n\n return Object.values(addressToAccounts).map((group) =>\n group.reduce((acc, v) =>\n (v.name?.length ?? 0) > (acc.name?.length ?? 0) ? v : acc\n )\n );\n }, [availableAccounts]);\n\n return (\n <AddressInputComponent\n hinted={Object.values(hints).flat()}\n renderAddress={(account: Account | string) =>\n typeof account === \"string\" ? (\n <AddressIdentity\n addr={account}\n maxAddrLength={maxAddrLength}\n copyable={false}\n />\n ) : (\n <AddressIdentity\n addr={account.address}\n name={account?.name}\n maxAddrLength={maxAddrLength}\n copyable={false}\n />\n )\n }\n {...props}\n />\n );\n};\n"],"names":["AddressInputComponent"],"mappings":";;;;;AAKO,MAAM,eAOR,CAAC,EAAE,aAAA,EAAe,GAAG,OAAM,KAAM;AACpC,EAAA,MAAM,oBAAoB,oBAAA,EAAqB;AAE/C,EAAA,MAAM,KAAA,GAAQ,QAAQ,MAAM;AAC1B,IAAA,MAAM,oBAAuD,EAAC;AAC9D,IAAA,MAAA,CAAO,OAAO,iBAAiB,CAAA,CAC5B,MAAK,CACL,OAAA,CAAQ,CAAC,GAAA,KAAQ;AAnBxB,MAAA,IAAA,EAAA;AAoBQ,MAAA,iBAAA,CAAA,EAAA,GAAkB,GAAA,CAAI,OAAA,CAAA,KAAtB,iBAAA,CAAA,EAAA,CAAA,GAAmC,EAAC,CAAA;AACpC,MAAA,iBAAA,CAAkB,GAAA,CAAI,OAAO,CAAA,CAAE,IAAA,CAAK,GAAG,CAAA;AAAA,IACzC,CAAC,CAAA;AAEH,IAAA,OAAO,MAAA,CAAO,MAAA,CAAO,iBAAiB,CAAA,CAAE,GAAA;AAAA,MAAI,CAAC,UAC3C,KAAA,CAAM,MAAA;AAAA,QAAO,CAAC,GAAA,EAAK,CAAA,KAAA,CAChB,CAAA,CAAE,IAAA,EAAM,MAAA,IAAU,CAAA,KAAM,GAAA,CAAI,IAAA,EAAM,MAAA,IAAU,CAAA,CAAA,GAAK,CAAA,GAAI;AAAA;AACxD,KACF;AAAA,EACF,CAAA,EAAG,CAAC,iBAAiB,CAAC,CAAA;AAEtB,EAAA,uBACE,GAAA;AAAA,IAACA,cAAA;AAAA,IAAA;AAAA,MACC,MAAA,EAAQ,MAAA,CAAO,MAAA,CAAO,KAAK,EAAE,IAAA,EAAK;AAAA,MAClC,aAAA,EAAe,CAAC,OAAA,KACd,OAAO,YAAY,QAAA,mBACjB,GAAA;AAAA,QAAC,eAAA;AAAA,QAAA;AAAA,UACC,IAAA,EAAM,OAAA;AAAA,UACN,aAAA;AAAA,UACA,QAAA,EAAU;AAAA;AAAA,OACZ,mBAEA,GAAA;AAAA,QAAC,eAAA;AAAA,QAAA;AAAA,UACC,MAAM,OAAA,CAAQ,OAAA;AAAA,UACd,MAAM,OAAA,EAAS,IAAA;AAAA,UACf,aAAA;AAAA,UACA,QAAA,EAAU;AAAA;AAAA,OACZ;AAAA,MAGH,GAAG;AAAA;AAAA,GACN;AAEJ;;;;"}
1
+ {"version":3,"file":"AddressInput.js","sources":["../src/AddressInput.tsx"],"sourcesContent":["import { AddressIdentity, useAvailableAccounts } from \"@polkahub/context\";\nimport { Account, AccountAddress } from \"@polkahub/plugin\";\nimport { AddressInput as AddressInputComponent } from \"@polkahub/ui-components\";\nimport { FC, useMemo } from \"react\";\n\nexport const AddressInput: FC<{\n value?: AccountAddress | null;\n onChange?: (value: AccountAddress | null) => void;\n disableClear?: boolean;\n className?: string;\n triggerClassName?: string;\n}> = (props) => {\n const availableAccounts = useAvailableAccounts();\n\n const hints = useMemo(() => {\n const addressToAccounts: Record<AccountAddress, Account[]> = {};\n Object.values(availableAccounts)\n .flat()\n .forEach((acc) => {\n addressToAccounts[acc.address] ??= [];\n addressToAccounts[acc.address].push(acc);\n });\n\n return Object.values(addressToAccounts).map((group) =>\n group.reduce((acc, v) =>\n (v.name?.length ?? 0) > (acc.name?.length ?? 0) ? v : acc\n )\n );\n }, [availableAccounts]);\n\n return (\n <AddressInputComponent\n hinted={Object.values(hints).flat()}\n renderAddress={(account: Account | string) =>\n typeof account === \"string\" ? (\n <AddressIdentity addr={account} copyable={false} />\n ) : (\n <AddressIdentity\n addr={account.address}\n name={account?.name}\n copyable={false}\n />\n )\n }\n {...props}\n />\n );\n};\n"],"names":["AddressInputComponent"],"mappings":";;;;;AAKO,MAAM,YAAA,GAMR,CAAC,KAAA,KAAU;AACd,EAAA,MAAM,oBAAoB,oBAAA,EAAqB;AAE/C,EAAA,MAAM,KAAA,GAAQ,QAAQ,MAAM;AAC1B,IAAA,MAAM,oBAAuD,EAAC;AAC9D,IAAA,MAAA,CAAO,OAAO,iBAAiB,CAAA,CAC5B,MAAK,CACL,OAAA,CAAQ,CAAC,GAAA,KAAQ;AAlBxB,MAAA,IAAA,EAAA;AAmBQ,MAAA,iBAAA,CAAA,EAAA,GAAkB,GAAA,CAAI,OAAA,CAAA,KAAtB,iBAAA,CAAA,EAAA,CAAA,GAAmC,EAAC,CAAA;AACpC,MAAA,iBAAA,CAAkB,GAAA,CAAI,OAAO,CAAA,CAAE,IAAA,CAAK,GAAG,CAAA;AAAA,IACzC,CAAC,CAAA;AAEH,IAAA,OAAO,MAAA,CAAO,MAAA,CAAO,iBAAiB,CAAA,CAAE,GAAA;AAAA,MAAI,CAAC,UAC3C,KAAA,CAAM,MAAA;AAAA,QAAO,CAAC,GAAA,EAAK,CAAA,KAAA,CAChB,CAAA,CAAE,IAAA,EAAM,MAAA,IAAU,CAAA,KAAM,GAAA,CAAI,IAAA,EAAM,MAAA,IAAU,CAAA,CAAA,GAAK,CAAA,GAAI;AAAA;AACxD,KACF;AAAA,EACF,CAAA,EAAG,CAAC,iBAAiB,CAAC,CAAA;AAEtB,EAAA,uBACE,GAAA;AAAA,IAACA,cAAA;AAAA,IAAA;AAAA,MACC,MAAA,EAAQ,MAAA,CAAO,MAAA,CAAO,KAAK,EAAE,IAAA,EAAK;AAAA,MAClC,aAAA,EAAe,CAAC,OAAA,KACd,OAAO,OAAA,KAAY,QAAA,mBACjB,GAAA,CAAC,eAAA,EAAA,EAAgB,IAAA,EAAM,OAAA,EAAS,QAAA,EAAU,KAAA,EAAO,CAAA,mBAEjD,GAAA;AAAA,QAAC,eAAA;AAAA,QAAA;AAAA,UACC,MAAM,OAAA,CAAQ,OAAA;AAAA,UACd,MAAM,OAAA,EAAS,IAAA;AAAA,UACf,QAAA,EAAU;AAAA;AAAA,OACZ;AAAA,MAGH,GAAG;AAAA;AAAA,GACN;AAEJ;;;;"}
@@ -1,5 +1,6 @@
1
1
  import { jsx, jsxs } from 'react/jsx-runtime';
2
2
  import { usePlugin, ModalContext } from '@polkahub/context';
3
+ import { addrEq } from '@polkahub/plugin';
3
4
  import { SelectedAccountButton, selectedAccountPluginId } from '@polkahub/select-account';
4
5
  import { Dialog, DialogTrigger, DialogContent, DialogHeader, Button, DialogTitle, DialogBody } from '@polkahub/ui-components';
5
6
  import { state, useStateObservable } from '@react-rxjs/core';
@@ -29,7 +30,7 @@ const PolkaHubModal = ({ children, buttonProps, className, title = "Connect" })
29
30
  prev = acc;
30
31
  return;
31
32
  }
32
- if (prev === acc) return;
33
+ if (addrEq(prev?.address, acc?.address)) return;
33
34
  prev = acc;
34
35
  if (acc) contextValue.closeModal();
35
36
  });
@@ -1 +1 @@
1
- {"version":3,"file":"PolkaHubModal.js","sources":["../src/PolkaHubModal.tsx"],"sourcesContent":["import { ModalContext, usePlugin } from \"@polkahub/context\";\nimport { Account } from \"@polkahub/plugin\";\nimport {\n SelectedAccountButton,\n SelectedAccountPlugin,\n selectedAccountPluginId,\n} from \"@polkahub/select-account\";\nimport {\n Button,\n Dialog,\n DialogBody,\n DialogContent,\n DialogHeader,\n DialogTitle,\n DialogTrigger,\n} from \"@polkahub/ui-components\";\nimport { state, useStateObservable } from \"@react-rxjs/core\";\nimport { createSignal } from \"@react-rxjs/utils\";\nimport { ChevronLeft } from \"lucide-react\";\nimport {\n ComponentProps,\n FC,\n PropsWithChildren,\n ReactNode,\n useEffect,\n useMemo,\n useState,\n} from \"react\";\n\n// For lazy-loading optimizations\nexport const PolkaHubModalTrigger: FC = () => <SelectedAccountButton loading />;\n\nconst [openChange$, setOpen] = createSignal<boolean>();\nexport const openSelectAccount = () => setOpen(true);\nconst open$ = state(openChange$, false);\nconst close = () => setOpen(false);\n\nexport const PolkaHubModal: FC<\n PropsWithChildren<{\n className?: string;\n buttonProps?: ComponentProps<typeof SelectedAccountButton>;\n title?: string;\n }>\n> = ({ children, buttonProps, className, title = \"Connect\" }) => {\n const open = useStateObservable(open$);\n const selectedAccountPlugin = usePlugin<SelectedAccountPlugin>(\n selectedAccountPluginId\n );\n\n const { contentStack, contextValue } = usePolkaHubModalState(close);\n const activeContent = contentStack.length\n ? contentStack[contentStack.length - 1]\n : null;\n\n useEffect(() => {\n if (!selectedAccountPlugin) return;\n\n let first = true;\n let prev: Account | null = null;\n const sub = selectedAccountPlugin.selectedAccount$.subscribe((acc) => {\n if (first) {\n first = false;\n prev = acc;\n return;\n }\n if (prev === acc) return;\n prev = acc;\n // Only close when setting an account, not when resetting it.\n if (acc) contextValue.closeModal();\n });\n\n return () => sub.unsubscribe();\n }, [selectedAccountPlugin, contextValue]);\n\n return (\n <Dialog\n open={open}\n onOpenChange={(open) =>\n open ? setOpen(true) : contextValue.closeModal()\n }\n >\n <DialogTrigger asChild>\n <SelectedAccountButton className={className} {...buttonProps} />\n </DialogTrigger>\n <DialogContent\n onInteractOutside={(evt) => {\n if (\n evt.target instanceof HTMLElement &&\n evt.target.tagName === \"WCM-MODAL\"\n )\n evt.preventDefault();\n }}\n >\n <DialogHeader className=\"flex-row items-center\">\n {contentStack.length ? (\n <Button\n className=\"has-[>svg]:px-1\"\n type=\"button\"\n variant=\"ghost\"\n onClick={() => contextValue.popContent()}\n >\n <ChevronLeft />\n </Button>\n ) : null}\n <DialogTitle>{activeContent?.title ?? title}</DialogTitle>\n </DialogHeader>\n <DialogBody>\n <ModalContext value={contextValue}>\n {activeContent ? (\n activeContent.element\n ) : (\n <div className=\"space-y-4\">{children}</div>\n )}\n </ModalContext>\n </DialogBody>\n </DialogContent>\n </Dialog>\n );\n};\n\nexport const usePolkaHubModalState = (onClose?: () => void) => {\n const [contentStack, setContentStack] = useState<\n { title?: string; element: ReactNode }[]\n >([]);\n\n const contextValue = useMemo(() => {\n const ctx: ModalContext = {\n replaceContent: (element: { title?: string; element: ReactNode }) =>\n element == null\n ? ctx.popContent()\n : setContentStack((stack) => {\n const newStack = [...stack];\n const i = Math.max(newStack.length - 1, 0);\n newStack[i] = element;\n return newStack;\n }),\n pushContent: (element: { title?: string; element: ReactNode }) =>\n setContentStack((stack) =>\n element == null ? stack : [...stack, element]\n ),\n popContent: () =>\n setContentStack((stack) => {\n const newStack = [...stack];\n newStack.pop();\n return newStack;\n }),\n closeModal: () => {\n // Remove stack after small duration, otherwise the content might flash as the dialog is transitioning away\n setTimeout(() => setContentStack([]), 250);\n onClose?.();\n },\n };\n return ctx;\n }, [onClose]);\n return { contentStack, contextValue, setContentStack };\n};\n"],"names":["open"],"mappings":"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"}
1
+ {"version":3,"file":"PolkaHubModal.js","sources":["../src/PolkaHubModal.tsx"],"sourcesContent":["import { ModalContext, usePlugin } from \"@polkahub/context\";\nimport { Account, addrEq } from \"@polkahub/plugin\";\nimport {\n SelectedAccountButton,\n SelectedAccountPlugin,\n selectedAccountPluginId,\n} from \"@polkahub/select-account\";\nimport {\n Button,\n Dialog,\n DialogBody,\n DialogContent,\n DialogHeader,\n DialogTitle,\n DialogTrigger,\n} from \"@polkahub/ui-components\";\nimport { state, useStateObservable } from \"@react-rxjs/core\";\nimport { createSignal } from \"@react-rxjs/utils\";\nimport { ChevronLeft } from \"lucide-react\";\nimport {\n ComponentProps,\n FC,\n PropsWithChildren,\n ReactNode,\n useEffect,\n useMemo,\n useState,\n} from \"react\";\n\n// For lazy-loading optimizations\nexport const PolkaHubModalTrigger: FC = () => <SelectedAccountButton loading />;\n\nconst [openChange$, setOpen] = createSignal<boolean>();\nexport const openSelectAccount = () => setOpen(true);\nconst open$ = state(openChange$, false);\nconst close = () => setOpen(false);\n\nexport const PolkaHubModal: FC<\n PropsWithChildren<{\n className?: string;\n buttonProps?: ComponentProps<typeof SelectedAccountButton>;\n title?: string;\n }>\n> = ({ children, buttonProps, className, title = \"Connect\" }) => {\n const open = useStateObservable(open$);\n const selectedAccountPlugin = usePlugin<SelectedAccountPlugin>(\n selectedAccountPluginId\n );\n\n const { contentStack, contextValue } = usePolkaHubModalState(close);\n const activeContent = contentStack.length\n ? contentStack[contentStack.length - 1]\n : null;\n\n useEffect(() => {\n if (!selectedAccountPlugin) return;\n\n let first = true;\n let prev: Account | null = null;\n const sub = selectedAccountPlugin.selectedAccount$.subscribe((acc) => {\n if (first) {\n first = false;\n prev = acc;\n return;\n }\n if (addrEq(prev?.address, acc?.address)) return;\n prev = acc;\n // Only close when setting an account, not when resetting it.\n if (acc) contextValue.closeModal();\n });\n\n return () => sub.unsubscribe();\n }, [selectedAccountPlugin, contextValue]);\n\n return (\n <Dialog\n open={open}\n onOpenChange={(open) =>\n open ? setOpen(true) : contextValue.closeModal()\n }\n >\n <DialogTrigger asChild>\n <SelectedAccountButton className={className} {...buttonProps} />\n </DialogTrigger>\n <DialogContent\n onInteractOutside={(evt) => {\n if (\n evt.target instanceof HTMLElement &&\n evt.target.tagName === \"WCM-MODAL\"\n )\n evt.preventDefault();\n }}\n >\n <DialogHeader className=\"flex-row items-center\">\n {contentStack.length ? (\n <Button\n className=\"has-[>svg]:px-1\"\n type=\"button\"\n variant=\"ghost\"\n onClick={() => contextValue.popContent()}\n >\n <ChevronLeft />\n </Button>\n ) : null}\n <DialogTitle>{activeContent?.title ?? title}</DialogTitle>\n </DialogHeader>\n <DialogBody>\n <ModalContext value={contextValue}>\n {activeContent ? (\n activeContent.element\n ) : (\n <div className=\"space-y-4\">{children}</div>\n )}\n </ModalContext>\n </DialogBody>\n </DialogContent>\n </Dialog>\n );\n};\n\nexport const usePolkaHubModalState = (onClose?: () => void) => {\n const [contentStack, setContentStack] = useState<\n { title?: string; element: ReactNode }[]\n >([]);\n\n const contextValue = useMemo(() => {\n const ctx: ModalContext = {\n replaceContent: (element: { title?: string; element: ReactNode }) =>\n element == null\n ? ctx.popContent()\n : setContentStack((stack) => {\n const newStack = [...stack];\n const i = Math.max(newStack.length - 1, 0);\n newStack[i] = element;\n return newStack;\n }),\n pushContent: (element: { title?: string; element: ReactNode }) =>\n setContentStack((stack) =>\n element == null ? stack : [...stack, element]\n ),\n popContent: () =>\n setContentStack((stack) => {\n const newStack = [...stack];\n newStack.pop();\n return newStack;\n }),\n closeModal: () => {\n // Remove stack after small duration, otherwise the content might flash as the dialog is transitioning away\n setTimeout(() => setContentStack([]), 250);\n onClose?.();\n },\n };\n return ctx;\n }, [onClose]);\n return { contentStack, contextValue, setContentStack };\n};\n"],"names":["open"],"mappings":"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"}
@@ -41,7 +41,6 @@ declare const AddressInput: FC<{
41
41
  disableClear?: boolean;
42
42
  className?: string;
43
43
  triggerClassName?: string;
44
- maxAddrLength?: number;
45
44
  }>;
46
45
 
47
46
  export { AddressInput, PolkaHubModal, PolkaHubModalTrigger, openSelectAccount, usePolkaHubModalState };
package/index.css CHANGED
@@ -4,4 +4,6 @@
4
4
  @import "@polkahub/select-account";
5
5
  @import "@polkahub/ui-components";
6
6
  @import "@polkahub/vault";
7
+ @import "@polkahub/proxy";
8
+ @import "@polkahub/multisig";
7
9
  @source "./dist";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "polkahub",
3
- "version": "0.2.1",
3
+ "version": "0.3.0",
4
4
  "license": "MIT",
5
5
  "sideEffects": false,
6
6
  "type": "module",
@@ -26,19 +26,19 @@
26
26
  "@react-rxjs/core": "^0.10.8",
27
27
  "@react-rxjs/utils": "^0.9.7",
28
28
  "lucide-react": "^0.552.0",
29
- "@polkahub/context": "0.2.0",
30
- "@polkahub/ledger": "0.2.1",
31
- "@polkahub/pjs-wallet": "0.2.0",
32
- "@polkahub/mimir": "0.2.0",
33
- "@polkahub/plugin": "0.2.0",
34
- "@polkahub/multisig": "0.2.0",
35
- "@polkahub/proxy": "0.2.0",
36
- "@polkahub/read-only": "0.2.1",
37
- "@polkahub/select-account": "0.2.1",
38
- "@polkahub/state": "0.2.0",
39
- "@polkahub/ui-components": "0.2.0",
40
- "@polkahub/vault": "0.2.1",
41
- "@polkahub/wallet-connect": "0.2.1"
29
+ "@polkahub/context": "0.3.0",
30
+ "@polkahub/pjs-wallet": "0.3.0",
31
+ "@polkahub/read-only": "0.3.0",
32
+ "@polkahub/ledger": "0.3.0",
33
+ "@polkahub/proxy": "0.3.0",
34
+ "@polkahub/vault": "0.3.0",
35
+ "@polkahub/mimir": "0.3.0",
36
+ "@polkahub/multisig": "0.3.0",
37
+ "@polkahub/select-account": "0.3.0",
38
+ "@polkahub/ui-components": "0.3.0",
39
+ "@polkahub/wallet-connect": "0.3.0",
40
+ "@polkahub/plugin": "0.3.0",
41
+ "@polkahub/state": "0.3.0"
42
42
  },
43
43
  "peerDependencies": {
44
44
  "@types/react": "^19.2.2",