@medialane/ui 0.169.0 → 0.171.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.
Files changed (73) hide show
  1. package/dist/components/badge.d.cts +1 -1
  2. package/dist/components/badge.d.ts +1 -1
  3. package/dist/components/button.d.cts +2 -2
  4. package/dist/components/button.d.ts +2 -2
  5. package/dist/components/fast-mint/fast-mint.d.cts +2 -2
  6. package/dist/components/fast-mint/fast-mint.d.ts +2 -2
  7. package/dist/components/sheet.d.cts +1 -1
  8. package/dist/components/sheet.d.ts +1 -1
  9. package/dist/components/wallet/export-key-section.cjs +9 -14
  10. package/dist/components/wallet/export-key-section.cjs.map +1 -1
  11. package/dist/components/wallet/export-key-section.d.cts +1 -2
  12. package/dist/components/wallet/export-key-section.d.ts +1 -2
  13. package/dist/components/wallet/export-key-section.js +9 -14
  14. package/dist/components/wallet/export-key-section.js.map +1 -1
  15. package/dist/index.cjs +68 -0
  16. package/dist/index.cjs.map +1 -1
  17. package/dist/index.d.cts +8 -0
  18. package/dist/index.d.ts +8 -0
  19. package/dist/index.js +63 -0
  20. package/dist/index.js.map +1 -1
  21. package/dist/utils/sitemap-data.cjs +55 -0
  22. package/dist/utils/sitemap-data.cjs.map +1 -0
  23. package/dist/utils/sitemap-data.d.cts +23 -0
  24. package/dist/utils/sitemap-data.d.ts +23 -0
  25. package/dist/utils/sitemap-data.js +31 -0
  26. package/dist/utils/sitemap-data.js.map +1 -0
  27. package/dist/utils/use-coin-price.cjs +88 -0
  28. package/dist/utils/use-coin-price.cjs.map +1 -0
  29. package/dist/utils/use-coin-price.d.cts +17 -0
  30. package/dist/utils/use-coin-price.d.ts +17 -0
  31. package/dist/utils/use-coin-price.js +53 -0
  32. package/dist/utils/use-coin-price.js.map +1 -0
  33. package/dist/utils/use-collections.cjs +2 -2
  34. package/dist/utils/use-collections.cjs.map +1 -1
  35. package/dist/utils/use-collections.js +2 -2
  36. package/dist/utils/use-collections.js.map +1 -1
  37. package/dist/utils/use-drops.cjs +94 -0
  38. package/dist/utils/use-drops.cjs.map +1 -0
  39. package/dist/utils/use-drops.d.cts +39 -0
  40. package/dist/utils/use-drops.d.ts +39 -0
  41. package/dist/utils/use-drops.js +56 -0
  42. package/dist/utils/use-drops.js.map +1 -0
  43. package/dist/utils/use-platform-stats.cjs +50 -0
  44. package/dist/utils/use-platform-stats.cjs.map +1 -0
  45. package/dist/utils/use-platform-stats.d.cts +9 -0
  46. package/dist/utils/use-platform-stats.d.ts +9 -0
  47. package/dist/utils/use-platform-stats.js +16 -0
  48. package/dist/utils/use-platform-stats.js.map +1 -0
  49. package/dist/utils/use-pop.cjs +72 -0
  50. package/dist/utils/use-pop.cjs.map +1 -0
  51. package/dist/utils/use-pop.d.cts +28 -0
  52. package/dist/utils/use-pop.d.ts +28 -0
  53. package/dist/utils/use-pop.js +36 -0
  54. package/dist/utils/use-pop.js.map +1 -0
  55. package/dist/utils/use-sponsorship.cjs +131 -0
  56. package/dist/utils/use-sponsorship.cjs.map +1 -0
  57. package/dist/utils/use-sponsorship.d.cts +70 -0
  58. package/dist/utils/use-sponsorship.d.ts +70 -0
  59. package/dist/utils/use-sponsorship.js +90 -0
  60. package/dist/utils/use-sponsorship.js.map +1 -0
  61. package/dist/utils/use-tiers.cjs +137 -0
  62. package/dist/utils/use-tiers.cjs.map +1 -0
  63. package/dist/utils/use-tiers.d.cts +60 -0
  64. package/dist/utils/use-tiers.d.ts +60 -0
  65. package/dist/utils/use-tiers.js +95 -0
  66. package/dist/utils/use-tiers.js.map +1 -0
  67. package/dist/utils/use-tokens-by-ip-type.cjs +50 -0
  68. package/dist/utils/use-tokens-by-ip-type.cjs.map +1 -0
  69. package/dist/utils/use-tokens-by-ip-type.d.cts +14 -0
  70. package/dist/utils/use-tokens-by-ip-type.d.ts +14 -0
  71. package/dist/utils/use-tokens-by-ip-type.js +16 -0
  72. package/dist/utils/use-tokens-by-ip-type.js.map +1 -0
  73. package/package.json +3 -3
@@ -4,7 +4,7 @@ import * as React from 'react';
4
4
  import { VariantProps } from 'class-variance-authority';
5
5
 
6
6
  declare const badgeVariants: (props?: ({
7
- variant?: "outline" | "default" | "destructive" | "secondary" | null | undefined;
7
+ variant?: "default" | "destructive" | "outline" | "secondary" | null | undefined;
8
8
  } & class_variance_authority_types.ClassProp) | undefined) => string;
9
9
  interface BadgeProps extends React.HTMLAttributes<HTMLDivElement>, VariantProps<typeof badgeVariants> {
10
10
  }
@@ -4,7 +4,7 @@ import * as React from 'react';
4
4
  import { VariantProps } from 'class-variance-authority';
5
5
 
6
6
  declare const badgeVariants: (props?: ({
7
- variant?: "outline" | "default" | "destructive" | "secondary" | null | undefined;
7
+ variant?: "default" | "destructive" | "outline" | "secondary" | null | undefined;
8
8
  } & class_variance_authority_types.ClassProp) | undefined) => string;
9
9
  interface BadgeProps extends React.HTMLAttributes<HTMLDivElement>, VariantProps<typeof badgeVariants> {
10
10
  }
@@ -3,8 +3,8 @@ import * as React from 'react';
3
3
  import { VariantProps } from 'class-variance-authority';
4
4
 
5
5
  declare const buttonVariants: (props?: ({
6
- variant?: "outline" | "link" | "default" | "destructive" | "ghost" | "secondary" | "premium" | "tonal" | "gradient-border" | "gradient-fill" | null | undefined;
7
- size?: "default" | "icon" | "sm" | "lg" | null | undefined;
6
+ variant?: "ghost" | "link" | "default" | "destructive" | "outline" | "secondary" | "premium" | "tonal" | "gradient-border" | "gradient-fill" | null | undefined;
7
+ size?: "icon" | "default" | "sm" | "lg" | null | undefined;
8
8
  } & class_variance_authority_types.ClassProp) | undefined) => string;
