Files
sign/packages/lib/client-only/hooks/use-copy-share-link.ts

54 lines
1.5 KiB
TypeScript
Raw Normal View History

import { trpc } from '@documenso/trpc/react';
import { TCreateOrGetShareLinkMutationSchema } from '@documenso/trpc/server/share-link-router/schema';
import { useCopyToClipboard } from './use-copy-to-clipboard';
2023-10-16 12:20:57 +11:00
export type UseCopyShareLinkOptions = {
onSuccess?: () => void;
onError?: () => void;
};
2023-10-16 12:20:57 +11:00
export function useCopyShareLink({ onSuccess, onError }: UseCopyShareLinkOptions) {
const [, copyToClipboard] = useCopyToClipboard();
const { mutateAsync: createOrGetShareLink, isLoading: isCreatingShareLink } =
trpc.shareLink.createOrGetShareLink.useMutation();
/**
2023-10-06 14:42:41 +11:00
* Copy a newly created, or pre-existing share link to the user's clipboard.
*
2023-10-06 14:42:41 +11:00
* @param payload The payload to create or get a share link.
*/
2023-10-06 14:42:41 +11:00
const createAndCopyShareLink = async (payload: TCreateOrGetShareLinkMutationSchema) => {
const valueToCopy = createOrGetShareLink(payload).then(
(result) => `${window.location.origin}/share/${result.slug}`,
);
2023-10-06 14:42:41 +11:00
await copyShareLink(valueToCopy);
};
/**
* Copy a share link to the user's clipboard.
*
* @param shareLink Either the share link itself or a promise that returns a shared link.
*/
const copyShareLink = async (shareLink: Promise<string> | string) => {
try {
2023-10-06 14:42:41 +11:00
const isCopySuccess = await copyToClipboard(shareLink);
if (!isCopySuccess) {
throw new Error('Copy to clipboard failed');
}
2023-10-16 12:20:57 +11:00
onSuccess?.();
} catch (e) {
onError?.();
}
};
return {
2023-10-06 14:42:41 +11:00
createAndCopyShareLink,
copyShareLink,
2023-10-06 14:42:41 +11:00
isCopyingShareLink: isCreatingShareLink,
};
}