aboutsummaryrefslogtreecommitdiff
path: root/FrontEnd/src/app/views/common/OperationDialog.tsx
diff options
context:
space:
mode:
authorcrupest <crupest@outlook.com>2020-11-17 17:31:42 +0800
committercrupest <crupest@outlook.com>2020-11-17 17:31:42 +0800
commite51e3b7c3c987f52823798b749e6c6deb2bfbe38 (patch)
tree3ff6f99f7b87a79e3279b3bd7de1431894f87066 /FrontEnd/src/app/views/common/OperationDialog.tsx
parent711a148fbbf4361f9c0632eff973c2f240a67c5d (diff)
downloadtimeline-e51e3b7c3c987f52823798b749e6c6deb2bfbe38.tar.gz
timeline-e51e3b7c3c987f52823798b749e6c6deb2bfbe38.tar.bz2
timeline-e51e3b7c3c987f52823798b749e6c6deb2bfbe38.zip
...
Diffstat (limited to 'FrontEnd/src/app/views/common/OperationDialog.tsx')
-rw-r--r--FrontEnd/src/app/views/common/OperationDialog.tsx31
1 files changed, 19 insertions, 12 deletions
diff --git a/FrontEnd/src/app/views/common/OperationDialog.tsx b/FrontEnd/src/app/views/common/OperationDialog.tsx
index e32e9277..08baf93a 100644
--- a/FrontEnd/src/app/views/common/OperationDialog.tsx
+++ b/FrontEnd/src/app/views/common/OperationDialog.tsx
@@ -77,11 +77,6 @@ type MapOperationInputInfoValueTypeList<
[Index in keyof Tuple]: MapOperationInputInfoValueType<Tuple[Index]>;
} & { length: Tuple["length"] };
-interface OperationResult {
- type: "success" | "failure";
- data: unknown;
-}
-
export type OperationInputError =
| {
[index: number]: I18nText | null | undefined;
@@ -98,6 +93,7 @@ const isNoError = (error: OperationInputError): boolean => {
};
export interface OperationDialogProps<
+ TData,
OperationInputInfoList extends readonly OperationInputInfo[]
> {
open: boolean;
@@ -106,28 +102,39 @@ export interface OperationDialogProps<
titleColor?: "default" | "dangerous" | "create" | string;
onProcess: (
inputs: MapOperationInputInfoValueTypeList<OperationInputInfoList>
- ) => Promise<unknown>;
+ ) => Promise<TData>;
inputScheme?: OperationInputInfoList;
inputValidator?: (
inputs: MapOperationInputInfoValueTypeList<OperationInputInfoList>
) => OperationInputError;
inputPrompt?: I18nText | (() => React.ReactNode);
processPrompt?: () => React.ReactNode;
- successPrompt?: (data: unknown) => React.ReactNode;
+ successPrompt?: (data: TData) => React.ReactNode;
failurePrompt?: (error: unknown) => React.ReactNode;
- onSuccessAndClose?: () => void;
+ onSuccessAndClose?: (data: TData) => void;
}
const OperationDialog = <
+ TData,
OperationInputInfoList extends readonly OperationInputInfo[]
>(
- props: OperationDialogProps<OperationInputInfoList>
+ props: OperationDialogProps<TData, OperationInputInfoList>
): React.ReactElement => {
const inputScheme = props.inputScheme as readonly OperationInputInfo[];
const { t } = useTranslation();
- type Step = "input" | "process" | OperationResult;
+ type Step =
+ | "input"
+ | "process"
+ | {
+ type: "success";
+ data: TData;
+ }
+ | {
+ type: "failure";
+ data: unknown;
+ };
const [step, setStep] = useState<Step>("input");
const [values, setValues] = useState<(boolean | string)[]>(
inputScheme.map((i) => {
@@ -153,7 +160,7 @@ const OperationDialog = <
step.type === "success" &&
props.onSuccessAndClose
) {
- props.onSuccessAndClose();
+ props.onSuccessAndClose(step.data);
}
} else {
console.log("Attempt to close modal when processing.");
@@ -169,7 +176,7 @@ const OperationDialog = <
>
)
.then(
- (d: unknown) => {
+ (d) => {
setStep({
type: "success",
data: d,