Skip to content

Commit 3c50bd6

Browse files
committed
support txt and direct text input
1 parent cfe9994 commit 3c50bd6

21 files changed

Lines changed: 1673 additions & 1083 deletions

File tree

.github/workflows/devs.yml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,8 @@ jobs:
3333
# 2) generate a full .env before starting anything:
3434
- name: Generate Env File
3535
run: |
36-
cat <<EOF > .env
36+
cat <<EOF > .env
37+
DCUP_ENV=OS
3738
NEXT_PUBLIC_APP_ENV=TEST
3839
DCUP_PARSER=http://localhost:9000
3940
NEXTAUTH_URL=http://localhost:3000

DataSource/Aws/setAwsConnection.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@ export const setAWSConnection = async (formData: FormData) => {
4444
fileLimit: config.data.fileLimit,
4545
metadata: config.data.metadata,
4646
files: [],
47-
links: []
47+
links: [],
48+
texts: []
4849
}
4950
}

DataSource/DirectUpload/setDirectUploadConnection.ts

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@ const directUploadConfig = z.object({
5050
})
5151
),
5252
links: z.array(z.string().min(5)),
53+
texts: z.array(z.string().min(5)),
5354
})
5455

5556
const updateDirectUploadConfig = z.object({
@@ -88,6 +89,7 @@ const updateDirectUploadConfig = z.object({
8889
})
8990
),
9091
links: z.array(z.string().min(5)),
92+
texts: z.array(z.string().min(5)),
9193
removedFiles: z.array(z.string().min(5))
9294
})
9395

@@ -99,6 +101,7 @@ export const updateDirectUploadConnection = async (formData: FormData) => {
99101
metadata: formData.get("metadata") || "{}",
100102
files: formData.getAll("files") || [],
101103
links: formData.getAll("links") || [],
104+
texts: formData.getAll("texts") || [],
102105
removedFiles: formData.getAll("removedFiles") || [],
103106
pageLimit: formData.get("pageLimit")
104107
})
@@ -156,13 +159,13 @@ export const updateDirectUploadConnection = async (formData: FormData) => {
156159
metadata: config.data.metadata ?? "{}",
157160
files: await Promise.all(files),
158161
links: config.data.links,
162+
texts: config.data.texts,
159163
pageLimit: config.data.pageLimit,
160164
fileLimit: null
161165
}
162166
}
163167

