🍱 Update app icon for v1.2.0
@ -7,6 +7,9 @@
|
|||||||
|
|
||||||
# The following line activates a set of recommended lints for Flutter apps,
|
# The following line activates a set of recommended lints for Flutter apps,
|
||||||
# packages, and plugins designed to encourage good coding practices.
|
# packages, and plugins designed to encourage good coding practices.
|
||||||
|
analyzer:
|
||||||
|
errors:
|
||||||
|
use_build_context_synchronously: ignore
|
||||||
include: package:flutter_lints/flutter.yaml
|
include: package:flutter_lints/flutter.yaml
|
||||||
|
|
||||||
linter:
|
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 */ = {
|
730D64942C4AC4D0005A1975 /* Debug */ = {
|
||||||
isa = XCBuildConfiguration;
|
isa = XCBuildConfiguration;
|
||||||
buildSettings = {
|
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_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
|
||||||
CLANG_CXX_LANGUAGE_STANDARD = "gnu++20";
|
CLANG_CXX_LANGUAGE_STANDARD = "gnu++20";
|
||||||
CLANG_ENABLE_OBJC_WEAK = YES;
|
CLANG_ENABLE_OBJC_WEAK = YES;
|
||||||
@ -694,7 +694,7 @@
|
|||||||
730D64952C4AC4D0005A1975 /* Release */ = {
|
730D64952C4AC4D0005A1975 /* Release */ = {
|
||||||
isa = XCBuildConfiguration;
|
isa = XCBuildConfiguration;
|
||||||
buildSettings = {
|
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_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
|
||||||
CLANG_CXX_LANGUAGE_STANDARD = "gnu++20";
|
CLANG_CXX_LANGUAGE_STANDARD = "gnu++20";
|
||||||
CLANG_ENABLE_OBJC_WEAK = YES;
|
CLANG_ENABLE_OBJC_WEAK = YES;
|
||||||
@ -731,7 +731,7 @@
|
|||||||
730D64962C4AC4D0005A1975 /* Profile */ = {
|
730D64962C4AC4D0005A1975 /* Profile */ = {
|
||||||
isa = XCBuildConfiguration;
|
isa = XCBuildConfiguration;
|
||||||
buildSettings = {
|
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_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
|
||||||
CLANG_CXX_LANGUAGE_STANDARD = "gnu++20";
|
CLANG_CXX_LANGUAGE_STANDARD = "gnu++20";
|
||||||
CLANG_ENABLE_OBJC_WEAK = YES;
|
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,
|
int id,
|
||||||
String alt,
|
String alt,
|
||||||
String usage, {
|
String usage, {
|
||||||
double? ratio,
|
|
||||||
bool isMature = false,
|
bool isMature = false,
|
||||||
}) async {
|
}) async {
|
||||||
final AuthProvider auth = Get.find();
|
final AuthProvider auth = Get.find();
|
||||||
@ -92,9 +91,6 @@ class AttachmentProvider extends GetConnect {
|
|||||||
final client = auth.configureClient('files');
|
final client = auth.configureClient('files');
|
||||||
|
|
||||||
var resp = await client.put('/attachments/$id', {
|
var resp = await client.put('/attachments/$id', {
|
||||||
'metadata': {
|
|
||||||
if (ratio != null) 'ratio': ratio,
|
|
||||||
},
|
|
||||||
'alt': alt,
|
'alt': alt,
|
||||||
'usage': usage,
|
'usage': usage,
|
||||||
'is_mature': isMature,
|
'is_mature': isMature,
|
||||||
|
@ -137,7 +137,7 @@ class PostCreatePopup extends StatelessWidget {
|
|||||||
final List<dynamic> actionList = [
|
final List<dynamic> actionList = [
|
||||||
(
|
(
|
||||||
icon: const Icon(Icons.edit_square),
|
icon: const Icon(Icons.edit_square),
|
||||||
label: 'postEditor'.tr,
|
label: 'postEditorModeStory'.tr,
|
||||||
onTap: () {
|
onTap: () {
|
||||||
Navigator.pop(context);
|
Navigator.pop(context);
|
||||||
AppRouter.instance.pushNamed('postEditor').then((val) {
|
AppRouter.instance.pushNamed('postEditor').then((val) {
|
||||||
|
@ -134,7 +134,7 @@ class _PostPublishScreenState extends State<PostPublishScreen> {
|
|||||||
child: Scaffold(
|
child: Scaffold(
|
||||||
appBar: AppBar(
|
appBar: AppBar(
|
||||||
leading: AppBarLeadingButton.adaptive(context),
|
leading: AppBarLeadingButton.adaptive(context),
|
||||||
title: AppBarTitle('postPublish'.tr),
|
title: AppBarTitle('postEditorModeStory'.tr),
|
||||||
centerTitle: false,
|
centerTitle: false,
|
||||||
toolbarHeight: SolianTheme.toolbarHeight(context),
|
toolbarHeight: SolianTheme.toolbarHeight(context),
|
||||||
actions: [
|
actions: [
|
||||||
|
@ -32,7 +32,9 @@ abstract class SolianTheme {
|
|||||||
brightness: brightness,
|
brightness: brightness,
|
||||||
useMaterial3: true,
|
useMaterial3: true,
|
||||||
colorScheme: ColorScheme.fromSeed(
|
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 {
|
class SolianMessages extends Translations {
|
||||||
@override
|
@override
|
||||||
Map<String, Map<String, String>> get keys => {
|
Map<String, Map<String, String>> get keys => {
|
||||||
'en_US': messagesEnglish,
|
'en_US': i18nEnglish,
|
||||||
'zh_CN': simplifiedChineseMessages,
|
'zh_CN': i18nSimplifiedChinese,
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
const messagesEnglish = {
|
const i18nEnglish = {
|
||||||
'done': 'Done',
|
'done': 'Done',
|
||||||
'hide': 'Hide',
|
'hide': 'Hide',
|
||||||
'okay': 'Okay',
|
'okay': 'Okay',
|
||||||
@ -97,7 +97,9 @@ const messagesEnglish = {
|
|||||||
'postPinned': 'Pinned',
|
'postPinned': 'Pinned',
|
||||||
'postListNews': 'News',
|
'postListNews': 'News',
|
||||||
'postListShuffle': 'Random',
|
'postListShuffle': 'Random',
|
||||||
'postEditor': 'Create new post',
|
'postEditorModeStory': 'Post a post',
|
||||||
|
'postEditorModeArticle': 'Post an article',
|
||||||
|
'postEditor': 'Post editor',
|
||||||
'articleEditor': 'Create new article',
|
'articleEditor': 'Create new article',
|
||||||
'articleDetail': 'Article details',
|
'articleDetail': 'Article details',
|
||||||
'draftBoxOpen': 'Open draft box',
|
'draftBoxOpen': 'Open draft box',
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
const simplifiedChineseMessages = {
|
const i18nSimplifiedChinese = {
|
||||||
'done': '完成',
|
'done': '完成',
|
||||||
'hide': '隐藏',
|
'hide': '隐藏',
|
||||||
'okay': '确认',
|
'okay': '确认',
|
||||||
@ -89,7 +89,9 @@ const simplifiedChineseMessages = {
|
|||||||
'pinPost': '置顶本帖',
|
'pinPost': '置顶本帖',
|
||||||
'unpinPost': '取消置顶本帖',
|
'unpinPost': '取消置顶本帖',
|
||||||
'postPinned': '已置顶',
|
'postPinned': '已置顶',
|
||||||
'postEditor': '发个帖子',
|
'postEditorModeStory': '发个帖子',
|
||||||
|
'postEditorModeArticle': '撰写文章',
|
||||||
|
'postEditor': '帖子编辑器',
|
||||||
'articleEditor': '撰写文章',
|
'articleEditor': '撰写文章',
|
||||||
'articleDetail': '文章详情',
|
'articleDetail': '文章详情',
|
||||||
'draftBoxOpen': '打开草稿箱',
|
'draftBoxOpen': '打开草稿箱',
|
||||||
|
@ -108,7 +108,6 @@ class _AttachmentItemImage extends StatelessWidget {
|
|||||||
final Function? onHide;
|
final Function? onHide;
|
||||||
|
|
||||||
const _AttachmentItemImage({
|
const _AttachmentItemImage({
|
||||||
super.key,
|
|
||||||
required this.parentId,
|
required this.parentId,
|
||||||
required this.item,
|
required this.item,
|
||||||
required this.showBadge,
|
required this.showBadge,
|
||||||
@ -215,7 +214,7 @@ class _AttachmentItemImage extends StatelessWidget {
|
|||||||
class _AttachmentItemVideo extends StatefulWidget {
|
class _AttachmentItemVideo extends StatefulWidget {
|
||||||
final Attachment item;
|
final Attachment item;
|
||||||
|
|
||||||
const _AttachmentItemVideo({super.key, required this.item});
|
const _AttachmentItemVideo({required this.item});
|
||||||
|
|
||||||
@override
|
@override
|
||||||
State<_AttachmentItemVideo> createState() => _AttachmentItemVideoState();
|
State<_AttachmentItemVideo> createState() => _AttachmentItemVideoState();
|
||||||
|
@ -361,7 +361,7 @@ class _AttachmentPublishPopupState extends State<AttachmentPublishPopup> {
|
|||||||
alignment: WrapAlignment.center,
|
alignment: WrapAlignment.center,
|
||||||
runAlignment: WrapAlignment.center,
|
runAlignment: WrapAlignment.center,
|
||||||
children: [
|
children: [
|
||||||
if (PlatformInfo.isDesktop)
|
if (PlatformInfo.isDesktop || PlatformInfo.isIOS || PlatformInfo.isWeb)
|
||||||
ElevatedButton.icon(
|
ElevatedButton.icon(
|
||||||
icon: const Icon(Icons.paste),
|
icon: const Icon(Icons.paste),
|
||||||
label: Text('attachmentAddClipboard'.tr),
|
label: Text('attachmentAddClipboard'.tr),
|
||||||
@ -426,12 +426,10 @@ class AttachmentEditorDialog extends StatefulWidget {
|
|||||||
}
|
}
|
||||||
|
|
||||||
class _AttachmentEditorDialogState extends State<AttachmentEditorDialog> {
|
class _AttachmentEditorDialogState extends State<AttachmentEditorDialog> {
|
||||||
final _ratioController = TextEditingController();
|
|
||||||
final _altController = TextEditingController();
|
final _altController = TextEditingController();
|
||||||
|
|
||||||
bool _isBusy = false;
|
bool _isBusy = false;
|
||||||
bool _isMature = false;
|
bool _isMature = false;
|
||||||
bool _hasAspectRatio = false;
|
|
||||||
|
|
||||||
Future<Attachment?> updateAttachment() async {
|
Future<Attachment?> updateAttachment() async {
|
||||||
final AttachmentProvider provider = Get.find();
|
final AttachmentProvider provider = Get.find();
|
||||||
@ -442,9 +440,6 @@ class _AttachmentEditorDialogState extends State<AttachmentEditorDialog> {
|
|||||||
widget.item.id,
|
widget.item.id,
|
||||||
_altController.value.text,
|
_altController.value.text,
|
||||||
widget.item.usage,
|
widget.item.usage,
|
||||||
ratio: _hasAspectRatio
|
|
||||||
? (double.tryParse(_ratioController.value.text) ?? 1)
|
|
||||||
: null,
|
|
||||||
isMature: _isMature,
|
isMature: _isMature,
|
||||||
);
|
);
|
||||||
|
|
||||||
@ -476,13 +471,6 @@ class _AttachmentEditorDialogState extends State<AttachmentEditorDialog> {
|
|||||||
void syncWidget() {
|
void syncWidget() {
|
||||||
_isMature = widget.item.isMature;
|
_isMature = widget.item.isMature;
|
||||||
_altController.text = widget.item.alt;
|
_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
|
@override
|
||||||
@ -517,61 +505,6 @@ class _AttachmentEditorDialogState extends State<AttachmentEditorDialog> {
|
|||||||
onTapOutside: (_) =>
|
onTapOutside: (_) =>
|
||||||
FocusManager.instance.primaryFocus?.unfocus(),
|
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(
|
Card(
|
||||||
child: CheckboxListTile(
|
child: CheckboxListTile(
|
||||||
shape: const RoundedRectangleBorder(
|
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"
|
description: "The Solar Network App"
|
||||||
publish_to: "none"
|
publish_to: "none"
|
||||||
|
|
||||||
version: 1.2.0
|
version: 1.2.0+1
|
||||||
|
|
||||||
environment:
|
environment:
|
||||||
sdk: ">=3.3.4 <4.0.0"
|
sdk: ">=3.3.4 <4.0.0"
|
||||||
@ -83,16 +83,16 @@ flutter_launcher_icons:
|
|||||||
min_sdk_android: 21
|
min_sdk_android: 21
|
||||||
web:
|
web:
|
||||||
generate: true
|
generate: true
|
||||||
image_path: "assets/icon-padded.png"
|
image_path: "assets/icon-w-shadow.png"
|
||||||
background_color: "#ffffff"
|
background_color: "#ffffff"
|
||||||
theme_color: "#4b5094"
|
theme_color: "#4b5094"
|
||||||
windows:
|
windows:
|
||||||
generate: true
|
generate: true
|
||||||
image_path: "assets/icon-padded.png"
|
image_path: "assets/icon-w-shadow.png"
|
||||||
icon_size: 256
|
icon_size: 256
|
||||||
macos:
|
macos:
|
||||||
generate: true
|
generate: true
|
||||||
image_path: "assets/icon-padded.png"
|
image_path: "assets/icon-w-shadow.png"
|
||||||
|
|
||||||
msix_config:
|
msix_config:
|
||||||
protocol_activation: solink
|
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 |