11import * as React from 'react' ;
22import { useState , useEffect } from 'react' ;
3- import { Form , Switch , message , Alert , Input } from 'antd' ;
3+ import { Form , Switch , message , Alert , Input , Button } from 'antd' ;
44import * as YAML from 'yaml' ;
55import { challenges } from '../ChallengeListPage/ChallengeData' ;
66
@@ -24,6 +24,9 @@ import FormSubmitSection from './components/FormSubmitSection';
2424// 导入样式
2525import { styles } from './styles' ;
2626
27+ // localStorage键名
28+ const STORAGE_KEY = 'challenge_contribute_form_data' ;
29+
2730/**
2831 * 挑战贡献页面组件
2932 */
@@ -52,12 +55,30 @@ const ChallengeContributePage: React.FC = () => {
5255 isExpired : false ,
5356 } ) ;
5457
55- // 初始化下一个可用的ID
58+ // 从localStorage加载保存的表单数据
5659 useEffect ( ( ) => {
57- const nextId = calculateNextId ( ) ;
58- form . setFieldsValue ( { id : nextId } ) ;
60+ try {
61+ const savedData = localStorage . getItem ( STORAGE_KEY ) ;
62+ if ( savedData ) {
63+ const parsedData = JSON . parse ( savedData ) as ChallengeFormData ;
64+ setInitialFormValues ( parsedData ) ;
65+ form . setFieldsValue ( parsedData ) ;
66+ console . log ( '已从本地存储恢复表单数据' ) ;
67+ }
68+ } catch ( error ) {
69+ console . error ( '从本地存储恢复数据失败:' , error ) ;
70+ }
5971 } , [ form ] ) ;
6072
73+ // 初始化下一个可用的ID
74+ useEffect ( ( ) => {
75+ // 只有当localStorage中没有保存的ID时,才使用自动计算的ID
76+ if ( ! initialFormValues . id ) {
77+ const nextId = calculateNextId ( ) ;
78+ form . setFieldsValue ( { id : nextId } ) ;
79+ }
80+ } , [ form , initialFormValues . id ] ) ;
81+
6182 // 计算下一个可用ID
6283 const calculateNextId = ( ) : number => {
6384 if ( ! challenges || challenges . length === 0 ) {
@@ -68,8 +89,16 @@ const ChallengeContributePage: React.FC = () => {
6889 } ;
6990
7091 // 表单值变更处理
71- const handleFormValueChange = ( ) => {
92+ const handleFormValueChange = ( changedValues : any , allValues : any ) => {
7293 setIsFormDirty ( true ) ;
94+
95+ // 将表单数据保存到localStorage
96+ try {
97+ localStorage . setItem ( STORAGE_KEY , JSON . stringify ( allValues ) ) ;
98+ console . log ( '表单数据已保存到本地存储' ) ;
99+ } catch ( error ) {
100+ console . error ( '保存数据到本地存储失败:' , error ) ;
101+ }
73102 } ;
74103
75104 // 生成YAML数据
@@ -99,6 +128,26 @@ const ChallengeContributePage: React.FC = () => {
99128 }
100129 } ;
101130
131+ // 清除保存的表单数据
132+ const clearSavedData = ( ) => {
133+ try {
134+ localStorage . removeItem ( STORAGE_KEY ) ;
135+ message . success ( '已清除本地存储的表单数据' ) ;
136+ // 重置表单
137+ form . resetFields ( ) ;
138+ const nextId = calculateNextId ( ) ;
139+ form . setFieldsValue ( {
140+ id : nextId ,
141+ platform : 'Web' ,
142+ isExpired : false
143+ } ) ;
144+ setIsFormDirty ( false ) ;
145+ } catch ( error ) {
146+ console . error ( '清除本地存储的表单数据失败:' , error ) ;
147+ message . error ( '清除数据失败' ) ;
148+ }
149+ } ;
150+
102151 // 表单提交
103152 const handleFinish = async ( ) => {
104153 try {
@@ -133,6 +182,9 @@ const ChallengeContributePage: React.FC = () => {
133182 // 显示成功消息
134183 message . success ( '挑战已成功提交!' ) ;
135184
185+ // 清除本地存储的表单数据
186+ localStorage . removeItem ( STORAGE_KEY ) ;
187+
136188 // 3秒后重置成功状态
137189 setTimeout ( ( ) => {
138190 setIsSubmitSuccess ( false ) ;
@@ -149,7 +201,17 @@ const ChallengeContributePage: React.FC = () => {
149201 < div style = { styles . container } >
150202 < Alert
151203 message = "注意事项"
152- description = "请填写完整的挑战信息,以便其他用户理解和解决此挑战。所有标记为必填的字段都必须填写。"
204+ description = {
205+ < div >
206+ < p > 请填写完整的挑战信息,以便其他用户理解和解决此挑战。所有标记为必填的字段都必须填写。</ p >
207+ < p > 表单数据会自动保存到浏览器本地存储,刷新页面后可以继续编辑。</ p >
208+ < div style = { { marginTop : 8 } } >
209+ < Button size = "small" danger onClick = { clearSavedData } >
210+ 清除已保存的数据
211+ </ Button >
212+ </ div >
213+ </ div >
214+ }
153215 type = "info"
154216 showIcon
155217 style = { styles . alert }
0 commit comments