Browse Source

implendata pagina de listagem de encomendas

master
JailtonAraujo 3 years ago
parent
commit
6da99423b6
14 changed files with 585 additions and 63 deletions
  1. +52
    -0
      first-app/package-lock.json
  2. +2
    -0
      first-app/package.json
  3. +5
    -0
      first-app/src/Routes.tsx
  4. +1
    -1
      first-app/src/components/sideBar.tsx
  5. +1
    -1
      first-app/src/environments.ts
  6. +5
    -0
      first-app/src/interfaces/Encomenda.ts
  7. +246
    -0
      first-app/src/pages/Encomenda/Encomendas.tsx
  8. +118
    -52
      first-app/src/pages/Encomenda/NewEncomenda.tsx
  9. +22
    -7
      first-app/src/pages/Encomenda/encomenda.module.css
  10. +0
    -0
      first-app/src/pages/Encomenda/encomendaFilter.tsx
  11. +47
    -0
      first-app/src/services/EncomendaService.ts
  12. +11
    -1
      first-app/src/slices/CarrinhoSlice.ts
  13. +72
    -0
      first-app/src/slices/EncomendaSlice.ts
  14. +3
    -1
      first-app/src/store.ts

+ 52
- 0
first-app/package-lock.json View File

@ -12,6 +12,7 @@
"antd": "^5.6.2", "antd": "^5.6.2",
"react": "^18.2.0", "react": "^18.2.0",
"react-dom": "^18.2.0", "react-dom": "^18.2.0",
"react-highlight-words": "^0.20.0",
"react-redux": "^8.1.1", "react-redux": "^8.1.1",
"react-router-dom": "^6.13.0", "react-router-dom": "^6.13.0",
"react-toastify": "^9.1.3" "react-toastify": "^9.1.3"
@ -19,6 +20,7 @@
"devDependencies": { "devDependencies": {
"@types/react": "^18.0.37", "@types/react": "^18.0.37",
"@types/react-dom": "^18.0.11", "@types/react-dom": "^18.0.11",
"@types/react-highlight-words": "^0.16.4",
"@typescript-eslint/eslint-plugin": "^5.59.0", "@typescript-eslint/eslint-plugin": "^5.59.0",
"@typescript-eslint/parser": "^5.59.0", "@typescript-eslint/parser": "^5.59.0",
"@vitejs/plugin-react": "^4.0.0", "@vitejs/plugin-react": "^4.0.0",
@ -1211,6 +1213,15 @@
"@types/react": "*" "@types/react": "*"
} }
}, },
"node_modules/@types/react-highlight-words": {
"version": "0.16.4",
"resolved": "https://registry.npmjs.org/@types/react-highlight-words/-/react-highlight-words-0.16.4.tgz",
"integrity": "sha512-KITBX3xzheQLu2s3bUgLmRE7ekmhc52zRjRTwkKayQARh30L4fjEGzGm7ULK9TuX2LgxWWavZqyQGDGjAHbL3w==",
"dev": true,
"dependencies": {
"@types/react": "*"
}
},
"node_modules/@types/scheduler": { "node_modules/@types/scheduler": {
"version": "0.16.3", "version": "0.16.3",
"resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.3.tgz", "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.3.tgz",
@ -2398,6 +2409,11 @@
"node": ">=4" "node": ">=4"
} }
}, },
"node_modules/highlight-words-core": {
"version": "1.2.2",
"resolved": "https://registry.npmjs.org/highlight-words-core/-/highlight-words-core-1.2.2.tgz",
"integrity": "sha512-BXUKIkUuh6cmmxzi5OIbUJxrG8OAk2MqoL1DtO3Wo9D2faJg2ph5ntyuQeLqaHJmzER6H5tllCDA9ZnNe9BVGg=="
},
"node_modules/hoist-non-react-statics": { "node_modules/hoist-non-react-statics": {
"version": "3.3.2", "version": "3.3.2",
"resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz",
@ -2625,6 +2641,11 @@
"yallist": "^3.0.2" "yallist": "^3.0.2"
} }
}, },
"node_modules/memoize-one": {
"version": "4.0.3",
"resolved": "https://registry.npmjs.org/memoize-one/-/memoize-one-4.0.3.tgz",
"integrity": "sha512-QmpUu4KqDmX0plH4u+tf0riMc1KHE1+lw95cMrLlXQAFOx/xnBtwhZ52XJxd9X2O6kwKBqX32kmhbhlobD0cuw=="
},
"node_modules/merge2": { "node_modules/merge2": {
"version": "1.4.1", "version": "1.4.1",
"resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz",
@ -2701,6 +2722,14 @@
"integrity": "sha512-QzsYKWhXTWx8h1kIvqfnC++o0pEmpRQA/aenALsL2F4pqNVr7YzcdMlDij5WBnwftRbJCNJL/O7zdKaxKPHqgQ==", "integrity": "sha512-QzsYKWhXTWx8h1kIvqfnC++o0pEmpRQA/aenALsL2F4pqNVr7YzcdMlDij5WBnwftRbJCNJL/O7zdKaxKPHqgQ==",
"dev": true "dev": true
}, },
"node_modules/object-assign": {
"version": "4.1.1",
"resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
"integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==",
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/once": { "node_modules/once": {
"version": "1.4.0", "version": "1.4.0",
"resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
@ -2860,6 +2889,16 @@
"node": ">= 0.8.0" "node": ">= 0.8.0"
} }
}, },
"node_modules/prop-types": {
"version": "15.8.1",
"resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz",
"integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==",
"dependencies": {
"loose-envify": "^1.4.0",
"object-assign": "^4.1.1",
"react-is": "^16.13.1"
}
},
"node_modules/punycode": { "node_modules/punycode": {
"version": "2.3.0", "version": "2.3.0",
"resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz",
@ -3504,6 +3543,19 @@
"react": "^18.2.0" "react": "^18.2.0"
} }
}, },
"node_modules/react-highlight-words": {
"version": "0.20.0",
"resolved": "https://registry.npmjs.org/react-highlight-words/-/react-highlight-words-0.20.0.tgz",
"integrity": "sha512-asCxy+jCehDVhusNmCBoxDf2mm1AJ//D+EzDx1m5K7EqsMBIHdZ5G4LdwbSEXqZq1Ros0G0UySWmAtntSph7XA==",
"dependencies": {
"highlight-words-core": "^1.2.0",
"memoize-one": "^4.0.0",
"prop-types": "^15.5.8"
},
"peerDependencies": {
"react": "^0.14.0 || ^15.0.0 || ^16.0.0-0 || ^17.0.0-0 || ^18.0.0-0"
}
},
"node_modules/react-is": { "node_modules/react-is": {
"version": "16.13.1", "version": "16.13.1",
"resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz",


+ 2
- 0
first-app/package.json View File

@ -14,6 +14,7 @@
"antd": "^5.6.2", "antd": "^5.6.2",
"react": "^18.2.0", "react": "^18.2.0",
"react-dom": "^18.2.0", "react-dom": "^18.2.0",
"react-highlight-words": "^0.20.0",
"react-redux": "^8.1.1", "react-redux": "^8.1.1",
"react-router-dom": "^6.13.0", "react-router-dom": "^6.13.0",
"react-toastify": "^9.1.3" "react-toastify": "^9.1.3"
@ -21,6 +22,7 @@
"devDependencies": { "devDependencies": {
"@types/react": "^18.0.37", "@types/react": "^18.0.37",
"@types/react-dom": "^18.0.11", "@types/react-dom": "^18.0.11",
"@types/react-highlight-words": "^0.16.4",
"@typescript-eslint/eslint-plugin": "^5.59.0", "@typescript-eslint/eslint-plugin": "^5.59.0",
"@typescript-eslint/parser": "^5.59.0", "@typescript-eslint/parser": "^5.59.0",
"@vitejs/plugin-react": "^4.0.0", "@vitejs/plugin-react": "^4.0.0",


+ 5
- 0
first-app/src/Routes.tsx View File

@ -4,6 +4,7 @@ import Clientes from "./pages/Cliente/Clientes";
import NewProduto from "./pages/Produto/NewProduto"; import NewProduto from "./pages/Produto/NewProduto";
import Produtos from "./pages/Produto/Produtos"; import Produtos from "./pages/Produto/Produtos";
import NewEncomenda from "./pages/Encomenda/NewEncomenda"; import NewEncomenda from "./pages/Encomenda/NewEncomenda";
import Encomendas from "./pages/Encomenda/Encomendas";
export const Routes = [ export const Routes = [
@ -32,6 +33,10 @@ export const Routes = [
{ {
path: "/encomenda/new", path: "/encomenda/new",
element: <NewEncomenda/> element: <NewEncomenda/>
},
{
path:"/encomenda/list",
element: <Encomendas/>
} }
] ]
} }


+ 1
- 1
first-app/src/components/sideBar.tsx View File

@ -41,7 +41,7 @@ function SideBar () {
]), ]),
getItem('Encomendas', 'sub3', <ShoppingCartOutlined />, [ getItem('Encomendas', 'sub3', <ShoppingCartOutlined />, [
getItem((<Link to="/encomenda/new">Carrinho</Link>), '8'), getItem((<Link to="/encomenda/new">Carrinho</Link>), '8'),
getItem('Bill', '9'),
getItem((<Link to="/encomenda/list">Todas</Link>), '9'),
getItem('Alex', '10'), getItem('Alex', '10'),
]), ]),


