create-fullstack-scaffold 0.4.3 → 0.4.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli/index.js +513 -122
- package/dist/cli/index.js.map +1 -1
- package/package.json +1 -1
- package/template/dist/cli/index.js +237 -94
- package/template/dist/cli/index.js.map +1 -1
- package/template/dist/client/admin.html +15 -10
- package/template/dist/client/assets/App-BpFUIC-5.js +114 -0
- package/template/dist/client/assets/{CartPage-DESSHkaG.js → CartPage-DgDZP-R5.js} +2 -2
- package/template/dist/client/assets/{CategoriesPage-DqLZ_Mom.js → CategoriesPage-fuYNiSmE.js} +2 -2
- package/template/dist/client/assets/ContentDetailPage-BvvFU1Mr.js +1 -0
- package/template/dist/client/assets/ContentListPage-ShPxo6WG.js +1 -0
- package/template/dist/client/assets/DashboardPage-C1rZzZo4.js +11 -0
- package/template/dist/client/assets/{DeveloperDashboardPage-Cum7zFwO.js → DeveloperDashboardPage-_WtmbVoA.js} +2 -2
- package/template/dist/client/assets/{EmptyState-BK7ttK8D.js → EmptyState-DEyOQjbY.js} +1 -1
- package/template/dist/client/assets/LoadingSpinner-BcHjaM1m.js +6 -0
- package/template/dist/client/assets/LoginPage-CjeQqDdO.js +1 -0
- package/template/dist/client/assets/LogoutOutlined-ColFAHdd.js +1 -0
- package/template/dist/client/assets/NotificationPage-DRkEv02s.js +1 -0
- package/template/dist/client/assets/OrdersPage-7I3vPWLP.js +11 -0
- package/template/dist/client/assets/{PluginDetailPage-Br24YS4P.js → PluginDetailPage-CWyxdVCg.js} +3 -13
- package/template/dist/client/assets/PluginsPage-DRgWLeJT.js +6 -0
- package/template/dist/client/assets/ProfilePage-2FFkaii8.js +16 -0
- package/template/dist/client/assets/PublishPage-DW7yvROx.js +1 -0
- package/template/dist/client/assets/{RegisterPage-rPFG4Sry.js → RegisterPage-Dvaf9b0e.js} +2 -2
- package/template/dist/client/assets/SaveOutlined-CLQ2tsSY.js +2 -0
- package/template/dist/client/assets/{SearchPage-DQl1U5Uy.js → SearchPage-DvnEyswS.js} +2 -2
- package/template/dist/client/assets/{SettingsPage-DaYE80wj.js → SettingsPage-IrU-L9Zr.js} +2 -2
- package/template/dist/client/assets/{StatusBadge-BJ3W2Zc7.js → StatusBadge-CG7wVqpu.js} +1 -1
- package/template/dist/client/assets/{TodoPage-zC5wWNBa.js → TodoPage-B7D-bl65.js} +3 -3
- package/template/dist/client/assets/TopicsPage-CYCNr-mn.js +6 -0
- package/template/dist/client/assets/{WebSocketPage-B4NLdz1w.js → WebSocketPage-CGEg6QJE.js} +2 -2
- package/template/dist/client/assets/{activity-B94BUAsD.js → activity-CgTz9Mrd.js} +1 -1
- package/template/dist/client/assets/admin-D2iHWNOg.js +1 -0
- package/template/dist/client/assets/api-request-DIJocPxr.js +356 -0
- package/template/dist/client/assets/{arrow-left-H5JH0iU1.js → arrow-left-DtLQ3tTk.js} +1 -1
- package/template/dist/client/assets/{chevron-down-DwRh_wjD.js → chevron-down-CpIAV_yr.js} +1 -1
- package/template/dist/client/assets/{chevron-right-CpIWaqAL.js → chevron-right-CnU7oPQs.js} +1 -1
- package/template/dist/client/assets/{circle-check-big-CSElLscG.js → circle-check-big-CrZdwS75.js} +1 -1
- package/template/dist/client/assets/{circle-x-CYxr4RAw.js → circle-x-CvN9r3fW.js} +1 -1
- package/template/dist/client/assets/{clock-BseUJ7ex.js → clock-CTeSZBiH.js} +1 -1
- package/template/dist/client/assets/{download-BsGC_Xhq.js → download-OSVfVuNV.js} +1 -1
- package/template/dist/client/assets/{external-link-UTDzdjq8.js → external-link-fBsuHMby.js} +1 -1
- package/template/dist/client/assets/{eye-nR10ui7i.js → eye-CwlZZEsj.js} +1 -1
- package/template/dist/client/assets/index-09IqiOaE.css +1 -0
- package/template/dist/client/assets/index-B3CRby6r.js +51 -0
- package/template/dist/client/assets/index-CC_zy73y.js +17 -0
- package/template/dist/client/assets/main-Cn4IDo2I.js +92 -0
- package/template/dist/client/assets/merchant-DDDN9bMu.js +40 -0
- package/template/dist/client/assets/{message-square-CwWGL-Bh.js → message-square-BRaZfgbJ.js} +1 -1
- package/template/dist/client/assets/pluginStore-DDsWJPe6.js +1 -0
- package/template/dist/client/assets/{plus-pZld_nUL.js → plus-DDZfPiDJ.js} +1 -1
- package/template/dist/client/assets/sse-client-DGQ072hl.js +64 -0
- package/template/dist/client/assets/star-C7tO6w4H.js +11 -0
- package/template/dist/client/assets/{tag-DsiUPF90.js → tag-DBfpQDuJ.js} +1 -1
- package/template/dist/client/assets/tenant-CizbLaLJ.js +1 -0
- package/template/dist/client/assets/{trash-2-DRblNbnA.js → trash-2-BP7fkd5b.js} +1 -1
- package/template/dist/client/assets/{triangle-alert-D1CLh-Vd.js → triangle-alert-CrOQEdJ2.js} +1 -1
- package/template/dist/client/assets/{wifi-BwXjnCqI.js → wifi-CwYSE0J4.js} +1 -1
- package/template/dist/client/assets/{x-BH2rJdFq.js → x-t615pnNR.js} +1 -1
- package/template/dist/client/content/index.html +5 -4
- package/template/dist/client/index.html +4 -3
- package/template/dist/client/merchant.html +18 -0
- package/template/dist/client/notifications/index.html +6 -5
- package/template/dist/client/tenant.html +18 -0
- package/template/dist/client/todos/index.html +6 -5
- package/template/dist/client/websocket/index.html +6 -5
- package/template/dist/cloudflare/chunk-HX7DVRDX.js +1 -0
- package/template/dist/cloudflare/{chunk-QBHAPWIA.js → chunk-IXJL2LE4.js} +1 -1
- package/template/dist/cloudflare/chunk-Q34AN3RF.js +14 -0
- package/template/dist/cloudflare/{chunk-BHPTQ4K2.js → chunk-ZAMVL4EG.js} +2 -2
- package/template/dist/cloudflare/cloudflare.js +35 -29
- package/template/dist/cloudflare/db-4AQOSFAX.js +1 -0
- package/template/dist/cloudflare/{migrator-2ZYYKNI5.js → migrator-TEPBVUFO.js} +1 -1
- package/template/dist/cloudflare/permission-service-impl-RE7NPW3Q.js +1 -0
- package/template/dist/cloudflare/schema-DVEMT3X2.js +1 -0
- package/template/dist/cloudflare/test-setup-Z2RYE5B4.js +265 -0
- package/template/dist/server/chunk-27SIJSPF.js +1 -0
- package/template/dist/server/chunk-37QNGBQU.js +1 -0
- package/template/dist/server/chunk-FIY4CGJJ.js +1 -0
- package/template/dist/server/chunk-HZUDBIT4.js +1 -0
- package/template/dist/server/chunk-I6OBDFDU.js +1 -0
- package/template/dist/server/chunk-JHNYLNG7.js +1 -0
- package/template/dist/server/chunk-MDOVVKKD.js +1 -0
- package/template/dist/server/chunk-NSOCT7E5.js +1 -0
- package/template/dist/server/chunk-OU5IGVVO.js +1 -0
- package/template/dist/server/chunk-OYCBNRMK.js +1 -0
- package/template/dist/server/chunk-P2RJNNGD.js +1 -0
- package/template/dist/server/chunk-UMAQLNPE.js +1 -0
- package/template/dist/server/chunk-XZZTSRSN.js +1 -0
- package/template/dist/server/content-service-5QVHDR5X.js +1 -0
- package/template/dist/server/db-FLI5L5DD.js +1 -0
- package/template/dist/server/dispute-service-E2FCYUEM.js +1 -0
- package/template/dist/server/init-72JXJV3I.js +46 -0
- package/template/dist/server/init-FWYXSKPX.js +46 -0
- package/template/dist/server/node.js +34 -28
- package/template/dist/server/order-service-TKGG5S5K.js +1 -0
- package/template/dist/server/permission-service-impl-M3AKEYNY.js +1 -0
- package/template/dist/server/schema-V4UG7HMU.js +1 -0
- package/template/dist/server/tenant-service-JG6UUWXQ.js +1 -0
- package/template/dist/server/tenant-service-XJWZSEDX.js +1 -0
- package/template/dist/{cloudflare/test-setup-NMZJZLRV.js → server/test-setup-VFOPBGYM.js} +83 -2
- package/template/dist/server/ticket-service-3RSW7V2Z.js +1 -0
- package/template/dist/server/todo-service-S6BGIO7D.js +1 -0
- package/template/src/merchant/pages/DisputesPage.tsx +11 -11
- package/template/src/merchant/pages/OrdersPage.tsx +4 -3
- package/template/src/merchant/pages/ProductsPage.tsx +2 -2
- package/template/src/merchant/stores/merchantStore.ts +11 -6
- package/template/src/server/db/init.ts +5 -642
- package/template/src/server/module-plugin/services/plugin-seed-service.ts +623 -0
- package/template/src/server/module-tenant/routes/tenant-routes.ts +2 -2
- package/template/src/server/module-tenant/services/tenant-service.ts +63 -17
- package/template/src/shared/modules/merchant/index.ts +9 -0
- package/template/src/shared/modules/merchant/schemas.ts +37 -0
- package/template/src/shared/modules/tenant/index.ts +2 -0
- package/template/src/shared/schemas/index.ts +27 -0
- package/template/src/tenant/layouts/Header.tsx +1 -1
- package/template/src/tenant/layouts/Sidebar.tsx +1 -1
- package/template/src/tenant/pages/SettingsPage.tsx +4 -8
- package/template/src/tenant/stores/tenantStore.ts +41 -302
- package/template/tsconfig.json +1 -0
- package/template/tsup.config.ts +11 -3
- package/template/dist/client/assets/ContentDetailPage-DdltMANL.js +0 -1
- package/template/dist/client/assets/ContentListPage-B63sUB6N.js +0 -1
- package/template/dist/client/assets/DashboardPage-tUMilc7Z.js +0 -11
- package/template/dist/client/assets/LoadingSpinner-DVYOLSRM.js +0 -6
- package/template/dist/client/assets/LoginPage-g9mSLIMC.js +0 -6
- package/template/dist/client/assets/NotificationPage-COTzp-HD.js +0 -1
- package/template/dist/client/assets/OrdersPage-BsPh4oEI.js +0 -11
- package/template/dist/client/assets/PluginsPage-BNtAe_yo.js +0 -6
- package/template/dist/client/assets/ProfilePage-dL_iSuZN.js +0 -16
- package/template/dist/client/assets/PublishPage-D96FnbLA.js +0 -1
- package/template/dist/client/assets/TopicsPage-DyLjZa4D.js +0 -6
- package/template/dist/client/assets/admin-Bh1vfz_L.js +0 -486
- package/template/dist/client/assets/index-1bA-ixFv.js +0 -114
- package/template/dist/client/assets/index-CWh3vXC_.css +0 -1
- package/template/dist/client/assets/main-DHnArIp_.js +0 -82
- package/template/dist/client/assets/pluginStore-XQfsm3iR.js +0 -1
- package/template/dist/client/content/content-1/index.html +0 -18
- package/template/dist/client/content/content-13/index.html +0 -18
- package/template/dist/client/content/content-14/index.html +0 -18
- package/template/dist/client/content/content-15/index.html +0 -18
- package/template/dist/client/content/content-19/index.html +0 -18
- package/template/dist/client/content/content-2/index.html +0 -18
- package/template/dist/client/content/content-20/index.html +0 -18
- package/template/dist/cloudflare/chunk-YY6FRMAQ.js +0 -14
- package/template/dist/cloudflare/db-7J42RQ3T.js +0 -1
- package/template/dist/cloudflare/permission-service-impl-TGXVSSSA.js +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export{h as cancelOrder,i as completeOrder,d as createOrder,f as deleteOrder,c as getOrderById,b as getOrders,g as processOrder,a as seedOrdersIfEmpty,e as updateOrder}from'./chunk-HZUDBIT4.js';import'./chunk-I6OBDFDU.js';import'./chunk-FIY4CGJJ.js';import'./chunk-JCPOP4XL.js';import'./chunk-UMAQLNPE.js';import'./chunk-OYCBNRMK.js';import'./chunk-27SIJSPF.js';import'./chunk-5J6HXUF6.js';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export{s as PermissionService,t as permissionService}from'./chunk-37QNGBQU.js';import'./chunk-JCPOP4XL.js';import'./chunk-UMAQLNPE.js';import'./chunk-OYCBNRMK.js';import'./chunk-27SIJSPF.js';import'./chunk-5J6HXUF6.js';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import {J}from'./chunk-27SIJSPF.js';export{x as contentCategories,w as contentStatuses,y as contents,z as developers,u as disputeStatuses,t as disputeTypes,v as disputes,d as notifications,l as orderStatuses,m as orders,k as permissionAuditLogs,j as permissionRouteMappings,e as permissions,F as pluginCategories,G as pluginCategoryMappings,E as pluginReviews,B as pluginStatus,D as pluginVersions,C as plugins,g as rolePermissions,f as roles,i as routes,H as tenants,p as ticketCategories,o as ticketPriorities,s as ticketReplies,q as ticketReplyAuthorRoles,n as ticketStatuses,r as tickets,c as todoAttachments,a as todoStatus,b as todos,h as userRoles}from'./chunk-27SIJSPF.js';import'./chunk-5J6HXUF6.js';J();
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import {b}from'./chunk-MDOVVKKD.js';import {a}from'./chunk-UMAQLNPE.js';import {h,f,i}from'./chunk-OYCBNRMK.js';import {J as J$1,H}from'./chunk-27SIJSPF.js';import'./chunk-5J6HXUF6.js';import {eq,like,desc}from'drizzle-orm';a();J$1();h();var c=f("tenant-service");async function O(){let s=await i();if((await s.select().from(H)).length===0){c.info({},"Seeding tenants...");let e=[{name:"Demo Corp",slug:"demo",status:"active",plan:"pro",maxUsers:50,settings:JSON.stringify({theme:"dark",language:"en"})},{name:"Test Inc",slug:"test",status:"trial",plan:"free",maxUsers:5,settings:null}];await s.insert(H).values(e),c.info({},"Tenants seeding complete!");}}async function J(s=1,r=20,e={}){let t=await i(),o=(s-1)*r,a=t.select().from(H);e.status&&(a=a.where(eq(H.status,e.status))),e.plan&&(a=a.where(eq(H.plan,e.plan))),e.search&&(a=a.where(like(H.name,`%${e.search}%`)));let u=await a.orderBy(desc(H.createdAt)).limit(r).offset(o),g=t.select().from(H);e.status&&(g=g.where(eq(H.status,e.status))),e.plan&&(g=g.where(eq(H.plan,e.plan))),e.search&&(g=g.where(like(H.name,`%${e.search}%`)));let T=(await g).length;return {items:u.map(i=>({id:i.id,name:i.name,slug:i.slug,status:i.status,plan:i.plan,maxUsers:i.maxUsers,settings:i.settings?JSON.parse(i.settings):null,createdAt:i.createdAt,updatedAt:i.updatedAt})),total:T,page:s,pageSize:r}}async function Q(s){let e=await(await i()).select().from(H).where(eq(H.slug,s));if(e.length===0)return null;let t=e[0];return {id:t.id,name:t.name,slug:t.slug,status:t.status,plan:t.plan,maxUsers:t.maxUsers,settings:t.settings?JSON.parse(t.settings):null,createdAt:t.createdAt,updatedAt:t.updatedAt}}async function k(s){let e=await(await i()).select().from(H).where(eq(H.id,s));if(e.length===0)return null;let t=e[0];return {id:t.id,name:t.name,slug:t.slug,status:t.status,plan:t.plan,maxUsers:t.maxUsers,settings:t.settings?JSON.parse(t.settings):null,createdAt:t.createdAt,updatedAt:t.updatedAt}}async function R(s){let r=await i();if((await r.select().from(H).where(eq(H.slug,s.slug))).length>0)throw new b(`Tenant with slug '${s.slug}' already exists`);let t=new Date().toISOString(),a=(await r.insert(H).values({name:s.name,slug:s.slug,status:"trial",plan:s.plan,maxUsers:s.maxUsers,settings:s.settings?JSON.stringify(s.settings):null,createdAt:t,updatedAt:t}).returning())[0];return c.info({tenantId:a.id,slug:a.slug},"Tenant created"),{id:a.id,name:a.name,slug:a.slug,status:a.status,plan:a.plan,maxUsers:a.maxUsers,settings:a.settings?JSON.parse(a.settings):null,createdAt:a.createdAt,updatedAt:a.updatedAt}}async function v(s,r){let e=await i();if((await e.select().from(H).where(eq(H.id,s))).length===0)return null;let o={updatedAt:new Date().toISOString()};r.name!==void 0&&(o.name=r.name),r.status!==void 0&&(o.status=r.status),r.plan!==void 0&&(o.plan=r.plan),r.maxUsers!==void 0&&(o.maxUsers=r.maxUsers),r.settings!==void 0&&(o.settings=r.settings?JSON.stringify(r.settings):null);let a=await e.update(H).set(o).where(eq(H.id,s)).returning();if(a.length===0)return null;let u=a[0];return c.info({tenantId:u.id,slug:u.slug},"Tenant updated"),{id:u.id,name:u.name,slug:u.slug,status:u.status,plan:u.plan,maxUsers:u.maxUsers,settings:u.settings?JSON.parse(u.settings):null,createdAt:u.createdAt,updatedAt:u.updatedAt}}async function D(s){return (await(await i()).delete(H).where(eq(H.id,s)).returning()).length>0?(c.info({tenantId:s},"Tenant deleted"),true):false}export{R as createTenant,D as deleteTenant,k as getTenantById,Q as getTenantBySlug,J as listTenants,O as seedTenantsIfEmpty,v as updateTenant};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import {b}from'./chunk-MDOVVKKD.js';import {a}from'./chunk-UMAQLNPE.js';import {h,f,i}from'./chunk-OYCBNRMK.js';import {J as J$1,H}from'./chunk-27SIJSPF.js';import'./chunk-5J6HXUF6.js';import {eq,like,desc}from'drizzle-orm';a();J$1();h();var g=f("tenant-service");async function N(){let a=await i();if((await a.select().from(H)).length===0){g.info({},"Seeding tenants...");let s=new Date().toISOString(),t=[{name:"Demo Corp",slug:"demo",status:"active",plan:"pro",maxUsers:50,settings:JSON.stringify({theme:"dark",language:"en"}),createdAt:s,updatedAt:s},{name:"Test Inc",slug:"test",status:"trial",plan:"free",maxUsers:5,settings:null,createdAt:s,updatedAt:s}];await a.insert(H).values(t),g.info({},"Tenants seeding complete!");}}async function k(a=1,e=20,s={}){let t=await i(),i$1=(a-1)*e,r=t.select().from(H);s.status&&(r=r.where(eq(H.status,s.status))),s.plan&&(r=r.where(eq(H.plan,s.plan))),s.search&&(r=r.where(like(H.name,`%${s.search}%`)));let l=await r.orderBy(desc(H.createdAt)).limit(e).offset(i$1),c=t.select().from(H);s.status&&(c=c.where(eq(H.status,s.status))),s.plan&&(c=c.where(eq(H.plan,s.plan))),s.search&&(c=c.where(like(H.name,`%${s.search}%`)));let w=(await c).length;return {items:l.map(d=>({id:d.id,name:d.name,slug:d.slug,status:d.status,plan:d.plan,maxUsers:d.maxUsers,settings:d.settings?JSON.parse(d.settings):null,createdAt:d.createdAt,updatedAt:d.updatedAt})),total:w,page:a,pageSize:e}}async function R(a){let s=await(await i()).select().from(H).where(eq(H.slug,a));if(s.length===0)return null;let t=s[0];return {id:t.id,name:t.name,slug:t.slug,status:t.status,plan:t.plan,maxUsers:t.maxUsers,settings:t.settings?JSON.parse(t.settings):null,createdAt:t.createdAt,updatedAt:t.updatedAt}}async function J(a){let s=await(await i()).select().from(H).where(eq(H.id,a));if(s.length===0)return null;let t=s[0];return {id:t.id,name:t.name,slug:t.slug,status:t.status,plan:t.plan,maxUsers:t.maxUsers,settings:t.settings?JSON.parse(t.settings):null,createdAt:t.createdAt,updatedAt:t.updatedAt}}async function Q(a){let e=await i();if((await e.select().from(H).where(eq(H.slug,a.slug))).length>0)throw new b(`Tenant with slug '${a.slug}' already exists`);let t=new Date().toISOString(),r=(await e.insert(H).values({name:a.name,slug:a.slug,status:"trial",plan:a.plan,maxUsers:a.maxUsers,settings:a.settings?JSON.stringify(a.settings):null,createdAt:t,updatedAt:t}).returning())[0];return g.info({tenantId:r.id,slug:r.slug},"Tenant created"),{id:r.id,name:r.name,slug:r.slug,status:r.status,plan:r.plan,maxUsers:r.maxUsers,settings:r.settings?JSON.parse(r.settings):null,createdAt:r.createdAt,updatedAt:r.updatedAt}}async function P(a,e){let s=await i();if((await s.select().from(H).where(eq(H.id,a))).length===0)return null;let i$1={updatedAt:new Date().toISOString()};e.name!==void 0&&(i$1.name=e.name),e.status!==void 0&&e.status!==null&&(i$1.status=e.status),e.plan!==void 0&&e.plan!==null&&(i$1.plan=e.plan),e.maxUsers!==void 0&&e.maxUsers!==null&&(i$1.maxUsers=e.maxUsers),e.settings!==void 0&&(i$1.settings=e.settings?JSON.stringify(e.settings):null),e.name!==void 0&&(i$1.name=e.name),e.status!==void 0&&e.status!==null&&(i$1.status=e.status),e.plan!==void 0&&e.plan!==null&&(i$1.plan=e.plan),e.maxUsers!==void 0&&e.maxUsers!==null&&(i$1.maxUsers=e.maxUsers),e.name!==void 0&&(i$1.name=e.name),e.status!==void 0&&e.status!==null&&(i$1.status=e.status),e.plan!==void 0&&e.plan!==null&&(i$1.plan=e.plan),e.maxUsers!==void 0&&e.maxUsers!==null&&(i$1.maxUsers=e.maxUsers),e.settings!==void 0&&(i$1.settings=e.settings?JSON.stringify(e.settings):null);let r=await s.update(H).set(i$1).where(eq(H.id,a)).returning();if(r.length===0)return null;let l=r[0];return g.info({tenantId:l.id,slug:l.slug},"Tenant updated"),{id:l.id,name:l.name,slug:l.slug,status:l.status,plan:l.plan,maxUsers:l.maxUsers,settings:l.settings?JSON.parse(l.settings):null,createdAt:l.createdAt,updatedAt:l.updatedAt}}async function D(a){return (await(await i()).delete(H).where(eq(H.id,a)).returning()).length>0?(g.info({tenantId:a},"Tenant deleted"),true):false}export{Q as createTenant,D as deleteTenant,J as getTenantById,R as getTenantBySlug,k as listTenants,N as seedTenantsIfEmpty,P as updateTenant};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import {a}from'./chunk-UMAQLNPE.js';import {j}from'./chunk-OYCBNRMK.js';import'./chunk-27SIJSPF.js';import'./chunk-5J6HXUF6.js';a();async function O(){let e=await j();if(!e||!("execute"in e))throw new Error("Test database client not available");let t=`
|
|
2
2
|
CREATE TABLE IF NOT EXISTS todos (
|
|
3
3
|
id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
|
|
4
4
|
title TEXT NOT NULL,
|
|
@@ -181,4 +181,85 @@ import {V,S}from'./chunk-YY6FRMAQ.js';import'./chunk-QBHAPWIA.js';import'./chunk
|
|
|
181
181
|
created_at INTEGER DEFAULT (unixepoch() * 1000) NOT NULL,
|
|
182
182
|
updated_at INTEGER DEFAULT (unixepoch() * 1000) NOT NULL
|
|
183
183
|
);
|
|
184
|
-
|
|
184
|
+
|
|
185
|
+
CREATE TABLE IF NOT EXISTS developers (
|
|
186
|
+
id TEXT PRIMARY KEY NOT NULL,
|
|
187
|
+
username TEXT NOT NULL UNIQUE,
|
|
188
|
+
email TEXT NOT NULL UNIQUE,
|
|
189
|
+
password_hash TEXT NOT NULL,
|
|
190
|
+
role TEXT DEFAULT 'developer' NOT NULL,
|
|
191
|
+
api_key TEXT NOT NULL UNIQUE,
|
|
192
|
+
created_at INTEGER DEFAULT (unixepoch() * 1000) NOT NULL,
|
|
193
|
+
updated_at INTEGER DEFAULT (unixepoch() * 1000) NOT NULL
|
|
194
|
+
);
|
|
195
|
+
|
|
196
|
+
CREATE TABLE IF NOT EXISTS plugins (
|
|
197
|
+
id TEXT PRIMARY KEY NOT NULL,
|
|
198
|
+
name TEXT NOT NULL,
|
|
199
|
+
slug TEXT NOT NULL UNIQUE,
|
|
200
|
+
description TEXT NOT NULL DEFAULT '',
|
|
201
|
+
readme TEXT,
|
|
202
|
+
author_id TEXT NOT NULL,
|
|
203
|
+
author_name TEXT NOT NULL,
|
|
204
|
+
repository_url TEXT,
|
|
205
|
+
homepage_url TEXT,
|
|
206
|
+
npm_package TEXT,
|
|
207
|
+
license TEXT,
|
|
208
|
+
version TEXT NOT NULL DEFAULT '0.0.1',
|
|
209
|
+
status TEXT NOT NULL DEFAULT 'pending',
|
|
210
|
+
download_count INTEGER NOT NULL DEFAULT 0,
|
|
211
|
+
view_count INTEGER NOT NULL DEFAULT 0,
|
|
212
|
+
featured INTEGER NOT NULL DEFAULT 0,
|
|
213
|
+
screenshot_url TEXT,
|
|
214
|
+
site_urls TEXT,
|
|
215
|
+
tags TEXT,
|
|
216
|
+
commands TEXT,
|
|
217
|
+
reject_reason TEXT,
|
|
218
|
+
created_at INTEGER DEFAULT (unixepoch() * 1000) NOT NULL,
|
|
219
|
+
updated_at INTEGER DEFAULT (unixepoch() * 1000) NOT NULL
|
|
220
|
+
);
|
|
221
|
+
|
|
222
|
+
CREATE TABLE IF NOT EXISTS plugin_versions (
|
|
223
|
+
id TEXT PRIMARY KEY NOT NULL,
|
|
224
|
+
plugin_id TEXT NOT NULL,
|
|
225
|
+
version TEXT NOT NULL,
|
|
226
|
+
changelog TEXT,
|
|
227
|
+
package_url TEXT,
|
|
228
|
+
file_size INTEGER,
|
|
229
|
+
checksum TEXT,
|
|
230
|
+
status TEXT NOT NULL DEFAULT 'pending',
|
|
231
|
+
published_at INTEGER DEFAULT (unixepoch() * 1000) NOT NULL,
|
|
232
|
+
FOREIGN KEY (plugin_id) REFERENCES plugins(id) ON DELETE CASCADE,
|
|
233
|
+
UNIQUE(plugin_id, version)
|
|
234
|
+
);
|
|
235
|
+
|
|
236
|
+
CREATE TABLE IF NOT EXISTS plugin_reviews (
|
|
237
|
+
id TEXT PRIMARY KEY NOT NULL,
|
|
238
|
+
plugin_id TEXT NOT NULL,
|
|
239
|
+
user_id TEXT NOT NULL,
|
|
240
|
+
user_name TEXT NOT NULL,
|
|
241
|
+
rating INTEGER NOT NULL,
|
|
242
|
+
title TEXT,
|
|
243
|
+
content TEXT,
|
|
244
|
+
created_at INTEGER DEFAULT (unixepoch() * 1000) NOT NULL,
|
|
245
|
+
FOREIGN KEY (plugin_id) REFERENCES plugins(id) ON DELETE CASCADE,
|
|
246
|
+
UNIQUE(plugin_id, user_id)
|
|
247
|
+
);
|
|
248
|
+
|
|
249
|
+
CREATE TABLE IF NOT EXISTS plugin_categories (
|
|
250
|
+
id TEXT PRIMARY KEY NOT NULL,
|
|
251
|
+
name TEXT NOT NULL UNIQUE,
|
|
252
|
+
slug TEXT NOT NULL UNIQUE,
|
|
253
|
+
description TEXT,
|
|
254
|
+
icon TEXT,
|
|
255
|
+
sort_order INTEGER NOT NULL DEFAULT 0
|
|
256
|
+
);
|
|
257
|
+
|
|
258
|
+
CREATE TABLE IF NOT EXISTS plugin_category_mappings (
|
|
259
|
+
plugin_id TEXT NOT NULL,
|
|
260
|
+
category_id TEXT NOT NULL,
|
|
261
|
+
FOREIGN KEY (plugin_id) REFERENCES plugins(id) ON DELETE CASCADE,
|
|
262
|
+
FOREIGN KEY (category_id) REFERENCES plugin_categories(id) ON DELETE CASCADE,
|
|
263
|
+
UNIQUE(plugin_id, category_id)
|
|
264
|
+
);
|
|
265
|
+
`.split(";").filter(E=>E.trim());for(let E of t)if(E.trim())try{await e.execute(E);}catch{}await l(e);}async function l(e){let s=[{id:"role_super_admin",code:"super_admin",name:"\u8D85\u7EA7\u7BA1\u7406\u5458",label:"\u8D85\u7EA7\u7BA1\u7406\u5458",is_system:1,sort_order:1},{id:"role_admin",code:"admin",name:"\u7BA1\u7406\u5458",label:"\u7BA1\u7406\u5458",is_system:1,sort_order:2},{id:"role_user",code:"user",name:"\u666E\u901A\u7528\u6237",label:"\u666E\u901A\u7528\u6237",is_system:0,sort_order:3},{id:"role_customer_service",code:"customer_service",name:"\u5BA2\u670D\u4EBA\u5458",label:"\u5BA2\u670D",is_system:0,sort_order:4}];for(let T of s)try{await e.execute({sql:"INSERT OR IGNORE INTO roles (id, code, name, label, is_system, is_active, sort_order, created_at, updated_at) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)",args:[T.id,T.code,T.name,T.label,T.is_system,1,T.sort_order,Date.now(),Date.now()]});}catch{}let t=[{id:"perm_user_view",code:"user:view",name:"\u67E5\u770B\u7528\u6237",label:"\u67E5\u770B\u7528\u6237",category:"user"},{id:"perm_user_create",code:"user:create",name:"\u521B\u5EFA\u7528\u6237",label:"\u521B\u5EFA\u7528\u6237",category:"user"},{id:"perm_user_update",code:"user:update",name:"\u66F4\u65B0\u7528\u6237",label:"\u66F4\u65B0\u7528\u6237",category:"user"},{id:"perm_user_delete",code:"user:delete",name:"\u5220\u9664\u7528\u6237",label:"\u5220\u9664\u7528\u6237",category:"user"}],E=[{id:"perm_content_view",code:"content:view",name:"\u67E5\u770B\u5185\u5BB9",label:"\u67E5\u770B\u5185\u5BB9",category:"content"},{id:"perm_content_create",code:"content:create",name:"\u521B\u5EFA\u5185\u5BB9",label:"\u521B\u5EFA\u5185\u5BB9",category:"content"},{id:"perm_content_update",code:"content:update",name:"\u66F4\u65B0\u5185\u5BB9",label:"\u66F4\u65B0\u5185\u5BB9",category:"content"},{id:"perm_content_delete",code:"content:delete",name:"\u5220\u9664\u5185\u5BB9",label:"\u5220\u9664\u5185\u5BB9",category:"content"}],a=[{id:"perm_system_settings",code:"system:settings",name:"\u7CFB\u7EDF\u8BBE\u7F6E",label:"\u7CFB\u7EDF\u8BBE\u7F6E",category:"system"},{id:"perm_system_logs",code:"system:logs",name:"\u67E5\u770B\u65E5\u5FD7",label:"\u67E5\u770B\u65E5\u5FD7",category:"system"},{id:"perm_system_backup",code:"system:backup",name:"\u7CFB\u7EDF\u5907\u4EFD",label:"\u7CFB\u7EDF\u5907\u4EFD",category:"system"}],o=[{id:"perm_order_view",code:"order:view",name:"\u67E5\u770B\u8BA2\u5355",label:"\u67E5\u770B\u8BA2\u5355",category:"order"},{id:"perm_order_create",code:"order:create",name:"\u521B\u5EFA\u8BA2\u5355",label:"\u521B\u5EFA\u8BA2\u5355",category:"order"},{id:"perm_order_edit",code:"order:edit",name:"\u7F16\u8F91\u8BA2\u5355",label:"\u7F16\u8F91\u8BA2\u5355",category:"order"},{id:"perm_order_delete",code:"order:delete",name:"\u5220\u9664\u8BA2\u5355",label:"\u5220\u9664\u8BA2\u5355",category:"order"},{id:"perm_order_process",code:"order:process",name:"\u5904\u7406\u8BA2\u5355",label:"\u5904\u7406\u8BA2\u5355",category:"order"}],N=[{id:"perm_ticket_view",code:"ticket:view",name:"\u67E5\u770B\u5DE5\u5355",label:"\u67E5\u770B\u5DE5\u5355",category:"ticket"},{id:"perm_ticket_create",code:"ticket:create",name:"\u521B\u5EFA\u5DE5\u5355",label:"\u521B\u5EFA\u5DE5\u5355",category:"ticket"},{id:"perm_ticket_edit",code:"ticket:edit",name:"\u7F16\u8F91\u5DE5\u5355",label:"\u7F16\u8F91\u5DE5\u5355",category:"ticket"},{id:"perm_ticket_delete",code:"ticket:delete",name:"\u5220\u9664\u5DE5\u5355",label:"\u5220\u9664\u5DE5\u5355",category:"ticket"},{id:"perm_ticket_reply",code:"ticket:reply",name:"\u56DE\u590D\u5DE5\u5355",label:"\u56DE\u590D\u5DE5\u5355",category:"ticket"},{id:"perm_ticket_close",code:"ticket:close",name:"\u5173\u95ED\u5DE5\u5355",label:"\u5173\u95ED\u5DE5\u5355",category:"ticket"}],d=[{id:"perm_data_export",code:"data:export",name:"\u5BFC\u51FA\u6570\u636E",label:"\u5BFC\u51FA\u6570\u636E",category:"data"},{id:"perm_data_import",code:"data:import",name:"\u5BFC\u5165\u6570\u636E",label:"\u5BFC\u5165\u6570\u636E",category:"data"}],L=[{id:"perm_dispute_view",code:"dispute:view",name:"\u67E5\u770B\u4E89\u8BAE",label:"\u67E5\u770B\u4E89\u8BAE",category:"dispute"},{id:"perm_dispute_create",code:"dispute:create",name:"\u521B\u5EFA\u4E89\u8BAE",label:"\u521B\u5EFA\u4E89\u8BAE",category:"dispute"},{id:"perm_dispute_edit",code:"dispute:edit",name:"\u7F16\u8F91\u4E89\u8BAE",label:"\u7F16\u8F91\u4E89\u8BAE",category:"dispute"},{id:"perm_dispute_delete",code:"dispute:delete",name:"\u5220\u9664\u4E89\u8BAE",label:"\u5220\u9664\u4E89\u8BAE",category:"dispute"},{id:"perm_dispute_resolve",code:"dispute:resolve",name:"\u89E3\u51B3\u4E89\u8BAE",label:"\u89E3\u51B3\u4E89\u8BAE",category:"dispute"}],i=[...t,...E,...a,...o,...N,...d,...L];for(let T of i)try{await e.execute({sql:"INSERT OR IGNORE INTO permissions (id, code, name, label, category, is_active, sort_order, created_at, updated_at) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)",args:[T.id,T.code,T.name,T.label,T.category,1,0,Date.now(),Date.now()]});}catch{}for(let T of i)try{await e.execute({sql:"INSERT OR IGNORE INTO role_permissions (role_id, permission_id, created_at) VALUES (?, ?, ?)",args:["role_super_admin",T.id,Date.now()]});}catch{}for(let T of i)if(T.code!=="system:settings")try{await e.execute({sql:"INSERT OR IGNORE INTO role_permissions (role_id, permission_id, created_at) VALUES (?, ?, ?)",args:["role_admin",T.id,Date.now()]});}catch{}let c=["perm_user_view","perm_content_view","perm_order_view","perm_order_create","perm_order_edit","perm_order_delete","perm_order_process","perm_ticket_view","perm_ticket_create","perm_ticket_edit","perm_ticket_delete","perm_ticket_reply","perm_ticket_close","perm_dispute_view","perm_dispute_create","perm_dispute_edit","perm_dispute_delete","perm_dispute_resolve"];for(let T of c)try{await e.execute({sql:"INSERT OR IGNORE INTO role_permissions (role_id, permission_id, created_at) VALUES (?, ?, ?)",args:["role_customer_service",T,Date.now()]});}catch{}let _=[{userId:"super-admin-1",roleId:"role_super_admin"},{userId:"customer-service-1",roleId:"role_customer_service"},{userId:"user-1",roleId:"role_user"}];for(let T of _)try{await e.execute({sql:"INSERT OR IGNORE INTO user_roles (id, user_id, role_id, is_active, assigned_at) VALUES (?, ?, ?, ?, ?)",args:[`ur_${T.userId}`,T.userId,T.roleId,1,Date.now()]});}catch{}let n=["perm_content_view","perm_order_view"];for(let T of n)try{await e.execute({sql:"INSERT OR IGNORE INTO role_permissions (role_id, permission_id, created_at) VALUES (?, ?, ?)",args:["role_user",T,Date.now()]});}catch{}}async function m(){let e=await j();if(e&&"execute"in e){try{await e.execute("DELETE FROM todo_attachments");}catch{}await e.execute("DELETE FROM todos"),await e.execute("DELETE FROM notifications"),await e.execute("DELETE FROM permission_routes"),await e.execute("DELETE FROM permission_audit_logs"),await e.execute("DELETE FROM role_permissions"),await e.execute("DELETE FROM user_roles"),await e.execute("DELETE FROM permissions"),await e.execute("DELETE FROM roles"),await e.execute("DELETE FROM routes"),await e.execute("DELETE FROM ticket_replies"),await e.execute("DELETE FROM tickets"),await e.execute("DELETE FROM orders"),await e.execute("DELETE FROM disputes"),await e.execute("DELETE FROM contents");try{await e.execute("DELETE FROM plugin_category_mappings"),await e.execute("DELETE FROM plugin_reviews"),await e.execute("DELETE FROM plugin_versions"),await e.execute("DELETE FROM plugins"),await e.execute("DELETE FROM plugin_categories"),await e.execute("DELETE FROM developers");}catch{}}}export{m as cleanupTestDatabase,O as setupTestDatabase};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export{h as closeTicket,d as createTicket,f as deleteTicket,c as getTicketById,b as getTickets,g as replyTicket,a as seedTicketsIfEmpty,e as updateTicket}from'./chunk-JHNYLNG7.js';import'./chunk-I6OBDFDU.js';import'./chunk-FIY4CGJJ.js';import'./chunk-JCPOP4XL.js';import'./chunk-UMAQLNPE.js';import'./chunk-OYCBNRMK.js';import'./chunk-27SIJSPF.js';import'./chunk-5J6HXUF6.js';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export{l as createTodo,r as deleteAttachment,n as deleteTodo,k as getTodo,q as getTodoWithAttachments,p as listAttachments,j as listTodos,i as seedTodosIfEmpty,m as updateTodo,o as uploadAttachment}from'./chunk-OU5IGVVO.js';import'./chunk-FIY4CGJJ.js';import'./chunk-JCPOP4XL.js';import'./chunk-UMAQLNPE.js';import'./chunk-OYCBNRMK.js';import'./chunk-27SIJSPF.js';import'./chunk-5J6HXUF6.js';
|
|
@@ -15,8 +15,8 @@ export const DisputesPage: FC = () => {
|
|
|
15
15
|
setLoading(true)
|
|
16
16
|
try {
|
|
17
17
|
const response = await fetch('/api/merchant/disputes')
|
|
18
|
-
const result = await response.json()
|
|
19
|
-
if (result.success) {
|
|
18
|
+
const result = (await response.json()) as { success?: boolean; data?: Dispute[] }
|
|
19
|
+
if (result.success === true && result.data) {
|
|
20
20
|
setDisputes(result.data)
|
|
21
21
|
}
|
|
22
22
|
} catch (error) {
|
|
@@ -31,7 +31,7 @@ export const DisputesPage: FC = () => {
|
|
|
31
31
|
setShowModal(true)
|
|
32
32
|
}
|
|
33
33
|
|
|
34
|
-
const handleResolve = async (disputeId:
|
|
34
|
+
const handleResolve = async (disputeId: string) => {
|
|
35
35
|
try {
|
|
36
36
|
await fetch(`/api/merchant/disputes/${disputeId}/resolve`, {
|
|
37
37
|
method: 'POST',
|
|
@@ -42,7 +42,7 @@ export const DisputesPage: FC = () => {
|
|
|
42
42
|
}
|
|
43
43
|
}
|
|
44
44
|
|
|
45
|
-
const handleClose = async (disputeId:
|
|
45
|
+
const handleClose = async (disputeId: string) => {
|
|
46
46
|
try {
|
|
47
47
|
await fetch(`/api/merchant/disputes/${disputeId}/close`, {
|
|
48
48
|
method: 'POST',
|
|
@@ -59,10 +59,10 @@ export const DisputesPage: FC = () => {
|
|
|
59
59
|
|
|
60
60
|
const getStatusColor = (status: DisputeStatus): string => {
|
|
61
61
|
const colors: Record<DisputeStatus, string> = {
|
|
62
|
-
|
|
62
|
+
pending: 'blue',
|
|
63
63
|
investigating: 'orange',
|
|
64
64
|
resolved: 'green',
|
|
65
|
-
|
|
65
|
+
rejected: 'red',
|
|
66
66
|
}
|
|
67
67
|
return colors[status] || 'default'
|
|
68
68
|
}
|
|
@@ -74,9 +74,9 @@ export const DisputesPage: FC = () => {
|
|
|
74
74
|
key: 'orderId',
|
|
75
75
|
},
|
|
76
76
|
{
|
|
77
|
-
title: '
|
|
78
|
-
dataIndex: '
|
|
79
|
-
key: '
|
|
77
|
+
title: 'Type',
|
|
78
|
+
dataIndex: 'type',
|
|
79
|
+
key: 'type',
|
|
80
80
|
},
|
|
81
81
|
{
|
|
82
82
|
title: 'Status',
|
|
@@ -98,7 +98,7 @@ export const DisputesPage: FC = () => {
|
|
|
98
98
|
<Button type="link" icon={<EyeOutlined />} onClick={() => handleView(record)}>
|
|
99
99
|
View
|
|
100
100
|
</Button>
|
|
101
|
-
{record.status === '
|
|
101
|
+
{record.status === 'pending' && (
|
|
102
102
|
<>
|
|
103
103
|
<Button type="link" icon={<CheckOutlined />} onClick={() => handleResolve(record.id)}>
|
|
104
104
|
Resolve
|
|
@@ -128,7 +128,7 @@ export const DisputesPage: FC = () => {
|
|
|
128
128
|
<h3>Dispute Details</h3>
|
|
129
129
|
<Descriptions bordered>
|
|
130
130
|
<Descriptions.Item label="Order ID">{selectedDispute.orderId}</Descriptions.Item>
|
|
131
|
-
<Descriptions.Item label="
|
|
131
|
+
<Descriptions.Item label="Type">{selectedDispute.type}</Descriptions.Item>
|
|
132
132
|
<Descriptions.Item label="Status">
|
|
133
133
|
<Tag color={getStatusColor(selectedDispute.status)}>{selectedDispute.status}</Tag>
|
|
134
134
|
</Descriptions.Item>
|
|
@@ -16,8 +16,8 @@ export const OrdersPage: FC = () => {
|
|
|
16
16
|
setLoading(true)
|
|
17
17
|
try {
|
|
18
18
|
const response = await fetch('/api/merchant/orders')
|
|
19
|
-
const result = await response.json()
|
|
20
|
-
if (result.success) {
|
|
19
|
+
const result = (await response.json()) as { success?: boolean; data?: Order[] }
|
|
20
|
+
if (result.success === true && result.data) {
|
|
21
21
|
setOrders(result.data)
|
|
22
22
|
}
|
|
23
23
|
} catch (error) {
|
|
@@ -31,7 +31,8 @@ export const OrdersPage: FC = () => {
|
|
|
31
31
|
setStatusFilter(value)
|
|
32
32
|
}
|
|
33
33
|
|
|
34
|
-
|
|
34
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any -- Ant Design RangePicker types are complex
|
|
35
|
+
const handleDateRangeChange = (dates: any) => {
|
|
35
36
|
setDateRange(dates)
|
|
36
37
|
}
|
|
37
38
|
|
|
@@ -14,8 +14,8 @@ export const ProductsPage: FC = () => {
|
|
|
14
14
|
setLoading(true)
|
|
15
15
|
try {
|
|
16
16
|
const response = await fetch('/api/merchant/products')
|
|
17
|
-
const result = await response.json()
|
|
18
|
-
if (result.success) {
|
|
17
|
+
const result = (await response.json()) as { success?: boolean; data?: Product[] }
|
|
18
|
+
if (result.success === true && result.data) {
|
|
19
19
|
setProducts(result.data)
|
|
20
20
|
}
|
|
21
21
|
} catch (error) {
|
|
@@ -13,6 +13,8 @@ interface MerchantState {
|
|
|
13
13
|
stats: MerchantStats | null
|
|
14
14
|
loading: boolean
|
|
15
15
|
error: string | null
|
|
16
|
+
startLoading: (message?: string) => void
|
|
17
|
+
stopLoading: () => void
|
|
16
18
|
checkAuth: () => Promise<void>
|
|
17
19
|
login: (username: string, password: string) => Promise<void>
|
|
18
20
|
logout: () => void
|
|
@@ -28,12 +30,15 @@ export const useMerchantStore = create<MerchantState>(set => ({
|
|
|
28
30
|
loading: false,
|
|
29
31
|
error: null,
|
|
30
32
|
|
|
33
|
+
startLoading: (_message?: string) => set({ loading: true }),
|
|
34
|
+
stopLoading: () => set({ loading: false }),
|
|
35
|
+
|
|
31
36
|
checkAuth: async () => {
|
|
32
37
|
set({ loading: true, error: null })
|
|
33
38
|
try {
|
|
34
39
|
const response = await fetch('/api/merchant/me')
|
|
35
|
-
const result = await response.json()
|
|
36
|
-
if (result.success) {
|
|
40
|
+
const result = (await response.json()) as { success?: boolean; data?: User }
|
|
41
|
+
if (result.success === true && result.data) {
|
|
37
42
|
set({ user: result.data, isAuthenticated: true })
|
|
38
43
|
} else {
|
|
39
44
|
set({ user: null, isAuthenticated: false })
|
|
@@ -56,8 +61,8 @@ export const useMerchantStore = create<MerchantState>(set => ({
|
|
|
56
61
|
},
|
|
57
62
|
body: JSON.stringify({ username, password }),
|
|
58
63
|
})
|
|
59
|
-
const result = await response.json()
|
|
60
|
-
if (result.success) {
|
|
64
|
+
const result = (await response.json()) as { success?: boolean; data?: User; error?: string }
|
|
65
|
+
if (result.success === true && result.data) {
|
|
61
66
|
set({ user: result.data, isAuthenticated: true })
|
|
62
67
|
} else {
|
|
63
68
|
set({ error: result.error || 'Login failed' })
|
|
@@ -78,8 +83,8 @@ export const useMerchantStore = create<MerchantState>(set => ({
|
|
|
78
83
|
set({ loading: true, error: null })
|
|
79
84
|
try {
|
|
80
85
|
const response = await fetch('/api/merchant/stats')
|
|
81
|
-
const result = await response.json()
|
|
82
|
-
if (result.success) {
|
|
86
|
+
const result = (await response.json()) as { success?: boolean; data?: MerchantStats }
|
|
87
|
+
if (result.success === true && result.data) {
|
|
83
88
|
set({ stats: result.data })
|
|
84
89
|
}
|
|
85
90
|
} catch (error) {
|