Skip to content

Commit 0df76d8

Browse files
committed
fixup! Add support for fe_/be_ language prefixes in CodeSnippet
1 parent a1e978c commit 0df76d8

File tree

2 files changed

+54
-65
lines changed

2 files changed

+54
-65
lines changed

src/core/CodeSnippet.tsx

Lines changed: 47 additions & 61 deletions
Original file line numberDiff line numberDiff line change
@@ -10,15 +10,20 @@ import React, {
1010
import Code from "./Code";
1111
import cn from "./utils/cn";
1212
import Icon from "./Icon";
13-
import { getLanguageInfo, stripSdkType } from "./CodeSnippet/languages";
13+
import {
14+
getLanguageInfo,
15+
stripSdkType,
16+
SDK_PREFIXES,
17+
SDKType,
18+
} from "./CodeSnippet/languages";
1419
import LanguageSelector from "./CodeSnippet/LanguageSelector";
1520
import ApiKeySelector from "./CodeSnippet/ApiKeySelector";
1621
import PlainCodeView from "./CodeSnippet/PlainCodeView";
1722
import CopyButton from "./CodeSnippet/CopyButton";
1823
import SegmentedControl from "./SegmentedControl";
1924

20-
// Define SDK type
21-
export type SDKType = "realtime" | "rest" | "fe" | "be" | null;
25+
// Re-export SDKType for consumers
26+
export type { SDKType };
2227

2328
// Define API key types
2429
export type ApiKeysItem = {
@@ -211,14 +216,11 @@ const CodeSnippet: React.FC<CodeSnippetProps> = ({
211216

212217
if (!codeLanguage) return;
213218

214-
if (codeLanguage.startsWith("realtime_")) {
215-
sdkTypes.add("realtime");
216-
} else if (codeLanguage.startsWith("rest_")) {
217-
sdkTypes.add("rest");
218-
} else if (codeLanguage.startsWith("fe_")) {
219-
sdkTypes.add("fe");
220-
} else if (codeLanguage.startsWith("be_")) {
221-
sdkTypes.add("be");
219+
for (const prefix of SDK_PREFIXES) {
220+
if (codeLanguage.startsWith(`${prefix}_`)) {
221+
sdkTypes.add(prefix);
222+
break;
223+
}
222224
}
223225

224226
if (!languages.includes(codeLanguage)) {
@@ -237,14 +239,14 @@ const CodeSnippet: React.FC<CodeSnippetProps> = ({
237239
};
238240
}, [children, extractLanguageFromCode, findCodeElement]);
239241

240-
const resolvedSdk: SDKType = useMemo(() => {
242+
const resolvedSdk: SDKType | undefined = useMemo(() => {
241243
if (sdkTypes.size === 1 && sdk && !sdkTypes.has(sdk)) {
242244
return Array.from(sdkTypes)[0];
243245
}
244-
return sdk ?? null;
246+
return sdk;
245247
}, [sdk, sdkTypes]);
246248

247-
// Only show SDK selector for realtime/rest types, not for fe/be (which are controlled by page-level selector)
249+
// Only show SDK selector for realtime/rest types, not for client/agent (which are controlled by page-level selector)
248250
const showSDKSelector = sdkTypes.has("realtime") || sdkTypes.has("rest");
249251

250252
const filteredLanguages = useMemo(() => {
@@ -273,8 +275,8 @@ const CodeSnippet: React.FC<CodeSnippetProps> = ({
273275
}, [resolvedSdk, showSDKSelector, languages, languageOrdering]);
274276

275277
const activeLanguage = useMemo(() => {
276-
// For fe/be SDK types (controlled by page-level selector), construct the full language
277-
if (resolvedSdk === "fe" || resolvedSdk === "be") {
278+
// For client/agent SDK types (controlled by page-level selector), construct the full language
279+
if (resolvedSdk === "client" || resolvedSdk === "agent") {
278280
const fullLang = `${resolvedSdk}_${lang}`;
279281
// Verify this language exists in available languages
280282
if (languages.includes(fullLang)) {
@@ -434,6 +436,29 @@ const CodeSnippet: React.FC<CodeSnippetProps> = ({
434436
// Show a read-only language label when fixed (controlled by external selector)
435437
const showFixedLanguageLabel = fixed && activeLanguage;
436438

439+
const renderLanguageLabel = (langKey: string, onClick?: () => void) => (
440+
<div
441+
className={cn(
442+
"border-b border-neutral-300 dark:border-neutral-1000 h-[2.125rem] inline-flex items-center px-3 w-full",
443+
{ "rounded-t-lg": !headerRow },
444+
)}
445+
>
446+
<div
447+
className={cn("inline-flex items-center", onClick && "cursor-pointer")}
448+
{...(onClick && { onClick })}
449+
>
450+
<Icon
451+
name={getLanguageInfo(langKey).icon}
452+
size="16px"
453+
additionalCSS="mr-2"
454+
/>
455+
<span className="ui-text-label4 font-semibold text-neutral-800 dark:text-neutral-500 select-none">
456+
{getLanguageInfo(langKey).label}
457+
</span>
458+
</div>
459+
</div>
460+
);
461+
437462
const renderContent = useMemo(() => {
438463
if (!activeLanguage) return null;
439464

@@ -535,25 +560,8 @@ const CodeSnippet: React.FC<CodeSnippetProps> = ({
535560
</div>
536561
)}
537562

538-
{showFixedLanguageLabel && (
539-
<div
540-
className={cn(
541-
"border-b border-neutral-300 dark:border-neutral-1000 h-[2.125rem] inline-flex items-center px-3 w-full",
542-
{ "rounded-t-lg": !headerRow },
543-
)}
544-
>
545-
<div className="inline-flex items-center">
546-
<Icon
547-
name={getLanguageInfo(activeLanguage).icon}
548-
size="16px"
549-
additionalCSS="mr-2"
550-
/>
551-
<span className="ui-text-label4 font-semibold text-neutral-800 dark:text-neutral-500 select-none">
552-
{getLanguageInfo(activeLanguage).label}
553-
</span>
554-
</div>
555-
</div>
556-
)}
563+
{showFixedLanguageLabel &&
564+
renderLanguageLabel(activeLanguage)}
557565

558566
{showLanguageSelector &&
559567
(showFullSelector ? (
@@ -563,32 +571,10 @@ const CodeSnippet: React.FC<CodeSnippetProps> = ({
563571
onLanguageChange={handleLanguageChange}
564572
/>
565573
) : (
566-
<div
567-
className={cn(
568-
"border-b border-neutral-300 dark:border-neutral-1000 h-[2.125rem] inline-flex items-center px-3 w-full",
569-
{ "rounded-t-lg": !headerRow },
570-
)}
571-
>
572-
{filteredLanguages.length > 0 && (
573-
<div
574-
className={cn("inline-flex items-center", {
575-
"cursor-pointer": filteredLanguages.length > 0,
576-
})}
577-
{...(filteredLanguages.length > 0 && {
578-
onClick: () => handleLanguageChange(filteredLanguages[0]),
579-
})}
580-
>
581-
<Icon
582-
name={getLanguageInfo(filteredLanguages[0]).icon}
583-
size="16px"
584-
additionalCSS="mr-2"
585-
/>
586-
<span className="ui-text-label4 font-semibold text-neutral-800 dark:text-neutral-500 select-none">
587-
{getLanguageInfo(filteredLanguages[0]).label}
588-
</span>
589-
</div>
590-
)}
591-
</div>
574+
renderLanguageLabel(
575+
filteredLanguages[0],
576+
() => handleLanguageChange(filteredLanguages[0]),
577+
)
592578
))}
593579
<div
594580
ref={codeRef}

src/core/CodeSnippet/languages.ts

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,9 @@ export interface LanguageInfo {
88

99
export type LanguageMap = Record<string, LanguageInfo>;
1010

11+
export const SDK_PREFIXES = ["realtime", "rest", "client", "agent"] as const;
12+
export type SDKType = (typeof SDK_PREFIXES)[number];
13+
1114
const languages: LanguageMap = {
1215
javascript: {
1316
label: "JavaScript",
@@ -133,10 +136,10 @@ const languages: LanguageMap = {
133136
};
134137

135138
export const stripSdkType = (lang: string) => {
136-
const prefixes = ["realtime_", "rest_", "fe_", "be_"];
137-
for (const prefix of prefixes) {
138-
if (lang.startsWith(prefix)) {
139-
return lang.slice(prefix.length);
139+
for (const prefix of SDK_PREFIXES) {
140+
const withUnderscore = `${prefix}_`;
141+
if (lang.startsWith(withUnderscore)) {
142+
return lang.slice(withUnderscore.length);
140143
}
141144
}
142145
return lang;

0 commit comments

Comments
 (0)