diff --git a/src/components/App.tsx b/src/components/App.tsx index f88d069a5..b02f47875 100644 --- a/src/components/App.tsx +++ b/src/components/App.tsx @@ -474,12 +474,8 @@ class App extends React.Component { this.scene.getNonDeletedElements(), this.state, ); - const { - onCollabButtonClick, - renderTopRightUI, - renderFooter, - renderCustomStats, - } = this.props; + const { onCollabButtonClick, renderTopRightUI, renderCustomStats } = + this.props; return (
{ langCode={getLanguage().code} isCollaborating={this.props.isCollaborating} renderTopRightUI={renderTopRightUI} - renderCustomFooter={renderFooter} renderCustomStats={renderCustomStats} viewModeEnabled={viewModeEnabled} showExitZenModeBtn={ @@ -537,7 +532,9 @@ class App extends React.Component { library={this.library} id={this.id} onImageAction={this.onImageAction} - /> + > + {this.props.children} +
{selectedElement.length === 1 && this.state.showHyperlinkPopup && ( diff --git a/src/components/LayerUI.tsx b/src/components/LayerUI.tsx index 72a6b0e13..b7fb596c0 100644 --- a/src/components/LayerUI.tsx +++ b/src/components/LayerUI.tsx @@ -58,7 +58,6 @@ interface LayerUIProps { langCode: Language["code"]; isCollaborating: boolean; renderTopRightUI?: ExcalidrawProps["renderTopRightUI"]; - renderCustomFooter?: ExcalidrawProps["renderFooter"]; renderCustomStats?: ExcalidrawProps["renderCustomStats"]; viewModeEnabled: boolean; libraryReturnUrl: ExcalidrawProps["libraryReturnUrl"]; @@ -67,6 +66,7 @@ interface LayerUIProps { library: Library; id: string; onImageAction: (data: { insertOnCanvasDirectly: boolean }) => void; + children?: React.ReactNode; } const LayerUI = ({ actionManager, @@ -85,7 +85,6 @@ const LayerUI = ({ toggleZenMode, isCollaborating, renderTopRightUI, - renderCustomFooter, renderCustomStats, viewModeEnabled, libraryReturnUrl, @@ -94,6 +93,7 @@ const LayerUI = ({ library, id, onImageAction, + children, }: LayerUIProps) => { const device = useDevice(); @@ -454,7 +454,7 @@ const LayerUI = ({ }, )} > - {renderCustomFooter?.(false, appState)} + {children}
{ const keys = Object.keys(prevAppState) as (keyof Partial)[]; return ( - prev.renderCustomFooter === next.renderCustomFooter && prev.langCode === next.langCode && prev.elements === next.elements && prev.files === next.files && diff --git a/src/excalidraw-app/components/Footer.tsx b/src/excalidraw-app/components/Footer.tsx new file mode 100644 index 000000000..d25242a70 --- /dev/null +++ b/src/excalidraw-app/components/Footer.tsx @@ -0,0 +1,79 @@ +import { isExcalidrawPlusSignedUser, PlusAppLinkJSX, PlusLPLinkJSX } from ".."; +import { shield } from "../../components/icons"; +import { Tooltip } from "../../components/Tooltip"; +import { t } from "../../i18n"; +import { languages } from "../../packages/excalidraw/index"; +import { LanguageList } from "./LanguageList"; + +const EncryptedIcon = () => ( + + + {shield} + + +); + +const Footer = ({ + isMobile, + langCode, + onLangChange, +}: { + isMobile: boolean; + langCode: string; + onLangChange: (langCode: string) => void; +}) => { + if (isMobile) { + const isTinyDevice = window.innerWidth < 362; + return ( +
+
+ {t("labels.language")} + +
+ {/* FIXME remove after 2021-05-20 */} +
+ {isExcalidrawPlusSignedUser ? PlusAppLinkJSX : PlusLPLinkJSX} +
+
+ ); + } + return ( + <> + + + + ); +}; + +export default Footer; diff --git a/src/excalidraw-app/index.tsx b/src/excalidraw-app/index.tsx index 8f35772e3..a64dd410e 100644 --- a/src/excalidraw-app/index.tsx +++ b/src/excalidraw-app/index.tsx @@ -19,11 +19,7 @@ import { } from "../element/types"; import { useCallbackRefState } from "../hooks/useCallbackRefState"; import { t } from "../i18n"; -import { - Excalidraw, - defaultLang, - languages, -} from "../packages/excalidraw/index"; +import { Excalidraw, defaultLang } from "../packages/excalidraw/index"; import { AppState, LibraryItems, @@ -51,7 +47,6 @@ import Collab, { collabDialogShownAtom, isCollaboratingAtom, } from "./collab/Collab"; -import { LanguageList } from "./components/LanguageList"; import { exportToBackend, getCollaborationLinkData, @@ -65,8 +60,6 @@ import { } from "./data/localStorage"; import CustomStats from "./CustomStats"; import { restore, restoreAppState, RestoredDataState } from "../data/restore"; -import { Tooltip } from "../components/Tooltip"; -import { shield } from "../components/icons"; import "./index.scss"; import { ExportToExcalidrawPlus } from "./components/ExportToExcalidrawPlus"; @@ -82,8 +75,9 @@ import { Provider, useAtom } from "jotai"; import { jotaiStore, useAtomWithInitialValue } from "../jotai"; import { reconcileElements } from "./collab/reconciliation"; import { parseLibraryTokensFromUrl, useHandleLibrary } from "../data/library"; +import Footer from "./components/Footer"; -const isExcalidrawPlusSignedUser = document.cookie.includes( +export const isExcalidrawPlusSignedUser = document.cookie.includes( COOKIES.AUTH_STATE_COOKIE, ); @@ -197,7 +191,7 @@ const initializeScene = async (opts: { return { scene: null, isExternalScene: false }; }; -const PlusLPLinkJSX = ( +export const PlusLPLinkJSX = (

Introducing Excalidraw+
@@ -211,7 +205,7 @@ const PlusLPLinkJSX = (

); -const PlusAppLinkJSX = ( +export const PlusAppLinkJSX = ( { [], ); - const renderFooter = useCallback( - (isMobile: boolean) => { - const renderEncryptedIcon = () => ( - - - {shield} - - - ); - - const renderLanguageList = () => ( - setLangCode(langCode)} - languages={languages} - currentLangCode={langCode} - /> - ); - if (isMobile) { - const isTinyDevice = window.innerWidth < 362; - return ( -
-
- {t("labels.language")} - {renderLanguageList()} -
- {/* FIXME remove after 2021-05-20 */} -
- {isExcalidrawPlusSignedUser ? PlusAppLinkJSX : PlusLPLinkJSX} -
-
- ); - } - return ( - <> - {renderEncryptedIcon()} - {renderLanguageList()} - - ); - }, - [langCode], - ); - const renderCustomStats = () => { return ( { }, }} renderTopRightUI={renderTopRightUI} - renderFooter={renderFooter} langCode={langCode} renderCustomStats={renderCustomStats} detectScroll={false} handleKeyboardGlobally={true} onLibraryChange={onLibraryChange} autoFocus={true} - /> + > +
diff --git a/src/packages/excalidraw/index.tsx b/src/packages/excalidraw/index.tsx index fc567a5cb..d92ee232a 100644 --- a/src/packages/excalidraw/index.tsx +++ b/src/packages/excalidraw/index.tsx @@ -21,7 +21,6 @@ const ExcalidrawBase = (props: ExcalidrawProps) => { isCollaborating = false, onPointerUpdate, renderTopRightUI, - renderFooter, langCode = defaultLang.code, viewModeEnabled, zenModeEnabled, @@ -39,6 +38,7 @@ const ExcalidrawBase = (props: ExcalidrawProps) => { onLinkOpen, onPointerDown, onScrollChange, + children, } = props; const canvasActions = props.UIOptions?.canvasActions; @@ -86,7 +86,6 @@ const ExcalidrawBase = (props: ExcalidrawProps) => { isCollaborating={isCollaborating} onPointerUpdate={onPointerUpdate} renderTopRightUI={renderTopRightUI} - renderFooter={renderFooter} langCode={langCode} viewModeEnabled={viewModeEnabled} zenModeEnabled={zenModeEnabled} @@ -105,7 +104,9 @@ const ExcalidrawBase = (props: ExcalidrawProps) => { onLinkOpen={onLinkOpen} onPointerDown={onPointerDown} onScrollChange={onScrollChange} - /> + > + {children} + ); diff --git a/src/types.ts b/src/types.ts index 1539d533c..e63e538aa 100644 --- a/src/types.ts +++ b/src/types.ts @@ -280,7 +280,6 @@ export interface ExcalidrawProps { isMobile: boolean, appState: AppState, ) => JSX.Element | null; - renderFooter?: (isMobile: boolean, appState: AppState) => JSX.Element | null; langCode?: Language["code"]; viewModeEnabled?: boolean; zenModeEnabled?: boolean; @@ -312,6 +311,7 @@ export interface ExcalidrawProps { pointerDownState: PointerDownState, ) => void; onScrollChange?: (scrollX: number, scrollY: number) => void; + children?: React.ReactNode; } export type SceneData = {