O diálogo que se fechava sozinho antes de eu conseguir usá-lo
O Greenhouse tinha uma lacuna que estava parada silenciosamente no backlog por semanas: uma vez que você apontava o app para uma pasta durante a configuração inicial, pronto. Não havia como mudar de ideia depois, a não ser apagando as configurações do app e começando do zero. Finalmente cheguei nisso essa semana, e acabou sendo uma dessas tarefas que parecem pura encanação até deixarem de parecer.
O reaproveitamento que parecia óbvio
Algumas semanas antes eu tinha construído a tela de onboarding que deixa você apontar o Greenhouse para uma pasta existente cheia de projetos antigos, escanear ela, e decidir o que trazer. Essa tela já tinha tudo que uma feature de “trocar de vault” precisaria: um seletor de pasta, um scanner, uma lista de atribuições. Então o plano era simples, extrair essa lógica para uma peça reutilizável própria, e construir um diálogo pequeno em volta dela para a troca.
A extração em si foi tranquila. A parte que não foi, foi uma única palavra: o que significa “terminado.”
Um callback com uma opinião escondida
A tela de onboarding original tinha uma regra específica: se você já tinha escolhido uma pasta e ela acabava não tendo mais nada para revisar, desbloquear o botão “Próximo” para você poder seguir em frente. Sensato, você está num wizard de configuração linear, e não há nada para fazer ali, então deixa a pessoa continuar.
Quando eu extraí essa lógica para uma peça compartilhada, renomeei o sinal de algo específico do wizard para algo genérico, só “chame isso quando não sobrar nada para decidir.” Parecia razoável. Conectei o novo diálogo de troca de vault para se fechar sozinho sempre que esse sinal disparasse.
Aí eu de fato abri o diálogo. Ele se fechou sozinho na hora. Toda vez. Antes de eu conseguir clicar em qualquer coisa.
O que eu tinha deixado passar: a peça compartilhada ainda checa sua pasta inicial no exato momento em que aparece, exatamente como o passo do wizard fazia antes. No onboarding, ver “nada para fazer aqui” na sua pasta já configurada significa “você terminou, siga em frente.” Num diálogo cujo propósito inteiro é “talvez escolher algo diferente,” ver “nada para fazer aqui” na pasta em que você já está só significa que o diálogo abriu. Essas são duas situações completamente diferentes que por acaso produziram exatamente o mesmo sinal, e eu tinha assumido que o significado do sinal viajava junto com ele quando movi o código. Não viajou. O código era idêntico; a frase que ele estava dizendo a dois ouvintes diferentes significava duas coisas diferentes.
Consertando sem fazer a peça compartilhada adivinhar
O fix tentador é deixar o componente compartilhado mais esperto, dar a ele uma flag tipo “devo fechar sozinho automaticamente quando a pasta inicial já está resolvida?” Eu não queria isso. No momento em que uma peça reutilizável começa a perguntar “bom, em qual situação eu estou?”, você empurrou a decisão de julgamento para dentro da caixa, onde fica mais difícil de ver e mais fácil de errar na próxima vez que alguém reaproveitar.
Em vez disso, deixei a peça compartilhada exatamente tão direta quanto sempre foi, ela continua anunciando “nada mais para decidir” toda vez que isso é verdade, sem exceções, sem sensibilidade a contexto. O diálogo em si agora acompanha uma coisa simples: a pessoa de fato escolheu algo novo desde que ele abriu? Só se isso for verdade, “nada mais para decidir” é tratado como “terminamos aqui.” Caso contrário, o anúncio é apenas… registrado, e ignorado. O núcleo burro e previsível continuou burro e previsível. A decisão de julgamento se mudou para o único lugar que de fato tem contexto suficiente para tomá-la, quem chama, não a ferramenta.
O que me fez confiar no fix
Esse é exatamente o tipo de bug que um verificador de tipos passando nunca vai pegar, porque nada nos tipos mudou, um callback ainda disparava, na hora certa, com a assinatura certa. A incompatibilidade estava inteiramente no que o disparo deveria significar para quem estava ouvindo. Então o teste que eu escrevi não foi “clicar nas coisas funciona,” foi especificamente “abra esse diálogo contra uma pasta que já está totalmente resolvida, e confirme que nada fecha.” Esse é o único cenário em que a suposição antiga teria reaparecido silenciosamente se eu tivesse errado o fix mesmo que um pouco, e é exatamente o cenário que um teste manual rápido nunca revelaria, já que um testador manual teria que pensar em tentar o caminho de “não fazer nada” de propósito.
Leitura relacionada
Removendo um lock de cooldown que nunca foi fiel à fonte
O lock de 7 dias em projetos ativos era lógica de incubação de ideias colada no estágio errado do pipeline. A rotação já fazia a parte útil do trabalho.
Rescue-or-Keep: construindo a zona de vault para o Greenhouse
Agora arquivar no vault realmente move seus arquivos, e um "Keep Vaulted" que não era um no-op de verdade - reagendar teria resetado o timestamp que a revisão diária usa para ordenar.
Construindo a tela de detalhes de projeto do Greenhouse
Avançar um estágio conta como um toque, o que acontece no último estágio, e uma tangente de cooldown-vs-rotação que acabou sendo uma pergunta só, não duas.
Você também pode achar útil
Proton Drive
Armazenamento em nuvem criptografado, da equipe por trás do Proton Mail.
Como parceiro da Proton, ganho com compras qualificadas dos serviços de privacidade e segurança da Proton (Pass, Mail, VPN, Drive).
Saiba maisProton Pass
Gerenciador de senhas focado em privacidade, da equipe por trás do Proton Mail.
Como parceiro da Proton, ganho com compras qualificadas dos serviços de privacidade e segurança da Proton (Pass, Mail, VPN, Drive).
Saiba maisProton Mail
E-mail criptografado de ponta a ponta, com arquitetura de acesso zero.
Como parceiro da Proton, ganho com compras qualificadas dos serviços de privacidade e segurança da Proton (Pass, Mail, VPN, Drive).
Saiba mais