diff --git a/src/components/node/ImageSwitcher/index.tsx b/src/components/node/ImageSwitcher/index.tsx index 92b20433..30bfe227 100644 --- a/src/components/node/ImageSwitcher/index.tsx +++ b/src/components/node/ImageSwitcher/index.tsx @@ -1,21 +1,22 @@ import React, { FC } from 'react'; import range from 'ramda/es/range'; -import * as styles from './styles.scss'; +import classNames from 'classnames'; -import classNames = require('classnames'); +import * as styles from './styles.scss'; interface IProps { total: number; current: number; + loaded?: Record<number, boolean>; onChange: (current: number) => void; } -const ImageSwitcher: FC<IProps> = ({ total, current, onChange }) => ( +const ImageSwitcher: FC<IProps> = ({ total, current, onChange, loaded }) => ( <div className={styles.wrap}> <div className={styles.switcher}> {range(0, total).map(item => ( <div - className={classNames({ is_active: item === current })} + className={classNames({ is_active: item === current, is_loaded: loaded[item] })} key={item} onClick={() => onChange(item)} /> diff --git a/src/components/node/ImageSwitcher/styles.scss b/src/components/node/ImageSwitcher/styles.scss index 998fe6b0..16932672 100644 --- a/src/components/node/ImageSwitcher/styles.scss +++ b/src/components/node/ImageSwitcher/styles.scss @@ -38,6 +38,8 @@ // background: white; border-radius: 8px; box-shadow: inset white 0 0 0 2px; + transform: scale(0.5); + transition: transform 0.5s; } &:global(.is_active) { @@ -45,5 +47,9 @@ background: white; } } + + &:global(.is_loaded)::after { + transform: scale(1); + } } } diff --git a/src/components/node/NodeImageBlock/index.tsx b/src/components/node/NodeImageBlock/index.tsx index 5a47a957..5ee0405f 100644 --- a/src/components/node/NodeImageBlock/index.tsx +++ b/src/components/node/NodeImageBlock/index.tsx @@ -14,7 +14,6 @@ import { INode } from '~/redux/types'; import classNames from 'classnames'; import { getImageSize } from '~/utils/dom'; import { UPLOAD_TYPES } from '~/redux/uploads/constants'; -import { readFileSync } from 'fs'; interface IProps { is_loading: boolean; @@ -23,7 +22,7 @@ interface IProps { const NodeImageBlock: FC<IProps> = ({ node, is_loading }) => { const [current, setCurrent] = useState(0); - const [height, setHeight] = useState(0); + const [height, setHeight] = useState(320); const [loaded, setLoaded] = useState<Record<number, boolean>>({}); const refs = useRef<Record<number, HTMLDivElement>>({}); @@ -40,7 +39,9 @@ const NodeImageBlock: FC<IProps> = ({ node, is_loading }) => { ]); useEffect(() => { - if (!refs || !refs.current[current]) return; + console.log({ height }); + + if (!refs || !refs.current[current] || !loaded[current]) return setHeight(320); const el = refs.current[current]; @@ -51,31 +52,36 @@ const NodeImageBlock: FC<IProps> = ({ node, is_loading }) => { return ( <div className={classNames(styles.wrap, { is_loading })}> - {!is_loading && ( - <div> - <ImageSwitcher total={images.length} current={current} onChange={setCurrent} /> + <div> + <ImageSwitcher + total={images.length} + current={current} + onChange={setCurrent} + loaded={loaded} + /> - <div className={styles.image_container} style={{ height }}> - {images.map((file, index) => ( - <div - className={classNames(styles.image_wrap, { - is_active: index === current && loaded[index], - })} - ref={setRef(index)} + <div className={styles.image_container} style={{ height }}> + {(is_loading || !loaded[0] || !images.length) && <div className={styles.placeholder} />} + + {images.map((file, index) => ( + <div + className={classNames(styles.image_wrap, { + is_active: index === current && loaded[index], + })} + ref={setRef(index)} + key={file.id} + > + <img + className={styles.image} + src={getImageSize(file.url, 'node')} + alt="" key={file.id} - > - <img - className={styles.image} - src={getImageSize(file.url, 'node')} - alt="" - key={file.id} - onLoad={onImageLoad(index)} - /> - </div> - ))} - </div> + onLoad={onImageLoad(index)} + /> + </div> + ))} </div> - )} + </div> </div> ); }; diff --git a/src/components/node/NodeImageBlock/styles.scss b/src/components/node/NodeImageBlock/styles.scss index 1ecffff6..4b602c4a 100644 --- a/src/components/node/NodeImageBlock/styles.scss +++ b/src/components/node/NodeImageBlock/styles.scss @@ -36,3 +36,8 @@ opacity: 1; } } + +.placeholder { + background: red; + height: 320px; +} diff --git a/src/components/node/NodeImageBlockPlaceholder/styles.scss b/src/components/node/NodeImageBlockPlaceholder/styles.scss index 9efeba7e..d02bb460 100644 --- a/src/components/node/NodeImageBlockPlaceholder/styles.scss +++ b/src/components/node/NodeImageBlockPlaceholder/styles.scss @@ -1,5 +1,5 @@ .placeholder { - height: 33vw; + height: 320px; background: transparentize(black, 0.8); border: $radius $radius 0 0; @include outer_shadow();