Rust discount function (one automatic discount evaluating all offers in priority order, parity with the Odoo engine), React Router admin with Polaris, theme app extension and app proxy pages, webhooks incl. GDPR, managed-pricing limits, and a Docker Compose stack (Postgres + Caddy HTTPS) for a single VPS. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
50 lines
1.4 KiB
TypeScript
50 lines
1.4 KiB
TypeScript
import { useState } from "react";
|
|
import type { ActionFunctionArgs, LoaderFunctionArgs } from "react-router";
|
|
import { Form, useActionData, useLoaderData } from "react-router";
|
|
|
|
import { login } from "../../shopify.server";
|
|
import { loginErrorMessage } from "./error.server";
|
|
|
|
export const loader = async ({ request }: LoaderFunctionArgs) => {
|
|
const errors = loginErrorMessage(await login(request));
|
|
|
|
return { errors };
|
|
};
|
|
|
|
export const action = async ({ request }: ActionFunctionArgs) => {
|
|
const errors = loginErrorMessage(await login(request));
|
|
|
|
return {
|
|
errors,
|
|
};
|
|
};
|
|
|
|
export default function Auth() {
|
|
const loaderData = useLoaderData<typeof loader>();
|
|
const actionData = useActionData<typeof action>();
|
|
const [shop, setShop] = useState("");
|
|
const { errors } = actionData || loaderData;
|
|
|
|
return (
|
|
<>
|
|
<script src="https://cdn.shopify.com/shopifycloud/polaris.js" />
|
|
<s-page>
|
|
<Form method="post">
|
|
<s-section heading="Log in">
|
|
<s-text-field
|
|
name="shop"
|
|
label="Shop domain"
|
|
details="example.myshopify.com"
|
|
value={shop}
|
|
onChange={(e) => setShop(e.currentTarget.value)}
|
|
autocomplete="on"
|
|
error={errors.shop}
|
|
></s-text-field>
|
|
<s-button type="submit">Log in</s-button>
|
|
</s-section>
|
|
</Form>
|
|
</s-page>
|
|
</>
|
|
);
|
|
}
|