Hello! I'm wondering in a React environment, how I can update the viewport properties like padTop, padBottom, x, y, height, etc after instantiating the spine-player so that I can update the spine-player based on the state passed into the react component. I found a way to update the skins and animation, but not viewport properties. Here is my React component below. Please also let me know if you see anything else concerning with my react setup in general.
const SpinePlayerComponent = ({
id,
animation,
skins,
padTop,
padLeft,
padBottom,
padRight,
}) => {
const playerDivRef = useRef<HTMLDivElement>(null);
const playerRef = useRef<SpinePlayer | null>(null);
const [isPlayerLoaded, setIsPlayerLoaded] = useState(false);
const skeleton = isPlayerLoaded && playerRef?.current?.skeleton;
useEffect(() => {
if (playerDivRef.current && !playerRef.current) {
const spinePlayer = new SpinePlayer('spine-player-component', {
binaryUrl: 'test.skel',
atlasUrl: 'test.atlas',
animation,
showControls: false,
preserveDrawingBuffer: false,
alpha: true,
success: () => {
setIsPlayerLoaded(true);
},
error: (error) => {
console.error('Error initializing SpinePlayer:', error);
},
});
playerRef.current = spinePlayer;
}
return () => {
if (playerRef.current) {
playerRef.current.dispose();
playerRef.current = null;
}
};
// no dependencies, only initialize spine player once
}, []);
useEffect(() => {
if (skeleton && animation) {
playerRef.current.setAnimation(animation);
}
}, [animation, skeleton]);
useEffect(() => {
if (skeleton && skins) {
const newSkin = new Skin('custom-skin');
skins.forEach((skinName) => {
newSkin.addSkin(skeleton.data.findSkin(skinName));
});
skeleton.setSkin(newSkin);
skeleton.setToSetupPose();
}
}, [skins, skeleton]);
// TODO: not sure how to update viewport properties
// useEffect(() => {
// if (skeleton) {
// playerRef.current.viewport = {
// ...playerRef.current.viewport,
// padTop: `%${padTop}`,
// padBottom: `%${padBottom}`,
// padLeft: `%${padLeft}`,
// padRight: `%${padRight}`,
// };
// playerRef.current.setViewport(animation);
// }
// }, [padTop, padBottom, padLeft, padRight, animation, skeleton]);
return (
<div ref={playerDivRef} id={playerId} className="w-[500px] h-[500px]" />
);
};