2023-02-15 10:28:41 +00:00
import " package:flutter/material.dart " ;
2023-02-15 16:47:40 +00:00
import " package:photos/models/api/storage_bonus/storage_bonus.dart " ;
import " package:photos/models/user_details.dart " ;
import " package:photos/services/storage_bonus_service.dart " ;
import " package:photos/services/user_service.dart " ;
2023-02-15 10:28:41 +00:00
import " package:photos/theme/ente_theme.dart " ;
2023-02-15 16:47:40 +00:00
import " package:photos/ui/common/loading_widget.dart " ;
import " package:photos/ui/common/web_page.dart " ;
2023-02-15 10:28:41 +00:00
import " package:photos/ui/components/captioned_text_widget.dart " ;
import " package:photos/ui/components/divider_widget.dart " ;
import " package:photos/ui/components/icon_button_widget.dart " ;
import " package:photos/ui/components/menu_item_widget/menu_item_widget.dart " ;
import " package:photos/ui/components/title_bar_title_widget.dart " ;
import " package:photos/ui/components/title_bar_widget.dart " ;
import " package:photos/ui/growth/apply_code_screen.dart " ;
2023-02-23 03:12:58 +00:00
import " package:photos/ui/growth/referral_code_widget.dart " ;
2023-02-15 16:47:40 +00:00
import " package:photos/ui/growth/storage_details_screen.dart " ;
import " package:photos/utils/data_util.dart " ;
2023-02-15 10:28:41 +00:00
import " package:photos/utils/navigation_util.dart " ;
2023-02-15 16:51:32 +00:00
import " package:photos/utils/share_util.dart " ;
2023-02-15 10:28:41 +00:00
class ReferralScreen extends StatefulWidget {
const ReferralScreen ( { super . key } ) ;
@ override
State < ReferralScreen > createState ( ) = > _ReferralScreenState ( ) ;
}
class _ReferralScreenState extends State < ReferralScreen > {
bool canApplyCode = true ;
2023-02-16 10:12:20 +00:00
void _safeUIUpdate ( ) {
if ( mounted ) {
setState ( ( ) = > { } ) ;
}
}
2023-02-15 16:47:40 +00:00
2023-02-15 10:28:41 +00:00
@ override
void initState ( ) {
super . initState ( ) ;
}
@ override
Widget build ( BuildContext context ) {
return Scaffold (
body: CustomScrollView (
primary: false ,
slivers: < Widget > [
TitleBarWidget (
flexibleSpaceTitle: const TitleBarTitleWidget (
title: " Claim free storage " ,
) ,
2023-02-15 16:47:40 +00:00
flexibleSpaceCaption: " Invite your friends " ,
2023-02-15 10:28:41 +00:00
actionIcons: [
IconButtonWidget (
icon: Icons . close_outlined ,
iconButtonType: IconButtonType . secondary ,
onTap: ( ) {
Navigator . pop ( context ) ;
Navigator . pop ( context ) ;
} ,
) ,
] ,
) ,
SliverList (
delegate: SliverChildBuilderDelegate (
( delegateBuildContext , index ) {
return Padding (
2023-02-15 16:47:40 +00:00
padding:
const EdgeInsets . symmetric ( horizontal: 16 , vertical: 20 ) ,
child: FutureBuilder < ReferralView > (
future: StorageBonusService . instance
. getGateway ( )
. getReferralView ( ) ,
builder: ( context , snapshot ) {
if ( snapshot . hasData ) {
return ReferralWidget (
snapshot . data ! ,
UserService . instance . getCachedUserDetails ( ) ! ,
2023-02-16 10:12:20 +00:00
_safeUIUpdate ,
2023-02-15 16:47:40 +00:00
) ;
2023-02-16 07:56:08 +00:00
} else if ( snapshot . hasError ) {
return const Center (
child: Padding (
padding: EdgeInsets . all ( 24.0 ) ,
child: Text (
" Unable to fetch referral details. Please try again later. " ,
) ,
) ,
) ;
}
{
2023-02-15 16:47:40 +00:00
return const EnteLoadingWidget ( ) ;
}
} ,
2023-02-15 10:28:41 +00:00
) ,
) ;
} ,
childCount: 1 ,
) ,
) ,
] ,
) ,
) ;
}
}
2023-02-15 16:47:40 +00:00
class ReferralWidget extends StatelessWidget {
final ReferralView referralView ;
final UserDetails userDetails ;
2023-02-16 10:12:20 +00:00
final Function notifyParent ;
2023-02-15 16:47:40 +00:00
2023-02-16 10:12:20 +00:00
const ReferralWidget (
this . referralView ,
this . userDetails ,
this . notifyParent , {
super . key ,
} ) ;
2023-02-15 16:47:40 +00:00
@ override
Widget build ( BuildContext context ) {
final colorScheme = getEnteColorScheme ( context ) ;
final textStyle = getEnteTextTheme ( context ) ;
final bool isReferralEnabled = referralView . planInfo . isEnabled ;
return Column (
crossAxisAlignment: CrossAxisAlignment . start ,
children: [
// Container with 8 border radius and red color
isReferralEnabled
2023-02-15 16:51:32 +00:00
? InkWell (
onTap: ( ) {
shareText (
" ente referral code: ${ referralView . code } \n \n Apply it in Settings → General → Referrals to get 10 GB free after you signup for a paid plan \n \n https://ente.io " ) ;
} ,
child: Container (
width: double . infinity ,
decoration: BoxDecoration (
border: Border . all (
color: colorScheme . strokeFaint ,
width: 1 ,
) ,
borderRadius: BorderRadius . circular ( 8 ) ,
2023-02-15 16:47:40 +00:00
) ,
2023-02-15 16:51:32 +00:00
child: Padding (
padding: const EdgeInsets . symmetric (
vertical: 12 ,
horizontal: 12 ,
) ,
child: Column (
crossAxisAlignment: CrossAxisAlignment . start ,
children: [
const Text (
" 1. Give this code to your "
" friends " ,
) ,
const SizedBox ( height: 12 ) ,
2023-02-23 03:12:58 +00:00
ReferralCodeWidget ( referralView . code ) ,
2023-02-15 16:51:32 +00:00
const SizedBox ( height: 12 ) ,
const Text (
" 2. They sign up for a paid plan " ,
) ,
const SizedBox ( height: 12 ) ,
Text (
" 3. Both of you get ${ referralView . planInfo . storageInGB } "
" GB* free " ,
) ,
] ,
) ,
2023-02-15 16:47:40 +00:00
) ,
) ,
)
: Padding (
padding: const EdgeInsets . symmetric ( vertical: 48 ) ,
child: Center (
child: Column (
crossAxisAlignment: CrossAxisAlignment . center ,
children: [
Icon (
Icons . error_outline ,
color: colorScheme . strokeMuted ,
) ,
const SizedBox ( height: 12 ) ,
Text ( " Referrals are currently paused " ,
style: textStyle . small
. copyWith ( color: colorScheme . textFaint ) ) ,
] ,
) ,
) ,
) ,
const SizedBox ( height: 4 ) ,
isReferralEnabled
? Text (
" * You can at max double your storage " ,
style: textStyle . mini . copyWith (
color: colorScheme . textMuted ,
) ,
textAlign: TextAlign . left ,
)
: const SizedBox . shrink ( ) ,
const SizedBox ( height: 24 ) ,
referralView . enableApplyCode
? MenuItemWidget (
captionedTextWidget: const CaptionedTextWidget (
title: " Apply code " ,
) ,
menuItemColor: colorScheme . fillFaint ,
trailingWidget: Icon (
Icons . chevron_right_outlined ,
color: colorScheme . strokeBase ,
) ,
singleBorderRadius: 8 ,
alignCaptionedTextToLeft: true ,
isBottomBorderRadiusRemoved: true ,
onTap: ( ) async {
2023-02-16 10:12:20 +00:00
await routeToPage (
2023-02-15 16:47:40 +00:00
context ,
const ApplyCodeScreen ( ) ,
) ;
2023-02-16 10:12:20 +00:00
notifyParent ( ) ;
2023-02-15 16:47:40 +00:00
} ,
)
: const SizedBox . shrink ( ) ,
referralView . enableApplyCode
? DividerWidget (
dividerType: DividerType . menu ,
bgColor: colorScheme . fillFaint ,
)
: const SizedBox . shrink ( ) ,
MenuItemWidget (
captionedTextWidget: const CaptionedTextWidget (
title: " FAQ " ,
) ,
menuItemColor: colorScheme . fillFaint ,
trailingWidget: Icon (
Icons . chevron_right_outlined ,
color: colorScheme . strokeBase ,
) ,
singleBorderRadius: 8 ,
isTopBorderRadiusRemoved: referralView . enableApplyCode ,
alignCaptionedTextToLeft: true ,
onTap: ( ) async {
2023-02-18 04:00:11 +00:00
routeToPage (
context ,
const WebPage (
" FAQ " , " https://ente.io/faq/general/referral-program " ) ) ;
2023-02-15 16:47:40 +00:00
} ,
) ,
const SizedBox ( height: 24 ) ,
Padding (
padding: const EdgeInsets . symmetric (
horizontal: 8.0 ,
vertical: 6.0 ,
) ,
child: Text (
" ${ referralView . isFamilyMember ? ' Your family has ' : ' You have ' } claimed "
" ${ convertBytesToAbsoluteGBs ( referralView . claimedStorage ) } GB so far " ,
style: textStyle . small . copyWith (
color: colorScheme . textMuted ,
) ,
) ,
) ,
MenuItemWidget (
captionedTextWidget: const CaptionedTextWidget (
title: " Details " ,
) ,
menuItemColor: colorScheme . fillFaint ,
trailingWidget: Icon (
Icons . chevron_right_outlined ,
color: colorScheme . strokeBase ,
) ,
singleBorderRadius: 8 ,
alignCaptionedTextToLeft: true ,
onTap: ( ) async {
routeToPage (
context ,
StorageDetailsScreen ( referralView , userDetails ) ,
) ;
} ,
) ,
] ,
) ;
}
}