11import { Card } from "@/components/ui/card" ;
22import { Table , TableBody } from "@/components/ui/table" ;
3- import { IProjectToken } from "@/api/schemas" ;
3+ import { AccessLevel , IProjectToken } from "@/api/schemas" ;
44import { getProjectTokens , createProjectToken } from "@/api/projectTokens" ;
55import CustomRowToken from "@/components/projectTokens/custom-row-token" ;
6- import { useState , useEffect , useRef } from "react" ;
6+ import { useMemo , useState , useEffect , useRef } from "react" ;
77import { Loader2 , ClipboardCopy , ClipboardCheck } from "lucide-react" ;
88import { Button } from "@/components/ui/button" ;
99import { Input } from "@/components/ui/input" ;
@@ -43,23 +43,21 @@ export const ProjectTokensTable = ({ projectId }: { projectId: string }) => {
4343 if ( isSubmitting ) return ;
4444
4545 setIsSubmitting ( true ) ;
46-
4746 try {
48- const access = 2 ;
49- const newToken = await toast
50- . promise ( createProjectToken ( projectId , tokenName , access ) , {
51- loading : `Creating token ${ tokenName } ...` ,
52- success : `Token ${ tokenName } created successfully` ,
53- error : ( error ) =>
54- `Failed to create token: ${ error instanceof Error ? error . message : "Unknown error" } ` ,
55- } )
56- . unwrap ( ) ;
57-
58- setCreatedToken ( newToken . token ) ;
47+ const newToken = await createProjectToken (
48+ projectId ,
49+ tokenName ,
50+ AccessLevel . WRITE ,
51+ ) ;
52+ toast . success ( `Token ${ tokenName } created successfully` ) ;
53+ setCreatedToken ( newToken . token ?? null ) ;
5954 setTokenName ( "" ) ;
6055 refreshTokens ( ) ;
6156 } catch ( error ) {
6257 console . error ( "Failed to create token:" , error ) ;
58+ toast . error (
59+ `Failed to create token: ${ error instanceof Error ? error . message : "Unknown error" } ` ,
60+ ) ;
6361 } finally {
6462 setIsSubmitting ( false ) ;
6563 }
@@ -89,6 +87,20 @@ export const ProjectTokensTable = ({ projectId }: { projectId: string }) => {
8987 setIsCreatingToken ( false ) ;
9088 } ;
9189
90+ const sortedTokens = useMemo (
91+ ( ) =>
92+ tokens
93+ ? tokens
94+ . slice ( )
95+ . sort ( ( a , b ) =>
96+ ( a . name ?? "" )
97+ . toLowerCase ( )
98+ . localeCompare ( ( b . name ?? "" ) . toLowerCase ( ) ) ,
99+ )
100+ : null ,
101+ [ tokens ] ,
102+ ) ;
103+
92104 return (
93105 < div className = "flex-col p-4 md:gap-8 md:p-4 justify-between" >
94106 < div className = "flex-1 mb-4" >
@@ -176,15 +188,15 @@ export const ProjectTokensTable = ({ projectId }: { projectId: string }) => {
176188 < Card >
177189 < Table >
178190 < TableBody >
179- { tokens === null ? (
191+ { sortedTokens === null ? (
180192 < tr >
181193 < td colSpan = { 3 } className = "text-center py-6" >
182194 < div className = "flex justify-center" >
183195 < Loader2 className = "h-8 w-8 animate-spin text-primary" />
184196 </ div >
185197 </ td >
186198 </ tr >
187- ) : tokens . length === 0 ? (
199+ ) : sortedTokens . length === 0 ? (
188200 < tr >
189201 < td colSpan = { 3 } className = "text-center py-6" >
190202 < p className = "text-muted-foreground" >
@@ -197,19 +209,13 @@ export const ProjectTokensTable = ({ projectId }: { projectId: string }) => {
197209 </ td >
198210 </ tr >
199211 ) : (
200- tokens
201- . sort ( ( a , b ) =>
202- a . name
203- . toLowerCase ( )
204- . localeCompare ( b . name . toLowerCase ( ) ) ,
205- )
206- . map ( ( projectToken , index ) => (
207- < CustomRowToken
208- key = { index }
209- projectToken = { projectToken }
210- onTokenDeleted = { refreshTokens }
211- />
212- ) )
212+ sortedTokens . map ( ( projectToken ) => (
213+ < CustomRowToken
214+ key = { projectToken . id }
215+ projectToken = { projectToken }
216+ onTokenDeleted = { refreshTokens }
217+ />
218+ ) )
213219 ) }
214220 </ TableBody >
215221 </ Table >
0 commit comments