toggle-corp/react-store

View on GitHub
components/View/SortableListView/ListView/ListItem/index.js

Summary

Maintainability
A
0 mins
Test Coverage
import PropTypes from 'prop-types';
import React from 'react';
import { SortableElement } from 'react-sortable-hoc';
import { _cs } from '@togglecorp/fujs';

import ItemDrag from './ItemDrag';
import styles from './styles.scss';

const propTypes = {
    data: PropTypes.object.isRequired, // eslint-disable-line react/forbid-prop-types
    dataIndex: PropTypes.number.isRequired,
    dataKey: PropTypes.oneOfType([
        PropTypes.string,
        PropTypes.number,
    ]).isRequired,

    showDragHandle: PropTypes.bool,
    dragIconPosition: PropTypes.string,
    className: PropTypes.string,

    renderer: PropTypes.func.isRequired,
    rendererParams: PropTypes.func,
    rendererClassName: PropTypes.string,

    dragHandleClassName: PropTypes.string,
};

const defaultProps = {
    showDragHandle: true,
    dragIconPosition: 'left',
    className: '',
    rendererClassName: '',
    rendererParams: undefined,

    dragHandleClassName: '',
};

@SortableElement
export default class ListItem extends React.Component {
    static propTypes = propTypes;

    static defaultProps = defaultProps;

    render() {
        const {
            data,
            dataKey,
            dataIndex,

            showDragHandle,
            dragIconPosition,
            rendererClassName,
            renderer: Renderer,
            rendererParams,

            className: classNameFromProps,
            dragHandleClassName,
            ...otherProps
        } = this.props;

        const dragHandleChild = (
            <ItemDrag
                dataKey={dataKey}
                data={data}
                dataIndex={dataIndex}
                className={dragHandleClassName}

                {...otherProps}
            />
        );

        const className = _cs(styles.sortableItem, classNameFromProps, 'sortable-item');

        // FIXME: fourth argument to rendererParams is not available
        const extraProps = rendererParams ? rendererParams(dataKey, data, dataIndex) : undefined;

        return (
            <div className={className}>
                {showDragHandle && dragIconPosition === 'left' && dragHandleChild }
                <Renderer
                    className={rendererClassName}
                    key={dataKey}
                    {...extraProps}
                />
                {showDragHandle && dragIconPosition === 'right' && dragHandleChild }
            </div>
        );
    }
}