-
Notifications
You must be signed in to change notification settings - Fork 16
/
useSpringDrag.story.lua
75 lines (66 loc) · 2.11 KB
/
useSpringDrag.story.lua
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
--!strict
--[[
Note: Since this story uses performs mouse position calculations, this
must be viewed in the Roblox Studio window to work properly.
]]
local GuiService = game:GetService("GuiService")
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local RunService = game:GetService("RunService")
local UserInputService = game:GetService("UserInputService")
local CircleButton = require(script.Parent.Parent.components.CircleButton)
local React = require(ReplicatedStorage.Packages.React)
local ReactRoblox = require(ReplicatedStorage.Packages.ReactRoblox)
local RoactSpring = require(ReplicatedStorage.Packages.RoactSpring)
local e = React.createElement
local function Button(_)
local styles, api = RoactSpring.useSpring(function()
return {
size = UDim2.fromOffset(150, 150),
position = UDim2.fromScale(0.5, 0.5),
config = { tension = 100, friction = 10 },
}
end)
local connection = React.useRef(nil :: RBXScriptConnection?)
return e(CircleButton, {
Position = styles.position,
Size = styles.size,
[React.Event.InputBegan] = function(_, input)
if
input.UserInputType == Enum.UserInputType.MouseButton1
or input.UserInputType == Enum.UserInputType.Touch
then
if not connection.current then
connection.current = RunService.Heartbeat:Connect(function()
local mousePos = UserInputService:GetMouseLocation()
- Vector2.new(0, GuiService:GetGuiInset().Y)
api.start({
position = UDim2.fromOffset(mousePos.X, mousePos.Y),
size = UDim2.fromOffset(180, 180),
})
end)
end
end
end,
[React.Event.InputEnded] = function(_, input)
if
input.UserInputType == Enum.UserInputType.MouseButton1
or input.UserInputType == Enum.UserInputType.Touch
then
if connection.current then
api.start({ size = UDim2.fromOffset(150, 150) })
connection.current:Disconnect()
connection.current = nil
end
end
end,
})
end
return function(target)
local root = ReactRoblox.createRoot(Instance.new("Folder"))
root:render(ReactRoblox.createPortal({
App = e(Button),
}, target))
return function()
root:unmount()
end
end