-
-
Notifications
You must be signed in to change notification settings - Fork 2.3k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
fix: improve Supabase liveProvider filter handling #6573
base: next
Are you sure you want to change the base?
Changes from 4 commits
9a0a393
d9d7edd
6600f6b
89e14aa
2dd33b1
2cf3427
4d3291a
f9e968e
fd447ca
19d371f
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,8 @@ | ||
--- | ||
"@refinedev/supabase": patch | ||
--- | ||
|
||
fix: handle multiple filters in Supabase liveProvider. | ||
This update addresses the handling of multiple filters in the Supabase liveProvider. It ensures only the first filter is applied and introduces a configurable `meta.realtimeFilter` option for custom filter behavior. A warning is logged when multiple filters are detected. | ||
|
||
Resolves [#6360](https://github.com/refinedev/refine/issues/6360) | ||
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -7,6 +7,8 @@ import type { | |
import { liveTypes, supabaseTypes } from "../types"; | ||
import { mapOperator } from "../utils"; | ||
|
||
const supportedOperators = ["eq", "neq", "gt", "lt", "gte", "lte"]; | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
|
||
|
||
export const liveProvider = ( | ||
supabaseClient: SupabaseClient<any, any, any>, | ||
): LiveProvider => { | ||
|
@@ -49,14 +51,30 @@ export const liveProvider = ( | |
} | ||
}; | ||
|
||
const mapFilter = (filters?: CrudFilters): string | undefined => { | ||
const mapFilter = ( | ||
filters?: CrudFilters, | ||
meta?: any, | ||
): string | undefined => { | ||
if (!filters || filters?.length === 0) { | ||
return; | ||
} | ||
|
||
return filters | ||
if (filters.length > 1) { | ||
console.warn( | ||
"Warning: Multiple filters detected. Supabase Realtime currently supports only a single filter. The first filter will be applied. To customize this behavior, use the 'meta.realtimeFilter' property.", | ||
); | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. This always logs a warning even if There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Please consider using There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I've implemented Screen.Recording.2025-01-01.231040.mp4 |
||
} | ||
|
||
const effectiveFilter = meta?.realtimeFilter | ||
? [meta.realtimeFilter] | ||
: [filters[0]]; | ||
|
||
return effectiveFilter | ||
.map((filter: CrudFilter): string | undefined => { | ||
if ("field" in filter) { | ||
if ( | ||
"field" in filter && | ||
supportedOperators.includes(filter.operator) | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. This also needs to be logged if unsupported filters are used. |
||
) { | ||
return `${filter.field}=${mapOperator(filter.operator)}.${ | ||
filter.value | ||
}`; | ||
|
@@ -70,7 +88,7 @@ export const liveProvider = ( | |
const events = types | ||
.map((x) => supabaseTypes[x]) | ||
.sort((a, b) => a.localeCompare(b)); | ||
const filter = mapFilter(params?.filters); | ||
const filter = mapFilter(params?.filters, meta); | ||
const ch = `${channel}:${events.join("|")}${filter ? `:${filter}` : ""}`; | ||
|
||
let client = supabaseClient.channel(ch); | ||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.