From 002f087d39039952d5de4fc08fa455327c827fb1 Mon Sep 17 00:00:00 2001 From: Pedro Rosalba Date: Fri, 4 Oct 2024 08:35:50 -0300 Subject: [PATCH 01/15] meudeus do ceu conserta o package.json --- packages/nextjs/package.json | 2 +- packages/nextjs/utils/simpleNFT/myipfs.ts | 10 ++++++++++ yarn.lock | 10 ++++++++++ 3 files changed, 21 insertions(+), 1 deletion(-) create mode 100644 packages/nextjs/utils/simpleNFT/myipfs.ts diff --git a/packages/nextjs/package.json b/packages/nextjs/package.json index 818e192..46c36fb 100644 --- a/packages/nextjs/package.json +++ b/packages/nextjs/package.json @@ -14,7 +14,6 @@ "format:check": "prettier --check ." }, "dependencies": { - "lucide-react": "^latest-version", "@heroicons/react": "^2.1.3", "@next/font": "^14.2.1", "@radix-ui/react-icons": "1.3.0", @@ -28,6 +27,7 @@ "get-starknet-core": "^3.3.0", "ipfs-utils": "^9.0.14", "kubo-rpc-client": "^4.0.1", + "lucide-react": "0.447.0", "next": "14.1.3", "next-themes": "^0.2.1", "nprogress": "^0.2.0", diff --git a/packages/nextjs/utils/simpleNFT/myipfs.ts b/packages/nextjs/utils/simpleNFT/myipfs.ts new file mode 100644 index 0000000..c786e52 --- /dev/null +++ b/packages/nextjs/utils/simpleNFT/myipfs.ts @@ -0,0 +1,10 @@ +import { NextResponse } from 'next/server'; +import { revalidatePath } from 'next/cache'; +import { PinataSDK } from 'pinata'; +import path from 'path'; + +export const pinata = new PinataSDK({ + pinataJwt: process.env.PINATA_JWT as string, + pinataGateway: process.env.HOST as string, +}); + diff --git a/yarn.lock b/yarn.lock index eacdff0..229ad51 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1825,6 +1825,7 @@ __metadata: get-starknet-core: ^3.3.0 ipfs-utils: ^9.0.14 kubo-rpc-client: ^4.0.1 + lucide-react: 0.447.0 next: 14.1.3 next-themes: ^0.2.1 nprogress: ^0.2.0 @@ -6129,6 +6130,15 @@ __metadata: languageName: node linkType: hard +"lucide-react@npm:0.447.0": + version: 0.447.0 + resolution: "lucide-react@npm:0.447.0" + peerDependencies: + react: ^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0-rc + checksum: c634a6d6fac1799d3ba8c342dd95be75a9c2a74db9576d875b77008f31a9bfb3b0128c039d41dbe5bbdece7e200c6ae3e89760f2e8674863cd972046bdb2b82f + languageName: node + linkType: hard + "lucide-react@npm:^0.445.0": version: 0.445.0 resolution: "lucide-react@npm:0.445.0" From 326a24bc2ae4bc709de59103dac84ade116f67f1 Mon Sep 17 00:00:00 2001 From: Pedro Rosalba Date: Fri, 4 Oct 2024 09:23:16 -0300 Subject: [PATCH 02/15] pinata --- package.json | 1 + packages/nextjs/app/api/upload-ipfs/route.ts | 102 ++++++---- .../simpleNFT/{myipfs.ts => pinataClient.ts} | 2 +- yarn.lock | 187 +++++++++++++++++- 4 files changed, 255 insertions(+), 37 deletions(-) rename packages/nextjs/utils/simpleNFT/{myipfs.ts => pinataClient.ts} (84%) diff --git a/package.json b/package.json index 54aeced..af3ff42 100644 --- a/package.json +++ b/package.json @@ -35,6 +35,7 @@ "dependencies": { "framer-motion": "^11.5.6", "lucide-react": "^0.445.0", + "pinata-web3": "^0.5.0", "postcss": "^8.4.38" } } diff --git a/packages/nextjs/app/api/upload-ipfs/route.ts b/packages/nextjs/app/api/upload-ipfs/route.ts index d153a7d..372f91e 100644 --- a/packages/nextjs/app/api/upload-ipfs/route.ts +++ b/packages/nextjs/app/api/upload-ipfs/route.ts @@ -1,43 +1,75 @@ import { NextApiRequest, NextApiResponse } from 'next'; -import { ipfsClient } from '~~/utils/simpleNFT/ipfs'; +import { NextRequest, NextResponse } from 'next/server'; +// import { ipfsClient } from '~~/utils/simpleNFT/ipfs'; import { IP } from '~~/app/registerIP/page'; +import { pinataClient } from '~~/utils/simpleNFT/pinataClient'; -export default async function handler(req: NextApiRequest, res: NextApiResponse) { - if (req.method === 'POST') { - const { title, description, authors, ipType }: IP = req.body; +export const config = { + api: { + bodyParser: false, + }, +}; + +export async function POST(request: NextRequest){ + try{ + const data = await request.formData(); //ta dando alguma merda aqui com o get, ver o tipo + //da variavel data que eh o que a gente recebe do request + // if(data == null){ + // return NextResponse.json( + // { error: "Bad Request" }, + // { status: 401 } + // ); + // } else { + const file: File | null = data.get("file") as unknown as File; + const uploadData = await pinataClient.upload.file(file); + const url = await pinataClient.gateways.convert(uploadData.IpfsHash); + return NextResponse.json(url, { status: 200 }); + // } + } catch (e) { + console.log(e); + return NextResponse.json( + { error: "Internal Server Error" }, + { status: 500 } + ); + } +} + +// export default async function handler(req: NextApiRequest, res: NextApiResponse) { +// if (req.method === 'POST') { +// const { title, description, authors, ipType }: IP = req.body; - try { - // Upload intellectual property metadata to IPFS - const ipMetadata = { - title, - description, - authors, - ipType, - }; +// try { +// // Upload intellectual property metadata to IPFS +// const ipMetadata = { +// title, +// description, +// authors, +// ipType, +// }; - const added = await ipfsClient.add(JSON.stringify(ipMetadata)); - const ipfsHash = added.path; +// const added = await ipfsClient.add(JSON.stringify(ipMetadata)); +// const ipfsHash = added.path; - // Generate NFT metadata - const nftMetadata = { - name: title, - description: description, - authors: authors, - ipfsHash, - image: `https://ipfs.infura.io/ipfs/${ipfsHash}`, // Optional: if file is an image - }; +// // Generate NFT metadata +// const nftMetadata = { +// name: title, +// description: description, +// authors: authors, +// ipfsHash, +// image: `https://ipfs.infura.io/ipfs/${ipfsHash}`, // Optional: if file is an image +// }; - // Optionally: Upload NFT metadata to IPFS - const metadataAdded = await ipfsClient.add(JSON.stringify(nftMetadata)); - const metadataHash = metadataAdded.path; +// // Optionally: Upload NFT metadata to IPFS +// const metadataAdded = await ipfsClient.add(JSON.stringify(nftMetadata)); +// const metadataHash = metadataAdded.path; - res.status(200).json({ metadataHash, nftMetadata }); - } catch (error) { - console.error('Error uploading to IPFS:', error); - res.status(500).json({ error: 'Failed to upload to IPFS' }); - } - } else { - res.setHeader('Allow', ['POST']); - res.status(405).end(`Method ${req.method} Not Allowed`); - } - } \ No newline at end of file +// res.status(200).json({ metadataHash, nftMetadata }); +// } catch (error) { +// console.error('Error uploading to IPFS:', error); +// res.status(500).json({ error: 'Failed to upload to IPFS' }); +// } +// } else { +// res.setHeader('Allow', ['POST']); +// res.status(405).end(`Method ${req.method} Not Allowed`); +// } +// } \ No newline at end of file diff --git a/packages/nextjs/utils/simpleNFT/myipfs.ts b/packages/nextjs/utils/simpleNFT/pinataClient.ts similarity index 84% rename from packages/nextjs/utils/simpleNFT/myipfs.ts rename to packages/nextjs/utils/simpleNFT/pinataClient.ts index c786e52..f073bd1 100644 --- a/packages/nextjs/utils/simpleNFT/myipfs.ts +++ b/packages/nextjs/utils/simpleNFT/pinataClient.ts @@ -3,7 +3,7 @@ import { revalidatePath } from 'next/cache'; import { PinataSDK } from 'pinata'; import path from 'path'; -export const pinata = new PinataSDK({ +export const pinataClient = new PinataSDK({ pinataJwt: process.env.PINATA_JWT as string, pinataGateway: process.env.HOST as string, }); diff --git a/yarn.lock b/yarn.lock index 229ad51..549ada2 100644 --- a/yarn.lock +++ b/yarn.lock @@ -401,6 +401,15 @@ __metadata: languageName: node linkType: hard +"@multiformats/mafmt@npm:^12.1.6": + version: 12.1.6 + resolution: "@multiformats/mafmt@npm:12.1.6" + dependencies: + "@multiformats/multiaddr": ^12.0.0 + checksum: eb0f98c7cac72a509013b4e214fc2bc94e8c0bee22740e0420a3a74deb535fb1b83990c8cd5d652e3b80c693687408a77e7a2c14800bd7f7ddb271639245e5b4 + languageName: node + linkType: hard + "@multiformats/multiaddr-to-uri@npm:^10.0.1": version: 10.1.0 resolution: "@multiformats/multiaddr-to-uri@npm:10.1.0" @@ -410,6 +419,20 @@ __metadata: languageName: node linkType: hard +"@multiformats/multiaddr@npm:^12.0.0, @multiformats/multiaddr@npm:^12.1.14": + version: 12.3.1 + resolution: "@multiformats/multiaddr@npm:12.3.1" + dependencies: + "@chainsafe/is-ip": ^2.0.1 + "@chainsafe/netmask": ^2.0.0 + "@multiformats/dns": ^1.0.3 + multiformats: ^13.0.0 + uint8-varint: ^2.0.1 + uint8arrays: ^5.0.0 + checksum: 086a71f86caeb441ea8895e497d7ce1e46d8bda881bc275812054b02a94d08323f100ca78d1ff9979347488145563b492d1d4ffc8d800baf5ce5c726d02af451 + languageName: node + linkType: hard + "@multiformats/multiaddr@npm:^12.2.1, @multiformats/multiaddr@npm:^12.2.3, @multiformats/multiaddr@npm:^12.3.0": version: 12.3.0 resolution: "@multiformats/multiaddr@npm:12.3.0" @@ -2904,6 +2927,13 @@ __metadata: languageName: node linkType: hard +"asynckit@npm:^0.4.0": + version: 0.4.0 + resolution: "asynckit@npm:0.4.0" + checksum: 7b78c451df768adba04e2d02e63e2d0bf3b07adcd6e42b4cf665cb7ce899bedd344c69a1dcbce355b5f972d597b25aaa1c1742b52cffd9caccb22f348114f6be + languageName: node + linkType: hard + "autoprefixer@npm:^10.0.1": version: 10.4.20 resolution: "autoprefixer@npm:10.4.20" @@ -2938,6 +2968,17 @@ __metadata: languageName: node linkType: hard +"axios@npm:^1.7.7": + version: 1.7.7 + resolution: "axios@npm:1.7.7" + dependencies: + follow-redirects: ^1.15.6 + form-data: ^4.0.0 + proxy-from-env: ^1.1.0 + checksum: 882d4fe0ec694a07c7f5c1f68205eb6dc5a62aecdb632cc7a4a3d0985188ce3030e0b277e1a8260ac3f194d314ae342117660a151fabffdc5081ca0b5a8b47fe + languageName: node + linkType: hard + "axobject-query@npm:~3.1.1": version: 3.1.1 resolution: "axobject-query@npm:3.1.1" @@ -3297,6 +3338,15 @@ __metadata: languageName: node linkType: hard +"combined-stream@npm:^1.0.8": + version: 1.0.8 + resolution: "combined-stream@npm:1.0.8" + dependencies: + delayed-stream: ~1.0.0 + checksum: 49fa4aeb4916567e33ea81d088f6584749fc90c7abec76fd516bf1c5aa5c79f3584b5ba3de6b86d26ddd64bae5329c4c7479343250cfe71c75bb366eae53bb7c + languageName: node + linkType: hard + "commander@npm:^4.0.0": version: 4.1.1 resolution: "commander@npm:4.1.1" @@ -3430,6 +3480,13 @@ __metadata: languageName: node linkType: hard +"data-uri-to-buffer@npm:^4.0.0": + version: 4.0.1 + resolution: "data-uri-to-buffer@npm:4.0.1" + checksum: 0d0790b67ffec5302f204c2ccca4494f70b4e2d940fea3d36b09f0bb2b8539c2e86690429eb1f1dc4bcc9e4df0644193073e63d9ee48ac9fce79ec1506e4aa4c + languageName: node + linkType: hard + "data-view-buffer@npm:^1.0.1": version: 1.0.1 resolution: "data-view-buffer@npm:1.0.1" @@ -3548,6 +3605,13 @@ __metadata: languageName: node linkType: hard +"delayed-stream@npm:~1.0.0": + version: 1.0.0 + resolution: "delayed-stream@npm:1.0.0" + checksum: 46fe6e83e2cb1d85ba50bd52803c68be9bd953282fa7096f51fc29edd5d67ff84ff753c51966061e5ba7cb5e47ef6d36a91924eddb7f3f3483b1c560f77a0020 + languageName: node + linkType: hard + "delegates@npm:^1.0.0": version: 1.0.0 resolution: "delegates@npm:1.0.0" @@ -4581,6 +4645,16 @@ __metadata: languageName: node linkType: hard +"fetch-blob@npm:^3.1.2, fetch-blob@npm:^3.1.4": + version: 3.2.0 + resolution: "fetch-blob@npm:3.2.0" + dependencies: + node-domexception: ^1.0.0 + web-streams-polyfill: ^3.0.3 + checksum: f19bc28a2a0b9626e69fd7cf3a05798706db7f6c7548da657cbf5026a570945f5eeaedff52007ea35c8bcd3d237c58a20bf1543bc568ab2422411d762dd3d5bf + languageName: node + linkType: hard + "fetch-cookie@npm:^3.0.0": version: 3.0.1 resolution: "fetch-cookie@npm:3.0.1" @@ -4656,6 +4730,16 @@ __metadata: languageName: node linkType: hard +"follow-redirects@npm:^1.15.6": + version: 1.15.9 + resolution: "follow-redirects@npm:1.15.9" + peerDependenciesMeta: + debug: + optional: true + checksum: 859e2bacc7a54506f2bf9aacb10d165df78c8c1b0ceb8023f966621b233717dab56e8d08baadc3ad3b9db58af290413d585c999694b7c146aaf2616340c3d2a6 + languageName: node + linkType: hard + "for-each@npm:^0.3.3": version: 0.3.3 resolution: "for-each@npm:0.3.3" @@ -4675,6 +4759,26 @@ __metadata: languageName: node linkType: hard +"form-data@npm:^4.0.0": + version: 4.0.0 + resolution: "form-data@npm:4.0.0" + dependencies: + asynckit: ^0.4.0 + combined-stream: ^1.0.8 + mime-types: ^2.1.12 + checksum: 01135bf8675f9d5c61ff18e2e2932f719ca4de964e3be90ef4c36aacfc7b9cb2fceb5eca0b7e0190e3383fe51c5b37f4cb80b62ca06a99aaabfcfd6ac7c9328c + languageName: node + linkType: hard + +"formdata-polyfill@npm:^4.0.10": + version: 4.0.10 + resolution: "formdata-polyfill@npm:4.0.10" + dependencies: + fetch-blob: ^3.1.2 + checksum: 82a34df292afadd82b43d4a740ce387bc08541e0a534358425193017bf9fb3567875dc5f69564984b1da979979b70703aa73dee715a17b6c229752ae736dd9db + languageName: node + linkType: hard + "fraction.js@npm:^4.3.7": version: 4.3.7 resolution: "fraction.js@npm:4.3.7" @@ -5529,6 +5633,19 @@ __metadata: languageName: node linkType: hard +"is-ipfs@npm:^8.0.4": + version: 8.0.4 + resolution: "is-ipfs@npm:8.0.4" + dependencies: + "@multiformats/mafmt": ^12.1.6 + "@multiformats/multiaddr": ^12.1.14 + iso-url: ^1.1.3 + multiformats: ^13.0.1 + uint8arrays: ^5.0.1 + checksum: 89caa825f1001e466c34e2f2c30eb07031032bb7a051c7b47412c3408a12293576280ddadd337b8324f0611979e87f8625d33f918a171903f72a7ff8ccd62cab + languageName: node + linkType: hard + "is-lambda@npm:^1.0.1": version: 1.0.1 resolution: "is-lambda@npm:1.0.1" @@ -5694,7 +5811,7 @@ __metadata: languageName: node linkType: hard -"iso-url@npm:^1.1.5, iso-url@npm:^1.2.1": +"iso-url@npm:^1.1.3, iso-url@npm:^1.1.5, iso-url@npm:^1.2.1": version: 1.2.1 resolution: "iso-url@npm:1.2.1" checksum: 1af98c4ed6a39598407fd8c3c13e997c978985f477af2be3390d2aa3e422b4b5992ffbb0dac68656b165c71850fff748ac1309d29d4f2a728707d76bf0f98557 @@ -6230,6 +6347,22 @@ __metadata: languageName: node linkType: hard +"mime-db@npm:1.52.0": + version: 1.52.0 + resolution: "mime-db@npm:1.52.0" + checksum: 0d99a03585f8b39d68182803b12ac601d9c01abfa28ec56204fa330bc9f3d1c5e14beb049bafadb3dbdf646dfb94b87e24d4ec7b31b7279ef906a8ea9b6a513f + languageName: node + linkType: hard + +"mime-types@npm:^2.1.12": + version: 2.1.35 + resolution: "mime-types@npm:2.1.35" + dependencies: + mime-db: 1.52.0 + checksum: 89a5b7f1def9f3af5dad6496c5ed50191ae4331cc5389d7c521c8ad28d5fdad2d06fd81baf38fed813dc4e46bb55c8145bb0ff406330818c9cf712fb2e9b3836 + languageName: node + linkType: hard + "mimic-fn@npm:^2.1.0": version: 2.1.0 resolution: "mimic-fn@npm:2.1.0" @@ -6436,6 +6569,13 @@ __metadata: languageName: node linkType: hard +"multiformats@npm:^13.0.1": + version: 13.3.0 + resolution: "multiformats@npm:13.3.0" + checksum: 9e9da3a61e26ad22ad93fad2a61a256c4c5ad6d2290048f7297430b9afc1f4e82b30a802d2b36385c4a87772d3f5de81e43b6538b9c4d74719564feb70cca382 + languageName: node + linkType: hard + "multiformats@npm:~13.1.3": version: 13.1.3 resolution: "multiformats@npm:13.1.3" @@ -6570,6 +6710,13 @@ __metadata: languageName: node linkType: hard +"node-domexception@npm:^1.0.0": + version: 1.0.0 + resolution: "node-domexception@npm:1.0.0" + checksum: ee1d37dd2a4eb26a8a92cd6b64dfc29caec72bff5e1ed9aba80c294f57a31ba4895a60fd48347cf17dd6e766da0ae87d75657dfd1f384ebfa60462c2283f5c7f + languageName: node + linkType: hard + "node-fetch@npm:2.6.7": version: 2.6.7 resolution: "node-fetch@npm:2.6.7" @@ -6612,6 +6759,17 @@ __metadata: languageName: node linkType: hard +"node-fetch@npm:^3.3.1": + version: 3.3.2 + resolution: "node-fetch@npm:3.3.2" + dependencies: + data-uri-to-buffer: ^4.0.0 + fetch-blob: ^3.1.4 + formdata-polyfill: ^4.0.10 + checksum: 06a04095a2ddf05b0830a0d5302699704d59bda3102894ea64c7b9d4c865ecdff2d90fd042df7f5bc40337266961cb6183dcc808ea4f3000d024f422b462da92 + languageName: node + linkType: hard + "node-gyp-build@npm:^4.2.2": version: 4.8.1 resolution: "node-gyp-build@npm:4.8.1" @@ -7089,6 +7247,18 @@ __metadata: languageName: node linkType: hard +"pinata-web3@npm:^0.5.0": + version: 0.5.0 + resolution: "pinata-web3@npm:0.5.0" + dependencies: + axios: ^1.7.7 + form-data: ^4.0.0 + is-ipfs: ^8.0.4 + node-fetch: ^3.3.1 + checksum: 3678c2f779070fb4edc862b13ff14bd6768dffbb8bda498a603f29e207c38c475c3d2a246a7cfb184d96a4c2a54b08cb7c494d67dc46a4d7a4905e81a23c009b + languageName: node + linkType: hard + "pinst@npm:^3.0.0": version: 3.0.0 resolution: "pinst@npm:3.0.0" @@ -7311,6 +7481,13 @@ __metadata: languageName: node linkType: hard +"proxy-from-env@npm:^1.1.0": + version: 1.1.0 + resolution: "proxy-from-env@npm:1.1.0" + checksum: ed7fcc2ba0a33404958e34d95d18638249a68c430e30fcb6c478497d72739ba64ce9810a24f53a7d921d0c065e5b78e3822759800698167256b04659366ca4d4 + languageName: node + linkType: hard + "psl@npm:^1.1.33": version: 1.9.0 resolution: "psl@npm:1.9.0" @@ -8015,6 +8192,7 @@ __metadata: framer-motion: ^11.5.6 husky: ^9.0.11 lucide-react: ^0.445.0 + pinata-web3: ^0.5.0 pinst: ^3.0.0 postcss: ^8.4.38 prettier: ^3.2.5 @@ -9064,6 +9242,13 @@ __metadata: languageName: node linkType: hard +"web-streams-polyfill@npm:^3.0.3": + version: 3.3.3 + resolution: "web-streams-polyfill@npm:3.3.3" + checksum: 21ab5ea08a730a2ef8023736afe16713b4f2023ec1c7085c16c8e293ee17ed085dff63a0ad8722da30c99c4ccbd4ccd1b2e79c861829f7ef2963d7de7004c2cb + languageName: node + linkType: hard + "web-vitals@npm:0.2.4": version: 0.2.4 resolution: "web-vitals@npm:0.2.4" From ab189be76d88df99d9f8546022df21e95295145b Mon Sep 17 00:00:00 2001 From: Pedro Rosalba Date: Fri, 4 Oct 2024 10:35:27 -0300 Subject: [PATCH 03/15] ipfs pinata working --- packages/nextjs/app/api/upload-ipfs/route.ts | 2 + packages/nextjs/app/registerIP/page.tsx | 279 ++++++++++-------- .../nextjs/utils/simpleNFT/pinataClient.ts | 2 +- 3 files changed, 162 insertions(+), 121 deletions(-) diff --git a/packages/nextjs/app/api/upload-ipfs/route.ts b/packages/nextjs/app/api/upload-ipfs/route.ts index 372f91e..4de7af4 100644 --- a/packages/nextjs/app/api/upload-ipfs/route.ts +++ b/packages/nextjs/app/api/upload-ipfs/route.ts @@ -23,6 +23,8 @@ export async function POST(request: NextRequest){ const file: File | null = data.get("file") as unknown as File; const uploadData = await pinataClient.upload.file(file); const url = await pinataClient.gateways.convert(uploadData.IpfsHash); + + console.log(url); return NextResponse.json(url, { status: 200 }); // } } catch (e) { diff --git a/packages/nextjs/app/registerIP/page.tsx b/packages/nextjs/app/registerIP/page.tsx index 45a992a..09f7572 100644 --- a/packages/nextjs/app/registerIP/page.tsx +++ b/packages/nextjs/app/registerIP/page.tsx @@ -30,6 +30,9 @@ const registerIP = () => { const { address: connectedAddress, isConnected, isConnecting } = useAccount(); const [status, setStatus] = useState("Mint NFT"); const [ipfsHash, setipfsHash] = useState(""); + const [loading, setLoading] = useState(false); + + const [file, setFile] = useState(); const { writeAsync: mintItem } = useScaffoldWriteContract({ contractName: "YourCollectible", @@ -84,12 +87,17 @@ const registerIP = () => { ipType: '', }); - const [loading, setLoading] = useState(false); - const handleChange = (e: React.ChangeEvent) => { - const { name, value } = e.target; - setIpData((prev) => ({ ...prev, [name]: value })); - console.log(e.target); + const handleChange = (e: React.ChangeEvent + // | HTMLTextAreaElement> + ) => { + + // const { name, value } = e.target; + // setIpData((prev) => ({ ...prev, [name]: value })); + // console.log(e.target); + + setFile(e.target?.files?.[0]); + }; const getNextSubmissionId = () => { @@ -104,24 +112,48 @@ const registerIP = () => { }; - const handleSubmit = async (event: FormEvent) => { - event.preventDefault(); // Prevent form from refreshing the page - + const handleSubmit = async ( + // event: FormEvent + ) => { + // event.preventDefault(); // Prevent form from refreshing the page try { - const response = await fetch('/api/upload-ipfs', { - method: 'POST', - headers: { - 'Content-Type': 'application/json', - }, - body: JSON.stringify(ipData), + if (!file) { + alert("No file selected"); + return; + } + + setLoading(true); + const data = new FormData(); + data.set("file", file); + const uploadRequest = await fetch("/api/upload-ipfs", { + method: "POST", + body: data, }); - const data = await response.json(); - setipfsHash(data.metadataHash); - - } catch (error) { - console.error('Error uploading to IPFS:', error); + const ipfsUrl = await uploadRequest.json(); + setipfsHash(ipfsUrl); + setLoading(false); + } catch (e) { + console.log(e); + setLoading(false); + alert("Trouble uploading file"); } - setLoading(false); + // try { + // const response = await fetch('/api/upload-ipfs', { + // method: 'POST', + // headers: { + // 'Content-Type': 'application/json', + // }, + // body: JSON.stringify(ipData), + // }); + // console.log("POST done, waiting for response"); + // const data = await response.json(); + // setipfsHash(data.metadataHash); + + // } catch (error) { + // console.error('Error uploading to IPFS:', error); + // } + // setLoading(false); + // const formData = new FormData(event.currentTarget); // Use FormData to access form fields @@ -143,116 +175,123 @@ const registerIP = () => { }; + return ( - <> -
-
-

