Untitled

 avatar
unknown
plain_text
9 months ago
7.9 kB
59
Indexable
import 'dart:convert';
import 'dart:io';
import 'dart:ui';

import 'package:awesome_extensions/awesome_extensions.dart';
import 'package:eva_icons_flutter/eva_icons_flutter.dart';
import 'package:file_picker/file_picker.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:flutter_animate/flutter_animate.dart';
import 'package:flutter_smart_dialog/flutter_smart_dialog.dart';
import 'package:font_awesome_flutter/font_awesome_flutter.dart';
import 'package:get/get.dart';
import 'package:http/http.dart' as http;
import 'package:provider/provider.dart';
import 'package:render_metrics/render_metrics.dart';
import 'package:sporty_areaweb/model/modello_scheda.dart';
import 'package:sporty_areaweb/pages/Automations/widgets/hierarchy.dart';
import 'package:sporty_areaweb/pages/Main/menu_controller.dart';
import 'package:sporty_areaweb/pages/Settings/Parametri%20Azienda/settings_controllers.dart';
import 'package:sporty_areaweb/pages/Settings/utilita_controller.dart';
import 'package:sporty_areaweb/providers/activecampaign_provider.dart';
import 'package:sporty_areaweb/providers/auth_provider.dart';
import 'package:sporty_areaweb/utility/extensions.dart';

import 'package:sporty_areaweb/widgets/custom_text_form.dart';
import 'package:sporty_areaweb/widgets/custom_text_form_new.dart';
import 'package:sporty_areaweb/widgets/dialog_success.dart';
import 'package:sporty_areaweb/widgets/dialog_upload_image.dart';
import 'package:sporty_areaweb/widgets/dialog_yesno.dart';
import 'package:sporty_areaweb/widgets/left_bar_menu/custom_left_bar_menu_widget.dart';
import 'package:collection/collection.dart';
import 'package:sporty_areaweb/widgets/placeholder_height_widget.dart';
import 'package:sporty_areaweb/widgets/sporty_button.dart';
import 'package:uuid/uuid.dart';
import '../../../customs/custom_applications.dart';
import '../../../widgets/custom_future_builder.dart';
import 'package:fl_nodes/fl_nodes.dart';

class AutomationBuilderScreen extends StatefulWidget {
  const AutomationBuilderScreen({
    super.key,
    required this.currentLocale,
    required this.onLocaleChanged,
  });

  final Locale currentLocale;
  final Function(String) onLocaleChanged;

  @override
  State<AutomationBuilderScreen> createState() =>
      AutomationBuilderScreenState();
}

final bool isMobile = TargetPlatform.iOS == defaultTargetPlatform ||
        TargetPlatform.android == defaultTargetPlatform
    ? true
    : false;

class AutomationBuilderScreenState extends State<AutomationBuilderScreen> {
  late final FlNodeEditorController
      _nodeEditorController; // Controller for managing the node editor

  @override
  void initState() {
    super.initState();

    // Initialize the node editor controller with project management functionality
    _nodeEditorController = FlNodeEditorController(
      config: FlNodeEditorConfig(),
      style: FlNodeEditorStyle(
          decoration: BoxDecoration(
            color: CustomApplication.backgroundColor,
          ),
          gridStyle: FlGridStyle.basic(),
          highlightAreaStyle: FlHighlightAreaStyle.basic()),
      projectSaver: (jsonData) async {
        if (kIsWeb)
          return false; // Skip file saving on web (not supported by file_picker)

        // Open a save file dialog to allow the user to save the project as JSON
        final String? outputPath = await FilePicker.platform.saveFile(
          dialogTitle: 'Save Project',
          fileName: 'node_project.json',
          type: FileType.custom,
          allowedExtensions: ['json'],
        );

        // If a file path is selected, write the project data to the file
        if (outputPath != null) {
          final File file = File(outputPath);
          await file.writeAsString(jsonEncode(jsonData));

          return true;
        } else {
          return false; // Return false if saving was canceled
        }
      },
      projectLoader: (isSaved) async {
        // If there are unsaved changes, confirm whether the user wants to proceed
        if (!isSaved) {
          final bool? proceed = await showDialog<bool>(
            context: context,
            builder: (BuildContext context) {
              return AlertDialog(
                title: const Text('Unsaved Changes'),
                content: const Text(
                  'You have unsaved changes. Do you want to proceed without saving?',
                ),
                actions: <Widget>[
                  TextButton(
                    onPressed: () => Navigator.of(context).pop(false),
                    child: const Text('Cancel'),
                  ),
                  TextButton(
                    onPressed: () => Navigator.of(context).pop(true),
                    child: const Text('Proceed'),
                  ),
                ],
              );
            },
          );

          if (proceed != true)
            return null; // Cancel loading if user chooses not to proceed
        }

        // Open file picker to select a JSON project file
        final FilePickerResult? result = await FilePicker.platform.pickFiles(
          type: FileType.custom,
          allowedExtensions: ['json'],
        );

        if (result == null) return null; // Return null if no file was selected

        late final String fileContent;

        // Handle file reading differently for web vs other platforms
        if (kIsWeb) {
          final byteData = result.files.single.bytes!;
          fileContent = utf8.decode(byteData.buffer.asUint8List());
        } else {
          final File file = File(result.files.single.path!);
          fileContent = await file.readAsString();
        }

        return jsonDecode(fileContent); // Return the parsed JSON data
      },
      projectCreator: (isSaved) async {
        // If the project is not saved, ask the user whether to proceed
        if (isSaved) return true;

        final bool? proceed = await showDialog<bool>(
          context: context,
          builder: (BuildContext context) {
            return AlertDialog(
              title: const Text('Unsaved Changes'),
              content: const Text(
                'You have unsaved changes. Do you want to proceed without saving?',
              ),
              actions: <Widget>[
                TextButton(
                  onPressed: () => Navigator.of(context).pop(false),
                  child: const Text('Cancel'),
                ),
                TextButton(
                  onPressed: () => Navigator.of(context).pop(true),
                  child: const Text('Proceed'),
                ),
              ],
            );
          },
        );

        return proceed == true; // Return true if the user chooses to proceed
      },
    );

    // Register data handlers and custom node definitions for the editor
    // registerDataHandlers(_nodeEditorController);
    // registerNodes(context, _nodeEditorController);
  }

  @override
  void dispose() {
    _nodeEditorController
        .dispose(); // Dispose of the controller to free resources
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return Center(
      child: Row(
        mainAxisSize: MainAxisSize.min,
        mainAxisAlignment: MainAxisAlignment.start,
        children: [
          Expanded(
            child: FlNodeEditorWidget(
              controller: _nodeEditorController,
              contextMenuBuilder: (context, model) => [],
              expandToParent: true,
              overlay: () {
                return [];
              },
            ),
          ),
        ],
      ),
    );
  }
}
Editor is loading...
Leave a Comment