tokens.tsx 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. import { ExternalLink, Search } from 'lucide-react'
  2. import { useState } from 'react'
  3. import { Button } from 'ui'
  4. import { Input } from 'ui-patterns/DataInputs/Input'
  5. import { AccessTokenList } from '@/components/interfaces/Account/AccessTokens/AccessTokenList'
  6. import { AccessTokenNewBanner } from '@/components/interfaces/Account/AccessTokens/AccessTokenNewBanner/AccessTokenNewBanner'
  7. import { NewTokenButton } from '@/components/interfaces/Account/AccessTokens/Classic/NewTokenButton'
  8. import { AccessTokensLayout } from '@/components/layouts/AccessTokens/AccessTokensLayout'
  9. import AccountLayout from '@/components/layouts/AccountLayout/AccountLayout'
  10. import { AppLayout } from '@/components/layouts/AppLayout/AppLayout'
  11. import { DefaultLayout } from '@/components/layouts/DefaultLayout'
  12. import { NewAccessToken } from '@/data/access-tokens/access-tokens-create-mutation'
  13. import { DOCS_URL } from '@/lib/constants'
  14. import type { NextPageWithLayout } from '@/types'
  15. const UserAccessTokens: NextPageWithLayout = () => {
  16. const [newToken, setNewToken] = useState<NewAccessToken | undefined>()
  17. const [searchString, setSearchString] = useState('')
  18. return (
  19. <AccessTokensLayout>
  20. <div className="space-y-4">
  21. {newToken && (
  22. <AccessTokenNewBanner
  23. token={newToken}
  24. onClose={() => setNewToken(undefined)}
  25. getTokenValue={(token) => token.token}
  26. />
  27. )}
  28. <div className="flex items-center justify-between gap-x-2 mb-3">
  29. <Input
  30. size="tiny"
  31. autoComplete="off"
  32. icon={<Search size={12} />}
  33. value={searchString}
  34. onChange={(e: React.ChangeEvent<HTMLInputElement>) => setSearchString(e.target.value)}
  35. name="search"
  36. id="search"
  37. placeholder="Filter tokens"
  38. />
  39. <div className="flex items-center gap-x-2">
  40. <Button asChild type="default" icon={<ExternalLink />}>
  41. <a href={`${DOCS_URL}/reference/api/introduction`} target="_blank" rel="noreferrer">
  42. API Docs
  43. </a>
  44. </Button>
  45. <Button asChild type="default" icon={<ExternalLink />}>
  46. <a href={`${DOCS_URL}/reference/cli/start`} target="_blank" rel="noreferrer">
  47. CLI docs
  48. </a>
  49. </Button>
  50. <NewTokenButton onCreateToken={setNewToken} />
  51. </div>
  52. </div>
  53. <AccessTokenList
  54. searchString={searchString}
  55. onDeleteSuccess={(id) => {
  56. if (id === newToken?.id) setNewToken(undefined)
  57. }}
  58. />
  59. </div>
  60. </AccessTokensLayout>
  61. )
  62. }
  63. UserAccessTokens.getLayout = (page) => (
  64. <AppLayout>
  65. <DefaultLayout headerTitle="Account">
  66. <AccountLayout title="Access Tokens">{page}</AccountLayout>
  67. </DefaultLayout>
  68. </AppLayout>
  69. )
  70. export default UserAccessTokens