import React, { useState, useEffect } from "react"; import { json } from "@remix-run/node"; import { useLoaderData, useActionData, useSubmit } from "@remix-run/react"; import { Page, Layout, Card, BlockStack, Text, Badge, InlineStack, Image, Divider, Button, Modal, TextField, Box, Link, } from "@shopify/polaris"; import { TitleBar } from "@shopify/app-bridge-react"; import data4autosLogo from "../assets/data4autos_logo.png"; // make sure this exists import turn14DistributorLogo from "../assets/turn14-logo.png"; import { authenticate } from "../shopify.server"; // Shopify server authentication import { Form } from "@remix-run/react"; // Loader to check subscription status export const loader = async ({ request }) => { const { admin } = await authenticate.admin(request); // Query the current subscription status const resp = await admin.graphql(` query { currentAppInstallation { activeSubscriptions { id status trialDays createdAt currentPeriodEnd } } } `); const result = await resp.json(); const subscription = result.data.currentAppInstallation.activeSubscriptions[0] || null; const { session } = await authenticate.admin(request); const shop = session.shop; // For new users, there's no subscription. We will show a "Not subscribed" message. if (!subscription) { return json({ redirectToBilling: true, subscription: null,shop }); } // If no active or trial subscription, return redirect signal if (subscription.status !== "ACTIVE" && subscription.status !== "TRIAL") { return json({ redirectToBilling: true, subscription ,shop }); } return json({ redirectToBilling: false, subscription,shop }); }; // Action to create subscription export const action = async ({ request }) => { console.log("Creating subscription..."); const { admin } = await authenticate.admin(request); const createRes = await admin.graphql(` mutation { appSubscriptionCreate( name: "Pro Plan", returnUrl: "https://your-app.com/after-billing", lineItems: [ { plan: { appRecurringPricingDetails: { price: { amount: 19.99, currencyCode: USD }, interval: EVERY_30_DAYS } } } ], trialDays: 7, # ✅ trialDays is a top-level argument! test: false ) { confirmationUrl appSubscription { id status trialDays } userErrors { field message } } } `); const data = await createRes.json(); console.log("Subscription creation response:", data); if (data.errors || !data.data.appSubscriptionCreate.confirmationUrl) { return json({ errors: ["Failed to create subscription."] }, { status: 400 }); } console.log("Subscription created successfully:", data.data.appSubscriptionCreate.confirmationUrl); return json({ confirmationUrl: data.data.appSubscriptionCreate.confirmationUrl }); }; export default function Index() { const actionData = useActionData(); const loaderData = useLoaderData(); const submit = useSubmit(); // Use submit to trigger the action const [activeModal, setActiveModal] = useState(false); const subscription = loaderData?.subscription; const shop = loaderData?.shop; // useEffect(() => { // console.log("Action data:", actionData); // // If we have a confirmation URL, redirect to it // if (actionData?.confirmationUrl) { // window.location.href = actionData.confirmationUrl; // Redirect to Shopify's billing confirmation page // } // }, [actionData]); useEffect(() => { if (actionData?.confirmationUrl) { window.open(actionData.confirmationUrl, "_blank", "noopener,noreferrer"); setActiveModal(false); // close the modal } }, [actionData]); const openModal = () => setActiveModal(true); const closeModal = () => setActiveModal(false); // const items = [ // { icon: "⚙️", text: "Manage API settings", link: "https://admin.shopify.com/store/veloxautomotive/apps/d4a-turn14/app/settings" }, // { icon: "🏷️", text: "Browse and import available brands", link: "https://admin.shopify.com/store/veloxautomotive/apps/d4a-turn14/app/brands" }, // { icon: "📦", text: "Sync brand collections to Shopify", link: "https://admin.shopify.com/store/veloxautomotive/apps/d4a-turn14/app/managebrand" }, // { icon: "🔐", text: "Handle secure Turn14 login credentials", link: "https://admin.shopify.com/store/veloxautomotive/apps/d4a-turn14/app/help" }, // ]; const shopDomain = (shop || "").split(".")[0];; // from the GraphQL query above const items = [ { icon: "⚙️", text: "Manage API settings", link: `https://admin.shopify.com/store/${shopDomain}/apps/d4a-turn14/app/settings` }, { icon: "🏷️", text: "Browse and import available brands", link: `https://admin.shopify.com/store/${shopDomain}/apps/d4a-turn14/app/brands` }, { icon: "📦", text: "Sync brand collections to Shopify", link: `https://admin.shopify.com/store/${shopDomain}/apps/d4a-turn14/app/managebrand` }, { icon: "🔐", text: "Handle secure Turn14 login credentials", link: `https://admin.shopify.com/store/${shopDomain}/apps/d4a-turn14/app/help` }, ]; return ( {/* Centered Heading */} Welcome to your Turn14 Dashboard {/* Logos Row */} Data4Autos Logo Turn14 Distributors Logo 🚀 Data4Autos Turn14 Integration gives you the power to sync product brands, manage collections, and automate catalog setup directly from Turn14 to your Shopify store. {/* 🔧 */} Use the left sidebar to: {items.map((item, index) => ( {item.icon} {item.text} ))} {/* Status Badge */} Status: Connected Shopify × Turn14 {/* Support Info */} Need help? Contact us at{" "} support@data4autos.com {/* CTA Button */} {/* Modal for Subscription Info */} { // submit(null, { method: "post", form: document.getElementById("billing-form") }); // }, // }} primaryAction={{ content: "Proceed to Billing", onAction: () => { submit(null, { method: "post", form: document.getElementById("billing-form") }); }, }} secondaryActions={[{ content: "Close", onAction: closeModal }]} >
); }