66 lines
1.3 KiB
TypeScript
66 lines
1.3 KiB
TypeScript
|
|
/**
|
||
|
|
* Loading 加载组件
|
||
|
|
* 支持不同尺寸、全屏模式
|
||
|
|
*/
|
||
|
|
|
||
|
|
import React from 'react';
|
||
|
|
import { View, ActivityIndicator, StyleSheet, ViewStyle } from 'react-native';
|
||
|
|
import { colors } from '../../theme';
|
||
|
|
|
||
|
|
type LoadingSize = 'sm' | 'md' | 'lg';
|
||
|
|
|
||
|
|
interface LoadingProps {
|
||
|
|
size?: LoadingSize;
|
||
|
|
color?: string;
|
||
|
|
fullScreen?: boolean;
|
||
|
|
style?: ViewStyle;
|
||
|
|
}
|
||
|
|
|
||
|
|
const Loading: React.FC<LoadingProps> = ({
|
||
|
|
size = 'md',
|
||
|
|
color = colors.primary.main,
|
||
|
|
fullScreen = false,
|
||
|
|
style,
|
||
|
|
}) => {
|
||
|
|
const getSize = (): 'small' | 'large' | undefined => {
|
||
|
|
switch (size) {
|
||
|
|
case 'sm':
|
||
|
|
return 'small';
|
||
|
|
case 'lg':
|
||
|
|
return 'large';
|
||
|
|
default:
|
||
|
|
return undefined;
|
||
|
|
}
|
||
|
|
};
|
||
|
|
|
||
|
|
if (fullScreen) {
|
||
|
|
return (
|
||
|
|
<View style={[styles.fullScreen, style]}>
|
||
|
|
<ActivityIndicator size={getSize()} color={color} />
|
||
|
|
</View>
|
||
|
|
);
|
||
|
|
}
|
||
|
|
|
||
|
|
return (
|
||
|
|
<View style={[styles.container, style]}>
|
||
|
|
<ActivityIndicator size={getSize()} color={color} />
|
||
|
|
</View>
|
||
|
|
);
|
||
|
|
};
|
||
|
|
|
||
|
|
const styles = StyleSheet.create({
|
||
|
|
container: {
|
||
|
|
padding: 20,
|
||
|
|
alignItems: 'center',
|
||
|
|
justifyContent: 'center',
|
||
|
|
},
|
||
|
|
fullScreen: {
|
||
|
|
flex: 1,
|
||
|
|
alignItems: 'center',
|
||
|
|
justifyContent: 'center',
|
||
|
|
backgroundColor: colors.background.default,
|
||
|
|
},
|
||
|
|
});
|
||
|
|
|
||
|
|
export default Loading;
|