Skip to content

Commit 03b8939

Browse files
author
Lauren Pothuru
committed
Implement folder editing
1 parent 23f0656 commit 03b8939

File tree

1 file changed

+92
-5
lines changed

1 file changed

+92
-5
lines changed

frontend/src/pages/FolderDetailPage.tsx

Lines changed: 92 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -8,12 +8,18 @@ import {
88
Box,
99
IconButton,
1010
CircularProgress,
11+
Dialog,
12+
DialogTitle,
13+
DialogContent,
14+
DialogActions,
15+
Checkbox,
16+
FormGroup,
1117
} from '@material-ui/core';
1218
import { ArrowBack as ArrowBackIcon } from '@material-ui/icons';
1319
import Toast from '../components/utils/Toast';
1420
import { colors } from '../colors';
1521
import axios from 'axios';
16-
import { createAuthHeaders, getUser } from '../utils/firebase';
22+
import { createAuthHeaders } from '../utils/firebase';
1723
import ApartmentCards from '../components/ApartmentCard/SearchResultsPageApartmentCards';
1824
import { CardData } from '../App';
1925

@@ -81,6 +87,8 @@ const FolderDetailPage = ({ user, setUser }: Props): ReactElement => {
8187
const [loading, setLoading] = useState<boolean>(true);
8288
const [showErrorToast, setShowErrorToast] = useState<boolean>(false);
8389
const [errorMessage, setErrorMessage] = useState<string>('');
90+
const [apartmentIdsToRemove, setApartmentIdsToRemove] = useState<string[]>([]);
91+
const [showRemoveApartmentModal, setShowRemoveApartmentModal] = useState<boolean>(false);
8492

8593
const showToast = (setState: (value: React.SetStateAction<boolean>) => void) => {
8694
setState(true);
@@ -101,10 +109,6 @@ const FolderDetailPage = ({ user, setUser }: Props): ReactElement => {
101109
const fetchFolderDetails = async () => {
102110
try {
103111
setLoading(true);
104-
if (!user) {
105-
let user = await getUser(true);
106-
setUser(user);
107-
}
108112
if (!user) {
109113
throw new Error('Failed to login');
110114
}
@@ -141,6 +145,29 @@ const FolderDetailPage = ({ user, setUser }: Props): ReactElement => {
141145
history.push('/folders');
142146
};
143147

148+
const handleRemoveApartments = async (apartmentIds: string[]) => {
149+
try {
150+
if (!user) {
151+
throw new Error('User not authenticated');
152+
}
153+
const token = await user.getIdToken(true);
154+
155+
await apartmentIds.map((id) =>
156+
axios.delete(`/api/folders/${folderId}/apartments/${id}`, {
157+
data: { apartmentIds },
158+
...createAuthHeaders(token),
159+
})
160+
);
161+
162+
// Refresh folder details
163+
fetchFolderDetails();
164+
} catch (error) {
165+
console.error('Error removing apartments from folder:', error);
166+
showError('Failed to remove apartments from folder');
167+
}
168+
setShowRemoveApartmentModal(false);
169+
};
170+
144171
if (loading) {
145172
return (
146173
<div className={background}>
@@ -167,6 +194,59 @@ const FolderDetailPage = ({ user, setUser }: Props): ReactElement => {
167194

168195
return (
169196
<div className={background}>
197+
<Dialog open={showRemoveApartmentModal} onClose={() => setShowRemoveApartmentModal(false)}>
198+
<DialogTitle>Remove Apartments from Folder</DialogTitle>
199+
<DialogContent>
200+
<Typography>
201+
Select apartments to remove from the folder or click "Remove All" to remove all
202+
apartments.
203+
</Typography>
204+
<FormGroup>
205+
{apartments.map((apt) => (
206+
<Box key={apt.buildingData.id} display="flex" alignItems="center" mt={2}>
207+
<Checkbox
208+
onChange={(e) => {
209+
const aptId = apt.buildingData.id;
210+
if (e.target.checked) {
211+
setApartmentIdsToRemove((prev) => [...prev, aptId]);
212+
} else {
213+
setApartmentIdsToRemove((prev) => prev.filter((id) => id !== aptId));
214+
}
215+
}}
216+
/>
217+
<Typography>
218+
<strong>{apt.buildingData.name}</strong> - {apt.buildingData.address}
219+
</Typography>
220+
</Box>
221+
))}
222+
</FormGroup>
223+
</DialogContent>
224+
<DialogActions>
225+
<Button
226+
onClick={() => setShowRemoveApartmentModal(false)}
227+
color="primary"
228+
variant="outlined"
229+
>
230+
Cancel
231+
</Button>
232+
233+
<Button
234+
onClick={() => handleRemoveApartments(apartmentIdsToRemove)}
235+
color="primary"
236+
disabled={apartmentIdsToRemove.length === 0}
237+
variant="contained"
238+
>
239+
Remove Selected
240+
</Button>
241+
<Button
242+
onClick={() => handleRemoveApartments(apartments.map((apt) => apt.buildingData.id))}
243+
color="primary"
244+
variant="outlined"
245+
>
246+
Remove All
247+
</Button>
248+
</DialogActions>
249+
</Dialog>
170250
<Box style={{ width: '90%', maxWidth: '1200px' }}>
171251
<Box className={headerContainer}>
172252
<IconButton onClick={handleBackClick} className={backButton}>
@@ -180,6 +260,13 @@ const FolderDetailPage = ({ user, setUser }: Props): ReactElement => {
180260
{apartments.length} {apartments.length === 1 ? 'apartment' : 'apartments'}
181261
</Typography>
182262
</div>
263+
<Button
264+
variant="outlined"
265+
onClick={() => setShowRemoveApartmentModal(true)}
266+
style={{ marginLeft: 'auto' }}
267+
>
268+
Edit Folder
269+
</Button>
183270
</Box>
184271

185272
{apartments.length === 0 ? (

0 commit comments

Comments
 (0)