login image

How to change the login page image and the header image? Im using strapi auth
17 Replies
kapa.ai
kapa.ai8mo ago
Hi @Sly. I'm kapa.ai, your friendly support bot. I will try to answer your question by searching through the knowledge base. :wave: ---------------------- To change the login page image and the header image in your Refine application using Strapi for authentication, you can follow these steps. Below are examples based on different UI frameworks supported by Refine. Using Ant Design If you are using Ant Design, you can customize the login page by modifying the src/pages/login/index.tsx file. Here is an example:
import React from "react";
import { useLogin, useNavigation } from "@refinedev/core";
import { Row, Col, AntdLayout, Card, Typography, Form, Input, Button } from "@refinedev/antd";
import "./styles.css";

const { Text, Title } = Typography;

export interface ILoginForm {
email: string;
password: string;
}

export const Login: React.FC = () => {
const [form] = Form.useForm<ILoginForm>();
const { mutate: login } = useLogin<ILoginForm>();
const { push } = useNavigation();

const CardTitle = (
<Title level={3} className="title">
Sign in your account
</Title>
);
return (
<AntdLayout className="layout">
<Row justify="center" align="middle" style={{ height: "100vh" }}>
<Col xs={22}>
<div className="container">
<div className="imageContainer">
<img src="./path-to-your-new-image.svg" alt="New Logo" />
</div>
<Card title={CardTitle} headStyle={{ borderBottom: 0 }}>
<Form<ILoginForm>
layout="vertical"
form={form}
onFinish={(values) => {
login(values);
}}
initialValues={{
email: "info@refine.dev",
password: "refine-supabase",
}}
>
<Form.Item name="email" label="Email" rules={[{ required: true, type: "email" }]}>
<Input size="large" placeholder="Email" />
</Form.Item>
<Form.Item name="password" label="Password" rules={[{ required: true }]}>
<Input size="large" placeholder="Password" />
</Form.Item>
<Form.Item>
<Button type="primary" htmlType="submit" size="large" block>
Sign in
</Button>
</Form.Item>
</Form>
</Card>
</div>
</Col>
</Row>
</AntdLayout>
);
};
import React from "react";
import { useLogin, useNavigation } from "@refinedev/core";
import { Row, Col, AntdLayout, Card, Typography, Form, Input, Button } from "@refinedev/antd";
import "./styles.css";

const { Text, Title } = Typography;

export interface ILoginForm {
email: string;
password: string;
}

