Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add notification bar state for recommend premium plan #493

Merged
merged 11 commits into from
Feb 5, 2022
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
import 'package:flutter/material.dart';
import 'package:flutter_svg/flutter_svg.dart';
import 'package:pilll/analytics.dart';
import 'package:pilll/components/atoms/font.dart';
import 'package:pilll/components/atoms/text_color.dart';

class RecommendPremiumPlainInTrialNotificationBar extends StatelessWidget {
final VoidCallback onClose;
final VoidCallback onTap;
const RecommendPremiumPlainInTrialNotificationBar({
Key? key,
required this.onClose,
required this.onTap,
}) : super(key: key);

@override
Widget build(BuildContext context) {
final double _closeButtonIconWidth = 24;

return GestureDetector(
onTap: () {
analytics.logEvent(name: "tapped_recommend_premium_plan_in_trial");
onTap();
},
child: Stack(
children: [
Positioned(
top: 8,
child: GestureDetector(
child: Icon(
Icons.close,
color: Colors.white,
size: _closeButtonIconWidth,
),
onTap: () {
analytics.logEvent(
name: "closed_recommend_premium_plan_in_trial");
onClose();
},
),
),
Row(
mainAxisAlignment: MainAxisAlignment.center,
children: [
SizedBox(width: _closeButtonIconWidth),
Spacer(),
Padding(
padding: const EdgeInsets.only(top: 12, bottom: 12),
child: Text(
"\今だけ!プレミアムプランが最大48%OFF/",
style: TextColorStyle.white.merge(FontType.descriptionBold),
textAlign: TextAlign.center,
),
),
Spacer(),
Padding(
padding: const EdgeInsets.only(right: 8, left: 8),
child: SvgPicture.asset(
"images/arrow_right.svg",
color: Colors.white,
width: 16,
height: 16,
),
),
],
),
],
),
);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ import 'package:pilll/domain/premium_trial/premium_trial_modal.dart';
import 'package:pilll/domain/record/components/notification_bar/components/announce_supported_multiple_pill_sheet.dart';
import 'package:pilll/domain/record/components/notification_bar/components/discount_price_deadline.dart';
import 'package:pilll/domain/record/components/notification_bar/components/ended_pill_sheet.dart';
import 'package:pilll/domain/record/components/notification_bar/components/recommend_premium_plan_in_trial.dart';
import 'package:pilll/domain/record/components/notification_bar/notification_bar_store.dart';
import 'package:pilll/domain/record/components/notification_bar/components/premium_trial_guide.dart';
import 'package:pilll/domain/record/components/notification_bar/components/premium_trial_limit.dart';
Expand All @@ -20,6 +21,7 @@ import 'package:pilll/domain/record/components/notification_bar/components/rest_
import 'package:pilll/domain/record/record_page_state.dart';
import 'package:pilll/signin/signin_sheet.dart';
import 'package:pilll/signin/signin_sheet_state.dart';
import 'package:pilll/util/datetime/day.dart';
import 'package:pilll/util/shared_preference/keys.dart';
import 'package:shared_preferences/shared_preferences.dart';

Expand All @@ -45,6 +47,27 @@ class NotificationBar extends HookConsumerWidget {
final state = ref.watch(notificationBarStateProvider(parameter));
final store = ref.watch(notificationBarStoreProvider(parameter).notifier);
if (!state.isPremium) {
if (!state.recommendPremiumPlainInTrialIsAlreadyClose) {
if (state.isTrial) {
final beginTrialDate = state.beginTrialDate;
if (beginTrialDate != null) {
final difference = now().difference(beginTrialDate).inSeconds;
final days14 = Duration(days: 14).inSeconds;
final days14Plus2 = Duration(days: 14 + 2).inSeconds;
if (difference > days14 && difference < days14Plus2) {
return RecommendPremiumPlainInTrialNotificationBar(
onTap: () {
showPremiumIntroductionSheet(context);
},
onClose: () {
store.closeRecommendedPremiumPlainInTrial();
},
);
}
}
}
}

final premiumTrialLimit = state.premiumTrialLimit;
if (premiumTrialLimit != null) {
return PremiumTrialLimitNotificationBar(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,8 +15,10 @@ class NotificationBarState with _$NotificationBarState {
required bool isTrial,
required bool isAlreadyShowAnnouncementSupportedMultilplePillSheet,
required bool hasDiscountEntitlement,
required DateTime? beginTrialDate,
required DateTime? trialDeadlineDate,
required DateTime? discountEntitlementDeadlineDate,
required bool recommendPremiumPlainInTrialIsAlreadyClose,
required bool recommendedSignupNotificationIsAlreadyShow,
required bool premiumTrialGuideNotificationIsClosed,
required bool isLinkedLoginProvider,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,8 +25,10 @@ class _$NotificationBarStateTearOff {
required bool isTrial,
required bool isAlreadyShowAnnouncementSupportedMultilplePillSheet,
required bool hasDiscountEntitlement,
required DateTime? beginTrialDate,
required DateTime? trialDeadlineDate,
required DateTime? discountEntitlementDeadlineDate,
required bool recommendPremiumPlainInTrialIsAlreadyClose,
required bool recommendedSignupNotificationIsAlreadyShow,
required bool premiumTrialGuideNotificationIsClosed,
required bool isLinkedLoginProvider}) {
Expand All @@ -38,8 +40,11 @@ class _$NotificationBarStateTearOff {
isAlreadyShowAnnouncementSupportedMultilplePillSheet:
isAlreadyShowAnnouncementSupportedMultilplePillSheet,
hasDiscountEntitlement: hasDiscountEntitlement,
beginTrialDate: beginTrialDate,
trialDeadlineDate: trialDeadlineDate,
discountEntitlementDeadlineDate: discountEntitlementDeadlineDate,
recommendPremiumPlainInTrialIsAlreadyClose:
recommendPremiumPlainInTrialIsAlreadyClose,
recommendedSignupNotificationIsAlreadyShow:
recommendedSignupNotificationIsAlreadyShow,
premiumTrialGuideNotificationIsClosed:
Expand All @@ -62,9 +67,12 @@ mixin _$NotificationBarState {
bool get isAlreadyShowAnnouncementSupportedMultilplePillSheet =>
throw _privateConstructorUsedError;
bool get hasDiscountEntitlement => throw _privateConstructorUsedError;
DateTime? get beginTrialDate => throw _privateConstructorUsedError;
DateTime? get trialDeadlineDate => throw _privateConstructorUsedError;
DateTime? get discountEntitlementDeadlineDate =>
throw _privateConstructorUsedError;
bool get recommendPremiumPlainInTrialIsAlreadyClose =>
throw _privateConstructorUsedError;
bool get recommendedSignupNotificationIsAlreadyShow =>
throw _privateConstructorUsedError;
bool get premiumTrialGuideNotificationIsClosed =>
Expand All @@ -88,8 +96,10 @@ abstract class $NotificationBarStateCopyWith<$Res> {
bool isTrial,
bool isAlreadyShowAnnouncementSupportedMultilplePillSheet,
bool hasDiscountEntitlement,
DateTime? beginTrialDate,
DateTime? trialDeadlineDate,
DateTime? discountEntitlementDeadlineDate,
bool recommendPremiumPlainInTrialIsAlreadyClose,
bool recommendedSignupNotificationIsAlreadyShow,
bool premiumTrialGuideNotificationIsClosed,
bool isLinkedLoginProvider});
Expand All @@ -114,8 +124,10 @@ class _$NotificationBarStateCopyWithImpl<$Res>
Object? isTrial = freezed,
Object? isAlreadyShowAnnouncementSupportedMultilplePillSheet = freezed,
Object? hasDiscountEntitlement = freezed,
Object? beginTrialDate = freezed,
Object? trialDeadlineDate = freezed,
Object? discountEntitlementDeadlineDate = freezed,
Object? recommendPremiumPlainInTrialIsAlreadyClose = freezed,
Object? recommendedSignupNotificationIsAlreadyShow = freezed,
Object? premiumTrialGuideNotificationIsClosed = freezed,
Object? isLinkedLoginProvider = freezed,
Expand Down Expand Up @@ -146,6 +158,10 @@ class _$NotificationBarStateCopyWithImpl<$Res>
? _value.hasDiscountEntitlement
: hasDiscountEntitlement // ignore: cast_nullable_to_non_nullable
as bool,
beginTrialDate: beginTrialDate == freezed
? _value.beginTrialDate
: beginTrialDate // ignore: cast_nullable_to_non_nullable
as DateTime?,
trialDeadlineDate: trialDeadlineDate == freezed
? _value.trialDeadlineDate
: trialDeadlineDate // ignore: cast_nullable_to_non_nullable
Expand All @@ -155,6 +171,11 @@ class _$NotificationBarStateCopyWithImpl<$Res>
? _value.discountEntitlementDeadlineDate
: discountEntitlementDeadlineDate // ignore: cast_nullable_to_non_nullable
as DateTime?,
recommendPremiumPlainInTrialIsAlreadyClose:
recommendPremiumPlainInTrialIsAlreadyClose == freezed
? _value.recommendPremiumPlainInTrialIsAlreadyClose
: recommendPremiumPlainInTrialIsAlreadyClose // ignore: cast_nullable_to_non_nullable
as bool,
recommendedSignupNotificationIsAlreadyShow:
recommendedSignupNotificationIsAlreadyShow == freezed
? _value.recommendedSignupNotificationIsAlreadyShow
Expand Down Expand Up @@ -198,8 +219,10 @@ abstract class _$NotificationBarStateCopyWith<$Res>
bool isTrial,
bool isAlreadyShowAnnouncementSupportedMultilplePillSheet,
bool hasDiscountEntitlement,
DateTime? beginTrialDate,
DateTime? trialDeadlineDate,
DateTime? discountEntitlementDeadlineDate,
bool recommendPremiumPlainInTrialIsAlreadyClose,
bool recommendedSignupNotificationIsAlreadyShow,
bool premiumTrialGuideNotificationIsClosed,
bool isLinkedLoginProvider});
Expand Down Expand Up @@ -227,8 +250,10 @@ class __$NotificationBarStateCopyWithImpl<$Res>
Object? isTrial = freezed,
Object? isAlreadyShowAnnouncementSupportedMultilplePillSheet = freezed,
Object? hasDiscountEntitlement = freezed,
Object? beginTrialDate = freezed,
Object? trialDeadlineDate = freezed,
Object? discountEntitlementDeadlineDate = freezed,
Object? recommendPremiumPlainInTrialIsAlreadyClose = freezed,
Object? recommendedSignupNotificationIsAlreadyShow = freezed,
Object? premiumTrialGuideNotificationIsClosed = freezed,
Object? isLinkedLoginProvider = freezed,
Expand Down Expand Up @@ -259,6 +284,10 @@ class __$NotificationBarStateCopyWithImpl<$Res>
? _value.hasDiscountEntitlement
: hasDiscountEntitlement // ignore: cast_nullable_to_non_nullable
as bool,
beginTrialDate: beginTrialDate == freezed
? _value.beginTrialDate
: beginTrialDate // ignore: cast_nullable_to_non_nullable
as DateTime?,
trialDeadlineDate: trialDeadlineDate == freezed
? _value.trialDeadlineDate
: trialDeadlineDate // ignore: cast_nullable_to_non_nullable
Expand All @@ -268,6 +297,11 @@ class __$NotificationBarStateCopyWithImpl<$Res>
? _value.discountEntitlementDeadlineDate
: discountEntitlementDeadlineDate // ignore: cast_nullable_to_non_nullable
as DateTime?,
recommendPremiumPlainInTrialIsAlreadyClose:
recommendPremiumPlainInTrialIsAlreadyClose == freezed
? _value.recommendPremiumPlainInTrialIsAlreadyClose
: recommendPremiumPlainInTrialIsAlreadyClose // ignore: cast_nullable_to_non_nullable
as bool,
recommendedSignupNotificationIsAlreadyShow:
recommendedSignupNotificationIsAlreadyShow == freezed
? _value.recommendedSignupNotificationIsAlreadyShow
Expand Down Expand Up @@ -296,8 +330,10 @@ class _$_NotificationBarState extends _NotificationBarState {
required this.isTrial,
required this.isAlreadyShowAnnouncementSupportedMultilplePillSheet,
required this.hasDiscountEntitlement,
required this.beginTrialDate,
required this.trialDeadlineDate,
required this.discountEntitlementDeadlineDate,
required this.recommendPremiumPlainInTrialIsAlreadyClose,
required this.recommendedSignupNotificationIsAlreadyShow,
required this.premiumTrialGuideNotificationIsClosed,
required this.isLinkedLoginProvider})
Expand All @@ -316,10 +352,14 @@ class _$_NotificationBarState extends _NotificationBarState {
@override
final bool hasDiscountEntitlement;
@override
final DateTime? beginTrialDate;
@override
final DateTime? trialDeadlineDate;
@override
final DateTime? discountEntitlementDeadlineDate;
@override
final bool recommendPremiumPlainInTrialIsAlreadyClose;
@override
final bool recommendedSignupNotificationIsAlreadyShow;
@override
final bool premiumTrialGuideNotificationIsClosed;
Expand All @@ -328,7 +368,7 @@ class _$_NotificationBarState extends _NotificationBarState {

@override
String toString() {
return 'NotificationBarState(latestPillSheetGroup: $latestPillSheetGroup, totalCountOfActionForTakenPill: $totalCountOfActionForTakenPill, isPremium: $isPremium, isTrial: $isTrial, isAlreadyShowAnnouncementSupportedMultilplePillSheet: $isAlreadyShowAnnouncementSupportedMultilplePillSheet, hasDiscountEntitlement: $hasDiscountEntitlement, trialDeadlineDate: $trialDeadlineDate, discountEntitlementDeadlineDate: $discountEntitlementDeadlineDate, recommendedSignupNotificationIsAlreadyShow: $recommendedSignupNotificationIsAlreadyShow, premiumTrialGuideNotificationIsClosed: $premiumTrialGuideNotificationIsClosed, isLinkedLoginProvider: $isLinkedLoginProvider)';
return 'NotificationBarState(latestPillSheetGroup: $latestPillSheetGroup, totalCountOfActionForTakenPill: $totalCountOfActionForTakenPill, isPremium: $isPremium, isTrial: $isTrial, isAlreadyShowAnnouncementSupportedMultilplePillSheet: $isAlreadyShowAnnouncementSupportedMultilplePillSheet, hasDiscountEntitlement: $hasDiscountEntitlement, beginTrialDate: $beginTrialDate, trialDeadlineDate: $trialDeadlineDate, discountEntitlementDeadlineDate: $discountEntitlementDeadlineDate, recommendPremiumPlainInTrialIsAlreadyClose: $recommendPremiumPlainInTrialIsAlreadyClose, recommendedSignupNotificationIsAlreadyShow: $recommendedSignupNotificationIsAlreadyShow, premiumTrialGuideNotificationIsClosed: $premiumTrialGuideNotificationIsClosed, isLinkedLoginProvider: $isLinkedLoginProvider)';
}

@override
Expand All @@ -348,11 +388,16 @@ class _$_NotificationBarState extends _NotificationBarState {
isAlreadyShowAnnouncementSupportedMultilplePillSheet) &&
const DeepCollectionEquality()
.equals(other.hasDiscountEntitlement, hasDiscountEntitlement) &&
const DeepCollectionEquality()
.equals(other.beginTrialDate, beginTrialDate) &&
const DeepCollectionEquality()
.equals(other.trialDeadlineDate, trialDeadlineDate) &&
const DeepCollectionEquality().equals(
other.discountEntitlementDeadlineDate,
discountEntitlementDeadlineDate) &&
const DeepCollectionEquality().equals(
other.recommendPremiumPlainInTrialIsAlreadyClose,
recommendPremiumPlainInTrialIsAlreadyClose) &&
const DeepCollectionEquality().equals(
other.recommendedSignupNotificationIsAlreadyShow,
recommendedSignupNotificationIsAlreadyShow) &&
Expand All @@ -373,8 +418,11 @@ class _$_NotificationBarState extends _NotificationBarState {
const DeepCollectionEquality()
.hash(isAlreadyShowAnnouncementSupportedMultilplePillSheet),
const DeepCollectionEquality().hash(hasDiscountEntitlement),
const DeepCollectionEquality().hash(beginTrialDate),
const DeepCollectionEquality().hash(trialDeadlineDate),
const DeepCollectionEquality().hash(discountEntitlementDeadlineDate),
const DeepCollectionEquality()
.hash(recommendPremiumPlainInTrialIsAlreadyClose),
const DeepCollectionEquality()
.hash(recommendedSignupNotificationIsAlreadyShow),
const DeepCollectionEquality()
Expand All @@ -396,8 +444,10 @@ abstract class _NotificationBarState extends NotificationBarState {
required bool isTrial,
required bool isAlreadyShowAnnouncementSupportedMultilplePillSheet,
required bool hasDiscountEntitlement,
required DateTime? beginTrialDate,
required DateTime? trialDeadlineDate,
required DateTime? discountEntitlementDeadlineDate,
required bool recommendPremiumPlainInTrialIsAlreadyClose,
required bool recommendedSignupNotificationIsAlreadyShow,
required bool premiumTrialGuideNotificationIsClosed,
required bool isLinkedLoginProvider}) = _$_NotificationBarState;
Expand All @@ -416,10 +466,14 @@ abstract class _NotificationBarState extends NotificationBarState {
@override
bool get hasDiscountEntitlement;
@override
DateTime? get beginTrialDate;
@override
DateTime? get trialDeadlineDate;
@override
DateTime? get discountEntitlementDeadlineDate;
@override
bool get recommendPremiumPlainInTrialIsAlreadyClose;
@override
bool get recommendedSignupNotificationIsAlreadyShow;
@override
bool get premiumTrialGuideNotificationIsClosed;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,16 +30,26 @@ class NotificationBarStateStore extends StateNotifier<NotificationBarState> {
hasDiscountEntitlement: parameter.hasDiscountEntitlement,
isAlreadyShowAnnouncementSupportedMultilplePillSheet:
parameter.isAlreadyShowAnnouncementSupportedMultilplePillSheet,
beginTrialDate: parameter.beginTrialDate,
trialDeadlineDate: parameter.trialDeadlineDate,
discountEntitlementDeadlineDate:
parameter.discountEntitlementDeadlineDate,
isLinkedLoginProvider: parameter.isLinkedLoginProvider,
recommendPremiumPlainInTrialIsAlreadyClose:
parameter.recommendPremiumPlainInTrialIsAlreadyClose,
premiumTrialGuideNotificationIsClosed:
parameter.premiumTrialGuideNotificationIsClosed,
recommendedSignupNotificationIsAlreadyShow:
parameter.recommendedSignupNotificationIsAlreadyShow,
),
);
Future<void> closeRecommendedPremiumPlainInTrial() async {
final sharedPreferences = await SharedPreferences.getInstance();
sharedPreferences.setBool(
BoolKey.recommendPremiumPlainInTrialIsAlreadyClose, true);
state = state.copyWith(recommendPremiumPlainInTrialIsAlreadyClose: true);
}

Future<void> closeRecommendedSignupNotification() async {
final sharedPreferences = await SharedPreferences.getInstance();
sharedPreferences.setBool(
Expand Down
1 change: 1 addition & 0 deletions lib/domain/record/record_page_state.dart
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ class RecordPageState with _$RecordPageState {
DateTime? beginTrialDate,
DateTime? trialDeadlineDate,
DateTime? discountEntitlementDeadlineDate,
@Default(false) bool recommendPremiumPlainInTrialIsAlreadyClose,
@Default(true) bool recommendedSignupNotificationIsAlreadyShow,
@Default(true) bool premiumTrialGuideNotificationIsClosed,
Object? exception,
Expand Down
Loading