Skip to content

Commit 4416114

Browse files
committed
feat(emergency): use new endpoint
1 parent 1469c60 commit 4416114

16 files changed

Lines changed: 578 additions & 520 deletions

File tree

app/src/components/EventTimeline/index.tsx

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -69,10 +69,12 @@ function EventTimeline(props: Props) {
6969
);
7070
}
7171

72+
const numEvents = timelineRenderEvents.length;
73+
7274
return (
7375
<div className={styles.eventTimeline}>
7476
<div className={styles.eventsContainer}>
75-
{timelineRenderEvents.map((event) => {
77+
{timelineRenderEvents.map((event, i) => {
7678
if (event.data.isMarker) {
7779
return (
7880
<div
@@ -91,7 +93,7 @@ function EventTimeline(props: Props) {
9193
<div
9294
key={event.data.key}
9395
className={styles.event}
94-
style={{ left: `${event.relativePosition}%` }}
96+
style={{ left: `min(${100 - 40 * ((numEvents - i) / numEvents)}%, max(${40 * (i / numEvents)}%, ${event.relativePosition}%))` }}
9597
>
9698
<div className={styles.border}>
9799
<div className={styles.highlight} />
@@ -100,7 +102,7 @@ function EventTimeline(props: Props) {
100102
className={styles.content}
101103
layout="block"
102104
withSpacingOpticalCorrection
103-
spacing="2xs"
105+
spacing="xs"
104106
withPadding
105107
>
106108
<DateOutput

app/src/components/EventTimeline/styles.module.css

Lines changed: 7 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
.event-timeline {
22
--event-height: 12rem;
3-
--event-width: 14rem;
3+
--event-width: 10rem;
44

55
position: relative;
66

@@ -12,6 +12,7 @@
1212
width: calc(100% - var(--event-width));
1313
height: calc(2 * var(--event-height));
1414
isolation: isolate;
15+
line-height: 1;
1516

1617
.event {
1718
--event-border-width: var(--go-ui-width-separator-md);
@@ -71,19 +72,16 @@
7172

7273
.content {
7374
width: 100%;
74-
}
75-
76-
&:hover {
77-
z-index: 1;
78-
background-color: unset;
7975

80-
/*
81-
.content {
76+
&:hover {
8277
border-radius: var(--go-ui-border-radius-md);
8378
box-shadow: var(--go-ui-box-shadow-sm);
8479
background-color: rgba(255, 255, 255, .8);
8580
}
86-
*/
81+
}
82+
83+
&:has(.content:hover) {
84+
z-index: 1;
8785
}
8886
}
8987

app/src/utils/domain/emergency.ts

Lines changed: 45 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,25 @@
11
import { sumSafe } from '@ifrc-go/ui/utils';
22
import {
3-
compareDate,
3+
isDefined,
44
isNotDefined,
55
max,
66
} from '@togglecorp/fujs';
77

8+
import { type components } from '#generated/types';
9+
import { DREF_TYPE_IMMINENT } from '#utils/constants';
810
import { type GoApiResponse } from '#utils/restRequest';
911

1012
type EventResponse = GoApiResponse<'/api/v2/event/'>;
1113
type EventListItem = NonNullable<EventResponse['results']>[number];
1214

15+
type EmergencyStage = components['schemas']['ApiEmergencyStageEnumKey'];
16+
export const STAGE_EMERGENCY_APPEAL = 1 satisfies EmergencyStage;
17+
export const STAGE_DREF_APPLICATION = 2 satisfies EmergencyStage;
18+
export const STAGE_OPERATIONAL_UPDATE = 3 satisfies EmergencyStage;
19+
export const STAGE_FINAL_REPORT = 4 satisfies EmergencyStage;
20+
export const STAGE_FIELD_REPORT = 5 satisfies EmergencyStage;
21+
export const STAGE_DREF_APPEAL_ONLY = 6 satisfies EmergencyStage;
22+
1323
export function getNumAffected(event: EventListItem) {
1424
const latestFieldReport = max(
1525
event.field_reports,
@@ -22,67 +32,46 @@ export function getNumAffected(event: EventListItem) {
2232
]);
2333
}
2434

25-
type EventItem = GoApiResponse<'/api/v2/event/{id}'>;
26-
type FieldReport = EventItem['field_reports'][number];
27-
type Appeal = EventItem['appeals'][number];
35+
type EmergencyDetail = GoApiResponse<'/api/v2/emergency/{id}/'>;
2836

29-
export function getLatestAppeal(appeals: Appeal[] | undefined) {
30-
if (isNotDefined(appeals) || appeals.length === 0) {
37+
export function getEmergencyMeta(emergency: EmergencyDetail | undefined) {
38+
if (isNotDefined(emergency)) {
3139
return undefined;
3240
}
3341

34-
// FIXME(frozenhelium): verify if this is the desired outcome
35-
return appeals.toSorted(
36-
(a, b) => compareDate(a.start_date, b.start_date),
37-
)[0];
38-
}
42+
const {
43+
disaster_start_date,
44+
appeal,
45+
dref,
46+
stage,
47+
} = emergency;
3948

40-
function getFieldReport(
41-
reports: FieldReport[] | undefined,
42-
compareFunction: (
43-
a?: string,
44-
b?: string,
45-
direction?: number
46-
) => number,
47-
direction?: number,
48-
): FieldReport | undefined {
49-
if (isNotDefined(reports) || reports.length === 0) {
50-
return undefined;
51-
}
49+
const amountRequested = stage === STAGE_DREF_APPLICATION
50+
&& dref.type_of_dref === DREF_TYPE_IMMINENT
51+
? dref?.total_cost
52+
: dref?.amount_requested ?? appeal?.amount_requested ?? dref?.total_cost;
5253

53-
// FIXME: use max function
54-
return reports.reduce((
55-
selectedReport: FieldReport | undefined,
56-
currentReport: FieldReport | undefined,
57-
) => {
58-
if (isNotDefined(selectedReport)
59-
|| compareFunction(
60-
currentReport?.report_date ?? currentReport?.created_at,
61-
selectedReport.report_date ?? selectedReport.created_at,
62-
direction,
63-
) > 0) {
64-
return currentReport;
65-
}
66-
return selectedReport;
67-
}, undefined);
68-
}
54+
const drefPlannedBudget = sumSafe(
55+
dref?.planned_interventions?.map(({ budget }) => budget).filter(isDefined),
56+
) ?? dref?.total_cost;
6957

70-
export function getLatestFieldReport(
71-
reports: FieldReport[] | undefined,
72-
): FieldReport | undefined {
73-
return getFieldReport(
74-
reports,
75-
compareDate,
76-
1,
77-
);
78-
}
58+
const amountFunded = drefPlannedBudget ?? appeal?.amount_funded;
7959

80-
export function getFirstFieldReport(
81-
reports: FieldReport[] | undefined,
82-
): FieldReport | undefined {
83-
return getFieldReport(
84-
reports,
85-
compareDate,
86-
-1,
87-
);
60+
const startDate = dref?.final_report_details?.operation_start_date
61+
?? dref?.operational_update_details?.new_operational_start_date
62+
?? dref?.date_of_approval
63+
?? appeal?.start_date
64+
?? disaster_start_date;
65+
66+
const endDate = dref?.final_report_details?.operation_end_date
67+
?? dref?.operational_update_details?.new_operational_end_date
68+
?? dref?.end_date
69+
?? appeal?.end_date;
70+
71+
return {
72+
startDate,
73+
endDate,
74+
amountFunded,
75+
amountRequested,
76+
};
8877
}

app/src/utils/outletContext.ts

Lines changed: 1 addition & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import type { GoApiResponse } from '#utils/restRequest';
22

33
// FIXME: move this to context
44

5-
type EmergencyResponse = GoApiResponse<'/api/v2/event/{id}/'>;
5+
type EmergencyResponse = GoApiResponse<'/api/v2/emergency/{id}/'>;
66

77
type EmergencySnippetsResponse = GoApiResponse<'/api/v2/event_snippet/'>;
88
type Snippets = EmergencySnippetsResponse['results'];
@@ -15,21 +15,10 @@ interface EmergencyAdditionalTabs {
1515
snippets: Snippets;
1616
}
1717

18-
type DrefApplicationResponse = GoApiResponse<'/api/v2/dref/{id}/'>
19-
type DrefOpsUpdateResponse = GoApiResponse<'/api/v2/dref-op-update/{id}/'>
20-
type DrefFinalReportResponse = GoApiResponse<'/api/v2/dref-final-report/{id}/'>
21-
type ActiveDrefResponse = GoApiResponse<'/api/v2/active-dref/'>['results'][number];
22-
2318
export interface EmergencyOutletContext {
2419
emergencyResponse: EmergencyResponse | undefined;
2520
emergencyResponsePending: boolean;
2621
emergencyAdditionalTabs: EmergencyAdditionalTabs[] | undefined;
27-
emergencyStage: 'field-report' | 'dref' | 'emergency-appeal' | undefined;
28-
activeDrefOperation: ActiveDrefResponse | undefined;
29-
drefStage: 'application' | 'ops-update' | 'final-report' | undefined;
30-
drefApplication: DrefApplicationResponse | undefined;
31-
drefOpsUpdate: DrefOpsUpdateResponse | undefined;
32-
drefFinalReport: DrefFinalReportResponse | undefined;
3322
}
3423

3524
export type CountryResponse = GoApiResponse<'/api/v2/country/{id}/'>

app/src/views/AllAppeals/index.tsx

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -137,6 +137,12 @@ export function Component() {
137137
(country) => country,
138138
);
139139

140+
const [filterHasEvent] = useUrlSearchState<boolean | undefined>(
141+
'has_event',
142+
(value) => value?.toLowerCase() === 'true',
143+
(value) => (value ? String(value) : undefined),
144+
);
145+
140146
const defaultOrdering = '-start_date';
141147
const orderingWithFallback = useMemo(() => {
142148
if (isNotDefined(ordering)) {
@@ -166,8 +172,11 @@ export function Component() {
166172
region: isDefined(filterRegion) ? [filterRegion] : undefined,
167173
start_date__gte: filter.startDateAfter,
168174
start_date__lte: filter.startDateBefore,
175+
has_event: filterHasEvent,
176+
needs_confirmation: filterHasEvent ? false : undefined,
169177
}),
170178
[
179+
filterHasEvent,
171180
limit,
172181
offset,
173182
orderingWithFallback,

app/src/views/Emergency/i18n.json

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,10 +12,6 @@
1212
"emergencyTabSurge":"Surge",
1313
"emergencyPeopleTargetedLabel":"Targeted Population",
1414
"emergencyFundingRequirementsLabel":"Funding Requirements (CHF)",
15-
"operationLabelImminentDref": "Imminent DREF",
16-
"operationLabelDref": "DREF Operation",
17-
"operationLabelOpsUpdate": "DREF Operation Update",
18-
"operationLabelFinalReport": "DREF Final Report",
1915
"operationTimelineLabel": "Operation Timeline",
2016
"home": "Home",
2117
"emergencies": "Emergencies",

0 commit comments

Comments
 (0)