started working on cloud sync (testing)

This commit is contained in:
Kima
2024-11-16 22:21:22 +01:00
parent c9666f5333
commit 7d5b97fe00
9 changed files with 617 additions and 0 deletions

View File

@@ -0,0 +1,250 @@
// import 'package:refilc/models/settings.dart';
import 'package:refilc/api/client.dart';
import 'package:refilc/api/providers/database_provider.dart';
import 'package:refilc/api/providers/user_provider.dart';
import 'package:refilc/models/settings.dart';
import 'package:refilc/theme/colors/colors.dart';
import 'package:refilc_mobile_ui/common/panel/panel_button.dart';
import 'package:refilc_mobile_ui/common/splitted_panel/splitted_panel.dart';
import 'package:refilc_mobile_ui/screens/login/qwid_login.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:flutter_feather_icons/flutter_feather_icons.dart';
import 'package:provider/provider.dart';
import 'package:refilc/models/cloud_sync_data.dart';
// import 'package:provider/provider.dart';
import 'submenu_screen.i18n.dart';
class MenuCloudSyncSettings extends StatelessWidget {
const MenuCloudSyncSettings({
super.key,
this.borderRadius = const BorderRadius.vertical(
top: Radius.circular(4.0), bottom: Radius.circular(4.0)),
});
final BorderRadius borderRadius;
@override
Widget build(BuildContext context) {
return PanelButton(
onPressed: () => Navigator.of(context, rootNavigator: true).push(
CupertinoPageRoute(
builder: (context) => const CloudSyncSettingsScreen()),
),
title: Text("cloud_sync".i18n),
leading: Icon(
FeatherIcons.uploadCloud,
size: 22.0,
color: AppColors.of(context).text.withOpacity(0.95),
),
borderRadius: borderRadius,
);
}
}
class CloudSyncSettingsScreen extends StatefulWidget {
const CloudSyncSettingsScreen({super.key});
@override
CloudSyncSettingsScreenState createState() => CloudSyncSettingsScreenState();
}
class CloudSyncSettingsScreenState extends State<CloudSyncSettingsScreen> {
late SettingsProvider settingsProvider;
late UserProvider user;
String longLivedToken = '';
@override
Widget build(BuildContext context) {
SettingsProvider settingsProvider = Provider.of<SettingsProvider>(context);
// UserProvider user = Provider.of<UserProvider>(context);
return Scaffold(
appBar: AppBar(
surfaceTintColor: Theme.of(context).scaffoldBackgroundColor,
leading: BackButton(color: AppColors.of(context).text),
title: Text(
"cloud_sync".i18n,
style: TextStyle(color: AppColors.of(context).text),
),
),
body: SingleChildScrollView(
child: Padding(
padding: const EdgeInsets.symmetric(vertical: 16.0, horizontal: 24.0),
child: Column(
children: [
SplittedPanel(
padding: const EdgeInsets.only(top: 8.0),
cardPadding: const EdgeInsets.all(4.0),
isSeparated: true,
children: [
PanelButton(
padding: const EdgeInsets.only(left: 14.0, right: 6.0),
onPressed: () async {
showModalBottomSheet(
backgroundColor: Colors.transparent,
context: context,
isScrollControlled:
true, // This ensures the modal accommodates input fields properly
builder: (BuildContext context) {
return Container(
height: MediaQuery.of(context).size.height * 0.9 +
MediaQuery.of(context).viewInsets.bottom,
decoration: const BoxDecoration(
color: Color(0xFFDAE4F7),
borderRadius: BorderRadius.only(
topRight: Radius.circular(24.0),
topLeft: Radius.circular(24.0),
),
),
child: Column(
crossAxisAlignment: CrossAxisAlignment.center,
mainAxisAlignment: MainAxisAlignment.start,
children: [
Padding(
padding:
const EdgeInsets.symmetric(vertical: 18),
child: Container(
decoration: const BoxDecoration(
color: Color(0xFFB9C8E5),
borderRadius: BorderRadius.only(
topRight: Radius.circular(2.0),
topLeft: Radius.circular(2.0),
),
),
width: 40,
height: 4,
),
),
Expanded(
child: Padding(
padding: const EdgeInsets.only(
right: 14, left: 14, bottom: 24),
child: ClipRRect(
borderRadius: BorderRadius.circular(16),
child: Container(
decoration: BoxDecoration(
borderRadius:
BorderRadius.circular(16),
),
child: QwIDLoginWidget(
onLogin: (String token) {
setState(() {
longLivedToken = token;
});
Navigator.of(context).pop();
},
),
),
),
),
)
],
),
);
},
).then((value) {
// After closing the modal bottom sheet, check if the code is set
if (longLivedToken.isNotEmpty) {
// Call your API after retrieving the code
settingsProvider.update(
cloudSyncToken: longLivedToken,
store: true,
);
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(content: Text('login_successful'.i18n)));
}
});
},
trailingDivider: true,
title: Text(
"qwit_sign_in".i18n,
style: TextStyle(
color: AppColors.of(context).text.withOpacity(
settingsProvider.gradeOpeningFun ? .95 : .25),
),
),
borderRadius: const BorderRadius.vertical(
top: Radius.circular(12.0),
bottom: Radius.circular(12.0),
),
),
SwitchListTile(
value: settingsProvider.cloudSyncEnabled,
onChanged: (value) {
settingsProvider.update(
cloudSyncEnabled: value,
store: true,
);
},
title: Text("cloud_sync_enabled".i18n),
),
PanelButton(
padding: const EdgeInsets.only(left: 14.0, right: 6.0),
onPressed: () async {
if (settingsProvider.cloudSyncToken.isEmpty) {
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(
content: Text('sign_in_first'.i18n),
),
);
return;
} else {
FilcAPI.cloudSync(
{
"settings": settingsProvider.toMap(),
// "device_ids": [
// settingsProvider.xFilcId,
// ],
// "refilc_plus_id": settingsProvider.plusSessionId,
},
settingsProvider.cloudSyncToken,
).then((response) {
if (response == null) {
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(
content: Text('sync_failed'.i18n),
),
);
return;
}
CloudSyncData cloudSyncData = CloudSyncData.fromJson(
response['data']['cloud_sync_data']);
settingsProvider.updateFromMap(
map: cloudSyncData.settings,
store: true,
);
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(
content: Text('sync_successful'.i18n),
),
);
});
}
},
trailingDivider: true,
title: Text(
"sync_now".i18n,
style: TextStyle(
color: AppColors.of(context).text.withOpacity(
settingsProvider.gradeOpeningFun ? .95 : .25),
),
),
borderRadius: const BorderRadius.vertical(
top: Radius.circular(12.0),
bottom: Radius.circular(12.0),
),
),
],
),
],
),
),
),
);
}
}

View File

@@ -32,6 +32,8 @@ extension SettingsLocalization on String {
"understand": "I understand",
"theme_share_failed": "An error occurred while sharing the theme.",
"theme_share_ratelimit": "You can only share 1 theme per minute.",
// cloud sync
"cloud_sync": "Cloud Sync",
},
"hu_hu": {
"general": "Általános",
@@ -62,6 +64,8 @@ extension SettingsLocalization on String {
"understand": "Értem",
"theme_share_failed": "Hiba történt a téma megosztása közben.",
"theme_share_ratelimit": "Csak 1 témát oszthatsz meg percenként.",
// cloud sync
"cloud_sync": "Felhő szinkronizálás",
},
"de_de": {
"general": "Allgemeine",
@@ -93,6 +97,8 @@ extension SettingsLocalization on String {
"theme_share_failed":
"Beim Teilen des Themas ist ein Fehler aufgetreten.",
"theme_share_ratelimit": "Sie können nur 1 Thema pro Minute teilen.",
// cloud sync
"cloud_sync": "Cloud-Synchronisierung",
},
};