feat: add ability to change preview URL (#26)

This commit is contained in:
Connor Fogarty 2024-08-05 09:49:02 -05:00 committed by GitHub
parent 9aca2925e7
commit 38e6a79b38
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

View File

@ -1,10 +1,11 @@
import { useStore } from '@nanostores/react'; import { useStore } from '@nanostores/react';
import { memo, useEffect, useRef, useState } from 'react'; import { memo, useCallback, useEffect, useRef, useState } from 'react';
import { IconButton } from '~/components/ui/IconButton'; import { IconButton } from '~/components/ui/IconButton';
import { workbenchStore } from '~/lib/stores/workbench'; import { workbenchStore } from '~/lib/stores/workbench';
export const Preview = memo(() => { export const Preview = memo(() => {
const iframeRef = useRef<HTMLIFrameElement>(null); const iframeRef = useRef<HTMLIFrameElement>(null);
const inputRef = useRef<HTMLInputElement>(null);
const [activePreviewIndex] = useState(0); const [activePreviewIndex] = useState(0);
const previews = useStore(workbenchStore.previews); const previews = useStore(workbenchStore.previews);
const activePreview = previews[activePreviewIndex]; const activePreview = previews[activePreviewIndex];
@ -28,6 +29,25 @@ export const Preview = memo(() => {
} }
}, [activePreview, iframeUrl]); }, [activePreview, iframeUrl]);
const validateUrl = useCallback(
(value: string) => {
if (!activePreview) {
return false;
}
const { baseUrl } = activePreview;
if (value === baseUrl) {
return true;
} else if (value.startsWith(baseUrl)) {
return ['/', '?', '#'].includes(value.charAt(baseUrl.length));
}
return false;
},
[activePreview],
);
const reloadPreview = () => { const reloadPreview = () => {
if (iframeRef.current) { if (iframeRef.current) {
iframeRef.current.src = iframeRef.current.src; iframeRef.current.src = iframeRef.current.src;
@ -43,12 +63,22 @@ export const Preview = memo(() => {
<div className="i-ph:info-bold text-lg" /> <div className="i-ph:info-bold text-lg" />
</div> </div>
<input <input
ref={inputRef}
className="w-full bg-transparent outline-none" className="w-full bg-transparent outline-none"
type="text" type="text"
value={url} value={url}
onChange={(event) => { onChange={(event) => {
setUrl(event.target.value); setUrl(event.target.value);
}} }}
onKeyDown={(event) => {
if (event.key === 'Enter' && validateUrl(url)) {
setIframeUrl(url);
if (inputRef.current) {
inputRef.current.blur();
}
}
}}
/> />
</div> </div>
</div> </div>