mirror of
https://github.com/antebudimir/feishin.git
synced 2025-12-31 18:13:31 +00:00
Merge pull request #1002 from jeffvli/react-image-lazy-loaded
Use lazy loading (react-intersection-observer) for image loading
This commit is contained in:
commit
2260c0c02b
5 changed files with 60 additions and 31 deletions
|
|
@ -78,7 +78,7 @@ export const useHandlePlayQueueAdd = () => {
|
|||
// Allow this to be undefined for "play shuffled". If undefined, default to 0,
|
||||
// otherwise, choose the selected item in the queue
|
||||
let initialSongIndex: number | undefined;
|
||||
let toastId: string | null = null;
|
||||
let toastId: null | string = null;
|
||||
|
||||
if (byItemType) {
|
||||
let songList: SongListResponse | undefined;
|
||||
|
|
@ -148,9 +148,9 @@ export const useHandlePlayQueueAdd = () => {
|
|||
|
||||
clearTimeout(timeoutIds.current[fetchId] as ReturnType<typeof setTimeout>);
|
||||
delete timeoutIds.current[fetchId];
|
||||
if(toastId){
|
||||
if (toastId) {
|
||||
toast.hide(toastId);
|
||||
}
|
||||
}
|
||||
} catch (err: any) {
|
||||
if (instanceOfCancellationError(err)) {
|
||||
return null;
|
||||
|
|
|
|||
|
|
@ -230,19 +230,19 @@ export const AddToPlaylistContextModal = ({
|
|||
clearable
|
||||
data={playlistSelect}
|
||||
disabled={playlistList.isLoading}
|
||||
dropdownOpened={isDropdownOpened}
|
||||
label={t('form.addToPlaylist.input', {
|
||||
context: 'playlists',
|
||||
postProcess: 'titleCase',
|
||||
})}
|
||||
searchable
|
||||
size="md"
|
||||
dropdownOpened={isDropdownOpened}
|
||||
{...form.getInputProps('playlistId')}
|
||||
onClick={() => setIsDropdownOpened(true)}
|
||||
onChange={(e) => {
|
||||
setIsDropdownOpened(false);
|
||||
form.getInputProps('playlistId').onChange(e);
|
||||
}}
|
||||
onClick={() => setIsDropdownOpened(true)}
|
||||
/>
|
||||
<Switch
|
||||
label={t('form.addToPlaylist.input', {
|
||||
|
|
|
|||
|
|
@ -2,6 +2,7 @@ import clsx from 'clsx';
|
|||
import { motion, MotionConfigProps } from 'motion/react';
|
||||
import { type ImgHTMLAttributes } from 'react';
|
||||
import { Img } from 'react-image';
|
||||
import { InView } from 'react-intersection-observer';
|
||||
|
||||
import styles from './image.module.css';
|
||||
|
||||
|
|
@ -33,6 +34,9 @@ interface ImageUnloaderProps {
|
|||
className?: string;
|
||||
}
|
||||
|
||||
const FALLBACK_SVG =
|
||||
'data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIzMDAiIGhlaWdodD0iMzAwIj48ZmlsdGVyIGlkPSJhIiB4PSIwIiB5PSIwIj48ZmVUdXJidWxlbmNlIHR5cGU9ImZyYWN0YWxOb2lzZSIgYmFzZUZyZXF1ZW5jeT0iLjc1IiBzdGl0Y2hUaWxlcz0ic3RpdGNoIi8+PGZlQ29sb3JNYXRyaXggdHlwZT0ic2F0dXJhdGUiIHZhbHVlcz0iMCIvPjwvZmlsdGVyPjxwYXRoIGZpbHRlcj0idXJsKCNhKSIgb3BhY2l0eT0iLjA1IiBkPSJNMCAwaDMwMHYzMDBIMHoiLz48L3N2Zz4=';
|
||||
|
||||
export function Image({
|
||||
className,
|
||||
containerClassName,
|
||||
|
|
@ -44,33 +48,39 @@ export function Image({
|
|||
}: ImageProps) {
|
||||
if (src) {
|
||||
return (
|
||||
<Img
|
||||
className={clsx(styles.image, className)}
|
||||
container={(children) => (
|
||||
<ImageContainer
|
||||
className={containerClassName}
|
||||
enableAnimation={enableAnimation}
|
||||
{...imageContainerProps}
|
||||
>
|
||||
{children}
|
||||
</ImageContainer>
|
||||
<InView>
|
||||
{({ inView, ref }) => (
|
||||
<div ref={ref}>
|
||||
<Img
|
||||
className={clsx(styles.image, className)}
|
||||
container={(children) => (
|
||||
<ImageContainer
|
||||
className={containerClassName}
|
||||
enableAnimation={enableAnimation}
|
||||
{...imageContainerProps}
|
||||
>
|
||||
{children}
|
||||
</ImageContainer>
|
||||
)}
|
||||
loader={
|
||||
includeLoader ? (
|
||||
<ImageContainer className={containerClassName}>
|
||||
<ImageLoader className={className} />
|
||||
</ImageContainer>
|
||||
) : null
|
||||
}
|
||||
src={inView ? src : FALLBACK_SVG}
|
||||
unloader={
|
||||
includeUnloader ? (
|
||||
<ImageContainer className={containerClassName}>
|
||||
<ImageUnloader className={className} />
|
||||
</ImageContainer>
|
||||
) : null
|
||||
}
|
||||
/>
|
||||
</div>
|
||||
)}
|
||||
loader={
|
||||
includeLoader ? (
|
||||
<ImageContainer className={containerClassName}>
|
||||
<ImageLoader className={className} />
|
||||
</ImageContainer>
|
||||
) : null
|
||||
}
|
||||
src={src}
|
||||
unloader={
|
||||
includeUnloader ? (
|
||||
<ImageContainer className={containerClassName}>
|
||||
<ImageUnloader className={className} />
|
||||
</ImageContainer>
|
||||
) : null
|
||||
}
|
||||
/>
|
||||
</InView>
|
||||
);
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue