diff --git a/.gitignore b/.gitignore index 4d29575..d15725f 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,5 @@ # See https://help.github.com/articles/ignoring-files/ for more about ignoring files. +.env # dependencies /node_modules diff --git a/package-lock.json b/package-lock.json index 1ee0f0e..8fa4d59 100644 --- a/package-lock.json +++ b/package-lock.json @@ -11,13 +11,17 @@ "@testing-library/jest-dom": "^5.17.0", "@testing-library/react": "^13.4.0", "@testing-library/user-event": "^13.5.0", + "axios": "^1.4.0", "bootstrap": "^5.3.1", + "dotenv": "^16.3.1", "react": "^18.2.0", "react-bootstrap": "^2.8.0", "react-dom": "^18.2.0", "react-scripts": "5.0.1", "split-pane-react": "^0.1.3", - "web-vitals": "^2.1.4" + "web-vitals": "^2.1.4", + "youtube-search": "^1.1.6", + "youtube-search-api": "^1.2.1" } }, "node_modules/@aashutoshrathi/word-wrap": { @@ -5365,6 +5369,29 @@ "node": ">=4" } }, + "node_modules/axios": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.4.0.tgz", + "integrity": "sha512-S4XCWMEmzvo64T9GfvQDOXgYRDJ/wsSZc7Jvdgx5u1sd0JwsuPLqb3SYmusag+edF6ziyMensPVqLTSc1PiSEA==", + "dependencies": { + "follow-redirects": "^1.15.0", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" + } + }, + "node_modules/axios/node_modules/form-data": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/axobject-query": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-3.2.1.tgz", @@ -7093,11 +7120,14 @@ } }, "node_modules/dotenv": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-10.0.0.tgz", - "integrity": "sha512-rlBi9d8jpv9Sf1klPjNfFAuWDjKLwTIJJ/VxtoTwIR6hnZxcEOQCZg2oIL3MWBYw5GpUDKOEnND7LXTbIpQ03Q==", + "version": "16.3.1", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.3.1.tgz", + "integrity": "sha512-IPzF4w4/Rd94bA9imS68tZBaYyBWSCE47V1RGuMrB94iyTOIEwRmVL2x/4An+6mETpLrKJ5hQkB8W4kFAadeIQ==", "engines": { - "node": ">=10" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/motdotla/dotenv?sponsor=1" } }, "node_modules/dotenv-expand": { @@ -14476,6 +14506,11 @@ "node": ">= 0.10" } }, + "node_modules/proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" + }, "node_modules/psl": { "version": "1.9.0", "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", @@ -14878,6 +14913,14 @@ } } }, + "node_modules/react-scripts/node_modules/dotenv": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-10.0.0.tgz", + "integrity": "sha512-rlBi9d8jpv9Sf1klPjNfFAuWDjKLwTIJJ/VxtoTwIR6hnZxcEOQCZg2oIL3MWBYw5GpUDKOEnND7LXTbIpQ03Q==", + "engines": { + "node": ">=10" + } + }, "node_modules/react-transition-group": { "version": "4.4.5", "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.4.5.tgz", @@ -17821,6 +17864,19 @@ "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz", "integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==" }, + "node_modules/xml2js": { + "version": "0.2.8", + "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.2.8.tgz", + "integrity": "sha512-ZHZBIAO55GHCn2jBYByVPHvHS+o3j8/a/qmpEe6kxO3cTnTCWC3Htq9RYJ5G4XMwMMClD2QkXA9SNdPadLyn3Q==", + "dependencies": { + "sax": "0.5.x" + } + }, + "node_modules/xml2js/node_modules/sax": { + "version": "0.5.8", + "resolved": "https://registry.npmjs.org/sax/-/sax-0.5.8.tgz", + "integrity": "sha512-c0YL9VcSfcdH3F1Qij9qpYJFpKFKMXNOkLWFssBL3RuF7ZS8oZhllR2rWlCRjDTJsfq3R6wbSsaRU6o0rkEdNw==" + }, "node_modules/xmlchars": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", @@ -17882,6 +17938,39 @@ "funding": { "url": "https://github.com/sponsors/sindresorhus" } + }, + "node_modules/youtube-search": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/youtube-search/-/youtube-search-1.1.6.tgz", + "integrity": "sha512-AgDClD3KTJph0oA3QNypUpZH8qUJM2hevQAzIbpQ+gEYaqdIKUgBqhfciZ7ureOH+NSK7X9gYDo2tbvE46n7UA==", + "dependencies": { + "axios": "^0.21.1", + "xml2js": "~0.2.8" + } + }, + "node_modules/youtube-search-api": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/youtube-search-api/-/youtube-search-api-1.2.1.tgz", + "integrity": "sha512-XipSI06g/fYOVolMQoXlVIeE9IjYQZPUFly17VNm5pkX590OIo7tJWaLKI25RBTdP9y0KGEToxliFtTy8hvMyA==", + "dependencies": { + "axios": "^0.21.0" + } + }, + "node_modules/youtube-search-api/node_modules/axios": { + "version": "0.21.4", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.4.tgz", + "integrity": "sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==", + "dependencies": { + "follow-redirects": "^1.14.0" + } + }, + "node_modules/youtube-search/node_modules/axios": { + "version": "0.21.4", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.4.tgz", + "integrity": "sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==", + "dependencies": { + "follow-redirects": "^1.14.0" + } } } } diff --git a/package.json b/package.json index 975aa5d..6d02183 100644 --- a/package.json +++ b/package.json @@ -6,13 +6,17 @@ "@testing-library/jest-dom": "^5.17.0", "@testing-library/react": "^13.4.0", "@testing-library/user-event": "^13.5.0", + "axios": "^1.4.0", "bootstrap": "^5.3.1", + "dotenv": "^16.3.1", "react": "^18.2.0", "react-bootstrap": "^2.8.0", "react-dom": "^18.2.0", "react-scripts": "5.0.1", "split-pane-react": "^0.1.3", - "web-vitals": "^2.1.4" + "web-vitals": "^2.1.4", + "youtube-search": "^1.1.6", + "youtube-search-api": "^1.2.1" }, "scripts": { "start": "react-scripts start", diff --git a/src/App.jsx b/src/App.jsx index 2e3b8b6..84a673c 100644 --- a/src/App.jsx +++ b/src/App.jsx @@ -1,4 +1,4 @@ -import Sidebar from "./sections/Sidebar"; +import Chat from "./sections/Chat"; import Footer from "./sections/Footer"; import React, { useState, useEffect } from "react"; import SplitPane, { Pane } from "split-pane-react"; @@ -54,7 +54,7 @@ function App() { - + diff --git a/src/sections/Chat.jsx b/src/sections/Chat.jsx new file mode 100644 index 0000000..d47dc50 --- /dev/null +++ b/src/sections/Chat.jsx @@ -0,0 +1,38 @@ +import React, { useState, useEffect } from "react"; + +function Chat() { + const [searchResults, setSearchResults] = useState([]); + + useEffect(() => { + const apiKey = "AIzaSyCk_cO8UzS_H1vab6iGke7RSS0xJt1BAu8"; + const keyword = "react"; + const maxResults = 10; + + const apiUrl = `https://www.googleapis.com/youtube/v3/search?part=snippet&q=${keyword}&type=video&maxResults=${maxResults}&key=${apiKey}`; + + const fetchData = async () => { + try { + const response = await fetch(apiUrl); + const data = await response.json(); + setSearchResults(data.items); + } catch (error) { + console.error("Error fetching data:", error); + } + }; + + fetchData(); + }, []); + console.log(searchResults[0].snippet); + return ( +
+

Chat

+
    + {searchResults.map((result) => ( +
  • {result.snippet.title}
  • + ))} +
+
+ ); +} + +export default Chat; diff --git a/src/sections/Sidebar.jsx b/src/sections/Sidebar.jsx deleted file mode 100644 index 388524f..0000000 --- a/src/sections/Sidebar.jsx +++ /dev/null @@ -1,10 +0,0 @@ -import React, { useState } from "react"; - -function Sidebar() { - - return ( -
- ); -} - -export default Sidebar;