Skip to content

Commit

Permalink
Close #288 add community page (#289)
Browse files Browse the repository at this point in the history
  • Loading branch information
theachoem authored Mar 1, 2025
1 parent f094445 commit 1c55539
Show file tree
Hide file tree
Showing 33 changed files with 413 additions and 202 deletions.
Binary file added assets/images/reddit_logo_500x500.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
10 changes: 7 additions & 3 deletions bin/localization/data.csv

Large diffs are not rendered by default.

2 changes: 1 addition & 1 deletion lib/core/databases/models/story_db_model.g.dart

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

7 changes: 7 additions & 0 deletions lib/core/services/remote_config/remote_config_service.dart
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ part './remote_config_object.dart';
class RemoteConfigService {
final List<_RemoteConfigObject> _registeredKeys = [
communityUrl,
faqUrl,
localizationSupportUrl,
policyPrivacyUrl,
sourceCodeUrl,
Expand Down Expand Up @@ -36,6 +37,12 @@ class RemoteConfigService {
'https://www.reddit.com/r/StoryPad',
);

static const faqUrl = _RemoteConfigObject<String>(
'FAQ_URL',
_RemoteConfigValueType.string,
'https://storypad.juniorise.com',
);

static const localizationSupportUrl = _RemoteConfigObject<String>(
'LOCALIZATION_SUPPORT_URL',
_RemoteConfigValueType.string,
Expand Down
12 changes: 12 additions & 0 deletions lib/gen/assets.gen.dart

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

59 changes: 59 additions & 0 deletions lib/views/community/community_content.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
part of 'community_view.dart';

class _CommunityContent extends StatelessWidget {
const _CommunityContent(this.viewModel);

final CommunityViewModel viewModel;

@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text(tr('page.community.title')),
),
body: ListView(
children: [
SizedBox(height: 8.0),
CommunityCard(),
SizedBox(height: 12.0),
ListTile(
leading: Icon(Icons.question_mark_outlined),
title: Text(tr("list_tile.faq.title")),
onTap: () => UrlOpenerService.openInCustomTab(context, RemoteConfigService.faqUrl.get()),
),
ListTile(
leading: Icon(Icons.policy_outlined),
title: Text(tr("list_tile.privacy_policy.title")),
onTap: () => UrlOpenerService.openInCustomTab(context, RemoteConfigService.policyPrivacyUrl.get()),
),
Divider(),
ListTile(
leading: Icon(Icons.code),
title: Text(tr("list_tile.source_code.title")),
subtitle: Text(kPackageInfo.version),
onTap: () => UrlOpenerService.openInCustomTab(context, RemoteConfigService.sourceCodeUrl.get()),
),
ListTile(
leading: Icon(MdiIcons.license),
title: Text(tr("list_tile.licenses.title")),
onTap: () {
AnalyticsService.instance.logLicenseView();
showLicensePage(
context: context,
applicationName: kPackageInfo.appName,
applicationLegalese: '©${DateTime.now().year}',
applicationVersion: "${kPackageInfo.version}+${kPackageInfo.buildNumber}",
);
},
),
Divider(),
ListTile(
leading: Icon(Icons.star_border),
title: Text(tr("list_tile.rate.title")),
onTap: () => AppStoreOpenerService.call(),
),
],
),
);
}
}
41 changes: 41 additions & 0 deletions lib/views/community/community_view.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
import 'package:easy_localization/easy_localization.dart';
import 'package:material_design_icons_flutter/material_design_icons_flutter.dart' show MdiIcons;
import 'package:storypad/core/constants/app_constants.dart';
import 'package:storypad/core/services/analytics_service.dart';
import 'package:storypad/core/services/app_store_opener_service.dart' show AppStoreOpenerService;
import 'package:storypad/core/services/remote_config/remote_config_service.dart';
import 'package:storypad/core/services/url_opener_service.dart';
import 'package:storypad/views/community/local_widgets/community_card.dart';
import 'package:storypad/widgets/view/view_model_provider.dart';
import 'package:flutter/material.dart';
import 'package:storypad/routes/base_route.dart';

import 'community_view_model.dart';

part 'community_content.dart';

class CommunityRoute extends BaseRoute {
CommunityRoute();

@override
Widget buildPage(BuildContext context) => CommunityView(params: this);
}

class CommunityView extends StatelessWidget {
const CommunityView({
super.key,
required this.params,
});

final CommunityRoute params;

@override
Widget build(BuildContext context) {
return ViewModelProvider<CommunityViewModel>(
create: (context) => CommunityViewModel(params: params),
builder: (context, viewModel, child) {
return _CommunityContent(viewModel);
},
);
}
}
10 changes: 10 additions & 0 deletions lib/views/community/community_view_model.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
import 'package:storypad/widgets/view/base_view_model.dart';
import 'community_view.dart';

class CommunityViewModel extends BaseViewModel {
final CommunityRoute params;

CommunityViewModel({
required this.params,
});
}
75 changes: 75 additions & 0 deletions lib/views/community/local_widgets/community_card.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,75 @@
import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/material.dart';
import 'package:storypad/core/services/remote_config/remote_config_service.dart';
import 'package:storypad/core/services/url_opener_service.dart';
import 'package:storypad/gen/assets.gen.dart';
import 'package:storypad/widgets/sp_fade_in.dart';
import 'package:storypad/widgets/sp_tap_effect.dart';

