diff --git a/app/web/src/components/EncodedUrl/FullScriptEncoding.tsx b/app/web/src/components/EncodedUrl/FullScriptEncoding.tsx new file mode 100644 index 0000000..328471a --- /dev/null +++ b/app/web/src/components/EncodedUrl/FullScriptEncoding.tsx @@ -0,0 +1,17 @@ +import { makeEncodedLink } from './helpers' +import { copyTextToClipboard } from 'src/helpers/clipboard' +import {useIdeContext} from 'src/helpers/hooks/useIdeContext' + +const FullScriptEncoding = () => { + const {state} = useIdeContext() + const encodedLink = makeEncodedLink(state.code) + return ( + <> +

Encodes your CodeCad script into a URL so that you can share your work

+ + + + ) +} + +export default FullScriptEncoding diff --git a/app/web/src/components/EncodedUrl/helpers.ts b/app/web/src/components/EncodedUrl/helpers.ts new file mode 100644 index 0000000..4bdbb7e --- /dev/null +++ b/app/web/src/components/EncodedUrl/helpers.ts @@ -0,0 +1,67 @@ +import { useEffect } from 'react' +import { flow } from 'lodash/fp' + +import {useIdeContext} from 'src/helpers/hooks/useIdeContext' +import { useRender } from 'src/components/IdeWrapper/useRender' +import {encode, decode} from 'src/helpers/compress' +import { isBrowser } from '@redwoodjs/prerender/browserUtils' + +const scriptKey = 'encoded_script' +const scriptKeyV2 = 'encoded_script_v2' +const fetchText = 'fetch_text_v1' + +export function makeEncodedLink(code: string): string { + const encodedScript = encode(code) + return `${location.origin}${location.pathname}#${scriptKeyV2}=${encodedScript}` +} + +export const githubSafe = (url: string): string => + url.includes('github.com') + ? url + .replace('github.com', 'raw.githubusercontent.com') + .replace('/blob/', '/') + : url + +const prepareEncodedUrl = flow(decodeURIComponent, githubSafe) + +export function useIdeInit(cadPackage: string) { + const {thunkDispatch} = useIdeContext() + const handleRender = useRender() + useEffect(() => { + thunkDispatch({ + type: 'initIde', + payload: { cadPackage }, + }) + // load code from hash if it's there + const triggerRender = () => + setTimeout(() => { + // definitely a little hacky, timeout with no delay is just to push it into the next event loop. + handleRender() + }) + let hash + if (isBrowser) { + hash = window.location.hash + } + const [key, encodedScript] = hash.slice(1).split('=') + if (key === scriptKey) { + const script = atob(encodedScript) + thunkDispatch({ type: 'updateCode', payload: script }) + triggerRender() + } else if (key === scriptKeyV2) { + const script = decode(encodedScript) + thunkDispatch({ type: 'updateCode', payload: script }) + triggerRender() + } else if (key === fetchText) { + const url = prepareEncodedUrl(encodedScript) + fetch(url).then((response) => + response.text().then((script) => { + thunkDispatch({ type: 'updateCode', payload: script }) + triggerRender() + }) + ) + } else { + triggerRender() + } + window.location.hash = '' + }, [cadPackage]) +} diff --git a/app/web/src/components/IdeHeader/IdeHeader.tsx b/app/web/src/components/IdeHeader/IdeHeader.tsx index 3e7ce78..1f224db 100644 --- a/app/web/src/components/IdeHeader/IdeHeader.tsx +++ b/app/web/src/components/IdeHeader/IdeHeader.tsx @@ -1,7 +1,6 @@ import { Popover } from '@headlessui/react' import { Tab, Tabs, TabList, TabPanel } from 'react-tabs'; -import { copyTextToClipboard } from 'src/helpers/clipboard' -import { encode } from 'src/helpers/compress' +import FullScriptEncoding from 'src/components/EncodedUrl/FullScriptEncoding' const TopButton = ({ onClick, @@ -34,7 +33,6 @@ const IdeHeader = ({handleRender}: {handleRender: () => void}) => { {({open}) => { - const encodedLink = makeEncodedLink('bing bong') return ( <> @@ -46,12 +44,11 @@ const IdeHeader = ({handleRender}: {handleRender: () => void}) => { selectedTabClassName="bg-gray-200" > -

Encodes your CodeCad script into a URL so that you can share your work

- - +
-

Any content 2

+

blah

+ console.log(e)} />
@@ -71,10 +68,3 @@ const IdeHeader = ({handleRender}: {handleRender: () => void}) => { } export default IdeHeader - -const scriptKeyV2 = 'encoded_script_v2' // todo don't leave here - -function makeEncodedLink(code: string): string { - const encodedScript = encode(code) - return `${location.href}#${scriptKeyV2}=${encodedScript}` -} diff --git a/app/web/src/components/IdeWrapper/IdeWrapper.tsx b/app/web/src/components/IdeWrapper/IdeWrapper.tsx index 452d33c..33d0d97 100644 --- a/app/web/src/components/IdeWrapper/IdeWrapper.tsx +++ b/app/web/src/components/IdeWrapper/IdeWrapper.tsx @@ -1,68 +1,16 @@ -import { useContext, useEffect, useState } from 'react' -import IdeContainer from 'src/components/IdeContainer' -import { IdeContext } from 'src/pages/DevIdePage/DevIdePage' -import { isBrowser } from '@redwoodjs/prerender/browserUtils' +import { useState } from 'react' +import IdeContainer from 'src/components/IdeContainer/IdeContainer' import { useRender } from './useRender' -import { decode } from 'src/helpers/compress' -import { flow } from 'lodash/fp' -import OutBound from 'src/components/OutBound' -import IdeSideBar from 'src/components/IdeSideBar' -import IdeHeader from 'src/components/IdeHeader' -import Svg from 'src/components/Svg' - -export const githubSafe = (url) => - url.includes('github.com') - ? url - .replace('github.com', 'raw.githubusercontent.com') - .replace('/blob/', '/') - : url - -const prepareEncodedUrl = flow(decodeURIComponent, githubSafe) +import OutBound from 'src/components/OutBound/OutBound' +import IdeSideBar from 'src/components/IdeSideBar/IdeSideBar' +import IdeHeader from 'src/components/IdeHeader/IdeHeader' +import Svg from 'src/components/Svg/Svg' +import { useIdeInit } from 'src/components/EncodedUrl/helpers' const IdeToolbarNew = ({ cadPackage }) => { - const { state, thunkDispatch } = useContext(IdeContext) const [shouldShowConstructionMessage, setShouldShowConstructionMessage] = useState(true) const handleRender = useRender() - const scriptKey = 'encoded_script' - const scriptKeyV2 = 'encoded_script_v2' - const fetchText = 'fetch_text_v1' - useEffect(() => { - thunkDispatch({ - type: 'initIde', - payload: { cadPackage }, - }) - // load code from hash if it's there - const triggerRender = () => - setTimeout(() => { - // definitely a little hacky, timeout with no delay is just to push it into the next event loop. - handleRender() - }) - let hash - if (isBrowser) { - hash = window.location.hash - } - const [key, encodedScript] = hash.slice(1).split('=') - if (key === scriptKey) { - const script = atob(encodedScript) - thunkDispatch({ type: 'updateCode', payload: script }) - triggerRender() - } else if (key === scriptKeyV2) { - const script = decode(encodedScript) - thunkDispatch({ type: 'updateCode', payload: script }) - triggerRender() - } else if (key === fetchText) { - const url = prepareEncodedUrl(encodedScript) - fetch(url).then((response) => - response.text().then((script) => { - thunkDispatch({ type: 'updateCode', payload: script }) - triggerRender() - }) - ) - } else { - triggerRender() - } - window.location.hash = '' - }, [cadPackage]) + useIdeInit(cadPackage) return (
diff --git a/app/web/src/helpers/hooks/useIdeContext.ts b/app/web/src/helpers/hooks/useIdeContext.ts new file mode 100644 index 0000000..279e937 --- /dev/null +++ b/app/web/src/helpers/hooks/useIdeContext.ts @@ -0,0 +1,6 @@ +import { IdeContext } from 'src/pages/DevIdePage/DevIdePage' +import { useContext } from 'react' + +export function useIdeContext() { + return useContext(IdeContext) +}