diff --git a/.env b/.env
index 6047d2995..d260186ca 100644
--- a/.env
+++ b/.env
@@ -1,5 +1,13 @@
-PORT=5000
-password=EuACQK5n92JI3vn4
-DB_URL=mongodb+srv://sh3000444:EuACQK5n92JI3vn4@cluster0.2ttcjcg.mongodb.net/?retryWrites=true&w=majority&appName=Cluster0
-BCRYPT_SALT=10
-JWT_SECRET=aetvbkiy
\ No newline at end of file
+<<<<<<< HEAD
+PORT=3000
+password=EuACQK5n92JI3vn4
+DB_URL=mongodb+srv://sh3000444:EuACQK5n92JI3vn4@cluster0.2ttcjcg.mongodb.net/?retryWrites=true&w=majority&appName=Cluster0
+BCRYPT_SALT=10
+JWT_SECRET=aetvbkiy
+=======
+PORT=5000
+password=EuACQK5n92JI3vn4
+DB_URL=mongodb+srv://sh3000444:EuACQK5n92JI3vn4@cluster0.2ttcjcg.mongodb.net/?retryWrites=true&w=majority&appName=Cluster0
+BCRYPT_SALT=10
+JWT_SECRET=aetvbkiy
+>>>>>>> bfbcc67dc1c843746542105d3d6332eedff71e83
diff --git a/.gitignore b/.gitignore
index c0efacc3f..974c4173c 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,2 +1,8 @@
-.vscode/settings.json
- package-lock.json
\ No newline at end of file
+<<<<<<< HEAD
+.vscode/settings.json
+ package-lock.json
+node_modules
+=======
+.vscode/settings.json
+ package-lock.json
+>>>>>>> bfbcc67dc1c843746542105d3d6332eedff71e83
diff --git a/client-side/.env b/client-side/.env
index 8668f2761..88192cea2 100644
--- a/client-side/.env
+++ b/client-side/.env
@@ -1,4 +1,5 @@
REACT_APP_BASE_URL='http://localhost:3000'
REACT_APP_APOLLO_SERVER_URL='http://localhost:4000'
REACT_APP_SECRET_CODE_CAPVAL='6Ld5uBoqAAAAAKwPXqo5eanm9ZFSuOoBBSdl00pE'
-REACT_APP_SERVER_URL='http://localhost:5000'
+REACT_APP_SERVER_URL='http://localhost:3000'
+
diff --git a/client-side/package.json b/client-side/package.json
index ce9b7d516..b9099939f 100644
--- a/client-side/package.json
+++ b/client-side/package.json
@@ -19,16 +19,21 @@
"@testing-library/user-event": "^13.5.0",
"@types/redux": "^3.6.31",
"axios": "^1.7.2",
+ "date-fns": "^3.6.0",
"dayjs": "^1.11.12",
"formik": "^2.4.6",
"html2canvas": "^1.4.1",
"html2pdf.js": "^0.10.2",
+ "i18next-browser-languagedetector": "^8.0.0",
+ "i18next-http-backend": "^2.5.2",
"jest": "^29.7.0",
"jspdf": "^2.5.1",
"jspdf-autotable": "^3.8.2",
+ "moment-timezone": "^0.5.45",
"react": "^18.3.1",
"react-dom": "^18.3.1",
"react-google-recaptcha": "^3.1.0",
+ "react-i18next": "^15.0.1",
"react-redux": "^9.1.2",
"react-router-dom": "^6.24.1",
"react-scripts": "5.0.1",
@@ -65,6 +70,7 @@
]
},
"devDependencies": {
+ "@babel/plugin-proposal-private-property-in-object": "^7.21.11",
"@babel/preset-env": "^7.25.4",
"@babel/preset-react": "^7.24.7",
"@chromatic-com/storybook": "^1.6.0",
diff --git a/client-side/public/locales/en/translation.json b/client-side/public/locales/en/translation.json
index 8320a8e13..30bcd02da 100644
--- a/client-side/public/locales/en/translation.json
+++ b/client-side/public/locales/en/translation.json
@@ -1,23 +1,47 @@
{
- "welcome":"bienvenida {{user-name}}",
- "send preferences":" change setting ",
- "change-ringtone":"change ringtoe",
- "home":"Home",
- "settings":"Settings",
- "reports":"reports",
- "statistics":"statistic",
- "profiles":"profiles",
- "timeout":"TimeOut",
- "sleect-language":"sleect language",
- "change-notification-time":"change notification time",
- "Acount" :"Acount",
- "Notifications" :"Notifications",
- "Preference":"Preference",
- "Display-Setting" :"Display Setting",
- "Message" :"Message",
- "account":"Account",
- "display-setting":"Display Setting",
- "fotter":"© Developed by ExtraTech team. visit us:",
- "open-settings":"Open settings"
+ "welcome": "bienvenida {{user-name}}",
+ "send preferences": " change setting ",
+ "change-ringtone": "change ringtoe",
+ "select language":"select language",
+ "home": "Home",
+ "settings": "Settings",
+ "reports": "reports",
+ "statistics": "statistic",
+ "profiles": "profiles",
+ "timeout": "TimeOut",
+ "sleect-language": "sleect language",
+ "change-notification-time": "change notification time",
+ "Acount": "Acount",
+ "Notifications": "Notifications",
+ "Preference": "Preference",
+ "Display-Setting": "Display Setting",
+ "Message": "Message",
+ "account": "Account",
+ "display-setting": "Display Setting",
+ "fotter": "© Developed by ExtraTech team. visit us:",
+ "open-settings": "Open settings",
+ "Select Email Frequency": "Select Email Frequency",
+ "never": "never",
+ "daily": "daily",
+ "weekly": "weekly",
+ "monthly": "monthly",
+ "yearly": "yearly",
+ "Select Time Zone": "Select Time Zone",
+ "Update": "Update",
+ "select date format": "select date format",
+ "MM-DD-YYYY": "MM-DD-YYYY",
+ "DD-MM-YYYY": "DD-MM-YYYY",
+ "YYYY-MM-DD": "YYYY-MM-DD",
+ "Display notification for income messages": "Display notification for income messages",
+ "Display browsing time limit notification": "Display browsing time limit notification",
+ "Message Box":"Message Box",
+ "Messages Inbox":"Messages Inbox",
+ "Messages Count":"Messages Count",
+ "title only":"title only",
+ "abbreviated message":"abbreviated message",
+ "full messages":"full messages",
+ "group by date":"group by date",
+ "group by read":"group by read",
+ "group by unread":"group by unread"
}
\ No newline at end of file
diff --git a/client-side/public/locales/es/translation.json b/client-side/public/locales/es/translation.json
index ba68826af..cbcc15de7 100644
--- a/client-side/public/locales/es/translation.json
+++ b/client-side/public/locales/es/translation.json
@@ -18,6 +18,21 @@
"display-setting": "configuración de pantalla",
"fotter": "© Desarrollado por el equipo ExtraTech. Visítanos:",
"settings": "ajustes",
- "open-settings":"Configuración abierta"
-
+ "open-settings":"Configuración abierta",
+ "Select Email Frequency": "Seleccionar frecuencia de correo electrónico",
+ "never": "nunca",
+ "daily": "diario",
+ "weekly": "semanalmente",
+ "monthly": "mensual",
+ "yearly": "anual",
+ "Select Time Zone":"Selecciona la zona horaria",
+ "Message Box":"Cuadro de mensaje",
+ "Messages Inbox":"Bandeja de entrada de mensajes",
+ "Messages Count":"Los mensajes cuentan",
+ "title only":"solo título",
+ "abbreviated message":"mensaje abreviado",
+ "full messages":"mensajes completos",
+ "group by date":"agrupar por fecha",
+ "group by read":"agrupar por lectura",
+ "group by unread":"agrupar por no leídos"
}
\ No newline at end of file
diff --git a/client-side/public/locales/he/translation.json b/client-side/public/locales/he/translation.json
index ad1134151..115a32194 100644
--- a/client-side/public/locales/he/translation.json
+++ b/client-side/public/locales/he/translation.json
@@ -1,23 +1,44 @@
-{
- "welcome":" {{user-name}} ברוכה הבאה !!",
- "send preferences":"שינוי העדפות",
- "change-ringtone":"שנה צליל",
- "home":"בית",
- "reports":"דוחות",
- "statistics":"סטטיסטיקות",
- "profiles":"פרופילים",
- "timeout":"פסק-זמן",
- "sleect-language":"בחר שפה",
- "change-notification-time":"שנה זמן קבלת התראות",
- "Account" :"Cuenta",
- "Notifications" :"התראות",
- "Preference":"הגדרות אישיות",
- "Display-Setting" :" הגדרות תצוגה",
- "Message" :"הודעות",
- "account":"חשבון",
- "display-setting":"הגדרות תצוגה",
- "fotter":"בקרו אותנו ExtraTech פותח עי צות",
- "settings":"הגדרות",
- "open-settings":"פתח הגדרות"
+{ "welcome": " {{user-name}} ברוכה הבאה !!",
+ "send preferences": "שינוי העדפות",
+ "change-ringtone": "שנה צליל",
+ "home": "בית",
+ "reports": "דוחות",
+ "statistics": "סטטיסטיקות",
+ "profiles": "פרופילים",
+ "timeout": "פסק-זמן",
+ "select language": "בחר שפה",
+ "change-notification-time": "שנה זמן קבלת התראות",
+ "Account": "Cuenta",
+ "Notifications": "התראות",
+ "Preference": "הגדרות אישיות",
+ "Display-Setting": " הגדרות תצוגה",
+ "Message": "הודעות",
+ "account": "חשבון",
+ "display-setting": "הגדרות תצוגה",
+ "fotter": "בקרו אותנו ExtraTech פותח עי צות",
+ "settings": "הגדרות",
+ "open-settings": "פתח הגדרות",
+ "Select Email Frequency": "בחר תדירות אימייל",
+ "never": "אף פעם",
+ "daily": "יומי",
+ "weekly": "שבועי",
+ "monthly": "חודשי",
+ "yearly": "שנתי",
+ "Select Time Zone": "בחר אזור זמן",
+ "Update": "עדכן",
+ "select date format": "בחר פורמט תאריך",
+ "MM-DD-YYYY": "חודש / יום / שנה",
+ "DD-MM-YYYY": "שנה / חודש / יום",
+ "YYYY-MM-DD": "יום / חודש / שנה",
+ "Display notification for income messages":"הצג התראה עבור הודעות נכנסות",
+ "Display browsing time limit notification":"הצג הודעת מגבלת זמן גלישה",
+ "Message Box":"תיבת הודעות",
+ "Messages Inbox":"הודעות דואר נכנס",
+ "Messages Count":"מספר הודעות",
+ "title only":"כותרת בלבד",
+ "abbreviated message":"הודעה מקוצרת",
+ "full messages":"הודעות מלאות",
+ "group by date":"קבץ לפי תאריך",
+ "group by read":"קבץ לפי נקרא"
}
\ No newline at end of file
diff --git a/client-side/src/App.jsx b/client-side/src/App.jsx
index f9fd94f48..854308a34 100644
--- a/client-side/src/App.jsx
+++ b/client-side/src/App.jsx
@@ -5,17 +5,17 @@ import Footer from './stories/footer/FooterComponent';
import { router } from './router/router.jsx';
import { store } from './redux/store.jsx';
import { SnackbarProvider } from 'notistack';
-import Messages from './components/Messages/Messages.jsx';
import './App.scss';
function App() {
+
return (
<>
+
-
diff --git a/client-side/src/axios/middleware.js b/client-side/src/axios/middleware.js
index 62503f44b..294bc46ac 100644
--- a/client-side/src/axios/middleware.js
+++ b/client-side/src/axios/middleware.js
@@ -1,6 +1,7 @@
import axios from 'axios';
-const url = process.env.REACT_APP_SERVER_URL;
+const url = process.env.REACT_APP_BASE_URL;
+
export async function handleGet(path) {
const response = await axios.create({ baseURL: url }).get(path);
diff --git a/client-side/src/babel.config.js b/client-side/src/babel.config.js
new file mode 100644
index 000000000..00a7a33d2
--- /dev/null
+++ b/client-side/src/babel.config.js
@@ -0,0 +1,11 @@
+module.exports = {
+ presets: [
+ 'react-app',
+
+ ],
+ plugins: [
+ '@babel/plugin-proposal-private-property-in-object',
+
+ ],
+ };
+
\ No newline at end of file
diff --git a/client-side/src/components/settings/Notifications.jsx b/client-side/src/components/settings/Notifications.jsx
new file mode 100644
index 000000000..16300e27b
--- /dev/null
+++ b/client-side/src/components/settings/Notifications.jsx
@@ -0,0 +1,113 @@
+import React, { useState,useEffect } from 'react';
+import PropTypes from 'prop-types';
+import { useTranslation } from 'react-i18next'
+import Select from '../../stories/Select/Select.jsx';
+import GenericInput from '../../stories/GenericInput/genericInput.jsx'
+import CONSTANTS from './constantSetting.js'
+import './Notifications.scss';
+
+const Notifications = ({ currentUser , onUpdate}) => {
+ const { EMAIL_FREQUENCY_ENUM, TITLES, LABELS } = CONSTANTS;
+ const { sendNotificationTime:notificationTime, soundVoice:initialSoundVoice,displayIncomeMessages:showIncomeMessages,
+ displayBrowsingTimeLimit:showBrowsingTimeLimit, emailFrequency: initialEmailFrequency, } = currentUser.preference;
+ const [emailFrequency, setEmailFrequency] = useState(initialEmailFrequency);
+ const [ringtoneFile, setRingtoneFile] = useState(null);
+ const url = process.env.REACT_APP_BASE_URL;
+ const [soundVoice, setSoundVoice] = useState(`${url}/uploads/${initialSoundVoice}`);
+ const [sendNotificationTime, setSendNotificationTime] = useState(notificationTime);
+ const [displayIncomeMessages, setDisplayIncomeMessages] = useState(showIncomeMessages);
+ const [displayBrowsingTimeLimit, setDisplayBrowsingTimeLimit] = useState(showBrowsingTimeLimit);
+ const { t } = useTranslation();
+
+ useEffect(() => {
+ onUpdate({
+ emailFrequency,
+ ringtoneFile,
+ sendNotificationTime,
+ displayIncomeMessages,
+ displayBrowsingTimeLimit
+ });
+ }, [emailFrequency, ringtoneFile, sendNotificationTime, displayIncomeMessages, displayBrowsingTimeLimit, onUpdate]);
+
+ const handleFileChange = (e) => {
+ if (e.target.files[0]) {
+ setRingtoneFile(e.target.files[0]);
+ setSoundVoice(URL.createObjectURL(e.target.files[0]));
+ }
+
+ };
+ const handleChangeEmailFreq = (selectedFrequency) => {
+ if (!Object.keys(EMAIL_FREQUENCY_ENUM).includes(selectedFrequency.toUpperCase())) {
+ return;
+ }
+ setEmailFrequency(selectedFrequency);
+ };
+
+ const changeNotificationTime = (event) => {
+ setSendNotificationTime(event);
+ }
+
+
+ return (
+
+
+ setDisplayIncomeMessages(e)}
+ />
+ setDisplayBrowsingTimeLimit(e)}
+ />
+
+
+
+
+
+
+
+
+ );
+};
+Notifications.propTypes = {
+ currentUser: PropTypes.object.isRequired,
+ onUpdate: PropTypes.func.isRequired
+}
+export default Notifications;
diff --git a/client-side/src/components/settings/Notifications.scss b/client-side/src/components/settings/Notifications.scss
new file mode 100644
index 000000000..7988294ba
--- /dev/null
+++ b/client-side/src/components/settings/Notifications.scss
@@ -0,0 +1,33 @@
+.notifications-container {
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ padding: 20px;
+
+ .select-container, .input-container, .file-container {
+ width: 100%;
+ max-width: 300px;
+ margin-bottom: 20px;
+ }
+
+ .audio-player {
+ width: 100%;
+ max-width: 300px;
+ margin-top: 10px;
+ }
+
+ .but-send {
+ margin-top: 20px;
+ }
+ }
+
+ @media (max-width: 600px) {
+ .select-container, .input-container, .file-container, .audio-player {
+ max-width: 100%;
+ }
+
+ .but-send {
+ width: 100%;
+ }
+ }
+
\ No newline at end of file
diff --git a/client-side/src/components/settings/Preference.jsx b/client-side/src/components/settings/Preference.jsx
new file mode 100644
index 000000000..03b26eabe
--- /dev/null
+++ b/client-side/src/components/settings/Preference.jsx
@@ -0,0 +1,29 @@
+import React, { useState } from 'react';
+import { useTranslation } from 'react-i18next'
+import Select from '../../stories/Select/Select.jsx'
+import {LANGUAGE,LABELS} from './constantSetting.js'
+
+ const Preferences =()=> {
+ const {t,i18n}= useTranslation();
+ const [lng,setLng] =useState(i18n.resolvedLanguage);
+ const handleLngChange=(value)=>{
+ i18n.changeLanguage(value);
+ setLng(value)
+ }
+ return (
+