Compare commits

...

2 Commits

Author SHA1 Message Date
muzam1l
1f5a9731bb Readonly files are not renamable now! 2022-08-04 18:54:20 +05:30
muzam1l
ef4f95ca3e Switch to correct tab after renaming/closing. 2022-08-03 16:02:17 +05:30
2 changed files with 53 additions and 32 deletions

View File

@@ -24,13 +24,19 @@ import { saveAllFiles } from "../state/actions/saveFile";
import { Tab, Tabs } from "./Tabs"; import { Tab, Tabs } from "./Tabs";
import { renameFile } from "../state/actions/createNewFile"; import { renameFile } from "../state/actions/createNewFile";
const validateWritability = (editor: monaco.editor.IStandaloneCodeEditor) => { const checkWritable = (filename?: string): boolean => {
const currPath = editor.getModel()?.uri.path; if (apiHeaderFiles.find(file => file === filename)) {
if (apiHeaderFiles.find(h => currPath?.endsWith(h))) { return false;
editor.updateOptions({ readOnly: true });
} else {
editor.updateOptions({ readOnly: false });
} }
return true;
};
const validateWritability = (
editor: monaco.editor.IStandaloneCodeEditor
) => {
const filename = editor.getModel()?.uri.path.split("/").pop();
const isWritable = checkWritable(filename);
editor.updateOptions({ readOnly: !isWritable });
}; };
let decorations: { [key: string]: string[] } = {}; let decorations: { [key: string]: string[] } = {};
@@ -138,7 +144,7 @@ const HooksEditor = () => {
}} }}
> >
{snap.files.map((file, index) => { {snap.files.map((file, index) => {
return <Tab key={file.name} header={file.name} />; return <Tab key={file.name} header={file.name} renameDisabled={!checkWritable(file.name)} />;
})} })}
</Tabs> </Tabs>
); );

View File

@@ -31,6 +31,7 @@ type Nullable<T> = T | null | undefined | false;
interface TabProps { interface TabProps {
header: string; header: string;
children?: ReactNode; children?: ReactNode;
renameDisabled?: boolean
} }
// TODO customize messages shown // TODO customize messages shown
@@ -98,16 +99,15 @@ export const Tabs = ({
}, [tabname, setTabnameError]); }, [tabname, setTabnameError]);
const validateTabname = useCallback( const validateTabname = useCallback(
(tabname: string): { error?: string, result?: string } => { (tabname: string): { error?: string; result?: string } => {
if (!tabname) { if (!tabname) {
return { error: `Please enter ${label.toLocaleLowerCase()} name.` }; return { error: `Please enter ${label.toLocaleLowerCase()} name.` };
} }
let ext = let ext = (tabname.includes(".") && tabname.split(".").pop()) || "";
(tabname.includes(".") && tabname.split(".").pop()) || "";
if (!ext && defaultExtension) { if (!ext && defaultExtension) {
ext = defaultExtension ext = defaultExtension;
tabname = `${tabname}.${defaultExtension}` tabname = `${tabname}.${defaultExtension}`;
} }
if (tabs.find(tab => tab.header === tabname)) { if (tabs.find(tab => tab.header === tabname)) {
return { error: `${capitalize(label)} name already exists.` }; return { error: `${capitalize(label)} name already exists.` };
@@ -153,16 +153,23 @@ export const Tabs = ({
return; return;
} }
const { result: _tabname = tabname } = res const { result: nwName = tabname } = res;
setRenamingTab(null); setRenamingTab(null);
setTabname(""); setTabname("");
const oldName = tabs[renamingTab]?.header; const oldName = tabs[renamingTab]?.header;
onRenameTab?.(renamingTab, _tabname, oldName); onRenameTab?.(renamingTab, nwName, oldName);
handleActiveChange(renamingTab); handleActiveChange(renamingTab, nwName);
}, [handleActiveChange, onRenameTab, renamingTab, tabname, tabs, validateTabname]); }, [
handleActiveChange,
onRenameTab,
renamingTab,
tabname,
tabs,
validateTabname,
]);
const handleCreateTab = useCallback(() => { const handleCreateTab = useCallback(() => {
const res = validateTabname(tabname); const res = validateTabname(tabname);
@@ -170,7 +177,7 @@ export const Tabs = ({
setTabnameError(`Error: ${res.error}`); setTabnameError(`Error: ${res.error}`);
return; return;
} }
const { result: _tabname = tabname } = res const { result: _tabname = tabname } = res;
setIsNewtabDialogOpen(false); setIsNewtabDialogOpen(false);
setTabname(""); setTabname("");
@@ -178,17 +185,22 @@ export const Tabs = ({
onCreateNewTab?.(_tabname); onCreateNewTab?.(_tabname);
handleActiveChange(tabs.length, _tabname); handleActiveChange(tabs.length, _tabname);
}, [validateTabname, tabname, onCreateNewTab, handleActiveChange, tabs.length]); }, [
validateTabname,
tabname,
onCreateNewTab,
handleActiveChange,
tabs.length,
]);
const handleCloseTab = useCallback( const handleCloseTab = useCallback(
(idx: number) => { (idx: number) => {
if (idx <= active && active !== 0) {
setActive(active - 1);
}
onCloseTab?.(idx, tabs[idx].header); onCloseTab?.(idx, tabs[idx].header);
handleActiveChange(idx, tabs[idx].header); if (idx <= active && active !== 0) {
const nwActive = active - 1
handleActiveChange(nwActive, tabs[nwActive].header);
}
}, },
[active, handleActiveChange, onCloseTab, tabs] [active, handleActiveChange, onCloseTab, tabs]
); );
@@ -200,13 +212,16 @@ export const Tabs = ({
key: "close", key: "close",
onSelect: () => handleCloseTab(idx), onSelect: () => handleCloseTab(idx),
}; };
const renameOption = (idx: number): Nullable<ContentMenuOption> => const renameOption = (idx: number, tab: TabProps): Nullable<ContentMenuOption> => {
onRenameTab && { return (
onRenameTab && !tab.renameDisabled && {
type: "text", type: "text",
label: "Rename", label: "Rename",
key: "rename", key: "rename",
onSelect: () => setRenamingTab(idx), onSelect: () => setRenamingTab(idx),
}; }
);
}
return ( return (
<> <>
@@ -225,7 +240,7 @@ export const Tabs = ({
<ContextMenu <ContextMenu
key={tab.header} key={tab.header}
options={ options={
[closeOption(idx), renameOption(idx)].filter( [closeOption(idx), renameOption(idx, tab)].filter(
Boolean Boolean
) as ContentMenuOption[] ) as ContentMenuOption[]
} }