Skip to content

Conversation

@ucswift
Copy link
Member

@ucswift ucswift commented Aug 11, 2025

Summary by CodeRabbit

  • New Features

    • Redesigned status/destination selection to tap-able card items with visual checkmarks, plus loading/submitting states and spinners.
    • Step-by-step flow improved with Next/Previous, note-type handling, and localized submitting text.
  • Bug Fixes

    • Prevented double submissions; active call changes only applied on final submit; destination-call/station conflicts cleared.
  • Tests

    • Expanded end-to-end tests covering preselection, navigation, selection, saving, and toast feedback.
  • Chores

    • Added translations (EN/ES/AR) for submitting, selected status, success, and failure messages.

@ucswift
Copy link
Member Author

ucswift commented Aug 11, 2025

@coderabbitai
Copy link

coderabbitai bot commented Aug 11, 2025

Walkthrough

Refactors StatusBottomSheet to use touchable card selections and checks, adds guarded submit with isSubmitting and toast feedback, moves active-call synchronization to submit, introduces noteType-driven step flow and complex preselection/display logic, and expands tests and i18n keys for submission and save outcomes.

Changes

Cohort / File(s) Summary of Changes
Component UI & Flow
src/components/status/status-bottom-sheet.tsx
Replaced radio controls with touchable card items and Check icons; added isSubmitting, toast integration, spinner and submitting text; moved active-call update to submit; added preselection logic (hasPreselectedRef, useLayoutEffect), noteType-driven step logic, destination display guards, and double-submit prevention.
Tests (expanded)
src/components/status/__tests__/status-bottom-sheet.test.tsx
Heavily expanded/refactored tests to cover toasts, submitting flows, preselection, loading states, multi-step navigation, note validation, destination/call/station switching, active-call timing, save success/failure, and double-submit prevention; introduces toast store and showToast mocks and extended translation mocks.
Translations (i18n keys added)
src/translations/en.json, src/translations/es.json, src/translations/ar.json
Added keys: common.submitting, status.selected_status, status.status_saved_successfully, status.failed_to_save_status. Minor formatting tweak in es.json.

Sequence Diagram(s)

sequenceDiagram
  participant U as User
  participant SBS as StatusBottomSheet
  participant SVC as saveUnitStatus
  participant CORE as Core State (Active Call)
  participant TOAST as Toast Store

  U->>SBS: Open bottom sheet
  SBS->>SBS: Preselect destination/status if eligible
  U->>SBS: Select status/destination/note
  U->>SBS: Submit
  SBS->>SBS: Set isSubmitting, disable navigation
  SBS->>SVC: saveUnitStatus(payload)
  alt Success
    SVC-->>SBS: OK
    SBS->>CORE: Update active call if changed
    SBS->>TOAST: showToast(success)
  else Failure
    SVC-->>SBS: Error
    SBS->>TOAST: showToast(error)
  end
  SBS->>SBS: Clear isSubmitting, re-enable actions
Loading

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~45 minutes

Poem

I tap my paws on checkmarked cards so bright,
Steps hop by—some optional, some tight.
A spinner hums while saving through the night,
A toast proclaims success; I thump in light.
If errors nibble, I try again — delight. 🥕🐇


📜 Recent review details

Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between b91a662 and e68d602.

📒 Files selected for processing (1)
  • src/components/status/status-bottom-sheet.tsx (17 hunks)
🧰 Additional context used
🧬 Code Graph Analysis (1)
src/components/status/status-bottom-sheet.tsx (5)
src/api/units/unitStatuses.ts (1)
  • saveUnitStatus (23-32)
src/services/aptabase.service.ts (1)
  • reset (146-150)
src/lib/logging/index.tsx (1)
  • error (74-76)
src/components/ui/index.tsx (1)
  • TouchableOpacity (18-18)
src/components/ui/button/index.tsx (2)
  • Button (334-334)
  • ButtonText (334-334)
🔇 Additional comments (24)
src/components/status/status-bottom-sheet.tsx (24)

1-1: Import of Check icon is correctly added.

The Check icon import is properly added to support the new card-based selection UI.


5-5: TouchableOpacity import is correctly added.

The TouchableOpacity import is properly added to support the new touchable card interface.


14-14: Toast store integration is properly implemented.

The useToastStore import is correctly added to support user feedback on submit operations.


29-31: State management enhancements look good.

The addition of isSubmitting state, hasPreselectedRef for tracking preselection, and showToast from the toast store are well-implemented for managing submission flow and user feedback.


114-122: Note type logic correctly updated.

The migration from boolean-based note checking to numeric note types (0=none, 1=optional, 2=required) is properly implemented and handles all cases correctly.


125-133: Consistent note type handling.

The note type logic is consistently applied in the destination selection step, maintaining proper flow control.


158-165: Double submission prevention correctly implemented.

The guard clause and isSubmitting state properly prevent double submissions while maintaining clean error handling.


203-207: Active call synchronization moved to submit.

The active call synchronization logic has been correctly moved from selection handlers to the submit phase, which is more appropriate and prevents premature state changes.


210-218: Toast feedback implementation is excellent.

Success and error toast notifications provide clear user feedback with proper internationalization keys.


219-244: Dependency array correctly updated.

All new dependencies (isSubmitting, activeCallId, setActiveCall, showToast, t) are properly included in the useCallback dependency array.


293-308: Smart destination selection logic is well-designed.

The shouldShowNoDestinationAsSelected logic elegantly handles the complex case of preventing "No Destination" from appearing selected when an active call should be preselected.


313-316: Note type variables correctly updated.

The note type checking has been properly updated to use numeric values with clear semantic meaning (1=optional, 2=required).


357-358: Total steps calculation enhanced.

The step calculation logic properly accounts for the new note type system and provides accurate step counts.


392-393: Submit guard in step validation.

Preventing step progression during submission is a good UX improvement that avoids confusing navigation states.


407-433: Destination display logic is robust.

The enhanced getSelectedDestinationDisplay function handles various edge cases including loading states, fallback to activeCallId, and proper prioritization of selected items.


460-494: Status selection UI successfully converted to cards.

The TouchableOpacity-based card interface with Check icons provides a modern, touch-friendly selection experience. The conditional styling and icon visibility work correctly.


483-485: Note type display correctly updated.

The note type descriptions properly use the numeric values (1=optional, 2=required) for user clarity.


511-522: No Destination card uses smart selection logic.

The card correctly uses shouldShowNoDestinationAsSelected instead of directly checking destination type, preventing UI inconsistencies during preselection.


543-570: Call selection cards properly implemented.

The TouchableOpacity cards for calls maintain consistent styling with proper selection states and Check icons.


575-601: Station selection cards are well-implemented.

Station cards follow the same pattern as calls, providing consistent user experience across destination types.


627-630: Submit button with loading state.

The submit button correctly shows spinner and "Submitting..." text during async operations, with proper disable state.


637-648: Selected status display added.

The addition of selected status display in the note step provides helpful context for users, enhancing the overall UX.


660-667: Navigation buttons properly disabled during submission.

Both previous and submit buttons are correctly disabled during submission to prevent navigation conflicts.


254-289: Preselection logic is self-contained and conflict-free

I’ve traced every setSelectedCall and setSelectedDestinationType call in this component and inspected all useEffect/useLayoutEffect hooks:

• All state updates live within this bottom sheet or in unrelated components
• The only other effects here initialize the offline manager and fetch data—they don’t touch these two pieces of state
• The layout-effect’s two branches cover both “immediate” and “post-load” preselection without overlap

No overlapping hooks or assignments were found that could introduce a race condition.

✨ Finishing Touches
  • 📝 Generate Docstrings
🧪 Generate unit tests
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch develop

🪧 Tips

Chat

There are 3 ways to chat with CodeRabbit:

  • Review comments: Directly reply to a review comment made by CodeRabbit. Example:
    • I pushed a fix in commit <commit_id>, please review it.
    • Open a follow-up GitHub issue for this discussion.
  • Files and specific lines of code (under the "Files changed" tab): Tag @coderabbitai in a new review comment at the desired location with your query.
  • PR comments: Tag @coderabbitai in a new PR comment to ask questions about the PR branch. For the best results, please provide a very specific query, as very limited context is provided in this mode. Examples:
    • @coderabbitai gather interesting stats about this repository and render them as a table. Additionally, render a pie chart showing the language distribution in the codebase.
    • @coderabbitai read the files in the src/scheduler package and generate a class diagram using mermaid and a README in the markdown format.

Support

Need help? Create a ticket on our support page for assistance with any issues or questions.

CodeRabbit Commands (Invoked using PR/Issue comments)

Type @coderabbitai help to get the list of available commands.

Other keywords and placeholders

  • Add @coderabbitai ignore anywhere in the PR description to prevent this PR from being reviewed.
  • Add @coderabbitai summary to generate the high-level summary at a specific location in the PR description.
  • Add @coderabbitai anywhere in the PR title to generate the title automatically.

CodeRabbit Configuration File (.coderabbit.yaml)

  • You can programmatically configure CodeRabbit by adding a .coderabbit.yaml file to the root of your repository.
  • Please see the configuration documentation for more information.
  • If your editor has YAML language server enabled, you can add the path at the top of this file to enable auto-completion and validation: # yaml-language-server: $schema=https://coderabbit.ai/integrations/schema.v2.json

Status, Documentation and Community

  • Visit our Status Page to check the current availability of CodeRabbit.
  • Visit our Documentation for detailed information on how to use CodeRabbit.
  • Join our Discord Community to get help, request features, and share feedback.
  • Follow us on X/Twitter for updates and announcements.

Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 0

🔭 Outside diff range comments (1)
src/components/status/status-bottom-sheet.tsx (1)

482-486: Fix inverted note type display text.

The display text for note types is inverted. When Note === 1 (optional), it shows "note_required", and when Note === 2 (required), it shows "note_optional".

 {status.Note > 0 && (
   <Text className="text-xs text-gray-500 dark:text-gray-500">
-    {status.Note === 1 && t('status.note_required')}
-    {status.Note === 2 && t('status.note_optional')}
+    {status.Note === 1 && t('status.note_optional')}
+    {status.Note === 2 && t('status.note_required')}
   </Text>
 )}
🧹 Nitpick comments (3)
test-note-types.js (1)

1-37: Consider moving this diagnostic script to a more appropriate location.

This appears to be a diagnostic/demo script. A few suggestions:

  1. Move it to a scripts/ or docs/ directory to keep the root clean
  2. Add a shebang line (#!/usr/bin/env node) if it's meant to be executable
  3. The implementation details on lines 33-34 don't match the actual code - in status-bottom-sheet.tsx, isNoteRequired is noteType === 2 and isNoteOptional is noteType === 1 (reversed from what's shown here)
+#!/usr/bin/env node
 // Simple test script to verify NoteType behavior
 // This demonstrates the three NoteType states based on user requirements

 const noteTypeTests = [
   {
     name: "NoteType 0 - Don't show note step",
     noteType: 0,
     expected: 'No note step shown, submits directly',
   },
   {
     name: 'NoteType 1 - Note is optional',
     noteType: 1,
     expected: "Note step shown with '(Optional)' indicator, can submit without note",
   },
   {
     name: 'NoteType 2 - Note is required',
     noteType: 2,
     expected: "Note step shown without '(Optional)' indicator, submit disabled until note provided",
   },
 ];

 console.log('Note Type Behavior Mapping:');
 console.log('='.repeat(50));

 noteTypeTests.forEach((test) => {
   console.log(`${test.name}:`);
   console.log(`  NoteType: ${test.noteType}`);
   console.log(`  Behavior: ${test.expected}`);
   console.log('');
 });

 console.log('Implementation Details:');
-console.log('- isNoteRequired = noteType === 2');
-console.log('- isNoteOptional = noteType === 1');
+console.log('- isNoteRequired = noteType === 2 // NoteType 2 = required');
+console.log('- isNoteOptional = noteType === 1 // NoteType 1 = optional');
 console.log('- Note step shown when noteType > 0');
 console.log('- Submit validation: !isNoteRequired || note.trim().length > 0');
src/components/status/status-bottom-sheet.tsx (2)

254-291: Consider consolidating the pre-selection logic to avoid potential race conditions.

The two useLayoutEffect hooks (lines 254-280 and 283-290) that handle pre-selection could potentially race with each other. Consider combining them into a single effect to ensure predictable behavior.

-  // Pre-select active call when opening with calls enabled
-  React.useLayoutEffect(() => {
-    // Reset the pre-selection flag when bottom sheet closes
-    if (!isOpen) {
-      hasPreselectedRef.current = false;
-      return;
-    }
-
-    // Immediate pre-selection: if we have the conditions met, pre-select right away
-    // This runs on every render to catch the case where availableCalls loads in
-    if (isOpen && selectedStatus && (selectedStatus.Detail === 2 || selectedStatus.Detail === 3) && activeCallId && !selectedCall && selectedDestinationType === 'none' && !hasPreselectedRef.current) {
-      // Check if we have calls available (loaded) or should wait
-      if (!isLoading && availableCalls.length > 0) {
-        const activeCall = availableCalls.find((call) => call.CallId === activeCallId);
-        if (activeCall) {
-          // Update both states immediately in the same render cycle
-          setSelectedDestinationType('call');
-          setSelectedCall(activeCall);
-          hasPreselectedRef.current = true;
-        }
-      } else if (isLoading || availableCalls.length === 0) {
-        // If still loading, immediately set destination type to 'call' to prevent "No Destination" from showing
-        // We'll set the actual call once it loads
-        setSelectedDestinationType('call');
-        hasPreselectedRef.current = true;
-      }
-    }
-  }, [isOpen, isLoading, selectedStatus, activeCallId, availableCalls, selectedCall, selectedDestinationType, setSelectedCall, setSelectedDestinationType]);
-
-  // Additional effect to set the actual call once it becomes available
-  React.useLayoutEffect(() => {
-    if (isOpen && selectedStatus && (selectedStatus.Detail === 2 || selectedStatus.Detail === 3) && activeCallId && !selectedCall && selectedDestinationType === 'call' && !isLoading && availableCalls.length > 0) {
-      const activeCall = availableCalls.find((call) => call.CallId === activeCallId);
-      if (activeCall) {
-        setSelectedCall(activeCall);
-      }
-    }
-  }, [isOpen, selectedStatus, activeCallId, selectedCall, selectedDestinationType, isLoading, availableCalls, setSelectedCall]);
+  // Pre-select active call when opening with calls enabled
+  React.useLayoutEffect(() => {
+    // Reset the pre-selection flag when bottom sheet closes
+    if (!isOpen) {
+      hasPreselectedRef.current = false;
+      return;
+    }
+
+    // Check if we should pre-select
+    const shouldPreselect = isOpen && selectedStatus && 
+      (selectedStatus.Detail === 2 || selectedStatus.Detail === 3) && 
+      activeCallId && !selectedCall;
+
+    if (!shouldPreselect) return;
+
+    // Handle pre-selection based on loading state
+    if (selectedDestinationType === 'none' && !hasPreselectedRef.current) {
+      if (!isLoading && availableCalls.length > 0) {
+        const activeCall = availableCalls.find((call) => call.CallId === activeCallId);
+        if (activeCall) {
+          setSelectedDestinationType('call');
+          setSelectedCall(activeCall);
+          hasPreselectedRef.current = true;
+        }
+      } else if (isLoading || availableCalls.length === 0) {
+        // Set destination type while loading to prevent "No Destination" from showing
+        setSelectedDestinationType('call');
+        hasPreselectedRef.current = true;
+      }
+    } else if (selectedDestinationType === 'call' && !isLoading && availableCalls.length > 0) {
+      // Set the actual call once it becomes available
+      const activeCall = availableCalls.find((call) => call.CallId === activeCallId);
+      if (activeCall) {
+        setSelectedCall(activeCall);
+      }
+    }
+  }, [isOpen, isLoading, selectedStatus, activeCallId, availableCalls, selectedCall, selectedDestinationType, setSelectedCall, setSelectedDestinationType]);

25-676: Consider breaking down this component for better maintainability.

The StatusBottomSheet component has grown to 676 lines with complex state management and multiple conditional renders. Consider extracting sub-components for better maintainability:

  1. StatusSelectionStep - for status selection UI (lines 456-505)
  2. DestinationSelectionStep - for destination selection UI (lines 507-615)
  3. NoteInputStep - for note input UI (lines 635-671)
  4. StepIndicator - for step progress display (lines 445-450)

This would make the code more modular and easier to test.

📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 7da75d0 and 16e2c09.

📒 Files selected for processing (6)
  • src/components/status/__tests__/status-bottom-sheet.test.tsx (24 hunks)
  • src/components/status/status-bottom-sheet.tsx (17 hunks)
  • src/translations/ar.json (3 hunks)
  • src/translations/en.json (3 hunks)
  • src/translations/es.json (3 hunks)
  • test-note-types.js (1 hunks)
🔇 Additional comments (13)
src/translations/en.json (1)

330-330: LGTM!

The new translation keys are properly formatted and follow consistent naming conventions. The English text is grammatically correct and aligns with the UI messaging patterns used throughout the application.

Also applies to: 593-593, 607-607, 610-611

src/translations/ar.json (1)

330-330: LGTM!

The Arabic translations are properly formatted and appear to be accurate translations of the English text. The keys match across all locale files.

Also applies to: 593-593, 607-607, 610-611

src/translations/es.json (1)

330-330: LGTM!

The Spanish translations are properly formatted and accurately translated. The keys are consistent across all locale files.

Also applies to: 593-593, 607-607, 610-611

src/components/status/__tests__/status-bottom-sheet.test.tsx (10)

8-8: LGTM! Toast store mock setup follows established patterns.

The toast store import and mock configuration is correctly implemented and consistent with the existing mock patterns in the test file.

Also applies to: 35-37, 122-122, 133-133, 204-204


77-77: Translation keys properly added for enhanced user feedback.

The new translation keys for submission state and save outcomes are well-named and follow the existing conventions.

Also applies to: 90-90, 99-100


339-380: Well-structured test validating deferred active call assignment.

Good test coverage ensuring that active call is not prematurely set during selection, maintaining proper state management flow.


679-869: Excellent comprehensive test coverage for active call management during submission.

These tests thoroughly validate all scenarios for active call assignment at submission time, including edge cases and preventing unnecessary updates.


871-947: Excellent end-to-end test for multi-step active call management.

This integration test effectively validates that active call assignment is deferred until the final submission, ensuring proper state management through the entire user flow.


1251-1586: Thorough test coverage for active call pre-selection logic.

Excellent suite of tests covering all pre-selection scenarios with proper async handling and edge case validation.


1588-1717: Good visual state validation for pre-selection behavior.

These tests ensure proper visual feedback during pre-selection, preventing confusing UI states where multiple options appear selected.


1738-1777: Tests properly validate the UI redesign to touchable cards.

Good coverage of the new TouchableOpacity-based UI with checkmark indicators for both status and destination selection.


2237-2409: Comprehensive test coverage for submission flow and user feedback.

Excellent tests validating submission state management, toast notifications, and protection against double submission. The async handling is properly implemented.


2410-2518: Good edge case coverage for destination display logic.

These tests ensure robust handling of transitional states and incomplete data scenarios in the destination display.

Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 1

📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 16e2c09 and b91a662.

📒 Files selected for processing (1)
  • src/components/status/status-bottom-sheet.tsx (17 hunks)
🧰 Additional context used
🧬 Code Graph Analysis (1)
src/components/status/status-bottom-sheet.tsx (5)
src/api/units/unitStatuses.ts (1)
  • saveUnitStatus (23-32)
src/services/aptabase.service.ts (1)
  • reset (146-150)
src/lib/logging/index.tsx (1)
  • error (74-76)
src/components/ui/index.tsx (1)
  • TouchableOpacity (18-18)
src/components/ui/button/index.tsx (2)
  • Button (334-334)
  • ButtonText (334-334)
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (1)
  • GitHub Check: test
🔇 Additional comments (22)
src/components/status/status-bottom-sheet.tsx (22)

1-1: LGTM!

Good addition of the Check icon import to replace the previous radio-based selection UI with card-like selection items.


14-14: LGTM!

Appropriate addition of toast store for user feedback on submit operations.


29-31: LGTM!

Good addition of submission state management and preselection tracking to prevent double submissions and control preselection behavior.


125-133: LGTM!

Consistent application of the noteType logic for flow control. The implementation correctly handles the three states: no note (0), optional note (1), and required note (2).


158-165: LGTM!

Excellent implementation of double-submission prevention with early return and proper state management.


203-207: LGTM!

Good implementation that only updates the active call when necessary, avoiding unnecessary state changes when the selected call is already active.


210-220: LGTM!

Excellent user feedback implementation with success and error toasts, plus proper cleanup in the finally block.


294-309: LGTM!

Well-implemented memoized logic for determining when to show "No Destination" as selected. The logic correctly handles edge cases and prevents premature selection.


314-316: LGTM!

Consistent usage of the noteType semantics throughout the component. The variable naming clearly indicates the purpose.


358-359: LGTM!

Correct application of the noteType logic in the total steps calculation, maintaining consistency with the rest of the component.


393-394: LGTM!

Good guard to prevent navigation while submitting, maintaining UI consistency and preventing potential race conditions.


408-434: LGTM!

Excellent robust destination display logic that handles multiple scenarios including loading states, fallbacks, and edge cases. The prioritization logic (selectedCall > selectedStation > fallback lookup) is well thought out.


461-495: LGTM!

Excellent refactor from radio buttons to card-based selection with TouchableOpacity and Check icons. The visual feedback and accessibility are improved with the new design.


484-486: LGTM!

Consistent display of noteType values with proper user-friendly labels. The conditional rendering correctly maps the backend values to UI text.


514-517: LGTM!

Good use of the shouldShowNoDestinationAsSelected logic to prevent visual inconsistencies during preselection scenarios.


544-571: LGTM!

Excellent implementation of card-based selection for calls with proper loading states, visual feedback, and consistent styling.


576-602: LGTM!

Consistent implementation of card-based selection for stations, maintaining the same pattern as calls with proper visual feedback.


628-631: LGTM!

Good implementation of loading state feedback during submission with spinner and disabled state management.


638-644: LGTM!

Good addition of selected status display in the note step, providing better context for the user about their current selection.


661-668: LGTM!

Consistent implementation of loading state feedback and proper disabled state management for both Previous and Submit buttons.


254-281: Confirm Complex Preselection Logic Stability

I didn’t find any other hasPreselectedRef–driven effects or similar multi-state layout effects elsewhere in the repo, so this is the only place with this degree of conditional branching. Because it updates two pieces of state in one layout pass and relies on several flags toggling in quick succession, it remains prone to race conditions or intermittent “no destination” flashes when isOpen or loading status changes rapidly.

Please review and consider:

  • src/components/status/status-bottom-sheet.tsx (lines 254–281)
    • Can this effect be split into smaller hooks or utility functions to isolate concerns?
    • Verify that hasPreselectedRef reliably prevents duplicate pre-selection across renders.
    • Add targeted unit or integration tests covering open/close and loading transitions.

114-122: Confirm noteType semantics: 0 = no note, 1 = optional note, 2 = required note

All evidence aligns with this mapping:

  • src/models/v4/statuses/statusesResultData.ts declares
    public Note: number = 0; // Note Type
  • CustomStatusResultData (used by getStatusProperty) likewise defaults Note: number = 0
  • Tests in src/components/status/tests/status-bottom-sheet.test.tsx assert that
    Note: 1 renders “Note optional”
    Note: 2 renders “Note required”
  • Code in status-bottom-sheet.tsx uses
    noteType === 2 to enforce a required note
    noteType > 0 to show an add-note step

No inconsistencies found—no changes required.

@ucswift
Copy link
Member Author

ucswift commented Aug 12, 2025

Approve

Copy link

@github-actions github-actions bot left a comment

Choose a reason for hiding this comment

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

This PR is approved.

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.

2 participants