moonhead 1.0.0

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.
Files changed (631) hide show
  1. package/README.md +32 -0
  2. package/dist/components/layout/app-header.d.ts +1 -0
  3. package/dist/components/layout/app-header.js +1 -0
  4. package/dist/components/layout/app-sidebar.d.ts +9 -0
  5. package/dist/components/layout/app-sidebar.js +1 -0
  6. package/dist/components/layout/brand-logo.d.ts +2 -0
  7. package/dist/components/layout/brand-logo.js +1 -0
  8. package/dist/components/layout/user-menu.d.ts +6 -0
  9. package/dist/components/layout/user-menu.js +1 -0
  10. package/dist/components/ui/action-form.d.ts +10 -0
  11. package/dist/components/ui/action-form.js +1 -0
  12. package/dist/components/ui/alert-dialog.d.ts +14 -0
  13. package/dist/components/ui/alert-dialog.js +1 -0
  14. package/dist/components/ui/alert.d.ts +12 -0
  15. package/dist/components/ui/alert.js +1 -0
  16. package/dist/components/ui/avatar.d.ts +12 -0
  17. package/dist/components/ui/avatar.js +1 -0
  18. package/dist/components/ui/badge.d.ts +2 -0
  19. package/dist/components/ui/badge.js +1 -0
  20. package/dist/components/ui/button.d.ts +12 -0
  21. package/dist/components/ui/button.js +1 -0
  22. package/dist/components/ui/card.d.ts +2 -0
  23. package/dist/components/ui/card.js +1 -0
  24. package/dist/components/ui/checkbox.d.ts +5 -0
  25. package/dist/components/ui/checkbox.js +1 -0
  26. package/dist/components/ui/combobox.d.ts +18 -0
  27. package/dist/components/ui/combobox.js +1 -0
  28. package/dist/components/ui/copy-button.d.ts +8 -0
  29. package/dist/components/ui/copy-button.js +1 -0
  30. package/dist/components/ui/country-select.d.ts +12 -0
  31. package/dist/components/ui/country-select.js +1 -0
  32. package/dist/components/ui/data-table.d.ts +11 -0
  33. package/dist/components/ui/data-table.js +1 -0
  34. package/dist/components/ui/date-range-picker.d.ts +25 -0
  35. package/dist/components/ui/date-range-picker.js +1 -0
  36. package/dist/components/ui/dialog.d.ts +19 -0
  37. package/dist/components/ui/dialog.js +1 -0
  38. package/dist/components/ui/drawer.d.ts +24 -0
  39. package/dist/components/ui/drawer.js +1 -0
  40. package/dist/components/ui/dropdown-menu.d.ts +17 -0
  41. package/dist/components/ui/dropdown-menu.js +1 -0
  42. package/dist/components/ui/field.d.ts +7 -0
  43. package/dist/components/ui/field.js +1 -0
  44. package/dist/components/ui/fieldset.d.ts +4 -0
  45. package/dist/components/ui/fieldset.js +1 -0
  46. package/dist/components/ui/form-field.d.ts +17 -0
  47. package/dist/components/ui/form-field.js +1 -0
  48. package/dist/components/ui/form.d.ts +3 -0
  49. package/dist/components/ui/form.js +1 -0
  50. package/dist/components/ui/icon-tile.d.ts +5 -0
  51. package/dist/components/ui/icon-tile.js +1 -0
  52. package/dist/components/ui/identity.d.ts +6 -0
  53. package/dist/components/ui/identity.js +1 -0
  54. package/dist/components/ui/input.d.ts +4 -0
  55. package/dist/components/ui/input.js +1 -0
  56. package/dist/components/ui/number-input.d.ts +19 -0
  57. package/dist/components/ui/number-input.js +1 -0
  58. package/dist/components/ui/otp-field.d.ts +6 -0
  59. package/dist/components/ui/otp-field.js +1 -0
  60. package/dist/components/ui/page-toolbar.d.ts +9 -0
  61. package/dist/components/ui/page-toolbar.js +1 -0
  62. package/dist/components/ui/password-input.d.ts +7 -0
  63. package/dist/components/ui/password-input.js +1 -0
  64. package/dist/components/ui/radio-group.d.ts +5 -0
  65. package/dist/components/ui/radio-group.js +1 -0
  66. package/dist/components/ui/search-input.d.ts +4 -0
  67. package/dist/components/ui/search-input.js +1 -0
  68. package/dist/components/ui/section-card.d.ts +7 -0
  69. package/dist/components/ui/section-card.js +1 -0
  70. package/dist/components/ui/select-field.d.ts +19 -0
  71. package/dist/components/ui/select-field.js +1 -0
  72. package/dist/components/ui/select.d.ts +17 -0
  73. package/dist/components/ui/select.js +1 -0
  74. package/dist/components/ui/sidebar.d.ts +27 -0
  75. package/dist/components/ui/sidebar.js +1 -0
  76. package/dist/components/ui/slider.d.ts +10 -0
  77. package/dist/components/ui/slider.js +1 -0
  78. package/dist/components/ui/sort-button.d.ts +5 -0
  79. package/dist/components/ui/sort-button.js +1 -0
  80. package/dist/components/ui/spinner.d.ts +4 -0
  81. package/dist/components/ui/spinner.js +1 -0
  82. package/dist/components/ui/status-badge.d.ts +11 -0
  83. package/dist/components/ui/status-badge.js +1 -0
  84. package/dist/components/ui/switch-field.d.ts +18 -0
  85. package/dist/components/ui/switch-field.js +1 -0
  86. package/dist/components/ui/switch.d.ts +3 -0
  87. package/dist/components/ui/switch.js +1 -0
  88. package/dist/components/ui/table-pagination.d.ts +9 -0
  89. package/dist/components/ui/table-pagination.js +1 -0
  90. package/dist/components/ui/table.d.ts +18 -0
  91. package/dist/components/ui/table.js +1 -0
  92. package/dist/components/ui/tabs.d.ts +8 -0
  93. package/dist/components/ui/tabs.js +1 -0
  94. package/dist/components/ui/tag-input.d.ts +9 -0
  95. package/dist/components/ui/tag-input.js +1 -0
  96. package/dist/components/ui/text-link.d.ts +10 -0
  97. package/dist/components/ui/text-link.js +1 -0
  98. package/dist/components/ui/textarea.d.ts +2 -0
  99. package/dist/components/ui/textarea.js +1 -0
  100. package/dist/components/ui/toast.d.ts +1 -0
  101. package/dist/components/ui/toast.js +1 -0
  102. package/dist/components/ui/tree.d.ts +32 -0
  103. package/dist/components/ui/tree.js +1 -0
  104. package/dist/db/client.d.ts +8 -0
  105. package/dist/db/client.js +1 -0
  106. package/dist/db/index.d.ts +3 -0
  107. package/dist/db/index.js +1 -0
  108. package/dist/db/logger.d.ts +2 -0
  109. package/dist/db/logger.js +1 -0
  110. package/dist/db/migrations/20260628182304_wonderful_groot/migration.sql +289 -0
  111. package/dist/db/migrations/20260628182304_wonderful_groot/snapshot.json +3750 -0
  112. package/dist/db/migrations/20260630082829_wet_robin_chapel/migration.sql +2 -0
  113. package/dist/db/migrations/20260630082829_wet_robin_chapel/snapshot.json +3791 -0
  114. package/dist/db/migrations/20260702132335_wooden_iron_monger/migration.sql +48 -0
  115. package/dist/db/migrations/20260702132335_wooden_iron_monger/snapshot.json +4407 -0
  116. package/dist/db/migrations/20260702142948_vengeful_rhino/migration.sql +1 -0
  117. package/dist/db/migrations/20260702142948_vengeful_rhino/snapshot.json +4420 -0
  118. package/dist/db/migrations/20260702185813_curved_pyro/migration.sql +16 -0
  119. package/dist/db/migrations/20260702185813_curved_pyro/snapshot.json +4646 -0
  120. package/dist/db/migrations/20260702192041_shiny_franklin_storm/migration.sql +16 -0
  121. package/dist/db/migrations/20260702192041_shiny_franklin_storm/snapshot.json +4872 -0
  122. package/dist/db/migrations/20260704101548_bizarre_namorita/migration.sql +1 -0
  123. package/dist/db/migrations/20260704101548_bizarre_namorita/snapshot.json +4885 -0
  124. package/dist/db/migrations/20260704105911_sleepy_juggernaut/migration.sql +1 -0
  125. package/dist/db/migrations/20260704105911_sleepy_juggernaut/snapshot.json +4898 -0
  126. package/dist/db/migrations/20260704115959_lean_sandman/migration.sql +1 -0
  127. package/dist/db/migrations/20260704115959_lean_sandman/snapshot.json +4885 -0
  128. package/dist/db/migrations/20260707231532_daffy_captain_stacy/migration.sql +10 -0
  129. package/dist/db/migrations/20260707231532_daffy_captain_stacy/snapshot.json +4919 -0
  130. package/dist/db/migrations/20260708190355_spooky_jimmy_woo/migration.sql +3 -0
  131. package/dist/db/migrations/20260708190355_spooky_jimmy_woo/snapshot.json +4970 -0
  132. package/dist/db/migrations/20260711145212_drop_legacy_earning_status/migration.sql +7 -0
  133. package/dist/db/migrations/20260711145212_drop_legacy_earning_status/snapshot.json +4968 -0
  134. package/dist/db/migrations/20260712161249_dashboard_stat_indexes/migration.sql +3 -0
  135. package/dist/db/migrations/20260712161249_dashboard_stat_indexes/snapshot.json +5038 -0
  136. package/dist/db/migrations/20260713013911_add_payout_paid_at/migration.sql +2 -0
  137. package/dist/db/migrations/20260713013911_add_payout_paid_at/snapshot.json +5072 -0
  138. package/dist/db/schema/analytics-outbox.d.ts +145 -0
  139. package/dist/db/schema/analytics-outbox.js +1 -0
  140. package/dist/db/schema/audit-logs.d.ts +204 -0
  141. package/dist/db/schema/audit-logs.js +1 -0
  142. package/dist/db/schema/campaigns.d.ts +180 -0
  143. package/dist/db/schema/campaigns.js +1 -0
  144. package/dist/db/schema/casinos.d.ts +129 -0
  145. package/dist/db/schema/casinos.js +1 -0
  146. package/dist/db/schema/commission-rule-groups.d.ts +84 -0
  147. package/dist/db/schema/commission-rule-groups.js +1 -0
  148. package/dist/db/schema/commission-rules.d.ts +145 -0
  149. package/dist/db/schema/commission-rules.js +1 -0
  150. package/dist/db/schema/commissions.d.ts +242 -0
  151. package/dist/db/schema/commissions.js +1 -0
  152. package/dist/db/schema/conversions.d.ts +302 -0
  153. package/dist/db/schema/conversions.js +1 -0
  154. package/dist/db/schema/deals.d.ts +180 -0
  155. package/dist/db/schema/deals.js +1 -0
  156. package/dist/db/schema/earnings.d.ts +262 -0
  157. package/dist/db/schema/earnings.js +1 -0
  158. package/dist/db/schema/groups.d.ts +214 -0
  159. package/dist/db/schema/groups.js +1 -0
  160. package/dist/db/schema/index.d.ts +18 -0
  161. package/dist/db/schema/index.js +1 -0
  162. package/dist/db/schema/payouts.d.ts +182 -0
  163. package/dist/db/schema/payouts.js +1 -0
  164. package/dist/db/schema/platform-settings.d.ts +84 -0
  165. package/dist/db/schema/platform-settings.js +1 -0
  166. package/dist/db/schema/player-activity.d.ts +159 -0
  167. package/dist/db/schema/player-activity.js +1 -0
  168. package/dist/db/schema/revshare-carryover.d.ts +129 -0
  169. package/dist/db/schema/revshare-carryover.js +1 -0
  170. package/dist/db/schema/sessions.d.ts +213 -0
  171. package/dist/db/schema/sessions.js +1 -0
  172. package/dist/db/schema/table.d.ts +1 -0
  173. package/dist/db/schema/table.js +1 -0
  174. package/dist/db/schema/users.d.ts +609 -0
  175. package/dist/db/schema/users.js +1 -0
  176. package/dist/db/schema/verification-tokens.d.ts +106 -0
  177. package/dist/db/schema/verification-tokens.js +1 -0
  178. package/dist/db/types/branded.d.ts +3 -0
  179. package/dist/db/types/branded.js +0 -0
  180. package/dist/db/types/commission-rules.d.ts +70 -0
  181. package/dist/db/types/commission-rules.js +1 -0
  182. package/dist/db/types/index.d.ts +2 -0
  183. package/dist/db/types/index.js +1 -0
  184. package/dist/emails/admin/support-message.d.ts +39 -0
  185. package/dist/emails/admin/support-message.js +5 -0
  186. package/dist/emails/affiliate/activated.d.ts +33 -0
  187. package/dist/emails/affiliate/activated.js +1 -0
  188. package/dist/emails/affiliate/deal-notice.d.ts +35 -0
  189. package/dist/emails/affiliate/deal-notice.js +1 -0
  190. package/dist/emails/affiliate/invite.d.ts +35 -0
  191. package/dist/emails/affiliate/invite.js +1 -0
  192. package/dist/emails/affiliate/signup-verify.d.ts +35 -0
  193. package/dist/emails/affiliate/signup-verify.js +1 -0
  194. package/dist/emails/auth/password-reset.d.ts +37 -0
  195. package/dist/emails/auth/password-reset.js +1 -0
  196. package/dist/emails/layout.d.ts +10 -0
  197. package/dist/emails/layout.js +1 -0
  198. package/dist/emails/manager/affiliate-activated.d.ts +33 -0
  199. package/dist/emails/manager/affiliate-activated.js +1 -0
  200. package/dist/emails/manager/bulk-affiliates-activated.d.ts +33 -0
  201. package/dist/emails/manager/bulk-affiliates-activated.js +1 -0
  202. package/dist/emails/manager/invite.d.ts +35 -0
  203. package/dist/emails/manager/invite.js +1 -0
  204. package/dist/emails/manager/pending-approval.d.ts +33 -0
  205. package/dist/emails/manager/pending-approval.js +1 -0
  206. package/dist/emails/preview-env.d.ts +2 -0
  207. package/dist/emails/preview-env.js +1 -0
  208. package/dist/features/affiliates/actions.d.ts +60 -0
  209. package/dist/features/affiliates/actions.js +1 -0
  210. package/dist/features/affiliates/activation-email.d.ts +8 -0
  211. package/dist/features/affiliates/activation-email.js +1 -0
  212. package/dist/features/affiliates/bulk-approve.d.ts +2 -0
  213. package/dist/features/affiliates/bulk-approve.js +1 -0
  214. package/dist/features/affiliates/components/affiliate-actions-menu.d.ts +6 -0
  215. package/dist/features/affiliates/components/affiliate-actions-menu.js +1 -0
  216. package/dist/features/affiliates/components/affiliate-create-button.d.ts +1 -0
  217. package/dist/features/affiliates/components/affiliate-create-button.js +1 -0
  218. package/dist/features/affiliates/components/affiliate-detail-tabs.d.ts +6 -0
  219. package/dist/features/affiliates/components/affiliate-detail-tabs.js +1 -0
  220. package/dist/features/affiliates/components/affiliate-dialog.d.ts +11 -0
  221. package/dist/features/affiliates/components/affiliate-dialog.js +1 -0
  222. package/dist/features/affiliates/components/affiliate-profile-fields.d.ts +6 -0
  223. package/dist/features/affiliates/components/affiliate-profile-fields.js +1 -0
  224. package/dist/features/affiliates/components/affiliate-status-badge.d.ts +4 -0
  225. package/dist/features/affiliates/components/affiliate-status-badge.js +1 -0
  226. package/dist/features/affiliates/components/affiliate-status-tabs.d.ts +4 -0
  227. package/dist/features/affiliates/components/affiliate-status-tabs.js +1 -0
  228. package/dist/features/affiliates/components/affiliates-table.d.ts +10 -0
  229. package/dist/features/affiliates/components/affiliates-table.js +1 -0
  230. package/dist/features/affiliates/components/assign-parent-dialog.d.ts +5 -0
  231. package/dist/features/affiliates/components/assign-parent-dialog.js +1 -0
  232. package/dist/features/affiliates/components/detach-affiliate-confirm.d.ts +5 -0
  233. package/dist/features/affiliates/components/detach-affiliate-confirm.js +1 -0
  234. package/dist/features/affiliates/components/reject-affiliate-confirm.d.ts +5 -0
  235. package/dist/features/affiliates/components/reject-affiliate-confirm.js +1 -0
  236. package/dist/features/affiliates/components/sub-affiliate-invite-button.d.ts +3 -0
  237. package/dist/features/affiliates/components/sub-affiliate-invite-button.js +1 -0
  238. package/dist/features/affiliates/invite.d.ts +6 -0
  239. package/dist/features/affiliates/invite.js +1 -0
  240. package/dist/features/affiliates/list-params.d.ts +27 -0
  241. package/dist/features/affiliates/list-params.js +1 -0
  242. package/dist/features/affiliates/pending-notification.d.ts +18 -0
  243. package/dist/features/affiliates/pending-notification.js +1 -0
  244. package/dist/features/affiliates/sub-invite.d.ts +7 -0
  245. package/dist/features/affiliates/sub-invite.js +1 -0
  246. package/dist/features/audit/action-labels.d.ts +15 -0
  247. package/dist/features/audit/action-labels.js +1 -0
  248. package/dist/features/audit/components/audit-log-table.d.ts +5 -0
  249. package/dist/features/audit/components/audit-log-table.js +1 -0
  250. package/dist/features/audit/list-params.d.ts +2 -0
  251. package/dist/features/audit/list-params.js +1 -0
  252. package/dist/features/audit/read.d.ts +27 -0
  253. package/dist/features/audit/read.js +1 -0
  254. package/dist/features/auth/actions.d.ts +33 -0
  255. package/dist/features/auth/actions.js +1 -0
  256. package/dist/features/auth/authorization.d.ts +14 -0
  257. package/dist/features/auth/authorization.js +1 -0
  258. package/dist/features/auth/components/accept-invite-form.d.ts +3 -0
  259. package/dist/features/auth/components/accept-invite-form.js +1 -0
  260. package/dist/features/auth/components/forgot-password-form.d.ts +1 -0
  261. package/dist/features/auth/components/forgot-password-form.js +1 -0
  262. package/dist/features/auth/components/permissions-form.d.ts +5 -0
  263. package/dist/features/auth/components/permissions-form.js +1 -0
  264. package/dist/features/auth/components/reset-password-form.d.ts +3 -0
  265. package/dist/features/auth/components/reset-password-form.js +1 -0
  266. package/dist/features/auth/components/signin-form.d.ts +5 -0
  267. package/dist/features/auth/components/signin-form.js +1 -0
  268. package/dist/features/auth/components/signup-form.d.ts +1 -0
  269. package/dist/features/auth/components/signup-form.js +1 -0
  270. package/dist/features/auth/components/verify-email-form.d.ts +3 -0
  271. package/dist/features/auth/components/verify-email-form.js +1 -0
  272. package/dist/features/auth/password-reset.d.ts +6 -0
  273. package/dist/features/auth/password-reset.js +1 -0
  274. package/dist/features/auth/permissions.d.ts +49 -0
  275. package/dist/features/auth/permissions.js +1 -0
  276. package/dist/features/auth/require.d.ts +3 -0
  277. package/dist/features/auth/require.js +1 -0
  278. package/dist/features/auth/signup-email.d.ts +6 -0
  279. package/dist/features/auth/signup-email.js +1 -0
  280. package/dist/features/campaigns/actions.d.ts +53 -0
  281. package/dist/features/campaigns/actions.js +1 -0
  282. package/dist/features/campaigns/components/campaign-dialog.d.ts +7 -0
  283. package/dist/features/campaigns/components/campaign-dialog.js +1 -0
  284. package/dist/features/campaigns/components/campaign-row-actions.d.ts +8 -0
  285. package/dist/features/campaigns/components/campaign-row-actions.js +1 -0
  286. package/dist/features/campaigns/components/campaign-status-badge.d.ts +6 -0
  287. package/dist/features/campaigns/components/campaign-status-badge.js +1 -0
  288. package/dist/features/campaigns/components/campaign-status-tabs.d.ts +1 -0
  289. package/dist/features/campaigns/components/campaign-status-tabs.js +1 -0
  290. package/dist/features/campaigns/components/campaigns-table.d.ts +7 -0
  291. package/dist/features/campaigns/components/campaigns-table.js +1 -0
  292. package/dist/features/campaigns/components/create-campaign-button.d.ts +5 -0
  293. package/dist/features/campaigns/components/create-campaign-button.js +1 -0
  294. package/dist/features/campaigns/components/sub-id-builder.d.ts +4 -0
  295. package/dist/features/campaigns/components/sub-id-builder.js +1 -0
  296. package/dist/features/campaigns/components/tracking-link-box.d.ts +3 -0
  297. package/dist/features/campaigns/components/tracking-link-box.js +1 -0
  298. package/dist/features/campaigns/components/tracking-link-cell.d.ts +4 -0
  299. package/dist/features/campaigns/components/tracking-link-cell.js +1 -0
  300. package/dist/features/campaigns/components/tracking-link-dialog.d.ts +6 -0
  301. package/dist/features/campaigns/components/tracking-link-dialog.js +1 -0
  302. package/dist/features/campaigns/list-params.d.ts +14 -0
  303. package/dist/features/campaigns/list-params.js +1 -0
  304. package/dist/features/campaigns/tracking-url.d.ts +8 -0
  305. package/dist/features/campaigns/tracking-url.js +1 -0
  306. package/dist/features/casinos/actions.d.ts +39 -0
  307. package/dist/features/casinos/actions.js +1 -0
  308. package/dist/features/casinos/components/casino-create-button.d.ts +1 -0
  309. package/dist/features/casinos/components/casino-create-button.js +1 -0
  310. package/dist/features/casinos/components/casino-dialog.d.ts +11 -0
  311. package/dist/features/casinos/components/casino-dialog.js +1 -0
  312. package/dist/features/casinos/components/casino-form-fields.d.ts +7 -0
  313. package/dist/features/casinos/components/casino-form-fields.js +1 -0
  314. package/dist/features/casinos/components/casino-status-tabs.d.ts +1 -0
  315. package/dist/features/casinos/components/casino-status-tabs.js +1 -0
  316. package/dist/features/casinos/components/casinos-table.d.ts +6 -0
  317. package/dist/features/casinos/components/casinos-table.js +1 -0
  318. package/dist/features/casinos/components/delete-casino-confirm.d.ts +5 -0
  319. package/dist/features/casinos/components/delete-casino-confirm.js +1 -0
  320. package/dist/features/casinos/list-params.d.ts +14 -0
  321. package/dist/features/casinos/list-params.js +1 -0
  322. package/dist/features/commissions/actions.d.ts +76 -0
  323. package/dist/features/commissions/actions.js +1 -0
  324. package/dist/features/commissions/components/casino-bindings-field.d.ts +10 -0
  325. package/dist/features/commissions/components/casino-bindings-field.js +1 -0
  326. package/dist/features/commissions/components/commission-create-button.d.ts +1 -0
  327. package/dist/features/commissions/components/commission-create-button.js +1 -0
  328. package/dist/features/commissions/components/commission-detail-dialog.d.ts +5 -0
  329. package/dist/features/commissions/components/commission-detail-dialog.js +1 -0
  330. package/dist/features/commissions/components/commission-editor.d.ts +8 -0
  331. package/dist/features/commissions/components/commission-editor.js +1 -0
  332. package/dist/features/commissions/components/commission-read-view.d.ts +5 -0
  333. package/dist/features/commissions/components/commission-read-view.js +1 -0
  334. package/dist/features/commissions/components/commission-status-badge.d.ts +4 -0
  335. package/dist/features/commissions/components/commission-status-badge.js +1 -0
  336. package/dist/features/commissions/components/commission-status-tabs.d.ts +1 -0
  337. package/dist/features/commissions/components/commission-status-tabs.js +1 -0
  338. package/dist/features/commissions/components/commissions-table.d.ts +14 -0
  339. package/dist/features/commissions/components/commissions-table.js +1 -0
  340. package/dist/features/commissions/components/delete-commission-confirm.d.ts +5 -0
  341. package/dist/features/commissions/components/delete-commission-confirm.js +1 -0
  342. package/dist/features/commissions/components/duplicate-commission-dialog.d.ts +6 -0
  343. package/dist/features/commissions/components/duplicate-commission-dialog.js +1 -0
  344. package/dist/features/commissions/components/rule-editor/conditions-block.d.ts +9 -0
  345. package/dist/features/commissions/components/rule-editor/conditions-block.js +1 -0
  346. package/dist/features/commissions/components/rule-editor/modifiers-block.d.ts +9 -0
  347. package/dist/features/commissions/components/rule-editor/modifiers-block.js +1 -0
  348. package/dist/features/commissions/components/rule-editor/qualifiers-block.d.ts +9 -0
  349. package/dist/features/commissions/components/rule-editor/qualifiers-block.js +1 -0
  350. package/dist/features/commissions/components/rule-editor/reducer.d.ts +102 -0
  351. package/dist/features/commissions/components/rule-editor/reducer.js +1 -0
  352. package/dist/features/commissions/components/rule-editor/rewards-block.d.ts +9 -0
  353. package/dist/features/commissions/components/rule-editor/rewards-block.js +1 -0
  354. package/dist/features/commissions/components/rule-editor/rule-card.d.ts +10 -0
  355. package/dist/features/commissions/components/rule-editor/rule-card.js +1 -0
  356. package/dist/features/commissions/components/rule-editor/rule-editor.d.ts +7 -0
  357. package/dist/features/commissions/components/rule-editor/rule-editor.js +1 -0
  358. package/dist/features/commissions/components/rule-editor/rule-group-card.d.ts +9 -0
  359. package/dist/features/commissions/components/rule-editor/rule-group-card.js +1 -0
  360. package/dist/features/commissions/components/rule-editor/state.d.ts +21 -0
  361. package/dist/features/commissions/components/rule-editor/state.js +1 -0
  362. package/dist/features/commissions/components/rule-groups-read-view.d.ts +4 -0
  363. package/dist/features/commissions/components/rule-groups-read-view.js +1 -0
  364. package/dist/features/commissions/list-params.d.ts +14 -0
  365. package/dist/features/commissions/list-params.js +1 -0
  366. package/dist/features/commissions/rule-validation.d.ts +173 -0
  367. package/dist/features/commissions/rule-validation.js +1 -0
  368. package/dist/features/dashboard/affiliate-queries.d.ts +14 -0
  369. package/dist/features/dashboard/affiliate-queries.js +1 -0
  370. package/dist/features/dashboard/clickhouse.d.ts +3 -0
  371. package/dist/features/dashboard/clickhouse.js +2 -0
  372. package/dist/features/dashboard/components/affiliate-charts.d.ts +5 -0
  373. package/dist/features/dashboard/components/affiliate-charts.js +1 -0
  374. package/dist/features/dashboard/components/affiliate-stats.d.ts +5 -0
  375. package/dist/features/dashboard/components/affiliate-stats.js +1 -0
  376. package/dist/features/dashboard/components/charts/funnel-chart.d.ts +11 -0
  377. package/dist/features/dashboard/components/charts/funnel-chart.js +1 -0
  378. package/dist/features/dashboard/components/charts/rank-bar-chart.d.ts +10 -0
  379. package/dist/features/dashboard/components/charts/rank-bar-chart.js +1 -0
  380. package/dist/features/dashboard/components/charts/time-series-chart.d.ts +12 -0
  381. package/dist/features/dashboard/components/charts/time-series-chart.js +1 -0
  382. package/dist/features/dashboard/components/charts-grid.d.ts +8 -0
  383. package/dist/features/dashboard/components/charts-grid.js +1 -0
  384. package/dist/features/dashboard/components/dashboard-charts.d.ts +4 -0
  385. package/dist/features/dashboard/components/dashboard-charts.js +1 -0
  386. package/dist/features/dashboard/components/dashboard-period-tabs.d.ts +1 -0
  387. package/dist/features/dashboard/components/dashboard-period-tabs.js +1 -0
  388. package/dist/features/dashboard/components/money-stat-card.d.ts +6 -0
  389. package/dist/features/dashboard/components/money-stat-card.js +1 -0
  390. package/dist/features/dashboard/components/stat-card.d.ts +6 -0
  391. package/dist/features/dashboard/components/stat-card.js +1 -0
  392. package/dist/features/dashboard/components/top-affiliates.d.ts +4 -0
  393. package/dist/features/dashboard/components/top-affiliates.js +1 -0
  394. package/dist/features/dashboard/list-params.d.ts +24 -0
  395. package/dist/features/dashboard/list-params.js +1 -0
  396. package/dist/features/dashboard/queries.d.ts +63 -0
  397. package/dist/features/dashboard/queries.js +1 -0
  398. package/dist/features/dashboard/series.d.ts +32 -0
  399. package/dist/features/dashboard/series.js +1 -0
  400. package/dist/features/deals/actions.d.ts +60 -0
  401. package/dist/features/deals/actions.js +1 -0
  402. package/dist/features/deals/components/affiliate-deals.d.ts +10 -0
  403. package/dist/features/deals/components/affiliate-deals.js +1 -0
  404. package/dist/features/deals/components/assign-deal-button.d.ts +9 -0
  405. package/dist/features/deals/components/assign-deal-button.js +1 -0
  406. package/dist/features/deals/components/deal-dialog.d.ts +19 -0
  407. package/dist/features/deals/components/deal-dialog.js +1 -0
  408. package/dist/features/deals/components/deal-row-actions.d.ts +6 -0
  409. package/dist/features/deals/components/deal-row-actions.js +1 -0
  410. package/dist/features/deals/components/deal-status-badge.d.ts +10 -0
  411. package/dist/features/deals/components/deal-status-badge.js +1 -0
  412. package/dist/features/deals/components/deal-status-tabs.d.ts +1 -0
  413. package/dist/features/deals/components/deal-status-tabs.js +1 -0
  414. package/dist/features/deals/components/delegate-deal-button.d.ts +8 -0
  415. package/dist/features/deals/components/delegate-deal-button.js +1 -0
  416. package/dist/features/deals/deal-assigned-email.d.ts +11 -0
  417. package/dist/features/deals/deal-assigned-email.js +1 -0
  418. package/dist/features/deals/deal-delegated-email.d.ts +13 -0
  419. package/dist/features/deals/deal-delegated-email.js +1 -0
  420. package/dist/features/deals/list-params.d.ts +14 -0
  421. package/dist/features/deals/list-params.js +1 -0
  422. package/dist/features/earnings/components/earnings-balances.d.ts +4 -0
  423. package/dist/features/earnings/components/earnings-balances.js +1 -0
  424. package/dist/features/earnings/components/earnings-ledger.d.ts +5 -0
  425. package/dist/features/earnings/components/earnings-ledger.js +1 -0
  426. package/dist/features/earnings/components/earnings-status-badge.d.ts +4 -0
  427. package/dist/features/earnings/components/earnings-status-badge.js +1 -0
  428. package/dist/features/earnings/components/earnings-status-tabs.d.ts +1 -0
  429. package/dist/features/earnings/components/earnings-status-tabs.js +1 -0
  430. package/dist/features/earnings/components/sub-affiliate-earnings.d.ts +4 -0
  431. package/dist/features/earnings/components/sub-affiliate-earnings.js +1 -0
  432. package/dist/features/earnings/list-params.d.ts +14 -0
  433. package/dist/features/earnings/list-params.js +1 -0
  434. package/dist/features/earnings/queries.d.ts +30 -0
  435. package/dist/features/earnings/queries.js +1 -0
  436. package/dist/features/groups/actions.d.ts +36 -0
  437. package/dist/features/groups/actions.js +1 -0
  438. package/dist/features/groups/components/delete-group-confirm.d.ts +5 -0
  439. package/dist/features/groups/components/delete-group-confirm.js +1 -0
  440. package/dist/features/groups/components/group-create-button.d.ts +1 -0
  441. package/dist/features/groups/components/group-create-button.js +1 -0
  442. package/dist/features/groups/components/group-dialog.d.ts +11 -0
  443. package/dist/features/groups/components/group-dialog.js +1 -0
  444. package/dist/features/groups/components/group-form-fields.d.ts +10 -0
  445. package/dist/features/groups/components/group-form-fields.js +1 -0
  446. package/dist/features/groups/components/group-status-tabs.d.ts +1 -0
  447. package/dist/features/groups/components/group-status-tabs.js +1 -0
  448. package/dist/features/groups/components/groups-table.d.ts +9 -0
  449. package/dist/features/groups/components/groups-table.js +1 -0
  450. package/dist/features/groups/list-params.d.ts +14 -0
  451. package/dist/features/groups/list-params.js +1 -0
  452. package/dist/features/managers/actions.d.ts +43 -0
  453. package/dist/features/managers/actions.js +1 -0
  454. package/dist/features/managers/components/manager-create-button.d.ts +1 -0
  455. package/dist/features/managers/components/manager-create-button.js +1 -0
  456. package/dist/features/managers/components/manager-dialog.d.ts +11 -0
  457. package/dist/features/managers/components/manager-dialog.js +1 -0
  458. package/dist/features/managers/components/manager-permissions-dialog.d.ts +7 -0
  459. package/dist/features/managers/components/manager-permissions-dialog.js +1 -0
  460. package/dist/features/managers/components/manager-profile-fields.d.ts +7 -0
  461. package/dist/features/managers/components/manager-profile-fields.js +1 -0
  462. package/dist/features/managers/components/manager-status-tabs.d.ts +1 -0
  463. package/dist/features/managers/components/manager-status-tabs.js +1 -0
  464. package/dist/features/managers/components/managers-table.d.ts +8 -0
  465. package/dist/features/managers/components/managers-table.js +1 -0
  466. package/dist/features/managers/invite.d.ts +6 -0
  467. package/dist/features/managers/invite.js +1 -0
  468. package/dist/features/managers/list-params.d.ts +14 -0
  469. package/dist/features/managers/list-params.js +1 -0
  470. package/dist/features/payouts/actions.d.ts +12 -0
  471. package/dist/features/payouts/actions.js +1 -0
  472. package/dist/features/payouts/balance.d.ts +2 -0
  473. package/dist/features/payouts/balance.js +1 -0
  474. package/dist/features/payouts/components/my-payouts-table.d.ts +5 -0
  475. package/dist/features/payouts/components/my-payouts-table.js +1 -0
  476. package/dist/features/payouts/components/payout-row-actions.d.ts +5 -0
  477. package/dist/features/payouts/components/payout-row-actions.js +1 -0
  478. package/dist/features/payouts/components/payout-status-badge.d.ts +4 -0
  479. package/dist/features/payouts/components/payout-status-badge.js +1 -0
  480. package/dist/features/payouts/components/payout-status-tabs.d.ts +1 -0
  481. package/dist/features/payouts/components/payout-status-tabs.js +1 -0
  482. package/dist/features/payouts/components/payouts-table.d.ts +6 -0
  483. package/dist/features/payouts/components/payouts-table.js +1 -0
  484. package/dist/features/payouts/components/request-payout-dialog.d.ts +4 -0
  485. package/dist/features/payouts/components/request-payout-dialog.js +1 -0
  486. package/dist/features/payouts/constants.d.ts +2 -0
  487. package/dist/features/payouts/constants.js +1 -0
  488. package/dist/features/payouts/list-params.d.ts +14 -0
  489. package/dist/features/payouts/list-params.js +1 -0
  490. package/dist/features/payouts/my-queries.d.ts +14 -0
  491. package/dist/features/payouts/my-queries.js +1 -0
  492. package/dist/features/payouts/queries.d.ts +14 -0
  493. package/dist/features/payouts/queries.js +1 -0
  494. package/dist/features/postbacks/actions.d.ts +27 -0
  495. package/dist/features/postbacks/actions.js +1 -0
  496. package/dist/features/postbacks/components/integration-dialog.d.ts +6 -0
  497. package/dist/features/postbacks/components/integration-dialog.js +1 -0
  498. package/dist/features/postbacks/components/postback-editor.d.ts +5 -0
  499. package/dist/features/postbacks/components/postback-editor.js +1 -0
  500. package/dist/features/postbacks/components/postbacks-table.d.ts +4 -0
  501. package/dist/features/postbacks/components/postbacks-table.js +1 -0
  502. package/dist/features/settings/actions.d.ts +2 -0
  503. package/dist/features/settings/actions.js +1 -0
  504. package/dist/features/settings/components/affiliate-approval-setting.d.ts +3 -0
  505. package/dist/features/settings/components/affiliate-approval-setting.js +1 -0
  506. package/dist/features/settings/components/manager-totp-setting.d.ts +3 -0
  507. package/dist/features/settings/components/manager-totp-setting.js +1 -0
  508. package/dist/features/support/actions.d.ts +12 -0
  509. package/dist/features/support/actions.js +1 -0
  510. package/dist/features/support/components/support-page.d.ts +4 -0
  511. package/dist/features/support/components/support-page.js +1 -0
  512. package/dist/features/support/email.d.ts +13 -0
  513. package/dist/features/support/email.js +1 -0
  514. package/dist/features/users/actions.d.ts +4 -0
  515. package/dist/features/users/actions.js +1 -0
  516. package/dist/features/users/components/password-section.d.ts +1 -0
  517. package/dist/features/users/components/password-section.js +1 -0
  518. package/dist/features/users/components/preferences-section.d.ts +4 -0
  519. package/dist/features/users/components/preferences-section.js +1 -0
  520. package/dist/features/users/components/settings-tabs.d.ts +1 -0
  521. package/dist/features/users/components/settings-tabs.js +1 -0
  522. package/dist/features/users/components/totp-section.d.ts +4 -0
  523. package/dist/features/users/components/totp-section.js +1 -0
  524. package/dist/features/users/list-params.d.ts +12 -0
  525. package/dist/features/users/list-params.js +1 -0
  526. package/dist/features/users/totp.d.ts +7 -0
  527. package/dist/features/users/totp.js +1 -0
  528. package/dist/i18n/config.d.ts +5 -0
  529. package/dist/i18n/config.js +1 -0
  530. package/dist/i18n/get-locale.d.ts +3 -0
  531. package/dist/i18n/get-locale.js +1 -0
  532. package/dist/i18n/locale.d.ts +2 -0
  533. package/dist/i18n/locale.js +1 -0
  534. package/dist/lib/actions/parse-form.d.ts +3 -0
  535. package/dist/lib/actions/parse-form.js +1 -0
  536. package/dist/lib/actions/state.d.ts +22 -0
  537. package/dist/lib/actions/state.js +0 -0
  538. package/dist/lib/audit/actions.d.ts +9 -0
  539. package/dist/lib/audit/actions.js +1 -0
  540. package/dist/lib/audit/record.d.ts +4 -0
  541. package/dist/lib/audit/record.js +1 -0
  542. package/dist/lib/auth/action.d.ts +45 -0
  543. package/dist/lib/auth/action.js +1 -0
  544. package/dist/lib/auth/config.d.ts +24 -0
  545. package/dist/lib/auth/config.js +1 -0
  546. package/dist/lib/auth/jwt.d.ts +17 -0
  547. package/dist/lib/auth/jwt.js +1 -0
  548. package/dist/lib/auth/password-options.d.ts +6 -0
  549. package/dist/lib/auth/password-options.js +1 -0
  550. package/dist/lib/auth/password.d.ts +3 -0
  551. package/dist/lib/auth/password.js +1 -0
  552. package/dist/lib/auth/session.d.ts +26 -0
  553. package/dist/lib/auth/session.js +1 -0
  554. package/dist/lib/auth/tokens.d.ts +43 -0
  555. package/dist/lib/auth/tokens.js +1 -0
  556. package/dist/lib/auth/totp-challenge.d.ts +4 -0
  557. package/dist/lib/auth/totp-challenge.js +1 -0
  558. package/dist/lib/auth/totp.d.ts +7 -0
  559. package/dist/lib/auth/totp.js +1 -0
  560. package/dist/lib/auth/verification-tokens.d.ts +19 -0
  561. package/dist/lib/auth/verification-tokens.js +1 -0
  562. package/dist/lib/cn.d.ts +2 -0
  563. package/dist/lib/cn.js +1 -0
  564. package/dist/lib/countries.d.ts +18 -0
  565. package/dist/lib/countries.js +1 -0
  566. package/dist/lib/currencies.d.ts +6 -0
  567. package/dist/lib/currencies.js +1 -0
  568. package/dist/lib/data/countries-by-continent.json +257 -0
  569. package/dist/lib/db/errors.d.ts +4 -0
  570. package/dist/lib/db/errors.js +1 -0
  571. package/dist/lib/email/client.d.ts +6 -0
  572. package/dist/lib/email/client.js +1 -0
  573. package/dist/lib/email/env.d.ts +12 -0
  574. package/dist/lib/email/env.js +1 -0
  575. package/dist/lib/email/format.d.ts +5 -0
  576. package/dist/lib/email/format.js +1 -0
  577. package/dist/lib/email/locale.d.ts +3 -0
  578. package/dist/lib/email/locale.js +1 -0
  579. package/dist/lib/email/send.d.ts +12 -0
  580. package/dist/lib/email/send.js +1 -0
  581. package/dist/lib/env.d.ts +20 -0
  582. package/dist/lib/env.js +1 -0
  583. package/dist/lib/errors/codes.d.ts +72 -0
  584. package/dist/lib/errors/codes.js +1 -0
  585. package/dist/lib/errors/server.d.ts +10 -0
  586. package/dist/lib/errors/server.js +1 -0
  587. package/dist/lib/format.d.ts +3 -0
  588. package/dist/lib/format.js +1 -0
  589. package/dist/lib/hooks/use-deferred-dialog.d.ts +11 -0
  590. package/dist/lib/hooks/use-deferred-dialog.js +1 -0
  591. package/dist/lib/hooks/use-form-reset.d.ts +2 -0
  592. package/dist/lib/hooks/use-form-reset.js +1 -0
  593. package/dist/lib/hooks/use-form-toast.d.ts +2 -0
  594. package/dist/lib/hooks/use-form-toast.js +1 -0
  595. package/dist/lib/i18n/format-datetime.d.ts +1 -0
  596. package/dist/lib/i18n/format-datetime.js +1 -0
  597. package/dist/lib/i18n/relative-time.d.ts +1 -0
  598. package/dist/lib/i18n/relative-time.js +1 -0
  599. package/dist/lib/list-params.d.ts +51 -0
  600. package/dist/lib/list-params.js +1 -0
  601. package/dist/lib/money.d.ts +2 -0
  602. package/dist/lib/money.js +1 -0
  603. package/dist/lib/platform-settings.d.ts +5 -0
  604. package/dist/lib/platform-settings.js +1 -0
  605. package/dist/lib/preferences/actions.d.ts +1 -0
  606. package/dist/lib/preferences/actions.js +1 -0
  607. package/dist/lib/preferences/index.d.ts +15 -0
  608. package/dist/lib/preferences/index.js +1 -0
  609. package/dist/lib/preferences/read.d.ts +2 -0
  610. package/dist/lib/preferences/read.js +1 -0
  611. package/dist/lib/slug.d.ts +1 -0
  612. package/dist/lib/slug.js +1 -0
  613. package/dist/lib/toast.d.ts +13 -0
  614. package/dist/lib/toast.js +1 -0
  615. package/dist/lib/tracking-cache.d.ts +2 -0
  616. package/dist/lib/tracking-cache.js +1 -0
  617. package/dist/lib/users.d.ts +12 -0
  618. package/dist/lib/users.js +1 -0
  619. package/dist/lib/validation/zod.d.ts +30 -0
  620. package/dist/lib/validation/zod.js +1 -0
  621. package/dist/messages/de/emails.json +136 -0
  622. package/dist/messages/de/index.json +1104 -0
  623. package/dist/messages/en/emails.json +136 -0
  624. package/dist/messages/en/index.json +1104 -0
  625. package/dist/theme/config.d.ts +8 -0
  626. package/dist/theme/config.js +1 -0
  627. package/dist/theme/get-theme.d.ts +3 -0
  628. package/dist/theme/get-theme.js +1 -0
  629. package/dist/theme/theme.d.ts +2 -0
  630. package/dist/theme/theme.js +1 -0
  631. package/package.json +131 -0
