Compare commits
6 Commits
Author | SHA1 | Date | |
---|---|---|---|
16047a7d57 | |||
fdc68fc5e1 | |||
bbee825cf4 | |||
2673c11046 | |||
3ac6822ab6 | |||
7a5fd2e468 |
@ -98,6 +98,8 @@
|
|||||||
"accountFriendBlocked": "Friend blocklist",
|
"accountFriendBlocked": "Friend blocklist",
|
||||||
"accountFriendListHint": "Swipe left to decline, right to approve",
|
"accountFriendListHint": "Swipe left to decline, right to approve",
|
||||||
"accountFriendRequestSent": "Friend request sent, waiting for processing...",
|
"accountFriendRequestSent": "Friend request sent, waiting for processing...",
|
||||||
|
"accountBlocked": "Account has been blocked",
|
||||||
|
"accountUnblocked": "Account has been unblocked",
|
||||||
"accountSuspended": "Account was suspended",
|
"accountSuspended": "Account was suspended",
|
||||||
"accountSuspendedAt": "Account was suspended since @date",
|
"accountSuspendedAt": "Account was suspended since @date",
|
||||||
"aspectRatio": "Aspect Ratio",
|
"aspectRatio": "Aspect Ratio",
|
||||||
@ -453,5 +455,13 @@
|
|||||||
"accountDeletionConfirm": "Confirm request account deletion",
|
"accountDeletionConfirm": "Confirm request account deletion",
|
||||||
"accountDeletionConfirmDesc": "Are you sure to delete account @account? You will receive a confirmation email with a link to confirm the deletion of the account within 24 hours. Note that this action is irreversible, and all data associated with the account will be deleted, and you should be careful about it.",
|
"accountDeletionConfirmDesc": "Are you sure to delete account @account? You will receive a confirmation email with a link to confirm the deletion of the account within 24 hours. Note that this action is irreversible, and all data associated with the account will be deleted, and you should be careful about it.",
|
||||||
"accountDeletionRequested": "Account deletion requested, check your inbox to confirm the request.",
|
"accountDeletionRequested": "Account deletion requested, check your inbox to confirm the request.",
|
||||||
"slideToConfirm": "Slide to confirm"
|
"slideToConfirm": "Slide to confirm",
|
||||||
|
"serviceStatus": "Status of Service",
|
||||||
|
"firstBootTime": "First boot at @time",
|
||||||
|
"rateTheApp": "Rate the app",
|
||||||
|
"rateTheAppDesc": "Rate Solar Network on the App Store to let us serve you better!",
|
||||||
|
"friendAdd": "Add as friend",
|
||||||
|
"blockUser": "Block user",
|
||||||
|
"unblockUser": "Unblock user",
|
||||||
|
"learnMoreAboutPerson": "Learn more about that person"
|
||||||
}
|
}
|
||||||
|
@ -98,6 +98,8 @@
|
|||||||
"accountFriendBlocked": "好友黑名单",
|
"accountFriendBlocked": "好友黑名单",
|
||||||
"accountFriendListHint": "左滑来拒绝,右滑来接受",
|
"accountFriendListHint": "左滑来拒绝,右滑来接受",
|
||||||
"accountFriendRequestSent": "好友请求已发送,等待处理对方中……",
|
"accountFriendRequestSent": "好友请求已发送,等待处理对方中……",
|
||||||
|
"accountBlocked": "已屏蔽账号",
|
||||||
|
"accountUnblocked": "已解除屏蔽账号",
|
||||||
"accountSuspended": "帐号被停用",
|
"accountSuspended": "帐号被停用",
|
||||||
"accountSuspendedAt": "该帐号自 @date 起被停用",
|
"accountSuspendedAt": "该帐号自 @date 起被停用",
|
||||||
"aspectRatio": "纵横比",
|
"aspectRatio": "纵横比",
|
||||||
@ -449,5 +451,13 @@
|
|||||||
"accountDeletionConfirm": "确认账号删除请求",
|
"accountDeletionConfirm": "确认账号删除请求",
|
||||||
"accountDeletionConfirmDesc": "你确定要删除账号 @account 吗?你将会在其绑定的主要邮件地址收到一封包含着确认删除账号连接的邮件,在二十四小时内使用该连接即可完成删除账号。注意,本操作不可撤销,并且账号创建或关联的所有数据都将被删除,请三思而后行。",
|
"accountDeletionConfirmDesc": "你确定要删除账号 @account 吗?你将会在其绑定的主要邮件地址收到一封包含着确认删除账号连接的邮件,在二十四小时内使用该连接即可完成删除账号。注意,本操作不可撤销,并且账号创建或关联的所有数据都将被删除,请三思而后行。",
|
||||||
"accountDeletionRequested": "已请求删除账号,检查你的收件箱来确认请求。",
|
"accountDeletionRequested": "已请求删除账号,检查你的收件箱来确认请求。",
|
||||||
"slideToConfirm": "滑动来确认"
|
"slideToConfirm": "滑动来确认",
|
||||||
|
"serviceStatus": "服务状态",
|
||||||
|
"firstBootTime": "首次启动于 @time",
|
||||||
|
"rateTheApp": "给应用评分",
|
||||||
|
"rateTheAppDesc": "在 App Store 上给 Solar Network 评分,让我们更好地为您服务吧!",
|
||||||
|
"friendAdd": "添加好友",
|
||||||
|
"blockUser": "屏蔽用户",
|
||||||
|
"unblockUser": "解除屏蔽用户",
|
||||||
|
"learnMoreAboutPerson": "了解关于 TA 的更多"
|
||||||
}
|
}
|
||||||
|
@ -227,6 +227,8 @@ PODS:
|
|||||||
- TOCropViewController (~> 2.7.4)
|
- TOCropViewController (~> 2.7.4)
|
||||||
- image_picker_ios (0.0.1):
|
- image_picker_ios (0.0.1):
|
||||||
- Flutter
|
- Flutter
|
||||||
|
- in_app_review (0.2.0):
|
||||||
|
- Flutter
|
||||||
- livekit_client (2.2.6):
|
- livekit_client (2.2.6):
|
||||||
- Flutter
|
- Flutter
|
||||||
- WebRTC-SDK (= 125.6422.04)
|
- WebRTC-SDK (= 125.6422.04)
|
||||||
@ -318,6 +320,7 @@ DEPENDENCIES:
|
|||||||
- gal (from `.symlinks/plugins/gal/darwin`)
|
- gal (from `.symlinks/plugins/gal/darwin`)
|
||||||
- image_cropper (from `.symlinks/plugins/image_cropper/ios`)
|
- image_cropper (from `.symlinks/plugins/image_cropper/ios`)
|
||||||
- image_picker_ios (from `.symlinks/plugins/image_picker_ios/ios`)
|
- image_picker_ios (from `.symlinks/plugins/image_picker_ios/ios`)
|
||||||
|
- in_app_review (from `.symlinks/plugins/in_app_review/ios`)
|
||||||
- livekit_client (from `.symlinks/plugins/livekit_client/ios`)
|
- livekit_client (from `.symlinks/plugins/livekit_client/ios`)
|
||||||
- media_kit_libs_ios_video (from `.symlinks/plugins/media_kit_libs_ios_video/ios`)
|
- media_kit_libs_ios_video (from `.symlinks/plugins/media_kit_libs_ios_video/ios`)
|
||||||
- media_kit_native_event_loop (from `.symlinks/plugins/media_kit_native_event_loop/ios`)
|
- media_kit_native_event_loop (from `.symlinks/plugins/media_kit_native_event_loop/ios`)
|
||||||
@ -406,6 +409,8 @@ EXTERNAL SOURCES:
|
|||||||
:path: ".symlinks/plugins/image_cropper/ios"
|
:path: ".symlinks/plugins/image_cropper/ios"
|
||||||
image_picker_ios:
|
image_picker_ios:
|
||||||
:path: ".symlinks/plugins/image_picker_ios/ios"
|
:path: ".symlinks/plugins/image_picker_ios/ios"
|
||||||
|
in_app_review:
|
||||||
|
:path: ".symlinks/plugins/in_app_review/ios"
|
||||||
livekit_client:
|
livekit_client:
|
||||||
:path: ".symlinks/plugins/livekit_client/ios"
|
:path: ".symlinks/plugins/livekit_client/ios"
|
||||||
media_kit_libs_ios_video:
|
media_kit_libs_ios_video:
|
||||||
@ -482,6 +487,7 @@ SPEC CHECKSUMS:
|
|||||||
GoogleUtilities: 26a3abef001b6533cf678d3eb38fd3f614b7872d
|
GoogleUtilities: 26a3abef001b6533cf678d3eb38fd3f614b7872d
|
||||||
image_cropper: 37d40f62177c101ff4c164906d259ea2c3aa70cf
|
image_cropper: 37d40f62177c101ff4c164906d259ea2c3aa70cf
|
||||||
image_picker_ios: c560581cceedb403a6ff17f2f816d7fea1421fc1
|
image_picker_ios: c560581cceedb403a6ff17f2f816d7fea1421fc1
|
||||||
|
in_app_review: 318597b3a06c22bb46dc454d56828c85f444f99d
|
||||||
livekit_client: 20e01637431bc108dad451c8a11c1d206e1dd2cd
|
livekit_client: 20e01637431bc108dad451c8a11c1d206e1dd2cd
|
||||||
media_kit_libs_ios_video: a5fe24bc7875ccd6378a0978c13185e1344651c1
|
media_kit_libs_ios_video: a5fe24bc7875ccd6378a0978c13185e1344651c1
|
||||||
media_kit_native_event_loop: e6b2ab20cf0746eb1c33be961fcf79667304fa2a
|
media_kit_native_event_loop: e6b2ab20cf0746eb1c33be961fcf79667304fa2a
|
||||||
|
@ -1,87 +1,92 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||||
<plist version="1.0">
|
<plist version="1.0">
|
||||||
<dict>
|
<dict>
|
||||||
<key>CFBundleURLTypes</key>
|
<key>CFBundleURLTypes</key>
|
||||||
<array>
|
<array>
|
||||||
<dict>
|
<dict>
|
||||||
<key>CFBundleURLName</key>
|
<key>CFBundleURLName</key>
|
||||||
<string></string>
|
<string></string>
|
||||||
<key>CFBundleTypeRole</key>
|
<key>CFBundleTypeRole</key>
|
||||||
<string>Editor</string>
|
<string>Editor</string>
|
||||||
<key>CFBundleURLSchemes</key>
|
<key>CFBundleURLSchemes</key>
|
||||||
<array>
|
<array>
|
||||||
<string>solink</string>
|
<string>solink</string>
|
||||||
</array>
|
</array>
|
||||||
</dict>
|
</dict>
|
||||||
</array>
|
</array>
|
||||||
<key>FirebaseMessagingAutoInitEnabled</key>
|
<key>FirebaseMessagingAutoInitEnabled</key>
|
||||||
<false/>
|
<false/>
|
||||||
<key>CADisableMinimumFrameDurationOnPhone</key>
|
<key>CADisableMinimumFrameDurationOnPhone</key>
|
||||||
<true/>
|
<true/>
|
||||||
<key>CFBundleDevelopmentRegion</key>
|
<key>CFBundleDevelopmentRegion</key>
|
||||||
<string>$(DEVELOPMENT_LANGUAGE)</string>
|
<string>$(DEVELOPMENT_LANGUAGE)</string>
|
||||||
<key>CFBundleDisplayName</key>
|
<key>CFBundleDisplayName</key>
|
||||||
<string>Solian</string>
|
<string>Solian</string>
|
||||||
<key>CFBundleExecutable</key>
|
<key>CFBundleExecutable</key>
|
||||||
<string>$(EXECUTABLE_NAME)</string>
|
<string>$(EXECUTABLE_NAME)</string>
|
||||||
<key>CFBundleIdentifier</key>
|
<key>CFBundleIdentifier</key>
|
||||||
<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
|
<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
|
||||||
<key>CFBundleInfoDictionaryVersion</key>
|
<key>CFBundleInfoDictionaryVersion</key>
|
||||||
<string>6.0</string>
|
<string>6.0</string>
|
||||||
<key>CFBundleName</key>
|
<key>CFBundleName</key>
|
||||||
<string>solian</string>
|
<string>solian</string>
|
||||||
<key>CFBundlePackageType</key>
|
<key>CFBundlePackageType</key>
|
||||||
<string>APPL</string>
|
<string>APPL</string>
|
||||||
<key>CFBundleShortVersionString</key>
|
<key>CFBundleShortVersionString</key>
|
||||||
<string>$(FLUTTER_BUILD_NAME)</string>
|
<string>$(FLUTTER_BUILD_NAME)</string>
|
||||||
<key>CFBundleSignature</key>
|
<key>CFBundleSignature</key>
|
||||||
<string>????</string>
|
<string>????</string>
|
||||||
<key>CFBundleVersion</key>
|
<key>CFBundleVersion</key>
|
||||||
<string>$(FLUTTER_BUILD_NUMBER)</string>
|
<string>$(FLUTTER_BUILD_NUMBER)</string>
|
||||||
<key>ITSAppUsesNonExemptEncryption</key>
|
<key>ITSAppUsesNonExemptEncryption</key>
|
||||||
<false/>
|
<false/>
|
||||||
<key>LSRequiresIPhoneOS</key>
|
<key>LSRequiresIPhoneOS</key>
|
||||||
<true/>
|
<true/>
|
||||||
<key>NSCameraUsageDescription</key>
|
<key>NSCameraUsageDescription</key>
|
||||||
<string>Allow you take photo/video for your message or post</string>
|
<string>Allow you take photo/video for your message or post</string>
|
||||||
<key>NSMicrophoneUsageDescription</key>
|
<key>NSMicrophoneUsageDescription</key>
|
||||||
<string>Allow you record audio for your message or post</string>
|
<string>Allow you record audio for your message or post</string>
|
||||||
<key>NSPhotoLibraryUsageDescription</key>
|
<key>NSPhotoLibraryUsageDescription</key>
|
||||||
<string>Allow you add photo to your message or post</string>
|
<string>Allow you add photo to your message or post</string>
|
||||||
<key>UIApplicationSupportsIndirectInputEvents</key>
|
<key>UIApplicationSupportsIndirectInputEvents</key>
|
||||||
<true/>
|
<true/>
|
||||||
<key>UIBackgroundModes</key>
|
<key>UIBackgroundModes</key>
|
||||||
<array>
|
<array>
|
||||||
<string>audio</string>
|
<string>audio</string>
|
||||||
<string>fetch</string>
|
<string>fetch</string>
|
||||||
<string>remote-notification</string>
|
<string>remote-notification</string>
|
||||||
<string>voip</string>
|
<string>voip</string>
|
||||||
</array>
|
</array>
|
||||||
<key>UILaunchStoryboardName</key>
|
<key>UILaunchStoryboardName</key>
|
||||||
<string>LaunchScreen</string>
|
<string>LaunchScreen</string>
|
||||||
<key>UIMainStoryboardFile</key>
|
<key>UIMainStoryboardFile</key>
|
||||||
<string>Main</string>
|
<string>Main</string>
|
||||||
<key>UISupportedInterfaceOrientations</key>
|
<key>UISupportedInterfaceOrientations</key>
|
||||||
<array>
|
<array>
|
||||||
<string>UIInterfaceOrientationPortrait</string>
|
<string>UIInterfaceOrientationPortrait</string>
|
||||||
<string>UIInterfaceOrientationLandscapeLeft</string>
|
<string>UIInterfaceOrientationLandscapeLeft</string>
|
||||||
<string>UIInterfaceOrientationLandscapeRight</string>
|
<string>UIInterfaceOrientationLandscapeRight</string>
|
||||||
</array>
|
</array>
|
||||||
<key>FlutterDeepLinkingEnabled</key>
|
<key>FlutterDeepLinkingEnabled</key>
|
||||||
<true/>
|
<true/>
|
||||||
<key>NSUserActivityTypes</key>
|
<key>NSUserActivityTypes</key>
|
||||||
<array>
|
<array>
|
||||||
<string>INSendMessageIntent</string>
|
<string>INSendMessageIntent</string>
|
||||||
</array>
|
</array>
|
||||||
<key>UISupportedInterfaceOrientations~ipad</key>
|
<key>UISupportedInterfaceOrientations~ipad</key>
|
||||||
<array>
|
<array>
|
||||||
<string>UIInterfaceOrientationPortrait</string>
|
<string>UIInterfaceOrientationPortrait</string>
|
||||||
<string>UIInterfaceOrientationPortraitUpsideDown</string>
|
<string>UIInterfaceOrientationPortraitUpsideDown</string>
|
||||||
<string>UIInterfaceOrientationLandscapeLeft</string>
|
<string>UIInterfaceOrientationLandscapeLeft</string>
|
||||||
<string>UIInterfaceOrientationLandscapeRight</string>
|
<string>UIInterfaceOrientationLandscapeRight</string>
|
||||||
</array>
|
</array>
|
||||||
<key>UIStatusBarHidden</key>
|
<key>CFBundleLocalizations</key>
|
||||||
<false/>
|
<array>
|
||||||
</dict>
|
<string>zh_CN</string>
|
||||||
|
<string>en</string>
|
||||||
|
</array>
|
||||||
|
<key>UIStatusBarHidden</key>
|
||||||
|
<false/>
|
||||||
|
</dict>
|
||||||
</plist>
|
</plist>
|
||||||
|
@ -1,8 +1,10 @@
|
|||||||
import 'dart:async';
|
import 'dart:async';
|
||||||
|
import 'dart:developer';
|
||||||
|
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:gap/gap.dart';
|
import 'package:gap/gap.dart';
|
||||||
import 'package:get/get.dart';
|
import 'package:get/get.dart';
|
||||||
|
import 'package:in_app_review/in_app_review.dart';
|
||||||
import 'package:package_info_plus/package_info_plus.dart';
|
import 'package:package_info_plus/package_info_plus.dart';
|
||||||
import 'package:provider/provider.dart';
|
import 'package:provider/provider.dart';
|
||||||
import 'package:shared_preferences/shared_preferences.dart';
|
import 'package:shared_preferences/shared_preferences.dart';
|
||||||
@ -42,6 +44,27 @@ class _BootstrapperShellState extends State<BootstrapperShell> {
|
|||||||
|
|
||||||
final Completer _bootCompleter = Completer();
|
final Completer _bootCompleter = Completer();
|
||||||
|
|
||||||
|
void _requestRating() async {
|
||||||
|
final prefs = await SharedPreferences.getInstance();
|
||||||
|
if (prefs.containsKey('first_boot_time')) {
|
||||||
|
final rawTime = prefs.getString('first_boot_time');
|
||||||
|
final time = DateTime.tryParse(rawTime ?? '');
|
||||||
|
if (time != null &&
|
||||||
|
time.isBefore(DateTime.now().subtract(const Duration(days: 3)))) {
|
||||||
|
final inAppReview = InAppReview.instance;
|
||||||
|
if (prefs.getBool('rating_requested') == true) return;
|
||||||
|
if (await inAppReview.isAvailable()) {
|
||||||
|
await inAppReview.requestReview();
|
||||||
|
prefs.setBool('rating_requested', true);
|
||||||
|
} else {
|
||||||
|
log('Unable request app review, unavailable');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
prefs.setString('first_boot_time', DateTime.now().toIso8601String());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void _updateNow(String localVersionString, String remoteVersionString) {
|
void _updateNow(String localVersionString, String remoteVersionString) {
|
||||||
context
|
context
|
||||||
.showConfirmDialog(
|
.showConfirmDialog(
|
||||||
@ -226,6 +249,9 @@ class _BootstrapperShellState extends State<BootstrapperShell> {
|
|||||||
super.initState();
|
super.initState();
|
||||||
_runPeriods();
|
_runPeriods();
|
||||||
_checkForUpdate();
|
_checkForUpdate();
|
||||||
|
_bootCompleter.future.then((_) {
|
||||||
|
_requestRating();
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
|
@ -27,6 +27,8 @@ abstract class PlatformInfo {
|
|||||||
|
|
||||||
static bool get canCacheImage => isAndroid || isIOS || isMacOS;
|
static bool get canCacheImage => isAndroid || isIOS || isMacOS;
|
||||||
|
|
||||||
|
static bool get canRateTheApp => isIOS || isMacOS;
|
||||||
|
|
||||||
static bool get canRecord => (isMobile || isMacOS);
|
static bool get canRecord => (isMobile || isMacOS);
|
||||||
|
|
||||||
static bool get canPushNotification => isAndroid || isIOS || isMacOS;
|
static bool get canPushNotification => isAndroid || isIOS || isMacOS;
|
||||||
@ -38,4 +40,4 @@ abstract class PlatformInfo {
|
|||||||
} catch (_) {}
|
} catch (_) {}
|
||||||
return version;
|
return version;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -26,6 +26,19 @@ class RelationshipProvider extends GetxController {
|
|||||||
return _friends.any((x) => x.relatedId == account.id);
|
return _friends.any((x) => x.relatedId == account.id);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Future<Relationship?> getRelationship(int relatedId) async {
|
||||||
|
final AuthProvider auth = Get.find();
|
||||||
|
final client = await auth.configureClient('auth');
|
||||||
|
final resp = await client.get('/users/me/relations/$relatedId');
|
||||||
|
if (resp.statusCode == 404) {
|
||||||
|
return null;
|
||||||
|
} else if (resp.statusCode != 200) {
|
||||||
|
throw RequestException(resp);
|
||||||
|
}
|
||||||
|
|
||||||
|
return Relationship.fromJson(resp.body);
|
||||||
|
}
|
||||||
|
|
||||||
Future<Response> listRelation() async {
|
Future<Response> listRelation() async {
|
||||||
final AuthProvider auth = Get.find();
|
final AuthProvider auth = Get.find();
|
||||||
final client = await auth.configureClient('auth');
|
final client = await auth.configureClient('auth');
|
||||||
@ -38,7 +51,19 @@ class RelationshipProvider extends GetxController {
|
|||||||
return client.get('/users/me/relations?status=$status');
|
return client.get('/users/me/relations?status=$status');
|
||||||
}
|
}
|
||||||
|
|
||||||
Future<Response> makeFriend(String username) async {
|
Future<Relationship?> blockUser(String username) async {
|
||||||
|
final AuthProvider auth = Get.find();
|
||||||
|
final client = await auth.configureClient('auth');
|
||||||
|
final resp =
|
||||||
|
await client.post('/users/me/relations/block?related=$username', {});
|
||||||
|
if (resp.statusCode != 200) {
|
||||||
|
throw RequestException(resp);
|
||||||
|
}
|
||||||
|
|
||||||
|
return Relationship.fromJson(resp.body);
|
||||||
|
}
|
||||||
|
|
||||||
|
Future<Relationship?> makeFriend(String username) async {
|
||||||
final AuthProvider auth = Get.find();
|
final AuthProvider auth = Get.find();
|
||||||
final client = await auth.configureClient('auth');
|
final client = await auth.configureClient('auth');
|
||||||
final resp = await client.post('/users/me/relations?related=$username', {});
|
final resp = await client.post('/users/me/relations?related=$username', {});
|
||||||
@ -46,7 +71,7 @@ class RelationshipProvider extends GetxController {
|
|||||||
throw RequestException(resp);
|
throw RequestException(resp);
|
||||||
}
|
}
|
||||||
|
|
||||||
return resp;
|
return Relationship.fromJson(resp.body);
|
||||||
}
|
}
|
||||||
|
|
||||||
Future<Response> handleRelation(
|
Future<Response> handleRelation(
|
||||||
@ -64,17 +89,17 @@ class RelationshipProvider extends GetxController {
|
|||||||
return resp;
|
return resp;
|
||||||
}
|
}
|
||||||
|
|
||||||
Future<Response> editRelation(Relationship relationship, int status) async {
|
Future<Relationship?> editRelation(int relatedId, int status) async {
|
||||||
final AuthProvider auth = Get.find();
|
final AuthProvider auth = Get.find();
|
||||||
final client = await auth.configureClient('auth');
|
final client = await auth.configureClient('auth');
|
||||||
final resp = await client.patch(
|
final resp = await client.put(
|
||||||
'/users/me/relations/${relationship.relatedId}',
|
'/users/me/relations/$relatedId',
|
||||||
{'status': status},
|
{'status': status},
|
||||||
);
|
);
|
||||||
if (resp.statusCode != 200) {
|
if (resp.statusCode != 200) {
|
||||||
throw RequestException(resp);
|
throw RequestException(resp);
|
||||||
}
|
}
|
||||||
|
|
||||||
return resp;
|
return Relationship.fromJson(resp.body);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,7 +1,9 @@
|
|||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:gap/gap.dart';
|
import 'package:gap/gap.dart';
|
||||||
import 'package:get/get.dart';
|
import 'package:get/get.dart';
|
||||||
|
import 'package:intl/intl.dart';
|
||||||
import 'package:package_info_plus/package_info_plus.dart';
|
import 'package:package_info_plus/package_info_plus.dart';
|
||||||
|
import 'package:shared_preferences/shared_preferences.dart';
|
||||||
import 'package:solian/widgets/sized_container.dart';
|
import 'package:solian/widgets/sized_container.dart';
|
||||||
import 'package:url_launcher/url_launcher_string.dart';
|
import 'package:url_launcher/url_launcher_string.dart';
|
||||||
|
|
||||||
@ -52,8 +54,8 @@ class AboutScreen extends StatelessWidget {
|
|||||||
CenteredContainer(
|
CenteredContainer(
|
||||||
maxWidth: 280,
|
maxWidth: 280,
|
||||||
child: Wrap(
|
child: Wrap(
|
||||||
spacing: 8,
|
spacing: 4,
|
||||||
runSpacing: 8,
|
runSpacing: 4,
|
||||||
alignment: WrapAlignment.center,
|
alignment: WrapAlignment.center,
|
||||||
children: [
|
children: [
|
||||||
TextButton(
|
TextButton(
|
||||||
@ -92,6 +94,13 @@ class AboutScreen extends StatelessWidget {
|
|||||||
launchUrlString('https://solsynth.dev/terms');
|
launchUrlString('https://solsynth.dev/terms');
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
|
TextButton(
|
||||||
|
style: denseButtonStyle,
|
||||||
|
child: Text('serviceStatus'.tr),
|
||||||
|
onPressed: () {
|
||||||
|
launchUrlString('https://status.solsynth.dev');
|
||||||
|
},
|
||||||
|
),
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
@ -103,6 +112,34 @@ class AboutScreen extends StatelessWidget {
|
|||||||
fontSize: 12,
|
fontSize: 12,
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
|
FutureBuilder(
|
||||||
|
future: SharedPreferences.getInstance(),
|
||||||
|
builder: (context, snapshot) {
|
||||||
|
const textStyle = TextStyle(
|
||||||
|
fontWeight: FontWeight.w300,
|
||||||
|
fontSize: 12,
|
||||||
|
);
|
||||||
|
if (!snapshot.hasData ||
|
||||||
|
!snapshot.data!.containsKey('first_boot_time')) {
|
||||||
|
return Text(
|
||||||
|
'firstBootTime'.trParams({'time': 'unknown'.tr}),
|
||||||
|
style: textStyle,
|
||||||
|
);
|
||||||
|
} else {
|
||||||
|
return Text(
|
||||||
|
'firstBootTime'.trParams({
|
||||||
|
'time': DateFormat('yyyy-MM-dd').format(
|
||||||
|
DateTime.tryParse(
|
||||||
|
snapshot.data!.getString('first_boot_time')!,
|
||||||
|
)?.toLocal() ??
|
||||||
|
DateTime.now(),
|
||||||
|
),
|
||||||
|
}),
|
||||||
|
style: textStyle,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
),
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
|
@ -13,6 +13,7 @@ import 'package:solian/models/attachment.dart';
|
|||||||
import 'package:solian/models/daily_sign.dart';
|
import 'package:solian/models/daily_sign.dart';
|
||||||
import 'package:solian/models/pagination.dart';
|
import 'package:solian/models/pagination.dart';
|
||||||
import 'package:solian/models/post.dart';
|
import 'package:solian/models/post.dart';
|
||||||
|
import 'package:solian/models/relations.dart';
|
||||||
import 'package:solian/models/subscription.dart';
|
import 'package:solian/models/subscription.dart';
|
||||||
import 'package:solian/providers/account_status.dart';
|
import 'package:solian/providers/account_status.dart';
|
||||||
import 'package:solian/providers/relation.dart';
|
import 'package:solian/providers/relation.dart';
|
||||||
@ -26,6 +27,7 @@ import 'package:solian/widgets/attachments/attachment_list.dart';
|
|||||||
import 'package:solian/widgets/daily_sign/history_chart.dart';
|
import 'package:solian/widgets/daily_sign/history_chart.dart';
|
||||||
import 'package:solian/widgets/posts/post_list.dart';
|
import 'package:solian/widgets/posts/post_list.dart';
|
||||||
import 'package:solian/widgets/posts/post_warped_list.dart';
|
import 'package:solian/widgets/posts/post_warped_list.dart';
|
||||||
|
import 'package:solian/widgets/reports/abuse_report.dart';
|
||||||
import 'package:solian/widgets/sized_container.dart';
|
import 'package:solian/widgets/sized_container.dart';
|
||||||
|
|
||||||
class AccountProfilePage extends StatefulWidget {
|
class AccountProfilePage extends StatefulWidget {
|
||||||
@ -50,6 +52,7 @@ class _AccountProfilePageState extends State<AccountProfilePage> {
|
|||||||
|
|
||||||
Account? _userinfo;
|
Account? _userinfo;
|
||||||
Subscription? _subscription;
|
Subscription? _subscription;
|
||||||
|
Relationship? _relationship;
|
||||||
List<Post> _pinnedPosts = List.empty();
|
List<Post> _pinnedPosts = List.empty();
|
||||||
List<DailySignRecord> _dailySignRecords = List.empty();
|
List<DailySignRecord> _dailySignRecords = List.empty();
|
||||||
int _totalUpvote = 0, _totalDownvote = 0;
|
int _totalUpvote = 0, _totalDownvote = 0;
|
||||||
@ -61,6 +64,15 @@ class _AccountProfilePageState extends State<AccountProfilePage> {
|
|||||||
setState(() => _isSubscribing = false);
|
setState(() => _isSubscribing = false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Future<void> _getRelationship() async {
|
||||||
|
setState(() => _isBusy = true);
|
||||||
|
|
||||||
|
final relations = Get.find<RelationshipProvider>();
|
||||||
|
_relationship = await relations.getRelationship(_userinfo!.id);
|
||||||
|
|
||||||
|
setState(() => _isBusy = false);
|
||||||
|
}
|
||||||
|
|
||||||
Future<void> _getUserinfo() async {
|
Future<void> _getUserinfo() async {
|
||||||
setState(() => _isBusy = true);
|
setState(() => _isBusy = true);
|
||||||
|
|
||||||
@ -120,6 +132,63 @@ class _AccountProfilePageState extends State<AccountProfilePage> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Future<void> _subscribeToUser() async {
|
||||||
|
setState(() => _isSubscribing = true);
|
||||||
|
_subscription =
|
||||||
|
await Get.find<SubscriptionProvider>().subscribeToUser(_userinfo!.id);
|
||||||
|
setState(() => _isSubscribing = false);
|
||||||
|
}
|
||||||
|
|
||||||
|
Future<void> _unsubscribeFromUser() async {
|
||||||
|
setState(() => _isSubscribing = true);
|
||||||
|
await Get.find<SubscriptionProvider>().unsubscribeFromUser(_userinfo!.id);
|
||||||
|
_subscription = null;
|
||||||
|
setState(() => _isSubscribing = false);
|
||||||
|
}
|
||||||
|
|
||||||
|
Future<void> _makeFriend() async {
|
||||||
|
setState(() => _isMakingFriend = true);
|
||||||
|
try {
|
||||||
|
_relationship = await _relationshipProvider.makeFriend(widget.name);
|
||||||
|
context.showSnackbar(
|
||||||
|
'accountFriendRequestSent'.tr,
|
||||||
|
);
|
||||||
|
} catch (e) {
|
||||||
|
context.showErrorDialog(e);
|
||||||
|
} finally {
|
||||||
|
setState(() => _isMakingFriend = false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Future<void> _blockUser() async {
|
||||||
|
setState(() => _isMakingFriend = true);
|
||||||
|
try {
|
||||||
|
_relationship = await _relationshipProvider.blockUser(widget.name);
|
||||||
|
context.showSnackbar(
|
||||||
|
'accountBlocked'.tr,
|
||||||
|
);
|
||||||
|
} catch (e) {
|
||||||
|
context.showErrorDialog(e);
|
||||||
|
} finally {
|
||||||
|
setState(() => _isMakingFriend = false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Future<void> _unblockUser() async {
|
||||||
|
setState(() => _isMakingFriend = true);
|
||||||
|
try {
|
||||||
|
_relationship =
|
||||||
|
await _relationshipProvider.editRelation(_userinfo!.id, 1);
|
||||||
|
context.showSnackbar(
|
||||||
|
'accountUnblocked'.tr,
|
||||||
|
);
|
||||||
|
} catch (e) {
|
||||||
|
context.showErrorDialog(e);
|
||||||
|
} finally {
|
||||||
|
setState(() => _isMakingFriend = false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
int get _userSocialCreditPoints {
|
int get _userSocialCreditPoints {
|
||||||
return _totalUpvote * 2 - _totalDownvote + _postController.postTotal.value;
|
return _totalUpvote * 2 - _totalDownvote + _postController.postTotal.value;
|
||||||
}
|
}
|
||||||
@ -151,29 +220,13 @@ class _AccountProfilePageState extends State<AccountProfilePage> {
|
|||||||
});
|
});
|
||||||
|
|
||||||
_getUserinfo().then((_) {
|
_getUserinfo().then((_) {
|
||||||
|
_getRelationship();
|
||||||
_getSubscription();
|
_getSubscription();
|
||||||
_getPinnedPosts();
|
_getPinnedPosts();
|
||||||
_getDailySignRecords();
|
_getDailySignRecords();
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
Widget _buildStatisticsEntry(String label, String content) {
|
|
||||||
return Expanded(
|
|
||||||
child: Column(
|
|
||||||
children: [
|
|
||||||
Text(
|
|
||||||
label,
|
|
||||||
style: Theme.of(context).textTheme.bodySmall,
|
|
||||||
),
|
|
||||||
Text(
|
|
||||||
content,
|
|
||||||
style: Theme.of(context).textTheme.bodyLarge,
|
|
||||||
),
|
|
||||||
],
|
|
||||||
),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
if (_isBusy || _userinfo == null) {
|
if (_isBusy || _userinfo == null) {
|
||||||
@ -221,59 +274,31 @@ class _AccountProfilePageState extends State<AccountProfilePage> {
|
|||||||
),
|
),
|
||||||
),
|
),
|
||||||
if (_userinfo != null && _subscription == null)
|
if (_userinfo != null && _subscription == null)
|
||||||
OutlinedButton(
|
IconButton(
|
||||||
style: const ButtonStyle(
|
style: const ButtonStyle(
|
||||||
visualDensity:
|
visualDensity:
|
||||||
VisualDensity(horizontal: -4, vertical: -2),
|
VisualDensity(horizontal: -4, vertical: -2),
|
||||||
),
|
),
|
||||||
onPressed: _isSubscribing
|
onPressed: _isSubscribing ? null : _subscribeToUser,
|
||||||
? null
|
icon: const Icon(Icons.add_circle_outline),
|
||||||
: () async {
|
tooltip: 'subscribe'.tr,
|
||||||
setState(() => _isSubscribing = true);
|
|
||||||
_subscription =
|
|
||||||
await Get.find<SubscriptionProvider>()
|
|
||||||
.subscribeToUser(_userinfo!.id);
|
|
||||||
setState(() => _isSubscribing = false);
|
|
||||||
},
|
|
||||||
child: Text('subscribe'.tr),
|
|
||||||
)
|
)
|
||||||
else if (_userinfo != null)
|
else if (_userinfo != null)
|
||||||
OutlinedButton(
|
IconButton(
|
||||||
style: const ButtonStyle(
|
style: const ButtonStyle(
|
||||||
visualDensity:
|
visualDensity:
|
||||||
VisualDensity(horizontal: -4, vertical: -2),
|
VisualDensity(horizontal: -4, vertical: -2),
|
||||||
),
|
),
|
||||||
onPressed: _isSubscribing
|
onPressed:
|
||||||
? null
|
_isSubscribing ? null : _unsubscribeFromUser,
|
||||||
: () async {
|
icon: const Icon(Icons.remove_circle_outline),
|
||||||
setState(() => _isSubscribing = true);
|
tooltip: 'unsubscribe'.tr,
|
||||||
await Get.find<SubscriptionProvider>()
|
|
||||||
.unsubscribeFromUser(_userinfo!.id);
|
|
||||||
_subscription = null;
|
|
||||||
setState(() => _isSubscribing = false);
|
|
||||||
},
|
|
||||||
child: Text('unsubscribe'.tr),
|
|
||||||
),
|
),
|
||||||
if (_userinfo != null &&
|
if (_userinfo != null && _relationship == null)
|
||||||
!_relationshipProvider.hasFriend(_userinfo!))
|
|
||||||
IconButton(
|
IconButton(
|
||||||
icon: const Icon(Icons.person_add),
|
icon: const Icon(Icons.person_add),
|
||||||
onPressed: _isMakingFriend
|
onPressed: _isMakingFriend ? null : _makeFriend,
|
||||||
? null
|
tooltip: 'friendAdd'.tr,
|
||||||
: () async {
|
|
||||||
setState(() => _isMakingFriend = true);
|
|
||||||
try {
|
|
||||||
await _relationshipProvider
|
|
||||||
.makeFriend(widget.name);
|
|
||||||
context.showSnackbar(
|
|
||||||
'accountFriendRequestSent'.tr,
|
|
||||||
);
|
|
||||||
} catch (e) {
|
|
||||||
context.showErrorDialog(e);
|
|
||||||
} finally {
|
|
||||||
setState(() => _isMakingFriend = false);
|
|
||||||
}
|
|
||||||
},
|
|
||||||
)
|
)
|
||||||
else
|
else
|
||||||
const IconButton(
|
const IconButton(
|
||||||
@ -300,8 +325,8 @@ class _AccountProfilePageState extends State<AccountProfilePage> {
|
|||||||
physics: const NeverScrollableScrollPhysics(),
|
physics: const NeverScrollableScrollPhysics(),
|
||||||
children: [
|
children: [
|
||||||
ListView(
|
ListView(
|
||||||
|
padding: const EdgeInsets.only(top: 16, bottom: 16),
|
||||||
children: [
|
children: [
|
||||||
const Gap(16),
|
|
||||||
CenteredContainer(
|
CenteredContainer(
|
||||||
child: AccountHeadingWidget(
|
child: AccountHeadingWidget(
|
||||||
name: _userinfo!.name,
|
name: _userinfo!.name,
|
||||||
@ -421,9 +446,82 @@ class _AccountProfilePageState extends State<AccountProfilePage> {
|
|||||||
),
|
),
|
||||||
),
|
),
|
||||||
).marginOnly(
|
).marginOnly(
|
||||||
right: 24, left: 12, bottom: 8, top: 24),
|
right: 24,
|
||||||
|
left: 12,
|
||||||
|
bottom: 8,
|
||||||
|
top: 24,
|
||||||
|
),
|
||||||
)
|
)
|
||||||
],
|
],
|
||||||
|
appendWidgets: [
|
||||||
|
Card(
|
||||||
|
child: Container(
|
||||||
|
padding: const EdgeInsets.symmetric(
|
||||||
|
vertical: 4,
|
||||||
|
horizontal: 8,
|
||||||
|
),
|
||||||
|
width: double.maxFinite,
|
||||||
|
child: Wrap(
|
||||||
|
alignment: WrapAlignment.spaceAround,
|
||||||
|
children: [
|
||||||
|
TextButton.icon(
|
||||||
|
style: const ButtonStyle(
|
||||||
|
visualDensity: VisualDensity(
|
||||||
|
horizontal: -4,
|
||||||
|
vertical: -2,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
onPressed: () {
|
||||||
|
showDialog(
|
||||||
|
context: context,
|
||||||
|
builder: (context) => AbuseReportDialog(
|
||||||
|
resourceId: 'user:${_userinfo!.id}',
|
||||||
|
),
|
||||||
|
);
|
||||||
|
},
|
||||||
|
icon: const Icon(
|
||||||
|
Icons.flag,
|
||||||
|
size: 16,
|
||||||
|
),
|
||||||
|
label: Text('reportAbuse'.tr),
|
||||||
|
),
|
||||||
|
if (_relationship?.status != 2)
|
||||||
|
TextButton.icon(
|
||||||
|
style: const ButtonStyle(
|
||||||
|
visualDensity: VisualDensity(
|
||||||
|
horizontal: -4,
|
||||||
|
vertical: -2,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
onPressed:
|
||||||
|
_isMakingFriend ? null : _blockUser,
|
||||||
|
icon: const Icon(
|
||||||
|
Icons.block,
|
||||||
|
size: 16,
|
||||||
|
),
|
||||||
|
label: Text('blockUser'.tr),
|
||||||
|
)
|
||||||
|
else
|
||||||
|
TextButton.icon(
|
||||||
|
style: const ButtonStyle(
|
||||||
|
visualDensity: VisualDensity(
|
||||||
|
horizontal: -4,
|
||||||
|
vertical: -2,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
onPressed:
|
||||||
|
_isMakingFriend ? null : _unblockUser,
|
||||||
|
icon: const Icon(
|
||||||
|
Icons.add_circle_outline,
|
||||||
|
size: 16,
|
||||||
|
),
|
||||||
|
label: Text('unblockUser'.tr),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
],
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
@ -440,7 +538,7 @@ class _AccountProfilePageState extends State<AccountProfilePage> {
|
|||||||
Row(
|
Row(
|
||||||
mainAxisAlignment: MainAxisAlignment.spaceAround,
|
mainAxisAlignment: MainAxisAlignment.spaceAround,
|
||||||
children: [
|
children: [
|
||||||
_buildStatisticsEntry(
|
_StatsWidget(
|
||||||
'totalSocialCreditPoints'.tr,
|
'totalSocialCreditPoints'.tr,
|
||||||
_userinfo != null
|
_userinfo != null
|
||||||
? _userSocialCreditPoints.toString()
|
? _userSocialCreditPoints.toString()
|
||||||
@ -453,16 +551,16 @@ class _AccountProfilePageState extends State<AccountProfilePage> {
|
|||||||
mainAxisAlignment: MainAxisAlignment.spaceAround,
|
mainAxisAlignment: MainAxisAlignment.spaceAround,
|
||||||
children: [
|
children: [
|
||||||
Obx(
|
Obx(
|
||||||
() => _buildStatisticsEntry(
|
() => _StatsWidget(
|
||||||
'totalPostCount'.tr,
|
'totalPostCount'.tr,
|
||||||
_postController.postTotal.value.toString(),
|
_postController.postTotal.value.toString(),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
_buildStatisticsEntry(
|
_StatsWidget(
|
||||||
'totalUpvote'.tr,
|
'totalUpvote'.tr,
|
||||||
_totalUpvote.toString(),
|
_totalUpvote.toString(),
|
||||||
),
|
),
|
||||||
_buildStatisticsEntry(
|
_StatsWidget(
|
||||||
'totalDownvote'.tr,
|
'totalDownvote'.tr,
|
||||||
_totalDownvote.toString(),
|
_totalDownvote.toString(),
|
||||||
),
|
),
|
||||||
@ -560,3 +658,28 @@ class _AccountProfilePageState extends State<AccountProfilePage> {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
class _StatsWidget extends StatelessWidget {
|
||||||
|
final String label;
|
||||||
|
final String content;
|
||||||
|
|
||||||
|
const _StatsWidget(this.label, this.content);
|
||||||
|
|
||||||
|
@override
|
||||||
|
Widget build(BuildContext context) {
|
||||||
|
return Expanded(
|
||||||
|
child: Column(
|
||||||
|
children: [
|
||||||
|
Text(
|
||||||
|
label,
|
||||||
|
style: Theme.of(context).textTheme.bodySmall,
|
||||||
|
),
|
||||||
|
Text(
|
||||||
|
content,
|
||||||
|
style: Theme.of(context).textTheme.bodyLarge,
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:get/get.dart';
|
import 'package:get/get.dart';
|
||||||
|
import 'package:in_app_review/in_app_review.dart';
|
||||||
import 'package:provider/provider.dart';
|
import 'package:provider/provider.dart';
|
||||||
import 'package:shared_preferences/shared_preferences.dart';
|
import 'package:shared_preferences/shared_preferences.dart';
|
||||||
import 'package:solian/exceptions/request.dart';
|
import 'package:solian/exceptions/request.dart';
|
||||||
@ -205,6 +206,21 @@ class _SettingScreenState extends State<SettingScreen> {
|
|||||||
});
|
});
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
|
if (PlatformInfo.canRateTheApp)
|
||||||
|
ListTile(
|
||||||
|
leading: const Icon(Icons.star),
|
||||||
|
trailing: const Icon(Icons.chevron_right),
|
||||||
|
contentPadding: const EdgeInsets.symmetric(horizontal: 22),
|
||||||
|
title: Text('rateTheApp'.tr),
|
||||||
|
subtitle: Text('rateTheAppDesc'.tr),
|
||||||
|
onTap: () {
|
||||||
|
final inAppReview = InAppReview.instance;
|
||||||
|
|
||||||
|
inAppReview.openStoreListing(
|
||||||
|
appStoreId: '6499032345',
|
||||||
|
);
|
||||||
|
},
|
||||||
|
),
|
||||||
ListTile(
|
ListTile(
|
||||||
leading: const Icon(Icons.info_outline),
|
leading: const Icon(Icons.info_outline),
|
||||||
trailing: const Icon(Icons.chevron_right),
|
trailing: const Icon(Icons.chevron_right),
|
||||||
|
@ -23,6 +23,7 @@ class AccountHeadingWidget extends StatelessWidget {
|
|||||||
final AccountProfile? profile;
|
final AccountProfile? profile;
|
||||||
final List<AccountBadge>? badges;
|
final List<AccountBadge>? badges;
|
||||||
final List<Widget>? extraWidgets;
|
final List<Widget>? extraWidgets;
|
||||||
|
final List<Widget>? appendWidgets;
|
||||||
|
|
||||||
final Future<Response>? status;
|
final Future<Response>? status;
|
||||||
final Function? onEditStatus;
|
final Function? onEditStatus;
|
||||||
@ -39,6 +40,7 @@ class AccountHeadingWidget extends StatelessWidget {
|
|||||||
this.profile,
|
this.profile,
|
||||||
this.status,
|
this.status,
|
||||||
this.extraWidgets,
|
this.extraWidgets,
|
||||||
|
this.appendWidgets,
|
||||||
this.onEditStatus,
|
this.onEditStatus,
|
||||||
});
|
});
|
||||||
|
|
||||||
@ -257,6 +259,7 @@ class AccountHeadingWidget extends StatelessWidget {
|
|||||||
),
|
),
|
||||||
),
|
),
|
||||||
).paddingSymmetric(horizontal: 16),
|
).paddingSymmetric(horizontal: 16),
|
||||||
|
...?appendWidgets?.map((x) => x.paddingSymmetric(horizontal: 16)),
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
|
@ -106,10 +106,14 @@ class _AccountProfilePopupState extends State<AccountProfilePopup> {
|
|||||||
extraWidgets: [
|
extraWidgets: [
|
||||||
Card(
|
Card(
|
||||||
child: ListTile(
|
child: ListTile(
|
||||||
|
leading: const Icon(
|
||||||
|
Icons.contact_page_outlined,
|
||||||
|
),
|
||||||
shape: const RoundedRectangleBorder(
|
shape: const RoundedRectangleBorder(
|
||||||
borderRadius: BorderRadius.all(Radius.circular(8)),
|
borderRadius: BorderRadius.all(Radius.circular(8)),
|
||||||
),
|
),
|
||||||
title: Text('visitProfilePage'.tr),
|
title: Text('visitProfilePage'.tr),
|
||||||
|
subtitle: Text('learnMoreAboutPerson'.tr),
|
||||||
visualDensity:
|
visualDensity:
|
||||||
const VisualDensity(horizontal: -4, vertical: -2),
|
const VisualDensity(horizontal: -4, vertical: -2),
|
||||||
trailing: const Icon(Icons.chevron_right),
|
trailing: const Icon(Icons.chevron_right),
|
||||||
|
@ -28,42 +28,46 @@ class SilverRelativeList extends StatelessWidget {
|
|||||||
showModalBottomSheet(
|
showModalBottomSheet(
|
||||||
useRootNavigator: true,
|
useRootNavigator: true,
|
||||||
isScrollControlled: true,
|
isScrollControlled: true,
|
||||||
backgroundColor: Theme
|
backgroundColor: Theme.of(context).colorScheme.surface,
|
||||||
.of(context)
|
|
||||||
.colorScheme
|
|
||||||
.surface,
|
|
||||||
context: context,
|
context: context,
|
||||||
builder: (context) =>
|
builder: (context) => AccountProfilePopup(
|
||||||
AccountProfilePopup(
|
name: element.related.name,
|
||||||
name: element.related.name,
|
),
|
||||||
),
|
|
||||||
);
|
);
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
trailing: Row(
|
trailing: Row(
|
||||||
mainAxisSize: MainAxisSize.min,
|
mainAxisSize: MainAxisSize.min,
|
||||||
children: [
|
children: [
|
||||||
if(element.status != 1 && element.status != 3)
|
if (element.status != 1 && element.status != 3)
|
||||||
IconButton(
|
IconButton(
|
||||||
icon: const Icon(Icons.check),
|
icon: const Icon(Icons.check),
|
||||||
onPressed: () {
|
onPressed: () {
|
||||||
final RelationshipProvider provider = Get.find();
|
final RelationshipProvider provider = Get.find();
|
||||||
if (element.status == 0) {
|
if (element.status == 0) {
|
||||||
provider.handleRelation(element, true).then((_) => onUpdate());
|
provider
|
||||||
|
.handleRelation(element, true)
|
||||||
|
.then((_) => onUpdate());
|
||||||
} else {
|
} else {
|
||||||
provider.editRelation(element, 1).then((_) => onUpdate());
|
provider
|
||||||
|
.editRelation(element.relatedId, 1)
|
||||||
|
.then((_) => onUpdate());
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
if(element.status != 2 && element.status != 3)
|
if (element.status != 2 && element.status != 3)
|
||||||
IconButton(
|
IconButton(
|
||||||
icon: const Icon(Icons.close),
|
icon: const Icon(Icons.close),
|
||||||
onPressed: () {
|
onPressed: () {
|
||||||
final RelationshipProvider provider = Get.find();
|
final RelationshipProvider provider = Get.find();
|
||||||
if (element.status == 0) {
|
if (element.status == 0) {
|
||||||
provider.handleRelation(element, false).then((_) => onUpdate());
|
provider
|
||||||
|
.handleRelation(element, false)
|
||||||
|
.then((_) => onUpdate());
|
||||||
} else {
|
} else {
|
||||||
provider.editRelation(element, 2).then((_) => onUpdate());
|
provider
|
||||||
|
.editRelation(element.relatedId, 2)
|
||||||
|
.then((_) => onUpdate());
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
|
@ -744,8 +744,8 @@ class _AttachmentEditorPopupState extends State<AttachmentEditorPopup> {
|
|||||||
return IgnorePointer(
|
return IgnorePointer(
|
||||||
ignoring: _uploadController.isUploading.value,
|
ignoring: _uploadController.isUploading.value,
|
||||||
child: Container(
|
child: Container(
|
||||||
height: 64,
|
|
||||||
width: MediaQuery.of(context).size.width,
|
width: MediaQuery.of(context).size.width,
|
||||||
|
padding: const EdgeInsets.all(8),
|
||||||
decoration: BoxDecoration(
|
decoration: BoxDecoration(
|
||||||
border: Border(
|
border: Border(
|
||||||
top: BorderSide(
|
top: BorderSide(
|
||||||
@ -754,67 +754,72 @@ class _AttachmentEditorPopupState extends State<AttachmentEditorPopup> {
|
|||||||
),
|
),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
child: SingleChildScrollView(
|
child: Wrap(
|
||||||
scrollDirection: Axis.horizontal,
|
spacing: 8,
|
||||||
child: Wrap(
|
runSpacing: 8,
|
||||||
spacing: 8,
|
alignment: WrapAlignment.center,
|
||||||
runSpacing: 0,
|
runAlignment: WrapAlignment.center,
|
||||||
alignment: WrapAlignment.center,
|
children: [
|
||||||
runAlignment: WrapAlignment.center,
|
if ((PlatformInfo.isDesktop ||
|
||||||
children: [
|
PlatformInfo.isIOS ||
|
||||||
if ((PlatformInfo.isDesktop ||
|
PlatformInfo.isWeb) &&
|
||||||
PlatformInfo.isIOS ||
|
!widget.imageOnly)
|
||||||
PlatformInfo.isWeb) &&
|
IconButton(
|
||||||
!widget.imageOnly)
|
icon: const Icon(Icons.paste),
|
||||||
ElevatedButton.icon(
|
tooltip: 'attachmentAddClipboard'.tr,
|
||||||
icon: const Icon(Icons.paste),
|
|
||||||
label: Text('attachmentAddClipboard'.tr),
|
|
||||||
style: const ButtonStyle(visualDensity: density),
|
|
||||||
onPressed: () => _pasteFileToUpload(),
|
|
||||||
),
|
|
||||||
ElevatedButton.icon(
|
|
||||||
icon: const Icon(Icons.add_photo_alternate),
|
|
||||||
label: Text('attachmentAddGalleryPhoto'.tr),
|
|
||||||
style: const ButtonStyle(visualDensity: density),
|
style: const ButtonStyle(visualDensity: density),
|
||||||
onPressed: () => _pickPhotoToUpload(),
|
color: Theme.of(context).colorScheme.primary,
|
||||||
|
onPressed: () => _pasteFileToUpload(),
|
||||||
),
|
),
|
||||||
if (!widget.imageOnly)
|
IconButton(
|
||||||
ElevatedButton.icon(
|
icon: const Icon(Icons.add_photo_alternate),
|
||||||
icon: const Icon(Icons.add_road),
|
tooltip: 'attachmentAddGalleryPhoto'.tr,
|
||||||
label: Text('attachmentAddGalleryVideo'.tr),
|
style: const ButtonStyle(visualDensity: density),
|
||||||
style: const ButtonStyle(visualDensity: density),
|
color: Theme.of(context).colorScheme.primary,
|
||||||
onPressed: () => _pickVideoToUpload(),
|
onPressed: () => _pickPhotoToUpload(),
|
||||||
),
|
),
|
||||||
ElevatedButton.icon(
|
if (!widget.imageOnly)
|
||||||
icon: const Icon(Icons.photo_camera_back),
|
IconButton(
|
||||||
label: Text('attachmentAddCameraPhoto'.tr),
|
icon: const Icon(Icons.add_road),
|
||||||
|
tooltip: 'attachmentAddGalleryVideo'.tr,
|
||||||
style: const ButtonStyle(visualDensity: density),
|
style: const ButtonStyle(visualDensity: density),
|
||||||
|
color: Theme.of(context).colorScheme.primary,
|
||||||
|
onPressed: () => _pickVideoToUpload(),
|
||||||
|
),
|
||||||
|
if (PlatformInfo.isMobile)
|
||||||
|
IconButton(
|
||||||
|
icon: const Icon(Icons.photo_camera_back),
|
||||||
|
tooltip: 'attachmentAddCameraPhoto'.tr,
|
||||||
|
style: const ButtonStyle(visualDensity: density),
|
||||||
|
color: Theme.of(context).colorScheme.primary,
|
||||||
onPressed: () => _takeMediaToUpload(false),
|
onPressed: () => _takeMediaToUpload(false),
|
||||||
),
|
),
|
||||||
if (!widget.imageOnly)
|
if (!widget.imageOnly && PlatformInfo.isMobile)
|
||||||
ElevatedButton.icon(
|
IconButton(
|
||||||
icon: const Icon(Icons.video_camera_back_outlined),
|
icon: const Icon(Icons.video_camera_back_outlined),
|
||||||
label: Text('attachmentAddCameraVideo'.tr),
|
tooltip: 'attachmentAddCameraVideo'.tr,
|
||||||
style: const ButtonStyle(visualDensity: density),
|
style: const ButtonStyle(visualDensity: density),
|
||||||
onPressed: () => _takeMediaToUpload(true),
|
color: Theme.of(context).colorScheme.primary,
|
||||||
),
|
onPressed: () => _takeMediaToUpload(true),
|
||||||
if (!widget.imageOnly)
|
),
|
||||||
ElevatedButton.icon(
|
if (!widget.imageOnly)
|
||||||
icon: const Icon(Icons.file_present_rounded),
|
IconButton(
|
||||||
label: Text('attachmentAddFile'.tr),
|
icon: const Icon(Icons.file_present_rounded),
|
||||||
style: const ButtonStyle(visualDensity: density),
|
tooltip: 'attachmentAddFile'.tr,
|
||||||
onPressed: () => _pickFileToUpload(),
|
style: const ButtonStyle(visualDensity: density),
|
||||||
),
|
color: Theme.of(context).colorScheme.primary,
|
||||||
if (!widget.imageOnly)
|
onPressed: () => _pickFileToUpload(),
|
||||||
ElevatedButton.icon(
|
),
|
||||||
icon: const Icon(Icons.link),
|
if (!widget.imageOnly)
|
||||||
label: Text('attachmentAddFile'.tr),
|
IconButton(
|
||||||
style: const ButtonStyle(visualDensity: density),
|
icon: const Icon(Icons.link),
|
||||||
onPressed: () => _linkAttachments(),
|
tooltip: 'attachmentAddLink'.tr,
|
||||||
),
|
style: const ButtonStyle(visualDensity: density),
|
||||||
],
|
color: Theme.of(context).colorScheme.primary,
|
||||||
).paddingSymmetric(horizontal: 12),
|
onPressed: () => _linkAttachments(),
|
||||||
),
|
),
|
||||||
|
],
|
||||||
|
).paddingSymmetric(horizontal: 12),
|
||||||
)
|
)
|
||||||
.animate(
|
.animate(
|
||||||
target: _uploadController.isUploading.value ? 0 : 1,
|
target: _uploadController.isUploading.value ? 0 : 1,
|
||||||
|
@ -17,6 +17,7 @@ import flutter_local_notifications
|
|||||||
import flutter_secure_storage_macos
|
import flutter_secure_storage_macos
|
||||||
import flutter_webrtc
|
import flutter_webrtc
|
||||||
import gal
|
import gal
|
||||||
|
import in_app_review
|
||||||
import livekit_client
|
import livekit_client
|
||||||
import macos_window_utils
|
import macos_window_utils
|
||||||
import media_kit_libs_macos_video
|
import media_kit_libs_macos_video
|
||||||
@ -46,6 +47,7 @@ func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) {
|
|||||||
FlutterSecureStoragePlugin.register(with: registry.registrar(forPlugin: "FlutterSecureStoragePlugin"))
|
FlutterSecureStoragePlugin.register(with: registry.registrar(forPlugin: "FlutterSecureStoragePlugin"))
|
||||||
FlutterWebRTCPlugin.register(with: registry.registrar(forPlugin: "FlutterWebRTCPlugin"))
|
FlutterWebRTCPlugin.register(with: registry.registrar(forPlugin: "FlutterWebRTCPlugin"))
|
||||||
GalPlugin.register(with: registry.registrar(forPlugin: "GalPlugin"))
|
GalPlugin.register(with: registry.registrar(forPlugin: "GalPlugin"))
|
||||||
|
InAppReviewPlugin.register(with: registry.registrar(forPlugin: "InAppReviewPlugin"))
|
||||||
LiveKitPlugin.register(with: registry.registrar(forPlugin: "LiveKitPlugin"))
|
LiveKitPlugin.register(with: registry.registrar(forPlugin: "LiveKitPlugin"))
|
||||||
MacOSWindowUtilsPlugin.register(with: registry.registrar(forPlugin: "MacOSWindowUtilsPlugin"))
|
MacOSWindowUtilsPlugin.register(with: registry.registrar(forPlugin: "MacOSWindowUtilsPlugin"))
|
||||||
MediaKitLibsMacosVideoPlugin.register(with: registry.registrar(forPlugin: "MediaKitLibsMacosVideoPlugin"))
|
MediaKitLibsMacosVideoPlugin.register(with: registry.registrar(forPlugin: "MediaKitLibsMacosVideoPlugin"))
|
||||||
|
@ -158,6 +158,8 @@ PODS:
|
|||||||
- GoogleUtilities/UserDefaults (8.0.2):
|
- GoogleUtilities/UserDefaults (8.0.2):
|
||||||
- GoogleUtilities/Logger
|
- GoogleUtilities/Logger
|
||||||
- GoogleUtilities/Privacy
|
- GoogleUtilities/Privacy
|
||||||
|
- in_app_review (0.2.0):
|
||||||
|
- FlutterMacOS
|
||||||
- livekit_client (2.2.6):
|
- livekit_client (2.2.6):
|
||||||
- FlutterMacOS
|
- FlutterMacOS
|
||||||
- WebRTC-SDK (= 125.6422.04)
|
- WebRTC-SDK (= 125.6422.04)
|
||||||
@ -234,6 +236,7 @@ DEPENDENCIES:
|
|||||||
- flutter_webrtc (from `Flutter/ephemeral/.symlinks/plugins/flutter_webrtc/macos`)
|
- flutter_webrtc (from `Flutter/ephemeral/.symlinks/plugins/flutter_webrtc/macos`)
|
||||||
- FlutterMacOS (from `Flutter/ephemeral`)
|
- FlutterMacOS (from `Flutter/ephemeral`)
|
||||||
- gal (from `Flutter/ephemeral/.symlinks/plugins/gal/darwin`)
|
- gal (from `Flutter/ephemeral/.symlinks/plugins/gal/darwin`)
|
||||||
|
- in_app_review (from `Flutter/ephemeral/.symlinks/plugins/in_app_review/macos`)
|
||||||
- livekit_client (from `Flutter/ephemeral/.symlinks/plugins/livekit_client/macos`)
|
- livekit_client (from `Flutter/ephemeral/.symlinks/plugins/livekit_client/macos`)
|
||||||
- macos_window_utils (from `Flutter/ephemeral/.symlinks/plugins/macos_window_utils/macos`)
|
- macos_window_utils (from `Flutter/ephemeral/.symlinks/plugins/macos_window_utils/macos`)
|
||||||
- media_kit_libs_macos_video (from `Flutter/ephemeral/.symlinks/plugins/media_kit_libs_macos_video/macos`)
|
- media_kit_libs_macos_video (from `Flutter/ephemeral/.symlinks/plugins/media_kit_libs_macos_video/macos`)
|
||||||
@ -299,6 +302,8 @@ EXTERNAL SOURCES:
|
|||||||
:path: Flutter/ephemeral
|
:path: Flutter/ephemeral
|
||||||
gal:
|
gal:
|
||||||
:path: Flutter/ephemeral/.symlinks/plugins/gal/darwin
|
:path: Flutter/ephemeral/.symlinks/plugins/gal/darwin
|
||||||
|
in_app_review:
|
||||||
|
:path: Flutter/ephemeral/.symlinks/plugins/in_app_review/macos
|
||||||
livekit_client:
|
livekit_client:
|
||||||
:path: Flutter/ephemeral/.symlinks/plugins/livekit_client/macos
|
:path: Flutter/ephemeral/.symlinks/plugins/livekit_client/macos
|
||||||
macos_window_utils:
|
macos_window_utils:
|
||||||
@ -336,7 +341,7 @@ SPEC CHECKSUMS:
|
|||||||
connectivity_plus: ddd7f30999e1faaef5967c23d5b6d503d10434db
|
connectivity_plus: ddd7f30999e1faaef5967c23d5b6d503d10434db
|
||||||
desktop_drop: 69eeff437544aa619c8db7f4481b3a65f7696898
|
desktop_drop: 69eeff437544aa619c8db7f4481b3a65f7696898
|
||||||
device_info_plus: ce1b7762849d3ec103d0e0517299f2db7ad60720
|
device_info_plus: ce1b7762849d3ec103d0e0517299f2db7ad60720
|
||||||
file_selector_macos: 54fdab7caa3ac3fc43c9fac4d7d8d231277f8cf2
|
file_selector_macos: cc3858c981fe6889f364731200d6232dac1d812d
|
||||||
Firebase: 9f574c08c2396885b5e7e100ed4293d956218af9
|
Firebase: 9f574c08c2396885b5e7e100ed4293d956218af9
|
||||||
firebase_analytics: a2d0d907566e4a48e27745317f05b4b7db85edd9
|
firebase_analytics: a2d0d907566e4a48e27745317f05b4b7db85edd9
|
||||||
firebase_core: c55630cdb8a01cf49eae741dd4bc8c93bdd546b8
|
firebase_core: c55630cdb8a01cf49eae741dd4bc8c93bdd546b8
|
||||||
@ -359,6 +364,7 @@ SPEC CHECKSUMS:
|
|||||||
GoogleAppMeasurement: 6e49ffac7d3f2c3ded9cc663f912a13b67bbd0de
|
GoogleAppMeasurement: 6e49ffac7d3f2c3ded9cc663f912a13b67bbd0de
|
||||||
GoogleDataTransport: aae35b7ea0c09004c3797d53c8c41f66f219d6a7
|
GoogleDataTransport: aae35b7ea0c09004c3797d53c8c41f66f219d6a7
|
||||||
GoogleUtilities: 26a3abef001b6533cf678d3eb38fd3f614b7872d
|
GoogleUtilities: 26a3abef001b6533cf678d3eb38fd3f614b7872d
|
||||||
|
in_app_review: a850789fad746e89bce03d4aeee8078b45a53fd0
|
||||||
livekit_client: 98d09566e3a936b3402be8091ec3845556d36800
|
livekit_client: 98d09566e3a936b3402be8091ec3845556d36800
|
||||||
macos_window_utils: 933f91f64805e2eb91a5bd057cf97cd097276663
|
macos_window_utils: 933f91f64805e2eb91a5bd057cf97cd097276663
|
||||||
media_kit_libs_macos_video: b3e2bbec2eef97c285f2b1baa7963c67c753fb82
|
media_kit_libs_macos_video: b3e2bbec2eef97c285f2b1baa7963c67c753fb82
|
||||||
@ -377,7 +383,7 @@ SPEC CHECKSUMS:
|
|||||||
sqflite: 673a0e54cc04b7d6dba8d24fb8095b31c3a99eec
|
sqflite: 673a0e54cc04b7d6dba8d24fb8095b31c3a99eec
|
||||||
sqlite3: 0bb0e6389d824e40296f531b858a2a0b71c0d2fb
|
sqlite3: 0bb0e6389d824e40296f531b858a2a0b71c0d2fb
|
||||||
sqlite3_flutter_libs: 5ca46c1a04eddfbeeb5b16566164aa7ad1616e7b
|
sqlite3_flutter_libs: 5ca46c1a04eddfbeeb5b16566164aa7ad1616e7b
|
||||||
url_launcher_macos: 5f437abeda8c85500ceb03f5c1938a8c5a705399
|
url_launcher_macos: c82c93949963e55b228a30115bd219499a6fe404
|
||||||
wakelock_plus: 4783562c9a43d209c458cb9b30692134af456269
|
wakelock_plus: 4783562c9a43d209c458cb9b30692134af456269
|
||||||
WebRTC-SDK: c3d69a87e7185fad3568f6f3cff7c9ac5890acf3
|
WebRTC-SDK: c3d69a87e7185fad3568f6f3cff7c9ac5890acf3
|
||||||
|
|
||||||
|
@ -12,8 +12,6 @@
|
|||||||
<true/>
|
<true/>
|
||||||
<key>com.apple.security.device.audio-input</key>
|
<key>com.apple.security.device.audio-input</key>
|
||||||
<true/>
|
<true/>
|
||||||
<key>com.apple.security.device.bluetooth</key>
|
|
||||||
<true/>
|
|
||||||
<key>com.apple.security.device.camera</key>
|
<key>com.apple.security.device.camera</key>
|
||||||
<true/>
|
<true/>
|
||||||
<key>com.apple.security.files.user-selected.read-only</key>
|
<key>com.apple.security.files.user-selected.read-only</key>
|
||||||
|
@ -47,6 +47,11 @@
|
|||||||
<string>MainMenu</string>
|
<string>MainMenu</string>
|
||||||
<key>NSPrincipalClass</key>
|
<key>NSPrincipalClass</key>
|
||||||
<string>NSApplication</string>
|
<string>NSApplication</string>
|
||||||
|
<key>CFBundleLocalizations</key>
|
||||||
|
<array>
|
||||||
|
<string>zh_CN</string>
|
||||||
|
<string>en</string>
|
||||||
|
</array>
|
||||||
<key>NSUserActivityTypes</key>
|
<key>NSUserActivityTypes</key>
|
||||||
<array>
|
<array>
|
||||||
<string>INStartCallIntent</string>
|
<string>INStartCallIntent</string>
|
||||||
|
@ -10,8 +10,6 @@
|
|||||||
<true/>
|
<true/>
|
||||||
<key>com.apple.security.device.audio-input</key>
|
<key>com.apple.security.device.audio-input</key>
|
||||||
<true/>
|
<true/>
|
||||||
<key>com.apple.security.device.bluetooth</key>
|
|
||||||
<true/>
|
|
||||||
<key>com.apple.security.device.camera</key>
|
<key>com.apple.security.device.camera</key>
|
||||||
<true/>
|
<true/>
|
||||||
<key>com.apple.security.files.user-selected.read-only</key>
|
<key>com.apple.security.files.user-selected.read-only</key>
|
||||||
|
24
pubspec.lock
24
pubspec.lock
@ -474,10 +474,10 @@ packages:
|
|||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: file_selector_macos
|
name: file_selector_macos
|
||||||
sha256: f42eacb83b318e183b1ae24eead1373ab1334084404c8c16e0354f9a3e55d385
|
sha256: cb284e267f8e2a45a904b5c094d2ba51d0aabfc20b1538ab786d9ef7dc2bf75c
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "0.9.4"
|
version: "0.9.4+1"
|
||||||
file_selector_platform_interface:
|
file_selector_platform_interface:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
@ -1125,6 +1125,22 @@ packages:
|
|||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "0.2.1+1"
|
version: "0.2.1+1"
|
||||||
|
in_app_review:
|
||||||
|
dependency: "direct main"
|
||||||
|
description:
|
||||||
|
name: in_app_review
|
||||||
|
sha256: "99869244d09adc76af16bf8fd731dd13cef58ecafd5917847589c49f378cbb30"
|
||||||
|
url: "https://pub.dev"
|
||||||
|
source: hosted
|
||||||
|
version: "2.0.9"
|
||||||
|
in_app_review_platform_interface:
|
||||||
|
dependency: transitive
|
||||||
|
description:
|
||||||
|
name: in_app_review_platform_interface
|
||||||
|
sha256: fed2c755f2125caa9ae10495a3c163aa7fab5af3585a9c62ef4a6920c5b45f10
|
||||||
|
url: "https://pub.dev"
|
||||||
|
source: hosted
|
||||||
|
version: "2.0.5"
|
||||||
infinite_scroll_pagination:
|
infinite_scroll_pagination:
|
||||||
dependency: "direct main"
|
dependency: "direct main"
|
||||||
description:
|
description:
|
||||||
@ -2078,10 +2094,10 @@ packages:
|
|||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: url_launcher_macos
|
name: url_launcher_macos
|
||||||
sha256: "9a1a42d5d2d95400c795b2914c36fdcb525870c752569438e4ebb09a2b5d90de"
|
sha256: "769549c999acdb42b8bcfa7c43d72bf79a382ca7441ab18a808e101149daf672"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "3.2.0"
|
version: "3.2.1"
|
||||||
url_launcher_platform_interface:
|
url_launcher_platform_interface:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
|
@ -2,7 +2,7 @@ name: solian
|
|||||||
description: "The Solar Network App"
|
description: "The Solar Network App"
|
||||||
publish_to: "none"
|
publish_to: "none"
|
||||||
|
|
||||||
version: 1.2.3+2
|
version: 1.2.5+1
|
||||||
|
|
||||||
environment:
|
environment:
|
||||||
sdk: ">=3.3.4 <4.0.0"
|
sdk: ">=3.3.4 <4.0.0"
|
||||||
@ -83,6 +83,7 @@ dependencies:
|
|||||||
flutter_app_update: ^3.1.0
|
flutter_app_update: ^3.1.0
|
||||||
version: ^3.0.2
|
version: ^3.0.2
|
||||||
action_slider: ^0.7.0
|
action_slider: ^0.7.0
|
||||||
|
in_app_review: ^2.0.9
|
||||||
|
|
||||||
dev_dependencies:
|
dev_dependencies:
|
||||||
flutter_test:
|
flutter_test:
|
||||||
|
Reference in New Issue
Block a user