export const Login: React.FC = () => {
const [form] = Form.useForm<ILoginForm>();
const { mutate: login } = useLogin<ILoginForm>();
const { push } = useNavigation();

const CardTitle = (
<Title level={3} className="title">
Sign in your account
</Title>
);
return (
<AntdLayout className="layout">
<Row justify="center" align="middle" style={{ height: "100vh" }}>
<Col xs={22}>
<div className="container">
<div className="imageContainer">
<img src="./path-to-your-new-image.svg" alt="New Logo" />
</div>
<Card title={CardTitle} headStyle={{ borderBottom: 0 }}>
<Form<ILoginForm>
layout="vertical"
form={form}
onFinish={(values) => {
login(values);
}}
initialValues={{
email: "info@refine.dev",
password: "refine-supabase",
}}
>
<Form.Item name="email" label="Email" rules={[{ required: true, type: "email" }]}>
<Input size="large" placeholder="Email" />
</Form.Item>
<Form.Item name="password" label="Password" rules={[{ required: true }]}>
<Input size="large" placeholder="Password" />
</Form.Item>
<Form.Item>
<Button type="primary" htmlType="submit" size="large" block>
Sign in
</Button>
</Form.Item>
</Form>
</Card>
</div>
</Col>
</Row>
</AntdLayout>
);
};
In the above code, replace ./path-to-your-new-image.svg with the path to your new image. Using Chakra UI If you are using Chakra UI, you can customize the login page by modifying the AuthPage component. Here is an example:
import { AuthPage, ThemedTitle } from "@refinedev/chakra-ui";
const MyLoginPage = () => {
return (
<AuthPage
type="login"
title={
<ThemedTitle
title="My Title"
icon={<img src="<https://path-to-your-new-image.png"> />}
/>
}
/>
);
};
import { AuthPage, ThemedTitle } from "@refinedev/chakra-ui";
const MyLoginPage = () => {
return (
<AuthPage
type="login"
title={
<ThemedTitle
title="My Title"
icon={<img src="<https://path-to-your-new-image.png"> />}
/>
}
/>
);
};
Using Mantine If you are using Mantine, you can customize the login page similarly: ``` ---------------------- Note: you can ask me a follow up question by @ mentioning me again :speech_balloon: ----------------------
kapa.ai
kapa.ai8mo ago
<@1172098337760096258> kapa.ai is still learning and improving, please let us know how it did by reacting below
fascinating-indigo
fascinating-indigoOP8mo ago
@kapa.ai how to change the text "Sign in to your account"
kapa.ai
kapa.ai8mo ago
Let me check the knowledge base for you. One moment! :books: ---------------------- To change the text "Sign in to your account" on the login page, you can use the internationalization (i18n) feature provided by Refine. Here’s how you can do it: Step 1: Create or Update Translation Files First, you need to create or update your translation files. For example, if you are using English, you would update the locales/en/common.json file. Here is an example of the translation file:
{
"pages": {
"login": {
"title": "Sign in to your account",
"signin": "Sign in",
"signup": "Sign up",
"divider": "or",
"fields": {
"email": "Email",
"password": "Password"
},
"errors": {
"validEmail": "Invalid email address",
"requiredEmail": "Email is required",
"requiredPassword": "Password is required"
},
"buttons": {
"submit": "Login",
"forgotPassword": "Forgot password?",
"noAccount": "Don’t have an account?",
"rememberMe": "Remember me"
}
}
}
}
{
"pages": {
"login": {
"title": "Sign in to your account",
"signin": "Sign in",
"signup": "Sign up",
"divider": "or",
"fields": {
"email": "Email",
"password": "Password"
},
"errors": {
"validEmail": "Invalid email address",
"requiredEmail": "Email is required",
"requiredPassword": "Password is required"
},
"buttons": {
"submit": "Login",
"forgotPassword": "Forgot password?",
"noAccount": "Don’t have an account?",
"rememberMe": "Remember me"
}
}
}
}
To change the text "Sign in to your account", update the title field under the login section:
{
"pages": {
"login": {
"title": "Log in to your dashboard",
"signin": "Sign in",
"signup": "Sign up",
"divider": "or",
"fields": {
"email": "Email",
"password": "Password"
},
"errors": {
"validEmail": "Invalid email address",
"requiredEmail": "Email is required",
"requiredPassword": "Password is required"
},
"buttons": {
"submit": "Login",
"forgotPassword": "Forgot password?",
"noAccount": "Don’t have an account?",
"rememberMe": "Remember me"
}
}
}
}
{
"pages": {
"login": {
"title": "Log in to your dashboard",
"signin": "Sign in",
"signup": "Sign up",
"divider": "or",
"fields": {
"email": "Email",
"password": "Password"
},
"errors": {
"validEmail": "Invalid email address",
"requiredEmail": "Email is required",
"requiredPassword": "Password is required"
},
"buttons": {
"submit": "Login",
"forgotPassword": "Forgot password?",
"noAccount": "Don’t have an account?",
"rememberMe": "Remember me"
}
}
}
}
Step 2: Use the Translation in Your Component Ensure that your component is using the translation keys. For example, if you are using Ant Design, your login component might look like this: ```tsx import React from "react";
import { useLogin, useNavigation } from "@refinedev/core";
import { Row, Col, AntdLayout, Card, Typography, Form, Input, Button } from "@refinedev/antd";
import { useTranslate } from "@refinedev/core";
import "./styles.css";
const { Text, Title } = Typography;
export interface ILoginForm {
email: string;
password: string;
}
export const Login: React.FC = () => {
const [form] = Form.useForm<ILoginForm>();
const { mutate: login } = useLogin<ILoginForm>();
const { push } = useNavigation();
const translate = useTranslate();
const CardTitle = (
<Title level={3} className="title">
{translate("pages.login.title", "Sign in to your account")}
</Title>
);
return (
<AntdLayout className="layout">
<Row justify="center" align="middle" style={{ height: "100vh" }}>
<Col xs={22}>
<div className="container">
<div className="imageContainer">
<img src="./path-to-your-new-image.svg" alt="New Logo" />
</div> ---------------------- Note: you can ask me a follow up question by @ mentioning me again :speech_balloon: ----------------------
kapa.ai
kapa.ai8mo ago
<@1172098337760096258> kapa.ai is still learning and improving, please let us know how it did by reacting below
fascinating-indigo
fascinating-indigoOP8mo ago
@kapa.ai I installed from the site, "npm create refine-app@latest", and the package didnt come with src/pages/login/index.tsx
kapa.ai
kapa.ai8mo ago
Let me check the knowledge base for you. One moment! :books: ---------------------- If the package created using npm create refine-app@latest did not come with src/pages/login/index.tsx, you can create the login page manually. Below is an example of how you can create a custom login page using Ant Design and integrate it with Strapi authentication. Step 1: Create the Login Page Component Create a new file src/pages/login/index.tsx and add the following code:
import React from "react";
import { useLogin, useNavigation } from "@refinedev/core";
import { Row, Col, AntdLayout, Card, Typography, Form, Input, Button } from "@refinedev/antd";
import "./styles.css";

const { Text, Title } = Typography;

export interface ILoginForm {
email: string;
password: string;
}

export const Login: React.FC = () => {
const [form] = Form.useForm<ILoginForm>();
const { mutate: login } = useLogin<ILoginForm>();
const { push } = useNavigation();

const CardTitle = (
<Title level={3} className="title">
Sign in to your account
</Title>
);
return (
<AntdLayout className="layout">
<Row justify="center" align="middle" style={{ height: "100vh" }}>
<Col xs={22}>
<div className="container">
<div className="imageContainer">
<img src="./path-to-your-new-image.svg" alt="New Logo" />
</div>
<Card title={CardTitle} headStyle={{ borderBottom: 0 }}>
<Form<ILoginForm>
layout="vertical"
form={form}
onFinish={(values) => {
login(values);
}}
initialValues={{
email: "info@refine.dev",
password: "refine-supabase",
}}
>
<Form.Item
name="email"
label="Email"
rules={[{ required: true, type: "email" }]}
>
<Input size="large" placeholder="Email" />
</Form.Item>
<Form.Item
name="password"
label="Password"
rules={[{ required: true }]}
>
<Input size="large" placeholder="Password" />
</Form.Item>
<Form.Item>
<Button type="primary" htmlType="submit" size="large" block>
Sign in
</Button>
</Form.Item>
</Form>
</Card>
</div>
</Col>
</Row>
</AntdLayout>
);
};
import React from "react";
import { useLogin, useNavigation } from "@refinedev/core";
import { Row, Col, AntdLayout, Card, Typography, Form, Input, Button } from "@refinedev/antd";
import "./styles.css";

const { Text, Title } = Typography;

export interface ILoginForm {
email: string;
password: string;
}

export const Login: React.FC = () => {
const [form] = Form.useForm<ILoginForm>();
const { mutate: login } = useLogin<ILoginForm>();
const { push } = useNavigation();

const CardTitle = (
<Title level={3} className="title">
Sign in to your account
</Title>
);
return (
<AntdLayout className="layout">
<Row justify="center" align="middle" style={{ height: "100vh" }}>
<Col xs={22}>
<div className="container">
<div className="imageContainer">
<img src="./path-to-your-new-image.svg" alt="New Logo" />
</div>
<Card title={CardTitle} headStyle={{ borderBottom: 0 }}>
<Form<ILoginForm>
layout="vertical"
form={form}
onFinish={(values) => {
login(values);
}}
initialValues={{
email: "info@refine.dev",
password: "refine-supabase",
}}
>
<Form.Item
name="email"
label="Email"
rules={[{ required: true, type: "email" }]}
>
<Input size="large" placeholder="Email" />
</Form.Item>
<Form.Item
name="password"
label="Password"
rules={[{ required: true }]}
>
<Input size="large" placeholder="Password" />
</Form.Item>
<Form.Item>
<Button type="primary" htmlType="submit" size="large" block>
Sign in
</Button>
</Form.Item>
</Form>
</Card>
</div>
</Col>
</Row>
</AntdLayout>
);
};
Step 2: Update the Routes Ensure that your application routes to the login page. You can do this by updating your routing configuration. For example, if you are using React Router, you can add a route for the login page in your src/App.tsx or wherever your routes are defined: ```tsx import { BrowserRouter as Router, Route, Routes } from "react-router-dom"; import { Login } from "./pages/login"; const App: React.FC = () => { return ( <Router> <Routes> <Route path="/login" element={<Login />} /> {/* other routes */} </Routes> </Router> ); }; export default App; ---------------------- Note: you can ask me a follow up question by @ mentioning me again :speech_balloon: ----------------------
kapa.ai
kapa.ai8mo ago
<@1172098337760096258> kapa.ai is still learning and improving, please let us know how it did by reacting below
fascinating-indigo
fascinating-indigoOP8mo ago
@kapa.ai import { AntdLayout } from "@refinedev/antd"; has error exporting. I changed to import { Row, Col, AntdLayout, Card, Typography, Form, Input, Button } from "@antd"; but the AntdLayout has export error
kapa.ai
kapa.ai8mo ago
Let me check the knowledge base for you. One moment! :books: ---------------------- It looks like there might be some confusion regarding the imports. The AntdLayout component should be imported directly from the antd package, not from @refinedev/antd. Here’s how you can correctly import and use the Layout component from Ant Design: Step 1: Correct the Imports Ensure you are importing the Layout component from the antd package. Here’s the corrected import statement:
import React from "react";
import { useLogin, useNavigation } from "@refinedev/core";
import { Row, Col, Layout, Card, Typography, Form, Input, Button } from "antd";
import "./styles.css";

const { Text, Title } = Typography;
const { Content } = Layout;

export interface ILoginForm {
email: string;
password: string;
}

export const Login: React.FC = () => {
const [form] = Form.useForm<ILoginForm>();
const { mutate: login } = useLogin<ILoginForm>();
const { push } = useNavigation();

const CardTitle = (
<Title level={3} className="title">
Sign in to your account
</Title>
);
return (
<Layout className="layout">
<Content>
<Row justify="center" align="middle" style={{ height: "100vh" }}>
<Col xs={22}>
<div className="container">
<div className="imageContainer">
<img src="./path-to-your-new-image.svg" alt="New Logo" />
</div>
<Card title={CardTitle} headStyle={{ borderBottom: 0 }}>
<Form<ILoginForm>
layout="vertical"
form={form}
onFinish={(values) => {
login(values);
}}
initialValues={{
email: "info@refine.dev",
password: "refine-supabase",
}}
>
<Form.Item
name="email"
label="Email"
rules={[{ required: true, type: "email" }]}
>
<Input size="large" placeholder="Email" />
</Form.Item>
<Form.Item
name="password"
label="Password"
rules={[{ required: true }]}
>
<Input size="large" placeholder="Password" />
</Form.Item>
<Form.Item>
<Button type="primary" htmlType="submit" size="large" block>
Sign in
</Button>
</Form.Item>
</Form>
</Card>
</div>
</Col>
</Row>
</Content>
</Layout>
);
};
import React from "react";
import { useLogin, useNavigation } from "@refinedev/core";
import { Row, Col, Layout, Card, Typography, Form, Input, Button } from "antd";
import "./styles.css";

const { Text, Title } = Typography;
const { Content } = Layout;

export interface ILoginForm {
email: string;
password: string;
}

export const Login: React.FC = () => {
const [form] = Form.useForm<ILoginForm>();
const { mutate: login } = useLogin<ILoginForm>();
const { push } = useNavigation();

const CardTitle = (
<Title level={3} className="title">
Sign in to your account
</Title>
);
return (
<Layout className="layout">
<Content>
<Row justify="center" align="middle" style={{ height: "100vh" }}>
<Col xs={22}>
<div className="container">
<div className="imageContainer">
<img src="./path-to-your-new-image.svg" alt="New Logo" />
</div>
<Card title={CardTitle} headStyle={{ borderBottom: 0 }}>
<Form<ILoginForm>
layout="vertical"
form={form}
onFinish={(values) => {
login(values);
}}
initialValues={{
email: "info@refine.dev",
password: "refine-supabase",
}}
>
<Form.Item
name="email"
label="Email"
rules={[{ required: true, type: "email" }]}
>
<Input size="large" placeholder="Email" />
</Form.Item>
<Form.Item
name="password"
label="Password"
rules={[{ required: true }]}
>
<Input size="large" placeholder="Password" />
</Form.Item>
<Form.Item>
<Button type="primary" htmlType="submit" size="large" block>
Sign in
</Button>
</Form.Item>
</Form>
</Card>
</div>
</Col>
</Row>
</Content>
</Layout>
);
};
Step 2: Ensure Ant Design is Installed Make sure you have Ant Design installed in your project. You can install it using npm or yarn:
npm install antd
npm install antd
or
yarn add antd
yarn add antd
Step 3: Update Your Routes Ensure that your application routes to the login page. You can do this by updating your routing configuration. For example, if you are using React Router, you can add a route for the login page in your src/App.tsx or wherever your routes are defined: ```tsx import { BrowserRouter as Router, Route, Routes } from " ---------------------- Note: you can ask me a follow up question by @ mentioning me again :speech_balloon: ----------------------
kapa.ai
kapa.ai8mo ago
<@1172098337760096258> kapa.ai is still learning and improving, please let us know how it did by reacting below
fascinating-indigo
fascinating-indigoOP8mo ago
@kapa.ai How to custumize the card antdesign
kapa.ai
kapa.ai8mo ago
Let me check the knowledge base for you. One moment! :books: ---------------------- To customize the Card component in Ant Design, you can use the style and className properties to apply custom styles. Below is an example of how you can customize the Card component in a Refine application. Step 1: Import the Necessary Components Ensure you have the necessary components imported from Ant Design:
import React from "react";
import { Card, Typography } from "antd";
import "./styles.css"; // Custom CSS file for additional styles

const { Title } = Typography;
import React from "react";
import { Card, Typography } from "antd";
import "./styles.css"; // Custom CSS file for additional styles

const { Title } = Typography;
Step 2: Customize the Card Component You can customize the Card component by using the style property or by applying a custom CSS class using the className property. Here’s an example:
const CustomCard: React.FC = () => {
return (
<Card
title={<Title level={3}>Custom Card Title</Title>}
style={{
backgroundColor: "cornflowerblue",
padding: "16px",
borderRadius: "8px",
boxShadow: "0 4px 8px rgba(0, 0, 0, 0.1)"
}}
className="custom-card"
>
<p>Custom content goes here</p>
</Card>
);
};

export default CustomCard;
const CustomCard: React.FC = () => {
return (
<Card
title={<Title level={3}>Custom Card Title</Title>}
style={{
backgroundColor: "cornflowerblue",
padding: "16px",
borderRadius: "8px",
boxShadow: "0 4px 8px rgba(0, 0, 0, 0.1)"
}}
className="custom-card"
>
<p>Custom content goes here</p>
</Card>
);
};

export default CustomCard;
Step 3: Add Custom CSS (Optional) If you prefer to use a CSS file for styling, you can add your custom styles in a CSS file (e.g., styles.css):
.custom-card {
background-color: cornflowerblue;
padding: 16px;
border-radius: 8px;
box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1);
}
.custom-card {
background-color: cornflowerblue;
padding: 16px;
border-radius: 8px;
box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1);
}
Step 4: Use the Custom Card Component You can now use the CustomCard component in your application:
import React from "react";
import CustomCard from "./CustomCard";

