Upload 6.24

This commit is contained in:
Andrew Trieu
2023-06-24 17:00:08 +03:00
parent 45b45c365b
commit f86409f665
5 changed files with 85 additions and 16 deletions

View File

@@ -2,9 +2,11 @@ import AnecdoteForm from "./components/AnecdoteForm";
import Notification from "./components/Notification"; import Notification from "./components/Notification";
import { useQuery, useQueryClient, useMutation } from "react-query"; import { useQuery, useQueryClient, useMutation } from "react-query";
import { getAnecdotes, updateAnecdote } from "./components/requests"; import { getAnecdotes, updateAnecdote } from "./components/requests";
import { useNotificationDispatch } from "./reducers/notificationReducer";
const App = () => { const App = () => {
const queryClient = useQueryClient(); const queryClient = useQueryClient();
const dispatch = useNotificationDispatch();
const mutation = useMutation(updateAnecdote, { const mutation = useMutation(updateAnecdote, {
onSuccess: (newAnecdote) => { onSuccess: (newAnecdote) => {
@@ -18,11 +20,18 @@ const App = () => {
}, },
}); });
const handleVote = (anecdote) => { const handleVote = async (anecdote) => {
mutation.mutate({ mutation.mutate({
...anecdote, ...anecdote,
votes: anecdote.votes + 1, votes: anecdote.votes + 1,
}); });
await dispatch({
type: "SET_NOTIFICATION",
data: `You voted '${anecdote.content}'`,
});
setTimeout(() => {
dispatch({ type: "CLEAR_NOTIFICATION" });
}, 5000);
}; };
const { data: anecdotes, status } = useQuery("anecdotes", getAnecdotes, { const { data: anecdotes, status } = useQuery("anecdotes", getAnecdotes, {

View File

@@ -1,19 +1,30 @@
import { useQueryClient, useMutation } from "react-query"; import { useQueryClient, useMutation } from "react-query";
import { createAnecdote } from "./requests"; import { createAnecdote } from "./requests";
import { useNotificationDispatch } from "../reducers/notificationReducer";
const AnecdoteForm = () => { const AnecdoteForm = () => {
const queryClient = useQueryClient(); const queryClient = useQueryClient();
const dispatch = useNotificationDispatch();
const mutation = useMutation(createAnecdote, { const mutation = useMutation(createAnecdote, {
onSuccess: (newAnecdote) => { onSuccess: (newAnecdote) => {
const anecdotes = queryClient.getQueryData("anecdotes"); const anecdotes = queryClient.getQueryData("anecdotes");
queryClient.setQueryData("anecdotes", [...anecdotes, newAnecdote]); queryClient.setQueryData("anecdotes", [...anecdotes, newAnecdote]);
}, },
onError: (err) => {
dispatch({
type: "SET_NOTIFICATION",
data: `An error occurred: ${err.response.data.error}`,
});
setTimeout(() => {
dispatch({ type: "CLEAR_NOTIFICATION" });
}, 5000);
},
}); });
const getId = () => (100000 * Math.random()).toFixed(0); const getId = () => (100000 * Math.random()).toFixed(0);
const onCreate = (event) => { const onCreate = async (event) => {
event.preventDefault(); event.preventDefault();
const content = event.target.anecdote.value; const content = event.target.anecdote.value;
event.target.anecdote.value = ""; event.target.anecdote.value = "";
@@ -22,6 +33,13 @@ const AnecdoteForm = () => {
id: getId(), id: getId(),
votes: 0, votes: 0,
}); });
await dispatch({
type: "SET_NOTIFICATION",
data: `You created '${content}'`,
});
setTimeout(() => {
dispatch({ type: "CLEAR_NOTIFICATION" });
}, 5000);
}; };
return ( return (

View File

@@ -1,18 +1,20 @@
import { useNotificationValue } from "../reducers/notificationReducer";
const Notification = () => { const Notification = () => {
const style = { const style = {
border: 'solid', border: "solid",
padding: 10, padding: 10,
borderWidth: 1, borderWidth: 1,
marginBottom: 5 marginBottom: 5,
};
const notification = useNotificationValue();
if (!notification) {
return null;
} }
if (true) return null
return ( return <div style={style}>{notification}</div>;
<div style={style}> };
</div>
)
}
export default Notification export default Notification;

View File

@@ -1,13 +1,16 @@
import React from "react"; import React from "react";
import ReactDOM from "react-dom/client"; import ReactDOM from "react-dom/client";
import { QueryClient, QueryClientProvider } from "react-query"; import { QueryClient, QueryClientProvider } from "react-query";
import { NotificationProvider } from "./reducers/notificationReducer";
import App from "./App"; import App from "./App";
const queryClient = new QueryClient(); const queryClient = new QueryClient();
ReactDOM.createRoot(document.getElementById("root")).render( ReactDOM.createRoot(document.getElementById("root")).render(
<QueryClientProvider client={queryClient}> <NotificationProvider>
<App /> <QueryClientProvider client={queryClient}>
</QueryClientProvider> <App />
</QueryClientProvider>
</NotificationProvider>
); );

View File

@@ -0,0 +1,37 @@
import { createContext, useReducer, useContext } from "react";
const notificationReducer = (state, action) => {
switch (action.type) {
case "SET_NOTIFICATION":
return action.data;
case "CLEAR_NOTIFICATION":
return null;
default:
return state;
}
};
const NotificationContext = createContext();
const NotificationProvider = ({ children }) => {
const [notification, dispatch] = useReducer(notificationReducer, " ");
return (
<NotificationContext.Provider value={{ notification, dispatch }}>
{children}
</NotificationContext.Provider>
);
};
const useNotificationValue = () => {
const notificationAndDispatch = useContext(NotificationContext);
return notificationAndDispatch.notification;
};
const useNotificationDispatch = () => {
const notificationAndDispatch = useContext(NotificationContext);
return notificationAndDispatch.dispatch;
};
export { NotificationProvider, useNotificationValue, useNotificationDispatch };
export default NotificationContext;