+ 1
- 1
first-app/src/environments.ts View File

@ -1,3 +1,3 @@
export const Environments = { export const Environments = {
URLApi: "http://jailton.bootcamp.dev.netuno.org:20190/services/netunovendas"
URLApi: "https://jailton.bootcamp.dev.netuno.org:20193/services/netunovendas"
} }

+ 5
- 0
first-app/src/interfaces/Encomenda.ts View File

@ -0,0 +1,5 @@
export interface Encomenda {
cliente:string,
itens:[],
valor:number
}

+ 246
- 0
first-app/src/pages/Encomenda/Encomendas.tsx View File

@ -0,0 +1,246 @@
import styles from './encomenda.module.css';
import { Button, Input, InputRef, Select, Space, Table } from 'antd';
import Column from 'antd/es/table/Column';
import { SearchOutlined } from '@ant-design/icons';
import { useEffect, useRef, useState } from 'react';
import { ColumnType } from 'antd/es/table';
import Highlighter from 'react-highlight-words';
import { useDispatch, useSelector } from 'react-redux';
import {
getAllEncomenda
} from '../../slices/EncomendaSlice';
function Encomendas() {
const dispatch = useDispatch<any>();
const { encomendas, loading } = useSelector((state: any) => state.encomenda);
const [searchText, setSearchText] = useState('');
const [estadoFilter, setEstadoFilter] = useState('');
const [clienteFilter, setClienteFilter] = useState('');
const [dataFilter, setDataFilter] = useState('');
const [searchedColumn, setSearchedColumn] = useState('');
const searchInput = useRef<InputRef>(null);
const handleSearch = (
selectedKeys: string[],
dataIndex: any,
) => {
setSearchText(selectedKeys[0]);
setSearchedColumn(dataIndex);
if (dataIndex == 'data') {
setDataFilter(selectedKeys[0])
console.log(selectedKeys[0])
} else if (dataIndex == 'cliente') {
setClienteFilter(selectedKeys[0])
console.log(selectedKeys[0])
} else if (dataIndex == 'status') {
setEstadoFilter(selectedKeys[0]);
console.log(selectedKeys[0]);
}
};
const handleReset = (clearFilters: () => void) => {
clearFilters();
setSearchText('');
};
useEffect(() => {
dispatch(getAllEncomenda(
{
pagination: {
current: 1,
pageSize: 5
}
}
))
}, []);
// **Columns Filter**
const getColumnSearchProps = (dataIndex: any): ColumnType<any> => ({
filterDropdown: ({ setSelectedKeys, selectedKeys, clearFilters, close }) => (
<div style={{ padding: 8 }} onKeyDown={(e) => e.stopPropagation()}>
{dataIndex == 'status' ? (
<Select
options={[
{ value: '1', label: 'CREATED' },
{ value: '2', label: 'CANCELED' },
{ value: '3', label: 'FINISHED' }
]}
style={{ marginBottom: 8, display: 'block' }}
value={selectedKeys[0]}
/>
) :
(
<Input
ref={searchInput}
placeholder={`Search ${dataIndex}`}
type={(dataIndex == 'data_criacao' || dataIndex == 'data_envio') ? 'date' : 'text'}
value={selectedKeys[0]}
onChange={(e) => setSelectedKeys(e.target.value ? [e.target.value] : [])}
onPressEnter={() => handleSearch(selectedKeys as string[], dataIndex)}
style={{ marginBottom: 8, display: 'block' }}
/>
)}
<Space>
<Button
type="primary"
onClick={() => handleSearch(selectedKeys as string[], dataIndex)}
icon={<SearchOutlined />}
size="small"
style={{ width: 90 }}
>
Search
</Button>
<Button
onClick={() => clearFilters && handleReset(clearFilters)}
size="small"
style={{ width: 90 }}
>
Reset
</Button>
<Button
type="link"
size="small"
onClick={() => {
close();
}}
>
close
</Button>
</Space>
</div>
),
filterIcon: (filtered: boolean) => (
<SearchOutlined style={{ color: filtered ? '#1677ff' : undefined,fontSize:15 }} />
),
onFilter: (value, record) =>
record[dataIndex]
.toString()
.toLowerCase()
.includes((value as string).toLowerCase()),
onFilterDropdownOpenChange: (visible) => {
if (visible) {
setTimeout(() => searchInput.current?.select(), 100);
}
},
render: (text) =>
searchedColumn === dataIndex ? (
<Highlighter
highlightStyle={{ backgroundColor: '#ffc069', padding: 0 }}
searchWords={[searchText]}
autoEscape
textToHighlight={text ? text.toString() : ''}
/>
) : (
text
),
});
// **Columns Filter**
return (
<div className={styles.container_table}>
<Table
dataSource={
encomendas.map((encomenda: any) => (
{
key: encomenda.uid,
data_criacao: encomenda.data_criacao,
data_envio: encomenda.data_envio,
status: encomenda.status.nome,
valor: `R$ ${encomenda.valor}`
}
))
}
// pagination={{
// position: ["bottomCenter"],
// total: total,
// defaultPageSize: 5,
// onChange(page, pageSize) {
// onChangePage(page, pageSize)
// },
// pageSizeOptions: [5, 10, 15],
// showSizeChanger: true,
// onShowSizeChange(current, size) {
// onChangePage(current, size)
// },
// }}
loading={loading}
bordered={true}
>
<Column
title="Data Criação"
dataIndex="data_criacao"
key="data_criacao"
{...getColumnSearchProps('data_criacao')}
/>
<Column
title="Data Envio"
dataIndex="data_envio"
key="data_envio"
{...getColumnSearchProps('data_envio')}
/>
<Column
title="Cliente"
dataIndex="cliente"
key="cliente"
{...getColumnSearchProps('cliente')}
/>
<Column
title="Status"
dataIndex="status"
key="status"
{...getColumnSearchProps('status')}
/>
<Column
title="Valor"
dataIndex="valor"
key="valor"
/>
<Column
title="Actions"
key="action"
render={(_: any, record: any) => (
<Space size="middle">
{/* <Popconfirm
title="Atenção:"
description="Confirme a ação de delete!"
// onConfirm={() => { handleDelete(record.key) }}
okText="Sim"
cancelText="Não"
>
<Button value="small"
type="primary"
danger icon={<DeleteOutlined />}
size="large"
title="Deletar"
/>
</Popconfirm>
<Button
value="small"
type="primary"
icon={<EditOutlined />} size="large"
title="Atualizar"
// onClick={() => { navigate(`/cliente/new`) }}
/> */}
</Space>
)}
/>
</Table>
</div>
)
}
export default Encomendas;

