242 lines
7.9 KiB
TypeScript
242 lines
7.9 KiB
TypeScript
import { ActionContext, ActionTree } from 'vuex'
|
|
|
|
import authApi from '@/api/authApi'
|
|
import router from '@/router'
|
|
import { ROOT_STORE, AUTH_USER_STORE, WORKOUTS_STORE } from '@/store/constants'
|
|
import { IRootState } from '@/store/modules/root/types'
|
|
import { WorkoutsMutations } from '@/store/modules/workouts/enums'
|
|
import {
|
|
IWorkoutsActions,
|
|
IWorkoutsState,
|
|
} from '@/store/modules/workouts/types'
|
|
import {
|
|
IWorkout,
|
|
IWorkoutForm,
|
|
IWorkoutPayload,
|
|
TWorkoutsPayload,
|
|
} from '@/types/workouts'
|
|
import { handleError } from '@/utils'
|
|
|
|
const getWorkouts = (
|
|
context: ActionContext<IWorkoutsState, IRootState>,
|
|
payload: TWorkoutsPayload,
|
|
target: WorkoutsMutations
|
|
): void => {
|
|
context.commit(ROOT_STORE.MUTATIONS.EMPTY_ERROR_MESSAGES)
|
|
authApi
|
|
.get('workouts', {
|
|
params: payload,
|
|
})
|
|
.then((res) => {
|
|
if (res.data.status === 'success') {
|
|
context.commit(WORKOUTS_STORE.MUTATIONS[target], res.data.data.workouts)
|
|
if (target === WorkoutsMutations['SET_USER_WORKOUTS']) {
|
|
context.commit(
|
|
WORKOUTS_STORE.MUTATIONS.SET_WORKOUTS_PAGINATION,
|
|
res.data.pagination
|
|
)
|
|
}
|
|
} else {
|
|
handleError(context, null)
|
|
}
|
|
})
|
|
.catch((error) => handleError(context, error))
|
|
}
|
|
|
|
export const actions: ActionTree<IWorkoutsState, IRootState> &
|
|
IWorkoutsActions = {
|
|
[WORKOUTS_STORE.ACTIONS.GET_CALENDAR_WORKOUTS](
|
|
context: ActionContext<IWorkoutsState, IRootState>,
|
|
payload: TWorkoutsPayload
|
|
): void {
|
|
context.commit(WORKOUTS_STORE.MUTATIONS.EMPTY_CALENDAR_WORKOUTS)
|
|
getWorkouts(context, payload, WorkoutsMutations['SET_CALENDAR_WORKOUTS'])
|
|
},
|
|
[WORKOUTS_STORE.ACTIONS.GET_USER_WORKOUTS](
|
|
context: ActionContext<IWorkoutsState, IRootState>,
|
|
payload: TWorkoutsPayload
|
|
): void {
|
|
getWorkouts(context, payload, WorkoutsMutations['SET_USER_WORKOUTS'])
|
|
},
|
|
[WORKOUTS_STORE.ACTIONS.GET_TIMELINE_WORKOUTS](
|
|
context: ActionContext<IWorkoutsState, IRootState>,
|
|
payload: TWorkoutsPayload
|
|
): void {
|
|
getWorkouts(context, payload, WorkoutsMutations['SET_TIMELINE_WORKOUTS'])
|
|
},
|
|
[WORKOUTS_STORE.ACTIONS.GET_MORE_TIMELINE_WORKOUTS](
|
|
context: ActionContext<IWorkoutsState, IRootState>,
|
|
payload: TWorkoutsPayload
|
|
): void {
|
|
getWorkouts(context, payload, WorkoutsMutations['ADD_TIMELINE_WORKOUTS'])
|
|
},
|
|
[WORKOUTS_STORE.ACTIONS.GET_WORKOUT_DATA](
|
|
context: ActionContext<IWorkoutsState, IRootState>,
|
|
payload: IWorkoutPayload
|
|
): void {
|
|
context.commit(ROOT_STORE.MUTATIONS.EMPTY_ERROR_MESSAGES)
|
|
context.commit(WORKOUTS_STORE.MUTATIONS.SET_WORKOUT_LOADING, true)
|
|
const segmentUrl = payload.segmentId ? `/segment/${payload.segmentId}` : ''
|
|
authApi
|
|
.get(`workouts/${payload.workoutId}`)
|
|
.then((res) => {
|
|
const workout: IWorkout = res.data.data.workouts[0]
|
|
if (res.data.status === 'success') {
|
|
if (
|
|
payload.segmentId &&
|
|
(workout.segments.length === 0 ||
|
|
!workout.segments[+payload.segmentId - 1])
|
|
) {
|
|
throw new Error('WORKOUT_NOT_FOUND')
|
|
}
|
|
context.commit(
|
|
WORKOUTS_STORE.MUTATIONS.SET_WORKOUT,
|
|
res.data.data.workouts[0]
|
|
)
|
|
if (res.data.data.workouts[0].with_gpx) {
|
|
authApi
|
|
.get(`workouts/${payload.workoutId}/chart_data${segmentUrl}`)
|
|
.then((res) => {
|
|
if (res.data.status === 'success') {
|
|
context.commit(
|
|
WORKOUTS_STORE.MUTATIONS.SET_WORKOUT_CHART_DATA,
|
|
res.data.data.chart_data
|
|
)
|
|
}
|
|
})
|
|
authApi
|
|
.get(`workouts/${payload.workoutId}/gpx${segmentUrl}`)
|
|
.then((res) => {
|
|
if (res.data.status === 'success') {
|
|
context.commit(
|
|
WORKOUTS_STORE.MUTATIONS.SET_WORKOUT_GPX,
|
|
res.data.data.gpx
|
|
)
|
|
}
|
|
})
|
|
}
|
|
} else {
|
|
context.commit(WORKOUTS_STORE.MUTATIONS.EMPTY_WORKOUT)
|
|
handleError(context, null)
|
|
}
|
|
})
|
|
.catch((error) => {
|
|
context.commit(WORKOUTS_STORE.MUTATIONS.EMPTY_WORKOUT)
|
|
handleError(context, error)
|
|
})
|
|
.finally(() =>
|
|
context.commit(WORKOUTS_STORE.MUTATIONS.SET_WORKOUT_LOADING, false)
|
|
)
|
|
},
|
|
[WORKOUTS_STORE.ACTIONS.DELETE_WORKOUT](
|
|
context: ActionContext<IWorkoutsState, IRootState>,
|
|
payload: IWorkoutPayload
|
|
): void {
|
|
context.commit(ROOT_STORE.MUTATIONS.EMPTY_ERROR_MESSAGES)
|
|
context.commit(WORKOUTS_STORE.MUTATIONS.SET_WORKOUT_LOADING, true)
|
|
authApi
|
|
.delete(`workouts/${payload.workoutId}`)
|
|
.then(() => {
|
|
context.commit(WORKOUTS_STORE.MUTATIONS.EMPTY_WORKOUT)
|
|
context.dispatch(AUTH_USER_STORE.ACTIONS.GET_USER_PROFILE)
|
|
router.push('/')
|
|
})
|
|
.catch((error) => {
|
|
handleError(context, error)
|
|
})
|
|
.finally(() =>
|
|
context.commit(WORKOUTS_STORE.MUTATIONS.SET_WORKOUT_LOADING, false)
|
|
)
|
|
},
|
|
[WORKOUTS_STORE.ACTIONS.EDIT_WORKOUT](
|
|
context: ActionContext<IWorkoutsState, IRootState>,
|
|
payload: IWorkoutPayload
|
|
): void {
|
|
context.commit(ROOT_STORE.MUTATIONS.EMPTY_ERROR_MESSAGES)
|
|
context.commit(WORKOUTS_STORE.MUTATIONS.SET_WORKOUT_LOADING, true)
|
|
authApi
|
|
.patch(`workouts/${payload.workoutId}`, payload.data)
|
|
.then(() => {
|
|
context.dispatch(AUTH_USER_STORE.ACTIONS.GET_USER_PROFILE)
|
|
context
|
|
.dispatch(WORKOUTS_STORE.ACTIONS.GET_WORKOUT_DATA, {
|
|
workoutId: payload.workoutId,
|
|
})
|
|
.then(() => {
|
|
router.push({
|
|
name: 'Workout',
|
|
params: { workoutId: payload.workoutId },
|
|
})
|
|
})
|
|
})
|
|
.catch((error) => {
|
|
handleError(context, error)
|
|
})
|
|
.finally(() =>
|
|
context.commit(WORKOUTS_STORE.MUTATIONS.SET_WORKOUT_LOADING, false)
|
|
)
|
|
},
|
|
[WORKOUTS_STORE.ACTIONS.ADD_WORKOUT](
|
|
context: ActionContext<IWorkoutsState, IRootState>,
|
|
payload: IWorkoutForm
|
|
): void {
|
|
context.commit(ROOT_STORE.MUTATIONS.EMPTY_ERROR_MESSAGES)
|
|
context.commit(WORKOUTS_STORE.MUTATIONS.SET_WORKOUT_LOADING, true)
|
|
if (!payload.file) {
|
|
throw new Error('No file part')
|
|
}
|
|
const notes = payload.notes.replace(/"/g, '\\"')
|
|
const form = new FormData()
|
|
form.append('file', payload.file)
|
|
form.append(
|
|
'data',
|
|
`{"sport_id": ${payload.sport_id}, "notes": "${notes}"}`
|
|
)
|
|
authApi
|
|
.post('workouts', form, {
|
|
headers: {
|
|
'content-type': 'multipart/form-data',
|
|
},
|
|
})
|
|
.then((res) => {
|
|
if (res.data.status === 'created') {
|
|
context.dispatch(AUTH_USER_STORE.ACTIONS.GET_USER_PROFILE)
|
|
const workout: IWorkout = res.data.data.workouts[0]
|
|
router.push(
|
|
res.data.data.workouts.length === 1
|
|
? `/workouts/${workout.id}`
|
|
: '/'
|
|
)
|
|
}
|
|
})
|
|
.catch((error) => {
|
|
handleError(context, error)
|
|
})
|
|
.finally(() =>
|
|
context.commit(WORKOUTS_STORE.MUTATIONS.SET_WORKOUT_LOADING, false)
|
|
)
|
|
},
|
|
[WORKOUTS_STORE.ACTIONS.ADD_WORKOUT_WITHOUT_GPX](
|
|
context: ActionContext<IWorkoutsState, IRootState>,
|
|
payload: IWorkoutForm
|
|
): void {
|
|
context.commit(ROOT_STORE.MUTATIONS.EMPTY_ERROR_MESSAGES)
|
|
context.commit(WORKOUTS_STORE.MUTATIONS.SET_WORKOUT_LOADING, true)
|
|
authApi
|
|
.post('workouts/no_gpx', payload)
|
|
.then((res) => {
|
|
if (res.data.status === 'created') {
|
|
context.dispatch(AUTH_USER_STORE.ACTIONS.GET_USER_PROFILE)
|
|
const workout: IWorkout = res.data.data.workouts[0]
|
|
router.push(`/workouts/${workout.id}`)
|
|
}
|
|
})
|
|
.catch((error) => {
|
|
handleError(context, error)
|
|
})
|
|
.finally(() =>
|
|
context.commit(WORKOUTS_STORE.MUTATIONS.SET_WORKOUT_LOADING, false)
|
|
)
|
|
},
|
|
}
|