Skip to content

feat(panel-app): S6 — componente Livewire Reactions (#545) - #568

Merged
danielhe4rt merged 1 commit into
feat/timeline-reactionfrom
feat/reactions-livewire-component
Sep 28, 2026
Merged

danielhe4rt merged 1 commit into
feat/timeline-reactionfrom
feat/reactions-livewire-component

Conversation

@AdryanneKelly

Copy link
Copy Markdown
Contributor

Contexto

A timeline web (épico de reações, #539) precisa de uma superfície interativa pra reagir a posts — um componente Livewire por post que grava a reação, faz toggle e substitui reações existentes. As peças de domínio já existem e estão mergeadas: o enum TimelineReaction (S2, #540), a action ReactWith + ReactWithDTO (S4, #543) e o query object ReactionSummary (S5, #544). Faltava a camada de UI que consome tudo isso.

Este PR implementa a S6: o componente Reactions que expõe os 6 emojis, chama ReactWith no clique, e atualiza seu próprio estado (counts/mine) recalculando via ReactionSummary para o post em questão.

Alterações

  • app-modules/panel-app/src/Livewire/Timeline/Reactions.php — componente final, mount(timelineId, counts, mine) recebendo estado inicial já resolvido pelo pai; reactWith() valida usuário autenticado e reação dentro do enum, delega para ReactWith, recalcula counts/mine e despacha timeline.reaction-updated.
  • app-modules/panel-app/resources/views/livewire/timeline/reactions.blade.php — picker com os 6 emojis (ícone + rótulo via title), botão com contagem total e destaque visual da reação própria.
  • app-modules/panel-app/src/PanelAppServiceProvider.php — registro Livewire::component('timeline-reactions', Reactions::class).
  • app-modules/panel-app/tests/Feature/Timeline/ReactionsTest.php — os 6 cenários BDD da issue.

Plano de Testes

  • Executar make check
  • Executar make test
  • livewire(Reactions::class, ['timelineId' => ...])->call('reactWith', 'love') grava a reação e despacha timeline.reaction-updated
  • Reagir com a reação atual remove (toggle-off); reagir com outra substitui
  • reactWith('xpto') não altera o banco e não despacha nada
  • Sem usuário autenticado, reactWith não altera o banco
  • $counts/$mine refletem o novo estado após a ação

Evidências

Sem impacto visual na tela ainda: o componente não está plugado em nenhuma tela real porque a S8 (o pai — PostShow/Feed — calculando counts/mine via ReactionSummary e passando pro <livewire:timeline-reactions>) é uma issue separada, ainda não implementada. A validação deste PR é via os testes Livewire (ReactionsTest.php), que exercitam o componente isoladamente com props diretas.


Issues Relacionadas

Closes #545
Related to #539

@GabrielFVDev GabrielFVDev left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM


public function reactWith(string $reaction, #[CurrentUser] ?User $user): void
{
if (!$user instanceof User) {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Aqui poderia usar o user vindo do auth para garantir que um usuário não autenticado ou usar credenciais de outro usuário na requisição.

$user = auth()->user();
If (!$user instanceof User) {
return;
}

public string $timelineId;

/** @var array<string, int> */
public array $counts = [];

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

#[Locked]

Faz o uso aqui do Locked e em $mine também. Faz sentido por que esses valores são definidos no servidor e impede do usuário conseguir alterar.


$summary = resolve(ReactionSummary::class)
->forTimelines([$this->timelineId], $user->id)
->first();

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Aqui é mais uma sugestão, já que vão retornar Coleciona, mas se usar o get vai dizer exatamente qual post você quer na requisição.

get($this->timelineId)

@danielhe4rt
danielhe4rt merged commit 95daa66 into feat/timeline-reaction Sep 28, 2026
8 checks passed
@danielhe4rt
danielhe4rt deleted the feat/reactions-livewire-component branch September 28, 2026 22:56
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

enhancement New feature or request squad A

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants