From 40cbe92dbc33dc1c55a7dbc72171cd9a5c2b28f2 Mon Sep 17 00:00:00 2001 From: Prospector <6166773+Prospector@users.noreply.github.com> Date: Sun, 2 Nov 2025 11:32:18 -0800 Subject: [PATCH] Affiliates frontend (#4380) * Begin affiliates frontend * Significant work on hooking up affiliates ui * Clean up server nodes menu * affiliates work * update affiliate time * oops * fix local import * fix local import x2 * remove line in dashboard * lint --- apps/frontend/src/composables/affiliates.ts | 22 ++ apps/frontend/src/layouts/default.vue | 32 +- apps/frontend/src/locales/en-US/index.json | 33 ++ apps/frontend/src/pages/admin/affiliates.vue | 281 ++++++++++++++++++ .../src/pages/admin/servers/nodes.vue | 1 + apps/frontend/src/pages/dashboard.vue | 17 +- .../src/pages/dashboard/affiliate-links.vue | 202 +++++++++++++ apps/frontend/src/pages/servers/index.vue | 21 +- apps/frontend/src/pages/user/[id].vue | 120 ++++++-- packages/assets/external/facebook.svg | 1 + packages/assets/external/instagram.svg | 1 + packages/assets/external/reels.svg | 3 + packages/assets/external/snapchat.svg | 1 + packages/assets/external/threads.svg | 1 + packages/assets/external/tiktok.svg | 1 + packages/assets/external/twitch.svg | 1 + packages/assets/external/youtubegaming.svg | 1 + packages/assets/external/youtubeshorts.svg | 1 + packages/assets/generated-icons.ts | 6 + packages/assets/icons/affiliate.svg | 11 + packages/assets/icons/circle-user.svg | 1 + packages/assets/icons/user-search.svg | 1 + packages/assets/index.ts | 20 +- .../affiliate/AffiliateLinkCard.vue | 72 +++++ .../affiliate/AffiliateLinkCreateModal.vue | 165 ++++++++++ .../ui/src/components/base/AutoBrandIcon.vue | 153 ++++++++++ .../billing/ModrinthServersPurchaseModal.vue | 3 + packages/ui/src/components/index.ts | 5 + packages/ui/src/composables/stripe.ts | 9 + packages/ui/src/locales/en-US/index.json | 39 +++ packages/ui/src/utils/billing.ts | 1 + packages/ui/src/utils/common-messages.ts | 4 + packages/utils/types.ts | 9 + 33 files changed, 1202 insertions(+), 37 deletions(-) create mode 100644 apps/frontend/src/composables/affiliates.ts create mode 100644 apps/frontend/src/pages/admin/affiliates.vue create mode 100644 apps/frontend/src/pages/dashboard/affiliate-links.vue create mode 100644 packages/assets/external/facebook.svg create mode 100644 packages/assets/external/instagram.svg create mode 100644 packages/assets/external/reels.svg create mode 100644 packages/assets/external/snapchat.svg create mode 100644 packages/assets/external/threads.svg create mode 100644 packages/assets/external/tiktok.svg create mode 100644 packages/assets/external/twitch.svg create mode 100644 packages/assets/external/youtubegaming.svg create mode 100644 packages/assets/external/youtubeshorts.svg create mode 100644 packages/assets/icons/affiliate.svg create mode 100644 packages/assets/icons/circle-user.svg create mode 100644 packages/assets/icons/user-search.svg create mode 100644 packages/ui/src/components/affiliate/AffiliateLinkCard.vue create mode 100644 packages/ui/src/components/affiliate/AffiliateLinkCreateModal.vue create mode 100644 packages/ui/src/components/base/AutoBrandIcon.vue diff --git a/apps/frontend/src/composables/affiliates.ts b/apps/frontend/src/composables/affiliates.ts new file mode 100644 index 000000000..3e23c3b3e --- /dev/null +++ b/apps/frontend/src/composables/affiliates.ts @@ -0,0 +1,22 @@ +export const useAffiliates = () => { + const affiliateCookie = useCookie('mrs_afl', { + maxAge: 60 * 60 * 24 * 7, // 7 days + sameSite: 'lax', + secure: true, + httpOnly: false, + path: '/', + }) + + const setAffiliateCode = (code: string) => { + affiliateCookie.value = code + } + + const getAffiliateCode = (): string | undefined => { + return affiliateCookie.value || undefined + } + + return { + setAffiliateCode, + getAffiliateCode, + } +} diff --git a/apps/frontend/src/layouts/default.vue b/apps/frontend/src/layouts/default.vue index 3e75317be..abfefe743 100644 --- a/apps/frontend/src/layouts/default.vue +++ b/apps/frontend/src/layouts/default.vue @@ -455,6 +455,12 @@ link: '/admin/user_email', shown: isAdmin(auth.user), }, + { + id: 'affiliates', + color: 'primary', + link: '/admin/affiliates', + shown: isAdmin(auth.user), + }, { id: 'servers-notices', color: 'primary', @@ -478,7 +484,7 @@