Undo

Undo는 opt-in입니다. 해당 deck에서 undo/back-swipe UX를 제공할 때 Root에 undoEnabled를 추가하세요.

<ProfileDeck.Root data={profiles} getKey={(item) => item.id} undoEnabled>
  <ProfileDeck.Card>{({ item }) => <ProfileCard profile={item} />}</ProfileDeck.Card>
</ProfileDeck.Root>

활성화되면 성공한 swipe마다 key/index/direction metadata entry 하나를 LIFO undo stack에 저장합니다. Lookup은 현재 data에 대한 key-to-index map을 사용하고, data나 key가 바뀌면 invalid entry를 prune합니다.

생략하면 성공한 swipe도 undo metadata를 저장하지 않고, canUndofalse를 유지하며, actions.undo()false를 반환합니다.

Undo Button

function UndoButton() {
  const { canUndo } = ProfileDeck.useDeckState();
  const { undo } = ProfileDeck.useDeckActions();

  return (
    <Pressable disabled={!canUndo} onPress={undo}>
      <Text>Undo</Text>
    </Pressable>
  );
}

Undo Motion

SwipeDeckUndoMotion으로 restored card가 들어오는 motion을 조정할 수 있습니다.

import { createSwipeDeck, SwipeDeckUndoMotion } from '@react-native-motion-kit/swipe-deck';

const ProfileDeck = createSwipeDeck<Profile>({
  undoMotion: SwipeDeckUndoMotion.spring({
    springConfig: {
      damping: 36,
      stiffness: 300,
      mass: 3,
    },
  }),
});

제공되는 recipe는 다음과 같습니다.

  • SwipeDeckUndoMotion.spring(options?): Reanimated withSpring으로 restore합니다.
  • SwipeDeckUndoMotion.timing(options?): deterministic한 withTiming으로 restore합니다.

두 recipe는 공통으로 다음 옵션을 받습니다.

  • from: 'auto' | 'left' | 'right': auto는 원래 swipe된 방향에서 card를 되돌립니다.
  • entryDistance: 화면 밖 시작 거리를 number 또는 layout callback으로 지정합니다.

timingduration, easing을 추가로 받고 기본 duration은 0입니다. 별도 motion을 설정하지 않으면 card를 즉시 복원합니다. springspringConfig를 받습니다.

우선순위

undoMotion은 replacement 방식입니다.

  1. createSwipeDeck({ undoMotion })의 factory undoMotion
  2. 해당 Root에서 factory default를 대체하는 Root undoMotion
  3. actions.undo(recipe)에 넘긴 per-call recipe

Undo도 callback으로 바로 넘겨도 안전합니다. React Native press event가 undo로 전달되면 그 event 인자는 무시됩니다.