Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
137 changes: 137 additions & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,137 @@
name: Rust-Flutter CI

on:
pull_request:
merge_group:

jobs:
rust-checks:
name: Rust Checks
runs-on: ubuntu-latest
defaults:
run:
working-directory: ./rust
steps:
- uses: actions/checkout@v3

- name: Install Rust toolchain
uses: dtolnay/rust-toolchain@stable
with:
components: rustfmt, clippy

- name: Rust cache
uses: Swatinem/rust-cache@v2

- name: Check formatting
run: cargo fmt --all -- --check

- name: Run clippy
run: cargo clippy --all-targets --all-features -- -D warnings

- name: Build check
run: cargo check --all-targets --all-features

- name: Run tests
run: cargo test --all-features

flutter-checks:
name: Flutter Checks
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3

- name: Set up Flutter
uses: subosito/flutter-action@v2
with:
flutter-version: '3.29.2'
channel: 'stable'

- name: Install dependencies
run: flutter pub get

- name: Verify formatting
run: dart format --output=none --set-exit-if-changed .

build-android:
name: Build Android APK
needs: [ rust-checks, flutter-checks ]
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3

- name: Install Rust toolchain
uses: dtolnay/rust-toolchain@stable
with:
components: rustfmt, clippy

- name: Rust cache
uses: Swatinem/rust-cache@v2

- name: Settup flutter rust bridge
run: cargo install flutter_rust_bridge_codegen

- name: Set up Flutter
uses: subosito/flutter-action@v2
with:
flutter-version: '3.29.2'
channel: 'stable'

- uses: kuhnroyal/flutter-fvm-config-action/setup@v3

- name: Make .env file for flutter build
uses: SpicyPizza/create-envfile@v2.0
with:
envkey_ESPLORA_URL: "http://localhost:30000"
envkey_ARK_SERVER_URL: "http://localhost:7070"
envkey_ARK_NETWORK: "regtest"

- name: Install dependencies
run: flutter pub get

- name: Build rust library
run: flutter_rust_bridge_codegen generate

- name: Build APK
run: flutter build apk --debug

build-ios:
name: Build iOS
needs: [ rust-checks, flutter-checks ]
runs-on: macos-latest
steps:
- uses: actions/checkout@v3

- name: Install Rust toolchain
uses: dtolnay/rust-toolchain@stable
with:
components: rustfmt, clippy

- name: Rust cache
uses: Swatinem/rust-cache@v2

- name: Settup flutter rust bridge
run: cargo install flutter_rust_bridge_codegen

- name: Set up Flutter
uses: subosito/flutter-action@v2
with:
flutter-version: '3.29.2'
channel: 'stable'

- uses: kuhnroyal/flutter-fvm-config-action/setup@v3

- name: Make .env file for flutter build
uses: SpicyPizza/create-envfile@v2.0
with:
envkey_ESPLORA_URL: "http://localhost:30000"
envkey_ARK_SERVER_URL: "http://localhost:7070"
envkey_ARK_NETWORK: "regtest"

- name: Install dependencies
run: flutter pub get

- name: Build rust library
run: flutter_rust_bridge_codegen generate

- name: Build iOS
run: flutter build ios --debug --no-codesign
3 changes: 3 additions & 0 deletions justfile
Original file line number Diff line number Diff line change
Expand Up @@ -23,3 +23,6 @@ clippy:

run:
flutter run

flutter-fmt:
dart format --output=write .
2 changes: 1 addition & 1 deletion lib/main.dart
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,7 @@ Future<Widget> determineStartScreen() async {
final network = await _settingsService.getNetwork();

logger.i(
"Running on ${network} against ark server ${arkServerUrl} and esplora ${esploraUrl}");
"Running on $network against ark server $arkServerUrl and esplora $esploraUrl");

