Skip to content

Commit cff9289

Browse files
committed
apply ui tweaks
1 parent 7985dcb commit cff9289

File tree

5 files changed

+68
-50
lines changed

5 files changed

+68
-50
lines changed

apps/postgres-new/app/db/[id]/page.tsx

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ import Workspace from '~/components/workspace'
88
export default function Page({ params }: { params: { id: string } }) {
99
const databaseId = params.id
1010
const router = useRouter()
11-
const { dbManager, shareDatabase } = useApp()
11+
const { dbManager, connectedDatabase } = useApp()
1212

1313
useEffect(() => {
1414
async function run() {
@@ -25,12 +25,12 @@ export default function Page({ params }: { params: { id: string } }) {
2525
run()
2626
}, [dbManager, databaseId, router])
2727

28-
// Cleanup shared database when switching databases
28+
// Cleanup connected database when switching databases
2929
useEffect(() => {
30-
if (shareDatabase.isSharing && shareDatabase.databaseId !== databaseId) {
31-
shareDatabase.stop()
30+
if (connectedDatabase.isConnected && connectedDatabase.databaseId !== databaseId) {
31+
connectedDatabase.disconnect()
3232
}
33-
}, [shareDatabase, databaseId])
33+
}, [connectedDatabase, databaseId])
3434

3535
return <Workspace databaseId={databaseId} visibility="local" />
3636
}

apps/postgres-new/components/app-provider.tsx

Lines changed: 17 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -105,9 +105,9 @@ export default function AppProvider({ children }: AppProps) {
105105
return await dbManager.getRuntimePgVersion()
106106
}, [dbManager])
107107

