creek

The AI Image Editor of 2030

lib/ui/pages/share_to_moodboard_page.dart (3024B)


 1import 'dart:io';
 2import 'package:flutter/material.dart';
 3import 'package:receive_sharing_intent/receive_sharing_intent.dart';
 4import 'package:creekui/services/project_service.dart';
 5import 'package:creekui/ui/styles/variables.dart';
 6import 'package:creekui/ui/widgets/project_selector.dart';
 7import 'package:creekui/ui/widgets/app_bar.dart';
 8import 'package:creekui/ui/widgets/dialog.dart';
 9import 'package:creekui/ui/widgets/text_field.dart';
10import 'image_save_page.dart';
11
12class ShareToMoodboardPage extends StatefulWidget {
13  final List<File> imageFiles;
14  const ShareToMoodboardPage({super.key, required this.imageFiles});
15
16  @override
17  State<ShareToMoodboardPage> createState() => _ShareToMoodboardPageState();
18}
19
20class _ShareToMoodboardPageState extends State<ShareToMoodboardPage> {
21  final ProjectService _projectService = ProjectService();
22  Key _selectorKey = UniqueKey(); // Used to refresh list after creation
23
24  Future<void> _createNewProject() async {
25    final controller = TextEditingController();
26    await ShowDialog.show(
27      context,
28      title: "New Project",
29      primaryButtonText: "Create",
30      content: CommonTextField(
31        hintText: "Project Title",
32        controller: controller,
33        autoFocus: true,
34      ),
35      onPrimaryPressed: () async {
36        final title = controller.text.trim();
37        if (title.isNotEmpty) {
38          Navigator.pop(context); // Close dialog
39          final newId = await _projectService.createProject(title);
40          setState(() {
41            _selectorKey = UniqueKey();
42          });
43          _navigateToSavePage(newId, title);
44        }
45      },
46    );
47  }
48
49  void _navigateToSavePage(
50    int projectId,
51    String projectName, {
52    String? parentProjectName,
53  }) {
54    _projectService.openProject(projectId);
55    ReceiveSharingIntent.instance.reset();
56    Navigator.push(
57      context,
58      MaterialPageRoute(
59        builder:
60            (_) => ImageSavePage(
61              imagePaths: widget.imageFiles.map((f) => f.path).toList(),
62              projectId: projectId,
63              projectName: projectName,
64              isFromShare: true,
65              parentProjectName: parentProjectName,
66            ),
67      ),
68    );
69  }
70
71  @override
72  Widget build(BuildContext context) {
73    return Scaffold(
74      backgroundColor: Variables.surfaceBackground,
75      appBar: CommonAppBar(
76        title: "MoodBoards",
77        leading: IconButton(
78          icon: const Icon(Icons.arrow_back, color: Variables.textPrimary),
79          onPressed: () => Navigator.pop(context),
80        ),
81        actions: [
82          IconButton(
83            icon: const Icon(Icons.add, color: Variables.textPrimary, size: 28),
84            onPressed: _createNewProject,
85            tooltip: "Create New Project",
86          ),
87        ],
88      ),
89      body: ProjectSelector(
90        key: _selectorKey,
91        onProjectSelected: (id, title, parentTitle) {
92          _navigateToSavePage(id, title, parentProjectName: parentTitle);
93        },
94      ),
95    );
96  }
97}