This commit is contained in:
QkoSad
2023-08-08 16:02:54 +03:00
commit 0a7a469d56
315 changed files with 426907 additions and 0 deletions
+29310
View File
File diff suppressed because it is too large Load Diff
+39
View File
@@ -0,0 +1,39 @@
{
"name": "routed-anecdotes",
"version": "0.1.0",
"private": true,
"dependencies": {
"@testing-library/jest-dom": "^5.16.5",
"@testing-library/react": "^13.4.0",
"@testing-library/user-event": "^13.5.0",
"react": "^18.2.0",
"react-dom": "^18.2.0",
"react-router-dom": "^6.13.0",
"react-scripts": "5.0.1",
"web-vitals": "^2.1.4"
},
"scripts": {
"start": "react-scripts start",
"build": "react-scripts build",
"test": "react-scripts test",
"eject": "react-scripts eject"
},
"eslintConfig": {
"extends": [
"react-app",
"react-app/jest"
]
},
"browserslist": {
"production": [
">0.2%",
"not dead",
"not op_mini all"
],
"development": [
"last 1 chrome version",
"last 1 firefox version",
"last 1 safari version"
]
}
}
Binary file not shown.

After

Width:  |  Height:  |  Size: 3.8 KiB

+43
View File
@@ -0,0 +1,43 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8" />
<link rel="icon" href="%PUBLIC_URL%/favicon.ico" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<meta name="theme-color" content="#000000" />
<meta
name="description"
content="Web site created using create-react-app"
/>
<link rel="apple-touch-icon" href="%PUBLIC_URL%/logo192.png" />
<!--
manifest.json provides metadata used when your web app is installed on a
user's mobile device or desktop. See https://developers.google.com/web/fundamentals/web-app-manifest/
-->
<link rel="manifest" href="%PUBLIC_URL%/manifest.json" />
<!--
Notice the use of %PUBLIC_URL% in the tags above.
It will be replaced with the URL of the `public` folder during the build.
Only files inside the `public` folder can be referenced from the HTML.
Unlike "/favicon.ico" or "favicon.ico", "%PUBLIC_URL%/favicon.ico" will
work correctly both with client-side routing and a non-root public URL.
Learn how to configure a non-root public URL by running `npm run build`.
-->
<title>React App</title>
</head>
<body>
<noscript>You need to enable JavaScript to run this app.</noscript>
<div id="root"></div>
<!--
This HTML file is a template.
If you open it directly in the browser, you will see an empty page.
You can add webfonts, meta tags, or analytics to this file.
The build step will place the bundled scripts into the <body> tag.
To begin the development, run `npm start` or `yarn start`.
To create a production bundle, use `npm run build` or `yarn build`.
-->
</body>
</html>
Binary file not shown.

After

Width:  |  Height:  |  Size: 5.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.4 KiB

