Skip to content

Commit 564eb42

Browse files
authored
Merge pull request #832 from Sim-sat/no-explicit-any-diary
fix(lint): no-explicit-any Diary, Exercises, Foods, Settings
2 parents e4f2fe0 + b5d69a4 commit 564eb42

18 files changed

Lines changed: 276 additions & 242 deletions

SparkyFitnessFrontend/src/api/Diary/foodEntryService.ts

Lines changed: 6 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import { apiCall } from '../api';
22
import type { MealFood } from '@/types/meal';
33
import type { FoodEntryMeal } from '@/types/meal';
44
import type { FoodEntry } from '@/types/food';
5-
import { DayData } from '@/types/diary';
5+
import { DayData, Goals } from '@/types/diary';
66

77
export interface FoodEntryUpdateData {
88
quantity?: number;
@@ -22,8 +22,7 @@ export interface FoodEntryCreateData {
2222
export const updateFoodEntry = async (
2323
id: string,
2424
data: FoodEntryUpdateData
25-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
26-
): Promise<any> => {
25+
): Promise<unknown> => {
2726
const response = await apiCall(`/food-entries/${id}`, {
2827
method: 'PUT',
2928
body: data,
@@ -53,17 +52,15 @@ export const loadMiniNutritionTrendData = async (
5352

5453
export const createFoodEntry = async (
5554
data: FoodEntryCreateData
56-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
57-
): Promise<any> => {
55+
): Promise<unknown> => {
5856
const response = await apiCall('/food-entries', {
5957
method: 'POST',
6058
body: data,
6159
});
6260
return response;
6361
};
6462

65-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
66-
export const removeFoodEntry = async (id: string): Promise<any> => {
63+
export const removeFoodEntry = async (id: string): Promise<void> => {
6764
const response = await apiCall(`/food-entries/${id}`, {
6865
method: 'DELETE',
6966
});
@@ -77,8 +74,7 @@ export const loadFoodEntries = async (date: string): Promise<FoodEntry[]> => {
7774
return response;
7875
};
7976

80-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
81-
export const loadDiaryGoals = async (date: string): Promise<any> => {
77+
export const loadDiaryGoals = async (date: string): Promise<Goals> => {
8278
// Adjust return type as needed
8379
const response = await apiCall(`/goals/by-date/${date}`, {
8480
method: 'GET',
@@ -173,8 +169,7 @@ export const getFoodEntryMealsByDate = async (
173169

174170
export const deleteFoodEntryMeal = async (
175171
foodEntryMealId: string
176-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
177-
): Promise<any> => {
172+
): Promise<unknown> => {
178173
const response = await apiCall(`/food-entry-meals/${foodEntryMealId}`, {
179174
method: 'DELETE',
180175
});

SparkyFitnessFrontend/src/api/Diary/mealTypeService.ts

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -37,8 +37,7 @@ export const updateMealType = async (
3737
return response;
3838
};
3939

40-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
41-
export const deleteMealType = async (id: string): Promise<any> => {
40+
export const deleteMealType = async (id: string): Promise<unknown> => {
4241
const response = await apiCall(`/meal-types/${id}`, {
4342
method: 'DELETE',
4443
});

SparkyFitnessFrontend/src/api/Exercises/exerciseEntryService.ts

Lines changed: 76 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,38 @@ import type { ExerciseEntry } from '@/types/diary';
77
import type { GroupedExerciseEntry } from '@/types/exercises';
88
import type { ExerciseProgressData } from '@/types/reports';
99

10+
interface RawActivityDetail {
11+
id?: string;
12+
detail_type: string;
13+
detail_data: unknown;
14+
provider_name?: string;
15+
}
16+
17+
interface RawExerciseSnapshot {
18+
equipment?: string;
19+
primary_muscles?: string;
20+
secondary_muscles?: string;
21+
instructions?: string;
22+
images?: string;
23+
[key: string]: unknown;
24+
}
25+
26+
interface RawExercise {
27+
sets?: string | unknown[];
28+
exercise_snapshot?: RawExerciseSnapshot;
29+
activity_details?: RawActivityDetail[];
30+
[key: string]: unknown;
31+
}
32+
33+
interface RawGroupedEntry {
34+
type?: string;
35+
exercises?: RawExercise[];
36+
sets?: string | unknown[];
37+
exercise_snapshot?: RawExerciseSnapshot;
38+
activity_details?: RawActivityDetail[];
39+
[key: string]: unknown;
40+
}
41+
1042
export const getExerciseEntriesForDate = async (
1143
date: string
1244
): Promise<GroupedExerciseEntry[]> => {
@@ -24,16 +56,14 @@ export const fetchExerciseEntries = async (
2456
const loggingLevel = getUserLoggingLevel();
2557
const response = await getExerciseEntriesForDate(selectedDate);
2658

27-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
28-
const parsedEntries: GroupedExerciseEntry[] = response.map((entry: any) => {
59+
const parsedEntries: GroupedExerciseEntry[] = response.map((entry) => {
2960
if (entry.type === 'preset') {
3061
return {
31-
...entry,
62+
...(entry as unknown as GroupedExerciseEntry),
3263
exercises: entry.exercises
33-
? // eslint-disable-next-line @typescript-eslint/no-explicit-any
34-
entry.exercises.map((ex: any) => ({
64+
? entry.exercises.map((ex) => ({
3565
...ex,
36-
sets: ex.sets ? parseJsonArray(ex.sets) : [], // Parse sets if it's a JSON string
66+
sets: ex.sets ? ex.sets : [], // Parse sets if it's a JSON string
3767
exercise_snapshot: {
3868
...ex.exercise_snapshot, // Use the existing snapshot
3969
equipment: parseJsonArray(ex.exercise_snapshot.equipment),
@@ -47,8 +77,7 @@ export const fetchExerciseEntries = async (
4777
images: parseJsonArray(ex.exercise_snapshot.images),
4878
},
4979
activity_details: ex.activity_details
50-
? // eslint-disable-next-line @typescript-eslint/no-explicit-any
51-
ex.activity_details.map((detail: any) => ({
80+
? ex.activity_details.map((detail) => ({
5281
id: detail.id,
5382
key: detail.detail_type,
5483
value:
@@ -65,7 +94,7 @@ export const fetchExerciseEntries = async (
6594
} else {
6695
return {
6796
...entry,
68-
sets: entry.sets ? parseJsonArray(entry.sets) : [], // Parse sets if it's a JSON string
97+
sets: entry.sets ? entry.sets : [], // Parse sets if it's a JSON string
6998
exercise_snapshot: {
7099
...entry.exercise_snapshot, // Use the existing snapshot
71100
equipment: parseJsonArray(entry.exercise_snapshot.equipment),
@@ -79,8 +108,7 @@ export const fetchExerciseEntries = async (
79108
images: parseJsonArray(entry.exercise_snapshot.images),
80109
},
81110
activity_details: entry.activity_details
82-
? // eslint-disable-next-line @typescript-eslint/no-explicit-any
83-
entry.activity_details.map((detail: any) => ({
111+
? entry.activity_details.map((detail) => ({
84112
id: detail.id,
85113
key: detail.detail_type,
86114
value:
@@ -127,8 +155,7 @@ export const createExerciseEntry = async (payload: {
127155

128156
// Append other data from the payload to formData
129157
Object.keys(entryData).forEach((key) => {
130-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
131-
const value = (entryData as any)[key];
158+
const value = entryData[key];
132159
if (value !== undefined && value !== null) {
133160
if (key === 'sets' && Array.isArray(value)) {
134161
// The backend expects 'sets' to be a JSON string if it's part of FormData
@@ -215,8 +242,7 @@ export const updateExerciseEntry = async (
215242
formData.append('image', imageFile);
216243

217244
Object.keys(entryData).forEach((key) => {
218-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
219-
const value = (entryData as any)[key];
245+
const value = entryData[key];
220246
if (value !== undefined && value !== null) {
221247
if (key === 'sets' && Array.isArray(value)) {
222248
formData.append(key, JSON.stringify(value));
@@ -298,8 +324,41 @@ export const fetchExerciseDetails = async (
298324

299325
export interface ActivityDetailsResponse {
300326
id?: string;
301-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
302-
[key: string]: any;
327+
activity?: {
328+
details?: {
329+
metricDescriptors?: unknown[];
330+
activityDetailMetrics?: unknown[];
331+
geoPolylineDTO?: {
332+
polyline: { lat: number; lon: number }[];
333+
};
334+
[key: string]: unknown;
335+
};
336+
hr_in_timezones?: unknown[];
337+
splits?: {
338+
lapDTOs: unknown[];
339+
[key: string]: unknown;
340+
};
341+
activity?: {
342+
duration?: number;
343+
calories?: number;
344+
totalAscent?: number;
345+
averageHR?: number;
346+
averageRunCadence?: number;
347+
distance?: number;
348+
averagePace?: number;
349+
activityName?: string;
350+
eventType?: unknown;
351+
course?: unknown;
352+
gear?: unknown;
353+
[key: string]: unknown;
354+
};
355+
[key: string]: unknown;
356+
};
357+
workout?: {
358+
workoutName: string;
359+
[key: string]: unknown;
360+
};
361+
[key: string]: unknown;
303362
}
304363

305364
export const getActivityDetails = async (

SparkyFitnessFrontend/src/api/Exercises/exerciseSearchService.ts

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,7 @@ export const searchExercises = async (
66
equipmentFilter: string[] = [],
77
muscleGroupFilter: string[] = []
88
): Promise<Exercise[]> => {
9-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
10-
const params: Record<string, any> = {
9+
const params: Record<string, string> = {
1110
searchTerm: query,
1211
};
1312
if (equipmentFilter.length > 0) {
@@ -31,8 +30,7 @@ export const searchExternalExercises = async (
3130
muscleGroupFilter: string[] = [],
3231
limit?: number
3332
): Promise<Exercise[]> => {
34-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
35-
const params: Record<string, any> = {
33+
const params: Record<string, string | number> = {
3634
query: query,
3735
providerId: providerId,
3836
providerType: providerType,

SparkyFitnessFrontend/src/api/Exercises/exerciseService.ts

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -96,8 +96,7 @@ export const loadExercises = async (
9696
method: 'GET',
9797
});
9898

99-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
100-
const parsedExercises = response.exercises.map((exercise: any) => ({
99+
const parsedExercises = response.exercises.map((exercise: Exercise) => ({
101100
...exercise,
102101
equipment: parseJsonArray(exercise.equipment),
103102
primary_muscles: parseJsonArray(exercise.primary_muscles),
@@ -229,8 +228,7 @@ export const importExercisesFromCSV = async (
229228
created: number;
230229
updated: number;
231230
failed: number;
232-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
233-
failedRows: any[];
231+
failedRows: unknown[];
234232
}> => {
235233
return apiCall('/exercises/import', {
236234
method: 'POST',

SparkyFitnessFrontend/src/api/Exercises/freeExerciseDB.ts

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,7 @@
11
import { debug, error } from '@/utils/logging';
22
import { getUserLoggingLevel } from '@/utils/userPreferences';
33

4-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
5-
let cachedSchema: any = null;
4+
let cachedSchema: unknown = null;
65

76
const GITHUB_RAW_BASE_URL =
87
'https://raw.githubusercontent.com/yuhonas/free-exercise-db/main';

SparkyFitnessFrontend/src/api/Exercises/workoutPresets.ts

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -50,8 +50,7 @@ export const searchWorkoutPresets = async (
5050
searchTerm: string,
5151
limit?: number
5252
): Promise<WorkoutPreset[]> => {
53-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
54-
const params: Record<string, any> = { searchTerm };
53+
const params: Record<string, string | number> = { searchTerm };
5554
if (limit !== undefined) {
5655
params.limit = limit;
5756
}

SparkyFitnessFrontend/src/api/Foods/mealPlanTemplate.ts

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,7 @@ export const createMealPlanTemplate = async (
1313
currentClientDate?: string
1414
): Promise<MealPlanTemplate> => {
1515
// rename assignments to day_presets because of backend inconsistencies
16-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
17-
const { assignments, ...restData } = templateData as any;
16+
const { assignments, ...restData } = templateData;
1817
return await api.post('/meal-plan-templates', {
1918
body: {
2019
...restData,

SparkyFitnessFrontend/src/api/Foods/meals.ts

Lines changed: 1 addition & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,7 @@ export const getMeals = async (
1616
searchTerm: string = ''
1717
): Promise<Meal[]> => {
1818
let url = `/meals`;
19-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
20-
const params: { [key: string]: any } = { filter };
19+
const params: { [key: string]: string } = { filter };
2120

2221
if (searchTerm) {
2322
url = `/meals/search`;
@@ -88,17 +87,6 @@ export const deleteMealPlanEntry = async (planId: string): Promise<void> => {
8887
await apiCall(`/meals/plan/${planId}`, { method: 'DELETE' });
8988
};
9089

91-
export const logMealPlanEntryToDiary = async (
92-
mealPlanId: string,
93-
targetDate?: string
94-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
95-
): Promise<any[]> => {
96-
return await apiCall(`/meals/plan/${mealPlanId}/log-to-diary`, {
97-
method: 'POST',
98-
body: { target_date: targetDate },
99-
});
100-
};
101-
10290
export const createMealFromDiary = async (
10391
date: string,
10492
mealType: string,

SparkyFitnessFrontend/src/api/Foods/nutrionix.ts

Lines changed: 31 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,27 @@
11
import { toast } from '@/hooks/use-toast';
22
import { apiCall } from '@/api/api';
33

4+
interface NutritionixFood {
5+
food_name: string;
6+
brand_name?: string | null;
7+
nf_calories: number;
8+
nf_protein: number;
9+
nf_total_carbohydrate: number;
10+
nf_total_fat: number;
11+
nf_saturated_fat: number;
12+
nf_cholesterol: number;
13+
nf_sodium: number;
14+
nf_potassium: number;
15+
nf_dietary_fiber: number;
16+
nf_sugars: number;
17+
serving_qty: number;
18+
serving_unit: string;
19+
}
20+
21+
interface NutritionixResponse {
22+
foods?: NutritionixFood[];
23+
}
24+
425
// Function to fetch food data provider details from your backend
526
const fetchFoodDataProvider = async (providerId: string) => {
627
try {
@@ -138,8 +159,7 @@ export const getNutritionixNutrients = async (
138159
};
139160

140161
try {
141-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
142-
const data: any = await apiCall(
162+
const data: NutritionixResponse = await apiCall(
143163
`${NUTRITIONIX_API_BASE_URL}/natural/nutrients`,
144164
{
145165
method: 'POST',
@@ -213,13 +233,15 @@ export const getNutritionixBrandedNutrients = async (
213233
};
214234

215235
try {
216-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
217-
const data: any = await apiCall(`${NUTRITIONIX_API_BASE_URL}/search/item`, {
218-
method: 'GET',
219-
headers,
220-
params: { nix_item_id: nixItemId },
221-
externalApi: true,
222-
});
236+
const data: NutritionixResponse = await apiCall(
237+
`${NUTRITIONIX_API_BASE_URL}/search/item`,
238+
{
239+
method: 'GET',
240+
headers,
241+
params: { nix_item_id: nixItemId },
242+
externalApi: true,
243+
}
244+
);
223245
if (data && data.foods && data.foods.length > 0) {
224246
const food = data.foods[0];
225247
return {

0 commit comments

Comments
 (0)