related-ui-components 3.2.8 → 4.0.0
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.
|
@@ -6,56 +6,12 @@ import { Svg, Path, G, Text as SvgText, Circle } from "react-native-svg";
|
|
|
6
6
|
import { Button } from "../Button/index.js";
|
|
7
7
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
8
8
|
//default random colors
|
|
9
|
-
const colors = ["#FF0000",
|
|
10
|
-
//
|
|
11
|
-
|
|
12
|
-
//
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
"#008000",
|
|
16
|
-
// Green
|
|
17
|
-
"#0000FF",
|
|
18
|
-
// Blue
|
|
19
|
-
"#800080",
|
|
20
|
-
// Purple
|
|
21
|
-
"#FFC0CB",
|
|
22
|
-
// Pink
|
|
23
|
-
"#00FFFF",
|
|
24
|
-
// Cyan
|
|
25
|
-
"#FF00FF",
|
|
26
|
-
// Magenta
|
|
27
|
-
"#00FF00",
|
|
28
|
-
// Lime
|
|
29
|
-
"#4B0082",
|
|
30
|
-
// Indigo
|
|
31
|
-
"#EE82EE",
|
|
32
|
-
// Violet
|
|
33
|
-
"#40E0D0",
|
|
34
|
-
// Turquoise
|
|
35
|
-
"#FFD700",
|
|
36
|
-
// Gold
|
|
37
|
-
"#C0C0C0",
|
|
38
|
-
// Silver
|
|
39
|
-
"#FFDAB9",
|
|
40
|
-
// Peach
|
|
41
|
-
"#E6E6FA",
|
|
42
|
-
// Lavender
|
|
43
|
-
"#008080",
|
|
44
|
-
// Teal
|
|
45
|
-
"#FF7F50",
|
|
46
|
-
// Coral
|
|
47
|
-
"#DC143C",
|
|
48
|
-
// Crimson
|
|
49
|
-
"#87CEEB",
|
|
50
|
-
// Sky Blue
|
|
51
|
-
"#7FFF00",
|
|
52
|
-
// Chartreuse
|
|
53
|
-
"#CCCCFF",
|
|
54
|
-
// Periwinkle
|
|
55
|
-
"#FF6347",
|
|
56
|
-
// Tomato
|
|
57
|
-
"#FA8072" // Salmon
|
|
58
|
-
];
|
|
9
|
+
const colors = ["#FF0000", "#FFA500", "#FFFF00", "#008000", "#0000FF", "#800080", "#FFC0CB", "#00FFFF", "#FF00FF", "#00FF00", "#4B0082", "#EE82EE", "#40E0D0", "#FFD700", "#C0C0C0", "#FFDAB9", "#E6E6FA", "#008080", "#FF7F50", "#DC143C", "#87CEEB", "#7FFF00", "#CCCCFF", "#FF6347", "#FA8072"];
|
|
10
|
+
// Constants for consistent animation
|
|
11
|
+
const ROTATION_DURATION = 2500; // Duration for one full rotation
|
|
12
|
+
const DECEL_DURATION = 3000; // Duration for deceleration phase
|
|
13
|
+
const EXTRA_SPINS = 3; // Number of extra full rotations before stopping
|
|
14
|
+
|
|
59
15
|
const SpinWheel = ({
|
|
60
16
|
items,
|
|
61
17
|
size = 300,
|
|
@@ -83,16 +39,13 @@ const SpinWheel = ({
|
|
|
83
39
|
const spinStartTime = useRef(0);
|
|
84
40
|
const [spinning, setSpinning] = useState(false);
|
|
85
41
|
const rotateValue = useRef(new Animated.Value(0)).current;
|
|
86
|
-
|
|
87
|
-
// Track rotation manually for calculations
|
|
88
42
|
const rotationRef = useRef(0);
|
|
89
43
|
const startInfiniteSpin = () => {
|
|
90
44
|
rotateValue.setValue(rotationRef.current);
|
|
91
45
|
spinStartTime.current = Date.now();
|
|
92
46
|
spinLoop.current = Animated.loop(Animated.timing(rotateValue, {
|
|
93
47
|
toValue: rotationRef.current + 1,
|
|
94
|
-
|
|
95
|
-
duration: 2500,
|
|
48
|
+
duration: ROTATION_DURATION,
|
|
96
49
|
easing: Easing.linear,
|
|
97
50
|
useNativeDriver: true
|
|
98
51
|
}));
|
|
@@ -107,23 +60,38 @@ const SpinWheel = ({
|
|
|
107
60
|
const winnerId = typeof winnerValue === "object" ? winnerValue.id : winnerValue;
|
|
108
61
|
const index = items.findIndex(i => i.id === winnerId);
|
|
109
62
|
if (index === -1) return;
|
|
63
|
+
|
|
64
|
+
// Calculate target angle (pointer at top = 270 degrees)
|
|
65
|
+
const anglePerItem = 360 / items.length;
|
|
110
66
|
const segmentCenter = (index + 0.5) * anglePerItem;
|
|
111
67
|
const targetAngle = (270 - segmentCenter + 360) % 360;
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
const
|
|
68
|
+
|
|
69
|
+
// Get current rotation position
|
|
70
|
+
const currentRotation = rotationRef.current;
|
|
71
|
+
const currentAngle = currentRotation * 360 % 360;
|
|
72
|
+
|
|
73
|
+
// Calculate shortest path to target
|
|
74
|
+
let offset = (targetAngle - currentAngle + 360) % 360;
|
|
75
|
+
|
|
76
|
+
// Add extra full rotations for dramatic effect
|
|
77
|
+
const extraRotations = EXTRA_SPINS * 360;
|
|
78
|
+
const totalRotation = offset + extraRotations;
|
|
79
|
+
|
|
80
|
+
// Final rotation value
|
|
81
|
+
const finalRotation = currentRotation + totalRotation / 360;
|
|
82
|
+
|
|
83
|
+
// Use ease-out cubic for smooth deceleration
|
|
115
84
|
Animated.timing(rotateValue, {
|
|
116
85
|
toValue: finalRotation,
|
|
117
|
-
duration:
|
|
86
|
+
duration: DECEL_DURATION,
|
|
118
87
|
easing: Easing.out(Easing.cubic),
|
|
119
88
|
useNativeDriver: true
|
|
120
89
|
}).start(() => {
|
|
90
|
+
rotationRef.current = finalRotation;
|
|
121
91
|
setSpinning(false);
|
|
122
92
|
onSpinEnd?.(items[index]);
|
|
123
93
|
});
|
|
124
94
|
};
|
|
125
|
-
|
|
126
|
-
// Update tracked rotation when animation completes
|
|
127
95
|
useEffect(() => {
|
|
128
96
|
const listener = rotateValue.addListener(({
|
|
129
97
|
value
|
|
@@ -134,11 +102,7 @@ const SpinWheel = ({
|
|
|
134
102
|
rotateValue.removeListener(listener);
|
|
135
103
|
};
|
|
136
104
|
}, [rotateValue]);
|
|
137
|
-
|
|
138
|
-
// Calculate angle for each segment
|
|
139
105
|
const anglePerItem = wheelItems.length > 0 ? 360 / wheelItems.length : 0;
|
|
140
|
-
|
|
141
|
-
// Create wheel segments
|
|
142
106
|
const generateWheelPaths = () => {
|
|
143
107
|
if (wheelItems.length === 0) return [];
|
|
144
108
|
return wheelItems.map((item, index) => {
|
|
@@ -155,18 +119,11 @@ const SpinWheel = ({
|
|
|
155
119
|
const midRad = (startAngle + endAngle) / 2 * (Math.PI / 180);
|
|
156
120
|
const textX = size / 2 + size * 0.32 * Math.cos(midRad);
|
|
157
121
|
const textY = size / 2 + size * 0.32 * Math.sin(midRad);
|
|
158
|
-
|
|
159
|
-
// decorationX and decorationY are calculated but not used in the provided JSX
|
|
160
|
-
// const decorationX = size / 2 + size * 0.43 * Math.cos(midRad);
|
|
161
|
-
// const decorationY = size / 2 + size * 0.43 * Math.sin(midRad);
|
|
162
|
-
|
|
163
122
|
return {
|
|
164
123
|
path: pathData,
|
|
165
124
|
item,
|
|
166
125
|
textX,
|
|
167
126
|
textY,
|
|
168
|
-
// decorationX,
|
|
169
|
-
// decorationY,
|
|
170
127
|
angle: (startAngle + endAngle) / 2
|
|
171
128
|
};
|
|
172
129
|
});
|
|
@@ -180,9 +137,7 @@ const SpinWheel = ({
|
|
|
180
137
|
stopOnWinner(winner);
|
|
181
138
|
}, delay);
|
|
182
139
|
return () => clearTimeout(timeout);
|
|
183
|
-
}, [winner]);
|
|
184
|
-
|
|
185
|
-
// Animation interpolation for rotation
|
|
140
|
+
}, [winner, spinning]);
|
|
186
141
|
const rotate = rotateValue.interpolate({
|
|
187
142
|
inputRange: [0, 1],
|
|
188
143
|
outputRange: ["0deg", "360deg"]
|
|
@@ -215,13 +170,11 @@ const SpinWheel = ({
|
|
|
215
170
|
textX,
|
|
216
171
|
textY,
|
|
217
172
|
angle
|
|
218
|
-
}
|
|
173
|
+
}) => {
|
|
219
174
|
return /*#__PURE__*/_jsxs(React.Fragment, {
|
|
220
175
|
children: [/*#__PURE__*/_jsx(Path, {
|
|
221
176
|
d: path,
|
|
222
177
|
fill: item.color == "" || item.color == null ? colors[Math.floor(Math.random() * colors.length)] : item.color
|
|
223
|
-
// stroke="#FA8072"
|
|
224
|
-
// strokeWidth={1}
|
|
225
178
|
}), /*#__PURE__*/_jsx(SvgText, {
|
|
226
179
|
x: textX,
|
|
227
180
|
y: textY,
|
|
@@ -230,7 +183,7 @@ const SpinWheel = ({
|
|
|
230
183
|
fontWeight: wheelTextStyle?.fontWeight || "bold",
|
|
231
184
|
textAnchor: "middle",
|
|
232
185
|
alignmentBaseline: "central",
|
|
233
|
-
transform: `rotate(${angle + 180}, ${textX}, ${textY}
|
|
186
|
+
transform: `rotate(${angle + 180}, ${textX}, ${textY})`,
|
|
234
187
|
children: item.label
|
|
235
188
|
})]
|
|
236
189
|
}, item.id);
|
|
@@ -249,7 +202,6 @@ const SpinWheel = ({
|
|
|
249
202
|
position: "absolute",
|
|
250
203
|
top: "50%",
|
|
251
204
|
left: "50%",
|
|
252
|
-
// Center the component perfectly
|
|
253
205
|
transform: [{
|
|
254
206
|
translateX: -(actualCenterSize / 2)
|
|
255
207
|
}, {
|
|
@@ -304,7 +256,7 @@ const styles = StyleSheet.create({
|
|
|
304
256
|
alignItems: "center",
|
|
305
257
|
justifyContent: "center",
|
|
306
258
|
marginTop: 20,
|
|
307
|
-
marginBottom: 70
|
|
259
|
+
marginBottom: 70
|
|
308
260
|
},
|
|
309
261
|
wheelContainer: {
|
|
310
262
|
overflow: "hidden",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["React","useState","useRef","useEffect","View","StyleSheet","Animated","Easing","Svg","Path","G","Text","SvgText","Circle","Button","jsx","_jsx","jsxs","_jsxs","colors","SpinWheel","items","size","winner","minSpinDuration","onSpinStart","onSpinEnd","containerStyle","centerStyle","spinButtonText","wheelTextStyle","knobStyle","knobColor","actionButtonStyle","actionButtonTextStyle","wheelBorderColor","wheelBorderWidth","wheelTextColor","actionButtonProps","centerSize","centerComponent","wheelItems","length","spinLoop","spinStartTime","spinning","setSpinning","rotateValue","Value","current","rotationRef","startInfiniteSpin","setValue","Date","now","loop","timing","toValue","duration","easing","linear","useNativeDriver","start","stopOnWinner","winnerValue","stop","winnerId","id","index","findIndex","i","segmentCenter","anglePerItem","targetAngle","currentAngle","offset","finalRotation","out","cubic","listener","addListener","value","removeListener","generateWheelPaths","map","item","startAngle","endAngle","startRad","Math","PI","endRad","x1","cos","y1","sin","x2","y2","largeArcFlag","pathData","join","midRad","textX","textY","path","angle","wheelPaths","elapsed","delay","max","timeout","setTimeout","clearTimeout","rotate","interpolate","inputRange","outputRange","actualCenterSize","undefined","style","styles","container","children","width","height","wheelContainer","borderRadius","transform","viewBox","Fragment","d","fill","color","floor","random","x","y","textColor","fontSize","fontWeight","textAnchor","alignmentBaseline","label","cx","cy","r","stroke","strokeWidth","position","top","left","translateX","translateY","zIndex","wheelCenter","pointerPosition","pointer","borderBottomColor","alignItems","justifyContent","bottom","actionButton","onPress","title","disabled","textStyle","actionButtonText","create","marginTop","marginBottom","overflow","backgroundColor","borderWidth","borderColor","borderStyle","borderLeftWidth","borderRightWidth","borderBottomWidth","borderLeftColor","borderRightColor","paddingHorizontal","paddingVertical","shadowColor","shadowRadius"],"sourceRoot":"..\\..\\..\\..\\src","sources":["components/Wheel/Wheel.tsx"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"names":["React","useState","useRef","useEffect","View","StyleSheet","Animated","Easing","Svg","Path","G","Text","SvgText","Circle","Button","jsx","_jsx","jsxs","_jsxs","colors","ROTATION_DURATION","DECEL_DURATION","EXTRA_SPINS","SpinWheel","items","size","winner","minSpinDuration","onSpinStart","onSpinEnd","containerStyle","centerStyle","spinButtonText","wheelTextStyle","knobStyle","knobColor","actionButtonStyle","actionButtonTextStyle","wheelBorderColor","wheelBorderWidth","wheelTextColor","actionButtonProps","centerSize","centerComponent","wheelItems","length","spinLoop","spinStartTime","spinning","setSpinning","rotateValue","Value","current","rotationRef","startInfiniteSpin","setValue","Date","now","loop","timing","toValue","duration","easing","linear","useNativeDriver","start","stopOnWinner","winnerValue","stop","winnerId","id","index","findIndex","i","anglePerItem","segmentCenter","targetAngle","currentRotation","currentAngle","offset","extraRotations","totalRotation","finalRotation","out","cubic","listener","addListener","value","removeListener","generateWheelPaths","map","item","startAngle","endAngle","startRad","Math","PI","endRad","x1","cos","y1","sin","x2","y2","largeArcFlag","pathData","join","midRad","textX","textY","path","angle","wheelPaths","elapsed","delay","max","timeout","setTimeout","clearTimeout","rotate","interpolate","inputRange","outputRange","actualCenterSize","undefined","style","styles","container","children","width","height","wheelContainer","borderRadius","transform","viewBox","Fragment","d","fill","color","floor","random","x","y","textColor","fontSize","fontWeight","textAnchor","alignmentBaseline","label","cx","cy","r","stroke","strokeWidth","position","top","left","translateX","translateY","zIndex","wheelCenter","pointerPosition","pointer","borderBottomColor","alignItems","justifyContent","bottom","actionButton","onPress","title","disabled","textStyle","actionButtonText","create","marginTop","marginBottom","overflow","backgroundColor","borderWidth","borderColor","borderStyle","borderLeftWidth","borderRightWidth","borderBottomWidth","borderLeftColor","borderRightColor","paddingHorizontal","paddingVertical","shadowColor","shadowRadius"],"sourceRoot":"..\\..\\..\\..\\src","sources":["components/Wheel/Wheel.tsx"],"mappings":"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","ignoreList":[]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Wheel.d.ts","sourceRoot":"","sources":["../../../../../src/components/Wheel/Wheel.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAsC,MAAM,OAAO,CAAC;AAC3D,OAAO,EAOL,SAAS,EACT,SAAS,EACV,MAAM,cAAc,CAAC;AAEtB,OAAO,EAAE,cAAc,EAAU,MAAM,WAAW,CAAC;AAEnD,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,GAAG,MAAM,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,GAAG,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;
|
|
1
|
+
{"version":3,"file":"Wheel.d.ts","sourceRoot":"","sources":["../../../../../src/components/Wheel/Wheel.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAsC,MAAM,OAAO,CAAC;AAC3D,OAAO,EAOL,SAAS,EACT,SAAS,EACV,MAAM,cAAc,CAAC;AAEtB,OAAO,EAAE,cAAc,EAAU,MAAM,WAAW,CAAC;AAEnD,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,GAAG,MAAM,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,GAAG,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAWD,UAAU,cAAc;IACtB,KAAK,EAAE,aAAa,EAAE,CAAC;IACvB,mBAAmB,CAAC,EAAE,aAAa,GAAG,MAAM,GAAG,MAAM,CAAC;IACtD,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,MAAM,CAAC,EAAE,aAAa,GAAG,MAAM,GAAG,MAAM,CAAC;IACzC,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,IAAI,CAAC;IACzB,SAAS,CAAC,EAAE,CAAC,IAAI,EAAE,aAAa,KAAK,IAAI,CAAC;IAC1C,cAAc,CAAC,EAAE,SAAS,CAAC;IAC3B,WAAW,CAAC,EAAE,SAAS,CAAC;IACxB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,cAAc,CAAC,EAAE,SAAS,CAAC;IAC3B,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB,iBAAiB,CAAC,EAAE,SAAS,CAAC;IAC9B,qBAAqB,CAAC,EAAE,SAAS,CAAC;IAClC,iBAAiB,CAAC,EAAE,OAAO,CAAC,IAAI,CAAC,cAAc,EAAE,OAAO,GAAG,SAAS,CAAC,CAAC,CAAC;IACvE,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,eAAe,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;CACnC;AAOD,QAAA,MAAM,SAAS,EAAE,KAAK,CAAC,EAAE,CAAC,cAAc,CAmSvC,CAAC;AAqDF,eAAe,SAAS,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "related-ui-components",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "4.0.0",
|
|
4
4
|
"main": "./src/index.ts",
|
|
5
5
|
"scripts": {
|
|
6
6
|
"start": "expo start",
|
|
@@ -18,7 +18,6 @@
|
|
|
18
18
|
"@shopify/react-native-skia": ">=v2.0.0-next.4",
|
|
19
19
|
"country-telephone-data": ">=0.6.3",
|
|
20
20
|
"date-fns": ">=4.1.0",
|
|
21
|
-
"expo": "53.0.20",
|
|
22
21
|
"expo-blur": ">=14.1.5",
|
|
23
22
|
"expo-checkbox": ">=4.1.4",
|
|
24
23
|
"expo-clipboard": ">=7.1.4",
|
|
@@ -28,21 +27,21 @@
|
|
|
28
27
|
"react": "19.0.0",
|
|
29
28
|
"react-native": "0.79.5",
|
|
30
29
|
"react-native-calendars": ">=1.1312.0",
|
|
30
|
+
"react-native-color-matrix-image-filters": ">=7.0.2",
|
|
31
31
|
"react-native-gesture-handler": ">=2.24.0",
|
|
32
32
|
"react-native-picker-select": ">=9.3.1",
|
|
33
33
|
"react-native-qrcode-svg": ">=6.3.15",
|
|
34
|
+
"react-native-reanimated": ">=3.0.0",
|
|
34
35
|
"react-native-safe-area-context": ">=5.4.0",
|
|
35
36
|
"react-native-svg": ">=15.11.2",
|
|
36
|
-
"react-native-
|
|
37
|
-
"react-native-toast-message": ">=2.3.3",
|
|
38
|
-
"react-native-reanimated": ">=3.0.0"
|
|
37
|
+
"react-native-toast-message": ">=2.3.3"
|
|
39
38
|
},
|
|
40
39
|
"devDependencies": {
|
|
41
40
|
"@babel/core": "^7.25.2",
|
|
42
41
|
"@types/country-telephone-data": "^0.6.3",
|
|
43
|
-
"@types/react": "~19.
|
|
42
|
+
"@types/react": "~19.1.10",
|
|
44
43
|
"react-native-builder-bob": "^0.40.11",
|
|
45
|
-
"typescript": "~5.
|
|
44
|
+
"typescript": "~5.9.2"
|
|
46
45
|
},
|
|
47
46
|
"private": false,
|
|
48
47
|
"exports": {
|
|
@@ -77,5 +76,8 @@
|
|
|
77
76
|
"eslintIgnore": [
|
|
78
77
|
"node_modules/",
|
|
79
78
|
"lib/"
|
|
80
|
-
]
|
|
79
|
+
],
|
|
80
|
+
"dependencies": {
|
|
81
|
+
"expo": "^54.0.31"
|
|
82
|
+
}
|
|
81
83
|
}
|
|
@@ -22,55 +22,25 @@ export interface SpinWheelItem {
|
|
|
22
22
|
|
|
23
23
|
//default random colors
|
|
24
24
|
const colors = [
|
|
25
|
-
"#FF0000",
|
|
26
|
-
"#
|
|
27
|
-
"#
|
|
28
|
-
"#
|
|
29
|
-
"#
|
|
30
|
-
"#800080", // Purple
|
|
31
|
-
"#FFC0CB", // Pink
|
|
32
|
-
"#00FFFF", // Cyan
|
|
33
|
-
"#FF00FF", // Magenta
|
|
34
|
-
"#00FF00", // Lime
|
|
35
|
-
"#4B0082", // Indigo
|
|
36
|
-
"#EE82EE", // Violet
|
|
37
|
-
"#40E0D0", // Turquoise
|
|
38
|
-
"#FFD700", // Gold
|
|
39
|
-
"#C0C0C0", // Silver
|
|
40
|
-
"#FFDAB9", // Peach
|
|
41
|
-
"#E6E6FA", // Lavender
|
|
42
|
-
"#008080", // Teal
|
|
43
|
-
"#FF7F50", // Coral
|
|
44
|
-
"#DC143C", // Crimson
|
|
45
|
-
"#87CEEB", // Sky Blue
|
|
46
|
-
"#7FFF00", // Chartreuse
|
|
47
|
-
"#CCCCFF", // Periwinkle
|
|
48
|
-
"#FF6347", // Tomato
|
|
49
|
-
"#FA8072", // Salmon
|
|
25
|
+
"#FF0000", "#FFA500", "#FFFF00", "#008000", "#0000FF", "#800080",
|
|
26
|
+
"#FFC0CB", "#00FFFF", "#FF00FF", "#00FF00", "#4B0082", "#EE82EE",
|
|
27
|
+
"#40E0D0", "#FFD700", "#C0C0C0", "#FFDAB9", "#E6E6FA", "#008080",
|
|
28
|
+
"#FF7F50", "#DC143C", "#87CEEB", "#7FFF00", "#CCCCFF", "#FF6347",
|
|
29
|
+
"#FA8072",
|
|
50
30
|
];
|
|
51
31
|
|
|
52
32
|
interface SpinWheelProps {
|
|
53
|
-
// Data
|
|
54
33
|
items: SpinWheelItem[];
|
|
55
34
|
predeterminedWinner?: SpinWheelItem | string | number;
|
|
56
|
-
|
|
57
|
-
// Dimensions
|
|
58
35
|
size?: number;
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
minSpinDuration?: number; // buffer in ms before stopping
|
|
63
|
-
|
|
64
|
-
// Behavior
|
|
36
|
+
startSpin?: boolean;
|
|
37
|
+
winner?: SpinWheelItem | string | number;
|
|
38
|
+
minSpinDuration?: number;
|
|
65
39
|
spinDuration?: number;
|
|
66
40
|
friction?: number;
|
|
67
41
|
enabled?: boolean;
|
|
68
|
-
|
|
69
|
-
// Events
|
|
70
42
|
onSpinStart?: () => void;
|
|
71
43
|
onSpinEnd?: (item: SpinWheelItem) => void;
|
|
72
|
-
|
|
73
|
-
// Styling
|
|
74
44
|
containerStyle?: ViewStyle;
|
|
75
45
|
centerStyle?: ViewStyle;
|
|
76
46
|
spinButtonText?: string;
|
|
@@ -79,17 +49,19 @@ interface SpinWheelProps {
|
|
|
79
49
|
actionButtonStyle?: ViewStyle;
|
|
80
50
|
actionButtonTextStyle?: TextStyle;
|
|
81
51
|
actionButtonProps?: Partial<Omit<AppButtonProps, "title" | "onPress">>;
|
|
82
|
-
|
|
83
52
|
wheelBorderColor?: string;
|
|
84
53
|
wheelBorderWidth?: number;
|
|
85
54
|
wheelTextColor?: string;
|
|
86
55
|
knobColor?: string;
|
|
87
|
-
|
|
88
56
|
centerSize?: number;
|
|
89
|
-
|
|
90
|
-
centerComponent?: React.ReactNode; // Note: centerComponent prop is declared but not used
|
|
57
|
+
centerComponent?: React.ReactNode;
|
|
91
58
|
}
|
|
92
59
|
|
|
60
|
+
// Constants for consistent animation
|
|
61
|
+
const ROTATION_DURATION = 2500; // Duration for one full rotation
|
|
62
|
+
const DECEL_DURATION = 3000; // Duration for deceleration phase
|
|
63
|
+
const EXTRA_SPINS = 3; // Number of extra full rotations before stopping
|
|
64
|
+
|
|
93
65
|
const SpinWheel: React.FC<SpinWheelProps> = ({
|
|
94
66
|
items,
|
|
95
67
|
size = 300,
|
|
@@ -119,19 +91,16 @@ const SpinWheel: React.FC<SpinWheelProps> = ({
|
|
|
119
91
|
|
|
120
92
|
const [spinning, setSpinning] = useState(false);
|
|
121
93
|
const rotateValue = useRef(new Animated.Value(0)).current;
|
|
122
|
-
|
|
123
|
-
// Track rotation manually for calculations
|
|
124
94
|
const rotationRef = useRef(0);
|
|
125
95
|
|
|
126
96
|
const startInfiniteSpin = () => {
|
|
127
97
|
rotateValue.setValue(rotationRef.current);
|
|
128
|
-
|
|
129
98
|
spinStartTime.current = Date.now();
|
|
130
99
|
|
|
131
100
|
spinLoop.current = Animated.loop(
|
|
132
101
|
Animated.timing(rotateValue, {
|
|
133
|
-
toValue: rotationRef.current + 1,
|
|
134
|
-
duration:
|
|
102
|
+
toValue: rotationRef.current + 1,
|
|
103
|
+
duration: ROTATION_DURATION,
|
|
135
104
|
easing: Easing.linear,
|
|
136
105
|
useNativeDriver: true,
|
|
137
106
|
})
|
|
@@ -154,26 +123,38 @@ const SpinWheel: React.FC<SpinWheelProps> = ({
|
|
|
154
123
|
const index = items.findIndex((i) => i.id === winnerId);
|
|
155
124
|
if (index === -1) return;
|
|
156
125
|
|
|
126
|
+
// Calculate target angle (pointer at top = 270 degrees)
|
|
127
|
+
const anglePerItem = 360 / items.length;
|
|
157
128
|
const segmentCenter = (index + 0.5) * anglePerItem;
|
|
158
129
|
const targetAngle = (270 - segmentCenter + 360) % 360;
|
|
159
130
|
|
|
160
|
-
|
|
161
|
-
const
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
131
|
+
// Get current rotation position
|
|
132
|
+
const currentRotation = rotationRef.current;
|
|
133
|
+
const currentAngle = (currentRotation * 360) % 360;
|
|
134
|
+
|
|
135
|
+
// Calculate shortest path to target
|
|
136
|
+
let offset = (targetAngle - currentAngle + 360) % 360;
|
|
137
|
+
|
|
138
|
+
// Add extra full rotations for dramatic effect
|
|
139
|
+
const extraRotations = EXTRA_SPINS * 360;
|
|
140
|
+
const totalRotation = offset + extraRotations;
|
|
141
|
+
|
|
142
|
+
// Final rotation value
|
|
143
|
+
const finalRotation = currentRotation + totalRotation / 360;
|
|
144
|
+
|
|
145
|
+
// Use ease-out cubic for smooth deceleration
|
|
165
146
|
Animated.timing(rotateValue, {
|
|
166
147
|
toValue: finalRotation,
|
|
167
|
-
duration:
|
|
148
|
+
duration: DECEL_DURATION,
|
|
168
149
|
easing: Easing.out(Easing.cubic),
|
|
169
150
|
useNativeDriver: true,
|
|
170
151
|
}).start(() => {
|
|
152
|
+
rotationRef.current = finalRotation;
|
|
171
153
|
setSpinning(false);
|
|
172
154
|
onSpinEnd?.(items[index]);
|
|
173
155
|
});
|
|
174
156
|
};
|
|
175
157
|
|
|
176
|
-
// Update tracked rotation when animation completes
|
|
177
158
|
useEffect(() => {
|
|
178
159
|
const listener = rotateValue.addListener(({ value }) => {
|
|
179
160
|
rotationRef.current = value;
|
|
@@ -184,10 +165,8 @@ const SpinWheel: React.FC<SpinWheelProps> = ({
|
|
|
184
165
|
};
|
|
185
166
|
}, [rotateValue]);
|
|
186
167
|
|
|
187
|
-
// Calculate angle for each segment
|
|
188
168
|
const anglePerItem = wheelItems.length > 0 ? 360 / wheelItems.length : 0;
|
|
189
169
|
|
|
190
|
-
// Create wheel segments
|
|
191
170
|
const generateWheelPaths = () => {
|
|
192
171
|
if (wheelItems.length === 0) return [];
|
|
193
172
|
return wheelItems.map((item, index) => {
|
|
@@ -215,17 +194,11 @@ const SpinWheel: React.FC<SpinWheelProps> = ({
|
|
|
215
194
|
const textX = size / 2 + size * 0.32 * Math.cos(midRad);
|
|
216
195
|
const textY = size / 2 + size * 0.32 * Math.sin(midRad);
|
|
217
196
|
|
|
218
|
-
// decorationX and decorationY are calculated but not used in the provided JSX
|
|
219
|
-
// const decorationX = size / 2 + size * 0.43 * Math.cos(midRad);
|
|
220
|
-
// const decorationY = size / 2 + size * 0.43 * Math.sin(midRad);
|
|
221
|
-
|
|
222
197
|
return {
|
|
223
198
|
path: pathData,
|
|
224
199
|
item,
|
|
225
200
|
textX,
|
|
226
201
|
textY,
|
|
227
|
-
// decorationX,
|
|
228
|
-
// decorationY,
|
|
229
202
|
angle: (startAngle + endAngle) / 2,
|
|
230
203
|
};
|
|
231
204
|
});
|
|
@@ -244,9 +217,8 @@ const SpinWheel: React.FC<SpinWheelProps> = ({
|
|
|
244
217
|
}, delay);
|
|
245
218
|
|
|
246
219
|
return () => clearTimeout(timeout);
|
|
247
|
-
}, [winner]);
|
|
220
|
+
}, [winner, spinning]);
|
|
248
221
|
|
|
249
|
-
// Animation interpolation for rotation
|
|
250
222
|
const rotate = rotateValue.interpolate({
|
|
251
223
|
inputRange: [0, 1],
|
|
252
224
|
outputRange: ["0deg", "360deg"],
|
|
@@ -257,7 +229,6 @@ const SpinWheel: React.FC<SpinWheelProps> = ({
|
|
|
257
229
|
return (
|
|
258
230
|
<View style={[styles.container, containerStyle]}>
|
|
259
231
|
<View style={{ width: size, height: size }}>
|
|
260
|
-
{/* The wheel */}
|
|
261
232
|
<Animated.View
|
|
262
233
|
style={[
|
|
263
234
|
styles.wheelContainer,
|
|
@@ -271,7 +242,7 @@ const SpinWheel: React.FC<SpinWheelProps> = ({
|
|
|
271
242
|
>
|
|
272
243
|
<Svg width={size} height={size} viewBox={`0 0 ${size} ${size}`}>
|
|
273
244
|
<G>
|
|
274
|
-
{wheelPaths.map(({ path, item, textX, textY, angle }
|
|
245
|
+
{wheelPaths.map(({ path, item, textX, textY, angle }) => {
|
|
275
246
|
return (
|
|
276
247
|
<React.Fragment key={item.id}>
|
|
277
248
|
<Path
|
|
@@ -281,8 +252,6 @@ const SpinWheel: React.FC<SpinWheelProps> = ({
|
|
|
281
252
|
? colors[Math.floor(Math.random() * colors.length)]
|
|
282
253
|
: item.color
|
|
283
254
|
}
|
|
284
|
-
// stroke="#FA8072"
|
|
285
|
-
// strokeWidth={1}
|
|
286
255
|
/>
|
|
287
256
|
<SvgText
|
|
288
257
|
x={textX}
|
|
@@ -292,7 +261,7 @@ const SpinWheel: React.FC<SpinWheelProps> = ({
|
|
|
292
261
|
fontWeight={(wheelTextStyle?.fontWeight as any) || "bold"}
|
|
293
262
|
textAnchor="middle"
|
|
294
263
|
alignmentBaseline="central"
|
|
295
|
-
transform={`rotate(${angle + 180}, ${textX}, ${textY}
|
|
264
|
+
transform={`rotate(${angle + 180}, ${textX}, ${textY})`}
|
|
296
265
|
>
|
|
297
266
|
{item.label}
|
|
298
267
|
</SvgText>
|
|
@@ -314,14 +283,12 @@ const SpinWheel: React.FC<SpinWheelProps> = ({
|
|
|
314
283
|
</Svg>
|
|
315
284
|
</Animated.View>
|
|
316
285
|
|
|
317
|
-
{/* The center circle */}
|
|
318
286
|
{centerComponent ? (
|
|
319
287
|
<View
|
|
320
288
|
style={{
|
|
321
289
|
position: "absolute",
|
|
322
290
|
top: "50%",
|
|
323
291
|
left: "50%",
|
|
324
|
-
// Center the component perfectly
|
|
325
292
|
transform: [
|
|
326
293
|
{ translateX: -(actualCenterSize / 2) },
|
|
327
294
|
{ translateY: -(actualCenterSize / 2) },
|
|
@@ -349,7 +316,6 @@ const SpinWheel: React.FC<SpinWheelProps> = ({
|
|
|
349
316
|
/>
|
|
350
317
|
)}
|
|
351
318
|
|
|
352
|
-
{/* The pointer is a triangle on top */}
|
|
353
319
|
<View
|
|
354
320
|
style={[
|
|
355
321
|
styles.pointerPosition,
|
|
@@ -365,7 +331,6 @@ const SpinWheel: React.FC<SpinWheelProps> = ({
|
|
|
365
331
|
/>
|
|
366
332
|
</View>
|
|
367
333
|
|
|
368
|
-
{/* Action Button */}
|
|
369
334
|
<View
|
|
370
335
|
style={{
|
|
371
336
|
position: "absolute",
|
|
@@ -384,15 +349,6 @@ const SpinWheel: React.FC<SpinWheelProps> = ({
|
|
|
384
349
|
textStyle={[styles.actionButtonText, actionButtonTextStyle]}
|
|
385
350
|
{...actionButtonProps}
|
|
386
351
|
/>
|
|
387
|
-
{/* <TouchableOpacity
|
|
388
|
-
onPress={handleSpin}
|
|
389
|
-
disabled={spinning || !enabled || wheelItems.length === 0}
|
|
390
|
-
style={[styles.actionButton, actionButtonStyle]}
|
|
391
|
-
>
|
|
392
|
-
<Text style={[styles.actionButtonText, actionButtonTextStyle]}>
|
|
393
|
-
{spinButtonText}
|
|
394
|
-
</Text>
|
|
395
|
-
</TouchableOpacity> */}
|
|
396
352
|
</View>
|
|
397
353
|
</View>
|
|
398
354
|
</View>
|
|
@@ -404,7 +360,7 @@ const styles = StyleSheet.create({
|
|
|
404
360
|
alignItems: "center",
|
|
405
361
|
justifyContent: "center",
|
|
406
362
|
marginTop: 20,
|
|
407
|
-
marginBottom: 70,
|
|
363
|
+
marginBottom: 70,
|
|
408
364
|
},
|
|
409
365
|
wheelContainer: {
|
|
410
366
|
overflow: "hidden",
|