Skip to content

Commit

Permalink
feat: add statemanagement across various code types
Browse files Browse the repository at this point in the history
  • Loading branch information
koladilip committed Jun 19, 2024
1 parent e727a01 commit 3f1f154
Show file tree
Hide file tree
Showing 13 changed files with 206 additions and 123 deletions.
1 change: 1 addition & 0 deletions .husky/pre-commit
Original file line number Diff line number Diff line change
@@ -1 +1,2 @@
npm run format
npm run lint:staged
22 changes: 21 additions & 1 deletion package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

3 changes: 2 additions & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,8 @@
"react": "^18.3.1",
"react-dom": "^18.3.1",
"react-router-dom": "^6.23.1",
"split-pane-react": "^0.1.3"
"split-pane-react": "^0.1.3",
"usehooks-ts": "^3.1.0"
},
"scripts": {
"dev": "vite",
Expand Down
3 changes: 1 addition & 2 deletions src/Header.tsx
Original file line number Diff line number Diff line change
@@ -1,12 +1,11 @@
import React, { useContext } from 'react';
import { NavLink } from 'react-router-dom';
import { NavLink, useLocation } from 'react-router-dom';
import { ActionType, ActionsContext } from './action';
import RudderStackLogo from './assets/images/rudderstack-logo.svg';
import GithubLogo from './assets/images/github-mark.svg';
import DocsIcon from './assets/images/docs.svg';
import SaveIcon from './assets/images/save.svg';
import LoadIcon from './assets/images/load.svg';
import { useLocation } from 'react-router-dom';

import './Header.css';

Expand Down
23 changes: 9 additions & 14 deletions src/JsonTemplate.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -10,9 +10,6 @@ export const JsonTemplate = () => {
document.title = 'Json Templates';
});

const [action, setAction] = useState<ActionType>(ActionType.None);
const [codeName, setCodeName] = useState<string>('');

async function executeJsonTemplate(code: string, data: any, bindings: any) {
return JsonTemplateEngine.create(code).evaluate(data, bindings);
}
Expand All @@ -33,16 +30,14 @@ export const JsonTemplate = () => {
}

return (
<ActionsContext.Provider value={{ action, setAction, codeName, setCodeName }}>
<div className="app">
<Header />
<Playground
execute={executeJsonTemplate}
parse={parseJsonTemplate}
convert={convertMappings}
type={CodeType.JsonTemplate}
/>
</div>
</ActionsContext.Provider>
<div className="app">
<Header />
<Playground
execute={executeJsonTemplate}
parse={parseJsonTemplate}
convert={convertMappings}
type={CodeType.JsonTemplate}
/>
</div>
);
};
34 changes: 20 additions & 14 deletions src/LoadCode.tsx
Original file line number Diff line number Diff line change
@@ -1,15 +1,30 @@
import React, { useContext, useEffect } from 'react';
import { useNavigate } from 'react-router-dom';
import { useLocation, useNavigate } from 'react-router-dom';
import { Code, CodeType } from './types';
import { ActionType, ActionsContext } from './action';
import { ActionType, ActionsContext, savePlaygroundSimple } from './action';
import CloseIcon from './assets/images/close.svg';
import './LoadCode.css';
import { CommonUtils } from './utils';

const LoadCode = () => {
const { setAction } = useContext(ActionsContext);
const navigate = useNavigate();
const location = useLocation();

function navigateToPage(type: CodeType) {
closeModel();
const navPath = CommonUtils.getNavigationPath(type);
if (navPath === location.pathname) {
navigate(0);
} else {
navigate(navPath);
}
}

function closeModel() {
setAction(ActionType.None);
}

useEffect(() => {
const keyDownHandler = (event: KeyboardEvent) => {
if (event.key === 'Escape') {
Expand All @@ -23,17 +38,7 @@ const LoadCode = () => {
document.removeEventListener('keydown', keyDownHandler);
};
}, []);
const navigate = useNavigate();
function navigateWithCode(code: Code) {
if (code.type === CodeType.JsonTemplate) {
navigate('/json-template', { state: { code } });
} else if (code.type === CodeType.Mappings) {
navigate('/mappings', { state: { code } });
} else {
navigate('/workflow-engine', { state: { code } });
}
setAction(ActionType.None);
}

function handleCodeLoad(event: React.ChangeEvent<HTMLInputElement>) {
const file = event.target.files?.[0];
if (!file) {
Expand All @@ -42,7 +47,8 @@ const LoadCode = () => {
const reader = new FileReader();
reader.onload = (e) => {
const code = JSON.parse(e.target?.result as string) as Code;
navigateWithCode(code);
savePlaygroundSimple(code);
navigateToPage(code.type);
};
reader.readAsText(file);
}
Expand Down
26 changes: 10 additions & 16 deletions src/Mappings.tsx
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
import React, { useEffect, useState } from 'react';
import React, { useEffect } from 'react';
import Playground from './Playground';
import Header from './Header';
import { ActionType, ActionsContext } from './action';
import { CodeType } from './types';
import {
Expression,
Expand All @@ -15,9 +14,6 @@ export const Mappings = () => {
document.title = 'Json Template Mappings';
});

const [action, setAction] = useState<ActionType>(ActionType.None);
const [codeName, setCodeName] = useState<string>('');

function parseMappings(code: string): Expression {
const mappings = JSON.parse(code) as FlatMappingPaths[];
return JsonTemplateEngine.parse(mappings, { defaultPathType: PathType.JSON });
Expand All @@ -39,16 +35,14 @@ export const Mappings = () => {
}

return (
<ActionsContext.Provider value={{ action, setAction, codeName, setCodeName }}>
<div className="app">
<Header />
<Playground
execute={executeMappings}
parse={parseMappings}
convert={convertMappings}
type={CodeType.Mappings}
/>
</div>
</ActionsContext.Provider>
<div className="app">
<Header />
<Playground
execute={executeMappings}
parse={parseMappings}
convert={convertMappings}
type={CodeType.Mappings}
/>
</div>
);
};
Loading

0 comments on commit 3f1f154

Please sign in to comment.