Skip to content

Commit

Permalink
[Mission] Résolution du souci avec le rafraichissement automatique (#…
Browse files Browse the repository at this point in the history
…1047)

## Related Pull Requests & Issues

- Resolve #950
  • Loading branch information
claire2212 authored Dec 8, 2023
2 parents 871e62d + 5a8d77b commit 942b9e0
Show file tree
Hide file tree
Showing 9 changed files with 133 additions and 159 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ context('Reporting', () => {

cy.viewport(1580, 1024)
cy.visit(`/`)
cy.wait(500)
})

it('A reporting can be created', () => {
Expand Down
13 changes: 4 additions & 9 deletions frontend/cypress/e2e/side_window/mission_form/main_form.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -266,8 +266,7 @@ context('Side Window > Mission Form > Main Form', () => {
// Changed field
openBy: 'LTH',
startDateTimeUtc: '2024-01-01T06:14:55.887549Z'
}),
name: 'MISSION_UPDATE'
})
})
)
})
Expand All @@ -293,15 +292,11 @@ context('Side Window > Mission Form > Main Form', () => {

cy.intercept('GET', `/bff/v1/missions?&startedAfterDateTime=*`).as('getMissions')

// TODO There seems to be an issue here with the dates. This should be investigated.
// The dummy data date doesn't match this period at all:
// https://github.com/MTES-MCT/monitorenv/blob/main/backend/src/main/resources/db/testdata/V666.5__insert_dummy_missions.sql#L20
// > '2022-01-12 14:00:08.588693', '2022-01-16 00:27:04.588693'
// Screenshot: https://pasteboard.co/skc3aRIYv6b7.png (highlighted mission at the bottom)
cy.fill('Période', 'Période spécifique')
const month = new Date().getMonth()
cy.fill('Période spécifique', [
[2023, 7, 13],
[2023, 7, 17]
[2023, month - 4, 1],
[2023, month - 4, 31]
])

cy.wait('@getMissions')
Expand Down
41 changes: 21 additions & 20 deletions frontend/src/domain/use_cases/missions/attachReportingFromMap.ts
Original file line number Diff line number Diff line change
Expand Up @@ -11,24 +11,25 @@ export const attachReportingFromMap = (id: number) => async (dispatch, getState)
return
}

const response = dispatch(reportingsAPI.endpoints.getReporting.initiate(id))
response
.then(result => {
if (!result.data) {
throw Error("Erreur à l'ajout du signalement")
}
dispatch(
attachReportingToMissionSliceActions.setAttachedReportings([
...attachedReportings,
{
...result.data,
missionId
}
])
)
response.unsubscribe()
})
.catch(error => {
dispatch(setToast({ containerId: 'sideWindow', message: error }))
})
try {
const reportingRequest = dispatch(reportingsAPI.endpoints.getReporting.initiate(id))
const reportingResponse = await reportingRequest.unwrap()
if (!reportingResponse) {
throw Error()
}

dispatch(
attachReportingToMissionSliceActions.setAttachedReportings([
...attachedReportings,
{
...reportingResponse,
missionId
}
])
)

await reportingRequest.unsubscribe()
} catch (error) {
dispatch(setToast({ containerId: 'sideWindow', message: "Erreur à l'ajout du signalement" }))
}
}
74 changes: 38 additions & 36 deletions frontend/src/domain/use_cases/missions/editMissionInLocalStore.ts
Original file line number Diff line number Diff line change
Expand Up @@ -15,51 +15,53 @@ export const editMissionInLocalStore = missionId => async (dispatch, getState) =
} = getState()

const missionToEdit = missionsAPI.endpoints.getMission
const response = dispatch(missionToEdit.initiate(missionId))

