253 | {error && (
254 |
255 | Error detected! Do you have the latest MacOS? If it still doesn't
256 | work, you can email me the logs choltz@hey.com.
257 |
258 | )}
259 | {/* // PROMPT */}
260 |
326 |
327 | );
328 | }
329 |
330 | function Image() {
331 | const [image, setImage] = useState(
332 | 'media-loader:///Users/charlieholtz/workspace/dev/electron-react/outputs/txt2img-samples/iguana.png'
333 | );
334 | const [confetti, setConfetti] = useState(false);
335 | const [progress, setProgress] = useState(0);
336 | const [showProgressBar, setShowProgressBar] = useState(false);
337 | const [loadingStatus, setLoadingStatus] = useState('');
338 | const [background, setBackground] = useState(' from-gray-300 gray-500');
339 |
340 | const viewImage = (file: string) => {
341 | window.electron.ipcRenderer.sendMessage('open-file', file);
342 | };
343 |
344 | window.electron.ipcRenderer.on('image-load', (file) => {
345 | setImage(`media-loader://${file}`);
346 | setConfetti(true);
347 | setTimeout(() => setConfetti(false), 5000);
348 | setLoadingStatus('Done');
349 | setShowProgressBar(false);
350 | });
351 |
352 | window.electron.ipcRenderer.on('initializing', () => {
353 | setLoadingStatus('Initializing...');
354 | });
355 |
356 | window.electron.ipcRenderer.on('killed', () => {
357 | setProgress(0);
358 | setLoadingStatus('');
359 | });
360 |
361 | window.electron.ipcRenderer.on('loading-update', (pct) => {
362 | setShowProgressBar(true);
363 | setProgress(pct);
364 | setLoadingStatus('Sampling...');
365 |
366 | if (pct === '100') {
367 | setLoadingStatus('Finalizing...');
368 | }
369 | });
370 |
371 | return (
372 |
373 | {confetti &&
}
374 |
375 | {/* Loading Bar */}
376 | {showProgressBar && (
377 | <>
378 |
379 |
383 | {progress}
384 |
385 |
386 | >
387 | )}
388 |
389 | {loadingStatus !== '' && loadingStatus !== 'Done' && (
390 |
393 |
394 |
395 | {loadingStatus}
396 | {progress}%
397 |
398 |
399 |
400 | )}
401 |
402 | {loadingStatus === 'Framing' && (
403 |
{loadingStatus}
404 | )}
405 |
406 | {loadingStatus === 'Done' && (
407 | <>
408 |
viewImage(image)}>
409 |

414 |
415 |
416 |
417 |
418 | {image.replace('media-loader://', '').split('/').at(-1)}
419 |
420 |
421 | >
422 | )}
423 |
424 | );
425 | }
426 |
427 | const Main = () => {
428 | const [showLogs, setShowLogs] = useState(false);
429 | const [showOptions, setShowOptions] = useState(false);
430 | const [history, setHistory] = useState([]);
431 | const [logs, setLogs] = useState([]);
432 | const [showGallery, setShowGallery] = useState(false);
433 | const [weightsExist, setWeightsExist] = useState(true);
434 | const [weightProgress, setWeightProgess] = useState('0');
435 | const [downloadProgress, setDownloadProgress] = useState('');
436 | const [options, setOptions] = useState({});
437 |
438 | window.electron.ipcRenderer.on('stdout-message', (message) => {
439 | setLogs([message, ...logs]);
440 | });
441 |
442 | window.electron.ipcRenderer.on('no-weights', (message) => {
443 | setWeightsExist(false);
444 | });
445 |
446 | window.electron.ipcRenderer.on('download-progress', (progress) => {
447 | setWeightProgess(`${Math.round(progress.percent * 100).toString()}`);
448 | setDownloadProgress(
449 | `${(progress.transferredBytes / 1000000).toFixed(2)} MB / ${(
450 | progress.totalBytes / 1000000
451 | ).toFixed(2)} MB`
452 | );
453 | setWeightsExist(false);
454 | });
455 |
456 | window.electron.ipcRenderer.on('image-dir', (paths) => {
457 | setHistory(paths.history);
458 | });
459 |
460 | window.electron.ipcRenderer.on('partial-weights', () => {
461 | setWeightsExist(false);
462 | });
463 |
464 | window.electron.ipcRenderer.on('download-complete', (progress) => {
465 | setWeightProgess(100);
466 | setWeightsExist(true);
467 | });
468 |
469 | const redownload = () => {
470 | window.electron.ipcRenderer.sendMessage('redownload-weights');
471 | setWeightsExist(false);
472 | };
473 |
474 | const handleKeyPress = (e: any) => {
475 | if (e.key === '\\') {
476 | setShowLogs(!showLogs);
477 | setShowOptions(false);
478 | }
479 |
480 | if (e.key === '?') {
481 | setShowOptions(!showOptions);
482 | setShowLogs(false);
483 | }
484 |
485 | if (e.key === 'Escape') {
486 | setShowOptions(false);
487 | setShowLogs(false);
488 | }
489 |
490 | if (e.key === 'g' && e.metaKey) {
491 | setShowGallery(!showGallery);
492 | setShowLogs(false);
493 | }
494 | };
495 |
496 | window.electron.ipcRenderer.on('loaded-options', (options) => {
497 | setOptions(options);
498 | console.log(`front end loaded options ${JSON.stringify(options)}`);
499 | });
500 |
501 | useEffect(() => {}, [history, options, showOptions]); // 👈️ add state variables you want to track
502 |
503 | const viewImage = (file: string) => {
504 | window.electron.ipcRenderer.sendMessage('open-file', file);
505 | };
506 |
507 | document.addEventListener('keydown', handleKeyPress);
508 | return (
509 |