Commit f26b104a authored by Farhani's avatar Farhani

Create permission for gallery and android

parent 2e9362be
{ {
"git.ignoreLimitWarning": true "git.ignoreLimitWarning": true,
"java.configuration.updateBuildConfiguration": "automatic"
} }
\ No newline at end of file
...@@ -3,8 +3,6 @@ apply plugin: "com.android.application" ...@@ -3,8 +3,6 @@ apply plugin: "com.android.application"
import com.android.build.OutputFile import com.android.build.OutputFile
import org.apache.tools.ant.taskdefs.condition.Os import org.apache.tools.ant.taskdefs.condition.Os
/** /**
* The react.gradle file registers a task for each build variant (e.g. bundleDebugJsAndAssets * The react.gradle file registers a task for each build variant (e.g. bundleDebugJsAndAssets
* and bundleReleaseJsAndAssets). * and bundleReleaseJsAndAssets).
...@@ -135,11 +133,15 @@ android { ...@@ -135,11 +133,15 @@ android {
ndkVersion rootProject.ext.ndkVersion ndkVersion rootProject.ext.ndkVersion
compileSdkVersion rootProject.ext.compileSdkVersion compileSdkVersion rootProject.ext.compileSdkVersion
// compileSdkVersion 33
// buildToolsVersion ""
defaultConfig { defaultConfig {
vectorDrawables.useSupportLibrary = true
applicationId "com.mymoneymanager" applicationId "com.mymoneymanager"
minSdkVersion rootProject.ext.minSdkVersion minSdkVersion rootProject.ext.minSdkVersion
targetSdkVersion rootProject.ext.targetSdkVersion targetSdkVersion rootProject.ext.targetSdkVersion
// targetSdkVersion 33
versionCode 1 versionCode 1
versionName "1.0" versionName "1.0"
buildConfigField "boolean", "IS_NEW_ARCHITECTURE_ENABLED", isNewArchitectureEnabled().toString() buildConfigField "boolean", "IS_NEW_ARCHITECTURE_ENABLED", isNewArchitectureEnabled().toString()
......
...@@ -2,6 +2,13 @@ ...@@ -2,6 +2,13 @@
package="com.mymoneymanager"> package="com.mymoneymanager">
<uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_MEDIA_IMAGES" />
<uses-feature android:name="android.hardware.camera" />
<uses-feature android:name="android.hardware.camera.autofocus" />
<!-- <uses-feature android:name="android.hardware.camera" android:required="false" />
<uses-feature android:name="android.hardware.camera.front" android:required="false" /> -->
<application <application
android:name=".MainApplication" android:name=".MainApplication"
......
...@@ -49,6 +49,12 @@ allprojects { ...@@ -49,6 +49,12 @@ allprojects {
// Android JSC is installed from npm // Android JSC is installed from npm
url("$rootDir/../node_modules/jsc-android/dist") url("$rootDir/../node_modules/jsc-android/dist")
} }
maven {
url 'https://maven.google.com'
}
maven {
url "https://www.jitpack.io"
}
mavenCentral { mavenCentral {
// We don't want to fetch react-native from Maven Central as there are // We don't want to fetch react-native from Maven Central as there are
// older versions over there. // older versions over there.
......
...@@ -29,7 +29,7 @@ ...@@ -29,7 +29,7 @@
"moment-timezone": "^0.5.39", "moment-timezone": "^0.5.39",
"pouchdb": "^7.3.0", "pouchdb": "^7.3.0",
"react": "18.1.0", "react": "18.1.0",
"react-native": "0.70.4", "react-native": "0.70.6",
"react-native-alert-pro": "^1.1.2", "react-native-alert-pro": "^1.1.2",
"react-native-androw": "^0.0.34", "react-native-androw": "^0.0.34",
"react-native-animatable": "^1.3.3", "react-native-animatable": "^1.3.3",
...@@ -44,6 +44,8 @@ ...@@ -44,6 +44,8 @@
"react-native-flatlist-picker": "^1.0.1", "react-native-flatlist-picker": "^1.0.1",
"react-native-gesture-handler": "^2.7.0", "react-native-gesture-handler": "^2.7.0",
"react-native-hide-show-password-input": "^1.2.0", "react-native-hide-show-password-input": "^1.2.0",
"react-native-image-crop-picker": "^0.38.1",
"react-native-image-picker": "^4.10.2",
"react-native-item-select": "^0.4.2", "react-native-item-select": "^0.4.2",
"react-native-material-datetime-picker": "^0.2.1", "react-native-material-datetime-picker": "^0.2.1",
"react-native-material-dropdown": "^0.11.1", "react-native-material-dropdown": "^0.11.1",
...@@ -83,6 +85,7 @@ ...@@ -83,6 +85,7 @@
"eslint": "^7.32.0", "eslint": "^7.32.0",
"jest": "^26.6.3", "jest": "^26.6.3",
"metro-react-native-babel-preset": "^0.72.1", "metro-react-native-babel-preset": "^0.72.1",
"react-native-clean-project": "^4.0.1",
"react-test-renderer": "18.1.0" "react-test-renderer": "18.1.0"
}, },
"jest": { "jest": {
......
...@@ -43,14 +43,6 @@ const grant = require ('../../images/grant.png'); ...@@ -43,14 +43,6 @@ const grant = require ('../../images/grant.png');
const onPress = () => console.log('press'); const onPress = () => console.log('press');
export default function CategoriesScreen({ navigation }) { export default function CategoriesScreen({ navigation }) {
state = {
modalVisible:false
};
setModalVisible = (visible)=>{
this.setState ({modalVisible:visible});
}
const addCategoryAlert = () => const addCategoryAlert = () =>
Alert.alert( Alert.alert(
"Add new category", "Add new category",
...@@ -96,8 +88,6 @@ export default function CategoriesScreen({ navigation }) { ...@@ -96,8 +88,6 @@ export default function CategoriesScreen({ navigation }) {
{cancelable:false} {cancelable:false}
); );
const INCOME={ const INCOME={
title: 'Income Categories', title: 'Income Categories',
data:[ data:[
...@@ -185,29 +175,6 @@ export default function CategoriesScreen({ navigation }) { ...@@ -185,29 +175,6 @@ export default function CategoriesScreen({ navigation }) {
}, },
] ]
} }
// const ModalPoup = ({visible, children}) => {
// const [showModal, setShowModal] = React.useState(visible);
// React.useEffect (() => {
// toggleModal();
// }, [visible]);
// const toggleModal = ()=> {
// if (visible){
// setShowModal(true);
// }else{
// setShowModal(false);
// }
// };
// return (
// <Modal transparent visible={showModal}>
// <View style = {styles.modalBackGround}>
// <View style={[styles.modalContainer]}>{children}</View>
// </View>
// </Modal>);
// };
// const [visible,setVisible] = React.useState(false);
const renderItem = ({item}) => { const renderItem = ({item}) => {
return( return(
<View style={{flexDirection:'column', justifyContent:'space-between'}}> <View style={{flexDirection:'column', justifyContent:'space-between'}}>
...@@ -227,7 +194,7 @@ export default function CategoriesScreen({ navigation }) { ...@@ -227,7 +194,7 @@ export default function CategoriesScreen({ navigation }) {
</View> </View>
</View> </View>
) )
} }
return ( return (
...@@ -244,15 +211,6 @@ export default function CategoriesScreen({ navigation }) { ...@@ -244,15 +211,6 @@ export default function CategoriesScreen({ navigation }) {
)} )}
/> />
{/* <ModalPoup visible={visible}>
<View style={{alignItems:'center'}}>
<View style={styles.header}>
</View>
<Image source= {plus} style={{width:30, height:30}}/>
</View></ModalPoup> */}
<TouchableOpacity style={{backgroundColor:'white', elevation:7, width:70, height:70,justifyContent:'center', alignItems:'center', position:'absolute', borderRadius:100, bottom:20, left:310, marginTop:210}} onPress={addCategoryAlert}> <TouchableOpacity style={{backgroundColor:'white', elevation:7, width:70, height:70,justifyContent:'center', alignItems:'center', position:'absolute', borderRadius:100, bottom:20, left:310, marginTop:210}} onPress={addCategoryAlert}>
<Image style={{width:30, height:30}} source = {plus}></Image> <Image style={{width:30, height:30}} source = {plus}></Image>
</TouchableOpacity> </TouchableOpacity>
......
...@@ -13,8 +13,11 @@ import { DateTimePickerAndroid } from '@react-native-community/datetimepicker'; ...@@ -13,8 +13,11 @@ import { DateTimePickerAndroid } from '@react-native-community/datetimepicker';
import { NavigationAction } from '@react-navigation/native'; import { NavigationAction } from '@react-navigation/native';
import RNMaterialDatetimePicker from 'react-native-material-datetime-picker'; import RNMaterialDatetimePicker from 'react-native-material-datetime-picker';
import DateTimePickerModal from 'react-native-modal-datetime-picker'; import DateTimePickerModal from 'react-native-modal-datetime-picker';
import ImagePicker from 'react-native-image-crop-picker';
import SidebarScreen from '../sidebar'; import SidebarScreen from '../sidebar';
import styles from './style'; import styles from './style';
// import {launchCamera, launchImageLibrary} from 'react-native-image-picker';
const logo = require ('../../images/pic.png'); const logo = require ('../../images/pic.png');
const cutlery = require ('../../images/cutlery.png'); const cutlery = require ('../../images/cutlery.png');
...@@ -40,32 +43,6 @@ const caricon = require ('../../images/caricon.png'); ...@@ -40,32 +43,6 @@ const caricon = require ('../../images/caricon.png');
const Stack = createNativeStackNavigator(); const Stack = createNativeStackNavigator();
const profile = require ('../../images/profile.jpg'); const profile = require ('../../images/profile.jpg');
const Profile =()=> {
const [fname, onChangeFName] = useState('Farhani');
const [lname, onChangeLName] = useState('Halim');
const [email, onChangeEmail] = useState('farhanihalim@gmail.com');
const [password, onChangePassword] = useState('');
const [confirmPassword, onChangeConfirmPassword] = useState('');
const [dob, setDOB] = useState('06/02/1999');
const [gender, setGender] = useState('Female');
const [isDatePickerVisible, setDatePickerVisibility] = useState(false);
const showDatePicker = () => {
setDatePickerVisibility(true);
};
const hideDatePicker = () => {
setDatePickerVisibility(false);
};
const handleConfirm = (date) => {
console.warn("A date has been picked: ", date);
hideDatePicker();
};
const requestCameraPermission = async () => { const requestCameraPermission = async () => {
try { try {
const granted = await PermissionsAndroid.request( const granted = await PermissionsAndroid.request(
...@@ -89,25 +66,68 @@ const requestCameraPermission = async () => { ...@@ -89,25 +66,68 @@ const requestCameraPermission = async () => {
console.warn(err); console.warn(err);
} }
}; };
const requestGalleryPermission = async () => {
try{
const granted = await PermissionsAndroid.request(
PermissionsAndroid.PERMISSIONS.WRITE_EXTERNAL_STORAGE,
{
title: 'Share image',
message: 'This app would like read media from storage.',
buttonPositive: 'Please accept bare mortal',
},
);
if (granted===PermissionsAndroid.RESULTS.GRANTED) {
console.log("You can use the gallery");
} else {
console.log("Gallery permission denied");
}
} catch (err) {
console.warn(err);
}
};
const Profile =()=> {
const [fname, onChangeFName] = useState('Farhani');
const [lname, onChangeLName] = useState('Halim');
const [email, onChangeEmail] = useState('farhanihalim@gmail.com');
const [password, onChangePassword] = useState('');
const [confirmPassword, onChangeConfirmPassword] = useState('');
const [dob, setDOB] = useState('06/02/1999');
const [gender, setGender] = useState('Female');
const [profilePic, setProfilePic] = useState(profile);
const [isDatePickerVisible, setDatePickerVisibility] = useState(false);
const showDatePicker = () => {
setDatePickerVisibility(true);
};
const hideDatePicker = () => {
setDatePickerVisibility(false);
};
const handleConfirm = (date) => {
console.warn("A date has been picked: ", date);
hideDatePicker();
};
return ( return (
<View style = {{backgroundColor:'white', height:'100%'}}> <View style = {{backgroundColor:'white', height:'100%'}}>
<ScrollView> <ScrollView>
<View style={{marginHorizontal:20, marginTop:20}}> <View style={{marginHorizontal:20, marginTop:20}}>
<Text style={{marginBottom:20, fontSize:15,marginHorizontal:5}}>Profile photo</Text> <Text style={{marginBottom:20, fontSize:15,marginHorizontal:5}}>Profile photo</Text>
<View style = {{flexDirection:'row'}}> <View style = {{flexDirection:'row'}}>
<View style ={{flexDirection:'row', marginHorizontal:25}}>
<TouchableOpacity> <View style={{backgroundColor:'#2693ff', elevation:8, justifyContent:'center', alignItems:'center', borderRadius:25, width:50, height:50}}>
<View style ={{flexDirection:'row', marginHorizontal:25}}> <Image style={{width: 60, height: 60, borderColor:'powderblue', borderWidth: 1, elevation: 7,borderRadius: 100,}} source={profilePic}/>
<View style={{backgroundColor:'#2693ff', elevation:8, justifyContent:'center', alignItems:'center', borderRadius:25, width:50, height:50}}> </View>
<Image style={{width: 60, height: 60, borderColor:'powderblue', borderWidth: 1, elevation: 7,borderRadius: 100,}} source={profile}/> </View>
</View>
</View>
</TouchableOpacity>
<View style={{flexDirection:'row', justifyContent:'flex-start'}}> <View style={{flexDirection:'row', justifyContent:'flex-start'}}>
<View> <View>
<View style={{flexDirection:'row'}}> <View style={{flexDirection:'row'}}>
<TouchableOpacity style={styles.saveButton} title="request permissions" onPress={requestCameraPermission}> <TouchableOpacity style={styles.saveButton} title="request permissions" onPress={requestGalleryPermission}>
<View style={{flexDirection:'row'}}> <View style={{flexDirection:'row'}}>
<Icon name="upload" size={20} color="#5eb5ce"/> <Icon name="upload" size={20} color="#5eb5ce"/>
<Text style={{color:'#5eb5ce', marginHorizontal:10, fontSize:15}}>Upload Picture</Text> <Text style={{color:'#5eb5ce', marginHorizontal:10, fontSize:15}}>Upload Picture</Text>
......
...@@ -208,18 +208,16 @@ const EXP = [ ...@@ -208,18 +208,16 @@ const EXP = [
]; ];
// const [selectedLanguage, setSelectedLanguage] = useState(); // const [selectedLanguage, setSelectedLanguage] = useState();
// this.setState(function(state, props){
// return{
// counter: state.counter + props.increment
// };
// });
const CURRENCY = [ const CURRENCY = [
{label:'RM',value:'RM'}, {label:'RM',value:'RM'},
{label:'USD',value:'USD'}, {label:'USD',value:'USD'},
{label:'KRW',value:'KRW'}, {label:'KRW',value:'KRW'},
{label:'EURO',value:'EURO'}, {label:'EURO',value:'EURO'},
{label:'TEST',value:'TEST'},
{label:'TRY',value:'TRY'},
{label:'CUBA',value:'CUBA'},
// {label:'GFDFVF',value:'FGDFDWERDDF'},
]; ];
const Transactions =()=> { const Transactions =()=> {
...@@ -227,11 +225,10 @@ const Transactions =()=> { ...@@ -227,11 +225,10 @@ const Transactions =()=> {
const [imgAccSelected, setImgAccSelected] = useState (acc); const [imgAccSelected, setImgAccSelected] = useState (acc);
const [strCatSelected, setStrCatSelected] = useState('Category'); const [strCatSelected, setStrCatSelected] = useState('Category');
const [imgCatSelected, setImgCatSelected] = useState(tag); const [imgCatSelected, setImgCatSelected] = useState(tag);
const [income, setIncome] = useState(INC);
// const [isFocus, setIsFocus] = useState(false); const [expense, setExpense] = useState(false);
const [strCurrSelected, setStrCurrSelected] = useState('RM');
// const [selected, setSelected] = React.useState(""); const [currListVisible, setCurrListVisible] = useState(false);
//const [selectedLanguage, setSelectedLanguage] = useState();
const [text, onChangeText] = React.useState(null); const [text, onChangeText] = React.useState(null);
const [number, onChangeNumber] = React.useState(null); const [number, onChangeNumber] = React.useState(null);
const [isDatePickerVisible, setDatePickerVisibility] = useState(false); const [isDatePickerVisible, setDatePickerVisibility] = useState(false);
...@@ -269,30 +266,6 @@ const Transactions =()=> { ...@@ -269,30 +266,6 @@ const Transactions =()=> {
hideTimePicker(); hideTimePicker();
}; };
// const [selectedItem, setSelectedItem] = useState('');
const [income, setIncome] = useState(INC);
const [expense, setExpense] = useState(false);
const [strCurrSelected, setStrCurrSelected] = useState('RM');
const [ currListVisible, setCurrListVisible] = useState(true);
// const showCurrList = ()=>{
// setCurrListVisible(true);
// }
// const hideCurrList = ()=> {
// setCurrListVisible(false);
// }
// const handleConfirmCurrency = (strCurrSelected) => {
// console.log();
// setStrCurrSelected();
// hideCurrList();
// };
const renderItem = ({ item }) => ( const renderItem = ({ item }) => (
<SafeAreaView> <SafeAreaView>
<View style={{justifyContent:'space-between', flexDirection:'row', marginHorizontal:15, width:'110%'}}> <View style={{justifyContent:'space-between', flexDirection:'row', marginHorizontal:15, width:'110%'}}>
...@@ -381,72 +354,31 @@ const Transactions =()=> { ...@@ -381,72 +354,31 @@ const Transactions =()=> {
</TouchableOpacity> </TouchableOpacity>
</SafeAreaView> </SafeAreaView>
// onPress={()=>{setStrCurrSelected}}
// const showTimePicker = () => {
// setTimePickerVisibility(true);
// };
{/* <DateTimePickerModal
isVisible={isDatePickerVisible}
mode="date"
onConfirm={handleConfirmDate}
onCancel={hideDatePicker}/> <DateTimePickerModal
isVisible={isDatePickerVisible}
mode="date"
onConfirm={handleConfirmDate}
onCancel={hideDatePicker}/>*/}
const renderCurrency = ({ item }) => ( const renderCurrency = ({ item }) => (
<SafeAreaView> <SafeAreaView>
<TouchableOpacity onPress={()=>{setStrCurrSelected(item.label)}}>
<Text style={{marginTop:10, fontSize:20, marginHorizontal:20, alignItems:'center'}}>{item.label}</Text> <TouchableOpacity onPress={()=>{setStrCurrSelected(item.label)}}>
</TouchableOpacity> <Text style={{marginTop:10, fontSize:20, justifyContent:'center', alignItems:'center', marginHorizontal:100}}>{item.label}</Text>
</SafeAreaView> </TouchableOpacity>
); <View style={[styles.dividerLine,{marginTop:20}]}></View>
</SafeAreaView>
);
const ListCurrency = () => { const ListCurrency = () => {
if (currListVisible){ if (currListVisible){
return( return(
<SafeAreaView> <SafeAreaView style={{position:'absolute', height:'100%', width:'100%', backgroundColor:'rgba(192,192,192,0.8)', justifyContent:'center', alignItems:'center'}}>
<TouchableOpacity style ={{flexDirection:'row',backgroundColor:'transparent', width:100, height:80, borderWidth:1.5, borderColor:'grey', borderRadius:6, marginTop:10, marginHorizontal:13}} onPress={()=>currListVisible}> <TouchableOpacity style={{height:'100%', width:'100%'}} onPress={()=>{setCurrListVisible(false)}}></TouchableOpacity>
<View style={{flexDirection:'row', width:'100%', justifyContent:'space-between'}}> <View style={{backgroundColor:'white', borderRadius:5, justifyContent:'center', marginHorizontal:20, width:'70%', height:'30%', marginTop:0, borderWidth:0.5, borderColor:'white', elevation:2, position:'absolute',}}>
<View style={{flexDirection:'row', width:'80%'}}>
<Text style={{marginTop:24, fontSize:20, marginHorizontal:5}}>{strCurrSelected}</Text>
</View>
<View style={{flexDirection:'row', width:'30%'}}>
<Image style={{width:15, height:15, marginTop:30}} source={drop}></Image>
</View>
</View>
</TouchableOpacity>
{/* <View style={{backgroundColor:'rgba(52, 52, 52, alpha)', width:'100%'}}> */}
<View style={{backgroundColor:'white', opacity:0.9, borderRadius:2, justifyContent:'center', marginHorizontal:20, width:'70%', height:'50%', marginTop:70, borderWidth:0.5, borderColor:'white', elevation:2, position:'absolute',}}>
{/* <View> */}
<FlatList <FlatList
// style={{alignItems:'flex-start'}}
data={CURRENCY} data={CURRENCY}
renderItem={renderCurrency} renderItem={renderCurrency}
keyExtractor={item => item.id} keyExtractor={item => item.id}
/> />
</View> </View>
{/* </View> */} </SafeAreaView>
{/* </View> */}
{/* <Overlay
animationType="zoomIn" containerStyle={{backgroundColor: 'rgba(37, 8, 10, 0.78)'}}
childrenWrapperStyle={{backgroundColor: '#eee'}}
animationDuration={500}>
{
(hideCurrList) => (
<Fragment>
<Text>Some Modal Content</Text>
<Text onPress={hideCurrList}>Close</Text>
</Fragment>
)
}
</Overlay> */}
</SafeAreaView>
); );
}; };
}; };
...@@ -545,10 +477,17 @@ const Transactions =()=> { ...@@ -545,10 +477,17 @@ const Transactions =()=> {
</View> </View>
<View style ={{flexDirection:'row'}}> <View style ={{flexDirection:'row'}}>
<TouchableOpacity style ={{flexDirection:'row',backgroundColor:'transparent', width:100, height:80, borderWidth:1.5, borderColor:'grey', borderRadius:6, marginTop:10, marginHorizontal:13}} onPress={()=>{setCurrListVisible(true)}}>
<View style={{flexDirection:'row', width:'100%', justifyContent:'space-between'}}>
<ListCurrency/> <View style={{flexDirection:'row', width:'80%'}}>
<Text style={{marginTop:24, fontSize:20, marginHorizontal:5}}>{strCurrSelected}</Text>
</View>
<View style={{flexDirection:'row', width:'30%'}}>
<Image style={{width:15, height:15, marginTop:30}} source={drop}></Image>
</View>
</View>
</TouchableOpacity>
...@@ -586,6 +525,7 @@ const Transactions =()=> { ...@@ -586,6 +525,7 @@ const Transactions =()=> {
<Text style={{color:'white', fontWeight:'bold'}}>ADD</Text> <Text style={{color:'white', fontWeight:'bold'}}>ADD</Text>
</TouchableOpacity> </TouchableOpacity>
</View> </View>
<ListCurrency/>
</View> </View>
); );
......
...@@ -85,19 +85,13 @@ const styles = StyleSheet.create ({ ...@@ -85,19 +85,13 @@ const styles = StyleSheet.create ({
marginHorizontal:9, marginHorizontal:9,
marginTop:9, marginTop:9,
}, },
dividerLine:{
height: 1,
width: '500%',
backgroundColor: 'lightgrey',
marginVertical:10
},
containerBox:{
borderWidth: 1,
borderColor: '#CECECE',
width: 250,
height: 50,
alignSelf: 'center',
justifyContent: 'space-between',
alignItems: 'center',
flexDirection: 'row',
marginTop: 30,
padding: 5,
},
}); });
export default styles; export default styles;
\ No newline at end of file
This diff is collapsed.
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment