@medialane/ui 0.256.0 → 0.258.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.
- package/dist/components/account/add-guardian-dialog.cjs +1 -1
- package/dist/components/account/add-guardian-dialog.cjs.map +1 -1
- package/dist/components/account/add-guardian-dialog.js +1 -1
- package/dist/components/account/add-guardian-dialog.js.map +1 -1
- package/dist/components/account/device-approval-dialog.cjs +2 -2
- package/dist/components/account/device-approval-dialog.cjs.map +1 -1
- package/dist/components/account/device-approval-dialog.js +2 -2
- package/dist/components/account/device-approval-dialog.js.map +1 -1
- package/dist/components/account/devices-section.cjs +1 -1
- package/dist/components/account/devices-section.cjs.map +1 -1
- package/dist/components/account/devices-section.js +1 -1
- package/dist/components/account/devices-section.js.map +1 -1
- package/dist/components/account/guardian-recovery-section.cjs +1 -1
- package/dist/components/account/guardian-recovery-section.cjs.map +1 -1
- package/dist/components/account/guardian-recovery-section.js +1 -1
- package/dist/components/account/guardian-recovery-section.js.map +1 -1
- package/dist/components/account/input-otp.d.cts +2 -2
- package/dist/components/account/input-otp.d.ts +2 -2
- package/dist/components/asset-page.cjs +8 -7
- package/dist/components/asset-page.cjs.map +1 -1
- package/dist/components/asset-page.js +8 -7
- package/dist/components/asset-page.js.map +1 -1
- package/dist/components/asset-publication.cjs +1 -3
- package/dist/components/asset-publication.cjs.map +1 -1
- package/dist/components/asset-publication.js +1 -3
- package/dist/components/asset-publication.js.map +1 -1
- package/dist/components/button.d.cts +2 -2
- package/dist/components/button.d.ts +2 -2
- package/dist/components/drop/create/launch-dialog.cjs +1 -1
- package/dist/components/drop/create/launch-dialog.cjs.map +1 -1
- package/dist/components/drop/create/launch-dialog.js +1 -1
- package/dist/components/drop/create/launch-dialog.js.map +1 -1
- package/dist/components/drop/page/drop-manage.cjs +1 -1
- package/dist/components/drop/page/drop-manage.cjs.map +1 -1
- package/dist/components/drop/page/drop-manage.js +1 -1
- package/dist/components/drop/page/drop-manage.js.map +1 -1
- package/dist/components/drop/page/drop-mint-dialog.cjs +1 -1
- package/dist/components/drop/page/drop-mint-dialog.cjs.map +1 -1
- package/dist/components/drop/page/drop-mint-dialog.js +1 -1
- package/dist/components/drop/page/drop-mint-dialog.js.map +1 -1
- package/dist/components/empty-or-error.cjs +2 -2
- package/dist/components/empty-or-error.cjs.map +1 -1
- package/dist/components/empty-or-error.js +2 -2
- package/dist/components/empty-or-error.js.map +1 -1
- package/dist/components/fast-mint/fast-mint.cjs +2 -1
- package/dist/components/fast-mint/fast-mint.cjs.map +1 -1
- package/dist/components/fast-mint/fast-mint.d.cts +2 -2
- package/dist/components/fast-mint/fast-mint.d.ts +2 -2
- package/dist/components/fast-mint/fast-mint.js +2 -1
- package/dist/components/fast-mint/fast-mint.js.map +1 -1
- package/dist/components/launchpad/edition-mint-schema.d.cts +2 -2
- package/dist/components/launchpad/edition-mint-schema.d.ts +2 -2
- package/dist/components/license-request-page.cjs +1 -1
- package/dist/components/license-request-page.cjs.map +1 -1
- package/dist/components/license-request-page.js +1 -1
- package/dist/components/license-request-page.js.map +1 -1
- package/dist/components/media-wallet/activate-card.cjs +1 -1
- package/dist/components/media-wallet/activate-card.cjs.map +1 -1
- package/dist/components/media-wallet/activate-card.js +1 -1
- package/dist/components/media-wallet/activate-card.js.map +1 -1
- package/dist/components/media-wallet/media-wallet-activity.cjs +1 -1
- package/dist/components/media-wallet/media-wallet-activity.cjs.map +1 -1
- package/dist/components/media-wallet/media-wallet-activity.js +1 -1
- package/dist/components/media-wallet/media-wallet-activity.js.map +1 -1
- package/dist/components/media-wallet/media-wallet-send.cjs +2 -6
- package/dist/components/media-wallet/media-wallet-send.cjs.map +1 -1
- package/dist/components/media-wallet/media-wallet-send.js +2 -6
- package/dist/components/media-wallet/media-wallet-send.js.map +1 -1
- package/dist/components/sheet.d.cts +1 -1
- package/dist/components/sheet.d.ts +1 -1
- package/dist/components/transaction-dialog.cjs +4 -4
- package/dist/components/transaction-dialog.cjs.map +1 -1
- package/dist/components/transaction-dialog.d.cts +3 -1
- package/dist/components/transaction-dialog.d.ts +3 -1
- package/dist/components/transaction-dialog.js +4 -4
- package/dist/components/transaction-dialog.js.map +1 -1
- package/dist/components/wallet/export-key-section.cjs +3 -3
- package/dist/components/wallet/export-key-section.cjs.map +1 -1
- package/dist/components/wallet/export-key-section.d.cts +1 -2
- package/dist/components/wallet/export-key-section.d.ts +1 -2
- package/dist/components/wallet/export-key-section.js +3 -3
- package/dist/components/wallet/export-key-section.js.map +1 -1
- package/dist/index.cjs +0 -2
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +0 -2
- package/dist/index.js.map +1 -1
- package/dist/utils/describe-error.cjs +16 -11
- package/dist/utils/describe-error.cjs.map +1 -1
- package/dist/utils/describe-error.d.cts +4 -4
- package/dist/utils/describe-error.d.ts +4 -4
- package/dist/utils/describe-error.js +16 -10
- package/dist/utils/describe-error.js.map +1 -1
- package/dist/utils/media-wallet/use-erc20-balance.d.cts +1 -1
- package/dist/utils/media-wallet/use-erc20-balance.d.ts +1 -1
- package/dist/utils/use-email-code.cjs +2 -2
- package/dist/utils/use-email-code.cjs.map +1 -1
- package/dist/utils/use-email-code.js +2 -2
- package/dist/utils/use-email-code.js.map +1 -1
- package/dist/utils/use-transaction.cjs +16 -2
- package/dist/utils/use-transaction.cjs.map +1 -1
- package/dist/utils/use-transaction.d.cts +1 -0
- package/dist/utils/use-transaction.d.ts +1 -0
- package/dist/utils/use-transaction.js +17 -3
- package/dist/utils/use-transaction.js.map +1 -1
- package/package.json +3 -3
|
@@ -48,7 +48,7 @@ function AddGuardianDialog({ open, onOpenChange, sealed, onAdded, wallet }) {
|
|
|
48
48
|
setPubkey("");
|
|
49
49
|
onAdded();
|
|
50
50
|
} catch (e) {
|
|
51
|
-
setError((0, import_describe_error.describeError)(e
|
|
51
|
+
setError((0, import_describe_error.describeError)(e).message);
|
|
52
52
|
} finally {
|
|
53
53
|
setBusy(false);
|
|
54
54
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/components/account/add-guardian-dialog.tsx"],"sourcesContent":["\"use client\";\n\nimport { useState } from \"react\";\nimport { Shield, Loader2 } from \"lucide-react\";\nimport { isValidStarknetAddress, type SealedOwner } from \"@medialane/sdk/starknet\";\nimport { Button } from \"../button.js\";\nimport { Input } from \"../input.js\";\nimport { Dialog, DialogContent, DialogHeader, DialogTitle, DialogDescription } from \"../dialog.js\";\nimport { describeError } from \"../../utils/describe-error.js\";\nimport type { GuardianWallet } from \"./wallet-types.js\";\n\nexport interface AddGuardianDialogProps {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n sealed: SealedOwner;\n onAdded: () => void;\n wallet: Pick<GuardianWallet, \"setFirstGuardian\">;\n}\n\nexport function AddGuardianDialog({ open, onOpenChange, sealed, onAdded, wallet }: AddGuardianDialogProps) {\n const [pubkey, setPubkey] = useState(\"\");\n const [busy, setBusy] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n const handleAdd = async () => {\n const trimmed = pubkey.trim();\n if (!isValidStarknetAddress(trimmed)) {\n setError(\"Enter a valid Stark-curve public key.\");\n return;\n }\n setBusy(true);\n setError(null);\n try {\n await wallet.setFirstGuardian(sealed, trimmed);\n onOpenChange(false);\n setPubkey(\"\");\n onAdded();\n } catch (e) {\n setError(describeError(e
|
|
1
|
+
{"version":3,"sources":["../../../src/components/account/add-guardian-dialog.tsx"],"sourcesContent":["\"use client\";\n\nimport { useState } from \"react\";\nimport { Shield, Loader2 } from \"lucide-react\";\nimport { isValidStarknetAddress, type SealedOwner } from \"@medialane/sdk/starknet\";\nimport { Button } from \"../button.js\";\nimport { Input } from \"../input.js\";\nimport { Dialog, DialogContent, DialogHeader, DialogTitle, DialogDescription } from \"../dialog.js\";\nimport { describeError } from \"../../utils/describe-error.js\";\nimport type { GuardianWallet } from \"./wallet-types.js\";\n\nexport interface AddGuardianDialogProps {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n sealed: SealedOwner;\n onAdded: () => void;\n wallet: Pick<GuardianWallet, \"setFirstGuardian\">;\n}\n\nexport function AddGuardianDialog({ open, onOpenChange, sealed, onAdded, wallet }: AddGuardianDialogProps) {\n const [pubkey, setPubkey] = useState(\"\");\n const [busy, setBusy] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n const handleAdd = async () => {\n const trimmed = pubkey.trim();\n if (!isValidStarknetAddress(trimmed)) {\n setError(\"Enter a valid Stark-curve public key.\");\n return;\n }\n setBusy(true);\n setError(null);\n try {\n await wallet.setFirstGuardian(sealed, trimmed);\n onOpenChange(false);\n setPubkey(\"\");\n onAdded();\n } catch (e) {\n setError(describeError(e).message);\n } finally {\n setBusy(false);\n }\n };\n\n return (\n <Dialog open={open} onOpenChange={(next) => { if (!busy) onOpenChange(next); }}>\n <DialogContent className=\"sm:max-w-sm\">\n <DialogHeader>\n <DialogTitle className=\"flex items-center gap-2\">\n <Shield className=\"h-4 w-4\" /> Add a guardian\n </DialogTitle>\n <DialogDescription>\n A guardian can help you recover this wallet if you lose this device, but can\n never move your funds. Paste the public key of a wallet you control — another\n device's Media Wallet, for example. You can only set this up once from here;\n changing it later isn't supported in this app yet.\n </DialogDescription>\n </DialogHeader>\n <div className=\"space-y-3\">\n <Input\n value={pubkey}\n onChange={(e) => setPubkey(e.target.value)}\n placeholder=\"0x…\"\n disabled={busy}\n className=\"font-mono text-xs\"\n onKeyDown={(e) => e.key === \"Enter\" && pubkey.trim() && void handleAdd()}\n />\n {error && <p className=\"text-sm text-destructive\">{error}</p>}\n <Button onClick={handleAdd} disabled={busy || !pubkey.trim()} className=\"w-full\">\n {busy ? <Loader2 className=\"mr-1.5 h-3.5 w-3.5 animate-spin\" /> : null}\n {busy ? \"Confirm with passkey…\" : \"Add guardian\"}\n </Button>\n </div>\n </DialogContent>\n </Dialog>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAgDU;AA9CV,mBAAyB;AACzB,0BAAgC;AAChC,sBAAyD;AACzD,oBAAuB;AACvB,mBAAsB;AACtB,oBAAoF;AACpF,4BAA8B;AAWvB,SAAS,kBAAkB,EAAE,MAAM,cAAc,QAAQ,SAAS,OAAO,GAA2B;AACzG,QAAM,CAAC,QAAQ,SAAS,QAAI,uBAAS,EAAE;AACvC,QAAM,CAAC,MAAM,OAAO,QAAI,uBAAS,KAAK;AACtC,QAAM,CAAC,OAAO,QAAQ,QAAI,uBAAwB,IAAI;AAEtD,QAAM,YAAY,YAAY;AAC5B,UAAM,UAAU,OAAO,KAAK;AAC5B,QAAI,KAAC,wCAAuB,OAAO,GAAG;AACpC,eAAS,uCAAuC;AAChD;AAAA,IACF;AACA,YAAQ,IAAI;AACZ,aAAS,IAAI;AACb,QAAI;AACF,YAAM,OAAO,iBAAiB,QAAQ,OAAO;AAC7C,mBAAa,KAAK;AAClB,gBAAU,EAAE;AACZ,cAAQ;AAAA,IACV,SAAS,GAAG;AACV,mBAAS,qCAAc,CAAC,EAAE,OAAO;AAAA,IACnC,UAAE;AACA,cAAQ,KAAK;AAAA,IACf;AAAA,EACF;AAEA,SACE,4CAAC,wBAAO,MAAY,cAAc,CAAC,SAAS;AAAE,QAAI,CAAC,KAAM,cAAa,IAAI;AAAA,EAAG,GAC3E,uDAAC,+BAAc,WAAU,eACvB;AAAA,iDAAC,8BACC;AAAA,mDAAC,6BAAY,WAAU,2BACrB;AAAA,oDAAC,8BAAO,WAAU,WAAU;AAAA,QAAE;AAAA,SAChC;AAAA,MACA,4CAAC,mCAAkB,6SAKnB;AAAA,OACF;AAAA,IACA,6CAAC,SAAI,WAAU,aACb;AAAA;AAAA,QAAC;AAAA;AAAA,UACC,OAAO;AAAA,UACP,UAAU,CAAC,MAAM,UAAU,EAAE,OAAO,KAAK;AAAA,UACzC,aAAY;AAAA,UACZ,UAAU;AAAA,UACV,WAAU;AAAA,UACV,WAAW,CAAC,MAAM,EAAE,QAAQ,WAAW,OAAO,KAAK,KAAK,KAAK,UAAU;AAAA;AAAA,MACzE;AAAA,MACC,SAAS,4CAAC,OAAE,WAAU,4BAA4B,iBAAM;AAAA,MACzD,6CAAC,wBAAO,SAAS,WAAW,UAAU,QAAQ,CAAC,OAAO,KAAK,GAAG,WAAU,UACrE;AAAA,eAAO,4CAAC,+BAAQ,WAAU,mCAAkC,IAAK;AAAA,QACjE,OAAO,+BAA0B;AAAA,SACpC;AAAA,OACF;AAAA,KACF,GACF;AAEJ;","names":[]}
|
|
@@ -25,7 +25,7 @@ function AddGuardianDialog({ open, onOpenChange, sealed, onAdded, wallet }) {
|
|
|
25
25
|
setPubkey("");
|
|
26
26
|
onAdded();
|
|
27
27
|
} catch (e) {
|
|
28
|
-
setError(describeError(e
|
|
28
|
+
setError(describeError(e).message);
|
|
29
29
|
} finally {
|
|
30
30
|
setBusy(false);
|
|
31
31
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/components/account/add-guardian-dialog.tsx"],"sourcesContent":["\"use client\";\n\nimport { useState } from \"react\";\nimport { Shield, Loader2 } from \"lucide-react\";\nimport { isValidStarknetAddress, type SealedOwner } from \"@medialane/sdk/starknet\";\nimport { Button } from \"../button.js\";\nimport { Input } from \"../input.js\";\nimport { Dialog, DialogContent, DialogHeader, DialogTitle, DialogDescription } from \"../dialog.js\";\nimport { describeError } from \"../../utils/describe-error.js\";\nimport type { GuardianWallet } from \"./wallet-types.js\";\n\nexport interface AddGuardianDialogProps {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n sealed: SealedOwner;\n onAdded: () => void;\n wallet: Pick<GuardianWallet, \"setFirstGuardian\">;\n}\n\nexport function AddGuardianDialog({ open, onOpenChange, sealed, onAdded, wallet }: AddGuardianDialogProps) {\n const [pubkey, setPubkey] = useState(\"\");\n const [busy, setBusy] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n const handleAdd = async () => {\n const trimmed = pubkey.trim();\n if (!isValidStarknetAddress(trimmed)) {\n setError(\"Enter a valid Stark-curve public key.\");\n return;\n }\n setBusy(true);\n setError(null);\n try {\n await wallet.setFirstGuardian(sealed, trimmed);\n onOpenChange(false);\n setPubkey(\"\");\n onAdded();\n } catch (e) {\n setError(describeError(e
|
|
1
|
+
{"version":3,"sources":["../../../src/components/account/add-guardian-dialog.tsx"],"sourcesContent":["\"use client\";\n\nimport { useState } from \"react\";\nimport { Shield, Loader2 } from \"lucide-react\";\nimport { isValidStarknetAddress, type SealedOwner } from \"@medialane/sdk/starknet\";\nimport { Button } from \"../button.js\";\nimport { Input } from \"../input.js\";\nimport { Dialog, DialogContent, DialogHeader, DialogTitle, DialogDescription } from \"../dialog.js\";\nimport { describeError } from \"../../utils/describe-error.js\";\nimport type { GuardianWallet } from \"./wallet-types.js\";\n\nexport interface AddGuardianDialogProps {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n sealed: SealedOwner;\n onAdded: () => void;\n wallet: Pick<GuardianWallet, \"setFirstGuardian\">;\n}\n\nexport function AddGuardianDialog({ open, onOpenChange, sealed, onAdded, wallet }: AddGuardianDialogProps) {\n const [pubkey, setPubkey] = useState(\"\");\n const [busy, setBusy] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n const handleAdd = async () => {\n const trimmed = pubkey.trim();\n if (!isValidStarknetAddress(trimmed)) {\n setError(\"Enter a valid Stark-curve public key.\");\n return;\n }\n setBusy(true);\n setError(null);\n try {\n await wallet.setFirstGuardian(sealed, trimmed);\n onOpenChange(false);\n setPubkey(\"\");\n onAdded();\n } catch (e) {\n setError(describeError(e).message);\n } finally {\n setBusy(false);\n }\n };\n\n return (\n <Dialog open={open} onOpenChange={(next) => { if (!busy) onOpenChange(next); }}>\n <DialogContent className=\"sm:max-w-sm\">\n <DialogHeader>\n <DialogTitle className=\"flex items-center gap-2\">\n <Shield className=\"h-4 w-4\" /> Add a guardian\n </DialogTitle>\n <DialogDescription>\n A guardian can help you recover this wallet if you lose this device, but can\n never move your funds. Paste the public key of a wallet you control — another\n device's Media Wallet, for example. You can only set this up once from here;\n changing it later isn't supported in this app yet.\n </DialogDescription>\n </DialogHeader>\n <div className=\"space-y-3\">\n <Input\n value={pubkey}\n onChange={(e) => setPubkey(e.target.value)}\n placeholder=\"0x…\"\n disabled={busy}\n className=\"font-mono text-xs\"\n onKeyDown={(e) => e.key === \"Enter\" && pubkey.trim() && void handleAdd()}\n />\n {error && <p className=\"text-sm text-destructive\">{error}</p>}\n <Button onClick={handleAdd} disabled={busy || !pubkey.trim()} className=\"w-full\">\n {busy ? <Loader2 className=\"mr-1.5 h-3.5 w-3.5 animate-spin\" /> : null}\n {busy ? \"Confirm with passkey…\" : \"Add guardian\"}\n </Button>\n </div>\n </DialogContent>\n </Dialog>\n );\n}\n"],"mappings":";AAgDU,SACE,KADF;AA9CV,SAAS,gBAAgB;AACzB,SAAS,QAAQ,eAAe;AAChC,SAAS,8BAAgD;AACzD,SAAS,cAAc;AACvB,SAAS,aAAa;AACtB,SAAS,QAAQ,eAAe,cAAc,aAAa,yBAAyB;AACpF,SAAS,qBAAqB;AAWvB,SAAS,kBAAkB,EAAE,MAAM,cAAc,QAAQ,SAAS,OAAO,GAA2B;AACzG,QAAM,CAAC,QAAQ,SAAS,IAAI,SAAS,EAAE;AACvC,QAAM,CAAC,MAAM,OAAO,IAAI,SAAS,KAAK;AACtC,QAAM,CAAC,OAAO,QAAQ,IAAI,SAAwB,IAAI;AAEtD,QAAM,YAAY,YAAY;AAC5B,UAAM,UAAU,OAAO,KAAK;AAC5B,QAAI,CAAC,uBAAuB,OAAO,GAAG;AACpC,eAAS,uCAAuC;AAChD;AAAA,IACF;AACA,YAAQ,IAAI;AACZ,aAAS,IAAI;AACb,QAAI;AACF,YAAM,OAAO,iBAAiB,QAAQ,OAAO;AAC7C,mBAAa,KAAK;AAClB,gBAAU,EAAE;AACZ,cAAQ;AAAA,IACV,SAAS,GAAG;AACV,eAAS,cAAc,CAAC,EAAE,OAAO;AAAA,IACnC,UAAE;AACA,cAAQ,KAAK;AAAA,IACf;AAAA,EACF;AAEA,SACE,oBAAC,UAAO,MAAY,cAAc,CAAC,SAAS;AAAE,QAAI,CAAC,KAAM,cAAa,IAAI;AAAA,EAAG,GAC3E,+BAAC,iBAAc,WAAU,eACvB;AAAA,yBAAC,gBACC;AAAA,2BAAC,eAAY,WAAU,2BACrB;AAAA,4BAAC,UAAO,WAAU,WAAU;AAAA,QAAE;AAAA,SAChC;AAAA,MACA,oBAAC,qBAAkB,6SAKnB;AAAA,OACF;AAAA,IACA,qBAAC,SAAI,WAAU,aACb;AAAA;AAAA,QAAC;AAAA;AAAA,UACC,OAAO;AAAA,UACP,UAAU,CAAC,MAAM,UAAU,EAAE,OAAO,KAAK;AAAA,UACzC,aAAY;AAAA,UACZ,UAAU;AAAA,UACV,WAAU;AAAA,UACV,WAAW,CAAC,MAAM,EAAE,QAAQ,WAAW,OAAO,KAAK,KAAK,KAAK,UAAU;AAAA;AAAA,MACzE;AAAA,MACC,SAAS,oBAAC,OAAE,WAAU,4BAA4B,iBAAM;AAAA,MACzD,qBAAC,UAAO,SAAS,WAAW,UAAU,QAAQ,CAAC,OAAO,KAAK,GAAG,WAAU,UACrE;AAAA,eAAO,oBAAC,WAAQ,WAAU,mCAAkC,IAAK;AAAA,QACjE,OAAO,+BAA0B;AAAA,SACpC;AAAA,OACF;AAAA,KACF,GACF;AAEJ;","names":[]}
|
|
@@ -46,7 +46,7 @@ function DeviceApprovalDialog({ open, onOpenChange, onApproved, wallet, loadSeal
|
|
|
46
46
|
try {
|
|
47
47
|
setPending((0, import_starknet.parsePairingPayload)(raw.trim()));
|
|
48
48
|
} catch (e) {
|
|
49
|
-
setError((0, import_describe_error.describeError)(e
|
|
49
|
+
setError((0, import_describe_error.describeError)(e).message);
|
|
50
50
|
}
|
|
51
51
|
};
|
|
52
52
|
const approve = async () => {
|
|
@@ -60,7 +60,7 @@ function DeviceApprovalDialog({ open, onOpenChange, onApproved, wallet, loadSeal
|
|
|
60
60
|
onOpenChange(false);
|
|
61
61
|
onApproved();
|
|
62
62
|
} catch (e) {
|
|
63
|
-
setError((0, import_describe_error.describeError)(e
|
|
63
|
+
setError((0, import_describe_error.describeError)(e).message);
|
|
64
64
|
} finally {
|
|
65
65
|
setBusy(false);
|
|
66
66
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/components/account/device-approval-dialog.tsx"],"sourcesContent":["\"use client\";\n\nimport { useState } from \"react\";\nimport { Loader2, Smartphone, TriangleAlert } from \"lucide-react\";\nimport { parsePairingPayload, type PairingPayload } from \"@medialane/sdk/starknet\";\nimport { Button } from \"../button.js\";\nimport { Textarea } from \"../textarea.js\";\nimport { Alert, AlertDescription } from \"../alert.js\";\nimport { Dialog, DialogContent, DialogDescription, DialogHeader, DialogTitle } from \"../dialog.js\";\nimport { describeError } from \"../../utils/describe-error.js\";\nimport type { DeviceWallet, LoadSealedOwner } from \"./wallet-types.js\";\n\nexport interface DeviceApprovalDialogProps {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n onApproved: () => void;\n wallet: Pick<DeviceWallet, \"addDevice\">;\n loadSealed: LoadSealedOwner;\n}\n\nexport function DeviceApprovalDialog({ open, onOpenChange, onApproved, wallet, loadSealed }: DeviceApprovalDialogProps) {\n const [raw, setRaw] = useState(\"\");\n const [pending, setPending] = useState<PairingPayload | null>(null);\n const [busy, setBusy] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n const reset = () => {\n setRaw(\"\");\n setPending(null);\n setError(null);\n };\n\n const review = () => {\n setError(null);\n try {\n setPending(parsePairingPayload(raw.trim()));\n } catch (e) {\n setError(describeError(e
|
|
1
|
+
{"version":3,"sources":["../../../src/components/account/device-approval-dialog.tsx"],"sourcesContent":["\"use client\";\n\nimport { useState } from \"react\";\nimport { Loader2, Smartphone, TriangleAlert } from \"lucide-react\";\nimport { parsePairingPayload, type PairingPayload } from \"@medialane/sdk/starknet\";\nimport { Button } from \"../button.js\";\nimport { Textarea } from \"../textarea.js\";\nimport { Alert, AlertDescription } from \"../alert.js\";\nimport { Dialog, DialogContent, DialogDescription, DialogHeader, DialogTitle } from \"../dialog.js\";\nimport { describeError } from \"../../utils/describe-error.js\";\nimport type { DeviceWallet, LoadSealedOwner } from \"./wallet-types.js\";\n\nexport interface DeviceApprovalDialogProps {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n onApproved: () => void;\n wallet: Pick<DeviceWallet, \"addDevice\">;\n loadSealed: LoadSealedOwner;\n}\n\nexport function DeviceApprovalDialog({ open, onOpenChange, onApproved, wallet, loadSealed }: DeviceApprovalDialogProps) {\n const [raw, setRaw] = useState(\"\");\n const [pending, setPending] = useState<PairingPayload | null>(null);\n const [busy, setBusy] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n const reset = () => {\n setRaw(\"\");\n setPending(null);\n setError(null);\n };\n\n const review = () => {\n setError(null);\n try {\n setPending(parsePairingPayload(raw.trim()));\n } catch (e) {\n setError(describeError(e).message);\n }\n };\n\n const approve = async () => {\n const sealed = loadSealed();\n if (!sealed || !pending) return;\n setBusy(true);\n setError(null);\n try {\n await wallet.addDevice(sealed, pending.publicKey);\n reset();\n onOpenChange(false);\n onApproved();\n } catch (e) {\n setError(describeError(e).message);\n } finally {\n setBusy(false);\n }\n };\n\n return (\n <Dialog\n open={open}\n onOpenChange={(next) => {\n if (!next) reset();\n onOpenChange(next);\n }}\n >\n <DialogContent>\n <DialogHeader>\n <DialogTitle>Add a device</DialogTitle>\n <DialogDescription>\n On the new device, sign in and choose “Add this device”. Paste the code it\n shows you here.\n </DialogDescription>\n </DialogHeader>\n\n {pending ? (\n <div className=\"space-y-4\">\n <Alert>\n <TriangleAlert className=\"h-4 w-4\" />\n <AlertDescription>\n This gives the device full control of your account and everything in it. Only\n continue if you are holding it yourself.\n </AlertDescription>\n </Alert>\n\n <div className=\"rounded-xl bg-muted/50 p-4 space-y-2\">\n <div className=\"flex items-center gap-2\">\n <Smartphone className=\"h-4 w-4 text-muted-foreground\" />\n <span className=\"font-medium\">{pending.label || \"Unnamed device\"}</span>\n </div>\n <p className=\"break-all font-mono text-xs text-muted-foreground\">\n {pending.publicKey}\n </p>\n </div>\n\n {error ? <p className=\"text-sm text-destructive\">{error}</p> : null}\n\n <div className=\"flex gap-2\">\n <Button variant=\"outline\" className=\"flex-1\" onClick={reset} disabled={busy}>\n Back\n </Button>\n <Button className=\"flex-1\" onClick={approve} disabled={busy}>\n {busy ? <Loader2 className=\"h-4 w-4 animate-spin\" /> : \"Approve device\"}\n </Button>\n </div>\n </div>\n ) : (\n <div className=\"space-y-4\">\n <Textarea\n value={raw}\n onChange={(e) => setRaw(e.target.value)}\n placeholder=\"Paste the code from your other device\"\n rows={4}\n className=\"font-mono text-xs\"\n />\n {error ? <p className=\"text-sm text-destructive\">{error}</p> : null}\n <Button className=\"w-full\" onClick={review} disabled={!raw.trim()}>\n Review device\n </Button>\n </div>\n )}\n </DialogContent>\n </Dialog>\n );\n}\n"],"mappings":"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","names":[]}
|
|
@@ -23,7 +23,7 @@ function DeviceApprovalDialog({ open, onOpenChange, onApproved, wallet, loadSeal
|
|
|
23
23
|
try {
|
|
24
24
|
setPending(parsePairingPayload(raw.trim()));
|
|
25
25
|
} catch (e) {
|
|
26
|
-
setError(describeError(e
|
|
26
|
+
setError(describeError(e).message);
|
|
27
27
|
}
|
|
28
28
|
};
|
|
29
29
|
const approve = async () => {
|
|
@@ -37,7 +37,7 @@ function DeviceApprovalDialog({ open, onOpenChange, onApproved, wallet, loadSeal
|
|
|
37
37
|
onOpenChange(false);
|
|
38
38
|
onApproved();
|
|
39
39
|
} catch (e) {
|
|
40
|
-
setError(describeError(e
|
|
40
|
+
setError(describeError(e).message);
|
|
41
41
|
} finally {
|
|
42
42
|
setBusy(false);
|
|
43
43
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/components/account/device-approval-dialog.tsx"],"sourcesContent":["\"use client\";\n\nimport { useState } from \"react\";\nimport { Loader2, Smartphone, TriangleAlert } from \"lucide-react\";\nimport { parsePairingPayload, type PairingPayload } from \"@medialane/sdk/starknet\";\nimport { Button } from \"../button.js\";\nimport { Textarea } from \"../textarea.js\";\nimport { Alert, AlertDescription } from \"../alert.js\";\nimport { Dialog, DialogContent, DialogDescription, DialogHeader, DialogTitle } from \"../dialog.js\";\nimport { describeError } from \"../../utils/describe-error.js\";\nimport type { DeviceWallet, LoadSealedOwner } from \"./wallet-types.js\";\n\nexport interface DeviceApprovalDialogProps {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n onApproved: () => void;\n wallet: Pick<DeviceWallet, \"addDevice\">;\n loadSealed: LoadSealedOwner;\n}\n\nexport function DeviceApprovalDialog({ open, onOpenChange, onApproved, wallet, loadSealed }: DeviceApprovalDialogProps) {\n const [raw, setRaw] = useState(\"\");\n const [pending, setPending] = useState<PairingPayload | null>(null);\n const [busy, setBusy] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n const reset = () => {\n setRaw(\"\");\n setPending(null);\n setError(null);\n };\n\n const review = () => {\n setError(null);\n try {\n setPending(parsePairingPayload(raw.trim()));\n } catch (e) {\n setError(describeError(e
|
|
1
|
+
{"version":3,"sources":["../../../src/components/account/device-approval-dialog.tsx"],"sourcesContent":["\"use client\";\n\nimport { useState } from \"react\";\nimport { Loader2, Smartphone, TriangleAlert } from \"lucide-react\";\nimport { parsePairingPayload, type PairingPayload } from \"@medialane/sdk/starknet\";\nimport { Button } from \"../button.js\";\nimport { Textarea } from \"../textarea.js\";\nimport { Alert, AlertDescription } from \"../alert.js\";\nimport { Dialog, DialogContent, DialogDescription, DialogHeader, DialogTitle } from \"../dialog.js\";\nimport { describeError } from \"../../utils/describe-error.js\";\nimport type { DeviceWallet, LoadSealedOwner } from \"./wallet-types.js\";\n\nexport interface DeviceApprovalDialogProps {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n onApproved: () => void;\n wallet: Pick<DeviceWallet, \"addDevice\">;\n loadSealed: LoadSealedOwner;\n}\n\nexport function DeviceApprovalDialog({ open, onOpenChange, onApproved, wallet, loadSealed }: DeviceApprovalDialogProps) {\n const [raw, setRaw] = useState(\"\");\n const [pending, setPending] = useState<PairingPayload | null>(null);\n const [busy, setBusy] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n const reset = () => {\n setRaw(\"\");\n setPending(null);\n setError(null);\n };\n\n const review = () => {\n setError(null);\n try {\n setPending(parsePairingPayload(raw.trim()));\n } catch (e) {\n setError(describeError(e).message);\n }\n };\n\n const approve = async () => {\n const sealed = loadSealed();\n if (!sealed || !pending) return;\n setBusy(true);\n setError(null);\n try {\n await wallet.addDevice(sealed, pending.publicKey);\n reset();\n onOpenChange(false);\n onApproved();\n } catch (e) {\n setError(describeError(e).message);\n } finally {\n setBusy(false);\n }\n };\n\n return (\n <Dialog\n open={open}\n onOpenChange={(next) => {\n if (!next) reset();\n onOpenChange(next);\n }}\n >\n <DialogContent>\n <DialogHeader>\n <DialogTitle>Add a device</DialogTitle>\n <DialogDescription>\n On the new device, sign in and choose “Add this device”. Paste the code it\n shows you here.\n </DialogDescription>\n </DialogHeader>\n\n {pending ? (\n <div className=\"space-y-4\">\n <Alert>\n <TriangleAlert className=\"h-4 w-4\" />\n <AlertDescription>\n This gives the device full control of your account and everything in it. Only\n continue if you are holding it yourself.\n </AlertDescription>\n </Alert>\n\n <div className=\"rounded-xl bg-muted/50 p-4 space-y-2\">\n <div className=\"flex items-center gap-2\">\n <Smartphone className=\"h-4 w-4 text-muted-foreground\" />\n <span className=\"font-medium\">{pending.label || \"Unnamed device\"}</span>\n </div>\n <p className=\"break-all font-mono text-xs text-muted-foreground\">\n {pending.publicKey}\n </p>\n </div>\n\n {error ? <p className=\"text-sm text-destructive\">{error}</p> : null}\n\n <div className=\"flex gap-2\">\n <Button variant=\"outline\" className=\"flex-1\" onClick={reset} disabled={busy}>\n Back\n </Button>\n <Button className=\"flex-1\" onClick={approve} disabled={busy}>\n {busy ? <Loader2 className=\"h-4 w-4 animate-spin\" /> : \"Approve device\"}\n </Button>\n </div>\n </div>\n ) : (\n <div className=\"space-y-4\">\n <Textarea\n value={raw}\n onChange={(e) => setRaw(e.target.value)}\n placeholder=\"Paste the code from your other device\"\n rows={4}\n className=\"font-mono text-xs\"\n />\n {error ? <p className=\"text-sm text-destructive\">{error}</p> : null}\n <Button className=\"w-full\" onClick={review} disabled={!raw.trim()}>\n Review device\n </Button>\n </div>\n )}\n </DialogContent>\n </Dialog>\n );\n}\n"],"mappings":"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","names":[]}
|
|
@@ -57,7 +57,7 @@ function DevicesSection({ walletAddress, wallet, loadSealed }) {
|
|
|
57
57
|
await wallet.removeDevice(sealed, device.guid);
|
|
58
58
|
refresh();
|
|
59
59
|
} catch (e) {
|
|
60
|
-
setError((0, import_describe_error.describeError)(e
|
|
60
|
+
setError((0, import_describe_error.describeError)(e).message);
|
|
61
61
|
} finally {
|
|
62
62
|
setBusyGuid(null);
|
|
63
63
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/components/account/devices-section.tsx"],"sourcesContent":["\"use client\";\n\nimport { useCallback, useEffect, useState } from \"react\";\nimport { Loader2, Monitor, Plus } from \"lucide-react\";\nimport { canRemoveDevice, describeDevices, type DeviceEntry } from \"@medialane/sdk/starknet\";\nimport { Button } from \"../button.js\";\nimport { Badge } from \"../badge.js\";\nimport { describeError } from \"../../utils/describe-error.js\";\nimport { DeviceApprovalDialog } from \"./device-approval-dialog.js\";\nimport type { DeviceWallet, LoadSealedOwner } from \"./wallet-types.js\";\n\nconst short = (v: string) => `${v.slice(0, 10)}…${v.slice(-6)}`;\n\nexport interface DevicesSectionProps {\n walletAddress: string;\n wallet: DeviceWallet;\n loadSealed: LoadSealedOwner;\n}\n\nexport function DevicesSection({ walletAddress, wallet, loadSealed }: DevicesSectionProps) {\n const [devices, setDevices] = useState<DeviceEntry[] | null>(null);\n const [addOpen, setAddOpen] = useState(false);\n const [busyGuid, setBusyGuid] = useState<string | null>(null);\n const [error, setError] = useState<string | null>(null);\n\n const refresh = useCallback(() => {\n const sealed = loadSealed();\n if (!sealed) return;\n wallet\n .getOwners(walletAddress)\n .then((owners) => setDevices(describeDevices(owners, sealed.ownerPubKey)))\n .catch(() => setDevices([]));\n }, [walletAddress, wallet, loadSealed]);\n\n useEffect(() => {\n refresh();\n }, [refresh]);\n\n const handleRemove = async (device: DeviceEntry) => {\n const sealed = loadSealed();\n if (!sealed || !devices) return;\n\n const confirmed = window.confirm(\n \"Remove this device? It will no longer be able to sign for your account. Adding it back needs a device you still have.\",\n );\n if (!confirmed) return;\n\n setBusyGuid(device.guid);\n setError(null);\n try {\n await wallet.removeDevice(sealed, device.guid);\n refresh();\n } catch (e) {\n setError(describeError(e
|
|
1
|
+
{"version":3,"sources":["../../../src/components/account/devices-section.tsx"],"sourcesContent":["\"use client\";\n\nimport { useCallback, useEffect, useState } from \"react\";\nimport { Loader2, Monitor, Plus } from \"lucide-react\";\nimport { canRemoveDevice, describeDevices, type DeviceEntry } from \"@medialane/sdk/starknet\";\nimport { Button } from \"../button.js\";\nimport { Badge } from \"../badge.js\";\nimport { describeError } from \"../../utils/describe-error.js\";\nimport { DeviceApprovalDialog } from \"./device-approval-dialog.js\";\nimport type { DeviceWallet, LoadSealedOwner } from \"./wallet-types.js\";\n\nconst short = (v: string) => `${v.slice(0, 10)}…${v.slice(-6)}`;\n\nexport interface DevicesSectionProps {\n walletAddress: string;\n wallet: DeviceWallet;\n loadSealed: LoadSealedOwner;\n}\n\nexport function DevicesSection({ walletAddress, wallet, loadSealed }: DevicesSectionProps) {\n const [devices, setDevices] = useState<DeviceEntry[] | null>(null);\n const [addOpen, setAddOpen] = useState(false);\n const [busyGuid, setBusyGuid] = useState<string | null>(null);\n const [error, setError] = useState<string | null>(null);\n\n const refresh = useCallback(() => {\n const sealed = loadSealed();\n if (!sealed) return;\n wallet\n .getOwners(walletAddress)\n .then((owners) => setDevices(describeDevices(owners, sealed.ownerPubKey)))\n .catch(() => setDevices([]));\n }, [walletAddress, wallet, loadSealed]);\n\n useEffect(() => {\n refresh();\n }, [refresh]);\n\n const handleRemove = async (device: DeviceEntry) => {\n const sealed = loadSealed();\n if (!sealed || !devices) return;\n\n const confirmed = window.confirm(\n \"Remove this device? It will no longer be able to sign for your account. Adding it back needs a device you still have.\",\n );\n if (!confirmed) return;\n\n setBusyGuid(device.guid);\n setError(null);\n try {\n await wallet.removeDevice(sealed, device.guid);\n refresh();\n } catch (e) {\n setError(describeError(e).message);\n } finally {\n setBusyGuid(null);\n }\n };\n\n return (\n <div className=\"rounded-2xl border border-border/60 bg-card p-5 sm:p-6 space-y-5\">\n <div className=\"flex items-start justify-between gap-3\">\n <div>\n <h3 className=\"text-base font-bold text-foreground\">Your devices</h3>\n <p className=\"text-sm text-muted-foreground mt-0.5\">\n Each device signs for itself. Add one to use this account somewhere else.\n </p>\n </div>\n <Button size=\"sm\" variant=\"outline\" onClick={() => setAddOpen(true)}>\n <Plus className=\"h-4 w-4 mr-1\" />\n Add\n </Button>\n </div>\n\n {devices === null ? (\n <Loader2 className=\"h-4 w-4 animate-spin text-muted-foreground\" />\n ) : devices.length === 0 ? (\n <p className=\"text-sm text-muted-foreground\">No devices found for this account.</p>\n ) : (\n <ul className=\"space-y-2\">\n {devices.map((device) => (\n <li\n key={device.guid}\n className=\"flex items-center justify-between gap-3 rounded-xl bg-muted/40 px-4 py-3\"\n >\n <div className=\"flex items-center gap-3 min-w-0\">\n <Monitor className=\"h-4 w-4 shrink-0 text-muted-foreground\" />\n <span className=\"font-mono text-xs text-muted-foreground truncate\">\n {short(device.guid)}\n </span>\n {device.isThisDevice ? <Badge variant=\"secondary\">This device</Badge> : null}\n </div>\n {device.isThisDevice ? null : (\n <Button\n size=\"sm\"\n variant=\"ghost\"\n disabled={!canRemoveDevice(devices, device.guid) || busyGuid !== null}\n onClick={() => handleRemove(device)}\n >\n {busyGuid === device.guid ? <Loader2 className=\"h-4 w-4 animate-spin\" /> : \"Remove\"}\n </Button>\n )}\n </li>\n ))}\n </ul>\n )}\n\n {error ? <p className=\"text-sm text-destructive\">{error}</p> : null}\n\n <DeviceApprovalDialog\n open={addOpen}\n onOpenChange={setAddOpen}\n onApproved={refresh}\n wallet={wallet}\n loadSealed={loadSealed}\n />\n </div>\n );\n}\n"],"mappings":"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","names":[]}
|
|
@@ -34,7 +34,7 @@ function DevicesSection({ walletAddress, wallet, loadSealed }) {
|
|
|
34
34
|
await wallet.removeDevice(sealed, device.guid);
|
|
35
35
|
refresh();
|
|
36
36
|
} catch (e) {
|
|
37
|
-
setError(describeError(e
|
|
37
|
+
setError(describeError(e).message);
|
|
38
38
|
} finally {
|
|
39
39
|
setBusyGuid(null);
|
|
40
40
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/components/account/devices-section.tsx"],"sourcesContent":["\"use client\";\n\nimport { useCallback, useEffect, useState } from \"react\";\nimport { Loader2, Monitor, Plus } from \"lucide-react\";\nimport { canRemoveDevice, describeDevices, type DeviceEntry } from \"@medialane/sdk/starknet\";\nimport { Button } from \"../button.js\";\nimport { Badge } from \"../badge.js\";\nimport { describeError } from \"../../utils/describe-error.js\";\nimport { DeviceApprovalDialog } from \"./device-approval-dialog.js\";\nimport type { DeviceWallet, LoadSealedOwner } from \"./wallet-types.js\";\n\nconst short = (v: string) => `${v.slice(0, 10)}…${v.slice(-6)}`;\n\nexport interface DevicesSectionProps {\n walletAddress: string;\n wallet: DeviceWallet;\n loadSealed: LoadSealedOwner;\n}\n\nexport function DevicesSection({ walletAddress, wallet, loadSealed }: DevicesSectionProps) {\n const [devices, setDevices] = useState<DeviceEntry[] | null>(null);\n const [addOpen, setAddOpen] = useState(false);\n const [busyGuid, setBusyGuid] = useState<string | null>(null);\n const [error, setError] = useState<string | null>(null);\n\n const refresh = useCallback(() => {\n const sealed = loadSealed();\n if (!sealed) return;\n wallet\n .getOwners(walletAddress)\n .then((owners) => setDevices(describeDevices(owners, sealed.ownerPubKey)))\n .catch(() => setDevices([]));\n }, [walletAddress, wallet, loadSealed]);\n\n useEffect(() => {\n refresh();\n }, [refresh]);\n\n const handleRemove = async (device: DeviceEntry) => {\n const sealed = loadSealed();\n if (!sealed || !devices) return;\n\n const confirmed = window.confirm(\n \"Remove this device? It will no longer be able to sign for your account. Adding it back needs a device you still have.\",\n );\n if (!confirmed) return;\n\n setBusyGuid(device.guid);\n setError(null);\n try {\n await wallet.removeDevice(sealed, device.guid);\n refresh();\n } catch (e) {\n setError(describeError(e
|
|
1
|
+
{"version":3,"sources":["../../../src/components/account/devices-section.tsx"],"sourcesContent":["\"use client\";\n\nimport { useCallback, useEffect, useState } from \"react\";\nimport { Loader2, Monitor, Plus } from \"lucide-react\";\nimport { canRemoveDevice, describeDevices, type DeviceEntry } from \"@medialane/sdk/starknet\";\nimport { Button } from \"../button.js\";\nimport { Badge } from \"../badge.js\";\nimport { describeError } from \"../../utils/describe-error.js\";\nimport { DeviceApprovalDialog } from \"./device-approval-dialog.js\";\nimport type { DeviceWallet, LoadSealedOwner } from \"./wallet-types.js\";\n\nconst short = (v: string) => `${v.slice(0, 10)}…${v.slice(-6)}`;\n\nexport interface DevicesSectionProps {\n walletAddress: string;\n wallet: DeviceWallet;\n loadSealed: LoadSealedOwner;\n}\n\nexport function DevicesSection({ walletAddress, wallet, loadSealed }: DevicesSectionProps) {\n const [devices, setDevices] = useState<DeviceEntry[] | null>(null);\n const [addOpen, setAddOpen] = useState(false);\n const [busyGuid, setBusyGuid] = useState<string | null>(null);\n const [error, setError] = useState<string | null>(null);\n\n const refresh = useCallback(() => {\n const sealed = loadSealed();\n if (!sealed) return;\n wallet\n .getOwners(walletAddress)\n .then((owners) => setDevices(describeDevices(owners, sealed.ownerPubKey)))\n .catch(() => setDevices([]));\n }, [walletAddress, wallet, loadSealed]);\n\n useEffect(() => {\n refresh();\n }, [refresh]);\n\n const handleRemove = async (device: DeviceEntry) => {\n const sealed = loadSealed();\n if (!sealed || !devices) return;\n\n const confirmed = window.confirm(\n \"Remove this device? It will no longer be able to sign for your account. Adding it back needs a device you still have.\",\n );\n if (!confirmed) return;\n\n setBusyGuid(device.guid);\n setError(null);\n try {\n await wallet.removeDevice(sealed, device.guid);\n refresh();\n } catch (e) {\n setError(describeError(e).message);\n } finally {\n setBusyGuid(null);\n }\n };\n\n return (\n <div className=\"rounded-2xl border border-border/60 bg-card p-5 sm:p-6 space-y-5\">\n <div className=\"flex items-start justify-between gap-3\">\n <div>\n <h3 className=\"text-base font-bold text-foreground\">Your devices</h3>\n <p className=\"text-sm text-muted-foreground mt-0.5\">\n Each device signs for itself. Add one to use this account somewhere else.\n </p>\n </div>\n <Button size=\"sm\" variant=\"outline\" onClick={() => setAddOpen(true)}>\n <Plus className=\"h-4 w-4 mr-1\" />\n Add\n </Button>\n </div>\n\n {devices === null ? (\n <Loader2 className=\"h-4 w-4 animate-spin text-muted-foreground\" />\n ) : devices.length === 0 ? (\n <p className=\"text-sm text-muted-foreground\">No devices found for this account.</p>\n ) : (\n <ul className=\"space-y-2\">\n {devices.map((device) => (\n <li\n key={device.guid}\n className=\"flex items-center justify-between gap-3 rounded-xl bg-muted/40 px-4 py-3\"\n >\n <div className=\"flex items-center gap-3 min-w-0\">\n <Monitor className=\"h-4 w-4 shrink-0 text-muted-foreground\" />\n <span className=\"font-mono text-xs text-muted-foreground truncate\">\n {short(device.guid)}\n </span>\n {device.isThisDevice ? <Badge variant=\"secondary\">This device</Badge> : null}\n </div>\n {device.isThisDevice ? null : (\n <Button\n size=\"sm\"\n variant=\"ghost\"\n disabled={!canRemoveDevice(devices, device.guid) || busyGuid !== null}\n onClick={() => handleRemove(device)}\n >\n {busyGuid === device.guid ? <Loader2 className=\"h-4 w-4 animate-spin\" /> : \"Remove\"}\n </Button>\n )}\n </li>\n ))}\n </ul>\n )}\n\n {error ? <p className=\"text-sm text-destructive\">{error}</p> : null}\n\n <DeviceApprovalDialog\n open={addOpen}\n onOpenChange={setAddOpen}\n onApproved={refresh}\n wallet={wallet}\n loadSealed={loadSealed}\n />\n </div>\n );\n}\n"],"mappings":"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","names":[]}
|
|
@@ -71,7 +71,7 @@ function GuardianRecoverySection({
|
|
|
71
71
|
await wallet.cancelEscape(sealed2);
|
|
72
72
|
refresh();
|
|
73
73
|
} catch (e) {
|
|
74
|
-
setCancelError((0, import_describe_error.describeError)(e
|
|
74
|
+
setCancelError((0, import_describe_error.describeError)(e).message);
|
|
75
75
|
} finally {
|
|
76
76
|
setCancelBusy(false);
|
|
77
77
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/components/account/guardian-recovery-section.tsx"],"sourcesContent":["\"use client\";\n\nimport { useCallback, useEffect, useState } from \"react\";\nimport { Shield, ShieldAlert, ChevronRight, Loader2 } from \"lucide-react\";\nimport {\n describeGuardianStatus,\n describeRecoveryAction,\n type EscapeInfo,\n type GuardianInfo,\n} from \"@medialane/sdk/starknet\";\nimport Link from \"../link.js\";\nimport { Button } from \"../button.js\";\nimport { Badge } from \"../badge.js\";\nimport { Alert, AlertDescription } from \"../alert.js\";\nimport { describeError } from \"../../utils/describe-error.js\";\nimport { AddGuardianDialog } from \"./add-guardian-dialog.js\";\nimport type { GuardianWallet, LoadSealedOwner } from \"./wallet-types.js\";\n\nconst short = (a: string) => `${a.slice(0, 6)}…${a.slice(-4)}`;\n\nexport interface GuardianRecoverySectionProps {\n walletAddress: string;\n wallet: GuardianWallet;\n loadSealed: LoadSealedOwner;\n guardianRecoveryAvailable: boolean;\n recoverHref?: string;\n}\n\nexport function GuardianRecoverySection({\n walletAddress,\n wallet,\n loadSealed,\n guardianRecoveryAvailable,\n recoverHref = \"/recover\",\n}: GuardianRecoverySectionProps) {\n const [guardians, setGuardians] = useState<GuardianInfo[] | null>(null);\n const [escape, setEscape] = useState<EscapeInfo | null>(null);\n const [addOpen, setAddOpen] = useState(false);\n const [cancelBusy, setCancelBusy] = useState(false);\n const [cancelError, setCancelError] = useState<string | null>(null);\n\n const refresh = useCallback(() => {\n wallet.getGuardians(walletAddress).then(setGuardians).catch(() => setGuardians([]));\n wallet.getEscape(walletAddress).then(setEscape).catch(() => setEscape(null));\n }, [walletAddress, wallet]);\n\n useEffect(() => { refresh(); }, [refresh]);\n\n const handleCancel = async () => {\n const sealed = loadSealed();\n if (!sealed) return;\n setCancelBusy(true);\n setCancelError(null);\n try {\n await wallet.cancelEscape(sealed);\n refresh();\n } catch (e) {\n setCancelError(describeError(e
|
|
1
|
+
{"version":3,"sources":["../../../src/components/account/guardian-recovery-section.tsx"],"sourcesContent":["\"use client\";\n\nimport { useCallback, useEffect, useState } from \"react\";\nimport { Shield, ShieldAlert, ChevronRight, Loader2 } from \"lucide-react\";\nimport {\n describeGuardianStatus,\n describeRecoveryAction,\n type EscapeInfo,\n type GuardianInfo,\n} from \"@medialane/sdk/starknet\";\nimport Link from \"../link.js\";\nimport { Button } from \"../button.js\";\nimport { Badge } from \"../badge.js\";\nimport { Alert, AlertDescription } from \"../alert.js\";\nimport { describeError } from \"../../utils/describe-error.js\";\nimport { AddGuardianDialog } from \"./add-guardian-dialog.js\";\nimport type { GuardianWallet, LoadSealedOwner } from \"./wallet-types.js\";\n\nconst short = (a: string) => `${a.slice(0, 6)}…${a.slice(-4)}`;\n\nexport interface GuardianRecoverySectionProps {\n walletAddress: string;\n wallet: GuardianWallet;\n loadSealed: LoadSealedOwner;\n guardianRecoveryAvailable: boolean;\n recoverHref?: string;\n}\n\nexport function GuardianRecoverySection({\n walletAddress,\n wallet,\n loadSealed,\n guardianRecoveryAvailable,\n recoverHref = \"/recover\",\n}: GuardianRecoverySectionProps) {\n const [guardians, setGuardians] = useState<GuardianInfo[] | null>(null);\n const [escape, setEscape] = useState<EscapeInfo | null>(null);\n const [addOpen, setAddOpen] = useState(false);\n const [cancelBusy, setCancelBusy] = useState(false);\n const [cancelError, setCancelError] = useState<string | null>(null);\n\n const refresh = useCallback(() => {\n wallet.getGuardians(walletAddress).then(setGuardians).catch(() => setGuardians([]));\n wallet.getEscape(walletAddress).then(setEscape).catch(() => setEscape(null));\n }, [walletAddress, wallet]);\n\n useEffect(() => { refresh(); }, [refresh]);\n\n const handleCancel = async () => {\n const sealed = loadSealed();\n if (!sealed) return;\n setCancelBusy(true);\n setCancelError(null);\n try {\n await wallet.cancelEscape(sealed);\n refresh();\n } catch (e) {\n setCancelError(describeError(e).message);\n } finally {\n setCancelBusy(false);\n }\n };\n\n const status = guardians ? describeGuardianStatus(guardians) : null;\n const recoveryAction = escape ? describeRecoveryAction(escape) : \"none\";\n const inProgress = escape?.escapeType === \"Owner\" && recoveryAction !== \"none\" ? escape : null;\n\n const sealed = loadSealed();\n\n return (\n <div className=\"rounded-2xl border border-border/60 bg-card p-5 sm:p-6 space-y-5\">\n <div className=\"flex items-start gap-3\">\n <div className=\"h-10 w-10 shrink-0 rounded-full bg-emerald-500/10 flex items-center justify-center\">\n <Shield className=\"h-5 w-5 text-emerald-600 dark:text-emerald-400\" />\n </div>\n <div>\n <h3 className=\"text-base font-bold text-foreground\">Security & Recovery</h3>\n <p className=\"text-sm text-muted-foreground mt-0.5\">\n A guardian can help you get back into this wallet if you ever lose this device.\n </p>\n </div>\n </div>\n\n <div className=\"space-y-3\">\n {inProgress && (\n <Alert variant=\"destructive\">\n <ShieldAlert className=\"h-4 w-4\" />\n <AlertDescription>\n A guardian has started replacing this wallet's owner key.{\" \"}\n {inProgress.status === \"Ready\"\n ? \"It can complete at any time.\"\n : `It can complete on ${new Date(inProgress.readyAt * 1000).toLocaleString()}.`}{\" \"}\n If this wasn't you, cancel it now.\n {cancelError && <p className=\"mt-1 text-destructive\">{cancelError}</p>}\n <Button\n onClick={handleCancel}\n disabled={cancelBusy}\n variant=\"destructive\"\n size=\"sm\"\n className=\"mt-2 w-full\"\n >\n {cancelBusy ? <Loader2 className=\"mr-1.5 h-3.5 w-3.5 animate-spin\" /> : null}\n Cancel recovery\n </Button>\n </AlertDescription>\n </Alert>\n )}\n\n <div className=\"flex items-center justify-between gap-3 rounded-xl border border-border/60 p-4 flex-wrap\">\n <div>\n <p className=\"text-sm font-medium text-foreground\">Guardian recovery</p>\n {status === null ? (\n <p className=\"text-xs text-muted-foreground mt-0.5\">Checking…</p>\n ) : status.kind === \"none\" ? (\n <p className=\"text-xs text-muted-foreground mt-0.5\">\n {guardianRecoveryAvailable ? \"Not set up — add one from another device you trust.\" : \"Not available yet.\"}\n </p>\n ) : (\n <p className=\"text-xs text-muted-foreground mt-0.5\">\n Active: {status.guardian.type} guardian {short(status.guardian.storedValue)}\n </p>\n )}\n </div>\n {status?.kind === \"none\" && sealed && (\n <Button onClick={() => setAddOpen(true)} variant=\"outline\" size=\"sm\" disabled={!guardianRecoveryAvailable}>\n Add guardian\n </Button>\n )}\n {status?.kind === \"active\" && (\n <Badge variant=\"outline\" className=\"border-emerald-500/40 text-emerald-600 dark:text-emerald-400 bg-emerald-500/10 text-2xs\">\n Configured\n </Badge>\n )}\n </div>\n\n <Link\n href={recoverHref}\n className=\"flex items-center justify-between gap-3 rounded-xl border border-border/60 p-4 transition-colors hover:bg-foreground/[0.03]\"\n >\n <div>\n <p className=\"text-sm font-medium text-foreground\">Recover a wallet</p>\n <p className=\"text-xs text-muted-foreground mt-0.5\">\n Lost this device, or acting as someone's guardian?\n </p>\n </div>\n <ChevronRight className=\"h-4 w-4 text-muted-foreground shrink-0\" />\n </Link>\n </div>\n\n {sealed && guardianRecoveryAvailable && (\n <AddGuardianDialog\n open={addOpen}\n onOpenChange={setAddOpen}\n sealed={sealed}\n onAdded={refresh}\n wallet={wallet}\n />\n )}\n </div>\n );\n}\n"],"mappings":"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","names":["sealed","Link"]}
|
|
@@ -41,7 +41,7 @@ function GuardianRecoverySection({
|
|
|
41
41
|
await wallet.cancelEscape(sealed2);
|
|
42
42
|
refresh();
|
|
43
43
|
} catch (e) {
|
|
44
|
-
setCancelError(describeError(e
|
|
44
|
+
setCancelError(describeError(e).message);
|
|
45
45
|
} finally {
|
|
46
46
|
setCancelBusy(false);
|
|
47
47
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/components/account/guardian-recovery-section.tsx"],"sourcesContent":["\"use client\";\n\nimport { useCallback, useEffect, useState } from \"react\";\nimport { Shield, ShieldAlert, ChevronRight, Loader2 } from \"lucide-react\";\nimport {\n describeGuardianStatus,\n describeRecoveryAction,\n type EscapeInfo,\n type GuardianInfo,\n} from \"@medialane/sdk/starknet\";\nimport Link from \"../link.js\";\nimport { Button } from \"../button.js\";\nimport { Badge } from \"../badge.js\";\nimport { Alert, AlertDescription } from \"../alert.js\";\nimport { describeError } from \"../../utils/describe-error.js\";\nimport { AddGuardianDialog } from \"./add-guardian-dialog.js\";\nimport type { GuardianWallet, LoadSealedOwner } from \"./wallet-types.js\";\n\nconst short = (a: string) => `${a.slice(0, 6)}…${a.slice(-4)}`;\n\nexport interface GuardianRecoverySectionProps {\n walletAddress: string;\n wallet: GuardianWallet;\n loadSealed: LoadSealedOwner;\n guardianRecoveryAvailable: boolean;\n recoverHref?: string;\n}\n\nexport function GuardianRecoverySection({\n walletAddress,\n wallet,\n loadSealed,\n guardianRecoveryAvailable,\n recoverHref = \"/recover\",\n}: GuardianRecoverySectionProps) {\n const [guardians, setGuardians] = useState<GuardianInfo[] | null>(null);\n const [escape, setEscape] = useState<EscapeInfo | null>(null);\n const [addOpen, setAddOpen] = useState(false);\n const [cancelBusy, setCancelBusy] = useState(false);\n const [cancelError, setCancelError] = useState<string | null>(null);\n\n const refresh = useCallback(() => {\n wallet.getGuardians(walletAddress).then(setGuardians).catch(() => setGuardians([]));\n wallet.getEscape(walletAddress).then(setEscape).catch(() => setEscape(null));\n }, [walletAddress, wallet]);\n\n useEffect(() => { refresh(); }, [refresh]);\n\n const handleCancel = async () => {\n const sealed = loadSealed();\n if (!sealed) return;\n setCancelBusy(true);\n setCancelError(null);\n try {\n await wallet.cancelEscape(sealed);\n refresh();\n } catch (e) {\n setCancelError(describeError(e
|
|
1
|
+
{"version":3,"sources":["../../../src/components/account/guardian-recovery-section.tsx"],"sourcesContent":["\"use client\";\n\nimport { useCallback, useEffect, useState } from \"react\";\nimport { Shield, ShieldAlert, ChevronRight, Loader2 } from \"lucide-react\";\nimport {\n describeGuardianStatus,\n describeRecoveryAction,\n type EscapeInfo,\n type GuardianInfo,\n} from \"@medialane/sdk/starknet\";\nimport Link from \"../link.js\";\nimport { Button } from \"../button.js\";\nimport { Badge } from \"../badge.js\";\nimport { Alert, AlertDescription } from \"../alert.js\";\nimport { describeError } from \"../../utils/describe-error.js\";\nimport { AddGuardianDialog } from \"./add-guardian-dialog.js\";\nimport type { GuardianWallet, LoadSealedOwner } from \"./wallet-types.js\";\n\nconst short = (a: string) => `${a.slice(0, 6)}…${a.slice(-4)}`;\n\nexport interface GuardianRecoverySectionProps {\n walletAddress: string;\n wallet: GuardianWallet;\n loadSealed: LoadSealedOwner;\n guardianRecoveryAvailable: boolean;\n recoverHref?: string;\n}\n\nexport function GuardianRecoverySection({\n walletAddress,\n wallet,\n loadSealed,\n guardianRecoveryAvailable,\n recoverHref = \"/recover\",\n}: GuardianRecoverySectionProps) {\n const [guardians, setGuardians] = useState<GuardianInfo[] | null>(null);\n const [escape, setEscape] = useState<EscapeInfo | null>(null);\n const [addOpen, setAddOpen] = useState(false);\n const [cancelBusy, setCancelBusy] = useState(false);\n const [cancelError, setCancelError] = useState<string | null>(null);\n\n const refresh = useCallback(() => {\n wallet.getGuardians(walletAddress).then(setGuardians).catch(() => setGuardians([]));\n wallet.getEscape(walletAddress).then(setEscape).catch(() => setEscape(null));\n }, [walletAddress, wallet]);\n\n useEffect(() => { refresh(); }, [refresh]);\n\n const handleCancel = async () => {\n const sealed = loadSealed();\n if (!sealed) return;\n setCancelBusy(true);\n setCancelError(null);\n try {\n await wallet.cancelEscape(sealed);\n refresh();\n } catch (e) {\n setCancelError(describeError(e).message);\n } finally {\n setCancelBusy(false);\n }\n };\n\n const status = guardians ? describeGuardianStatus(guardians) : null;\n const recoveryAction = escape ? describeRecoveryAction(escape) : \"none\";\n const inProgress = escape?.escapeType === \"Owner\" && recoveryAction !== \"none\" ? escape : null;\n\n const sealed = loadSealed();\n\n return (\n <div className=\"rounded-2xl border border-border/60 bg-card p-5 sm:p-6 space-y-5\">\n <div className=\"flex items-start gap-3\">\n <div className=\"h-10 w-10 shrink-0 rounded-full bg-emerald-500/10 flex items-center justify-center\">\n <Shield className=\"h-5 w-5 text-emerald-600 dark:text-emerald-400\" />\n </div>\n <div>\n <h3 className=\"text-base font-bold text-foreground\">Security & Recovery</h3>\n <p className=\"text-sm text-muted-foreground mt-0.5\">\n A guardian can help you get back into this wallet if you ever lose this device.\n </p>\n </div>\n </div>\n\n <div className=\"space-y-3\">\n {inProgress && (\n <Alert variant=\"destructive\">\n <ShieldAlert className=\"h-4 w-4\" />\n <AlertDescription>\n A guardian has started replacing this wallet's owner key.{\" \"}\n {inProgress.status === \"Ready\"\n ? \"It can complete at any time.\"\n : `It can complete on ${new Date(inProgress.readyAt * 1000).toLocaleString()}.`}{\" \"}\n If this wasn't you, cancel it now.\n {cancelError && <p className=\"mt-1 text-destructive\">{cancelError}</p>}\n <Button\n onClick={handleCancel}\n disabled={cancelBusy}\n variant=\"destructive\"\n size=\"sm\"\n className=\"mt-2 w-full\"\n >\n {cancelBusy ? <Loader2 className=\"mr-1.5 h-3.5 w-3.5 animate-spin\" /> : null}\n Cancel recovery\n </Button>\n </AlertDescription>\n </Alert>\n )}\n\n <div className=\"flex items-center justify-between gap-3 rounded-xl border border-border/60 p-4 flex-wrap\">\n <div>\n <p className=\"text-sm font-medium text-foreground\">Guardian recovery</p>\n {status === null ? (\n <p className=\"text-xs text-muted-foreground mt-0.5\">Checking…</p>\n ) : status.kind === \"none\" ? (\n <p className=\"text-xs text-muted-foreground mt-0.5\">\n {guardianRecoveryAvailable ? \"Not set up — add one from another device you trust.\" : \"Not available yet.\"}\n </p>\n ) : (\n <p className=\"text-xs text-muted-foreground mt-0.5\">\n Active: {status.guardian.type} guardian {short(status.guardian.storedValue)}\n </p>\n )}\n </div>\n {status?.kind === \"none\" && sealed && (\n <Button onClick={() => setAddOpen(true)} variant=\"outline\" size=\"sm\" disabled={!guardianRecoveryAvailable}>\n Add guardian\n </Button>\n )}\n {status?.kind === \"active\" && (\n <Badge variant=\"outline\" className=\"border-emerald-500/40 text-emerald-600 dark:text-emerald-400 bg-emerald-500/10 text-2xs\">\n Configured\n </Badge>\n )}\n </div>\n\n <Link\n href={recoverHref}\n className=\"flex items-center justify-between gap-3 rounded-xl border border-border/60 p-4 transition-colors hover:bg-foreground/[0.03]\"\n >\n <div>\n <p className=\"text-sm font-medium text-foreground\">Recover a wallet</p>\n <p className=\"text-xs text-muted-foreground mt-0.5\">\n Lost this device, or acting as someone's guardian?\n </p>\n </div>\n <ChevronRight className=\"h-4 w-4 text-muted-foreground shrink-0\" />\n </Link>\n </div>\n\n {sealed && guardianRecoveryAvailable && (\n <AddGuardianDialog\n open={addOpen}\n onOpenChange={setAddOpen}\n sealed={sealed}\n onAdded={refresh}\n wallet={wallet}\n />\n )}\n </div>\n );\n}\n"],"mappings":";AAyEU,cAEF,YAFE;AAvEV,SAAS,aAAa,WAAW,gBAAgB;AACjD,SAAS,QAAQ,aAAa,cAAc,eAAe;AAC3D;AAAA,EACE;AAAA,EACA;AAAA,OAGK;AACP,OAAO,UAAU;AACjB,SAAS,cAAc;AACvB,SAAS,aAAa;AACtB,SAAS,OAAO,wBAAwB;AACxC,SAAS,qBAAqB;AAC9B,SAAS,yBAAyB;AAGlC,MAAM,QAAQ,CAAC,MAAc,GAAG,EAAE,MAAM,GAAG,CAAC,CAAC,SAAI,EAAE,MAAM,EAAE,CAAC;AAUrD,SAAS,wBAAwB;AAAA,EACtC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,cAAc;AAChB,GAAiC;AAC/B,QAAM,CAAC,WAAW,YAAY,IAAI,SAAgC,IAAI;AACtE,QAAM,CAAC,QAAQ,SAAS,IAAI,SAA4B,IAAI;AAC5D,QAAM,CAAC,SAAS,UAAU,IAAI,SAAS,KAAK;AAC5C,QAAM,CAAC,YAAY,aAAa,IAAI,SAAS,KAAK;AAClD,QAAM,CAAC,aAAa,cAAc,IAAI,SAAwB,IAAI;AAElE,QAAM,UAAU,YAAY,MAAM;AAChC,WAAO,aAAa,aAAa,EAAE,KAAK,YAAY,EAAE,MAAM,MAAM,aAAa,CAAC,CAAC,CAAC;AAClF,WAAO,UAAU,aAAa,EAAE,KAAK,SAAS,EAAE,MAAM,MAAM,UAAU,IAAI,CAAC;AAAA,EAC7E,GAAG,CAAC,eAAe,MAAM,CAAC;AAE1B,YAAU,MAAM;AAAE,YAAQ;AAAA,EAAG,GAAG,CAAC,OAAO,CAAC;AAEzC,QAAM,eAAe,YAAY;AAC/B,UAAMA,UAAS,WAAW;AAC1B,QAAI,CAACA,QAAQ;AACb,kBAAc,IAAI;AAClB,mBAAe,IAAI;AACnB,QAAI;AACF,YAAM,OAAO,aAAaA,OAAM;AAChC,cAAQ;AAAA,IACV,SAAS,GAAG;AACV,qBAAe,cAAc,CAAC,EAAE,OAAO;AAAA,IACzC,UAAE;AACA,oBAAc,KAAK;AAAA,IACrB;AAAA,EACF;AAEA,QAAM,SAAS,YAAY,uBAAuB,SAAS,IAAI;AAC/D,QAAM,iBAAiB,SAAS,uBAAuB,MAAM,IAAI;AACjE,QAAM,aAAa,QAAQ,eAAe,WAAW,mBAAmB,SAAS,SAAS;AAE1F,QAAM,SAAS,WAAW;AAE1B,SACE,qBAAC,SAAI,WAAU,oEACb;AAAA,yBAAC,SAAI,WAAU,0BACb;AAAA,0BAAC,SAAI,WAAU,sFACb,8BAAC,UAAO,WAAU,kDAAiD,GACrE;AAAA,MACA,qBAAC,SACC;AAAA,4BAAC,QAAG,WAAU,uCAAsC,iCAAuB;AAAA,QAC3E,oBAAC,OAAE,WAAU,wCAAuC,6FAEpD;AAAA,SACF;AAAA,OACF;AAAA,IAEA,qBAAC,SAAI,WAAU,aACZ;AAAA,oBACC,qBAAC,SAAM,SAAQ,eACb;AAAA,4BAAC,eAAY,WAAU,WAAU;AAAA,QACjC,qBAAC,oBAAiB;AAAA;AAAA,UAC+C;AAAA,UAC9D,WAAW,WAAW,UACnB,iCACA,sBAAsB,IAAI,KAAK,WAAW,UAAU,GAAI,EAAE,eAAe,CAAC;AAAA,UAAK;AAAA,UAAI;AAAA,UAEtF,eAAe,oBAAC,OAAE,WAAU,yBAAyB,uBAAY;AAAA,UAClE;AAAA,YAAC;AAAA;AAAA,cACC,SAAS;AAAA,cACT,UAAU;AAAA,cACV,SAAQ;AAAA,cACR,MAAK;AAAA,cACL,WAAU;AAAA,cAET;AAAA,6BAAa,oBAAC,WAAQ,WAAU,mCAAkC,IAAK;AAAA,gBAAK;AAAA;AAAA;AAAA,UAE/E;AAAA,WACF;AAAA,SACF;AAAA,MAGF,qBAAC,SAAI,WAAU,4FACb;AAAA,6BAAC,SACC;AAAA,8BAAC,OAAE,WAAU,uCAAsC,+BAAiB;AAAA,UACnE,WAAW,OACV,oBAAC,OAAE,WAAU,wCAAuC,4BAAS,IAC3D,OAAO,SAAS,SAClB,oBAAC,OAAE,WAAU,wCACV,sCAA4B,6DAAwD,sBACvF,IAEA,qBAAC,OAAE,WAAU,wCAAuC;AAAA;AAAA,YACzC,OAAO,SAAS;AAAA,YAAK;AAAA,YAAW,MAAM,OAAO,SAAS,WAAW;AAAA,aAC5E;AAAA,WAEJ;AAAA,QACC,QAAQ,SAAS,UAAU,UAC1B,oBAAC,UAAO,SAAS,MAAM,WAAW,IAAI,GAAG,SAAQ,WAAU,MAAK,MAAK,UAAU,CAAC,2BAA2B,0BAE3G;AAAA,QAED,QAAQ,SAAS,YAChB,oBAAC,SAAM,SAAQ,WAAU,WAAU,2FAA0F,wBAE7H;AAAA,SAEJ;AAAA,MAEA;AAAA,QAAC;AAAA;AAAA,UACC,MAAM;AAAA,UACN,WAAU;AAAA,UAEV;AAAA,iCAAC,SACC;AAAA,kCAAC,OAAE,WAAU,uCAAsC,8BAAgB;AAAA,cACnE,oBAAC,OAAE,WAAU,wCAAuC,gEAEpD;AAAA,eACF;AAAA,YACA,oBAAC,gBAAa,WAAU,0CAAyC;AAAA;AAAA;AAAA,MACnE;AAAA,OACF;AAAA,IAEC,UAAU,6BACT;AAAA,MAAC;AAAA;AAAA,QACC,MAAM;AAAA,QACN,cAAc;AAAA,QACd;AAAA,QACA,SAAS;AAAA,QACT;AAAA;AAAA,IACF;AAAA,KAEJ;AAEJ;","names":["sealed"]}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import * as input_otp from 'input-otp';
|
|
2
2
|
import * as React from 'react';
|
|
3
3
|
|
|
4
|
-
declare const InputOTP: React.ForwardRefExoticComponent<(Omit<Omit<React.InputHTMLAttributes<HTMLInputElement>, "
|
|
4
|
+
declare const InputOTP: React.ForwardRefExoticComponent<(Omit<Omit<React.InputHTMLAttributes<HTMLInputElement>, "onChange" | "value" | "maxLength" | "textAlign" | "onComplete" | "pushPasswordManagerStrategy" | "pasteTransformer" | "containerClassName" | "noScriptCSSFallback"> & {
|
|
5
5
|
value?: string;
|
|
6
6
|
onChange?: (newValue: string) => unknown;
|
|
7
7
|
maxLength: number;
|
|
@@ -14,7 +14,7 @@ declare const InputOTP: React.ForwardRefExoticComponent<(Omit<Omit<React.InputHT
|
|
|
14
14
|
} & {
|
|
15
15
|
render: (props: input_otp.RenderProps) => React.ReactNode;
|
|
16
16
|
children?: never;
|
|
17
|
-
} & React.RefAttributes<HTMLInputElement>, "ref"> | Omit<Omit<React.InputHTMLAttributes<HTMLInputElement>, "
|
|
17
|
+
} & React.RefAttributes<HTMLInputElement>, "ref"> | Omit<Omit<React.InputHTMLAttributes<HTMLInputElement>, "onChange" | "value" | "maxLength" | "textAlign" | "onComplete" | "pushPasswordManagerStrategy" | "pasteTransformer" | "containerClassName" | "noScriptCSSFallback"> & {
|
|
18
18
|
value?: string;
|
|
19
19
|
onChange?: (newValue: string) => unknown;
|
|
20
20
|
maxLength: number;
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import * as input_otp from 'input-otp';
|
|
2
2
|
import * as React from 'react';
|
|
3
3
|
|
|
4
|
-
declare const InputOTP: React.ForwardRefExoticComponent<(Omit<Omit<React.InputHTMLAttributes<HTMLInputElement>, "
|
|
4
|
+
declare const InputOTP: React.ForwardRefExoticComponent<(Omit<Omit<React.InputHTMLAttributes<HTMLInputElement>, "onChange" | "value" | "maxLength" | "textAlign" | "onComplete" | "pushPasswordManagerStrategy" | "pasteTransformer" | "containerClassName" | "noScriptCSSFallback"> & {
|
|
5
5
|
value?: string;
|
|
6
6
|
onChange?: (newValue: string) => unknown;
|
|
7
7
|
maxLength: number;
|
|
@@ -14,7 +14,7 @@ declare const InputOTP: React.ForwardRefExoticComponent<(Omit<Omit<React.InputHT
|
|
|
14
14
|
} & {
|
|
15
15
|
render: (props: input_otp.RenderProps) => React.ReactNode;
|
|
16
16
|
children?: never;
|
|
17
|
-
} & React.RefAttributes<HTMLInputElement>, "ref"> | Omit<Omit<React.InputHTMLAttributes<HTMLInputElement>, "
|
|
17
|
+
} & React.RefAttributes<HTMLInputElement>, "ref"> | Omit<Omit<React.InputHTMLAttributes<HTMLInputElement>, "onChange" | "value" | "maxLength" | "textAlign" | "onComplete" | "pushPasswordManagerStrategy" | "pasteTransformer" | "containerClassName" | "noScriptCSSFallback"> & {
|
|
18
18
|
value?: string;
|
|
19
19
|
onChange?: (newValue: string) => unknown;
|
|
20
20
|
maxLength: number;
|
|
@@ -76,12 +76,12 @@ const KINDS = {
|
|
|
76
76
|
pop: { namePrefix: "POP", accents: import_asset_accents.ASSET_ACCENTS.standard, market: false, remix: false }
|
|
77
77
|
};
|
|
78
78
|
const PUBLICATION_TYPES = /* @__PURE__ */ new Set(["publications", "posts"]);
|
|
79
|
+
function traitText(attributes, trait) {
|
|
80
|
+
const value = attributes.find((a) => a.trait_type === trait)?.value;
|
|
81
|
+
return typeof value === "string" && value.trim() !== "" ? value.trim() : null;
|
|
82
|
+
}
|
|
79
83
|
function publicationAuthor(attributes, metadataAuthor) {
|
|
80
|
-
|
|
81
|
-
const value = attributes.find((a) => a.trait_type === trait)?.value;
|
|
82
|
-
return typeof value === "string" && value.trim() !== "" ? value.trim() : null;
|
|
83
|
-
};
|
|
84
|
-
return text("Author") ?? metadataAuthor ?? text("Creator");
|
|
84
|
+
return traitText(attributes, "Author") ?? metadataAuthor ?? traitText(attributes, "Creator");
|
|
85
85
|
}
|
|
86
86
|
const VARIANT_KINDS = { edition: "edition", ticket: "ticket", club: "membership", pop: "pop" };
|
|
87
87
|
function detectAssetKind(service, standard) {
|
|
@@ -170,12 +170,13 @@ function AssetPageView({
|
|
|
170
170
|
const ownerAddress = !market.isERC1155 ? holders[0]?.owner ?? token.owner ?? null : null;
|
|
171
171
|
const marketCount = market.activeListings.length + market.activeBids.length;
|
|
172
172
|
const { Panel } = config;
|
|
173
|
-
const
|
|
173
|
+
const postContent = traitText(attributes, "Content");
|
|
174
|
+
const articleText = postContent ?? (token.metadata?.description?.trim() || null);
|
|
174
175
|
const video = (token.metadata?.ipType ?? "").toLowerCase() === "video" ? (0, import_asset_video.videoEmbed)(attributes) : null;
|
|
175
176
|
const audio = (token.metadata?.ipType ?? "").toLowerCase() === "audio" ? (0, import_asset_audio.audioEmbed)(attributes) : null;
|
|
176
177
|
const isPublication = !!articleText && PUBLICATION_TYPES.has((token.metadata?.ipType ?? "").toLowerCase());
|
|
177
178
|
const publisherName = collection?.name ?? contract.slice(0, 8) + "\u2026";
|
|
178
|
-
const overview = isPublication ? { attributes, hasTemplateData, isDisplayAttr } : video || audio ? (0, import_asset_attributes.assetAttributes)(attributes.filter((a) => !import_asset_video.VIDEO_EMBED_TRAITS.has(a.trait_type ?? "") && !import_asset_audio.AUDIO_EMBED_TRAITS.has(a.trait_type ?? ""))) : { attributes, hasTemplateData, isDisplayAttr };
|
|
179
|
+
const overview = isPublication ? { attributes, hasTemplateData, isDisplayAttr: (a) => isDisplayAttr(a) && !(postContent && a.trait_type === "Content") } : video || audio ? (0, import_asset_attributes.assetAttributes)(attributes.filter((a) => !import_asset_video.VIDEO_EMBED_TRAITS.has(a.trait_type ?? "") && !import_asset_audio.AUDIO_EMBED_TRAITS.has(a.trait_type ?? ""))) : { attributes, hasTemplateData, isDisplayAttr };
|
|
179
180
|
const marketBlock = /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_jsx_runtime.Fragment, { children: [
|
|
180
181
|
Panel ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)(Panel, { contract, tokenId, quantityOwned: market.quantityOwned }) : null,
|
|
181
182
|
config.market ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
|