Home / File/ use-iframe-sync.tsx — ui Source File

use-iframe-sync.tsx — ui Source File

Architecture documentation for use-iframe-sync.tsx, a tsx file in the ui codebase. 2 imports, 0 dependents.

File tsx DocumentationAtlas Changelog 2 imports 3 functions

Entity Profile

Dependency Diagram

graph LR
  6df3b824_805c_9704_1ce4_b3b332c22d53["use-iframe-sync.tsx"]
  1d141819_425e_b5fd_4c8e_32f7c6a42cf2["react"]
  6df3b824_805c_9704_1ce4_b3b332c22d53 --> 1d141819_425e_b5fd_4c8e_32f7c6a42cf2
  c27c6e95_5daf_4dd4_dc3a_add496837570["search-params"]
  6df3b824_805c_9704_1ce4_b3b332c22d53 --> c27c6e95_5daf_4dd4_dc3a_add496837570
  style 6df3b824_805c_9704_1ce4_b3b332c22d53 fill:#6366f1,stroke:#818cf8,color:#fff

Relationship Graph

Source Code

"use client"

import * as React from "react"

import type { DesignSystemSearchParams } from "@/app/(create)/lib/search-params"

type ParentToIframeMessage = {
  type: "design-system-params"
  data: DesignSystemSearchParams
}

export const isInIframe = () => {
  if (typeof window === "undefined") {
    return false
  }
  return window.self !== window.top
}

export function useIframeMessageListener<
  Message extends ParentToIframeMessage,
  MessageType extends Message["type"],
>(
  messageType: MessageType,
  onMessage: (data: Extract<Message, { type: MessageType }>["data"]) => void
) {
  React.useEffect(() => {
    if (!isInIframe()) {
      return
    }

    const handleMessage = (event: MessageEvent) => {
      if (event.data.type === messageType) {
        onMessage(event.data.data)
      }
    }

    window.addEventListener("message", handleMessage)
    return () => {
      window.removeEventListener("message", handleMessage)
    }
  }, [messageType, onMessage])
}

export function sendToIframe<
  Message extends ParentToIframeMessage,
  MessageType extends Message["type"],
>(
  iframe: HTMLIFrameElement | null,
  messageType: MessageType,
  data: Extract<Message, { type: MessageType }>["data"]
) {
  if (!iframe?.contentWindow) {
    return
  }

  iframe.contentWindow.postMessage(
    {
      type: messageType,
      data,
    },
    "*"
  )
}

Subdomains

Dependencies

  • react
  • search-params

Frequently Asked Questions

What does use-iframe-sync.tsx do?
use-iframe-sync.tsx is a source file in the ui codebase, written in tsx. It belongs to the DocumentationAtlas domain, Changelog subdomain.
What functions are defined in use-iframe-sync.tsx?
use-iframe-sync.tsx defines 3 function(s): isInIframe, sendToIframe, useIframeMessageListener.
What does use-iframe-sync.tsx depend on?
use-iframe-sync.tsx imports 2 module(s): react, search-params.
Where is use-iframe-sync.tsx in the architecture?
use-iframe-sync.tsx is located at apps/v4/app/(create)/hooks/use-iframe-sync.tsx (domain: DocumentationAtlas, subdomain: Changelog, directory: apps/v4/app/(create)/hooks).

Analyze Your Own Codebase

Get architecture documentation, dependency graphs, and domain analysis for your codebase in minutes.

Try Supermodel Free