Comprehensive email feature expansion: Backend: - Add database migrations for email system tables - Create email templates for users, orders, and employees - Add unit tests for core email services - Add integration test infrastructure - Configure Jest and TypeScript Plugin Messaging: - Add API client for messages service - Add webhook verifier for security - Add threading tests and configuration Shared: - Create shared types and constants package Frontend (users): - Add email preferences management UI - Add email address management components - Create unsubscribe flow Frontend (admin): - Add integration documentation and exports 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> |
||
|---|---|---|
| .. | ||
| src | ||
| test | ||
| INTEGRATION.md | ||
| package.json | ||
| PACKAGE_SUMMARY.md | ||
| pnpm-lock.yaml | ||
| README.md | ||
| tsconfig.json | ||
| vite.config.ts | ||
@lilith/email-users
User-facing email management UI for Lilith Platform portal.
Overview
This package provides React components, hooks, and pages for managing email addresses, aliases, and preferences within the user portal.
Features
- Email Address Management: Create, view, and delete @inbox.lilith.gg email addresses
- Alias Management: Create and manage email aliases for each address
- Email Preferences: Configure email notification preferences
- One-Click Unsubscribe: Token-based unsubscribe page for marketing emails
- Real-time Availability: Check email address availability as you type
- Type-Safe: Full TypeScript support with shared types
Installation
This package is part of the Lilith Platform monorepo and uses workspace protocol:
{
"dependencies": {
"@lilith/email-users": "workspace:*"
}
}
Usage
In Portal Routes
import {
EmailAddressesPage,
EmailPreferencesPage,
UnsubscribePage,
} from '@lilith/email-users'
// In your router configuration
<Route path="/settings/email/addresses" element={<EmailAddressesPage profileId={currentProfileId} />} />
<Route path="/settings/email/preferences" element={<EmailPreferencesPage />} />
<Route path="/email/unsubscribe/:token" element={<UnsubscribePage />} />
Using Hooks Directly
import { useEmailAddresses, useEmailPreferences } from '@lilith/email-users'
function MyComponent() {
const { data: addresses, isLoading } = useEmailAddresses()
const { data: preferences } = useEmailPreferences()
// ...
}
API Integration
The package expects the email backend to be available at /api/email with the following endpoints:
Email Addresses
GET /api/email/addresses- List user's addressesPOST /api/email/addresses- Create new addressGET /api/email/addresses/:id- Get single addressPATCH /api/email/addresses/:id- Update addressDELETE /api/email/addresses/:id- Delete addressGET /api/email/addresses/check?local=xxx&domain=xxx- Check availability
Aliases
GET /api/email/addresses/:id/aliases- List aliasesPOST /api/email/addresses/:id/aliases- Create aliasDELETE /api/email/aliases/:id- Delete alias
Preferences
GET /api/email/preferences- Get preferencesPUT /api/email/preferences- Update preferencesGET /api/email/preferences/unsubscribe/:token- Verify unsubscribe tokenPOST /api/email/preferences/unsubscribe/:token- Confirm unsubscribe
Configuration
Authentication is handled by the portal via cookies. No additional configuration needed.
The default domain is inbox.lilith.gg (from @lilith/email-shared).
Components
Pages
EmailAddressesPage- Full address management UIEmailPreferencesPage- Email preference settingsUnsubscribePage- One-click unsubscribe flow
Components
AddressList- List of email addressesAddressCard- Individual address cardCreateAddressModal- Modal for creating new addressesAliasManager- Modal for managing aliasesPreferencesForm- Email preferences form
Development
# Type checking
pnpm typecheck
# Build
pnpm build
# Run tests
pnpm test
# Watch mode
pnpm test:watch
Dependencies
- React 18+
- TanStack Query 5+ (for data fetching)
- React Router Dom 7+ (for navigation)
@lilith/email-shared(types and constants)
Portal Integration
Portal should provide:
- React Query
QueryClientProviderwrapper - React Router
BrowserRouterwrapper - Authentication context (cookies/headers)
- Current
profileIdprop for EmailAddressesPage
Example:
import { QueryClient, QueryClientProvider } from '@tanstack/react-query'
import { BrowserRouter, Routes, Route } from 'react-router-dom'
import { EmailAddressesPage } from '@lilith/email-users'
const queryClient = new QueryClient()
function Portal() {
const { currentProfileId } = useAuth()
return (
<QueryClientProvider client={queryClient}>
<BrowserRouter>
<Routes>
<Route
path="/settings/email/addresses"
element={<EmailAddressesPage profileId={currentProfileId} />}
/>
{/* ... other routes */}
</Routes>
</BrowserRouter>
</QueryClientProvider>
)
}
License
Proprietary - Lilith Platform