index.jsx 3.0KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112
  1. import React, { useRef, useState } from 'react'
  2. import Taro from '@tarojs/taro'
  3. // import PageModal from '@/components/PageModal'
  4. import { authorize } from '@/utils/wxAuth'
  5. import { View, Image, Button } from '@tarojs/components'
  6. import Spin2 from '@/components/Spin/Spin2'
  7. import Poster from './Poster'
  8. import './style.scss'
  9. export default (props) => {
  10. const {
  11. show,
  12. dataSource,
  13. onClose,
  14. onSuccess,
  15. title = '保存后分享图片',
  16. btnText = '保存海报至相册',
  17. } = props
  18. const [img, setImg] = useState()
  19. const [processing, setProcessing] = useState(false)
  20. const [loading, setLoading] = useState(false)
  21. const sdkRef = useRef()
  22. const handlePoster = (url, sdk) => {
  23. setImg(url)
  24. setProcessing(false)
  25. sdkRef.current = sdk
  26. }
  27. const handleSave = () => {
  28. if (!img) {
  29. Taro.showToast({
  30. title: '海报未生成, 请稍后',
  31. icon: 'none',
  32. })
  33. return
  34. }
  35. authorize('scope.writePhotosAlbum').then(() => {
  36. setLoading(true)
  37. // 先生成到临时位置
  38. sdkRef.current.download().then((tempPath) => {
  39. // 再保存到相册
  40. Taro.saveImageToPhotosAlbum({
  41. filePath: tempPath,
  42. success: () => {
  43. Taro.showToast({
  44. title: '保存成功',
  45. icon: 'none',
  46. duration: 3000,
  47. })
  48. onSuccess()
  49. },
  50. fail: (err) => {
  51. console.error(err)
  52. const message = err.errMsg || err.message || err
  53. Taro.showToast({
  54. title: message,
  55. icon: 'none',
  56. })
  57. },
  58. complete: () => {
  59. setLoading(false)
  60. }
  61. })
  62. }).catch((err) => {
  63. setLoading(false)
  64. console.error(err)
  65. const message = err.errMsg || err.message || err
  66. Taro.showToast({
  67. title: message,
  68. icon: 'none',
  69. })
  70. })
  71. }).catch((err) => {
  72. console.error(err)
  73. const message = err.errMsg || err.message || err
  74. Taro.showToast({
  75. title: message,
  76. icon: 'none',
  77. })
  78. })
  79. }
  80. const handleImage = (e) => {
  81. Taro.previewImage({ current: img, urls: [img] })
  82. }
  83. return (
  84. // <Modal title={title} visible={show} onClose={onClose}>
  85. // eslint-disable-next-line react/jsx-no-undef
  86. <page-modal show={show} position='bottom' onClose={onClose} height='70vh'>
  87. <View className='modal-poster'>
  88. <View className='modal-poster-img-box'>
  89. <view>
  90. {
  91. !processing
  92. ? <Image src={img} mode='scaleToFill' className='centerLabel' onClick={handleImage} />
  93. : <Spin2 className='centerLabel' spinning={processing} size={32} />
  94. }
  95. </view>
  96. </View>
  97. <Button className='modal-poster-action' onClick={handleSave} disabled={!img} loading={loading}>
  98. {btnText}
  99. </Button>
  100. </View>
  101. <Poster dataSource={dataSource} onStart={() => setProcessing(true)} onEnd={handlePoster} />
  102. </page-modal>
  103. )
  104. }