+25
View File
@@ -0,0 +1,25 @@
{
"short_name": "React App",
"name": "Create React App Sample",
"icons": [
{
"src": "favicon.ico",
"sizes": "64x64 32x32 24x24 16x16",
"type": "image/x-icon"
},
{
"src": "logo192.png",
"type": "image/png",
"sizes": "192x192"
},
{
"src": "logo512.png",
"type": "image/png",
"sizes": "512x512"
}
],
"start_url": ".",
"display": "standalone",
"theme_color": "#000000",
"background_color": "#ffffff"
}
+3
View File
@@ -0,0 +1,3 @@
# https://www.robotstxt.org/robotstxt.html
User-agent: *
Disallow:
+193
View File
@@ -0,0 +1,193 @@
import { useState } from "react";
import {
BrowserRouter as Router,
Route,
Link,
Routes,
useParams,
useNavigate,
} from "react-router-dom";
import { useField } from "./hooks";
const Menu = ({ anecdotes, addNew, notification }) => {
const padding = {
paddingRight: 5,
};
const visibleStyle = {
display: notification ? "" : "none",
};
return (
<Router>
<div>
<Link style={padding} to="/">
anecdotes
</Link>
<Link style={padding} to="/new">
create new
</Link>
<Link style={padding} to="/about">
about
</Link>
<div style={visibleStyle}>{notification}</div>
</div>
<Routes>
<Route path="/" element={<AnecdoteList anecdotes={anecdotes} />} />
<Route path="/about" element={<About />} />
<Route path="/new" element={<CreateNew addNew={addNew} />} />
<Route
path="/anecdotes/:id"
element={<Anecdote anecdotes={anecdotes} />}
/>
</Routes>
</Router>
);
};
const Anecdote = ({ anecdotes }) => {
const id = useParams().id;
const anecdote = anecdotes.find((el) => el.id === Number(id));
return <h3>{anecdote.content}</h3>;
};
const AnecdoteList = ({ anecdotes }) => (
<div>
<h2>Anecdotes</h2>
<ul>
{anecdotes.map((anecdote) => (
<li key={anecdote.id}>
<Link to={`/anecdotes/${anecdote.id}`}>{anecdote.content}</Link>
</li>
))}
</ul>
</div>
);
const About = () => (
<div>
<h2>About anecdote app</h2>
<p>According to Wikipedia:</p>
<em>
An anecdote is a brief, revealing account of an individual person or an
incident. Occasionally humorous, anecdotes differ from jokes because their
primary purpose is not simply to provoke laughter but to reveal a truth
more general than the brief tale itself, such as to characterize a person
by delineating a specific quirk or trait, to communicate an abstract idea
about a person, place, or thing through the concrete details of a short
narrative. An anecdote is "a story with a point."
</em>
<p>
Software engineering is full of excellent anecdotes, at this app you can
find the best and add more.
</p>
</div>
);
const Footer = () => (
<div>
Anecdote app for <a href="https://fullstackopen.com/">Full Stack Open</a>.
See{" "}
<a href="https://github.com/fullstack-hy2020/routed-anecdotes/blob/master/src/App.js">
https://github.com/fullstack-hy2020/routed-anecdotes/blob/master/src/App.js
</a>{" "}
for the source code.
</div>
);
const CreateNew = (props) => {
const navigate = useNavigate();
const content = useField("content");
const info = useField("info");
const author = useField("author");
const handleSubmit = (e) => {
e.preventDefault();
props.addNew({
content: content.field,
author: author.field,
info: info.field,
votes: 0,
});
navigate("/");
};
const handleReset = (e) => {
e.preventDefault();
content[1].reset();
info[1].reset();
author[1].reset();
};
return (
<div>
<h2>create a new anecdote</h2>
<form onSubmit={handleSubmit} onReset={handleReset}>
<div>
content
<input {...content[0]} />
</div>
<div>
author
<input {...author[0]} />
</div>
<div>
url for more info
<input {...info[0]} />
</div>
<button>create</button>
<button type="reset">reset</button>
</form>
</div>
);
};
const App = () => {
const [anecdotes, setAnecdotes] = useState([
{
content: "If it hurts, do it more often",
author: "Jez Humble",
info: "https://martinfowler.com/bliki/FrequencyReducesDifficulty.html",
votes: 0,
id: 1,
},
{
content: "Premature optimization is the root of all evil",
author: "Donald Knuth",
info: "http://wiki.c2.com/?PrematureOptimization",
votes: 0,
id: 2,
},
]);
const [notification, setNotification] = useState("");
const addNew = (anecdote) => {
anecdote.id = Math.round(Math.random() * 10000);
setAnecdotes(anecdotes.concat(anecdote));
setNotification("you have added a new anecdote");
setTimeout(() => setNotification(""), 5000);
};
const anecdoteById = (id) => anecdotes.find((a) => a.id === id);
const vote = (id) => {
const anecdote = anecdoteById(id);
const voted = {
...anecdote,
votes: anecdote.votes + 1,
};
setAnecdotes(anecdotes.map((a) => (a.id === id ? voted : a)));
};
return (
<div>
<h1>Software anecdotes</h1>
<Menu anecdotes={anecdotes} addNew={addNew} notification={notification} />
<Footer />
</div>
);
};
export default App;
+13
View File
@@ -0,0 +1,13 @@
import { useState } from "react";
export const useField = (name) => {
const [value,setValue] = useState("");
const onChange = (e) => {
setValue(e.target.value);
};
const reset = (e)=>{
setValue('')
}
return [{ value, onChange, name },{reset}];
};
+5
View File
@@ -0,0 +1,5 @@
import React from 'react'
import ReactDOM from 'react-dom/client'
import App from './App'
ReactDOM.createRoot(document.getElementById('root')).render(<App />)