Skip to content

Commit

Permalink
Add functionality to delete model
Browse files Browse the repository at this point in the history
  • Loading branch information
harishmohanraj committed Apr 23, 2024
1 parent 85bd045 commit 017aaf6
Show file tree
Hide file tree
Showing 6 changed files with 63 additions and 1 deletion.
5 changes: 5 additions & 0 deletions app/main.wasp
Original file line number Diff line number Diff line change
Expand Up @@ -280,6 +280,11 @@ action addUserModels {
entities: []
}

action deleteUserModels {
fn: import { deleteUserModels } from "@src/server/actions.js",
entities: []
}

action validateForm {
fn: import { validateForm } from "@src/server/actions.js",
entities: []
Expand Down
11 changes: 10 additions & 1 deletion app/src/client/app/ModelsPage.tsx
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import React from 'react';

import { getModels, useQuery, updateUserModels, addUserModels } from 'wasp/client/operations';
import { getModels, useQuery, updateUserModels, addUserModels, deleteUserModels } from 'wasp/client/operations';

import { useModels, ModelsActionType } from '../hooks/useModels';
import CustomLayout from './layout/CustomLayout';
Expand Down Expand Up @@ -38,6 +38,14 @@ const ModelsPage = () => {
dispatch({ type: ModelsActionType.TOGGLE_ADD_MODEL, payload: false });
};

const onDeleteCallback = async () => {
dispatch({ type: ModelsActionType.TOGGLE_LOADING, payload: true });
state.updateExistingModel && (await deleteUserModels({ uuid: state.updateExistingModel.uuid }));
await refetchModels();
dispatch({ type: ModelsActionType.TOGGLE_ADD_MODEL, payload: false });
dispatch({ type: ModelsActionType.TOGGLE_LOADING, payload: false });
};

const updateSelectedModel = (index: number) => {
if (modelsList) {
const selectedModel = modelsList[index];
Expand Down Expand Up @@ -93,6 +101,7 @@ const ModelsPage = () => {
onModelChange={handleModelChange}
onSuccessCallback={onSuccessCallback}
onCancelCallback={onCancelCallback}
onDeleteCallback={onDeleteCallback}
/>
)}
</>
Expand Down
13 changes: 13 additions & 0 deletions app/src/client/components/DynamicFormBuilder.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ interface DynamicFormBuilderProps {
updateExistingModel: Model | null;
onSuccessCallback: (data: any) => void;
onCancelCallback: (data: any) => void;
onDeleteCallback: (data: any) => void;
}

const DynamicFormBuilder: React.FC<DynamicFormBuilderProps> = ({
Expand All @@ -23,6 +24,7 @@ const DynamicFormBuilder: React.FC<DynamicFormBuilderProps> = ({
updateExistingModel,
onSuccessCallback,
onCancelCallback,
onDeleteCallback,
}) => {
const { formData, handleChange, formErrors, setFormErrors } = useForm({
jsonSchema,
Expand Down Expand Up @@ -91,6 +93,17 @@ const DynamicFormBuilder: React.FC<DynamicFormBuilderProps> = ({
>
Cancel
</button>

{updateExistingModel && (
<button
className='float-right ml-3 rounded-md px-3.5 py-2.5 text-sm border bg-airt-error text-airt-font-base hover:bg-opacity-80 shadow-sm focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-indigo-600'
disabled={isLoading}
data-testid='form-cancel-button'
onClick={onDeleteCallback}
>
Delete model
</button>
)}
</div>
</form>
{isLoading && (
Expand Down
3 changes: 3 additions & 0 deletions app/src/client/components/ModelForm.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ interface ModelFormProps {
onModelChange: (model: string) => void;
onSuccessCallback: (data: any) => void;
onCancelCallback: () => void;
onDeleteCallback: (data: any) => void;
}

const ModelForm: React.FC<ModelFormProps> = ({
Expand All @@ -23,6 +24,7 @@ const ModelForm: React.FC<ModelFormProps> = ({
onModelChange,
onSuccessCallback,
onCancelCallback,
onDeleteCallback,
}) => {
return (
<div>
Expand All @@ -39,6 +41,7 @@ const ModelForm: React.FC<ModelFormProps> = ({
updateExistingModel={updateExistingModel ?? null}
onSuccessCallback={onSuccessCallback}
onCancelCallback={onCancelCallback}
onDeleteCallback={onDeleteCallback}
/>
)}
</>
Expand Down
4 changes: 4 additions & 0 deletions app/src/client/tests/DynamicFormBuilder.test.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -81,6 +81,7 @@ describe('DynamicFormBuilder', () => {
updateExistingModel={updateExistingModel}
onSuccessCallback={vi.fn()}
onCancelCallback={vi.fn()}
onDeleteCallback={vi.fn()}
/>
);
expect(screen.getByLabelText('Model')).toBeInTheDocument();
Expand All @@ -97,6 +98,7 @@ describe('DynamicFormBuilder', () => {
updateExistingModel={updateExistingModel}
onSuccessCallback={onSuccessCallback}
onCancelCallback={vi.fn()}
onDeleteCallback={vi.fn()}
/>
);

Expand Down Expand Up @@ -148,6 +150,7 @@ describe('DynamicFormBuilder', () => {
updateExistingModel={updateExistingModel}
onSuccessCallback={onSuccessCallback}
onCancelCallback={vi.fn()}
onDeleteCallback={vi.fn()}
/>
);

Expand All @@ -168,6 +171,7 @@ describe('DynamicFormBuilder', () => {
updateExistingModel={updateExistingModel}
onSuccessCallback={vi.fn()}
onCancelCallback={vi.fn()}
onDeleteCallback={vi.fn()}
/>
);

Expand Down
28 changes: 28 additions & 0 deletions app/src/server/actions.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ import {
type ValidateForm,
type UpdateUserModels,
type AddUserModels,
type DeleteUserModels,
} from 'wasp/server/operations';
import Stripe from 'stripe';
import type { StripePaymentResult } from '../shared/types';
Expand Down Expand Up @@ -189,6 +190,33 @@ export const updateUserModels: UpdateUserModels<UpdateUserModelsPayload, void> =
}
};

type DeleteUserModelsPayload = {
uuid: string;
};

export const deleteUserModels: DeleteUserModels<DeleteUserModelsPayload, void> = async (args, context) => {
if (!context.user) {
throw new HttpError(401);
}

try {
const response = await fetch(`${FASTAGENCY_SERVER_URL}/models/delete`, {
method: 'DELETE',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ user_id: context.user.id, uuid: args.uuid }),
});
const json: any = (await response.json()) as { detail?: string }; // Parse JSON once

if (!response.ok) {
const errorMsg = json.detail || `HTTP error with status code ${response.status}`;
console.error('Server Error:', errorMsg);
throw new Error(errorMsg);
}
} catch (error: any) {
throw new HttpError(500, error.message);
}
};

export const validateForm: ValidateForm<{ data: any; validationURL: string }, any> = async (
{ data, validationURL }: { data: any; validationURL: string },
context: any
Expand Down

0 comments on commit 017aaf6

Please sign in to comment.