@@ -28,6 +28,9 @@ import {
2828 getUnpresentedSnapEffects ,
2929 hasPendingSnapAction ,
3030 markSnapEffectsPresented ,
31+ optionalSnapStringArray ,
32+ resolveSnapActionParams ,
33+ validateSnapActionTargetUrl ,
3134 type SnapRenderState ,
3235} from "../render-state" ;
3336import type { SnapPage , SnapActionHandlers , JsonValue } from "./types" ;
@@ -42,6 +45,11 @@ function optionalString(value: unknown): string | undefined {
4245 return value ? String ( value ) : undefined ;
4346}
4447
48+ function validActionTarget ( value : unknown ) : string | undefined {
49+ const target = String ( value ?? "" ) ;
50+ return validateSnapActionTargetUrl ( target ) ? undefined : target ;
51+ }
52+
4553function recordValue ( value : unknown ) : Record < string , unknown > | undefined {
4654 return value && typeof value === "object" && ! Array . isArray ( value )
4755 ? ( value as Record < string , unknown > )
@@ -259,8 +267,8 @@ export function SnapViewCoreInner({
259267 ) ;
260268
261269 const handleAction = useCallback ( ( name : unknown , params : unknown ) => {
270+ const p = resolveSnapActionParams ( params , stateRef . current ) ;
262271 const inputs = ( stateRef . current . inputs ?? { } ) as Record < string , JsonValue > ;
263- const p = ( params ?? { } ) as Record < string , unknown > ;
264272 const h = handlersRef . current ;
265273 let result : unknown ;
266274 setActionPending ( name , p ) ;
@@ -269,15 +277,21 @@ export function SnapViewCoreInner({
269277 case "submit" :
270278 result = h . submit ( String ( p . target ?? "" ) , inputs ) ;
271279 break ;
272- case "open_url" :
273- result = h . open_url ( String ( p . target ?? "" ) ) ;
280+ case "open_url" : {
281+ const target = validActionTarget ( p . target ) ;
282+ if ( target ) result = h . open_url ( target ) ;
274283 break ;
275- case "open_snap" :
276- result = h . open_snap ( String ( p . target ?? "" ) ) ;
284+ }
285+ case "open_snap" : {
286+ const target = validActionTarget ( p . target ) ;
287+ if ( target ) result = h . open_snap ( target ) ;
277288 break ;
278- case "open_mini_app" :
279- result = h . open_mini_app ( String ( p . target ?? "" ) ) ;
289+ }
290+ case "open_mini_app" : {
291+ const target = validActionTarget ( p . target ) ;
292+ if ( target ) result = h . open_mini_app ( target ) ;
280293 break ;
294+ }
281295 case "view_cast" :
282296 result = h . view_cast ( { hash : String ( p . hash ?? "" ) } ) ;
283297 break ;
@@ -291,7 +305,7 @@ export function SnapViewCoreInner({
291305 result = h . compose_cast ( {
292306 text : p . text ? String ( p . text ) : undefined ,
293307 channelKey : p . channelKey ? String ( p . channelKey ) : undefined ,
294- embeds : Array . isArray ( p . embeds ) ? ( p . embeds as string [ ] ) : undefined ,
308+ embeds : optionalSnapStringArray ( p . embeds ) ,
295309 } ) ;
296310 break ;
297311 case "view_token" :
0 commit comments