if (exists) {
logger.i("Wallet found, setting up client");
Expand Down
19 changes: 9 additions & 10 deletions lib/src/ui/screens/dashboard_screen.dart
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
import 'package:ark_flutter/src/ui/screens/transaction_history_widget.dart';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:ark_flutter/src/logger/logger.dart';
import 'package:ark_flutter/src/ui/screens/settings_screen.dart';
import 'package:ark_flutter/src/ui/screens/send_screen.dart';
Expand All @@ -13,15 +12,15 @@ class DashboardScreen extends StatefulWidget {
final String aspId;

const DashboardScreen({
Key? key,
super.key,
required this.aspId,
}) : super(key: key);
});

@override
_DashboardScreenState createState() => _DashboardScreenState();
DashboardScreenState createState() => DashboardScreenState();
}

class _DashboardScreenState extends State<DashboardScreen> {
class DashboardScreenState extends State<DashboardScreen> {
bool _isBalanceLoading = true;
bool _isTransactionFetching = true;
String? _balanceError;
Expand Down Expand Up @@ -278,7 +277,7 @@ class _DashboardScreenState extends State<DashboardScreen> {
borderRadius: BorderRadius.circular(16),
boxShadow: [
BoxShadow(
color: Colors.amber.withOpacity(0.3),
color: Colors.amber.withAlpha((0.3 * 255).round()),
blurRadius: 8,
offset: const Offset(0, 3),
),
Expand Down Expand Up @@ -310,9 +309,9 @@ class _DashboardScreenState extends State<DashboardScreen> {
),
const SizedBox(height: 8),
if (_balanceError != null)
Text(
const Text(
'Error loading balance',
style: const TextStyle(
style: TextStyle(
color: Colors.red,
fontSize: 16,
fontWeight: FontWeight.bold,
Expand Down Expand Up @@ -392,7 +391,7 @@ class _DashboardScreenState extends State<DashboardScreen> {
height: 32,
width: 150,
decoration: BoxDecoration(
color: Colors.white.withOpacity(0.2),
color: Colors.white.withAlpha((0.2 * 255).round()),
borderRadius: BorderRadius.circular(4),
),
),
Expand All @@ -401,7 +400,7 @@ class _DashboardScreenState extends State<DashboardScreen> {
height: 16,
width: 100,
decoration: BoxDecoration(
color: Colors.white.withOpacity(0.15),
color: Colors.white.withAlpha((0.15 * 255).round()),
borderRadius: BorderRadius.circular(4),
),
),
Expand Down
6 changes: 3 additions & 3 deletions lib/src/ui/screens/onboarding_screen.dart
Original file line number Diff line number Diff line change
Expand Up @@ -9,10 +9,10 @@ class OnboardingScreen extends StatefulWidget {
const OnboardingScreen({super.key});

@override
_OnboardingScreenState createState() => _OnboardingScreenState();
OnboardingScreenState createState() => OnboardingScreenState();
}

class _OnboardingScreenState extends State<OnboardingScreen> {
class OnboardingScreenState extends State<OnboardingScreen> {
String? _selectedOption;
final TextEditingController _secretKeyController = TextEditingController();
bool _isLoading = false;
Expand Down Expand Up @@ -356,7 +356,7 @@ class _OnboardingScreenState extends State<OnboardingScreen> {
style: TextStyle(
fontSize: 14,
color: isSelected
? Colors.black.withOpacity(0.7)
? Colors.white.withAlpha((0.7 * 255).round())
: Colors.white70,
),
),
Expand Down
27 changes: 9 additions & 18 deletions lib/src/ui/screens/receive_screen.dart
Original file line number Diff line number Diff line change
@@ -1,30 +1,28 @@
import 'package:ark_flutter/src/rust/api/ark_api.dart';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:flutter/rendering.dart';
import 'package:ark_flutter/src/logger/logger.dart';
import 'package:flutter/services.dart';
import 'package:qr_flutter/qr_flutter.dart';
import 'package:share_plus/share_plus.dart';
import 'dart:async';
import 'dart:io';
import 'dart:typed_data';
import 'dart:ui' as ui;
import 'package:path_provider/path_provider.dart';

class ReceiveScreen extends StatefulWidget {
final String aspId;

const ReceiveScreen({
Key? key,
super.key,
required this.aspId,
}) : super(key: key);
});

@override
_ReceiveScreenState createState() => _ReceiveScreenState();
ReceiveScreenState createState() => ReceiveScreenState();
}

class _ReceiveScreenState extends State<ReceiveScreen> {
bool _isLoading = true;
class ReceiveScreenState extends State<ReceiveScreen> {
String? _error;

String _bip21Address = "";
Expand All @@ -34,14 +32,14 @@ class _ReceiveScreenState extends State<ReceiveScreen> {
bool _showCopyMenu = false;

// Track which addresses have been copied (for showing checkmarks)
Map<String, bool> _copiedAddresses = {
final Map<String, bool> _copiedAddresses = {
'BIP21': false,
'BTC': false,
'Ark': false,
};

// Timers for resetting the checkmarks
Map<String, Timer?> _checkmarkTimers = {
final Map<String, Timer?> _checkmarkTimers = {
'BIP21': null,
'BTC': null,
'Ark': null,
Expand All @@ -54,9 +52,6 @@ class _ReceiveScreenState extends State<ReceiveScreen> {
}

Future<void> _fetchAddresses() async {
setState(() {
_isLoading = true;
});
try {
final addresses = await address();
setState(() {
Expand All @@ -69,11 +64,7 @@ class _ReceiveScreenState extends State<ReceiveScreen> {
setState(() {
_error = e.toString();
});
} finally {
setState(() {
_isLoading = false;
});
}
} finally {}
}

@override
Expand Down Expand Up @@ -121,7 +112,7 @@ class _ReceiveScreenState extends State<ReceiveScreen> {
logger.i("Copied $type address: $address");
}

GlobalKey _qrKey = GlobalKey();
final GlobalKey _qrKey = GlobalKey();

Future<void> _handleShare() async {
try {
Expand Down
9 changes: 4 additions & 5 deletions lib/src/ui/screens/send_screen.dart
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:ark_flutter/src/logger/logger.dart';
import 'package:ark_flutter/src/ui/screens/sign_transaction_screen.dart';

Expand All @@ -8,16 +7,16 @@ class SendScreen extends StatefulWidget {
final double availableSats;

const SendScreen({
Key? key,
super.key,
required this.aspId,
required this.availableSats,
}) : super(key: key);
});

@override
_SendScreenState createState() => _SendScreenState();
SendScreenState createState() => SendScreenState();
}

class _SendScreenState extends State<SendScreen> {
class SendScreenState extends State<SendScreen> {
final TextEditingController _addressController = TextEditingController();
final TextEditingController _amountController = TextEditingController();
double _usdAmount = 0.0;
Expand Down
13 changes: 6 additions & 7 deletions lib/src/ui/screens/settings_screen.dart
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
import 'package:ark_flutter/src/rust/api/ark_api.dart';
import 'package:ark_flutter/src/ui/screens/onboarding_screen.dart';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:ark_flutter/src/logger/logger.dart';
Expand All @@ -11,15 +10,15 @@ class SettingsScreen extends StatefulWidget {
final String aspId;

const SettingsScreen({
Key? key,
super.key,
required this.aspId,
}) : super(key: key);
});

@override
_SettingsScreenState createState() => _SettingsScreenState();
SettingsScreenState createState() => SettingsScreenState();
}

class _SettingsScreenState extends State<SettingsScreen> {
class SettingsScreenState extends State<SettingsScreen> {
String _nsec = 'Unknown';
Info? _info;
String _selectedNetwork = 'Regtest';
Expand Down Expand Up @@ -496,7 +495,7 @@ class _SettingsScreenState extends State<SettingsScreen> {
color: Colors.red),
onTap: _showResetWalletDialog,
),
], borderColor: Colors.red.withOpacity(0.3)),
], borderColor: Colors.red.withAlpha((0.3 * 255).round())),

const SizedBox(height: 40),
],
Expand Down Expand Up @@ -551,7 +550,7 @@ class _SettingsScreenState extends State<SettingsScreen> {
} else {
return child;
}
}).toList(),
}),
],
),
);
Expand Down
Loading
Loading