related-ui-components 2.0.5 → 2.0.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/module/components/Card/templates/SelaDealCard.js +80 -36
- package/lib/module/components/Card/templates/SelaDealCard.js.map +1 -1
- package/lib/typescript/src/components/Card/templates/SelaDealCard.d.ts.map +1 -1
- package/package.json +1 -1
- package/src/components/Card/templates/SelaDealCard.tsx +226 -162
|
@@ -1,44 +1,79 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
3
|
// src/components/SelaDealCard/SelaDealCard.tsx
|
|
4
|
-
import React from "react";
|
|
5
|
-
import { View, Text, StyleSheet
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
4
|
+
import React, { useState, useEffect } from "react"; // Import useState and useEffect
|
|
5
|
+
import { View, Text, StyleSheet, Image // Import Image
|
|
6
|
+
// Import LayoutChangeEvent
|
|
7
|
+
} from "react-native";
|
|
8
|
+
import Card from "../Card.js";
|
|
9
|
+
import { useTheme } from "../../../theme/ThemeContext.js";
|
|
9
10
|
import { LockOverlay } from "../../LockOverlay/index.js";
|
|
10
11
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
11
|
-
const SelaDealCard =
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
}
|
|
12
|
+
const SelaDealCard = props => {
|
|
13
|
+
const {
|
|
14
|
+
variant,
|
|
15
|
+
backgroundImage,
|
|
16
|
+
label,
|
|
17
|
+
labelStyle,
|
|
18
|
+
labelContainerStyle,
|
|
19
|
+
providerName,
|
|
20
|
+
providerNameStyle,
|
|
21
|
+
description,
|
|
22
|
+
descriptionStyle,
|
|
23
|
+
price,
|
|
24
|
+
priceStyle,
|
|
25
|
+
priceContainerStyle,
|
|
26
|
+
onPress,
|
|
27
|
+
style,
|
|
28
|
+
width = "100%",
|
|
29
|
+
// Default width, actual pixel width comes from layout
|
|
30
|
+
// props.height is the explicit height override
|
|
31
|
+
isRTL: propIsRTL,
|
|
32
|
+
borderRadius = 12,
|
|
33
|
+
darkOverlayEnabled = true,
|
|
34
|
+
darkOverlayColor = "rgba(0, 0, 0, 0.3)",
|
|
35
|
+
lockOverlay = false
|
|
36
|
+
} = props;
|
|
36
37
|
const {
|
|
37
38
|
theme,
|
|
38
39
|
isRTL: themeIsRTL
|
|
39
40
|
} = useTheme();
|
|
40
41
|
const isRTL = propIsRTL !== undefined ? propIsRTL : themeIsRTL;
|
|
42
|
+
const [actualCardWidth, setActualCardWidth] = useState(undefined);
|
|
43
|
+
const [dynamicHeight, setDynamicHeight] = useState(undefined);
|
|
44
|
+
useEffect(() => {
|
|
45
|
+
// Calculate dynamic height if no explicit height is provided via props,
|
|
46
|
+
// and we have the actual card width and a valid background image.
|
|
47
|
+
if (props.height === undefined && actualCardWidth && actualCardWidth > 0 && backgroundImage) {
|
|
48
|
+
const asset = Image.resolveAssetSource(backgroundImage);
|
|
49
|
+
if (asset && asset.width > 0 && asset.height > 0) {
|
|
50
|
+
const aspectRatio = asset.height / asset.width;
|
|
51
|
+
setDynamicHeight(actualCardWidth * aspectRatio);
|
|
52
|
+
} else {
|
|
53
|
+
// Fallback if image source is invalid or dimensions are zero
|
|
54
|
+
// (e.g., if it was a network URL and resolveAssetSource didn't work)
|
|
55
|
+
// You might want a default height or aspect ratio here.
|
|
56
|
+
setDynamicHeight(200); // Example fallback height
|
|
57
|
+
}
|
|
58
|
+
} else if (props.height !== undefined) {
|
|
59
|
+
// If an explicit height is provided, ensure dynamicHeight is not used.
|
|
60
|
+
setDynamicHeight(undefined);
|
|
61
|
+
}
|
|
62
|
+
}, [actualCardWidth, backgroundImage, props.height]);
|
|
63
|
+
const handleLayout = event => {
|
|
64
|
+
const newWidth = event.nativeEvent.layout.width;
|
|
65
|
+
if (newWidth > 0 && newWidth !== actualCardWidth) {
|
|
66
|
+
setActualCardWidth(newWidth);
|
|
67
|
+
}
|
|
68
|
+
};
|
|
69
|
+
|
|
70
|
+
// Use explicit props.height if provided, otherwise use the calculated dynamicHeight.
|
|
71
|
+
// Provide a minimum height for initial render or if dynamicHeight is still undefined.
|
|
72
|
+
const finalHeight = props.height !== undefined ? props.height : dynamicHeight !== undefined ? dynamicHeight : 150; // Minimum height before calculation or as fallback
|
|
73
|
+
|
|
41
74
|
const styles = getStyles(theme, isRTL);
|
|
75
|
+
|
|
76
|
+
// ... (rest of your style definitions: finalLabelContainerStyle, etc. remain the same)
|
|
42
77
|
const finalLabelContainerStyle = [styles.labelContainerBase, labelContainerStyle];
|
|
43
78
|
const finalLabelStyle = [styles.labelTextBase, labelStyle];
|
|
44
79
|
const finalPriceContainerStyle = [styles.priceContainerBase, variant === "horizontal" ? styles.priceContainerHorizontal : styles.priceContainerVertical, priceContainerStyle];
|
|
@@ -52,22 +87,27 @@ const SelaDealCard = ({
|
|
|
52
87
|
textAlign: isRTL ? "right" : "left"
|
|
53
88
|
}, descriptionStyle];
|
|
54
89
|
return /*#__PURE__*/_jsxs(Card, {
|
|
55
|
-
onPress: onPress
|
|
90
|
+
onPress: onPress
|
|
91
|
+
// onLayout={handleLayout} // Pass onLayout to Card to get its width
|
|
92
|
+
,
|
|
56
93
|
style: [styles.cardBase, {
|
|
57
94
|
borderRadius,
|
|
58
95
|
width,
|
|
59
|
-
height
|
|
60
|
-
},
|
|
96
|
+
height: finalHeight
|
|
97
|
+
},
|
|
98
|
+
// Use the calculated finalHeight
|
|
99
|
+
style],
|
|
61
100
|
backgroundImage: {
|
|
62
101
|
source: backgroundImage,
|
|
63
|
-
resizeMode: "cover"
|
|
102
|
+
resizeMode: "cover" // 'cover' will fill dimensions, 'contain' would show whole image
|
|
64
103
|
},
|
|
65
104
|
children: [darkOverlayEnabled && /*#__PURE__*/_jsx(View, {
|
|
66
105
|
style: [StyleSheet.absoluteFill, {
|
|
67
106
|
backgroundColor: darkOverlayColor
|
|
68
107
|
}, {
|
|
69
108
|
borderRadius: borderRadius
|
|
70
|
-
}
|
|
109
|
+
} // Ensure overlay respects border radius
|
|
110
|
+
]
|
|
71
111
|
}), /*#__PURE__*/_jsx(LockOverlay, {
|
|
72
112
|
visible: lockOverlay,
|
|
73
113
|
contentPosition: variant == "horizontal" ? isRTL ? "top-left" : "top-right" : isRTL ? "top-right" : "top-left",
|
|
@@ -127,12 +167,15 @@ const SelaDealCard = ({
|
|
|
127
167
|
})]
|
|
128
168
|
});
|
|
129
169
|
};
|
|
170
|
+
|
|
171
|
+
// getStyles function remains the same
|
|
130
172
|
const getStyles = (theme, isRTL) => StyleSheet.create({
|
|
131
173
|
cardBase: {
|
|
132
174
|
overflow: "hidden",
|
|
133
175
|
position: "relative"
|
|
134
176
|
},
|
|
135
177
|
overlayContainer: {
|
|
178
|
+
// This will now fill the calculated height of the card
|
|
136
179
|
flex: 1,
|
|
137
180
|
padding: 16,
|
|
138
181
|
justifyContent: "space-between"
|
|
@@ -175,7 +218,8 @@ const getStyles = (theme, isRTL) => StyleSheet.create({
|
|
|
175
218
|
},
|
|
176
219
|
textBlockHorizontal: {
|
|
177
220
|
flex: 1,
|
|
178
|
-
marginRight: 10
|
|
221
|
+
marginRight: isRTL ? 0 : 10,
|
|
222
|
+
marginLeft: isRTL ? 10 : 0
|
|
179
223
|
},
|
|
180
224
|
priceContainerHorizontal: {},
|
|
181
225
|
bottomContentVertical: {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["React","View","Text","StyleSheet","Card","useTheme","LockOverlay","jsx","_jsx","jsxs","_jsxs","SelaDealCard","variant","backgroundImage","label","labelStyle","labelContainerStyle","providerName","providerNameStyle","description","descriptionStyle","price","priceStyle","priceContainerStyle","onPress","style","width","
|
|
1
|
+
{"version":3,"names":["React","useState","useEffect","View","Text","StyleSheet","Image","Card","useTheme","LockOverlay","jsx","_jsx","jsxs","_jsxs","SelaDealCard","props","variant","backgroundImage","label","labelStyle","labelContainerStyle","providerName","providerNameStyle","description","descriptionStyle","price","priceStyle","priceContainerStyle","onPress","style","width","isRTL","propIsRTL","borderRadius","darkOverlayEnabled","darkOverlayColor","lockOverlay","theme","themeIsRTL","undefined","actualCardWidth","setActualCardWidth","dynamicHeight","setDynamicHeight","height","asset","resolveAssetSource","aspectRatio","handleLayout","event","newWidth","nativeEvent","layout","finalHeight","styles","getStyles","finalLabelContainerStyle","labelContainerBase","finalLabelStyle","labelTextBase","finalPriceContainerStyle","priceContainerBase","priceContainerHorizontal","priceContainerVertical","finalPriceStyle","priceTextBase","providerTextStyle","providerNameBase","color","onSurface","textAlign","descriptionTextStyle","descriptionBase","cardBase","source","resizeMode","children","absoluteFill","backgroundColor","visible","contentPosition","iconSize","text","overlayOpacity","overlayContainer","topSection","alignItems","bottomContentHorizontal","textBlockHorizontal","bottomContentVertical","textBlockVertical","create","overflow","position","flex","padding","justifyContent","paddingVertical","paddingHorizontal","background","fontWeight","fontSize","onBackground","marginBottom","secondary","helper","primary","onPrimary","flexDirection","marginRight","marginLeft","alignSelf"],"sourceRoot":"..\\..\\..\\..\\..\\src","sources":["components/Card/templates/SelaDealCard.tsx"],"mappings":"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","ignoreList":[]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SelaDealCard.d.ts","sourceRoot":"","sources":["../../../../../../src/components/Card/templates/SelaDealCard.tsx"],"names":[],"mappings":"AACA,OAAO,
|
|
1
|
+
{"version":3,"file":"SelaDealCard.d.ts","sourceRoot":"","sources":["../../../../../../src/components/Card/templates/SelaDealCard.tsx"],"names":[],"mappings":"AACA,OAAO,KAA8B,MAAM,OAAO,CAAC;AACnD,OAAO,EACL,mBAAmB,EACnB,SAAS,EACT,SAAS,EAGT,SAAS,EACT,cAAc,EAIf,MAAM,cAAc,CAAC;AAMtB,UAAU,iBAAiB;IACzB,OAAO,EAAE,YAAY,GAAG,UAAU,CAAC;IACnC,eAAe,EAAE,mBAAmB,CAAC;IACrC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,SAAS,CAAC,SAAS,CAAC,CAAC;IAClC,mBAAmB,CAAC,EAAE,SAAS,CAAC,SAAS,CAAC,CAAC;IAC3C,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,iBAAiB,CAAC,EAAE,SAAS,CAAC,SAAS,CAAC,CAAC;IACzC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,gBAAgB,CAAC,EAAE,SAAS,CAAC,SAAS,CAAC,CAAC;IACxC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,SAAS,CAAC,SAAS,CAAC,CAAC;IAClC,mBAAmB,CAAC,EAAE,SAAS,CAAC,SAAS,CAAC,CAAC;IAC3C,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,KAAK,CAAC,EAAE,SAAS,CAAC,SAAS,CAAC,CAAC;IAC7B,KAAK,CAAC,EAAE,cAAc,CAAC;IACvB,MAAM,CAAC,EAAE,cAAc,CAAC;IACxB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAED,QAAA,MAAM,YAAY,EAAE,KAAK,CAAC,EAAE,CAAC,iBAAiB,CAkN7C,CAAC;AAqEF,eAAe,YAAY,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,50 +1,53 @@
|
|
|
1
1
|
// src/components/SelaDealCard/SelaDealCard.tsx
|
|
2
|
-
import React from "react";
|
|
2
|
+
import React, { useState, useEffect } from "react"; // Import useState and useEffect
|
|
3
3
|
import {
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
4
|
+
ImageSourcePropType,
|
|
5
|
+
StyleProp,
|
|
6
|
+
ViewStyle,
|
|
7
|
+
View,
|
|
8
|
+
Text,
|
|
9
|
+
TextStyle,
|
|
10
|
+
DimensionValue,
|
|
11
|
+
StyleSheet,
|
|
12
|
+
Image, // Import Image
|
|
13
|
+
LayoutChangeEvent, // Import LayoutChangeEvent
|
|
12
14
|
} from "react-native";
|
|
13
|
-
import Card from "../Card";
|
|
14
|
-
import { useTheme } from "../../../theme/ThemeContext";
|
|
15
|
+
import Card from "../Card";
|
|
16
|
+
import { useTheme } from "../../../theme/ThemeContext";
|
|
15
17
|
import { ThemeType } from "../../../theme";
|
|
16
18
|
import { LockOverlay } from "../../LockOverlay";
|
|
17
19
|
|
|
18
20
|
interface SelaDealCardProps {
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
21
|
+
variant: "horizontal" | "vertical";
|
|
22
|
+
backgroundImage: ImageSourcePropType; // Each card instance can have a different image
|
|
23
|
+
label?: string;
|
|
24
|
+
labelStyle?: StyleProp<TextStyle>;
|
|
25
|
+
labelContainerStyle?: StyleProp<ViewStyle>;
|
|
26
|
+
providerName?: string;
|
|
27
|
+
providerNameStyle?: StyleProp<TextStyle>;
|
|
28
|
+
description?: string;
|
|
29
|
+
descriptionStyle?: StyleProp<TextStyle>;
|
|
30
|
+
price?: string;
|
|
31
|
+
priceStyle?: StyleProp<TextStyle>;
|
|
32
|
+
priceContainerStyle?: StyleProp<ViewStyle>;
|
|
33
|
+
onPress?: () => void;
|
|
34
|
+
style?: StyleProp<ViewStyle>;
|
|
35
|
+
width?: DimensionValue;
|
|
36
|
+
height?: DimensionValue; // Explicit height can override dynamic calculation
|
|
37
|
+
isRTL?: boolean;
|
|
38
|
+
borderRadius?: number;
|
|
39
|
+
contentColor?: string;
|
|
40
|
+
labelBackgroundColor?: string;
|
|
41
|
+
labelTextColor?: string;
|
|
42
|
+
priceBackgroundColor?: string;
|
|
43
|
+
priceTextColor?: string;
|
|
44
|
+
darkOverlayEnabled?: boolean;
|
|
45
|
+
darkOverlayColor?: string;
|
|
46
|
+
lockOverlay?: boolean;
|
|
45
47
|
}
|
|
46
48
|
|
|
47
|
-
const SelaDealCard: React.FC<SelaDealCardProps> = ({
|
|
49
|
+
const SelaDealCard: React.FC<SelaDealCardProps> = (props) => {
|
|
50
|
+
const {
|
|
48
51
|
variant,
|
|
49
52
|
backgroundImage,
|
|
50
53
|
label,
|
|
@@ -59,149 +62,209 @@ const SelaDealCard: React.FC<SelaDealCardProps> = ({
|
|
|
59
62
|
priceContainerStyle,
|
|
60
63
|
onPress,
|
|
61
64
|
style,
|
|
62
|
-
width = "100%",
|
|
63
|
-
height
|
|
65
|
+
width = "100%", // Default width, actual pixel width comes from layout
|
|
66
|
+
// props.height is the explicit height override
|
|
64
67
|
isRTL: propIsRTL,
|
|
65
|
-
borderRadius = 12,
|
|
68
|
+
borderRadius = 12,
|
|
66
69
|
darkOverlayEnabled = true,
|
|
67
70
|
darkOverlayColor = "rgba(0, 0, 0, 0.3)",
|
|
68
|
-
lockOverlay = false
|
|
69
|
-
}
|
|
70
|
-
const { theme, isRTL: themeIsRTL } = useTheme();
|
|
71
|
-
const isRTL = propIsRTL !== undefined ? propIsRTL : themeIsRTL;
|
|
71
|
+
lockOverlay = false,
|
|
72
|
+
} = props;
|
|
72
73
|
|
|
73
|
-
|
|
74
|
+
const { theme, isRTL: themeIsRTL } = useTheme();
|
|
75
|
+
const isRTL = propIsRTL !== undefined ? propIsRTL : themeIsRTL;
|
|
74
76
|
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
labelStyle,
|
|
82
|
-
];
|
|
77
|
+
const [actualCardWidth, setActualCardWidth] = useState<number | undefined>(
|
|
78
|
+
undefined,
|
|
79
|
+
);
|
|
80
|
+
const [dynamicHeight, setDynamicHeight] = useState<
|
|
81
|
+
DimensionValue | undefined
|
|
82
|
+
>(undefined);
|
|
83
83
|
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
84
|
+
useEffect(() => {
|
|
85
|
+
// Calculate dynamic height if no explicit height is provided via props,
|
|
86
|
+
// and we have the actual card width and a valid background image.
|
|
87
|
+
if (
|
|
88
|
+
props.height === undefined &&
|
|
89
|
+
actualCardWidth &&
|
|
90
|
+
actualCardWidth > 0 &&
|
|
91
|
+
backgroundImage
|
|
92
|
+
) {
|
|
93
|
+
const asset = Image.resolveAssetSource(backgroundImage);
|
|
94
|
+
if (asset && asset.width > 0 && asset.height > 0) {
|
|
95
|
+
const aspectRatio = asset.height / asset.width;
|
|
96
|
+
setDynamicHeight(actualCardWidth * aspectRatio);
|
|
97
|
+
} else {
|
|
98
|
+
// Fallback if image source is invalid or dimensions are zero
|
|
99
|
+
// (e.g., if it was a network URL and resolveAssetSource didn't work)
|
|
100
|
+
// You might want a default height or aspect ratio here.
|
|
101
|
+
setDynamicHeight(200); // Example fallback height
|
|
102
|
+
}
|
|
103
|
+
} else if (props.height !== undefined) {
|
|
104
|
+
// If an explicit height is provided, ensure dynamicHeight is not used.
|
|
105
|
+
setDynamicHeight(undefined);
|
|
106
|
+
}
|
|
107
|
+
}, [actualCardWidth, backgroundImage, props.height]);
|
|
95
108
|
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
109
|
+
const handleLayout = (event: LayoutChangeEvent) => {
|
|
110
|
+
const newWidth = event.nativeEvent.layout.width;
|
|
111
|
+
if (newWidth > 0 && newWidth !== actualCardWidth) {
|
|
112
|
+
setActualCardWidth(newWidth);
|
|
113
|
+
}
|
|
114
|
+
};
|
|
101
115
|
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
116
|
+
// Use explicit props.height if provided, otherwise use the calculated dynamicHeight.
|
|
117
|
+
// Provide a minimum height for initial render or if dynamicHeight is still undefined.
|
|
118
|
+
const finalHeight =
|
|
119
|
+
props.height !== undefined
|
|
120
|
+
? props.height
|
|
121
|
+
: dynamicHeight !== undefined
|
|
122
|
+
? dynamicHeight
|
|
123
|
+
: 150; // Minimum height before calculation or as fallback
|
|
107
124
|
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
125
|
+
const styles = getStyles(theme, isRTL);
|
|
126
|
+
|
|
127
|
+
// ... (rest of your style definitions: finalLabelContainerStyle, etc. remain the same)
|
|
128
|
+
const finalLabelContainerStyle: StyleProp<ViewStyle> = [
|
|
129
|
+
styles.labelContainerBase,
|
|
130
|
+
labelContainerStyle,
|
|
131
|
+
];
|
|
132
|
+
const finalLabelStyle: StyleProp<TextStyle> = [
|
|
133
|
+
styles.labelTextBase,
|
|
134
|
+
labelStyle,
|
|
135
|
+
];
|
|
136
|
+
|
|
137
|
+
const finalPriceContainerStyle: StyleProp<ViewStyle> = [
|
|
138
|
+
styles.priceContainerBase,
|
|
139
|
+
variant === "horizontal"
|
|
140
|
+
? styles.priceContainerHorizontal
|
|
141
|
+
: styles.priceContainerVertical,
|
|
142
|
+
priceContainerStyle,
|
|
143
|
+
];
|
|
144
|
+
const finalPriceStyle: StyleProp<TextStyle> = [
|
|
145
|
+
styles.priceTextBase,
|
|
146
|
+
priceStyle,
|
|
147
|
+
];
|
|
126
148
|
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
149
|
+
const providerTextStyle: StyleProp<TextStyle> = [
|
|
150
|
+
styles.providerNameBase,
|
|
151
|
+
{ color: theme.onSurface, textAlign: isRTL ? "right" : "left" },
|
|
152
|
+
providerNameStyle,
|
|
153
|
+
];
|
|
154
|
+
|
|
155
|
+
const descriptionTextStyle: StyleProp<TextStyle> = [
|
|
156
|
+
styles.descriptionBase,
|
|
157
|
+
{ color: theme.onSurface, textAlign: isRTL ? "right" : "left" },
|
|
158
|
+
descriptionStyle,
|
|
159
|
+
];
|
|
137
160
|
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
161
|
+
return (
|
|
162
|
+
<Card
|
|
163
|
+
onPress={onPress}
|
|
164
|
+
// onLayout={handleLayout} // Pass onLayout to Card to get its width
|
|
165
|
+
style={[
|
|
166
|
+
styles.cardBase,
|
|
167
|
+
{ borderRadius, width, height: finalHeight }, // Use the calculated finalHeight
|
|
168
|
+
style,
|
|
169
|
+
]}
|
|
170
|
+
backgroundImage={{
|
|
171
|
+
source: backgroundImage,
|
|
172
|
+
resizeMode: "cover", // 'cover' will fill dimensions, 'contain' would show whole image
|
|
173
|
+
}}
|
|
174
|
+
>
|
|
175
|
+
{darkOverlayEnabled && (
|
|
176
|
+
<View
|
|
177
|
+
style={[
|
|
178
|
+
StyleSheet.absoluteFill,
|
|
179
|
+
{ backgroundColor: darkOverlayColor },
|
|
180
|
+
{ borderRadius: borderRadius }, // Ensure overlay respects border radius
|
|
181
|
+
]}
|
|
182
|
+
/>
|
|
183
|
+
)}
|
|
184
|
+
<LockOverlay
|
|
185
|
+
visible={lockOverlay}
|
|
186
|
+
contentPosition={
|
|
187
|
+
variant == "horizontal"
|
|
188
|
+
? isRTL
|
|
189
|
+
? "top-left"
|
|
190
|
+
: "top-right"
|
|
191
|
+
: isRTL
|
|
192
|
+
? "top-right"
|
|
193
|
+
: "top-left"
|
|
194
|
+
}
|
|
195
|
+
iconSize={24}
|
|
196
|
+
text={""}
|
|
197
|
+
overlayOpacity={0.4}
|
|
198
|
+
/>
|
|
199
|
+
{/* The overlayContainer with flex: 1 will now correctly fill the 'finalHeight' */}
|
|
200
|
+
<View style={styles.overlayContainer}>
|
|
201
|
+
<View
|
|
202
|
+
style={[
|
|
203
|
+
styles.topSection,
|
|
204
|
+
{
|
|
205
|
+
alignItems:
|
|
206
|
+
variant === "horizontal"
|
|
207
|
+
? isRTL
|
|
208
|
+
? "flex-end"
|
|
209
|
+
: "flex-start"
|
|
210
|
+
: isRTL
|
|
211
|
+
? "flex-start"
|
|
212
|
+
: "flex-end",
|
|
213
|
+
},
|
|
214
|
+
]}
|
|
215
|
+
>
|
|
216
|
+
{label && (
|
|
217
|
+
<View style={finalLabelContainerStyle}>
|
|
218
|
+
<Text style={finalLabelStyle}>{label}</Text>
|
|
219
|
+
</View>
|
|
220
|
+
)}
|
|
221
|
+
</View>
|
|
160
222
|
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
</View>
|
|
187
|
-
{price && (
|
|
188
|
-
<View style={finalPriceContainerStyle}>
|
|
189
|
-
<Text style={finalPriceStyle}>{price}</Text>
|
|
190
|
-
</View>
|
|
191
|
-
)}
|
|
192
|
-
</View>
|
|
193
|
-
)}
|
|
223
|
+
{variant === "horizontal" ? (
|
|
224
|
+
<View style={styles.bottomContentHorizontal}>
|
|
225
|
+
<View style={styles.textBlockHorizontal}>
|
|
226
|
+
{providerName && (
|
|
227
|
+
<Text style={providerTextStyle}>{providerName}</Text>
|
|
228
|
+
)}
|
|
229
|
+
{description && (
|
|
230
|
+
<Text style={descriptionTextStyle}>{description}</Text>
|
|
231
|
+
)}
|
|
232
|
+
</View>
|
|
233
|
+
{price && (
|
|
234
|
+
<View style={finalPriceContainerStyle}>
|
|
235
|
+
<Text style={finalPriceStyle}>{price}</Text>
|
|
236
|
+
</View>
|
|
237
|
+
)}
|
|
238
|
+
</View>
|
|
239
|
+
) : (
|
|
240
|
+
<View style={styles.bottomContentVertical}>
|
|
241
|
+
<View style={styles.textBlockVertical}>
|
|
242
|
+
{providerName && (
|
|
243
|
+
<Text style={providerTextStyle}>{providerName}</Text>
|
|
244
|
+
)}
|
|
245
|
+
{description && (
|
|
246
|
+
<Text style={descriptionTextStyle}>{description}</Text>
|
|
247
|
+
)}
|
|
194
248
|
</View>
|
|
195
|
-
|
|
196
|
-
|
|
249
|
+
{price && (
|
|
250
|
+
<View style={finalPriceContainerStyle}>
|
|
251
|
+
<Text style={finalPriceStyle}>{price}</Text>
|
|
252
|
+
</View>
|
|
253
|
+
)}
|
|
254
|
+
</View>
|
|
255
|
+
)}
|
|
256
|
+
</View>
|
|
257
|
+
</Card>
|
|
258
|
+
);
|
|
197
259
|
};
|
|
198
260
|
|
|
261
|
+
// getStyles function remains the same
|
|
199
262
|
const getStyles = (theme: ThemeType, isRTL: boolean) => StyleSheet.create({
|
|
200
263
|
cardBase: {
|
|
201
264
|
overflow: "hidden",
|
|
202
265
|
position: "relative",
|
|
203
266
|
},
|
|
204
|
-
overlayContainer: {
|
|
267
|
+
overlayContainer: { // This will now fill the calculated height of the card
|
|
205
268
|
flex: 1,
|
|
206
269
|
padding: 16,
|
|
207
270
|
justifyContent: "space-between",
|
|
@@ -245,7 +308,8 @@ const getStyles = (theme: ThemeType, isRTL: boolean) => StyleSheet.create({
|
|
|
245
308
|
},
|
|
246
309
|
textBlockHorizontal: {
|
|
247
310
|
flex: 1,
|
|
248
|
-
marginRight: 10,
|
|
311
|
+
marginRight: isRTL ? 0 : 10,
|
|
312
|
+
marginLeft: isRTL ? 10 : 0,
|
|
249
313
|
},
|
|
250
314
|
priceContainerHorizontal: {
|
|
251
315
|
},
|