import { Image, ImageStyle, StyleProp, TouchableOpacity, TouchableOpacityProps, View, ViewProps, ViewStyle, } from "react-native" import { useAppTheme } from "@/theme/context" export type IconTypes = keyof typeof iconRegistry type BaseIconProps = { /** * The name of the icon */ icon: IconTypes /** * An optional tint color for the icon */ color?: string /** * An optional size for the icon. If not provided, the icon will be sized to the icon's resolution. */ size?: number /** * Style overrides for the icon image */ style?: StyleProp /** * Style overrides for the icon container */ containerStyle?: StyleProp } type PressableIconProps = Omit & BaseIconProps type IconProps = Omit & BaseIconProps /** * A component to render a registered icon. * It is wrapped in a * @see [Documentation and Examples]{@link https://docs.infinite.red/ignite-cli/boilerplate/app/components/Icon/} * @param {PressableIconProps} props - The props for the `PressableIcon` component. * @returns {JSX.Element} The rendered `PressableIcon` component. */ export function PressableIcon(props: PressableIconProps) { const { icon, color, size, style: $imageStyleOverride, containerStyle: $containerStyleOverride, ...pressableProps } = props const { theme } = useAppTheme() const $imageStyle: StyleProp = [ $imageStyleBase, { tintColor: color ?? theme.colors.text }, size !== undefined && { width: size, height: size }, $imageStyleOverride, ] return ( ) } /** * A component to render a registered icon. * It is wrapped in a , use `PressableIcon` if you want to react to input * @see [Documentation and Examples]{@link https://docs.infinite.red/ignite-cli/boilerplate/app/components/Icon/} * @param {IconProps} props - The props for the `Icon` component. * @returns {JSX.Element} The rendered `Icon` component. */ export function Icon(props: IconProps) { const { icon, color, size, style: $imageStyleOverride, containerStyle: $containerStyleOverride, ...viewProps } = props const { theme } = useAppTheme() const $imageStyle: StyleProp = [ $imageStyleBase, { tintColor: color ?? theme.colors.text }, size !== undefined && { width: size, height: size }, $imageStyleOverride, ] return ( ) } export const iconRegistry = { back: require("@assets/icons/back.png"), bell: require("@assets/icons/bell.png"), caretLeft: require("@assets/icons/caretLeft.png"), caretRight: require("@assets/icons/caretRight.png"), check: require("@assets/icons/check.png"), clap: require("@assets/icons/demo/clap.png"), // @demo remove-current-line community: require("@assets/icons/demo/community.png"), // @demo remove-current-line components: require("@assets/icons/demo/components.png"), // @demo remove-current-line debug: require("@assets/icons/demo/debug.png"), // @demo remove-current-line github: require("@assets/icons/demo/github.png"), // @demo remove-current-line heart: require("@assets/icons/demo/heart.png"), // @demo remove-current-line hidden: require("@assets/icons/hidden.png"), ladybug: require("@assets/icons/ladybug.png"), lock: require("@assets/icons/lock.png"), menu: require("@assets/icons/menu.png"), more: require("@assets/icons/more.png"), pin: require("@assets/icons/demo/pin.png"), // @demo remove-current-line podcast: require("@assets/icons/demo/podcast.png"), // @demo remove-current-line settings: require("@assets/icons/settings.png"), slack: require("@assets/icons/demo/slack.png"), // @demo remove-current-line view: require("@assets/icons/view.png"), x: require("@assets/icons/x.png"), } const $imageStyleBase: ImageStyle = { resizeMode: "contain", }