Skip to content

Commit 5183ee3

Browse files
edsonmartinsclaude
andcommitted
fix(components): ArchbaseTimeRangeSelector não reseta ao re-render do pai
O useEffect que sincroniza defaultRangeValue resetava o selectedRange em cada re-render do pai, causando loop: usuário seleciona 7d → pai re-renderiza → useEffect reseta para 1d → onRangeChange dispara. Agora usa ref para ignorar primeira execução e comparar se o valor realmente mudou antes de atualizar o state interno. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
1 parent 8461468 commit 5183ee3

File tree

1 file changed

+14
-7
lines changed

1 file changed

+14
-7
lines changed

packages/components/src/editors/ArchbaseTimeRangeSelector.tsx

Lines changed: 14 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -174,30 +174,37 @@ export const ArchbaseTimeRangeSelector: FC<ArchbaseTimeRangeSelectorProps> = (pr
174174
}
175175
}, [componentRef, internalRef.current]);
176176

177-
// Atualizar o estado quando o defaultRangeValue muda
177+
// Sincronizar apenas quando defaultRangeValue realmente muda (controlado pelo pai)
178+
// Ignora a primeira execução pois o useState já inicializa com o default
179+
const isFirstRenderRef = useRef(true);
180+
const prevDefaultRef = useRef(defaultRangeValue);
178181
useEffect(() => {
182+
if (isFirstRenderRef.current) {
183+
isFirstRenderRef.current = false;
184+
return;
185+
}
186+
// Só atualiza se o valor realmente mudou (evita loop com re-renders do pai)
187+
if (defaultRangeValue === prevDefaultRef.current) {
188+
return;
189+
}
190+
prevDefaultRef.current = defaultRangeValue;
191+
179192
if (defaultRangeValue !== undefined) {
180-
// Atualizar o selectedRange
181193
setSelectedRange(defaultRangeValue);
182194

183-
// Se for um range predefinido
184195
if (defaultRangeValue && defaultRangeValue !== 'custom') {
185196
const range = ranges.find(r => r.value === defaultRangeValue);
186197
if (range) {
187198
const newRange = range.rangeFunction(new Date());
188199
setDateRange(newRange);
189200
}
190201
}
191-
// Se for custom e temos defaultDateRange disponível
192202
else if (defaultRangeValue === 'custom' && defaultDateRange &&
193203
defaultDateRange.start && defaultDateRange.end) {
194-
// Criar novas instâncias para evitar problemas de referência
195204
setDateRange({
196205
start: new Date(defaultDateRange.start.getTime()),
197206
end: new Date(defaultDateRange.end.getTime())
198207
});
199-
200-
// Também atualizar o customRange para ficar sincronizado
201208
setCustomRange({
202209
start: new Date(defaultDateRange.start.getTime()),
203210
end: new Date(defaultDateRange.end.getTime())

0 commit comments

Comments
 (0)