import type { ThemeType } from '../../literals/Type.literal';
import { useTheme } from './../../hooks/useTheme';
import { Image, StyleSheet, TouchableOpacity, View } from 'react-native';
import { useState } from 'react';
import ZenIcon from './../themed/ZenIcon';
import ThemeConfig from '../../config/Theme.config';
import ZenText from '../themed/ZenText';
import LayoutConfig from '../../config/LayoutConfig';
import ColorUtil from '../../util/Color.util';
type ZenPlayProps = {
type?: ThemeType;
imageSource: any;
style?: any;
onPress?: () => void;
icon?: string;
leftText?: string;
rightIcon?: string;
bordered?: boolean;
};
/**
* @docunator
* @title ZenPlay
* @description A play button component overlayed on an image, with optional left text and right icon.
* @author Danilo RamÃrez Mattey
* @version 1.0.0
* @category Widget Components
* @param {string} type - The theme type for the component (e.g., 'primary', 'secondary').
* @param {ImageSource} imageSource - The source of the image to display.
* @param {StyleSheet} style - Additional styles for the component container.
* @param {Function} onPress - Function to execute when the play button is pressed.
* @param {string} icon - The name of the icon to display on the play button.
* @param {string} leftText - Optional text to display at the bottom left of the image.
* @param {string }rightIcon - Optional icon name to display at the bottom right of the image.
* @param {boolean} bordered - Whether to display a border around the component. Default is false.
* @snack @daniloramirezcr/zenui-play-example
* @example {tsx}
import {
Layout,
Screen,
ZenPlay,
} from 'react-zen-ui';
import { StyleSheet } from 'react-native';
export default function PlayScreen() {
const styles = StyleSheet.create({
play: {
width: 200,
height: 200,
},
});
const handlePlayPress = () => {
console.log('Play button pressed!');
};
return (
<>
>
);
}
{/tsx}
*/
export default function ZenPlay({
type = 'primary',
imageSource,
style = {},
onPress = () => null,
icon = 'play',
leftText,
rightIcon,
bordered = false,
}: ZenPlayProps) {
const theme = useTheme();
if (!theme[type]) {
throw new Error('Invalid theme type provided to ZenPlay component.');
}
const [containerWidth, setContainerWidth] = useState(0);
// const [containerHeight, setContainerHeight] = useState(0);
const handleLayout = (event: any) => {
const {
width,
// height
} = event.nativeEvent.layout;
setContainerWidth(width);
// setContainerHeight(height);
};
const styles = StyleSheet.create({
container: {
display: 'flex',
alignItems: 'center',
justifyContent: 'center',
position: 'relative',
borderWidth: (bordered ? 1 : 0),
borderColor: theme[type],
borderStyle: 'solid',
borderRadius: (bordered ? LayoutConfig.border : 0),
overflow: 'hidden',
},
image: {
// minWidth: 10,
// minHeight: 10,
aspectRatio: 1,
position: 'relative',
width: containerWidth,
// height: containerWidth
},
buttonContainer: {
width: '100%',
aspectRatio: 1,
display: 'flex',
alignItems: 'center',
justifyContent: 'center',
// backgroundColor: 'red',
position: 'absolute',
top: 0,
left: 0,
right: 0,
bottom: 0,
},
button: {
backgroundColor: theme.background,
opacity: ThemeConfig.defaultDimValue,
borderRadius: 999,
},
leftText: {
position: 'absolute',
left: LayoutConfig.space / 4,
bottom: LayoutConfig.space / 4,
backgroundColor: ColorUtil.hexToRgb(
theme.background,
ThemeConfig.defaultDimValue
),
},
rightIcon:{
position: 'absolute',
right: LayoutConfig.space / 4,
bottom: LayoutConfig.space / 4,
backgroundColor: ColorUtil.hexToRgb(
theme.background,
ThemeConfig.defaultDimValue
),
}
});
return (
<>
{leftText && (
{leftText}
)}
{rightIcon && (
)}
>
);
}