Added export function
This commit is contained in:
parent
7cee1da98b
commit
8eb3dfb35e
|
|
@ -145,6 +145,11 @@
|
||||||
"description": "Title of the interface settings section",
|
"description": "Title of the interface settings section",
|
||||||
"context": "Visible in the settings view"
|
"context": "Visible in the settings view"
|
||||||
},
|
},
|
||||||
|
"settingsTitleExport": "Exportieren",
|
||||||
|
"@settingsTitleExport": {
|
||||||
|
"description": "Title of the export settings section",
|
||||||
|
"context": "Visible in the settings view"
|
||||||
|
},
|
||||||
"settingsTitleContact": "Kontakt",
|
"settingsTitleContact": "Kontakt",
|
||||||
"@settingsTitleContact": {
|
"@settingsTitleContact": {
|
||||||
"description": "Title of the contact settings section",
|
"description": "Title of the contact settings section",
|
||||||
|
|
@ -262,6 +267,41 @@
|
||||||
"description": "Text displayed for cancel button, should be capitalized",
|
"description": "Text displayed for cancel button, should be capitalized",
|
||||||
"context": "Visible in the settings view"
|
"context": "Visible in the settings view"
|
||||||
},
|
},
|
||||||
|
"settingsExportChats": "Chats exportieren",
|
||||||
|
"@settingsExportChats": {
|
||||||
|
"description": "Text displayed as description for export chats button",
|
||||||
|
"context": "Visible in the settings view"
|
||||||
|
},
|
||||||
|
"settingsImportChats": "Chats importieren",
|
||||||
|
"@settingsImportChats": {
|
||||||
|
"description": "Text displayed as description for import chats button",
|
||||||
|
"context": "Visible in the settings view"
|
||||||
|
},
|
||||||
|
"settingsImportChatsTitle": "Importieren",
|
||||||
|
"@settingsImportChatsTitle": {
|
||||||
|
"description": "Title of the import dialog",
|
||||||
|
"context": "Visible in the settings view"
|
||||||
|
},
|
||||||
|
"settingsImportChatsDescription": "Der folgende Schritt importiert die Chats aus der ausgewählten Datei. Dadurch werden die aktuellen Chats überschrieben.\nMöchtest du fortfahren?",
|
||||||
|
"@settingsImportChatsDescription": {
|
||||||
|
"description": "Description of the import dialog",
|
||||||
|
"context": "Visible in the settings view"
|
||||||
|
},
|
||||||
|
"settingsImportChatsImport": "Importieren und Löschen",
|
||||||
|
"@settingsImportChatsImport": {
|
||||||
|
"description": "Text displayed for import button, should be capitalized",
|
||||||
|
"context": "Visible in the settings view"
|
||||||
|
},
|
||||||
|
"settingsImportChatsCancel": "Abbrechen",
|
||||||
|
"@settingsImportChatsCancel": {
|
||||||
|
"description": "Text displayed for cancel button, should be capitalized",
|
||||||
|
"context": "Visible in the settings view"
|
||||||
|
},
|
||||||
|
"settingsImportChatsSuccess": "Chats erfolgreich importiert",
|
||||||
|
"@settingsImportChatsSuccess": {
|
||||||
|
"description": "Text displayed when chats are imported successfully",
|
||||||
|
"context": "Visible in the settings view"
|
||||||
|
},
|
||||||
"settingsGithub": "GitHub",
|
"settingsGithub": "GitHub",
|
||||||
"@settingsGithub": {
|
"@settingsGithub": {
|
||||||
"description": "Text displayed as description for GitHub button",
|
"description": "Text displayed as description for GitHub button",
|
||||||
|
|
|
||||||
|
|
@ -145,6 +145,11 @@
|
||||||
"description": "Title of the interface settings section",
|
"description": "Title of the interface settings section",
|
||||||
"context": "Visible in the settings view"
|
"context": "Visible in the settings view"
|
||||||
},
|
},
|
||||||
|
"settingsTitleExport": "Export",
|
||||||
|
"@settingsTitleExport": {
|
||||||
|
"description": "Title of the export settings section",
|
||||||
|
"context": "Visible in the settings view"
|
||||||
|
},
|
||||||
"settingsTitleContact": "Contact",
|
"settingsTitleContact": "Contact",
|
||||||
"@settingsTitleContact": {
|
"@settingsTitleContact": {
|
||||||
"description": "Title of the contact settings section",
|
"description": "Title of the contact settings section",
|
||||||
|
|
@ -262,6 +267,41 @@
|
||||||
"description": "Text displayed for cancel button, should be capitalized",
|
"description": "Text displayed for cancel button, should be capitalized",
|
||||||
"context": "Visible in the settings view"
|
"context": "Visible in the settings view"
|
||||||
},
|
},
|
||||||
|
"settingsExportChats": "Export chats",
|
||||||
|
"@settingsExportChats": {
|
||||||
|
"description": "Text displayed as description for export chats button",
|
||||||
|
"context": "Visible in the settings view"
|
||||||
|
},
|
||||||
|
"settingsImportChats": "Import chats",
|
||||||
|
"@settingsImportChats": {
|
||||||
|
"description": "Text displayed as description for import chats button",
|
||||||
|
"context": "Visible in the settings view"
|
||||||
|
},
|
||||||
|
"settingsImportChatsTitle": "Import",
|
||||||
|
"@settingsImportChatsTitle": {
|
||||||
|
"description": "Title of the import dialog",
|
||||||
|
"context": "Visible in the settings view"
|
||||||
|
},
|
||||||
|
"settingsImportChatsDescription": "The following step will import the chats from the selected file. This will overwrite the current chats.\nDo you want to continue?",
|
||||||
|
"@settingsImportChatsDescription": {
|
||||||
|
"description": "Description of the import dialog",
|
||||||
|
"context": "Visible in the settings view"
|
||||||
|
},
|
||||||
|
"settingsImportChatsImport": "Import and Erase",
|
||||||
|
"@settingsImportChatsImport": {
|
||||||
|
"description": "Text displayed for import button, should be capitalized",
|
||||||
|
"context": "Visible in the settings view"
|
||||||
|
},
|
||||||
|
"settingsImportChatsCancel": "Cancel",
|
||||||
|
"@settingsImportChatsCancel": {
|
||||||
|
"description": "Text displayed for cancel button, should be capitalized",
|
||||||
|
"context": "Visible in the settings view"
|
||||||
|
},
|
||||||
|
"settingsImportChatsSuccess": "Chats imported successfully",
|
||||||
|
"@settingsImportChatsSuccess": {
|
||||||
|
"description": "Text displayed when chats are imported successfully",
|
||||||
|
"context": "Visible in the settings view"
|
||||||
|
},
|
||||||
"settingsGithub": "GitHub",
|
"settingsGithub": "GitHub",
|
||||||
"@settingsGithub": {
|
"@settingsGithub": {
|
||||||
"description": "Text displayed as description for GitHub button",
|
"description": "Text displayed as description for GitHub button",
|
||||||
|
|
|
||||||
|
|
@ -1,8 +1,12 @@
|
||||||
|
import 'dart:convert';
|
||||||
|
import 'dart:io';
|
||||||
|
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:flutter/services.dart';
|
import 'package:flutter/services.dart';
|
||||||
import 'package:flutter/widgets.dart';
|
import 'package:flutter/widgets.dart';
|
||||||
|
|
||||||
import 'main.dart';
|
import 'main.dart';
|
||||||
|
import 'package:intl/intl.dart';
|
||||||
import 'package:flutter_gen/gen_l10n/app_localizations.dart';
|
import 'package:flutter_gen/gen_l10n/app_localizations.dart';
|
||||||
|
|
||||||
import 'package:dartx/dartx.dart';
|
import 'package:dartx/dartx.dart';
|
||||||
|
|
@ -10,6 +14,8 @@ import 'package:http/http.dart' as http;
|
||||||
import 'package:simple_icons/simple_icons.dart';
|
import 'package:simple_icons/simple_icons.dart';
|
||||||
import 'package:url_launcher/url_launcher.dart';
|
import 'package:url_launcher/url_launcher.dart';
|
||||||
import 'package:restart_app/restart_app.dart';
|
import 'package:restart_app/restart_app.dart';
|
||||||
|
import 'package:file_picker/file_picker.dart';
|
||||||
|
import 'package:pick_or_save/pick_or_save.dart';
|
||||||
|
|
||||||
class ScreenSettings extends StatefulWidget {
|
class ScreenSettings extends StatefulWidget {
|
||||||
const ScreenSettings({super.key});
|
const ScreenSettings({super.key});
|
||||||
|
|
@ -398,6 +404,102 @@ class _ScreenSettingsState extends State<ScreenSettings> {
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
}),
|
}),
|
||||||
|
title(AppLocalizations.of(context)!.settingsTitleExport),
|
||||||
|
InkWell(
|
||||||
|
onTap: () async {
|
||||||
|
await PickOrSave().fileSaver(
|
||||||
|
params: FileSaverParams(
|
||||||
|
mimeTypesFilter: ["application/json"],
|
||||||
|
saveFiles: [
|
||||||
|
SaveFileInfo(
|
||||||
|
fileData: utf8.encode(jsonEncode(
|
||||||
|
prefs!.getStringList("chats") ?? [])),
|
||||||
|
fileName:
|
||||||
|
"ollama-export-${DateFormat('yyyy-MM-dd-H-m-s').format(DateTime.now())}.json")
|
||||||
|
],
|
||||||
|
));
|
||||||
|
},
|
||||||
|
child: Row(children: [
|
||||||
|
const Icon(Icons.upload_rounded),
|
||||||
|
const SizedBox(width: 16, height: 42),
|
||||||
|
Expanded(
|
||||||
|
child: Text(AppLocalizations.of(context)!
|
||||||
|
.settingsExportChats))
|
||||||
|
])),
|
||||||
|
InkWell(
|
||||||
|
onTap: () {
|
||||||
|
showDialog(
|
||||||
|
context: context,
|
||||||
|
builder: (context) {
|
||||||
|
return AlertDialog(
|
||||||
|
title: Text(AppLocalizations.of(context)!
|
||||||
|
.settingsImportChatsTitle),
|
||||||
|
content: Text(AppLocalizations.of(context)!
|
||||||
|
.settingsImportChatsDescription),
|
||||||
|
actions: [
|
||||||
|
TextButton(
|
||||||
|
onPressed: () {
|
||||||
|
Navigator.of(context).pop();
|
||||||
|
},
|
||||||
|
child: Text(AppLocalizations.of(context)!
|
||||||
|
.settingsImportChatsCancel)),
|
||||||
|
TextButton(
|
||||||
|
onPressed: () async {
|
||||||
|
FilePickerResult? result =
|
||||||
|
await FilePicker.platform.pickFiles(
|
||||||
|
type: FileType.custom,
|
||||||
|
allowedExtensions: ["json"]);
|
||||||
|
if (result == null) {
|
||||||
|
// ignore: use_build_context_synchronously
|
||||||
|
Navigator.of(context).pop();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
File file =
|
||||||
|
File(result.files.single.path!);
|
||||||
|
var content = await file.readAsString();
|
||||||
|
List<dynamic> tmpHistory =
|
||||||
|
jsonDecode(content);
|
||||||
|
List<String> history = [];
|
||||||
|
|
||||||
|
for (var i = 0;
|
||||||
|
i < tmpHistory.length;
|
||||||
|
i++) {
|
||||||
|
history.add(tmpHistory[i]);
|
||||||
|
}
|
||||||
|
|
||||||
|
prefs!.setStringList("chats", history);
|
||||||
|
|
||||||
|
messages = [];
|
||||||
|
chatUuid = null;
|
||||||
|
|
||||||
|
setState(() {});
|
||||||
|
|
||||||
|
// ignore: use_build_context_synchronously
|
||||||
|
Navigator.of(context).pop();
|
||||||
|
// ignore: use_build_context_synchronously
|
||||||
|
Navigator.of(context).pop();
|
||||||
|
// ignore: use_build_context_synchronously
|
||||||
|
ScaffoldMessenger.of(context)
|
||||||
|
.showSnackBar(SnackBar(
|
||||||
|
content: Text(AppLocalizations
|
||||||
|
// ignore: use_build_context_synchronously
|
||||||
|
.of(context)!
|
||||||
|
.settingsImportChatsSuccess),
|
||||||
|
showCloseIcon: true));
|
||||||
|
},
|
||||||
|
child: Text(AppLocalizations.of(context)!
|
||||||
|
.settingsImportChatsImport))
|
||||||
|
]);
|
||||||
|
});
|
||||||
|
},
|
||||||
|
child: Row(children: [
|
||||||
|
const Icon(Icons.download_rounded),
|
||||||
|
const SizedBox(width: 16, height: 42),
|
||||||
|
Expanded(
|
||||||
|
child: Text(AppLocalizations.of(context)!
|
||||||
|
.settingsImportChats))
|
||||||
|
])),
|
||||||
title(AppLocalizations.of(context)!.settingsTitleContact),
|
title(AppLocalizations.of(context)!.settingsTitleContact),
|
||||||
InkWell(
|
InkWell(
|
||||||
onTap: () {
|
onTap: () {
|
||||||
|
|
|
||||||
|
|
@ -90,16 +90,20 @@ void setModel(BuildContext context, Function setState) {
|
||||||
return ChoiceChip(
|
return ChoiceChip(
|
||||||
label: Text(models[index]),
|
label: Text(models[index]),
|
||||||
selected: usedIndex == index,
|
selected: usedIndex == index,
|
||||||
avatar: (addIndex == index)
|
avatar: (usedIndex == index)
|
||||||
? const Icon(Icons.add_rounded)
|
? null
|
||||||
: ((recommendedModels
|
: (addIndex == index)
|
||||||
.contains(models[index]))
|
|
||||||
? const Icon(
|
? const Icon(
|
||||||
Icons.star_rounded)
|
Icons.add_rounded)
|
||||||
: ((modal[index])
|
: ((recommendedModels
|
||||||
? const Icon(Icons
|
.contains(
|
||||||
.collections_rounded)
|
models[index]))
|
||||||
: null)),
|
? const Icon(
|
||||||
|
Icons.star_rounded)
|
||||||
|
: ((modal[index])
|
||||||
|
? const Icon(Icons
|
||||||
|
.collections_rounded)
|
||||||
|
: null)),
|
||||||
checkmarkColor: (usedIndex == index)
|
checkmarkColor: (usedIndex == index)
|
||||||
? ((MediaQuery.of(context)
|
? ((MediaQuery.of(context)
|
||||||
.platformBrightness ==
|
.platformBrightness ==
|
||||||
|
|
|
||||||
16
pubspec.lock
16
pubspec.lock
|
|
@ -145,6 +145,14 @@ packages:
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "7.0.0"
|
version: "7.0.0"
|
||||||
|
file_picker:
|
||||||
|
dependency: "direct main"
|
||||||
|
description:
|
||||||
|
name: file_picker
|
||||||
|
sha256: "29c90806ac5f5fb896547720b73b17ee9aed9bba540dc5d91fe29f8c5745b10a"
|
||||||
|
url: "https://pub.dev"
|
||||||
|
source: hosted
|
||||||
|
version: "8.0.3"
|
||||||
file_selector_linux:
|
file_selector_linux:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
|
|
@ -510,6 +518,14 @@ packages:
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "0.15.0"
|
version: "0.15.0"
|
||||||
|
pick_or_save:
|
||||||
|
dependency: "direct main"
|
||||||
|
description:
|
||||||
|
name: pick_or_save
|
||||||
|
sha256: "5e562e714e8486000b1144e580dfbd6db888a0b4dd02bf4c28501b244dd22fd3"
|
||||||
|
url: "https://pub.dev"
|
||||||
|
source: hosted
|
||||||
|
version: "2.2.4"
|
||||||
platform:
|
platform:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
|
|
|
||||||
|
|
@ -31,6 +31,8 @@ dependencies:
|
||||||
url_launcher: ^6.2.6
|
url_launcher: ^6.2.6
|
||||||
restart_app: ^1.2.1
|
restart_app: ^1.2.1
|
||||||
flutter_markdown: ^0.7.1
|
flutter_markdown: ^0.7.1
|
||||||
|
file_picker: ^8.0.3
|
||||||
|
pick_or_save: ^2.2.4
|
||||||
|
|
||||||
dev_dependencies:
|
dev_dependencies:
|
||||||
flutter_test:
|
flutter_test:
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue