aboutsummaryrefslogtreecommitdiff
path: root/frontend/lib/views/chat/json_code_snippet_view.dart
blob: f8ece40b137a252b45d371779016b8137ffb57ae (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
import 'package:flutter/material.dart';
import 'package:flutter_highlight/flutter_highlight.dart';
import 'package:flutter_highlight/themes/github.dart';
import 'package:flutter/services.dart';
import 'dart:convert';

class JsonCodeSnippetView extends StatelessWidget {
  final String jsonString;

  // Constructor to initialize the jsonString that will be displayed
  const JsonCodeSnippetView({
    Key? key,
    required this.jsonString,
  }) : super(key: key);

  @override
  Widget build(BuildContext context) {
    // Pretty print the JSON using JsonEncoder to format with indentation
    String prettyJson =
        const JsonEncoder.withIndent('  ').convert(json.decode(jsonString));

    return Padding(
      // Padding applied to align the code snippet view within its container
      padding: const EdgeInsets.fromLTRB(30, 30, 0, 30),
      child: Row(
        children: [
          // Expanded widget to ensure the code snippet view takes the available space
          Expanded(
            child: SingleChildScrollView(
              // SingleChildScrollView to make the code snippet scrollable if it overflows
              child: HighlightView(
                // Display the pretty-printed JSON
                prettyJson,
                // Set the language to JSON for syntax highlighting
                language: 'json',
                // Apply a GitHub-like theme for the highlighting
                theme: githubTheme,
                // Padding applied to the code snippet inside the view
                padding: const EdgeInsets.all(12),
                // TextStyle applied to the code snippet (monospace font)
                textStyle: const TextStyle(
                  fontFamily: 'monospace',
                  fontSize: 12,
                ),
              ),
            ),
          ),
          // SizedBox to create a gap between the code snippet view and the copy button
          const SizedBox(width: 20),
          Material(
            color: Colors.white,
            // IconButton to allow the user to copy the pretty-printed JSON to the clipboard
            child: IconButton(
              icon: const Icon(Icons.copy),
              onPressed: () {
                // Copy the pretty-printed JSON to the clipboard
                Clipboard.setData(ClipboardData(text: prettyJson));
              },
            ),
          ),
        ],
      ),
    );
  }
}