CustomComps.tsx 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. import { Container, Draggable } from "vue-dndrop";
  2. import { any, string } from "vue-types";
  3. import { useEditor } from "@/modules/editor";
  4. import { ICompKeys } from "@/modules/editor/typings";
  5. import { Empty, Image } from "@queenjs/ui";
  6. import { useReactive } from "@queenjs/use";
  7. import { defineUI } from "queenjs";
  8. export default defineUI({
  9. props: {
  10. compType: string<"user" | "senior">(),
  11. },
  12. setup(props) {
  13. const editor = useEditor();
  14. const { compUICtrl } = editor.controls;
  15. const state = useReactive(() => ({
  16. currComps() {
  17. return Array.from(compUICtrl.state.components.values()).filter(
  18. (item) => props.compType === item.compType
  19. );
  20. },
  21. }));
  22. return () => {
  23. return <Comp components={state.currComps} />;
  24. };
  25. },
  26. });
  27. const Comp = defineUI({
  28. props: {
  29. components: any<
  30. {
  31. compKey: string;
  32. name: string;
  33. thumbnail: string;
  34. }[]
  35. >().isRequired,
  36. },
  37. setup(props) {
  38. const editor = useEditor();
  39. return () => {
  40. if (props.components.length == 0) return <Empty />;
  41. return (
  42. <Container
  43. class="space-y-10px scrollbar"
  44. behaviour="copy"
  45. group-name="canvas"
  46. animation-duration={0}
  47. get-child-payload={(index: number) => {
  48. return props.components[index].compKey;
  49. }}
  50. >
  51. {props.components.map((item) => {
  52. return (
  53. <Draggable>
  54. <div
  55. class="text-center leading-50px bg-dark-50 rounded draggable-item"
  56. key={item.compKey}
  57. title={item.name}
  58. onClick={() =>
  59. editor.actions.clickCompToDesign(item.compKey as ICompKeys)
  60. }
  61. >
  62. <Image
  63. class="w-full rounded pointer-events-none"
  64. src={item.thumbnail}
  65. size={240}
  66. />
  67. </div>
  68. </Draggable>
  69. );
  70. })}
  71. </Container>
  72. );
  73. };
  74. },
  75. });