index.tsx 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. 'use client'
  2. import React, { useState } from 'react'
  3. import { useTranslation } from 'react-i18next'
  4. import {
  5. RiClipboardFill,
  6. RiClipboardLine,
  7. } from '@remixicon/react'
  8. import { debounce } from 'lodash-es'
  9. import copy from 'copy-to-clipboard'
  10. import copyStyle from './style.module.css'
  11. import Tooltip from '@/app/components/base/tooltip'
  12. import ActionButton from '@/app/components/base/action-button'
  13. type Props = {
  14. content: string
  15. className?: string
  16. }
  17. const prefixEmbedded = 'appOverview.overview.appInfo.embedded'
  18. const CopyFeedback = ({ content }: Props) => {
  19. const { t } = useTranslation()
  20. const [isCopied, setIsCopied] = useState<boolean>(false)
  21. const onClickCopy = debounce(() => {
  22. copy(content)
  23. setIsCopied(true)
  24. }, 100)
  25. const onMouseLeave = debounce(() => {
  26. setIsCopied(false)
  27. }, 100)
  28. return (
  29. <Tooltip
  30. popupContent={
  31. (isCopied
  32. ? t(`${prefixEmbedded}.copied`)
  33. : t(`${prefixEmbedded}.copy`)) || ''
  34. }
  35. >
  36. <ActionButton>
  37. <div
  38. onClick={onClickCopy}
  39. onMouseLeave={onMouseLeave}
  40. >
  41. {isCopied && <RiClipboardFill className='w-4 h-4' />}
  42. {!isCopied && <RiClipboardLine className='w-4 h-4' />}
  43. </div>
  44. </ActionButton>
  45. </Tooltip>
  46. )
  47. }
  48. export default CopyFeedback
  49. export const CopyFeedbackNew = ({ content, className }: Pick<Props, 'className' | 'content'>) => {
  50. const { t } = useTranslation()
  51. const [isCopied, setIsCopied] = useState<boolean>(false)
  52. const onClickCopy = debounce(() => {
  53. copy(content)
  54. setIsCopied(true)
  55. }, 100)
  56. const onMouseLeave = debounce(() => {
  57. setIsCopied(false)
  58. }, 100)
  59. return (
  60. <Tooltip
  61. popupContent={
  62. (isCopied
  63. ? t(`${prefixEmbedded}.copied`)
  64. : t(`${prefixEmbedded}.copy`)) || ''
  65. }
  66. >
  67. <div
  68. className={`w-8 h-8 cursor-pointer hover:bg-components-button-ghost-bg-hover rounded-lg ${className ?? ''
  69. }`}
  70. >
  71. <div
  72. onClick={onClickCopy}
  73. onMouseLeave={onMouseLeave}
  74. className={`w-full h-full ${copyStyle.copyIcon} ${isCopied ? copyStyle.copied : ''
  75. }`}
  76. ></div>
  77. </div>
  78. </Tooltip>
  79. )
  80. }