mirror of
https://github.com/Nezumi-2711/typescript-training.git
synced 2026-09-22 20:02:19 +00:00
Update and refactor code
This commit is contained in:
@@ -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,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);
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user