Ringtone app
Non puoi selezionare più di 25 argomenti Gli argomenti devono iniziare con una lettera o un numero, possono includere trattini ('-') e possono essere lunghi fino a 35 caratteri.
 
 
 

75 righe
2.3 KiB

  1. import {GetServerSideProps, NextPage} from 'next'
  2. import {getSession, Session, withPageAuthRequired} from '@auth0/nextjs-auth0';
  3. import {useEffect, useState} from 'react';
  4. import CreateRingtoneTemplate from '../../../../components/templates/CreateRingtone'
  5. import RingtoneClient from '../../../../modules/ringtone/client'
  6. import WaveOscillator from '../../../../utils/sound/WaveOscillator'
  7. import SoundManager from '../../../../utils/sound/SoundManager'
  8. import ComposerClient from '../../../../modules/composer/client'
  9. import {useRouter} from 'next/router';
  10. type Props = {
  11. session: Partial<Session>,
  12. }
  13. const Page: NextPage<Props> = ({
  14. session,
  15. }) => {
  16. const [hydrated, setHydrated] = useState(false)
  17. const [ringtoneClient, setRingtoneClient] = useState<RingtoneClient>(null)
  18. const [composerClient, setComposerClient] = useState<ComposerClient>(null)
  19. const router = useRouter()
  20. useEffect(() => {
  21. setHydrated(true)
  22. }, [])
  23. useEffect(() => {
  24. setRingtoneClient(new RingtoneClient(process.env.NEXT_PUBLIC_API_BASE_URL, session))
  25. }, [hydrated])
  26. useEffect(() => {
  27. const audioContext = new AudioContext()
  28. const gainNode = audioContext.createGain()
  29. gainNode.gain.value = 0.05
  30. gainNode.connect(audioContext.destination)
  31. const oscillator = new WaveOscillator(audioContext, gainNode)
  32. const soundManager = new SoundManager(oscillator)
  33. setComposerClient(new ComposerClient(soundManager))
  34. }, [hydrated])
  35. return (
  36. <CreateRingtoneTemplate
  37. session={session}
  38. addNote={composerClient ? composerClient.addNote : undefined}
  39. addRest={composerClient ? composerClient.addRest : undefined}
  40. togglePlayback={composerClient ? composerClient.togglePlayback : undefined}
  41. updateSong={composerClient ? composerClient.updateSong : undefined}
  42. updateTempo={composerClient ? composerClient.updateTempo : undefined}
  43. updateView={composerClient ? composerClient.updateView : undefined}
  44. onSubmit={ringtoneClient ? ringtoneClient.save({ router, }) : undefined}
  45. play={composerClient ? composerClient.play : undefined}
  46. />
  47. )
  48. }
  49. export const getServerSideProps: GetServerSideProps = withPageAuthRequired({
  50. getServerSideProps: async (ctx) => {
  51. const { idToken, token_type, user } = getSession(ctx.req, ctx.res)
  52. const session = {
  53. idToken,
  54. token_type,
  55. user,
  56. }
  57. return {
  58. props: {
  59. session,
  60. },
  61. }
  62. },
  63. returnTo: '/my/create/ringtones'
  64. })
  65. export default Page