diff --git a/README.md b/README.md index 696d46da..45aa32dc 100644 --- a/README.md +++ b/README.md @@ -10,128 +10,196 @@ A [Hacker News](https://news.ycombinator.com/) client built with Flutter. [](https://apps.apple.com/us/app/hacki/id1602043763?platform=iphone) [](https://play.google.com/store/apps/details?id=com.jiaqifeng.hacki&hl=en_US&gl=US) [](https://f-droid.org/en/packages/com.jiaqifeng.hacki/) - -Features: -- Log in using your Hacker News account. -- Browse stories from various categories. -- Search for stories. -- Submit stories. -- Pin stories. -- Mark stories as favorite. -- Leave comments. -- Collapse comments. -- View parent comments without scrolling up. -- View and participate in polls. -- Browse comments and stories you have posted. -- Vote on comments or stories. -- Get in-app notification when there is new reply to your stories or comments. -- Download stories and comments for offline reading. -- Pick up where you left off. -- Synced favorites and pins across devices. (iOS only) -- Export or import your favorites. -- Launch from system share sheet. -- Share story or comment as image. +# Features +- Hacker News account [login](#login-reply-notification-favorites-sync-and-more) +- [Favorites sync](#login-reply-notification-favorites-sync-and-more) +- [Hacker News Search](#hacker-news-search) +- [In-thread search](#in-thread-local-and-global-search) +- [Ancestor lookup](#ancestor-lookup) so you don't have to scroll back up to regain context +- [In-thread notification for new comments](#new-comments-notification-and-lookup) since your last visit +- [In-app notification for new replies](#login-reply-notification-favorites-sync-and-more) to your comments or stories +- [Offline mode](#settings) +- Synced settings across devices (iOS only) +- [Favorites import and export](#settings) +- Open Hacker News link in Hacki via system share dialog +- [Share story or comment as image](#share-story-or-comment-as-image) +- [Reply](#reply-to-comment-or-story), vote, filter, block +- [Polls](#polls) +- [True dark mode](#true-dark-mode) +- [Tablet support](#tablet-support) +- [Accent color](#thread) and [font customization](#accent-color-and-font-customization) - And more... +## Home page and story tile customization +

+ + + + + + + + + + + + +

+ +## Thread +

+ + + + +

-# Home page and story tile customization +## New comments notification and lookup

- 01 - 07 - 03 - 09 - 06 - 02 - 08 - 04 - 05 - 10 - 10 - 10 + +

-# Thread reading experience +## In-thread local and global search +

+ + + + + + +

+

+ + + + + + +

+ +## Ancestor lookup +

+ + + + +

+

+ + + + +

-### Thread +## Share story or comment as image

- 01 - 06 - 10 - 10 + + + + + +

-### New comments notification and lookup

- 10 - 10 + + + + + +

-### In-thread search and other actions +## Reply to comment or story

- 02 - 03 - 09 - 05 - 07 - 08 - 04 - 10 + + + + +

+

+ + + +

-### Ancestor lookup +## Open comment in separate thread +

+ + + + +

- 10 - 10 - 10 - 10 - 10 - 10 - 10 - 10 + + + +

-### Story and comment sharing +# Hacker News search

- 10 - 10 - 10 - 10 - 10 - 10 - 10 - 10 + + + +

+

+ + +

# Login, reply notification, favorites sync and more

- 10 - 10 - 10 + + +

- 10 - 10 - 10 + + +

# Settings

- 10 - 10 - 10 - 10 - 10 - 10 - 10 - 10 + + + + +

+ +

+ + + +

# Accent color and font customization

- 10 - 10 - 10 - 10 + + + + +

+ +# True dark mode +

+ + + + +

+ +# Polls +

+ + + +

# Tablet support diff --git a/assets/new_screenshots/hacki_100.png b/assets/new_screenshots/hacki_100.png new file mode 100644 index 00000000..f7a46404 Binary files /dev/null and b/assets/new_screenshots/hacki_100.png differ diff --git a/assets/new_screenshots/hacki_101.png b/assets/new_screenshots/hacki_101.png new file mode 100644 index 00000000..8e930cc7 Binary files /dev/null and b/assets/new_screenshots/hacki_101.png differ diff --git a/assets/new_screenshots/hacki_102.png b/assets/new_screenshots/hacki_102.png new file mode 100644 index 00000000..1118d066 Binary files /dev/null and b/assets/new_screenshots/hacki_102.png differ diff --git a/assets/new_screenshots/hacki_103.png b/assets/new_screenshots/hacki_103.png new file mode 100644 index 00000000..7aca0ea7 Binary files /dev/null and b/assets/new_screenshots/hacki_103.png differ diff --git a/assets/new_screenshots/hacki_104.png b/assets/new_screenshots/hacki_104.png new file mode 100644 index 00000000..add728d5 Binary files /dev/null and b/assets/new_screenshots/hacki_104.png differ diff --git a/assets/new_screenshots/hacki_105.png b/assets/new_screenshots/hacki_105.png new file mode 100644 index 00000000..f2aa4edc Binary files /dev/null and b/assets/new_screenshots/hacki_105.png differ diff --git a/assets/new_screenshots/hacki_106.png b/assets/new_screenshots/hacki_106.png new file mode 100644 index 00000000..8b3a00b9 Binary files /dev/null and b/assets/new_screenshots/hacki_106.png differ diff --git a/assets/new_screenshots/hacki_107.png b/assets/new_screenshots/hacki_107.png new file mode 100644 index 00000000..84d334eb Binary files /dev/null and b/assets/new_screenshots/hacki_107.png differ diff --git a/assets/new_screenshots/hacki_108.png b/assets/new_screenshots/hacki_108.png new file mode 100644 index 00000000..7ef8ab1d Binary files /dev/null and b/assets/new_screenshots/hacki_108.png differ diff --git a/assets/new_screenshots/hacki_109.png b/assets/new_screenshots/hacki_109.png new file mode 100644 index 00000000..0f7326d6 Binary files /dev/null and b/assets/new_screenshots/hacki_109.png differ diff --git a/assets/new_screenshots/hacki_110.png b/assets/new_screenshots/hacki_110.png new file mode 100644 index 00000000..9d36a9a2 Binary files /dev/null and b/assets/new_screenshots/hacki_110.png differ diff --git a/assets/new_screenshots/hacki_111.png b/assets/new_screenshots/hacki_111.png new file mode 100644 index 00000000..e92884d8 Binary files /dev/null and b/assets/new_screenshots/hacki_111.png differ diff --git a/assets/new_screenshots/hacki_112.png b/assets/new_screenshots/hacki_112.png new file mode 100644 index 00000000..59b4b6c0 Binary files /dev/null and b/assets/new_screenshots/hacki_112.png differ diff --git a/assets/new_screenshots/hacki_113.png b/assets/new_screenshots/hacki_113.png new file mode 100644 index 00000000..f7115c04 Binary files /dev/null and b/assets/new_screenshots/hacki_113.png differ diff --git a/assets/new_screenshots/hacki_114.png b/assets/new_screenshots/hacki_114.png new file mode 100644 index 00000000..9b427886 Binary files /dev/null and b/assets/new_screenshots/hacki_114.png differ diff --git a/assets/new_screenshots/hacki_115.png b/assets/new_screenshots/hacki_115.png new file mode 100644 index 00000000..b5728816 Binary files /dev/null and b/assets/new_screenshots/hacki_115.png differ diff --git a/assets/new_screenshots/hacki_116.png b/assets/new_screenshots/hacki_116.png new file mode 100644 index 00000000..686abf5a Binary files /dev/null and b/assets/new_screenshots/hacki_116.png differ diff --git a/assets/new_screenshots/hacki_117.png b/assets/new_screenshots/hacki_117.png new file mode 100644 index 00000000..2efb42aa Binary files /dev/null and b/assets/new_screenshots/hacki_117.png differ diff --git a/assets/new_screenshots/hacki_118.png b/assets/new_screenshots/hacki_118.png new file mode 100644 index 00000000..443b28d7 Binary files /dev/null and b/assets/new_screenshots/hacki_118.png differ diff --git a/assets/new_screenshots/hacki_119.png b/assets/new_screenshots/hacki_119.png new file mode 100644 index 00000000..f63637f9 Binary files /dev/null and b/assets/new_screenshots/hacki_119.png differ diff --git a/assets/new_screenshots/hacki_120.png b/assets/new_screenshots/hacki_120.png new file mode 100644 index 00000000..794078ac Binary files /dev/null and b/assets/new_screenshots/hacki_120.png differ diff --git a/assets/new_screenshots/hacki_121.png b/assets/new_screenshots/hacki_121.png new file mode 100644 index 00000000..73deab1b Binary files /dev/null and b/assets/new_screenshots/hacki_121.png differ diff --git a/assets/new_screenshots/hacki_122.png b/assets/new_screenshots/hacki_122.png new file mode 100644 index 00000000..b09b375d Binary files /dev/null and b/assets/new_screenshots/hacki_122.png differ diff --git a/assets/new_screenshots/hacki_123.png b/assets/new_screenshots/hacki_123.png new file mode 100644 index 00000000..738c56e5 Binary files /dev/null and b/assets/new_screenshots/hacki_123.png differ diff --git a/assets/new_screenshots/hacki_124.png b/assets/new_screenshots/hacki_124.png new file mode 100644 index 00000000..d6fef3b0 Binary files /dev/null and b/assets/new_screenshots/hacki_124.png differ diff --git a/assets/new_screenshots/hacki_125.png b/assets/new_screenshots/hacki_125.png new file mode 100644 index 00000000..a87df16b Binary files /dev/null and b/assets/new_screenshots/hacki_125.png differ diff --git a/assets/new_screenshots/hacki_126.png b/assets/new_screenshots/hacki_126.png new file mode 100644 index 00000000..a53e39b8 Binary files /dev/null and b/assets/new_screenshots/hacki_126.png differ diff --git a/assets/new_screenshots/hacki_127.png b/assets/new_screenshots/hacki_127.png new file mode 100644 index 00000000..7f4ee98a Binary files /dev/null and b/assets/new_screenshots/hacki_127.png differ diff --git a/assets/new_screenshots/hacki_128.png b/assets/new_screenshots/hacki_128.png new file mode 100644 index 00000000..8880129f Binary files /dev/null and b/assets/new_screenshots/hacki_128.png differ diff --git a/assets/new_screenshots/hacki_129.png b/assets/new_screenshots/hacki_129.png new file mode 100644 index 00000000..238c99d9 Binary files /dev/null and b/assets/new_screenshots/hacki_129.png differ diff --git a/assets/new_screenshots/hacki_130.png b/assets/new_screenshots/hacki_130.png new file mode 100644 index 00000000..5e26c4d6 Binary files /dev/null and b/assets/new_screenshots/hacki_130.png differ diff --git a/assets/new_screenshots/hacki_131.png b/assets/new_screenshots/hacki_131.png new file mode 100644 index 00000000..677c1d90 Binary files /dev/null and b/assets/new_screenshots/hacki_131.png differ diff --git a/assets/new_screenshots/hacki_132.png b/assets/new_screenshots/hacki_132.png new file mode 100644 index 00000000..642f353f Binary files /dev/null and b/assets/new_screenshots/hacki_132.png differ diff --git a/assets/new_screenshots/hacki_133.png b/assets/new_screenshots/hacki_133.png new file mode 100644 index 00000000..e2ee474b Binary files /dev/null and b/assets/new_screenshots/hacki_133.png differ diff --git a/assets/new_screenshots/hacki_134.png b/assets/new_screenshots/hacki_134.png new file mode 100644 index 00000000..554b0d87 Binary files /dev/null and b/assets/new_screenshots/hacki_134.png differ diff --git a/assets/new_screenshots/hacki_135.png b/assets/new_screenshots/hacki_135.png new file mode 100644 index 00000000..33ed369d Binary files /dev/null and b/assets/new_screenshots/hacki_135.png differ diff --git a/assets/new_screenshots/hacki_136.png b/assets/new_screenshots/hacki_136.png new file mode 100644 index 00000000..266db0ba Binary files /dev/null and b/assets/new_screenshots/hacki_136.png differ diff --git a/assets/new_screenshots/hacki_137.png b/assets/new_screenshots/hacki_137.png new file mode 100644 index 00000000..5c2192d3 Binary files /dev/null and b/assets/new_screenshots/hacki_137.png differ diff --git a/assets/new_screenshots/hacki_138.png b/assets/new_screenshots/hacki_138.png new file mode 100644 index 00000000..e623121b Binary files /dev/null and b/assets/new_screenshots/hacki_138.png differ diff --git a/assets/new_screenshots/hacki_139.png b/assets/new_screenshots/hacki_139.png new file mode 100644 index 00000000..14372cc0 Binary files /dev/null and b/assets/new_screenshots/hacki_139.png differ diff --git a/assets/new_screenshots/hacki_140.png b/assets/new_screenshots/hacki_140.png new file mode 100644 index 00000000..b6a7a71a Binary files /dev/null and b/assets/new_screenshots/hacki_140.png differ diff --git a/assets/new_screenshots/hacki_141.png b/assets/new_screenshots/hacki_141.png new file mode 100644 index 00000000..65e9430e Binary files /dev/null and b/assets/new_screenshots/hacki_141.png differ diff --git a/assets/new_screenshots/hacki_142.png b/assets/new_screenshots/hacki_142.png new file mode 100644 index 00000000..e4d5c252 Binary files /dev/null and b/assets/new_screenshots/hacki_142.png differ diff --git a/assets/new_screenshots/hacki_143.png b/assets/new_screenshots/hacki_143.png new file mode 100644 index 00000000..b2650f9b Binary files /dev/null and b/assets/new_screenshots/hacki_143.png differ diff --git a/assets/new_screenshots/hacki_144.png b/assets/new_screenshots/hacki_144.png new file mode 100644 index 00000000..9f9303d9 Binary files /dev/null and b/assets/new_screenshots/hacki_144.png differ diff --git a/assets/new_screenshots/hacki_145.png b/assets/new_screenshots/hacki_145.png new file mode 100644 index 00000000..e1969ff2 Binary files /dev/null and b/assets/new_screenshots/hacki_145.png differ diff --git a/assets/new_screenshots/hacki_146.png b/assets/new_screenshots/hacki_146.png new file mode 100644 index 00000000..47d9a5a9 Binary files /dev/null and b/assets/new_screenshots/hacki_146.png differ diff --git a/assets/new_screenshots/hacki_147.png b/assets/new_screenshots/hacki_147.png new file mode 100644 index 00000000..58992dab Binary files /dev/null and b/assets/new_screenshots/hacki_147.png differ diff --git a/assets/new_screenshots/hacki_148.png b/assets/new_screenshots/hacki_148.png new file mode 100644 index 00000000..43e27859 Binary files /dev/null and b/assets/new_screenshots/hacki_148.png differ diff --git a/assets/new_screenshots/hacki_149.png b/assets/new_screenshots/hacki_149.png new file mode 100644 index 00000000..a413b5ba Binary files /dev/null and b/assets/new_screenshots/hacki_149.png differ diff --git a/assets/new_screenshots/hacki_150.png b/assets/new_screenshots/hacki_150.png new file mode 100644 index 00000000..f846b106 Binary files /dev/null and b/assets/new_screenshots/hacki_150.png differ diff --git a/assets/new_screenshots/hacki_91.png b/assets/new_screenshots/hacki_91.png new file mode 100644 index 00000000..cba9f45d Binary files /dev/null and b/assets/new_screenshots/hacki_91.png differ diff --git a/assets/new_screenshots/hacki_92.png b/assets/new_screenshots/hacki_92.png new file mode 100644 index 00000000..c550cbf1 Binary files /dev/null and b/assets/new_screenshots/hacki_92.png differ diff --git a/assets/new_screenshots/hacki_93.png b/assets/new_screenshots/hacki_93.png new file mode 100644 index 00000000..e7ffd0d7 Binary files /dev/null and b/assets/new_screenshots/hacki_93.png differ diff --git a/assets/new_screenshots/hacki_94.png b/assets/new_screenshots/hacki_94.png new file mode 100644 index 00000000..f01919c9 Binary files /dev/null and b/assets/new_screenshots/hacki_94.png differ diff --git a/assets/new_screenshots/hacki_95.png b/assets/new_screenshots/hacki_95.png new file mode 100644 index 00000000..57884977 Binary files /dev/null and b/assets/new_screenshots/hacki_95.png differ diff --git a/assets/new_screenshots/hacki_96.png b/assets/new_screenshots/hacki_96.png new file mode 100644 index 00000000..f24778c7 Binary files /dev/null and b/assets/new_screenshots/hacki_96.png differ diff --git a/assets/new_screenshots/hacki_97.png b/assets/new_screenshots/hacki_97.png new file mode 100644 index 00000000..e140e9b2 Binary files /dev/null and b/assets/new_screenshots/hacki_97.png differ diff --git a/assets/new_screenshots/hacki_98.png b/assets/new_screenshots/hacki_98.png new file mode 100644 index 00000000..0c58cad9 Binary files /dev/null and b/assets/new_screenshots/hacki_98.png differ diff --git a/assets/new_screenshots/hacki_99.png b/assets/new_screenshots/hacki_99.png new file mode 100644 index 00000000..ef844d76 Binary files /dev/null and b/assets/new_screenshots/hacki_99.png differ diff --git a/lib/screens/item/item_screen.dart b/lib/screens/item/item_screen.dart index 371a9bfc..53edaaf5 100644 --- a/lib/screens/item/item_screen.dart +++ b/lib/screens/item/item_screen.dart @@ -310,6 +310,7 @@ class _ItemScreenState extends State rect, parent: item, onSearchInThreadTapped: () { + context.pop(); context.read() ..search(item.by) ..openInThreadSearch?.call(); @@ -418,6 +419,7 @@ class _ItemScreenState extends State rect, parent: widget.item, onSearchInThreadTapped: () { + context.pop(); context.read() ..search(item.by) ..openInThreadSearch?.call(); diff --git a/lib/screens/item/widgets/item_screen_background.dart b/lib/screens/item/widgets/item_screen_background.dart index adc73ec6..b483589c 100644 --- a/lib/screens/item/widgets/item_screen_background.dart +++ b/lib/screens/item/widgets/item_screen_background.dart @@ -38,7 +38,7 @@ class _ItemScreenBackgroundState extends State { unawaited( Future.delayed( - AppDurations.oneAndHalfSeconds, + AppDurations.oneSecond, () { if (mounted) { setState(() { diff --git a/lib/screens/item/widgets/main_view.dart b/lib/screens/item/widgets/main_view.dart index f38d8935..e118657f 100644 --- a/lib/screens/item/widgets/main_view.dart +++ b/lib/screens/item/widgets/main_view.dart @@ -474,6 +474,7 @@ class _ParentItemSection extends StatelessWidget { child: Padding( padding: const EdgeInsets.only( left: Dimens.pt8, + bottom: Dimens.pt8, ), child: ItemText( item: item, @@ -488,20 +489,18 @@ class _ParentItemSection extends StatelessWidget { ); }, ), - if (item is Story && item.isPoll) + if (item is Story && item.isPoll) ...[ BlocProvider( create: (BuildContext context) => PollCubit(story: item)..init(), child: const PollView(), ), + SizedBoxes.pt6, + ], ], ), ), ), - if (item.text.isNotEmpty) - const SizedBox( - height: Dimens.pt8, - ), const Divider( height: Dimens.zero, ), diff --git a/lib/screens/item/widgets/poll_view.dart b/lib/screens/item/widgets/poll_view.dart index 5102ec8b..ba7a1701 100644 --- a/lib/screens/item/widgets/poll_view.dart +++ b/lib/screens/item/widgets/poll_view.dart @@ -23,9 +23,6 @@ class _PollViewState extends State with ItemActionMixin { builder: (BuildContext context, PollState state) { return Column( children: [ - const SizedBox( - height: Dimens.pt24, - ), if (state.status == Status.inProgress) ...[ const LinearProgressIndicator(), const SizedBox( diff --git a/lib/screens/item/widgets/reply_box.dart b/lib/screens/item/widgets/reply_box.dart index 0176b8a1..d835e22f 100644 --- a/lib/screens/item/widgets/reply_box.dart +++ b/lib/screens/item/widgets/reply_box.dart @@ -122,7 +122,7 @@ class _ReplyBoxState extends State with ItemActionMixin { ), if (!isLoading) ...[ ...[ - if (replyingTo != null) + if (replyingTo != null && replyingTo is Comment) AnimatedOpacity( opacity: expanded ? NumSwitch.on : NumSwitch.off, diff --git a/pubspec.yaml b/pubspec.yaml index 29922107..aa9a6010 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,6 +1,6 @@ name: hacki description: A Hacker News client. -version: 3.5.2+352 +version: 3.6.0+360 publish_to: none environment: