1.1.4 • Published 1 year ago

paramall-wheel-of-fortune v1.1.4

Weekly downloads
-
License
MIT
Repository
github
Last release
1 year ago

npm version Types npm downloads

React Custom Roulette

Features

  • Customizable design
  • Prize selection by props
  • Spinning animation
  • NEW! Multiple spins (see Multi Spin)
  • NEW! Customizable spin duration
  • Compatible with TypeScript

Install

$ npm install react-custom-roulette

or

$ yarn add react-custom-roulette

Quickstart

Wheel Component

import React from 'react'
import { Wheel } from 'react-custom-roulette'

const data = [
  { option: '0', style: { backgroundColor: 'green', textColor: 'black' } },
  { option: '1', style: { backgroundColor: 'white' } },
  { option: '2' },
]

export default () => (
  <>
    <Wheel
      mustStartSpinning={mustSpin}
      prizeNumber={3}
      data={data}
      backgroundColors={['#3e3e3e', '#df3428']}
      textColors={['#ffffff']}
    />
  </>
)

Props

PropTypeDefaultDescription
mustStartSpinning (required)boolean-Sets when the roulette must start the spinning animation
prizeNumber (required)number-Sets the winning option. It's value must be between 0 and data.lenght-1
data (required)Array<WheelData>-Array of options. Can contain styling information for a specific option (see WheelData)
onStopSpinningfunction() => nullCallback function that is called when the roulette ends the spinning animation
backgroundColorsArray<string>'darkgrey', 'lightgrey'Array of colors that will fill the background of the roulette options, starting from option 0
textColorsArray<string>'black'Array of colors that will fill the text of the roulette options, starting from option 0
outerBorderColorstring'black'Color of the roulette's outer border line
outerBorderWidthnumber5Width of the roulette's outer border line (0 represents no outer border line)
innerRadiusnumber [0..100]0Distance of the inner radius from the center of the roulette
innerBorderColorstring'black'Color of the roulette's inner border line
innerBorderWidthnumber0Width of the roulette's inner border line (0 represents no inner border line)
radiusLineColorstring'black'Color of the radial lines that separate each option
radiusLineWidthnumber5Width of the radial lines that separate each option (0 represents no radial lines)
fontFamilystring'Helvetica, sans-serif'Global font family of the option string. Non-Web safe fonts are fetched from https://fonts.google.com/. All available fonts can be found there.
fontSizenumber20Global font size of the option string
perpendicularTextbooleanfalseWhen 'true', sets the option texts perpendicular to the roulette's radial lines
textDistancenumber [0..100]60Distance of the option texts from the center of the roulette
spinDurationnumber [0.01 ..]1.0Coefficient to adjust the default spin duration
startingOptionIndexnumber-Set which option (through its index in the data array) will be initially selected by the roulette (before spinning). If not specified the roulette will render without choosing a starting option
pointerPropsPointerProps{ src: roulettePointer }Image source and CSS styling to apply to the pointer image.

Types

WheelData

interface WheelData {
  option?: string;
  image?: ImageProps;
  style?: StyleType; // Optional
  optionSize?: number; // Optional
}
PropTypeDefaultDescription
optionstring''String to be rendered inside an option.
imageImageProps-Image to be rendered inside an option. It is configured through ImageProps
styleStyleType-Styles for option. It is configured through StyleType
optionSizenumber1Integer that sets the size of the option measured in roulette pieces. For example: if data provides 2 options A and B, and you set A's optionSize to 2, B's optionSize to 1, the roulette will render 3 pieces: 2 corresponding to A and 1 corresponding to B. Therefore, A will appear to be twice as big as B.

StyleType

interface StyleType {
  backgroundColor?: string; // Optional
  textColor?: string; // Optional
  fontFamily?: string; // Optional
  fontSize?: number; // Optional
}
PropTypeDefaultDescription
backgroundColorstring'darkgrey' or 'lightgrey'Background color for option.
textColorstring'black'Text color
fontFamilystring'Helvetica, Arial'String containing text font and its fallbacks separated by commas.
fontSizenumber20Number for font size.

ImageProps

interface ImageProps {
  uri: string;
  offsetX?: number; // Optional
  offsetY?: number; // Optional
  sizeMultiplier?: number; // Optional
  landscape?: boolean; // Optional
}
PropTypeDefaultDescription
uristring-Image source. It can be url or path.
offsetXnumber0Image offset in its X axis
offsetYnumber0Image offset in its Y axis
sizeMultipliernumber1A value of 1 means image height is calculated as 200px * sizeMultiplier and width will be calculated to keep aspect ratio.
landscapebooleanfalseIf true, image will be rotated 90 degrees so as to render in a landscape orientation.

PointerProps

interface PointerProps {
  src?: string; // Optional
  style?: React.CSSProperties; // Optional
}
PropTypeDefaultDescription
srcstring-Image src.
styleReact.CSSProperties-Styling for pointer image.

Multi Spin

Example (using useState)

import React, { useState } from 'react'
import { Wheel } from 'react-custom-roulette'

const data = [
  { option: '0' },
  { option: '1' },
  { option: '2' },
]

export default () => {
  const [mustSpin, setMustSpin] = useState(false);
  const [prizeNumber, setPrizeNumber] = useState(0);

  const handleSpinClick = () => {
    const newPrizeNumber = Math.floor(Math.random() * data.length)
    setPrizeNumber(newPrizeNumber)
    setMustSpin(true)
  }

  return (
    <>
      <Wheel
        mustStartSpinning={mustSpin}
        prizeNumber={prizeNumber}
        data={data}

        onStopSpinning={() => {
          setMustSpin(false);
        }}
      />
      <button onClick={handleSpinClick}>SPIN</button>
    </>
  )
}

Contributors

This project exists thanks to all the people who contribute!

License

This project is licensed under the MIT license, Copyright (c) 2022 Effectus Software. [License]