Register New IP

-

Secure your intellectual property on the blockchain. Fill out the form below to register your IP.

- -
-
+ // <> + //
+ //
+ //

Register New IP

+ //

Secure your intellectual property on the blockchain. Fill out the form below to register your IP.

+ + //
+ //
-
- {!isConnected || isConnecting ? ( - - ) : ( + //
+ // {!isConnected || isConnecting ? ( + // + // ) : ( -
+ //
-
-
- - -
-
- - -
-
- - -
-
- - -
-
- - -
- -
-
-

Why Register Your IP on the Blockchain?

-
    -
  • Immutable proof of ownership and timestamp
  • -
  • Increased transparency and reduced fraud
  • -
  • Simplified licensing and transfer processes
  • -
  • Global accessibility and recognition
  • -
-
-
- - - - - - - )} -
+ //
+ //
+ // + // + //
+ //
+ // + // + //
+ //
+ // + // + //
+ //
+ // + // + //
+ //
+ // + // + //
+ // + //
+ //
+ //

Why Register Your IP on the Blockchain?

+ //
    + //
  • Immutable proof of ownership and timestamp
  • + //
  • Increased transparency and reduced fraud
  • + //
  • Simplified licensing and transfer processes
  • + //
  • Global accessibility and recognition
  • + //
