Subtask 06 — Bottom Sheet de Escolha de Modalidade
Task pai: 197313 — Ajuste de layout nova vitrine
Ordem de execução: 06 de 07
Depende de: 02 — Listagem v2 (usa hasSellerStock), 05 — Criação SellerStock (chama createSellerStock())
Objetivo
Implementar o bottom sheet "Escolha uma opção" exibido ao tocar em CRIAR VITRINE, com as opções Vitrine do estoque da loja (com badge "Nova", habilitada/desabilitada conforme hasSellerStock) e Criar nova vitrine (fluxo atual, sem mudança).
Requisitos atendidos
- RF-02 — Bottom sheet de escolha de modalidade ao criar vitrine: AC1 a AC8.
Relação com o design doc
- Decisão #1 — Bottom Sheet de Escolha de Modalidade (
desing-doc.md): novo widgetShowCaseTypeSelectionBottomSheet, reaproveitandoGetxBottomSheet.showBottomSheet(); badge "Nova" viaZzTag(theme: ZzTagTheme.newFeature)(novo valor de enum, cores confirmadas nas imagens do Figma). - Referências visuais:
context/image.png,context/image-1.png(habilitado),context/image-2.png(desabilitado).
Arquivos a criar
| Arquivo | Descrição |
|---|---|
lib/screens/show_case/widgets/show_case_type_selection_bottom_sheet.dart | Bottom sheet com as 2 opções, recebe hasSellerStock como prop, dispara MyShowCaseController.createSellerStock() ou navega para showCaseSearchProducts. |
Arquivos a modificar
| Arquivo | Modificação |
|---|---|
lib/theme_widgets/tag/tag.dart | + ZzTagTheme.newFeature (backgroundColor: ZZColors.successMedium, foregroundColor: ZZColors.neutralLightest). Atenção: verificar se existe algum outro switch exaustivo sobre ZzTagTheme em outro arquivo que precise do novo case também. |
lib/screens/show_case/show_case/my_show_case_controller.dart | createFastCatalog() passa a chamar GetxBottomSheet.showBottomSheet<ShowCaseTypeSelectionBottomSheet>(hasSellerStock: _hasSellerStock.value) em vez de navegar direto para showCaseSearchProducts. |
Testes unitários a criar
test/theme_widgets/tag/tag_test.dart(criar se não existir)ZzTagTheme.newFeature.backgroundColor == ZZColors.successMediumZzTagTheme.newFeature.foregroundColor == ZZColors.neutralLightest
test/screens/show_case/widgets/show_case_type_selection_bottom_sheet_test.dart(widget test)hasSellerStock = false: opçãoVitrine do estoque da lojahabilitada, sem opacidade reduzida, tocávelhasSellerStock = true: opção desabilitada (opacidade reduzida, sem resposta ao tap), mensagemVocê já possui uma Vitrine de Estoque ativa. Apenas uma vitrine desta modalidade é permitida por vez.exibida- Badge "Nova" sempre visível, habilitado ou desabilitado
- Tap em
Criar nova vitrine→ navega paraAppRoutes.showCaseSearchProducts - Tap em
Vitrine do estoque da loja(habilitada) → chamaMyShowCaseController.createSellerStock() - Fechar o bottom sheet sem selecionar (botão X ou dispensar) → nenhuma navegação ocorre, estado não é alterado
test/screens/show_case/show_case/my_show_case_controller_test.dartcreateFastCatalog()→ abreShowCaseTypeSelectionBottomSheetcomhasSellerStockatual do controller (em vez de navegar direto)
Critérios de aceite (RF-02)
- Tocar em
CRIAR VITRINEexibe bottom sheet com títuloEscolha uma opçãoe botão de fechar. - Opção
Vitrine do estoque da lojacom badgeNovae descriçãoCrie uma vitrine com todos os produtos do estoque da loja.. - Opção
Criar nova vitrinecom descriçãoCrie vitrines personalizadas escolhendo os produtos ideais para cada cliente.. - Selecionar
Criar nova vitrineinicia o fluxo atual viaShowCaseSearchProducts(showCaseType = ShowCaseType.store/"Store"na API). - Selecionar
Vitrine do estoque da lojacomhasSellerStock = falseinicia o fluxo de criação (subtask 05). hasSellerStock = true: opçãoVitrine do estoque da lojapermanece visível, porém desabilitada para toque.hasSellerStock = true: mensagem de limite exibida abaixo do título da opção.- Fechar o bottom sheet sem selecionar retorna à listagem sem alterar o estado.
Definição de Pronto (Definition of Done)
-
ShowCaseTypeSelectionBottomSheetcriado e testado. -
ZzTagTheme.newFeatureadicionado sem quebrar nenhum uso existente deZzTag. -
createFastCatalog()atualizado. -
flutter analyzesem erros novos. -
flutter testexecutando os testes listados acima, 100% verdes. - Projeto compila.
- Validação visual manual comparando com
context/image-1.png/image-2.png.