Files
chinese-family-tree-2/.next/static/chunks/209f1cae4629eb7d.js
T
freedakgmail 3b0d8255f6 0.0.8.1
2025-11-23 19:38:51 +08:00

7 lines
37 KiB
JavaScript

(globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push(["object"==typeof document?document.currentScript:void 0,47430,e=>{"use strict";var t,r,s=e.i(36792),a=e.i(82772),l=e.i(92879),n=e.i(9991),d=e.i(10743),i=e.i(42864),c=e.i(26922),o=e.i(27706);let h=(0,o.default)("TriangleAlert",[["path",{d:"m21.73 18-8-14a2 2 0 0 0-3.48 0l-8 14A2 2 0 0 0 4 21h16a2 2 0 0 0 1.73-3",key:"wmoenq"}],["path",{d:"M12 9v4",key:"juzpu7"}],["path",{d:"M12 17h.01",key:"p32p05"}]]),u=(0,o.default)("FileText",[["path",{d:"M15 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V7Z",key:"1rqfz7"}],["path",{d:"M14 2v4a2 2 0 0 0 2 2h4",key:"tnqrlb"}],["path",{d:"M10 9H8",key:"b1mrlr"}],["path",{d:"M16 13H8",key:"t4e002"}],["path",{d:"M16 17H8",key:"z1uh3a"}]]),f=(0,o.default)("Database",[["ellipse",{cx:"12",cy:"5",rx:"9",ry:"3",key:"msslwz"}],["path",{d:"M3 5V19A9 3 0 0 0 21 19V5",key:"1wlel7"}],["path",{d:"M3 12A9 3 0 0 0 21 12",key:"mv7ke4"}]]);var p=e.i(21446),x=e.i(34346);let m=(e,t)=>{let r=t.prototype;Object.setPrototypeOf?Object.setPrototypeOf(e,r):(void 0).__proto__=r};class g extends Error{constructor(e){super(e),m(this,new.target)}}class N extends g{constructor(e){super(e),this.message=e,m(this,new.target)}}class b extends N{}class j extends N{constructor(e,t){super(e),this.illegalCode=t,m(this,new.target)}}class v extends N{constructor(e,t){super(e),this.charset=t,m(this,new.target)}}class y extends N{constructor(e,t,r){super(e),this.lineNumber=t,this.line=r,m(this,new.target)}}class w extends N{constructor(e,t){super(e),this.lineNumber=t,m(this,new.target)}}class E extends w{constructor(e,t,r,s){super(e,t),this.lineNumber=t,this.currentLevel=r,this.level=s,m(this,new.target)}}class C extends w{constructor(e,t,r){super(e,t),this.lineNumber=t,this.kind=r,m(this,new.target)}}class I extends w{constructor(e,t){super(e,t),m(this,new.target)}}class S extends N{constructor(e){super(e),m(this,new.target)}}class A extends N{constructor(e){super(e),m(this,new.target)}}class T extends A{constructor(e,t,r,s){super(e),this.lineNumber=t,this.lineNumberOriginalDefinition=r,this.pointer=s,m(this,new.target)}}let $="A-Za-z0-9",O=`[${$}][${$} ]*`,R=`@#(?:${O})@`,M=`[${$}-_]+`,D=`[^\\x00-\\x08\\x0A-\\x1F\\r\\n@]|@`,U=`(?:${D})*`,F=`${R}|${U}|${R}[ ]${U}`,k=`@${M}@`,L=`${k}`,H=`${L}|(?:${F})`,P=`[${$}]+|_[${$}_]+`,B=`\\r\\n?|\\n`,_=`([1-9][0-9]+|[0-9])(?: (${k}))? (${P})(?: (${H}))?(${B}|$)`;class G{constructor(e,t){this.input=e,this.strict=t,this.rGedcomLines=RegExp(`^${_}`,"gym"),this.linesRead=0,this.charactersRead=0}[Symbol.iterator](){return this}next(){let e=this.rGedcomLines.exec(this.input);if(null!==e&&(0!==e[5].length||this.charactersRead+e[0].length===this.input.length))return this.charactersRead+=e[0].length,this.linesRead++,{done:!1,value:e};{null!==e&&(this.charactersRead+=e[0].length);let t=this.charactersRead===this.input.length;if(this.strict&&!t){let e=this.input.substring(this.charactersRead,Math.min(this.charactersRead+256,this.input.length)).split(/[\r\n]+/,1)[0];throw new y(`Invalid format for line ${this.linesRead+1}: "${e}"`,this.linesRead+1,e)}return{done:!0,value:null}}}}let W=(e,t=!0)=>new G(e,t),V=(e,t=!1,r=null)=>{r&&r(0);let s=0,a=0,l=-1,n=[{tag:null,pointer:null,value:null,indexSource:-1,indexRelative:0,children:[]}];for(let d of e){let[e,i,c,o,h]=d,u=h?h.replace(/@@/g,"@"):h;a+=e.length;let f=parseInt(i),p=f<=l,x=f===l+1;if(f<0||!p&&!x)throw new E(`Illegal nesting level at line ${s+1} (current is ${l}, got ${f})`,s+1,l,f);let m=l-f+1;for(let e=0;e<m;e++)n.pop();let g=n[n.length-1],N=g.children;if("CONC"!==o||t)if("CONT"!==o||t){let e={tag:o,pointer:null!=c?c:null,value:null!=u?u:null,indexSource:s,indexRelative:g.children.length,children:[]};if(N.push(e),c&&f>0)throw new I(`Record must be a top-level definition at line ${s+1}`,s+1);n.push(e),l=f}else{if(c)throw new C(`Illegal continuation format at line ${s+1}`,s+1,"CONT");if(!g)throw new C(`Continuation with no parent at line ${s+1}`,s+1,"CONT");null==g.value&&(g.value=""),g.value+="\n"+(null!=u?u:""),l=f-1}else{if(c)throw new C(`Illegal concatenation format at line ${s+1}`,s+1,"CONC");if(!g)throw new C(`Concatenation with no parent at line ${s+1}`,s+1,"CONC");null==g.value&&(g.value=""),g.value+=null!=u?u:"",l=f-1}s++,r&&s%5e4==0&&r(a)}return r&&r(a),n[0]},J=[239,187,191],z=[254,255],q=z.slice().reverse(),X=[0,0,254,255],Y=X.slice().reverse(),K="utf-8",Z="utf-16be",Q="utf-16le",ee=(e,t,r)=>{r&&r(0);let s="",a=new Uint8Array(e);for(let e=0;e<a.length;e+=2){let l=a[e],n=a[e+1];s+=String.fromCharCode(t?16*l+n:16*n+l),r&&(e+1)/2%2e5==0&&r(e)}return s},et=(e,t)=>{let r;t&&t(0);let s=new Uint8Array(e),a=e=>{if(s.length<e.length)return!1;for(let t=0;t<e.length;t++)if(s[t]!==e[t])return!1;return!0},l=[[K,J],[Z,z],[Q,q]].map(([e,t])=>({charset:e,bom:t})).find(({bom:e})=>a(e));if([X,Y].some(e=>a(e)))throw new v("Unsupported charset detected from BOM: 'utf-32'","utf-32");let n=void 0!==l?l.charset:null,d=void 0!==l?s.slice(l.bom.length):s,i=null!==n?n:K;if(i===K)r=((e,t)=>{let r="",s=new Uint8Array(e),a=0;for(let e,t=s.length;a<t;a++)r+=String.fromCharCode((e=s[a])>251&&e<254&&a+5<t?(e-252)*0x40000000+(s[++a]-128<<24)+(s[++a]-128<<18)+(s[++a]-128<<12)+(s[++a]-128<<6)+s[++a]-128:e>247&&e<252&&a+4<t?(e-248<<24)+(s[++a]-128<<18)+(s[++a]-128<<12)+(s[++a]-128<<6)+s[++a]-128:e>239&&e<248&&a+3<t?(e-240<<18)+(s[++a]-128<<12)+(s[++a]-128<<6)+s[++a]-128:e>223&&e<240&&a+2<t?(e-224<<12)+(s[++a]-128<<6)+s[++a]-128:e>191&&e<224&&a+1<t?(e-192<<6)+s[++a]-128:e);return r})(d);else if(i===Z)r=ee(d,!0,void 0);else if(i===Q)r=ee(d,!1,void 0);else throw Error();return t&&t(s.length),{output:r,bomCharset:n}};(t=r||(r={})).Utf8="UTF-8",t.Ansel="ANSEL",t.Cp1252="Cp1252",t.Macintosh="Macintosh",t.Cp850="Cp850",t.Utf16be="UTF-16be",t.Utf16le="UTF-16le";let er=(e,t)=>{let r={};e.children.forEach((e,t)=>{null!==e.tag&&(void 0===r[e.tag]&&(r[e.tag]=[]),r[e.tag].push(t))}),Object.defineProperty(e,"_index",{enumerable:t,configurable:!0,writable:!0}),e._index={byTag:r}},es=e=>{let t={};e.children.forEach((r,s)=>{if(null!==r.tag&&null!==r.pointer){if(void 0===t[r.tag]&&(t[r.tag]={}),void 0!==t[r.tag][r.pointer])throw new T(`Duplicate pointer: ${r.pointer}`,r.indexSource+1,e.children[t[r.tag][r.pointer]].indexSource,r.pointer);t[r.tag][r.pointer]=s}}),e._index.byTagPointer=t};function ea(e){let t=new Date(e);return`${t.getDate()} ${["JAN","FEB","MAR","APR","MAY","JUN","JUL","AUG","SEP","OCT","NOV","DEC"][t.getMonth()]} ${t.getFullYear()}`}function el(e){let t=e.trim().split(" ");if(3===t.length){let e=parseInt(t[0]),r={JAN:0,FEB:1,MAR:2,APR:3,MAY:4,JUN:5,JUL:6,AUG:7,SEP:8,OCT:9,NOV:10,DEC:11}[t[1].toUpperCase()],s=parseInt(t[2]);if(!isNaN(e)&&void 0!==r&&!isNaN(s))return new Date(s,r,e).toISOString().split("T")[0]}return 1!==t.length||isNaN(parseInt(t[0]))?new Date().toISOString().split("T")[0]:`${t[0]}-01-01`}var en=e.i(43840),ed=e.i(90672),ei=e.i(50314);let ec=(0,o.default)("History",[["path",{d:"M3 12a9 9 0 1 0 9-9 9.75 9.75 0 0 0-6.74 2.74L3 8",key:"1357e3"}],["path",{d:"M3 3v5h5",key:"1xhq8a"}],["path",{d:"M12 7v5l4 2",key:"1fdv2h"}]]);var eo=e.i(34072);let eh=(0,o.default)("RefreshCw",[["path",{d:"M3 12a9 9 0 0 1 9-9 9.75 9.75 0 0 1 6.74 2.74L21 8",key:"v9h5vc"}],["path",{d:"M21 3v5h-5",key:"1q7to0"}],["path",{d:"M21 12a9 9 0 0 1-9 9 9.75 9.75 0 0 1-6.74-2.74L3 16",key:"3uifl3"}],["path",{d:"M8 16H3v5",key:"1cv678"}]]),eu=(0,o.default)("Image",[["rect",{width:"18",height:"18",x:"3",y:"3",rx:"2",ry:"2",key:"1m3agn"}],["circle",{cx:"9",cy:"9",r:"2",key:"af1f0g"}],["path",{d:"m21 15-3.086-3.086a2 2 0 0 0-2.828 0L6 21",key:"1xmnt7"}]]);var ef=e.i(51788),ep=e.i(58051),ex=e.i(86467),em=e.i(87830),eg=e.i(75212);let eN={CREATE:"创建",UPDATE:"更新",DELETE:"删除",IMPORT:"导入",EXPORT:"导出"},eb={CREATE:"bg-green-500",UPDATE:"bg-blue-500",DELETE:"bg-red-500",IMPORT:"bg-purple-500",EXPORT:"bg-orange-500"},ej={MEMBER:"成员",PHOTO:"照片",STORY:"故事",SETTINGS:"设置"},ev={MEMBER:p.User,PHOTO:eu,STORY:u,SETTINGS:ef.Settings};function ey(){let{currentTree:e}=(0,l.useFamily)(),{data:t}=(0,em.useSession)(),{showAlert:r,showConfirm:a,showPrompt:i}=(0,eg.useDialog)(),[c,o]=(0,x.useState)([]),[h,f]=(0,x.useState)([]),[p,m]=(0,x.useState)(!1),[g,N]=(0,x.useState)(null),[b,j]=(0,x.useState)("all"),[v,y]=(0,x.useState)(!1);(0,x.useEffect)(()=>{fetch("/api/trees").then(e=>e.json()).then(e=>{e.trees&&f(e.trees)}).catch(e=>console.error("加载家族树列表失败:",e))},[]),(0,x.useEffect)(()=>{e?.id&&j(e.id)},[e?.id]);let w=async()=>{m(!0),N(null);try{let e="";e="all"===b?"/api/user/activity-logs?limit=100":`/api/trees/${b}/activity-logs?limit=100`;let t=await fetch(e);if(!t.ok)throw Error("获取日志失败");let r=await t.json();o(r.logs||[])}catch(e){console.error("加载日志失败:",e),N(e instanceof Error?e.message:"加载失败")}finally{m(!1)}};(0,x.useEffect)(()=>{w()},[b]);let E=async()=>{if("all"===b)return void await r("请先选择一个具体的家族树再清空日志","提示");let e=h.find(e=>e.id===b);if(!e)return void await r("未找到选中的家族树","错误");let t=`⚠️ 警告:即将清空"${e.name}"的所有操作日志!
此操作将永久删除该家族树的所有历史记录,且不可恢复。
确定要继续吗?`;if(await a(t,"清空操作日志","destructive")){if(await i(`请输入家族树名称"${e.name}"以确认清空操作:
(此操作不可撤销)`,"","确认清空")!==e.name)return void await r("名称不匹配,操作已取消","操作已取消");y(!0);try{let e=await fetch(`/api/trees/${b}/activity-logs`,{method:"DELETE"});if(!e.ok){let t=await e.json();throw Error(t.error||"清空失败")}let t=await e.json();await r(t.message||"操作日志已清空","成功"),await w()}catch(e){console.error("清空日志失败:",e),await r("清空失败:"+(e instanceof Error?e.message:"未知错误"),"错误")}finally{y(!1)}}};return(0,s.jsx)("div",{className:"space-y-6",children:(0,s.jsxs)(d.Card,{children:[(0,s.jsx)(d.CardHeader,{children:(0,s.jsxs)("div",{className:"flex flex-col md:flex-row md:items-center justify-between gap-4",children:[(0,s.jsxs)("div",{children:[(0,s.jsxs)(d.CardTitle,{className:"flex items-center gap-2",children:[(0,s.jsx)(ec,{className:"h-5 w-5"}),"操作日志"]}),(0,s.jsx)(d.CardDescription,{children:"查看家族树的变更记录"})]}),(0,s.jsxs)("div",{className:"flex items-center gap-2",children:[(0,s.jsx)(n.Button,{variant:"outline",size:"icon",onClick:w,disabled:p||v,className:"h-9 w-9",title:"刷新日志",children:(0,s.jsx)(eh,{className:`h-4 w-4 ${p?"animate-spin":""}`})}),(()=>{if("all"===b)return!1;let e=h.find(e=>e.id===b);return!!e&&(e.ownerId===t?.user?.id||"OWNER"===e.currentUserRole)})()&&(0,s.jsxs)(n.Button,{variant:"destructive",size:"sm",onClick:E,disabled:p||v,className:"gap-2",title:"清空当前家族树的操作日志(仅所有者可用)",children:[(0,s.jsx)(eo.Trash2,{className:"h-4 w-4"}),v?"清空中...":"清空日志"]}),(0,s.jsx)("div",{className:"w-[200px]",children:(0,s.jsxs)(ei.Select,{value:b,onValueChange:j,children:[(0,s.jsx)(ei.SelectTrigger,{children:(0,s.jsxs)("div",{className:"flex items-center gap-2",children:[(0,s.jsx)(ep.Filter,{className:"h-4 w-4 text-muted-foreground"}),(0,s.jsx)(ei.SelectValue,{placeholder:"筛选家族树"})]})}),(0,s.jsxs)(ei.SelectContent,{children:[(0,s.jsx)(ei.SelectItem,{value:"all",children:"所有家族树"}),h.map(e=>(0,s.jsx)(ei.SelectItem,{value:e.id,children:e.name},e.id))]})]})})]})]})}),(0,s.jsx)(d.CardContent,{children:(0,s.jsx)(en.ScrollArea,{className:"h-[400px] pr-4",children:g?(0,s.jsxs)("div",{className:"text-center py-8 text-destructive",children:["加载失败: ",g]}):p&&0===c.length?(0,s.jsx)("div",{className:"text-center py-8 text-muted-foreground",children:"加载中..."}):0===c.length?(0,s.jsx)("div",{className:"text-center py-8 text-muted-foreground",children:"暂无操作记录"}):(0,s.jsx)("div",{className:"space-y-3",children:c.map(e=>{let t=ev[e.entityType]||u;return(0,s.jsxs)("div",{className:"flex items-start gap-3 p-3 bg-muted/50 rounded-lg hover:bg-muted transition-colors",children:[(0,s.jsx)("div",{className:`p-2 rounded-full ${eb[e.action]} bg-opacity-10`,children:(0,s.jsx)(t,{className:`h-4 w-4 ${eb[e.action].replace("bg-","text-")}`})}),(0,s.jsxs)("div",{className:"flex-1 min-w-0",children:[(0,s.jsxs)("div",{className:"flex items-center gap-2 mb-1 flex-wrap",children:[(0,s.jsx)(ed.Badge,{variant:"outline",className:"text-xs",children:eN[e.action]||e.action}),(0,s.jsx)(ed.Badge,{variant:"secondary",className:"text-xs",children:ej[e.entityType]||e.entityType}),"all"===b&&e.tree&&(0,s.jsx)(ed.Badge,{variant:"outline",className:"text-xs bg-blue-50 text-blue-700 border-blue-200",children:e.tree.name}),e.entityName&&(0,s.jsx)("span",{className:"text-sm font-medium truncate",children:e.entityName})]}),(0,s.jsxs)("div",{className:"flex items-center justify-between",children:[(0,s.jsx)("p",{className:"text-xs text-muted-foreground",children:e.user?.name||e.user?.email||"未知用户"}),(0,s.jsx)("p",{className:"text-xs text-muted-foreground",children:(0,ex.format)(new Date(e.timestamp),"yyyy-MM-dd HH:mm:ss")})]}),e.changes&&Object.keys(e.changes).length>0&&(0,s.jsxs)("details",{className:"mt-2",children:[(0,s.jsx)("summary",{className:"text-xs text-muted-foreground cursor-pointer hover:text-foreground",children:"查看变更详情"}),(0,s.jsx)("pre",{className:"text-xs mt-1 p-2 bg-background rounded overflow-x-auto",children:JSON.stringify(e.changes,null,2)})]})]})]},e.id)})})})})]})})}var ew=x;class eE extends ew.default.Component{constructor(e){super(e),this.state={hasError:!1}}static getDerivedStateFromError(e){return{hasError:!0,error:e}}componentDidCatch(e,t){console.error("ErrorBoundary 捕获错误:",e,t)}render(){return this.state.hasError?this.props.fallback||(0,s.jsxs)("div",{className:"p-4 border border-destructive rounded-lg bg-destructive/10",children:[(0,s.jsx)("h3",{className:"text-lg font-bold text-destructive mb-2",children:"组件加载失败"}),(0,s.jsx)("p",{className:"text-sm text-muted-foreground",children:this.state.error?.message||"未知错误"}),(0,s.jsx)("button",{className:"mt-4 px-4 py-2 bg-primary text-primary-foreground rounded",onClick:()=>this.setState({hasError:!1}),children:"重试"})]}):this.props.children}}var eC=e.i(59786),eI=e.i(77627),eS=e.i(75985),eA=e.i(12039);let eT=(0,o.default)("Lock",[["rect",{width:"18",height:"11",x:"3",y:"11",rx:"2",ry:"2",key:"1w4ew1"}],["path",{d:"M7 11V7a5 5 0 0 1 10 0v4",key:"fwvmzm"}]]),e$=(0,o.default)("CircleCheck",[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["path",{d:"m9 12 2 2 4-4",key:"dzmm74"}]]);function eO(){let[e,t]=(0,x.useState)(""),[r,a]=(0,x.useState)(""),[l,i]=(0,x.useState)(""),[c,o]=(0,x.useState)(!1),[h,u]=(0,x.useState)(""),[f,p]=(0,x.useState)(!1),m=async s=>{s.preventDefault(),u(""),p(!1),o(!0);try{let s=await fetch("/api/user/change-password",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({currentPassword:e,newPassword:r,confirmPassword:l})}),n=await s.json();if(!s.ok)return void u(n.error||"修改密码失败");p(!0),t(""),a(""),i(""),setTimeout(()=>p(!1),3e3)}catch(e){u("修改密码失败,请稍后重试")}finally{o(!1)}};return(0,s.jsxs)(d.Card,{children:[(0,s.jsxs)(d.CardHeader,{children:[(0,s.jsxs)(d.CardTitle,{className:"flex items-center gap-2",children:[(0,s.jsx)(eT,{className:"h-5 w-5"})," 修改密码"]}),(0,s.jsx)(d.CardDescription,{children:"更改您的登录密码"})]}),(0,s.jsx)(d.CardContent,{children:(0,s.jsxs)("form",{onSubmit:m,className:"space-y-4",children:[h&&(0,s.jsx)(eA.Alert,{variant:"destructive",children:(0,s.jsx)(eA.AlertDescription,{children:h})}),f&&(0,s.jsxs)(eA.Alert,{className:"bg-green-50 border-green-200",children:[(0,s.jsx)(e$,{className:"h-4 w-4 text-green-600"}),(0,s.jsx)(eA.AlertDescription,{className:"text-green-800",children:"密码修改成功!"})]}),(0,s.jsxs)("div",{className:"space-y-2",children:[(0,s.jsx)(eS.Label,{htmlFor:"currentPassword",children:"当前密码"}),(0,s.jsx)(eI.Input,{id:"currentPassword",type:"password",placeholder:"输入当前密码",value:e,onChange:e=>t(e.target.value),required:!0,disabled:c})]}),(0,s.jsxs)("div",{className:"space-y-2",children:[(0,s.jsx)(eS.Label,{htmlFor:"newPassword",children:"新密码"}),(0,s.jsx)(eI.Input,{id:"newPassword",type:"password",placeholder:"至少6个字符",value:r,onChange:e=>a(e.target.value),required:!0,disabled:c,minLength:6})]}),(0,s.jsxs)("div",{className:"space-y-2",children:[(0,s.jsx)(eS.Label,{htmlFor:"confirmPassword",children:"确认新密码"}),(0,s.jsx)(eI.Input,{id:"confirmPassword",type:"password",placeholder:"再次输入新密码",value:l,onChange:e=>i(e.target.value),required:!0,disabled:c})]}),(0,s.jsx)(n.Button,{type:"submit",disabled:c,className:"w-full",children:c?"修改中...":"修改密码"})]})})]})}var eR=e.i(59210);function eM(){let{treeData:e,currentTree:t,loadData:r,resetData:o}=(0,l.useFamily)(),m=t?.currentUserRole,{data:g}=(0,em.useSession)(),{showAlert:N,showConfirm:y}=(0,eg.useDialog)(),[w,E]=(0,x.useState)(""),[C,I]=(0,x.useState)(""),[A,T]=(0,x.useState)(null),$=(0,x.useRef)(null),O=(0,x.useRef)(null);(0,x.useEffect)(()=>{g?.user?.id&&fetch("/api/user/profile").then(e=>e.json()).then(e=>{e.user&&T(e.user)}).catch(e=>console.error("获取用户资料失败:",e))},[g?.user?.id]);let R=e=>({OWNER:"所有者",EDITOR:"编辑者",VIEWER:"查看者"})[e]||e,M=e=>({OWNER:"bg-purple-100 text-purple-700 border-purple-200",EDITOR:"bg-blue-100 text-blue-700 border-blue-200",VIEWER:"bg-gray-100 text-gray-700 border-gray-200"})[e]||"bg-gray-100 text-gray-700";return(0,s.jsxs)("div",{className:"min-h-screen bg-background flex flex-col font-sans",children:[(0,s.jsx)(a.SiteHeader,{}),(0,s.jsxs)("main",{className:"container mx-auto py-8 px-4 md:px-6 flex-1 max-w-6xl",children:[(0,s.jsx)("h1",{className:"text-3xl font-serif font-bold mb-8",children:"系统设置 (Settings)"}),(0,s.jsxs)("div",{className:"space-y-6",children:[g&&(0,s.jsxs)("div",{className:"grid grid-cols-1 lg:grid-cols-2 gap-6",children:[(0,s.jsxs)(d.Card,{children:[(0,s.jsxs)(d.CardHeader,{children:[(0,s.jsxs)(d.CardTitle,{className:"flex items-center gap-2",children:[(0,s.jsx)(p.User,{className:"h-5 w-5"})," 系统设置"]}),(0,s.jsx)(d.CardDescription,{children:"您的账号信息和角色"})]}),(0,s.jsxs)(d.CardContent,{className:"space-y-4",children:[(0,s.jsxs)("div",{className:"flex items-center gap-4",children:[(0,s.jsx)(eC.Avatar,{className:"h-16 w-16 border-2 border-border",children:(0,s.jsx)(eC.AvatarFallback,{className:"text-2xl",children:g?.user?.name?g.user.name.charAt(0).toUpperCase():g?.user?.email?g.user.email.charAt(0).toUpperCase():"U"})}),(0,s.jsxs)("div",{className:"flex-1",children:[(0,s.jsx)("h3",{className:"text-lg font-semibold",children:g.user?.name||"用户"}),(0,s.jsx)("p",{className:"text-sm text-muted-foreground",children:g.user?.email}),(0,s.jsxs)("p",{className:"text-xs text-muted-foreground mt-1",children:["用户 ID: ",g.user?.id]})]})]}),A&&(A.ownedTreesCount>0||A.collaborations.length>0)&&(0,s.jsxs)("div",{className:"space-y-3 pt-3 border-t",children:[(0,s.jsx)("p",{className:"text-sm font-medium",children:"我的家族树"}),(0,s.jsxs)("div",{className:"space-y-2",children:[A.ownedTreesCount>0&&(0,s.jsxs)("div",{className:"text-sm text-muted-foreground",children:[(0,s.jsx)("span",{className:`inline-flex items-center px-2 py-1 rounded-full border text-xs ${M("OWNER")}`,children:R("OWNER")}),(0,s.jsxs)("span",{className:"ml-2",children:[A.ownedTreesCount," 个家族树"]})]}),A.collaborations.length>0&&(0,s.jsx)("div",{className:"space-y-2",children:A.collaborations.map(e=>(0,s.jsxs)("div",{className:"flex items-center justify-between text-sm p-2 rounded-md bg-muted/50",children:[(0,s.jsx)("span",{className:"text-muted-foreground truncate flex-1",children:e.treeName}),(0,s.jsx)("span",{className:`text-xs px-2 py-1 rounded-full border ${M(e.role)}`,children:R(e.role)})]},e.treeId))})]})]}),(0,s.jsxs)("div",{className:"pt-3 border-t",children:[(0,s.jsxs)("p",{className:"text-sm font-medium text-destructive mb-2 flex items-center gap-2",children:[(0,s.jsx)(h,{className:"h-4 w-4"})," 危险区域"]}),eR.permissions.canClearData(m)&&(0,s.jsx)(n.Button,{variant:"destructive",size:"sm",className:"w-full",onClick:async()=>{await y("确定要重置吗?所有更改将丢失。","重置数据","destructive")&&(await o(),await N("数据已重置为演示状态。","成功"))},children:"重置所有数据"})]})]})]}),(0,s.jsx)(eO,{})]}),(0,s.jsxs)("div",{className:"grid grid-cols-1 lg:grid-cols-2 gap-6",children:[(0,s.jsxs)(d.Card,{children:[(0,s.jsxs)(d.CardHeader,{children:[(0,s.jsxs)(d.CardTitle,{className:"flex items-center gap-2",children:[(0,s.jsx)(f,{className:"h-5 w-5"})," 数据管理 (Data Management)"]}),(0,s.jsx)(d.CardDescription,{children:"备份和恢复家族树数据。"})]}),(0,s.jsxs)(d.CardContent,{className:"space-y-6",children:[(0,s.jsxs)("div",{className:"space-y-2",children:[(0,s.jsxs)("h3",{className:"text-sm font-medium flex items-center gap-2",children:[(0,s.jsx)(i.Download,{className:"h-4 w-4"})," 数据备份"]}),(0,s.jsx)("p",{className:"text-sm text-muted-foreground",children:"将家族数据导出为 JSON 文件进行本地保存。"}),eR.permissions.canExport(m)&&(0,s.jsx)(n.Button,{onClick:()=>{let t=new Blob([JSON.stringify(e,null,2)],{type:"application/json"}),r=URL.createObjectURL(t),s=document.createElement("a");s.href=r,s.download=`family_tree_backup_${new Date().toISOString().split("T")[0]}.json`,document.body.appendChild(s),s.click(),document.body.removeChild(s)},children:"导出数据 (Export JSON)"})]}),(0,s.jsx)("div",{className:"border-t"}),(0,s.jsxs)("div",{className:"space-y-4",children:[(0,s.jsxs)("div",{children:[(0,s.jsxs)("h3",{className:"text-sm font-medium flex items-center gap-2",children:[(0,s.jsx)(c.Upload,{className:"h-4 w-4"})," 数据恢复"]}),(0,s.jsx)("p",{className:"text-sm text-muted-foreground mt-1",children:"从 JSON 备份文件恢复数据。这将覆盖当前数据。"})]}),eR.permissions.canImport(m)&&(0,s.jsxs)("div",{className:"flex items-center gap-4",children:[(0,s.jsx)("input",{type:"file",ref:$,className:"hidden",accept:".json",onChange:async e=>{let t=e.target.files?.[0];if(!t)return;if(!await y("恢复数据将覆盖当前所有数据,确定继续吗?","恢复数据","destructive")){$.current&&($.current.value="");return}let s=new FileReader;s.onload=async e=>{try{let t=e.target?.result,s=JSON.parse(t);await r(s),E("导入成功!"),$.current&&($.current.value="")}catch(e){console.error(e),E("错误:无法解析 JSON 文件")}},s.readAsText(t)}}),(0,s.jsx)(n.Button,{variant:"outline",onClick:()=>$.current?.click(),children:"选择备份文件..."}),(0,s.jsx)("span",{className:"text-sm text-muted-foreground",children:w})]})]})]})]}),(0,s.jsxs)(d.Card,{children:[(0,s.jsxs)(d.CardHeader,{children:[(0,s.jsxs)(d.CardTitle,{className:"flex items-center gap-2",children:[(0,s.jsx)(u,{className:"h-5 w-5"})," GEDCOM 格式"]}),(0,s.jsx)(d.CardDescription,{children:"导入/导出标准 GEDCOM 格式,兼容其他家谱软件(如 Ancestry、MyHeritage)。"})]}),(0,s.jsx)(d.CardContent,{className:"space-y-4",children:(0,s.jsxs)("div",{className:"flex flex-col gap-4",children:[eR.permissions.canExport(m)&&(0,s.jsxs)(n.Button,{variant:"outline",className:"justify-start",onClick:()=>{let t,r,s,a=new Blob([((t=[]).push("0 HEAD"),t.push("1 SOUR Chinese Family Tree"),t.push("2 VERS 1.0"),t.push("2 NAME 华夏谱"),t.push("1 DEST ANY"),t.push("1 DATE "+new Date().toISOString().split("T")[0].replace(/-/g," ")),t.push("1 CHAR UTF-8"),t.push("1 GEDC"),t.push("2 VERS 5.5.1"),t.push("2 FORM LINEAGE-LINKED"),(r=Object.values(e.members)).forEach(e=>{if(t.push(`0 @I${e.id}@ INDI`),t.push(`1 NAME ${e.fullName}`),t.push(`2 GIVN ${e.givenName}`),t.push(`2 SURN ${e.surname}`),e.courtesyName&&t.push(`2 _AKA ${e.courtesyName}`),"MALE"===e.gender?t.push("1 SEX M"):"FEMALE"===e.gender&&t.push("1 SEX F"),e.birthDate&&(t.push("1 BIRT"),t.push(`2 DATE ${ea(e.birthDate)}`),e.birthPlace&&t.push(`2 PLAC ${e.birthPlace}`)),e.deathDate&&(t.push("1 DEAT"),t.push(`2 DATE ${ea(e.deathDate)}`),e.burialPlace&&t.push(`2 PLAC ${e.burialPlace}`)),e.ancestralHome&&(t.push("1 RESI"),t.push(`2 PLAC ${e.ancestralHome}`)),e.bio&&t.push("1 NOTE "+e.bio.replace(/\n/g,"\n1 CONT ")),e.fatherId||e.motherId){let r=`F${e.fatherId||e.motherId}_${e.id}`;t.push(`1 FAMC @${r}@`)}e.spouseIds.length>0&&e.spouseIds.forEach(r=>{let s=`F${e.id}_${r}`;t.push(`1 FAMS @${s}@`)})}),s=new Set,r.forEach(e=>{if(e.fatherId||e.motherId){let a=`F${e.fatherId||e.motherId}_${e.id}`;s.has(a)||(t.push(`0 @${a}@ FAM`),e.fatherId&&t.push(`1 HUSB @I${e.fatherId}@`),e.motherId&&t.push(`1 WIFE @I${e.motherId}@`),r.filter(t=>t.fatherId===e.fatherId&&t.motherId===e.motherId).forEach(e=>{t.push(`1 CHIL @I${e.id}@`)}),s.add(a))}e.spouseIds.length>0&&e.spouseIds.forEach(r=>{let a="MALE"===e.gender?`F${e.id}_${r}`:`F${r}_${e.id}`;s.has(a)||(t.push(`0 @${a}@ FAM`),"MALE"===e.gender?(t.push(`1 HUSB @I${e.id}@`),t.push(`1 WIFE @I${r}@`)):(t.push(`1 HUSB @I${r}@`),t.push(`1 WIFE @I${e.id}@`)),e.childrenIds.forEach(e=>{t.push(`1 CHIL @I${e}@`)}),s.add(a))})}),t.push("0 TRLR"),t.join("\n"))],{type:"text/plain;charset=utf-8"}),l=URL.createObjectURL(a),n=document.createElement("a");n.href=l,n.download=`family_tree_${new Date().toISOString().split("T")[0]}.ged`,document.body.appendChild(n),n.click(),document.body.removeChild(n)},children:[(0,s.jsx)(i.Download,{className:"mr-2 h-4 w-4"}),"导出 GEDCOM"]}),eR.permissions.canImport(m)&&(0,s.jsxs)("div",{className:"flex items-center gap-2",children:[(0,s.jsx)("input",{type:"file",ref:O,className:"hidden",accept:".ged,.gedcom",onChange:e=>{let t=e.target.files?.[0];if(!t)return;let s=new FileReader;s.onload=async e=>{try{var t;let s,a,l,n,d,i=(t=e.target?.result,a=((e,t={})=>{let r;(e=>{let t="0 HEAD",r=[];for(let e=0;e<t.length;e++)r.push(t.charCodeAt(e));let s=new Uint8Array(e),a=e=>{if(s.byteLength<e.length)return!1;for(let t=0;t<e.length;t++)if(e[t]!==s[t])return!1;return!0};if(!a(r)&&!a(J.concat(r))){let e=r.map(e=>[0,e]);if(!a(z.concat(e.flat()))&&!a(q.concat(e.map(e=>e.slice().reverse()).flat()))){let e=r.map(e=>[0,0,0,e]);if(!a(X.concat(e.flat()))&&!a(Y.concat(e.map(e=>e.slice().reverse()).flat())))throw new b("Probably not a Gedcom file")}}})(e);let s=null==t.forcedCharset?(e=>{let{sourceEncoding:t,sourceProvider:r,sourceProviderVersion:s,fileHasBOM:a}=((e,t=5e3,r=200)=>{let{output:s,bomCharset:a}=et(e.slice(0,t)),l=W(s,!1),n=0,d=[];for(let e of l){if(n>=r)break;d.push(e),n+=1}let i=V(d).children.filter(e=>"HEAD"===e.tag),c=i.flatMap(e=>e.children.filter(e=>"CHAR"===e.tag||"CHARACTER"===e.tag)),o=c.length>0?c[0].value:null,h=i.flatMap(e=>e.children.filter(e=>"SOUR"===e.tag)),u=h.length>0?h[0].value:null,f=h.flatMap(e=>e.children.filter(e=>"VERS"===e.tag));return{sourceEncoding:o,sourceProvider:u,sourceProviderVersion:f.length>0?f[0].value:null,fileHasBOM:null!==a}})(e);function l(){if("UTF-8"===t)return"UTF-8";if("ANSEL"===t)return"ANSEL";if("ASCII"===t)return"Cp1252";if("ANSI"===t)return"Cp1252";if("UNICODE"===t)return"UTF-16be";else if("WINDOWS"===t||"IBM WINDOWS"===t)return"Cp1252";else if("MACINTOSH"===t)return"Macintosh";else if("IBMPC"===t)return"Cp850";else if("MSDOS"===t)return"Cp850";else if("UNIX"===t)return"Cp1252";else if("UTF8"===t)return"UTF-8";else if("windows-1250"===t)return"Cp1252";else return"UTF-8"}if(a)return"UTF-8";if("GeneWeb"===r)if("ASCII"===t)return"Cp1252";else if("UTF-8"===t)return"UTF-8";else return l();if(null!=r&&r.startsWith("HEREDIS"))if("ANSI"===t)return"Cp1252";else return l();if("GENEATIQUE"===r)if("ANSEL"===t)return"ANSEL";else return l();if("Gramps"!==r)return l();if("UTF-8"===t)return"UTF-8";else return l()})(e):t.forcedCharset,a=t.progressCallback,l=e.byteLength,n=a?e=>a(0,e/l):void 0;if("UTF-8"===s||"UTF-16be"===s||"UTF-16le"===s)r=((e,t)=>{let{output:r}=et(e,t);return r})(e,n);else if("Cp1252"===s)r=((e,t)=>{t&&t(0);let r=new Uint8Array(e),s="",a=0;for(;a<r.length;a++)s+="\0\x01\x02\x03\x04\x05\x06\x07\b \n\v\f\r\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ".charAt(r[a]),t&&a%2e5==0&&t(a);return t&&t(a),s})(e,n);else if("ANSEL"===s)r=((e,t,r)=>{t&&t(0);let s=(e,t,r)=>{let s=new Map;for(let a=0;a<e.length;a++)s.set(parseInt(e.substring(a*t,(a+1)*t),16),r.charCodeAt(a));return s},a=s("8d8ea1a2a3a4a5a6a7a8a9aaabacadaeb0b1b2b3b4b5b6b7b8b9babcbdc0c1c2c3c4c5c6cfe0e1e2e3e4e5e6e7e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfe818889929394c7c8e8bebfcdce",2,"‍‌ŁØÐÞÆŒʹ·♭®±ƠƯʾ°łøđþæœʺı£ðơư°ℓ℗©♯¿¡ß̧̨̣̤̥̳̲̦̜̮̉̀́̂̃̄̆̇̌̊︠︡̋̐︢︣̓̕ü˜œ'“”߀̈▯▮eo"),l=s("e020e041e045e049e04fe055e059e061e065e069e06fe075e079e120e141e145e149e14fe155e157e159e161e165e169e16fe175e177e179e220e241e243e245e247e249e24be24ce24de24ee24fe250e252e253e255e257e259e25ae261e263e265e267e269e26be26ce26de26ee26fe270e272e273e275e277e279e27ae2a5e2b5e320e341e343e345e347e348e349e34ae34fe353e355e357e359e35ae361e363e365e367e368e369e36ae36fe373e375e377e379e37ae420e441e445e449e44ee44fe455e456e459e461e465e469e46ee46fe475e476e479e520e541e545e547e549e54fe555e561e565e567e569e56fe575e5a5e5b5e620e641e645e647e649e64fe655e661e665e667e669e66fe675e720e742e743e744e745e746e747e748e749e74de74ee750e752e753e754e757e758e759e75ae762e763e764e765e766e767e768e76de76ee770e772e773e774e777e778e779e77ae820e841e845e848e849e84fe855e857e858e859e861e865e868e869e86fe874e875e877e878e879e920e941e943e944e945e947e949e94be94ce94ee94fe952e953e954e955e95ae961e963e964e965e967e969e96ae96be96ce96ee96fe972e973e974e975e97aea20ea41ea61ea75ea77ea79eaaded20ee20ee4fee55ee6fee75f020f043f044f047f048f04bf04cf04ef052f053f054f063f064f067f068f06bf06cf06ef072f073f074f120f141f145f149f14ff155f161f165f169f16ff175f241f242f244f245f248f249f24bf24cf24df24ef24ff252f253f254f255f256f257f259f25af261f262f264f265f268f269f26bf26cf26df26ef26ff272f273f274f275f276f277f279f27af355f375f441f461f520f948f968fc20fc41fc43fc45fc4bfc4cfc4ffc51fc54fc56fc61fc63fc65fc6bfc6cfc6ffc71fc74fc76d741d742d743d744d745d746d747d748d749d74ad74bd74cd74dd74ed74fd750d751d752d753d754d755d756d757d758d761d762d763d764d765d766d767d768d769d76ad76bd76cd76dd76ed76fd770d771d772d773d774d775d776d777d778d779d824d841d842d843d844d845d846d847d848d849d84bd84cd84dd84ed84fd850d851d852d853d854d855d856d857d858d85ad861d862d863d864d865d866d867d868d869d86bd86cd86dd86ed86fd870d871d872d873d874d875d876d877d878d87ad920d921d922d923d924d925d926d927d928d929d92ad92bd92cd92dd92ed92fd930d931d932d933d941d942d943d944d945d946d947d948d949d94ad94cd94dd94ed94fd950d951d952d953d954d955d956d957d958d959d95ad961d962d963d964d965d966d967d968d969d96ad96bd96cd96dd96ed96fd970d971d972d973d974d975d976d977d979d97ad97bd97c",4,"ˀẢẺỈỎỦỶảẻỉỏủỷˋÀÈÌÒÙẀỲàèìòùẁỳˊÁĆÉǴÍḰĹḾŃÓṔŔŚÚẂÝŹáćéǵíḱĺḿńóṕŕśúẃýźǼǽˆÂĈÊĜĤÎĴÔŜÛŴŶẐâĉêĝĥîĵôŝûŵŷẑ˜ÃẼĨÑÕŨṼỸãẽĩñõũṽỹˉĀĒḠĪŌŪāēḡīōūǢǣ˘ĂĔĞĬŎŬăĕğĭŏŭ˙ḂĊḊĖḞĠḢİṀṄṖṘṠṪẆẊẎŻḃċḋėḟġḣṁṅṗṙṡṫẇẋẏż¨ÄËḦÏÖÜẄẌŸäëḧïöẗüẅẍÿˇǍČĎĚǦǏǨĽŇǑŘŠŤǓŽǎčďěǧǐǰǩľňǒřšťǔž˚ÅåůẘẙŮʼ˝ŐŰőű¸ÇḐĢḨĶĻŅŖŞŢçḑģḩķļņŗşţ˛ĄĘĮǪŲąęįǫųẠḄḌẸḤỊḲḶṂṆỌṚṢṬỤṾẈỴẒạḅḍẹḥịḳḷṃṇọṛṣṭụṿẉỵẓṲṳḀḁ‗Ḫḫ̸ȺȻɆꝂŁØꝘȾꝞⱥȼɇꝃłøꝙⱦꝟ═║╗╝╚╔╣╩╠╦╬╢╧╟╤╡╨╞╥╪░▒▓█─│┐┘└┌┤┴├┬┼╕╛╘╒╖╜╙╓╫▌▀▐▄▪ςΑΒΥΔΕΦΓΨΙΚΛΜΝΟΠΧΡΣΤΩΘΗΞΖαβυδεφγψικλμνοπχρστωθηξζ฿¢¥₧ƒ¤₤₠₡₢₣₥₦₨₩₪€¹²³ªº«»¦¶§⌐†‡™fifl‹›‰…“”‚„•– µ½¼¾∞∅∈∩¬≡×≥≤÷≈⋅⌠⌡√⁄‘’—­₭₮₯₫"),n=new Uint8Array(e),d=[],i=0,c=n[0];for(i++;void 0!==c;){let e=c;if(c=n[i],i++,e<128)d.push(String.fromCharCode(e));else if(void 0!==c&&(e>=224&&e<=255||e>=215&&e<=217)){let t=256*e+c,s=l.get(t);if(void 0!==s)c=n[i],i++,d.push(String.fromCharCode(s));else if(r)throw new j(`Illegal ANSEL character code: ${t}`,t);else c=n[i],i++,d.push("")}else{let t=a.get(e),r=String.fromCharCode(void 0!==t?t:65533);d.push(r)}t&&i%2e5==0&&t(i)}return t&&t(i),d.join("")})(e,n,!!t.doStrictDecoding);else if("Macintosh"===s)r=((e,t)=>{t&&t(0);let r=new Uint8Array(e),s="",a=0;for(;a<r.length;a++)s+="\0\x01\x02\x03\x04\x05\x06\x07\b \n\v\f\r\x0e\x0f\x10⌘✓◆\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~ÄÅÇÉÑÖÜáàâäãåçéèêëíìîïñóòôöõúùûü†°¢£§•¶ß®©™´¨≠ÆØ∞±≤≥¥µ∂∑∏π∫ªºΩæø¿¡¬√ƒ≈∆«»… ÀÃÕŒœ–—“”‘’÷◊ÿŸ⁄€‹›fifl‡·‚„‰ÂÊÁËÈÍÎÏÌÓÔÒÚÛÙıˆ˜¯˘˙˚¸˝˛ˇ".charAt(r[a]),t&&a%2e5==0&&t(0);return t&&t(a),s})(e,n);else if("Cp850"===s)r=((e,t)=>{t&&t(0);let r=new Uint8Array(e),s="",a=0;for(;a<r.length;a++){let e=r[a];s+=e<128?String.fromCharCode(e):"ÇüéâäàåçêëèïîìÄÅÉæÆôöòûùÿÖÜø£Ø×ƒáíóúñѪº¿®¬½¼¡«»░▒▓│┤ÁÂÀ©╣║╗╝¢¥┐└┴┬├─┼ãÃ╚╔╩╦╠═╬¤ðÐÊËÈıÍÎÏ┘┌█▄¦Ì▀ÓßÔÒõÕµþÞÚÛÙýݯ´­±‗¾¶§÷¸°¨·¹³²".charAt(e-128),t&&a%2e5==0&&t(a)}return t&&t(a),s})(e,n);else throw new v(`Unsupported charset: ${s}`,s);let d=r.length,i=V(W(r),!!t.noInlineContinuations,a?e=>a(1,e/d):null);return(e=>{let t=e.children,r=t[0];if("HEAD"!==r.tag)throw new S(`First node is not a header (got ${r.tag})`);let s=t[t.length-1];if("TRLR"!==s.tag)throw new S(`Last node is not a trailer (got ${s.tag})`)})(i),t.noIndex||((e,t=!1,r=!1,s=null)=>{s&&s();let a=0,l=[[e,0]];for(;l.length>0;){let[e,t]=l[l.length-1];if(t<e.children.length)l.push([e.children[t],0]);else{let[e,t]=l.pop();l.length>0&&l[l.length-1][1]++,er(e,!r),0===l.length&&es(e)}a++,s&&a%5e4==0&&s()}t||((e,t=null)=>{let r=(e,t,r)=>{let s=e[t];return null!=s?s:r},s=e._index,a=r(s.byTagPointer,"FAM",{}),l={},n={};Object.values(a).forEach((s,a)=>{let d=e.children[s],i=d._index;for(let e of["HUSB","WIFE"])for(let t of r(i.byTag,e,[])){let e=d.children[t].value;null!==e&&(void 0!==l[e]?l[e].push(s):l[e]=[s])}for(let e of r(i.byTag,"CHIL",[])){let t=d.children[e].value;null!==t&&(void 0!==n[t]?n[t].push(s):n[t]=[s])}t&&a%5e3==0&&t()}),s.asSpouse=l,s.asChild=n})(e,s),s&&s()})(i,!!t.noBackwardsReferencesIndex,!!t.doHideIndex,a?()=>a(2,null):null),t.doFreeze&&(a&&a(3,0),(e=>{let t=[e];for(;t.length>0;){let e=[];t.forEach(t=>{null==t||"object"!=typeof t||Object.isFrozen(t)||(Object.freeze(t),Object.getOwnPropertyNames(t).forEach(r=>e.push(t[r])))}),t=e}})(i),a&&a(3,1)),i})(t),l={},(n=Array.isArray(a)?a:a.tree||[]).forEach(e=>{if("INDI"===e.tag){let t,r,s,a,n,d,i,c=e.pointer.replace("@I","").replace("@",""),o="",h="",u="",f="OTHER";e.tree.forEach(e=>{"NAME"===e.tag&&(o=e.data.replace(/\//g,"").trim(),e.tree?.forEach(e=>{"GIVN"===e.tag&&(h=e.data),"SURN"===e.tag&&(u=e.data),"_AKA"===e.tag&&(t=e.data)})),"SEX"===e.tag&&(f="M"===e.data?"MALE":"F"===e.data?"FEMALE":"OTHER"),"BIRT"===e.tag&&e.tree?.forEach(e=>{"DATE"===e.tag&&(r=el(e.data)),"PLAC"===e.tag&&(a=e.data)}),"DEAT"===e.tag&&e.tree?.forEach(e=>{"DATE"===e.tag&&(s=el(e.data)),"PLAC"===e.tag&&(n=e.data)}),"RESI"===e.tag&&e.tree?.forEach(e=>{"PLAC"===e.tag&&(d=e.data)}),"NOTE"===e.tag&&(i=e.data)}),l[c]={id:c,surname:u||"未知",givenName:h||o,fullName:o||`${u}${h}`,gender:f,generation:1,courtesyName:t,birthDate:r,deathDate:s,birthPlace:a,burialPlace:n,ancestralHome:d,bio:i,spouseIds:[],childrenIds:[],createdAt:new Date().toISOString(),updatedAt:new Date().toISOString()}}}),n.forEach(e=>{if("FAM"===e.tag){let t,r,s=[];e.tree.forEach(e=>{"HUSB"===e.tag&&(t=e.data.replace("@I","").replace("@","")),"WIFE"===e.tag&&(r=e.data.replace("@I","").replace("@","")),"CHIL"===e.tag&&s.push(e.data.replace("@I","").replace("@",""))}),t&&r&&(l[t]&&!l[t].spouseIds.includes(r)&&l[t].spouseIds.push(r),l[r]&&!l[r].spouseIds.includes(t)&&l[r].spouseIds.push(t)),s.forEach(e=>{l[e]&&(t&&(l[e].fatherId=t,l[t]&&!l[t].childrenIds.includes(e)&&l[t].childrenIds.push(e)),r&&(l[e].motherId=r,l[r]&&!l[r].childrenIds.includes(e)&&l[r].childrenIds.push(e)))})}}),d=(e,t=new Set)=>{if(t.has(e))return 1;t.add(e);let r=l[e];if(!r||!r.fatherId&&!r.motherId)return 1;let s=r.fatherId?d(r.fatherId,t):0;return Math.max(s,r.motherId?d(r.motherId,t):0)+1},Object.keys(l).forEach(e=>{l[e].generation=d(e)}),s=Object.keys(l).find(e=>1===l[e].generation),{members:l,rootId:s});await r(i),I("导入成功!"),O.current&&(O.current.value="")}catch(e){console.error(e),I("错误:无法解析文件")}},s.readAsText(t)}}),(0,s.jsxs)(n.Button,{variant:"outline",className:"justify-start",onClick:()=>O.current?.click(),children:[(0,s.jsx)(c.Upload,{className:"mr-2 h-4 w-4"}),"导入 GEDCOM"]}),C&&(0,s.jsx)("span",{className:"text-sm text-muted-foreground",children:C})]})]})})]})]}),(0,s.jsx)(eE,{children:(0,s.jsx)(ey,{})})]})]})]})}e.s(["default",()=>eM],47430)}]);