stable
Valerie 2021-08-23 13:17:32 -04:00
parent a2725fd433
commit 74601f602e
15 changed files with 2441 additions and 29 deletions

1
.gitignore vendored
View File

@ -1,3 +1,4 @@
node_modules node_modules
out out
bin bin
logs

3
.vscode/tasks.json vendored
View File

@ -34,9 +34,6 @@
"script": "dev", "script": "dev",
"isBackground": true, "isBackground": true,
"group": "build", "group": "build",
"runOptions": {
"runOn": "folderOpen"
},
"presentation": { "presentation": {
"reveal": "never", "reveal": "never",
"echo": false, "echo": false,

View File

@ -6,11 +6,18 @@
"license": "MIT", "license": "MIT",
"type": "module", "type": "module",
"dependencies": { "dependencies": {
"@rollup/plugin-alias": "^3.1.5", "@types/react": "^17.0.18",
"chalk": "^4.1.2",
"ink": "^3.0.9",
"ink-big-text": "^1.2.0",
"ink-form": "^1.0.1",
"ink-gradient": "^2.0.0",
"ink-use-stdout-dimensions": "^1.0.5",
"ipc-tower": "^0.0.6", "ipc-tower": "^0.0.6",
"mongoose": "^5.13.7",
"multiview": "^3.0.1", "multiview": "^3.0.1",
"rollup": "^2.56.2", "react": "^17.0.2",
"typescript": "^4.3.5" "sisteransi": "^1.0.5"
}, },
"scripts": { "scripts": {
"start": "yarn x bin/app.bundle.js", "start": "yarn x bin/app.bundle.js",
@ -23,5 +30,11 @@
"rollup:watch": "yarn rollup --watch", "rollup:watch": "yarn rollup --watch",
"compile": "yarn tsc & yarn rollup", "compile": "yarn tsc & yarn rollup",
"compile:watch": "multiview [ yarn tsc:watch ] [ yarn rollup:watch ]" "compile:watch": "multiview [ yarn tsc:watch ] [ yarn rollup:watch ]"
},
"devDependencies": {
"@rollup/plugin-alias": "^3.1.5",
"@types/node": "^16.6.1",
"rollup": "^2.56.2",
"typescript": "^4.3.5"
} }
} }

52
src/Multiview.tsx 100644
View File

@ -0,0 +1,52 @@
import { Box, Spacer, Text, Transform, useInput } from "ink";
import React, { useMemo, useState } from 'react';
import useForceUpdate from "./useForceUpdate";
interface Props {
screens: {
name: string,
component: JSX.Element
}[]
}
export default function Multiview(props: Props) {
const screens = props.screens;
const forceUpdate = useForceUpdate()
const [screenIdx, setScreenIdx] = useState(0);
const screen = useMemo(() => {
return screens.find((_, idx) => idx === screenIdx).component;
}, [screens, screenIdx]);
useInput((key) => {
// F1 === [[A, F2 === [[B ... F5
if(['[[A', '[[B', '[[C', '[[D', '[[E'].includes(key)) {
const newIdx = key.charCodeAt(2) - 65;
if(newIdx < screens.length)
setScreenIdx(newIdx);
}
forceUpdate();
})
return (
<Box flexDirection="column" width="100%">
<Box
paddingX={2}
paddingY={0}
flexGrow={1}
borderStyle="double"
borderColor="cyan"
>
{screen}
</Box>
<Box height={1} paddingLeft={2}>
{screens.map((screen, idx) => <>
<Text
color={idx === screenIdx ? 'cyan' : ''}
>F{idx + 1}: {screen.name} </Text>
</>)}
</Box>
</Box>
)
}

44
src/NewTask.tsx 100644
View File

@ -0,0 +1,44 @@
import { Box, Text } from "ink";
import React, { useCallback, useMemo, useState } from "react";
const Input = ({
}: any) => {
return (
<Text></Text>
)
}
const Form = ({
children
}: any) => {
const [formData, setFormData] = useState({});
const handleData = useCallback((datum) => {
}, []);
const modifiedChildren = useMemo(() => {
return children.map(child => {
return React.cloneElement(
child
)
})
}, [children])
return (
<Box flexDirection="column">
</Box>
);
}
export default function NewTask() {
return (
<Form>
<Input />
</Form>
)
}

18
src/TaskView.tsx 100644
View File

