From fa097aedcf0947cbaf3199f9156af9da26326cfb Mon Sep 17 00:00:00 2001 From: haiderGithubOfficial Date: Sun, 6 Aug 2023 08:07:30 +0500 Subject: [PATCH] feat: contextAPI added --- src/App.js | 38 +++++-------------------- src/components/AddVideo.js | 39 ++++++++++++++------------ src/components/Video.js | 36 ++++++++++++------------ src/components/VideoList.js | 52 +++++++++++++++++------------------ src/contexts/videosContext.js | 46 +++++++++++++++++++++++++++++++ src/index.js | 5 +++- 6 files changed, 124 insertions(+), 92 deletions(-) create mode 100644 src/contexts/videosContext.js diff --git a/src/App.js b/src/App.js index 7b99e4a..cb4aa83 100644 --- a/src/App.js +++ b/src/App.js @@ -1,40 +1,16 @@ -import { useState } from 'react'; import './App.css'; import AddVideo from './components/AddVideo'; -import videoDB from './data/data'; import VideoList from './components/VideoList'; -function App() { - console.log('render App') - - const [videos,setVideos] = useState(videoDB); - const [editableVideo,setEditableVideo] = useState(null); - - function addVideos(video){ - setVideos([ - ...videos, - {...video, id: videos.length+1} - ]); - } - function deleteVideo(id){ - setVideos(videos.filter(video=>video.id!==id)) - } - function editVideo(id){ - setEditableVideo(videos.find(video=>video.id===id)) - } +import { useContext } from 'react'; +import { VideosContext } from './contexts/videosContext'; - function updateVideo(video){ - const index = videos.findIndex(v=>v.id===video.id) - const newVideos = [...videos] - newVideos.splice(index,1,video) - setVideos(newVideos) - } +function App() { + const { videos, setVideos } = useContext(VideosContext) return ( -
console.log('App')}> - - - - +
+ +
); } diff --git a/src/components/AddVideo.js b/src/components/AddVideo.js index d994576..527bd68 100644 --- a/src/components/AddVideo.js +++ b/src/components/AddVideo.js @@ -1,39 +1,44 @@ +import { VideosContext } from '../contexts/videosContext'; import './AddVideo.css'; -import {useEffect, useState} from 'react'; +import { useContext, useEffect, useState } from 'react'; const initialState = { - time: '1 month ago', - channel: 'Coder Dost', - verified: true, - title:'', - views:'' - } + time: '1 month ago', + channel: 'Coder Dost', + verified: true, + title: '', + views: '' +} -function AddVideo({addVideos,updateVideo,editableVideo}) { +function AddVideo() { + const { addVideos, updateVideo, editableVideo } = useContext(VideosContext); const [video, setVideo] = useState(initialState); function handleSubmit(e) { + e.stopPropagation() e.preventDefault(); - if(editableVideo){ + if (video.title === '' || video.views === '') return + if (editableVideo) { updateVideo(video) - }else{ + } else { addVideos(video) } - + setVideo(initialState) } function handleChange(e) { - setVideo({...video, - [e.target.name] : e.target.value + setVideo({ + ...video, + [e.target.name]: e.target.value }) } - useEffect(()=>{ - if(editableVideo){ + useEffect(() => { + if (editableVideo) { setVideo(editableVideo) } - },[editableVideo]) + }, [editableVideo]) return (
@@ -54,7 +59,7 @@ function AddVideo({addVideos,updateVideo,editableVideo}) {
); diff --git a/src/components/Video.js b/src/components/Video.js index 790264e..009d49e 100644 --- a/src/components/Video.js +++ b/src/components/Video.js @@ -1,27 +1,29 @@ +import { useContext } from 'react'; import './Video.css'; +import { VideosContext } from '../contexts/videosContext'; -function Video({title,id,channel="Coder Dost",views,time,verified,children,deleteVideo,editVideo}) { +function Video({ title, id, channel = "Coder Dost", views, time, verified, children }) { console.log('render Video') + const { deleteVideo, editVideo } = useContext(VideosContext); - return ( - <> + <>
- - -
- Katherine Johnson + + +
+ Katherine Johnson +
+
{title}
+
{channel} {verified && '✅'}
+
+ {views} views . {time} +
+
+ {children} +
-
{title}
-
{channel} {verified && '✅'}
-
- {views} views . {time} -
-
- {children} -
-
- + ); } diff --git a/src/components/VideoList.js b/src/components/VideoList.js index cc7bf1d..db11510 100644 --- a/src/components/VideoList.js +++ b/src/components/VideoList.js @@ -1,32 +1,32 @@ import Video from "./Video"; import PlayButton from "./PlayButton"; +import { useContext } from "react"; +import { VideosContext } from "../contexts/videosContext"; -function VideoList({videos,deleteVideo,editVideo}){ - - return( - <> - {videos.map((video) => ( - - ))} - - ) +function VideoList() { + const { videos } = useContext(VideosContext); + return ( + <> + {videos.map((video) => ( + + ))} + + ) } export default VideoList \ No newline at end of file diff --git a/src/contexts/videosContext.js b/src/contexts/videosContext.js new file mode 100644 index 0000000..d675d3e --- /dev/null +++ b/src/contexts/videosContext.js @@ -0,0 +1,46 @@ +import { createContext, useState } from "react"; +import videosDB from "../data/data"; + +const VideosContext = createContext({ + videos: null, + setVideos: () => { } +}) + +const VideosProvider = ({ children }) => { + const [videos, setVideos] = useState(videosDB); + const [editableVideo, setEditableVideo] = useState(null); + + function addVideos(video) { + setVideos([ + ...videos, + { ...video, id: videos.length + 1 } + ]); + } + function deleteVideo(id) { + setVideos(videos.filter(video => video.id !== id)) + } + function editVideo(id) { + setEditableVideo(videos.find(video => video.id === id)) + } + + function updateVideo(video) { + const index = videos.findIndex(v => v.id === video.id) + const newVideos = [...videos] + newVideos.splice(index, 1, video) + setVideos(newVideos) + } + + const value = { + videos, + setVideos, + addVideos, + deleteVideo, + editVideo, + updateVideo, + editableVideo + } + + return {children} +} + +export { VideosContext, VideosProvider } \ No newline at end of file diff --git a/src/index.js b/src/index.js index 7716fe4..4c55599 100644 --- a/src/index.js +++ b/src/index.js @@ -2,11 +2,14 @@ import React from 'react'; import ReactDOM from 'react-dom/client'; import './index.css'; import App from './App'; +import { VideosProvider } from './contexts/videosContext'; const root = ReactDOM.createRoot(document.getElementById('root')); root.render( - + + + );