@@ -116,22 +116,35 @@ const useRelaySettings = () => {
116116 // Handle kinds based on mode
117117 const backendKinds = backendData . event_filtering . kind_whitelist || [ ] ;
118118
119+ // Get all stored dynamic kinds from localStorage
120+ const allStoredDynamicKinds = JSON . parse ( localStorage . getItem ( 'dynamicKinds' ) || '[]' ) ;
121+
119122 if ( settings . mode === 'blacklist' ) {
120123 // In blacklist mode: backend sends allowed kinds, we need to calculate blocked kinds
121124 const allPossibleKinds = getAllPossibleKinds ( ) ;
122125 const backendKindsSet = new Set ( backendKinds ) ;
123126 const allKindsSet = new Set ( allPossibleKinds ) ;
124127
125- // Calculate blocked kinds: all possible kinds minus backend allowed kinds
126- const blockedKinds = Array . from ( allKindsSet ) . filter ( kind => ! backendKindsSet . has ( kind ) ) ;
128+ // Calculate blocked predefined kinds: all possible kinds minus backend allowed kinds
129+ const blockedPredefinedKinds = Array . from ( allKindsSet ) . filter ( kind => ! backendKindsSet . has ( kind ) ) ;
127130 // Only show non-core kinds as blocked (core kinds can't be blocked)
128- settings . kinds = blockedKinds . filter ( kind => ! isCoreKind ( kind ) ) ;
131+ settings . kinds = blockedPredefinedKinds . filter ( kind => ! isCoreKind ( kind ) ) ;
132+
133+ // Calculate blocked dynamic kinds: stored dynamic kinds that are NOT in backend allowed kinds
134+ settings . dynamicKinds = allStoredDynamicKinds . filter ( ( kind : string ) => ! backendKindsSet . has ( kind ) ) ;
129135
130136 console . log ( '[useRelaySettings] Blacklist mode - Backend allowed kinds:' , backendKinds ) ;
131- console . log ( '[useRelaySettings] Blacklist mode - Calculated blocked kinds:' , settings . kinds ) ;
137+ console . log ( '[useRelaySettings] Blacklist mode - Calculated blocked predefined kinds:' , settings . kinds ) ;
138+ console . log ( '[useRelaySettings] Blacklist mode - Calculated blocked dynamic kinds:' , settings . dynamicKinds ) ;
132139 } else {
133140 // In whitelist mode: backend sends allowed kinds directly
134- settings . kinds = ensureCoreKinds ( backendKinds ) ;
141+ // Separate predefined kinds from dynamic kinds
142+ const allPossibleKinds = getAllPossibleKinds ( ) ;
143+ const predefinedKinds = backendKinds . filter ( ( kind : string ) => allPossibleKinds . includes ( kind ) ) ;
144+ const dynamicKinds = backendKinds . filter ( ( kind : string ) => ! allPossibleKinds . includes ( kind ) && allStoredDynamicKinds . includes ( kind ) ) ;
145+
146+ settings . kinds = ensureCoreKinds ( predefinedKinds ) ;
147+ settings . dynamicKinds = dynamicKinds ;
135148 }
136149
137150 // Extract mime types and file sizes from actual backend format
@@ -242,9 +255,20 @@ const useRelaySettings = () => {
242255 event_filtering : {
243256 mode : settings . mode ,
244257 moderation_mode : settings . moderationMode ,
245- kind_whitelist : settings . mode === 'blacklist'
246- ? calculateInverseKinds ( settings . kinds ) // For blacklist: send inverse (all kinds except blocked ones)
247- : ensureCoreKinds ( settings . kinds ) , // For whitelist: send selected kinds directly
258+ kind_whitelist : ( ( ) => {
259+ if ( settings . mode === 'blacklist' ) {
260+ // For blacklist: get all predefined allowed kinds, then add unblocked dynamic kinds
261+ const predefinedAllowed = calculateInverseKinds ( settings . kinds ) ;
262+ // Get all stored dynamic kinds from localStorage
263+ const allStoredDynamicKinds = JSON . parse ( localStorage . getItem ( 'dynamicKinds' ) || '[]' ) ;
264+ // Add dynamic kinds that are NOT blocked (not in settings.dynamicKinds)
265+ const allowedDynamicKinds = allStoredDynamicKinds . filter ( ( kind : string ) => ! settings . dynamicKinds . includes ( kind ) ) ;
266+ return [ ...predefinedAllowed , ...allowedDynamicKinds ] ;
267+ } else {
268+ // For whitelist: send all selected kinds (including dynamic)
269+ return ensureCoreKinds ( [ ...settings . kinds , ...settings . dynamicKinds ] ) ;
270+ }
271+ } ) ( ) ,
248272 media_definitions : mediaDefinitions ,
249273 dynamic_kinds : {
250274 enabled : false ,
0 commit comments