Moved useBook to useSend API
This commit is contained in:
@@ -1,10 +1,7 @@
|
||||
import { useState } from 'react'
|
||||
import { useNavigate } from 'react-router-dom'
|
||||
|
||||
import { getToken } from '../../utils/auth'
|
||||
import { API_URL } from '../../config'
|
||||
import { useCallback } from 'react'
|
||||
import { isObject } from '../../utils/types'
|
||||
import { handleHTTPErrors } from '../../utils'
|
||||
import { useSendWithButton } from '..'
|
||||
import { composeBookURL, processBook } from '../../api/book'
|
||||
|
||||
type BookResponse = {
|
||||
Success: boolean
|
||||
@@ -16,59 +13,29 @@ const isBookResponse = (obj: unknown): obj is BookResponse => (
|
||||
})
|
||||
)
|
||||
|
||||
type BookStatus = '' | 'Загрузка...' | 'Забронировано' | 'Ошибка бронирования'
|
||||
function useBook() {
|
||||
const { doSend, button } = useSendWithButton('Забронировать',
|
||||
'Забронировано',
|
||||
true,
|
||||
composeBookURL(),
|
||||
'POST',
|
||||
true,
|
||||
isBookResponse,
|
||||
processBook
|
||||
)
|
||||
|
||||
function useBook(id: number) {
|
||||
const navigate = useNavigate()
|
||||
|
||||
const [status, setStatus] = useState<BookStatus>('')
|
||||
|
||||
const handleBook = async () => {
|
||||
const token = getToken()
|
||||
|
||||
if (token) {
|
||||
setStatus('Загрузка...')
|
||||
|
||||
try {
|
||||
|
||||
const res = await fetch(API_URL + '/book', {
|
||||
method: 'POST',
|
||||
body: JSON.stringify({
|
||||
id: id
|
||||
}),
|
||||
headers: {
|
||||
'Authorization': 'Bearer ' + token,
|
||||
'Content-Type': 'application/json'
|
||||
}
|
||||
})
|
||||
|
||||
handleHTTPErrors(res)
|
||||
|
||||
const data: unknown = await res.json()
|
||||
|
||||
if (!isBookResponse(data)) {
|
||||
throw new Error('Malformed server response')
|
||||
}
|
||||
|
||||
if (data.Success === true) {
|
||||
setStatus('Забронировано')
|
||||
} else {
|
||||
throw new Error('Server refused to book')
|
||||
}
|
||||
const handleBook = useCallback((id: number) => {
|
||||
void doSend({
|
||||
body: JSON.stringify({
|
||||
id
|
||||
}),
|
||||
headers: {
|
||||
'Content-Type': 'application/json'
|
||||
}
|
||||
catch (err) {
|
||||
setStatus('Ошибка бронирования')
|
||||
})
|
||||
}, [doSend])
|
||||
|
||||
if (import.meta.env.DEV) {
|
||||
console.log(err)
|
||||
}
|
||||
}
|
||||
} else {
|
||||
return navigate('/login')
|
||||
}
|
||||
}
|
||||
|
||||
return { handleBook, status }
|
||||
return { handleBook, bookButton: button }
|
||||
}
|
||||
|
||||
export default useBook
|
||||
|
Reference in New Issue
Block a user