mirror of
				https://github.com/immich-app/immich.git
				synced 2025-11-03 19:17:11 -05:00 
			
		
		
		
	* feat: use drift for logging * fix: tests * feat: use the truncate limit from constants.ts as default * chore: move setupAll to top level and restructure * chore: code review changes * fix: inherits * feat: raise log line limit to 2000 * limit getAll to 250 lines * delete DLog and make LogRepository not a singleton * fix: drift build settings and `make migration` * fix: tests * remove sensitive log --------- Co-authored-by: Alex <alex.tran1502@gmail.com>
		
			
				
	
	
		
			114 lines
		
	
	
		
			4.0 KiB
		
	
	
	
		
			Dart
		
	
	
	
	
	
			
		
		
	
	
			114 lines
		
	
	
		
			4.0 KiB
		
	
	
	
		
			Dart
		
	
	
	
	
	
import 'package:auto_route/auto_route.dart';
 | 
						|
import 'package:flutter/material.dart';
 | 
						|
import 'package:flutter/services.dart';
 | 
						|
import 'package:hooks_riverpod/hooks_riverpod.dart';
 | 
						|
import 'package:immich_mobile/domain/models/log.model.dart';
 | 
						|
import 'package:immich_mobile/extensions/build_context_extensions.dart';
 | 
						|
 | 
						|
@RoutePage()
 | 
						|
class AppLogDetailPage extends HookConsumerWidget {
 | 
						|
  const AppLogDetailPage({super.key, required this.logMessage});
 | 
						|
 | 
						|
  final LogMessage logMessage;
 | 
						|
 | 
						|
  @override
 | 
						|
  Widget build(BuildContext context, WidgetRef ref) {
 | 
						|
    buildTextWithCopyButton(String header, String text) {
 | 
						|
      return Padding(
 | 
						|
        padding: const EdgeInsets.all(8.0),
 | 
						|
        child: Column(
 | 
						|
          crossAxisAlignment: CrossAxisAlignment.start,
 | 
						|
          children: [
 | 
						|
            Row(
 | 
						|
              mainAxisAlignment: MainAxisAlignment.spaceBetween,
 | 
						|
              crossAxisAlignment: CrossAxisAlignment.center,
 | 
						|
              children: [
 | 
						|
                Padding(
 | 
						|
                  padding: const EdgeInsets.only(bottom: 8.0),
 | 
						|
                  child: Text(
 | 
						|
                    header,
 | 
						|
                    style: TextStyle(fontSize: 12.0, color: context.primaryColor, fontWeight: FontWeight.bold),
 | 
						|
                  ),
 | 
						|
                ),
 | 
						|
                IconButton(
 | 
						|
                  onPressed: () {
 | 
						|
                    Clipboard.setData(ClipboardData(text: text)).then((_) {
 | 
						|
                      context.scaffoldMessenger.showSnackBar(
 | 
						|
                        SnackBar(
 | 
						|
                          content: Text(
 | 
						|
                            "Copied to clipboard",
 | 
						|
                            style: context.textTheme.bodyLarge?.copyWith(color: context.primaryColor),
 | 
						|
                          ),
 | 
						|
                        ),
 | 
						|
                      );
 | 
						|
                    });
 | 
						|
                  },
 | 
						|
                  icon: Icon(Icons.copy, size: 16.0, color: context.primaryColor),
 | 
						|
                ),
 | 
						|
              ],
 | 
						|
            ),
 | 
						|
            Container(
 | 
						|
              decoration: BoxDecoration(
 | 
						|
                color: context.colorScheme.surfaceContainerHigh,
 | 
						|
                borderRadius: const BorderRadius.all(Radius.circular(15.0)),
 | 
						|
              ),
 | 
						|
              child: Padding(
 | 
						|
                padding: const EdgeInsets.all(8.0),
 | 
						|
                child: SelectableText(
 | 
						|
                  text,
 | 
						|
                  style: const TextStyle(fontSize: 12.0, fontWeight: FontWeight.bold, fontFamily: "Inconsolata"),
 | 
						|
                ),
 | 
						|
              ),
 | 
						|
            ),
 | 
						|
          ],
 | 
						|
        ),
 | 
						|
      );
 | 
						|
    }
 | 
						|
 | 
						|
    buildLogContext(String logger) {
 | 
						|
      return Padding(
 | 
						|
        padding: const EdgeInsets.all(8.0),
 | 
						|
        child: Column(
 | 
						|
          crossAxisAlignment: CrossAxisAlignment.start,
 | 
						|
          children: [
 | 
						|
            Padding(
 | 
						|
              padding: const EdgeInsets.only(bottom: 8.0),
 | 
						|
              child: Text(
 | 
						|
                "FROM",
 | 
						|
                style: TextStyle(fontSize: 12.0, color: context.primaryColor, fontWeight: FontWeight.bold),
 | 
						|
              ),
 | 
						|
            ),
 | 
						|
            Container(
 | 
						|
              decoration: BoxDecoration(
 | 
						|
                color: context.colorScheme.surfaceContainerHigh,
 | 
						|
                borderRadius: const BorderRadius.all(Radius.circular(15.0)),
 | 
						|
              ),
 | 
						|
              child: Padding(
 | 
						|
                padding: const EdgeInsets.all(8.0),
 | 
						|
                child: SelectableText(
 | 
						|
                  logger.toString(),
 | 
						|
                  style: const TextStyle(fontSize: 12.0, fontWeight: FontWeight.bold, fontFamily: "Inconsolata"),
 | 
						|
                ),
 | 
						|
              ),
 | 
						|
            ),
 | 
						|
          ],
 | 
						|
        ),
 | 
						|
      );
 | 
						|
    }
 | 
						|
 | 
						|
    return Scaffold(
 | 
						|
      appBar: AppBar(title: const Text("Log Detail")),
 | 
						|
      body: SafeArea(
 | 
						|
        child: ListView(
 | 
						|
          children: [
 | 
						|
            buildTextWithCopyButton("MESSAGE", logMessage.message),
 | 
						|
            if (logMessage.error != null) buildTextWithCopyButton("DETAILS", logMessage.error.toString()),
 | 
						|
            if (logMessage.logger != null) buildLogContext(logMessage.logger.toString()),
 | 
						|
            if (logMessage.stack != null) buildTextWithCopyButton("STACK TRACE", logMessage.stack.toString()),
 | 
						|
          ],
 | 
						|
        ),
 | 
						|
      ),
 | 
						|
    );
 | 
						|
  }
 | 
						|
}
 |