EviVermeeren
EviVermeeren

Reputation: 23

Get image from API JSON GET to React Native

I'm going to post my question again but differently this time. So this is my current app in React Native:

enter image description here

Where you see the picture of the suitcases, I need to put a picture from the post that I made in Wordpress. The title and description are also from the same posts, trough an API.

This is the current code:

                return (
                    <View style={styles.box}>
                        <TouchableOpacity activeOpacity={0.5}>
                            <View style={styles.listItem}>

                                <Image
                                style={styles.image}
                                source={{uri: 'https://www.samsonite.be/on/demandware.static/-/Sites/default/dw851ab6f0/images/misc/sams_share-image.jpg'}}
                                />
                                <Text style={styles.title}>{item.title.rendered}</Text>
                                <Text style={styles.eigenschappen}>{item.yoast_head_json.og_description}</Text>
                                
                                <Pressable style={styles.seeProduct} onPress={() => navigation.navigate("DetailScreen", {itemTitle: item.title.rendered})}>
                                    <Text style={styles.text}>Bekijk product: {item.title.rendered}</Text>
                                </Pressable>

                            </View>
                        </TouchableOpacity >
                    </View>
                    
                )

WITH:

const AllSuitcasesScreen = ({ navigation }) => {
 
  const [suitcases, setSuitcases] = useState([]);
 
  const getSuitcases = async () => {
    try {
      const response = await fetch("https://evivermeeren.com/wp-json/wp/v2/posts?categories=59", {
 
        }
      )
      const json = await response.json();
      console.log(json);
      setSuitcases(json);
    } catch (error) {
      console.error(error);
    }
 
  }
 
  useEffect(() => {
    getSuitcases();
  }, []);
 
  const [input, setInput] = useState("");
  console.log(input);

  return (
    <View style={styles.screen}>

          <View style={styles.flexbox2}>
            <Text style={styles.products}>Onze koffers</Text>
            <View style={styles.shoppingcart}>
              <Image
                  style={styles.icon}
                  source={{uri: 'https://cdn-icons-png.flaticon.com/512/1413/1413908.png'}}
                />
              <Text style={styles.number}>0</Text>
            </View>
          </View>

          <TextInput
            value={input}
            placeholder="Zoek op naam, maat, kleur, materiaal of prijs..."
            style={styles.input}
            onChangeText={(text) => setInput(text)}
          />

          <SearchFilter data={suitcases} input={input} setInput={setInput}/>


        
    </View>
  );
}

This is the line I want to change:

<Image
style={styles.image}
source={{uri:'https://www.samsonite.be/on/demandware.static/-/Sites/default/dw851ab6f0/images/misc/sams_share-image.jpg'}}
/>

And in the JSON file, this is what I get:

