diff --git a/app/generalHelpers.jsx b/app/generalHelpers.jsx new file mode 100644 index 0000000..8c3f822 --- /dev/null +++ b/app/generalHelpers.jsx @@ -0,0 +1,331 @@ +import styled from 'styled-components'; +import { View, Text, LayoutAnimation, Image, TextInput, TouchableOpacity, TouchableNativeFeedback, ScrollView } from 'react-native'; +import { Ionicons } from '@expo/vector-icons'; +import { Row } from '../components/Row'; +import { Container } from '../components/Container'; + +export const StyledContainer = styled.View` + flex: 1; + padding: 25px; +`; + +export const InnerContainer = styled.View` + flex: 1; + width: 100%; + align-items: center; +`; + +export const StyledFormArea = styled.View` + padding-top: 10px; + width: 90%; +`; + +export const Title = styled.Text` + text-align: center; + padding: 10px 10px 0px 10px; + font-size: 30px; + font-wieght: bold; +`; + +export const SubTitle = styled.Text` + text-align: center; + font-size: 15px; +`; + +export const PageImage = styled.Image``; + +export const StyledTextInput = styled.TextInput` + background-color: #E5E7EB; + padding: 15px 55px 15px 55px; + border-radius: 5px; + font-size: 16px; + height: 60px; + margin-vertical: 3px; + margin-bottom: 10px; +`; + +export const StyledInputLabel = styled.Text` + font-size: 13px; + text-align: left; +`; + +export const LeftIcon = styled.View` + left: 15px; + top: 32px; + position: absolute; + z-index: 1; +`; + +export const RightIcon = styled.TouchableOpacity` + right: 15px; + top: 32px; + position: absolute; + z-index: 1; +`; + +export const DropdownArrow = styled.TouchableOpacity` + right: 15px; + position: absolute; + z-index: 1; +`; + +export const SelectedCheckmark = styled.View` + right: 4px; + top: 4px; + position: absolute; + z-index: 1; +`; + +export const StyledButton = styled.TouchableOpacity` + padding: 15px; + background-color: red; + justify-content: center; + align-items: center; + border-radius: 5px; + margin-vertical: 5px; + height: 60px; +`; + +export const ButtonText = styled.Text` + font-size: 16px; + font-weight: 450; + color: white; +`; + +export const MessageBox = styled.Text` + text-align: center; + font-size: 13px; +` + +export const Line = styled.View` + height: 1px; + width: 100%; + background-color: 'gray'; + margin-vertical: 10px; +` + +export const ExtraView = styled.View` + justify-content: center; + flex-direction: row; + align-items: center; + padding: 10px; +` + +export const ExtraText = styled.Text` + justify0content: center; + align-content: center; + font-size: 15px; +` + +export const TextLink = styled.TouchableOpacity` + justify-content: center; + align-content: center; +` + +export const TextLinkContent = styled.Text` + color: red; + font-size: 15px; +` + +const ProviderDropdown = styled.TouchableOpacity` + background-color: #E5E7EB; + padding: 15px 55px 15px 55px; + border-radius: 5px; + font-size: 16px; + height: 60px; + margin-vertical: 3px; + margin-bottom: 10px; +` + +export const providerMenu = { + menuName: 'providerList', + placeholder: 'Select Provider', + iconColor: 'red', + iconName: 'globe-outline', + dropdownList: [ + { label: 'AllTel', value: 'alltel' }, + { label: 'AT&T', value: 'att' }, + { label: 'AT&T MMS', value: 'attmms' }, + { label: 'Boost', value: 'boost' }, + { label: 'Boost MMS', value: 'boostmms' }, + { label: 'C Spire', value: 'c' }, + { label: 'Consumer Cellular', value: 'consumer' }, + { label: 'Cricket', value: 'cricket' }, + { label: 'Cricket MMS', value: 'cricketmms' }, + { label: 'Google Fi', value: 'googlefi' }, + { label: 'Mint Mobile', value: 'mint' }, + { label: 'MetroPCS', value: 'metro' }, + { label: 'Optimum', value: 'optimum' }, + { label: 'Republic Wireless', value: 'republic' }, + { label: 'Spectrum', value: 'spectrum' }, + { label: 'Sprint', value: 'sprint' }, + { label: 'Sprint MMS', value: 'sprintmms' }, + { label: 'Ting', value: 'ting' }, + { label: 'T-Mobile', value: 'tmobile' }, + { label: 'TracFone', value: 'tracfone' }, + { label: 'US Cellular', value: 'us' }, + { label: 'US Cellular MMS', value: 'usmms' }, + { label: 'Verizon', value: 'verizon' }, + { label: 'Verizon MMS', value: 'verizonmms' }, + { label: 'VerizonBiz', value: 'verizonbiz' }, + { label: 'Virgin', value: 'virgin' }, + { label: 'Virgin MMS', value: 'virginmms' }, + ] +} + +const providerConversion = { + alltel: 'AllTel', + att: 'AT&T', + attmms: 'AT&T MMS', + boost: 'Boost', + boostmms: 'Boost MMS', + c: 'C Spire', + consumer: 'Consumer Cellular', + cricket: 'Cricket', + cricketmms: 'Cricket MMS', + googlefi: 'Google Fi', + mint: 'Mint Mobile', + metro: 'MetroPCS', + optimum: 'Optimum', + republic: 'Republic Wireless', + spectrum: 'Spectrum', + sprint: 'Sprint', + sprintmms: 'Sprint MMS', + ting: 'Ting', + tmobile: 'T-Mobile', + tracfone: 'TracFone', + us: 'US Cellular', + usmms: 'US Cellular MMS', + verizon: 'Verizon', + verizonmms: 'Verizon MMS', + verizonbiz: 'VerizonBiz', + virgin: 'Virgin', + virginmms: 'Virgin MMS', +} + +export const PageHeader = ({ + children +}) => { + return ( + + + {children} + + + ) +} + +export const LoginTextInput = ({ + label, + icon, + isPassword = false, + hidePassword = true, + setHidePassword = (boolean) => {}, + ...props +}) => { + return ( + + + + + {label} + + {isPassword ? ( + {setHidePassword(!hidePassword)}}> + + + ) : null} + + ) +} + +export const RegisterDropdownInput = ({ + label, + isOpen, + setOpen, + selectedValue, + onValueChange, + menu +}) => { + return ( + + {label} + { + LayoutAnimation.configureNext(LayoutAnimation.Presets.easeInEaseOut); + LayoutAnimation.configureNext(LayoutAnimation.create(200, 'easeInEaseOut', 'opacity')); + isOpen ? setOpen(false) : setOpen(true); + }}> + + + + {selectedValue ? providerConversion[selectedValue] : menu.placeholder} + + { + LayoutAnimation.configureNext(LayoutAnimation.Presets.easeInEaseOut); + LayoutAnimation.configureNext(LayoutAnimation.create(200, 'easeInEaseOut', 'opacity')); + isOpen ? setOpen(false) : setOpen(true); + }} + > + + + + {isOpen && + {menu.dropdownList.map((subMenu, index) => { + return ( + { + onValueChange(subMenu.value); + LayoutAnimation.configureNext(LayoutAnimation.Presets.easeInEaseOut); + LayoutAnimation.configureNext(LayoutAnimation.create(200, 'easeInEaseOut', 'opacity')); + setOpen(false); + }} + > + + {subMenu.label} + {selectedValue === subMenu.value && + + + + } + + + ) + })} + } + + + ) +} \ No newline at end of file diff --git a/app/helpers.jsx b/app/helpers.jsx deleted file mode 100644 index eab6d35..0000000 --- a/app/helpers.jsx +++ /dev/null @@ -1,176 +0,0 @@ -import styled from 'styled-components'; -import Constants from 'expo-constants'; -import { View, Text, Image, TextInput, TouchableOpacity } from 'react-native'; -import { Ionicons } from '@expo/vector-icons'; -import { Picker } from '@react-native-picker/picker'; -import { Children } from 'react'; - -const StatusBarHeight = Constants.statusBarHeight; - -export const StyledContainer = styled.View` - flex: 1; - padding: 25px; -`; - -export const InnerContainer = styled.View` - flex: 1; - width: 100%; - align-items: center; -`; - -export const StyledFormArea = styled.View` - padding-top: 10px; - width: 90%; -`; - -export const Title = styled.Text` - text-align: center; - padding: 10px 10px 0px 10px; - font-size: 30px; - font-wieght: bold; -`; - -export const SubTitle = styled.Text` - text-align: center; - font-size: 15px; -`; - -export const PageImage = styled.Image``; - -export const StyledTextInput = styled.TextInput` - background-color: #E5E7EB; - padding: 15px 55px 15px 55px; - border-radius: 5px; - font-size: 16px; - height: 60px; - margin-vertical: 3px; - margin-bottom: 10px; -`; - -export const StyledInputLabel = styled.Text` - font-size: 13px; - text-align: left; -`; - -export const LeftIcon = styled.View` - left: 15px; - top: 32px; - position: absolute; - z-index: 1; -`; - -export const RightIcon = styled.TouchableOpacity` - right: 15px; - top: 32px; - position: absolute; - z-index: 1; -`; - -export const StyledButton = styled.TouchableOpacity` - padding: 15px; - background-color: red; - justify-content: center; - align-items: center; - border-radius: 5px; - margin-vertical: 5px; - height: 60px; -`; - -export const ButtonText = styled.Text` - font-size: 16px; - font-weight: 450; - color: white; -`; - -export const MessageBox = styled.Text` - text-align: center; - font-size: 13px; -` - -export const Line = styled.View` - height: 1px; - width: 100%; - background-color: 'gray'; - margin-vertical: 10px; -` - -export const ExtraView = styled.View` - justify-content: center; - flex-direction: row; - align-items: center; - padding: 10px; -` - -export const ExtraText = styled.Text` - justify0content: center; - align-content: center; - font-size: 15px; -` - -export const TextLink = styled.TouchableOpacity` - justify-content: center; - align-content: center; -` - -export const TextLinkContent = styled.Text` - color: red; - font-size: 15px; -` - -export const PageHeader = ({ - children -}) => { - return ( - - - {children} - - - ) -} - -export const LoginTextInput = ({ - label, - icon, - isPassword = false, - hidePassword = true, - setHidePassword = (boolean) => {}, - ...props -}) => { - return ( - - - - - {label} - - {isPassword ? ( - {setHidePassword(!hidePassword)}}> - - - ) : null} - - ) -} - -export const LoginDropdownInput = ({ - label, - icon, - selectedValue, - onValueChange, - items, -}) => { - return ( - - {label} - - {items.map((provider) => { - return - })} - - - ) -} \ No newline at end of file diff --git a/app/login.jsx b/app/login.jsx index 82b60ee..6f186c3 100644 --- a/app/login.jsx +++ b/app/login.jsx @@ -19,7 +19,7 @@ import { ExtraText, TextLinkContent, LoginTextInput -} from './helpers.jsx'; +} from './generalHelpers.jsx'; export default function TabLayout() { const [hidePassword, setHidePassword] = useState(true); diff --git a/app/register.jsx b/app/register.jsx index b07e0fa..9e952e1 100644 --- a/app/register.jsx +++ b/app/register.jsx @@ -6,6 +6,7 @@ import { useFormik } from 'formik'; import { SafeAreaView } from 'react-native-safe-area-context'; import { Ionicons } from '@expo/vector-icons'; import { + providerMenu, PageHeader, StyledContainer, InnerContainer, @@ -17,21 +18,16 @@ import { ButtonText, MessageBox, LoginTextInput, - LoginDropdownInput -} from './helpers.jsx'; - -const providers = [ - {label: 'Verizon', value: 'verizon'}, - {label: 'AT&T', value: 'att'}, - {label: 'T-Mobile', value: 'tmobile'} -] - + RegisterDropdownInput, +} from './generalHelpers.jsx'; export default function Register() { + const [providerDropdownOpen, setProviderDropdownOpen] = useState(false); const [hidePassword, setHidePassword] = useState(true); const [registerButtonDisabled, setRegisterButtonDisabled] = useState(true); + const formik = useFormik({ initialValues: { firstName: '', @@ -112,11 +108,13 @@ export default function Register() { keyboardType="number-pad" maxLength={14} /> - { + return ( + {children} + ) +}; \ No newline at end of file diff --git a/components/Row.tsx b/components/Row.tsx new file mode 100644 index 0000000..f6b0424 --- /dev/null +++ b/components/Row.tsx @@ -0,0 +1,24 @@ +import { View, ViewStyle } from "react-native"; +import { ReactNode } from "react"; + +interface RowProps { + children?: ReactNode | ReactNode[]; + backgroundColor?: string; + style?: ViewStyle | ViewStyle[]; +} + +export const Row = ({ + children, + backgroundColor, + style, +}: RowProps) => { + return ( + + {children} + + ) +}; \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index af0f82e..0199ba9 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,7 +9,6 @@ "version": "1.0.2", "dependencies": { "@expo/vector-icons": "^14.0.2", - "@react-native-picker/picker": "2.7.5", "@react-navigation/native": "^6.0.2", "expo": "~51.0.24", "expo-constants": "~16.0.2", @@ -5916,15 +5915,6 @@ "node": ">=8" } }, - "node_modules/@react-native-picker/picker": { - "version": "2.7.5", - "resolved": "https://registry.npmjs.org/@react-native-picker/picker/-/picker-2.7.5.tgz", - "integrity": "sha512-vhMaOLkXSUb+YKVbukMJToU4g+89VMhBG2U9+cLYF8X8HtFRidrHjohGqT8/OyesDuKIXeLIP+UFYI9Q9CRA9Q==", - "peerDependencies": { - "react": "*", - "react-native": "*" - } - }, "node_modules/@react-native/assets-registry": { "version": "0.74.85", "resolved": "https://registry.npmjs.org/@react-native/assets-registry/-/assets-registry-0.74.85.tgz", diff --git a/package.json b/package.json index 37f8229..d443123 100644 --- a/package.json +++ b/package.json @@ -16,7 +16,6 @@ }, "dependencies": { "@expo/vector-icons": "^14.0.2", - "@react-native-picker/picker": "2.7.5", "@react-navigation/native": "^6.0.2", "expo": "~51.0.24", "expo-constants": "~16.0.2",