diff --git a/app/src/examples/LettersExample.tsx b/app/src/examples/LettersExample.tsx new file mode 100644 index 00000000000..135adb46b30 --- /dev/null +++ b/app/src/examples/LettersExample.tsx @@ -0,0 +1,74 @@ +import React, { useEffect } from 'react'; +import { Platform, StyleSheet, View } from 'react-native'; +import Animated, { FadeIn, FadeOut, Layout } from 'react-native-reanimated'; + +function splitLetters(text: string) { + const map = new Map(); + return text.split('').map((char) => { + const nth = map.get(char) || 0; + map.set(char, nth + 1); + return { char, key: `${char}${nth}` }; + }); +} + +interface LettersProps { + text: string; +} + +function Letters({ text }: LettersProps) { + return ( + + {splitLetters(text).map(({ char, key }, index) => ( + + {char} + + ))} + + ); +} + +const LOREM_IPSUM_1 = + 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque vel consequat urna, facilisis tincidunt massa. Fusce viverra leo non mi lacinia dictum. Sed cursus feugiat dui, quis malesuada sapien auctor vitae. Nulla ut erat ac leo posuere suscipit. Vivamus eleifend placerat elit, ut efficitur ligula semper nec. Aenean dictum volutpat sapien eget sollicitudin. Praesent non ultricies mauris, sit amet gravida ante. Morbi iaculis elit quis libero pretium dapibus. Vivamus ullamcorper leo id dapibus tempus. Aenean malesuada eleifend justo, at eleifend lectus varius ac. Donec et nibh dignissim, mollis est tincidunt, dignissim justo. Sed laoreet tempor mi, sit amet fringilla tellus varius nec. Pellentesque ut mi orci. Donec in ultrices metus.'; + +const LOREM_IPSUM_2 = + 'Suspendisse eleifend et orci in vestibulum. In ut porttitor tortor. Vivamus dignissim mollis metus, sit amet scelerisque nunc porta quis. Mauris velit arcu, feugiat ac libero vel, commodo laoreet neque. In eu odio non nunc luctus lobortis. Duis scelerisque nec velit sit amet pretium. Quisque ac odio ac leo auctor dapibus at et justo. Sed est metus, commodo vitae elit at, porta interdum quam. Aenean porta nunc risus, vitae viverra massa pretium vitae. Donec feugiat placerat lectus, ac laoreet ligula. Vivamus scelerisque rhoncus nisi eu aliquet. Nunc quis aliquam nulla, et convallis mauris. Sed egestas nunc facilisis, tempor leo ut, lacinia quam. Donec tincidunt nulla eu velit aliquam posuere. Duis vestibulum placerat sodales. Quisque dignissim.'; + +export default function LettersExample() { + const [state, setState] = React.useState(true); + + useEffect(() => { + const id = setInterval(() => { + setState((s) => !s); + }, 2000); + return () => clearInterval(id); + }, []); + + return ( + + + + ); +} + +const styles = StyleSheet.create({ + container: { + flex: 1, + alignItems: 'center', + justifyContent: 'center', + }, + line: { + flexDirection: 'row', + flexWrap: 'wrap', + maxWidth: 325, + }, + text: { + fontFamily: Platform.OS === 'ios' ? 'Palatino' : 'serif', + fontWeight: '500', + fontSize: 23, + }, +}); diff --git a/app/src/examples/index.ts b/app/src/examples/index.ts index 5ce31b819b0..ce8ba5ff2f5 100644 --- a/app/src/examples/index.ts +++ b/app/src/examples/index.ts @@ -39,6 +39,7 @@ import ImageStackExample from './SharedElementTransitions/ImageStack'; import InvertedFlatListExample from './InvertedFlatListExample'; import KeyframeAnimation from './LayoutAnimations/KeyframeAnimation'; import LayoutAnimationExample from './SharedElementTransitions/LayoutAnimation'; +import LettersExample from './LettersExample'; import LightBoxExample from './LightBoxExample'; import LiquidSwipe from './LiquidSwipe/LiquidSwipe'; import ManyScreensExample from './SharedElementTransitions/ManyScreens'; @@ -144,6 +145,11 @@ export const EXAMPLES: Record = { title: 'Article progress', screen: ArticleProgressExample, }, + LettersExample: { + icon: '📖', + title: 'Letters', + screen: LettersExample, + }, // Basic examples diff --git a/ios/LayoutReanimation/REAAnimationsManager.m b/ios/LayoutReanimation/REAAnimationsManager.m index 365ae4f9e53..cd1a311ee84 100644 --- a/ios/LayoutReanimation/REAAnimationsManager.m +++ b/ios/LayoutReanimation/REAAnimationsManager.m @@ -396,7 +396,8 @@ - (BOOL)startAnimationsRecursive:(UIView *)view return NO; } - BOOL hasExitAnimation = _hasAnimationForTag(view.reactTag, EXITING) || [_exitingViews objectForKey:view.reactTag]; + BOOL hasExitAnimation = + [self hasAnimationForTag:view.reactTag type:EXITING] || [_exitingViews objectForKey:view.reactTag]; BOOL hasAnimatedChildren = NO; shouldRemoveSubviewsWithoutAnimations = shouldRemoveSubviewsWithoutAnimations && !hasExitAnimation; NSMutableArray *toBeRemoved = [[NSMutableArray alloc] init];