Grabbed dndbeyond's source code
``` ~/go/bin/sourcemapper -output ddb -jsurl https://media.dndbeyond.com/character-app/static/js/main.90aa78c5.js ```
This commit is contained in:
@@ -0,0 +1,83 @@
|
||||
import { FC, HTMLAttributes, useEffect, useRef, useState } from "react";
|
||||
import { useDispatch } from "react-redux";
|
||||
|
||||
import {
|
||||
LoadingPlaceholder,
|
||||
ThemedShareSvg,
|
||||
} from "@dndbeyond/character-components/es";
|
||||
import {
|
||||
ApiAdapterUtils,
|
||||
ApiRequests,
|
||||
characterActions,
|
||||
} from "@dndbeyond/character-rules-engine";
|
||||
|
||||
import { useCharacterEngine } from "~/hooks/useCharacterEngine";
|
||||
import { Header } from "~/subApps/sheet/components/Sidebar/components/Header";
|
||||
|
||||
import { ClipboardUtils } from "../../../utils";
|
||||
|
||||
interface Props extends HTMLAttributes<HTMLDivElement> {}
|
||||
export const ShareUrlPane: FC<Props> = ({ ...props }) => {
|
||||
const dispatch = useDispatch();
|
||||
const urlInput = useRef<HTMLInputElement>(null);
|
||||
const { characterTheme } = useCharacterEngine();
|
||||
|
||||
const [shareUrl, setShareUrl] = useState<string | null>(null);
|
||||
const [hasCopied, setHasCopied] = useState(false);
|
||||
const [isLoading, setIsLoading] = useState(true);
|
||||
|
||||
useEffect(() => {
|
||||
const getShareUrl = async () => {
|
||||
const response = await ApiRequests.getCharacterShareUrl();
|
||||
const shareUrl = ApiAdapterUtils.getResponseData(response);
|
||||
|
||||
if (shareUrl) {
|
||||
setIsLoading(false);
|
||||
dispatch(characterActions.SendSocialImageData());
|
||||
}
|
||||
setShareUrl(shareUrl);
|
||||
};
|
||||
|
||||
getShareUrl();
|
||||
}, []);
|
||||
|
||||
useEffect(() => {
|
||||
if (shareUrl) {
|
||||
selectUrlInput();
|
||||
}
|
||||
}, [shareUrl]);
|
||||
|
||||
const selectUrlInput = (): void => {
|
||||
if (urlInput.current) {
|
||||
urlInput.current.focus();
|
||||
urlInput.current.setSelectionRange(0, urlInput.current.value.length);
|
||||
}
|
||||
};
|
||||
|
||||
const handleClick = (evt: React.MouseEvent): void => {
|
||||
ClipboardUtils.copyTextToClipboard(shareUrl === null ? "" : shareUrl);
|
||||
setHasCopied(true);
|
||||
};
|
||||
|
||||
return (
|
||||
<div className="ct-share-url-pane" {...props}>
|
||||
<div className="ct-share-url-pane__splash-icon">
|
||||
<ThemedShareSvg theme={characterTheme} />
|
||||
</div>
|
||||
<Header>Shareable Link Generated</Header>
|
||||
<div className="ct-share-url-pane__url">
|
||||
<input
|
||||
type="text"
|
||||
defaultValue={shareUrl ? shareUrl.replace(/https*:\/\//, "") : ""}
|
||||
readOnly
|
||||
className="ct-share-url-pane__input"
|
||||
ref={urlInput}
|
||||
/>
|
||||
</div>
|
||||
{isLoading && <LoadingPlaceholder label={"Loading shareable link..."} />}
|
||||
<div className="ct-share-url-pane__clipboard" onClick={handleClick}>
|
||||
{hasCopied ? <>Copied! ✔</> : "Click to Copy"}
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
};
|
||||
Reference in New Issue
Block a user