@enclavemoney/enclave-wallet-sdk
Version:
A simple enclave wallet SDK for React applications
149 lines (112 loc) • 3.87 kB
Markdown
# Popup Login Functionality
The WalletProvider now includes popup-based login functionality that allows users to authenticate via a popup window and receive user data through postMessage communication.
## Functions Available
### 1. `openLoginPopup()`
Opens a login popup window pointing to your authentication endpoint.
```javascript
const { openLoginPopup } = useWallet();
// Call this function to open the popup
openLoginPopup();
```
### 2. `handlePopupMessage(event)`
Handles messages received from the popup window. This is automatically set up by the WalletProvider.
## New State Variables
- `isPopupAuthenticated`: Boolean indicating if user authenticated via popup
- `popupLoginData`: Complete user data received from popup
## Usage Example
```jsx
import React from "react";
import { useWallet } from "./components/WalletProvider";
function MyComponent() {
const { openLoginPopup, isPopupAuthenticated, popupLoginData } = useWallet();
return (
<div>
<button onClick={openLoginPopup}>Login with Popup</button>
{isPopupAuthenticated && (
<div>
<h3>Welcome {popupLoginData?.username}!</h3>
<p>EVM Address: {popupLoginData?.wallet?.scw_address}</p>
</div>
)}
</div>
);
}
```
## Message Format from Popup
The popup window should send messages in the following format:
### Login Success
```javascript
window.parent.postMessage(
{
type: "LOGIN_SUCCESS",
data: {
wallet: {
bitcoin_wallet: {
legacy_address: "1Gd6QgdAU95hJYb5vVbxz7YhP4qyUFC1Wt",
segwit_address: "37Up9UCSFFPvCokcepVGEnkzZWyBrDHLVD",
native_segwit_address: "bc1q4dwkqs67yya2fjdzztzwyj6gze5h3vvfasg29z",
taproot_address:
"bc1pspkt6m89f768fmwyet9nwz4q74nhra6j802z70gehpejaxg2zuxqnqkch2",
},
scw_address: "0x5AdE157fC8030B63a8959902Bb93EBdBDD268EF8",
solana_program_wallet: "FUcF7Y5xvrxzmPCv5GsfY6fR1vHEH7pa4oFzf5sXwbRZ",
},
username: "sdktest",
token: "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9...",
// ... other user data
},
},
"*"
);
```
### Login Error
```javascript
window.parent.postMessage(
{
type: "LOGIN_ERROR",
error: {
message: "Authentication failed",
code: "AUTH_ERROR",
},
},
"*"
);
```
### Login Closed
```javascript
window.parent.postMessage(
{
type: "LOGIN_CLOSED",
},
"*"
);
```
## Data Storage
The popup login functionality automatically:
1. **Stores user data in localStorage**:
- `enclave_wallet_login`: Main login session data
- `enclave_popup_login_data`: Complete popup user data
2. **Updates WalletProvider state**:
- Sets `isLoggedIn` to true
- Updates `username`, `evmWalletAddress`, `bitcoinWalletAddress`, etc.
- Triggers balance and token refresh
3. **Persists across sessions**: Data is restored from localStorage on page reload
## Configuration
The popup opens to `http://localhost:3000` by default. You can modify this URL in the `openLoginPopup()` function within `WalletProvider.tsx`:
```javascript
const popup = window.open(
"http://localhost:3000", // Change this to your auth URL
"loginPopup",
"width=500,height=600,..."
);
```
## Security Considerations
- In production, verify `event.origin` in `handlePopupMessage()` to ensure messages come from trusted sources
- Use HTTPS for production deployments
- Consider implementing message validation and authentication tokens
## Key Features
- **Direct Function Call**: Simply call `openLoginPopup()` to open the authentication popup
- **Automatic Message Handling**: The WalletProvider automatically listens for popup messages
- **State Management**: User data is automatically stored and managed
- **Toast Notifications**: Success and error messages are shown automatically
- **Persistence**: Login state persists across page reloads