import * as React from 'react'; import { FC, Fragment, ReactElement, useRef, useState } from 'react'; import { SearchOutlined, EditOutlined, DeleteOutlined, PlusOutlined, } from '@ant-design/icons'; import { Button, Input } from '@imphnen-frontend-service/ui/atoms'; import { DataTable } from '@imphnen-frontend-service/ui/organisms'; import { ColumnDef, getCoreRowModel, getPaginationRowModel, PaginationState, useReactTable, RowSelectionState, } from '@tanstack/react-table'; import ModalAddItem from './_components/modal-add-item'; import ModalUpdateItem from './_components/modal-update-item'; import ModalDeleteItem from './_components/modal-delete-item'; import { useQueryState } from '@imphnen-frontend-service/utils'; import { useGachaItemList, useCreateGachaItem, useUpdateGachaItem, useDeleteGachaItem, TGachaItemDto, } from '@imphnen-frontend-service/service'; export const Components: FC = (): ReactElement => { const [showModalAddItem, setShowModalAddItem] = useState(false); const [showModalUpdateItem, setShowModalUpdateItem] = useState(false); const [showModalDeleteItem, setShowModalDeleteItem] = useState(false); const [selectedItem, setSelectedItem] = useState(null); const [search, setSearch] = useState(''); const pendingFormData = useRef(null); const { step: currentStep, nextStep, prevStep, resetStep, } = useQueryState('step', { defaultValue: 1, maxValue: 2, minValue: 1, }); const [pagination, setPagination] = React.useState({ pageIndex: 0, pageSize: 9, }); const [rowSelection, setRowSelection] = React.useState({}); const { data: itemsData, isLoading } = useGachaItemList({ search, page: pagination.pageIndex + 1, per_page: pagination.pageSize, }); const createItem = useCreateGachaItem(); const updateItem = useUpdateGachaItem(); const deleteItem = useDeleteGachaItem(); const items: TGachaItemDto[] = itemsData?.data ?? []; const totalItems = itemsData?.meta?.total ?? items.length; const handleAdd = async (): Promise => { if (pendingFormData.current) { const { itemName, quantity, chanceRate } = pendingFormData.current; await createItem.mutateAsync({ item_code: (itemName as string).toLowerCase().replace(/\s+/g, '-'), name: itemName, description: '', rarity: 'common', type_: 'physical', category: 'merchandise', value: 0, weight: chanceRate ?? 1, stock: quantity ?? 1, is_limited: false, }); } return true; }; const handleUpdate = async (): Promise => { if (selectedItem && pendingFormData.current) { const { itemName, quantity, chanceRate } = pendingFormData.current; await updateItem.mutateAsync({ id: selectedItem.id, data: { name: itemName, weight: chanceRate, stock: quantity, }, }); } return true; }; const handleDelete = async () => { if (selectedItem) { await deleteItem.mutateAsync(selectedItem.id); } setShowModalDeleteItem(false); }; const columns: ColumnDef[] = [ { id: 'select', header: ({ table }) => ( ), cell: ({ row }) => ( ), }, { header: 'No', accessorKey: 'id', }, { header: 'Nama Item', accessorKey: 'name', }, { header: 'Action', cell: ({ row }) => (
), }, ]; const table = useReactTable({ data: items, columns, state: { pagination, rowSelection, }, enableRowSelection: true, onRowSelectionChange: setRowSelection, getCoreRowModel: getCoreRowModel(), getPaginationRowModel: getPaginationRowModel(), onPaginationChange: setPagination, pageCount: Math.ceil(totalItems / pagination.pageSize), manualPagination: true, }); return (

Gacha Roll

setSearch(e.target.value)} />
{isLoading ? (
Loading...
) : ( )}
setShowModalAddItem(false)} nextStep={nextStep} prevStep={prevStep} resetStep={resetStep} handleAddItem={handleAdd} onDataCapture={(data) => { pendingFormData.current = data; }} /> setShowModalUpdateItem(false)} nextStep={nextStep} prevStep={prevStep} resetStep={resetStep} handleUpdateItem={handleUpdate} initialValues={selectedItem ? { itemName: selectedItem.name } : undefined} onDataCapture={(data) => { pendingFormData.current = data; }} /> setShowModalDeleteItem(false)} handleDeleteItem={handleDelete} />
); }; export default Components;