| 
									
										
										
										
											2022-07-27 14:29:47 +08:00
										 |  |  | import 'dart:async'; | 
					
						
							|  |  |  | import 'dart:convert'; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | import 'package:flutter/material.dart'; | 
					
						
							|  |  |  | import 'package:get/get.dart'; | 
					
						
							|  |  |  | import 'package:http/http.dart' as http; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | import 'model.dart'; | 
					
						
							| 
									
										
										
										
											2022-08-03 22:03:31 +08:00
										 |  |  | import 'platform_model.dart'; | 
					
						
							| 
									
										
										
										
											2022-07-27 14:29:47 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | class UserModel extends ChangeNotifier { | 
					
						
							|  |  |  |   var userName = "".obs; | 
					
						
							|  |  |  |   WeakReference<FFI> parent; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   UserModel(this.parent); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   Future<String> getUserName() async { | 
					
						
							|  |  |  |     if (userName.isNotEmpty) { | 
					
						
							|  |  |  |       return userName.value; | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2022-08-03 22:13:40 +08:00
										 |  |  |     final userInfo = await bind.mainGetLocalOption(key: 'user_info'); | 
					
						
							| 
									
										
										
										
											2022-07-27 14:29:47 +08:00
										 |  |  |     if (userInfo.trim().isEmpty) { | 
					
						
							|  |  |  |       return ""; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     final m = jsonDecode(userInfo); | 
					
						
							|  |  |  |     userName.value = m['name'] ?? ''; | 
					
						
							|  |  |  |     return userName.value; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   Future<void> logOut() async { | 
					
						
							|  |  |  |     debugPrint("start logout"); | 
					
						
							|  |  |  |     final url = await bind.mainGetApiServer(); | 
					
						
							|  |  |  |     final _ = await http.post(Uri.parse("$url/api/logout"), | 
					
						
							|  |  |  |         body: { | 
					
						
							|  |  |  |           "id": await bind.mainGetMyId(), | 
					
						
							|  |  |  |           "uuid": await bind.mainGetUuid(), | 
					
						
							|  |  |  |         }, | 
					
						
							|  |  |  |         headers: await _getHeaders()); | 
					
						
							|  |  |  |     await Future.wait([ | 
					
						
							|  |  |  |       bind.mainSetLocalOption(key: 'access_token', value: ''), | 
					
						
							|  |  |  |       bind.mainSetLocalOption(key: 'user_info', value: ''), | 
					
						
							|  |  |  |       bind.mainSetLocalOption(key: 'selected-tags', value: ''), | 
					
						
							|  |  |  |     ]); | 
					
						
							|  |  |  |     parent.target?.abModel.clear(); | 
					
						
							|  |  |  |     userName.value = ""; | 
					
						
							|  |  |  |     notifyListeners(); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   Future<Map<String, String>>? _getHeaders() { | 
					
						
							|  |  |  |     return parent.target?.getHttpHeaders(); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   Future<Map<String, dynamic>> login(String userName, String pass) async { | 
					
						
							|  |  |  |     final url = await bind.mainGetApiServer(); | 
					
						
							|  |  |  |     try { | 
					
						
							|  |  |  |       final resp = await http.post(Uri.parse("$url/api/login"), | 
					
						
							|  |  |  |           headers: {"Content-Type": "application/json"}, | 
					
						
							|  |  |  |           body: jsonEncode({ | 
					
						
							|  |  |  |             "username": userName, | 
					
						
							|  |  |  |             "password": pass, | 
					
						
							|  |  |  |             "id": await bind.mainGetMyId(), | 
					
						
							|  |  |  |             "uuid": await bind.mainGetUuid() | 
					
						
							|  |  |  |           })); | 
					
						
							|  |  |  |       final body = jsonDecode(resp.body); | 
					
						
							|  |  |  |       bind.mainSetLocalOption( | 
					
						
							|  |  |  |           key: "access_token", value: body['access_token'] ?? ""); | 
					
						
							|  |  |  |       bind.mainSetLocalOption( | 
					
						
							|  |  |  |           key: "user_info", value: jsonEncode(body['user'])); | 
					
						
							|  |  |  |       this.userName.value = body['user']?['name'] ?? ""; | 
					
						
							|  |  |  |       return body; | 
					
						
							|  |  |  |     } catch (err) { | 
					
						
							|  |  |  |       return {"error": "$err"}; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | } |