Skip to content

Commit 4cccae0

Browse files
authored
Merge pull request #8 from SOS-RS/feat/create-shelter
Feat/create shelter
2 parents 94fd96a + 9bdad1e commit 4cccae0

File tree

7 files changed

+163
-3
lines changed

7 files changed

+163
-3
lines changed
Lines changed: 148 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,148 @@
1+
import { ChevronLeft } from 'lucide-react';
2+
import { useNavigate } from 'react-router-dom';
3+
import { useFormik } from 'formik';
4+
import * as Yup from 'yup';
5+
6+
import {
7+
Select,
8+
SelectContent,
9+
SelectItem,
10+
SelectTrigger,
11+
SelectValue,
12+
} from '@/components/ui/select';
13+
import { Header, TextField } from '@/components';
14+
import { Button } from '@/components/ui/button';
15+
import { ICreateShelter } from '@/service/shelter/types';
16+
17+
const CreateShelter = () => {
18+
const navigate = useNavigate();
19+
20+
const verifySelected = (selected: string) => {
21+
if (selected === 'sim') return true;
22+
return false;
23+
};
24+
25+
const { errors, getFieldProps, isSubmitting, setFieldValue, handleSubmit } =
26+
useFormik<ICreateShelter>({
27+
initialValues: {
28+
name: '',
29+
address: '',
30+
shelteredPeople: 0,
31+
capacity: 0,
32+
petFriendly: false,
33+
contact: '',
34+
pix: '',
35+
},
36+
enableReinitialize: true,
37+
validateOnBlur: false,
38+
validateOnChange: false,
39+
validateOnMount: false,
40+
validationSchema: Yup.object().shape({
41+
name: Yup.string().required('Este campo deve ser preenchido'),
42+
address: Yup.string().required('Este campo deve ser preenchido'),
43+
}),
44+
onSubmit: async (values) => {
45+
//criar endpoint
46+
console.log(values);
47+
},
48+
});
49+
50+
return (
51+
<div className="flex flex-col h-screen items-center">
52+
<Header
53+
title="Cadastrar novo abrigo"
54+
className="bg-white [&_*]:text-zinc-800 border-b-[1px] border-b-border"
55+
startAdornment={
56+
<Button
57+
variant="ghost"
58+
className="[&_svg]:stroke-blue-500"
59+
onClick={() => navigate(-1)}
60+
>
61+
<ChevronLeft size={20} />
62+
</Button>
63+
}
64+
/>
65+
<div className="p-4 flex flex-col max-w-5xl w-full gap-3 items-start h-full">
66+
<form className="contents" onSubmit={handleSubmit}>
67+
<h6 className="text-2xl font-semibold">Cadastrar novo abrigo</h6>
68+
<p className="text-muted-foreground">
69+
Adicione as informações necessarias para o cadastro do novo abrigo.
70+
</p>
71+
<div className=" flex flex-col max-w-5xl w-full gap-2 items-start">
72+
<TextField
73+
label="Nome do abrigo"
74+
{...getFieldProps('name')}
75+
error={!!errors.name}
76+
helperText={errors.name}
77+
/>
78+
79+
<TextField
80+
label="Endereço do abrigo"
81+
{...getFieldProps('address')}
82+
error={!!errors.address}
83+
helperText={errors.address}
84+
/>
85+
86+
<TextField
87+
label="Contato"
88+
{...getFieldProps('contact')}
89+
error={!!errors.contact}
90+
helperText={errors.contact}
91+
/>
92+
93+
<TextField
94+
type="number"
95+
label="Quantidade de pessoas abrigadas"
96+
{...getFieldProps('shelteredPeople')}
97+
error={!!errors.shelteredPeople}
98+
helperText={errors.shelteredPeople}
99+
/>
100+
101+
<TextField
102+
type="number"
103+
label="Capacidade do abrigo"
104+
{...getFieldProps('capacity')}
105+
error={!!errors.capacity}
106+
helperText={errors.capacity}
107+
/>
108+
109+
<label className="text-muted-foreground">
110+
O abrigo aceita animais
111+
</label>
112+
<Select
113+
onValueChange={(v) => {
114+
setFieldValue('petFriendly', verifySelected(v));
115+
}}
116+
>
117+
<SelectTrigger className="w-full">
118+
<SelectValue className="text-muted-foreground" />
119+
</SelectTrigger>
120+
<SelectContent>
121+
<SelectItem value="sim">Sim</SelectItem>
122+
<SelectItem value="nao">Não</SelectItem>
123+
</SelectContent>
124+
</Select>
125+
126+
<TextField
127+
label="Chave pix"
128+
{...getFieldProps('pix')}
129+
error={!!errors.pix}
130+
helperText={errors.pix}
131+
/>
132+
</div>
133+
<div className="flex flex-1 flex-col justify-end md:justify-start w-full py-6">
134+
<Button
135+
loading={isSubmitting}
136+
type="submit"
137+
className="flex gap-2 text-white font-medium text-lg bg-blue-500 hover:bg-blue-600 w-full"
138+
>
139+
Cadastrar
140+
</Button>
141+
</div>
142+
</form>
143+
</div>
144+
</div>
145+
);
146+
};
147+
148+
export { CreateShelter };

src/pages/CreateShelter/index.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
import { CreateShelter } from './CreateShelter';
2+
3+
export { CreateShelter };

src/pages/CreateShelter/types.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
export {};

src/pages/Home/Home.tsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -92,6 +92,7 @@ const Home = () => {
9292
<Search name="search" size="20" className="stroke-zinc-300" />
9393
</div>
9494
</div>
95+
<div></div>
9596
{/* <div className="[&_svg]:stroke-blue-500">
9697
<Button variant="ghost" size="sm" className="flex gap-2 items-center">
9798
<ListFilter className="h-5 w-5" />

src/pages/index.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,5 +4,6 @@ import { Home } from './Home';
44
import { Shelter } from './Shelter';
55
import { ShelterItem } from './ShelterItem';
66
import { CreateSupply } from './CreateSupply';
7+
import { CreateShelter } from './CreateShelter';
78

8-
export { SignIn, Home, Shelter, ShelterItem, CreateSupply };
9+
export { SignIn, Home, Shelter, ShelterItem, CreateSupply, CreateShelter };

src/routes/Routes.tsx

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,18 @@
11
import { Routes as Switch, Route, Navigate } from 'react-router-dom';
22

3-
import { CreateSupply, Home, Shelter, ShelterItem } from '@/pages';
3+
import {
4+
CreateShelter,
5+
CreateSupply,
6+
Home,
7+
Shelter,
8+
ShelterItem,
9+
} from '@/pages';
410

511
const Routes = () => {
612
return (
713
<Switch>
814
<Route path="/abrigo/:id" element={<Shelter />} />
15+
<Route path="/abrigo/cadastrar" element={<CreateShelter />} />
916
<Route path="/abrigo/:shelterId/items" element={<ShelterItem />} />
1017
<Route
1118
path="/abrigo/:shelterId/item/cadastrar"

src/service/shelter/types.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@ export interface IShelter {
66
petFriendly?: boolean | null;
77
shelteredPeople?: number | null;
88
capacity?: number | null;
9-
prioritySum: number;
109
contact?: string | null;
1110
createdAt: string;
1211
updatedAt?: string | null;

0 commit comments

Comments
 (0)