Files
agent-workbench/assets/dashboard/src/lib/use-local-draft.ts
T

12 lines
1.8 KiB
TypeScript

import { useRef, useState } from 'react'
import { clearDraft, clearIfUnchanged, draftKey, readDraft, writeDraft } from './draft-storage'
export function useLocalDraft<T>(scope: string[] | null, empty: T, valid: (value: unknown) => value is T, olderVersions = false) {
const identity=JSON.stringify(scope), ref=useRef<{identity:string;value:T;error:string;loaded:boolean;persisted:string|null} | null>(null)
const [, redraw]=useState(0)
if(ref.current?.identity!==identity){let value=empty,error='',persisted=null;try{if(scope){value=readDraft(window.localStorage,scope,empty,valid,olderVersions);persisted=window.localStorage.getItem(draftKey(scope))}else error='实例或版本信息尚未就绪,暂不能保存或发送。'}catch{error='草稿读取失败,请先复制输入。'}ref.current={identity,value,error,loaded:!error,persisted}}
const record=ref.current!
function save(value:T){record.value=value;try{if(!scope)throw Error();writeDraft(window.localStorage,scope,value);record.persisted=window.localStorage.getItem(draftKey(scope));record.error='';record.loaded=true;redraw(n=>n+1);return true}catch{record.error='草稿保存失败,请复制后重试。';record.loaded=false;redraw(n=>n+1);return false}}
function clear(allVersions=false,userRequested=false){try{if(!scope)throw Error();if(allVersions||userRequested)clearDraft(window.localStorage,scope,allVersions);else if(!clearIfUnchanged(window.localStorage,scope,record.persisted)){record.error='';redraw(n=>n+1);return false}record.value=empty;record.persisted=window.localStorage.getItem(draftKey(scope));record.error='';record.loaded=true;redraw(n=>n+1);return true}catch{record.error='草稿清除失败,请勿重复提交。';record.loaded=false;redraw(n=>n+1);return false}}
return {value:record.value,error:record.error,save,clear,ready:Boolean(scope)&&record.loaded}
}