Skip to content

Commit

Permalink
Merge branch 'staging' of github.com:UNICEFECAR/USupport-provider-ui
Browse files Browse the repository at this point in the history
  • Loading branch information
vasilen-7DIGIT committed Sep 24, 2024
2 parents 0c82575 + 7d22eb4 commit 456b0ce
Show file tree
Hide file tree
Showing 8 changed files with 158 additions and 40 deletions.
3 changes: 2 additions & 1 deletion src/blocks/ProviderOverview/locales/en.json
Original file line number Diff line number Diff line change
Expand Up @@ -51,5 +51,6 @@
"social_skills": "Social Skills and Friendship",
"body_image": "Body Image and Self-Esteem",

"hour_consultation": "for 1 hour consultation"
"hour_consultation": "for 1 hour consultation",
"organizations_label": "Organizations"
}
3 changes: 2 additions & 1 deletion src/blocks/ProviderOverview/locales/kk.json
Original file line number Diff line number Diff line change
Expand Up @@ -51,5 +51,6 @@
"social_skills": "Әлеуметтік дағдылар және достық",
"body_image": "Өзін-өзі бағалау және келбет бейнесі",

"hour_consultation": "1 сағаттық консультация үшін"
"hour_consultation": "1 сағаттық консультация үшін",
"organizations_label": "Ұйымдар"
}
5 changes: 3 additions & 2 deletions src/blocks/ProviderOverview/locales/pl.json
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,7 @@
"love": "Miłość i relacje romantyczne",
"social_skills": "Umiejętności społeczne i przyjaźń",
"body_image": "Obraz ciała i poczucie własnej wartości",

"hour_consultation": "za 1 godzinę konsultacji"

"hour_consultation": "za 1 godzinę konsultacji",
"organizations_label": "Organizacje"
}
3 changes: 2 additions & 1 deletion src/blocks/ProviderOverview/locales/ru.json
Original file line number Diff line number Diff line change
Expand Up @@ -51,5 +51,6 @@
"social_skills": "Социальные навыки и дружба",
"body_image": "Самооценка и образ тела",

"hour_consultation": "за 1 часовую консультацию"
"hour_consultation": "за 1 часовую консультацию",
"organizations_label": "Организации"
}
5 changes: 3 additions & 2 deletions src/blocks/ProviderOverview/locales/uk.json
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,7 @@
"love": "Любовні та романтичні стосунки",
"social_skills": "Соціальні навички та дружба",
"body_image": "Образ тіла та самооцінка",

"hour_consultation": "за 1 годину консультації"

