mirror of
https://github.com/whscullin/apple2js.git
synced 2024-01-12 14:14:38 +00:00
The major impetus for rewriting in UI, at least. Still some ironing to do, but much nicer than my attempt to do this using the old UI "framework".
75 lines
2.0 KiB
TypeScript
75 lines
2.0 KiB
TypeScript
import { h } from 'preact';
|
|
import { useCallback, useState } from 'preact/hooks';
|
|
import cs from 'classnames';
|
|
import SmartPort from '../cards/smartport';
|
|
import { BlockFileModal } from './BlockFileModal';
|
|
import { ErrorModal } from './ErrorModal';
|
|
|
|
import styles from './css/BlockDisk.module.css';
|
|
|
|
/**
|
|
* Storage structure for drive state returned via callbacks.
|
|
*/
|
|
export interface BlockDiskData {
|
|
number: 1 | 2;
|
|
on: boolean;
|
|
name?: string;
|
|
}
|
|
|
|
/**
|
|
* Interface for BlockDisk.
|
|
*/
|
|
export interface BlockDiskProps extends BlockDiskData {
|
|
smartPort: SmartPort | undefined;
|
|
}
|
|
|
|
/**
|
|
* BlockDisk component
|
|
*
|
|
* Includes drive light, disk name and side, and UI for loading disks.
|
|
*
|
|
* @param smartPort SmartPort object
|
|
* @param number Drive 1 or 2
|
|
* @param on Active state
|
|
* @param name Disk name identifier
|
|
* @param side Disk side identifier
|
|
* @returns BlockDisk component
|
|
*/
|
|
export const BlockDisk = ({ smartPort, number, on, name }: BlockDiskProps) => {
|
|
const [modalOpen, setModalOpen] = useState(false);
|
|
const [error, setError] = useState<unknown>();
|
|
|
|
const doClose = useCallback(() => {
|
|
setModalOpen(false);
|
|
}, []);
|
|
|
|
const onOpenModal = useCallback(() => {
|
|
setModalOpen(true);
|
|
}, []);
|
|
|
|
return (
|
|
<div className={styles.disk}>
|
|
<ErrorModal error={error} setError={setError} />
|
|
<BlockFileModal
|
|
smartPort={smartPort}
|
|
number={number}
|
|
onClose={doClose}
|
|
isOpen={modalOpen}
|
|
/>
|
|
<div
|
|
id={`disk${number}`}
|
|
className={cs(styles.diskLight, { [styles.on]: on })}
|
|
/>
|
|
<button title="Load Disk" onClick={onOpenModal}>
|
|
<i className="fas fa-folder-open" />
|
|
</button>
|
|
<div
|
|
id={`disk-label${number}`}
|
|
className={styles.diskLabel}
|
|
>
|
|
{name}
|
|
</div>
|
|
</div>
|
|
);
|
|
};
|