+ 118
- 52
first-app/src/pages/Encomenda/NewEncomenda.tsx View File

@ -1,73 +1,139 @@
import { Button, Collapse, Popconfirm, Space, Table } from 'antd';
import { Button, Divider, Select, Space, Table } from 'antd';
import styles from './encomenda.module.css'; import styles from './encomenda.module.css';
import Column from 'antd/es/table/Column'; import Column from 'antd/es/table/Column';
import { useSelector } from 'react-redux';
import { useDispatch, useSelector } from 'react-redux';
import { ItemCart } from '../../interfaces/ItemCart'; import { ItemCart } from '../../interfaces/ItemCart';
import { import {
DeleteOutlined DeleteOutlined
} from '@ant-design/icons'; } from '@ant-design/icons';
import { removeItem } from '../../slices/CarrinhoSlice';
import { getAllClientes } from '../../slices/ClienteSlice';
import { useState } from 'react';
import { ParamsType } from '../../interfaces/ParamsType';
import { Cliente } from '../../interfaces/Cliente';
import { newEncomenda } from '../../slices/EncomendaSlice';
import { notify } from '../../hooks/useToastfy';
import Search from 'antd/es/input/Search';
import { Encomenda } from '../../interfaces/Encomenda';
function NewEncomenda() { function NewEncomenda() {
const { itens } = useSelector((state: any) => state.cart);
const dispatch = useDispatch<any>();
const { itens, valorTotal } = useSelector((state: any) => state.cart);
const { clientes, loading:loadingCliente } = useSelector((state:any) => state.cliente);
const { loading:loadingEncomenda } = useSelector((state:any) => state.encomenda);
const handleDelete = () => {
const [clienteUid, setCliente] = useState('');
const handleDelete = (uid: string) => {
dispatch(removeItem(uid));
}
const searchCliente = (nome:string) => {
const params: ParamsType = {
pagination: {
current: 1,
pageSize: 5
},
filter: {
nome: nome
}
}
dispatch(getAllClientes(params))
}
const handleFinalize = () => {
if (clienteUid == '' || clienteUid == null) {
notify('Selecione o cliente!','error')
return;
} else if (itens.length == 0) {
notify('A lista está vazia!','error')
return;
}
const encomenda:Encomenda = {
itens:itens,
cliente:clienteUid,
valor:valorTotal
}
dispatch(newEncomenda(encomenda));
} }
return ( return (
<div className={styles.container_table}>
<Collapse
size="large"
items={[{
key: '1', label: 'Itens da encomenda.', children: (
<Table
dataSource={
itens.map((item: ItemCart) => (
{ key: item.produto.uid, name: item.produto.nome, quantidade: item.quantidade, preco: item.produto.preco }
))
}
pagination={false}
bordered={true}
scroll={{ x: 300, y: 300 }}
>
<Column title="Nome" dataIndex="name" key="name" />
<Column title="Quantidade" dataIndex="quantidade" key="quantidade" />
<Column title="Preço" dataIndex="preco" key="preco" />
<Column
title="Actions"
key="action"
render={(_: any) => (
<Space size="middle">
<Popconfirm
title="Atenção:"
description="Confirme a ação de delete!"
onConfirm={() => { handleDelete() }}
okText="Sim"
cancelText="Não"
>
<Button value="small"
type="primary"
danger icon={<DeleteOutlined />}
size="large"
title="Deletar"
/>
</Popconfirm>
</Space>
)}
<div className={styles.container_encomenda}>
<Table
dataSource={
itens.map((item: ItemCart) => (
{ key: item.produto.uid, name: item.produto.nome, quantidade: item.quantidade, preco: item.produto.preco }
))
}
pagination={false}
bordered={true}
scroll={{ x: 300, y: 300 }}
style={{minHeight:300}}
>
<Column title="Nome" dataIndex="name" key="name" />
<Column title="Quantidade" dataIndex="quantidade" key="quantidade" />
<Column title="Preço" dataIndex="preco" key="preco" />
<Column
title="Actions"
key="action"
render={(_: any, record: any) => (
<Space size="middle">
<Button value="small"
type="primary"
danger icon={<DeleteOutlined />}
size="large"
title="Deletar"
onClick={() => { handleDelete(record.key) }}
/> />
</Space>
)}
/>
</Table>
<Divider style={{ backgroundColor: '#000' }} />
<div className={styles.container_cliente}>
<Select
style={{ width: 300 }}
placeholder="Selecione o cliente"
optionFilterProp="children"
onChange={setCliente}
loading={loadingCliente}
options={
clientes.map((cliente:Cliente) => (
{value:cliente.uid, label:cliente.nome}
))
}
/>
<Search
placeholder="Buscar cliente por nome"
enterButton
style={{ width: 300 }}
onSearch={searchCliente}
loading={loadingCliente}
/>
</div>
</Table>
<Divider style={{ backgroundColor: '#000' }} />
)
}]}
<div className={styles.container_finalize}>
<div className={styles.container_finalize__total}>
<span>Total: </span> <span>{`R$ ${valorTotal.toFixed(2)}`}</span>
</div>
<Button type="primary"
onClick={handleFinalize}
disabled={itens.length == 0}
loading={loadingEncomenda}
>Finalizar Encomenda
</Button>
</div>
/>
</div> </div>
) )
} }


