Merge pull request #328 from Irev-Dev/kurt/327
Add the ability to link to text resource for IDE
This commit was merged in pull request #328.
This commit is contained in:
@@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
# [C a d H u b](https://cadhub.xyz)
|
# [C a d H u b](https://cadhub.xyz)
|
||||||
|
|
||||||
[](https://app.netlify.com/sites/cadhubxyz/deploys)
|
<!-- [](https://app.netlify.com/sites/cadhubxyz/deploys) -->
|
||||||
|
|
||||||
Let's help Code-CAD reach its [full potential!](https://cadhub.xyz) We're making a ~~cad~~hub for the Code-CAD community, think of it as model-repository crossed with a live editor. We have an integration with the excellent [cascadeStudio](https://zalo.github.io/CascadeStudio/) with [more coming soon](https://github.com/Irev-Dev/curated-code-cad).
|
Let's help Code-CAD reach its [full potential!](https://cadhub.xyz) We're making a ~~cad~~hub for the Code-CAD community, think of it as model-repository crossed with a live editor. We have an integration with the excellent [cascadeStudio](https://zalo.github.io/CascadeStudio/) with [more coming soon](https://github.com/Irev-Dev/curated-code-cad).
|
||||||
|
|
||||||
|
|||||||
@@ -26,6 +26,7 @@
|
|||||||
"golden-layout": "^1.5.9",
|
"golden-layout": "^1.5.9",
|
||||||
"gotrue-js": "^0.9.27",
|
"gotrue-js": "^0.9.27",
|
||||||
"jquery": "^3.5.1",
|
"jquery": "^3.5.1",
|
||||||
|
"lodash": "^4.17.21",
|
||||||
"monaco-editor": "^0.20.0",
|
"monaco-editor": "^0.20.0",
|
||||||
"monaco-editor-webpack-plugin": "^1.9.1",
|
"monaco-editor-webpack-plugin": "^1.9.1",
|
||||||
"netlify-identity-widget": "^1.9.1",
|
"netlify-identity-widget": "^1.9.1",
|
||||||
@@ -45,6 +46,7 @@
|
|||||||
"three": "^0.118.3"
|
"three": "^0.118.3"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
|
"@types/lodash": "^4.14.170",
|
||||||
"autoprefixer": "^10.2.5",
|
"autoprefixer": "^10.2.5",
|
||||||
"html-webpack-plugin": "^4.5.0",
|
"html-webpack-plugin": "^4.5.0",
|
||||||
"opentype.js": "^1.3.3",
|
"opentype.js": "^1.3.3",
|
||||||
|
|||||||
@@ -5,18 +5,34 @@ import { useIdeState, codeStorageKey } from 'src/helpers/hooks/useIdeState'
|
|||||||
import { copyTextToClipboard } from 'src/helpers/clipboard'
|
import { copyTextToClipboard } from 'src/helpers/clipboard'
|
||||||
import { requestRender } from 'src/helpers/hooks/useIdeState'
|
import { requestRender } from 'src/helpers/hooks/useIdeState'
|
||||||
import { encode, decode } from 'src/helpers/compress'
|
import { encode, decode } from 'src/helpers/compress'
|
||||||
|
import { flow } from 'lodash/fp'
|
||||||
|
|
||||||
|
export const githubSafe = (url) =>
|
||||||
|
url.includes('github.com')
|
||||||
|
? url
|
||||||
|
.replace('github.com', 'raw.githubusercontent.com')
|
||||||
|
.replace('/blob/', '/')
|
||||||
|
: url
|
||||||
|
|
||||||
|
const prepareEncodedUrl = flow(decodeURIComponent, githubSafe)
|
||||||
|
|
||||||
export const IdeContext = createContext()
|
export const IdeContext = createContext()
|
||||||
const IdeToolbarNew = ({ cadPackage }) => {
|
const IdeToolbarNew = ({ cadPackage }) => {
|
||||||
const [state, thunkDispatch] = useIdeState()
|
const [state, thunkDispatch] = useIdeState()
|
||||||
const scriptKey = 'encoded_script'
|
const scriptKey = 'encoded_script'
|
||||||
const scriptKeyV2 = 'encoded_script_v2'
|
const scriptKeyV2 = 'encoded_script_v2'
|
||||||
|
const fetchText = 'fetch_text_v1'
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
thunkDispatch({
|
thunkDispatch({
|
||||||
type: 'initIde',
|
type: 'initIde',
|
||||||
payload: { cadPackage },
|
payload: { cadPackage },
|
||||||
})
|
})
|
||||||
// load code from hash if it's there
|
// 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
|
let hash
|
||||||
if (isBrowser) {
|
if (isBrowser) {
|
||||||
hash = window.location.hash
|
hash = window.location.hash
|
||||||
@@ -25,12 +41,23 @@ const IdeToolbarNew = ({ cadPackage }) => {
|
|||||||
if (key === scriptKey) {
|
if (key === scriptKey) {
|
||||||
const script = atob(encodedScript)
|
const script = atob(encodedScript)
|
||||||
thunkDispatch({ type: 'updateCode', payload: script })
|
thunkDispatch({ type: 'updateCode', payload: script })
|
||||||
|
triggerRender()
|
||||||
} else if (key === scriptKeyV2) {
|
} else if (key === scriptKeyV2) {
|
||||||
const script = decode(encodedScript)
|
const script = decode(encodedScript)
|
||||||
thunkDispatch({ type: 'updateCode', payload: script })
|
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 = ''
|
window.location.hash = ''
|
||||||
setTimeout(() => handleRender()) // definitely a little hacky, timeout with no delay is just to push it into the next event loop.
|
|
||||||
}, [cadPackage])
|
}, [cadPackage])
|
||||||
function handleRender() {
|
function handleRender() {
|
||||||
thunkDispatch((dispatch, getState) => {
|
thunkDispatch((dispatch, getState) => {
|
||||||
|
|||||||
21
app/web/src/components/IdeToolbarNew/IdeToolbarNew.test.js
Normal file
21
app/web/src/components/IdeToolbarNew/IdeToolbarNew.test.js
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
// import { githubSafe } from './IdeToolbarNew.js'
|
||||||
|
// TODO jest doesn't like ECMAScript modules and is failing further down in the tree because three ES modules
|
||||||
|
// Need to update config
|
||||||
|
|
||||||
|
describe('githubSafe', () => {
|
||||||
|
const rawUrl =
|
||||||
|
'https://raw.githubusercontent.com/aaevan/openscad_objects/main/fire_tablet_bottom_corner.scad'
|
||||||
|
it('It transforms non-raw url to raw urls', () => {
|
||||||
|
expect(1).toBe(1)
|
||||||
|
})
|
||||||
|
// it('It transforms non-raw url to raw urls', () => {
|
||||||
|
// expect(
|
||||||
|
// githubSafe(
|
||||||
|
// 'https://github.com/aaevan/openscad_objects/blob/main/fire_tablet_bottom_corner.scad'
|
||||||
|
// )
|
||||||
|
// ).toBe(rawUrl)
|
||||||
|
// })
|
||||||
|
// it('It leaves raw urls untouched', () => {
|
||||||
|
// expect(githubSafe(rawUrl)).toBe(rawUrl)
|
||||||
|
// })
|
||||||
|
})
|
||||||
Reference in New Issue
Block a user