@ -0,0 +1,18 @@
import React from 'react';
import { Text, Box } from 'ink';
import Gradient from 'ink-gradient';
import BigText from 'ink-big-text';
export default function TaskView() {
return (
<Gradient name="pastel">
<BigText
font="tiny"
text="Current Tasks"
/>
</Gradient>
)
}

View File

@ -1,7 +0,0 @@
import { ProcessManager } from 'ipc-tower';
console.log('hello template!');
ProcessManager.on('reload', () => {
ProcessManager.restart();
})

107
src/app.tsx 100644
View File

@ -0,0 +1,107 @@
import { Box, render, Text, useApp, useInput, useStdin } from 'ink';
import { ProcessManager } from 'ipc-tower';
import mongoose from 'mongoose';
import React from 'react';
import { useEffect, useState } from 'react';
import Multiview from './Multiview';
import TaskView from './TaskView';
import NewTask from './NewTask';
import ansi from 'sisteransi';
import useStdoutDimensions from 'ink-use-stdout-dimensions';
import { appendFileSync } from 'fs';
process.stdout.write('\x1b[?1049h');
ProcessManager.on('reload', () => {
console.log('got reload request');
ProcessManager.restart();
});
ProcessManager.on('shutdown', () => {
process.stdout.write('\x1b[?1049l');
});
const useMounted = () => {
const [mounted, setMounted] = useState(false);
useEffect(() => {
setMounted(true)
return () => {
setMounted(false);
}
});
return mounted;
}
const App = () => {
const [connected, setConnected] = useState(false);
const [columns, rows] = useStdoutDimensions();
const { exit } = useApp();
useEffect(() => {
ProcessManager.on('shutdown', () => {
console.log('rcvd shutdown in app element')
exit();
});
}, []);
useEffect(() => {
mongoose.connect('mongodb://localhost', {
useNewUrlParser: true,
useUnifiedTopology: true
}).then(() => new Promise(res => setTimeout(res, 1000))).then(() => {
setConnected(true);
})
}, []);
process.stdout.write(ansi.cursor.to(0, 0));
return (
<Box
height={rows}
width={columns}
>
{!connected &&
<Box
alignItems="center"
justifyContent="center"
width="100%"
>
<Text>Connecting to Task Database...</Text>
</Box>
||
<Multiview
screens={[
{
name: 'Board',
component: <TaskView />
},
{
name: 'Board 2',
component: <NewTask />
}
]}
/>
}
</Box>
);;;
};
// import readline from 'readline';
// const reader = readline.createInterface({
// input: process.stdin,
// output: process.stdout,
// terminal: false
// });
// reader.on('line', function (line) {
// console.log(line);
// });
// const instance =
render(<App />);
// ProcessManager.on('shutdown', () => {
// instance.unmount();
// });

2
src/externals.d.ts vendored 100644
View File

@ -0,0 +1,2 @@
declare module 'ink-big-text';
declare module 'ink-gradient';

11
src/models/task.ts 100644
View File

@ -0,0 +1,11 @@
import { Schema, model } from 'mongoose';
const taskSchema = new Schema({
name: String,
desc: String,
priority: Number
}, {
timestamps: true
});
export const Task = model('task', taskSchema);

View File

@ -0,0 +1,6 @@
import { useState } from "react";
export default function useForceUpdate(){
const [value, setValue] = useState(0);
return () => setValue(value => value + 1);
}

25
test.js 100644
View File

@ -0,0 +1,25 @@
import readline from 'readline';
// var rl = readline.createInterface({
// input: process.stdin,
// output: process.stdout
// });
// rl.stdoutMuted = true;
// rl.query = "Password : ";
// rl.question(rl.query, function(password) {
// console.log('\nPassword is ' + password);
// rl.close();
// });
// rl._writeToOutput = function _writeToOutput(stringToWrite) {
// // if (rl.stdoutMuted)
// // rl.output.write("\x1B[2K\x1B[200D"+rl.query+"["+((rl.line.length%2==1)?"=-":"-=")+"]");
// // else
// // rl.output.write(stringToWrite);
// };
setTimeout(() => {
})

View File

@ -16,5 +16,5 @@
}, },
"include": [ "include": [
"src/**/*.ts" "src/**/*.ts"
] , "src/app.tsx" ]
} }

1405
yarn-error.log 100644

File diff suppressed because it is too large Load Diff

768
yarn.lock

File diff suppressed because it is too large Load Diff