🍱 Update app icon for v1.2.0
| @@ -7,6 +7,9 @@ | ||||
|  | ||||
| # The following line activates a set of recommended lints for Flutter apps, | ||||
| # packages, and plugins designed to encourage good coding practices. | ||||
| analyzer: | ||||
|   errors: | ||||
|     use_build_context_synchronously: ignore | ||||
| include: package:flutter_lints/flutter.yaml | ||||
|  | ||||
| linter: | ||||
|   | ||||
| Before Width: | Height: | Size: 2.4 KiB After Width: | Height: | Size: 3.0 KiB | 
| Before Width: | Height: | Size: 1.5 KiB After Width: | Height: | Size: 1.9 KiB | 
| Before Width: | Height: | Size: 3.3 KiB After Width: | Height: | Size: 4.1 KiB | 
| Before Width: | Height: | Size: 5.0 KiB After Width: | Height: | Size: 6.3 KiB | 
| Before Width: | Height: | Size: 6.8 KiB After Width: | Height: | Size: 8.5 KiB | 
| Before Width: | Height: | Size: 537 KiB | 
							
								
								
									
										
											BIN
										
									
								
								assets/icon-w-shadow.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 574 KiB | 
							
								
								
									
										
											BIN
										
									
								
								assets/icon.png
									
									
									
									
									
								
							
							
						
						| Before Width: | Height: | Size: 53 KiB After Width: | Height: | Size: 62 KiB | 
							
								
								
									
										
											BIN
										
									
								
								assets/logo.png
									
									
									
									
									
								
							
							
						
						| Before Width: | Height: | Size: 61 KiB After Width: | Height: | Size: 80 KiB | 