+ 22
- 7
first-app/src/pages/Encomenda/encomenda.module.css View File

@ -1,18 +1,33 @@
.container_table {
.container_encomenda {
width: 800px; width: 800px;
height: 100%; height: 100%;
margin-top: 3em; margin-top: 3em;
gap: 1em;
display: flex; display: flex;
flex-direction: column; flex-direction: column;
} }
.container_table__filter{
width: 100%;
.container_cliente {
display: flex;
justify-content: space-between;
align-items: baseline;
gap: 0.5em;
}
.container_finalize{
display: flex; display: flex;
justify-content: end;
margin-bottom: 1em;
justify-content: space-between;
align-items: center;
width: 100%;
} }
.container_table__search{
width: 300px;
.container_finalize__total{
font-size: 1.3em;
} }
.container_table {
width: 800px;
display: flex;
flex-direction: column;
}

+ 0
- 0
first-app/src/pages/Encomenda/encomendaFilter.tsx View File


+ 47
- 0
first-app/src/services/EncomendaService.ts View File

@ -0,0 +1,47 @@
import { Environments} from "../environments";
import { Encomenda } from "../interfaces/Encomenda";
import { ParamsType } from "../interfaces/ParamsType";
const { URLApi } = Environments;
const newEncomenda = async (encomenda:Encomenda) => {
const config = {
method:"POST",
body:JSON.stringify(encomenda),
headers: {
"Content-type":"application/json",
}
}
try {
const data = await fetch(`${URLApi}/encomenda`,config)
.then((res)=>res.json())
.catch((err)=>err);
return data;
} catch (error) {
console.log(error)
}
}
const getAllEncomenda = async (parans:ParamsType) => {
const config = {
method:"POST",
body:JSON.stringify(parans),
headers: {
"Content-type":"application/json",
}
}
const data = await fetch(`${URLApi}/encomenda/list`,config)
.then((res)=>res.json())
.catch((err)=>err);
return data;
}
export const encomendaService = {
newEncomenda,
getAllEncomenda
}

