Compare commits

..

No commits in common. "dad869967ea464f45ccd485f9ac24b34a62083fa" and "a97c3bce3a6d360c5efd32b027a3f286146b0272" have entirely different histories.

5 changed files with 68 additions and 98 deletions

View File

@ -246,15 +246,34 @@ class _ExploreScreenState extends State<ExploreScreen> {
onFetchData: _fetchPosts, onFetchData: _fetchPosts,
itemBuilder: (context, idx) { itemBuilder: (context, idx) {
return Center( return Center(
child: OpenablePostItem( child: OpenContainer(
data: _posts[idx], closedBuilder: (_, __) => Container(
maxWidth: 640, constraints: const BoxConstraints(maxWidth: 640),
onChanged: (data) { child: PostItem(
setState(() => _posts[idx] = data); data: _posts[idx],
}, maxWidth: 640,
onDeleted: () { onChanged: (data) {
_refreshPosts(); setState(() => _posts[idx] = data);
}, },
onDeleted: () {
_refreshPosts();
},
),
),
openBuilder: (_, close) => PostDetailScreen(
slug: _posts[idx].id.toString(),
preload: _posts[idx],
onBack: close,
),
openColor: Colors.transparent,
openElevation: 0,
transitionType: ContainerTransitionType.fade,
closedColor: Theme.of(context).colorScheme.surfaceContainerLow.withOpacity(
cfg.prefs.getBool(kAppBackgroundStoreKey) == true ? 0.75 : 1,
),
closedShape: const RoundedRectangleBorder(
borderRadius: BorderRadius.all(Radius.circular(16)),
),
), ),
); );
}, },

View File

@ -134,7 +134,7 @@ class _PostSearchScreenState extends State<PostSearchScreen> {
body: Stack( body: Stack(
children: [ children: [
InfiniteList( InfiniteList(
padding: const EdgeInsets.only(top: 100 + 8), padding: const EdgeInsets.only(top: 100),
itemCount: _posts.length, itemCount: _posts.length,
isLoading: _isBusy, isLoading: _isBusy,
hasReachedMax: _postCount != null && _posts.length >= _postCount!, hasReachedMax: _postCount != null && _posts.length >= _postCount!,
@ -142,18 +142,27 @@ class _PostSearchScreenState extends State<PostSearchScreen> {
_fetchPosts(); _fetchPosts();
}, },
itemBuilder: (context, idx) { itemBuilder: (context, idx) {
return OpenablePostItem( return GestureDetector(
data: _posts[idx], child: PostItem(
maxWidth: 640, data: _posts[idx],
onChanged: (data) { maxWidth: 640,
setState(() => _posts[idx] = data); onChanged: (data) {
}, setState(() => _posts[idx] = data);
onDeleted: () { },
_refreshPosts(); onDeleted: () {
_refreshPosts();
},
),
onTap: () {
GoRouter.of(context).pushNamed(
'postDetail',
pathParameters: {'slug': _posts[idx].id.toString()},
extra: _posts[idx],
);
}, },
); );
}, },
separatorBuilder: (_, __) => const Gap(8), separatorBuilder: (context, index) => const Divider(height: 1),
), ),
Positioned( Positioned(
top: 16, top: 16,

View File

@ -287,8 +287,8 @@ class _PostPublisherScreenState extends State<PostPublisherScreen> with SingleTi
Theme( Theme(
data: Theme.of(context).copyWith( data: Theme.of(context).copyWith(
appBarTheme: Theme.of(context).appBarTheme.copyWith( appBarTheme: Theme.of(context).appBarTheme.copyWith(
foregroundColor: Colors.white, foregroundColor: Colors.white,
), ),
), ),
child: SliverAppBar( child: SliverAppBar(
expandedHeight: _appBarHeight, expandedHeight: _appBarHeight,
@ -597,16 +597,25 @@ class _PublisherPostList extends StatelessWidget {
hasReachedMax: postCount != null && posts.length >= postCount!, hasReachedMax: postCount != null && posts.length >= postCount!,
onFetchData: fetchPosts, onFetchData: fetchPosts,
itemBuilder: (context, idx) { itemBuilder: (context, idx) {
return OpenablePostItem( return GestureDetector(
data: posts[idx], child: PostItem(
maxWidth: 640, data: posts[idx],
onChanged: (data) { maxWidth: 640,
onChanged(idx, data); onChanged: (data) {
onChanged(idx, data);
},
onDeleted: onDeleted,
),
onTap: () {
GoRouter.of(context).pushNamed(
'postDetail',
pathParameters: {'slug': posts[idx].id.toString()},
extra: posts[idx],
);
}, },
onDeleted: onDeleted,
); );
}, },
separatorBuilder: (_, __) => const Gap(8), separatorBuilder: (context, index) => const Divider(height: 1),
); );
} }
} }

View File

@ -1,7 +1,6 @@
import 'dart:io'; import 'dart:io';
import 'dart:math' as math; import 'dart:math' as math;
import 'package:animations/animations.dart';
import 'package:dio/dio.dart'; import 'package:dio/dio.dart';
import 'package:easy_localization/easy_localization.dart'; import 'package:easy_localization/easy_localization.dart';
import 'package:file_saver/file_saver.dart'; import 'package:file_saver/file_saver.dart';
@ -23,7 +22,6 @@ import 'package:styled_widget/styled_widget.dart';
import 'package:surface/providers/config.dart'; import 'package:surface/providers/config.dart';
import 'package:surface/providers/sn_network.dart'; import 'package:surface/providers/sn_network.dart';
import 'package:surface/providers/userinfo.dart'; import 'package:surface/providers/userinfo.dart';
import 'package:surface/screens/post/post_detail.dart';
import 'package:surface/types/attachment.dart'; import 'package:surface/types/attachment.dart';
import 'package:surface/types/post.dart'; import 'package:surface/types/post.dart';
import 'package:surface/types/reaction.dart'; import 'package:surface/types/reaction.dart';
@ -40,65 +38,6 @@ import 'package:surface/widgets/post/publisher_popover.dart';
import 'package:surface/widgets/universal_image.dart'; import 'package:surface/widgets/universal_image.dart';
import 'package:xml/xml.dart'; import 'package:xml/xml.dart';
class OpenablePostItem extends StatelessWidget {
final SnPost data;
final bool showReactions;
final bool showComments;
final bool showMenu;
final bool showFullPost;
final double? maxWidth;
final Function(SnPost data)? onChanged;
final Function()? onDeleted;
final Function()? onSelectAnswer;
const OpenablePostItem({
super.key,
required this.data,
this.showReactions = true,
this.showComments = true,
this.showMenu = true,
this.showFullPost = false,
this.maxWidth,
this.onChanged,
this.onDeleted,
this.onSelectAnswer,
});
@override
Widget build(BuildContext context) {
final cfg = context.read<ConfigProvider>();
return OpenContainer(
closedBuilder: (_, __) => Container(
constraints: BoxConstraints(maxWidth: maxWidth ?? double.infinity),
child: PostItem(
data: data,
maxWidth: maxWidth,
showComments: showComments,
showFullPost: showFullPost,
onChanged: onChanged,
onDeleted: onDeleted,
onSelectAnswer: onSelectAnswer,
),
),
openBuilder: (_, close) => PostDetailScreen(
slug: data.id.toString(),
preload: data,
onBack: close,
),
openColor: Colors.transparent,
openElevation: 0,
transitionType: ContainerTransitionType.fade,
closedColor: Theme.of(context).colorScheme.surfaceContainerLow.withOpacity(
cfg.prefs.getBool(kAppBackgroundStoreKey) == true ? 0.75 : 1,
),
closedShape: const RoundedRectangleBorder(
borderRadius: BorderRadius.all(Radius.circular(16)),
),
);
}
}
class PostItem extends StatelessWidget { class PostItem extends StatelessWidget {
final SnPost data; final SnPost data;
final bool showReactions; final bool showReactions;
@ -1444,14 +1383,8 @@ class _PostGetInsightPopupState extends State<_PostGetInsightPopup> {
receiveTimeout: const Duration(minutes: 10), receiveTimeout: const Duration(minutes: 10),
)); ));
final out = resp.data['response'] as String; final out = resp.data['response'] as String;
final document = XmlDocument.parse(out);
try { _thinkingProcess = document.getElement('think')?.innerText.trim();
final document = XmlDocument.parse(out);
_thinkingProcess = document.getElement('think')?.innerText.trim();
} catch (_) {
// ignore
}
RegExp cleanThinkingRegExp = RegExp(r'<think>[\s\S]*?</think>'); RegExp cleanThinkingRegExp = RegExp(r'<think>[\s\S]*?</think>');
setState(() => _response = out.replaceAll(cleanThinkingRegExp, '').trim()); setState(() => _response = out.replaceAll(cleanThinkingRegExp, '').trim());
} catch (err) { } catch (err) {

View File

@ -16,7 +16,7 @@ publish_to: "none" # Remove this line if you wish to publish to pub.dev
# https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html # https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html
# In Windows, build-name is used as the major, minor, and patch parts # In Windows, build-name is used as the major, minor, and patch parts
# of the product and file versions while build-number is used as the build suffix. # of the product and file versions while build-number is used as the build suffix.
version: 2.3.2+64 version: 2.3.2+63
environment: environment:
sdk: ^3.5.4 sdk: ^3.5.4