related-ui-components 1.8.4 → 1.8.6
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/commonjs/components/Wheel/Wheel.js +62 -112
- package/lib/commonjs/components/Wheel/Wheel.js.map +1 -1
- package/lib/module/components/Wheel/Wheel.js +62 -112
- package/lib/module/components/Wheel/Wheel.js.map +1 -1
- package/lib/typescript/commonjs/components/Wheel/Wheel.d.ts +1 -2
- package/lib/typescript/commonjs/components/Wheel/Wheel.d.ts.map +1 -1
- package/lib/typescript/module/components/Wheel/Wheel.d.ts +1 -2
- package/lib/typescript/module/components/Wheel/Wheel.d.ts.map +1 -1
- package/package.json +1 -1
- package/src/components/Wheel/Wheel.tsx +89 -129
|
@@ -10,57 +10,7 @@ var _reactNativeSvg = require("react-native-svg");
|
|
|
10
10
|
var _jsxRuntime = require("react/jsx-runtime");
|
|
11
11
|
function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); }
|
|
12
12
|
function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
|
|
13
|
-
|
|
14
|
-
const colors = ["#FF0000",
|
|
15
|
-
// Red
|
|
16
|
-
"#FFA500",
|
|
17
|
-
// Orange
|
|
18
|
-
"#FFFF00",
|
|
19
|
-
// Yellow
|
|
20
|
-
"#008000",
|
|
21
|
-
// Green
|
|
22
|
-
"#0000FF",
|
|
23
|
-
// Blue
|
|
24
|
-
"#800080",
|
|
25
|
-
// Purple
|
|
26
|
-
"#FFC0CB",
|
|
27
|
-
// Pink
|
|
28
|
-
"#00FFFF",
|
|
29
|
-
// Cyan
|
|
30
|
-
"#FF00FF",
|
|
31
|
-
// Magenta
|
|
32
|
-
"#00FF00",
|
|
33
|
-
// Lime
|
|
34
|
-
"#4B0082",
|
|
35
|
-
// Indigo
|
|
36
|
-
"#EE82EE",
|
|
37
|
-
// Violet
|
|
38
|
-
"#40E0D0",
|
|
39
|
-
// Turquoise
|
|
40
|
-
"#FFD700",
|
|
41
|
-
// Gold
|
|
42
|
-
"#C0C0C0",
|
|
43
|
-
// Silver
|
|
44
|
-
"#FFDAB9",
|
|
45
|
-
// Peach
|
|
46
|
-
"#E6E6FA",
|
|
47
|
-
// Lavender
|
|
48
|
-
"#008080",
|
|
49
|
-
// Teal
|
|
50
|
-
"#FF7F50",
|
|
51
|
-
// Coral
|
|
52
|
-
"#DC143C",
|
|
53
|
-
// Crimson
|
|
54
|
-
"#87CEEB",
|
|
55
|
-
// Sky Blue
|
|
56
|
-
"#7FFF00",
|
|
57
|
-
// Chartreuse
|
|
58
|
-
"#CCCCFF",
|
|
59
|
-
// Periwinkle
|
|
60
|
-
"#FF6347",
|
|
61
|
-
// Tomato
|
|
62
|
-
"#FA8072" // Salmon
|
|
63
|
-
];
|
|
13
|
+
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"];
|
|
64
14
|
const SpinWheel = ({
|
|
65
15
|
items,
|
|
66
16
|
size = 300,
|
|
@@ -76,17 +26,14 @@ const SpinWheel = ({
|
|
|
76
26
|
knobColor = "#D81E5B",
|
|
77
27
|
actionButtonStyle,
|
|
78
28
|
actionButtonTextStyle,
|
|
79
|
-
wheelTextColor = "#FFFFFF"
|
|
29
|
+
wheelTextColor = "#FFFFFF",
|
|
30
|
+
winner
|
|
80
31
|
}) => {
|
|
81
32
|
const wheelItems = items.length > 0 ? items : [];
|
|
82
33
|
const [spinning, setSpinning] = (0, _react.useState)(false);
|
|
83
|
-
const [
|
|
34
|
+
const [internalWinner, setInternalWinner] = (0, _react.useState)(null);
|
|
84
35
|
const rotateValue = (0, _react.useRef)(new _reactNative.Animated.Value(0)).current;
|
|
85
|
-
|
|
86
|
-
// Track rotation manually for calculations
|
|
87
36
|
const rotationRef = (0, _react.useRef)(0);
|
|
88
|
-
|
|
89
|
-
// Update tracked rotation when animation completes
|
|
90
37
|
(0, _react.useEffect)(() => {
|
|
91
38
|
const listener = rotateValue.addListener(({
|
|
92
39
|
value
|
|
@@ -97,17 +44,13 @@ const SpinWheel = ({
|
|
|
97
44
|
rotateValue.removeListener(listener);
|
|
98
45
|
};
|
|
99
46
|
}, [rotateValue]);
|
|
100
|
-
|
|
101
|
-
// Calculate angle for each segment
|
|
102
47
|
const anglePerItem = 360 / wheelItems.length;
|
|
103
48
|
|
|
104
|
-
//
|
|
49
|
+
// Generate wheel paths and text positions
|
|
105
50
|
const generateWheelPaths = () => {
|
|
106
51
|
return wheelItems.map((item, index) => {
|
|
107
52
|
const startAngle = index * anglePerItem;
|
|
108
53
|
const endAngle = (index + 1) * anglePerItem;
|
|
109
|
-
|
|
110
|
-
// Calculate path for segment
|
|
111
54
|
const startRad = startAngle * Math.PI / 180;
|
|
112
55
|
const endRad = endAngle * Math.PI / 180;
|
|
113
56
|
const x1 = size / 2 + size / 2 * Math.cos(startRad);
|
|
@@ -116,56 +59,67 @@ const SpinWheel = ({
|
|
|
116
59
|
const y2 = size / 2 + size / 2 * Math.sin(endRad);
|
|
117
60
|
const largeArcFlag = endAngle - startAngle <= 180 ? "0" : "1";
|
|
118
61
|
const pathData = [`M ${size / 2} ${size / 2}`, `L ${x1} ${y1}`, `A ${size / 2} ${size / 2} 0 ${largeArcFlag} 1 ${x2} ${y2}`, "Z"].join(" ");
|
|
119
|
-
|
|
120
|
-
// Calculate coordinates for text and decoration
|
|
121
62
|
const midRad = (startAngle + endAngle) / 2 * (Math.PI / 180);
|
|
122
63
|
const textX = size / 2 + size * 0.32 * Math.cos(midRad);
|
|
123
64
|
const textY = size / 2 + size * 0.32 * Math.sin(midRad);
|
|
124
|
-
const decorationX = size / 2 + size * 0.43 * Math.cos(midRad);
|
|
125
|
-
const decorationY = size / 2 + size * 0.43 * Math.sin(midRad);
|
|
126
65
|
return {
|
|
127
66
|
path: pathData,
|
|
128
67
|
item,
|
|
129
68
|
textX,
|
|
130
69
|
textY,
|
|
131
|
-
decorationX,
|
|
132
|
-
decorationY,
|
|
133
70
|
angle: (startAngle + endAngle) / 2
|
|
134
71
|
};
|
|
135
72
|
});
|
|
136
73
|
};
|
|
137
74
|
const wheelPaths = generateWheelPaths();
|
|
138
75
|
|
|
139
|
-
//
|
|
140
|
-
const
|
|
141
|
-
|
|
76
|
+
// Helper: get index of a SpinWheelItem
|
|
77
|
+
const getItemIndex = target => wheelItems.findIndex(item => item.id === target.id);
|
|
78
|
+
|
|
79
|
+
// Helper: spin to a given index
|
|
80
|
+
const spinToIndex = (targetIndex, callbackItem) => {
|
|
142
81
|
setSpinning(true);
|
|
143
82
|
onSpinStart?.();
|
|
144
83
|
|
|
145
|
-
//
|
|
146
|
-
|
|
147
|
-
const
|
|
148
|
-
|
|
84
|
+
// The pointer is at 270deg (top), so we want the winner to land there.
|
|
85
|
+
// The center of the segment is at: (index + 0.5) * anglePerItem
|
|
86
|
+
const winnerAngle = 360 - ((targetIndex + 0.5) * anglePerItem - 270);
|
|
87
|
+
|
|
88
|
+
// Add extra spins for effect
|
|
89
|
+
const extraSpins = 3;
|
|
90
|
+
const currentRotation = rotationRef.current * 360;
|
|
91
|
+
const targetRotation = currentRotation + extraSpins * 360 + winnerAngle;
|
|
149
92
|
_reactNative.Animated.timing(rotateValue, {
|
|
150
|
-
toValue:
|
|
93
|
+
toValue: targetRotation / 360,
|
|
151
94
|
duration: spinDuration,
|
|
152
95
|
easing: _reactNative.Easing.out(_reactNative.Easing.cubic),
|
|
153
96
|
useNativeDriver: true
|
|
154
|
-
}).start(() =>
|
|
97
|
+
}).start(() => {
|
|
98
|
+
setSpinning(false);
|
|
99
|
+
setInternalWinner(callbackItem);
|
|
100
|
+
onSpinEnd?.(callbackItem);
|
|
101
|
+
});
|
|
155
102
|
};
|
|
156
103
|
|
|
157
|
-
//
|
|
158
|
-
|
|
159
|
-
|
|
104
|
+
// If winner prop changes, spin to it
|
|
105
|
+
(0, _react.useEffect)(() => {
|
|
106
|
+
if (!winner || spinning) return;
|
|
107
|
+
const winnerIndex = getItemIndex(winner);
|
|
108
|
+
if (winnerIndex === -1) return;
|
|
109
|
+
spinToIndex(winnerIndex, winner);
|
|
110
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
111
|
+
}, [winner]);
|
|
112
|
+
|
|
113
|
+
// Handle random spin (if no winner is set)
|
|
114
|
+
const handleSpin = () => {
|
|
115
|
+
if (spinning || !enabled) return;
|
|
116
|
+
// If winner prop is set, ignore button (or you can allow override)
|
|
117
|
+
if (winner) return;
|
|
160
118
|
|
|
161
|
-
//
|
|
162
|
-
const
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
const adjustedIndex = (wheelItems.length - 1 - winningIndex) % wheelItems.length;
|
|
166
|
-
const winningItem = wheelItems[adjustedIndex >= 0 ? adjustedIndex : wheelItems.length + adjustedIndex];
|
|
167
|
-
setWinner(winningItem);
|
|
168
|
-
onSpinEnd?.(winningItem);
|
|
119
|
+
// Pick a random winner
|
|
120
|
+
const randomIndex = Math.floor(Math.random() * wheelItems.length);
|
|
121
|
+
const randomWinner = wheelItems[randomIndex];
|
|
122
|
+
spinToIndex(randomIndex, randomWinner);
|
|
169
123
|
};
|
|
170
124
|
|
|
171
125
|
// Animation interpolation for rotation
|
|
@@ -199,29 +153,25 @@ const SpinWheel = ({
|
|
|
199
153
|
item,
|
|
200
154
|
textX,
|
|
201
155
|
textY,
|
|
202
|
-
decorationX,
|
|
203
|
-
decorationY,
|
|
204
156
|
angle
|
|
205
|
-
}, index) => {
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
}, item.id);
|
|
224
|
-
})
|
|
157
|
+
}, index) => /*#__PURE__*/(0, _jsxRuntime.jsxs)(_react.default.Fragment, {
|
|
158
|
+
children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNativeSvg.Path, {
|
|
159
|
+
d: path,
|
|
160
|
+
fill: !item.color ? colors[index % colors.length] : item.color,
|
|
161
|
+
stroke: "#000000",
|
|
162
|
+
strokeWidth: 1
|
|
163
|
+
}), /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNativeSvg.Text, {
|
|
164
|
+
x: textX,
|
|
165
|
+
y: textY,
|
|
166
|
+
fill: item.textColor || wheelTextColor,
|
|
167
|
+
fontSize: wheelTextStyle?.fontSize || 14,
|
|
168
|
+
fontWeight: wheelTextStyle?.fontWeight || "bold",
|
|
169
|
+
textAnchor: "middle",
|
|
170
|
+
alignmentBaseline: "central",
|
|
171
|
+
transform: `rotate(${angle + 180}, ${textX}, ${textY})`,
|
|
172
|
+
children: item.label
|
|
173
|
+
})]
|
|
174
|
+
}, item.id))
|
|
225
175
|
})
|
|
226
176
|
})
|
|
227
177
|
}), /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.View, {
|
|
@@ -253,7 +203,7 @@ const SpinWheel = ({
|
|
|
253
203
|
},
|
|
254
204
|
children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.TouchableOpacity, {
|
|
255
205
|
onPress: handleSpin,
|
|
256
|
-
disabled: spinning || !enabled,
|
|
206
|
+
disabled: spinning || !enabled || !!winner,
|
|
257
207
|
style: [styles.actionButton, actionButtonStyle],
|
|
258
208
|
children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
|
|
259
209
|
style: [styles.actionButtonText, actionButtonTextStyle],
|
|
@@ -269,7 +219,7 @@ const styles = _reactNative.StyleSheet.create({
|
|
|
269
219
|
alignItems: "center",
|
|
270
220
|
justifyContent: "center",
|
|
271
221
|
marginTop: 20,
|
|
272
|
-
marginBottom: 70
|
|
222
|
+
marginBottom: 70
|
|
273
223
|
},
|
|
274
224
|
wheelContainer: {
|
|
275
225
|
overflow: "hidden",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["_react","_interopRequireWildcard","require","_reactNative","_reactNativeSvg","_jsxRuntime","_getRequireWildcardCache","e","WeakMap","r","t","__esModule","default","has","get","n","__proto__","a","Object","defineProperty","getOwnPropertyDescriptor","u","hasOwnProperty","call","i","set","colors","SpinWheel","items","size","spinDuration","enabled","onSpinStart","onSpinEnd","containerStyle","centerStyle","spinButtonText","wheelTextStyle","knobStyle","knobColor","actionButtonStyle","actionButtonTextStyle","wheelTextColor","wheelItems","length","spinning","setSpinning","useState","_","setWinner","rotateValue","useRef","Animated","Value","current","rotationRef","useEffect","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","decorationX","decorationY","path","angle","wheelPaths","handleSpin","randomSpins","random","randomAngle","targetRotation","timing","toValue","duration","easing","Easing","out","cubic","useNativeDriver","start","handleSpinEnd","normalizedAngle","winningIndex","floor","adjustedIndex","winningItem","rotate","interpolate","inputRange","outputRange","jsx","View","style","styles","container","children","jsxs","width","height","wheelContainer","borderRadius","transform","Svg","viewBox","G","Fragment","Path","d","fill","color","stroke","strokeWidth","Text","x","y","textColor","fontSize","fontWeight","textAnchor","alignmentBaseline","label","id","wheelCenter","translateX","translateY","pointerPosition","pointer","borderBottomColor","position","alignItems","justifyContent","bottom","zIndex","TouchableOpacity","onPress","disabled","actionButton","actionButtonText","StyleSheet","create","marginTop","marginBottom","overflow","backgroundColor","top","left","borderWidth","borderColor","borderStyle","borderLeftWidth","borderRightWidth","borderBottomWidth","borderLeftColor","borderRightColor","paddingHorizontal","paddingVertical","shadowColor","shadowRadius","_default","exports"],"sourceRoot":"..\\..\\..\\..\\src","sources":["components/Wheel/Wheel.tsx"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"names":["_react","_interopRequireWildcard","require","_reactNative","_reactNativeSvg","_jsxRuntime","_getRequireWildcardCache","e","WeakMap","r","t","__esModule","default","has","get","n","__proto__","a","Object","defineProperty","getOwnPropertyDescriptor","u","hasOwnProperty","call","i","set","colors","SpinWheel","items","size","spinDuration","enabled","onSpinStart","onSpinEnd","containerStyle","centerStyle","spinButtonText","wheelTextStyle","knobStyle","knobColor","actionButtonStyle","actionButtonTextStyle","wheelTextColor","winner","wheelItems","length","spinning","setSpinning","useState","internalWinner","setInternalWinner","rotateValue","useRef","Animated","Value","current","rotationRef","useEffect","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","getItemIndex","target","findIndex","id","spinToIndex","targetIndex","callbackItem","winnerAngle","extraSpins","currentRotation","targetRotation","timing","toValue","duration","easing","Easing","out","cubic","useNativeDriver","start","winnerIndex","handleSpin","randomIndex","floor","random","randomWinner","rotate","interpolate","inputRange","outputRange","jsx","View","style","styles","container","children","jsxs","width","height","wheelContainer","borderRadius","transform","Svg","viewBox","G","Fragment","Path","d","fill","color","stroke","strokeWidth","Text","x","y","textColor","fontSize","fontWeight","textAnchor","alignmentBaseline","label","wheelCenter","translateX","translateY","pointerPosition","pointer","borderBottomColor","position","alignItems","justifyContent","bottom","zIndex","TouchableOpacity","onPress","disabled","actionButton","actionButtonText","StyleSheet","create","marginTop","marginBottom","overflow","backgroundColor","top","left","borderWidth","borderColor","borderStyle","borderLeftWidth","borderRightWidth","borderBottomWidth","borderLeftColor","borderRightColor","paddingHorizontal","paddingVertical","shadowColor","shadowRadius","_default","exports"],"sourceRoot":"..\\..\\..\\..\\src","sources":["components/Wheel/Wheel.tsx"],"mappings":"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","ignoreList":[]}
|
|
@@ -4,57 +4,7 @@ import React, { useState, useRef, useEffect } from "react";
|
|
|
4
4
|
import { View, StyleSheet, Animated, Text, TouchableOpacity, Easing } from "react-native";
|
|
5
5
|
import { Svg, Path, G, Text as SvgText } from "react-native-svg";
|
|
6
6
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
7
|
-
|
|
8
|
-
const colors = ["#FF0000",
|
|
9
|
-
// Red
|
|
10
|
-
"#FFA500",
|
|
11
|
-
// Orange
|
|
12
|
-
"#FFFF00",
|
|
13
|
-
// Yellow
|
|
14
|
-
"#008000",
|
|
15
|
-
// Green
|
|
16
|
-
"#0000FF",
|
|
17
|
-
// Blue
|
|
18
|
-
"#800080",
|
|
19
|
-
// Purple
|
|
20
|
-
"#FFC0CB",
|
|
21
|
-
// Pink
|
|
22
|
-
"#00FFFF",
|
|
23
|
-
// Cyan
|
|
24
|
-
"#FF00FF",
|
|
25
|
-
// Magenta
|
|
26
|
-
"#00FF00",
|
|
27
|
-
// Lime
|
|
28
|
-
"#4B0082",
|
|
29
|
-
// Indigo
|
|
30
|
-
"#EE82EE",
|
|
31
|
-
// Violet
|
|
32
|
-
"#40E0D0",
|
|
33
|
-
// Turquoise
|
|
34
|
-
"#FFD700",
|
|
35
|
-
// Gold
|
|
36
|
-
"#C0C0C0",
|
|
37
|
-
// Silver
|
|
38
|
-
"#FFDAB9",
|
|
39
|
-
// Peach
|
|
40
|
-
"#E6E6FA",
|
|
41
|
-
// Lavender
|
|
42
|
-
"#008080",
|
|
43
|
-
// Teal
|
|
44
|
-
"#FF7F50",
|
|
45
|
-
// Coral
|
|
46
|
-
"#DC143C",
|
|
47
|
-
// Crimson
|
|
48
|
-
"#87CEEB",
|
|
49
|
-
// Sky Blue
|
|
50
|
-
"#7FFF00",
|
|
51
|
-
// Chartreuse
|
|
52
|
-
"#CCCCFF",
|
|
53
|
-
// Periwinkle
|
|
54
|
-
"#FF6347",
|
|
55
|
-
// Tomato
|
|
56
|
-
"#FA8072" // Salmon
|
|
57
|
-
];
|
|
7
|
+
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"];
|
|
58
8
|
const SpinWheel = ({
|
|
59
9
|
items,
|
|
60
10
|
size = 300,
|
|
@@ -70,17 +20,14 @@ const SpinWheel = ({
|
|
|
70
20
|
knobColor = "#D81E5B",
|
|
71
21
|
actionButtonStyle,
|
|
72
22
|
actionButtonTextStyle,
|
|
73
|
-
wheelTextColor = "#FFFFFF"
|
|
23
|
+
wheelTextColor = "#FFFFFF",
|
|
24
|
+
winner
|
|
74
25
|
}) => {
|
|
75
26
|
const wheelItems = items.length > 0 ? items : [];
|
|
76
27
|
const [spinning, setSpinning] = useState(false);
|
|
77
|
-
const [
|
|
28
|
+
const [internalWinner, setInternalWinner] = useState(null);
|
|
78
29
|
const rotateValue = useRef(new Animated.Value(0)).current;
|
|
79
|
-
|
|
80
|
-
// Track rotation manually for calculations
|
|
81
30
|
const rotationRef = useRef(0);
|
|
82
|
-
|
|
83
|
-
// Update tracked rotation when animation completes
|
|
84
31
|
useEffect(() => {
|
|
85
32
|
const listener = rotateValue.addListener(({
|
|
86
33
|
value
|
|
@@ -91,17 +38,13 @@ const SpinWheel = ({
|
|
|
91
38
|
rotateValue.removeListener(listener);
|
|
92
39
|
};
|
|
93
40
|
}, [rotateValue]);
|
|
94
|
-
|
|
95
|
-
// Calculate angle for each segment
|
|
96
41
|
const anglePerItem = 360 / wheelItems.length;
|
|
97
42
|
|
|
98
|
-
//
|
|
43
|
+
// Generate wheel paths and text positions
|
|
99
44
|
const generateWheelPaths = () => {
|
|
100
45
|
return wheelItems.map((item, index) => {
|
|
101
46
|
const startAngle = index * anglePerItem;
|
|
102
47
|
const endAngle = (index + 1) * anglePerItem;
|
|
103
|
-
|
|
104
|
-
// Calculate path for segment
|
|
105
48
|
const startRad = startAngle * Math.PI / 180;
|
|
106
49
|
const endRad = endAngle * Math.PI / 180;
|
|
107
50
|
const x1 = size / 2 + size / 2 * Math.cos(startRad);
|
|
@@ -110,56 +53,67 @@ const SpinWheel = ({
|
|
|
110
53
|
const y2 = size / 2 + size / 2 * Math.sin(endRad);
|
|
111
54
|
const largeArcFlag = endAngle - startAngle <= 180 ? "0" : "1";
|
|
112
55
|
const pathData = [`M ${size / 2} ${size / 2}`, `L ${x1} ${y1}`, `A ${size / 2} ${size / 2} 0 ${largeArcFlag} 1 ${x2} ${y2}`, "Z"].join(" ");
|
|
113
|
-
|
|
114
|
-
// Calculate coordinates for text and decoration
|
|
115
56
|
const midRad = (startAngle + endAngle) / 2 * (Math.PI / 180);
|
|
116
57
|
const textX = size / 2 + size * 0.32 * Math.cos(midRad);
|
|
117
58
|
const textY = size / 2 + size * 0.32 * Math.sin(midRad);
|
|
118
|
-
const decorationX = size / 2 + size * 0.43 * Math.cos(midRad);
|
|
119
|
-
const decorationY = size / 2 + size * 0.43 * Math.sin(midRad);
|
|
120
59
|
return {
|
|
121
60
|
path: pathData,
|
|
122
61
|
item,
|
|
123
62
|
textX,
|
|
124
63
|
textY,
|
|
125
|
-
decorationX,
|
|
126
|
-
decorationY,
|
|
127
64
|
angle: (startAngle + endAngle) / 2
|
|
128
65
|
};
|
|
129
66
|
});
|
|
130
67
|
};
|
|
131
68
|
const wheelPaths = generateWheelPaths();
|
|
132
69
|
|
|
133
|
-
//
|
|
134
|
-
const
|
|
135
|
-
|
|
70
|
+
// Helper: get index of a SpinWheelItem
|
|
71
|
+
const getItemIndex = target => wheelItems.findIndex(item => item.id === target.id);
|
|
72
|
+
|
|
73
|
+
// Helper: spin to a given index
|
|
74
|
+
const spinToIndex = (targetIndex, callbackItem) => {
|
|
136
75
|
setSpinning(true);
|
|
137
76
|
onSpinStart?.();
|
|
138
77
|
|
|
139
|
-
//
|
|
140
|
-
|
|
141
|
-
const
|
|
142
|
-
|
|
78
|
+
// The pointer is at 270deg (top), so we want the winner to land there.
|
|
79
|
+
// The center of the segment is at: (index + 0.5) * anglePerItem
|
|
80
|
+
const winnerAngle = 360 - ((targetIndex + 0.5) * anglePerItem - 270);
|
|
81
|
+
|
|
82
|
+
// Add extra spins for effect
|
|
83
|
+
const extraSpins = 3;
|
|
84
|
+
const currentRotation = rotationRef.current * 360;
|
|
85
|
+
const targetRotation = currentRotation + extraSpins * 360 + winnerAngle;
|
|
143
86
|
Animated.timing(rotateValue, {
|
|
144
|
-
toValue:
|
|
87
|
+
toValue: targetRotation / 360,
|
|
145
88
|
duration: spinDuration,
|
|
146
89
|
easing: Easing.out(Easing.cubic),
|
|
147
90
|
useNativeDriver: true
|
|
148
|
-
}).start(() =>
|
|
91
|
+
}).start(() => {
|
|
92
|
+
setSpinning(false);
|
|
93
|
+
setInternalWinner(callbackItem);
|
|
94
|
+
onSpinEnd?.(callbackItem);
|
|
95
|
+
});
|
|
149
96
|
};
|
|
150
97
|
|
|
151
|
-
//
|
|
152
|
-
|
|
153
|
-
|
|
98
|
+
// If winner prop changes, spin to it
|
|
99
|
+
useEffect(() => {
|
|
100
|
+
if (!winner || spinning) return;
|
|
101
|
+
const winnerIndex = getItemIndex(winner);
|
|
102
|
+
if (winnerIndex === -1) return;
|
|
103
|
+
spinToIndex(winnerIndex, winner);
|
|
104
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
105
|
+
}, [winner]);
|
|
106
|
+
|
|
107
|
+
// Handle random spin (if no winner is set)
|
|
108
|
+
const handleSpin = () => {
|
|
109
|
+
if (spinning || !enabled) return;
|
|
110
|
+
// If winner prop is set, ignore button (or you can allow override)
|
|
111
|
+
if (winner) return;
|
|
154
112
|
|
|
155
|
-
//
|
|
156
|
-
const
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
const adjustedIndex = (wheelItems.length - 1 - winningIndex) % wheelItems.length;
|
|
160
|
-
const winningItem = wheelItems[adjustedIndex >= 0 ? adjustedIndex : wheelItems.length + adjustedIndex];
|
|
161
|
-
setWinner(winningItem);
|
|
162
|
-
onSpinEnd?.(winningItem);
|
|
113
|
+
// Pick a random winner
|
|
114
|
+
const randomIndex = Math.floor(Math.random() * wheelItems.length);
|
|
115
|
+
const randomWinner = wheelItems[randomIndex];
|
|
116
|
+
spinToIndex(randomIndex, randomWinner);
|
|
163
117
|
};
|
|
164
118
|
|
|
165
119
|
// Animation interpolation for rotation
|
|
@@ -193,29 +147,25 @@ const SpinWheel = ({
|
|
|
193
147
|
item,
|
|
194
148
|
textX,
|
|
195
149
|
textY,
|
|
196
|
-
decorationX,
|
|
197
|
-
decorationY,
|
|
198
150
|
angle
|
|
199
|
-
}, index) => {
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
}, item.id);
|
|
218
|
-
})
|
|
151
|
+
}, index) => /*#__PURE__*/_jsxs(React.Fragment, {
|
|
152
|
+
children: [/*#__PURE__*/_jsx(Path, {
|
|
153
|
+
d: path,
|
|
154
|
+
fill: !item.color ? colors[index % colors.length] : item.color,
|
|
155
|
+
stroke: "#000000",
|
|
156
|
+
strokeWidth: 1
|
|
157
|
+
}), /*#__PURE__*/_jsx(SvgText, {
|
|
158
|
+
x: textX,
|
|
159
|
+
y: textY,
|
|
160
|
+
fill: item.textColor || wheelTextColor,
|
|
161
|
+
fontSize: wheelTextStyle?.fontSize || 14,
|
|
162
|
+
fontWeight: wheelTextStyle?.fontWeight || "bold",
|
|
163
|
+
textAnchor: "middle",
|
|
164
|
+
alignmentBaseline: "central",
|
|
165
|
+
transform: `rotate(${angle + 180}, ${textX}, ${textY})`,
|
|
166
|
+
children: item.label
|
|
167
|
+
})]
|
|
168
|
+
}, item.id))
|
|
219
169
|
})
|
|
220
170
|
})
|
|
221
171
|
}), /*#__PURE__*/_jsx(View, {
|
|
@@ -247,7 +197,7 @@ const SpinWheel = ({
|
|
|
247
197
|
},
|
|
248
198
|
children: /*#__PURE__*/_jsx(TouchableOpacity, {
|
|
249
199
|
onPress: handleSpin,
|
|
250
|
-
disabled: spinning || !enabled,
|
|
200
|
+
disabled: spinning || !enabled || !!winner,
|
|
251
201
|
style: [styles.actionButton, actionButtonStyle],
|
|
252
202
|
children: /*#__PURE__*/_jsx(Text, {
|
|
253
203
|
style: [styles.actionButtonText, actionButtonTextStyle],
|
|
@@ -263,7 +213,7 @@ const styles = StyleSheet.create({
|
|
|
263
213
|
alignItems: "center",
|
|
264
214
|
justifyContent: "center",
|
|
265
215
|
marginTop: 20,
|
|
266
|
-
marginBottom: 70
|
|
216
|
+
marginBottom: 70
|
|
267
217
|
},
|
|
268
218
|
wheelContainer: {
|
|
269
219
|
overflow: "hidden",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["React","useState","useRef","useEffect","View","StyleSheet","Animated","Text","TouchableOpacity","Easing","Svg","Path","G","SvgText","jsx","_jsx","jsxs","_jsxs","colors","SpinWheel","items","size","spinDuration","enabled","onSpinStart","onSpinEnd","containerStyle","centerStyle","spinButtonText","wheelTextStyle","knobStyle","knobColor","actionButtonStyle","actionButtonTextStyle","wheelTextColor","wheelItems","length","spinning","setSpinning","_","setWinner","rotateValue","Value","current","rotationRef","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","decorationX","decorationY","path","angle","wheelPaths","handleSpin","randomSpins","random","randomAngle","targetRotation","timing","toValue","duration","easing","out","cubic","useNativeDriver","start","handleSpinEnd","normalizedAngle","winningIndex","floor","adjustedIndex","winningItem","rotate","interpolate","inputRange","outputRange","style","styles","container","children","width","height","wheelContainer","borderRadius","transform","viewBox","Fragment","d","fill","color","stroke","strokeWidth","x","y","textColor","fontSize","fontWeight","textAnchor","alignmentBaseline","label","id","wheelCenter","translateX","translateY","pointerPosition","pointer","borderBottomColor","position","alignItems","justifyContent","bottom","zIndex","onPress","disabled","actionButton","actionButtonText","create","marginTop","marginBottom","overflow","backgroundColor","top","left","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","Text","TouchableOpacity","Easing","Svg","Path","G","SvgText","jsx","_jsx","jsxs","_jsxs","colors","SpinWheel","items","size","spinDuration","enabled","onSpinStart","onSpinEnd","containerStyle","centerStyle","spinButtonText","wheelTextStyle","knobStyle","knobColor","actionButtonStyle","actionButtonTextStyle","wheelTextColor","winner","wheelItems","length","spinning","setSpinning","internalWinner","setInternalWinner","rotateValue","Value","current","rotationRef","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","getItemIndex","target","findIndex","id","spinToIndex","targetIndex","callbackItem","winnerAngle","extraSpins","currentRotation","targetRotation","timing","toValue","duration","easing","out","cubic","useNativeDriver","start","winnerIndex","handleSpin","randomIndex","floor","random","randomWinner","rotate","interpolate","inputRange","outputRange","style","styles","container","children","width","height","wheelContainer","borderRadius","transform","viewBox","Fragment","d","fill","color","stroke","strokeWidth","x","y","textColor","fontSize","fontWeight","textAnchor","alignmentBaseline","label","wheelCenter","translateX","translateY","pointerPosition","pointer","borderBottomColor","position","alignItems","justifyContent","bottom","zIndex","onPress","disabled","actionButton","actionButtonText","create","marginTop","marginBottom","overflow","backgroundColor","top","left","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":[]}
|
|
@@ -11,7 +11,6 @@ interface SpinWheelProps {
|
|
|
11
11
|
items: SpinWheelItem[];
|
|
12
12
|
size?: number;
|
|
13
13
|
spinDuration?: number;
|
|
14
|
-
friction?: number;
|
|
15
14
|
enabled?: boolean;
|
|
16
15
|
onSpinStart?: () => void;
|
|
17
16
|
onSpinEnd?: (item: SpinWheelItem) => void;
|
|
@@ -22,10 +21,10 @@ interface SpinWheelProps {
|
|
|
22
21
|
knobStyle?: ViewStyle;
|
|
23
22
|
actionButtonStyle?: ViewStyle;
|
|
24
23
|
actionButtonTextStyle?: TextStyle;
|
|
25
|
-
wheelBorderColor?: string;
|
|
26
24
|
wheelTextColor?: string;
|
|
27
25
|
knobColor?: string;
|
|
28
26
|
centerComponent?: React.ReactNode;
|
|
27
|
+
winner?: SpinWheelItem | null;
|
|
29
28
|
}
|
|
30
29
|
declare const SpinWheel: React.FC<SpinWheelProps>;
|
|
31
30
|
export default SpinWheel;
|
|
@@ -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;AAGtB,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;AAGtB,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;AASD,UAAU,cAAc;IACtB,KAAK,EAAE,aAAa,EAAE,CAAC;IACvB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,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,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,eAAe,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAClC,MAAM,CAAC,EAAE,aAAa,GAAG,IAAI,CAAC;CAC/B;AAED,QAAA,MAAM,SAAS,EAAE,KAAK,CAAC,EAAE,CAAC,cAAc,CAqOvC,CAAC;AAsDF,eAAe,SAAS,CAAC"}
|
|
@@ -11,7 +11,6 @@ interface SpinWheelProps {
|
|
|
11
11
|
items: SpinWheelItem[];
|
|
12
12
|
size?: number;
|
|
13
13
|
spinDuration?: number;
|
|
14
|
-
friction?: number;
|
|
15
14
|
enabled?: boolean;
|
|
16
15
|
onSpinStart?: () => void;
|
|
17
16
|
onSpinEnd?: (item: SpinWheelItem) => void;
|
|
@@ -22,10 +21,10 @@ interface SpinWheelProps {
|
|
|
22
21
|
knobStyle?: ViewStyle;
|
|
23
22
|
actionButtonStyle?: ViewStyle;
|
|
24
23
|
actionButtonTextStyle?: TextStyle;
|
|
25
|
-
wheelBorderColor?: string;
|
|
26
24
|
wheelTextColor?: string;
|
|
27
25
|
knobColor?: string;
|
|
28
26
|
centerComponent?: React.ReactNode;
|
|
27
|
+
winner?: SpinWheelItem | null;
|
|
29
28
|
}
|
|
30
29
|
declare const SpinWheel: React.FC<SpinWheelProps>;
|
|
31
30
|
export default SpinWheel;
|
|
@@ -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;AAGtB,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;AAGtB,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;AASD,UAAU,cAAc;IACtB,KAAK,EAAE,aAAa,EAAE,CAAC;IACvB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,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,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,eAAe,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAClC,MAAM,CAAC,EAAE,aAAa,GAAG,IAAI,CAAC;CAC/B;AAED,QAAA,MAAM,SAAS,EAAE,KAAK,CAAC,EAAE,CAAC,cAAc,CAqOvC,CAAC;AAsDF,eAAe,SAAS,CAAC"}
|
package/package.json
CHANGED
|
@@ -19,52 +19,20 @@ export interface SpinWheelItem {
|
|
|
19
19
|
textColor?: string;
|
|
20
20
|
}
|
|
21
21
|
|
|
22
|
-
//default random colors
|
|
23
22
|
const colors = [
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
"#0000FF", // Blue
|
|
29
|
-
"#800080", // Purple
|
|
30
|
-
"#FFC0CB", // Pink
|
|
31
|
-
"#00FFFF", // Cyan
|
|
32
|
-
"#FF00FF", // Magenta
|
|
33
|
-
"#00FF00", // Lime
|
|
34
|
-
"#4B0082", // Indigo
|
|
35
|
-
"#EE82EE", // Violet
|
|
36
|
-
"#40E0D0", // Turquoise
|
|
37
|
-
"#FFD700", // Gold
|
|
38
|
-
"#C0C0C0", // Silver
|
|
39
|
-
"#FFDAB9", // Peach
|
|
40
|
-
"#E6E6FA", // Lavender
|
|
41
|
-
"#008080", // Teal
|
|
42
|
-
"#FF7F50", // Coral
|
|
43
|
-
"#DC143C", // Crimson
|
|
44
|
-
"#87CEEB", // Sky Blue
|
|
45
|
-
"#7FFF00", // Chartreuse
|
|
46
|
-
"#CCCCFF", // Periwinkle
|
|
47
|
-
"#FF6347", // Tomato
|
|
48
|
-
"#FA8072" // Salmon
|
|
23
|
+
"#FF0000", "#FFA500", "#FFFF00", "#008000", "#0000FF", "#800080",
|
|
24
|
+
"#FFC0CB", "#00FFFF", "#FF00FF", "#00FF00", "#4B0082", "#EE82EE",
|
|
25
|
+
"#40E0D0", "#FFD700", "#C0C0C0", "#FFDAB9", "#E6E6FA", "#008080",
|
|
26
|
+
"#FF7F50", "#DC143C", "#87CEEB", "#7FFF00", "#CCCCFF", "#FF6347", "#FA8072"
|
|
49
27
|
];
|
|
50
28
|
|
|
51
29
|
interface SpinWheelProps {
|
|
52
|
-
// Data
|
|
53
30
|
items: SpinWheelItem[];
|
|
54
|
-
|
|
55
|
-
// Dimensions
|
|
56
31
|
size?: number;
|
|
57
|
-
|
|
58
|
-
// Behavior
|
|
59
32
|
spinDuration?: number;
|
|
60
|
-
friction?: number;
|
|
61
33
|
enabled?: boolean;
|
|
62
|
-
|
|
63
|
-
// Events
|
|
64
34
|
onSpinStart?: () => void;
|
|
65
35
|
onSpinEnd?: (item: SpinWheelItem) => void;
|
|
66
|
-
|
|
67
|
-
// Styling
|
|
68
36
|
containerStyle?: ViewStyle;
|
|
69
37
|
centerStyle?: ViewStyle;
|
|
70
38
|
spinButtonText?: string;
|
|
@@ -72,14 +40,10 @@ interface SpinWheelProps {
|
|
|
72
40
|
knobStyle?: ViewStyle;
|
|
73
41
|
actionButtonStyle?: ViewStyle;
|
|
74
42
|
actionButtonTextStyle?: TextStyle;
|
|
75
|
-
|
|
76
|
-
// Custom colors
|
|
77
|
-
wheelBorderColor?: string;
|
|
78
43
|
wheelTextColor?: string;
|
|
79
44
|
knobColor?: string;
|
|
80
|
-
|
|
81
|
-
// Custom components
|
|
82
45
|
centerComponent?: React.ReactNode;
|
|
46
|
+
winner?: SpinWheelItem | null; // Winner to spin to
|
|
83
47
|
}
|
|
84
48
|
|
|
85
49
|
const SpinWheel: React.FC<SpinWheelProps> = ({
|
|
@@ -98,69 +62,51 @@ const SpinWheel: React.FC<SpinWheelProps> = ({
|
|
|
98
62
|
actionButtonStyle,
|
|
99
63
|
actionButtonTextStyle,
|
|
100
64
|
wheelTextColor = "#FFFFFF",
|
|
65
|
+
winner,
|
|
101
66
|
}) => {
|
|
102
67
|
const wheelItems = items.length > 0 ? items : [];
|
|
103
|
-
|
|
104
68
|
const [spinning, setSpinning] = useState(false);
|
|
105
|
-
const [
|
|
69
|
+
const [internalWinner, setInternalWinner] = useState<SpinWheelItem | null>(null);
|
|
106
70
|
const rotateValue = useRef(new Animated.Value(0)).current;
|
|
107
|
-
|
|
108
|
-
// Track rotation manually for calculations
|
|
109
71
|
const rotationRef = useRef(0);
|
|
110
72
|
|
|
111
|
-
// Update tracked rotation when animation completes
|
|
112
73
|
useEffect(() => {
|
|
113
74
|
const listener = rotateValue.addListener(({ value }) => {
|
|
114
75
|
rotationRef.current = value;
|
|
115
76
|
});
|
|
116
|
-
|
|
117
77
|
return () => {
|
|
118
78
|
rotateValue.removeListener(listener);
|
|
119
79
|
};
|
|
120
80
|
}, [rotateValue]);
|
|
121
81
|
|
|
122
|
-
// Calculate angle for each segment
|
|
123
82
|
const anglePerItem = 360 / wheelItems.length;
|
|
124
83
|
|
|
125
|
-
//
|
|
84
|
+
// Generate wheel paths and text positions
|
|
126
85
|
const generateWheelPaths = () => {
|
|
127
86
|
return wheelItems.map((item, index) => {
|
|
128
87
|
const startAngle = index * anglePerItem;
|
|
129
88
|
const endAngle = (index + 1) * anglePerItem;
|
|
130
|
-
|
|
131
|
-
// Calculate path for segment
|
|
132
89
|
const startRad = (startAngle * Math.PI) / 180;
|
|
133
90
|
const endRad = (endAngle * Math.PI) / 180;
|
|
134
|
-
|
|
135
91
|
const x1 = size / 2 + (size / 2) * Math.cos(startRad);
|
|
136
92
|
const y1 = size / 2 + (size / 2) * Math.sin(startRad);
|
|
137
93
|
const x2 = size / 2 + (size / 2) * Math.cos(endRad);
|
|
138
94
|
const y2 = size / 2 + (size / 2) * Math.sin(endRad);
|
|
139
|
-
|
|
140
95
|
const largeArcFlag = endAngle - startAngle <= 180 ? "0" : "1";
|
|
141
|
-
|
|
142
96
|
const pathData = [
|
|
143
97
|
`M ${size / 2} ${size / 2}`,
|
|
144
98
|
`L ${x1} ${y1}`,
|
|
145
99
|
`A ${size / 2} ${size / 2} 0 ${largeArcFlag} 1 ${x2} ${y2}`,
|
|
146
100
|
"Z",
|
|
147
101
|
].join(" ");
|
|
148
|
-
|
|
149
|
-
// Calculate coordinates for text and decoration
|
|
150
102
|
const midRad = ((startAngle + endAngle) / 2) * (Math.PI / 180);
|
|
151
103
|
const textX = size / 2 + size * 0.32 * Math.cos(midRad);
|
|
152
104
|
const textY = size / 2 + size * 0.32 * Math.sin(midRad);
|
|
153
|
-
|
|
154
|
-
const decorationX = size / 2 + size * 0.43 * Math.cos(midRad);
|
|
155
|
-
const decorationY = size / 2 + size * 0.43 * Math.sin(midRad);
|
|
156
|
-
|
|
157
105
|
return {
|
|
158
106
|
path: pathData,
|
|
159
107
|
item,
|
|
160
108
|
textX,
|
|
161
109
|
textY,
|
|
162
|
-
decorationX,
|
|
163
|
-
decorationY,
|
|
164
110
|
angle: (startAngle + endAngle) / 2,
|
|
165
111
|
};
|
|
166
112
|
});
|
|
@@ -168,45 +114,56 @@ const SpinWheel: React.FC<SpinWheelProps> = ({
|
|
|
168
114
|
|
|
169
115
|
const wheelPaths = generateWheelPaths();
|
|
170
116
|
|
|
171
|
-
//
|
|
172
|
-
const
|
|
173
|
-
|
|
117
|
+
// Helper: get index of a SpinWheelItem
|
|
118
|
+
const getItemIndex = (target: SpinWheelItem) =>
|
|
119
|
+
wheelItems.findIndex((item) => item.id === target.id);
|
|
174
120
|
|
|
121
|
+
// Helper: spin to a given index
|
|
122
|
+
const spinToIndex = (targetIndex: number, callbackItem: SpinWheelItem) => {
|
|
175
123
|
setSpinning(true);
|
|
176
124
|
onSpinStart?.();
|
|
177
125
|
|
|
178
|
-
//
|
|
179
|
-
|
|
180
|
-
const
|
|
181
|
-
|
|
126
|
+
// The pointer is at 270deg (top), so we want the winner to land there.
|
|
127
|
+
// The center of the segment is at: (index + 0.5) * anglePerItem
|
|
128
|
+
const winnerAngle =
|
|
129
|
+
360 - ((targetIndex + 0.5) * anglePerItem - 270);
|
|
130
|
+
|
|
131
|
+
// Add extra spins for effect
|
|
132
|
+
const extraSpins = 3;
|
|
133
|
+
const currentRotation = rotationRef.current * 360;
|
|
134
|
+
const targetRotation = currentRotation + extraSpins * 360 + winnerAngle;
|
|
182
135
|
|
|
183
136
|
Animated.timing(rotateValue, {
|
|
184
|
-
toValue:
|
|
137
|
+
toValue: targetRotation / 360,
|
|
185
138
|
duration: spinDuration,
|
|
186
139
|
easing: Easing.out(Easing.cubic),
|
|
187
140
|
useNativeDriver: true,
|
|
188
|
-
}).start(() =>
|
|
141
|
+
}).start(() => {
|
|
142
|
+
setSpinning(false);
|
|
143
|
+
setInternalWinner(callbackItem);
|
|
144
|
+
onSpinEnd?.(callbackItem);
|
|
145
|
+
});
|
|
189
146
|
};
|
|
190
147
|
|
|
191
|
-
//
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
//
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
adjustedIndex >= 0 ? adjustedIndex : wheelItems.length + adjustedIndex
|
|
206
|
-
];
|
|
148
|
+
// If winner prop changes, spin to it
|
|
149
|
+
useEffect(() => {
|
|
150
|
+
if (!winner || spinning) return;
|
|
151
|
+
const winnerIndex = getItemIndex(winner);
|
|
152
|
+
if (winnerIndex === -1) return;
|
|
153
|
+
spinToIndex(winnerIndex, winner);
|
|
154
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
155
|
+
}, [winner]);
|
|
156
|
+
|
|
157
|
+
// Handle random spin (if no winner is set)
|
|
158
|
+
const handleSpin = () => {
|
|
159
|
+
if (spinning || !enabled) return;
|
|
160
|
+
// If winner prop is set, ignore button (or you can allow override)
|
|
161
|
+
if (winner) return;
|
|
207
162
|
|
|
208
|
-
|
|
209
|
-
|
|
163
|
+
// Pick a random winner
|
|
164
|
+
const randomIndex = Math.floor(Math.random() * wheelItems.length);
|
|
165
|
+
const randomWinner = wheelItems[randomIndex];
|
|
166
|
+
spinToIndex(randomIndex, randomWinner);
|
|
210
167
|
};
|
|
211
168
|
|
|
212
169
|
// Animation interpolation for rotation
|
|
@@ -233,35 +190,32 @@ const SpinWheel: React.FC<SpinWheelProps> = ({
|
|
|
233
190
|
<Svg width={size} height={size} viewBox={`0 0 ${size} ${size}`}>
|
|
234
191
|
<G>
|
|
235
192
|
{wheelPaths.map(
|
|
236
|
-
(
|
|
237
|
-
{
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
{
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
</React.Fragment>
|
|
263
|
-
);
|
|
264
|
-
}
|
|
193
|
+
({ path, item, textX, textY, angle }, index) => (
|
|
194
|
+
<React.Fragment key={item.id}>
|
|
195
|
+
<Path
|
|
196
|
+
d={path}
|
|
197
|
+
fill={
|
|
198
|
+
!item.color
|
|
199
|
+
? colors[index % colors.length]
|
|
200
|
+
: item.color
|
|
201
|
+
}
|
|
202
|
+
stroke="#000000"
|
|
203
|
+
strokeWidth={1}
|
|
204
|
+
/>
|
|
205
|
+
<SvgText
|
|
206
|
+
x={textX}
|
|
207
|
+
y={textY}
|
|
208
|
+
fill={item.textColor || wheelTextColor}
|
|
209
|
+
fontSize={wheelTextStyle?.fontSize || 14}
|
|
210
|
+
fontWeight={wheelTextStyle?.fontWeight || "bold"}
|
|
211
|
+
textAnchor="middle"
|
|
212
|
+
alignmentBaseline="central"
|
|
213
|
+
transform={`rotate(${angle + 180}, ${textX}, ${textY})`}
|
|
214
|
+
>
|
|
215
|
+
{item.label}
|
|
216
|
+
</SvgText>
|
|
217
|
+
</React.Fragment>
|
|
218
|
+
)
|
|
265
219
|
)}
|
|
266
220
|
</G>
|
|
267
221
|
</Svg>
|
|
@@ -280,13 +234,21 @@ const SpinWheel: React.FC<SpinWheelProps> = ({
|
|
|
280
234
|
],
|
|
281
235
|
borderRadius: size / 5,
|
|
282
236
|
},
|
|
283
|
-
centerStyle
|
|
237
|
+
centerStyle,
|
|
284
238
|
]}
|
|
285
|
-
|
|
239
|
+
>
|
|
240
|
+
{/** Optional: custom center component */}
|
|
241
|
+
</View>
|
|
286
242
|
|
|
287
243
|
{/* The pointer is a triangle on top */}
|
|
288
244
|
<View style={styles.pointerPosition}>
|
|
289
|
-
<View
|
|
245
|
+
<View
|
|
246
|
+
style={[
|
|
247
|
+
styles.pointer,
|
|
248
|
+
{ borderBottomColor: knobColor },
|
|
249
|
+
knobStyle,
|
|
250
|
+
]}
|
|
251
|
+
/>
|
|
290
252
|
</View>
|
|
291
253
|
|
|
292
254
|
{/* Action Button */}
|
|
@@ -302,12 +264,10 @@ const SpinWheel: React.FC<SpinWheelProps> = ({
|
|
|
302
264
|
>
|
|
303
265
|
<TouchableOpacity
|
|
304
266
|
onPress={handleSpin}
|
|
305
|
-
disabled={spinning || !enabled}
|
|
306
|
-
style={[styles.actionButton,
|
|
267
|
+
disabled={spinning || !enabled || !!winner}
|
|
268
|
+
style={[styles.actionButton, actionButtonStyle]}
|
|
307
269
|
>
|
|
308
|
-
<Text
|
|
309
|
-
style={[styles.actionButtonText, actionButtonTextStyle]}
|
|
310
|
-
>
|
|
270
|
+
<Text style={[styles.actionButtonText, actionButtonTextStyle]}>
|
|
311
271
|
{spinButtonText}
|
|
312
272
|
</Text>
|
|
313
273
|
</TouchableOpacity>
|
|
@@ -322,7 +282,7 @@ const styles = StyleSheet.create({
|
|
|
322
282
|
alignItems: "center",
|
|
323
283
|
justifyContent: "center",
|
|
324
284
|
marginTop: 20,
|
|
325
|
-
marginBottom: 70,
|
|
285
|
+
marginBottom: 70,
|
|
326
286
|
},
|
|
327
287
|
wheelContainer: {
|
|
328
288
|
overflow: "hidden",
|
|
@@ -361,12 +321,12 @@ const styles = StyleSheet.create({
|
|
|
361
321
|
borderRadius: 25,
|
|
362
322
|
shadowColor: "#000",
|
|
363
323
|
shadowRadius: 3,
|
|
364
|
-
backgroundColor: "grey"
|
|
324
|
+
backgroundColor: "grey",
|
|
365
325
|
},
|
|
366
326
|
actionButtonText: {
|
|
367
327
|
fontWeight: "bold",
|
|
368
328
|
fontSize: 16,
|
|
369
|
-
}
|
|
329
|
+
},
|
|
370
330
|
});
|
|
371
331
|
|
|
372
332
|
export default SpinWheel;
|