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)
+}