From a6b71625ecfc2306b075a196a128a378ea0e9e1e Mon Sep 17 00:00:00 2001 From: Cesar Mendivil Date: Wed, 16 Oct 2024 11:46:40 -0700 Subject: [PATCH] Iniciativa para Consumir desde un rss de BBC para crear un listado de noticias en el footer y unas utilidades de traduccion y otra de recorte de string para limitar los caracteres visualizacion --- gatsby-config.js | 14 ++ gatsby-node.js | 4 +- package-lock.json | 142 +++++++++++++++++- package.json | 5 +- src/common/rssService.js | 18 --- src/common/shortenString.js | 4 + src/components/Software/Blog.jsx | 45 +----- src/components/Software/Footer.jsx | 6 +- .../{ => Utils}/IntlProviderWrapper.jsx | 0 src/components/Utils/RssFeed.jsx | 83 ++++++++++ static/data/blog.json | 2 +- 11 files changed, 249 insertions(+), 74 deletions(-) delete mode 100644 src/common/rssService.js create mode 100644 src/common/shortenString.js rename src/components/{ => Utils}/IntlProviderWrapper.jsx (100%) create mode 100644 src/components/Utils/RssFeed.jsx diff --git a/gatsby-config.js b/gatsby-config.js index 190a711..1e8bcc8 100644 --- a/gatsby-config.js +++ b/gatsby-config.js @@ -20,6 +20,20 @@ module.exports = { remoteJsonUrl: `http://localhost:8000/data/language/languages.json`, }, }, + { + resolve: `gatsby-source-rss-feed`, + options: { + url: `https://feeds.bbci.co.uk/news/technology/rss.xml`, + name: `BBCNewsTech`, + parserOption: { + customFields: { + channel: ['title', 'description', 'link', 'image', 'generator', 'lastBuildDate', 'copyright', 'language', 'ttl'], + item: ['title', 'description', 'link', 'guid', 'pubDate', 'media','thumbnail','url','attrs'], // Campos personalizados si el feed tiene elementos adicionales + }, + }, + }, + }, + ], trailingSlash: 'always', }; diff --git a/gatsby-node.js b/gatsby-node.js index fa6fe8b..963cb2e 100644 --- a/gatsby-node.js +++ b/gatsby-node.js @@ -33,8 +33,8 @@ exports.onCreateWebpackConfig = ({ ); } } - // Add path-browserify to the fallback configuration - config.resolve.fallback = { + // Add path-browserify and timers-browserify to the fallback configuration + config.resolve.fallback = { ...config.resolve.fallback, path: require.resolve('path-browserify'), }; diff --git a/package-lock.json b/package-lock.json index cd54367..ffa5709 100644 --- a/package-lock.json +++ b/package-lock.json @@ -13,6 +13,7 @@ "gatsby": "^4.24.1", "gatsby-plugin-intl": "^5.10.0", "gatsby-plugin-resolve-src": "^2.1.0", + "gatsby-source-rss-feed": "^1.2.2", "lightgallery": "^2.5.0", "mini-css-extract-plugin": "^2.7.7", "path-browserify": "^1.0.1", @@ -21,7 +22,9 @@ "react-dom": "^17.0.2", "react-intl": "^6.6.8", "react-modal-video": "^1.2.9", - "swiper": "^8.3.2" + "swiper": "^8.3.2", + "timers-browserify": "^2.0.12", + "xml2js": "^0.6.2" }, "devDependencies": { "eslint": "^7.32.0", @@ -8314,9 +8317,12 @@ } }, "node_modules/function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, "node_modules/function.prototype.name": { "version": "1.1.5", @@ -8823,6 +8829,15 @@ "node": ">=14.15.0" } }, + "node_modules/gatsby-source-rss-feed": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/gatsby-source-rss-feed/-/gatsby-source-rss-feed-1.2.2.tgz", + "integrity": "sha512-Ris5Dtdj856aups8xzPtNOG6prKjaGzcXxRdFrgExQBVv2o1fUPHwj7OGrdV32tNUg2mHOZurr5qFWAdaRIMUg==", + "dependencies": { + "lodash": "^4.17.15", + "rss-parser": "^3.7.6" + } + }, "node_modules/gatsby-telemetry": { "version": "3.24.0", "resolved": "https://registry.npmjs.org/gatsby-telemetry/-/gatsby-telemetry-3.24.0.tgz", @@ -13618,6 +13633,27 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/rss-parser": { + "version": "3.13.0", + "resolved": "https://registry.npmjs.org/rss-parser/-/rss-parser-3.13.0.tgz", + "integrity": "sha512-7jWUBV5yGN3rqMMj7CZufl/291QAhvrrGpDNE4k/02ZchL0npisiYYqULF71jCEKoIiHvK/Q2e6IkDwPziT7+w==", + "dependencies": { + "entities": "^2.0.3", + "xml2js": "^0.5.0" + } + }, + "node_modules/rss-parser/node_modules/xml2js": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.5.0.tgz", + "integrity": "sha512-drPFnkQJik/O+uPKpqSgr22mpuFHqKdbS835iAQrUC73L2F5WkboIRd63ai/2Yg6I1jzifPFKH2NTK+cfglkIA==", + "dependencies": { + "sax": ">=0.6.0", + "xmlbuilder": "~11.0.0" + }, + "engines": { + "node": ">=4.0.0" + } + }, "node_modules/run-async": { "version": "2.4.1", "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", @@ -13687,6 +13723,11 @@ "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" }, + "node_modules/sax": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.4.1.tgz", + "integrity": "sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg==" + }, "node_modules/scheduler": { "version": "0.20.2", "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.20.2.tgz", @@ -14770,6 +14811,17 @@ "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==" }, + "node_modules/timers-browserify": { + "version": "2.0.12", + "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.12.tgz", + "integrity": "sha512-9phl76Cqm6FhSX9Xe1ZUAMLtm1BLkKj2Qd5ApyWkXzsMRaA7dgr81kf4wJmQf/hAvg8EEyJxDo3du/0KlhPiKQ==", + "dependencies": { + "setimmediate": "^1.0.4" + }, + "engines": { + "node": ">=0.6.0" + } + }, "node_modules/timers-ext": { "version": "0.1.7", "resolved": "https://registry.npmjs.org/timers-ext/-/timers-ext-0.1.7.tgz", @@ -15576,6 +15628,26 @@ "node": ">=8" } }, + "node_modules/xml2js": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.6.2.tgz", + "integrity": "sha512-T4rieHaC1EXcES0Kxxj4JWgaUQHDk+qwHcYOCFHfiwKz7tOVPLq7Hjq9dM1WCMhylqMEfP7hMcOIChvotiZegA==", + "dependencies": { + "sax": ">=0.6.0", + "xmlbuilder": "~11.0.0" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/xmlbuilder": { + "version": "11.0.1", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz", + "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==", + "engines": { + "node": ">=4.0" + } + }, "node_modules/xmlhttprequest-ssl": { "version": "1.6.3", "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.6.3.tgz", @@ -21761,9 +21833,9 @@ "optional": true }, "function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==" }, "function.prototype.name": { "version": "1.1.5", @@ -22294,6 +22366,15 @@ "sharp": "^0.30.7" } }, + "gatsby-source-rss-feed": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/gatsby-source-rss-feed/-/gatsby-source-rss-feed-1.2.2.tgz", + "integrity": "sha512-Ris5Dtdj856aups8xzPtNOG6prKjaGzcXxRdFrgExQBVv2o1fUPHwj7OGrdV32tNUg2mHOZurr5qFWAdaRIMUg==", + "requires": { + "lodash": "^4.17.15", + "rss-parser": "^3.7.6" + } + }, "gatsby-telemetry": { "version": "3.24.0", "resolved": "https://registry.npmjs.org/gatsby-telemetry/-/gatsby-telemetry-3.24.0.tgz", @@ -25593,6 +25674,26 @@ "glob": "^7.1.3" } }, + "rss-parser": { + "version": "3.13.0", + "resolved": "https://registry.npmjs.org/rss-parser/-/rss-parser-3.13.0.tgz", + "integrity": "sha512-7jWUBV5yGN3rqMMj7CZufl/291QAhvrrGpDNE4k/02ZchL0npisiYYqULF71jCEKoIiHvK/Q2e6IkDwPziT7+w==", + "requires": { + "entities": "^2.0.3", + "xml2js": "^0.5.0" + }, + "dependencies": { + "xml2js": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.5.0.tgz", + "integrity": "sha512-drPFnkQJik/O+uPKpqSgr22mpuFHqKdbS835iAQrUC73L2F5WkboIRd63ai/2Yg6I1jzifPFKH2NTK+cfglkIA==", + "requires": { + "sax": ">=0.6.0", + "xmlbuilder": "~11.0.0" + } + } + } + }, "run-async": { "version": "2.4.1", "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", @@ -25641,6 +25742,11 @@ "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" }, + "sax": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.4.1.tgz", + "integrity": "sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg==" + }, "scheduler": { "version": "0.20.2", "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.20.2.tgz", @@ -26433,6 +26539,14 @@ "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==" }, + "timers-browserify": { + "version": "2.0.12", + "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.12.tgz", + "integrity": "sha512-9phl76Cqm6FhSX9Xe1ZUAMLtm1BLkKj2Qd5ApyWkXzsMRaA7dgr81kf4wJmQf/hAvg8EEyJxDo3du/0KlhPiKQ==", + "requires": { + "setimmediate": "^1.0.4" + } + }, "timers-ext": { "version": "0.1.7", "resolved": "https://registry.npmjs.org/timers-ext/-/timers-ext-0.1.7.tgz", @@ -27018,6 +27132,20 @@ "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-4.0.0.tgz", "integrity": "sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q==" }, + "xml2js": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.6.2.tgz", + "integrity": "sha512-T4rieHaC1EXcES0Kxxj4JWgaUQHDk+qwHcYOCFHfiwKz7tOVPLq7Hjq9dM1WCMhylqMEfP7hMcOIChvotiZegA==", + "requires": { + "sax": ">=0.6.0", + "xmlbuilder": "~11.0.0" + } + }, + "xmlbuilder": { + "version": "11.0.1", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz", + "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==" + }, "xmlhttprequest-ssl": { "version": "1.6.3", "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.6.3.tgz", diff --git a/package.json b/package.json index de68273..73ac24e 100644 --- a/package.json +++ b/package.json @@ -20,6 +20,7 @@ "gatsby": "^4.24.1", "gatsby-plugin-intl": "^5.10.0", "gatsby-plugin-resolve-src": "^2.1.0", + "gatsby-source-rss-feed": "^1.2.2", "lightgallery": "^2.5.0", "mini-css-extract-plugin": "^2.7.7", "path-browserify": "^1.0.1", @@ -28,7 +29,9 @@ "react-dom": "^17.0.2", "react-intl": "^6.6.8", "react-modal-video": "^1.2.9", - "swiper": "^8.3.2" + "swiper": "^8.3.2", + "timers-browserify": "^2.0.12", + "xml2js": "^0.6.2" }, "devDependencies": { "eslint": "^7.32.0", diff --git a/src/common/rssService.js b/src/common/rssService.js deleted file mode 100644 index 174ba62..0000000 --- a/src/common/rssService.js +++ /dev/null @@ -1,18 +0,0 @@ -import axios from 'axios'; -import xml2js from 'xml2js'; - -class RssService { - async getRssFeed(url) { - try { - const response = await axios.get(url); - const result = await xml2js.parseStringPromise(response.data, { mergeAttrs: true }); - return result.rss.channel[0].item; - } catch (error) { - console.error('Error fetching RSS feed:', error); - return []; - } - } -} - -const rssService = new RssService(); -export default rssService; \ No newline at end of file diff --git a/src/common/shortenString.js b/src/common/shortenString.js new file mode 100644 index 0000000..29da5f6 --- /dev/null +++ b/src/common/shortenString.js @@ -0,0 +1,4 @@ +export const shortenString = (str, maxLength) => { + if (str.length <= maxLength) return str; + return str.substring(0, maxLength) + '...'; +}; \ No newline at end of file diff --git a/src/components/Software/Blog.jsx b/src/components/Software/Blog.jsx index 1133649..c2cbbca 100644 --- a/src/components/Software/Blog.jsx +++ b/src/components/Software/Blog.jsx @@ -2,8 +2,7 @@ import React,{ useEffect, useState,useContext } from 'react'; import { Link } from 'gatsby'; import api from '../../common/api'; import { LanguageContext } from '../../context/LanguageContext'; - - +import RssFeed from '../Utils/RssFeed'; const Blog = () => { const { currentLanguage } = useContext(LanguageContext); const [dataBlog, setBlogs] = useState({blogs: [], faq: [],clients: [],text_traductions:[]}); @@ -29,47 +28,9 @@ const Blog = () => {
- {dataBlog.text_traductions[currentLanguage] && dataBlog.text_traductions[currentLanguage].all_articles} + {dataBlog.text_traductions[currentLanguage] && dataBlog.text_traductions[currentLanguage].all_articles}
- { - dataBlog.blogs.map((post, i) => ( -
-
-
- - ... - -
-
- -
-
-
- )) - } +
diff --git a/src/components/Software/Footer.jsx b/src/components/Software/Footer.jsx index 1da0f36..f2214d5 100644 --- a/src/components/Software/Footer.jsx +++ b/src/components/Software/Footer.jsx @@ -10,10 +10,10 @@ const Footer = () => {
- Iteck - 1st Choice for IT Solutions + Nextream's Tech & Solutions
- Over 25 years working in IT services developing software applications and mobile apps for clients all over the world. For your very specific industry, we have highly-tailored IT solutions. + Más de 25 años trabajando en servicios de TI desarrollando aplicaciones de software y aplicaciones móviles para clientes de todo el mundo. Para su industria muy específica, contamos con soluciones de TI altamente personalizadas.
@@ -31,7 +31,7 @@ const Footer = () => {
- Information + Informacion
{ footerData.address } diff --git a/src/components/IntlProviderWrapper.jsx b/src/components/Utils/IntlProviderWrapper.jsx similarity index 100% rename from src/components/IntlProviderWrapper.jsx rename to src/components/Utils/IntlProviderWrapper.jsx diff --git a/src/components/Utils/RssFeed.jsx b/src/components/Utils/RssFeed.jsx new file mode 100644 index 0000000..3394afa --- /dev/null +++ b/src/components/Utils/RssFeed.jsx @@ -0,0 +1,83 @@ +import React from 'react'; +import { useStaticQuery, graphql, Link } from 'gatsby'; +import { shortenString } from '../../common/shortenString'; + +const RssFeed = () => { + const data = useStaticQuery(graphql` + query { + allFeedBbcNewsTech(limit: 3) { + edges { + node { + title + link + content + contentSnippet + pubDate + media { + thumbnail { + attrs { + url + } + } + } + internal { + type + } + } + } + } + } + `); + + // Ordenar los elementos por fecha de publicación y seleccionar los 4 más recientes + const rssItems = data.allFeedBbcNewsTech.edges + .sort((a, b) => new Date(b.pubDate) - new Date(a.pubDate)); + + return ( + +rssItems.map(({ node }, index) => ( +
+ )) + ); + } + + + + +export default RssFeed; \ No newline at end of file diff --git a/static/data/blog.json b/static/data/blog.json index aa8ef2f..c3b3db3 100644 --- a/static/data/blog.json +++ b/static/data/blog.json @@ -116,7 +116,7 @@ "text_traductions":{ "es":{ "blog_title1":"

Nextream Noticias

", - "all_articles":"Ver artculos", + "all_articles":"Ver articulos", "by":"Por", "see_more":"Ver Más" },