@@ -0,0 +1 @@
1
+ "use client";import{jsx as o,jsxs as f}from"react/jsx-runtime";import{useTranslations as p}from"next-intl";import{useActionState as l}from"react";import{ActionForm as u}from"../../../components/ui/action-form.js";import{Button as c}from"../../../components/ui/button.js";import{FormField as r}from"../../../components/ui/form-field.js";import{PasswordInput as s}from"../../../components/ui/password-input.js";import{resetPasswordAction as w}from"../actions.js";function y({token:a}){const t=p("Auth.ResetPassword"),[i,m,e]=l(async(n,d)=>w(a,n,d),void 0);return f(u,{action:m,actionState:i,className:"flex flex-col gap-4",children:[o(r,{name:"password",label:t("passwordLabel"),children:o(s,{name:"password","aria-required":"true",autoComplete:"new-password"})}),o(r,{name:"confirmPassword",label:t("confirmPasswordLabel"),children:o(s,{name:"confirmPassword","aria-required":"true",autoComplete:"new-password"})}),o(c,{type:"submit",disabled:e,children:t(e?"submitting":"submit")})]})}export{y as ResetPasswordForm};
@@ -0,0 +1,5 @@
1
+ type Stage = "credentials" | "totp";
2
+ export declare function SignInForm({ initialStage, }: {
3
+ initialStage?: Stage;
4
+ }): import("react").JSX.Element;
5
+ export {};
@@ -0,0 +1 @@
1
+ "use client";import{jsx as t,jsxs as a}from"react/jsx-runtime";import{useTranslations as d}from"next-intl";import{startTransition as T,useActionState as f,useEffect as F,useState as y}from"react";import{ActionForm as g}from"../../../components/ui/action-form.js";import{Button as m}from"../../../components/ui/button.js";import{Field as c,FieldDescription as h,FieldError as p,FieldLabel as u}from"../../../components/ui/field.js";import{Input as P}from"../../../components/ui/input.js";import{OTPField as k,OTPFieldGroup as w,OTPFieldInput as n}from"../../../components/ui/otp-field.js";import{PasswordInput as x}from"../../../components/ui/password-input.js";import{TextLink as L}from"../../../components/ui/text-link.js";import{cancelTotpChallengeAction as C,signInAction as D,verifyTotpAction as v}from"../actions.js";function j({initialStage:r="credentials"}){const[s,o]=y(r),[e,i,S]=f(D,void 0);F(()=>{e?.ok&&e.totpRequired&&o("totp")},[e]);const[l,b,A]=f(v,void 0);return F(()=>{l&&!l.ok&&l.fieldErrors?._form&&o("credentials")},[l]),s==="credentials"?t(B,{action:i,state:e,isPending:S}):t(I,{action:b,state:l,isPending:A,onBack:()=>{o("credentials"),T(async()=>{await C()})}})}function B({action:r,state:s,isPending:o}){const e=d("Auth.SignIn"),i=d("Auth.ForgotPassword");return a(g,{action:r,actionState:s,className:"flex flex-col gap-4",children:[a(c,{name:"email",children:[t(u,{children:e("emailLabel")}),t(P,{name:"email",type:"email","aria-required":"true",autoComplete:"email"}),t(p,{})]}),a(c,{name:"password",children:[a("div",{className:"flex items-center justify-between",children:[t(u,{children:e("passwordLabel")}),t(L,{href:"/forgot-password",tone:"muted",className:"text-xs",children:i("link")})]}),t(x,{name:"password","aria-required":"true",autoComplete:"current-password"}),t(p,{})]}),t(m,{type:"submit",disabled:o,children:e(o?"submitting":"submit")})]})}function I({action:r,state:s,isPending:o,onBack:e}){const i=d("Auth.SignIn");return a(g,{action:r,actionState:s,className:"flex flex-col gap-4",children:[a(c,{name:"code",children:[t(u,{children:i("totpCodeLabel")}),t(h,{children:i("totpCodeHelp")}),t(k,{name:"code",length:6,autoComplete:"one-time-code","aria-required":"true",disabled:o,children:a(w,{children:[t(n,{}),t(n,{}),t(n,{}),t(n,{}),t(n,{}),t(n,{})]})}),t(p,{})]}),t(m,{type:"submit",disabled:o,children:i(o?"submitting":"totpSubmit")}),t(m,{type:"button",variant:"ghost",size:"sm",onClick:e,children:i("totpBack")})]})}export{j as SignInForm};
@@ -0,0 +1 @@
1
+ export declare function SignupForm(): import("react").JSX.Element;
@@ -0,0 +1 @@
1
+ "use client";import{jsx as e,jsxs as t}from"react/jsx-runtime";import{useTranslations as n}from"next-intl";import{useActionState as c}from"react";import{ActionForm as f}from"../../../components/ui/action-form.js";import{Button as F}from"../../../components/ui/button.js";import{Checkbox as b}from"../../../components/ui/checkbox.js";import{Field as g,FieldError as x,FieldLabel as w}from"../../../components/ui/field.js";import{FormField as a}from"../../../components/ui/form-field.js";import{Input as m}from"../../../components/ui/input.js";import{PasswordInput as s}from"../../../components/ui/password-input.js";import{TextLink as d}from"../../../components/ui/text-link.js";import{signupAction as N}from"../actions.js";function B(){const r=n("Auth.SignUp"),i=n("Common"),[p,u,l]=c(N,void 0);return t(f,{action:u,actionState:p,className:"flex flex-col gap-4",children:[e(a,{name:"email",label:r("emailLabel"),children:e(m,{name:"email",type:"email","aria-required":"true",autoComplete:"email"})}),t("div",{className:"grid gap-4 sm:grid-cols-2",children:[e(a,{name:"firstName",label:i("firstName"),children:e(m,{name:"firstName",type:"text","aria-required":"true",autoComplete:"given-name"})}),e(a,{name:"lastName",label:i("lastName"),children:e(m,{name:"lastName",type:"text","aria-required":"true",autoComplete:"family-name"})})]}),e(a,{name:"password",label:r("passwordLabel"),children:e(s,{name:"password","aria-required":"true",autoComplete:"new-password"})}),e(a,{name:"confirmPassword",label:r("confirmPasswordLabel"),children:e(s,{name:"confirmPassword","aria-required":"true",autoComplete:"new-password"})}),t(g,{name:"tosAccepted",className:"flex-row items-start gap-2",children:[e(b,{name:"tosAccepted",value:"on","aria-required":"true",className:"mt-0.5"}),t("div",{className:"flex flex-col",children:[e(w,{className:"font-normal text-sm text-muted-foreground",children:r.rich("tosAccept",{terms:o=>e(d,{href:"/legal/terms",target:"_blank",rel:"noreferrer",children:o}),privacy:o=>e(d,{href:"/legal/privacy",target:"_blank",rel:"noreferrer",children:o})})}),e(x,{})]})]}),e(F,{type:"submit",disabled:l,children:r(l?"submitting":"submit")})]})}export{B as SignupForm};
@@ -0,0 +1,3 @@
1
+ export declare function VerifyEmailForm({ token }: {
2
+ token: string;
3
+ }): import("react").JSX.Element;
@@ -0,0 +1 @@
1
+ "use client";import{jsx as o}from"react/jsx-runtime";import{useTranslations as u}from"next-intl";import{startTransition as c,useActionState as l,useEffect as p,useRef as y}from"react";import{ActionForm as d}from"../../../components/ui/action-form.js";import{Button as A}from"../../../components/ui/button.js";import{verifyEmailAction as E}from"../actions.js";function b({token:n}){const i=u("Auth.VerifyEmail"),[t,e,a]=l(async(f,s)=>E(n,f,s),void 0),r=y(!1);p(()=>{r.current||(r.current=!0,c(()=>{e(new FormData)}))},[e]);const m=t&&!t.ok&&!a;return o(d,{action:e,actionState:t,className:"flex flex-col gap-4",children:m?o(A,{type:"submit",children:i("retry")}):o("output",{"aria-live":"polite",className:"text-sm text-muted-foreground",children:i("submitting")})})}export{b as VerifyEmailForm};
@@ -0,0 +1,6 @@
1
+ import "server-only";
2
+ export declare function sendPasswordResetEmail(args: {
3
+ userId: string;
4
+ email: string;
5
+ firstName: string;
6
+ }): Promise<void>;
@@ -0,0 +1 @@
1
+ import"server-only";import{getFormatter as d,getLocale as f,getTranslations as a}from"next-intl/server";import{PasswordResetEmail as g}from"../../emails/auth/password-reset.js";import{issueVerificationToken as w}from"../../lib/auth/verification-tokens.js";import{formatTokenExpiry as N}from"../../lib/email/format.js";import{sendEmail as u}from"../../lib/email/send.js";import{env as i}from"../../lib/env.js";async function v(r){const s=await w({userId:r.userId,purpose:"password_reset"}),t=await f(),[n,e,m]=await Promise.all([a({locale:t,namespace:"Emails.Common"}),a({locale:t,namespace:"Emails.PasswordReset"}),d({locale:t})]),c=new URL(`/reset-password/${s.raw}`,i.APP_URL).toString(),p=N(s.expiresAt,m),l=e("greetingNamed",{name:r.firstName}),o=i.BRAND_NAME;await u({to:r.email,subject:e("subject",{brandName:o}),react:g({resetUrl:c,lang:t,strings:{preview:e("preview",{brandName:o}),heading:e("heading"),greeting:l,body:e("body",{brandName:o}),cta:e("cta"),expiresAtMessage:e("expiresAt",{date:p}),ignoreNotice:e("ignoreNotice"),fallback:e("fallback"),brandName:o,footerNote:n("footerNote")}})})}export{v as sendPasswordResetEmail};
@@ -0,0 +1,49 @@
1
+ import { type UserRole } from "../../db/schema/index.js";
2
+ import { z } from "zod";
3
+ declare const PERMISSION_CATEGORIES: readonly ["managers", "affiliates", "groups", "commissions", "deals", "payouts", "campaigns", "postbacks", "settings", "logs", "stats"];
4
+ type PermissionCategory = (typeof PERMISSION_CATEGORIES)[number];
5
+ declare const ALL_PERMISSIONS: readonly ["managers:read", "managers:manage", "affiliates:read", "affiliates:manage", "groups:read", "groups:manage", "commissions:read", "commissions:manage", "deals:read", "deals:manage", "payouts:read", "payouts:manage", "campaigns:read", "campaigns:manage", "postbacks:read", "postbacks:manage", "settings:read", "settings:manage", "logs:read", "stats:read"];
6
+ export type Permission = (typeof ALL_PERMISSIONS)[number];
7
+ export declare const WILDCARD_PERMISSION: "*";
8
+ export type WildcardPermission = typeof WILDCARD_PERMISSION;
9
+ export type StoredPermission = Permission | WildcardPermission;
10
+ export declare const storedPermissionSchema: z.ZodEnum<{
11
+ "*": "*";
12
+ "affiliates:manage": "affiliates:manage";
13
+ "managers:read": "managers:read";
14
+ "managers:manage": "managers:manage";
15
+ "affiliates:read": "affiliates:read";
16
+ "groups:read": "groups:read";
17
+ "groups:manage": "groups:manage";
18
+ "commissions:read": "commissions:read";
19
+ "commissions:manage": "commissions:manage";
20
+ "deals:read": "deals:read";
21
+ "deals:manage": "deals:manage";
22
+ "payouts:read": "payouts:read";
23
+ "payouts:manage": "payouts:manage";
24
+ "campaigns:read": "campaigns:read";
25
+ "campaigns:manage": "campaigns:manage";
26
+ "postbacks:read": "postbacks:read";
27
+ "postbacks:manage": "postbacks:manage";
28
+ "settings:read": "settings:read";
29
+ "settings:manage": "settings:manage";
30
+ "logs:read": "logs:read";
31
+ "stats:read": "stats:read";
32
+ }>;
33
+ export declare function normalizePermissions(input: readonly string[]): StoredPermission[];
34
+ export declare function permissionCategory(id: Permission): PermissionCategory;
35
+ export declare function permissionAction(id: Permission): string;
36
+ export declare function impliedActions(action: string): readonly string[];
37
+ export declare function actionsThatImply(action: string): string[];
38
+ export declare function expandImplied(perms: readonly Permission[]): Permission[];
39
+ export type PermissionGroup = {
40
+ readonly category: PermissionCategory;
41
+ readonly permissions: readonly Permission[];
42
+ };
43
+ export declare function groupedPermissions(permissions?: readonly Permission[]): readonly PermissionGroup[];
44
+ export type PermissionCarrier = {
45
+ role: UserRole;
46
+ permissions: ReadonlySet<StoredPermission>;
47
+ };
48
+ export declare function hasPermission(carrier: PermissionCarrier, perm: Permission): boolean;
49
+ export {};
@@ -0,0 +1 @@
1
+ import{USER_ROLE as d}from"../../db/schema/index.js";import{z as l}from"zod";const f=["managers","affiliates","groups","commissions","deals","payouts","campaigns","postbacks","settings","logs","stats"],o=["managers:read","managers:manage","affiliates:read","affiliates:manage","groups:read","groups:manage","commissions:read","commissions:manage","deals:read","deals:manage","payouts:read","payouts:manage","campaigns:read","campaigns:manage","postbacks:read","postbacks:manage","settings:read","settings:manage","logs:read","stats:read"],n="*",S=l.enum([...o,n]);function m(s){return o.includes(s)}function c(s){return s===n||m(s)}function I(s){const e=s.filter(c);return e.includes(n)?[n]:Array.from(new Set(e))}function t(s){return s.split(":",1)[0]}function a(s){return s.slice(s.indexOf(":")+1)}const p={manage:["read"]};function u(s){return p[s]??[]}function x(s){const e=[];for(const[r,i]of Object.entries(p))i.includes(s)&&e.push(r);return e}function R(s){const e=new Set(s);for(const r of s)for(const i of u(a(r)))e.add(`${t(r)}:${i}`);return Array.from(e)}function P(s,e){return s===n?!0:!m(s)||t(s)!==t(e)?!1:u(a(s)).includes(a(e))}function C(s=o){const e=new Set(s);return f.map(r=>({category:r,permissions:o.filter(i=>t(i)===r&&e.has(i))})).filter(r=>r.permissions.length>0)}function E(s,e){if(s.role===d.platform_admin||s.permissions.has(n)||s.permissions.has(e))return!0;for(const r of s.permissions)if(P(r,e))return!0;return!1}export{n as WILDCARD_PERMISSION,x as actionsThatImply,R as expandImplied,C as groupedPermissions,E as hasPermission,u as impliedActions,I as normalizePermissions,a as permissionAction,t as permissionCategory,S as storedPermissionSchema};
@@ -0,0 +1,3 @@
1
+ import "server-only";
2
+ import type { PublicUser } from "../../db/schema/index.js";
3
+ export declare function requireUser(): Promise<PublicUser>;
@@ -0,0 +1 @@
1
+ import"server-only";import{redirect as i}from"next/navigation";import{loadSession as e}from"../../lib/auth/session.js";async function n(){const r=await e();return r||i("/signin"),r.user}export{n as requireUser};
@@ -0,0 +1,6 @@
1
+ import "server-only";
2
+ export declare function sendSignupVerificationEmail(args: {
3
+ userId: string;
4
+ email: string;
5
+ firstName: string;
6
+ }): Promise<void>;
@@ -0,0 +1 @@
1
+ import"server-only";import{getFormatter as p,getLocale as g,getTranslations as o}from"next-intl/server";import{AffiliateSignupVerifyEmail as d}from"../../emails/affiliate/signup-verify.js";import{issueVerificationToken as u}from"../../lib/auth/verification-tokens.js";import{formatTokenExpiry as y}from"../../lib/email/format.js";import{sendEmail as A}from"../../lib/email/send.js";import{env as n}from"../../lib/env.js";async function V(r){const a=await u({userId:r.userId,purpose:"email_verify"}),i=await g(),[m,e,s]=await Promise.all([o({locale:i,namespace:"Emails.Common"}),o({locale:i,namespace:"Emails.AffiliateSignupVerify"}),p({locale:i})]),f=new URL(`/verify-email/${a.raw}`,n.APP_URL).toString(),l=y(a.expiresAt,s),c=e("greetingNamed",{name:r.firstName}),t=n.BRAND_NAME;await A({to:r.email,subject:e("subject",{brandName:t}),react:d({verifyUrl:f,lang:i,strings:{preview:e("preview",{brandName:t}),heading:e("heading",{brandName:t}),greeting:c,body:e("body"),cta:e("cta"),expiresAtMessage:e("expiresAt",{date:l}),fallback:e("fallback"),brandName:t,footerNote:m("footerNote")}})})}export{V as sendSignupVerificationEmail};
@@ -0,0 +1,53 @@
1
+ import { type Campaign, type CommissionStatus, type DealStatus } from "../../db/schema/index.js";
2
+ import type { CampaignSortKey, CampaignStatusFilter } from "./list-params.js";
3
+ import type { FormState } from "../../lib/actions/state.js";
4
+ import { type ListParams, type ListResult } from "../../lib/list-params.js";
5
+ export type CampaignFormState = FormState<{
6
+ id: string;
7
+ }>;
8
+ export type CampaignWithRelations = Campaign & {
9
+ casinoName: string;
10
+ commissionTitle: string | null;
11
+ commissionStatus: CommissionStatus;
12
+ dealStatus: DealStatus | null;
13
+ };
14
+ export type CampaignWithDeal = CampaignWithRelations & {
15
+ dealStartsAt: Date | null;
16
+ dealEndsAt: Date | null;
17
+ };
18
+ /**
19
+ * Returns campaigns for the given affiliate.
20
+ * Allowed if the caller has `campaigns:read` OR is the affiliate themselves.
21
+ */
22
+ export declare function listCampaignsForAffiliate(affiliateId: string, params: ListParams<CampaignSortKey> & {
23
+ status: CampaignStatusFilter;
24
+ }): Promise<ListResult<CampaignWithDeal>>;
25
+ export type CampaignCasinoOption = {
26
+ id: string;
27
+ name: string;
28
+ commissions: Array<{
29
+ id: string;
30
+ title: string | null;
31
+ }>;
32
+ };
33
+ /**
34
+ * Returns casinos for which the affiliate has an active deal, each with the
35
+ * eligible commissions nested. One round-trip avoids the dependent-loading
36
+ * race conditions a `(casino) → (commissions)` setup would introduce.
37
+ *
38
+ * Allowed if the caller has `campaigns:manage` OR is the affiliate themselves.
39
+ */
40
+ export declare function listCampaignCasinosForAffiliate(affiliateId: string): Promise<CampaignCasinoOption[]>;
41
+ export declare const createCampaignAction: (args_0: string, args_1: FormState<{
42
+ id: string;
43
+ }>, args_2: FormData) => Promise<FormState<{
44
+ id: string;
45
+ }>>;
46
+ export declare const deactivateCampaignAction: (args_0: string) => Promise<import("../../lib/actions/state.js").ActionResult<void>>;
47
+ export declare const reactivateCampaignAction: (args_0: string) => Promise<import("../../lib/actions/state.js").ActionResult<void>>;
48
+ /**
49
+ * Single campaign with relations for the detail page. Returns null when the
50
+ * campaign does not exist or the caller may not view it (owner OR
51
+ * `campaigns:read`).
52
+ */
53
+ export declare function getCampaignById(campaignId: string): Promise<CampaignWithRelations | null>;
@@ -0,0 +1 @@
1
+ "use server";import{db as l}from"../../db/index.js";import{CAMPAIGN_STATUS as w,COMMISSION_STATUS as R,campaigns as i,casinos as c,commissionCasinos as I,commissions as m,DEAL_STATUS as h,deals as r,USER_ROLE as v}from"../../db/schema/index.js";import{and as y,asc as T,count as j,desc as J,eq as a,inArray as W}from"drizzle-orm";import{revalidatePath as x}from"next/cache";import{z as C}from"zod";import{requireSession as N}from"../auth/authorization.js";import{hasPermission as A}from"../auth/permissions.js";import{parseForm as U}from"../../lib/actions/parse-form.js";import{authAction as L,authFormAction as k}from"../../lib/auth/action.js";import{isUniqueViolation as q}from"../../lib/db/errors.js";import{appError as u}from"../../lib/errors/codes.js";import{success as F}from"../../lib/errors/server.js";import{paginate as Q}from"../../lib/list-params.js";import{generateSlug as K}from"../../lib/slug.js";import{invalidateCampaignTrackingCache as M}from"../../lib/tracking-cache.js";import{NAME_MAX as $,V}from"../../lib/validation/zod.js";const X=2e3,z=s=>s===""||s===void 0?null:s,G=C.object({name:C.string().trim().min(1,V.fieldRequired).max($),casinoId:C.uuid(),commissionId:C.uuid(),description:C.preprocess(z,C.string().trim().max(X).nullable())});async function H(s=5){for(let n=0;n<s;n++){const o=K(),[t]=await l.select({id:i.id}).from(i).where(a(i.slug,o)).limit(1);if(!t)return o}throw u("service_unavailable",{toast:!0})}function Y(s,n){const o=i[s];return[n==="asc"?T(o):J(o),T(i.id)]}function Z(s){switch(s){case"all":return;case"active":return a(i.status,w.active);case"deactivated":return a(i.status,w.deactivated)}}async function tt(s,n,o){const[t]=await l.select({id:r.id}).from(r).innerJoin(m,a(m.id,r.commissionId)).innerJoin(I,a(I.commissionId,m.id)).innerJoin(c,a(c.id,I.casinoId)).where(y(a(r.affiliateId,s),a(r.status,h.active),a(r.commissionId,o),a(I.casinoId,n),a(m.status,R.published),a(c.isActive,!0))).limit(1);if(!t)throw u("campaign_invalid_commission",{toast:!0})}async function It(s,n){const{user:o,carrier:t}=await N();if(!A(t,"campaigns:read")&&s!==o.id)throw u("forbidden",{toast:!0});const e=Z(n.status),d=y(a(i.affiliateId,s),e),[f,S]=Y(n.sort,n.dir);return Q(n,{count:async()=>{const[b]=await l.select({total:j()}).from(i).where(d);return b?.total??0},fetch:async({offset:b,limit:B})=>{const O=await l.select({campaign:i,casinoName:c.name,commissionTitle:m.title,commissionStatus:m.status}).from(i).innerJoin(c,a(c.id,i.casinoId)).innerJoin(m,a(m.id,i.commissionId)).where(d).orderBy(f,S).limit(B).offset(b),D=[...new Set(O.map(g=>g.campaign.commissionId))],_=new Map;if(D.length>0){const g=await l.select({commissionId:r.commissionId,status:r.status,startsAt:r.startsAt,endsAt:r.endsAt}).from(r).where(y(a(r.affiliateId,s),W(r.commissionId,D))).orderBy(J(r.startsAt));for(const p of g){const P=_.get(p.commissionId);(!P||P.status!==h.active&&p.status===h.active)&&_.set(p.commissionId,{status:p.status,startsAt:p.startsAt,endsAt:p.endsAt})}}return O.map(g=>{const p=_.get(g.campaign.commissionId);return{...g.campaign,casinoName:g.casinoName,commissionTitle:g.commissionTitle,commissionStatus:g.commissionStatus,dealStatus:p?.status??null,dealStartsAt:p?.startsAt??null,dealEndsAt:p?.endsAt??null}})}})}async function St(s){await E(s);const n=await l.select({casinoId:c.id,casinoName:c.name,commissionId:m.id,commissionTitle:m.title}).from(r).innerJoin(m,a(m.id,r.commissionId)).innerJoin(I,a(I.commissionId,m.id)).innerJoin(c,a(c.id,I.casinoId)).where(y(a(r.affiliateId,s),a(r.status,h.active),a(m.status,R.published),a(c.isActive,!0))).orderBy(T(c.name),T(m.title)),o=new Map;for(const t of n){let e=o.get(t.casinoId);e||(e={id:t.casinoId,name:t.casinoName,commissions:[]},o.set(t.casinoId,e)),e.commissions.some(d=>d.id===t.commissionId)||e.commissions.push({id:t.commissionId,title:t.commissionTitle})}return Array.from(o.values())}async function E(s){const{user:n,carrier:o}=await N();if(!(n.role===v.affiliate&&s===n.id)&&!A(o,"campaigns:manage"))throw u("forbidden",{toast:!0})}const ht=k({revalidate:["/campaigns"]},async({audit:s},n,o)=>{await E(n);const t=await U(o,G);await tt(n,t.casinoId,t.commissionId);let e;for(let d=0;d<5&&!e;d++){const f=await H();[e]=await l.insert(i).values({affiliateId:n,casinoId:t.casinoId,commissionId:t.commissionId,name:t.name,description:t.description,slug:f}).returning({id:i.id}).catch(S=>{if(q(S))return[];throw S})}if(!e)throw u("service_unavailable",{toast:!0});return await s({action:"campaign.create",subjectId:n,target:{type:"campaign",id:e.id,label:t.name}}),x(`/affiliates/${n}`),F({id:e.id},"Toasts.campaignCreated")}),Ct=L({revalidate:["/campaigns"]},async({user:s,carrier:n,audit:o},t)=>{const[e]=await l.select({status:i.status,affiliateId:i.affiliateId,name:i.name,slug:i.slug}).from(i).where(a(i.id,t)).limit(1);if(!e)throw u("campaign_not_found",{toast:!0});const d=A(n,"campaigns:manage"),f=s.role===v.affiliate&&e.affiliateId===s.id;if(!d&&!f)throw u("forbidden",{toast:!0});if(e.status!==w.active)throw u("campaign_not_active",{toast:!0});return await l.update(i).set({status:w.deactivated}).where(a(i.id,t)),await M(e.slug),await o({action:"campaign.deactivate",subjectId:e.affiliateId,target:{type:"campaign",id:t,label:e.name},metadata:{status:w.deactivated}}),x(`/affiliates/${e.affiliateId}`),F("Toasts.campaignDeactivated")}),yt=L({revalidate:["/campaigns"]},async({user:s,carrier:n,audit:o},t)=>{const[e]=await l.select({status:i.status,affiliateId:i.affiliateId,name:i.name,slug:i.slug}).from(i).where(a(i.id,t)).limit(1);if(!e)throw u("campaign_not_found",{toast:!0});const d=A(n,"campaigns:manage"),f=s.role===v.affiliate&&e.affiliateId===s.id;if(!d&&!f)throw u("forbidden",{toast:!0});if(e.status!==w.deactivated)throw u("campaign_not_deactivated",{toast:!0});return await l.update(i).set({status:w.active}).where(a(i.id,t)),await M(e.slug),await o({action:"campaign.reactivate",subjectId:e.affiliateId,target:{type:"campaign",id:t,label:e.name},metadata:{status:w.active}}),x(`/affiliates/${e.affiliateId}`),F("Toasts.campaignReactivated")});async function At(s){const{user:n,carrier:o}=await N(),[t]=await l.select({campaign:i,casinoName:c.name,commissionTitle:m.title,commissionStatus:m.status}).from(i).innerJoin(c,a(c.id,i.casinoId)).innerJoin(m,a(m.id,i.commissionId)).where(a(i.id,s)).limit(1);if(!t||!(n.role===v.affiliate&&t.campaign.affiliateId===n.id)&&!A(o,"campaigns:read"))return null;const d=await l.select({status:r.status}).from(r).where(y(a(r.affiliateId,t.campaign.affiliateId),a(r.commissionId,t.campaign.commissionId))),f=d.some(S=>S.status===h.active)?h.active:d[0]?.status??null;return{...t.campaign,casinoName:t.casinoName,commissionTitle:t.commissionTitle,commissionStatus:t.commissionStatus,dealStatus:f}}export{ht as createCampaignAction,Ct as deactivateCampaignAction,At as getCampaignById,St as listCampaignCasinosForAffiliate,It as listCampaignsForAffiliate,yt as reactivateCampaignAction};
@@ -0,0 +1,7 @@
1
+ import { type CampaignCasinoOption } from "../actions.js";
2
+ export declare function CampaignDialog({ affiliateId, casinoOptions, open, onOpenChange, }: {
3
+ affiliateId: string;
4
+ casinoOptions: ReadonlyArray<CampaignCasinoOption>;
5
+ open: boolean;
6
+ onOpenChange: (open: boolean) => void;
7
+ }): import("react").JSX.Element;
@@ -0,0 +1 @@
1
+ "use client";import{jsx as e,jsxs as a}from"react/jsx-runtime";import{useTranslations as m}from"next-intl";import{useActionState as L,useState as D}from"react";import{ActionForm as P}from"../../../components/ui/action-form.js";import{Button as S}from"../../../components/ui/button.js";import{Dialog as O,DialogBody as V,DialogClose as k,DialogContent as w,DialogDescription as B,DialogFooter as z,DialogHeader as H,DialogTitle as R}from"../../../components/ui/dialog.js";import{FormField as r}from"../../../components/ui/form-field.js";import{Input as q}from"../../../components/ui/input.js";import{Select as b,SelectContent as y,SelectItem as F,SelectTrigger as x,SelectValue as h}from"../../../components/ui/select.js";import{Textarea as E}from"../../../components/ui/textarea.js";import{createCampaignAction as G}from"../actions.js";function j({affiliateId:c,casinoOptions:n,open:d,onOpenChange:i}){const s=m("Campaigns"),t=m("Common");return e(O,{open:d,onOpenChange:i,disablePointerDismissal:!0,children:a(w,{closeLabel:t("close"),children:[a(H,{children:[e(R,{children:s("createDialogTitle")}),e(B,{children:s("createDialogDesc")})]}),e(J,{affiliateId:c,casinoOptions:n,onSuccess:()=>i(!1)})]})})}function J({affiliateId:c,casinoOptions:n,onSuccess:d}){const i=m("Campaigns"),s=m("Common"),[t,I]=D(""),[u,C]=D(""),g=n.find(o=>o.id===t)?.commissions??[],v=o=>{I(o),C("")},A=G.bind(null,c),[N,T,p]=L(async(o,l)=>{const f=await A(o,l);return f?.ok&&d(),f},void 0);return a(P,{action:T,actionState:N,className:"contents",errorClassName:"mx-6 mt-4",children:[e(V,{children:a("div",{className:"flex flex-col gap-4",children:[e(r,{name:"name",label:i("nameLabel"),children:e(q,{name:"name",type:"text",placeholder:i("namePlaceholder"),autoComplete:"off",maxLength:120,"aria-required":"true"})}),e(r,{name:"casinoId",label:i("casinoLabel"),children:a(b,{name:"casinoId",value:t,onValueChange:o=>v(o),children:[e(x,{className:"w-full",children:e(h,{placeholder:i("casinoPlaceholder"),children:o=>o?n.find(l=>l.id===o)?.name??o:null})}),e(y,{children:n.length===0?e("div",{className:"px-2 py-1.5 text-xs text-muted-foreground",children:i("noCasinos")}):n.map(o=>e(F,{value:o.id,children:o.name},o.id))})]})}),e(r,{name:"commissionId",label:i("commissionLabel"),children:a(b,{name:"commissionId",value:u,onValueChange:o=>C(o),disabled:!t,children:[e(x,{className:"w-full",children:e(h,{placeholder:i("commissionPlaceholder"),children:o=>o?g.find(l=>l.id===o)?.title??i("untitledCommission"):null})}),e(y,{children:t?g.length===0?e("div",{className:"px-2 py-1.5 text-xs text-muted-foreground",children:i("noCommissions")}):g.map(o=>e(F,{value:o.id,children:o.title??i("untitledCommission")},o.id)):e("div",{className:"px-2 py-1.5 text-xs text-muted-foreground",children:i("selectCasinoFirst")})})]},t)}),e(r,{name:"description",label:i("descriptionLabel"),children:e(E,{name:"description",placeholder:i("descriptionPlaceholder"),rows:4})})]})}),a(z,{children:[e(k,{render:e(S,{type:"button",variant:"secondary",size:"sm",disabled:p}),children:s("cancel")}),e(S,{type:"submit",size:"sm",disabled:p||!t||!u,children:i(p?"creating":"create")})]})]})}export{j as CampaignDialog};
@@ -0,0 +1,8 @@
1
+ import { type CampaignStatus } from "../../../db/schema/index.js";
2
+ export declare function CampaignRowActions({ campaignId, slug, status, canManage, trackerBase, }: {
3
+ campaignId: string;
4
+ slug: string;
5
+ status: CampaignStatus;
6
+ canManage: boolean;
7
+ trackerBase: string;
8
+ }): import("react").JSX.Element;
@@ -0,0 +1 @@
1
+ "use client";import{jsx as n,jsxs as e}from"react/jsx-runtime";import{CAMPAIGN_STATUS as f}from"../../../db/schema/index.js";import{IconDots as v,IconLink as k,IconLock as w,IconLockOpen as D}from"@tabler/icons-react";import{useTranslations as C}from"next-intl";import{useState as A,useTransition as M}from"react";import{DropdownMenu as b,DropdownMenuContent as I,DropdownMenuItem as s,DropdownMenuSeparator as T,DropdownMenuTrigger as S}from"../../../components/ui/dropdown-menu.js";import{Spinner as h}from"../../../components/ui/spinner.js";import{deactivateCampaignAction as x,reactivateCampaignAction as L}from"../actions.js";import{TrackingLinkDialog as z}from"./tracking-link-dialog.js";import{toastActionResult as y}from"../../../lib/toast.js";function E({campaignId:c,slug:d,status:p,canManage:a,trackerBase:u}){const t=C("Campaigns"),[i,g]=M(),[m,r]=A(!1),o=p===f.active,l=()=>{g(async()=>{y(await(o?x:L)(c))})};return e("div",{className:"flex justify-end",children:[e(b,{children:[n(S,{"aria-label":t("rowActions"),disabled:i,className:"inline-flex size-7 cursor-pointer items-center justify-center rounded-md text-muted-foreground outline-none hover:bg-accent hover:text-accent-foreground focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-card data-popup-open:bg-accent data-popup-open:text-accent-foreground",children:i?n(h,{}):n(v,{size:16,"aria-hidden":!0})}),e(I,{align:"end",children:[e(s,{onClick:()=>r(!0),children:[n(k,{size:14,"aria-hidden":!0,className:"text-muted-foreground"}),t("Detail.trackingLinkTitle")]}),a&&n(T,{}),a&&e(s,{variant:o?"destructive":"default",onClick:l,disabled:i,children:[o?n(w,{size:14,"aria-hidden":!0}):n(D,{size:14,"aria-hidden":!0}),t(o?"deactivate":"reactivate")]})]})]}),n(z,{slug:d,trackerBase:u,open:m,onOpenChange:r})]})}export{E as CampaignRowActions};
@@ -0,0 +1,6 @@
1
+ import { type CampaignStatus, type CommissionStatus, type DealStatus } from "../../../db/schema/index.js";
2
+ export declare function CampaignStatusBadge({ status, dealStatus, commissionStatus, }: {
3
+ status: CampaignStatus;
4
+ dealStatus: DealStatus | null;
5
+ commissionStatus: CommissionStatus;
6
+ }): import("react").JSX.Element;
@@ -0,0 +1 @@
1
+ import{jsx as e}from"react/jsx-runtime";import{CAMPAIGN_STATUS as a,COMMISSION_STATUS as S,DEAL_STATUS as m}from"../../../db/schema/index.js";import{useTranslations as r}from"next-intl";import{StatusBadge as s}from"../../../components/ui/status-badge.js";const c={[a.active]:"success",[a.deactivated]:"danger"};function T({status:n,dealStatus:i,commissionStatus:o}){const t=r("Campaigns");if(o!==S.published)return e(s,{tone:"warning",children:t("statusCommissionInactive")});if(i!==m.active)return e(s,{tone:"warning",children:t("statusDealInactive")});const u=n===a.active?t("statusActive"):t("statusDeactivated");return e(s,{tone:c[n],children:u})}export{T as CampaignStatusBadge};
@@ -0,0 +1 @@
1
+ export declare function CampaignStatusTabs(): import("react").JSX.Element;
@@ -0,0 +1 @@
1
+ "use client";import{jsx as s,jsxs as c}from"react/jsx-runtime";import{useTranslations as i}from"next-intl";import{useQueryStates as T}from"nuqs";import{useTransition as m}from"react";import{Tabs as u,TabsIndicator as p,TabsList as b,TabsTab as f}from"../../../components/ui/tabs.js";import{CAMPAIGN_STATUSES as l,campaignStatusParser as S}from"../list-params.js";import{listSearchParsers as g}from"../../../lib/list-params.js";function I(){const t=i("Campaigns.Tabs"),[r,e]=m(),[{status:n},o]=T({status:S,page:g.page},{shallow:!1,clearOnDefault:!0,startTransition:e});return s(u,{value:n,onValueChange:a=>o({status:a,page:null}),"data-pending":r?"":void 0,children:c(b,{children:[l.map(a=>s(f,{value:a,children:t(a)},a)),s(p,{})]})})}export{I as CampaignStatusTabs};
@@ -0,0 +1,7 @@
1
+ import type { CampaignWithDeal } from "../actions.js";
2
+ import { type ListResult } from "../../../lib/list-params.js";
3
+ export declare function CampaignsTable({ result, canManage, trackerBase, }: {
4
+ result: ListResult<CampaignWithDeal>;
5
+ canManage: boolean;
6
+ trackerBase: string;
7
+ }): import("react").JSX.Element;
@@ -0,0 +1 @@
1
+ "use client";import{Fragment as L,jsx as t,jsxs as l}from"react/jsx-runtime";import{IconSpeakerphone as f}from"@tabler/icons-react";import{useFormatter as x,useTranslations as D}from"next-intl";import{useCallback as S,useMemo as y,useRef as N}from"react";import{DataTable as k}from"../../../components/ui/data-table.js";import{Identity as T}from"../../../components/ui/identity.js";import{SortButton as h}from"../../../components/ui/sort-button.js";import{TablePagination as b}from"../../../components/ui/table-pagination.js";import{TextButton as A}from"../../../components/ui/text-link.js";import{CampaignRowActions as v}from"./campaign-row-actions.js";import{CampaignStatusBadge as I}from"./campaign-status-badge.js";import{TrackingLinkCell as z}from"./tracking-link-cell.js";import{getCommissionForDealView as B}from"../../commissions/actions.js";import{CommissionDetailDialog as P}from"../../commissions/components/commission-detail-dialog.js";import{useDeferredDialog as R}from"../../../lib/hooks/use-deferred-dialog.js";import{PAGE_SIZE_OPTIONS as E}from"../../../lib/list-params.js";function X({result:n,canManage:o,trackerBase:s}){const a=D("Campaigns"),m=x(),r=N(null),c=R(()=>r.current?B(r.current):Promise.resolve(null)),u=c.trigger,d=S(i=>{r.current=i,u()},[u]),g=o,C=y(()=>{const i=e=>m.dateTime(e,{day:"numeric",month:"short",year:"numeric"}),p=[{id:"name",header:()=>t(h,{column:"name",children:a("columnName")}),cell:({row:e})=>t(T,{visual:t("div",{className:"flex size-9 shrink-0 items-center justify-center rounded-full bg-muted text-muted-foreground",children:t(f,{size:18,"aria-hidden":!0})}),primary:e.original.name,secondary:e.original.description?t("span",{className:"line-clamp-1 text-xs text-muted-foreground",children:e.original.description}):null})},{id:"status",header:()=>a("columnStatus"),cell:({row:e})=>t(I,{status:e.original.status,dealStatus:e.original.dealStatus,commissionStatus:e.original.commissionStatus})},{id:"casino",header:()=>a("columnCasino"),cell:({row:e})=>t("span",{className:"text-sm",children:e.original.casinoName})},{id:"commission",header:()=>a("columnCommission"),cell:({row:e})=>t(A,{onClick:()=>d(e.original.commissionId),children:e.original.commissionTitle??a("untitledCommission")})},{id:"deal",header:()=>a("columnDeal"),cell:({row:e})=>e.original.dealStartsAt?l("span",{className:"text-sm text-muted-foreground tabular-nums",children:[i(e.original.dealStartsAt)," \u2013"," ",e.original.dealEndsAt?i(e.original.dealEndsAt):a("dealOpenEnded")]}):t("span",{className:"text-sm text-muted-foreground",children:"\u2014"})},{id:"createdAt",header:()=>t(h,{column:"createdAt",children:a("columnCreated")}),cell:({row:e})=>t("span",{className:"text-sm text-muted-foreground tabular-nums",children:i(e.original.createdAt)})},{id:"trackingLink",header:()=>a("columnTrackingLink"),cell:({row:e})=>t(z,{slug:e.original.slug,trackerBase:s}),meta:{className:"text-right"}}];return g?[...p,{id:"actions",header:()=>t("span",{className:"sr-only",children:a("columnActions")}),cell:({row:e})=>t(v,{campaignId:e.original.id,slug:e.original.slug,status:e.original.status,canManage:o,trackerBase:s}),meta:{pin:"right",className:"text-right"}}]:p},[a,m,o,g,s,d]);return l(L,{children:[t(k,{data:n.rows,columns:C,getRowId:i=>i.id,empty:l("div",{className:"flex flex-col items-center gap-3 py-4",children:[t("div",{className:"flex size-10 items-center justify-center rounded-full bg-muted text-muted-foreground",children:t(f,{size:18,"aria-hidden":!0})}),t("span",{children:a("emptyState")})]}),pagination:t(b,{page:n.page,pageSize:n.pageSize,totalPages:n.totalPages,pageSizeOptions:E})}),t(P,{controller:c})]})}export{X as CampaignsTable};
@@ -0,0 +1,5 @@
1
+ import type { CampaignCasinoOption } from "../actions.js";
2
+ export declare function CreateCampaignButton({ affiliateId, casinoOptions, }: {
3
+ affiliateId: string;
4
+ casinoOptions: ReadonlyArray<CampaignCasinoOption>;
5
+ }): import("react").JSX.Element;
@@ -0,0 +1 @@
1
+ "use client";import{Fragment as u,jsx as n,jsxs as o}from"react/jsx-runtime";import{IconPlus as s}from"@tabler/icons-react";import{useTranslations as p}from"next-intl";import{useState as m}from"react";import{Button as l}from"../../../components/ui/button.js";import{CampaignDialog as f}from"./campaign-dialog.js";function B({affiliateId:e,casinoOptions:t}){const a=p("Campaigns"),[r,i]=m(!1);return o(u,{children:[o(l,{type:"button",variant:"primary",size:"sm",onClick:()=>i(!0),disabled:t.length===0,"aria-label":a("createButton"),children:[n(s,{size:14,"aria-hidden":!0}),n("span",{className:"hidden sm:inline",children:a("createButton")})]}),n(f,{affiliateId:e,casinoOptions:t,open:r,onOpenChange:i})]})}export{B as CreateCampaignButton};
@@ -0,0 +1,4 @@
1
+ export declare function SubIdBuilder({ trackerBase, slug, }: {
2
+ trackerBase: string;
3
+ slug: string;
4
+ }): import("react").JSX.Element;
@@ -0,0 +1 @@
1
+ "use client";import{jsx as t,jsxs as l}from"react/jsx-runtime";import{IconPlus as x,IconTrash as b}from"@tabler/icons-react";import{useTranslations as I}from"next-intl";import{useMemo as h,useState as y}from"react";import{Button as m}from"../../../components/ui/button.js";import{Input as D}from"../../../components/ui/input.js";import{TrackingLinkBox as N}from"./tracking-link-box.js";import{buildTrackingUrl as k}from"../tracking-url.js";const c=5;function A({trackerBase:d,slug:u}){const n=I("Campaigns"),[o,r]=y(()=>[{id:crypto.randomUUID(),value:""}]),p=h(()=>{const e={};return o.slice(0,c).forEach((s,i)=>{const a=s.value.trim();a&&(e[`sub${i+1}`]=a)}),k(d,u,e)},[o,d,u]),f=(e,s)=>r(i=>i.map(a=>a.id===e?{...a,value:s}:a)),g=e=>r(s=>s.filter(i=>i.id!==e)),v=()=>r(e=>[...e,{id:crypto.randomUUID(),value:""}]);return l("div",{className:"flex flex-col gap-3",children:[l("div",{className:"flex flex-col gap-1",children:[t("h3",{className:"text-sm font-medium text-foreground",children:n("Detail.subIdsTitle")}),t("p",{className:"text-xs text-muted-foreground",children:n("Detail.subIdsDesc")})]}),t("div",{className:"flex flex-col gap-2",children:o.map((e,s)=>l("div",{className:"flex items-center gap-2",children:[t(D,{value:e.value,onChange:i=>f(e.id,i.target.value),placeholder:`sub${s+1}`,maxLength:64,autoComplete:"off",className:"flex-1"}),o.length>1?t(m,{type:"button",size:"sm",variant:"ghost","aria-label":n("Detail.subIdsRemove"),onClick:()=>g(e.id),children:t(b,{size:16,"aria-hidden":!0})}):null]},e.id))}),o.length<c?t("div",{children:l(m,{type:"button",size:"sm",variant:"secondary",onClick:v,children:[t(x,{size:14,"aria-hidden":!0}),n("Detail.subIdsAdd")]})}):null,t(N,{url:p})]})}export{A as SubIdBuilder};
@@ -0,0 +1,3 @@
1
+ export declare function TrackingLinkBox({ url }: {
2
+ url: string;
3
+ }): import("react").JSX.Element;
@@ -0,0 +1 @@
1
+ "use client";import{jsx as i,jsxs as l}from"react/jsx-runtime";import{useTranslations as t}from"next-intl";import{CopyButton as a}from"../../../components/ui/copy-button.js";import{Input as n}from"../../../components/ui/input.js";function c({url:o}){const e=t("Campaigns");return l("div",{className:"flex items-center gap-2",children:[i(n,{value:o,disabled:!0,className:"flex-1 font-mono"}),i(a,{value:o,copyLabel:e("Detail.copy"),copiedLabel:e("Detail.copied")})]})}export{c as TrackingLinkBox};
@@ -0,0 +1,4 @@
1
+ export declare function TrackingLinkCell({ slug, trackerBase, }: {
2
+ slug: string;
3
+ trackerBase: string;
4
+ }): import("react").JSX.Element;
@@ -0,0 +1 @@
1
+ "use client";import{jsx as t}from"react/jsx-runtime";import{useTranslations as n}from"next-intl";import{CopyButton as a}from"../../../components/ui/copy-button.js";import{buildTrackingUrl as l}from"../tracking-url.js";function u({slug:e,trackerBase:o}){const i=n("Campaigns"),r=l(o,e);return t("div",{className:"flex items-center justify-end",children:t(a,{value:r,copyLabel:i("Detail.copy"),copiedLabel:i("Detail.copied"),variant:"ghost"})})}export{u as TrackingLinkCell};
@@ -0,0 +1,6 @@
1
+ export declare function TrackingLinkDialog({ slug, trackerBase, open, onOpenChange, }: {
2
+ slug: string;
3
+ trackerBase: string;
4
+ open: boolean;
5
+ onOpenChange: (open: boolean) => void;
6
+ }): import("react").JSX.Element;
@@ -0,0 +1 @@
1
+ "use client";import{jsx as o,jsxs as i}from"react/jsx-runtime";import{useTranslations as r}from"next-intl";import{Button as D}from"../../../components/ui/button.js";import{Dialog as c,DialogBody as m,DialogClose as p,DialogContent as d,DialogDescription as k,DialogFooter as u,DialogHeader as f,DialogTitle as C}from"../../../components/ui/dialog.js";import{SubIdBuilder as T}from"./sub-id-builder.js";import{TrackingLinkBox as B}from"./tracking-link-box.js";import{buildTrackingUrl as b}from"../tracking-url.js";function H({slug:e,trackerBase:n,open:t,onOpenChange:g}){const a=r("Campaigns"),l=r("Common"),s=b(n,e);return o(c,{open:t,onOpenChange:g,children:i(d,{closeLabel:l("close"),children:[i(f,{children:[o(C,{children:a("Detail.trackingLinkTitle")}),o(k,{children:a("Detail.trackingLinkDesc")})]}),i(m,{className:"flex flex-col gap-4",children:[o(B,{url:s}),o(T,{trackerBase:n,slug:e})]}),o(u,{children:o(p,{render:o(D,{variant:"secondary",size:"sm"}),children:l("close")})})]})})}export{H as TrackingLinkDialog};
@@ -0,0 +1,14 @@
1
+ export declare const CAMPAIGN_SORT_KEYS: readonly ["createdAt", "name"];
2
+ export type CampaignSortKey = (typeof CAMPAIGN_SORT_KEYS)[number];
3
+ export declare const CAMPAIGN_STATUSES: readonly ["all", "active", "deactivated"];
4
+ export type CampaignStatusFilter = (typeof CAMPAIGN_STATUSES)[number];
5
+ export declare const campaignStatusParser: Omit<import("nuqs/server").SingleParserBuilder<"active" | "deactivated" | "all">, "parseServerSide"> & {
6
+ readonly defaultValue: NonNullable<"active" | "deactivated" | "all">;
7
+ parseServerSide(value: string | string[] | undefined): NonNullable<"active" | "deactivated" | "all">;
8
+ };
9
+ export declare const loadCampaignStatus: import("nuqs/server").LoaderFunction<{
10
+ status: Omit<import("nuqs/server").SingleParserBuilder<"active" | "deactivated" | "all">, "parseServerSide"> & {
11
+ readonly defaultValue: NonNullable<"active" | "deactivated" | "all">;
12
+ parseServerSide(value: string | string[] | undefined): NonNullable<"active" | "deactivated" | "all">;
13
+ };
14
+ }>;
@@ -0,0 +1 @@
1
+ import{createLoader as t,parseAsStringLiteral as a}from"nuqs/server";const p=["createdAt","name"],e=["all","active","deactivated"],r=a(e).withDefault("active"),s=t({status:r});export{p as CAMPAIGN_SORT_KEYS,e as CAMPAIGN_STATUSES,r as campaignStatusParser,s as loadCampaignStatus};
@@ -0,0 +1,8 @@
1
+ export type SubIds = {
2
+ sub1?: string;
3
+ sub2?: string;
4
+ sub3?: string;
5
+ sub4?: string;
6
+ sub5?: string;
7
+ };
8
+ export declare function buildTrackingUrl(trackerBase: string, slug: string, subIds?: SubIds): string;
@@ -0,0 +1 @@
1
+ function u(t,n,i){const s=new URL(`/${n}`,t);for(const[e,r]of Object.entries(i??{}))r&&s.searchParams.set(e,r);return s.toString()}export{u as buildTrackingUrl};
@@ -0,0 +1,39 @@
1
+ import type { CasinoStatusFilter } from "./list-params.js";
2
+ import type { FormState } from "../../lib/actions/state.js";
3
+ import { type ListResult } from "../../lib/list-params.js";
4
+ export type CasinoFormState = FormState<{
5
+ id: string;
6
+ }>;
7
+ export declare const listCasinos: (params: import("../../lib/list-params.js").PageInput & {
8
+ q: string;
9
+ sort: "createdAt" | "name";
10
+ dir: import("../../lib/list-params.js").SortDir;
11
+ } & {
12
+ status: CasinoStatusFilter;
13
+ }) => Promise<ListResult<{
14
+ id: string;
15
+ createdAt: Date;
16
+ name: string;
17
+ updatedAt: Date;
18
+ isActive: boolean;
19
+ landingUrl: string;
20
+ trackingParamName: string;
21
+ postbackSecret: string;
22
+ }>>;
23
+ export type CasinoEditData = {
24
+ name: string;
25
+ isActive: boolean;
26
+ };
27
+ export declare const getCasinoEditData: (casinoId: string) => Promise<CasinoEditData | null>;
28
+ export declare const createCasinoAction: (args_0: FormState<{
29
+ id: string;
30
+ }>, args_1: FormData) => Promise<FormState<{
31
+ id: string;
32
+ }>>;
33
+ export declare const updateCasinoAction: (args_0: string, args_1: FormState<{
34
+ id: string;
35
+ }>, args_2: FormData) => Promise<FormState<{
36
+ id: string;
37
+ }>>;
38
+ export declare const setCasinoActiveAction: (args_0: string, args_1: boolean) => Promise<import("../../lib/actions/state.js").ActionResult<void>>;
39
+ export declare const deleteCasinoAction: (args_0: string, args_1: FormState<void>, args_2: FormData) => Promise<FormState<void>>;
@@ -0,0 +1 @@
1
+ "use server";import{db as o}from"../../db/index.js";import{campaigns as h,casinos as t,commissionCasinos as y}from"../../db/schema/index.js";import{and as f,asc as g,count as p,desc as b,eq as s,ilike as L,ne as C}from"drizzle-orm";import{z as _}from"zod";import{parseForm as v}from"../../lib/actions/parse-form.js";import{adminQuery as S,authAction as x,authFormAction as w}from"../../lib/auth/action.js";import{isForeignKeyViolation as q,isUniqueViolation as D}from"../../lib/db/errors.js";import{appError as c}from"../../lib/errors/codes.js";import{success as l}from"../../lib/errors/server.js";import{paginate as Q}from"../../lib/list-params.js";import{invalidateCasinoCampaignTrackingCache as T}from"../../lib/tracking-cache.js";import{NAME_MAX as k,V as E}from"../../lib/validation/zod.js";const A=_.object({name:_.string().trim().min(1,E.nameRequired).max(k)});function P(n,i){const e=t[n];return[i==="asc"?g(e):b(e),g(t.id)]}function R(n){if(n)return L(t.name,`%${n}%`)}function K(n){switch(n){case"all":return;case"active":return s(t.isActive,!0);case"inactive":return s(t.isActive,!1)}}const J=S(async(n,i)=>{const e=R(i.q),a=K(i.status),[r,d]=P(i.sort,i.dir),u=f(e,a);return Q(i,{count:async()=>{const[m]=await o.select({total:p()}).from(t).where(u);return m?.total??0},fetch:({offset:m,limit:F})=>o.select().from(t).where(u).orderBy(r,d).limit(F).offset(m)})}),O=S(async(n,i)=>{const[e]=await o.select({name:t.name,isActive:t.isActive}).from(t).where(s(t.id,i)).limit(1);return e??null}),Y=w({requireAdmin:!0,revalidate:["/casinos"]},async({audit:n},i)=>{const e=await v(i,A),[a]=await o.insert(t).values({name:e.name}).returning({id:t.id}).catch(r=>{if(D(r))return[];throw r});if(!a)throw c("casino_name_exists",{field:"name"});return await n({action:"casino.create",target:{type:"casino",id:a.id,label:e.name}}),l({id:a.id},"Toasts.casinoCreated")}),Z=w({requireAdmin:!0,revalidate:["/casinos"]},async({audit:n},i,e)=>{const a=await v(e,A),[r,d]=await Promise.all([o.select({id:t.id}).from(t).where(s(t.id,i)).limit(1),o.select({id:t.id}).from(t).where(f(s(t.name,a.name),C(t.id,i))).limit(1)]);if(!r[0])throw c("casino_not_found",{toast:!0});if(d[0])throw c("casino_name_exists",{field:"name"});return await o.update(t).set({name:a.name}).where(s(t.id,i)),await n({action:"casino.update",target:{type:"casino",id:i,label:a.name}}),l({id:i},"Toasts.casinoUpdated")}),I=x({requireAdmin:!0,revalidate:["/casinos"]},async({audit:n},i,e)=>{const[a]=await o.update(t).set({isActive:e}).where(f(s(t.id,i),C(t.isActive,e))).returning({id:t.id,name:t.name});if(!a){const[r]=await o.select({id:t.id}).from(t).where(s(t.id,i)).limit(1);throw r?c(e?"casino_already_active":"casino_already_inactive",{toast:!0}):c("casino_not_found",{toast:!0})}return await n({action:e?"casino.activate":"casino.deactivate",target:{type:"casino",id:a.id,label:a.name},metadata:{isActive:e}}),await T(i),l(e?"Toasts.casinoActivated":"Toasts.casinoDeactivated")}),tt=w({requireAdmin:!0,revalidate:["/casinos"]},async({audit:n},i,e)=>{const[a]=await o.select({id:t.id,name:t.name}).from(t).where(s(t.id,i)).limit(1);if(!a)throw c("casino_not_found",{toast:!0});const[r]=await o.select({n:p()}).from(h).where(s(h.casinoId,i));if((r?.n??0)>0)throw c("casino_has_campaigns",{toast:!0});const[d]=await o.select({n:p()}).from(y).where(s(y.casinoId,i));if((d?.n??0)>0)throw c("casino_in_commission",{toast:!0});return await o.transaction(async u=>{await u.delete(t).where(s(t.id,i)).catch(m=>{throw q(m)?c("casino_in_use",{toast:!0}):m}),await n({action:"casino.delete",target:{type:"casino",id:i,label:a.name}},u)}),l("Toasts.casinoDeleted")});export{Y as createCasinoAction,tt as deleteCasinoAction,O as getCasinoEditData,J as listCasinos,I as setCasinoActiveAction,Z as updateCasinoAction};
@@ -0,0 +1 @@
1
+ export declare function CasinoCreateButton(): import("react").JSX.Element;
@@ -0,0 +1 @@
1
+ "use client";import{Fragment as p,jsx as i,jsxs as r}from"react/jsx-runtime";import{IconPlus as n}from"@tabler/icons-react";import{useTranslations as t}from"next-intl";import{Button as a}from"../../../components/ui/button.js";import{Spinner as s}from"../../../components/ui/spinner.js";import{CasinoDialog as l}from"./casino-dialog.js";import{useDeferredDialog as m}from"../../../lib/hooks/use-deferred-dialog.js";function b(){const e=t("Casinos"),o=m(()=>Promise.resolve(null));return r(p,{children:[r(a,{variant:"primary",size:"sm",type:"button",onClick:o.trigger,disabled:o.isLoading,"aria-label":e("createTitle"),children:[o.isLoading?i(s,{}):i(n,{size:16,"aria-hidden":!0}),i("span",{className:"hidden sm:inline",children:e("createTitle")})]}),i(l,{mode:"create",controller:o})]})}export{b as CasinoCreateButton};
@@ -0,0 +1,11 @@
1
+ import { type CasinoEditData } from "../actions.js";
2
+ import type { DeferredDialogController } from "../../../lib/hooks/use-deferred-dialog.js";
3
+ export type CasinoDialogProps = {
4
+ mode: "create";
5
+ controller: DeferredDialogController<null>;
6
+ } | {
7
+ mode: "edit";
8
+ casinoId: string;
9
+ controller: DeferredDialogController<CasinoEditData>;
10
+ };
11
+ export declare function CasinoDialog(props: CasinoDialogProps): import("react").JSX.Element;
@@ -0,0 +1 @@
1
+ "use client";import{jsx as e,jsxs as m}from"react/jsx-runtime";import{useTranslations as c}from"next-intl";import{use as F,useActionState as D}from"react";import{ActionForm as b}from"../../../components/ui/action-form.js";import{Button as u}from"../../../components/ui/button.js";import{Dialog as S,DialogBody as y,DialogClose as P,DialogContent as p,DialogDescription as A,DialogFooter as O,DialogHeader as v,DialogTitle as E}from"../../../components/ui/dialog.js";import{createCasinoAction as I,updateCasinoAction as T}from"../actions.js";import{CasinoFormFields as k}from"./casino-form-fields.js";function q(o){const t=c("Casinos"),n=c("Common");return e(S,{open:o.controller.open,onOpenChange:o.controller.setOpen,disablePointerDismissal:!0,children:m(p,{closeLabel:n("close"),children:[m(v,{children:[e(E,{children:o.mode==="create"?t("createDialogTitle"):t("editDialogTitle")}),e(A,{children:o.mode==="create"?t("createDialogDesc"):t("editDialogDesc")})]}),o.mode==="create"?e(B,{onSuccess:()=>o.controller.setOpen(!1)}):o.controller.promise&&e(L,{casinoId:o.casinoId,dataPromise:o.controller.promise,onSuccess:()=>o.controller.setOpen(!1)},o.casinoId)]})})}function B({onSuccess:o}){const t=c("Common"),[n,a,i]=D(async(s,r)=>{const l=await I(s,r);return l?.ok&&o(),l},void 0);return e(g,{action:a,state:n,isPending:i,submitLabel:t(i?"creating":"create"),resetOnSuccess:!0})}function L({casinoId:o,dataPromise:t,onSuccess:n}){const a=F(t),i=c("Casinos"),[s,r,l]=D(async(C,f)=>{const d=await T(o,C,f);return d?.ok&&n(),d},void 0);return e(g,{action:r,state:s,isPending:l,submitLabel:i(l?"saving":"save"),defaults:a})}function g({action:o,state:t,isPending:n,submitLabel:a,resetOnSuccess:i=!1,defaults:s}){const r=c("Common");return m(b,{action:o,actionState:t,resetOnSuccess:i,className:"contents",errorClassName:"mx-6 mt-4",children:[e(y,{children:e(k,{defaults:s})}),m(O,{children:[e(P,{render:e(u,{type:"button",variant:"secondary",size:"sm"}),children:r("cancel")}),e(u,{type:"submit",size:"sm",disabled:n,children:a})]})]})}export{q as CasinoDialog};
@@ -0,0 +1,7 @@
1
+ type Defaults = {
2
+ name?: string;
3
+ };
4
+ export declare function CasinoFormFields({ defaults }: {
5
+ defaults?: Defaults;
6
+ }): import("react").JSX.Element;
7
+ export {};
@@ -0,0 +1 @@
1
+ "use client";import{jsx as e}from"react/jsx-runtime";import{useTranslations as o}from"next-intl";import{FormField as m}from"../../../components/ui/form-field.js";import{Input as l}from"../../../components/ui/input.js";import{NAME_MAX as n}from"../../../lib/validation/zod.js";function u({defaults:a={}}){const t=o("Casinos");return e("div",{className:"flex flex-col gap-5",children:e(m,{name:"name",label:t("nameLabel"),children:e(l,{name:"name",type:"text","aria-required":"true",maxLength:n,defaultValue:a.name??"",autoComplete:"off"})})})}export{u as CasinoFormFields};
@@ -0,0 +1 @@
1
+ export declare function CasinoStatusTabs(): import("react").JSX.Element;
@@ -0,0 +1 @@
1
+ "use client";import{jsx as a,jsxs as d}from"react/jsx-runtime";import{useTranslations as i}from"next-intl";import{useQueryStates as T}from"nuqs";import{useTransition as u}from"react";import{Tabs as m,TabsIndicator as p,TabsList as b,TabsTab as S}from"../../../components/ui/tabs.js";import{CASINO_STATUSES as f,casinoStatusParser as l}from"../list-params.js";import{listSearchParsers as c}from"../../../lib/list-params.js";function I(){const t=i("Casinos.Tabs"),[r,e]=u(),[{status:n},o]=T({status:l,page:c.page},{shallow:!1,clearOnDefault:!0,startTransition:e});return a(m,{value:n,onValueChange:s=>o({status:s,page:null}),"data-pending":r?"":void 0,children:d(b,{children:[f.map(s=>a(S,{value:s,children:t(s)},s)),a(p,{})]})})}export{I as CasinoStatusTabs};
@@ -0,0 +1,6 @@
1
+ import type { Casino } from "../../../db/schema/index.js";
2
+ import { type ListResult } from "../../../lib/list-params.js";
3
+ export declare function CasinosTable({ result, now, }: {
4
+ result: ListResult<Casino>;
5
+ now: Date;
6
+ }): import("react").JSX.Element;
@@ -0,0 +1 @@
1
+ "use client";import{jsx as e,jsxs as a}from"react/jsx-runtime";import{IconBuildingStore as u,IconDots as v,IconLock as D,IconLockOpen as C,IconPencil as h,IconTrash as w}from"@tabler/icons-react";import{useLocale as A,useTranslations as p}from"next-intl";import{useMemo as b,useState as x,useTransition as I}from"react";import{DataTable as S}from"../../../components/ui/data-table.js";import{DropdownMenu as y,DropdownMenuContent as z,DropdownMenuItem as m,DropdownMenuSeparator as M,DropdownMenuTrigger as T}from"../../../components/ui/dropdown-menu.js";import{Identity as N}from"../../../components/ui/identity.js";import{SortButton as f}from"../../../components/ui/sort-button.js";import{Spinner as k}from"../../../components/ui/spinner.js";import{StatusBadge as g}from"../../../components/ui/status-badge.js";import{TablePagination as B}from"../../../components/ui/table-pagination.js";import{getCasinoEditData as L,setCasinoActiveAction as O}from"../actions.js";import{CasinoDialog as P}from"./casino-dialog.js";import{DeleteCasinoConfirm as R}from"./delete-casino-confirm.js";import{useDeferredDialog as j}from"../../../lib/hooks/use-deferred-dialog.js";import{useFormatDateTime as E}from"../../../lib/i18n/format-datetime.js";import{formatRelative as _}from"../../../lib/i18n/relative-time.js";import{PAGE_SIZE_OPTIONS as F}from"../../../lib/list-params.js";import{toastActionResult as G}from"../../../lib/toast.js";function se({result:t,now:n}){const o=p("Casinos"),s=A(),r=E(),c=b(()=>[{id:"name",header:()=>e(f,{column:"name",children:o("columnName")}),cell:({row:i})=>e(N,{visual:e("div",{className:"flex size-9 shrink-0 items-center justify-center rounded-full bg-muted text-muted-foreground",children:e(u,{size:18,"aria-hidden":!0})}),primary:i.original.name})},{id:"status",header:()=>o("columnStatus"),cell:({row:i})=>i.original.isActive?e(g,{tone:"success",children:o("statusActive")}):e(g,{tone:"danger",children:o("statusDeactivated")})},{id:"createdAt",header:()=>e(f,{column:"createdAt",children:o("columnCreated")}),cell:({row:i})=>{const d=i.original.createdAt;return e("span",{className:"text-sm text-muted-foreground tabular-nums",title:r(d),children:_(s,d,n)})}},{id:"actions",header:()=>e("span",{className:"sr-only",children:o("columnActions")}),cell:({row:i})=>e(Z,{casino:i.original}),meta:{pin:"right",className:"text-right"}}],[o,s,r,n]);return e(S,{data:t.rows,columns:c,getRowId:i=>i.id,empty:a("div",{className:"flex flex-col items-center gap-3 py-4",children:[e("div",{className:"flex size-10 items-center justify-center rounded-full bg-muted text-muted-foreground",children:e(u,{size:18,"aria-hidden":!0})}),e("span",{children:o("empty")})]}),pagination:e(B,{page:t.page,pageSize:t.pageSize,totalPages:t.totalPages,pageSizeOptions:F})})}function Z({casino:t}){const n=p("Casinos"),o=j(async()=>{const l=await L(t.id);if(!l)throw new Error("casino_not_found");return l}),[s,r]=x(!1),[c,i]=I(),d=()=>{i(async()=>{G(await O(t.id,!t.isActive))})};return a("div",{className:"flex justify-end",children:[a(y,{children:[e(T,{"aria-label":n("rowActions"),disabled:o.isLoading,className:"inline-flex size-7 cursor-pointer items-center justify-center rounded-md text-muted-foreground outline-none hover:bg-accent hover:text-accent-foreground focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-card data-popup-open:bg-accent data-popup-open:text-accent-foreground",children:o.isLoading?e(k,{}):e(v,{size:16,"aria-hidden":!0})}),a(z,{children:[a(m,{onClick:o.trigger,children:[e(h,{size:14,"aria-hidden":!0,className:"text-muted-foreground"}),n("edit")]}),e(M,{}),a(m,{variant:t.isActive?"destructive":"default",onClick:d,disabled:c,children:[t.isActive?e(D,{size:14,"aria-hidden":!0}):e(C,{size:14,"aria-hidden":!0}),t.isActive?n("deactivate"):n("activate")]}),a(m,{variant:"destructive",onClick:()=>r(!0),children:[e(w,{size:14,"aria-hidden":!0}),n("delete")]})]})]}),e(P,{mode:"edit",casinoId:t.id,controller:o}),e(R,{casinoId:t.id,open:s,onOpenChange:r})]})}export{se as CasinosTable};
@@ -0,0 +1,5 @@
1
+ export declare function DeleteCasinoConfirm({ casinoId, open, onOpenChange, }: {
2
+ casinoId: string;
3
+ open: boolean;
4
+ onOpenChange: (open: boolean) => void;
5
+ }): import("react").JSX.Element;
@@ -0,0 +1 @@
1
+ "use client";import{jsx as o,jsxs as s}from"react/jsx-runtime";import{useTranslations as r}from"next-intl";import{useActionState as d,useEffect as p}from"react";import{ActionForm as A}from"../../../components/ui/action-form.js";import{AlertDialog as g,AlertDialogClose as u,AlertDialogContent as C,AlertDialogDescription as b,AlertDialogFooter as v,AlertDialogTitle as F}from"../../../components/ui/alert-dialog.js";import{Button as a}from"../../../components/ui/button.js";import{deleteCasinoAction as y}from"../actions.js";function E({casinoId:c,open:m,onOpenChange:t}){const e=r("Casinos"),l=r("Common"),f=y.bind(null,c),[i,D,n]=d(f,void 0);return p(()=>{i?.ok&&t(!1)},[i,t]),o(g,{open:m,onOpenChange:t,children:s(C,{children:[o(F,{children:e("deleteConfirm")}),o(b,{children:e("deleteDescription")}),o(A,{action:D,actionState:i,className:"flex flex-col gap-3",children:s(v,{children:[o(u,{render:o(a,{type:"button",variant:"secondary",size:"sm",disabled:n,children:l("cancel")})}),o(a,{type:"submit",variant:"destructive",size:"sm",disabled:n,children:n?e("deleting"):l("confirmDelete")})]})})]})})}export{E as DeleteCasinoConfirm};
@@ -0,0 +1,14 @@
1
+ export declare const CASINO_SORT_KEYS: readonly ["name", "createdAt"];
2
+ export type CasinoSortKey = (typeof CASINO_SORT_KEYS)[number];
3
+ export declare const CASINO_STATUSES: readonly ["all", "active", "inactive"];
4
+ export type CasinoStatusFilter = (typeof CASINO_STATUSES)[number];
5
+ export declare const casinoStatusParser: Omit<import("nuqs/server").SingleParserBuilder<"active" | "all" | "inactive">, "parseServerSide"> & {
6
+ readonly defaultValue: NonNullable<"active" | "all" | "inactive">;
7
+ parseServerSide(value: string | string[] | undefined): NonNullable<"active" | "all" | "inactive">;
8
+ };
9
+ export declare const loadCasinoStatus: import("nuqs/server").LoaderFunction<{
10
+ status: Omit<import("nuqs/server").SingleParserBuilder<"active" | "all" | "inactive">, "parseServerSide"> & {
11
+ readonly defaultValue: NonNullable<"active" | "all" | "inactive">;
12
+ parseServerSide(value: string | string[] | undefined): NonNullable<"active" | "all" | "inactive">;
13
+ };
14
+ }>;
@@ -0,0 +1 @@
1
+ import{createLoader as t,parseAsStringLiteral as e}from"nuqs/server";const s=["name","createdAt"],a=["all","active","inactive"],o=e(a).withDefault("all"),S=t({status:o});export{s as CASINO_SORT_KEYS,a as CASINO_STATUSES,o as casinoStatusParser,S as loadCasinoStatus};