Database Adapters
Use server adapters when dismissal/read state must persist across devices.
Import adapters from featuredrop/adapters.
RemoteAdapter runs in the browser and talks to your API. Database adapters run on the server behind that API.
Remote contract
Your API usually supports:
GET /api/featuredrop/state->{ watermark, dismissedIds }POST /api/featuredrop/dismiss->{ featureId }POST /api/featuredrop/dismiss-all->{ watermark }
Example server implementations
app/api/featuredrop/state/route.ts
import { NextResponse } from 'next/server'
import { PostgresAdapter } from 'featuredrop/adapters'
import { Pool } from 'pg'
const pool = new Pool({ connectionString: process.env.DATABASE_URL })
function getAdapter(userId: string) {
return new PostgresAdapter({
userId,
query: (sql, params) => pool.query(sql, params as unknown[])
})
}
export async function GET() {
const userId = 'current-user-id'
const adapter = getAdapter(userId)
await adapter.sync()
return NextResponse.json({
watermark: adapter.getWatermark(),
dismissedIds: Array.from(adapter.getDismissedIds())
})
}Adapter contract
All DB adapters implement ServerStorageAdapter, so you can swap backends without changing React integration.