1.0.0 • Published 4 years ago

react-native-yet-another-sortable v1.0.0

Weekly downloads
9
License
MIT
Repository
github
Last release
4 years ago

react-native-yet-another-sortable

Build Status

A sortable scrollable grid / list component for React Native.

  • Change number of columns and row height on the fly
  • Much better performance (especially in debug, compared to alternatives)
  • Fast updates
  • Controllable order
  • Auto-scroll when dragged item is close to the container's border Essentially based on react-native-sortable-grid, it has some improvements and changes, that made me publish it as a separate package instead of making a PR.

Getting Started

Installation

npm install react-native-yet-another-sortable --save

Usage

Check out example project.

import React, { useState, useCallback } from 'react';
import SortableGrid from 'react-native-yet-another-sortable';

const Example = () => {
  const [data] = useState([
    { value: 0, key: 'key0' },
    { value: 1, key: 'key1' },
    { value: 2, key: 'key2' },
  ]);

  const [order, setOrder] = useState(['key2', 'key1', 'key0']);

  const renderItem = useCallback(({ value, color }) => (
    <View style={{ flex: 1 }}>
      <Text>{value}</Text>
    </View>
  ), []);

  return (
    <View style={{ flex: 1 }}>
      <SortableGrid
        order={order}
        data={data}
        renderItem={renderItem}
        onDeactivateDrag={setOrder}
      />
    </View>
  );
};

Props

parametertyperequireddescription
orderarray of string keysyesarray of data key properties used to determine entry order
dataarray of objects with key propertyyesarray of items to be passed to renderItem
rowHeightnumbernorow height
columnsnumbernonumber of columns per row
activationTresholdnumbernotime in ms required to activate drag on hold
transitionDurationnumbernotime in ms required to move cell to its position on release
renderItemfunctionyesrender function for each entry, is passed a data item

Event props

parametertyperequireddescription
onActivateDrag(key, grid) => voidnoWill execute after one holds the item for activateTreshold, before onGrantBlock
onGrantBlock(event, gestureState, grid) => voidnoWill execute on drag start
onMoveBlock(event, gestureState, grid) => voidnoWill execute on each move
onReleaseBlock(event, gestureState, grid) => voidnoWill execute on drag release
onDeactivateDrag(order, grid) => voidnoWill execute on active item drop, after onReleaseBlock, with new order as an argument

Data item props

parametertyperequireddescription
inactivebooleannoMakes block not draggable
keystringyeskey used to order items

Development

In order to develop the application or build android .apk from the sources one should: 1. Clone this repository 2. Install package dependencies with npm install 3. Navigate to example folder: cd example 3. Install example project dependencies npm install 3. Run Metro bundler with react-native start 4. Connect an emulator or physical device via adb, like this (tested with mEMU): - adb connect 127.0.0.1:21503 - adb reverse tcp:8081 tcp:8081 5. Build and watch with react-native run-android, changes from src directory are picked automatically because of example's metro and babel configurations.

Contributions

PR are always welcome!

Todos

  • Better scroll-on-drag behaviour (smooth scroll without ugly timeouts and large scroll results in the dragged block trembling)
  • Refactoring while perserving the performance
  • Actual tests