const App: React.FC = () => {
return (
<div>
<CustomCard />
</div>
);
};

export default App;
import React from "react";
import CustomCard from "./CustomCard";

const App: React.FC = () => {
return (
<div>
<CustomCard />
</div>
);
};

export default App;
Example in a Refine Application If you want to integrate this into a Refine application, you can use the CustomCard component within your pages or components. Here’s an example of how you might use it in a login page: ```tsx import React from "react";
import { useLogin, useNavigation } from "@refinedev/core";
import { Row, Col, Layout, Typography, Form, Input, Button } from "antd";
import CustomCard from "./CustomCard"; // Import the custom card component import "./styles.css";
const { Title } = Typography;
const { Content } = Layout; export interface ILoginForm {
email: string;
password: string;
}
export const Login: React.FC = () => {
const [form] = Form.useForm<ILoginForm>();
const { mutate: login } = useLogin<ILoginForm>();
const { push } = useNavigation();
return (
<Layout className="layout">
<Content>
<Row justify="center" align="middle" style={{ height: "100vh" }}>
<Col xs={22}>
<div className="container">
<div className="imageContainer">
<img src="./path-to-your-new-image.svg" alt="New Logo" />
</div>
<CustomCard> <Form<ILoginForm ---------------------- Note: you can ask me a follow up question by @ mentioning me again :speech_balloon: ----------------------
kapa.ai
kapa.ai8mo ago
<@1172098337760096258> kapa.ai is still learning and improving, please let us know how it did by reacting below
fascinating-indigo
fascinating-indigoOP8mo ago
@kapa.ai how to hide a button if a resource has null ID's
kapa.ai
kapa.ai8mo ago
Let me check the knowledge base for you. One moment! :books: ---------------------- To hide a button if a resource has null IDs, you can use conditional rendering in React. Below is an example of how you can achieve this using the ShowButton component from Ant Design in a Refine application. Step 1: Check for Null IDs You can conditionally render the button based on whether the resource ID is null or not. Here’s an example:
import React from "react";
import { ShowButton } from "@refinedev/antd"; // or @refinedev/mui, @refinedev/chakra-ui, @refinedev/mantine

const MyComponent: React.FC<{ resource: any }> = ({ resource }) => {
return (
<div>
{resource.id !== null ? (
<ShowButton resource="posts" recordItemId={resource.id} />
) : null}
</div>
);
};

export default MyComponent;
import React from "react";
import { ShowButton } from "@refinedev/antd"; // or @refinedev/mui, @refinedev/chakra-ui, @refinedev/mantine

const MyComponent: React.FC<{ resource: any }> = ({ resource }) => {
return (
<div>
{resource.id !== null ? (
<ShowButton resource="posts" recordItemId={resource.id} />
) : null}
</div>
);
};

export default MyComponent;
Step 2: Integrate with Your Data Ensure that you pass the resource data to the component. Here’s an example of how you might fetch the resource and pass it to the MyComponent:
import React from "react";
import { useList } from "@refinedev/core";
import MyComponent from "./MyComponent";

const MyPage: React.FC = () => {
const { data, isLoading } = useList({
resource: "posts",
});

if (isLoading) {
return <div>Loading...</div>;
}

return (
<div>
{data?.data.map((resource) => (
<MyComponent key={resource.id} resource={resource} />
))}
</div>
);
};

export default MyPage;
import React from "react";
import { useList } from "@refinedev/core";
import MyComponent from "./MyComponent";

const MyPage: React.FC = () => {
const { data, isLoading } = useList({
resource: "posts",
});

if (isLoading) {
return <div>Loading...</div>;
}

return (
<div>
{data?.data.map((resource) => (
<MyComponent key={resource.id} resource={resource} />
))}
</div>
);
};

export default MyPage;
Step 3: Use Access Control (Optional) If you are using access control and want to hide the button based on permissions, you can use the accessControl prop. Here’s an example:
import React from "react";
import { ShowButton } from "@refinedev/antd"; // or @refinedev/mui, @refinedev/chakra-ui, @refinedev/mantine
const MyComponent: React.FC<{ resource: any }> = ({ resource }) => {
return (
<div>
{resource.id !== null ? (
<ShowButton
resource="posts"
recordItemId={resource.id}
accessControl={{ enabled: true, hideIfUnauthorized: true }}
/>
) : null}
</div>
);
};

export default MyComponent;
import React from "react";
import { ShowButton } from "@refinedev/antd"; // or @refinedev/mui, @refinedev/chakra-ui, @refinedev/mantine
const MyComponent: React.FC<{ resource: any }> = ({ resource }) => {
return (
<div>
{resource.id !== null ? (
<ShowButton
resource="posts"
recordItemId={resource.id}
accessControl={{ enabled: true, hideIfUnauthorized: true }}
/>
) : null}
</div>
);
};

export default MyComponent;
References - Ant Design ShowButton Access Control (https://refine.dev/docs/ui-integrations/ant-design/components/buttons/show-button/#accesscontrol) - Conditional Rendering in React (https://refine.dev/blog/react-conditional-rendering/#use-cases-of-conditional-rendering) By following these steps, you can conditionally hide a button if a resource has null IDs in your Refine application. ---------------------- Note: you can ask me a follow up question by @ mentioning me again :speech_balloon: ----------------------
kapa.ai
kapa.ai8mo ago
<@1172098337760096258> kapa.ai is still learning and improving, please let us know how it did by reacting below

Did you find this page helpful?