related-ui-components 3.2.6 → 3.2.8
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 +122 -124
- 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 +140 -180
|
@@ -5,15 +5,62 @@ 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
|
-
predeterminedWinner,
|
|
12
61
|
size = 300,
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
onSpinPress,
|
|
16
|
-
minSpinTime = 2000,
|
|
62
|
+
winner,
|
|
63
|
+
minSpinDuration = 2000,
|
|
17
64
|
onSpinStart,
|
|
18
65
|
onSpinEnd,
|
|
19
66
|
containerStyle,
|
|
@@ -32,15 +79,51 @@ const SpinWheel = ({
|
|
|
32
79
|
centerComponent
|
|
33
80
|
}) => {
|
|
34
81
|
const wheelItems = items.length > 0 ? items : [];
|
|
82
|
+
const spinLoop = useRef(null);
|
|
83
|
+
const spinStartTime = useRef(0);
|
|
35
84
|
const [spinning, setSpinning] = useState(false);
|
|
36
|
-
const [_, setWinner] = useState(null);
|
|
37
85
|
const rotateValue = useRef(new Animated.Value(0)).current;
|
|
86
|
+
|
|
87
|
+
// Track rotation manually for calculations
|
|
38
88
|
const rotationRef = useRef(0);
|
|
89
|
+
const startInfiniteSpin = () => {
|
|
90
|
+
rotateValue.setValue(rotationRef.current);
|
|
91
|
+
spinStartTime.current = Date.now();
|
|
92
|
+
spinLoop.current = Animated.loop(Animated.timing(rotateValue, {
|
|
93
|
+
toValue: rotationRef.current + 1,
|
|
94
|
+
// 1 = full rotation
|
|
95
|
+
duration: 2500,
|
|
96
|
+
easing: Easing.linear,
|
|
97
|
+
useNativeDriver: true
|
|
98
|
+
}));
|
|
99
|
+
spinLoop.current.start();
|
|
100
|
+
setSpinning(true);
|
|
101
|
+
onSpinStart?.();
|
|
102
|
+
};
|
|
103
|
+
const stopOnWinner = winnerValue => {
|
|
104
|
+
if (!spinLoop.current) return;
|
|
105
|
+
spinLoop.current.stop();
|
|
106
|
+
spinLoop.current = null;
|
|
107
|
+
const winnerId = typeof winnerValue === "object" ? winnerValue.id : winnerValue;
|
|
108
|
+
const index = items.findIndex(i => i.id === winnerId);
|
|
109
|
+
if (index === -1) return;
|
|
110
|
+
const segmentCenter = (index + 0.5) * anglePerItem;
|
|
111
|
+
const targetAngle = (270 - segmentCenter + 360) % 360;
|
|
112
|
+
const currentAngle = rotationRef.current * 360 % 360;
|
|
113
|
+
const offset = (targetAngle - currentAngle + 360) % 360;
|
|
114
|
+
const finalRotation = rotationRef.current + (offset + 3 * 360) / 360;
|
|
115
|
+
Animated.timing(rotateValue, {
|
|
116
|
+
toValue: finalRotation,
|
|
117
|
+
duration: 2500,
|
|
118
|
+
easing: Easing.out(Easing.cubic),
|
|
119
|
+
useNativeDriver: true
|
|
120
|
+
}).start(() => {
|
|
121
|
+
setSpinning(false);
|
|
122
|
+
onSpinEnd?.(items[index]);
|
|
123
|
+
});
|
|
124
|
+
};
|
|
39
125
|
|
|
40
|
-
//
|
|
41
|
-
const asyncWinnerRef = useRef(null);
|
|
42
|
-
const spinStartTimeRef = useRef(0);
|
|
43
|
-
const continuousSpinRef = useRef(null);
|
|
126
|
+
// Update tracked rotation when animation completes
|
|
44
127
|
useEffect(() => {
|
|
45
128
|
const listener = rotateValue.addListener(({
|
|
46
129
|
value
|
|
@@ -51,7 +134,11 @@ const SpinWheel = ({
|
|
|
51
134
|
rotateValue.removeListener(listener);
|
|
52
135
|
};
|
|
53
136
|
}, [rotateValue]);
|
|
137
|
+
|
|
138
|
+
// Calculate angle for each segment
|
|
54
139
|
const anglePerItem = wheelItems.length > 0 ? 360 / wheelItems.length : 0;
|
|
140
|
+
|
|
141
|
+
// Create wheel segments
|
|
55
142
|
const generateWheelPaths = () => {
|
|
56
143
|
if (wheelItems.length === 0) return [];
|
|
57
144
|
return wheelItems.map((item, index) => {
|
|
@@ -68,126 +155,34 @@ const SpinWheel = ({
|
|
|
68
155
|
const midRad = (startAngle + endAngle) / 2 * (Math.PI / 180);
|
|
69
156
|
const textX = size / 2 + size * 0.32 * Math.cos(midRad);
|
|
70
157
|
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
|
+
|
|
71
163
|
return {
|
|
72
164
|
path: pathData,
|
|
73
165
|
item,
|
|
74
166
|
textX,
|
|
75
167
|
textY,
|
|
168
|
+
// decorationX,
|
|
169
|
+
// decorationY,
|
|
76
170
|
angle: (startAngle + endAngle) / 2
|
|
77
171
|
};
|
|
78
172
|
});
|
|
79
173
|
};
|
|
80
174
|
const wheelPaths = generateWheelPaths();
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
const
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
continuousSpinRef.current.start();
|
|
91
|
-
};
|
|
92
|
-
const stopAndLandOnWinner = winner => {
|
|
93
|
-
if (continuousSpinRef.current) {
|
|
94
|
-
continuousSpinRef.current.stop();
|
|
95
|
-
continuousSpinRef.current = null;
|
|
96
|
-
}
|
|
97
|
-
const winnerId = typeof winner === "object" ? winner.id : winner;
|
|
98
|
-
const winnerTargetIndex = wheelItems.findIndex(item => item.id === winnerId);
|
|
99
|
-
if (winnerTargetIndex === -1) {
|
|
100
|
-
handleSpinEnd();
|
|
101
|
-
return;
|
|
102
|
-
}
|
|
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
|
-
Animated.timing(rotateValue, {
|
|
111
|
-
toValue: rotationRef.current + targetRotation / 360,
|
|
112
|
-
duration: spinDuration,
|
|
113
|
-
easing: Easing.out(Easing.cubic),
|
|
114
|
-
useNativeDriver: true
|
|
115
|
-
}).start(() => handleSpinEnd());
|
|
116
|
-
};
|
|
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?.();
|
|
175
|
+
useEffect(() => {
|
|
176
|
+
if (!winner || !spinning) return;
|
|
177
|
+
const elapsed = Date.now() - spinStartTime.current;
|
|
178
|
+
const delay = Math.max(0, minSpinDuration - elapsed);
|
|
179
|
+
const timeout = setTimeout(() => {
|
|
180
|
+
stopOnWinner(winner);
|
|
181
|
+
}, delay);
|
|
182
|
+
return () => clearTimeout(timeout);
|
|
183
|
+
}, [winner]);
|
|
123
184
|
|
|
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
|
-
};
|
|
177
|
-
const handleSpinEnd = () => {
|
|
178
|
-
setSpinning(false);
|
|
179
|
-
const normalizedAngle = rotationRef.current * 360 % 360;
|
|
180
|
-
const winningIndex = Math.floor((normalizedAngle - 270) % 360 / anglePerItem);
|
|
181
|
-
const adjustedIndex = (wheelItems.length - 1 - winningIndex) % wheelItems.length;
|
|
182
|
-
const finalWinnerIndex = adjustedIndex >= 0 ? adjustedIndex : wheelItems.length + adjustedIndex;
|
|
183
|
-
if (finalWinnerIndex >= 0 && finalWinnerIndex < wheelItems.length) {
|
|
184
|
-
const winningItem = wheelItems[finalWinnerIndex];
|
|
185
|
-
setWinner(winningItem);
|
|
186
|
-
onSpinEnd?.(winningItem);
|
|
187
|
-
} else if (wheelItems.length > 0) {
|
|
188
|
-
onSpinEnd?.(wheelItems[0]);
|
|
189
|
-
}
|
|
190
|
-
};
|
|
185
|
+
// Animation interpolation for rotation
|
|
191
186
|
const rotate = rotateValue.interpolate({
|
|
192
187
|
inputRange: [0, 1],
|
|
193
188
|
outputRange: ["0deg", "360deg"]
|
|
@@ -220,11 +215,13 @@ const SpinWheel = ({
|
|
|
220
215
|
textX,
|
|
221
216
|
textY,
|
|
222
217
|
angle
|
|
223
|
-
}) => {
|
|
218
|
+
}, index) => {
|
|
224
219
|
return /*#__PURE__*/_jsxs(React.Fragment, {
|
|
225
220
|
children: [/*#__PURE__*/_jsx(Path, {
|
|
226
221
|
d: path,
|
|
227
222
|
fill: item.color == "" || item.color == null ? colors[Math.floor(Math.random() * colors.length)] : item.color
|
|
223
|
+
// stroke="#FA8072"
|
|
224
|
+
// strokeWidth={1}
|
|
228
225
|
}), /*#__PURE__*/_jsx(SvgText, {
|
|
229
226
|
x: textX,
|
|
230
227
|
y: textY,
|
|
@@ -233,7 +230,7 @@ const SpinWheel = ({
|
|
|
233
230
|
fontWeight: wheelTextStyle?.fontWeight || "bold",
|
|
234
231
|
textAnchor: "middle",
|
|
235
232
|
alignmentBaseline: "central",
|
|
236
|
-
transform: `rotate(${angle + 180}, ${textX}, ${textY})`,
|
|
233
|
+
transform: `rotate(${angle + 180}, ${textX}, ${textY} )`,
|
|
237
234
|
children: item.label
|
|
238
235
|
})]
|
|
239
236
|
}, item.id);
|
|
@@ -252,6 +249,7 @@ const SpinWheel = ({
|
|
|
252
249
|
position: "absolute",
|
|
253
250
|
top: "50%",
|
|
254
251
|
left: "50%",
|
|
252
|
+
// Center the component perfectly
|
|
255
253
|
transform: [{
|
|
256
254
|
translateX: -(actualCenterSize / 2)
|
|
257
255
|
}, {
|
|
@@ -291,7 +289,7 @@ const SpinWheel = ({
|
|
|
291
289
|
},
|
|
292
290
|
children: /*#__PURE__*/_jsx(Button, {
|
|
293
291
|
style: [styles.actionButton, actionButtonStyle],
|
|
294
|
-
onPress:
|
|
292
|
+
onPress: startInfiniteSpin,
|
|
295
293
|
title: spinButtonText,
|
|
296
294
|
disabled: spinning,
|
|
297
295
|
textStyle: [styles.actionButtonText, actionButtonTextStyle],
|
|
@@ -306,7 +304,7 @@ const styles = StyleSheet.create({
|
|
|
306
304
|
alignItems: "center",
|
|
307
305
|
justifyContent: "center",
|
|
308
306
|
marginTop: 20,
|
|
309
|
-
marginBottom: 70
|
|
307
|
+
marginBottom: 70 // Space for the button
|
|
310
308
|
},
|
|
311
309
|
wheelContainer: {
|
|
312
310
|
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","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":[]}
|
|
@@ -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,CAmTvC,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,22 @@ 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,
|
|
64
95
|
size = 300,
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
onSpinPress,
|
|
68
|
-
minSpinTime = 2000,
|
|
96
|
+
winner,
|
|
97
|
+
minSpinDuration = 2000,
|
|
69
98
|
onSpinStart,
|
|
70
99
|
onSpinEnd,
|
|
71
100
|
containerStyle,
|
|
@@ -85,16 +114,66 @@ const SpinWheel: React.FC<SpinWheelProps> = ({
|
|
|
85
114
|
}) => {
|
|
86
115
|
const wheelItems = items.length > 0 ? items : [];
|
|
87
116
|
|
|
117
|
+
const spinLoop = useRef<Animated.CompositeAnimation | null>(null);
|
|
118
|
+
const spinStartTime = useRef<number>(0);
|
|
119
|
+
|
|
88
120
|
const [spinning, setSpinning] = useState(false);
|
|
89
|
-
const [_, setWinner] = useState<SpinWheelItem | null>(null);
|
|
90
121
|
const rotateValue = useRef(new Animated.Value(0)).current;
|
|
122
|
+
|
|
123
|
+
// Track rotation manually for calculations
|
|
91
124
|
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
125
|
|
|
126
|
+
const startInfiniteSpin = () => {
|
|
127
|
+
rotateValue.setValue(rotationRef.current);
|
|
128
|
+
|
|
129
|
+
spinStartTime.current = Date.now();
|
|
130
|
+
|
|
131
|
+
spinLoop.current = Animated.loop(
|
|
132
|
+
Animated.timing(rotateValue, {
|
|
133
|
+
toValue: rotationRef.current + 1, // 1 = full rotation
|
|
134
|
+
duration: 2500,
|
|
135
|
+
easing: Easing.linear,
|
|
136
|
+
useNativeDriver: true,
|
|
137
|
+
})
|
|
138
|
+
);
|
|
139
|
+
|
|
140
|
+
spinLoop.current.start();
|
|
141
|
+
setSpinning(true);
|
|
142
|
+
onSpinStart?.();
|
|
143
|
+
};
|
|
144
|
+
|
|
145
|
+
const stopOnWinner = (winnerValue: SpinWheelItem | string | number) => {
|
|
146
|
+
if (!spinLoop.current) return;
|
|
147
|
+
|
|
148
|
+
spinLoop.current.stop();
|
|
149
|
+
spinLoop.current = null;
|
|
150
|
+
|
|
151
|
+
const winnerId =
|
|
152
|
+
typeof winnerValue === "object" ? winnerValue.id : winnerValue;
|
|
153
|
+
|
|
154
|
+
const index = items.findIndex((i) => i.id === winnerId);
|
|
155
|
+
if (index === -1) return;
|
|
156
|
+
|
|
157
|
+
const segmentCenter = (index + 0.5) * anglePerItem;
|
|
158
|
+
const targetAngle = (270 - segmentCenter + 360) % 360;
|
|
159
|
+
|
|
160
|
+
const currentAngle = (rotationRef.current * 360) % 360;
|
|
161
|
+
const offset = (targetAngle - currentAngle + 360) % 360;
|
|
162
|
+
|
|
163
|
+
const finalRotation = rotationRef.current + (offset + 3 * 360) / 360;
|
|
164
|
+
|
|
165
|
+
Animated.timing(rotateValue, {
|
|
166
|
+
toValue: finalRotation,
|
|
167
|
+
duration: 2500,
|
|
168
|
+
easing: Easing.out(Easing.cubic),
|
|
169
|
+
useNativeDriver: true,
|
|
170
|
+
}).start(() => {
|
|
171
|
+
setSpinning(false);
|
|
172
|
+
onSpinEnd?.(items[index]);
|
|
173
|
+
});
|
|
174
|
+
};
|
|
175
|
+
|
|
176
|
+
// Update tracked rotation when animation completes
|
|
98
177
|
useEffect(() => {
|
|
99
178
|
const listener = rotateValue.addListener(({ value }) => {
|
|
100
179
|
rotationRef.current = value;
|
|
@@ -105,8 +184,10 @@ const SpinWheel: React.FC<SpinWheelProps> = ({
|
|
|
105
184
|
};
|
|
106
185
|
}, [rotateValue]);
|
|
107
186
|
|
|
187
|
+
// Calculate angle for each segment
|
|
108
188
|
const anglePerItem = wheelItems.length > 0 ? 360 / wheelItems.length : 0;
|
|
109
189
|
|
|
190
|
+
// Create wheel segments
|
|
110
191
|
const generateWheelPaths = () => {
|
|
111
192
|
if (wheelItems.length === 0) return [];
|
|
112
193
|
return wheelItems.map((item, index) => {
|
|
@@ -134,11 +215,17 @@ const SpinWheel: React.FC<SpinWheelProps> = ({
|
|
|
134
215
|
const textX = size / 2 + size * 0.32 * Math.cos(midRad);
|
|
135
216
|
const textY = size / 2 + size * 0.32 * Math.sin(midRad);
|
|
136
217
|
|
|
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
|
+
|
|
137
222
|
return {
|
|
138
223
|
path: pathData,
|
|
139
224
|
item,
|
|
140
225
|
textX,
|
|
141
226
|
textY,
|
|
227
|
+
// decorationX,
|
|
228
|
+
// decorationY,
|
|
142
229
|
angle: (startAngle + endAngle) / 2,
|
|
143
230
|
};
|
|
144
231
|
});
|
|
@@ -146,161 +233,20 @@ const SpinWheel: React.FC<SpinWheelProps> = ({
|
|
|
146
233
|
|
|
147
234
|
const wheelPaths = generateWheelPaths();
|
|
148
235
|
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
const targetRotation = numberOfSpins * 360;
|
|
152
|
-
|
|
153
|
-
continuousSpinRef.current = Animated.loop(
|
|
154
|
-
Animated.timing(rotateValue, {
|
|
155
|
-
toValue: rotationRef.current + targetRotation / 360,
|
|
156
|
-
duration: 2000,
|
|
157
|
-
easing: Easing.linear,
|
|
158
|
-
useNativeDriver: true,
|
|
159
|
-
})
|
|
160
|
-
);
|
|
161
|
-
|
|
162
|
-
continuousSpinRef.current.start();
|
|
163
|
-
};
|
|
164
|
-
|
|
165
|
-
const stopAndLandOnWinner = (winner: SpinWheelItem | string | number) => {
|
|
166
|
-
if (continuousSpinRef.current) {
|
|
167
|
-
continuousSpinRef.current.stop();
|
|
168
|
-
continuousSpinRef.current = null;
|
|
169
|
-
}
|
|
170
|
-
|
|
171
|
-
const winnerId = typeof winner === "object" ? winner.id : winner;
|
|
172
|
-
const winnerTargetIndex = wheelItems.findIndex(
|
|
173
|
-
(item) => item.id === winnerId
|
|
174
|
-
);
|
|
175
|
-
|
|
176
|
-
if (winnerTargetIndex === -1) {
|
|
177
|
-
handleSpinEnd();
|
|
178
|
-
return;
|
|
179
|
-
}
|
|
180
|
-
|
|
181
|
-
const targetSegmentCenterAngle = (winnerTargetIndex + 0.5) * anglePerItem;
|
|
182
|
-
const targetNormalizedAngle = (270 - targetSegmentCenterAngle + 360) % 360;
|
|
183
|
-
|
|
184
|
-
const currentAbsoluteAngle = rotationRef.current * 360;
|
|
185
|
-
const currentNormalizedAngle = (currentAbsoluteAngle % 360 + 360) % 360;
|
|
186
|
-
|
|
187
|
-
const angleOffset =
|
|
188
|
-
(targetNormalizedAngle - currentNormalizedAngle + 360) % 360;
|
|
189
|
-
|
|
190
|
-
const additionalSpins = 2;
|
|
191
|
-
const targetRotation = additionalSpins * 360 + angleOffset;
|
|
192
|
-
|
|
193
|
-
Animated.timing(rotateValue, {
|
|
194
|
-
toValue: rotationRef.current + targetRotation / 360,
|
|
195
|
-
duration: spinDuration,
|
|
196
|
-
easing: Easing.out(Easing.cubic),
|
|
197
|
-
useNativeDriver: true,
|
|
198
|
-
}).start(() => handleSpinEnd());
|
|
199
|
-
};
|
|
200
|
-
|
|
201
|
-
const handleSpin = async () => {
|
|
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
|
-
}
|
|
236
|
+
useEffect(() => {
|
|
237
|
+
if (!winner || !spinning) return;
|
|
272
238
|
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
duration: spinDuration,
|
|
276
|
-
easing: Easing.out(Easing.cubic),
|
|
277
|
-
useNativeDriver: true,
|
|
278
|
-
}).start(() => handleSpinEnd());
|
|
279
|
-
}
|
|
280
|
-
};
|
|
239
|
+
const elapsed = Date.now() - spinStartTime.current;
|
|
240
|
+
const delay = Math.max(0, minSpinDuration - elapsed);
|
|
281
241
|
|
|
282
|
-
|
|
283
|
-
|
|
242
|
+
const timeout = setTimeout(() => {
|
|
243
|
+
stopOnWinner(winner);
|
|
244
|
+
}, delay);
|
|
284
245
|
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
((normalizedAngle - 270) % 360) / anglePerItem
|
|
288
|
-
);
|
|
289
|
-
const adjustedIndex =
|
|
290
|
-
(wheelItems.length - 1 - winningIndex) % wheelItems.length;
|
|
291
|
-
|
|
292
|
-
const finalWinnerIndex =
|
|
293
|
-
adjustedIndex >= 0 ? adjustedIndex : wheelItems.length + adjustedIndex;
|
|
294
|
-
|
|
295
|
-
if (finalWinnerIndex >= 0 && finalWinnerIndex < wheelItems.length) {
|
|
296
|
-
const winningItem = wheelItems[finalWinnerIndex];
|
|
297
|
-
setWinner(winningItem);
|
|
298
|
-
onSpinEnd?.(winningItem);
|
|
299
|
-
} else if (wheelItems.length > 0) {
|
|
300
|
-
onSpinEnd?.(wheelItems[0]);
|
|
301
|
-
}
|
|
302
|
-
};
|
|
246
|
+
return () => clearTimeout(timeout);
|
|
247
|
+
}, [winner]);
|
|
303
248
|
|
|
249
|
+
// Animation interpolation for rotation
|
|
304
250
|
const rotate = rotateValue.interpolate({
|
|
305
251
|
inputRange: [0, 1],
|
|
306
252
|
outputRange: ["0deg", "360deg"],
|
|
@@ -311,6 +257,7 @@ const SpinWheel: React.FC<SpinWheelProps> = ({
|
|
|
311
257
|
return (
|
|
312
258
|
<View style={[styles.container, containerStyle]}>
|
|
313
259
|
<View style={{ width: size, height: size }}>
|
|
260
|
+
{/* The wheel */}
|
|
314
261
|
<Animated.View
|
|
315
262
|
style={[
|
|
316
263
|
styles.wheelContainer,
|
|
@@ -324,7 +271,7 @@ const SpinWheel: React.FC<SpinWheelProps> = ({
|
|
|
324
271
|
>
|
|
325
272
|
<Svg width={size} height={size} viewBox={`0 0 ${size} ${size}`}>
|
|
326
273
|
<G>
|
|
327
|
-
{wheelPaths.map(({ path, item, textX, textY, angle }) => {
|
|
274
|
+
{wheelPaths.map(({ path, item, textX, textY, angle }, index) => {
|
|
328
275
|
return (
|
|
329
276
|
<React.Fragment key={item.id}>
|
|
330
277
|
<Path
|
|
@@ -334,18 +281,18 @@ const SpinWheel: React.FC<SpinWheelProps> = ({
|
|
|
334
281
|
? colors[Math.floor(Math.random() * colors.length)]
|
|
335
282
|
: item.color
|
|
336
283
|
}
|
|
284
|
+
// stroke="#FA8072"
|
|
285
|
+
// strokeWidth={1}
|
|
337
286
|
/>
|
|
338
287
|
<SvgText
|
|
339
288
|
x={textX}
|
|
340
289
|
y={textY}
|
|
341
290
|
fill={item.textColor || wheelTextColor}
|
|
342
291
|
fontSize={wheelTextStyle?.fontSize || 14}
|
|
343
|
-
fontWeight={
|
|
344
|
-
(wheelTextStyle?.fontWeight as any) || "bold"
|
|
345
|
-
}
|
|
292
|
+
fontWeight={(wheelTextStyle?.fontWeight as any) || "bold"}
|
|
346
293
|
textAnchor="middle"
|
|
347
294
|
alignmentBaseline="central"
|
|
348
|
-
transform={`rotate(${angle + 180}, ${textX}, ${textY})`}
|
|
295
|
+
transform={`rotate(${angle + 180}, ${textX}, ${textY} )`}
|
|
349
296
|
>
|
|
350
297
|
{item.label}
|
|
351
298
|
</SvgText>
|
|
@@ -367,12 +314,14 @@ const SpinWheel: React.FC<SpinWheelProps> = ({
|
|
|
367
314
|
</Svg>
|
|
368
315
|
</Animated.View>
|
|
369
316
|
|
|
317
|
+
{/* The center circle */}
|
|
370
318
|
{centerComponent ? (
|
|
371
319
|
<View
|
|
372
320
|
style={{
|
|
373
321
|
position: "absolute",
|
|
374
322
|
top: "50%",
|
|
375
323
|
left: "50%",
|
|
324
|
+
// Center the component perfectly
|
|
376
325
|
transform: [
|
|
377
326
|
{ translateX: -(actualCenterSize / 2) },
|
|
378
327
|
{ translateY: -(actualCenterSize / 2) },
|
|
@@ -400,6 +349,7 @@ const SpinWheel: React.FC<SpinWheelProps> = ({
|
|
|
400
349
|
/>
|
|
401
350
|
)}
|
|
402
351
|
|
|
352
|
+
{/* The pointer is a triangle on top */}
|
|
403
353
|
<View
|
|
404
354
|
style={[
|
|
405
355
|
styles.pointerPosition,
|
|
@@ -415,6 +365,7 @@ const SpinWheel: React.FC<SpinWheelProps> = ({
|
|
|
415
365
|
/>
|
|
416
366
|
</View>
|
|
417
367
|
|
|
368
|
+
{/* Action Button */}
|
|
418
369
|
<View
|
|
419
370
|
style={{
|
|
420
371
|
position: "absolute",
|
|
@@ -427,12 +378,21 @@ const SpinWheel: React.FC<SpinWheelProps> = ({
|
|
|
427
378
|
>
|
|
428
379
|
<Button
|
|
429
380
|
style={[styles.actionButton, actionButtonStyle]}
|
|
430
|
-
onPress={
|
|
381
|
+
onPress={startInfiniteSpin}
|
|
431
382
|
title={spinButtonText}
|
|
432
383
|
disabled={spinning}
|
|
433
384
|
textStyle={[styles.actionButtonText, actionButtonTextStyle]}
|
|
434
385
|
{...actionButtonProps}
|
|
435
386
|
/>
|
|
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> */}
|
|
436
396
|
</View>
|
|
437
397
|
</View>
|
|
438
398
|
</View>
|
|
@@ -444,7 +404,7 @@ const styles = StyleSheet.create({
|
|
|
444
404
|
alignItems: "center",
|
|
445
405
|
justifyContent: "center",
|
|
446
406
|
marginTop: 20,
|
|
447
|
-
marginBottom: 70,
|
|
407
|
+
marginBottom: 70, // Space for the button
|
|
448
408
|
},
|
|
449
409
|
wheelContainer: {
|
|
450
410
|
overflow: "hidden",
|