response
.then(async result => {
if (!result.data) {
throw Error('Erreur à la création ou à la modification de la mission')
}

const missions = [...selectedMissions]
// first we want to save the active mission in multiMissions state
if (missionState) {
const selectedMissionIndex = missions.findIndex(mission => mission.mission.id === missionState.id)
try {
const missionRequest = dispatch(missionToEdit.initiate(missionId))
const missionResponse = await missionRequest.unwrap()

const missionFormatted = {
isFormDirty,
mission: missionState
}
if (!missionResponse) {
throw Error()
}

if (selectedMissionIndex !== -1) {
missions[selectedMissionIndex] = missionFormatted
} else {
missions.push(missionFormatted)
}
}
const missions = [...selectedMissions]
// first we want to save the active mission in multiMissions state
if (missionState) {
const selectedMissionIndex = missions.findIndex(mission => mission.mission.id === missionState.id)

// now we want to save in multiMissions state the mission we want to edit
const missionToSave = result.data
const newSelectedMissionIndex = missions.findIndex(mission => mission.mission.id === missionToSave?.id)
const missionFormatted = {
isFormDirty: false,
mission: missionToSave
isFormDirty,
mission: missionState
}

if (newSelectedMissionIndex === -1) {
if (selectedMissionIndex !== -1) {
missions[selectedMissionIndex] = missionFormatted
} else {
missions.push(missionFormatted)
}
}

// now we want to save in multiMissions state the mission we want to edit
const missionToSave = missionResponse
const newSelectedMissionIndex = missions.findIndex(mission => mission.mission.id === missionToSave?.id)
const missionFormatted = {
isFormDirty: false,
mission: missionToSave
}

if (newSelectedMissionIndex === -1) {
missions.push(missionFormatted)
}

await dispatch(multiMissionsActions.setSelectedMissions(missions))
await dispatch(attachReportingToMissionSliceActions.setAttachedReportings(missionToSave.attachedReportings || []))
await dispatch(sideWindowActions.focusAndGoTo(generatePath(sideWindowPaths.MISSION, { id: missionId })))
await dispatch(multiMissionsActions.setSelectedMissions(missions))
await dispatch(attachReportingToMissionSliceActions.setAttachedReportings(missionToSave.attachedReportings || []))
await dispatch(sideWindowActions.focusAndGoTo(generatePath(sideWindowPaths.MISSION, { id: missionId })))

response.unsubscribe()
})
.catch(error => {
removeMissionListener(missionId)
dispatch(setToast({ containerId: 'sideWindow', message: error }))
})
await missionRequest.unsubscribe()
} catch (error) {
removeMissionListener(missionId)
dispatch(
setToast({ containerId: 'sideWindow', message: 'Erreur à la création ou à la modification de la mission' })
)
}
}
23 changes: 11 additions & 12 deletions frontend/src/domain/use_cases/reporting/attachMission.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,18 +9,17 @@ export const attachMission = (id: number) => async (dispatch, getState) => {
return
}

const response = dispatch(missionsAPI.endpoints.getMission.initiate(id))
try {
const missionRequest = dispatch(missionsAPI.endpoints.getMission.initiate(id))
const missionResponse = await missionRequest.unwrap()
if (!missionResponse) {
throw Error()
}

response
.then(async result => {
if (!result.data) {
throw Error("Erreur à l'ajout du signalement")
}
await dispatch(attachMissionToReportingSliceActions.setAttachedMission(result.data))
await dispatch(attachMissionToReportingSliceActions.setAttachedMission(missionResponse))

response.unsubscribe()
})
.catch(error => {
dispatch(setToast({ containerId: 'sideWindow', message: error }))
})
await missionRequest.unsubscribe()
} catch (error) {
dispatch(setToast({ containerId: 'sideWindow', message: "Erreur à l'ajout du signalement" }))
}
}
70 changes: 35 additions & 35 deletions frontend/src/domain/use_cases/reporting/duplicateReporting.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,39 +9,39 @@ export const duplicateReporting = (reportingId: number) => async (dispatch, getS

const reportingToDuplicate = reportingsAPI.endpoints.getReporting

const response = dispatch(reportingToDuplicate.initiate(reportingId))
response
.then(async result => {
if (result.data) {
const id = createIdForNewReporting(reportings)

const duplicatedReporting = {
context: ReportingContext.SIDE_WINDOW,
isFormDirty: false,
reporting: getReportingInitialValues({ ...result.data, createdAt: new Date().toISOString(), id })
}

await dispatch(reportingActions.setReporting(duplicatedReporting))
await dispatch(reportingActions.setActiveReportingId(id))

await dispatch(
attachMissionToReportingSliceActions.setAttachedMission(
duplicatedReporting.reporting.attachedMission ?? undefined
)
)

await dispatch(
setReportingFormVisibility({
context: ReportingContext.SIDE_WINDOW,
visibility: VisibilityState.VISIBLE
})
)
response.unsubscribe()
} else {
throw Error('Erreur à la duplication du signalement')
}
})
.catch(error => {
dispatch(setToast({ containerId: 'sideWindow', message: error }))
})
try {
const reportingRequest = dispatch(reportingToDuplicate.initiate(reportingId))
const reportingResponse = await reportingRequest.unwrap()

if (!reportingResponse) {
throw Error()
}

const id = createIdForNewReporting(reportings)

const duplicatedReporting = {
context: ReportingContext.SIDE_WINDOW,
isFormDirty: false,
reporting: getReportingInitialValues({ ...reportingResponse, createdAt: new Date().toISOString(), id })
}

await dispatch(reportingActions.setReporting(duplicatedReporting))
await dispatch(reportingActions.setActiveReportingId(id))

await dispatch(
attachMissionToReportingSliceActions.setAttachedMission(
duplicatedReporting.reporting.attachedMission ?? undefined
)
)

await dispatch(
setReportingFormVisibility({
context: ReportingContext.SIDE_WINDOW,
visibility: VisibilityState.VISIBLE
})
)
await reportingRequest.unsubscribe()
} catch (error) {
dispatch(setToast({ containerId: 'sideWindow', message: 'Erreur à la duplication du signalement' }))
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -18,27 +18,26 @@ export const editReportingInLocalStore =
setReporting(dispatch, reportingId, reportingContext, newReporting)
} else {
// if the reporting not already in reporting state
const response = dispatch(reportingToEdit.initiate(reportingId))
response
.then(result => {
if (result.data) {
const reportingToSave = result.data

const newReporting = {
context: reportingContext,
isFormDirty: false,
reporting: reportingToSave
}
response.unsubscribe()

setReporting(dispatch, reportingId, reportingContext, newReporting)
} else {
throw Error('Erreur à la récupération du signalement')
}
})
.catch(error => {
dispatch(setToast({ message: error }))
})
try {
const reportingRequest = dispatch(reportingToEdit.initiate(reportingId))
const reportingResponse = await reportingRequest.unwrap()
if (!reportingResponse) {
throw Error()
}

const reportingToSave = reportingResponse

const newReporting = {
context: reportingContext,
isFormDirty: false,
reporting: reportingToSave
}

setReporting(dispatch, reportingId, reportingContext, newReporting)
await reportingRequest.unsubscribe()
} catch (error) {
dispatch(setToast({ message: 'Erreur à la récupération du signalement' }))
}
}
}

Expand Down
14 changes: 3 additions & 11 deletions frontend/src/features/missions/MissionForm/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -6,9 +6,8 @@ import styled from 'styled-components'

import { MissionForm } from './MissionForm'
import { MissionSchema } from './Schemas'
import { useGetMissionState } from '../../../api/missionsAPI'
import { useGetMissionQuery } from '../../../api/missionsAPI'
import { useAppSelector } from '../../../hooks/useAppSelector'
import { usePreviousNotNull } from '../../../hooks/usePreviousNotNull'
import { getIdTyped } from '../../../utils/getIdTyped'
import { isNewMission } from '../../../utils/isNewMission'
import { getMissionPageRoute } from '../../../utils/routes'
Expand All @@ -24,10 +23,9 @@ export function Mission() {
const missionId = useMemo(() => getIdTyped(routeParams?.params?.id), [routeParams?.params?.id])
const missionIsNewMission = useMemo(() => isNewMission(routeParams?.params?.id), [routeParams?.params?.id])

const { data: missionToEdit, isLoading } = useGetMissionState(
const { data: missionToEdit, isLoading } = useGetMissionQuery(
!missionIsNewMission && missionId ? Number(missionId) : skipToken
)
const previousMissionToEdit = usePreviousNotNull(missionToEdit)

const selectedMission = useMemo(
() => selectedMissions.find(mis => mis.mission.id === missionId),
Expand All @@ -39,14 +37,8 @@ export function Mission() {
return missionFactory(undefined, missionId)
}

// The RTK-Query cache has been invalidated so `missionToEdit` is set as `undefined`
// We must save the previous non-undefined value in memory
if (previousMissionToEdit && !missionToEdit) {
return missionFactory(previousMissionToEdit)
}

return missionFactory(missionToEdit)
}, [missionId, missionIsNewMission, missionToEdit, previousMissionToEdit])
}, [missionId, missionIsNewMission, missionToEdit])

if (isLoading) {
return <div>Chargement en cours</div>
Expand Down
15 changes: 0 additions & 15 deletions frontend/src/hooks/usePreviousNotNull.ts

This file was deleted.

0 comments on commit 942b9e0

Please sign in to comment.