|
|
|
|
import axios from 'axios'
|
|
|
|
|
|
|
|
|
|
const API_BASE_URL = '/api'
|
|
|
|
|
const API_GOD_URL = '/api/god'
|
|
|
|
|
|
|
|
|
|
const instance = axios.create({
|
|
|
|
|
baseURL: API_BASE_URL,
|
|
|
|
|
timeout: 10000,
|
|
|
|
|
headers: {
|
|
|
|
|
'Content-Type': 'application/json'
|
|
|
|
|
}
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
instance.interceptors.request.use(
|
|
|
|
|
(config) => {
|
|
|
|
|
const token = localStorage.getItem('auth_token')
|
|
|
|
|
if (token) {
|
|
|
|
|
config.headers.Authorization = `Bearer ${token}`
|
|
|
|
|
}
|
|
|
|
|
return config
|
|
|
|
|
},
|
|
|
|
|
(error) => Promise.reject(error)
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
instance.interceptors.response.use(
|
|
|
|
|
(response) => response.data,
|
|
|
|
|
(error) => {
|
|
|
|
|
if (error.response?.status === 401) {
|
|
|
|
|
localStorage.removeItem('auth_token')
|
|
|
|
|
localStorage.removeItem('user')
|
|
|
|
|
window.location.href = '/login'
|
|
|
|
|
}
|
|
|
|
|
return Promise.reject(error.response?.data || error.message)
|
|
|
|
|
}
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
export interface CharacterDto {
|
|
|
|
|
id: number
|
|
|
|
|
name: string
|
|
|
|
|
levelName: string
|
|
|
|
|
levelId: number
|
|
|
|
|
maxHP: number
|
|
|
|
|
attack: number
|
|
|
|
|
professionName?: string
|
|
|
|
|
money: number
|
|
|
|
|
currentExp: number
|
|
|
|
|
trainingOn?: string
|
|
|
|
|
nextLevelName?: string
|
|
|
|
|
nextLevelMinExp?: number
|
|
|
|
|
breakthroughRate: number
|
|
|
|
|
canBreakthrough: boolean
|
|
|
|
|
nextLevelRequiredPillId?: number
|
|
|
|
|
nextLevelRequiredPillName?: string
|
|
|
|
|
nextLevelRequiredPillQuantity: number
|
|
|
|
|
trainingExpRate: number
|
|
|
|
|
lastLogin: string
|
|
|
|
|
createdOn: string
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
export interface ProfessionDto {
|
|
|
|
|
id: number
|
|
|
|
|
name: string
|
|
|
|
|
description: string
|
|
|
|
|
attackRate: number
|
|
|
|
|
defendRate: number
|
|
|
|
|
healthRate: number
|
|
|
|
|
criticalRate: number
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
export interface CreateCharacterRequest {
|
|
|
|
|
name: string
|
|
|
|
|
professionId: number
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
export const characterApi = {
|
|
|
|
|
getCharacterList: (): Promise<CharacterDto[]> => {
|
|
|
|
|
return instance.get('/character/list')
|
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
createCharacter: (data: CreateCharacterRequest): Promise<boolean> => {
|
|
|
|
|
return instance.post('/character/register', data)
|
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
deleteCharacter: (characterId: number): Promise<boolean> => {
|
|
|
|
|
return instance.delete(`/character/${characterId}`)
|
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
selectCharacter: (characterId: number): Promise<boolean> => {
|
|
|
|
|
return instance.post(`/character/select/${characterId}`)
|
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
getProfessions: (): Promise<ProfessionDto[]> => {
|
|
|
|
|
return instance.get(`/profession/all`)
|
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
startTraining: (characterId: number): Promise<boolean> => {
|
|
|
|
|
return instance.post(`/character/${characterId}/training/start`)
|
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
stopTraining: (characterId: number): Promise<number> => {
|
|
|
|
|
return instance.post(`/character/${characterId}/training/stop`)
|
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
breakthrough: (characterId: number): Promise<boolean> => {
|
|
|
|
|
return instance.post(`/character/${characterId}/breakthrough`)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
export default instance
|