+ //
+ //
+ + + + + + + // )} + //
- + // +
+ + +
); }; diff --git a/packages/nextjs/utils/simpleNFT/pinataClient.ts b/packages/nextjs/utils/simpleNFT/pinataClient.ts index f073bd1..e5b0844 100644 --- a/packages/nextjs/utils/simpleNFT/pinataClient.ts +++ b/packages/nextjs/utils/simpleNFT/pinataClient.ts @@ -1,6 +1,6 @@ import { NextResponse } from 'next/server'; import { revalidatePath } from 'next/cache'; -import { PinataSDK } from 'pinata'; +import { PinataSDK } from 'pinata-web3'; import path from 'path'; export const pinataClient = new PinataSDK({ From b0133a337df8678f892e33e9cc569cf52023c16b Mon Sep 17 00:00:00 2001 From: Pedro Rosalba Date: Fri, 4 Oct 2024 11:23:57 -0300 Subject: [PATCH 04/15] andando --- packages/nextjs/app/api/forms-ipfs/route.ts | 48 ++++ packages/nextjs/app/api/upload-ipfs/route.ts | 21 +- packages/nextjs/app/registerIP/[id]/page.tsx | 0 packages/nextjs/app/registerIP/page.tsx | 2 +- packages/nextjs/app/uploadIP/page.tsx | 258 ++++++++++++++++++ .../scaffold-stark/fetchPriceFromCoingecko.ts | 10 +- 6 files changed, 319 insertions(+), 20 deletions(-) create mode 100644 packages/nextjs/app/api/forms-ipfs/route.ts delete mode 100644 packages/nextjs/app/registerIP/[id]/page.tsx create mode 100644 packages/nextjs/app/uploadIP/page.tsx diff --git a/packages/nextjs/app/api/forms-ipfs/route.ts b/packages/nextjs/app/api/forms-ipfs/route.ts new file mode 100644 index 0000000..36c4512 --- /dev/null +++ b/packages/nextjs/app/api/forms-ipfs/route.ts @@ -0,0 +1,48 @@ +import { NextApiRequest, NextApiResponse } from 'next'; +import { NextRequest, NextResponse } from 'next/server'; +import { IP } from '~~/app/registerIP/page'; +import { pinataClient } from '~~/utils/simpleNFT/pinataClient'; + +export const config = { + api: { + bodyParser: false, + }, +}; + +export async function POST(request: NextRequest){ + try{ + + // const data = await request.formData(); + + const mockedData = { + title: 'mocktitle', + description: 'mockdescription', + authors: 'mockauthors', + ipType: 'mockiptype', + uploadFile:'' + }; + + const data = request.json(); + // const file: File | null = data.get("file") as unknown as File; + + console.log(data); + + const uploadMockedData = await pinataClient.upload.json(mockedData); + const mockedUrl = await pinataClient.gateways.convert(uploadMockedData.IpfsHash); + + console.log(mockedUrl); + + const uploadData = await pinataClient.upload.json(data); + const url = await pinataClient.gateways.convert(uploadData.IpfsHash); + + console.log(url); + + return NextResponse.json(url, { status: 200 }); + } catch (e) { + console.log(e); + return NextResponse.json( + { error: "Internal Server Error" }, + { status: 500 } + ); + } +} \ No newline at end of file diff --git a/packages/nextjs/app/api/upload-ipfs/route.ts b/packages/nextjs/app/api/upload-ipfs/route.ts index 4de7af4..234ec6c 100644 --- a/packages/nextjs/app/api/upload-ipfs/route.ts +++ b/packages/nextjs/app/api/upload-ipfs/route.ts @@ -12,21 +12,14 @@ export const config = { export async function POST(request: NextRequest){ try{ - const data = await request.formData(); //ta dando alguma merda aqui com o get, ver o tipo - //da variavel data que eh o que a gente recebe do request - // if(data == null){ - // return NextResponse.json( - // { error: "Bad Request" }, - // { status: 401 } - // ); - // } else { - const file: File | null = data.get("file") as unknown as File; - const uploadData = await pinataClient.upload.file(file); - const url = await pinataClient.gateways.convert(uploadData.IpfsHash); + + const data = await request.formData(); + const file: File | null = data.get("file") as unknown as File; + const uploadData = await pinataClient.upload.file(file); + const url = await pinataClient.gateways.convert(uploadData.IpfsHash); - console.log(url); - return NextResponse.json(url, { status: 200 }); - // } + console.log(url); + return NextResponse.json(url, { status: 200 }); } catch (e) { console.log(e); return NextResponse.json( diff --git a/packages/nextjs/app/registerIP/[id]/page.tsx b/packages/nextjs/app/registerIP/[id]/page.tsx deleted file mode 100644 index e69de29..0000000 diff --git a/packages/nextjs/app/registerIP/page.tsx b/packages/nextjs/app/registerIP/page.tsx index 09f7572..45db6cb 100644 --- a/packages/nextjs/app/registerIP/page.tsx +++ b/packages/nextjs/app/registerIP/page.tsx @@ -125,7 +125,7 @@ const registerIP = () => { setLoading(true); const data = new FormData(); data.set("file", file); - const uploadRequest = await fetch("/api/upload-ipfs", { + const uploadRequest = await fetch("/api/forms-ipfs", { method: "POST", body: data, }); diff --git a/packages/nextjs/app/uploadIP/page.tsx b/packages/nextjs/app/uploadIP/page.tsx new file mode 100644 index 0000000..cd4210f --- /dev/null +++ b/packages/nextjs/app/uploadIP/page.tsx @@ -0,0 +1,258 @@ +"use client"; + +import { useRouter } from "next/navigation"; // Correct import for client-side navigation +import type { NextPage } from "next"; +import { useAccount } from "@starknet-react/core"; +import { CustomConnectButton } from "~~/components/scaffold-stark/CustomConnectButton"; +import { MyHoldings } from "~~/components/SimpleNFT/MyHoldings"; +import { useScaffoldReadContract } from "~~/hooks/scaffold-stark/useScaffoldReadContract"; +import { useScaffoldWriteContract } from "~~/hooks/scaffold-stark/useScaffoldWriteContract"; +import { notification } from "~~/utils/scaffold-stark"; +import { addToIPFS } from "~~/utils/simpleNFT/ipfs-fetch"; +import nftsMetadata from "~~/utils/simpleNFT/nftsMetadata"; +import { useState, FormEvent, useRef} from "react"; +import { FilePlus } from 'lucide-react'; +import { id } from "ethers"; +// import { customizeNftMetadata } from "~~/utils/simpleNFT/nftsMetadata"; + +export type IPType = "" | "patent" | "trademark" | "copyright" | "trade_secret"; + +export interface IP{ + title: string, + description: string, + authors: string[], + ipType: IPType, + uploadFile?: File, +} + + +const uploadIP = () => { + + const router = useRouter(); + const { address: connectedAddress, isConnected, isConnecting } = useAccount(); + const [status, setStatus] = useState("Mint NFT"); + const [ipfsHash, setipfsHash] = useState(""); + const [loading, setLoading] = useState(false); + + const [file, setFile] = useState(); + + const { writeAsync: mintItem } = useScaffoldWriteContract({ + contractName: "YourCollectible", + functionName: "mint_item", + args: [connectedAddress, ""], + }); + + const { data: tokenIdCounter, refetch } = useScaffoldReadContract({ + contractName: "YourCollectible", + functionName: "current", + watch: false, + }); + + const handleMintItem = async () => { + setStatus("Minting NFT"); + // circle back to the zero item if we've reached the end of the array + if (tokenIdCounter === undefined) { + setStatus("Mint NFT"); + return; + } + + const tokenIdCounterNumber = Number(tokenIdCounter); + + const notificationId = notification.loading("Uploading to IPFS"); + try { + + // First remove previous loading notification and then show success notification + notification.remove(notificationId); + notification.success("Metadata uploaded to IPFS"); + + await mintItem({ + args: [connectedAddress, ipfsHash], + }); + setStatus("Updating NFT List"); + refetch(); + } catch (error) { + notification.remove(notificationId); + console.error(error); + setStatus("Mint NFT"); + } + }; + const [ipData, setIpData] = useState({ + title: '', + description: '', + authors: [], + ipType: '', + }); + + + const handleChange = (e: React.ChangeEvent + ) => { + + const { name, value } = e.target; + setIpData((prev) => ({ ...prev, [name]: value })); + console.log(e.target); + + + }; + + const handleSubmit = async ( + event: FormEvent + ) => { + event.preventDefault(); // Prevent form from refreshing the page + try { + const response = await fetch('/api/forms-ipfs', { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + body: JSON.stringify(ipData), + }); + + console.log(ipData); + console.log(response.body); + console.log("POST done, waiting for response"); + + const data = await response.json(); + setipfsHash(data.metadataHash); + + } catch (error) { + console.error('Error uploading to IPFS:', error); + } + setLoading(false); + + + const formData = new FormData(event.currentTarget); // Use FormData to access form fields + + const title = formData.get("title") as string; + const description = formData.get("description") as string; + const authors = (formData.get("authors") as string).split(",").map(author => author.trim()); + const ipType = formData.get("type") as IPType; + const uploadFile = formData.get("file") as File; + + const ip: IP = { + title, + description, + authors, + ipType, + uploadFile, + }; + + handleMintItem(); + + }; + + + return ( + <> +
+
+

Register New IP

+

Secure your intellectual property on the blockchain. Fill out the form below to register your IP.

+ +
+
+ + +
+ {!isConnected || isConnecting ? ( + + ) : ( + + +
+ +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+ +
+
+

Why Register Your IP on the Blockchain?

+
    +
  • Immutable proof of ownership and timestamp
  • +
  • Increased transparency and reduced fraud
  • +
  • Simplified licensing and transfer processes
  • +
  • Global accessibility and recognition
  • +
+
+
+ + + + + + + )} +
+ + + + + + ); +}; + +export default uploadIP; diff --git a/packages/nextjs/utils/scaffold-stark/fetchPriceFromCoingecko.ts b/packages/nextjs/utils/scaffold-stark/fetchPriceFromCoingecko.ts index 801258b..91f6527 100644 --- a/packages/nextjs/utils/scaffold-stark/fetchPriceFromCoingecko.ts +++ b/packages/nextjs/utils/scaffold-stark/fetchPriceFromCoingecko.ts @@ -13,7 +13,7 @@ export const fetchPriceFromCoingecko = async ( // Check cache first if (priceCache[symbol] !== undefined) { - console.log(`Returning cached price for ${symbol}`); + // console.log(`Returning cached price for ${symbol}`); return priceCache[symbol]; } @@ -37,16 +37,16 @@ const updatePriceCache = async ( const data = await response.json(); const price = symbol === "ETH" ? data.ethereum.usd : data.starknet.usd; priceCache[symbol] = price; - console.log(`Price updated for ${symbol}: ${price}`); + // console.log(`Price updated for ${symbol}: ${price}`); return price; } catch (error) { console.error( - `Attempt ${attempt + 1} - Error fetching ${symbol} price from Coingecko: `, + ``, error, ); attempt++; if (attempt === retries) { - console.error(`Failed to fetch price after ${retries} attempts.`); + console.error(``); return priceCache[symbol] || 0; } } @@ -56,7 +56,7 @@ const updatePriceCache = async ( setInterval(() => { Object.keys(priceCache).forEach((symbol) => { - console.log(`Updating price for ${symbol}`); + // console.log(`Updating price for ${symbol}`); updatePriceCache(symbol); }); }, 300000); From 53f7b27ba7ee8e407bb7c04711e7b99142e62e50 Mon Sep 17 00:00:00 2001 From: Pedro Rosalba Date: Fri, 4 Oct 2024 11:31:06 -0300 Subject: [PATCH 05/15] andando --- packages/nextjs/app/api/forms-ipfs/route.ts | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/packages/nextjs/app/api/forms-ipfs/route.ts b/packages/nextjs/app/api/forms-ipfs/route.ts index 36c4512..652f78b 100644 --- a/packages/nextjs/app/api/forms-ipfs/route.ts +++ b/packages/nextjs/app/api/forms-ipfs/route.ts @@ -11,7 +11,7 @@ export const config = { export async function POST(request: NextRequest){ try{ - + // const data = await request.formData(); const mockedData = { @@ -23,6 +23,7 @@ export async function POST(request: NextRequest){ }; const data = request.json(); + // const file: File | null = data.get("file") as unknown as File; console.log(data); @@ -31,7 +32,7 @@ export async function POST(request: NextRequest){ const mockedUrl = await pinataClient.gateways.convert(uploadMockedData.IpfsHash); console.log(mockedUrl); - + const uploadData = await pinataClient.upload.json(data); const url = await pinataClient.gateways.convert(uploadData.IpfsHash); From 52caff809a39caa7db3e0f09d5236e2f37fedf98 Mon Sep 17 00:00:00 2001 From: Pedro Rosalba Date: Fri, 4 Oct 2024 12:51:16 -0300 Subject: [PATCH 06/15] AAAAAAAproblema no forms --- packages/nextjs/app/api/forms-ipfs/route.ts | 2 +- packages/nextjs/app/uploadIP/page.tsx | 92 +++++++++++++-------- 2 files changed, 57 insertions(+), 37 deletions(-) diff --git a/packages/nextjs/app/api/forms-ipfs/route.ts b/packages/nextjs/app/api/forms-ipfs/route.ts index 652f78b..d1286a3 100644 --- a/packages/nextjs/app/api/forms-ipfs/route.ts +++ b/packages/nextjs/app/api/forms-ipfs/route.ts @@ -31,7 +31,7 @@ export async function POST(request: NextRequest){ const uploadMockedData = await pinataClient.upload.json(mockedData); const mockedUrl = await pinataClient.gateways.convert(uploadMockedData.IpfsHash); - console.log(mockedUrl); + // console.log(mockedUrl); const uploadData = await pinataClient.upload.json(data); const url = await pinataClient.gateways.convert(uploadData.IpfsHash); diff --git a/packages/nextjs/app/uploadIP/page.tsx b/packages/nextjs/app/uploadIP/page.tsx index cd4210f..94fa29a 100644 --- a/packages/nextjs/app/uploadIP/page.tsx +++ b/packages/nextjs/app/uploadIP/page.tsx @@ -33,9 +33,16 @@ const uploadIP = () => { const [status, setStatus] = useState("Mint NFT"); const [ipfsHash, setipfsHash] = useState(""); const [loading, setLoading] = useState(false); - - const [file, setFile] = useState(); - + const [ipData, setIpData] = useState({ + title: '', + description: '', + authors: [], + ipType: '', + }); + const [isSubmitting, setIsSubmitting] = useState(false); + const [error, setError] = useState(null); + + const [file, setFile] = useState(null); const { writeAsync: mintItem } = useScaffoldWriteContract({ contractName: "YourCollectible", functionName: "mint_item", @@ -76,13 +83,6 @@ const uploadIP = () => { setStatus("Mint NFT"); } }; - const [ipData, setIpData] = useState({ - title: '', - description: '', - authors: [], - ipType: '', - }); - const handleChange = (e: React.ChangeEvent @@ -91,51 +91,71 @@ const uploadIP = () => { const { name, value } = e.target; setIpData((prev) => ({ ...prev, [name]: value })); console.log(e.target); + }; + const handleAuthorChange = (index: number, value: string) => { + const newAuthors = [...ipData.authors] + newAuthors[index] = value + setIpData(prev => ({ ...prev, authors: newAuthors })) + }; + const handleFileChange = (e: React.ChangeEvent) => { + if (e.target.files) { + setFile(e.target.files[0]); + } }; const handleSubmit = async ( event: FormEvent - ) => { + ) => { event.preventDefault(); // Prevent form from refreshing the page + + setIsSubmitting(true); + setError(null); + + const submitData = new FormData(); + submitData.append('title', ipData.title); + submitData.append('description', ipData.description); + if (Array.isArray(ipData.authors)) { + ipData.authors.forEach((author, index) => { + submitData.append(`authors[${index}]`, author) + }) + } else { + // If authors is not an array, append it as a single value + submitData.append('authors', ipData.authors.toString()) + } + + submitData.append('ipType', ipData.ipType) + submitData.append('ipType', ipData.ipType) + if (file) { + submitData.append('uploadFile', file); + } + + console.log(submitData); + try { const response = await fetch('/api/forms-ipfs', { method: 'POST', - headers: { - 'Content-Type': 'application/json', - }, - body: JSON.stringify(ipData), + body: submitData, }); - console.log(ipData); + if (!response.ok) { + throw new Error('Failed to submit IP') + } + console.log('IP submitted successfully'); console.log(response.body); console.log("POST done, waiting for response"); + const data = await response.json(); setipfsHash(data.metadataHash); - } catch (error) { - console.error('Error uploading to IPFS:', error); + + } catch (err) { + setError('Failed to submit IP. Please try again.'); + } finally { + setIsSubmitting(false); } - setLoading(false); - - - const formData = new FormData(event.currentTarget); // Use FormData to access form fields - - const title = formData.get("title") as string; - const description = formData.get("description") as string; - const authors = (formData.get("authors") as string).split(",").map(author => author.trim()); - const ipType = formData.get("type") as IPType; - const uploadFile = formData.get("file") as File; - - const ip: IP = { - title, - description, - authors, - ipType, - uploadFile, - }; handleMintItem(); From f689347e44d7be657712b63a3458d9d7d1144491 Mon Sep 17 00:00:00 2001 From: pedro rosalba Date: Sat, 5 Oct 2024 18:31:04 -0300 Subject: [PATCH 07/15] merda --- packages/nextjs/app/api/forms-ipfs/route.ts | 13 +++++++++---- packages/nextjs/app/uploadIP/page.tsx | 18 ++++++++++++------ 2 files changed, 21 insertions(+), 10 deletions(-) diff --git a/packages/nextjs/app/api/forms-ipfs/route.ts b/packages/nextjs/app/api/forms-ipfs/route.ts index d1286a3..9edf3be 100644 --- a/packages/nextjs/app/api/forms-ipfs/route.ts +++ b/packages/nextjs/app/api/forms-ipfs/route.ts @@ -23,13 +23,18 @@ export async function POST(request: NextRequest){ }; const data = request.json(); + + // const data2 = request.body; // const file: File | null = data.get("file") as unknown as File; - console.log(data); - - const uploadMockedData = await pinataClient.upload.json(mockedData); - const mockedUrl = await pinataClient.gateways.convert(uploadMockedData.IpfsHash); + // console.log(data); + // console.log(data2); + + console.log(request.body); + + // const uploadMockedData = await pinataClient.upload.json(mockedData); + // const mockedUrl = await pinataClient.gateways.convert(uploadMockedData.IpfsHash); // console.log(mockedUrl); diff --git a/packages/nextjs/app/uploadIP/page.tsx b/packages/nextjs/app/uploadIP/page.tsx index 94fa29a..3d39a82 100644 --- a/packages/nextjs/app/uploadIP/page.tsx +++ b/packages/nextjs/app/uploadIP/page.tsx @@ -90,7 +90,6 @@ const uploadIP = () => { const { name, value } = e.target; setIpData((prev) => ({ ...prev, [name]: value })); - console.log(e.target); }; const handleAuthorChange = (index: number, value: string) => { @@ -106,14 +105,16 @@ const uploadIP = () => { }; const handleSubmit = async ( - event: FormEvent + event: React.FormEvent ) => { + console.log(ipData); event.preventDefault(); // Prevent form from refreshing the page setIsSubmitting(true); setError(null); const submitData = new FormData(); + submitData.append('title', ipData.title); submitData.append('description', ipData.description); if (Array.isArray(ipData.authors)) { @@ -122,21 +123,25 @@ const uploadIP = () => { }) } else { // If authors is not an array, append it as a single value - submitData.append('authors', ipData.authors.toString()) + submitData.append('authors', ipData.authors.toString()); } - submitData.append('ipType', ipData.ipType) - submitData.append('ipType', ipData.ipType) + submitData.append('ipType', ipData.ipType); if (file) { - submitData.append('uploadFile', file); + submitData.set('uploadFile', file); } console.log(submitData); + for (let pair of submitData.entries()) { + console.log(`${pair[0]}: ${pair[1]}`); + } + try { const response = await fetch('/api/forms-ipfs', { method: 'POST', body: submitData, + }); if (!response.ok) { @@ -242,6 +247,7 @@ const uploadIP = () => { type="file" id="file" name="file" + onChange={handleFileChange} className="w-full border rounded p-2" /> From e4f4cd555b93345404f960e04d8872c4c30ecfd8 Mon Sep 17 00:00:00 2001 From: pedro rosalba Date: Sun, 6 Oct 2024 19:52:08 -0300 Subject: [PATCH 08/15] a --- packages/nextjs/app/api/forms-ipfs/route.ts | 84 +++++++++++---------- packages/nextjs/app/uploadIP/page.tsx | 16 +++- 2 files changed, 61 insertions(+), 39 deletions(-) diff --git a/packages/nextjs/app/api/forms-ipfs/route.ts b/packages/nextjs/app/api/forms-ipfs/route.ts index 9edf3be..b2519b5 100644 --- a/packages/nextjs/app/api/forms-ipfs/route.ts +++ b/packages/nextjs/app/api/forms-ipfs/route.ts @@ -10,45 +10,53 @@ export const config = { }; export async function POST(request: NextRequest){ - try{ - - // const data = await request.formData(); - - const mockedData = { - title: 'mocktitle', - description: 'mockdescription', - authors: 'mockauthors', - ipType: 'mockiptype', - uploadFile:'' - }; - - const data = request.json(); - - // const data2 = request.body; - - // const file: File | null = data.get("file") as unknown as File; - - // console.log(data); - // console.log(data2); - - console.log(request.body); - - // const uploadMockedData = await pinataClient.upload.json(mockedData); - // const mockedUrl = await pinataClient.gateways.convert(uploadMockedData.IpfsHash); - - // console.log(mockedUrl); - - const uploadData = await pinataClient.upload.json(data); - const url = await pinataClient.gateways.convert(uploadData.IpfsHash); - - console.log(url); - - return NextResponse.json(url, { status: 200 }); - } catch (e) { - console.log(e); + if(!request.body || !request.json()){ return NextResponse.json( - { error: "Internal Server Error" }, - { status: 500 } + { error: "Bad-Request" }, + { status: 401 } ); } + else{ + try{ + const mockedData = { + title: 'mocktitle', + description: 'mockdescription', + authors: 'mockauthors', + ipType: 'mockiptype', + uploadFile:'' + }; + + // const data4 = JSON.parse(await request.json()); + // console.log(data4); + + const data = request.json(); + console.log(data); + console.log("--------------"); + const data2 = request.body; + console.log(data2); + console.log("--------------"); + const data3 = request.text(); + console.log(data3); + + //const file: File | null = data.get("file") as unknown as File; + // const uploadMockedData = await pinataClient.upload.json(mockedData); + // const mockedUrl = await pinataClient.gateways.convert(uploadMockedData.IpfsHash); + // console.log(mockedUrl); + + const uploadData = await pinataClient.upload.json(data2); + const url = await pinataClient.gateways.convert(uploadData.IpfsHash); + + console.log(url); + + return NextResponse.json(url, { status: 200 }); + + // const data = await request.formData(); + } catch (e) { + console.log(e); + return NextResponse.json( + { error: "Internal Server Error" }, + { status: 500 } + ); + } + } } \ No newline at end of file diff --git a/packages/nextjs/app/uploadIP/page.tsx b/packages/nextjs/app/uploadIP/page.tsx index 3d39a82..8373034 100644 --- a/packages/nextjs/app/uploadIP/page.tsx +++ b/packages/nextjs/app/uploadIP/page.tsx @@ -137,11 +137,25 @@ const uploadIP = () => { console.log(`${pair[0]}: ${pair[1]}`); } + const submitJson = {}; + submitData.forEach((value, key)=>{ + if(submitJson[key]){ + if(Array.isArray(submitJson[key])){ + submitJson[key].push(value); + } + else{ + submitJson[key] = [submitJson[key],value]; + } + } else { + submitJson[key] = value; + } + }); + console.log(submitJson); + try { const response = await fetch('/api/forms-ipfs', { method: 'POST', body: submitData, - }); if (!response.ok) { From a877f9bab3b1527b77dea467676ef7056983254e Mon Sep 17 00:00:00 2001 From: pedro rosalba Date: Sun, 6 Oct 2024 23:30:00 -0300 Subject: [PATCH 09/15] a --- packages/nextjs/app/api/forms-ipfs/route.ts | 14 ++++++++------ packages/nextjs/app/uploadIP/page.tsx | 6 +++++- 2 files changed, 13 insertions(+), 7 deletions(-) diff --git a/packages/nextjs/app/api/forms-ipfs/route.ts b/packages/nextjs/app/api/forms-ipfs/route.ts index b2519b5..3b563e3 100644 --- a/packages/nextjs/app/api/forms-ipfs/route.ts +++ b/packages/nextjs/app/api/forms-ipfs/route.ts @@ -32,18 +32,20 @@ export async function POST(request: NextRequest){ const data = request.json(); console.log(data); console.log("--------------"); - const data2 = request.body; - console.log(data2); - console.log("--------------"); - const data3 = request.text(); - console.log(data3); + + // const data2 = request.body; + // console.log(data2); + + // console.log("--------------"); + // const data3 = request.text(); + // console.log(data3); //const file: File | null = data.get("file") as unknown as File; // const uploadMockedData = await pinataClient.upload.json(mockedData); // const mockedUrl = await pinataClient.gateways.convert(uploadMockedData.IpfsHash); // console.log(mockedUrl); - const uploadData = await pinataClient.upload.json(data2); + const uploadData = await pinataClient.upload.json(data); const url = await pinataClient.gateways.convert(uploadData.IpfsHash); console.log(url); diff --git a/packages/nextjs/app/uploadIP/page.tsx b/packages/nextjs/app/uploadIP/page.tsx index 8373034..145e8e5 100644 --- a/packages/nextjs/app/uploadIP/page.tsx +++ b/packages/nextjs/app/uploadIP/page.tsx @@ -150,12 +150,16 @@ const uploadIP = () => { submitJson[key] = value; } }); + console.log(submitJson); + const submitString = JSON.stringify(submitJson); + console.log(submitString); + try { const response = await fetch('/api/forms-ipfs', { method: 'POST', - body: submitData, + body: submitString, }); if (!response.ok) { From 4c14cbde836d4e6e60bc539a784267137b51f57a Mon Sep 17 00:00:00 2001 From: pedro rosalba Date: Mon, 7 Oct 2024 10:09:20 -0300 Subject: [PATCH 10/15] internal server error --- packages/nextjs/app/api/forms-ipfs/route.ts | 22 ++++++++++++++++----- packages/nextjs/app/uploadIP/page.tsx | 2 +- 2 files changed, 18 insertions(+), 6 deletions(-) diff --git a/packages/nextjs/app/api/forms-ipfs/route.ts b/packages/nextjs/app/api/forms-ipfs/route.ts index 3b563e3..731e9fe 100644 --- a/packages/nextjs/app/api/forms-ipfs/route.ts +++ b/packages/nextjs/app/api/forms-ipfs/route.ts @@ -29,9 +29,13 @@ export async function POST(request: NextRequest){ // const data4 = JSON.parse(await request.json()); // console.log(data4); - const data = request.json(); - console.log(data); - console.log("--------------"); + const data = await request.formData(); + + // const title = data.get('title') as unknown as string; + // const description = data.get('description') as unknown as string; + // const authors = data.getAll('authors'); + // const ipType = data.get('ipType'); + const uploadFile = data.get('uploadFile') as unknown as File; // const data2 = request.body; // console.log(data2); @@ -44,8 +48,16 @@ export async function POST(request: NextRequest){ // const uploadMockedData = await pinataClient.upload.json(mockedData); // const mockedUrl = await pinataClient.gateways.convert(uploadMockedData.IpfsHash); // console.log(mockedUrl); - - const uploadData = await pinataClient.upload.json(data); + + const userObject = { + // title: title, + // description: description, + // authors: authors, + // ipType: ipType, + uploadFile: uploadFile + }; + + const uploadData = await pinataClient.upload.file(uploadFile); const url = await pinataClient.gateways.convert(uploadData.IpfsHash); console.log(url); diff --git a/packages/nextjs/app/uploadIP/page.tsx b/packages/nextjs/app/uploadIP/page.tsx index 145e8e5..114208f 100644 --- a/packages/nextjs/app/uploadIP/page.tsx +++ b/packages/nextjs/app/uploadIP/page.tsx @@ -159,7 +159,7 @@ const uploadIP = () => { try { const response = await fetch('/api/forms-ipfs', { method: 'POST', - body: submitString, + body: submitData, }); if (!response.ok) { From 53e403eef469dde199e471041e34141365b09014 Mon Sep 17 00:00:00 2001 From: pedro rosalba Date: Mon, 7 Oct 2024 10:31:15 -0300 Subject: [PATCH 11/15] a --- packages/nextjs/app/uploadIP/page.tsx | 36 +++++++++++++-------------- 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/packages/nextjs/app/uploadIP/page.tsx b/packages/nextjs/app/uploadIP/page.tsx index 114208f..81dae5e 100644 --- a/packages/nextjs/app/uploadIP/page.tsx +++ b/packages/nextjs/app/uploadIP/page.tsx @@ -137,24 +137,24 @@ const uploadIP = () => { console.log(`${pair[0]}: ${pair[1]}`); } - const submitJson = {}; - submitData.forEach((value, key)=>{ - if(submitJson[key]){ - if(Array.isArray(submitJson[key])){ - submitJson[key].push(value); - } - else{ - submitJson[key] = [submitJson[key],value]; - } - } else { - submitJson[key] = value; - } - }); - - console.log(submitJson); - - const submitString = JSON.stringify(submitJson); - console.log(submitString); + // const submitJson = {}; + // submitData.forEach((value, key)=>{ + // if(submitJson[key]){ + // if(Array.isArray(submitJson[key])){ + // submitJson[key].push(value); + // } + // else{ + // submitJson[key] = [submitJson[key],value]; + // } + // } else { + // submitJson[key] = value; + // } + // }); + + // console.log(submitJson); + + // const submitString = JSON.stringify(submitJson); + // console.log(submitString); try { const response = await fetch('/api/forms-ipfs', { From 804685441f8e6f3051e583a4b9b9964396809fc8 Mon Sep 17 00:00:00 2001 From: pedro rosalba Date: Mon, 7 Oct 2024 12:56:43 -0300 Subject: [PATCH 12/15] andando --- packages/nextjs/app/api/forms-ipfs/route.ts | 38 ++++----- packages/nextjs/app/uploadIP/page.tsx | 77 ++++++++----------- packages/nextjs/utils/simpleNFT/handleMint.ts | 0 3 files changed, 47 insertions(+), 68 deletions(-) create mode 100644 packages/nextjs/utils/simpleNFT/handleMint.ts diff --git a/packages/nextjs/app/api/forms-ipfs/route.ts b/packages/nextjs/app/api/forms-ipfs/route.ts index 731e9fe..b947277 100644 --- a/packages/nextjs/app/api/forms-ipfs/route.ts +++ b/packages/nextjs/app/api/forms-ipfs/route.ts @@ -3,20 +3,13 @@ import { NextRequest, NextResponse } from 'next/server'; import { IP } from '~~/app/registerIP/page'; import { pinataClient } from '~~/utils/simpleNFT/pinataClient'; -export const config = { - api: { - bodyParser: false, - }, -}; +// export const config = { +// api: { +// bodyParser: false, +// }, +// }; export async function POST(request: NextRequest){ - if(!request.body || !request.json()){ - return NextResponse.json( - { error: "Bad-Request" }, - { status: 401 } - ); - } - else{ try{ const mockedData = { title: 'mocktitle', @@ -31,11 +24,11 @@ export async function POST(request: NextRequest){ const data = await request.formData(); - // const title = data.get('title') as unknown as string; - // const description = data.get('description') as unknown as string; - // const authors = data.getAll('authors'); - // const ipType = data.get('ipType'); - const uploadFile = data.get('uploadFile') as unknown as File; + const title = data.get('title') as unknown as string; + const description = data.get('description') as unknown as string; + const authors = data.getAll('authors'); + const ipType = data.get('ipType'); + const uploadFile: File | null = data.get('uploadFile') as unknown as File; // const data2 = request.body; // console.log(data2); @@ -50,14 +43,14 @@ export async function POST(request: NextRequest){ // console.log(mockedUrl); const userObject = { - // title: title, - // description: description, - // authors: authors, - // ipType: ipType, + title: title, + description: description, + authors: authors, + ipType: ipType, uploadFile: uploadFile }; - const uploadData = await pinataClient.upload.file(uploadFile); + const uploadData = await pinataClient.upload.json(userObject); const url = await pinataClient.gateways.convert(uploadData.IpfsHash); console.log(url); @@ -73,4 +66,3 @@ export async function POST(request: NextRequest){ ); } } -} \ No newline at end of file diff --git a/packages/nextjs/app/uploadIP/page.tsx b/packages/nextjs/app/uploadIP/page.tsx index 81dae5e..f084bb2 100644 --- a/packages/nextjs/app/uploadIP/page.tsx +++ b/packages/nextjs/app/uploadIP/page.tsx @@ -13,6 +13,8 @@ import nftsMetadata from "~~/utils/simpleNFT/nftsMetadata"; import { useState, FormEvent, useRef} from "react"; import { FilePlus } from 'lucide-react'; import { id } from "ethers"; +import { pinataClient } from "~~/utils/simpleNFT/pinataClient"; + // import { customizeNftMetadata } from "~~/utils/simpleNFT/nftsMetadata"; export type IPType = "" | "patent" | "trademark" | "copyright" | "trade_secret"; @@ -55,34 +57,34 @@ const uploadIP = () => { watch: false, }); - const handleMintItem = async () => { - setStatus("Minting NFT"); - // circle back to the zero item if we've reached the end of the array - if (tokenIdCounter === undefined) { - setStatus("Mint NFT"); - return; - } + // const handleMintItem = async () => { + // setStatus("Minting NFT"); + // // circle back to the zero item if we've reached the end of the array + // if (tokenIdCounter === undefined) { + // setStatus("Mint NFT"); + // return; + // } - const tokenIdCounterNumber = Number(tokenIdCounter); + // const tokenIdCounterNumber = Number(tokenIdCounter); - const notificationId = notification.loading("Uploading to IPFS"); - try { - - // First remove previous loading notification and then show success notification - notification.remove(notificationId); - notification.success("Metadata uploaded to IPFS"); - - await mintItem({ - args: [connectedAddress, ipfsHash], - }); - setStatus("Updating NFT List"); - refetch(); - } catch (error) { - notification.remove(notificationId); - console.error(error); - setStatus("Mint NFT"); - } - }; + // const notificationId = notification.loading("Uploading to IPFS"); + // try { + + // // First remove previous loading notification and then show success notification + // notification.remove(notificationId); + // notification.success("Metadata uploaded to IPFS"); + + // await mintItem({ + // args: [connectedAddress, ipfsHash], + // }); + // setStatus("Updating NFT List"); + // refetch(); + // } catch (error) { + // notification.remove(notificationId); + // console.error(error); + // setStatus("Mint NFT"); + // } + // }; const handleChange = (e: React.ChangeEvent @@ -127,6 +129,7 @@ const uploadIP = () => { } submitData.append('ipType', ipData.ipType); + if (file) { submitData.set('uploadFile', file); } @@ -137,24 +140,8 @@ const uploadIP = () => { console.log(`${pair[0]}: ${pair[1]}`); } - // const submitJson = {}; - // submitData.forEach((value, key)=>{ - // if(submitJson[key]){ - // if(Array.isArray(submitJson[key])){ - // submitJson[key].push(value); - // } - // else{ - // submitJson[key] = [submitJson[key],value]; - // } - // } else { - // submitJson[key] = value; - // } - // }); - - // console.log(submitJson); - - // const submitString = JSON.stringify(submitJson); - // console.log(submitString); + + console.log(pinataClient); try { const response = await fetch('/api/forms-ipfs', { @@ -180,7 +167,7 @@ const uploadIP = () => { setIsSubmitting(false); } - handleMintItem(); + // handleMintItem(); }; diff --git a/packages/nextjs/utils/simpleNFT/handleMint.ts b/packages/nextjs/utils/simpleNFT/handleMint.ts new file mode 100644 index 0000000..e69de29 From 09a8c2974eeefce441b0acdbce26d305c7a5d297 Mon Sep 17 00:00:00 2001 From: pedro rosalba Date: Mon, 7 Oct 2024 12:59:32 -0300 Subject: [PATCH 13/15] andando --- packages/nextjs/app/api/forms-ipfs/route.ts | 4 +- packages/nextjs/app/uploadIP/page.tsx | 1 + packages/nextjs/utils/simpleNFT/handleMint.ts | 42 +++++++++++++++++++ 3 files changed, 46 insertions(+), 1 deletion(-) diff --git a/packages/nextjs/app/api/forms-ipfs/route.ts b/packages/nextjs/app/api/forms-ipfs/route.ts index b947277..d5470e8 100644 --- a/packages/nextjs/app/api/forms-ipfs/route.ts +++ b/packages/nextjs/app/api/forms-ipfs/route.ts @@ -53,7 +53,9 @@ export async function POST(request: NextRequest){ const uploadData = await pinataClient.upload.json(userObject); const url = await pinataClient.gateways.convert(uploadData.IpfsHash); - console.log(url); + console.log(url); + + //aqui eu chamo a função de MINTAR return NextResponse.json(url, { status: 200 }); diff --git a/packages/nextjs/app/uploadIP/page.tsx b/packages/nextjs/app/uploadIP/page.tsx index f084bb2..9aad6c1 100644 --- a/packages/nextjs/app/uploadIP/page.tsx +++ b/packages/nextjs/app/uploadIP/page.tsx @@ -158,6 +158,7 @@ const uploadIP = () => { const data = await response.json(); + console.log(data); setipfsHash(data.metadataHash); diff --git a/packages/nextjs/utils/simpleNFT/handleMint.ts b/packages/nextjs/utils/simpleNFT/handleMint.ts index e69de29..13a4e16 100644 --- a/packages/nextjs/utils/simpleNFT/handleMint.ts +++ b/packages/nextjs/utils/simpleNFT/handleMint.ts @@ -0,0 +1,42 @@ +"use client"; + +import { useRouter } from "next/navigation"; // Correct import for client-side navigation +import type { NextPage } from "next"; +import { useAccount } from "@starknet-react/core"; +import { CustomConnectButton } from "~~/components/scaffold-stark/CustomConnectButton"; +import { MyHoldings } from "~~/components/SimpleNFT/MyHoldings"; +import { useScaffoldReadContract } from "~~/hooks/scaffold-stark/useScaffoldReadContract"; +import { useScaffoldWriteContract } from "~~/hooks/scaffold-stark/useScaffoldWriteContract"; +import { notification } from "~~/utils/scaffold-stark"; +import { addToIPFS } from "~~/utils/simpleNFT/ipfs-fetch"; +import nftsMetadata from "~~/utils/simpleNFT/nftsMetadata"; +import { useState, FormEvent, useRef} from "react"; +import { FilePlus } from 'lucide-react'; +import { id } from "ethers"; +import { pinataClient } from "~~/utils/simpleNFT/pinataClient"; + +const { address: connectedAddress, isConnected, isConnecting } = useAccount(); +const [status, setStatus] = useState("Mint NFT"); +const [ipfsHash, setipfsHash] = useState(""); +const [loading, setLoading] = useState(false); +const { writeAsync: mintItem } = useScaffoldWriteContract({ + contractName: "YourCollectible", + functionName: "mint_item", + args: [connectedAddress, ""], + }); + +const { data: tokenIdCounter, refetch } = useScaffoldReadContract({ + contractName: "YourCollectible", + functionName: "current", + watch: false, + }); + +export async function handleMint(url: string){ + //depois, setar a url + + // circle back to the zero item if we've reached the end of the array + if (tokenIdCounter === undefined) { + setStatus("Mint NFT"); + return; + } +}; \ No newline at end of file From 44d54e4d9022ff5108ee2edbbd07d3aab820d625 Mon Sep 17 00:00:00 2001 From: thiagorochatr Date: Mon, 7 Oct 2024 15:15:32 -0300 Subject: [PATCH 14/15] fx: pinata receiving correct data --- packages/nextjs/app/api/forms-ipfs/route.ts | 41 +++++++++++---------- packages/nextjs/app/uploadIP/page.tsx | 2 +- 2 files changed, 23 insertions(+), 20 deletions(-) diff --git a/packages/nextjs/app/api/forms-ipfs/route.ts b/packages/nextjs/app/api/forms-ipfs/route.ts index d5470e8..bbdef70 100644 --- a/packages/nextjs/app/api/forms-ipfs/route.ts +++ b/packages/nextjs/app/api/forms-ipfs/route.ts @@ -11,13 +11,13 @@ import { pinataClient } from '~~/utils/simpleNFT/pinataClient'; export async function POST(request: NextRequest){ try{ - const mockedData = { - title: 'mocktitle', - description: 'mockdescription', - authors: 'mockauthors', - ipType: 'mockiptype', - uploadFile:'' - }; + // const mockedData = { + // title: 'mocktitle', + // description: 'mockdescription', + // authors: 'mockauthors', + // ipType: 'mockiptype', + // uploadFile:'' + // }; // const data4 = JSON.parse(await request.json()); // console.log(data4); @@ -27,8 +27,8 @@ export async function POST(request: NextRequest){ const title = data.get('title') as unknown as string; const description = data.get('description') as unknown as string; const authors = data.getAll('authors'); - const ipType = data.get('ipType'); - const uploadFile: File | null = data.get('uploadFile') as unknown as File; + const ipType = data.get('ipType') as string; + const uploadFile = data.get('uploadFile') as File | null; // const data2 = request.body; // console.log(data2); @@ -38,27 +38,30 @@ export async function POST(request: NextRequest){ // console.log(data3); //const file: File | null = data.get("file") as unknown as File; + // const uploadMockedData = await pinataClient.upload.json(mockedData); // const mockedUrl = await pinataClient.gateways.convert(uploadMockedData.IpfsHash); // console.log(mockedUrl); + // console.log('Received data:', { title, description, authors, ipType, uploadFile: uploadFile?.name }); + const userObject = { - title: title, - description: description, - authors: authors, - ipType: ipType, - uploadFile: uploadFile + title, + description, + authors, + ipType, + uploadFile: uploadFile ? uploadFile.name : null, }; + // console.log('Attempting to upload to Pinata:', userObject); + const uploadData = await pinataClient.upload.json(userObject); + // console.log('Pinata upload successful:', uploadData); const url = await pinataClient.gateways.convert(uploadData.IpfsHash); - - console.log(url); + // console.log('Converted IPFS URL:', url); //aqui eu chamo a função de MINTAR - - return NextResponse.json(url, { status: 200 }); - + return NextResponse.json({ ipfsHash: uploadData.IpfsHash, url }, { status: 200 }); // const data = await request.formData(); } catch (e) { console.log(e); diff --git a/packages/nextjs/app/uploadIP/page.tsx b/packages/nextjs/app/uploadIP/page.tsx index 9aad6c1..da1922a 100644 --- a/packages/nextjs/app/uploadIP/page.tsx +++ b/packages/nextjs/app/uploadIP/page.tsx @@ -159,7 +159,7 @@ const uploadIP = () => { const data = await response.json(); console.log(data); - setipfsHash(data.metadataHash); + setipfsHash(data.ipfsHash); } catch (err) { From 63fda0347d2799ab42b9c329363cd4c0e7d9bb38 Mon Sep 17 00:00:00 2001 From: pedro rosalba Date: Mon, 7 Oct 2024 16:37:58 -0300 Subject: [PATCH 15/15] minting should work --- packages/nextjs/app/uploadIP/page.tsx | 80 ++++++++++++------- packages/nextjs/utils/simpleNFT/handleMint.ts | 31 +++++-- 2 files changed, 77 insertions(+), 34 deletions(-) diff --git a/packages/nextjs/app/uploadIP/page.tsx b/packages/nextjs/app/uploadIP/page.tsx index da1922a..239db7e 100644 --- a/packages/nextjs/app/uploadIP/page.tsx +++ b/packages/nextjs/app/uploadIP/page.tsx @@ -34,6 +34,7 @@ const uploadIP = () => { const { address: connectedAddress, isConnected, isConnecting } = useAccount(); const [status, setStatus] = useState("Mint NFT"); const [ipfsHash, setipfsHash] = useState(""); + const baseUrl = process.env.HOST; const [loading, setLoading] = useState(false); const [ipData, setIpData] = useState({ title: '', @@ -51,40 +52,60 @@ const uploadIP = () => { args: [connectedAddress, ""], }); + // const {writeAsync: setTokenUri} = useScaffoldWriteContract({ + // contractName: "YourCollectible", + // functionName: "set_token_uri", + // args: [connectedAddress, ""], + // }); + const { data: tokenIdCounter, refetch } = useScaffoldReadContract({ contractName: "YourCollectible", functionName: "current", watch: false, }); - // const handleMintItem = async () => { - // setStatus("Minting NFT"); - // // circle back to the zero item if we've reached the end of the array - // if (tokenIdCounter === undefined) { - // setStatus("Mint NFT"); + const handleMintItem = async ( + + ) => { + setStatus("Minting NFT"); + // circle back to the zero item if we've reached the end of the array + if (tokenIdCounter === undefined) { + setStatus("Mint NFT"); + return; + } + + const tokenIdCounterNumber = Number(tokenIdCounter); + + const notificationId = notification.loading("Uploading to IPFS"); + try { + + // First remove previous loading notification and then show success notification + notification.remove(notificationId); + notification.success("Metadata uploaded to IPFS"); + + await mintItem({ + args: [connectedAddress, baseUrl + ipfsHash], + }); + setStatus("Updating NFT List"); + refetch(); + } catch (error) { + notification.remove(notificationId); + console.error(error); + setStatus("Mint NFT"); + } + }; + + // const handleSetTokenUri = async (url: string) => { + // setStatus("Setting token URI"); + // if(tokenIdCounter == undefined){ + // setStatus("Set token URI"); // return; // } - // const tokenIdCounterNumber = Number(tokenIdCounter); - - // const notificationId = notification.loading("Uploading to IPFS"); // try { - - // // First remove previous loading notification and then show success notification - // notification.remove(notificationId); - // notification.success("Metadata uploaded to IPFS"); - - // await mintItem({ - // args: [connectedAddress, ipfsHash], - // }); - // setStatus("Updating NFT List"); - // refetch(); - // } catch (error) { - // notification.remove(notificationId); - // console.error(error); - // setStatus("Mint NFT"); + // await // } - // }; + // } const handleChange = (e: React.ChangeEvent @@ -158,18 +179,21 @@ const uploadIP = () => { const data = await response.json(); - console.log(data); + + // console.log(data); + // console.log(data.url); + setipfsHash(data.ipfsHash); + + handleMintItem(); + + // handleSetTokenUri(data.url); - } catch (err) { setError('Failed to submit IP. Please try again.'); } finally { setIsSubmitting(false); } - - // handleMintItem(); - }; diff --git a/packages/nextjs/utils/simpleNFT/handleMint.ts b/packages/nextjs/utils/simpleNFT/handleMint.ts index 13a4e16..852230e 100644 --- a/packages/nextjs/utils/simpleNFT/handleMint.ts +++ b/packages/nextjs/utils/simpleNFT/handleMint.ts @@ -32,11 +32,30 @@ const { data: tokenIdCounter, refetch } = useScaffoldReadContract({ }); export async function handleMint(url: string){ - //depois, setar a url + // setStatus("Minting NFT"); + // // circle back to the zero item if we've reached the end of the array + // if (tokenIdCounter === undefined) { + // setStatus("Mint NFT"); + // return; + // } - // circle back to the zero item if we've reached the end of the array - if (tokenIdCounter === undefined) { - setStatus("Mint NFT"); - return; - } + // const tokenIdCounterNumber = Number(tokenIdCounter); + + // const notificationId = notification.loading("Uploading to IPFS"); + // try { + + // // First remove previous loading notification and then show success notification + // notification.remove(notificationId); + // notification.success("Metadata uploaded to IPFS"); + + // await mintItem({ + // args: [connectedAddress, ipfsHash], + // }); + // setStatus("Updating NFT List"); + // refetch(); + // } catch (error) { + // notification.remove(notificationId); + // console.error(error); + // setStatus("Mint NFT"); + // } }; \ No newline at end of file