content: import 'package:flutter/material.dart';
  
  import 'package:matrix/matrix.dart';
  
  import 'package:fluffychat/config/themes.dart';
  import 'package:fluffychat/l10n/l10n.dart';
  import 'package:fluffychat/pages/chat_list/chat_list.dart';
  import 'package:fluffychat/pages/chat_list/client_chooser_button.dart';
  import 'package:fluffychat/utils/sync_status_localization.dart';
  import '../../widgets/matrix.dart';
  
  class ChatListHeader extends StatelessWidget implements PreferredSizeWidget {
    final ChatListController controller;
    final bool globalSearch;
  
    const ChatListHeader({
      super.key,
      required this.controller,
      this.globalSearch = true,
    });
  
    @override
    Widget build(BuildContext context) {
      final theme = Theme.of(context);
      final client = Matrix.of(context).client;
  
      return SliverAppBar(
        floating: true,
        toolbarHeight: 72,
        pinned: FluffyThemes.isColumnMode(context),
        scrolledUnderElevation: 0,
        backgroundColor: Colors.transparent,
        automaticallyImplyLeading: false,
        title: StreamBuilder(
          stream: client.onSyncStatus.stream,
          builder: (context, snapshot) {
            final status = client.onSyncStatus.value ??
                const SyncStatusUpdate(SyncStatus.waitingForResponse);
            final hide = client.onSync.value != null &&
                status.status != SyncStatus.error &&
                client.prevBatch != null;
            return TextField(
              controller: controller.searchController,
              focusNode: controller.searchFocusNode,
              textInputAction: TextInputAction.search,
              onChanged: (text) => controller.onSearchEnter(
                text,
                globalSearch: globalSearch,
              ),
              decoration: InputDecoration(
                filled: true,
                fillColor: theme.colorScheme.secondaryContainer,
                border: OutlineInputBorder(
                  borderSide: BorderSide.none,
                  borderRadius: BorderRadius.circular(99),
                ),
                contentPadding: EdgeInsets.zero,
                hintText: hide
                    ? L10n.of(context).searchChatsRooms
                    : status.calcLocalizedString(context),
                hintStyle: TextStyle(
                  color: status.error != null
                      ? Colors.orange
                      : theme.colorScheme.onPrimaryContainer,
                  fontWeight: FontWeight.normal,
                ),
                prefixIcon: hide
                    ? controller.isSearchMode
                        ? IconButton(
                            tooltip: L10n.of(context).cancel,
                            icon: const Icon(Icons.close_outlined),
                            onPressed: controller.cancelSearch,
                            color: theme.colorScheme.onPrimaryContainer,
                          )
                        : IconButton(
                            onPressed: controller.startSearch,
                            icon: Icon(
                              Icons.search_outlined,
                              color: theme.colorScheme.onPrimaryContainer,
                            ),
                          )
                    : Container(
                        margin: const EdgeInsets.all(12),
                        width: 8,
                        height: 8,
                        child: Center(
                          child: CircularProgressIndicator.adaptive(
                            strokeWidth: 2,
                            value: status.progress,
                            valueColor: status.error != null
                                ? const AlwaysStoppedAnimation<Color>(
                                    Colors.orange,
                                  )
                                : null,
                          ),
                        ),
                      ),
                suffixIcon: controller.isSearchMode && globalSearch
                    ? controller.isSearching
                        ? const Padding(
                            padding: EdgeInsets.symmetric(
                              vertical: 10.0,
                              horizontal: 12,
                            ),
                            child: SizedBox.square(
                              dimension: 24,
                              child: CircularProgressIndicator.adaptive(
                                strokeWidth: 2,
                              ),
                            ),
                          )
                        : TextButton.icon(
                            onPressed: controller.setServer,
                            style: TextButton.styleFrom(
                              shape: RoundedRectangleBorder(
                                borderRadius: BorderRadius.circular(99),
                              ),
                              textStyle: const TextStyle(fontSize: 12),
                            ),
                            icon: const Icon(Icons.edit_outlined, size: 16),
                            label: Text(
                              controller.searchServer ??
                                  Matrix.of(context).client.homeserver!.host,
                              maxLines: 2,
                            ),
                          )
                    : SizedBox(
                        width: 0,
                        child: ClientChooserButton(controller),
                      ),
              ),
            );
          },
        ),
      );
    }
  
    @override
    Size get preferredSize => const Size.fromHeight(56);
  }
  