index.tsx 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131
  1. import {
  2. Button,
  3. Form,
  4. NavBar,
  5. TextArea,
  6. Uploader,
  7. } from "@nutui/nutui-react-taro";
  8. import { View } from "@tarojs/components";
  9. import Taro, { showToast, navigateBack } from "@tarojs/taro";
  10. import { useState } from "react";
  11. import { createPostApi } from "../../api/post";
  12. import { ArrowLeft } from "@nutui/icons-react-taro";
  13. const Publish = () => {
  14. const [uploadedFiles, setUploadedFiles] = useState<any[]>([]);
  15. const [form] = Form.useForm();
  16. // 获取 Authorization token
  17. const getAuthToken = () => {
  18. const token = Taro.getStorageSync("Authorization");
  19. return token ? `Bearer ${token}` : "";
  20. };
  21. // 处理提交
  22. const handleSubmit = async (data: any) => {
  23. const res: any = await createPostApi({
  24. circle_id: 1,
  25. content: data.content,
  26. media_url: data.urls.map((item: any) => item.url).join(","),
  27. });
  28. if (res.code === 200) {
  29. showToast({ title: "发布成功", icon: "success" });
  30. setTimeout(() => {
  31. navigateBack({ delta: 1 });
  32. }, 1500);
  33. }
  34. };
  35. // 处理上传成功
  36. const handleUploadSuccess = (param: {
  37. responseText: string;
  38. option: any;
  39. files: any[];
  40. }) => {
  41. // 从 responseText 中解析响应数据
  42. let responseData: any = null;
  43. try {
  44. // responseText 是一个对象,实际数据在 data 字段中
  45. const responseString =
  46. (param.responseText as any).data || param.responseText;
  47. responseData =
  48. typeof responseString === "string"
  49. ? JSON.parse(responseString)
  50. : responseString;
  51. } catch (error) {
  52. console.error("解析 responseText 失败:", error);
  53. }
  54. if (responseData && responseData.code === 200 && responseData.data) {
  55. const newFile = {
  56. name: responseData.data.origin_name || "未命名图片",
  57. url: responseData.data.media_url,
  58. uid: new Date().getTime(),
  59. type: "image",
  60. status: "success",
  61. message: "上传成功",
  62. };
  63. // 添加到现有文件列表
  64. setUploadedFiles((prevFiles) => {
  65. const updatedFiles = [...prevFiles, newFile];
  66. console.log("添加新文件:", newFile);
  67. console.log("更新后的文件列表:", updatedFiles);
  68. return updatedFiles;
  69. });
  70. console.log("添加新文件:", newFile);
  71. console.log("更新后的文件列表:", [...uploadedFiles, newFile]);
  72. // 追加图片到 uploadedFiles 状态
  73. form.setFieldValue("urls", [...uploadedFiles, newFile]);
  74. }
  75. };
  76. return (
  77. <>
  78. <NavBar
  79. back={
  80. <>
  81. <ArrowLeft />
  82. 返回
  83. </>
  84. }
  85. onBackClick={(e) => {
  86. e.preventDefault();
  87. navigateBack({ delta: 1 });
  88. }}
  89. >
  90. 发布
  91. </NavBar>
  92. <View className="p-[10px] pt-[0] bg-[#f7f8fa] min-h-screen">
  93. <Form form={form} onFinish={(data) => handleSubmit(data)}>
  94. <Form.Item name="content">
  95. <TextArea placeholder="这一刻的想法..." rows={10} />
  96. </Form.Item>
  97. <Form.Item name="urls">
  98. {/* 调试信息 */}
  99. <Uploader
  100. uploadLabel="添加图片"
  101. multiple
  102. maxCount={9}
  103. autoUpload
  104. accept="image/*"
  105. url={`/api/files/upload`}
  106. headers={{
  107. Authorization: getAuthToken(),
  108. }}
  109. onSuccess={handleUploadSuccess}
  110. />
  111. </Form.Item>
  112. <Form.Item>
  113. <Button block type="primary" onClick={() => form.submit()}>
  114. 发布
  115. </Button>
  116. </Form.Item>
  117. </Form>
  118. </View>
  119. </>
  120. );
  121. };
  122. export default Publish;