1
+ import { useSession , useSupabaseClient } from "@supabase/auth-helpers-react" ;
2
+ import { ConnectWallet , useStorageUpload , MediaRenderer } from "@thirdweb-dev/react" ;
3
+ import { NextPage } from "next" ;
4
+ import { useCallback , useEffect , useState } from "react" ;
5
+ import { useDropzone } from "react-dropzone" ;
6
+ import { useMutation , useQuery } from "react-query" ;
7
+
8
+ const IPFS_GATEWAY = "https://d4b4e2e663a6efce5f7f8310426ba24a.ipfscdn.io/ipfs/" ;
9
+
10
+ interface FileUploadProps {
11
+ projectId : number ; // Pass project ID as prop
12
+ }
13
+
14
+ const UploadFileToRepo : NextPage < FileUploadProps > = ( { projectId } ) => {
15
+ const supabase = useSupabaseClient ( ) ;
16
+ const session = useSession ( ) ;
17
+
18
+ const [ uris , setUris ] = useState < string [ ] > ( [ ] ) ;
19
+
20
+ const { mutateAsync : upload } = useStorageUpload ( ) ;
21
+
22
+ const uploadAndAddToSupabase = useCallback ( async ( files : File [ ] ) => {
23
+ try {
24
+ const uris = await upload ( { data : files } ) ;
25
+
26
+ // Add URIs to Supabase table
27
+ const { error, data } = await supabase . from ( 'comments' ) . insert (
28
+ uris . map ( uri => ( {
29
+ content : uri ,
30
+ author : session ?. user ?. id ,
31
+ parent : projectId , // Associate with project ID
32
+ } ) )
33
+ ) ;
34
+
35
+ if ( error ) {
36
+ console . error ( "Error inserting data into Supabase:" , error . message ) ;
37
+ return ;
38
+ } ;
39
+
40
+ console . log ( "Data inserted successfully:" , data ) ;
41
+
42
+ setUris ( uris ) ;
43
+ } catch ( error ) {
44
+ console . error ( "Error uploading files and adding to Supabase:" , error ) ;
45
+ }
46
+ } , [ upload , supabase , session ?. user ?. id , projectId ] ) ;
47
+
48
+ const fetchAndRenderFromSupabase = useCallback ( async ( ) => {
49
+ try {
50
+ const { data, error } = await supabase
51
+ . from ( "comments" )
52
+ . select ( "content" )
53
+ . gte ( "id" , 23 )
54
+ . lt ( "id" , 29 )
55
+ . eq ( "author" , session ?. user ?. id )
56
+ . eq ( "parent" , projectId ) ; // Fetch files associated with project ID
57
+
58
+ if ( error ) {
59
+ console . error ( "Error fetching files from Supabase:" , error . message ) ;
60
+ return ;
61
+ }
62
+
63
+ if ( data ) {
64
+ const urisFromSupabase = data . map ( ( row : any ) => row . content ) ;
65
+ setUris ( urisFromSupabase ) ;
66
+ }
67
+ } catch ( error : any ) {
68
+ console . error ( "Error fetching files from Supabase:" , error . message ) ;
69
+ }
70
+ } , [ session ?. user ?. id , supabase , projectId ] ) ;
71
+
72
+ useEffect ( ( ) => {
73
+ fetchAndRenderFromSupabase ( ) ;
74
+ } , [ fetchAndRenderFromSupabase ] ) ;
75
+
76
+ const onDrop = useCallback ( async ( acceptedFiles : File [ ] ) => {
77
+ await uploadAndAddToSupabase ( acceptedFiles ) ;
78
+ } , [ uploadAndAddToSupabase ] ) ;
79
+
80
+ const { getRootProps, getInputProps } = useDropzone ( { onDrop } ) ;
81
+
82
+ return (
83
+ < div >
84
+ < div { ...getRootProps ( ) } >
85
+ < input { ...getInputProps ( ) } />
86
+ < button > Drop files to upload them to IPFS</ button >
87
+ </ div >
88
+ < div >
89
+ { uris . map ( ( uri ) => (
90
+ < MediaRenderer key = { uri } src = { uri } alt = "image" />
91
+ ) ) }
92
+ </ div >
93
+ </ div >
94
+ ) ;
95
+ } ;
96
+
97
+ export default UploadFileToRepo ;
0 commit comments