└── 02-Dates Reminder ├── dates-reminder ├── package-lock.json ├── package.json ├── public │ ├── index.html │ └── p1.jpg └── src │ ├── App.js │ ├── components │ ├── DatesAction.js │ ├── DatesCount.js │ └── DatesList.js │ ├── data.js │ ├── index.css │ └── index.js └── package-lock.json /02-Dates Reminder/dates-reminder/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "dates-reminder", 3 | "version": "0.1.0", 4 | "private": true, 5 | "dependencies": { 6 | "@testing-library/jest-dom": "^5.15.1", 7 | "@testing-library/react": "^11.2.7", 8 | "@testing-library/user-event": "^12.8.3", 9 | "bootstrap": "^5.1.3", 10 | "react": "^17.0.2", 11 | "react-bootstrap": "^2.0.2", 12 | "react-dom": "^17.0.2", 13 | "react-scripts": "4.0.3", 14 | "web-vitals": "^1.1.2" 15 | }, 16 | "scripts": { 17 | "start": "react-scripts start", 18 | "build": "react-scripts build", 19 | "test": "react-scripts test", 20 | "eject": "react-scripts eject" 21 | }, 22 | "eslintConfig": { 23 | "extends": [ 24 | "react-app", 25 | "react-app/jest" 26 | ] 27 | }, 28 | "browserslist": { 29 | "production": [ 30 | ">0.2%", 31 | "not dead", 32 | "not op_mini all" 33 | ], 34 | "development": [ 35 | "last 1 chrome version", 36 | "last 1 firefox version", 37 | "last 1 safari version" 38 | ] 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /02-Dates Reminder/dates-reminder/public/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | Dates 15 | 16 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | -------------------------------------------------------------------------------- /02-Dates Reminder/dates-reminder/public/p1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bakrgit/dates-reminder/f277ebc3ea89b4b448d9ec13ddd676ca90346c65/02-Dates Reminder/dates-reminder/public/p1.jpg -------------------------------------------------------------------------------- /02-Dates Reminder/dates-reminder/src/App.js: -------------------------------------------------------------------------------- 1 | import { Button, Col, Container, Row } from "react-bootstrap"; 2 | import React, { useState, useEffect } from 'react' 3 | import { person } from './data' 4 | import DatesCount from './components/DatesCount' 5 | import DatesList from './components/DatesList' 6 | import DatesAction from './components/DatesAction' 7 | function App() { 8 | 9 | const [personData, setPersonData] = useState(person) 10 | //dafadf 11 | const onDelete = () => { 12 | setPersonData([]) 13 | } 14 | const onViewData = () => { 15 | setPersonData(person) 16 | } 17 | useEffect(() => { 18 | setPersonData([]) 19 | }, []) 20 | return ( 21 |
22 | 23 | 24 | 25 | 26 | 27 |
28 | ); 29 | } 30 | 31 | export default App; 32 | -------------------------------------------------------------------------------- /02-Dates Reminder/dates-reminder/src/components/DatesAction.js: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import { Row, Col } from 'react-bootstrap' 3 | const DatesAction = ({deleteData,onViewData}) => { 4 | return ( 5 | 6 | 7 | 8 | 9 | 10 | 11 | ) 12 | } 13 | 14 | export default DatesAction 15 | -------------------------------------------------------------------------------- /02-Dates Reminder/dates-reminder/src/components/DatesCount.js: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import { Row, Col } from 'react-bootstrap' 3 | 4 | const DatesCount = ({ person }) => { 5 | return ( 6 | 7 | 8 | لديك {person.length} مواعيد 9 | 10 | 11 | ) 12 | } 13 | 14 | export default DatesCount 15 | -------------------------------------------------------------------------------- /02-Dates Reminder/dates-reminder/src/components/DatesList.js: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import { Row, Col } from 'react-bootstrap' 3 | const DatesList = ({ person }) => { 4 | return ( 5 | 6 | 7 |
8 | {person.length ? (person.map((item) => { 9 | return ( 10 |
11 | sdsd 12 |
13 |

{item.name}

14 |

{item.date}

15 |
16 |
17 | ) 18 | })) :

لا يوجد مواعيد اليوم

} 19 | 20 |
21 | 22 |
23 | ) 24 | } 25 | 26 | export default DatesList 27 | -------------------------------------------------------------------------------- /02-Dates Reminder/dates-reminder/src/data.js: -------------------------------------------------------------------------------- 1 | export const person = [{ id: '0', name: 'حسن', date: '5 مساء', img: 'p1.jpg' }, 2 | { id: '1', name: 'محمد', date: '4 مساء', img: 'p1.jpg' }, 3 | { id: '2', name: 'على', date: '3 مساء', img: 'p1.jpg' }, 4 | { id: '3', name: 'محمود', date: '2 مساء', img: 'p1.jpg' }, 5 | { id: '4', name: 'حسن', date: '1 مساء', img: 'p1.jpg' }, 6 | { id: '5', name: 'حسن', date: '1 مساء', img: 'p1.jpg' }, 7 | { id: '6', name: 'حسن', date: '1 مساء', img: 'p1.jpg' },] -------------------------------------------------------------------------------- /02-Dates Reminder/dates-reminder/src/index.css: -------------------------------------------------------------------------------- 1 | .color-body { 2 | height: 100vh; 3 | background-color: #f8f8f8; 4 | } 5 | .font { 6 | font-family: "Almarai", sans-serif; 7 | font-family: "Cairo", sans-serif; 8 | font-size: 20px; 9 | } 10 | 11 | .rectangle { 12 | height: 600px; 13 | border-radius: 15px; 14 | background-color: #ffffff; 15 | box-shadow: 1px 4px 4px 1px rgba(85, 85, 85, 0.25); 16 | } 17 | 18 | .dates-count { 19 | color: #555555; 20 | font-weight: 600; 21 | margin-bottom: 20px; 22 | } 23 | 24 | .btn-style { 25 | width: 200px; 26 | border-radius: 8px; 27 | color: white; 28 | background-color: #224f61; 29 | } 30 | 31 | .img-avatar { 32 | height: 60px; 33 | width: 60px; 34 | border-radius: 50%; 35 | } 36 | 37 | .mt-0 { 38 | margin-top: 0; 39 | } 40 | -------------------------------------------------------------------------------- /02-Dates Reminder/dates-reminder/src/index.js: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import ReactDOM from 'react-dom'; 3 | import './index.css'; 4 | import App from './App'; 5 | import 'bootstrap/dist/css/bootstrap.min.css'; 6 | 7 | ReactDOM.render( 8 | 9 | 10 | , 11 | document.getElementById('root') 12 | ); 13 | 14 | -------------------------------------------------------------------------------- /02-Dates Reminder/package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "requires": true, 3 | "lockfileVersion": 1, 4 | "dependencies": { 5 | "@babel/runtime": { 6 | "version": "7.16.3", 7 | "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.16.3.tgz", 8 | "integrity": "sha512-WBwekcqacdY2e9AF/Q7WLFUWmdJGJTkbjqTjoMDgXkVZ3ZRUvOPsLb5KdwISoQVsbP+DQzVZW4Zhci0DvpbNTQ==", 9 | "requires": { 10 | "regenerator-runtime": "^0.13.4" 11 | } 12 | }, 13 | "@popperjs/core": { 14 | "version": "2.11.0", 15 | "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.0.tgz", 16 | "integrity": "sha512-zrsUxjLOKAzdewIDRWy9nsV1GQsKBCWaGwsZQlCgr6/q+vjyZhFgqedLfFBuI9anTPEUT4APq9Mu0SZBTzIcGQ==" 17 | }, 18 | "@react-aria/ssr": { 19 | "version": "3.1.0", 20 | "resolved": "https://registry.npmjs.org/@react-aria/ssr/-/ssr-3.1.0.tgz", 21 | "integrity": "sha512-RxqQKmE8sO7TGdrcSlHTcVzMP450hqowtBSd2bBS9oPlcokVkaGq28c3Rwa8ty5ctw4EBCjXqjP7xdcKMGDzug==", 22 | "requires": { 23 | "@babel/runtime": "^7.6.2" 24 | } 25 | }, 26 | "@restart/context": { 27 | "version": "2.1.4", 28 | "resolved": "https://registry.npmjs.org/@restart/context/-/context-2.1.4.tgz", 29 | "integrity": "sha512-INJYZQJP7g+IoDUh/475NlGiTeMfwTXUEr3tmRneckHIxNolGOW9CTq83S8cxq0CgJwwcMzMJFchxvlwe7Rk8Q==" 30 | }, 31 | "@restart/hooks": { 32 | "version": "0.3.27", 33 | "resolved": "https://registry.npmjs.org/@restart/hooks/-/hooks-0.3.27.tgz", 34 | "integrity": "sha512-s984xV/EapUIfkjlf8wz9weP2O9TNKR96C68FfMEy2bE69+H4cNv3RD4Mf97lW7Htt7PjZrYTjSC8f3SB9VCXw==", 35 | "requires": { 36 | "dequal": "^2.0.2" 37 | } 38 | }, 39 | "@restart/ui": { 40 | "version": "0.2.3", 41 | "resolved": "https://registry.npmjs.org/@restart/ui/-/ui-0.2.3.tgz", 42 | "integrity": "sha512-FDhtjIR9QvUfMwvFsgVurRA1qdYxM0F0S07acywjG7gNI2YmQo78rtCYIe553V/pyBjEjaKAg3fzBFCocFTqyQ==", 43 | "requires": { 44 | "@babel/runtime": "^7.13.16", 45 | "@popperjs/core": "^2.10.1", 46 | "@react-aria/ssr": "^3.0.1", 47 | "@restart/hooks": "^0.4.0", 48 | "@types/warning": "^3.0.0", 49 | "dequal": "^2.0.2", 50 | "dom-helpers": "^5.2.0", 51 | "prop-types": "^15.7.2", 52 | "uncontrollable": "^7.2.1", 53 | "warning": "^4.0.3" 54 | }, 55 | "dependencies": { 56 | "@restart/hooks": { 57 | "version": "0.4.1", 58 | "resolved": "https://registry.npmjs.org/@restart/hooks/-/hooks-0.4.1.tgz", 59 | "integrity": "sha512-87UMGZcFwbj0Gr+8eEBAzL6H8xF5pMwq/S3LWeFK9cg4+lTqLFMsiVQFT4ncMJzqgpdD7T6ktF8PsEHeN2O+MQ==", 60 | "requires": { 61 | "dequal": "^2.0.2" 62 | } 63 | } 64 | } 65 | }, 66 | "@types/invariant": { 67 | "version": "2.2.35", 68 | "resolved": "https://registry.npmjs.org/@types/invariant/-/invariant-2.2.35.tgz", 69 | "integrity": "sha512-DxX1V9P8zdJPYQat1gHyY0xj3efl8gnMVjiM9iCY6y27lj+PoQWkgjt8jDqmovPqULkKVpKRg8J36iQiA+EtEg==" 70 | }, 71 | "@types/prop-types": { 72 | "version": "15.7.4", 73 | "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.4.tgz", 74 | "integrity": "sha512-rZ5drC/jWjrArrS8BR6SIr4cWpW09RNTYt9AMZo3Jwwif+iacXAqgVjm0B0Bv/S1jhDXKHqRVNCbACkJ89RAnQ==" 75 | }, 76 | "@types/react": { 77 | "version": "17.0.37", 78 | "resolved": "https://registry.npmjs.org/@types/react/-/react-17.0.37.tgz", 79 | "integrity": "sha512-2FS1oTqBGcH/s0E+CjrCCR9+JMpsu9b69RTFO+40ua43ZqP5MmQ4iUde/dMjWR909KxZwmOQIFq6AV6NjEG5xg==", 80 | "requires": { 81 | "@types/prop-types": "*", 82 | "@types/scheduler": "*", 83 | "csstype": "^3.0.2" 84 | } 85 | }, 86 | "@types/react-transition-group": { 87 | "version": "4.4.4", 88 | "resolved": "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.4.tgz", 89 | "integrity": "sha512-7gAPz7anVK5xzbeQW9wFBDg7G++aPLAFY0QaSMOou9rJZpbuI58WAuJrgu+qR92l61grlnCUe7AFX8KGahAgug==", 90 | "requires": { 91 | "@types/react": "*" 92 | } 93 | }, 94 | "@types/scheduler": { 95 | "version": "0.16.2", 96 | "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.2.tgz", 97 | "integrity": "sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew==" 98 | }, 99 | "@types/warning": { 100 | "version": "3.0.0", 101 | "resolved": "https://registry.npmjs.org/@types/warning/-/warning-3.0.0.tgz", 102 | "integrity": "sha1-DSUBJorY+ZYrdA04fEZU9fjiPlI=" 103 | }, 104 | "bootstrap": { 105 | "version": "5.1.3", 106 | "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-5.1.3.tgz", 107 | "integrity": "sha512-fcQztozJ8jToQWXxVuEyXWW+dSo8AiXWKwiSSrKWsRB/Qt+Ewwza+JWoLKiTuQLaEPhdNAJ7+Dosc9DOIqNy7Q==" 108 | }, 109 | "classnames": { 110 | "version": "2.3.1", 111 | "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.3.1.tgz", 112 | "integrity": "sha512-OlQdbZ7gLfGarSqxesMesDa5uz7KFbID8Kpq/SxIoNGDqY8lSYs0D+hhtBXhcdB3rcbXArFr7vlHheLk1voeNA==" 113 | }, 114 | "csstype": { 115 | "version": "3.0.10", 116 | "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.0.10.tgz", 117 | "integrity": "sha512-2u44ZG2OcNUO9HDp/Jl8C07x6pU/eTR3ncV91SiK3dhG9TWvRVsCoJw14Ckx5DgWkzGA3waZWO3d7pgqpUI/XA==" 118 | }, 119 | "dequal": { 120 | "version": "2.0.2", 121 | "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.2.tgz", 122 | "integrity": "sha512-q9K8BlJVxK7hQYqa6XISGmBZbtQQWVXSrRrWreHC94rMt1QL/Impruc+7p2CYSYuVIUr+YCt6hjrs1kkdJRTug==" 123 | }, 124 | "dom-helpers": { 125 | "version": "5.2.1", 126 | "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-5.2.1.tgz", 127 | "integrity": "sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==", 128 | "requires": { 129 | "@babel/runtime": "^7.8.7", 130 | "csstype": "^3.0.2" 131 | } 132 | }, 133 | "invariant": { 134 | "version": "2.2.4", 135 | "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", 136 | "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", 137 | "requires": { 138 | "loose-envify": "^1.0.0" 139 | } 140 | }, 141 | "js-tokens": { 142 | "version": "4.0.0", 143 | "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", 144 | "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" 145 | }, 146 | "loose-envify": { 147 | "version": "1.4.0", 148 | "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", 149 | "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", 150 | "requires": { 151 | "js-tokens": "^3.0.0 || ^4.0.0" 152 | } 153 | }, 154 | "object-assign": { 155 | "version": "4.1.1", 156 | "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", 157 | "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" 158 | }, 159 | "prop-types": { 160 | "version": "15.7.2", 161 | "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.7.2.tgz", 162 | "integrity": "sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ==", 163 | "requires": { 164 | "loose-envify": "^1.4.0", 165 | "object-assign": "^4.1.1", 166 | "react-is": "^16.8.1" 167 | } 168 | }, 169 | "prop-types-extra": { 170 | "version": "1.1.1", 171 | "resolved": "https://registry.npmjs.org/prop-types-extra/-/prop-types-extra-1.1.1.tgz", 172 | "integrity": "sha512-59+AHNnHYCdiC+vMwY52WmvP5dM3QLeoumYuEyceQDi9aEhtwN9zIQ2ZNo25sMyXnbh32h+P1ezDsUpUH3JAew==", 173 | "requires": { 174 | "react-is": "^16.3.2", 175 | "warning": "^4.0.0" 176 | } 177 | }, 178 | "react-bootstrap": { 179 | "version": "2.0.2", 180 | "resolved": "https://registry.npmjs.org/react-bootstrap/-/react-bootstrap-2.0.2.tgz", 181 | "integrity": "sha512-QuMqJ+WJmd6dUyOys6OF3nr6T/FjUVAoEMbSjsFrwVufJtvMox0SU1Dvz/cDID+Dl6Rz2RLcJzyqkdl+DEK2Gg==", 182 | "requires": { 183 | "@babel/runtime": "^7.14.0", 184 | "@restart/context": "^2.1.4", 185 | "@restart/hooks": "^0.3.26", 186 | "@restart/ui": "^0.2.3", 187 | "@types/invariant": "^2.2.33", 188 | "@types/prop-types": "^15.7.3", 189 | "@types/react": ">=16.14.8", 190 | "@types/react-transition-group": "^4.4.1", 191 | "@types/warning": "^3.0.0", 192 | "classnames": "^2.3.1", 193 | "dom-helpers": "^5.2.1", 194 | "invariant": "^2.2.4", 195 | "prop-types": "^15.7.2", 196 | "prop-types-extra": "^1.1.0", 197 | "react-transition-group": "^4.4.1", 198 | "uncontrollable": "^7.2.1", 199 | "warning": "^4.0.3" 200 | } 201 | }, 202 | "react-is": { 203 | "version": "16.13.1", 204 | "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", 205 | "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" 206 | }, 207 | "react-lifecycles-compat": { 208 | "version": "3.0.4", 209 | "resolved": "https://registry.npmjs.org/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz", 210 | "integrity": "sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA==" 211 | }, 212 | "react-transition-group": { 213 | "version": "4.4.2", 214 | "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.4.2.tgz", 215 | "integrity": "sha512-/RNYfRAMlZwDSr6z4zNKV6xu53/e2BuaBbGhbyYIXTrmgu/bGHzmqOs7mJSJBHy9Ud+ApHx3QjrkKSp1pxvlFg==", 216 | "requires": { 217 | "@babel/runtime": "^7.5.5", 218 | "dom-helpers": "^5.0.1", 219 | "loose-envify": "^1.4.0", 220 | "prop-types": "^15.6.2" 221 | } 222 | }, 223 | "regenerator-runtime": { 224 | "version": "0.13.9", 225 | "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz", 226 | "integrity": "sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==" 227 | }, 228 | "uncontrollable": { 229 | "version": "7.2.1", 230 | "resolved": "https://registry.npmjs.org/uncontrollable/-/uncontrollable-7.2.1.tgz", 231 | "integrity": "sha512-svtcfoTADIB0nT9nltgjujTi7BzVmwjZClOmskKu/E8FW9BXzg9os8OLr4f8Dlnk0rYWJIWr4wv9eKUXiQvQwQ==", 232 | "requires": { 233 | "@babel/runtime": "^7.6.3", 234 | "@types/react": ">=16.9.11", 235 | "invariant": "^2.2.4", 236 | "react-lifecycles-compat": "^3.0.4" 237 | } 238 | }, 239 | "warning": { 240 | "version": "4.0.3", 241 | "resolved": "https://registry.npmjs.org/warning/-/warning-4.0.3.tgz", 242 | "integrity": "sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w==", 243 | "requires": { 244 | "loose-envify": "^1.0.0" 245 | } 246 | } 247 | } 248 | } 249 | --------------------------------------------------------------------------------