class CommunityCard extends StatelessWidget {
const CommunityCard({
super.key,
});

@override
Widget build(BuildContext context) {
return SpTapEffect(
effects: [SpTapEffectType.scaleDown],
onTap: () => UrlOpenerService.openInCustomTab(
context,
RemoteConfigService.communityUrl.get(),
prefersDeepLink: true,
),
child: Container(
width: double.infinity,
margin: EdgeInsets.symmetric(horizontal: 16.0),
clipBehavior: Clip.hardEdge,
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(8.0),
color: Theme.of(context).colorScheme.tertiaryContainer,
),
child: Stack(
children: [
Positioned(
right: 16,
bottom: 16,
child: SpFadeIn.bound(
delay: Durations.medium1,
child: Assets.images.redditLogo500x500.image(
height: 64,
width: 64,
fit: BoxFit.fitHeight,
),
),
),
Container(
padding: EdgeInsets.symmetric(horizontal: 16.0, vertical: 16.0),
margin: EdgeInsets.only(right: 72),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(
tr('list_tile.join_reddit.title'),
style: TextTheme.of(context)
.titleMedium
?.copyWith(color: Theme.of(context).colorScheme.tertiary, fontWeight: FontWeight.bold),
),
Text(
tr('list_tile.join_reddit.message'),
style: TextTheme.of(context).bodyMedium?.copyWith(color: Theme.of(context).colorScheme.tertiary),
),
SizedBox(height: 12.0),
],
),
),
Positioned(
top: 16.0,
right: 16.0,
child: Icon(Icons.keyboard_arrow_right),
),
],
),
),
);
}
}
11 changes: 2 additions & 9 deletions lib/views/home/home_view.dart
Original file line number Diff line number Diff line change
@@ -1,23 +1,18 @@
import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/foundation.dart';
import 'package:lottie/lottie.dart';
import 'package:material_design_icons_flutter/material_design_icons_flutter.dart';
import 'package:provider/provider.dart';
import 'package:storypad/app_theme.dart';
import 'package:storypad/core/constants/app_constants.dart';
import 'package:storypad/core/constants/locale_constants.dart';
import 'package:storypad/views/languages/languages_view.dart';
import 'package:storypad/views/home/local_widgets/community_tile.dart' show CommunityTile;
import 'package:storypad/views/home/local_widgets/language_tile.dart';
import 'package:storypad/widgets/view/view_model_provider.dart';
import 'package:flutter/material.dart';
import 'package:storypad/core/databases/models/story_db_model.dart';
import 'package:storypad/core/extensions/color_scheme_extension.dart';
import 'package:storypad/core/objects/search_filter_object.dart';
import 'package:storypad/core/services/analytics_service.dart';
import 'package:storypad/core/services/app_store_opener_service.dart';
import 'package:storypad/core/services/date_format_service.dart';
import 'package:storypad/core/services/google_drive/google_drive_service.dart';
import 'package:storypad/core/services/remote_config/remote_config_service.dart';
import 'package:storypad/core/services/url_opener_service.dart';
import 'package:storypad/core/types/path_type.dart';
import 'package:storypad/providers/in_app_update_provider.dart';
import 'package:storypad/providers/backup_provider.dart';
Expand All @@ -36,7 +31,6 @@ import 'package:storypad/widgets/sp_fade_in.dart';
import 'package:storypad/widgets/sp_loop_animation_builder.dart';
import 'package:storypad/widgets/sp_measure_size.dart';
import 'package:storypad/widgets/sp_nested_navigation.dart';
import 'package:storypad/widgets/sp_pop_up_menu_button.dart';
import 'package:storypad/widgets/sp_tap_effect.dart';
import 'package:storypad/widgets/story_list/story_list_timeline_verticle_divider.dart';
import 'package:storypad/widgets/story_list/story_listener_builder.dart';
Expand All @@ -54,7 +48,6 @@ part 'local_widgets/home_app_bar_nickname.dart';
part 'local_widgets/home_app_bar_message.dart';
part 'local_widgets/home_empty.dart';
part 'local_widgets/app_update_floating_button.dart';
part 'local_widgets/more_options_button.dart';

class HomeView extends StatelessWidget {
const HomeView({super.key});
Expand Down
49 changes: 49 additions & 0 deletions lib/views/home/local_widgets/community_tile.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/material.dart';
import 'package:storypad/core/extensions/color_scheme_extension.dart';
import 'package:storypad/views/community/community_view.dart';

class CommunityTile extends StatelessWidget {
const CommunityTile({
super.key,
});

@override
Widget build(BuildContext context) {
return ListTile(
leading: const Icon(Icons.forum_outlined),
title: RichText(
textScaler: MediaQuery.textScalerOf(context),
text: TextSpan(
style: Theme.of(context).textTheme.bodyLarge,
text: "${tr("page.community.title")} ",
children: [
WidgetSpan(
child: Material(
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(4.0),
side: BorderSide(
color: ColorScheme.of(context).bootstrap.info.color,
),
),
child: Padding(
padding: EdgeInsets.symmetric(
horizontal: MediaQuery.textScalerOf(context).scale(6),
vertical: MediaQuery.textScalerOf(context).scale(1),
),
child: Text(
tr('general.new'),
style: TextTheme.of(context).labelMedium?.copyWith(color: ColorScheme.of(context).onSurface),
),
),
),
)
],
),
),
onTap: () async {
CommunityRoute().push(context);
},
);
}
}
Loading

0 comments on commit 1c55539

Please sign in to comment.