Releases: Resgrid/IC
Release list
1.35
Version 7.1.35 - 2026-07-25
Description
Overview
This PR implements RIC-T40 Fixes, a collection of stability, robustness, and feature improvements across the Resgrid IC mobile application.
Key Changes
🔐 Authentication Stability
- Single-flight token refresh: Introduced
refreshTokenSingleFlightwrapper to ensure concurrent refresh requests (from the axios 401 interceptor and proactive refresh timer) share a single in-flight request, preventing the rotating refresh token from being consumed multiple times. - Safe
expires_inhandling: Added fallback to 3600 seconds whenexpires_inis missing or undefined, preventing crashes during login, SSO login, and token refresh. - API timeouts: Added 15-second timeouts to the main API client and auth API instances.
🗺️ Maps Route Restructuring
- Moved Maps from a top-level unauthenticated route into the authenticated app shell as a hidden tab route, preserving the app header and tab bar across nested map screens.
- Added
maps-route.tshelper to dynamically set the correct header (drawer menu on landing, back button on child routes) and title based on the current pathname. - Created
_layout.tsxfor Maps with aStacknavigator supporting index, search, custom maps, and indoor maps screens.
🔍 Incidents Search
- Added a search bar to the incidents screen allowing filtering by CallId, CallNumber, Name, CallName, CallAddress, CommanderName, and CommandPostLocation.
- Shows a search-specific empty state when no results match, with a clear button to reset.
📍 Command Map Camera
- Implemented priority-based imperative camera recentering (saved view > ICP > first pin) to handle asynchronous pin/ICP arrival after mount.
- Added camera ref and auto-center priority tracking to avoid unnecessary recentering once a higher-priority target has been applied.
🛡️ Robustness & Null-Safety Fixes
- Map markers: Added null coalescing (
MapMakerInfos ?? []) in map rendering and SignalR update handler. - Cache manager: Graceful handling of corrupted cache entries (catches JSON parse errors, deletes the bad entry, returns null).
- Call detail: Validates dates with
isValidbefore formatting, falling back to raw string or empty value. - Contact notes: Safer date sorting that handles invalid dates without throwing.
- Units & Dispatch stores: Null-safe handling of API response data arrays.
📡 SignalR Improvements
- Access token factory now reads lazily from the auth store, ensuring automatic reconnects use the current valid token.
- Pending reconnect timers are now cancelled on disconnect, preventing stale reconnection attempts after teardown.
- Event listener callbacks are wrapped in try-catch to prevent unhandled errors from propagating.
📱 Push Notifications
- Moved
notifee.onBackgroundEventregistration to module scope so notification action presses work when the app is killed (headless JS task). - Made the check-in action handler resilient — it never throws, preventing unhandled promise rejections that could crash the background task.
📞 LiveKit
- Added
ReconnectingandDisconnectedevent handlers with automatic cleanup on unexpected disconnects. - Made
disconnectFromRoomresilient — cleanup continues even if the disconnect call or sound playback fails.
📍 Location Service
- Added background permission re-check before starting background updates.
- Wrapped app state change handler in try-catch to prevent unhandled rejections.
🔧 Other
- Bluetooth audio: Awaiting scan failures so they're caught in the error handler.
- CallKeep service: Refactored to a TypeScript barrel file that delegates to platform-specific implementations resolved by Metro/Jest.
- LiveKit call store: Fails fast when no token endpoint is available instead of leaving
isConnectingin a permanent state.
1.30
Version 7.1.30 - 2026-07-24
Pull Request Description
RIC-T40 Build fix
This PR replaces the third-party app-icon-badge Expo plugin with a custom local implementation to resolve a build issue caused by a race condition in the original plugin.
Changes
- Replaced plugin reference in
app.config.ts: Switched from the externalapp-icon-badgeplugin to a custom./plugins/with-app-icon-badge.jswrapper. - New custom plugin (
plugins/with-app-icon-badge.js): Collects all configured icons (main, iOS, and Android adaptive icon), passes them as batch jobs to a generator script, validates that each generated image was created successfully, and updates the Expo config to reference the new badged icons. - New generation script (
scripts/generate-app-icon-badges.js): Wraps theaddBadgefunction from theapp-icon-badgelibrary with a workaround that addresses an async issue where image files weren't fully written before being used. The script uses a polling mechanism to verify PNG file integrity, writes to temporary files, and copies validated output to the final destination. - Added unit tests (
plugins/__tests__/with-app-icon-badge.test.ts): Verifies that all configured icons are generated and config paths are updated when badges are enabled, and that icon paths remain untouched when badges are disabled.
Purpose
The original app-icon-badge plugin had a bug where it did not await Jimp.writeAsync, causing intermittent build failures when generated icon files were incomplete or missing. This custom implementation ensures reliable icon generation by properly waiting for valid output before proceeding.
1.28
Version 7.1.28 - 2026-07-23
This pull request delivers several functional improvements to the Resgrid IC (Incident Command) application, primarily focused on the accountability/PAR system, offline status handling, toast notifications, and weather alert reliability.
Key Changes
Accountability/PAR Section Overhaul
- Extracted the accountability section into a dedicated
AccountabilitySectioncomponent with an activation flow: when check-in timers are inactive, the IC sees an "Activate" action instead of a pre-populated critical list. - Added the ability to perform personnel, IC, and unit-type check-ins directly from the accountability section.
- Introduced personnel check-in status fetching via a new API endpoint (
GetCallPersonnelCheckInStatuses). - Added timer activation/deactivation through the
ToggleCallTimersendpoint (now using query-string parameters). - Managed personnel check-ins (with a target user) now fail gracefully when offline rather than being queued, since they require a live connection.
Check-in Bottom Sheet
- Removed the "IC" check-in type from the general check-in bottom sheet, as IC check-in is now handled exclusively within the accountability section.
Toast & Offline Status System
- Enhanced the toast system with dismiss buttons, tappable actions (
onPress), and configurable durations. - Replaced the layout-consuming
OfflineStatusBarwith a non-intrusiveOfflineStatusToastthat surfaces network and pending-sync state through toasts. Pending-sync toasts are tappable to navigate directly to the sync queue.
Weather Alert Fixes
- Added robust date parsing for department-local timestamp formats (e.g.,
MM/DD/YYYY h:mm:ss AM/PM) to prevent "Invalid Date" display across weather alert cards, detail screens, and the incident weather section. - Fixed multipolygon bounding-box calculation for weather alert maps, ensuring the camera correctly fits all polygon parts.
- Weather alert maps no longer render a default U.S. map when location data is absent.
- Weather alert banner dismiss now fires before navigation, and the close button properly stops event propagation.
App Shell Layout
- Added dynamic header height calculation based on safe-area insets and orientation for consistent header sizing.
- Improved touch target sizing with
hitSlopon header and notification buttons.
Project Naming
- Updated references from "Resgrid Unit" to "Resgrid IC" across AI coding guidelines and documentation.
1.25
Version 7.1.25 - 2026-07-23
PR Description: RIC-T40 Fixes
This pull request addresses several fixes related to the weather alerts feature:
Changes
1. Fixed Weather Alert Detail API Call
The getWeatherAlert function was updated to pass the alertId as a path parameter (/WeatherAlerts/GetWeatherAlert/{alertId}) rather than as a query parameter. This corrects how the endpoint is constructed for retrieving a specific weather alert by ID.
2. Improved Weather Alert Detail Loading State
When fetching a new weather alert's details, the store now clears the previously loaded selectedAlert (sets it to null) before beginning the fetch. This prevents stale data from being displayed while a new alert detail is loading.
3. Fixed Severity Filter Tabs Layout
Added grow-0 class to the severity filter tabs ScrollView to prevent it from expanding unnecessarily, fixing a layout issue with the filter tabs.
1.20
Version 7.1.20 - 2026-07-22
- Merge pull request #16 from Resgrid/develop
1.18
Version 7.1.18 - 2026-07-21
- Merge pull request #15 from Resgrid/develop
1.16
Version 7.1.16 - 2026-07-21
- Merge pull request #14 from Resgrid/develop
1.13
Version 7.1.13 - 2026-07-21
- Merge pull request #13 from Resgrid/develop
1.11
Version 7.1.11 - 2026-07-21
- Merge pull request #12 from Resgrid/develop