Skip to content

Instantly share code, notes, and snippets.

@Clarity-89
Clarity-89 / unsaved-form-data-0.jsx
Created January 13, 2023 07:45
Display Warning for Unsaved Form Data on Page Exit
// FormPrompt.js
import { useEffect } from "react";
export const FormPrompt = ({ hasUnsavedChanges }) => {
useEffect(() => {
const onBeforeUnload = (e) => {
if (hasUnsavedChanges) {
e.preventDefault();
e.returnValue = "";
}
@Clarity-89
Clarity-89 / advance-form-0.jsx
Last active October 12, 2022 13:06
Building Multistep Forms With React Hook Form
//Steps/Contact.js
export const Contact = forwardRef((props, ref) => {
//..
return (
<Form onSubmit={handleSubmit(saveData)}>
//..
<Button ref={ref}>Next {">"}</Button>
</Form>
);
});
@Clarity-89
Clarity-89 / test-0.jsx
Last active October 5, 2022 14:57
Building Multistep Forms With React Hook Form
// state.js
import React, { createContext, useContext, useState } from "react";
export const AppStateContext = createContext();
export function AppProvider({ children }) {
const value = useState({});
return (
<AppStateContext.Provider value={value}>
it("renders without breaking", async () => {
render(<ListPage />);
await waitForElementToBeRemoved(() => screen.queryByText("Loading..."));
});
describe("ListPage", () => {
it("renders without breaking", async () => {
render(<ListPage />);
expect(
await screen.findByRole("heading", { name: "List of items" })
).toBeInTheDocument();
});
});
import { waitFor } from "@testing-library/react";
//...
describe("ListPage", () => {
it("renders without breaking", async () => {
render(<ListPage />);
await waitFor(() => {
expect(
screen.getByRole("heading", { name: "List of items" })
export const ListPage = () => {
const [items, setItems] = useState([]);
useEffect(() => {
const loadItems = async () => {
setTimeout(() => setItems(["Item 1", "Item 2"]), 100);
};
loadItems();
}, []);
describe("Form", () => {
it("should save correct data on submit", async () => {
const mockSave = jest.fn();
render(<Form saveData={mockSave} />);
await userEvent.type(screen.getByRole("textbox", { name: "Name" }), "Test");
await userEvent.click(screen.getByRole("button", { name: "Sign up" }));
expect(mockSave).toHaveBeenLastCalledWith({ ...defaultData, name: "Test" });
});
});
describe("Form", () => {
it("should save correct data on submit", () => {
const mockSave = jest.fn();
render(<Form saveData={mockSave} />);
fireEvent.change(screen.getByRole("textbox", { name: "Name" }), {
target: { value: "Test" },
});
fireEvent.submit(screen.getByRole("button", { name: "Sign up" }));
expect(mockSave).toHaveBeenLastCalledWith({ ...defaultData, name: "Test" });
});
<label htmlFor="name">Name</label>
<input
id="name"
onChange={onFieldChange}
placeholder="Enter your name"
/>