Conversation
Summary of ChangesHello, I'm Gemini Code Assist1! I'm currently reviewing this pull request and will post my feedback shortly. In the meantime, here's a summary to help you and other reviewers quickly get up to speed! This pull request primarily focuses on bumping the plugin version to 2.8.0 and delivering a set of significant improvements and bug fixes. It enhances existing integrations like ActiveCampaign and WooCommerce for greater stability and accuracy, while also expanding functionality with new triggers and actions for User Registration & Membership and NotificationX. Several critical bugs across various modules have been resolved to improve overall reliability. Highlights
Changelog
Ignored Files
Using Gemini Code AssistThe full guide for Gemini Code Assist can be found on our documentation page, here are some quick tips. Invoking Gemini You can request assistance from Gemini at any point by creating a comment using either
Customization To customize Gemini Code Assist for GitHub experience, repository maintainers can create a configuration file and/or provide a custom code review style guide (such as PEP-8 for Python) by creating and adding files to a Limitations & Feedback Gemini Code Assist may make mistakes. Please leave feedback on any instances where its feedback is incorrect or counter productive. You can react with 👍 and 👎 on @gemini-code-assist comments. If you're interested in giving your feedback about your experience with Gemini Code Assist for GitHub and other Google products, sign up here. You can also get AI-powered code generation, chat, as well as code reviews directly in the IDE at no cost with the Gemini Code Assist IDE Extension. Footnotes
|
There was a problem hiding this comment.
Code Review
This pull request bumps the version to 2.8.0 and includes several bug fixes and improvements. Key changes include a fix for ActiveCampaign tag updates, added robustness in WooCommerce helpers, and a fix for a potential crash in the WebHook UI. My review includes suggestions to improve performance in the Active-Campaign integration, enhance code readability in the WooCommerce helper, and provide a more robust fix for the WebHook component to prevent runtime errors.
| foreach ($contactTags as $contactTag) { | ||
| HttpHelper::delete("{$this->_apiEndpoint}/contactTags/{$contactTag->id}", null, $this->_defaultHeader); | ||
| $result['tags_removed'][] = HttpHelper::$responseCode === 200 | ||
| ? __('Tag removed successfully', 'bit-integrations') | ||
| : __('Failed to remove tag', 'bit-integrations'); | ||
| } |
There was a problem hiding this comment.
This loop makes an individual API request for each tag to be deleted. If a contact has a large number of tags, this can lead to poor performance and potentially hit API rate limits. While the ActiveCampaign API may not offer a bulk delete endpoint for contact tags, it's worth double-checking if a more efficient method is available.
Additionally, the code relies on a static property HttpHelper::$responseCode to check the status of the delete operation. This is not a robust pattern as static properties can introduce side effects. It would be better to use the return value from HttpHelper::delete() to determine the outcome of the request.
| const formFields = useRecoilValue($formFields) | ||
| const formattedFormFields = useMemo( | ||
| () => formFields.map(field => ({ key: field.name, value: `\${${field.name}}` })), | ||
| () => formFields?.map(field => ({ key: field.name, value: `\${${field.name}}` })), |
There was a problem hiding this comment.
Using optional chaining (?.) is a good step to prevent errors when formFields is null or undefined. However, the default value for the $formFields atom is an empty object ({}), which is not an array and does not have a .map method. This will still cause a runtime error.
To make this more robust, you should check if formFields is an array before calling .map.
| () => formFields?.map(field => ({ key: field.name, value: `\${${field.name}}` })), | |
| () => (Array.isArray(formFields) ? formFields.map(field => ({ key: field.name, value: `\${${field.name}}` })) : []), |
| 'product_sku' => $product && $product->get_sku() ? $product->get_sku() : '', | ||
| 'product_unit_price' => $product && $product->get_price() ? $product->get_price() : '', |
There was a problem hiding this comment.
The added checks for the $product object are great for preventing fatal errors. However, the ternary expression can be simplified for better readability. Since get_sku() and get_price() return strings, you can make this more concise.
'product_sku' => $product ? $product->get_sku() : '',
'product_unit_price' => $product ? $product->get_price() : '',There was a problem hiding this comment.
Pull request overview
This PR bumps the Bit Integrations plugin to v2.8.0 and updates release collateral (readme + in-app changelog), alongside routine frontend dependency lockfile updates and CI build workflow adjustments.
Changes:
- Bump plugin version references to 2.8.0 and add the 2.8.0 changelog entry.
- Update in-app changelog content and fix/adjust several integration-related behaviors (ActiveCampaign tag update flow, WooCommerce order item product access, FluentBooking fields handling, Webhook payload mapping safety).
- Refresh
pnpm-lock.yamland update GitHub Actions workflow to use pnpm v9 +pnpm build.
Reviewed changes
Copilot reviewed 10 out of 12 changed files in this pull request and generated 7 comments.
Show a summary per file
| File | Description |
|---|---|
| readme.txt | Updates stable tag to 2.8.0 and adds 2.8.0 changelog notes. |
| pnpm-lock.yaml | Updates locked frontend dependency graph. |
| languages/bit-integrations.pot | Updates POT metadata and adds new translatable strings. |
| frontend/src/resource/img/integ/voxel.webp | Adds a new integration image asset. |
| frontend/src/pages/ChangelogToggle.jsx | Updates the in-app changelog entries for the release. |
| frontend/src/components/Triggers/TriggerHelpers/FluentBookingHelper/FluentBookingCommonFunction.js | Adjusts FluentBooking field fetching behavior. |
| frontend/src/components/AllIntegrations/IntegrationHelpers/WebHook/Body.jsx | Adds null-safety to payload field mapping generation. |
| bitwpfi.php | Bumps plugin header version and BTCBI_VERSION constant to 2.8.0. |
| backend/Triggers/WC/WCHelper.php | Hardens WooCommerce line-item product access in order payloads. |
| backend/Config.php | Bumps Config::VERSION to 2.8.0. |
| backend/Actions/ActiveCampaign/RecordApiHelper.php | Refactors tag-update handling to remove existing tags before adding new ones. |
| .github/workflows/plugin-check.yml | Pins pnpm v9 and switches build command to pnpm build. |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
| : __('Failed to remove tag', 'bit-integrations'); | ||
| } | ||
| } else { | ||
| $result['tags_removed'] = __('No tags to remove', 'bit-integrations'); |
| const formFields = useRecoilValue($formFields) | ||
| const formattedFormFields = useMemo( | ||
| () => formFields.map(field => ({ key: field.name, value: `\${${field.name}}` })), | ||
| () => formFields?.map(field => ({ key: field.name, value: `\${${field.name}}` })), |
| "Project-Id-Version: Bit Integrations 2.7.12\n" | ||
| "Report-Msgid-Bugs-To: https://wordpress.org/support/plugin/bit-integrations\n" | ||
| "Last-Translator: developer@bitcode.pro\n" | ||
| "Language-Team: support@bitcode.pro\n" | ||
| "MIME-Version: 1.0\n" | ||
| "Content-Type: text/plain; charset=UTF-8\n" | ||
| "Content-Transfer-Encoding: 8bit\n" | ||
| "POT-Creation-Date: 2026-03-07T09:14:31+00:00\n" | ||
| "POT-Creation-Date: 2026-03-13T05:59:46+00:00\n" |
| items: [ | ||
| { | ||
| label: 'User Registration & Membership', | ||
| desc: '1 new events added', |
| desc: 'Fixed blank page issue and fieldmap disappearance issue.', | ||
| label: 'GoHighLevel', | ||
| desc: 'Fixed opportunity creation by sending the selected pipeline ID correctly.', | ||
| isPro: false |
| - NotificationX: 2 new events added (Pro) | ||
|
|
||
| - **New Actions** | ||
| - User Registration & Membership: 1 new events added (Pro) |
| 'product_sku' => $product && $product->get_sku() ? $product->get_sku() : '', | ||
| 'product_unit_price' => $product && $product->get_price() ? $product->get_price() : '', |
No description provided.