9
9
  interface ButtonProps extends React.ButtonHTMLAttributes<HTMLButtonElement>, VariantProps<typeof buttonVariants> {
10
10
  asChild?: boolean;
@@ -3,8 +3,8 @@ import * as React from 'react';
3
3
  import { VariantProps } from 'class-variance-authority';
4
4
 
5
5
  declare const buttonVariants: (props?: ({
6
- variant?: "outline" | "link" | "default" | "destructive" | "ghost" | "secondary" | "premium" | "tonal" | "gradient-border" | "gradient-fill" | null | undefined;
7
- size?: "default" | "icon" | "sm" | "lg" | null | undefined;
6
+ variant?: "ghost" | "link" | "default" | "destructive" | "outline" | "secondary" | "premium" | "tonal" | "gradient-border" | "gradient-fill" | null | undefined;
7
+ size?: "icon" | "default" | "sm" | "lg" | null | undefined;
8
8
  } & class_variance_authority_types.ClassProp) | undefined) => string;
9
9
  interface ButtonProps extends React.ButtonHTMLAttributes<HTMLButtonElement>, VariantProps<typeof buttonVariants> {
10
10
  asChild?: boolean;
@@ -1,10 +1,10 @@
1
- import * as React from 'react';
2
1
  import * as react_jsx_runtime from 'react/jsx-runtime';
2
+ import * as React from 'react';
3
3
  import { FastMintProps } from './types.cjs';
4
4
  import 'starknet';
5
5
  import '@medialane/sdk';
6
6
  import '@medialane/sdk/starknet';
7
7
 
8
- declare function FastMint(props: FastMintProps): string | number | bigint | boolean | react_jsx_runtime.JSX.Element | Iterable<React.ReactNode> | Promise<string | number | bigint | boolean | React.ReactPortal | React.ReactElement<unknown, string | React.JSXElementConstructor<any>> | Iterable<React.ReactNode> | null | undefined> | null | undefined;
8
+ declare function FastMint(props: FastMintProps): string | number | bigint | boolean | Iterable<React.ReactNode> | Promise<string | number | bigint | boolean | React.ReactPortal | React.ReactElement<unknown, string | React.JSXElementConstructor<any>> | Iterable<React.ReactNode> | null | undefined> | react_jsx_runtime.JSX.Element | null | undefined;
9
9
 
10
10
  export { FastMint };
@@ -1,10 +1,10 @@
1
- import * as React from 'react';
2
1
  import * as react_jsx_runtime from 'react/jsx-runtime';
2
+ import * as React from 'react';
3
3
  import { FastMintProps } from './types.js';
4
4
  import 'starknet';
5
5
  import '@medialane/sdk';
6
6
  import '@medialane/sdk/starknet';
7
7
 
8
- declare function FastMint(props: FastMintProps): string | number | bigint | boolean | react_jsx_runtime.JSX.Element | Iterable<React.ReactNode> | Promise<string | number | bigint | boolean | React.ReactPortal | React.ReactElement<unknown, string | React.JSXElementConstructor<any>> | Iterable<React.ReactNode> | null | undefined> | null | undefined;
8
+ declare function FastMint(props: FastMintProps): string | number | bigint | boolean | Iterable<React.ReactNode> | Promise<string | number | bigint | boolean | React.ReactPortal | React.ReactElement<unknown, string | React.JSXElementConstructor<any>> | Iterable<React.ReactNode> | null | undefined> | react_jsx_runtime.JSX.Element | null | undefined;
9
9
 
10
10
  export { FastMint };
@@ -10,7 +10,7 @@ declare const SheetClose: React.ForwardRefExoticComponent<SheetPrimitive.DialogC
10
10
  declare const SheetPortal: React.FC<SheetPrimitive.DialogPortalProps>;
11
11
  declare const SheetOverlay: React.ForwardRefExoticComponent<Omit<SheetPrimitive.DialogOverlayProps & React.RefAttributes<HTMLDivElement>, "ref"> & React.RefAttributes<HTMLDivElement>>;
12
12
  declare const sheetVariants: (props?: ({
13
- side?: "bottom" | "left" | "right" | "top" | null | undefined;
13
+ side?: "left" | "right" | "bottom" | "top" | null | undefined;
14
14
  } & class_variance_authority_types.ClassProp) | undefined) => string;
15
15
  interface SheetContentProps extends React.ComponentPropsWithoutRef<typeof SheetPrimitive.Content>, VariantProps<typeof sheetVariants> {
16
16
  overlayClassName?: string;
@@ -10,7 +10,7 @@ declare const SheetClose: React.ForwardRefExoticComponent<SheetPrimitive.DialogC
10
10
  declare const SheetPortal: React.FC<SheetPrimitive.DialogPortalProps>;
11
11
  declare const SheetOverlay: React.ForwardRefExoticComponent<Omit<SheetPrimitive.DialogOverlayProps & React.RefAttributes<HTMLDivElement>, "ref"> & React.RefAttributes<HTMLDivElement>>;
12
12
  declare const sheetVariants: (props?: ({
13
- side?: "bottom" | "left" | "right" | "top" | null | undefined;
13
+ side?: "left" | "right" | "bottom" | "top" | null | undefined;
14
14
  } & class_variance_authority_types.ClassProp) | undefined) => string;
15
15
  interface SheetContentProps extends React.ComponentPropsWithoutRef<typeof SheetPrimitive.Content>, VariantProps<typeof sheetVariants> {
16
16
  overlayClassName?: string;
@@ -25,10 +25,11 @@ module.exports = __toCommonJS(export_key_section_exports);
25
25
  var import_jsx_runtime = require("react/jsx-runtime");
26
26
  var import_react = require("react");
27
27
  var import_lucide_react = require("lucide-react");
28
+ var import_starknet = require("@medialane/sdk/starknet");
28
29
  var import_button = require("../button.js");
29
30
  var import_alert = require("../alert.js");
30
- function ExportKeySection({ loadSealed, unlock, isRecoveryKey, describeError }) {
31
- const [privateKey, setPrivateKey] = (0, import_react.useState)(null);
31
+ function ExportKeySection({ loadSealed, unlock, describeError }) {
32
+ const [recoveryKey, setRecoveryKey] = (0, import_react.useState)(null);
32
33
  const [busy, setBusy] = (0, import_react.useState)(false);
33
34
  const [error, setError] = (0, import_react.useState)(null);
34
35
  const [copied, setCopied] = (0, import_react.useState)(false);
@@ -41,13 +42,7 @@ function ExportKeySection({ loadSealed, unlock, isRecoveryKey, describeError })
41
42
  setError("This browser has no wallet key stored.");
42
43
  return;
43
44
  }
44
- if (!isRecoveryKey(sealed)) {
45
- setError(
46
- "This device was approved from another one, so its key cannot restore your account on its own. Export from the device you first signed up on."
47
- );
48
- return;
49
- }
50
- setPrivateKey(await unlock(sealed));
45
+ setRecoveryKey((0, import_starknet.encodeRecoveryKey)({ walletAddress: sealed.address, privateKey: await unlock(sealed) }));
51
46
  } catch (err) {
52
47
  const fallback = "Could not unlock your key. Please try again.";
53
48
  setError(describeError ? describeError(err, fallback) : fallback);
@@ -56,13 +51,13 @@ function ExportKeySection({ loadSealed, unlock, isRecoveryKey, describeError })
56
51
  }
57
52
  };
58
53
  const copy = async () => {
59
- if (!privateKey) return;
60
- await navigator.clipboard.writeText(privateKey);
54
+ if (!recoveryKey) return;
55
+ await navigator.clipboard.writeText(recoveryKey);
61
56
  setCopied(true);
62
57
  setTimeout(() => setCopied(false), 2e3);
63
58
  };
64
59
  const hide = () => {
65
- setPrivateKey(null);
60
+ setRecoveryKey(null);
66
61
  setCopied(false);
67
62
  };
68
63
  return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "flex flex-col gap-3", children: [
@@ -70,7 +65,7 @@ function ExportKeySection({ loadSealed, unlock, isRecoveryKey, describeError })
70
65
  /* @__PURE__ */ (0, import_jsx_runtime.jsx)("p", { className: "text-sm font-semibold", children: "Recovery key" }),
71
66
  /* @__PURE__ */ (0, import_jsx_runtime.jsx)("p", { className: "mt-1 text-xs text-muted-foreground leading-relaxed", children: "Save this somewhere private, such as a password manager. It restores your account if you lose access to every device you use. To start using a new phone or browser, approve it from a device you already have." })
72
67
  ] }),
73
- privateKey ? /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_jsx_runtime.Fragment, { children: [
68
+ recoveryKey ? /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_jsx_runtime.Fragment, { children: [
74
69
  /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_alert.Alert, { variant: "destructive", children: [
75
70
  /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_lucide_react.ShieldAlert, { className: "h-4 w-4" }),
76
71
  /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_alert.AlertDescription, { className: "text-xs leading-relaxed", children: [
@@ -79,7 +74,7 @@ function ExportKeySection({ loadSealed, unlock, isRecoveryKey, describeError })
79
74
  "Medialane will never ask you for it. Treat any message requesting it as an attempt to take your assets."
80
75
  ] })
81
76
  ] }),
82
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("code", { className: "block break-all rounded-xl bg-muted px-3 py-2.5 font-mono text-xs select-all", children: privateKey }),
77
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("code", { className: "block break-all rounded-xl bg-muted px-3 py-2.5 font-mono text-xs select-all", children: recoveryKey }),
83
78
  /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "flex items-center gap-2", children: [
84
79
  /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_button.Button, { onClick: copy, variant: "outline", size: "sm", children: [
85
80
  copied ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_lucide_react.Check, { className: "mr-1.5 h-3.5 w-3.5" }) : /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_lucide_react.Copy, { className: "mr-1.5 h-3.5 w-3.5" }),
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/components/wallet/export-key-section.tsx"],"sourcesContent":["\"use client\";\n\nimport { useState } from \"react\";\nimport { KeyRound, Copy, Check, EyeOff, Loader2, ShieldAlert } from \"lucide-react\";\nimport type { SealedOwner } from \"@medialane/sdk/starknet\";\nimport { Button } from \"../button.js\";\nimport { Alert, AlertDescription } from \"../alert.js\";\n\nexport interface ExportKeySectionProps {\n loadSealed: () => SealedOwner | null;\n unlock: (sealed: SealedOwner) => Promise<string>;\n isRecoveryKey: (sealed: SealedOwner) => boolean;\n describeError?: (err: unknown, fallback: string) => string;\n}\n\nexport function ExportKeySection({ loadSealed, unlock, isRecoveryKey, describeError }: ExportKeySectionProps) {\n const [privateKey, setPrivateKey] = useState<string | null>(null);\n const [busy, setBusy] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const [copied, setCopied] = useState(false);\n\n const reveal = async () => {\n setBusy(true);\n setError(null);\n try {\n const sealed = loadSealed();\n if (!sealed) {\n setError(\"This browser has no wallet key stored.\");\n return;\n }\n if (!isRecoveryKey(sealed)) {\n setError(\n \"This device was approved from another one, so its key cannot restore your account on its own. Export from the device you first signed up on.\",\n );\n return;\n }\n setPrivateKey(await unlock(sealed));\n } catch (err) {\n const fallback = \"Could not unlock your key. Please try again.\";\n setError(describeError ? describeError(err, fallback) : fallback);\n } finally {\n setBusy(false);\n }\n };\n\n const copy = async () => {\n if (!privateKey) return;\n await navigator.clipboard.writeText(privateKey);\n setCopied(true);\n setTimeout(() => setCopied(false), 2000);\n };\n\n const hide = () => {\n setPrivateKey(null);\n setCopied(false);\n };\n\n return (\n <div className=\"flex flex-col gap-3\">\n <div>\n <p className=\"text-sm font-semibold\">Recovery key</p>\n <p className=\"mt-1 text-xs text-muted-foreground leading-relaxed\">\n Save this somewhere private, such as a password manager. It restores your account if you\n lose access to every device you use. To start using a new phone or browser, approve it\n from a device you already have.\n </p>\n </div>\n\n {privateKey ? (\n <>\n <Alert variant=\"destructive\">\n <ShieldAlert className=\"h-4 w-4\" />\n <AlertDescription className=\"text-xs leading-relaxed\">\n <span className=\"font-semibold\">Anyone with this key controls your wallet.</span>{\" \"}\n Medialane will never ask you for it. Treat any message requesting it as an attempt to\n take your assets.\n </AlertDescription>\n </Alert>\n <code className=\"block break-all rounded-xl bg-muted px-3 py-2.5 font-mono text-xs select-all\">\n {privateKey}\n </code>\n <div className=\"flex items-center gap-2\">\n <Button onClick={copy} variant=\"outline\" size=\"sm\">\n {copied ? <Check className=\"mr-1.5 h-3.5 w-3.5\" /> : <Copy className=\"mr-1.5 h-3.5 w-3.5\" />}\n {copied ? \"Copied\" : \"Copy key\"}\n </Button>\n <Button onClick={hide} variant=\"ghost\" size=\"sm\">\n <EyeOff className=\"mr-1.5 h-3.5 w-3.5\" />\n Hide\n </Button>\n </div>\n </>\n ) : (\n <>\n {error && <p className=\"text-sm text-destructive\">{error}</p>}\n <Button onClick={reveal} disabled={busy} variant=\"outline\" size=\"sm\" className=\"self-start\">\n {busy ? <Loader2 className=\"mr-1.5 h-3.5 w-3.5 animate-spin\" /> : <KeyRound className=\"mr-1.5 h-3.5 w-3.5\" />}\n Show recovery key\n </Button>\n </>\n )}\n </div>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AA2DM;AAzDN,mBAAyB;AACzB,0BAAoE;AAEpE,oBAAuB;AACvB,mBAAwC;AASjC,SAAS,iBAAiB,EAAE,YAAY,QAAQ,eAAe,cAAc,GAA0B;AAC5G,QAAM,CAAC,YAAY,aAAa,QAAI,uBAAwB,IAAI;AAChE,QAAM,CAAC,MAAM,OAAO,QAAI,uBAAS,KAAK;AACtC,QAAM,CAAC,OAAO,QAAQ,QAAI,uBAAwB,IAAI;AACtD,QAAM,CAAC,QAAQ,SAAS,QAAI,uBAAS,KAAK;AAE1C,QAAM,SAAS,YAAY;AACzB,YAAQ,IAAI;AACZ,aAAS,IAAI;AACb,QAAI;AACF,YAAM,SAAS,WAAW;AAC1B,UAAI,CAAC,QAAQ;AACX,iBAAS,wCAAwC;AACjD;AAAA,MACF;AACA,UAAI,CAAC,cAAc,MAAM,GAAG;AAC1B;AAAA,UACE;AAAA,QACF;AACA;AAAA,MACF;AACA,oBAAc,MAAM,OAAO,MAAM,CAAC;AAAA,IACpC,SAAS,KAAK;AACZ,YAAM,WAAW;AACjB,eAAS,gBAAgB,cAAc,KAAK,QAAQ,IAAI,QAAQ;AAAA,IAClE,UAAE;AACA,cAAQ,KAAK;AAAA,IACf;AAAA,EACF;AAEA,QAAM,OAAO,YAAY;AACvB,QAAI,CAAC,WAAY;AACjB,UAAM,UAAU,UAAU,UAAU,UAAU;AAC9C,cAAU,IAAI;AACd,eAAW,MAAM,UAAU,KAAK,GAAG,GAAI;AAAA,EACzC;AAEA,QAAM,OAAO,MAAM;AACjB,kBAAc,IAAI;AAClB,cAAU,KAAK;AAAA,EACjB;AAEA,SACE,6CAAC,SAAI,WAAU,uBACb;AAAA,iDAAC,SACC;AAAA,kDAAC,OAAE,WAAU,yBAAwB,0BAAY;AAAA,MACjD,4CAAC,OAAE,WAAU,sDAAqD,6NAIlE;AAAA,OACF;AAAA,IAEC,aACC,4EACE;AAAA,mDAAC,sBAAM,SAAQ,eACb;AAAA,oDAAC,mCAAY,WAAU,WAAU;AAAA,QACjC,6CAAC,iCAAiB,WAAU,2BAC1B;AAAA,sDAAC,UAAK,WAAU,iBAAgB,wDAA0C;AAAA,UAAQ;AAAA,UAAI;AAAA,WAGxF;AAAA,SACF;AAAA,MACA,4CAAC,UAAK,WAAU,gFACb,sBACH;AAAA,MACA,6CAAC,SAAI,WAAU,2BACb;AAAA,qDAAC,wBAAO,SAAS,MAAM,SAAQ,WAAU,MAAK,MAC3C;AAAA,mBAAS,4CAAC,6BAAM,WAAU,sBAAqB,IAAK,4CAAC,4BAAK,WAAU,sBAAqB;AAAA,UACzF,SAAS,WAAW;AAAA,WACvB;AAAA,QACA,6CAAC,wBAAO,SAAS,MAAM,SAAQ,SAAQ,MAAK,MAC1C;AAAA,sDAAC,8BAAO,WAAU,sBAAqB;AAAA,UAAE;AAAA,WAE3C;AAAA,SACF;AAAA,OACF,IAEA,4EACG;AAAA,eAAS,4CAAC,OAAE,WAAU,4BAA4B,iBAAM;AAAA,MACzD,6CAAC,wBAAO,SAAS,QAAQ,UAAU,MAAM,SAAQ,WAAU,MAAK,MAAK,WAAU,cAC5E;AAAA,eAAO,4CAAC,+BAAQ,WAAU,mCAAkC,IAAK,4CAAC,gCAAS,WAAU,sBAAqB;AAAA,QAAG;AAAA,SAEhH;AAAA,OACF;AAAA,KAEJ;AAEJ;","names":[]}
1
+ {"version":3,"sources":["../../../src/components/wallet/export-key-section.tsx"],"sourcesContent":["\"use client\";\n\nimport { useState } from \"react\";\nimport { KeyRound, Copy, Check, EyeOff, Loader2, ShieldAlert } from \"lucide-react\";\nimport { encodeRecoveryKey, type SealedOwner } from \"@medialane/sdk/starknet\";\nimport { Button } from \"../button.js\";\nimport { Alert, AlertDescription } from \"../alert.js\";\n\nexport interface ExportKeySectionProps {\n loadSealed: () => SealedOwner | null;\n unlock: (sealed: SealedOwner) => Promise<string>;\n describeError?: (err: unknown, fallback: string) => string;\n}\n\nexport function ExportKeySection({ loadSealed, unlock, describeError }: ExportKeySectionProps) {\n const [recoveryKey, setRecoveryKey] = useState<string | null>(null);\n const [busy, setBusy] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const [copied, setCopied] = useState(false);\n\n const reveal = async () => {\n setBusy(true);\n setError(null);\n try {\n const sealed = loadSealed();\n if (!sealed) {\n setError(\"This browser has no wallet key stored.\");\n return;\n }\n setRecoveryKey(encodeRecoveryKey({ walletAddress: sealed.address, privateKey: await unlock(sealed) }));\n } catch (err) {\n const fallback = \"Could not unlock your key. Please try again.\";\n setError(describeError ? describeError(err, fallback) : fallback);\n } finally {\n setBusy(false);\n }\n };\n\n const copy = async () => {\n if (!recoveryKey) return;\n await navigator.clipboard.writeText(recoveryKey);\n setCopied(true);\n setTimeout(() => setCopied(false), 2000);\n };\n\n const hide = () => {\n setRecoveryKey(null);\n setCopied(false);\n };\n\n return (\n <div className=\"flex flex-col gap-3\">\n <div>\n <p className=\"text-sm font-semibold\">Recovery key</p>\n <p className=\"mt-1 text-xs text-muted-foreground leading-relaxed\">\n Save this somewhere private, such as a password manager. It restores your account if you\n lose access to every device you use. To start using a new phone or browser, approve it\n from a device you already have.\n </p>\n </div>\n\n {recoveryKey ? (\n <>\n <Alert variant=\"destructive\">\n <ShieldAlert className=\"h-4 w-4\" />\n <AlertDescription className=\"text-xs leading-relaxed\">\n <span className=\"font-semibold\">Anyone with this key controls your wallet.</span>{\" \"}\n Medialane will never ask you for it. Treat any message requesting it as an attempt to\n take your assets.\n </AlertDescription>\n </Alert>\n <code className=\"block break-all rounded-xl bg-muted px-3 py-2.5 font-mono text-xs select-all\">\n {recoveryKey}\n </code>\n <div className=\"flex items-center gap-2\">\n <Button onClick={copy} variant=\"outline\" size=\"sm\">\n {copied ? <Check className=\"mr-1.5 h-3.5 w-3.5\" /> : <Copy className=\"mr-1.5 h-3.5 w-3.5\" />}\n {copied ? \"Copied\" : \"Copy key\"}\n </Button>\n <Button onClick={hide} variant=\"ghost\" size=\"sm\">\n <EyeOff className=\"mr-1.5 h-3.5 w-3.5\" />\n Hide\n </Button>\n </div>\n </>\n ) : (\n <>\n {error && <p className=\"text-sm text-destructive\">{error}</p>}\n <Button onClick={reveal} disabled={busy} variant=\"outline\" size=\"sm\" className=\"self-start\">\n {busy ? <Loader2 className=\"mr-1.5 h-3.5 w-3.5 animate-spin\" /> : <KeyRound className=\"mr-1.5 h-3.5 w-3.5\" />}\n Show recovery key\n </Button>\n </>\n )}\n </div>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAoDM;AAlDN,mBAAyB;AACzB,0BAAoE;AACpE,sBAAoD;AACpD,oBAAuB;AACvB,mBAAwC;AAQjC,SAAS,iBAAiB,EAAE,YAAY,QAAQ,cAAc,GAA0B;AAC7F,QAAM,CAAC,aAAa,cAAc,QAAI,uBAAwB,IAAI;AAClE,QAAM,CAAC,MAAM,OAAO,QAAI,uBAAS,KAAK;AACtC,QAAM,CAAC,OAAO,QAAQ,QAAI,uBAAwB,IAAI;AACtD,QAAM,CAAC,QAAQ,SAAS,QAAI,uBAAS,KAAK;AAE1C,QAAM,SAAS,YAAY;AACzB,YAAQ,IAAI;AACZ,aAAS,IAAI;AACb,QAAI;AACF,YAAM,SAAS,WAAW;AAC1B,UAAI,CAAC,QAAQ;AACX,iBAAS,wCAAwC;AACjD;AAAA,MACF;AACA,yBAAe,mCAAkB,EAAE,eAAe,OAAO,SAAS,YAAY,MAAM,OAAO,MAAM,EAAE,CAAC,CAAC;AAAA,IACvG,SAAS,KAAK;AACZ,YAAM,WAAW;AACjB,eAAS,gBAAgB,cAAc,KAAK,QAAQ,IAAI,QAAQ;AAAA,IAClE,UAAE;AACA,cAAQ,KAAK;AAAA,IACf;AAAA,EACF;AAEA,QAAM,OAAO,YAAY;AACvB,QAAI,CAAC,YAAa;AAClB,UAAM,UAAU,UAAU,UAAU,WAAW;AAC/C,cAAU,IAAI;AACd,eAAW,MAAM,UAAU,KAAK,GAAG,GAAI;AAAA,EACzC;AAEA,QAAM,OAAO,MAAM;AACjB,mBAAe,IAAI;AACnB,cAAU,KAAK;AAAA,EACjB;AAEA,SACE,6CAAC,SAAI,WAAU,uBACb;AAAA,iDAAC,SACC;AAAA,kDAAC,OAAE,WAAU,yBAAwB,0BAAY;AAAA,MACjD,4CAAC,OAAE,WAAU,sDAAqD,6NAIlE;AAAA,OACF;AAAA,IAEC,cACC,4EACE;AAAA,mDAAC,sBAAM,SAAQ,eACb;AAAA,oDAAC,mCAAY,WAAU,WAAU;AAAA,QACjC,6CAAC,iCAAiB,WAAU,2BAC1B;AAAA,sDAAC,UAAK,WAAU,iBAAgB,wDAA0C;AAAA,UAAQ;AAAA,UAAI;AAAA,WAGxF;AAAA,SACF;AAAA,MACA,4CAAC,UAAK,WAAU,gFACb,uBACH;AAAA,MACA,6CAAC,SAAI,WAAU,2BACb;AAAA,qDAAC,wBAAO,SAAS,MAAM,SAAQ,WAAU,MAAK,MAC3C;AAAA,mBAAS,4CAAC,6BAAM,WAAU,sBAAqB,IAAK,4CAAC,4BAAK,WAAU,sBAAqB;AAAA,UACzF,SAAS,WAAW;AAAA,WACvB;AAAA,QACA,6CAAC,wBAAO,SAAS,MAAM,SAAQ,SAAQ,MAAK,MAC1C;AAAA,sDAAC,8BAAO,WAAU,sBAAqB;AAAA,UAAE;AAAA,WAE3C;AAAA,SACF;AAAA,OACF,IAEA,4EACG;AAAA,eAAS,4CAAC,OAAE,WAAU,4BAA4B,iBAAM;AAAA,MACzD,6CAAC,wBAAO,SAAS,QAAQ,UAAU,MAAM,SAAQ,WAAU,MAAK,MAAK,WAAU,cAC5E;AAAA,eAAO,4CAAC,+BAAQ,WAAU,mCAAkC,IAAK,4CAAC,gCAAS,WAAU,sBAAqB;AAAA,QAAG;AAAA,SAEhH;AAAA,OACF;AAAA,KAEJ;AAEJ;","names":[]}
@@ -4,9 +4,8 @@ import { SealedOwner } from '@medialane/sdk/starknet';
4
4
  interface ExportKeySectionProps {
5
5
  loadSealed: () => SealedOwner | null;
6
6
  unlock: (sealed: SealedOwner) => Promise<string>;
7
- isRecoveryKey: (sealed: SealedOwner) => boolean;
8
7
  describeError?: (err: unknown, fallback: string) => string;
9
8
  }
10
- declare function ExportKeySection({ loadSealed, unlock, isRecoveryKey, describeError }: ExportKeySectionProps): react_jsx_runtime.JSX.Element;
9
+ declare function ExportKeySection({ loadSealed, unlock, describeError }: ExportKeySectionProps): react_jsx_runtime.JSX.Element;
11
10
 
12
11
  export { ExportKeySection, type ExportKeySectionProps };
@@ -4,9 +4,8 @@ import { SealedOwner } from '@medialane/sdk/starknet';
4
4
  interface ExportKeySectionProps {
5
5
  loadSealed: () => SealedOwner | null;
6
6
  unlock: (sealed: SealedOwner) => Promise<string>;
7
- isRecoveryKey: (sealed: SealedOwner) => boolean;
8
7
  describeError?: (err: unknown, fallback: string) => string;
9
8
  }
10
- declare function ExportKeySection({ loadSealed, unlock, isRecoveryKey, describeError }: ExportKeySectionProps): react_jsx_runtime.JSX.Element;
9
+ declare function ExportKeySection({ loadSealed, unlock, describeError }: ExportKeySectionProps): react_jsx_runtime.JSX.Element;
11
10
 
12
11
  export { ExportKeySection, type ExportKeySectionProps };
@@ -2,10 +2,11 @@
2
2
  import { Fragment, jsx, jsxs } from "react/jsx-runtime";
3
3
  import { useState } from "react";
4
4
  import { KeyRound, Copy, Check, EyeOff, Loader2, ShieldAlert } from "lucide-react";
5
+ import { encodeRecoveryKey } from "@medialane/sdk/starknet";
5
6
  import { Button } from "../button.js";
6
7
  import { Alert, AlertDescription } from "../alert.js";
7
- function ExportKeySection({ loadSealed, unlock, isRecoveryKey, describeError }) {
8
- const [privateKey, setPrivateKey] = useState(null);
8
+ function ExportKeySection({ loadSealed, unlock, describeError }) {
9
+ const [recoveryKey, setRecoveryKey] = useState(null);
9
10
  const [busy, setBusy] = useState(false);
10
11
  const [error, setError] = useState(null);
11
12
  const [copied, setCopied] = useState(false);
@@ -18,13 +19,7 @@ function ExportKeySection({ loadSealed, unlock, isRecoveryKey, describeError })
18
19
  setError("This browser has no wallet key stored.");
19
20
  return;
20
21
  }
21
- if (!isRecoveryKey(sealed)) {
22
- setError(
23
- "This device was approved from another one, so its key cannot restore your account on its own. Export from the device you first signed up on."
24
- );
25
- return;
26
- }
27
- setPrivateKey(await unlock(sealed));
22
+ setRecoveryKey(encodeRecoveryKey({ walletAddress: sealed.address, privateKey: await unlock(sealed) }));
28
23
  } catch (err) {
29
24
  const fallback = "Could not unlock your key. Please try again.";
30
25
  setError(describeError ? describeError(err, fallback) : fallback);
@@ -33,13 +28,13 @@ function ExportKeySection({ loadSealed, unlock, isRecoveryKey, describeError })
33
28
  }
34
29
  };
35
30
  const copy = async () => {
36
- if (!privateKey) return;
37
- await navigator.clipboard.writeText(privateKey);
31
+ if (!recoveryKey) return;
32
+ await navigator.clipboard.writeText(recoveryKey);
38
33
  setCopied(true);
39
34
  setTimeout(() => setCopied(false), 2e3);
40
35
  };
41
36
  const hide = () => {
42
- setPrivateKey(null);
37
+ setRecoveryKey(null);
43
38
  setCopied(false);
44
39
  };
45
40
  return /* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-3", children: [
@@ -47,7 +42,7 @@ function ExportKeySection({ loadSealed, unlock, isRecoveryKey, describeError })
47
42
  /* @__PURE__ */ jsx("p", { className: "text-sm font-semibold", children: "Recovery key" }),
48
43
  /* @__PURE__ */ jsx("p", { className: "mt-1 text-xs text-muted-foreground leading-relaxed", children: "Save this somewhere private, such as a password manager. It restores your account if you lose access to every device you use. To start using a new phone or browser, approve it from a device you already have." })
49
44
  ] }),
