mirror of
				https://github.com/immich-app/immich.git
				synced 2025-11-03 19:17:11 -05:00 
			
		
		
		
	* chore(mobile): search field in separate widget * fix: removed unnecessary use of context * chore: minor styling tweak * fix: controller not bound --------- Co-authored-by: Alex <alex.tran1502@gmail.com>
		
			
				
	
	
		
			80 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			Dart
		
	
	
	
	
	
			
		
		
	
	
			80 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			Dart
		
	
	
	
	
	
import 'package:flutter/material.dart';
 | 
						|
import 'package:immich_mobile/extensions/build_context_extensions.dart';
 | 
						|
import 'package:immich_mobile/extensions/theme_extensions.dart';
 | 
						|
 | 
						|
class SearchField extends StatelessWidget {
 | 
						|
  const SearchField({
 | 
						|
    super.key,
 | 
						|
    required this.hintText,
 | 
						|
    this.autofocus = false,
 | 
						|
    this.controller,
 | 
						|
    this.focusNode,
 | 
						|
    this.onChanged,
 | 
						|
    this.onSubmitted,
 | 
						|
    this.onTapOutside,
 | 
						|
    this.contentPadding = const EdgeInsets.only(left: 24),
 | 
						|
    this.prefixIcon,
 | 
						|
    this.suffixIcon,
 | 
						|
    this.filled = false,
 | 
						|
  });
 | 
						|
 | 
						|
  final FocusNode? focusNode;
 | 
						|
  final void Function(String)? onChanged;
 | 
						|
  final void Function(String)? onSubmitted;
 | 
						|
  final void Function(PointerDownEvent)? onTapOutside;
 | 
						|
  final TextEditingController? controller;
 | 
						|
  final String hintText;
 | 
						|
  final EdgeInsetsGeometry contentPadding;
 | 
						|
  final Widget? prefixIcon;
 | 
						|
  final Widget? suffixIcon;
 | 
						|
  final bool autofocus;
 | 
						|
  final bool filled;
 | 
						|
 | 
						|
  @override
 | 
						|
  Widget build(BuildContext context) {
 | 
						|
    return TextField(
 | 
						|
      controller: controller,
 | 
						|
      autofocus: autofocus,
 | 
						|
      focusNode: focusNode,
 | 
						|
      onChanged: onChanged,
 | 
						|
      onTapOutside: onTapOutside ?? (_) => focusNode?.unfocus(),
 | 
						|
      onSubmitted: onSubmitted,
 | 
						|
      decoration: InputDecoration(
 | 
						|
        contentPadding: contentPadding,
 | 
						|
        filled: filled,
 | 
						|
        fillColor: context.primaryColor.withValues(alpha: 0.1),
 | 
						|
        hintStyle: context.textTheme.bodyLarge?.copyWith(
 | 
						|
          color: context.themeData.colorScheme.onSurfaceSecondary,
 | 
						|
        ),
 | 
						|
        border: OutlineInputBorder(
 | 
						|
          borderRadius: BorderRadius.circular(25),
 | 
						|
          borderSide: BorderSide(
 | 
						|
            color: context.colorScheme.surfaceDim,
 | 
						|
          ),
 | 
						|
        ),
 | 
						|
        enabledBorder: OutlineInputBorder(
 | 
						|
          borderRadius: BorderRadius.circular(25),
 | 
						|
          borderSide: BorderSide(
 | 
						|
            color: context.colorScheme.surfaceContainer,
 | 
						|
          ),
 | 
						|
        ),
 | 
						|
        disabledBorder: OutlineInputBorder(
 | 
						|
          borderRadius: BorderRadius.circular(25),
 | 
						|
          borderSide: BorderSide(
 | 
						|
            color: context.colorScheme.surfaceDim,
 | 
						|
          ),
 | 
						|
        ),
 | 
						|
        focusedBorder: OutlineInputBorder(
 | 
						|
          borderRadius: BorderRadius.circular(25),
 | 
						|
          borderSide: BorderSide(
 | 
						|
            color: context.colorScheme.primary.withAlpha(100),
 | 
						|
          ),
 | 
						|
        ),
 | 
						|
        prefixIcon: prefixIcon,
 | 
						|
        suffixIcon: suffixIcon,
 | 
						|
        hintText: hintText,
 | 
						|
      ),
 | 
						|
    );
 | 
						|
  }
 | 
						|
}
 |