forked from ddrilling/asb_cloud_front
d5e827532d
* добавлен хук useFunctionalValue * добавлен хук useCachedFetch * удалён RCA * добавлен конфиг babel * добавлен конфиг webpack * обновлены все пакеты * добавлены базовые моки * добавлены конфиги для тестов * добавлена кнопка копирования url * роутер переписан * в Messages добавлен переход в Архив при клике на сообщение
56 lines
1.9 KiB
TypeScript
56 lines
1.9 KiB
TypeScript
import { cloneElement, memo, useCallback, useMemo, useState } from 'react'
|
||
import { Button, ButtonProps } from 'antd'
|
||
import { CopyOutlined } from '@ant-design/icons'
|
||
|
||
import { invokeWebApiWrapperAsync, notify } from './factory'
|
||
|
||
export type CopyUrlProps = {
|
||
sendLoading?: boolean
|
||
hideUnsupported?: boolean
|
||
onCopy?: () => (void | Promise<void>)
|
||
children: JSX.Element
|
||
}
|
||
|
||
export const CopyUrl = memo<CopyUrlProps>(({ children, onCopy, sendLoading, hideUnsupported = true }) => {
|
||
const props = useMemo(() => children.props, [children])
|
||
const [loading, setLoading] = useState(false)
|
||
|
||
const supported = !!navigator?.clipboard?.writeText // Проверка поддержки
|
||
|
||
const onClick = useCallback((event: MouseEvent) => {
|
||
if (supported) {
|
||
invokeWebApiWrapperAsync(
|
||
async () => {
|
||
await navigator.clipboard.writeText(window.location.href)
|
||
await onCopy?.()
|
||
notify('URL успешно скопирован', 'info')
|
||
},
|
||
setLoading,
|
||
`Не удалось скопировать URL в буфер обмена`
|
||
)
|
||
}
|
||
|
||
props.onClick?.(event) // Запуск onClick по-умолчанию
|
||
}, [props])
|
||
|
||
if (hideUnsupported && !supported) return null
|
||
|
||
return cloneElement(children, { onClick, loading: sendLoading ? loading : props.loading })
|
||
})
|
||
|
||
export type CopyUrlButtonProps = Omit<CopyUrlProps, 'children'> & ButtonProps
|
||
|
||
export const CopyUrlButton = memo<CopyUrlButtonProps>(({ sendLoading, hideUnsupported, onCopy, ...other }) => {
|
||
return (
|
||
<CopyUrl sendLoading={sendLoading} hideUnsupported={hideUnsupported} onCopy={onCopy}>
|
||
<Button
|
||
icon={<CopyOutlined />}
|
||
title={'Скопировать URL в буфер обмена'}
|
||
{...other}
|
||
/>
|
||
</CopyUrl>
|
||
)
|
||
})
|
||
|
||
export default CopyUrl
|