+ 11
- 1
first-app/src/slices/CarrinhoSlice.ts View File

@ -22,7 +22,13 @@ export const addItem = createAsyncThunk(
} }
) )
export const removeItem = createAsyncThunk(
"cart/remove",
async (uid:string) => {
return uid;
}
)
export const cartSlice = createSlice({ export const cartSlice = createSlice({
name:"cliente", name:"cliente",
@ -43,7 +49,11 @@ export const cartSlice = createSlice({
notify('Produto adicionado com sucessso!','success') notify('Produto adicionado com sucessso!','success')
}) })
.addCase(removeItem.fulfilled,(state,action:any)=>{
state.itens = state.itens.filter((item:ItemCart) => (item.produto.uid != action.payload));
state.valorTotal = calclQuantidade(state.itens);
notify('Produto removido com sucessso!','success')
})
}, },
}); });


+ 72
- 0
first-app/src/slices/EncomendaSlice.ts View File

@ -0,0 +1,72 @@
import { createAsyncThunk, createSlice } from "@reduxjs/toolkit";
import { notify } from "../hooks/useToastfy";
import { Encomenda } from "../interfaces/Encomenda";
import { encomendaService } from "../services/EncomendaService";
import { ParamsType } from "../interfaces/ParamsType";
const initialState = {
encomendas:[] as any,
loading:false,
error:false,
message:''
}
export const newEncomenda = createAsyncThunk(
"encomenda/new",
async (encomenda:Encomenda, ThunkApi) => {
const data = await encomendaService.newEncomenda(encomenda);
if (data.error) {
return ThunkApi.rejectWithValue(data);
}
return data;
}
)
export const getAllEncomenda = createAsyncThunk(
"encomenda/getAll",
async (parans:ParamsType) => {
const data = await encomendaService.getAllEncomenda(parans);
return data;
}
)
export const encomendaSlice = createSlice({
name:"cliente",
initialState,
reducers:{
resetState:(state)=>{
state.loading = false,
state.error = false;
state.message = ''
},
},
extraReducers(builder) {
builder
.addCase(newEncomenda.pending,(state)=>{
state.loading = true;
}).addCase(newEncomenda.fulfilled,(state)=>{
state.loading = false;
state.error = false;
notify('Encomenda feita com sucesso!','success')
}).addCase(newEncomenda.rejected,(state,action:any)=>{
state.loading = false,
state.error = true;
state.message = action.payload.messege ? action.payload.messege : '';
notify(state.message,'error');
})
.addCase(getAllEncomenda.pending,(state)=>{
state.loading = true;
}).addCase(getAllEncomenda.fulfilled,(state, action:any)=>{
state.loading = false;
state.error = false;
state.encomendas = action.payload.results;
})
},
});
export const { resetState } = encomendaSlice.actions;
export default encomendaSlice.reducer;

+ 3
- 1
first-app/src/store.ts View File

@ -4,11 +4,13 @@ import { configureStore } from "@reduxjs/toolkit";
import ClienteSlice from "./slices/ClienteSlice"; import ClienteSlice from "./slices/ClienteSlice";
import ProdutoSlice from "./slices/ProdutoSlice"; import ProdutoSlice from "./slices/ProdutoSlice";
import CarrinhoSlice from "./slices/CarrinhoSlice"; import CarrinhoSlice from "./slices/CarrinhoSlice";
import EncomendaSlice from "./slices/EncomendaSlice";
export default configureStore({ export default configureStore({
reducer:{ reducer:{
cliente:ClienteSlice, cliente:ClienteSlice,
produto:ProdutoSlice, produto:ProdutoSlice,
cart:CarrinhoSlice
cart:CarrinhoSlice,
encomenda:EncomendaSlice
} }
}) })

Loading…
Cancel
Save