PageSourceSearch

https://tastly.ai/assets/_app.admin._userId-CwNH3NNM.js

js tastly.ai collected 2026-10-05 14:08:13 UTC 26,475 bytes, 1 lines download raw bytes

1import{c as le,r as i,t as g,j as e,T as s,a5 as E,e as ie,bN as oe,bO as ce,d as de,a0 as ue,S as me,bP as xe}from"./index-Dkwi1Om3.js";import{T as X}from"./gradient-trash-D_AjzDZg.js";import{c as pe,e as be,f as he,h as ge,j as je,k as fe,m as ve,n as ye,b as ke}from"./admin-D7IFMTGq.js";import{L}from"./loader-circle-CUpjekET.js";import{R as Ne,M as _e,J as Se,X as we,Y as Ie,K as Ce,N as $e}from"./AreaChart-e-ZaAlvu.js";import{g as Ae}from"./stripe-D3_9AfYp.js";import{E as ae}from"./external-link-DozyAHTF.js";import{S as De}from"./scroll-text-CaNj0NZF.js";import{C as Ee}from"./chef-hat-DcCNW6kv.js";import"./index-B6c3Vxdm.js";const Te=[["path",{d:"M6 22a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h8a2.4 2.4 0 0 1 1.704.706l3.588 3.588A2.4 2.4 0 0 1 20 8v12a2 2 0 0 1-2 2z",key:"1oefj6"}],["path",{d:"M14 2v5a1 1 0 0 0 1 1h5",key:"wfsgrz"}],["path",{d:"M10 9H8",key:"b1mrlr"}],["path",{d:"M16 13H8",key:"t4e002"}],["path",{d:"M16 17H8",key:"z1uh3a"}]],Re=le("file-text",Te);const Le=[["path",{d:"M4 2v20l2-1 2 1 2-1 2 1 2-1 2 1 2-1 2 1V2l-2 1-2-1-2 1-2-1-2 1-2-1-2 1Z",key:"q3az6g"}],["path",{d:"M16 8h-6a2 2 0 1 0 0 4h4a2 2 0 1 1 0 4H8",key:"1h4pet"}],["path",{d:"M12 17.5v-11",key:"1jc1ny"}]],ze=le("receipt",Le),Fe={"ai:generate-recipe-ai":"AI · Recept genereren","ai:generate-recipe-photo":"AI · Receptfoto","ai:generate-album-cover":"AI · Album-cover","ai:identify-dish":"AI · Gerecht herkennen","ai:import-recipe-url":"AI · Import via URL","ai:import-recipe-photo":"AI · Import via foto","ai:import-recipe-text":"AI · Import via tekst","ai:suggest-from-ingredients":"AI · Suggesties uit ingrediënten","ai:nutrition-guide":"AI · Voedingsgids","ai:smart-scale":"AI · Slim schalen",recipe_created:"Recept aangemaakt",recipe_bookmarked:"Recept bewaard (bookmark)",recipe_shared:"Recept gedeeld",album_created:"Album aangemaakt",album_shared:"Album gedeeld",favorite_added:"Favoriet toegevoegd"};function q(t){if(!t)return"Nooit";const l=Math.floor((Date.now()-new Date(t).getTime())/864e5),a=new Date(t).toLocaleDateString("nl-BE");return l===0?`Vandaag (${a})`:l===1?`Gisteren (${a})`:`${a} (${l}d geleden)`}function Z(t){if(!t||t<1)return"—";const l=Math.floor(t/3600),a=Math.floor(t%3600/60),b=t%60;return l>0?`${l}u ${a}m`:a>0?`${a}m ${b}s`:`${b}s`}const Q=t=>t<1024?`${t} B`:t<1024*1024?`${(t/1024).toFixed(0)} KB`:t<1024*1024*1024?`${(t/(1024*1024)).toFixed(1)} MB`:`${(t/(1024*1024*1024)).toFixed(2)} GB`,ee=t=>{const l=new Date(t);return`${l.getUTCDate()}/${l.getUTCMonth()+1}`},K=t=>t?Math.floor((Date.now()-new Date(t).getTime())/(24*3600*1e3)):null;function Be({userId:t}){const[l,a]=i.useState(null),[b,N]=i.useState(!0),[m,d]=i.useState(null);if(i.useEffect(()=>{(async()=>{N(!0);const{data:c,error:j}=await pe(t);if(j){g.error("Kon statistieken niet laden"),N(!1);return}a(c),N(!1)})(),(async()=>{const c=await be(t);c&&d(c)})()},[t]),b)return e.jsx("div",{className:"grid place-items-center py-10",children:e.jsx(L,{className:"size-6 animate-spin",style:{color:s.subInk}})});if(!l)return null;const{profile:x,content:u,ai:h,storage:v,social:S,totals:$}=l,A=K(x.created_at),w=K(x.last_sign_in_at),D=K(u.lastCookedAt);return e.jsxs("div",{className:"space-y-4",children:[e.jsx(E,{children:e.jsxs("div",{className:"grid grid-cols-2 sm:grid-cols-4 gap-3 text-sm",children:[e.jsx(O,{label:"E-mail",value:x.email||"—"}),e.jsx(O,{label:"Lid sinds",value:x.created_at?`${new Date(x.created_at).toLocaleDateString("nl-BE")} (${A}d)`:"—"}),e.jsx(O,{label:"Laatste login",value:x.last_sign_in_at?`${new Date(x.last_sign_in_at).toLocaleDateString("nl-BE")} (${w}d geleden)`:"Nooit"}),e.jsx(O,{label:"Laatst gekookt",value:u.lastCookedAt?`${new Date(u.lastCookedAt).toLocaleDateString("nl-BE")} (${D}d geleden)`:"Nooit"})]})}),e.jsxs(T,{title:"Activiteit",children:[e.jsxs("div",{className:"grid grid-cols-2 sm:grid-cols-4 gap-3",children:[e.jsx(o,{label:"Laatste bezoek",value:q(m?.last_visit??null)}),e.jsx(o,{label:"Laatste login",value:q(m?.last_login??null)}),e.jsx(o,{label:"Bezoeken 7d",value:m?.visits_7d??0}),e.jsx(o,{label:"Bezoeken 30d",value:m?.visits_30d??0,sub:`${m?.visits_total??0} totaal`}),e.jsx(o,{label:"Sessies",value:m?.sessions_total??0}),e.jsx(o,{label:"Gem. sessieduur",value:Z(m?.avg_session_seconds??0)}),e.jsx(o,{label:"Totaal in app",value:Z(m?.total_session_seconds??0),accent:!0})]}),e.jsxs("div",{className:"mt-3 rounded-2xl p-3",style:{background:s.surface,boxShadow:s.shadowSm},children:[e.jsx("p",{className:"text-xs font-semibold mb-2",style:{color:s.subInk},children:"Gebruikte functies"}),!m||Object.keys(m.feature_counts??{}).length===0?e.jsx("p",{className:"text-xs",style:{color:s.subInk},children:"Nog geen activiteit gelogd"}):e.jsx("ul",{className:"space-y-1.5",children:Object.entries(m.feature_counts).sort((c,j)=>j[1]-c[1]).map(([c,j])=>e.jsxs("li",{className:"flex items-center justify-between text-xs gap-2",children:[e.jsx("span",{className:"truncate",style:{color:s.ink},children:Fe[c]??c}),e.jsxs("span",{className:"shrink-0 tabular-nums",style:{color:s.ink},children:[j,"×"]})]},c))})]})]}),e.jsx(T,{title:"Content",children:e.jsxs("div",{className:"grid grid-cols-2 sm:grid-cols-4 gap-3",children:[e.jsx(o,{label:"Recepten",value:u.recipes,sub:`${u.recipesAi} AI · ${u.recipesWithPhoto} met foto`}),e.jsx(o,{label:"Publiek gedeeld",value:u.recipesShared,sub:`${u.albumsShared} albums · ${u.planDaysShared} events`}),e.jsx(o,{label:"Albums",value:u.albums,sub:`${u.albumsContributable} laat contributies toe`}),e.jsx(o,{label:"Plan-dagen",value:u.planDays}),e.jsx(o,{label:"Tags",value:u.tags}),e.jsx(o,{label:"Favorieten",value:u.favorites}
1),e.jsx(o,{label:"Boodschappenlijsten",value:u.shoppingLists}),e.jsx(o,{label:"Kookacties",value:u.cookActions})]})}),e.jsxs(T,{title:"AI-gebruik (volledig)",children:[e.jsxs("div",{className:"grid grid-cols-2 sm:grid-cols-4 gap-3",children:[e.jsx(o,{label:"Calls",value:h.calls.toLocaleString("nl-BE")}),e.jsx(o,{label:"Tokens",value:h.tokens.toLocaleString("nl-BE")}),e.jsx(o,{label:"Totale kost",value:`€${h.cost.toFixed(4)}`,accent:!0}),e.jsx(o,{label:"Gem. kost / call",value:h.calls>0?`€${(h.cost/h.calls).toFixed(4)}`:"—"})]}),e.jsxs("div",{className:"mt-4 rounded-2xl p-3",style:{background:s.surface,boxShadow:s.shadowSm},children:[e.jsx("p",{className:"text-xs font-semibold mb-2",style:{color:s.subInk},children:"AI-kost laatste 30 dagen"}),h.costSeries30.every(c=>c.value===0)?e.jsx("p",{className:"text-xs text-center py-6",style:{color:s.subInk},children:"Geen AI-activiteit"}):e.jsx(Ne,{width:"100%",height:140,children:e.jsxs(_e,{data:h.costSeries30,children:[e.jsx("defs",{children:e.jsxs("linearGradient",{id:"gUserCost",x1:"0",y1:"0",x2:"0",y2:"1",children:[e.jsx("stop",{offset:"0%",stopColor:"#E8178C",stopOpacity:.6}),e.jsx("stop",{offset:"100%",stopColor:"#E8178C",stopOpacity:0})]})}),e.jsx(Se,{stroke:s.border,vertical:!1}),e.jsx(we,{dataKey:"date",tickFormatter:ee,fontSize:10,stroke:s.subInk}),e.jsx(Ie,{fontSize:10,stroke:s.subInk,width:32,tickFormatter:c=>`€${Number(c).toFixed(2)}`}),e.jsx(Ce,{labelFormatter:ee,formatter:c=>[`€${c.toFixed(4)}`,"kost"]}),e.jsx($e,{type:"monotone",dataKey:"value",stroke:"#E8178C",fill:"url(#gUserCost)",strokeWidth:2})]})})]}),e.jsxs("div",{className:"grid grid-cols-1 sm:grid-cols-2 gap-3 mt-3",children:[e.jsx(se,{title:"Per functie",rows:h.byFunction}),e.jsx(se,{title:"Per model",rows:h.byModel})]})]}),e.jsx(T,{title:"Opslag",children:e.jsxs("div",{className:"grid grid-cols-2 sm:grid-cols-4 gap-3",children:[e.jsx(o,{label:"Foto's",value:v.photos}),e.jsx(o,{label:"Totaal",value:Q(v.bytes)}),e.jsx(o,{label:"Gemiddeld per foto",value:v.avgBytes>0?Q(v.avgBytes):"—"}),e.jsx(o,{label:"Opslagkost / mnd",value:`€${v.costMonth.toFixed(4)}`})]})}),e.jsxs(T,{title:"Geschatte Lovable-kost voor deze gebruiker",children:[e.jsxs("div",{className:"grid grid-cols-1 sm:grid-cols-3 gap-3",children:[e.jsx(o,{label:"AI (totaal)",value:`€${h.cost.toFixed(4)}`}),e.jsx(o,{label:"Opslag (huidige maand)",value:`€${v.costMonth.toFixed(4)}`}),e.jsx(o,{label:"Totaal",value:`€${$.estimatedLovableCost.toFixed(4)}`,accent:!0})]}),e.jsx("p",{className:"text-[11px] mt-2",style:{color:s.subInk},children:"Schatting o.b.v. publieke Lovable-tarieven. DB en edge functions zijn gedeelde Cloud-kosten en worden niet per gebruiker uitgesplitst."})]}),e.jsx(T,{title:"Sharing & social",children:e.jsxs("div",{className:"grid grid-cols-2 sm:grid-cols-4 gap-3",children:[e.jsx(o,{label:"Volgt recepten",value:S.following.recipes}),e.jsx(o,{label:"Volgt albums",value:S.following.albums}),e.jsx(o,{label:"Volgers (recepten)",value:S.followers.recipes}),e.jsx(o,{label:"Volgers (albums)",value:S.followers.albums})]})})]})}function T({title:t,children:l}){return e.jsxs("div",{children:[e.jsx("h3",{className:"text-sm font-semibold mb-2",style:{color:s.ink},children:t}),l]})}function O({label:t,value:l}){return e.jsxs("div",{children:[e.jsx("p",{className:"text-[11px]",style:{color:s.subInk},children:t}),e.jsx("p",{className:"text-sm font-medium truncate",style:{color:s.ink},title:l,children:l})]})}function o({label:t,value:l,sub:a,accent:b}){return e.jsxs("div",{className:"rounded-2xl p-3",style:{background:b?s.accentSoft:s.surface,boxShadow:s.shadowSm},children:[e.jsx("p",{className:"text-[11px]",style:{color:s.subInk},children:t}),e.jsx("p",{className:"text-base font-bold tabular-nums leading-tight",style:{color:s.ink},children:l}),a&&e.jsx("p",{className:"text-[11px] mt-0.5",style:{color:s.subInk},children:a})]})}function se({title:t,rows:l}){return e.jsxs("div",{className:"rounded-2xl p-3",style:{background:s.surface,boxShadow:s.shadowSm},children:[e.jsx("p",{className:"text-xs font-semibold mb-2",style:{color:s.subInk},children:t}),l.length===0?e.jsx("p",{className:"text-xs",style:{color:s.subInk},children:"Geen data"}):e.jsx("ul",{className:"space-y-1.5",children:l.map(a=>e.jsxs("li",{className:"flex items-center justify-between text-xs gap-2",children:[e.jsx("span",{className:"truncate",style:{color:s.ink},children:a.name}),e.jsxs("span",{className:"shrink-0 tabular-nums",style:{color:s.subInk},children:[a.calls,"× · ",e.jsxs("span",{style:{color:s.ink},children:["€",a.cost.toFixed(4)]})]})]},a.name))})]})}const te=[{value:"free",label:"Smaakmaker",monthly:0},{value:"starter",label:"Keukenhulp",monthly:5},{value:"pro",label:"Chef de Cuisine",monthly:50},{value:"forever_free",label:"Forever free (verborgen)",monthly:50}],Pe=[{value:"monthly",label:"Maandelijks"},{value:"yearly",label:"Jaarlijks"},{value:"none",label:"Geen cyclus"}],Me=[{value:"",label:"—"},{value:"active",label:"Active"},{value:"trialing",label:"Trialing"},{value:"past_due",label:"Past due"},{value:"canceled",label:"Canceled"},{value:"incomplete",label:"Incomplete"},{value:"incomplete_expired",label:"Incomplete expired"},{value:"unpaid",label:"Unpaid"},{value:"paused",label:"Paused"}];function Ge(t){if(!t)return"";const l=new Date(t);if(Number.isNaN(l.getTime()))return"";const a=b=>String(b).padStart(2,"0");return`${l.getFullYear()}-${a(l.getMonth()+1)}-${a(l.getDate())}T${a(l.getHours())}:${a(l.getMinutes())}`}function Oe({userId:t}){const[l,a]=i.useState(null),[b,N]=i.useState(0),[m,d]=i.useState(0),[x,u]=i.useState(!0),[h,v]=i.useState(!1),[S,$]=i.useState(!1),[A,w]=i.useState("free"),[D,c]=i.useState(0),[j,_]=i.useState("monthly"),[F,z]=i.useState(""),[r,y]=i.useState(""),[B,U]=i.useState(0),[P,M]=i.useState(""),[W,ne]=i.useState(10),[H,J]=i.useState(""),V=async()=>{u(!0);const{row:n,counts:f,error:k}=await he(t);if(u(!1),k){g.error("Kon credits niet laden");return}const p=n??{plan:"free",cycle:null,subscription_status:null,credits_balance:0,monthly_credits:0,current_period_end:null,recipe_limit:25};a(p),N(Number(f?.own_count??0)),d(Number(f?.seed_count??0)),w(p.plan),c(p.monthly_credits),_(p.cycle??"none"),z(p.subscription_status??""),y(Ge(p.current_period_end)),U(p.credits_balance),M(p.recipe_limit==null?"":String(p.recipe_limit))};i.useEffect(()=>{V()},[t]);const re=async()=>{v(!0);const n=r?new Date(r).toISOString():null,f=P.trim()===""?null:Math.max(0,Number(P)||0),k={_user_id:t,_plan:A,_cycle:j==="none"?null:j||null,_status:F||null,_monthly_credits:D,_set_balance:B,_current_period_end:n,_recipe_limit:f,_clear_period_end:r==="",_clear_recipe_limit:P.trim()==="",_clear_cycle:j==="none"},{error:p}=await ge(k);if(v(!1),p){console.error("admin_update_user_subscription failed",p),g.error(`${p.message}${p.code?` (${p.code})`:""}`);return}g.success("Abonnement bijgewerkt"),V()},Y=async n=>{const f=n*Math.abs(W||0);if(!f){g.error("Geef een aantal credits op");return}$(!0);const{error:k}=await je({userId:t,amount:f,description:H||void 0});if($(!1),k){console.error("admin_adjust_credits failed",k),g.error(`${k.message}${k.code?` (${k.code})`:""}`);return}g.success(`${f>0?"+":""}${f} credits toegepast`),J(""),V()};if(x||!l)return e.jsx("div",{className:"grid place-items-center py-6",children:e.jsx(L,{className:"size-5 animate-spin",style:{color:s.subInk}})});const I="w-full px-3 py-2 rounded-xl text-sm outline-none",C={background:s.bg,color:s.ink,border:`1px solid ${s.border}`},G="inline-flex items-center justify-center gap-1.5 px-4 py-2 rounded-full text-sm font-semibold disabled:opacity-50";return e.jsxs(E,{children:[e.jsx("h3",{className:"text-sm font-semibold mb-3",style:{color:s.ink},children:"Plan & credits"}),e.jsxs("div",{className:"grid grid-cols-2 sm:grid-cols-3 gap-3 mb-4",children:[e.jsx(R,{label:"Huidig plan",value:l.plan}),e.jsx(R,{label:"Status",value:l.subscription_status??"—"}),e.jsx(R,{label:"Cyclus",value:l.cycle??"—"}),e.jsx(R,{label:"Saldo",value:`${l.credits_balance} credits`,accent:!0}),e.jsx(R,{label:"Eigen recepten",value:`${b} / ${l.recipe_limit??"∞"}`}),e.jsx(R,{label:"Voorbeeldrecepten",value:m})]}),e.jsxs("div",{className:"rounded-2xl p-3 mb-3",style:{background:s.surface,boxShadow:s.shadowSm},children:[e.jsx("p",{className:"text-xs font-semibold mb-2",style:{color:s.subInk},children:"Abonnement wijzigen"}),e.jsxs("div",{className:"grid grid-cols-1 sm:grid-cols-2 gap-2 items-end",children:[e.jsxs("label",{className:"block",children:[e.jsx("span",{className:"text-[11px]",style:{color:s.subInk},children:"Plan"}),e.jsx("select",{value:A,onChange:n=>{const f=n.target.value;w(f);const k=te.find(p=>p.value===f);k&&c(k.monthly),f==="forever_free"&&(_("none"),y(""),M(""))},className:I,style:C,children:te.map(n=>e.jsx("option",{value:n.value,children:n.label},n.value))})]}),e.jsxs("label",{className:"block",children:[e.jsx("span",{className:"text-[11px]",style:{color:s.subInk},children:"Cyclus"}),e.jsx("select",{value:j,onChange:n=>_(n.target.value),className:I,style:C,children:Pe.map(n=>e.jsx("option",{value:n.value,children:n.label},n.value))})]}),e.jsxs("label",{className:"block",children:[e.jsx("span",{className:"text-[11px]",style:{color:s.subInk},children:"Status"}),e.jsx("select",{value:F,onChange:n=>
1z(n.target.value),className:I,style:C,children:Me.map(n=>e.jsx("option",{value:n.value,children:n.label},n.value))})]}),e.jsxs("label",{className:"block",children:[e.jsx("span",{className:"text-[11px]",style:{color:s.subInk},children:"Einde huidige periode"}),e.jsx("input",{type:"datetime-local",value:r,onChange:n=>y(n.target.value),className:I,style:C})]}),e.jsxs("label",{className:"block",children:[e.jsx("span",{className:"text-[11px]",style:{color:s.subInk},children:"Maand-credits"}),e.jsx("input",{type:"number",min:0,value:D,onChange:n=>c(Number(n.target.value)||0),className:I,style:C})]}),e.jsxs("label",{className:"block",children:[e.jsx("span",{className:"text-[11px]",style:{color:s.subInk},children:"Saldo (credits)"}),e.jsx("input",{type:"number",min:0,value:B,onChange:n=>U(Math.max(0,Number(n.target.value)||0)),className:I,style:C})]}),e.jsxs("label",{className:"block sm:col-span-2",children:[e.jsx("span",{className:"text-[11px]",style:{color:s.subInk},children:"Receptenlimiet (leeg = onbeperkt)"}),e.jsx("input",{type:"number",min:0,value:P,onChange:n=>M(n.target.value),placeholder:"bv. 25",className:I,style:C})]})]}),e.jsxs("div",{className:"flex justify-end mt-3",children:[e.jsx("button",{onClick:()=>{w("forever_free"),_("none"),z(""),y(""),M(""),c(50),U(50),g("Velden ingevuld — klik 'Abonnement opslaan' om te bevestigen")},className:G+" mr-2",style:{background:s.chip,color:s.ink},children:"Gratis abonnement vooraf invullen"}),e.jsxs("button",{onClick:re,disabled:h,className:G,style:{background:s.ink,color:"white"},children:[h&&e.jsx(L,{className:"size-4 animate-spin"}),"Abonnement opslaan"]})]}),e.jsxs("p",{className:"text-[11px] mt-2",style:{color:s.subInk},children:[e.jsx("strong",{children:"Forever free"})," is verborgen op de publieke pricing-pagina en kan alleen hier worden toegekend."]})]}),e.jsxs("div",{className:"rounded-2xl p-3",style:{background:s.surface,boxShadow:s.shadowSm},children:[e.jsx("p",{className:"text-xs font-semibold mb-2",style:{color:s.subInk},children:"Credits aanpassen"}),e.jsxs("div",{className:"grid grid-cols-1 sm:grid-cols-[120px_1fr_auto_auto] gap-2 items-end",children:[e.jsxs("label",{className:"block",children:[e.jsx("span",{className:"text-[11px]",style:{color:s.subInk},children:"Aantal"}),e.jsx("input",{type:"number",min:1,value:W,onChange:n=>ne(Math.max(0,Number(n.target.value)||0)),className:I,style:C})]}),e.jsxs("label",{className:"block",children:[e.jsx("span",{className:"text-[11px]",style:{color:s.subInk},children:"Notitie (optioneel)"}),e.jsx("input",{type:"text",value:H,onChange:n=>J(n.target.value),placeholder:"bv. compensatie support-ticket",className:I,style:C})]}),e.jsx("button",{onClick:()=>Y(1),disabled:S,className:G,style:{background:s.accent,color:"white"},children:"+ Toevoegen"}),e.jsx("button",{onClick:()=>Y(-1),disabled:S,className:G,style:{background:s.chip,color:s.ink},children:"− Aftrekken"})]})]})]})}function R({label:t,value:l,accent:a}){return e.jsxs("div",{className:"rounded-2xl p-3",style:{background:a?s.accentSoft:s.surface,boxShadow:s.shadowSm},children:[e.jsx("p",{className:"text-[11px]",style:{color:s.subInk},children:t}),e.jsx("p",{className:"text-base font-bold tabular-nums leading-tight",style:{color:s.ink},children:l})]})}const Ue={paid:"Betaald",open:"Openstaand",draft:"Concept",uncollectible:"Oninbaar",void:"Geannuleerd"};function Ve(t,l){try{return new Intl.NumberFormat("nl-BE",{style:"currency",currency:l.toUpperCase()}).format(t)}catch{return`${t.toFixed(2)} ${l.toUpperCase()}`}}function Ke({userId:t}){const l=ie(oe),[a,b]=i.useState(null),[N,m]=i.useState(!0);return i.useEffect(()=>{let d=!0;return m(!0),l({data:{userId:t,environment:Ae()}}).then(x=>{d&&("error"in x?(g.error(`Kon betalingen niet laden: ${x.error}`),b([])):b(x.invoices))}).catch(x=>{d&&(g.error(`Kon betalingen niet laden: ${x.message}`),b([]))}).finally(()=>d&&m(!1)),()=>{d=!1}},[t,l]),e.jsxs(E,{children:[e.jsxs("h3",{className:"text-sm font-semibold flex items-center gap-1.5 mb-3",style:{color:s.ink},children:[e.jsx(ze,{className:"size-4",style:{color:s.subInk}})," Betalingen"]}),N?e.jsx("div",{className:"grid place-items-center py-6",children:e.jsx(L,{className:"size-5 animate-spin",style:{color:s.subInk}})}):!a||a.length===0?e.jsx("p",{className:"text-xs",style:{color:s.subInk},children:"Geen betalingen gevonden voor deze gebruiker."}):e.jsx("ul",{className:"divide-y",style:{borderColor:s.border},children:a.map(d=>e.jsxs("li",{className:"py-2.5 flex items-center gap-3",style:{borderTopColor:s.border},children:[e.jsxs("div",{className:"flex-1 min-w-0",children:[e.jsx("div",{className:"text-sm font-medium truncate",style:{color:s.ink},children:d.description||"Betaling"}),e.jsxs("div",{className:"text-xs",style:{color:s.subInk}
1,children:[d.created?new Date(d.created).toLocaleString("nl-BE",{dateStyle:"short",timeStyle:"short"}):"—"," · ",Ue[d.status??""]??d.status??"?"]})]}),e.jsx("div",{className:"text-sm font-bold tabular-nums shrink-0",style:{color:s.ink},children:Ve(d.amount_paid,d.currency)}),d.pdf_url&&e.jsx("a",{href:d.pdf_url,target:"_blank",rel:"noreferrer",title:"Factuur PDF",style:{color:s.subInk},children:e.jsx(Re,{className:"size-4"})}),d.hosted_invoice_url&&e.jsx("a",{href:d.hosted_invoice_url,target:"_blank",rel:"noreferrer",title:"Open in Stripe",style:{color:s.subInk},children:e.jsx(ae,{className:"size-4"})})]},d.id))})]})}const We=[{key:"overview",label:"Overzicht"},{key:"credits",label:"Credits & plan"},{key:"payments",label:"Betalingen"},{key:"recipes",label:"Recepten"}];function He({userId:t}={}){const l=ce({strict:!1}),a=t??l.userId??"",b=de(),[N,m]=i.useState([]),[d,x]=i.useState(!0),[u,h]=i.useState(null),[v,S]=i.useState([]),[$,A]=i.useState(""),[w,D]=i.useState(!1),[c,j]=i.useState(!1),[_,F]=i.useState("overview");i.useEffect(()=>{(async()=>{x(!0);const[r,y,B]=await Promise.all([fe(a),ve(a),ye(a)]);r.error?g.error("Kon recepten niet laden"):m(r.data?.recipes??[]),h(y===null?null:{display_name:y}),S(B),x(!1)})()},[a]);const z=async()=>{if($!=="VERWIJDER"){g.error("Typ VERWIJDER om te bevestigen");return}D(!0);const{error:r}=await ke(a);if(D(!1),r){g.error("Verwijderen mislukt");return}g.success("Gebruiker volledig verwijderd"),b({to:"/admin"})};return e.jsxs("div",{className:"space-y-5",children:[e.jsxs("header",{children:[e.jsx("p",{className:"text-sm",style:{color:s.subInk},children:"Gebruiker"}),e.jsx("h1",{className:"text-2xl font-bold tracking-tight",style:{color:s.ink},children:u?.display_name||"Gebruiker"}),e.jsx("p",{className:"text-xs font-mono mt-1 break-all",style:{color:s.subInk},children:a})]}),e.jsx("div",{className:"flex gap-1.5 overflow-x-auto -mx-1 px-1 py-1 rounded-2xl",style:{background:s.surface,boxShadow:s.shadowSm},children:We.map(r=>{const y=r.key===_;return e.jsx("button",{onClick:()=>F(r.key),className:"text-xs font-semibold px-3.5 py-2 rounded-xl whitespace-nowrap transition-opacity",style:{background:y?s.accent:"transparent",color:s.ink,opacity:y?1:.65},children:r.label},r.key)})}),_==="overview"&&e.jsx(Be,{userId:a}),_==="credits"&&e.jsx(Oe,{userId:a}),_==="payments"&&e.jsxs(e.Fragment,{children:[e.jsx(Ke,{userId:a}),e.jsxs(E,{children:[e.jsxs("p",{className:"text-sm font-semibold flex items-center gap-1.5",style:{color:s.ink},children:[e.jsx(De,{className:"size-4",style:{color:s.subInk}})," Gebruikersvoorwaarden"]}),v.length===0?e.jsx("p",{className:"text-xs mt-2",style:{color:s.subInk},children:"Nog niet aanvaard."}):e.jsx("ul",{className:"mt-2 space-y-1.5",children:v.map((r,y)=>e.jsxs("li",{className:"flex items-center justify-between gap-2 text-sm",style:{color:s.ink},children:[e.jsxs("span",{className:"flex items-center gap-2",children:[e.jsxs("span",{className:"font-medium",children:["v",r.terms_versions?.version??"?"]}),r.terms_versions?.is_active&&e.jsx("span",{className:"text-[10px] font-bold uppercase px-1.5 py-0.5 rounded-md",style:{background:s.accent,color:s.ink},children:"Actief"})]}),e.jsx("span",{className:"text-xs tabular-nums",style:{color:s.subInk},children:new Date(r.accepted_at).toLocaleString("nl-BE",{dateStyle:"short",timeStyle:"short"})})]},y))})]})]}),_==="recipes"&&e.jsxs(e.Fragment,{children:[e.jsx("h2",{className:"text-lg font-semibold tracking-tight",style:{color:s.ink},children:"Recepten"}),d?e.jsx("div",{className:"grid place-items-center py-10",children:e.jsx(L,{className:"size-6 animate-spin",style:{color:s.subInk}})}):N.length===0?e.jsx(E,{children:e.jsx("p",{className:"text-sm text-center",style:{color:s.subInk},children:"Deze gebruiker heeft nog geen recepten."})}):e.jsx(E,{children:e.jsx("ul",{className:"divide-y",style:{borderColor:s.border},children:N.map(r=>e.jsxs("li",{className:"py-3 flex items-center gap-3",style:{borderTopColor:s.border},children:[e.jsx("div",{className:"size-12 rounded-2xl grid place-items-center overflow-hidden shrink-0",style:{background:s.
1chip},children:r.photo_url?e.jsx(ue,{path:r.photo_url,alt:r.title,width:96,className:"w-full h-full"}):e.jsx(Ee,{className:"size-4",style:{color:s.subInk}})}),e.jsxs("div",{className:"flex-1 min-w-0",children:[e.jsxs("div",{className:"text-sm font-medium truncate flex items-center gap-1",style:{color:s.ink},children:[r.title,r.is_ai_generated&&e.jsx(me,{className:"size-3 shrink-0",style:{color:s.accent}})]}),e.jsxs("div",{className:"text-xs",style:{color:s.subInk},children:[new Date(r.created_at).toLocaleDateString("nl-BE")," · ",r.status,r.source_url&&" · import"]})]}),r.source_url&&e.jsx("a",{href:r.source_url,target:"_blank",rel:"noreferrer",style:{color:s.subInk},children:e.jsx(ae,{className:"size-4"})})]},r.id))})}),e.jsxs(E,{children:[e.jsxs("div",{className:"flex items-start justify-between gap-3",children:[e.jsxs("div",{className:"min-w-0",children:[e.jsx("p",{className:"text-sm font-semibold",style:{color:s.destructive},children:"Gebruiker verwijderen (GDPR)"}),e.jsx("p",{className:"text-xs mt-1",style:{color:s.subInk},children:"Wist alle recepten, foto's, albums, lijsten, AI-logs, profiel, rol en het account zelf. Onomkeerbaar."})]}),!c&&e.jsxs("button",{onClick:()=>j(!0),className:"shrink-0 inline-flex items-center gap-1.5 px-4 py-2 rounded-full text-xs font-semibold",style:{background:`${s.destructive}1A`,color:s.destructive},children:[e.jsx(X,{className:"size-3.5"})," Verwijder"]})]}),c&&e.jsxs("div",{className:"mt-3 space-y-2",children:[e.jsxs("p",{className:"text-xs",style:{color:s.ink},children:["Typ"," ",e.jsx("code",{className:"px-1 py-0.5 rounded",style:{background:s.chip},children:"VERWIJDER"})," ","om te bevestigen."]}),e.jsx("input",{value:$,onChange:r=>A(r.target.value),className:"w-full px-4 py-2.5 rounded-2xl text-sm outline-none",style:{background:s.bg,color:s.ink,border:`1px solid ${s.border}`},placeholder:"VERWIJDER"}),e.jsxs("div",{className:"flex gap-2",children:[e.jsxs("button",{onClick:z,disabled:w||$!=="VERWIJDER",className:"flex-1 inline-flex items-center justify-center gap-1.5 px-4 py-2.5 rounded-full text-sm font-semibold disabled:opacity-50",style:{background:s.destructive,color:"white"},children:[w?e.jsx(L,{className:"size-4 animate-spin"}):e.jsx(X,{className:"size-4"}),"Definitief verwijderen"]}),e.jsx("button",{onClick:()=>{j(!1),A("")},disabled:w,className:"px-4 py-2.5 rounded-full text-sm font-semibold",style:{background:s.chip,color:s.ink},children:"Annuleer"})]})]})]})]})]})}function as(){const{userId:t}=xe.useParams();return e.jsx("div",{className:"pt-20",children:e.jsx("div",{className:"max-w-5xl lg:max-w-6xl mx-auto px-4 md:px-8 pb-8",children:e.jsx(He,{userId:t})})})}export{as as component};

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.