[
    {
        "id": 2484,
        "date": "2022-12-17T15:02:56",
        "date_gmt": "2022-12-17T15:02:56",
        "guid": {
            "rendered": "https://evivermeeren.com/?p=2484"
        },
        "modified": "2022-12-18T10:39:37",
        "modified_gmt": "2022-12-18T10:39:37",
        "slug": "zwart-groot-hard-249euro",
        "status": "publish",
        "type": "post",
        "link": "https://evivermeeren.com/zwart-groot-hard-249euro/koffers/",
        "title": {
            "rendered": "Evo L Black"
        },
        "content": {
            "rendered": "\n<p id=\"desc\">Een grote koffer in een zwarte kleur, gemaakt van hard materiaal. De prijs van deze koffer is €249.</p>\n",
            "protected": false
        },
        "excerpt": {
            "rendered": "<p>Een grote koffer in een zwarte kleur, gemaakt van hard materiaal. De prijs van deze koffer is €249.</p>\n",
            "protected": false
        },
        "author": 1,
        "featured_media": 2229,
        "comment_status": "closed",
        "ping_status": "closed",
        "sticky": false,
        "template": "",
        "format": "standard",
        "meta": [],
        "categories": [
            59
        ],
        "tags": [],
        "yoast_head": "<!-- This site is optimized with the Yoast SEO plugin v19.12 - https://yoast.com/wordpress/plugins/seo/ -->\n<title>Evo L Black - Evi Vermeêren</title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" />\n<link rel=\"canonical\" href=\"https://evivermeeren.com/zwart-groot-hard-249euro/koffers/\" />\n<meta property=\"og:locale\" content=\"nl_NL\" />\n<meta property=\"og:type\" content=\"article\" />\n<meta property=\"og:title\" content=\"Evo L Black - Evi Vermeêren\" />\n<meta property=\"og:description\" content=\"Een grote koffer in een zwarte kleur, gemaakt van hard materiaal. De prijs van deze koffer is €249.\" />\n<meta property=\"og:url\" content=\"https://evivermeeren.com/zwart-groot-hard-249euro/koffers/\" />\n<meta property=\"og:site_name\" content=\"Evi Vermeêren\" />\n<meta property=\"article:published_time\" content=\"2022-12-17T15:02:56+00:00\" />\n<meta property=\"article:modified_time\" content=\"2022-12-18T10:39:37+00:00\" />\n<meta property=\"og:image\" content=\"https://evivermeeren.com/wp-content/uploads/2022/12/zwart-klein-4-300-hard-4-e1670410664142.webp\" />\n\t<meta property=\"og:image:width\" content=\"200\" />\n\t<meta property=\"og:image:height\" content=\"300\" />\n\t<meta property=\"og:image:type\" content=\"image/webp\" />\n<meta name=\"author\" content=\"evivermeeren\" />\n<meta name=\"twitter:card\" content=\"summary_large_image\" />\n<meta name=\"twitter:label1\" content=\"Geschreven door\" />\n\t<meta name=\"twitter:data1\" content=\"evivermeeren\" />\n\t<meta name=\"twitter:label2\" content=\"Verwachte leestijd\" />\n\t<meta name=\"twitter:data2\" content=\"1 minuut\" />\n<script type=\"application/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https://evivermeeren.com/zwart-groot-hard-249euro/koffers/#article\",\"isPartOf\":{\"@id\":\"https://evivermeeren.com/zwart-groot-hard-249euro/koffers/\"},\"author\":{\"name\":\"evivermeeren\",\"@id\":\"https://evivermeeren.com/#/schema/person/d74bd513920b6e8cf81e3693e10c9de0\"},\"headline\":\"Evo L Black\",\"datePublished\":\"2022-12-17T15:02:56+00:00\",\"dateModified\":\"2022-12-18T10:39:37+00:00\",\"mainEntityOfPage\":{\"@id\":\"https://evivermeeren.com/zwart-groot-hard-249euro/koffers/\"},\"wordCount\":20,\"publisher\":{\"@id\":\"https://evivermeeren.com/#/schema/person/d74bd513920b6e8cf81e3693e10c9de0\"},\"articleSection\":[\"Koffers\"],\"inLanguage\":\"nl\"},{\"@type\":\"WebPage\",\"@id\":\"https://evivermeeren.com/zwart-groot-hard-249euro/koffers/\",\"url\":\"https://evivermeeren.com/zwart-groot-hard-249euro/koffers/\",\"name\":\"Evo L Black - Evi Vermeêren\",\"isPartOf\":{\"@id\":\"https://evivermeeren.com/#website\"},\"datePublished\":\"2022-12-17T15:02:56+00:00\",\"dateModified\":\"2022-12-18T10:39:37+00:00\",\"breadcrumb\":{\"@id\":\"https://evivermeeren.com/zwart-groot-hard-249euro/koffers/#breadcrumb\"},\"inLanguage\":\"nl\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https://evivermeeren.com/zwart-groot-hard-249euro/koffers/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://evivermeeren.com/zwart-groot-hard-249euro/koffers/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https://evivermeeren.com/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Evo L Black\"}]},{\"@type\":\"WebSite\",\"@id\":\"https://evivermeeren.com/#website\",\"url\":\"https://evivermeeren.com/\",\"name\":\"Evi Vermeêren\",\"description\":\"\",\"publisher\":{\"@id\":\"https://evivermeeren.com/#/schema/person/d74bd513920b6e8cf81e3693e10c9de0\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https://evivermeeren.com/?s={search_term_string}\"},\"query-input\":\"required name=search_term_string\"}],\"inLanguage\":\"nl\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https://evivermeeren.com/#/schema/person/d74bd513920b6e8cf81e3693e10c9de0\",\"name\":\"evivermeeren\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"nl\",\"@id\":\"https://evivermeeren.com/#/schema/person/image/\",\"url\":\"https://evivermeeren.com/wp-content/uploads/2022/11/logo.png\",\"contentUrl\":\"https://evivermeeren.com/wp-content/uploads/2022/11/logo.png\",\"width\":661,\"height\":824,\"caption\":\"evivermeeren\"},\"logo\":{\"@id\":\"https://evivermeeren.com/#/schema/person/image/\"},\"sameAs\":[\"https://evivermeeren.com\"],\"url\":\"https://evivermeeren.com/author/evivermeeren/\"}]}</script>\n<!-- / Yoast SEO plugin. -->",
        "yoast_head_json": {
            "title": "Evo L Black - Evi Vermeêren",
            "robots": {
                "index": "index",
                "follow": "follow",
                "max-snippet": "max-snippet:-1",
                "max-image-preview": "max-image-preview:large",
                "max-video-preview": "max-video-preview:-1"
            },
            "canonical": "https://evivermeeren.com/zwart-groot-hard-249euro/koffers/",
            "og_locale": "nl_NL",
            "og_type": "article",
            "og_title": "Evo L Black - Evi Vermeêren",
            "og_description": "Een grote koffer in een zwarte kleur, gemaakt van hard materiaal. De prijs van deze koffer is €249.",
            "og_url": "https://evivermeeren.com/zwart-groot-hard-249euro/koffers/",
            "og_site_name": "Evi Vermeêren",
            "article_published_time": "2022-12-17T15:02:56+00:00",
            "article_modified_time": "2022-12-18T10:39:37+00:00",
            "og_image": [
                {
                    "width": 200,
                    "height": 300,
                    "url": "https://evivermeeren.com/wp-content/uploads/2022/12/zwart-klein-4-300-hard-4-e1670410664142.webp",
                    "type": "image/webp"
                }
            ],

So I need this link:

"url": "https://evivermeeren.com/wp-content/uploads/2022/12/zwart-klein-4-300-hard-4-e1670410664142.webp",

To get here:

<Image
style={styles.image}
source={{uri:'https://www.samsonite.be/on/demandware.static/-/Sites/default/dw851ab6f0/images/misc/sams_share-image.jpg'}}
/>

I tried doing this:

<Image
style={styles.image}
source={{uri:item.yoast_head_json.og_image.url}}
/>

But it did not work. I get the error: 'undefined is not an object'.

Does anyone know how to fix this?

Upvotes: 0

Views: 189

Answers (1)

Tim van Dam
Tim van Dam

Reputation: 465

You're getting that because you're not accessing the og_image. Try it like this, you'll see that you'll get the URL. You also have to use optional chaining using a ? to catch null/undefined errors. I used your suitcase variable to map through.

suitcases.map((item) => {
    item.yoast_head_json?.og_image?.map((item2) => console.log(item2.url));
  });

Adjusted solution to fit your case:

This might not be the cleanest solution but it works:

Your Suitcases component trimmed down, passing the necessary URL to the SearchFilter Component:

import { View } from "react-native";
import { useEffect, useState } from "react";
import { SearchFilter } from "./SearchFilter";

const Suitcases = () => {
  const [suitcases, setSuitcases] = useState([]);

  const getSuitcases = async () => {
    try {
      const response = await fetch(
        "https://evivermeeren.com/wp-json/wp/v2/posts?categories=59"
      );
      const json = await response.json();
      setSuitcases(json);
    } catch (error) {}
  };
  useEffect(() => {
    getSuitcases();
  }, []);

  return (
    <View
      style={{
        flex: 1,
      }}
    >
      {suitcases && <SearchFilter suitcases={suitcases} />}
    </View>
  );
};
export default Suitcases;

Your SearchFilter Component:

import { View, Image } from "react-native";

export const SearchFilter = ({ suitcases }) => {
  return (
    <View style={{ flex: 1 }}>
      {suitcases.map((item) => {
        item.yoast_head_json.og_image.map((item2) => {
          console.log(item2.url, "item url");
          return (
            <Image
              style={{ width: item2.width, height: item2.height }}
              source={{
                uri: item2.url,
              }}
            />
          );
        });
      })}
    </View>
  );
};

This should work, if not let me know.

Upvotes: 1

Related Questions