All files / src/components/navigation-cancel NavigationCancelButton.tsx

100% Statements 5/5
90% Branches 9/10
100% Functions 2/2
100% Lines 5/5

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64                                      8x 8x                 8x       8x                             2x                              
import React from "react";
import { Pressable, StyleSheet, ViewStyle } from "react-native";
import { Ionicons } from "@expo/vector-icons";
 
interface NavigationCancelButtonProps {
  readonly icon: keyof typeof Ionicons.glyphMap;
  readonly onPress: () => void;
  readonly variant?: "default" | "danger";
  readonly size?: number;
  readonly testId?: string;
}
 
export default function NavigationCancelButton({
  icon,
  onPress,
  variant = "default",
  size = 54,
  testId,
}: NavigationCancelButtonProps) {
  const isDanger = variant === "danger";
  const buttonStyle: ViewStyle = {
    width: size,
    height: size,
    borderRadius: size / 2,
    backgroundColor: isDanger ? "#ef2a2a" : "#ffffff",
    borderColor: "#800020",
    borderWidth: 1.5,
  };
 
  return (
    <Pressable
      testID={testId}
      onPress={onPress}
      style={({ pressed }) => [
        styles.button,
        buttonStyle,
        pressed && styles.buttonPressed,
      ]}
    >
      <Ionicons
        name={icon}
        size={isDanger ? 30 : 22}
        color={isDanger ? "#ffffff" : "#800020"}
      />
    </Pressable>
  );
}
 
const styles = StyleSheet.create({
  button: {
    alignItems: "center",
    justifyContent: "center",
    shadowColor: "#000",
    shadowOpacity: 0.18,
    shadowRadius: 8,
    shadowOffset: { width: 0, height: 2 },
    elevation: 5,
  },
  buttonPressed: {
    opacity: 0.82,
    transform: [{ scale: 0.98 }],
  },
});