metatroncubeswdev 365e45406a Bundle Offers Shopify app: discount function, admin, storefront, deploy stack
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>
2026-10-13 21:35:58 -04:00

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>
</>
);
}