serverless-workflow-examples/serverless-workflow-loanbroker-showcase/loanbroker-js/pages/_app.tsx (46 lines of code) (raw):

import { NextPage } from "next"; import type { AppProps } from "next/app"; import { ReactElement, ReactNode, useEffect } from "react"; import { RecoilRoot, useRecoilState } from "recoil"; import QuoteResponse from "../model/QuoteResponse"; import Communication from "../services/Communication"; import { pendingState, quotesListState } from "../state/atoms"; import "../styles/main.scss"; export type NextPageWithLayout<P = {}, IP = P> = NextPage<P, IP> & { getLayout?: (page: ReactElement) => ReactNode; }; type AppPropsWithLayout = AppProps & { Component: NextPageWithLayout; }; var connected = false; var socket: WebSocket; const WebSocketComponent = () => { const [quotes, setQuotes] = useRecoilState(quotesListState); const [pending, setPending] = useRecoilState(pendingState); useEffect(() => { if (!connected) { socket = new WebSocket( process.env.NEXT_PUBLIC_WEBSOCKET_URL || "ws://localhost:8080/socket/quote/new" ); } socket.onopen = function () { console.log("Connected to backend"); connected = true; }; socket.onmessage = function (m) { const quote: QuoteResponse = JSON.parse(m.data); setQuotes((oldState) => [...oldState, quote]); setPending((old) => old.filter((elem) => elem.id !== quote.loanRequestId) ); }; socket.onerror = (e) => { console.log("WebSocket error: ", e); }; }); return <></>; }; export default function MyApp({ Component, pageProps }: AppPropsWithLayout) { useEffect(() => { require("bootstrap/dist/js/bootstrap.bundle.min.js"); }); // Use the layout defined at the page level, if available const getLayout = Component.getLayout ?? ((page) => page); return getLayout( <RecoilRoot> <WebSocketComponent /> <Component {...pageProps} /> </RecoilRoot> ); }