Advertisement
Felanpro

React Native (Calculator Version 2)

May 31st, 2023
31
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.49 KB | None | 0 0
  1. import { StatusBar } from 'expo-status-bar';
  2. import { StyleSheet, Text, View, SafeAreaView, TouchableHighlight, TouchableOpacity, Button } from 'react-native';
  3. import React, { useState, useContext } from 'react';
  4.  
  5. const calculatorEssentials =
  6. {
  7. buttonValues: [["7", "8", "9", "-"], ["4", "5", "6", "+"], ["1", "2", "3", "="], ["0", "C", "x", "x"]],
  8. initialValue: true
  9. }
  10.  
  11. var counter = 1;
  12.  
  13. Calculator = () =>
  14. {
  15. const [firstNumber, setFirstNumber] = useState("");
  16. const [secondNumber, setSecondNumber] = useState("");
  17. const [result, setResult] = useState(null);
  18. const [operation, setOperation] = useState(null);
  19. const [resultCounter, setResultCounter] = useState(0);
  20. const [lastPressed, setLastPressed] = useState(null);
  21. const [textField, setTextField] = useState("");
  22.  
  23. function handleNumberPress(buttonValue)
  24. {
  25. setFirstNumber(firstNumber + buttonValue);
  26. setTextField(firstNumber + buttonValue);
  27. setLastPressed("numberButton");
  28. }
  29.  
  30. function handleOperationPress(operator)
  31. {
  32. console.log(operator);
  33. setOperation(operator);
  34. if(operator != "=")
  35. {
  36.  
  37. if(operation == null)
  38. {
  39. setResult(parseInt(firstNumber));
  40. setFirstNumber("");
  41. setOperation(operator);
  42. }
  43. else if( (operation == "+") || (operation == "-"))
  44. {
  45. if(lastPressed != "operationButton")
  46. {
  47. switch(operation)
  48. {
  49. case "+":
  50. setResult(result + parseInt(firstNumber));
  51. setTextField(result + parseInt(firstNumber));
  52. setFirstNumber("");
  53. break;
  54.  
  55. case "-":
  56. setResult(result - parseInt(firstNumber));
  57. setTextField(result - parseInt(firstNumber));
  58. setFirstNumber("");
  59. break;
  60.  
  61. default:
  62. break;
  63. }
  64. }
  65. }
  66. }
  67. else if(operator == "=")
  68. {
  69. console.log("equal thing executed");
  70. if(operation == "+")
  71. {
  72. setResult(result + parseInt(firstNumber));
  73. setTextField(result + parseInt(firstNumber));
  74. setFirstNumber("");
  75. }
  76. else if(operation == "-")
  77. {
  78. setResult(result - parseInt(firstNumber));
  79. setTextField(result - parseInt(firstNumber));
  80. setFirstNumber("");
  81. }
  82. }
  83.  
  84. setLastPressed("operationButton");
  85. }
  86.  
  87. function handleEqualsPress()
  88. {
  89. setOperation(null);
  90. setFirstNumber("");
  91. setSecondNumber("");
  92. }
  93.  
  94. function handleClearPress()
  95. {
  96. setTextField("");
  97. }
  98.  
  99. // Need to be solved: make it so that after a calculation is performed with firstNumber with secondNumber update the result
  100. function calculateLogic(buttonValue)
  101. {
  102. switch(buttonValue)
  103. {
  104. case "+":
  105. handleOperationPress("+");
  106. break;
  107.  
  108. case "-":
  109. handleOperationPress("-");
  110. break;
  111.  
  112. case "=":
  113. handleOperationPress("=");
  114.  
  115. case "C":
  116. handleClearPress();
  117. break;
  118.  
  119. default:
  120. handleNumberPress(buttonValue);
  121. break;
  122. }
  123. }
  124. console.log(counter + " render");
  125. console.log("First Number: " + firstNumber);
  126. console.log("Second Number: " + secondNumber);
  127. console.log("Operation: " + operation);
  128. console.log("Result: " + result);
  129. console.log("ResultCounter: " + resultCounter);
  130. console.log("--------------------------------------");
  131.  
  132.  
  133. // Create the buttons UI
  134. var buttonRows = [];
  135. buttonRows = calculatorEssentials.buttonValues.map((buttonRow, buttonRowIndex) => {
  136.  
  137. buttonRowItems = buttonRow.map((buttonItem, buttonRowItemsIndex) => {
  138.  
  139. return(
  140. <TouchableHighlight onPress={() => calculateLogic(buttonItem)} style={{
  141. flex: 1,
  142. borderWidth: 5,
  143. backgroundColor: "red",
  144. padding: 7,
  145. justifyContent: "center",
  146. alignItems: "center",
  147. borderRadius: 50
  148. }}>
  149.  
  150. <Text style={{
  151. color: "#fff",
  152. fontSize: 55,
  153. textAlign: "center",
  154. aspectRatio: 1, // This will make the child element a square
  155. }}>
  156. {buttonItem}
  157. </Text>
  158.  
  159. </TouchableHighlight>
  160. );
  161. });
  162.  
  163. return(
  164. <View style={{flexDirection: "row", width: "100%", justifyContent: "space-around",}}>
  165. {buttonRowItems}
  166. </View>
  167. );
  168. });
  169.  
  170. counter++;
  171. // Return the whole calculator (unnecessary rerenders probably occurs (an issue you have to take a look at later))
  172. return(
  173. <View style={{
  174. flexDirection: "column",
  175. flex: 1,
  176. backgroundColor: "black"
  177. }}>
  178.  
  179. <View style={{
  180. flex: 1,
  181. backgroundColor: "gray"
  182. }}>
  183. <Text style={{
  184. fontSize: 50,
  185. color: "black"
  186. }}>
  187. {textField}
  188. </Text>
  189. </View>
  190.  
  191. <View style={{
  192. flexDirection: "column",
  193. flex: 1
  194. }}>
  195. {buttonRows}
  196. </View>
  197.  
  198. </View>
  199. );
  200. }
  201.  
  202. // IN APP WE EXECUTE THE APP (ABOVE IS THE LOGIC AND REST OF SOURCE CODE)------------------------------------
  203.  
  204. export default function App() {
  205. console.log("------------------------------------------");
  206. return (
  207. <SafeAreaView style={styles.container}>
  208.  
  209. <Calculator></Calculator>
  210.  
  211. <StatusBar style="auto" />
  212. </SafeAreaView>
  213. );
  214. }
  215.  
  216. const styles = StyleSheet.create({
  217. container: {
  218. flex: 1,
  219. backgroundColor: '#fff',
  220. },
  221. });
  222.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement