Skip to content

feat: add Enable Mobile Ringing toggle in user preferences#7155

Merged
diegolmello merged 3 commits into
feat.voip-lib-newfrom
chore/enable-mobile-ringing
Apr 20, 2026
Merged

feat: add Enable Mobile Ringing toggle in user preferences#7155
diegolmello merged 3 commits into
feat.voip-lib-newfrom
chore/enable-mobile-ringing

Conversation

@diegolmello

@diegolmello diegolmello commented Apr 14, 2026

Copy link
Copy Markdown
Member

Proposed changes

Adds an Enable Mobile Ringing toggle to UserPreferencesView, matching the web client. When enabled, incoming video conference calls ring the device like a phone call. Server-side enterprise kill switch (VideoConf_Mobile_Ringing) is enforced silently by the server; no client-side check needed for MVP.

  • INotificationPreferences: adds optional enableMobileRinging?: boolean
  • UserPreferencesView: adds version-gated (server >= 6.10.0) Switch wired to saveUserPreferences() + dispatch(setUser(...)), following the existing convertAsciiEmoji pattern
  • en.json: adds Enable_Mobile_Ringing key

Issue(s)

https://rocketchat.atlassian.net/browse/VMUX-72

How to test or reproduce

  1. Connect to a Rocket.Chat server with version >= 6.10.0.
  2. Go to Profile → Preferences.
  3. Verify the Enable Mobile Ringing toggle is visible in the preferences section.
  4. Toggle it on/off and verify users.setPreferences is called with enableMobileRinging: <value>.
  5. Connect to a server < 6.10.0 and verify the toggle is NOT visible.

Screenshots

N/A

Types of changes

  • Bugfix (non-breaking change which fixes an issue)
  • Improvement (non-breaking change which improves a current function)
  • New feature (non-breaking change which adds functionality)
  • Documentation update (if none of the other choices apply)

Checklist

  • I have read the CONTRIBUTING doc
  • I have signed the CLA
  • Lint and unit tests pass locally with my changes
  • I have added tests that prove my fix is effective or that my feature works (if applicable)
  • I have added necessary documentation (if applicable)
  • Any dependent changes have been merged and published in downstream modules

Further comments

Targets feat.voip-lib-new (not develop) since this stacks on the VoIP feature branch. MVP scope per ~/plans/enable-mobile-ringing/plan.md — no enterprise kill switch check (server enforces silently), no test additions (deferred).

Summary by CodeRabbit

  • New Features
    • Added mobile ringing option with localized labels in 25+ languages (including EN, ES, FR, DE, PT, RU, ZH, JA).
    • New user preference toggle for mobile ringing exposed in Preferences (visible when running server 6.10.0+); changes persist to user settings.

@coderabbitai

coderabbitai Bot commented Apr 14, 2026

Copy link
Copy Markdown
Contributor

Caution

Review failed

The pull request is closed.

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: 9404cbc9-b53f-471c-9109-e9753db8f0c5

📥 Commits

Reviewing files that changed from the base of the PR and between 17b0714 and ba7f633.

📒 Files selected for processing (27)
  • app/definitions/IUser.ts
  • app/i18n/locales/ar.json
  • app/i18n/locales/bn-IN.json
  • app/i18n/locales/cs.json
  • app/i18n/locales/de.json
  • app/i18n/locales/en.json
  • app/i18n/locales/es.json
  • app/i18n/locales/fi.json
  • app/i18n/locales/fr.json
  • app/i18n/locales/hi-IN.json
  • app/i18n/locales/hu.json
  • app/i18n/locales/it.json
  • app/i18n/locales/ja.json
  • app/i18n/locales/nl.json
  • app/i18n/locales/nn.json
  • app/i18n/locales/no.json
  • app/i18n/locales/pt-BR.json
  • app/i18n/locales/pt-PT.json
  • app/i18n/locales/ru.json
  • app/i18n/locales/sl-SI.json
  • app/i18n/locales/sv.json
  • app/i18n/locales/ta-IN.json
  • app/i18n/locales/te-IN.json
  • app/i18n/locales/tr.json
  • app/i18n/locales/zh-CN.json
  • app/i18n/locales/zh-TW.json
  • app/views/UserPreferencesView/index.tsx

Walkthrough

Adds a new "Enable Mobile Ringing" localization key across multiple locale files, extends the notification preferences interface with enableMobileRinging?: boolean, and surfaces a server-version gated toggle in the UserPreferencesView that persists the preference.

Changes

Cohort / File(s) Summary
Localization files
app/i18n/locales/en.json, app/i18n/locales/ar.json, app/i18n/locales/bn-IN.json, app/i18n/locales/cs.json, app/i18n/locales/de.json, app/i18n/locales/es.json, app/i18n/locales/fi.json, app/i18n/locales/fr.json, app/i18n/locales/hi-IN.json, app/i18n/locales/hu.json, app/i18n/locales/it.json, app/i18n/locales/ja.json, app/i18n/locales/nl.json, app/i18n/locales/nn.json, app/i18n/locales/no.json, app/i18n/locales/pt-BR.json, app/i18n/locales/pt-PT.json, app/i18n/locales/ru.json, app/i18n/locales/sl-SI.json, app/i18n/locales/sv.json, app/i18n/locales/ta-IN.json, app/i18n/locales/te-IN.json, app/i18n/locales/tr.json, app/i18n/locales/zh-CN.json, app/i18n/locales/zh-TW.json
Added new i18n key Enable_Mobile_Ringing with translations in each locale.
Type definitions
app/definitions/IUser.ts
Added optional property enableMobileRinging?: boolean to INotificationPreferences.
Preferences view / persistence
app/views/UserPreferencesView/index.tsx
Reads settings.preferences.enableMobileRinging, adds toggleEnableMobileRinging to dispatch/save updated preference, and renders a server-version gated toggle list item (serverVersion >= 6.10.0).

Sequence Diagram(s)

sequenceDiagram
    participant User as User (UI)
    participant View as UserPreferencesView
    participant Store as Redux Store / Dispatcher
    participant API as saveUserPreferences (API)
    User->>View: taps "Enable Mobile Ringing" toggle
    View->>Store: dispatch update (preferences.enableMobileRinging = !current)
    Store->>API: persist updated preferences
    API-->>Store: success / error
    Store-->>View: updated state or error
    View-->>User: updated toggle UI (or show error)
Loading

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~20 minutes

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title accurately summarizes the main change: adding an Enable Mobile Ringing toggle to user preferences, which aligns with all 24 locale file additions.
Linked Issues check ✅ Passed The PR addresses VMUX-72 by adding Enable_Mobile_Ringing i18n keys across 24 locale files for the notification preference screen toggle.
Out of Scope Changes check ✅ Passed All changes are in-scope: the PR adds Enable_Mobile_Ringing localization strings across 24 language files, directly supporting the feature implementation described in PR objectives.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.


Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@coderabbitai coderabbitai Bot 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.

Actionable comments posted: 1

🧹 Nitpick comments (2)
app/views/UserPreferencesView/index.tsx (1)

30-30: Normalize enableMobileRinging to a boolean before binding/toggling.

Using a default boolean avoids undefined-driven toggle behavior and keeps Switch usage deterministic.

Proposed fix
-const enableMobileRinging = settings?.preferences?.enableMobileRinging;
+const enableMobileRinging = settings?.preferences?.enableMobileRinging ?? false;

Also applies to: 144-145, 149-149

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@app/views/UserPreferencesView/index.tsx` at line 30, The enableMobileRinging
value is read from settings and may be undefined—normalize it to a boolean
(e.g., const enableMobileRinging =
Boolean(settings?.preferences?.enableMobileRinging) or use ?? false) before
passing to the Switch or toggle handlers so the component always receives a
deterministic true/false; update every occurrence (the initial const
enableMobileRinging and places around lines referencing the Switch/toggle at
144-149 and 149) to use the normalized boolean and ensure any toggle handlers
rely on the normalized value.
app/i18n/locales/en.json (1)

317-317: Add this key to non-English locale bundles before release.

Line 317 introduces the new key only in en.json; please propagate it to the other locale files so non-English/RTL users don’t get fallback/mixed-language UI.

As per coding guidelines, "Place internationalization configuration and locales in app/i18n/ with support for 40+ languages and RTL".

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@app/i18n/locales/en.json` at line 317, Add the new i18n key
"Enable_Mobile_Ringing" to every non-English locale bundle (including all RTL
and supported language files) so no locale falls back to English; update each
locale's JSON with the same key and an appropriate translated value, ensuring
pluralization/formatting conventions are preserved and merge/commit the updated
locale files alongside the en.json change.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@app/views/UserPreferencesView/index.tsx`:
- Around line 62-65: The dispatched payload in toggleEnableMobileRinging
overwrites the entire preferences object with only enableMobileRinging, losing
sibling preference fields; update the dispatch to merge existing preferences
(use settings.preferences or settings?.preferences) into the new preferences
object so you dispatch setUser with settings: { ...settings, preferences: {
...settings.preferences, enableMobileRinging: value } } and then call
saveUserPreferences as before.

---

Nitpick comments:
In `@app/i18n/locales/en.json`:
- Line 317: Add the new i18n key "Enable_Mobile_Ringing" to every non-English
locale bundle (including all RTL and supported language files) so no locale
falls back to English; update each locale's JSON with the same key and an
appropriate translated value, ensuring pluralization/formatting conventions are
preserved and merge/commit the updated locale files alongside the en.json
change.

In `@app/views/UserPreferencesView/index.tsx`:
- Line 30: The enableMobileRinging value is read from settings and may be
undefined—normalize it to a boolean (e.g., const enableMobileRinging =
Boolean(settings?.preferences?.enableMobileRinging) or use ?? false) before
passing to the Switch or toggle handlers so the component always receives a
deterministic true/false; update every occurrence (the initial const
enableMobileRinging and places around lines referencing the Switch/toggle at
144-149 and 149) to use the normalized boolean and ensure any toggle handlers
rely on the normalized value.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: 842a9512-5b33-4c40-b67b-105a6a7bde3e

📥 Commits

Reviewing files that changed from the base of the PR and between 2143aba and 8f0bec8.

📒 Files selected for processing (3)
  • app/definitions/IUser.ts
  • app/i18n/locales/en.json
  • app/views/UserPreferencesView/index.tsx
📜 Review details
🧰 Additional context used
📓 Path-based instructions (7)
**/*.{js,jsx,ts,tsx,json}

📄 CodeRabbit inference engine (CLAUDE.md)

Configure Prettier with tabs, single quotes, 130 character width, no trailing commas, arrow parens avoid, and bracket same line

Files:

  • app/i18n/locales/en.json
  • app/definitions/IUser.ts
  • app/views/UserPreferencesView/index.tsx
app/i18n/**/*

📄 CodeRabbit inference engine (CLAUDE.md)

Place internationalization configuration and locales in app/i18n/ with support for 40+ languages and RTL

Files:

  • app/i18n/locales/en.json
**/*.{js,jsx,ts,tsx}

📄 CodeRabbit inference engine (CLAUDE.md)

Use ESLint with @rocket.chat/eslint-config base configuration including React, React Native, TypeScript, and Jest plugins

Files:

  • app/definitions/IUser.ts
  • app/views/UserPreferencesView/index.tsx
**/*.{ts,tsx}

📄 CodeRabbit inference engine (CLAUDE.md)

Use TypeScript with strict mode enabled and configure baseUrl to app/ for import resolution

**/*.{ts,tsx}: Use TypeScript for type safety; add explicit type annotations to function parameters and return types
Prefer interfaces over type aliases for defining object shapes in TypeScript
Use enums for sets of related constants rather than magic strings or numbers

Files:

  • app/definitions/IUser.ts
  • app/views/UserPreferencesView/index.tsx
app/definitions/**/*.{ts,tsx}

📄 CodeRabbit inference engine (CLAUDE.md)

Place shared TypeScript type definitions in app/definitions/

Files:

  • app/definitions/IUser.ts
**/*.{js,ts,jsx,tsx}

📄 CodeRabbit inference engine (AGENTS.md)

**/*.{js,ts,jsx,tsx}: Use descriptive names for functions, variables, and classes that clearly convey their purpose
Write comments that explain the 'why' behind code decisions, not the 'what'
Keep functions small and focused on a single responsibility
Use const by default, let when reassignment is needed, and avoid var
Prefer async/await over .then() chains for handling asynchronous operations
Use explicit error handling with try/catch blocks for async operations
Avoid deeply nested code; refactor complex logic into helper functions

Files:

  • app/definitions/IUser.ts
  • app/views/UserPreferencesView/index.tsx
app/views/**/*.{ts,tsx}

📄 CodeRabbit inference engine (CLAUDE.md)

Place screen components in app/views/ directory

Files:

  • app/views/UserPreferencesView/index.tsx
🔇 Additional comments (2)
app/definitions/IUser.ts (1)

115-115: Type addition is clean and correctly scoped.

enableMobileRinging?: boolean in INotificationPreferences is a good extension point for the new preference flow.

app/views/UserPreferencesView/index.tsx (1)

138-153: Version gating is correctly implemented for the new preference UI.

Rendering the row only for serverVersion >= 6.10.0 matches the PR objective and avoids exposing unsupported settings.

Comment thread app/views/UserPreferencesView/index.tsx
@diegolmello diegolmello force-pushed the chore/enable-mobile-ringing branch from 8f0bec8 to c979bae Compare April 20, 2026 14:31
@diegolmello diegolmello force-pushed the chore/enable-mobile-ringing branch from c979bae to 7ba5863 Compare April 20, 2026 14:33
@diegolmello diegolmello had a problem deploying to official_android_build April 20, 2026 14:38 — with GitHub Actions Error
@diegolmello diegolmello had a problem deploying to experimental_ios_build April 20, 2026 14:38 — with GitHub Actions Error
@diegolmello diegolmello had a problem deploying to experimental_android_build April 20, 2026 14:38 — with GitHub Actions Error
@diegolmello diegolmello force-pushed the chore/enable-mobile-ringing branch from 7ba5863 to a5c120a Compare April 20, 2026 14:43
@diegolmello diegolmello force-pushed the chore/enable-mobile-ringing branch from 17b0714 to 62a05b0 Compare April 20, 2026 14:45
@diegolmello diegolmello merged commit abefd00 into feat.voip-lib-new Apr 20, 2026
2 checks passed
@diegolmello diegolmello deleted the chore/enable-mobile-ringing branch April 20, 2026 14:46
diegolmello added a commit that referenced this pull request Apr 22, 2026
…/Decline (#7215)

* merge feat.voip-lib

* feat(voip): enhance call handling with UUID mapping and event listeners

* Base call UI

* feat(voip): integrate Zustand for call state management and enhance CallView UI

* feat(voip): add simulateCall function for mock call handling in UI development

* refactor(CallView): update button handlers and improve UI responsiveness

* Add pause-shape-unfilled icon

* Base CallHeader

* toggleFocus

* collapse buttons

* Header components

* Hide header when no call

* Timer

* Add use memo

* Add voice call item on sidebar

* cleanup

* Temp use @rocket.chat/media-signaling from .tgz

* cleanup

* Check module and permissions to enable voip

* Refactor stop method to use optional chaining for media signal listeners

* voip push first test

* Add VoIP call handling with pending call management

- Implemented VoIP push notification handling in index.js, including storing call info for later processing.
- Added CallKeep event handlers for answering and ending calls from a cold start.
- Introduced a new CallIdUUID module to convert call IDs to deterministic UUIDs for compatibility with CallKit.
- Created a pending call store to manage incoming calls when the app is not fully initialized.
- Updated deep linking actions to include VoIP call handling.
- Enhanced MediaSessionInstance to process pending calls and manage call states effectively.

* Remove pending store and create getInitialEvents on app/index

* Attempt to make iOS calls work from cold state

* lint and format

* Patch callkeep ios

* Temp send iOS voip push token on gcm

* Temp fix require cycle

* chore: format code and fix lint issues [skip ci]

* CallIDUUID module on android and voip push

* Add setCallUUID on useCallStore to persist calls accepted on native Android

* remove callkeep from notification

* Android Incoming Call UI POC

* Refactor VoIP handling: Migrate VoIP-related classes to a new package structure, removing deprecated modules and consolidating functionality. Update imports in MainApplication and NotificationIntentHandler to reflect changes. This cleanup enhances code organization and prepares for future VoIP feature enhancements.

* Remove VoipForegroundService

* cleanup and use caller instead of callerName

* Cleanup and make iOS build again

* Refactor VoIP handling: Remove unused event emissions for call answered and declined, switch from SharedPreferences to in-memory storage for pending VoIP call data, and update method signatures for better clarity. This cleanup enhances performance and prepares for future VoIP feature improvements.

* Refactor VoIP handling: Introduce a new VoipPayload class to encapsulate call data, streamline notification processing, and enhance method signatures across the VoIP module. This update improves code clarity and prepares for future feature enhancements.

* Migrate react-native-voip-push-notifications to VoipModule

* Refactor VoIP module: Update package structure by moving VoipTurboPackage to the main package and removing the obsolete NativeVoipSpec class. Adjust imports in MainApplication and VoipModule to reflect these changes, enhancing code organization and maintainability.

* Unify emitters

* Move CallKeep listeners from MediaSessionInstance to getInitialEvents

* Clear callkeep on endcall

* Unify getInitialEvents logic

* getInitialEvents -> MediaCallEvents

* chore: format code and fix lint issues [skip ci]

* feat(Android): Add full screen incoming call (#6977)

* feat: Update call UI (#6990)

* feat: Handle audio routing, e.g., Bluetooth headset vs. internal speaker switching (#6992)

* fix: empty space when not on call (#6993)

* feat: Dialpad (#7000)

* action: organized translations

* feat: start call (#7024)

* chore: format code and fix lint issues

* feat: Pre flight (#7038)

* action: organized translations

* feat: Receive voip push notifications from backend (#7045)

* feat: Refactor media session handling and improve disconnect logic (#7065)

* feat: Control incoming call from native (#7066)

* feat: Voice message blocks (#7057)

* feat: native accept success event (#7068)

* feat(voip): call waiting, busy detection, and videoconf blocking (#7077)

* action: organized translations

* feat(voip): tap-to-hide call controls with animations (#7078)

* feat(voip): navigate to call DM from message button and header (#7082)

* feat(voip): tablet and landscape layout (#7110)

* chore: develop into feat.voip-lib-new (RN 81 + Expo 54 + reanimated 4 + true-sheet + iOS 26) (#7114)

* chore: format code and fix lint issues

* feat(voip): android landscape layout for IncomingCallActivity (#7116)

* Update agents files

* feat(voip): Support a11y (#7106)

* Fix content cutting on iOS on some edge cases

* pods

* Ignore .worktrees on jest

* chore: Merge develop into feat.voip-lib-new (#7129)

* fix(voip): show CallKit UI when call is active in background (#7128)

* chore: Update media-signaling to 0.2.0 (#7153)

* feat(voip): migrate iOS accept/reject from DDP to REST (#7124)

* Fix icons

* feat(voip): migrate Android accept/reject from DDP to REST (#7127)

* test(voip): integration tests for CallView pipeline (#7161)

* feat(voip): display video conf provider as subtitle (#7160)

* fix(voip): CallView button grid and correct landscape/dialpad layouts (#7164)

* fix(voip): prevent stale MMKV cache on Android first-install accept

MMKVKeyManager.initialize ran in MainApplication.onCreate before the JS
engine started and opened the default MMKV file via the Tencent 1.2 JAR
when it was still empty. Tencent caches instances per-ID in a singleton
registry, so that empty-state view was held for the rest of the process.
JS later wrote credentials through react-native-mmkv (MMKV Core 2.0),
which has its own separate registry. When a VoIP push arrived,
Ejson.getMMKV() got the cached empty Tencent instance and reported
"No userId found in MMKV for server". Closing and reopening the app
cleared the cache, which is why only the very first call after install
failed.

Drop the open/verify block — the encryption key is already cached from
SecureKeystore, so no MMKV handle is needed here. The first Tencent
instance is now created inside Ejson.getMMKV() after JS has written,
so it scans the file fresh.

* fix(voip): prevent duplicate ringtone on Android incoming call (#7158)

* fix(voip): set explicit snaps for NewMediaCall bottom sheet (#7165)

* Update app/lib/services/voip/MediaSessionStore.ts

Co-authored-by: Pierre Lehnen <55164754+pierre-lehnen-rc@users.noreply.github.com>

* fix: make startVoipFork reactive to permissions-changed (#7151)

* fix(android): remove MediaProjectionService from merged manifest (#7190)

* fix(voip): Phone account creation (#7170)

* feat: add Enable Mobile Ringing toggle in user preferences (#7155)

* fix(voip): ship blockers for PushKit, licensing, outbound calls, push tokens (#7167)

* fix(android): Play Store mic discoverability, safer FCM logs, avatar auth via headers (#7171)

* fix(ios): serialize VoipService bridge statics (#7169)

* fix(voip): Android DDP thread safety and VoipPayload bundle parity (#7168)

* chore(voip): dead-code and hygiene sweep (#7174)

* refactor(voip): decouple navigateToCallRoom from Redux and backfill REST/connect tests (#7176)

* test(voip): tighten ringing endCall assertion and add VideoConf VoIP-lock saga coverage (#7177)

* fix(ios): harden VoIP DDP WebSocket client on receive failures and TLS (#7173)

* refactor(voip): MediaCallEvents Redux adapters and resetVoipState (#7178)

* refactor(voip): decouple peer autocomplete from Redux; simplify NewMediaCall (#7175)

* fix(ios): add NS_SWIFT_NAME to Challenge.runChallenge for Swift 6.2 compatibility

Swift 6.2 (Xcode 26.x / macos-26 runner) auto-renames the Objective-C
method runChallenge:didReceiveChallenge:completionHandler: to
run(_:didReceive:completionHandler:) when imported into Swift.

Add NS_SWIFT_NAME to explicitly pin the Swift import name, preventing
the compiler from applying its heuristics. This keeps the existing
Swift call site in DDPClient.swift working without changes.

* fix(ios): cancel old URLSession/webSocketTask before reconnecting in DDPClient.connect (#7197)

* fix(ios): add NSLock to nativeAcceptHandledCallIds and 10s REST timeout to handleNativeAccept (#7198)

* feat(android): create VoipCallService with FOREGROUND_SERVICE_MICROPHONE (#7199)

* fix(android): start VoipCallService on accept, stop on hangup/timeout, install end-call listener (#7200)

* fix(voip): enable DM nav for users with SIP extension (#7203)

* fix(android): handle null VoiceConnection in answerIncomingCall, notify JS (#7201)

* fix(voip): resolve closure capture ordering in handleNativeAccept (#7209)

* fix(android): integrate VoIP modules with SSL-pinned OkHttpClient (#7208)

* fix(push): gate id and voipToken behind server version checks, fix VideoConf caller extra (#7210)

* fix(voip): remove sensitive data from production logs (#7207)

* fix(android): remove isRunning guard + add double-tap guard on Accept/Decline

- VoipCallService: remove if (!isRunning) guard, call startForeground unconditionally
  (idempotent on Android, fixes Android 14+ foreground service requirement)
- IncomingCallActivity: add AtomicBoolean guard on handleAccept/handleDecline
  to prevent double-tap from triggering multiple service starts

---------

Co-authored-by: diegolmello <diegolmello@users.noreply.github.com>
Co-authored-by: Pierre Lehnen <55164754+pierre-lehnen-rc@users.noreply.github.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant