Merge pull request #86 from kitpdr/fix/convex-client-setup
fix(deploy): align convex setup with static env
2 files · +25 -12
M src/lib/components/chat-room.svelte +25 -10
| @@ -7,6 +7,7 @@ | |||
| 7 | 7 | import { onMount, tick } from 'svelte'; | |
| 8 | 8 | import { SvelteSet, SvelteMap } from 'svelte/reactivity'; | |
| 9 | 9 | import { browser } from '$app/environment'; | |
| 10 | + | import { env } from '$env/dynamic/public'; | |
| 10 | 11 | import { api } from '$lib/api/client'; | |
| 11 | 12 | import { draggable } from '$lib/actions/draggable'; | |
| 12 | 13 | import { resizable } from '$lib/actions/resizable'; | |
| @@ -39,27 +40,31 @@ | |||
| 39 | 40 | initialTextStyle?: TextStyle; | |
| 40 | 41 | }>(); | |
| 41 | 42 | ||
| 43 | + | const isClient = browser && Boolean(env.PUBLIC_CONVEX_URL); | |
| 44 | + | ||
| 42 | 45 | // ============ CONVEX REAL-TIME SUBSCRIPTIONS ============ | |
| 43 | 46 | ||
| 44 | 47 | // Subscribe to default room (to get room ID) | |
| 45 | - | const defaultRoomQuery = useQuery(convexApi.queries.getDefaultRoomPublic, {}); | |
| 48 | + | const defaultRoomQuery = isClient ? useQuery(convexApi.queries.getDefaultRoomPublic, {}) : null; | |
| 46 | 49 | ||
| 47 | 50 | // Subscribe to users (buddy list) - real-time updates | |
| 48 | - | const usersQuery = useQuery(convexApi.queries.getUsersPublic, {}); | |
| 51 | + | const usersQuery = isClient ? useQuery(convexApi.queries.getUsersPublic, {}) : null; | |
| 49 | 52 | ||
| 50 | 53 | // Room ID from Convex query | |
| 51 | - | const roomId = $derived(defaultRoomQuery.data?.id as Id<'chatRooms'> | undefined); | |
| 54 | + | const roomId = $derived(defaultRoomQuery?.data?.id as Id<'chatRooms'> | undefined); | |
| 52 | 55 | ||
| 53 | 56 | // Subscribe to messages - only when room ID is available | |
| 54 | 57 | const messagesQuery = $derived( | |
| 55 | - | roomId ? useQuery(convexApi.queries.getMessagesPublic, () => ({ roomId: roomId! })) : null | |
| 58 | + | roomId && isClient | |
| 59 | + | ? useQuery(convexApi.queries.getMessagesPublic, () => ({ roomId: roomId! })) | |
| 60 | + | : null | |
| 56 | 61 | ); | |
| 57 | 62 | ||
| 58 | - | const convexClient = useConvexClient(); | |
| 63 | + | const convexClient = isClient ? useConvexClient() : null; | |
| 59 | 64 | ||
| 60 | 65 | // Transform Convex users to SafeUser format | |
| 61 | 66 | const onlineUsers = $derived.by<SafeUser[]>(() => { | |
| 62 | - | if (!usersQuery.data) return []; | |
| 67 | + | if (!usersQuery?.data) return []; | |
| 63 | 68 | return usersQuery.data | |
| 64 | 69 | .map((u) => ({ | |
| 65 | 70 | id: u.id, | |
| @@ -122,11 +127,13 @@ | |||
| 122 | 127 | ||
| 123 | 128 | // Loading and error states from Convex | |
| 124 | 129 | const isInitialLoading = $derived( | |
| 125 | - | defaultRoomQuery.isLoading || usersQuery.isLoading || messagesQuery?.isLoading | |
| 130 | + | (defaultRoomQuery?.isLoading ?? false) || | |
| 131 | + | (usersQuery?.isLoading ?? false) || | |
| 132 | + | (messagesQuery?.isLoading ?? false) | |
| 126 | 133 | ); | |
| 127 | 134 | const connectionError = $derived.by<string | null>(() => { | |
| 128 | - | if (defaultRoomQuery.error) return 'Erreur de connexion au salon'; | |
| 129 | - | if (usersQuery.error) return 'Erreur de chargement des utilisateurs'; | |
| 135 | + | if (defaultRoomQuery?.error) return 'Erreur de connexion au salon'; | |
| 136 | + | if (usersQuery?.error) return 'Erreur de chargement des utilisateurs'; | |
| 130 | 137 | if (messagesQuery?.error) return 'Erreur de chargement des messages'; | |
| 131 | 138 | return null; | |
| 132 | 139 | }); | |
| @@ -950,7 +957,15 @@ | |||
| 950 | 957 | const target = event.target as HTMLElement; | |
| 951 | 958 | const { scrollTop } = target; | |
| 952 | 959 | ||
| 953 | - | if (scrollTop < 100 && !isLoadingMore && hasMoreMessages && roomId && chatArea && currentUser) { | |
| 960 | + | if ( | |
| 961 | + | scrollTop < 100 && | |
| 962 | + | !isLoadingMore && | |
| 963 | + | hasMoreMessages && | |
| 964 | + | roomId && | |
| 965 | + | chatArea && | |
| 966 | + | currentUser && | |
| 967 | + | convexClient | |
| 968 | + | ) { | |
| 954 | 969 | isLoadingMore = true; | |
| 955 | 970 | const prevScrollHeight = chatArea.scrollHeight; | |
| 956 | 971 | const prevScrollTop = chatArea.scrollTop; | |
| @@ -7,6 +7,7 @@ | |||||
| 7 | import { onMount, tick } from 'svelte'; | 7 | import { onMount, tick } from 'svelte'; | ||
| 8 | import { SvelteSet, SvelteMap } from 'svelte/reactivity'; | 8 | import { SvelteSet, SvelteMap } from 'svelte/reactivity'; | ||
| 9 | import { browser } from '$app/environment'; | 9 | import { browser } from '$app/environment'; | ||
| 10 | + | import { env } from '$env/dynamic/public'; | |||
| 10 | import { api } from '$lib/api/client'; | 11 | import { api } from '$lib/api/client'; | ||
| 11 | import { draggable } from '$lib/actions/draggable'; | 12 | import { draggable } from '$lib/actions/draggable'; | ||
| 12 | import { resizable } from '$lib/actions/resizable'; | 13 | import { resizable } from '$lib/actions/resizable'; | ||
| @@ -39,27 +40,31 @@ | |||||
| 39 | initialTextStyle?: TextStyle; | 40 | initialTextStyle?: TextStyle; | ||
| 40 | }>(); | 41 | }>(); | ||
| 41 | 42 | ||||
| 43 | + | const isClient = browser && Boolean(env.PUBLIC_CONVEX_URL); | |||
| 44 | + | ||||
| 42 | // ============ CONVEX REAL-TIME SUBSCRIPTIONS ============ | 45 | // ============ CONVEX REAL-TIME SUBSCRIPTIONS ============ | ||
| 43 | 46 | ||||
| 44 | // Subscribe to default room (to get room ID) | 47 | // Subscribe to default room (to get room ID) | ||
| 45 | - | const defaultRoomQuery = useQuery(convexApi.queries.getDefaultRoomPublic, {}); | 48 | + | const defaultRoomQuery = isClient ? useQuery(convexApi.queries.getDefaultRoomPublic, {}) : null; |
| 46 | 49 | ||||
| 47 | // Subscribe to users (buddy list) - real-time updates | 50 | // Subscribe to users (buddy list) - real-time updates | ||
| 48 | - | const usersQuery = useQuery(convexApi.queries.getUsersPublic, {}); | 51 | + | const usersQuery = isClient ? useQuery(convexApi.queries.getUsersPublic, {}) : null; |
| 49 | 52 | ||||
| 50 | // Room ID from Convex query | 53 | // Room ID from Convex query | ||
| 51 | - | const roomId = $derived(defaultRoomQuery.data?.id as Id<'chatRooms'> | undefined); | 54 | + | const roomId = $derived(defaultRoomQuery?.data?.id as Id<'chatRooms'> | undefined); |
| 52 | 55 | ||||
| 53 | // Subscribe to messages - only when room ID is available | 56 | // Subscribe to messages - only when room ID is available | ||
| 54 | const messagesQuery = $derived( | 57 | const messagesQuery = $derived( | ||
| 55 | - | roomId ? useQuery(convexApi.queries.getMessagesPublic, () => ({ roomId: roomId! })) : null | 58 | + | roomId && isClient |
| 59 | + | ? useQuery(convexApi.queries.getMessagesPublic, () => ({ roomId: roomId! })) | |||
| 60 | + | : null | |||
| 56 | ); | 61 | ); | ||
| 57 | 62 | ||||
| 58 | - | const convexClient = useConvexClient(); | 63 | + | const convexClient = isClient ? useConvexClient() : null; |
| 59 | 64 | ||||
| 60 | // Transform Convex users to SafeUser format | 65 | // Transform Convex users to SafeUser format | ||
| 61 | const onlineUsers = $derived.by<SafeUser[]>(() => { | 66 | const onlineUsers = $derived.by<SafeUser[]>(() => { | ||
| 62 | - | if (!usersQuery.data) return []; | 67 | + | if (!usersQuery?.data) return []; |
| 63 | return usersQuery.data | 68 | return usersQuery.data | ||
| 64 | .map((u) => ({ | 69 | .map((u) => ({ | ||
| 65 | id: u.id, | 70 | id: u.id, | ||
| @@ -122,11 +127,13 @@ | |||||
| 122 | 127 | ||||
| 123 | // Loading and error states from Convex | 128 | // Loading and error states from Convex | ||
| 124 | const isInitialLoading = $derived( | 129 | const isInitialLoading = $derived( | ||
| 125 | - | defaultRoomQuery.isLoading || usersQuery.isLoading || messagesQuery?.isLoading | 130 | + | (defaultRoomQuery?.isLoading ?? false) || |
| 131 | + | (usersQuery?.isLoading ?? false) || | |||
| 132 | + | (messagesQuery?.isLoading ?? false) | |||
| 126 | ); | 133 | ); | ||
| 127 | const connectionError = $derived.by<string | null>(() => { | 134 | const connectionError = $derived.by<string | null>(() => { | ||
| 128 | - | if (defaultRoomQuery.error) return 'Erreur de connexion au salon'; | 135 | + | if (defaultRoomQuery?.error) return 'Erreur de connexion au salon'; |
| 129 | - | if (usersQuery.error) return 'Erreur de chargement des utilisateurs'; | 136 | + | if (usersQuery?.error) return 'Erreur de chargement des utilisateurs'; |
| 130 | if (messagesQuery?.error) return 'Erreur de chargement des messages'; | 137 | if (messagesQuery?.error) return 'Erreur de chargement des messages'; | ||
| 131 | return null; | 138 | return null; | ||
| 132 | }); | 139 | }); | ||
| @@ -950,7 +957,15 @@ | |||||
| 950 | const target = event.target as HTMLElement; | 957 | const target = event.target as HTMLElement; | ||
| 951 | const { scrollTop } = target; | 958 | const { scrollTop } = target; | ||
| 952 | 959 | ||||
| 953 | - | if (scrollTop < 100 && !isLoadingMore && hasMoreMessages && roomId && chatArea && currentUser) { | 960 | + | if ( |
| 961 | + | scrollTop < 100 && | |||
| 962 | + | !isLoadingMore && | |||
| 963 | + | hasMoreMessages && | |||
| 964 | + | roomId && | |||
| 965 | + | chatArea && | |||
| 966 | + | currentUser && | |||
| 967 | + | convexClient | |||
| 968 | + | ) { | |||
| 954 | isLoadingMore = true; | 969 | isLoadingMore = true; | ||
| 955 | const prevScrollHeight = chatArea.scrollHeight; | 970 | const prevScrollHeight = chatArea.scrollHeight; | ||
| 956 | const prevScrollTop = chatArea.scrollTop; | 971 | const prevScrollTop = chatArea.scrollTop; | ||
M src/routes/+layout.svelte +0 -2
| @@ -9,8 +9,6 @@ | |||
| 9 | 9 | // Initialize Convex client for real-time subscriptions | |
| 10 | 10 | if (browser && env.PUBLIC_CONVEX_URL) { | |
| 11 | 11 | setupConvex(env.PUBLIC_CONVEX_URL); | |
| 12 | - | } else if (browser && !env.PUBLIC_CONVEX_URL) { | |
| 13 | - | console.error('Missing PUBLIC_CONVEX_URL for Convex client setup'); | |
| 14 | 12 | } | |
| 15 | 13 | ||
| 16 | 14 | let { children, data } = $props(); | |
| @@ -9,8 +9,6 @@ | |||||
| 9 | // Initialize Convex client for real-time subscriptions | 9 | // Initialize Convex client for real-time subscriptions | ||
| 10 | if (browser && env.PUBLIC_CONVEX_URL) { | 10 | if (browser && env.PUBLIC_CONVEX_URL) { | ||
| 11 | setupConvex(env.PUBLIC_CONVEX_URL); | 11 | setupConvex(env.PUBLIC_CONVEX_URL); | ||
| 12 | - | } else if (browser && !env.PUBLIC_CONVEX_URL) { | |||
| 13 | - | console.error('Missing PUBLIC_CONVEX_URL for Convex client setup'); | |||
| 14 | } | 12 | } | ||
| 15 | 13 | ||||
| 16 | let { children, data } = $props(); | 14 | let { children, data } = $props(); | ||