Ringtone app
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

56 lines
1.4 KiB

  1. import getFormValues from '@theoryofnekomata/formxtra'
  2. import {FormEvent} from 'react'
  3. import {createFetchClient, FetchClient} from '../../utils/api/fetch'
  4. import * as endpoints from './endpoints'
  5. export default class RingtoneClient {
  6. private readonly fetchClient: FetchClient
  7. constructor(private readonly baseUrl, private readonly session?) {
  8. const headers = {}
  9. if (session) {
  10. headers['Authorization'] = `${session.token_type} ${session.idToken}`
  11. }
  12. this.fetchClient = createFetchClient({
  13. baseUrl,
  14. headers,
  15. })
  16. }
  17. save = ({ router, }) => async (e: FormEvent & { submitter: HTMLInputElement | HTMLButtonElement }) => {
  18. e.preventDefault()
  19. const form = e.target as HTMLFormElement
  20. const {tempo, name, data, composerUserSub, id} = getFormValues(form, { submitter: e.submitter })
  21. const values = {
  22. composerUserSub,
  23. name,
  24. data,
  25. tempo: Number(tempo),
  26. }
  27. const endpoint = id ? endpoints.update(id) : endpoints.create
  28. const response = await this.fetchClient(endpoint(values))
  29. if (response.ok) {
  30. const newValues = await response.json()
  31. const { id: newId } = newValues.data
  32. router.replace({
  33. pathname: '/my/create/ringtones/[id]',
  34. query: {
  35. id: newId,
  36. },
  37. shallow: true,
  38. })
  39. }
  40. alert(response.statusText)
  41. }
  42. load = async ({ id }) => {
  43. const response = await this.fetchClient(endpoints.get(id))
  44. if (response.ok) {
  45. const { data } = await response.json()
  46. return data
  47. }
  48. }
  49. }