chore: add pretty

This commit is contained in:
lencx
2023-01-22 18:18:36 +08:00
parent 1ba356a91f
commit bc39dcdd72
56 changed files with 776 additions and 535 deletions

View File

@@ -1,4 +1,10 @@
import { useEffect, useState, ForwardRefRenderFunction, useImperativeHandle, forwardRef } from 'react';
import {
useEffect,
useState,
ForwardRefRenderFunction,
useImperativeHandle,
forwardRef,
} from 'react';
import { Form, Input, Select, Tooltip } from 'antd';
import { v4 } from 'uuid';
import type { FormProps } from 'antd';
@@ -7,7 +13,7 @@ import { DISABLE_AUTO_COMPLETE, chatRoot } from '@/utils';
import useInit from '@/hooks/useInit';
interface SyncFormProps {
record?: Record<string|symbol, any> | null;
record?: Record<string | symbol, any> | null;
type: string;
}
@@ -54,10 +60,18 @@ const SyncForm: ForwardRefRenderFunction<FormProps, SyncFormProps> = ({ record,
const jsonTip = (
<Tooltip
title={<pre>{JSON.stringify([
{ cmd: '', act: '', prompt: '' },
{ cmd: '', act: '', prompt: '' },
], null, 2)}</pre>}
title={
<pre>
{JSON.stringify(
[
{ cmd: '', act: '', prompt: '' },
{ cmd: '', act: '', prompt: '' },
],
null,
2,
)}
</pre>
}
>
<a>JSON</a>
</Tooltip>
@@ -65,10 +79,12 @@ const SyncForm: ForwardRefRenderFunction<FormProps, SyncFormProps> = ({ record,
const csvTip = (
<Tooltip
title={<pre>{`"cmd","act","prompt"
title={
<pre>{`"cmd","act","prompt"
"cmd","act","prompt"
"cmd","act","prompt"
"cmd","act","prompt"`}</pre>}
"cmd","act","prompt"`}</pre>
}
>
<a>CSV</a>
</Tooltip>
@@ -76,11 +92,7 @@ const SyncForm: ForwardRefRenderFunction<FormProps, SyncFormProps> = ({ record,
return (
<>
<Form
form={form}
labelCol={{ span: 4 }}
initialValues={initFormValue}
>
<Form form={form} labelCol={{ span: 4 }} initialValues={initFormValue}>
<Form.Item
label="Name"
name="name"
@@ -92,7 +104,7 @@ const SyncForm: ForwardRefRenderFunction<FormProps, SyncFormProps> = ({ record,
label="PATH"
name="path"
rules={[{ required: true, message: 'Please enter the path!' }]}
>
>
<Input
placeholder="YOUR_PATH"
addonBefore={pathOptions}
@@ -100,13 +112,17 @@ const SyncForm: ForwardRefRenderFunction<FormProps, SyncFormProps> = ({ record,
{...DISABLE_AUTO_COMPLETE}
/>
</Form.Item>
<Form.Item style={{ display: 'none' }} name="id" initialValue={v4().replace(/-/g, '')}><input /></Form.Item>
<Form.Item style={{ display: 'none' }} name="id" initialValue={v4().replace(/-/g, '')}>
<input />
</Form.Item>
</Form>
<div className="tip">
<p>The file supports only {csvTip} and {jsonTip} formats.</p>
<p>
The file supports only {csvTip} and {jsonTip} formats.
</p>
</div>
</>
)
}
);
};
export default forwardRef(SyncForm);

View File

@@ -26,7 +26,7 @@ export const syncColumns = () => [
dataIndex: 'path',
key: 'path',
width: 180,
render: (_: string, row: any) => <RenderPath row={row} />
render: (_: string, row: any) => <RenderPath row={row} />,
},
{
title: 'Last updated',
@@ -36,7 +36,7 @@ export const syncColumns = () => [
render: (v: number) => (
<div>
<HistoryOutlined style={{ marginRight: 5, color: v ? '#52c41a' : '#ff4d4f' }} />
{ v ? fmtDate(v) : ''}
{v ? fmtDate(v) : ''}
</div>
),
},
@@ -56,7 +56,11 @@ export const syncColumns = () => [
>
<a>Sync</a>
</Popconfirm>
{row.last_updated && <Link to={`${row.id}`} state={row}>View</Link>}
{row.last_updated && (
<Link to={`${row.id}`} state={row}>
View
</Link>
)}
<a onClick={() => actions.setRecord(row, 'edit')}>Edit</a>
<Popconfirm
title="Are you sure to delete this path?"
@@ -67,23 +71,23 @@ export const syncColumns = () => [
<a>Delete</a>
</Popconfirm>
</Space>
)
}
}
);
},
},
];
const RenderPath = ({ row }: any) => {
const [filePath, setFilePath] = useState('');
useInit(async () => {
setFilePath(await getPath(row));
})
return <a onClick={() => shell.open(filePath)}>{filePath}</a>
setFilePath(await getPath(row));
});
return <a onClick={() => shell.open(filePath)}>{filePath}</a>;
};
export const getPath = async (row: any) => {
if (!/^http/.test(row.protocol)) {
return await path.join(await chatRoot(), row.path) + `.${row.ext}`;
return (await path.join(await chatRoot(), row.path)) + `.${row.ext}`;
} else {
return `${row.protocol}://${row.path}.${row.ext}`;
}
}
};

View File

@@ -10,7 +10,13 @@ import { CHAT_MODEL_JSON, chatRoot, readJSON, genCmd } from '@/utils';
import { syncColumns, getPath } from './config';
import SyncForm from './Form';
const fmtData = (data: Record<string, any>[] = []) => (Array.isArray(data) ? data : []).map((i) => ({ ...i, cmd: i.cmd ? i.cmd : genCmd(i.act), tags: ['user-sync'], enable: true }));
const fmtData = (data: Record<string, any>[] = []) =>
(Array.isArray(data) ? data : []).map((i) => ({
...i,
cmd: i.cmd ? i.cmd : genCmd(i.act),
tags: ['user-sync'],
enable: true,
}));
export default function SyncCustom() {
const [isVisible, setVisible] = useState(false);
@@ -37,7 +43,10 @@ export default function SyncCustom() {
handleSync(filename).then((isOk: boolean) => {
opInfo.resetRecord();
if (!isOk) return;
const data = opReplace(opInfo?.opRecord?.[opSafeKey], { ...opInfo?.opRecord, last_updated: Date.now() });
const data = opReplace(opInfo?.opRecord?.[opSafeKey], {
...opInfo?.opRecord,
last_updated: Date.now(),
});
modelSet(data);
opInfo.resetRecord();
});
@@ -48,9 +57,13 @@ export default function SyncCustom() {
if (['delete'].includes(opInfo.opType)) {
(async () => {
try {
const file = await path.join(await chatRoot(), 'cache_model', `${opInfo?.opRecord?.id}.json`);
const file = await path.join(
await chatRoot(),
'cache_model',
`${opInfo?.opRecord?.id}.json`,
);
await fs.removeFile(file);
} catch(e) {}
} catch (e) {}
const data = opRemove(opInfo?.opRecord?.[opSafeKey]);
modelSet(data);
opInfo.resetRecord();
@@ -94,29 +107,24 @@ export default function SyncCustom() {
};
const handleOk = () => {
formRef.current?.form?.validateFields()
.then((vals: Record<string, any>) => {
if (opInfo.opType === 'new') {
const data = opAdd(vals);
modelSet(data);
message.success('Data added successfully');
}
if (opInfo.opType === 'edit') {
const data = opReplace(opInfo?.opRecord?.[opSafeKey], vals);
modelSet(data);
message.success('Data updated successfully');
}
hide();
})
formRef.current?.form?.validateFields().then((vals: Record<string, any>) => {
if (opInfo.opType === 'new') {
const data = opAdd(vals);
modelSet(data);
message.success('Data added successfully');
}
if (opInfo.opType === 'edit') {
const data = opReplace(opInfo?.opRecord?.[opSafeKey], vals);
modelSet(data);
message.success('Data updated successfully');
}
hide();
});
};
return (
<div>
<Button
className="chat-add-btn"
type="primary"
onClick={opInfo.opNew}
>
<Button className="chat-add-btn" type="primary" onClick={opInfo.opNew}>
Add PATH
</Button>
<Table
@@ -138,5 +146,5 @@ export default function SyncCustom() {
<SyncForm ref={formRef} record={opInfo?.opRecord} type={opInfo.opType} />
</Modal>
</div>
)
}
);
}

View File

@@ -41,8 +41,6 @@ export const syncColumns = () => [
dataIndex: 'prompt',
key: 'prompt',
// width: 300,
render: (v: string) => (
<span className="chat-prompts-val">{v}</span>
),
render: (v: string) => <span className="chat-prompts-val">{v}</span>,
},
];

View File

@@ -1,4 +1,5 @@
.chat-table-tip, .chat-table-btns {
.chat-table-tip,
.chat-table-btns {
display: flex;
justify-content: space-between;
}

View File

@@ -52,7 +52,7 @@ export default function SyncPrompts() {
}, [opInfo.opTime]);
const handleEnable = (isEnable: boolean) => {
const data = opReplaceItems(selectedRowIDs, { enable: isEnable })
const data = opReplaceItems(selectedRowIDs, { enable: isEnable });
modelCacheSet(data);
};
@@ -72,7 +72,9 @@ export default function SyncPrompts() {
<div>
{selectedItems.length > 0 && (
<>
<Button type="primary" onClick={() => handleEnable(true)}>Enable</Button>
<Button type="primary" onClick={() => handleEnable(true)}>
Enable
</Button>
<Button onClick={() => handleEnable(false)}>Disable</Button>
<span className="num">Selected {selectedItems.length} items</span>
</>
@@ -84,7 +86,11 @@ export default function SyncPrompts() {
<FilePath url={promptsURL} content="f/awesome-chatgpt-prompts/prompts.csv" />
<FilePath label="CACHE" paths="cache_model/chatgpt_prompts.json" />
</div>
{lastUpdated && <span style={{ marginLeft: 10, color: '#888', fontSize: 12 }}>Last updated on {fmtDate(lastUpdated)}</span>}
{lastUpdated && (
<span style={{ marginLeft: 10, color: '#888', fontSize: 12 }}>
Last updated on {fmtDate(lastUpdated)}
</span>
)}
</div>
<Table
key={lastUpdated}
@@ -94,8 +100,10 @@ export default function SyncPrompts() {
dataSource={opData}
rowSelection={rowSelection}
pagination={TABLE_PAGINATION}
expandable={{expandedRowRender: (record) => <div style={{ padding: 10 }}>{record.prompt}</div>}}
expandable={{
expandedRowRender: (record) => <div style={{ padding: 10 }}>{record.prompt}</div>,
}}
/>
</div>
)
}
);
}

View File

@@ -25,7 +25,11 @@ export const syncColumns = () => [
key: 'tags',
// width: 150,
render: (v: string[]) => (
<span className="chat-prompts-tags">{v?.map(i => <Tag key={i}>{i}</Tag>)}</span>
<span className="chat-prompts-tags">
{v?.map((i) => (
<Tag key={i}>{i}</Tag>
))}
</span>
),
},
{
@@ -43,8 +47,6 @@ export const syncColumns = () => [
dataIndex: 'prompt',
key: 'prompt',
// width: 300,
render: (v: string) => (
<span className="chat-prompts-val">{v}</span>
),
render: (v: string) => <span className="chat-prompts-val">{v}</span>,
},
];

View File

@@ -30,7 +30,7 @@ export default function SyncRecord() {
useInit(async () => {
setFilePath(await getPath(state));
setJsonPath(await path.join(await chatRoot(), 'cache_model', `${state?.id}.json`));
})
});
useEffect(() => {
if (modelCacheJson.length <= 0) return;
@@ -45,7 +45,7 @@ export default function SyncRecord() {
}, [opInfo.opTime]);
const handleEnable = (isEnable: boolean) => {
const data = opReplaceItems(selectedRowIDs, { enable: isEnable })
const data = opReplaceItems(selectedRowIDs, { enable: isEnable });
modelCacheSet(data);
};
@@ -58,7 +58,9 @@ export default function SyncRecord() {
<div>
{selectedItems.length > 0 && (
<>
<Button type="primary" onClick={() => handleEnable(true)}>Enable</Button>
<Button type="primary" onClick={() => handleEnable(true)}>
Enable
</Button>
<Button onClick={() => handleEnable(false)}>Disable</Button>
<span className="num">Selected {selectedItems.length} items</span>
</>
@@ -70,7 +72,11 @@ export default function SyncRecord() {
<FilePath url={filePath} />
<FilePath label="CACHE" paths={`cache_model/${state?.id}.json`} />
</div>
{state?.last_updated && <span style={{ marginLeft: 10, color: '#888', fontSize: 12 }}>Last updated on {fmtDate(state?.last_updated)}</span>}
{state?.last_updated && (
<span style={{ marginLeft: 10, color: '#888', fontSize: 12 }}>
Last updated on {fmtDate(state?.last_updated)}
</span>
)}
</div>
<Table
key="prompt"
@@ -80,8 +86,10 @@ export default function SyncRecord() {
dataSource={opData}
rowSelection={rowSelection}
pagination={TABLE_PAGINATION}
expandable={{expandedRowRender: (record) => <div style={{ padding: 10 }}>{record.prompt}</div>}}
expandable={{
expandedRowRender: (record) => <div style={{ padding: 10 }}>{record.prompt}</div>,
}}
/>
</div>
)
}
);
}

View File

@@ -6,7 +6,7 @@ import Tags from '@comps/Tags';
import { DISABLE_AUTO_COMPLETE } from '@/utils';
interface UserCustomFormProps {
record?: Record<string|symbol, any> | null;
record?: Record<string | symbol, any> | null;
}
const initFormValue = {
@@ -16,7 +16,10 @@ const initFormValue = {
prompt: '',
};
const UserCustomForm: ForwardRefRenderFunction<FormProps, UserCustomFormProps> = ({ record }, ref) => {
const UserCustomForm: ForwardRefRenderFunction<FormProps, UserCustomFormProps> = (
{ record },
ref,
) => {
const [form] = Form.useForm();
useImperativeHandle(ref, () => ({ form }));
@@ -27,11 +30,7 @@ const UserCustomForm: ForwardRefRenderFunction<FormProps, UserCustomFormProps> =
}, [record]);
return (
<Form
form={form}
labelCol={{ span: 4 }}
initialValues={initFormValue}
>
<Form form={form} labelCol={{ span: 4 }} initialValues={initFormValue}>
<Form.Item
label="/{cmd}"
name="cmd"
@@ -60,7 +59,7 @@ const UserCustomForm: ForwardRefRenderFunction<FormProps, UserCustomFormProps> =
<Input.TextArea rows={4} placeholder="Please enter a prompt" {...DISABLE_AUTO_COMPLETE} />
</Form.Item>
</Form>
)
}
);
};
export default forwardRef(UserCustomForm);

View File

@@ -7,7 +7,7 @@ export const modelColumns = () => [
fixed: 'left',
width: 120,
key: 'cmd',
render: (v: string) => <Tag color="#2a2a2a">/{v}</Tag>
render: (v: string) => <Tag color="#2a2a2a">/{v}</Tag>,
},
{
title: 'Act',
@@ -21,7 +21,11 @@ export const modelColumns = () => [
key: 'tags',
width: 150,
render: (v: string[]) => (
<span className="chat-prompts-tags">{v?.map(i => <Tag key={i}>{i}</Tag>)}</span>
<span className="chat-prompts-tags">
{v?.map((i) => (
<Tag key={i}>{i}</Tag>
))}
</span>
),
},
{
@@ -39,9 +43,7 @@ export const modelColumns = () => [
dataIndex: 'prompt',
key: 'prompt',
width: 300,
render: (v: string) => (
<span className="chat-prompts-val">{v}</span>
),
render: (v: string) => <span className="chat-prompts-val">{v}</span>,
},
{
title: 'Action',
@@ -61,5 +63,5 @@ export const modelColumns = () => [
</Popconfirm>
</Space>
),
}
},
];

View File

@@ -50,10 +50,10 @@ export default function LanguageModel() {
const data = opReplace(opInfo?.opRecord?.[opSafeKey], opInfo?.opRecord);
modelCacheSet(data);
}
}, [opInfo.opTime])
}, [opInfo.opTime]);
const handleEnable = (isEnable: boolean) => {
const data = opReplaceItems(selectedRowIDs, { enable: isEnable })
const data = opReplaceItems(selectedRowIDs, { enable: isEnable });
modelCacheSet(data);
};
@@ -63,38 +63,51 @@ export default function LanguageModel() {
};
const handleOk = () => {
formRef.current?.form?.validateFields()
.then(async (vals: Record<string, any>) => {
if (modelCacheJson.map((i: any) => i.cmd).includes(vals.cmd) && opInfo?.opRecord?.cmd !== vals.cmd) {
message.warning(`"cmd: /${vals.cmd}" already exists, please change the "${vals.cmd}" name and resubmit.`);
return;
}
let data = [];
switch (opInfo.opType) {
case 'new': data = opAdd(vals); break;
case 'edit': data = opReplace(opInfo?.opRecord?.[opSafeKey], vals); break;
default: break;
}
await modelCacheSet(data);
opInit(data);
modelSet({
id: 'user_custom',
last_updated: Date.now(),
});
hide();
})
formRef.current?.form?.validateFields().then(async (vals: Record<string, any>) => {
if (
modelCacheJson.map((i: any) => i.cmd).includes(vals.cmd) &&
opInfo?.opRecord?.cmd !== vals.cmd
) {
message.warning(
`"cmd: /${vals.cmd}" already exists, please change the "${vals.cmd}" name and resubmit.`,
);
return;
}
let data = [];
switch (opInfo.opType) {
case 'new':
data = opAdd(vals);
break;
case 'edit':
data = opReplace(opInfo?.opRecord?.[opSafeKey], vals);
break;
default:
break;
}
await modelCacheSet(data);
opInit(data);
modelSet({
id: 'user_custom',
last_updated: Date.now(),
});
hide();
});
};
const modalTitle = `${({ new: 'Create', edit: 'Edit' })[opInfo.opType]} Model`;
const modalTitle = `${{ new: 'Create', edit: 'Edit' }[opInfo.opType]} Model`;
return (
<div>
<div className="chat-table-btns">
<Button className="chat-add-btn" type="primary" onClick={opInfo.opNew}>Add Model</Button>
<Button className="chat-add-btn" type="primary" onClick={opInfo.opNew}>
Add Model
</Button>
<div>
{selectedItems.length > 0 && (
<>
<Button type="primary" onClick={() => handleEnable(true)}>Enable</Button>
<Button type="primary" onClick={() => handleEnable(true)}>
Enable
</Button>
<Button onClick={() => handleEnable(false)}>Disable</Button>
<span className="num">Selected {selectedItems.length} items</span>
</>
@@ -103,7 +116,11 @@ export default function LanguageModel() {
</div>
<div className="chat-table-tip">
<FilePath label="CACHE" paths="cache_model/user_custom.json" />
{lastUpdated && <span style={{ marginLeft: 10, color: '#888', fontSize: 12 }}>Last updated on {fmtDate(lastUpdated)}</span>}
{lastUpdated && (
<span style={{ marginLeft: 10, color: '#888', fontSize: 12 }}>
Last updated on {fmtDate(lastUpdated)}
</span>
)}
</div>
<Table
key={lastUpdated}
@@ -113,7 +130,9 @@ export default function LanguageModel() {
dataSource={opData}
rowSelection={rowSelection}
pagination={TABLE_PAGINATION}
expandable={{expandedRowRender: (record) => <div style={{ padding: 10 }}>{record.prompt}</div>}}
expandable={{
expandedRowRender: (record) => <div style={{ padding: 10 }}>{record.prompt}</div>,
}}
/>
<Modal
open={isVisible}
@@ -126,5 +145,5 @@ export default function LanguageModel() {
<UserCustomForm record={opInfo?.opRecord} ref={formRef} />
</Modal>
</div>
)
}
);
}