mirror of
https://github.com/supabase/supabase.git
synced 2026-07-05 13:14:36 +08:00
* Init changes for sql fodlers * Added upsert logic in sql-editor-v2 valtio, hooked up with templates and quickstarts * Do up logic for creating new snippets by typing in /new or by clicking new query button * Do up logic for updating and deleting snippets * Do up logic for favourites and shared snippets * Do up logic for favourites and shared snippets * Fix * Fix saving indicator, add empty states for favorites and shared snippets * Implement sorting * Some minor QOL improvements * Minor fix on empty state for private snippets * Add delete folder mutation * Implement create and update folder * Fix reinstate with AI renaming for new snippets under folder * Support controlled multi select behaviour in private snippets * Undo changes to tree-view-multi-select * Support bulk deletes * Support moving queries + rendering queries in folders * Support deleting folders and creating a new folder when moving a query * Fix bug where renaming query removes content * Add initial loading state in sql editor nav + handle fallback if cannot retrieve content by id * Fix some spelling * Fix TS issue in sql folders mutation keys * Fix toggling favorite * Lint * Revert fallback behaviour in ]id] for now * Fix favorites and shared snippets not showing * Fix moving currently opened snippet leads to loading * Support bulk moving * Improve multi select logic a little * Nit lint * Reinstate AI retitling for untitled snippets when running query * Remove hardcode in useAFlag * Support creating new snippet in a folder directly * Fix sharing snippets that are within a folder * Fix sharing snippets within a folder * Fix favorite * Add loading state when fetching folder contents * Fix favoriting snippets in folders
50 lines
1.1 KiB
TypeScript
50 lines
1.1 KiB
TypeScript
import { copyToClipboard } from 'lib/helpers'
|
|
import { Check, Clipboard } from 'lucide-react'
|
|
import { useEffect, useState } from 'react'
|
|
import { Button, ButtonProps } from 'ui'
|
|
|
|
export interface CopyButtonProps extends ButtonProps {
|
|
text: string
|
|
iconOnly?: boolean
|
|
copyLabel?: string
|
|
copiedLabel?: string
|
|
}
|
|
const CopyButton = ({
|
|
text,
|
|
iconOnly = false,
|
|
children,
|
|
onClick,
|
|
copyLabel = 'Copy',
|
|
copiedLabel = 'Copied',
|
|
...props
|
|
}: CopyButtonProps) => {
|
|
const [showCopied, setShowCopied] = useState(false)
|
|
|
|
useEffect(() => {
|
|
if (!showCopied) return
|
|
const timer = setTimeout(() => setShowCopied(false), 2000)
|
|
return () => clearTimeout(timer)
|
|
}, [showCopied])
|
|
|
|
return (
|
|
<Button
|
|
onClick={(e) => {
|
|
setShowCopied(true)
|
|
copyToClipboard(text)
|
|
onClick?.(e)
|
|
}}
|
|
icon={
|
|
showCopied ? (
|
|
<Check size={14} strokeWidth={2} className="text-brand" />
|
|
) : (
|
|
<Clipboard size={14} />
|
|
)
|
|
}
|
|
{...props}
|
|
>
|
|
{!iconOnly && <>{children ?? (showCopied ? copiedLabel : copyLabel)}</>}
|
|
</Button>
|
|
)
|
|
}
|
|
export default CopyButton
|