mirror of
https://github.com/storybookjs/storybook.git
synced 2025-04-01 05:05:25 +08:00
45 lines
1.2 KiB
TypeScript
45 lines
1.2 KiB
TypeScript
import global from 'global';
|
|
import React from 'react';
|
|
import copy from 'copy-to-clipboard';
|
|
import { getStoryHref, IconButton, Icons } from '@storybook/components';
|
|
import { Consumer, type Combo } from '@storybook/api';
|
|
import type { Addon } from '@storybook/addons';
|
|
|
|
const { PREVIEW_URL, document } = global;
|
|
|
|
const copyMapper = ({ state }: Combo) => {
|
|
const { storyId, refId, refs } = state;
|
|
const { location } = document;
|
|
const ref = refs[refId];
|
|
let baseUrl = `${location.origin}${location.pathname}`;
|
|
if (!baseUrl.endsWith('/')) baseUrl += '/';
|
|
|
|
return {
|
|
refId,
|
|
baseUrl: ref ? `${ref.url}/iframe.html` : (PREVIEW_URL as string) || `${baseUrl}iframe.html`,
|
|
storyId,
|
|
queryParams: state.customQueryParams,
|
|
};
|
|
};
|
|
|
|
export const copyTool: Addon = {
|
|
title: 'copy',
|
|
id: 'copy',
|
|
match: ({ viewMode }) => viewMode === 'story',
|
|
render: () => (
|
|
<Consumer filter={copyMapper}>
|
|
{({ baseUrl, storyId, queryParams }) =>
|
|
storyId ? (
|
|
<IconButton
|
|
key="copy"
|
|
onClick={() => copy(getStoryHref(baseUrl, storyId, queryParams))}
|
|
title="Copy canvas link"
|
|
>
|
|
<Icons icon="link" />
|
|
</IconButton>
|
|
) : null
|
|
}
|
|
</Consumer>
|
|
),
|
|
};
|