1import{c as G,I as W,d as B,e as F,r as x,j as t,B as $,as as se,am as oe,g as Q}from"./index-DcUQw4Yp.js";import{T as ne}from"./triangle-alert-D5bcO-ry.js";/** 2 * @license lucide-react v0.475.0 - ISC 3 * 4 * This source code is licensed under the ISC license. 5 * See the LICENSE file in the root directory of this source tree. 6 */const ae=[["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 12a1 1 0 0 0-1 1v1a1 1 0 0 1-1 1 1 1 0 0 1 1 1v1a1 1 0 0 0 1 1",key:"1oajmo"}],["path",{d:"M14 18a1 1 0 0 0 1-1v-1a1 1 0 0 1 1-1 1 1 0 0 1-1-1v-1a1 1 0 0 0-1-1",key:"mpwhp6"}]],re=G("FileJson",ae);/** 7 * @license lucide-react v0.475.0 - ISC 8 * 9 * This source code is licensed under the ISC license. 10 * See the LICENSE file in the root directory of this source tree. 11 */const le=[["path",{d:"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4",key:"ih7n3h"}],["polyline",{points:"17 8 12 3 7 8",key:"t8dd8p"}],["line",{x1:"12",x2:"12",y1:"3",y2:"15",key:"widbto"}]],ie=G("Upload",le),D=["todos","notes","pages","bookmarks","events","rss"],de={todos:"Todos",notes:"Notes",pages:"Canvas pages",bookmarks:"Bookmarks",events:"Events",rss:"RSS subscriptions"};function ce(r,i){const p=new Blob([JSON.stringify(r,null,2)],{type:"application/json"}),d=URL.createObjectURL(p),f=document.createElement("a");f.href=d,f.download=i,f.click(),URL.revokeObjectURL(d)}function me(){const{state:r}=W(),i=B(F.rss.listSubscriptions),p=B(F.rss.listCategories),[d,f]=x.useState(new Set(D)),[y,j]=x.useState(!1),[b,K]=x.useState(!1),w={todos:r.todos.filter(o=>!o.deletedAt).length,notes:r.notes.length,pages:r.pages.filter(o=>!o.deletedAt).length,bookmarks:r.bookmarks.length,events:r.events.filter(o=>!o.deletedAt).length,rss:(i==null?void 0:i.length)??0},c=D.reduce((o,N)=>o+w[N],0),S=D.filter(o=>d.has(o)).reduce((o,N)=>o+w[N],0),C=D.every(o=>d.has(o)),E=()=>f(C?new Set:new Set(D)),k=o=>f(N=>{const a=new Set(N);return a.has(o)?a.delete(o):a.add(o),a}),I=async()=>{j(!0),K(!1);try{const o={version:1,app:"omanote",exportedAt:new Date().toISOString(),warning:"This file contains unencrypted data. Store it securely."};if(d.has("todos")){const a=new Map(r.todoFolders.map(e=>[e.id,e]));o.todos=r.todos.filter(e=>!e.deletedAt).map(e=>{const l=e.folderId?a.get(e.folderId):void 0;return{title:e.title,notes:e.notes??null,folderName:(l==null?void 0:l.name)??e.folderName??null,folderIcon:(l==null?void 0:l.icon)??null,dueDateKey:e.dueDateKey??null,dueTime:e.dueTime??null,priority:e.priority,status:e.status,createdDateKey:e.createdDateKey,createdAt:e.createdAt,recurrence:e.recurrence??null,reminderEveryMinutes:e.reminderEveryMinutes??null,reminderUntil:e.reminderUntil??null}})}if(d.has("notes")){const a=new Map(r.noteFolders.map(e=>[e.id,e]));o.notes=r.notes.map(e=>{const l=e.folderId?a.get(e.folderId):void 0;return{title:e.title??null,body:e.body,tags:e.tags,folderName:(l==null?void 0:l.name)??e.folderName??null,folderIcon:(l==null?void 0:l.icon)??null,createdDateKey:e.createdDateKey,createdAt:e.createdAt}})}if(d.has("pages")&&(o.pages=r.pages.filter(a=>!a.deletedAt).map(a=>({title:a.title??null,docJson:a.docJson,preview:a.preview,hashtags:a.hashtags??[],createdDateKey:a.createdDateKey,createdAt:a.createdAt}))),d.has("bookmarks")){const a=new Map(r.bookmarkCategories.map(e=>[e.id,e]));o.bookmarks=r.bookmarks.map(e=>{const l=a.get(e.categoryId);return{url:e.url,title:e.title,siteName:e.siteName??null,description:e.description??null,thumbnailUrl:e.thumbnailUrl??null,faviconUrl:e.faviconUrl??null,categoryName:(l==null?void 0:l.name)??null,categoryIcon:(l==null?void 0:l.icon)??null,createdDateKey:e.createdDateKey,createdAt:e.createdAt}})}if(d.has("events")&&(o.events=r.events.filter(a=>!a.deletedAt).map(a=>({label:a.label,notes:a.notes??null,loggedAt:a.loggedAt,createdDateKey:a.createdDateKey,createdAt:a.createdAt}))),d.has("rss")&&i){const a=new Map((p??[]).map(e=>[e._id,e]));o.rssSubscriptions=i.map(e=>{const l=e.categoryId?a.get(e.categoryId):void 0;return{title:e.title,feedUrl:e.feedUrl,siteUrl:e.siteUrl??null,description:e.description??null,faviconUrl:e.faviconUrl??null,categoryName:(l==null?void 0:l.name)??null,categoryIcon:(l==null?void 0:l.icon)??null}})}const N=new Date().toISOString().slice(0,10);ce(o,`omanote-export-${N}.json`),K(!0)}finally{j(!1)}};return t.jsxs(t.Fragment,{children:[t.jsxs("div",{className:"mt-4 space-y-1",children:[t.jsx(V,{label:"All",count:c,checked:C,indeterminate:!C&&d.size>0,onChange:E,bold:!0}),t.jsx("div",{className:"ml-4 space-y-0.5",children:D.map(o=>t.jsx(V,{label:de[o],count:w[o],checked:d.has(o),onChange:()=>k(o)},o))})]}),b?t.jsx("p",{className:"mt-4 rounded-md border border-success-line bg-success-surface px-3 py-2 text-sm text-success-ink",children:"Export downloaded. Store the file securely."}):null,t.jsx("div",{className:"mt-5 flex justify-end",children:t.jsxs($,{className:"gap-2",onClick:()=>void I(),disabled:y||d.size===0||d.has("rss")&&i===void 0,children:[t.jsx(se,{className:"h-4 w-4"}),y?"Preparingâ¦":`Export ${S} item${S!==1?"s":""}`]})})]})}function V({label:r,count:i,checked:p,indeterminate:d=!1,disabled:f=!1,onChange:y,bold:j=!1}){return t.jsx(oe,{checked:p,disabled:f,indeterminate:d,labelClassName:j?"font-medium text-app-ink":"text-app-ink-muted",onCheckedChange:y,trailing:i,className:"px-3 py-2 hover:bg-app-surface-hover",children:r})}const T=["todos","notes","bookmarks","events","rss"],ue={todos:"Todos",notes:"Notes",bookmarks:"Bookmarks",events:"Events",rss:"RSS subscriptions"};function U(r,i){var p,d,f,y;return r?i==="events"?(((p=r.events)==null?void 0:p.length)??0)+(((d=r.routines)==null?void 0:d.length)??0):i==="rss"?((f=r.rssSubscriptions)==null?void 0:f.length)??0:((y=r[i])==null?void 0:y.length)??0:0}function pe(r){let i;try{i=JSON.parse(r)}
11catch{throw new Error("File is not valid JSON")}if(typeof i!="object"||i===null)throw new Error("Invalid file format");const p=i;if(p.version!==1||p.app!=="omanote")throw new Error("This file is not an omanote export (version 1)");return p}function fe(){var q;const{state:r,dispatch:i}=W(),p=B(F.rss.listCategories),d=Q(F.rss.createCategory),f=Q(F.rss.subscribe),y=x.useRef(null),[j,b]=x.useState(!1),[K,w]=x.useState(null),[c,S]=x.useState(null),[C,E]=x.useState(null),[k,I]=x.useState(new Set),[o,N]=x.useState(!1),[a,e]=x.useState(0),[l,_]=x.useState(!1),A={todos:U(c,"todos"),notes:U(c,"notes"),bookmarks:U(c,"bookmarks"),events:U(c,"events"),rss:U(c,"rss")},L=T.filter(s=>A[s]>0),R=L.length>0&&L.every(s=>k.has(s)),J=T.some(s=>k.has(s)),M=T.filter(s=>k.has(s)).reduce((s,u)=>s+A[u],0),X=((q=c==null?void 0:c.todos)==null?void 0:q.some(s=>s.notes))??!1,O=s=>{E(null),S(null),w(s.name);const u=new FileReader;u.onload=v=>{var n;try{const m=pe((n=v.target)==null?void 0:n.result);S(m);const h=new Set(T.filter(g=>U(m,g)>0));I(h)}catch(m){E(m instanceof Error?m.message:"Could not parse file")}},u.readAsText(s)},P=()=>{S(null),w(null),E(null),I(new Set),_(!1),e(0)},Y=()=>I(R?new Set:new Set(L)),ee=s=>{A[s]!==0&&I(u=>{const v=new Set(u);return v.has(s)?v.delete(s):v.add(s),v})},te=async()=>{var u,v;if(!c)return;N(!0);let s=0;try{if(k.has("todos")&&c.todos)for(const n of c.todos)i({type:"todo/create",title:n.title,dateKey:n.createdDateKey,dueDateKey:n.dueDateKey?n.dueDateKey:void 0,dueTime:n.dueTime??void 0,folderName:n.folderName??void 0,folderIcon:n.folderIcon??void 0,recurrence:n.recurrence??void 0,reminderEveryMinutes:n.reminderEveryMinutes??void 0,reminderUntil:n.reminderUntil??void 0}),s++;if(k.has("notes")&&c.notes){const n=new Set(r.noteFolders.map(h=>h.name.toLowerCase())),m=new Set;for(const h of c.notes){const g=(u=h.folderName)==null?void 0:u.trim();g&&h.folderIcon&&!n.has(g.toLowerCase())&&!m.has(g.toLowerCase())&&(m.add(g.toLowerCase()),i({type:"note-folder/create",name:g,icon:h.folderIcon})),i({type:"note/create",body:h.body,dateKey:h.createdDateKey,title:h.title??void 0,tags:h.tags,folderName:h.folderName??void 0}),s++}}if(k.has("bookmarks")&&c.bookmarks)for(const n of c.bookmarks)i({type:"bookmark/create",url:n.url,dateKey:n.createdDateKey,title:n.title,categoryName:n.categoryName??void 0,categoryIcon:n.categoryIcon??void 0,siteName:n.siteName??void 0,description:n.description??void 0,thumbnailUrl:n.thumbnailUrl??void 0,faviconUrl:n.faviconUrl??void 0}),s++;if(k.has("events"))for(const n of[...c.events??[],...c.routines??[]])i({type:"event/create",label:n.label,dateKey:n.createdDateKey,loggedAt:n.loggedAt,notes:n.notes??void 0}),s++;if(k.has("rss")&&c.rssSubscriptions){const n=new Map((p??[]).map(m=>[m.name.toLowerCase(),{_id:m._id,name:m.name}]));for(const m of c.rssSubscriptions){let h;const g=(v=m.categoryName)==null?void 0:v.trim();if(g){const z=n.get(g.toLowerCase());if(z)h=z._id;else{const H=await d({name:g,icon:m.categoryIcon??void 0});h=H,n.set(g.toLowerCase(),{_id:H,name:g})}}await f({feedUrl:m.feedUrl,title:m.title,siteUrl:m.siteUrl??void 0,description:m.description??void 0,faviconUrl:m.faviconUrl??void 0,categoryId:h}),s++}}e(s),_(!0)}finally{N(!1)}};return l?t.jsxs("div",{className:"mt-4",children:[t.jsxs("p",{className:"rounded-md border border-success-line bg-success-surface px-3 py-2 text-sm text-success-ink",children:[a," item",a!==1?"s":""," queued for import."]}),t.jsx("div",{className:"mt-4 flex justify-end",children:t.jsx($,{onClick:P,children:"Import another file"})})]}):t.jsxs("div",{className:"mt-4",children:[K?t.jsx("p",{className:"mb-3 truncate text-xs text-app-ink-faint",children:K}):null,c?t.jsxs("div",{className:"space-y-2",children:[t.jsxs("div",{className:"space-y-1",children:[t.jsx(Z,{label:"All",count:L.reduce((s,u)=>s+A[u],0),checked:R,indeterminate:!R&&J,onChange:Y,bold:!0}),t.jsx("div",{className:"ml-4 space-y-0.5",children:T.map(s=>t.jsx(Z,{label:ue[s],count:A[s],checked:k.has(s),disabled:A[s]===0,onChange:()=>ee(s)},s))})]}),X&&t.jsxs("p",{className:"flex items-start gap-1.5 rounded-xl bg-warning-surface px-3 py-2 text-xs text-warning-ink",children:[t.jsx(ne,{className:"mt-px h-3.5 w-3.5 shrink-0"}),"Todo notes are not imported in this version."]}),t.jsx("button",{className:"text-xs text-app-ink-faint underline-offset-2 hover:text-app-ink-muted hover:underline",onClick:P,children:"Choose a different file"})]}):t.jsxs("div",{className:`flex cursor-pointer flex-col items-center justify-center gap-2.5 rounded-app-card border-2 border-dashed px-4 py-8 transition ${j?"border-app-line-strong bg-app-surface-muted":"border-app-line hover:border-app-line-strong hover:bg-app-surface-hover"}`,onClick:()=>{var s;return(s=y.current)==null?void 0:s.click()},onDragOver:s=>{s.preventDefault(),b(!0)},onDragLeave:()=>b(!1),onDrop:s=>{s.preventDefault(),b(!1);const u=s.dataTransfer.files[0];u&&O(u)},children:[t.jsx(re,{className:"h-8 w-8 text-app-line-strong"}),t.jsxs("p",{className:"text-center text-xs text-app-ink-faint",children:["Drop your ",t.jsx("span",{className:"font-medium text-app-ink-muted",children:"omanote-export.json"})," here",t.jsx("br",{}),"or ",t.jsx("span",{className:"font-medium text-app-ink-muted",children:"click to browse"})]}),t.jsx("input",{ref:y,type:"file",accept:".json,application/json",className:"hidden",onChange:s=>{var v;const u=(v=s.target.files)==null?void 0:v[0];u&&O(u)}})]}),C&&t.jsx("p",{className:"mt-3 rounded-xl bg-danger-surface px-3 py-2 text-xs text-danger-ink",children:C}),c&&t.jsx("div",{className:"mt-4 flex justify-end",children:t.jsxs($,{className:"gap-2",onClick:()=>void te(),disabled:o||!J||M===0,children:[t.jsx(ie,{className:"h-4 w-4"}),o?"Importingâ¦":`Import ${M} item${M!==1?"s":""}`]})})]})}function Z({label:r,count:i,checked:p,indeterminate:d=!1,disabled:f=!1,onChange:y,bold:j=!1}){const b=x.useRef(null);return b.current&&(b.current.indeterminate=d),t.jsxs("label",{className:`flex items-center gap-3 rounded-xl px-3 py-2 transition ${f?"cursor-default opacity-40":"cursor-pointer hover:bg-app-surface-hover"}`,children:[t.jsx("input",{ref:b,type:"checkbox",className:"h-4 w-4 roun
11ded accent-app-ink",checked:p,disabled:f,onChange:y}),t.jsx("span",{className:`flex-1 text-sm ${j?"font-medium text-app-ink":"text-app-ink-muted"}`,children:r}),t.jsx("span",{className:"text-xs text-app-ink-faint",children:i})]})}function xe(){return t.jsxs(t.Fragment,{children:[t.jsx(me,{}),t.jsx("div",{className:"my-8 border-t border-app-line"}),t.jsx("h2",{className:"text-lg font-bold text-app-ink",children:"Import Data"}),t.jsx("p",{className:"mt-1 text-sm leading-relaxed text-app-ink-faint",children:"Restore items from an omanote export file."}),t.jsx(fe,{})]})}export{xe as SettingsDataPanels};
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.