1.4.1 • Published 1 year ago

react-custom-roulette v1.4.1

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

npm version Types npm downloads

React Custom Roulette

Features

  • Customizable design
  • Prize selection with props
  • Spinning animation (customizable spin duration)
  • NEW! Images as items (see Types)
  • NEW! Customizable pointer image
  • Multiple consecutive spins (see Multi Spin)
  • 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, Arial'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
fontWeightnumber | string'bold'Global font weight of the option string
fontStylestring'normal'Global font style 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.
disableInitialAnimationbooleanfalseWhen 'true', disables the initial backwards wheel animation

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
  fontWeight?: number | string; // Optional
  fontStyle?: string; // 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
fontSizenumber20Font size number
fontWeightnumber | string'bold'Font weight string or number
fontStylestring'normal'Font style string

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 = () => {
    if (!mustSpin) {
      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) 2023 Effectus Software. [License]

1.4.1

1 year ago

1.3.2

1 year ago

1.4.0

1 year ago

1.3.1

1 year ago

1.3.0

1 year ago

1.2.0

2 years ago

1.1.8

3 years ago

1.1.7

3 years ago

1.1.5

3 years ago

1.1.4

4 years ago

1.1.3

4 years ago

1.1.2

4 years ago

1.1.1

4 years ago

1.0.19

4 years ago

1.1.0

4 years ago

1.0.18

4 years ago

1.0.17

4 years ago

1.0.16

4 years ago

1.0.22

4 years ago

1.0.21

4 years ago

1.0.20

4 years ago

1.0.26

4 years ago

1.0.25

4 years ago

1.0.24

4 years ago

1.0.23

4 years ago

1.0.27

4 years ago

1.0.15

4 years ago

1.0.14

4 years ago

1.0.13

4 years ago

1.0.12

4 years ago

1.0.11

4 years ago

1.0.10

4 years ago

1.0.9

4 years ago

1.0.8

4 years ago

1.0.7

4 years ago

1.0.6

4 years ago

1.0.5

4 years ago

1.0.3

4 years ago

1.0.2

4 years ago

1.0.1

4 years ago

1.0.0

4 years ago

1.0.4

4 years ago