{"id":50486722,"url":"https://github.com/guilherme006/achoufood","last_synced_at":"2026-06-01T23:02:08.903Z","repository":{"id":356675293,"uuid":"1233605190","full_name":"Guilherme006/AchouFood","owner":"Guilherme006","description":"AchouFood é um aplicativo iOS de delivery de comida construído com UIKit e interface totalmente programática. O app permite navegar por restaurantes próximos, alternar entre visualização em lista e mapa, abrir detalhes do restaurante, consultar o cardápio, adicionar itens ao pedido e revisar o resumo do pedido.","archived":false,"fork":false,"pushed_at":"2026-05-09T06:34:46.000Z","size":214,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-05-09T08:32:10.097Z","etag":null,"topics":["kingfisher","mapkit","snapkit","swift","xcode"],"latest_commit_sha":null,"homepage":"","language":"Swift","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/Guilherme006.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-05-09T06:20:36.000Z","updated_at":"2026-05-09T06:34:50.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/Guilherme006/AchouFood","commit_stats":null,"previous_names":["guilherme006/achoufood"],"tags_count":null,"template":false,"template_full_name":null,"purl":"pkg:github/Guilherme006/AchouFood","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Guilherme006%2FAchouFood","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Guilherme006%2FAchouFood/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Guilherme006%2FAchouFood/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Guilherme006%2FAchouFood/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Guilherme006","download_url":"https://codeload.github.com/Guilherme006/AchouFood/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Guilherme006%2FAchouFood/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":33797128,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-01T02:00:06.963Z","response_time":115,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["kingfisher","mapkit","snapkit","swift","xcode"],"created_at":"2026-06-01T23:02:05.007Z","updated_at":"2026-06-01T23:02:08.896Z","avatar_url":"https://github.com/Guilherme006.png","language":"Swift","funding_links":[],"categories":[],"sub_categories":[],"readme":"# AchouFood\n\nAchouFood é um aplicativo iOS de delivery de comida construído com UIKit e interface totalmente programática. O app permite navegar por restaurantes próximos, alternar entre visualização em lista e mapa, abrir detalhes do restaurante, consultar o cardápio, adicionar itens ao pedido e revisar o resumo do pedido.\n\n\u003cimg width=\"1920\" height=\"1080\" alt=\"image\" src=\"https://github.com/user-attachments/assets/5650d899-c3d8-4a7a-b80b-c002f2509cd7\" /\u003e\n\n## Visão Geral\n\nO projeto é organizado por cenas de funcionalidade e por um coordinator compartilhado. A base atual usa dados mockados embarcados no app, imagens remotas para restaurantes e itens do cardápio, além de MapKit para exibir localizações e abrir rotas no Apple Maps.\n\nPrincipais recursos:\n\n- Listagem de restaurantes a partir de `places.json`.\n- Busca textual de restaurantes.\n- Alternância entre lista e mapa na tela inicial.\n- Tela de detalhes com endereço, descrição, imagem, estacionamento e localização no mapa.\n- Solicitação de permissão de localização para traçar rota.\n- Abertura de rota de carro no Apple Maps.\n- Cardápio dividido por seções.\n- Sincronização entre seção selecionada e rolagem da tabela do cardápio.\n- Adição e remoção de quantidades de itens.\n- Resumo do pedido com quantidade de itens e valor total.\n- Limpeza/reset de seleções do cardápio.\n\n## Tecnologias\n\n- Swift 5\n- UIKit\n- SnapKit `5.7.1+` para Auto Layout programático\n- Kingfisher `8.6.0+` para carregamento e cache de imagens remotas\n- MapKit e CoreLocation para mapas, pins, localização e rotas\n- UserDefaults encapsulado em `StorageManager`\n- Swift Package Manager gerenciado pelo Xcode\n\nAs configurações atuais do projeto apontam para iPhone e iPad com `IPHONEOS_DEPLOYMENT_TARGET = 26.0`.\n\n## Estrutura do Projeto\n\n```text\nAchouFood/\n├── Common/\n│   ├── Constants/          Cores, tipografia, métricas, ícones e textos compartilhados\n│   ├── Extensions/         Helpers locais, como localização de String\n│   ├── Models/             Modelos de restaurante, cardápio e anotação de mapa\n│   ├── Protocols/          ViewCodeProtocol para montagem de UI programática\n│   └── Shared/             Coordinator, estado do pedido e armazenamento local\n├── Delegates/              AppDelegate e SceneDelegate\n├── Mock/                   JSON embarcado com restaurantes e cardápios\n├── Resources/              Assets, launch screen e localização\n└── Scenes/\n    ├── HomeDelivery/       Descoberta e busca de restaurantes\n    ├── PlaceDetail/        Detalhe do restaurante e ações de rota/cardápio\n    ├── PlaceMenu/          Cardápio e seleção de itens\n    └── Order/              Resumo e confirmação do pedido\n```\n\n## Arquitetura\n\nO app segue uma arquitetura UIKit baseada em cenas, factories e coordinators:\n\n- `DeliveryScenesCoordinator` cria o `UITabBarController`, mantém a pilha de navegação da Home e coordena navegação entre cenas.\n- Cada cena possui uma `Factory` responsável por montar o view controller e suas dependências.\n- View controllers cuidam de ciclo de vida, layout inicial e ligação entre callbacks da view e ações de coordinator/view model.\n- Views são programáticas e usam `ViewCodeProtocol` para separar hierarquia, constraints e configurações.\n- O estado do pedido ativo fica em memória em `OrderManager.shared`.\n- Valores locais simples, como endereço de entrega, são persistidos por `StorageManager.shared`.\n\nEssa divisão mantém navegação fora das views e reduz o acoplamento entre telas.\n\n## Fluxo do App\n\n1. `SceneDelegate` salva um endereço de entrega de exemplo e inicia `DeliveryScenesCoordinator`.\n2. O coordinator cria uma tab bar com duas abas:\n   - Home: descoberta de restaurantes dentro de um `UINavigationController`.\n   - Pedido: resumo do pedido atual.\n3. `HomeDeliveryServiceMock` carrega `Mock/places.json` e retorna restaurantes após um atraso simulado.\n4. `HomeDeliveryView` exibe os restaurantes em lista ou mapa e aplica filtros de busca.\n5. A seleção de um restaurante abre `PlaceDetailViewController`.\n6. Na tela de detalhe, o usuário pode:\n   - Voltar para a tela anterior.\n   - Traçar rota no Apple Maps.\n   - Abrir o cardápio do restaurante.\n7. `PlaceMenuView` exibe categorias e itens do cardápio. Mudanças de quantidade atualizam `OrderManager`.\n8. Ao tocar no resumo do pedido, o app muda para a aba Pedido e exibe o restaurante/itens selecionados.\n\n## Modelo de Dados\n\nOs restaurantes são decodificados de `AchouFood/Mock/places.json`.\n\n### `Place`\n\n- `restaurantID`\n- `restaurantName`\n- `address`\n- `type`\n- `parkingLot`\n- `latitude`\n- `longitude`\n- `imageUrl`\n- `description`\n- `menu`\n\n### `MenuCategory`\n\n- `category`\n- `items`\n\n### `MenuItem`\n\n- `name`\n- `price`\n- `imageUrl`\n- `selectedCount`\n\n`selectedCount` representa estado de tela/pedido e não vem persistido no JSON. Ao decodificar os itens, o valor inicial é `0`.\n\n## Dependências\n\nAs dependências são resolvidas pelo Swift Package Manager através do projeto Xcode.\n\n| Pacote | Repositório | Uso |\n| --- | --- | --- |\n| SnapKit | `https://github.com/SnapKit/SnapKit` | Constraints programáticas |\n| Kingfisher | `https://github.com/onevcat/Kingfisher` | Download e cache de imagens |\n\nAo abrir ou compilar o projeto no Xcode, os pacotes devem ser resolvidos automaticamente.\n\n## Localização\n\nAs strings localizadas ficam em:\n\n```text\nAchouFood/Resources/en.lproj/Localizable.strings\n```\n\nO acesso é feito por uma extensão de `String`, usando chaves como:\n\n- `home.find.places`\n- `home.header.addressTitle`\n- `alert.title`\n- `alert.message`\n- `placeMenu.title`\n- `order.title`\n- `confirmOrderDetails.order.buttonTitle`\n\n## Assets\n\nOs assets ficam em:\n\n```text\nAchouFood/Resources/Assets.xcassets\n```\n\nO catálogo contém ícones de abas, lista/mapa, pins, rota, cardápio, pedido e botões de adicionar, remover e voltar.\n\n## Como Executar\n\n1. Abra `AchouFood.xcodeproj` no Xcode.\n2. Aguarde a resolução dos pacotes SnapKit e Kingfisher.\n3. Selecione o scheme `AchouFood`.\n4. Escolha um simulador iOS ou dispositivo físico.\n5. Compile e execute.\n\nO app usa dados mockados embarcados, então não é necessário configurar backend.\n\n## Permissões\n\nO recurso de rota depende de autorização de localização:\n\n- Se a permissão ainda não foi definida, o app solicita autorização de uso durante o app.\n- Se a permissão foi concedida, o app abre o Apple Maps com rota de carro entre a localização atual do usuário e o restaurante.\n- Se a permissão foi negada ou restrita, o app mostra um alerta com opção para abrir Ajustes.\n\n## Pontos de Manutenção\n\n- A UI é construída com UIKit, SnapKit e views programáticas.\n- O projeto não usa storyboard para telas principais. `LaunchScreen.storyboard` é usado apenas na tela de lançamento.\n- A origem de restaurantes é mockada em `HomeDeliveryServiceMock`.\n- O estado do pedido é mantido em memória por `OrderManager`.\n- O endereço inicial é definido em `SceneDelegate`.\n- Não há targets de teste dedicados no projeto atual.\n\n## Melhorias Futuras\n\n- Adicionar testes unitários para `OrderManager`, decodificação do JSON, filtro de busca e comportamento de permissão de localização.\n- Adicionar testes de UI para descoberta de restaurantes, seleção de itens e confirmação de pedido.\n- Criar uma implementação remota para `HomeDeliveryService`.\n- Mover a definição do endereço inicial para uma camada de configuração ou onboarding.\n- Persistir o pedido ativo se a restauração de estado for necessária.\n- Revisar descrições de privacidade de localização para distribuição na App Store.\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fguilherme006%2Fachoufood","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fguilherme006%2Fachoufood","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fguilherme006%2Fachoufood/lists"}