ExerciseSelector.tsx 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. import { useExercisesQuery } from '../../gql'
  2. import { useState, useEffect } from 'react'
  3. import { TExercise } from '../types'
  4. interface IExerciseSelector {
  5. value?: TExercise
  6. onChange: GenericEventHandler
  7. name?: string
  8. label?: string
  9. }
  10. const ExerciseSelector = ({
  11. value,
  12. onChange,
  13. name = 'exercise',
  14. label = 'Exercise'
  15. }: IExerciseSelector) => {
  16. const [state, setState] = useState(value?.id ?? '')
  17. const exercises = useExercisesQuery()
  18. useEffect(() => {
  19. setState(value?.id || '')
  20. }, [value])
  21. return (
  22. <>
  23. <label>{label}</label>
  24. <select
  25. id={name}
  26. name={name}
  27. value={state}
  28. onChange={ev => setState(ev.target.value)}
  29. >
  30. {exercises.loading && 'loading exercises...'}
  31. {exercises.error && 'error loading exercises'}
  32. {exercises.data &&
  33. exercises.data.exercises.map(exercise => (
  34. <option key={exercise.id} value={exercise.id}>
  35. {[exercise.name, exercise.description?.slice(0, 60)]
  36. .filter(exercise => !!exercise)
  37. .join(' - ')}
  38. </option>
  39. ))}
  40. </select>
  41. <button
  42. type='button'
  43. onClick={event => {
  44. const exercise =
  45. exercises.data &&
  46. exercises.data.exercises.find(exercise => exercise.id === state)
  47. if (!exercise) return
  48. const changeEvent: CustomChangeEvent = {
  49. target: {
  50. type: 'custom',
  51. value: exercise,
  52. name
  53. }
  54. }
  55. onChange(changeEvent)
  56. }}
  57. >
  58. Use
  59. </button>
  60. </>
  61. )
  62. }
  63. export default ExerciseSelector