mirror of
https://github.com/stonith404/pingvin-share.git
synced 2024-11-05 15:30:14 +01:00
Improve error handling on upload
This commit is contained in:
parent
5845659bab
commit
09645c6202
@ -15,6 +15,7 @@ import { useForm, yupResolver } from "@mantine/form";
|
|||||||
import { useModals } from "@mantine/modals";
|
import { useModals } from "@mantine/modals";
|
||||||
import { ModalsContextProps } from "@mantine/modals/lib/context";
|
import { ModalsContextProps } from "@mantine/modals/lib/context";
|
||||||
import * as yup from "yup";
|
import * as yup from "yup";
|
||||||
|
import shareService from "../../services/share.service";
|
||||||
|
|
||||||
const showCreateUploadModal = (
|
const showCreateUploadModal = (
|
||||||
modals: ModalsContextProps,
|
modals: ModalsContextProps,
|
||||||
@ -57,16 +58,20 @@ const Body = ({
|
|||||||
|
|
||||||
return (
|
return (
|
||||||
<form
|
<form
|
||||||
onSubmit={form.onSubmit((values) => {
|
onSubmit={form.onSubmit(async (values) => {
|
||||||
modals.closeAll();
|
if (await shareService.isIdAlreadyInUse(values.link)) {
|
||||||
uploadCallback(values.link, parseInt(values.expiration), {
|
form.setFieldError("link", "Link already in use.");
|
||||||
password: values.password,
|
} else {
|
||||||
maxVisitors: values.maxVisitors,
|
modals.closeAll();
|
||||||
});
|
uploadCallback(values.link, parseInt(values.expiration), {
|
||||||
|
password: values.password,
|
||||||
|
maxVisitors: values.maxVisitors,
|
||||||
|
});
|
||||||
|
}
|
||||||
})}
|
})}
|
||||||
>
|
>
|
||||||
<Group direction="column" grow>
|
<Group direction="column" grow>
|
||||||
<Grid align="flex-end">
|
<Grid align={form.errors.link ? "center" : "flex-end"}>
|
||||||
<Col xs={9}>
|
<Col xs={9}>
|
||||||
<TextInput
|
<TextInput
|
||||||
variant="filled"
|
variant="filled"
|
||||||
|
19
src/pages/api/share/[shareId]/exists.ts
Normal file
19
src/pages/api/share/[shareId]/exists.ts
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
import type { NextApiRequest, NextApiResponse } from "next";
|
||||||
|
import { ShareDocument } from "../../../../types/Appwrite.type";
|
||||||
|
import awServer from "../../../../utils/appwriteServer.util";
|
||||||
|
|
||||||
|
const handler = async (req: NextApiRequest, res: NextApiResponse) => {
|
||||||
|
const shareId = req.query.shareId as string;
|
||||||
|
let doesExists;
|
||||||
|
|
||||||
|
try {
|
||||||
|
await awServer.database.getDocument<ShareDocument>("shares", shareId);
|
||||||
|
doesExists = true;
|
||||||
|
} catch {
|
||||||
|
doesExists = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
res.status(200).json({ exists: doesExists });
|
||||||
|
};
|
||||||
|
|
||||||
|
export default handler;
|
@ -26,43 +26,54 @@ const Upload = () => {
|
|||||||
security: { password?: string; maxVisitors?: number }
|
security: { password?: string; maxVisitors?: number }
|
||||||
) => {
|
) => {
|
||||||
setisUploading(true);
|
setisUploading(true);
|
||||||
|
try {
|
||||||
|
files.forEach((file) => {
|
||||||
|
file.uploadingState = "inProgress";
|
||||||
|
});
|
||||||
|
|
||||||
const bucketId = JSON.parse(
|
const bucketId = JSON.parse(
|
||||||
(
|
(
|
||||||
await aw.functions.createExecution(
|
await aw.functions.createExecution(
|
||||||
"createShare",
|
"createShare",
|
||||||
JSON.stringify({ id, security, expiration }),
|
JSON.stringify({ id, security, expiration }),
|
||||||
false
|
false
|
||||||
)
|
)
|
||||||
).stdout
|
).stdout
|
||||||
).id;
|
).id;
|
||||||
for (let i = 0; i < files.length; i++) {
|
for (let i = 0; i < files.length; i++) {
|
||||||
files[i].uploadingState = "inProgress";
|
setFiles([...files]);
|
||||||
setFiles([...files]);
|
aw.storage.createFile(bucketId, "unique()", files[i]).then(
|
||||||
aw.storage.createFile(bucketId, "unique()", files[i]).then(
|
async () => {
|
||||||
async () => {
|
files[i].uploadingState = "finished";
|
||||||
files[i].uploadingState = "finished";
|
setFiles([...files]);
|
||||||
setFiles([...files]);
|
if (!files.some((f) => f.uploadingState == "inProgress")) {
|
||||||
if (!files.some((f) => f.uploadingState == "inProgress")) {
|
await aw.functions.createExecution(
|
||||||
await aw.functions.createExecution(
|
"finishShare",
|
||||||
"finishShare",
|
JSON.stringify({ id }),
|
||||||
JSON.stringify({ id }),
|
false
|
||||||
false
|
),
|
||||||
),
|
setisUploading(false);
|
||||||
setisUploading(false);
|
showCompletedUploadModal(
|
||||||
showCompletedUploadModal(
|
modals,
|
||||||
modals,
|
`${window.location.origin}/share/${bucketId}`,
|
||||||
`${window.location.origin}/share/${bucketId}`,
|
new Date(Date.now() + expiration * 60 * 1000).toLocaleString()
|
||||||
new Date(Date.now() + expiration * 60 * 1000).toLocaleString()
|
);
|
||||||
);
|
setFiles([]);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
(error) => {
|
||||||
|
files[i].uploadingState = undefined;
|
||||||
|
throw error;
|
||||||
}
|
}
|
||||||
},
|
);
|
||||||
(error) => {
|
}
|
||||||
files[i].uploadingState = undefined;
|
} catch (e: any) {
|
||||||
toast.error(error.message);
|
setisUploading(false);
|
||||||
setisUploading(false);
|
if (e.message) {
|
||||||
}
|
toast.error(e.message);
|
||||||
);
|
} else {
|
||||||
|
toast.error("An unknown error occurred.");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -2,18 +2,17 @@ import axios from "axios";
|
|||||||
import { AppwriteFileWithPreview } from "../types/File.type";
|
import { AppwriteFileWithPreview } from "../types/File.type";
|
||||||
|
|
||||||
const get = async (shareId: string, password?: string) => {
|
const get = async (shareId: string, password?: string) => {
|
||||||
return (
|
return (await axios.post(`/api/share/${shareId}`, { password }))
|
||||||
await axios.post(`/api/share/${shareId}`, { password })
|
.data as AppwriteFileWithPreview[];
|
||||||
).data as AppwriteFileWithPreview[];
|
};
|
||||||
|
const isIdAlreadyInUse = async (shareId: string) => {
|
||||||
|
return (await axios.get(`/api/share/${shareId}/exists`)).data
|
||||||
|
.exists as boolean;
|
||||||
};
|
};
|
||||||
|
|
||||||
const authenticateWithPassword = async (shareId: string, password?: string) => {
|
const authenticateWithPassword = async (shareId: string, password?: string) => {
|
||||||
return (
|
return (await axios.post(`/api/share/${shareId}/enterPassword`, { password }))
|
||||||
await axios.post(
|
.data as AppwriteFileWithPreview[];
|
||||||
`/api/share/${shareId}/enterPassword`,
|
|
||||||
{ password }
|
|
||||||
)
|
|
||||||
).data as AppwriteFileWithPreview[];
|
|
||||||
};
|
};
|
||||||
|
|
||||||
export default { get, authenticateWithPassword };
|
export default { get, authenticateWithPassword, isIdAlreadyInUse };
|
||||||
|
Loading…
Reference in New Issue
Block a user