@@ -11,8 +11,10 @@ import 'package:whitenoise/config/providers/group_provider.dart';
1111import 'package:whitenoise/config/providers/polling_provider.dart' ;
1212import 'package:whitenoise/config/providers/profile_provider.dart' ;
1313import 'package:whitenoise/config/providers/profile_ready_card_visibility_provider.dart' ;
14+ import 'package:whitenoise/config/providers/relay_status_provider.dart' ;
1415import 'package:whitenoise/config/providers/welcomes_provider.dart' ;
1516import 'package:whitenoise/domain/models/chat_list_item.dart' ;
17+ import 'package:whitenoise/models/relay_status.dart' ;
1618import 'package:whitenoise/routing/routes.dart' ;
1719import 'package:whitenoise/src/rust/api/welcomes.dart' ;
1820import 'package:whitenoise/ui/contact_list/new_chat_bottom_sheet.dart' ;
@@ -24,6 +26,7 @@ import 'package:whitenoise/ui/core/themes/assets.dart';
2426import 'package:whitenoise/ui/core/themes/src/extensions.dart' ;
2527import 'package:whitenoise/ui/core/ui/wn_app_bar.dart' ;
2628import 'package:whitenoise/ui/core/ui/wn_bottom_fade.dart' ;
29+ import 'package:whitenoise/ui/core/ui/wn_heads_up.dart' ;
2730import 'package:whitenoise/ui/core/ui/wn_text_form_field.dart' ;
2831
2932class ChatListScreen extends ConsumerStatefulWidget {
@@ -219,6 +222,13 @@ class _ChatListScreenState extends ConsumerState<ChatListScreen> with TickerProv
219222 (item.lastMessage? .content? .toLowerCase ().contains (searchLower) ?? false );
220223 }).toList ();
221224
225+ final noRelayConnected = ref
226+ .watch (relayStatusProvider)
227+ .relayStatuses
228+ .values
229+ .every (
230+ (status) => status != RelayStatus .connected,
231+ );
222232 return GestureDetector (
223233 onTap: () {
224234 if (_searchFocusNode.hasFocus) {
@@ -251,16 +261,22 @@ class _ChatListScreenState extends ConsumerState<ChatListScreen> with TickerProv
251261 ),
252262 actions: [
253263 IconButton (
254- onPressed: () {
255- if (_searchFocusNode.hasFocus) {
256- _searchFocusNode.unfocus ();
257- }
258- NewChatBottomSheet .show (context);
259- },
264+ onPressed:
265+ noRelayConnected
266+ ? null
267+ : () {
268+ if (_searchFocusNode.hasFocus) {
269+ _searchFocusNode.unfocus ();
270+ }
271+ NewChatBottomSheet .show (context);
272+ },
260273 icon: Image .asset (
261- AssetsPaths .icAddNewChat,
262- width: 32. w,
263- height: 32. w,
274+ noRelayConnected ? AssetsPaths .icOffChat : AssetsPaths .icAddNewChat,
275+ width: 21. w,
276+ height: 21. w,
277+ color: context.colors.primaryForeground.withValues (
278+ alpha: noRelayConnected ? 0.5 : 1.0 ,
279+ ),
264280 ),
265281 ),
266282 Gap (8. w),
@@ -318,7 +334,26 @@ class _ChatListScreenState extends ConsumerState<ChatListScreen> with TickerProv
318334 },
319335 ),
320336 ),
321-
337+ if (noRelayConnected)
338+ SliverToBoxAdapter (
339+ child:
340+ WnStickyHeadsUp (
341+ title: 'No Relays Connected' ,
342+ subtitle: 'The app won\' t work until you add at least one.' ,
343+ action: InkWell (
344+ child: Text (
345+ 'Connect Relays' ,
346+ style: TextStyle (
347+ fontSize: 14. sp,
348+ color: context.colors.primary,
349+ fontWeight: FontWeight .w600,
350+ decoration: TextDecoration .underline,
351+ ),
352+ ),
353+ onTap: () => context.push (Routes .settingsNetwork),
354+ ),
355+ ).animate ().fadeIn (),
356+ ),
322357 if (_isSearchVisible)
323358 SliverPadding (
324359 padding: EdgeInsets .symmetric (horizontal: 8. w, vertical: 16. h),
0 commit comments