Gymboard/gymboard-app/src/api/main/submission.ts

72 lines
1.8 KiB
TypeScript

import { SimpleGym } from 'src/api/main/gyms';
import { Exercise } from 'src/api/main/exercises';
import { api } from 'src/api/main/index';
import { getGymCompoundId, GymRoutable } from 'src/router/gym-routing';
import { DateTime } from 'luxon';
import {User} from 'src/api/main/auth';
import {AuthStoreType} from 'stores/auth-store';
/**
* The data that's sent when creating a submission.
*/
export interface ExerciseSubmissionPayload {
exerciseShortName: string;
weight: number;
weightUnit: string;
reps: number;
videoFileId: string;
}
export enum WeightUnit {
KILOGRAMS = 'KILOGRAMS',
POUNDS = 'POUNDS'
}
export class WeightUnitUtil {
public static toAbbreviation(unit: WeightUnit): string {
if (unit === WeightUnit.POUNDS) return 'Lbs';
return 'Kg';
}
}
export interface ExerciseSubmission {
id: string;
createdAt: DateTime;
gym: SimpleGym;
exercise: Exercise;
user: User;
performedAt: DateTime;
videoFileId: string;
rawWeight: number;
weightUnit: WeightUnit;
metricWeight: number;
reps: number;
}
export function parseSubmission(data: any): ExerciseSubmission {
data.createdAt = DateTime.fromISO(data.createdAt);
data.performedAt = DateTime.fromISO(data.performedAt);
return data as ExerciseSubmission;
}
class SubmissionsModule {
public async getSubmission(
submissionId: string
): Promise<ExerciseSubmission> {
const response = await api.get(`/submissions/${submissionId}`);
return parseSubmission(response.data);
}
public async createSubmission(
gym: GymRoutable,
payload: ExerciseSubmissionPayload,
authStore: AuthStoreType
): Promise<ExerciseSubmission> {
const gymId = getGymCompoundId(gym);
const response = await api.post(`/gyms/${gymId}/submissions`, payload, authStore.axiosConfig);
return parseSubmission(response.data);
}
}
export default SubmissionsModule;