hunk.code_window: 	const { library } = useLibraryContext();
   	const stats = useLibraryQuery(['library.statistics'], {
   		initialData: { ...EMPTY_STATISTICS }
   	});
   	mounted = true;
   	return (
   		<div className="flex w-full px-5 pb-2 pt-4">
   			{/* STAT CONTAINER */}
   			<div className="-mb-1 flex h-20 overflow-hidden">
   				{Object.entries(stats?.data || []).map(([key, value]) => {
  
hunk.labels: keep keep keep keep keep replace keep keep keep keep keep
hunk.after_edit: 	useEffect(() => {
   		if (!stats.isLoading) mounted = true;
   	});
  
hunk.file_path: interface/app/$libraryId/overview/Statistics.tsx
hunk.type: replace
file: use futures::{pin_mut, Future, Stream};
  
  pub struct AbortOnDrop<T>(pub tokio::task::JoinHandle<T>);
  
  impl<T> Drop for AbortOnDrop<T> {
  	fn drop(&mut self) {
  		self.0.abort()
  	}
  }
  
  impl<T> Future for AbortOnDrop<T> {
  	type Output = Result<T, tokio::task::JoinError>;
  
  	fn poll(
  		mut self: std::pin::Pin<&mut Self>,
  		cx: &mut std::task::Context<'_>,
  	) -> std::task::Poll<Self::Output> {
  		let handle = &mut self.0;
  
  		pin_mut!(handle);
  
  		handle.poll(cx)
  	}
  }
  
  impl<T> Stream for AbortOnDrop<T> {
  	type Item = ();
  
  	fn poll_next(
  		mut self: std::pin::Pin<&mut Self>,
  		cx: &mut std::task::Context<'_>,
  	) -> std::task::Poll<Option<Self::Item>> {
  		let handle = &mut self.0;
  
  		pin_mut!(handle);
  
  		handle.poll(cx).map(|_| None)
  	}
  }
  