diff --git a/backend/src/main/kotlin/fr/gouv/cnsp/monitorfish/domain/entities/risk_factor/VesselRiskFactor.kt b/backend/src/main/kotlin/fr/gouv/cnsp/monitorfish/domain/entities/risk_factor/VesselRiskFactor.kt index f0082003cc..8635a16fa9 100644 --- a/backend/src/main/kotlin/fr/gouv/cnsp/monitorfish/domain/entities/risk_factor/VesselRiskFactor.kt +++ b/backend/src/main/kotlin/fr/gouv/cnsp/monitorfish/domain/entities/risk_factor/VesselRiskFactor.kt @@ -37,16 +37,16 @@ data class VesselRiskFactor( val gearOnboard: List? = listOf(), val speciesOnboard: List? = listOf(), val totalWeightOnboard: Double? = null, - val segments: List, + val segments: List = listOf(), val probableSegments: List? = listOf(), val segmentHighestImpact: String? = null, val segmentHighestPriority: String? = null, val lastControlDatetime: ZonedDateTime? = null, val postControlComments: String? = null, - val numberControlsLastFiveYears: Short, - val numberControlsLastThreeYears: Short, - val numberInfractionsLastFiveYears: Short, - val numberGearSeizuresLastFiveYears: Short, - val numberSpeciesSeizuresLastFiveYears: Short, - val numberVesselSeizuresLastFiveYears: Short, + val numberControlsLastFiveYears: Short = 0, + val numberControlsLastThreeYears: Short = 0, + val numberInfractionsLastFiveYears: Short = 0, + val numberGearSeizuresLastFiveYears: Short = 0, + val numberSpeciesSeizuresLastFiveYears: Short = 0, + val numberVesselSeizuresLastFiveYears: Short = 0, ) diff --git a/frontend/src/api/alert.ts b/frontend/src/api/alert.ts index b6a1f60853..9957a3af85 100644 --- a/frontend/src/api/alert.ts +++ b/frontend/src/api/alert.ts @@ -2,7 +2,7 @@ import { FrontendApiError } from '@libs/FrontendApiError' -import { monitorfishApi, monitorfishApiKy } from './api' +import { monitorfishApi } from './api' import type { LEGACY_PendingAlert, @@ -41,97 +41,45 @@ export const alertApi = monitorfishApi.injectEndpoints({ url: `/operational_alerts/silenced` }), transformErrorResponse: response => new FrontendApiError(CREATE_SILENCED_ALERT_ERROR_MESSAGE, response) + }), + deleteSilencedAlert: builder.mutation({ + query: id => ({ + method: 'DELETE', + url: `/operational_alerts/silenced/${id}` + }), + transformErrorResponse: response => new FrontendApiError(DELETE_SILENCED_ALERT_ERROR_MESSAGE, response) + }), + getOperationalAlerts: builder.query({ + query: () => '/bff/v1/operational_alerts', + transformErrorResponse: response => new FrontendApiError(ALERTS_ERROR_MESSAGE, response), + transformResponse: (response: PendingAlert[]) => response.map(normalizePendingAlert) + }), + getSilencedAlerts: builder.query({ + query: () => '/operational_alerts/silenced', + transformErrorResponse: response => new FrontendApiError(ALERTS_ERROR_MESSAGE, response), + transformResponse: (response: SilencedAlert[]) => response + }), + silenceAlert: builder.mutation< + LEGACY_SilencedAlert, + { id: string; silencedAlertPeriodRequest: SilencedAlertPeriodRequest } + >({ + query: ({ id, silencedAlertPeriodRequest }) => ({ + body: { + beforeDateTime: silencedAlertPeriodRequest.beforeDateTime?.toISOString() ?? '', + silencedAlertPeriod: silencedAlertPeriodRequest.silencedAlertPeriod ?? '' + }, + method: 'PUT', + url: `/operational_alerts/${id}/silence` + }), + transformErrorResponse: response => new FrontendApiError(SILENCE_ALERT_ERROR_MESSAGE, response), + transformResponse: (response: SilencedAlert) => response + }), + validateAlert: builder.mutation({ + query: id => ({ + method: 'PUT', + url: `/operational_alerts/${id}/validate` + }), + transformErrorResponse: response => new FrontendApiError(VALIDATE_ALERT_ERROR_MESSAGE, response) }) }) }) - -export const { useCreateSilencedAlertMutation } = alertApi - -/** - * Get operational alerts - * - * @throws {@link FrontendApiError} - */ -async function getOperationalAlertsFromAPI(): Promise { - try { - const data = await monitorfishApiKy.get('/bff/v1/operational_alerts').json() - - return data.map(normalizePendingAlert) - } catch (err) { - throw new FrontendApiError(ALERTS_ERROR_MESSAGE, (err as FrontendApiError).originalError) - } -} - -/** - * Validate an alert - * - * @throws {@link FrontendApiError} - */ -async function validateAlertFromAPI(id: string): Promise { - try { - await monitorfishApiKy.put(`/bff/v1/operational_alerts/${id}/validate`) - } catch (err) { - throw new FrontendApiError(VALIDATE_ALERT_ERROR_MESSAGE, (err as FrontendApiError).originalError) - } -} - -/** - * Silence an alert and returns the saved silenced alert - * - * @throws {@link FrontendApiError} - */ -async function silenceAlertFromAPI( - id: string, - silencedAlertPeriodRequest: SilencedAlertPeriodRequest -): Promise { - // TODO Normalize this data before calling the api service rather than here. - const silencedAlertPeriod = silencedAlertPeriodRequest.silencedAlertPeriod ?? '' - const beforeDateTime = silencedAlertPeriodRequest.beforeDateTime?.toISOString() ?? '' - - try { - return await monitorfishApiKy - .put(`/bff/v1/operational_alerts/${id}/silence`, { - json: { - beforeDateTime, - silencedAlertPeriod - } - }) - .json() - } catch (err) { - throw new FrontendApiError(SILENCE_ALERT_ERROR_MESSAGE, (err as FrontendApiError).originalError) - } -} - -/** - * Get silenced alerts - * - * @throws {@link FrontendApiError} - */ -async function getSilencedAlertsFromAPI(): Promise { - try { - return await monitorfishApiKy.get('/bff/v1/operational_alerts/silenced').json() - } catch (err) { - throw new FrontendApiError(ALERTS_ERROR_MESSAGE, (err as FrontendApiError).originalError) - } -} - -/** - * Delete a silenced alert - * - * @throws {@link FrontendApiError} - */ -async function deleteSilencedAlertFromAPI(id: string): Promise { - try { - await monitorfishApiKy.delete(`/bff/v1/operational_alerts/silenced/${id}`) - } catch (err) { - throw new FrontendApiError(DELETE_SILENCED_ALERT_ERROR_MESSAGE, (err as FrontendApiError).originalError) - } -} - -export { - getOperationalAlertsFromAPI, - validateAlertFromAPI, - silenceAlertFromAPI, - getSilencedAlertsFromAPI, - deleteSilencedAlertFromAPI -} diff --git a/frontend/src/api/api.ts b/frontend/src/api/api.ts index 3d7e9c4fea..e7afc6dbd4 100644 --- a/frontend/src/api/api.ts +++ b/frontend/src/api/api.ts @@ -7,7 +7,6 @@ import { createApi, fetchBaseQuery, retry } from '@reduxjs/toolkit/query/react' import { setMeasurement, startSpan } from '@sentry/react' import { normalizeRtkBaseQuery } from '@utils/normalizeRtkBaseQuery' import { sha256 } from '@utils/sha256' -import { undefinedize } from '@utils/undefinedize' import ky, { HTTPError } from 'ky' import { RTK_MAX_RETRIES, RtkCacheTagType } from './constants' @@ -209,14 +208,6 @@ export const monitorfishPublicApi = createApi({ export const monitorfishApiKy = ky.extend({ hooks: { - afterResponse: [ - async (_input, _options, response) => { - const responseData = await response.json() - const normalizedResponse = undefinedize(responseData) - - return new Response(JSON.stringify(normalizedResponse), response) - } - ], beforeError: [ async error => { const { request, response } = error diff --git a/frontend/src/domain/use_cases/alert/addSilencedAlert.ts b/frontend/src/domain/use_cases/alert/addSilencedAlert.ts index 35686d3d90..148f10cefe 100644 --- a/frontend/src/domain/use_cases/alert/addSilencedAlert.ts +++ b/frontend/src/domain/use_cases/alert/addSilencedAlert.ts @@ -12,6 +12,7 @@ import type { SilencedAlertData } from '@features/Alert/types' export const addSilencedAlert = (silencedAlert: SilencedAlertData): MainAppThunk => async (dispatch, getState) => { + // @ts-ignore const previousSilencedAlerts = getState().alert.silencedAlerts try { @@ -19,14 +20,7 @@ export const addSilencedAlert = * TODO Why is there this TS type issue as `data` is part of the response : * TS2339: Property 'data' does not exist on type '{ data: SilencedAlert; } | { error: FetchBaseQueryError | SerializedError; }'. */ - // @ts-ignore - const { data: savedSilencedAlert, error: silencedAlertError } = await dispatch( - alertApi.endpoints.createSilencedAlert.initiate(silencedAlert) - ) - if (silencedAlertError) { - // eslint-disable-next-line @typescript-eslint/no-throw-literal - throw silencedAlertError - } + const savedSilencedAlert = await dispatch(alertApi.endpoints.createSilencedAlert.initiate(silencedAlert)).unwrap() const nextSilencedAlerts = [savedSilencedAlert, ...previousSilencedAlerts] dispatch(setSilencedAlerts(nextSilencedAlerts)) diff --git a/frontend/src/domain/use_cases/alert/getOperationalAlerts.ts b/frontend/src/domain/use_cases/alert/getOperationalAlerts.ts index e43a7536ad..c507219eb2 100644 --- a/frontend/src/domain/use_cases/alert/getOperationalAlerts.ts +++ b/frontend/src/domain/use_cases/alert/getOperationalAlerts.ts @@ -1,16 +1,19 @@ +import { alertApi } from '@api/alert' +import { RTK_FORCE_REFETCH_QUERY_OPTIONS } from '@api/constants' import { setPendingAlerts } from '@features/Alert/components/SideWindowAlerts/slice' -import { getOperationalAlertsFromAPI } from '../../../api/alert' import { setError } from '../../shared_slices/Global' -import type { MainAppThunk } from '../../../store' +import type { MainAppThunk } from '@store' -export const getOperationalAlerts = (): MainAppThunk => dispatch => { - getOperationalAlertsFromAPI() - .then(alerts => { - dispatch(setPendingAlerts(alerts)) - }) - .catch(error => { - dispatch(setError(error)) - }) +export const getOperationalAlerts = (): MainAppThunk => async dispatch => { + try { + const alerts = await dispatch( + alertApi.endpoints.getOperationalAlerts.initiate(undefined, RTK_FORCE_REFETCH_QUERY_OPTIONS) + ).unwrap() + + dispatch(setPendingAlerts(alerts)) + } catch (error) { + dispatch(setError(error)) + } } diff --git a/frontend/src/domain/use_cases/alert/getSilencedAlerts.ts b/frontend/src/domain/use_cases/alert/getSilencedAlerts.ts index b1edb1e4ef..a63f61c22f 100644 --- a/frontend/src/domain/use_cases/alert/getSilencedAlerts.ts +++ b/frontend/src/domain/use_cases/alert/getSilencedAlerts.ts @@ -1,14 +1,17 @@ +import { alertApi } from '@api/alert' +import { RTK_FORCE_REFETCH_QUERY_OPTIONS } from '@api/constants' import { setSilencedAlerts } from '@features/Alert/components/SideWindowAlerts/slice' -import { getSilencedAlertsFromAPI } from '../../../api/alert' import { setError } from '../../shared_slices/Global' -export const getSilencedAlerts = () => dispatch => { - getSilencedAlertsFromAPI() - .then(silencedAlerts => { - dispatch(setSilencedAlerts(silencedAlerts)) - }) - .catch(error => { - dispatch(setError(error)) - }) +export const getSilencedAlerts = () => async dispatch => { + try { + const silencedAlerts = await dispatch( + alertApi.endpoints.getSilencedAlerts.initiate(undefined, RTK_FORCE_REFETCH_QUERY_OPTIONS) + ).unwrap() + + dispatch(setSilencedAlerts(silencedAlerts)) + } catch (error) { + dispatch(setError(error)) + } } diff --git a/frontend/src/domain/use_cases/alert/reactivateSilencedAlert.ts b/frontend/src/domain/use_cases/alert/reactivateSilencedAlert.ts index 37369b4aef..030e033549 100644 --- a/frontend/src/domain/use_cases/alert/reactivateSilencedAlert.ts +++ b/frontend/src/domain/use_cases/alert/reactivateSilencedAlert.ts @@ -1,16 +1,16 @@ +import { alertApi } from '@api/alert' import { setSilencedAlerts } from '@features/Alert/components/SideWindowAlerts/slice' +import { deleteListItems } from '@utils/deleteListItems' +import { updateListItemsProp } from '@utils/updateListItemsProp' -import { deleteSilencedAlertFromAPI } from '../../../api/alert' -import { deleteListItems } from '../../../utils/deleteListItems' -import { updateListItemsProp } from '../../../utils/updateListItemsProp' import { setError } from '../../shared_slices/Global' -import type { MainAppThunk } from '../../../store' import type { LEGACY_SilencedAlert } from '@features/Alert/types' +import type { MainAppThunk } from '@store' export const reactivateSilencedAlert = (id: string): MainAppThunk => - (dispatch, getState) => { + async (dispatch, getState) => { const previousSilencedAlerts = getState().alert.silencedAlerts const previousSilencedAlertsWithReactivatedFlag = setAlertAsReactivated(previousSilencedAlerts, id) dispatch(setSilencedAlerts(previousSilencedAlertsWithReactivatedFlag)) @@ -20,11 +20,13 @@ export const reactivateSilencedAlert = dispatch(setSilencedAlerts(previousSilencedAlertsWithoutReactivatedFlag)) }, 3200) - deleteSilencedAlertFromAPI(id).catch(error => { + try { + await dispatch(alertApi.endpoints.deleteSilencedAlert.initiate(id)).unwrap() + } catch (error) { clearTimeout(timeout) dispatch(setSilencedAlerts(previousSilencedAlerts)) dispatch(setError(error)) - }) + } } function setAlertAsReactivated(previousSilencedAlerts: LEGACY_SilencedAlert[], id: string) { @@ -32,7 +34,3 @@ function setAlertAsReactivated(previousSilencedAlerts: LEGACY_SilencedAlert[], i isReactivated: true }) } - -export function removeAlert(previousAlerts: LEGACY_SilencedAlert[], id: string) { - return deleteListItems(previousAlerts, 'id', id) -} diff --git a/frontend/src/domain/use_cases/alert/silenceAlert.ts b/frontend/src/domain/use_cases/alert/silenceAlert.ts index 0d2cf32da6..953cceab93 100644 --- a/frontend/src/domain/use_cases/alert/silenceAlert.ts +++ b/frontend/src/domain/use_cases/alert/silenceAlert.ts @@ -1,3 +1,4 @@ +import { alertApi } from '@api/alert' import { addToPendingAlertsBeingSilenced, removeFromSilencedAlertsQueue, @@ -6,14 +7,13 @@ import { } from '@features/Alert/components/SideWindowAlerts/slice' import { removeVesselAlertAndUpdateReporting } from '@features/Vessel/slice' import { renderVesselFeatures } from '@features/Vessel/useCases/renderVesselFeatures' +import { deleteListItems } from '@utils/deleteListItems' -import { silenceAlertFromAPI } from '../../../api/alert' -import { deleteListItems } from '../../../utils/deleteListItems' import { VesselFeature } from '../../entities/vessel/vessel' import { setError } from '../../shared_slices/Global' -import type { MainAppThunk } from '../../../store' import type { SilencedAlertPeriodRequest } from '@features/Alert/types' +import type { MainAppThunk } from '@store' /** * Silence an alert @@ -38,7 +38,10 @@ export const silenceAlert = }, 3200) try { - const silencedAlert = await silenceAlertFromAPI(pendingAlertId, silencedAlertPeriodRequest) + const silencedAlert = await dispatch( + alertApi.endpoints.silenceAlert.initiate({ id: pendingAlertId, silencedAlertPeriodRequest }) + ).unwrap() + dispatch( removeVesselAlertAndUpdateReporting({ alertType: silencedAlert.value.type, diff --git a/frontend/src/domain/use_cases/alert/validateAlert.ts b/frontend/src/domain/use_cases/alert/validateAlert.ts index 0a45f8b6bc..435f2f4e8b 100644 --- a/frontend/src/domain/use_cases/alert/validateAlert.ts +++ b/frontend/src/domain/use_cases/alert/validateAlert.ts @@ -1,17 +1,17 @@ +import { alertApi } from '@api/alert' import { RtkCacheTagType } from '@api/constants' import { setPendingAlerts } from '@features/Alert/components/SideWindowAlerts/slice' import { removeVesselAlertAndUpdateReporting } from '@features/Vessel/slice' import { renderVesselFeatures } from '@features/Vessel/useCases/renderVesselFeatures' import { vesselApi } from '@features/Vessel/vesselApi' +import { deleteListItems } from '@utils/deleteListItems' +import { updateListItemsProp } from '@utils/updateListItemsProp' -import { validateAlertFromAPI } from '../../../api/alert' -import { deleteListItems } from '../../../utils/deleteListItems' -import { updateListItemsProp } from '../../../utils/updateListItemsProp' import { VesselFeature } from '../../entities/vessel/vessel' import { setError } from '../../shared_slices/Global' -import type { MainAppThunk } from '../../../store' import type { LEGACY_PendingAlert } from '@features/Alert/types' +import type { MainAppThunk } from '@store' export const validateAlert = (id: string): MainAppThunk => @@ -26,7 +26,8 @@ export const validateAlert = }, 3200) try { - await validateAlertFromAPI(id) + await dispatch(alertApi.endpoints.validateAlert.initiate(id)).unwrap() + // We dispatch this action to update the reporting list // since it depends on the alerts list that we just updated dispatch(vesselApi.util.invalidateTags([RtkCacheTagType.Reportings])) diff --git a/frontend/src/features/FleetSegment/apis.ts b/frontend/src/features/FleetSegment/apis.ts index 1205417f3d..b0595255a1 100644 --- a/frontend/src/features/FleetSegment/apis.ts +++ b/frontend/src/features/FleetSegment/apis.ts @@ -1,4 +1,4 @@ -import { monitorfishApi, monitorfishApiKy } from '@api/api' +import { monitorfishApi } from '@api/api' import { FleetSegmentSchema } from '@features/FleetSegment/types' import { MissionAction } from '@features/Mission/missionAction.types' import { FrontendApiError } from '@libs/FrontendApiError' @@ -19,8 +19,23 @@ export type UpdateFleetSegmentParams = { updatedSegment: FleetSegment } +export const UPDATE_FLEET_SEGMENT_ERROR_MESSAGE = "Nous n'avons pas pu modifier le segment de flotte" +export const CREATE_FLEET_SEGMENT_ERROR_MESSAGE = "Nous n'avons pas pu créer le segment de flotte" +export const DELETE_FLEET_SEGMENT_ERROR_MESSAGE = "Nous n'avons pas pu supprimer le segment de flotte" +export const GET_FLEET_SEGMENT_YEAR_ENTRIES_ERROR_MESSAGE = + "Nous n'avons pas pu récupérer les années des segments de flotte" +export const ADD_FLEET_SEGMENT_YEAR_ERROR_MESSAGE = + "Nous n'avons pas pu ajouter une nouvelle année de segments de flotte" + export const fleetSegmentApi = monitorfishApi.injectEndpoints({ endpoints: builder => ({ + addFleetSegmentYear: builder.mutation({ + query: nextYear => ({ + method: 'POST', + url: `/bff/v1/admin/fleet_segments/${nextYear}` + }), + transformErrorResponse: response => new FrontendApiError(ADD_FLEET_SEGMENT_YEAR_ERROR_MESSAGE, response) + }), computeFleetSegments: builder.query({ query: params => ({ body: params, @@ -32,6 +47,26 @@ export const fleetSegmentApi = monitorfishApi.injectEndpoints({ .map(segment => FleetSegmentSchema.parse(segment)) .sort((a, b) => a.segment.localeCompare(b.segment)) }), + createFleetSegment: builder.mutation({ + query: segmentFields => ({ + body: segmentFields, + method: 'POST', + url: '/bff/v1/admin/fleet_segments' + }), + transformErrorResponse: response => new FrontendApiError(CREATE_FLEET_SEGMENT_ERROR_MESSAGE, response), + transformResponse: (baseQueryReturnValue: FleetSegment) => FleetSegmentSchema.parse(baseQueryReturnValue) + }), + deleteFleetSegment: builder.mutation({ + query: ({ segment, year }) => ({ + method: 'DELETE', + url: `/bff/v1/admin/fleet_segments?year=${year}&segment=${segment}` + }), + transformErrorResponse: response => new FrontendApiError(DELETE_FLEET_SEGMENT_ERROR_MESSAGE, response), + transformResponse: (baseQueryReturnValue: FleetSegment[]) => + baseQueryReturnValue + .map(segment => FleetSegmentSchema.parse(segment)) + .sort((a, b) => a.segment.localeCompare(b.segment)) + }), getFleetSegments: builder.query({ providesTags: () => [{ type: 'FleetSegments' }], query: year => { @@ -44,6 +79,10 @@ export const fleetSegmentApi = monitorfishApi.injectEndpoints({ .map(segment => FleetSegmentSchema.parse(segment)) .sort((a, b) => a.segment.localeCompare(b.segment)) }), + getFleetSegmentYearEntries: builder.query({ + query: () => '/bff/v1/admin/fleet_segments/years', + transformErrorResponse: response => new FrontendApiError(GET_FLEET_SEGMENT_YEAR_ENTRIES_ERROR_MESSAGE, response) + }), updateFleetSegment: builder.query({ query: params => { const updatedSegment = FleetSegmentSchema.parse(params.updatedSegment) @@ -61,76 +100,3 @@ export const fleetSegmentApi = monitorfishApi.injectEndpoints({ }) export const { useGetFleetSegmentsQuery } = fleetSegmentApi - -export const UPDATE_FLEET_SEGMENT_ERROR_MESSAGE = "Nous n'avons pas pu modifier le segment de flotte" -export const CREATE_FLEET_SEGMENT_ERROR_MESSAGE = "Nous n'avons pas pu créer le segment de flotte" -export const DELETE_FLEET_SEGMENT_ERROR_MESSAGE = "Nous n'avons pas pu supprimer le segment de flotte" -export const GET_FLEET_SEGMENT_YEAR_ENTRIES_ERROR_MESSAGE = - "Nous n'avons pas pu récupérer les années des segments de flotte" -export const ADD_FLEET_SEGMENT_YEAR_ERROR_MESSAGE = - "Nous n'avons pas pu ajouter une nouvelle année de segments de flotte" - -/** - * Delete a fleet segment - * - * @throws {@link FrontendApiError} - */ -async function deleteFleetSegmentFromAPI(segment: string, year: number): Promise { - try { - return await monitorfishApiKy - .delete(`/bff/v1/admin/fleet_segments?year=${year}&segment=${segment}`) - .json() - } catch (err) { - throw new FrontendApiError(DELETE_FLEET_SEGMENT_ERROR_MESSAGE, (err as FrontendApiError).originalError) - } -} - -/** - * Create a fleet segment - * - * @throws {@link FrontendApiError} - */ -async function createFleetSegmentFromAPI(segmentFields: FleetSegment): Promise { - try { - return await monitorfishApiKy - .post('/bff/v1/admin/fleet_segments', { - json: segmentFields - }) - .json() - } catch (err) { - throw new FrontendApiError(CREATE_FLEET_SEGMENT_ERROR_MESSAGE, (err as FrontendApiError).originalError) - } -} - -/** - * Add a new fleet segments year - * - * @throws {@link FrontendApiError} - */ -async function addFleetSegmentYearFromAPI(nextYear: number) { - try { - return await monitorfishApiKy.post(`/bff/v1/admin/fleet_segments/${nextYear}`) - } catch (err) { - throw new FrontendApiError(ADD_FLEET_SEGMENT_YEAR_ERROR_MESSAGE, (err as FrontendApiError).originalError) - } -} - -/** - * Get fleet segment year entries - * - * @throws {@link FrontendApiError} - */ -async function getFleetSegmentYearEntriesFromAPI(): Promise { - try { - return await monitorfishApiKy.get('/bff/v1/admin/fleet_segments/years').json() - } catch (err) { - throw new FrontendApiError(GET_FLEET_SEGMENT_YEAR_ENTRIES_ERROR_MESSAGE, (err as FrontendApiError).originalError) - } -} - -export { - deleteFleetSegmentFromAPI, - createFleetSegmentFromAPI, - getFleetSegmentYearEntriesFromAPI, - addFleetSegmentYearFromAPI -} diff --git a/frontend/src/features/FleetSegment/components/VesselCurrentFleetSegmentDetails/index.tsx b/frontend/src/features/FleetSegment/components/VesselCurrentFleetSegmentDetails/index.tsx index 4aa4955878..324ce1d754 100644 --- a/frontend/src/features/FleetSegment/components/VesselCurrentFleetSegmentDetails/index.tsx +++ b/frontend/src/features/FleetSegment/components/VesselCurrentFleetSegmentDetails/index.tsx @@ -55,7 +55,7 @@ function VesselCurrentFleetSegmentDetailsWithRef( value: gearsWithName?.length ? ( <> {gearsWithName?.map(gear => ( - + {gear.gearName} ({gear.gear}) ))} @@ -71,7 +71,7 @@ function VesselCurrentFleetSegmentDetailsWithRef( value: ( <> {gearsWithName?.map(gear => ( - + {gear.mesh ? <>{gear.mesh} mm : -} ({gear.gear}) ))} diff --git a/frontend/src/features/FleetSegment/useCases/addFleetSegmentYear.ts b/frontend/src/features/FleetSegment/useCases/addFleetSegmentYear.ts index c308087887..bc6f38f0d2 100644 --- a/frontend/src/features/FleetSegment/useCases/addFleetSegmentYear.ts +++ b/frontend/src/features/FleetSegment/useCases/addFleetSegmentYear.ts @@ -1,4 +1,4 @@ -import { addFleetSegmentYearFromAPI } from '@features/FleetSegment/apis' +import { fleetSegmentApi } from '@features/FleetSegment/apis' import { getFleetSegmentsYearEntries } from './getFleetSegmentsYearEntries' import { setError } from '../../../domain/shared_slices/Global' @@ -6,9 +6,14 @@ import { setError } from '../../../domain/shared_slices/Global' /** * Add a new fleet segment year */ -export const addFleetSegmentYear = (year: number) => dispatch => - addFleetSegmentYearFromAPI(year) - .then(() => dispatch(getFleetSegmentsYearEntries())) - .catch(error => { - dispatch(setError(error)) - }) +export const addFleetSegmentYear = (year: number) => async dispatch => { + try { + await dispatch(fleetSegmentApi.endpoints.addFleetSegmentYear.initiate(year)).unwrap() + + return dispatch(getFleetSegmentsYearEntries()) + } catch (error) { + dispatch(setError(error)) + + return undefined + } +} diff --git a/frontend/src/features/FleetSegment/useCases/createFleetSegment.ts b/frontend/src/features/FleetSegment/useCases/createFleetSegment.ts index 38b2a4f06f..6c98aa36d5 100644 --- a/frontend/src/features/FleetSegment/useCases/createFleetSegment.ts +++ b/frontend/src/features/FleetSegment/useCases/createFleetSegment.ts @@ -1,4 +1,4 @@ -import { createFleetSegmentFromAPI } from '@features/FleetSegment/apis' +import { fleetSegmentApi } from '@features/FleetSegment/apis' import { setError } from '../../../domain/shared_slices/Global' @@ -18,7 +18,7 @@ export const createFleetSegment = throw new Error("Le segment de flotte n'a pas d'année") } - const newSegment = await createFleetSegmentFromAPI(segmentFields) + const newSegment = await dispatch(fleetSegmentApi.endpoints.createFleetSegment.initiate(segmentFields)).unwrap() return addFleetSegments(previousFleetSegments, newSegment) } catch (error) { diff --git a/frontend/src/features/FleetSegment/useCases/deleteFleetSegment.ts b/frontend/src/features/FleetSegment/useCases/deleteFleetSegment.ts index 549e036b0f..5ac99d02f1 100644 --- a/frontend/src/features/FleetSegment/useCases/deleteFleetSegment.ts +++ b/frontend/src/features/FleetSegment/useCases/deleteFleetSegment.ts @@ -1,4 +1,4 @@ -import { deleteFleetSegmentFromAPI } from '@features/FleetSegment/apis' +import { fleetSegmentApi } from '@features/FleetSegment/apis' import { setError } from '../../../domain/shared_slices/Global' @@ -11,7 +11,9 @@ export const deleteFleetSegment = (segment: string, year: number) => async (dispatch): Promise => { try { - const updatedFleetSegments = await deleteFleetSegmentFromAPI(segment, year) + const updatedFleetSegments = await dispatch( + fleetSegmentApi.endpoints.deleteFleetSegment.initiate({ segment, year }) + ).unwrap() return (Object.assign([], updatedFleetSegments) as FleetSegment[]).sort((a, b) => a.segment.localeCompare(b.segment) diff --git a/frontend/src/features/FleetSegment/useCases/getFleetSegmentsYearEntries.ts b/frontend/src/features/FleetSegment/useCases/getFleetSegmentsYearEntries.ts index fd33380c8d..b0ccbabd8b 100644 --- a/frontend/src/features/FleetSegment/useCases/getFleetSegmentsYearEntries.ts +++ b/frontend/src/features/FleetSegment/useCases/getFleetSegmentsYearEntries.ts @@ -1,8 +1,16 @@ -import { getFleetSegmentYearEntriesFromAPI } from '@features/FleetSegment/apis' +import { RTK_FORCE_REFETCH_QUERY_OPTIONS } from '@api/constants' +import { fleetSegmentApi } from '@features/FleetSegment/apis' import { setError } from '../../../domain/shared_slices/Global' -export const getFleetSegmentsYearEntries = () => dispatch => - getFleetSegmentYearEntriesFromAPI().catch(error => { +export const getFleetSegmentsYearEntries = () => async dispatch => { + try { + return dispatch( + fleetSegmentApi.endpoints.getFleetSegmentYearEntries.initiate(undefined, RTK_FORCE_REFETCH_QUERY_OPTIONS) + ).unwrap() + } catch (error) { dispatch(setError(error)) - }) + + return undefined + } +} diff --git a/frontend/src/features/Mission/components/MissionForm/useCases/updateActionSpeciesOnboard.ts b/frontend/src/features/Mission/components/MissionForm/useCases/updateActionSpeciesOnboard.ts index 188a5dfb8c..57cef0f38c 100644 --- a/frontend/src/features/Mission/components/MissionForm/useCases/updateActionSpeciesOnboard.ts +++ b/frontend/src/features/Mission/components/MissionForm/useCases/updateActionSpeciesOnboard.ts @@ -26,7 +26,8 @@ export const updateActionSpeciesOnboard = const summedSpeciesOnboard = getSummedSpeciesOnBoard(speciesOnboard) const nextSpeciesOnboard = summedSpeciesOnboard - .sort((a, b) => b.weight - a.weight) + .filter(specy => !!specy.weight) + .sort((a, b) => (b.weight as number) - (a.weight as number)) .map(specy => ({ controlledWeight: undefined, declaredWeight: specy.weight, diff --git a/frontend/src/features/Vessel/Vessel.types.ts b/frontend/src/features/Vessel/Vessel.types.ts index a13fd2b401..0e28b25288 100644 --- a/frontend/src/features/Vessel/Vessel.types.ts +++ b/frontend/src/features/Vessel/Vessel.types.ts @@ -151,7 +151,7 @@ export namespace Vessel { faoZone: z.string(), gear: z.string(), species: z.string(), - weight: z.number() + weight: numberOrUndefined }) export type DeclaredLogbookSpecies = z.infer