@amogads/ui 1.1.5 → 1.1.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +1154 -1469
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +1071 -1397
- package/dist/index.mjs.map +1 -1
- package/dist/pages.js +2070 -2205
- package/dist/pages.js.map +1 -1
- package/dist/pages.mjs +1378 -1512
- package/dist/pages.mjs.map +1 -1
- package/dist/server.js +6 -3
- package/dist/server.js.map +1 -1
- package/dist/server.mjs +6 -3
- package/dist/server.mjs.map +1 -1
- package/dist/services.js +6 -1
- package/dist/services.js.map +1 -1
- package/dist/services.mjs +6 -1
- package/dist/services.mjs.map +1 -1
- package/dist/stores.js +1 -0
- package/dist/stores.js.map +1 -1
- package/dist/stores.mjs +1 -0
- package/dist/stores.mjs.map +1 -1
- package/package.json +1 -1
package/dist/stores.js
CHANGED
package/dist/stores.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/stores/index.ts","../src/stores/auth-store.ts","../src/lib/cookies.ts","../src/stores/notification-store.ts","../src/lib/supabase/client.ts","../src/stores/voucher-store.ts","../src/features/link-maker/store.ts"],"sourcesContent":["/**\n * Amoga Design System — State Stores\n */\n\nexport * from './auth-store'\nexport * from './notification-store'\nexport * from './voucher-store'\nexport * from './link-maker-store'\n","import { create } from 'zustand'\r\nimport { getCookie, setCookie, removeCookie } from '@/lib/cookies'\r\n\r\nconst ACCESS_TOKEN = 'thisisjustarandomstring'\r\nconst USER_DATA = 'auth_user_data'\r\n\r\ninterface AuthUser {\r\n id: string // 👈 ADD THIS - the auth.uid() from Supabase\r\n accountNo: string\r\n email: string\r\n name?: string\r\n picture?: string\r\n role: string[]\r\n exp: number\r\n}\r\n\r\ninterface AuthState {\r\n auth: {\r\n user: AuthUser | null\r\n setUser: (user: AuthUser | null) => void\r\n accessToken: string\r\n setAccessToken: (accessToken: string) => void\r\n resetAccessToken: () => void\r\n reset: () => void\r\n }\r\n}\r\n\r\nexport const useAuthStore = create<AuthState>()((set) => {\r\n const cookieState = getCookie(ACCESS_TOKEN)\r\n let initToken = ''\r\n if (cookieState) {\r\n try {\r\n initToken = JSON.parse(cookieState)\r\n } catch {\r\n removeCookie(ACCESS_TOKEN)\r\n }\r\n }\r\n\r\n const userCookie = getCookie(USER_DATA)\r\n let initUser: AuthUser | null = null\r\n if (userCookie) {\r\n try {\r\n const parsed = JSON.parse(decodeURIComponent(userCookie))\r\n if (parsed.exp && parsed.exp > Date.now()) {\r\n initUser = parsed\r\n } else {\r\n removeCookie(ACCESS_TOKEN)\r\n removeCookie(USER_DATA)\r\n }\r\n } catch {\r\n initUser = null\r\n removeCookie(USER_DATA)\r\n }\r\n }\r\n\r\n return {\r\n auth: {\r\n user: initUser,\r\n setUser: (user) =>\r\n set((state) => {\r\n if (user) {\r\n setCookie(USER_DATA, encodeURIComponent(JSON.stringify(user)))\r\n } else {\r\n removeCookie(USER_DATA)\r\n }\r\n return { ...state, auth: { ...state.auth, user } }\r\n }),\r\n accessToken: initUser ? initToken : '',\r\n setAccessToken: (accessToken) =>\r\n set((state) => {\r\n setCookie(ACCESS_TOKEN, JSON.stringify(accessToken))\r\n return { ...state, auth: { ...state.auth, accessToken } }\r\n }),\r\n resetAccessToken: () =>\r\n set((state) => {\r\n removeCookie(ACCESS_TOKEN)\r\n return { ...state, auth: { ...state.auth, accessToken: '' } }\r\n }),\r\n reset: () =>\r\n set((state) => {\r\n removeCookie(ACCESS_TOKEN)\r\n removeCookie(USER_DATA)\r\n return {\r\n ...state,\r\n auth: { ...state.auth, user: null, accessToken: '' },\r\n }\r\n }),\r\n },\r\n }\r\n})","/**\r\n * Cookie utility functions using manual document.cookie approach\r\n * Replaces js-cookie dependency for better consistency\r\n */\r\n\r\nconst DEFAULT_MAX_AGE = 60 * 60 * 24 * 7 // 7 days\r\n\r\n/**\r\n * Get a cookie value by name\r\n */\r\nexport function getCookie(name: string): string | undefined {\r\n if (typeof document === 'undefined') return undefined\r\n\r\n const value = `; ${document.cookie}`\r\n const parts = value.split(`; ${name}=`)\r\n if (parts.length === 2) {\r\n const cookieValue = parts.pop()?.split(';').shift()\r\n return cookieValue\r\n }\r\n return undefined\r\n}\r\n\r\n/**\r\n * Set a cookie with name, value, and optional max age\r\n */\r\nexport function setCookie(\r\n name: string,\r\n value: string,\r\n maxAge: number = DEFAULT_MAX_AGE\r\n): void {\r\n if (typeof document === 'undefined') return\r\n\r\n document.cookie = `${name}=${value}; path=/; max-age=${maxAge}`\r\n}\r\n\r\n/**\r\n * Remove a cookie by setting its max age to 0\r\n */\r\nexport function removeCookie(name: string): void {\r\n if (typeof document === 'undefined') return\r\n\r\n document.cookie = `${name}=; path=/; max-age=0`\r\n}\r\n","import { create } from 'zustand'\r\nimport { createClient } from '@/lib/supabase/client'\r\nimport { RealtimeChannel } from '@supabase/supabase-js'\r\n\r\nexport interface DbNotification {\r\n id: string\r\n user_id: string\r\n sender_id: string | null\r\n message_id: string | null\r\n message_text: string\r\n read: boolean\r\n created_at: string\r\n}\r\n\r\ninterface NotificationState {\r\n notifications: DbNotification[]\r\n unreadCount: number\r\n isLoading: boolean\r\n fetchNotifications: (userId: string) => Promise<void>\r\n markAsRead: (notificationId: string) => Promise<void>\r\n markAllAsRead: (userId: string) => Promise<void>\r\n deleteNotification: (notificationId: string) => Promise<void>\r\n subscribeToNotifications: (userId: string) => void\r\n unsubscribe: () => void\r\n}\r\n\r\nlet activeChannel: RealtimeChannel | null = null\r\n\r\nexport const useNotificationStore = create<NotificationState>((set, get) => ({\r\n notifications: [],\r\n unreadCount: 0,\r\n isLoading: false,\r\n\r\n fetchNotifications: async (userId: string) => {\r\n set({ isLoading: true })\r\n const supabase = createClient()\r\n try {\r\n const { data, error } = await supabase\r\n .from('notifications')\r\n .select('*')\r\n .eq('user_id', userId)\r\n .order('created_at', { ascending: false })\r\n\r\n if (error) throw error\r\n\r\n const notifications = data || []\r\n const unreadCount = notifications.filter((n: DbNotification) => !n.read).length\r\n set({ notifications, unreadCount })\r\n } catch (e) {\r\n console.error('[NotificationStore] Failed to fetch notifications:', e)\r\n } finally {\r\n set({ isLoading: false })\r\n }\r\n },\r\n\r\n markAsRead: async (notificationId: string) => {\r\n const supabase = createClient()\r\n try {\r\n const { error } = await supabase\r\n .from('notifications')\r\n .update({ read: true })\r\n .eq('id', notificationId)\r\n\r\n if (error) throw error\r\n\r\n set((state) => {\r\n const updated = state.notifications.map((n) =>\r\n n.id === notificationId ? { ...n, read: true } : n\r\n )\r\n const unreadCount = updated.filter((n) => !n.read).length\r\n return { notifications: updated, unreadCount }\r\n })\r\n } catch (e) {\r\n console.error('[NotificationStore] Failed to mark notification as read:', e)\r\n }\r\n },\r\n\r\n markAllAsRead: async (userId: string) => {\r\n const supabase = createClient()\r\n try {\r\n const { error } = await supabase\r\n .from('notifications')\r\n .update({ read: true })\r\n .eq('user_id', userId)\r\n .eq('read', false)\r\n\r\n if (error) throw error\r\n\r\n set((state) => {\r\n const updated = state.notifications.map((n) => ({ ...n, read: true }))\r\n return { notifications: updated, unreadCount: 0 }\r\n })\r\n } catch (e) {\r\n console.error('[NotificationStore] Failed to mark all notifications as read:', e)\r\n }\r\n },\r\n\r\n deleteNotification: async (notificationId: string) => {\r\n const supabase = createClient()\r\n try {\r\n const { error } = await supabase\r\n .from('notifications')\r\n .delete()\r\n .eq('id', notificationId)\r\n\r\n if (error) throw error\r\n\r\n set((state) => {\r\n const updated = state.notifications.filter((n) => n.id !== notificationId)\r\n const unreadCount = updated.filter((n) => !n.read).length\r\n return { notifications: updated, unreadCount }\r\n })\r\n } catch (e) {\r\n console.error('[NotificationStore] Failed to delete notification:', e)\r\n }\r\n },\r\n\r\n subscribeToNotifications: (userId: string) => {\r\n try {\r\n if (!userId) return\r\n\r\n const supabase = createClient()\r\n\r\n if (activeChannel && activeUserId === userId) {\r\n return\r\n }\r\n\r\n if (activeChannel) {\r\n try {\r\n supabase.removeChannel(activeChannel)\r\n } catch (_) {}\r\n activeChannel = null\r\n activeUserId = null\r\n }\r\n\r\n const channelTopic = `notifications-user-${userId}-${Date.now()}-${Math.random().toString(36).slice(2, 6)}`\r\n const channel = supabase.channel(channelTopic)\r\n\r\n channel\r\n .on(\r\n 'postgres_changes',\r\n {\r\n event: '*',\r\n schema: 'public',\r\n table: 'notifications',\r\n filter: `user_id=eq.${userId}`,\r\n },\r\n (payload: any) => {\r\n const { eventType, new: newRecord, old: oldRecord } = payload\r\n\r\n if (eventType === 'INSERT') {\r\n const inserted = newRecord as DbNotification\r\n set((state) => {\r\n if (state.notifications.some((n) => n.id === inserted.id)) {\r\n return {}\r\n }\r\n const updated = [inserted, ...state.notifications]\r\n const unreadCount = updated.filter((n) => !n.read).length\r\n return { notifications: updated, unreadCount }\r\n })\r\n } else if (eventType === 'UPDATE') {\r\n const updatedRecord = newRecord as DbNotification\r\n set((state) => {\r\n const updated = state.notifications.map((n) =>\r\n n.id === updatedRecord.id ? updatedRecord : n\r\n )\r\n const unreadCount = updated.filter((n) => !n.read).length\r\n return { notifications: updated, unreadCount }\r\n })\r\n } else if (eventType === 'DELETE') {\r\n const deletedId = oldRecord?.id\r\n if (!deletedId) return\r\n set((state) => {\r\n const updated = state.notifications.filter((n) => n.id !== deletedId)\r\n const unreadCount = updated.filter((n) => !n.read).length\r\n return { notifications: updated, unreadCount }\r\n })\r\n }\r\n }\r\n )\r\n .subscribe()\r\n\r\n activeChannel = channel\r\n activeUserId = userId\r\n } catch (err) {\r\n console.warn('[NotificationStore] Realtime subscription error:', err)\r\n }\r\n },\r\n\r\n unsubscribe: () => {\r\n try {\r\n if (activeChannel) {\r\n const supabase = createClient()\r\n supabase.removeChannel(activeChannel)\r\n activeChannel = null\r\n activeUserId = null\r\n }\r\n } catch (err) {\r\n console.warn('[NotificationStore] Unsubscribe error:', err)\r\n }\r\n },\r\n}))\r\n","import { createBrowserClient } from '@supabase/ssr'\r\n\r\nlet clientSingleton: ReturnType<typeof createBrowserClient> | null = null\r\n\r\nexport function createClient() {\r\n if (typeof window === 'undefined') {\r\n return createBrowserClient(\r\n process.env.NEXT_PUBLIC_SUPABASE_URL!,\r\n process.env.NEXT_PUBLIC_SUPABASE_PUBLISHABLE_KEY!\r\n )\r\n }\r\n\r\n if (!clientSingleton) {\r\n clientSingleton = createBrowserClient(\r\n process.env.NEXT_PUBLIC_SUPABASE_URL!,\r\n process.env.NEXT_PUBLIC_SUPABASE_PUBLISHABLE_KEY!\r\n )\r\n }\r\n return clientSingleton;\r\n}\r\n","import { create } from 'zustand'\nimport { persist } from 'zustand/middleware'\n\nexport interface SavedVoucher {\n id: string\n voucherNo: string\n date: string\n from: string\n userName: string\n status: 'Active' | 'Redeemed' | 'Expired'\n fileName: string\n pdfUrl?: string\n editedJson?: any\n createdAt: string\n // DB-specific fields\n originalFileUrl?: string\n editedFileUrl?: string\n dbId?: string\n _selectedAt?: number\n}\n\ninterface VoucherStoreState {\n // Local vouchers (from DB fetch or local persist fallback)\n vouchers: SavedVoucher[]\n selectedVoucher: SavedVoucher | null\n dbLoaded: boolean\n\n setSelectedVoucher: (voucher: SavedVoucher | null) => void\n setVouchers: (vouchers: SavedVoucher[]) => void\n addVoucher: (voucher: Omit<SavedVoucher, 'id' | 'createdAt'>) => SavedVoucher\n updateVoucher: (id: string, updates: Partial<SavedVoucher>) => void\n deleteVoucher: (id: string) => void\n setDbLoaded: (v: boolean) => void\n}\n\nexport const useVoucherStore = create<VoucherStoreState>()(\n persist(\n (set) => ({\n vouchers: [],\n selectedVoucher: null,\n dbLoaded: false,\n setSelectedVoucher: (voucher) => set({ selectedVoucher: voucher }),\n setDbLoaded: (v) => set({ dbLoaded: v }),\n\n setVouchers: (vouchers) =>\n set((state) => {\n const map = new Map<string, SavedVoucher>()\n const getFileKey = (v: SavedVoucher) => {\n const name = (v.fileName || '').toLowerCase().trim()\n const url = (v.originalFileUrl || v.editedFileUrl || v.pdfUrl || '').trim()\n if (name && url) return `${name}_${url}`\n if (name) return name\n return v.id\n }\n\n for (const v of vouchers) {\n const key = getFileKey(v)\n if (key) map.set(key, v)\n }\n for (const v of state.vouchers) {\n const key = getFileKey(v)\n if (key && !map.has(key)) map.set(key, v)\n }\n const merged = Array.from(map.values()).sort((a, b) => {\n const timeA = a.createdAt ? new Date(a.createdAt).getTime() : 0\n const timeB = b.createdAt ? new Date(b.createdAt).getTime() : 0\n return timeB - timeA\n })\n return { vouchers: merged }\n }),\n\n addVoucher: (data) => {\n const fileUrlToUse = data.pdfUrl || data.editedFileUrl || data.originalFileUrl\n const newVoucher: SavedVoucher = {\n ...data,\n pdfUrl: fileUrlToUse,\n id: `voucher-${Date.now()}`,\n createdAt: new Date().toISOString(),\n }\n set((state) => ({\n vouchers: [newVoucher, ...state.vouchers],\n selectedVoucher: newVoucher,\n }))\n return newVoucher\n },\n\n updateVoucher: (id, updates) => {\n set((state) => ({\n vouchers: state.vouchers.map((v) =>\n v.id === id ? { ...v, ...updates } : v\n ),\n selectedVoucher:\n state.selectedVoucher?.id === id\n ? { ...state.selectedVoucher, ...updates }\n : state.selectedVoucher,\n }))\n },\n\n deleteVoucher: (id) => {\n set((state) => ({\n vouchers: state.vouchers.filter((v) => v.id !== id),\n selectedVoucher:\n state.selectedVoucher?.id === id ? null : state.selectedVoucher,\n }))\n },\n }),\n {\n name: 'vouchers-storage-v4',\n partialize: (state) => ({\n // Do NOT persist vouchers array globally in localStorage to prevent user data leakage across accounts\n selectedVoucher: null,\n }),\n }\n\n )\n)\n","import { create } from 'zustand'\r\nimport { persist } from 'zustand/middleware'\r\nimport { LinkTreeConfig, Project, LinkItem, SocialItem, ThemeConfig, ProfileConfig } from './types'\r\n\r\ninterface LinkMakerState {\r\n config: LinkTreeConfig\r\n projects: Project[]\r\n activeProjectId: string | null\r\n activeShortUrl: string | null\r\n activeShortUrlSuffix: string | null\r\n activeExpiresAt: string | null\r\n \r\n // Profile actions\r\n updateProfile: (profile: Partial<ProfileConfig>) => void\r\n \r\n // Link actions\r\n addLink: () => void\r\n updateLink: (id: string, updates: Partial<LinkItem>) => void\r\n removeLink: (id: string) => void\r\n reorderLinks: (index: number, direction: 'up' | 'down') => void\r\n \r\n // Social actions\r\n updateSocial: (platform: string, url: string, isEnabled: boolean) => void\r\n \r\n // Theme actions\r\n updateTheme: (themeUpdates: Partial<ThemeConfig>) => void\r\n \r\n // Project management actions\r\n saveProject: (name?: string) => string\r\n loadProject: (id: string) => void\r\n deleteProject: (id: string) => void\r\n createNewProject: (name: string) => void\r\n resetConfig: () => void\r\n\r\n // Tracking actions\r\n setShortUrl: (shortUrl: string, suffix: string, expiresAt: string) => void\r\n}\r\n\r\nconst DEFAULT_CONFIG: LinkTreeConfig = {\r\n profile: {\r\n name: 'Alex Rivera',\r\n bio: 'Senior UX Architect & Tech Writer | Crafting digital experiences ✨',\r\n avatarUrl: ''\r\n },\r\n links: [],\r\n socials: [],\r\n theme: {\r\n preset: 'custom',\r\n appTheme: 'system',\r\n appColorTheme: 'zinc'\r\n }\r\n}\r\n\r\nexport const useLinkMakerStore = create<LinkMakerState>()(\r\n persist(\r\n (set, get) => ({\r\n config: DEFAULT_CONFIG,\r\n projects: [],\r\n activeProjectId: null,\r\n activeShortUrl: null,\r\n activeShortUrlSuffix: null,\r\n activeExpiresAt: null,\r\n\r\n updateProfile: (profileUpdates) =>\r\n set((state) => ({\r\n config: {\r\n ...state.config,\r\n profile: {\r\n ...state.config.profile,\r\n ...profileUpdates\r\n }\r\n }\r\n })),\r\n\r\n addLink: () =>\r\n set((state) => {\r\n const newLink: LinkItem = {\r\n id: `link-${Date.now()}`,\r\n title: 'New Social Link',\r\n url: 'https://',\r\n icon: 'Link2',\r\n isEnabled: true,\r\n animation: 'none'\r\n }\r\n return {\r\n config: {\r\n ...state.config,\r\n links: [...state.config.links, newLink]\r\n }\r\n }\r\n }),\r\n\r\n updateLink: (id, updates) =>\r\n set((state) => ({\r\n config: {\r\n ...state.config,\r\n links: state.config.links.map((link) =>\r\n link.id === id ? { ...link, ...updates } : link\r\n )\r\n }\r\n })),\r\n\r\n removeLink: (id) =>\r\n set((state) => ({\r\n config: {\r\n ...state.config,\r\n links: state.config.links.filter((link) => link.id !== id)\r\n }\r\n })),\r\n\r\n reorderLinks: (index, direction) =>\r\n set((state) => {\r\n const links = [...state.config.links]\r\n const targetIndex = direction === 'up' ? index - 1 : index + 1\r\n \r\n if (targetIndex < 0 || targetIndex >= links.length) {\r\n return {} // Out of bounds\r\n }\r\n \r\n // Swap links\r\n const temp = links[index]\r\n links[index] = links[targetIndex]\r\n links[targetIndex] = temp\r\n \r\n return {\r\n config: {\r\n ...state.config,\r\n links\r\n }\r\n }\r\n }),\r\n\r\n updateSocial: (platform, url, isEnabled) =>\r\n set((state) => {\r\n const platformExists = state.config.socials.some((s) => s.platform === platform)\r\n let socials = []\r\n \r\n if (platformExists) {\r\n socials = state.config.socials.map((s) =>\r\n s.platform === platform ? { ...s, url, isEnabled } : s\r\n )\r\n } else {\r\n socials = [...state.config.socials, { platform, url, isEnabled }]\r\n }\r\n \r\n return {\r\n config: {\r\n ...state.config,\r\n socials\r\n }\r\n }\r\n }),\r\n\r\n updateTheme: (themeUpdates) =>\r\n set((state) => ({\r\n config: {\r\n ...state.config,\r\n theme: {\r\n ...state.config.theme,\r\n ...themeUpdates\r\n }\r\n }\r\n })),\r\n\r\n saveProject: (name) => {\r\n const state = get()\r\n const projectId = state.activeProjectId || `proj-${Date.now()}`\r\n const projectName = name || (state.activeProjectId \r\n ? state.projects.find((p) => p.id === state.activeProjectId)?.name || 'My Link Tree'\r\n : 'My Link Tree')\r\n \r\n const existingProject = state.projects.find((p) => p.id === projectId)\r\n\r\n const updatedProject: Project = {\r\n id: projectId,\r\n name: projectName,\r\n updatedAt: new Date().toISOString(),\r\n config: state.config,\r\n shortUrl: state.activeShortUrl || existingProject?.shortUrl,\r\n shortUrlSuffix: state.activeShortUrlSuffix || existingProject?.shortUrlSuffix,\r\n expiresAt: state.activeExpiresAt || existingProject?.expiresAt,\r\n }\r\n \r\n const projectIndex = state.projects.findIndex((p) => p.id === projectId)\r\n let updatedProjects = [...state.projects]\r\n \r\n if (projectIndex >= 0) {\r\n updatedProjects[projectIndex] = updatedProject\r\n } else {\r\n updatedProjects.push(updatedProject)\r\n }\r\n \r\n set({\r\n projects: updatedProjects,\r\n activeProjectId: projectId\r\n })\r\n \r\n return projectId\r\n },\r\n\r\n loadProject: (id) => {\r\n const state = get()\r\n const project = state.projects.find((p) => p.id === id)\r\n if (project) {\r\n set({\r\n config: project.config,\r\n activeProjectId: id,\r\n activeShortUrl: project.shortUrl || null,\r\n activeShortUrlSuffix: project.shortUrlSuffix || null,\r\n activeExpiresAt: project.expiresAt || null,\r\n })\r\n }\r\n },\r\n\r\n deleteProject: (id) =>\r\n set((state) => {\r\n const updatedProjects = state.projects.filter((p) => p.id !== id)\r\n const wasActive = state.activeProjectId === id\r\n return {\r\n projects: updatedProjects,\r\n activeProjectId: wasActive ? null : state.activeProjectId,\r\n config: wasActive ? DEFAULT_CONFIG : state.config,\r\n activeShortUrl: wasActive ? null : state.activeShortUrl,\r\n activeShortUrlSuffix: wasActive ? null : state.activeShortUrlSuffix,\r\n activeExpiresAt: wasActive ? null : state.activeExpiresAt,\r\n }\r\n }),\r\n\r\n createNewProject: (name) => {\r\n const id = `proj-${Date.now()}`\r\n const newProject: Project = {\r\n id,\r\n name,\r\n updatedAt: new Date().toISOString(),\r\n config: DEFAULT_CONFIG\r\n }\r\n \r\n set((state) => ({\r\n projects: [...state.projects, newProject],\r\n config: DEFAULT_CONFIG,\r\n activeProjectId: id,\r\n activeShortUrl: null,\r\n activeShortUrlSuffix: null,\r\n activeExpiresAt: null,\r\n }))\r\n },\r\n\r\n resetConfig: () =>\r\n set({\r\n config: DEFAULT_CONFIG,\r\n activeProjectId: null,\r\n activeShortUrl: null,\r\n activeShortUrlSuffix: null,\r\n activeExpiresAt: null,\r\n }),\r\n\r\n setShortUrl: (shortUrl, suffix, expiresAt) =>\r\n set((state) => {\r\n const updatedProjects = state.activeProjectId\r\n ? state.projects.map((p) =>\r\n p.id === state.activeProjectId\r\n ? { ...p, shortUrl, shortUrlSuffix: suffix, expiresAt }\r\n : p\r\n )\r\n : state.projects\r\n\r\n return {\r\n activeShortUrl: shortUrl,\r\n activeShortUrlSuffix: suffix,\r\n activeExpiresAt: expiresAt,\r\n projects: updatedProjects\r\n }\r\n })\r\n }),\r\n {\r\n name: 'link-maker-workspace'\r\n }\r\n )\r\n)\r\n\r\n// Export compatibility alias for cloned components\r\nexport const useLinkBuilderStore = useLinkMakerStore\r\n"],"mappings":"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","names":["import_zustand","import_zustand","import_zustand","import_middleware"]}
|
|
1
|
+
{"version":3,"sources":["../src/stores/index.ts","../src/stores/auth-store.ts","../src/lib/cookies.ts","../src/stores/notification-store.ts","../src/lib/supabase/client.ts","../src/stores/voucher-store.ts","../src/features/link-maker/store.ts"],"sourcesContent":["/**\n * Amoga Design System — State Stores\n */\n\nexport * from './auth-store'\nexport * from './notification-store'\nexport * from './voucher-store'\nexport * from './link-maker-store'\n","import { create } from 'zustand'\r\nimport { getCookie, setCookie, removeCookie } from '@/lib/cookies'\r\n\r\nconst ACCESS_TOKEN = 'thisisjustarandomstring'\r\nconst USER_DATA = 'auth_user_data'\r\n\r\ninterface AuthUser {\r\n id: string // 👈 ADD THIS - the auth.uid() from Supabase\r\n accountNo: string\r\n email: string\r\n name?: string\r\n picture?: string\r\n role: string[]\r\n exp: number\r\n}\r\n\r\ninterface AuthState {\r\n auth: {\r\n user: AuthUser | null\r\n setUser: (user: AuthUser | null) => void\r\n accessToken: string\r\n setAccessToken: (accessToken: string) => void\r\n resetAccessToken: () => void\r\n reset: () => void\r\n }\r\n}\r\n\r\nexport const useAuthStore = create<AuthState>()((set) => {\r\n const cookieState = getCookie(ACCESS_TOKEN)\r\n let initToken = ''\r\n if (cookieState) {\r\n try {\r\n initToken = JSON.parse(cookieState)\r\n } catch {\r\n removeCookie(ACCESS_TOKEN)\r\n }\r\n }\r\n\r\n const userCookie = getCookie(USER_DATA)\r\n let initUser: AuthUser | null = null\r\n if (userCookie) {\r\n try {\r\n const parsed = JSON.parse(decodeURIComponent(userCookie))\r\n if (parsed.exp && parsed.exp > Date.now()) {\r\n initUser = parsed\r\n } else {\r\n removeCookie(ACCESS_TOKEN)\r\n removeCookie(USER_DATA)\r\n }\r\n } catch {\r\n initUser = null\r\n removeCookie(USER_DATA)\r\n }\r\n }\r\n\r\n return {\r\n auth: {\r\n user: initUser,\r\n setUser: (user) =>\r\n set((state) => {\r\n if (user) {\r\n setCookie(USER_DATA, encodeURIComponent(JSON.stringify(user)))\r\n } else {\r\n removeCookie(USER_DATA)\r\n }\r\n return { ...state, auth: { ...state.auth, user } }\r\n }),\r\n accessToken: initUser ? initToken : '',\r\n setAccessToken: (accessToken) =>\r\n set((state) => {\r\n setCookie(ACCESS_TOKEN, JSON.stringify(accessToken))\r\n return { ...state, auth: { ...state.auth, accessToken } }\r\n }),\r\n resetAccessToken: () =>\r\n set((state) => {\r\n removeCookie(ACCESS_TOKEN)\r\n return { ...state, auth: { ...state.auth, accessToken: '' } }\r\n }),\r\n reset: () =>\r\n set((state) => {\r\n removeCookie(ACCESS_TOKEN)\r\n removeCookie(USER_DATA)\r\n return {\r\n ...state,\r\n auth: { ...state.auth, user: null, accessToken: '' },\r\n }\r\n }),\r\n },\r\n }\r\n})","/**\r\n * Cookie utility functions using manual document.cookie approach\r\n * Replaces js-cookie dependency for better consistency\r\n */\r\n\r\nconst DEFAULT_MAX_AGE = 60 * 60 * 24 * 7 // 7 days\r\n\r\n/**\r\n * Get a cookie value by name\r\n */\r\nexport function getCookie(name: string): string | undefined {\r\n if (typeof document === 'undefined') return undefined\r\n\r\n const value = `; ${document.cookie}`\r\n const parts = value.split(`; ${name}=`)\r\n if (parts.length === 2) {\r\n const cookieValue = parts.pop()?.split(';').shift()\r\n return cookieValue\r\n }\r\n return undefined\r\n}\r\n\r\n/**\r\n * Set a cookie with name, value, and optional max age\r\n */\r\nexport function setCookie(\r\n name: string,\r\n value: string,\r\n maxAge: number = DEFAULT_MAX_AGE\r\n): void {\r\n if (typeof document === 'undefined') return\r\n\r\n document.cookie = `${name}=${value}; path=/; max-age=${maxAge}`\r\n}\r\n\r\n/**\r\n * Remove a cookie by setting its max age to 0\r\n */\r\nexport function removeCookie(name: string): void {\r\n if (typeof document === 'undefined') return\r\n\r\n document.cookie = `${name}=; path=/; max-age=0`\r\n}\r\n","import { create } from 'zustand'\r\nimport { createClient } from '@/lib/supabase/client'\r\nimport { RealtimeChannel } from '@supabase/supabase-js'\r\n\r\nexport interface DbNotification {\r\n id: string\r\n user_id: string\r\n sender_id: string | null\r\n message_id: string | null\r\n message_text: string\r\n read: boolean\r\n created_at: string\r\n}\r\n\r\ninterface NotificationState {\r\n notifications: DbNotification[]\r\n unreadCount: number\r\n isLoading: boolean\r\n fetchNotifications: (userId: string) => Promise<void>\r\n markAsRead: (notificationId: string) => Promise<void>\r\n markAllAsRead: (userId: string) => Promise<void>\r\n deleteNotification: (notificationId: string) => Promise<void>\r\n subscribeToNotifications: (userId: string) => void\r\n unsubscribe: () => void\r\n}\r\n\r\nlet activeChannel: RealtimeChannel | null = null\r\nlet activeUserId: string | null = null\r\n\r\nexport const useNotificationStore = create<NotificationState>((set, get) => ({\r\n notifications: [],\r\n unreadCount: 0,\r\n isLoading: false,\r\n\r\n fetchNotifications: async (userId: string) => {\r\n set({ isLoading: true })\r\n const supabase = createClient()\r\n try {\r\n const { data, error } = await supabase\r\n .from('notifications')\r\n .select('*')\r\n .eq('user_id', userId)\r\n .order('created_at', { ascending: false })\r\n\r\n if (error) throw error\r\n\r\n const notifications = data || []\r\n const unreadCount = notifications.filter((n: DbNotification) => !n.read).length\r\n set({ notifications, unreadCount })\r\n } catch (e) {\r\n console.error('[NotificationStore] Failed to fetch notifications:', e)\r\n } finally {\r\n set({ isLoading: false })\r\n }\r\n },\r\n\r\n markAsRead: async (notificationId: string) => {\r\n const supabase = createClient()\r\n try {\r\n const { error } = await supabase\r\n .from('notifications')\r\n .update({ read: true })\r\n .eq('id', notificationId)\r\n\r\n if (error) throw error\r\n\r\n set((state) => {\r\n const updated = state.notifications.map((n) =>\r\n n.id === notificationId ? { ...n, read: true } : n\r\n )\r\n const unreadCount = updated.filter((n) => !n.read).length\r\n return { notifications: updated, unreadCount }\r\n })\r\n } catch (e) {\r\n console.error('[NotificationStore] Failed to mark notification as read:', e)\r\n }\r\n },\r\n\r\n markAllAsRead: async (userId: string) => {\r\n const supabase = createClient()\r\n try {\r\n const { error } = await supabase\r\n .from('notifications')\r\n .update({ read: true })\r\n .eq('user_id', userId)\r\n .eq('read', false)\r\n\r\n if (error) throw error\r\n\r\n set((state) => {\r\n const updated = state.notifications.map((n) => ({ ...n, read: true }))\r\n return { notifications: updated, unreadCount: 0 }\r\n })\r\n } catch (e) {\r\n console.error('[NotificationStore] Failed to mark all notifications as read:', e)\r\n }\r\n },\r\n\r\n deleteNotification: async (notificationId: string) => {\r\n const supabase = createClient()\r\n try {\r\n const { error } = await supabase\r\n .from('notifications')\r\n .delete()\r\n .eq('id', notificationId)\r\n\r\n if (error) throw error\r\n\r\n set((state) => {\r\n const updated = state.notifications.filter((n) => n.id !== notificationId)\r\n const unreadCount = updated.filter((n) => !n.read).length\r\n return { notifications: updated, unreadCount }\r\n })\r\n } catch (e) {\r\n console.error('[NotificationStore] Failed to delete notification:', e)\r\n }\r\n },\r\n\r\n subscribeToNotifications: (userId: string) => {\r\n try {\r\n if (!userId) return\r\n\r\n const supabase = createClient()\r\n\r\n if (activeChannel && activeUserId === userId) {\r\n return\r\n }\r\n\r\n if (activeChannel) {\r\n try {\r\n supabase.removeChannel(activeChannel)\r\n } catch (_) {}\r\n activeChannel = null\r\n activeUserId = null\r\n }\r\n\r\n const channelTopic = `notifications-user-${userId}-${Date.now()}-${Math.random().toString(36).slice(2, 6)}`\r\n const channel = supabase.channel(channelTopic)\r\n\r\n channel\r\n .on(\r\n 'postgres_changes',\r\n {\r\n event: '*',\r\n schema: 'public',\r\n table: 'notifications',\r\n filter: `user_id=eq.${userId}`,\r\n },\r\n (payload: any) => {\r\n const { eventType, new: newRecord, old: oldRecord } = payload\r\n\r\n if (eventType === 'INSERT') {\r\n const inserted = newRecord as DbNotification\r\n set((state) => {\r\n if (state.notifications.some((n) => n.id === inserted.id)) {\r\n return {}\r\n }\r\n const updated = [inserted, ...state.notifications]\r\n const unreadCount = updated.filter((n) => !n.read).length\r\n return { notifications: updated, unreadCount }\r\n })\r\n } else if (eventType === 'UPDATE') {\r\n const updatedRecord = newRecord as DbNotification\r\n set((state) => {\r\n const updated = state.notifications.map((n) =>\r\n n.id === updatedRecord.id ? updatedRecord : n\r\n )\r\n const unreadCount = updated.filter((n) => !n.read).length\r\n return { notifications: updated, unreadCount }\r\n })\r\n } else if (eventType === 'DELETE') {\r\n const deletedId = oldRecord?.id\r\n if (!deletedId) return\r\n set((state) => {\r\n const updated = state.notifications.filter((n) => n.id !== deletedId)\r\n const unreadCount = updated.filter((n) => !n.read).length\r\n return { notifications: updated, unreadCount }\r\n })\r\n }\r\n }\r\n )\r\n .subscribe()\r\n\r\n activeChannel = channel\r\n activeUserId = userId\r\n } catch (err) {\r\n console.warn('[NotificationStore] Realtime subscription error:', err)\r\n }\r\n },\r\n\r\n unsubscribe: () => {\r\n try {\r\n if (activeChannel) {\r\n const supabase = createClient()\r\n supabase.removeChannel(activeChannel)\r\n activeChannel = null\r\n activeUserId = null\r\n }\r\n } catch (err) {\r\n console.warn('[NotificationStore] Unsubscribe error:', err)\r\n }\r\n },\r\n}))\r\n","import { createBrowserClient } from '@supabase/ssr'\r\n\r\nlet clientSingleton: ReturnType<typeof createBrowserClient> | null = null\r\n\r\nexport function createClient() {\r\n if (typeof window === 'undefined') {\r\n return createBrowserClient(\r\n process.env.NEXT_PUBLIC_SUPABASE_URL!,\r\n process.env.NEXT_PUBLIC_SUPABASE_PUBLISHABLE_KEY!\r\n )\r\n }\r\n\r\n if (!clientSingleton) {\r\n clientSingleton = createBrowserClient(\r\n process.env.NEXT_PUBLIC_SUPABASE_URL!,\r\n process.env.NEXT_PUBLIC_SUPABASE_PUBLISHABLE_KEY!\r\n )\r\n }\r\n return clientSingleton;\r\n}\r\n","import { create } from 'zustand'\nimport { persist } from 'zustand/middleware'\n\nexport interface SavedVoucher {\n id: string\n voucherNo: string\n date: string\n from: string\n userName: string\n status: 'Active' | 'Redeemed' | 'Expired'\n fileName: string\n pdfUrl?: string\n editedJson?: any\n createdAt: string\n // DB-specific fields\n originalFileUrl?: string\n editedFileUrl?: string\n dbId?: string\n _selectedAt?: number\n}\n\ninterface VoucherStoreState {\n // Local vouchers (from DB fetch or local persist fallback)\n vouchers: SavedVoucher[]\n selectedVoucher: SavedVoucher | null\n dbLoaded: boolean\n\n setSelectedVoucher: (voucher: SavedVoucher | null) => void\n setVouchers: (vouchers: SavedVoucher[]) => void\n addVoucher: (voucher: Omit<SavedVoucher, 'id' | 'createdAt'>) => SavedVoucher\n updateVoucher: (id: string, updates: Partial<SavedVoucher>) => void\n deleteVoucher: (id: string) => void\n setDbLoaded: (v: boolean) => void\n}\n\nexport const useVoucherStore = create<VoucherStoreState>()(\n persist(\n (set) => ({\n vouchers: [],\n selectedVoucher: null,\n dbLoaded: false,\n setSelectedVoucher: (voucher) => set({ selectedVoucher: voucher }),\n setDbLoaded: (v) => set({ dbLoaded: v }),\n\n setVouchers: (vouchers) =>\n set((state) => {\n const map = new Map<string, SavedVoucher>()\n const getFileKey = (v: SavedVoucher) => {\n const name = (v.fileName || '').toLowerCase().trim()\n const url = (v.originalFileUrl || v.editedFileUrl || v.pdfUrl || '').trim()\n if (name && url) return `${name}_${url}`\n if (name) return name\n return v.id\n }\n\n for (const v of vouchers) {\n const key = getFileKey(v)\n if (key) map.set(key, v)\n }\n for (const v of state.vouchers) {\n const key = getFileKey(v)\n if (key && !map.has(key)) map.set(key, v)\n }\n const merged = Array.from(map.values()).sort((a, b) => {\n const timeA = a.createdAt ? new Date(a.createdAt).getTime() : 0\n const timeB = b.createdAt ? new Date(b.createdAt).getTime() : 0\n return timeB - timeA\n })\n return { vouchers: merged }\n }),\n\n addVoucher: (data) => {\n const fileUrlToUse = data.pdfUrl || data.editedFileUrl || data.originalFileUrl\n const newVoucher: SavedVoucher = {\n ...data,\n pdfUrl: fileUrlToUse,\n id: `voucher-${Date.now()}`,\n createdAt: new Date().toISOString(),\n }\n set((state) => ({\n vouchers: [newVoucher, ...state.vouchers],\n selectedVoucher: newVoucher,\n }))\n return newVoucher\n },\n\n updateVoucher: (id, updates) => {\n set((state) => ({\n vouchers: state.vouchers.map((v) =>\n v.id === id ? { ...v, ...updates } : v\n ),\n selectedVoucher:\n state.selectedVoucher?.id === id\n ? { ...state.selectedVoucher, ...updates }\n : state.selectedVoucher,\n }))\n },\n\n deleteVoucher: (id) => {\n set((state) => ({\n vouchers: state.vouchers.filter((v) => v.id !== id),\n selectedVoucher:\n state.selectedVoucher?.id === id ? null : state.selectedVoucher,\n }))\n },\n }),\n {\n name: 'vouchers-storage-v4',\n partialize: (state) => ({\n // Do NOT persist vouchers array globally in localStorage to prevent user data leakage across accounts\n selectedVoucher: null,\n }),\n }\n\n )\n)\n","import { create } from 'zustand'\r\nimport { persist } from 'zustand/middleware'\r\nimport { LinkTreeConfig, Project, LinkItem, SocialItem, ThemeConfig, ProfileConfig } from './types'\r\n\r\ninterface LinkMakerState {\r\n config: LinkTreeConfig\r\n projects: Project[]\r\n activeProjectId: string | null\r\n activeShortUrl: string | null\r\n activeShortUrlSuffix: string | null\r\n activeExpiresAt: string | null\r\n \r\n // Profile actions\r\n updateProfile: (profile: Partial<ProfileConfig>) => void\r\n \r\n // Link actions\r\n addLink: () => void\r\n updateLink: (id: string, updates: Partial<LinkItem>) => void\r\n removeLink: (id: string) => void\r\n reorderLinks: (index: number, direction: 'up' | 'down') => void\r\n \r\n // Social actions\r\n updateSocial: (platform: string, url: string, isEnabled: boolean) => void\r\n \r\n // Theme actions\r\n updateTheme: (themeUpdates: Partial<ThemeConfig>) => void\r\n \r\n // Project management actions\r\n saveProject: (name?: string) => string\r\n loadProject: (id: string) => void\r\n deleteProject: (id: string) => void\r\n createNewProject: (name: string) => void\r\n resetConfig: () => void\r\n\r\n // Tracking actions\r\n setShortUrl: (shortUrl: string, suffix: string, expiresAt: string) => void\r\n}\r\n\r\nconst DEFAULT_CONFIG: LinkTreeConfig = {\r\n profile: {\r\n name: 'Alex Rivera',\r\n bio: 'Senior UX Architect & Tech Writer | Crafting digital experiences ✨',\r\n avatarUrl: ''\r\n },\r\n links: [],\r\n socials: [],\r\n theme: {\r\n preset: 'custom',\r\n appTheme: 'system',\r\n appColorTheme: 'zinc'\r\n }\r\n}\r\n\r\nexport const useLinkMakerStore = create<LinkMakerState>()(\r\n persist(\r\n (set, get) => ({\r\n config: DEFAULT_CONFIG,\r\n projects: [],\r\n activeProjectId: null,\r\n activeShortUrl: null,\r\n activeShortUrlSuffix: null,\r\n activeExpiresAt: null,\r\n\r\n updateProfile: (profileUpdates) =>\r\n set((state) => ({\r\n config: {\r\n ...state.config,\r\n profile: {\r\n ...state.config.profile,\r\n ...profileUpdates\r\n }\r\n }\r\n })),\r\n\r\n addLink: () =>\r\n set((state) => {\r\n const newLink: LinkItem = {\r\n id: `link-${Date.now()}`,\r\n title: 'New Social Link',\r\n url: 'https://',\r\n icon: 'Link2',\r\n isEnabled: true,\r\n animation: 'none'\r\n }\r\n return {\r\n config: {\r\n ...state.config,\r\n links: [...state.config.links, newLink]\r\n }\r\n }\r\n }),\r\n\r\n updateLink: (id, updates) =>\r\n set((state) => ({\r\n config: {\r\n ...state.config,\r\n links: state.config.links.map((link) =>\r\n link.id === id ? { ...link, ...updates } : link\r\n )\r\n }\r\n })),\r\n\r\n removeLink: (id) =>\r\n set((state) => ({\r\n config: {\r\n ...state.config,\r\n links: state.config.links.filter((link) => link.id !== id)\r\n }\r\n })),\r\n\r\n reorderLinks: (index, direction) =>\r\n set((state) => {\r\n const links = [...state.config.links]\r\n const targetIndex = direction === 'up' ? index - 1 : index + 1\r\n \r\n if (targetIndex < 0 || targetIndex >= links.length) {\r\n return {} // Out of bounds\r\n }\r\n \r\n // Swap links\r\n const temp = links[index]\r\n links[index] = links[targetIndex]\r\n links[targetIndex] = temp\r\n \r\n return {\r\n config: {\r\n ...state.config,\r\n links\r\n }\r\n }\r\n }),\r\n\r\n updateSocial: (platform, url, isEnabled) =>\r\n set((state) => {\r\n const platformExists = state.config.socials.some((s) => s.platform === platform)\r\n let socials = []\r\n \r\n if (platformExists) {\r\n socials = state.config.socials.map((s) =>\r\n s.platform === platform ? { ...s, url, isEnabled } : s\r\n )\r\n } else {\r\n socials = [...state.config.socials, { platform, url, isEnabled }]\r\n }\r\n \r\n return {\r\n config: {\r\n ...state.config,\r\n socials\r\n }\r\n }\r\n }),\r\n\r\n updateTheme: (themeUpdates) =>\r\n set((state) => ({\r\n config: {\r\n ...state.config,\r\n theme: {\r\n ...state.config.theme,\r\n ...themeUpdates\r\n }\r\n }\r\n })),\r\n\r\n saveProject: (name) => {\r\n const state = get()\r\n const projectId = state.activeProjectId || `proj-${Date.now()}`\r\n const projectName = name || (state.activeProjectId \r\n ? state.projects.find((p) => p.id === state.activeProjectId)?.name || 'My Link Tree'\r\n : 'My Link Tree')\r\n \r\n const existingProject = state.projects.find((p) => p.id === projectId)\r\n\r\n const updatedProject: Project = {\r\n id: projectId,\r\n name: projectName,\r\n updatedAt: new Date().toISOString(),\r\n config: state.config,\r\n shortUrl: state.activeShortUrl || existingProject?.shortUrl,\r\n shortUrlSuffix: state.activeShortUrlSuffix || existingProject?.shortUrlSuffix,\r\n expiresAt: state.activeExpiresAt || existingProject?.expiresAt,\r\n }\r\n \r\n const projectIndex = state.projects.findIndex((p) => p.id === projectId)\r\n let updatedProjects = [...state.projects]\r\n \r\n if (projectIndex >= 0) {\r\n updatedProjects[projectIndex] = updatedProject\r\n } else {\r\n updatedProjects.push(updatedProject)\r\n }\r\n \r\n set({\r\n projects: updatedProjects,\r\n activeProjectId: projectId\r\n })\r\n \r\n return projectId\r\n },\r\n\r\n loadProject: (id) => {\r\n const state = get()\r\n const project = state.projects.find((p) => p.id === id)\r\n if (project) {\r\n set({\r\n config: project.config,\r\n activeProjectId: id,\r\n activeShortUrl: project.shortUrl || null,\r\n activeShortUrlSuffix: project.shortUrlSuffix || null,\r\n activeExpiresAt: project.expiresAt || null,\r\n })\r\n }\r\n },\r\n\r\n deleteProject: (id) =>\r\n set((state) => {\r\n const updatedProjects = state.projects.filter((p) => p.id !== id)\r\n const wasActive = state.activeProjectId === id\r\n return {\r\n projects: updatedProjects,\r\n activeProjectId: wasActive ? null : state.activeProjectId,\r\n config: wasActive ? DEFAULT_CONFIG : state.config,\r\n activeShortUrl: wasActive ? null : state.activeShortUrl,\r\n activeShortUrlSuffix: wasActive ? null : state.activeShortUrlSuffix,\r\n activeExpiresAt: wasActive ? null : state.activeExpiresAt,\r\n }\r\n }),\r\n\r\n createNewProject: (name) => {\r\n const id = `proj-${Date.now()}`\r\n const newProject: Project = {\r\n id,\r\n name,\r\n updatedAt: new Date().toISOString(),\r\n config: DEFAULT_CONFIG\r\n }\r\n \r\n set((state) => ({\r\n projects: [...state.projects, newProject],\r\n config: DEFAULT_CONFIG,\r\n activeProjectId: id,\r\n activeShortUrl: null,\r\n activeShortUrlSuffix: null,\r\n activeExpiresAt: null,\r\n }))\r\n },\r\n\r\n resetConfig: () =>\r\n set({\r\n config: DEFAULT_CONFIG,\r\n activeProjectId: null,\r\n activeShortUrl: null,\r\n activeShortUrlSuffix: null,\r\n activeExpiresAt: null,\r\n }),\r\n\r\n setShortUrl: (shortUrl, suffix, expiresAt) =>\r\n set((state) => {\r\n const updatedProjects = state.activeProjectId\r\n ? state.projects.map((p) =>\r\n p.id === state.activeProjectId\r\n ? { ...p, shortUrl, shortUrlSuffix: suffix, expiresAt }\r\n : p\r\n )\r\n : state.projects\r\n\r\n return {\r\n activeShortUrl: shortUrl,\r\n activeShortUrlSuffix: suffix,\r\n activeExpiresAt: expiresAt,\r\n projects: updatedProjects\r\n }\r\n })\r\n }),\r\n {\r\n name: 'link-maker-workspace'\r\n }\r\n )\r\n)\r\n\r\n// Export compatibility alias for cloned components\r\nexport const useLinkBuilderStore = useLinkMakerStore\r\n"],"mappings":"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","names":["import_zustand","import_zustand","import_zustand","import_middleware"]}
|
package/dist/stores.mjs
CHANGED
package/dist/stores.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/stores/auth-store.ts","../src/lib/cookies.ts","../src/stores/notification-store.ts","../src/lib/supabase/client.ts","../src/stores/voucher-store.ts","../src/features/link-maker/store.ts"],"sourcesContent":["import { create } from 'zustand'\r\nimport { getCookie, setCookie, removeCookie } from '@/lib/cookies'\r\n\r\nconst ACCESS_TOKEN = 'thisisjustarandomstring'\r\nconst USER_DATA = 'auth_user_data'\r\n\r\ninterface AuthUser {\r\n id: string // 👈 ADD THIS - the auth.uid() from Supabase\r\n accountNo: string\r\n email: string\r\n name?: string\r\n picture?: string\r\n role: string[]\r\n exp: number\r\n}\r\n\r\ninterface AuthState {\r\n auth: {\r\n user: AuthUser | null\r\n setUser: (user: AuthUser | null) => void\r\n accessToken: string\r\n setAccessToken: (accessToken: string) => void\r\n resetAccessToken: () => void\r\n reset: () => void\r\n }\r\n}\r\n\r\nexport const useAuthStore = create<AuthState>()((set) => {\r\n const cookieState = getCookie(ACCESS_TOKEN)\r\n let initToken = ''\r\n if (cookieState) {\r\n try {\r\n initToken = JSON.parse(cookieState)\r\n } catch {\r\n removeCookie(ACCESS_TOKEN)\r\n }\r\n }\r\n\r\n const userCookie = getCookie(USER_DATA)\r\n let initUser: AuthUser | null = null\r\n if (userCookie) {\r\n try {\r\n const parsed = JSON.parse(decodeURIComponent(userCookie))\r\n if (parsed.exp && parsed.exp > Date.now()) {\r\n initUser = parsed\r\n } else {\r\n removeCookie(ACCESS_TOKEN)\r\n removeCookie(USER_DATA)\r\n }\r\n } catch {\r\n initUser = null\r\n removeCookie(USER_DATA)\r\n }\r\n }\r\n\r\n return {\r\n auth: {\r\n user: initUser,\r\n setUser: (user) =>\r\n set((state) => {\r\n if (user) {\r\n setCookie(USER_DATA, encodeURIComponent(JSON.stringify(user)))\r\n } else {\r\n removeCookie(USER_DATA)\r\n }\r\n return { ...state, auth: { ...state.auth, user } }\r\n }),\r\n accessToken: initUser ? initToken : '',\r\n setAccessToken: (accessToken) =>\r\n set((state) => {\r\n setCookie(ACCESS_TOKEN, JSON.stringify(accessToken))\r\n return { ...state, auth: { ...state.auth, accessToken } }\r\n }),\r\n resetAccessToken: () =>\r\n set((state) => {\r\n removeCookie(ACCESS_TOKEN)\r\n return { ...state, auth: { ...state.auth, accessToken: '' } }\r\n }),\r\n reset: () =>\r\n set((state) => {\r\n removeCookie(ACCESS_TOKEN)\r\n removeCookie(USER_DATA)\r\n return {\r\n ...state,\r\n auth: { ...state.auth, user: null, accessToken: '' },\r\n }\r\n }),\r\n },\r\n }\r\n})","/**\r\n * Cookie utility functions using manual document.cookie approach\r\n * Replaces js-cookie dependency for better consistency\r\n */\r\n\r\nconst DEFAULT_MAX_AGE = 60 * 60 * 24 * 7 // 7 days\r\n\r\n/**\r\n * Get a cookie value by name\r\n */\r\nexport function getCookie(name: string): string | undefined {\r\n if (typeof document === 'undefined') return undefined\r\n\r\n const value = `; ${document.cookie}`\r\n const parts = value.split(`; ${name}=`)\r\n if (parts.length === 2) {\r\n const cookieValue = parts.pop()?.split(';').shift()\r\n return cookieValue\r\n }\r\n return undefined\r\n}\r\n\r\n/**\r\n * Set a cookie with name, value, and optional max age\r\n */\r\nexport function setCookie(\r\n name: string,\r\n value: string,\r\n maxAge: number = DEFAULT_MAX_AGE\r\n): void {\r\n if (typeof document === 'undefined') return\r\n\r\n document.cookie = `${name}=${value}; path=/; max-age=${maxAge}`\r\n}\r\n\r\n/**\r\n * Remove a cookie by setting its max age to 0\r\n */\r\nexport function removeCookie(name: string): void {\r\n if (typeof document === 'undefined') return\r\n\r\n document.cookie = `${name}=; path=/; max-age=0`\r\n}\r\n","import { create } from 'zustand'\r\nimport { createClient } from '@/lib/supabase/client'\r\nimport { RealtimeChannel } from '@supabase/supabase-js'\r\n\r\nexport interface DbNotification {\r\n id: string\r\n user_id: string\r\n sender_id: string | null\r\n message_id: string | null\r\n message_text: string\r\n read: boolean\r\n created_at: string\r\n}\r\n\r\ninterface NotificationState {\r\n notifications: DbNotification[]\r\n unreadCount: number\r\n isLoading: boolean\r\n fetchNotifications: (userId: string) => Promise<void>\r\n markAsRead: (notificationId: string) => Promise<void>\r\n markAllAsRead: (userId: string) => Promise<void>\r\n deleteNotification: (notificationId: string) => Promise<void>\r\n subscribeToNotifications: (userId: string) => void\r\n unsubscribe: () => void\r\n}\r\n\r\nlet activeChannel: RealtimeChannel | null = null\r\n\r\nexport const useNotificationStore = create<NotificationState>((set, get) => ({\r\n notifications: [],\r\n unreadCount: 0,\r\n isLoading: false,\r\n\r\n fetchNotifications: async (userId: string) => {\r\n set({ isLoading: true })\r\n const supabase = createClient()\r\n try {\r\n const { data, error } = await supabase\r\n .from('notifications')\r\n .select('*')\r\n .eq('user_id', userId)\r\n .order('created_at', { ascending: false })\r\n\r\n if (error) throw error\r\n\r\n const notifications = data || []\r\n const unreadCount = notifications.filter((n: DbNotification) => !n.read).length\r\n set({ notifications, unreadCount })\r\n } catch (e) {\r\n console.error('[NotificationStore] Failed to fetch notifications:', e)\r\n } finally {\r\n set({ isLoading: false })\r\n }\r\n },\r\n\r\n markAsRead: async (notificationId: string) => {\r\n const supabase = createClient()\r\n try {\r\n const { error } = await supabase\r\n .from('notifications')\r\n .update({ read: true })\r\n .eq('id', notificationId)\r\n\r\n if (error) throw error\r\n\r\n set((state) => {\r\n const updated = state.notifications.map((n) =>\r\n n.id === notificationId ? { ...n, read: true } : n\r\n )\r\n const unreadCount = updated.filter((n) => !n.read).length\r\n return { notifications: updated, unreadCount }\r\n })\r\n } catch (e) {\r\n console.error('[NotificationStore] Failed to mark notification as read:', e)\r\n }\r\n },\r\n\r\n markAllAsRead: async (userId: string) => {\r\n const supabase = createClient()\r\n try {\r\n const { error } = await supabase\r\n .from('notifications')\r\n .update({ read: true })\r\n .eq('user_id', userId)\r\n .eq('read', false)\r\n\r\n if (error) throw error\r\n\r\n set((state) => {\r\n const updated = state.notifications.map((n) => ({ ...n, read: true }))\r\n return { notifications: updated, unreadCount: 0 }\r\n })\r\n } catch (e) {\r\n console.error('[NotificationStore] Failed to mark all notifications as read:', e)\r\n }\r\n },\r\n\r\n deleteNotification: async (notificationId: string) => {\r\n const supabase = createClient()\r\n try {\r\n const { error } = await supabase\r\n .from('notifications')\r\n .delete()\r\n .eq('id', notificationId)\r\n\r\n if (error) throw error\r\n\r\n set((state) => {\r\n const updated = state.notifications.filter((n) => n.id !== notificationId)\r\n const unreadCount = updated.filter((n) => !n.read).length\r\n return { notifications: updated, unreadCount }\r\n })\r\n } catch (e) {\r\n console.error('[NotificationStore] Failed to delete notification:', e)\r\n }\r\n },\r\n\r\n subscribeToNotifications: (userId: string) => {\r\n try {\r\n if (!userId) return\r\n\r\n const supabase = createClient()\r\n\r\n if (activeChannel && activeUserId === userId) {\r\n return\r\n }\r\n\r\n if (activeChannel) {\r\n try {\r\n supabase.removeChannel(activeChannel)\r\n } catch (_) {}\r\n activeChannel = null\r\n activeUserId = null\r\n }\r\n\r\n const channelTopic = `notifications-user-${userId}-${Date.now()}-${Math.random().toString(36).slice(2, 6)}`\r\n const channel = supabase.channel(channelTopic)\r\n\r\n channel\r\n .on(\r\n 'postgres_changes',\r\n {\r\n event: '*',\r\n schema: 'public',\r\n table: 'notifications',\r\n filter: `user_id=eq.${userId}`,\r\n },\r\n (payload: any) => {\r\n const { eventType, new: newRecord, old: oldRecord } = payload\r\n\r\n if (eventType === 'INSERT') {\r\n const inserted = newRecord as DbNotification\r\n set((state) => {\r\n if (state.notifications.some((n) => n.id === inserted.id)) {\r\n return {}\r\n }\r\n const updated = [inserted, ...state.notifications]\r\n const unreadCount = updated.filter((n) => !n.read).length\r\n return { notifications: updated, unreadCount }\r\n })\r\n } else if (eventType === 'UPDATE') {\r\n const updatedRecord = newRecord as DbNotification\r\n set((state) => {\r\n const updated = state.notifications.map((n) =>\r\n n.id === updatedRecord.id ? updatedRecord : n\r\n )\r\n const unreadCount = updated.filter((n) => !n.read).length\r\n return { notifications: updated, unreadCount }\r\n })\r\n } else if (eventType === 'DELETE') {\r\n const deletedId = oldRecord?.id\r\n if (!deletedId) return\r\n set((state) => {\r\n const updated = state.notifications.filter((n) => n.id !== deletedId)\r\n const unreadCount = updated.filter((n) => !n.read).length\r\n return { notifications: updated, unreadCount }\r\n })\r\n }\r\n }\r\n )\r\n .subscribe()\r\n\r\n activeChannel = channel\r\n activeUserId = userId\r\n } catch (err) {\r\n console.warn('[NotificationStore] Realtime subscription error:', err)\r\n }\r\n },\r\n\r\n unsubscribe: () => {\r\n try {\r\n if (activeChannel) {\r\n const supabase = createClient()\r\n supabase.removeChannel(activeChannel)\r\n activeChannel = null\r\n activeUserId = null\r\n }\r\n } catch (err) {\r\n console.warn('[NotificationStore] Unsubscribe error:', err)\r\n }\r\n },\r\n}))\r\n","import { createBrowserClient } from '@supabase/ssr'\r\n\r\nlet clientSingleton: ReturnType<typeof createBrowserClient> | null = null\r\n\r\nexport function createClient() {\r\n if (typeof window === 'undefined') {\r\n return createBrowserClient(\r\n process.env.NEXT_PUBLIC_SUPABASE_URL!,\r\n process.env.NEXT_PUBLIC_SUPABASE_PUBLISHABLE_KEY!\r\n )\r\n }\r\n\r\n if (!clientSingleton) {\r\n clientSingleton = createBrowserClient(\r\n process.env.NEXT_PUBLIC_SUPABASE_URL!,\r\n process.env.NEXT_PUBLIC_SUPABASE_PUBLISHABLE_KEY!\r\n )\r\n }\r\n return clientSingleton;\r\n}\r\n","import { create } from 'zustand'\nimport { persist } from 'zustand/middleware'\n\nexport interface SavedVoucher {\n id: string\n voucherNo: string\n date: string\n from: string\n userName: string\n status: 'Active' | 'Redeemed' | 'Expired'\n fileName: string\n pdfUrl?: string\n editedJson?: any\n createdAt: string\n // DB-specific fields\n originalFileUrl?: string\n editedFileUrl?: string\n dbId?: string\n _selectedAt?: number\n}\n\ninterface VoucherStoreState {\n // Local vouchers (from DB fetch or local persist fallback)\n vouchers: SavedVoucher[]\n selectedVoucher: SavedVoucher | null\n dbLoaded: boolean\n\n setSelectedVoucher: (voucher: SavedVoucher | null) => void\n setVouchers: (vouchers: SavedVoucher[]) => void\n addVoucher: (voucher: Omit<SavedVoucher, 'id' | 'createdAt'>) => SavedVoucher\n updateVoucher: (id: string, updates: Partial<SavedVoucher>) => void\n deleteVoucher: (id: string) => void\n setDbLoaded: (v: boolean) => void\n}\n\nexport const useVoucherStore = create<VoucherStoreState>()(\n persist(\n (set) => ({\n vouchers: [],\n selectedVoucher: null,\n dbLoaded: false,\n setSelectedVoucher: (voucher) => set({ selectedVoucher: voucher }),\n setDbLoaded: (v) => set({ dbLoaded: v }),\n\n setVouchers: (vouchers) =>\n set((state) => {\n const map = new Map<string, SavedVoucher>()\n const getFileKey = (v: SavedVoucher) => {\n const name = (v.fileName || '').toLowerCase().trim()\n const url = (v.originalFileUrl || v.editedFileUrl || v.pdfUrl || '').trim()\n if (name && url) return `${name}_${url}`\n if (name) return name\n return v.id\n }\n\n for (const v of vouchers) {\n const key = getFileKey(v)\n if (key) map.set(key, v)\n }\n for (const v of state.vouchers) {\n const key = getFileKey(v)\n if (key && !map.has(key)) map.set(key, v)\n }\n const merged = Array.from(map.values()).sort((a, b) => {\n const timeA = a.createdAt ? new Date(a.createdAt).getTime() : 0\n const timeB = b.createdAt ? new Date(b.createdAt).getTime() : 0\n return timeB - timeA\n })\n return { vouchers: merged }\n }),\n\n addVoucher: (data) => {\n const fileUrlToUse = data.pdfUrl || data.editedFileUrl || data.originalFileUrl\n const newVoucher: SavedVoucher = {\n ...data,\n pdfUrl: fileUrlToUse,\n id: `voucher-${Date.now()}`,\n createdAt: new Date().toISOString(),\n }\n set((state) => ({\n vouchers: [newVoucher, ...state.vouchers],\n selectedVoucher: newVoucher,\n }))\n return newVoucher\n },\n\n updateVoucher: (id, updates) => {\n set((state) => ({\n vouchers: state.vouchers.map((v) =>\n v.id === id ? { ...v, ...updates } : v\n ),\n selectedVoucher:\n state.selectedVoucher?.id === id\n ? { ...state.selectedVoucher, ...updates }\n : state.selectedVoucher,\n }))\n },\n\n deleteVoucher: (id) => {\n set((state) => ({\n vouchers: state.vouchers.filter((v) => v.id !== id),\n selectedVoucher:\n state.selectedVoucher?.id === id ? null : state.selectedVoucher,\n }))\n },\n }),\n {\n name: 'vouchers-storage-v4',\n partialize: (state) => ({\n // Do NOT persist vouchers array globally in localStorage to prevent user data leakage across accounts\n selectedVoucher: null,\n }),\n }\n\n )\n)\n","import { create } from 'zustand'\r\nimport { persist } from 'zustand/middleware'\r\nimport { LinkTreeConfig, Project, LinkItem, SocialItem, ThemeConfig, ProfileConfig } from './types'\r\n\r\ninterface LinkMakerState {\r\n config: LinkTreeConfig\r\n projects: Project[]\r\n activeProjectId: string | null\r\n activeShortUrl: string | null\r\n activeShortUrlSuffix: string | null\r\n activeExpiresAt: string | null\r\n \r\n // Profile actions\r\n updateProfile: (profile: Partial<ProfileConfig>) => void\r\n \r\n // Link actions\r\n addLink: () => void\r\n updateLink: (id: string, updates: Partial<LinkItem>) => void\r\n removeLink: (id: string) => void\r\n reorderLinks: (index: number, direction: 'up' | 'down') => void\r\n \r\n // Social actions\r\n updateSocial: (platform: string, url: string, isEnabled: boolean) => void\r\n \r\n // Theme actions\r\n updateTheme: (themeUpdates: Partial<ThemeConfig>) => void\r\n \r\n // Project management actions\r\n saveProject: (name?: string) => string\r\n loadProject: (id: string) => void\r\n deleteProject: (id: string) => void\r\n createNewProject: (name: string) => void\r\n resetConfig: () => void\r\n\r\n // Tracking actions\r\n setShortUrl: (shortUrl: string, suffix: string, expiresAt: string) => void\r\n}\r\n\r\nconst DEFAULT_CONFIG: LinkTreeConfig = {\r\n profile: {\r\n name: 'Alex Rivera',\r\n bio: 'Senior UX Architect & Tech Writer | Crafting digital experiences ✨',\r\n avatarUrl: ''\r\n },\r\n links: [],\r\n socials: [],\r\n theme: {\r\n preset: 'custom',\r\n appTheme: 'system',\r\n appColorTheme: 'zinc'\r\n }\r\n}\r\n\r\nexport const useLinkMakerStore = create<LinkMakerState>()(\r\n persist(\r\n (set, get) => ({\r\n config: DEFAULT_CONFIG,\r\n projects: [],\r\n activeProjectId: null,\r\n activeShortUrl: null,\r\n activeShortUrlSuffix: null,\r\n activeExpiresAt: null,\r\n\r\n updateProfile: (profileUpdates) =>\r\n set((state) => ({\r\n config: {\r\n ...state.config,\r\n profile: {\r\n ...state.config.profile,\r\n ...profileUpdates\r\n }\r\n }\r\n })),\r\n\r\n addLink: () =>\r\n set((state) => {\r\n const newLink: LinkItem = {\r\n id: `link-${Date.now()}`,\r\n title: 'New Social Link',\r\n url: 'https://',\r\n icon: 'Link2',\r\n isEnabled: true,\r\n animation: 'none'\r\n }\r\n return {\r\n config: {\r\n ...state.config,\r\n links: [...state.config.links, newLink]\r\n }\r\n }\r\n }),\r\n\r\n updateLink: (id, updates) =>\r\n set((state) => ({\r\n config: {\r\n ...state.config,\r\n links: state.config.links.map((link) =>\r\n link.id === id ? { ...link, ...updates } : link\r\n )\r\n }\r\n })),\r\n\r\n removeLink: (id) =>\r\n set((state) => ({\r\n config: {\r\n ...state.config,\r\n links: state.config.links.filter((link) => link.id !== id)\r\n }\r\n })),\r\n\r\n reorderLinks: (index, direction) =>\r\n set((state) => {\r\n const links = [...state.config.links]\r\n const targetIndex = direction === 'up' ? index - 1 : index + 1\r\n \r\n if (targetIndex < 0 || targetIndex >= links.length) {\r\n return {} // Out of bounds\r\n }\r\n \r\n // Swap links\r\n const temp = links[index]\r\n links[index] = links[targetIndex]\r\n links[targetIndex] = temp\r\n \r\n return {\r\n config: {\r\n ...state.config,\r\n links\r\n }\r\n }\r\n }),\r\n\r\n updateSocial: (platform, url, isEnabled) =>\r\n set((state) => {\r\n const platformExists = state.config.socials.some((s) => s.platform === platform)\r\n let socials = []\r\n \r\n if (platformExists) {\r\n socials = state.config.socials.map((s) =>\r\n s.platform === platform ? { ...s, url, isEnabled } : s\r\n )\r\n } else {\r\n socials = [...state.config.socials, { platform, url, isEnabled }]\r\n }\r\n \r\n return {\r\n config: {\r\n ...state.config,\r\n socials\r\n }\r\n }\r\n }),\r\n\r\n updateTheme: (themeUpdates) =>\r\n set((state) => ({\r\n config: {\r\n ...state.config,\r\n theme: {\r\n ...state.config.theme,\r\n ...themeUpdates\r\n }\r\n }\r\n })),\r\n\r\n saveProject: (name) => {\r\n const state = get()\r\n const projectId = state.activeProjectId || `proj-${Date.now()}`\r\n const projectName = name || (state.activeProjectId \r\n ? state.projects.find((p) => p.id === state.activeProjectId)?.name || 'My Link Tree'\r\n : 'My Link Tree')\r\n \r\n const existingProject = state.projects.find((p) => p.id === projectId)\r\n\r\n const updatedProject: Project = {\r\n id: projectId,\r\n name: projectName,\r\n updatedAt: new Date().toISOString(),\r\n config: state.config,\r\n shortUrl: state.activeShortUrl || existingProject?.shortUrl,\r\n shortUrlSuffix: state.activeShortUrlSuffix || existingProject?.shortUrlSuffix,\r\n expiresAt: state.activeExpiresAt || existingProject?.expiresAt,\r\n }\r\n \r\n const projectIndex = state.projects.findIndex((p) => p.id === projectId)\r\n let updatedProjects = [...state.projects]\r\n \r\n if (projectIndex >= 0) {\r\n updatedProjects[projectIndex] = updatedProject\r\n } else {\r\n updatedProjects.push(updatedProject)\r\n }\r\n \r\n set({\r\n projects: updatedProjects,\r\n activeProjectId: projectId\r\n })\r\n \r\n return projectId\r\n },\r\n\r\n loadProject: (id) => {\r\n const state = get()\r\n const project = state.projects.find((p) => p.id === id)\r\n if (project) {\r\n set({\r\n config: project.config,\r\n activeProjectId: id,\r\n activeShortUrl: project.shortUrl || null,\r\n activeShortUrlSuffix: project.shortUrlSuffix || null,\r\n activeExpiresAt: project.expiresAt || null,\r\n })\r\n }\r\n },\r\n\r\n deleteProject: (id) =>\r\n set((state) => {\r\n const updatedProjects = state.projects.filter((p) => p.id !== id)\r\n const wasActive = state.activeProjectId === id\r\n return {\r\n projects: updatedProjects,\r\n activeProjectId: wasActive ? null : state.activeProjectId,\r\n config: wasActive ? DEFAULT_CONFIG : state.config,\r\n activeShortUrl: wasActive ? null : state.activeShortUrl,\r\n activeShortUrlSuffix: wasActive ? null : state.activeShortUrlSuffix,\r\n activeExpiresAt: wasActive ? null : state.activeExpiresAt,\r\n }\r\n }),\r\n\r\n createNewProject: (name) => {\r\n const id = `proj-${Date.now()}`\r\n const newProject: Project = {\r\n id,\r\n name,\r\n updatedAt: new Date().toISOString(),\r\n config: DEFAULT_CONFIG\r\n }\r\n \r\n set((state) => ({\r\n projects: [...state.projects, newProject],\r\n config: DEFAULT_CONFIG,\r\n activeProjectId: id,\r\n activeShortUrl: null,\r\n activeShortUrlSuffix: null,\r\n activeExpiresAt: null,\r\n }))\r\n },\r\n\r\n resetConfig: () =>\r\n set({\r\n config: DEFAULT_CONFIG,\r\n activeProjectId: null,\r\n activeShortUrl: null,\r\n activeShortUrlSuffix: null,\r\n activeExpiresAt: null,\r\n }),\r\n\r\n setShortUrl: (shortUrl, suffix, expiresAt) =>\r\n set((state) => {\r\n const updatedProjects = state.activeProjectId\r\n ? state.projects.map((p) =>\r\n p.id === state.activeProjectId\r\n ? { ...p, shortUrl, shortUrlSuffix: suffix, expiresAt }\r\n : p\r\n )\r\n : state.projects\r\n\r\n return {\r\n activeShortUrl: shortUrl,\r\n activeShortUrlSuffix: suffix,\r\n activeExpiresAt: expiresAt,\r\n projects: updatedProjects\r\n }\r\n })\r\n }),\r\n {\r\n name: 'link-maker-workspace'\r\n }\r\n )\r\n)\r\n\r\n// Export compatibility alias for cloned components\r\nexport const useLinkBuilderStore = useLinkMakerStore\r\n"],"mappings":"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","names":["create","create","create","create","persist"]}
|
|
1
|
+
{"version":3,"sources":["../src/stores/auth-store.ts","../src/lib/cookies.ts","../src/stores/notification-store.ts","../src/lib/supabase/client.ts","../src/stores/voucher-store.ts","../src/features/link-maker/store.ts"],"sourcesContent":["import { create } from 'zustand'\r\nimport { getCookie, setCookie, removeCookie } from '@/lib/cookies'\r\n\r\nconst ACCESS_TOKEN = 'thisisjustarandomstring'\r\nconst USER_DATA = 'auth_user_data'\r\n\r\ninterface AuthUser {\r\n id: string // 👈 ADD THIS - the auth.uid() from Supabase\r\n accountNo: string\r\n email: string\r\n name?: string\r\n picture?: string\r\n role: string[]\r\n exp: number\r\n}\r\n\r\ninterface AuthState {\r\n auth: {\r\n user: AuthUser | null\r\n setUser: (user: AuthUser | null) => void\r\n accessToken: string\r\n setAccessToken: (accessToken: string) => void\r\n resetAccessToken: () => void\r\n reset: () => void\r\n }\r\n}\r\n\r\nexport const useAuthStore = create<AuthState>()((set) => {\r\n const cookieState = getCookie(ACCESS_TOKEN)\r\n let initToken = ''\r\n if (cookieState) {\r\n try {\r\n initToken = JSON.parse(cookieState)\r\n } catch {\r\n removeCookie(ACCESS_TOKEN)\r\n }\r\n }\r\n\r\n const userCookie = getCookie(USER_DATA)\r\n let initUser: AuthUser | null = null\r\n if (userCookie) {\r\n try {\r\n const parsed = JSON.parse(decodeURIComponent(userCookie))\r\n if (parsed.exp && parsed.exp > Date.now()) {\r\n initUser = parsed\r\n } else {\r\n removeCookie(ACCESS_TOKEN)\r\n removeCookie(USER_DATA)\r\n }\r\n } catch {\r\n initUser = null\r\n removeCookie(USER_DATA)\r\n }\r\n }\r\n\r\n return {\r\n auth: {\r\n user: initUser,\r\n setUser: (user) =>\r\n set((state) => {\r\n if (user) {\r\n setCookie(USER_DATA, encodeURIComponent(JSON.stringify(user)))\r\n } else {\r\n removeCookie(USER_DATA)\r\n }\r\n return { ...state, auth: { ...state.auth, user } }\r\n }),\r\n accessToken: initUser ? initToken : '',\r\n setAccessToken: (accessToken) =>\r\n set((state) => {\r\n setCookie(ACCESS_TOKEN, JSON.stringify(accessToken))\r\n return { ...state, auth: { ...state.auth, accessToken } }\r\n }),\r\n resetAccessToken: () =>\r\n set((state) => {\r\n removeCookie(ACCESS_TOKEN)\r\n return { ...state, auth: { ...state.auth, accessToken: '' } }\r\n }),\r\n reset: () =>\r\n set((state) => {\r\n removeCookie(ACCESS_TOKEN)\r\n removeCookie(USER_DATA)\r\n return {\r\n ...state,\r\n auth: { ...state.auth, user: null, accessToken: '' },\r\n }\r\n }),\r\n },\r\n }\r\n})","/**\r\n * Cookie utility functions using manual document.cookie approach\r\n * Replaces js-cookie dependency for better consistency\r\n */\r\n\r\nconst DEFAULT_MAX_AGE = 60 * 60 * 24 * 7 // 7 days\r\n\r\n/**\r\n * Get a cookie value by name\r\n */\r\nexport function getCookie(name: string): string | undefined {\r\n if (typeof document === 'undefined') return undefined\r\n\r\n const value = `; ${document.cookie}`\r\n const parts = value.split(`; ${name}=`)\r\n if (parts.length === 2) {\r\n const cookieValue = parts.pop()?.split(';').shift()\r\n return cookieValue\r\n }\r\n return undefined\r\n}\r\n\r\n/**\r\n * Set a cookie with name, value, and optional max age\r\n */\r\nexport function setCookie(\r\n name: string,\r\n value: string,\r\n maxAge: number = DEFAULT_MAX_AGE\r\n): void {\r\n if (typeof document === 'undefined') return\r\n\r\n document.cookie = `${name}=${value}; path=/; max-age=${maxAge}`\r\n}\r\n\r\n/**\r\n * Remove a cookie by setting its max age to 0\r\n */\r\nexport function removeCookie(name: string): void {\r\n if (typeof document === 'undefined') return\r\n\r\n document.cookie = `${name}=; path=/; max-age=0`\r\n}\r\n","import { create } from 'zustand'\r\nimport { createClient } from '@/lib/supabase/client'\r\nimport { RealtimeChannel } from '@supabase/supabase-js'\r\n\r\nexport interface DbNotification {\r\n id: string\r\n user_id: string\r\n sender_id: string | null\r\n message_id: string | null\r\n message_text: string\r\n read: boolean\r\n created_at: string\r\n}\r\n\r\ninterface NotificationState {\r\n notifications: DbNotification[]\r\n unreadCount: number\r\n isLoading: boolean\r\n fetchNotifications: (userId: string) => Promise<void>\r\n markAsRead: (notificationId: string) => Promise<void>\r\n markAllAsRead: (userId: string) => Promise<void>\r\n deleteNotification: (notificationId: string) => Promise<void>\r\n subscribeToNotifications: (userId: string) => void\r\n unsubscribe: () => void\r\n}\r\n\r\nlet activeChannel: RealtimeChannel | null = null\r\nlet activeUserId: string | null = null\r\n\r\nexport const useNotificationStore = create<NotificationState>((set, get) => ({\r\n notifications: [],\r\n unreadCount: 0,\r\n isLoading: false,\r\n\r\n fetchNotifications: async (userId: string) => {\r\n set({ isLoading: true })\r\n const supabase = createClient()\r\n try {\r\n const { data, error } = await supabase\r\n .from('notifications')\r\n .select('*')\r\n .eq('user_id', userId)\r\n .order('created_at', { ascending: false })\r\n\r\n if (error) throw error\r\n\r\n const notifications = data || []\r\n const unreadCount = notifications.filter((n: DbNotification) => !n.read).length\r\n set({ notifications, unreadCount })\r\n } catch (e) {\r\n console.error('[NotificationStore] Failed to fetch notifications:', e)\r\n } finally {\r\n set({ isLoading: false })\r\n }\r\n },\r\n\r\n markAsRead: async (notificationId: string) => {\r\n const supabase = createClient()\r\n try {\r\n const { error } = await supabase\r\n .from('notifications')\r\n .update({ read: true })\r\n .eq('id', notificationId)\r\n\r\n if (error) throw error\r\n\r\n set((state) => {\r\n const updated = state.notifications.map((n) =>\r\n n.id === notificationId ? { ...n, read: true } : n\r\n )\r\n const unreadCount = updated.filter((n) => !n.read).length\r\n return { notifications: updated, unreadCount }\r\n })\r\n } catch (e) {\r\n console.error('[NotificationStore] Failed to mark notification as read:', e)\r\n }\r\n },\r\n\r\n markAllAsRead: async (userId: string) => {\r\n const supabase = createClient()\r\n try {\r\n const { error } = await supabase\r\n .from('notifications')\r\n .update({ read: true })\r\n .eq('user_id', userId)\r\n .eq('read', false)\r\n\r\n if (error) throw error\r\n\r\n set((state) => {\r\n const updated = state.notifications.map((n) => ({ ...n, read: true }))\r\n return { notifications: updated, unreadCount: 0 }\r\n })\r\n } catch (e) {\r\n console.error('[NotificationStore] Failed to mark all notifications as read:', e)\r\n }\r\n },\r\n\r\n deleteNotification: async (notificationId: string) => {\r\n const supabase = createClient()\r\n try {\r\n const { error } = await supabase\r\n .from('notifications')\r\n .delete()\r\n .eq('id', notificationId)\r\n\r\n if (error) throw error\r\n\r\n set((state) => {\r\n const updated = state.notifications.filter((n) => n.id !== notificationId)\r\n const unreadCount = updated.filter((n) => !n.read).length\r\n return { notifications: updated, unreadCount }\r\n })\r\n } catch (e) {\r\n console.error('[NotificationStore] Failed to delete notification:', e)\r\n }\r\n },\r\n\r\n subscribeToNotifications: (userId: string) => {\r\n try {\r\n if (!userId) return\r\n\r\n const supabase = createClient()\r\n\r\n if (activeChannel && activeUserId === userId) {\r\n return\r\n }\r\n\r\n if (activeChannel) {\r\n try {\r\n supabase.removeChannel(activeChannel)\r\n } catch (_) {}\r\n activeChannel = null\r\n activeUserId = null\r\n }\r\n\r\n const channelTopic = `notifications-user-${userId}-${Date.now()}-${Math.random().toString(36).slice(2, 6)}`\r\n const channel = supabase.channel(channelTopic)\r\n\r\n channel\r\n .on(\r\n 'postgres_changes',\r\n {\r\n event: '*',\r\n schema: 'public',\r\n table: 'notifications',\r\n filter: `user_id=eq.${userId}`,\r\n },\r\n (payload: any) => {\r\n const { eventType, new: newRecord, old: oldRecord } = payload\r\n\r\n if (eventType === 'INSERT') {\r\n const inserted = newRecord as DbNotification\r\n set((state) => {\r\n if (state.notifications.some((n) => n.id === inserted.id)) {\r\n return {}\r\n }\r\n const updated = [inserted, ...state.notifications]\r\n const unreadCount = updated.filter((n) => !n.read).length\r\n return { notifications: updated, unreadCount }\r\n })\r\n } else if (eventType === 'UPDATE') {\r\n const updatedRecord = newRecord as DbNotification\r\n set((state) => {\r\n const updated = state.notifications.map((n) =>\r\n n.id === updatedRecord.id ? updatedRecord : n\r\n )\r\n const unreadCount = updated.filter((n) => !n.read).length\r\n return { notifications: updated, unreadCount }\r\n })\r\n } else if (eventType === 'DELETE') {\r\n const deletedId = oldRecord?.id\r\n if (!deletedId) return\r\n set((state) => {\r\n const updated = state.notifications.filter((n) => n.id !== deletedId)\r\n const unreadCount = updated.filter((n) => !n.read).length\r\n return { notifications: updated, unreadCount }\r\n })\r\n }\r\n }\r\n )\r\n .subscribe()\r\n\r\n activeChannel = channel\r\n activeUserId = userId\r\n } catch (err) {\r\n console.warn('[NotificationStore] Realtime subscription error:', err)\r\n }\r\n },\r\n\r\n unsubscribe: () => {\r\n try {\r\n if (activeChannel) {\r\n const supabase = createClient()\r\n supabase.removeChannel(activeChannel)\r\n activeChannel = null\r\n activeUserId = null\r\n }\r\n } catch (err) {\r\n console.warn('[NotificationStore] Unsubscribe error:', err)\r\n }\r\n },\r\n}))\r\n","import { createBrowserClient } from '@supabase/ssr'\r\n\r\nlet clientSingleton: ReturnType<typeof createBrowserClient> | null = null\r\n\r\nexport function createClient() {\r\n if (typeof window === 'undefined') {\r\n return createBrowserClient(\r\n process.env.NEXT_PUBLIC_SUPABASE_URL!,\r\n process.env.NEXT_PUBLIC_SUPABASE_PUBLISHABLE_KEY!\r\n )\r\n }\r\n\r\n if (!clientSingleton) {\r\n clientSingleton = createBrowserClient(\r\n process.env.NEXT_PUBLIC_SUPABASE_URL!,\r\n process.env.NEXT_PUBLIC_SUPABASE_PUBLISHABLE_KEY!\r\n )\r\n }\r\n return clientSingleton;\r\n}\r\n","import { create } from 'zustand'\nimport { persist } from 'zustand/middleware'\n\nexport interface SavedVoucher {\n id: string\n voucherNo: string\n date: string\n from: string\n userName: string\n status: 'Active' | 'Redeemed' | 'Expired'\n fileName: string\n pdfUrl?: string\n editedJson?: any\n createdAt: string\n // DB-specific fields\n originalFileUrl?: string\n editedFileUrl?: string\n dbId?: string\n _selectedAt?: number\n}\n\ninterface VoucherStoreState {\n // Local vouchers (from DB fetch or local persist fallback)\n vouchers: SavedVoucher[]\n selectedVoucher: SavedVoucher | null\n dbLoaded: boolean\n\n setSelectedVoucher: (voucher: SavedVoucher | null) => void\n setVouchers: (vouchers: SavedVoucher[]) => void\n addVoucher: (voucher: Omit<SavedVoucher, 'id' | 'createdAt'>) => SavedVoucher\n updateVoucher: (id: string, updates: Partial<SavedVoucher>) => void\n deleteVoucher: (id: string) => void\n setDbLoaded: (v: boolean) => void\n}\n\nexport const useVoucherStore = create<VoucherStoreState>()(\n persist(\n (set) => ({\n vouchers: [],\n selectedVoucher: null,\n dbLoaded: false,\n setSelectedVoucher: (voucher) => set({ selectedVoucher: voucher }),\n setDbLoaded: (v) => set({ dbLoaded: v }),\n\n setVouchers: (vouchers) =>\n set((state) => {\n const map = new Map<string, SavedVoucher>()\n const getFileKey = (v: SavedVoucher) => {\n const name = (v.fileName || '').toLowerCase().trim()\n const url = (v.originalFileUrl || v.editedFileUrl || v.pdfUrl || '').trim()\n if (name && url) return `${name}_${url}`\n if (name) return name\n return v.id\n }\n\n for (const v of vouchers) {\n const key = getFileKey(v)\n if (key) map.set(key, v)\n }\n for (const v of state.vouchers) {\n const key = getFileKey(v)\n if (key && !map.has(key)) map.set(key, v)\n }\n const merged = Array.from(map.values()).sort((a, b) => {\n const timeA = a.createdAt ? new Date(a.createdAt).getTime() : 0\n const timeB = b.createdAt ? new Date(b.createdAt).getTime() : 0\n return timeB - timeA\n })\n return { vouchers: merged }\n }),\n\n addVoucher: (data) => {\n const fileUrlToUse = data.pdfUrl || data.editedFileUrl || data.originalFileUrl\n const newVoucher: SavedVoucher = {\n ...data,\n pdfUrl: fileUrlToUse,\n id: `voucher-${Date.now()}`,\n createdAt: new Date().toISOString(),\n }\n set((state) => ({\n vouchers: [newVoucher, ...state.vouchers],\n selectedVoucher: newVoucher,\n }))\n return newVoucher\n },\n\n updateVoucher: (id, updates) => {\n set((state) => ({\n vouchers: state.vouchers.map((v) =>\n v.id === id ? { ...v, ...updates } : v\n ),\n selectedVoucher:\n state.selectedVoucher?.id === id\n ? { ...state.selectedVoucher, ...updates }\n : state.selectedVoucher,\n }))\n },\n\n deleteVoucher: (id) => {\n set((state) => ({\n vouchers: state.vouchers.filter((v) => v.id !== id),\n selectedVoucher:\n state.selectedVoucher?.id === id ? null : state.selectedVoucher,\n }))\n },\n }),\n {\n name: 'vouchers-storage-v4',\n partialize: (state) => ({\n // Do NOT persist vouchers array globally in localStorage to prevent user data leakage across accounts\n selectedVoucher: null,\n }),\n }\n\n )\n)\n","import { create } from 'zustand'\r\nimport { persist } from 'zustand/middleware'\r\nimport { LinkTreeConfig, Project, LinkItem, SocialItem, ThemeConfig, ProfileConfig } from './types'\r\n\r\ninterface LinkMakerState {\r\n config: LinkTreeConfig\r\n projects: Project[]\r\n activeProjectId: string | null\r\n activeShortUrl: string | null\r\n activeShortUrlSuffix: string | null\r\n activeExpiresAt: string | null\r\n \r\n // Profile actions\r\n updateProfile: (profile: Partial<ProfileConfig>) => void\r\n \r\n // Link actions\r\n addLink: () => void\r\n updateLink: (id: string, updates: Partial<LinkItem>) => void\r\n removeLink: (id: string) => void\r\n reorderLinks: (index: number, direction: 'up' | 'down') => void\r\n \r\n // Social actions\r\n updateSocial: (platform: string, url: string, isEnabled: boolean) => void\r\n \r\n // Theme actions\r\n updateTheme: (themeUpdates: Partial<ThemeConfig>) => void\r\n \r\n // Project management actions\r\n saveProject: (name?: string) => string\r\n loadProject: (id: string) => void\r\n deleteProject: (id: string) => void\r\n createNewProject: (name: string) => void\r\n resetConfig: () => void\r\n\r\n // Tracking actions\r\n setShortUrl: (shortUrl: string, suffix: string, expiresAt: string) => void\r\n}\r\n\r\nconst DEFAULT_CONFIG: LinkTreeConfig = {\r\n profile: {\r\n name: 'Alex Rivera',\r\n bio: 'Senior UX Architect & Tech Writer | Crafting digital experiences ✨',\r\n avatarUrl: ''\r\n },\r\n links: [],\r\n socials: [],\r\n theme: {\r\n preset: 'custom',\r\n appTheme: 'system',\r\n appColorTheme: 'zinc'\r\n }\r\n}\r\n\r\nexport const useLinkMakerStore = create<LinkMakerState>()(\r\n persist(\r\n (set, get) => ({\r\n config: DEFAULT_CONFIG,\r\n projects: [],\r\n activeProjectId: null,\r\n activeShortUrl: null,\r\n activeShortUrlSuffix: null,\r\n activeExpiresAt: null,\r\n\r\n updateProfile: (profileUpdates) =>\r\n set((state) => ({\r\n config: {\r\n ...state.config,\r\n profile: {\r\n ...state.config.profile,\r\n ...profileUpdates\r\n }\r\n }\r\n })),\r\n\r\n addLink: () =>\r\n set((state) => {\r\n const newLink: LinkItem = {\r\n id: `link-${Date.now()}`,\r\n title: 'New Social Link',\r\n url: 'https://',\r\n icon: 'Link2',\r\n isEnabled: true,\r\n animation: 'none'\r\n }\r\n return {\r\n config: {\r\n ...state.config,\r\n links: [...state.config.links, newLink]\r\n }\r\n }\r\n }),\r\n\r\n updateLink: (id, updates) =>\r\n set((state) => ({\r\n config: {\r\n ...state.config,\r\n links: state.config.links.map((link) =>\r\n link.id === id ? { ...link, ...updates } : link\r\n )\r\n }\r\n })),\r\n\r\n removeLink: (id) =>\r\n set((state) => ({\r\n config: {\r\n ...state.config,\r\n links: state.config.links.filter((link) => link.id !== id)\r\n }\r\n })),\r\n\r\n reorderLinks: (index, direction) =>\r\n set((state) => {\r\n const links = [...state.config.links]\r\n const targetIndex = direction === 'up' ? index - 1 : index + 1\r\n \r\n if (targetIndex < 0 || targetIndex >= links.length) {\r\n return {} // Out of bounds\r\n }\r\n \r\n // Swap links\r\n const temp = links[index]\r\n links[index] = links[targetIndex]\r\n links[targetIndex] = temp\r\n \r\n return {\r\n config: {\r\n ...state.config,\r\n links\r\n }\r\n }\r\n }),\r\n\r\n updateSocial: (platform, url, isEnabled) =>\r\n set((state) => {\r\n const platformExists = state.config.socials.some((s) => s.platform === platform)\r\n let socials = []\r\n \r\n if (platformExists) {\r\n socials = state.config.socials.map((s) =>\r\n s.platform === platform ? { ...s, url, isEnabled } : s\r\n )\r\n } else {\r\n socials = [...state.config.socials, { platform, url, isEnabled }]\r\n }\r\n \r\n return {\r\n config: {\r\n ...state.config,\r\n socials\r\n }\r\n }\r\n }),\r\n\r\n updateTheme: (themeUpdates) =>\r\n set((state) => ({\r\n config: {\r\n ...state.config,\r\n theme: {\r\n ...state.config.theme,\r\n ...themeUpdates\r\n }\r\n }\r\n })),\r\n\r\n saveProject: (name) => {\r\n const state = get()\r\n const projectId = state.activeProjectId || `proj-${Date.now()}`\r\n const projectName = name || (state.activeProjectId \r\n ? state.projects.find((p) => p.id === state.activeProjectId)?.name || 'My Link Tree'\r\n : 'My Link Tree')\r\n \r\n const existingProject = state.projects.find((p) => p.id === projectId)\r\n\r\n const updatedProject: Project = {\r\n id: projectId,\r\n name: projectName,\r\n updatedAt: new Date().toISOString(),\r\n config: state.config,\r\n shortUrl: state.activeShortUrl || existingProject?.shortUrl,\r\n shortUrlSuffix: state.activeShortUrlSuffix || existingProject?.shortUrlSuffix,\r\n expiresAt: state.activeExpiresAt || existingProject?.expiresAt,\r\n }\r\n \r\n const projectIndex = state.projects.findIndex((p) => p.id === projectId)\r\n let updatedProjects = [...state.projects]\r\n \r\n if (projectIndex >= 0) {\r\n updatedProjects[projectIndex] = updatedProject\r\n } else {\r\n updatedProjects.push(updatedProject)\r\n }\r\n \r\n set({\r\n projects: updatedProjects,\r\n activeProjectId: projectId\r\n })\r\n \r\n return projectId\r\n },\r\n\r\n loadProject: (id) => {\r\n const state = get()\r\n const project = state.projects.find((p) => p.id === id)\r\n if (project) {\r\n set({\r\n config: project.config,\r\n activeProjectId: id,\r\n activeShortUrl: project.shortUrl || null,\r\n activeShortUrlSuffix: project.shortUrlSuffix || null,\r\n activeExpiresAt: project.expiresAt || null,\r\n })\r\n }\r\n },\r\n\r\n deleteProject: (id) =>\r\n set((state) => {\r\n const updatedProjects = state.projects.filter((p) => p.id !== id)\r\n const wasActive = state.activeProjectId === id\r\n return {\r\n projects: updatedProjects,\r\n activeProjectId: wasActive ? null : state.activeProjectId,\r\n config: wasActive ? DEFAULT_CONFIG : state.config,\r\n activeShortUrl: wasActive ? null : state.activeShortUrl,\r\n activeShortUrlSuffix: wasActive ? null : state.activeShortUrlSuffix,\r\n activeExpiresAt: wasActive ? null : state.activeExpiresAt,\r\n }\r\n }),\r\n\r\n createNewProject: (name) => {\r\n const id = `proj-${Date.now()}`\r\n const newProject: Project = {\r\n id,\r\n name,\r\n updatedAt: new Date().toISOString(),\r\n config: DEFAULT_CONFIG\r\n }\r\n \r\n set((state) => ({\r\n projects: [...state.projects, newProject],\r\n config: DEFAULT_CONFIG,\r\n activeProjectId: id,\r\n activeShortUrl: null,\r\n activeShortUrlSuffix: null,\r\n activeExpiresAt: null,\r\n }))\r\n },\r\n\r\n resetConfig: () =>\r\n set({\r\n config: DEFAULT_CONFIG,\r\n activeProjectId: null,\r\n activeShortUrl: null,\r\n activeShortUrlSuffix: null,\r\n activeExpiresAt: null,\r\n }),\r\n\r\n setShortUrl: (shortUrl, suffix, expiresAt) =>\r\n set((state) => {\r\n const updatedProjects = state.activeProjectId\r\n ? state.projects.map((p) =>\r\n p.id === state.activeProjectId\r\n ? { ...p, shortUrl, shortUrlSuffix: suffix, expiresAt }\r\n : p\r\n )\r\n : state.projects\r\n\r\n return {\r\n activeShortUrl: shortUrl,\r\n activeShortUrlSuffix: suffix,\r\n activeExpiresAt: expiresAt,\r\n projects: updatedProjects\r\n }\r\n })\r\n }),\r\n {\r\n name: 'link-maker-workspace'\r\n }\r\n )\r\n)\r\n\r\n// Export compatibility alias for cloned components\r\nexport const useLinkBuilderStore = useLinkMakerStore\r\n"],"mappings":"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","names":["create","create","create","create","persist"]}
|