Update and refactor code

This commit is contained in:
2023-09-28 15:19:00 +07:00
parent ea882d4003
commit f54fdc9265
8 changed files with 103 additions and 93 deletions
+12 -2
View File
@@ -1,4 +1,14 @@
export interface DataObject {
export interface IDataObject<T> {
id: string;
data: object;
data: T;
}
export class DataObject<T> {
public id: string;
public data: T;
constructor(dataObject: IDataObject<T>) {
this.id = dataObject?.id ?? null;
this.data = dataObject.data;
}
}
@@ -0,0 +1,33 @@
import { TIME_OUT_ERROR } from '../constants/message';
import { TIME_OUT_SEC } from '../constants/config';
import FirebaseService from '../services/firebaseService';
/**
* A waiting function with s second
* @param {number} s The time will be waiting
* @returns {Promise} A Promise will be only reject after s second
*/
export const timeout = (s: number): Promise<string> => {
return new Promise((_, reject) => {
setTimeout(() => {
FirebaseService.disconnect();
reject(TIME_OUT_ERROR);
}, s * 1000);
});
};
/**
* A function waiting the action need to be perform and throw error after s second.
* @param {Function} action The action need to be perform.
* @returns { Object || Error } Return the any object from Firebase or Error
*/
export const timeOutConnect = async <T>(
action: Promise<T>,
): Promise<string | T> => {
const result: T | string = await Promise.race([
action,
timeout(TIME_OUT_SEC),
]);
return result;
};
@@ -0,0 +1,19 @@
import { DataObject } from '../global/types';
export const createIdUser = (): number => {
return new Date().getTime();
};
export const convertDataObjectToModel = <T>(dataObj: DataObject<T>): T => {
const { id } = dataObj;
return { id, ...dataObj.data } as T;
};
export const convertModelToDataObject = <T extends DataObject<T>>(
model: T,
): T => {
const { id, ...data } = model;
return { id, data } as T;
};
@@ -1,85 +0,0 @@
import * as MESSAGE from '../constants/message';
import { TIME_OUT_SEC, REGEX } from '../constants/config';
import FirebaseService from '../services/firebaseService';
import { DataObject } from '../global/types';
/**
* Validate password
* @param {string} password Password input
* @returns {boolean} Return true if validate password success, otherwise return false
*/
export const isValidPassword = (password: string): boolean => {
return REGEX.PASSWORD.test(password);
};
export const isValidateEmail = (email: string): RegExpMatchArray | null => {
return String(email).toLowerCase().match(REGEX.EMAIL);
};
export const compare2Password = (
password: string,
passwordConfirm: string,
): boolean => {
return password === passwordConfirm;
};
/**
* A waiting function with s second
* @param {number} s The time will be waiting
* @returns {Promise} A Promise will be only reject after s second
*/
export const timeout = (s: number): Promise<string> => {
return new Promise((_, reject) => {
setTimeout(() => {
FirebaseService.disconnect();
reject(MESSAGE.TIME_OUT_ERROR);
}, s * 1000);
});
};
export const createIdUser = (): number => {
return new Date().getTime();
};
/**
* A function waiting the action need to be perform and throw error after s second.
* @param {Function} action The action need to be perform.
* @returns { Object || Error } Return the any object from Firebase or Error
*/
export const timeOutConnect = async <T>(
action: Promise<T>,
): Promise<string | T> => {
const result: T | string = await Promise.race([
action,
timeout(TIME_OUT_SEC),
]);
return result;
};
export const renderRequiredText = (field: string, element: Element): void => {
const markup: string = `
<p class="error-text">${MESSAGE.REQUIRED_MESSAGE(field)}</p>
`;
element.insertAdjacentHTML('afterend', markup);
};
export const redirectToLoginPage = (): void => {
window.location.replace('/login');
};
export const convertDataObjectToModel = (dataObj: {
id: string;
data: object;
}): DataObject => {
const { id } = dataObj;
return { id, ...dataObj.data } as DataObject;
};
export const convertModelToDataObject = <T extends DataObject>(model: T): T => {
const { id, ...data } = model;
return { id, data } as T;
};
@@ -0,0 +1,3 @@
export const redirectToLoginPage = (): void => {
window.location.replace('/login');
};
@@ -0,0 +1,30 @@
import { REGEX } from '../constants/config';
import * as MESSAGE from '../constants/message';
/**
* Validate password
* @param {string} password Password input
* @returns {boolean} Return true if validate password success, otherwise return false
*/
export const isValidPassword = (password: string): boolean => {
return REGEX.PASSWORD.test(password);
};
export const isValidateEmail = (email: string): RegExpMatchArray | null => {
return String(email).toLowerCase().match(REGEX.EMAIL);
};
export const compare2Password = (
password: string,
passwordConfirm: string,
): boolean => {
return password === passwordConfirm;
};
export const renderRequiredText = (field: string, element: Element): void => {
const markup: string = `
<p class="error-text">${MESSAGE.REQUIRED_MESSAGE(field)}</p>
`;
element.insertAdjacentHTML('afterend', markup);
};
+1 -1
View File
@@ -1,4 +1,4 @@
import { createIdUser } from '../helpers/helpers';
import { createIdUser } from '../helpers/data';
export default class User {
private id: number;
@@ -1,12 +1,12 @@
import { timeOutConnect } from '../helpers/connect';
import {
timeOutConnect,
convertDataObjectToModel,
convertModelToDataObject,
} from '../helpers/helpers';
} from '../helpers/data';
import { DataObject } from '../global/types';
import FirebaseService from './firebaseService';
export default class CommonService<T extends DataObject> {
export default class CommonService<T extends DataObject<T>> {
private defaultPath: string = '/';
private firebaseService = FirebaseService;
@@ -65,7 +65,7 @@ export default class CommonService<T extends DataObject> {
if (typeof results === 'object') {
// Convert format object
return results.map((data) => {
const tempData = data as DataObject;
const tempData = data as DataObject<T>;
return convertDataObjectToModel(tempData);
});
@@ -89,7 +89,7 @@ export default class CommonService<T extends DataObject> {
// Convert format object
return results.map((data) => {
const tempData = data as DataObject;
const tempData = data as DataObject<T>;
return convertDataObjectToModel(tempData);
});