Skip to content

fix: flatpickr popup closes immediately when options are passed inline - #262

Open
iahmedgamal wants to merge 1 commit into
haoxins:masterfrom
iahmedgamal:fix/261-popup-closes-on-time-change
Open

fix: flatpickr popup closes immediately when options are passed inline#262
iahmedgamal wants to merge 1 commit into
haoxins:masterfrom
iahmedgamal:fix/261-popup-closes-on-time-change

Conversation

@iahmedgamal

Copy link
Copy Markdown

Description

The lifecycle effect depended on mergedOptions, onCreate, and onDestroy. When an inline prop changed, it created a new reference on every render, causing the effect to re-run and destroy/recreate the flatpickr instance mid-interaction.

To fix this, the values were moved into refs that update on every render. The effect dependencies were changed to [], so the instance now lives for the full component lifetime, regardless of prop memoization.

Issue

closes #261

This fixes the problem where the flatpickr popup would close immediately after selecting a time or changing AM/PM when options were passed inline without memoization. The same issue occurred with inline onCreate and onDestroy callbacks.

Change Type

  • Bug fix

How Has This Been Tested?

A regression test was added to render the component with inline options, trigger a re-render, and check that onCreate was called exactly once, confirming the flatpickr instance was not destroyed and recreated. The fix was also tested locally.

- add regression test for passing options call the component once

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Pull request overview

Fixes a regression where re-rendering DateTimePicker with inline (non-memoized) options/callbacks could cause the flatpickr instance to be destroyed/recreated mid-interaction, closing the popup.

Changes:

  • Make the flatpickr instance lifecycle mount-only by moving mergedOptions, onCreate, and onDestroy into refs and switching the create/destroy effect dependencies to [].
  • Keep options/value synchronization via the existing update effect.
  • Add a regression test that re-renders with inline options and asserts the instance isn’t recreated (via onCreate call count).

Reviewed changes

Copilot reviewed 2 out of 2 changed files in this pull request and generated 1 comment.

File Description
lib/DateTimePicker.tsx Keeps a single flatpickr instance for the component lifetime by using refs and a mount-only lifecycle effect.
test/index.spec.tsx Adds a regression test ensuring inline options re-renders don’t recreate the flatpickr instance.

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment thread lib/DateTimePicker.tsx
Comment on lines 99 to +102
return () => {
destroyFlatpickrInstance();
};
}, [mergedOptions, onCreate, onDestroy]);
}, []);

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

@iahmedgamal i am concerned about this, there was a reason mergedOptions was a dependency

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

The popup disappears immediately after the time and AM/PM are changed

3 participants