@blu1606/create-walrus-app 0.1.4 → 2.0.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/generator/file-ops.d.ts +8 -0
- package/dist/generator/file-ops.js +20 -0
- package/dist/generator/index.js +37 -22
- package/dist/generator/layers.d.ts +15 -2
- package/dist/generator/layers.js +38 -47
- package/dist/generator/types.d.ts +9 -1
- package/dist/index.js +1 -2
- package/dist/post-install/git.d.ts +8 -0
- package/dist/post-install/git.js +2 -0
- package/dist/post-install/index.d.ts +0 -1
- package/dist/post-install/index.js +2 -15
- package/dist/post-install/messages.js +1 -1
- package/package.json +68 -68
- package/{templates/base → presets/react-mysten-gallery}/.env.example +31 -31
- package/presets/react-mysten-gallery/.gitkeep +4 -0
- package/{templates/gallery → presets/react-mysten-gallery}/README.md +25 -22
- package/presets/react-mysten-gallery/package.json +34 -0
- package/presets/react-mysten-gallery/src/App.tsx +23 -0
- package/presets/react-mysten-gallery/src/components/features/file-card.tsx +89 -0
- package/{templates/gallery/src/components/GalleryGrid.tsx → presets/react-mysten-gallery/src/components/features/gallery-grid.tsx} +5 -5
- package/presets/react-mysten-gallery/src/components/features/upload-modal.tsx +69 -0
- package/{templates/react/src/components/WalletConnect.tsx → presets/react-mysten-gallery/src/components/features/wallet-connect.tsx} +1 -1
- package/presets/react-mysten-gallery/src/components/layout/app-layout.tsx +21 -0
- package/{templates/react/src/hooks/useStorage.ts → presets/react-mysten-gallery/src/hooks/use-download.ts} +2 -18
- package/presets/react-mysten-gallery/src/hooks/use-upload.ts +49 -0
- package/{templates/react/src/hooks/useWallet.ts → presets/react-mysten-gallery/src/hooks/use-wallet.ts} +2 -7
- package/presets/react-mysten-gallery/src/index.css +384 -0
- package/presets/react-mysten-gallery/src/index.ts +17 -0
- package/presets/react-mysten-gallery/src/lib/walrus/adapter.ts +197 -0
- package/presets/react-mysten-gallery/src/lib/walrus/client.ts +87 -0
- package/presets/react-mysten-gallery/src/lib/walrus/index.ts +4 -0
- package/presets/react-mysten-gallery/src/lib/walrus/types.ts +101 -0
- package/{templates/react → presets/react-mysten-gallery}/src/main.tsx +0 -1
- package/{templates/react → presets/react-mysten-gallery}/src/providers/WalletProvider.tsx +16 -1
- package/{templates/base → presets/react-mysten-gallery}/src/utils/env.ts +41 -41
- package/{templates/gallery → presets/react-mysten-gallery}/src/utils/index-manager.ts +2 -2
- package/presets/react-mysten-gallery/src/utils/mime-type.ts +97 -0
- package/presets/react-mysten-gallery/src/utils/preview-generator.ts +134 -0
- package/{templates/react → presets/react-mysten-gallery}/tsconfig.json +20 -8
- package/presets/react-mysten-simple-upload/.env.example +31 -0
- package/presets/react-mysten-simple-upload/.gitkeep +4 -0
- package/presets/react-mysten-simple-upload/index.html +13 -0
- package/{templates/react → presets/react-mysten-simple-upload}/package.json +13 -11
- package/presets/react-mysten-simple-upload/src/App.tsx +27 -0
- package/presets/react-mysten-simple-upload/src/components/features/file-preview.tsx +73 -0
- package/{templates/simple-upload/src/components/UploadForm.tsx → presets/react-mysten-simple-upload/src/components/features/upload-form.tsx} +15 -5
- package/presets/react-mysten-simple-upload/src/components/features/wallet-connect.tsx +21 -0
- package/presets/react-mysten-simple-upload/src/components/layout/app-layout.tsx +21 -0
- package/presets/react-mysten-simple-upload/src/hooks/use-download.ts +24 -0
- package/presets/react-mysten-simple-upload/src/hooks/use-upload.ts +49 -0
- package/presets/react-mysten-simple-upload/src/hooks/use-wallet.ts +11 -0
- package/presets/react-mysten-simple-upload/src/index.css +252 -0
- package/presets/react-mysten-simple-upload/src/index.ts +16 -0
- package/presets/react-mysten-simple-upload/src/lib/walrus/adapter.ts +197 -0
- package/presets/react-mysten-simple-upload/src/lib/walrus/client.ts +87 -0
- package/presets/react-mysten-simple-upload/src/lib/walrus/index.ts +4 -0
- package/{templates/base/src/adapters/storage.ts → presets/react-mysten-simple-upload/src/lib/walrus/types.ts} +83 -58
- package/presets/react-mysten-simple-upload/src/main.tsx +16 -0
- package/presets/react-mysten-simple-upload/src/providers/QueryProvider.tsx +18 -0
- package/presets/react-mysten-simple-upload/src/providers/WalletProvider.tsx +52 -0
- package/presets/react-mysten-simple-upload/src/utils/env.ts +41 -0
- package/presets/react-mysten-simple-upload/src/utils/mime-type.ts +97 -0
- package/presets/react-mysten-simple-upload/tsconfig.json +39 -0
- package/presets/react-mysten-simple-upload/tsconfig.node.json +10 -0
- package/presets/react-mysten-simple-upload/vite.config.ts +19 -0
- package/dist/__tests__/helpers/adapter-compliance.d.ts +0 -2
- package/dist/__tests__/helpers/adapter-compliance.js +0 -47
- package/dist/__tests__/helpers/fixtures.d.ts +0 -21
- package/dist/__tests__/helpers/fixtures.js +0 -30
- package/dist/__tests__/helpers/fs-helpers.d.ts +0 -12
- package/dist/__tests__/helpers/fs-helpers.js +0 -35
- package/dist/__tests__/helpers/index.d.ts +0 -4
- package/dist/__tests__/helpers/index.js +0 -4
- package/dist/__tests__/helpers/test-hooks.d.ts +0 -3
- package/dist/__tests__/helpers/test-hooks.js +0 -18
- package/dist/context.test.d.ts +0 -1
- package/dist/context.test.js +0 -98
- package/dist/generator/index.test.d.ts +0 -1
- package/dist/generator/index.test.js +0 -143
- package/dist/generator/layers.test.d.ts +0 -1
- package/dist/generator/layers.test.js +0 -92
- package/dist/generator/merge.test.d.ts +0 -1
- package/dist/generator/merge.test.js +0 -79
- package/dist/generator/transform.test.d.ts +0 -1
- package/dist/generator/transform.test.js +0 -51
- package/dist/matrix.test.d.ts +0 -1
- package/dist/matrix.test.js +0 -70
- package/dist/types.test.d.ts +0 -1
- package/dist/types.test.js +0 -65
- package/dist/utils/detect-pm.test.d.ts +0 -1
- package/dist/utils/detect-pm.test.js +0 -52
- package/dist/validator.test.d.ts +0 -1
- package/dist/validator.test.js +0 -96
- package/templates/base/README.md +0 -54
- package/templates/base/package.json +0 -19
- package/templates/base/src/types/index.ts +0 -9
- package/templates/base/src/types/walrus.ts +0 -22
- package/templates/base/src/utils/format.ts +0 -29
- package/templates/base/tsconfig.json +0 -19
- package/templates/gallery/package.json +0 -6
- package/templates/gallery/src/App.tsx +0 -21
- package/templates/gallery/src/components/FileCard.tsx +0 -27
- package/templates/gallery/src/components/UploadModal.tsx +0 -45
- package/templates/gallery/src/styles.css +0 -58
- package/templates/gallery/src/types/gallery.ts +0 -13
- package/templates/react/.eslintrc.json +0 -26
- package/templates/react/README.md +0 -80
- package/templates/react/src/App.tsx +0 -14
- package/templates/react/src/components/Layout.tsx +0 -21
- package/templates/react/src/dapp-kit.css +0 -1
- package/templates/react/src/index.css +0 -50
- package/templates/react/src/index.ts +0 -10
- package/templates/sdk-mysten/README.md +0 -65
- package/templates/sdk-mysten/package.json +0 -14
- package/templates/sdk-mysten/src/adapter.ts +0 -80
- package/templates/sdk-mysten/src/client.ts +0 -45
- package/templates/sdk-mysten/src/config.ts +0 -33
- package/templates/sdk-mysten/src/index.ts +0 -11
- package/templates/sdk-mysten/src/types.ts +0 -19
- package/templates/sdk-mysten/test/adapter.test.ts +0 -20
- package/templates/simple-upload/package.json +0 -6
- package/templates/simple-upload/src/App.tsx +0 -27
- package/templates/simple-upload/src/components/FilePreview.tsx +0 -40
- package/templates/simple-upload/src/styles.css +0 -33
- /package/{templates/react → presets/react-mysten-gallery}/index.html +0 -0
- /package/{templates/react → presets/react-mysten-gallery}/src/providers/QueryProvider.tsx +0 -0
- /package/{templates/react → presets/react-mysten-gallery}/tsconfig.node.json +0 -0
- /package/{templates/react → presets/react-mysten-gallery}/vite.config.ts +0 -0
- /package/{templates/simple-upload → presets/react-mysten-simple-upload}/README.md +0 -0
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "gallery-demo",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"private": true,
|
|
5
|
+
"description": "Walrus application scaffolded with create-walrus-app",
|
|
6
|
+
"type": "module",
|
|
7
|
+
"scripts": {
|
|
8
|
+
"build": "tsc && vite build",
|
|
9
|
+
"dev": "vite",
|
|
10
|
+
"lint": "eslint . --ext .ts,.tsx",
|
|
11
|
+
"preview": "vite preview",
|
|
12
|
+
"type-check": "tsc --noEmit"
|
|
13
|
+
},
|
|
14
|
+
"dependencies": {
|
|
15
|
+
"@mysten/dapp-kit": "^0.14.0",
|
|
16
|
+
"@mysten/sui": "^1.10.0",
|
|
17
|
+
"@mysten/walrus": "^0.9.0",
|
|
18
|
+
"@tanstack/react-query": "^5.17.0",
|
|
19
|
+
"react": "^18.2.0",
|
|
20
|
+
"react-dom": "^18.2.0"
|
|
21
|
+
},
|
|
22
|
+
"devDependencies": {
|
|
23
|
+
"@types/react": "^18.2.48",
|
|
24
|
+
"@types/react-dom": "^18.2.18",
|
|
25
|
+
"@typescript-eslint/eslint-plugin": "^6.19.0",
|
|
26
|
+
"@typescript-eslint/parser": "^6.19.0",
|
|
27
|
+
"@vitejs/plugin-react": "^4.2.1",
|
|
28
|
+
"eslint": "^8.56.0",
|
|
29
|
+
"eslint-plugin-react": "^7.33.2",
|
|
30
|
+
"eslint-plugin-react-hooks": "^4.6.0",
|
|
31
|
+
"typescript": "^5.3.3",
|
|
32
|
+
"vite": "^5.0.11"
|
|
33
|
+
}
|
|
34
|
+
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { useState } from 'react';
|
|
2
|
+
import { AppLayout } from './components/layout/app-layout.js';
|
|
3
|
+
import { GalleryGrid } from './components/features/gallery-grid.js';
|
|
4
|
+
import { UploadModal } from './components/features/upload-modal.js';
|
|
5
|
+
import './index.css';
|
|
6
|
+
|
|
7
|
+
function App() {
|
|
8
|
+
const [refreshKey, setRefreshKey] = useState(0);
|
|
9
|
+
|
|
10
|
+
return (
|
|
11
|
+
<AppLayout>
|
|
12
|
+
<div className="gallery-app">
|
|
13
|
+
<h2><span className="text-accent">🖼️</span> File Gallery</h2>
|
|
14
|
+
<p className="text-secondary">Upload and manage multiple files on <span className="text-accent">Walrus</span></p>
|
|
15
|
+
|
|
16
|
+
<UploadModal onSuccess={() => setRefreshKey((k) => k + 1)} />
|
|
17
|
+
<GalleryGrid key={refreshKey} />
|
|
18
|
+
</div>
|
|
19
|
+
</AppLayout>
|
|
20
|
+
);
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
export default App;
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
import { useState, useEffect } from 'react';
|
|
2
|
+
import { removeItem } from '../../utils/index-manager.js';
|
|
3
|
+
import type { GalleryItem } from '../../lib/walrus/types.js';
|
|
4
|
+
import {
|
|
5
|
+
generatePreviewUrl,
|
|
6
|
+
isImageType,
|
|
7
|
+
revokePreviewUrl,
|
|
8
|
+
} from '../../utils/preview-generator.js';
|
|
9
|
+
|
|
10
|
+
interface FileCardProps {
|
|
11
|
+
item: GalleryItem;
|
|
12
|
+
onDelete: () => void;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
export function FileCard({ item, onDelete }: FileCardProps) {
|
|
16
|
+
const [previewUrl, setPreviewUrl] = useState<string | null>(
|
|
17
|
+
item.previewUrl || null
|
|
18
|
+
);
|
|
19
|
+
const [isLoadingPreview, setIsLoadingPreview] = useState(false);
|
|
20
|
+
|
|
21
|
+
// Load preview if it's an image and we don't have a preview URL yet
|
|
22
|
+
useEffect(() => {
|
|
23
|
+
if (!previewUrl && isImageType(item.contentType)) {
|
|
24
|
+
setIsLoadingPreview(true);
|
|
25
|
+
generatePreviewUrl(item.blobId, item.contentType)
|
|
26
|
+
.then((url) => setPreviewUrl(url))
|
|
27
|
+
.catch((error) => {
|
|
28
|
+
console.error('Failed to load preview:', error);
|
|
29
|
+
})
|
|
30
|
+
.finally(() => setIsLoadingPreview(false));
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
// Cleanup: revoke object URL when component unmounts
|
|
34
|
+
return () => {
|
|
35
|
+
if (previewUrl) {
|
|
36
|
+
revokePreviewUrl(previewUrl);
|
|
37
|
+
}
|
|
38
|
+
};
|
|
39
|
+
}, [item.blobId, item.contentType, previewUrl]);
|
|
40
|
+
|
|
41
|
+
const handleDelete = () => {
|
|
42
|
+
if (confirm(`Delete ${item.name}?`)) {
|
|
43
|
+
// Revoke preview URL before deleting
|
|
44
|
+
if (previewUrl) {
|
|
45
|
+
revokePreviewUrl(previewUrl);
|
|
46
|
+
}
|
|
47
|
+
removeItem(item.blobId);
|
|
48
|
+
onDelete();
|
|
49
|
+
}
|
|
50
|
+
};
|
|
51
|
+
|
|
52
|
+
const formatBytes = (bytes: number): string => {
|
|
53
|
+
if (bytes === 0) return '0 Bytes';
|
|
54
|
+
const k = 1024;
|
|
55
|
+
const sizes = ['Bytes', 'KB', 'MB', 'GB'];
|
|
56
|
+
const i = Math.floor(Math.log(bytes) / Math.log(k));
|
|
57
|
+
return Math.round((bytes / Math.pow(k, i)) * 100) / 100 + ' ' + sizes[i];
|
|
58
|
+
};
|
|
59
|
+
|
|
60
|
+
const formatDate = (timestamp: number): string => {
|
|
61
|
+
return new Date(timestamp).toLocaleString();
|
|
62
|
+
};
|
|
63
|
+
|
|
64
|
+
return (
|
|
65
|
+
<div className="file-card">
|
|
66
|
+
{/* Image Preview */}
|
|
67
|
+
{isImageType(item.contentType) && (
|
|
68
|
+
<div className="image-preview">
|
|
69
|
+
{isLoadingPreview ? (
|
|
70
|
+
<div className="loading-placeholder">Loading preview...</div>
|
|
71
|
+
) : previewUrl ? (
|
|
72
|
+
<img src={previewUrl} alt={item.name} />
|
|
73
|
+
) : (
|
|
74
|
+
<div className="error-placeholder">Preview not available</div>
|
|
75
|
+
)}
|
|
76
|
+
</div>
|
|
77
|
+
)}
|
|
78
|
+
|
|
79
|
+
{/* File Info */}
|
|
80
|
+
<h4>{item.name}</h4>
|
|
81
|
+
<p className="text-secondary">Size: {formatBytes(item.size)}</p>
|
|
82
|
+
<p className="text-secondary">Uploaded: {formatDate(item.uploadedAt)}</p>
|
|
83
|
+
<p className="blob-id text-accent">{item.blobId.slice(0, 16)}...</p>
|
|
84
|
+
<button onClick={handleDelete} className="btn-danger">
|
|
85
|
+
Delete
|
|
86
|
+
</button>
|
|
87
|
+
</div>
|
|
88
|
+
);
|
|
89
|
+
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { useState, useEffect } from 'react';
|
|
2
|
-
import { FileCard } from './
|
|
3
|
-
import { loadIndex } from '
|
|
4
|
-
import type { GalleryItem } from '
|
|
2
|
+
import { FileCard } from './file-card.js';
|
|
3
|
+
import { loadIndex } from '../../utils/index-manager.js';
|
|
4
|
+
import type { GalleryItem } from '../../lib/walrus/types.js';
|
|
5
5
|
|
|
6
6
|
export function GalleryGrid() {
|
|
7
7
|
const [items, setItems] = useState<GalleryItem[]>([]);
|
|
@@ -19,7 +19,7 @@ export function GalleryGrid() {
|
|
|
19
19
|
return (
|
|
20
20
|
<div className="gallery-grid">
|
|
21
21
|
{items.length === 0 ? (
|
|
22
|
-
<p>No files yet. Upload your first file!</p>
|
|
22
|
+
<p className="text-secondary">No files yet. Upload your first file!</p>
|
|
23
23
|
) : (
|
|
24
24
|
items.map((item) => (
|
|
25
25
|
<FileCard key={item.blobId} item={item} onDelete={refreshGallery} />
|
|
@@ -27,4 +27,4 @@ export function GalleryGrid() {
|
|
|
27
27
|
)}
|
|
28
28
|
</div>
|
|
29
29
|
);
|
|
30
|
-
}
|
|
30
|
+
}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import { useState } from 'react';
|
|
2
|
+
import { useUpload } from '../../hooks/use-upload.js';
|
|
3
|
+
import { addItem } from '../../utils/index-manager.js';
|
|
4
|
+
import { generatePreviewUrl, isImageType } from '../../utils/preview-generator.js';
|
|
5
|
+
|
|
6
|
+
interface UploadModalProps {
|
|
7
|
+
onSuccess: () => void;
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
export function UploadModal({ onSuccess }: UploadModalProps) {
|
|
11
|
+
const [file, setFile] = useState<File | null>(null);
|
|
12
|
+
const upload = useUpload();
|
|
13
|
+
|
|
14
|
+
const handleUpload = async () => {
|
|
15
|
+
if (!file) return;
|
|
16
|
+
|
|
17
|
+
upload.mutate(
|
|
18
|
+
{ file, options: { epochs: 1 } },
|
|
19
|
+
{
|
|
20
|
+
onSuccess: async (data) => {
|
|
21
|
+
// Generate preview URL for images
|
|
22
|
+
let previewUrl: string | undefined;
|
|
23
|
+
if (isImageType(file.type)) {
|
|
24
|
+
try {
|
|
25
|
+
previewUrl = await generatePreviewUrl(data.blobId, file.type);
|
|
26
|
+
console.log('Preview URL generated:', previewUrl);
|
|
27
|
+
} catch (error) {
|
|
28
|
+
console.error('Failed to generate preview URL:', error);
|
|
29
|
+
// Continue without preview - FileCard will try to load it later
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
// Add item to gallery with preview URL
|
|
34
|
+
addItem({
|
|
35
|
+
blobId: data.blobId,
|
|
36
|
+
name: file.name,
|
|
37
|
+
size: file.size,
|
|
38
|
+
contentType: file.type,
|
|
39
|
+
uploadedAt: Date.now(),
|
|
40
|
+
previewUrl,
|
|
41
|
+
});
|
|
42
|
+
|
|
43
|
+
setFile(null);
|
|
44
|
+
onSuccess();
|
|
45
|
+
},
|
|
46
|
+
}
|
|
47
|
+
);
|
|
48
|
+
};
|
|
49
|
+
|
|
50
|
+
return (
|
|
51
|
+
<div className="upload-modal">
|
|
52
|
+
<input
|
|
53
|
+
type="file"
|
|
54
|
+
onChange={(e) => setFile(e.target.files?.[0] || null)}
|
|
55
|
+
className="file-input"
|
|
56
|
+
/>
|
|
57
|
+
<button
|
|
58
|
+
onClick={handleUpload}
|
|
59
|
+
disabled={!file || upload.isPending}
|
|
60
|
+
className="btn-primary"
|
|
61
|
+
>
|
|
62
|
+
{upload.isPending ? 'Uploading...' : 'Add to Gallery'}
|
|
63
|
+
</button>
|
|
64
|
+
{upload.error && (
|
|
65
|
+
<p className="text-error">Error: {upload.error.message}</p>
|
|
66
|
+
)}
|
|
67
|
+
</div>
|
|
68
|
+
);
|
|
69
|
+
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { ReactNode } from 'react';
|
|
2
|
+
import { WalletConnect } from '../features/wallet-connect.js';
|
|
3
|
+
|
|
4
|
+
interface LayoutProps {
|
|
5
|
+
children: ReactNode;
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
export function AppLayout({ children }: LayoutProps) {
|
|
9
|
+
return (
|
|
10
|
+
<div className="app-layout">
|
|
11
|
+
<header className="app-header">
|
|
12
|
+
<h1><span className="text-secondary">🌊</span> <span className="text-accent">Walrus</span> App</h1>
|
|
13
|
+
<WalletConnect />
|
|
14
|
+
</header>
|
|
15
|
+
<main className="app-main">{children}</main>
|
|
16
|
+
<footer className="app-footer">
|
|
17
|
+
<p className="text-secondary">Powered by <span className="text-accent">Walrus</span> & <span style={{ color: 'var(--walrus-accent-blue)' }}>Sui</span></p>
|
|
18
|
+
</footer>
|
|
19
|
+
</div>
|
|
20
|
+
);
|
|
21
|
+
}
|
|
@@ -1,21 +1,5 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { storageAdapter } from '../index.js';
|
|
3
|
-
import type { UploadOptions } from '../adapters/storage.js';
|
|
4
|
-
|
|
5
|
-
export function useUpload() {
|
|
6
|
-
return useMutation({
|
|
7
|
-
mutationFn: async ({
|
|
8
|
-
file,
|
|
9
|
-
options,
|
|
10
|
-
}: {
|
|
11
|
-
file: File;
|
|
12
|
-
options?: UploadOptions;
|
|
13
|
-
}) => {
|
|
14
|
-
const blobId = await storageAdapter.upload(file, options);
|
|
15
|
-
return { blobId, file };
|
|
16
|
-
},
|
|
17
|
-
});
|
|
18
|
-
}
|
|
1
|
+
import { useQuery } from '@tanstack/react-query';
|
|
2
|
+
import { storageAdapter } from '../lib/walrus/index.js';
|
|
19
3
|
|
|
20
4
|
export function useDownload(blobId: string | null) {
|
|
21
5
|
return useQuery({
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { useMutation } from '@tanstack/react-query';
|
|
2
|
+
import { storageAdapter } from '../lib/walrus/index.js';
|
|
3
|
+
import type { UploadOptions, SignAndExecuteTransactionArgs } from '../lib/walrus/types.js';
|
|
4
|
+
import { useCurrentAccount, useSignAndExecuteTransaction, useSuiClient } from '@mysten/dapp-kit';
|
|
5
|
+
|
|
6
|
+
export function useUpload() {
|
|
7
|
+
const currentAccount = useCurrentAccount();
|
|
8
|
+
const { mutate: signAndExecute } = useSignAndExecuteTransaction();
|
|
9
|
+
const suiClient = useSuiClient();
|
|
10
|
+
|
|
11
|
+
return useMutation({
|
|
12
|
+
mutationFn: async ({
|
|
13
|
+
file,
|
|
14
|
+
options,
|
|
15
|
+
}: {
|
|
16
|
+
file: File;
|
|
17
|
+
options?: UploadOptions;
|
|
18
|
+
}) => {
|
|
19
|
+
if (!currentAccount) {
|
|
20
|
+
throw new Error('Wallet not connected. Please connect your wallet to upload files.');
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
// Wrap signAndExecute to return Promise
|
|
24
|
+
const signTransaction = (args: SignAndExecuteTransactionArgs) => {
|
|
25
|
+
return new Promise<{ digest: string }>((resolve, reject) => {
|
|
26
|
+
signAndExecute(
|
|
27
|
+
{
|
|
28
|
+
transaction: args.transaction,
|
|
29
|
+
},
|
|
30
|
+
{
|
|
31
|
+
onSuccess: (result) => resolve({ digest: result.digest }),
|
|
32
|
+
onError: (error) => reject(error),
|
|
33
|
+
}
|
|
34
|
+
);
|
|
35
|
+
});
|
|
36
|
+
};
|
|
37
|
+
|
|
38
|
+
const blobId = await storageAdapter.upload(file, {
|
|
39
|
+
...options,
|
|
40
|
+
client: suiClient,
|
|
41
|
+
signer: {
|
|
42
|
+
address: currentAccount.address,
|
|
43
|
+
signAndExecuteTransaction: signTransaction,
|
|
44
|
+
},
|
|
45
|
+
});
|
|
46
|
+
return { blobId, file };
|
|
47
|
+
},
|
|
48
|
+
});
|
|
49
|
+
}
|
|
@@ -1,16 +1,11 @@
|
|
|
1
|
-
import {
|
|
2
|
-
useCurrentAccount,
|
|
3
|
-
useSignAndExecuteTransaction,
|
|
4
|
-
} from '@mysten/dapp-kit';
|
|
1
|
+
import { useCurrentAccount } from '@mysten/dapp-kit';
|
|
5
2
|
|
|
6
3
|
export function useWallet() {
|
|
7
4
|
const currentAccount = useCurrentAccount();
|
|
8
|
-
const { mutate: signAndExecute } = useSignAndExecuteTransaction();
|
|
9
5
|
|
|
10
6
|
return {
|
|
11
|
-
account: currentAccount,
|
|
12
7
|
isConnected: !!currentAccount,
|
|
13
8
|
address: currentAccount?.address,
|
|
14
|
-
|
|
9
|
+
account: currentAccount,
|
|
15
10
|
};
|
|
16
11
|
}
|