Commit f91781a1 by 杨周龙

新增eslint设置

1 parent 2cc98596
# EditorConfig helps developers define and maintain consistent
# coding styles between different editors and IDEs
# editorconfig.org
root = true
[*]
indent_style = space
indent_size = 4
end_of_line = lf
charset = utf-8
trim_trailing_whitespace = true
insert_final_newline = true
node_modules/
lib/
babel.config.js
metro.config.js
prod.js
module.exports = {
root: true,
extends: '@react-native-community',
};
{
"env": {
"browser": true,
"es2021": true,
"node": true,
"mocha": true,
"jest": true,
"react-native/react-native": true
},
"extends": [
"eslint:recommended",
"plugin:react/recommended",
"plugin:@typescript-eslint/recommended",
"plugin:react-hooks/recommended",
"plugin:react-native/all"
],
"parser": "@typescript-eslint/parser",
"parserOptions": {
"ecmaFeatures": {
"jsx": true
},
"ecmaVersion": 12,
"sourceType": "module"
},
"plugins": [
"react",
"react-hooks",
"react-native",
"jsx-a11y"
],
"globals": {
"JSX": true,
"React": true,
"NodeJS": true
},
"settings": {
"react": {
"version": "detect"
}
},
"rules": {
"@typescript-eslint/no-empty-function": 0,
"react-native/no-unused-styles": 2,
"react-native/no-raw-text": 0,
"react-native/no-single-element-style-arrays": 2,
"no-console": [1, { "allow": ["error"] }],
"consistent-return": 2,
"curly": [2, "multi-or-nest"],
"dot-location": 0,
"eqeqeq": 2,
"no-alert": 2,
"no-eq-null": 2,
"no-lone-blocks": 2,
"no-return-await": 2,
"no-unused-expressions": 2,
"no-label-var": 1,
"array-bracket-spacing": 2,
"brace-style": 0,
"comma-spacing": 1,
"consistent-this": 1,
"eol-last": 0,
"multiline-ternary": [1, "always-multiline"],
"new-cap": [2, { "capIsNew": false }],
"no-trailing-spaces": 0,
"semi": ["error", "never"],
"space-before-blocks": 2,
"space-in-parens": 2,
"spaced-comment": 2,
"switch-colon-spacing": ["error", { "after": true, "before": false }],
"arrow-spacing": 2,
"quotes": [0, "single"],
"key-spacing": 2,
"comma-dangle": ["error", "never"],
"react-hooks/exhaustive-deps": 0,
"no-empty-function": 0,
"react-native/no-inline-styles": 0,
"react/forbid-prop-types": 0,
"react/prop-types": 0,
"react/display-name": 0,
"prefer-promise-reject-errors": 0,
"react/no-array-index-key": 2,
"react/no-unused-state": 2,
"react/jsx-indent-props": 1,
"react/jsx-no-comment-textnodes": 1,
"react/jsx-no-duplicate-props": 2,
"react/jsx-no-target-blank": [1, { "enforceDynamicLinks": "always" }],
"react/jsx-no-undef": 2,
"react/jsx-props-no-multi-spaces": 1,
"react/jsx-tag-spacing": 1,
"react/jsx-uses-vars": 2,
"react/jsx-wrap-multilines": 2,
"react-hooks/rules-of-hooks": 2
}
}
*.pbxproj -text *.pbxproj -text
# specific for windows script files
*.bat text eol=crlf
import site from './site' export default {}
export default {
site
}
import { connect } from 'react-redux'
const mapState = state => state.site
const mapDispatch = dispatch => ({})
export default connect(mapState, mapDispatch)
import { getStorage, setStorage } from '../../../libs/utils'
import { APP } from '../../../config'
import { findAddr, findAddrVersion } from '../../../api/site'
export default {
state: {
data: []
},
reducers: {
save(_, data) {
return { data }
},
update(_, data) {
return { data }
}
},
effects: {
async init(_, rootState) {
const data = rootState.site.data
if (data.length !== 0) return
// 查询缓存库
const cacheList = await getStorage(APP.siteCacheName) || []
if (cacheList.length !== 0) { // 缓存存在数组
this.save(cacheList)
findAddrVersion()
.then(async resVersion => {
const version = await getStorage(APP.siteVersionName)
if (version != resVersion) this.httpGet(resVersion)
})
.catch(err => {})
}
else // 网络获取
this.httpGet()
},
async httpGet(version) {
findAddr()
.then(async res => {
if (version === undefined) { // 网络获取版本号
findAddrVersion()
.then(res => setStorage(APP.siteVersionName, res))
.catch(err => {})
}
setStorage(APP.siteCacheName, res)
this.update(res)
})
.catch(err => {})
}
}
}
\ No newline at end of file
...@@ -8,9 +8,8 @@ import { Text, View, FlatList, Pressable, InteractionManager } from 'react-nativ ...@@ -8,9 +8,8 @@ import { Text, View, FlatList, Pressable, InteractionManager } from 'react-nativ
import { Icons } from '../../../assets/icons' import { Icons } from '../../../assets/icons'
import { styles } from './style' import { styles } from './style'
import { dateFormat, setUnit } from '../../../libs/utils' import { dateFormat, setUnit } from '../../../libs/utils'
import { XbdDivider, XbdLoading } from 'rn-ui' import { Toast, Divider, Empty } from 'react-native-mb-ui'
import { getVersionList } from '../../../api/version' import { getVersionList } from '../../../api/version'
import { ListEmpty } from '../../../components'
const Item = memo(({ navigation, item }) => { const Item = memo(({ navigation, item }) => {
const { version, create_time, remark } = item const { version, create_time, remark } = item
...@@ -27,7 +26,7 @@ const Item = memo(({ navigation, item }) => { ...@@ -27,7 +26,7 @@ const Item = memo(({ navigation, item }) => {
</View> </View>
<Icons name='you' size={setUnit(32)} color='#C2C3C4' /> <Icons name='you' size={setUnit(32)} color='#C2C3C4' />
</Pressable> </Pressable>
<XbdDivider style={{ marginLeft: setUnit(25) }} /> <Divider style={{ marginLeft: setUnit(25) }} />
</> </>
) )
}) })
...@@ -35,7 +34,6 @@ const Item = memo(({ navigation, item }) => { ...@@ -35,7 +34,6 @@ const Item = memo(({ navigation, item }) => {
let http let http
const Page = ({ navigation }) => { const Page = ({ navigation }) => {
const [records, setRecords] = useState([]) const [records, setRecords] = useState([])
const [loading, setLoading] = useState(false)
useLayoutEffect(() => { useLayoutEffect(() => {
navigation.setOptions({ navigation.setOptions({
...@@ -60,12 +58,12 @@ const Page = ({ navigation }) => { ...@@ -60,12 +58,12 @@ const Page = ({ navigation }) => {
const fetchData = useCallback(() => { const fetchData = useCallback(() => {
InteractionManager.runAfterInteractions(() => { InteractionManager.runAfterInteractions(() => {
setLoading(true) Toast.loading()
http = getVersionList(res => { http = getVersionList(res => {
setRecords(res?.reverse() || []) setRecords(res?.reverse() || [])
setLoading(false) Toast.hideLoading()
}, err => { }, err => {
setLoading(false) Toast.hideLoading()
alert(err) alert(err)
}) })
}) })
...@@ -78,9 +76,8 @@ const Page = ({ navigation }) => { ...@@ -78,9 +76,8 @@ const Page = ({ navigation }) => {
contentContainerStyle={!records.length ? styles.containerStyle : {}} contentContainerStyle={!records.length ? styles.containerStyle : {}}
keyExtractor={(item, index) => item.id?.toString()} keyExtractor={(item, index) => item.id?.toString()}
renderItem={({ item }) => <Item navigation={navigation} item={item} />} renderItem={({ item }) => <Item navigation={navigation} item={item} />}
ListEmptyComponent={() => <ListEmpty/>} ListEmptyComponent={() => <Empty style={{ paddingTop: 100 }} />}
/> />
<XbdLoading visible={loading}/>
</View> </View>
) )
} }
......
...@@ -3,14 +3,15 @@ ...@@ -3,14 +3,15 @@
* @description 隐私政策 * @description 隐私政策
* @date 2020/09/03 * @date 2020/09/03
*/ */
import React from 'react' import React, { useEffect, useState } from 'react'
import { View, ActivityIndicator } from 'react-native' import { View, ActivityIndicator } from 'react-native'
import WebView from 'react-native-webview' import WebView from 'react-native-webview'
import { Colors } from '../../../commo/theme' import { Colors } from '../../../commo/theme'
import { APP } from '../../../config' import { APP } from '../../../config'
import { styles } from './style' import { styles } from './style'
const Page = () => { const Page = ({ navigation }) => {
const [show, setShow] = useState(false)
const indicator = () => { const indicator = () => {
return ( return (
<View style={styles.wrapper}> <View style={styles.wrapper}>
...@@ -19,12 +20,30 @@ const Page = () => { ...@@ -19,12 +20,30 @@ const Page = () => {
) )
} }
useEffect(()=>{
setShow(true)
const remove = navigation.addListener('beforeRemove', e => {
e.preventDefault()
setShow(false)
remove()
navigation.goBack()
})
return () => remove && remove()
}, [])
return ( return (
<WebView <View style={{ flex: 1 }}>
startInLoadingState={true} { show &&
renderLoading={indicator} <WebView
source={{ uri: APP.privacyLink }} style={{ flex: 1 }}
/> startInLoadingState={true}
renderLoading={indicator}
source={{ uri: APP.privacyLink }}
/>
}
</View>
) )
} }
......
...@@ -11,12 +11,13 @@ const styles = StyleSheet.create({ ...@@ -11,12 +11,13 @@ const styles = StyleSheet.create({
alignItems: 'center' alignItems: 'center'
}, },
logo: { logo: {
width: setUnit(116), width: setUnit(160),
height: setUnit(116) height: setUnit(160)
}, },
name: { name: {
marginTop: setUnit(56), marginTop: setUnit(32),
color: '#262626', color: '#262626',
fontWeight: '500',
fontSize: setUnit(40) fontSize: setUnit(40)
}, },
version: { version: {
......
...@@ -5,8 +5,8 @@ ...@@ -5,8 +5,8 @@
*/ */
import React, { useCallback, useEffect, useState, useRef } from 'react' import React, { useCallback, useEffect, useState, useRef } from 'react'
import { View, Image, Text, Alert, Linking } from 'react-native' import { View, Image, Text, Linking } from 'react-native'
import { XbdCell, XbdDivider, XbdToast } from 'rn-ui' import { Toast, ModalManager, Divider, Cell } from 'react-native-mb-ui'
import { styles } from './style' import { styles } from './style'
import { getVersion, getVersionCode, setUnit } from '../../libs/utils' import { getVersion, getVersionCode, setUnit } from '../../libs/utils'
import { getTopVersion } from '../../api/version' import { getTopVersion } from '../../api/version'
...@@ -26,28 +26,32 @@ const Page = ({ navigation }) => { ...@@ -26,28 +26,32 @@ const Page = ({ navigation }) => {
const openDown = () => { const openDown = () => {
Linking.openURL(downUrl.current) Linking.openURL(downUrl.current)
.then(() => { }) .then(() => { })
.catch(err => { .catch(err => Toast.info('打开下载地址失败,请重试'))
XbdToast.show('打开下载地址失败,请重试')
})
} }
const getUpdate = async () => { const getUpdate = async () => {
const versionCode = await getVersionCode() const versionCode = await getVersionCode()
http = getTopVersion(APP.APP_CODE, res => { http = getTopVersion(res => {
if (res === null) return if (res === null) return Toast.info('已是最新版本')
const { version_code, down, version } = res const { version_code, down, version } = res
downUrl.current = down downUrl.current = down
if (version_code > versionCode) { if (version_code > versionCode) {
Alert.alert('提示', `发现新版本${version}需要更新,是否更新`, [ ModalManager.alert({
{ text: '取消' }, title: '提示',
{ text: '立即更新', onPress: openDown } content: `发现新版本${version}需要更新,是否更新`,
]) button: [
{ text: '取消' },
{ text: '立即更新', onPress: openDown }
]
})
} else { } else {
XbdToast.show('已是最新版本') Toast.info('已是最新版本')
} }
}) }, err => Toast.info(err))
} }
/**获取当前版本号 */ /**获取当前版本号 */
...@@ -68,23 +72,13 @@ const Page = ({ navigation }) => { ...@@ -68,23 +72,13 @@ const Page = ({ navigation }) => {
source={require('../../assets/images/ic_launcher.png')} source={require('../../assets/images/ic_launcher.png')}
style={styles.logo} style={styles.logo}
/> />
<Text style={styles.name}>商品交易所</Text> <Text style={styles.name}>{APP.appName}</Text>
<Text style={styles.version}>Version {version}</Text> <Text style={styles.version}>Version {version}</Text>
</View> </View>
<View style={styles.center}> <View style={styles.center}>
<XbdDivider style={{ marginHorizontal: setUnit(25) }} /> <Divider style={{ marginHorizontal: setUnit(25) }} />
<XbdCell <Cell label={'功能介绍'} onClick={() => navigation.navigate('Features')} />
title={'功能介绍'} <Cell label={'版本更新'} onClick={getUpdate} />
onClick={() => navigation.navigate('Features')}
padLeft={setUnit(25)}
padRight={setUnit(25)}
/>
<XbdCell
title={'版本更新'}
onClick={getUpdate}
padLeft={setUnit(25)}
padRight={setUnit(25)}
/>
</View> </View>
</View> </View>
<View style={styles.footer}> <View style={styles.footer}>
......
Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!