import React, {useRef, useEffect, useCallback, useLayoutEffect} from 'react'; import _ from 'lodash' import {imgUrl as url} from '../../../utils/requests' let defaultUrl = "/img/noImg.png"; const fetchImg = fileCode => { // console.log("fetchImg") return new Promise((resolve, reject) => { let ajax = new XMLHttpRequest(); ajax.open("GET", `${url}${fileCode}`, true); ajax.responseType = "blob"; ajax.setRequestHeader("Cache-Control", "max-age=3600") ajax.setRequestHeader("Authorization", window.localStorage.getItem("token")) ajax.onload = function () { if (ajax.status == 200) { ajax.response.text().then(res => { // console.log("res", JSON.parse(res)) try{ res = JSON.parse(res); }catch(e){ console.log(e) } if (res.error) { resolve(defaultUrl) } else { let blob = ajax.response; let oFileReader = new FileReader(); oFileReader.onloadend = function (e) { console.log("e", e) let base64 = e.target.result; resolve(base64) }; oFileReader.readAsDataURL(blob); } }) } } ajax.send(); }) } function InfoCard(props) { const imgBox = useRef(); const {imgKey, status = {}, columns = [],extraColumns = [], data = {}, cardWidth = 256, contentHeight} = props; const {key = '', value, color} = status; const setImg = useCallback(async () => { let url = defaultUrl; if (imgKey && data[imgKey]) { url = await fetchImg(data[imgKey]); } imgBox.current && (imgBox.current.style.backgroundImage = `url('${url}')`) }, [data[imgKey]]) useLayoutEffect(() => { let observer = new IntersectionObserver((entries, observer) => { if(entries[0].intersectionRatio > 0) setImg(); }, {}); observer && observer.observe(imgBox.current); return () => { observer && observer.unobserve(imgBox.current); } }, [setImg]) return (
{data[key] && (
{value? value(data[key]) : data[key]}
)}
{columns.concat(extraColumns).map(({title, code, text}) => { return (
{title} {text || data[code]}
) })}
); } export default InfoCard;