react-native-gesture-handler#Directions TypeScript Examples
The following examples show how to use
react-native-gesture-handler#Directions.
You can vote up the ones you like or vote down the ones you don't like,
and go to the original project or source file by following the links above each example. You may check out the related API usage on the sidebar.
Example #1
Source File: InputContainer.tsx From SQL-Play with GNU Affero General Public License v3.0 | 4 votes |
InputContainer: FC<Props> = ({
inputValue,
setInputValue,
isPremium,
setPremiumModalOpen,
}) => {
const historyOffset = useRef<number>(-1);
const [autoCompleteTxt, setAutoCompleteTxt] = useState<string>('');
const showPremiumAlert = (): void => {
Alert.alert(
'Go premium to unlock query history',
'By going premium, you can unlock history with autocomplete and many more',
[
{text: 'Go Premium', onPress: () => setPremiumModalOpen(true)},
{text: 'Close', style: 'cancel'},
],
);
};
const onUpArrowPress = async (): Promise<void> => {
/** show premium alert when user is not premium */
if (!isPremium) {
showPremiumAlert();
return;
}
const lastCommand = await getLastUserCommand(historyOffset.current + 1);
// console.log(historyOffset.current + 1, lastCommand);
// only set if command is there
if (lastCommand) {
setInputValue(lastCommand);
historyOffset.current++;
}
};
const onDownArrowPress = async (): Promise<void> => {
/** show premium alert when user is not premium */
if (!isPremium) {
showPremiumAlert();
return;
}
if (historyOffset.current === 0) {
return;
} // do nothing if offset it 0
const lastCommand = await getLastUserCommand(historyOffset.current - 1);
// console.log(historyOffset.current - 1, lastCommand);
// only set if command is there
if (lastCommand) {
setInputValue(lastCommand);
historyOffset.current--;
}
};
type CallbackType = (...args: string[]) => void;
// eslint-disable-next-line react-hooks/exhaustive-deps
const getAutoComplete = useCallback<CallbackType>(
debounce(
(val: string) =>
findUserCommands(val).then(e => {
// console.log('autocomplete', e);
setAutoCompleteTxt(e);
}),
100,
),
[],
);
useEffect(() => {
// console.log(inputValue);
if (!isPremium) {
return;
}
if (inputValue !== '') {
getAutoComplete(inputValue);
} else {
setAutoCompleteTxt('');
}
}, [getAutoComplete, inputValue, isPremium]);
const clearInput = () => {
setInputValue('');
};
const setAutoInput = () => {
isPremium && setInputValue(autoCompleteTxt);
};
const handleSwipeLeft = ({
nativeEvent,
}: FlingGestureHandlerStateChangeEvent) => {
if (nativeEvent.state === State.ACTIVE) {
isPremium && clearInput();
}
};
const handleSwipeRight = ({
nativeEvent,
}: FlingGestureHandlerStateChangeEvent) => {
if (nativeEvent.oldState === State.ACTIVE) {
setAutoInput();
}
};
const styles = useDynamicValue(dynamicStyles);
return (
<View>
<Text style={styles.inputHeader}>Type your SQL Query</Text>
<View style={styles.inputContainer}>
<GestureRecognizer
onSwipeRight={setAutoInput}
onSwipeLeft={() => isPremium && clearInput()}
>
<FlingGestureHandler
direction={Directions.RIGHT}
onHandlerStateChange={handleSwipeRight}
>
<FlingGestureHandler
direction={Directions.LEFT}
onHandlerStateChange={handleSwipeLeft}
>
<TextInput
style={styles.input}
autoFocus={true}
testID={ids.queryTextInput}
onChangeText={text => setInputValue(text)}
multiline
placeholderTextColor="gray"
textAlignVertical="top"
defaultValue={inputValue}
keyboardType="ascii-capable"
autoCorrect={false}
numberOfLines={4}
placeholder="Type your SQL query"
/>
</FlingGestureHandler>
</FlingGestureHandler>
</GestureRecognizer>
<Text
suppressHighlighting={true}
onLongPress={setAutoInput}
style={styles.autoCompleteTxt}
>
{autoCompleteTxt}
</Text>
</View>
<View style={styles.sideButtonContainer}>
<TouchableOpacity
accessibilityLabel="Up Button"
accessibilityHint="gets the previous command from history"
onPress={onUpArrowPress}
>
<Icon size={30} name="arrow-up-bold-box" color={sideButton} />
</TouchableOpacity>
<TouchableOpacity
style={styles.downArrow}
accessibilityLabel="Down Button"
accessibilityHint="gets the next command from history"
onPress={onDownArrowPress}
>
<Icon size={30} name="arrow-up-bold-box" color={sideButton} />
</TouchableOpacity>
<TouchableOpacity
onPress={clearInput}
accessibilityLabel="Clear command button"
accessibilityHint="clear the command input"
>
<Icon size={30} name="text-box-remove" color={sideButton} />
</TouchableOpacity>
</View>
</View>
);
}