Skip to content
Open
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
6 changes: 6 additions & 0 deletions owner-portal/.env.example
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
# Privy Authentication
# Get your App ID from https://console.privy.io
VITE_PRIVY_APP_ID=your-privy-app-id-here

# Backend URL
VITE_BACKEND_URL=http://localhost:5000
38 changes: 38 additions & 0 deletions owner-portal/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
# LensMint Owner Portal

Web dashboard for LensMint camera owners to manage
their device, NFTs, and wallet.

## Tech Stack
- React + Vite
- Privy (wallet authentication)
- Wagmi + Viem (blockchain interaction)
- TanStack Query

## Prerequisites
- Node.js v18+
- A Privy account → https://console.privy.io

## Setup

### 1. Install dependencies
\```bash
npm install --legacy-peer-deps
\```

### 2. Configure environment
\```bash
cp .env.example .env
\```
Edit `.env` and add your Privy App ID from https://console.privy.io

### 3. Start development server
\```bash
npm run dev
\```
Portal runs at http://localhost:3000

## Known Issues
- Use `--legacy-peer-deps` flag during install due to peer
dependency conflicts between @privy-io packages
- Disable Solana in Privy console if you see Solana connector warnings
52 changes: 28 additions & 24 deletions owner-portal/src/App.jsx
Original file line number Diff line number Diff line change
@@ -1,39 +1,43 @@
import { PrivyProvider } from '@privy-io/react-auth'
import { createPrivyWagmiConfig } from '@privy-io/wagmi'
import { WagmiProvider } from 'wagmi'
import { createConfig, WagmiProvider } from '@privy-io/wagmi'
import { QueryClient, QueryClientProvider } from '@tanstack/react-query'
import { sepolia } from 'wagmi/chains'
import { http } from 'viem'
import { sepolia } from 'viem/chains'
import OwnerDashboard from './components/OwnerDashboard'

const PRIVY_APP_ID = import.meta.env.VITE_PRIVY_APP_ID || 'your-privy-app-id'

const queryClient = new QueryClient()
const wagmiConfig = createPrivyWagmiConfig({

const wagmiConfig = createConfig({
chains: [sepolia],
transports: {
[sepolia.id]: http(),
},
})

function App() {
return (
<PrivyProvider
appId={PRIVY_APP_ID}
config={{
loginMethods: ['wallet', 'email', 'sms'],
appearance: {
theme: 'light',
accentColor: '#667eea',
},
embeddedWallets: {
createOnLogin: 'users-without-wallets',
},
}}
>
<WagmiProvider config={wagmiConfig}>
<QueryClientProvider client={queryClient}>
<QueryClientProvider client={queryClient}>
<PrivyProvider
appId={PRIVY_APP_ID}
config={{
loginMethods: ['wallet', 'email'],
appearance: {
theme: 'light',
accentColor: '#667eea',
},
embeddedWallets: {
createOnLogin: 'users-without-wallets',
},
}}
>
<WagmiProvider config={wagmiConfig}>
<OwnerDashboard />
</QueryClientProvider>
</WagmiProvider>
</PrivyProvider>
</WagmiProvider>
</PrivyProvider>
</QueryClientProvider>
)
}

export default App

export default App
Loading