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

[AppKit] Social Login #5

Merged
merged 24 commits into from
Oct 14, 2024
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
4 changes: 4 additions & 0 deletions packages/reown_appkit/CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,7 @@
## 1.1.0-beta01

- Social Logins

## 1.0.1

- Updated Coinbase Wallet SDK to support Android Gradle Plugin 8
Expand Down
1 change: 1 addition & 0 deletions packages/reown_appkit/analysis_options.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@ linter:
sort_pub_dependencies: true
avoid_unnecessary_containers: true
cancel_subscriptions: true
public_member_api_docs: false

analyzer:
exclude:
Expand Down
10 changes: 10 additions & 0 deletions packages/reown_appkit/dart_dependency_validator.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
# dart_dependency_validator.yaml

# Set true if you allow pinned packages in your project.
# allow_pins: true
# Exclude one or more paths from being scanned. Supports glob syntax.
exclude:
- 'example/**' # Glob's are supported
# Ignore one or more packages.
# ignore:
# - analyzer
Original file line number Diff line number Diff line change
Expand Up @@ -52,8 +52,8 @@
<package android:name="com.walletconnect.flutterwallet.internal"/>
<package android:name="com.walletconnect.web3wallet.rnsample"/>
<package android:name="com.walletconnect.web3wallet.rnsample.internal"/>
<package android:name="com.walletconnect.sample.wallet"/>
<package android:name="com.walletconnect.sample.wallet.internal"/>
<package android:name="com.reown.sample.wallet"/>
<package android:name="com.reown.sample.wallet.internal"/>
</queries>
<uses-permission android:name="android.permission.INTERNET" />
<application
Expand Down Expand Up @@ -83,56 +83,44 @@
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.VIEW" />

<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />

<data android:scheme="wcflutterdapp" />
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.VIEW" />

<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />

<data android:scheme="wcflutterdapp-internal" />
</intent-filter>
<intent-filter android:autoVerify="true">
<action android:name="android.intent.action.VIEW" />

<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />

<data android:scheme="https" />
<data android:host="lab.web3modal.com" />
<data android:pathPattern="/flutter_appkit" />
</intent-filter>
<intent-filter android:autoVerify="true">
<action android:name="android.intent.action.VIEW" />

<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />

<data android:scheme="https" />
<data android:host="dev.lab.web3modal.com" />
<data android:pathPattern="/flutter_appkit_internal" />
</intent-filter>
<intent-filter android:autoVerify="true">
<action android:name="android.intent.action.VIEW" />

<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />

<data android:scheme="https" />
<data android:host="appkit-lab.reown.com" />
<data android:pathPattern="/flutter_appkit" />
</intent-filter>
<intent-filter android:autoVerify="true">
<action android:name="android.intent.action.VIEW" />

<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />

<data android:scheme="https" />
<data android:host="appkit-lab.reown.com" />
<data android:pathPattern="/flutter_appkit_internal" />
Expand Down
43 changes: 37 additions & 6 deletions packages/reown_appkit/example/base/lib/main.dart
Original file line number Diff line number Diff line change
Expand Up @@ -124,11 +124,40 @@ class _MyHomePageState extends State<MyHomePage> {
_appKit!.onSessionConnect.subscribe(_onSessionConnect);
_appKit!.onSessionAuthResponse.subscribe(_onSessionAuthResponse);

// See https://docs.reown.com/appkit/flutter/core/custom-chains
final testNetworks = ReownAppKitModalNetworks.test['eip155'] ?? [];
ReownAppKitModalNetworks.addNetworks('eip155', testNetworks);

_appKitModal = ReownAppKitModal(
context: context,
appKit: _appKit,
siweConfig: _siweConfig(),
enableEmail: true,
enableAnalytics: true,
featuresConfig: FeaturesConfig(
email: true,
socials: [
AppKitSocialOption.Farcaster,
AppKitSocialOption.X,
AppKitSocialOption.Apple,
AppKitSocialOption.Discord,
],
showMainWallets: false,
),
// requiredNamespaces: {},
// optionalNamespaces: {},
// includedWalletIds: {},
featuredWalletIds: {
'fd20dc426fb37566d803205b19bbc1d4096b248ac04548e3cfb6b3a38bd033aa', // Coinbase
'18450873727504ae9315a084fa7624b5297d2fe5880f0982979c17345a138277', // Kraken Wallet
'c57ca95b47569778a828d19178114f4db188b89b763c899ba0be274e97267d96', // Metamask
'1ae92b26df02f0abca6304df07debccd18262fdf5fe82daa81593582dac9a369', // Rainbow
'c03dfee351b6fcc421b4494ea33b9d4b92a984f87aa76d1663bb28705e95034a', // Uniswap
'38f5d18bd8522c244bdd70cb4a68e0e718865155811c043f052fb9f1c51de662', // Bitget
},
// excludedWalletIds: {
// 'fd20dc426fb37566d803205b19bbc1d4096b248ac04548e3cfb6b3a38bd033aa', // Coinbase
// },
// MORE WALLETS https://explorer.walletconnect.com/?type=wallet&chains=eip155%3A1
);

_appKitModal!.onModalConnect.subscribe(_onModalConnect);
Expand Down Expand Up @@ -162,12 +191,12 @@ class _MyHomePageState extends State<MyHomePage> {
icon: Icons.home,
),
PageData(
page: PairingsPage(appKit: _appKit!),
page: PairingsPage(appKitModal: _appKitModal!),
title: StringConstants.pairingsPageTitle,
icon: Icons.vertical_align_center_rounded,
),
PageData(
page: SessionsPage(appKit: _appKit!),
page: SessionsPage(appKitModal: _appKitModal!),
title: StringConstants.sessionsPageTitle,
icon: Icons.workspaces_filled,
),
Expand Down Expand Up @@ -249,8 +278,9 @@ class _MyHomePageState extends State<MyHomePage> {
super.dispose();
}

void _logListener(LogEvent event) {
if (event.level == Level.debug) {
void _logListener(event) {
if ('${event.level}' == 'Level.debug' ||
'${event.level}' == 'Level.error') {
// TODO send to mixpanel
log('${event.message}');
} else {
Expand Down Expand Up @@ -462,11 +492,12 @@ class _MyHomePageState extends State<MyHomePage> {
);

void _onModalConnect(ModalConnect? event) async {
setState(() {});
debugPrint('[ExampleApp] _onModalConnect ${event?.session.toJson()}');
setState(() {});
}

void _onModalUpdate(ModalConnect? event) {
debugPrint('[ExampleApp] _onModalUpdate ${event?.session.toJson()}');
setState(() {});
}

Expand Down
70 changes: 68 additions & 2 deletions packages/reown_appkit/example/base/lib/pages/connect_page.dart
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ import 'package:reown_appkit_dapp/utils/crypto/solana.dart';
import 'package:reown_appkit_dapp/utils/sample_wallets.dart';
import 'package:reown_appkit_dapp/utils/string_constants.dart';
import 'package:reown_appkit_dapp/widgets/chain_button.dart';
import 'package:reown_appkit_dapp/widgets/method_dialog.dart';

class ConnectPage extends StatefulWidget {
const ConnectPage({
Expand All @@ -36,6 +37,12 @@ class ConnectPageState extends State<ConnectPage> {
@override
void initState() {
super.initState();
widget.appKitModal.onModalConnect.subscribe(_onModalConnect);
widget.appKitModal.onModalUpdate.subscribe(_onModalUpdate);
widget.appKitModal.onModalNetworkChange.subscribe(_onModalNetworkChange);
widget.appKitModal.onModalDisconnect.subscribe(_onModalDisconnect);
widget.appKitModal.onModalError.subscribe(_onModalError);
//
widget.appKitModal.appKit!.onSessionConnect.subscribe(
_onSessionConnect,
);
Expand All @@ -49,6 +56,11 @@ class ConnectPageState extends State<ConnectPage> {

@override
void dispose() {
widget.appKitModal.onModalConnect.unsubscribe(_onModalConnect);
widget.appKitModal.onModalUpdate.unsubscribe(_onModalUpdate);
widget.appKitModal.onModalNetworkChange.unsubscribe(_onModalNetworkChange);
widget.appKitModal.onModalDisconnect.unsubscribe(_onModalDisconnect);
widget.appKitModal.onModalError.unsubscribe(_onModalError);
widget.appKitModal.onModalDisconnect.unsubscribe(
_onModalDisconnect,
);
Expand Down Expand Up @@ -192,8 +204,14 @@ class ConnectPageState extends State<ConnectPage> {
const SizedBox(height: StyleConstants.linear8),
Visibility(
visible: widget.appKitModal.isConnected,
child: AppKitModalAccountButton(
appKit: widget.appKitModal,
child: Column(
children: [
AppKitModalAccountButton(
appKit: widget.appKitModal,
),
const SizedBox.square(dimension: 8.0),
...(_buildRequestButtons()),
],
),
),
const SizedBox(height: StyleConstants.linear8),
Expand Down Expand Up @@ -408,6 +426,38 @@ class ConnectPageState extends State<ConnectPage> {
);
}

List<Widget> _buildRequestButtons() {
return widget.appKitModal.getApprovedMethods()?.map((method) {
final topic = widget.appKitModal.session!.topic ?? '';
final chainId = widget.appKitModal.selectedChain!.chainId;
final address = widget.appKitModal.session!.address!;
final requestParams = EIP155.getParams(method, address);
final enabled = requestParams != null;
return Container(
height: 40.0,
width: double.infinity,
margin: const EdgeInsets.symmetric(
vertical: StyleConstants.linear8,
),
child: ElevatedButton(
onPressed: enabled
? () {
widget.appKitModal.launchConnectedWallet();
final future = widget.appKitModal.request(
topic: topic,
chainId: chainId,
request: requestParams,
);
MethodDialog.show(context, method, future);
}
: null,
child: Text(method),
),
);
}).toList() ??
[];
}

Future<void> _onConnect({
required String nativeLink,
VoidCallback? closeModal,
Expand Down Expand Up @@ -559,10 +609,26 @@ class ConnectPageState extends State<ConnectPage> {
}
}

void _onModalConnect(ModalConnect? event) async {
setState(() {});
}

void _onModalUpdate(ModalConnect? event) {
setState(() {});
}

void _onModalNetworkChange(ModalNetworkChange? event) {
setState(() {});
}

void _onModalDisconnect(ModalDisconnect? event) {
setState(() {});
}

void _onModalError(ModalError? event) {
setState(() {});
}

ButtonStyle get _buttonStyle => ButtonStyle(
backgroundColor: MaterialStateProperty.resolveWith<Color>(
(states) {
Expand Down
27 changes: 16 additions & 11 deletions packages/reown_appkit/example/base/lib/pages/pairings_page.dart
Original file line number Diff line number Diff line change
Expand Up @@ -8,37 +8,42 @@ import 'package:reown_appkit_dapp/widgets/pairing_item.dart';
class PairingsPage extends StatefulWidget {
const PairingsPage({
super.key,
required this.appKit,
required this.appKitModal,
});

final ReownAppKit appKit;
final ReownAppKitModal appKitModal;

@override
PairingsPageState createState() => PairingsPageState();
}

class PairingsPageState extends State<PairingsPage> {
List<PairingInfo> _pairings = [];
late IReownAppKit _appKit;

@override
void initState() {
_pairings = widget.appKit.pairings.getAll();
// widget.appKit.onSessionDelete.subscribe(_onSessionDelete);
widget.appKit.core.pairing.onPairingDelete.subscribe(_onPairingDelete);
widget.appKit.core.pairing.onPairingExpire.subscribe(_onPairingDelete);
_appKit = widget.appKitModal.appKit!;
_pairings = _appKit.pairings.getAll();
_appKit.core.pairing.onPairingDelete.subscribe(_onPairingDelete);
_appKit.core.pairing.onPairingExpire.subscribe(_onPairingDelete);
super.initState();
}

@override
void dispose() {
// widget.appKit.onSessionDelete.unsubscribe(_onSessionDelete);
widget.appKit.core.pairing.onPairingDelete.unsubscribe(_onPairingDelete);
widget.appKit.core.pairing.onPairingExpire.unsubscribe(_onPairingDelete);
_appKit.core.pairing.onPairingDelete.unsubscribe(_onPairingDelete);
_appKit.core.pairing.onPairingExpire.unsubscribe(_onPairingDelete);
super.dispose();
}

@override
Widget build(BuildContext context) {
if (_pairings.isEmpty) {
return Center(
child: Text('No relay pairings'),
);
}
final List<PairingItem> pairingItems = _pairings
.map(
(PairingInfo pairing) => PairingItem(
Expand Down Expand Up @@ -71,7 +76,7 @@ class PairingsPageState extends State<PairingsPage> {
),
onPressed: () async {
try {
widget.appKit.core.pairing.disconnect(
_appKit.core.pairing.disconnect(
topic: pairing.topic,
);
Navigator.of(context).pop();
Expand Down Expand Up @@ -104,7 +109,7 @@ class PairingsPageState extends State<PairingsPage> {

void _onPairingDelete(PairingEvent? event) {
setState(() {
_pairings = widget.appKit.pairings.getAll();
_pairings = _appKit.pairings.getAll();
});
}
}
Loading
Loading