mirror of
https://github.com/stack-auth/stack.git
synced 2026-06-13 21:01:21 +08:00
43 lines
1.3 KiB
TypeScript
43 lines
1.3 KiB
TypeScript
"use client";
|
|
|
|
import { Typography, TypographyProps } from "@mui/joy";
|
|
import { MouseEvent } from "react";
|
|
import { hasClickableParent } from "@stackframe/stack-shared/dist/utils/dom";
|
|
import { getNodeText } from "@stackframe/stack-shared/dist/utils/react";
|
|
import { useSnackbar } from "@/hooks/use-snackbar";
|
|
import { runAsynchronously } from "@stackframe/stack-shared/dist/utils/promises";
|
|
|
|
export function InlineCode(props: TypographyProps<"code">) {
|
|
const { onClick, style, ...typographyProps } = props;
|
|
|
|
const snackbar = useSnackbar();
|
|
|
|
return (
|
|
<Typography
|
|
component="code"
|
|
display="inline"
|
|
data-n2-clickable={true}
|
|
{...typographyProps}
|
|
style={{
|
|
cursor: "pointer",
|
|
...style,
|
|
}}
|
|
onClick={(e: MouseEvent<HTMLElement>) => {
|
|
onClick?.(e);
|
|
if (!hasClickableParent(e.currentTarget)) {
|
|
e.stopPropagation();
|
|
e.preventDefault();
|
|
runAsynchronously(async () => {
|
|
try {
|
|
await navigator.clipboard.writeText(getNodeText(props.children));
|
|
snackbar.showSuccess('Copied to clipboard!');
|
|
} catch (e) {
|
|
snackbar.showError('Failed to copy to clipboard!');
|
|
}
|
|
});
|
|
}
|
|
}}
|
|
/>
|
|
);
|
|
}
|