We're moving the community! Starting July 7, the current community will be read-only for approx. 2 weeks. You can browse content, but posting will be temporarily unavailable. Learn more

Load external javascript with saved settings using Shopify app.

Load external javascript with saved settings using Shopify app.

ajitpickcel
Shopify Partner
1 0 0

I want to create an app that loads external script. I am using Shopify CLI to create app and I managed to take input form user and save the input as setting.

 

 

 

 

 

export const loader = async ({ request }) => {
  // Fetch current settings from your database
  const settings = await fetchSettingsFromDB();
  return json(settings);
};

export const action = async ({ request }) => {
  const formData = await request.formData();
  const enableChatbot = formData.get("enableChatbot") === "on";
  const chatbotId = formData.get("chatbotId");

  // Save settings to your database
  await saveSettingsToDB({ enableChatbot, chatbotId });

  return { success: true };
};
export default function App() {
  const settings = useLoaderData();
  const actionData = useActionData();

  const labelStyle = {
    display: "block",
    width: "100px",
    height: "40px",
    lineHeight: "40px",
  };

  const flex = {
    display: "flex",
    alignItems: "center",
    gap: "10px",
  };

  return (
    <AppProvider>
      <Page>
        <Layout>
          <Layout.Section>
            <div style={{ fontFamily: "sans-serif" }}>
              <Form method="post">
                <h2 style={{ fontWeight: "bold", fontSize: "1.2rem" }}>
                  Thinkstack Settings
                </h2>
                <hr />
                <label style={flex}>
                  <span style={labelStyle}>Enable Chatbot</span>:
                  <input
                    type="checkbox"
                    name="enableChatbot"
                    defaultChecked={settings.enableChatbot}
                  />
                </label>
                <label style={flex}>
                  <span style={labelStyle}>Chatbot ID</span>:
                  <input
                    type="text"
                    name="chatbotId"
                    style={{ height: "30px" }}
                    defaultValue={settings.chatbotId}
                  />
                </label>
                <button type="submit" style={{ height: "40px", width: "80px" }}>
                  Save
                </button>
              </Form>
              {actionData && actionData.error ? (
                <p style={{ color: "red" }}>{actionData.error}</p>
              ) : (
                <p style={{ color: "green" }}>Saved!</p>
              )}
            </div>
          </Layout.Section>
        </Layout>
      </Page>
    </AppProvider>
  );
}

 

 

 

 

app/routes/_index.jsx

 

After this I want to load the script on the website the app is installed for. Here is what I am true.

 

 

 

 

 

export const action = async ({ request }) => {
  const { session, chatbotId } = await request.json();
  const client = new Shopify.Clients.Rest(session.shop, session.accessToken);

  try {
    const response = await client.post({
      path: "script_tags",
      data: {
        script_tag: {
          event: "onload",
          src: `https://app.thinkstack.ai/bot/thinkstackai-loader.min.js?id=${chatbotId}`,
        },
      },
      type: "application/json",
    });
    return json(response);
  } catch (error) {
    return json({ error: error.message }, { status: 500 });
  }
};

 

 

 

 

app/api/create-script.js

 

 

 

 

export const loader = async ({ request }) => {
  const url = new URL(request.url);
  const query = Object.fromEntries(url.searchParams.entries());
  const session = await Shopify.Auth.validateAuthCallback(request, query);

  const settings = await fetchSettingsFromDB();
  if (settings.enableChatbot) {
    const response = await fetch(`${url.origin}/api/create-script-tag`, {
      method: "POST",
      headers: {
        "Content-Type": "application/json",
      },
      body: JSON.stringify({ session, chatbotId: settings.chatbotId }),
    });

    if (!response.ok) {
      throw new Error("Failed to create script tag");
    }
  }

  return redirect(`https://${session.shop}/admin/apps`);
};

 

 

 

 

app/auth/callback.js

 

NOTE: I am new to Shopify and I am not sure what I am doing wrong.

Replies 0 (0)