@@ -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' ;
1218import { ArrowBack as ArrowBackIcon } from '@material-ui/icons' ;
1319import Toast from '../components/utils/Toast' ;
1420import { colors } from '../colors' ;
1521import axios from 'axios' ;
16- import { createAuthHeaders , getUser } from '../utils/firebase' ;
22+ import { createAuthHeaders } from '../utils/firebase' ;
1723import ApartmentCards from '../components/ApartmentCard/SearchResultsPageApartmentCards' ;
1824import { 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