All files / features / repositories RepositoriesPage.tsx

31.81% Statements 14/44
35.71% Branches 5/14
25% Functions 3/12
34.14% Lines 14/41

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80                  69x   69x                                                                                                                                        
import { useState, useRef } from 'react'
import { useSearchParams, useNavigate } from 'react-router-dom'
import { Page } from '@/shared/components/Page'
import { PageHeader } from '@/shared/components/Page'
import { DataTable } from '@/shared/components/DataTable'
import { CrudModal } from '@/shared/components/CrudModal'
import { useRepoFiltersAndData } from './hooks/useRepoFiltersAndData'
import { useRepoColumns } from './hooks/useRepoColumns'
import { RepositoryForm, type CrudFormRef } from './components/RepositoryForm'
import type { components } from '@/types/api'
 
type Repository = components['schemas']['Repository']

export function RepositoriesPage() {
  const [searchParams, setSearchParams] = useSearchParams()
  const nav = useNavigate()
  const { data, isLoading, error, isRefetching, refetch, filterProps } = useRepoFiltersAndData({ prefix: 'repos' })
  const columns = useRepoColumns()

  const showCreate = searchParams.get('create') === 'true'
  const [formDirty, setFormDirty] = useState(false)
  const [formPending, setFormPending] = useState(false)
  const formRef = useRef<CrudFormRef>(null)

  function removeCreateParam() {
    setSearchParams((prev) => {
      const n = new URLSearchParams(prev)
      n.delete('create')
      return n
    })
  }
 
  return (
    <Page>
      <PageHeader title="Repositories" breadcrumbs={[
        { label: 'Dashboard', href: '/' }, { label: 'Repositories' },
      ]} />
      <DataTable<Repository>
        prefix="repos"
        columns={columns}
        data={data}
        isLoading={isLoading}
        error={error}
        entityName="Repository"
        onRefresh={refetch}
        isRefreshing={isRefetching}
        add={{ onAdd: () => setSearchParams({ create: 'true' }), label: 'New Repository' }}
        onRowClick={(item) => nav(`/repositories/${item.id}`)}
        {...filterProps}
      />
      <CrudModal
        open={showCreate}
        title="New Repository"
        isDirty={formDirty}
        isPending={formPending}
        onClose={removeCreateParam}
        onSave={async () => {
          setFormPending(true)
          try {
            await formRef.current?.submit()
          } finally {
            setFormPending(false)
          }
        }}
      >
        <RepositoryForm
          ref={formRef}
          onSuccess={(newId) => {
            removeCreateParam()
            if (newId) nav(`/repositories/${newId}`, { replace: true })
          }}
          onClose={removeCreateParam}
          onDirtyChange={setFormDirty}
          onPendingChange={setFormPending}
        />
      </CrudModal>
    </Page>
  )
}