related-ui-components 3.2.6 → 3.2.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/Wheel/Wheel.js +157 -97
- package/lib/module/components/Wheel/Wheel.js.map +1 -1
- package/lib/typescript/src/components/Wheel/Wheel.d.ts +3 -2
- package/lib/typescript/src/components/Wheel/Wheel.d.ts.map +1 -1
- package/package.json +1 -1
- package/src/components/Wheel/Wheel.tsx +180 -140
|
@@ -5,15 +5,66 @@ import { View, StyleSheet, Animated, Easing } from "react-native";
|
|
|
5
5
|
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
|
+
// Red
|
|
11
|
+
"#FFA500",
|
|
12
|
+
// Orange
|
|
13
|
+
"#FFFF00",
|
|
14
|
+
// Yellow
|
|
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
59
|
const SpinWheel = ({
|
|
10
60
|
items,
|
|
11
61
|
predeterminedWinner,
|
|
62
|
+
// Destructure new prop
|
|
12
63
|
size = 300,
|
|
13
64
|
spinDuration = 5000,
|
|
65
|
+
winner,
|
|
66
|
+
minSpinDuration = 2000,
|
|
14
67
|
enabled = true,
|
|
15
|
-
onSpinPress,
|
|
16
|
-
minSpinTime = 2000,
|
|
17
68
|
onSpinStart,
|
|
18
69
|
onSpinEnd,
|
|
19
70
|
containerStyle,
|
|
@@ -32,15 +83,52 @@ const SpinWheel = ({
|
|
|
32
83
|
centerComponent
|
|
33
84
|
}) => {
|
|
34
85
|
const wheelItems = items.length > 0 ? items : [];
|
|
86
|
+
const spinLoop = useRef(null);
|
|
87
|
+
const spinStartTime = useRef(0);
|
|
35
88
|
const [spinning, setSpinning] = useState(false);
|
|
36
89
|
const [_, setWinner] = useState(null);
|
|
37
90
|
const rotateValue = useRef(new Animated.Value(0)).current;
|
|
91
|
+
|
|
92
|
+
// Track rotation manually for calculations
|
|
38
93
|
const rotationRef = useRef(0);
|
|
94
|
+
const startInfiniteSpin = () => {
|
|
95
|
+
rotateValue.setValue(rotationRef.current);
|
|
96
|
+
spinStartTime.current = Date.now();
|
|
97
|
+
spinLoop.current = Animated.loop(Animated.timing(rotateValue, {
|
|
98
|
+
toValue: rotationRef.current + 1,
|
|
99
|
+
// 1 = full rotation
|
|
100
|
+
duration: 800,
|
|
101
|
+
easing: Easing.linear,
|
|
102
|
+
useNativeDriver: true
|
|
103
|
+
}));
|
|
104
|
+
spinLoop.current.start();
|
|
105
|
+
setSpinning(true);
|
|
106
|
+
onSpinStart?.();
|
|
107
|
+
};
|
|
108
|
+
const stopOnWinner = winnerValue => {
|
|
109
|
+
if (!spinLoop.current) return;
|
|
110
|
+
spinLoop.current.stop();
|
|
111
|
+
spinLoop.current = null;
|
|
112
|
+
const winnerId = typeof winnerValue === "object" ? winnerValue.id : winnerValue;
|
|
113
|
+
const index = items.findIndex(i => i.id === winnerId);
|
|
114
|
+
if (index === -1) return;
|
|
115
|
+
const segmentCenter = (index + 0.5) * anglePerItem;
|
|
116
|
+
const targetAngle = (270 - segmentCenter + 360) % 360;
|
|
117
|
+
const currentAngle = rotationRef.current * 360 % 360;
|
|
118
|
+
const offset = (targetAngle - currentAngle + 360) % 360;
|
|
119
|
+
const finalRotation = rotationRef.current + (offset + 3 * 360) / 360;
|
|
120
|
+
Animated.timing(rotateValue, {
|
|
121
|
+
toValue: finalRotation,
|
|
122
|
+
duration: 2500,
|
|
123
|
+
easing: Easing.out(Easing.cubic),
|
|
124
|
+
useNativeDriver: true
|
|
125
|
+
}).start(() => {
|
|
126
|
+
setSpinning(false);
|
|
127
|
+
onSpinEnd?.(items[index]);
|
|
128
|
+
});
|
|
129
|
+
};
|
|
39
130
|
|
|
40
|
-
//
|
|
41
|
-
const asyncWinnerRef = useRef(null);
|
|
42
|
-
const spinStartTimeRef = useRef(0);
|
|
43
|
-
const continuousSpinRef = useRef(null);
|
|
131
|
+
// Update tracked rotation when animation completes
|
|
44
132
|
useEffect(() => {
|
|
45
133
|
const listener = rotateValue.addListener(({
|
|
46
134
|
value
|
|
@@ -51,7 +139,11 @@ const SpinWheel = ({
|
|
|
51
139
|
rotateValue.removeListener(listener);
|
|
52
140
|
};
|
|
53
141
|
}, [rotateValue]);
|
|
142
|
+
|
|
143
|
+
// Calculate angle for each segment
|
|
54
144
|
const anglePerItem = wheelItems.length > 0 ? 360 / wheelItems.length : 0;
|
|
145
|
+
|
|
146
|
+
// Create wheel segments
|
|
55
147
|
const generateWheelPaths = () => {
|
|
56
148
|
if (wheelItems.length === 0) return [];
|
|
57
149
|
return wheelItems.map((item, index) => {
|
|
@@ -68,45 +160,57 @@ const SpinWheel = ({
|
|
|
68
160
|
const midRad = (startAngle + endAngle) / 2 * (Math.PI / 180);
|
|
69
161
|
const textX = size / 2 + size * 0.32 * Math.cos(midRad);
|
|
70
162
|
const textY = size / 2 + size * 0.32 * Math.sin(midRad);
|
|
163
|
+
|
|
164
|
+
// decorationX and decorationY are calculated but not used in the provided JSX
|
|
165
|
+
// const decorationX = size / 2 + size * 0.43 * Math.cos(midRad);
|
|
166
|
+
// const decorationY = size / 2 + size * 0.43 * Math.sin(midRad);
|
|
167
|
+
|
|
71
168
|
return {
|
|
72
169
|
path: pathData,
|
|
73
170
|
item,
|
|
74
171
|
textX,
|
|
75
172
|
textY,
|
|
173
|
+
// decorationX,
|
|
174
|
+
// decorationY,
|
|
76
175
|
angle: (startAngle + endAngle) / 2
|
|
77
176
|
};
|
|
78
177
|
});
|
|
79
178
|
};
|
|
80
179
|
const wheelPaths = generateWheelPaths();
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
const stopAndLandOnWinner = winner => {
|
|
93
|
-
if (continuousSpinRef.current) {
|
|
94
|
-
continuousSpinRef.current.stop();
|
|
95
|
-
continuousSpinRef.current = null;
|
|
180
|
+
|
|
181
|
+
// Handle spin button press
|
|
182
|
+
const handleSpin = () => {
|
|
183
|
+
if (spinning || !enabled || wheelItems.length === 0) return;
|
|
184
|
+
setSpinning(true);
|
|
185
|
+
onSpinStart?.();
|
|
186
|
+
let targetRotation = 0;
|
|
187
|
+
let winnerTargetIndex = -1;
|
|
188
|
+
if (predeterminedWinner) {
|
|
189
|
+
const winnerId = typeof predeterminedWinner === "object" ? predeterminedWinner.id : predeterminedWinner;
|
|
190
|
+
winnerTargetIndex = wheelItems.findIndex(item => item.id === winnerId);
|
|
96
191
|
}
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
192
|
+
if (winnerTargetIndex !== -1) {
|
|
193
|
+
const targetSegmentCenterAngle = (winnerTargetIndex + 0.5) * anglePerItem;
|
|
194
|
+
const targetNormalizedAngle = (270 - targetSegmentCenterAngle + 360) % 360;
|
|
195
|
+
const currentAbsoluteAngle = rotationRef.current * 360;
|
|
196
|
+
const currentNormalizedAngle = (currentAbsoluteAngle % 360 + 360) % 360;
|
|
197
|
+
|
|
198
|
+
// Additional angle needed to reach the targetNormalizedAngle from currentNormalizedAngle
|
|
199
|
+
const angleOffset = (targetNormalizedAngle - currentNormalizedAngle + 360) % 360;
|
|
200
|
+
|
|
201
|
+
// Number of full spins (e.g., 3 to 5)
|
|
202
|
+
const numberOfFullSpins = 3 + Math.floor(Math.random() * 3); // 3, 4, or 5 spins
|
|
203
|
+
targetRotation = numberOfFullSpins * 360 + angleOffset;
|
|
204
|
+
|
|
205
|
+
// Ensure minimum rotation if already aligned (e.g. if angleOffset is 0)
|
|
206
|
+
if (targetRotation < 360) {
|
|
207
|
+
targetRotation += 360 * (3 + Math.floor(Math.random() * 3));
|
|
208
|
+
}
|
|
209
|
+
} else {
|
|
210
|
+
const randomSpins = 3 + Math.random() * 2;
|
|
211
|
+
const randomAngle = Math.random() * 360;
|
|
212
|
+
targetRotation = 360 * randomSpins + randomAngle;
|
|
102
213
|
}
|
|
103
|
-
const targetSegmentCenterAngle = (winnerTargetIndex + 0.5) * anglePerItem;
|
|
104
|
-
const targetNormalizedAngle = (270 - targetSegmentCenterAngle + 360) % 360;
|
|
105
|
-
const currentAbsoluteAngle = rotationRef.current * 360;
|
|
106
|
-
const currentNormalizedAngle = (currentAbsoluteAngle % 360 + 360) % 360;
|
|
107
|
-
const angleOffset = (targetNormalizedAngle - currentNormalizedAngle + 360) % 360;
|
|
108
|
-
const additionalSpins = 2;
|
|
109
|
-
const targetRotation = additionalSpins * 360 + angleOffset;
|
|
110
214
|
Animated.timing(rotateValue, {
|
|
111
215
|
toValue: rotationRef.current + targetRotation / 360,
|
|
112
216
|
duration: spinDuration,
|
|
@@ -114,66 +218,8 @@ const SpinWheel = ({
|
|
|
114
218
|
useNativeDriver: true
|
|
115
219
|
}).start(() => handleSpinEnd());
|
|
116
220
|
};
|
|
117
|
-
const handleSpin = async () => {
|
|
118
|
-
if (spinning || !enabled || wheelItems.length === 0) return;
|
|
119
|
-
setSpinning(true);
|
|
120
|
-
asyncWinnerRef.current = null;
|
|
121
|
-
spinStartTimeRef.current = Date.now();
|
|
122
|
-
onSpinStart?.();
|
|
123
221
|
|
|
124
|
-
|
|
125
|
-
if (onSpinPress) {
|
|
126
|
-
startContinuousSpin();
|
|
127
|
-
try {
|
|
128
|
-
const winner = await onSpinPress();
|
|
129
|
-
const elapsedTime = Date.now() - spinStartTimeRef.current;
|
|
130
|
-
const remainingBufferTime = Math.max(0, minSpinTime - elapsedTime);
|
|
131
|
-
if (remainingBufferTime > 0) {
|
|
132
|
-
setTimeout(() => {
|
|
133
|
-
stopAndLandOnWinner(winner);
|
|
134
|
-
}, remainingBufferTime);
|
|
135
|
-
} else {
|
|
136
|
-
stopAndLandOnWinner(winner);
|
|
137
|
-
}
|
|
138
|
-
} catch (error) {
|
|
139
|
-
console.error("Error fetching winner:", error);
|
|
140
|
-
if (continuousSpinRef.current) {
|
|
141
|
-
continuousSpinRef.current.stop();
|
|
142
|
-
}
|
|
143
|
-
setSpinning(false);
|
|
144
|
-
}
|
|
145
|
-
} else {
|
|
146
|
-
// Original behavior with predeterminedWinner
|
|
147
|
-
let targetRotation = 0;
|
|
148
|
-
let winnerTargetIndex = -1;
|
|
149
|
-
if (predeterminedWinner) {
|
|
150
|
-
const winnerId = typeof predeterminedWinner === "object" ? predeterminedWinner.id : predeterminedWinner;
|
|
151
|
-
winnerTargetIndex = wheelItems.findIndex(item => item.id === winnerId);
|
|
152
|
-
}
|
|
153
|
-
if (winnerTargetIndex !== -1) {
|
|
154
|
-
const targetSegmentCenterAngle = (winnerTargetIndex + 0.5) * anglePerItem;
|
|
155
|
-
const targetNormalizedAngle = (270 - targetSegmentCenterAngle + 360) % 360;
|
|
156
|
-
const currentAbsoluteAngle = rotationRef.current * 360;
|
|
157
|
-
const currentNormalizedAngle = (currentAbsoluteAngle % 360 + 360) % 360;
|
|
158
|
-
const angleOffset = (targetNormalizedAngle - currentNormalizedAngle + 360) % 360;
|
|
159
|
-
const numberOfFullSpins = 3 + Math.floor(Math.random() * 3);
|
|
160
|
-
targetRotation = numberOfFullSpins * 360 + angleOffset;
|
|
161
|
-
if (targetRotation < 360) {
|
|
162
|
-
targetRotation += 360 * (3 + Math.floor(Math.random() * 3));
|
|
163
|
-
}
|
|
164
|
-
} else {
|
|
165
|
-
const randomSpins = 3 + Math.random() * 2;
|
|
166
|
-
const randomAngle = Math.random() * 360;
|
|
167
|
-
targetRotation = 360 * randomSpins + randomAngle;
|
|
168
|
-
}
|
|
169
|
-
Animated.timing(rotateValue, {
|
|
170
|
-
toValue: rotationRef.current + targetRotation / 360,
|
|
171
|
-
duration: spinDuration,
|
|
172
|
-
easing: Easing.out(Easing.cubic),
|
|
173
|
-
useNativeDriver: true
|
|
174
|
-
}).start(() => handleSpinEnd());
|
|
175
|
-
}
|
|
176
|
-
};
|
|
222
|
+
// Handle spin completion
|
|
177
223
|
const handleSpinEnd = () => {
|
|
178
224
|
setSpinning(false);
|
|
179
225
|
const normalizedAngle = rotationRef.current * 360 % 360;
|
|
@@ -188,6 +234,17 @@ const SpinWheel = ({
|
|
|
188
234
|
onSpinEnd?.(wheelItems[0]);
|
|
189
235
|
}
|
|
190
236
|
};
|
|
237
|
+
useEffect(() => {
|
|
238
|
+
if (!winner || !spinning) return;
|
|
239
|
+
const elapsed = Date.now() - spinStartTime.current;
|
|
240
|
+
const delay = Math.max(0, minSpinDuration - elapsed);
|
|
241
|
+
const timeout = setTimeout(() => {
|
|
242
|
+
stopOnWinner(winner);
|
|
243
|
+
}, delay);
|
|
244
|
+
return () => clearTimeout(timeout);
|
|
245
|
+
}, [winner]);
|
|
246
|
+
|
|
247
|
+
// Animation interpolation for rotation
|
|
191
248
|
const rotate = rotateValue.interpolate({
|
|
192
249
|
inputRange: [0, 1],
|
|
193
250
|
outputRange: ["0deg", "360deg"]
|
|
@@ -220,11 +277,13 @@ const SpinWheel = ({
|
|
|
220
277
|
textX,
|
|
221
278
|
textY,
|
|
222
279
|
angle
|
|
223
|
-
}) => {
|
|
280
|
+
}, index) => {
|
|
224
281
|
return /*#__PURE__*/_jsxs(React.Fragment, {
|
|
225
282
|
children: [/*#__PURE__*/_jsx(Path, {
|
|
226
283
|
d: path,
|
|
227
284
|
fill: item.color == "" || item.color == null ? colors[Math.floor(Math.random() * colors.length)] : item.color
|
|
285
|
+
// stroke="#FA8072"
|
|
286
|
+
// strokeWidth={1}
|
|
228
287
|
}), /*#__PURE__*/_jsx(SvgText, {
|
|
229
288
|
x: textX,
|
|
230
289
|
y: textY,
|
|
@@ -233,7 +292,7 @@ const SpinWheel = ({
|
|
|
233
292
|
fontWeight: wheelTextStyle?.fontWeight || "bold",
|
|
234
293
|
textAnchor: "middle",
|
|
235
294
|
alignmentBaseline: "central",
|
|
236
|
-
transform: `rotate(${angle + 180}, ${textX}, ${textY})`,
|
|
295
|
+
transform: `rotate(${angle + 180}, ${textX}, ${textY} )`,
|
|
237
296
|
children: item.label
|
|
238
297
|
})]
|
|
239
298
|
}, item.id);
|
|
@@ -252,6 +311,7 @@ const SpinWheel = ({
|
|
|
252
311
|
position: "absolute",
|
|
253
312
|
top: "50%",
|
|
254
313
|
left: "50%",
|
|
314
|
+
// Center the component perfectly
|
|
255
315
|
transform: [{
|
|
256
316
|
translateX: -(actualCenterSize / 2)
|
|
257
317
|
}, {
|
|
@@ -291,7 +351,7 @@ const SpinWheel = ({
|
|
|
291
351
|
},
|
|
292
352
|
children: /*#__PURE__*/_jsx(Button, {
|
|
293
353
|
style: [styles.actionButton, actionButtonStyle],
|
|
294
|
-
onPress:
|
|
354
|
+
onPress: startInfiniteSpin,
|
|
295
355
|
title: spinButtonText,
|
|
296
356
|
disabled: spinning,
|
|
297
357
|
textStyle: [styles.actionButtonText, actionButtonTextStyle],
|
|
@@ -306,7 +366,7 @@ const styles = StyleSheet.create({
|
|
|
306
366
|
alignItems: "center",
|
|
307
367
|
justifyContent: "center",
|
|
308
368
|
marginTop: 20,
|
|
309
|
-
marginBottom: 70
|
|
369
|
+
marginBottom: 70 // Space for the button
|
|
310
370
|
},
|
|
311
371
|
wheelContainer: {
|
|
312
372
|
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","predeterminedWinner","size","spinDuration","enabled","onSpinPress","minSpinTime","onSpinStart","onSpinEnd","containerStyle","centerStyle","spinButtonText","wheelTextStyle","knobStyle","knobColor","actionButtonStyle","actionButtonTextStyle","wheelBorderColor","wheelBorderWidth","wheelTextColor","actionButtonProps","centerSize","centerComponent","wheelItems","length","spinning","setSpinning","_","setWinner","rotateValue","Value","current","rotationRef","asyncWinnerRef","spinStartTimeRef","continuousSpinRef","listener","addListener","value","removeListener","anglePerItem","generateWheelPaths","map","item","index","startAngle","endAngle","startRad","Math","PI","endRad","x1","cos","y1","sin","x2","y2","largeArcFlag","pathData","join","midRad","textX","textY","path","angle","wheelPaths","startContinuousSpin","numberOfSpins","targetRotation","loop","timing","toValue","duration","easing","linear","useNativeDriver","start","stopAndLandOnWinner","winner","stop","winnerId","id","winnerTargetIndex","findIndex","handleSpinEnd","targetSegmentCenterAngle","targetNormalizedAngle","currentAbsoluteAngle","currentNormalizedAngle","angleOffset","additionalSpins","out","cubic","handleSpin","Date","now","elapsedTime","remainingBufferTime","max","setTimeout","error","console","numberOfFullSpins","floor","random","randomSpins","randomAngle","normalizedAngle","winningIndex","adjustedIndex","finalWinnerIndex","winningItem","rotate","interpolate","inputRange","outputRange","actualCenterSize","undefined","style","styles","container","children","width","height","wheelContainer","borderRadius","transform","viewBox","Fragment","d","fill","color","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","SpinWheel","items","predeterminedWinner","size","spinDuration","winner","minSpinDuration","enabled","onSpinStart","onSpinEnd","containerStyle","centerStyle","spinButtonText","wheelTextStyle","knobStyle","knobColor","actionButtonStyle","actionButtonTextStyle","wheelBorderColor","wheelBorderWidth","wheelTextColor","actionButtonProps","centerSize","centerComponent","wheelItems","length","spinLoop","spinStartTime","spinning","setSpinning","_","setWinner","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","handleSpin","targetRotation","winnerTargetIndex","targetSegmentCenterAngle","targetNormalizedAngle","currentAbsoluteAngle","currentNormalizedAngle","angleOffset","numberOfFullSpins","floor","random","randomSpins","randomAngle","handleSpinEnd","normalizedAngle","winningIndex","adjustedIndex","finalWinnerIndex","winningItem","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","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":[]}
|
|
@@ -12,11 +12,12 @@ interface SpinWheelProps {
|
|
|
12
12
|
items: SpinWheelItem[];
|
|
13
13
|
predeterminedWinner?: SpinWheelItem | string | number;
|
|
14
14
|
size?: number;
|
|
15
|
+
startSpin?: boolean;
|
|
16
|
+
winner?: SpinWheelItem | string | number;
|
|
17
|
+
minSpinDuration?: number;
|
|
15
18
|
spinDuration?: number;
|
|
16
19
|
friction?: number;
|
|
17
20
|
enabled?: boolean;
|
|
18
|
-
onSpinPress?: () => Promise<SpinWheelItem | string | number>;
|
|
19
|
-
minSpinTime?: number;
|
|
20
21
|
onSpinStart?: () => void;
|
|
21
22
|
onSpinEnd?: (item: SpinWheelItem) => void;
|
|
22
23
|
containerStyle?: ViewStyle;
|
|
@@ -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;AA+BD,UAAU,cAAc;IAEtB,KAAK,EAAE,aAAa,EAAE,CAAC;IACvB,mBAAmB,CAAC,EAAE,aAAa,GAAG,MAAM,GAAG,MAAM,CAAC;IAGtD,IAAI,CAAC,EAAE,MAAM,CAAC;IAEd,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,MAAM,CAAC,EAAE,aAAa,GAAG,MAAM,GAAG,MAAM,CAAC;IACzC,eAAe,CAAC,EAAE,MAAM,CAAC;IAGzB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,OAAO,CAAC;IAGlB,WAAW,CAAC,EAAE,MAAM,IAAI,CAAC;IACzB,SAAS,CAAC,EAAE,CAAC,IAAI,EAAE,aAAa,KAAK,IAAI,CAAC;IAG1C,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;IAEvE,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB,UAAU,CAAC,EAAE,MAAM,CAAC;IAEpB,eAAe,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;CACnC;AAED,QAAA,MAAM,SAAS,EAAE,KAAK,CAAC,EAAE,CAAC,cAAc,CAmYvC,CAAC;AAqDF,eAAe,SAAS,CAAC"}
|
package/package.json
CHANGED
|
@@ -20,28 +20,57 @@ export interface SpinWheelItem {
|
|
|
20
20
|
textColor?: string;
|
|
21
21
|
}
|
|
22
22
|
|
|
23
|
+
//default random colors
|
|
23
24
|
const colors = [
|
|
24
|
-
"#FF0000",
|
|
25
|
-
"#
|
|
26
|
-
"#
|
|
27
|
-
"#
|
|
28
|
-
"#
|
|
25
|
+
"#FF0000", // Red
|
|
26
|
+
"#FFA500", // Orange
|
|
27
|
+
"#FFFF00", // Yellow
|
|
28
|
+
"#008000", // Green
|
|
29
|
+
"#0000FF", // Blue
|
|
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
|
|
29
50
|
];
|
|
30
51
|
|
|
31
52
|
interface SpinWheelProps {
|
|
53
|
+
// Data
|
|
32
54
|
items: SpinWheelItem[];
|
|
33
55
|
predeterminedWinner?: SpinWheelItem | string | number;
|
|
56
|
+
|
|
57
|
+
// Dimensions
|
|
34
58
|
size?: number;
|
|
59
|
+
|
|
60
|
+
startSpin?: boolean; // start spinning immediately
|
|
61
|
+
winner?: SpinWheelItem | string | number; // winner from API
|
|
62
|
+
minSpinDuration?: number; // buffer in ms before stopping
|
|
63
|
+
|
|
64
|
+
// Behavior
|
|
35
65
|
spinDuration?: number;
|
|
36
66
|
friction?: number;
|
|
37
67
|
enabled?: boolean;
|
|
38
|
-
|
|
39
|
-
//
|
|
40
|
-
onSpinPress?: () => Promise<SpinWheelItem | string | number>;
|
|
41
|
-
minSpinTime?: number; // Minimum time to spin before winner can be set
|
|
42
|
-
|
|
68
|
+
|
|
69
|
+
// Events
|
|
43
70
|
onSpinStart?: () => void;
|
|
44
71
|
onSpinEnd?: (item: SpinWheelItem) => void;
|
|
72
|
+
|
|
73
|
+
// Styling
|
|
45
74
|
containerStyle?: ViewStyle;
|
|
46
75
|
centerStyle?: ViewStyle;
|
|
47
76
|
spinButtonText?: string;
|
|
@@ -50,22 +79,25 @@ interface SpinWheelProps {
|
|
|
50
79
|
actionButtonStyle?: ViewStyle;
|
|
51
80
|
actionButtonTextStyle?: TextStyle;
|
|
52
81
|
actionButtonProps?: Partial<Omit<AppButtonProps, "title" | "onPress">>;
|
|
82
|
+
|
|
53
83
|
wheelBorderColor?: string;
|
|
54
84
|
wheelBorderWidth?: number;
|
|
55
85
|
wheelTextColor?: string;
|
|
56
86
|
knobColor?: string;
|
|
87
|
+
|
|
57
88
|
centerSize?: number;
|
|
58
|
-
|
|
89
|
+
|
|
90
|
+
centerComponent?: React.ReactNode; // Note: centerComponent prop is declared but not used
|
|
59
91
|
}
|
|
60
92
|
|
|
61
93
|
const SpinWheel: React.FC<SpinWheelProps> = ({
|
|
62
94
|
items,
|
|
63
|
-
predeterminedWinner,
|
|
95
|
+
predeterminedWinner, // Destructure new prop
|
|
64
96
|
size = 300,
|
|
65
97
|
spinDuration = 5000,
|
|
98
|
+
winner,
|
|
99
|
+
minSpinDuration = 2000,
|
|
66
100
|
enabled = true,
|
|
67
|
-
onSpinPress,
|
|
68
|
-
minSpinTime = 2000,
|
|
69
101
|
onSpinStart,
|
|
70
102
|
onSpinEnd,
|
|
71
103
|
containerStyle,
|
|
@@ -85,16 +117,67 @@ const SpinWheel: React.FC<SpinWheelProps> = ({
|
|
|
85
117
|
}) => {
|
|
86
118
|
const wheelItems = items.length > 0 ? items : [];
|
|
87
119
|
|
|
120
|
+
const spinLoop = useRef<Animated.CompositeAnimation | null>(null);
|
|
121
|
+
const spinStartTime = useRef<number>(0);
|
|
122
|
+
|
|
88
123
|
const [spinning, setSpinning] = useState(false);
|
|
89
124
|
const [_, setWinner] = useState<SpinWheelItem | null>(null);
|
|
90
125
|
const rotateValue = useRef(new Animated.Value(0)).current;
|
|
126
|
+
|
|
127
|
+
// Track rotation manually for calculations
|
|
91
128
|
const rotationRef = useRef(0);
|
|
92
|
-
|
|
93
|
-
// Track the async winner state
|
|
94
|
-
const asyncWinnerRef = useRef<SpinWheelItem | string | number | null>(null);
|
|
95
|
-
const spinStartTimeRef = useRef<number>(0);
|
|
96
|
-
const continuousSpinRef = useRef<Animated.CompositeAnimation | null>(null);
|
|
97
129
|
|
|
130
|
+
const startInfiniteSpin = () => {
|
|
131
|
+
rotateValue.setValue(rotationRef.current);
|
|
132
|
+
|
|
133
|
+
spinStartTime.current = Date.now();
|
|
134
|
+
|
|
135
|
+
spinLoop.current = Animated.loop(
|
|
136
|
+
Animated.timing(rotateValue, {
|
|
137
|
+
toValue: rotationRef.current + 1, // 1 = full rotation
|
|
138
|
+
duration: 800,
|
|
139
|
+
easing: Easing.linear,
|
|
140
|
+
useNativeDriver: true,
|
|
141
|
+
})
|
|
142
|
+
);
|
|
143
|
+
|
|
144
|
+
spinLoop.current.start();
|
|
145
|
+
setSpinning(true);
|
|
146
|
+
onSpinStart?.();
|
|
147
|
+
};
|
|
148
|
+
|
|
149
|
+
const stopOnWinner = (winnerValue: SpinWheelItem | string | number) => {
|
|
150
|
+
if (!spinLoop.current) return;
|
|
151
|
+
|
|
152
|
+
spinLoop.current.stop();
|
|
153
|
+
spinLoop.current = null;
|
|
154
|
+
|
|
155
|
+
const winnerId =
|
|
156
|
+
typeof winnerValue === "object" ? winnerValue.id : winnerValue;
|
|
157
|
+
|
|
158
|
+
const index = items.findIndex((i) => i.id === winnerId);
|
|
159
|
+
if (index === -1) return;
|
|
160
|
+
|
|
161
|
+
const segmentCenter = (index + 0.5) * anglePerItem;
|
|
162
|
+
const targetAngle = (270 - segmentCenter + 360) % 360;
|
|
163
|
+
|
|
164
|
+
const currentAngle = (rotationRef.current * 360) % 360;
|
|
165
|
+
const offset = (targetAngle - currentAngle + 360) % 360;
|
|
166
|
+
|
|
167
|
+
const finalRotation = rotationRef.current + (offset + 3 * 360) / 360;
|
|
168
|
+
|
|
169
|
+
Animated.timing(rotateValue, {
|
|
170
|
+
toValue: finalRotation,
|
|
171
|
+
duration: 2500,
|
|
172
|
+
easing: Easing.out(Easing.cubic),
|
|
173
|
+
useNativeDriver: true,
|
|
174
|
+
}).start(() => {
|
|
175
|
+
setSpinning(false);
|
|
176
|
+
onSpinEnd?.(items[index]);
|
|
177
|
+
});
|
|
178
|
+
};
|
|
179
|
+
|
|
180
|
+
// Update tracked rotation when animation completes
|
|
98
181
|
useEffect(() => {
|
|
99
182
|
const listener = rotateValue.addListener(({ value }) => {
|
|
100
183
|
rotationRef.current = value;
|
|
@@ -105,8 +188,10 @@ const SpinWheel: React.FC<SpinWheelProps> = ({
|
|
|
105
188
|
};
|
|
106
189
|
}, [rotateValue]);
|
|
107
190
|
|
|
191
|
+
// Calculate angle for each segment
|
|
108
192
|
const anglePerItem = wheelItems.length > 0 ? 360 / wheelItems.length : 0;
|
|
109
193
|
|
|
194
|
+
// Create wheel segments
|
|
110
195
|
const generateWheelPaths = () => {
|
|
111
196
|
if (wheelItems.length === 0) return [];
|
|
112
197
|
return wheelItems.map((item, index) => {
|
|
@@ -134,11 +219,17 @@ const SpinWheel: React.FC<SpinWheelProps> = ({
|
|
|
134
219
|
const textX = size / 2 + size * 0.32 * Math.cos(midRad);
|
|
135
220
|
const textY = size / 2 + size * 0.32 * Math.sin(midRad);
|
|
136
221
|
|
|
222
|
+
// decorationX and decorationY are calculated but not used in the provided JSX
|
|
223
|
+
// const decorationX = size / 2 + size * 0.43 * Math.cos(midRad);
|
|
224
|
+
// const decorationY = size / 2 + size * 0.43 * Math.sin(midRad);
|
|
225
|
+
|
|
137
226
|
return {
|
|
138
227
|
path: pathData,
|
|
139
228
|
item,
|
|
140
229
|
textX,
|
|
141
230
|
textY,
|
|
231
|
+
// decorationX,
|
|
232
|
+
// decorationY,
|
|
142
233
|
angle: (startAngle + endAngle) / 2,
|
|
143
234
|
};
|
|
144
235
|
});
|
|
@@ -146,49 +237,50 @@ const SpinWheel: React.FC<SpinWheelProps> = ({
|
|
|
146
237
|
|
|
147
238
|
const wheelPaths = generateWheelPaths();
|
|
148
239
|
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
240
|
+
// Handle spin button press
|
|
241
|
+
const handleSpin = () => {
|
|
242
|
+
if (spinning || !enabled || wheelItems.length === 0) return;
|
|
152
243
|
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
toValue: rotationRef.current + targetRotation / 360,
|
|
156
|
-
duration: 2000,
|
|
157
|
-
easing: Easing.linear,
|
|
158
|
-
useNativeDriver: true,
|
|
159
|
-
})
|
|
160
|
-
);
|
|
244
|
+
setSpinning(true);
|
|
245
|
+
onSpinStart?.();
|
|
161
246
|
|
|
162
|
-
|
|
163
|
-
|
|
247
|
+
let targetRotation = 0;
|
|
248
|
+
let winnerTargetIndex = -1;
|
|
164
249
|
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
250
|
+
if (predeterminedWinner) {
|
|
251
|
+
const winnerId =
|
|
252
|
+
typeof predeterminedWinner === "object"
|
|
253
|
+
? predeterminedWinner.id
|
|
254
|
+
: predeterminedWinner;
|
|
255
|
+
winnerTargetIndex = wheelItems.findIndex((item) => item.id === winnerId);
|
|
169
256
|
}
|
|
170
257
|
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
(item) => item.id === winnerId
|
|
174
|
-
);
|
|
258
|
+
if (winnerTargetIndex !== -1) {
|
|
259
|
+
const targetSegmentCenterAngle = (winnerTargetIndex + 0.5) * anglePerItem;
|
|
175
260
|
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
return;
|
|
179
|
-
}
|
|
261
|
+
const targetNormalizedAngle =
|
|
262
|
+
(270 - targetSegmentCenterAngle + 360) % 360;
|
|
180
263
|
|
|
181
|
-
|
|
182
|
-
|
|
264
|
+
const currentAbsoluteAngle = rotationRef.current * 360;
|
|
265
|
+
const currentNormalizedAngle = ((currentAbsoluteAngle % 360) + 360) % 360;
|
|
183
266
|
|
|
184
|
-
|
|
185
|
-
|
|
267
|
+
// Additional angle needed to reach the targetNormalizedAngle from currentNormalizedAngle
|
|
268
|
+
const angleOffset =
|
|
269
|
+
(targetNormalizedAngle - currentNormalizedAngle + 360) % 360;
|
|
186
270
|
|
|
187
|
-
|
|
188
|
-
|
|
271
|
+
// Number of full spins (e.g., 3 to 5)
|
|
272
|
+
const numberOfFullSpins = 3 + Math.floor(Math.random() * 3); // 3, 4, or 5 spins
|
|
273
|
+
targetRotation = numberOfFullSpins * 360 + angleOffset;
|
|
189
274
|
|
|
190
|
-
|
|
191
|
-
|
|
275
|
+
// Ensure minimum rotation if already aligned (e.g. if angleOffset is 0)
|
|
276
|
+
if (targetRotation < 360) {
|
|
277
|
+
targetRotation += 360 * (3 + Math.floor(Math.random() * 3));
|
|
278
|
+
}
|
|
279
|
+
} else {
|
|
280
|
+
const randomSpins = 3 + Math.random() * 2;
|
|
281
|
+
const randomAngle = Math.random() * 360;
|
|
282
|
+
targetRotation = 360 * randomSpins + randomAngle;
|
|
283
|
+
}
|
|
192
284
|
|
|
193
285
|
Animated.timing(rotateValue, {
|
|
194
286
|
toValue: rotationRef.current + targetRotation / 360,
|
|
@@ -198,87 +290,7 @@ const SpinWheel: React.FC<SpinWheelProps> = ({
|
|
|
198
290
|
}).start(() => handleSpinEnd());
|
|
199
291
|
};
|
|
200
292
|
|
|
201
|
-
|
|
202
|
-
if (spinning || !enabled || wheelItems.length === 0) return;
|
|
203
|
-
|
|
204
|
-
setSpinning(true);
|
|
205
|
-
asyncWinnerRef.current = null;
|
|
206
|
-
spinStartTimeRef.current = Date.now();
|
|
207
|
-
onSpinStart?.();
|
|
208
|
-
|
|
209
|
-
// If using async API call
|
|
210
|
-
if (onSpinPress) {
|
|
211
|
-
startContinuousSpin();
|
|
212
|
-
|
|
213
|
-
try {
|
|
214
|
-
const winner = await onSpinPress();
|
|
215
|
-
const elapsedTime = Date.now() - spinStartTimeRef.current;
|
|
216
|
-
const remainingBufferTime = Math.max(0, minSpinTime - elapsedTime);
|
|
217
|
-
|
|
218
|
-
if (remainingBufferTime > 0) {
|
|
219
|
-
setTimeout(() => {
|
|
220
|
-
stopAndLandOnWinner(winner);
|
|
221
|
-
}, remainingBufferTime);
|
|
222
|
-
} else {
|
|
223
|
-
stopAndLandOnWinner(winner);
|
|
224
|
-
}
|
|
225
|
-
} catch (error) {
|
|
226
|
-
console.error("Error fetching winner:", error);
|
|
227
|
-
if (continuousSpinRef.current) {
|
|
228
|
-
continuousSpinRef.current.stop();
|
|
229
|
-
}
|
|
230
|
-
setSpinning(false);
|
|
231
|
-
}
|
|
232
|
-
} else {
|
|
233
|
-
// Original behavior with predeterminedWinner
|
|
234
|
-
let targetRotation = 0;
|
|
235
|
-
let winnerTargetIndex = -1;
|
|
236
|
-
|
|
237
|
-
if (predeterminedWinner) {
|
|
238
|
-
const winnerId =
|
|
239
|
-
typeof predeterminedWinner === "object"
|
|
240
|
-
? predeterminedWinner.id
|
|
241
|
-
: predeterminedWinner;
|
|
242
|
-
winnerTargetIndex = wheelItems.findIndex(
|
|
243
|
-
(item) => item.id === winnerId
|
|
244
|
-
);
|
|
245
|
-
}
|
|
246
|
-
|
|
247
|
-
if (winnerTargetIndex !== -1) {
|
|
248
|
-
const targetSegmentCenterAngle =
|
|
249
|
-
(winnerTargetIndex + 0.5) * anglePerItem;
|
|
250
|
-
|
|
251
|
-
const targetNormalizedAngle =
|
|
252
|
-
(270 - targetSegmentCenterAngle + 360) % 360;
|
|
253
|
-
|
|
254
|
-
const currentAbsoluteAngle = rotationRef.current * 360;
|
|
255
|
-
const currentNormalizedAngle =
|
|
256
|
-
(currentAbsoluteAngle % 360 + 360) % 360;
|
|
257
|
-
|
|
258
|
-
const angleOffset =
|
|
259
|
-
(targetNormalizedAngle - currentNormalizedAngle + 360) % 360;
|
|
260
|
-
|
|
261
|
-
const numberOfFullSpins = 3 + Math.floor(Math.random() * 3);
|
|
262
|
-
targetRotation = numberOfFullSpins * 360 + angleOffset;
|
|
263
|
-
|
|
264
|
-
if (targetRotation < 360) {
|
|
265
|
-
targetRotation += 360 * (3 + Math.floor(Math.random() * 3));
|
|
266
|
-
}
|
|
267
|
-
} else {
|
|
268
|
-
const randomSpins = 3 + Math.random() * 2;
|
|
269
|
-
const randomAngle = Math.random() * 360;
|
|
270
|
-
targetRotation = 360 * randomSpins + randomAngle;
|
|
271
|
-
}
|
|
272
|
-
|
|
273
|
-
Animated.timing(rotateValue, {
|
|
274
|
-
toValue: rotationRef.current + targetRotation / 360,
|
|
275
|
-
duration: spinDuration,
|
|
276
|
-
easing: Easing.out(Easing.cubic),
|
|
277
|
-
useNativeDriver: true,
|
|
278
|
-
}).start(() => handleSpinEnd());
|
|
279
|
-
}
|
|
280
|
-
};
|
|
281
|
-
|
|
293
|
+
// Handle spin completion
|
|
282
294
|
const handleSpinEnd = () => {
|
|
283
295
|
setSpinning(false);
|
|
284
296
|
|
|
@@ -301,6 +313,20 @@ const SpinWheel: React.FC<SpinWheelProps> = ({
|
|
|
301
313
|
}
|
|
302
314
|
};
|
|
303
315
|
|
|
316
|
+
useEffect(() => {
|
|
317
|
+
if (!winner || !spinning) return;
|
|
318
|
+
|
|
319
|
+
const elapsed = Date.now() - spinStartTime.current;
|
|
320
|
+
const delay = Math.max(0, minSpinDuration - elapsed);
|
|
321
|
+
|
|
322
|
+
const timeout = setTimeout(() => {
|
|
323
|
+
stopOnWinner(winner);
|
|
324
|
+
}, delay);
|
|
325
|
+
|
|
326
|
+
return () => clearTimeout(timeout);
|
|
327
|
+
}, [winner]);
|
|
328
|
+
|
|
329
|
+
// Animation interpolation for rotation
|
|
304
330
|
const rotate = rotateValue.interpolate({
|
|
305
331
|
inputRange: [0, 1],
|
|
306
332
|
outputRange: ["0deg", "360deg"],
|
|
@@ -311,6 +337,7 @@ const SpinWheel: React.FC<SpinWheelProps> = ({
|
|
|
311
337
|
return (
|
|
312
338
|
<View style={[styles.container, containerStyle]}>
|
|
313
339
|
<View style={{ width: size, height: size }}>
|
|
340
|
+
{/* The wheel */}
|
|
314
341
|
<Animated.View
|
|
315
342
|
style={[
|
|
316
343
|
styles.wheelContainer,
|
|
@@ -324,7 +351,7 @@ const SpinWheel: React.FC<SpinWheelProps> = ({
|
|
|
324
351
|
>
|
|
325
352
|
<Svg width={size} height={size} viewBox={`0 0 ${size} ${size}`}>
|
|
326
353
|
<G>
|
|
327
|
-
{wheelPaths.map(({ path, item, textX, textY, angle }) => {
|
|
354
|
+
{wheelPaths.map(({ path, item, textX, textY, angle }, index) => {
|
|
328
355
|
return (
|
|
329
356
|
<React.Fragment key={item.id}>
|
|
330
357
|
<Path
|
|
@@ -334,18 +361,18 @@ const SpinWheel: React.FC<SpinWheelProps> = ({
|
|
|
334
361
|
? colors[Math.floor(Math.random() * colors.length)]
|
|
335
362
|
: item.color
|
|
336
363
|
}
|
|
364
|
+
// stroke="#FA8072"
|
|
365
|
+
// strokeWidth={1}
|
|
337
366
|
/>
|
|
338
367
|
<SvgText
|
|
339
368
|
x={textX}
|
|
340
369
|
y={textY}
|
|
341
370
|
fill={item.textColor || wheelTextColor}
|
|
342
371
|
fontSize={wheelTextStyle?.fontSize || 14}
|
|
343
|
-
fontWeight={
|
|
344
|
-
(wheelTextStyle?.fontWeight as any) || "bold"
|
|
345
|
-
}
|
|
372
|
+
fontWeight={(wheelTextStyle?.fontWeight as any) || "bold"}
|
|
346
373
|
textAnchor="middle"
|
|
347
374
|
alignmentBaseline="central"
|
|
348
|
-
transform={`rotate(${angle + 180}, ${textX}, ${textY})`}
|
|
375
|
+
transform={`rotate(${angle + 180}, ${textX}, ${textY} )`}
|
|
349
376
|
>
|
|
350
377
|
{item.label}
|
|
351
378
|
</SvgText>
|
|
@@ -367,12 +394,14 @@ const SpinWheel: React.FC<SpinWheelProps> = ({
|
|
|
367
394
|
</Svg>
|
|
368
395
|
</Animated.View>
|
|
369
396
|
|
|
397
|
+
{/* The center circle */}
|
|
370
398
|
{centerComponent ? (
|
|
371
399
|
<View
|
|
372
400
|
style={{
|
|
373
401
|
position: "absolute",
|
|
374
402
|
top: "50%",
|
|
375
403
|
left: "50%",
|
|
404
|
+
// Center the component perfectly
|
|
376
405
|
transform: [
|
|
377
406
|
{ translateX: -(actualCenterSize / 2) },
|
|
378
407
|
{ translateY: -(actualCenterSize / 2) },
|
|
@@ -400,6 +429,7 @@ const SpinWheel: React.FC<SpinWheelProps> = ({
|
|
|
400
429
|
/>
|
|
401
430
|
)}
|
|
402
431
|
|
|
432
|
+
{/* The pointer is a triangle on top */}
|
|
403
433
|
<View
|
|
404
434
|
style={[
|
|
405
435
|
styles.pointerPosition,
|
|
@@ -415,6 +445,7 @@ const SpinWheel: React.FC<SpinWheelProps> = ({
|
|
|
415
445
|
/>
|
|
416
446
|
</View>
|
|
417
447
|
|
|
448
|
+
{/* Action Button */}
|
|
418
449
|
<View
|
|
419
450
|
style={{
|
|
420
451
|
position: "absolute",
|
|
@@ -427,12 +458,21 @@ const SpinWheel: React.FC<SpinWheelProps> = ({
|
|
|
427
458
|
>
|
|
428
459
|
<Button
|
|
429
460
|
style={[styles.actionButton, actionButtonStyle]}
|
|
430
|
-
onPress={
|
|
461
|
+
onPress={startInfiniteSpin}
|
|
431
462
|
title={spinButtonText}
|
|
432
463
|
disabled={spinning}
|
|
433
464
|
textStyle={[styles.actionButtonText, actionButtonTextStyle]}
|
|
434
465
|
{...actionButtonProps}
|
|
435
466
|
/>
|
|
467
|
+
{/* <TouchableOpacity
|
|
468
|
+
onPress={handleSpin}
|
|
469
|
+
disabled={spinning || !enabled || wheelItems.length === 0}
|
|
470
|
+
style={[styles.actionButton, actionButtonStyle]}
|
|
471
|
+
>
|
|
472
|
+
<Text style={[styles.actionButtonText, actionButtonTextStyle]}>
|
|
473
|
+
{spinButtonText}
|
|
474
|
+
</Text>
|
|
475
|
+
</TouchableOpacity> */}
|
|
436
476
|
</View>
|
|
437
477
|
</View>
|
|
438
478
|
</View>
|
|
@@ -444,7 +484,7 @@ const styles = StyleSheet.create({
|
|
|
444
484
|
alignItems: "center",
|
|
445
485
|
justifyContent: "center",
|
|
446
486
|
marginTop: 20,
|
|
447
|
-
marginBottom: 70,
|
|
487
|
+
marginBottom: 70, // Space for the button
|
|
448
488
|
},
|
|
449
489
|
wheelContainer: {
|
|
450
490
|
overflow: "hidden",
|