summaryrefslogtreecommitdiff
path: root/src-migrate/libs
diff options
context:
space:
mode:
Diffstat (limited to 'src-migrate/libs')
-rw-r--r--src-migrate/libs/auth.ts26
-rw-r--r--src-migrate/libs/clsxm.ts6
-rw-r--r--src-migrate/libs/formatCurrency.ts5
-rw-r--r--src-migrate/libs/formatNumber.ts8
-rw-r--r--src-migrate/libs/odooApi.ts81
-rw-r--r--src-migrate/libs/slug.ts34
-rw-r--r--src-migrate/libs/toTitleCase.ts5
-rw-r--r--src-migrate/libs/whatsappUrl.ts48
8 files changed, 213 insertions, 0 deletions
diff --git a/src-migrate/libs/auth.ts b/src-migrate/libs/auth.ts
new file mode 100644
index 00000000..86ce26e1
--- /dev/null
+++ b/src-migrate/libs/auth.ts
@@ -0,0 +1,26 @@
+import { deleteCookie, getCookie, setCookie } from 'cookies-next';
+import { AuthProps } from '~/types/auth';
+
+const COOKIE_KEY = 'auth';
+
+export const getAuth = (): AuthProps | boolean => {
+ const auth = getCookie(COOKIE_KEY);
+
+ if (typeof auth === 'string') {
+ return JSON.parse(auth);
+ }
+
+ return false;
+};
+
+export const setAuth = (user: AuthProps): boolean => {
+ setCookie(COOKIE_KEY, JSON.stringify(user));
+
+ return true;
+};
+
+export const deleteAuth = (): boolean => {
+ deleteCookie(COOKIE_KEY);
+
+ return true;
+};
diff --git a/src-migrate/libs/clsxm.ts b/src-migrate/libs/clsxm.ts
new file mode 100644
index 00000000..0fc10317
--- /dev/null
+++ b/src-migrate/libs/clsxm.ts
@@ -0,0 +1,6 @@
+import clsx, { ClassValue } from 'clsx';
+import { twMerge } from 'tw-merge';
+
+export default function clsxm(...classes: ClassValue[]) {
+ return twMerge(clsx(...classes));
+}
diff --git a/src-migrate/libs/formatCurrency.ts b/src-migrate/libs/formatCurrency.ts
new file mode 100644
index 00000000..d683acf3
--- /dev/null
+++ b/src-migrate/libs/formatCurrency.ts
@@ -0,0 +1,5 @@
+const formatCurrency = (value: number) => {
+ return Math.round(value).toLocaleString('id-ID');
+};
+
+export default formatCurrency;
diff --git a/src-migrate/libs/formatNumber.ts b/src-migrate/libs/formatNumber.ts
new file mode 100644
index 00000000..da243418
--- /dev/null
+++ b/src-migrate/libs/formatNumber.ts
@@ -0,0 +1,8 @@
+export const formatToShortText = (number: number) => {
+ if (number > 1000) {
+ return `${Math.floor(number / 1000)}rb+`;
+ } else if (number > 100) {
+ return `${Math.floor(number / 100) * 100}+`;
+ }
+ return number.toString();
+};
diff --git a/src-migrate/libs/odooApi.ts b/src-migrate/libs/odooApi.ts
new file mode 100644
index 00000000..9482542b
--- /dev/null
+++ b/src-migrate/libs/odooApi.ts
@@ -0,0 +1,81 @@
+import axios, { AxiosRequestConfig, Method } from 'axios';
+import { getCookie, setCookie } from 'cookies-next';
+import { getAuth } from './auth';
+import { AuthApiProps } from '~/types/auth';
+
+const ODOO_HOST = process.env.NEXT_PUBLIC_ODOO_API_HOST as string;
+
+const renewToken = async () => {
+ let token = await axios.get(`${ODOO_HOST}/api/token`);
+ setCookie('token', token.data.result);
+
+ return token.data.result;
+};
+
+const getToken = async () => {
+ let token = getCookie('token');
+ if (token == undefined) token = await renewToken();
+
+ return token;
+};
+
+const maxConnectionAttempt = 15;
+let connectionAttempt = 0;
+
+const odooApi = async (
+ method: Method,
+ url: string,
+ data = {},
+ headers = {}
+): Promise<any> => {
+ connectionAttempt++;
+
+ try {
+ let token = await getToken();
+ const auth = getAuth();
+
+ let axiosParameter: AxiosRequestConfig = {
+ method,
+ url: process.env.NEXT_PUBLIC_ODOO_API_HOST + url,
+ headers: { Authorization: token, ...headers },
+ };
+
+ if (typeof auth === 'object' && 'token' in auth) {
+ axiosParameter.headers = {
+ ...axiosParameter.headers,
+ Token: auth.token,
+ };
+ }
+
+ if (method.toUpperCase() === 'POST') {
+ axiosParameter.headers = {
+ ...axiosParameter.headers,
+ 'Content-Type': 'application/x-www-form-urlencoded',
+ };
+ }
+
+ if (Object.keys(data).length > 0) {
+ axiosParameter.data = new URLSearchParams(
+ Object.entries(data)
+ ).toString();
+ }
+
+ let res = await axios(axiosParameter);
+ const authResponse: AuthApiProps = res.data;
+
+ if (
+ authResponse.status.code == 401 &&
+ connectionAttempt < maxConnectionAttempt
+ ) {
+ await renewToken();
+ return odooApi(method, url, data, headers);
+ }
+
+ return authResponse.result || null;
+ } catch (error) {
+ console.log(error);
+ return null;
+ }
+};
+
+export default odooApi;
diff --git a/src-migrate/libs/slug.ts b/src-migrate/libs/slug.ts
new file mode 100644
index 00000000..5ab3b3dd
--- /dev/null
+++ b/src-migrate/libs/slug.ts
@@ -0,0 +1,34 @@
+import { toTitleCase } from './toTitleCase';
+
+export const createSlug = (
+ prefix: string,
+ name: string,
+ id: string,
+ withHost = false
+) => {
+ const cleanName = name
+ .trim()
+ .replace(new RegExp(/[^A-Za-z0-9]/, 'g'), '-')
+ .toLowerCase();
+
+ let slug = `${cleanName}-${id}`;
+ const splitSlug = slug.split('-');
+ const filterSlug = splitSlug.filter((x) => x !== '');
+
+ slug = `${prefix}${filterSlug.join('-')}`;
+
+ if (withHost) slug = process.env.NEXT_PUBLIC_SELF_HOST + slug;
+
+ return slug;
+};
+
+export const getIdFromSlug = (slug: string) => {
+ let id = slug.split('-');
+ return id[id.length - 1];
+};
+
+export const getNameFromSlug = (slug: string) => {
+ let name = slug.split('-');
+ name.pop();
+ return toTitleCase(name.join(' '));
+};
diff --git a/src-migrate/libs/toTitleCase.ts b/src-migrate/libs/toTitleCase.ts
new file mode 100644
index 00000000..dad66813
--- /dev/null
+++ b/src-migrate/libs/toTitleCase.ts
@@ -0,0 +1,5 @@
+export const toTitleCase = (val: string) => {
+ return val.replace(/\w\S*/g, function (txt) {
+ return txt.charAt(0).toUpperCase() + txt.substr(1).toLowerCase();
+ });
+};
diff --git a/src-migrate/libs/whatsappUrl.ts b/src-migrate/libs/whatsappUrl.ts
new file mode 100644
index 00000000..a3fcf8ad
--- /dev/null
+++ b/src-migrate/libs/whatsappUrl.ts
@@ -0,0 +1,48 @@
+import { getAuth } from './auth';
+
+const TEMPLATES = {
+ default: 'Bisa tolong bantu kebutuhan saya?',
+ product:
+ 'Saya mencari barang berikut:\n\n{{url}}\n\n```Brand: {{manufacture}}\nName: {{productName}}```',
+};
+
+interface WhatsappUrlProps {
+ template: keyof typeof TEMPLATES;
+ payload: any;
+ greeting?: boolean;
+ needLogin?: boolean;
+ fallbackUrl?: string;
+}
+
+export const whatsappUrl = ({
+ template,
+ payload,
+ greeting = true,
+ needLogin = true,
+ fallbackUrl,
+}: WhatsappUrlProps) => {
+ const auth = getAuth();
+
+ let greetingText = '';
+
+ if (needLogin && !auth) {
+ return fallbackUrl
+ ? `/login?next=${encodeURIComponent(fallbackUrl)}`
+ : '/login';
+ }
+
+ let result = TEMPLATES[template].replace(
+ /{{(.*?)}}/g,
+ (match, key) => payload[key] || ''
+ );
+
+ if (greeting && typeof auth === 'object') {
+ greetingText = `Halo Indoteknik.com, Saya ${auth.name} `;
+ if (auth.parentName) greetingText += `dari ${auth.parentName}`;
+ greetingText += '.\n\n';
+
+ result = greetingText + result;
+ }
+
+ return `https://wa.me/6281717181922?text=${encodeURIComponent(result)}`;
+};