Files
supabase/packages/ui/src/components/CodeBlock/CodeBlock.tsx
T
+14 247c72fff2 SQL Editor: CLI commands to import snippet as migration/seed (#17341)
* feat(sql-editor): cli commands to import snippet as migration/seed

* fix(sql-editor): reword to download snippet

* chore(sql-editor): update wording

* Move to tabed ui, move download button to context menu

* Inline

* feat: add react native auth blog and quickstart. (#19006)

* feat: add react native auth blog and quickstart.

* Grammarly check

* Minor edits.

* Added og image.

* chore: add password sign in and gif.

---------

Co-authored-by: Ramiro Nuñez Dosio <ramiro@supabase.io>

* fix: duplicate eslint dependency (#19028)

* Update sveltekit.mdx (#18998)

Extended authorization section of docs to mention use of Sveltekit sequence helper function for protecting routes alongside defining Supabase session. Also provided new code.

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

* fix: add hello world example to edge functions quickstart (#19030)

* Fix project card status not showing (#19034)

* Fix project card status not showing

* Fix tooltip project card styling

* chore: update cli reference doc (#18934)

* Add docs for updating the image versions (#18160)

see #17930

* chore: fix casing of "encryption at rest" (#19032)

* chore: update self-hosted image versions (#18935)

chore: update image versions for docker/docker-compose.yml

* (docs) Update arg name that resulted from adapters release (#19024)

update arg name that resulted from adapters release

* docs: Fix an example (@supabase/ssr package) for Next.js API Route (#19009)

Update creating-a-client.mdx

replace `appendHeader` with `setHeader` for the Next.js API route example.

* chore: cleanup studio dependencies (#19040)

* Fix code text color (#19042)

* make dark: selector work again

* fix reference docs code color

* feat: remove note about tus rollout (#19007)

it has been rolled out to all projects

* docs: update language in database-size.mdx code block (#19033)

Co-authored-by: Kevin Grüneberg <k.grueneberg1994@gmail.com>
Co-authored-by: Copple <10214025+kiwicopple@users.noreply.github.com>

* Docs: Adds a page for enums (#18590)

* Adds a page for enums

* Adds some details on deleting values

* Update apps/docs/pages/guides/database/postgres/enums.mdx

Co-authored-by: Kevin Grüneberg <k.grueneberg1994@gmail.com>

* Update apps/docs/pages/guides/database/postgres/enums.mdx

Co-authored-by: Kevin Grüneberg <k.grueneberg1994@gmail.com>

* Update apps/docs/pages/guides/database/postgres/enums.mdx

Co-authored-by: Kevin Grüneberg <k.grueneberg1994@gmail.com>

* Update apps/docs/pages/guides/database/postgres/enums.mdx

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

* removes dangerous operation

---------

Co-authored-by: Kevin Grüneberg <k.grueneberg1994@gmail.com>
Co-authored-by: Charis <26616127+charislam@users.noreply.github.com>

* Update hugging-face.mdx: fix example curl request (#17667)

The example request did not match the example edge function because there is used prompt and in the curl script was used query

* docs: fix syntax error in create role command (#17755)

* Update auth-sso-saml.mdx (#17856)

* docs: Update auth-google.mdx (#18119)

* fix: Bump up Realtime to 2.25.35 (#19048)

* Update llamaindex.ipynb doc_hash to hash (#18838)

* Update llamaindex.ipynb doc_hash to hash

Update `doc_hash` to `hash` since running this as-is provided an `AttributeError`. 

Here's what the Python build-in `vars` gives me (truncated):

```python
{'id_': 'd94b1287-b3ef-4aba-ac6b-7a4e353b0327',
 'embedding': None,
 'metadata': {},
 'excluded_embed_metadata_keys': [],
 'excluded_llm_metadata_keys': [],
 'relationships': {},
 'hash': '4c702b4df575421e1d1af4b1fd50511b226e0c9863dbfffeccb8b689b8448f35',...}
```

* fix: SimpleWebPageReader & StorageContext imports

* chore: revert python version change

---------

Co-authored-by: Greg Richardson <greg.nmr@gmail.com>

* fix: add reference docs back to search index (#19054)

Reference docs weren't being indexed properly because the specs weren't
getting checked out at build time.

* docs: add RN videos and discoverability improvements. (#18633)

* docs: add RN videos and discoverability improvements.

* Apply suggestions from code review

Co-authored-by: Copple <10214025+kiwicopple@users.noreply.github.com>

* chore: run prettier.

---------

Co-authored-by: Copple <10214025+kiwicopple@users.noreply.github.com>

* docs: add getting started guide for Swift (#19044)

* docs: getting started guide for Swift

* Apply suggestions from code review

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

* Add new tutorial to menu

* Add correct image for tutorial

* style: format with-swift tutorial

* docs: add example to the repository

---------

Co-authored-by: Charis <26616127+charislam@users.noreply.github.com>
Co-authored-by: Thor 雷神 Schaeff <5748289+thorwebdev@users.noreply.github.com>

* docs: Update mentions of `foreign table` to `referenced table` (#18656)

* replace foreignTable parameter with referencedTable parameter

* remove redirects

* rename any mentions of foreign table to referenced table

* fix one mention of foreign table

* update some links

* guide: add pgroonga videos to pgroonga guide (#19073)

add pgroonga videos to pgroonga guide

* docs(swift): rename `authStateChanges` and remove `File` from upload method (#19067)

docs: fix authStateChanges and upload documentation

* Small style fixes

* Style

* Update

* Update

* Update UI components positioning for DownloadSnippetModal

---------

Co-authored-by: Terry Sutton <saltcod@gmail.com>
Co-authored-by: Thor 雷神 Schaeff <5748289+thorwebdev@users.noreply.github.com>
Co-authored-by: Ramiro Nuñez Dosio <ramiro@supabase.io>
Co-authored-by: Kevin Grüneberg <k.grueneberg1994@gmail.com>
Co-authored-by: uncapped1599 <126204291+uncapped1599@users.noreply.github.com>
Co-authored-by: Charis <26616127+charislam@users.noreply.github.com>
Co-authored-by: Lakshan Perera <lakshan@supabase.io>
Co-authored-by: Joshen Lim <joshenlimek@gmail.com>
Co-authored-by: Copple <10214025+kiwicopple@users.noreply.github.com>
Co-authored-by: Div Arora <darora@users.noreply.github.com>
Co-authored-by: Oliver Rice <github@oliverrice.com>
Co-authored-by: Taishi <taishi.k0903@gmail.com>
Co-authored-by: Francesco Sansalvadore <f.sansalvadore@gmail.com>
Co-authored-by: Inian <inian1234@gmail.com>
Co-authored-by: Joseph Yu <39754176+joseph082@users.noreply.github.com>
Co-authored-by: Maidi <mareike.haug@web.de>
Co-authored-by: Shinya Fujino <shf0811@gmail.com>
Co-authored-by: Andrei Soroker <soroker@gmail.com>
Co-authored-by: Isaac Abotsi <abotsi@users.noreply.github.com>
Co-authored-by: Filipe Cabaço <filipe@supabase.io>
Co-authored-by: Jason R. Stevens, CFA <jason@thinkjrs.dev>
Co-authored-by: Guilherme Souza <grsouza@pm.me>
Co-authored-by: Tyler <18113850+dshukertjr@users.noreply.github.com>
2023-11-21 20:32:07 +08:00

164 lines
5.7 KiB
TypeScript

import { Children } from 'react'
import * as CopyToClipboard from 'react-copy-to-clipboard'
import { Light as SyntaxHighlighter } from 'react-syntax-highlighter'
import { monokaiCustomTheme } from './CodeBlock.utils'
import { Button, IconCheck, IconCopy } from 'ui'
import js from 'react-syntax-highlighter/dist/cjs/languages/hljs/javascript'
import ts from 'react-syntax-highlighter/dist/cjs/languages/hljs/typescript'
import csharp from 'react-syntax-highlighter/dist/cjs/languages/hljs/csharp'
import py from 'react-syntax-highlighter/dist/cjs/languages/hljs/python'
import sql from 'react-syntax-highlighter/dist/cjs/languages/hljs/sql'
import bash from 'react-syntax-highlighter/dist/cjs/languages/hljs/bash'
import dart from 'react-syntax-highlighter/dist/cjs/languages/hljs/dart'
import json from 'react-syntax-highlighter/dist/cjs/languages/hljs/json'
import kotlin from 'react-syntax-highlighter/dist/cjs/languages/hljs/kotlin'
import { useState } from 'react'
import { useTheme } from 'next-themes'
export interface CodeBlockProps {
title?: string
language: 'js' | 'jsx' | 'sql' | 'py' | 'bash' | 'ts' | 'dart' | 'json' | 'csharp' | 'kotlin'
linesToHighlight?: number[]
hideCopy?: boolean
hideLineNumbers?: boolean
className?: string
value?: string
children?: string
}
export const CodeBlock = ({
title,
language,
linesToHighlight = [],
className,
value,
children,
hideCopy = false,
hideLineNumbers = false,
}: CodeBlockProps) => {
const { resolvedTheme } = useTheme()
const isDarkTheme = resolvedTheme?.includes('dark')!
const monokaiTheme = monokaiCustomTheme(isDarkTheme)
const [copied, setCopied] = useState(false)
const handleCopy = () => {
setCopied(true)
setTimeout(() => {
setCopied(false)
}, 1000)
}
// Extract string when `children` has a single string node
const childrenArray = Children.toArray(children)
const [singleChild] = childrenArray.length === 1 ? childrenArray : []
const singleString = typeof singleChild === 'string' ? singleChild : undefined
let codeValue = value ?? singleString ?? children
codeValue = codeValue?.trimEnd?.() ?? codeValue
// check the length of the string inside the <code> tag
// if it's fewer than 70 characters, add a white-space: pre so it doesn't wrap
const shortCodeBlockClasses =
typeof codeValue === 'string' && codeValue.length < 70 ? 'short-inline-codeblock' : ''
let lang = language ? language : className ? className.replace('language-', '') : 'js'
// force jsx to be js highlighted
if (lang === 'jsx') lang = 'js'
SyntaxHighlighter.registerLanguage('js', js)
SyntaxHighlighter.registerLanguage('ts', ts)
SyntaxHighlighter.registerLanguage('py', py)
SyntaxHighlighter.registerLanguage('sql', sql)
SyntaxHighlighter.registerLanguage('bash', bash)
SyntaxHighlighter.registerLanguage('dart', dart)
SyntaxHighlighter.registerLanguage('csharp', csharp)
SyntaxHighlighter.registerLanguage('json', json)
SyntaxHighlighter.registerLanguage('kotlin', kotlin)
const large = false
// don't show line numbers if bash == lang
if (lang === 'bash' || lang === 'sh') hideLineNumbers = true
const showLineNumbers = !hideLineNumbers
return (
<>
{title && (
<div className="rounded-t-md bg-surface-100 py-2 px-4 border-b border-default text-blue-1100 font-sans">
{title.replace(/%20/g, ' ')}
</div>
)}
{className ? (
<div className="relative max-w-[90vw] md:max-w-none overflow-auto">
{/* @ts-ignore */}
<SyntaxHighlighter
language={lang}
wrapLines={true}
// @ts-ignore
style={monokaiTheme}
className={[
'code-block border p-4 w-full !my-0 !bg-surface-100',
`${!title ? '!rounded-md' : '!rounded-t-none !rounded-b-md'}`,
`${!showLineNumbers ? 'pl-6' : ''}`,
className,
].join(' ')}
customStyle={{
fontSize: large ? 18 : 13,
lineHeight: large ? 1.5 : 1.4,
}}
showLineNumbers={showLineNumbers}
lineProps={(lineNumber) => {
if (linesToHighlight.includes(lineNumber)) {
return {
style: { display: 'block', backgroundColor: 'hsl(var(--background-selection))' },
}
}
return {}
}}
lineNumberContainerStyle={{
paddingTop: '128px',
}}
lineNumberStyle={{
minWidth: '44px',
paddingLeft: '4px',
paddingRight: '4px',
marginRight: '12px',
color: '#828282',
textAlign: 'center',
fontSize: large ? 14 : 12,
paddingTop: '4px',
paddingBottom: '4px',
}}
>
{codeValue}
</SyntaxHighlighter>
{!hideCopy && (value || children) && className ? (
<div
className={[
'absolute right-2',
`${isDarkTheme ? 'dark' : ''}`,
`${!title ? 'top-2' : 'top-[3.25rem]'}`,
].join(' ')}
>
{/* //
@ts-ignore */}
<CopyToClipboard text={value || children}>
<Button
type="default"
icon={copied ? <IconCheck /> : <IconCopy />}
onClick={() => handleCopy()}
>
{copied ? 'Copied' : ''}
</Button>
</CopyToClipboard>
</div>
) : null}
</div>
) : (
<code className={shortCodeBlockClasses}>{value || children}</code>
)}
</>
)
}