Skip to content

Commit

Permalink
feat: update offramp status screen (#1154)
Browse files Browse the repository at this point in the history
Co-authored-by: ookami-kb <ookami.kb@gmail.com>
  • Loading branch information
justinenerio and ookami-kb authored Dec 4, 2023
1 parent d0faf91 commit d9d8f9a
Show file tree
Hide file tree
Showing 17 changed files with 718 additions and 119 deletions.
18 changes: 18 additions & 0 deletions packages/espressocash_app/lib/core/currency.dart
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,13 @@ sealed class Currency with _$Currency {
decimals: 2,
);

static const FiatCurrency ngn = FiatCurrency(
symbol: 'NGN',
sign: '₦',
name: 'Nigerian Naira',
decimals: 2,
);

String get name => switch (this) {
FiatCurrency(:final name) => name,
CryptoCurrency(:final token) => token.name,
Expand All @@ -55,3 +62,14 @@ sealed class Currency with _$Currency {
}

const defaultFiatCurrency = Currency.usd;

FiatCurrency currencyFromString(String currency) {
switch (currency) {
case 'USD':
return Currency.usd;
case 'NGN':
return Currency.ngn;
default:
return defaultFiatCurrency;
}
}
12 changes: 11 additions & 1 deletion packages/espressocash_app/lib/data/db/db.dart
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ class OutgoingTransferRows extends Table {
Set<Column<Object>> get primaryKey => {id};
}

const int latestVersion = 42;
const int latestVersion = 43;

const _tables = [
OutgoingTransferRows,
Expand Down Expand Up @@ -179,6 +179,11 @@ class MyDatabase extends _$MyDatabase {
if (from >= 40 && from < 42) {
await m.addColumn(offRampOrderRows, offRampOrderRows.partner);
}
if (from >= 40 && from < 43) {
await m.addColumn(offRampOrderRows, offRampOrderRows.resolvedAt);
await m.addColumn(offRampOrderRows, offRampOrderRows.receiveAmount);
await m.addColumn(offRampOrderRows, offRampOrderRows.fiatSymbol);
}
},
);

Expand Down Expand Up @@ -232,6 +237,9 @@ class OffRampOrderRows extends Table with AmountMixin, EntityMixin {
TextColumn get transaction => text()();
TextColumn get depositAddress => text()();
Int64Column get slot => int64()();
DateTimeColumn get resolvedAt => dateTime().nullable()();
IntColumn get receiveAmount => integer().nullable()();
TextColumn get fiatSymbol => text().nullable()();
TextColumn get partner =>
textEnum<RampPartner>().withDefault(const Constant('kado'))();
}
Expand All @@ -242,7 +250,9 @@ enum OffRampOrderStatus {
depositTxReady,
sendingDepositTx,
depositError,
depositTxConfirmError,
waitingForPartner,
failure,
completed,
cancelled,
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,52 +5,46 @@ import 'package:flutter/widgets.dart';
import '../../../core/presentation/format_amount.dart';
import '../../../core/presentation/format_date.dart';
import '../../../data/db/db.dart';
import '../../../di.dart';
import '../../../gen/assets.gen.dart';
import '../../../l10n/device_locale.dart';
import '../../../l10n/l10n.dart';
import '../../ramp/screens/off_ramp_order_screen.dart';
import '../../ramp/services/off_ramp_order_service.dart';
import '../../ramp/widgets/off_ramp_order_details.dart';
import '../models/activity.dart';
import 'activity_tile.dart';

class OffRampTile extends StatefulWidget {
class OffRampTile extends StatelessWidget {
const OffRampTile({super.key, required this.activity});

final OffRampActivity activity;

@override
State<OffRampTile> createState() => _OffRampTileState();
}

class _OffRampTileState extends State<OffRampTile> {
late final _stream = sl<OffRampOrderService>().watch(widget.activity.id);

@override
Widget build(BuildContext context) => StreamBuilder<OffRampOrder>(
stream: _stream,
builder: (context, snpahost) {
final order = snpahost.data;

return CpActivityTile(
title: order?.amount.let(
(amount) => context.l10n.activities_lblSoldToken(
amount.format(
context.locale,
maxDecimals: 2,
roundInteger: true,
),
Widget build(BuildContext context) => OffRampOrderDetails(
orderId: activity.id,
builder: (context, order) => CpActivityTile(
title: order?.amount.let(
(amount) => context.l10n.activities_lblSoldToken(
amount.format(
context.locale,
maxDecimals: 2,
roundInteger: true,
),
) ??
'',
icon: Assets.icons.paymentIcon.svg(),
status: order?.status == OffRampOrderStatus.completed
? CpActivityTileStatus.success
: CpActivityTileStatus.inProgress,
timestamp: context.formatDate(widget.activity.created),
onTap: () => context.router
.push(OffRampOrderScreen.route(orderId: widget.activity.id)),
);
},
),
) ??
'',
incomingAmount: order?.receiveAmount?.format(
context.locale,
maxDecimals: 2,
),
icon: Assets.icons.paymentIcon.svg(),
status: order?.status == OffRampOrderStatus.completed
? CpActivityTileStatus.success
: order?.status == OffRampOrderStatus.failure
? CpActivityTileStatus.failure
: CpActivityTileStatus.inProgress,
timestamp: context.formatDate(activity.created),
onTap: () => context.router
.push(OffRampOrderScreen.route(orderId: activity.id)),
),
);
}
Original file line number Diff line number Diff line change
@@ -1,12 +1,12 @@
import 'package:auto_route/annotations.dart';
import 'package:flutter/material.dart';
import 'package:url_launcher/url_launcher.dart';

import '../../../../../config.dart';
import '../../../../../core/presentation/utils.dart';
import '../../../../../l10n/l10n.dart';
import '../../../../../ui/app_bar.dart';
import '../../../routes.gr.dart';
import '../widgets/extensions.dart';
import '../widgets/profile_button.dart';

@RoutePage()
Expand All @@ -32,11 +32,7 @@ class HelpScreen extends StatelessWidget {
),
ProfileButton(
label: context.l10n.contactUs,
onPressed: () {
final email = Uri.encodeComponent(contactEmail);
final mail = Uri.parse('mailto:$email');
launchUrl(mail);
},
onPressed: context.launchContactUs,
),
],
),
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
import 'package:flutter/material.dart';
import 'package:url_launcher/url_launcher.dart';

import '../../../config.dart';

extension BuildContextExt on BuildContext {
void launchContactUs() {
final email = Uri.encodeComponent(contactEmail);
final mail = Uri.parse('mailto:$email');
launchUrl(mail);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -26,20 +26,24 @@ class ScalexOffRampOrderWatcher implements RampWatcher {
.whereNotNull()
.asyncMap((order) => _client.fetchStatus(order.partnerOrderId))
.listen((status) async {
final statement = _db.update(_db.onRampOrderRows)
final statement = _db.update(_db.offRampOrderRows)
..where(
(tbl) => tbl.id.equals(orderId) & tbl.isCompleted.equals(false),
(tbl) =>
tbl.id.equals(orderId) &
tbl.status.equals(OffRampOrderStatus.waitingForPartner.name),
);

final isCompleted = status == ScalexOrderStatus.completed;

if (isCompleted) await _subscription?.cancel();

await statement.write(
OnRampOrderRowsCompanion(
OffRampOrderRowsCompanion(
humanStatus: Value(status.name),
machineStatus: Value(status.name),
isCompleted: Value(isCompleted),
status: isCompleted
? const Value(OffRampOrderStatus.completed)
: const Value(OffRampOrderStatus.waitingForPartner),
),
);
});
Expand Down
Loading

0 comments on commit d9d8f9a

Please sign in to comment.