2026-07-26 21:18:50 +03:30
import { G as l } from "./index-a1cbdc04.js" ; import { f as k , M as A , d as v } from "./supabaseTableQuery-95762ff3.js" ; import { e as g } from "./convert-2ad76038.js" ; function E ( e ){ if ( Array . isArray ( e )) return e . map ( String ). filter ( Boolean ); if ( typeof e == "string" ) try { const t = JSON . parse ( e ); if ( Array . isArray ( t )) return t . map ( String ). filter ( Boolean )} catch { return e . trim () ? [ e ] : []} return []} function M ( e ){ return {... e , duration_minutes : Math . round (( Number ( e . duration_seconds ) || 0 ) / 60 ), kodoblu_voice_url : g ( e . kodoblu_voice_url ) || "" , audio_section_url : g ( e . audio_section_url ) || "" , step_images : E ( e . step_images ). map ( t => g ( t ) || t )}} function x ( e , t , r ){ var a , c , s , i , n ; return { challenge_id : e , step_order : r , description : t . description || "" , duration_seconds : Math . max ( 0 , Math . round ( Number ( t . duration_minutes ) * 60 ) || 0 ), aparat_embed_code : (( a = t . aparat_embed_code ) == null ? void 0 : a . trim ()) || null , kodoblu_voice_url : g (( c = t . kodoblu_voice_url ) == null ? void 0 : c . trim ()) || null , step_images : ( t . step_images || []). map ( o => g ( o ) || o ). filter ( Boolean ), is_final_step :!! t . is_final_step , enable_feedback_text :!! t . enable_feedback_text , require_feedback_text :!! t . require_feedback_text , feedback_text_title : (( s = t . feedback_text_title ) == null ? void 0 : s . trim ()) || null , feedback_text_placeholder : (( i = t . feedback_text_placeholder ) == null ? void 0 : i . trim ()) || null , enable_photo_upload :!! t . enable_photo_upload , require_photo_upload :!! t . enable_photo_upload &&!! t . require_photo_upload , enable_voice_upload :!! t . enable_voice_upload , require_voice_upload :!! t . require_voice_upload , enable_mcq :!! t . enable_mcq , require_mcq :!! t . require_mcq , mcq_question : t . mcq_question || null , mcq_options : ( t . mcq_options || []). filter ( o => o . trim ()), mcq_correct_index : t . enable_mcq ? Number ( t . mcq_correct_index ?? 0 ) : null , enable_audio_section :!! t . enable_audio_section , audio_section_url : g (( n = t . audio_section_url ) == null ? void 0 : n . trim ()) || null , punishment_description : t . punishment_description || "" , requires_photo_upload :!! t . enable_photo_upload &&!! t . require_photo_upload , updated_at : new Date (). toISOString ()}} function N ( e , t ){ return t . map (( r , a )=> x ( e , r , a + 1 ))} async function U ( e ){ const { data : t , error : r } = await l . from ( "step_challenges" ). select ( "*" ). eq ( "id" , e ). single (); if ( r ) throw r ; const { data : a , error : c } = await l . from ( "step_challenge_steps" ). select ( "*" ). eq ( "challenge_id" , e ). order ( "step_order" ,{ ascending :! 0 }); if ( c ) throw c ; return {... t , steps : ( a || []). map ( s => M ( s ))}} async function B ( e , t ){ const r = { title : e . title , character_image_url : e . character_image_url , show : e . show ??! 1 , access_type : e . access_type ?? "free" , sort_order : e . sort_order ?? 0 , completion_points : Number ( e . completion_points ) || 50 , chapter_id : e . chapter_id ?? null }; t && ( r . owner_id = t ); const { data : a , error : c } = await l . from ( "step_challenges" ). insert ([ r ]). select (). single (); if ( c ) throw c ; const s = N ( a . id , e . steps ),{ error : i } = await l . from ( "step_challenge_steps" ). insert ( s ); if ( i ) throw i ; return a } async function L ( e , t ){ const { error : r } = await l . from ( "step_challenges" ). update ({ title : t . title , character_image_url : t . character_image_url , show : t . show ??! 1 , access_type : t . access_type ?? "free" , sort_order : t . sort_order ?? 0 , completion_points : Number ( t . completion_points ) || 50 , chapter_id : t . chapter_id ?? null , updated_at : new Date (). toISOString ()}). eq ( "id" , e ); if ( r ) throw r ; const { data : a , error : c } = await l . from ( "step_challenge_steps" ). select ( "id" ). eq ( "challenge_id" , e ); if ( c ) throw c ; const s = new Set (( a || []). map ( o => o . id )), i = t . steps . map ( o => o . id ). filter ( o => typeof o == "number" && s . has ( o )), n = [... s ]. filter ( o => ! i . includes ( o )); if ( n . length ){ const { error : o } = await l . from ( "user_step_challenge_steps" ). delete (). in ( "step_id" , n ); if ( o ) throw o ; const { error : _ } = await l . from ( "step_challenge_steps" ). delete (). in ( "id" , n ); if ( _ ) throw _ } for ( const o of i ){ const { error : _ } = await l . from ( "step_challenge_steps" ). update ({ step_order :- o , updated_at : new Date (). toISOString ()}). eq ( "id" , o ); if ( _ ) throw _ } for ( let o = 0 ; o < t . steps . length ; o ++ ){ const _ = t . steps [ o ], m = x ( e , _ , o + 1 ); if ( _ . id && s . has ( _ . id )){ const { error : u } = await l . from ( "step_challenge_steps" ). update ( m ). eq ( "id" , _ . id ); if ( u ) throw u ; continue } const { error : h } = await l . from ( "step_challenge_steps" ). insert ( m ); if ( h ) throw h } return { id : e }} async function $ ( e ){ const { data : t , error : r } = await l . from ( "user_step_challenges" ). select ( "id" ). eq ( "challenge_id" , e ); if ( r ) t
2026-07-26 16:24:36 +03:30
id ,
step_order ,
description ,
is_final_step ,
enable_feedback_text ,
enable_photo_upload ,
enable_voice_upload ,
enable_mcq ,
requires_photo_upload
`).eq("challenge_id",e).order("step_order",{ascending:!0});if(r)throw r;return(t||[]).map(a=>({id:a.id,step_order:a.step_order,description:(a.description||"").trim(),is_final_step:!!a.is_final_step,enable_feedback_text:!!a.enable_feedback_text,enable_photo_upload:!!(a.enable_photo_upload||a.requires_photo_upload),enable_voice_upload:!!a.enable_voice_upload,enable_mcq:!!a.enable_mcq,label:` مرحله $ { a . step_order } `}))}async function H(e,t="",r){const a=[];let c=l.from("user_step_challenge_steps").select(`
id ,
step_id ,
feedback_text ,
created_at ,
user_step_challenges ! inner (
challenge_id ,
users ( name , phone , first_name , last_name )
)
`).eq("user_step_challenges.challenge_id",e).not("feedback_text","is",null);r&&(c=c.eq("step_id",r));const{data:s,error:i}=await c;if(i)throw i;for(const n of s||[]){const o=String(n.feedback_text||"").trim();if(!o)continue;const _=Array.isArray(n.user_step_challenges)?n.user_step_challenges[0]:n.user_step_challenges,m=Array.isArray(_==null?void 0:_.users)?_.users[0]:_==null?void 0:_.users,{user_name:h,user_phone:u}=w(m);!S(h,u,t)&&!o.toLowerCase().includes(t.trim().toLowerCase())||a.push({id:` step - $ { n . id } `,user_name:h,user_phone:u,feedback_text:o,source:"step",step_id:n.step_id,created_at:n.created_at})}return a.sort((n,o)=>String(o.created_at||"").localeCompare(String(n.created_at||""))),a.map((n,o)=>({...n,index:o+1}))}async function V(e,t=""){const{data:r,error:a}=await l.from("user_step_challenges").select("id, completion_feedback, completed_at, created_at, users(name, phone, first_name, last_name)").eq("challenge_id",e).not("completion_feedback","is",null);if(a)throw a;const c=(r||[]).map(s=>{const i=String(s.completion_feedback||"").trim();if(!i)return null;const n=Array.isArray(s.users)?s.users[0]:s.users,{user_name:o,user_phone:_}=w(n);return!S(o,_,t)&&!i.toLowerCase().includes(t.trim().toLowerCase())?null:{id:` completion - $ { s . id } `,user_name:o,user_phone:_,feedback_text:i,created_at:s.completed_at||s.created_at}}).filter(Boolean);return c.sort((s,i)=>String(i.created_at||"").localeCompare(String(s.created_at||""))),c.map((s,i)=>({...s,index:i+1}))}async function X(e,t="",r,a=1,c=12){const s=Math.max(1,a||1),i=Math.min(48,Math.max(1,c||12));let n=l.from("user_step_challenge_steps").select(`
id ,
step_id ,
photo_url ,
created_at ,
user_step_challenges ! inner (
challenge_id ,
user_id ,
users ( name , phone , first_name , last_name )
)
`,{count:"exact"}).eq("user_step_challenges.challenge_id",e).not("photo_url","is",null).neq("photo_url","");if(r&&(n=n.eq("step_id",r)),t.trim()){const u=await k(l,t);if(!u.length)return{rows:[],total:0,page:s,pageSize:i};n=n.in("user_step_challenges.user_id",u.slice(0,A))}n=n.order("created_at",{ascending:!1}),n=v(n,s,i);const{data:o,error:_,count:m}=await n;if(_)throw _;return{rows:(o||[]).map(u=>{const b=String(u.photo_url||"").trim();if(!b)return null;const d=Array.isArray(u.user_step_challenges)?u.user_step_challenges[0]:u.user_step_challenges,p=Array.isArray(d==null?void 0:d.users)?d.users[0]:d==null?void 0:d.users,{user_name:f,user_phone:q}=w(p);return{id:u.id,step_id:u.step_id,photo_url:b,user_name:f,user_phone:q,created_at:u.created_at}}).filter(Boolean),total:m??0,page:s,pageSize:i}}async function K(e,t="",r){let a=l.from("user_step_challenge_steps").select(`
id ,
step_id ,
voice_url ,
created_at ,
user_step_challenges ! inner (
challenge_id ,
users ( name , phone , first_name , last_name )
)
`).eq("user_step_challenges.challenge_id",e).not("voice_url","is",null);r&&(a=a.eq("step_id",r));const{data:c,error:s}=await a;if(s)throw s;const i=(c||[]).map(n=>{const o=String(n.voice_url||"").trim();if(!o)return null;const _=Array.isArray(n.user_step_challenges)?n.user_step_challenges[0]:n.user_step_challenges,m=Array.isArray(_==null?void 0:_.users)?_.users[0]:_==null?void 0:_.users,{user_name:h,user_phone:u}=w(m);return S(h,u,t)?{id:n.id,step_id:n.step_id,voice_url:o,user_name:h,user_phone:u,created_at:n.created_at}:null}).filter(Boolean);return i.sort((n,o)=>String(o.created_at||"").localeCompare(String(n.created_at||""))),i.map((n,o)=>({...n,index:o+1}))}async function Y(e,t="",r){let a=l.from("step_challenge_steps").select("id, step_order, mcq_question, mcq_options, mcq_correct_index, enable_mcq").eq("challenge_id",e).eq("enable_mcq",!0).order("step_order",{ascending:!0});r&&(a=a.eq("id",r));const{data:c,error:s}=await a;if(s)throw s;let i=l.from("user_step_challenge_steps").select(`
id ,
step_id ,
mcq_answer ,
created_at ,
user_step_challenges ! inner (
challenge_id ,
users ( name , phone , first_name , last_name )
)
`).eq("user_step_challenges.challenge_id",e).not("mcq_answer","is",null);r&&(i=i.eq("step_id",r));const{data:n,error:o}=await i;if(o)throw o;return(c||[]).map(_=>{const m=P(_.mcq_options),h=(n||[]).filter(d=>d.step_id===_.id&&d.mcq_answer!==null&&d.mcq_answer!==void 0).map(d=>{const p=Array.isArray(d.user_step_challenges)?d.user_step_challenges[0]:d.user_step_challenges,f=Array.isArray(p==null?void 0:p.users)?p.users[0]:p==null?void 0:p.users,{user_name:q,user_phone:y}=w(f),C=Number(d.mcq_answer);return{id:d.id,user_name:q,user_phone:y,mcq_answer:C,answer_label:m[C]||` گزینه $ { C + 1 } `,created_at:d.created_at}}).filter(d=>S(d.user_name,d.user_phone,t)).sort((d,p)=>String(p.created_at||"").localeCompare(String(d.created_at||""))).map((d,p)=>({...d,index:p+1})),u=h.length,b=m.map((d,p)=>{const f=h.filter(y=>y.mcq_answer===p).length,q=u>0?Math.round(f/u*1e3)/10:0;return{optionIndex:p,label:d,count:f,percent:q}});return{step_id:_.id,step_order:_.step_order,question:_.mcq_question||` سوال مرحله $ { _ . step_order } `,options:m,correct_index:_.mcq_correct_index,answers:h,option_stats:b,total_answers:u}})}async function Z(){const{data:e,error:t}=await l.from("step_challenge_config").select("*").eq("id",1).maybeSingle();if(t)throw t;return e||{id:1,rules_aparat_embed_code:null}}async function ee(e){const{data:t,error:r}=await l.from("step_challenge_config").upsert({id:1,rules_aparat_embed_code:e.rules_aparat_embed_code||null,updated_at:new Date().toISOString()}).select().single();if(r)throw r;return t}export{J as a,W as b,R as c,T as d,Z as e,L as f,z as g,B as h,Q as i,$ as j,U as k,H as l,K as m,Y as n,V as o,j as p,G as q,X as r,ee as s,I as u};