2020-10-30 16:32:21 +00:00
|
|
|
import 'dart:ui';
|
|
|
|
import 'package:mobx/mobx.dart';
|
|
|
|
import 'package:flutter_mobx/flutter_mobx.dart';
|
|
|
|
import 'package:flutter/material.dart';
|
|
|
|
import 'package:flutter/cupertino.dart';
|
|
|
|
import 'package:flutter/services.dart';
|
|
|
|
import 'package:cake_wallet/generated/i18n.dart';
|
|
|
|
import 'package:cake_wallet/core/execution_state.dart';
|
2020-08-26 17:31:23 +00:00
|
|
|
import 'package:cake_wallet/src/screens/exchange_trade/information_page.dart';
|
2020-10-30 16:32:21 +00:00
|
|
|
import 'package:cake_wallet/src/screens/send/widgets/confirm_sending_alert.dart';
|
2020-08-27 19:42:28 +00:00
|
|
|
import 'package:cake_wallet/src/widgets/standart_list_row.dart';
|
2020-09-30 18:23:15 +00:00
|
|
|
import 'package:cake_wallet/utils/show_bar.dart';
|
2020-09-25 15:32:44 +00:00
|
|
|
import 'package:cake_wallet/utils/show_pop_up.dart';
|
2020-08-26 17:31:23 +00:00
|
|
|
import 'package:cake_wallet/view_model/exchange/exchange_trade_view_model.dart';
|
2020-10-30 16:32:21 +00:00
|
|
|
import 'package:cake_wallet/view_model/send/send_view_model_state.dart';
|
2020-05-05 17:59:56 +00:00
|
|
|
import 'package:cake_wallet/src/screens/receive/widgets/qr_image.dart';
|
2020-01-04 19:31:52 +00:00
|
|
|
import 'package:cake_wallet/src/screens/base_page.dart';
|
|
|
|
import 'package:cake_wallet/src/screens/exchange_trade/widgets/timer_widget.dart';
|
|
|
|
import 'package:cake_wallet/src/widgets/primary_button.dart';
|
|
|
|
import 'package:cake_wallet/src/widgets/scollable_with_bottom_section.dart';
|
2020-05-15 17:38:08 +00:00
|
|
|
import 'package:cake_wallet/src/widgets/alert_with_one_action.dart';
|
2020-01-04 19:31:52 +00:00
|
|
|
|
2020-09-30 18:23:15 +00:00
|
|
|
void showInformation(
|
|
|
|
ExchangeTradeViewModel exchangeTradeViewModel, BuildContext context) {
|
2020-08-26 17:31:23 +00:00
|
|
|
final fetchingLabel = S.current.fetching;
|
|
|
|
final trade = exchangeTradeViewModel.trade;
|
|
|
|
final walletName = exchangeTradeViewModel.wallet.name;
|
|
|
|
|
|
|
|
final information = exchangeTradeViewModel.isSendable
|
|
|
|
? S.current.exchange_result_confirm(
|
2021-02-24 17:45:30 +00:00
|
|
|
trade.amount ?? fetchingLabel, trade.from.toString(), walletName) +
|
|
|
|
exchangeTradeViewModel.extraInfo
|
2020-08-26 17:31:23 +00:00
|
|
|
: S.current.exchange_result_description(
|
2021-02-24 17:45:30 +00:00
|
|
|
trade.amount ?? fetchingLabel, trade.from.toString()) +
|
|
|
|
exchangeTradeViewModel.extraInfo;
|
2020-08-26 17:31:23 +00:00
|
|
|
|
2020-09-25 15:32:44 +00:00
|
|
|
showPopUp<void>(
|
2020-09-30 18:23:15 +00:00
|
|
|
context: context,
|
|
|
|
builder: (_) => InformationPage(information: information));
|
2020-08-26 17:31:23 +00:00
|
|
|
}
|
|
|
|
|
2020-01-04 19:31:52 +00:00
|
|
|
class ExchangeTradePage extends BasePage {
|
2022-10-12 17:09:57 +00:00
|
|
|
ExchangeTradePage({required this.exchangeTradeViewModel});
|
2020-08-26 17:31:23 +00:00
|
|
|
|
|
|
|
final ExchangeTradeViewModel exchangeTradeViewModel;
|
|
|
|
|
2020-01-08 12:26:34 +00:00
|
|
|
@override
|
2020-01-04 19:31:52 +00:00
|
|
|
String get title => S.current.exchange;
|
|
|
|
|
|
|
|
@override
|
2020-08-26 17:31:23 +00:00
|
|
|
Widget trailing(BuildContext context) {
|
|
|
|
final questionImage = Image.asset('assets/images/question_mark.png',
|
2022-10-12 17:09:57 +00:00
|
|
|
color: Theme.of(context).primaryTextTheme!.headline6!.color!);
|
2020-08-26 17:31:23 +00:00
|
|
|
|
|
|
|
return SizedBox(
|
|
|
|
height: 20.0,
|
|
|
|
width: 20.0,
|
|
|
|
child: ButtonTheme(
|
|
|
|
minWidth: double.minPositive,
|
2022-10-12 17:09:57 +00:00
|
|
|
child: TextButton(
|
|
|
|
// FIX-ME: Style
|
|
|
|
//highlightColor: Colors.transparent,
|
|
|
|
//splashColor: Colors.transparent,
|
|
|
|
//padding: EdgeInsets.all(0),
|
2020-08-26 17:31:23 +00:00
|
|
|
onPressed: () => showInformation(exchangeTradeViewModel, context),
|
|
|
|
child: questionImage),
|
|
|
|
),
|
|
|
|
);
|
|
|
|
}
|
|
|
|
|
|
|
|
@override
|
2020-09-30 18:23:15 +00:00
|
|
|
Widget body(BuildContext context) =>
|
|
|
|
ExchangeTradeForm(exchangeTradeViewModel);
|
2020-01-04 19:31:52 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
class ExchangeTradeForm extends StatefulWidget {
|
2022-11-04 11:58:04 +00:00
|
|
|
ExchangeTradeForm(this.exchangeTradeViewModel)
|
|
|
|
: disableFiat =
|
|
|
|
exchangeTradeViewModel.sendViewModel.balanceViewModel.disableFiat;
|
2020-08-26 17:31:23 +00:00
|
|
|
|
|
|
|
final ExchangeTradeViewModel exchangeTradeViewModel;
|
2022-11-04 11:58:04 +00:00
|
|
|
final bool disableFiat;
|
2020-08-26 17:31:23 +00:00
|
|
|
|
2020-01-04 19:31:52 +00:00
|
|
|
@override
|
2020-01-08 12:26:34 +00:00
|
|
|
ExchangeTradeState createState() => ExchangeTradeState();
|
2020-01-04 19:31:52 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
class ExchangeTradeState extends State<ExchangeTradeForm> {
|
|
|
|
final fetchingLabel = S.current.fetching;
|
2020-09-30 18:23:15 +00:00
|
|
|
|
2020-01-04 19:31:52 +00:00
|
|
|
String get title => S.current.exchange;
|
|
|
|
|
|
|
|
bool _effectsInstalled = false;
|
|
|
|
|
2020-08-26 17:31:23 +00:00
|
|
|
@override
|
|
|
|
void initState() {
|
|
|
|
super.initState();
|
|
|
|
WidgetsBinding.instance.addPostFrameCallback(afterLayout);
|
|
|
|
}
|
|
|
|
|
|
|
|
void afterLayout(dynamic _) {
|
|
|
|
showInformation(widget.exchangeTradeViewModel, context);
|
|
|
|
}
|
|
|
|
|
2021-04-15 17:10:23 +00:00
|
|
|
@override
|
|
|
|
void dispose() {
|
|
|
|
super.dispose();
|
|
|
|
widget.exchangeTradeViewModel.timer?.cancel();
|
|
|
|
}
|
|
|
|
|
2020-01-04 19:31:52 +00:00
|
|
|
@override
|
|
|
|
Widget build(BuildContext context) {
|
2020-08-27 19:42:28 +00:00
|
|
|
final copyImage = Image.asset('assets/images/copy_content.png',
|
2020-09-30 18:23:15 +00:00
|
|
|
height: 16,
|
|
|
|
width: 16,
|
2022-10-12 17:09:57 +00:00
|
|
|
color: Theme.of(context).primaryTextTheme!.overline!.color!);
|
2020-01-04 19:31:52 +00:00
|
|
|
|
2020-10-30 16:32:21 +00:00
|
|
|
_setEffects(context);
|
2020-01-04 19:31:52 +00:00
|
|
|
|
2020-05-15 17:38:08 +00:00
|
|
|
return Container(
|
|
|
|
child: ScrollableWithBottomSection(
|
2020-09-30 18:23:15 +00:00
|
|
|
contentPadding: EdgeInsets.only(top: 10, bottom: 16),
|
|
|
|
content: Observer(builder: (_) {
|
|
|
|
final trade = widget.exchangeTradeViewModel.trade;
|
2020-08-27 19:42:28 +00:00
|
|
|
|
2020-09-30 18:23:15 +00:00
|
|
|
return Column(
|
|
|
|
children: <Widget>[
|
|
|
|
trade.expiredAt != null
|
|
|
|
? Row(
|
|
|
|
mainAxisSize: MainAxisSize.max,
|
|
|
|
mainAxisAlignment: MainAxisAlignment.center,
|
|
|
|
children: <Widget>[
|
|
|
|
Text(
|
|
|
|
S.of(context).offer_expires_in,
|
|
|
|
style: TextStyle(
|
|
|
|
fontSize: 14.0,
|
|
|
|
fontWeight: FontWeight.w500,
|
|
|
|
color: Theme.of(context)
|
2022-10-12 17:09:57 +00:00
|
|
|
.primaryTextTheme!
|
|
|
|
.overline!
|
|
|
|
.color!),
|
2020-09-30 18:23:15 +00:00
|
|
|
),
|
2022-10-12 17:09:57 +00:00
|
|
|
if (trade.expiredAt != null)
|
|
|
|
TimerWidget(trade.expiredAt!,
|
|
|
|
color: Theme.of(context)
|
|
|
|
.primaryTextTheme!
|
|
|
|
.headline6!
|
|
|
|
.color!)
|
2020-09-30 18:23:15 +00:00
|
|
|
])
|
|
|
|
: Offstage(),
|
|
|
|
Padding(
|
|
|
|
padding: EdgeInsets.only(top: 32),
|
|
|
|
child: Row(children: <Widget>[
|
|
|
|
Spacer(flex: 3),
|
|
|
|
Flexible(
|
|
|
|
flex: 4,
|
|
|
|
child: Center(
|
|
|
|
child: AspectRatio(
|
|
|
|
aspectRatio: 1.0,
|
2021-02-08 17:52:12 +00:00
|
|
|
child: Container(
|
|
|
|
padding: EdgeInsets.all(5),
|
2021-02-08 18:28:42 +00:00
|
|
|
decoration: BoxDecoration(
|
|
|
|
border: Border.all(
|
2021-02-22 18:10:23 +00:00
|
|
|
width: 3,
|
2021-02-08 18:28:42 +00:00
|
|
|
color: Theme.of(context)
|
2022-10-12 17:09:57 +00:00
|
|
|
.accentTextTheme!
|
|
|
|
.subtitle2!
|
|
|
|
.color!
|
2021-02-08 18:28:42 +00:00
|
|
|
)
|
|
|
|
),
|
2021-02-08 17:52:12 +00:00
|
|
|
child: QrImage(
|
|
|
|
data: trade.inputAddress ?? fetchingLabel,
|
2021-02-08 18:28:42 +00:00
|
|
|
backgroundColor: Colors.transparent,
|
|
|
|
foregroundColor: Theme.of(context)
|
2022-10-12 17:09:57 +00:00
|
|
|
.accentTextTheme!
|
|
|
|
.subtitle2!
|
|
|
|
.color!,
|
2021-02-08 17:52:12 +00:00
|
|
|
),
|
2020-09-30 18:23:15 +00:00
|
|
|
)))),
|
|
|
|
Spacer(flex: 3)
|
|
|
|
]),
|
|
|
|
),
|
|
|
|
Padding(
|
|
|
|
padding: EdgeInsets.only(top: 16),
|
|
|
|
child: ListView.separated(
|
|
|
|
shrinkWrap: true,
|
|
|
|
physics: NeverScrollableScrollPhysics(),
|
|
|
|
itemCount: widget.exchangeTradeViewModel.items.length,
|
|
|
|
separatorBuilder: (context, index) => Container(
|
|
|
|
height: 1,
|
|
|
|
color: Theme.of(context)
|
2022-10-12 17:09:57 +00:00
|
|
|
.accentTextTheme!
|
|
|
|
.subtitle2!
|
|
|
|
.backgroundColor!,
|
2020-09-30 18:23:15 +00:00
|
|
|
),
|
|
|
|
itemBuilder: (context, index) {
|
|
|
|
final item = widget.exchangeTradeViewModel.items[index];
|
2020-12-18 12:42:53 +00:00
|
|
|
final value = item.data ?? fetchingLabel;
|
|
|
|
|
|
|
|
final content = StandartListRow(
|
|
|
|
title: item.title,
|
|
|
|
value: value,
|
|
|
|
valueFontSize: 14,
|
|
|
|
image: item.isCopied ? copyImage : null,
|
|
|
|
);
|
2020-09-30 18:23:15 +00:00
|
|
|
|
|
|
|
return item.isCopied
|
|
|
|
? Builder(
|
|
|
|
builder: (context) => GestureDetector(
|
|
|
|
onTap: () {
|
|
|
|
Clipboard.setData(
|
|
|
|
ClipboardData(text: value));
|
|
|
|
showBar<void>(context,
|
|
|
|
S.of(context).copied_to_clipboard);
|
|
|
|
},
|
|
|
|
child: content,
|
|
|
|
))
|
|
|
|
: content;
|
|
|
|
},
|
|
|
|
),
|
2020-05-15 17:38:08 +00:00
|
|
|
),
|
2020-09-30 18:23:15 +00:00
|
|
|
],
|
|
|
|
);
|
|
|
|
}),
|
|
|
|
bottomSectionPadding: EdgeInsets.fromLTRB(24, 0, 24, 24),
|
2020-10-30 16:32:21 +00:00
|
|
|
bottomSection: Observer(builder: (_) {
|
|
|
|
final trade = widget.exchangeTradeViewModel.trade;
|
|
|
|
final sendingState =
|
|
|
|
widget.exchangeTradeViewModel.sendViewModel.state;
|
|
|
|
|
2020-12-15 19:40:28 +00:00
|
|
|
return widget.exchangeTradeViewModel.isSendable &&
|
2020-12-03 19:34:56 +00:00
|
|
|
!(sendingState is TransactionCommitted)
|
2020-05-15 17:38:08 +00:00
|
|
|
? LoadingPrimaryButton(
|
2020-10-28 17:33:04 +00:00
|
|
|
isDisabled: trade.inputAddress == null ||
|
2022-10-12 17:09:57 +00:00
|
|
|
trade.inputAddress!.isEmpty,
|
2020-10-30 16:32:21 +00:00
|
|
|
isLoading: sendingState is IsExecutingState,
|
|
|
|
onPressed: () =>
|
|
|
|
widget.exchangeTradeViewModel.confirmSending(),
|
2020-12-15 19:40:28 +00:00
|
|
|
text: S.of(context).confirm,
|
2022-10-12 17:09:57 +00:00
|
|
|
color: Theme.of(context).accentTextTheme!.bodyText1!.color!,
|
2020-10-28 17:33:04 +00:00
|
|
|
textColor: Colors.white)
|
2020-10-30 16:32:21 +00:00
|
|
|
: Offstage();
|
|
|
|
})),
|
2020-01-04 19:31:52 +00:00
|
|
|
);
|
|
|
|
}
|
|
|
|
|
|
|
|
void _setEffects(BuildContext context) {
|
|
|
|
if (_effectsInstalled) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2020-10-30 16:32:21 +00:00
|
|
|
reaction((_) => this.widget.exchangeTradeViewModel.sendViewModel.state,
|
|
|
|
(ExecutionState state) {
|
|
|
|
if (state is FailureState) {
|
2020-01-04 19:31:52 +00:00
|
|
|
WidgetsBinding.instance.addPostFrameCallback((_) {
|
2020-09-25 15:32:44 +00:00
|
|
|
showPopUp<void>(
|
2020-01-04 19:31:52 +00:00
|
|
|
context: context,
|
|
|
|
builder: (BuildContext context) {
|
2020-05-15 17:38:08 +00:00
|
|
|
return AlertWithOneAction(
|
|
|
|
alertTitle: S.of(context).error,
|
|
|
|
alertContent: state.error,
|
|
|
|
buttonText: S.of(context).ok,
|
2020-10-30 16:32:21 +00:00
|
|
|
buttonAction: () => Navigator.of(context).pop());
|
2020-01-04 19:31:52 +00:00
|
|
|
});
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
2020-10-30 16:32:21 +00:00
|
|
|
if (state is ExecutedSuccessfullyState) {
|
2020-01-13 12:34:50 +00:00
|
|
|
WidgetsBinding.instance.addPostFrameCallback((_) {
|
2020-09-25 15:32:44 +00:00
|
|
|
showPopUp<void>(
|
2020-01-13 12:34:50 +00:00
|
|
|
context: context,
|
|
|
|
builder: (BuildContext context) {
|
2020-10-30 16:32:21 +00:00
|
|
|
return ConfirmSendingAlert(
|
2020-05-15 17:38:08 +00:00
|
|
|
alertTitle: S.of(context).confirm_sending,
|
2020-10-30 16:32:21 +00:00
|
|
|
amount: S.of(context).send_amount,
|
|
|
|
amountValue: widget.exchangeTradeViewModel.sendViewModel
|
2022-10-12 17:09:57 +00:00
|
|
|
.pendingTransaction!.amountFormatted,
|
2020-10-30 16:32:21 +00:00
|
|
|
fee: S.of(context).send_fee,
|
|
|
|
feeValue: widget.exchangeTradeViewModel.sendViewModel
|
2022-10-12 17:09:57 +00:00
|
|
|
.pendingTransaction!.feeFormatted,
|
2020-10-30 16:32:21 +00:00
|
|
|
rightButtonText: S.of(context).ok,
|
|
|
|
leftButtonText: S.of(context).cancel,
|
2021-01-29 20:18:07 +00:00
|
|
|
actionRightButton: () async {
|
2020-05-15 17:38:08 +00:00
|
|
|
Navigator.of(context).pop();
|
2021-01-29 20:18:07 +00:00
|
|
|
await widget.exchangeTradeViewModel.sendViewModel
|
2020-10-30 16:32:21 +00:00
|
|
|
.commitTransaction();
|
2021-01-29 20:18:07 +00:00
|
|
|
await showPopUp<void>(
|
2020-10-30 16:32:21 +00:00
|
|
|
context: context,
|
|
|
|
builder: (BuildContext context) {
|
|
|
|
return Observer(builder: (_) {
|
|
|
|
final state = widget
|
|
|
|
.exchangeTradeViewModel.sendViewModel.state;
|
|
|
|
|
|
|
|
if (state is TransactionCommitted) {
|
|
|
|
return Stack(
|
|
|
|
children: <Widget>[
|
|
|
|
Container(
|
|
|
|
color: Theme.of(context).backgroundColor,
|
|
|
|
child: Center(
|
|
|
|
child: Image.asset(
|
|
|
|
'assets/images/birthday_cake.png'),
|
|
|
|
),
|
|
|
|
),
|
|
|
|
Center(
|
|
|
|
child: Padding(
|
|
|
|
padding: EdgeInsets.only(
|
|
|
|
top: 220, left: 24, right: 24),
|
|
|
|
child: Text(
|
2020-12-03 19:34:56 +00:00
|
|
|
S.of(context).send_success(widget
|
|
|
|
.exchangeTradeViewModel
|
|
|
|
.wallet
|
|
|
|
.currency
|
|
|
|
.toString()),
|
2020-10-30 16:32:21 +00:00
|
|
|
textAlign: TextAlign.center,
|
|
|
|
style: TextStyle(
|
|
|
|
fontSize: 22,
|
|
|
|
fontWeight: FontWeight.bold,
|
|
|
|
color: Theme.of(context)
|
2022-10-12 17:09:57 +00:00
|
|
|
.primaryTextTheme!
|
|
|
|
.headline6!
|
2020-10-30 16:32:21 +00:00
|
|
|
.color,
|
|
|
|
decoration: TextDecoration.none,
|
|
|
|
),
|
|
|
|
),
|
|
|
|
),
|
|
|
|
),
|
|
|
|
Positioned(
|
|
|
|
left: 24,
|
|
|
|
right: 24,
|
|
|
|
bottom: 24,
|
|
|
|
child: PrimaryButton(
|
|
|
|
onPressed: () =>
|
|
|
|
Navigator.of(context).pop(),
|
|
|
|
text: S.of(context).send_got_it,
|
|
|
|
color: Theme.of(context)
|
2022-10-12 17:09:57 +00:00
|
|
|
.accentTextTheme!
|
|
|
|
.bodyText1!
|
|
|
|
.color!,
|
2020-10-30 16:32:21 +00:00
|
|
|
textColor: Colors.white))
|
|
|
|
],
|
|
|
|
);
|
|
|
|
}
|
|
|
|
|
|
|
|
return Stack(
|
|
|
|
children: <Widget>[
|
|
|
|
Container(
|
|
|
|
color: Theme.of(context).backgroundColor,
|
|
|
|
child: Center(
|
|
|
|
child: Image.asset(
|
|
|
|
'assets/images/birthday_cake.png'),
|
|
|
|
),
|
|
|
|
),
|
|
|
|
BackdropFilter(
|
|
|
|
filter: ImageFilter.blur(
|
|
|
|
sigmaX: 3.0, sigmaY: 3.0),
|
|
|
|
child: Container(
|
|
|
|
decoration: BoxDecoration(
|
|
|
|
color: Theme.of(context)
|
|
|
|
.backgroundColor
|
|
|
|
.withOpacity(0.25)),
|
|
|
|
child: Center(
|
|
|
|
child: Padding(
|
|
|
|
padding: EdgeInsets.only(top: 220),
|
|
|
|
child: Text(
|
|
|
|
S.of(context).send_sending,
|
|
|
|
textAlign: TextAlign.center,
|
|
|
|
style: TextStyle(
|
|
|
|
fontSize: 22,
|
|
|
|
fontWeight: FontWeight.bold,
|
2022-10-12 17:09:57 +00:00
|
|
|
color: Theme.of(context).primaryTextTheme!.headline6!.color!,
|
2020-10-30 16:32:21 +00:00
|
|
|
decoration: TextDecoration.none,
|
|
|
|
),
|
|
|
|
),
|
|
|
|
),
|
|
|
|
),
|
|
|
|
),
|
|
|
|
)
|
|
|
|
],
|
|
|
|
);
|
|
|
|
});
|
|
|
|
});
|
2020-05-15 17:38:08 +00:00
|
|
|
},
|
2021-01-06 20:53:59 +00:00
|
|
|
actionLeftButton: () => Navigator.of(context).pop(),
|
2022-11-22 17:33:24 +00:00
|
|
|
feeFiatAmount: widget.exchangeTradeViewModel
|
|
|
|
.pendingTransactionFeeFiatAmountFormatted,
|
|
|
|
fiatAmountValue: widget.exchangeTradeViewModel
|
|
|
|
.pendingTransactionFiatAmountValueFormatted,
|
2021-08-10 14:52:35 +00:00
|
|
|
outputs: widget.exchangeTradeViewModel.sendViewModel
|
|
|
|
.outputs);
|
2020-01-13 12:34:50 +00:00
|
|
|
});
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
|
|
if (state is TransactionCommitted) {
|
2020-01-04 19:31:52 +00:00
|
|
|
WidgetsBinding.instance.addPostFrameCallback((_) {
|
2020-09-25 15:32:44 +00:00
|
|
|
showPopUp<void>(
|
2020-01-04 19:31:52 +00:00
|
|
|
context: context,
|
|
|
|
builder: (BuildContext context) {
|
2020-05-15 17:38:08 +00:00
|
|
|
return AlertWithOneAction(
|
|
|
|
alertTitle: S.of(context).sending,
|
|
|
|
alertContent: S.of(context).transaction_sent,
|
|
|
|
buttonText: S.of(context).ok,
|
2020-10-30 16:32:21 +00:00
|
|
|
buttonAction: () => Navigator.of(context).pop());
|
2020-01-04 19:31:52 +00:00
|
|
|
});
|
|
|
|
});
|
|
|
|
}
|
2020-10-30 16:32:21 +00:00
|
|
|
});
|
2020-01-04 19:31:52 +00:00
|
|
|
|
|
|
|
_effectsInstalled = true;
|
|
|
|
}
|
|
|
|
}
|