Skip to content

Commit

Permalink
chore(connect-ui): mirror store to local react state
Browse files Browse the repository at this point in the history
  • Loading branch information
mroz22 committed Jan 7, 2024
1 parent 816b41d commit 25779ff
Show file tree
Hide file tree
Showing 3 changed files with 31 additions and 5 deletions.
4 changes: 2 additions & 2 deletions packages/connect-popup/src/view/common.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -3,15 +3,15 @@
import { POPUP, ERRORS, PopupInit, CoreMessage, createUiResponse } from '@trezor/connect';
import { createRoot } from 'react-dom/client';

import { ConnectUI, State } from '@trezor/connect-ui';
import { ConnectUI, State, getDefaultState } from '@trezor/connect-ui';
import { StyleSheetWrapper } from './react/StylesSheetWrapper';
import { reactEventBus } from '@trezor/connect-ui/src/utils/eventBus';

export const header: HTMLElement = document.getElementsByTagName('header')[0];
export const container: HTMLElement = document.getElementById('container')!;
export const views: HTMLElement = document.getElementById('views')!;

let state: State = {};
let state: State = getDefaultState();

export const setState = (newState: Partial<State>) => (state = { ...state, ...newState });
export const getState = () => state;
Expand Down
24 changes: 24 additions & 0 deletions packages/connect-ui/src/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ import { useCallback, useEffect, useState, useMemo, ReactNode } from 'react';
import styled from 'styled-components';

import { PostMessage, UI, UI_REQUEST, POPUP, createPopupMessage } from '@trezor/connect';
import { storage, OriginBoundState } from '@trezor/connect-common';

// views
import { Transport } from './views/Transport';
Expand Down Expand Up @@ -67,8 +68,31 @@ export const ConnectUI = ({ postMessage, clearLegacyView }: ConnectUIProps) => {
useEffect(() => {
reactEventBus.dispatch({ type: 'connect-ui-rendered' });
initAnalytics();

// subscribe to changes
storage.on('changed', storageNextState => {
setState(prevState => ({ ...prevState, ...storageNextState }));
});
}, []);

useEffect(() => {
if (!state?.settings?.origin) return;

const data = storage.loadForOrigin(state.settings.origin);

const getNextState = (prevState: State, originBoundState: OriginBoundState) => ({
...prevState,
...originBoundState,
});

// load initial data
setState(prevState => getNextState(prevState, data));

return () => {
storage.removeAllListeners();
};
}, [state?.settings?.origin]);

const [Component, Notifications] = useMemo(() => {
let component: ReactNode | null;

Expand Down
8 changes: 5 additions & 3 deletions packages/connect-ui/src/types.ts
Original file line number Diff line number Diff line change
@@ -1,13 +1,15 @@
import { PopupHandshake, PopupMethodInfo, IFrameLoaded } from '@trezor/connect';
import type { Core } from '@trezor/connect/lib/core';
import type { OriginBoundState } from '@trezor/connect-common';

export type State = Partial<PopupHandshake['payload']> &
Partial<PopupMethodInfo['payload']> &
Partial<IFrameLoaded['payload']> & {
iframe?: Window;
broadcast?: BroadcastChannel;
core?: Core;
// preferred device will appear here
};
} & Partial<OriginBoundState>;

export const getDefaultState = (): State => ({});
export const getDefaultState = (): State => ({
permissions: [],
});

0 comments on commit 25779ff

Please sign in to comment.