@rovula/ui 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/main.d.ts ADDED
@@ -0,0 +1,5 @@
1
+ export { default as Button } from "./src/components/Button/Button";
2
+ export { default as Table } from "./src/components/Table/Table";
3
+ export { default as TextInput } from "./src/components/Form/TextInput";
4
+ export { default as Text } from "./src/components/Form/Text";
5
+ export { resloveTimestamp, getStartDateOfDay, getEndDateOfDay, getStartEndTimestampOfDay, getTimestampUTC, } from "./src/utils/datetime";
package/dist/main.js ADDED
@@ -0,0 +1,22 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.getTimestampUTC = exports.getStartEndTimestampOfDay = exports.getEndDateOfDay = exports.getStartDateOfDay = exports.resloveTimestamp = exports.Text = exports.TextInput = exports.Table = exports.Button = void 0;
7
+ // UI Components
8
+ var Button_1 = require("./src/components/Button/Button");
9
+ Object.defineProperty(exports, "Button", { enumerable: true, get: function () { return __importDefault(Button_1).default; } });
10
+ var Table_1 = require("./src/components/Table/Table");
11
+ Object.defineProperty(exports, "Table", { enumerable: true, get: function () { return __importDefault(Table_1).default; } });
12
+ var TextInput_1 = require("./src/components/Form/TextInput");
13
+ Object.defineProperty(exports, "TextInput", { enumerable: true, get: function () { return __importDefault(TextInput_1).default; } });
14
+ var Text_1 = require("./src/components/Form/Text");
15
+ Object.defineProperty(exports, "Text", { enumerable: true, get: function () { return __importDefault(Text_1).default; } });
16
+ // UTILS
17
+ var datetime_1 = require("./src/utils/datetime");
18
+ Object.defineProperty(exports, "resloveTimestamp", { enumerable: true, get: function () { return datetime_1.resloveTimestamp; } });
19
+ Object.defineProperty(exports, "getStartDateOfDay", { enumerable: true, get: function () { return datetime_1.getStartDateOfDay; } });
20
+ Object.defineProperty(exports, "getEndDateOfDay", { enumerable: true, get: function () { return datetime_1.getEndDateOfDay; } });
21
+ Object.defineProperty(exports, "getStartEndTimestampOfDay", { enumerable: true, get: function () { return datetime_1.getStartEndTimestampOfDay; } });
22
+ Object.defineProperty(exports, "getTimestampUTC", { enumerable: true, get: function () { return datetime_1.getTimestampUTC; } });
@@ -0,0 +1,12 @@
1
+ import React from "react";
2
+ interface ButtonProps {
3
+ children: React.ReactNode;
4
+ onClick?: (event: React.MouseEvent<HTMLButtonElement>) => void;
5
+ type?: "button" | "submit" | "reset";
6
+ disabled?: boolean;
7
+ className?: string;
8
+ isLoading?: boolean;
9
+ variant?: "primary" | "secondary";
10
+ }
11
+ declare const Button: React.FC<ButtonProps>;
12
+ export default Button;
@@ -0,0 +1,10 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const react_1 = __importDefault(require("react"));
7
+ const Button = ({ children, onClick, type = "button", disabled = false, className = "", isLoading = false, variant = "primary", }) => {
8
+ return (react_1.default.createElement("button", { className: `btn ${className} ${variant}`, onClick: onClick, type: type, disabled: disabled || isLoading }, isLoading ? "Loading..." : children));
9
+ };
10
+ exports.default = Button;
@@ -0,0 +1,12 @@
1
+ import React from "react";
2
+ interface FormValues {
3
+ name: string;
4
+ email: string;
5
+ password: string;
6
+ }
7
+ interface FormProps {
8
+ onSubmit: (values: FormValues) => void;
9
+ className?: string;
10
+ }
11
+ declare const Form: React.FC<FormProps>;
12
+ export default Form;
@@ -0,0 +1,91 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || function (mod) {
19
+ if (mod && mod.__esModule) return mod;
20
+ var result = {};
21
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
+ __setModuleDefault(result, mod);
23
+ return result;
24
+ };
25
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
26
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
27
+ return new (P || (P = Promise))(function (resolve, reject) {
28
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
29
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
30
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
31
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
32
+ });
33
+ };
34
+ Object.defineProperty(exports, "__esModule", { value: true });
35
+ // src/Form.tsx
36
+ const react_1 = __importStar(require("react"));
37
+ const yup = __importStar(require("yup"));
38
+ const schema = yup.object().shape({
39
+ name: yup.string().required("Name is required"),
40
+ email: yup.string().email("Invalid email").required("Email is required"),
41
+ password: yup
42
+ .string()
43
+ .min(6, "Password must be at least 6 characters")
44
+ .required("Password is required"),
45
+ });
46
+ const Form = ({ onSubmit, className = "" }) => {
47
+ const [values, setValues] = (0, react_1.useState)({
48
+ name: "",
49
+ email: "",
50
+ password: "",
51
+ });
52
+ const [errors, setErrors] = (0, react_1.useState)({});
53
+ const handleChange = (e) => {
54
+ const { name, value } = e.target;
55
+ setValues(Object.assign(Object.assign({}, values), { [name]: value }));
56
+ };
57
+ const handleSubmit = (e) => __awaiter(void 0, void 0, void 0, function* () {
58
+ e.preventDefault();
59
+ try {
60
+ yield schema.validate(values, { abortEarly: false });
61
+ setErrors({});
62
+ onSubmit(values);
63
+ }
64
+ catch (err) {
65
+ if (err instanceof yup.ValidationError) {
66
+ const validationErrors = {};
67
+ err.inner.forEach((error) => {
68
+ if (error.path) {
69
+ validationErrors[error.path] = error.message;
70
+ }
71
+ });
72
+ setErrors(validationErrors);
73
+ }
74
+ }
75
+ });
76
+ return (react_1.default.createElement("form", { className: `form ${className}`, onSubmit: handleSubmit },
77
+ react_1.default.createElement("div", { className: "form-group" },
78
+ react_1.default.createElement("label", { htmlFor: "name" }, "Name"),
79
+ react_1.default.createElement("input", { id: "name", name: "name", type: "text", value: values.name, onChange: handleChange }),
80
+ errors.name && react_1.default.createElement("span", { className: "error" }, errors.name)),
81
+ react_1.default.createElement("div", { className: "form-group" },
82
+ react_1.default.createElement("label", { htmlFor: "email" }, "Email"),
83
+ react_1.default.createElement("input", { id: "email", name: "email", type: "email", value: values.email, onChange: handleChange }),
84
+ errors.email && react_1.default.createElement("span", { className: "error" }, errors.email)),
85
+ react_1.default.createElement("div", { className: "form-group" },
86
+ react_1.default.createElement("label", { htmlFor: "password" }, "Password"),
87
+ react_1.default.createElement("input", { id: "password", name: "password", type: "password", value: values.password, onChange: handleChange }),
88
+ errors.password && react_1.default.createElement("span", { className: "error" }, errors.password)),
89
+ react_1.default.createElement("button", { type: "submit" }, "Submit")));
90
+ };
91
+ exports.default = Form;
@@ -0,0 +1,9 @@
1
+ import React from "react";
2
+ interface TextProps {
3
+ children: string;
4
+ size?: "small" | "medium" | "large";
5
+ color?: string;
6
+ className?: string;
7
+ }
8
+ declare const Text: React.FC<TextProps>;
9
+ export default Text;
@@ -0,0 +1,10 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const react_1 = __importDefault(require("react"));
7
+ const Text = ({ children, size = "medium", color = "black", className = "", }) => {
8
+ return (react_1.default.createElement("span", { className: `text ${size} ${className}`, style: { color } }, children));
9
+ };
10
+ exports.default = Text;
@@ -0,0 +1,11 @@
1
+ import React from 'react';
2
+ interface TextInputProps {
3
+ value: string;
4
+ onChange: (event: React.ChangeEvent<HTMLInputElement>) => void;
5
+ placeholder?: string;
6
+ type?: 'text' | 'password' | 'email';
7
+ disabled?: boolean;
8
+ className?: string;
9
+ }
10
+ declare const TextInput: React.FC<TextInputProps>;
11
+ export default TextInput;
@@ -0,0 +1,10 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const react_1 = __importDefault(require("react"));
7
+ const TextInput = ({ value, onChange, placeholder = '', type = 'text', disabled = false, className = '', }) => {
8
+ return (react_1.default.createElement("input", { className: `text-input ${className}`, type: type, value: value, onChange: onChange, placeholder: placeholder, disabled: disabled }));
9
+ };
10
+ exports.default = TextInput;
@@ -0,0 +1,11 @@
1
+ import React from "react";
2
+ interface Column {
3
+ header: string;
4
+ accessor: string;
5
+ }
6
+ interface TableProps {
7
+ columns: Column[];
8
+ data: Record<string, any>[];
9
+ }
10
+ declare const Table: React.FC<TableProps>;
11
+ export default Table;
@@ -0,0 +1,13 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const react_1 = __importDefault(require("react"));
7
+ const Table = ({ columns, data }) => {
8
+ return (react_1.default.createElement("table", { className: "table" },
9
+ react_1.default.createElement("thead", null,
10
+ react_1.default.createElement("tr", null, columns.map((column, index) => (react_1.default.createElement("th", { key: index }, column.header))))),
11
+ react_1.default.createElement("tbody", null, data.map((row, rowIndex) => (react_1.default.createElement("tr", { key: rowIndex }, columns.map((column, colIndex) => (react_1.default.createElement("td", { key: colIndex }, row[column.accessor])))))))));
12
+ };
13
+ exports.default = Table;
@@ -0,0 +1,11 @@
1
+ import React from "react";
2
+ interface Tab {
3
+ label: string;
4
+ content: React.ReactNode;
5
+ }
6
+ interface TabsProps {
7
+ tabs: Tab[];
8
+ initialTab?: number;
9
+ }
10
+ declare const Tabs: React.FC<TabsProps>;
11
+ export default Tabs;
@@ -0,0 +1,33 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || function (mod) {
19
+ if (mod && mod.__esModule) return mod;
20
+ var result = {};
21
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
+ __setModuleDefault(result, mod);
23
+ return result;
24
+ };
25
+ Object.defineProperty(exports, "__esModule", { value: true });
26
+ const react_1 = __importStar(require("react"));
27
+ const Tabs = ({ tabs, initialTab = 0 }) => {
28
+ const [activeTab, setActiveTab] = (0, react_1.useState)(initialTab);
29
+ return (react_1.default.createElement("div", { className: "tabs" },
30
+ react_1.default.createElement("div", { className: "tab-buttons" }, tabs.map((tab, index) => (react_1.default.createElement("button", { key: index, className: index === activeTab ? "active" : "", onClick: () => setActiveTab(index) }, tab.label)))),
31
+ react_1.default.createElement("div", { className: "tab-content" }, tabs[activeTab].content)));
32
+ };
33
+ exports.default = Tabs;
@@ -0,0 +1,9 @@
1
+ declare const resloveTimestamp: (timestamp: number) => number;
2
+ declare const getStartDateOfDay: (date: Date) => Date;
3
+ declare const getEndDateOfDay: (date: Date) => Date;
4
+ declare const getStartEndTimestampOfDay: () => {
5
+ startTime: Date;
6
+ endTime: Date;
7
+ };
8
+ declare const getTimestampUTC: (date: Date) => number;
9
+ export { resloveTimestamp, getStartDateOfDay, getEndDateOfDay, getStartEndTimestampOfDay, getTimestampUTC, };
@@ -0,0 +1,37 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getTimestampUTC = exports.getStartEndTimestampOfDay = exports.getEndDateOfDay = exports.getStartDateOfDay = exports.resloveTimestamp = void 0;
4
+ const resloveTimestamp = (timestamp) => {
5
+ if (String(timestamp).length > 10)
6
+ return timestamp / 1000;
7
+ return timestamp;
8
+ };
9
+ exports.resloveTimestamp = resloveTimestamp;
10
+ // Set the time to the start of the day (00:00:00)
11
+ const getStartDateOfDay = (date) => {
12
+ const startDate = new Date(date);
13
+ startDate.setHours(0, 0, 0, 0);
14
+ return startDate;
15
+ };
16
+ exports.getStartDateOfDay = getStartDateOfDay;
17
+ // Set the time to the end of the day (23:59:59.999)
18
+ const getEndDateOfDay = (date) => {
19
+ const startDate = new Date(date);
20
+ startDate.setHours(23, 59, 59, 999);
21
+ return startDate;
22
+ };
23
+ exports.getEndDateOfDay = getEndDateOfDay;
24
+ const getStartEndTimestampOfDay = () => {
25
+ const startTime = getStartDateOfDay(new Date());
26
+ const endTime = getEndDateOfDay(startTime);
27
+ return {
28
+ startTime,
29
+ endTime,
30
+ };
31
+ };
32
+ exports.getStartEndTimestampOfDay = getStartEndTimestampOfDay;
33
+ const getTimestampUTC = (date) => {
34
+ const dateUtc = Date.UTC(date.getFullYear(), date.getMonth(), date.getDate(), date.getHours(), date.getMinutes(), date.getSeconds());
35
+ return resloveTimestamp(dateUtc);
36
+ };
37
+ exports.getTimestampUTC = getTimestampUTC;
package/package.json ADDED
@@ -0,0 +1,57 @@
1
+ {
2
+ "name": "@rovula/ui",
3
+ "version": "0.0.1",
4
+ "main": "dist/main.js",
5
+ "types": "dist/main.d.ts",
6
+ "scripts": {
7
+ "test": "echo \"Error: no test specified\" && exit 1",
8
+ "build": "tsc",
9
+ "prepare": "npm run build "
10
+ },
11
+ "files": [
12
+ "dist/**/*",
13
+ "src/**/*"
14
+ ],
15
+ "keywords": [],
16
+ "author": "NuttapongSa",
17
+ "license": "ISC",
18
+ "devDependencies": {
19
+ "@babel/core": "^7.24.5",
20
+ "@babel/preset-env": "^7.24.5",
21
+ "@babel/preset-react": "^7.24.1",
22
+ "@babel/preset-typescript": "^7.24.1",
23
+ "@rollup/plugin-typescript": "^11.1.6",
24
+ "@types/node": "^20.12.12",
25
+ "babel-loader": "^9.1.3",
26
+ "css-loader": "^7.1.2",
27
+ "style-loader": "^4.0.0",
28
+ "typescript": "^5.4.5",
29
+ "webpack": "^5.91.0",
30
+ "webpack-cli": "^5.1.4"
31
+ },
32
+ "dependencies": {
33
+ "@types/react": "^18.3.2",
34
+ "autoprefixer": "^10.4.19",
35
+ "axios": "^1.6.4",
36
+ "clsx": "^2.1.1",
37
+ "postcss": "^8.1.0",
38
+ "react": "^17.0.0 || ^18.0.0",
39
+ "react-dom": "^17.0.0 || ^18.0.0",
40
+ "rollup": "^4.17.2",
41
+ "tailwindcss": "npm:@tailwindcss/postcss7-compat@^2.2.17",
42
+ "yup": "^1.4.0"
43
+ },
44
+ "peerDependencies": {
45
+ "react": "^17.0.0 || ^18.0.0",
46
+ "react-dom": "^17.0.0 || ^18.0.0"
47
+ },
48
+ "repository": {
49
+ "type": "git",
50
+ "url": "git+ssh://git@github.com/Rovula/rovula-package.git"
51
+ },
52
+ "bugs": {
53
+ "url": "https://github.com/Rovula/rovula-package/issues"
54
+ },
55
+ "homepage": "https://github.com/Rovula/rovula-package#readme",
56
+ "description": ""
57
+ }
@@ -0,0 +1,34 @@
1
+ import React from "react";
2
+
3
+ interface ButtonProps {
4
+ children: React.ReactNode;
5
+ onClick?: (event: React.MouseEvent<HTMLButtonElement>) => void;
6
+ type?: "button" | "submit" | "reset";
7
+ disabled?: boolean;
8
+ className?: string;
9
+ isLoading?: boolean;
10
+ variant?: "primary" | "secondary";
11
+ }
12
+
13
+ const Button: React.FC<ButtonProps> = ({
14
+ children,
15
+ onClick,
16
+ type = "button",
17
+ disabled = false,
18
+ className = "",
19
+ isLoading = false,
20
+ variant = "primary",
21
+ }) => {
22
+ return (
23
+ <button
24
+ className={`btn ${className} ${variant}`}
25
+ onClick={onClick}
26
+ type={type}
27
+ disabled={disabled || isLoading}
28
+ >
29
+ {isLoading ? "Loading..." : children}
30
+ </button>
31
+ );
32
+ };
33
+
34
+ export default Button;
@@ -0,0 +1,99 @@
1
+ // src/Form.tsx
2
+ import React, { useState } from "react";
3
+ import * as yup from "yup";
4
+
5
+ interface FormValues {
6
+ name: string;
7
+ email: string;
8
+ password: string;
9
+ }
10
+
11
+ interface FormProps {
12
+ onSubmit: (values: FormValues) => void;
13
+ className?: string;
14
+ }
15
+
16
+ const schema = yup.object().shape({
17
+ name: yup.string().required("Name is required"),
18
+ email: yup.string().email("Invalid email").required("Email is required"),
19
+ password: yup
20
+ .string()
21
+ .min(6, "Password must be at least 6 characters")
22
+ .required("Password is required"),
23
+ });
24
+
25
+ const Form: React.FC<FormProps> = ({ onSubmit, className = "" }) => {
26
+ const [values, setValues] = useState<FormValues>({
27
+ name: "",
28
+ email: "",
29
+ password: "",
30
+ });
31
+ const [errors, setErrors] = useState<{ [key in keyof FormValues]?: string }>(
32
+ {}
33
+ );
34
+
35
+ const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {
36
+ const { name, value } = e.target;
37
+ setValues({ ...values, [name]: value });
38
+ };
39
+
40
+ const handleSubmit = async (e: React.FormEvent) => {
41
+ e.preventDefault();
42
+ try {
43
+ await schema.validate(values, { abortEarly: false });
44
+ setErrors({});
45
+ onSubmit(values);
46
+ } catch (err) {
47
+ if (err instanceof yup.ValidationError) {
48
+ const validationErrors: { [key in keyof FormValues]?: string } = {};
49
+ err.inner.forEach((error) => {
50
+ if (error.path) {
51
+ validationErrors[error.path as keyof FormValues] = error.message;
52
+ }
53
+ });
54
+ setErrors(validationErrors);
55
+ }
56
+ }
57
+ };
58
+
59
+ return (
60
+ <form className={`form ${className}`} onSubmit={handleSubmit}>
61
+ <div className="form-group">
62
+ <label htmlFor="name">Name</label>
63
+ <input
64
+ id="name"
65
+ name="name"
66
+ type="text"
67
+ value={values.name}
68
+ onChange={handleChange}
69
+ />
70
+ {errors.name && <span className="error">{errors.name}</span>}
71
+ </div>
72
+ <div className="form-group">
73
+ <label htmlFor="email">Email</label>
74
+ <input
75
+ id="email"
76
+ name="email"
77
+ type="email"
78
+ value={values.email}
79
+ onChange={handleChange}
80
+ />
81
+ {errors.email && <span className="error">{errors.email}</span>}
82
+ </div>
83
+ <div className="form-group">
84
+ <label htmlFor="password">Password</label>
85
+ <input
86
+ id="password"
87
+ name="password"
88
+ type="password"
89
+ value={values.password}
90
+ onChange={handleChange}
91
+ />
92
+ {errors.password && <span className="error">{errors.password}</span>}
93
+ </div>
94
+ <button type="submit">Submit</button>
95
+ </form>
96
+ );
97
+ };
98
+
99
+ export default Form;
@@ -0,0 +1,23 @@
1
+ import React from "react";
2
+
3
+ interface TextProps {
4
+ children: string;
5
+ size?: "small" | "medium" | "large";
6
+ color?: string;
7
+ className?: string;
8
+ }
9
+
10
+ const Text: React.FC<TextProps> = ({
11
+ children,
12
+ size = "medium",
13
+ color = "black",
14
+ className = "",
15
+ }) => {
16
+ return (
17
+ <span className={`text ${size} ${className}`} style={{ color }}>
18
+ {children}
19
+ </span>
20
+ );
21
+ };
22
+
23
+ export default Text;
@@ -0,0 +1,32 @@
1
+ import React from 'react';
2
+
3
+ interface TextInputProps {
4
+ value: string;
5
+ onChange: (event: React.ChangeEvent<HTMLInputElement>) => void;
6
+ placeholder?: string;
7
+ type?: 'text' | 'password' | 'email';
8
+ disabled?: boolean;
9
+ className?: string;
10
+ }
11
+
12
+ const TextInput: React.FC<TextInputProps> = ({
13
+ value,
14
+ onChange,
15
+ placeholder = '',
16
+ type = 'text',
17
+ disabled = false,
18
+ className = '',
19
+ }) => {
20
+ return (
21
+ <input
22
+ className={`text-input ${className}`}
23
+ type={type}
24
+ value={value}
25
+ onChange={onChange}
26
+ placeholder={placeholder}
27
+ disabled={disabled}
28
+ />
29
+ );
30
+ };
31
+
32
+ export default TextInput;
@@ -0,0 +1,36 @@
1
+ import React from "react";
2
+
3
+ interface Column {
4
+ header: string;
5
+ accessor: string;
6
+ }
7
+
8
+ interface TableProps {
9
+ columns: Column[];
10
+ data: Record<string, any>[];
11
+ }
12
+
13
+ const Table: React.FC<TableProps> = ({ columns, data }) => {
14
+ return (
15
+ <table className="table">
16
+ <thead>
17
+ <tr>
18
+ {columns.map((column, index) => (
19
+ <th key={index}>{column.header}</th>
20
+ ))}
21
+ </tr>
22
+ </thead>
23
+ <tbody>
24
+ {data.map((row, rowIndex) => (
25
+ <tr key={rowIndex}>
26
+ {columns.map((column, colIndex) => (
27
+ <td key={colIndex}>{row[column.accessor]}</td>
28
+ ))}
29
+ </tr>
30
+ ))}
31
+ </tbody>
32
+ </table>
33
+ );
34
+ };
35
+
36
+ export default Table;
@@ -0,0 +1,34 @@
1
+ import React, { useState } from "react";
2
+
3
+ interface Tab {
4
+ label: string;
5
+ content: React.ReactNode;
6
+ }
7
+
8
+ interface TabsProps {
9
+ tabs: Tab[];
10
+ initialTab?: number;
11
+ }
12
+
13
+ const Tabs: React.FC<TabsProps> = ({ tabs, initialTab = 0 }) => {
14
+ const [activeTab, setActiveTab] = useState(initialTab);
15
+
16
+ return (
17
+ <div className="tabs">
18
+ <div className="tab-buttons">
19
+ {tabs.map((tab, index) => (
20
+ <button
21
+ key={index}
22
+ className={index === activeTab ? "active" : ""}
23
+ onClick={() => setActiveTab(index)}
24
+ >
25
+ {tab.label}
26
+ </button>
27
+ ))}
28
+ </div>
29
+ <div className="tab-content">{tabs[activeTab].content}</div>
30
+ </div>
31
+ );
32
+ };
33
+
34
+ export default Tabs;
@@ -0,0 +1,51 @@
1
+ const resloveTimestamp = (timestamp: number): number => {
2
+ if (String(timestamp).length > 10) return timestamp / 1000;
3
+
4
+ return timestamp;
5
+ };
6
+
7
+ // Set the time to the start of the day (00:00:00)
8
+ const getStartDateOfDay = (date: Date): Date => {
9
+ const startDate = new Date(date);
10
+ startDate.setHours(0, 0, 0, 0);
11
+
12
+ return startDate;
13
+ };
14
+
15
+ // Set the time to the end of the day (23:59:59.999)
16
+ const getEndDateOfDay = (date: Date): Date => {
17
+ const startDate = new Date(date);
18
+ startDate.setHours(23, 59, 59, 999);
19
+
20
+ return startDate;
21
+ };
22
+
23
+ const getStartEndTimestampOfDay = () => {
24
+ const startTime = getStartDateOfDay(new Date());
25
+ const endTime = getEndDateOfDay(startTime);
26
+
27
+ return {
28
+ startTime,
29
+ endTime,
30
+ };
31
+ };
32
+
33
+ const getTimestampUTC = (date: Date) => {
34
+ const dateUtc = Date.UTC(
35
+ date.getFullYear(),
36
+ date.getMonth(),
37
+ date.getDate(),
38
+ date.getHours(),
39
+ date.getMinutes(),
40
+ date.getSeconds()
41
+ );
42
+
43
+ return resloveTimestamp(dateUtc);
44
+ };
45
+ export {
46
+ resloveTimestamp,
47
+ getStartDateOfDay,
48
+ getEndDateOfDay,
49
+ getStartEndTimestampOfDay,
50
+ getTimestampUTC,
51
+ };