mirror of https://github.com/abpframework/abp.git
129 changed files with 0 additions and 14077 deletions
@ -1,25 +0,0 @@ |
|||
{ |
|||
"extends": ["airbnb", "prettier", "prettier/react"], |
|||
"parser": "babel-eslint", |
|||
"env": { |
|||
"jest": true |
|||
}, |
|||
"rules": { |
|||
"no-use-before-define": 0, |
|||
"react/jsx-filename-extension": 0, |
|||
"react/prop-types": ["error", { "ignore": ["navigation", "children"] }], |
|||
"react/require-default-props": 0, |
|||
"react/jsx-props-no-spreading": 0, |
|||
"react/forbid-prop-types": 0, |
|||
"import/prefer-default-export": 0, |
|||
"comma-dangle": 0, |
|||
"no-underscore-dangle": 1, |
|||
"no-plusplus": ["error", { "allowForLoopAfterthoughts": true }], |
|||
"no-param-reassign": 0, |
|||
"operator-linebreak": 0, |
|||
"global-require": 0 |
|||
}, |
|||
"globals": { |
|||
"fetch": false |
|||
} |
|||
} |
|||
@ -1,14 +0,0 @@ |
|||
node_modules/**/* |
|||
.expo/* |
|||
npm-debug.* |
|||
*.jks |
|||
*.p8 |
|||
*.p12 |
|||
*.key |
|||
*.mobileprovision |
|||
*.orig.* |
|||
web-build/ |
|||
web-report/ |
|||
|
|||
# macOS |
|||
.DS_Store |
|||
@ -1,8 +0,0 @@ |
|||
{ |
|||
"trailingComma": "all", |
|||
"singleQuote": true, |
|||
"jsxSingleQuote": false, |
|||
"printWidth": 100, |
|||
"semi": true, |
|||
"jsxBracketSameLine": true |
|||
} |
|||
@ -1,3 +0,0 @@ |
|||
{ |
|||
"recommendations": ["esbenp.prettier-vscode", "dbaeumer.vscode-eslint"] |
|||
} |
|||
@ -1,25 +0,0 @@ |
|||
import { StyleProvider } from 'native-base'; |
|||
import React from 'react'; |
|||
import { enableScreens } from 'react-native-screens'; |
|||
import { Provider } from 'react-redux'; |
|||
import { PersistGate } from 'redux-persist/integration/react'; |
|||
import AppContainer from './src/components/AppContainer/AppContainer'; |
|||
import { store, persistor } from './src/store'; |
|||
import getTheme from './src/theme/components'; |
|||
import { activeTheme } from './src/theme/variables'; |
|||
import { initAPIInterceptor } from './src/interceptors/APIInterceptor'; |
|||
|
|||
enableScreens(); |
|||
initAPIInterceptor(store); |
|||
|
|||
export default function App() { |
|||
return ( |
|||
<Provider store={store}> |
|||
<PersistGate loading={null} persistor={persistor}> |
|||
<StyleProvider style={getTheme(activeTheme)}> |
|||
<AppContainer /> |
|||
</StyleProvider> |
|||
</PersistGate> |
|||
</Provider> |
|||
); |
|||
} |
|||
@ -1,31 +0,0 @@ |
|||
const ENV = { |
|||
dev: { |
|||
apiUrl: 'http://localhost:44305', |
|||
oAuthConfig: { |
|||
issuer: 'http://localhost:44305', |
|||
clientId: 'MyProjectName_App', |
|||
clientSecret: '1q2w3e*', |
|||
scope: 'MyProjectName', |
|||
}, |
|||
localization: { |
|||
defaultResourceName: 'MyProjectName', |
|||
}, |
|||
}, |
|||
prod: { |
|||
apiUrl: 'http://localhost:44305', |
|||
oAuthConfig: { |
|||
issuer: 'http://localhost:44305', |
|||
clientId: 'MyProjectName_App', |
|||
clientSecret: '1q2w3e*', |
|||
scope: 'MyProjectName', |
|||
}, |
|||
localization: { |
|||
defaultResourceName: 'MyProjectName', |
|||
}, |
|||
}, |
|||
}; |
|||
|
|||
export const getEnvVars = () => { |
|||
// eslint-disable-next-line no-undef
|
|||
return __DEV__ ? ENV.dev : ENV.prod; |
|||
}; |
|||
@ -1,30 +0,0 @@ |
|||
{ |
|||
"expo": { |
|||
"name": "MyProjectName", |
|||
"slug": "MyProjectName", |
|||
"privacy": "public", |
|||
"sdkVersion": "36.0.0", |
|||
"platforms": ["ios", "android", "web"], |
|||
"version": "1.0.0", |
|||
"orientation": "portrait", |
|||
"icon": "./assets/icon.png", |
|||
"splash": { |
|||
"image": "./assets/splash.png", |
|||
"resizeMode": "cover", |
|||
"backgroundColor": "#38003c" |
|||
}, |
|||
"updates": { |
|||
"fallbackToCacheTimeout": 0 |
|||
}, |
|||
"assetBundlePatterns": ["**/*"], |
|||
"ios": { |
|||
"supportsTablet": true, |
|||
"bundleIdentifier": "com.MyCompanyName.MyProjectName", |
|||
"buildNumber": "1.0.0" |
|||
}, |
|||
"android": { |
|||
"package": "com.MyCompanyName.MyProjectName", |
|||
"versionCode": 1 |
|||
} |
|||
} |
|||
} |
|||
|
Before Width: | Height: | Size: 255 B |
|
Before Width: | Height: | Size: 7.2 KiB |
|
Before Width: | Height: | Size: 1.4 KiB |
|
Before Width: | Height: | Size: 93 KiB |
@ -1,6 +0,0 @@ |
|||
module.exports = function(api) { |
|||
api.cache(true); |
|||
return { |
|||
presets: ['babel-preset-expo'], |
|||
}; |
|||
}; |
|||
@ -1,64 +0,0 @@ |
|||
{ |
|||
"main": "node_modules/expo/AppEntry.js", |
|||
"scripts": { |
|||
"start": "expo start", |
|||
"android": "expo start --android", |
|||
"ios": "expo start --ios", |
|||
"web": "expo start --web", |
|||
"eject": "expo eject", |
|||
"lint": "eslint *.js **/*.js", |
|||
"lint:fix": "yarn lint --fix" |
|||
}, |
|||
"dependencies": { |
|||
"@expo/vector-icons": "^10.0.6", |
|||
"@react-native-community/masked-view": "0.1.5", |
|||
"@react-navigation/drawer": "^5.0.3", |
|||
"@react-navigation/native": "^5.0.3", |
|||
"@react-navigation/stack": "^5.0.3", |
|||
"@reduxjs/toolkit": "^1.2.3", |
|||
"axios": "^0.19.2", |
|||
"color": "^3.1.2", |
|||
"expo": "~36.0.0", |
|||
"expo-constants": "~8.0.0", |
|||
"expo-font": "~8.0.0", |
|||
"formik": "^2.1.2", |
|||
"i18n-js": "^3.5.1", |
|||
"lodash": "^4.17.15", |
|||
"native-base": "^2.13.8", |
|||
"prop-types": "^15.7.2", |
|||
"react": "~16.9.0", |
|||
"react-dom": "~16.9.0", |
|||
"react-native": "https://github.com/expo/react-native/archive/sdk-36.0.0.tar.gz", |
|||
"react-native-chart-kit": "^4.5.0", |
|||
"react-native-gesture-handler": "~1.5.0", |
|||
"react-native-reanimated": "~1.4.0", |
|||
"react-native-safe-area-context": "0.6.0", |
|||
"react-native-safe-area-view": "^1.0.0", |
|||
"react-native-screens": "2.0.0-alpha.12", |
|||
"react-native-svg": "9.13.3", |
|||
"react-native-web": "~0.11.7", |
|||
"react-redux": "^7.1.3", |
|||
"redux-persist": "^6.0.0", |
|||
"redux-saga": "^1.1.3", |
|||
"reselect": "^4.0.0", |
|||
"yup": "^0.28.0" |
|||
}, |
|||
"devDependencies": { |
|||
"@babel/core": "^7.0.0", |
|||
"@types/i18n-js": "^3.0.1", |
|||
"@types/react": "~16.9.0", |
|||
"@types/react-native": "~0.60.23", |
|||
"@types/react-redux": "^7.1.7", |
|||
"@types/yup": "^0.26.29", |
|||
"babel-eslint": "^10.0.3", |
|||
"babel-preset-expo": "~8.0.0", |
|||
"eslint": "^6.8.0", |
|||
"eslint-config-airbnb": "^18.0.1", |
|||
"eslint-config-prettier": "^6.10.0", |
|||
"eslint-plugin-import": "^2.20.1", |
|||
"eslint-plugin-jsx-a11y": "^6.2.3", |
|||
"eslint-plugin-react": "^7.18.3", |
|||
"prettier": "^1.19.1" |
|||
}, |
|||
"private": true |
|||
} |
|||
@ -1,10 +0,0 @@ |
|||
import axios from 'axios'; |
|||
import { getEnvVars } from '../../Environment'; |
|||
|
|||
const { apiUrl } = getEnvVars(); |
|||
|
|||
const axiosInstance = axios.create({ |
|||
baseURL: apiUrl, |
|||
}); |
|||
|
|||
export default axiosInstance; |
|||
@ -1,41 +0,0 @@ |
|||
import api from './API'; |
|||
import { getEnvVars } from '../../Environment'; |
|||
|
|||
const { oAuthConfig } = getEnvVars(); |
|||
|
|||
export const login = ({ username, password }) => { |
|||
// eslint-disable-next-line no-undef
|
|||
const formData = new FormData(); |
|||
formData.append('username', username); |
|||
formData.append('password', password); |
|||
formData.append('grant_type', 'password'); |
|||
formData.append('scope', `${oAuthConfig.scope} offline_access`); |
|||
formData.append('client_id', oAuthConfig.clientId); |
|||
formData.append('client_secret', oAuthConfig.clientSecret); |
|||
|
|||
return api({ |
|||
method: 'POST', |
|||
url: '/connect/token', |
|||
headers: { 'Content-Type': 'multipart/form-data' }, |
|||
data: formData, |
|||
baseURL: oAuthConfig.issuer, |
|||
}).then(({ data }) => data); |
|||
}; |
|||
|
|||
export const Logout = () => |
|||
api({ |
|||
method: 'GET', |
|||
url: '/api/account/logout', |
|||
}).then(({ data }) => data); |
|||
|
|||
export const getTenant = tenantName => |
|||
api({ |
|||
method: 'GET', |
|||
url: `/api/abp/multi-tenancy/tenants/by-name/${tenantName}`, |
|||
}).then(({ data }) => data); |
|||
|
|||
export const getTenantById = tenantId => |
|||
api({ |
|||
method: 'GET', |
|||
url: `/api/abp/multi-tenancy/tenants/by-id/${tenantId}`, |
|||
}).then(({ data }) => data); |
|||
@ -1,30 +0,0 @@ |
|||
import i18n from 'i18n-js'; |
|||
import api from './API'; |
|||
|
|||
export const getApplicationConfiguration = () => |
|||
api |
|||
.get('/api/abp/application-configuration') |
|||
.then(({ data }) => data) |
|||
.then(async config => { |
|||
const { cultureName } = config.localization.currentCulture; |
|||
i18n.locale = cultureName; |
|||
|
|||
Object.keys(config.localization.values).forEach(key => { |
|||
const resource = config.localization.values[key]; |
|||
|
|||
if (typeof resource !== 'object') return; |
|||
|
|||
Object.keys(resource).forEach(key2 => { |
|||
if (/'{|{/g.test(resource[key2])) { |
|||
resource[key2] = resource[key2].replace(/'{|{/g, '{{').replace(/}'|}/g, '}}'); |
|||
} |
|||
}); |
|||
}); |
|||
|
|||
i18n.translations[cultureName] = { |
|||
...config.localization.values, |
|||
...(i18n.translations[cultureName] || {}), |
|||
}; |
|||
|
|||
return config; |
|||
}); |
|||
@ -1,29 +0,0 @@ |
|||
import api from './API'; |
|||
|
|||
const maxMaxResultCount = 1000; |
|||
|
|||
export const getProfileDetail = () => api.get('/api/identity/my-profile').then(({ data }) => data); |
|||
|
|||
export const getRoles = (params = { maxResultCount: maxMaxResultCount, skipCount: 0 }) => |
|||
api.get('/api/identity/roles', { params }).then(({ data }) => data.items); |
|||
|
|||
export const getUserRoles = id => |
|||
api.get(`/api/identity/users/${id}/roles`).then(({ data }) => data.items); |
|||
|
|||
export const getUsers = (params = { maxResultCount: 10, skipCount: 0 }) => |
|||
api.get('/api/identity/users', { params }).then(({ data }) => data); |
|||
|
|||
export const getUserById = id => api.get(`/api/identity/users/${id}`).then(({ data }) => data); |
|||
|
|||
export const createUser = body => api.post('/api/identity/users', body).then(({ data }) => data); |
|||
|
|||
export const updateUser = (body, id) => |
|||
api.put(`/api/identity/users/${id}`, body).then(({ data }) => data); |
|||
|
|||
export const removeUser = id => api.delete(`/api/identity/users/${id}`); |
|||
|
|||
export const updateProfileDetail = body => |
|||
api.put('/api/identity/my-profile', body).then(({ data }) => data); |
|||
|
|||
export const changePassword = body => |
|||
api.post('/api/identity/my-profile/change-password', body).then(({ data }) => data); |
|||
@ -1,21 +0,0 @@ |
|||
import api from './API'; |
|||
|
|||
export function getTenants(params = {}) { |
|||
return api.get('/api/multi-tenancy/tenants', { params }).then(({ data }) => data); |
|||
} |
|||
|
|||
export function createTenant(body) { |
|||
return api.post('/api/multi-tenancy/tenants', body).then(({ data }) => data); |
|||
} |
|||
|
|||
export function getTenantById(id) { |
|||
return api.get(`/api/multi-tenancy/tenants/${id}`).then(({ data }) => data); |
|||
} |
|||
|
|||
export function updateTenant(body, id) { |
|||
return api.put(`/api/multi-tenancy/tenants/${id}`, body).then(({ data }) => data); |
|||
} |
|||
|
|||
export function removeTenant(id) { |
|||
return api.delete(`/api/multi-tenancy/tenants/${id}`).then(({ data }) => data); |
|||
} |
|||
@ -1,99 +0,0 @@ |
|||
import { Ionicons } from '@expo/vector-icons'; |
|||
import * as Font from 'expo-font'; |
|||
import i18n from 'i18n-js'; |
|||
import PropTypes from 'prop-types'; |
|||
import React, { useEffect, useState, useMemo } from 'react'; |
|||
import { Platform, StatusBar } from 'react-native'; |
|||
import { NavigationContainer } from '@react-navigation/native'; |
|||
import { Root } from 'native-base'; |
|||
import Loading from '../Loading/Loading'; |
|||
import { connectToRedux } from '../../utils/ReduxConnect'; |
|||
import { createLanguageSelector } from '../../store/selectors/AppSelectors'; |
|||
import { createTokenSelector } from '../../store/selectors/PersistentStorageSelectors'; |
|||
import AppActions from '../../store/actions/AppActions'; |
|||
import PersistentStorageActions from '../../store/actions/PersistentStorageActions'; |
|||
import { LocalizationContext } from '../../contexts/LocalizationContext'; |
|||
import { isTokenValid } from '../../utils/TokenUtils'; |
|||
import DrawerNavigator from '../../navigators/DrawerNavigator'; |
|||
import AuthNavigator from '../../navigators/AuthNavigator'; |
|||
import { getEnvVars } from '../../../Environment'; |
|||
|
|||
const { localization } = getEnvVars(); |
|||
|
|||
i18n.defaultSeparator = '::'; |
|||
|
|||
const cloneT = i18n.t; |
|||
i18n.t = (key, ...args) => { |
|||
if (key.slice(0, 2) === '::') { |
|||
key = localization.defaultResourceName + key; |
|||
} |
|||
return cloneT(key, ...args); |
|||
}; |
|||
|
|||
function AppContainer({ language, fetchAppConfig, token, setToken }) { |
|||
const platform = Platform.OS; |
|||
const [isReady, setIsReady] = useState(false); |
|||
|
|||
const localizationContext = useMemo( |
|||
() => ({ |
|||
t: i18n.t, |
|||
locale: (language || {}).cultureName, |
|||
}), |
|||
[language], |
|||
); |
|||
|
|||
const isValid = useMemo(() => isTokenValid(token), [token]); |
|||
|
|||
useEffect(() => { |
|||
if (!isValid && token && token.access_token) { |
|||
setToken({}); |
|||
} |
|||
}, [isValid]); |
|||
|
|||
useEffect(() => { |
|||
fetchAppConfig(); |
|||
|
|||
Promise.all([ |
|||
Font.loadAsync({ |
|||
Roboto: require('native-base/Fonts/Roboto.ttf'), |
|||
Roboto_medium: require('native-base/Fonts/Roboto_medium.ttf'), |
|||
...Ionicons.font, |
|||
}), |
|||
]).then(() => setIsReady(true)); |
|||
}, []); |
|||
|
|||
return ( |
|||
<> |
|||
<StatusBar barStyle={platform === 'ios' ? 'dark-content' : 'light-content'} /> |
|||
<Root> |
|||
{isReady && language ? ( |
|||
<LocalizationContext.Provider value={localizationContext}> |
|||
<NavigationContainer> |
|||
{isValid ? <DrawerNavigator /> : <AuthNavigator />} |
|||
</NavigationContainer> |
|||
</LocalizationContext.Provider> |
|||
) : null} |
|||
</Root> |
|||
<Loading /> |
|||
</> |
|||
); |
|||
} |
|||
|
|||
AppContainer.propTypes = { |
|||
language: PropTypes.object, |
|||
token: PropTypes.object.isRequired, |
|||
fetchAppConfig: PropTypes.func.isRequired, |
|||
setToken: PropTypes.func.isRequired, |
|||
}; |
|||
|
|||
export default connectToRedux({ |
|||
component: AppContainer, |
|||
stateProps: state => ({ |
|||
language: createLanguageSelector()(state), |
|||
token: createTokenSelector()(state), |
|||
}), |
|||
dispatchProps: { |
|||
fetchAppConfig: AppActions.fetchAppConfigAsync, |
|||
setToken: PersistentStorageActions.setToken, |
|||
}, |
|||
}); |
|||
@ -1,139 +0,0 @@ |
|||
import { useFocusEffect } from '@react-navigation/native'; |
|||
import i18n from 'i18n-js'; |
|||
import { connectStyle, Icon, Input, InputGroup, Item, List, Spinner, Text } from 'native-base'; |
|||
import PropTypes from 'prop-types'; |
|||
import React, { forwardRef, useCallback, useEffect, useState } from 'react'; |
|||
import { RefreshControl, StyleSheet, View } from 'react-native'; |
|||
import LoadingActions from '../../store/actions/LoadingActions'; |
|||
import { activeTheme } from '../../theme/variables'; |
|||
import { debounce } from '../../utils/Debounce'; |
|||
import { connectToRedux } from '../../utils/ReduxConnect'; |
|||
import LoadingButton from '../LoadingButton/LoadingButton'; |
|||
|
|||
function DataList({ |
|||
style, |
|||
navigation, |
|||
fetchFn, |
|||
render, |
|||
maxResultCount = 15, |
|||
debounceTime = 350, |
|||
...props |
|||
}) { |
|||
const [records, setRecords] = useState([]); |
|||
const [totalCount, setTotalCount] = useState(0); |
|||
const [loading, setLoading] = useState(false); |
|||
const [searchLoading, setSearchLoading] = useState(false); |
|||
const [buttonLoading, setButtonLoading] = useState(false); |
|||
const [skipCount, setSkipCount] = useState(0); |
|||
const [filter, setFilter] = useState(''); |
|||
|
|||
const fetch = (skip = 0, isRefreshingActive = true) => { |
|||
if (isRefreshingActive) setLoading(true); |
|||
return fetchFn({ filter, maxResultCount, skipCount: skip }) |
|||
.then(({ items, totalCount: total }) => { |
|||
setTotalCount(total); |
|||
setRecords(skip ? [...records, ...items] : items); |
|||
setSkipCount(skip); |
|||
}) |
|||
.finally(() => { |
|||
if (isRefreshingActive) setLoading(false); |
|||
}); |
|||
}; |
|||
|
|||
const fetchPartial = () => { |
|||
if (loading || records.length === totalCount) return; |
|||
|
|||
setButtonLoading(true); |
|||
fetch(skipCount + maxResultCount, false).finally(() => setButtonLoading(false)); |
|||
}; |
|||
|
|||
useFocusEffect( |
|||
useCallback(() => { |
|||
setSkipCount(0); |
|||
fetch(0, false); |
|||
}, []), |
|||
); |
|||
|
|||
useEffect(() => { |
|||
function searchFetch() { |
|||
setSearchLoading(true); |
|||
return fetch(0, false).finally(() => setTimeout(() => setSearchLoading(false), 150)); |
|||
} |
|||
debounce(searchFetch, debounceTime)(); |
|||
}, [filter]); |
|||
|
|||
return ( |
|||
<> |
|||
<Item placeholderLabel style={{ backgroundColor: '#fff' }}> |
|||
<InputGroup style={{ marginLeft: 10 }}> |
|||
<Input |
|||
placeholder={i18n.t('AbpUi::PagerSearch')} |
|||
style={{ padding: 0, margin: 0 }} |
|||
returnKeyType="done" |
|||
value={filter} |
|||
onChangeText={setFilter} |
|||
/> |
|||
{searchLoading ? ( |
|||
<View> |
|||
<Spinner style={style.spinner} color={style.spinner.color} /> |
|||
</View> |
|||
) : ( |
|||
<Icon style={{ fontSize: 20, marginRight: 15 }} name="ios-search" /> |
|||
)} |
|||
</InputGroup> |
|||
</Item> |
|||
<View style={style.container}> |
|||
<List |
|||
showsVerticalScrollIndicator |
|||
scrollEnabled |
|||
refreshControl={<RefreshControl refreshing={loading} onRefresh={fetch} />} |
|||
dataArray={records} |
|||
renderRow={(data, sectionID, rowId, ...args) => ( |
|||
<> |
|||
{render(data, sectionID, rowId, ...args)} |
|||
{rowId + 1 === skipCount + maxResultCount && totalCount > records.length ? ( |
|||
<View style={{ justifyContent: 'center', alignItems: 'center' }}> |
|||
<LoadingButton loading={buttonLoading} onPress={() => fetchPartial()}> |
|||
<Text>{i18n.t('AbpUi::LoadMore')}</Text> |
|||
</LoadingButton> |
|||
</View> |
|||
) : null} |
|||
</> |
|||
)} |
|||
{...props} |
|||
/> |
|||
</View> |
|||
</> |
|||
); |
|||
} |
|||
|
|||
DataList.propTypes = { |
|||
...List.propTypes, |
|||
style: PropTypes.any.isRequired, |
|||
fetchFn: PropTypes.func.isRequired, |
|||
render: PropTypes.func.isRequired, |
|||
maxResultCount: PropTypes.number, |
|||
debounceTime: PropTypes.number, |
|||
}; |
|||
|
|||
const styles = StyleSheet.create({ |
|||
container: { flex: 1 }, |
|||
list: {}, |
|||
spinner: { |
|||
transform: [{ scale: 0.5 }], |
|||
position: 'absolute', |
|||
right: 8, |
|||
top: -40, |
|||
color: activeTheme.brandInfo, |
|||
}, |
|||
}); |
|||
|
|||
const Forwarded = forwardRef((props, ref) => <DataList {...props} forwardedRef={ref} />); |
|||
|
|||
export default connectToRedux({ |
|||
component: connectStyle('ABP.DataList', styles)(Forwarded), |
|||
dispatchProps: { |
|||
startLoading: LoadingActions.start, |
|||
stopLoading: LoadingActions.stop, |
|||
}, |
|||
}); |
|||
@ -1,121 +0,0 @@ |
|||
import { Text, View, List, ListItem, Left, Icon, Body } from 'native-base'; |
|||
import React from 'react'; |
|||
import { Image, StyleSheet } from 'react-native'; |
|||
import SafeAreaView from 'react-native-safe-area-view'; |
|||
import i18n from 'i18n-js'; |
|||
import PropTypes from 'prop-types'; |
|||
import Constants from 'expo-constants'; |
|||
import { withPermission } from '../../hocs/PermissionHOC'; |
|||
|
|||
const screens = { |
|||
Home: { label: '::Menu:Home', iconName: 'home' }, |
|||
Users: { |
|||
label: 'AbpIdentity::Users', |
|||
iconName: 'contacts', |
|||
requiredPolicy: 'AbpIdentity.Users', |
|||
}, |
|||
Tenants: { |
|||
label: 'AbpTenantManagement::Tenants', |
|||
iconName: 'people', |
|||
requiredPolicy: 'AbpTenantManagement.Tenants', |
|||
}, |
|||
Settings: { label: 'AbpSettingManagement::Settings', iconName: 'cog' }, |
|||
}; |
|||
|
|||
const ListItemWithPermission = withPermission(ListItem); |
|||
|
|||
function DrawerContent({ navigation, state: { routeNames, index: currentScreenIndex } }) { |
|||
const navigate = screen => { |
|||
navigation.navigate(screen); |
|||
navigation.closeDrawer(); |
|||
}; |
|||
|
|||
return ( |
|||
<View style={styles.container}> |
|||
<SafeAreaView style={styles.container} forceInset={{ top: 'always', horizontal: 'never' }}> |
|||
<View style={styles.headerView}> |
|||
<Image style={styles.logo} source={require('../../../assets/logo.png')} /> |
|||
</View> |
|||
<List |
|||
dataArray={routeNames} |
|||
keyExtractor={item => item} |
|||
renderRow={name => ( |
|||
<ListItemWithPermission |
|||
icon |
|||
key={name} |
|||
policyKey={screens[name].requiredPolicy} |
|||
selected={name === routeNames[currentScreenIndex]} |
|||
onPress={() => navigate(name)} |
|||
style={{ |
|||
...styles.navItem, |
|||
backgroundColor: name === routeNames[currentScreenIndex] ? '#38003c' : '#f2f2f2', |
|||
}}> |
|||
<Left> |
|||
<Icon |
|||
dark={name !== routeNames[currentScreenIndex]} |
|||
light={name === routeNames[currentScreenIndex]} |
|||
name={screens[name].iconName} |
|||
/> |
|||
</Left> |
|||
<Body style={{ borderBottomWidth: 0 }}> |
|||
<Text |
|||
style={{ |
|||
color: name === routeNames[currentScreenIndex] ? '#fff' : '#000', |
|||
}}> |
|||
{i18n.t(screens[name].label)} |
|||
</Text> |
|||
</Body> |
|||
</ListItemWithPermission> |
|||
)} |
|||
/> |
|||
</SafeAreaView> |
|||
<View style={styles.footer}> |
|||
<Text note style={styles.copyRight}> |
|||
© MyProjectName |
|||
</Text> |
|||
<Text note style={styles.version}> |
|||
v{Constants.manifest.version} |
|||
</Text> |
|||
</View> |
|||
</View> |
|||
); |
|||
} |
|||
|
|||
const styles = StyleSheet.create({ |
|||
container: { |
|||
flexGrow: 1, |
|||
}, |
|||
logo: { |
|||
marginTop: 20, |
|||
marginBottom: 15, |
|||
}, |
|||
headerView: { |
|||
borderBottomWidth: 1, |
|||
borderColor: '#eee', |
|||
alignItems: 'center', |
|||
}, |
|||
navItem: { |
|||
marginLeft: 0, |
|||
marginBottom: 3, |
|||
paddingLeft: 10, |
|||
width: '100%', |
|||
backgroundColor: '#f2f2f2', |
|||
}, |
|||
footer: { |
|||
backgroundColor: '#eee', |
|||
flexDirection: 'row', |
|||
justifyContent: 'space-between', |
|||
}, |
|||
copyRight: { |
|||
margin: 15, |
|||
}, |
|||
version: { |
|||
margin: 15, |
|||
}, |
|||
}); |
|||
|
|||
DrawerContent.propTypes = { |
|||
state: PropTypes.object.isRequired, |
|||
}; |
|||
|
|||
export default DrawerContent; |
|||
@ -1,82 +0,0 @@ |
|||
import React, { forwardRef } from 'react'; |
|||
import PropTypes from 'prop-types'; |
|||
import { Button, Text, connectStyle } from 'native-base'; |
|||
import { View, StyleSheet, Alert } from 'react-native'; |
|||
import i18n from 'i18n-js'; |
|||
|
|||
function FormButtons({ |
|||
style, |
|||
submit, |
|||
remove, |
|||
removeMessage, |
|||
isRemoveDisabled, |
|||
isSubmitDisabled, |
|||
isShowRemove = false, |
|||
isShowSubmit = true, |
|||
}) { |
|||
const confirmation = () => { |
|||
Alert.alert( |
|||
i18n.t('AbpUi::AreYouSure'), |
|||
removeMessage, |
|||
[ |
|||
{ |
|||
text: i18n.t('AbpUi::Cancel'), |
|||
style: 'cancel', |
|||
}, |
|||
{ text: i18n.t('AbpUi::Yes'), onPress: () => remove() }, |
|||
], |
|||
{ cancelable: true }, |
|||
); |
|||
}; |
|||
|
|||
return ( |
|||
<View style={style.container}> |
|||
{isShowRemove ? ( |
|||
<Button |
|||
abpButton |
|||
danger |
|||
style={{ flex: 1, borderRadius: 0 }} |
|||
onPress={() => confirmation()} |
|||
disabled={isRemoveDisabled}> |
|||
<Text>{i18n.t('AbpIdentity::Delete')}</Text> |
|||
</Button> |
|||
) : null} |
|||
{isShowSubmit ? ( |
|||
<Button |
|||
abpButton |
|||
primary |
|||
style={{ flex: 1, borderRadius: 0 }} |
|||
onPress={submit} |
|||
disabled={isSubmitDisabled}> |
|||
<Text>{i18n.t('AbpIdentity::Save')}</Text> |
|||
</Button> |
|||
) : null} |
|||
</View> |
|||
); |
|||
} |
|||
|
|||
FormButtons.propTypes = { |
|||
submit: PropTypes.func.isRequired, |
|||
remove: PropTypes.func, |
|||
removeMessage: PropTypes.string, |
|||
style: PropTypes.any, |
|||
isRemoveDisabled: PropTypes.bool, |
|||
isSubmitDisabled: PropTypes.bool, |
|||
isShowRemove: PropTypes.bool, |
|||
isShowSubmit: PropTypes.bool, |
|||
}; |
|||
|
|||
const styles = StyleSheet.create({ |
|||
container: { |
|||
width: '100%', |
|||
justifyContent: 'center', |
|||
alignItems: 'center', |
|||
position: 'absolute', |
|||
bottom: 0, |
|||
flexDirection: 'row', |
|||
}, |
|||
}); |
|||
|
|||
const Forwarded = forwardRef((props, ref) => <FormButtons {...props} forwardedRef={ref} />); |
|||
|
|||
export default connectStyle('ABP.FormButtons', styles)(Forwarded); |
|||
@ -1,63 +0,0 @@ |
|||
import React, { forwardRef } from 'react'; |
|||
import { Spinner, View, connectStyle } from 'native-base'; |
|||
import { StyleSheet } from 'react-native'; |
|||
import PropTypes from 'prop-types'; |
|||
import { activeTheme } from '../../theme/variables'; |
|||
import { connectToRedux } from '../../utils/ReduxConnect'; |
|||
import { |
|||
createLoadingSelector, |
|||
createOpacitySelector, |
|||
} from '../../store/selectors/LoadingSelectors'; |
|||
|
|||
function Loading({ style, loading, opacity }) { |
|||
return loading ? ( |
|||
<View style={style.container}> |
|||
<View |
|||
style={{ |
|||
...style.backdrop, |
|||
opacity: opacity || 0.6, |
|||
}} |
|||
/> |
|||
<Spinner style={style.spinner} color={style.spinner.color} /> |
|||
</View> |
|||
) : null; |
|||
} |
|||
const Forwarded = forwardRef((props, ref) => <Loading {...props} forwardedRef={ref} />); |
|||
|
|||
const backdropStyle = { |
|||
position: 'absolute', |
|||
top: 0, |
|||
left: 0, |
|||
width: '100%', |
|||
height: '100%', |
|||
backgroundColor: '#fff', |
|||
}; |
|||
|
|||
export const styles = StyleSheet.create({ |
|||
container: { |
|||
...backdropStyle, |
|||
backgroundColor: 'transparent', |
|||
zIndex: activeTheme.zIndex.indicator, |
|||
alignItems: 'center', |
|||
justifyContent: 'center', |
|||
}, |
|||
backdrop: backdropStyle, |
|||
spinner: { |
|||
color: activeTheme.brandPrimary, |
|||
fontSize: 100, |
|||
}, |
|||
}); |
|||
|
|||
Loading.propTypes = { |
|||
style: PropTypes.objectOf(PropTypes.any), |
|||
loading: PropTypes.bool, |
|||
opacity: PropTypes.number, |
|||
}; |
|||
|
|||
export default connectToRedux({ |
|||
component: connectStyle('ABP.Loading', styles)(Forwarded), |
|||
stateProps: state => ({ |
|||
loading: createLoadingSelector()(state), |
|||
opacity: createOpacitySelector()(state), |
|||
}), |
|||
}); |
|||
@ -1,31 +0,0 @@ |
|||
import { Button, connectStyle, Spinner } from 'native-base'; |
|||
import PropTypes from 'prop-types'; |
|||
import React, { forwardRef } from 'react'; |
|||
import { StyleSheet } from 'react-native'; |
|||
|
|||
function LoadingButton({ loading = false, style, children, ...props }) { |
|||
return ( |
|||
<Button style={style.button} {...props}> |
|||
{children} |
|||
{loading ? <Spinner style={style.spinner} color={style.spinner.color || 'white'} /> : null} |
|||
</Button> |
|||
); |
|||
} |
|||
|
|||
LoadingButton.propTypes = { |
|||
...Button.propTypes, |
|||
loading: PropTypes.bool.isRequired, |
|||
}; |
|||
|
|||
const styles = StyleSheet.create({ |
|||
button: { marginTop: 20, marginBottom: 30, height: 30 }, |
|||
spinner: { |
|||
transform: [{ scale: 0.5 }], |
|||
color: 'white', |
|||
marginRight: 5, |
|||
}, |
|||
}); |
|||
|
|||
const Forwarded = forwardRef((props, ref) => <LoadingButton {...props} forwardedRef={ref} />); |
|||
|
|||
export default connectStyle('ABP.LoadingButton', styles)(Forwarded); |
|||
@ -1,19 +0,0 @@ |
|||
import React from 'react'; |
|||
import { TouchableOpacity } from 'react-native'; |
|||
import { Icon } from 'native-base'; |
|||
import PropTypes from 'prop-types'; |
|||
|
|||
function MenuIcon({ onPress, iconName = 'menu' }) { |
|||
return ( |
|||
<TouchableOpacity onPress={onPress}> |
|||
<Icon navElement name={iconName} /> |
|||
</TouchableOpacity> |
|||
); |
|||
} |
|||
|
|||
MenuIcon.propTypes = { |
|||
onPress: PropTypes.func.isRequired, |
|||
iconName: PropTypes.string, |
|||
}; |
|||
|
|||
export default MenuIcon; |
|||
@ -1,128 +0,0 @@ |
|||
import i18n from 'i18n-js'; |
|||
import { |
|||
Button, |
|||
connectStyle, |
|||
Content, |
|||
Input, |
|||
InputGroup, |
|||
Label, |
|||
Segment, |
|||
Text, |
|||
} from 'native-base'; |
|||
import PropTypes from 'prop-types'; |
|||
import React, { forwardRef, useState } from 'react'; |
|||
import { StyleSheet, View, Alert } from 'react-native'; |
|||
import { getTenant } from '../../api/AccountAPI'; |
|||
import PersistentStorageActions from '../../store/actions/PersistentStorageActions'; |
|||
import { connectToRedux } from '../../utils/ReduxConnect'; |
|||
import { createTenantSelector } from '../../store/selectors/PersistentStorageSelectors'; |
|||
|
|||
function TenantBox({ style, tenant = {}, setTenant, showTenantSelection, toggleTenantSelection }) { |
|||
const [tenantName, setTenantName] = useState(tenant.name); |
|||
|
|||
const findTenant = () => { |
|||
if (!tenantName) { |
|||
setTenant({}); |
|||
toggleTenantSelection(); |
|||
return; |
|||
} |
|||
|
|||
getTenant(tenantName).then(({ success, ...data }) => { |
|||
if (!success) { |
|||
Alert.alert( |
|||
i18n.t('AbpUi::Error'), |
|||
i18n.t('AbpUiMultiTenancy::GivenTenantIsNotAvailable', { |
|||
0: tenantName, |
|||
}), |
|||
[{ text: i18n.t('AbpUi::Ok') }], |
|||
); |
|||
return; |
|||
} |
|||
setTenant(data); |
|||
toggleTenantSelection(); |
|||
}); |
|||
}; |
|||
|
|||
return ( |
|||
<> |
|||
<Segment style={style.container}> |
|||
<View> |
|||
<Text style={style.title}>{i18n.t('AbpUiMultiTenancy::Tenant')}</Text> |
|||
<Text style={style.tenant}> |
|||
{tenant.name ? tenant.name : i18n.t('AbpUiMultiTenancy::NotSelected')} |
|||
</Text> |
|||
</View> |
|||
<Button |
|||
style={{ ...style.switchButton, display: !showTenantSelection ? 'flex' : 'none' }} |
|||
onPress={() => toggleTenantSelection()}> |
|||
<Text style={{ color: '#fff' }}>{i18n.t('AbpUiMultiTenancy::Switch')}</Text> |
|||
</Button> |
|||
</Segment> |
|||
{showTenantSelection ? ( |
|||
<Content px20 style={{ flex: 1 }}> |
|||
<InputGroup abpInputGroup> |
|||
<Label abpLabel>{i18n.t('AbpUiMultiTenancy::Name')}</Label> |
|||
<Input abpInput value={tenantName} onChangeText={setTenantName} /> |
|||
</InputGroup> |
|||
<Text style={style.hint}>{i18n.t('AbpUiMultiTenancy::SwitchTenantHint')}</Text> |
|||
<View style={{ flexDirection: 'row', justifyContent: 'space-between' }}> |
|||
<Button abpButton light style={style.button} onPress={() => toggleTenantSelection()}> |
|||
<Text>{i18n.t('AbpAccount::Cancel')}</Text> |
|||
</Button> |
|||
<Button abpButton style={style.button} onPress={() => findTenant()}> |
|||
<Text>{i18n.t('AbpAccount::Save')}</Text> |
|||
</Button> |
|||
</View> |
|||
</Content> |
|||
) : null} |
|||
</> |
|||
); |
|||
} |
|||
|
|||
TenantBox.propTypes = { |
|||
style: PropTypes.any.isRequired, |
|||
setTenant: PropTypes.func.isRequired, |
|||
showTenantSelection: PropTypes.bool.isRequired, |
|||
toggleTenantSelection: PropTypes.func.isRequired, |
|||
tenant: PropTypes.object.isRequired, |
|||
}; |
|||
|
|||
const styles = StyleSheet.create({ |
|||
container: { |
|||
paddingHorizontal: 20, |
|||
alignItems: 'center', |
|||
justifyContent: 'space-between', |
|||
height: 70, |
|||
}, |
|||
button: { marginTop: 20, width: '49%' }, |
|||
switchButton: { |
|||
borderTopWidth: 0, |
|||
borderRightWidth: 0, |
|||
borderBottomWidth: 0, |
|||
borderLeftWidth: 0, |
|||
borderRadius: 10, |
|||
backgroundColor: '#38003c', |
|||
height: 35, |
|||
}, |
|||
tenant: { color: '#777' }, |
|||
title: { |
|||
marginRight: 10, |
|||
color: '#777', |
|||
fontSize: 13, |
|||
fontWeight: '600', |
|||
textTransform: 'uppercase', |
|||
}, |
|||
hint: { color: '#bbb', textAlign: 'left' }, |
|||
}); |
|||
|
|||
const Forwarded = forwardRef((props, ref) => <TenantBox {...props} forwardedRef={ref} />); |
|||
|
|||
export default connectToRedux({ |
|||
component: connectStyle('ABP.TenantBox', styles)(Forwarded), |
|||
dispatchProps: { |
|||
setTenant: PersistentStorageActions.setTenant, |
|||
}, |
|||
stateProps: state => ({ |
|||
tenant: createTenantSelector()(state), |
|||
}), |
|||
}); |
|||
@ -1,18 +0,0 @@ |
|||
import i18n from 'i18n-js'; |
|||
import { connectStyle } from 'native-base'; |
|||
import React, { forwardRef } from 'react'; |
|||
import { Text } from 'react-native'; |
|||
|
|||
const ValidationMessage = ({ children, ...props }) => |
|||
children ? <Text {...props}>{i18n.t(children)}</Text> : null; |
|||
|
|||
const styles = { |
|||
fontSize: 12, |
|||
marginHorizontal: 10, |
|||
marginTop: -5, |
|||
color: '#ed2f2f', |
|||
}; |
|||
|
|||
const Forwarded = forwardRef((props, ref) => <ValidationMessage {...props} forwardedRef={ref} />); |
|||
|
|||
export default connectStyle('ABP.ValidationMessage', styles)(Forwarded); |
|||
@ -1,3 +0,0 @@ |
|||
import React from 'react'; |
|||
|
|||
export const LocalizationContext = React.createContext(); |
|||
@ -1,17 +0,0 @@ |
|||
import React, { forwardRef } from 'react'; |
|||
import PropTypes from 'prop-types'; |
|||
import { usePermission } from '../hooks/UsePermission'; |
|||
|
|||
export function withPermission(Component, policyKey) { |
|||
const Forwarded = forwardRef((props, ref) => { |
|||
const isGranted = |
|||
policyKey || props.policyKey ? usePermission(policyKey || props.policyKey) : true; |
|||
return isGranted ? <Component ref={ref} {...props} /> : null; |
|||
}); |
|||
|
|||
Forwarded.propTypes = { |
|||
policyKey: PropTypes.string, |
|||
}; |
|||
|
|||
return Forwarded; |
|||
} |
|||
@ -1,16 +0,0 @@ |
|||
import { useEffect, useState } from 'react'; |
|||
import { store } from '../store'; |
|||
import { createGrantedPolicySelector } from '../store/selectors/AppSelectors'; |
|||
|
|||
export function usePermission(key) { |
|||
const [permission, setPermission] = useState(false); |
|||
|
|||
const state = store.getState(); |
|||
const policy = createGrantedPolicySelector(key)(state); |
|||
|
|||
useEffect(() => { |
|||
setPermission(policy); |
|||
}, [policy]); |
|||
|
|||
return permission; |
|||
} |
|||
@ -1,102 +0,0 @@ |
|||
import { Toast } from 'native-base'; |
|||
import i18n from 'i18n-js'; |
|||
import api from '../api/API'; |
|||
import PersistentStorageActions from '../store/actions/PersistentStorageActions'; |
|||
import LoadingActions from '../store/actions/LoadingActions'; |
|||
|
|||
export function initAPIInterceptor(store) { |
|||
api.interceptors.request.use( |
|||
async request => { |
|||
const { |
|||
persistentStorage: { token, language, tenant }, |
|||
} = store.getState(); |
|||
|
|||
if (!request.headers.Authorization && token && token.access_token) { |
|||
request.headers.Authorization = `${token.token_type} ${token.access_token}`; |
|||
} |
|||
|
|||
if (!request.headers['Content-Type']) { |
|||
request.headers['Content-Type'] = 'application/json'; |
|||
} |
|||
|
|||
if (!request.headers['Accept-Language'] && language) { |
|||
request.headers['Accept-Language'] = language; |
|||
} |
|||
|
|||
if (!request.headers.__tenant && tenant && tenant.tenantId) { |
|||
request.headers.__tenant = tenant.tenantId; |
|||
} |
|||
|
|||
return request; |
|||
}, |
|||
error => console.error(error), |
|||
); |
|||
|
|||
api.interceptors.response.use( |
|||
response => response, |
|||
error => { |
|||
store.dispatch(LoadingActions.clear()); |
|||
const errorRes = error.response; |
|||
if (errorRes) { |
|||
if (errorRes.headers._abperrorformat && errorRes.status === 401) { |
|||
store.dispatch(PersistentStorageActions.setToken({})); |
|||
} |
|||
|
|||
showError({ error: errorRes.data.error || {}, status: errorRes.status }); |
|||
} else { |
|||
Toast.show({ |
|||
text: 'An unexpected error has occurred', |
|||
buttonText: 'x', |
|||
duration: 10000, |
|||
type: 'danger', |
|||
textStyle: { textAlign: 'center' }, |
|||
}); |
|||
} |
|||
|
|||
return Promise.reject(error); |
|||
}, |
|||
); |
|||
} |
|||
|
|||
function showError({ error = {}, status }) { |
|||
let message = ''; |
|||
let title = i18n.t('AbpAccount::DefaultErrorMessage'); |
|||
|
|||
if (typeof error === 'string') { |
|||
message = error; |
|||
} else if (error.details) { |
|||
message = error.details; |
|||
title = error.message; |
|||
} else if (error.message) { |
|||
message = error.message; |
|||
} else { |
|||
switch (status) { |
|||
case 401: |
|||
title = i18n.t('AbpAccount::DefaultErrorMessage401'); |
|||
message = i18n.t('AbpAccount::DefaultErrorMessage401Detail'); |
|||
break; |
|||
case 403: |
|||
title = i18n.t('AbpAccount::DefaultErrorMessage403'); |
|||
message = i18n.t('AbpAccount::DefaultErrorMessage403Detail'); |
|||
break; |
|||
case 404: |
|||
title = i18n.t('AbpAccount::DefaultErrorMessage404'); |
|||
message = i18n.t('AbpAccount::DefaultErrorMessage404Detail'); |
|||
break; |
|||
case 500: |
|||
title = i18n.t('AbpAccount::500Message'); |
|||
message = i18n.t('AbpAccount::InternalServerErrorMessage'); |
|||
break; |
|||
default: |
|||
break; |
|||
} |
|||
} |
|||
|
|||
Toast.show({ |
|||
text: `${title}\n${message}`, |
|||
buttonText: 'x', |
|||
duration: 10000, |
|||
type: 'danger', |
|||
textStyle: { textAlign: 'center' }, |
|||
}); |
|||
} |
|||
@ -1,22 +0,0 @@ |
|||
import { createStackNavigator } from '@react-navigation/stack'; |
|||
import React from 'react'; |
|||
import { LocalizationContext } from '../contexts/LocalizationContext'; |
|||
import LoginScreen from '../screens/Login/LoginScreen'; |
|||
|
|||
const Stack = createStackNavigator(); |
|||
|
|||
export default function AuthStackNavigator() { |
|||
const { t } = React.useContext(LocalizationContext); |
|||
|
|||
return ( |
|||
<Stack.Navigator initialRouteName="Login"> |
|||
<Stack.Screen |
|||
name="Login" |
|||
component={LoginScreen} |
|||
options={() => ({ |
|||
title: t('AbpAccount::Login'), |
|||
})} |
|||
/> |
|||
</Stack.Navigator> |
|||
); |
|||
} |
|||
@ -1,20 +0,0 @@ |
|||
import React from 'react'; |
|||
import { createDrawerNavigator } from '@react-navigation/drawer'; |
|||
import HomeStackNavigator from './HomeNavigator'; |
|||
import SettingsStackNavigator from './SettingsNavigator'; |
|||
import UsersStackNavigator from './UsersNavigator'; |
|||
import TenantsStackNavigator from './TenantsNavigator'; |
|||
import DrawerContent from '../components/DrawerContent/DrawerContent'; |
|||
|
|||
const Drawer = createDrawerNavigator(); |
|||
|
|||
export default function DrawerNavigator() { |
|||
return ( |
|||
<Drawer.Navigator initialRouteName="Home" drawerContent={DrawerContent}> |
|||
<Drawer.Screen name="Home" component={HomeStackNavigator} /> |
|||
<Drawer.Screen name="Users" component={UsersStackNavigator} /> |
|||
<Drawer.Screen name="Tenants" component={TenantsStackNavigator} /> |
|||
<Drawer.Screen name="Settings" component={SettingsStackNavigator} /> |
|||
</Drawer.Navigator> |
|||
); |
|||
} |
|||
@ -1,24 +0,0 @@ |
|||
import React from 'react'; |
|||
import { createStackNavigator } from '@react-navigation/stack'; |
|||
import HomeScreen from '../screens/Home/HomeScreen'; |
|||
import MenuIcon from '../components/MenuIcon/MenuIcon'; |
|||
import { LocalizationContext } from '../contexts/LocalizationContext'; |
|||
|
|||
const Stack = createStackNavigator(); |
|||
|
|||
export default function HomeStackNavigator() { |
|||
const { t } = React.useContext(LocalizationContext); |
|||
|
|||
return ( |
|||
<Stack.Navigator initialRouteName="Home"> |
|||
<Stack.Screen |
|||
name="Home" |
|||
component={HomeScreen} |
|||
options={({ navigation }) => ({ |
|||
headerLeft: () => <MenuIcon onPress={() => navigation.openDrawer()} />, |
|||
title: t('::Menu:Home'), |
|||
})} |
|||
/> |
|||
</Stack.Navigator> |
|||
); |
|||
} |
|||
@ -1,41 +0,0 @@ |
|||
import React from 'react'; |
|||
import { createStackNavigator } from '@react-navigation/stack'; |
|||
import i18n from 'i18n-js'; |
|||
import SettingsScreen from '../screens/Settings/SettingsScreen'; |
|||
import ChangePasswordScreen from '../screens/ChangePassword/ChangePasswordScreen'; |
|||
import ManageProfileScreen from '../screens/ManageProfile/ManageProfileScreen'; |
|||
import MenuIcon from '../components/MenuIcon/MenuIcon'; |
|||
import { LocalizationContext } from '../contexts/LocalizationContext'; |
|||
|
|||
const Stack = createStackNavigator(); |
|||
|
|||
export default function SettingsStackNavigator() { |
|||
const { t } = React.useContext(LocalizationContext); |
|||
|
|||
return ( |
|||
<Stack.Navigator initialRouteName="Settings"> |
|||
<Stack.Screen |
|||
name="Settings" |
|||
component={SettingsScreen} |
|||
options={({ navigation }) => ({ |
|||
headerLeft: () => <MenuIcon onPress={() => navigation.openDrawer()} />, |
|||
title: t('AbpSettingManagement::Settings'), |
|||
})} |
|||
/> |
|||
<Stack.Screen |
|||
name="ChangePassword" |
|||
component={ChangePasswordScreen} |
|||
options={{ |
|||
title: i18n.t('AbpUi::ChangePassword'), |
|||
}} |
|||
/> |
|||
<Stack.Screen |
|||
name="ManageProfile" |
|||
component={ManageProfileScreen} |
|||
options={{ |
|||
title: i18n.t('AbpAccount::ManageYourProfile'), |
|||
}} |
|||
/> |
|||
</Stack.Navigator> |
|||
); |
|||
} |
|||
@ -1,34 +0,0 @@ |
|||
import React from 'react'; |
|||
import { createStackNavigator } from '@react-navigation/stack'; |
|||
import TenantsScreen from '../screens/Tenants/TenantsScreen'; |
|||
import CreateUpdateTenantScreen from '../screens/CreateUpdateTenant/CreateUpdateTenantScreen'; |
|||
import MenuIcon from '../components/MenuIcon/MenuIcon'; |
|||
import { LocalizationContext } from '../contexts/LocalizationContext'; |
|||
|
|||
const Stack = createStackNavigator(); |
|||
|
|||
export default function TenantsStackNavigator() { |
|||
const { t } = React.useContext(LocalizationContext); |
|||
|
|||
return ( |
|||
<Stack.Navigator initialRouteName="Tenants"> |
|||
<Stack.Screen |
|||
name="Tenants" |
|||
component={TenantsScreen} |
|||
options={({ navigation }) => ({ |
|||
headerLeft: () => <MenuIcon onPress={() => navigation.openDrawer()} />, |
|||
title: t('AbpTenantManagement::Tenants'), |
|||
})} |
|||
/> |
|||
<Stack.Screen |
|||
name="CreateUpdateTenant" |
|||
component={CreateUpdateTenantScreen} |
|||
options={({ route }) => ({ |
|||
title: t( |
|||
route.params?.tenantId ? 'AbpTenantManagement::Edit' : 'AbpTenantManagement::NewTenant', |
|||
), |
|||
})} |
|||
/> |
|||
</Stack.Navigator> |
|||
); |
|||
} |
|||
@ -1,32 +0,0 @@ |
|||
import React from 'react'; |
|||
import { createStackNavigator } from '@react-navigation/stack'; |
|||
import UsersScreen from '../screens/Users/UsersScreen'; |
|||
import CreateUpdateUserScreen from '../screens/CreateUpdateUser/CreateUpdateUserScreen'; |
|||
import MenuIcon from '../components/MenuIcon/MenuIcon'; |
|||
import { LocalizationContext } from '../contexts/LocalizationContext'; |
|||
|
|||
const Stack = createStackNavigator(); |
|||
|
|||
export default function UsersStackNavigator() { |
|||
const { t } = React.useContext(LocalizationContext); |
|||
|
|||
return ( |
|||
<Stack.Navigator initialRouteName="Users"> |
|||
<Stack.Screen |
|||
name="Users" |
|||
component={UsersScreen} |
|||
options={({ navigation }) => ({ |
|||
headerLeft: () => <MenuIcon onPress={() => navigation.openDrawer()} />, |
|||
title: t('AbpIdentity::Users'), |
|||
})} |
|||
/> |
|||
<Stack.Screen |
|||
name="CreateUpdateUser" |
|||
component={CreateUpdateUserScreen} |
|||
options={({ route }) => ({ |
|||
title: t(route.params?.userId ? 'AbpIdentity::Edit' : 'AbpIdentity::NewUser'), |
|||
})} |
|||
/> |
|||
</Stack.Navigator> |
|||
); |
|||
} |
|||
@ -1,99 +0,0 @@ |
|||
import { Formik } from 'formik'; |
|||
import i18n from 'i18n-js'; |
|||
import { Container, Content, Form, Input, InputGroup, Item, Icon, Label } from 'native-base'; |
|||
import PropTypes from 'prop-types'; |
|||
import React, { useRef, useState } from 'react'; |
|||
import * as Yup from 'yup'; |
|||
import FormButtons from '../../components/FormButtons/FormButtons'; |
|||
import ValidationMessage from '../../components/ValidationMessage/ValidationMessage'; |
|||
|
|||
const ValidationSchema = Yup.object().shape({ |
|||
currentPassword: Yup.string().required('AbpAccount::ThisFieldIsRequired.'), |
|||
newPassword: Yup.string().required('AbpAccount::ThisFieldIsRequired.'), |
|||
}); |
|||
|
|||
function ChangePasswordForm({ submit, cancel }) { |
|||
const [showCurrentPassword, setShowCurrentPassword] = useState(false); |
|||
const [showNewPassword, setShowNewPassword] = useState(false); |
|||
|
|||
const currentPasswordRef = useRef(); |
|||
const newPasswordRef = useRef(); |
|||
|
|||
const onSubmit = values => { |
|||
submit({ |
|||
...values, |
|||
newPasswordConfirm: values.newPassword, |
|||
}); |
|||
}; |
|||
|
|||
return ( |
|||
<Formik |
|||
enableReinitialize |
|||
validationSchema={ValidationSchema} |
|||
initialValues={{ |
|||
currentPassword: '', |
|||
newPassword: '', |
|||
}} |
|||
onSubmit={values => onSubmit(values)}> |
|||
{({ handleChange, handleBlur, handleSubmit, values, errors, isValid }) => ( |
|||
<> |
|||
<Container> |
|||
<Content px20> |
|||
<Form> |
|||
<InputGroup abpInputGroup> |
|||
<Label abpLabel>{i18n.t('AbpIdentity::DisplayName:CurrentPassword')}</Label> |
|||
<Item abpInput> |
|||
<Input |
|||
ref={currentPasswordRef} |
|||
onSubmitEditing={() => newPasswordRef.current._root.focus()} |
|||
returnKeyType="next" |
|||
onChangeText={handleChange('currentPassword')} |
|||
onBlur={handleBlur('currentPassword')} |
|||
value={values.currentPassword} |
|||
textContentType="password" |
|||
secureTextEntry={!showCurrentPassword} |
|||
/> |
|||
<Icon |
|||
active |
|||
name={showCurrentPassword ? 'eye-off' : 'eye'} |
|||
onPress={() => setShowCurrentPassword(!showCurrentPassword)} |
|||
/> |
|||
</Item> |
|||
</InputGroup> |
|||
<ValidationMessage>{errors.currentPassword}</ValidationMessage> |
|||
<InputGroup abpInputGroup> |
|||
<Label abpLabel>{i18n.t('AbpIdentity::DisplayName:NewPassword')}</Label> |
|||
<Item abpInput> |
|||
<Input |
|||
ref={newPasswordRef} |
|||
returnKeyType="done" |
|||
onSubmitEditing={handleSubmit} |
|||
onChangeText={handleChange('newPassword')} |
|||
onBlur={handleBlur('newPassword')} |
|||
value={values.newPassword} |
|||
textContentType="newPassword" |
|||
secureTextEntry={!showNewPassword} |
|||
/> |
|||
<Icon |
|||
name={showNewPassword ? 'eye-off' : 'eye'} |
|||
onPress={() => setShowNewPassword(!showNewPassword)} |
|||
/> |
|||
</Item> |
|||
</InputGroup> |
|||
<ValidationMessage>{errors.newPassword}</ValidationMessage> |
|||
</Form> |
|||
</Content> |
|||
</Container> |
|||
<FormButtons submit={handleSubmit} cancel={cancel} isSubmitDisabled={!isValid} /> |
|||
</> |
|||
)} |
|||
</Formik> |
|||
); |
|||
} |
|||
|
|||
ChangePasswordForm.propTypes = { |
|||
submit: PropTypes.func.isRequired, |
|||
cancel: PropTypes.func.isRequired, |
|||
}; |
|||
|
|||
export default ChangePasswordForm; |
|||
@ -1,33 +0,0 @@ |
|||
import React from 'react'; |
|||
import PropTypes from 'prop-types'; |
|||
import { changePassword } from '../../api/IdentityAPI'; |
|||
import LoadingActions from '../../store/actions/LoadingActions'; |
|||
import { connectToRedux } from '../../utils/ReduxConnect'; |
|||
import ChangePasswordForm from './ChangePasswordForm'; |
|||
|
|||
function ChangePasswordScreen({ navigation, startLoading, stopLoading }) { |
|||
const submit = data => { |
|||
startLoading({ key: 'changePassword' }); |
|||
|
|||
changePassword(data) |
|||
.then(() => { |
|||
navigation.goBack(); |
|||
}) |
|||
.finally(() => stopLoading({ key: 'changePassword' })); |
|||
}; |
|||
|
|||
return <ChangePasswordForm submit={submit} cancel={() => navigation.goBack()} />; |
|||
} |
|||
|
|||
ChangePasswordScreen.propTypes = { |
|||
startLoading: PropTypes.func.isRequired, |
|||
stopLoading: PropTypes.func.isRequired, |
|||
}; |
|||
|
|||
export default connectToRedux({ |
|||
component: ChangePasswordScreen, |
|||
dispatchProps: { |
|||
startLoading: LoadingActions.start, |
|||
stopLoading: LoadingActions.stop, |
|||
}, |
|||
}); |
|||
@ -1,84 +0,0 @@ |
|||
import { Formik } from 'formik'; |
|||
import i18n from 'i18n-js'; |
|||
import { Container, Content, Input, InputGroup, Label } from 'native-base'; |
|||
import PropTypes from 'prop-types'; |
|||
import React, { useRef } from 'react'; |
|||
import { StyleSheet } from 'react-native'; |
|||
import * as Yup from 'yup'; |
|||
import FormButtons from '../../components/FormButtons/FormButtons'; |
|||
import ValidationMessage from '../../components/ValidationMessage/ValidationMessage'; |
|||
import { usePermission } from '../../hooks/UsePermission'; |
|||
|
|||
const validations = { |
|||
name: Yup.string().required('AbpAccount::ThisFieldIsRequired.'), |
|||
}; |
|||
|
|||
function CreateUpdateTenantForm({ editingTenant = {}, submit, remove }) { |
|||
const tenantNameRef = useRef(); |
|||
|
|||
const hasRemovePermission = usePermission('AbpTenantManagement.Tenants.Delete'); |
|||
|
|||
const onSubmit = values => { |
|||
submit({ |
|||
...editingTenant, |
|||
...values, |
|||
}); |
|||
}; |
|||
|
|||
return ( |
|||
<Formik |
|||
enableReinitialize |
|||
validationSchema={Yup.object().shape({ |
|||
...validations, |
|||
})} |
|||
initialValues={{ |
|||
lockoutEnabled: false, |
|||
twoFactorEnabled: false, |
|||
...editingTenant, |
|||
}} |
|||
onSubmit={values => onSubmit(values)}> |
|||
{({ handleChange, handleBlur, handleSubmit, values, errors, isValid }) => ( |
|||
<> |
|||
<Container style={styles.container}> |
|||
<Content px20> |
|||
<InputGroup abpInputGroup> |
|||
<Label abpLabel>{i18n.t('AbpTenantManagement::TenantName')}</Label> |
|||
<Input |
|||
abpInput |
|||
ref={tenantNameRef} |
|||
onChangeText={handleChange('name')} |
|||
onBlur={handleBlur('name')} |
|||
value={values.name} |
|||
/> |
|||
</InputGroup> |
|||
<ValidationMessage>{errors.name}</ValidationMessage> |
|||
</Content> |
|||
</Container> |
|||
<FormButtons |
|||
submit={handleSubmit} |
|||
remove={remove} |
|||
removeMessage={i18n.t('AbpTenantManagement::TenantDeletionConfirmationMessage', { |
|||
0: editingTenant.name, |
|||
})} |
|||
isSubmitDisabled={!isValid} |
|||
isShowRemove={!!editingTenant.id && hasRemovePermission} |
|||
/> |
|||
</> |
|||
)} |
|||
</Formik> |
|||
); |
|||
} |
|||
|
|||
CreateUpdateTenantForm.propTypes = { |
|||
editingTenant: PropTypes.object, |
|||
submit: PropTypes.func.isRequired, |
|||
remove: PropTypes.func.isRequired, |
|||
}; |
|||
|
|||
const styles = StyleSheet.create({ |
|||
container: { |
|||
marginBottom: 50, |
|||
}, |
|||
}); |
|||
|
|||
export default CreateUpdateTenantForm; |
|||
@ -1,77 +0,0 @@ |
|||
import PropTypes from 'prop-types'; |
|||
import React, { useState, useCallback } from 'react'; |
|||
import { useFocusEffect } from '@react-navigation/native'; |
|||
import { |
|||
createTenant, |
|||
getTenantById, |
|||
removeTenant, |
|||
updateTenant, |
|||
} from '../../api/TenantManagementAPI'; |
|||
import LoadingActions from '../../store/actions/LoadingActions'; |
|||
import { createLoadingSelector } from '../../store/selectors/LoadingSelectors'; |
|||
import { connectToRedux } from '../../utils/ReduxConnect'; |
|||
import CreateUpdateTenantForm from './CreateUpdateTenantForm'; |
|||
|
|||
function CreateUpdateTenantScreen({ navigation, route, startLoading, stopLoading }) { |
|||
const [tenant, setTenant] = useState(); |
|||
const tenantId = route.params?.tenantId; |
|||
|
|||
const remove = () => { |
|||
startLoading({ key: 'removeTenant' }); |
|||
removeTenant(tenantId) |
|||
.then(() => navigation.goBack()) |
|||
.finally(() => stopLoading({ key: 'removeTenant' })); |
|||
}; |
|||
|
|||
useFocusEffect( |
|||
useCallback(() => { |
|||
if (tenantId) { |
|||
getTenantById(tenantId).then((data = {}) => setTenant(data)); |
|||
} |
|||
}, []), |
|||
); |
|||
|
|||
const submit = data => { |
|||
startLoading({ key: 'saveTenant' }); |
|||
let request; |
|||
if (data.id) { |
|||
request = updateTenant(data, tenantId); |
|||
} else { |
|||
request = createTenant(data); |
|||
} |
|||
|
|||
request |
|||
.then(() => { |
|||
navigation.goBack(); |
|||
}) |
|||
.finally(() => stopLoading({ key: 'saveTenant' })); |
|||
}; |
|||
|
|||
const renderForm = () => ( |
|||
<CreateUpdateTenantForm editingTenant={tenant} submit={submit} remove={remove} /> |
|||
); |
|||
|
|||
if (tenantId && tenant) { |
|||
return renderForm(); |
|||
} |
|||
|
|||
if (!tenantId) { |
|||
return renderForm(); |
|||
} |
|||
|
|||
return null; |
|||
} |
|||
|
|||
CreateUpdateTenantScreen.propTypes = { |
|||
startLoading: PropTypes.func.isRequired, |
|||
stopLoading: PropTypes.func.isRequired, |
|||
}; |
|||
|
|||
export default connectToRedux({ |
|||
component: CreateUpdateTenantScreen, |
|||
stateProps: state => ({ loading: createLoadingSelector()(state) }), |
|||
dispatchProps: { |
|||
startLoading: LoadingActions.start, |
|||
stopLoading: LoadingActions.stop, |
|||
}, |
|||
}); |
|||
@ -1,242 +0,0 @@ |
|||
import { Formik } from 'formik'; |
|||
import i18n from 'i18n-js'; |
|||
import { |
|||
Body, |
|||
Button, |
|||
CheckBox, |
|||
Container, |
|||
Content, |
|||
Input, |
|||
InputGroup, |
|||
Item, |
|||
Icon, |
|||
Label, |
|||
ListItem, |
|||
Segment, |
|||
Text, |
|||
} from 'native-base'; |
|||
import PropTypes from 'prop-types'; |
|||
import React, { useRef, useState } from 'react'; |
|||
import { StyleSheet, TouchableOpacity, View } from 'react-native'; |
|||
import * as Yup from 'yup'; |
|||
import FormButtons from '../../components/FormButtons/FormButtons'; |
|||
import ValidationMessage from '../../components/ValidationMessage/ValidationMessage'; |
|||
import { usePermission } from '../../hooks/UsePermission'; |
|||
import UserRoles from './UserRoles'; |
|||
|
|||
const validations = { |
|||
userName: Yup.string().required('AbpAccount::ThisFieldIsRequired.'), |
|||
email: Yup.string() |
|||
.email('AbpAccount::ThisFieldIsNotAValidEmailAddress.') |
|||
.required('AbpAccount::ThisFieldIsRequired.'), |
|||
}; |
|||
|
|||
let roleNames = []; |
|||
|
|||
function onChangeRoles(roles) { |
|||
roleNames = roles; |
|||
} |
|||
|
|||
function CreateUpdateUserForm({ editingUser = {}, submit, remove }) { |
|||
const [selectedTab, setSelectedTab] = useState(0); |
|||
const [showPassword, setShowPassword] = useState(false); |
|||
|
|||
const usernameRef = useRef(); |
|||
const nameRef = useRef(); |
|||
const surnameRef = useRef(); |
|||
const emailRef = useRef(); |
|||
const phoneNumberRef = useRef(); |
|||
const passwordRef = useRef(); |
|||
|
|||
const hasRemovePermission = usePermission('AbpIdentity.Users.Delete'); |
|||
|
|||
const onSubmit = values => { |
|||
submit({ |
|||
...editingUser, |
|||
...values, |
|||
roleNames, |
|||
}); |
|||
}; |
|||
|
|||
const passwordValidation = Yup.lazy(() => { |
|||
if (editingUser.id) { |
|||
return Yup.string(); |
|||
} |
|||
return Yup.string().required('AbpAccount::ThisFieldIsRequired.'); |
|||
}); |
|||
|
|||
return ( |
|||
<Formik |
|||
enableReinitialize |
|||
validationSchema={Yup.object().shape({ |
|||
...validations, |
|||
password: passwordValidation, |
|||
})} |
|||
initialValues={{ |
|||
lockoutEnabled: false, |
|||
twoFactorEnabled: false, |
|||
...editingUser, |
|||
}} |
|||
onSubmit={values => onSubmit(values)}> |
|||
{({ handleChange, handleBlur, handleSubmit, values, errors, isValid, setFieldValue }) => ( |
|||
<> |
|||
<Segment> |
|||
<Button first primary={selectedTab === 0} onPress={() => setSelectedTab(0)}> |
|||
<Text dark light={selectedTab === 0}> |
|||
{i18n.t('AbpIdentity::UserInformations')} |
|||
</Text> |
|||
</Button> |
|||
<Button last primary={selectedTab === 1} onPress={() => setSelectedTab(1)}> |
|||
<Text dark light={selectedTab === 1}> |
|||
{i18n.t('AbpIdentity::Roles')} |
|||
</Text> |
|||
</Button> |
|||
</Segment> |
|||
<Container style={styles.container}> |
|||
<Content px20> |
|||
<View style={{ display: selectedTab === 0 ? 'flex' : 'none' }}> |
|||
<View style={{ alignItems: 'center', margin: 10, zIndex: 1 }} /> |
|||
<InputGroup abpInputGroup> |
|||
<Label abpLabel>{i18n.t('AbpIdentity::UserName')}*</Label> |
|||
<Input |
|||
abpInput |
|||
ref={usernameRef} |
|||
onSubmitEditing={() => nameRef.current._root.focus()} |
|||
returnKeyType="next" |
|||
onChangeText={handleChange('userName')} |
|||
onBlur={handleBlur('userName')} |
|||
value={values.userName} |
|||
/> |
|||
</InputGroup> |
|||
<ValidationMessage>{errors.userName}</ValidationMessage> |
|||
<InputGroup abpInputGroup> |
|||
<Label abpLabel>{i18n.t('AbpIdentity::DisplayName:Name')}</Label> |
|||
<Input |
|||
abpInput |
|||
ref={nameRef} |
|||
onSubmitEditing={() => surnameRef.current._root.focus()} |
|||
returnKeyType="next" |
|||
onChangeText={handleChange('name')} |
|||
onBlur={handleBlur('name')} |
|||
value={values.name} |
|||
/> |
|||
</InputGroup> |
|||
<InputGroup abpInputGroup> |
|||
<Label abpLabel>{i18n.t('AbpIdentity::DisplayName:Surname')}</Label> |
|||
<Input |
|||
abpInput |
|||
ref={surnameRef} |
|||
onSubmitEditing={() => emailRef.current._root.focus()} |
|||
returnKeyType="next" |
|||
onChangeText={handleChange('surname')} |
|||
onBlur={handleBlur('surname')} |
|||
value={values.surname} |
|||
/> |
|||
</InputGroup> |
|||
<InputGroup abpInputGroup> |
|||
<Label abpLabel>{i18n.t('AbpIdentity::EmailAddress')}*</Label> |
|||
<Input |
|||
abpInput |
|||
ref={emailRef} |
|||
onSubmitEditing={() => phoneNumberRef.current._root.focus()} |
|||
returnKeyType="next" |
|||
onChangeText={handleChange('email')} |
|||
onBlur={handleBlur('email')} |
|||
value={values.email} |
|||
/> |
|||
</InputGroup> |
|||
<ValidationMessage>{errors.email}</ValidationMessage> |
|||
<InputGroup abpInputGroup> |
|||
<Label abpLabel>{i18n.t('AbpIdentity::PhoneNumber')}</Label> |
|||
<Input |
|||
abpInput |
|||
ref={phoneNumberRef} |
|||
returnKeyType={!editingUser.id ? 'next' : 'default'} |
|||
onChangeText={handleChange('phoneNumber')} |
|||
onBlur={handleBlur('phoneNumber')} |
|||
value={values.phoneNumber} |
|||
/> |
|||
</InputGroup> |
|||
{!editingUser.id ? ( |
|||
<> |
|||
<InputGroup abpInputGroup> |
|||
<Label abpLabel>{i18n.t('AbpIdentity::Password')}*</Label> |
|||
<Item abpInput> |
|||
<Input |
|||
ref={passwordRef} |
|||
secureTextEntry={!showPassword} |
|||
onChangeText={handleChange('password')} |
|||
onBlur={handleBlur('password')} |
|||
value={values.password} |
|||
/> |
|||
<Icon |
|||
name={showPassword ? 'eye-off' : 'eye'} |
|||
onPress={() => setShowPassword(!showPassword)} |
|||
/> |
|||
</Item> |
|||
</InputGroup> |
|||
<ValidationMessage>{errors.password}</ValidationMessage> |
|||
</> |
|||
) : null} |
|||
<ListItem> |
|||
<CheckBox |
|||
checked={values.lockoutEnabled} |
|||
onPress={() => setFieldValue('lockoutEnabled', !values.lockoutEnabled)} |
|||
/> |
|||
<Body> |
|||
<TouchableOpacity |
|||
onPress={() => setFieldValue('lockoutEnabled', !values.lockoutEnabled)}> |
|||
<Text>{i18n.t('AbpIdentity::DisplayName:LockoutEnabled')}</Text> |
|||
</TouchableOpacity> |
|||
</Body> |
|||
</ListItem> |
|||
<ListItem> |
|||
<CheckBox |
|||
checked={values.twoFactorEnabled} |
|||
onPress={() => setFieldValue('twoFactorEnabled', !values.twoFactorEnabled)} |
|||
/> |
|||
<Body> |
|||
<TouchableOpacity |
|||
onPress={() => setFieldValue('twoFactorEnabled', !values.twoFactorEnabled)}> |
|||
<Text>{i18n.t('AbpIdentity::DisplayName:TwoFactorEnabled')}</Text> |
|||
</TouchableOpacity> |
|||
</Body> |
|||
</ListItem> |
|||
</View> |
|||
<View |
|||
style={{ |
|||
display: selectedTab === 1 ? 'flex' : 'none', |
|||
flex: 1, |
|||
}}> |
|||
<UserRoles {...{ editingUser, onChangeRoles }} /> |
|||
</View> |
|||
</Content> |
|||
</Container> |
|||
<FormButtons |
|||
submit={handleSubmit} |
|||
remove={remove} |
|||
removeMessage={i18n.t('AbpIdentity::UserDeletionConfirmationMessage', { |
|||
0: editingUser.userName, |
|||
})} |
|||
isSubmitDisabled={!isValid} |
|||
isShowRemove={!!editingUser.id && hasRemovePermission} |
|||
/> |
|||
</> |
|||
)} |
|||
</Formik> |
|||
); |
|||
} |
|||
|
|||
CreateUpdateUserForm.propTypes = { |
|||
editingUser: PropTypes.object, |
|||
submit: PropTypes.func.isRequired, |
|||
remove: PropTypes.func.isRequired, |
|||
}; |
|||
|
|||
const styles = StyleSheet.create({ |
|||
container: { |
|||
marginBottom: 50, |
|||
}, |
|||
}); |
|||
|
|||
export default CreateUpdateUserForm; |
|||
@ -1,69 +0,0 @@ |
|||
import PropTypes from 'prop-types'; |
|||
import React, { useEffect, useState } from 'react'; |
|||
import { createUser, getUserById, removeUser, updateUser } from '../../api/IdentityAPI'; |
|||
import LoadingActions from '../../store/actions/LoadingActions'; |
|||
import { createLoadingSelector } from '../../store/selectors/LoadingSelectors'; |
|||
import { connectToRedux } from '../../utils/ReduxConnect'; |
|||
import CreateUpdateUserForm from './CreateUpdateUserForm'; |
|||
|
|||
function CreateUpdateUserScreen({ navigation, route, startLoading, stopLoading }) { |
|||
const [user, setUser] = useState(); |
|||
const userId = route.params?.userId; |
|||
|
|||
const remove = () => { |
|||
startLoading({ key: 'remove user' }); |
|||
removeUser(userId) |
|||
.then(() => navigation.goBack()) |
|||
.finally(() => stopLoading({ key: 'remove user' })); |
|||
}; |
|||
|
|||
useEffect(() => { |
|||
if (userId) { |
|||
getUserById(userId).then((data = {}) => setUser(data)); |
|||
} |
|||
}, []); |
|||
|
|||
const submit = data => { |
|||
startLoading({ key: 'saveUser' }); |
|||
let request; |
|||
if (data.id) { |
|||
request = updateUser(data, userId); |
|||
} else { |
|||
request = createUser(data); |
|||
} |
|||
|
|||
request |
|||
.then(() => { |
|||
navigation.goBack(); |
|||
}) |
|||
.finally(() => stopLoading({ key: 'saveUser' })); |
|||
}; |
|||
|
|||
const renderForm = () => ( |
|||
<CreateUpdateUserForm editingUser={user} submit={submit} remove={remove} /> |
|||
); |
|||
|
|||
if (userId && user) { |
|||
return renderForm(); |
|||
} |
|||
|
|||
if (!userId) { |
|||
return renderForm(); |
|||
} |
|||
|
|||
return null; |
|||
} |
|||
|
|||
CreateUpdateUserScreen.propTypes = { |
|||
startLoading: PropTypes.func.isRequired, |
|||
stopLoading: PropTypes.func.isRequired, |
|||
}; |
|||
|
|||
export default connectToRedux({ |
|||
component: CreateUpdateUserScreen, |
|||
stateProps: state => ({ loading: createLoadingSelector()(state) }), |
|||
dispatchProps: { |
|||
startLoading: LoadingActions.start, |
|||
stopLoading: LoadingActions.stop, |
|||
}, |
|||
}); |
|||
@ -1,60 +0,0 @@ |
|||
import React, { useEffect, useState } from 'react'; |
|||
import PropTypes from 'prop-types'; |
|||
import { List, ListItem, CheckBox, Body, Text } from 'native-base'; |
|||
import { TouchableOpacity } from 'react-native'; |
|||
import { getRoles, getUserRoles } from '../../api/IdentityAPI'; |
|||
|
|||
function UserRoles({ editingUser = {}, onChangeRoles }) { |
|||
const [roles, setRoles] = useState([]); |
|||
|
|||
const onPress = index => { |
|||
setRoles( |
|||
roles.map((role, i) => ({ |
|||
...role, |
|||
isSelected: index === i ? !role.isSelected : role.isSelected, |
|||
})), |
|||
); |
|||
}; |
|||
|
|||
useEffect(() => { |
|||
const requests = [getRoles()]; |
|||
if (editingUser.id) requests.push(getUserRoles(editingUser.id)); |
|||
|
|||
Promise.all(requests).then(([allRoles = [], userRoles = []]) => { |
|||
setRoles( |
|||
allRoles.map(role => ({ |
|||
...role, |
|||
isSelected: editingUser.id |
|||
? !!userRoles?.find(userRole => userRole?.id === role?.id) |
|||
: role.isDefault, |
|||
})), |
|||
); |
|||
}); |
|||
}, []); |
|||
|
|||
useEffect(() => { |
|||
onChangeRoles(roles.filter(role => role.isSelected).map(role => role.name)); |
|||
}, [roles]); |
|||
|
|||
return ( |
|||
<List> |
|||
{roles.map((role, index) => ( |
|||
<ListItem key={role.id}> |
|||
<CheckBox checked={role.isSelected} onPress={() => onPress(index)} /> |
|||
<Body> |
|||
<TouchableOpacity onPress={() => onPress(index)}> |
|||
<Text>{role.name}</Text> |
|||
</TouchableOpacity> |
|||
</Body> |
|||
</ListItem> |
|||
))} |
|||
</List> |
|||
); |
|||
} |
|||
|
|||
UserRoles.propTypes = { |
|||
editingUser: PropTypes.objectOf(PropTypes.any).isRequired, |
|||
onChangeRoles: PropTypes.func.isRequired, |
|||
}; |
|||
|
|||
export default UserRoles; |
|||
@ -1,34 +0,0 @@ |
|||
import i18n from 'i18n-js'; |
|||
import { Text } from 'native-base'; |
|||
import React from 'react'; |
|||
import { StyleSheet, View } from 'react-native'; |
|||
|
|||
function HomeScreen() { |
|||
return ( |
|||
<View style={styles.container}> |
|||
<Text style={styles.title}> {i18n.t('::Welcome')}</Text> |
|||
<Text style={styles.centeredText}> {i18n.t('::LongWelcomeMessage')}</Text> |
|||
</View> |
|||
); |
|||
} |
|||
|
|||
const styles = StyleSheet.create({ |
|||
container: { |
|||
flex: 1, |
|||
alignItems: 'center', |
|||
justifyContent: 'center', |
|||
paddingHorizontal: 20, |
|||
backgroundColor: '#fff', |
|||
}, |
|||
centeredText: { |
|||
textAlign: 'center', |
|||
}, |
|||
title: { |
|||
marginBottom: 30, |
|||
fontSize: 32, |
|||
fontWeight: '300', |
|||
textAlign: 'center', |
|||
}, |
|||
}); |
|||
|
|||
export default HomeScreen; |
|||
@ -1,128 +0,0 @@ |
|||
import { Formik } from 'formik'; |
|||
import i18n from 'i18n-js'; |
|||
import { |
|||
Button, |
|||
Container, |
|||
Content, |
|||
Form, |
|||
Input, |
|||
InputGroup, |
|||
Item, |
|||
Label, |
|||
Text, |
|||
Icon, |
|||
} from 'native-base'; |
|||
import PropTypes from 'prop-types'; |
|||
import React, { useState } from 'react'; |
|||
import { View } from 'react-native'; |
|||
import * as Yup from 'yup'; |
|||
import { login } from '../../api/AccountAPI'; |
|||
import TenantBox from '../../components/TenantBox/TenantBox'; |
|||
import ValidationMessage from '../../components/ValidationMessage/ValidationMessage'; |
|||
import AppActions from '../../store/actions/AppActions'; |
|||
import LoadingActions from '../../store/actions/LoadingActions'; |
|||
import PersistentStorageActions from '../../store/actions/PersistentStorageActions'; |
|||
import { connectToRedux } from '../../utils/ReduxConnect'; |
|||
|
|||
const ValidationSchema = Yup.object().shape({ |
|||
username: Yup.string().required('AbpAccount::ThisFieldIsRequired.'), |
|||
password: Yup.string().required('AbpAccount::ThisFieldIsRequired.'), |
|||
}); |
|||
|
|||
function LoginScreen({ startLoading, stopLoading, setToken, fetchAppConfig }) { |
|||
const [showTenantSelection, setShowTenantSelection] = useState(false); |
|||
const [showPassword, setShowPassword] = useState(false); |
|||
|
|||
const toggleTenantSelection = () => { |
|||
setShowTenantSelection(!showTenantSelection); |
|||
}; |
|||
|
|||
const submit = ({ username, password }) => { |
|||
startLoading({ key: 'login' }); |
|||
login({ username, password }) |
|||
.then(data => |
|||
setToken({ |
|||
...data, |
|||
expire_time: new Date().valueOf() + data.expires_in, |
|||
scope: undefined, |
|||
}), |
|||
) |
|||
.then( |
|||
() => |
|||
new Promise(resolve => |
|||
fetchAppConfig({ showLoading: false, callback: () => resolve(true) }), |
|||
), |
|||
) |
|||
.finally(() => stopLoading({ key: 'login' })); |
|||
}; |
|||
|
|||
return ( |
|||
<Container> |
|||
<TenantBox |
|||
showTenantSelection={showTenantSelection} |
|||
toggleTenantSelection={toggleTenantSelection} |
|||
/> |
|||
{!showTenantSelection ? ( |
|||
<Content px20 style={{ flex: 1 }}> |
|||
<Formik |
|||
validationSchema={ValidationSchema} |
|||
initialValues={{ username: '', password: '' }} |
|||
onSubmit={submit}> |
|||
{({ handleChange, handleBlur, handleSubmit, values, errors }) => ( |
|||
<Form> |
|||
<InputGroup abpInputGroup> |
|||
<Label abpLabel>{i18n.t('AbpAccount::UserNameOrEmailAddress')}</Label> |
|||
<Input |
|||
abpInput |
|||
onChangeText={handleChange('username')} |
|||
onBlur={handleBlur('username')} |
|||
value={values.username} |
|||
/> |
|||
</InputGroup> |
|||
<ValidationMessage>{errors.username}</ValidationMessage> |
|||
<InputGroup abpInputGroup> |
|||
<Label abpLabel>{i18n.t('AbpAccount::Password')}</Label> |
|||
<Item abpInput> |
|||
<Input |
|||
secureTextEntry={!showPassword} |
|||
onChangeText={handleChange('password')} |
|||
onBlur={handleBlur('password')} |
|||
value={values.password} |
|||
/> |
|||
<Icon |
|||
name={showPassword ? 'eye-off' : 'eye'} |
|||
onPress={() => setShowPassword(!showPassword)} |
|||
/> |
|||
</Item> |
|||
</InputGroup> |
|||
<ValidationMessage>{errors.password}</ValidationMessage> |
|||
<View style={{ marginTop: 20, alignItems: 'center' }}> |
|||
<Button abpButton onPress={handleSubmit}> |
|||
<Text>{i18n.t('AbpAccount::Login')}</Text> |
|||
</Button> |
|||
</View> |
|||
</Form> |
|||
)} |
|||
</Formik> |
|||
</Content> |
|||
) : null} |
|||
</Container> |
|||
); |
|||
} |
|||
|
|||
LoginScreen.propTypes = { |
|||
startLoading: PropTypes.func.isRequired, |
|||
stopLoading: PropTypes.func.isRequired, |
|||
setToken: PropTypes.func.isRequired, |
|||
fetchAppConfig: PropTypes.func.isRequired, |
|||
}; |
|||
|
|||
export default connectToRedux({ |
|||
component: LoginScreen, |
|||
dispatchProps: { |
|||
startLoading: LoadingActions.start, |
|||
stopLoading: LoadingActions.stop, |
|||
fetchAppConfig: AppActions.fetchAppConfigAsync, |
|||
setToken: PersistentStorageActions.setToken, |
|||
}, |
|||
}); |
|||
@ -1,122 +0,0 @@ |
|||
import { Formik } from 'formik'; |
|||
import i18n from 'i18n-js'; |
|||
import { Container, Content, Form, Input, InputGroup, Label } from 'native-base'; |
|||
import PropTypes from 'prop-types'; |
|||
import React, { useRef } from 'react'; |
|||
import * as Yup from 'yup'; |
|||
import FormButtons from '../../components/FormButtons/FormButtons'; |
|||
import ValidationMessage from '../../components/ValidationMessage/ValidationMessage'; |
|||
|
|||
const ValidationSchema = Yup.object().shape({ |
|||
userName: Yup.string().required('AbpAccount::ThisFieldIsRequired.'), |
|||
email: Yup.string() |
|||
.required('AbpAccount::ThisFieldIsRequired.') |
|||
.email('AbpAccount::ThisFieldIsNotAValidEmailAddress.'), |
|||
}); |
|||
|
|||
function ManageProfileForm({ editingUser = {}, submit, cancel }) { |
|||
const usernameRef = useRef(); |
|||
const nameRef = useRef(); |
|||
const surnameRef = useRef(); |
|||
const emailRef = useRef(); |
|||
const phoneNumberRef = useRef(); |
|||
|
|||
const onSubmit = values => { |
|||
submit({ |
|||
...editingUser, |
|||
...values, |
|||
}); |
|||
}; |
|||
|
|||
return ( |
|||
<Formik |
|||
enableReinitialize |
|||
validationSchema={ValidationSchema} |
|||
initialValues={{ |
|||
...editingUser, |
|||
}} |
|||
onSubmit={values => onSubmit(values)}> |
|||
{({ handleChange, handleBlur, handleSubmit, values, errors, isValid }) => ( |
|||
<> |
|||
<Container> |
|||
<Content px20> |
|||
<Form> |
|||
<InputGroup abpInputGroup> |
|||
<Label abpLabel>{i18n.t('AbpIdentity::UserName')}*</Label> |
|||
<Input |
|||
ref={usernameRef} |
|||
onSubmitEditing={() => nameRef.current._root.focus()} |
|||
returnKeyType="next" |
|||
onChangeText={handleChange('userName')} |
|||
onBlur={handleBlur('userName')} |
|||
value={values.userName} |
|||
abpInput |
|||
/> |
|||
</InputGroup> |
|||
<ValidationMessage>{errors.userName}</ValidationMessage> |
|||
<InputGroup abpInputGroup> |
|||
<Label abpLabel>{i18n.t('AbpIdentity::DisplayName:Name')}</Label> |
|||
<Input |
|||
abpInput |
|||
ref={nameRef} |
|||
onSubmitEditing={() => surnameRef.current._root.focus()} |
|||
returnKeyType="next" |
|||
onChangeText={handleChange('name')} |
|||
onBlur={handleBlur('name')} |
|||
value={values.name} |
|||
/> |
|||
</InputGroup> |
|||
<InputGroup abpInputGroup> |
|||
<Label abpLabel>{i18n.t('AbpIdentity::DisplayName:Surname')}</Label> |
|||
<Input |
|||
abpInput |
|||
ref={surnameRef} |
|||
onSubmitEditing={() => phoneNumberRef.current._root.focus()} |
|||
returnKeyType="next" |
|||
onChangeText={handleChange('surname')} |
|||
onBlur={handleBlur('surname')} |
|||
value={values.surname} |
|||
/> |
|||
</InputGroup> |
|||
<InputGroup abpInputGroup> |
|||
<Label abpLabel>{i18n.t('AbpIdentity::PhoneNumber')}</Label> |
|||
<Input |
|||
abpInput |
|||
ref={phoneNumberRef} |
|||
onSubmitEditing={() => emailRef.current._root.focus()} |
|||
returnKeyType="next" |
|||
onChangeText={handleChange('phoneNumber')} |
|||
onBlur={handleBlur('phoneNumber')} |
|||
value={values.phoneNumber} |
|||
/> |
|||
</InputGroup> |
|||
<InputGroup abpInputGroup> |
|||
<Label abpLabel>{i18n.t('AbpIdentity::EmailAddress')}*</Label> |
|||
<Input |
|||
abpInput |
|||
ref={emailRef} |
|||
returnKeyType="done" |
|||
onSubmitEditing={handleSubmit} |
|||
onChangeText={handleChange('email')} |
|||
onBlur={handleBlur('email')} |
|||
value={values.email} |
|||
/> |
|||
</InputGroup> |
|||
<ValidationMessage>{errors.email}</ValidationMessage> |
|||
</Form> |
|||
</Content> |
|||
</Container> |
|||
<FormButtons submit={handleSubmit} cancel={cancel} isSubmitDisabled={!isValid} /> |
|||
</> |
|||
)} |
|||
</Formik> |
|||
); |
|||
} |
|||
|
|||
ManageProfileForm.propTypes = { |
|||
editingUser: PropTypes.object.isRequired, |
|||
submit: PropTypes.func.isRequired, |
|||
cancel: PropTypes.func.isRequired, |
|||
}; |
|||
|
|||
export default ManageProfileForm; |
|||
@ -1,50 +0,0 @@ |
|||
import React, { useState, useEffect } from 'react'; |
|||
import PropTypes from 'prop-types'; |
|||
import { updateProfileDetail, getProfileDetail } from '../../api/IdentityAPI'; |
|||
import ManageProfileForm from './ManageProfileForm'; |
|||
import LoadingActions from '../../store/actions/LoadingActions'; |
|||
import { connectToRedux } from '../../utils/ReduxConnect'; |
|||
|
|||
function ManageProfileScreen({ navigation, startLoading, stopLoading }) { |
|||
const [user, setUser] = useState(); |
|||
|
|||
useEffect(() => { |
|||
if (!user) { |
|||
startLoading({ key: 'manageProfile' }); |
|||
getProfileDetail() |
|||
.then((data = {}) => setUser(data)) |
|||
.finally(() => stopLoading({ key: 'manageProfile' })); |
|||
} |
|||
}); |
|||
|
|||
const submit = data => { |
|||
startLoading({ key: 'manageProfile' }); |
|||
|
|||
updateProfileDetail(data) |
|||
.then(() => { |
|||
navigation.goBack(); |
|||
}) |
|||
.finally(() => stopLoading({ key: 'manageProfile' })); |
|||
}; |
|||
|
|||
return ( |
|||
<> |
|||
{user ? ( |
|||
<ManageProfileForm editingUser={user} submit={submit} cancel={() => navigation.goBack()} /> |
|||
) : null} |
|||
</> |
|||
); |
|||
} |
|||
|
|||
ManageProfileScreen.propTypes = { |
|||
startLoading: PropTypes.func.isRequired, |
|||
stopLoading: PropTypes.func.isRequired, |
|||
}; |
|||
|
|||
export default connectToRedux({ |
|||
component: ManageProfileScreen, |
|||
dispatchProps: { |
|||
startLoading: LoadingActions.start, |
|||
stopLoading: LoadingActions.stop, |
|||
}, |
|||
}); |
|||
@ -1,145 +0,0 @@ |
|||
import i18n from 'i18n-js'; |
|||
import { |
|||
Body, |
|||
Button, |
|||
Icon, |
|||
Label, |
|||
Left, |
|||
List, |
|||
ListItem, |
|||
Picker, |
|||
Right, |
|||
Text, |
|||
Thumbnail, |
|||
} from 'native-base'; |
|||
import PropTypes from 'prop-types'; |
|||
import React, { useCallback, useState } from 'react'; |
|||
import { View } from 'react-native'; |
|||
import { useFocusEffect } from '@react-navigation/native'; |
|||
import { getProfileDetail } from '../../api/IdentityAPI'; |
|||
import AppActions from '../../store/actions/AppActions'; |
|||
import { |
|||
createLanguageSelector, |
|||
createLanguagesSelector, |
|||
} from '../../store/selectors/AppSelectors'; |
|||
import { connectToRedux } from '../../utils/ReduxConnect'; |
|||
import { createTenantSelector } from '../../store/selectors/PersistentStorageSelectors'; |
|||
|
|||
function SettingsScreen({ |
|||
navigation, |
|||
language, |
|||
languages, |
|||
setLanguageAsync, |
|||
logoutAsync, |
|||
tenant = {}, |
|||
}) { |
|||
const [user, setUser] = useState({}); |
|||
|
|||
const fetchUser = () => { |
|||
getProfileDetail().then(data => { |
|||
setUser(data || {}); |
|||
}); |
|||
}; |
|||
|
|||
useFocusEffect( |
|||
useCallback(() => { |
|||
fetchUser(); |
|||
}, []), |
|||
); |
|||
|
|||
return ( |
|||
<View> |
|||
<List> |
|||
<ListItem itemDivider /> |
|||
<ListItem |
|||
noIndent |
|||
style={{ backgroundColor: '#fff' }} |
|||
onPress={() => navigation.navigate('ManageProfile')}> |
|||
<Left style={{ alignItems: 'center' }}> |
|||
<Thumbnail source={require('../../../assets/avatar.png')} /> |
|||
<Body> |
|||
<Text> |
|||
{tenant.name ? `${tenant.name} / ` : ''} |
|||
{user.userName ? `${user.userName}` : ''} |
|||
</Text> |
|||
<Text note>{user.email}</Text> |
|||
</Body> |
|||
</Left> |
|||
|
|||
<Right> |
|||
<Icon active name="arrow-forward" /> |
|||
</Right> |
|||
</ListItem> |
|||
<ListItem itemDivider /> |
|||
<ListItem |
|||
noIndent |
|||
icon |
|||
style={{ backgroundColor: '#fff' }} |
|||
onPress={() => navigation.navigate('ChangePassword')}> |
|||
<Body> |
|||
<Text>{i18n.t('AbpUi::ChangePassword')}</Text> |
|||
</Body> |
|||
<Right> |
|||
<Icon active name="arrow-forward" /> |
|||
</Right> |
|||
</ListItem> |
|||
<ListItem itemDivider /> |
|||
<ListItem itemDivider> |
|||
<Label abpLabel style={{ marginBottom: 0 }}> |
|||
{i18n.t('AbpUi::Language')} |
|||
</Label> |
|||
</ListItem> |
|||
<ListItem noIndent icon style={{ backgroundColor: '#fff' }}> |
|||
<Body> |
|||
<Picker |
|||
mode="dropdown" |
|||
iosHeader={i18n.t('AbpUi::Language')} |
|||
iosIcon={<Icon active name="arrow-down" />} |
|||
onValueChange={value => setLanguageAsync(value)} |
|||
selectedValue={language.cultureName} |
|||
textStyle={{ paddingLeft: 0 }}> |
|||
{languages.map(lang => ( |
|||
<Picker.Item |
|||
label={lang.displayName} |
|||
value={lang.cultureName} |
|||
key={lang.cultureName} |
|||
/> |
|||
))} |
|||
</Picker> |
|||
</Body> |
|||
</ListItem> |
|||
<ListItem itemDivider /> |
|||
<Button |
|||
abpButton |
|||
danger |
|||
style={{ borderRadius: 0 }} |
|||
onPress={() => { |
|||
logoutAsync(); |
|||
}}> |
|||
<Text>{i18n.t('AbpAccount::Logout')}</Text> |
|||
</Button> |
|||
</List> |
|||
</View> |
|||
); |
|||
} |
|||
|
|||
SettingsScreen.propTypes = { |
|||
setLanguageAsync: PropTypes.func.isRequired, |
|||
logoutAsync: PropTypes.func.isRequired, |
|||
language: PropTypes.object.isRequired, |
|||
languages: PropTypes.array.isRequired, |
|||
tenant: PropTypes.object.isRequired, |
|||
}; |
|||
|
|||
export default connectToRedux({ |
|||
component: SettingsScreen, |
|||
stateProps: state => ({ |
|||
languages: createLanguagesSelector()(state), |
|||
language: createLanguageSelector()(state), |
|||
tenant: createTenantSelector()(state), |
|||
}), |
|||
dispatchProps: { |
|||
setLanguageAsync: AppActions.setLanguageAsync, |
|||
logoutAsync: AppActions.logoutAsync, |
|||
}, |
|||
}); |
|||
@ -1,59 +0,0 @@ |
|||
import React from 'react'; |
|||
import i18n from 'i18n-js'; |
|||
import { ListItem, Text, Icon, Left, Body, Fab } from 'native-base'; |
|||
import { StyleSheet } from 'react-native'; |
|||
import { getTenants } from '../../api/TenantManagementAPI'; |
|||
import { activeTheme } from '../../theme/variables'; |
|||
import DataList from '../../components/DataList/DataList'; |
|||
import { withPermission } from '../../hocs/PermissionHOC'; |
|||
|
|||
const CreateTenantButtonWithPermission = withPermission(Fab, 'AbpTenantManagement.Tenants.Create'); |
|||
|
|||
function TenantsScreen({ navigation }) { |
|||
return ( |
|||
<> |
|||
<DataList |
|||
navigation={navigation} |
|||
fetchFn={getTenants} |
|||
render={tenant => ( |
|||
<ListItem avatar onPress={() => navigateToCreateUpdateTenantScreen(navigation, tenant)}> |
|||
<Left style={styles.listItem}> |
|||
<Body> |
|||
<Text>{tenant.name}</Text> |
|||
</Body> |
|||
</Left> |
|||
</ListItem> |
|||
)} |
|||
/> |
|||
|
|||
<CreateTenantButtonWithPermission |
|||
style={{ backgroundColor: activeTheme.brandPrimary }} |
|||
position="bottomRight" |
|||
onPress={() => navigation.navigate('CreateUpdateTenant')}> |
|||
<Icon name="add" /> |
|||
</CreateTenantButtonWithPermission> |
|||
</> |
|||
); |
|||
} |
|||
|
|||
const navigateToCreateUpdateTenantScreen = (navigation, tenant = {}) => { |
|||
navigation.navigate('CreateUpdateTenant', { |
|||
tenantId: tenant.id, |
|||
}); |
|||
}; |
|||
|
|||
const styles = StyleSheet.create({ |
|||
listItem: { |
|||
alignItems: 'center', |
|||
marginVertical: 3, |
|||
marginLeft: -15, |
|||
paddingTop: 5, |
|||
paddingBottom: 5, |
|||
paddingLeft: 15, |
|||
backgroundColor: '#f9f9f9', |
|||
width: '110%', |
|||
minHeight: 50, |
|||
}, |
|||
}); |
|||
|
|||
export default TenantsScreen; |
|||
@ -1,61 +0,0 @@ |
|||
import React from 'react'; |
|||
import { ListItem, Text, Icon, Left, Thumbnail, Body, Fab } from 'native-base'; |
|||
import { StyleSheet } from 'react-native'; |
|||
import { getUsers } from '../../api/IdentityAPI'; |
|||
import { activeTheme } from '../../theme/variables'; |
|||
import DataList from '../../components/DataList/DataList'; |
|||
import { withPermission } from '../../hocs/PermissionHOC'; |
|||
|
|||
const CreateUserButtonWithPermission = withPermission(Fab, 'AbpIdentity.Users.Create'); |
|||
|
|||
function UsersScreen({ navigation }) { |
|||
return ( |
|||
<> |
|||
<DataList |
|||
navigation={navigation} |
|||
fetchFn={getUsers} |
|||
render={user => ( |
|||
<ListItem avatar onPress={() => navigateToCreateUpdateUserScreen(navigation, user)}> |
|||
<Left style={styles.listItem}> |
|||
<Thumbnail source={require('../../../assets/avatar.png')} /> |
|||
<Body> |
|||
<Text>{user.userName}</Text> |
|||
<Text note>{user.email}</Text> |
|||
</Body> |
|||
</Left> |
|||
</ListItem> |
|||
)} |
|||
/> |
|||
|
|||
<CreateUserButtonWithPermission |
|||
containerStyle={{}} |
|||
style={{ backgroundColor: activeTheme.brandPrimary }} |
|||
position="bottomRight" |
|||
onPress={() => navigation.navigate('CreateUpdateUser')}> |
|||
<Icon name="add" /> |
|||
</CreateUserButtonWithPermission> |
|||
</> |
|||
); |
|||
} |
|||
|
|||
const navigateToCreateUpdateUserScreen = (navigation, user = {}) => { |
|||
navigation.navigate('CreateUpdateUser', { |
|||
userId: user.id, |
|||
}); |
|||
}; |
|||
|
|||
const styles = StyleSheet.create({ |
|||
container: { flex: 1 }, |
|||
listItem: { |
|||
alignItems: 'center', |
|||
marginVertical: 3, |
|||
marginLeft: -15, |
|||
paddingTop: 5, |
|||
paddingBottom: 5, |
|||
paddingLeft: 15, |
|||
backgroundColor: '#f9f9f9', |
|||
width: '110%', |
|||
}, |
|||
}); |
|||
|
|||
export default UsersScreen; |
|||
@ -1,19 +0,0 @@ |
|||
import { createAction } from '@reduxjs/toolkit'; |
|||
|
|||
const fetchAppConfigAsync = createAction( |
|||
'app/fetchAppConfigAsync', |
|||
({ callback = () => {}, showLoading = true } = {}) => ({ payload: { callback, showLoading } }), |
|||
); |
|||
|
|||
const setAppConfig = createAction('app/setAppConfig'); |
|||
|
|||
const setLanguageAsync = createAction('app/setLanguageAsync'); |
|||
|
|||
const logoutAsync = createAction('app/logoutAsync'); |
|||
|
|||
export default { |
|||
fetchAppConfigAsync, |
|||
setAppConfig, |
|||
setLanguageAsync, |
|||
logoutAsync, |
|||
}; |
|||
@ -1,13 +0,0 @@ |
|||
import { createAction } from '@reduxjs/toolkit'; |
|||
|
|||
const start = createAction('loading/start'); |
|||
|
|||
const stop = createAction('loading/stop'); |
|||
|
|||
const clear = createAction('loading/clear'); |
|||
|
|||
export default { |
|||
start, |
|||
stop, |
|||
clear, |
|||
}; |
|||
@ -1,13 +0,0 @@ |
|||
import { createAction } from '@reduxjs/toolkit'; |
|||
|
|||
const setToken = createAction('persistentStorage/setToken'); |
|||
|
|||
const setLanguage = createAction('persistentStorage/setLanguage'); |
|||
|
|||
const setTenant = createAction('persistentStorage/setTenant'); |
|||
|
|||
export default { |
|||
setToken, |
|||
setLanguage, |
|||
setTenant, |
|||
}; |
|||
@ -1,25 +0,0 @@ |
|||
import { configureStore } from '@reduxjs/toolkit'; |
|||
import createSagaMiddleware from 'redux-saga'; |
|||
import { persistStore, persistReducer } from 'redux-persist'; |
|||
import { AsyncStorage } from 'react-native'; |
|||
import { rootSaga } from './sagas'; |
|||
import rootReducer from './reducers'; |
|||
|
|||
const sagaMiddleware = createSagaMiddleware(); |
|||
|
|||
const persistConfig = { |
|||
key: 'root', |
|||
storage: AsyncStorage, |
|||
whitelist: ['persistentStorage'], |
|||
}; |
|||
|
|||
const persistedReducer = persistReducer(persistConfig, rootReducer); |
|||
|
|||
export const store = configureStore({ |
|||
reducer: persistedReducer, |
|||
middleware: [sagaMiddleware], |
|||
}); |
|||
|
|||
export const persistor = persistStore(store); |
|||
|
|||
sagaMiddleware.run(rootSaga); |
|||
@ -1,12 +0,0 @@ |
|||
import { createReducer } from '@reduxjs/toolkit'; |
|||
import AppActions from '../actions/AppActions'; |
|||
|
|||
const initialState = { |
|||
appConfig: {}, |
|||
}; |
|||
|
|||
export default createReducer(initialState, builder => |
|||
builder.addCase(AppActions.setAppConfig, (state, action) => { |
|||
state.appConfig = action.payload; |
|||
}), |
|||
); |
|||
@ -1,23 +0,0 @@ |
|||
import { createReducer } from '@reduxjs/toolkit'; |
|||
import LoadingActions from '../actions/LoadingActions'; |
|||
|
|||
const initialState = { activeLoadings: {}, loading: false }; |
|||
|
|||
export default createReducer(initialState, builder => |
|||
builder |
|||
.addCase(LoadingActions.start, (state, action) => { |
|||
const { key, opacity } = action.payload; |
|||
return { |
|||
...state, |
|||
actives: { ...state.activeLoadings, [key]: action }, |
|||
loading: true, |
|||
opacity, |
|||
}; |
|||
}) |
|||
.addCase(LoadingActions.stop, (state, action) => { |
|||
delete state.activeLoadings[action.payload.key]; |
|||
|
|||
state.loading = !!Object.keys(state.activeLoadings).length; |
|||
}) |
|||
.addCase(LoadingActions.clear, () => ({})), |
|||
); |
|||
@ -1,17 +0,0 @@ |
|||
import { createReducer } from '@reduxjs/toolkit'; |
|||
import PersistentStorageActions from '../actions/PersistentStorageActions'; |
|||
|
|||
const initialState = { token: {}, language: null, tenant: {} }; |
|||
|
|||
export default createReducer(initialState, builder => |
|||
builder |
|||
.addCase(PersistentStorageActions.setToken, (state, action) => { |
|||
state.token = action.payload; |
|||
}) |
|||
.addCase(PersistentStorageActions.setLanguage, (state, action) => { |
|||
state.language = action.payload; |
|||
}) |
|||
.addCase(PersistentStorageActions.setTenant, (state, action) => { |
|||
state.tenant = action.payload; |
|||
}), |
|||
); |
|||
@ -1,12 +0,0 @@ |
|||
import { combineReducers } from '@reduxjs/toolkit'; |
|||
import LoadingReducer from './LoadingReducer'; |
|||
import AppReducer from './AppReducer'; |
|||
import PersistentStorageReducer from './PersistentStorageReducer'; |
|||
|
|||
const rootReducer = combineReducers({ |
|||
loading: LoadingReducer, |
|||
app: AppReducer, |
|||
persistentStorage: PersistentStorageReducer, |
|||
}); |
|||
|
|||
export default rootReducer; |
|||
@ -1,34 +0,0 @@ |
|||
import { call, put, takeLatest, all } from 'redux-saga/effects'; |
|||
import { getApplicationConfiguration } from '../../api/ApplicationConfigurationAPI'; |
|||
import { Logout } from '../../api/AccountAPI'; |
|||
import AppActions from '../actions/AppActions'; |
|||
import LoadingActions from '../actions/LoadingActions'; |
|||
import PersistentStorageActions from '../actions/PersistentStorageActions'; |
|||
|
|||
function* fetchAppConfig({ payload: { showLoading, callback } }) { |
|||
if (showLoading) yield put(LoadingActions.start({ key: 'appConfig', opacity: 1 })); |
|||
const data = yield call(getApplicationConfiguration); |
|||
yield put(AppActions.setAppConfig(data)); |
|||
yield put(PersistentStorageActions.setLanguage(data.localization.currentCulture.cultureName)); |
|||
if (showLoading) yield put(LoadingActions.stop({ key: 'appConfig' })); |
|||
callback(); |
|||
} |
|||
|
|||
function* setLanguage(action) { |
|||
yield put(PersistentStorageActions.setLanguage(action.payload)); |
|||
yield put(AppActions.fetchAppConfigAsync()); |
|||
} |
|||
|
|||
function* logout() { |
|||
yield call(Logout); |
|||
yield put(PersistentStorageActions.setToken({})); |
|||
yield put(AppActions.fetchAppConfigAsync()); |
|||
} |
|||
|
|||
export default function*() { |
|||
yield all([ |
|||
takeLatest(AppActions.setLanguageAsync.type, setLanguage), |
|||
takeLatest(AppActions.fetchAppConfigAsync.type, fetchAppConfig), |
|||
takeLatest(AppActions.logoutAsync.type, logout), |
|||
]); |
|||
} |
|||
@ -1,6 +0,0 @@ |
|||
import { all, fork } from 'redux-saga/effects'; |
|||
import AppSaga from './AppSaga'; |
|||
|
|||
export function* rootSaga() { |
|||
yield all([fork(AppSaga)]); |
|||
} |
|||
@ -1,19 +0,0 @@ |
|||
import { createSelector } from 'reselect'; |
|||
|
|||
const getApp = state => state.app; |
|||
|
|||
export function createAppConfigSelector() { |
|||
return createSelector([getApp], state => state.appConfig); |
|||
} |
|||
|
|||
export function createLanguageSelector() { |
|||
return createSelector([getApp], state => state?.appConfig?.localization?.currentCulture); |
|||
} |
|||
|
|||
export function createLanguagesSelector() { |
|||
return createSelector([getApp], state => state?.appConfig?.localization?.languages); |
|||
} |
|||
|
|||
export function createGrantedPolicySelector(key) { |
|||
return createSelector([getApp], state => state?.appConfig?.auth?.grantedPolicies[key] ?? false); |
|||
} |
|||
@ -1,11 +0,0 @@ |
|||
import { createSelector } from 'reselect'; |
|||
|
|||
const getLoading = state => state.loading; |
|||
|
|||
export function createLoadingSelector() { |
|||
return createSelector([getLoading], loading => loading.loading); |
|||
} |
|||
|
|||
export function createOpacitySelector() { |
|||
return createSelector([getLoading], loading => loading.opacity); |
|||
} |
|||
@ -1,11 +0,0 @@ |
|||
import { createSelector } from 'reselect'; |
|||
|
|||
const getPersistentStorage = state => state.persistentStorage; |
|||
|
|||
export function createTokenSelector() { |
|||
return createSelector([getPersistentStorage], persistentStorage => persistentStorage.token); |
|||
} |
|||
|
|||
export function createTenantSelector() { |
|||
return createSelector([getPersistentStorage], persistentStorage => persistentStorage.tenant); |
|||
} |
|||
@ -1,39 +0,0 @@ |
|||
// @flow
|
|||
|
|||
import variable from '../variables/Platform'; |
|||
import { PLATFORM } from '../variables/CommonColor'; |
|||
|
|||
export default (variables /* : * */ = variable) => { |
|||
const badgeTheme = { |
|||
'.primary': { |
|||
backgroundColor: variables.buttonPrimaryBg, |
|||
}, |
|||
'.warning': { |
|||
backgroundColor: variables.buttonWarningBg, |
|||
}, |
|||
'.info': { |
|||
backgroundColor: variables.buttonInfoBg, |
|||
}, |
|||
'.success': { |
|||
backgroundColor: variables.buttonSuccessBg, |
|||
}, |
|||
'.danger': { |
|||
backgroundColor: variables.buttonDangerBg, |
|||
}, |
|||
'NativeBase.Text': { |
|||
color: variables.badgeColor, |
|||
fontSize: variables.fontSizeBase, |
|||
lineHeight: variables.lineHeight - 1, |
|||
textAlign: 'center', |
|||
paddingHorizontal: 3, |
|||
}, |
|||
backgroundColor: variables.badgeBg, |
|||
padding: variables.badgePadding, |
|||
paddingHorizontal: 6, |
|||
alignSelf: 'flex-start', |
|||
justifyContent: variables.platform === PLATFORM.IOS ? 'center' : undefined, |
|||
borderRadius: 13.5, |
|||
height: 27, |
|||
}; |
|||
return badgeTheme; |
|||
}; |
|||
@ -1,11 +0,0 @@ |
|||
// @flow
|
|||
|
|||
export default () => { |
|||
const bodyTheme = { |
|||
flex: 1, |
|||
alignItems: 'center', |
|||
alignSelf: 'center', |
|||
}; |
|||
|
|||
return bodyTheme; |
|||
}; |
|||
@ -1,384 +0,0 @@ |
|||
// @flow
|
|||
|
|||
import variable from '../variables/Platform'; |
|||
import { PLATFORM } from '../variables/CommonColor'; |
|||
|
|||
export default (variables /* : * */ = variable) => { |
|||
const { platformStyle } = variables; |
|||
const { platform } = variables; |
|||
const darkCommon = { |
|||
'NativeBase.Text': { |
|||
color: variables.brandDark, |
|||
}, |
|||
'NativeBase.Icon': { |
|||
color: variables.brandDark, |
|||
}, |
|||
'NativeBase.IconNB': { |
|||
color: variables.brandDark, |
|||
}, |
|||
}; |
|||
const lightCommon = { |
|||
'NativeBase.Text': { |
|||
color: variables.brandLight, |
|||
}, |
|||
'NativeBase.Icon': { |
|||
color: variables.brandLight, |
|||
}, |
|||
'NativeBase.IconNB': { |
|||
color: variables.brandLight, |
|||
}, |
|||
}; |
|||
const primaryCommon = { |
|||
'NativeBase.Text': { |
|||
color: variables.buttonPrimaryBg, |
|||
}, |
|||
'NativeBase.Icon': { |
|||
color: variables.buttonPrimaryBg, |
|||
}, |
|||
'NativeBase.IconNB': { |
|||
color: variables.buttonPrimaryBg, |
|||
}, |
|||
}; |
|||
const successCommon = { |
|||
'NativeBase.Text': { |
|||
color: variables.buttonSuccessBg, |
|||
}, |
|||
'NativeBase.Icon': { |
|||
color: variables.buttonSuccessBg, |
|||
}, |
|||
'NativeBase.IconNB': { |
|||
color: variables.buttonSuccessBg, |
|||
}, |
|||
}; |
|||
const infoCommon = { |
|||
'NativeBase.Text': { |
|||
color: variables.buttonInfoBg, |
|||
}, |
|||
'NativeBase.Icon': { |
|||
color: variables.buttonInfoBg, |
|||
}, |
|||
'NativeBase.IconNB': { |
|||
color: variables.buttonInfoBg, |
|||
}, |
|||
}; |
|||
const warningCommon = { |
|||
'NativeBase.Text': { |
|||
color: variables.buttonWarningBg, |
|||
}, |
|||
'NativeBase.Icon': { |
|||
color: variables.buttonWarningBg, |
|||
}, |
|||
'NativeBase.IconNB': { |
|||
color: variables.buttonWarningBg, |
|||
}, |
|||
}; |
|||
const dangerCommon = { |
|||
'NativeBase.Text': { |
|||
color: variables.buttonDangerBg, |
|||
}, |
|||
'NativeBase.Icon': { |
|||
color: variables.buttonDangerBg, |
|||
}, |
|||
'NativeBase.IconNB': { |
|||
color: variables.buttonDangerBg, |
|||
}, |
|||
}; |
|||
const buttonTheme = { |
|||
'.disabled': { |
|||
'.transparent': { |
|||
backgroundColor: 'transparent', |
|||
'NativeBase.Text': { |
|||
color: variables.buttonDisabledBg, |
|||
}, |
|||
'NativeBase.Icon': { |
|||
color: variables.buttonDisabledBg, |
|||
}, |
|||
'NativeBase.IconNB': { |
|||
color: variables.buttonDisabledBg, |
|||
}, |
|||
}, |
|||
'NativeBase.Icon': { |
|||
color: variables.brandLight, |
|||
}, |
|||
'NativeBase.IconNB': { |
|||
color: variables.brandLight, |
|||
}, |
|||
backgroundColor: variables.buttonDisabledBg, |
|||
}, |
|||
'.bordered': { |
|||
'.dark': { |
|||
...darkCommon, |
|||
backgroundColor: 'transparent', |
|||
borderColor: variables.brandDark, |
|||
borderWidth: variables.borderWidth * 2, |
|||
}, |
|||
'.light': { |
|||
...lightCommon, |
|||
backgroundColor: 'transparent', |
|||
borderColor: variables.brandLight, |
|||
borderWidth: variables.borderWidth * 2, |
|||
}, |
|||
'.primary': { |
|||
...primaryCommon, |
|||
backgroundColor: 'transparent', |
|||
borderColor: variables.buttonPrimaryBg, |
|||
borderWidth: variables.borderWidth * 2, |
|||
}, |
|||
'.success': { |
|||
...successCommon, |
|||
backgroundColor: 'transparent', |
|||
borderColor: variables.buttonSuccessBg, |
|||
borderWidth: variables.borderWidth * 2, |
|||
}, |
|||
'.info': { |
|||
...infoCommon, |
|||
backgroundColor: 'transparent', |
|||
borderColor: variables.buttonInfoBg, |
|||
borderWidth: variables.borderWidth * 2, |
|||
}, |
|||
'.warning': { |
|||
...warningCommon, |
|||
backgroundColor: 'transparent', |
|||
borderColor: variables.buttonWarningBg, |
|||
borderWidth: variables.borderWidth * 2, |
|||
}, |
|||
'.danger': { |
|||
...dangerCommon, |
|||
backgroundColor: 'transparent', |
|||
borderColor: variables.buttonDangerBg, |
|||
borderWidth: variables.borderWidth * 2, |
|||
}, |
|||
'.disabled': { |
|||
backgroundColor: 'transparent', |
|||
borderColor: variables.buttonDisabledBg, |
|||
borderWidth: variables.borderWidth * 2, |
|||
'NativeBase.Text': { |
|||
color: variables.buttonDisabledBg, |
|||
}, |
|||
}, |
|||
...primaryCommon, |
|||
borderWidth: variables.borderWidth * 2, |
|||
elevation: null, |
|||
shadowColor: null, |
|||
shadowOffset: null, |
|||
shadowOpacity: null, |
|||
shadowRadius: null, |
|||
backgroundColor: 'transparent', |
|||
}, |
|||
|
|||
'.dark': { |
|||
'.bordered': { |
|||
...darkCommon, |
|||
}, |
|||
backgroundColor: variables.brandDark, |
|||
}, |
|||
'.light': { |
|||
'.transparent': { |
|||
...lightCommon, |
|||
backgroundColor: 'transparent', |
|||
}, |
|||
'.bordered': { |
|||
...lightCommon, |
|||
}, |
|||
...darkCommon, |
|||
backgroundColor: variables.brandLight, |
|||
}, |
|||
|
|||
'.primary': { |
|||
'.bordered': { |
|||
...primaryCommon, |
|||
}, |
|||
backgroundColor: variables.buttonPrimaryBg, |
|||
}, |
|||
|
|||
'.success': { |
|||
'.bordered': { |
|||
...successCommon, |
|||
}, |
|||
backgroundColor: variables.buttonSuccessBg, |
|||
}, |
|||
|
|||
'.info': { |
|||
'.bordered': { |
|||
...infoCommon, |
|||
}, |
|||
backgroundColor: variables.buttonInfoBg, |
|||
}, |
|||
|
|||
'.warning': { |
|||
'.bordered': { |
|||
...warningCommon, |
|||
}, |
|||
backgroundColor: variables.buttonWarningBg, |
|||
}, |
|||
|
|||
'.danger': { |
|||
'.bordered': { |
|||
...dangerCommon, |
|||
}, |
|||
backgroundColor: variables.buttonDangerBg, |
|||
}, |
|||
|
|||
'.block': { |
|||
justifyContent: 'center', |
|||
alignSelf: 'stretch', |
|||
}, |
|||
|
|||
'.full': { |
|||
justifyContent: 'center', |
|||
alignSelf: 'stretch', |
|||
borderRadius: 0, |
|||
}, |
|||
|
|||
'.rounded': { |
|||
borderRadius: variables.borderRadiusLarge, |
|||
}, |
|||
|
|||
'.transparent': { |
|||
backgroundColor: 'transparent', |
|||
elevation: 0, |
|||
shadowColor: null, |
|||
shadowOffset: null, |
|||
shadowRadius: null, |
|||
shadowOpacity: null, |
|||
...primaryCommon, |
|||
'.dark': { |
|||
...darkCommon, |
|||
}, |
|||
'.danger': { |
|||
...dangerCommon, |
|||
}, |
|||
'.warning': { |
|||
...warningCommon, |
|||
}, |
|||
'.info': { |
|||
...infoCommon, |
|||
}, |
|||
'.primary': { |
|||
...primaryCommon, |
|||
}, |
|||
'.success': { |
|||
...successCommon, |
|||
}, |
|||
'.light': { |
|||
...lightCommon, |
|||
}, |
|||
'.disabled': { |
|||
backgroundColor: 'transparent', |
|||
borderColor: variables.buttonDisabledBg, |
|||
borderWidth: variables.borderWidth * 2, |
|||
'NativeBase.Text': { |
|||
color: variables.buttonDisabledBg, |
|||
}, |
|||
'NativeBase.Icon': { |
|||
color: variables.buttonDisabledBg, |
|||
}, |
|||
'NativeBase.IconNB': { |
|||
color: variables.buttonDisabledBg, |
|||
}, |
|||
}, |
|||
}, |
|||
|
|||
'.small': { |
|||
height: 30, |
|||
'NativeBase.Text': { |
|||
fontSize: 14, |
|||
}, |
|||
'NativeBase.Icon': { |
|||
fontSize: 20, |
|||
paddingTop: 0, |
|||
}, |
|||
'NativeBase.IconNB': { |
|||
fontSize: 20, |
|||
paddingTop: 0, |
|||
}, |
|||
}, |
|||
|
|||
'.large': { |
|||
height: 60, |
|||
'NativeBase.Text': { |
|||
fontSize: 22, |
|||
}, |
|||
}, |
|||
|
|||
'.capitalize': {}, |
|||
|
|||
'.vertical': { |
|||
flexDirection: 'column', |
|||
height: null, |
|||
}, |
|||
|
|||
'NativeBase.Text': { |
|||
fontFamily: variables.buttonFontFamily, |
|||
marginLeft: 0, |
|||
marginRight: 0, |
|||
color: variables.inverseTextColor, |
|||
fontSize: variables.buttonTextSize, |
|||
paddingHorizontal: 16, |
|||
backgroundColor: 'transparent', |
|||
}, |
|||
|
|||
'NativeBase.Icon': { |
|||
color: variables.inverseTextColor, |
|||
fontSize: 24, |
|||
marginHorizontal: 16, |
|||
paddingTop: platform === PLATFORM.IOS ? 2 : undefined, |
|||
}, |
|||
'NativeBase.IconNB': { |
|||
color: variables.inverseTextColor, |
|||
fontSize: 24, |
|||
marginHorizontal: 16, |
|||
paddingTop: platform === PLATFORM.IOS ? 2 : undefined, |
|||
}, |
|||
|
|||
'.iconLeft': { |
|||
'NativeBase.Text': { |
|||
marginLeft: 0, |
|||
}, |
|||
'NativeBase.IconNB': { |
|||
marginRight: 0, |
|||
marginLeft: 16, |
|||
}, |
|||
'NativeBase.Icon': { |
|||
marginRight: 0, |
|||
marginLeft: 16, |
|||
}, |
|||
}, |
|||
'.iconRight': { |
|||
'NativeBase.Text': { |
|||
marginRight: 0, |
|||
}, |
|||
'NativeBase.IconNB': { |
|||
marginLeft: 0, |
|||
marginRight: 16, |
|||
}, |
|||
'NativeBase.Icon': { |
|||
marginLeft: 0, |
|||
marginRight: 16, |
|||
}, |
|||
}, |
|||
'.picker': { |
|||
'NativeBase.Text': { |
|||
'.note': { |
|||
fontSize: 16, |
|||
lineHeight: null, |
|||
}, |
|||
}, |
|||
}, |
|||
paddingVertical: variables.buttonPadding, |
|||
backgroundColor: variables.buttonPrimaryBg, |
|||
borderRadius: variables.borderRadiusBase, |
|||
borderColor: variables.buttonPrimaryBg, |
|||
borderWidth: null, |
|||
height: 45, |
|||
flexDirection: 'row', |
|||
elevation: 2, |
|||
shadowColor: platformStyle === PLATFORM.MATERIAL ? variables.brandDark : undefined, |
|||
shadowOffset: platformStyle === PLATFORM.MATERIAL ? { width: 0, height: 2 } : undefined, |
|||
shadowOpacity: platformStyle === PLATFORM.MATERIAL ? 0.2 : undefined, |
|||
shadowRadius: platformStyle === PLATFORM.MATERIAL ? 1.2 : undefined, |
|||
alignItems: 'center', |
|||
justifyContent: 'space-between', |
|||
}; |
|||
return buttonTheme; |
|||
}; |
|||
@ -1,37 +0,0 @@ |
|||
// @flow
|
|||
|
|||
import variable from '../variables/Platform'; |
|||
|
|||
export default (variables /* : * */ = variable) => { |
|||
const cardTheme = { |
|||
'.transparent': { |
|||
shadowColor: null, |
|||
shadowOffset: null, |
|||
shadowOpacity: null, |
|||
shadowRadius: null, |
|||
elevation: null, |
|||
backgroundColor: 'transparent', |
|||
borderWidth: 0, |
|||
}, |
|||
'.noShadow': { |
|||
shadowColor: null, |
|||
shadowOffset: null, |
|||
shadowOpacity: null, |
|||
elevation: null, |
|||
}, |
|||
marginVertical: 5, |
|||
marginHorizontal: 2, |
|||
borderWidth: variables.borderWidth, |
|||
borderRadius: variables.cardBorderRadius, |
|||
borderColor: variables.cardBorderColor, |
|||
flexWrap: 'nowrap', |
|||
backgroundColor: variables.cardDefaultBg, |
|||
shadowColor: '#000', |
|||
shadowOffset: { width: 0, height: 2 }, |
|||
shadowOpacity: 0.1, |
|||
shadowRadius: 1.5, |
|||
elevation: 3, |
|||
}; |
|||
|
|||
return cardTheme; |
|||
}; |
|||
@ -1,198 +0,0 @@ |
|||
// @flow
|
|||
|
|||
import { StyleSheet } from 'react-native'; |
|||
|
|||
import variable from '../variables/Platform'; |
|||
import { PLATFORM } from '../variables/CommonColor'; |
|||
|
|||
export default (variables /* : * */ = variable) => { |
|||
const { platform } = variables; |
|||
const transparentBtnCommon = { |
|||
'NativeBase.Text': { |
|||
fontSize: variables.DefaultFontSize - 3, |
|||
color: variables.sTabBarActiveTextColor, |
|||
}, |
|||
'NativeBase.Icon': { |
|||
fontSize: variables.iconFontSize - 10, |
|||
color: variables.sTabBarActiveTextColor, |
|||
marginHorizontal: null, |
|||
}, |
|||
'NativeBase.IconNB': { |
|||
fontSize: variables.iconFontSize - 10, |
|||
color: variables.sTabBarActiveTextColor, |
|||
}, |
|||
paddingVertical: null, |
|||
paddingHorizontal: null, |
|||
}; |
|||
|
|||
const cardItemTheme = { |
|||
'NativeBase.Left': { |
|||
'NativeBase.Body': { |
|||
'NativeBase.Text': { |
|||
'.note': { |
|||
color: variables.listNoteColor, |
|||
fontWeight: '400', |
|||
marginRight: 20, |
|||
}, |
|||
}, |
|||
flex: 1, |
|||
marginLeft: 10, |
|||
alignItems: null, |
|||
}, |
|||
'NativeBase.Icon': { |
|||
fontSize: variables.iconFontSize, |
|||
}, |
|||
'NativeBase.IconNB': { |
|||
fontSize: variables.iconFontSize, |
|||
}, |
|||
'NativeBase.Text': { |
|||
marginLeft: 10, |
|||
alignSelf: 'center', |
|||
}, |
|||
'NativeBase.Button': { |
|||
'.transparent': { |
|||
...transparentBtnCommon, |
|||
paddingRight: variables.cardItemPadding + 5, |
|||
}, |
|||
}, |
|||
flex: 1, |
|||
flexDirection: 'row', |
|||
alignItems: 'center', |
|||
}, |
|||
'.content': { |
|||
'NativeBase.Text': { |
|||
color: platform === PLATFORM.IOS ? '#555' : '#222', |
|||
fontSize: variables.DefaultFontSize - 2, |
|||
}, |
|||
}, |
|||
'.cardBody': { |
|||
padding: -5, |
|||
'NativeBase.Text': { |
|||
marginTop: 5, |
|||
}, |
|||
}, |
|||
'NativeBase.Body': { |
|||
'NativeBase.Text': { |
|||
'.note': { |
|||
color: variables.listNoteColor, |
|||
fontWeight: '200', |
|||
marginRight: 20, |
|||
}, |
|||
}, |
|||
'NativeBase.Button': { |
|||
'.transparent': { |
|||
...transparentBtnCommon, |
|||
paddingRight: variables.cardItemPadding + 5, |
|||
alignSelf: 'stretch', |
|||
}, |
|||
}, |
|||
flex: 1, |
|||
alignSelf: 'stretch', |
|||
alignItems: 'flex-start', |
|||
}, |
|||
'NativeBase.Right': { |
|||
'NativeBase.Badge': { |
|||
alignSelf: null, |
|||
}, |
|||
'NativeBase.Button': { |
|||
'.transparent': { |
|||
...transparentBtnCommon, |
|||
}, |
|||
alignSelf: null, |
|||
}, |
|||
'NativeBase.Icon': { |
|||
alignSelf: null, |
|||
fontSize: variables.iconFontSize - 8, |
|||
color: variables.cardBorderColor, |
|||
}, |
|||
'NativeBase.IconNB': { |
|||
alignSelf: null, |
|||
fontSize: variables.iconFontSize - 8, |
|||
color: variables.cardBorderColor, |
|||
}, |
|||
'NativeBase.Text': { |
|||
fontSize: variables.DefaultFontSize - 1, |
|||
alignSelf: null, |
|||
}, |
|||
'NativeBase.Thumbnail': { |
|||
alignSelf: null, |
|||
}, |
|||
'NativeBase.Image': { |
|||
alignSelf: null, |
|||
}, |
|||
'NativeBase.Radio': { |
|||
alignSelf: null, |
|||
}, |
|||
'NativeBase.Checkbox': { |
|||
alignSelf: null, |
|||
}, |
|||
'NativeBase.Switch': { |
|||
alignSelf: null, |
|||
}, |
|||
flex: 0.8, |
|||
}, |
|||
'.header': { |
|||
'NativeBase.Text': { |
|||
fontSize: 16, |
|||
fontWeight: platform === PLATFORM.IOS ? '600' : '500', |
|||
}, |
|||
'.bordered': { |
|||
'NativeBase.Text': { |
|||
color: variables.brandPrimary, |
|||
fontWeight: platform === PLATFORM.IOS ? '600' : '500', |
|||
}, |
|||
borderBottomWidth: variables.borderWidth, |
|||
}, |
|||
borderBottomWidth: null, |
|||
paddingVertical: variables.cardItemPadding + 5, |
|||
}, |
|||
'.footer': { |
|||
'NativeBase.Text': { |
|||
fontSize: 16, |
|||
fontWeight: platform === PLATFORM.IOS ? '600' : '500', |
|||
}, |
|||
'.bordered': { |
|||
'NativeBase.Text': { |
|||
color: variables.brandPrimary, |
|||
fontWeight: platform === PLATFORM.IOS ? '600' : '500', |
|||
}, |
|||
borderTopWidth: variables.borderWidth, |
|||
}, |
|||
borderBottomWidth: null, |
|||
}, |
|||
'NativeBase.Text': { |
|||
'.note': { |
|||
color: variables.listNoteColor, |
|||
fontWeight: '200', |
|||
}, |
|||
}, |
|||
'NativeBase.Icon': { |
|||
width: variables.iconFontSize + 5, |
|||
fontSize: variables.iconFontSize - 2, |
|||
}, |
|||
'NativeBase.IconNB': { |
|||
width: variables.iconFontSize + 5, |
|||
fontSize: variables.iconFontSize - 2, |
|||
}, |
|||
'.bordered': { |
|||
borderBottomWidth: StyleSheet.hairlineWidth, |
|||
borderColor: variables.cardBorderColor, |
|||
}, |
|||
'.first': { |
|||
borderTopLeftRadius: variables.cardBorderRadius, |
|||
borderTopRightRadius: variables.cardBorderRadius, |
|||
}, |
|||
'.last': { |
|||
borderBottomLeftRadius: variables.cardBorderRadius, |
|||
borderBottomRightRadius: variables.cardBorderRadius, |
|||
}, |
|||
flexDirection: 'row', |
|||
alignItems: 'center', |
|||
borderRadius: variables.cardBorderRadius, |
|||
padding: variables.cardItemPadding + 5, |
|||
paddingVertical: variables.cardItemPadding, |
|||
backgroundColor: variables.cardDefaultBg, |
|||
}; |
|||
|
|||
return cardItemTheme; |
|||
}; |
|||
@ -1,38 +0,0 @@ |
|||
// @flow
|
|||
|
|||
import variable from '../variables/Platform'; |
|||
|
|||
export default (variables /* : * */ = variable) => { |
|||
const checkBoxTheme = { |
|||
'.checked': { |
|||
'NativeBase.Icon': { |
|||
color: variables.checkboxTickColor, |
|||
}, |
|||
'NativeBase.IconNB': { |
|||
color: variables.checkboxTickColor, |
|||
}, |
|||
}, |
|||
'NativeBase.Icon': { |
|||
color: 'transparent', |
|||
lineHeight: variables.CheckboxIconSize, |
|||
marginTop: variables.CheckboxIconMarginTop, |
|||
fontSize: variables.CheckboxFontSize, |
|||
}, |
|||
'NativeBase.IconNB': { |
|||
color: 'transparent', |
|||
lineHeight: variables.CheckboxIconSize, |
|||
marginTop: variables.CheckboxIconMarginTop, |
|||
fontSize: variables.CheckboxFontSize, |
|||
}, |
|||
borderRadius: variables.CheckboxRadius, |
|||
overflow: 'hidden', |
|||
width: variables.checkboxSize, |
|||
height: variables.checkboxSize, |
|||
borderWidth: variables.CheckboxBorderWidth, |
|||
paddingLeft: variables.CheckboxPaddingLeft - 1, |
|||
paddingBottom: variables.CheckboxPaddingBottom, |
|||
left: 10, |
|||
}; |
|||
|
|||
return checkBoxTheme; |
|||
}; |
|||
@ -1,17 +0,0 @@ |
|||
// @flow
|
|||
|
|||
import { Platform, Dimensions } from 'react-native'; |
|||
|
|||
import variable from '../variables/Platform'; |
|||
import { PLATFORM } from '../variables/CommonColor'; |
|||
|
|||
const deviceHeight = Dimensions.get('window').height; |
|||
export default (variables /* : * */ = variable) => { |
|||
const theme = { |
|||
flex: 1, |
|||
height: Platform.OS === PLATFORM.IOS ? deviceHeight : deviceHeight - 20, |
|||
backgroundColor: variables.containerBgColor, |
|||
}; |
|||
|
|||
return theme; |
|||
}; |
|||
@ -1,14 +0,0 @@ |
|||
// @flow
|
|||
|
|||
export default () => { |
|||
const contentTheme = { |
|||
flex: 1, |
|||
backgroundColor: 'transparent', |
|||
'NativeBase.Segment': { |
|||
borderWidth: 0, |
|||
backgroundColor: 'transparent', |
|||
}, |
|||
}; |
|||
|
|||
return contentTheme; |
|||
}; |
|||
@ -1,25 +0,0 @@ |
|||
// @flow
|
|||
|
|||
export default () => { |
|||
const fabTheme = { |
|||
'NativeBase.Button': { |
|||
alignItems: 'center', |
|||
padding: null, |
|||
justifyContent: 'center', |
|||
'NativeBase.Icon': { |
|||
alignSelf: 'center', |
|||
fontSize: 20, |
|||
marginLeft: 0, |
|||
marginRight: 0, |
|||
}, |
|||
'NativeBase.IconNB': { |
|||
alignSelf: 'center', |
|||
fontSize: 20, |
|||
marginLeft: 0, |
|||
marginRight: 0, |
|||
}, |
|||
}, |
|||
}; |
|||
|
|||
return fabTheme; |
|||
}; |
|||
@ -1,117 +0,0 @@ |
|||
// @flow
|
|||
|
|||
import variable from '../variables/Platform'; |
|||
import { PLATFORM } from '../variables/CommonColor'; |
|||
|
|||
export default (variables /* : * */ = variable) => { |
|||
const { platformStyle } = variables; |
|||
const { platform } = variables; |
|||
|
|||
const iconCommon = { |
|||
'NativeBase.Icon': { |
|||
color: variables.tabBarActiveTextColor, |
|||
}, |
|||
}; |
|||
const iconNBCommon = { |
|||
'NativeBase.IconNB': { |
|||
color: variables.tabBarActiveTextColor, |
|||
}, |
|||
}; |
|||
const textCommon = { |
|||
'NativeBase.Text': { |
|||
color: variables.tabBarActiveTextColor, |
|||
}, |
|||
}; |
|||
const footerTheme = { |
|||
'NativeBase.Left': { |
|||
'NativeBase.Button': { |
|||
'.transparent': { |
|||
backgroundColor: 'transparent', |
|||
borderColor: null, |
|||
elevation: 0, |
|||
shadowColor: null, |
|||
shadowOffset: null, |
|||
shadowRadius: null, |
|||
shadowOpacity: null, |
|||
...iconCommon, |
|||
...iconNBCommon, |
|||
...textCommon, |
|||
}, |
|||
alignSelf: null, |
|||
...iconCommon, |
|||
...iconNBCommon, |
|||
// ...textCommon
|
|||
}, |
|||
flex: 1, |
|||
alignSelf: 'center', |
|||
alignItems: 'flex-start', |
|||
}, |
|||
'NativeBase.Body': { |
|||
flex: 1, |
|||
alignItems: 'center', |
|||
alignSelf: 'center', |
|||
flexDirection: 'row', |
|||
'NativeBase.Button': { |
|||
alignSelf: 'center', |
|||
'.transparent': { |
|||
backgroundColor: 'transparent', |
|||
borderColor: null, |
|||
elevation: 0, |
|||
shadowColor: null, |
|||
shadowOffset: null, |
|||
shadowRadius: null, |
|||
shadowOpacity: null, |
|||
...iconCommon, |
|||
...iconNBCommon, |
|||
...textCommon, |
|||
}, |
|||
'.full': { |
|||
height: variables.footerHeight, |
|||
paddingBottom: variables.footerPaddingBottom, |
|||
flex: 1, |
|||
}, |
|||
...iconCommon, |
|||
...iconNBCommon, |
|||
// ...textCommon
|
|||
}, |
|||
}, |
|||
'NativeBase.Right': { |
|||
'NativeBase.Button': { |
|||
'.transparent': { |
|||
backgroundColor: 'transparent', |
|||
borderColor: null, |
|||
elevation: 0, |
|||
shadowColor: null, |
|||
shadowOffset: null, |
|||
shadowRadius: null, |
|||
shadowOpacity: null, |
|||
...iconCommon, |
|||
...iconNBCommon, |
|||
...textCommon, |
|||
}, |
|||
alignSelf: null, |
|||
...iconCommon, |
|||
...iconNBCommon, |
|||
// ...textCommon
|
|||
}, |
|||
flex: 1, |
|||
alignSelf: 'center', |
|||
alignItems: 'flex-end', |
|||
}, |
|||
backgroundColor: variables.footerDefaultBg, |
|||
flexDirection: 'row', |
|||
justifyContent: 'center', |
|||
borderTopWidth: |
|||
platform === PLATFORM.IOS && platformStyle !== PLATFORM.MATERIAL |
|||
? variables.borderWidth |
|||
: undefined, |
|||
borderColor: |
|||
platform === PLATFORM.IOS && platformStyle !== PLATFORM.MATERIAL ? '#cbcbcb' : undefined, |
|||
height: variables.footerHeight, |
|||
paddingBottom: variables.footerPaddingBottom, |
|||
elevation: 3, |
|||
left: 0, |
|||
right: 0, |
|||
}; |
|||
return footerTheme; |
|||
}; |
|||
@ -1,78 +0,0 @@ |
|||
// @flow
|
|||
|
|||
import { Platform } from 'react-native'; |
|||
|
|||
import variable from '../variables/Platform'; |
|||
import { PLATFORM } from '../variables/CommonColor'; |
|||
|
|||
export default (variables /* : * */ = variable) => { |
|||
const { platform } = variables; |
|||
|
|||
const footerTabTheme = { |
|||
'NativeBase.Button': { |
|||
'.active': { |
|||
'NativeBase.Text': { |
|||
color: variables.tabBarActiveTextColor, |
|||
fontSize: variables.tabBarTextSize, |
|||
lineHeight: 16, |
|||
}, |
|||
'NativeBase.Icon': { |
|||
color: variables.tabBarActiveTextColor, |
|||
}, |
|||
'NativeBase.IconNB': { |
|||
color: variables.tabBarActiveTextColor, |
|||
}, |
|||
backgroundColor: variables.tabActiveBgColor, |
|||
}, |
|||
flexDirection: null, |
|||
backgroundColor: 'transparent', |
|||
borderColor: null, |
|||
elevation: 0, |
|||
shadowColor: null, |
|||
shadowOffset: null, |
|||
shadowRadius: null, |
|||
shadowOpacity: null, |
|||
alignSelf: 'center', |
|||
flex: 1, |
|||
height: variables.footerHeight, |
|||
justifyContent: 'center', |
|||
'.badge': { |
|||
'NativeBase.Badge': { |
|||
'NativeBase.Text': { |
|||
fontSize: 11, |
|||
fontWeight: platform === PLATFORM.IOS ? '600' : undefined, |
|||
lineHeight: 14, |
|||
}, |
|||
top: -3, |
|||
alignSelf: 'center', |
|||
left: 10, |
|||
zIndex: 99, |
|||
height: 18, |
|||
padding: 1.7, |
|||
paddingHorizontal: 3, |
|||
}, |
|||
'NativeBase.Icon': { |
|||
marginTop: -18, |
|||
}, |
|||
}, |
|||
'NativeBase.Icon': { |
|||
color: variables.tabBarTextColor, |
|||
}, |
|||
'NativeBase.IconNB': { |
|||
color: variables.tabBarTextColor, |
|||
}, |
|||
'NativeBase.Text': { |
|||
color: variables.tabBarTextColor, |
|||
fontSize: variables.tabBarTextSize, |
|||
lineHeight: 16, |
|||
}, |
|||
}, |
|||
backgroundColor: Platform.OS === PLATFORM.ANDROID ? variables.footerDefaultBg : undefined, |
|||
flexDirection: 'row', |
|||
justifyContent: 'space-between', |
|||
flex: 1, |
|||
alignSelf: 'stretch', |
|||
}; |
|||
|
|||
return footerTabTheme; |
|||
}; |
|||
@ -1,86 +0,0 @@ |
|||
// @flow
|
|||
|
|||
export default () => { |
|||
const theme = { |
|||
'NativeBase.Item': { |
|||
'.fixedLabel': { |
|||
'NativeBase.Label': { |
|||
paddingLeft: null, |
|||
}, |
|||
marginLeft: 15, |
|||
}, |
|||
'.inlineLabel': { |
|||
'NativeBase.Label': { |
|||
paddingLeft: null, |
|||
}, |
|||
marginLeft: 15, |
|||
}, |
|||
'.placeholderLabel': { |
|||
'NativeBase.Input': {}, |
|||
}, |
|||
'.stackedLabel': { |
|||
'NativeBase.Label': { |
|||
top: 5, |
|||
paddingLeft: null, |
|||
}, |
|||
'NativeBase.Input': { |
|||
paddingLeft: null, |
|||
marginLeft: null, |
|||
}, |
|||
'NativeBase.Icon': { |
|||
marginTop: 36, |
|||
}, |
|||
marginLeft: 15, |
|||
}, |
|||
'.floatingLabel': { |
|||
'NativeBase.Input': { |
|||
paddingLeft: null, |
|||
top: 10, |
|||
marginLeft: null, |
|||
}, |
|||
'NativeBase.Label': { |
|||
left: 0, |
|||
top: 6, |
|||
}, |
|||
'NativeBase.Icon': { |
|||
top: 6, |
|||
}, |
|||
marginTop: 15, |
|||
marginLeft: 15, |
|||
}, |
|||
'.regular': { |
|||
'NativeBase.Label': { |
|||
left: 0, |
|||
}, |
|||
marginLeft: 0, |
|||
}, |
|||
'.rounded': { |
|||
'NativeBase.Label': { |
|||
left: 0, |
|||
}, |
|||
marginLeft: 0, |
|||
}, |
|||
'.underline': { |
|||
'NativeBase.Label': { |
|||
left: 0, |
|||
top: 0, |
|||
position: 'relative', |
|||
}, |
|||
'NativeBase.Input': { |
|||
left: -15, |
|||
}, |
|||
marginLeft: 15, |
|||
}, |
|||
'.last': { |
|||
marginLeft: 0, |
|||
paddingLeft: 15, |
|||
}, |
|||
'NativeBase.Label': { |
|||
paddingRight: 5, |
|||
}, |
|||
marginLeft: 15, |
|||
}, |
|||
}; |
|||
|
|||
return theme; |
|||
}; |
|||
@ -1,13 +0,0 @@ |
|||
// @flow
|
|||
|
|||
import variable from '../variables/Platform'; |
|||
|
|||
export default (variables /* : * */ = variable) => { |
|||
const h1Theme = { |
|||
color: variables.textColor, |
|||
fontSize: variables.fontSizeH1, |
|||
lineHeight: variables.lineHeightH1, |
|||
}; |
|||
|
|||
return h1Theme; |
|||
}; |
|||
@ -1,13 +0,0 @@ |
|||
// @flow
|
|||
|
|||
import variable from '../variables/Platform'; |
|||
|
|||
export default (variables /* : * */ = variable) => { |
|||
const h2Theme = { |
|||
color: variables.textColor, |
|||
fontSize: variables.fontSizeH2, |
|||
lineHeight: variables.lineHeightH2, |
|||
}; |
|||
|
|||
return h2Theme; |
|||
}; |
|||
@ -1,13 +0,0 @@ |
|||
// @flow
|
|||
|
|||
import variable from '../variables/Platform'; |
|||
|
|||
export default (variables /* : * */ = variable) => { |
|||
const h3Theme = { |
|||
color: variables.textColor, |
|||
fontSize: variables.fontSizeH3, |
|||
lineHeight: variables.lineHeightH3, |
|||
}; |
|||
|
|||
return h3Theme; |
|||
}; |
|||
@ -1,389 +0,0 @@ |
|||
// @flow
|
|||
|
|||
import { PixelRatio, StatusBar } from 'react-native'; |
|||
|
|||
import variable from '../variables/Platform'; |
|||
import { PLATFORM } from '../variables/CommonColor'; |
|||
|
|||
export default (variables /* : * */ = variable) => { |
|||
const { platformStyle } = variables; |
|||
const { platform } = variables; |
|||
|
|||
const headerTheme = { |
|||
'.span': { |
|||
height: 128, |
|||
'NativeBase.Left': { |
|||
alignSelf: 'flex-start', |
|||
}, |
|||
'NativeBase.Body': { |
|||
alignSelf: 'flex-end', |
|||
alignItems: 'flex-start', |
|||
justifyContent: 'center', |
|||
paddingBottom: 26, |
|||
}, |
|||
'NativeBase.Right': { |
|||
alignSelf: 'flex-start', |
|||
}, |
|||
}, |
|||
'.hasSubtitle': { |
|||
'NativeBase.Body': { |
|||
'NativeBase.Title': { |
|||
fontSize: variables.titleFontSize - 2, |
|||
fontFamily: variables.titleFontfamily, |
|||
textAlign: 'center', |
|||
fontWeight: '500', |
|||
paddingBottom: 3, |
|||
}, |
|||
'NativeBase.Subtitle': { |
|||
fontSize: variables.subTitleFontSize, |
|||
fontFamily: variables.titleFontfamily, |
|||
color: variables.subtitleColor, |
|||
textAlign: 'center', |
|||
}, |
|||
}, |
|||
}, |
|||
'.transparent': { |
|||
backgroundColor: 'transparent', |
|||
borderBottomColor: 'transparent', |
|||
elevation: 0, |
|||
shadowColor: null, |
|||
shadowOffset: null, |
|||
shadowRadius: null, |
|||
shadowOpacity: null, |
|||
paddingTop: platform === PLATFORM.ANDROID ? StatusBar.currentHeight : undefined, |
|||
height: |
|||
platform === PLATFORM.ANDROID |
|||
? variables.toolbarHeight + StatusBar.currentHeight |
|||
: variables.toolbarHeight, |
|||
}, |
|||
'.noShadow': { |
|||
elevation: 0, |
|||
shadowColor: null, |
|||
shadowOffset: null, |
|||
shadowRadius: null, |
|||
shadowOpacity: null, |
|||
}, |
|||
'.hasTabs': { |
|||
elevation: 0, |
|||
shadowColor: null, |
|||
shadowOffset: null, |
|||
shadowRadius: null, |
|||
shadowOpacity: null, |
|||
borderBottomWidth: null, |
|||
}, |
|||
'.hasSegment': { |
|||
elevation: 0, |
|||
shadowColor: null, |
|||
shadowOffset: null, |
|||
shadowRadius: null, |
|||
shadowOpacity: null, |
|||
borderBottomWidth: null, |
|||
'NativeBase.Left': { |
|||
flex: 0.3, |
|||
}, |
|||
'NativeBase.Right': { |
|||
flex: 0.3, |
|||
}, |
|||
'NativeBase.Body': { |
|||
flex: 1, |
|||
'NativeBase.Segment': { |
|||
marginRight: 0, |
|||
alignSelf: 'center', |
|||
'NativeBase.Button': { |
|||
paddingLeft: 0, |
|||
paddingRight: 0, |
|||
}, |
|||
}, |
|||
}, |
|||
}, |
|||
'.noLeft': { |
|||
'NativeBase.Left': { |
|||
width: platform === PLATFORM.IOS ? undefined : 0, |
|||
flex: platform === PLATFORM.IOS ? 1 : 0, |
|||
}, |
|||
'NativeBase.Body': { |
|||
'NativeBase.Title': { |
|||
paddingLeft: platform === PLATFORM.IOS ? undefined : 10, |
|||
}, |
|||
'NativeBase.Subtitle': { |
|||
paddingLeft: platform === PLATFORM.IOS ? undefined : 10, |
|||
}, |
|||
}, |
|||
}, |
|||
'NativeBase.Button': { |
|||
justifyContent: 'center', |
|||
alignSelf: 'center', |
|||
alignItems: 'center', |
|||
'.transparent': { |
|||
'NativeBase.Text': { |
|||
color: variables.toolbarBtnTextColor, |
|||
fontWeight: '600', |
|||
}, |
|||
'NativeBase.Icon': { |
|||
color: variables.toolbarBtnColor, |
|||
}, |
|||
'NativeBase.IconNB': { |
|||
color: variables.toolbarBtnColor, |
|||
}, |
|||
paddingHorizontal: variables.buttonPadding, |
|||
}, |
|||
paddingHorizontal: 15, |
|||
}, |
|||
'.searchBar': { |
|||
'NativeBase.Item': { |
|||
'NativeBase.Icon': { |
|||
backgroundColor: 'transparent', |
|||
color: variables.dropdownLinkColor, |
|||
fontSize: variables.toolbarSearchIconSize, |
|||
alignItems: 'center', |
|||
marginTop: 2, |
|||
paddingRight: 10, |
|||
paddingLeft: 10, |
|||
}, |
|||
'NativeBase.IconNB': { |
|||
backgroundColor: 'transparent', |
|||
color: null, |
|||
alignSelf: 'center', |
|||
}, |
|||
'NativeBase.Input': { |
|||
alignSelf: 'center', |
|||
lineHeight: null, |
|||
height: variables.searchBarInputHeight, |
|||
}, |
|||
alignSelf: 'center', |
|||
alignItems: 'center', |
|||
justifyContent: 'flex-start', |
|||
flex: 1, |
|||
height: variables.searchBarHeight, |
|||
borderColor: 'transparent', |
|||
backgroundColor: variables.toolbarInputColor, |
|||
}, |
|||
'NativeBase.Button': { |
|||
'.transparent': { |
|||
'NativeBase.Text': { |
|||
fontWeight: '500', |
|||
}, |
|||
paddingHorizontal: null, |
|||
paddingLeft: platform === PLATFORM.IOS ? 10 : null, |
|||
}, |
|||
paddingHorizontal: platform === PLATFORM.IOS ? undefined : null, |
|||
width: platform === PLATFORM.IOS ? undefined : 0, |
|||
height: platform === PLATFORM.IOS ? undefined : 0, |
|||
}, |
|||
}, |
|||
'.rounded': { |
|||
'NativeBase.Item': { |
|||
borderRadius: platform === PLATFORM.IOS && platformStyle !== PLATFORM.MATERIAL ? 25 : 3, |
|||
}, |
|||
}, |
|||
'NativeBase.Left': { |
|||
'NativeBase.Button': { |
|||
'.hasText': { |
|||
marginLeft: -10, |
|||
height: 30, |
|||
'NativeBase.Icon': { |
|||
color: variables.toolbarBtnColor, |
|||
fontSize: variables.iconHeaderSize, |
|||
marginTop: 2, |
|||
marginRight: 5, |
|||
marginLeft: 2, |
|||
}, |
|||
'NativeBase.Text': { |
|||
color: variables.toolbarBtnTextColor, |
|||
fontSize: platform === PLATFORM.IOS ? 17 : 0, |
|||
marginLeft: 7, |
|||
lineHeight: 19.5, |
|||
}, |
|||
'NativeBase.IconNB': { |
|||
color: variables.toolbarBtnColor, |
|||
fontSize: variables.iconHeaderSize, |
|||
marginTop: 2, |
|||
marginRight: 5, |
|||
marginLeft: 2, |
|||
}, |
|||
}, |
|||
'.transparent': { |
|||
marginLeft: platform === PLATFORM.IOS && platformStyle !== PLATFORM.MATERIAL ? -3 : 0, |
|||
'NativeBase.Icon': { |
|||
color: variables.toolbarBtnColor, |
|||
fontSize: |
|||
platform === PLATFORM.IOS && variables.platformStyle !== PLATFORM.MATERIAL |
|||
? variables.iconHeaderSize + 1 |
|||
: variables.iconHeaderSize, |
|||
marginTop: 0, |
|||
marginRight: 2, |
|||
marginLeft: 1, |
|||
paddingTop: 1, |
|||
}, |
|||
'NativeBase.IconNB': { |
|||
color: variables.toolbarBtnColor, |
|||
fontSize: |
|||
platform === PLATFORM.IOS && variables.platformStyle !== PLATFORM.MATERIAL |
|||
? variables.iconHeaderSize + 1 |
|||
: variables.iconHeaderSize - 2, |
|||
marginTop: 0, |
|||
marginRight: 2, |
|||
marginLeft: 1, |
|||
paddingTop: 1, |
|||
}, |
|||
'NativeBase.Text': { |
|||
color: variables.toolbarBtnTextColor, |
|||
fontSize: platform === PLATFORM.IOS ? 17 : 0, |
|||
top: platform === PLATFORM.IOS ? 1 : -1.5, |
|||
paddingLeft: platform === PLATFORM.IOS && platformStyle !== PLATFORM.MATERIAL ? 2 : 5, |
|||
paddingRight: |
|||
platform === PLATFORM.IOS && platformStyle !== PLATFORM.MATERIAL ? undefined : 10, |
|||
}, |
|||
backgroundColor: 'transparent', |
|||
borderColor: null, |
|||
elevation: 0, |
|||
shadowColor: null, |
|||
shadowOffset: null, |
|||
shadowRadius: null, |
|||
shadowOpacity: null, |
|||
}, |
|||
'NativeBase.Icon': { |
|||
color: variables.toolbarBtnColor, |
|||
}, |
|||
'NativeBase.IconNB': { |
|||
color: variables.toolbarBtnColor, |
|||
}, |
|||
alignSelf: null, |
|||
paddingRight: variables.buttonPadding, |
|||
paddingLeft: platform === PLATFORM.IOS && platformStyle !== PLATFORM.MATERIAL ? 4 : 8, |
|||
}, |
|||
flex: platform === PLATFORM.IOS && platformStyle !== PLATFORM.MATERIAL ? 1 : 0.4, |
|||
alignSelf: 'center', |
|||
alignItems: 'flex-start', |
|||
}, |
|||
'NativeBase.Body': { |
|||
flex: 1, |
|||
alignItems: |
|||
platform === PLATFORM.IOS && platformStyle !== PLATFORM.MATERIAL ? 'center' : 'flex-start', |
|||
alignSelf: 'center', |
|||
'NativeBase.Segment': { |
|||
borderWidth: 0, |
|||
alignSelf: 'flex-end', |
|||
marginRight: platform === PLATFORM.IOS ? -40 : -55, |
|||
}, |
|||
'NativeBase.Button': { |
|||
alignSelf: 'center', |
|||
'.transparent': { |
|||
backgroundColor: 'transparent', |
|||
}, |
|||
'NativeBase.Icon': { |
|||
color: variables.toolbarBtnColor, |
|||
}, |
|||
'NativeBase.IconNB': { |
|||
color: variables.toolbarBtnColor, |
|||
}, |
|||
'NativeBase.Text': { |
|||
color: variables.inverseTextColor, |
|||
backgroundColor: 'transparent', |
|||
}, |
|||
}, |
|||
}, |
|||
'NativeBase.Right': { |
|||
'NativeBase.Button': { |
|||
'.hasText': { |
|||
height: 30, |
|||
'NativeBase.Icon': { |
|||
color: variables.toolbarBtnColor, |
|||
fontSize: variables.iconHeaderSize - 2, |
|||
marginTop: 2, |
|||
marginRight: 2, |
|||
marginLeft: 5, |
|||
}, |
|||
'NativeBase.Text': { |
|||
color: variables.toolbarBtnTextColor, |
|||
fontSize: platform === PLATFORM.IOS ? 17 : 14, |
|||
lineHeight: 19.5, |
|||
}, |
|||
'NativeBase.IconNB': { |
|||
color: variables.toolbarBtnColor, |
|||
fontSize: variables.iconHeaderSize - 2, |
|||
marginTop: 2, |
|||
marginRight: 2, |
|||
marginLeft: 5, |
|||
}, |
|||
}, |
|||
'.transparent': { |
|||
marginRight: platform === PLATFORM.IOS ? -9 : -5, |
|||
paddingLeft: 15, |
|||
paddingRight: 12, |
|||
paddingHorizontal: 15, |
|||
borderRadius: 50, |
|||
'NativeBase.Icon': { |
|||
color: variables.toolbarBtnColor, |
|||
fontSize: variables.iconHeaderSize - 2, |
|||
marginTop: 0, |
|||
marginLeft: 2, |
|||
marginRight: 0, |
|||
// paddingTop: 0
|
|||
}, |
|||
'NativeBase.IconNB': { |
|||
color: variables.toolbarBtnColor, |
|||
fontSize: variables.iconHeaderSize - 2, |
|||
marginTop: 0, |
|||
marginLeft: 2, |
|||
marginRight: 0, |
|||
// paddingTop: 0
|
|||
}, |
|||
'NativeBase.Text': { |
|||
color: variables.toolbarBtnTextColor, |
|||
fontSize: platform === PLATFORM.IOS ? 17 : 14, |
|||
top: platform === PLATFORM.IOS ? 1 : -1.5, |
|||
paddingRight: |
|||
platform === PLATFORM.IOS && variables.platformStyle !== PLATFORM.MATERIAL |
|||
? 0 |
|||
: undefined, |
|||
}, |
|||
backgroundColor: 'transparent', |
|||
borderColor: null, |
|||
elevation: 0, |
|||
shadowColor: null, |
|||
shadowOffset: null, |
|||
shadowRadius: null, |
|||
shadowOpacity: null, |
|||
}, |
|||
'NativeBase.Icon': { |
|||
color: variables.toolbarBtnColor, |
|||
}, |
|||
'NativeBase.IconNB': { |
|||
color: variables.toolbarBtnColor, |
|||
}, |
|||
alignSelf: null, |
|||
paddingHorizontal: variables.buttonPadding, |
|||
}, |
|||
flex: 1, |
|||
alignSelf: 'center', |
|||
alignItems: 'flex-end', |
|||
flexDirection: 'row', |
|||
justifyContent: 'flex-end', |
|||
}, |
|||
backgroundColor: variables.toolbarDefaultBg, |
|||
flexDirection: 'row', |
|||
// paddingHorizontal: 10,
|
|||
paddingLeft: |
|||
platform === PLATFORM.IOS && variables.platformStyle !== PLATFORM.MATERIAL ? 6 : 10, |
|||
paddingRight: 10, |
|||
justifyContent: 'center', |
|||
paddingTop: platform === PLATFORM.IOS ? 18 : 0, |
|||
borderBottomWidth: platform === PLATFORM.IOS ? 1 / PixelRatio.getPixelSizeForLayoutSize(1) : 0, |
|||
borderBottomColor: variables.toolbarDefaultBorder, |
|||
height: |
|||
variables.platform === PLATFORM.IOS && variables.platformStyle === PLATFORM.MATERIAL |
|||
? variables.toolbarHeight + 10 |
|||
: variables.toolbarHeight, |
|||
elevation: 3, |
|||
shadowColor: platformStyle === PLATFORM.MATERIAL ? '#000' : undefined, |
|||
shadowOffset: platformStyle === PLATFORM.MATERIAL ? { width: 0, height: 2 } : undefined, |
|||
shadowOpacity: platformStyle === PLATFORM.MATERIAL ? 0.2 : undefined, |
|||
shadowRadius: platformStyle === PLATFORM.MATERIAL ? 1.2 : undefined, |
|||
top: 0, |
|||
left: 0, |
|||
right: 0, |
|||
}; |
|||
|
|||
return headerTheme; |
|||
}; |
|||
@ -1,12 +0,0 @@ |
|||
// @flow
|
|||
|
|||
import variable from '../variables/Platform'; |
|||
|
|||
export default (variables /* : * */ = variable) => { |
|||
const iconTheme = { |
|||
fontSize: variables.iconFontSize, |
|||
color: variable.textColor, |
|||
}; |
|||
|
|||
return iconTheme; |
|||
}; |
|||
@ -1,19 +0,0 @@ |
|||
// @flow
|
|||
|
|||
import variable from '../variables/Platform'; |
|||
|
|||
export default (variables /* : * */ = variable) => { |
|||
const inputTheme = { |
|||
'.multiline': { |
|||
height: null, |
|||
}, |
|||
height: variables.inputHeightBase, |
|||
color: variables.inputColor, |
|||
paddingLeft: 5, |
|||
paddingRight: 5, |
|||
flex: 1, |
|||
fontSize: variables.inputFontSize, |
|||
}; |
|||
|
|||
return inputTheme; |
|||
}; |
|||
@ -1,132 +0,0 @@ |
|||
// @flow
|
|||
|
|||
import variable from '../variables/Platform'; |
|||
|
|||
export default (variables /* : * */ = variable) => { |
|||
const inputGroupTheme = { |
|||
'NativeBase.Icon': { |
|||
fontSize: 24, |
|||
color: variables.sTabBarActiveTextColor, |
|||
paddingHorizontal: 5, |
|||
}, |
|||
'NativeBase.IconNB': { |
|||
fontSize: 24, |
|||
color: variables.sTabBarActiveTextColor, |
|||
paddingHorizontal: 5, |
|||
}, |
|||
'NativeBase.Input': { |
|||
height: variables.inputHeightBase, |
|||
color: variables.inputColor, |
|||
paddingLeft: 5, |
|||
paddingRight: 5, |
|||
flex: 1, |
|||
fontSize: variables.inputFontSize, |
|||
lineHeight: variables.inputLineHeight, |
|||
}, |
|||
'.underline': { |
|||
'.success': { |
|||
borderColor: variables.inputSuccessBorderColor, |
|||
}, |
|||
'.error': { |
|||
borderColor: variables.inputErrorBorderColor, |
|||
}, |
|||
paddingLeft: 5, |
|||
borderWidth: variables.borderWidth, |
|||
borderTopWidth: 0, |
|||
borderRightWidth: 0, |
|||
borderLeftWidth: 0, |
|||
borderColor: variables.inputBorderColor, |
|||
}, |
|||
'.regular': { |
|||
'.success': { |
|||
borderColor: variables.inputSuccessBorderColor, |
|||
}, |
|||
'.error': { |
|||
borderColor: variables.inputErrorBorderColor, |
|||
}, |
|||
paddingLeft: 5, |
|||
borderWidth: variables.borderWidth, |
|||
borderColor: variables.inputBorderColor, |
|||
}, |
|||
'.rounded': { |
|||
'.success': { |
|||
borderColor: variables.inputSuccessBorderColor, |
|||
}, |
|||
'.error': { |
|||
borderColor: variables.inputErrorBorderColor, |
|||
}, |
|||
paddingLeft: 5, |
|||
borderWidth: variables.borderWidth, |
|||
borderRadius: variables.inputGroupRoundedBorderRadius, |
|||
borderColor: variables.inputBorderColor, |
|||
}, |
|||
|
|||
'.success': { |
|||
'NativeBase.Icon': { |
|||
color: variables.inputSuccessBorderColor, |
|||
}, |
|||
'NativeBase.IconNB': { |
|||
color: variables.inputSuccessBorderColor, |
|||
}, |
|||
'.rounded': { |
|||
borderRadius: 30, |
|||
borderColor: variables.inputSuccessBorderColor, |
|||
}, |
|||
'.regular': { |
|||
borderColor: variables.inputSuccessBorderColor, |
|||
}, |
|||
'.underline': { |
|||
borderWidth: variables.borderWidth, |
|||
borderTopWidth: 0, |
|||
borderRightWidth: 0, |
|||
borderLeftWidth: 0, |
|||
borderColor: variables.inputSuccessBorderColor, |
|||
}, |
|||
borderColor: variables.inputSuccessBorderColor, |
|||
}, |
|||
|
|||
'.error': { |
|||
'NativeBase.Icon': { |
|||
color: variables.inputErrorBorderColor, |
|||
}, |
|||
'NativeBase.IconNB': { |
|||
color: variables.inputErrorBorderColor, |
|||
}, |
|||
'.rounded': { |
|||
borderRadius: 30, |
|||
borderColor: variables.inputErrorBorderColor, |
|||
}, |
|||
'.regular': { |
|||
borderColor: variables.inputErrorBorderColor, |
|||
}, |
|||
'.underline': { |
|||
borderWidth: variables.borderWidth, |
|||
borderTopWidth: 0, |
|||
borderRightWidth: 0, |
|||
borderLeftWidth: 0, |
|||
borderColor: variables.inputErrorBorderColor, |
|||
}, |
|||
borderColor: variables.inputErrorBorderColor, |
|||
}, |
|||
'.disabled': { |
|||
'NativeBase.Icon': { |
|||
color: '#384850', |
|||
}, |
|||
'NativeBase.IconNB': { |
|||
color: '#384850', |
|||
}, |
|||
}, |
|||
|
|||
paddingLeft: 5, |
|||
borderWidth: variables.borderWidth, |
|||
borderTopWidth: 0, |
|||
borderRightWidth: 0, |
|||
borderLeftWidth: 0, |
|||
borderColor: variables.inputBorderColor, |
|||
backgroundColor: 'transparent', |
|||
flexDirection: 'row', |
|||
alignItems: 'center', |
|||
}; |
|||
|
|||
return inputGroupTheme; |
|||
}; |
|||
@ -1,241 +0,0 @@ |
|||
// @flow
|
|||
|
|||
import { Platform } from 'react-native'; |
|||
|
|||
import variable from '../variables/Platform'; |
|||
import { PLATFORM } from '../variables/CommonColor'; |
|||
|
|||
export default (variables /* : * */ = variable) => { |
|||
const itemTheme = { |
|||
'.floatingLabel': { |
|||
'NativeBase.Input': { |
|||
height: 50, |
|||
top: 8, |
|||
paddingTop: 3, |
|||
paddingBottom: 7, |
|||
'.multiline': { |
|||
minHeight: variables.inputHeightBase, |
|||
paddingTop: Platform.OS === PLATFORM.IOS ? 10 : 3, |
|||
paddingBottom: Platform.OS === PLATFORM.IOS ? 14 : 10, |
|||
}, |
|||
}, |
|||
'NativeBase.Label': { |
|||
paddingTop: 5, |
|||
}, |
|||
'NativeBase.Icon': { |
|||
top: 6, |
|||
paddingTop: 8, |
|||
}, |
|||
'NativeBase.IconNB': { |
|||
top: 6, |
|||
paddingTop: 8, |
|||
}, |
|||
}, |
|||
'.fixedLabel': { |
|||
'NativeBase.Label': { |
|||
position: null, |
|||
top: null, |
|||
left: null, |
|||
right: null, |
|||
flex: 1, |
|||
height: null, |
|||
width: null, |
|||
fontSize: variables.inputFontSize, |
|||
}, |
|||
'NativeBase.Input': { |
|||
flex: 2, |
|||
fontSize: variables.inputFontSize, |
|||
}, |
|||
}, |
|||
'.stackedLabel': { |
|||
'NativeBase.Label': { |
|||
position: null, |
|||
top: null, |
|||
left: null, |
|||
right: null, |
|||
paddingTop: 5, |
|||
alignSelf: 'flex-start', |
|||
fontSize: variables.inputFontSize - 2, |
|||
}, |
|||
'NativeBase.Icon': { |
|||
marginTop: 36, |
|||
}, |
|||
'NativeBase.Input': { |
|||
alignSelf: Platform.OS === PLATFORM.IOS ? 'stretch' : 'flex-start', |
|||
flex: 1, |
|||
width: Platform.OS === PLATFORM.IOS ? null : variables.deviceWidth - 25, |
|||
fontSize: variables.inputFontSize, |
|||
lineHeight: variables.inputLineHeight - 6, |
|||
'.secureTextEntry': { |
|||
fontSize: variables.inputFontSize, |
|||
}, |
|||
'.multiline': { |
|||
paddingTop: Platform.OS === PLATFORM.IOS ? 9 : undefined, |
|||
paddingBottom: Platform.OS === PLATFORM.IOS ? 9 : undefined, |
|||
}, |
|||
}, |
|||
flexDirection: null, |
|||
minHeight: variables.inputHeightBase + 15, |
|||
}, |
|||
'.inlineLabel': { |
|||
'NativeBase.Label': { |
|||
position: null, |
|||
top: null, |
|||
left: null, |
|||
right: null, |
|||
paddingRight: 20, |
|||
height: null, |
|||
width: null, |
|||
fontSize: variables.inputFontSize, |
|||
}, |
|||
'NativeBase.Input': { |
|||
paddingLeft: 5, |
|||
fontSize: variables.inputFontSize, |
|||
}, |
|||
flexDirection: 'row', |
|||
}, |
|||
'NativeBase.Label': { |
|||
fontSize: variables.inputFontSize, |
|||
color: variables.inputColorPlaceholder, |
|||
paddingRight: 5, |
|||
}, |
|||
'NativeBase.Icon': { |
|||
fontSize: 24, |
|||
paddingRight: 8, |
|||
}, |
|||
'NativeBase.IconNB': { |
|||
fontSize: 24, |
|||
paddingRight: 8, |
|||
}, |
|||
'NativeBase.Input': { |
|||
'.multiline': { |
|||
height: null, |
|||
}, |
|||
height: variables.inputHeightBase, |
|||
color: variables.inputColor, |
|||
flex: 1, |
|||
top: Platform.OS === PLATFORM.IOS ? 1.5 : undefined, |
|||
fontSize: variables.inputFontSize, |
|||
}, |
|||
'.underline': { |
|||
'NativeBase.Input': { |
|||
paddingLeft: 15, |
|||
}, |
|||
'.success': { |
|||
borderColor: variables.inputSuccessBorderColor, |
|||
}, |
|||
'.error': { |
|||
borderColor: variables.inputErrorBorderColor, |
|||
}, |
|||
borderWidth: variables.borderWidth * 2, |
|||
borderTopWidth: 0, |
|||
borderRightWidth: 0, |
|||
borderLeftWidth: 0, |
|||
borderColor: variables.inputBorderColor, |
|||
}, |
|||
'.regular': { |
|||
'NativeBase.Input': { |
|||
paddingLeft: 8, |
|||
}, |
|||
'NativeBase.Icon': { |
|||
paddingLeft: 10, |
|||
}, |
|||
'.success': { |
|||
borderColor: variables.inputSuccessBorderColor, |
|||
}, |
|||
'.error': { |
|||
borderColor: variables.inputErrorBorderColor, |
|||
}, |
|||
borderWidth: variables.borderWidth * 2, |
|||
borderColor: variables.inputBorderColor, |
|||
}, |
|||
'.rounded': { |
|||
'NativeBase.Input': { |
|||
paddingLeft: 8, |
|||
}, |
|||
'NativeBase.Icon': { |
|||
paddingLeft: 10, |
|||
}, |
|||
'.success': { |
|||
borderColor: variables.inputSuccessBorderColor, |
|||
}, |
|||
'.error': { |
|||
borderColor: variables.inputErrorBorderColor, |
|||
}, |
|||
borderWidth: variables.borderWidth * 2, |
|||
borderRadius: 30, |
|||
borderColor: variables.inputBorderColor, |
|||
}, |
|||
|
|||
'.success': { |
|||
'NativeBase.Icon': { |
|||
color: variables.inputSuccessBorderColor, |
|||
}, |
|||
'NativeBase.IconNB': { |
|||
color: variables.inputSuccessBorderColor, |
|||
}, |
|||
'.rounded': { |
|||
borderRadius: 30, |
|||
borderColor: variables.inputSuccessBorderColor, |
|||
}, |
|||
'.regular': { |
|||
borderColor: variables.inputSuccessBorderColor, |
|||
}, |
|||
'.underline': { |
|||
borderWidth: variables.borderWidth * 2, |
|||
borderTopWidth: 0, |
|||
borderRightWidth: 0, |
|||
borderLeftWidth: 0, |
|||
borderColor: variables.inputSuccessBorderColor, |
|||
}, |
|||
borderColor: variables.inputSuccessBorderColor, |
|||
}, |
|||
|
|||
'.error': { |
|||
'NativeBase.Icon': { |
|||
color: variables.inputErrorBorderColor, |
|||
}, |
|||
'NativeBase.IconNB': { |
|||
color: variables.inputErrorBorderColor, |
|||
}, |
|||
'.rounded': { |
|||
borderRadius: 30, |
|||
borderColor: variables.inputErrorBorderColor, |
|||
}, |
|||
'.regular': { |
|||
borderColor: variables.inputErrorBorderColor, |
|||
}, |
|||
'.underline': { |
|||
borderWidth: variables.borderWidth * 2, |
|||
borderTopWidth: 0, |
|||
borderRightWidth: 0, |
|||
borderLeftWidth: 0, |
|||
borderColor: variables.inputErrorBorderColor, |
|||
}, |
|||
borderColor: variables.inputErrorBorderColor, |
|||
}, |
|||
'.disabled': { |
|||
'NativeBase.Icon': { |
|||
color: '#384850', |
|||
}, |
|||
'NativeBase.IconNB': { |
|||
color: '#384850', |
|||
}, |
|||
}, |
|||
'.picker': { |
|||
marginLeft: 0, |
|||
}, |
|||
|
|||
borderWidth: variables.borderWidth * 2, |
|||
borderTopWidth: 0, |
|||
borderRightWidth: 0, |
|||
borderLeftWidth: 0, |
|||
borderColor: variables.inputBorderColor, |
|||
backgroundColor: 'transparent', |
|||
flexDirection: 'row', |
|||
alignItems: 'center', |
|||
marginLeft: 2, |
|||
}; |
|||
|
|||
return itemTheme; |
|||
}; |
|||
@ -1,15 +0,0 @@ |
|||
// @flow
|
|||
|
|||
export default () => { |
|||
const labelTheme = { |
|||
'.focused': { |
|||
width: 0, |
|||
}, |
|||
'.textPrimary': { |
|||
color: 'gray', |
|||
}, |
|||
fontSize: 17, |
|||
}; |
|||
|
|||
return labelTheme; |
|||
}; |
|||
@ -1,11 +0,0 @@ |
|||
// @flow
|
|||
|
|||
export default () => { |
|||
const leftTheme = { |
|||
flex: 1, |
|||
alignSelf: 'center', |
|||
alignItems: 'flex-start', |
|||
}; |
|||
|
|||
return leftTheme; |
|||
}; |
|||
@ -1,441 +0,0 @@ |
|||
// @flow
|
|||
|
|||
import { Platform, PixelRatio } from 'react-native'; |
|||
|
|||
import pickerTheme from './Picker'; |
|||
import variable from '../variables/Platform'; |
|||
import { PLATFORM } from '../variables/CommonColor'; |
|||
|
|||
export default (variables /* : * */ = variable) => { |
|||
const { platform } = variables; |
|||
const selectedStyle = { |
|||
'NativeBase.Text': { |
|||
color: variables.listItemSelected, |
|||
}, |
|||
'NativeBase.Icon': { |
|||
color: variables.listItemSelected, |
|||
}, |
|||
}; |
|||
|
|||
const listItemTheme = { |
|||
'NativeBase.InputGroup': { |
|||
'NativeBase.Icon': { |
|||
paddingRight: 5, |
|||
}, |
|||
'NativeBase.IconNB': { |
|||
paddingRight: 5, |
|||
}, |
|||
'NativeBase.Input': { |
|||
paddingHorizontal: 5, |
|||
}, |
|||
flex: 1, |
|||
borderWidth: null, |
|||
margin: -10, |
|||
borderBottomColor: 'transparent', |
|||
}, |
|||
'.searchBar': { |
|||
'NativeBase.Item': { |
|||
'NativeBase.Icon': { |
|||
backgroundColor: 'transparent', |
|||
color: variables.dropdownLinkColor, |
|||
fontSize: |
|||
platform === PLATFORM.IOS ? variables.iconFontSize - 10 : variables.iconFontSize - 5, |
|||
alignItems: 'center', |
|||
marginTop: 2, |
|||
paddingRight: 8, |
|||
}, |
|||
'NativeBase.IconNB': { |
|||
backgroundColor: 'transparent', |
|||
color: null, |
|||
alignSelf: 'center', |
|||
}, |
|||
'NativeBase.Input': { |
|||
alignSelf: 'center', |
|||
}, |
|||
alignSelf: 'center', |
|||
alignItems: 'center', |
|||
justifyContent: 'flex-start', |
|||
flex: 1, |
|||
height: platform === PLATFORM.IOS ? 30 : 40, |
|||
borderColor: 'transparent', |
|||
backgroundColor: '#fff', |
|||
borderRadius: 5, |
|||
}, |
|||
'NativeBase.Button': { |
|||
'.transparent': { |
|||
'NativeBase.Text': { |
|||
fontWeight: '500', |
|||
}, |
|||
paddingHorizontal: null, |
|||
paddingLeft: platform === PLATFORM.IOS ? 10 : null, |
|||
}, |
|||
paddingHorizontal: platform === PLATFORM.IOS ? undefined : null, |
|||
width: platform === PLATFORM.IOS ? undefined : 0, |
|||
height: platform === PLATFORM.IOS ? undefined : 0, |
|||
}, |
|||
backgroundColor: variables.toolbarInputColor, |
|||
padding: 10, |
|||
marginLeft: null, |
|||
}, |
|||
'NativeBase.CheckBox': { |
|||
marginLeft: -10, |
|||
marginRight: 10, |
|||
}, |
|||
'.first': { |
|||
'.itemHeader': { |
|||
paddingTop: variables.listItemPadding + 3, |
|||
}, |
|||
}, |
|||
'.itemHeader': { |
|||
'.first': { |
|||
paddingTop: variables.listItemPadding + 3, |
|||
}, |
|||
borderBottomWidth: platform === PLATFORM.IOS ? variables.borderWidth : null, |
|||
marginLeft: null, |
|||
padding: variables.listItemPadding, |
|||
paddingLeft: variables.listItemPadding + 5, |
|||
paddingTop: platform === PLATFORM.IOS ? variables.listItemPadding + 25 : undefined, |
|||
paddingBottom: platform === PLATFORM.ANDROID ? variables.listItemPadding + 20 : undefined, |
|||
flexDirection: 'row', |
|||
borderColor: variables.listBorderColor, |
|||
'NativeBase.Text': { |
|||
fontSize: 14, |
|||
color: platform === PLATFORM.IOS ? undefined : variables.listNoteColor, |
|||
}, |
|||
}, |
|||
'.itemDivider': { |
|||
borderBottomWidth: null, |
|||
marginLeft: null, |
|||
padding: variables.listItemPadding, |
|||
paddingLeft: variables.listItemPadding + 5, |
|||
backgroundColor: variables.listDividerBg, |
|||
flexDirection: 'row', |
|||
borderColor: variables.listBorderColor, |
|||
}, |
|||
'.selected': { |
|||
'NativeBase.Left': { |
|||
...selectedStyle, |
|||
}, |
|||
'NativeBase.Body': { |
|||
...selectedStyle, |
|||
}, |
|||
'NativeBase.Right': { |
|||
...selectedStyle, |
|||
}, |
|||
...selectedStyle, |
|||
}, |
|||
'NativeBase.Left': { |
|||
'NativeBase.Body': { |
|||
'NativeBase.Text': { |
|||
'.note': { |
|||
color: variables.listNoteColor, |
|||
fontWeight: '200', |
|||
}, |
|||
fontWeight: '600', |
|||
}, |
|||
marginLeft: 10, |
|||
alignItems: null, |
|||
alignSelf: null, |
|||
}, |
|||
'NativeBase.Icon': { |
|||
width: variables.iconFontSize - 10, |
|||
fontSize: variables.iconFontSize - 10, |
|||
}, |
|||
'NativeBase.IconNB': { |
|||
width: variables.iconFontSize - 10, |
|||
fontSize: variables.iconFontSize - 10, |
|||
}, |
|||
'NativeBase.Text': { |
|||
alignSelf: 'center', |
|||
}, |
|||
flexDirection: 'row', |
|||
}, |
|||
'NativeBase.Body': { |
|||
'NativeBase.Text': { |
|||
marginHorizontal: variables.listItemPadding, |
|||
'.note': { |
|||
color: variables.listNoteColor, |
|||
fontWeight: '200', |
|||
}, |
|||
}, |
|||
alignSelf: null, |
|||
alignItems: null, |
|||
}, |
|||
'NativeBase.Right': { |
|||
'NativeBase.Badge': { |
|||
alignSelf: null, |
|||
}, |
|||
'NativeBase.PickerNB': { |
|||
'NativeBase.Button': { |
|||
marginRight: -15, |
|||
'NativeBase.Text': { |
|||
color: variables.topTabBarActiveTextColor, |
|||
}, |
|||
}, |
|||
}, |
|||
'NativeBase.Button': { |
|||
alignSelf: null, |
|||
'.transparent': { |
|||
'NativeBase.Text': { |
|||
color: variables.topTabBarActiveTextColor, |
|||
}, |
|||
}, |
|||
}, |
|||
'NativeBase.Icon': { |
|||
alignSelf: null, |
|||
fontSize: variables.iconFontSize - 8, |
|||
color: '#c9c8cd', |
|||
}, |
|||
'NativeBase.IconNB': { |
|||
alignSelf: null, |
|||
fontSize: variables.iconFontSize - 8, |
|||
color: '#c9c8cd', |
|||
}, |
|||
'NativeBase.Text': { |
|||
'.note': { |
|||
color: variables.listNoteColor, |
|||
fontWeight: '200', |
|||
}, |
|||
alignSelf: null, |
|||
}, |
|||
'NativeBase.Thumbnail': { |
|||
alignSelf: null, |
|||
}, |
|||
'NativeBase.Image': { |
|||
alignSelf: null, |
|||
}, |
|||
'NativeBase.Radio': { |
|||
alignSelf: null, |
|||
}, |
|||
'NativeBase.Checkbox': { |
|||
alignSelf: null, |
|||
}, |
|||
'NativeBase.Switch': { |
|||
alignSelf: null, |
|||
}, |
|||
padding: null, |
|||
flex: 0.28, |
|||
}, |
|||
'NativeBase.Text': { |
|||
'.note': { |
|||
color: variables.listNoteColor, |
|||
fontWeight: '200', |
|||
}, |
|||
alignSelf: 'center', |
|||
}, |
|||
'.last': { |
|||
marginLeft: -(variables.listItemPadding + 5), |
|||
paddingLeft: (variables.listItemPadding + 5) * 2, |
|||
top: 1, |
|||
}, |
|||
'.avatar': { |
|||
'NativeBase.Left': { |
|||
flex: 0, |
|||
alignSelf: 'flex-start', |
|||
paddingTop: 14, |
|||
}, |
|||
'NativeBase.Body': { |
|||
'NativeBase.Text': { |
|||
marginLeft: null, |
|||
}, |
|||
flex: 1, |
|||
paddingVertical: variables.listItemPadding, |
|||
borderBottomWidth: variables.borderWidth, |
|||
borderColor: variables.listBorderColor, |
|||
marginLeft: variables.listItemPadding + 5, |
|||
}, |
|||
'NativeBase.Right': { |
|||
'NativeBase.Text': { |
|||
'.note': { |
|||
fontSize: variables.noteFontSize - 2, |
|||
}, |
|||
}, |
|||
flex: 0, |
|||
paddingRight: variables.listItemPadding + 5, |
|||
alignSelf: 'stretch', |
|||
paddingVertical: variables.listItemPadding, |
|||
borderBottomWidth: variables.borderWidth, |
|||
borderColor: variables.listBorderColor, |
|||
}, |
|||
'.noBorder': { |
|||
'NativeBase.Body': { |
|||
borderBottomWidth: null, |
|||
}, |
|||
'NativeBase.Right': { |
|||
borderBottomWidth: null, |
|||
}, |
|||
}, |
|||
borderBottomWidth: null, |
|||
paddingVertical: null, |
|||
paddingRight: null, |
|||
}, |
|||
'.thumbnail': { |
|||
'NativeBase.Left': { |
|||
flex: 0, |
|||
}, |
|||
'NativeBase.Body': { |
|||
'NativeBase.Text': { |
|||
marginLeft: null, |
|||
}, |
|||
flex: 1, |
|||
paddingVertical: variables.listItemPadding + 8, |
|||
borderBottomWidth: variables.borderWidth, |
|||
borderColor: variables.listBorderColor, |
|||
marginLeft: variables.listItemPadding + 5, |
|||
}, |
|||
'NativeBase.Right': { |
|||
'NativeBase.Button': { |
|||
'.transparent': { |
|||
'NativeBase.Text': { |
|||
fontSize: variables.listNoteSize, |
|||
color: variables.sTabBarActiveTextColor, |
|||
}, |
|||
}, |
|||
height: null, |
|||
}, |
|||
flex: 0, |
|||
justifyContent: 'center', |
|||
alignSelf: 'stretch', |
|||
paddingRight: variables.listItemPadding + 5, |
|||
paddingVertical: variables.listItemPadding + 5, |
|||
borderBottomWidth: variables.borderWidth, |
|||
borderColor: variables.listBorderColor, |
|||
}, |
|||
'.noBorder': { |
|||
'NativeBase.Body': { |
|||
borderBottomWidth: null, |
|||
}, |
|||
'NativeBase.Right': { |
|||
borderBottomWidth: null, |
|||
}, |
|||
}, |
|||
borderBottomWidth: null, |
|||
paddingVertical: null, |
|||
paddingRight: null, |
|||
}, |
|||
'.icon': { |
|||
'.last': { |
|||
'NativeBase.Body': { |
|||
borderBottomWidth: null, |
|||
}, |
|||
'NativeBase.Right': { |
|||
borderBottomWidth: null, |
|||
}, |
|||
borderBottomWidth: variables.borderWidth, |
|||
borderColor: variables.listBorderColor, |
|||
}, |
|||
'NativeBase.Left': { |
|||
'NativeBase.Button': { |
|||
'NativeBase.IconNB': { |
|||
marginHorizontal: null, |
|||
fontSize: variables.iconFontSize - 5, |
|||
}, |
|||
'NativeBase.Icon': { |
|||
marginHorizontal: null, |
|||
fontSize: variables.iconFontSize - 8, |
|||
}, |
|||
alignSelf: 'center', |
|||
height: 29, |
|||
width: 29, |
|||
borderRadius: 6, |
|||
paddingVertical: null, |
|||
paddingHorizontal: null, |
|||
alignItems: 'center', |
|||
justifyContent: 'center', |
|||
}, |
|||
'NativeBase.Icon': { |
|||
width: variables.iconFontSize - 5, |
|||
fontSize: variables.iconFontSize - 2, |
|||
}, |
|||
'NativeBase.IconNB': { |
|||
width: variables.iconFontSize - 5, |
|||
fontSize: variables.iconFontSize - 2, |
|||
}, |
|||
paddingRight: variables.listItemPadding + 5, |
|||
flex: 0, |
|||
height: 44, |
|||
justifyContent: 'center', |
|||
alignItems: 'center', |
|||
}, |
|||
'NativeBase.Body': { |
|||
'NativeBase.Text': { |
|||
marginLeft: null, |
|||
fontSize: 17, |
|||
}, |
|||
flex: 1, |
|||
height: 44, |
|||
justifyContent: 'center', |
|||
borderBottomWidth: 1 / PixelRatio.getPixelSizeForLayoutSize(1), |
|||
borderColor: variables.listBorderColor, |
|||
}, |
|||
'NativeBase.Right': { |
|||
'NativeBase.Text': { |
|||
textAlign: 'center', |
|||
color: '#8F8E95', |
|||
fontSize: 17, |
|||
}, |
|||
'NativeBase.IconNB': { |
|||
color: '#C8C7CC', |
|||
fontSize: variables.iconFontSize - 10, |
|||
alignSelf: 'center', |
|||
paddingLeft: 10, |
|||
paddingTop: 3, |
|||
}, |
|||
'NativeBase.Icon': { |
|||
color: '#C8C7CC', |
|||
fontSize: variables.iconFontSize - 10, |
|||
alignSelf: 'center', |
|||
paddingLeft: 10, |
|||
paddingTop: 3, |
|||
}, |
|||
'NativeBase.Switch': { |
|||
marginRight: Platform.OS === PLATFORM.IOS ? undefined : -5, |
|||
alignSelf: null, |
|||
}, |
|||
'NativeBase.PickerNB': { |
|||
...pickerTheme(), |
|||
}, |
|||
flexDirection: 'row', |
|||
alignItems: 'center', |
|||
flex: 0, |
|||
alignSelf: 'stretch', |
|||
height: 44, |
|||
justifyContent: 'flex-end', |
|||
borderBottomWidth: 1 / PixelRatio.getPixelSizeForLayoutSize(1), |
|||
borderColor: variables.listBorderColor, |
|||
paddingRight: variables.listItemPadding + 5, |
|||
}, |
|||
'.noBorder': { |
|||
'NativeBase.Body': { |
|||
borderBottomWidth: null, |
|||
}, |
|||
'NativeBase.Right': { |
|||
borderBottomWidth: null, |
|||
}, |
|||
}, |
|||
borderBottomWidth: null, |
|||
paddingVertical: null, |
|||
paddingRight: null, |
|||
height: 44, |
|||
justifyContent: 'center', |
|||
}, |
|||
'.noBorder': { |
|||
borderBottomWidth: null, |
|||
}, |
|||
'.noIndent': { |
|||
marginLeft: null, |
|||
padding: variables.listItemPadding, |
|||
paddingLeft: variables.listItemPadding + 6, |
|||
}, |
|||
alignItems: 'center', |
|||
flexDirection: 'row', |
|||
paddingRight: variables.listItemPadding + 6, |
|||
paddingVertical: variables.listItemPadding + 3, |
|||
marginLeft: variables.listItemPadding + 6, |
|||
borderBottomWidth: 1 / PixelRatio.getPixelSizeForLayoutSize(1), |
|||
backgroundColor: variables.listBg, |
|||
borderColor: variables.listBorderColor, |
|||
}; |
|||
|
|||
return listItemTheme; |
|||
}; |
|||
@ -1,14 +0,0 @@ |
|||
// @flow
|
|||
|
|||
export default () => { |
|||
const pickerTheme = { |
|||
'.note': { |
|||
color: '#8F8E95', |
|||
}, |
|||
// width: 90,
|
|||
marginRight: -4, |
|||
flexGrow: 1, |
|||
}; |
|||
|
|||
return pickerTheme; |
|||
}; |
|||
@ -1,7 +0,0 @@ |
|||
// @flow
|
|||
|
|||
export default () => { |
|||
const pickerTheme = {}; |
|||
|
|||
return pickerTheme; |
|||
}; |
|||
@ -1,14 +0,0 @@ |
|||
// @flow
|
|||
|
|||
export default () => { |
|||
const pickerTheme = { |
|||
'.note': { |
|||
color: '#8F8E95', |
|||
}, |
|||
// width: 90,
|
|||
marginRight: -4, |
|||
flexGrow: 1, |
|||
}; |
|||
|
|||
return pickerTheme; |
|||
}; |
|||
@ -1,26 +0,0 @@ |
|||
// @flow
|
|||
|
|||
import { Platform } from 'react-native'; |
|||
|
|||
import variable from '../variables/Platform'; |
|||
import { PLATFORM } from '../variables/CommonColor'; |
|||
|
|||
export default (variables /* : * */ = variable) => { |
|||
const radioTheme = { |
|||
'.selected': { |
|||
'NativeBase.IconNB': { |
|||
color: |
|||
Platform.OS === PLATFORM.IOS ? variables.radioColor : variables.radioSelectedColorAndroid, |
|||
lineHeight: Platform.OS === PLATFORM.IOS ? 25 : variables.radioBtnLineHeight, |
|||
height: Platform.OS === PLATFORM.IOS ? 20 : undefined, |
|||
}, |
|||
}, |
|||
'NativeBase.IconNB': { |
|||
color: Platform.OS === PLATFORM.IOS ? 'transparent' : undefined, |
|||
lineHeight: Platform.OS === PLATFORM.IOS ? undefined : variables.radioBtnLineHeight, |
|||
fontSize: Platform.OS === PLATFORM.IOS ? undefined : variables.radioBtnSize, |
|||
}, |
|||
}; |
|||
|
|||
return radioTheme; |
|||
}; |
|||
@ -1,14 +0,0 @@ |
|||
// @flow
|
|||
|
|||
export default () => { |
|||
const rightTheme = { |
|||
'NativeBase.Button': { |
|||
alignSelf: null, |
|||
}, |
|||
flex: 1, |
|||
alignSelf: 'center', |
|||
alignItems: 'flex-end', |
|||
}; |
|||
|
|||
return rightTheme; |
|||
}; |
|||
@ -1,57 +0,0 @@ |
|||
// @flow
|
|||
|
|||
import variable from '../variables/Platform'; |
|||
import { PLATFORM } from '../variables/CommonColor'; |
|||
|
|||
export default (variables /* : * */ = variable) => { |
|||
const { platform } = variables; |
|||
|
|||
const segmentTheme = { |
|||
height: 45, |
|||
borderColor: variables.segmentBorderColorMain, |
|||
flexDirection: 'row', |
|||
justifyContent: 'center', |
|||
backgroundColor: variables.segmentBackgroundColor, |
|||
'NativeBase.Button': { |
|||
alignSelf: 'center', |
|||
borderRadius: 0, |
|||
paddingTop: 3, |
|||
paddingBottom: 3, |
|||
height: 30, |
|||
backgroundColor: 'transparent', |
|||
borderWidth: 1, |
|||
borderLeftWidth: 0, |
|||
borderColor: variables.segmentBorderColor, |
|||
elevation: 0, |
|||
'.active': { |
|||
backgroundColor: variables.segmentActiveBackgroundColor, |
|||
'NativeBase.Text': { |
|||
color: variables.segmentActiveTextColor, |
|||
}, |
|||
'NativeBase.Icon': { |
|||
color: variables.segmentActiveTextColor, |
|||
}, |
|||
}, |
|||
'.first': { |
|||
borderTopLeftRadius: platform === PLATFORM.IOS ? 5 : undefined, |
|||
borderBottomLeftRadius: platform === PLATFORM.IOS ? 5 : undefined, |
|||
borderLeftWidth: 1, |
|||
}, |
|||
'.last': { |
|||
borderTopRightRadius: platform === PLATFORM.IOS ? 5 : undefined, |
|||
borderBottomRightRadius: platform === PLATFORM.IOS ? 5 : undefined, |
|||
}, |
|||
'NativeBase.Text': { |
|||
color: variables.segmentTextColor, |
|||
fontSize: 14, |
|||
}, |
|||
'NativeBase.Icon': { |
|||
fontSize: 22, |
|||
paddingTop: 0, |
|||
color: variables.segmentTextColor, |
|||
}, |
|||
}, |
|||
}; |
|||
|
|||
return segmentTheme; |
|||
}; |
|||
@ -1,49 +0,0 @@ |
|||
// @flow
|
|||
|
|||
import variable from '../variables/Platform'; |
|||
|
|||
export default (variables /* : * */ = variable) => { |
|||
const theme = { |
|||
'.group': { |
|||
height: 50, |
|||
paddingVertical: variables.listItemPadding - 8, |
|||
paddingTop: variables.listItemPadding + 12, |
|||
'.bordered': { |
|||
height: 50, |
|||
paddingVertical: variables.listItemPadding - 8, |
|||
paddingTop: variables.listItemPadding + 12, |
|||
}, |
|||
}, |
|||
'.bordered': { |
|||
'.noTopBorder': { |
|||
borderTopWidth: 0, |
|||
}, |
|||
'.noBottomBorder': { |
|||
borderBottomWidth: 0, |
|||
}, |
|||
height: 35, |
|||
paddingTop: variables.listItemPadding + 2, |
|||
paddingBottom: variables.listItemPadding, |
|||
borderBottomWidth: variables.borderWidth, |
|||
borderTopWidth: variables.borderWidth, |
|||
borderColor: variables.listBorderColor, |
|||
}, |
|||
'NativeBase.Text': { |
|||
fontSize: variables.tabBarTextSize - 2, |
|||
color: '#777', |
|||
}, |
|||
'.noTopBorder': { |
|||
borderTopWidth: 0, |
|||
}, |
|||
'.noBottomBorder': { |
|||
borderBottomWidth: 0, |
|||
}, |
|||
height: 38, |
|||
backgroundColor: '#F0EFF5', |
|||
flex: 1, |
|||
justifyContent: 'center', |
|||
paddingLeft: variables.listItemPadding + 5, |
|||
}; |
|||
|
|||
return theme; |
|||
}; |
|||
@ -1,9 +0,0 @@ |
|||
// @flow
|
|||
|
|||
export default () => { |
|||
const spinnerTheme = { |
|||
height: 80, |
|||
}; |
|||
|
|||
return spinnerTheme; |
|||
}; |
|||
@ -1,19 +0,0 @@ |
|||
// @flow
|
|||
|
|||
import { Platform } from 'react-native'; |
|||
|
|||
import variable from '../variables/Platform'; |
|||
import { PLATFORM } from '../variables/CommonColor'; |
|||
|
|||
export default (variables /* : * */ = variable) => { |
|||
const subtitleTheme = { |
|||
fontSize: variables.subTitleFontSize, |
|||
fontFamily: variables.titleFontfamily, |
|||
color: variables.subtitleColor, |
|||
textAlign: 'center', |
|||
paddingLeft: Platform.OS === PLATFORM.IOS ? 4 : 0, |
|||
marginLeft: Platform.OS === PLATFORM.IOS ? undefined : -3, |
|||
}; |
|||
|
|||
return subtitleTheme; |
|||
}; |
|||
@ -1,46 +0,0 @@ |
|||
// @flow
|
|||
|
|||
export default () => { |
|||
const swipeRowTheme = { |
|||
'NativeBase.ListItem': { |
|||
'.list': { |
|||
backgroundColor: '#FFF', |
|||
}, |
|||
marginLeft: 0, |
|||
}, |
|||
'NativeBase.Left': { |
|||
flex: 0, |
|||
alignSelf: null, |
|||
alignItems: null, |
|||
'NativeBase.Button': { |
|||
flex: 1, |
|||
alignItems: 'center', |
|||
justifyContent: 'center', |
|||
alignSelf: 'stretch', |
|||
borderRadius: 0, |
|||
}, |
|||
}, |
|||
'NativeBase.Right': { |
|||
flex: 0, |
|||
alignSelf: null, |
|||
alignItems: null, |
|||
'NativeBase.Button': { |
|||
flex: 1, |
|||
alignItems: 'center', |
|||
justifyContent: 'center', |
|||
alignSelf: 'stretch', |
|||
borderRadius: 0, |
|||
}, |
|||
}, |
|||
'NativeBase.Button': { |
|||
flex: 1, |
|||
height: null, |
|||
alignItems: 'center', |
|||
justifyContent: 'center', |
|||
alignSelf: 'stretch', |
|||
borderRadius: 0, |
|||
}, |
|||
}; |
|||
|
|||
return swipeRowTheme; |
|||
}; |
|||
@ -1,9 +0,0 @@ |
|||
// @flow
|
|||
|
|||
export default () => { |
|||
const switchTheme = { |
|||
marginVertical: -5, |
|||
}; |
|||
|
|||
return switchTheme; |
|||
}; |
|||
@ -1,10 +0,0 @@ |
|||
// @flow
|
|||
|
|||
export default () => { |
|||
const tabTheme = { |
|||
flex: 1, |
|||
backgroundColor: '#FFF', |
|||
}; |
|||
|
|||
return tabTheme; |
|||
}; |
|||
Some files were not shown because too many files changed in this diff
Loading…
Reference in new issue