Skip to content

Commit

Permalink
#17: Calls API to edit entity fields
Browse files Browse the repository at this point in the history
  • Loading branch information
williamquintas authored and arthursimas1 committed Jun 1, 2023
1 parent 08c71b7 commit 4928666
Show file tree
Hide file tree
Showing 4 changed files with 74 additions and 53 deletions.
22 changes: 15 additions & 7 deletions components/CoordinatesList/CoordinatesList.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,10 @@ import {
Typography,
} from "@mui/material";
import { Fragment, FunctionComponent, useEffect, useState } from "react";
import { useAppDispatch, useAppSelector } from "../../config/hooks";
import { selectSession } from "../../features/sessions/slice";
import { IEntity } from "../../models/IEntity";
import SessionService from "../../services/SessionService";
import EntityDialog from "../EntityDialog/EntityDialog";

interface CoordinatesListProps {
Expand All @@ -23,12 +26,19 @@ const CoordinatesList: FunctionComponent<CoordinatesListProps> = ({
const [isCollapseOpen, setIsCollapseOpen] = useState<boolean>(false);
const [isDialogOpen, setIsDialogOpen] = useState<boolean>(false);
const { coordinates } = entity;
const session = useAppSelector(selectSession);
const dispatch = useAppDispatch();

useEffect(() => {
setLabel(entity.id);
setLabel(entity.label);
setColor(entity.color);
}, [entity]);

const saveEntity = async (entityData: IEntity) => {
await SessionService.editEntity(session.id, entityData);
setIsDialogOpen(false);
};

return (
<Fragment>
<div
Expand Down Expand Up @@ -87,12 +97,10 @@ const CoordinatesList: FunctionComponent<CoordinatesListProps> = ({
</Container>
</Collapse>
<EntityDialog
open={isDialogOpen}
setOpen={setIsDialogOpen}
label={label}
setLabel={setLabel}
color={color}
setColor={setColor}
entity={entity}
isDialogOpen={isDialogOpen}
onCancel={() => setIsDialogOpen(false)}
onSave={saveEntity}
/>
</Fragment>
);
Expand Down
40 changes: 22 additions & 18 deletions components/DynamicModeContainer/DynamicModeContainer.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -11,11 +11,10 @@ import { grey } from "@mui/material/colors";
import { collection, doc, onSnapshot } from "firebase/firestore";
import { Fragment, FunctionComponent, useEffect, useState } from "react";
import { db } from "../../config/firebaseClient";
import { useAppDispatch, useAppSelector } from "../../config/hooks";
import { selectSession, updateEntities } from "../../features/sessions/slice";
import { useAppDispatch } from "../../config/hooks";
import { updateEntities } from "../../features/sessions/slice";
import { ICoordinatesData } from "../../models/ICoordinatesData";
import { IEntity } from "../../models/IEntity";
import { getRandomColor } from "../../utils/colors";
import MapContainer from "../MapContainer/MapContainer";

interface DynamicModeContainerProps {
Expand All @@ -26,31 +25,36 @@ const DynamicModeContainer: FunctionComponent<DynamicModeContainerProps> = ({
sessionId,
}) => {
const dispatch = useAppDispatch();
const session = useAppSelector(selectSession);

const buildEntities = (coordinatesData: ICoordinatesData[]): IEntity[] => {
const entitiesIds = [...new Set(coordinatesData?.map(({ id }) => id))];
return entitiesIds.map((entityId) => ({
id: entityId,
label: entityId,
color: getRandomColor(),
coordinates: coordinatesData.filter(({ id }) => id === entityId),
const buildEntities = (
entitiesData: IEntity[],
coordinatesData: ICoordinatesData[]
): IEntity[] => {
const entitiesIds = [...new Set(entitiesData?.map(({ id }) => id))];
return entitiesData.map((entity) => ({
...entity,
coordinates: coordinatesData.filter(({ id }) => id === entity.id),
}));
};

useEffect(() => {
if (sessionId) {
const sessionRef = doc(db, "sessions", sessionId);
const coordinatesRef = collection(sessionRef, "coordinates");
const entitiesRef = collection(sessionRef, "entities");
let coordinatesData: ICoordinatesData[] = [];

const unsubscribe = onSnapshot(coordinatesRef, ({ docs }) => {
const coordinatesData = docs.map((doc) =>
doc.data()
) as ICoordinatesData[];

dispatch(updateEntities(buildEntities(coordinatesData)));
const unsubscribeCoordinates = onSnapshot(coordinatesRef, ({ docs }) => {
coordinatesData = docs.map((doc) => doc.data()) as ICoordinatesData[];
});
const unsubscribeEntities = onSnapshot(entitiesRef, ({ docs }) => {
const entitiesData = docs.map((doc) => doc.data()) as IEntity[];
dispatch(updateEntities(buildEntities(entitiesData, coordinatesData)));
});
return () => unsubscribe();
return () => {
unsubscribeCoordinates();
unsubscribeEntities();
};
}
}, [sessionId]);

Expand Down
45 changes: 17 additions & 28 deletions components/EntityDialog/EntityDialog.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -6,50 +6,37 @@ import DialogContent from "@mui/material/DialogContent";
import DialogTitle from "@mui/material/DialogTitle";
import TextField from "@mui/material/TextField";
import { FunctionComponent, useEffect, useState } from "react";
import { IEntity } from "../../models/IEntity";
import ColorPicker from "../ColorPicker/ColorPicker";

interface EntityDialogProps {
open: boolean;
setOpen: (open: boolean) => void;
label: string;
setLabel: (label: string) => void;
color: string;
setColor: (color: string) => void;
entity: IEntity;
isDialogOpen: boolean;
onSave: (entity: IEntity) => void;
onCancel: () => void;
}
const EntityDialog: FunctionComponent<EntityDialogProps> = ({
open,
setOpen,
label,
setLabel,
color,
setColor,
entity,
isDialogOpen,
onSave,
onCancel,
}) => {
const { color, label } = entity;
const [currentColor, setCurrentColor] = useState<string>("");
const [currentLabel, setCurrentLabel] = useState<string>("");

useEffect(() => {
setCurrentColor(color);
setCurrentLabel(label);
}, [open]);

const handleSubmit = () => {
setColor(currentColor);
setLabel(currentLabel);
setOpen(false);
};
}, [isDialogOpen]);

return (
<div>
<Dialog open={open} onClose={() => setOpen(false)}>
<Dialog open={isDialogOpen} onClose={onCancel}>
<DialogTitle>Edit entity</DialogTitle>

<DialogContent>
<Box
component="form"
onSubmit={handleSubmit}
noValidate
sx={{ mt: 1 }}
>
<Box component="form" noValidate sx={{ mt: 1 }}>
<div
style={{
display: "flex",
Expand Down Expand Up @@ -77,7 +64,9 @@ const EntityDialog: FunctionComponent<EntityDialogProps> = ({
/>
</div>
<Button
onClick={handleSubmit}
onClick={() =>
onSave({ ...entity, label: currentLabel, color: currentColor })
}
type="button"
fullWidth
variant="contained"
Expand All @@ -87,7 +76,7 @@ const EntityDialog: FunctionComponent<EntityDialogProps> = ({
</Box>
</DialogContent>
<DialogActions>
<Button onClick={() => setOpen(false)}>Cancel</Button>
<Button onClick={onCancel}>Cancel</Button>
</DialogActions>
</Dialog>
</div>
Expand Down
20 changes: 20 additions & 0 deletions services/SessionService.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import axios from "axios";
import { IEntity } from "../models/IEntity";

const SessionService = {
create: async (): Promise<string> => {
Expand All @@ -14,6 +15,25 @@ const SessionService = {
return id;
}
},
editEntity: async (
sessionId: string,
entity: IEntity
): Promise<{ statusCode: number; message: string }> => {
const { id: entityId, coordinates, ...body } = entity;
const response = await axios.put(
`/api/session/${sessionId}/entity/${entityId}`,
{ id: entityId, ...body }
);
const { status, data } = response;

if (status != 200) {
const message = "Error while updating entity";
console.error(message);
throw new Error(message);
} else {
return data;
}
},
};

export default SessionService;

0 comments on commit 4928666

Please sign in to comment.