react

🧩 Syntax:
import { useAntdTable, useRequest } from 'ahooks'
import { Button, ConfigProvider, Flex, Form, Input, Modal, Space, Table, Typography, message } from 'antd'
import { ColumnsType } from 'antd/es/table'
import { useState, useCallback } from 'react'
import CreateLecture from './components/CreateLecture'
import { Lecturers } from '@/types'
import api from '@/config/api'
import axios from 'axios'

type DataType = {
  id: number
  name: string
  email: string
}

type Result = {
  total: number
  list: Lecturers[]
}

export default function Lecture() {
  // data lecturer

  const [createLecture, setCreateLecture] = useState(false)
  const [modal, contextHolder] = Modal.useModal()
  const [form] = Form.useForm()

  const { runAsync: getLectures } = useRequest(api.getLecturers, {
    manual: true,
    onSuccess: (res) => {
      if (res) {
        return res
      }
    },
    onError: (err) => {
      console.log(err)
    }
  })

  const getTableData = async (_: never, { search }: { search: string }): Promise<Result> => {
    const res = await getLectures()
    if (res) {
      let object = {
        total: res.length,
        list: res
      }
      if (search) {
        const data = res.filter((item) => item.name.includes(search))
        object = {
          total: data.length,
          list: data
        }
      }

      return object
    }
    return {
      total: 0,
      list: []
    }
  }

  const { tableProps, search, data } = useAntdTable(getTableData, {
    defaultPageSize: 5,
    form
  })

  const { submit } = search

  const { runAsync: createLectures } = useRequest(
    async (value) => {
      const res = await api.createLectures(value)
      await axios.post(
        'https://api.clerk.com/v1/users',
        {
          first_name: value.name,
          last_name: value.name,
          email_address: [value.email],
          password: value.password
        },
        {
          headers: {
            Authorization: `Bearer sk_test_fc0dJDbMQTnTPbWYVy9c4v0LdhDSKNMH1U2YFukB3d`
          }
        }
      )
      return res
    },
    {
      manual: true,
      onSuccess: (res) => {
        if (res) {
          message.success('Create lectures success')
          submit()
          setCreateLecture(false)
        }
      },
      onError: (err) => {
        console.log(err)
      }
    }
  )

  const { runAsync: deleteLectures } = useRequest(api.deleteLectures, {
    manual: true,
    onSuccess: (res) => {
      if (res) {
        message.success('Delete lectures success')
        submit()
      }
    },
    onError: (err) => {
      console.log(err)
    }
  })

  const onDelete = useCallback((id: number) => {
    deleteLectures(id.toString())
  }, [])

  const columns: ColumnsType<DataType> = [
    {
      title: 'ID',
      key: 'id',
      dataIndex: 'id'
    },
    {
      title: 'Name',
      key: 'name',
      dataIndex: 'name'
    },
    {
      title: 'Email',
      key: 'email',
      dataIndex: 'email'
    },
    {
      title: 'Action',
      key: 'action',
      width: 150,
      render: (_, record) => (
        <Space size='middle'>
          <Button
            type='text'
            danger
            onClick={(e) => {
              e.stopPropagation()
              modal.confirm({
                title: 'Delete tag',
                centered: true,
                content: 'Do you want to delete this tag?',
                onOk() {
                  onDelete(record.id)
                },
                onCancel() {
                  console.log('cancel')
                }
              })
            }}
          >
            Delete
          </Button>
        </Space>
      )
    }
  ]

  const searchForm = (
    <div style={{ marginBottom: 16 }}>
      <Form form={form} style={{ display: 'flex', justifyContent: 'flex-end' }}>
        <Form.Item name='search'>
          <Input.Search className='w-80' onSearch={submit} placeholder='Search' />
        </Form.Item>
      </Form>
    </div>
  )

  return (
    <ConfigProvider
      theme={{
        components: {
          Form: {
            itemMarginBottom: 0
          }
        }
      }}
    >
      <Space className='w-full' size={20} direction='vertical'>
        <Flex justify='space-between' align='center'>
          <Typography.Title level={5}>Account: {data?.total ?? 0}</Typography.Title>
          <Button
            type='primary'
            onClick={() => {
              setCreateLecture(true)
            }}
          >
            Create Lecturer
          </Button>
        </Flex>
        <Space align='start' direction='vertical' className='w-full'>
          {searchForm}
        </Space>
        <Table {...tableProps} columns={columns} />
      </Space>
      <CreateLecture
        centered
        open={createLecture}
        onCancel={() => setCreateLecture(false)}
        onFinish={(value) => {
          createLectures(value)
        }}
        // onOk={() => setCreateLecture(false)}
      />
      {contextHolder}
    </ConfigProvider>
  )
}