93 lines
2.8 KiB
TypeScript
Raw Normal View History

2024-10-10 10:56:25 +02:00
import { Cell, Row, Table } from "@codex-storage/marketplace-ui-components";
2024-09-20 19:46:21 +02:00
import { PrettyBytes } from "../../utils/bytes";
import { AvailabilityActionsCell } from "./AvailabilityActionsCell";
import { CodexAvailability, CodexNodeSpace } from "@codex-storage/sdk-js/async";
import { Times } from "../../utils/times";
import { Fragment, useState } from "react";
2024-09-24 12:56:06 +02:00
import { AvailabilityReservations } from "./AvailabilityReservations";
import { AvailabilityIdCell } from "./AvailabilityIdCell";
import { Arrays } from "../../utils/arrays";
2024-11-06 02:33:58 +01:00
import { SlotRow } from "./SlotRow";
import { AvailabilityWithSlots } from "./types";
import { AvailabilityDiskRow } from "./AvailabilityDiskRow";
2024-11-06 02:33:58 +01:00
import { ChevronDown } from "./ChevronDown";
import { attributes } from "../../utils/attributes";
2024-09-20 19:46:21 +02:00
type Props = {
// onEdit: () => void;
space: CodexNodeSpace;
availabilities: AvailabilityWithSlots[];
2024-09-20 19:46:21 +02:00
};
export function AvailabilitiesTable({ availabilities, space }: Props) {
2024-09-24 12:56:06 +02:00
const [availability, setAvailability] = useState<CodexAvailability | null>(
null
);
const [details, setDetails] = useState<string[]>([]);
2024-09-20 19:46:21 +02:00
const headers = [
"",
2024-09-20 19:46:21 +02:00
"id",
"total size",
"duration",
"min price",
"max collateral",
"actions",
];
2024-09-24 12:56:06 +02:00
const onReservationsClose = () => setAvailability(null);
2024-11-06 02:33:58 +01:00
const rows = availabilities.map((a) => {
const showDetails = details.includes(a.id);
const onShowDetails = () => setDetails(Arrays.toggle(details, a.id));
const hasSlots = a.slots.length > 0;
return (
<Fragment key={a.id + a.duration}>
<Row
2024-11-06 02:33:58 +01:00
className="availabilty-row"
cells={[
<Cell>
{hasSlots ? (
<ChevronDown
2024-11-06 02:33:58 +01:00
{...attributes({ "aria-expanded": showDetails })}
onClick={onShowDetails}></ChevronDown>
) : (
2024-11-06 02:33:58 +01:00
""
)}
</Cell>,
2024-11-06 02:33:58 +01:00
<AvailabilityIdCell value={a} />,
<Cell>{PrettyBytes(a.totalSize)}</Cell>,
<Cell>{Times.pretty(a.duration)}</Cell>,
<Cell>{a.minPrice.toString()}</Cell>,
<Cell>{a.maxCollateral.toString()}</Cell>,
<AvailabilityActionsCell availability={a} />,
]}></Row>
{a.slots.map((slot) => (
2024-11-06 02:33:58 +01:00
<SlotRow
key={slot.id}
active={showDetails}
bytes={parseFloat(slot.size)}
2024-11-06 02:33:58 +01:00
id={slot.id}></SlotRow>
))}
</Fragment>
);
});
rows.unshift(
<AvailabilityDiskRow bytes={space.quotaMaxBytes}></AvailabilityDiskRow>
);
2024-09-20 19:46:21 +02:00
2024-09-24 12:56:06 +02:00
return (
<>
2024-10-08 15:33:04 +02:00
<Table headers={headers} rows={rows} />
2024-09-24 12:56:06 +02:00
<AvailabilityReservations
availability={availability}
onClose={onReservationsClose}
open={!!availability}></AvailabilityReservations>
</>
);
2024-09-20 19:46:21 +02:00
}