1
- import { useState } from 'react'
2
- import { Diamond , Zap , Gem , Rocket , Crown } from 'lucide-react'
1
+ 'use client' ;
2
+
3
+ import { useState , useEffect } from 'react' ;
4
+ import { Diamond , Zap , Battery , Magnet , Crown , Gem } from 'lucide-react' ;
5
+ import { useSupabaseClient , useSession } from '@supabase/auth-helpers-react' ;
3
6
4
7
type InventoryItem = {
5
- id : string
6
- name : string
7
- amount : number
8
- }
8
+ id : string ;
9
+ name : string ;
10
+ amount : number ;
11
+ } ;
12
+
13
+ const getMineralColor = ( name : string ) => {
14
+ switch ( name ) {
15
+ case 'Iron' :
16
+ return 'bg-red-100' ;
17
+ case 'Copper' :
18
+ return 'bg-orange-100' ;
19
+ case 'Coal' :
20
+ return 'bg-gray-100' ;
21
+ case 'Nickel' :
22
+ return 'bg-green-100' ;
23
+ case 'Fuel' :
24
+ return 'bg-cyan-100' ;
25
+ default :
26
+ return 'bg-blue-100' ;
27
+ }
28
+ } ;
29
+
30
+ export function Inventory ( ) {
31
+ const supabase = useSupabaseClient ( ) ;
32
+ const session = useSession ( ) ;
33
+
34
+ const [ inventory , setInventory ] = useState < InventoryItem [ ] > ( [ ] ) ;
35
+ const [ loading , setLoading ] = useState < boolean > ( true ) ;
36
+ const [ hoveredItem , setHoveredItem ] = useState < string | null > ( null ) ;
37
+
38
+ const itemNames : Record < number , string > = {
39
+ 11 : 'Coal' ,
40
+ 13 : 'Silicon' ,
41
+ 15 : 'Iron' ,
42
+ 16 : 'Nickel' ,
43
+ 18 : 'Fuel' ,
44
+ 19 : 'Copper' ,
45
+ } ;
9
46
10
- type Props = {
11
- inventory : InventoryItem [ ]
12
- }
47
+ useEffect ( ( ) => {
48
+ const fetchInventory = async ( ) => {
49
+ if ( ! session ?. user . id ) {
50
+ console . error ( 'Session or user ID is missing' ) ;
51
+ setLoading ( false ) ;
52
+ return ;
53
+ }
13
54
14
- export function Inventory ( { inventory = [ ] } : Props ) {
15
- const [ hoveredItem , setHoveredItem ] = useState < string | null > ( null )
55
+ try {
56
+ const { data, error } = await supabase
57
+ . from ( 'inventory' )
58
+ . select ( 'id, item, quantity' )
59
+ . eq ( 'owner' , session . user . id )
60
+ . in ( 'item' , Object . keys ( itemNames ) . map ( Number ) ) ;
61
+
62
+ if ( error ) {
63
+ throw error ;
64
+ }
65
+
66
+ const formattedInventory = Object . entries ( itemNames ) . map ( ( [ key , name ] ) => {
67
+ const foundItem = data ?. find ( ( item ) => item . item === Number ( key ) ) ;
68
+ return {
69
+ id : foundItem ? foundItem . id . toString ( ) : key ,
70
+ name : name ,
71
+ amount : foundItem ? foundItem . quantity : 0 ,
72
+ } ;
73
+ } ) ;
74
+
75
+ setInventory ( formattedInventory ) ;
76
+ } catch ( error ) {
77
+ console . error ( 'Error fetching inventory:' , error ) ;
78
+ } finally {
79
+ setLoading ( false ) ;
80
+ }
81
+ } ;
82
+
83
+ fetchInventory ( ) ;
84
+ } , [ session , supabase ] ) ;
16
85
17
86
const getIcon = ( name : string ) => {
18
87
switch ( name ) {
19
88
case 'Iron' :
20
- return < Diamond className = "text-[#FFE3BA]" />
89
+ return < Diamond className = "text-[#FFE3BA]" /> ;
21
90
case 'Copper' :
22
- return < Zap className = "text-[#FFE3BA]" />
23
- case 'Gold' :
24
- return < Gem className = "text-[#FFE3BA]" />
25
- case 'Titanium' :
26
- return < Rocket className = "text-[#FFE3BA]" />
27
- case 'Platinum' :
28
- return < Crown className = "text-[#FFE3BA]" />
91
+ return < Zap className = "text-[#5FCBC3]" /> ;
92
+ case 'Coal' :
93
+ return < Magnet className = "text-[#FFD700]" /> ;
94
+ case 'Silicon' :
95
+ return < Gem className = "text-[#B0C4DE]" /> ;
96
+ case 'Fuel' :
97
+ return < Battery className = "text-[#020403]" /> ;
98
+ case 'Nickel' :
99
+ return < Crown className = "text-[#E5E4E2]" /> ;
29
100
default :
30
- return < Diamond className = "text-[#FFE3BA]" />
101
+ return < Diamond className = "text-[#FFE3BA]" /> ;
31
102
}
103
+ } ;
104
+
105
+ if ( loading ) {
106
+ return < div > Loading...</ div > ;
32
107
}
33
108
34
109
return (
35
110
< div className = "space-y-2" >
36
111
< h2 className = "text-xl font-bold text-[#2C4F64]" > Inventory</ h2 >
37
- < div className = "flex space-x -4" >
38
- { inventory . map ( item => (
39
- < div
40
- key = { item . id }
41
- className = " relative flex items-center space-x-2 bg-gray-100 p-2 rounded-lg"
42
- onMouseEnter = { ( ) => setHoveredItem ( item . id ) }
112
+ < div className = "flex flex-wrap gap -4" >
113
+ { inventory . map ( ( item ) => (
114
+ < div
115
+ key = { item . id }
116
+ className = { ` relative flex items-center space-x-2 p-2 rounded-lg ${ getMineralColor ( item . name ) } ` }
117
+ onMouseEnter = { ( ) => setHoveredItem ( item . name ) } // Use name for hover
43
118
onMouseLeave = { ( ) => setHoveredItem ( null ) }
44
119
>
45
120
{ getIcon ( item . name ) }
46
121
< span className = "font-bold" > { item . amount } </ span >
47
- { hoveredItem === item . id && (
122
+ { hoveredItem === item . name && ( // Compare against name
48
123
< div className = "absolute bottom-full left-1/2 transform -translate-x-1/2 bg-[#2C4F64] text-white px-2 py-1 rounded text-sm whitespace-nowrap" >
49
124
{ item . name }
50
125
</ div >
@@ -53,5 +128,5 @@ export function Inventory({ inventory = [] }: Props) {
53
128
) ) }
54
129
</ div >
55
130
</ div >
56
- )
57
- }
131
+ ) ;
132
+ } ;
0 commit comments