Merge pull request #348 from supabase/react-native-example-add-elements

Add reactnativeelements.
This commit is contained in:
Copple authored and GitHub committed 2020-12-08 14:21:34 +08:00
commit 1d478723cc
6 files changed
+247 -139

No files matched your search

+20 -63
View File
@@ -1,73 +1,30 @@
import React from 'react'
import AsyncStorage from '@react-native-community/async-storage'
import { createClient } from '@supabase/supabase-js'
import { StatusBar } from 'expo-status-bar'
import { Alert, StyleSheet, Text, View } from 'react-native'
import { Styles, SUPABASE_URL, SUPABASE_ANON_KEY } from './lib/constants'
import { StyleSheet, View, Platform } from 'react-native'
import { ThemeProvider, colors, Text } from 'react-native-elements'
import { Styles } from './lib/constants'
import Auth from './components/Auth'
import Button from './components/Button'
import TextField from './components/TextField'
const supabase = createClient(SUPABASE_URL, SUPABASE_ANON_KEY, {
localStorage: AsyncStorage as any,
})
const theme = {
colors: {
...Platform.select({
default: colors.platform.android,
ios: colors.platform.ios,
}),
},
}
export default function App() {
const [email, setEmail] = React.useState('')
const [password, setPassword] = React.useState('')
const handleLogin = async (type: string, email: string, password: string) => {
// console.log('email', email)
// console.log('password', password)
try {
const { error, user } =
type === 'LOGIN'
? await supabase.auth.signIn({ email, password })
: await supabase.auth.signUp({ email, password })
if (!error && !user) Alert.alert('Check your email for the login link!')
if (error) Alert.alert(error.message)
console.log('user', user)
console.log('error', error)
} catch (error) {
console.log('Error thrown:', error.message)
Alert.alert(error.error_description || error)
}
}
return (
<View style={styles.container}>
<View style={styles.verticallySpaced}>
<Text style={{ fontSize: Styles.fontExtraLarge, fontWeight: 'bold' }}>To Do List</Text>
<ThemeProvider theme={theme}>
<View style={styles.container}>
<View style={styles.verticallySpaced}>
<Text h1>Todo List</Text>
</View>
<Auth />
<StatusBar style="auto" />
</View>
<View style={[styles.verticallySpaced, { marginTop: 20 }]}>
<Text>Email</Text>
<TextField
onChangeText={(text) => setEmail(text)}
text={email}
placeholder="Enter your email"
autoCapitalize={'none'}
/>
</View>
<View style={styles.verticallySpaced}>
<Text>Password</Text>
<TextField
onChangeText={(text) => setPassword(text)}
text={password}
type={'password'}
placeholder="Enter your password"
customStyles={{ textTransform: 'lowercase' }}
autoCapitalize={'none'}
/>
</View>
<View style={[styles.verticallySpaced, { marginTop: 20 }]}>
<Button text="Log in" onPress={() => handleLogin('LOGIN', email, password)} />
</View>
<View style={styles.verticallySpaced}>
<Button text="Sign up" onPress={() => handleLogin('SIGNUP', email, password)} />
</View>
<StatusBar style="auto" />
</View>
</ThemeProvider>
)
}
+84
View File
@@ -0,0 +1,84 @@
import React, { useState } from 'react'
import { Alert, StyleSheet, View } from 'react-native'
import AsyncStorage from '@react-native-community/async-storage'
import { createClient } from '@supabase/supabase-js'
import { Styles, SUPABASE_URL, SUPABASE_ANON_KEY } from '../lib/constants'
import { Button, Input } from 'react-native-elements'
const supabase = createClient(SUPABASE_URL, SUPABASE_ANON_KEY, {
localStorage: AsyncStorage as any,
})
export default function Auth() {
const [email, setEmail] = useState('')
const [password, setPassword] = useState('')
const [loading, setLoading] = useState('')
const handleLogin = async (type: string, email: string, password: string) => {
setLoading(type)
const { error, user } =
type === 'LOGIN'
? await supabase.auth.signIn({ email, password })
: await supabase.auth.signUp({ email, password })
if (!error && !user) Alert.alert('Check your email for the login link!')
if (error) Alert.alert(error.message)
console.log('user', user)
console.log('error', error)
setLoading('')
}
return (
<View>
<View style={[styles.verticallySpaced, { marginTop: 20 }]}>
<Input
label="Email"
leftIcon={{ type: 'font-awesome', name: 'envelope' }}
onChangeText={(text) => setEmail(text)}
value={email}
placeholder="email@address.com"
autoCapitalize={'none'}
/>
</View>
<View style={styles.verticallySpaced}>
<Input
label="Password"
leftIcon={{ type: 'font-awesome', name: 'lock' }}
onChangeText={(text) => setPassword(text)}
value={password}
secureTextEntry={true}
placeholder="Password"
autoCapitalize={'none'}
/>
</View>
<View style={[styles.verticallySpaced, { marginTop: 20 }]}>
<Button
title="Sign in"
disabled={!!loading.length}
loading={loading === 'LOGIN'}
onPress={() => handleLogin('LOGIN', email, password)}
/>
</View>
<View style={styles.verticallySpaced}>
<Button
title="Sign up"
disabled={!!loading.length}
loading={loading === 'SIGNUP'}
onPress={() => handleLogin('SIGNUP', email, password)}
/>
</View>
</View>
)
}
const styles = StyleSheet.create({
container: {
marginTop: 40,
padding: Styles.spacing,
},
verticallySpaced: {
paddingTop: 4,
paddingBottom: 4,
alignSelf: 'stretch',
},
})
-26
View File
@@ -1,26 +0,0 @@
import React from 'react'
import { GestureResponderEvent, StyleSheet, Text, TouchableOpacity } from 'react-native'
import { Styles } from '../lib/constants'
type ButtonProps = {
text: string
onPress: ((event: GestureResponderEvent) => void) | undefined
}
export default function Button({ text, onPress }: ButtonProps) {
return (
<TouchableOpacity onPress={onPress} style={styles.button}>
<Text style={styles.buttonText}>{text}</Text>
</TouchableOpacity>
)
}
const styles = StyleSheet.create({
button: {
backgroundColor: Styles.colorPrimary,
alignSelf: 'stretch',
padding: Styles.spacing,
borderRadius: 4,
},
buttonText: { fontSize: Styles.fontNormal, color: '#fff', textAlign: 'center' },
})
@@ -1,44 +0,0 @@
import React from 'react'
import { TextInput, StyleSheet } from 'react-native'
import { Styles } from '../lib/constants'
type TextFieldProps = {
onChangeText: ((text: string) => void) | undefined
text: string
type?: 'none' | 'password'
placeholder?: string
customStyles?: object
autoCapitalize?: 'sentences' | 'characters' | 'words' | 'none'
}
export default function TextField({
onChangeText,
text,
type = 'none',
placeholder = '',
customStyles = {},
autoCapitalize = 'none'
}: TextFieldProps) {
return (
<TextInput
style={[styles.textInput, customStyles]}
onChangeText={onChangeText}
value={text}
placeholder={placeholder}
textContentType={type}
secureTextEntry={type == 'password'}
autoCapitalize={autoCapitalize}
/>
)
}
const styles = StyleSheet.create({
textInput: {
fontSize: Styles.fontNormal,
borderColor: 'gray',
borderWidth: 1,
borderRadius: 4,
minHeight: 50,
padding: Styles.spacing,
},
})
+142 -6
View File
@@ -1955,14 +1955,12 @@
"@types/prop-types": {
"version": "15.7.3",
"resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.3.tgz",
"integrity": "sha512-KfRL3PuHmqQLOG+2tGpRO26Ctg+Cq1E01D2DMriKEATHgWLfeNDmq9e29Q9WIky0dQ3NPkd1mzYH8Lm936Z9qw==",
"dev": true
"integrity": "sha512-KfRL3PuHmqQLOG+2tGpRO26Ctg+Cq1E01D2DMriKEATHgWLfeNDmq9e29Q9WIky0dQ3NPkd1mzYH8Lm936Z9qw=="
},
"@types/react": {
"version": "16.9.56",
"resolved": "https://registry.npmjs.org/@types/react/-/react-16.9.56.tgz",
"integrity": "sha512-gIkl4J44G/qxbuC6r2Xh+D3CGZpJ+NdWTItAPmZbR5mUS+JQ8Zvzpl0ea5qT/ZT3ZNTUcDKUVqV3xBE8wv/DyQ==",
"dev": true,
"requires": {
"@types/prop-types": "*",
"csstype": "^3.0.2"
@@ -1981,11 +1979,19 @@
"version": "0.63.35",
"resolved": "https://registry.npmjs.org/@types/react-native/-/react-native-0.63.35.tgz",
"integrity": "sha512-2uyPZoHtoUVsVO55HdrRCpgwwG2zVHLttTaR9f/BThoBAQngNWuZQ0eMGmfgRHBKXmi3TmtWjbWPxohkITLlkw==",
"dev": true,
"requires": {
"@types/react": "*"
}
},
"@types/react-native-vector-icons": {
"version": "6.4.6",
"resolved": "https://registry.npmjs.org/@types/react-native-vector-icons/-/react-native-vector-icons-6.4.6.tgz",
"integrity": "sha512-lAyxNfMd5L1xZvXWsGcJmNegDf61TAp40uL6ashNNWj9W3IrDJO59L9+9inh0Y2MsEZpLTdxzVU8Unb4/0FQng==",
"requires": {
"@types/react": "*",
"@types/react-native": "*"
}
},
"@types/stack-utils": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-1.0.1.tgz",
@@ -2221,6 +2227,26 @@
"resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz",
"integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg=="
},
"auto-changelog": {
"version": "2.2.1",
"resolved": "https://registry.npmjs.org/auto-changelog/-/auto-changelog-2.2.1.tgz",
"integrity": "sha512-XlykJfZrXlWUAADBqGoN1elmntrRcx7oEymyYB3NRPEZxv0TfYHfivmwzejUMnwAdXKCgbQPo7GV5ULs3jwpfw==",
"requires": {
"commander": "^5.0.0",
"handlebars": "^4.7.3",
"lodash.uniqby": "^4.7.0",
"node-fetch": "^2.6.0",
"parse-github-url": "^1.0.2",
"semver": "^6.3.0"
},
"dependencies": {
"semver": {
"version": "6.3.0",
"resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
"integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw=="
}
}
},
"available-typed-arrays": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.2.tgz",
@@ -2730,6 +2756,15 @@
"object-visit": "^1.0.0"
}
},
"color": {
"version": "3.1.3",
"resolved": "https://registry.npmjs.org/color/-/color-3.1.3.tgz",
"integrity": "sha512-xgXAcTHa2HeFCGLE9Xs/R82hujGtu9Jd9x4NW3T34+OMs7VoPsjwzRczKHvTAHeJwWFwX5j15+MgAppE8ztObQ==",
"requires": {
"color-convert": "^1.9.1",
"color-string": "^1.5.4"
}
},
"color-convert": {
"version": "1.9.3",
"resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
@@ -2957,8 +2992,7 @@
"csstype": {
"version": "3.0.5",
"resolved": "https://registry.npmjs.org/csstype/-/csstype-3.0.5.tgz",
"integrity": "sha512-uVDi8LpBUKQj6sdxNaTetL6FpeCqTjOvAQuQUa/qAqq8oOd4ivkbhgnqayl0dnPal8Tb/yB1tF+gOvCBiicaiQ==",
"dev": true
"integrity": "sha512-uVDi8LpBUKQj6sdxNaTetL6FpeCqTjOvAQuQUa/qAqq8oOd4ivkbhgnqayl0dnPal8Tb/yB1tF+gOvCBiicaiQ=="
},
"d": {
"version": "1.0.1",
@@ -3915,6 +3949,31 @@
"resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz",
"integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw=="
},
"handlebars": {
"version": "4.7.6",
"resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.6.tgz",
"integrity": "sha512-1f2BACcBfiwAfStCKZNrUCgqNZkGsAT7UM3kkYtXuLo0KnaVfjKOyf7PRzB6++aK9STyT1Pd2ZCPe3EGOXleXA==",
"requires": {
"minimist": "^1.2.5",
"neo-async": "^2.6.0",
"source-map": "^0.6.1",
"uglify-js": "^3.1.4",
"wordwrap": "^1.0.0"
},
"dependencies": {
"source-map": {
"version": "0.6.1",
"resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
"integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="
},
"uglify-js": {
"version": "3.12.1",
"resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.12.1.tgz",
"integrity": "sha512-o8lHP20KjIiQe5b/67Rh68xEGRrc2SRsCuuoYclXXoC74AfSRGblU1HKzJWH3HxPZ+Ort85fWHpSX7KwBUC9CQ==",
"optional": true
}
}
},
"has": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
@@ -3982,6 +4041,14 @@
}
}
},
"hoist-non-react-statics": {
"version": "3.3.2",
"resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz",
"integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==",
"requires": {
"react-is": "^16.7.0"
}
},
"http-errors": {
"version": "1.7.3",
"resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.3.tgz",
@@ -4613,11 +4680,21 @@
"resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz",
"integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA=="
},
"lodash.isequal": {
"version": "4.5.0",
"resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz",
"integrity": "sha1-QVxEePK8wwEgwizhDtMib30+GOA="
},
"lodash.throttle": {
"version": "4.1.1",
"resolved": "https://registry.npmjs.org/lodash.throttle/-/lodash.throttle-4.1.1.tgz",
"integrity": "sha1-wj6RtxAkKscMN/HhzaknTMOb8vQ="
},
"lodash.uniqby": {
"version": "4.7.0",
"resolved": "https://registry.npmjs.org/lodash.uniqby/-/lodash.uniqby-4.7.0.tgz",
"integrity": "sha1-2ZwHpmnp5tJOE2Lf4mbGdhavEwI="
},
"log-symbols": {
"version": "2.2.0",
"resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-2.2.0.tgz",
@@ -5535,6 +5612,11 @@
"resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz",
"integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw=="
},
"neo-async": {
"version": "2.6.2",
"resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz",
"integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw=="
},
"next-tick": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.0.0.tgz",
@@ -5760,6 +5842,11 @@
"is-wsl": "^1.1.0"
}
},
"opencollective-postinstall": {
"version": "2.0.3",
"resolved": "https://registry.npmjs.org/opencollective-postinstall/-/opencollective-postinstall-2.0.3.tgz",
"integrity": "sha512-8AV/sCtuzUeTo8gQK5qDZzARrulB3egtLzFgteqB2tcT4Mw7B8Kt7JcDHmltjz6FOAHsvTevk70gZEbhM4ZS9Q=="
},
"options": {
"version": "0.0.6",
"resolved": "https://registry.npmjs.org/options/-/options-0.0.6.tgz",
@@ -5809,6 +5896,11 @@
"resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz",
"integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M="
},
"parse-github-url": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/parse-github-url/-/parse-github-url-1.0.2.tgz",
"integrity": "sha512-kgBf6avCbO3Cn6+RnzRGLkUsv4ZVqv/VfAYkRsyBcgkshNvVBkRn1FEZcW0Jb+npXQWm2vHPnnOqFteZxRRGNw=="
},
"parse-json": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz",
@@ -6160,11 +6252,55 @@
}
}
},
"react-native-elements": {
"version": "3.0.0-alpha.1",
"resolved": "https://registry.npmjs.org/react-native-elements/-/react-native-elements-3.0.0-alpha.1.tgz",
"integrity": "sha512-m85yQLo3wPkC5pF4Sp6bWltINElOVk6G57Ld2QNnVnXHwJ4PI5gYOoSvatxbsUV8MHQuvzTePRwDLZIjFu7HDg==",
"requires": {
"@types/react-native-vector-icons": "^6.4.5",
"auto-changelog": "^2.2.1",
"color": "^3.1.2",
"deepmerge": "^4.2.2",
"hoist-non-react-statics": "^3.3.2",
"lodash.isequal": "^4.5.0",
"opencollective-postinstall": "^2.0.3",
"prop-types": "^15.7.2",
"react-native-ratings": "^7.3.0",
"react-native-size-matters": "^0.3.1",
"react-native-status-bar-height": "^2.5.0"
},
"dependencies": {
"deepmerge": {
"version": "4.2.2",
"resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz",
"integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg=="
}
}
},
"react-native-ratings": {
"version": "7.3.0",
"resolved": "https://registry.npmjs.org/react-native-ratings/-/react-native-ratings-7.3.0.tgz",
"integrity": "sha512-NCDIkmrVPnxPzP9zKdlcNpa2rPs3Hiv2qXsojUr3FpwbANWfgYE+jjGSSCBcS3vpXndTjhoaTGFDnybnUSFPFA==",
"requires": {
"lodash": "^4.17.15",
"prop-types": "^15.7.2"
}
},
"react-native-safe-area-context": {
"version": "3.1.4",
"resolved": "https://registry.npmjs.org/react-native-safe-area-context/-/react-native-safe-area-context-3.1.4.tgz",
"integrity": "sha512-bXx3hqz4LovFoMnJIRGIWL2oJ/PHadXviBKvgZV9yNErtURQLJSn0yfQytVtiqslhaBMZOJwH4R6HiClyofvBg=="
},
"react-native-size-matters": {
"version": "0.3.1",
"resolved": "https://registry.npmjs.org/react-native-size-matters/-/react-native-size-matters-0.3.1.tgz",
"integrity": "sha512-mKOfBLIBFBcs9br1rlZDvxD5+mAl8Gfr5CounwJtxI6Z82rGrMO+Kgl9EIg3RMVf3G855a85YVqHJL2f5EDRlw=="
},
"react-native-status-bar-height": {
"version": "2.6.0",
"resolved": "https://registry.npmjs.org/react-native-status-bar-height/-/react-native-status-bar-height-2.6.0.tgz",
"integrity": "sha512-z3SGLF0mHT+OlJDq7B7h/jXPjWcdBT3V14Le5L2PjntjjWM3+EJzq2BcXDwV+v67KFNJic5pgA26cCmseYek6w=="
},
"react-native-web": {
"version": "0.13.18",
"resolved": "https://registry.npmjs.org/react-native-web/-/react-native-web-0.13.18.tgz",
+1
View File
@@ -16,6 +16,7 @@
"react": "16.13.1",
"react-dom": "16.13.1",
"react-native": "https://github.com/expo/react-native/archive/sdk-39.0.4.tar.gz",
"react-native-elements": "^3.0.0-alpha.1",
"react-native-web": "~0.13.12"
},
"devDependencies": {