Files
mattermost-mobile/app/utils/buttonStyles.ts
Daniel Espino García 5fae120826 Add support for review app (#6772)
* Add app review

* Use overlay instead of modal

* Add fixes for ios

* i18n-extract

* Add to milliseconds function

* Address review feedback

* Add try to queryGlobalValue

* added app review illustration

* add feedback illustration

* Add animations and feedback bot message

* Restrict reviews to build environment variable

* Fix bug with "dont ask anymore"

* Add check for only supported servers

* Add missing change

* Use for await

Co-authored-by: Daniel Espino <danielespino@MacBook-Pro-de-Daniel.local>
Co-authored-by: Matthew Birtch <mattbirtch@gmail.com>
2022-11-24 18:52:15 +01:00

420 lines
14 KiB
TypeScript

// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
// See LICENSE.txt for license information.
import {StyleProp, StyleSheet, TextStyle, ViewStyle} from 'react-native';
import {blendColors, changeOpacity} from '@utils/theme';
/**
* Returns the appropriate Style object for <View style={} />
*
*
* @param theme
* @param size
* @param emphasis
* @param type
* @param state
* @returns
*/
export const buttonBackgroundStyle = (
theme: Theme,
size: ButtonSize = 'm',
emphasis: ButtonEmphasis = 'primary',
type: ButtonType = 'default',
state: ButtonState = 'default',
): StyleProp<ViewStyle> => {
const styles = StyleSheet.create({
main: {
flex: 0,
alignItems: 'center',
justifyContent: 'center',
borderRadius: 4,
},
fullWidth: {
width: '100%',
},
});
const backgroundStyles: BackgroundStyles = {
primary: {
default: {
default: {
backgroundColor: theme.buttonBg,
},
hover: {
backgroundColor: blendColors(theme.buttonBg, '#000000', 0.08),
},
active: {
backgroundColor: blendColors(theme.buttonBg, '#000000', 0.16),
},
focus: {
backgroundColor: theme.buttonBg,
borderColor: changeOpacity('#FFFFFF', 0.32),
borderWidth: 2,
},
},
destructive: {
default: {
backgroundColor: theme.errorTextColor,
},
hover: {
backgroundColor: blendColors(theme.errorTextColor, '#000000', 0.08),
},
active: {
backgroundColor: blendColors(theme.errorTextColor, '#000000', 0.16),
},
focus: {
backgroundColor: theme.errorTextColor,
borderColor: changeOpacity('#FFFFFF', 0.32),
borderWidth: 2,
},
},
inverted: {
default: {
backgroundColor: theme.buttonColor,
},
hover: {
backgroundColor: blendColors(theme.buttonColor, '#000000', 0.08),
},
active: {
backgroundColor: blendColors(theme.buttonColor, '#000000', 0.16),
},
focus: {
backgroundColor: theme.buttonColor,
borderColor: changeOpacity('#FFFFFF', 0.32),
borderWidth: 2,
},
},
disabled: {
default: {
backgroundColor: changeOpacity(theme.centerChannelColor, 0.08),
},
hover: {
backgroundColor: changeOpacity(theme.centerChannelColor, 0.08),
},
active: {
backgroundColor: changeOpacity(theme.centerChannelColor, 0.08),
},
focus: {
backgroundColor: changeOpacity(theme.centerChannelColor, 0.08),
},
},
},
secondary: {
default: {
default: {
backgroundColor: changeOpacity(theme.buttonBg, 0),
borderColor: theme.buttonBg,
borderWidth: 1,
},
hover: {
backgroundColor: changeOpacity(theme.buttonBg, 0.08),
borderColor: theme.buttonBg,
borderWidth: 1,
},
active: {
backgroundColor: changeOpacity(theme.buttonBg, 0.16),
borderColor: theme.buttonBg,
borderWidth: 1,
},
focus: {
backgroundColor: changeOpacity(theme.buttonBg, 0),
borderColor: theme.sidebarTextActiveBorder,
borderWidth: 2,
},
},
destructive: {
default: {
backgroundColor: changeOpacity(theme.errorTextColor, 0),
borderColor: theme.errorTextColor,
borderWidth: 1,
},
hover: {
backgroundColor: changeOpacity(theme.errorTextColor, 0.08),
borderColor: theme.errorTextColor,
borderWidth: 1,
},
active: {
backgroundColor: changeOpacity(theme.errorTextColor, 0.16),
borderColor: theme.errorTextColor,
borderWidth: 1,
},
focus: {
backgroundColor: changeOpacity(theme.errorTextColor, 0),
borderColor: changeOpacity(theme.errorTextColor, 0.68), // @to-do; needs 32% white?
borderWidth: 2,
},
},
inverted: {
default: {
backgroundColor: changeOpacity(theme.buttonColor, 0),
borderColor: theme.buttonColor,
borderWidth: 1,
},
hover: {
backgroundColor: changeOpacity(theme.buttonColor, 0.08),
borderColor: theme.buttonColor,
borderWidth: 1,
},
active: {
backgroundColor: changeOpacity(theme.buttonColor, 0.16),
borderColor: theme.buttonColor,
borderWidth: 1,
},
focus: {
backgroundColor: changeOpacity(theme.buttonColor, 0),
borderColor: theme.sidebarTextActiveBorder,
borderWidth: 2,
},
},
disabled: {
default: {
backgroundColor: changeOpacity(theme.centerChannelColor, 0),
borderColor: changeOpacity(theme.centerChannelColor, 0.32),
borderWidth: 1,
},
hover: {
backgroundColor: changeOpacity(theme.centerChannelColor, 0),
borderColor: changeOpacity(theme.centerChannelColor, 0.32),
borderWidth: 1,
},
active: {
backgroundColor: changeOpacity(theme.centerChannelColor, 0),
borderColor: changeOpacity(theme.centerChannelColor, 0.32),
borderWidth: 1,
},
focus: {
backgroundColor: changeOpacity(theme.centerChannelColor, 0),
borderColor: changeOpacity(theme.centerChannelColor, 0.32),
borderWidth: 1,
},
},
},
tertiary: {
default: {
default: {
backgroundColor: changeOpacity(theme.buttonBg, 0.08),
},
hover: {
backgroundColor: changeOpacity(theme.buttonBg, 0.12),
},
active: {
backgroundColor: changeOpacity(theme.buttonBg, 0.16),
},
focus: {
backgroundColor: changeOpacity(theme.buttonBg, 0.08),
borderColor: theme.sidebarTextActiveBorder,
borderWidth: 2,
},
},
destructive: {
default: {
backgroundColor: changeOpacity(theme.errorTextColor, 0.08),
},
hover: {
backgroundColor: changeOpacity(theme.errorTextColor, 0.12),
},
active: {
backgroundColor: changeOpacity(theme.errorTextColor, 0.16),
},
focus: {
backgroundColor: changeOpacity(theme.errorTextColor, 0.08),
borderColor: changeOpacity(theme.errorTextColor, 0.68), // @to-do; needs 32% white?
borderWidth: 2,
},
},
inverted: {
default: {
backgroundColor: changeOpacity(theme.sidebarText, 0.12),
},
hover: {
backgroundColor: changeOpacity(theme.sidebarText, 0.16),
},
active: {
backgroundColor: changeOpacity(theme.sidebarText, 0.24),
},
focus: {
backgroundColor: changeOpacity(theme.sidebarText, 0.08),
borderColor: theme.sidebarTextActiveBorder, // @to-do; needs 32% white?
borderWidth: 2,
},
},
disabled: {
default: {
backgroundColor: changeOpacity(theme.centerChannelColor, 0.08),
},
hover: {
backgroundColor: changeOpacity(theme.centerChannelColor, 0.08),
},
active: {
backgroundColor: changeOpacity(theme.centerChannelColor, 0.08),
},
focus: {
backgroundColor: changeOpacity(theme.centerChannelColor, 0.08),
},
},
},
link: {
default: {
default: {
backgroundColor: 'transparent',
},
hover: {
backgroundColor: 'transparent',
},
active: {
backgroundColor: 'transparent',
},
focus: {
backgroundColor: 'transparent',
},
},
inverted: {
default: {
backgroundColor: 'transparent',
},
hover: {
backgroundColor: 'transparent',
},
active: {
backgroundColor: 'transparent',
},
focus: {
backgroundColor: 'transparent',
},
},
disabled: {
default: {
backgroundColor: 'transparent',
},
hover: {
backgroundColor: 'transparent',
},
active: {
backgroundColor: 'transparent',
},
focus: {
backgroundColor: 'transparent',
},
},
destructive: {
default: {
backgroundColor: 'transparent',
},
hover: {
backgroundColor: 'transparent',
},
active: {
backgroundColor: 'transparent',
},
focus: {
backgroundColor: 'transparent',
},
},
},
};
const sizes: ButtonSizes = StyleSheet.create({
xs: {
height: 24,
paddingVertical: 6,
paddingHorizontal: 10,
},
s: {
height: 32,
paddingVertical: 10,
paddingHorizontal: 16,
},
m: {
height: 40,
paddingVertical: 12,
paddingHorizontal: 20,
},
lg: {
height: 48,
paddingVertical: 14,
paddingHorizontal: 24,
},
});
return StyleSheet.create([styles.main, sizes[size], backgroundStyles[emphasis][type][state]]);
};
/**
* Returns the appropriate TextStyle for the <Text style={} ...> object inside the button.
*
*
* @param theme
* @param size
* @param emphasis
* @param type
* @returns
*/
export const buttonTextStyle = (
theme: Theme,
size: ButtonSize = 'm',
emphasis: ButtonEmphasis = 'primary',
type: ButtonType = 'default',
): StyleProp<TextStyle> => {
// Color
let color: string = theme.buttonColor;
if (type === 'disabled') {
color = changeOpacity(theme.centerChannelColor, 0.32);
}
if ((type === 'destructive' && emphasis !== 'primary')) {
color = theme.errorTextColor;
}
if ((type === 'inverted' && emphasis === 'primary') ||
(type !== 'inverted' && emphasis !== 'primary')) {
color = theme.buttonBg;
}
if (type === 'inverted' && emphasis === 'tertiary') {
color = theme.sidebarText;
}
const styles = StyleSheet.create({
main: {
fontFamily: 'OpenSans-SemiBold',
fontWeight: '600',
textAlignVertical: 'center',
alignItems: 'center',
justifyContent: 'center',
padding: 1,
},
underline: {
textDecorationLine: 'underline',
},
});
const sizes = StyleSheet.create({
xs: {
fontSize: 11,
lineHeight: 10,
letterSpacing: 0.02,
marginTop: 2,
},
s: {
fontSize: 12,
lineHeight: 12,
marginTop: 1,
},
m: {
fontSize: 14,
lineHeight: 14,
marginTop: 3,
},
lg: {
fontSize: 16,
lineHeight: 18,
marginTop: 1,
},
});
return StyleSheet.create([styles.main, sizes[size], {color}]);
};