PromotionItem.tsx 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120
  1. import { css, cx } from "@linaria/core";
  2. import { IconMore } from "@queenjs/icons";
  3. import { Image, View } from "@queenjs/ui";
  4. import { Divider, Dropdown, Menu } from "ant-design-vue";
  5. import dayjs from "dayjs";
  6. import { defineUI } from "queenjs";
  7. import { any } from "vue-types";
  8. // const ShareBox = defineComponent({
  9. // props: {
  10. // id: string(),
  11. // },
  12. // setup(props) {
  13. // let shareLink = location.origin + "/share.html?id=" + props.id;
  14. // if (location.host == "www.infish.cn") {
  15. // shareLink =
  16. // location.origin + "/projects/queenshowv1/share.html?id=" + props.id;
  17. // }
  18. // const qrUrl = useQRCode(shareLink);
  19. // const { copy, copied } = useClipboard();
  20. // return () => (
  21. // <div class="p-20px bg-dark-500 text-center">
  22. // <img src={qrUrl.value} />
  23. // <div class="mb-20px"></div>
  24. // <Button onClick={() => copy(shareLink)} disabled={copied.value}>
  25. // {copied.value ? "已复制" : "复制链接"}
  26. // </Button>
  27. // </div>
  28. // );
  29. // },
  30. // });
  31. export default defineUI({
  32. props: {
  33. record: any(),
  34. },
  35. emits: ["edit", "preview", "menu"],
  36. setup(props, { emit }) {
  37. return () => {
  38. const { record } = props;
  39. return (
  40. <div class={cx(itemStyles, "relative")}>
  41. <View ratio={1} class="overflow-hidden relative">
  42. <Image
  43. class="h-1/1 w-1/1 !object-contain bg-[#ebebeb]"
  44. src={record?.thumbnail}
  45. />
  46. {/* <Tag
  47. color="#E88B00"
  48. // color="rgba(0, 0, 0, 0.4)"
  49. class="absolute top-0 left-0 z-1 !rounded-none"
  50. >
  51. 未发布
  52. </Tag> */}
  53. <div class="absolute inset-0 flex items-center justify-center opacity-0 hover:opacity-100 transition-opacity">
  54. <div
  55. class="text-white icon_action w-60px leading-60px orange cursor-pointer rounded-1/2 text-center transition-opacity hover:opacity-90 active:opacity-80"
  56. onClick={() => emit("edit", props.record)}
  57. >
  58. 编辑
  59. </div>
  60. <div
  61. class="text-white icon_action w-60px leading-60px ml-10px cursor-pointer rounded-1/2 text-center transition-opacity hover:opacity-90 active:opacity-80"
  62. onClick={() => emit("menu", "share")}
  63. >
  64. {/* 预览 */}
  65. 分享
  66. </div>
  67. </div>
  68. </View>
  69. <div class="item_footer rounded-b-4px flex items-center justify-between p-15px">
  70. <div class="flex-1 w-0">
  71. <div class="text-white text-bold truncate">{record.title}</div>
  72. <div class="flex items-center text-opacity-60 text-white text-12px mt-5px">
  73. {dayjs(record.updateTime).format("YYYY.MM.DD")}
  74. {/* 发布 */}
  75. <Divider type="vertical"></Divider>
  76. {record.views || 0 } 次浏览
  77. </div>
  78. </div>
  79. <Dropdown
  80. placement="bottom"
  81. overlay={
  82. <Menu class="w-90px">
  83. {/* <Menu.Item>复制</Menu.Item> */}
  84. {/* <Menu.Item>分享</Menu.Item> */}
  85. <Menu.Item>
  86. <div onClick={() => emit("menu", "rename")}>重命名</div>
  87. </Menu.Item>
  88. <Menu.Item>
  89. <div onClick={() => emit("menu", "delete")}>删除</div>
  90. </Menu.Item>
  91. </Menu>
  92. }
  93. >
  94. <IconMore class="ml-10px text-22px cursor-pointer" />
  95. </Dropdown>
  96. </div>
  97. </div>
  98. );
  99. };
  100. },
  101. });
  102. const itemStyles = css`
  103. .item_footer {
  104. background: #414141;
  105. }
  106. .icon_action {
  107. background-color: rgba(0, 0, 0, 0.8);
  108. &.orange {
  109. background-color: rgba(232, 139, 0, 0.8);
  110. }
  111. }
  112. `;