From cd18a7a046d6e35d5ca758eeb9ca5f39462746bf Mon Sep 17 00:00:00 2001 From: simeng-li Date: Tue, 24 May 2022 11:38:20 +0800 Subject: [PATCH] refactor(ui): use postMessage on preview (#929) * refactor(ui): use postMessage on preview use postMessage on preview * fix(ui): cr fix cr fix * fix(ui): cr fix cr fix * fix(ui): cr fix cr fix --- .../SignInExperience/components/Preview.tsx | 50 ++++++++---- packages/ui/src/App.module.scss | 9 +++ packages/ui/src/App.tsx | 22 +++--- .../ui/src/components/AppContent/index.tsx | 18 +---- packages/ui/src/hooks/use-api.ts | 8 +- packages/ui/src/hooks/use-page-context.ts | 2 +- packages/ui/src/hooks/use-preview.ts | 79 +++++++++++++------ packages/ui/src/hooks/use-theme.ts | 11 +-- 8 files changed, 118 insertions(+), 81 deletions(-) create mode 100644 packages/ui/src/App.module.scss diff --git a/packages/console/src/pages/SignInExperience/components/Preview.tsx b/packages/console/src/pages/SignInExperience/components/Preview.tsx index b12719d4d..b17058a16 100644 --- a/packages/console/src/pages/SignInExperience/components/Preview.tsx +++ b/packages/console/src/pages/SignInExperience/components/Preview.tsx @@ -2,7 +2,7 @@ import { Language } from '@logto/phrases'; import { AppearanceMode, ConnectorDTO, ConnectorMetadata, SignInExperience } from '@logto/schemas'; import classNames from 'classnames'; import dayjs from 'dayjs'; -import React, { useMemo, useState } from 'react'; +import React, { useEffect, useMemo, useState, useRef, useCallback } from 'react'; import { useTranslation } from 'react-i18next'; import useSWR from 'swr'; @@ -25,10 +25,11 @@ const Preview = ({ signInExperience, className }: Props) => { const [mode, setMode] = useState(AppearanceMode.LightMode); const [platform, setPlatform] = useState<'web' | 'mobile'>('mobile'); const { data: allConnectors } = useSWR('/api/connectors'); + const previewRef = useRef(null); const config = useMemo(() => { if (!allConnectors) { - return ''; + return; } const socialConnectors = signInExperience.socialSignInConnectorTargets.reduce< @@ -43,19 +44,40 @@ const Preview = ({ signInExperience, className }: Props) => { [] ); - return encodeURIComponent( - JSON.stringify({ - signInExperience: { - ...signInExperience, - socialConnectors, - }, - language, - mode, - platform, - }) - ); + return { + signInExperience: { + ...signInExperience, + socialConnectors, + }, + language, + mode, + platform, + }; }, [allConnectors, language, mode, platform, signInExperience]); + const postPreviewMessage = useCallback(() => { + if (!config) { + return; + } + + previewRef.current?.contentWindow?.postMessage( + { sender: 'ac_preview', config }, + window.location.origin + ); + }, [config]); + + useEffect(() => { + postPreviewMessage(); + + const iframe = previewRef.current; + + iframe?.addEventListener('load', postPreviewMessage); + + return () => { + iframe?.removeEventListener('load', postPreviewMessage); + }; + }, [postPreviewMessage]); + return (
@@ -109,7 +131,7 @@ const Preview = ({ signInExperience, className }: Props) => {
)} -