0.0.14 • Published 1 year ago

liaison-react v0.0.14

Weekly downloads
-
License
MIT
Repository
github
Last release
1 year ago

Liaison React SDK

liaison-core is a wrapper on the browser postMessage API, which allows windows and embedded iframes to securely send messages and data using CORS.

  • Please reference this library for more information on the core API.

liaison-react exports React hooks that can be used to utilize this library in a more Reacty way.

Parent Model in Action

// ... App.tsx
import { useState } from 'react';
import { useParent } from 'liaison-react';
import { nanoid } from 'nanoid';

import './App.css'

function timeout(ms: number) {
  return new Promise(resolve => setTimeout(resolve, ms));
}

function App() {
  const [logoutRequests, setLogoutRequests] = useState(0);

  const { callIFrameEffect } = useParent({
    iframe: {
      id: 'my-embedded-iframe',
      src: 'http://localhost:3002',
    }
    effects: {
      logout: () => {
        setLogoutRequests(prevNumber => prevNumber + 1);
      },
      sendToken: ({ callIFrameEffect }) => {
        const token = nanoid();
        callIFrameEffect({
          name: 'saveToken',
          args: {token},
        });
      },
      sendTokenAsync: async ({ callIFrameEffect }) => {
        await timeout(3000);
        const token = nanoid();
        callIFrameEffect({
          name: 'saveToken',
          args: {token},
        });
      }
    }
  })

  return (
    <>
      <h1>Parent Window</h1>
      <div className='buttons'>
        <p>Request to run events within the iFrame!</p>
        <button onClick={initiateChildLogout}>
          Initiate <em>Child</em> Logout Process
        </button>
      </div>
      <div>
        <h2>Logout Requests:</h2>
        <p>{logoutRequests}</p>
      </div>
      <div id="my-embedded-iframe-container">
        <iframe id="my-embedded-iframe" src="http://localhost:3002" className="iframe"></iframe>
      </div>
    </>
  )

  function initiateChildLogout() {
    callIFrameEffect({ name: 'logout', args: {} });
  }
}

export default App

// ... main.tsx
import React from 'react'
import ReactDOM from 'react-dom/client'
import App from './App.tsx'
import './index.css'

ReactDOM.createRoot(document.getElementById('root') as HTMLElement).render(
  <React.StrictMode>
    <App />
  </React.StrictMode>,
)

IFrame Model in Action

// ... App.tsx
import { useState } from 'react';
import { useIFrame } from 'liaison-react';
import './App.css'

function App() {
  const [logoutRequests, setLogoutRequests] = useState(0);
  const [tokens, setTokens] = useState<Array<string>>([]);

  const { callParentEffect } = useIFrame({
    parentOrigin: 'http://localhost:3003',
    effects: {
      logout: () => setLogoutRequests(prevNum => prevNum + 1),
      saveToken: ({ args: { token } }) => {
        setTokens(prevTokens => [...prevTokens, token]);
      },
      saveTokenAsync: ({ args: { token } }) => {
        setTokens(prevTokens => [...prevTokens, token]);
      },
    }
  })

  return (
    <>
      <h1>Child Window</h1>
      <div className="buttons">
        <p className="buttons-header">Request to run events within the Parent window!</p>
        <button onClick={initiateParentLogout} className="btn">Initiate <em>Parent</em> Logout Process</button>
        <button onClick={requestTokenFromParent} className="btn">Request Token from Parent (Get Synchronously)</button>
        <button onClick={requestTokenFromParentAsync} className="btn">Request Token from Parent (Get Asynchronously)</button>
      </div>
      <div>
        <h2>Logout Requests:</h2>
        <p>{logoutRequests}</p>
        <h2>Tokens:</h2>
        <ul>
          {tokens.map((token) => <li key={token}>Token: {token}</li>)}
        </ul>
      </div>
    </>
  )

  function initiateParentLogout() {
    callParentEffect({
      name: 'logout',
    })
  }

  function requestTokenFromParent() {
    callParentEffect({
      name: 'sendToken',
    })
  }

  function requestTokenFromParentAsync() {
    callParentEffect({
      name: 'sendTokenAsync',
    })
  }

}

export default App

// ... main.tsx
import React from 'react'
import ReactDOM from 'react-dom/client'
import App from './App.tsx'
import './index.css'

ReactDOM.createRoot(document.getElementById('root') as HTMLElement).render(
  <React.StrictMode>
    <App />
  </React.StrictMode>,
)
0.0.14

1 year ago

0.0.13

1 year ago

0.0.12

1 year ago

0.0.11

1 year ago

0.0.10

1 year ago

0.0.9

1 year ago

0.0.8

1 year ago

0.0.7

1 year ago

0.0.6

1 year ago

0.0.5

1 year ago

0.0.4

1 year ago

0.0.2

1 year ago

0.0.1

1 year ago