"hour_consultation": "за 1 годину консультації",
"organizations_label": "Організації"
}
172 changes: 140 additions & 32 deletions src/blocks/Scheduler/Scheduler.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,7 @@ export const Scheduler = ({ openJoinConsultation, openCancelConsultation }) => {

const providerQuery = useGetProviderData()[0];
const providerStatus = providerQuery?.data?.status;
const organizations = providerQuery?.data?.organizations;

const { first: startDate, last: endDate } = getStartAndEndOfWeek(today);
const days = getDatesInRange(new Date(startDate), new Date(endDate));
Expand All @@ -71,6 +72,7 @@ export const Scheduler = ({ openJoinConsultation, openCancelConsultation }) => {
const [slotsData, setSlots] = useState({
slots: [],
campaignSlots: [],
organizationSlots: [],
});
const [consultations, setConsultations] = useState();
const [validCampaigns, setValidCampaigns] = useState();
Expand Down Expand Up @@ -102,13 +104,18 @@ export const Scheduler = ({ openJoinConsultation, openCancelConsultation }) => {

const today = new Date().getTime();
const campaigns = data.campaigns_data?.filter((x) => {
return new Date(x.campaignEndDate).getTime() >= today;
return new Date(x.campaignEndDate).getTime() >= today && x.active;
});

setValidCampaigns(campaigns);

setSlots({
slots: data.slots,
organizationSlots: [
...data.organization_slots.map((x) => ({
time: parseUTCDate(x.time),
organizationId: x.organization_id,
})),
],
campaignSlots: [
...data.campaign_slots.map((x) => ({
time: parseUTCDate(x.time),
Expand Down Expand Up @@ -138,12 +145,22 @@ export const Scheduler = ({ openJoinConsultation, openCancelConsultation }) => {
);

// Add available slot mutation
const addAvailableSlot = async ({ startDate, timestampSlot, campaignId }) => {
await providerSvc.addAvailableSlot(startDate, timestampSlot, campaignId);
const addAvailableSlot = async ({
startDate,
timestampSlot,
campaignId,
organizationId,
}) => {
await providerSvc.addAvailableSlot(
startDate,
timestampSlot,
campaignId,
organizationId
);
return timestampSlot;
};
const addAvailableSlotMutation = useMutation(addAvailableSlot, {
onMutate: ({ timestampSlot, campaignId }) => {
onMutate: ({ timestampSlot, campaignId, organizationId }) => {
const newSlot = new Date(timestampSlot * 1000).toISOString();
if (campaignId) {
setSlots({
Expand All @@ -152,18 +169,30 @@ export const Scheduler = ({ openJoinConsultation, openCancelConsultation }) => {
...slotsData.campaignSlots,
{ campaignId, time: newSlot },
],
organizationSlots: [...slotsData.organizationSlots],
});
} else if (organizationId) {
setSlots({
slots: [...slotsData.slots],
campaignSlots: [...slotsData.campaignSlots],
organizationSlots: [
...slotsData.organizationSlots,
{ organizationId, time: newSlot },
],
});
} else {
setSlots({
slots: [...slotsData.slots, newSlot],
campaignSlots: [...slotsData.campaignSlots],
organizationSlots: [...slotsData.organizationSlots],
});
}

return () => {
setSlots({
slots: slotsData.slots.filter((slot) => slot !== newSlot),
campaignSlots: [...slotsData.campaignSlots],
organizationSlots: [...slotsData.organizationSlots],
});
};
},
Expand All @@ -183,25 +212,40 @@ export const Scheduler = ({ openJoinConsultation, openCancelConsultation }) => {
startDate,
timestampSlot,
campaignId,
organizationId,
}) => {
await providerSvc.removeAvailableSlot(startDate, timestampSlot, campaignId);
await providerSvc.removeAvailableSlot(
startDate,
timestampSlot,
campaignId,
organizationId
);
return timestampSlot;
};
const removeAvailableSlotMutation = useMutation(removeAvailableSlot, {
onMutate: ({ timestampSlot, campaignId }) => {
onMutate: ({ timestampSlot, campaignId, organizationId }) => {
const newSlot = new Date(timestampSlot * 1000).toISOString();
if (!campaignId) {
if (campaignId) {
setSlots({
slots: slotsData.slots.filter((slot) => slot !== newSlot),
slots: [...slotsData.slots],
campaignSlots: slotsData.campaignSlots.filter(
(slot) => slot.time.toISOString() !== newSlot
),
organizationSlots: [...slotsData.organizationSlots],
});
} else if (organizationId) {
setSlots({
slots: [...slotsData.slots],
campaignSlots: [...slotsData.campaignSlots],
organizationSlots: slotsData.organizationSlots.filter(
(x) => x.time.toISOString() !== newSlot
),
});
} else {
setSlots({
slots: [...slotsData.slots],
campaignSlots: [
...slotsData.campaignSlots,
{ campaignId, time: newSlot },
],
slots: slotsData.slots.filter((slot) => slot !== newSlot),
campaignSlots: [...slotsData.campaignSlots],
organizationSlots: [...slotsData.organizationSlots],
});
}
},
Expand All @@ -218,21 +262,30 @@ export const Scheduler = ({ openJoinConsultation, openCancelConsultation }) => {
startDate,
slot,
campaignIds,
organizationId,
}) => {
await providerSvc.removeMultipleAvailableSlots(
startDate,
slot,
campaignIds
campaignIds,
organizationId
);
return true;
};

const removeMultipleAvailableSlotsMutation = useMutation(
removeMultipleAvailableSlots,
{
onMutate: ({ slot, campaignIds }) => {
onMutate: ({ slot, campaignIds, organizationId }) => {
const slotToRemove = new Date(slot * 1000).toISOString();
const oldSlots = { ...slotsData };

const newOrganizationSlots = organizationId
? slotsData.organizationSlots.filter(
(x) => x.time.toISOString() !== slotToRemove
)
: slotsData.organizationSlots;

setSlots({
slots: slotsData.slots.filter((slot) => slot !== slotToRemove),
campaignSlots: slotsData.campaignSlots.filter((slot) => {
Expand All @@ -244,6 +297,7 @@ export const Scheduler = ({ openJoinConsultation, openCancelConsultation }) => {
}
return true;
}),
organizationSlots: [...newOrganizationSlots],
});
return () => {
setSlots(oldSlots);
Expand Down Expand Up @@ -277,8 +331,18 @@ export const Scheduler = ({ openJoinConsultation, openCancelConsultation }) => {
);
return isSlotCampaignActive;
});

const organizationSlots = slotsData.organizationSlots.filter((slot) => {
const dateStr = new Date(slot.time).toString();
return dateStr === date;
});
const organizationSlot = organizationSlots[0];
const hasNormalSlot = !!slot;

if (campaignSlot && organizationSlot) {
return { campaignSlot, hasNormalSlot, organizationSlot };
}
if (organizationSlot) return { organizationSlot, hasNormalSlot };
if (campaignSlot) return { campaignSlot, hasNormalSlot };
return { slot, hasNormalSlot };
};
Expand Down Expand Up @@ -306,7 +370,13 @@ export const Scheduler = ({ openJoinConsultation, openCancelConsultation }) => {
};
};

const handleToggleAvailable = async (date, hour, newStatus, campaignId) => {
const handleToggleAvailable = async (
date,
hour,
newStatus,
campaignId,
organizationId
) => {
if (providerStatus === "inactive") {
toast(t("provider_inactive"), { type: "error" });
return;
Expand Down Expand Up @@ -337,30 +407,43 @@ export const Scheduler = ({ openJoinConsultation, openCancelConsultation }) => {
startDate = timestampPreviousWeekEndDate;
}
if (newStatus === "available") {
addAvailableSlotMutation.mutate({ startDate, timestampSlot, campaignId });
addAvailableSlotMutation.mutate({
startDate,
timestampSlot,
campaignId,
organizationId,
});
} else {
if (Array.isArray(campaignId)) {
removeMultipleAvailableSlotsMutation.mutate({
startDate,
slot: timestampSlot,
campaignIds: campaignId,
organizationId,
});
} else {
removeAvailableSlotMutation.mutate({
startDate,
timestampSlot,
campaignId,
organizationId,
});
}
}
};

const handleSetAvailable = (date, hour, campaignId) => {
handleToggleAvailable(date, hour, "available", campaignId);
const handleSetAvailable = (date, hour, campaignId, organizationId) => {
handleToggleAvailable(date, hour, "available", campaignId, organizationId);
};

const handleSetUnavailable = (date, hour, campaignId) => {
handleToggleAvailable(date, hour, "unavailable", campaignId);
const handleSetUnavailable = (date, hour, campaignId, organizationId) => {
handleToggleAvailable(
date,
hour,
"unavailable",
campaignId,
organizationId
);
};

const handleCancelConsultation = (consultation) => {
Expand Down Expand Up @@ -474,19 +557,46 @@ export const Scheduler = ({ openJoinConsultation, openCancelConsultation }) => {
const slotDate = getDateAsFullString(day, hour);
const isAvailable = checkIsAvailable(slotDate);
const campaignId = isAvailable.campaignSlot?.campaignId;
const organizationId =
isAvailable.organizationSlot?.organizationId;

const organizationForSlot =
organizations?.find(
(x) => x.organizationId === organizationId
) || null;

return (
<ProviderAvailability
key={"slot" + day.toString() + dayIndex.toString()}
isAvailable={
campaignId ? "campaign" : !!isAvailable.slot
campaignId
? "campaign"
: organizationId
? "organization"
: !!isAvailable.slot
}
hasNormalSlot={isAvailable.hasNormalSlot}
handleSetUnavailable={(campaignId) => {
handleSetUnavailable(day, hour, campaignId);
handleSetUnavailable={({
campaignId,
organizationId,
}) => {
handleSetUnavailable(
day,
hour,
campaignId,
organizationId
);
}}
handleSetAvailable={(campaignId) => {
handleSetAvailable(day, hour, campaignId);
handleSetAvailable={({
campaignId,
organizationId,
}) => {
handleSetAvailable(
day,
hour,
campaignId,
organizationId
);
}}
handleCancelConsultation={handleCancelConsultation}
handleViewProfile={handleViewProfile}
Expand All @@ -508,9 +618,9 @@ export const Scheduler = ({ openJoinConsultation, openCancelConsultation }) => {
})
: []
}
validCampaigns={validCampaigns?.filter(
(x) => x.active
)}
validCampaigns={validCampaigns}
organizations={organizations}
organizationForSlot={organizationForSlot}
dayIndex={dayIndex}
slot={slotDate}
t={t}
Expand All @@ -520,8 +630,6 @@ export const Scheduler = ({ openJoinConsultation, openCancelConsultation }) => {
</React.Fragment>
);
})}
{/* </Grid> */}
{/* </GridItem> */}
</Grid>
</>
)}
Expand Down
Loading

0 comments on commit 456b0ce

Please sign in to comment.