Skip to content

Commit 5e94e5d

Browse files
authored
Merge develop to staging (#289) (#290)
* feat: added shelter category * setup shadcdn combobox * remove new item btn * add autocomplete with search * handle add new item * add clear feat * cleanup * cleanup * cleanup * fix imports * fix: new item keeps on when item selected * update text * add text above list * add initial filter to show only stored supplies * Add contributing * remove unused import ---------
2 parents ac48abc + 637e7b8 commit 5e94e5d

File tree

7 files changed

+301
-71
lines changed

7 files changed

+301
-71
lines changed

CONTRIBUTING.md

Lines changed: 127 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,127 @@
1+
# Contribuindo
2+
3+
Você pode contribuir com o projeto de diversas formas, implementando uma
4+
funcionalidade nova, corrigindo um bug, procurando bugs, revisando pull
5+
requests, entre outras.
6+
Para se inteirar do projeto, entre no
7+
[Discord](https://discord.gg/vjZS6BQXvM) e participe das discussões.
8+
9+
## 🤝 Contribuindo com atividades que não são de código
10+
11+
O projeto precisa de ajuda em diversas frentes diferentes como: QA, produto,
12+
design e gestão. Entre no servidor do Discord onde há canais específicos para
13+
essas atividades.
14+
15+
Se você encontrou um bug, vá nas
16+
[issues](https://github.com/SOS-RS/frontend/issues)
17+
do projeto e reporte-o lá. Verifique antes se já não existe um bug aberto para o
18+
problema que quer relatar, usando a busca. O mesmo vale para novas
19+
funcionalidades.
20+
21+
O restante deste documento focará nas contribuições de código.
22+
23+
## ✅ Escolhendo qual será sua contribuição de código
24+
25+
Verifique no [projeto do Github](https://github.com/orgs/SOS-RS/projects/1)
26+
quais funcionalidades ainda não foram implementadas e já estão prontas para
27+
serem desenvolvidas, elas estarão na coluna "Disponível pra dev". Lá há itens de
28+
backend e frontend, então atente-se para qual você gostaria de participar.
29+
30+
Após escolher o item que quer trabalhar, faça um comentário no issue informando
31+
que quer contribuir para sua entrega. Uma pessoa que administra o repositório
32+
marcará você como a pessoa responsável por aquele issue, e marcará o item como
33+
"Em desenvolvimento".
34+
35+
A partir daí você já pode trabalhar no item que escolheu.
36+
37+
Você também pode mandar a contribuição diretamente sem avisar, mas corre o
38+
risco de alguém solicitar para trabalhar no item e entregá-lo junto ou antes de
39+
você, desperdiçando assim esforços. Somente faça isso se a correção for bem rápida e pontual para
40+
evitar o desperdício.
41+
42+
⚠️ **Importante**: Itens de alta prioridade precisam ser entregues o mais rápido possível,
43+
idealmente em até dois dias. Verifique se tem tempo livre suficiente para se
44+
dedicar a um item de urgência, a fim de evitar segurar o item por tempo demais
45+
de forma desnecessária.
46+
47+
## 🚀 Configuração Inicial Local
48+
49+
1. Faça um fork do repositório para o seu usuário (uma boa ideia é usar um nome mais descritivo do que `frontend`, como `sos-rs-frontend`).
50+
2. Clone o repositório (troque `<seuusuario>` na url abaixo pelo seu usuário):
51+
52+
```bash
53+
git clone https://github.com/<seuusuario>/sos-rs-frontend.git
54+
```
55+
56+
3. Instale as dependências:
57+
58+
```bash
59+
npm install
60+
```
61+
62+
4. Inicie o servidor:
63+
64+
```bash
65+
npm run dev
66+
```
67+
68+
O app estará disponível em <http://localhost:5173>.
69+
70+
5. Inicie o servidor de backend. Veja as instruções no seu
71+
[documento de contribuição](https://github.com/SOS-RS/backend/blob/develop/CONTRIBUTING.md).
72+
73+
## 💻 Codificando e enviando
74+
75+
1. Faça suas alterações.
76+
2. Rode o lint com `npm run lint`.
77+
3. Crie um branch com o git `git checkout -b nomedobranch`.
78+
4. Faça um commit com `git commit`.
79+
5. Faça um push para o seu repositório com `git push`.
80+
6. [Sincronize seu repositório](#-sincronizando).
81+
7. [Abra um pull request](https://docs.github.com/pt/pull-requests/collaborating-with-pull-requests/proposing-changes-to-your-work-with-pull-requests/creating-a-pull-request).
82+
Não deixe de informar, no seu pull request, qual a issue que está fechando.
83+
Idealmente coloque um comentário no PR que já fechará a issue, como
84+
`fixes #xxxx` ou `closes #xxxx` (onde `xxxx` é o número do issue). Veja
85+
[como isso funciona](https://docs.github.com/pt/get-started/writing-on-github/working-with-advanced-formatting/using-keywords-in-issues-and-pull-requests).
86+
8. Acompanhe a revisão do PR. Algumas verificações automáticas serão feitas (o
87+
Github Actions rodará o build do Vite, por exemplo). Se uma delas falhar, corrija-a, a
88+
revisão humana só começa quando estas checagem estão passando. Após abrir o
89+
PR uma pessoa que administra o projeto pode pedir revisões e alterações.
90+
Busque respondê-las o mais rápido possível para que o PR possa ser integrado.
91+
92+
## 🔄 Sincronizando
93+
94+
Você vai precisar, de tempos em tempos, sincronizar a branch `develop` do
95+
seu repositório. Você pode usar o botão `Sync fork` do Github
96+
(veja [os docs](https://docs.github.com/pt/pull-requests/collaborating-with-pull-requests/working-with-forks/syncing-a-fork)).
97+
Ou você pode fazer manualmente, o que te permite fazer a sincronização sem depender do Github:
98+
99+
1. Antes de mais nada, se estiver no meio de uma contribuição, verifique que já commitou
100+
tudo que tinha pra commitar, e então faça checkout do branch `develop`:
101+
102+
```bash
103+
git checkout develop
104+
```
105+
106+
2. Adicione o repositório oficial como remoto com nome `upstream` (só necessário na primeira vez):
107+
108+
```bash
109+
git remote add upstream https://github.com/SOS-RS/frontend.git
110+
```
111+
112+
3. Faça pull do branch `develop`:
113+
114+
```bash
115+
git pull upstream develop
116+
```
117+
118+
4. Se estiver no meio de uma contribuição, faça um rebase no branch `develop`
119+
(substitua `<seubranch>` pelo nome do seu branch):
120+
121+
```bash
122+
git checkout <seubranch>
123+
git rebase develop
124+
```
125+
126+
Após o rebase, é importante rodar novamente a aplicação e verificar se tudo
127+
continua funcionando.

README.md

Lines changed: 19 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,22 @@
1-
# README
1+
# 🌊 Frontend para App de Ajuda em Enchentes 🌊
22

33
Este projeto é o frontend de um aplicativo destinado a auxiliar na organização e distribuição de suprimentos, além de coordenar voluntários durante os alagamentos no Rio Grande do Sul. A aplicação visa conectar pessoas afetadas pelas enchentes com recursos essenciais e voluntários dispostos a ajudar.
44

5+
O objetivo deste aplicativo é facilitar uma resposta rápida e eficiente em situações de emergência causadas por enchentes, promovendo a colaboração e o apoio mútuo entre a comunidade e organizações de ajuda.
6+
7+
Se você quiser discutir ideias, problemas ou contribuições, sinta-se à vontade para se juntar ao nosso servidor do
8+
Discord [aqui](https://discord.gg/vjZS6BQXvM).
9+
510
## Acesso à Aplicação
611

712
[SOS Rio Grande do Sul](https://sos-rs.com/)
8-
[Discord](https://discord.gg/eJTuannsd6)
913

10-
## Sobre o Projeto
14+
## 🤝 Contribuição
1115

12-
O objetivo deste aplicativo é facilitar uma resposta rápida e eficiente em situações de emergência causadas por enchentes, promovendo a colaboração e o apoio mútuo entre a comunidade e organizações de ajuda.
16+
Contribuições são muito bem-vindas! Se deseja ajudar, veja o
17+
[documento de contribuição](./CONTRIBUTING.md).
18+
19+
Agradecemos o seu interesse e apoio. Juntos, podemos fazer uma diferença significativa para as vítimas das enchentes no Rio Grande do Sul!
1320

1421
## Tecnologias Utilizadas
1522

@@ -20,36 +27,12 @@ Este frontend foi desenvolvido utilizando as seguintes tecnologias:
2027
- [**Tailwind CSS**](https://tailwindcss.com/docs/installation): Framework CSS baseado em classes utilitárias.
2128
- [**shadcn/ui**](https://ui.shadcn.com/docs): Coleção de componentes reutilizáveis, baseado em Tailwind.
2229

23-
Para executar o frontend do aplicativo em seu ambiente local, siga os passos abaixo:
24-
25-
1. Clone o repositório:
26-
```
27-
git clone https://github.com/SOS-RS/frontend
28-
```
29-
2. Entre no diretório do projeto:
30-
```
31-
cd frontend
32-
```
33-
3. Instale as dependências:
34-
```
35-
npm install
36-
```
37-
4. Inicie o servidor de desenvolvimento:
38-
```
39-
npm run dev
40-
```
41-
O app estará disponível em `http://localhost:5173`.
42-
43-
## Contribuindo
44-
45-
Contribuições são muito bem-vindas! Se você tem interesse em ajudar a melhorar o app, por favor:
46-
47-
1. Faça um fork do repositório.
48-
2. Crie uma branch para sua feature (`git checkout -b feature/MinhaFeature`).
49-
3. Faça seus commits (`git commit -m 'Adicionando uma nova feature'`).
50-
4. Faça push para a branch (`git push origin feature/MinhaFeature`).
51-
5. Abra um Pull Request.
52-
53-
---
30+
## Licença
5431

55-
Agradecemos o seu interesse e apoio. Juntos, podemos fazer uma diferença significativa para as vítimas das enchentes no Rio Grande do Sul!
32+
Este código está licenciado usando a
33+
[licença MIT](./LICENSE).
34+
35+
## Contribuidores
36+
37+
Os contribuidores são voluntários, e podem ser encontrados
38+
[na página de contribuidores](https://github.com/SOS-RS/frontend/graphs/contributors).

src/pages/EditShelterSupply/EditShelterSupply.tsx

Lines changed: 60 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
1-
import { ChevronLeft, PlusCircle } from 'lucide-react';
1+
import { ChevronLeft } from 'lucide-react';
22
import { useNavigate, useParams } from 'react-router-dom';
33
import { Fragment, useCallback, useEffect, useMemo, useState } from 'react';
44

5-
import { DialogSelector, Header, LoadingScreen, TextField } from '@/components';
5+
import { DialogSelector, Header, LoadingScreen } from '@/components';
66
import { Button } from '@/components/ui/button';
77
import { useShelter, useSupplies, useThrottle } from '@/hooks';
88
import { group, normalizedCompare } from '@/lib/utils';
9-
import { SupplyRow } from './components';
9+
import { SupplyRow, SupplySearch } from './components';
1010
import { IDialogSelectorProps } from '@/components/DialogSelector/types';
1111
import { ISupplyRowItemProps } from './components/SupplyRow/types';
1212
import { ShelterSupplyServices } from '@/service';
@@ -25,32 +25,58 @@ const EditShelterSupply = () => {
2525
const [filteredSupplies, setFilteredSupplies] = useState<IUseSuppliesData[]>(
2626
[]
2727
);
28-
const [searchValue, setSearchValue] = useState<string>('');
28+
const [searchedSupplies, setSearchedSupplies] = useState<IUseSuppliesData[]>(
29+
[]
30+
);
31+
const shelterSupplyData = useMemo(() => {
32+
return (shelter?.shelterSupplies ?? []).reduce(
33+
(prev, current) => ({ ...prev, [current.supply.id]: current }),
34+
{} as Record<string, IUseShelterDataSupply>
35+
);
36+
}, [shelter?.shelterSupplies]);
37+
38+
const [, setSearchSupplies] = useThrottle<string>(
39+
{
40+
throttle: 200,
41+
callback: (value) => {
42+
if (value) {
43+
const filteredSupplies = supplies.filter((s) =>
44+
normalizedCompare(s.name, value)
45+
);
46+
setSearchedSupplies(filteredSupplies);
47+
} else {
48+
setSearchedSupplies([]);
49+
setSearch('');
50+
}
51+
},
52+
},
53+
[supplies]
54+
);
55+
2956
const [, setSearch] = useThrottle<string>(
3057
{
3158
throttle: 400,
32-
callback: (v) => {
33-
if (v) {
34-
setFilteredSupplies(
35-
supplies.filter((s) => normalizedCompare(s.name, v))
59+
callback: (value) => {
60+
if (value) {
61+
const filteredSupplies = supplies.filter((s) =>
62+
normalizedCompare(s.name, value)
3663
);
37-
} else setFilteredSupplies(supplies);
64+
setFilteredSupplies(filteredSupplies);
65+
} else {
66+
const storedSupplies = supplies.filter((s) => !!shelterSupplyData[s.id]);
67+
setFilteredSupplies(storedSupplies);
68+
}
3869
},
3970
},
40-
[supplies]
71+
[supplies, shelterSupplyData]
4172
);
4273
const [modalOpened, setModalOpened] = useState<boolean>(false);
4374
const [loadingSave, setLoadingSave] = useState<boolean>(false);
4475
const [modalData, setModalData] = useState<Pick<
4576
IDialogSelectorProps,
4677
'value' | 'onSave' | 'quantity'
4778
> | null>();
48-
const shelterSupplyData = useMemo(() => {
49-
return (shelter?.shelterSupplies ?? []).reduce(
50-
(prev, current) => ({ ...prev, [current.supply.id]: current }),
51-
{} as Record<string, IUseShelterDataSupply>
52-
);
53-
}, [shelter?.shelterSupplies]);
79+
5480
const supplyGroups = useMemo(
5581
() =>
5682
group<IUseSuppliesData>(filteredSupplies ?? [], 'supplyCategory.name'),
@@ -112,8 +138,9 @@ const EditShelterSupply = () => {
112138
);
113139

114140
useEffect(() => {
115-
setFilteredSupplies(supplies);
116-
}, [supplies]);
141+
const storedSupplies = supplies.filter((s) => !!shelterSupplyData[s.id]);
142+
setFilteredSupplies(storedSupplies);
143+
}, [supplies, shelterSupplyData]);
117144

118145
if (loading) return <LoadingScreen />;
119146

@@ -163,27 +190,26 @@ const EditShelterSupply = () => {
163190
<div className="p-4 flex flex-col max-w-5xl w-full gap-3 items-start">
164191
<h6 className="text-2xl font-semibold">Editar itens do abrigo</h6>
165192
<p className="text-muted-foreground">
166-
Para cada item da lista abaixo, informe a disponibilidade no abrigo
167-
selecionado
193+
Antes de adicionar um novo item, confira na busca abaixo se ele já não foi cadastrado.
168194
</p>
169-
<Button
170-
variant="ghost"
171-
className="flex gap-2 text-blue-500 [&_svg]:stroke-blue-500 font-medium text-lg hover:text-blue-600"
172-
onClick={() => navigate(`/abrigo/${shelterId}/item/cadastrar`)}
173-
>
174-
<PlusCircle />
175-
Cadastrar novo item
176-
</Button>
177195
<div className="w-full my-2">
178-
<TextField
179-
label="Buscar"
180-
value={searchValue}
181-
onChange={(ev) => {
182-
setSearchValue(ev.target.value);
183-
setSearch(ev.target.value);
196+
<SupplySearch
197+
supplyItems={searchedSupplies}
198+
limit={5}
199+
onSearch={(value) =>
200+
setSearchSupplies(value)
201+
}
202+
onSelectItem={(item) => {
203+
setSearch(item.name);
204+
setSearchedSupplies([]);
184205
}}
206+
onAddNewItem={() => navigate(`/abrigo/${shelterId}/item/cadastrar`)}
185207
/>
186208
</div>
209+
210+
<p className="text-muted-foreground mt-3">
211+
Para cada item da lista abaixo, informe a disponibilidade no abrigo selecionado.
212+
</p>
187213
<div className="flex flex-col gap-2 w-full my-4">
188214
{Object.entries(supplyGroups).map(([key, values], idx) => {
189215
const items: ISupplyRowItemProps[] = values

0 commit comments

Comments
 (0)