feat: add upload logic.
This commit is contained in:
+33
-5
@@ -3,6 +3,7 @@ import 'dart:io';
|
||||
|
||||
import 'package:dde_gesture_manager/constants/sp_keys.dart';
|
||||
import 'package:dde_gesture_manager/extensions.dart';
|
||||
import 'package:dde_gesture_manager/models/scheme.dart' as AppScheme;
|
||||
import 'package:dde_gesture_manager/utils/helper.dart';
|
||||
import 'package:dde_gesture_manager/utils/notificator.dart';
|
||||
import 'package:dde_gesture_manager_api/apis.dart';
|
||||
@@ -13,7 +14,12 @@ typedef T BeanBuilder<T>(Map res);
|
||||
|
||||
typedef T HandleRespBuild<T>(http.Response resp);
|
||||
|
||||
getStatusCodeFunc<int>(Map resp) => resp["statusCode"];
|
||||
typedef int GetStatusCodeFunc(Map resp);
|
||||
|
||||
int getStatusCodeFunc(Map resp) => resp["statusCode"] as int;
|
||||
|
||||
BeanBuilder<List<T>> listRespBuilderWrap<T>(BeanBuilder<T> builder) =>
|
||||
(Map resp) => (resp['list'] as List).map<T>((e) => builder(e)).toList();
|
||||
|
||||
class HttpErrorCode extends Error {
|
||||
int statusCode;
|
||||
@@ -40,11 +46,13 @@ class Api {
|
||||
}
|
||||
|
||||
static HandleRespBuild<T> _handleRespBuild<T>(BeanBuilder<T> builder) => (http.Response resp) {
|
||||
if (builder == getStatusCodeFunc) return builder({"statusCode": resp.statusCode});
|
||||
if (builder is GetStatusCodeFunc) return builder({"statusCode": resp.statusCode});
|
||||
T res;
|
||||
try {
|
||||
res = builder(json.decode(resp.body));
|
||||
var decodeBody = json.decode(utf8.decode(resp.bodyBytes));
|
||||
res = decodeBody is Map ? builder(decodeBody) : builder({'list': decodeBody});
|
||||
} catch (e) {
|
||||
e.sout();
|
||||
throw HttpErrorCode(resp.statusCode, message: resp.body);
|
||||
}
|
||||
return res;
|
||||
@@ -67,7 +75,7 @@ class Api {
|
||||
path: path,
|
||||
),
|
||||
headers: <String, String>{
|
||||
HttpHeaders.contentTypeHeader: ContentType.json.value,
|
||||
HttpHeaders.contentTypeHeader: ContentType.json.toString(),
|
||||
}..addAll(
|
||||
ignoreToken ? {} : {HttpHeaders.authorizationHeader: 'Bearer ${H().sp.getString(SPKeys.accessToken)}'}),
|
||||
)
|
||||
@@ -98,7 +106,7 @@ class Api {
|
||||
),
|
||||
body: jsonEncode(body),
|
||||
headers: <String, String>{
|
||||
HttpHeaders.contentTypeHeader: ContentType.json.value,
|
||||
HttpHeaders.contentTypeHeader: ContentType.json.toString(),
|
||||
}..addAll(
|
||||
ignoreToken ? {} : {HttpHeaders.authorizationHeader: 'Bearer ${H().sp.getString(SPKeys.accessToken)}'}),
|
||||
)
|
||||
@@ -132,4 +140,24 @@ class Api {
|
||||
ignoreToken: true,
|
||||
ignoreErrorHandle: ignoreErrorHandle,
|
||||
);
|
||||
|
||||
static Future<bool> checkAuthStatus() => _get<int>(Apis.auth.status, getStatusCodeFunc, ignoreErrorHandle: true)
|
||||
.then((value) => value == HttpStatus.noContent);
|
||||
|
||||
static Future<bool> uploadScheme({required AppScheme.Scheme scheme, required bool share}) => _post(
|
||||
Apis.scheme.upload,
|
||||
getStatusCodeFunc,
|
||||
body: SchemeSerializer.toMap(
|
||||
Scheme(
|
||||
name: scheme.name,
|
||||
uuid: scheme.id,
|
||||
description: scheme.description,
|
||||
gestures: scheme.gestures,
|
||||
shared: share,
|
||||
),
|
||||
),
|
||||
).then((value) => value == HttpStatus.noContent);
|
||||
|
||||
static Future<List<Scheme>> userUploads() =>
|
||||
_get(Apis.scheme.userUploads, listRespBuilderWrap(SchemeSerializer.fromMap));
|
||||
}
|
||||
|
||||
+13
-1
@@ -3,6 +3,7 @@ import 'package:dde_gesture_manager/constants/sp_keys.dart';
|
||||
import 'package:dde_gesture_manager/constants/supported_locales.dart';
|
||||
import 'package:dde_gesture_manager/extensions.dart';
|
||||
import 'package:dde_gesture_manager/generated/codegen_loader.g.dart';
|
||||
import 'package:dde_gesture_manager/http/api.dart';
|
||||
import 'package:dde_gesture_manager/models/configs.dart';
|
||||
import 'package:dde_gesture_manager/models/configs.provider.dart';
|
||||
import 'package:dde_gesture_manager/models/settings.provider.dart';
|
||||
@@ -68,7 +69,18 @@ class MyApp extends StatelessWidget {
|
||||
],
|
||||
),
|
||||
firstChild: Builder(builder: (context) {
|
||||
Future.microtask(() => initEvents(context));
|
||||
Future.microtask(() {
|
||||
initEvents(context);
|
||||
if (H().lastCheckAuthStatusTime != null &&
|
||||
H().lastCheckAuthStatusTime!.difference(DateTime.now()) < Duration(minutes: 10)) return;
|
||||
if (context.read<ConfigsProvider>().accessToken.notNull) {
|
||||
Api.checkAuthStatus().then((value) {
|
||||
if (!value) context.read<ConfigsProvider>().setProps(email: '', accessToken: '');
|
||||
});
|
||||
} else {
|
||||
H().lastCheckAuthStatusTime = DateTime.now();
|
||||
}
|
||||
});
|
||||
return Container();
|
||||
}),
|
||||
secondChild: HomePage(),
|
||||
|
||||
@@ -131,7 +131,7 @@ class Scheme {
|
||||
@ProviderModelProp()
|
||||
List<GestureProp>? gestures;
|
||||
|
||||
bool get readOnly => uploaded == true || fromMarket == true || id == Uuid.NAMESPACE_NIL;
|
||||
bool get readOnly => fromMarket == true || id == Uuid.NAMESPACE_NIL;
|
||||
|
||||
Scheme.parse(scheme) {
|
||||
if (scheme is String) scheme = json.decode(scheme);
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
import 'package:adaptive_scrollbar/adaptive_scrollbar.dart';
|
||||
import 'package:dde_gesture_manager/constants/constants.dart';
|
||||
import 'package:dde_gesture_manager/extensions.dart';
|
||||
import 'package:dde_gesture_manager/http/api.dart';
|
||||
import 'package:dde_gesture_manager/models/configs.provider.dart';
|
||||
import 'package:dde_gesture_manager/models/content_layout.provider.dart';
|
||||
import 'package:dde_gesture_manager/models/local_schemes_provider.dart';
|
||||
@@ -297,14 +298,13 @@ class GestureEditor extends StatelessWidget {
|
||||
Padding(
|
||||
padding: const EdgeInsets.only(left: 10),
|
||||
child: DButton.upload(
|
||||
enabled: schemeProvider.uploaded == false,
|
||||
enabled: schemeProvider.readOnly == false,
|
||||
onTap: () async {
|
||||
if (context.read<ConfigsProvider>().accessToken.isNull) {
|
||||
return Notificator.showAlert(
|
||||
title: LocaleKeys.info_login_for_upload_title.tr(),
|
||||
description: LocaleKeys.info_login_for_upload_description.tr(),
|
||||
).then((value) {
|
||||
value.sout();
|
||||
if (value == CustomButton.positiveButton) {
|
||||
context
|
||||
.read<ContentLayoutProvider>()
|
||||
@@ -317,7 +317,27 @@ class GestureEditor extends StatelessWidget {
|
||||
description: LocaleKeys.info_upload_and_share_description.tr(),
|
||||
positiveButtonTitle: LocaleKeys.str_share.tr(),
|
||||
negativeButtonTitle: LocaleKeys.str_cancel.tr(),
|
||||
);
|
||||
).then((value) {
|
||||
bool? _share;
|
||||
if (value == CustomButton.positiveButton)
|
||||
_share = true;
|
||||
else if (value == CustomButton.negativeButton) _share = false;
|
||||
|
||||
if (_share != null) {
|
||||
Api.uploadScheme(scheme: schemeProvider, share: _share).then((value) {
|
||||
if (value) {
|
||||
Notificator.success(context, title: LocaleKeys.info_upload_success.tr());
|
||||
var localSchemesProvider = context.read<LocalSchemesProvider>();
|
||||
var localSchemeEntry = localSchemesProvider.schemes!
|
||||
.firstWhere((ele) => ele.scheme.id == schemeProvider.id);
|
||||
localSchemeEntry.scheme.uploaded = true;
|
||||
localSchemeEntry.save(localSchemesProvider);
|
||||
} else {
|
||||
Notificator.error(context, title: LocaleKeys.info_upload_failed.tr());
|
||||
}
|
||||
});
|
||||
}
|
||||
});
|
||||
},
|
||||
),
|
||||
),
|
||||
|
||||
@@ -1,10 +1,10 @@
|
||||
import 'package:auto_size_text/auto_size_text.dart';
|
||||
import 'package:dde_gesture_manager/constants/constants.dart';
|
||||
import 'package:dde_gesture_manager/extensions.dart';
|
||||
import 'package:dde_gesture_manager/models/configs.provider.dart';
|
||||
import 'package:dde_gesture_manager/models/content_layout.provider.dart';
|
||||
import 'package:dde_gesture_manager/widgets/dde_button.dart';
|
||||
import 'package:dde_gesture_manager/widgets/login.dart';
|
||||
import 'package:dde_gesture_manager/widgets/me.dart';
|
||||
import 'package:flutter/cupertino.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
|
||||
@@ -82,33 +82,7 @@ class MarketOrMe extends StatelessWidget {
|
||||
Widget buildMeContent(BuildContext context) {
|
||||
var accessToken = context.watch<ConfigsProvider>().accessToken;
|
||||
if (accessToken.isNull) return LoginWidget();
|
||||
|
||||
return Padding(
|
||||
padding: EdgeInsets.symmetric(vertical: 10),
|
||||
child: Column(
|
||||
children: [
|
||||
Row(
|
||||
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
||||
children: [
|
||||
Icon(Icons.person, size: defaultButtonHeight),
|
||||
Flexible(
|
||||
child: AutoSizeText(
|
||||
context.watch<ConfigsProvider>().email ?? '',
|
||||
style: TextStyle(
|
||||
fontSize: 18,
|
||||
),
|
||||
maxLines: 1,
|
||||
),
|
||||
),
|
||||
DButton.logout(
|
||||
enabled: true,
|
||||
onTap: () => context.read<ConfigsProvider>().setProps(accessToken: '', email: ''),
|
||||
),
|
||||
],
|
||||
),
|
||||
],
|
||||
),
|
||||
);
|
||||
return MeWidget();
|
||||
}
|
||||
|
||||
Widget buildMarketContent(BuildContext context) {
|
||||
|
||||
@@ -34,6 +34,8 @@ class H {
|
||||
|
||||
BuildContext get topContext => _topContext;
|
||||
|
||||
DateTime? lastCheckAuthStatusTime;
|
||||
|
||||
initTopContext(BuildContext context) {
|
||||
_topContext = context;
|
||||
}
|
||||
|
||||
@@ -54,6 +54,12 @@ class _LoginWidgetState extends State<LoginWidget> {
|
||||
title: LocaleKeys.info_sign_up_hint_title.tr(),
|
||||
description: LocaleKeys.info_sign_up_hint_description.tr(),
|
||||
);
|
||||
else if (code == HttpStatus.forbidden)
|
||||
Notificator.info(
|
||||
context,
|
||||
title: LocaleKeys.info_user_blocked_hint_title.tr(),
|
||||
description: LocaleKeys.info_user_blocked_hint_description.tr(),
|
||||
);
|
||||
else
|
||||
throw e;
|
||||
}
|
||||
|
||||
@@ -0,0 +1,69 @@
|
||||
import 'package:auto_size_text/auto_size_text.dart';
|
||||
import 'package:dde_gesture_manager/constants/constants.dart';
|
||||
import 'package:dde_gesture_manager/http/api.dart';
|
||||
import 'package:dde_gesture_manager/models/configs.provider.dart';
|
||||
import 'package:dde_gesture_manager_api/models.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:dde_gesture_manager/extensions.dart';
|
||||
|
||||
import 'dde_button.dart';
|
||||
|
||||
class MeWidget extends StatefulWidget {
|
||||
const MeWidget({Key? key}) : super(key: key);
|
||||
|
||||
@override
|
||||
_MeWidgetState createState() => _MeWidgetState();
|
||||
}
|
||||
|
||||
class _MeWidgetState extends State<MeWidget> {
|
||||
List<Scheme> uploads = [];
|
||||
|
||||
@override
|
||||
void initState() {
|
||||
super.initState();
|
||||
Api.userUploads().then((value) {
|
||||
if (mounted)
|
||||
setState(() {
|
||||
uploads = value;
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return Padding(
|
||||
padding: EdgeInsets.symmetric(vertical: 10),
|
||||
child: Column(
|
||||
children: [
|
||||
Row(
|
||||
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
||||
children: [
|
||||
Icon(Icons.person, size: defaultButtonHeight),
|
||||
Flexible(
|
||||
child: AutoSizeText(
|
||||
context.watch<ConfigsProvider>().email ?? '',
|
||||
style: TextStyle(
|
||||
fontSize: 18,
|
||||
),
|
||||
maxLines: 1,
|
||||
),
|
||||
),
|
||||
DButton.logout(
|
||||
enabled: true,
|
||||
onTap: () => context.read<ConfigsProvider>().setProps(accessToken: '', email: ''),
|
||||
),
|
||||
],
|
||||
),
|
||||
Text('我的上传'),
|
||||
Container(
|
||||
height: 400,
|
||||
child: ListView.builder(
|
||||
itemBuilder: (context, index) => Text(uploads[index].name ?? ''),
|
||||
itemCount: uploads.length,
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user