index.tsx 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112
  1. import { useEffect, useRef, useState } from "react";
  2. import { Image, View, ScrollView, Video } from "@tarojs/components";
  3. import { uploadAndNavToGenNewAvatar } from "@/utils/avatar";
  4. import WemetaRadio from '@/components/WemetaRadio'
  5. import { AvatarMedia } from "@/components/AvatarMedia";
  6. import WemetaButton from '@/components/buttons/WemetaButton'
  7. import IconCrop from '@/components/icon/IconCrop'
  8. import Taro from "@tarojs/taro";
  9. import style from "./index.module.less";
  10. import { cropImage } from "@/utils/upload";
  11. import { TAvatarItem } from "@/service/storage";
  12. interface IProps {
  13. avatarItem: TAvatarItem,
  14. enabledChatBg: boolean,
  15. setEnabledChatBg: (enabled: boolean) => void
  16. onCropDone: (url: string) => void
  17. onChange: () => void
  18. onConfirm: (edit: TAvatarItem & {enabledChatBg: boolean}) => void
  19. }
  20. export default function Index({ avatarItem, enabledChatBg, setEnabledChatBg, onCropDone, onChange, onConfirm }: IProps) {
  21. const [avatarData, setAvatarData] = useState({...avatarItem, enabledChatBg})
  22. const handleConfirm = async () => {
  23. console.log('confirm')
  24. onConfirm({ ...avatarData, enabledChatBg})
  25. }
  26. const handleChange = () => {
  27. onChange()
  28. }
  29. const handleCrop = () => {
  30. Taro.showLoading()
  31. // url: `${avatarItem.avatarLogo}?x-oss-process=image/resize,w_450/quality,q_60`,
  32. Taro.downloadFile({
  33. url: avatarItem.avatarLogo,
  34. success: async (res) => {
  35. if (res.statusCode === 200) {
  36. const cropRes = await cropImage(res.tempFilePath)
  37. if(cropRes?.url){
  38. onCropDone(cropRes.url)
  39. setAvatarData({...avatarData, avatarLogo: cropRes.url})
  40. }
  41. }
  42. },
  43. fail: (err) => {
  44. console.log(err);
  45. Taro.hideLoading()
  46. Taro.showToast({
  47. title: '头像下载失败',
  48. icon: 'error',
  49. duration: 2000
  50. })
  51. },
  52. complete: (err) => {
  53. console.log(err);
  54. Taro.hideLoading()
  55. }
  56. })
  57. }
  58. const handleEnabledChatBg = ()=> {
  59. setEnabledChatBg(!enabledChatBg)
  60. }
  61. return (
  62. <View>
  63. <View>
  64. <View className={style.confirmContainer}>
  65. <View className={style.confirmRoundedAvatarWrap}>
  66. <Image
  67. mode='aspectFill'
  68. className={style.confirmRoundedAvatar}
  69. src={avatarData?.avatarLogo}
  70. ></Image>
  71. <View className={style.cropButton} onClick={handleCrop}>
  72. <IconCrop />
  73. </View>
  74. </View>
  75. <View className={style.confirmChatAvatarBg}>
  76. <View className={style.confirmChatAvatarImage}>
  77. <AvatarMedia roundedFull={false} source={avatarData?.avatarUrl} className={style.confirmChatAvatarImage} />
  78. {!avatarItem.isOriginal && <View className={style.aiTips}>图片由AI生成</View>}
  79. {/* <Image
  80. mode="widthFix"
  81. className="w-full"
  82. src={pickedAvatar.avatarUrl}
  83. ></Image> */}
  84. </View>
  85. {enabledChatBg && <View className={style.confirmChatAvatarBgCover}>
  86. <View className={style.block1}></View>
  87. <View className={style.block2}></View>
  88. <View className={style.block3}></View>
  89. </View>}
  90. </View>
  91. <View className="flex-center gap-8 text-14 font-medium leading-22 text-black" onClick={handleEnabledChatBg}>
  92. <WemetaRadio checked={enabledChatBg} checkbox></WemetaRadio>
  93. 启用聊天背景
  94. </View>
  95. </View>
  96. <View className="bottom-bar">
  97. <View className="grid grid-cols-2 gap-8 px-20 py-12">
  98. <WemetaButton className="flex-1" type="normal"onClick={handleChange}>更换形象</WemetaButton>
  99. <WemetaButton className="flex-1" onClick={handleConfirm}>确定</WemetaButton>
  100. </View>
  101. </View>
  102. </View>
  103. </View>
  104. );
  105. }