| @@ -654,7 +654,7 @@ | ||||
| 		730D64942C4AC4D0005A1975 /* Debug */ = { | ||||
| 			isa = XCBuildConfiguration; | ||||
| 			buildSettings = { | ||||
| 				ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; | ||||
| 				ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = AppIcon; | ||||
| 				CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; | ||||
| 				CLANG_CXX_LANGUAGE_STANDARD = "gnu++20"; | ||||
| 				CLANG_ENABLE_OBJC_WEAK = YES; | ||||
| @@ -694,7 +694,7 @@ | ||||
| 		730D64952C4AC4D0005A1975 /* Release */ = { | ||||
| 			isa = XCBuildConfiguration; | ||||
| 			buildSettings = { | ||||
| 				ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; | ||||
| 				ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = AppIcon; | ||||
| 				CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; | ||||
| 				CLANG_CXX_LANGUAGE_STANDARD = "gnu++20"; | ||||
| 				CLANG_ENABLE_OBJC_WEAK = YES; | ||||
| @@ -731,7 +731,7 @@ | ||||
| 		730D64962C4AC4D0005A1975 /* Profile */ = { | ||||
| 			isa = XCBuildConfiguration; | ||||
| 			buildSettings = { | ||||
| 				ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; | ||||
| 				ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = AppIcon; | ||||
| 				CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; | ||||
| 				CLANG_CXX_LANGUAGE_STANDARD = "gnu++20"; | ||||
| 				CLANG_ENABLE_OBJC_WEAK = YES; | ||||
|   | ||||
| Before Width: | Height: | Size: 42 KiB After Width: | Height: | Size: 52 KiB | 
| Before Width: | Height: | Size: 575 B After Width: | Height: | Size: 641 B | 
| Before Width: | Height: | Size: 1.3 KiB After Width: | Height: | Size: 1.5 KiB | 
| Before Width: | Height: | Size: 2.0 KiB After Width: | Height: | Size: 2.5 KiB | 
| Before Width: | Height: | Size: 868 B After Width: | Height: | Size: 1.1 KiB | 
| Before Width: | Height: | Size: 1.9 KiB After Width: | Height: | Size: 2.4 KiB | 
| Before Width: | Height: | Size: 3.0 KiB After Width: | Height: | Size: 3.8 KiB | 
| Before Width: | Height: | Size: 1.3 KiB After Width: | Height: | Size: 1.5 KiB | 
| Before Width: | Height: | Size: 2.7 KiB After Width: | Height: | Size: 3.4 KiB | 
| Before Width: | Height: | Size: 4.2 KiB After Width: | Height: | Size: 5.2 KiB | 
| Before Width: | Height: | Size: 1.6 KiB After Width: | Height: | Size: 2.0 KiB | 
| Before Width: | Height: | Size: 3.5 KiB After Width: | Height: | Size: 4.3 KiB | 
| Before Width: | Height: | Size: 1.8 KiB After Width: | Height: | Size: 2.4 KiB | 
| Before Width: | Height: | Size: 3.9 KiB After Width: | Height: | Size: 4.9 KiB | 
| Before Width: | Height: | Size: 4.2 KiB After Width: | Height: | Size: 5.2 KiB | 
| Before Width: | Height: | Size: 6.4 KiB After Width: | Height: | Size: 8.0 KiB | 
| Before Width: | Height: | Size: 2.4 KiB After Width: | Height: | Size: 3.0 KiB | 
| Before Width: | Height: | Size: 5.0 KiB After Width: | Height: | Size: 6.3 KiB | 
| Before Width: | Height: | Size: 2.6 KiB After Width: | Height: | Size: 3.3 KiB | 
| Before Width: | Height: | Size: 5.3 KiB After Width: | Height: | Size: 6.7 KiB | 
| Before Width: | Height: | Size: 5.9 KiB After Width: | Height: | Size: 7.4 KiB | 
| @@ -83,7 +83,6 @@ class AttachmentProvider extends GetConnect { | ||||
|     int id, | ||||
|     String alt, | ||||
|     String usage, { | ||||
|     double? ratio, | ||||
|     bool isMature = false, | ||||
|   }) async { | ||||
|     final AuthProvider auth = Get.find(); | ||||
| @@ -92,9 +91,6 @@ class AttachmentProvider extends GetConnect { | ||||
|     final client = auth.configureClient('files'); | ||||
|  | ||||
|     var resp = await client.put('/attachments/$id', { | ||||
|       'metadata': { | ||||
|         if (ratio != null) 'ratio': ratio, | ||||
|       }, | ||||
|       'alt': alt, | ||||
|       'usage': usage, | ||||
|       'is_mature': isMature, | ||||
|   | ||||
| @@ -137,7 +137,7 @@ class PostCreatePopup extends StatelessWidget { | ||||
|     final List<dynamic> actionList = [ | ||||
|       ( | ||||
|         icon: const Icon(Icons.edit_square), | ||||
|         label: 'postEditor'.tr, | ||||
|         label: 'postEditorModeStory'.tr, | ||||
|         onTap: () { | ||||
|           Navigator.pop(context); | ||||
|           AppRouter.instance.pushNamed('postEditor').then((val) { | ||||
|   | ||||
| @@ -134,7 +134,7 @@ class _PostPublishScreenState extends State<PostPublishScreen> { | ||||
|       child: Scaffold( | ||||
|         appBar: AppBar( | ||||
|           leading: AppBarLeadingButton.adaptive(context), | ||||
|           title: AppBarTitle('postPublish'.tr), | ||||
|           title: AppBarTitle('postEditorModeStory'.tr), | ||||
|           centerTitle: false, | ||||
|           toolbarHeight: SolianTheme.toolbarHeight(context), | ||||
|           actions: [ | ||||
|   | ||||
| @@ -32,7 +32,9 @@ abstract class SolianTheme { | ||||
|       brightness: brightness, | ||||
|       useMaterial3: true, | ||||
|       colorScheme: ColorScheme.fromSeed( | ||||
|           brightness: brightness, seedColor: Colors.indigo), | ||||
|         brightness: brightness, | ||||
|         seedColor: const Color.fromRGBO(103, 96, 193, 1), | ||||
|       ), | ||||
|     ); | ||||
|   } | ||||
| } | ||||
|   | ||||
| @@ -5,7 +5,7 @@ import 'package:solian/translations/zh_cn.dart'; | ||||
| class SolianMessages extends Translations { | ||||
|   @override | ||||
|   Map<String, Map<String, String>> get keys => { | ||||
|         'en_US': messagesEnglish, | ||||
|         'zh_CN': simplifiedChineseMessages, | ||||
|         'en_US': i18nEnglish, | ||||
|         'zh_CN': i18nSimplifiedChinese, | ||||
|       }; | ||||
| } | ||||
|   | ||||
| @@ -1,4 +1,4 @@ | ||||
| const messagesEnglish = { | ||||
| const i18nEnglish = { | ||||
|   'done': 'Done', | ||||
|   'hide': 'Hide', | ||||
|   'okay': 'Okay', | ||||
| @@ -97,7 +97,9 @@ const messagesEnglish = { | ||||
|   'postPinned': 'Pinned', | ||||
|   'postListNews': 'News', | ||||
|   'postListShuffle': 'Random', | ||||
|   'postEditor': 'Create new post', | ||||
|   'postEditorModeStory': 'Post a post', | ||||
|   'postEditorModeArticle': 'Post an article', | ||||
|   'postEditor': 'Post editor', | ||||
|   'articleEditor': 'Create new article', | ||||
|   'articleDetail': 'Article details', | ||||
|   'draftBoxOpen': 'Open draft box', | ||||
|   | ||||
| @@ -1,4 +1,4 @@ | ||||
| const simplifiedChineseMessages = { | ||||
| const i18nSimplifiedChinese = { | ||||
|   'done': '完成', | ||||
|   'hide': '隐藏', | ||||
|   'okay': '确认', | ||||
| @@ -89,7 +89,9 @@ const simplifiedChineseMessages = { | ||||
|   'pinPost': '置顶本帖', | ||||
|   'unpinPost': '取消置顶本帖', | ||||
|   'postPinned': '已置顶', | ||||
|   'postEditor': '发个帖子', | ||||
|   'postEditorModeStory': '发个帖子', | ||||
|   'postEditorModeArticle': '撰写文章', | ||||
|   'postEditor': '帖子编辑器', | ||||
|   'articleEditor': '撰写文章', | ||||
|   'articleDetail': '文章详情', | ||||
|   'draftBoxOpen': '打开草稿箱', | ||||
|   | ||||
| @@ -108,7 +108,6 @@ class _AttachmentItemImage extends StatelessWidget { | ||||
|   final Function? onHide; | ||||
|  | ||||
|   const _AttachmentItemImage({ | ||||
|     super.key, | ||||
|     required this.parentId, | ||||
|     required this.item, | ||||
|     required this.showBadge, | ||||
| @@ -215,7 +214,7 @@ class _AttachmentItemImage extends StatelessWidget { | ||||
| class _AttachmentItemVideo extends StatefulWidget { | ||||
|   final Attachment item; | ||||
|  | ||||
|   const _AttachmentItemVideo({super.key, required this.item}); | ||||
|   const _AttachmentItemVideo({required this.item}); | ||||
|  | ||||
|   @override | ||||
|   State<_AttachmentItemVideo> createState() => _AttachmentItemVideoState(); | ||||
|   | ||||
| @@ -361,7 +361,7 @@ class _AttachmentPublishPopupState extends State<AttachmentPublishPopup> { | ||||
|                     alignment: WrapAlignment.center, | ||||
|                     runAlignment: WrapAlignment.center, | ||||
|                     children: [ | ||||
|                       if (PlatformInfo.isDesktop) | ||||
|                       if (PlatformInfo.isDesktop || PlatformInfo.isIOS || PlatformInfo.isWeb) | ||||
|                         ElevatedButton.icon( | ||||
|                           icon: const Icon(Icons.paste), | ||||
|                           label: Text('attachmentAddClipboard'.tr), | ||||
| @@ -426,12 +426,10 @@ class AttachmentEditorDialog extends StatefulWidget { | ||||
| } | ||||
|  | ||||
| class _AttachmentEditorDialogState extends State<AttachmentEditorDialog> { | ||||
|   final _ratioController = TextEditingController(); | ||||
|   final _altController = TextEditingController(); | ||||
|  | ||||
|   bool _isBusy = false; | ||||
|   bool _isMature = false; | ||||
|   bool _hasAspectRatio = false; | ||||
|  | ||||
|   Future<Attachment?> updateAttachment() async { | ||||
|     final AttachmentProvider provider = Get.find(); | ||||
| @@ -442,9 +440,6 @@ class _AttachmentEditorDialogState extends State<AttachmentEditorDialog> { | ||||
|         widget.item.id, | ||||
|         _altController.value.text, | ||||
|         widget.item.usage, | ||||
|         ratio: _hasAspectRatio | ||||
|             ? (double.tryParse(_ratioController.value.text) ?? 1) | ||||
|             : null, | ||||
|         isMature: _isMature, | ||||
|       ); | ||||
|  | ||||
| @@ -476,13 +471,6 @@ class _AttachmentEditorDialogState extends State<AttachmentEditorDialog> { | ||||
|   void syncWidget() { | ||||
|     _isMature = widget.item.isMature; | ||||
|     _altController.text = widget.item.alt; | ||||
|  | ||||
|     if (['image', 'video'] | ||||
|         .contains(widget.item.mimetype.split('/').firstOrNull)) { | ||||
|       _ratioController.text = | ||||
|           widget.item.metadata?['ratio']?.toString() ?? 1.toString(); | ||||
|       _hasAspectRatio = true; | ||||
|     } | ||||
|   } | ||||
|  | ||||
|   @override | ||||
| @@ -517,61 +505,6 @@ class _AttachmentEditorDialogState extends State<AttachmentEditorDialog> { | ||||
|               onTapOutside: (_) => | ||||
|                   FocusManager.instance.primaryFocus?.unfocus(), | ||||
|             ), | ||||
|             const SizedBox(height: 16), | ||||
|             TextField( | ||||
|               readOnly: !_hasAspectRatio, | ||||
|               controller: _ratioController, | ||||
|               decoration: InputDecoration( | ||||
|                 isDense: true, | ||||
|                 prefixIcon: const Icon(Icons.aspect_ratio), | ||||
|                 border: const OutlineInputBorder(), | ||||
|                 labelText: 'aspectRatio'.tr, | ||||
|               ), | ||||
|               onTapOutside: (_) => | ||||
|                   FocusManager.instance.primaryFocus?.unfocus(), | ||||
|             ), | ||||
|             const SizedBox(height: 5), | ||||
|             SingleChildScrollView( | ||||
|               scrollDirection: Axis.horizontal, | ||||
|               child: Wrap( | ||||
|                 spacing: 6, | ||||
|                 runSpacing: 0, | ||||
|                 children: [ | ||||
|                   ActionChip( | ||||
|                     avatar: Icon(Icons.square_rounded, | ||||
|                         color: Theme.of(context).colorScheme.onSurfaceVariant), | ||||
|                     label: Text('aspectRatioSquare'.tr), | ||||
|                     onPressed: () { | ||||
|                       if (_hasAspectRatio) { | ||||
|                         setState(() => _ratioController.text = '1'); | ||||
|                       } | ||||
|                     }, | ||||
|                   ), | ||||
|                   ActionChip( | ||||
|                     avatar: Icon(Icons.portrait, | ||||
|                         color: Theme.of(context).colorScheme.onSurfaceVariant), | ||||
|                     label: Text('aspectRatioPortrait'.tr), | ||||
|                     onPressed: () { | ||||
|                       if (_hasAspectRatio) { | ||||
|                         setState( | ||||
|                             () => _ratioController.text = (9 / 16).toString()); | ||||
|                       } | ||||
|                     }, | ||||
|                   ), | ||||
|                   ActionChip( | ||||
|                     avatar: Icon(Icons.landscape, | ||||
|                         color: Theme.of(context).colorScheme.onSurfaceVariant), | ||||
|                     label: Text('aspectRatioLandscape'.tr), | ||||
|                     onPressed: () { | ||||
|                       if (_hasAspectRatio) { | ||||
|                         setState( | ||||
|                             () => _ratioController.text = (16 / 9).toString()); | ||||
|                       } | ||||
|                     }, | ||||
|                   ), | ||||
|                 ], | ||||
|               ), | ||||
|             ), | ||||
|             Card( | ||||
|               child: CheckboxListTile( | ||||
|                 shape: const RoundedRectangleBorder( | ||||
|   | ||||
| Before Width: | Height: | Size: 160 KiB After Width: | Height: | Size: 176 KiB | 
| Before Width: | Height: | Size: 8.0 KiB After Width: | Height: | Size: 7.7 KiB | 
| Before Width: | Height: | Size: 1.5 KiB After Width: | Height: | Size: 589 B | 
| Before Width: | Height: | Size: 19 KiB After Width: | Height: | Size: 20 KiB | 
| Before Width: | Height: | Size: 2.3 KiB After Width: | Height: | Size: 1.4 KiB | 
| Before Width: | Height: | Size: 52 KiB After Width: | Height: | Size: 56 KiB | 
| Before Width: | Height: | Size: 4.0 KiB After Width: | Height: | Size: 3.3 KiB | 
| @@ -2,7 +2,7 @@ name: solian | ||||
| description: "The Solar Network App" | ||||
| publish_to: "none" | ||||
|  | ||||
| version: 1.2.0 | ||||
| version: 1.2.0+1 | ||||
|  | ||||
| environment: | ||||
|   sdk: ">=3.3.4 <4.0.0" | ||||
| @@ -83,16 +83,16 @@ flutter_launcher_icons: | ||||
|   min_sdk_android: 21 | ||||
|   web: | ||||
|     generate: true | ||||
|     image_path: "assets/icon-padded.png" | ||||
|     image_path: "assets/icon-w-shadow.png" | ||||
|     background_color: "#ffffff" | ||||
|     theme_color: "#4b5094" | ||||
|   windows: | ||||
|     generate: true | ||||
|     image_path: "assets/icon-padded.png" | ||||
|     image_path: "assets/icon-w-shadow.png" | ||||
|     icon_size: 256 | ||||
|   macos: | ||||
|     generate: true | ||||
|     image_path: "assets/icon-padded.png" | ||||
|     image_path: "assets/icon-w-shadow.png" | ||||
|  | ||||
| msix_config: | ||||
|   protocol_activation: solink | ||||
|   | ||||
							
								
								
									
										
											BIN
										
									
								
								web/favicon.png
									
									
									
									
									
								
							
							
						
						| Before Width: | Height: | Size: 1.5 KiB After Width: | Height: | Size: 589 B | 
| Before Width: | Height: | Size: 13 KiB After Width: | Height: | Size: 13 KiB | 
| Before Width: | Height: | Size: 52 KiB After Width: | Height: | Size: 56 KiB | 
| Before Width: | Height: | Size: 13 KiB After Width: | Height: | Size: 13 KiB | 
| Before Width: | Height: | Size: 52 KiB After Width: | Height: | Size: 56 KiB | 
| Before Width: | Height: | Size: 19 KiB After Width: | Height: | Size: 20 KiB |