index.tsx 2.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. import NavBarNormal from "@/components/NavBarNormal/index";
  2. import { View } from "@tarojs/components";
  3. import PageCustom from "@/components/page-custom/index";
  4. import { useState, useCallback, useEffect } from "react";
  5. import StepStart from './components/step/StepStart'
  6. import StepPick from "./components/step/StepPick";
  7. import StepConfirm from "./components/step/StepConfirm";
  8. import { TAvatarItem } from "@/service/storage";
  9. import IconCloseBlack16 from '@/components/icon/IconCloseBlack16'
  10. import Taro from "@tarojs/taro";
  11. type TStep = 'start'|'pick'|'confirm'
  12. //todo: 使用 store 实现一个状态机
  13. export default function Index() {
  14. const [state, setState] = useState<TStep>('start')
  15. const [taskId, setTaskId] = useState<string>()
  16. const [pickedAvatar, setPickedAvatar] = useState<TAvatarItem>()
  17. const [avatars, setAvatars] = useState<TAvatarItem[]>([]);
  18. const [videos, setVideos] = useState<TAvatarItem[]>([]);
  19. const getClassName = useCallback((_state: TStep) => {
  20. return state === _state ? 'block': 'hidden'
  21. }, [state]);
  22. const handleStartNext = ()=> {
  23. setAvatars([])
  24. setVideos([])
  25. setState('pick')
  26. }
  27. const toStartStep = ()=> {
  28. setTaskId(undefined)
  29. setState('start')
  30. }
  31. const renderNavLeft = ()=> {
  32. return <View className="flex items-center" onClick={()=> Taro.navigateBack()}><IconCloseBlack16 /></View>
  33. }
  34. return (
  35. <PageCustom>
  36. <NavBarNormal leftColumn={renderNavLeft}>形象照</NavBarNormal>
  37. <View className="px-16 w-full flex flex-col gap-20">
  38. {/* 第一步开始 */}
  39. <View className={getClassName('start')}>
  40. <StepStart next={()=> handleStartNext()} setTaskId={setTaskId}/>
  41. </View>
  42. {/* 第二步 生成多个形象提供用户选择 */}
  43. <View className={getClassName('pick')}>
  44. {taskId && <StepPick
  45. taskId={taskId}
  46. setAvatars={setAvatars}
  47. avatars={avatars}
  48. videos={videos}
  49. setVideos={setVideos}
  50. setPickedAvatar={setPickedAvatar}
  51. prev={()=> toStartStep()}
  52. next={()=> setState('confirm')}
  53. />}
  54. </View>
  55. {/* 第三步 确认选择作为智能体的形象 */}
  56. <View className={getClassName('confirm')}>
  57. {pickedAvatar && <StepConfirm
  58. pickedAvatar={pickedAvatar}
  59. prev={()=> setState('pick')}
  60. />}
  61. </View>
  62. </View>
  63. </PageCustom>
  64. );
  65. }