Files
supabase/packages/ui-patterns/SqlToRest/base-url-dialog.tsx
Greg RichardsonandCharis 3f1df65bba SQL to REST translator (#25978)
* feat: sql-to-rest poc

* feat: sql-to-supabase-js poc

* chore: upgrade to libpg-query@15

* feat: sql-to-rest docs tool

* docs(sql-to-rest): add introduction

* docs: wording improvements

* fix: theme

* chore: tailwind placeholder

* feat(sql-to-rest): limit, offset, and range

* feat(sql-to-rest): sort by

* fix(sql-to-rest): ui theme

* feat(sql-to-rest): casts

* feat(sql-to-rest): dynamic faqs in ui

* feat(sql-to-rest): improve ui responsiveness

* feat(sql-to-rest): more advanced faqs in ui

* feat(sql-to-rest): http and curl syntax highlighting

* feat(sql-to-rest): baseUrl in http/curl rendering

* docs(sql-to-rest): clarification on curl flags

* feat(sql-to-rest): more faqs

* refactor(sql-to-rest): split faqs into own file

* refactor(sql-to-rest): move formatters to sql-to-rest package

* docs(sql-to-rest): move page to new tools section

* feat(sql-to-rest): joins and resource embeddings

* chore(sql-to-rest): rename 'convert' to 'translate'

* feat(sql-to-rest): add faqs

* feat(sql-to-rest): ui improvements

* feat(sql-to-rest): faq title adjustment

* feat(sql-to-rest): link to client lib docs

* feat(sql-to-rest): assumptions

* feat(sql-to-rest): friendly 'not supported yet' errors

* feat(sql-to-rest): json columns

* feat(sql-to-rest): remove curl -G flag if unused

* feat(sql-to-rest): better error handling

* chore: revert accidental rls ai work

* fix: build errors

* fix(sql-to-rest): theme

* feat(sql-to-rest): change base url

* feat(sql-to-rest): basic aggregate poc

* feat(sql-to-rest): group by

* feat(sql-to-rest): more group by checks

* feat(sql-to-rest): count(*) special case

* fix(sql-to-rest): tests

* feat(sql-to-rest): faq on 'and' operator

* fix(sql-to-rest): error messages

* fix(sql-to-rest): multiple filters on same column

* refactor(sql-to-rest): error hints

* feat(sql-to-rest): match and imatch

* feat(sql-to-rest): in operator

* feat(sql-to-rest): parsing error hints

* feat(sql-to-rest): default language to curl

* feat(sql-to-rest): format on cmd+s

* feat(sql-to-rest): format initial value

* fix(sql-to-rest): turn off tab query group

* feat(sql-to-rest): improve wording in error messages

* feat(sql-to-rest): animated code blocks

* feat(sql-to-rest): more error hints

* fix(sql-to-rest): strip primary relation prefix from columns

* feat(sql-to-rest): json column in order by clause

* feat(sql-to-rest): validate all referenced relations exist in from clause

* refactor(sql-to-rest): split core sql-to-rest lib into separate repo

* feat(sql-to-rest): upgrade to v0.1.1

* feat(sql-to-rest): upgrade to v0.1.2

* feat(sql-to-rest): upgrade to v0.1.4

* chore: upgrade libpg-query

* feat: update 'create a pr' link

* fix: app builds

* fix: prettier

* fix: typecheck

* fix: studio tests

* chore: remove console.log

Co-authored-by: Charis <26616127+charislam@users.noreply.github.com>

* docs(sql-to-rest): remove broken link to client libraries

---------

Co-authored-by: Charis <26616127+charislam@users.noreply.github.com>
2024-05-22 12:37:01 -06:00

77 lines
2.1 KiB
TypeScript

import { useState } from 'react'
import { Alert } from 'ui/src/components/shadcn/ui/alert'
import { Button } from 'ui/src/components/shadcn/ui/button'
import {
Dialog,
DialogContent,
DialogDescription,
DialogFooter,
DialogHeader,
DialogTitle,
} from 'ui/src/components/shadcn/ui/dialog'
import { Input } from '../DataInputs/Input'
export type BaseUrlDialogProps = {
defaultValue?: string
onChange?: (value: string) => void
open?: boolean
onOpenChange?: (open: boolean) => void
}
export function BaseUrlDialog({ open, onOpenChange, defaultValue, onChange }: BaseUrlDialogProps) {
const [value, setValue] = useState(defaultValue ?? '')
const [error, setError] = useState<Error>()
return (
<Dialog
open={open}
onOpenChange={(open) => {
onOpenChange?.(open)
}}
>
<DialogContent className="sm:max-w-[425px]">
<DialogHeader className="pb-0">
<DialogTitle>Change base URL</DialogTitle>
<DialogDescription>
Change the base URL shown in the generated snippets.
</DialogDescription>
</DialogHeader>
<form
className="flex flex-col gap-4"
onSubmit={(e) => {
e.preventDefault()
try {
const baseUrl = new URL(value)
const newValue = (baseUrl.origin + baseUrl.pathname).replace(/\/+$/, '')
setValue(newValue)
onChange?.(newValue)
onOpenChange?.(false)
setError(undefined)
} catch (err) {
setError(new Error('Invalid URL'))
}
}}
>
<div className="px-7 flex flex-col gap-4">
<Input
value={value}
placeholder="https://example.com"
onChange={(e) => {
setValue(e.target.value)
}}
/>
{error && <Alert className="text-red-900">{error.message}</Alert>}
</div>
<DialogFooter>
<Button variant="outline" type="submit">
Change
</Button>
</DialogFooter>
</form>
</DialogContent>
</Dialog>
)
}