index.tsx 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120
  1. import WemetaRadio from "@/components/wemeta-radio/index";
  2. import { getSysVoiceList } from "@/service/audio";
  3. import { useCharacterStore } from "@/store/characterStore";
  4. import { TServiceAudioModel } from "@/types/index";
  5. import { Image, View } from "@tarojs/components";
  6. import { useEffect, useState } from "react";
  7. import CardList from "@/components/list/card-list";
  8. import CardListItem from "@/components/list/card-list-item";
  9. type ExtendedTServiceAudioModel = TServiceAudioModel & { checked: boolean };
  10. export default function Index({
  11. profileId,
  12. onPlay,
  13. }: {
  14. profileId: string;
  15. onPlay: (voice: any) => void;
  16. }) {
  17. const { saveCharacter } = useCharacterStore();
  18. const character = useCharacterStore((state) => state.character);
  19. const [list, setList] = useState<ExtendedTServiceAudioModel[]>([]);
  20. const [sysVoice, setSysVoice] = useState<ExtendedTServiceAudioModel | null>(
  21. null
  22. );
  23. const initPage = async () => {
  24. console.log("profileId: ", profileId);
  25. const res = await getSysVoiceList();
  26. if (res.code === 0 && res.data) {
  27. const r = res.data.map((item) => {
  28. item.checked = character?.defaultSystemVoice === item.voice;
  29. return item;
  30. }) as ExtendedTServiceAudioModel[];
  31. const checkedVoice = r.find((item) => !!item.checked);
  32. if (checkedVoice) {
  33. setSysVoice(checkedVoice);
  34. }
  35. setList(r);
  36. }
  37. };
  38. const handleSelect = async (voiceItem: ExtendedTServiceAudioModel) => {
  39. console.log("system voice select");
  40. const _list = list.map((item) => {
  41. return { ...item, checked: item.voice === voiceItem.voice };
  42. });
  43. setList(_list);
  44. setSysVoice(voiceItem);
  45. if (profileId) {
  46. saveCharacter({
  47. defaultSystemVoice: voiceItem.voice,
  48. voice: voiceItem.voice,
  49. profileId: profileId,
  50. });
  51. }
  52. // playerRef.current && playerRef.current.play(voiceItem.voice);
  53. onPlay && onPlay(voiceItem);
  54. };
  55. useEffect(() => {
  56. console.log("系统声音页面显示");
  57. initPage();
  58. }, [profileId]);
  59. return (
  60. <View className="w-full">
  61. <View className="flex flex-col w-full gap-28">
  62. <CardList>
  63. <View className="flex flex-col gap-12">
  64. {list.map((item: ExtendedTServiceAudioModel, index) => {
  65. // 与克隆语音是否相同
  66. const isEqualToClonedVoice = item.voice === character?.voice;
  67. return (
  68. <CardListItem
  69. underline
  70. rightRenderer={()=> {
  71. return <View className="flex items-center">
  72. <WemetaRadio
  73. // checked={item.checked && isEqualToClonedVoice}
  74. checked={ index === 0}
  75. ></WemetaRadio>
  76. </View>
  77. }}
  78. leftRenderer={()=> {
  79. return <Image
  80. src={item.avatar}
  81. mode="widthFix"
  82. className="w-56 h-56 rounded-12 shrink-0"
  83. ></Image>
  84. }}
  85. >
  86. <View
  87. className="flex gap-16 w-full"
  88. key={item.id}
  89. onClick={() => {
  90. handleSelect(item);
  91. }}
  92. >
  93. <View className="flex flex-1 flex-col gap-4 overflow-hidden">
  94. <View className="text-14 leading-22 font-medium text-black">
  95. {item.name}
  96. </View>
  97. <View className="flex-1 text-12 leading-20 font-medium text-gray-45 truncate">
  98. {item.gender === 1 ? "男" : "女"} {item.style}
  99. </View>
  100. </View>
  101. </View>
  102. </CardListItem>
  103. );
  104. })}
  105. </View>
  106. </CardList>
  107. </View>
  108. </View>
  109. );
  110. }