-
Notifications
You must be signed in to change notification settings - Fork 1
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Compile Model button and CompileContextProvider #191
Changes from 3 commits
73cf7b7
675b37f
58f8bea
ca5b613
14e7691
d8c473b
29fa90e
a9cd2d4
5f46f8f
e4726b6
25e4902
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,29 @@ | ||
import { createContext } from "react"; | ||
|
||
export type CompileStatus = | ||
| "preparing" | ||
| "compiling" | ||
| "compiled" | ||
| "failed" | ||
| ""; | ||
|
||
type CompileContextType = { | ||
compileStatus: CompileStatus; | ||
compileMessage: string; | ||
compiledMainJsUrl?: string; | ||
validSyntax: boolean; | ||
compile: () => void; | ||
setValidSyntax: (valid: boolean) => void; | ||
stanWasmServerUrl: string; | ||
setStanWasmServerUrl: (url: string) => void; | ||
}; | ||
|
||
export const CompileContext = createContext<CompileContextType>({ | ||
compileStatus: "", | ||
compileMessage: "", | ||
validSyntax: false, | ||
compile: () => {}, | ||
setValidSyntax: () => {}, | ||
stanWasmServerUrl: "", | ||
setStanWasmServerUrl: () => {}, | ||
}); |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,102 @@ | ||
import { ProjectContext } from "@SpCore/ProjectContextProvider"; | ||
import compileStanProgram from "@SpCompileContext/compileStanProgram"; | ||
import { | ||
FunctionComponent, | ||
PropsWithChildren, | ||
useCallback, | ||
useContext, | ||
useEffect, | ||
useState, | ||
} from "react"; | ||
import { CompileContext, CompileStatus } from "./CompileContext"; | ||
|
||
type CompileContextProviderProps = { | ||
// none | ||
}; | ||
|
||
const initialStanWasmServerUrl = | ||
localStorage.getItem("stanWasmServerUrl") || | ||
"https://trom-stan-wasm-server.magland.org"; | ||
|
||
export const CompileContextProvider: FunctionComponent< | ||
PropsWithChildren<CompileContextProviderProps> | ||
> = ({ children }) => { | ||
const { data } = useContext(ProjectContext); | ||
const [compileStatus, setCompileStatus] = useState<CompileStatus>(""); | ||
const [ | ||
theStanFileContentThasHasBeenCompiled, | ||
setTheStanFileContentThasHasBeenCompiled, | ||
] = useState<string>(""); | ||
const [compileMessage, setCompileMessage] = useState<string>(""); | ||
const [compiledMainJsUrl, setCompiledMainJsUrl] = useState< | ||
string | undefined | ||
>(undefined); | ||
const [validSyntax, setValidSyntax] = useState<boolean>(false); | ||
|
||
useEffect(() => { | ||
// if the compiled content is not the same as the current content, | ||
// then the state should not be compiled or failed | ||
if (data.stanFileContent !== theStanFileContentThasHasBeenCompiled) { | ||
if (compileStatus === "compiled" || compileStatus === "failed") { | ||
setCompileStatus(""); | ||
setCompiledMainJsUrl(""); | ||
} | ||
} | ||
}, [ | ||
data.stanFileContent, | ||
theStanFileContentThasHasBeenCompiled, | ||
compileStatus, | ||
setCompiledMainJsUrl, | ||
]); | ||
|
||
const [stanWasmServerUrl, setStanWasmServerUrl] = useState<string>( | ||
initialStanWasmServerUrl, | ||
); | ||
useEffect(() => { | ||
// persist to local storage | ||
localStorage.setItem("stanWasmServerUrl", stanWasmServerUrl); | ||
}, [stanWasmServerUrl]); | ||
Comment on lines
+55
to
+58
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Not sure I understand why we need to persist this to local storage vs. it being part of the context? There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. When user refreshes the page, or closes the tab and comes back later, we want this to remember the choice. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. (this is also the current behavior, the code just moved in this PR) |
||
|
||
const handleCompile = useCallback(async () => { | ||
setCompileStatus("compiling"); | ||
await new Promise((resolve) => setTimeout(resolve, 500)); // for effect | ||
const onStatus = (msg: string) => { | ||
setCompileMessage(msg); | ||
}; | ||
const { mainJsUrl } = await compileStanProgram( | ||
stanWasmServerUrl, | ||
data.stanFileContent, | ||
onStatus, | ||
); | ||
|
||
if (!mainJsUrl) { | ||
setCompileStatus("failed"); | ||
return; | ||
} | ||
setCompiledMainJsUrl(mainJsUrl); | ||
setCompileStatus("compiled"); | ||
setTheStanFileContentThasHasBeenCompiled(data.stanFileContent); | ||
}, [ | ||
data.stanFileContent, | ||
setCompiledMainJsUrl, | ||
setCompileStatus, | ||
stanWasmServerUrl, | ||
]); | ||
|
||
return ( | ||
<CompileContext.Provider | ||
value={{ | ||
compileStatus, | ||
compileMessage, | ||
compiledMainJsUrl, | ||
validSyntax, | ||
compile: handleCompile, | ||
setValidSyntax, | ||
stanWasmServerUrl, | ||
setStanWasmServerUrl, | ||
}} | ||
> | ||
{children} | ||
</CompileContext.Provider> | ||
); | ||
}; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Is it worthwhile to do the flip side of this--such that if the
stanFileContent
is flipped back to equal the content that has been compiled, we revert to the "compiled" state?I'm imagining deleting and re-adding a semicolon for instance.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I'd vote against that because (a) it would be challenging to manage that -- you see in this code the compiledMainJsUrl gets cleared (b) it's easy enough to click the compile button again, and it will be a cache hit.