RTL support on react native - javascript
I am building a wordpress app using react native
I've used in the load of the app `import {I18nManager} from 'react-native';
I18nManager.forceRTL(true);`
to force the app to use RTL, it worked for me but in the postdetails it still showing LTR even after using
flexDirection: Constants.RTL ? 'row-reverse' : 'row' -> (for the label text)
here is my code for postdetails styles.js, please help me finding the solution for this issue
/** #format */
import { StyleSheet, Dimensions } from 'react-native'
import { Constants } from '#common'
const { width, height } = Dimensions.get('window')
const vw = width / 100
const vh = height / 100
export default StyleSheet.create({
body: {
flex: 1,
backgroundColor: '#fff',
width,
},
fill: {
flex: 1,
backgroundColor: '#ffffff',
},
card: {
width,
flexDirection: Constants.RTL ? 'row-reverse' : 'row',
},
box: {
width: vw * 40,
height: 100,
backgroundColor: '#ccc',
marginLeft: 20,
marginTop: 10,
marginBottom: 10,
},
header: {
position: 'absolute',
top: 0,
left: 0,
zIndex: 2,
right: 0,
backgroundColor: 'rgba(255, 255, 255, 0.5)',
overflow: 'hidden',
height: Constants.Window.headerHeight,
},
linearGradient: {
height: 50,
zIndex: 3,
width,
alignItems: 'flex-end',
justifyContent: 'flex-end',
position: 'absolute',
},
linearGradientBottom: {
height: 50,
bottom: 0,
zIndex: 3,
width,
alignItems: 'flex-end',
justifyContent: 'flex-end',
position: 'absolute',
},
headerIcon: {
height: 40,
position: 'absolute',
top: 0,
width,
zIndex: 4,
},
image: {
width: vw * 40,
height: 90,
resizeMode: 'cover',
marginLeft: 8,
marginTop: 20,
marginBottom: 10,
},
content: {
width: vw * 50,
marginLeft: 14,
marginTop: 20,
marginBottom: 30,
},
greyRow: {
backgroundColor: '#eee',
},
menuView: {
backgroundColor: '#F4F4F4',
height: 40,
},
menuItemView: {
marginTop: 6,
marginRight: 6,
marginBottom: 6,
marginLeft: 6,
height: 28,
},
menuItem: {
marginTop: 6,
marginRight: 16,
marginBottom: 6,
marginLeft: 16,
fontSize: 12,
fontWeight: '500',
color: '#8A939C',
},
menuItemActive: {
backgroundColor: '#fff',
borderRadius: 16,
borderWidth: 1,
borderColor: '#eee',
},
menuActiveText: {
color: '#000',
},
bannerImage: {
width,
height: width / 2 + 40,
backgroundColor: 'rgba(67, 130, 208, 0.2)',
},
placeHolderImage: {
alignItems: 'center',
width,
height: width / 3,
justifyContent: 'center',
backgroundColor: 'rgba(67, 130, 208, 0.2)',
},
backgroundOne: {
backgroundColor: 'rgba(58, 75, 133, 0.6)',
},
backgroundTwo: {
backgroundColor: 'rgba(188, 59, 36, 0.6)',
},
backgroundThree: {
backgroundColor: 'rgba(57, 174, 84, 0.6)',
},
bannerText: {
position: 'absolute',
bottom: 30,
backgroundColor: 'rgba(0, 0, 0, 0.3)',
width: vw * 60,
},
bannerTitle: {
marginTop: 12,
marginRight: 12,
marginBottom: 2,
marginLeft: 12,
color: 'white',
fontSize: 15,
},
bannerDate: {
color: 'rgba(255, 255, 255, 0.7)',
fontSize: 9,
fontWeight: '500',
marginLeft: 12,
marginBottom: 12,
},
time: {
color: '#999',
fontSize: 12,
marginTop: 0,
marginBottom: 0,
marginLeft: 0,
},
tagView: {
flexDirection: Constants.RTL ? 'row-reverse' : 'row',
alignItems: 'flex-start',
justifyContent: 'flex-start',
marginBottom: 6,
},
tag: {
backgroundColor: '#aaa',
borderRadius: 12,
alignSelf: 'flex-end',
marginRight: 4,
},
tagText: {
fontSize: 9,
marginTop: 1,
marginRight: 8,
marginBottom: 1,
marginLeft: 8,
color: 'white',
fontWeight: '600',
},
hlist: {
flex: 1,
backgroundColor: 'white',
paddingTop: 0,
paddingRight: 0,
paddingBottom: 0,
paddingLeft: 0,
},
color: {
position: 'absolute',
top: 0,
bottom: 0,
left: 0,
right: 0,
backgroundColor: '#EBEBEB',
},
title: {
color: '#333',
fontSize: 22,
textAlign: 'center',
fontWeight: '200',
marginTop: 12,
},
titleSmall: {
fontSize: 13,
color: '#999',
textAlign: 'center',
marginBottom: 10,
marginTop: 4,
},
productItem: {
width: width - 30,
height: 400,
marginTop: 5,
marginRight: 5,
marginBottom: 5,
marginLeft: 5,
},
detailBlock: {
alignItems: 'center',
backgroundColor: '#fff',
paddingTop: 20,
paddingRight: 20,
paddingBottom: 20,
paddingLeft: 20,
width,
},
scrollView: {
backgroundColor: '#fff',
paddingTop: Constants.Window.headerHeight,
paddingBottom: 200,
},
scrollViewContent: {
position: 'relative',
zIndex: 9,
paddingBottom: 200,
},
innerContent: {
backgroundColor: '#fff'
},
detailDesc: {
color: '#333',
width: width - 20,
marginTop: 16,
marginRight: 16,
marginBottom: 2,
marginLeft: 13,
fontWeight: '500',
fontSize: 22,
textAlign: Constants.RTL ? 'right' : 'left',
},
largeImage: {
width,
height: width - 120,
resizeMode: 'cover',
},
largeContent: {
width,
position: 'absolute',
bottom: 0,
height: 100,
},
largeTitle: {
color: '#fff',
fontSize: 18,
paddingTop: 20,
paddingRight: 20,
paddingBottom: 0,
paddingLeft: 20,
},
description: {
backgroundColor: '#fff',
flexDirection: Constants.RTL ? 'row-reverse' : 'row',
},
imageBackGround: {
position: 'absolute',
top: 0,
left: 0,
right: 0,
width,
height: Constants.Window.headerHeight
},
detailPanel: {
height: 380,
width,
alignItems: 'center',
justifyContent: 'flex-end',
},
toolbar: {
backgroundColor: 'black',
},
shareIcon: {
flexDirection: Constants.RTL ? 'row-reverse' : 'row',
width: 100,
position: 'absolute',
right: 0,
bottom: 16,
},
newsIcons: {
color: '#999',
marginLeft: 20,
},
newsTitle: {
fontSize: 18,
marginTop: 20,
marginRight: 20,
marginBottom: 20,
marginLeft: 20,
color: 'white',
fontWeight: '400',
textAlign: 'left',
backgroundColor: 'transparent',
},
avatar: {
width: 32,
height: 32,
borderRadius: 20,
resizeMode: 'cover',
marginTop: 12,
marginRight: 12,
marginBottom: 12,
marginLeft: 12,
},
wrapComment: {
paddingLeft: 15,
paddingRight: 15,
backgroundColor: '#F7F7F7',
flex: 2 / 6,
},
headCommentText: {
fontSize: 20,
fontWeight: '600',
},
titleVideo: {
flex: 1 / 6,
paddingLeft: 15,
paddingRight: 12,
},
titleVideoText: {
fontSize: 18,
color: 'rgb(11,6,6)',
lineHeight: 22,
fontWeight: 'bold',
},
countViews: {
flex: 1 / 6,
marginTop: 15,
marginLeft: 15,
marginBottom: 5,
},
countViewsText: {
fontSize: 18,
lineHeight: 18,
color: 'rgb(149,149,149)',
},
wrapLikeShare: {
flex: 1 / 6,
marginTop: 5,
marginRight: 10,
marginBottom: 5,
flexDirection: Constants.RTL ? 'row-reverse' : 'row',
justifyContent: 'flex-end',
},
wrapLikeShareInner: {
flexDirection: Constants.RTL ? 'row-reverse' : 'row',
},
icon: {
flexDirection: Constants.RTL ? 'row-reverse' : 'row',
marginRight: 10,
},
numberIcon: {
marginLeft: 5,
fontSize: 18,
},
author: {
color: '#999',
fontSize: 13,
fontWeight: '600',
marginTop: 12,
marginRight: 12,
marginBottom: 12,
marginLeft: 12,
textAlign: Constants.RTL ? 'right' : 'left',
},
relatedPostText: {
fontSize: 16,
fontWeight: 'bold',
paddingTop: 10,
paddingRight: 10,
paddingBottom: 10,
paddingLeft: 10,
},
shareIcons: {
flexDirection: Constants.RTL ? 'row-reverse' : 'row',
justifyContent: 'flex-end',
position: 'absolute',
width,
right: 4,
top: 8,
zIndex: 10,
},
videoView: {
backgroundColor: 'rgba(0,0,0, .8)',
flex: 1,
},
video: {
height: vh * 45,
width,
backgroundColor: '#000',
},
spinkitView: {
backgroundColor: '#ffffff',
flex: 1,
height,
justifyContent: 'center',
position: 'absolute',
top: 0,
},
loadingContainer: {
flex: 1,
justifyContent: 'center',
alignItems: 'center',
},
})
You need to reload the app after forceRTL.Check this link enter link description here
But I think this not a good solution.
Related
Object(...) is not a function - Material UI
Please help me with this error. I am trying to apply some styling for the MUI dropdown but I am getting this Object(...) is not a function error import { makeStyles } from "#material-ui/core/styles"; const dropDownStyle = makeStyles({ formControl: { "& .MuiInputBase-root": { color: "#6EC177", borderColor: "#6EC177", borderWidth: "1px", borderStyle: "solid", borderRadius: "100px", minWidth: "120px", justifyContent: "center", }, "& .MuiSelect-select.MuiSelect-select": { paddingRight: "0px", }, }, select: { width: "auto", fontSize: "12px", "&:focus": { backgroundColor: "transparent", }, }, selectIcon: { position: "relative", color: "#6EC177", fontSize: "14px", }, paper: { borderRadius: 12, marginTop: 8, }, list: { paddingTop: 0, paddingBottom: 0, "& li": { fontWeight: 200, paddingTop: 8, paddingBottom: 8, fontSize: "12px", }, "& li.Mui-selected": { color: "white", background: "#6EC177", }, "& li.Mui-selected:hover": { background: "#6EC177", }, }, }); export default dropDownStyle;` Object(...) is not a functionObject(...) is not a functionObject(...) is not a function Error: MUI and React version
React Native. While component props changed, one depended element re-renders but another - not
CardItem receives the cardIsLocked prop, which changes frequently and depends on user actions. TouchableOpacity, that affected by this prop, reflects all app state correctly all the time. I can or can't press on it accordingly to my expectations. That is why I know that its disabled prop re-renders well. But prop style of top View component - doesn't. So, all interaction works as demanded but styles not re-renders. How could this difference be possible during usage of the same prop cardIsLocked? Thanks for ideas. const CardItem = (props) => { const card = props.card; const cardIsLocked = props.cardIsLocked; const handler = props.handler.bind(this, { card }); return ( <View style={cardIsLocked // <-- not causes re-renders ? styles.cardLocked : styles.cardActive}> <TouchableOpacity disabled={cardIsLocked} // <-- causes re-renders style={styles.innerCardSpace} onPress={handler} > <View style={styles.card}> <Text style={styles.text}>{card.cardName}</Text> </View> </TouchableOpacity> </View> ); }; export default CardItem; const styles = StyleSheet.create({ cardActive: { padding: 1, borderWidth: 1, borderRadius: 3, maxWidth: 30, minWidth: 30, height: 50, borderColor: "#00ee00", }, cardLocked: { padding: 1, borderWidth: 1, borderRadius: 3, maxWidth: 30, minWidth: 30, height: 50, borderColor: "#black", }, innerCardSpace: { flex: 1, justifyContent: "center", alignContent: "center", flexDirection: "column", margin: 1, }, card: { height: 26, width: 46, alignItems: "center", backgroundColor: "#white", }, text: { fontWeight: "700", fontSize: 10 }, });
Just to formalize the answer. The error is the # at the beginning of the color's name. The # must be used when declaring code RGB like #eeff00. For colors declared as names the # isn't necessary So the re-rendering is occurring. But the problem is when any attribute of style has an unacceptable format, React doesn't apply it, and tries to keep the last identical attribute or will do nothing. The code fixed const styles = StyleSheet.create({ cardActive: { padding: 1, borderWidth: 1, borderRadius: 3, maxWidth: 30, minWidth: 30, height: 50, borderColor: "#00ee00", }, cardLocked: { padding: 1, borderWidth: 1, borderRadius: 3, maxWidth: 30, minWidth: 30, height: 50, borderColor: "black", }, innerCardSpace: { flex: 1, justifyContent: "center", alignContent: "center", flexDirection: "column", margin: 1, }, card: { height: 26, width: 46, alignItems: "center", backgroundColor: "white", }, text: { fontWeight: "700", fontSize: 10 }, });
Creating shadow design in react native
I am trying to create a UI in react-native like in the below picture: Until now I can do only like this: But is there any proper way to do that? <View style={styles.frame1}> <View style={styles.frameBefore}></View> <View style={styles.frame2}> <TextInput/> </View> </View> frame1: { flexDirection: 'row', margin: 10, borderColor: LightColorLine, borderStyle:'solid', borderWidth: 0.5, backgroundColor: LightColorBackgr, padding:10, }, frame2:{ backgroundColor: LightColorTextBackgr, padding: -50, flex: 0.98, }, frameBefore:{ width: 0, height: 60, borderRightWidth: 0.9, borderColor: LightColorLine, borderStyle:'solid', shadowColor: '#000000', shadowOffset: { width: 0, height: 10, }, shadowOpacity: 0.25, shadowRadius: 3.84, elevation: 5, flex: 0.01, transform: [{ rotate: '45deg' }] },
Here is the closest I was able to get The tricky part was creating the shadow on an angle, especially considering the API's React-Native provide for shadows differ so much between iOS and Android. To overcome this I used a linear gradient which is not included by React Native by default. I used expo-linear-gradient but there a few others you can use if you would prefer. export const Triangle = props => ( <View style={props.style}> <LinearGradient colors={['black', 'transparent']} start={[0, 0]} end={[0.5, 0.5]} style={styles.triangleShadow} /> <View style={styles.triangle} /> </View> ); export default class App extends React.Component { render() { return ( <View style={styles.container}> <View style={styles.card}> <Text style={styles.text}>Be Cool.</Text> <Triangle style={styles.topLeftTriangle} /> <Triangle style={styles.bottomRightTriangle} /> </View> </View> ); } } const styles = StyleSheet.create({ container: { flex: 1, justifyContent: 'center', paddingTop: Constants.statusBarHeight, backgroundColor: '#ecf0f1', padding: 32, }, text: { fontSize: 18, padding: 32, paddingVertical: 48, fontWeight: 'bold', borderWidth: 1, backgroundColor: '#F66F6F', color: 'white', borderColor: 'gray', }, card: { borderWidth: 1, padding: 8, borderColor: 'gray', }, triangle: { width: 0, height: 0, backgroundColor: 'transparent', borderStyle: 'solid', borderRightWidth: 80, borderTopWidth: 80, borderRightColor: 'transparent', borderTopColor: '#ecf0f1', }, triangleShadow: { height: 90, width: 90, position: 'absolute', top: 0, left: 0, }, topLeftTriangle: { position: 'absolute', top: -10, left: -10, }, bottomRightTriangle: { position: 'absolute', bottom: -10, right: -10, transform: [{ rotate: '180deg' }], }, });
React Native borderRadius one corner not round
Hello this is the code I'm using: menuItemButtonContainer: { marginRight: 1, marginLeft: 1, marginTop: 1, marginBottom: 1, paddingRight: 1, paddingLeft: 1, paddingTop: 1, paddingBottom: 1, borderRadius: 10, overflow: 'hidden', position: "absolute", backgroundColor: 'white', borderWidth: 1, borderColor: colors.navy }, but for some reason the top right corner is not round. I've been cudgeling my brain for a day. This is the component code <Native.View style={[styles.menuItemButtonContainer, {width: 50, height: 30, marginLeft: 0}]}><Native.TouchableHighlight underlayColor={colors.darkGray} onPress={this.orderObjectChange.bind(this, 'ADD', item.id)} style={{ justifyContent: 'center', alignItems: 'center' }}><Native.View><Components.Text style={{color: colors.navy}}>ADD</Components.Text></Native.View></Native.TouchableHighlight></Native.View>
Styles you written works, Please see the below. May be border style getting overridden by some other styles in your application.Inspect that element to see.
As I have reviewed your code and as per that, you try by using below property to give corner radius one bye one for all the corner borderBottomLeftRadius: 10 borderBottomRightRadius: 10 borderTopLeftRadius: 10 borderTopRightRadius: 10
Try the border radius on each corner as follows: menuItemButtonContainer: { marginRight: 1, marginLeft: 1, marginTop: 1, marginBottom: 1, paddingRight: 1, paddingLeft: 1, paddingTop: 1, paddingBottom: 1, borderTopLeftRadius: 10, //Top Left Corner borderTopRightRadius: 10,// Top Right Corner borderBottomLeftRadius: 10,// Bottom Left Corner borderBottomRightRadius: 10, // Bottom Right Corner overflow: 'hidden', position: "absolute", backgroundColor: 'white', borderWidth: 1, borderColor: colors.navy },
You may also use the sx prop like this: sx={{"& .MuiOutlinedInput-root": { borderRadius: '0 10px 0 0' }}}
How do make textinput background transparent on map on react-native
How can I make the outer textinput background transparent so that it look like its inside the map, not on top? Thanks in advance! <View style={styles.container}> <TextInput style={styles.input}/> <MapView style={styles.map}/> </View> var styles = StyleSheet.create ({ container: { flex: 1, justifyContent: 'center', backgroundColor: '#F5FCFF', }, map: { flex: 1, }, input: { height: 36, padding: 10, margin: 18, fontSize: 18, borderWidth: 1, borderRadius: 10, borderColor: '#48BBEC', backgroundColor: 'rgba(0,0,0,0)', } })
Finally got it answer! Thanks to jpea! <View style={styles.container}> <MapView style={styles.map}/> <View style={styles.inputView}> <TextInput style={styles.input}/> </View> </View> var styles = StyleSheet.create ({ container: { flex: 1, justifyContent: 'center', backgroundColor: '#F5FCFF', }, map: { flex: 1, }, inputView: { backgroundColor: 'rgba(0,0,0,0)', position: 'absolute', top: 0, left: 5, right: 5 }, input: { height: 36, padding: 10, marginTop: 20, marginLeft: 10, marginRight: 10, fontSize: 18, borderWidth: 1, borderRadius: 10, borderColor: '#48BBEC', backgroundColor: 'white', } })
Try wrapping your text input in another view and setting that view's background to transparent: <View style={styles.container}> <MapView style={styles.map}/> <View style={styles.inputWrapper}> <TextInput style={styles.inputSearch}/> </View> </View> inputWrapper: { flex: 1, backgroundColor: 'transparent', position: 'absolute', top: 0, }, inputSearch: { backgroundColor: 'rgba(0,0,0,0.4)', // 40% opaque color: 'white', }