108-
const [sharedDatabaseId, setSharedDatabaseId] = useState<string | null>(null)
108+
const [connectedDatabaseId, setConnectedDatabaseId] = useState<string | null>(null)
109109
const [ws, setWs] = useState<WebSocket | null>(null)
110-
const startSharingDatabase = useCallback(
110+
const connectDatabase = useCallback(
111111
async (databaseId: string) => {
112112
if (!dbManager) {
113113
throw new Error('dbManager is not available')
@@ -122,43 +122,43 @@ export default function AppProvider({ children }: AppProps) {
122122
ws.binaryType = 'arraybuffer'
123123

124124
ws.onopen = () => {
125-
setSharedDatabaseId(databaseId)
125+
setConnectedDatabaseId(databaseId)
126126
}
127127
ws.onmessage = async (event) => {
128128
const message = new Uint8Array(await event.data)
129129
const response = await db.execProtocolRaw(message)
130130
ws.send(response)
131131
}
132132
ws.onclose = (event) => {
133-
setSharedDatabaseId(null)
133+
setConnectedDatabaseId(null)
134134
}
135135
ws.onerror = (error) => {
136136
console.error('webSocket error:', error)
137-
setSharedDatabaseId(null)
137+
setConnectedDatabaseId(null)
138138
}
139139

140140
setWs(ws)
141141
},
142142
[dbManager]
143143
)
144-
const stopSharingDatabase = useCallback(() => {
144+
const disconnectDatabase = useCallback(() => {
145145
ws?.close()
146146
setWs(null)
147-
setSharedDatabaseId(null)
147+
setConnectedDatabaseId(null)
148148
}, [ws])
149-
const shareDatabase = {
150-
start: startSharingDatabase,
151-
stop: stopSharingDatabase,
152-
databaseId: sharedDatabaseId,
153-
isSharing: Boolean(sharedDatabaseId),
149+
const connectedDatabase = {
150+
connect: connectDatabase,
151+
disconnect: disconnectDatabase,
152+
databaseId: connectedDatabaseId,
153+
isConnected: Boolean(connectedDatabaseId),
154154
}
155155

156156
return (
157157
<AppContext.Provider
158158
value={{
159159
user,
160160
isLoadingUser,
161-
shareDatabase,
161+
connectedDatabase,
162162
signIn,
163163
signOut,
164164
isSignInDialogOpen,
@@ -195,11 +195,11 @@ export type AppContextValues = {
195195
dbManager?: DbManager
196196
pgliteVersion?: string
197197
pgVersion?: string
198-
shareDatabase: {
199-
start: (databaseId: string) => Promise<void>
200-
stop: () => void
198+
connectedDatabase: {
199+
connect: (databaseId: string) => Promise<void>
200+
disconnect: () => void
201201
databaseId: string | null
202-
isSharing: boolean
202+
isConnected: boolean
203203
}
204204
}
205205

apps/postgres-new/components/chat.tsx

Lines changed: 16 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
import { Message, generateId } from 'ai'
44
import { useChat } from 'ai/react'
55
import { AnimatePresence, m } from 'framer-motion'
6-
import { ArrowDown, ArrowUp, Flame, Paperclip, Square } from 'lucide-react'
6+
import { ArrowDown, ArrowUp, Flame, Paperclip, Square, WifiOff } from 'lucide-react'
77
import {
88
ChangeEvent,
99
FormEventHandler,
@@ -49,7 +49,7 @@ export function getInitialMessages(tables: TablesData): Message[] {
4949
}
5050

5151
export default function Chat() {
52-
const { user, isLoadingUser, focusRef, setIsSignInDialogOpen, isRateLimited, shareDatabase } =
52+
const { user, isLoadingUser, focusRef, setIsSignInDialogOpen, isRateLimited, connectedDatabase } =
5353
useApp()
5454
const [inputFocusState, setInputFocusState] = useState(false)
5555

@@ -198,7 +198,7 @@ export default function Chat() {
198198
const [isMessageAnimationComplete, setIsMessageAnimationComplete] = useState(false)
199199

200200
const isChatEnabled =
201-
!isLoadingMessages && !isLoadingSchema && user !== undefined && !shareDatabase.isSharing
201+
!isLoadingMessages && !isLoadingSchema && user !== undefined && !connectedDatabase.isConnected
202202

203203
const isSubmitEnabled = isChatEnabled && Boolean(input.trim())
204204

@@ -240,29 +240,31 @@ export default function Chat() {
240240
className={cn(
241241
'h-full flex flex-col items-center overflow-y-auto',
242242
!isMessageAnimationComplete ? 'overflow-x-hidden' : undefined,
243-
shareDatabase.isSharing ? 'overflow-y-hidden' : undefined
243+
connectedDatabase.isConnected ? 'overflow-y-hidden' : undefined
244244
)}
245245
ref={scrollRef}
246246
>
247-
{shareDatabase.isSharing && (
247+
{connectedDatabase.isConnected && (
248248
<div className="h-full w-full max-w-4xl flex flex-col gap-10 p-10 absolute backdrop-blur-sm bg-card/90">
249249
<div className="flex items-center justify-center h-full flex-col gap-y-5">
250+
<div className="w-full text-left">
251+
<p className="text-lg">Access your in-browser database</p>
252+
<p className="text-xs text-muted-foreground">
253+
Closing the window will disconnect your database
254+
</p>
255+
</div>
250256
<CopyableField
251-
label="Database URL"
252-
value={`postgres://postgres@${shareDatabase.databaseId}.${process.env.NEXT_PUBLIC_BROWSER_PROXY_DOMAIN}/postgres?sslmode=require`}
257+
value={`postgres://postgres@${connectedDatabase.databaseId}.${process.env.NEXT_PUBLIC_BROWSER_PROXY_DOMAIN}/postgres?sslmode=require`}
253258
/>
254259
<Button
255-
className="w-full"
260+
className="w-full gap-2"
256261
variant="outline"
257262
onClick={() => {
258-
shareDatabase.stop()
263+
connectedDatabase.disconnect()
259264
}}
260265
>
261-
<span className="relative flex h-3 w-3 mr-2">
262-
<span className="animate-ping absolute inline-flex h-full w-full rounded-full bg-primary opacity-75"></span>
263-
<span className="relative inline-flex rounded-full h-3 w-3 bg-primary"></span>
264-
</span>{' '}
265-
Stop sharing
266+
<WifiOff className="h-[1.2rem] w-[1.2rem]" />
267+
<span>Disconnect database</span>
266268
</Button>
267269
</div>
268270
</div>

apps/postgres-new/components/copyable-field.tsx

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,16 +4,16 @@ import { Button } from '~/components/ui/button'
44
import { Input } from '~/components/ui/input'
55
import { Label } from '~/components/ui/label'
66

7-
export function CopyableField(props: { label: string; value: string; disableCopy?: boolean }) {
7+
export function CopyableField(props: { label?: string; value: string; disableCopy?: boolean }) {
88
return (
99
<div className="flex flex-col space-y-2 w-full">
10-
<Label className="whitespace-nowrap">{props.label}</Label>
10+
{props.label && <Label className="whitespace-nowrap">{props.label}</Label>}
1111
<CopyableInput value={props.value} disableCopy={props.disableCopy} />
1212
</div>
1313
)
1414
}
1515

16-
function CopyableInput(props: { value: string; disableCopy?: boolean }) {
16+
export function CopyableInput(props: { value: string; disableCopy?: boolean }) {
1717
const [isCopying, setIsCopying] = useState(false)
1818

1919
function handleCopy(value: string) {

apps/postgres-new/components/sidebar.tsx

Lines changed: 27 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ import {
4141
DropdownMenuSeparator,
4242
DropdownMenuTrigger,
4343
} from './ui/dropdown-menu'
44+
import { TooltipPortal } from '@radix-ui/react-tooltip'
4445

4546
export default function Sidebar() {
4647
const { user, signOut, focusRef, isSignInDialogOpen, setIsSignInDialogOpen } = useApp()
@@ -276,7 +277,7 @@ type DatabaseMenuItemProps = {
276277

277278
function DatabaseMenuItem({ database, isActive }: DatabaseMenuItemProps) {
278279
const router = useRouter()
279-
const { user, dbManager, shareDatabase } = useApp()
280+
const { user, dbManager, connectedDatabase } = useApp()
280281
const [isPopoverOpen, setIsPopoverOpen] = useState(false)
281282
const { mutateAsync: deleteDatabase } = useDatabaseDeleteMutation()
282283
const { mutateAsync: updateDatabase } = useDatabaseUpdateMutation()
@@ -350,6 +351,21 @@ function DatabaseMenuItem({ database, isActive }: DatabaseMenuItemProps) {
350351
)}
351352
href={`/db/${database.id}`}
352353
>
354+
{isActive && connectedDatabase.isConnected && (
355+
<Tooltip>
356+
<TooltipTrigger asChild>
357+
<span className="relative flex h-2.5 w-2.5">
358+
<span className="animate-ping absolute inline-flex h-full w-full rounded-full bg-primary opacity-75"></span>
359+
<span className="relative inline-flex rounded-full h-2.5 w-2.5 bg-primary"></span>
360+
</span>
361+
</TooltipTrigger>
362+
<TooltipPortal>
363+
<TooltipContent side="bottom">
364+
<p>Connected</p>
365+
</TooltipContent>
366+
</TooltipPortal>
367+
</Tooltip>
368+
)}
353369
<span className="text-nowrap grow truncate">{database.name ?? 'My database'}</span>
354370
<DropdownMenu
355371
modal={false}
@@ -468,7 +484,7 @@ function DatabaseMenuItem({ database, isActive }: DatabaseMenuItemProps) {
468484
/>
469485
<span>Deploy</span>
470486
</DropdownMenuItem>
471-
<ShareMenuItem
487+
<ConnectMenuItem
472488
databaseId={database.id}
473489
isActive={isActive}
474490
setIsPopoverOpen={setIsPopoverOpen}
@@ -502,33 +518,33 @@ function DatabaseMenuItem({ database, isActive }: DatabaseMenuItemProps) {
502518
)
503519
}
504520

505-
type ShareMenuItemProps = {
521+
type ConnectMenuItemProps = {
506522
databaseId: string
507523
isActive: boolean
508524
setIsPopoverOpen: (open: boolean) => void
509525
}
510526

511-
function ShareMenuItem(props: ShareMenuItemProps) {
512-
const { shareDatabase } = useApp()
527+
function ConnectMenuItem(props: ConnectMenuItemProps) {
528+
const { connectedDatabase } = useApp()
513529

514-
// Only show the share menu item on fully loaded dashboard
530+
// Only show the connect menu item on fully loaded dashboard
515531
if (!props.isActive) {
516532
return null
517533
}
518534

519-
if (!shareDatabase.isSharing) {
535+
if (!connectedDatabase.isConnected) {
520536
return (
521537
<DropdownMenuItem
522-
disabled={shareDatabase.isSharing}
538+
disabled={connectedDatabase.isConnected}
523539
className="bg-inherit justify-start hover:bg-neutral-200 flex gap-3"
524540
onClick={async (e) => {
525541
e.preventDefault()
526-
shareDatabase.start(props.databaseId)
542+
connectedDatabase.connect(props.databaseId)
527543
props.setIsPopoverOpen(false)
528544
}}
529545
>
530546
<WifiIcon size={16} strokeWidth={2} className="flex-shrink-0 text-muted-foreground" />
531-
<span>Share</span>
547+
<span>Connect</span>
532548
</DropdownMenuItem>
533549
)
534550
}
@@ -538,7 +554,7 @@ function ShareMenuItem(props: ShareMenuItemProps) {
538554
className="bg-inherit justify-start hover:bg-neutral-200 flex gap-3"
539555
onClick={async (e) => {
540556
e.preventDefault()
541-
shareDatabase.stop()
557+
connectedDatabase.disconnect()
542558
props.setIsPopoverOpen(false)
543559
}}
544560
>

0 commit comments

Comments
 (0)