feat: enhance image loading and socket handling in Product and Images components, and update prerender logic in App and ProductDetailPage
This commit is contained in:
@@ -20,7 +20,7 @@ class CartItem extends Component {
|
||||
this.setState({image:window.tinyPicCache[picid],loading:false, error: false})
|
||||
}else{
|
||||
this.setState({image: null, loading: true, error: false});
|
||||
if(this.props.socket){
|
||||
if(this.props.socket && this.props.socket.connected){
|
||||
this.props.socket.emit('getPic', { bildId:picid, size:'tiny' }, (res) => {
|
||||
if(res.success){
|
||||
window.tinyPicCache[picid] = URL.createObjectURL(new Blob([res.imageBuffer], { type: 'image/jpeg' }));
|
||||
|
||||
@@ -12,7 +12,7 @@ import LoupeIcon from '@mui/icons-material/Loupe';
|
||||
class Images extends Component {
|
||||
constructor(props) {
|
||||
super(props);
|
||||
this.state = { mainPic:0,pics:[]};
|
||||
this.state = { mainPic:0,pics:[], needsSocketRetry: false };
|
||||
}
|
||||
|
||||
componentDidMount () {
|
||||
@@ -22,6 +22,15 @@ class Images extends Component {
|
||||
if (prevProps.fullscreenOpen !== this.props.fullscreenOpen) {
|
||||
this.updatePics();
|
||||
}
|
||||
|
||||
// Retry loading images if socket just became available
|
||||
const wasConnected = prevProps.socketB && prevProps.socketB.connected;
|
||||
const isNowConnected = this.props.socketB && this.props.socketB.connected;
|
||||
|
||||
if (!wasConnected && isNowConnected && this.state.needsSocketRetry) {
|
||||
this.setState({ needsSocketRetry: false });
|
||||
this.updatePics();
|
||||
}
|
||||
}
|
||||
|
||||
updatePics = (newMainPic = this.state.mainPic) => {
|
||||
@@ -49,10 +58,10 @@ class Images extends Component {
|
||||
pics.push(window.smallPicCache[bildId]);
|
||||
this.loadPic(this.props.fullscreenOpen ? 'large' : 'medium',bildId,newMainPic);
|
||||
}else if(window.tinyPicCache[bildId]){
|
||||
pics.push(bildId);
|
||||
pics.push(window.tinyPicCache[bildId]);
|
||||
this.loadPic(this.props.fullscreenOpen ? 'large' : 'medium',bildId,newMainPic);
|
||||
}else{
|
||||
pics.push(bildId);
|
||||
pics.push(`/assets/images/prod${bildId}.jpg`);
|
||||
this.loadPic(this.props.fullscreenOpen ? 'large' : 'medium',bildId,newMainPic);
|
||||
}
|
||||
}else{
|
||||
@@ -67,7 +76,8 @@ class Images extends Component {
|
||||
}
|
||||
}
|
||||
}
|
||||
console.log('pics',pics);
|
||||
console.log('DEBUG: pics array contents:', pics);
|
||||
console.log('DEBUG: pics array types:', pics.map(p => typeof p + ': ' + p));
|
||||
this.setState({ pics, mainPic: newMainPic });
|
||||
}else{
|
||||
if(this.state.pics.length > 0) this.setState({ pics:[], mainPic: newMainPic });
|
||||
@@ -75,6 +85,13 @@ class Images extends Component {
|
||||
}
|
||||
|
||||
loadPic = (size,bildId,index) => {
|
||||
// Check if socketB is available and connected before emitting
|
||||
if (!this.props.socketB || !this.props.socketB.connected) {
|
||||
console.log("Images: socketB not available, will retry when connected");
|
||||
this.setState({ needsSocketRetry: true });
|
||||
return;
|
||||
}
|
||||
|
||||
this.props.socketB.emit('getPic', { bildId, size }, (res) => {
|
||||
if(res.success){
|
||||
const url = URL.createObjectURL(new Blob([res.imageBuffer], { type: 'image/jpeg' }));
|
||||
|
||||
@@ -28,25 +28,16 @@ class Product extends Component {
|
||||
}else{
|
||||
this.state = {image: null, loading: true, error: false};
|
||||
console.log("Product: Fetching image from socketB", this.props.socketB);
|
||||
this.props.socketB.emit('getPic', { bildId, size:'small' }, (res) => {
|
||||
if(res.success){
|
||||
window.smallPicCache[bildId] = URL.createObjectURL(new Blob([res.imageBuffer], { type: 'image/jpeg' }));
|
||||
if (this._isMounted) {
|
||||
this.setState({image: window.smallPicCache[bildId], loading: false});
|
||||
} else {
|
||||
this.state.image = window.smallPicCache[bildId];
|
||||
this.state.loading = false;
|
||||
}
|
||||
}else{
|
||||
console.log('Fehler beim Laden des Bildes:', res);
|
||||
if (this._isMounted) {
|
||||
this.setState({error: true, loading: false});
|
||||
} else {
|
||||
this.state.error = true;
|
||||
this.state.loading = false;
|
||||
}
|
||||
}
|
||||
})
|
||||
|
||||
// Check if socketB is available and connected before emitting
|
||||
if (this.props.socketB && this.props.socketB.connected) {
|
||||
this.loadImage(bildId);
|
||||
} else {
|
||||
// Socket not available, set error state or wait
|
||||
console.log("Product: socketB not available, will retry when connected");
|
||||
this.state.error = true;
|
||||
this.state.loading = false;
|
||||
}
|
||||
}
|
||||
}else{
|
||||
this.state = {image: null, loading: false, error: false};
|
||||
@@ -57,6 +48,45 @@ class Product extends Component {
|
||||
this._isMounted = true;
|
||||
}
|
||||
|
||||
componentDidUpdate(prevProps) {
|
||||
// Retry loading image if socket just became available
|
||||
const wasConnected = prevProps.socketB && prevProps.socketB.connected;
|
||||
const isNowConnected = this.props.socketB && this.props.socketB.connected;
|
||||
|
||||
if (!wasConnected && isNowConnected && this.state.error && this.props.pictureList) {
|
||||
// Socket just connected and we had an error, retry loading
|
||||
const bildId = this.props.pictureList.split(',')[0];
|
||||
if (!window.smallPicCache[bildId]) {
|
||||
this.setState({loading: true, error: false});
|
||||
this.loadImage(bildId);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
loadImage = (bildId) => {
|
||||
if (this.props.socketB && this.props.socketB.connected) {
|
||||
this.props.socketB.emit('getPic', { bildId, size:'small' }, (res) => {
|
||||
if(res.success){
|
||||
window.smallPicCache[bildId] = URL.createObjectURL(new Blob([res.imageBuffer], { type: 'image/jpeg' }));
|
||||
if (this._isMounted) {
|
||||
this.setState({image: window.smallPicCache[bildId], loading: false});
|
||||
} else {
|
||||
this.state.image = window.smallPicCache[bildId];
|
||||
this.state.loading = false;
|
||||
}
|
||||
}else{
|
||||
console.log('Fehler beim Laden des Bildes:', res);
|
||||
if (this._isMounted) {
|
||||
this.setState({error: true, loading: false});
|
||||
} else {
|
||||
this.state.error = true;
|
||||
this.state.loading = false;
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
componentWillUnmount() {
|
||||
this._isMounted = false;
|
||||
}
|
||||
|
||||
@@ -356,7 +356,6 @@ class ProductDetailPage extends Component {
|
||||
if (!this.props.socket || !this.props.socket.connected) {
|
||||
// Socket not connected yet, but don't show error immediately on first load
|
||||
// The componentDidUpdate will retry when socket connects
|
||||
console.log("Socket not connected yet, waiting for connection to load product data");
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -538,11 +537,27 @@ class ProductDetailPage extends Component {
|
||||
}
|
||||
};
|
||||
|
||||
render() {
|
||||
render() {
|
||||
const { product, loading, error, attributeImages, isSteckling, attributes, komponentenLoaded, komponentenData, komponentenImages, totalKomponentenPrice, totalSavings } =
|
||||
this.state;
|
||||
|
||||
// Debug alerts removed
|
||||
|
||||
|
||||
|
||||
if (loading) {
|
||||
// Check if prerender fallback is available
|
||||
if (typeof window !== "undefined" && window.__PRERENDER_FALLBACK__) {
|
||||
return (
|
||||
<div
|
||||
dangerouslySetInnerHTML={{
|
||||
__html: window.__PRERENDER_FALLBACK__.content,
|
||||
}}
|
||||
/>
|
||||
);
|
||||
}
|
||||
|
||||
// Fallback to loading message if no prerender content
|
||||
return (
|
||||
<Box
|
||||
sx={{
|
||||
|
||||
@@ -257,7 +257,7 @@ const SearchBar = () => {
|
||||
),
|
||||
endAdornment: (
|
||||
<InputAdornment position="end">
|
||||
{loadingSuggestions && <CircularProgress size={16} />}
|
||||
{loadingSuggestions && <CircularProgress size={16} />}
|
||||
<IconButton
|
||||
size="small"
|
||||
onClick={handleEnterClick}
|
||||
|
||||
Reference in New Issue
Block a user