50
- privateKey ? /* @__PURE__ */ jsxs(Fragment, { children: [
45
+ recoveryKey ? /* @__PURE__ */ jsxs(Fragment, { children: [
51
46
  /* @__PURE__ */ jsxs(Alert, { variant: "destructive", children: [
52
47
  /* @__PURE__ */ jsx(ShieldAlert, { className: "h-4 w-4" }),
53
48
  /* @__PURE__ */ jsxs(AlertDescription, { className: "text-xs leading-relaxed", children: [
@@ -56,7 +51,7 @@ function ExportKeySection({ loadSealed, unlock, isRecoveryKey, describeError })
56
51
  "Medialane will never ask you for it. Treat any message requesting it as an attempt to take your assets."
57
52
  ] })
58
53
  ] }),
59
- /* @__PURE__ */ jsx("code", { className: "block break-all rounded-xl bg-muted px-3 py-2.5 font-mono text-xs select-all", children: privateKey }),
54
+ /* @__PURE__ */ jsx("code", { className: "block break-all rounded-xl bg-muted px-3 py-2.5 font-mono text-xs select-all", children: recoveryKey }),
60
55
  /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2", children: [
61
56
  /* @__PURE__ */ jsxs(Button, { onClick: copy, variant: "outline", size: "sm", children: [
62
57
  copied ? /* @__PURE__ */ jsx(Check, { className: "mr-1.5 h-3.5 w-3.5" }) : /* @__PURE__ */ jsx(Copy, { className: "mr-1.5 h-3.5 w-3.5" }),
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/components/wallet/export-key-section.tsx"],"sourcesContent":["\"use client\";\n\nimport { useState } from \"react\";\nimport { KeyRound, Copy, Check, EyeOff, Loader2, ShieldAlert } from \"lucide-react\";\nimport type { SealedOwner } from \"@medialane/sdk/starknet\";\nimport { Button } from \"../button.js\";\nimport { Alert, AlertDescription } from \"../alert.js\";\n\nexport interface ExportKeySectionProps {\n loadSealed: () => SealedOwner | null;\n unlock: (sealed: SealedOwner) => Promise<string>;\n isRecoveryKey: (sealed: SealedOwner) => boolean;\n describeError?: (err: unknown, fallback: string) => string;\n}\n\nexport function ExportKeySection({ loadSealed, unlock, isRecoveryKey, describeError }: ExportKeySectionProps) {\n const [privateKey, setPrivateKey] = useState<string | null>(null);\n const [busy, setBusy] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const [copied, setCopied] = useState(false);\n\n const reveal = async () => {\n setBusy(true);\n setError(null);\n try {\n const sealed = loadSealed();\n if (!sealed) {\n setError(\"This browser has no wallet key stored.\");\n return;\n }\n if (!isRecoveryKey(sealed)) {\n setError(\n \"This device was approved from another one, so its key cannot restore your account on its own. Export from the device you first signed up on.\",\n );\n return;\n }\n setPrivateKey(await unlock(sealed));\n } catch (err) {\n const fallback = \"Could not unlock your key. Please try again.\";\n setError(describeError ? describeError(err, fallback) : fallback);\n } finally {\n setBusy(false);\n }\n };\n\n const copy = async () => {\n if (!privateKey) return;\n await navigator.clipboard.writeText(privateKey);\n setCopied(true);\n setTimeout(() => setCopied(false), 2000);\n };\n\n const hide = () => {\n setPrivateKey(null);\n setCopied(false);\n };\n\n return (\n <div className=\"flex flex-col gap-3\">\n <div>\n <p className=\"text-sm font-semibold\">Recovery key</p>\n <p className=\"mt-1 text-xs text-muted-foreground leading-relaxed\">\n Save this somewhere private, such as a password manager. It restores your account if you\n lose access to every device you use. To start using a new phone or browser, approve it\n from a device you already have.\n </p>\n </div>\n\n {privateKey ? (\n <>\n <Alert variant=\"destructive\">\n <ShieldAlert className=\"h-4 w-4\" />\n <AlertDescription className=\"text-xs leading-relaxed\">\n <span className=\"font-semibold\">Anyone with this key controls your wallet.</span>{\" \"}\n Medialane will never ask you for it. Treat any message requesting it as an attempt to\n take your assets.\n </AlertDescription>\n </Alert>\n <code className=\"block break-all rounded-xl bg-muted px-3 py-2.5 font-mono text-xs select-all\">\n {privateKey}\n </code>\n <div className=\"flex items-center gap-2\">\n <Button onClick={copy} variant=\"outline\" size=\"sm\">\n {copied ? <Check className=\"mr-1.5 h-3.5 w-3.5\" /> : <Copy className=\"mr-1.5 h-3.5 w-3.5\" />}\n {copied ? \"Copied\" : \"Copy key\"}\n </Button>\n <Button onClick={hide} variant=\"ghost\" size=\"sm\">\n <EyeOff className=\"mr-1.5 h-3.5 w-3.5\" />\n Hide\n </Button>\n </div>\n </>\n ) : (\n <>\n {error && <p className=\"text-sm text-destructive\">{error}</p>}\n <Button onClick={reveal} disabled={busy} variant=\"outline\" size=\"sm\" className=\"self-start\">\n {busy ? <Loader2 className=\"mr-1.5 h-3.5 w-3.5 animate-spin\" /> : <KeyRound className=\"mr-1.5 h-3.5 w-3.5\" />}\n Show recovery key\n </Button>\n </>\n )}\n </div>\n );\n}\n"],"mappings":";AA2DM,SAUE,UATA,KADF;AAzDN,SAAS,gBAAgB;AACzB,SAAS,UAAU,MAAM,OAAO,QAAQ,SAAS,mBAAmB;AAEpE,SAAS,cAAc;AACvB,SAAS,OAAO,wBAAwB;AASjC,SAAS,iBAAiB,EAAE,YAAY,QAAQ,eAAe,cAAc,GAA0B;AAC5G,QAAM,CAAC,YAAY,aAAa,IAAI,SAAwB,IAAI;AAChE,QAAM,CAAC,MAAM,OAAO,IAAI,SAAS,KAAK;AACtC,QAAM,CAAC,OAAO,QAAQ,IAAI,SAAwB,IAAI;AACtD,QAAM,CAAC,QAAQ,SAAS,IAAI,SAAS,KAAK;AAE1C,QAAM,SAAS,YAAY;AACzB,YAAQ,IAAI;AACZ,aAAS,IAAI;AACb,QAAI;AACF,YAAM,SAAS,WAAW;AAC1B,UAAI,CAAC,QAAQ;AACX,iBAAS,wCAAwC;AACjD;AAAA,MACF;AACA,UAAI,CAAC,cAAc,MAAM,GAAG;AAC1B;AAAA,UACE;AAAA,QACF;AACA;AAAA,MACF;AACA,oBAAc,MAAM,OAAO,MAAM,CAAC;AAAA,IACpC,SAAS,KAAK;AACZ,YAAM,WAAW;AACjB,eAAS,gBAAgB,cAAc,KAAK,QAAQ,IAAI,QAAQ;AAAA,IAClE,UAAE;AACA,cAAQ,KAAK;AAAA,IACf;AAAA,EACF;AAEA,QAAM,OAAO,YAAY;AACvB,QAAI,CAAC,WAAY;AACjB,UAAM,UAAU,UAAU,UAAU,UAAU;AAC9C,cAAU,IAAI;AACd,eAAW,MAAM,UAAU,KAAK,GAAG,GAAI;AAAA,EACzC;AAEA,QAAM,OAAO,MAAM;AACjB,kBAAc,IAAI;AAClB,cAAU,KAAK;AAAA,EACjB;AAEA,SACE,qBAAC,SAAI,WAAU,uBACb;AAAA,yBAAC,SACC;AAAA,0BAAC,OAAE,WAAU,yBAAwB,0BAAY;AAAA,MACjD,oBAAC,OAAE,WAAU,sDAAqD,6NAIlE;AAAA,OACF;AAAA,IAEC,aACC,iCACE;AAAA,2BAAC,SAAM,SAAQ,eACb;AAAA,4BAAC,eAAY,WAAU,WAAU;AAAA,QACjC,qBAAC,oBAAiB,WAAU,2BAC1B;AAAA,8BAAC,UAAK,WAAU,iBAAgB,wDAA0C;AAAA,UAAQ;AAAA,UAAI;AAAA,WAGxF;AAAA,SACF;AAAA,MACA,oBAAC,UAAK,WAAU,gFACb,sBACH;AAAA,MACA,qBAAC,SAAI,WAAU,2BACb;AAAA,6BAAC,UAAO,SAAS,MAAM,SAAQ,WAAU,MAAK,MAC3C;AAAA,mBAAS,oBAAC,SAAM,WAAU,sBAAqB,IAAK,oBAAC,QAAK,WAAU,sBAAqB;AAAA,UACzF,SAAS,WAAW;AAAA,WACvB;AAAA,QACA,qBAAC,UAAO,SAAS,MAAM,SAAQ,SAAQ,MAAK,MAC1C;AAAA,8BAAC,UAAO,WAAU,sBAAqB;AAAA,UAAE;AAAA,WAE3C;AAAA,SACF;AAAA,OACF,IAEA,iCACG;AAAA,eAAS,oBAAC,OAAE,WAAU,4BAA4B,iBAAM;AAAA,MACzD,qBAAC,UAAO,SAAS,QAAQ,UAAU,MAAM,SAAQ,WAAU,MAAK,MAAK,WAAU,cAC5E;AAAA,eAAO,oBAAC,WAAQ,WAAU,mCAAkC,IAAK,oBAAC,YAAS,WAAU,sBAAqB;AAAA,QAAG;AAAA,SAEhH;AAAA,OACF;AAAA,KAEJ;AAEJ;","names":[]}
1
+ {"version":3,"sources":["../../../src/components/wallet/export-key-section.tsx"],"sourcesContent":["\"use client\";\n\nimport { useState } from \"react\";\nimport { KeyRound, Copy, Check, EyeOff, Loader2, ShieldAlert } from \"lucide-react\";\nimport { encodeRecoveryKey, type SealedOwner } from \"@medialane/sdk/starknet\";\nimport { Button } from \"../button.js\";\nimport { Alert, AlertDescription } from \"../alert.js\";\n\nexport interface ExportKeySectionProps {\n loadSealed: () => SealedOwner | null;\n unlock: (sealed: SealedOwner) => Promise<string>;\n describeError?: (err: unknown, fallback: string) => string;\n}\n\nexport function ExportKeySection({ loadSealed, unlock, describeError }: ExportKeySectionProps) {\n const [recoveryKey, setRecoveryKey] = useState<string | null>(null);\n const [busy, setBusy] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const [copied, setCopied] = useState(false);\n\n const reveal = async () => {\n setBusy(true);\n setError(null);\n try {\n const sealed = loadSealed();\n if (!sealed) {\n setError(\"This browser has no wallet key stored.\");\n return;\n }\n setRecoveryKey(encodeRecoveryKey({ walletAddress: sealed.address, privateKey: await unlock(sealed) }));\n } catch (err) {\n const fallback = \"Could not unlock your key. Please try again.\";\n setError(describeError ? describeError(err, fallback) : fallback);\n } finally {\n setBusy(false);\n }\n };\n\n const copy = async () => {\n if (!recoveryKey) return;\n await navigator.clipboard.writeText(recoveryKey);\n setCopied(true);\n setTimeout(() => setCopied(false), 2000);\n };\n\n const hide = () => {\n setRecoveryKey(null);\n setCopied(false);\n };\n\n return (\n <div className=\"flex flex-col gap-3\">\n <div>\n <p className=\"text-sm font-semibold\">Recovery key</p>\n <p className=\"mt-1 text-xs text-muted-foreground leading-relaxed\">\n Save this somewhere private, such as a password manager. It restores your account if you\n lose access to every device you use. To start using a new phone or browser, approve it\n from a device you already have.\n </p>\n </div>\n\n {recoveryKey ? (\n <>\n <Alert variant=\"destructive\">\n <ShieldAlert className=\"h-4 w-4\" />\n <AlertDescription className=\"text-xs leading-relaxed\">\n <span className=\"font-semibold\">Anyone with this key controls your wallet.</span>{\" \"}\n Medialane will never ask you for it. Treat any message requesting it as an attempt to\n take your assets.\n </AlertDescription>\n </Alert>\n <code className=\"block break-all rounded-xl bg-muted px-3 py-2.5 font-mono text-xs select-all\">\n {recoveryKey}\n </code>\n <div className=\"flex items-center gap-2\">\n <Button onClick={copy} variant=\"outline\" size=\"sm\">\n {copied ? <Check className=\"mr-1.5 h-3.5 w-3.5\" /> : <Copy className=\"mr-1.5 h-3.5 w-3.5\" />}\n {copied ? \"Copied\" : \"Copy key\"}\n </Button>\n <Button onClick={hide} variant=\"ghost\" size=\"sm\">\n <EyeOff className=\"mr-1.5 h-3.5 w-3.5\" />\n Hide\n </Button>\n </div>\n </>\n ) : (\n <>\n {error && <p className=\"text-sm text-destructive\">{error}</p>}\n <Button onClick={reveal} disabled={busy} variant=\"outline\" size=\"sm\" className=\"self-start\">\n {busy ? <Loader2 className=\"mr-1.5 h-3.5 w-3.5 animate-spin\" /> : <KeyRound className=\"mr-1.5 h-3.5 w-3.5\" />}\n Show recovery key\n </Button>\n </>\n )}\n </div>\n );\n}\n"],"mappings":";AAoDM,SAUE,UATA,KADF;AAlDN,SAAS,gBAAgB;AACzB,SAAS,UAAU,MAAM,OAAO,QAAQ,SAAS,mBAAmB;AACpE,SAAS,yBAA2C;AACpD,SAAS,cAAc;AACvB,SAAS,OAAO,wBAAwB;AAQjC,SAAS,iBAAiB,EAAE,YAAY,QAAQ,cAAc,GAA0B;AAC7F,QAAM,CAAC,aAAa,cAAc,IAAI,SAAwB,IAAI;AAClE,QAAM,CAAC,MAAM,OAAO,IAAI,SAAS,KAAK;AACtC,QAAM,CAAC,OAAO,QAAQ,IAAI,SAAwB,IAAI;AACtD,QAAM,CAAC,QAAQ,SAAS,IAAI,SAAS,KAAK;AAE1C,QAAM,SAAS,YAAY;AACzB,YAAQ,IAAI;AACZ,aAAS,IAAI;AACb,QAAI;AACF,YAAM,SAAS,WAAW;AAC1B,UAAI,CAAC,QAAQ;AACX,iBAAS,wCAAwC;AACjD;AAAA,MACF;AACA,qBAAe,kBAAkB,EAAE,eAAe,OAAO,SAAS,YAAY,MAAM,OAAO,MAAM,EAAE,CAAC,CAAC;AAAA,IACvG,SAAS,KAAK;AACZ,YAAM,WAAW;AACjB,eAAS,gBAAgB,cAAc,KAAK,QAAQ,IAAI,QAAQ;AAAA,IAClE,UAAE;AACA,cAAQ,KAAK;AAAA,IACf;AAAA,EACF;AAEA,QAAM,OAAO,YAAY;AACvB,QAAI,CAAC,YAAa;AAClB,UAAM,UAAU,UAAU,UAAU,WAAW;AAC/C,cAAU,IAAI;AACd,eAAW,MAAM,UAAU,KAAK,GAAG,GAAI;AAAA,EACzC;AAEA,QAAM,OAAO,MAAM;AACjB,mBAAe,IAAI;AACnB,cAAU,KAAK;AAAA,EACjB;AAEA,SACE,qBAAC,SAAI,WAAU,uBACb;AAAA,yBAAC,SACC;AAAA,0BAAC,OAAE,WAAU,yBAAwB,0BAAY;AAAA,MACjD,oBAAC,OAAE,WAAU,sDAAqD,6NAIlE;AAAA,OACF;AAAA,IAEC,cACC,iCACE;AAAA,2BAAC,SAAM,SAAQ,eACb;AAAA,4BAAC,eAAY,WAAU,WAAU;AAAA,QACjC,qBAAC,oBAAiB,WAAU,2BAC1B;AAAA,8BAAC,UAAK,WAAU,iBAAgB,wDAA0C;AAAA,UAAQ;AAAA,UAAI;AAAA,WAGxF;AAAA,SACF;AAAA,MACA,oBAAC,UAAK,WAAU,gFACb,uBACH;AAAA,MACA,qBAAC,SAAI,WAAU,2BACb;AAAA,6BAAC,UAAO,SAAS,MAAM,SAAQ,WAAU,MAAK,MAC3C;AAAA,mBAAS,oBAAC,SAAM,WAAU,sBAAqB,IAAK,oBAAC,QAAK,WAAU,sBAAqB;AAAA,UACzF,SAAS,WAAW;AAAA,WACvB;AAAA,QACA,qBAAC,UAAO,SAAS,MAAM,SAAQ,SAAQ,MAAK,MAC1C;AAAA,8BAAC,UAAO,WAAU,sBAAqB;AAAA,UAAE;AAAA,WAE3C;AAAA,SACF;AAAA,OACF,IAEA,iCACG;AAAA,eAAS,oBAAC,OAAE,WAAU,4BAA4B,iBAAM;AAAA,MACzD,qBAAC,UAAO,SAAS,QAAQ,UAAU,MAAM,SAAQ,WAAU,MAAK,MAAK,WAAU,cAC5E;AAAA,eAAO,oBAAC,WAAQ,WAAU,mCAAkC,IAAK,oBAAC,YAAS,WAAU,sBAAqB;AAAA,QAAG;AAAA,SAEhH;AAAA,OACF;AAAA,KAEJ;AAEJ;","names":[]}
package/dist/index.cjs CHANGED
@@ -302,6 +302,7 @@ __export(index_exports, {
302
302
  coinKindLabelPlural: () => import_coins.coinKindLabelPlural,
303
303
  coinServiceIds: () => import_coins.coinServiceIds,
304
304
  coinSupply: () => import_coins.coinSupply,
305
+ collectSitemapData: () => import_sitemap_data.collectSitemapData,
305
306
  createRewardEarned: () => import_reward_earned.createRewardEarned,
306
307
  derivePortfolioCounts: () => import_portfolio_counts.derivePortfolioCounts,
307
308
  describeError: () => import_describe_error.describeError,
@@ -337,6 +338,8 @@ __export(index_exports, {
337
338
  orderCoins: () => import_coin_order.orderCoins,
338
339
  parsePriceDisplay: () => import_format.parsePriceDisplay,
339
340
  pinAssetMetadata: () => import_ipfs_upload.pinAssetMetadata,
341
+ predictNextMembershipId: () => import_use_tiers.predictNextMembershipId,
342
+ predictNextTicketId: () => import_use_tiers.predictNextTicketId,
340
343
  profileIdentity: () => import_profile_identity.profileIdentity,
341
344
  queryKeyPrefix: () => import_query_keys.queryKeyPrefix,
342
345
  queryKeys: () => import_query_keys.queryKeys,
@@ -359,6 +362,7 @@ __export(index_exports, {
359
362
  usdPriceFor: () => import_use_usd_prices.usdPriceFor,
360
363
  useActivities: () => import_use_activities.useActivities,
361
364
  useActivitiesByAddress: () => import_use_activities.useActivitiesByAddress,
365
+ useCoinPrice: () => import_use_coin_price.useCoinPrice,
362
366
  useCollection: () => import_use_collections.useCollection,
363
367
  useCollectionFilters: () => import_collection_filters.useCollectionFilters,
364
368
  useCollectionFloorListings: () => import_use_orders.useCollectionFloorListings,
@@ -369,25 +373,51 @@ __export(index_exports, {
369
373
  useCounterOffers: () => import_use_orders.useCounterOffers,
370
374
  useCreatorProfile: () => import_use_profiles.useCreatorProfile,
371
375
  useCreators: () => import_use_creators.useCreators,
376
+ useDropCollections: () => import_use_drops.useDropCollections,
377
+ useDropInfo: () => import_use_drops.useDropInfo,
378
+ useDropMintStatus: () => import_use_drops.useDropMintStatus,
372
379
  useFormField: () => import_form.useFormField,
373
380
  useIntersectionActive: () => import_use_intersection_active.useIntersectionActive,
381
+ useIsMemberOf: () => import_use_tiers.useIsMemberOf,
374
382
  useLaunchpadFilter: () => import_launchpad_services.useLaunchpadFilter,
375
383
  useLeaderboard: () => import_use_rewards.useLeaderboard,
376
384
  useMedialaneClient: () => import_use_medialane_client.useMedialaneClient,
385
+ useMembershipList: () => import_use_tiers.useMembershipList,
386
+ useMembershipOnchain: () => import_use_tiers.useMembershipOnchain,
387
+ useMyClubCollections: () => import_use_tiers.useMyClubCollections,
388
+ useMyDrops: () => import_use_drops.useMyDrops,
389
+ useMyPopEvents: () => import_use_pop.useMyPopEvents,
390
+ useMySponsorshipDealCounts: () => import_use_sponsorship.useMySponsorshipDealCounts,
391
+ useMyTicketCollections: () => import_use_tiers.useMyTicketCollections,
377
392
  useNavAccountSheet: () => import_nav_shell.useNavAccountSheet,
378
393
  useNavCommandMenu: () => import_nav_command_menu.useNavCommandMenu,
379
394
  useNearbyCollectionTokens: () => import_use_collections.useNearbyCollectionTokens,
380
395
  useNotifications: () => import_use_notifications.useNotifications,
396
+ useOnChainDropState: () => import_use_drops.useOnChainDropState,
381
397
  useOrder: () => import_use_orders.useOrder,
382
398
  useOrders: () => import_use_orders.useOrders,
399
+ usePendingProposalsForAsset: () => import_use_sponsorship.usePendingProposalsForAsset,
400
+ usePlatformStats: () => import_use_platform_stats.usePlatformStats,
401
+ usePopClaimStatus: () => import_use_pop.usePopClaimStatus,
402
+ usePopCollections: () => import_use_pop.usePopCollections,
403
+ usePriceMap: () => import_use_coin_price.usePriceMap,
383
404
  useReceivedOffers: () => import_use_orders.useReceivedOffers,
384
405
  useRewards: () => import_use_rewards.useRewards,
385
406
  useRewardsBatch: () => import_use_rewards.useRewardsBatch,
386
407
  useRewardsCelebrations: () => import_use_rewards_celebrations.useRewardsCelebrations,
387
408
  useRewardsConfig: () => import_use_rewards.useRewardsConfig,
388
409
  useRewardsEvents: () => import_use_rewards.useRewardsEvents,
410
+ useSponsorshipBids: () => import_use_sponsorship.useSponsorshipBids,
411
+ useSponsorshipLicenses: () => import_use_sponsorship.useSponsorshipLicenses,
412
+ useSponsorshipOffer: () => import_use_sponsorship.useSponsorshipOffer,
413
+ useSponsorshipOffers: () => import_use_sponsorship.useSponsorshipOffers,
414
+ useSponsorshipProposal: () => import_use_sponsorship.useSponsorshipProposal,
415
+ useSponsorshipProposals: () => import_use_sponsorship.useSponsorshipProposals,
416
+ useTicketList: () => import_use_tiers.useTicketList,
417
+ useTicketOnchain: () => import_use_tiers.useTicketOnchain,
389
418
  useTokenListings: () => import_use_orders.useTokenListings,
390
419
  useTokenRemixes: () => import_use_remix_offers.useTokenRemixes,
420
+ useTokensByIpType: () => import_use_tokens_by_ip_type.useTokensByIpType,
391
421
  useUsdPrices: () => import_use_usd_prices.useUsdPrices,
392
422
  useUserOrders: () => import_use_orders.useUserOrders
393
423
  });
@@ -567,6 +597,14 @@ var import_creator_analytics = require("./components/creator-analytics.js");
567
597
  var import_dialog = require("./components/dialog.js");
568
598
  var import_self_fund_consent_dialog = require("./components/wallet/self-fund-consent-dialog.js");
569
599
  var import_export_key_section = require("./components/wallet/export-key-section.js");
600
+ var import_use_drops = require("./utils/use-drops.js");
601
+ var import_use_pop = require("./utils/use-pop.js");
602
+ var import_use_platform_stats = require("./utils/use-platform-stats.js");
603
+ var import_use_tokens_by_ip_type = require("./utils/use-tokens-by-ip-type.js");
604
+ var import_use_coin_price = require("./utils/use-coin-price.js");
605
+ var import_use_sponsorship = require("./utils/use-sponsorship.js");
606
+ var import_use_tiers = require("./utils/use-tiers.js");
607
+ var import_sitemap_data = require("./utils/sitemap-data.js");
570
608
  // Annotate the CommonJS export names for ESM import in node:
571
609
  0 && (module.exports = {
572
610
  ACTIVITY_MESSAGES,
@@ -853,6 +891,7 @@ var import_export_key_section = require("./components/wallet/export-key-section.
853
891
  coinKindLabelPlural,
854
892
  coinServiceIds,
855
893
  coinSupply,
894
+ collectSitemapData,
856
895
  createRewardEarned,
857
896
  derivePortfolioCounts,
858
897
  describeError,
@@ -888,6 +927,8 @@ var import_export_key_section = require("./components/wallet/export-key-section.
888
927
  orderCoins,
889
928
  parsePriceDisplay,
890
929
  pinAssetMetadata,
930
+ predictNextMembershipId,
931
+ predictNextTicketId,
891
932
  profileIdentity,
892
933
  queryKeyPrefix,
893
934
  queryKeys,
@@ -910,6 +951,7 @@ var import_export_key_section = require("./components/wallet/export-key-section.
910
951
  usdPriceFor,
911
952
  useActivities,
912
953
  useActivitiesByAddress,
954
+ useCoinPrice,
913
955
  useCollection,
914
956
  useCollectionFilters,
915
957
  useCollectionFloorListings,
@@ -920,25 +962,51 @@ var import_export_key_section = require("./components/wallet/export-key-section.
920
962
  useCounterOffers,
921
963
  useCreatorProfile,
922
964
  useCreators,
965
+ useDropCollections,
966
+ useDropInfo,
967
+ useDropMintStatus,
923
968
  useFormField,
924
969
  useIntersectionActive,
970
+ useIsMemberOf,
925
971
  useLaunchpadFilter,
926
972
  useLeaderboard,
927
973
  useMedialaneClient,
974
+ useMembershipList,
975
+ useMembershipOnchain,
976
+ useMyClubCollections,
977
+ useMyDrops,
978
+ useMyPopEvents,
979
+ useMySponsorshipDealCounts,
980
+ useMyTicketCollections,
928
981
  useNavAccountSheet,
929
982
  useNavCommandMenu,
930
983
  useNearbyCollectionTokens,
931
984
  useNotifications,
985
+ useOnChainDropState,
932
986
  useOrder,
933
987
  useOrders,
988
+ usePendingProposalsForAsset,
989
+ usePlatformStats,
990
+ usePopClaimStatus,
991
+ usePopCollections,
992
+ usePriceMap,
934
993
  useReceivedOffers,
935
994
  useRewards,
936
995
  useRewardsBatch,
937
996
  useRewardsCelebrations,
938
997
  useRewardsConfig,
939
998
  useRewardsEvents,
999
+ useSponsorshipBids,
1000
+ useSponsorshipLicenses,
1001
+ useSponsorshipOffer,
1002
+ useSponsorshipOffers,
1003
+ useSponsorshipProposal,
1004
+ useSponsorshipProposals,
1005
+ useTicketList,
1006
+ useTicketOnchain,
940
1007
  useTokenListings,
941
1008
  useTokenRemixes,
1009
+ useTokensByIpType,
942
1010
  useUsdPrices,
943
1011
  useUserOrders
944
1012
  });