Skip to content

Commit

Permalink
feat: api slice (#3)
Browse files Browse the repository at this point in the history
  • Loading branch information
tobiasprima authored Mar 19, 2024
2 parents be9b826 + ef26e45 commit c30cd31
Show file tree
Hide file tree
Showing 8 changed files with 3,096 additions and 1,439 deletions.
4,447 changes: 3,025 additions & 1,422 deletions package-lock.json

Large diffs are not rendered by default.

2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@
"@testing-library/user-event": "^13.5.0",
"react": "^18.2.0",
"react-dom": "^18.2.0",
"react-redux": "^8.1.3",
"react-scripts": "5.0.1",
"web-vitals": "^2.1.4"
},
Expand Down Expand Up @@ -43,7 +44,6 @@
},
"devDependencies": {
"@babel/core": "^7.24.1",
"@babel/plugin-proposal-private-property-in-object": "^7.21.11",
"@babel/preset-env": "^7.24.1",
"@babel/preset-react": "^7.24.1",
"@testing-library/react": "^14.2.1",
Expand Down
29 changes: 19 additions & 10 deletions src/App.test.js
Original file line number Diff line number Diff line change
@@ -1,13 +1,18 @@
import { render, screen, fireEvent } from '@testing-library/react';
import React from 'react';
import { render, screen, fireEvent, act } from '@testing-library/react';
import TodoList from './features/todos/TodoList';
import React from 'react';
import { store } from './app/store';
import { Provider } from 'react-redux';


test('renders todo list', () => {
render(<TodoList />);
render(
<Provider store={store}>
<TodoList />
</Provider>
);

render(<TodoList />);

const headingElement = screen.getAllByRole('heading', { name: /todo list/i })[0];
const headingElement = screen.getByRole('heading', { name: /todo list/i });
expect(headingElement).toBeInTheDocument();

const inputElement = screen.getByLabelText(/Add to list/i);
Expand All @@ -18,11 +23,15 @@ test('renders todo list', () => {
expect(submitButton).toBeInTheDocument();
});


test('allows user to type in a new todo', () => {
render(<TodoList />);
render(
<Provider store={store}>
<TodoList />
</Provider>);

const inputElement = screen.getByLabelText(/Add to list/i);
fireEvent.change(inputElement, { target: { value: 'New Todo Item' } });
act(() => {
fireEvent.change(inputElement, { target: { value: 'New Todo Item' } });
});
expect(inputElement.value).toBe('New Todo Item');
});
});
15 changes: 15 additions & 0 deletions src/app/api/apiSlice.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
import { createApi, fetchBaseQuery } from '@reduxjs/toolkit/query/react'

export const apiSlice = createApi({
reducerPath: 'api',
baseQuery: fetchBaseQuery({ baseUrl: 'http://localhost:8080' }),
endpoints: (builder) => ({
getTodos: builder.query({
query: () => '/todos'
})
})
})

export const {
useGetTodosQuery
} = apiSlice
13 changes: 13 additions & 0 deletions src/app/store.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
import { configureStore } from "@reduxjs/toolkit";
import { apiSlice } from "./api/apiSlice";
import { setupListeners } from "@reduxjs/toolkit/query";

export const store = configureStore({
reducer: {
[apiSlice.reducerPath]: apiSlice.reducer,
},
middleware: getDefaultMiddleware => getDefaultMiddleware().concat(apiSlice.middleware),
devTools: false
})

setupListeners(store.dispatch);
16 changes: 16 additions & 0 deletions src/features/todos/TodoList.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,19 @@ import React from 'react'
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'
import { faTrash, faUpload } from '@fortawesome/free-solid-svg-icons'
import { useState } from 'react'
import { useGetTodosQuery } from '../../app/api/apiSlice'

const TodoList = () => {
const [ newTodo, setNewTodo ] = useState('')

const {
data: todos,
isLoading,
isSuccess,
isError,
error
} = useGetTodosQuery()

const handleSubmit = (e)=> {
e.preventDefault()
//addTodo
Expand All @@ -30,6 +39,13 @@ const TodoList = () => {
</form>

let content;
if (isLoading) {
content = <p>Loading ...</p>
} else if (isSuccess){
content = JSON.stringify(todos)
} else if (isError) {
content = <p>{error.message || 'Error fetching todos'}</p>
}

return (
<main>
Expand Down
9 changes: 7 additions & 2 deletions src/index.js
Original file line number Diff line number Diff line change
@@ -1,11 +1,16 @@
import React from 'react';
import ReactDOM from 'react-dom/client';
import ReactDOM from 'react-dom';
import './index.css';
import App from './App';

import { Provider } from 'react-redux';
import { store } from './app/store';

const root = ReactDOM.createRoot(document.getElementById('root'));
root.render(
<React.StrictMode>
<App />
<Provider store={store}>
<App />
</Provider>
</React.StrictMode>
);
4 changes: 0 additions & 4 deletions src/setupTests.js
Original file line number Diff line number Diff line change
@@ -1,5 +1 @@
// jest-dom adds custom jest matchers for asserting on DOM nodes.
// allows you to do things like:
// expect(element).toHaveTextContent(/react/i)
// learn more: https://github.com/testing-library/jest-dom
import '@testing-library/jest-dom';

0 comments on commit c30cd31

Please sign in to comment.