164168
export const setDirectUploadConnection = async (formData: FormData) => {
165-
166169
const config = directUploadConfig.safeParse({
167170
userId: formData.get("userId"),
168171
identifier: formData.get("identifier"),
@@ -171,6 +174,7 @@ export const setDirectUploadConnection = async (formData: FormData) => {
171174
fileLimit: formData.get("fileLimit"),
172175
files: formData.getAll("files"),
173176
links: formData.getAll("links"),
177+
texts: formData.getAll("texts")
174178
})
175179

176180
if (!config.success) {
@@ -183,9 +187,9 @@ export const setDirectUploadConnection = async (formData: FormData) => {
183187
throw new Error(`Validation errors - ${errors}`)
184188
}
185189

186-
const { files, links, userId, identifier, metadata, fileLimit, pageLimit } = config.data;
190+
const { files, links, userId, identifier, metadata, fileLimit, pageLimit, texts } = config.data;
187191

188-
if (files.length === 0 && links.length === 0) {
192+
if (files.length === 0 && links.length === 0 && texts.length === 0) {
189193
throw new Error('Please provide at least one file or link to proceed.')
190194
}
191195

@@ -213,6 +217,7 @@ export const setDirectUploadConnection = async (formData: FormData) => {
213217
metadata: metadata,
214218
files: await Promise.all(allFiles),
215219
links: links,
220+
texts: texts,
216221
pageLimit: config.data.pageLimit,
217222
fileLimit: fileLimit
218223
}

DataSource/Dropbox/setDropboxConnection.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@ export const setDropboxConnection = async (formData: FormData) => {
4343
fileLimit: config.data.fileLimit,
4444
metadata: config.data.metadata,
4545
files: [],
46-
links: []
46+
links: [],
47+
texts: [],
4748
}
4849
}

DataSource/GoogleDrive/setGoogleDriveConnection.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@ export const setGoogleDriveConnection = async (formData: FormData) => {
4343
fileLimit: config.data.fileLimit,
4444
metadata: config.data.metadata,
4545
files: [],
46-
links: []
46+
links: [],
47+
texts: []
4748
}
4849
}

app/api/connections/[id]/files/route.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -109,7 +109,6 @@ export async function DELETE(request: NextRequest, { params }: Params) {
109109
? [validation.data.file]
110110
: validation.data.files ?? [];
111111

112-
113112
for (const fileName of filesToDelete) {
114113
const { data, error } = await tryAndCatch(databaseDrizzle
115114
.delete(processedFiles)

components/Connections/Connections.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ export default function Connections({ connections, tokens }: { connections: Conn
4747
if (connProgress?.status === 'FINISHED') {
4848
route.refresh();
4949
}
50-
}, [connProgress]);
50+
}, [connProgress, route]);
5151

5252
return connections.map(connection => {
5353
const progress = connection.id === connProgress?.connectionId ? connProgress : null;

components/UploadFileForm/UploadFileForm.tsx

Lines changed: 41 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ type TFileForm = {
3232

3333
export const UploadFileForm = ({ setOpen, connection }: TFileForm) => {
3434
const [links, setLinks] = useState<string[]>([]);
35+
const [text, setText] = useState<string>("")
3536
const [files, setFiles] = useState<File[]>([]);
3637
const [removedFiles, setRemovedFiles] = useState<string[]>([]);
3738
const [pending, startTransition] = useTransition();
@@ -47,6 +48,7 @@ export const UploadFileForm = ({ setOpen, connection }: TFileForm) => {
4748
removedFiles.forEach((fileName) => data.append("removedFiles", fileName));
4849
} else {
4950
data.set("service", "DIRECT_UPLOAD");
51+
if (text) data.append("texts", text)
5052
}
5153
const res = await setConnectionConfig(EMPTY_FORM_STATE, data)
5254
if (res.status === "SUCCESS") {
@@ -109,6 +111,7 @@ export const UploadFileForm = ({ setOpen, connection }: TFileForm) => {
109111
<DataInput
110112
files={files}
111113
setFiles={setFiles}
114+
setText={setText}
112115
links={links}
113116
setLinks={setLinks}
114117
currentFiles={connection ? connection.files.map(f => f.name) : []}
@@ -139,12 +142,13 @@ type TDataInput = {
139142
setFiles: Dispatch<SetStateAction<File[]>>;
140143
links: string[];
141144
setLinks: Dispatch<SetStateAction<string[]>>;
145+
setText: Dispatch<SetStateAction<string>>;
142146
currentFiles: string[];
143147
removedFiles: string[];
144148
setRemovedFiles: Dispatch<SetStateAction<string[]>>;
145149
};
146150

147-
export const DataInput = ({ files, setFiles, links, setLinks, currentFiles, removedFiles, setRemovedFiles }: TDataInput) => {
151+
export const DataInput = ({ files, setFiles, links, setLinks, currentFiles, removedFiles, setRemovedFiles, setText }: TDataInput) => {
148152
const inputFile = useRef<HTMLInputElement>(null);
149153
const [invalidLinks, setInvalidLinks] = useState<string[]>([]);
150154
const [invalidFile, setInvalidFile] = useState("");
@@ -160,12 +164,12 @@ export const DataInput = ({ files, setFiles, links, setLinks, currentFiles, remo
160164
e.preventDefault();
161165
const droppedFiles = Array.from(e.dataTransfer.files);
162166
const validFiles = droppedFiles.filter((f) => {
163-
if (f.type !== "application/pdf") {
164-
setInvalidFile(`${f.name} is not supported. Please upload PDFs only.`);
167+
if (f.type !== "application/pdf" && f.type !== "text/plain" && f.name.endsWith(".txt")) {
168+
setInvalidFile(`${f.name} is not supported. Please upload PDFs only.`);
165169
return false;
166170
}
167171
if (currentFiles.includes(f.name)) {
168-
setInvalidFile(`${f.name} is already added`);
172+
setInvalidFile(`${f.name} is already added`);
169173
return false;
170174
}
171175
return true;
@@ -177,8 +181,8 @@ export const DataInput = ({ files, setFiles, links, setLinks, currentFiles, remo
177181
e.preventDefault();
178182
const selectedFiles = Array.from(e.target.files || []);
179183
const validFiles = selectedFiles.filter((f) => {
180-
if (f.type !== "application/pdf") {
181-
setInvalidFile(`${f.name} is not supported. Please upload PDFs only.`);
184+
if (f.type !== "application/pdf" && f.type !== "text/plain" && f.name.endsWith(".txt")) {
185+
setInvalidFile(`${f.name} is not supported. Please upload PDFs or .txt only.`);
182186
return false;
183187
}
184188
if (currentFiles.includes(f.name)) {
@@ -224,22 +228,25 @@ export const DataInput = ({ files, setFiles, links, setLinks, currentFiles, remo
224228
return (
225229
<div className="flex-1 flex flex-col h-full">
226230
<Tabs defaultValue="file" className="w-full h-full flex flex-col">
227-
<TabsList className="grid w-full grid-cols-2">
231+
<TabsList className="grid w-full grid-cols-3">
228232
<TabsTrigger value="file" className="gap-2">
229233
<UploadCloud className="h-5 w-5" />
230-
Upload Files
234+
Files
235+
</TabsTrigger>
236+
<TabsTrigger data-test={"btn-texts"} value="texts" className="gap-2">
237+
<Link className="h-5 w-5" />
238+
Texts
231239
</TabsTrigger>
232240
<TabsTrigger value="link" className="gap-2">
233241
<Link className="h-5 w-5" />
234-
Paste Links
242+
Links
235243
</TabsTrigger>
236244
</TabsList>
237-
238245
<TabsContent value="file" className="flex-1">
239246
<Card className="flex flex-col">
240247
<CardHeader>
241-
<CardTitle>Upload your PDFs</CardTitle>
242-
<CardDescription>Only PDF files are supported.</CardDescription>
248+
<CardTitle>Upload your Files</CardTitle>
249+
<CardDescription>Only PDF,txt files are supported.</CardDescription>
243250
{invalidFile && (
244251
<div className="mt-2 text-red-600 text-sm">
245252
<AlertCircle className="h-4 w-4 inline-block mr-1" />
@@ -254,14 +261,13 @@ export const DataInput = ({ files, setFiles, links, setLinks, currentFiles, remo
254261
className="border-2 border-dashed border-gray-300 rounded-xl p-5 text-center hover:border-teal-500 transition-colors flex flex-col justify-center"
255262
>
256263
<UploadCloud className="h-12 w-12 mx-auto text-gray-400 mb-4" />
257-
<p className="text-gray-600 mb-2">Drag & drop PDF files here</p>
264+
<p className="text-gray-600 mb-2">Drag & drop PDF, txt files here</p>
258265
<p className="text-sm text-gray-500 mb-4">or</p>
259266
<input
260267
type="file"
261268
name="fileUpload"
262269
ref={inputFile}
263270
multiple
264-
accept="application/pdf"
265271
onChange={addNewFile}
266272
className={env === 'TEST' ? "block" : "hidden"}
267273
id="file-upload"
@@ -295,8 +301,8 @@ export const DataInput = ({ files, setFiles, links, setLinks, currentFiles, remo
295301
<TabsContent value="link" className="flex-1">
296302
<Card className="flex flex-col">
297303
<CardHeader>
298-
<CardTitle>Provide PDF URLs</CardTitle>
299-
<CardDescription>Enter valid HTTP/HTTPS links to PDF files.</CardDescription>
304+
<CardTitle>Provide PDF, txt URLs</CardTitle>
305+
<CardDescription>Enter valid HTTP/HTTPS links to PDF, txt files.</CardDescription>
300306
</CardHeader>
301307
<CardContent>
302308
<div className="space-y-4">
@@ -324,6 +330,25 @@ export const DataInput = ({ files, setFiles, links, setLinks, currentFiles, remo
324330
</CardContent>
325331
</Card>
326332
</TabsContent>
333+
334+
<TabsContent value="texts" className="flex-1">
335+
<Card className="flex flex-col">
336+
<CardHeader>
337+
<CardTitle>Provide Direcct Text</CardTitle>
338+
<CardDescription>Enter Text</CardDescription>
339+
</CardHeader>
340+
<CardContent>
341+
<div className="space-y-4">
342+
<Textarea
343+
onChange={(e) => setText(e.target.value)}
344+
name="text"
345+
placeholder="Enter direct text"
346+
className={`w-full h-60 resize-none`}
347+
/>
348+
</div>
349+
</CardContent>
350+
</Card>
351+
</TabsContent>
327352
</Tabs>
328353
</div>
329354
);

cypress.config.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ export default defineConfig({
1818
chromeWebSecurity: false,
1919
watchForFileChanges: false,
2020
e2e: {
21-
defaultCommandTimeout: 10_000,
21+
defaultCommandTimeout: 20000,
2222
setupNodeEvents(on) {
2323
on("task", {
2424
async getUserId({ email }: { email: string }) {

0 commit comments

Comments
 (0)